summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 17:47:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 17:47:50 +0000
commitbbe35a6e1b54ef5cd7c1c471886c30ba85c0804e (patch)
tree985a31e8c860c690d9f20e6621ce5fcc05ccd244
parentInitial commit. (diff)
downloadwget-bbe35a6e1b54ef5cd7c1c471886c30ba85c0804e.tar.xz
wget-bbe35a6e1b54ef5cd7c1c471886c30ba85c0804e.zip
Adding upstream version 1.21.upstream/1.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.tarball-version1
-rw-r--r--.version1
-rw-r--r--ABOUT-NLS1282
-rw-r--r--AUTHORS62
-rw-r--r--COPYING674
-rw-r--r--ChangeLog27301
-rw-r--r--GNUmakefile127
-rw-r--r--INSTALL368
-rw-r--r--MAILING-LIST30
-rw-r--r--Makefile.am109
-rw-r--r--Makefile.in2181
-rw-r--r--NEWS1166
-rw-r--r--README89
-rw-r--r--aclocal.m42305
-rwxr-xr-xbuild-aux/announce-gen572
-rwxr-xr-xbuild-aux/build_info.pl140
-rwxr-xr-xbuild-aux/compile348
-rwxr-xr-xbuild-aux/config.guess1698
-rwxr-xr-xbuild-aux/config.rpath684
-rwxr-xr-xbuild-aux/config.sub1854
-rwxr-xr-xbuild-aux/depcomp791
-rwxr-xr-xbuild-aux/git-version-gen226
-rwxr-xr-xbuild-aux/gitlog-to-changelog515
-rwxr-xr-xbuild-aux/gnupload473
-rwxr-xr-xbuild-aux/install-sh541
-rwxr-xr-xbuild-aux/mdate-sh228
-rwxr-xr-xbuild-aux/missing215
-rwxr-xr-xbuild-aux/test-driver148
-rw-r--r--build-aux/texinfo.tex11614
-rwxr-xr-xbuild-aux/update-copyright302
-rwxr-xr-xbuild-aux/useless-if-before-free226
-rwxr-xr-xbuild-aux/vc-list-files113
-rwxr-xr-xconfigure57797
-rw-r--r--configure.ac1018
-rw-r--r--doc/Makefile.am119
-rw-r--r--doc/Makefile.in2147
-rw-r--r--doc/fdl.texi506
-rw-r--r--doc/sample.wgetrc137
-rw-r--r--doc/sample.wgetrc.munged_for_texi_inclusion137
-rw-r--r--doc/stamp-vti4
-rwxr-xr-xdoc/texi2pod.pl453
-rw-r--r--doc/version.texi4
-rw-r--r--doc/wget.info5094
-rw-r--r--doc/wget.texi4691
-rw-r--r--fuzz/Makefile.am103
-rw-r--r--fuzz/Makefile.in2583
-rw-r--r--fuzz/fuzzer.h36
-rw-r--r--fuzz/main.c157
-rw-r--r--fuzz/wget_cookie_fuzzer.c92
-rw-r--r--fuzz/wget_cookie_fuzzer.dict6
-rw-r--r--fuzz/wget_css_fuzzer.c121
-rw-r--r--fuzz/wget_css_fuzzer.repro/buffer-overflow-66001803998658561
-rw-r--r--fuzz/wget_css_fuzzer.repro/negative-size-param-57248664675942401
-rw-r--r--fuzz/wget_css_fuzzer.repro/slowness-6275836549267456bin0 -> 2284 bytes
-rw-r--r--fuzz/wget_ftpls_fuzzer.c127
-rw-r--r--fuzz/wget_ftpls_fuzzer.dict20
-rw-r--r--fuzz/wget_html_fuzzer.c97
-rw-r--r--fuzz/wget_html_fuzzer.dict22
-rw-r--r--fuzz/wget_netrc_fuzzer.c124
-rw-r--r--fuzz/wget_netrc_fuzzer.dict8
-rw-r--r--fuzz/wget_ntlm_fuzzer.c102
-rw-r--r--fuzz/wget_options_fuzzer.c113
-rw-r--r--fuzz/wget_options_fuzzer.dict195
-rw-r--r--fuzz/wget_progress_fuzzer.c142
-rw-r--r--fuzz/wget_read_hunk_fuzzer.c204
-rw-r--r--fuzz/wget_robots_fuzzer.c90
-rw-r--r--fuzz/wget_url_fuzzer.c105
-rw-r--r--gnulib_po/LINGUAS39
-rw-r--r--gnulib_po/Makefile.in.in475
-rw-r--r--gnulib_po/Makevars68
-rw-r--r--gnulib_po/POTFILES.in476
-rw-r--r--gnulib_po/Rules-quot58
-rw-r--r--gnulib_po/af.gmobin0 -> 726 bytes
-rw-r--r--gnulib_po/af.po576
-rw-r--r--gnulib_po/be.gmobin0 -> 955 bytes
-rw-r--r--gnulib_po/be.po520
-rw-r--r--gnulib_po/bg.gmobin0 -> 6521 bytes
-rw-r--r--gnulib_po/bg.po990
-rw-r--r--gnulib_po/boldquot.sed10
-rw-r--r--gnulib_po/ca.gmobin0 -> 798 bytes
-rw-r--r--gnulib_po/ca.po651
-rw-r--r--gnulib_po/cs.gmobin0 -> 4505 bytes
-rw-r--r--gnulib_po/cs.po889
-rw-r--r--gnulib_po/da.gmobin0 -> 4148 bytes
-rw-r--r--gnulib_po/da.po893
-rw-r--r--gnulib_po/de.gmobin0 -> 5081 bytes
-rw-r--r--gnulib_po/de.po1053
-rw-r--r--gnulib_po/el.gmobin0 -> 669 bytes
-rw-r--r--gnulib_po/el.po702
-rw-r--r--gnulib_po/en@boldquot.header25
-rw-r--r--gnulib_po/en@quot.header22
-rw-r--r--gnulib_po/eo.gmobin0 -> 4768 bytes
-rw-r--r--gnulib_po/eo.po989
-rw-r--r--gnulib_po/es.gmobin0 -> 4391 bytes
-rw-r--r--gnulib_po/es.po969
-rw-r--r--gnulib_po/et.gmobin0 -> 3719 bytes
-rw-r--r--gnulib_po/et.po733
-rw-r--r--gnulib_po/eu.gmobin0 -> 684 bytes
-rw-r--r--gnulib_po/eu.po569
-rw-r--r--gnulib_po/fi.gmobin0 -> 4927 bytes
-rw-r--r--gnulib_po/fi.po973
-rw-r--r--gnulib_po/fr.gmobin0 -> 5118 bytes
-rw-r--r--gnulib_po/fr.po987
-rw-r--r--gnulib_po/ga.gmobin0 -> 3979 bytes
-rw-r--r--gnulib_po/ga.po740
-rw-r--r--gnulib_po/gl.gmobin0 -> 2954 bytes
-rw-r--r--gnulib_po/gl.po778
-rw-r--r--gnulib_po/hu.gmobin0 -> 4414 bytes
-rw-r--r--gnulib_po/hu.po896
-rw-r--r--gnulib_po/insert-header.sin23
-rw-r--r--gnulib_po/it.gmobin0 -> 5016 bytes
-rw-r--r--gnulib_po/it.po1039
-rw-r--r--gnulib_po/ja.gmobin0 -> 4864 bytes
-rw-r--r--gnulib_po/ja.po929
-rw-r--r--gnulib_po/ko.gmobin0 -> 628 bytes
-rw-r--r--gnulib_po/ko.po535
-rw-r--r--gnulib_po/ms.gmobin0 -> 766 bytes
-rw-r--r--gnulib_po/ms.po514
-rw-r--r--gnulib_po/nb.gmobin0 -> 629 bytes
-rw-r--r--gnulib_po/nb.po516
-rw-r--r--gnulib_po/nl.gmobin0 -> 4886 bytes
-rw-r--r--gnulib_po/nl.po1005
-rw-r--r--gnulib_po/pl.gmobin0 -> 5011 bytes
-rw-r--r--gnulib_po/pl.po984
-rw-r--r--gnulib_po/pt.gmobin0 -> 4906 bytes
-rw-r--r--gnulib_po/pt.po968
-rw-r--r--gnulib_po/pt_BR.gmobin0 -> 5102 bytes
-rw-r--r--gnulib_po/pt_BR.po1117
-rw-r--r--gnulib_po/quot.sed6
-rw-r--r--gnulib_po/remove-potcdate.sin19
-rw-r--r--gnulib_po/ro.gmobin0 -> 594 bytes
-rw-r--r--gnulib_po/ro.po453
-rw-r--r--gnulib_po/ru.gmobin0 -> 6387 bytes
-rw-r--r--gnulib_po/ru.po996
-rw-r--r--gnulib_po/rw.gmobin0 -> 577 bytes
-rw-r--r--gnulib_po/rw.po652
-rw-r--r--gnulib_po/sk.gmobin0 -> 625 bytes
-rw-r--r--gnulib_po/sk.po530
-rw-r--r--gnulib_po/sl.gmobin0 -> 4307 bytes
-rw-r--r--gnulib_po/sl.po937
-rw-r--r--gnulib_po/sr.gmobin0 -> 6163 bytes
-rw-r--r--gnulib_po/sr.po994
-rw-r--r--gnulib_po/stamp-po1
-rw-r--r--gnulib_po/sv.gmobin0 -> 4731 bytes
-rw-r--r--gnulib_po/sv.po981
-rw-r--r--gnulib_po/tr.gmobin0 -> 821 bytes
-rw-r--r--gnulib_po/tr.po602
-rw-r--r--gnulib_po/uk.gmobin0 -> 6260 bytes
-rw-r--r--gnulib_po/uk.po1001
-rw-r--r--gnulib_po/vi.gmobin0 -> 4873 bytes
-rw-r--r--gnulib_po/vi.po902
-rw-r--r--gnulib_po/wget-gnulib.pot279
-rw-r--r--gnulib_po/zh_CN.gmobin0 -> 3866 bytes
-rw-r--r--gnulib_po/zh_CN.po909
-rw-r--r--gnulib_po/zh_TW.gmobin0 -> 4582 bytes
-rw-r--r--gnulib_po/zh_TW.po1011
-rw-r--r--lib/Makefile.am14
-rw-r--r--lib/Makefile.in5047
-rw-r--r--lib/_Noreturn.h43
-rw-r--r--lib/accept.c52
-rw-r--r--lib/access.c31
-rw-r--r--lib/af_alg.c213
-rw-r--r--lib/af_alg.h115
-rw-r--r--lib/alloca.c200
-rw-r--r--lib/alloca.in.h74
-rw-r--r--lib/arg-nonnull.h26
-rw-r--r--lib/arpa_inet.in.h150
-rw-r--r--lib/array-mergesort.h281
-rw-r--r--lib/asnprintf.c34
-rw-r--r--lib/asprintf.c39
-rw-r--r--lib/assure.h57
-rw-r--r--lib/at-func.c146
-rw-r--r--lib/attribute.h218
-rw-r--r--lib/base32.c587
-rw-r--r--lib/base32.h60
-rw-r--r--lib/basename-lgpl.c71
-rw-r--r--lib/basename-lgpl.h78
-rw-r--r--lib/basename.c58
-rw-r--r--lib/binary-io.c39
-rw-r--r--lib/binary-io.h77
-rw-r--r--lib/bind.c49
-rw-r--r--lib/bitrotate.c3
-rw-r--r--lib/bitrotate.h138
-rw-r--r--lib/btowc.c39
-rw-r--r--lib/byteswap.in.h44
-rw-r--r--lib/c++defs.h331
-rw-r--r--lib/c-ctype.c3
-rw-r--r--lib/c-ctype.h366
-rw-r--r--lib/c-strcase.h56
-rw-r--r--lib/c-strcasecmp.c56
-rw-r--r--lib/c-strcaseeq.h181
-rw-r--r--lib/c-strcasestr.c77
-rw-r--r--lib/c-strcasestr.h36
-rw-r--r--lib/c-strncasecmp.c56
-rw-r--r--lib/canonicalize.c493
-rw-r--r--lib/canonicalize.h57
-rw-r--r--lib/cdefs.h548
-rw-r--r--lib/chdir-long.c264
-rw-r--r--lib/chdir-long.h30
-rw-r--r--lib/cloexec.c83
-rw-r--r--lib/cloexec.h38
-rw-r--r--lib/close.c75
-rw-r--r--lib/closedir.c71
-rw-r--r--lib/concat-filename.c73
-rw-r--r--lib/concat-filename.h41
-rw-r--r--lib/connect.c56
-rw-r--r--lib/ctype.in.h57
-rw-r--r--lib/dirent-private.h44
-rw-r--r--lib/dirent.in.h269
-rw-r--r--lib/dirfd.c98
-rw-r--r--lib/dirname-lgpl.c86
-rw-r--r--lib/dirname.c38
-rw-r--r--lib/dirname.h49
-rw-r--r--lib/dup-safer-flag.c38
-rw-r--r--lib/dup-safer.c34
-rw-r--r--lib/dup.c92
-rw-r--r--lib/dup2.c189
-rw-r--r--lib/errno.in.h279
-rw-r--r--lib/error.c411
-rw-r--r--lib/error.h66
-rw-r--r--lib/exitfail.c24
-rw-r--r--lib/exitfail.h18
-rw-r--r--lib/fatal-signal.c362
-rw-r--r--lib/fatal-signal.h94
-rw-r--r--lib/fchdir.c209
-rw-r--r--lib/fcntl.c629
-rw-r--r--lib/fcntl.in.h441
-rw-r--r--lib/fd-hook.c116
-rw-r--r--lib/fd-hook.h119
-rw-r--r--lib/fd-safer-flag.c52
-rw-r--r--lib/fd-safer.c49
-rw-r--r--lib/fdopendir.c249
-rw-r--r--lib/fflush.c235
-rw-r--r--lib/file-set.c74
-rw-r--r--lib/file-set.h33
-rw-r--r--lib/filename.h110
-rw-r--r--lib/filenamecat-lgpl.c90
-rw-r--r--lib/filenamecat.h27
-rw-r--r--lib/findprog-in.c399
-rw-r--r--lib/findprog.h77
-rw-r--r--lib/flexmember.h60
-rw-r--r--lib/float+.h147
-rw-r--r--lib/float.c33
-rw-r--r--lib/float.in.h194
-rw-r--r--lib/flock.c224
-rw-r--r--lib/fnmatch.c361
-rw-r--r--lib/fnmatch.in.h110
-rw-r--r--lib/fnmatch_loop.c1212
-rw-r--r--lib/fopen.c230
-rw-r--r--lib/fpurge.c150
-rw-r--r--lib/freading.c76
-rw-r--r--lib/freading.h55
-rw-r--r--lib/free.c33
-rw-r--r--lib/fseek.c30
-rw-r--r--lib/fseeko.c164
-rw-r--r--lib/fstat.c94
-rw-r--r--lib/fstatat.c148
-rw-r--r--lib/ftell.c37
-rw-r--r--lib/ftello.c85
-rw-r--r--lib/futimens.c37
-rw-r--r--lib/gai_strerror.c92
-rw-r--r--lib/getaddrinfo.c505
-rw-r--r--lib/getcwd-lgpl.c135
-rw-r--r--lib/getcwd.c496
-rw-r--r--lib/getdelim.c147
-rw-r--r--lib/getdtablesize.c124
-rw-r--r--lib/getgroups.c131
-rw-r--r--lib/getline.c27
-rw-r--r--lib/getopt-cdefs.in.h67
-rw-r--r--lib/getopt-core.h96
-rw-r--r--lib/getopt-ext.h77
-rw-r--r--lib/getopt-pfx-core.h67
-rw-r--r--lib/getopt-pfx-ext.h71
-rw-r--r--lib/getopt.c811
-rw-r--r--lib/getopt.in.h61
-rw-r--r--lib/getopt1.c159
-rw-r--r--lib/getopt_int.h118
-rw-r--r--lib/getpass.c237
-rw-r--r--lib/getpass.h4
-rw-r--r--lib/getpeername.c49
-rw-r--r--lib/getprogname.c298
-rw-r--r--lib/getprogname.h40
-rw-r--r--lib/getrandom.c187
-rw-r--r--lib/getsockname.c49
-rw-r--r--lib/gettext.h301
-rw-r--r--lib/gettime.c49
-rw-r--r--lib/gettimeofday.c153
-rw-r--r--lib/gl_openssl.h116
-rw-r--r--lib/glthread/lock.c749
-rw-r--r--lib/glthread/lock.h789
-rw-r--r--lib/glthread/threadlib.c108
-rw-r--r--lib/gnulib.mk4548
-rw-r--r--lib/group-member.c115
-rw-r--r--lib/hard-locale.c35
-rw-r--r--lib/hard-locale.h28
-rw-r--r--lib/hash-pjw.c40
-rw-r--r--lib/hash-pjw.h23
-rw-r--r--lib/hash-triple-simple.c59
-rw-r--r--lib/hash-triple.h46
-rw-r--r--lib/hash.c1106
-rw-r--r--lib/hash.h261
-rw-r--r--lib/iconv.in.h127
-rw-r--r--lib/idx.h114
-rw-r--r--lib/inet_ntop.c260
-rw-r--r--lib/intprops.h630
-rw-r--r--lib/inttypes.in.h1002
-rw-r--r--lib/ioctl.c92
-rw-r--r--lib/isblank.c33
-rw-r--r--lib/iswblank.c26
-rw-r--r--lib/iswdigit.c26
-rw-r--r--lib/iswxdigit.c33
-rw-r--r--lib/itold.c28
-rw-r--r--lib/langinfo.in.h222
-rw-r--r--lib/lc-charset-dispatch.c82
-rw-r--r--lib/lc-charset-dispatch.h40
-rw-r--r--lib/libc-config.h184
-rw-r--r--lib/libunistring.valgrind24
-rw-r--r--lib/limits.in.h121
-rw-r--r--lib/link.c233
-rw-r--r--lib/listen.c49
-rw-r--r--lib/localcharset.c1159
-rw-r--r--lib/localcharset.h137
-rw-r--r--lib/locale.in.h305
-rw-r--r--lib/localeconv.c103
-rw-r--r--lib/lseek.c71
-rw-r--r--lib/lstat.c104
-rw-r--r--lib/malloc.c56
-rw-r--r--lib/malloc/scratch_buffer.h151
-rw-r--r--lib/malloc/scratch_buffer_dupfree.c41
-rw-r--r--lib/malloc/scratch_buffer_grow.c56
-rw-r--r--lib/malloc/scratch_buffer_grow_preserve.c67
-rw-r--r--lib/malloc/scratch_buffer_set_array_size.c64
-rw-r--r--lib/malloca.c105
-rw-r--r--lib/malloca.h123
-rw-r--r--lib/mbchar.c37
-rw-r--r--lib/mbchar.h353
-rw-r--r--lib/mbiter.c3
-rw-r--r--lib/mbiter.h218
-rw-r--r--lib/mbrtowc-impl-utf8.h138
-rw-r--r--lib/mbrtowc-impl.h262
-rw-r--r--lib/mbrtowc.c158
-rw-r--r--lib/mbsinit.c70
-rw-r--r--lib/mbsrtowcs-impl.h122
-rw-r--r--lib/mbsrtowcs-state.c37
-rw-r--r--lib/mbsrtowcs.c36
-rw-r--r--lib/mbtowc-impl.h44
-rw-r--r--lib/mbtowc-lock.c150
-rw-r--r--lib/mbtowc-lock.h115
-rw-r--r--lib/mbtowc.c26
-rw-r--r--lib/md2.c274
-rw-r--r--lib/md2.h85
-rw-r--r--lib/md4.c382
-rw-r--r--lib/md4.h91
-rw-r--r--lib/md5.c489
-rw-r--r--lib/md5.h147
-rw-r--r--lib/memchr.c172
-rw-r--r--lib/memchr.valgrind30
-rw-r--r--lib/mempcpy.c28
-rw-r--r--lib/memrchr.c161
-rw-r--r--lib/minmax.h60
-rw-r--r--lib/mkdir.c93
-rw-r--r--lib/mkostemp.c46
-rw-r--r--lib/mkstemp.c50
-rw-r--r--lib/mktime-internal.h79
-rw-r--r--lib/mktime.c566
-rw-r--r--lib/msvc-inval.c129
-rw-r--r--lib/msvc-inval.h222
-rw-r--r--lib/msvc-nothrow.c51
-rw-r--r--lib/msvc-nothrow.h43
-rw-r--r--lib/nanosleep.c276
-rw-r--r--lib/netdb.in.h295
-rw-r--r--lib/netinet_in.in.h47
-rw-r--r--lib/nl_langinfo-lock.c150
-rw-r--r--lib/nl_langinfo.c572
-rw-r--r--lib/open.c209
-rw-r--r--lib/openat-die.c62
-rw-r--r--lib/openat-priv.h64
-rw-r--r--lib/openat-proc.c135
-rw-r--r--lib/openat.c312
-rw-r--r--lib/openat.h123
-rw-r--r--lib/opendir.c179
-rw-r--r--lib/os2-spawn.c155
-rw-r--r--lib/os2-spawn.h33
-rw-r--r--lib/pathmax.h83
-rw-r--r--lib/pipe-safer.c52
-rw-r--r--lib/pipe.c50
-rw-r--r--lib/pipe2-safer.c52
-rw-r--r--lib/pipe2.c167
-rw-r--r--lib/printf-args.c183
-rw-r--r--lib/printf-args.h150
-rw-r--r--lib/printf-parse.c632
-rw-r--r--lib/printf-parse.h193
-rw-r--r--lib/quote.h46
-rw-r--r--lib/quotearg.c1082
-rw-r--r--lib/quotearg.h425
-rw-r--r--lib/raise.c83
-rw-r--r--lib/rawmemchr.c136
-rw-r--r--lib/rawmemchr.valgrind28
-rw-r--r--lib/readdir.c102
-rw-r--r--lib/readlink.c104
-rw-r--r--lib/realloc.c79
-rw-r--r--lib/recv.c49
-rw-r--r--lib/regcomp.c3919
-rw-r--r--lib/regex.c83
-rw-r--r--lib/regex.h663
-rw-r--r--lib/regex_internal.c1745
-rw-r--r--lib/regex_internal.h859
-rw-r--r--lib/regexec.c4304
-rw-r--r--lib/rewinddir.c53
-rw-r--r--lib/same-inode.h47
-rw-r--r--lib/save-cwd.c97
-rw-r--r--lib/save-cwd.h34
-rw-r--r--lib/sched.in.h99
-rw-r--r--lib/scratch_buffer.h29
-rw-r--r--lib/secure_getenv.c54
-rw-r--r--lib/select.c597
-rw-r--r--lib/send.c49
-rw-r--r--lib/setlocale-lock.c150
-rw-r--r--lib/setlocale_null.c411
-rw-r--r--lib/setlocale_null.h82
-rw-r--r--lib/setsockopt.c65
-rw-r--r--lib/sha1.c454
-rw-r--r--lib/sha1.h111
-rw-r--r--lib/sha256.c543
-rw-r--r--lib/sha256.h117
-rw-r--r--lib/sha512.c588
-rw-r--r--lib/sha512.h120
-rw-r--r--lib/sig-handler.c3
-rw-r--r--lib/sig-handler.h51
-rw-r--r--lib/sigaction.c204
-rw-r--r--lib/signal.in.h487
-rw-r--r--lib/sigprocmask.c349
-rw-r--r--lib/size_max.h30
-rw-r--r--lib/snprintf.c71
-rw-r--r--lib/socket.c53
-rw-r--r--lib/sockets.c161
-rw-r--r--lib/sockets.h66
-rw-r--r--lib/spawn-pipe.c674
-rw-r--r--lib/spawn-pipe.h166
-rw-r--r--lib/spawn.c34
-rw-r--r--lib/spawn.in.h974
-rw-r--r--lib/spawn_faction_addchdir.c70
-rw-r--r--lib/spawn_faction_addclose.c69
-rw-r--r--lib/spawn_faction_adddup2.c70
-rw-r--r--lib/spawn_faction_addopen.c86
-rw-r--r--lib/spawn_faction_destroy.c61
-rw-r--r--lib/spawn_faction_init.c56
-rw-r--r--lib/spawn_int.h72
-rw-r--r--lib/spawnattr_destroy.c28
-rw-r--r--lib/spawnattr_init.c33
-rw-r--r--lib/spawnattr_setflags.c45
-rw-r--r--lib/spawnattr_setpgroup.c32
-rw-r--r--lib/spawnattr_setsigmask.c33
-rw-r--r--lib/spawni.c970
-rw-r--r--lib/spawnp.c34
-rw-r--r--lib/stat-time.c3
-rw-r--r--lib/stat-time.h252
-rw-r--r--lib/stat-w32.c461
-rw-r--r--lib/stat-w32.h37
-rw-r--r--lib/stat.c440
-rw-r--r--lib/stdalign.in.h126
-rw-r--r--lib/stdbool.in.h132
-rw-r--r--lib/stddef.in.h121
-rw-r--r--lib/stdint.in.h740
-rw-r--r--lib/stdio-impl.h212
-rw-r--r--lib/stdio-write.c206
-rw-r--r--lib/stdio.in.h1641
-rw-r--r--lib/stdlib.in.h1321
-rw-r--r--lib/stpcpy.c49
-rw-r--r--lib/str-two-way.h452
-rw-r--r--lib/strcasecmp.c62
-rw-r--r--lib/strchrnul.c142
-rw-r--r--lib/strchrnul.valgrind28
-rw-r--r--lib/strdup.c54
-rw-r--r--lib/streq.h176
-rw-r--r--lib/strerror-override.c302
-rw-r--r--lib/strerror-override.h56
-rw-r--r--lib/strerror.c71
-rw-r--r--lib/strerror_r.c452
-rw-r--r--lib/string.in.h1173
-rw-r--r--lib/strings.in.h122
-rw-r--r--lib/stripslash.c45
-rw-r--r--lib/strncasecmp.c62
-rw-r--r--lib/strndup.c36
-rw-r--r--lib/strnlen.c30
-rw-r--r--lib/strnlen1.c35
-rw-r--r--lib/strnlen1.h40
-rw-r--r--lib/strpbrk.c43
-rw-r--r--lib/strptime.c1163
-rw-r--r--lib/strtok_r.c76
-rw-r--r--lib/strtol.c393
-rw-r--r--lib/strtoll.c33
-rw-r--r--lib/symlink.c57
-rw-r--r--lib/sys-limits.h42
-rw-r--r--lib/sys_file.in.h63
-rw-r--r--lib/sys_ioctl.in.h79
-rw-r--r--lib/sys_random.in.h96
-rw-r--r--lib/sys_select.in.h326
-rw-r--r--lib/sys_socket.c4
-rw-r--r--lib/sys_socket.in.h734
-rw-r--r--lib/sys_stat.in.h906
-rw-r--r--lib/sys_time.in.h224
-rw-r--r--lib/sys_types.in.h106
-rw-r--r--lib/sys_uio.in.h63
-rw-r--r--lib/sys_wait.in.h131
-rw-r--r--lib/tempname.c332
-rw-r--r--lib/tempname.h72
-rw-r--r--lib/thread-optim.h60
-rw-r--r--lib/time.in.h384
-rw-r--r--lib/time_r.c44
-rw-r--r--lib/timegm.c58
-rw-r--r--lib/timespec.c3
-rw-r--r--lib/timespec.h101
-rw-r--r--lib/tmpdir.c165
-rw-r--r--lib/tmpdir.h26
-rw-r--r--lib/u64.c4
-rw-r--r--lib/u64.h179
-rw-r--r--lib/unicase.in.h465
-rw-r--r--lib/unicase/cased.c53
-rw-r--r--lib/unicase/cased.h367
-rw-r--r--lib/unicase/caseprop.h34
-rw-r--r--lib/unicase/context.h65
-rw-r--r--lib/unicase/empty-prefix-context.c27
-rw-r--r--lib/unicase/empty-suffix-context.c27
-rw-r--r--lib/unicase/ignorable.c71
-rw-r--r--lib/unicase/ignorable.h600
-rw-r--r--lib/unicase/simple-mapping.h39
-rw-r--r--lib/unicase/special-casing-table.gperf136
-rw-r--r--lib/unicase/special-casing-table.h333
-rw-r--r--lib/unicase/special-casing.c25
-rw-r--r--lib/unicase/special-casing.in.h61
-rw-r--r--lib/unicase/tolower.c27
-rw-r--r--lib/unicase/tolower.h647
-rw-r--r--lib/unicase/u-casemap.h416
-rw-r--r--lib/unicase/u8-casemap.c40
-rw-r--r--lib/unicase/u8-tolower.c120
-rw-r--r--lib/unicase/unicasemap.h52
-rw-r--r--lib/unictype.in.h1053
-rw-r--r--lib/unictype/bitmap.h48
-rw-r--r--lib/unictype/combiningclass.c47
-rw-r--r--lib/unictype/combiningclass.h1351
-rw-r--r--lib/unictype/pr_soft_dotted.c35
-rw-r--r--lib/unictype/pr_soft_dotted.h319
-rw-r--r--lib/uninorm.in.h248
-rw-r--r--lib/uninorm/decompose-internal.c29
-rw-r--r--lib/uninorm/decompose-internal.h36
-rw-r--r--lib/uninorm/normalize-internal.h35
-rw-r--r--lib/uninorm/u-normalize-internal.h380
-rw-r--r--lib/uninorm/u8-normalize.c38
-rw-r--r--lib/unistd--.h32
-rw-r--r--lib/unistd-safer.h31
-rw-r--r--lib/unistd.c4
-rw-r--r--lib/unistd.in.h2303
-rw-r--r--lib/unistr.in.h749
-rw-r--r--lib/unistr/u-cpy.h33
-rw-r--r--lib/unistr/u8-cpy.c25
-rw-r--r--lib/unistr/u8-mbtouc-unsafe-aux.c139
-rw-r--r--lib/unistr/u8-mbtouc-unsafe.c150
-rw-r--r--lib/unistr/u8-strlen.c29
-rw-r--r--lib/unistr/u8-uctomb-aux.c60
-rw-r--r--lib/unistr/u8-uctomb.c79
-rw-r--r--lib/unitypes.in.h61
-rw-r--r--lib/uniwidth.in.h72
-rw-r--r--lib/uniwidth/cjk.h37
-rw-r--r--lib/uniwidth/width.c468
-rw-r--r--lib/unlink.c98
-rw-r--r--lib/unlocked-io.h136
-rw-r--r--lib/unused-parameter.h32
-rw-r--r--lib/utime.c287
-rw-r--r--lib/utime.in.h112
-rw-r--r--lib/utimens.c630
-rw-r--r--lib/utimens.h49
-rw-r--r--lib/vasnprintf.c5871
-rw-r--r--lib/vasnprintf.h72
-rw-r--r--lib/vasprintf.c50
-rw-r--r--lib/verify.h331
-rw-r--r--lib/vsnprintf.c70
-rw-r--r--lib/w32sock.h140
-rw-r--r--lib/wait-process.c369
-rw-r--r--lib/wait-process.h74
-rw-r--r--lib/waitpid.c30
-rw-r--r--lib/warn-on-use.h149
-rw-r--r--lib/wchar.in.h1258
-rw-r--r--lib/wcrtomb.c80
-rw-r--r--lib/wctype-h.c4
-rw-r--r--lib/wctype.in.h732
-rw-r--r--lib/wcwidth.c73
-rw-r--r--lib/windows-initguard.h35
-rw-r--r--lib/windows-mutex.c95
-rw-r--r--lib/windows-mutex.h51
-rw-r--r--lib/windows-once.c62
-rw-r--r--lib/windows-once.h47
-rw-r--r--lib/windows-recmutex.c127
-rw-r--r--lib/windows-recmutex.h57
-rw-r--r--lib/windows-rwlock.c377
-rw-r--r--lib/windows-rwlock.h68
-rw-r--r--lib/windows-spawn.c727
-rw-r--r--lib/windows-spawn.h154
-rw-r--r--lib/wmemchr-impl.h27
-rw-r--r--lib/wmemchr.c23
-rw-r--r--lib/wmempcpy.c28
-rw-r--r--lib/write.c155
-rw-r--r--lib/xalloc-die.c41
-rw-r--r--lib/xalloc-oversized.h60
-rw-r--r--lib/xalloc.h270
-rw-r--r--lib/xmalloc.c133
-rw-r--r--lib/xmemdup0.c45
-rw-r--r--lib/xmemdup0.h34
-rw-r--r--lib/xsize.c3
-rw-r--r--lib/xsize.h108
-rw-r--r--lib/xstrndup.c36
-rw-r--r--lib/xstrndup.h23
-rw-r--r--m4/00gnulib.m485
-rw-r--r--m4/__inline.m422
-rw-r--r--m4/absolute-header.m4100
-rw-r--r--m4/access.m416
-rw-r--r--m4/af_alg.m456
-rw-r--r--m4/alloca.m4108
-rw-r--r--m4/arpa_inet_h.m459
-rw-r--r--m4/asm-underscore.m483
-rw-r--r--m4/base32.m415
-rw-r--r--m4/btowc.m4105
-rw-r--r--m4/builtin-expect.m449
-rw-r--r--m4/byteswap.m419
-rw-r--r--m4/canonicalize.m4145
-rw-r--r--m4/chdir-long.m430
-rw-r--r--m4/clock_time.m431
-rw-r--r--m4/close.m435
-rw-r--r--m4/closedir.m431
-rw-r--r--m4/codeset.m424
-rw-r--r--m4/ctype.m432
-rw-r--r--m4/d-ino.m460
-rw-r--r--m4/dirent_h.m464
-rw-r--r--m4/dirfd.m486
-rw-r--r--m4/double-slash-root.m438
-rw-r--r--m4/dup.m454
-rw-r--r--m4/dup2.m4105
-rw-r--r--m4/eaccess.m412
-rw-r--r--m4/eealloc.m431
-rw-r--r--m4/environ.m445
-rw-r--r--m4/errno_h.m4133
-rw-r--r--m4/error.m427
-rw-r--r--m4/exponentd.m4116
-rw-r--r--m4/extensions.m4215
-rw-r--r--m4/extern-inline.m499
-rw-r--r--m4/fatal-signal.m412
-rw-r--r--m4/fchdir.m468
-rw-r--r--m4/fcntl-o.m4140
-rw-r--r--m4/fcntl.m4151
-rw-r--r--m4/fcntl_h.m455
-rw-r--r--m4/fdopendir.m467
-rw-r--r--m4/fflush.m4100
-rw-r--r--m4/filenamecat.m416
-rw-r--r--m4/findprog-in.m411
-rw-r--r--m4/flexmember.m444
-rw-r--r--m4/float_h.m4108
-rw-r--r--m4/flock.m424
-rw-r--r--m4/fnmatch.m4153
-rw-r--r--m4/fnmatch_h.m475
-rw-r--r--m4/fopen.m4148
-rw-r--r--m4/fpurge.m473
-rw-r--r--m4/freading.m411
-rw-r--r--m4/free.m449
-rw-r--r--m4/fseek.m415
-rw-r--r--m4/fseeko.m477
-rw-r--r--m4/fstat.m440
-rw-r--r--m4/fstatat.m465
-rw-r--r--m4/ftell.m415
-rw-r--r--m4/ftello.m4142
-rw-r--r--m4/futimens.m466
-rw-r--r--m4/getaddrinfo.m4238
-rw-r--r--m4/getcwd-abort-bug.m4159
-rw-r--r--m4/getcwd-path-max.m4236
-rw-r--r--m4/getcwd.m4166
-rw-r--r--m4/getdelim.m499
-rw-r--r--m4/getdtablesize.m463
-rw-r--r--m4/getgroups.m4110
-rw-r--r--m4/getline.m4109
-rw-r--r--m4/getopt.m4381
-rw-r--r--m4/getpagesize.m449
-rw-r--r--m4/getpass.m4106
-rw-r--r--m4/getprogname.m443
-rw-r--r--m4/getrandom.m468
-rw-r--r--m4/gettext.m4401
-rw-r--r--m4/gettime.m413
-rw-r--r--m4/gettimeofday.m469
-rw-r--r--m4/gl-openssl.m466
-rw-r--r--m4/gnulib-common.m4724
-rw-r--r--m4/gnulib-comp.m42320
-rw-r--r--m4/group-member.m429
-rw-r--r--m4/host-cpu-c-abi.m4675
-rw-r--r--m4/hostent.m449
-rw-r--r--m4/iconv.m4282
-rw-r--r--m4/iconv_h.m457
-rw-r--r--m4/include_next.m4224
-rw-r--r--m4/inet_ntop.m470
-rw-r--r--m4/inline.m440
-rw-r--r--m4/intlmacosx.m456
-rw-r--r--m4/intmax_t.m459
-rw-r--r--m4/inttypes.m4165
-rw-r--r--m4/inttypes_h.m429
-rw-r--r--m4/ioctl.m444
-rw-r--r--m4/isblank.m417
-rw-r--r--m4/iswblank.m434
-rw-r--r--m4/iswdigit.m4115
-rw-r--r--m4/iswxdigit.m4106
-rw-r--r--m4/langinfo_h.m4122
-rw-r--r--m4/largefile.m4178
-rw-r--r--m4/lib-ld.m4168
-rw-r--r--m4/lib-link.m4813
-rw-r--r--m4/lib-prefix.m4323
-rw-r--r--m4/libunistring-base.m4141
-rw-r--r--m4/libunistring-optional.m422
-rw-r--r--m4/libunistring.m4143
-rw-r--r--m4/limits-h.m443
-rw-r--r--m4/link.m458
-rw-r--r--m4/localcharset.m411
-rw-r--r--m4/locale-fr.m4253
-rw-r--r--m4/locale-ja.m4143
-rw-r--r--m4/locale-zh.m4137
-rw-r--r--m4/locale_h.m4158
-rw-r--r--m4/localeconv.m422
-rw-r--r--m4/lock.m447
-rw-r--r--m4/lseek.m472
-rw-r--r--m4/lstat.m479
-rw-r--r--m4/malloc.m498
-rw-r--r--m4/malloca.m414
-rw-r--r--m4/mbchar.m413
-rw-r--r--m4/mbiter.m414
-rw-r--r--m4/mbrtowc.m4790
-rw-r--r--m4/mbsinit.m444
-rw-r--r--m4/mbsrtowcs.m4141
-rw-r--r--m4/mbstate_t.m434
-rw-r--r--m4/mbtowc.m424
-rw-r--r--m4/md4.m412
-rw-r--r--m4/md5.m414
-rw-r--r--m4/memchr.m4106
-rw-r--r--m4/mempcpy.m426
-rw-r--r--m4/memrchr.m423
-rw-r--r--m4/minmax.m444
-rw-r--r--m4/mkdir.m487
-rw-r--r--m4/mkostemp.m423
-rw-r--r--m4/mkstemp.m487
-rw-r--r--m4/mktime.m4298
-rw-r--r--m4/mmap-anon.m455
-rw-r--r--m4/mode_t.m426
-rw-r--r--m4/msvc-inval.m419
-rw-r--r--m4/msvc-nothrow.m410
-rw-r--r--m4/multiarch.m465
-rw-r--r--m4/nanosleep.m4161
-rw-r--r--m4/netdb_h.m444
-rw-r--r--m4/netinet_in_h.m431
-rw-r--r--m4/nl_langinfo.m477
-rw-r--r--m4/nls.m432
-rw-r--r--m4/nocrash.m4131
-rw-r--r--m4/off_t.m418
-rw-r--r--m4/open-cloexec.m421
-rw-r--r--m4/open-slash.m460
-rw-r--r--m4/open.m456
-rw-r--r--m4/openat.m438
-rw-r--r--m4/opendir.m432
-rw-r--r--m4/pathmax.m442
-rw-r--r--m4/pipe.m415
-rw-r--r--m4/pipe2.m418
-rw-r--r--m4/po.m4453
-rw-r--r--m4/posix_spawn.m4678
-rw-r--r--m4/posix_spawn_faction_addchdir.m420
-rw-r--r--m4/printf.m41719
-rw-r--r--m4/pthread_rwlock_rdlock.m4185
-rw-r--r--m4/quote.m413
-rw-r--r--m4/quotearg.m411
-rw-r--r--m4/raise.m436
-rw-r--r--m4/rawmemchr.m420
-rw-r--r--m4/readdir.m415
-rw-r--r--m4/readlink.m4114
-rw-r--r--m4/realloc.m476
-rw-r--r--m4/regex.m4360
-rw-r--r--m4/rewinddir.m415
-rw-r--r--m4/save-cwd.m411
-rw-r--r--m4/sched_h.m491
-rw-r--r--m4/secure_getenv.m426
-rw-r--r--m4/select.m4117
-rw-r--r--m4/servent.m451
-rw-r--r--m4/setlocale_null.m498
-rw-r--r--m4/sh-filename.m424
-rw-r--r--m4/sha1.m414
-rw-r--r--m4/sha256.m414
-rw-r--r--m4/sha512.m414
-rw-r--r--m4/sig_atomic_t.m414
-rw-r--r--m4/sigaction.m440
-rw-r--r--m4/signal_h.m485
-rw-r--r--m4/signalblocking.m423
-rw-r--r--m4/sigpipe.m429
-rw-r--r--m4/size_max.m475
-rw-r--r--m4/snprintf.m462
-rw-r--r--m4/socketlib.m496
-rw-r--r--m4/sockets.m417
-rw-r--r--m4/socklen.m476
-rw-r--r--m4/sockpfaf.m484
-rw-r--r--m4/spawn-pipe.m411
-rw-r--r--m4/spawn_h.m4136
-rw-r--r--m4/ssize_t.m423
-rw-r--r--m4/stat-time.m483
-rw-r--r--m4/stat.m485
-rw-r--r--m4/stdalign.m457
-rw-r--r--m4/stdbool.m4122
-rw-r--r--m4/stddef_h.m472
-rw-r--r--m4/stdint.m4533
-rw-r--r--m4/stdint_h.m427
-rw-r--r--m4/stdio_h.m4240
-rw-r--r--m4/stdlib_h.m4170
-rw-r--r--m4/stpcpy.m425
-rw-r--r--m4/strcase.m445
-rw-r--r--m4/strchrnul.m450
-rw-r--r--m4/strdup.m432
-rw-r--r--m4/strerror.m4102
-rw-r--r--m4/strerror_r.m4173
-rw-r--r--m4/string_h.m4132
-rw-r--r--m4/strings_h.m452
-rw-r--r--m4/strndup.m458
-rw-r--r--m4/strnlen.m430
-rw-r--r--m4/strpbrk.m417
-rw-r--r--m4/strptime.m422
-rw-r--r--m4/strtok_r.m473
-rw-r--r--m4/strtol.m410
-rw-r--r--m4/strtoll.m419
-rw-r--r--m4/symlink.m455
-rw-r--r--m4/sys_file_h.m441
-rw-r--r--m4/sys_ioctl_h.m464
-rw-r--r--m4/sys_random_h.m453
-rw-r--r--m4/sys_select_h.m495
-rw-r--r--m4/sys_socket_h.m4190
-rw-r--r--m4/sys_stat_h.m4110
-rw-r--r--m4/sys_time_h.m4110
-rw-r--r--m4/sys_types_h.m458
-rw-r--r--m4/sys_uio_h.m431
-rw-r--r--m4/sys_wait_h.m436
-rw-r--r--m4/tempname.m419
-rw-r--r--m4/threadlib.m4622
-rw-r--r--m4/time_h.m4147
-rw-r--r--m4/time_r.m499
-rw-r--r--m4/timegm.m426
-rw-r--r--m4/timespec.m411
-rw-r--r--m4/tm_gmtoff.m414
-rw-r--r--m4/tmpdir.m49
-rw-r--r--m4/unistd-safer.m410
-rw-r--r--m4/unistd_h.m4251
-rw-r--r--m4/unlink.m4135
-rw-r--r--m4/unlocked-io.m441
-rw-r--r--m4/utime.m476
-rw-r--r--m4/utime_h.m448
-rw-r--r--m4/utimens.m452
-rw-r--r--m4/utimes.m4161
-rw-r--r--m4/vasnprintf.m4298
-rw-r--r--m4/vasprintf.m446
-rw-r--r--m4/visibility.m477
-rw-r--r--m4/vsnprintf.m462
-rw-r--r--m4/wait-process.m412
-rw-r--r--m4/waitpid.m414
-rw-r--r--m4/warn-on-use.m449
-rw-r--r--m4/warnings.m4110
-rw-r--r--m4/wchar_h.m4240
-rw-r--r--m4/wchar_t.m424
-rw-r--r--m4/wcrtomb.m4146
-rw-r--r--m4/wctype_h.m4185
-rw-r--r--m4/wcwidth.m4113
-rw-r--r--m4/wget.m4188
-rw-r--r--m4/wget_manywarnings.m492
-rw-r--r--m4/wint_t.m457
-rw-r--r--m4/wmemchr.m425
-rw-r--r--m4/wmempcpy.m421
-rw-r--r--m4/write.m434
-rw-r--r--m4/xalloc.m47
-rw-r--r--m4/xsize.m412
-rw-r--r--m4/xstrndup.m415
-rw-r--r--m4/zzgnulib.m423
-rw-r--r--maint.mk1756
-rw-r--r--msdos/Makefile.DJ89
-rw-r--r--msdos/Makefile.WC67
-rw-r--r--msdos/config.h141
-rw-r--r--po/LINGUAS39
-rw-r--r--po/Makefile.in.in475
-rw-r--r--po/Makevars84
-rw-r--r--po/POTFILES.in30
-rw-r--r--po/Rules-quot58
-rw-r--r--po/be.gmobin0 -> 22888 bytes
-rw-r--r--po/be.po3385
-rw-r--r--po/bg.gmobin0 -> 10160 bytes
-rw-r--r--po/bg.po3489
-rw-r--r--po/boldquot.sed10
-rw-r--r--po/ca.gmobin0 -> 33899 bytes
-rw-r--r--po/ca.po3857
-rw-r--r--po/cs.gmobin0 -> 82071 bytes
-rw-r--r--po/cs.po3979
-rw-r--r--po/da.gmobin0 -> 23047 bytes
-rw-r--r--po/da.po3876
-rw-r--r--po/de.gmobin0 -> 84356 bytes
-rw-r--r--po/de.po3774
-rw-r--r--po/el.gmobin0 -> 10774 bytes
-rw-r--r--po/el.po3633
-rw-r--r--po/en@boldquot.header25
-rw-r--r--po/en@quot.header22
-rw-r--r--po/en_GB.gmobin0 -> 8365 bytes
-rw-r--r--po/en_GB.po3534
-rw-r--r--po/eo.gmobin0 -> 74522 bytes
-rw-r--r--po/eo.po3697
-rw-r--r--po/es.gmobin0 -> 68127 bytes
-rw-r--r--po/es.po3951
-rw-r--r--po/et.gmobin0 -> 74686 bytes
-rw-r--r--po/et.po3498
-rw-r--r--po/eu.gmobin0 -> 9872 bytes
-rw-r--r--po/eu.po3590
-rw-r--r--po/fi.gmobin0 -> 60734 bytes
-rw-r--r--po/fi.po3676
-rw-r--r--po/fr.gmobin0 -> 82488 bytes
-rw-r--r--po/fr.po3767
-rw-r--r--po/ga.gmobin0 -> 72738 bytes
-rw-r--r--po/ga.po3699
-rw-r--r--po/gl.gmobin0 -> 21242 bytes
-rw-r--r--po/gl.po3820
-rw-r--r--po/he.gmobin0 -> 7130 bytes
-rw-r--r--po/he.po3522
-rw-r--r--po/hr.gmobin0 -> 80862 bytes
-rw-r--r--po/hr.po3760
-rw-r--r--po/hu.gmobin0 -> 77812 bytes
-rw-r--r--po/hu.po3723
-rw-r--r--po/id.gmobin0 -> 30193 bytes
-rw-r--r--po/id.po3746
-rw-r--r--po/insert-header.sin23
-rw-r--r--po/it.gmobin0 -> 82152 bytes
-rw-r--r--po/it.po3746
-rw-r--r--po/ja.gmobin0 -> 86216 bytes
-rw-r--r--po/ja.po3571
-rw-r--r--po/lt.gmobin0 -> 15711 bytes
-rw-r--r--po/lt.po3451
-rw-r--r--po/nb.gmobin0 -> 75426 bytes
-rw-r--r--po/nb.po3651
-rw-r--r--po/nl.gmobin0 -> 60201 bytes
-rw-r--r--po/nl.po3670
-rw-r--r--po/pl.gmobin0 -> 79924 bytes
-rw-r--r--po/pl.po3656
-rw-r--r--po/pt.gmobin0 -> 77572 bytes
-rw-r--r--po/pt.po3677
-rw-r--r--po/pt_BR.gmobin0 -> 80834 bytes
-rw-r--r--po/pt_BR.po3891
-rw-r--r--po/quot.sed6
-rw-r--r--po/remove-potcdate.sin19
-rw-r--r--po/ro.gmobin0 -> 78093 bytes
-rw-r--r--po/ro.po4098
-rw-r--r--po/ru.gmobin0 -> 98122 bytes
-rw-r--r--po/ru.po3704
-rw-r--r--po/sk.gmobin0 -> 79333 bytes
-rw-r--r--po/sk.po3660
-rw-r--r--po/sl.gmobin0 -> 23761 bytes
-rw-r--r--po/sl.po3567
-rw-r--r--po/sr.gmobin0 -> 97733 bytes
-rw-r--r--po/sr.po3706
-rw-r--r--po/stamp-po1
-rw-r--r--po/sv.gmobin0 -> 77699 bytes
-rw-r--r--po/sv.po3606
-rw-r--r--po/tr.gmobin0 -> 72243 bytes
-rw-r--r--po/tr.po4092
-rw-r--r--po/uk.gmobin0 -> 98891 bytes
-rw-r--r--po/uk.po3707
-rw-r--r--po/vi.gmobin0 -> 77855 bytes
-rw-r--r--po/vi.po3675
-rw-r--r--po/wget.pot3040
-rw-r--r--po/zh_CN.gmobin0 -> 74336 bytes
-rw-r--r--po/zh_CN.po3452
-rw-r--r--po/zh_TW.gmobin0 -> 73201 bytes
-rw-r--r--po/zh_TW.po3515
-rw-r--r--src/Makefile.am110
-rw-r--r--src/Makefile.in2804
-rw-r--r--src/build_info.c101
-rw-r--r--src/build_info.c.in18
-rw-r--r--src/config.h.in2685
-rw-r--r--src/connect.c1084
-rw-r--r--src/connect.h89
-rw-r--r--src/convert.c1230
-rw-r--r--src/convert.h115
-rw-r--r--src/cookies.c1539
-rw-r--r--src/cookies.h47
-rw-r--r--src/css-tokens.h65
-rw-r--r--src/css-url.c236
-rw-r--r--src/css-url.h37
-rw-r--r--src/css.c3932
-rw-r--r--src/css.l167
-rw-r--r--src/css_.c3933
-rw-r--r--src/exits.c93
-rw-r--r--src/exits.h48
-rw-r--r--src/ftp-basic.c1342
-rw-r--r--src/ftp-ls.c1175
-rw-r--r--src/ftp-opie.c2220
-rw-r--r--src/ftp.c2898
-rw-r--r--src/ftp.h184
-rw-r--r--src/gnutls.c1116
-rw-r--r--src/hash.c813
-rw-r--r--src/hash.h66
-rw-r--r--src/host.c1082
-rw-r--r--src/host.h107
-rw-r--r--src/hsts.c829
-rw-r--r--src/hsts.h53
-rw-r--r--src/html-parse.c1221
-rw-r--r--src/html-parse.h71
-rw-r--r--src/html-url.c977
-rw-r--r--src/html-url.h58
-rw-r--r--src/http-ntlm.c618
-rw-r--r--src/http-ntlm.h53
-rw-r--r--src/http.c5495
-rw-r--r--src/http.h51
-rw-r--r--src/init.c2135
-rw-r--r--src/init.h48
-rw-r--r--src/iri.c449
-rw-r--r--src/iri.h75
-rw-r--r--src/log.c995
-rw-r--r--src/log.h60
-rw-r--r--src/main.c2306
-rw-r--r--src/metalink.c1599
-rw-r--r--src/metalink.h75
-rw-r--r--src/mswindows.c652
-rw-r--r--src/mswindows.h78
-rw-r--r--src/netrc.c569
-rw-r--r--src/netrc.h39
-rw-r--r--src/openssl.c1260
-rw-r--r--src/options.h351
-rw-r--r--src/progress.c1462
-rw-r--r--src/progress.h45
-rw-r--r--src/ptimer.c413
-rw-r--r--src/ptimer.h46
-rw-r--r--src/recur.c919
-rw-r--r--src/recur.h49
-rw-r--r--src/res.c650
-rw-r--r--src/res.h50
-rw-r--r--src/retr.c1561
-rw-r--r--src/retr.h81
-rw-r--r--src/spider.c101
-rw-r--r--src/spider.h39
-rw-r--r--src/ssl.h40
-rw-r--r--src/sysdep.h59
-rw-r--r--src/url.c2540
-rw-r--r--src/url.h136
-rw-r--r--src/utils.c2993
-rw-r--r--src/utils.h179
-rw-r--r--src/version.h41
-rw-r--r--src/warc.c1662
-rw-r--r--src/warc.h27
-rw-r--r--src/wget.h333
-rw-r--r--src/xattr.c95
-rw-r--r--src/xattr.h46
-rw-r--r--testenv/Makefile.am128
-rw-r--r--testenv/Makefile.in2194
-rw-r--r--testenv/README306
-rwxr-xr-xtestenv/Test--convert-links--content-on-error.py77
-rwxr-xr-xtestenv/Test--https-crl.py51
-rwxr-xr-xtestenv/Test--https.py56
-rwxr-xr-xtestenv/Test--rejected-log.py100
-rwxr-xr-xtestenv/Test--spider-r.py104
-rwxr-xr-xtestenv/Test-416.py53
-rwxr-xr-xtestenv/Test-504.py70
-rwxr-xr-xtestenv/Test-Content-disposition-2.py52
-rwxr-xr-xtestenv/Test-Content-disposition.py54
-rwxr-xr-xtestenv/Test-Head.py42
-rwxr-xr-xtestenv/Test-O.py43
-rwxr-xr-xtestenv/Test-Post.py46
-rwxr-xr-xtestenv/Test-auth-basic-fail.py49
-rwxr-xr-xtestenv/Test-auth-basic-netrc-pass-given.py68
-rwxr-xr-xtestenv/Test-auth-basic-netrc-user-given.py68
-rwxr-xr-xtestenv/Test-auth-basic-netrc.py66
-rwxr-xr-xtestenv/Test-auth-basic-no-netrc-fail.py59
-rwxr-xr-xtestenv/Test-auth-basic.py57
-rwxr-xr-xtestenv/Test-auth-both.py85
-rwxr-xr-xtestenv/Test-auth-digest.py64
-rwxr-xr-xtestenv/Test-auth-no-challenge-url.py52
-rwxr-xr-xtestenv/Test-auth-no-challenge.py52
-rwxr-xr-xtestenv/Test-auth-retcode.py48
-rwxr-xr-xtestenv/Test-auth-with-content-disposition.py52
-rwxr-xr-xtestenv/Test-c-full.py51
-rwxr-xr-xtestenv/Test-condget.py138
-rwxr-xr-xtestenv/Test-cookie-401.py57
-rwxr-xr-xtestenv/Test-cookie-domain-mismatch.py56
-rwxr-xr-xtestenv/Test-cookie-expires.py79
-rwxr-xr-xtestenv/Test-cookie.py55
-rwxr-xr-xtestenv/Test-hsts.py80
-rwxr-xr-xtestenv/Test-metalink-http-baddigest.py93
-rwxr-xr-xtestenv/Test-metalink-http-quoted.py126
-rwxr-xr-xtestenv/Test-metalink-http-xml-trust-name.py272
-rwxr-xr-xtestenv/Test-metalink-http-xml-trust.py272
-rwxr-xr-xtestenv/Test-metalink-http-xml-type-content.py221
-rwxr-xr-xtestenv/Test-metalink-http-xml-type-trust-content.py221
-rwxr-xr-xtestenv/Test-metalink-http-xml-type-trust.py221
-rwxr-xr-xtestenv/Test-metalink-http-xml-type.py221
-rwxr-xr-xtestenv/Test-metalink-http-xml.py272
-rwxr-xr-xtestenv/Test-metalink-http.py126
-rwxr-xr-xtestenv/Test-metalink-xml-abspath-trust.py101
-rwxr-xr-xtestenv/Test-metalink-xml-abspath.py100
-rwxr-xr-xtestenv/Test-metalink-xml-absprefix-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-absprefix.py101
-rw-r--r--testenv/Test-metalink-xml-continue.py107
-rwxr-xr-xtestenv/Test-metalink-xml-emptyprefix-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-homepath-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-homepath.py101
-rwxr-xr-xtestenv/Test-metalink-xml-homeprefix-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-homeprefix.py101
-rwxr-xr-xtestenv/Test-metalink-xml-nohash.py100
-rwxr-xr-xtestenv/Test-metalink-xml-nourls.py100
-rwxr-xr-xtestenv/Test-metalink-xml-prefix-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-prefix.py101
-rwxr-xr-xtestenv/Test-metalink-xml-relpath-trust.py101
-rwxr-xr-xtestenv/Test-metalink-xml-relpath.py100
-rwxr-xr-xtestenv/Test-metalink-xml-relprefix-trust.py102
-rwxr-xr-xtestenv/Test-metalink-xml-relprefix.py101
-rwxr-xr-xtestenv/Test-metalink-xml-size.py100
-rwxr-xr-xtestenv/Test-metalink-xml-trust.py101
-rwxr-xr-xtestenv/Test-metalink-xml-urlbreak.py236
-rw-r--r--testenv/Test-metalink-xml.py100
-rwxr-xr-xtestenv/Test-missing-scheme-retval.py42
-rwxr-xr-xtestenv/Test-no_proxy-env.py161
-rwxr-xr-xtestenv/Test-pinnedpubkey-der-https.py57
-rwxr-xr-xtestenv/Test-pinnedpubkey-der-no-check-https.py56
-rwxr-xr-xtestenv/Test-pinnedpubkey-hash-https.py60
-rwxr-xr-xtestenv/Test-pinnedpubkey-hash-no-check-fail-https.py51
-rwxr-xr-xtestenv/Test-pinnedpubkey-pem-fail-https.py53
-rwxr-xr-xtestenv/Test-pinnedpubkey-pem-https.py57
-rwxr-xr-xtestenv/Test-recursive-basic.py59
-rwxr-xr-xtestenv/Test-recursive-include.py56
-rw-r--r--testenv/Test-recursive-redirect.py64
-rwxr-xr-xtestenv/Test-redirect-crash.py72
-rwxr-xr-xtestenv/Test-redirect.py57
-rwxr-xr-xtestenv/Test-reserved-chars.py57
-rw-r--r--testenv/certs/README87
-rw-r--r--testenv/certs/ca-cert.pem19
-rw-r--r--testenv/certs/ca-key.pem144
-rw-r--r--testenv/certs/ca-template.cfg246
-rwxr-xr-xtestenv/certs/make_ca.sh23
-rw-r--r--testenv/certs/server-cert.pem21
-rw-r--r--testenv/certs/server-crl.pem12
-rw-r--r--testenv/certs/server-key.pem144
-rw-r--r--testenv/certs/server-pubkey-sha256.base641
-rw-r--r--testenv/certs/server-pubkey.derbin0 -> 294 bytes
-rw-r--r--testenv/certs/server-pubkey.pem9
-rw-r--r--testenv/certs/server-template.cfg245
-rw-r--r--testenv/conf/__init__.py48
-rw-r--r--testenv/conf/authentication.py23
-rw-r--r--testenv/conf/domains.py9
-rw-r--r--testenv/conf/environment_variables.py14
-rw-r--r--testenv/conf/expect_header.py12
-rw-r--r--testenv/conf/expected_files.py58
-rw-r--r--testenv/conf/expected_ret_code.py27
-rw-r--r--testenv/conf/files_crawled.py27
-rw-r--r--testenv/conf/hook_sample.py22
-rw-r--r--testenv/conf/local_files.py26
-rw-r--r--testenv/conf/reject_header.py13
-rw-r--r--testenv/conf/response.py11
-rw-r--r--testenv/conf/rule_sample.py10
-rw-r--r--testenv/conf/send_header.py12
-rw-r--r--testenv/conf/server_files.py26
-rw-r--r--testenv/conf/urls.py14
-rw-r--r--testenv/conf/wget_commands.py15
-rw-r--r--testenv/exc/__init__.py0
-rw-r--r--testenv/exc/server_error.py19
-rw-r--r--testenv/exc/test_failed.py7
-rw-r--r--testenv/misc/__init__.py0
-rw-r--r--testenv/misc/colour_terminal.py46
-rw-r--r--testenv/misc/metalinkv3_xml.py305
-rw-r--r--testenv/misc/wget_file.py16
-rw-r--r--testenv/server/__init__.py0
-rw-r--r--testenv/server/ftp/__init__.py0
-rw-r--r--testenv/server/ftp/ftp_server.py162
-rw-r--r--testenv/server/http/__init__.py0
-rw-r--r--testenv/server/http/http_server.py492
-rw-r--r--testenv/test/__init__.py0
-rw-r--r--testenv/test/base_test.py278
-rw-r--r--testenv/test/http_test.py61
-rw-r--r--tests/FTPServer.pm998
-rw-r--r--tests/FTPTest.pm62
-rw-r--r--tests/HTTPServer.pm319
-rw-r--r--tests/HTTPTest.pm56
-rw-r--r--tests/Makefile.am163
-rw-r--r--tests/Makefile.in2368
-rw-r--r--tests/SSLServer.pm236
-rw-r--r--tests/SSLTest.pm73
-rwxr-xr-xtests/Test--httpsonly-r.px78
-rwxr-xr-xtests/Test--no-content-disposition-trivial.px54
-rwxr-xr-xtests/Test--no-content-disposition.px55
-rwxr-xr-xtests/Test--post-file.px22
-rwxr-xr-xtests/Test--spider-fail.px51
-rwxr-xr-xtests/Test--spider-r--no-content-disposition-trivial.px108
-rwxr-xr-xtests/Test--spider-r--no-content-disposition.px109
-rwxr-xr-xtests/Test--spider-r-HTTP-Content-Disposition.px109
-rwxr-xr-xtests/Test--spider-r.px108
-rwxr-xr-xtests/Test--spider.px51
-rwxr-xr-xtests/Test--start-pos--continue.px54
-rwxr-xr-xtests/Test--start-pos.px43
-rwxr-xr-xtests/Test-204.px34
-rwxr-xr-xtests/Test-E-k-K.px88
-rwxr-xr-xtests/Test-E-k.px85
-rwxr-xr-xtests/Test-HTTP-Content-Disposition-1.px75
-rwxr-xr-xtests/Test-HTTP-Content-Disposition-2.px75
-rwxr-xr-xtests/Test-HTTP-Content-Disposition.px55
-rwxr-xr-xtests/Test-N--no-content-disposition-trivial.px47
-rwxr-xr-xtests/Test-N--no-content-disposition.px48
-rwxr-xr-xtests/Test-N-HTTP-Content-Disposition.px49
-rwxr-xr-xtests/Test-N-current.px64
-rwxr-xr-xtests/Test-N-no-info.px62
-rwxr-xr-xtests/Test-N-old.px62
-rwxr-xr-xtests/Test-N-smaller.px65
-rwxr-xr-xtests/Test-N.px47
-rwxr-xr-xtests/Test-O--no-content-disposition-trivial.px45
-rwxr-xr-xtests/Test-O--no-content-disposition.px46
-rwxr-xr-xtests/Test-O-HTTP-Content-Disposition.px46
-rwxr-xr-xtests/Test-O-nc.px45
-rwxr-xr-xtests/Test-O-nonexisting.px45
-rwxr-xr-xtests/Test-O.px45
-rwxr-xr-xtests/Test-Restrict-Lowercase.px54
-rwxr-xr-xtests/Test-Restrict-Uppercase.px54
-rwxr-xr-xtests/Test-auth-basic.px47
-rwxr-xr-xtests/Test-auth-no-challenge-url.px48
-rwxr-xr-xtests/Test-auth-no-challenge.px49
-rwxr-xr-xtests/Test-auth-retcode.px37
-rwxr-xr-xtests/Test-auth-with-content-disposition.px48
-rwxr-xr-xtests/Test-c-full.px56
-rwxr-xr-xtests/Test-c-partial.px66
-rwxr-xr-xtests/Test-c-shorter.px63
-rwxr-xr-xtests/Test-c.px53
-rwxr-xr-xtests/Test-cookies-401.px51
-rwxr-xr-xtests/Test-cookies.px112
-rwxr-xr-xtests/Test-ftp--start-pos.px39
-rwxr-xr-xtests/Test-ftp-bad-list.px68
-rwxr-xr-xtests/Test-ftp-iri-disabled.px51
-rwxr-xr-xtests/Test-ftp-iri-fallback.px47
-rwxr-xr-xtests/Test-ftp-iri-recursive.px47
-rwxr-xr-xtests/Test-ftp-iri.px48
-rwxr-xr-xtests/Test-ftp-list-Multinet.px66
-rwxr-xr-xtests/Test-ftp-list-UNIX-hidden.px64
-rwxr-xr-xtests/Test-ftp-list-Unknown-a.px76
-rwxr-xr-xtests/Test-ftp-list-Unknown-hidden.px68
-rwxr-xr-xtests/Test-ftp-list-Unknown-list-a-fails.px61
-rwxr-xr-xtests/Test-ftp-list-Unknown.px64
-rwxr-xr-xtests/Test-ftp-pasv-fail.px57
-rwxr-xr-xtests/Test-ftp-pasv-not-supported.px56
-rwxr-xr-xtests/Test-ftp-recursive.px54
-rwxr-xr-xtests/Test-ftp.px44
-rw-r--r--tests/Test-https-badcerts.px103
-rwxr-xr-xtests/Test-https-clientcert.px107
-rwxr-xr-xtests/Test-https-crl.px101
-rwxr-xr-xtests/Test-https-pfs.px71
-rwxr-xr-xtests/Test-https-selfsigned.px97
-rwxr-xr-xtests/Test-https-tlsv1.px71
-rwxr-xr-xtests/Test-https-tlsv1x.px72
-rwxr-xr-xtests/Test-https-weboftrust.px128
-rwxr-xr-xtests/Test-i-ftp.px79
-rwxr-xr-xtests/Test-i-http.px90
-rwxr-xr-xtests/Test-idn-cmd-utf8.px50
-rwxr-xr-xtests/Test-idn-cmd.px50
-rwxr-xr-xtests/Test-idn-headers.px65
-rwxr-xr-xtests/Test-idn-meta.px67
-rwxr-xr-xtests/Test-idn-robots-utf8.px77
-rwxr-xr-xtests/Test-idn-robots.px102
-rwxr-xr-xtests/Test-iri-disabled.px195
-rwxr-xr-xtests/Test-iri-forced-remote.px182
-rwxr-xr-xtests/Test-iri-list.px173
-rwxr-xr-xtests/Test-iri-percent.px88
-rwxr-xr-xtests/Test-iri.px208
-rwxr-xr-xtests/Test-k.px92
-rwxr-xr-xtests/Test-meta-robots.px113
-rwxr-xr-xtests/Test-nonexisting-quiet.px42
-rwxr-xr-xtests/Test-noop.px55
-rwxr-xr-xtests/Test-np.px147
-rwxr-xr-xtests/Test-proxied-https-auth-keepalive.px181
-rwxr-xr-xtests/Test-proxied-https-auth.px180
-rwxr-xr-xtests/Test-proxy-auth-basic.px47
-rwxr-xr-xtests/Test-restrict-ascii.px67
-rwxr-xr-xtests/Test-stdouterr.px46
-rw-r--r--tests/WgetFeature.pm41
-rw-r--r--tests/WgetTests.pm447
-rw-r--r--tests/certs/README1
-rw-r--r--tests/certs/client-cert.pem27
-rw-r--r--tests/certs/client-key.pem182
-rw-r--r--tests/certs/client-template.txt23
-rwxr-xr-xtests/certs/create-certs.sh28
-rw-r--r--tests/certs/expired-template.txt20
-rw-r--r--tests/certs/expired.pem28
-rw-r--r--tests/certs/interca.conf64
-rw-r--r--tests/certs/interca.conf.in64
-rw-r--r--tests/certs/interca.crt41
-rw-r--r--tests/certs/interca.key51
-rw-r--r--tests/certs/invalid-template.txt20
-rw-r--r--tests/certs/invalid.pem28
-rw-r--r--tests/certs/revoked-crl.pem16
-rw-r--r--tests/certs/revoked-template.txt5
-rw-r--r--tests/certs/rootca.conf64
-rw-r--r--tests/certs/rootca.conf.in64
-rw-r--r--tests/certs/selfsigned.crt33
-rw-r--r--tests/certs/selfsigned.key52
-rw-r--r--tests/certs/server-cert.pem29
-rw-r--r--tests/certs/server-key.pem182
-rw-r--r--tests/certs/server-template.txt23
-rw-r--r--tests/certs/test-ca-cert.pem26
-rw-r--r--tests/certs/test-ca-key.pem182
-rw-r--r--tests/certs/test-ca-template.txt20
-rw-r--r--tests/certs/user.crt148
-rw-r--r--tests/certs/user.key51
-rw-r--r--tests/certs/wgethosts1
-rw-r--r--tests/certs/wotca.pem78
-rw-r--r--tests/unit-tests.c108
-rw-r--r--tests/unit-tests.h69
-rw-r--r--tests/valgrind-suppressions245
-rw-r--r--tests/valgrind-suppressions-ssl187
-rw-r--r--util/Makefile.am33
-rw-r--r--util/Makefile.in1729
-rw-r--r--util/README15
-rwxr-xr-xutil/rmold.pl89
-rw-r--r--util/trunc.c146
1313 files changed, 545474 insertions, 0 deletions
diff --git a/.tarball-version b/.tarball-version
new file mode 100644
index 0000000..d2ab029
--- /dev/null
+++ b/.tarball-version
@@ -0,0 +1 @@
+1.21
diff --git a/.version b/.version
new file mode 100644
index 0000000..d2ab029
--- /dev/null
+++ b/.version
@@ -0,0 +1 @@
+1.21
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..b1de1b6
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,1282 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international! The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages. A few packages already provide translations for their
+messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+1.1 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU `gettext'. Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. Installers may use special
+options at configuration time for changing the default behaviour. The
+command:
+
+ ./configure --disable-nls
+
+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' 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
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.2 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. If you happen to have the `LC_ALL' or some other
+`LC_xxx' environment variables set, you should unset them before
+setting `LANG', otherwise the setting of `LANG' will not have the
+desired effect. Here `LL' is an ISO 639 two-letter language code, and
+`CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+locales supported by your system for your language by running the
+command `locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+1.3 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://translationproject.org/', in the "Teams" area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `coordinator@translationproject.org' to
+reach the coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skills are praised more than
+programming skills, here.
+
+1.4 Available Packages
+======================
+
+Languages are not equally supported in all packages. The following
+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 an ar as ast az be be@latin bg bn_IN bs ca
+ +--------------------------------------------------+
+ 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 | [] [] |
+ +--------------------------------------------------+
+ 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
+
+ sv sw ta te tg th tr uk vi wa zh_CN zh_HK zh_TW
+ +---------------------------------------------------+
+ 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-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
+ +---------------------------------------------------+
+ 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
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If 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
+`http://translationproject.org/extra/matrix.html'.
+
+1.5 Using `gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library. This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`coordinator@translationproject.org' to make the `.pot' files available
+to the translation teams.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..a1f1176
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,62 @@
+Authors of GNU Wget.
+
+[ Note that this file does not attempt to list all the contributors to
+ Wget; look at the ChangeLogs for that. This is a list of people who
+ contributed sizeable amounts of code and assigned the copyright to
+ the FSF. ]
+
+Hrvoje Niksic. Designed and implemented Wget.
+
+Gordon Matzigkeit. Wrote netrc.c and netrc.h.
+
+Darko Budor. Wrote initial support for Windows, wrote wsstartup.c,
+wsstartup.h and windecl.h. (The files were later renamed, but his
+code and ideas remained present.)
+
+Junio Hamano. Added support for FTP Opie and HTTP digest
+authentication.
+
+Dan Harkless. Added --backup-converted, --follow-tags, --html-extension,
+--ignore-tags, and --page-requisites; improved documentation; etc. Was
+the principle maintainer of GNU Wget for some time.
+
+Christian Fraenkel. Initially implemented SSL support.
+
+Thomas Lussnig. Initially implemented IPv6 support.
+
+Ian Abbott. Contributed bugfixes, Windows-related fixes, provided a
+prototype implementation of the new recursive code, and more.
+Co-maintained Wget during the 1.8 release cycle.
+
+Gisle Vanem. Contributed Windows and MS-DOS improvements, including a
+port of run_with_timeout to Windows, additions to Makefiles, and many
+bug reports and fixes.
+
+Mauro Tortonesi. Improved IPv6 support, adding support for dual
+family systems. Refactored and enhanced FTP IPv6 code. Maintained GNU
+Wget from 2004-2007.
+
+Nicolas Schodet. Contributed to cookie code and documentation.
+
+Daniel Stenberg. NTLM authentication in http-ntlm.c and http-ntlm.h
+originally written for curl donated for use in GNU Wget.
+
+Micah Cowan. Maintained Wget from mid-2007 to mid-2010.
+
+Ralf Wildenhues. Contributed patches to convert Wget to use Automake as
+part of its build process, and various bugfixes.
+
+Steven Schubiger. Many helpful patches, bugfixes and improvements.
+Notably, conversion of Wget to use the Gnulib quotes and quoteargs
+modules, and the addition of password prompts at the console, via the
+Gnulib getpasswd-gnu module.
+
+Ted Mielczarek. Support for parsing links from CSS.
+
+Saint Xavier. Support for IRIs (RFC 3987).
+
+Giuseppe Scrivano. Added support for HTTP/1.1. Active Wget Maintainer from 2010-2015.
+
+Tim Ruehsen. Active Wget Maintainer / Developer from 2012-2020.
+
+Darshit Shah. Active Wget Maintainer / Developer from 2013-2020.
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..e600086
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. 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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. 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.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ 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.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ 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
+state 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 a brief idea of what it does.>
+ Copyright (C) <year> <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 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/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program 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, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..2d30bbf
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,27301 @@
+2020-12-31 Darshit Shah <darnir@gnu.org>
+
+ * NEWS: Finalize release
+
+ * gnulib: Update for release
+
+2020-12-30 Darshit Shah <darnir@gnu.org>
+
+ * src/main.c: Disable use-askpass on VMS
+
+2020-12-30 Steven M. Schweda <sms@antinode.info>
+ Darshit Shah <darnir@gnu.org>
+
+ Fixes for running on VMS
+ time_t on VMS is typically unsigned. (Lazy man's solution to 2038?)
+ I added "(time_t)" type casts to negative values ("-1"), and changed
+ tests to avoid complaints.
+
+ * src/hsts.c (hsts_add_entry): Explicitly cast potentially negative time
+ values to time_t to handle VMS quirks.
+ (hsts_store_entry): Same
+ (get_hsts_store_filename): Use new ajoin_dir_file function to join
+ filenames
+ (test_hsts_read_database): Same
+ * src/init.c (struct options): use-askpass is not implemented on VMS
+ (ajoin_dir_file): New Function to join filenames in a platform
+ agnostic manner
+ (wgetrc_user_file_name): Use ajoin_dir_file to join paths. Doing this
+ correctly, eliminates the need for a special case on VMS
+ * src/init.h: Add prototype for ajoin_dir_file
+ * src/log.c (check_redirect_output): Ignore on VMS
+ * src/main.c(option_data): Disable use-askpass on VMS
+ (print_help): Same
+ (get_hsts_database): Use ajoin_dir_file to join paths
+ (print_version): Add VMS specific information to Version output
+ * src/utils.c (fork_to_background): Fix signature on VMS
+
+2020-12-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove SIZEOF_WGINT as wgint is always int64_t
+ * src/http.c (test_parse_range_header): Remove use of SIZEOF_WGINT.
+ * src/utils.c (human_readable): Remove superfluous HR_NUMTYPE,
+ * (number_to_string): Remove use of SIZEOF_WGINT.
+ * src/utils.h: Remove use of SIZEOF_WGINT and HR_NUMTYPE.
+ * src/wget.h: Remove #define SIZEOF_WGINT.
+
+ src/wget.h: Cleanup code around wgint
+
+2020-12-29 Darshit Shah <darnir@gnu.org>
+
+ Remove portability handling for str[n]casecmp
+ * src/mswindows.c: Gnulib ensures we always have str{n}casecmp
+ * configure.ac: Don't need to define HAVE_STR[N]CASECMP anymore
+
+2020-12-29 Darshit Shah <darnir@gnu.org>
+
+ Remove portability handling code for wgint
+ Gnulib's stdint.h module promises a C99 compliant stdint.h file on all
+ platforms. Thus allowing us to directly use the fixed wodth integer
+ type, int64_t wihout needing to resort to all the checks being
+ performed.
+
+ * src/wget.h: Assume that int64_t is always available and use it
+ * src/mswindows.h: Remove portability code since gnulib handles it
+ * configure.ac: Remove sizeof checks for integer types that are no
+ longer used
+
+2020-12-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .lgtm.yml: Call autoreconf to support Debian oldstable
+
+2020-12-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix --accept-regex/i--reject-regex for FTP
+ * src/ftp.c (ftp_retrieve_glob): Call accept_url() with the full URL
+
+ Reported-by: Frans de Boer <frans@fransdb.nl>
+
+2020-12-28 Darshit Shah <darnir@gnu.org>
+
+ * tests/valgrind-suppressions: Make suppression for libidn false positive more generic
+
+ * Makefile.am: Clean up gnulib_po/stamp-po
+
+ tests/valgrind-suppressions: Add suppressions for false positives
+
+ testenv/Test--https.py: Fix missing import
+
+ .gitlab-ci.yml: Everyone needs an autoreconf now
+
+ .gitlab-ci.yml: Even Debian Stable requires running autoreconf
+
+ Fix usage of Magic number of tests
+ testenv/test/base_test.py: Add new variable SKIP_TEST
+ testenv/Test--https-crl.py: Use SKIP_TEST instead of magic number
+ testenv/Test--https.py: Same
+ testenv/Test-hsts.py: Same
+ testenv/Test-no_proxy-env.py: Same
+ testenv/Test-pinnedpubkey-der-https.py: Same
+ testenv/Test-pinnedpubkey-der-no-check-https.py: Same
+ testenv/Test-pinnedpubkey-hash-https.py: Same
+ testenv/Test-pinnedpubkey-hash-no-check-fail-https.py: Same
+ testenv/Test-pinnedpubkey-pem-fail-https.py: Same
+ testenv/Test-pinnedpubkey-pem-https.py: Same
+
+ .gitlab-ci.yml: All modern builds need autoreconf
+
+ .po/POTFILES.in: Remove files containing no translateable strings
+
+ Fix issues reported by codespell
+
+ .gitlab-ci.yml: Need --force option to autopoint
+
+ * .gitlab-ci.yml: Don't need autoreconf everywhere. Only on Arch
+ This (partially) reverts commit 0309d13794303d82529addecfc31f0e1a8c5b97b.
+
+ configure.ac: Revert to requiring gettext 0.19
+
+ .gitlab-ci.yml: Call autoreconf to refresh gettext files
+
+ * NEWS: Update NEWS items
+
+ configure.ac: Raise minimum gettext version to 0.20
+
+ Run autoupdate on configure.ac
+ * configure.ac, m4/{wget, wget_manywarnings}.m4: Run autoupdate
+
+ .gitignore: Ignore gnulib_po directory
+
+ configure.ac: Replace obsolete macro AC_AIX with AC_USE_SYSTEM_EXTENSIONS
+
+2020-12-27 Darshit Shah <darnir@gnu.org>
+
+ bootstrap.conf: Remove unneeded text block
+
+ m4/getpagesize.m4: Don't track autogenerated file
+
+2020-12-27 Darshit Shah <darnir@gnu.org>
+
+ Remove unneeded files from gnulib
+ m4/exitfail.m4: Remove unneeded file
+ m4/wchar.m4: Same
+ m4/wctype.m4: Same
+
+ The latest versions of these files will be copied by gnulib-tool upon
+ its invokation. No need to track them around here
+
+2020-12-27 Darshit Shah <darnir@gnu.org>
+
+ Use a separate domain for translating gnulib
+ Use the --po-domain option to gnulib-tool to create a new textdomain
+ that can be used by gnulib files for translations. This way, we don't
+ have to maintain the list of all files that require translations in
+ gnulib.
+
+ * bootstrap.conf: Use --po-domain and --po-base options to create a
+ separate base for gnulib translations
+ * src/main.c(i18n_initialize): Call bindtextdomain on wget-gnulib to
+ include those translations as well
+ * Makefile.am: Add new directory gnulib_po to SUBDIRS
+ * configure.ac: Generate gnulib_po/Makefile.in
+ * lib/Makefile.am: Set AM_CPPFLAGS to empty since gnulib.mk expects it
+ to be set
+
+2020-12-27 Darshit Shah <darnir@gnu.org>
+
+ po/POTFILES.in: Update the list of files that need translation
+
+ m4/getpagesize.m4: Update from gnulib
+
+ configure.ac: Increase minimum required version to 2.64
+
+ gnulib: Pull forward
+
+2020-12-22 Darshit Shah <git@darnir.net>
+
+ main.c (main): Warn when trying to use password without username
+
+2020-12-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (http_cleanup): Reset wget_cookie_jar after freeing
+ This silences the wget_options_fuzzer which triggered #28610 on
+ OSS-Fuzz. This issue can not happen with the Wget utility.
+ The fuzzer runs main(),...,cleanup() in a loop which the Wget utility
+ never does.
+
+2020-11-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Add description to --help output of wait options
+
+2020-07-11 Tomas Hozza <thozza@redhat.com>
+
+ testenv: Add test for handling of no_proxy environment variable
+ * testenv/Test-no_proxy-env.py: Added new test for no_proxy env
+ * testenv/Makefile.am: Added the new test to Makefile
+
+ Added new test with 5 cases, which are testing various combinations
+ of no_proxy environment variable definition and requested URLs.
+ The test is skipped if the system does not support resolution of
+ localhost subdomains to lcalhost address.
+
+2020-07-11 Tomas Hozza <thozza@redhat.com>
+
+ testenv: Allow definition of environment variables for wget execuion
+ * testenv/README: Added description for new EnvironmentVariable hook
+ * testenv/conf/environment_variable.py: Added implementation of
+ EnvironmentVariable hook
+ * testenv/test/base_test.py: Modified exec_wget() to enable use of
+ EnvironmentVariable hook
+
+ Added new test hook called EnvironmentVariables, for defining environment
+ variables when wget is executed in tests. This is handy for testing
+ environment variables, which are accepted by wget.
+
+2020-07-11 Tomas Hozza <thozza@redhat.com>
+
+ testenv: HTTPTest.begin() should return exit value
+ * testenv/test/http_test.py: Ensure that HTTPTest.begin() always returns
+ a value
+
+ Previously the HTTPTest.begin() method always returned None. However this
+ is not consistent with the begin() implementation of the parent class
+ (BaseTest). This change ensures that HTTPTest.begin() returns a value.
+
+2020-07-07 Darshit Shah <git@darnir.net>
+
+ Minor documentation clarification
+ * src/wget.texi: Clarify behaviour of --quota
+ Thanks to TheWild on IRC for pointing it out
+
+2020-06-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp.c (ftp_loop_internal): Check for VERIFCERTERR to avoid SIGABRT
+ There is a bug that causes wget to exit with SIGABRT when trying to
+ receive files through FTP from a server with a certificate that failed
+ the verification.
+
+ The bug is filed in RedHat Bugzilla for Fedora:
+ https://bugzilla.redhat.com/show_bug.cgi?id=1475861
+
+ Reported-by: Artem Egorenkov <aegorenk@redhat.com>
+
+2020-06-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/host.c (lookup_host): Fix uninitialized pointer access in c-ares code
+ Reported-by: Swapnil More
+
+2020-05-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_init): Small cleanup fixing output of ncerts
+
+2020-05-01 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/convert.c (downloaded_files_free): Only compile if DEBUG_MALLOC or TESTING is defined
+
+ * src/netrc.c (free_netrc): Only compile if DEBUG_MALLOC or TESTING is defined
+
+2020-05-01 Ð’ÑчеÑлав Петрищев <vyachemail@gmail.com>
+
+ Fix SSL/TLS timeout issues.
+ * connect.c (fd_read, fd_peek): Let implementation take care about timeout.
+ * gnutls.c (_do_handshake, _do_reauth, wgnutls_read_timeout): Fix support for interactive timeout.
+ * gnutls.c (wgnutls_peek): Let wgnutls_read_timeout() take care about timeout.
+ * openssl.c (openssl_read_peek): Fix 0 (-1) timeout.
+ * retr.c (fd_read_body): Avoid wrong 'interactive timeout'.
+
+ Set interactive to true for bar progress.
+ * src/progress.c (bar_set_params): Set interactive to true.
+ * src/retr.c (fd_read_body): Avoid call fd_read with 0 timeout.
+
+2020-05-01 Ð’ÑчеÑлав Петрищев <vyachemail@gmail.com>
+
+ New implementation for openssl_read, openssl_peek ssl_connect_with_timeout (openssl)
+ Add new implementation for openssl_read, openssl_peek
+ ssl_connect_with_timeout (openssl). Thats allow continue
+ read after ETIMEDOUT (if timeout < opt.read_timeout)
+ without 'Retrying', and do not create thread (under MSWin)
+ for every read. Old implementation, (with fix for 'timeout')
+ avaible for build with: -DOPENSSL_RUN_WITHTIMEOUT
+
+ Add timeout for transport_implementation {reader,peeker};
+
+ * src/init.c (cmd_time): Add check for negative value.
+ * src/connect.h (transport_implementation {reader,peeker}): Change function prototype.
+ * src/connect.c (select_fd_nb): New function, aviod conversion to blocked under MSWin.
+ * src/gnutls.c
+ (gnutls_read): Fix: using timeout, seting ETIMEDOUT, conversion to blocked.
+ (gnutls_peek): Likewise.
+ (wgnutls_errstr): Add errmsg for ETIMEDOUT.
+ (_do_handshake) (_do_reauth): Fix conversion to blocked.
+ * src/openssl.c:
+ Add new implementation for openssl_read, openssl_peek, ssl_connect_with_timeout.
+ (init_prng): when option --random-file given warn user if RAND_load_file() fail.
+
+2020-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add missing linefeed in output strings
+ * src/ftp.c (getftp): Add linefeed to error message.
+ * src/res.c (res_parse_from_file): Likewise.
+ * src/utils.c (fopen_stat): Likewise.
+ (open_stat): Likewise.
+
+2020-03-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/metalink.c: Include filename.h instead of dosname.h
+
+ * gnulib: Update
+
+2020-03-24 Tomas Hozza <thozza@redhat.com>
+
+ Don't print message about loading crl or ca-cert files with --no-verbose
+ * src/gnutls.c (ssl_init): Use LOG_VERBOSE verbosity for informative
+ message related to loading CRL or CA certificate file.
+
+ Before change [1], wget didn't produce any output related to loading CA
+ certificates when --no-verbose option has been used. When --no-verbose
+ option is used, only error messages and basic information should get
+ printed. Information about loading CRL or CA certificate is probably not
+ a basic information. Any error when loading the CRL or CA certificate
+ will be still printed with --no-verbose.
+
+ Some users rely on wget not printing such information and they consider
+ it a regression.
+
+ Reported as https://bugzilla.redhat.com/show_bug.cgi?id=1807267
+
+ [1] http://git.savannah.gnu.org/cgit/wget.git/commit/?id=e4a8fe84e2b813b65d91aec29298eecabe4850a5
+
+2020-03-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add NTLM fuzzer
+ * configure.ac: Create WITH_NTLM conditional.
+ * fuzz/Makefile.am: Add wget_ntlm_fuzzer.
+ * fuzz/wget_ntlm_fuzzer.c: New file.
+ * fuzz/wget_ntlm_fuzzer.in/*: Initial fuzz corpora.
+
+ * src/http.c (check_auth): Fix memory leak
+
+ * src/http-ntlm.c (mkhash): Fix read buffer overflow
+
+2020-03-05 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * README.checkout: Fix gperf typo and tab indentation
+
+ * .gitlab-ci.yml: Generate online docs and coverage reports for Gitlab
+
+2020-03-05 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add code coverage reporting
+ * configure.ac: Add AX_CODE_COVERAGE.
+ * Makefile.am: Add rules 'check-coverage' and 'fuzz-coverage'.
+ * fuzz/Makefile.am: Amend LDADD, AM_CFLAGS and AM_CPPFLAGS.
+ * src/Makefile.am: Amend LDADD, AM_CFLAGS and AM_CPPFLAGS.
+
+ This add a new configure option, --enable-code-coverage.
+
+ With this option enabled, generate test code coverage with
+ make code-coverage
+ and generate coverage for the fuzz test corpora with
+ make fuzz-coverage
+
+2020-03-05 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Don't cast 3rd param to request_set_header.
+
+ * README: Fix typo 'can retrieves' -> 'can retrieve'
+
+2020-03-03 Darshit Shah <darnir@gnu.org>
+
+ * doc/wget.texi: Add maintainers and mention wget2
+
+ doc/wget.texi: Clarify usage of --level
+
+2020-03-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): Remove unneeded free of hstat.(message|error)
+
+ * src/http.c (gethttp): Fix memleaks
+ Reported-by: Ð’ÑчеÑлав Петрищев
+
+ * src/http.c (read_response_body): Fix memleak
+ Reported-by: Ð’ÑчеÑлав Петрищев
+
+2020-02-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * contrib/spell-checker: Add lightening to exceptions
+
+ Always build ssl_cleanup
+ * src/gnutls.c (ssl_cleanup): Don't build conditionally.
+ * src/openssl.c (ssl_cleanup): Likewise
+
+2020-02-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: Fix spelling error
+ Reported-by: Jim Cathey
+
+2020-02-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/convert.c (convert_cleanup): Free downloaded_css_set
+
+ * src/openssl.c (ssl_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/gnutls.c (ssl_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/netrc.c (netrc_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/log.c (log_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/host.c (host_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/spider.c (spider_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/res.c (res_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/convert.c (convert_cleanup): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/html-url.c (cleanup_html_url): Only compile for DEBUG_MALLOC or TESTING
+
+ * src/http.c (http_cleanup): Free hashtable basic_authed_hosts
+
+ * src/cookies.c (cookie_jar_delete): Set psl to NULL after calling psl_free
+
+ * src/init.c (cleanup): Call ssl_cleanup and connect_cleanup
+
+ Add ssl_cleanup to free memory
+ * src/ssl.h: Add declaration for ssl_cleanup.
+ * src/openssl.c: Add ssl_cleanup stub.
+ * src/gnutls.c: Implement ssl_cleanup.
+
+ * src/http.c (http_cleanup): Call invalidate_persistent to free resources
+
+ * src/cookies.c: Free PSL in cookie_jar_delete
+
+ * src/connect.c (connect_cleanup): Only needed with DEBUG_MALLOC or TESTING
+
+ * src/http.c (http_loop): Avoid unneeded strdup
+
+2020-02-27 Ð’ÑчеÑлав Петрищев <vyachemail@gmail.com>
+
+ * src/http.c (gethttp): Fix memleak
+
+2020-02-23 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Do not reveal OS type to server via User-Agent: header
+ Following the "privacy by design" principle, which is now European law by
+ virtue of the GDPR since 2018, the client should not transmit the operating
+ system.
+
+ Fixes #57884
+ Reported-by: Bruno Haible
+
+2020-02-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/unit-tests.c: Fix 'multiple definition of...' with gcc 10
+
+ Split unique_name into two functions with just one arg
+ * src/http.c (check_file_output): Call unique_name_passthrough.
+ * src/metalink.c (badhash_suffix): Call unique_name.
+ * src/url.c (url_file_name): Call unique_name_passthrough.
+ * src/utils.c: Split unique_name, amend description.
+ * src/utils.h: Amend unique_name, add unique_name_passthrough.
+
+ * .gitlab-ci.yml: Set tag 'linux' explicitly for each runner
+
+2020-02-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (print_response_line): Fixed comparison
+ Introduced in 68868bbb3737d26c197f39edafc5d526334426b0 (13.2.2020).
+
+ Reported-by: Gisle Vanem
+
+2020-02-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add valgrind suppressions
+ * testenv/valgrind-suppression-ssl: Add gnutls suppressions
+ * tests/valgrind-suppressions: Likewise
+ * tests/valgrind-suppressions-ssl: Likewise
+
+ Add --gen-suppressions=all to valgrind options
+ * testenv/test/base_test.py: Add --gen-suppressions=all to valgrind options
+ * tests/Test-proxied-https-auth.px: Likewise
+ * tests/WgetTests.pm: Likewise
+
+ * cfg.mk: Exclude sc_prohibit_gnu_make_extensions
+
+ * src/retr.c (fd_read_body): Check timer before accessing (Coverity #600494)
+
+ * src/warc.c (warc_write_start_record): Check return values of fseek, fflush (Coverity #1419650)
+
+ * src/ftp-ls.c (eat_carets): Fix caret decoding issue (Coverity #1419653)
+
+ * src/warc.c (warc_write_block_from_file): Check for write error (Coverity #1419654)
+
+ * src/warc.c (warc_write_end_record): Check return value of fseeko (Coverity #1419657)
+
+ Add valgrind suppressions for HTTPS tests (GnuTLS false positive)
+ * testenv/valgrind-suppression-ssl: Add new rule
+ * tests/valgrind-suppressions: Likewise
+ * tests/valgrind-suppressions-ssl: Likewise
+
+2020-02-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/init.c (setoptval): Add missing comma (fix compilation)
+
+ * .gitlab-ci.yml: Add spell-checking to VPATH/Debian
+
+2020-02-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix typos found by codespell
+ */*: Fix typos
+
+ Thanks to https://fossies.org/features.html#codespell
+
+ Reported-by: Jens Schleusener
+
+2020-02-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * contrib/spell-checker: Add new file
+
+ * src/init.c (setoptval): Silence Coverity (Coverity #1419648)
+
+ * src/main.c (init_switches): Remove unneeded code (Coverity #1419658)
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix use of uninitialized stack mem (Coverity #609373)
+
+2020-02-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/retr.c (retrieve_url): Fix memory leak (Coverity #1316408)
+
+ * src/http.c (set_file_timestamp): Fix stack memory leak (Coverity #1419655)
+
+ * src/main.c (main): Initialize variable (Coverity #1419660)
+
+ * .gitlab-ci.yml: Fix linebreak
+
+ * src/http.c (metalink_from_http): Fix memleak (Coverity #1419661, #1419656)
+
+ * .gitlab-ci.yml: Add 'coverity' runner
+
+ * contrib/mk_authors: Create list of authors and translators since last version
+
+ * src/progress.c (eta_to_human_short): Silence -Wformat-overflow
+
+2020-02-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .gitlab-ci.yml: Don't copy gnulib manually
+
+ * NEWS: Update
+
+ Remove alloca includes and macros
+ * bootstrap.conf: Remove gnulib module 'alloca'.
+ * src/sysdep.h: Remove include of alloca.h.
+ * src/wget.h: Likewise,
+ remove macros BOUNDED_TO_ALLOCA and STRDUP_ALLOCA.
+
+ * src/utils.h: Remove alloca_array
+
+ * src/convert.c (convert_links_in_hashtable): Remove use of alloca
+
+ * src/convert.c (local_quote_string): Remove use of alloca
+
+ * src/convert.c (replace_attr_refresh_hack): Remove use of alloca
+
+ * gnulib: Update
+
+ * bootstrap.conf: Use fnmatch-gnu instead of fnmatch
+
+ * src/convert.c (write_backup_file): Remove use of alloca
+
+ * src/utils.c (fnmatch_nocase): Remove FNM_CASEFOLD emulation, gnulib takes care of it
+
+ * src/cookies.c (cookie_header): Remove use of alloca
+
+ * src/cookies.c (cookie_header): Remove use of alloca
+
+ * src/cookies.c (cookie_handle_set_cookie): Remove use of alloca
+
+ * src/cookies.c (parse_set_cookie): Explicitly convert from double to time_t
+
+ * src/cookies.c (parse_set_cookie): Remove use of alloca
+
+ * src/warc.c (warc_uuid_str): Add second param to windows_uuid_str
+
+ * src/cookies.c (parse_set_cookie): Remove use of alloca
+
+ * src/main.c (main): Code clean, reduce allocations
+
+ * src/main.c: Modify macro IF_SSL to work with latest struct changes
+
+ * configure.ac: List 'no' for --with-ssl in help output
+
+2020-02-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp.c (ftp_retrieve_dirs): Remove use of alloca
+
+ * src/ftp.c (ftp_retrieve_list): Remove use of alloca
+
+ * src/ftp.c (ftp_loop_internal): Remove use of alloca
+
+ * src/ftp.c (getftp): Remove use of alloca
+
+ * src/http.c: Include xstrndup.h unconditionally
+
+ * src/ftp-basic.c (ftp_request): Remove use of alloca
+
+ * src/html-parse.c (name_allowed): Remove use of alloca
+
+ * src/netrc.c (search_netrc): Remove use of alloca
+
+ * src/init.c (parse_line): Remove use of alloca
+
+ Remove use of alloca in setoptval
+ * src/init.c (setoptval): Remove use of alloca
+ * src/init.h: Add define MAX_LONGOPTION
+ * src/main.c (struct cmdline_option): Make 'long_name' a char array
+
+ * src/http.c (check_auth): Remove use of alloca
+
+ * src/http.c (print_response_line): Remove use of alloca
+
+ * src/http.c (request_set_user_header): Remove use of alloca
+
+ * src/http.c (metalink_from_http): Remove use of alloca
+
+ * src/http.c (basic_authentication_encode): Remove use of alloca
+
+ * src/http.c (gethttp): Remove use of alloca
+
+ * src/http.c (gethttp): Remove use of alloca
+
+ * src/http.c (set_file_timestamp): Remove use of alloca
+
+ * src/main.c (main): Remove use of alloca
+
+ * src/url.c (append_uri_pathel): Replace alloca by fixed array / sprintf
+
+ * src/url.c (append_uri_pathel): Replace alloca by fixed array / xmalloc
+
+ * src/utils.c (make_directory): Replace alloca by fixed array / xmalloc
+
+ * src/utils.c (unique_name_1): Replace alloca by xmalloc
+
+ Add buffer size param to warc_uuid_str
+ * src/http.c (gethttp): Add buffer size param to warc_uuid_str.
+ * src/warc.c: Likewise
+ * src/warc.h: Likewise
+
+2020-02-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http-ntlm.c (ntlm_output): Remove alloca
+
+ * src/http-ntlm.c (mkhash): Replace alloca by fixed length array
+
+ * src/http-ntlm.c (ntlm_input): Replace alloca by fixed length array
+
+ * src/gnutls.c (ssl_init): Replace alloca by fixed length arrays
+
+ * src/retr.c (fd_read_body): Fix signedness warnings
+
+ * src/retr.c (rotate_backups): Replace alloca by fixed length arrays
+
+ * src/wget.h: Add inline to _unhex
+
+ * src/metalink.h: Include dirname.h, remove declaration of last_component
+
+ * configure.ac: Add -Wno-undef -Wno-float-equal to gcc's WARN_CFLAGS
+
+ * src/convert.c (convert_links): Fix previous commit
+
+ * src/convert.c (convert_links): Add \n (Fixes #57795)
+
+2020-01-25 Ander Juaristi <ajuaristi@gmx.es>
+
+ Do not overwrite restval if len is smaller
+ * src/http.c (http_loop): overwrite 'restval' only if 'len' is
+ greater than it. Else substract 'len' to 'restval'.
+
+ When retrying a request, only send a 'Range' header if the previous
+ request returned data.
+
+2020-01-24 Ð’ÑчеÑлав Петрищев <vyachemail@gmail.com>
+
+ Fix and cleanup progress bar code
+ *src/progress.c
+ (struct dot_progress) accumulated, rows: Type changed to wgint
+ (print_row_stats): Fix missing unit name 'T'
+ (dot_update): Add ability to reduce dot_draw runtime
+ (bar_update): Avoid integer overflow
+
+ * src/progress.c: Fix MINIMUM_SCREEN_WIDTH
+
+ * src/progress.c (prepare_filename): Replace zero-width mbc (\xe2\x80\x8b, ...)
+
+ Reenabling filename scrolling code in progress bar
+ * src/progress.c: Reenabling filename scrolling code
+ (bar_create): Reenabling file name scrolling.
+ (bar_create): Memory allocation, filename preparation.
+ (bar_finish): Filename memory deallocation.
+ (prepare_filename): New function, replaces unprintable chars.
+
+ Fix multibyte handling in progress bar
+ * src/progress.c
+ (count_cols): Fix return value if invalid multibyte sequence was encountered
+ (bar_draw): Fix xrealoc size
+
+2020-01-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/progress.c (print_row_stats): Fix two integer overflows
+
+ * .gitlab-ci.yml: Fix path for llvm-symbolizer
+
+ * fuzz/wget_progress_fuzzer.in/*: Add fuzzer corpora
+
+ * src/retr.c (calc_rate): Remove unwanted assertions
+
+ Fix buffer overflows in progress 'bar' code
+ * src/progress.c (progress_interactive_p): Sanitize input.
+ (progress_update): Likewise.
+ (bar_create): Use larger BUF_LEN.
+ (bar_create): Remove superfluous memset.
+ (bar_create): Fix filename layout.
+ (bar_create): Remove filename scrolling code, it caused many buffer
+ overflows later in bar_create.
+ (bar_create): Support TB/s download speed.
+
+ Add new fuzzer for the progress bar code
+ * Makefile.am: Add wget_progress_fuzzer.
+ * wget_progress_fuzzer.c: New file.
+
+2020-01-10 Darshit Shah <darnir@gnu.org>
+
+ Update copyright year to 2020
+
+ * cfg.mk: Set update-copyright to use intervals
+
+2019-12-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix segfault in progress bar in certain locales
+ * src/progress.c (create_image): Protect memset from negative count
+
+ Reported-by: JunDong Xie
+
+2019-12-27 Tim Rühsen <tim.ruehsen@gmx.de> (tiny change)
+
+ * src/progress.c (count_cols): Fix return value if USE_NLS_PROGRESS_BAR is undefined
+ Taking patch from #54126
+ Reported-by: Vyacheslav
+
+2019-12-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/progress.c: Allow const names for set_progress_implementation.
+
+ * src/progress.c (dot_draw): Avoid integer overflow
+
+ * fuzz/README.md: Add --enable-assert to fuzzing build
+
+ * src/progress.c (print_row_stats): Fix UB if eta < 0
+
+ * src/progress.c (dot_update, dot_finish): Sanitize input
+
+ * src/retr.c (calc_rate): Fix division by 0
+
+ * src/retr.c (calc_rate): Add TB/s
+
+ * src/progress.c (create_image): Sanitize input param 'dl_total_time'
+
+ * fuzz/README.md: Update clang instructions
+
+2019-12-26 Lauri Nurmi <lanurmi@iki.fi> (tiny change)
+
+ Mark note to translators properly and elaborate its contents.
+ * src/progress.c (create_image): Likewise
+
+ The note was not even picked by xgettext to be included in the .pot,
+ so barely any translators even saw the note.
+ Also, this is one of the most cryptic messages to translate in wget,
+ unless the translator happens to guess where the string is used,
+ or looks at the source.
+
+2019-12-26 Lauri Nurmi <lanurmi@iki.fi> (tiny change)
+
+ * src/main.c (print_help): Don't cut translatable string mid-sentence.
+ Complicates translating.
+
+2019-11-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/wget_read_hunk_fuzzer.c: Use cast to fix C++ error
+
+2019-11-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/Makefile.am: Add build_info.c to EXTRA_DIST
+
+ * .gitlab-ci.yml: Skip tests on tarball build due to missing perl
+
+ * tests/WgetTests.pm: Support to set the wget executable for testing
+
+ * .gitlab-ci.yml: Add --with-ssl=no
+
+ * .gitlab-ci.yml: Allow failure for Valgrind and Scan-Build CI runner
+
+ * src/ftp.c (delelement): Make sure free'd pointer is set to NULL
+
+ * configure.ac: Remove -fno-sanitize-recover=integer
+ With this option on, several overflows from gnulib code (all
+ harmless and on purpose) would break our tests.
+
+2019-11-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Replace XDIGIT_TO_NUM by _unhex() with proper unsigned handling
+ * src/wget.h: Replace XDIGIT_TO_NUM by _unhex()
+ * src/html-parse.c (decode_entity): Use _unhex()
+ * src/host.c (is_valid_ipv6_address): Use _unhex()
+ * src/url.c (url_unescape_1): Use unsigned char to avoid UB
+ * src/res.c (free_specs): Likewise
+
+ Code taken from Wget2. XDIGIT_TO_NUM had a signed issue, detected by
+ scan-build static anylyzer.
+
+2019-11-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/connect.c (select_fd): Check for negative fd
+
+ * .gitlab-ci.yml: Enable Windows executables for MinGW runner
+
+ * .gitlab-ci.yml: Add CI runners from Wget2
+
+2019-11-21 Tomas Hozza <thozza@redhat.com>
+
+ testenv: enable running tests on different wget binary
+ * testenv/README: Document $WGET_PATH
+ * testenv/test/base_test.py: Use $WGET_PATH instead ../src/wget if set
+
+ Previously tests in testenv/ directory were run only on wget binary
+ which was built from sources in src/ directory. However as a
+ wget maintainer in a Linux distribution, I would like to be able to run
+ upstream tests on the wget binary distributed with the distribution.
+
+ This change enables one to define WGET_PATH environment variable
+ to a path to wget binary which should be used by tests.
+
+2019-11-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * AUTHORS: Add Darshit Shah and Tim Rühsen as maintainers
+
+2019-11-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/cookie.c: Fix cookie file header to be recognized by 'file'
+
+ * .mailmap: Allow mapping contributors for statistics
+
+2019-10-03 Darshit Shah <darnir@gnu.org>
+
+ * configure.ac: Ignore -Wchkp which is deprecated
+
+ Update gnulib
+ * gnulib: Pull submodule
+ * bootstrap: Update file from gnulib
+
+2019-05-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Revert "Add . to perl path for all perl tests"
+ This reverts commit 79be99aff4717a75ec7531d8b3a4ec96341754ca.
+
+ /usr/bin/env 8.28 and below doesn't know -S.
+
+2019-05-30 Darshit Shah <darnir@gnu.org>
+
+ Revert " Hi, Thank you again Darshit for your response. The RejectHeaderField rule rejects ANY header"
+ I accidentally commited this patch.
+
+ This reverts commit 4ce2f93600827f47f7fea5e7eeb224232cef3c3d.
+
+2019-05-30 Darshit Shah <darnir@gnu.org>
+
+ * .gitignore: Update gitignore file
+
+2019-05-30 sulfastor <torresmoisesa@gmail.com>
+
+ Hi, Thank you again Darshit for your response. The RejectHeaderField rule rejects ANY header of the header field while RejectHeader rejects ONLY the specified full header. Since we wanted to be sure a header field is not sent to the server we wrote this rule.
+ * doc/wget.texi: Added --disable-header documentation.
+ * fuzz/wget_options_fuzzer.dict: Update with --disable-header inputs.
+ * src/http.c (disabled_header): Checks for disabled headers
+ (request_set_header): Doesn't let header to be set if disabled
+ (gethttp): frees disabled header to let overriding
+ * src/init.c (cmd_dis_header), (check_user_disabled_header) added new option disabled_headers.
+ * src/main.c: added new option --disable-header, added help description
+ * src/options.h: added new option --disable-header
+ * src/utils.h (vec_remove_header)
+ * src/utils.c (vec_remove_header) removes all header instances from vector
+ * testenv/Makefile.am: Added new test files
+ * testenv/server/http/http_server.py: Added new rule RejectHeaderField
+ * testenv/conf/reject_header_field.py: Added new rule RejectHeaderField
+ * testenv/README: Added help description for new rule
+ * testenv/Test-disable-default-headers.py: Test without using --header
+ * testenv/Test-disable-headers-after.py: Test using --header before --disable-header
+ * testenv/Test-disable-headers-before.py: Test using --header after --disable-header
+
+2019-05-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/log.c (log_vprintf_internal): Don't log twice
+
+2019-05-25 AviSoomirtee <avi@cyberstorm.mu> (tiny change)
+
+ * src/openssl.c (ssl_init): post handshake auth for OpenSSL
+
+2019-05-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * bootstrap.conf: Explicitly set source_base and test_base
+
+2019-05-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/convert.c (convert_basename): Do not pass NULL to strrchr()
+
+ * src/url.c (append_uri_pathel): Check for possible NULL dereference
+
+ * fuzz/main.c: Fix paths for WIN32
+
+ * bootstrap.conf: Work around VPATH issue
+
+ * configure.ac: Update gettext version to 0.19.3
+
+ * bootstrap.conf: Remove rsync as prerequisite
+ './bootstrap --skip-po' won't need wget nor rsync
+
+ * bootstrap.conf: Replace prerequisite xz by gzip
+
+2019-05-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add sanitizer flags for ./configure
+ * bootstrap.conf: Add 'warning' gnulib module
+ * configure.ac: Add --enable-fsanitize-* flags
+ * tests/Makefile.am: Add compiler flags for unit testing
+
+2019-05-02 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add --enable-manywarnings from wget2
+ * .gitignore: Exclude /lib/Makefile.am
+ * bootstrap.conf: Use --makefile-name=gnulib.mk with gnulib-tool
+ * configure.ac: Use wget_MANYWARNINGS()
+ * lib/Makefile.am: Define empty noinst_LIBRARIES and MAINTAINERCLEANFILES
+ * m4/wget_manywarnings.m4: New file from GNU Wget2
+ * src/Makefile.am: Use WARN_CFLAGS for AM_CFLAGS
+
+2019-04-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add CONTRIBUTING.md
+ * CONTRIBUTING.md: New file for contributors
+ * README: Mention CONTRIBUTING.md
+
+2019-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/*.in/*: Update corpora from OSS-fuzz
+
+ * fuzz/get_ossfuzz_corpora: Remove -f from unzip, mkdir *.in/
+
+ * .gitlab-ci.yml: Update Gitlab CI WORKDIR to /usr/local
+
+2019-04-26 Eneas U de Queiroz <cote2004-github@yahoo.com> (tiny change)
+
+ * src/openssl.c: fix ssl_init for openssl 1.1.1
+ ssl_init fails with openssl 1.1.1 when openssl.cnf is not found.
+ Redundant calls to intialization functions were removed as
+ OPENSSL_config takes care of them for openssl versions < 1.1.0.
+ For versions > 1.1.0, OPENSSL_init_ssl is preferred.
+
+2019-04-11 Leif Ryge <leif@synthesize.us> (tiny change)
+
+ * doc/wget.texi: Fix typo in man page
+
+2019-04-11 raminfp <ramin.blackhat@gmail.com>
+
+ [log] miss check If logging is inhibited
+
+2019-04-05 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c (do_conversion): Remove unneeded debug lines
+
+2019-04-05 Darshit Shah <darnir@gnu.org>
+
+ * NEWS: Update NEWS for new release
+
+2019-04-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ Fix a buffer overflow vulnerability
+ * src/iri.c(do_conversion): Reallocate the output buffer to a larger
+ size if it is already full
+
+2019-04-05 Darshit Shah <darnir@gnu.org>
+
+ * NEWS: Update NEWS for new release
+
+2019-04-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c (ssl_init): Check for X509_V_FLAG_PARTIAL_CHAIN
+
+2019-04-01 Darshit Shah <darnir@gnu.org>
+
+ * gnulib: Pull forward
+
+2019-03-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/main.c (test_all_from): Fix indentation
+
+2019-03-25 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix corner case in processing server response
+ * src/http.c (response_head_terminator): Don't access uninitialized data
+ * fuzz/wget_read_hunk_fuzzer.c: Sync response_head_terminator()
+
+ Add new fuzzer wget_read_hunk_fuzzer.c
+ * fuzz/Makefile.am: Add wget_read_hunk_fuzzer
+ * fuzz/wget_read_hunk_fuzzer.c: New file
+ * fuzz/wget_read_hunk_fuzzer.in/*: Fuzz corpora
+ * src/connect.c: Add connect_cleanup()
+ * src/connect.h: Add prototype for connect_cleanup()
+
+2019-03-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/wget_netrc_fuzzer.c: Fix fuzzer
+
+ * fuzz/wget_ftpls_fuzzer.c: Fix fuzzer
+
+2019-02-22 Jeffrey Walton <noloader@gmail.com>
+
+ * src/openssl.c (ssl_init): Trust partial cert chain
+
+2019-02-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Use snprintf instead of strcpy/strcat
+
+2019-02-19 Darshit Shah <darnir@gnu.org>
+
+ * src/html-url.c(get_urls_html_fm): Add message in verbose mode with no-follow attribute
+
+2019-02-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix fuzz/ tests for OpenBSD
+ * fuzz/wget_*_fuzzer.c: Take care when calling exit()
+
+ * fuzz/Makefile.am: Remove hard-coded gcc flags
+
+ Fix STDERR closing/restoring in fuzzers
+ * fuzz/fuzzer.h: Add CLOSE_STDERR and RESTORE_STDERR
+ * fuzz/wget_*_fuzzer.c: Use CLOSE_STDERR and RESTORE_STDERR
+
+ * configure.ac: Rearrange AM_ICONV before gl_INIT
+
+2019-02-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Do not hard-code -ldl in fuzz/Makefile.am
+ * configure.ac: Search for dlopen and add library to $FUZZ_LIBS
+ * fuzz/Makefile.am: Link with $FUZZ_LIBS instead of -ldl
+
+ This fixes linking on BSD systems.
+
+ Reported-by: Nam Nguyen
+
+2019-02-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: Correct --logfile -> --output-file
+
+2019-02-10 Darshit Shah <darnir@gnu.org>
+
+ Update gnulib
+
+ Update copyright statements
+
+2019-01-23 Leon Klingele <git@leonklingele.de> (tiny change)
+
+ docs: --no-cache also sets the 'Cache-Control: no-cache' header
+ * doc/wget.texi: Add Cache-Control to docs
+ * src/wget.h: Add Cache-Control to comment of SEND_NOCACHE
+
+2019-01-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .gitlab-ci.yml: Add minimal build
+
+ * src/init.c (cleanup): Check HAVE_HSTS
+ Reported-by: Simon Dales
+
+2018-12-31 André Wolski <andre@dena-design.de>
+
+ NTLM restart authentication (trivial change)
+ * src/http-ntlm.c (ntlm_input): Continue on NTLMSTATE_LAST,
+ error on NTLMSTATE_TYPE3
+
+ The code comes from the cURL project. Thanks to Daniel Stenberg
+ for donating the code.
+
+ https://lists.gnu.org/archive/html/bug-wget/2018-12/msg00030.html
+
+2018-12-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * contrib/spell-checker: Remove trailing whitespace
+
+ Fix typos detected by codespell (via contrib/spell-checker)
+
+ * contrib/spell-checker: Add script for spell checking
+
+2018-12-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/Makefile.am: Fix order of libraries for linking
+
+ * src/wget.h: #undef _Noreturn when building with C++
+
+ * src/gnutls.c (ssl_connect_wget): Fix call to gnutls_set_default_priority()
+
+2018-12-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * NEWS: Add release changes for 1.20.1
+
+2018-12-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Don't save user/pw with --xattr
+ Also the Referer info is reduced to scheme+host+port.
+
+ * src/ftp.c (getftp): Change params of set_file_metadata()
+ * src/http.c (gethttp): Change params of set_file_metadata()
+ * src/xattr.c (set_file_metadata): Remove user/password from origin URL,
+ reduce Referer value to scheme/host/port.
+ * src/xattr.h: Change prototype of set_file_metadata()
+
+2018-12-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Don't use extended attributes (--xattr) by default
+ * src/init.c (defaults): Set enable_xattr to false by default
+ * src/main.c (print_help): Reverse option logic of --xattr
+ * doc/wget.texi: Add description for --xattr
+
+ Users may not be aware that the origin URL and Referer are saved
+ including credentials, and possibly access tokens within
+ the urls.
+
+2018-12-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .travis.yml: Email to wget-dev instead bug-wget mailing list
+
+2018-11-30 Darshit Shah <darnir@gnu.org>
+
+ * NEWS: Prepare for new version
+
+2018-11-13 Darshit Shah <darnir@gnu.org>
+
+ * contrib/make-release: Add a small checklist for pending tasks
+
+ Prepare NEWS for new release
+
+ * configure.ac: gnulib now expects autoconf >=2.63
+
+ * gnulib: Update library
+
+2018-11-13 Jay Satiro <raysatiro@yahoo.com>
+
+ * src/init.c: Stop freeing the pointer returned by ws_mypath()
+ .. since ws_mypath() saves the address it returns in a static pointer
+ for reuse, to also be returned in later calls.
+
+2018-11-13 Darshit Shah <darnir@gnu.org>
+
+ * src/ftp.c(ftp_retrieve_glob): Honor {accept,reject}-regex switches as well
+
+ * src/ftp.c (ftp_retrieve_glob): Refactor to prevent looping over listing multiple times
+
+2018-11-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .gitlab-ci.yml: Split into GnuTLS and OpenSSL build
+
+ * Makefile.am: dist clean po/stamp-po
+
+ Remove auto-generated files from po/
+
+ Add VPATH build
+
+2018-11-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Revert "Bail out on unexpected 416 server errors"
+ This reverts commit 6f3b9959935ad7640bcf48a0a93848ed25ff8963.
+
+ The code is obviously wrong, see https://savannah.gnu.org/bugs/?54963
+ Also, the example from the original post doesn't work any more.
+ With other words, the broken server behavior has been fixed meanwhile.
+
+2018-11-09 Rosen Penev <rosenp@gmail.com> (tiny change)
+
+ openssl: Do not use engines when OpenSSL does not support
+ * src/openssl.c: Check for OPENSSL_NO_ENGINE before
+ including openssl/engine.h and before calling ENGINE_load_builtin_engines()
+
+ Fixes compilation with no engines compiled.
+
+2018-11-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix HTTPS Perl tests
+ * tests/SSLTest.pm: Rename server cert and key file
+ * tests/Test-https*.px: Fix and remove OpenSSL hard-coding
+ * tests/certs/create-certs.sh: Script to generate test files
+ * tests/certs/*-template.txt: GnuTLS template files for certs and crl
+ * tests/certs/*.pem: Keys, certs, crls
+ * tests/certs/README: Removed commands, link to create-certs.sh
+
+2018-10-28 Kapus, Timotej <timotej.kapus13@imperial.ac.uk> (tiny change)
+
+ Replace some loops with string.h functions
+ * src/init.c: Replace loop with strspn
+ * src/url.c: Replace loop with strrchr
+
+2018-10-26 Luiz Angelo Daros de Luca <luizluca@gmail.com> (tiny change)
+
+ * .gitmodules: Use https:// instead of git:// for gnulib
+ git:// does not work over http proxy
+
+ * src/host.c (sufmatch): Fix dot-prefixed domain matching
+ Current sufmatch does not match when domain is dot-prefixed.
+ The example of no_proxy in man (.mit.edu) does use a dot-prefixed
+ domain.
+
+2018-10-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/convert.c (convert_links): Fix fallthrough
+
+2018-10-22 Darshit Shah <darnir@gnu.org>
+
+ * bootstrap: Update script from gnulib
+
+ * gnulib: Update library
+
+2018-10-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .lgtm.yml: New file to add LGTM to Gitlab.com CI
+
+2018-10-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Fix build issue with libgpgme
+
+2018-10-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/*_fuzzer.in/*: Update fuzzer corpora
+
+2018-10-08 Nikos Mavrogiannopoulos <nmav@redhat.com>
+
+ Enable post-handshake auth under gnutls on TLS1.3
+
+2018-09-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (resp_new): Fix code to avoid false positive by clang
+
+ * src/convert.c (convert_links): Fix code to avoid false positive by clang
+
+2018-09-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add support for PCRE2 pattern matching
+ * configure.ac: Check for libpcre2-8
+ * src/init.c (choices): Test for HAVE_LIBPCRE2
+ * src/main.c (main): Set regex compile and match functions
+ * src/options.h: Test for HAVE_LIBPCRE2
+ * src/utils.c: Include pcre2.h, add functions
+ compile_pcre2_regex() and match_pcre2_regex()
+ * src/utils.h: Declare compile_pcre2_regex() and match_pcre2_regex()
+
+ Fixes #54677
+ Reported-by: Noël Köthe
+
+2018-09-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add . to perl path for all perl tests
+ * tests/*.px: Add -I . to the shebang
+
+ This allows perl test to be run from tests/ directory, e.g. via
+ ./Test--post-file.px
+
+2018-09-07 Tomas Hozza <thozza@redhat.com>
+
+ Add TLS 1.3 support for GnuTLS
+ * doc/wget.texi: Add "TLSv1_3" to --secure-protocol
+ * src/gnutls.c (set_prio_default): Use GNUTLS_TLS1_3 where needed
+
+ Wget currently allows specifying "TLSv1_3" as the parameter for
+ --secure-protocol option. However it is only implemented for OpenSSL
+ and in case wget is compiled with GnuTLS, it causes wget to abort with:
+ GnuTLS: unimplemented 'secure-protocol' option value 6
+
+ GnuTLS contains TLS 1.3 implementation since version 3.6.3 [1]. However
+ currently it must be enabled explicitly in the application of it to be
+ used. This will change after the draft is finalized. [2] However for
+ the time being, I enabled it explicitly in case "TLSv1_3" is used with
+ --secure-protocol.
+
+ I also fixed man page to contain "TLSv1_3" in all listings of available
+ parameters for --secure-protocol
+
+ [1] https://lists.gnupg.org/pipermail/gnutls-devel/2018-July/008584.html
+ [2] https://nikmav.blogspot.com/2018/05/gnutls-and-tls-13.html
+
+2018-08-29 Tomas Korbar <tkorbar@redhat.com>
+
+ Avoid creating empty wget-log when using -O and -q in background
+ * src/log.c (check_redirect_output): Check for quiet mode
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/warc.c (warc_write_cdx_record): Fix RESOURCE LEAK found by Coverity
+ Error: RESOURCE_LEAK (CWE-772): - REAL ERROR
+ wget-1.19.5/src/warc.c:1376: alloc_fn: Storage is returned from allocation function "url_escape".
+ wget-1.19.5/src/url.c:284:3: alloc_fn: Storage is returned from allocation function "url_escape_1".
+ wget-1.19.5/src/url.c:255:3: alloc_fn: Storage is returned from allocation function "xmalloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: alloc_fn: Storage is returned from allocation function "malloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: var_assign: Assigning: "p" = "malloc(n)".
+ wget-1.19.5/lib/xmalloc.c:44:3: return_alloc: Returning allocated memory "p".
+ wget-1.19.5/src/url.c:255:3: var_assign: Assigning: "newstr" = "xmalloc(newlen + 1)".
+ wget-1.19.5/src/url.c:258:3: var_assign: Assigning: "p2" = "newstr".
+ wget-1.19.5/src/url.c:275:3: return_alloc: Returning allocated memory "newstr".
+ wget-1.19.5/src/url.c:284:3: return_alloc_fn: Directly returning storage allocated by "url_escape_1".
+ wget-1.19.5/src/warc.c:1376: var_assign: Assigning: "redirect_location" = storage returned from "url_escape(redirect_location)".
+ wget-1.19.5/src/warc.c:1381: noescape: Resource "redirect_location" is not freed or pointed-to in "fprintf".
+ wget-1.19.5/src/warc.c:1387: leaked_storage: Returning without freeing "redirect_location" leaks the storage that it points to.
+ \# 1385| fflush (warc_current_cdx_file);
+ \# 1386|
+ \# 1387|-> return true;
+ \# 1388| }
+ \# 1389|
+
+ url_escape() really returns a newly allocated memory and it leaks when the warc_write_cdx_record() returns. The memory returned from url_escape() is usually stored in a temporary variable in other parts of the project and then freed. I took the same approach.
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/warc.c (warc_write_start_record): Fix potential RESOURCE LEAK
+ In warc_write_start_record() function, the reutrn value of dup() is
+ directly used in gzdopen() call and not stored anywhere. However the
+ zlib documentation says that "The duplicated descriptor should be saved
+ to avoid a leak, since gzdopen does not close fd if it fails." [1].
+ This change stores the FD in a variable and closes it in case gzopen()
+ fails.
+
+ [1] https://www.zlib.net/manual.html
+
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/warc.c:217: open_fn: Returning handle opened by "dup".
+ wget-1.19.5/src/warc.c:217: leaked_handle: Failing to save or close handle opened by "dup(fileno(warc_current_file))" leaks it.
+ \# 215|
+ \# 216| /* Start a new GZIP stream. */
+ \# 217|-> warc_current_gzfile = gzdopen (dup (fileno (warc_current_file)), "wb9");
+ \# 218| warc_current_gzfile_uncompressed_size = 0;
+ \# 219|
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/utils.c (open_stat): Fix RESOURCE LEAK found by Coverity
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/utils.c:914: open_fn: Returning handle opened by "open". [Note: The source code implementation of the function has been overridden by a user model.]
+ wget-1.19.5/src/utils.c:914: var_assign: Assigning: "fd" = handle returned from "open(fname, flags, mode)".
+ wget-1.19.5/src/utils.c:921: noescape: Resource "fd" is not freed or pointed-to in "fstat". [Note: The source code implementation of the function has been overridden by a builtin model.]
+ wget-1.19.5/src/utils.c:924: leaked_handle: Handle variable "fd" going out of scope leaks the handle.
+ \# 922| {
+ \# 923| logprintf (LOG_NOTQUIET, _("Failed to stat file %s, error: %s\n"), fname, strerror(errno));
+ \# 924|-> return -1;
+ \# 925| }
+ \# 926| #if !(defined(WINDOWS) || defined(__VMS))
+
+ This seems to be a real issue, since the opened file descriptor in "fd"
+ would leak. There is also additional check below the "fstat" call, which
+ closes the opened "fd".
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/http.c (http_loop): Fix RESOURCE LEAK found by Coverity
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/http.c:4486: alloc_fn: Storage is returned from allocation function "url_string".
+ wget-1.19.5/src/url.c:2248:3: alloc_fn: Storage is returned from allocation function "xmalloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: alloc_fn: Storage is returned from allocation function "malloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: var_assign: Assigning: "p" = "malloc(n)".
+ wget-1.19.5/lib/xmalloc.c:44:3: return_alloc: Returning allocated memory "p".
+ wget-1.19.5/src/url.c:2248:3: var_assign: Assigning: "result" = "xmalloc(size)".
+ wget-1.19.5/src/url.c:2248:3: var_assign: Assigning: "p" = "result".
+ wget-1.19.5/src/url.c:2250:3: noescape: Resource "p" is not freed or pointed-to in function "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.]
+ wget-1.19.5/src/url.c:2253:7: noescape: Resource "p" is not freed or pointed-to in function "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.]
+ wget-1.19.5/src/url.c:2257:11: noescape: Resource "p" is not freed or pointed-to in function "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.]
+ wget-1.19.5/src/url.c:2264:3: noescape: Resource "p" is not freed or pointed-to in function "memcpy". [Note: The source code implementation of the function has been overridden by a builtin model.]
+ wget-1.19.5/src/url.c:2270:7: identity_transfer: Passing "p" as argument 1 to function "number_to_string", which returns an offset off that argument.
+ wget-1.19.5/src/utils.c:1776:11: var_assign_parm: Assigning: "p" = "buffer".
+ wget-1.19.5/src/utils.c:1847:3: return_var: Returning "p", which is a copy of a parameter.
+ wget-1.19.5/src/url.c:2270:7: noescape: Resource "p" is not freed or pointed-to in function "number_to_string".
+ wget-1.19.5/src/utils.c:1774:25: noescape: "number_to_string(char *, wgint)" does not free or save its parameter "buffer".
+ wget-1.19.5/src/url.c:2270:7: var_assign: Assigning: "p" = "number_to_string(p, url->port)".
+ wget-1.19.5/src/url.c:2273:3: noescape: Resource "p" is not freed or pointed-to in function "full_path_write".
+ wget-1.19.5/src/url.c:1078:47: noescape: "full_path_write(struct url const *, char *)" does not free or save its parameter "where".
+ wget-1.19.5/src/url.c:2287:3: return_alloc: Returning allocated memory "result".
+ wget-1.19.5/src/http.c:4486: var_assign: Assigning: "hurl" = storage returned from "url_string(u, URL_AUTH_HIDE_PASSWD)".
+ wget-1.19.5/src/http.c:4487: noescape: Resource "hurl" is not freed or pointed-to in "logprintf".
+ wget-1.19.5/src/http.c:4513: leaked_storage: Variable "hurl" going out of scope leaks the storage it points to.
+ \# 4511| {
+ \# 4512| printwhat (count, opt.ntry);
+ \# 4513|-> continue;
+ \# 4514| }
+ \# 4515| else
+
+ There are two conditional branches, which call continue, without freeing memory potentially allocated and pointed to by"hurl" pointer. In fase "!opt.verbose" is True and some of the appropriate conditions in the following if/else if construction, in which "continue" is called, are also true, then the memory allocated to "hurl" will leak.
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/http.c (check_auth): Fix RESOURCE LEAK found by Coverity
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/http.c:2434: alloc_fn: Storage is returned from allocation function "xmalloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: alloc_fn: Storage is returned from allocation function "malloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: var_assign: Assigning: "p" = "malloc(n)".
+ wget-1.19.5/lib/xmalloc.c:44:3: return_alloc: Returning allocated memory "p".
+ wget-1.19.5/src/http.c:2434: var_assign: Assigning: "auth_stat" = storage returned from "xmalloc(4UL)".
+ wget-1.19.5/src/http.c:2446: noescape: Resource "auth_stat" is not freed or pointed-to in "create_authorization_line".
+ wget-1.19.5/src/http.c:5203:70: noescape: "create_authorization_line(char const *, char const *, char const *, char const *, char const *, _Bool *, uerr_t *)" does not free or save its parameter "auth_err".
+ wget-1.19.5/src/http.c:2476: leaked_storage: Variable "auth_stat" going out of scope leaks the storage it points to.
+ \# 2474| /* Creating the Authorization header went wrong */
+ \# 2475| }
+ \# 2476|-> }
+ \# 2477| else
+ \# 2478| {
+
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/http.c:2431: alloc_fn: Storage is returned from allocation function "url_full_path".
+ wget-1.19.5/src/url.c:1105:19: alloc_fn: Storage is returned from allocation function "xmalloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: alloc_fn: Storage is returned from allocation function "malloc".
+ wget-1.19.5/lib/xmalloc.c:41:11: var_assign: Assigning: "p" = "malloc(n)".
+ wget-1.19.5/lib/xmalloc.c:44:3: return_alloc: Returning allocated memory "p".
+ wget-1.19.5/src/url.c:1105:19: var_assign: Assigning: "full_path" = "xmalloc(length + 1)".
+ wget-1.19.5/src/url.c:1107:3: noescape: Resource "full_path" is not freed or pointed-to in function "full_path_write".
+ wget-1.19.5/src/url.c:1078:47: noescape: "full_path_write(struct url const *, char *)" does not free or save its parameter "where".
+ wget-1.19.5/src/url.c:1110:3: return_alloc: Returning allocated memory "full_path".
+ wget-1.19.5/src/http.c:2431: var_assign: Assigning: "pth" = storage returned from "url_full_path(u)".
+ wget-1.19.5/src/http.c:2446: noescape: Resource "pth" is not freed or pointed-to in "create_authorization_line".
+ wget-1.19.5/src/http.c:5203:40: noescape: "create_authorization_line(char const *, char const *, char const *, char const *, char const *, _Bool *, uerr_t *)" does not free or save its parameter "path".
+ wget-1.19.5/src/http.c:2476: leaked_storage: Variable "pth" going out of scope leaks the storage it points to.
+ \# 2474| /* Creating the Authorization header went wrong */
+ \# 2475| }
+ \# 2476|-> }
+ \# 2477| else
+ \# 2478| {
+
+ Both "pth" and "auth_stat" are allocated in "check_auth()" function. These are used for creating the HTTP Authorization Request header via "create_authorization_line()" function. In case the creation went OK (auth_err == RETROK), then the memory previously allocated to "pth" and "auth_stat" is freed. However if the creation failed, then the memory is never freed and it leaks.
+
+2018-08-27 Tomas Hozza <thozza@redhat.com>
+
+ * src/ftp.c (getftp): Fix RESOURCE LEAK found by Coverity
+ Error: RESOURCE_LEAK (CWE-772):
+ wget-1.19.5/src/ftp.c:1493: alloc_fn: Storage is returned from allocation function "fopen".
+ wget-1.19.5/src/ftp.c:1493: var_assign: Assigning: "fp" = storage returned from "fopen(con->target, "wb")".
+ wget-1.19.5/src/ftp.c:1811: leaked_storage: Variable "fp" going out of scope leaks the storage it points to.
+ \# 1809| if (fp && !output_stream)
+ \# 1810| fclose (fp);
+ \# 1811|-> return err;
+ \# 1812| }
+ \# 1813|
+
+ It can happen, that "if (!output_stream || con->cmd & DO_LIST)" on line #1398 can be true, even though "output_stream != NULL". In this case a new file is opened to "fp". Later it may happen in the FTPS branch, that some error will occure and code will jump to label "exit_error". In "exit_error", the "fp" is closed only if "output_stream == NULL". However this may not be true as described earlier and "fp" leaks.
+
+ On line #1588, there is the following conditional free of "fp":
+
+ /* Close the local file. */
+ if (!output_stream || con->cmd & DO_LIST)
+ fclose (fp);
+
+ Therefore the conditional at the end of the function after "exit_error" label should be modified to:
+
+ if (fp && (!output_stream || con->cmd & DO_LIST))
+ fclose (fp);
+
+ This will ensure that "fp" does not leak in any case it sould be opened.
+
+2018-08-11 Tomas Hozza <thozza@redhat.com>
+
+ Don't limit the test suite HTTPS server to TLSv1
+ In Fedora, we are implementing crypto policies, in order to enhance the
+ security of user systems. This is done on the system level by global
+ configuration. It may happen that due to the active policy, only
+ TLSv1.2 or higher will be available in crypto libraries. While wget as
+ a client will by default determine the minimal TLS version supported by
+ both client and server, the HTTPS server implementation in testenv/
+ hardcodes use of TLSv1. As a result all HTTPS related tests fail in
+ case a more hardened crypto policy is set on the Fedora system.
+
+ This change removes the explicit TLS version setting and leaves the
+ determination of the minimal supported TLS version on the server and
+ client.
+
+ More information about Fedora change can be found here:
+ https://fedoraproject.org/wiki/Changes/StrongCryptoSettings
+
+2018-06-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_check_certificate): Fix grammar of error msg
+ Reported-by: Nicholas Sielicki
+
+ * fuzz/Makefile.am: Remove libtool LTLIB... from LDADD
+
+ * src/http.c (http_loop): Fix --retry-on-host-error
+
+2018-06-13 ethus3h <kolubat@gmail.com> (tiny change)
+
+ Add new option --retry-on-host-error
+ * doc/wget.texi: Add docs for --retry-on-host-error
+ * src/http.c (http_loop): Add code for HOSTERR
+ * src/init.c: Add option --retry-on-host-error
+ * src/main.c: Likewise
+ * src/options.h: Add options.retry_on_host_error
+
+2018-05-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Save original data to WARC file
+ * src/retr.c (write_data): Cleanup,
+ (fd_read_body): Write to WARC before uncompressing
+
+ Fixes: #53968
+
+2018-05-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/get_ossfuzz_corpora: Speed up corpora download
+
+2018-05-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/main.c (print_version): Silence UBSAN message
+
+ * src/utils.ci (file_exists_p): Fix stat(NULL,...)
+
+ * src/hsts.c (open_hsts_test_store): Fix unlink(NULL)
+
+ * src/hash.c: Silence UBSAN for hash functions
+
+ * fuzz/*_fuzzer.in: Update corpora from OSS-Fuzz
+
+ * fuzz/get_ossfuzz_corpora: Fix path
+
+2018-05-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/hsts.h: Fix header guard
+
+ * src/version.h: Add header guard
+
+ * src/host.c (wait_ares): Remove void assignment
+ Reported-by: Josef Moellers
+
+2018-05-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Update NEWS file for new release
+
+2018-05-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix cookie injection (CVE-2018-0494)
+ * src/http.c (resp_new): Replace \r\n by space in continuation lines
+
+ Fixes #53763
+ "Malicious website can write arbitrary cookie entries to cookie jar"
+
+ HTTP header parsing left the \r\n from continuation line intact.
+ The Set-Cookie code didn't check and could be tricked to write
+ \r\n into the cookie jar, allowing a server to generate cookies at will.
+
+2018-05-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-https-weboftrust.px: Skip test, needs cert regen
+
+ Fix make syntax-check
+ * cfg.mk: Add fuzzer reproducers to exception list
+ * po/POTFILES.in: Add src/spider.c
+
+ Fix HTTPS tests
+ * tests/Test-https-badcerts.px: Fix test return value
+ * tests/Test-https-crl.px: Likewise
+ * README: How to create certs with GnuTLS's certtool
+ * tests/certs/revokedcrl.pem: Recreated revocation
+ * tests/certs/server.crt: Recreated server cert with no expiry
+ * tests/certs/test-ca-cert.pem: Recreated CA cert with no expiry
+
+ * src/init.c: Bring new --ciphers into right order in options array
+
+2018-05-05 Ander Juaristi <a@juaristi.eus>
+
+ * doc/wget.texi: Add description for --ciphers
+
+2018-05-05 Ander Juarist <a@juaristi.eus>
+
+ OpenSSL: Better seeding of PRNG
+ * src/openssl.c (init_prng): keep gathering entropy even though we
+ already have enough
+ (ssl_connect_with_timeout_callback): reseed PRNG again just before
+ the handshake
+
+ Reported-by: Jeffrey Walton <noloader@gmail.com>
+
+2018-05-05 Ander Juaristi <a@juaristi.eus>
+
+ Enhance SSL/TLS security
+ This commit hardens SSL/TLS a bit more in the following ways:
+
+ * Explicitly exclude NULL authentication and the 'MEDIUM' cipher list
+ category. Ciphers in the 'HIGH' level are only considered - this
+ includes all symmetric ciphers with key lengths larger than 128 bits,
+ and some ('modern') 128-bit ciphers, such as AES in GCM mode.
+ * Allow RSA key exchange by default, but exclude it when
+ Perfect Forward Secrecy is desired (with --secure-protocol=PFS).
+ * Introduce new option --ciphers to set the cipher list that the SSL/TLS
+ engine will favor. This string is fed directly to the underlying TLS
+ library (GnuTLS or OpenSSL) without further processing, and hence its
+ format and syntax are directly dependent on the specific library.
+
+ Reported-by: Jeffrey Walton <noloader@gmail.com>
+
+2018-04-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/netrc.c (parse_netrc_fp): Fix two memleaks
+
+ Add new fuzzer for the .netrc parser
+ * fuzz/wget_netrc_fuzzer.c: New fuzzer
+ * fuzz/wget_netrc_fuzzer.dict: Fuzzer dictionary
+ * fuzz/wget_netrc_fuzzer.in: Initial corpora
+ * src/ftp.c (getftp): Amend call to search_netrc()
+ * src/http.c (initialize_request): Likewise
+ * src/netrc.c: Cleanup, prepare code for fuzzing
+ * src/netrc.h: Cleanup
+
+2018-04-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c (match_tail): Fix unsigned integer overflow
+
+ Add new fuzzer for the Set-Cookie parser
+ * fuzz/Makefile.am: Add wget_cookie_fuzzer
+ * fuzz/wget_cookie_fuzzer.c: New fuzzer
+ * fuzz/wget_cookie_fuzzer.dict: Fuzzers dictionary
+ * fuzz/wget_cookie_fuzzer.in: Initial corpora
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix buffer overflow in CSS parser
+ * src/css-url.c (get_uri_string): Check input length
+ * fuzz/wget_css_fuzzer.repro/buffer-overflow-6600180399865856:
+ Add reproducer corpus
+
+ Fixes OSS-Fuzz issue #8033.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix buffer overflow in CSS parser
+ * src/css-url.c (get_urls_css): Check input string length
+ * fuzz/wget_css_fuzzer.repro/negative-size-param-5724866467594240:
+ Add reproducer corpus
+
+ Fixes OSS-Fuzz issue #8032.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Exclude fuzz corpora from tarball
+ * fuzz/Makefile.am: Do not include corpora in tarball
+ * fuzz/main.c: SKIP if corpora directory isn't found (make check)
+
+ The fuzz corpora are thousands of files, not needed for a standard build
+ from a distribution tarball. The reproducers of former issues are being
+ included for regression testing.
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/Makefile.am: Add -I/src to AM_CPPFLAGS
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add CSS slowness reproducer (fixed)
+ * fuzz/wget_css_fuzzer.repro/slowness-6275836549267456: New file
+
+ This file created an extreme CPU usage with the old CSS parser.
+
+2018-04-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Update CSS grammar from 1.x to 2.2
+ * src/css-tokens.h: Add enums and fixate values
+ * src/css.l: Include config.h,
+ ignore several compiler warnings,
+ update the grammar to CSS 2.2
+
+ Fixes OSS-Fuzz issue #8010 (slowness issue).
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+ Some crafted CSS input was extremely slow / CPU wasting, so it could
+ be used as a DOS attack against website scanning.
+
+ The code/grammar changes were backported from Wget2.x.
+
+2018-04-25 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/res.c (add_path): Fix memleak (parsing robots.txt)
+ Fixes OSS-Fuzz issue #8005.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix integer overflow
+ Fixes OSS-Fuzz issue #7999.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+2018-04-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add new fuzzer for the URL parser
+ * fuzz/Makefile.am: Add wget_url_fuzzer
+ * fuzz/wget_url_fuzzer.c: New fuzzer
+ * fuzz/wget_url_fuzzer.in: Initial corpora
+
+ Add new fuzzer for robots.txt parsing
+ * fuzz/Makefile.am: Add wget_robots_fuzzer
+ * fuzz/wget_robots_fuzzer.c: New fuzzer
+ * fuzz/wget_robots_fuzzer.in: Initial corpora
+
+ * fuzz/README.md: Add CFLAGS for undefined sanitizer
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix integer overflow
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix integer overflow by left shift
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Fix integer overflow in date parsing
+
+2018-04-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix heap-buffer-overflow
+ Fixes OSS-Fuzz issue #7931.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix heap-buffer-overflow
+ Fixes OSS-Fuzz issue #7930.
+ This is a long standing bug affecting all versions <= 1.19.4.
+
+ * fuzz/wget_ftpls_fuzzer.in: Update corpora
+
+2018-04-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-ls.c (eat_carets): Fix heap-buffer-overflow
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix memleak
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix heap-buffer-overflow
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix heap-buffer-overflow
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix memleak
+
+ Add new fuzzer for the FTP listing parsers
+ * fuzz/Makefile.am: Add wget_ftpls_fuzzer
+ * fuzz/wget_ftpls_fuzzer.c: New fuzzer
+ * fuzz/wget_ftpls_fuzzer.dict: Fuzzer dictionary
+ * fuzz/wget_ftpls_fuzzer.in/starter: Starting corpus
+ * src/ftp-ls.c: Parsing function take FILE * as argument,
+ new function ftp_parse_ls_fp()
+ * src/ftp.c: Remove static from freefileinfo()
+ * src/ftp.h: Add ftp_parse_ls_fp() and freefileinfo()
+
+ * fuzz/run-clang.sh: Remove -detect_leaks=0 from fuzzer command line
+
+ * src/main.c (main): Fix memleak for fuzzing/testing
+
+ * src/init.c: Fix fuzzing in case ~/.wgetrc doesn't exist
+
+2018-04-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix fuzzer build for C++
+ * fuzz/wget_css_fuzzer.c: Include wget.h outside 'extern "C"',
+ undef fopen_wgetrc directly after wget.h
+ * fuzz/wget_html_fuzzer.c: Likewise
+
+ * fuzz/Makefile.am: Add -I/lib to oss-fuzz builds
+
+ Add new HTML parser fuzzer
+ * fuzz/Makefile.am: Add wget_html_fuzzer
+ * fuzz/wget_html_fuzzer.c: New fuzzer
+ * fuzz/wget_html_fuzzer.dict: HTML dictionary for fuzzing
+ * fuzz/wget_html_fuzzer.in: Initial corpora
+ * src/html-url.c: Add new function get_urls_html_fm()
+ * src/html-url.h: Add ne function get_urls_html_fm()
+ * src/wget.h: Fix define for fopen_wgetrc()
+
+ * fuzz/wget_css_fuzzer.c: Fix build
+
+ * fuzz/wget_css_fuzzer.in/*: Update fuzzer corpora
+
+ * src/css-url.c (get_uri_string): Fix buffer overflow (read)
+
+ * src/iri.h: Fix C++ compile error
+
+2018-04-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Download and scan CSS files in spider mode
+
+ * src/css-url.c (get_urls_css): Call yylex_destroy() to reset CSS scanner
+
+ Add new fuzzer wget_css_fuzzer.c
+ * fuzz/Makefile.am: Add wget_css_fuzzer.c
+ * fuzz/wget_css_fuzzer.c: New fuzzer
+
+2018-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/html-url.h: Include needed header files
+
+ * wget_options_fuzzer.in/*: Update fuzzer corpora
+
+ * fuzz/README.md: Add CXXFLAGS and more configure options
+
+ Fix oss-fuzz issue with exit()
+ * src/wget.h: Define exit() as exit_wget()
+ * fuzz/wget_options_fuzzer.c: Implement exit_wget() and cleanup
+
+2018-04-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * fuzz/wget_options_fuzzer.c: Declare fopen_* as C functions
+
+ Fix fopen/stdin issues with fuzzing
+ * fuzz/wget_options_fuzzer.c: Add fopen_wget() and fopen_wgetrc()
+ * src/utils.c: Use fopen_wgetrc() for config files,
+ don't read from stdin when fuzzing
+ * src/wget.h: Define fopen as fopen_wget when fuzzing,
+ define fopen_wgetrc as fopen when not fuzzing
+
+ * configure.ac: AC_DEFINE FUZZING if --enable-fuzzing was given
+
+ * fuzz/wget_options_fuzzer.c: Write fuzzer crash reports
+
+ * src/log.c: Don't check_redirect_output() when fuzzing
+
+ * src/main.c (promt_for_password): Avoid getpass() when fuzzing
+
+ Fix double fclose() with -d while fuzzing
+ * src/ftp.c (ftp_loop_internal): Set warc_tmp to NULL after ffclose()
+ * src/init.c (cleanup): Set output_stream to NULL after fclose()
+ * src/log.c (log_close): Set global stream vars to NULL after closing
+ * src/recur.c (retrieve_tree): Set rejectedlog to NULL after closing
+ * src/warc.c (warc_close): Set stream vars to NULL after closing
+
+ * src/main.c (main): Don't background if TESTING
+
+ * src/init.c (initialize): Return error, don't exit()
+
+2018-04-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/init.c (cmd_use_askpass): Return false on error
+
+ * src/utils.c (compile_posix_regex): Hard-code string to regcomp
+ regcomp() may be too cpu + memory intensive for fuzzing.
+ See https://sourceware.org/glibc/wiki/Security%20Exceptions
+
+ Fix 2 more memleaks
+ * src/init.c (initialize): Use global var for wgetrc filename
+ * src/iri.c (find_locale): Return strdup'ed locale string
+ * src/options.h (struct options): Add wgetrcfile
+
+ * src/init.c (cleanup): Set output_stream to NULL after closing
+
+ Fix homedir memory leaks
+ * src/hsts.c: Use opt.homedir
+ * src/init.c: Likewise
+ * src/main.c: Likewise
+ * src/netrc.c: Likewise
+ * src/options.h (struct options): Add homedir
+
+ * src/main.c (main): Free opt.encoding_remote properly
+
+ * src/host.c (wait_ares): Free ptimer
+
+ * src/init.c (cleanup): Free regex objects properly
+
+ * src/init.c (cleanup): Never call cleanup() twice
+
+ * src/init.c (cmd_bytes_sum): Fix integer over- and underflow
+
+ * src/main.c (save_hsts): Free hsts_store after closing
+
+ Use strtol() instead of selfmade function
+ * src/init.c (cmd_number): Use strtol() instead of selfmade function
+ * bootstrap.conf: Add strtol gnulib module
+
+ * src/hsts.c (hsts_hash_func): Allow integer overflow
+
+ * init.c (cmd_spec_mirror): Fix uninitialzed stack variable
+
+ * src/init.c (cleanup): Free more variables
+
+ * wget_options_fuzzer.in: Add corpora directory
+
+ * fuzz/wget_options_fuzzer.c: Suppress error messages from wget
+
+ * src/utils.c (fopen_stat): Early return to allow fuzzing/fmemopen
+
+ * src/init.c (initialize): Free mem before exit()
+
+ Add OSS-Fuzz infrastruture
+ * Makefile.am: Add fuzz/ to SUBDIRS
+ * cfg.mk: Fix 'make syntax-check'
+ * configure.ac: Add --enable-fuzzing
+ * fuzz/Makefile.am: New file
+ * fuzz/README.md: New file
+ * fuzz/fuzzer.h: New file
+ * fuzz/get_all_corpora: New file
+ * fuzz/get_ossfuzz_corpora: New file
+ * fuzz/glob_crash.c: New file
+ * fuzz/main.c: New file
+ * fuzz/run-afl.sh: New file
+ * fuzz/run-clang.sh: New file
+ * fuzz/view-coverage.sh: New file
+ * fuzz/wget_options_fuzzer.c: New file
+ * fuzz/wget_options_fuzzer.dict: New file
+ * src/init.c (cleanup): Free more resources
+ * src/main.c (init_switches): Initialize only once,
+ (print_usage): Don't print if TESTING is defined
+ * src/utils.h: Include wget.h
+
+2018-04-05 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Move unit-test code to tests/
+ * src/Makefile.am: Remove test.c and test.h
+ * src/test.c: Rename to tests/unit-tests.c
+ * src/test.h: Rename to tests/unit-tests.h
+ * tests/Makefile.am: Add unit-tests.c and unit-tests.h
+ * src/hsts.c: Amend #include
+ * src/http.c: Likewise
+ * src/init.c: Likewise
+ * src/metalink.c: Likewise
+ * src/res.c: Likewise
+ * src/url.c: Likewise
+ * src/utils.c: Likewise
+
+ * src/main.c: Rename main() -> main_wget() for unit tests
+
+2018-03-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix some issues found by 'infer'
+
+2018-03-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c: Fix build for OpenSSL 1.1.0 without TLS1_3_VERSION
+
+ Add docs for --secure-protocol=TLSv1_3
+ * doc/wget.texi: Likewise
+
+2018-03-08 Loganaden Velvindron <logan@hackers.mu> (tiny change)
+
+ Add TLS1.3 support for OpenSSL build
+ * src/init.c: Add 'tlsv1_3 for --secure-protocol
+ * src/openssl.c (ssl_init): Enable TLS1.3 if possible
+ * src/options.h: Add secure_protocol_tlsv1_3
+ * doc/wget.texi: Add description of TLSv1_3
+
+2018-03-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Add help text for --retry-on-http-error
+ Reported-by: Giovanni Tirloni
+
+2018-03-01 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/url.c (convert_fname): Fix invalid free on iconv_open() failure
+ Reported-by: Volkmar Klatt
+
+2018-02-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/mswindows.c: Fix prototype of fork_to_background()
+ Reported-by: Gisle Vanem
+
+2018-02-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix warning to not print binary IP address
+ * tests/Test-https-badcerts.px: Likewise
+ * tests/Test-https-clientcert.px: Likewise
+ * tests/Test-https-crl.px: Likewise
+ * tests/Test-https-pfs.px: Likewise
+ * tests/Test-https-selfsigned.px: Likewise
+ * tests/Test-https-tlsv1.px: Likewise
+ * tests/Test-https-tlsv1x.px: Likewise
+ * tests/Test-https-weboftrust.px: Likewise
+
+ Use gnulib's utime()
+ * bootstrap.conf: Add modules utime and utime-h
+ * src/utils.c (touch): Remove own code for gnulib's utime()
+
+2018-02-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix logging in background mode
+ * ../src/main.c: Re-init logfile if changed for background mode
+ * ../src/utils.c: fork_to_background() returns whether logfile changed
+ * ../src/utils.h: Set return type bool for fork_to_background()
+
+ Fixes: #53020
+ Reported-by: Noël Köthe
+
+2018-02-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Fix two typos in comments
+
+2018-01-31 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * testenv/conf/expected_files.py: Ignore pubring.gpg
+ Reported-by: Arkadiusz Miśkiewicz
+
+ * bootstrap.conf: Replace gnulib module gettext by gettext-h
+
+2018-01-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Mention list and bugtracker for --help and in man page
+ * doc/wget.texi: Mention list and bugtracker in man page
+ * src/main.c: Mention list and bugtracker for --help
+
+2018-01-21 Darshit Shah <darnir@gnu.org>
+
+ * contrib/make-release: Add another release script
+
+ Update NEWS file for new release
+
+ Fix typo in documentation
+
+2018-01-21 Darshit Shah <darnir@gnu.org>
+
+ Switch off compression by default
+ Gzip compression has a number of bugs which need to be ironed out before
+ we can support it by default. Some of these stem from a misunderstanding
+ of the HTTP spec, but a lot of them are also due to many web servers not
+ being compliant with RFC 7231.
+
+ With this commit, I am marking GZip compression support as experimental
+ in GNU Wget pending further investigation and the addition of tests.
+
+ * src/init.c (defaults): Switch of compression support by default
+ * docs/wget.texi: State that compression is experimental
+
+2018-01-21 Darshit Shah <darnir@gnu.org>
+
+ Pull gnulib module forward
+
+ Revert "* src/init.c (defaults): Set compression_none as the default compression"
+ This reverts commit 8283ac08467016283277578b96533febb8ce1adb.
+
+ * src/init.c (defaults): Set compression_none as the default compression
+
+2018-01-20 Reiji <gey3dr@gmail.com>
+
+ * src/http.c (gethttp): Fix bug that prevented all files from being decompressed
+
+2018-01-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/host.c (sufmatch): Fix to domain matching
+
+2018-01-17 Gisle Vanem <gvanem@yahoo.no>
+
+ * src/netrc.c: Fix Standalone compilation of netrc file
+
+2018-01-14 Darshit Shah <darnir@gnu.org>
+
+ * NEWS: Update NEWS file for new release
+
+ * bootstrap: Use the faster gnulib-tool.py script if possible
+
+ Sync the bootstrap script from gnulib
+
+ Update Copyright years
+
+ Replace HTTP urls with HTTPS where valid
+
+ Update gnulib
+
+ * src/netrc.c: Search for the correct netrc file on Windows
+
+2018-01-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Exclude *.gz and *.tgz from decompression
+
+2017-12-31 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c (wg_pin_peer_pubkey): Fix format warning
+
+2017-12-31 Peter Wu <peter@lekensteyn.nl>
+
+ Avoid redirecting output to file when tcgetpgrp fails
+ * src/log.c (check_redirect_output): tcgetpgrp can return -1 (ENOTTY),
+ be sure to check whether a valid controlling terminal exists before
+ redirecting.
+
+ Fixes: #51181
+
+2017-12-11 Darshit Shah <darnir@gnu.org>
+
+ Add new test for 416 responses
+ * testenv/server/http/http_server.py: If there are multiple requests in
+ which the requested range is unsatisfiable, then send a body in the in
+ the 2nd response onwards
+ * testenv/Test-416.py: New test to check how Wget handles 416 responses
+
+2017-12-08 Darshit Shah <darnir@gnu.org>
+
+ Don't assume a 416 response has no body
+ * http.c(gethttp): In case of a 416 response, try to drain the socket of
+ any bytes before reusing the connection
+
+ Reported-By: Iru Cai <mytbk920423@gmail.com>
+
+2017-11-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Support building with OpenSSL 1.1 w/o deprecated features
+ * src/openssl.c (ssl_init): Fix code for the subject's issue
+
+ Reported-by: Matthew Thode
+
+2017-11-25 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Avoid link conversion after 304 Not Modified
+ * src/http.c (gethttp): Handle 304 before setting document content type
+
+ Fixes: #52404
+ Reported-by: Ben Fuchs
+
+2017-11-16 YX Hao <lifenjoiner@163.com>
+
+ Fix printing mutibyte chars as unprintable chars on Windows
+ * src/log.c (get_warc_log_fp): Fix return value to stderr
+ * src/main.c (main): Init logging as soon as possible,
+ fix locale/charset on Windows
+
+2017-11-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-https-weboftrust.px: Fix/add sslport
+
+2017-11-15 YX Hao <lifenjoiner@163.com>
+
+ Convert remote path to local encoding
+ * src/url.c (url_file_name): Convert remote path to local encoding
+
+2017-11-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Do not use must-revalidate in Cache-Control header
+ As the bug report states, 'must-revalidate' is a request directive.
+
+ Fixes #52379
+
+2017-11-06 Darshit Shah <darnir@gnu.org>
+
+ Fix Segfault due to derefencing null ptr
+ * src/http.c(gethttp): When Encoding is gzip, ensure that the
+ Content-Type Header was actually seen. Without this, the "type" variable
+ is null causing a Segfault.
+
+ Reported-By: Noël Köthe <noel@debian.org>
+
+2017-11-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Fix H_REDIRECTED
+
+ * src/http.c: Add support for HTTP status code 308
+
+2017-10-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix uninitialized value messages in tests
+ * tests/Test-https-*.px: Use correct variable in error message
+
+ Reported-by: Jeffrey Walton
+
+2017-10-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Ignore dirmngr.conf, gpg.conf in test directories
+ * testenv/conf/expected_files.py: Ignore dirmngr.conf, gpg.conf
+
+ Libgpgme creates certain files if $HOME doesn't contain the .gnupg directory.
+ These files disturb some metalink tests if we don't ignore them.
+
+ Reported-by: Arkadiusz Miśkiewicz <arekm@maven.pl>
+
+2017-10-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * contrib/release: Cleanup, use lzip instead of xz
+
+2017-10-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix heap overflow in HTTP protocol handling (CVE-2017-13090)
+ * src/retr.c (fd_read_body): Stop processing on negative chunk size
+
+ Reported-by: Antti Levomäki, Christian Jalio, Joonas Pihlaja from Forcepoint
+ Reported-by: Juhani Eronen from Finnish National Cyber Security Centre
+
+2017-10-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix stack overflow in HTTP protocol handling (CVE-2017-13089)
+ * src/http.c (skip_short_body): Return error on negative chunk size
+
+ Reported-by: Antti Levomäki, Christian Jalio, Joonas Pihlaja from Forcepoint
+ Reported-by: Juhani Eronen from Finnish National Cyber Security Centre
+
+2017-10-26 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Update for release 1.19.2
+ * NEWS: Add news for 1.19.2
+ * doc/wget.texi: Fix 1.20 to 1.19.2
+
+2017-10-25 YX Hao <lifenjoiner@163.com>
+
+ Avoid unnecessary UTF-8 encoded fallback (trivial change)
+ * src/retr.c (retrieve_url): Check for changed URL on redirect
+
+2017-09-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add GNU extensions to .netrc parsing
+ src/netrc.c (parse_netrc): Add 'port' and 'force' extensions
+
+ Reported-by: September 20Tim Landscheidt
+
+2017-09-18 Josef Moellers <jmoellers@suse.de>
+
+ Bail out on unexpected 416 server errors
+ * src/http.c (gethttp): Stop on 416 if file is incomplete
+
+2017-08-04 Tim Schlueter <schlueter.tim@linux.com>
+
+ Add gzip Content-Encoding decompression
+ * src/http.c (struct http_stat): Add remote_encoding field.
+ (read_response_body): Enable gzip decompression.
+ (initialize_request): Send gzip Accept-Encoding header.
+ (gethttp): Decompress files with gzip Content-Encoding.
+ * src/retr.c: include zlib.h.
+ (zalloc): New function.
+ (zfree): New function.
+ (fd_read_body): Decompress gzip data.
+ * src/retr.h (fd_read_body enum): Add rb_compressed_gzip flag.
+
+ Add --compression option
+ * doc/wget.texi: Add --compression documentation.
+ * src/init.c (cmd_spec_compression): New function.
+ (commands[]): Add opt.compression.
+ (defaults): Set default opt.compression value.
+ * src/main.c (option_data[]): Add struct for --compression.
+ (print_help, help[]): Add description for --compression.
+ (main): Add incompatibility checks for --compression.
+ * src/options.h (struct options): Add compression enum and field.
+
+ Adjust Extension based on Content-Encoding
+ * doc/wget.texi (--adjust-extension, adjust_extension): Updated documentation.
+ * src/http.c (encoding_t): New enum.
+ (struct http_stat): Add local_encoding field.
+ (gethttp): --adjust-extension based on Content-Encoding.
+
+2017-07-31 Darshit Shah <darnir@gnu.org>
+
+ Document gperf as a requirement
+
+2017-07-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/url.c (url_scheme): Use ASCII version of strncasecmp
+
+2017-07-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix misuse of strncasecmp
+ * src/http.c (set_content_type): Use c_strcasecmp instead of strncasecmp
+
+ See issue bug #51576
+
+2017-07-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix python test suite for GnuTLS 3.5.12+
+ * testenv/Test-*.py: Replace 127.0.0.1 by localhost
+ * testenv/certs/server-template.cfg: Likewise
+ * testenv/certs/server-cert.pem: Regenerate
+ * testenv/certs/server-crl.pem: Likewise
+ * testenv/test/base_test.py: Hardcode 'localhost' as server domain
+
+ Reported-by: Ludovic Courtès <ludo@gnu.org>
+
+2017-06-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Check for 304 response before applying --adjust-extension
+ * src/http.c (gethttp): Move 304 code before --adjust-extension code
+
+ This fixes applying --adjust-extension in combination with 304
+ HTTP responses. It could lead to .html extensions to arbitrary
+ files.
+
+ Reported-by: anfractuosity
+
+2017-06-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix buffer overflow in Public Key Pinning
+ * src/utils.c (wget_base64_decode): Add param for destination size,
+ (wg_pubkey_pem_to_der): Amend call to wget_base64_decode(),
+ (wg_pin_peer_pubkey): Likewise and fix code style.
+ * src/utils.h: Add param to wget_base64_decode()
+ * src/http-ntlm.c (ntlm_input): Amend call to wget_base64_decode()
+ * src/http.c (skip_content_type): Likewise
+
+ Fixes #51227
+
+2017-06-02 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: Mention --no-config
+
+2017-05-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * testenv/Test-recursive-basic.py: Check crawled files
+
+ Fix two Metalink tests if $HOME is changed
+ * conf/expected_files.py (gen_local_fs_snapshot): Skip processing
+ of 'pubring.kbx'
+
+2017-05-15 Tomas Hozza <thozza@redhat.com>
+
+ Add command line option to disable use of .netrc
+ Although internally code uses option for (not) reading .netrc for
+ credentials, it was not possible to turn this behavior off on command
+ line. Note that it was possible to turn it off using wgetrc.
+
+ Idea for this change came from Bruce Jerrick (bmj001@gmail.com).
+ Reference: https://bugzilla.redhat.com/show_bug.cgi?id=1425097
+
+2017-05-15 Tomas Hozza <thozza@redhat.com>
+
+ Fixed getting of credentials from .netrc
+ There seemed to be a copy&paste error in http.c code, which decides
+ whether to get credentials from .netrc. In ftp.c "user" and "pass"
+ variables are char*, while in http.c, these are char**. For this reason
+ they should be dereferenced when determining if password and user login
+ is set to some value.
+
+ Also since both variables are dereferenced on lines above the changed
+ code, it does not really make sense to check if they are NULL.
+
+ This patch is based on fix from Bruce Jerrick <bmj001@gmail.com>.
+ Fedora bug: https://bugzilla.redhat.com/show_bug.cgi?id=1425097
+
+2017-05-15 Tomas Hozza <thozza@redhat.com>
+
+ Added tests for HTTP authentication using credentials from .netrc
+ Getting credentials from .netrc has been broken from time to time, thus
+ adding a test coverage to prevent regressions.
+
+ Also added setting of "HOME" environment variable when executing wget,
+ to make sure LocalFiles like .netrc, which are created just for the
+ test, are actually used.
+
+2017-05-15 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix Test-https-badcerts.px
+ * util/createcerts.sh: Set date of invalid cert to +20 years
+ * tests/certs/invalid.crt: Re-generated
+ * tests/certs/invalid.key: Re-generated
+
+2017-05-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * util/createcerts.sh: Fix double equal (syntax-check)
+
+ Fix Test-https-badcerts.px to work with GnuTLS
+ * tests/Test-https-badcerts.px: Remove OpenSSL requirement
+ * tests/certs/expired.crt: Re-created with valid dates
+ * tests/certs/expired.key: Likewise
+ * tests/certs/invalid.crt: Likewise
+ * tests/certs/invalid.key: Likewise
+
+2017-05-14 Vijo Cherian <codervijo@gmail.com>
+
+ New shell script to create the certs and keys required for TLS tests
+ * util/createcerts.sh: New file
+
+2017-05-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix HTTPS testing for stricter OpenSSL
+ * testenv/certs/README: Amend cert creation extensions
+ * testenv/certs/ca-cert.pem: Created without OCSP signing purpose
+
+ Having the OCSP signing purpose set made newer versions of OpenSSL
+ fail due to stricter checking. Test version of OpenSSL was 1.1.0e.
+
+2017-05-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c (idn_encode): Better IDNA 2003 compatibility
+
+2017-05-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .gitlab-ci.yml: Also test OpenSSL build
+
+ * .gitlab-ci.yml: Remove installation of texlive
+
+2017-05-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add certs/wotca.pem to avoid temp. file creation
+ * tests/certs/wotca.pem: New file
+ * tests/Test-https-weboftrust.px: Remove creation of wotca.pem
+
+ This change let Test-https-weboftrust.px survive VPATH builds.
+
+2017-05-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * cfg.mk: Exclude ^tests/certs/.* from syntax-check
+
+ * po/POTFILES.in: Remove spider.c (syntax-check)
+
+ * tests/Test-https-selfsigned.px: Add newline at EOF (syntax-check)
+
+2017-05-10 Vijo Cherian <codervijo@gmail.com>
+
+ Removed all uses of temp files. Added needed files to GIT
+
+ Made CRL related files in the repo, instead of trying to generate them
+
+2017-05-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Cleanup on exit in Test-https-*.px
+ * tests/Test-https-*.px: Cleanup on exit
+
+ Auto-generate interca.conf and rootca.conf
+ * configure.ac: Add interca.conf.in and rootca.conf.in to AC_CONFIG_FILES
+ * tests/certs/interca.conf: Removed
+ * tests/certs/rootca.conf: Removed
+ * tests/certs/interca.conf.in: New file
+ * tests/certs/rootca.conf.in: New file
+
+ Fix path and VPATH issues of new https/TLS tests
+ * tests/SSLTest.pm: Use $srcdir in read-only files,
+ (_setup_server): Remove unneeded path fixation code
+ * tests/Test-https-*.px: Use $srcdir for read-only files,
+ use $cdir for writable files
+ * tests/certs/interca.conf: Adjust paths
+ * tests/certs/rootca.conf: Adjust paths
+
+ Check for test server name resolution in tests
+ * tests/Test-https-*.px: Skip if test server name resolution fails
+
+ * tests/Makefile.am: Enable Test-https-badcerts again
+
+ Fix WgetFeature.pm to allow multiple required features
+ * tests/WgetFeature.cfg: Remove file
+ * tests/WgetFeature.pm: Extend to multiple features, cleanup
+
+ * .gitlab-ci.yml: Add wgettestingserver to /etc/hosts
+
+ * tests/SSLServer.pm: Check for IO::Socket::SSL
+
+ * tests/Test-https-*: Change server port to <= 32767
+
+ Move https test server ports from >32767 to <= 32767
+ * Test-https-badcerts.px: Change port
+ * Test-https-crl.px: Likewise
+ * Test-https-weboftrust.px: Likewise
+
+ * tests/Makefile.am: Add SSLTest.pm and SSLServer.pm to EXTRA_DIST
+
+ * tests//Makefile.am: Disable Test-https-badcerts.px
+
+ Add Gitlab CI (Debian)
+ * .gitlab-ci.yml: New file
+
+2017-05-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * .travis.yml: Use trusty for libidn2-dev
+
+2017-05-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/certs/test-ca-key.pem: Add newline at EOF
+
+ Add static HOSTSALIAS file
+ * tests/certs/wgethosts: New file
+ * tests/Test-https-*.px: Remove creation of wgethosts file
+
+2017-05-04 Vijo Cherian <codervijo@gmail.com>
+
+ Added new tests for SSL
+ * tests/Test-https-badcerts.px : New file
+ * tests/Test-https-clientcert.px : New file
+ * tests/Test-https-crl.px : New file
+ * tests/Test-https-weboftrust.px : New file
+ * tests/certs/interca.conf : New file
+ * tests/certs/rootca.conf : New file
+ * tests/certs/test-ca-key.pem : New file
+
+ Added all new SSL / HTTPS tests to make check
+ Added Test for SSL Web of Trust, accept only if CA chain of trust is intact.
+ Added a test script for client certificate
+ Added Test for crlfile option of wget
+ Added test to make sure that wget doesn't accept expired or invalid certs
+
+ Some clean up : 1, Removed cause of warnings from perl & other cosmetic changes
+ 2, Fix make -j 4 check such that it passes all tests
+
+2017-05-04 Tomas Hozza <thozza@redhat.com>
+
+ Mention TLSv1_1 and TLSv1_2 as secure-protocol values in help
+ * src/main.c: The --secure-protocol option accepts also values TLSv1_1
+ and TLSv1_2, as mentioned in the man page. However the help message
+ doesn't mention these two values. This patch adds TLSv1_1 and TLSv1_2 as
+ possible values to the help message.
+
+2017-05-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): Support Wayback Machine's X-Archive-Orig-last-modified
+
+2017-04-28 Vijo Cherian <codervijo@gmail.com>
+
+ Added new tests for SSL
+ * tests/Test-https-badcerts.px : New file
+ * tests/Test-https-clientcert.px : New file
+ * tests/Test-https-crl.px : New file
+ * tests/Test-https-weboftrust.px : New file
+ * tests/certs/interca.conf : New file
+ * tests/certs/rootca.conf : New file
+ * tests/certs/test-ca-key.pem : New file
+
+ Added all new SSL / HTTPS tests to make check
+ Added Test for SSL Web of Trust, accept only if CA chain of trust is intact.
+ Added a test script for client certificate
+ Added Test for crlfile option of wget
+ Added test to make sure that wget doesn't accept expired or invalid certs
+
+ Some clean up : Removed cause of warnings from perl & other cosmetic changes
+
+2017-04-19 Vijo Cherian <codervijo@gmail.com>
+
+ Added new tests for SSL
+ * tests/SSLServer.pm: New file
+ * tests/SSLTest.pm: New file
+ * tests/Test-https-pfs.px: New file
+ * tests/Test-https-selfsigned.px: New file
+ * tests/Test-https-tlsv1.px: New file
+ * tests/Test-https-tlsv1x.px: New file
+ * tests/certs/server.crt: New file
+ * tests/certs/server.key: New file
+ * tests/certs/test-ca-cert.pem: New file
+
+ Added 4 new test scripts all for SSL.
+ Added base pm for SSL testing.
+ Added SSL tests for TLSv1, TLSv1_1 and PFS.
+ Added test for self signed cert : check that it fails without
+ --no-check-certificate and passes with that flag.
+
+2017-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c: Remove non-portable __builtin_unreachable()
+
+2017-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Skip iconv() usage if HAVE_ICONV is not defined
+ This helps on broken iconv implementations, e.g. Solaris.
+
+ Reported-by: Mojca Miklavec
+
+2017-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Mention 'bash' for executing ./bootstrap
+ Reported-by: Mojca Miklavec
+
+2017-04-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * bootstrap.conf: Make 'sed' options more portable
+ 'sed -i' works differently on FreeBSD.
+
+ Reported-by: Mojca Miklavec
+
+2017-04-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix charset transcoding issue for non-reversible codepoints
+ * src/url.c: Check iconv() against 0, not -1
+
+ On some libiconv implementations, unknown codepoints become
+ encoded as ?, e.g. when converting a non-ascii codepoint to ASCII.
+ This results in ambigious file names which also fails our tests.
+
+2017-04-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c: Fix WIN32 idn2_free, forgotten code
+
+2017-04-14 Darshit Shah <darnir@gnu.org>
+
+ * src/init.c: Set flstats correctly when using WGETRC env var
+
+2017-04-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix use of idn2_free()
+ * src/connect.c (connect_to_ip): Use xfree() instead of idn2_free()
+ * src/host.c (lookup_host): Use xfree() instead of idn2_free()
+ * src/iri.h: Do not include idn2.h
+ * src/url.c (url_free): Use xfree() instead of idn2_free()
+ * src/url.h (struct url): Remove 'idn_allocated' from struct
+
+ Reported-by: Gisle Vanem
+
+2017-04-05 Anton Yuzhaninov <citrin+github@citrin.ru>
+
+ Fix perl warnings in tests
+ * tests/FTPServer.pm: Escape '{' in RE to fix warnings
+ * tests/FTPTest.pm: Likewise
+ * tests/HTTPServer.pm: Likewise
+ * tests/HTTPTest.pm: Likewise
+ * tests/Test-proxied-https-auth-keepalive.px: Likewise
+ * tests/Test-proxied-https-auth.px: Likewise
+ Escape '{' in RE to fix warnings:
+ Unescaped left brace in regex is deprecated, passed through in regex;
+ marked by <-- HERE in m/{{ <-- HERE port}}/
+
+2017-04-01 klemens <ka7@github.com>
+
+ Fix typos in comments
+
+2017-03-31 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/metalink.c (retrieve_from_metalink): Fix len in memset()
+
+2017-03-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add gnulib module group-member
+
+2017-03-24 Vijo Cherian <codervijo@gmail.com>
+
+ Safeguards against TOCTTOU
+ * src/utils.h: Add struct file_stat_s declaration,
+ change prototypes of file_exists_p(),
+ add prototypes for fopen_stat() and open_stat().
+ * src/utils.c: Extend file_exists_p(),
+ new function fopen_stat() and open_stat(),
+ add new param for file_exists_p().
+ * src/init.h: Add param file_stats_t to run_wgetrc().
+ * src/ftp.c: Amend calls to extended functions.
+ * src/hsts.c: Likewise.
+ * src/http.c: Likewise.
+ * src/init.c: Likewise.
+ * src/main.c: Likewise.
+ * src/metalink.c: Likewise.
+ * src/retr.c: Likewise.
+ * src/url.c: Likewise.
+
+ Added fopen_stat() and open_stat() that checks to makes sure the file didn't
+ change underneath us.
+ Return error from file_exists_p().
+ Added a way to return error from this file without major surgery to the
+ callers.
+
+ Fixes: #20369
+
+2017-03-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Update gnulib
+
+2017-03-22 Christof Horschitz <christof@nimbusec.com>
+
+ * src/warc.c (warc_write_cdx_record): Escape URLs
+
+2017-03-20 Mike Frysinger <vapier@gentoo.org>
+
+ Include libunistring headers only when used
+ * src/iri.c: Check for libidn2 < 0.14 to include libunistring headers
+
+ The unistring functions are used only when an older version of libidn2
+ is used, so don't include its headers either w/newer libdin2 versions.
+
+2017-03-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix links to www.robotstxt.org
+ * NEWS: Fix links
+ * doc/wget.texi: Likewise
+ * src/res.c: Likewise
+
+ Reported-by: Noël Köthe
+
+2017-03-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/WgetTests.pm: Add -d to Wget test options
+
+2017-03-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Include <arpa/inet.h> for Windows
+ Reported-by: Gisle Vanem
+
+2017-03-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix updating HSTS entries
+ * src/hsts.c (hsts_store_entry): Always update 'created' field
+
+ Fixes: #50490
+ Reported-by: Deian Stefan, Atyansh Jaiswal, Jonathan Luck
+
+2017-03-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix CRLF injection in Wget host part
+ * src/url.c (url_parse): Reject control characters in host part of URL
+
+ Reported-by: Orange Tsai
+
+2017-03-04 Benjamin Esham <benjamin@esham.io>
+
+ * src/warc.c: Use warc_write_header_uri for all WARC-Target-URI fields
+ The WARC spec requires that all URIs be enclosed in angle brackets. This
+ was being done in most cases, but not for "WARC-Target-URI" fields in
+ WARC blocks of type "response", "resource", "revisit", and "metadata".
+
+2017-02-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix 504 status handling
+ * src/http.c (gethttp): Move 504 handling to correct place.
+ (http_loop): Fix memeory leak.
+ * testenv/server/http/http_server.py: Add Content-Length header on non-2xx
+ status codes with a body
+
+ Reported-by: Adam Sampson
+
+2017-02-16 YX Hao <lifenjoiner@163.com>
+
+ * src/url.c (url_file_name): Do not charset convert local directory
+ In a non-ASCII environment, the local path may contain non-ASCII
+ characters. The server responded file name must be converted before
+ it is concatenated to the local path. Conversion after concatenation
+ may result in 'iconv' errors.
+
+2017-02-15 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Remove manually resetting of LIBICONV variable
+ Fixes: #48193
+ Reported-by: ilovezfs
+ Reported-by: Charles
+
+ * bootstrap.conf: Call gperf to create lib/unicase/special-casing-table.h
+
+ * bootstrap.conf: Fix latest gnulib to work with gperf < 3.1
+
+2017-02-14 Darshit Shah <darnir@gnu.org>
+
+ Pull GNULib to latest.
+ * gnulib: Pull to latest commit. This fixes an issue with Gperf 3.1
+
+2017-02-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Remove double 'verbose' option
+ Fixes: #50290
+
+2017-02-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * NEWS: update
+
+ isrc/http.c (check_retry_on_http_error): Fix gcc warning
+
+2017-02-11 Tom Szilagyi <tomszilagyi@gmail.com>
+
+ Add support for --retry-on-http-error
+ * doc/wget.text: Add documentation
+ * src/http.c: Add function check_retry_on_http_error ()
+ * src/init.c: Add opt.retry_on_http_error
+ * src/main.c: Add struct for retry-on-http-error to option_data[]
+ * src/options.h: Add retry_on_http_error to struct options
+
+2017-02-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Revert "Add support for --retry-on-http-error"
+ This reverts commit 977276374d1be7f171f5da8633368025c88b9eee.
+
+2017-02-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Change libtool library deps to non-libtool deps
+ Reported-by: Yousong Zhou
+ Fixes: #50260
+
+2017-02-09 Tom Szilagyi <tomszilagyi@gmail.com>
+
+ Add support for --retry-on-http-error
+ * doc/wget.texi: Add description for --retry-on-http-error
+ * src/http.c (gethttp):
+ Consider given HTTP response codes as non-fatal, transient errors.
+ Supply a comma-separated list of 3-digit HTTP response codes as
+ argument. Useful to work around special circumstances where retries
+ are required, but the server responds with an error code normally not
+ retried by Wget. Such errors might be 503 (Service Unavailable) and
+ 429 (Too Many Requests). Retries enabled by this option are performed
+ subject to the normal retry timing and retry count limitations of
+ Wget.
+
+ Using this option is intended to support special use cases only and is
+ generally not recommended, as it can force retries even in cases where
+ the server is actually trying to decrease its load. Please use it
+ wisely and only if you know what you are doing.
+
+ Example use and a starting point for manual testing:
+ wget --retry-on-http-error=429,503 http://httpbin.org/status/503
+
+2017-02-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/WgetTests.pm: Add --no-config to wget invocation
+ Without --no-config, wgetrc commands may disturb the tests.
+
+ Reported-by: Dagobert Michelsen
+
+2017-02-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/WgetTests.pm (_verify_download): Fix failure message
+ Reported-by: Zhiming Wang
+
+ * src/http.c (initialize_request): Fix regression in .netrc auth
+ Reported-by: Axel Reinhold
+
+ * src/iri.c (idn_encode): Fix memory leak
+
+2017-02-06 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove skipping libunistring with --disable-iri
+ * configure.ac: Remove checking for IRI=no
+
+ On certain systems, gnulib falls back to libunistring
+ for mbtowc() and wcwidth() (used in src/progress.c).
+
+ Reported-by: Zhiming Wang
+
+2017-02-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * bootstrap.conf: Add gnulib module wcwidth
+
+ Fix include/define clash with gnulib's unlink module
+ * src/options.h: Rename options.unlink to options.unlink_requested
+ * src/init.c: Replace options unlink member by unlink_requested
+ * src/http.c: Likewise
+ * src/ftp.c: Likewise
+
+ * bootstrap.conf: Specify unicode modules more exact
+
+ * src/xattr.h: Fix #define fsetxattr for MacOS and FreeBSD
+ Reported-by: Zhiming Wang
+
+2017-02-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * contrib/release: New release helper script
+
+ * cfg.mk: Fix syntax-check
+
+ * doc/announcement_1.19.txt: Add new file
+
+ * src/utils.c: Move macro FMT_MAX_LENGTH into scope
+
+ * src/utils.c: Fix -Wformat= warnings
+
+ * src/gnutls.c: Fix -Wformat= warnings
+
+ * src/iri.c: Remove unused macro IDNA_FLAGS
+
+ * src/iri.c: Remove use of __func__ macros
+
+ * src/http.c: Fix -Wformat= warnings
+
+ * src/progress.c: Remove unused macro move_to_end
+
+ * src/html-parse.c: Remove unused macro SKIP_NON_WS
+
+ * src/hsts.c: Remove unused macro CHECK_EXPLICIT_PORT
+
+ * src/hsts.c: Fix -Wformat= warnings
+
+ * src/hash.c: Explicitly convert float to int
+
+ * src/ftp-ls.c: Fix -Wformat= warnings
+
+ * src/ftp.c (ftp_retrieve_list): Add default to switch
+
+ * src/css-url.h: Remove redundant declaration
+
+ * src/ftp.c: Fix -Wformat= warning
+
+ * src/http.c (test_parse_range_header): Fix constants
+
+2017-02-02 Dale R. Worley <worley@ariadne.com>
+
+ Improve documentation of --trust-server-names.
+
+2017-02-02 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/url.c (mkalldirs): Add newline to log message
+
+ * src/cookies.c (check_domain_match): Add newline to DEBUG lines
+
+2017-01-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * NEWS: update
+
+ * README.checkout: Link HTTPS where possible, update flex homepage
+
+ * README.checkout: Fix libidn to libidn2
+
+2017-01-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c: Use TR46 non-transitional for toASCII conversion
+
+ * src/main.c: Fix _Noreturn compiler warnings
+
+ * src/utils.c: Fix _Noreturn compiler warning
+
+ * src/init.c (setval_internal): Fix sign compare warning
+
+2017-01-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Replace home-grown portability code by gnulib modules
+ * bootstrap.conf: Add intprops, inttypes, limits-h, signal-h,
+ stat, sys_types
+ * src/ftp.c: Replace 'struct_stat' by 'struct stat'
+ * src/hsts.c: Likewise
+ * src/http.c: Likewise
+ * src/main.c: Likewise
+ * src/netrc.c: Likewise
+ * src/retr.c: Likewise
+ * src/url.c: Likewise
+ * src/utils.c: Likewise
+ * src/sysdep.h: Remove old portability code
+
+ Further portability issues should be addressed by gnulib.
+
+2017-01-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Replace WGET_* m4 macros by gnulib modules
+ * bootstrap.conf: Add hostent, inet_ntop, nanosleep, utimens
+ * configure.ac: Remove WGET_STRUCT_UTIMBUF, WGET_FNMATCH,
+ WGET_NANOSLEEP, WGET_POSIX_CLOCK, WGET_NSL_SOCKET
+ * m4/wget.m4: Likewise
+ * src/Makefile.am: Add $(LIB_NANOSLEEP) $(LIB_POSIX_SPAWN) to LDADD
+ * tests/Makefile.am: Likewise
+ * src/host.c (print_address): Use inet_ntop also for IPV4
+
+2017-01-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove libidn vulnerability work-around
+ * src/iri.c (_utf8_is_valid): Removed
+
+ Since we are using libidn2 for IDNs, we no longer need
+ this work-around.
+
+2017-01-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c (idn_encode): Use TR46 transitional if available
+
+ * gnulibx: Update
+
+2017-01-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix previous commit 2427ca4ac090dc6cc0c527f4ac4fc5a4bd468eb1
+
+2017-01-06 vijeth-aradhya <vijthaaa@gmail.com>
+
+ Fix http.c and ftp.c passwd logic error
+ * src/ftp.c (getftp): Fix password/user selection
+ * src/http.c (initialize_request): Likewise
+
+ Before, netrc password won over interactive
+ --ask-password but now --ask-password wins
+ after change of program logic
+
+ Fixes Issue #48811
+
+2016-12-31 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/main.c (main): Add missing \n in error message
+
+2016-12-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Check that fd_set has not fds bigger than FD_SETSIZE
+ * src/connect.c: check that the fd is not bigger than FD_SETSIZE
+ before using FD_SET. An fd_set cannot hold fds bigger than
+ FD_SETSIZE, causing out-of-bounds write to a buffer on the stack.
+
+ Reported by: Jann Horn <jannh@google.com>
+
+2016-12-20 Nikos Mavrogiannopoulos <nmav@gnutls.org>
+
+ Avoid calling the gnutls priority functions multiple times
+ * src/gnutls.c (ssl_connect_wget): Call gnutls_set_default_priority()
+ for --secure-protocol=auto (default).
+
+ The patch fixes a behavior that may have unintended side-effects in
+ certain gnutls versions. Instead use the default priorities when no
+ options are given.
+
+2016-12-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Print debug message when skipping certain recursive downloads
+ * src/recur.c (retrieve_tree): Print debug message instead silently
+ skipping recursive downloads.
+
+2016-12-14 Rahul Bedarkar <rahul.bedarkar@imgtec.com>
+
+ Rename base64_{encode,decode} (trivial patch)
+ * src/http-ntlm.c: Rename base64_{encode,decode}
+ * src/http.c: Likewise
+ * src/utils.c: Likewise
+ * src/utils.h: Likewise
+
+ When statically linking with gnutls, we get definition clash error for
+ base64_encode which is also defined by gnutls.
+
+ To prevent definition clash, rename base64_{encode,decode}
+
+2016-12-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add support for psl_latest()
+ * configure.ac: Add check for psl_latest(),
+ remove --with-psl-file
+ * src/cookies.c (check_domain_match): Use psl_latest() if available
+
+2016-11-09 Piotr Wajda <pwajda@gmail.net.pl>
+
+ Respect -o parameter again
+ * log.c: don't choose log output dynamically when opt.lfilename is set
+
+ Regression introduced by dd5c549f6af8e1143e1a6ef66725eea4bcd9ad50
+ Reported-by: Dale R. Worley
+
+2016-11-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Move Wget from IDN2003 (libidn) to IDN2008 (libidn2)
+ * .travis.yml: Install libidn2-dev instead libidn11-dev.
+ * bootstrap.conf: Add modules libunistring-optional, unistr/base,
+ unicase/tolower.
+ * configure.ac: Check for libidn2.
+ * src/Makefile.am: Add $(LTLIBUNISTRING) to LDADD.
+ * tests/Makefile.am: Set LDADD similar to LDADD in src/Makefile.am
+ * src/connect.c: Use libidn2 code instead of libidn.
+ * src/host.c: Likewise.
+ * src/iri.c: Likewise.
+ * src/iri.h: Likewise.
+ * src/options.h: Likewise.
+ * src/url.c: Likewise.
+ * src/url.h: Likewise.
+ * src/log.c: Fix C99 comment.
+
+ IDN2003 should not be used any more due to security concerns.
+ We use libunistring (resp. the unicode code from gnulib) for
+ lowercasing UTF-8 before we give data to libidn2.
+ TR#46 is missing, no support in libidn2 nor in libunistring.
+
+2016-11-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Use -O0 in contrib scripts
+ * contrib/check-hard: Use -O0 instead of -O2 to speed up script.
+ * contrib/travis-ci: Likewise.
+
+ Update gnulib
+
+2016-10-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/metalink.c: Fix typo 'suceeded' -> 'succeeded'
+ Reported-by: Göran Uddeborg <goeran@uddeborg.se>,
+ Anders Jonsson <anders.jonsson@norsjovallen.se>
+
+2016-10-21 losgrandes <pwajda@gmail.net.pl>
+
+ Fixes #45790: wget prints it's progress even when background
+ * src/log.c: Use tcgetpgrp(STDIN_FILENO) != getpgrp() to determine when to print to STD* or logfile.
+ Deprecate log_request_redirect_output function.
+ Use different file handles for STD* and logfile, to easily switch between them when changing fg/bg.
+ * src/log.h: Make redirect_output function externally linked.
+ * src/main.c: Don't use deprecated log_request_redirect_output function. Use redirect_output instead.
+ * src/mswindows.c: Don't use deprecated log_request_redirect_output function. Use redirect_output instead.
+
+ Fixes #46584: wget --spider always returns zero exit status
+ * src/ftp.c: Return error as exit value if even one file doesn't exist
+
+2016-10-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): Accept 206 for request w/o Range header
+ Fixes: #49319
+
+2016-10-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * tests/Makefile.am: Let WGETRC work on *nix and Windows
+
+ Properly include iconv.h
+ * src/iri.c: Check HAVE_ICONV to include iconv.h
+ * src/url.c: Same
+
+ * bootstrap.conf: Add pipe-posix for pipe()
+
+2016-10-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Amend redirection behavior
+ * src/recur.c (descend_redirect): Ignore WG_RR_LIST and WG_RR_REGEX
+ for redirections.
+ * testenv/Makefile.am: Add Test-recursive-redirect.py
+ * testenv/Test-recursive-redirect.py: New test
+
+ Test-recursive-redirect.py written by Dale R. Worley.
+
+ Reported-by: "Dale R. Worley" <worley@ariadne.com>
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New: Metalink/XML v3 python class, update tests to use this class
+ * testenv/misc/metalinkv3_xml.py: New Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-abspath-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-abspath.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-absprefix-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-absprefix.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-continue.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-emptyprefix-trust.py: Update test to use
+ the new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-homepath-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-homepath.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-homeprefix-trust.py: Update test to use
+ the new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-homeprefix.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-nohash.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-nourls.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-prefix-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-prefix.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-relpath-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-relpath.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-relprefix-trust.py: Update test to use the
+ new Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-relprefix.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-size.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml-trust.py: Update test to use the new
+ Metalink/XML v3 python class
+ * testenv/Test-metalink-xml.py: Update test to use the new
+ Metalink/XML v3 python class
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New: --metalink-over-http Content-Type/Disposition Metalink/XML processing
+ * src/http.c (metalink_from_http): Process the Content-Type header.
+ Add an application/metalink4+xml URL as metalink metaurl. If the
+ option opt.content_disposition is true, the Content-Disposition's
+ filename is the metaurl's name
+ * doc/wget.texi: Update --content-disposition and --metalink-over-http
+ * doc/metalink-standard.txt: Update doc. Content-Type/Disposition
+ processing through --metalink-over-http. Update download naming
+ system about --trust-server-names and --content-disposition
+ * testenv/Makefile.am: Add new files
+ * testenv/Test-metalink-http-xml-type.py: New file. Metalink/HTTP
+ Content-Type/Disposition header automated Metalink/XML tests
+ * testenv/Test-metalink-http-xml-type-trust.py: New file. Metalink/HTTP
+ Content-Type/Disposition header with --trust-server-names automated
+ Metalink/XML tests
+ * testenv/Test-metalink-http-xml-type-content.py: New file. Metalink/HTTP
+ Content-Type/Disposition header with --content-disposition automated
+ Metalink/XML tests
+ * testenv/Test-metalink-http-xml-type-trust-content.py: New file.
+ Metalink/HTTP Content-Type/Disposition header with --trust-server-names
+ and --content-disposition automated Metalink/XML tests
+
+ Process the Content-Type header, identify an application/metalink4+xml
+ file. The Content-Disposition could provide an alternate name through
+ the "filename" field for the metalink xml file. Respectively, the cli
+ options --metalink-over-http and --content-disposition are required.
+
+ When Metalink/XML auto-processing, to use the Content-Disposition's
+ filename, the cli option --trust-server-names is also required.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Set NULL variable due to --content-disposition to Metalink origin
+ * src/http.c (http_loop): Prevent SIGSEGV when hstat.local_file is
+ NULL, opt.content_disposition has a role in leaving the value unset
+ * src/http.c (gethttp): If hs->local_file is NULL (aka http_loop()'s
+ hstat.local_file), set it to the value of hs->metalink->origin
+
+ New: --trust-server-names saves Metalink/HTTP xml files using the "name" field
+ * src/metalink.c (retrieve_from_metalink): If opt.trustservernames is
+ true, use the basename of the metaurl's name to save the xml file
+ * doc/metalink-standard.txt: Update doc. With --trust-server-names any
+ Metalink/HTTP Link application/metalink4+xml file is saved using the
+ basename of the "name" field, if any. Update Metalink/HTTP examples
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-http-xml-trust-name.py: New file. Metalink/HTTP
+ automated Metalink/XML, save xml files using the "name" field tests
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Detect when a metalink:file doesn't have any hash
+ * src/metalink.c (retrieve_from_metalink): Reject any metalink:file
+ without hashes. Prompt the error and switch to the next file
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-nohash.py: New file. Metalink/XML with no
+ hashes tests
+
+ Prevent SIGSEGV.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Detect malformed base64 Metalink/HTTP Digest header
+ * src/http.c (metalink_from_http): Fix hash_bin_len type. Use ssize_t
+ instead than size_t. Reject -1 as base64_decode() return value
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-http-baddigest.py: New file. Metalink/HTTP
+ malformed base64 Digest header tests
+
+ On malformed base64 input, ssize_t base64_decode() returns -1. Such
+ value is too big for a size_t variable, and used as xmalloc() value
+ will exaust all the memory.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New option --metalink-index to process Metalink application/metalink4+xml
+ * NEWS: Mention the effect of --metalink-index over Metalink
+ * src/init.c: Add new option metalinkindex (opt.metalink_index),
+ initialize to -1
+ * src/main.c: Add new option metalink-index (--metalink-index=NUMBER)
+ * src/options.h: Add new option metalink_index (int)
+ * src/metalink.h: Add declaration of functions fetch_metalink_file(),
+ replace_metalink_basename()
+ * src/metalink.c: Add functions fetch_metalink_file() simple file
+ fetch, replace_metalink_basename() replace file basename
+ * src/metalink.c (retrieve_from_metalink): New. Process Metalink
+ application/metalink4+xml of opt.metalink_index ordinal number
+ * doc/wget.texi: Add new option metalink-index (--metalink-index)
+ documentation
+ * doc/metalink-standard.txt: Updated doc. Add documentation about
+ Metalink application/metalink4+xml metaurls download naming system
+ * doc/metalink-standard.txt: Update Metalink/XML and HTTP examples
+ * testenv/Makefile.am: Add new files
+ * testenv/Test-metalink-http-xml.py: New file. Metalink/HTTP automated
+ Metalink/XML "application/metalink4+xml" --metalink-index tests
+ * testenv/Test-metalink-http-xml-trust.py: New file. Metalink/HTTP
+ automated Metalink/XML "application/metalink4+xml" --metalink-index
+ retrieval with --trust-server-names tests
+
+ WARNING: Do not use lib/dirname.c (dir_name) to get the directory
+ name, it may append a dot '.' character to the directory name.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Prevent sorting when there are less than two elements
+ * src/utils.c (stable_sort): Add condition nmemb > 1, sort only when
+ there is more than one element
+
+ Prevent SIGSEGV.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New: Parse Metalink/HTTP header for application/metalink4+xml
+ * src/http.c (metalink_from_http): Parse Metalink/HTTP header for
+ metaurls application/metalink4+xml media types
+ * src/metalink.h: Add function declaration metalink_meta_cmp()
+ * src/metalink.c: Add function metalink_meta_cmp() compare metalink
+ metaurls priorities
+
+ Add Metalink/HTTP application/metalink4+xml media types as metaurls to
+ the metalink variable that will be used to download the files.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New test: Metalink shall not concatenate '/' to an empty directory prefix
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-emptyprefix-trust.py: New file.
+ Metalink/XML empty directory prefix (--directory-prefix '') tests
+
+ Detect a '/' character wrongfully concatenated to an empty directory
+ prefix '' (not NULL), resulting in an absolute path as '/dir/file',
+ instead than 'dir/file'.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Remove surrounding quotes from Metalink/HTTP key's value
+ * src/metalink.h: Add declaration of function dequote_metalink_string()
+ * src/metalink.c: Add function dequote_metalink_string() remove
+ surrounding quotes from string, \' or \"
+ * src/metalink.c (find_key_value, find_key_values): Call dequote_metalink_string()
+ to remove the surrounding quotes from the parsed value
+ * src/metalink.c (test_find_key_value, test_find_key_values): Add
+ quoted key's values for unit-tests
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-http-quoted.py: New file. Metalink/HTTP quoted
+ values tests
+
+ Some Metalink/HTTP keys, like "type" [2], may have a quoted value [1]:
+ Link: <http://example.com/example.ext.meta4>; rel=describedby;
+ type="application/metalink4+xml"
+
+ Wget was expecting a dequoted value from the Metalink module. This
+ patch addresses this problem.
+
+ References:
+ [1] Metalink/HTTP: Mirrors and Hashes
+ 1.1. Example Metalink Server Response
+ https://tools.ietf.org/html/rfc6249#section-1.1
+
+ [2] Additional Link Relations
+ 6. "type"
+ https://tools.ietf.org/html/rfc6903#section-6
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Process Metalink/XML url strings containing white spaces and CRLF
+ * src/metalink.h: Add declaration of function clean_metalink_string()
+ * src/metalink.c: Add directive #include "xmemdup0.h"
+ * src/metalink.c: Add function clean_metalink_string() remove leading
+ and trailing white spaces and CRLF from string
+ * src/metalink.c (retrieve_from_metalink): Remove leading and trailing
+ white spaces and CRLF from url resource mres->url
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-urlbreak.py: New test. Metalink/XML white
+ spaces and CRLF in url resources tests
+
+ White spaces and CRLF are not automatically removed by libmetalink
+ from url strings. The Wget's Metalink module was unable to process
+ such url strings. This patch implements the processing of such url
+ strings cleaning off leading and trailing white spaces and CRLF.
+
+ If a parsed Metalink/XML url string contains strings separated by
+ CRLF, only the first of the series is accepted.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New test: Detect when there are no good Metalink url resources
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-nourls.py: New file. Metalink/XML unknown
+ urls tests
+
+ Test if when there are no good Metalink url resources there is any
+ segmentation fault.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New: Metalink file size mismatch returns error code METALINK_SIZE_ERROR
+ * src/wget.h (uerr_t): Add error code METALINK_SIZE_ERROR to enum
+ * src/metalink.c (retrieve_from_metalink): Use boolean variable
+ size_ok, when false set retr_err to METALINK_SIZE_ERROR
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-size.py: New file. Metalink/XML file size
+ tests (<size></size>)
+
+ Before this patch, no appropriate error code was returned to inform a
+ file size mismatch.
+
+ This patch introduces the error code METALINK_SIZE_ERROR to inform a
+ file size mismatch.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New: Metalink/XML and Metalink/HTTP file naming safety rules
+ * NEWS: Mention the effect of --trust-server-names over Metalink
+ * src/metalink.h: Add declaration of function append_suffix_number()
+ * src/metalink.c: Add function append_suffix_number() append number to
+ string
+ * src/metalink.c (retrieve_from_metalink): Safer Metalink/XML and
+ Metalink/HTTP download naming system, opt.trustservernames based
+ * doc/metalink-standard.txt: Update doc. Explain new Metalink/XML and
+ Metalin/HTTP download naming system and --trust-server-names role
+ * testenv/Makefile.am: Add new files
+ * testenv/Test-metalink-xml-continue.py: Update test. Metalink/XML
+ continue/keep existing files (HTTP 416) with --continue tests
+ * testenv/Test-metalink-xml.py: Update test. Metalink/XML naming tests
+ * testenv/Test-metalink-xml-trust.py: New file. Metalink/XML naming
+ tests with --trust-server-names
+ * testenv/Test-metalink-xml-abspath.py: Update test. Metalink/XML
+ absolute path tests
+ * testenv/Test-metalink-xml-abspath-trust.py: New file. Metalink/XML
+ absolute path tests with --trust-server-names
+ * testenv/Test-metalink-xml-relpath.py: Update test. Metalink/XML
+ relative path tests
+ * testenv/Test-metalink-xml-relpath-trust.py: New file. Metalink/XML
+ relative path tests with --trust-server-names
+ * testenv/Test-metalink-xml-homepath.py: Update test. Metalink/XML
+ home path and ~ (tilde) tests
+ * testenv/Test-metalink-xml-homepath-trust.py: New file. Metalink/XML
+ home path and ~ (tilde) tests with --trust-server-names
+ * testenv/Test-metalink-xml-prefix.py: New file. Metalink/XML naming
+ tests with --directory-prefix
+ * testenv/Test-metalink-xml-prefix-trust.py: New file. Metalink/XML
+ naming tests with --directory-prefix and --trust-server-names
+ * testenv/Test-metalink-xml-absprefix.py: New file. Metalink/XML
+ absolute --directory-prefix tests
+ * testenv/Test-metalink-xml-absprefix-trust.py: New file. Metalink/XML
+ absolute --directory-prefix tests with --trust-server-names
+ * testenv/Test-metalink-xml-relprefix.py: New file. Metalink/XML
+ relative --directory-prefix tests
+ * testenv/Test-metalink-xml-relprefix-trust.py: New file. Metalink/XML
+ relative --directory-prefix tests with --trust-server-names
+ * testenv/Test-metalink-xml-homeprefix.py: New file. Metalink/XML home
+ --directory-prefix tests
+ * testenv/Test-metalink-xml-homeprefix-trust.py: New file. Metalink/XML
+ home --directory-prefix tests with --trust-server-names
+
+ The option --trust-server-names allows to use the file names parsed
+ from a Metalink/XML file. Without --trust-server-names, the safety
+ mechanism provides secure and predictable file names.
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ New document: Metalink/XML and Metalink/HTTP standard reference
+ * doc/metalink-standard.txt: New doc. Implemented and recommended
+ Metalink/XML and Metalink/HTTP standard features
+
+2016-09-30 Matthew White <mehw.is.me@inventati.org>
+
+ Enforce Metalink file name verification, strip directory if necessary
+ * NEWS: Mention the use of a safe Metalink destination path
+ * src/metalink.h: Add declaration of functions get_metalink_basename(),
+ last_component(), metalink_check_safe_path()
+ * src/metalink.c: Add directive #include "dosname.h"
+ * src/metalink.c: Add function get_metalink_basename() to return the
+ basename of a file name, strip w32's drive letter prefixes
+ * src/metalink.c (retrieve_from_metalink): Enforce Metalink file name
+ verification, if the file name is unsafe try its basename
+ * doc/metalink.txt: Update document. Explain --directory-prefix
+
+ The function get_metalink_basename() uses FILE_SYSTEM_PREFIX_LEN to
+ catch any 'C:D:file' (w32 environment), then it removes each drive
+ letter prefix, i.e. 'C:' and 'D:'.
+
+ Unsafe file names contain an absolute, relative, or home path. Safe
+ paths can be verified by libmetalink's metalink_check_safe_path().
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Implement Metalink/XML --directory-prefix option in Metalink module
+ * NEWS: Mention the effect of --directory-prefix over Metalink
+ * src/metalink.c (retrieve_from_metalink): Add opt.dir_prefix as
+ prefix to the metalink:file name mfile->name
+ * doc/metalink.txt: Update document. Explain --directory-prefix
+
+ When --directory-prefix=<prefix> is used, set the top of the retrieval
+ tree to prefix. The default is . (the current directory). Metalink/XML
+ and Metalink/HTTP files will be downloaded under prefix.
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Change mfile->name to filename in Metalink module's messages
+ * src/metalink.c (retrieve_from_metalink): Change mfile->name to
+ filename when referring to the downloaded file
+
+ The file name could have been changed by unique_create() (or by any
+ other mean) before downloading. Use the name of the downloaded file
+ (filename) when printing output which refer to it.
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Add file size computation in Metalink module
+ * NEWS: Mention Metalink's file size verification
+ * src/metalink.c (retrieve_from_metalink): Add file size computation
+ * doc/metalink.txt: Update document. Remove resolved bugs
+
+ Reject downloaded files when they do not agree with their Metalink/XML
+ metalink:size: https://tools.ietf.org/html/rfc5854#section-4.2.14
+
+ At the moment of writing, Metalink/HTTP headers do not provide a file
+ size field. This information could be obtained from the Content-Length
+ header field: https://tools.ietf.org/html/rfc6249#section-7
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Update Metalink/XML tests and add a new test for home paths
+ * testenv/Test-metalink-xml-relpath.py: Update test
+ * testenv/Test-metalink-xml-homepath.py: New file. Reject home paths
+ * testenv/Makefile.am: Add new file
+
+ When --input-metalink=<file> is used, each metalink:file name is
+ verified by libmetalink's metalink_check_safe_path(). By design,
+ absolute, relative and home paths are rejected.
+
+ At the moment of writing, when --metalink-over-http is used, absolute,
+ relative, and home paths aren't a concern. The destination file name
+ is a combination of URL's file name and cli's "Directory Options"
+ handled by src/url.c (url_file_name).
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Keep the download progress when alternating metalink:url
+ * NEWS: Mention the effects of --continue over Metalink
+ * src/metalink.c (retrieve_from_metalink): On download error, resume
+ output_stream with the next mres->url. Keep fully downloaded files
+ started with --continue, otherwise rename/remove the file
+ * testenv/Makefile.am: Add new file
+ * testenv/Test-metalink-xml-continue.py: New file. Metalink/XML
+ continue/keep existing files (HTTP 416) with --continue tests
+
+ Before this patch, with --continue, existing and/or fully retrieved
+ files which fail the sanity tests were renamed (--keep-badhash), or
+ removed.
+
+ This patch ensures that --continue doesn't rename/remove existing
+ and/or fully retrieved files (HTTP 416) which fail the sanity tests.
+
+2016-09-27 Matthew White <mehw.is.me@inventati.org>
+
+ Bugfix: Fix NULL filename and output_stream in Metalink module
+ * NEWS: Mention the Metalink "path/file" name format handling
+ * src/metalink.c (retrieve_from_metalink): Fix NULL filename, set
+ filename to the right "path/file" value
+ * src/metalink.c (retrieve_from_metalink): Fix NULL output_stream, set
+ output_stream to filename when it is created by retrieve_url()
+ * src/metalink.c (retrieve_from_metalink): Add RFC5854 comments about
+ proper metalink:file "path/file" name format handling
+ * doc/metalink.txt: Update document. Remove resolved bugs
+
+ If unique_create() cannot create/open the destination file, filename
+ and output_stream remain NULL. If fopen() is used instead, filename
+ always remains NULL. Both functions cannot create "path/file" trees.
+
+ Setting filename to the right value is sufficient to prevent SIGSEGV
+ generating from testing a NULL value. This also allows retrieve_url()
+ to create a "path/file" tree through opt.output_document.
+
+ Reading NULL as output_stream, when it shall not be, leads to wrong
+ results. For instance, a non-NULL output_stream tells when a stream
+ was interrupted, reading NULL instead means to assume the contrary.
+
+ This patch conforms to the RFC5854 specification:
+ The Metalink Download Description Format
+ 4.1.2.1. The "name" Attribute
+ https://tools.ietf.org/html/rfc5854#section-4.1.2.1
+
+2016-09-19 Matthew White <mehw.is.me@inventati.org>
+
+ Add metalink description
+ * doc/metalink.txt
+
+ Evaluation of "Directory Options" on the command line interacting with
+ the option '--input-metalink=file':
+
+ $ wget --input-metalink=file <directory options>
+
+2016-09-19 Matthew White <mehw.is.me@inventati.org>
+
+ Use python .replace instead than re.sub in Metalink tests
+ * testenv/Test-metalink-http.py: Use python .replace
+ * testenv/Test-metalink-xml.py: Use python .replace
+ * testenv/Test-metalink-xml-abspath.py: Use python .replace
+ * testenv/Test-metalink-xml-relpath.py: Use python .replace
+
+ Use python .replace instead than re.sub, remove 'import re'.
+
+2016-09-19 Matthew White <mehw.is.me@inventati.org>
+
+ Fix: Change Metalink/XML v3 file name into test.metalink
+ * testenv/Test-metalink-xml-abspath.py: Change Metalink/XML v3 file
+ name from test.meta4 into test.metalink
+ * testenv/Test-metalink-xml-relpath.py: Change Metalink/XML v3 file
+ name from test.meta4 into test.metalink
+ * testenv/Test-metalink-xml.py: Change Metalink/XML v3 file name from
+ test.meta4 into test.metalink
+
+2016-09-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add two Metalink/XML tests
+ * testenv/Test-metalink-xml-abspath.py: Reject absolute paths
+ * testenv/Test-metalink-xml-relpath.py: Reject relative paths
+ * testenv/Makefile.am: Add both new files to metalink tests
+
+2016-09-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix crash on 'srcset' inline URIs
+ * src/html-url.c (tag_handle_img): Check append_url() for NULL
+ return value before dereference.
+
+ Crashed reproducable with parsing srcset="data:..." inline data.
+ Reported-by: Coverity
+
+2016-09-09 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/hsts.c (hsts_store_open): NULL check param for fclose().
+ Reported-by: Coverity
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Fix memset params
+
+ * src/utils.c (stable_sort): Use xmalloc instead of malloc
+
+2016-09-08 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Initialize struct fileinfo cur
+ Reported-by: Coverity
+
+ Add const to url param of some functions
+ * src/http.c: Add const to first param of initialize_request(),
+ initialize_proxy_configuration(), establish_connection(),
+ check_file_output(), check_auth(), gethttp(), http_loop().
+ * src/http.h: Add const to first param of http_loop().
+
+ * Makefile.am: Remove trailing empty line
+
+ * src/recur.c (retrieve_tree): Fix possible NULL dereference
+ Reported-by: Coverity
+
+ * src/http.c (initialize_request): Fix check for user
+ Reported-by: Coverity
+
+ * src/retr.c (retrieve_url): NULL check mynewloc
+ Reported-by: Coverity
+
+ * src/utils.c (stable_sort): Reduce tmp allocation size
+ Reported-by: Coverity
+
+ * Makefile.am: Add target 'check-valgrind'
+
+ Fix some issues detected by Coverity
+ * src/connect.c (connect_to_ip): Check return value of setsockopt.
+ * src/ftp.c (ftp_retrieve_list): Check return value of chmod.
+ * src/http.c (digest_authentication_encode): Cleanup code.
+ * src/init.c (setval_internal): Explicitely check comind range.
+ * src/main.c (main): Explicitely check optarg.
+ * src/retr.c (retr_rate): Use snprintf instead sprintf,
+ (retrieve_from_file): More verbose error message,
+ (rotate_backups): Use snprintf instead sprintf, check return
+ value of rename().
+ * src/url.c (mkalldirs): Check return value of unlink().
+ * src/utils.c (strdupdelim): Explicitely check beg and end for NULL,
+ (merge_vecs): Fix sizeof argument to char *,
+ (stable_sort): Use malloc instead of alloca.
+
+ Code cleanup for --use-askpass
+ * bootstrap.conf: Add xmemdup0 and strpbrk.
+ * src/init.c (cmd_use_askpass): Add 'const' to char *,
+ remove check for file existence.
+ * src/main.c (run_use_askpass): C89 compat init of argv,
+ added \n to error messages,
+ fixed stripping of \n and \r from input,
+ make run_use_askpass and use_askpass static.
+
+2016-09-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (check_file_output): Replace asprintf by aprint
+
+2016-09-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * testenv/README: Remove obsolete references to TEST_NAME
+
+2016-09-03 Liam R. Howlett <Liam.Howlett@WindRiver.com>
+
+ Add --use-askpass=COMMAND support
+ * doc/wget.texi: Add --use-askpass to documentation.
+ * src/init.c: Add cmd_use_askpasss to set opt.use_askpass based on
+ argument, WGET_ASKPASS, and SSH_ASKPASS environment variables.
+ opt.wget-askpass is freed in cleanup ()
+ * src/main.c: Update options & add spawn process of opt.use_askpass
+ command.
+ * src/options.h: Addition of string use_askpass.
+ * src/url.c: Function scheme_leading_string to access the leading
+ string of a parsed url.
+ * src/url.h: Prototype for scheme_leading_string for returning the
+ leading string.
+ * bootstrap.conf: Add posix_spawn to gnulib_modules
+
+ This adds the --use-askpass option which is disabled by default.
+
+ --use-askpass=COMMAND will request the username and password for a given
+ URL by executing the external program COMMAND. If COMMAND is left
+ blank, then the external program in the environment variable
+ WGET_ASKPASS will be used. If WGET_ASKPASS is not set then the
+ environment variable SSH_ASKPASS is used. If there is no value set, an
+ error is returned. If an error occurs requesting the username or
+ password, wget will exit.
+
+2016-09-02 Dale R. Worley <worley@ariadne.com>
+
+ Add tests for recursion and redirection.
+ * testenv/Test-recursive-basic.py: New file. Test basic recursion
+ * testenv/Test-recursive-include.py: New File. Recursion test with
+ include directories
+ * testenv/Test-redirect.py: New File. Basic redirection tests
+ * testenv/Makefile.am: Add new tests to makefile
+
+ Sort test names into order.
+ * testenv/Makefile.am: Sort all the python tests in alphabetical
+ order
+
+ Corrections and amplifications to test documentation
+ * testenv/README: Update documentation to meet current project
+ status
+ * testenv/Test-Proto.py: Same
+
+2016-08-24 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Append .tmp to temporary files
+ * src/http.c (struct http_stat): Add `temporary` flag.
+ (check_file_output): Append .tmp to temporary files.
+ (open_output_stream): Refactor condition to use hs->temporary instead.
+
+ Reported-by: "Misra, Deapesh" <dmisra@verisign.com>
+ Discovered by: Dawid Golunski (http://legalhackers.com)
+
+2016-08-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Limit file mode to u=rw on temp. downloaded files
+ * bootstrap.conf: Add gnulib modules fopen, open.
+ * src/http.c (open_output_stream): Limit file mode to u=rw
+ on temporary downloaded files.
+
+ Reported-by: "Misra, Deapesh" <dmisra@verisign.com>
+ Discovered by: Dawid Golunski (http://legalhackers.com)
+
+2016-08-21 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Fix some make syntax-check issues
+ cfg.mk: Skip .der files.
+ testenv/certs/server-template.cfg: Remove empty final line.
+ testenv/certs/ca-template.cfg: Likewise.
+
+2016-08-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/css-url.c (get_urls_css): Fix memory leak
+
+ * src/html-url.c (get_urls_html): Fix memory leak
+
+2016-08-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Improve PSL cookie checking
+ * configure.ac: Add --with-psl-file to set a PSL file
+ * src/cookies.c (check_domain_match): Load PSL_FILE with
+ fallback to built-in data.
+
+ This change allows package maintainers to make Wget use the latest
+ PSL (DAFSA or plain text), without updating libpsl itself.
+
+ E.g. Debian now comes with a DAFSA binary within the 'publicsuffix'
+ package which allows very fast loading (no parsing or processing needed).
+
+2016-08-10 Tobias Stoeckmann <tobias@stoeckmann.org>
+
+ Fix stack overflow with way too many cookies
+ * src/cookies.c (cookie_header): Use heap instead of stack.
+ * src/http.c (request_send): Likewise.
+
+ If wget has to handle an insanely large amount of cookies (~700,000 on
+ 32 bit systems or ~530,000 on 64 bit systems), the stack is not large
+ enough to hold these pointers, leading to undefined behaviour according
+ to POSIX; expect a segmentation fault in real life. ;)
+
+2016-08-09 Tobias Stoeckmann <tobias@stoeckmann.org>
+
+ Fix signal race condition
+ The signal handler for SIGALRM calls longjmp, but the handler is
+ installed before the jump target has been initialized. If another
+ process sends SIGALRM right between handler installation and target
+ initialization, the jump leads to undefined behavior.
+
+ This can easily be fixed by moving the signal handler installation
+ into the "SETJMP == 0" conditional block, which means that the target
+ has just been initialized.
+
+ * src/utils.c: call signal after SETJMP.
+
+2016-08-05 Jeffery To <jeffery.to@gmail.com>
+
+ Remove hyphens from command names
+ * src/init.c: Remove hyphens from command names
+ * src/main.c: Likewise
+
+ Options with hyphens (or underscores) in their command name cannot be
+ set in a wgetrc file.
+
+2016-08-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/metalink.c (badhash_suffix): Fix quoting
+
+2016-08-04 Matthew White <mehw.is.me@inventati.org>
+
+ Add new option --keep-badhash to keep Metalink's files with a bad hash
+ * src/init.c: Add keepbadhash
+ * src/main.c: Add keep-badhash
+ * src/options.h: Add keep_badhash
+ * doc/wget.texi: Add docs for --keep-badhash
+ * src/metalink.h: Add prototypes badhash_suffix(), badhash_or_remove()
+ * src/metalink.c: New functions badhash_suffix(), badhash_or_remove().
+ (retrieve_from_metalink): Call badhash_or_remove() on download error
+
+ With --keep-badhash, append .badhash to Metalink's files with checksum
+ mismatch. (retrieve_from_metalink): unique_create() may append another
+ suffix to avoid overwriting existing files.
+
+ Without --keep-badhash, remove downloaded files with checksum mismatch
+ (this conforms to the old behaviour).
+
+2016-08-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ * src/metalink.c: Remove C++ style comments
+
+2016-08-03 Matthew White <mehw.is.me@inventati.org>
+
+ Add gnulib modules 'link', 'unlink' and 'symlink'
+ * bootstrap.conf: Add 'link', 'unlink' and 'symlink'
+
+2016-08-03 Matthew White <mehw.is.me@inventati.org>
+
+ New: --continue continues partially downloaded Metalink's files
+ * src/metalink.c (retrieve_from_metalink): Continue file download if
+ opt.always_rest is true
+
+ Without --continue, download as a new file with an unique name (this
+ conforms to the old behaviour).
+
+2016-08-03 Matthew White <mehw.is.me@inventati.org>
+
+ Add support for Metalink's md2, and md4 hashes
+ * bootstrap.conf: Add crypto/md2, and crypto/md4
+ * src/metalink.c (retrieve_from_metalink): Add md2, and md4 support
+
+ This patch adds support for the deprecated (insecure) md2, and md4
+ Message-Digest algorithms to the Metalink module.
+
+2016-08-03 Matthew White <mehw.is.me@inventati.org>
+
+ Add support for Metalink's md5, sha1, sha224, sha384, and sha512 hashes
+ * bootstrap.conf: Add crypto/sha512
+ * src/metalink.c (retrieve_from_metalink): Add md5, sha1, sha224,
+ sha384, and sha512 support
+
+ Metalink's checksum verification was limited to sha256. This patch
+ adds support for md5, sha1, sha224, sha384, and sha512.
+
+2016-07-27 Sean Burford <sburford@google.com>
+
+ Style fixes and DEBUG on setxattr failure.
+ * src/ftp.c: Fix style.
+ * src/http.c: Likewise.
+ * src/xattr.h: Likewise.
+ * src/xattr.c: Likewise,
+ (write_xattr_metadata): Print debug msg on error.
+
+2016-07-22 Sean Burford <sburford@google.com>
+
+ Keep fetched URLs in POSIX extended attributes
+ * configure.ac: Check for xattr availability
+ * src/Makefile.am: Add xattr.c
+ * src/ftp.c: Include xattr.h.
+ (getftp): Set attributes if enabled.
+ * src/http.c: Include xattr.h.
+ (gethttp): Add parameter 'original_url',
+ set attributes if enabled.
+ (http_loop): Add 'original_url' to call of gethttp().
+ * src/init.c: Add new option --xattr.
+ * src/main.c: Add new option --xattr, add description to help text.
+ * src/options.h: Add new config member 'enable_xattr'.
+ * src/xatrr.c: New file.
+ * src/xattr.h: New file.
+
+ These attributes provide a lightweight method of later determining
+ where a file was downloaded from.
+
+ This patch changes:
+ * autoconf detects whether extended attributes are available and
+ enables the code if they are.
+ * The new flags --xattr and --no-xattr control whether xattr is enabled.
+ * The new command "xattr = (on|off)" can be used in ~/.wgetrc or /etc/wgetrc
+ * The original and redirected URLs are recorded as shown below.
+ * This works for both single fetches and recursive mode.
+
+ The attributes that are set are:
+ user.xdg.origin.url: The URL that the content was fetched from.
+ user.xdg.referrer.url: The URL that was originally requested.
+
+ Here is an example, where http://archive.org redirects to https://archive.org:
+ $ wget --xattr http://archive.org
+ ...
+ $ getfattr -d index.html
+ user.xdg.origin.url="https://archive.org/"
+ user.xdg.referrer.url="http://archive.org/"
+
+ These attributes were chosen based on those stored by Google Chrome
+ https://bugs.chromium.org/p/chromium/issues/detail?id=45903
+ and curl https://github.com/curl/curl/blob/master/src/tool_xattr.c
+
+2016-07-02 Noël Köthe <noel@debian.org>
+
+ Fix typos
+ * ChangeLog-2014-12-10: invokation -> invocation
+ * doc/wget.texi: invokation -> invocation
+ * src/main.c: seperated -> separated
+ * src/options.h: seperated -> separated
+ * testenv/README: invokation -> invocation
+ * testenv/conf/wget_commands.py: invokation -> invocation
+
+2016-06-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix creating docs when make uses 'sh -e'
+ * doc/Makefile.am: Save fallback for pod2man --utf8
+
+ Reported-by: Jérémie Courrèges-Anglas <jca@wxcvbn.org>
+
+2016-06-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix compilation for OpenSSL 1.1.0
+ * src/openssl.c (ssl_init): Use SSL_is_init_finished() instead of
+ SSL_state(), conditionally skip SSLeay function calls
+
+ The python test suite makes SSL_peek() hang, consuming 100% CPU time.
+ This does not happen on real world TLS connections, though, but needs
+ investigations.
+
+2016-06-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add script to generate test certs non-interactive
+ * Test-pinnedpubkey-hash-https.py: Read hashed pubkey from file
+ * Test-pinnedpubkey-hash-no-check-fail-https.py: Use invalid hash
+ * certs/make_ca.sh: New script to generate test certs non-interactive
+ * certs/ca-template.cfg: New file (template for CA cert)
+ * certs/server-template.cfg: New file (template for server cert)
+ * certs/server-pubkey-sha256.base64: New file (pubkey sha256 hash)
+
+2016-06-27 Ander Juaristi <ajuaristi@gmx.es>
+
+ Bypass world-writable checks on Windows
+ * src/hsts.c (hsts_file_access_valid): we should check for "world-writable"
+ files only on Unix-based systems. It's difficult to mimic the same behavior
+ on Windows, so it's better to just not do it.
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+ Reported-by: Eli Zaretskii <eliz@gnu.org>
+
+2016-06-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Update gnulib and bootstrap
+ * gnulib: Sync gnulib submodule with upstream
+ * bootstrap: Update to latest version from gnulib/build-aux/
+
+2016-06-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Use ICONV_CONST to avoid type warning for iconv()
+ * src/iri.c (do_conversion): Cast 2. param of iconv() to
+ 'ICONV_CONST char **'
+ * src/url.c (convert_fname): Likewise
+
+ Remove check for HAVE_ICONV in src/url.c
+ * src/url.c: Remove check for HAVE_ICONV
+
+ Add gnulib module 'langinfo'
+ * bootstrap.conf: Add 'langinfo'
+
+ Include gnulib fcntl.h instead of sys/fcntl.h
+ * src/gnutls.c: Include gnulib fcntl.h
+
+ Add libraries to LDADD for wget
+ * src/Makefile.am: Add $(GETADDRINFO_LIB) $(HOSTENT_LIB) $(INET_NTOP_LIB)
+ $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO) $(LIB_SELECT)
+ $(LTLIBICONV) $(LTLIBINTL) $(LTLIBTHREAD) $(SERVENT_LIB) to LDADD
+
+2016-06-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Explicitely mention Python3 in README.checkout
+ * README.checkout: Python test suite needs Python3
+
+2016-06-09 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: update
+
+2016-06-09 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ ftp: understand --trust-server-names on a HTTP->FTP redirect
+ If not --trust-server-names is used, FTP will also get the destination
+ file name from the original url specified by the user instead of the
+ redirected url. Closes CVE-2016-4971.
+
+ * src/ftp.c (ftp_get_listing): Add argument original_url.
+ (getftp): Likewise.
+ (ftp_loop_internal): Likewise. Use original_url to generate the
+ file name if --trust-server-names is not provided.
+ (ftp_retrieve_glob): Likewise.
+ (ftp_loop): Likewise.
+
+2016-06-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix warnings for --disable-iri configure flag
+ * src/iri.h: Fix #define for parse_charset
+ * src/html-url.c: Surround some IRI code parts by #ifdef ENABLE_IRI
+ * src/http.c: Likewise
+ * src/iri.h: Likewise
+ * src/recur.c: Likewise
+ * src/retr.c: Likewise
+
+ Fix warning about redefinition of MAP_FAILED
+ * src/sysdep.h: Removed definition of MAP_FAILED
+ * src/utils.c: Check and define MAP_FAILED after including sys/mmap.h
+
+2016-06-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add new Test for missing scheme behavior
+ * testenv/Makefile.am: Add Test-missing-scheme-retval.py
+ * testenv: New file Test-missing-scheme-retval.py
+
+ Idea and Perl implementation by Zdenek Dohnal <zdohnal@redhat.com>
+
+2016-05-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fallback to pod2man without utf-8 on error
+ * doc/Makefile.am: Fallback to pod2man without utf-8 on error
+
+2016-05-26 Ander Juaristi <ajuaristi@gmx.es>
+
+ Correct HSTS debug message
+ * src/main.c (save_hsts): save the in-memory HSTS database to a file
+ only if something changed.
+ * src/hsts.c (struct hsts_store): new field 'changed'.
+ (hsts_match): update field 'changed' accordingly.
+ (hsts_store_entry): update field 'changed' accordingly.
+ (hsts_store_has_changed): new function.
+ * src/hsts.h (hsts_store_has_changed): new function.
+
+ Check the HSTS file is not world-writable
+ * hsts.c (hsts_file_access_valid): check that the file is a regular
+ file, and that it's not world-writable.
+ (hsts_store_open): if the HSTS database file does not meet the
+ above requirements, disable HSTS at all.
+
+2016-05-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Improve description of Perl libraries needed for test suite
+ * README.checkout: Improve text about Perl libraries
+
+2016-05-23 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove special handling for Emacs in progress bar code
+ * src/progress.c: Remove special 'emacs' code
+
+ Fixes #47989
+
+2016-04-25 Jernej SimonÄiÄ <jernej|s-wget@eternallybored.org>
+
+ Fix xsleep() for Windows (trivial change)
+ * src/mswindows.c (xsleep): Fix check for number of seconds
+
+2016-04-17 Sergio Gelato <sergio.gelato@astro.su.se>
+
+ More accurate log message from do_conversion()
+ * src/iri.c (do_conversion): More accurate log message
+
+2016-04-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Include sys/select.h if HAVE_LIBCARES
+ * src/hosts.c: Include sys/select.h if HAVE_LIBCARES
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2016-04-17 Gisle Vanem <gvanem@yahoo.no>
+
+ Fix Windows gnulib/c-ares incompatibility of select()
+ * src/host.c: Undef 'select' on Windows
+
+2016-04-15 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Set X flags for python tests
+ * testenv/*.py: Set eXecute flags
+
+ Regression from commit 926e42d4678689195a0bbed210c6d027db7cc390
+
+2016-04-11 Ander Juaristi <ajuaristi@gmx.es>
+
+ Strictly comply with RFC 6797
+ * src/hsts.c (hsts_store_entry): strictly comply with RFC 6797.
+
+ RFC 6797 states in section 8.1 that the UA's cached information should
+ only be updated if:
+
+ "either or both of the max-age and includeSubDomains header field
+ value tokens are conveying information different than that already
+ maintained by the UA."
+
+2016-04-11 Ander Juaristi <ajuaristi@gmx.es>
+
+ Correct HSTS database file description
+ * src/hsts.c (hsts_store_dump): s/[:port]/<port>/
+
+2016-04-11 moparisthebest <admin@moparisthebest.com>
+
+ Implement tests for new pinnedpubkey option
+ * testenv/Makefile.am: Add new tests
+ * testenv/Test-pinnedpubkey-der-https.py: New test
+ * testenv/Test-pinnedpubkey-der-no-check-https.py: New Test
+ * testenv/Test-pinnedpubkey-hash-https.py: New test
+ * testenv/Test-pinnedpubkey-hash-no-check-fail-https.py: New test
+ * testenv/Test-pinnedpubkey-pem-fail-https.py: New test
+ * testenv/Test-pinnedpubkey-pem-https.py: New test
+ * testenv/certs/README: How to generate public keys with openssl tool
+ * testenv/certs/server-pubkey.der: New key file (DER format)
+ * testenv/certs/server-pubkey.pem: New key file (PEM format)
+
+ Implement --pinnedpubkey option to pin public keys
+ * doc/wget.texi: Add description for --pinnedpubkey
+ * src/gnutls.c: New function pkp_pin_peer_pubkey(),
+ (ssl_check_certificate): Check pinned cert via pkp_pin_peer_pubkey()
+ * src/init.c: Add option --pinnedpubkey
+ * src/main.c: Add option --pinnedpubkey
+ * src/openssl.c: New function pkp_pin_peer_pubkey(),
+ (ssl_check_certificate): Check pinned cert via pkp_pin_peer_pubkey()
+ * src/options.h: Add new option variable 'pinnedpubkey'
+ * src/utils.c: New functions wg_pubkey_pem_to_der(), wg_pin_peer_pubkey()
+ * src/utils.h: Add prototype for wg_pin_peer_pubkey()
+
+2016-04-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Use test file name for temp working directory name
+ * testenv/test/base_test.py (__init__): Use test file name for name,
+ remove 'name' parameter
+ * testenv/test/http_test.py (__init__): Remove 'name' parameter
+ * testenv/*.py: Remove TEST_NAME
+
+ Using a fixed string (TEST_NAME) to build the working directory
+ for testing caused random failures (or successes) when tests
+ share the same TEST_NAME value. Not easy to find without digging
+ into the python test suite code.
+ We now use the test file name, which is unique within the test
+ environment.
+
+2016-04-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix testenv/Test--rejected-log.py
+ * testenv/Test--rejected-log.py: Add missing tabs in expected output
+
+ Fail python tests when post_hook errors
+ * testenv/test/base_test.py (__exit__): Return self.tests_passed
+ (__test_cleanup): Set self.tests_passed to False on exception
+
+2016-03-29 Darshit Shah <darnir@gmail.com>
+
+ Print the fingerprint instead of the raw pointer in debugging message
+ * src/metalink.c (retrieve_from_metalink): Fix debug message to print the
+ fingerprint instead of a pointer.
+
+ * Do not delete the ChangeLog file since it is required by the Makefile
+ and breaks compilation
+
+2016-03-29 Darshit Shah <darnir@gmail.com>
+
+ Revert "Print the fingerprint instead of the raw pointer in debugging message"
+ This reverts commit b916595168b6eb0f8868a67a9d214d5e0022871f.
+
+2016-03-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fixed URLs and references in wget.texi
+ * wget.texi: Replace server.com by example.com,
+ replace ftp://wuarchive.wustl.edu by https://example.com,
+ use HTTPS instead of HTTP where possible,
+ fix list archive reference,
+ remove reference to wget-notify@addictivecode.org,
+ change bugtracker URL to bugtracker on Savannah,
+ replace yoyodyne.com by example.com,
+ fix URL to VMS port
+
+2016-03-25 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * metalink.c (retrieve_from_metalink): Fix typo
+
+ Print the fingerprint instead of the raw pointer in debugging message
+ * src/metalink.c (retrieve_from_metalink): Fix debug message to print the
+ fingerprint instead of a pointer.
+
+2016-03-23 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add options --bind-dns-address and --dns-servers
+ * README.checkout: Add description for libares
+ * configure.ac: Add check for libares
+ * doc/wget.texi: Add docs for the new options
+ * src/build_info.c.in: Add +/-cares for --version output
+ * src/host.c:
+ (merge_address_lists): New static function
+ (address_list_from_hostent): New static function
+ (wait_ares): New static function
+ (callback): New static function
+ (lookup_host): Add libares resolver code
+ * src/init.c: Add new options,
+ (cleanup): Add cleanup code
+ * src/main.c: Add global libares channel variable
+ (cmdline_option option_data): Add new options
+ (print_help): Add short descriptions
+ (main): Add libares init code
+ * src/options.h (struct options): Add option members
+
+ The new options allow to specify alternative DNS servers and
+ an alternate packet route for the resolver packets.
+ Wget has to built with libares, enabled at configure time by
+ ./configure --with-cares.
+
+2016-03-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix SNI server names with trailing dot(s)
+ * src/gnutls.c (ssl_connect_wget, ssl_check_certificate): Fix SNI server name
+ * src/openssl.c (ssl_connect_wget, ssl_check_certificate): Fix SNI server name
+
+ Fixes #47408
+
+2016-03-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix links to original Robots Exclusion Standard
+ * doc/wget.texi: Fix links
+
+2016-03-05 Darshit Shah <darnir@gmail.com>
+
+ Fix assertion in Progress bar
+ * src/progress.c (create_image): Fix off-by-one error in assert()
+ statement for progress bar width.
+ Reported-By: Gisle Vanem <gvanem@yahoo.no>
+
+2016-03-03 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ src/url.c: fix make syntax-check
+
+2016-03-03 Maks Orlovich <morlovich@google.com>
+
+ Parse <img srcset> attributes, they have image URLs.
+ * src/convert.h: Add link_noquote_html_p to permit rewriting URLs deep
+ inside attributes without adding extraneous quoting
+ * src/convert.c (convert_links): Honor link_noquote_html_p
+ * src/html_url.c (tag_handle_img): New function. Add srcset parsing.
+
+2016-03-01 Darshit Shah <darnir@gmail.com>
+
+ Sanitize value sent to memset to prevent SEGFAULT
+
+2016-03-01 Darshit Shah <darnir@reniac.com>
+
+ Update documentation about bahviour of -c
+ * docs/wget.texi: -c will restart download from scratch if server
+ does not support RANGE.
+
+ Reported-By: David Chavez
+ http://stackoverflow.com/questions/30147332/unexpected-behavior-of-wget
+
+2016-02-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix writing WARC-Target-URI value
+ src/warc.c: Add function warc_write_header_uri(),
+ Use it for creating WARC-Target-URI
+
+ Fixes #47281
+
+2016-02-13 Darshit Shah <darnir@gmail.com>
+
+ Remove pointer to unused Mailing List
+ * MAILING-LISTS: Remove pointer to old, unused mailing list for bug
+ reports
+
+2016-02-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Retain value of errno in logprintf(), logputs() even better
+ * src/log.c (logprintf,logputs): Save&Restore value of errno
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2016-02-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Retain value of errno in logprintf()
+ * src/log.c (logprintf): Save&Restore value of errno
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2016-02-01 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Set AM_SILENT_RULES to yes by default
+ * configure.ac: Set AM_SILENT_RULES to yes by default
+
+2016-02-01 Ander Juaristi <ajuaristi@gmx.es>
+
+ Enforce 'RejectHeader' rule in tests
+ * server/http/http_server.py (_Handler.RejectHeader): enforce
+ 'RejectHeader' rule.
+
+2015-12-20 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix Test-iri-forced-remote
+ * tests/Test-iri-forced-remote.px: Fix encodings
+
+2015-12-18 Eli Zaretskii <eliz@gnu.org>
+
+ Support non-ASCII URLs
+ * src/url.c [HAVE_ICONV]: Include iconv.h and langinfo.h.
+ (convert_fname): New function.
+ [HAVE_ICONV]: Convert file name from remote encoding to local
+ encoding.
+ (url_file_name): Call convert_fname.
+ (filechr_table): Don't consider bytes in 128..159 as control
+ characters.
+
+ * tests/Test-ftp-iri.px: Fix the expected file name to match the
+ new file-name recoding. State the remote encoding explicitly on
+ the Wget command line.
+
+ * NEWS: Mention the URI recoding when built with libiconv.
+
+2015-12-18 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * NEWS: Prepare new development cycle
+
+2015-12-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Cleanup code
+ * src/iri.c (do_conversion): Code cleanup
+
+2015-12-17 Eli Zaretskii <eliz@gnu.org>
+
+ Set URI encoding when redirected
+ * src/retr.c (retrieve_url): Set URI on redirection
+
+2015-12-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove requesting X/Open 5, POSIX 1995
+ * src/sysdep.h: Remove #define _XOPEN_SOURCE 500
+
+2015-12-16 Eli Zaretskii <eliz@gnu.org>
+
+ Avoid hanging on MS-Windows when invoked with --connect-timeout
+ * src/connect.c (connect_to_ip) [WIN32]: Don't call fd_close if
+ the connection timed out, to avoid hanging.
+
+2015-12-15 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix iconv conversion
+ * src/iri.c: Kick out the last converted character from iconv()
+
+ Thanks to Eli Zaretskii <eliz@gnu.org> for suggesting the fix.
+ Reported-by: "Andries E. Brouwer" <Andries.Brouwer@cwi.nl>
+
+2015-12-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Let Test-k survive on CygWin and Windows
+ * tests/Test-k.px: Use --restrict-file-names for CygWin/Windows
+ filename requirements.
+
+2015-12-13 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix leak in HSTS code
+ * src/hsts.c (hsts_store_open): close fp if open.
+
+ Remove unused variable in ftp code
+ * src/ftp.c (getftp): fix compiler warning for unused variable.
+
+2015-12-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Tag release 1.17.1
+ * NEWS: Update.
+ * gnulib: sync from upstream.
+
+2015-12-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove ABOUT-NLS from git
+ * ABOUT-NLS: Remove from repository, it will be autogenerated.
+ * .gitignore: Add ABOUT-NLS and build-aux/ar-lib
+
+2015-12-11 Jernej SimonÄiÄ <jernej|s-wget@eternallybored.org>
+
+ * src/metalink.c: Specify 'rb' as mode to open file
+
+2015-12-10 Ãngel González <keisial@gmail.com>
+
+ * doc/wget.texi: add hint for self-signed certificates
+
+2015-12-10 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix Coverity issues
+ * src/ftp.c (getftp): on error, close the file and attempt to remove it
+ before exiting.
+ * src/hsts.c (hsts_store_open): update modification time in the end.
+
+2015-12-10 Darshit Shah <darnir@gmail.com>
+
+ Faster Travis Builds
+ * contrib/travis-ci: Test under different languages only when all the
+ features are enabled. This covers the maximum number of strings. For the
+ other option permutations, test only in the default C locale
+
+ Fix remaining bugs in progress bar implementation
+ * src/progress.c (create_image): Ensure that the entire screen width is
+ drawn everytime to prevent any artefacts from leaking through.
+
+2015-12-09 Darshit Shah <darnir@gmail.com>
+
+ Add bug-wget to list of travis recipients
+ * .travis.yml: Add bug-wget to list of Travis Report Recipients
+
+ Eliminate more compiler warnings
+ * src/options.h (CHECK_CERT_MODES): Remove C99 style comma after last
+ value
+ * src/progress.c (create_image): Do not mix statements and declarations
+ * src/init.c (cmd_boolean_internal): Mark unused parameters
+
+ Re-enable test on multibyte locale in Travis
+ * .travis.yml: Use Russian locale instead of Japanese since it seems to
+ be more complete
+ * contrib/travis-ci: Re-enable testing on a Russian locale
+
+ Fix progress bar assertion with multibyte locales
+ * src/progress.c (bar_create): Define size of progress buffer explicitly
+ (create_image): Clean up progress bar image creation. Use memset
+ instead of for loops to create arrays of the same byte.
+
+2015-12-06 Darshit Shah <darnir@gmail.com>
+
+ Introduce Travis Integration
+ * .travis.yml: Configuration file for Travis-CI
+ * contrib/travis-ci: Script to run on travis. Similar to check-hard but modified
+ for travis.
+ * tests/valgrind-suppressions{-ssl}: Add extra suppressions to prevent a
+ Valgrind False Positive errors in an old version
+
+ Since Travis currently supports only public repositories on GitHub, the support
+ for automated testing through Travis will be done using my Clone of Wget on
+ GitHub at: https://github.com/darnir/wget.git
+ Any commits pushed to this repository will trigger a build on Travis.
+
+2015-12-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ SKIP SSL/TLS tests if configured without it
+ * testenv/Makefile.am: Set SSL_TESTS env variable
+ * testenv/Test--https-crl.py, testenv/Test--https.py,
+ testenv/Test-hsts.py: Return 77 (SKIP) if SSL/TLS is not configured
+
+2015-12-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add Test-hsts.py to SSL_TESTS
+ * testenv/Makefile.am: Add Test-hsts.py to SSL_TESTS
+
+2015-12-03 Ygal Blum <ygal.blum@technicolor.com>
+
+ Fix compilation when without-ssl is selected
+
+2015-12-03 Darshit Shah <darnir@gmail.com>
+
+ Include Metalink and GPG information in version
+ * src/build_info.c.in: Include the presence of Metalink and GPGME features in
+ the output for wget --version
+
+2015-12-03 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Add --check-certificate=quiet
+ * doc/wget.texi: Add documentation for --check-certificate=quiet.
+ * src/options.h (enum CHECK_CERT_MODES): New enum.
+ * src/init.c (cmd_check_cert): New static function.
+ (cmd_boolean_internal): Likewise.
+ * src/gnutls.c (ssl_check_certificate): Handle CHECK_CERT_QUIET.
+ * src/openssl.c (ssl_check_certificate): Handle CHECK_CERT_QUIET.
+
+2015-11-24 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix regression in HTTP authentication
+ * src/http.c (initialize_request): Fix wrong params to search_netrc()
+
+ Regression introduced in commit 29850e77
+ Reported-by: Axel Reinhold <axel@freakout.de>
+
+2015-11-23 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix SIGSEGV in -N / --content-disposition combination
+ * src/http.c (http_loop): Fix SIGSEGV
+
+ Reported-by: "Schleusener, Jens" <Jens.Schleusener@t-online.de>
+
+2015-11-20 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix potential NULL pointer dereference
+ * src/gnutls.c (ssl_connect_wget): check for NULL before calls
+
+2015-11-20 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * configure.ac: change gettext version to 0.18.1
+
+2015-11-19 Ikey Doherty <michael.i.doherty@intel.com>
+
+ configure.ac: Use correct gettext version
+
+2015-11-19 Tim Rühsen <tim.ruehsen@openmediasystem.de>
+
+ Fix HSTS memory issue + test code issue
+ * src/hsts.c (hsts_find_entry): Fix freeing memory
+ (hsts_remove_entry): Remove freeing host member
+ (hsts_match): Free host member here
+ (hsts_store_entry): Free host member here
+ (test_url_rewrite): Fix 'created' value
+ (test_hsts_read_database): Fix 'created' value
+
+ Reported-by: Dagobert Michelsen <dam@opencsw.org>
+
+2015-11-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Include errno.h instead of sys/errno.h (Solaris issue)
+ * src/metalink.c: Include errno.h instead of sys/errno.h
+
+ Reported-by: Dagobert Michelsen <dam@opencsw.org>
+
+2015-11-17 Darshit Shah <darnir@gmail.com>
+
+ Fix compile error when IPv6 is disabled
+ * src/ftp-basic.c: The code for the new FTPS functionality was unintentionally
+ inside a #ifdef IPV6 block. Move the code around so that it is defined even when
+ IPV6 isn't used
+
+ Use gnulib module flock to provide function
+ * bootstrap.conf: Use module flock from gnulib to provide it on other platforms
+ such as Windows.
+
+2015-11-16 Darshit Shah <darnir@gmail.com>
+
+ Eliminate NDEBUG redefined warnings
+ * src/wget.h: Define NDEBUG only if it hasn't been defined before
+
+2015-11-15 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: prepare new release cycle
+
+ Prepare release 1.17
+ * gnulib: sync with upstream.
+ * NEWS: Update.
+ * src/main.c: Change the copyright year.
+
+2015-11-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Document combination of -nc and -O
+ Fixes #46359
+
+2015-11-03 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Do not download/save file on error when --spider enabled
+ * src/http.c (gethttp,http_loop):
+ Do not download/save file on error when --spider is enabled and not
+ working recursive.
+
+ Reported-by: Сковорода Ðикита Ðндреевич chalkerx@gmail.com
+ Fixes #45821
+
+2015-10-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix URL conversion for colons in filenames
+ * src/convert.c (construct_relative): Prepend './' to filename
+ * tests/Test-k.px: Amend test to succeed
+
+2015-10-15 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Adjust indentation of --no-use-server-timestamps in help output
+ * src/main.c: Adjust indentation of --no-use-server-timestamps
+
+2015-10-13 Ander Juaristi <ajuaristi@gmx.es>
+
+ Added --convert-file-only option
+ * src/convert.c (convert_links_in_hashtable, convert_links):
+ test for CO_CONVERT_BASENAME_ONLY.
+ (convert_basename): new function.
+ * src/convert.h: new constant CO_CONVERT_BASENAME_ONLY.
+ * src/init.c, src/main.c, src/options.h: new option "--convert-file-only".
+ * doc/wget.texi: updated documentation.
+
+ Reviewed-by: Gabriel Somlo <somlo@cmu.edu>
+
+2015-10-12 Darshit Shah <darnir@gmail.com>
+
+ Fix Test-ftp-pasv-not-supported.px
+ * tests/Test-ftp-pasv-not-supported.px: We do *NOT* expect any
+ downloaded files. Also, do not negate the Test response.
+
+ The test originally expected a downloaded file, but this is not
+ true. As a result, the test would fail and return exit code 1. This
+ was presumably the reason why the test result was negated before
+ returning to the shell. Fix this issue, so that the test runs
+ correctly without any hacks.
+
+2015-10-12 Darshit Shah <darnir@gmail.com>
+
+ Fix make distcheck failures in Perl SSL Tests
+ * tests/Makefile.am: Add valgrind-suppressions-ssl to EXTRA_DIST
+ * tests/Test-proxied-https-auth-keepalive.px: Find valgrind in
+ correct path during make distcheck
+ * tests/Test-proxied-https-auth.px: Same
+
+2015-10-12 christian fafard <cfaf@hotmail.com>
+
+ Skip HTTPS perl tests if IO::Socket::SSL not installed
+ * tests/Test-proxied-https-auth-keepalive.px: Skip test if perl module
+ IO::Socket::SSL is not installed (trivial change).
+ * tests/Test-proxied-https-auth.px: Skip test if perl module
+ IO::Socket::SSL is not installed (trivial change).
+
+2015-10-09 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix potential race condition
+ * src/hsts.c (hsts_read_database): get an open file handle
+ instead of a file name.
+ (hsts_store_dump): get an open file handle
+ instead of a file name.
+ (hsts_store_open): open the file and pass the open file handle.
+ (hsts_store_save): lock the file before the read-merge-dump
+ process.
+
+ Reported-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+2015-10-09 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix HSTS merge bug
+ * src/hsts.c (hsts_store_merge): call hsts_new_entry() if the entry
+ does not exist in the database.
+
+ When merging the existing HSTS database on disk with the one on memory,
+ the entries that were on disk but not on memory were ignored. Thus,
+ only the existing entries were merged. This behavior was only triggered
+ when more than one Wget processes were using the same HSTS database
+ simultaneously. This commit fixes the bug by adding the new entries
+ to the on-memory database if they were not found there.
+
+2015-09-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ testenv/Test--rejected-log.py: Remove trailing white spaces
+
+2015-09-28 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Handle TLS rehandshakes in GnuTLS code
+ * src/gnutls.c: New static function _do_handshake()
+ * src/gnutls.c (wgnutls_read_timeout): Handle rehandshake
+ * src/gnutls.c (wgnutls_write): Handle rehandshake
+ * src/gnutls.c (ssl_connect_wget): Move handshake code into _do_handshake()
+
+ Fixes #46061
+
+2015-09-22 Darshit Shah <darnir@gmail.com>
+
+ Add tests for missing qop in digest auth
+ * testenv/test-auth-both.py: Add qop parameter for digest auth
+ * testenv/test-auth-digest.py: Same
+ * testenv/conf/authentication.py: Support additional parameters for
+ authentication
+ * testenv/servers/http/http_server.py: Same
+
+ Do not test for impossible qop value
+ * http.c (digest_authentication_encode): Wget already errors out if
+ qop != "auth". Then it makes no sense to test for qop == "auth-int"
+ later on. Currently, Wget does not support the "auth-int" qop value
+ and till nobidy requests, it may remain so.
+
+2015-09-22 Darshit Shah <darnir@gmail.com>
+
+ Fix #46024. Support RFC 2069 Digest Authentication
+ * http.c (digest_authentication_encode): Some servers are still
+ using the obsolete RFC 2069 Digest Authentication. Allow Digest
+ authentication without the qop parameter for this.
+
+ Reported-by: Andreas Longwitz <longwitz@incore.de>
+
+2015-09-21 Darshit Shah <darnir@gmail.com>
+
+ Revert "Disable progress bar when wget is backgrounded (trivial patch)"
+ This reverts commit e6247325633d7d0007906f88d573a3bfa37307a7.
+
+2015-09-20 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: cite FTPS support
+
+2015-09-14 Ander Juaristi <ajuaristi@gmx.es>
+
+ Added support for FTPS
+ * doc/wget.texi: updated documentation to reflect the new FTPS functionality.
+ * src/ftp-basic.c (ftp_greeting): new function to read the server's greeting.
+ (ftp_login): greeting code was previously here. Moved to ftp_greeting to
+ support FTPS implicit mode.
+ (ftp_auth): wrapper around the AUTH TLS command.
+ (ftp_ccc): wrapper around the CCC command.
+ (ftp_pbsz): wrapper around the PBSZ command.
+ (ftp_prot): wraooer around the PROT command.
+ * src/ftp.c (get_ftp_greeting): new static function.
+ (init_control_ssl_connection): new static function to start SSL/TLS on the
+ control channel.
+ (getftp): added hooks to support FTPS commands (RFCs 2228 and 4217).
+ (ftp_loop_internal): test for new FTPS error codes.
+ * src/ftp.h: new enum 'prot_level' with available FTPS protection levels +
+ prototypes of previous functions. New flag for enum 'wget_ftp_fstatus' to track
+ whether the data channel has some security mechanism enabled or not.
+ * src/gnutls.c (struct wgnutls_transport_context): new field 'session_data'.
+ (wgnutls_close): free GnuTLS session data before exiting.
+ (ssl_connect_wget): save/resume SSL/TLS session.
+ * src/http.c (establish_connection): refactor ssl_connect_wget call.
+ (metalink_from_http): take into account SCHEME_FTPS as well.
+ * src/init.c, src/main.c, src/options.h: new command line/wgetrc options.
+ (main): in recursive downloads, check for SCHEME_FTPS as well.
+ * src/openssl.c (struct openssl_transport_context): new field 'sess'.
+ (ssl_connect_wget): save/resume SSL/TLS session.
+ * src/retr.c (retrieve_url): check new scheme SCHEME_FTPS.
+ * src/ssl.h (ssl_connect_wget): refactor. New parameter of type 'int *'.
+ * src/url.c. src/url.h: new scheme SCHEME_FTPS.
+ * src/wget.h: new FTPS error codes.
+ * src/metalink.h: support FTPS scheme.
+
+2015-09-10 Christian Neukirchen <chneukirchen@gmail.com>
+
+ Disable progress bar when wget is backgrounded (trivial patch)
+ * src/progress.c (create_image): progress only when in foreground
+
+ Sometimes I start wget, but the remote site is too slow, so I rather
+ want to run it in background, however when I simply use job control
+ for that, wget will keep spewing the progress bar all over my
+ terminal. I have found the SIGHUP/SIGUSR1 feature to redirect output
+ to a log file, but I think the following small patch is even more
+ useful, since the progress bar will simply resume when wget is
+ foregrounded again (also, the final message is still printed to the
+ terminal in any case):
+
+2015-09-04 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Add information about libmetalink and GnuPG
+ * README.checkout: Optional dependencies and URL references.
+
+2015-09-02 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Do not free Metalink structure if not initialized
+ * src/main.c (main): Move metalink_delete to the conditional block.
+
+2015-09-01 Ander Juaristi <ajuaristi@gmx.es>
+
+ Updated HSTS documentation
+ * doc/wget.texi: updated HSTS documentation.
+
+ Reported-by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+2015-09-01 Ander Juaristi <ajuaristi@gmx.es>
+
+ Extra debug traces for HSTS.
+ * src/main.c (load_hsts, save_hsts): added DEBUGP() calls to signal
+ reads and saves of the HSTS database file.
+
+2015-08-31 Darshit Shah <darnir@gmail.com>
+
+ Fix coding style violation in last commit
+ * http.c (test_parse_range_header): Declare loop variable
+ explicitly. Not in gnu99 standard.
+
+2015-08-30 Darshit Shah <darnir@gmail.com>
+
+ Add unit test for parse_content_range() method
+ * http.c (test_parse_range_header): New function to test the
+ function for parsing the HTTP/1.1 Content-Range header.
+ * test.[ch]: Same
+ * http.c (parse_content_range): Fix parsing code. Fail on scenarios
+ mentioned in rfc 7233.
+
+2015-08-30 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix null pointer dereference
+ * src/metalink.c (gpg_skip_verification):
+ Check output_stream before fclose
+
+ Fix leaks found by Coverity
+ * src/http.c (parse_strict_transport_security): Free c_max_age
+ (open_output_stream): Fix indentation
+ * src/iri.c (locale_to_utf8): Free new
+
+2015-08-29 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix two leaks foudn by Coverity
+ * src/http.c (gethttp): Do not leak 'message'.
+ * src/main.c (format_and_print_line): Do not leak 'line_dup'.
+
+ Fix resource leak discovered by Coverity
+ * src/retr.c (retrieve_url): Don't leak local_file.
+
+2015-08-29 Darshit Shah <darnir@gmail.com>
+
+ Fix memory leaks in unit-test
+ * hsts.c (get_hsts_store_filename): Free the homedir value
+ (close_hsts_test_store): Actually free the store struct too
+ (test_hsts_new_entry): Pass store to close_hsts_test_store()
+ (test_hsts_url_rewrite_superdomain): Same
+ (test_hsts_url_rewrite_congruent): Same
+ (test_hsts_read_database): Same and homedir and store filename
+ * http.c (test_parse_content_disposition): Free the returned
+ filename
+ * url.c (test_append_uri_pathel): Free allocated string
+
+ Fix mixed-indentation in http.c
+ * http.c: Fix mix indentation. Visual change only.
+
+2015-08-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Suppress debug output when strings may contain password
+ * iri.c (do_conversion): Do not print out converted strings if they
+ contain an '@'. That could be an URL with embedded password.
+
+ Fixes #45825
+
+2015-08-26 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fix resource leak.
+ * src/http.c (parse_strict_transport_security): Freed memory to avoid resource leak.
+ Comply with GNU coding style.
+
+2015-08-22 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix typo in NEWS
+ * NEWS: Change typo --accept-reject into --accept-regex
+
+ Reported-by: grarpamp <grarpamp@gmail.com>
+
+2015-08-21 Jookia <166291@gmail.com>
+
+ Clarify that links are being converted.
+ * src/convert.c: Add 'links in' after 'Converted %d' and 'Converting %s'.
+
+ Removed useless TODOs.
+ * testenv/Test--reject-log.py: Remove TODOs.
+
+2015-08-15 Miquel Llobet <mllobet.cm@gmail.com>
+
+ Fixed #44516 -o- not logging to stdout
+ src/log.c (log_init): check for hypen on filename, set stdout
+
+2015-08-15 Daniele Calore <daniele.calore@tin.it>
+
+ Fix #40426: Allow -r -O- only if FILE is regular
+ * main.c: added check of "-r -O FILE" option combination
+ allow only if FILE is a regular file (bug #40426)
+
+2015-08-15 Darshit Shah <darnir@gmail.com>
+
+ Fix var name conflicts with math.h and wingdi.h
+ * src/recur.c (reject_reason): Rename all enum members to WG_RR_xx.
+ * src/recur.c (retrieve_tree, download_child,
+ write_reject_log_reason): Same
+
+2015-08-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Let bootstrap/autoreconf work without GPGME installed
+ * configure.ac: Check for existance of AM_PATH_GPGME
+
+2015-08-11 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix IP address exposure in FTP code
+ * src/ftp.c (getftp): Do not use PORT when PASV fails.
+ * tests/FTPServer.px: Add pasv_not_supported server flag.
+ * tests/Makefile.am: Add Test-ftp-pasv-not-supported.px
+ * tests/Test-ftp-pasv-not-supported.px: New test
+
+ Fix IP address exposure when automatically falling back from
+ passive mode to active mode (using the PORT command). A behavior that
+ may be used to expose a client's privacy even when using a proxy.
+
+2015-08-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix C89 compliancy in HSTS test code
+ * src/hsts.c (test_hsts_new_entry):
+ Move variable assignment before code
+
+ Fix C89 compliancy in latest code
+ * src/recur.c: Declare variables before code
+ (write_reject_log_url):
+ Use const keyword where appropriate
+ Use the 'default' switch statement
+ Use xfree() instead of free()
+ Renamed variable f -> fp
+ (write_reject_log_reason):
+ Use const keyword where appropriate
+ Use the 'default' switch statement
+ Renamed variable f -> fp
+ Renamed variable r -> reason
+
+2015-08-07 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Remove redundant definition of _GNU_SOURCE
+ * src/warc.c: Remove definition of _GNU_SOURCE
+
+ _GNU_SOURCE is already defined in config.h
+
+2015-08-07 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: update
+
+2015-08-07 Jookia <166291@gmail.com>
+
+ Rewrite the --rejected-log test using the new framework.
+ * tests/Test--rejected-log.px: Remove old test.
+ * testenv/Test--rejected-log.py: Create new test.
+
+ Replace variables before comparing expected files.
+ * expected_files.py: Use formatted_content instead of file.content.
+
+2015-08-06 Jookia <166291@gmail.com>
+
+ Add option to write URL rejections to a tab-delimited CSV log.
+ * main.c: Add "--rejected-log" option.
+ * init.c: Add "rejectedlog" command.
+ * options.h: Add "rejected_log" parameter string.
+ * wget.texi: Add brief documentation on new --rejected-log option.
+ * recur.c: Optionally log details of URLs not traversed.
+ Add reject_reason enum.
+ (download_child_p -> download_child): Return a reject_reason.
+ (descend_redirect_p -> descend_redirect): Return a reject_reason.
+ (retrieve_tree): Support logging reasons for rejection.
+ Add write_reject_log_header that writes a CSV format header to a file.
+ Add write_reject_log_url that writes a url struct to a file in CSV format.
+ Add write_reject_log_reason that writes the URL and parent URL as well as the
+ rejection reason to a CSV file.
+ * Test--rejected-log.px: Add a basic test for the --rejected-log command.
+ * tests/Makefile.am: Run Test--rejected-log.px.
+
+ This allows you to figure out why URLs are being rejected and some context
+ around it. CSV is used as the output format since it can be used easily parsed,
+ it's delimited by tabs instead of commas to allow using all (quoted) URL
+ characters and includes column names which may be used for compatibility.
+
+2015-08-04 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix memory leak in HSTS code
+ * src/main.c (get_hsts_database): Free 'home' variable
+
+ void uninitialized variable in metalink code
+ * src/metalink.c: Init retr_err with METALINK_MISSING_RESOURCE
+ * src/wget.h: Add enum METALINK_MISSING_RESOURCE
+
+2015-07-24 Darshit Shah <darnir@gmail.com>
+
+ Fix function name collision with OpenSSL library
+ * src/utils.[ch], src/http.c, src/metalink.c: Rename function
+ hex_to_string() to wg_hex_to_string sine it collides with a
+ similarly named function in OpenSSL Library.
+
+ Fix configure options for metalink
+ * configure.ac: Ensure metalink support can be properly disabled
+
+2015-07-22 Alex Henrie <alexhenrie24@gmail.com>
+
+ Make the filename marquee a proper marquee
+ * src/progress.c: Start the marquee in the middle of the available space
+ and do not restart it until all of the text has scrolled out of view.
+
+2015-07-20 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: cite HSTS
+
+ Fix metalink tests
+ testenv/Test-metalink-http.py: initialize HTTP test server
+ testenv/Test-metalink-xml.py: initialize HTTP test server
+
+2015-07-20 Ander Juaristi <ajuaristi@gmx.es>
+
+ Enhancements in testsuite engine + new HSTS test.
+ * testenv/Makefile.am: added new test 'Test-hsts.py'.
+ * testenv/Test-hsts.py: new test for HSTS.
+ * testenv/conf/domains.py: new hook to override domain list.
+ * testenv/test/base_test.py: (__init__): new optional parameter
+ for tests 'req_protocols'.
+ (get_domain_addr): set the instance variables 'addr' and 'port'.
+ Return address as an array (domain, port) instead of string.
+ (gen_cmd_line): take into account domain and port.
+ * testenv/test/http_test.py (__init__): new optional parameter
+ 'req_protocols'.
+ (setup): new function. Call to server_setup() decoupled from
+ begin() and moved here.
+ (begin): call to superclass to maintain backward compatibility.
+ Removed call to server_setup().
+
+ This patch adds a new parameter to the test suite called 'req_protocols',
+ and a new function called 'setup'. The ability for tests to be able to set some
+ extra parameters such as the actual requested protocols (with 'req_protocols')
+ became obvious when support for HSTS was added to Wget, where the requested URI
+ and the actual executed URI do not have to be the same. This new parameter is optional
+ and if not specified, the test suite behaves as before. Also, the new function 'setup'
+ is provided as a means to start the test HTTP server, but not launch the test yet
+ (this is done when calling 'begin', as usual), in case we want to query the address
+ and port in which the test server listens. If 'setup' is not called, it is automatically
+ invoked when calling 'begin'. With these measures, we preserve backward-compatibility with
+ existing tests.
+
+2015-07-20 Ander Juaristi <ajuaristi@gmx.es>
+
+ Added support for HSTS.
+ * Makefile.am: Added new source files hsts.c and hsts.h.
+ * http.c (parse_strict_transport_security): new function for STS header
+ parsing.
+ (gethttp): update the HSTS store.
+ * http.h: new include "hsts.h".
+ * init.c: new options --hsts and --hsts-file.
+ * main.c (get_hsts_database, load_hsts, save_hsts): new functions.
+ New options --no-hsts and --hsts-file added to help.
+ (main): load and save HSTS store.
+ * options.h: new variables for supporting --hsts and --hsts-file.
+ * retr.c (retrieve_url): rewrite the URI according to the HSTS policy before
+ entering http_loop.
+ * test.c, test.h: new unit tests for HSTS.
+ * utils.c, utils.h (countchars): new function.
+ * wget.h: new preprocessor check.
+ * hsts.c, hsts.h: new files with the HSTS engine implementation.
+
+ Added support for HTTP Strict Transport Security (HSTS), as defined by RFC
+ 6797.
+
+2015-07-20 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: cite metalink support
+
+ fix compiler warnings
+ * src/utils.h: Include <stdlib.h>
+ * src/recur.c: Include "exits.h"
+
+2015-07-20 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Test preferred location in Metalink-over-HTTP test case.
+ * testenv/Test-metalink-http.py: Ensure preferred location is handled
+ properly.
+
+ Geolocation support for Metalink resources.
+ * doc/wget.text: Add information about --preferred-location.
+ * src/init.c: Add --preferred-location option.
+ * src/main.c (option_data): Handle --preferred-location argument.
+ (main): Sort resources based on location if requested.
+ * src/metalink.c (metalink_res_cmp): Compare based on location if
+ priority and preference are equal.
+ * src/options.h (options): Add preferred_location option.
+
+ Support at most one file signature. Adapt comments to libmetalink 0.13.
+ * src/metalink.c (retrieve_from_metalink): Add comment about new
+ libmetalink version. Do not iterate over signatures - support just one.
+
+ Move some Metalink-related code from http.c to metalink.c.
+ * src/http.c: Move find_key_value, has_key, find_key_values.
+ * src/metalink.c: To here.
+ * src/metalink.h: Make them non-static and add prototypes here.
+
+ Unit test for find_key_values.
+ * src/http.c: Add test_find_key_values.
+ * src/test.c (main): Run new test.
+ * src/test.h: Add test_find_key_values.
+
+ Unit test for has_key.
+ * src/http.c: Add test_has_key.
+ * src/test.c (main): Run new test.
+ * src/test.h: Add test_has_key.
+
+ Unit test for find_key_value.
+ * src/http.c: Add test_find_key_value.
+ * src/test.c (main): Run new test.
+ * src/test.h: Add test_find_key_value.
+
+ Test case for Metalink over HTTP.
+ * testenv/Test-metalink-http.py: New test.
+ * testenv/Makefile.am: Add to test list.
+
+ Support multiple headers with same name in Python test suite.
+ * testenv/README: Describe how to use repeated header name.
+ * testenv/server/http/http_server.py (finish_headers): Send all
+ values from list if the header value is a Python list.
+
+ Test case for Metalink in XML.
+ * testenv/Test-metalink-xml.py: New test.
+ * testenv/Makefile.am: Add file for automake.
+
+ Start HTTP test only when calling begin().
+ * testenv/test/http_test.py: Move self.do_test() from __init__ to
+ begin().
+
+ Metalink support.
+ * bootstrap.conf: Add crypto/sha256
+ * configure.ac: Look for libmetalink and GPGME
+ * doc/wget.texi: Add --input-metalink and --metalink-over-http
+ options description.
+ * po/POTFILES.in: Add metalink.c
+ * src/Makefile.am: Add new translation unit (metalink.c)
+ * src/http.c (http_stat): Add metalink field.
+ (free_stat): Free metalink field.
+ (find_key_value): Find value of given key in header string.
+ (has_key): Check if token exists in header string.
+ (find_key_values): Find all key=value pairs in header string.
+ (metalink_from_http): Obtain Metalink metadata from HTTP response.
+ (gethttp): Call metalink_from_http if requested.
+ (http_loop): Request Metalink metadata from HTTP response if should be.
+ Fall back to regular download if no Metalink metadata found.
+ * src/init.c: Add --input-metalink and --metalink-over-http options
+ * src/main.c (option_data): Handle --input-metalink and
+ --metalink-over-http cmd arguments.
+ (print_help): Print --input-metalink option description.
+ (main): Retrieve files from Metalink file
+ * src/metalink.c (retrieve_from_metalink): Download files described by
+ metalink.
+ (metalink_res_cmp): Comparator for resources priority-sorting.
+ * src/metalink.h: Create header for metalink.c
+ (RES_TYPE_SUPPORTED): Define supported resources media.
+ (DEFAULT_PRI): Default mirror priority for Metalink over HTTP.
+ (VALID_PRI_RANGE): Valid priority range.
+ * src/options.h (options): Add input_metalink option and metalink_over_http
+ options.
+ * src/utils.c (hex_to_string): Convert binary data to ASCII-hex.
+ * src/utils.h (hex_to_string): Add prototype.
+ * src/wget.h: Add metalink-related error enums
+ Add METALINK_METADATA flag for document type.
+
+2015-07-15 Romain Bentz <romain.bentz@dataiku.com>
+
+ Add NULL value check to fix #45289
+ * src/recur.c (retrieve_tree): Check return value of url_parse()
+
+2015-07-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Let HTTPS tests XFAIL when no TLS support configured
+ * configure.ac: Export WITH_SSL for use in Makefile.am
+ * testenv/Makefile.am: Add HTTPS tests to XFAIL_TESTS when !WITH_SSL
+
+ Reported-by: Ander Juaristi <ajuaristi@gmx.es>
+
+2015-07-01 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Change function params to const in src/iri.[ch]
+ * iri.h, iri.c: Added const attribute for params of parse_charsset(),
+ check_encoding_name(), idn_encode(), idn_decode(),
+ remote_to_utf8(), set_uri_encoding(), set_content_encoding().
+
+ Work around a libidn <= 1.30 vulnerability
+ * src/iri.c: Add _utf8_is_valid() to check UTF-8 sequences before
+ passing them to idna_to_ascii_8z().
+
+2015-06-27 Ãngel González <keisial@gmail.com>
+
+ Fix wgetrc filename creation for Windows
+ * init.c/wgetrc_file_name: Remove obsolete code in WINDOWS code path
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2015-06-16 Darshit Shah <darnir@reniac.com>
+
+ Add valgrind suppression files for HTTPS tests
+ * testenv/test/base_test.py: Use Valgrind SSL suppressions file for
+ tests
+ * testenv/valgrind-suppression-ssl, tests/valgrind-suppression-ssl:
+ Add new suppression files to suppress OpenSSL errors in valgrind
+ * tests/test-proxied-https-auth.px: Use the valgrind SSL
+ suppressions file for the test
+ * tests/test-proxied-https-auth-keepalive.px: Same
+
+2015-06-14 Darshit Shah <darnir@reniac.com>
+
+ contrib/check-hard: Indentation and spacing cleanup
+ * contrib/check-hard: Reduce the amount of text output to the
+ screen. Also implement some indentation and whitespace cleanups.
+
+2015-06-14 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Fix usage of CFLAGS in contrib/check-hard
+ * contrib/check-hard: Set CFLAGS per command line instead of using export.
+
+ 'make distcheck' changes CFLAGS. So using ./configure -C together with
+ exported CFLAGS fails. Setting CFLAGS per command line works smoothly.
+
+2015-06-13 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Move test_* function protoypes from test.c to test.h
+ * src/test.c: Remove test_* function prototypes, make tests_run static
+ * src/test.h: Add test_* function protoypes
+
+2015-05-23 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: cite --if-modified-since
+
+ gnulib: update gnulib
+
+2015-05-22 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Include --if-modified-since option in user manual.
+ * doc/wget.texi: Add --if-modified-since section.
+
+ Support If-Modified-Since header in timestamping mode.
+ * src/wget.h: Add IF_MODIFIED_SINCE enum for dt. Add TIMECONV_ERR
+ enum to uerr_t.
+ * src/http.c (time_to_rfc1123): Convert time_t do http time.
+ * src/http.c (initialize_request): Include If-Modified-Since header
+ if appropriate.
+ * src/http.c (set_file_timestamp): Separate this code from check_file_output.
+ * src/http.c (check_file_output): Use set_file_timestamp.
+ * src/http.c (gethttp): Handle properly 304 return code and 200 if server
+ ignores If-Modified-Since headers.
+ * src/http.c (http_loop): Load filename to hstat if condget was requested,
+ use IF_MODIFIED_SINCE if requested and current timestamp can be obtained.
+
+ Add --if-modified-since option
+ * src/init.c: Add to commands array.
+ * src/main.c: Add to cmdline_option. Add to help message.
+ * src/options.h: Add to options struct.
+
+ Add test for condget requests.
+ * testenv/Test-condget.py: the test
+ * testenv/Makefile.am: add to tests list
+
+ Support conditional GET in testenv server.
+ * src/exc/server_error.py: Add exception for GET to HEAD fallback.
+ * src/server/http/http_server.py: Do not send body if 304 return
+ code requested for a file.
+
+ Implement timestamp support for local files in testenv
+ * testenv/README: Change timestamp format definition
+ * testenv/conf/local_files.py: Set proper timestamps
+
+2015-05-20 Pär Karlsson <feinorgh@gmail.com>
+
+ Fix undeclared loop variable in Perl test suite
+ Reported-by: Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+2015-05-12 Ander Juaristi <ajuaristi@gmx.es>
+
+ Make sure Wget does not unescape reserved chars.
+ * testenv/Test-reserved-chars.py: New file.
+
+ * testenv/Makefile.am: Added new test Test-reserved-chars.py.
+
+ When following redirections, Wget should not unescape the reserved
+ characters that might appear in target URLs.
+
+2015-05-12 Ander Juaristi <ajuaristi@gmx.es>
+
+ Fixed incorrect handling of reserved chars.
+ * src/iri.c (do_conversion): Call url_unescape_except_reserved,
+ instead of url_unescape.
+
+ * src/url.c (url_unescape_1): New static function.
+ (url_unescape): Calls url_unescape_1 with mask zero. Preserves
+ same behavior as before. Only code changes.
+ (url_unescape_except_reserved): New function.
+
+ * src/url.h: Added prototype for url_unescape_except_reserved().
+
+ When the locale is US-ASCII, URIs that contain special characters
+ in them are converted to IRIs according to RFC 3987, section 3.2
+ "Converting URIs to IRIs".
+
+2015-05-07 Darshit Shah <darnir@reniac.com>
+
+ Fix documentation for update_speed_ring()
+ * progress.c (update_speed_ring): The comment for the function
+ incorrectly stated that the function uses thirty samples from the
+ past instead of twenty.
+
+ Reported-By: Yi Li <lovelylich@gmail.com>
+
+2015-05-04 Darshit Shah <darnir@reniac.com>
+
+ Remove shadowed variable in http.c
+ * http.c (gethttp): Rename err to conn_err to prevent shadowed
+ variable
+
+2015-05-04 Steven Schubiger <stsc@member.fsf.org>
+
+ paramcheck: use explicit quoting for here-docs
+ * util/paramcheck.pl: Adjust here-docs
+
+2015-05-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ Fix format specifier warning
+ * src/utils.c (aprintf): Use %d for int argument
+
+2015-05-01 Nikolay Merinov <kim.roader@gmail.com>
+
+ Fix timestamping and continue behaviour with ftp protocol.
+ * src/ftp.c (ftp_loop_internal): Add option `force_full_retrieve' that force to
+ retrieve full file.
+ (ftp_retrieve_list): Pass `true' as `force_full_retrieve' option to
+ `ftp_loop_internal' if we want to download file with newer timestamp than local
+ copy.
+
+2015-04-27 Rohit Mathulla <rohit_mathulla@yahoo.com>
+
+ openssl: Read cert from private key file when needed
+ * src/openssl.c (ssl_init): Assign opt.cert_{file, type}
+ from opt.private_key(_type)
+
+ Fix double free bug in SSL code
+ * src/openssl.c, src/gnutls.c (ssl_init): Copy options using xstrdup
+
+2015-04-20 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Single exit point and common cleanup code in gethttp
+ * src/http.c (gethttp): Common cleanup for type, message,
+ req, resp, head. Single exit point.
+
+2015-04-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Silence warning in perl test suite
+ * tests/WgetTests.pm: Use string comparisons for $valgrind variable
+
+2015-04-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Check memory allocations in WARC code
+ * src/warc.c: Remove some memory allocations,
+ use xmalloc instead of malloc
+
+ Reported-by: Bill Parker <wp02855@gmail.com>
+
+2015-04-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ Add more const usage to function params
+ * warc.c, warc.h: Add const specifier to several function args
+
+2015-04-14 Darshit Shah <darnir@reniac.com>
+
+ PEP8'ify the Python Test Suite
+ * testenv/conf/{__init__,authentication,files_crawled,
+ hook_sample,reject_header,server_files}.py: Aesthetic changes to
+ meet Python PEP8 guidelines
+ * testenv/exc/{server_error,test_failed}.py: Same
+ * testenv/misc/{colour_terminal,wget_file}.py: Same
+ * testenv/server/http/http_server.py: Same
+ * testenv/test/base_test.py: Same
+
+2015-04-13 Ander Juaristi <ajuaristi@gmx.es>
+
+ Improved test suite documentation
+ * README.checkout: Added reference to Python. New section
+ "Testing and development". Updated information about test suites.
+
+ Added support for GDB in Python tests
+ * base_test.py (gen_cmd_line): Check GDB_TESTS environment variable.
+
+2015-04-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ Added GDB support to Perl tests
+ * WgetTests.pm (run): Check GDB_TESTS environment variable.
+
+2015-04-11 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Add Valgrind suppression for libidn.so at idna_to_ascii_4z
+ * tests/WgetTests.pm (run): Include suppression file when running Valgrind.
+ * tests/valgrind-suppressions: Add suppression for idn_to_ascii_4z.
+ * tests/Makefile.am: Add valgrind-suppressions to EXTRA_DIST.
+
+2015-04-11 Ãngel González <keisial@gmail.com>
+
+ Remove memory leak in idn_encode.
+ * src/iri.c (idn_encode): Free buffer from remote_to_utf8
+ when needed; give meaningful names to variables;
+ remove excessive comment.
+
+2015-04-10 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Fix error in free_vec.
+ * src/utils.c (free_vec): Increment pointer instead of its value.
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2015-04-10 Ãngel González <keisial@gmail.com>
+
+ Fix const usage in iri.c
+ * src/iri.c (remote_to_utf8): Do not qualify with const the output pointer.
+ (do_conversion): Use the provided input parameter as const.
+ (idn_encode): casts to remote_to_utf8 parameters are no longer needed.
+ * src/iri.h: Adjusted remote_to_utf8 prototype.
+ * src/url.c: It is no longer necessary to cast new_url to const char.
+
+2015-04-06 Miquel Llobet <mllobet.cm@gmail.com>
+
+ Fixed #44628 honoring RFC 6266 content-disposition
+ src/http.c (parse_content_disposition): stores filename* and filename
+ separately and choses filename* if available.
+ (test_parse_content_disposition): added new tests.
+
+2015-04-02 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: cite last change
+
+2015-04-02 Steven M. Schweda <sms@antinode.info>
+
+ Add option to restrict filenames used VMS.
+ * src/options.h (enum restrict_files_os): Define "restrict_vms".
+ * src/init.c (defaults) [__VMS]: Set "opt.restrict_files_os" to
+ "restrict_vms".
+ (cmd_spec_restrict_file_names): honor "vms".
+ * src/url.c (filechr_not_unix): Define "filechr_not_vms".
+ (filechr_table): Update for VMS.
+ (append_uri_pathel): Honor opt.restrict_files_os.
+ (FN_QUERY_SEP): Update for VMS.
+ (FN_QUERY_SEP_STR): Update for VMS.
+
+2015-04-01 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Change semantics of resp_free and request_free in http.c
+ * src/http.c (resp_free): Change the semantics of this function.
+ (request_free): Change the semantics of this function.
+ (initialize_request): Adjust request_free call.
+ (establish_connection): Adjust request_free, resp_free calls.
+ (gethttp): Adjust request_free, resp_free calls.
+
+ Do not free request in establish_connection; do it in gethttp
+ * src/http.c (establish_connection): Do not free request here (it is
+ * never allocated here).
+ * src/http.c (gethttp): Free request before returning if error in
+ * establish_connection encountered.
+
+ Transform read_header label and goto into a loop
+ * src/http.c (gethttp): Replace label and goto statement with a do
+ loop.
+
+2015-03-31 Hubert Tarasiuk <hubert.tarasiuk@gmail.com>
+
+ Factor out set_content_type function from gethttp
+ * src/http.c (gethttp): Move some code in...
+ (set_content_type): ... a new function.
+
+2015-03-18 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Factor out some gethttp code
+ * src/http.c (gethttp): Move some code in...
+ (open_output_stream): ... a new function.
+
+ Factor out some auth gethttp code
+ * src/http.c (gethttp): Move some code in...
+ (check_auth): ... a new function.
+
+ Factor out some gethttp code
+ * src/http.c (gethttp): Move some code in...
+ (check_file_output): ... a new function.
+
+ Factor out some connection initialization code for gethttp
+ * src/http.c (gethttp): Move some initialization code in...
+ (establish_connection): ... a new function.
+
+ Factor out some proxy initialization code for gethttp
+ * src/http.c (gethttp): Move some initialization code in...
+ (initialize_proxy_configuration): ... a new function.
+
+ Factor out some initialization code for gethttp
+ * src/http.c (gethttp): Move some initialization code in...
+ (initialize_request): ... a new function.
+
+2015-03-18 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ src/ftp.c: make sure warc_tmp becomes closed before return
+ Reported-by: Coverity bug #1188044
+
+ src/http.c: fix error return of digest_authentication_encode()
+ Reported-by: Coverity bug #1188036
+
+2015-03-17 Rohan Prinja <rohan.prinja@gmail.com>
+
+ Convert wget.texi to UTF-8
+ * doc/wget.texi: convert to UTF-8 by adding @documentencoding
+ * doc/Makefile.am: Pass argument --utf8 to pod2man.
+
+2015-03-16 Ander Juaristi Alamos <ajuaristi@gmx.es>
+
+ * doc/wget.texi: The default is GnuTLS, not OpenSSL.
+
+2015-03-16 Darshit Shah <darnir@gmail.com>
+
+ testenv/http_server: Allow overriding Headers
+ We would like to override existing headers in the response from the
+ server to allow the test cases to define their own headers. This patch
+ allows this behaviour through the use of the add_header() method while
+ also allowing sending multiple headers of the same name.
+
+2015-03-14 Darshit Shah <darnir@gmail.com>
+
+ retr.c: Fix memory leak in retrieve_from_file()
+ Reported by: Coverity Bug 1188045
+
+ html-url.c: Fix potential memory leaks
+ Reported by: Coverity Bug 1188050
+
+ main.c: Fix two potential memory leaks
+ Reported by: Coverity bug 1188048
+
+ retr.c: Fix two memory leaks when proxy URL is bad
+ Reported by: Coverity bug 1188047
+
+2015-03-13 Darshit Shah <darnir@reniac.com>
+
+ Docs: --post-file is binary data
+ Wget considers the file mentioned in the --post-file argument as a
+ binary file and does not strip any control characters. The lack of this
+ information in the documentation can cause a lot of headaches debugging
+ for a simple issue
+
+2015-03-09 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ maint: update copyright year ranges to include 2015
+
+ NEWS: Prepare new development cycle
+
+2015-03-09 Yousong Zhou <yszhou4tech@gmail.com>
+
+ Fix --content-on-error option handling.
+ * src/http.c: Log --content-on-error downloads.
+ * src/retr.c (retrieve_url): Register the download of an error page
+ when --content-on-error is specified.
+
+ testenv: add test case Test--convert-links--content-on-error.py.
+ * testenv/Makefile.am: Register the new test.
+ * testenv/Test--convert-links--content-on-error.py: Add test case for
+ the combination of --convert-links and --content-on-error.py.
+
+ testenv: fix http_server.py with Response and Authentication.
+ * testenv/exc/server_error.py: Try writing file content for GET
+ request even if there is a Response rule present.
+ * testenv/server/http/http_server.py: Likewise.
+
+ testenv: improve color output a bit.
+ * testenv/misc/colour_terminal.py: Only print color codes when stdout
+ isatty().
+
+ testenv: typo and style fix.
+ * testenv/server/http/http_server.py(BaseTest): Add docstring; use raw
+ string for regex.
+ * testenv/server/http/http_server.py(_Handler): Typo fix.
+ * testenv/conf/server_files.py(ServerFiles): Code style change for
+ readability plus another typo fix.
+
+2015-03-09 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: tag 1.16.3
+
+2015-03-08 Anderson Goulart <global@kokre.com>
+
+ src/main.c (--no-verbose): don't show progress bar
+ Fixes #44431
+
+2015-03-06 Darshit Shah <darnir@reniac.com>
+
+ main.c: Use assertion to test buffer size
+
+2015-03-02 Darshit Shah <darnir@gmail.com>
+
+ main.c: Need to explicitly disallow show_progress in -q
+
+2015-02-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: add other items and tag 1.16.2
+
+ gnulib: sync gnulib
+
+2015-02-27 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ NEWS: Update file
+
+2015-02-23 Eli Zaretskii <eliz@gnu.org>
+
+ warc.c: native uuid generation on Windows
+ * warc.c (windows_uuid_str) [WINDOWS]: New function specific to
+ MS-Windows.
+ (warc_uuid_str) [WINDOWS]: If windows_uuid_str succeeds, use its
+ result; otherwise use the fallback method.
+
+2015-02-18 Gisle Vanem <gvanem@yahoo.no>
+
+ idn: use idn_free() to free allocated libidn memory
+ xfree() might crash on libidn memory on Windows.
+
+ From 'man idn_free':
+ "Under Windows, different parts of the same application may use different
+ heap memory, and then it is important to deallocate memory allocated within
+ the same module that allocated it. This function makes that possible."
+
+2015-02-10 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ gettext: Use gnulib's gettext.h for compatibility
+ Fixes issues with gettext on Solaris
+ Reported-by: Kiyoshi KANAZAWA <yoi_no_myoujou@yahoo.co.jp>
+
+ src/openssl.c: Use SSL_state() instead of ssl_st.state
+ Changes in OpenSSL 1.0.2 API hides ssl_st structure members.
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2015-01-31 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * README.checkout: Remove duplicated word
+
+ * cfg.mk (VC_LIST_ALWAYS_EXCLUDE_REGEX): Add ChangeLog-2014-12-10.
+
+2015-01-27 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ README.checkout: Mention libio-socket-ssl-perl to be installed
+
+2015-01-22 Dagobert Michelsen <dam@opencsw.org>
+
+ tests/Makefile.am: Solaris needs libintl and libiconv for testsuite
+
+2015-01-20 Darshit Shah <darnir@gmail.com>
+
+ progress bar: Allow display on stderr alongwith -o
+ This commit causes the --show-progress option to print the progress bar
+ to stderr even when a logfile was explicitly provided on the command
+ line. Such a combination allows a user to log the output of Wget while
+ simultaneously keeping track of the download status.
+
+2015-01-18 Darshit Shah <darnir@gmail.com>
+
+ gnulib: Pull submodule forward
+
+2015-01-16 Mathieu Parent <math.parent@gmail.com>
+
+ src/connect.c: More verbose error message (tiny change)
+ This fixes Debian bug #144076.
+
+2015-01-04 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ src/ftp-basic.c: Accept 5-digit port numbers in EPSV responses
+ Reported-by: Adam Sampson <ats@offog.org>
+
+2015-01-02 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ README.checkout: Add libpcre, pkg-config, libgnutls
+ Add description for libpcre
+ Add description for pkg-config
+ Add description of GnuTLS
+ Add 2014,2015 copyright year
+ Use ASCII copyright characters
+
+2014-12-27 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ src/http.c: Revert commit d81a8d5f56fca2746c4ad83d764bd24adcfbe927
+ The removal of the 'redundant' condition was a failure.
+ Fixes: #43876
+ Reported-by: Sean Jensen-Grey <seanj@xyke.com>
+
+2014-12-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ configure.ac: Skip pkg-config for opensl and gnutls when prefix is given
+ Make --with-libssl-prefix and --with-libgnutls-prefix do the right thing,
+ no matter if pkg-config is installed or not.
+
+ Reported-by: Charles Diza <chdiza@gmail.com>
+
+2014-12-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ src/main.c, src/warc.c: Use gnulib's base_name() instead of basename()
+ Reported-by: Eli Zaretskii <eliz@gnu.org>
+
+2014-12-24 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ Generate distributed ChangeLog from git log
+ * bootstrap.conf (gnulib_modules): Add "gitlog-to-changelog".
+ * Makefile.am: Generate the ChangeLog file from the git log and
+ the old ChangeLog data.
+
+ merge ChangeLog files in ChangeLog-2014-12-10.
+ * ChangeLog: truncate file.
+ * ChangeLog.README: Likewise.
+ * doc/ChangeLog: Likewise.
+ * msdos/ChangeLog: Likewise.
+ * src/ChangeLog: Likewise.
+ * testenv/ChangeLog: Likewise.
+ * tests/ChangeLog: Likewise.
+ * ChangeLog-2014-12-10: New file.
+ * Makefile.am: Distribute ChangeLog-2014-12-10.
+
+2014-12-21 Eli Zaretskii <eliz@gnu.org>
+
+ src/utils.c: Don't include termios.h on Windows
+
+2014-12-21 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ tests/FTPServer.pm: Fix ftp tests for Windows
+ The Single Unix strftime format specifier %e is not supported by
+ MS Windows. Instead we now use %d.
+
+ Reported-By: Eli Zaretskii <eliz@gnu.org>
+
+2014-12-21 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ gnulib: Use basename() from gnulib module 'dirname'
+ Avoid basename incompatibilities between POSIX and GNU implementations.
+ Also, libgen.h isn't needed any more which increases compatibility.
+
+2014-12-21 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ contrib/check-hard: delete trailing whitespaces and repeated word
+
+2014-12-21 Benno Schulenberg <bensberg@justemail.net>
+
+ * src/main.c (print_help): Indent description continuation lines by two spaces.
+
+ * src/main.c (print_help): Don't use a possessive instead of a plural.
+
+ * src/main.c (print_help): Don't use the backtick as a left quote mark in the help text.
+
+ * src/main.c (print_help): Remove the full stops from option descriptions.
+ And use semicolons to separate multiple phrases in a description.
+
+ * src/main.c (print_help): Make all option descriptions start with a lowercase letter.
+ Also spell URL consistently in all uppercase, and fix the grammar.
+
+2014-12-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ doc/wget.texi: Add 'https_only' in 'wgetrc commands' section
+ Reported-By: Eli Zaretskii <eliz@gnu.org>
+
+2014-12-20 Eli Zaretskii <eliz@gnu.org>
+
+ tests/WgetTests.pm: Print timestamps when tests fail due to wrong timestamps
+
+2014-12-19 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ sample.wgetrc: Fix wrong command 'locale' into 'localencoding'
+ Reported-by: Eli Zaretskii <eliz@gnu.org>
+
+ wget.texi: Clarify wgetrc command syntax
+ Reported-by: Eli Zaretskii <eliz@gnu.org>
+
+2014-12-18 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ configure.ac: Fix libuuid and uuid_create detection
+ --with-libuuid now explictly asks for libuuid.
+ --without-libuuid ignores libuuid and tries to use libc builtin functions.
+ Else try builtin functions first, libuuid second and fallback to Wget's own
+ function.
+
+2014-12-17 Yuriy M. Kaminskiy <yumkam@gmail.com>
+
+ src/log.c: Fix unexpected termination in logprintf (tiny change)
+ When errno was set to EPIPE before call to logprintf (e.g. during close of
+ SSL connection that was reset by peer), it will unexpectedly terminate wget.
+ It should exit only when EPIPE was triggered by logging code.
+
+ Regression by 0b5b100fc9aaa54257ffa16a083a862c031c335b
+
+2014-12-17 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ configure.ac: Check for RAND_egd() in pkg-config success code
+
+ src/main.c: Conditionally print help for --random-file and --egd-file
+ --random-file is only relevant when compiled with either OpenSSL or LibreSSL.
+ --egd-file is only relevant when compiled with OpenSSL
+
+ src/init.c: Fix indentation for crlfile option
+
+ wget.texi: Document --random-file and --egd-file as OpenSSL only
+
+2014-12-17 Jérémie Courrèges-Anglas <jca@wxcvbn.org>
+
+ openssl: Detect the availability of RAND_egd (tiny change)
+ Alternatives like LibreSSL don't provide RAND_egd() anymore.
+ Fixes compilation on OpenBSD.
+
+ Fix use of uuid libc functions (tiny change)
+ * Always attempt to detect uuid.h and uuid_create().
+ * Split libuuid and uuid.h implementations of warc_uuid_str(), since
+ those APIs vary significantly.
+ * Correctly use the uuid.h functions
+
+2014-12-16 Darshit Shah <darnir@gmail.com>
+
+ Revert "ChangeLog: Move all ChangeLog files to .pre-gitlog"
+ This reverts commit fcd3b3c473be25c4967fd8139d976e76faaef1b6.
+
+ Turns out that removing the ChangeLog files causes the Wget build to
+ fail. While this issue is investigated and sorted out, the commit is
+ reversed to allow people to be able to build Wget from master
+
+2014-12-16 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ contrib: Added script contrib/check-hard to check Wget status
+ This script automates some tests, e.g. testing with and without valgrind,
+ using different configure options. It is aimed at developers to execute
+ before pushing commits.
+
+2014-12-16 Cong Ma <cma@pmo.ac.cn>
+
+ ftp: fix invalid pointer dereference in getftp() (tiny change)
+ The pointer respline in use after being passed to ftp_response() may be
+ uninitialized if ftp_response() fails. Ensure that respline be used
+ after checking the return value of ftp_response().
+
+2014-12-15 Darshit Shah <darnir@gmail.com>
+
+ ChangeLog: Move all ChangeLog files to .pre-gitlog
+ From v1.16.1 onwards, Wget no longer maintains an active ChangeLog file.
+ Instead the ChangeLog will be automatically generated on each release
+ through gnulib's gitlog-to-changelog script. However, the old versions
+ of the ChangeLog files are retained for reference. These files are
+ renamed with a .pre-gitlog appended to their filenames.
+ Also removed ChangeLog.README file which is not required anymore
+
+2014-12-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ src/iri.c: Call xstrndup instead of strndup
+ strndup() does not exist in some older C libraries, also xstrndup()
+ exits on memory allocation failures.
+
+ bootstrap.conf: Add module 'getline'
+ This function does not exist in some older C libraries.
+
+2014-12-12 Tim Rühsen <tim.ruehsen@gmx.de>
+
+ src/iri.c: Use c_strcasestr instead of strcasestr
+ This also fixes a problem with strcasestr not being in the
+ boostrap.conf module list.
+
+ Reported-by: Kiyoshi KANAZAWA <yoi_no_myoujou@yahoo.co.jp>
+
+2014-12-11 Friedrich Haubensak <hsk@fli-leibniz.de>
+
+ Add support for older versions of flex (tiny change)
+ E.g. flex 2.5.4 (Solaris 10) does not like a space after -o.
+
+2014-12-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/Makefile.am: Support older versions of flex
+
+2014-12-10 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Check for pcre.h
+
+2014-12-08 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * cfg.mk (local-checks-to-skip): Add sc_cast_of_argument_to_free.
+
+2014-12-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/Makefile.am: Removed reference to cmpt.c
+
+2014-12-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Fix message for when GnuTLS has not been found.
+
+2014-12-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * bootstrap.conf: Add modules fnmatch, memrchr, strcase, strptime,
+ strtoll, timegm
+ Remove module strcasecmp
+ Use module spawn-pipe instead of deprecated module pipe
+
+2014-12-04 Darshit Shah <darnir@gmail.com>
+
+ * src/wget.h: Define MIX and MAX macros globally for all files
+ * src/gnutls.c, retr.c: Delete declaration of MIN macro
+ * src/http.c, progress.c: Delete declaration of MIN and MAX macros
+
+2014-12-04 Darshit Shah <darnir@gmail.com>
+
+ * src/ftp.c (getftp): Remove a call to assert(1) and replace with error message.
+ Also fix indentation
+
+2014-12-03 Jérémie Courrèges-Anglas <jca@wxcvbn.org> (tiny change)
+
+ * src/openssl.c (ssl_init): Allow pfs to be used with protocols other than
+ TLSv1.
+
+2014-12-03 Gisle Vanem <gvanem@yahoo.no>
+
+ * src/openssl.c (ssl_init): Fix C89 warning
+
+2014-12-03 Gisle Vanem <gvanem@yahoo.no>
+
+ * src/mswindows.c (ws_cleanup): Fix compiler error
+
+2014-12-01 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/connect.c, iri.c, url.c, warc.c: Fix issues reported
+ by static code analysis tool 'parfait'.
+
+ Closes: #41235
+ Reported-by: Jiri Kukacka
+
+2014-11-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/utils.h: xfree() sets argument to NULL after freeing,
+ removed xfree_null()
+ * src/connect.c, cookies.c, ftp-basic.c, ftp-ls.c, ftp.c hash.c,
+ host.c, html-url.c, http.c, init.c, iri.c, log.c, main.c,
+ mswindows.c, netrc.c, openssl.c, recur.c, res.c, retr.c,
+ url.c, warc.c: Replaced xfree_null() by xfree()
+
+2014-11-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Fix length of program_argstring,
+ fix regression introduced with commit
+ 9217b864d865cf1766e1589d138c8fc17d3d3d5c.
+
+2014-11-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gettext.h: Removed this file
+ * src/wget.h: Do not include gettext.h, include libintl.h directly,
+ define _() as gettext() shortcut.
+
+ The header file gettext.h is simply not needed.
+
+2014-11-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/Makefile.am: Removed gettext.h
+
+2014-11-27 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c, gettext.h, init.c, retr.c, url.c, warc.c: Replace usage of
+ free() with xfree() macro.
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/HTTPServer.pm: Substitue server port in HTTP headers
+
+ This allows us to use references like
+ "Location" => "http://localhost:{{port}}/whatever
+ in test cases.
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/Makefile.am: Removed Test-auth-both.py from XFAIL_TESTS
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/recur.c: Fix blacklisting of URLs to download
+
+ Fixes a reported crash and prevents multiple downloads of the
+ same file in case the URL is escaped in different ways.
+
+ The crash has been
+ Reported-by: Frédéric <vfrederix@gmail.com>
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/recur.c: Add space after function names
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: Select strongest challenge from WWW-Authenticate,
+ support multiple challenges per header line.
+
+2014-11-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): Implement missing code for
+ --secure-protocol=TLSv1_1|TLSv1_2, print message before abort()
+ for missing protocol implementations.
+ * src/openssl.c (ssl_init): Print message before abort() for
+ missing protocol implementations.
+
+2014-11-26 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * testenv/Makefile.am (TESTS): Add Test-redirect-crash.py.
+ * testenv/Test-redirect-crash.py: New File.
+
+2014-11-25 Pär Karlsson <feinorgh@gmail.com>
+
+ * src/Makefile.am: Added missing version.h to wget_SOURCES
+
+2014-11-25 Darshit Shah <darnir@gmail.com>
+
+ * bootstrap.conf: Add flex as a prerequisite to building Wget from the
+ repository sources
+
+2014-11-24 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/wget.h, test.c, main.c: Make program_name and program_argstring const
+
+2014-11-24 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/warc.c: Fix C89 compile errors using ./configure --without-libuuid
+
+2014-11-24 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/warc.c, warc.h, http.c: Add size of buffer to warc_timestamp()
+
+2014-11-24 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/retrc.c: Fix possibly uninitialized variable
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/wget.h: Make extern declaration for program_name
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/wget.h: Make extern declaration for program_argstring.
+ * src/warc.c: Remove extern declaration
+ * src/test.c: Make program_argstring a char *, instead of const char *.
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/version.h: New file. Add extern declarations for globally shared strings
+ * src/Makefile.am: Have version.c import version.h
+ * src/main.c: Import version.h and remove old extern declarations
+ * src/http.c: Same
+ * src/warc.c: Same
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/version.h: Add extern for compilation_string
+ * src/main: Remove declaration for compilation_String
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/utils.c (abort_run_with_timeout): The sig parameter is not used. Mark it
+ as such.
+ (abort_run_with_timeout): One implementation of this function did not
+ specify _Noreturn. Add it.
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/retr.h: Declare extern variable numurls
+ * src/http.c: Remove extern declaration for numurls
+ * src/ftp.c: Same
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/hosts.c (address_list_set_faulty): Add a helpful error message for when a
+ logical assumption fails
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c (discard_matching_cookie): Replace defensive assert with a
+ logical check and error message
+
+2014-11-22 Darshit Shah <darnir@gmail.com>
+
+ * build-aux/build_info.pl: Include version.h in the final C file generated
+ by the script.
+
+2014-11-21 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/server/http/http_server.py: Fixed typo Blackisted to Blacklisted
+
+2014-11-21 Daniel Stenberg <daniel@haxx.se>
+
+ * src/iri.c (remote_to_utf8): Fix compiler warning
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/progress.c: Fix code for undefined USE_NLS_PROGRESS_BAR
+
+ Reported-by: Gisle Vanem
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/cookies.c, ftp-basic.c, ftp-ls.c, ftp.c, html-url.c,
+ http.c, init.c, iri.c, main.c, progress.c, res.c, url.c,
+ utils.c, wget.h: Replaced strcasecmp and strncasecmp by
+ c_strcasecmp and c_strncasecmp where only ASCII string
+ comparison is wanted (instead of locale dependent).
+
+ Fixes possible issues with Wget running in a turkish locale.
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/Removed form feeds (\014) from *.c and *.h
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Fix libpsl<0.6.0 detection
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * NEWS: remove form feeds
+
+2014-11-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/cookies.c, ftp-basic.c, ftp.c, gnutls.c, host.c,
+ html-url.c, http.c, main.c, progress.c, retr.c, warc.c:
+ Trivial fixes for C89 compliancy.
+
+2014-11-20 Gisle Vanem <gvanem@yahoo.no>
+
+ * src/http.c (parse_content_disposition): Fix C89 issue found by MSVC 16
+
+2014-11-20 Gisle Vanem <gvanem@yahoo.no>
+
+ * src/build_info.c.in: Assume large file for WINDOWS
+
+2014-11-20 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Use pkg-config for libpsl detection
+ config status for libpsl is reflected by $with_libpsl
+
+2014-11-20 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Use autoconf macros where available
+
+2014-11-20 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Change option to --enable-assert. Assertions are disabled by
+ default.
+ * NEWS: Edit to reflect default option.
+ * README.checkout: Document --enable-assert for developers
+
+2014-11-20 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Add the -Wextra flag when no CFLAGS are set
+
+2014-11-20 Darshit Shah <darnir@gmail.com>
+
+ * .gitignore: po/stamp-po should be ignored
+
+2014-11-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Check for random()
+
+2014-11-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c (random_float, random_number): Use random() and
+ srandom() if available.
+
+ Reported-by: Coverity scanner
+
+2014-11-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c (ssl_check_certificate): Fix memory leak
+
+2014-11-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_init): Report load failure of cert files from
+ cert directory only with --debug. Fixes #41331.
+
+2014-11-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-basic.c (ftp_epsv): Fix loop check
+
+ Reported-by: Coverity scanner
+
+2014-11-19 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test-504.py: Add new test case to show how Wget handles 504 Gateway
+ Timeouts
+ * testenv/Makefile.am: Add Test-504.py to TESTS
+
+2014-11-19 Darshit Shah <darnir@gmail.com>
+
+ * src/utils.c (compile_posix_regex): Fix memory leak due to unfreed regex
+ pointer
+
+2014-11-19 Darshit Shah <darnir@gmail.com>
+
+ * src/progress.c (create_image): Do not scroll filename if amount of scrolling
+ is less than MIN_SCROLL_TEXT
+ * src/retr.c (fd_read_body): Do not print the directory prefix in the progress
+ bar
+
+2014-11-19 Darshit Shah <darnir@gmail.com>
+
+ * src/main.c (format_and_print_line): Fix potential memory leak
+
+2014-11-19 Darshit Shah <darnir@gmail.com>
+
+ * src/exits.c (get_status_for_err): GATEWAYTIMEOUT is a Server Error and Wget's
+ exit code should reflect that
+ * src/wget.h: Add GATEWAYTIMEOUT as an error
+ * src/http.c (http_loop): Gateway timeout errors should be non-fatal
+
+2014-11-18 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/Fix warnings from clang-analyzer 3.6
+
+ gnutls.c:457:3: warning: Value stored to 'err' is never read
+ err = 0;
+ http-ntlm.c:477:5: warning: Value stored to 'size' is never read
+ size = (size_t) snprintf (ntlmbuf, sizeof(ntlmbuf),
+ http.c:1479:3: warning: Attempt to free released memory
+ xfree_null (hs->error);
+
+2014-11-17 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/server/http/http_server.py: allow case-insensitive auth-type,
+ send BasIc and DIgest to provoke Wget failures with turkish locales
+
+2014-11-17 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * bootstrap.conf (gnulib_modules): Add module c-strcase
+
+2014-11-17 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: code cleanup for redirect_output_signal()
+
+2014-11-17 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c: use c_strncasecmp() in BEGINS_WITH macro
+ and in STARTS macro
+
+2014-11-17 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/ftp.h: removed unused variable ftp_last_respline
+ * src/init.c, test.c, warc.c: removed 'make check'compiler warnings
+
+2014-11-16 Tom Li <biergaizi2009@gmail.com>
+
+ * src/progress.c (create_image): Ensure that the last character of the filename
+ is scrolled to
+
+2014-11-16 Darshit Shah <darnir@gmail.com>
+
+ * po/stamp-po: Remove autogenerated file from checked out sources
+
+2014-11-16 Darshit Shah <darnir@gmail.com>
+
+ * gnulib: Update submodule
+ * bootstrap: Update script from latest gnulib
+
+2014-11-16 Darshit Shah <darnir@gmail.com>
+
+ * .gitignore: Sort gitignore file based on directories
+
+2014-11-15 Darshit Shah <darnir@gmail.com>
+
+ * testenv/certs/README: Remove trailing whitespaces
+
+2014-11-15 Darshit Shah <darnir@gmail.com>
+
+ * src/progress.c (create_image): Fix assertion that checks progress bar length
+ Should fix bug #43593
+
+2014-11-15 Darshit Shah <darnir@gmail.com>
+ * configure.ac: Add AC_HEADER_ASSERT. Enables --disable-assert option
+
+2014-11-12 Witchakorn Kamolpornwijit <witchakk@mit.edu> (tiny change)
+
+ * src/html-parse.c (map_html_tags): Fix range check
+
+2014-11-12 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c (ssl_init): Fix error handling for CRL loading
+
+2014-11-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/recreated the certs and the CRL file, also amended certs/README
+
+2014-11-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c (ssl_init): Load CRL file given by --crl-file
+
+2014-11-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Fix missing _Noreturn declaration specifiers
+
+ Reported-by: Gisle Vanem <gvanem@yahoo.no>
+
+2014-11-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): Always add Accept-Encoding: identity
+
+ Fixes bug #40819
+ Reported-by: Noël Köthe <noel@debian.org>
+
+2014-11-10 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/removed certs/wget-cert.pem
+ * testenv/added certs/ca-cert.pem, certs/ca-key.pem, certs/server-cert.pem,
+ certs/server-key.pem and certs/server-crl.pem
+ * testenv/added certs/README for description how to generate the certs and keys
+ * testenv/server/http/http_server.py: amended to work with new certs/ files
+ * testenv/added Test--https-crl.py to test --crl-file
+ * testenv/Makefile.am: added Test--https-crl.py
+ * testenv/Test--https.py: use --ca-certificate of --no-check-certificates
+
+2014-11-10 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c: Fix compile-time check for TLSv1.1 and TLSv1.2
+
+ Reported-by: Velemas Vosak <velemas@gmail.com>
+
+2014-11-09 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttps): Honour keep-alive when server responds with a 416 Range
+ not Satisfiable
+
+2014-11-09 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Remove redundant condition evaluation
+
+2014-11-06 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/init.c, main.c, options.h: added new option --crl-file
+ for specifying a CRL (Certificate Revocation List) file.
+ * src/gnutls.c: load CRL file given by --crl-file
+
+ Reported-by: Noël Köthe <noel@debian.org>
+
+2014-11-06 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: added description for --crl-file
+
+2014-11-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-stdouterr.px: fix skip exit code to 77
+
+2014-11-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Makefile.am: added $(LIB_CLOCK_GETTIME) to unit test linkage
+
+ Reported-by: kdevel@vogtner.de
+
+2014-11-05 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: check for python3
+ * Makefile.am: only use python test suite if python3 found
+
+2014-11-05 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * contrib/tsocked-wget (TSOCKS_CONF_FILE): Remove empty new-line.
+
+2014-11-04 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/iri.c (do_conversion): fix quote() misuse
+ * src/iri.c (remote_to_utf8): fix segfault on do_conversion() error
+
+ Reported-by: Mikael Magnusson <mikachu@gmail.com>
+
+2014-11-04 Darshit Shah <darnir@gmail.com>
+
+ * README.checkout: Bootstrap script is ./bootstrap not ./bootstrap.sh
+
+2014-11-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/added new test Test-proxied-https-auth-keepalive.px
+
+2014-11-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-proxied-https-auth.px: add valgrind support,
+ sync parent / child (client / server)
+
+2014-11-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/log.c: turn on automatic format check for log_vprintf_internal()
+
+2014-11-03 Pär Karlsson <feinorgh@gmail.com>
+ * tests/WgetFeature.pm: Fixed finding of WgetFeature.cfg when using separate
+ build dirs.
+ * tests/WgetFeature.pm: Fixed warning from BLOCK eval, made it indo EXPR eval
+
+2014-11-03 Jakub ÄŒajka <jcajka@redhat.com>
+
+ * src/iri.c (remote_to_utf8): Fixed assumption that char is signed. Fixes
+ fellowing test case failures idn-cmd-utf8, idn-robots-utf8, if char is
+ unsigned.
+
+2014-11-01 Mike Frysinger <vapier@gentoo.org>
+
+ * configure.ac: Use pkg-config to check for zlib presence and
+ fallback to the previous code if that doesn't work.
+
+ * configure.ac: Use pkg-config to check for libuuid presence and
+ fallback to the previous code if that doesn't work.
+
+ * configure.ac: Use pkg-config to check for pcre presence and
+ fallback to the previous code if that doesn't work.
+
+ * configure.ac: Use pkg-config to check for openssl presence and
+ fallback to the previous code if that doesn't work.
+
+ * configure.ac: Use pkg-config to check for gnutls presence and
+ fallback to the previous code if that doesn't work.
+
+2014-11-01 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/http.c (gethttp): Do not check for "Connection: close" header
+ only when the Content-Length is specified.
+
+2014-11-01 Darshit Shah <darnir@gmail.com>
+
+ * src/progress.c (create_image): Extra padding for size_grouped_diff has already
+ been added. Do not add that again.
+ (create_image): Assert that the progress bar being drawn is lesser than the
+ size of the screen.
+
+2014-11-01 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Fix check for libpsl
+
+2014-10-31 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c: make _get_rfc2253_formatted() static
+
+2014-10-31 Pär Karlsson <feinorgh@gmail.com>
+ * tests/WgetTests.pm: Proper conditional operators, tidied up code, idiomatic
+ improvements as per modern Perl best practices.
+ * tests/WgetFeature.pm: Tidied up code, idiomatic improvements for readability
+ * tests/FTPServer.pm: Tidied up code (perltidy -gnu)
+ * tests/FTPTest.pm: Likewise
+ * tests/HTTPServer.pm: Likewise
+ * tests/HTTPTest.pm: Likewise
+
+2014-10-30 Mike Frysinger <vapier@gentoo.org>
+
+ * tests/WgetFeature.pm: fix skip exit code to 77
+
+2014-10-30 Mike Frysinger <vapier@gentoo.org>
+
+ * src/openssl.c: fix implicit decl warning
+
+2014-10-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/openssl.c: print cert subject and issuer RFC2253 compliant
+ * src/openssl.c (ssl_check_certificate): removed memory leak
+
+2014-10-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): use CLOSE_INVALIDATE instead of fd_close
+
+2014-10-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): fix memory leak
+
+2014-10-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (CLOSE_FINISH): always set fd invalid after close
+
+2014-10-29 Peter Meiser <meiser@gmx-topmail.de> (tiny change)
+
+ * src/openssl.c (ssl_init) [! OPENSSL_NO_SSL3]: Add guard for OpenSSL
+ without SSLv3.
+
+2014-10-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-proxied-https-auth.px: synchronize client and server
+
+2014-10-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: check for strlcpy()
+
+2014-10-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: add --enable-valgrind-tests
+
+2014-10-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c: added strlcpy(), concat_strings() rewritten
+ * src/utils.h: added strlcpy()
+
+2014-10-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/ftp.c (ftp_loop_internal): Fix memory leak
+ * src/http.c (gethttp): Fix two memory leaks
+ * src/init.c (cleanup): Fix compile errors and warnings
+ * src/init.c (cleanup): Free more opt variables
+ * src/main.c (main): Fix two memory leaks
+ * src/retr.c (retrieve_url): Fix two memory leaks
+ * src/retr.c (retrieve_url): Add iri to call to url_parse()
+ * src/url.c (url_parse): Fix memory leak
+
+2014-10-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * tests/Makefile.am: Replace $FOO with @VAR@.
+
+2014-10-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/Makefile.am: Replace $FOO with @VAR@.
+
+2014-10-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * doc/Makefile.am: Replace $FOO with @VAR@.
+
+2014-10-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * cfg.mk (local-checks-to-skip): Add sc_makefile_at_at_check.
+
+ * Makefile.am: Replace $FOO with @VAR@.
+
+2014-10-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/WgetTests.pm (run): generate valgrind command line if requested
+ * tests/Makefile.am: set/export VALGRIND_TESTS
+
+2014-10-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/test/base_test.py (gen_cmd_line): generate valgrind command line if requested
+ * testenv/README: amend description of VALGRIND_TESTS
+ * testenv/Makefile.am: set/export VALGRIND_TESTS
+
+2014-10-22 Ãngel González <keisial@gmail.com>
+
+ * src/css-url.c (get_uri_string): Honor the specified length argument.
+
+2014-10-21 Matthew Atkinson <mutley456@ntlworld.com> (tiny change)
+
+ * src/http.c (gethttp): Always send Content-Length header when method is POST,
+ PUT, or PATCH even with no post body, as some servers will reject the
+ request otherwise.
+
+2014-10-16 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/url.c (url_parse): little code cleanup
+ * src/html-url.c (get_urls_html): HTTP header Content-Type charset preceeds http-equiv
+ * src/iri.c (do_conversion): moved iconv code completely into the function
+ * src/iri.c (do_conversion): call url_unescape to fix charset conversion
+ * src/iri.c (remote_to_utf8): use strcasecmp to compare encoding
+
+ * src/gnutls.c (ssl_connect_wget): do not use SSLv3 except explicitely requested
+ * src/openssl.c (ssl_init): do not use SSLv3 except explicitely requested
+
+2014-10-16 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi (Download Options): update --secure-protocol description
+
+2014-10-08 Nikolay Morozov <n.morozov@securitycode.ru>
+ Sergey Lvov <s.lvov@securitycode.ru>
+
+ * src/init.c (cmd_spec_secure_protocol): Add support for
+ TLS v1.1 and TLS v1.2 protocols
+ * src/openssl.c (ssl_init): Add support for OpenSSL engines
+
+2014-10-08 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Makefile.am: Fix EXTRA_DIST variable for make distcheck
+ * testenv/server/http/http_server.py (HTTPServer.__init__): Fix how CERTFILE is
+ found when running make dist / make distcheck.
+
+2014-10-06 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-iri.px: fixed encodings
+ * tests/Test-iri-forced-remote.px: fixed encodings
+ * tests/Test-iri-percent.px: fixed encodings
+ * tests/Test-idn-meta.px: fixed encodings
+
+2014-10-02 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/tests/WgetTests.pm: use filename as default test name
+ * tests/tests/Test-*.px: removed redundant 'name => ...'
+
+2014-10-01 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/tests/Makefile.am: remove run-px, fixing dist-check
+
+2014-10-01 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test--post-file.px: name => "Test--post-file", fixing race
+ condition.
+ * tests/Test-N-no-info.px: name => "Test-N-no-info", fixing race
+ condition.
+ * tests/Test-N-smaller.px: name => "Test-N-smaller", fixing race
+ condition.
+ * tests/Test-c-shorter.px: name => "Test-c-shorter", fixing race
+ condition.
+ * tests/Test-proxy-auth-basic.px: name => "Test-proxy-auth-basic",
+ fixing race condition.
+ * tests/Test-proxied-https-auth.px: removed debug print line.
+
+2014-10-01 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Makefile.am: Run the tests in Python's Optimizedmode
+ * testenv/conf/__init__.py (gen_hook): Use try..except instead of if..else
+ * testenv/misc/color_terminal.py: System and check will not change while a test is
+ run. Do not test for them on every invocation of printer()
+ * testenv/server/http/http_server.py: The ssl and re modules are required by
+ specific functions. Load them lazily
+ (HTTPSServer.__init__): Lazy load ssl module here
+ (_handler.parse_range_header): Lazy load re module here
+ (_Handler.get_rule_list): get() can return a default value. Use it
+ (_Handler.guess_type): Same
+ (_Handler.is_authorized): Unused function artefact. Remove
+ (_Handler.reject_headers): Unused function artefact. Remove
+
+2014-09-30 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * testenv/test/base_test.py: Add --track-origins=yes to valgrind testing
+
+2014-09-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Makefile.am: Modified to use parallel test harness
+ * tests/Test-proxied-https-auth.px: get $top_srcdir from ENV
+ * tests/run-px: removed
+ * tests/WgetTest.pm.in: removed
+ * tests/WgetTest.pm: get $top_srcdir from ENV
+
+2014-09-25 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: removed WgetTest.pm.in
+ * .gitignore: removed WgetTest.pm
+
+2014-09-12 Darshit Shah <darnir@gmail.com>
+
+ * bootstrap.conf: Add GNULib module mbiter
+
+2014-09-08 Darshit Shah <darnir@gmail.com>
+
+ * src/init.c (defaults): Set retr-symlinks to true by default. This changes a
+ default setting of wget. Fixes security bug CVE-2014-4877
+
+2014-09-08 Darshit Shah <darnir@gmail.com>
+
+ * src/ftp.c (ftp_retrieve_glob): Also check for invalid entries along with
+ harmful filenames
+ (is_valid_entry): New function. Check if the provided node is a valid entry
+ in a listing file.
+
+2014-09-08 Darshit Shah <darnir@gmail.com>
+
+ * doc/wget.texi (symbolic links): Update documentation of retr-symlinks to
+ reflect the new default. Add warning about potential security issues with
+ --retr-symlinks=yes.
+
+2014-08-08 Darshit Shah <darnir@gmail.com>
+
+ * testenv/conf/__init__.py: Add extra newline according to PEP8
+ * testenv/conf/{authentication,expect_header,expected_files,expected_ret_code,
+ files_crawled,hook_sample,local_files,reject_header,response,send_header,
+ server_files,urls,wget_commands}.py: Add docstrings explaining the conf file
+ and how it should be used
+ * testenv/server/http/http_server (InvalidRangeHeader): Clear TODO and eliminate
+ this exception. Use ServerError for all such purposes.
+ (_Handler): Remove reference to InvalidRangeHeader
+ (_handler.parse_range_header): User ServerError instead of InvalidRangeHeader
+ (_Handler.do_GET): Add docstring
+ (_Handler.do_POST): Add docstring. Also create an empty dict for rules if
+ no rules are supplied. Send the Location header as suggested in RFC 7231
+ (_Handler.do_PUT): Don't pop the server file already. Push it to later in ..
+ (_Handler.send_put): .. Here. If the file exists respond with a 204 No
+ Content message and pop the file for replacement. Do not send the
+ Content-Length, Content-Type headers since PUT requests should not respond
+ with data.
+ (_Handler.parse_auth_header): Fit line within 80 chars
+ (_Handler.check_response): Better visual indent
+ (_Handler.authorize_digest): Better visual indent.
+ (_Handler.expect_headers): Remove unused function
+ (_Handler.guess_type): Fix indentation
+ (HTTPd): Add newline according to PEP8 guidelines
+ (HTTPSd): Fix indentation
+ (StoppableHTTPServer): Add docstring
+ (HTTPSServer): Fix indentation
+ (WgetHTTPRequestHandler): Merge class into _handler.
+ (_Handler): Add docstring
+ (_Handler.parse_range_header): Fix indentation
+ (ServerError): Split exception into separate file ...
+ * testenv/exc/server_error.py: ... Here
+ * testenv/misc/colour_terminal.py: Add docstring, fix indentation
+ * testenv/test/base_test.py: Fix visual indent
+ * testenv/test/http_test.py: Fit within 80 char lines
+
+2014-08-04 Darshit Shah <darnir@gmail.com>
+
+ * testenv/conf/server_conf.py: Delete file. Server configuration is now done via the
+ server_conf() method.
+ * testenv/server/http/http_server.py (StppableHTTPServer.server_sett): Delete
+ method required by the above hook
+ (HTTPd.server_sett): Same
+
+2014-08-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Download Options): Fix texinfo warning.
+
+2014-07-28 Ãngel González <keisial@gmail.com>
+ * contrib: Created contrib folder.
+ * contrib/tsocked-wget: Added wrapper for usage with socks proxy.
+
+2014-07-26 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test-*.py: Remove the '-d' switch from WGET_OPTIONS.
+ * testenv/test/base_test (BaseTest.gen_cmd_line): Add --debug and --no-config to the
+ list of switches passed to wget unconditionally.
+
+2014-07-25 Darshit Shah <darnir@gmail.com>
+
+ * .gitignore: Add a gitignore file for the project.
+
+2014-07-23 Darshit Shah <darnir@gmail.com>
+
+ * testenv/test/base_test.py (BaseTest.gen_cmd_line): Add support for running all
+ tests through valgrind if the relevant environment variable is set
+ * testenv/conf/expected_ret_code (ExpectedRetCode.__call__): Valgrind returns error
+ code 45 when it detects a memory leak.
+ * testenv/Readme: Update with details about valgrind tests
+
+2014-07-23 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Fix a memory leak when retrying authorization
+ (gethttp): Fix memory leak when trying to parse content disposition headers
+ (http_loop): Assigning a new value to *local)file without freeing the old
+ one causes a memory leak
+ (http_loop): Free the HTTP message and error strings before continuing loop
+
+2014-07-22 Darshit Shah <darnir@gmail.com>
+
+ * testenv/(README): Remove old TODO and document SERVER_WAIT variable
+
+2014-07-22 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Fix broken code for detecting libpsl
+
+2014-07-21 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c (check_domain_match): Fix a potential memory leak when checking
+ cookie domain names
+
+2014-07-21 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Fix check for Libpsl
+
+2014-07-21 Daniel Stenberg <daniel@haxx.se>
+
+ * src/main.c (print_help): HTTP Method is a part of the Request not Header
+
+2014-07-07 Tomas Hozza <thozza@redhat.com>
+
+ * src/iri.c (locale_to_utf8): Fix checking of iconv_open return code.
+
+2014-07-05 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Fix indentation of conditional block
+ (gethttp): Remove unneeded variable
+
+2014-07-05 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c (check_domain_match): Libpsl requires that all domain names
+ passed to it be in utf8 lower case.
+
+2014-07-03 Darshit Shah <darnir@gmail.com>
+
+ * src/wget.h (uerr_t): Remove unused error codes
+ * src/http.c: (http_loop): Remove reference to unused error code
+
+2014-06-30 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/convert.c (local_quote_string): Initialize newname.
+
+2014-06-29 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/warc.c (warc_write_date_header): Avoid out-of-scope variable usage.
+
+2014-06-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/Makefile.am (wget_SOURCES): Remove space-tab indentation.
+
+2014-06-28 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * cfg.mk (local-checks-to-skip): Remove some checks.
+
+2014-06-27 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * cfg.mk (VC_LIST_ALWAYS_EXCLUDE_REGEX): Ignore msdos/* and vms/* from
+ syntax-check.
+
+2014-06-22 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/warc.c [HAVE_UUID_CREATE]: Include <uuid.h>
+ (warc_uuid_str) [HAVE_UUID_CREATE]: Use uuid_create and
+ uuid_to_string to generate the UUID.
+ Reported by: Alex Zimnitsky <aavzz@yandex.ru>
+
+2014-06-22 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * configure.ac: Add check for uuid_create.
+
+2014-06-22 Darshit Shah <darnir@gmail.com> (tiny change)
+
+ * src/progress.c (create_image): Align percentage download output better.
+
+2014-06-22 Darshit Shah <darnir@gmail.com>
+
+ * testenv/(conf.files_crawled): diff is a set object and needs explicit str
+ conversion.
+
+2014-06-21 Nikita Vetrov <admin@kanaria.ru> (tiny change)
+
+ * src/openssl.c: Add one-time call OPENSSL_config in ssl_init.
+
+2014-06-21 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/mswindows.c (fake_fork_child): Fix build error.
+ Reported by: Gisle Vanem <gvanem@yahoo.no>.
+
+2014-06-19 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/mswindows.c (fake_fork_child): Revert dinamic allocation of
+ info->lfilename.
+ Reported by: Gisle Vanem <gvanem@yahoo.no>.
+
+2014-06-16 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/http.c (gethttp): Set "Connection: Keep-Alive" with keep-alive
+ connections when using a proxy too.
+ Reported by: Thorsten Schroeteler <Thorsten.Schroeteler@cassidian.com>.
+
+2014-06-16 Darshit Shah <darnir@gmail.com>
+
+ * src/test.c: Include locale.h header for gettext.
+
+2014-06-16 Darshit Shah <darnir@gmail.com>
+
+ * src/main.c (print_help, print_version): Mark as noreturn.
+ * src/utils.c (memfatal, abort_run_with_timout): Same
+
+2014-06-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * tests/Makefile.am: Remove @VAR@ with $FOO.
+
+ * tests/FTPTest.pm: Remove terminating empty lines.
+ * tests/HTTPServer.pm: Likewise.
+ * tests/HTTPTest.pm: Likewise.
+ * tests/Test--httpsonly-r.px: Likewise.
+ * tests/Test--no-content-disposition-trivial.px: Likewise.
+ * tests/Test--no-content-disposition.px: Likewise.
+ * tests/Test--spider-fail.px: Likewise.
+ * tests/Test--spider-r--no-content-disposition-trivial.px: Likewise.
+ * tests/Test--spider-r--no-content-disposition.px: Likewise.
+ * tests/Test--spider-r-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test--spider-r.px: Likewise.
+ * tests/Test--spider.px: Likewise.
+ * tests/Test--start-pos--continue.px: Likewise.
+ * tests/Test--start-pos.px: Likewise.
+ * tests/Test-E-k-K.px: Likewise.
+ * tests/Test-E-k.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition-1.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition-2.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-N--no-content-disposition-trivial.px: Likewise.
+ * tests/Test-N--no-content-disposition.px: Likewise.
+ * tests/Test-N-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-N-current.px: Likewise.
+ * tests/Test-N-no-info.px: Likewise.
+ * tests/Test-N-old.px: Likewise.
+ * tests/Test-N-smaller.px: Likewise.
+ * tests/Test-N.px: Likewise.
+ * tests/Test-O--no-content-disposition-trivial.px: Likewise.
+ * tests/Test-O--no-content-disposition.px: Likewise.
+ * tests/Test-O-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-O-nc.px: Likewise.
+ * tests/Test-O-nonexisting.px: Likewise.
+ * tests/Test-O.px: Likewise.
+ * tests/Test-Restrict-Lowercase.px: Likewise.
+ * tests/Test-Restrict-Uppercase.px: Likewise.
+ * tests/Test-auth-basic.px: Likewise.
+ * tests/Test-auth-no-challenge-url.px: Likewise.
+ * tests/Test-auth-no-challenge.px: Likewise.
+ * tests/Test-auth-with-content-disposition.px: Likewise.
+ * tests/Test-c-full.px: Likewise.
+ * tests/Test-c-partial.px: Likewise.
+ * tests/Test-c-shorter.px: Likewise.
+ * tests/Test-c.px: Likewise.
+ * tests/Test-cookies-401.px: Likewise.
+ * tests/Test-cookies.px: Likewise.
+ * tests/Test-ftp--start-pos.px: Likewise.
+ * tests/Test-ftp-bad-list.px: Likewise.
+ * tests/Test-ftp-iri-disabled.px: Likewise.
+ * tests/Test-ftp-iri-fallback.px: Likewise.
+ * tests/Test-ftp-iri-recursive.px: Likewise.
+ * tests/Test-ftp-iri.px: Likewise.
+ * tests/Test-ftp-list-Multinet.px: Likewise.
+ * tests/Test-ftp-list-UNIX-hidden.px: Likewise.
+ * tests/Test-ftp-list-Unknown-a.px: Likewise.
+ * tests/Test-ftp-list-Unknown-hidden.px: Likewise.
+ * tests/Test-ftp-list-Unknown-list-a-fails.px: Likewise.
+ * tests/Test-ftp-list-Unknown.px: Likewise.
+ * tests/Test-ftp-pasv-fail.px: Likewise.
+ * tests/Test-ftp-recursive.px: Likewise.
+ * tests/Test-ftp.px: Likewise.
+ * tests/Test-i-ftp.px: Likewise.
+ * tests/Test-i-http.px: Likewise.
+ * tests/Test-idn-cmd-utf8.px: Likewise.
+ * tests/Test-idn-cmd.px: Likewise.
+ * tests/Test-idn-headers.px: Likewise.
+ * tests/Test-idn-meta.px: Likewise.
+ * tests/Test-idn-robots-utf8.px: Likewise.
+ * tests/Test-idn-robots.px: Likewise.
+ * tests/Test-iri-disabled.px: Likewise.
+ * tests/Test-iri-forced-remote.px: Likewise.
+ * tests/Test-iri-list.px: Likewise.
+ * tests/Test-iri-percent.px: Likewise.
+ * tests/Test-iri.px: Likewise.
+ * tests/Test-k.px: Likewise.
+ * tests/Test-meta-robots.px: Likewise.
+ * tests/Test-nonexisting-quiet.px: Likewise.
+ * tests/Test-noop.px: Likewise.
+ * tests/Test-np.px: Likewise.
+ * tests/Test-proxy-auth-basic.px: Likewise.
+ * tests/Test-restrict-ascii.px: Likewise.
+ * tests/Test-stdouterr.px: Likewise.
+ * tests/WgetTest.pm.in: Likewise.
+
+2014-06-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/ftp.c: Replace main() with main in comments.
+ * src/http.c: Likewise.
+ * src/init.c: Likewise.
+
+ * src/cmpt.c (day_of_the_week): Remove repeated word in a comment.
+ * src/utils.c: Remove repeated word in a comment.
+
+ * src/gnutls.c: Do not include <assert.h>.
+
+ * src/connect.c: Do not depend on always defined macros.
+ * src/convert.c: Likewise.
+ * src/css-url.c: Likewise.
+ * src/hash.c: Likewise.
+ * src/mswindows.h: Likewise.
+ * src/netrc.c: Likewise.
+ * src/progress.c: Likewise.
+ * src/sysdep.h: Likewise.
+ * src/utils.c: Likewise.
+ * src/wget.h: Likewise.
+
+ * src/Makefile.am: Remove @VAR@ with $FOO.
+
+ * src/DESCRIP_MODS.MMS: Remove terminating empty lines.
+ * src/DESCRIP_SRC.MMS: Likewise.
+ * src/convert.c: Likewise.
+ * src/exits.c: Likewise.
+ * src/http.c: Likewise.
+ * src/init.c: Likewise.
+ * src/iri.c: Likewise.
+ * src/res.c: Likewise.
+ * src/spider.c: Likewise.
+ * src/test.c: Likewise.
+ * src/test.h
+ * src/url.c: Likewise.
+ * src/utils.c: Likewise.
+ * src/vms.c: Likewise.
+
+ * src/decc_ver.c (main): Ensure bindtextdomain is called.
+ * src/hash.c (main): Likewise.
+ * src/html-parse.c: Likewise.
+ * src/netrc.c: Likewise.
+ * src/test.c: Likewise.
+ * src/trunc.c: Likewise.
+
+2014-06-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * msdos/Makefile.DJ: Remove terminating empty lines.
+ * msdos/Makefile.WC: Likewise.
+ * msdos/msdos.c: Likewise.
+
+2014-06-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * doc/Makefile.am: Remove @VAR@ with $FOO.
+
+ * doc/fdl.texi: Remove terminating empty lines.
+
+2014-06-11 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * NEWS: Remove repeated word.
+
+ * po/POTFILES.in: Add lib/regcomp.c.
+
+ * configure.ac: Do not depend on always defined macros.
+ * vms/vms.h: Likewise.
+
+ * Makefile.am: Remove @VAR@ with $FOO.
+ * util/Makefile.am: Likewise.
+
+ * ABOUT-NLS: Remove terminating empty lines.
+ * MAILING-LIST: Likewise.
+ * util/rmold.pl: Likewise.
+
+ * util/trunc.c (main): Ensure bindtextdomain is called.
+
+2014-06-10 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/wget.h: Remove trailing whitespaces.
+
+ * src/retr.c (getproxy): Return a dinamically allocated string and...
+ (retrieve_from_file, retrieve_url, url_uses_proxy): ...fix the caller
+ to handle it.
+ * src/init.c (home_dir): Replace strncpy with strdup.
+ * src/mswindows.c (struct fake_fork_info): Make lfilename a pointer.
+ (fake_fork_child): Replace strncpy with strdup.
+ * src/http.c (ensure_extension): Replace strncpy with memcpy, not much
+ better but make "make syntax-check" happy and we know the size.
+ * src/ftp.c (getftp): Add parameter last_expected_bytes.
+ (ftp_loop_internal): Pass parameter last_expected_bytes to getftp.
+ * src/ftp-basic.c: Remove declaration of ftp_last_respline.
+ (ftp_response): Do not set ftp_last_respline.
+ * src/css-url.c (get_uri_string): Replace strncpy with strdup.
+ * src/vms.c (set_vms_name): Replace strncpy with strdup.
+
+ * src/exits.c: Move WGET_EXIT_* definitions to...
+ * src/exits.h: ...here. Add WGET_EXIT_GENERIC_ERROR, WGET_EXIT_PARSE_ERROR.
+ Remove WGET_EXIT_MINIMUM.
+ * src/init.c: Fix calls to exit().
+ * src/log.c: Likewise.
+ * src/main.c: Likewise.
+ * src/mswindows.c: Likewise.
+ * src/netrc.c: Likewise.
+ * src/utils.c: Likewise.
+ * src/warc.c: Likewise.
+ * src/Test-stdouterr.px: Likewise.
+
+2014-06-10 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * doc/wget.texi: Remove trailing whitespaces.
+
+ * doc/fdl.texi: Copy from gnulib.
+
+2014-06-10 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * build-aux/build_info.pl: Remove trailing whitespaces.
+ * configure.ac: Likewise.
+
+2014-06-08 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/main.c: Make `program_name' not static.
+
+ * src/cookies.c [HAVE_PSL]: Include <libpsl.h> only when HAVE_PSL is defined.
+
+2014-05-30 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c (check_domain_match): Use libpsl to check if the cookie domain
+ is valid. Also remove unneeded test for numeric addresses.
+
+2014-05-30 Darshit Shah <darnir@gmail.com>
+
+ * src/connect.{c,h}, convert.{c,h}, cookies.{c,h}, ftp-ls.c, ftp.h, gettext.h,
+ hash.h, host.h, html-parse.h, html-url.h, http.c, init.c, main.c, mswindows.c,
+ netrc.h, openssl.c, options.h, ptimer.h, recur.c, retr.c, sysdep.h, url.h,
+ vms.c, warc.c, wget.h: Whitespace and formatting changes only.
+
+2014-05-30 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Allow compilation without libpsl.
+ * README.checkout: Add libpsl as a dependency.
+
+2014-05-24 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * gnulib: update module.
+
+2014-05-24 Darshit Shah <darnir@gmail.com>
+
+ * doc/wget.texi: Document noscroll parameter to progress=bar
+
+2014-05-20 Darshit Shah <darnir@gmail.com>
+
+ * src/utils.c (human_readable): Add new parameters, acc and decimals for the
+ function. acc decides the number under which decimal values are shown for a
+ certain value, while decimals decides the number of decimal digits displayed
+ * src/utils.h (human_readable): Update declartion of the function
+ * src/ftp.c (print_length): Update call to human_readable
+ * src/http.c (gethttp): Same
+ * src/init.c (defaults): Enable scrolling filenames by default
+ * src/main.c (main): Update call to human_readable
+ * src/options.h (options): Add new option noscroll
+ * src/progress.c (create_image): Update the look of the progress bar. Human
+ readable download size by default and add support for noscroll.
+ (dot_set_params, bar_set_params): Change paramter to char * since strtok
+ needs to modify the string.
+ (bar_set_params): Add support for noscroll parameter to bar.
+
+2014-05-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/retr.c (retrieve_url): fixed memory leak
+
+2014-05-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Explicitly typecast strlen's output
+ * src/ftp.c (getftp): Prevent declaration of shadow variable
+ * src/html-url.c (tag_handle_base, tag_handle_form, tag_handle_link,
+ tag_handle_meta): Compiler directive to ignore unused variable
+ * src/html-url.h (cleanup_html_url): Add function declaration
+ * src/http-ntlm.c (ntlm_input, mkhash): Use ssize_t to declare variables that store
+ sizes.
+ (mkhash): Explicitly typecast output of c_toupper
+ (short_pair): Add typecasts to prevent compiler warnings
+ (ntlm-output): Fix datatypes of various variables
+ * src/http.c (gethttp): Prevent declaration of shadow variable err
+ (gethttp): remove unreachable code
+ (test_parse_content_disposition): Fix variable declarations and use
+ countof() macro
+ * src/init.c (run_command): Prevent declaration of ghost variable
+ (cmd_string, cmd_string_uppercase, cmd_file, cnd_vector,
+ cmd_directory_vector, cmd_spec_dirstruct, cmd_spec_header,
+ cmd_spec_warc_header, cmd_spec_htmlify, cmd_spec_mirror,
+ cmd_spec_prefer_family, cmd_spec_progress, cmd_spec_recursive,
+ cmd_spec_regex_type, cmd_spec_restrict_file_names, cmd_spec_report_speed,
+ cmd_spec_timeout, cmd_spec_useragent, cmd_spec_verbose): Add compiler
+ directive to ignore unused variable
+ (cleanup_html_url, spider_cleanup): Remove declarations
+ (test_commands_sorted): Cleanup code
+ (test_cmd_spec_restrict_file_names): Use correct data types
+ * src/iri.c (remote_to_utf8): Use more verbose variable name
+ * src/main.c (init_switches): Prevent declaration of ghost variable
+ * src/netrc.c (netrc_cleanup): Create cleanup function on common naming scheme
+ * src/netrc.h (netrc_cleanup): Declare function
+ * src/openssl.c (openssl_write, openssl_errstr): Compiler directive to ignore
+ unused parameter
+ (openssl_errstr): Explcicitly typecasr output of ASN1_STRING_length
+ * src/options.h (struct options): Declare includes and excludes as const char **
+ * src/progress.c (progress_interactive_p, progress_handle_sigwinch): Compiler
+ directive to ignore unused parameter
+ * src/res.c (test_is_robots_txt_url): Fix datatypes
+ * src/retr.c (line_terminator): Add compiler directive for ignoring unused
+ paramter. Remove unused variable.
+ * src/spider.h (spider_cleanup): Declare function
+ * src/test,c (main): declare unused paramter
+ * src/test.h (test_*): Declare functions
+ * src/url.c (url_string): Explicit typecast of password strings
+ (run_test): Declare *test, struct tests and *expected_result as const
+ (test_path_simplify, test_append_uri_pathl, test_are_urls_equal): Fix datatypes
+ * src/utls.c (fork_to_background): Be more verbose when errors occur
+ (dir_matches_p, test_dir_matches_p): Declare char * as const as required
+ (base64_encode, base64_decode, get_max_length): Set correct return type
+ (match_pcre_regex, match_posix_regex): Use correct datatypes and typecasts
+ (test_subdir_p): static const struct
+ * src/utils.h (base64_encode, base64_decode, get_max_length): Fix return type
+ * src/warc.c (ward_write_cdx_record): unused parameter
+ (struct hash_table *warc_cdx_dedup_table): Declare as static
+
+2014-05-01 Darshit Shah <darnir@gmail.com> (tiny change)
+
+ * src/progress.c (dot_finish): Do not print extra newlines when not in verbose
+ mode. (Purely aesthetic change)
+ (get_eta): Add extra space when eta is printed.
+ (create_image): Remove erroneous space from being added to progress bar when
+ filename > MAX_FILENAME_LEN
+ (create_image): Remove extra space before printed download speeds
+ Make the filename a fixed width column.
+
+2014-05-01 Darshit Shah <darnir@gmail.com>
+
+ * doc/wget.texi: Add documentation for --show-progress
+
+2014-05-01 Benjamin Goose <gans+wget@tngtech.com>
+
+ * src/http.c: Fix small memory leak
+
+2014-04-22 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (gethttp): Fix 204 response handling
+
+ * tests/Test-204.px: added file
+ * tests/run-px: added Test-204.px
+ * tests/Makefile.am: added Test-204.px
+
+
+2014-04-22 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * tests/Makefile.am (EXTRA_DIST): Add missing Test--start-pos.px,
+ Test-ftp--start-pos.px and Test--start-pos--continue.px.
+
+2014-04-19 Darshit Shah <darnir@gmail.com>
+
+ * src/log.h (log_options): Add new logging options, LOG_PROGRESS. All progress
+ bar related output should use LOG_PROGRESS.
+ * src/log.c (CHECK_VERBOSE): Implement LOG_PROGRESS output
+ * src/progress.c (dot_create, print_row_stats, dot_update, dot_finish,
+ bar_finish, display_image): Output progress information through LOG_PROGRESS
+ (progress_implementation, dot_create, bar_create, progress_create): The
+ progress bar create functions accept an extra paramter for the filename of the
+ local file
+ (bar_progress): Add new variable to store filename of currently downloading
+ file
+ (bar_finish): Aesthetic change. Print two newlines if in verbose mode, else
+ only one.
+ (MACRO): Define new macro, MIN
+ (create_image): Implement displaying filename in progress bar output
+ Filename tick implementation copied from Giuseppe's patch on parallel-wget
+ * src/progress.h (progress_create): Accept another parameter for filename
+ * src/http.c (gethttp): Remove unnecessary conditional
+ (read_response_body): Send local filename to fd_read_body so that it can be
+ printed on the progress bar
+ * src/main.c (option_data): Add new switch, --show-progress
+ (main): If in verbose output, show progress bar by default
+ (main): Set progress implemetation when displaying progress bar
+ (no_prefix): Increase buffer size to 2048 to prevent overflows
+ * src/init.c (commands): Add new command, showprogress
+ (defaults): By default initialize show_progress to false
+ * src/options.h (options): Add new option, show_progress
+ * src/retr.c (fd_read_body): Accept new parameter for filename of currently
+ downlaoding file
+ (fd_read_body): Create and update progress bar when opt.show_progress is set
+ (fd_read_body): Display progress information in Windows console titlebars
+ * src/retr.h (fd_read_body): Update declaration
+ * src/ftp.c (getftp): Send filename of the local file so that it can be printed
+ with the progress bar.
+
+2014-03-26 Darshit Shah <darnir@gmail.com>
+
+ * src/ftp.c (getftp): Rearrange parameters to fix compiler warning
+ * src/utils.c (get_dir_matches_p): Do not pass a const char** to a function that
+ expects char**
+
+2014-03-25 Daniel Stenberg <daniel@haxx.se>
+
+ * src/url.c (shorten_length): Remove unused function.
+
+2014-03-19 Yousong Zhou <yszhou4tech@gmail.com>
+
+ * src/init.c, main.c, options.h: Add option --start-pos for specifying
+ start position of a download.
+ * src/http.c: Utilize opt.start_pos for HTTP download.
+ * src/ftp.c: Utilize opt.start_pos for FTP retrieval.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/test: (new package) package for test case classes
+ * testenv/WgetTest.py: Split into test/base_test.py and test/http_test.py.
+ * testenv/Test-*.py: Optimize the imports according to changes of WgetTest.py
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/server: (new package) package for the server classes
+ * testenv/server.http: (new package) package for HTTP server
+ * testenv/server.ftp: (new package) package for FTP server
+ * testenv/HTTPServer.py: Move to server/http/http_server.py. Also change the
+ CERTFILE to '../certs/wget-cert.pem'.
+ * testenv/FTPServer.py: Move to server/ftp/ftp_server.py.
+ * testenv/WgetTest.py: Optimize import respect to the server classes.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/misc: (new package) package for miscellaneous modules
+ * testenv/ColourTerm.py: Move to package misc and rename to colour_terminal.py,
+ add print_color functions to reduce the use of string literals like
+ "BLUE", "RED" etc.
+ * testenv/WgetTest.py:
+ (CommonMethods.Server_setup): Change invocation to printer to print_blue.
+ (CommonMethods.FilesCrawled): Change invocation to printer to print_red.
+ (HTTPTest.__init__): Change invocations to printer to print_red and
+ print_green respectively.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/exc: (new package) package for miscellaneous exceptions
+ * testenv/WgetTest.py: Move TestFailed to exc/test_failed.py.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/conf: (new package) package for rule classes and hook methods
+ * testenv/WgetTest.py:
+ (CommonMethods.Authentication): Move to conf/authentication.py.
+ (CommonMethods.ExpectHeader): Move to conf/expect_header.py.
+ (CommonMethods.RejectHeader): Move to conf/reject_header.py.
+ (CommonMethods.Response): Move to conf/response.py.
+ (CommonMethods.SendHeader): Move to conf/send_header.py.
+ (CommonMethods.ServerFiles): Move to conf/server_files.py.
+ (CommonMethods.LocalFiles): Move to conf/local_files.py.
+ (CommonMethods.ServerConf): Move to conf/server_conf.py.
+ (CommonMethods.WgetCommands): Move to conf/wget_commands.py.
+ (CommonMethods.Urls): Move to conf/urls.py.
+ (CommonMethods.ExpectedRetcode): Move to conf/expected_retcode.py.
+ (CommonMethods.ExpectedFiles): Move to conf/expected_files.py.
+ (CommonMethods.FilesCrawled): Move to conf/files_crawled.py.
+ (CommonMethods.__check_downloaded_files): Rename to
+ _check_downloaded_files, so that the method is callable from outside the
+ class.
+ (CommomMethods.get_server_rules): Modify so that it utilizes the conf
+ package.
+ (HTTPTest): Add a method hook_call(configs, name) to reduce duplications
+ in pre_hook_call, call_test and post_hook_call utilizing the conf package.
+ * testenv/conf/hook_sample.py: (new file) sample for hooks
+ * testenv/conf/rule_sample.py: (new file) sample for rules
+ * testenv/REAMDE: Update sections about customizing rules and hooks.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/base_test.py:
+ (CommonMethods): Rename to BaseTest.
+ (BaseTest): Implement __init__ method where the class-wide variables are
+ initialized. Also variable names like `xxx_list` is renamed to its plural
+ form, e.g. `server_list` => `servers`.
+ (BaseTest.init_test_env): Remove name argument due to its unnecessarity.
+ (BaseTest.get_test_dir): Because the path of the test directory is needed
+ in multiple methods, this method is implemented.
+ (BaseTest.get_domain_addr): Rewrite the return statement utilizing str
+ formatting (which is more Pythonic).
+ (BaseTest.get_cmd_line): Rename to gen_cmd_line. Change the variables with
+ capitcal characters to lower ones. Also, the nested for loop is rewritten
+ to a plain loop using the zip function.
+ (BaseTest.__gen_local_filesys): Rename to gen_local_fs_snapshot. Move to
+ ExpectedFiles in conf/expected_files.py and is marked as a static
+ method. Refactor to a less verbose implementation.
+ (BaseTest._check_downloaded_files): Rename to __call__ to agree with the
+ invocation in test case classes. Move to ExpectedFiles in
+ conf/expected_files.py.
+ (BaseTest.get_server_rules): Refactor to a more Pythonic form utilizing
+ dict.items() and is marked static.
+ (BaseTest.stop_server): (new method) an abstract method which should stop
+ the currently using servers.
+ (BaseTest.instantiate_server_by): (new method) an abstract method which
+ should instantiate a server instance according to the given argument.
+ (BaseTest.__enter__): (new method) method which initialize the context
+ manager
+ (BaseTest.__exit__): (new method) method that finilize the context manager
+ and deal with the exceptions during the execution of the with statement,
+ subclasses can override this method for extensibility
+ * testenv/http_test.py:
+ (HTTPTest.__init__): Add call to super.__init__. Default values of
+ pre_hook, test_params, post_hook are set to None to avoid a subtle bug of
+ Python. Argument servers is renamed to protocols.
+ (HTTPTest.Server_setup): Move to BaseTest and rename to server_setup.
+ Calls to pre_hook_call, call_test, post_hook_call are removed.
+ (HTTPTest.hook_call, pre_hook_call, call_test, post_hook_call): Move to
+ BaseTest for that both HTTP test cases and FTP test cases may use these
+ methods.
+ (HTTPTest.init_HTTP_Server, init_HTTPS_Server): Merge and rename to
+ instantiate_server_by to implement the abstract method in BaseTest.
+ (HTTPTest.stop_HTTP_Server): Rename to stop_server to implement the
+ abstract method in BaseTest. Also, pull out the part where remaining
+ requests are gathered into a new method request_remaining.
+ (BaseTest.act_retcode): Rename to ret_code because ExpectedRetCode is
+ moved out from BaseTest, so the name act_retcode is actually a bit
+ verbose.
+ * testenv/conf/expected_ret_code.py:
+ (ExpectedRetCode.__call__): Rewrite the str into a more readable form.
+ * testenv/conf/files_crawled.py:
+ (FilesCrawled.__call__): Refactor this method into a more Pythonic form
+ utilizing the zip function.
+ * testenv/conf/local_files.py:
+ (LocalFiles__call__): Rewrite this method with the recommended with
+ statement.
+ * testenv/conf/server_conf.py:
+ (ServerConf.__call__): Rewrite this method due to BaseTest.server_list is
+ renamed to BaseTest.servers.
+ * testenv/conf/server_files.py:
+ (ServerFiles.__call__): Refactor the nested for loop into a plain one
+ utilizing the zip function.
+ * testenv/conf/urls.py:
+ (URLs): Rename url_list to urls.
+ * testenv/conf/wget_commands.py:
+ (WgetCommands): Rename command_list to commands, rename test_obj.options
+ to test_obj.wget_options.
+ * testenv/Test--https.py, Test-Proto.py, Test-Parallel-Proto.py: Argument servers
+ is changed to protocols due to change in the signature of
+ HTTPTest.__init__.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/WgetTest.py: Move WgetFile to package misc.
+ * testenv/README: Modify documentation respect to WgetFile.
+ * testenv/Test-*.py: Optimize imports about WgetFile.
+
+2014-03-13 Zihang Chen <chsc4698@gmail.com>
+
+ * testenv/Test-Proto.py: Fix a typo (line 71: server to servers).
+
+2014-03-04 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/http.c (modify_param_value, extract_param): Aesthetic change.
+
+2014-02-24 Yousong Zhou <yszhou4tech@gmail.com> (tiny change)
+
+ * tests/tests/Test--httpsonly-r.px: Add feature constraint on https.
+
+2014-02-24 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * gnulib: update module.
+ Reported by: Darshit Shah <darnir@gmail.com>.
+
+2014-02-14 Vladimír Pýcha <vpycha@gmail.com> (tiny change)
+
+ * src/http.c (parse_content_disposition, extract_param)
+ (append_value_to_filename, digest_authentication_encode): URL-decode the
+ filename parameter of Content-Disposition HTTP header if it is encoded. This
+ is related to --content-disposition.
+ New parameter of extract_param(), "is_url_encoded".
+ Add argument NULL to the call of extract_param() in
+ digest_authentication_encode().
+ * src/http.h: Add the new parameter to the declaration of extract_param().
+ * src/cookies.c (parse_set_cookie, test_cookies): Add argument NULL to the calls
+ of extract_param().
+ * src/url.c (url_unescape): Remove "static" modifier.
+ * src/url.h: Add declaration of url_unescape().
+
+2014-02-13 Yousong Zhou <yszhou4tech@gmail.com>
+
+ * tests/Wget.pm.in: Exclude existing files from the check of unexpected
+ downloads.
+
+2014-02-13 Yousong Zhou <yszhou4tech@gmail.com>
+
+ * tests/Test--start-pos.px: Test --start-pos for HTTP downloads.
+ * tests/Test-ftp--start-pos.px: Test --start-pos for FTP downloads.
+ * tests/Test--start-pos--continue.px: Test the case when --start-pos and
+ --continue were both specified.
+
+2014-02-13 Yousong Zhou <yszhou4tech@gmail.com>
+
+ * tests/FTPServer.pm: Fix the handling of TYPE command and avoid endless
+ loop when doing binary mode RETR.
+
+2014-02-10 Yousong Zhou <yszhou4tech@gmail.com>
+
+ * doc/wget.texi: Add documentation for --start-pos.
+
+2014-02-06 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/main.c (print_version): Move copyright year out of the localized
+ string and update it.
+
+2014-02-06 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * configure.ac: Update copyright years.
+
+2014-01-29 Darshit Shah <darnir@gmail.com>
+
+ * src/main.c: Remove pre-processor variable WHEN_DEBUG
+ (option_data[]): Do not fail on --debug even if debug support is not
+ compiled in.
+ (main): Explicitly set opt.debug to false in case debugging support was not
+ compiled.
+ * src/init.c (commands[]): Support --debug wven when support is not compiled in.
+ * src/options.h: Same
+
+2014-01-23 Lars Wendler <polynomial-c@gentoo.org> (tiny change)
+
+ * tests/Test--post-file.px: Do not fail when wget has no debug support.
+
+2014-01-17 Darshit Shah <darnir@gmail.com>
+
+ * src/init.c (commands[]): Add --no-config.
+ * src/options.h: Same.
+ * src/main.c (option_data[]): Same.
+ (print_help): Same.
+ (main): If --no-config is set, then do not read the wgetrc files.
+
+2014-01-05 HÃ¥kon VÃ¥gsether <hauk142@gmail.com> (tiny change)
+
+ * src/http.c (http_loop): Fix checking the URL length when filename is
+ specified.
+
+2014-01-02 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (CommonMentods.exec_wget): Wait for n seconds before calling
+ the Wget executable.
+
+2014-01-02 Darshit Shah <darnir@gmail.com>
+ * testenv/Makefile.am: Add new Test--https.py to list of tests and EXTRA_DIST.
+ Also replace all tabs with spaces in file for conformity.
+ * testenv/Test--https.py: New test to check if Wget works correctly with HTTPS
+ servers
+ * testenv/HTTPServer.py: Import new modules for use in HTTPS Servers
+ (HTTPSServer): New class that generates a SSL-wrapped socket for use in a
+ HTTPS Server.
+ (HTTPSd): HTTPS daemon class. Analogous to the HTTPd class
+ * testenv/WgetTest.py: Define global variables HTTP and HTTPS to reflect Server
+ types
+ (CommonMethods.exec_wget): Add the protocol information to the URL before
+ passing it to wget
+ (HTTPTest.__init__): Edit syntax. The servers variable now accepts a list of
+ servers defined by their type. E.g. HTTP, HTTPS.
+ (HTTPTest.Server_setup): Reflect change in type of variable servers.
+ However, we maintin the value of self.servers to allow most of the code to
+ remain unchanged.
+ (HTTPTest.init_HTTPS_Server): Initialize a HTTPS Server
+ * testenv/Test-Parallel-Proto.py: Edit to reflect slight change in Test Fiel Syntax.
+ * testenv/Test-Proto.py: Same
+
+2013-12-29 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/init.c (home_dir): Remove useless 'if'.
+ * src/warc.c (warc_start_new_file): Likewise.
+ (warc_process_cdx_line): Likewise.
+ (warc_write_response_record): Likewise.
+
+2013-12-29 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * doc/wget.texi: Update to GFDL 1.3.
+
+2013-12-27 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py: Add modeline
+ (CommonMethods.ServerConf): New pre-test hook that sets
+ BaseHTTPRequestHandler class variables in all available servers
+ * testenv/HTTPServer.py (HTTPd.ServerConf): Call the respective method in the Server
+ to set the class variables
+ (StoppableHTTPServer.server_sett): Set the handler class variables
+
+2013-12-26 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): Fix connect timeout failure
+
+2013-12-26 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (HTTPTest.call_test): Correct the call to stop_HTTP_Server.
+
+2013-12-25 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (CommonMehtods.exec_wget): Catch and handle exception if the
+ Wget executable is not found at src/wget
+ (HTTPTest.call_test): In case of error during execution, remove all existing
+ servers before quitting
+
+2013-12-22 Mike Frysinger <vapier@gentoo.org>
+
+ * doc/sample.wgetrc: add links to the manual.
+
+2013-12-22 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * gnulib: add git submodule.
+
+2013-12-15 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (HTTPTest.HTTP_setup): Rename to Server_setup so it can be
+ easily reused for other non-HTTP servers.
+ (HTTPTest.__init__): Call Server_setup instead of HTTP_setup
+ (HTTPTest.Server_setup): Split into three more functions, that handle
+ pre-hooks, test execution and post-hooks respectively.
+ (HTTPTest.pre_hook_call): Set up and execute the pre-test hooks. Code split
+ from HTTPTest.Server_setup
+ (HTTPTest.call_test): Execute wget and log exit code. Code split from
+ HTTPTest.Server_setup
+ (HTTPTest.post_hook_call): Set up and execute post-test hooks. Code split
+ from HTTPTest.Server_setup
+
+2013-11-04 Darshit Shah <darnir@gmail.com>
+
+ * tests/Makefile.am: Add new tests introduced in last commit to
+ EXTRA_DIST.
+ Reported by: Andrea Urbani <matfanjol@mail.com>
+
+2013-11-02 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/progress.c (struct progress_implementation): New method draw.
+ (bar_update): Split into...
+ (bar_draw): ...this new function.
+ (dot_update): Split into...
+ (dot_draw): New function.
+ (progress_update): Also invoke draw on `current_impl'.
+
+2013-11-02 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/http.c (gethttp): Increase max header value length to 512.
+
+2013-10-30 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/http.c (skip_short_body): Remove assert which is always true.
+ Reported by: David Binderman <dcb314@hotmail.com>
+
+2013-10-26 Bykov Aleksey <gnfalex@rambler.ru>
+
+ * src/utils.c (match_tail): Fix cookies reject
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Fix parsing month name in uppercase
+
+2013-10-22 Ãngel González <keisial@gmail.com>
+
+ * bootstrap.conf (gnulib_modules): Add module xstrndup.
+
+2013-10-17 Andrea Urbani <matfanjol@mail.com>
+
+ * tests/FTPServer.pm (GetBehavior): new routine.
+ * tests/FTPServer.pm (get_list): new parameter to skip hidden files
+ * tests/Test-ftp-list-Multinet.px: Test LIST on a "UNIX MultiNet
+ Unix Emulation" system that returns an empty content when
+ "LIST -a" is requested (probably because no "-a" files
+ exist)
+ * tests/Test-ftp-list-Unknown.px: Test LIST on a "Unknown ftp
+ service" system that returns an empty content when
+ "LIST -a" is requested (probably because no "-a" files
+ exist)
+ * tests/Test-ftp-list-Unknown-a.px: Test LIST on a "Unknown ftp
+ service" system that recognises "LIST -a" as "give me the
+ -a file" and there is a "-a" file + other two files.
+ "LIST -a" will return only "-a", "LIST" all the three files.
+ * tests/Test-ftp-list-Unknown-hidden.px: Test LIST on a "Unknown ftp
+ service" system that recognises "LIST -a" as an "UNIX Type:
+ L8" system (show me also the hidden files) and there is an
+ hidden file.
+ * tests/Test-ftp-list-Unknown-list-a-fails.px: Test LIST on a
+ "Unknown ftp service" system that raises an error on
+ "LIST -a" command.
+ * tests/Test-ftp-list-UNIX-hidden.px: Test LIST on a "UNIX Type:
+ L8" system that recognises "LIST -a" as "show me also the
+ hidden files" and there is an hidden file.
+
+2013-10-17 Andrea Urbani <matfanjol@mail.com>
+
+ * src/ftp.c (getftp): force "LIST" or "LIST -a"
+ according to the remote system type. If the remote
+ system is not known, it tries, only the first time,
+ "LIST -a", after "LIST" and decides which one to use.
+ For more information look for "__LIST_A_EXPLANATION__"
+ * src/ftp.h (enum ustype): New ustype enum.
+ * src/ftp.h (ftp_syst): New enum ustype *unix_type parameter.
+ * src/ftp.h (ftp_list): Removed enum stype rs parameter, added.
+ bool avoid_list_a, bool avoid_list, bool *list_a_used
+ parameters.
+ * src/ftp.h (wget_ftp_fstatus): New AVOID_LIST_A, AVOID_LIST,
+ LIST_AFTER_LIST_A_CHECK_DONE values.
+ * src/ftp-basic.c (ftp_list): it handles the new avoid_list_a,
+ avoid_list and list_a_used parameters.
+ * src/ftp.h (ftp_syst): it stores information about the "215 UNIX"
+ systems into the new unix_type parameter.
+
+2013-10-14 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * testenv/Makefile.am (XFAIL_TESTS): Remove Test--spider-r.py.
+
+2013-10-10 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * tests/Test-idn-robots-utf8.px: Remove -H.
+ * tests/Test-idn-cmd.px: Likewise.
+ * tests/Test-idn-cmd-utf8.px: Likewise.
+ Suggested by: Tim Ruehsen <tim.ruehsen@gmx.de>
+
+2013-10-10 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * src/url.c (url_parse): Try to convert UTF-8 URLs to IDN.
+ * src/html-url.c (append_url): Parse URLs specifying an IRI structure.
+
+2013-10-07 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Test-idn-robots.px: added punycoded and escaped URLs to follow
+ removed -H
+
+2013-10-06 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: add/explain quoting of wildcard patterns
+
+2013-10-06 Giuseppe Scrivano <gscrivan@redhat.com>
+
+ * testenv/Makefile.am (EXTRA_DIST): Distribute test files.
+
+2013-09-16 Darshit Shah <darnir@gmail.com>
+
+ * testenv/README: Update documentation
+
+2013-09-14 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPServer.py (StoppableHTTPServer): Define object variable
+ request_headers which stores a list of requests received by the server
+ (StoppableHTTPServer.get_req_headers): Return the list of Request
+ Headers stored by the server
+ (_Handler.do_HEAD): Send the Request MEthod string for identification
+ (_Handler.do_GET): Same
+ (_Handler.__log_request): Log the request in Request_Headers list
+ (_Handler.send_head): Make a call to __log_request
+ * testenv/Test--spider-r.py: Add new list, Request_List, which contains all
+ the requests that Wget is expected to send. This will allow for
+ fine-grained tests on recursive downloading.
+ * testenv/WgetTest.py (CommonMethods.FilesCrawled): New Post-Test Hook, that
+ ensures that all the expected Files on the server were accessed as
+ expected.
+ (HTTPTest.stop_HTTP_server): On stopping server, asks it to respond
+ with list of all requests it received.
+
+2013-09-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/recur.c (download_child_p): fix compile error when
+ configured using --without-ssl.
+
+2013-09-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: added a summary of build options
+ fixed some indentations
+ removed the unconditionally adding of libz with --with-ssl
+ removed -lgcrypt and -lgpg-error for gnutls
+
+2013-09-13 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (CommonMethods._replace_substring): New method that will
+ replace a substring delimited by {{ }} characters by the value of
+ self.<substring> variable
+ (CommonMethods.WgetCommands): Use the _replace_substring () call to
+ replace the substrings in the the command line.
+ (CommonMethods.ServerFiles): Run the _replace_substring () method on
+ the File contents too.
+
+2013-09-13 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test--spider-r.py: Test retrieval in recursive spider mode.
+ * testenv/Makefile.am: add new file
+
+2013-09-13 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPServer.py (_Handler.do_HEAD): If requested path is /, respond
+ with /index.html
+ (_Handler.do_HEAD): Smartly guess value of Content-Type Header from
+ file extension
+ (_Handler.guess_type): Use a preset list of extensions and
+ Content-Type strings. If the extension matches one in the list, use
+ that string, else default to "text/plain"
+
+2013-09-11 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (CommonMethods.exec_wget): Expect domain_list instead of
+ domain.
+ (CommonMethods.get_cmd_line): Same. Generate command line by
+ prepending to each file it's respective domain string
+ (CommonMethods.ServerFiles): Generate file_list and server_rules for
+ each Server and set the config details
+ (HTTPTest): New named parameter, servers which signifies number of
+ servers to spawn
+ (HTTPTest.HTTP_setup): This method now takes servers as a new
+ parameter. Instead of storing server and domain, we now store
+ server_list and domain_list. Each server must be initialized through a
+ loop.
+ (HTTPTest.stop_HTTP_server): Stop all servers in a loop.
+ * testenv/Test-Parallel-Proto.py: Prototype test file for multiple servers.
+
+2013-09-10 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (HTTPTest.stop_HTTP_server): With the threaded servers,
+ we can simply use the socketserver.shutdown() method to close the
+ server instead of sending a QUIT command
+ * testenv/HTTPServer.py (StoppabelHTTPServer.serve_forever): Delete method. No
+ need to override this method anymore.
+ (WgetHTTPRequestHandler.do_QUIT): No longer required
+ (HTTPd): Rename self.server to self.server_inst to reduce ambiguity
+ when referenced from WgetTest
+
+2013-09-09 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): changed checking of option "PFS"
+ to be better prepared for some kinds of backports.
+ Reported by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+2013-09-08 Darshit Shah <darnir@gmail.com>
+
+ * testenv/README (File Structure): Add explanation about various variables
+ used consistently across all tests.
+
+2013-09-07 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): use gnutls_check_version()
+ to check if option "PFS" is available
+ Reported by: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+
+2013-09-07 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test-Post.py: Test basic functionality for sending HTTP POST
+ requests using the --method command
+ * testenv/Makefile.am: Add new test
+
+2013-09-07 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPServer.py: Remove bunch of old code artefacts
+ * testenv/WgetTest.py: Same
+
+2013-09-07 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPServer.py (StoppableHTTPServer.server_conf): Change global
+ variable fileSys to an object variable. This is good programming
+ practice and required for parallel-wget support.
+ (StoppableHTTPServer.server_forever): Edit overridden method to remove
+ the global queue variable. No longer required under the new working
+ (WgetHTTPRequestHandler.do_QUIT): Don't push fileSys through the queue
+ (_Handler): Rename class __Handler to _Handler to match Python's
+ encapsulation rules
+ (_Handler.do_POST): fileSys is now an object variable of the server
+ (_Handler.do_PUT): Same
+ (_Handler.send_put): Same
+ (_Handler.send_head): Same
+ (HTTPd): New class that wraps around the server for Threading
+ (create_server): Make new object of HTTPd.
+ (spawn_server): Start the thread created through create_server
+ (ret_fileSys): Removed method. No longer required.
+ * testenv/WgetTest.py (HTTPTest.__init__): Don't explicitly set
+ self.act_retcode. Instead toggle tests_passed boolean to set the
+ correct return code.
+ (HTTPTest.HTTP_setup): We no longer call HTTPServer.spawn_server to
+ start a new instance of the server.
+ (HTTPTest.init_HTTP_server): We no longer call the old
+ create_server(), spawn_server() methods. Instead use the new HTTPd
+ class interface to create new instances of the server
+ (HTTPTest.stop_HTTP_server): Don't ask server to return fileSys.
+
+2013-09-06 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py (CommonMethods.__check_downloaded_files): Print a
+ unified diff in case there is a mismatch in the file contents
+
+2013-09-06 Darshit Shah <darnir@gmail.com>
+
+ * testenv/README: New section on pending work. Will keep updating this to keep
+ track of work that remains to be done on this implementation
+
+2013-09-06 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPServer.py (WgetHTTPRequestHandler.test_cookies): Comment out the
+ old test_cookies code. This is no longer used and was causing problems
+ with expected cookies. The code will soon be removed anyways
+ * testenv/Test-cookie.py: Add new test for basic cookie functionality
+ * testenv/Test-cookie-401.py: Ensure cookies are saved during a 401 response
+ * testenv/Test-cookie-expires.py: Ensure that the Expires field is correctly
+ handled
+ * testenv/Test-cookies-domain-mismatch.py: Ensure that mismatched domains are
+ handled by Wget
+ * testenv/Makefile.am: Add the new tests
+
+2013-09-05 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test-auth-with-content-disposition.py: Add test that ensures Content
+ Disposition works alongwith authentication
+ * testenv/Makefile.am: Add new test
+
+2013-09-04 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/sample.wgetrc: added "secureprotocol" example
+ * doc/wget.texi (HTTPS (SSL/TLS) Options): Document PFS.
+
+2013-09-04 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Test-c-full.py: Test Continue options
+ * testenv/Makefile.am: Add Test-c-full.py and Test-O
+
+2013-09-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Add new value 'PFS' to --secure-protocol to
+ enforce the so-called Perfect Forward Security.
+ * src/init.c (cmd_spec_secure_protocol): added secure_protocol_pfs
+ * src/openssl.c, gnutls.c, options.h: likewise
+
+2013-09-02 Darshit Shah <darnir@gmail.com>
+
+ * testenv/Makefile.am: Add new Test
+ * testenv/Test-Head.py: New Test to ensure HEAD requests are handled correctly
+
+2013-08-31 Darshit Shah <darnir@gmail.com>
+
+ * testenv/WgetTest.py: Remove import module defaultdict.
+ (CommonMethods.get_server_rules): server_rules should be a dict, not a
+ defaultdict (list).
+ * testenv/HTTPServer.py (WgetHTTPRequestHandler.get_rule_list): If rule does
+ not exist, return None. Not an emppty list.
+ (WgetHTTPRequestHandler.test_cookies): Rule variable is not a list.
+ (__Handler.send_cust_headers): Same.
+ (__Handler.custom_response): Same.
+ (__Handler.is_authorized): Same.
+ (__Handler.expect_headers): Same.
+ (__Handler.reject_headers): Same.
+
+2013-08-31 Darshit Shah <darnir@gmail.com>
+
+ * testenv/README: Explain that TEST_NAME needs to be unique
+ * testenv/Test-auth-no-challenge.py: Edit non-unique TEST_NAME
+
+2013-08-31 Darshit Shah <darnir@gmail.com>
+
+ * testenv/README: (newfile) Simple help / instructions about using the Test
+ Environment.
+ * testenv/Makefile.am: (newfile) Makefile for the Test Environment. Uses the
+ Automake Parallel Test Harness
+ * testenv/WgetTest.py: (newfile) Base module that executes the Test.
+ * testenv/HTTPServer.py: (newfile) Contains the custom HTTP Server for the
+ Test Environment. Creates an instance of http.server in Python3.
+ * testenv/FTPServer.py: (newfile) Overrides methods from pyftpdlib for use in
+ the Test Environment. ** Work under progress **.
+ * testenv/ColourTerm.py: (newfile) A custom module to output coloured text to
+ the terminal. Known to work on POSIX shells.
+ * testenv/Test-Proto.py: (newfile) A prototype Test File. This should be
+ copied when writing a new Test Case.
+ * testenv/Test-Content-disposition-2.py: Test Content Disposition clobbering
+ * testenv/Test-Content-disposition.py: Test Content Disposition Headers
+ * testenv/Test-O.py: Test Output filename command
+ * testenv/Test-auth-basic-fail.py: Test returncode on auth failure
+ * testenv/Test-auth-basic.py: Test Basic Auth negotiation
+ * testenv/Test-auth-both.py: Test handling of Multiple auth providers. This
+ test currently fails.
+ * testenv/Test-auth-digest.py: Test Digest Auth Negotiation
+ * testenv/Test-auth-no-challenge-url.py: Ensure --auth-no-challenge is handled
+ when auth details are in-URL.
+ * testenv/Test-auth-no-challenge.py: Ensure --auth-no-challenge is honoured
+ * testenv/Test-auth-retcode.py: Ensure correct return code after 403 Forbidden
+ response.
+2013-08-31 Darshit Shah <darnir@gmail.com>
+
+ * testenv/HTTPTest.py (ServerError): Define new Exception for handling
+ internal control flow.
+ (StoppableHTTPServer.SendHeader): Simply pass. Do nothing. Adding
+ functionality here seems to crash for no apparent reason.
+ (stoppableHTTPServer.send_cust_headers): Minor optimization. No need
+ for extra variable.
+ (__Handler.Response): Handle explicit Response Code Rules
+ (__Handler.Authentication): Handle Authentication rules
+ (__Handler.handle_auth): Actual worker method for authentication
+ (__Handler.ExpectHeader): Ensure Expected Headers are received
+ (__Handler.RejectHeader): Ensure Blacklisted Headers are NOT received
+ (__Handler.send_HEAD): Dynamically call server rule functions based on
+ the self.rules list. This feature will later be added to POST/PUT, etc
+
+2013-08-31 Darshit Shah <darnir@gmail.com>
+
+ * configure.ac: Add testenv/Makefile to AC_CONFIG_FILES.
+ * Makefile.am: Add testenv to SUBDIRS
+
+2013-08-23 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/sample.wgetrc: added "httpsonly" example
+
+2013-08-22 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/Makefile.am (EXTRA_DIST): Add Test--httpsonly-r.px.
+ * tests/run-px (tests): Likewise.
+ * tests/Test--httpsonly-r.px: New file.
+
+2013-08-22 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c: Add new option --https-only.
+ * src/options.h: Likewise.
+ * src/recur.c (download_child_p): add check for HTTPS.
+
+2013-08-22 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: added description for --https-only
+
+2013-08-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Fix misspelling.
+
+2013-08-09 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_init): Prevent CA files from being loaded twice
+ if possible.
+ * src/gnutls.c (ssl_check_certificate): Added some error messages
+ * src/gnutls.c: Fixed some compiler warnings
+
+2013-08-08 Will Dietz <w@wdtz.org> (tiny change):
+
+ * src/main.c (format_and_print_line): Wrap correctly long tokens.
+
+2013-07-23 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: Remove AM_CONDITIONAL HAVE_NETTLE.
+ Reported by: Darshit Shah <darnir@gmail.com>.
+
+2013-07-16 Darshit Shah <darnir@gmail.com>
+
+ * src/wget.h (err_t): Added new errors, ATTRMISSING and UNKNOWNATTR to
+ handle missing attributes and Unknown attribute values respectively in
+ HTTP Headers.
+ * src/exits.c (get_status_for_err): ATTRMISSING is a Protocol Error while
+ UNKNOWNATTR is a general error, presumably because of a feature that
+ is not yet implemented.
+ * src/http.c (gethttp): Call create_authorization_line () separately. In
+ case the auth_err flag has been set with an error, handle it and exit.
+ * src/http.c (create_authorization_line): Pass a pointer, auth_err to set
+ the flag for different kinds of errors encountered.
+ * src/http.c (http_loop): Handle the errors raised by the authentication
+ handlers.
+ * src/http.c (digest_authentication_encode): Pass pointer auth_err to set
+ the error flags.
+ Set qop to NULL in case the value of the qop / algorithm attribute is
+ unknown to Wget. Set an appropriate error too.
+
+2013-07-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (digest_authentication_encode): Fix a crash when the algorithm
+ is not specified in the server response. Free dynamic memory used by
+ the function when the function exits.
+ * src/http-ntlm.c [HAVE_NETTLE]: Include <nettle/md4.h> and <nettle/des.h>.
+ (setup_des_key) [HAVE_NETTLE]: New function to deal with
+ libnettle.
+ (calc_resp) [HAVE_NETTLE]: Add support for libnettle.
+ (mkhash) [HAVE_NETTLE]: Likewise.
+ Reported by: Tim Ruehsen <tim.ruehsen@gmx.de>.
+
+2013-07-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * configure.ac: check for libnettle when GNU TLS is used.
+
+2013-07-13 Steven M. Schweda <sms@antinode.info>
+
+ * src/warc.c (warc_tempfile): Fix a portability issue on VMS.
+
+2013-07-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (digest_authentication_encode): Set default value of
+ `algorithm' to "MD5". Check if `qop' is not-NULL before access it.
+
+2013-07-11 Tomas Hozza <thozza@redhat.com>
+
+ * src/ftp.c (ftp_loop): Use ftp_retrieve_glob() also in case
+ --preserve-permissions was specified.
+
+2013-07-11 Tomas Hozza <thozza@redhat.com>
+
+ * doc/wget.texi: Document --regex-type and --preserve-permissions.
+
+2013-07-11 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): respect connect timeout.
+
+2013-07-11 Karsten Hopp <karsten@redhat.com>
+
+ * src/openssl.c (struct openssl_read_args, struct scwt_context): New struct.
+ (openssl_read, ssl_connect_with_timeout_callback): New function.
+ (ssl_connect_wget): respect connect timeout.
+
+2013-07-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (read_response_body) [ALLOW_CLOBBER]: Move definition to..
+ * src/options.h (struct options): Make `backups' an int.
+ * src/url.h [ALLOW_CLOBBER]: .. Here. Do not clobber when backups are used.
+ * src/url.c (url_file_name): Use the ALLOW_CLOBBER macro instead of
+ repeating the code.
+
+2013-07-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Download Options): Add documentation for --backups.
+ (Wgetrc Commands): Add documentation for backups.
+ Reported by: Tomas Hozza <thozza@redhat.com>.
+
+2013-07-08 Steven M. Schweda <sms@antinode.info>
+
+ * src/retr.c (rotate_backups): Support for VMS files.
+
+2013-06-26 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Reverse change by commit 90896 that prevented
+ downloading response body data to non-GET Request methods.
+
+2013-06-22 Ãngel González <keisial@gmail.com>
+
+ * src/init.c (cmd_string_uppercase): Rewrite function.
+
+2013-06-19 Ciprian Vieru <devel.php@gmail.com> (tiny change)
+
+ * src/html-url.c: Define TAG_TD, TAG_TH, TAG_VIDEO, TAG_AUDIO, TAG_SOURCE.
+ (tag_url_attributes, known_tags): Likewise.
+
+2013-06-19 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/connect.c (socket_ip_address): zero out ip address structure to
+ avoid access to uninitialized values by inet_ntop().
+ * src/ftp.c (ftp_loop_internal): fix segfault caused by warc_tmp NULL pointer.
+
+2013-06-17 Dave Reisner <dreisner@archlinux.org> (tiny change)
+
+ * doc/texi2pod.pl: Fix formatting error that causes build to fail with
+ Perl 5.18
+
+2013-06-17 Darshit Shah <darnir@gmail.com>
+
+ * doc/wget.texi (POST): Explain the new redirection rules.
+ * doc/wget.texi (Other HTTP Methods): Same.
+ * doc/wget.texi (body-data): Fix typo in description.
+
+2013-06-13 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Follow RFC 2616 and httpbis specifications when
+ handling redirections. Do not suspend the method on 301/302 redirects.
+ (gethttp): If method if not GET, we do not intend to download
+ anything.
+ * src/main.c (main): Set spider mode when opt.method is HEAD. This will
+ prevent Wget from downloading any file.
+ * src/retr.c (SUSPEND_METHOD): Rename macro SUSPEND_POST_DATA to
+ SUSPEND_METHOD to more accurately reflect its use. Similarly rename
+ related variables.
+
+2013-05-21 Ray Satiro <raysatiro@yahoo.com>
+
+ * src/url.c (url_file_name): Use MAX_PATH in Windows.
+
+2013-05-17 Bykov Aleksey <gnfalex@rambler.ru>
+
+ * bootstrap: Add `mkostemp'
+
+2013-05-14 Bykov Aleksey <gnfalex@rambler.ru>
+
+ * src/warc.c (warc_tempfile): For fix "Could not open temporary WARC manifest
+ file." issue in Win system force to use `mkostemp(filename, O_TEMPORARY)'
+ instead of `mkstemp(filename)'. Thank to Angel Gonzalez for help.
+
+2013-05-14 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/cookies.c (cookie_jar_load): Replaced read_whole_file() by getline().
+ * src/init.c (run_wgetrc): Likewise.
+ * src/netrc.c (parse_netrc): Likewise.
+ * src/utils.c: Likewise.
+ * src/ftp.c (getftp): Likewise.
+ * src/ftp-ls.c (ftp_parse_unix_ls, ftp_parse_winnt_ls, ftp_parse_vms_ls): Likewise.
+ * src/ftp-ls.c (clean_line): Accept the string length as parameter.
+ * src/ftp-ls.c: Replaced indent tabs by spaces.
+ * src/ftp.c: Likewise.
+ * src/utils.c: Removed read_whole_file() definition.
+ * src/netrc.c: Removed read_whole_file() definition for STANDALONE.
+ * src/utils.h: Removed read_whole_file() declaration.
+
+2013-05-10 Darshit Shah <darnir@gmail.com> (tiny change)
+
+ * doc/wget.texi (No of tries): Fix typo to make it clear that --tries
+ option sets number of tries not retries.
+ Reported by: Hauke Hoffman <haukebjoernhoffman@googlemail.com>
+
+2013-05-09 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/utils.c (acceptable): use standard string functions instead of
+ self-written code.
+ (match_tail): Likewise.
+ (suffix): Likewise.
+ (has_wildcards_p): Likewise.
+ (test_subdir_p): Fix some warnings.
+ (test_dir_matches_p): Likewise.
+
+2013-05-05 mancha <mancha1@hush.com> (tiny change)
+
+ * src/gnutls.c (ssl_connect_wget): Don't abort on non-fatal alerts
+ received during handshake. For example, when connecting to servers
+ using TSL-SNI that send warning-level unrecognized_name alerts.
+
+2013-05-04 Darshit Shah <darnir@gmail.com>
+
+ * src/init.c (cmd_string_uppercase): Fix issue that cased invalid headers
+ when converting to uppercase.
+
+2013-05-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/init.c: Declare `cmd_string_uppercase'.
+ (commands): Now `method' uses cmd_string_uppercase.
+ (cmd_string_uppercase): New method
+ * src/http.c (gethttp): Do not transform opt.method to uppercase.
+ Reported by: Stefano Lattarini <stefano.lattarini@gmail.com>
+
+2013-05-01 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/retr.c (retrieve_url): New variable `saved_method'.
+ (SUSPEND_POST_DATA): Save the method to `saved_method'.
+ (RESTORE_POST_DATA): Restore the method from `saved_method'.
+
+2013-04-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Types of Files...): Document --accept-regex,
+ --reject-regex.
+ Reported by: Tomas Hozza <thozza@redhat.com>.
+
+2013-04-26 Tomas Hozza <thozza@redhat.com> (tiny change)
+
+ * src/log.c (redirect_output): Use DEFAULT_LOGFILE in diagnostic message
+ when `logfile' is NULL.
+ * src/utils.c (unique_create): Ensure `logfile' has always a value.
+
+2013-04-24 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Remove check for opt.post_data and
+ opt.post_file_name.
+ * src/main.c (main): Change location in code where --post-data and
+ --post-file options are converted to --body-data --body-file.
+
+2013-04-21 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/http.c: Copy opt.body_data to the WARC file, instead of
+ opt.post_data (the old option).
+
+2013-04-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Download Options): Document "mega" dot style.
+
+2013-04-12 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/warc.c: Generate unique UUIDs for the manifest and the record
+ holding the command-line arguments.
+ Write the manifest to a "metadata" record to follow the WARC
+ implementation guidelines.
+ * src/warc.h: Declare new function warc_write_metadata_record.
+
+2013-04-05 Darshit Shah <darnir@gmail.com>
+
+ * doc/doc/wget.texi: Fix ambiguous wording in --post-data section. Make it
+ clear that wget does not check for the format of the post-data.
+ * doc/doc/wget.texi: Add documentation for --method, --body-data and
+ --body-file.
+
+2013-03-31 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/warc.c: Correctly write the field length in the skip length field
+ of .warc.gz files. (Following the GZIP spec in RFC 1952.)
+
+2013-03-20 Tomas Hozza <thozza@redhat.com>
+
+ * src/http.c (gethttp): Set "sock" to -1 if it's not and we have no
+ persistent connection
+
+2013-03-15 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (post_file): Rename function to body_file_send to more
+ accurately reflect its use.
+ * src/http.c (gethttp): Add support for --method, --body-data and
+ --body-file
+ * src/init.c (commands): Same.
+ * src/options.h (options): Same.
+ * src/main.c (option_data): Same.
+ * src/main.c (print_help): Add --method command.
+ * src/main.c (main): Make old --post-{data,file} commands aliases to
+ --method.
+ Add sanity checks for --method, --body-data and --body-file.
+ * src/retr.c (SUSPEND_POST_DATA): Edit Macro Definition to use body_data.
+ * src/retr.c (RESTORE_POST_DATA): Same.
+
+2013-03-12 Darshit Shah <darnir@gmail.com>
+
+ * tests/Makefile.am (EXTRA_DIST): Add Test--post-file.px.
+ * tests/run-px (tests): Likewise.
+ * tests/Test--post-file.px: New file.
+
+2013-03-12 Darshit Shah <darnir@gmail.com>
+
+ * src/http.c (gethttp): Make wget return FILEBADFILE error and abort if
+ post-file does not exist.
+
+ * src/http.c (http_loop): Handle FILEBADFILE as a valid err.
+
+ * src/exits.c (get_status_for_err): Mark FILEBADFILE as an IO error.
+
+2013-02-15 Darshit Shah <darnir@gmail.com>
+
+ * src/cookies.c (cookie_handle_set_cookie): Set cookie->discard_requested
+ to true on domain mismatch.
+
+2013-01-30 Pavel Mateja <pavel@netsafe.cz> (tiny change)
+
+ * src/http.c (gethttp): Specify "Host" for CONNECT method.
+
+2012-12-20 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_connect_wget): added +VERS-SSL3.0 to fix
+ --secure-protocol=SSLv2/SSLv3.
+
+2012-12-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (main): Keep looking for "config" until there are
+ arguments to parse.
+ Reported by: Adrien Dumont <adr.dum@hotmail.fr>
+
+ * src/test.c: Include "wget.h".
+
+2012-12-08 Michael Stapelberg <michael@stapelberg.de> (tiny change)
+
+ * src/retr.c (retrieve_url): Set iri->orig_url to NULL after it is
+ freed.
+
+2012-11-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/wget.h (MAX_INT_TO_STRING_LEN): Define macro.
+ * src/warc.c (warc_write_block_from_file): Use `MAX_INT_TO_STRING_LEN'
+ to find the buffer size.
+ (warc_write_cdx_record): Likewise.
+
+2012-11-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/warc.c (warc_write_block_from_file): Use `number_to_string' to
+ convert the content-length to a string.
+
+2012-11-24 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/warc.c (warc_write_cdx_record): Use `number_to_string' to
+ convert the offset to a string.
+
+2012-11-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (write_data): Fix comment.
+
+2012-11-14 Ãngel González <keisial@gmail.com>
+
+ * src/warc.c (warc_sha1_stream_with_payload): Fix compilation under
+ gcc -std=c89.
+
+2012-11-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (fd_read_body): Correctly check the return code from
+ write_data.
+ Reported by: Torsten Scheck <torsten.scheck@gmx.de>
+
+2012-11-09 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * tests/HTTPServer.pm: added check for must-not-match request-header
+ * tests/Test-cookies.px: check cookie deletion and cookie domain matching
+
+2012-10-08 Stefano Lattarini <stefano.lattarini@gmail.com> (tiny change)
+
+ docs: fix errors and warnings with Texinfo 5
+ Or rather, with the development version 4.13.90, which will
+ eventually become Texinfo 5.0.
+ * doc/wget.texi: Use '@item' instead of '@itemx' in several places,
+ as Texinfo 5 refuses to process an '@itemx' that is not preceded
+ by an '@item'.
+
+2012-10-07 Tim Ruehsen <tim.ruehsen@gmx.de>
+ Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c (get_max_length): If `pathconf' is not available
+ fallback to PATH_MAX.
+
+2012-10-07 Ray Satiro <raysatiro@yahoo.com>
+
+ * src/url.c: Change the functions of a growable string object to null
+ terminate the string.
+ * src/url.c (append_null): New function to null terminate a growable
+ string object.
+ * src/url.c (shorten_length): New function to shorten the length of a
+ growable string object.
+
+2012-10-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Check for patchconf.
+
+2012-10-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (http_loop): Send a HEAD request when -c and
+ --content-disposition are used together.
+
+2012-10-03 Merinov Nikolay <kim.roader@gmail.com>
+
+ * src/ftp.c (ftp_loop_internal): Ignore --no-clobber option when
+ receiving directory listing.
+
+2012-09-29 Merinov Nikolay <kim.roader@gmail.com>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Support filename extracting with
+ new listing format.
+
+2012-09-29 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/url.h (CHOMP_BUFFER): Add definition.
+ * src/url.c (url_file_name): New local variables `fname_len_check' and
+ `max_length'. Check that the length of the file name is acceptable.
+ * src/utils.h (get_max_length): Declare function.
+ * src/utils.c (get_max_length): New function.
+
+2012-09-28 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/src/recur.c (retrieve_tree): Combine duplicated code.
+
+2012-09-23 Merinov Nikolay <kim.roader@gmail.com>
+
+ * m4/wget.m4 (WGET_FNMATCH): Add AC_LANG_SOURCE into
+ AC_COMPILE_IFELSE in order to silence autoconf 2.68 warning.
+
+2012-09-20 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap: Update from gnulib.
+
+2012-09-03 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/http.c (digest_authentication_encode): Add support for RFC 2617
+ MD5-sess authentication algorithm.
+ Feature request and testing by: Avinash <pavinash@gmail.com>
+
+2012-09-02 Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com> (tiny change)
+
+ * src/src/main.c (main): mark more strings for translation.
+ * src/src/mswindows.c (fork_to_background): Likewise.
+ * src/src/recur.c (download_child_p): Likewise.
+
+2012-09-02 Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com> (tiny change)
+
+ * po/POTFILES.in: Add more files.
+
+2012-08-29 Rohit Mathulla <rohit_mathulla@yahoo.com> (tiny change)
+
+ * src/html-url.c (get_urls_file): Convert shorthand URLs.
+
+2012-08-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * doc/wget.texi: remove -nv from --report-speed
+
+2012-08-28 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (ssl_check_certificate): deinit gnutls_x509_crt_t.
+ * src/gnutls.c (ssl_init): don't error if CA directory is empty.
+
+2012-08-25 Hrvoje Niksic <hniksic@gmail.com>
+
+ * src/warc.c (warc_find_duplicate_cdx_record): Use hash_table_get
+ instead of hash_table_get_pair.
+
+2012-08-21 <y-iida@secom.co.jp> (tiny change)
+
+ * src/connect.c (connect_to_ip) [ENABLE_IPV6]: Attempt to use IPv6.
+ * src/http.c (gethttp): Likewise.
+
+2012-08-04 mancha <mancha@mac.hush.com> (tiny change)
+
+ * doc/wget.texi: Export ENVIRONMENT to the man page.
+
+2012-07-08 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/exits.h: Fix comment.
+ * src/exits.c: Likewise.
+
+2012-07-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap: Update from gnulib.
+ * bootstrap.conf (gnulib_extra_files): Remove $build_aux/missing.
+ * lib/Makefile.am: Delete file.
+
+2012-07-07 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ (digest_authentication_encode): Add support for RFC 2617 Digest
+ Access Authentication.
+
+2012-07-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (http_loop): Fix log message.
+ * src/main.c (main): Likewise.
+ Reported by: Petr Pisar <petr.pisar@atlas.cz>
+
+2012-07-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/html-url.c (cleanup_html_url): Remove "static" modifier.
+ * src/init.c (cleanup_html_url): Likewise.
+ Reported by: Mike Frysinger <vapier@gentoo.org>.
+
+2012-07-03 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/init.c: Include warc.h for warc_close in cleanup function.
+
+2012-06-17 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/wget.h: Define `CLOSEFAILED'.
+ * src/init.c: Include "exits.h".
+ (cleanup): Check `fclose' failure.
+ * src/exits.c (get_status_for_err): Handle `CLOSEFAILED'.
+
+2012-06-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (EXTRA_DIST): Add Test-stdouterr.px.
+ * tests/run-px (tests): Likewise.
+ * tests/Test-stdouterr.px: New file.
+
+2012-06-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (main): Move some cleanup related function to...
+ * src/init.c (cleanup): ...here.
+
+ * src/main.c: Do not include "stdout.h".
+ (main): Do not register `close_stdout' at exit.
+ Reported by: Micah Cowan <micah@cowan.name>.
+
+2012-06-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Remove `closeout'.
+ Reported by: Micah Cowan <micah@cowan.name>.
+
+2012-06-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_help): Move --report-speed under the section
+ "Logging and input file".
+
+2012-06-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Logging and Input File Options): Document "--report-speed".
+ (HTTPS (SSL/TLS) Options): Document WARC.
+
+ * doc/texi2pod.pl: Revert change from 2011-08-06.
+
+2012-06-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_help): Rename --bits to --report-bps.
+ (cmdline_options): Likewise.
+ * src/init.c (commands): Rename --report-bps to --report-speed.
+ (cmd_spec_report_speed): New function.
+
+ * src/options.h (struct options): Rename `bits_fmt' to `report_bps'.
+ * src/main.c (print_help): Rename --bits to --report-bps.
+ (cmdline_options): Likewise.
+ * src/init.c (commands): Likewise
+
+ * src/progress.c (create_image): Adjust caller.
+ * src/retr.c (retr_rate): Likewise.
+ * src/utils.c (convert_to_bits): Likewise.
+
+2012-06-04 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c (main): Check for filename != NULL.
+ * src/warc.c (warc_process_cdx_line): Fix memory leak.
+ * src/utils.c (match_posix_regex, compile_posix_regex): Remove dead assignment.
+ * src/openssl.c (ssl_init): Fix old-style function definition.
+
+2012-06-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/connect.c: Include <sys/socket.h> and <sys/select.h>.
+
+2012-05-31 Ãngel González <keisial@gmail.com>
+
+ * convert.c: fix segfault on wrong urls (bug 36570)
+
+2012-05-30 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/warc.c: Fix segfault if CDX record is not found.
+
+2012-05-26 Mike Frysinger <vapier@gentoo.org>
+
+ * src/warc.c: Change type of `warc_current_gzfile' to gzFile.
+
+2012-05-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/warc.c (warc_load_cdx_dedup_file): Change type of `line_length' to
+ ssize_t.
+ Suggested by: Ãngel González <keisial@gmail.com>
+
+2012-05-19 illusionoflife <illusion.of.life92@gmail.com> (tiny change)
+
+ * src/convert.c (register_html,register_css): Fixed functions signature to
+ not accept unused argument
+ * src/retr.c (retrieve_url): Changed register_{css,html} usage according
+ new signature.
+
+2012-05-18 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (wgnutls_poll): Honor the specified `timeout' value.
+ (wgnutls_peek): Likewise.
+
+2012-05-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/warc.h: Cut length lines to 80 columns.
+ * src/warc.c: Likewise.
+
+2012-05-14 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (wgnutls_read_timeout): removed warnings, moved fcntl stuff
+ outside loop.
+
+ * src/hash.h (hash_table_put): Make argument "value" const.
+ * src/hash.c (hash_table_put): Make argument value const. Cast `value' to
+ void.
+ * src/http.c (request_set_header): Make argument `name' const. Cast `value'
+ and `name' to void*.
+ (request_remove_header): Make argument `name' const.
+ * src/url.c (url_file_name): Make `index_filename' static.
+ * src/warc.h (warc_write_cdx_record): Make `url', `timestamp', `mime_type',
+ `payload_digest', `redirect_location', `warc_filename', response_uuid'
+ arguments const. Make `checksum' const.
+ * src/warc.c (warc_write_date_header): Make the `timestamp' argument const.
+ Make `extension' const.
+ (warc_write_cdx_record): Make `url', `timestamp', `mime_type',
+ `payload_digest', `redirect_location', `warc_filename', response_uuid'
+ arguments const. Make `checksum' const.
+
+2012-05-13 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/gnutls.c (credentials): Change type to
+ gnutls_certificate_credentials_t.
+ (ssl_init): Do not use deprecated types.
+ (ssl_connect_wget): Likewise.
+
+2012-05-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Types of Files): Document --accept-regex and
+ --reject-regex.
+
+2012-05-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `git-version-gen'.
+ * build-aux/bzr-version-gen: Remove file.
+ * configure.ac: Invoke `build-aux/git-version-gen' to get the dist
+ version.
+ * Makefile.am (EXTRA_DIST): Distribute build-aux/git-version-gen instead
+ of build-aux/bzr-version-gen.
+
+2012-04-22 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/main.c (main): Dynamically allocate `opt.progress_type'.
+
+2012-04-21 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/ftp-basic.c (ftp_pasv): Fix memory leak.
+
+ * src/http.c (gethttp): Fix memory leak.
+
+ * src/ftp.c (getftp): Silent compiler warning.
+
+2012-04-13 Tim Ruehsen <tim.ruehsen@gmx.de> (tiny change)
+
+ * src/warc.c (warc_load_cdx_dedup_file): Fix a memory leak by freeing
+ `lineptr'.
+
+2012-04-11 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/init.c: Add --accept-regex, --reject-regex and --regex-type.
+ * src/main.c: Likewise.
+ * src/options.c: Likewise.
+ * src/recur.c: Likewise.
+ * src/utils.c: Add regex-related functions.
+ * src/utils.h: Add regex-related functions.
+
+2012-04-11 Gijs van Tulder <gvtulder@gmail.com>
+
+ * bootstrap.conf (gnulib_modules): Include module `regex'.
+ * configure.ac: Check for PCRE library.
+
+2012-04-07 Daniel Kahn Gillmor <dkg@fifthhorseman.net> (tiny change)
+
+ * src/gnutls.c (key_type_to_gnutls_type): New function.
+ (ssl_init): Use correctly the specified gnutls certificate.
+
+2012-04-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_read_timeout): Ensure timer is freed.
+
+ * src/gnutls.c (wgnutls_read_timeout): Do not use timer if it is not
+ allocated.
+ Reported by: Xu Zhongxing <xu_zhong_xing@163.com>
+
+2012-04-01 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/html-url.c: Prevent crash on incomplete STYLE tag.
+
+2012-03-30 Tim Ruehsen <tim.ruehsen@gmx.de> (tiny change)
+
+ * src/warc.c: make warc_uuid_str() implementation depend on HAVE_LIBUUID.
+
+2012-03-30 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/url.c: Use empty query in local filenames.
+
+2012-03-30 Tim Ruehsen <tim.ruehsen@gmx.de>
+
+ * src/convert.c (convert_links_in_hashtable): Mmake it static.
+ * src/cookies.c (parse_set_cookie): Remove empty else branches.
+ * src/css-url.c: Include "css-url.h".
+ (get_uri_string): Make it static.
+ * src/css-url.h (get_urls_css): Add protoype.
+ * src/gnutls.c (ssl_init): Add prototype.
+ * src/html-parse.c (tagstack_push): Make it static.
+ * src/html-parse.c (tagstack_pop): Make it static.
+ * src/html-parse.c (tagstack_find): Make it static.
+ * src/html-url.c (cleanup_html_url): Make it static.
+ * src/progress.c (count_cols): Make it static.
+ * src/progress.c (get_eta): Make it static.
+ * src/retr.h (convert_to_bits): Remove prototype.
+ * src/util.h (convert_to_bits): Add prototype.
+ * src/spider.c (spider_cleanup): Make it static.
+ * src/warc.c (warc_write_start_record): Add prototype.
+ * src/warc.c (warc_write_end_record): Add prototype.
+ * src/warc.c (warc_start_cdx_file): Add prototype.
+ * src/warc.c (warc_init): Add prototype.
+ * src/warc.c (warc_load_cdx_dedup_file): Add prototype.
+ * src/warc.c (warc_write_metadata): Add prototype.
+ * src/warc.c (warc_close): Add prototype.
+ * src/warc.c (warc_tempfile): Add prototype.
+ * src/warc.c (warc_write_warcinfo_record): Make it static.
+ * src/warc.c (warc_load_cdx_dedup_file): Make it static.
+ * src/warc.c (warc_write_metadata): Make it static.
+ * src/warc.h (warc_init): Fix prototype.
+ * src/warc.h (warc_close): Fix prototype.
+ * src/warc.h (warc_tempfile): Fix prototype.
+
+2012-03-29 Tim Ruehsen <tim.ruehsen@gmx.de> (tiny change)
+
+ * src/utils.c (library): Include <sys/time.h>.
+
+2012-03-25 Ray Satiro <raysatiro@yahoo.com>
+
+ * src/build_info.c.in: Check that HAVE_LIBSSL32 is defined when OpenSSL
+ is used.
+
+2012-03-25 Ray Satiro <raysatiro@yahoo.com>
+
+ * configure.ac: Fix build under mingw when OpenSSL is used.
+
+2012-03-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c: Include <sys/ioctl.h>.
+
+ * src/ptimer.c: Include <sys/time.h>.
+
+ * src/connect.c: Include <sys/socket.h>, <sys/select.h>, <sys/time.h>.
+ Reported by: Ray Satiro <raysatiro@yahoo.com>.
+
+2012-03-20 Ãngel González <keisial@gmail.com>
+
+ * bootstrap.conf (gnulib_modules): Add modules `ftello',
+ `mkstemp' and `strtok_r'.
+
+2012-03-07 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/init.c (wgetrc_user_file_name): Correct typo.
+
+2012-03-06 Sasikantha Babu <sasikanth.v19@gmail.com>
+
+ * src/utils.c (convert_to_bits): Added new function convert_to_bits to
+ convert bytes to bits.
+ * src/retr.c (calc_rate): Modified the function to handle --bits
+ option and download rate calculated as bits per sec (SI-prefix)
+ for --bits otherwise bytes (IEC-prefix).
+ (retr_rate): Rates will display in bits per sec for --bits.
+ * src/options.h (struct opt): Added --bit option bool variable bits_fmt.
+ * src/main.c (print_help) : Added help for --bit.
+ * src/init.c: Defined command for --bit option.
+ * src/retr.h: Added function prototype.
+
+2012-02-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c: Include "closeout.h"
+ (main): Register close_stdout at exit.
+
+2012-02-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add module `closeout'.
+
+2012-02-23 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/main.c (main): Write diagnostic messages to `stderr' not to `stdout'.
+
+ * src/main.c (main): Fail gracefully if `malloc' fails.
+
+ * src/gnutls.c (wgnutls_read): Remove unused variables `timer' and `flags'.
+
+2012-02-17 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/warc.c: Add license header.
+
+2012-02-01 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/warc.c: Fix large file support with ftello, fseeko.
+ * src/warc.h: Fix large file support.
+ * src/http.c: Fix large file support.
+
+2012-01-27 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/retr.c (fd_read_body): If the response is chunked, the chunk
+ headers are now written to the WARC file, making the WARC file
+ an exact copy of the HTTP response.
+
+2012-01-27 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/retr.c (fd_read_body): Fix a memory leak with chunked responses.
+ * src/http.c (skip_short_body): Fix the same memory leak.
+
+2012-01-09 Sasikantha Babu <sasikanth.v19@gmail.com> (tiny change)
+ * src/connect.c (connect_to_ip): properly formatted ipv6 address display.
+ (socket_family): New function - returns socket family type.
+ * src/http.c (gethttp): properly formatted ipv6 address display.
+
+2012-01-09 Gijs van Tulder <gvtulder@gmail.com>
+
+ * src/init.c: Disable WARC compression if zlib is disabled.
+ * src/main.c: Do not show the 'no-warc-compression' option if zlib is
+ disabled.
+ * src/warc.c: Do not compress WARC files if zlib is disabled.
+
+2012-01-09 Gijs van Tulder <gvtulder@gmail.com>
+
+ * configure.ac: Always try to use libz, even without SSL.
+
+2011-12-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): Add build-aux/bzr-version-gen.
+ Reported by: Elan Ruusamäe <glen@pld-linux.org>.
+
+2011-12-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * util/trunc.c (main): Call `close' on the fd and check for errors.
+ Reported by: <dga@cs.cmu.edu>.
+
+2011-11-09 Gijs van Tulder <address@hidden>
+
+ * src/warc.c: Call gzdopen() with wb9 instead of wb+9, which fails on
+ zlib version >= 1.2.4.
+
+2011-11-04 Steven Schweda <address@hidden>
+
+ * src/warc.c [! WINDOWS]: Include <libgen.h>.
+ (warc_write_warcinfo_record): Assign a new allocated buffer and
+ free it on errors.
+
+2011-11-01 Steven Schweda <address@hidden>
+
+ * src/gnutls.c (ssl_init): Ensure GNU TLS is loaded only once.
+
+2011-10-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Include module `vsnprintf'.
+
+2011-10-16 Steven Schubiger <stsc@member.fsf.org>
+
+ * util/paramcheck.pl: Match 1 or more times where applicable.
+ (extract_entries): Return a copy instead of reference.
+
+2011-10-07 Steven Schweda <address@hidden>
+
+ * src/connect.c: Add HAVE_SYS_SELECT_H and HAVE_SYS_SOCKET_H conditions
+ on includes of <sys/select.h> and <sys/socket.h>, respectively.
+ * src/ftp.c (getftp): Move BIN_TYPE_TRANSFER macro into VMS-specific
+ section. On VMS, use Stream_LF attributes for listing files. Pass
+ BIN_TYPE_FILE to fopen_excl() instead of constant-everywhere "true".
+ * src/ftp.c (ftp_retrieve_list): Restore lost test of opt.preserve_perm
+ (--preserve-permissions) on the chmod() operation.
+ * src/init.c, main.c: Remove "deprecated" from opt.preserve_perm
+ (--preserve-permissions).
+ * src/init.c (initialize): Use distinct messages for errors in C macro
+ SYSTEM_WGETRC and environment-variable SYSTEM_WGETRC. Avoid use of
+ C macro SYSTEM_WGETRC when it's not defined.
+ * src/log.c (log_close): Avoid closing logfp when it's stderr.
+ * src/main.c (print_help): Restore --preserve-permissions.
+ * src/main.c (main): Avoid using a negative value of longindex as a
+ subscript (for long_options[]) when searching for "--config".
+ * src/main.c (main): Exit the program using exit() instead of "return".
+ (VMS handles these differently, and exit() is better.)
+ * src/openssl.c (ssl_init): Add type cast (SSL_METHOD *) to newly "const"
+ "meth" argument to accommodate OpenSSL version 0.9.8, where that
+ argument is not "const" in the OpenSSL function (SSL_CTX_new).
+ * src/test.c: Declare "program_argstring".
+ * src/utils.c (fopen_excl): Comment typography.
+ * src/warc.h: New file.
+ * src/warc.c: New file.
+
+2011-10-02 Henrik Holst <henrik.holst@millistream.com> (tiny change)
+
+ * doc/wget.texi (HTTP Options): Document option --content-on-error.
+
+2011-10-02 Henrik Holst <henrik.holst@millistream.com> (tiny change)
+ * src/http.c (gethttp): If 'contentonerror' is used then do not
+ skip the http body on 4xx and 5xx errors.
+
+ * src/init.c (commands): Add 'contentonerror'.
+
+ * src/main.c (print_help, option_data): Add new option 'contentonerror'
+ to make wget not skip the http content on 4xx and 5xx errors.
+
+ * src/options.h: New variable 'content_on_error'.
+
+2011-09-27 Karl Berry <karl@freefriends.org> (tiny change)
+
+ * doc/wget.texi: Make dir entry consistent with others.
+
+2011-09-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_version): Update copyright year.
+ (print_version): Fix typo.
+
+2011-09-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (ftp_retrieve_glob): Propagate correctly the `res' error
+ code.
+
+2011-09-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (gethttp): Don't inhibit arest request if opt.timestamping is
+ set.
+ Reported by <natrio@list.ru>
+
+2011-09-06 Jakob Matthes <jakob.matthes@gmail.com> (tiny change)
+
+ * src/main.c (print_version): Do not exit prematurely when --help is passed.
+
+2011-09-04 Christian Jullien <eligis@orange.fr> (tiny change)
+
+ * src/gnutls.c: Include <sys/fcntl.h>.
+
+2011-09-04 Alan Hourihane <alanh@fairlite.co.uk> (tiny change)
+
+ * configure.ac: Check for libz when gnutls is used.
+
+2011-09-02 Mojca Miklavec <mojca.miklavec.lists@gmail.com> (tiny change)
+
+ * src/main.c (print_version): Do not exit prematurely when --version is passed.
+
+2011-08-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_read_timeout): Use the non blocking socket only for
+ `gnutls_record_recv'. Set errno to ETIMEDOUT on a read timeout.
+
+2011-08-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_read_timeout): New function.
+ (wgnutls_read): Use wgnutls_read_timeout.
+ (wgnutls_peek): Likewise.
+
+2011-08-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_help): Exit with an error status if print to stdout
+ fails.
+ (print_usage): Change method signature and return a status code.
+ (print_version): Likewise.
+
+2011-08-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c: Include "ptimer.h".
+ (wgnutls_read): Honor read timeout.
+
+ * src/openssl.c (ssl_init): Make `meth' const.
+
+2011-08-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Under mingw don't check for static OpenSSL
+ libraries if the shared version was already found.
+ Suggested by: Ray Satiro <raysatiro@yahoo.com>.
+
+2011-08-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c [HAVE_UTIME && HAVE_UTIME_H]: Include <utime.h>.
+ [HAVE_UTIME && HAVE_SYS_UTIME_H]: Include <sys/utime.h>.
+ (touch) [HAVE_UTIME: Prefers utime over futimens when it is available.
+ It was reported that Cygwin has a not working futimens.
+
+2011-08-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Check for `utime'.
+
+2011-08-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/init.c (home_dir) [MSDOS]: Move local variable `len' here.
+
+2011-08-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/texi2pod.pl: Don't assume the perl executable is under /usr/bin/.
+
+2011-08-18 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/http.c (gethttp): Fix a memory leak on some errors. Free the head
+ buffer.
+
+ * src/Makefile.am: Use an additional file "css_.c" which in turn includes
+ "wget.h" and immediately "css.c".
+
+ * src/http.c (gethttp): Reset chunked_transfer_encoding on redirections.
+
+2011-08-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (fd_read_body): Ensure max is not already defined.
+
+ * src/mswindows.h (snprintf): Remove definition.
+ (vsnprintf): Likewise.
+
+2011-08-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/css.l: Remove include "wget.h".
+ Reported by: Perry Smith <pedzsan@gmail.com>.
+
+2011-08-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c (abort_run_with_timeout): Use sigprocmask instead of
+ sigsetmask.
+
+ * src/gnutls.c (ssl_connect_wget): Remove call to deprecated function
+ `gnutls_certificate_type_set_priority'.
+
+ * src/Makefile.am (version.c): Don't invoke hg to set version string.
+
+2011-08-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `sigprocmask'.
+
+ * configure.ac: Do not hardcode GNU TLS and OpenSSL libraries.
+
+ * bootstrap.conf (gnulib_modules): Include module iconv.
+
+ * configure.ac: Allow --with-libgnutls-prefix and
+ --with-libssl-prefix
+ Suggested by: Karl Berry <karl@freefriends.org>
+
+ * build-aux/bzr-version-gen (TAG): Consider only the last tag.
+
+2011-08-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ Fix a linker error on systems with an older gnutls version.
+ * src/gnutls.c (ssl_connect_wget)
+ [HAVE_GNUTLS_PRIORITY_SET_DIRECT]: Use gnutls_priority_set_direct.
+ [! HAVE_GNUTLS_PRIORITY_SET_DIRECT]: Use gnutls_protocol_set_priority.
+ Reported by: Karl Berry <karl@freefriends.org>
+
+2011-08-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Print usage string for --with-ssl.
+ Reported by: Karl Berry <karl@freefriends.org>
+
+ * configure.ac: Check for `gnutls_priority_set_direct' when gnutls is
+ used.
+ Reported by: Karl Berry <karl@freefriends.org>
+
+2011-08-09 Giuseppe Scrivano <gscrivano@southpole.se>
+
+ * build-aux/bzr-version-gen: Fix some portability issues.
+
+2011-08-06 Jochen Roderburg <Roderburg@Uni-Koeln.DE>
+
+ * src/host.c (lookup_host): Ensure it doesn't print more IPs than available
+ ones.
+
+2011-08-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/init.c (defaults): Set default value for show_all_dns_entries.
+
+ * src/host.c (lookup_host): If `showalldnsentries' is used then print all
+ the IP corresponding to a DNS entry.
+ * src/init.c (commands): Add `showalldnsentries'.
+ Suggested by: Witold Baryluk <baryluk@smp.if.uj.edu.pl>
+
+ * src/http.c (gethttp): Add the Cache-Control HTTP header when --no-cache
+ is specified.
+ Reported by: Коренберг Марк <socketpair@gmail.com>.
+
+2011-08-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Wgetrc Commands): Document show_all_dns_entries.
+
+ * doc/Makefile.am (wget.pod): Pass the VERSION value to texi2pod.
+
+ * doc/texi2pod.pl: Update from GCC.
+
+2011-08-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c (acceptable): Accept always the file if it is the specified
+ output destination.
+ Reported by: Shai Berger <shai@platonix.com>
+
+2011-08-05 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/gnutls.c (ssl_connect_wget): Use `gnutls_priority_set_direct' instead
+ of the deprecated `gnutls_protocol_set_priority'.
+
+2011-08-02 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/cookies.c (parse_set_cookie): If the value is quoted, do not modify
+ it.
+ Reported by: Nirgal Vourgère <jmv_deb@nirgal.com>
+
+2011-07-29 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/log.c (logprintf): Exit immediately on a SIGPIPE error.
+ Reported by: Noèl Köthe <noel@debian.org>.
+
+2011-07-28 Noèl Köthe <noel@debian.org> (tiny change)
+
+ * doc/wget.texi (HTTP Options): Fix typo.
+
+2011-07-26 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/retr.c (retrieve_url): Do not register redirects when in spider mode.
+
+2011-07-26 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * doc/wget.info (cookies): Remove reference to --cookies.
+ Reported by: Noèl Köthe.
+
+2011-07-26 Carlos Martín Nieto <carlos@cmartin.tk> (tiny change)
+
+ * src/init.c (home_dir): Allocate path buffer dinamically.
+
+2011-07-20 Merinov Nikolay <kim.roader@gmail.com>
+
+ * src/iri.c (remote_to_utf8): Add test for non-ASCII symbols with
+ UTF-8 URI encoding.
+ * src/res.c (res_retrieve_file): Fix url_parse call.
+
+2011-07-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Make clearer that recursion,
+ by default, uses 5 levels.
+ Reported by: Marc Deop <damnshock@gmail.com>.
+
+2011-06-08 Giuseppe Scrivano <giuseppe@southpole.se>
+
+ * src/retr.c (retrieve_from_file): Parse the url careless if IRI is enabled.
+ Reported by: Volker Kuhlmann <list0570@paradise.net.nz>.
+
+2011-06-03 Merinov Nikolay <kim.roader@gmail.com>
+
+ * tests/Test-idn-cmd-utf8.px: Added test for idn with utf-8 local encoding.
+ * tests/Test-idn-robots-utf8.px: Added test for idn with utf-8 local encoding
+ and robots.txt file.
+ * tests/Makefile.am, run-px: Add new tests.
+2011-05-26 Steven Schweda <sms@antinode.info>
+ * src/connect.c [HAVE_SYS_SOCKET_H]: Include <sys/socket.h>.
+ [HAVE_SYS_SELECT_H]: Include <sys/select.h>.
+
+2011-05-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `strerror_r-posix'.
+
+2011-05-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (fd_read_body): Define max.
+
+2011-05-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (fd_read_body): Be sure the buffer size is at least 8Kb.
+ BUFSIZ may assume very small values with a negative impact on the
+ performances.
+
+ * src/mswindows.h [NEED_GAI_STRERROR]: remove definition for gai_strerror.
+
+2011-05-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * COPYING: Fix the copyright years.
+ Reported by: Brett Smith <brett@fsf.org>.
+
+2011-05-15 Ray Satiro <raysatiro@yahoo.com>
+
+ * src/connect.c (select_fd) [WINDOWS]: Ensure the socket is blocking.
+ * src/mswindows.h: Add declaration for set_windows_fd_as_blocking_socket.
+ * src/mswindows.c (set_windows_fd_as_blocking_socket): New function.
+
+ * src/openssl.c (openssl_read): Prevent loops on read errors.
+
+2011-04-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/html-url.c: Include "exists.h".
+ * src/gnutls.c (wgnutls_peek): Remove local variable `ret'.
+
+2011-04-21 Daniel Manrique <roadmr@tomechangosubanana.com> (tiny change)
+ * src/main.c (main): Set exit status when invalid host name given in
+ command line.
+ * src/html-url.c (get_urls_file): Set exit status when invalid host
+ name given in input file.
+
+2011-04-19 Ray Satiro <raysatiro@yahoo.com>
+
+ * configure.ac: Adjust indentation.
+
+2011-04-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (LIBS): Add $(LIB_CLOCK_GETTIME).
+
+2011-04-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c: Do not include <fcntl.h>.
+ * src/gnutls.c (wgnutls_peek): Ensure there is data available before attempt
+ a read on the blocking socket.
+
+ * src/Makefile.am (LIBS): Add $(LIB_CLOCK_GETTIME)
+ * src/utils.c: Include <sys/stat.h>. Do not include <sys/time.h>.
+ (touch): Use `futimens' instead of `utimes'.
+
+ * src/mswindows.h: Do not include <direct.h>. Remove macro definition for
+ mkdir.
+
+2011-04-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `mkdir'.
+
+2011-04-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/utils.c: Include <sys/time.h>. Do not include <sys/utime.h>.
+ (touch): Use `utimes' instead of `utime'.
+
+ * src/openssl.c (openssl_read): Fix build error.
+
+2011-04-17 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/wget.h [HAVE_LIBSSL32]: Define HAVE_SSL.
+
+ * src/gnutls.c (wgnutls_peek): Use correctly FIONBIO codes under Mingw32.
+ Reported by: Ray Satiro <raysatiro@yahoo.com>
+
+2011-04-17 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Do not check the host_os twice and if windres is
+ available.
+ Reported by: Ray Satiro <raysatiro@yahoo.com>
+
+2011-04-16 Ray Satiro <raysatiro@yahoo.com>
+2011-04-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Detect dynamically linked OpenSSL libraries under
+ mingw32.
+
+2011-04-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap: Update from gnulib.
+
+ * bootstrap.conf (gnulib_modules): Add `pipe' and `sigpipe'.
+
+ * .cvsignore: Remove file.
+ * .hgignore: Likewise.
+ * .symlinks: Likewise.
+
+ * bootstrap.conf (gnulib_modules): Add `mbtowc and `unlocked-io'.
+
+2011-04-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/openssl.c (openssl_poll): Check if the specified timeout is zero after
+ SSL_pending.
+ (openssl_peek): Make the call non-blocking.
+
+2011-04-11 Cristian Rodríguez <crrodriguez@opensuse.org> (tiny change)
+
+ * src/openssl.c (ssl_init) [! OPENSSL_NO_SSL2]: Use SSLv2 only when
+ available.
+
+2011-04-07 Ray Satiro <raysatiro@yahoo.com> (tiny change)
+
+ (wgnutls_read): Check for the GNUTLS_E_AGAIN return code in the recv
+ tight loop.
+ (wgnutls_write): Likewise.
+ (wgnutls_peek): Likewise.
+
+2011-04-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_peek): New local variable `read'.
+ Use `read' instead of `ret' to store the number of read bytes.
+ Reported by: Ray Satiro <raysatiro@yahoo.com>
+
+2011-04-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (ssl_init): Allow X509 v1 certificates.
+ Suggested by: Ray Satiro <raysatiro@yahoo.com>
+
+ (wgnutls_peek): Remove tight loop around gnutls_record_recv.
+
+2011-04-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (LIBS): Remove @LIBSSL@ @W32LIBS@
+
+2011-04-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/openssl.c [WINDOWS]: Include <w32sock.h>.
+ (openssl_read): Retry the read on SSL_ERROR_WANT_READ.
+
+ * src/host.c [WINDOWS]: Include <winsock2.h> and <ws2tcpip.h>.
+ Suggested by: Ray Satiro <raysatiro@yahoo.com>.
+
+ * src/Makefile.am (LIBS): Remove @LIBSSL@ @W32LIBS@
+
+2011-04-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Use AC_CHECK_LIB to look for the openssl library.
+
+2011-04-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c: Include <fcntl.h>.
+ (wgnutls_peek): Make the socket non blocking before attempt a read.
+
+ * src/gnutls.c: Include <sys/ioctl.h>.
+ (wgnutls_peek) [F_GETFL]: Use fcntl.
+ (wgnutls_peek) [! F_GETFL]: Use ioctl.
+
+
+2011-04-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `fcntl'.
+
+ (gnulib_modules): Add `ioctl'.
+
+2011-03-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/recur.c (download_child_p): When --no-parent is used, check that the
+ ports are the same only in case the same protocol is used.
+ Reported by: Karl Berry <karl@freefriends.org>
+
+ * src/res.c (res_parse): Add new line to debug messages.
+
+2011-03-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Fix the gnutls detection.
+
+2011-03-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/iri.h (parse_charset) [!ENABLE_IRI]: Use the parameter to avoid a
+ compiler warning.
+
+ * src/iri.h: Declare `dummy_iri' as extern not static.
+ * src/main.c [!ENABLE_IRI]: Define `dummy_iri'.
+ (main) [!ENABLE_IRI]: Initialize `dummy_iri'.
+
+2011-03-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi: Do not cite the current maintainer.
+ Reported by: Micah Cowan <micah@cowan.name>.
+
+2011-03-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap: Update from gnulib.
+
+2011-03-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (buildreq): Update build prerequisites list.
+
+2011-03-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (getftp): Fix some memory leaks.
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Likewise.
+ Reported by: Zhenbo Xu <zhenbo1987@gmail.com>.
+
+2011-03-02 Tomasz Buchert <tomek.buchert@gmail.com> (tiny change)
+
+ * src/http.c (ensure_extension): Do not adjust the extension if the file
+ ends in .htm.
+
+2011-02-22 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/http.c (gethttp, http_loop): Move duplicated code which is run
+ when an existing file is not to be clobbered to a function.
+ (get_file_flags): New static function.
+
+2011-02-22 Gilles Carry <gilles.carry@st.com>
+
+ * src/main.c (prompt_for_password): Use stderr instead of stdout
+ to prompt password. This allows to use --output-document=- and
+ --ask-password simultaneously. Without this, redirecting stdout
+ makes password prompt invisible and mucks up payload such as in
+ this example:
+ wget --output-document=- --ask-password -user=foo \
+ http://foo.com/tarball.tgz | tar zxf -
+
+2010-12-28 Adrien Nader <adrien@notk.org> (tiny change)
+
+ * src/main.c [WINDOWS]: Include <io.h> and <fcntl.h>.
+ (main) [WINDOWS]: Set the stdout file mode to binary.
+ Submitted also by: Martin Panter <vadmium@gmail.com>
+
+2010-12-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (HTTP Options): Remove sentence which doesn't reflect
+ the wget behaviour when -k -K are used with -E.
+ Reported by: pike-wget@kw.nl.
+
+2010-12-10 Evgeniy Philippov <egphilippov@googlemail.com> (tiny change)
+
+ * src/main.c (main): Initialize `total_downloaded_bytes'.
+
+2010-12-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (main): If --no-clobber and --convert-links are used at the
+ same time, use only the latter.
+ Reported by: Romain Vimont <rom@rom1v.com>
+
+2010-12-07 Jessica McKellar <jesstess@mit.edu> (tiny change)
+
+ * vms/WGET.HLP: Make help message clearer.
+
+2010-12-07 Jessica McKellar <jesstess@mit.edu> (tiny change)
+
+ * src/main.c: Make help message clearer.
+
+2010-12-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/build_info.c.in: Do not list md5.
+
+2010-12-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/cmpt.c: Include <unistd.h> inconditionally.
+ * src/connect.c: Likewise.
+ * src/convert.c: Likewise.
+ * src/ftp-basic.c: Likewise.
+ * src/ftp-ls.c: Likewise.
+ * src/ftp.c: Likewise.
+ * src/gnutls.c: Likewise.
+ * src/http.c: Likewise.
+ * src/init.c: Likewise.
+ * src/log.c: Likewise.
+ * src/main.c: Likewise.
+ * src/openssl.c: Likewise.
+ * src/progress.c: Likewise.
+ * src/ptimer.c: Likewise.
+ * src/recur.c: Likewise.
+ * src/retr.c: Likewise.
+ * src/url.c: Likewise.
+ * src/utils.c: Likewise.
+
+ * src/retr.c (fd_read_body): Dinamically allocate `dlbuf'.
+
+2010-11-27 Reza Snowdon <vivi@mage.me.uk>
+
+ * src/init.c (initialize): If 'ok' is not zero; exit, as this
+ indicates there was a problem parsing 'SYSTEM_WGETRC'.
+ Fixes bug #20370.
+
+2010-11-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ Revert last commit.
+ * src/ftp.c (getftp): When count > 0, don't append to the existing file.
+ * src/http.c (gethttp): Likewise.
+
+2010-11-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (getftp): If `count' is bigger than zero, try to resume the
+ download, not restart it.
+ * src/http.c (gethttp): Likewise.
+ Suggested by: Evgeny Kapun <abacabadabacaba@gmail.com>.
+
+2010-11-20 Filipe Brandenburger <filbranden@gmail.com> (tiny change)
+
+ * src/http.c (gethttp): Repeat a POST request on a 307 response.
+ * src/retr.c (retrieve_url): Use NEWLOCATION_KEEP_POST.
+ * src/wget.h: Define NEWLOCATION_KEEP_POST.
+
+2010-11-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (getftp): Accept new argument `count'. When `count' is
+ bigger than zero, assume the file can be overwritten.
+ (ftp_loop_internal): Pass new argument `count' to `getftp'.
+
+ * src/http.c (gethttp): Accept new argument `count'. When `count' is
+ bigger than zero, assume the file can be overwritten.
+ (http_loop): Pass new argument `count' to `gethttp'.
+ Reported by: Evgeny Kapun <abacabadabacaba@gmail.com>.
+
+2010-10-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Download Options): Remove unclear statement about the
+ --waitretry option.
+ Reported by: Manfred Koizar <mkoi-pg@aon.at>.
+
+2010-10-24 Jessica McKellar <jesstess@mit.edu> (tiny change)
+
+ * src/main.c (main): Print the total download time as part of the
+ summary for downloads using the recursive or page requisites
+ options. Fixes bug #21359.
+
+2010-10-24 Jessica McKellar <jesstess@mit.edu> (tiny change)
+
+ * NEWS: Mention the change to the the summary for recursive downloads.
+
+2010-10-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_peek): Do not return an error when
+ `gnutls_record_recv' fails but some data is already available.
+
+2010-10-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (LIBS): Remove @LIBGNUTLS@ and use @W32LIBS@ as last
+ component.
+
+2010-10-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am (LIBS): Remove @LIBGNUTLS@ and use @W32LIBS@ as last
+ component.
+
+ * src/gnutls.c (wgnutls_peek): Block until data is available.
+
+2010-10-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Add check for libgpg-error and libgcrypt.
+
+2010-10-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/retr.c (retrieve_url): Do not register HTML files twice.
+ Reported by: Manfred Koizar <mkoi-pg@aon.at>.
+
+2010-10-18 Manfred Koizar <mkoi-pg@aon.at> (tiny change)
+
+ * src/html-url.c (tag_handle_link): Do not assume external links type
+ to be always "text/html".
+
+2010-10-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/connect.c (socket_ip_address): Initialize `sockaddr' to zero.
+ * src/ftp-basic.c (ftp_epsv): Remove dead assignment to `s'.
+ * src/ftp-ls.c (ftp_parse_vms_ls): Remove dead assignment to `len'.
+ * src/http.c (skip_short_body): Remove dead assignment to `ret'.
+ * src/init.c (wgetrc_user_file_name): Remove dead assignment to `home'.
+ * src/main.c (main): Silent warning reported by clang.
+ (http_loop): Silent warning reported by clang.
+ * src/retr.c (retrieve_url): Likewise.
+ * src/url.c (init_seps): Remove dead assignment to `p'.
+
+2010-10-11 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (getftp): Initialize `targ'.
+
+2010-10-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (getftp): Fix indentation.
+
+2010-10-08 Ivanov Anton <x86mail@gmail.com> (tiny change)
+
+ * src/html-url.c (check_style_attr): Skip quotes when they are present.
+
+2010-10-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (main): Remove unused variable `status'.
+
+2010-09-25 Merinov Nikolay <kim.roader@gmail.com>
+
+ * src/init.c: Add "unlink" command into command list.
+ * src/main.c: Add "unlink" option into option_data list.
+ * src/options.h: Adding unlink field into struct options.
+ * src/wget.h: Addind UNLINKERR error into uerr_t enum.
+ * src/exits.c (get_status_for_err): define status for UNLINKERR.
+ * src/ftp.c (getftp): unlink file if exists, instead clobbering.
+ (ftp_loop_internal): processing UNLINKERR.
+ * src/http.c (gethttp): unlink file if exists, instead clobbering.
+ (http_loop): processing UNLINKERR.
+
+2010-09-25 Merinov Nikolay <kim.roader@gmail.com>
+
+ * doc/wget.texi (Download Options): Document --unlink option.
+
+2010-09-24 Dennis, CHENG Renquan <crquan@fedoraproject.org>
+
+ Fix problem when content-disposition is used with recursive downloading.
+ * src/url.h (url_file_name): Add a new argument `replaced_filename'.
+ * src/url.c (url_file_name): Likewise.
+ * src/http.c (parse_content_disposition): Do not add a prefix to the return
+ value.
+ (test_parse_content_disposition): Adjust tests.
+ (gethttp): Pass additional parameter to `url_file_name'.
+ (http_loop): Likewise.
+ * src/ftp.c (ftp_loop_internal, ftp_get_listing, ftp_retrieve_list)
+ (ftp_loop): Likewise.
+
+2010-09-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/convert.c (local_quote_string): Accept new parameter `no_html_quote'.
+ Inhibit HTML quoting when `no_html_quote'.
+ (convert_links): Disable HTML quoting in CSS files.
+ Reported by: Manuel Reinhardt <reinhardt@syslab.com>.
+
+2010-09-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Recursive Accept/Reject Options): Remove superfluous dot.
+ Reported by: Snader_LB.
+
+2010-09-12 Mike Frysinger <vapier@gentoo.org>
+
+ Fix some tests failures.
+ * tests/Test-iri-forced-remote.px: Use --trust-server-names to the cmdline
+ variable.
+ * tests/Test-iri-list.px: Likewise.
+ * tests/Test-iri.px: Likewise.
+
+2010-09-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_help): Align --trust-server-names help text with
+ the rest of the text.
+ Suggested by: Mike Frysinger <vapier@gentoo.org>.
+
+2010-09-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * lib/Makefile.am: Fix typo.
+
+2010-08-20 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/convert.c: Include "iri.h".
+ (convert_links_in_hashtable): Parse the url, if
+ necessary, before check if it is present in the dowloaded url
+ map.
+ Reported by: <sk.random@gmail.com>.
+
+2010-08-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ Fix a problem with HTTP/1.0 proxies.
+ * src/http.c (gethttp): Specify the connection header when keep alive
+ connections are not used.
+
+ Use persistent connections with proxies supporting them.
+ * src/http.c (gethttp): Specify Proxy-Connection to the HTTP proxy.
+
+2010-08-08 Reza Snowdon <vivi@mage.me.uk>
+
+ * src/main.c (main): inserted 'defaults'.
+ Added additional 'getopt_long' while loop to search and apply a
+ user specified config file before any other options.
+ New variables 'retconf', 'use_userconfig',
+ 'confval', 'userrc_ret', 'config_opt'.
+ * src/init.c: Include stdbool.h.
+ (commands): Added config details.
+ (defaults): Removed static.
+ (wgetrc): Removed static.
+ (initialize): Removed 'defaults ()',
+ changed 'int ok' to 'bool ok'.
+ * src/options.h: New variable 'choose_config'.
+ * src/init.h (defaults): exported function.
+ (run_wgetrc): exported function.
+
+2010-08-08 Reza Snowdon <vivi@mage.me.uk>
+ * doc/wget.texi: Added information about the config option to the
+ 'Overview' section and a description of the option in
+ 'Logging and Input File Options'.
+
+2010-08-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * Makefile.am (EXTRA_DIST): Remove configure.bat.
+
+2010-08-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/css-url.c (get_uri_string): Skip empty urls.
+
+2010-07-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/html-url.h (struct map_context): Remove member `tail'.
+
+ * src/html-url.c (append_url): Append the new url ordered by `position'.
+ (get_urls_html): Do not initialize `ctx.tail'.
+
+ * src/css-url.c (get_urls_css_file): Do not initialize `ctx.tail'.
+
+2010-07-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_peek): Don't read more data if the buffered peek
+ data is sufficient.
+
+2010-07-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.h (http_loop): Add new argument `original_url'
+ * src/http.c (http_loop): Add new argument `original_url'. Use
+ `original_url' to get a filename if `trustservernames' is false.
+
+ * src/init.c (commands): Add "trustservernames".
+
+ * src/options.h (library): Add variable `trustservernames'.
+
+ * src/main.c (option_data): Add trust-server-names.
+ (print_help): Describe --trust-server-names.
+
+ * src/retr.c (retrieve_url): Pass new argument to `http_loop'.
+
+2010-07-28 Alon Bar-Lev <alon.barlev@gmail.com> (tiny change)
+
+ * doc/texi2pod.pl: Use the warnings module only when it is available.
+
+2010-07-25 John Trengrove <jtrengrove@gmail.com> (tiny change)
+
+ * src/ftp.h: Added enum `parsetype'. Modified struct to hold parsetype.
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Default to TT_DAY. Change to TT_HOUR_MIN
+ if hours/minutes parsed.
+ (ftp_parse_winnt_ls): Default to TT_HOUR_MIN.
+ (ftp_parse_vms_ls): Default to TT_HOUR_MIN.
+ (ftp_index): Print only if fileinfo struct value ttype set to TT_HOUR_MIN.
+
+2010-07-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.bat: Remove file.
+
+2010-07-20 Leonid Petrov <nouser@lpetrov.net>
+
+ * src/ftp.c (getftp): Don't attempt to retrieve the file if it is already
+ completely.
+ (ftp_loop_internal): Force the length to be zero for symlinks.
+
+2010-07-20 Alan Jenkins <alan-jenkins@tuffmail.co.uk> (tiny change)
+
+ * src/http.c (gethttp): Check content-length was set before trying to
+ compare it with the already downloded filesize.
+
+2010-07-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (gethttp): If -N is used, don't exit immediately if the content
+ length is less or equal than the existing file size. Specify "Range"
+ only if -N is not used.
+ Reported by: Caleb Cushing <xenoterracide@gmail.com>.
+
+2010-07-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (max): Remove definition.
+ (getftp): New variable `got_expected_bytes'. Let `expected_bytes' be
+ the value SIZE returns, otherwise use the bytes count returned by RETR.
+ Suggested by Daniel Stenberg <daniel@haxx.se>.
+
+2010-07-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/ftp.c (max): Add definition.
+ (getftp): Consider for `expected_bytes' the greatest value between the
+ bytes count returned by SIZE and the bytes count returned by RETR.
+ Reported by: Jozua <jozua@sparky.za.net>.
+
+2010-07-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (http_loop): New variable `force_full_retrieve'. If the remote
+ file is newer that the local one then inhibit -c.
+ Reported by: Caleb Cushing <xenoterracide@gmail.com>.
+
+2010-07-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac (AC_CHECK_SIZEOF): Quote argument.
+ Reported by: Jochen Roderburg <Roderburg@Uni-Koeln.DE>.
+
+2010-07-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/css-url.c (get_urls_css_file): Use `wget_read_file' instead of
+ `read_file'. Use `wget_read_file_free' instead of `read_file_free'.
+ * src/convert.c (convert_links): Likewise.
+ * src/html-url.c (get_urls_html, get_urls_file): Likewise.
+ * src/res.c (res_parse_from_file): Likewise.
+
+ * src/utils.h: Rename `read_file' to `wget_read_file'. Rename
+ `read_file_free' to `wget_read_file_free'.
+
+ * src/utils.c (wget_read_file): Renamed from `read_file'.
+ (wget_read_file_free): Renamed from `read_file_free'.
+
+2010-07-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `vasprintf'. Remove `asprintf'.
+
+2010-07-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (buildreq): Relax gettext version to 0.17.
+
+2010-07-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (ssl_init): New local variables `ca_directory' and `dir'.
+ Load default root certificates under the `ca_directory' directory.
+
+2010-07-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `asprintf'.
+
+2010-07-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (ssl_connect_wget): New local variable `allowed_protocols'.
+ Honor the --secure-protocol flag.
+
+2010-06-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: By default use GNU TLS not OpenSSL.
+
+2010-06-20 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_help): Fix help string for --random-wait. Its range is
+ [0.5*wait, 1.5*wait) not [0, 2*wait).
+ Reported by: Tom Mizutani <gombei1970@gmail.com>.
+
+2010-06-17 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * windows: Remove directory.
+ * Makefile.am (SUBDIRS): Remove windows.
+ * configure.ac: Don't generate windows/Makefile.
+
+2010-06-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c [WIN32]: Include "w32sock.h".
+ (FD_TO_SOCKET): Add definition.
+ (ssl_connect_wget): Get the real socket handle by FD_TO_SOCKET.
+ Define FD_TO_SOCKET if it is not yet defined.
+
+2010-06-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * m4/wget.m4 (WGET_STRUCT_SOCKADDR_STORAGE): Guard header inclusions.
+ (TYPE_STRUCT_SOCKADDR_IN6): Likewise.
+ (MEMBER_SIN6_SCOPE_ID): Likewise.
+ (PROTO_INET6): Likewise.
+
+ * configure.ac: Don't check for `getaddrinfo'.
+
+ * bootstrap.conf (gnulib_modules): Add `getaddrinfo' module.
+
+2010-06-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c: Include <stdlib.h>.
+ (struct wgnutls_transport_context): Remove `peekstart'.
+ (ssl_connect_wget): Renamed from `ssl_connect'.
+ (wgnutls_poll): New variable `ctx'.
+ (wgnutls_read): Don't use `ctx->peekstart'.
+ (wgnutls_peek): Likewise. Don't attempt to read if there is not
+ ready data.
+
+2010-06-14 Giuseppe Scrivano <gscrivano@gnu.org>
+ * src/http.c (http_loop): Always send a HEAD request when -N is used
+ together with --content-disposition.
+ Reported by: Jochen Roderburg <Roderburg@Uni-Koeln.DE>.
+
+2010-06-10 Muthu Subramanian K <muthusuba@gmail.com> (tiny change)
+
+ * src/http.c (http_loop): Increase `total_downloaded_bytes' by
+ `hstat.rd_size', not `hstat.len'.
+
+2010-06-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_version): Drop the current maintainer line.
+
+2010-06-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am (build_info.c): Generate the `build_info.c' file under
+ the build directory.
+ Patch by: Daniel Stenberg <daniel@haxx.se>.
+
+2010-06-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac (AM_INIT_AUTOMAKE): Remove dist-bzip2 dist-lzma from
+ automake options.
+ Reported by: Daniel Stenberg <daniel@haxx.se>.
+
+2010-06-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (buildreq): Add definition.
+
+2010-06-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Test--no-content-disposition-trivial.px: Use /usr/bin/env to find the
+ perl interpreter.
+ * tests/Test--no-content-disposition.px: Likewise.
+ * tests/Test--spider-fail.px: Likewise.
+ * tests/Test--spider-r--no-content-disposition-trivial.px: Likewise.
+ * tests/Test--spider-r--no-content-disposition.px: Likewise.
+ * tests/Test--spider-r-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test--spider-r.px: Likewise.
+ * tests/Test--spider.px: Likewise.
+ * tests/Test-E-k-K.px: Likewise.
+ * tests/Test-E-k.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition-1.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition-2.px: Likewise.
+ * tests/Test-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-N--no-content-disposition-trivial.px: Likewise.
+ * tests/Test-N--no-content-disposition.px: Likewise.
+ * tests/Test-N-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-N-current.px: Likewise.
+ * tests/Test-N-no-info.px: Likewise.
+ * tests/Test-N-old.px: Likewise.
+ * tests/Test-N-smaller.px: Likewise.
+ * tests/Test-N.px: Likewise.
+ * tests/Test-O--no-content-disposition-trivial.px: Likewise.
+ * tests/Test-O--no-content-disposition.px: Likewise.
+ * tests/Test-O-HTTP-Content-Disposition.px: Likewise.
+ * tests/Test-O-nc.px: Likewise.
+ * tests/Test-O-nonexisting.px: Likewise.
+ * tests/Test-O.px: Likewise.
+ * tests/Test-Restrict-Lowercase.px: Likewise.
+ * tests/Test-Restrict-Uppercase.px: Likewise.
+ * tests/Test-auth-basic.px: Likewise.
+ * tests/Test-auth-no-challenge-url.px: Likewise.
+ * tests/Test-auth-no-challenge.px: Likewise.
+ * tests/Test-auth-retcode.px: Likewise.
+ * tests/Test-auth-with-content-disposition.px: Likewise.
+ * tests/Test-c-full.px: Likewise.
+ * tests/Test-c-partial.px: Likewise.
+ * tests/Test-c-shorter.px: Likewise.
+ * tests/Test-c.px: Likewise.
+ * tests/Test-cookies-401.px: Likewise.
+ * tests/Test-cookies.px: Likewise.
+ * tests/Test-ftp-bad-list.px: Likewise.
+ * tests/Test-ftp-iri-disabled.px: Likewise.
+ * tests/Test-ftp-iri-fallback.px: Likewise.
+ * tests/Test-ftp-iri-recursive.px: Likewise.
+ * tests/Test-ftp-iri.px: Likewise.
+ * tests/Test-ftp-pasv-fail.px: Likewise.
+ * tests/Test-ftp-recursive.px: Likewise.
+ * tests/Test-ftp.px: Likewise.
+ * tests/Test-i-ftp.px: Likewise.
+ * tests/Test-i-http.px: Likewise.
+ * tests/Test-idn-cmd.px: Likewise.
+ * tests/Test-idn-headers.px: Likewise.
+ * tests/Test-idn-meta.px: Likewise.
+ * tests/Test-idn-robots.px: Likewise.
+ * tests/Test-iri-disabled.px: Likewise.
+ * tests/Test-iri-forced-remote.px: Likewise.
+ * tests/Test-iri-list.px: Likewise.
+ * tests/Test-iri-percent.px: Likewise.
+ * tests/Test-iri.px: Likewise.
+ * tests/Test-k.px: Likewise.
+ * tests/Test-meta-robots.px: Likewise.
+ * tests/Test-nonexisting-quiet.px: Likewise.
+ * tests/Test-noop.px: Likewise.
+ * tests/Test-np.px: Likewise.
+ * tests/Test-proxied-https-auth.px: Likewise.
+ * tests/Test-proxy-auth-basic.px: Likewise.
+ * tests/Test-restrict-ascii.px: Likewise.
+ Reported by sci-fi@hush.ai.
+
+2010-06-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * build-aux/build_info.pl: Use /usr/bin/env to find the perl
+ interpreter.
+ * util/paramcheck.pl: Likewise.
+ * util/rmold.pl: Likewise.
+ Reported by sci-fi@hush.ai.
+
+2010-06-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (http_loop): Do not send a HEAD request before the GET request
+ when --content-disposition is used.
+ Reported by: alex_wh@mail.ru.
+
+2010-06-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac (W32LIBS): Remove -lwsock32.
+
+2010-06-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add iconv-h.
+
+2010-05-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/sysdep.h (_SVID_SOURCE): Remove definition.
+ (_BSD_SOURCE): Remove definition.
+
+2010-05-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/recur.c (retrieve_tree): Remove variable `up_error_code'.
+
+ * src/iri.c (open_locale_to_utf8): Remove function.
+
+2010-05-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/html-parse.c (map_html_tags): Fix condition for closed tag. Handle
+ the case '>' is not specified after '/'.
+
+2010-05-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/css.l: Use option "nounput".
+ (YY_NO_INPUT): Add macro definition.
+
+2010-05-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/html-parse.c (NAME_CHAR_P): Consider '<' an invalid character.
+ (advance_declaration): Close the tag if '<' is found.
+ (map_html_tags): Likewise.
+
+2010-05-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (EXTRA_DIST): Add Test-auth-retcode.px.
+
+ * tests/run-px (tests): Likewise.
+
+ * tests/Test-auth-retcode.px: New file.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (print_usage): Accept a new parameter `error'.
+ (main): Print diagnostic messages to stderr, not stdout.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/main.c (main): Exit with failure when -k is specified and -O is not
+ a regular file.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (gethttp): Consider new cookies retrieved when the
+ authorization fails.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am (wget_SOURCES): Remove `snprintf.c'.
+
+ * src/snprintf.c: Remove file.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/wget.texi (Download Options): Document that -k can be used with -O
+ only with regular files.
+
+2010-05-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add `snprintf' module.
+
+ * configure.ac: Remove check for the `snprintf' function.
+
+2010-05-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/host.c (sufmatch): Do not consider zero length entries.
+
+ * src/http.c (H_10X): New macro.
+ (gethttp): Silently ignore 1xx responses.
+
+2010-05-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/iri.h (dummy_iri): Define static.
+
+ * src/css-tokens.h (css_tokens): Remove variable.
+
+2010-05-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (http_atotm): Count the NUL character when copying the locale
+ string.
+ Reported by: Florian Weimer <fw@deneb.enyo.de>
+
+2010-05-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (../md5/libmd5.a): Remove rule.
+ (LDADD): Remove MD5_LDADD.
+
+2010-05-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am (LDADD): Remove MD5_LDADD.
+ (MD5_LDADD): Remove definition.
+ (AM_CPPFLAGS): Remove MD5_CPPFLAGS.
+ (version.c): Remove dependency from MD5_LDADD.
+ (../md5/libmd5.a): Remove rule.
+
+ * src/ftp-opie.c: Include "md5.h". Do not include "gen-md5.h".
+ (skey_response): New variable ctx. Use md5 functions from the gnulib
+ module instead of functions defined previously in the "gen-md5.h" file.
+
+ * src/gen-md5.h: Remove file.
+ * src/gen-md5.c: Likewise.
+
+ * src/http.c: Include "md5.h". Do not include "gen-md5.h".
+ (digest_authentication_encode): New variable ctx. Use md5 functions
+ from the gnulib module instead of functions defined previously in the
+ "gen-md5.h" file.
+
+2010-05-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * md5: Remove directory.
+
+ * bootstrap.conf (gnulib_modules): Add crypto/md5.
+
+ * configure.ac: Remove any check for md5 libraries.
+
+ * Makefile.am (ACLOCAL_AMFLAGS): Remove -I md5/m4.
+ (SUBDIRS): Remove md5.
+
+2010-05-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am: Quote any path using $(top_srcdir) or $(top_builddir).
+ (version.c): Remove dependency from configure.ac and Makefile.am.
+
+ * src/css.l: Include "wget.h".
+
+2010-05-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap.conf (gnulib_modules): Add "getopt-gnu". Remove "getopt".
+
+2010-05-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap (gnulib_path): Default to "gnulib" if it doesn't have a
+ value. Redirect "git clone" stderr to stdout.
+
+2010-05-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * build-aux/bzr-version-gen: New file.
+
+ * Makefile.am (EXTRA_DIST): Add .version.
+ (BUILT_SOURCES): New defition.
+ (.version): New rule.
+ (dist-hook): Likewise.
+
+ * configure.ac (AC_INIT): Use build-aux/bzr-version-gen to generate the
+ version string.
+
+2010-05-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am: Update copyright years.
+
+2010-05-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am: Update copyright years.
+ * src/cmpt.c: Likewise.
+ * src/connect.h: Likewise.
+ * src/convert.c: Likewise.
+ * src/convert.h: Likewise.
+ * src/cookies.c: Likewise.
+ * src/cookies.h: Likewise.
+ * src/css-tokens.h: Likewise.
+ * src/css-url.c: Likewise.
+ * src/css-url.h: Likewise.
+ * src/css.l: Likewise.
+ * src/exits.c: Likewise.
+ * src/exits.h: Likewise.
+ * src/ftp-basic.c: Likewise.
+ * src/ftp-ls.c: Likewise.
+ * src/ftp-opie.c: Likewise.
+ * src/ftp.c: Likewise.
+ * src/ftp.h: Likewise.
+ * src/gen-md5.c: Likewise.
+ * src/gen-md5.h: Likewise.
+ * src/gettext.h: Likewise.
+ * src/gnutls.c: Likewise.
+ * src/hash.c: Likewise.
+ * src/hash.h: Likewise.
+ * src/host.c: Likewise.
+ * src/host.h: Likewise.
+ * src/html-parse.c: Likewise.
+ * src/html-parse.h: Likewise.
+ * src/html-url.c: Likewise.
+ * src/html-url.h: Likewise.
+ * src/http-ntlm.c: Likewise.
+ * src/http-ntlm.h: Likewise.
+ * src/http.c: Likewise.
+ * src/http.h: Likewise.
+ * src/init.c: Likewise.
+ * src/init.h: Likewise.
+ * src/iri.c: Likewise.
+ * src/iri.h: Likewise.
+ * src/log.c: Likewise.
+ * src/log.h: Likewise.
+ * src/main.c: Likewise.
+ * src/mswindows.c: Likewise.
+ * src/mswindows.h: Likewise.
+ * src/netrc.c: Likewise.
+ * src/netrc.h: Likewise.
+ * src/openssl.c: Likewise.
+ * src/options.h: Likewise.
+ * src/progress.c: Likewise.
+ * src/progress.h: Likewise.
+ * src/ptimer.c: Likewise.
+ * src/ptimer.h: Likewise.
+ * src/recur.c: Likewise.
+ * src/recur.h: Likewise.
+ * src/res.c: Likewise.
+ * src/res.h: Likewise.
+ * src/retr.c: Likewise.
+ * src/retr.h: Likewise.
+ * src/spider.c: Likewise.
+ * src/spider.h: Likewise.
+ * src/ssl.h: Likewise.
+ * src/sysdep.h: Likewise.
+ * src/test.c: Likewise.
+ * src/test.h: Likewise.
+ * src/url.c: Likewise.
+ * src/url.h: Likewise.
+ * src/utils.c: Likewise.
+ * src/utils.h: Likewise.
+ * src/wget.h: Likewise.
+
+2010-05-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * doc/Makefile.am: Update copyright years.
+
+ * doc/fdl.texi: Likewise.
+
+ * doc/texi2pod.pl: Likewise.
+
+ * doc/wget.texi: Likewise.
+
+2010-05-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * Makefile.am: Update copyright years.
+
+ * build-aux/build_info.pl: Likewise.
+
+ * configure.ac: Likewise.
+
+ * configure.bat: Likewise.
+
+ * doc/Makefile.am: Likewise.
+
+ * doc/fdl.texi: Likewise.
+
+ * doc/texi2pod.pl: Likewise.
+
+ * doc/wget.texi: Likewise.
+
+ * m4/exitfail.m4: Likewise.
+
+ * m4/getpagesize.m4: Likewise.
+
+ * m4/wchar.m4: Likewise.
+
+ * m4/wctype.m4: Likewise.
+
+ * m4/wget.m4: Likewise.
+
+ * md5/Makefile.am: Likewise.
+
+ * md5/dummy.c: Likewise.
+
+ * md5/m4/00gnulib.m4: Likewise.
+
+ * md5/m4/gnulib-cache.m4: Likewise.
+
+ * md5/m4/gnulib-common.m4: Likewise.
+
+ * md5/m4/gnulib-comp.m4: Likewise.
+
+ * md5/m4/gnulib-tool.m4: Likewise.
+
+ * md5/m4/include_next.m4: Likewise.
+
+ * md5/m4/longlong.m4: Likewise.
+
+ * md5/m4/md5.m4: Likewise.
+
+ * md5/m4/multiarch.m4: Likewise.
+
+ * md5/m4/stddef_h.m4: Likewise.
+
+ * md5/m4/stdint.m4: Likewise.
+
+ * md5/m4/wchar.m4: Likewise.
+
+ * md5/m4/wchar_t.m4: Likewise.
+
+ * md5/m4/wint_t.m4: Likewise.
+
+ * md5/md5.h: Likewise.
+
+ * md5/stddef.in.h: Likewise.
+
+ * md5/stdint.in.h: Likewise.
+
+ * md5/wchar.in.h: Likewise.
+
+ * msdos/config.h: Likewise.
+
+ * msdos/msdos.c: Likewise.
+
+ * po/POTFILES.in: Likewise.
+
+ * util/Makefile.am: Likewise.
+
+ * util/paramcheck.pl: Likewise.
+
+ * util/rmold.pl: Likewise.
+
+2010-05-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * tests/Makefile.am (LIBS): Add definition.
+ (LDADD): Add LIBS.
+
+2010-05-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/gnutls.c (wgnutls_close): Use always `close', not `closesocket'.
+ * src/openssl.c (openssl_close): Use always `close', not `closesocket'.
+ (ssl_connect_wget): Get the real socket handle by FD_TO_SOCKET.
+ Define FD_TO_SOCKET if it is not yet defined.
+ * src/Makefile.am (libunittest_a_CPPFLAGS): Add -I$(top_builddir)/lib.
+ * src/mswindows.h: Always include <winsock2.h> and <ws2tcpip.h>. Do not
+ include <winsock.h>.
+ [! INHIBIT_WRAP]: Remove macro's socket, bind, connect, accept, recv,
+ send, select, getsockname, getpeername, setsockopt, closesocket.
+ Remove wrapped_socket, wrapped_bind, wrapped_connect, wrapped_listen,
+ wrapped_accept, wrapped_recv, wrapped_send, wrapped_select,
+ wrapped_getsockname, wrapped_getpeername, wrapped_setsockopt,
+ wrapped_closesocket prototypes.
+ * src/mswindows.c: Remove wrapped_socket, wrapped_bind, wrapped_connect,
+ wrapped_listen, wrapped_accept, wrapped_recv, wrapped_send,
+ wrapped_select, wrapped_getsockname, wrapped_getpeername,
+ wrapped_setsockopt, wrapped_closesocket functions. Remove WRAP macro.
+ * src/host.h [WINDOWS]: Include <winsock2.h> not <winsock.h>.
+ * src/connect.c: Include <sys/socket.h> and <sys/select.h> on any platform,
+ gnulib ensures they exist. Remove `read', `write', `close' macros.
+ * src/Makefile.am: Copy build_info.c.in only if we are working in a VPATH.
+ (AM_CPPFLAGS): Add directory with generated gnulib files.
+
+2010-05-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Don't call macro WGET_SOCKLEN_T.
+ (W32LIBS): Add -lws2_32.
+
+ * Makefile.am (EXTRA_DIST): Remove autogen.sh.
+
+ * bootstrap.conf (gnulib_modules): Use new modules from gnulib: accept,
+ bind, close, connect, getpeername, getsockname, listen, setsockopt.
+
+ * m4/wget.m4 (WGET_SOCKLEN_T): Remove macro.
+
+ * po/wget.pot: Remove.
+
+2010-05-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac (ALL_LINGUAS): Remove.
+
+2010-05-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/Makefile.am (build_info.c): Generate build_info.c in the builddir,
+ not srcdir.
+
+2010-05-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * bootstrap: New file.
+ * bootstrap.conf: New file.
+ * lib/Makefile.am: include gnulib.mk.
+ * autogen.sh: Removed.
+ * GNUmakefile: Likewise.
+ * INSTALL: Likewise.
+ * build-aux/announce-gen: Likewise.
+ * build-aux/compile: Likewise.
+ * build-aux/config.guess: Likewise.
+ * build-aux/config.rpath: Likewise.
+ * build-aux/config.sub: Likewise.
+ * build-aux/depcomp: Likewise.
+ * build-aux/gnupload: Likewise.
+ * build-aux/install-sh: Likewise.
+ * build-aux/mdate-sh: Likewise.
+ * build-aux/missing: Likewise.
+ * build-aux/mkinstalldirs: Likewise.
+ * build-aux/texinfo.tex: Likewise.
+ * build-aux/update-copyright: Likewise.
+ * build-aux/useless-if-before-free: Likewise.
+ * build-aux/vc-list-files: Likewise.
+ * build-aux/ylwrap: Likewise.
+ * lib/DESCRIP_DEPS.MMS: Likewise.
+ * lib/DESCRIP_MODS.MMS: Likewise.
+ * lib/DESCRIP_SRC.MMS: Likewise.
+ * lib/alloca.c: Likewise.
+ * lib/alloca.in.h: Likewise.
+ * lib/c-ctype.c: Likewise.
+ * lib/c-ctype.h: Likewise.
+ * lib/config.charset: Likewise.
+ * lib/errno.in.h: Likewise.
+ * lib/error.c: Likewise.
+ * lib/error.h: Likewise.
+ * lib/exitfail.c: Likewise.
+ * lib/exitfail.h: Likewise.
+ * lib/fseeko.c: Likewise.
+ * lib/getdelim.c: Likewise.
+ * lib/getline.c: Likewise.
+ * lib/getopt.c: Likewise.
+ * lib/getopt.in.h: Likewise.
+ * lib/getopt1.c: Likewise.
+ * lib/getopt_int.h: Likewise.
+ * lib/getpagesize.c: Likewise.
+ * lib/getpass.c: Likewise.
+ * lib/getpass.h: Likewise.
+ * lib/gettext.h: Likewise.
+ * lib/intprops.h: Likewise.
+ * lib/localcharset.c: Likewise.
+ * lib/localcharset.h: Likewise.
+ * lib/lseek.c: Likewise.
+ * lib/mbrtowc.c: Likewise.
+ * lib/mbsinit.c: Likewise.
+ * lib/memchr.c: Likewise.
+ * lib/memchr.valgrind: Likewise.
+ * lib/quote.c: Likewise.
+ * lib/quote.h: Likewise.
+ * lib/quotearg.c: Likewise.
+ * lib/quotearg.h: Likewise.
+ * lib/realloc.c: Likewise.
+ * lib/ref-add.sin: Likewise.
+ * lib/ref-del.sin: Likewise.
+ * lib/stdbool.in.h: Likewise.
+ * lib/stddef.in.h: Likewise.
+ * lib/stdint.in.h: Likewise.
+ * lib/stdio-impl.h: Likewise.
+ * lib/stdio-write.c: Likewise.
+ * lib/stdio.in.h: Likewise.
+ * lib/stdlib.in.h: Likewise.
+ * lib/str-two-way.h: Likewise.
+ * lib/strcasecmp.c: Likewise.
+ * lib/strcasestr.c: Likewise.
+ * lib/streq.h: Likewise.
+ * lib/strerror.c: Likewise.
+ * lib/string.in.h: Likewise.
+ * lib/strings.in.h: Likewise.
+ * lib/strncasecmp.c: Likewise.
+ * lib/unistd.in.h: Likewise.
+ * lib/verify.h: Likewise.
+ * lib/wchar.in.h: Likewise.
+ * lib/wctype.in.h: Likewise.
+ * lib/xalloc-die.c: Likewise.
+ * lib/xalloc.h: Likewise.
+ * lib/xmalloc.c: Likewise.
+ * m4/00gnulib.m4: Likewise.
+ * m4/alloca.m4: Likewise.
+ * m4/codeset.m4: Likewise.
+ * m4/errno_h.m4: Likewise.
+ * m4/error.m4: Likewise.
+ * m4/extensions.m4: Likewise.
+ * m4/fseeko.m4: Likewise.
+ * m4/getdelim.m4: Likewise.
+ * m4/getline.m4: Likewise.
+ * m4/getopt.m4: Likewise.
+ * m4/getpass.m4: Likewise.
+ * m4/gettext.m4: Likewise.
+ * m4/glibc21.m4: Likewise.
+ * m4/gnulib-cache.m4: Likewise.
+ * m4/gnulib-common.m4: Likewise.
+ * m4/gnulib-comp.m4: Likewise.
+ * m4/gnulib-tool.m4: Likewise.
+ * m4/iconv.m4: Likewise.
+ * m4/include_next.m4: Likewise.
+ * m4/inline.m4: Likewise.
+ * m4/lib-ld.m4: Likewise.
+ * m4/lib-link.m4: Likewise.
+ * m4/lib-prefix.m4: Likewise.
+ * m4/localcharset.m4: Likewise.
+ * m4/locale-fr.m4: Likewise.
+ * m4/locale-ja.m4: Likewise.
+ * m4/locale-zh.m4: Likewise.
+ * m4/longlong.m4: Likewise.
+ * m4/lseek.m4: Likewise.
+ * m4/malloc.m4: Likewise.
+ * m4/mbrtowc.m4: Likewise.
+ * m4/mbsinit.m4: Likewise.
+ * m4/mbstate_t.m4: Likewise.
+ * m4/memchr.m4: Likewise.
+ * m4/mmap-anon.m4: Likewise.
+ * m4/multiarch.m4: Likewise.
+ * m4/nls.m4: Likewise.
+ * m4/po.m4: Likewise.
+ * m4/progtest.m4: Likewise.
+ * m4/quote.m4: Likewise.
+ * m4/quotearg.m4: Likewise.
+ * m4/realloc.m4: Likewise.
+ * m4/stdbool.m4: Likewise.
+ * m4/stddef_h.m4: Likewise.
+ * m4/stdint.m4: Likewise.
+ * m4/stdio_h.m4: Likewise.
+ * m4/stdlib_h.m4: Likewise.
+ * m4/strcase.m4: Likewise.
+ * m4/strcasestr.m4: Likewise.
+ * m4/strerror.m4: Likewise.
+ * m4/string_h.m4: Likewise.
+ * m4/strings_h.m4: Likewise.
+ * m4/unistd_h.m4: Likewise.
+ * m4/wchar_t.m4: Likewise.
+ * m4/wint_t.m4: Likewise.
+ * m4/xalloc.m4: Likewise.
+ * maint.mk: Likewise.
+ * po/Makefile.in.in: Likewise.
+ * po/Makevars: Likewise.
+ * po/Rules-quot: Likewise.
+ * po/be.po: Likewise.
+ * po/bg.po: Likewise.
+ * po/boldquot.sed: Likewise.
+ * po/ca.po: Likewise.
+ * po/cs.po: Likewise.
+ * po/da.po: Likewise.
+ * po/de.po: Likewise.
+ * po/el.po: Likewise.
+ * po/en_GB.po: Likewise.
+ * po/eo.po: Likewise.
+ * po/es.po: Likewise.
+ * po/et.po: Likewise.
+ * po/eu.po: Likewise.
+ * po/fi.po: Likewise.
+ * po/fr.po: Likewise.
+ * po/ga.po: Likewise.
+ * po/gl.po: Likewise.
+ * po/he.po: Likewise.
+ * po/hr.po: Likewise.
+ * po/hu.po: Likewise.
+ * po/id.po: Likewise.
+ * po/it.po: Likewise.
+ * po/ja.po: Likewise.
+ * po/lt.po: Likewise.
+ * po/nb.po: Likewise.
+ * po/nl.po: Likewise.
+ * po/pl.po: Likewise.
+ * po/pt.po: Likewise.
+ * po/pt_BR.po: Likewise.
+ * po/quot.sed: Likewise.
+ * po/ro.po: Likewise.
+ * po/ru.po: Likewise.
+ * po/sk.po: Likewise.
+ * po/sl.po: Likewise.
+ * po/sr.po: Likewise.
+ * po/sv.po: Likewise.
+ * po/tr.po: Likewise.
+ * po/uk.po: Likewise.
+ * po/vi.po: Likewise.
+ * po/zh_CN.po: Likewise.
+ * po/zh_TW.po: Likewise.
+
+2010-05-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (gethttp): Give a nicer message on a malformed status line.
+
+2010-05-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (gethttp): Check `resp_status' return code and handle
+ errors.
+
+2010-05-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * AUTHORS: Added myself.
+
+2010-05-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.ac: Fix a sanity check by the AC_CONFIG_SRCDIR macro.
+
+2010-05-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * src/http.c (request_send): Specify 1.1 as HTTP version for requests.
+ (skip_short_body): Accept new parameter `chunked'. New variable
+ `remaining_chunk_size'. Handle the chunked transfer encoding.
+ (gethttp): New variable `chunked_transfer_encoding`. Set `keepalive'
+ by default to true. Check if the server is using the chunked transfer
+ encoding.
+
+ * src/retr.h: Define `rb_chunked_transfer_encoding'.
+
+ * src/retr.c (fd_read_body): New variable `chunked'. New variable
+ `remaining_chunk_size'. Handle the chunked transfer encoding.
+
+2010-05-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * NEWS: Mention support for HTTP/1.1.
+
+2010-03-04 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (ftp_loop_internal): Omit input file from being
+ deleted after retrieval.
+
+ * src/retr.c (input_file_url): New function.
+
+ * src/retr.h: Add declaration for input_file_url.
+
+2010-03-02 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/retr.c (retrieve_from_file): Improve checking for a URL
+ by invoking url_valid_scheme instead of url_has_scheme.
+
+ * src/url.c (url_valid_scheme): New function.
+
+ * src/url.h: Add declaration for url_valid_scheme.
+
+2010-03-02 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/retr.c (retrieve_from_file): Free memory of input file.
+
+2010-03-01 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Test-i-ftp.px: Test --input-file in conjunction with FTP.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added Test-i-ftp.px.
+
+2010-03-01 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/retr.c (retrieve_url): Retrieve the local filename from ftp_loop.
+ (retrieve_from_file): Return if there's no input file.
+
+ * src/ftp.c (ftp_loop_internal): Duplicate the local filename into
+ retrieve_url's scope when a valid reference is being passed.
+ (ftp_loop): Call ftp_loop_internal here with passing a
+ reference to the local filename, elsewhere with NULL.
+
+ * src/ftp.h: Adjust declaration of ftp_loop.
+
+2010-02-26 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Test-i-http.px: Test --input-file in conjunction with HTTP.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added Test-i-http.px.
+
+2010-02-25 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/FTPServer.pm (FTPServer::new): Substitute port placeholders
+ in content of files to be retrieved via FTP.
+
+2010-01-27 Paul Townsend <aab@purdue.edu> (tiny change)
+
+ * src/retr.c (fd_read_body): Be sure to measure timer when time has
+ elapsed, too, not just when we've made progress.
+
+2010-01-13 Micah Cowan <micah@cowan.name>
+
+ * src/openssl.c: Fixed some mixed declarations-and-code.
+
+2010-01-09 Micah Cowan <micah@cowan.name>
+
+ * src/init.c, main.c, http.c, ftp.c, options.h: Renamed
+ --no-match-server-timestamps to --no-use-server-timestamps, and
+ add it to print_help.
+
+2010-01-09 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): Documented
+ --no-use-server-timestamps.
+
+2010-01-09 Jeremy Olexa <darkside@gentoo.org> (tiny change)
+
+ * src/init.c: Deal with systems which provide PATH_MAX in
+ sys/param.h rather than limits.h.
+
+2010-01-09 David Holman <holman.david@gmail.com> (tiny change)
+
+ * src/init.c, main.c, http.c, ftp.c, options.h: Added support for
+ --no-match-server-timestamps.
+
+2009-12-03 Peter Rosin <peda@lysator.liu.se>
+
+ * src/snprintf.c (dopr): Output %p as unsigned.
+
+2009-10-24 Petr Pisar <petr.pisar@atlas.cz>
+
+ * src/openssl.c: Implement support for (multiple) subjectAltNames in
+ X509 certificates, not just the commonName.
+
+2009-10-14 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Test-E-k-K.px, Test-cookies-401.px, Test-ftp-bad-list.px,
+ Test-iri-list.px, Test-iri.px: Removed -d from invocation.
+ Patch by Mike Frysinger.
+
+2009-10-09 Steven Schweda <sms@antinode.info>
+
+ * src/utils.c: Added characters " : \ | to the list of normal
+ caret-escaped (ODS5) characters in the char_prop[] table.
+
+2009-10-09 Steven Schweda <sms@antinode.info>
+
+ * New VMS MMS/MMK builders, to accommodate the new source tree
+ structure:
+ lib/DESCRIP_DEPS.MMS Dependencies (lib)
+ lib/DESCRIP_MODS.MMS Modules (lib)
+ lib/DESCRIP_SRC.MMS Main (lib)
+ md5/DESCRIP_DEPS.MMS Dependencies (md5)
+ md5/DESCRIP_MODS.MMS Modules (md5)
+ md5/DESCRIP_SRC.MMS Main (md5)
+ src/DESCRIP_DEPS.MMS Dependencies (src)
+ src/DESCRIP_MODS.MMS Modules (src)
+ src/DESCRIP_SRC.MMS Main (src)
+ vms/DESCRIP.MMS Main (global)
+ vms/DESCRIP_MKDEPS.MMS Dependency generator
+ vms/DESCRIP_SRC.MMS Main (main)
+ vms/DESCRIP_SRC_CMN.MMS Main (common)
+ vms/DESCRIP_SRC_FLAGS.MMS Compiler and linker flags
+ vms/COLLECT_DEPS.COM Dependency processor
+ vms/CONFIG_EXTRACT.COM Extract AC_INIT from configure.ac
+ vms/WGET_MULTINET.OPT Link options for (old) MultiNet
+ vms/WGET_SSL_HP.OPT Link options for HP SSL
+ vms/WGET_SSL_O.OPT Link options for OpenSSL
+
+ * Other VMS-specific files:
+ vms/alloca.h Dummy alloca.h.
+ vms/config.h_vms Manually crafted config.h
+ vms/stdint.h Dummy stdint.h
+ vms/vms.h Declarations, prototypes for vms.c
+ vms/vms_ip.h Helper for netdb.h
+ vms/VMS_NOTES.TXT Instructions, notes
+ vms/WGET.HLP Basic VMS HELP
+
+2009-10-09 Micah Cowan <micah@cowan.name>
+
+ * src/main.c: Fix declaration of compiled_features.
+
+ * src/build_info.c.in: Adapt to new input format. Added a check for
+ large-file support. Replaced the "openssl" and "gnutls"
+ advertisements with a single "ssl/foo" advertisement.
+
+2009-10-09 Micah Cowan <micah@cowan.name>
+
+ * build_aux/build_info.pl: Reworked the input format. Eliminated
+ support, and need, for arbitrary #if blocks. Introduced
+ "choices", and explicitly open the .c file rather than print to
+ STDOUT, so we avoid creating the file if we find problems with
+ the input. Options are advertised in alphabetical order.
+
+2009-09-30 Micah Cowan <micah@cowan.name>
+
+ * src/sysdep.h: Unconditionally include stdbool.h (gnulib has it for
+ systems that don't supply it.)
+
+ * src/vms.c: Added functions vms_basename(), used to extract the
+ bare executable name from argv[0], and vms_getpass(), a
+ VMS-specific replacement for GNU getpass().
+
+ vms.c: Added global string constants: compilation_string
+ (NULL), link_string (NULL), and version_string (real).
+
+2009-09-27 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-idn-cmd.px, Test-idn-headers.px, Test-idn-meta.px,
+ Test-idn-robots.px, Test-proxy-auth-basic.px: Removed --debug from
+ invocation (in case it wasn't built with --debug support).
+
+2009-09-24 Steven Schweda <sms@antinode.info>
+
+ * src/main.c (print_version): Remove VMS-conditional build info
+ string; the new VMS builders use OS_TYPE.
+
+ * src/ftp.c (getftp): Fix accidental use of target -> targ.
+
+2009-09-24 Micah Cowan <micah@cowan.name>
+
+ * vms/vms.c: Moved to src/src.c.
+
+2009-09-24 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-ftp-iri-disabled.px: Fix name "Test-ftp-iri" ->
+ "test-ftp-iri-disabled"
+
+ * tests/Test-ftp-iri-fallback.px: Fix name "Test-ftp-iri" ->
+ "test-ftp-iri-fallback"
+
+2009-09-24 Micah Cowan <micah@cowan.name>
+
+ * src/vms.c: Moved from vms/vms.c.
+
+ * src/sysdep.h: Use proper prototypes for snprintf, vsnprintf (thanks
+ to Steven Schweda).
+
+2009-09-24 Micah Cowan <micah@cowan.name>
+
+ * src/host.c (host_errstr): host_errstr should return const char *.
+
+2009-09-22 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am (version.c): Explicitly tell Mercurial where the
+ top-source repository should be, so it doesn't accidentally use
+ the repository for a containing directory (for instance, if the
+ user's home directory is managed by a Mercurial repo). Also
+ ensures we find the repository, even if the build directory is
+ outside the source directory.
+
+ * src/wget.h: define WINDOWS if _WIN32 or __WIN32__ is defined, but
+ not __CYGWIN__.
+
+ * src/mswindows.c (xsleep): Check for availability of the sleep
+ function, in addition to the usleep function.
+ (get_winsock_error, windows_strerror): Removed (gnulib already
+ supplies this functionality).
+
+ * src/mswindows.h [NEED_GAI_STRERROR]: define gai_strerror
+ to (gnulib's) strerror, rather than windows_strerror. Removed
+ error macro definitions provided by gnulib.
+ (windows_strerror): Removed (gnulib already supplies this
+ functionality).
+
+ * src/host.c: Don't declare h_errno when building on Windows.
+
+ * src/Makefile.am (LIBS): Added @W32LIBS@.
+ (EXTRA_wget_SOURCES): Removed (it's in LIBOBJ now).
+ (version.c): Removed dependency on $(LDADD), since it may include
+ dependencies that are not part of the Wget sources (-lwsock32, for
+ instance).
+
+ * src/openssl.c (ssl_check_certificate): Avoid reusing the same buffer
+ space for successive quoted arguments. Thanks to Steven Schweda
+ for pointing out the problem.
+
+2009-09-22 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Added "sleep" and "symlink" to AC_CHECK_FUNCS,
+ removing the hard-coded definition of HAVE_SYMLINK. When running
+ on MinGW, compile mswindows.c, and link against libwsock32.
+
+2009-09-22 Arvind Jamuna Dixit <ardsrk@gmail.com>
+
+ * src/http.c (extract_param, parse_content_disposition): Support
+ RFC 2231 while parsing Content-Disposition header
+
+2009-09-21 Micah Cowan <micah@cowan.name>
+
+ * vms/VMS-WGET.COM: "the the" -> "the".
+
+ * po/POTFILES.in: Removed some files that are not using gettext.
+
+ * po/*.po: Updated from translationproject.org.
+
+2009-09-21 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (update_speed_ring): "the the" -> "the".
+
+ * src/css-url.c, iri.c, mswindows.c: Removed assert.h inclusion (not
+ using it).
+
+2009-09-20 Micah Cowan <micah@cowan.name>
+
+ * INSTALL: Various minor adjustments to bring it up to date.
+
+2009-09-11 Steven Schweda <sms@antinode.info>
+
+ * src/utils.c, utils.h (fopen_excl): Make second argument an int,
+ rather than a bool (so it can handle the appropriate VMS version
+ of the flag).
+
+ * src/main.c (print_version): Don't print LOCALEDIR unless NLS is
+ enabled.
+
+ * src/http.c (gethttp): Pass FOPEN_BIN_FLAG, instead of true.
+
+ * src/ftp.c (ftp_retrieve_glob): Cast strcmp to assign to cmp, for a
+ silly HP build environment.
+
+2009-09-09 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Add bz2 and lzma dists.
+
+2009-09-08 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/main.c, init.c: Mark the --preserve-permissions and
+ --html-extension option as deprecated.
+
+2009-09-08 Micah Cowan <micah@cowan.name>
+
+ * po/*.po: Updated from translationproject.org.
+
+2009-09-07 Micah Cowan <micah@cowan.name>
+
+ * tests/run-px: Exit with a failure if there were any tests with
+ "unknown" exit statuses.
+
+ * tests/Test-auth-with-content-disposition.px: New. Test Content-Disposition
+ support when HTTP authentication is required.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added
+ Test-auth-with-content-disposition.px.
+
+ * tests/FTPServer.pm (FTPServer::run): Pass "server behavior" information to
+ newly-constructed FTPPaths object.
+ (FTPPaths::initialize): Accept "server behavior" hash.
+ (FTPPaths::_format_for_list): If server behavior has "bad_list"
+ set, then always report 0 for the size.
+ * tests/Test-ftp-bad-list.px: Added. Attempts to reproduce bug
+ 22403... but doesn't.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added Test-ftp-bad-list.px.
+
+2009-09-07 Micah Cowan <micah@cowan.name>
+
+ * Makefile.am (distuninstallcheck_listfiles): Don't complain if
+ /usr/share/info/dir and /etc/wgetrc are left behind after an
+ uninstall.
+
+ * po/Rules-quot (mostlyclean-quot): Add en_US.po for remvoal by
+ mostlyclean.
+ (en_US.po-update): Behave properly for VPATH builds.
+
+2009-09-06 Micah Cowan <micah@cowan.name>
+
+ * tests/WgetTest.pm.in (_setup): Don't expect error codes from
+ _setup_server; none are returned.
+ (quotechar, _show_diff): Added facilities for expounding on where
+ output didn't match expectations.
+ (_verify_download): Use _show_diff.
+
+ * tests/FTPTest.pm (_setup_server): Pass value of server_behavior to
+ FTPServer initialization.
+
+ * tests/Test-ftp-pasv-fail.px: Added.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added Test-ftp-pasv-fail.px.
+
+ * tests/WgetTest.pm.in: Added "server_behavior" to the set of accepted
+ initialization values.
+ * tests/FTPServer.pm (__open_data_connection): Add "server_behavior" to
+ the set of accepted initialization values.
+ (run): Honor the 'fail_on_pasv' server behavior setting, to
+ trigger the Wget getftp glitch.
+
+2009-09-06 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (getftp, ftp_loop_internal): Separate "len" input/output
+ parameter (with different meanings for input and output), into two
+ separate parameters, one input (passed_expected_bytes) and one
+ output (qtyread). Fixes bug #26870.
+
+2009-09-06 Gisle Vanem <gvanem@broadpark.no>
+
+ * msdos/Makefile.WC: Added compilation of new file msdos.c.
+ Simplified; no need to have explicit rules for files in ./lib and
+ ./md5. Just use the suffix search path mechanism in wmake.
+
+2009-09-06 Gisle Vanem <gvanem@broadpark.no>
+
+ * msdos/Makefile.DJ: Added compilation of new file msdos.c.
+
+2009-09-05 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/run-px: Introduce two new diagnostics: Skip and Unknown.
+
+ * tests/WgetFeature.pm (import): Parse the version output of Wget
+ and assert the availability of a feature.
+
+ * tests/WgetFeature.cfg: Messages to be printed in absence of a
+ required feature.
+
+ * tests/Test-ftp-iri-disabled.px, Test-ftp-iri-fallback.px,
+ Test-ftp-iri-recursive.px, Test-ftp-iri.px, Test-idn-cmd.px,
+ Test-idn-headers.px, Test-idn-meta.px, Test-idn-robots.px,
+ Test-iri-forced-remote.px, Test-iri-list.px,
+ Test-iri-percent.px, Test-iri.px: Use WgetFeature.pm to
+ check for the presence of the IDN/IRI feature.
+
+ * tests/Test-proxied-https-auth.px: Replace grepping for a feature
+ with loading WgetFeature.pm at compile-time.
+
+ * tests/Makefile.am: Add WgetFeature.pm and WgetFeature.cfg
+ to EXTRA_DIST.
+
+2009-09-05 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/retr.h: Declare set_local_file() to avoid build warnings.
+
+2009-09-05 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-ftp-recursive.px: Added.
+ * tests/run-px, Makefile.am (EXTRA_DIST): Added Test-ftp-recursive.px.
+
+ * tests/FTPTest.pm (_setup_server): Don't construct the "input"
+ directory's contents, just pass the URLs structure to
+ FTPServer->new.
+ * tests/FTPServer.pm: Rewrote portions, so that the server now uses the
+ information from the %urls hash directly, rather than reading from
+ real files. Added an FTPPaths package to the file.
+
+2009-09-05 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: If we can't find idna.h, check to see if it's
+ because we need to add /usr/include/idn to the inclusion
+ path (for OpenSolaris).
+
+2009-09-05 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/connect.c, init.c, main.c, openssl.c, options.h: Replace
+ "ifdef MSDOS" with "ifdef USE_WATT32" since DOS-targets in fact
+ use the Watt-32 tcp/ip stack.
+
+2009-09-05 Gisle Vanem <gvanem@broadpark.no>
+
+ * msdos/config.h: Added 'HAVE_ALLOCA_H' for Watcom 1.5+. Added
+ 'USE_WATT32' since all DOS-targets use the Watt-32 tcp/ip stack.
+ Added meaningless dummy LOCALEDIR.
+
+ * msdos/Makefile.WC: A much needed update. Added rules for many files
+ in ./lib, css.c and version.c.
+
+ * msdos/Makefile.DJ: A much needed update. Added rules for css.c and
+ version.c.
+
+2009-09-04 Steven Schubiger <stsc@member.fsf.org>
+
+ * configure.ac: Place gl_EARLY and md5_EARLY before the gettext
+ macros in order to silence autoconf warnings.
+
+2009-09-04 Micah Cowan <micah@cowan.name>
+
+ * tests/WgetTest.pm.in (run): Error-checking improvements.
+
+2009-09-04 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: Move build_info.c to wget_SOURCES from
+ nodist_wget_SOURCES, reduce dependencies, and invoke build_info.pl
+ in its new home, $(top_srcdir)/build-aux.
+
+2009-09-04 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Time-Stamping): "older" -> "not newer".
+
+ * doc/Makefile.am (install.man, install.wgetrc): Use $(mkinstalldirs),
+ not $(top_srcdir)/mkinstalldirs.
+
+2009-09-04 Micah Cowan <micah@cowan.name>
+
+ * Makefile.am (EXTRA_DIST): build_info.pl ->
+ build-aux/build_info.pl
+
+ * build-aux/build_info.pl: Moved from top directory.
+
+ * md5/*: Updated md5 from gnulib.
+
+ * configure.ac: Configured build-aux/ as auxiliarry directory.
+
+ * build-aux/compile, build-aux/config.guess,
+ build-aux/config.rpath, build-aux/config.sub, build-aux/depcomp,
+ build-aux/install-sh, build-aux/link-warning.h,
+ build-aux/mdate-sh, build-aux/missing, build-aux/mkinstalldirs,
+ build-aux/texinfo.tex, build-aux/useless-if-before-free,
+ build-aux/vc-list-files, build-aux/ylwrap: Moved from top
+ directory.
+
+ * build-aux/announce-gen: Imported from gnulib.
+ * build-aux/update-copyright: Imported from gnulib.
+ * build-aux/gnupload: Imported from gnulib.
+ * lib/Makefile.am, m4/gnulib-cache.m4, m4/gnulib-comp.m4: Adjusted
+ for announce-gen, update-copyright, and gnupload.
+
+2009-09-03 gettextize <bug-gnu-gettext@gnu.org>
+
+ * m4/gettext.m4: Upgrade to gettext-0.17.
+ * m4/iconv.m4: Upgrade to gettext-0.17.
+ * m4/lib-link.m4: Upgrade to gettext-0.17.
+ * m4/po.m4: Upgrade to gettext-0.17.
+
+ * po/Makefile.in.in: Upgrade to gettext-0.17.
+
+ * configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.17.
+
+2009-09-03 Micah Cowan <micah@cowan.name>
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Replace use of localtime_r with
+ localtime, as not all platforms have localtime_r.
+
+ * src/Makefile.am (wget_SOURCES): Rearranged some of the file order,
+ so .c files and .h files are apart. Added gettext.h, so that it
+ shows up in the dist.
+
+2009-09-03 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Give credit to jff for SSL security fix, call attention to
+ IRI support's dependence on libidn and libiconv, and note that
+ --html-extension is still accepted, though deprecated.
+
+ * lib/*, m4/*: Updated gnulib.
+ * lib/getpagesize.c, lib/memchr.c, lib/memchr.valgrind,
+ lib/stddef.in.h, lib/str-two-way.h, lib/strcasecmp.c,
+ lib/strcasestr.c, lib/strings.in.h, lib/strncasecmp.c,
+ m4/getpagesize.m4, m4/memchr.m4, m4/mmap-anon.m4,
+ m4/stddef_h.m3, m4/strcase.m4, m4/strcasestr.m4,
+ m4/strings_h.m4, m4/wchar_t.m4: Added, via gnulib --import
+ strcasestr.
+
+ * configure.ac: Move AM_GNU_GETTEXT below AC_AIX, to shut up
+ autoconf warnings.
+
+2009-09-02 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am (unit-tests): explicit dependency is
+ unnecessary (and harmful, as it overrides the automatic one).
+
+2009-09-02 Micah Cowan <micah@cowan.name>
+
+ * src/gettext.h: Refreshed from gettext 0.17.
+
+ * src/test.c: Added definition of program_name variable, required by
+ lib/error.c (libgnu.a). Doesn't cause problems until you try to
+ build on a non-GNU system...
+
+ * src/build_info.c.in: Removed useless "+gettext" feature ad.
+
+2009-09-02 Micah Cowan <micah@cowan.name>
+
+ * po/Rules-quot (en_US.po-update): Remove use of GNU make's
+ non-portable $^ variable.
+
+2009-09-01 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Makefile.am: Add Test-cookies.px, Test-cookies-401.px
+ and Test-restrict-ascii.px to EXTRA_DIST.
+
+2009-09-01 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am (../src/libunittest.a): Make it a phony target,
+ so we always make sure to get up-to-date unit-test runs.
+
+2009-08-31 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Makefile.am: Add Test-k.px to EXTRA_DIST.
+
+2009-08-29 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/run-px: Add Test-k.px to the list.
+
+ * tests/Test-k.px: Test escaping of semicolons in local file strings.
+
+2009-08-29 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/convert.c (local_quote_string): Percent-encode semicolons
+ in local file strings.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * tests/run-px: Added Test-cookies.px, Test-cookies-401.px
+
+ * tests/Test-cookies.px: Basic testing to make sure Wget doesn't send
+ cookies; no path/domain checking.
+
+ * tests/Test-cookies.px: Test to make sure Wget heeds cookies when they
+ are sent with a 401 response (#26775).
+
+ * tests/HTTPServer.pm (send_response): Don't try to substitute port in
+ response body, if there isn't one.
+ (verify_request_headers): Avoid uninitialized warning when an
+ expected header isn't provided by Wget.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * tests/WgetTest.pm.in (run): Shift the errcode right by 8 binary places.
+
+ * tests/Test--spider-fail.px, Test--spider-r--no-content-disposition.px,
+ Test--spider-r--no-content-disposition-trivial.px,
+ Test--spider-r-HTTP-Content-Disposition.px, Test--spider-r.px,
+ Test-O-nonexisting.px, Test-cookies-401.px,
+ Test-nonexisting-quiet.px: Adjusted "expected error code"; Wget's
+ exit codes have changed.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * src/wget.h (uerr_t): added new VERIFCERTERR code for SSL certificate
+ problems. Marked exit codes that are defined but never used (at
+ least, the ones I could find).
+
+ * src/retr.c, retr.h (retrieve_url): Added a new boolean argument to
+ determine whether an exit status should be recorded.
+ (retrieve_from_file): Adjust to new retrieve_url signature.
+
+ * src/res.c (res_retrieve_file): Don't have retrieve_url record an
+ exit status for robots.txt.
+
+ * src/recur.c (retrieve_tree): Adjust to new retrieve_url signature.
+
+ * src/main.c (main): Use the exit status stored by retrieve_url.
+
+ * src/http.c (gethttp): Distinguish certificate verification problems
+ from SSL connection issues.
+ (http_loop): Handle newly-created VERIFCERTERR error code.
+
+ * src/exits.c, exits.h: Newly added.
+
+ * src/Makefile.am (wget_SOURCES): Add exits.c and exits.h.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (gethttp): Make sure Wget heeds cookies when they
+ are sent with a 401 response; or any other sort of response for
+ that matter (#26775).
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * doc/texi2pod.pl: Handle @asis in table-element formatting.
+
+ * doc/wget.texi (Exit Status): Document new exit codes.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Mention the changes to exit codes.
+
+2009-08-27 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Add mention of the NUL characters SSL security fix.
+
+2009-08-19 Micah Cowan <micah@cowan.name>
+
+ * src/openssl.c (ssl_check_certificate): Only warn about an attack if
+ the hostname would otherwise have matched. Also some formatting
+ cleanup.
+
+2009-08-19 Joao Ferreira <joao@joaoff.com>
+
+ * src/openssl.c (ssl_check_certificate): Detect embedded NUL
+ characters in the SSL certificate common name.
+
+2009-08-17 Tony Lewis <tlewis@exelana.com>
+
+ * src/http.c (gethttp): Ensure that we parse Content-Length before we
+ attempt to refer to its value. Without this fix, NTLM support was
+ completely buggered. #27192
+
+2009-08-09 Michael Baeuerle <michael.baeuerle@gmx.net>
+
+ * src/ftp.c: #include <strings.h> for strcasecmp.
+
+2009-08-02 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Option Syntax): "This is a complete equivalent of" ->
+ "This is completely equivalent to". Thanks to Reuben Thomas for
+ catching this.
+
+2009-07-28 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (option_data): Rename --html-extension to
+ --adjust-extension.
+ (print_help): Ditto.
+
+ * src/options.h (struct option): Rename html_extension to
+ adjust_extension.
+ * src/http.c (gethttp): Ditto.
+ * src/convert.c (local_quote_string): Ditto.
+
+ * src/init.c (commands): Add "adjustextension", and reflect rename
+ change for opt.adjust_extension, for both "adjustextension" and
+ "htmlextension".
+
+2009-07-28 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): Document "lowercase", "uppercase",
+ and the new "ascii" specifier for --restrict-file-names.
+ (HTTP Options): Rename --html-extension to --adjust-extension.
+ (Wgetrc Commands): Rename html_extension to adjust_extension.
+
+2009-07-28 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Mention some more previously undocumented items, the
+ new "ascii" specifer for --restrict-file-names, and the renaming
+ of --html-extension to --adjust-extension.
+
+2009-07-27 Petr Pisar <petr.pisar@atlas.cz>
+
+ * src/main.c (print_help): Fixed a couple typos.
+
+2009-07-27 Petr Pisar <petr.pisar@atlas.cz>
+
+ * po/Makevars (MSGID_BUGS_ADDRESS): Fixed.
+
+2009-07-27 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-restrict-ascii.px: New.
+
+ * tests/run-px: Added Test-restrict-ascii.px.
+
+2009-07-27 Micah Cowan <micah@cowan.name>
+
+ * src/options.h (struct options): Added restrict_files_nonascii
+ boolean field.
+
+ * src/url.c (FILE_CHAR_TEST): Add check for chars outside the ASCII
+ range.
+
+ * src/init.c (defaults): Add restrict_files_nonascii to initialization.
+ (cmd_spec_restrict_file_names): Allow parsing of "ascii" keyword.
+
+2009-07-27 Marcel Telka <marcel@telka.sk>
+
+ * src/iri.c (do_conversion): Typo: invalide -> invalid
+
+2009-07-26 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-ftp-iri.px, Test-ftp-iri-fallback.px,
+ Test-ftp-iri-recursive.px, Test-ftp-iri-disabled.px,
+ Test-idn-cmd.px, Test-idn-robots.px: Adjust wget invocations,
+ replacing --locale with --local-encoding.
+
+2009-07-26 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (option_data): Rename --locale option to --local-encoding
+ (print_help): Document --no-iri, --local-encoding, and
+ --remote-encoding, within usage message. Remove defunct
+ --preserve-permissions.
+
+2009-07-26 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): Change --iri item to --no-iri;
+ rename --locale to --local-encoding.
+ (Wgetrc Commands): Document iri, local_encoding, remote_encoding,
+ ask_password, auth_no_challenge, and keep_session_cookies.
+
+2009-07-23 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (get_eta): Change "Translation note" in comment to
+ "TRANSLATORS", so it actually appears in wget.pot.
+
+2009-07-10 Micah Cowan <micah@cowan.name>
+
+ * util/paramcheck.pl (find_documentation): Added.
+ (emit_undocumented_opts): Check for documentation in both TexInfo
+ and --help string.
+
+2009-07-07 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/Makefile.am: Add IDN/IRI test files and Test-meta-robots.px
+ to EXTRA_DIST.
+
+2009-07-06 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (print_help): Improve documentation of --base.
+
+2009-07-06 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Logging and Input File Options): Alter description of
+ --input-file, implying that --force-html isn't necessary when the
+ input is in HTML file. Improve accuracy of --base description.
+ (Wgetrc Commands): Improve accuracy of "base" description.
+ (HTTP Options): Clarify operation of --post-file.
+
+2009-07-05 Petr Pisar <petr.pisar@atlas.cz>
+
+ * src/main.c (print_version): Mark initial line for translation, along
+ with (env), (user), and (system). Change copyright year to 2009.
+
+ * src/http.c (http_loop): Space after colon.
+
+ * src/gnutls.c (ssl_check_certificate): Use quote function, rather
+ than explicit quotes.
+
+2009-07-05 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-meta-robots.px: Added.
+
+ * tests/run-px: Add Test-meta-robots.px to the list.
+
+2009-07-05 Micah Cowan <micah@cowan.name>
+
+ * src/html-url.c (tag_handle_meta): Handle meta name="robots"
+ properly: deal with whitespace, commas after...
+
+ * src/netrc.c (parse_netrc): Rename local-scope variable "quote" to
+ "qmark", to avoid conflict with the function name.
+
+2009-07-05 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am (version.c): Add dependency on configure.ac.
+
+ * src/iri.c: Mark some strings for translation.
+
+2009-07-05 Micah Cowan <micah@cowan.name>
+
+ * po/Rules-quot: Added targets to build en@{quot,boldquot}.po
+
+ * po/POTFILES.in: Added src/gnutls.c, src/iri.c.
+
+ * po/*.po: Updated translations from TP. New translation:
+ Lithuanian.
+
+ * lib/*, md5/*: Updated gnulib.
+
+2009-07-04 Steven Schweda <sms@antinode.info>
+
+ * vms/COLLECT_DEPS.COM, vms/config.h_vms, vms/decc_ver.c,
+ vms/DESCRIP_CONFIG.MMS, vms/DESCRIP_DEPS.MMS,
+ vms/DESCRIP_MKDEPS.MMS, vms/DESCRIP.MMS, vms/DESCRIP_SRC.MMS,
+ vms/vms.c, vms/vms.h, vms/vms_ip.h, vms/vms_name_fix.sh,
+ vms/VMS_NOTES.TXT, vms/VMS-WGET.COM, vms/WGET.HLP,
+ vms/WGET_MULTINET.OPT, vms/WGET.OPT, vms/WGET_SSL_HP.OPT,
+ vms/WGET_SSL.OPT: Added.
+
+2009-07-04 Steven Schweda <sms@antinode.info>
+
+ * src/wget.h (ORIG_SFX): Macro added, to supply an alternative "_orig"
+ suffix on VMS.
+
+ * src/connect.c, host.c, host.h, main.c: Include "vms_ip.h" rather
+ than <netdb.h> on VMS systems.
+
+ * src/convert.c (write_backup_file): Use "_orig" rather than ".orig"
+ on VMS.
+
+ * src/ftp-basic.c (ftp_list): Don't use LIST -a on VMS servers.
+
+ * src/ftp.c [__VMS]: Include "vms.h"
+ * src/ftp.c (getftp): Disable some unhelpful "for VMS" code. Pass the
+ OS type to ftp_list.
+ (getftp) [__VMS]: Alter the filename as required, and invoke fopen
+ with extra optional arguments.
+ (ftp_retrieve_list): Set permissions before setting the times.
+
+ * src/ftp-ls.c [__VMS]: Various improvements.
+
+ * src/http.c (SET_USER_AGENT): Added. Include operating-system info in
+ the User-Agent header.
+ (gethttp): Use ORIG_SFX macro.
+ (gethttp) [__VMS]: invoke fopen with extra arguments to
+ communicate file type.
+ (http_loop): Add cast to time_t.
+
+ * src/init.c (wgetrc_user_file_name) [__VMS]: Adjustments for where to
+ find the .wgetrc.
+
+ * src/log.c: Adjustments to improve handling of log files on VMS.
+
+ * src/main.c [__VMS]: Added --ftp-stmlf option (and associated
+ documentation). Adjust description of backup-suffixes, as they now
+ differ for VMS.
+ (print_help, print_version): Include OS type in version
+ information.
+ (main) [__VMS]: Invoke fopen with extra options, to specify file
+ type information.
+
+ * src/netrc.c (search_netrc) [__VMS]: Fix .netrc-finding.
+
+ * src/openssl.c, openssl.h (ssl_connect_wget): Renamed from ssl_connect.
+
+ * src/options.h (struct options): Add ftp_stmlf field.
+
+ * src/retr.c (write_data) [__VMS]: Avoid fflush.
+
+ * src/url.c [__VMS]: Include vms.h.
+ * src/url.c (url_file_name) [__VMS]: Handle naming as required for VMS.
+
+ * src/utils.c [__VMS]: Include vms.h. Various added facilities for VMS
+ needs.
+
+2009-07-04 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/url.c (url_parse): If an URL scheme is invalid, distinguish
+ between an unsupported or missing scheme.
+
+ * src/url.c: Add a "missing scheme" entry to parse_errors.
+
+2009-07-04 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (print_version): Allow localization of the version-info
+ labels, eschew attempts at alignment (which is complicated when
+ handling translated strings), and avoid using printf() with
+ variable-stored format strings that lack conversion
+ specifications.
+ (format_and_print_line): For similar reasons, don't calculate
+ line-continuation tabulation based on the number of bytes in a
+ string.
+
+2009-07-03 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-ftp-iri-disabled.px, Test-iri-disabled.px:
+ --iri=no --> --no-iri
+
+2009-07-03 Micah Cowan <micah@cowan.name>
+
+ * src/iri.h (iri_dup): Provide macro definition for when IRIs are
+ disabled.
+
+ * src/Makefile.am (LIBS): Added @LIBICONV@.
+ (wget_SOURCES): Added iri.h.
+ (EXTRA_wget_SOURCES): Added iri.c, so it gets packaged even if IRI
+ support was disabled.
+
+2009-07-03 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): --iri=no --> --no-iri
+ (Contributors): Add Saint Xavier.
+
+2009-07-03 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Ensure LIBICONV is empty if IRIs are disabled.
+
+ * AUTHORS: Added Ted Mielczarek and Saint Xavier.
+
+ * NEWS: Added items for IRI support, new --version information.
+
+2009-07-02 Micah Cowan <micah@cowan.name>
+
+ * src/recur.c (url_enqueue): Quote enqueue/dequeue debug messages.
+
+ * src/html-url.c (append_url): Change "merge()" quoting style from
+ locale_quoting_style to escape_quoting_style.
+
+2009-07-01 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/Makefile.am: Add a rule to generate build_info.c and list
+ the build_info.c.in file in EXTRA_DIST. Adjust elsewhere
+ where needed.
+
+ * src/build_info.c: Remove this static source file.
+
+ * src/build_info.c.in: Data for generation of build_info.c.
+
+2009-07-01 Steven Schubiger <stsc@member.fsf.org>
+
+ * Makefile.am: Add build_info.pl to EXTRA_DIST.
+
+ * build_info.pl: Generate build_info.c from data.
+
+2009-07-01 Micah Cowan <micah@cowan.name>
+
+ * tests/HTTPServer.pm (send_response): Invocation of
+ verify_request_headers, to support testing of Wget-sent header
+ values.
+ (verify_request_headers): Added.
+
+ * tests/Test-iri.px: Added verification checks for Referer values.
+
+2009-07-01 Micah Cowan <micah@cowan.name>
+
+ * src/retr.c (retrieve_url): Use the existing "redirect" label,
+ instead of superfluous "second_try". Removed no-longer-accurate
+ debug statement. Use the "newloc" parameter to store the fallback
+ URL, when IRI version was rejected.
+
+ * src/recur.c (retrieve_tree): Always use the parsed URL for tracking
+ the Referer, since that's the one we actually requested (if
+ there's a difference in terms of percent-encodings and such).
+
+2009-06-29 Micah Cowan <micah@cowan.name>
+
+ * tests/WgetTest.pm.in (_cleanup): Allow cleanup of test directories to
+ be skipped at user discretion.
+
+ * tests/run-px, Test-iri-percent.px, Test-ftp-iri-recursive.px: Added
+ test for percent-coded value preservation, FTP recursion when IRI
+ support's on.
+
+2009-06-29 Micah Cowan <micah@cowan.name>
+
+ * src/html-url.c (append_url): Quote some more arguments that might
+ contain characters that are inappropriate to display for the
+ current locale.
+
+ * src/retr.c (retrieve_from_file): Be sure to pass iri information
+ when parsing an input-fle url, and be sure to hand a clean iri
+ struct, off to retrieve_tree and retrieve_url.
+
+ * src/iri.c, iri.h (iri_dup): Added.
+
+ * src/retr.c (retrieve_url): Re-parse for IRI fallback.
+
+ * src/main.c (main): Set up iri before the url_parse invocation (so we
+ can use it).
+
+2009-06-20 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Contributors): Added Jay Krell.
+
+2009-06-20 Jay Krell <jay.krell@cornell.edu>
+
+ * src/sysdep.h (_ALL_SOURCE): (small change) Define the _ALL_SOURCE
+ macro on INTERIX systems. (I switched the location from ftp.c to
+ sysdep.h --mjc)
+
+2009-06-15 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (getftp): If we can't accept the connection, return
+ CONERROR, not whatever the contents of err happens to be. Fixes
+ bug #25015.
+
+ * src/retr.c (fd_read_body): Make both args to progress_create
+ consistent, resulting in an accurate progress display. Fixes bug
+ #24948.
+
+2009-06-14 Phil Pennock <mutt-dev@spodhuis.org> (tiny change)
+ * src/host.h: Declare `is_valid_ip_address'.
+ * src/host.c (is_valid_ip_address): New function.
+ * src/http.c (gethttp): Specify the hostname to ssl_connect_wget.
+ * src/gnutls.c (ssl_connect_wget): Specify the server name.
+ * src/openssl.c (ssl_connect_wget): Likewise.
+ * src/ssl.h: Change method signature for ssl_connect_wget.
+
+2009-06-14 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am (EXTRA_DIST): Include all the tests, run-px, and
+ certs/, to make distcheck happy.
+
+2009-06-14 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am (wget_SOURCES): css-tokens.h needs to ship with
+ dist, too.
+
+2009-06-14 Micah Cowan <micah@cowan.name>
+
+ * po/Makefile.in.in (distclean): remove en_US.po, too.
+
+ * Makefile.am: Include md5 as a subdir unconditionally.
+ It may result in useless compilation, and additional risk of
+ breaking a build of something that isn't actually needed, but
+ otherwise it's too much of a hassle to manage a failure-free
+ distcheck.
+
+2009-06-14 Micah Cowan <micah@cowan.name>
+
+ * doc/Makefile.am (wget.pod): $(srcdir)/version.texi -> version.texi
+
+2009-06-13 Micah Cowan <micah@cowan.name>
+
+ * src/init.c: Rename setval_internal_wrapper to setval_internal_tilde,
+ ensure we don't "replace" the tilde unless it's actually
+ present. Clean up some minor GNU style issues.
+
+2009-06-13 Julien Pichon <julienpichon7@gmail.com>
+
+ * src/init.c: Handle tilde-expansion in wgetrc commands, without
+ resorting to setting/unsetting globals to change behavior in one
+ call location.
+
+2009-06-12 Micah Cowan <micah@cowan.name>
+
+ * src/host.c: Include <sys/types.h> before <sys/socket.h>. Not
+ required by POSIX any more, but some older systems (such as
+ FreeBSD 4.1) still need it, and it doesn't seem like it could
+ hurt...
+
+ * src/build_info.c (library): Handle "https" as a feature in its own
+ right, apart from "gnutls" and "openssl".
+
+ * src/host.c: Declare h_errno if no declaration is provided. Idea
+ thanks to Maciej W. Rozycki.
+
+2009-06-12 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): More accuracy on what happens when
+ -nd is used with -r or -p.
+
+2009-06-12 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Check for h_errno declaration. Idea thanks to
+ Maciej W. Rozycki.
+
+2009-06-11 Xin Zou <zouxin2008@gmail.com>
+
+ * src/http.c (gethttp): Fix some memory leaks.
+
+2009-06-11 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_atotm): Handle potential for setlocale's return
+ value to be static storage. Thanks to Benjamin Wolsey
+ <bwy@benjaminwolsey.de>.
+
+ * src/sysdep.h: Need NAMESPACE_TWEAKS on non-Linux glibc-based
+ systems, too. Thanks to Robert Millan.
+
+2009-06-11 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Contributors): Added Xin Zou, Benjamin Wolsley, and
+ Robert Millan.
+
+2009-06-11 Joao Ferreira <joao@joaoff.com>
+
+ * doc/wget.texi (Option Syntax): Fixed contradictory and confusing
+ explanation of --folow-ftp and negation.
+
+2009-06-11 Benjamin Wolsey <bwy@benjaminwolsey.de>
+
+ * tests/Test-proxied-https-auth.px: Take an optional argument for the
+ top source directory, so we can find the cert and key.
+
+ * tests/run-px: Provide the top source directory as an argument, so
+ scripts can find their way around.
+
+2009-06-10 Micah Cowan <micah@cowan.name>
+
+ * doc/sample.wgetrc: Add "https_proxy" to the proxy examples. Thanks
+ to Martin Paul <martin@par.univie.ac.at> for the suggestion.
+
+2009-05-28 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (ftp_get_listing): Update the "listing file"
+ string after calling ftp_loop_internal().
+
+2009-05-27 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (ftp_get_listing): Duplicate the "listing file"
+ string to avoid memory corruption when FOPEN_EXCL_ERR is
+ encountered.
+
+2009-05-17 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/progress.c (eta_to_human_short): Fix the remaining hours
+ to be displayed. Spotted by Tadeu Martins (#26411).
+
+2009-04-24 Micah Cowan <micah@cowan.name>
+
+ * src/hash.c: Change stdint.h inclusion to use HAVE_STDINT_H, not C99
+ check.
+
+ * src/connect.c: stdint.h inclusion added.
+
+ Thanks to Markus Duft <mduft@gentoo.org> for a similar patch.
+
+2009-04-20 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am (version.c): Fix unportable use of "echo -n".
+
+2009-04-13 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (ftp_retrieve_list): Move the duplicated code that
+ determines the local file to a function.
+
+ * src/http.c (http_loop): Likewise.
+
+ * src/retr.c (set_local_file): New function.
+
+2009-04-11 Steven Schubiger <stsc@member.fsf.org>
+
+ * tests/run-px: Skip testing with real rc files by setting
+ SYSTEM_WGETRC and WGETRC to /dev/null.
+
+2009-04-11 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/init.c (initialize): Run a custom SYSTEM_WGETRC when
+ provided as an environment variable.
+
+2009-03-03 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c, src/http.c, src/main.c, src/recur.h,
+ tests/Makefile.am: Update the copyright years.
+
+2009-02-27 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/ftp.c (ftp_loop_internal): Don't claim for FTP retrievals
+ when writing to standard output either that the document
+ has been saved. Addresses bug #20520 again.
+
+2009-02-27 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/main.c (main): "freopen (NULL,.." causes an assertion in MSVC
+ debug-mode. I.e. NULL isn't legal. But the "CONOUT$" device works
+ fine.
+
+2009-02-25 Benjamin Wolsey <bwy@benjaminwolsey.de>
+
+ * tests/Makefile.am (run-px-tests): Ensure run-px is run from srcdir.
+
+ * tests/run-px: Include modules from srcdir.
+
+2009-02-21 Steven Schubiger <stsc@member.fsf.org>
+
+ * src/http.c (http_loop): When a document is written to
+ standard output, don't claim it has been saved to a file.
+ Addresses bug #20520.
+
+2009-02-18 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/recur.h: Remove the dangling declaration for recursive_cleanup().
+
+2009-02-01 Gerardo E. Gidoni <gerel@gnu.org>
+
+ * src/main.c, recur.c, recur.h, res.c, retr.c, retr.h: restructured code to
+ avoid multiple 'url_parse' calls.
+
+2009-01-23 Steven Schubiger <stsc@members.fsf.org>
+
+ * util/freeopts, util/rmold.pl, util/trunc.c: Remove
+ unnecessary whitespace.
+
+2008-12-04 Micah Cowan <micah@cowan.name> (not copyrightable)
+
+ * tests/run-px, Test-idn-robots.px: Added test for robots-file
+ downloads.
+
+ * tests/Test-idn-cmd.px, Test-idn-meta.px, Test-idn-headers.px:
+ Fix test names.
+
+2008-11-27 Saint Xavier <wget@sxav.eu>
+
+ * src/http.c (gethttp): Move authentication code before filename
+ allocation avoiding fallbacking on default filename because
+ "Content-Disposition" header wasn't present before authentcation
+ has been completed. Fixes bug #24862.
+
+2008-11-26 Micah Cowan <micah@cowan.name> (not copyrightable)
+
+ * tests/Test-ftp-iri-disabled.px, Test-ftp-iri-fallback.px,
+ Test-ftp-iri.px, Test-idn-cmd.px, Test-idn-headers.px,
+ Test-idn-meta.px, Test-iri-disabled.px,
+ Test-iri-forced-remote.px, Test-iri-list.px, Test-iri.px: More
+ module-scope warnings.
+
+2008-11-25 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/WgetTest.pm.in: Remove the magic interpreter line;
+ replace -w with lexical warnings.
+
+2008-11-16 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c: Declare and initialize the numurls counter.
+
+ * src/ftp.c, http.c: Make the counter visible here and use it.
+
+ * src/options.h: Remove old declaration from options struct.
+
+2008-11-15 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/init.c (defaults): Set default waitretry value.
+
+2008-11-15 Steven Schubiger <stsc@members.fsf.org>
+
+ * doc/sample.wgetrc: Comment the waitretry "default" value,
+ because there is a global one now.
+
+ * doc/wget.texi (Download Options): Mention the global
+ default value.
+
+2008-11-14 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c (format_and_print_line): Use a custom format
+ string for printing leading spaces.
+
+2008-11-13 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/FTPServer.pm, FTPTest.pm, HTTPServer.pm, HTTPTest.pm,
+ WgetTest.pm.in: Clean up leftover whitespace.
+
+2008-11-13 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (gethttp): Don't do anything when content-length >= our
+ requested range.
+
+2008-11-12 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/Test-auth-basic.px, Test-auth-no-challenge.px,
+ Test-auth-no-challenge-url.px, Test-c-full.px,
+ Test-c-partial.px, Test-c.px, Test-c-shorter.px,
+ Test-E-k-K.px, Test-E-k.px, Test-ftp.px,
+ Test-HTTP-Content-Disposition-1.px,
+ Test-HTTP-Content-Disposition-2.px,
+ Test-HTTP-Content-Disposition.px, Test-N-current.px,
+ Test-N-HTTP-Content-Disposition.px,
+ Test-N--no-content-disposition.px,
+ Test-N--no-content-disposition-trivial.px,
+ Test-N-no-info.px, Test--no-content-disposition.px,
+ Test--no-content-disposition-trivial.px, Test-N-old.px,
+ Test-nonexisting-quiet.px, Test-noop.px, Test-np.px,
+ Test-N.px, Test-N-smaller.px,
+ Test-O-HTTP-Content-Disposition.px, Test-O-nc.px,
+ Test-O--no-content-disposition.px,
+ Test-O--no-content-disposition-trivial.px,
+ Test-O-nonexisting.px, Test-O.px,
+ Test-proxy-auth-basic.px, Test-Restrict-Lowercase.px,
+ Test-Restrict-Uppercase.px,
+ Test--spider-fail.pxm, Test--spider.px,
+ Test--spider-r-HTTP-Content-Disposition.px,
+ Test--spider-r--no-content-disposition.px,
+ Test--spider-r--no-content-disposition-trivial.px,
+ Test--spider-r.px: Enforce lexically scoped warnings.
+
+ * tests/Test-proxied-https-auth.px, run-px: Place use strict
+ before use warnings.
+
+2008-11-12 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/FTPServer.pm, FTPTest.pm, HTTPServer.pm, HTTPTest.pm:
+ Remove the magic interpreter line, because it cannot be
+ used fully. Substitute -w with use warnings.
+
+2008-11-12 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c (print_version): Hand the relevant
+ xstrdup/xfree calls back to format_and_print_line().
+
+2008-11-12 Micah Cowan <micah@cowan.name>
+
+ * src/ftp-ls.c (ftp_index): HTML-escape dir name in title, h1, a:href.
+
+2008-11-12 Alexander Belopolsky <alexander.belopolsky@gmail.com>
+
+ * src/url.c, url.h (url_escape_unsafe_and_reserved): Added.
+
+ * src/ftp-ls.c (ftp_index): URL-escape, rather than HTML-escape, the
+ filename appearing in the link.
+
+2008-11-11 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c (format_and_print_line): Move both the memory
+ allocating and freeing bits upwards to print_version().
+
+2008-11-11 Micah Cowan <micah@cowan.name>
+
+ * tests/HTTPServer.pm (handle_auth): Allow testing of
+ --auth-no-challenge.
+
+ * tests/Test-auth-no-challenge.px, Test-auth-no-challenge-url.px:
+ Added.
+
+ * tests/run-px: Add Test-auth-no-challenge.px,
+ Test-auth-no-challenge-url.px.
+
+2008-11-10 Saint Xavier <wget@sxav.eu>
+
+ * src/http.c: Make --auth-no-challenge works with user:pass@ in URLs.
+
+2008-11-10 Micah Cowan <micah@cowan.name>
+
+ * doc/Makefile.am (EXTRA_DIST): Removed no-longer-present
+ README.maint (shouldn't have been there in the first place).
+
+ * doc/wget.texi (Mailing Lists): Added information aboug Gmane portal,
+ added subsection headings.
+
+ Update node pointers.
+
+2008-11-10 Micah Cowan <micah@cowan.name>
+
+ * MAILING-LIST: Mention Gmane, introduce subsections.
+
+2008-11-07 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/run-px: Use some colors for the summary part of the test
+ output to strengthen the distinction between a successful
+ or failing run.
+
+2008-11-06 Steven Schubiger <stsc@members.fsf.org>
+
+ * tests/run-px: When executing test scripts, invoke them with the
+ current perl executable name as determined by env.
+
+2008-11-06 Micah Cowan <micah@cowan.name>
+
+ * tests/run-px: Use strict (thanks Steven Schubiger!).
+
+2008-11-05 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (print_length): Should print humanized "size remaining"
+ only when it's at least 1k.
+
+2008-11-05 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Move --no-http-keep-alive from FTP Options to HTTP
+ Options.
+ (Mailing List): Mention moderation for unsubscribed posts, and
+ archive location.
+
+2008-11-05 Micah Cowan <micah@cowan.name>
+
+ * MAILING-LIST: Mention moderation for unsubscribed posts, and
+ archive location.
+
+2008-11-04 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi, fdl.texi: Updated to FDL version 1.3.
+
+2008-10-31 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (print_version): Add information about the mailing list.
+
+2008-10-31 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Mailing List): Update info to reflect change to
+ bug-wget@gnu.org.
+
+2008-10-31 Micah Cowan <micah@cowan.name>
+
+ * MAILING-LIST: Update information.
+
+ * NEWS: Add mention of mailing list move.
+
+2008-10-31 Alexander Drozdov <dzal_mail@mtu-net.ru>
+
+ * src/retr.c (fd_read_hunk): Make assert deal with maxsize == 0.
+
+ * src/ftp-ls.c (clean_line): Prevent underflow on empty lines.
+
+2008-10-26 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/main.c (format_and_print_line): Put variables on top of
+ blocks (not all compilers are C99). Add an extra '\n' if
+ SYSTEM_WGETRC isn't defined and printed.
+
+2008-09-30 Steven Schubiger <stsc@members.fsf.org>
+
+ * doc/wget.texi (Wgetrc Commands): Add default_page, save_headers,
+ spider and user_agent to the list of recognized commands.
+
+2008-09-10 Michael Kessler <kessler.michael@aon.at>
+
+ * doc/wget.texi (Robot Exclusion): Fixed typo "downloads" ->
+ "download"
+
+2008-09-09 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-idn-cmd.px: Added.
+
+ * tests/run-px: Added Test-idn-cmd.px.
+
+2008-09-09 Micah Cowan <micah@cowan.name>
+
+ * src/init.c (home_dir): Save the calculated value for home,
+ to avoid duplicated work on repeated calls.
+ (wgetrc_file_name) [WINDOWS]: Define and initialize home var.
+
+ * src/build_info.c, main.c: Remove unnecessary extern vars
+ system_wgetrc and locale_dir.
+
+ * src/main.c: Define program_name for lib/error.c.
+
+2008-09-09 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/url.c (url_error): Use aprintf, not asprintf.
+
+2008-09-02 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/mswindows.h: Must ensure <stdio.h> is included before
+ we redefine ?vsnprintf().
+
+2008-08-28 Micah Cowan <micah@cowan.name>
+
+ * tests/HTTPServer.pm (run): Allow distinguishing between hostnames,
+ when used as a proxy.
+
+ * tests/Test-idn-headers.px, Test-idn-meta.px: Added.
+
+ * tests/run-px: Added Test-idn-headers.px, Test-idn-meta.px.
+
+ * tests/Test-proxy-auth-basic.px: Use the full URL, rather than just the
+ path (made necessary by the accompanying change to HTTPServer.pm).
+
+2008-08-14 Xavier Saint <wget@sxav.eu>
+
+ * tests/Test-iri-list.px : Fetch files from a remote list.
+
+2008-08-08 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c, utils.h: Removed some dead conditional DEBUG_MALLOC code.
+
+2008-08-03 Xavier Saint <wget@sxav.eu>
+
+ * tests/Test-iri.px : HTTP recursive fetch for testing IRI support and
+ fallback.
+
+ * tests/Test-iri-disabled.px : Same file structure as Test-iri.px but with
+ IRI support disabled
+
+ * tests/Test-iri-forced-remote.px : There's a difference between ISO-8859-1
+ and ISO-8859-15 for character 0xA4 (respectively currency sign and
+ euro sign). So with a forced ISO-8859-1 remote encoding, wget should
+ see 0xA4 as a currency sign and transcode it correctly in UTF-8 instead
+ of using the ISO-8859-15 given by the server.
+
+ * tests/Test-ftp-iri.px : Give a file to fetch via FTP in a specific locale
+ and expect wget to fetch the file UTF-8 encoded.
+
+ * tests/Test-ftp-iri-fallback.px : Same as above but wget should fallback on
+ locale encoding to fetch the file.
+
+ * tests/Test-ftp-iri.px : Same as Test-ftp-iri.px but with IRI support
+ disabled. The UTF-8 encoded file should not be retrieved.
+
+2008-08-03 Xavier Saint <wget@sxav.eu>
+
+ * doc/wget.texi : Add option descriptions for the three new
+ options --iri, --locale and --remote-encoding related to
+ IRI support.
+
+ * doc/sample.wgetrc : Add commented lines for the three new
+ command iri, locale and encoding related to IRI support.
+
+2008-08-03 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/url.c, url.h (url_error): Better messages for unsupported
+ schemes, especially https.
+
+ * src/html-url.c, recur.c, retr.c: Adjust to new url_error
+ invocation, and free result.
+
+2008-08-03 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (print_help): Added --default-page.
+
+2008-08-03 Micah Cowan <micah@cowan.name>
+
+ * src/build_info.c, css-url.c: #include wget.h, not config.h.
+
+2008-08-03 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Don't set UPDATED; already set by version.texi.
+ (HTTP Options): Add --default-page option.
+
+2008-08-01 Joao Ferreira <joao@joaoff.com>
+
+ * src/init.c, main.c, options.h, url.c: Added option --default-page
+ to support alternative default names for index.html
+
+2008-08-01 Joao Ferreira <joao@joaoff.com>
+
+ * NEWS: Added option --default-page to support alternative
+ default names for index.html
+
+2008-07-17 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/retr.c (retrieve_from_file): When given an URL as input file,
+ use it as baseref if none was specified and treat the input file
+ as HTML if its content type is text/html.
+
+ * src/init.c (cleanup): Free the memory associated with the base
+ option (when DEBUG_MALLOC is defined).
+
+2008-07-17 Steven Schubiger <stsc@members.fsf.org>
+
+ * doc/wget.texi (Logging and Input File Options): Document
+ for --input-file and according remote input file URLs, the
+ implicit enforcement of treating a document as HTML and
+ the possible baseref assumption.
+
+2008-07-02 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c, iri.h : New function idn_decode() to decode ASCII
+ encoded hostname to the locale.
+
+ * src/host.c : Show hostname to be resolved both in locale and
+ ASCII encoded.
+
+2008-06-30 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Entries for 1.11.4.
+
+ * AUTHORS: Added Steven Schubiger.
+
+2008-06-29 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Contributors>: Added Joao Ferreira, Mike Frysinger,
+ Alain, Guibert, Madhusudan Hosaagrahara, Jim Paris, Kenny
+ Parnell, Benno Schulenberg, and Pranab Shenoy. Added Steven
+ Schubiger to the "Special Thanks" section.
+
+2008-06-28 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/retr.c (retrieve_from_file): Allow for reading the links from
+ an external file (HTTP/FTP).
+
+2008-06-26 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c, iri.h : New functions locale_to_utf8() and
+ idn_encode() adding basic capabilities of IRI/IDN.
+
+ * src/url.c : Convert URLs from locale to UTF-8 allowing a basic
+ support of IRI/IDN
+
+2008-06-26 Xavier Saint <wget@sxav.eu>
+
+ * configure.ac : IRIs support required libiconv, check it.
+
+2008-06-25 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/ftp.c (getftp): When spidering a FTP URL, emit a diagnostic
+ message if the remote file exists.
+
+2008-06-24 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/http.c (http_loop): Replace escnonprint() occurence with
+ a quotearg_style() call.
+
+2008-06-24 Micah Cowan <micah@cowan.name>
+
+ * src/ftp-ls.c (ftp_index): Don't assume time_t* is compatible with
+ long*. Fixes crash on Windows, and probably other systems.
+
+2008-06-22 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/http.c: Explicitly initialize and deallocate the message
+ string used by the -nv --spider functionality.
+
+2008-06-22 Steven Schubiger <schubiger@gmail.com>
+
+ * src/http.c: Make -nv --spider include the file's name when it
+ exists.
+
+2008-06-22 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-proxied-https-auth.px: Shift exit code so it falls in the
+ lower bits, and actually fails when it should. Use dynamic port,
+ instead of static port. Only run the test if our Wget was built
+ with HTTPS support.
+
+ * tests/certs/server-cert.pem, certs/server-key.pem: Apparently failed
+ to add these from 1.11.x repo. Fixed.
+
+2008-06-22 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am (version.c): Fixed version string invocation so it
+ once again can't result in unterminated strings, made all the
+ string vars pointers-to-const, and moved line lengths
+ below 80 (in Makefile.am, not in version.c).
+
+2008-06-19 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c, iri.h : New function check_encoding_name() as
+ a preliminary encoding name check.
+
+ * src/main.c, iri.c : Make use of check_encoding_name().
+
+2008-06-19 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c, iri.h : Add a new function find_locale() to find
+ out the local system encoding.
+
+ * src/main.c : Make use of find_locale().
+
+2008-06-19 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c : Include missing stringprep.h file and add a
+ cast.
+
+ * src/init.c : set a default initial value for opt.enable_iri,
+ opt.locale and opt.encoding_remote.
+
+2008-06-19 Xavier Saint <wget@sxav.eu>
+
+ * src/html-url.c : Add "content-type" meta tag parsing for
+ retrieving page encoding.
+
+ * src/iri.h : Make no-op version of parse_charset() return
+ NULL.
+
+2008-06-16 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): When hstat.len is higher than the
+ successfully completed content's length, but it's because we
+ _set_ it that way, don't abort.
+
+2008-06-14 Xavier Saint <wget@sxav.eu>
+
+ * src/iri.c, iri.h : New files.
+
+ * src/Makefile.am : Add files iri.h and conditional iri.c.
+
+ * src/build_info.c : Add compiled feature "iri".
+
+ * src/http.c : include iri.h and parse charset from Content-Type
+ header.
+
+ * src/init.c, main.c, options.h : if an options isn't supported
+ at compiled time, don't get rid off it and show a dummy
+ message instead if they are used.
+
+2008-06-14 Xavier Saint <wget@sxav.eu>
+
+ * configure.ac: Add support for IRIs
+
+2008-06-13 Micah Cowan <micah@cowan.name>
+
+ * src/build_info.c: ENABLE_NTLM, not HAVE_NTLM; distinguish OpenSSL
+ from "ssl".
+
+2008-06-13 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Mailing List): The wget-notify mailing list no longer
+ receives commit notifications from the source repository.
+ (Internet Relay Chat): Activity isn't quite so low any more,
+ remove notice to that effect.
+
+2008-06-13 Madhusudan Hosaagrahara <com.gmail.hrmadhu>
+
+ * src/Makefile.am, main.c, init.c, init.h, build_info.c: Adds build
+ information to the --version command line option. Fixes bug
+ #20636.
+
+2008-06-12 Micah Cowan <micah@cowan.name>
+
+ * tests/FTPServer.pm, FTPTest.pm, HTTPServer.pm, HTTPTest.pm,
+ Test--no-content-disposition-trivial.px,
+ Test--no-content-disposition.px, Test--spider-fail.px,
+ Test--spider-r--no-content-disposition-trivial.px,
+ Test--spider-r--no-content-disposition.px,
+ Test--spider-r-HTTP-Content-Disposition.px, Test--spider-r.px,
+ Test--spider.px, Test-E-k-K.px, Test-E-k.px,
+ Test-HTTP-Content-Disposition-1.px,
+ Test-HTTP-Content-Disposition-2.px,
+ Test-HTTP-Content-Disposition.px,
+ Test-N--no-content-disposition-trivial.px,
+ Test-N--no-content-disposition.px,
+ Test-N-HTTP-Content-Disposition.px, Test-N-current.px,
+ Test-N-no-info.px, Test-N-old.px, Test-N-smaller.px, Test-N.px,
+ Test-O--no-content-disposition-trivial.px,
+ Test-O--no-content-disposition.px,
+ Test-O-HTTP-Content-Disposition.px, Test-O-nonexisting.px,
+ Test-O.px, Test-Restrict-Lowercase.px,
+ Test-Restrict-Uppercase.px, Test-auth-basic.px, Test-c-full.px,
+ Test-c-partial.px, Test-c.px, Test-ftp.px,
+ Test-nonexisting-quiet.px, Test-noop.px, Test-np.px,
+ Test-proxied-https-auth.px, Test-proxy-auth-basic.px,
+ WgetTest.pm.in: Use whatever ports are available, rather than
+ hard-coded ones.
+
+ * tests/run-px: More summary info, explicit exit code.
+
+ * tests/Makefile.am: Reinstate "run-px-tests" as a dependency for the
+ "check" target.
+
+ * tests/WgetTest.pm.in: Draw more attention to the fact that
+ WgetTest.pm is a generated file.
+
+ * tests/Test-proxied-https-auth.px: Better cleanup, so next test can
+ open the port.
+
+2008-06-01 Micah Cowan <micah@cowan.name>
+
+ * src/main.c [WINDOWS]: Reopen stdout in binary mode, when -O - is
+ given.
+
+2008-05-31 Micah Cowan <micah@cowan.name>
+
+ * src/html-url.c, http.c: Avoid casts in a couple spots.
+
+2008-05-31 Micah Cowan <micah@cowan.name>
+
+ * tests/Test-N-current.px: Ensure we catch failures.
+
+ * tests/Test-N-old.px: Make it test only the timestamp, and not the
+ content length in addition.
+
+ * tests/Test-N-smaller.px, Test-N-no-info.px: added.
+
+ * tests/Test-c-partial.px: Improve checking that the file was
+ partially retrieved, rather than overwritten.
+
+ * tests/run-px: Added Test-N-smaller.px, Test-N-no-info.px.
+
+ * tests/HTTPServer.pm: Return 416 for fully-retrieved content, rather
+ than 206 with a zero content-length.
+
+2008-05-30 Henri Häkkinen <henux@users.sourceforge.net>
+
+ * src/cookies.c, ftp-basic.c, hash.c, html-url.c, http-ntlm.c, http.c,
+ init.c, log.c, main.c, progress.c, ptimer.c, spider.c, url.c,
+ utils.c: Minor changes to silence warnings when using -Wall.
+
+2008-05-29 Micah Cowan <micah@cowan.name>
+
+ * po/*.po: Updated from TP (the 1.11.3 set).
+
+ * po/POTFILES.in: Added some more files from lib/, remove
+ src/xmalloc.c.
+
+ * po/quot.sed, po/boldquot.sed: Automatic handling of quotearg's `
+ and '.
+
+2008-05-26 Steven Schubiger <schubiger@gmail.com>
+
+ * src/ftp.c (getftp): Replace last remaining invocation of escnonprint
+ with gnulib quote.
+
+2008-05-23 Micah Cowan <micah@cowan.name>
+
+ * tests/Test--spider.px: Make test expect 0 return code.
+
+2008-05-22 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am (run-px-tests): Replaced ugly list of tests with
+ run-px Perl script to manage running them.
+
+ * tests/run-px: Added.
+
+ * tests/FTPServer.pm (run): Avoid re-forking. Fixes bug #20458.
+
+2008-05-19 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (main): Password prompt should be done only once (not
+ once per argument), and should be done prior to the background
+ fork.
+
+2008-05-17 Steven Schubiger <stsc@members.fsf.org>
+
+ * doc/wget.texi (Download Options): Change documentation to reflect
+ the new default value for --prefer-family.
+ (Wgetrc Commands): Same, for prefer_family wgetrc command.
+
+2008-05-17 Steven Schubiger <schubiger@gmail.com>
+
+ * src/init.c (defaults): Set the preferred IP family to `none' by
+ default.
+
+2008-05-17 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (main): Handle Ctrl-D on command-line.
+
+2008-05-17 Kenny Parnell <k.parnell@gmail.com>
+
+ (cmd_spec_prefer_family): Initialize prefer_family to prefer_none.
+
+2008-05-15 Steven Schubiger <schubiger@gmail.com>
+
+ * src/ftp.c (getftp): Verify that the file actually exists in FTP, by
+ checking it against the listing.
+
+2008-05-15 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (prompt_for_password): Use the quote module.
+
+2008-05-15 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Entry for --ask-password.
+
+2008-05-14 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (ftp_retrieve_list): Symlinks and other filenames
+ should be fully quoted.
+
+2008-05-14 Joao Ferreira <joao@joaoff.com>
+
+ * src/main.c, src/http.c, src/ftp.c: -nc is now working in
+ conjunction with '-O file'.
+
+2008-05-12 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (main): Downgrade "-N with -O" to a warning, and switch
+ it off to avoid confusing messages.
+
+2008-05-12 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options): -N with -O downgraded to a
+ warning.
+
+2008-05-12 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Translations and -N/-O.
+
+2008-04-30 Steven Schubiger <stsc@members.fsf.org>
+
+ * src/main.c (main): New code that handles prompting for passwords
+ when specified explicitly via command-line option (using gnulib's
+ getpass-gnu module).
+ (main): Include the getpass header.
+
+ * src/init.c: Add "ask-password" to the list of recognized commands.
+
+ * src/options.h: Add an according boolean member to the options
+ struct.
+
+ * src/sysdep.h: Comment the defines __EXTENSIONS__ and _GNU_SOURCE
+ out, because they're now defined independently by config.h.
+
+2008-04-30 Steven Schubiger <stsc@members.fsf.org>
+
+ * lib/getdelim.c, lib/getline.c, lib/getpass.c,
+ lib/getpass.h, lib/realloc.c, lib/stdio.h,
+ lib/stdio.in.h, lib/stdlib.h, lib/stdlib.in.h: Imported
+ from gnulib.
+ * m4/eoverflow.m4, m4/extensions.m4, m4/getdelim.m4,
+ m4/getline.m4, m4/getpass.m4, m4/malloc.m4, m4/realloc.m4,
+ m4/stdio_h.m4, m4/stdlib_h.m4: Imported from gnulib.
+ * md5/stdint.h: Imported from gnulib.
+
+ * GNUmakefile: Updated from gnulib.
+ * lib/Makefile.am, lib/getopt.c, lib/unistd.in.h: Updated
+ from gnulib.
+ * m4/gnulib-cache.m4, m4/gnulib-common.m4, m4/gnulib-comp.m4,
+ m4/include_next.m4, m4/unistd_h.m4: Updated from gnulib.
+ * md5/Makefile.am, md5/m4/gnulib-cache.m4, md5/m4/gnulib-common.m4,
+ md5/m4/gnulib-comp.m4, md5/m4/include_next.m4, md5/m4/md5.m4,
+ md5/m4/stdint.m4, md5/md5.c, md5/md5.h, md5/stdint.in.h,
+ md5/wchar.in.h: Updated from gnulib.
+
+2008-04-30 Steven Schubiger <stsc@members.fsf.org>
+
+ * doc/wget.texi <Download Options>: Document the --ask-password
+ option.
+
+2008-04-30 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (create_image): Fix glitch where too many spaces are
+ printed on lines that don't display the ETA, in multibyte
+ locales.
+
+2008-04-30 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Added documentation for changes made in 1.11.2.
+
+2008-04-27 Rabin Vincent <rabin@rab.in>
+
+ * src/http.c (http_loop): Fix return for the case where we don't
+ download a file because of -nc.
+
+2008-04-27 Micah Cowan <micah@cowan.name>
+
+ * src/url.c (path_simplify): Go back to allowing leading ".." in
+ paths, but only for FTP URLs.
+ (test_path_simplify): Add scheme-specificness to tests, adapt for
+ mu_run_test.
+
+ * src/test.c (all_tests): Add test_path_simplify.
+
+ * src/main.c (main): Downgrade -r, -p with -O to a warning rather than
+ an error; elaborate just a bit more for other -O combination
+ cases.
+
+2008-04-27 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi (Download Options) <-O>: Elaborate on why certain
+ options make poor combinations with -O.
+
+2008-04-26 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am, Test-proxied-https-auth.px: Added a test for
+ accessing password-protected HTTPS URLs through a proxy (via
+ CONNECT).
+
+2008-04-26 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (gethttp): Move proxy CONNECT handling to below the
+ retry_with_auth label, to deal with properly reconnecting to
+ proxies when we need to authenticate.
+
+2008-04-25 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: -I foo -> -Ifoo.
+
+2008-04-24 Micah Cowan <micah@cowan.name>
+
+ * src/main.c: Revised usage description of --convert-links to apply
+ to CSS as well as to HTML.
+
+2008-04-24 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Adjusted documentation to account for CSS support;
+ added Ted Mielczarek to contributors.
+
+2008-04-24 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Removed info about move to Automake, Gnulib. Added item
+ about the addition of CSS support.
+
+2008-04-23 Micah Cowan <micah@cowan.name>
+
+ * src/utils.c (test_dir_matches_p): Added a test for the case
+ described in issue #20518.
+
+2008-04-22 Ted Mielczarek <ted.mielczarek@gmail.com>
+
+ * src/css.lex, css-url.c, css-url.h: Added to implement support for
+ parsing CSS in Wget.
+ * src/convert.c: Convert links in CSS files, too.
+ * src/convert.h (convert_options): Added for options link_css_p,
+ link_expect_css.
+ * src/convert.h: Added prototype for new register_css function.
+ * src/html-parse.c: Added support for parsing element content, in
+ addition to tag starts and ends.
+ * src/html-parse.h (taginfo): Added delimiter fields for element
+ content.
+ * src/html-url.h: Added.
+ * src/html-url.c (append_url): No longer internal-linkage only. Now
+ takes position and size as explicit parameters.
+ * src/html-url.c: Use new html-url.h header, add support for
+ handling of "style" HTML attributes. Mark URIs obtained from
+ link tags with rel="stylesheet" with link_expect_css. Adapt
+ uses of append_url to supply the newly-added parameters for
+ position and size.
+ * src/http.c: Add detection for when the content-type is text/css;
+ and ensure that such files have the ".css" filename extension,
+ when --convert-links is active.
+ * src/recur.h: Remove declarations for functions found in
+ html-url.c (moved to html-url.h).
+ * src/recur.c: Add support for culling links from CSS files, too,
+ and tracking for when we're expecting the file to be CSS (even
+ when its content type isn't text/css).
+ * src/retr.c (retrieve_url): Add registration of CSS files.
+ * src/wget.h: Added TEXTCSS to dt flags enum.
+ * src/Makefile.am: Added css.lex, css-url.c, css-url.h, html-url.h
+ to wget_SOURCES.
+
+2008-04-22 Ted Mielczarek <ted.mielczarek@gmail.com>
+
+ * configure.ac: Added check for lex.
+
+2008-04-22 Steven Schubiger <schubiger@gmail.com>
+
+ * src/http.c (print_response_line): Changed to make responses always
+ be logged, even in --quiet mode, if --server-response was
+ specified. This is to bring http.c's handling of the situation
+ in line with ftp.c's.
+
+2008-04-22 Rabin Vincent <rabin@rab.in>
+
+ * src/ftp.c (ftp_get_listing): Only remove .listing if it has been
+ created.
+
+2008-04-22 Pranab Shenoy <pranab.loosinit.shenoy@gmail.com>
+
+ * src/init.c: Added test_commands_sorted unit test to check is
+ commands are sorted. Fixes bug #21245.
+
+ * src/test.c: Added test_commands_sorted to the test suite.
+
+2008-04-22 Mike Frysinger <vapier@gentoo.org>
+
+ * src/Makefile.am: Move @LIBS@ after other libraries, for better
+ static-linking support. Fixes bug #22143.
+
+2008-04-22 Mike Frysinger <vapier@gentoo.org>
+
+ * doc/sample.wgetrc: Added prefer_family example. Resolves bug
+ #22142.
+
+2008-04-22 Micah Cowan <micah@cowan.name>
+
+ * ylwrap: Added via automake -ac.
+
+2008-04-22 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am, css.lex, css.l: Renamed css.lex to css.l.
+ * src/recur.c (retrieve_tree): Fix typo to allow text/css files to
+ be parsed.
+
+2008-04-22 Jim Paris <jim@jtan.com>
+
+ * src/openssl.c (ssl_init): Enable combined certificate/key in
+ single file (apparent regression from ~1.9). Resolves issue
+ #22767.
+
+2008-04-22 Alain Guibert <alguibert+bts@free.fr>
+
+ * src/test.h (mu_run_test): Move declaration before statements, for
+ C90 conformance. Fixes bug #22789.
+
+2008-04-16 Steven Schubiger <schubiger@gmail.com>
+
+ * src/sysdep.h: Comment the defines __EXTENSIONS__ and _GNU_SOURCE
+ out, because they're now defined independently by config.h.
+
+2008-04-16 Steven Schubiger <schubiger@gmail.com>
+
+ * src/ftp.c: Use Gnulib's quote function for printing filenames and
+ such.
+ * src/connect.c: Likewise.
+ * src/convert.c: Likewise.
+ * src/cookies.c: Likewise.
+ * src/ftp-opie.c: Likewise.
+ * src/gnutls.c: Likewise.
+ * src/init.c: Likewise.
+ * src/log.c: Likewise.
+ * src/mswindows.c: Likewise.
+ * src/openssl.c: Likewise.
+ * src/progress.c: Likewise.
+ * src/recur.c: Likewise.
+ * src/res.c: Likewise.
+ * src/utils.c: Likewise.
+
+2008-04-14 Steven Schubiger <schubiger@gmail.com>
+
+ * src/http.c: Use Gnulib's quote function for printing filenames and
+ such.
+ * src/wget.h: #include "quote.h".
+
+2008-04-14 Micah Cowan <micah@cowan.name>
+
+ * GNUmakefile, lib/Makefile.am, lib/error.c, lib/error.h,
+ lib/exitfail.c, lib/exitfail.h, lib/getopt.c, lib/intprops.h,
+ lib/quote.c, lib/quote.h, lib/quotearg.c, lib/quotearg.h,
+ lib/stdlib.in.h, lib/strerror.c, lib/string.in.h,
+ lib/unistd.in.h, lib/wchar.in.h, lib/wctype.in.h,
+ lib/xalloc-die.c, lib/xalloc.h, lib/xmalloc.c, m4/error.m4,
+ m4/exitfail.m4, m4/extensions.m4, m4/gnulib-cache.m4,
+ m4/gnulib-comp.m4, m4/include_next.m4, m4/inline.m4,
+ m4/mbrtowc.m4, m4/mbstate_t.m4, m4/quote.m4, m4/quotearg.m4,
+ m4/stdlib_h.m4, m4/strerror.m4, m4/string_h.m4, m4/unistd_h.m4,
+ m4/wchar.m4, m4/wctype.m4, m4/wint_t.m4, m4/xalloc.m4,
+ md5/Makefile.am, md5/m4/gnulib-cache.m4, md5/m4/gnulib-comp.m4,
+ md5/m4/include_next.m4, md5/m4/md5.m4, md5/m4/stdint.m4,
+ md5/md5.c, md5/md5.h, md5/stdint.in.h, md5/wchar.in.h: Update
+ from Gnulib, and add the "quote" module.
+
+2008-04-12 Rabin Vincent <rabin@rab.in>
+
+ * src/mswindows.c (fake_fork_child): Don't create a logfile for
+ --background when --quiet is used, but not --server-response.
+ Fixes bug #20917.
+
+ * src/utils.c (fork_to_background): Likewise.
+
+2008-04-12 Micah Cowan <micah@cowan.name>
+
+ * src/utils.c (aprintf): Minor formatting changes to Alex's code (80-
+ column limit, concatenated string literals, avoiding nesting
+ levels), and removed invocation of free (since we're aborting
+ anyway).
+
+2008-04-11 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (getftp, ftp_loop_internal): Don't append to an existing
+ .listing when --continue is used. Fixes bug #22825. Thanks to
+ Rabin Vincent <rabin@rab.in> for pointing the way with a
+ suggested fix!
+
+2008-04-11 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Contributors>: Added Julien Buty, Alexander
+ Dergachev, and Rabin Vincent.
+
+2008-04-11 Alexander Dergachev <cy6erbr4in@gmail.com>
+
+ * src/utils.c (aprintf): Now we are setting limits (1 Mb) for text
+ buffer when we use non-C99 vsnprintf.
+
+2008-04-10 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am, Test-proxy-auth-basic.px: Added a test for
+ accessing password-protected URLs through a proxy.
+
+2008-04-10 Alexander Dergachev <cy6erbr4in@gmail.com>
+
+ * src/xmalloc.c, xmalloc.h (memfatal): Now exported; accepts an
+ "unknown" value for the attempted allocation size.
+ * src/utils.c (aprintf): Now calls memfatal, instead of aborting.
+
+2008-03-24 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Types of Fields>: Mentioned various caveats in the
+ behavior of accept/reject lists, deprecate current
+ always-download-HTML feature. Added @noindent to a couple of
+ appropriate spots.
+
+2008-03-24 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Added documentation change re: --no-parents, and various
+ caveats on accept/reject lists behavior. Rearranged some items in
+ order of priority.
+
+2008-03-20 Micah Cowan <micah@cowan.name>
+
+ * ABOUT-NLS: Reinstated, but with a message mentioning that
+ gettext is not included.
+ * Makefile.am: Removed "test" target; "check" should be used
+ instead (and "test" was mildly broken, anyway).
+
+2008-03-19 Micah Cowan <micah@cowan.name>
+
+ * src/utils.c (test_dir_matches_p): More tests related for
+ dir_matches_p.
+
+2008-03-17 Micah Cowan <micah@cowan.name>
+
+ * src/connect.c: Include sys/time.h to support use of the select
+ function on older systems.
+
+2008-03-17 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Directory-Based Limits>: Mention importance of
+ trailing slashes to --no-parents.
+
+2008-02-14 Micah Cowan <micah@cowan.name>
+
+ * ABOUT-NLS: Removed.
+
+2008-02-11 Benno Schulenberg <bensberg@justemail.net>
+
+ * src/http.c: More accurate and descriptive messages for when a file
+ won't be retrieved during spider-mode.
+
+2008-02-10 Micah Cowan <micah@cowan.name>
+
+ * src/http.c: Added existence_checked member to the http_stat
+ struct.
+ (gethttp): Mark hs->existence_checked when we've checked whether
+ a file-to-download exists; so we don't check it again if the
+ connection gets lost (and potentially pick a new "unique" name).
+ This fixes bug 22251.
+ * src/progress.c (create_image): Add space for an extra column in
+ the "eta" portion of the progress bar image; to deal with
+ too-long Czech translation.
+ * src/main.c, http.c, init.c: Added --auth-no-challenge option, to
+ bring back 1.10.2 unsafe auth behavior when needed. This fixes
+ bug #22242.
+
+2008-02-10 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <HTTP Options>: Added documentation of
+ --auth-no-challenge.
+
+2008-02-10 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Added note re interrupted files resulting in renames,
+ and new --auth-no-challenge option.
+
+2008-02-07 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (create_image): Remove assertion on exceeding
+ screen width, which given the less-than-robust code there, can
+ be broken by a number of factors (such as large file downloads).
+
+2008-02-06 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (countcols): Use strlen() when mbtowc or wcwidth
+ not available (or not using NLS).
+ * src/utils.c: Ensure we use single-byte separators when not doing
+ NLS progress-bars.
+ * src/wget.h: Determine whether to use NLS for progress-bars, based
+ on whether wcwidth and mbtowc are available.
+
+2008-02-06 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.ṫexi <Overview>: Remove references to no-longer-supported
+ socks library.
+
+2008-02-06 Micah Cowan <micah@cowan.name>
+
+ * configure.ac (AC_CHECK_FUNCS): Added check for mbtowc.
+ * NEWS: Added notes regarding fixes for the localized progress
+ bar and --no-clobber wasted GET request.
+ * po/be.po: Added from the TP.
+
+2008-02-03 Micah Cowan <micah@cowan.name>
+
+ * src/progress.c (create_image): Use number of characters/columns
+ consumed, rather than number of bytes, to determine how much of
+ a line we've used. Fixes assertion errors and field alignment
+ bugs (#22161, #20481)
+ (get_eta, count_cols): Added to support the changes for
+ create_image.
+ * src/http.c (http_loop): Put no-clobber logic back into http_loop,
+ before starting to fetch, for when we're not doing
+ content-disposition.
+
+2008-02-03 Micah Cowan <micah@cowan.name>
+
+ * configure.in: Add checks for wchar.h, wcwidth function (to
+ support column-counting in progress.c).
+ * NEWS: Added line for 1.11.1.
+ * util/README, util/Makefile.am, util/trunc.c: Added a small
+ utility program to create files of arbitrary size (useful for
+ testing certain situations with --continue).
+
+2008-01-31 Micah Cowan <micah@cowan.name>
+
+ * util/README, util/dist-wget, util/download-netscape.html,
+ util/download.html, util/update_po_files.sh, util/wget.spec:
+ Removed (obsolete and/or incomplete).
+ * Makefile.am: Removed no-longer-existant util stuff from
+ extra_DIST (but added the README).
+
+2008-01-31 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (gethttp): Don't derive hs->contlen from possibly
+ invalid/missing Content-Length; instead, get the appropriate
+ value from the Content-Range header values.
+ (parse_content_range): Handle '*' instance-length field.
+
+2008-01-31 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Ensure that license info appears in the info
+ version of the manual.
+
+2008-01-28 Micah Cowan <micah@cowan.name>
+
+ * po/en@quot.po, po/en@boldquot.po, po/en_US.po: Updated
+ translations for copyright year in --version.
+ * po/Rules-quot: Make en@*-update should create wget.pot.
+ * configure.ac: Ensure that en_US appears in ALL_LINGUAS exactly
+ once.
+
+2008-01-25 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am: Updated copyright year.
+
+2008-01-25 Micah Cowan <micah@cowan.name>
+
+ * src/main.c: Added notes to translators regarding (C), diacritics
+ in names.
+ * src/Makefile.am, cmpt.c, connect.c, connect.h, convert.c,
+ cookies.c, cookies.h, ftp-basic.c, ftp-ls.c, ftp-opie.c, ftp.c,
+ ftp.h, gen-md5.c, gen-md5.h, gnutls.c, hash.c, hash.h, host.c,
+ host.h, html-parse.c, html-parse.h, html-url.c, http-ntlm.c,
+ http-ntlm.h, http.c, http.h, init.c, init.h, log.c, log.h,
+ main.c, mswindows.c, mswindows.h, netrc.c, netrc.h, openssl.c,
+ options.h, progress.c, progress.h, ptimer.c, ptimer.h, recur.c,
+ recur.h, res.c, res.h, retr.c, retr.h, spider.c, spider.h,
+ ssl.h, sysdep.h, test.c, test.h, url.c, url.h, utils.c,
+ utils.h, wget.h, xmalloc.c, xmalloc.h: Updated copyright year.
+
+2008-01-25 Micah Cowan <micah@cowan.name>
+
+ * msdos/config.h: Updated copyright year.
+
+2008-01-25 Micah Cowan <micah@cowan.name>
+
+ * Makefile.am, NEWS, README, configure.ac, configure.bat,
+ m4/wget.m4, po/POTFILES.in, util/Makefile.am, util/dist-wget,
+ util/rmold.pl, files: Updated copyright year.
+
+2008-01-25 Micah Cowan <micah@cowan.name>
+ * doc/Makefile.am, wget.texi: Updated copyright year.
+
+2008-01-24 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Added en_US LINGUA (generated).
+ * po/Rules-quot: Added rule to copy en_US.po from en@quot.po.
+ * po/boldquot.sed, po/quot.sed: Translate _all_ apostrophes we
+ find, not just the ones used for quotes; and add rules to use
+ the copyight symbol, and write Hrvoje's last name properly. ^_^
+ * po/en@quot.po, po/en@boldquot.po: Updated by new rules.
+ * po/en_US.po: Added.
+
+2008-01-23 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am: Add libmd5 to unit-tests.
+
+2007-12-10 Micah Cowan <micah@cowan.name>
+
+ * src/main.c: The option is --content-disposition, not
+ --no-content-disposition (at the moment).
+
+2007-12-10 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Document the --content-disposition option (and not
+ just the .wgetrc setting).
+
+2007-12-10 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Removed developer-only notices (Autoconf, TODO, PATCHES,
+ GNUTLS).
+
+2007-12-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (ftp_retrieve_glob): Print both arguments of fnmatch in
+ fnmatch error message.
+ (ftp_retrieve_glob): Don't match with fnmatch if we're only
+ supposed to get one file.
+
+2007-12-07 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: Plug in vars to include stuff from
+ $(top_srcdir)/md5 when appropriate.
+
+2007-12-07 Micah Cowan <micah@cowan.name>
+
+ * lib/Makefile.am, lib/c-ctype.c, lib/c-ctype.h, lib/gettext.h,
+ lib/stdbool.in.h, lib/unistd.in.h, m4/gnulib-cache.m4,
+ m4/gnulib-common.m4, m4/gnulib-comp.m4, m4/unistd_h.m4:
+ Updated from gnulib.
+ * Makefile.am, configure.ac: Plugged in the md5/ stuff.
+ * lib/md5.c, lib/md5.h, lib/stdint.in.h, lib/wchar.in.h,
+ m4/longlong.m4, m4/md5.m4, m4/stdint.m4, m4/wchar.m4: Moved to
+ md5/.
+ * md5/Makefile.am, md5/dummy.c, md5/m4/gnulib-cache.m4,
+ md5/m4/gnulib-common.m4, md5/m4/gnulib-comp.m4,
+ md5/m4/gnulib-tool.m4, md5/m4/include_next.m4,
+ md5/m4/longlong.m4, md5/m4/md5.m4, md5/m4/stdint.m4,
+ md5/m4/wchar.m4, md5/md5.c, md5/md5.h, md5/stdint.in.h,
+ md5/wchar.in.h: Moved/copied from lib/, m4/; updated from
+ gnulib.
+ * m4/ulonglong.m4: Removed (via update from gnulib).
+
+2007-12-06 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: "the the" -> "the"
+
+2007-12-05 Micah Cowan <micah@cowan.name>
+
+ * src/utils.c (subdir_p): Handle the case where d1 is "".
+ * src/convert.c (convert_all_links): Don't return without
+ deallocating timer.
+
+2007-12-05 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Wgetrc Commands>: Explicitly mention that
+ --content-disposition has known issues.
+
+2007-12-05 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Reword warnings regarding --content-disposition.
+
+2007-11-28 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am: Updated license exception for OpenSSL, per the
+ SFLC.
+
+2007-11-28 Micah Cowan <micah@cowan.name>
+
+ * msdos/config.h: Updated license exception for OpenSSL, per the SFLC.
+
+2007-11-28 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am, cmpt.c, connect.c, connect.h, convert.c,
+ convert.h, cookies.c, cookies.h, ftp-basic.c, ftp-ls.c,
+ ftp-opie.c, ftp.c, ftp.h, gen-md5.c, gen-md5.h, gnutls.c,
+ hash.c, hash.h, host.c, host.h, html-parse.c, html-parse.h,
+ html-url.c, http-ntlm.c, http-ntlm.h, http.c, http.h, init.c,
+ init.h, log.c, log.h, main.c, mswindows.c, mswindows.h,
+ netrc.c, netrc.h, openssl.c, options.h, progress.c, progress.h,
+ ptimer.c, ptimer.h, recur.c, recur.h, res.c, res.h, retr.c,
+ retr.h, safe-ctype.c, safe-ctype.h, spider.c, spider.h, ssl.h,
+ sysdep.h, test.c, test.h, url.c, url.h, utils.c, utils.h,
+ wget.h, xmalloc.c, xmalloc.h: Updated license exception for
+ OpenSSL, per the SFLC.
+
+2007-11-28 Micah Cowan <micah@cowan.name>
+
+ * Makefile.am, README, autogen.sh, configure.bat, configure.in,
+ m4/wget.m4, util/Makefile.am, util/dist-wget: Updated license
+ exception for OpenSSL, per the SFLC.
+
+2007-10-30 Micah Cowan <micah@cowan.name>
+
+ * src/main.c (main): Declare argv parameter as char **argv, rather
+ than char *const *argv. This fixes usage of getopt_long,
+ regardless of whether getopt_long has a constified argv or not.
+
+2007-10-23 Micah Cowan <micah@schmendrick>
+
+ * lib/stdbool.in.h, lib/stdint.in.h: gnulib-tool --update.
+ Includes fix for broken stdbool.h on Tru64.
+
+2007-10-22 Micah Cowan <micah@cowan.name>
+
+ * po/*.po: Refresh from TP and update-po.
+ * lib/Makefile.am, m4/gnulib-cache.m4, m4/longlong.m4,
+ m4/ulonglong.m4, maint.mk: gnulib-tool --update. Includes fix
+ for maint.mk with old versions of gzip.
+
+2007-10-22 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/mswindows.c: Move INHIBIT_WRAP macro definition up with wget.h
+ inclusion.
+
+2007-10-18 Steven Schweda <sms@antinode.org>
+
+ * src/sysdep.h: #include <stdint.h> as well as <inttypes.h>, to work
+ around a glitch on Tru64 systems.
+
+2007-10-18 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.am: Add dependency for unit_tests on libgnu.a.
+
+2007-10-18 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: version.c should not be distributed. Removed
+ config-post.h. Add version.c dependency and gnulib include path
+ for libunittest.a.
+ * src/sysdep.h: Got contents of config-post.h
+ * src/config-post.h: Removed.
+ * src/wget.h: #include "config.h".
+ * src/alloca.c, cmpt.c, connect.c, convert.c, cookies.c,
+ ftp-basic.c, ftp-ls.c, ftp-opie.c, ftp.c, gen-md5.c, gnutls.c,
+ hash.c, host.c, html-parse.c, html-url.c, http-ntlm.c, http.c,
+ init.c, log.c, main.c, mswindows.c, netrc.c, openssl.c,
+ progress.c, ptimer.c, recur.c, res.c, retr.c, spider.c, url.c,
+ utils.c, xmalloc.c: Use wget.h at very top, and instead of
+ config.h.
+
+2007-10-18 Micah Cowan <micah@cowan.name>
+
+ * po/POTFILES.in: Removed no-longer-existing or generated files.
+ * autogen.sh: Reinstated, in case we have to do something at
+ some point other than autoreconf.
+ * Makefile.am: Put autogen.sh back in EXTRA_DIST. Just in case
+ someone needs to rebuild configure.
+ * configure.ac: Removed config-post.h inclusion from bottom of
+ generated config.h.
+
+2007-10-16 Micah Cowan <micah@cowan.name>
+
+ * README: Draw attention to wiki:PatchGuidelines.
+
+2007-10-15 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: Remove intermediary hg-id file generation, make
+ version.c-generation more portable.
+
+2007-10-15 Gisle Vanem <gvanem@broadpark.no>
+
+ * msdos/config.h: Added some HAVE_* for djgpp 2.04 and Watcom 1.7+.
+
+ * msdos/Makefile.DJ: rewritten for including some files from ../lib.
+
+ * msdos/Makefile.WC: Ditto. Handling source-files out-of current
+ directory makes compliation a bit more painfull. AFAICS, one
+ must use explicit rules.
+
+2007-10-14 Micah Cowan <micah@cowan.name>
+
+ * src/cmpt.c, cookies.c, ftp-basic.c, ftp-ls.c, ftp.c, hash.c,
+ host.c, html-parse.c, html-url.c, http-ntlm.c, http.c, init.c,
+ log.c, main.c, netrc.c, openssl.c, res.c, url.c, utils.c,
+ wget.h: Replace uses of ISSPACE, etc with c_isspace, etc.
+ * src/gnu-md5.c, gnu-md5.h: Removed, in deference to gnulib.
+ * src/Makefile.am: Removed gnu-md5.h from wget_SOURCES.
+ * src/gen-md5.c: Changed #inclusion of gnu-md5.h to md5.h (gnulib's).
+ * src/recur.c (download_child_p): Print error if unlink of
+ robots.txt fails.
+ * src/main.c (main): --spider or --delete-after now implies
+ --no-directories (thanks, Josh Williams).
+
+2007-10-14 Micah Cowan <micah@cowan.name>
+
+ * configure.ac: Let gnulib handle builtin MD5 functionality.
+ * NEWS: Mention gnulib.
+
+2007-10-14 Joshua David Williams <yurimxpxman@gmail.com>
+
+ * src/recur.c (download_child_p): Remove robots.txt if
+ --delete-after or --spider is on.
+
+2007-10-13 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.am: Make version.c depend on Wget dependencies (source
+ files, plus such things as LIBOBJS so we get things like
+ http-ntlm.c). Removed getopt.[ch], as we're now using gnulib for
+ these.
+
+2007-10-13 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Mailing Lists>: Replaced mention of no-longer
+ included PATCHES file with link to relevant Wgiki page.
+ * doc/wget.texi <Internet Relay Chat>: Added new section.
+
+2007-10-13 Micah Cowan <micah@cowan.name>
+
+ * GNUMakefile, maint.mk: Added as part of the gnulib-ization.
+ * Makefile.am: gnulib-ized.
+ * configure.ac: gnulib-ized. Removed built-in getopt checks.
+
+2007-10-12 Micah Cowan <micah@cowan.name>
+
+ * PATCHES: Removed.
+ * NEWS: Updated info about source repositories, removal of
+ PATCHES file.
+
+2007-10-10 Micah Cowan <micah@cowan.name>
+
+ * src/http-ntlm.c: Include openssl/opensslv.h explicitly, instead of
+ hoping it'll be included by accident in openssl/des.h.
+
+2007-10-10 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Wgetrc Commands>: Fixed "doewnloads" typo.
+
+2007-10-09 gettextize <bug-gnu-gettext@gnu.org>
+
+ * m4/gettext.m4: New file, from gettext-0.16.1.
+ * m4/iconv.m4: New file, from gettext-0.16.1.
+ * m4/lib-ld.m4: Upgrade to gettext-0.16.1.
+ * m4/lib-link.m4: Upgrade to gettext-0.16.1.
+ * m4/lib-prefix.m4: Upgrade to gettext-0.16.1.
+ * m4/nls.m4: New file, from gettext-0.16.1.
+ * m4/po.m4: New file, from gettext-0.16.1.
+ * m4/progtest.m4: New file, from gettext-0.16.1.
+ * po/Makefile.in.in: Upgrade to gettext-0.16.1.
+ * po/Rules-quot: New file, from gettext-0.16.1.
+ * po/boldquot.sed: New file, from gettext-0.16.1.
+ * po/en@boldquot.header: New file, from gettext-0.16.1.
+ * po/en@quot.header: New file, from gettext-0.16.1.
+ * po/insert-header.sin: New file, from gettext-0.16.1.
+ * po/quot.sed: New file, from gettext-0.16.1.
+ * po/remove-potcdate.sin: New file, from gettext-0.16.1.
+
+2007-10-09 Micah Cowan <micah@cowan.name>
+
+ * src/gettext.h: Imported from /usr/share/gettext, fuller handling
+ of --disable-nls.
+ * src/wget.h: Remove logic for handling lack of NLS (now in
+ gettext.h).
+ * src/main.c: Use gettext's ENABLE_NLS rather than HAVE_NLS.
+ * src/Makefile.am: added @LIBINTL@ to LIBS (though it probably
+ belongs in LDADD, along with everything else currently assigned
+ to LIBS).
+
+2007-10-09 Micah Cowan <micah@cowan.name>
+
+ * configure.in: Renamed to configure.ac
+ * configure.ac: Renamed from configure.in. Added invocations of
+ AM_GNU_GETTEXT, etc. Added en@quot and en@boldquot pseudo-LINGUA
+ support.
+ * ABOUT-NLS: Added back in (required by autoreconf :\).
+ * Makefile.am: Added ABOUT-NLS and msdos/Makefile.WC to EXTRA_DIST.
+ * m4/wget.m4: Removed no-longer-used NLS stuff.
+ * Makefile.in.in: Restore previous policy of not updating .po's
+ unless explicitly asked (via update-po).
+
+2007-10-09 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/mswindows.c: 'argc' and 'argv' in 'windows_main()' are no longer
+ needed. Hence simply the prototype. Free 'exec_name' at exit.
+
+2007-10-08 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): Add send_head_first conditional back
+ around code that needs it, but not around the last-modified
+ header-parsing stuff this time. Removed no-longer-useful (was it
+ ever?) restart_loop boolean, continuing unconditionally at end
+ of send_head_first conditional block (if we haven't jumped out).
+
+2007-10-08 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Credit to Ralf Wildenhues for automakifying patches.
+
+2007-10-08 Micah Cowan <micah@cowan.name>
+
+ * AUTHORS: Credit to Ralf Wildenhues for automakifying patches.
+
+2007-10-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * tests/WgetTest.pm.in: wget is built in the build tree. Use an
+ absolute path to the binary.
+ * tests/Makefile.in: Removed, replaced by Makefile.am.
+ * tests/Makefile.am: Converted from Makefile.in.
+
+2007-10-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * po/Makefile.in.in: Since `distdir' is used now, adjust
+ DISTFILES to the missing ChangeLog file.
+ Add trivial targets ps, pdf, html.
+ * Makefile.in: Removed, replaced by Makefile.am.
+ * Makefile.am: Converted from Makefile.in.
+ * util/Makefile.in: Removed, replaced by Makefile.am.
+ * util/Makefile.am: Converted from Makefile.in.
+ * configure.in: Adjust for automake support.
+
+2007-10-05 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * doc/Makefile.in: Removed, replaced by Makefile.am.
+ * doc/Makefile.am: Converted from Makefile.in.
+
+2007-10-05 Micah Cowan <micah@cowan.name>
+
+ * config.guess, config.sub, install-sh: Update from versions
+ found in /usr/share/automake/.
+ * autogen.sh: Removed, in favor of just running autoreconf.
+
+2007-10-04 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): We've got_name if content_disposition
+ support isn't on; make sure we continue properly in that case,
+ even though we're not sending HEAD.
+ * src/Makefile.in: Removed, replaced by Makefile.am.
+ * src/Makefile.am: Converted from Makefile.in.
+
+2007-10-03 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <Wgetrc Commands>: Cleaned up alphabetization,
+ more consistent use of underscores. Added a description of the
+ content_disposition wgetrc command.
+
+2007-10-03 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Note missing functionality from GnuTLS support. Call out
+ attention to content_disposition's experimental status.
+
+2007-10-02 Stephen Gildea <stepheng+wget@gildea.com>
+
+ * src/connect.c (connect_to_host): Warn about host lookup failures.
+
+2007-10-02 Micah Cowan <micah@cowan.name>
+
+ * src/ftp.c (getftp, ftp_loop_internal), http.c (http_loop), main
+ (main): Use datetime_str instead of time_str, for those who have
+ potentially long-running sessions. Based on suggestions by Saso
+ Tomat <miskox@hotmail.com> and Steven M. Schweda
+ <sms@antinode.org>.
+ * src/http.c (gethttp): Warn about host lookup failures. Adjusted
+ from Stephen Gildea's patch.
+
+2007-10-02 Gisle Vanem <gvanem@broadpark.no>
+
+ * src/ftp.c: Use "_listing" for MSDOS (".listing" is illegal).
+
+ * src/url.c: Update comment for 'filechr_not_windows'.
+
+ * src/utils.c: Include <process.h> for 'getpid()' on Watcom.
+
+2007-10-02 Gisle Vanem <gvanem@broadpark.no>
+
+ * msdos/config.h: Removed unused defines, added needed 'HAVE_*' defines.
+
+ * msdos/Makefile.DJ: rewritten to be used from './src' directory.
+ Added '-DOPENSSL_NO_KRB5' for OpenSSL build. Target is
+ now wget.exe.
+
+ * msdos/Makefile.WC: Added for building with OpenWatcom targeting
+ 32-bit DOS (DOS32A extender).
+
+2007-10-01 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Updated information in Mailing Lists, Reporting
+ Bugs. Added Web Site section, and add information about Mac OS
+ X, MS-DOS, and VMS in Portability.
+
+2007-09-27 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Removed "for more details" from parenthesese
+ enclosing @pxref{}s, so that texi2pod.pl knows to remove the
+ whole reference. Made some gramattical improvements, and
+ strengthened the recommendation to use the info manual instead.
+ * doc/texi2pod.pl: Brought in some updates from the GCC version. Not
+ an entire update, since a couple "fixes" there breaks stuff
+ here.
+
+2007-09-25 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.in: Use EXEEXT instead of exeext.
+
+2007-09-25 Micah Cowan <micah@cowan.name>
+
+ * src/Makefile.in: Use EXEEXT instead of exeext.
+
+2007-09-25 Micah Cowan <micah@cowan.name>
+
+ * configure.in: Remove unnecessary heuristic to generate exeext
+ variable, since AC_PROG_CC and others automatically set EXEEXT.
+ Pointed out by Steve Kenton <skenton@ou.edu>.
+
+2007-09-24 Jochen Roderburg <roderburg@uni-koeln.de>
+
+ * src/http.c (http_zero): Remove no-longer-used local_size variable.
+ Fixes bug #21057.
+
+2007-09-24 Gisle Vanem <giva@bgnett.no>
+
+ * src/connect.c, init.c, main.c, openssl.c, options.h, sysdep.h,
+ url.c, utils.c: Added support for building on MS-DOS.
+
+2007-09-24 Gisle Vanem <giva@bgnett.no>
+
+ * msdos/Makefile.DJ, config.h: Added to support building on MS-DOS via
+ DJGPP.
+
+2007-09-12 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): Remove send_head_first from condition for
+ parsing timestamp.
+
+2007-09-12 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi: Expanded the description of -O. Clarified the
+ detection of elements as "patterns" versus "suffixes" in -A,
+ -R. Describe -p in relation to -nc.
+
+2007-09-12 Micah Cowan <micah@cowan.name>
+
+ * AUTHORS: Added... me...
+ * TODO: file removed, bugtracker is authoritative source for
+ planned changes.
+
+2007-08-29 Micah Cowan <micah@cowan.name>
+
+ * src/openssl.c (ssl_init): Re un-const-ified the meth local
+ variable, to match current versions of openssl.
+ * src/spider.c: Removed visited_url function, as it may be very
+ inefficient.
+ (print_broken_links): Removed traversal of referrers, until such
+ time as a more efficient implementation can be written.
+ * src/spider.h: Replaced declaration of visited_url with an
+ empty-bodied, function-like macro.
+
+2007-08-27 Micah Cowan <micah@cowan.name>
+
+ * src/wget.h: Added macro replacement for ngettext, for environs
+ that lack NLS.
+
+2007-08-27 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (run_with_timeout): Ensure that the correct
+ conversion specification is used for the return result of
+ the GetLastError function.
+ * src/getopt.c: Fix missing (but, accidentally, legal) comment
+ delimiter after licensing text.
+ * src/recur.c (retrieve_tree): Inserted missing cast for strip_auth.
+ Includes adjustment by Ralf Wildenhues.
+ * src/openssl.c (ssl_init): const-ified the meth local variable.
+ * src/main.c: Include all the static function definitions in the
+ "#ifndef TESTING" clause, leaving just the definitions for
+ exec_name (not set), and opt.
+ * src/utils.c (run_with_timeout): Now returns bool, to align with
+ declaration in utils.h.
+
+2007-08-26 Micah Cowan <micah@cowan.name>
+
+ * src/spider.c (print_broken_links): Fixed incorrect plurals msgid
+ usage, switched to use ngettext function.
+
+2007-08-26 Micah Cowan <micah@cowan.name>
+
+ * po/POTFILES.in: Added spider.c.
+
+2007-08-24 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): Introduced time_came_from_head boolean
+ flag, to help avoid parsing the same Last-Modified header twice.
+ Replaced spidering returns of RETRUNNEEDED for some situations,
+ to RETROK, as otherwise it will be interpreted as an error.
+ RETRUNNEEDED appears never to be referenced outside of
+ http.c (and wget.h), and, when returned by gethttp, is
+ translated by http_loop to RETROK.
+ * src/url.c (are_urls_equal): Don't call getchar_from_escaped_string
+ if u2 is shorter than u1.
+ (getchar_from_escaped_string): Don't decode reserved characters.
+ Handle illegally appearing '%'s as literal '%'s. Ensure hex
+ digits before attempting to decode.
+ (test_are_urls_equal): Added tests to handle u2 shorter than u1,
+ and %2f not treated the same as /.
+ * src/spider.c (in_url_list_p): Don't call are_urls_equal if one of
+ them is NULL.
+
+2007-08-24 Micah Cowan <micah@cowan.name>
+
+ * po/no.po: removed; replaced by nb.po (per the translation
+ project coordinator, Benno Schulenberg).
+
+2007-08-23 Joshua David Williams <yurimxpxman@gmail.com>
+
+ * src/spider.c (in_url_list_p): Removed the bool verbose argument
+
+2007-08-22 Micah Cowan <micah@cowan.name>
+
+ * Makefile.in: Exclude .svn directories and below from
+ distribution.
+
+2007-08-22 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Fall back to GET if HEAD fails with a 500 or 501
+ error code.
+
+2007-08-21 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/WgetTest.pm.in: Added support for timestamping of pre-existing
+ files.
+
+ * tests/Test-N-current.px: Fixed broken test logic.
+
+ * tests/Makefile.in: Updated list of automatically run tests.
+
+ * tests/Test-HTTP-Content-Disposition.px: Added -e contentdisposition=on
+ option, since now HTTP Content-Disposition header support is turned
+ off by default.
+
+ * tests/Test-HTTP-Content-Disposition-1.px: Ditto.
+
+2007-08-21 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Send preliminary HEAD request if -N is given and
+ the destination file exists already.
+
+2007-08-10 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * src/url.c (append_uri_pathel): Do not assume dest string to be
+ zero-terminated.
+ (test_append_uri_pathel): Terminate string to fix test failure.
+
+2007-08-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test--spider--no-content-disposition-trivial.px: Added new tests for
+ validation of HTTP Content-Disposition header support logic. In
+ particular, these tests check wget's behavior for every combination of
+ --spider [-r] and -e contentdisposition=on/off options.
+
+ * tests/Test--spider-r-HTTP-Content-Disposition.px: Ditto.
+
+ * tests/Test--spider-HTTP-Content-Disposition.px: Ditto.
+
+ * tests/Test--spider--no-content-disposition.px: Ditto.
+
+ * tests/Test--spider-r--no-content-disposition-trivial.px: Ditto.
+
+ * tests/Test--spider-r--no-content-disposition.px: Ditto.
+
+2007-08-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Fixed HTTP HEAD requests logic when --spider is
+ given.
+
+2007-08-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * src/url.c (url_string): Use comparison, not assignment, in
+ check for auth_mode == URL_AUTH_HIDE_PASSWD.
+
+2007-08-09 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * m4/wget.m4 (WGET_PROCESS_PO, AM_PATH_PROG_WITH_TEST): Add
+ missing M4 quotation. Delete serial number.
+
+2007-08-09 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (http_loop): If we got a HEAD and then a GET, and the
+ GET had a timestamp, use that one, not any we may have gotten
+ from the HEAD.
+
+2007-08-09 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Timestamping from most recent response.
+
+2007-08-08 Micah Cowan <micah@cowan.name>
+
+ * src/init.c (defaults): Content disposition will not be default,
+ since it currently results in extra round-trips.
+
+2007-08-08 Micah Cowan <micah@cowan.name>
+
+ * NEWS: Call attention to the fact that Content-Disposition is
+ not enabled by default.
+
+2007-08-07 Micah Cowan <micah@cowan.name>
+
+ * configure.in: Fix --with-libssl-prefix failure by replacing
+ usage of sh "if" statement with "AS_IF" macros, to force
+ AC_REQUIRE'd macros to be expanded before the conditional
+ statement body.
+ * NEWS: Note that configure.in now requires autoconf >= 2.61,
+ to support AS_IF and its expansion of AC_REQUIREs.
+
+2007-07-31 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (gethttp): Set contlen = -1 when we encounter a
+ negative-valued Content-Length header, so we don't consider it
+ an internal error later on and call abort().
+
+2007-07-29 Micah Cowan <micah@cowan.name>
+
+ * src/url.h, url.c (url_string): Replaced bool arg of the url_string
+ function with enum url_auth_mode, with added option to
+ completely remove user/pass auth information.
+ * src/http.c, ftp.c, url.c, recur.c: Adapted call to url_string
+ function to fit new usage.
+ * src/recur.c (retrieve_tree): Remove auth info from Referer header.
+
+2007-07-29 Micah Cowan <micah@cowan.name>
+
+ * NEWS: No more auth before challenge. No more auth info in
+ Referer. New --max-redirect option.
+
+2007-07-28 Micah Cowan <micah@cowan.name>
+
+ * src/options.h, init.c, retr.c, main.c: renamed opt maxredirect
+ field to max_redirect, for improved consistency.
+ * src/init.c: changed max_redirect parser from cmd_number_inf to
+ cmd_number, as infinite redirects may not be appropriate.
+ Alternatively, if cmd_number_inf should be used, then
+ opt.max_redirect's value should be checked a bit differently in
+ retr.c, to allow for the "infinite" meaning of zero.
+
+2007-07-28 Micah Cowan <micah@cowan.name>
+
+ * doc/wget.texi <HTTP Options>: Added --max-redirect option.
+
+2007-07-25 Micah Cowan <micah@cowan.name>
+
+ * tests/HTTPServer.pm (run, send_response): Farmed out some logic from
+ the run method into a separate one named send_response, which
+ was then modified to handle simple authentication testing.
+ (handle_auth): Added to handle simple authentication testing.
+ (verify_auth_basic): Checks to make sure Basic credentials are
+ valid.
+ (verify_auth_digest): Stub added; always fails test.
+ * tests/Makefile.in: Added Test-auth-basic.px to list of automatically
+ run tests.
+ * tests/Test-auth-basic: Simple basic authentication test; mainly just
+ lets the server do its testing. Its current purpose is just to
+ ensure that correct basic creds are sent, but never until a
+ challenge has been sent.
+
+2007-07-25 Micah Cowan <micah@cowan.name>
+
+ * src/http.c (create_authorization_line)
+ (basic_authentication_encode, known_authentication_scheme_p)
+ (load_cookies): Moved declarations up.
+ (basic_authed_hosts): Added. Tracks what hosts have issued Basic
+ challenge and been given the global username, password.
+ (maybe_send_basic_creds): Added. Sends Basic creds for hosts that
+ have issued Basic challenges.
+ (register_basic_auth_host): Added. Instantiates
+ basic_authed_hosts if necessary, then registers the host that
+ has issued a challenge.
+ (gethttp) <auth>: Only send authentication credentials after
+ we've received a challenge from that host. This is a stop-gap
+ fix until a proper fix can be implemented; still isn't quite
+ right, as we should only be sending credentials automatically
+ for authenticated paths and below, and not for the entire host.
+
+2007-07-16 Joshua David Williams <yurimxpxman@gmail.com>
+
+ * src/test.h: tests made more verbose; now displays the name
+ of each test run.
+
+2007-07-16 Joshua David Williams <yurimxpxman@gmail.com>
+
+ * src/options.h: added maxredirect to options struct
+ * src/init.c: added maxredirect to list of variables
+ * src/retr.c (retrieve_url): replaced MAX_REDIRECTIONS with opt.maxredirect
+ * src/main.c: added option --max-redirect
+
+2007-07-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test--no-content-disposition.px: Added new tests for validation of
+ HTTP Content-Disposition header support logic. In particular, these
+ tests check wget's behavior for every combination of -N/-O and -e
+ contentdisposition=on/off options.
+
+ * tests/Test--no-content-disposition-trivial.px: Ditto.
+
+ * tests/Test-N-HTTP-Content-Disposition.px: Ditto.
+
+ * tests/Test-N--no-content-disposition.px: Ditto.
+
+ * tests/Test-N--no-content-disposition-trivial.px: Ditto.
+
+ * tests/Test-O-HTTP-Content-Disposition.px: Ditto.
+
+ * tests/Test-O--no-content-disposition.px: Ditto.
+
+ * tests/Test-O--no-content-disposition-trivial.px: Ditto.
+
+2007-07-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Fixed the HTTP requests logic. Now it skips the
+ preliminary HEAD request if either -O or --no-content-disposition are
+ given, and neither --spider and -N are given.
+
+2007-07-09 Micah Cowan <micah@cowan.name>
+
+ * README, util/wget.spec: Removed references to wget.sunsite.dk.
+
+2007-07-05 Micah Cowan <micah@cowan.name>
+
+ * tests/Makefile.in:
+ Updated GPL reference to version 3 or later, removed FSF
+ address.
+
+2007-07-05 Micah Cowan <micah@cowan.name>
+
+ * src/cmpt.c, connect.c, connect.h, convert.c, convert.h:
+ * src/cookies.c, cookies.h, ftp-basic.c, ftp.c, ftp.h, ftp-ls.c:
+ * src/ftp-opie.c, gen-md5.c, gen-md5.h, getopt.c, getopt.h, gnu-md5.c:
+ * src/gnu-md5.h, gnutls.c, hash.c, hash.h, host.c, host.h:
+ * src/html-parse.c, html-parse.h, html-url.c, http.c, http.h:
+ * src/http-ntlm.c, http-ntlm.h, init.c, init.h, log.c, log.h, main.c:
+ * src/Makefile.in, mswindows.c, mswindows.h, netrc.c, netrc.h:
+ * src/openssl.c, options.h, progress.c, progress.h, ptimer.c:
+ * src/ptimer.h, recur.c, recur.h, res.c, res.h, retr.c, retr.h:
+ * src/safe-ctype.c, safe-ctype.h, spider.c, spider.h, ssl.h, sysdep.h:
+ * src/test.c, test.h, url.c, url.h, utils.c, utils.h, wget.h:
+ * src/xmalloc.c, xmalloc.h:
+ Updated GPL reference to version 3 or later, removed FSF
+ address.
+
+2007-07-05 Micah Cowan <micah@cowan.name>
+
+ * doc/fdl.texi:
+ Changed to match the version in gnulib.
+
+ * doc/Makefile.in:
+ * doc/texi2pod.pl:
+ * doc/texinfo.tex:
+ Updated GPL reference to version 3 or later, removed FSF
+ address.
+
+ * doc/wget.texi:
+ Slightly reworded the FDL license invocation. Replaced the
+ maintainer reference. Removed the GPL text from the manual.
+
+ * doc/gpl.texi:
+ Removed due to discontinuation of reference in Wget manual.
+
+2007-07-05 Micah Cowan <micah@cowan.name>
+
+ * AUTHORS:
+ Draw attention to previous maintainers.
+
+ * autogen.sh, config.guess, config.sub, configure.bat:
+ * configure.in, m4/wget.m4, Makefile.in, util/dist-wget:
+ * util/Makefile.in, util/rmold.pl:
+ Updated GPL reference to version 3 or later, removed FSF
+ address.
+
+ * README:
+ Updated reference to maintainer, and updated GPL reference to
+ version 3 or later.
+
+ * COPYING:
+ Replaced with verson 3.
+
+2007-07-04 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Skip HEAD request and start immediately with GET
+ if -O is given.
+
+2007-06-14 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/FTPServer.pm: Added FTP testing support.
+
+ * tests/FTPTest.pm: Ditto.
+
+ * tests/Test-ftp.px: Ditto.
+
+2007-02-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/netrc.c: Don't make netrc_list static, as it prevents
+ compilation with DEBUG_MALLOC.
+
+ * src/utils.c (aprintf): Don't use vasprintf when DEBUG_MALLOC is
+ requested because, in that case, we want the calls to malloc to be
+ coming from us.
+
+2007-02-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (print_server_response): Escape non-printable characters
+ in server respone.
+
+2007-01-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Check for ETA overflow.
+ (print_row_stats): Ditto.
+
+2007-01-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (parse_set_cookie): Would erroneously discard cookies
+ with unparsable expiry time.
+
+2007-01-09 Steven M. Schweda <sms@antinode.org>
+
+ * src/ftp-basic.c (ftp_syst): Fixed segfault if response text is missing.
+
+2007-01-09 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/init.c (cmd_spec_prefer_family): Small fix to get rid of a gcc
+ warning about strict-aliasing violation.
+
+2006-12-29 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c: Avoid a warning if 'ws_hangup()' is unused.
+
+2006-12-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (parse_content_disposition): Consider directory prefix, if
+ specified.
+
+2006-12-22 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPTest.pm: Don't ignore initial '/' character in requested URLs.
+
+2006-11-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (retrieve_from_file): Ditto.
+ (url_uses_proxy): New function.
+
+ * src/main.c (main): Don't check for opt.use_proxy when deciding
+ whether to call retrieve_url or retrieve_tree; check whether the
+ proxy would be used for *this* URL.
+
+2006-11-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test-np.px: Added test for -np.
+
+ * tests/HTTPTest.pm: Ignore initial '/' character in requested URLs.
+
+2006-10-17 Mike Grant <mggr@pml.ac.uk>
+
+ * src/ftp.c (ftp_loop_internal): Would incorrectly skip changing
+ working directory when retrying after a failed FTP attempt.
+ Originally reported by Nate Eldredge.
+
+2006-10-12 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test1.px: Renamed to Test-noop.px.
+
+ * tests/Test-noop.px: Ditto.
+
+ * tests/Test2.px: Renamed to Test-N.px.
+
+ * tests/Test-N.px: Ditto.
+
+ * tests/Test3.px: Renamed to Test-nonexisting-quiet.px.
+
+ * tests/Test-nonexisting-quiet.px: Ditto.
+
+ * tests/Test4.px: Renamed to Test-O-nonexisting.px.
+
+ * tests/Test-O-nonexisting.px: Ditto.
+
+ * tests/Test5.px: Renamed to Test-HTTP-Content-Disposition.px.
+
+ * tests/Test-HTTP-Content-Disposition.px: Ditto.
+
+ * tests/Test6.px: Renamed to Test-HTTP-Content-Disposition-1.px.
+
+ * tests/Test-HTTP-Content-Disposition-1.px: Ditto.
+
+ * tests/Test7.px: Renamed to Test-HTTP-Content-Disposition-2.px.
+
+ * tests/Test-HTTP-Content-Disposition-2.px: Ditto.
+
+ * tests/Test8.px: Replaced by Test--spider-r.px.
+
+ * tests/Test9.px: Renamed to Test-Restrict-Lowercase.px.
+
+ * tests/Test-Restrict-Lowercase.px: Ditto.
+
+ * tests/Test10.px: Renamed to Test-Restrict-Uppercase.px.
+
+ * tests/Test-Restrict-Uppercase.px: Ditto.
+
+ * tests/Test--spider.px: Added test for spider mode.
+
+ * tests/Test--spider-fail.px: Added failing test for spider mode.
+
+ * tests/Test--spider-r.px: Added test for recursive spider mode.
+
+ * tests/Test-c.px: Added test for --continue mode.
+
+ * tests/Test-c-full.px: Added test for --continue mode.
+
+ * tests/Test-c-partial.px: Added test for --continue mode.
+
+ * tests/Test-O.px: Added test for -O.
+
+ * tests/Test-N-current.px: Added test for -N.
+
+ * tests/Test-N-old.px: Added test for -N.
+
+ * tests/Test-E-k.px: Added test for -E -k.
+
+ * tests/Test-E-k-K.px: Added test for -E -k -K.
+
+2006-10-12 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/convert.c (downloaded_file): Fixed bug which used to break -E -k -K
+ mode.
+
+2006-08-28 Noèl Köthe <noel@debian.org>
+
+ * Makefile.in: Fixed a DESTDIR-related bug.
+
+2006-08-28 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: #include'd spider.h to get rid of compiler warnings.
+
+ * src/main.c: Ditto.
+
+ * src/recur.c: Ditto.
+
+2006-08-24 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/Makefile.in: Added spider.c to the list of files to compile and
+ spider.h to the list of header files. Updated copyright information.
+
+ * src/http.c: Major changes to recursive spider mode. Now for every
+ resource we are supposed to check, we send a HEAD request to find out
+ if it exists. If the resource is a HTML file, we retrieve it and parse
+ it to discover links to other resources.
+
+ * src/recur.c: Ditto.
+
+ * src/res.c (res_retrieve_file): Disable opt.timestamping and opt.spider
+ when retrieving robots.txt. Updated copyright information.
+
+ * src/convert.c: Moved code tracking broken links to spider.c.
+
+ * src/convert.h: Ditto.
+
+ * src/spider.c: Created new file to keep track of visited URLs in spider
+ mode.
+
+ * src/spider.h: Ditto.
+
+2006-08-21 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Fixed timestamping-related bug.
+
+2006-08-17 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Added support for Range header.
+
+2006-08-16 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Fixed bug which broke --continue feature. Now if -c is
+ given, http_loop sends a HEAD request to find out the destination
+ filename before resuming download.
+
+2006-08-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (datetime_str): Avoid code repetition with time_str.
+
+2006-07-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (commands): Correctly place "contentdisposition".
+
+2006-07-17 Daniel Richard G. <skunk@iSKUNK.ORG>
+
+ * Makefile.in: Added DESTDIR='$(DESTDIR)' to MAKEDEFS.
+
+2006-07-14 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test4.px: Fixed wrong expected behaviour.
+
+2006-07-14 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/sysdep.h: If intptr_t isn't defined, simply typedef it to long.
+
+ * src/http.c: Added explicit cast to int in logprintf call to remove
+ compiler warnings on 64-bit platforms.
+
+ * src/connect.c: Added a few casts to intptr_t to remove compiler warnings
+ on 64-bit platforms.
+
+ * src/main.c: Disable -r, -p and -N when -O is used. Disable -k when -O is
+ used and multiple URLs are given. Update maintainer information.
+
+ * src/all: Update copyright information.
+
+2006-07-14 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * configure.in: Check for intptr_t.
+
+2006-07-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Fixed rendering of --no-proxy description in the man
+ page. Added information about current maintainer.
+
+2006-07-10 KJKHyperion <hackbunny@reactos.com>
+
+ * src/url.c (filechr_table): Mark DEL (0x7f) as a control character
+ and | as a character Windows can't handle.
+
+2006-06-28 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/res.c: Implemented is_robots_txt_url function for detection of
+ robots.txt URLs and related test routine.
+
+ * src/res.h: Ditto.
+
+ * src/url.c: Implemented are_urls_equal function for URL comparison and
+ related testing routine.
+
+ * src/url.h: Ditto.
+
+ * src/convert.c: Fixes for recursive spider mode: don't consider
+ non-existing robots.txt as a broken link, and use are_urls_equal
+ instead of strcasecmp for referrer URLs comparison.
+
+ * src/test.c: Call tests routines for are_urls_equal and
+ is_robots_txt_url.
+
+2006-06-28 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Removed invariant status to the GPL and GFDL sections.
+ Changed UPDATED to Jun 2006. Updated copyright notice to include 2006.
+
+2006-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: We're no longer using strtoimax.
+
+2006-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (wgint): Typedef to any 64-bit (or larger) type we can
+ find, not necessarily off_t or long.
+
+2006-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (strtoll): Check for overflow and underflow without
+ relying on (technically) undefined behavior. Don't assume that
+ strtoll_type is 64 bits wide.
+
+2006-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Recursive Accept/Reject Options): Document
+ --ignore-case.
+
+2006-06-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Cast void pointer to char * before
+ doing arithmetic.
+
+2006-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Made TBL const.
+ (base64_decode): Made the base64_char_to_value table const.
+
+2006-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Add missing word.
+ Reported by Adrian Knoth.
+
+2006-06-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Would read past end of STR.
+ Reported by rick@eckle.org.
+
+2006-06-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Made the DATA pointer void * so the
+ callers can pass it any kind of pointer (including both signed and
+ unsigned char pointers).
+ (base64_decode): Ditto for DEST.
+
+2006-06-13 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test9.px: Added test for --restrict-file-names=lowercase option.
+
+ * tests/Test10.px: Added test for --restrict-file-names=uppercase option.
+
+2006-06-13 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/options.h (struct options): Introduced member restrict_files_case to
+ keep track of preferences on character case restrictions for
+ filenames.
+
+ * src/init.c: Modified defaults and cmd_spec_restrict_file_names to
+ support character case restrictions for filenames. Added
+ test_cmd_spec_restrict_file_names unit test.
+
+ * src/url.c: Modified append_uri_pathel to support character case
+ restrictions for filenames. Added test_append_uri_pathel unit test.
+
+ * src/test.c: Added test_cmd_spec_restrict_file_names and
+ test_append_uri_pathel to the list of unit tests to run.
+
+2006-06-12 Tony Lewis <tlewis@exelana.com>
+
+ * src/main.c: Improved CHEN Peng's patch by proposing a simpler logic.
+
+2006-06-12 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/retr.c (retrieve_from_file): Use retrieve_tree and automatically
+ turn on opt.follow_ftp in case of recursive FTP retrieval through HTTP
+ proxy.
+
+ * src/main.c: Automatically turn on opt.follow_ftp in case of recursive
+ FTP retrieval through HTTP proxy.
+
+2006-06-12 CHEN Peng <chenpeng@alumni.nus.edu.sg>
+
+ * src/main.c: Use retrieve_tree in case of recursive FTP retrieval through
+ HTTP proxy.
+
+2006-05-26 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Fixed bug when returning 404. Improved logging.
+
+ * tests/Test.pm: Added support for command lines which use an absolute path
+ for the Wget binary.
+
+2006-05-26 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Added synchronization between client and server
+ processes to prevent the test to start before the server is ready.
+
+ * tests/HTTPTest.pm: Ditto.
+
+ * tests/Test.pm: Ditto.
+
+ * tests/Test1.px: Removed unneeded ../src/ from command line.
+
+ * tests/Test2.px: Ditto.
+
+ * tests/Test3.px: Ditto.
+
+ * tests/Test4.px: Ditto.
+
+ * tests/Test5.px: Ditto.
+
+ * tests/Test6.px: Ditto.
+
+ * tests/Test7.px: Ditto.
+
+ * tests/Test8.px: Added test for recursive spider mode.
+
+2006-05-25 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/convert.c: Added mechanisms to keep track broken links.
+
+ * src/convert.h: Ditto.
+
+ * src/wget.h: Reordered and enumerated uerr_t constants.
+
+ * src/recur.c: Fixes to support recursive spider mode.
+
+ * src/http.c: Ditto.
+
+ * src/main.c: Print broken links in case of recursive spider mode.
+
+ * src/retr.c: Changed interface of retrieve_url.
+
+ * src/retr.h: Ditto.
+
+ * src/ftp.c: Changed interface of ftp_loop.
+
+ * src/ftp.h: Ditto.
+
+ * src/res.c: Minor change to reflect changes in interface of retrieve_url.
+
+2006-05-18 Lawrence Jones <lawrence.jones@ugs.com>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Correct size parsing, add size
+ and filename debugging output.
+
+2006-04-28 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/Test5.px: Added test for HTTP Content-Disposition support.
+
+ * tests/Test6.px: Ditto.
+
+ * tests/Test7.px: Ditto.
+
+2006-04-28 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: If Content-Disposition header is present, allow unique
+ filename generation unless -nc is given. Permit to disable parsing of
+ Content-Disposition header.
+
+ * src/options.h: Added option --no-content-disposition to disable parsing
+ of HTTP Content-Disposition header.
+
+ * src/init.c: Ditto.
+
+ * src/main.c: Ditto.
+
+2006-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Serve index.html if no filename is given.
+
+ * tests/Test.pm: Added support for pre-existing files.
+
+2006-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (TOLOWER): Wrap macro arg in parentheses.
+
+2006-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (parse_content_disposition): Doc fix.
+
+2006-03-15 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/utils.c: Restricted operational semantics of frontcmp and proclist
+ from generic strings to directory names and them to subdir_p and
+ dir_matches_p respectively. Applied George Ogata's one line patch to
+ restrict algorithm of subdir_p to full directory name matching. Added
+ testcases for subdir_p and dir_matches_p.
+
+ * src/utils.h: Changed all frontcmp occurrences to subdir_p.
+
+ * src/recur.c: Ditto.
+
+ * src/test.c: Changed type returned by test functions from char * to const
+ char *. Added test_subdir_p and test_dir_matches_p to the list of
+ tests to run.
+
+ * src/http.c (test_parse_content_disposition): Changed return type from
+ char * to const char *.
+
+2006-03-14 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/recur.c (struct queue_element): Changed type of html_allowed member
+ to bool.
+
+2006-03-09 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/ftp.c (ftp_list): Try `LIST -a' command first and revert to `LIST'
+ in case of failure.
+
+2006-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (TOLOWER): Fix definition when STANDALONE.
+ Reported by Beni Serfaty.
+
+2006-03-02 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c (http_loop): Fixed recursive HTTP retrieval.
+
+2006-02-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (find_last_char): Define in terms of memrchr.
+
+ * src/cmpt.c (memrchr): Define it on systems that don't have it.
+
+ * src/http.c (extract_param): New function for parsing header values
+ with parameters.
+ (parse_content_disposition): Use it. Don't allow slashes and
+ backslashes in the file name.
+
+2006-02-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (extract_param): Declare extern so it can be used from
+ other files.
+ (extract_param): Return error for empty name.
+
+2006-02-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for memrchr.
+
+2006-02-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (path_simplify): Don't preserve ".." at beginning of path.
+ Suggested by Frank McCown.
+
+2006-02-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Only use FILE.N.html if FILE.html exists.
+
+2006-02-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c (run_with_timeout): Made thread_hnd non-static.
+
+2006-02-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (sleep_between_retrievals): Sleep at a minimum of 1/2 of
+ the specified wait period.
+
+2006-02-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Document the modified meaning of
+ --random-wait.
+
+2006-02-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ (Download Options): Changed "a recent article" to "a 2001 article"
+ in the description of --random-wait, since the article in question
+ is not really recent.
+
+2006-02-03 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Fixed support for Content-Disposition header.
+
+ * src/test.c: Added test_parse_content_disposition to the list of unit
+ tests to run.
+
+2006-02-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (number_to_string): Don't use sprintf for printing
+ WGINT_MIN; simply divide n by 10 and defer printing the last
+ digit.
+ (number_to_string): Removed the SPRINTF_WGINT macro.
+
+2006-02-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c: Don't define countof if it's already defined.
+
+ * src/hash.c: Obtain the definition of uintptr_t when standalone.
+
+2006-01-30 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Changed output format. Removed excessively verbose debugging
+ output.
+
+2006-01-24 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Enhanced logging support.
+
+ * tests/HTTPTest.pm: Updated to new test format.
+
+ * tests/Test.pm: Improved test setup, verification and cleanup. Major
+ refactoring.
+
+ * tests/Test1.px: Updated to new test format.
+
+ * tests/Test2.px: Updated to new test format.
+
+ * tests/Test3.px: Added new test for quiet download of nonexistent URL.
+
+ * tests/Test4.px: Added new test for quiet download of nonexistent URL with
+ --output-document option.
+
+2005-12-07 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Fixed pre-download verbose output which was broken by
+ HTTP code refactoring.
+
+2005-12-05 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Refactored as a subclass of HTTP::Daemon.
+ Removed the old run method and renamed the old run_daemon
+ method to run. Added support for partial
+
+ * tests/Testing.pm: Renamed to HTTPTest.pm.
+
+ * tests/HTTPTest.pm: Refactored as a subclass of Test. Renamed
+ Run_HTTP_Test to run, verify_download to _verify_download
+ and added support for timestamp checking.
+
+ * tests/Test.pm: Added Test class as the super class of every
+ testcase.
+
+ * tests/test1: Renamed to Test1.px.
+
+ * tests/Test1.px: Refactored as an instance of the HTTPTest class.
+
+ * tests/Test2.px: Added -N HTTP test.
+
+2005-11-23 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/http.c: Refactored HTTP code. If -O is not used, the new code
+ delays the choice of the file name where the downloaded resource
+ will be saved until the HTTP headers have been retrieved.
+ Added support for Content-Disposition header.
+
+2005-11-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (INVALID_PTR): Use uintptr_t instead of unsigned long.
+ (hash_pointer): Don't assume a pointer fits in `unsigned long'.
+
+2005-11-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for uintptr_t.
+
+2005-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Document https_proxy.
+
+2005-11-02 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * tests/HTTPServer.pm: Added basic support for HTTP testing.
+
+ * tests/Testing.pm: Added basic support for feature testing (only HTTP
+ testing is supported at the moment).
+
+ * tests/test1: Added basic HTTP test.
+
+2005-11-02 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/Makefile.in: Removed support for unit testing (now it is in
+ tests/Makefile.in).
+
+2005-11-02 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * Makefile.in: Improved support for unit testing.
+
+ * configure.in: Ditto.
+
+2005-10-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/Makefile.in: Added basic support for unit testing.
+
+ * src/test.c: Ditto.
+
+ * src/test.h: Ditto.
+
+2005-10-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * Makefile.in: Added basic support for unit testing.
+
+2005-10-13 Daniel Stenberg <daniel@haxx.se>
+
+ * src/http-ntlm.c (ntlm_output): Fixed buffer overflow vulnerability.
+
+2005-10-09 Russ Allbery <rra@stanford.edu>
+
+ * src/snprintf.c: Remove round to round_int and pow10 to pow10_int, to
+ avoid warnings from GCC 4.0.
+
+2005-10-05 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/retr.c: Changed semantics of no_proxy_match.
+
+2005-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (retr_rate): Rename parameter from MSECS to SECS since it
+ no longer holds milliseconds.
+
+2005-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Don't print the summary if nothing has been downloaded.
+
+2005-09-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/sample.wgetrc: Rewrite the "passive FTP" paragraph to better
+ reflect reality.
+
+2005-09-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c: Introduce symbolic constants for "magic" values of
+ 0.2 and 0.9, REFRESH_INTERVAL and ETA_REFRESH_INTERVAL.
+
+2005-08-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (hash_table_map): Rename to hash_table_for_each and
+ update callers.
+ Document the meaning of the callback's return value.
+ (hash_table_iterate): New function.
+ (hash_table_iter_next): Likewise.
+ Update most places that used hash_table_for_each to use the
+ iteration, which doesn't require a temporary function with
+ explicit state management.
+
+2005-08-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (strtoll): Correctly handle strtoll("0x", ptr, 0) and
+ strtoll("0x<nonhexchar>", ptr, 0) -- in both cases *ptr must be
+ set to the position of 'x', not after it.
+
+2005-08-26 Stepan Kasal <kasal@ucw.cz>
+
+ * configure.in: Abort configure if --with-ssl given but SSL
+ unavailable. Use HAVE_LIBSSL and HAVE_LIBGNUTLS symbols provided
+ by AC_LIB_HAVE_LINKFLAGS instead of inventing new ones.
+
+2005-08-26 Jeremy Shapiro <jnshapiro@gmail.com>
+
+ * src/openssl.c (ssl_init): Set SSL_MODE_AUTO_RETRY.
+
+2005-08-26 Albert Chin <wget@mlists.thewrittenword.com>
+
+ * src/Makefile.in: Use @datadir@. Define localedir as $(datadir)/locale.
+
+2005-08-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (address_list_from_ipv4_addresses): Use IP_INADDR_DATA.
+
+2005-08-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: Renamed strtoll_return to strtoll_type.
+
+2005-08-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (eta_to_human_short): Switch to days when printing
+ more than 48h rather than 100h. (It's not immediately apparent
+ how many days there are in 83h.)
+
+2005-08-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (strtoll): Define it if missing on the system and if Wget
+ needs it.
+
+ * src/mswindows.c (str_to_int64): Move to cmpt.c and rename to strtoll.
+
+2005-08-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for strtoll and strtoimax.
+
+2005-08-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (print_address): Always use inet_ntop when IPv6 is
+ enabled.
+
+ * src/host.h (ip_address): Simplify the data union.
+
+2005-08-09 Vasil Dimov <vd@datamax.bg>
+
+ * src/ftp.c (getftp): Don't free RESPLINE if ftp_response returns a
+ status other than FTPOK.
+
+2005-08-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c (inet_ntop): Also handle IPv4 addresses for
+ completeness.
+
+2005-08-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't read more than the amount of data
+ specified by the content-length header.
+
+2005-08-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Wgetrc Commands): Removed documentation for the now
+ deleted command "kill_longer".
+
+2005-08-04 Giuseppe Bonacci <g.bonacci@libero.it>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Remember the position of the
+ previous token instead of backtracking back to it.
+
+2005-07-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (aprintf): Use vasprintf where available.
+
+2005-07-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (rewrite_shorthand_url): Simplify code using aprintf and
+ strspn.
+
+2005-07-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Remove -Wno-implicit from default GCC warning
+ flags.
+
+2005-07-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for symlink, which is expected to
+ exist. Check for asprintf.
+
+2005-07-08 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.h: Include process.h to get getpid() declaration.
+
+2005-07-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_check_certificate): Print custom error messages
+ for frequent X509 certificate problems.
+
+2005-07-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.h: Define an alias for stat and fstat, as requested by
+ config-compiler.h.
+ (gai_strerror): Define to windows_strerror if NEED_GAI_STRERROR is
+ defined.
+
+2005-07-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gnutls.c (ssl_check_certificate): Check for the validity of the
+ presented X509 certificate.
+
+2005-07-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.bat: Copy the common config.h and config-compiler.h.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c: Unconditionally include <setjmp.h>.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (fnmatch_nocase): New function.
+ (proclist): Use it instead of fnmatch when opt.ignore_case is
+ requested.
+ (in_acclist): Respect opt.ignore_case.
+ (frontcmp): Respect opt.ignore_case.
+
+ * src/options.h (struct options): New flag opt.ignore_case.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Add a full declaration of fnmatch.h.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: Measure time in seconds rather than milliseconds.
+ Adjusted all callers.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.h: Use strtoll where available.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): When freeing MESSAGE, take into account that
+ it can be NULL.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for setjmp.h.
+
+2005-07-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in: Also use @LIBGNUTLS@ to build LIBS.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (or): Define HAVE_SSL when either HAVE_OPENSSL or
+ HAVE_GNUTLS are defined.
+
+ * src/gnutls.c: New file.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't print the request write error message
+ twice.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (timegm): Remove unused variable.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (timegm): Handle years after 2099.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (timegm): Don't call mktime; simply count the seconds
+ between 1970-01-01 and the specified date.
+
+2005-07-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Add check for GnuTLS if --with-ssl=gnutls is used.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/xmalloc.c (debugging_free): Prefix hex pointer value with "0x"
+ when printing.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_decode): Don't silently tolerate non-base64
+ non-white-space characters in the base64 stream.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (NEXT_BASE64_CHAR): Rename to NEXT_CHAR and simplify to
+ get the next non-whitespace character.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (openssl_errstr): Separate error messages with "; ".
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (openssl_errstr): Instead of always using a large
+ static buffer, only allocate the error string when there is an
+ actual error.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (LAZY_RETRIEVE_INFO): Make last_tick unsigned to match
+ transport_map_modified_tick.
+
+2005-07-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h (alloca): Updated declaration to not enumerate all
+ Windows compilers.
+
+2005-07-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (path_end): Skip separators appropriate for the scheme.
+ (strpbrk_or_eos): Remove gcc-specific version, as the optimization
+ it tried to perform no longer applies.
+
+2005-07-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.h: Also wrap accept() and listen().
+
+2005-07-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Use fd_errstr.
+
+ * src/connect.c (fd_register_transport): Restructure parameters to
+ include only a single structure that describes transport
+ implementation.
+
+ * src/openssl.c (openssl_errstr): New function: dump SSL error strings
+ into a static buffer and return a pointer to the buffer.
+
+ * src/connect.c (fd_errstr): New function; returns transport-specific
+ error message, or strerror(errno) if transport doesn't supply one.
+
+2005-07-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/POTFILES.in: Include src/ptimer.c.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/version.c: Don't use "cvs" in version name, since we're not
+ using CVS anymore.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Would crash when parsing fragments. Support
+ fragments for FTP URLs too.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Ditto.
+
+ * src/retr.c (retr_rate): Display smaller rate numbers with greater
+ precision.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (response_head_terminator): Minor optimization.
+
+ * src/retr.c (fd_read_hunk): Call terminator with pointer to the start
+ of the data and the pointer to the current data. Changed all
+ callers.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Skip error message body in the keep-alive
+ case.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c: Remove extraneous definition of netdb.h.
+
+2005-07-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c: Don't include "connect.h" now that we no longer have
+ socket_has_inet6.
+
+2005-07-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Make sure u->params is not initialized for
+ http/https URLs.
+ (url_parse): Don't crash on garbage following []-delimited IPv6
+ addresses.
+
+2005-07-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Don't refer to the non-existent -nr in
+ description of --mirror.
+
+2005-07-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Mention in message that the "GNU" md5
+ implementation is in fact built-in to Wget.
+
+2005-06-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Explicitly document the different cases when
+ generating the Host header.
+
+2005-06-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (pretty_print_address): Renamed to just print_address.
+ Clarify documentation.
+
+2005-06-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (pretty_print_address): Handle error result from
+ inet_ntop.
+
+2005-06-30 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (inet_ntop): New function. Print IPv6 addresses
+ using WSAAddressToString.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: Remove obsolete definition of with_thousand_seps_sum.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c: Unconditionally include locale.h.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (random_number): Use lrand48 if available.
+ (random_float): Use drand48 if available.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: Include sys/time.h to get struct timeval.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c: Check for both SIGHUP and SIGUSR1 before using them.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (secs_to_human_time): Use print_decimal when printing
+ total download time in seconds.
+
+ * src/progress.c (print_row_stats): Use it to print total download
+ time at the end of the download.
+ (create_image): Ditto.
+
+ * src/utils.c (print_decimal): New function; print small decimal
+ numbers with more precision than large ones.
+
+ * src/progress.c (print_row_stats): New function. Print ETA after the
+ download rate at the end of each row.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gnu-md5.h: Unconditionally include limits.h.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * m4/wget.m4 (WGET_WITH_NLS): Don't check for locale.h.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Test for $LIBSSL instead of the old $ssl_success
+ when deciding which MD5 to use.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Require Autoconf 2.59.
+
+2005-06-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for drand48.
+
+2005-06-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (parse_line): Check for alphanumerics.
+
+2005-06-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Delete trailing newlines from LIST output so
+ lines don't come out with trailing \015\012 with -S.
+
+2005-06-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/(dot_create): Remove unnecessary casts.
+
+2005-06-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Logging and Input File Options): Don't claim that
+ --base requires --force-html to work.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (PTR_FORMAT): Cast the result of sizeof to int before
+ passing it to printf's %*.
+
+ * src/retr.h: Declare output_stream and output_stream_regular.
+
+ * src/ftp.h: Declare ftp_last_respline.
+
+ * src/convert.h: Declare dl_url_file_map.
+
+ * src/http.h: New file.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (with_thousand_seps): Handle negative numbers.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (human_readable): Remove intermediary cast to long; MSVC
+ has problems casting *unsigned* __int64 to double.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (get_grouping_data): Force the use of separators in C
+ locale.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (get_grouping_data): Force separator to "." rather than
+ " " when "," is taken.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Use the system-provided fnmatch by default.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (set_progress_implementation): Type COLON as const
+ char *.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (dot_update): Remove unused variable row_qty.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.h: Remove superfluous includes.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (i18n_initialize): Set all locale categories.
+
+ * src/http.c (http_atotm): Temporarily set locale to "C".
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (mktime_from_utc): Renamed to timegm and moved to cmpt.c.
+ Don't compile it if GNU timegm is available.
+ (http_atotm): Use timegm.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (http_atotm): Correctly query the old locale value.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Improve "POST data file missing" error
+ message.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c: Make cookies_now static.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h (alloca): Don't #define alloca under MinGW32,
+ which defines it in malloc.h, included from mswindows.h.
+
+2005-06-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h (alloca): Amend alloca declaration to take care of
+ all Win32 compilers, not just MSVC and MinGW.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (with_thousand_seps): Correctly implement thousand seps
+ consisting of more than one character.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Mark the "eta" string for translation.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (secs_to_human_time): Ditto.
+
+ * src/progress.c (create_image): Print more exact duration of very
+ short downloads.
+
+ * src/main.c (secs_to_human_time): Don't translate time suffixes "h",
+ "m", and "s", which are not strictly SI, but are "accepted for use
+ with SI".
+ (secs_to_human_time): Print really small intervals as 0s, not
+ 0.00s.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Print the downloaded and quota amounts with the
+ "human_readable" function.
+
+ * src/ftp.c (print_length): Ditto.
+
+ * src/http.c (gethttp): Don't display thousand separators.
+
+ * src/utils.c (with_thousand_seps): Rewritten to respect locale
+ settings and to be type size agnostic.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (get_urls_file): Don't explicitly set entry->next to
+ NULL since entry is already zeroed out.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Always invoke SIZE, not only when continuing a
+ download.
+
+ * src/main.c (main): Ditto here.
+
+ * src/progress.c (create_image): When the download is finished, print
+ how long it took.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h: Replace the alloca declaration with the one from
+ the latest Autoconf manual. This should remove a warning with GCC
+ on AIX.
+
+2005-06-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * m4/wget.m4: Use proper GPL header.
+
+2005-06-26 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.h: Define gai_strerror under MinGW.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (with_thousand_seps_sum): Now defined only if
+ SUM_SIZE_INT is double.
+
+ * src/wget.h (SUM_SIZE_INT): Instead of bothering with long, long
+ long, __int64, and friends, simply either use wgint or double, end
+ of story. Since we know how to print either, we no longer need
+ LARGE_INT_FMT.
+
+ * src/sysdeps.h (LARGE_INT): Renamed to SUM_SIZE_INT to better reflect
+ its intent, and moved to wget.h.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (with_thousand_seps_sum): Decrease buffer size so it
+ cannot overrun add_thousand_seps's buffer.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (human_readable): Divide with 1024 instead of shifting
+ so the operation can work with non-integer N.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (SPRINTF_WGINT): The correct format is %I64d, not just
+ %I64.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (eta_to_human): New logic for more human-readable
+ ETA.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (http_loop): Don't warn about wildcards in HTTP URLs if
+ globbing isn't requested in the first place.
+
+ * src/retr.c (retrieve_url): Temporarily turn off globbing when
+ processing HTTP->FTP redirects.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (parse_set_cookies): Cast pointer subtraction to int
+ before using it with %d; AIX compiler warns on this.
+ Reported by Jens Schleusener.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in: No need to clean .libs.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Update -4/-6 documentation to
+ reflect the fact that we no longer use AI_ADDRCONFIG.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in: No need to clean .libs.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in: Instead of creating configure.bat from
+ configure.bat.in, simply make sure the correct EOL style in
+ checked out of the repository.
+
+2005-06-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (DISTFILES): Don't split the sed invocation across
+ several lines, Solaris make passes the backslashes to sed literally.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: opt.verbose must be declared as int.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't prepend / here.
+
+ * src/cookies.c (cookie_handle_set_cookie): Prepend / to PATH.
+ (cookie_header): Ditto.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/gpl.texi (GNU General Public License): Split GPL text into a
+ separate file and include it from wget.texi. Used the latest
+ template from gnu.org with the updated address of the FSF.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Use AC_LIB_HAVE_LINKFLAGS instead of
+ AC_LIB_LINKFLAGS when checking for library functions.
+
+ * configure.in: Don't waste time checking for headers and
+ functions we know must be there. But manually AC_DEFINE the
+ functions that might be missing from non-Unix systems.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Move the large file check further up. Only check
+ for endianness if GNU md5 is used (it being the only file that
+ needs endianness information).
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Include m4/*.m4.
+
+ * aclocal.m4: Renamed to m4/wget.m4.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Enable the user to turn off SSL autodetection and
+ disable SSL using --without-ssl.
+
+ * Makefile.in ($(srcdir)/stamp-h.in): Remove the aclocal.m4
+ dependencies.
+
+2005-06-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't indent #include lines.
+
+2005-06-23 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * libtool.m4, ltmain.sh: Deleted.
+
+ * configure.in: Replaced ugly libtool-based check for OpenSSL libs
+ with a simpler config.rpath-based approach.
+
+ * Makefile.in, src/Makefile.in: Removed libtool support.
+
+ * m4/lib-link.m4, m4/lib-prefix.m4, m4/lib-ld.m4, config.rpath:
+ config.rpath macros taken from gettext 0.14.5.
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * util/dist-wget: Port to subversion.
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (read_file): Ditto.
+
+ * src/main.c (main): Use struct_fstat.
+
+ * src/mswindows.h (struct_fstat): Define a struct_fstat to deal with
+ the fact that Borland 5.5 has 64-bit stat, but not 64-bit fstat!
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Remove code that deals with Watcom.
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (strpbrk): Removed.
+ (mktime): Removed.
+ Include <time.h>.
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Contributors): Updated list of principal
+ contributors.
+
+2005-06-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for strpbrk and mktime.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Include the stdbool.h/_Bool/bool blurb from Autoconf.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c, connect.c, host.c: Replace instances of #ifdef
+ ENABLE_DEBUG if (opt.debug) {...} #endif with IF_DEBUG {...}.
+
+ * src/main.c: Rename the IF_DEBUG defined here to WHEN_DEBUG.
+
+ * src/wget.h (IF_DEBUG): New macro.
+ (DEBUGP): Define in terms of IF_DEBUG.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_lockable_boolean): Removed.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Only handle --set-cookies (and assert that
+ cookie jar exists) if opt.cookies is true. Failure to do so
+ triggered the assert when --no-cookies was used and the server
+ sent a Set-Cookie header. Ouch!
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (struct cookie): Use 1-bit bitfields for booleans
+ which makes the structure takes less space at no cost in
+ complexity.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (select_fd): Expect select() to exist.
+
+ * src/utils.c (xsleep): Always use select() as sleep fallback on
+ non-Windows platforms.
+
+ * src/ptimer.c: Delete the implementation of PTIMER_TIME.
+
+ * src/main.c: Assume existence of signal(), test for different signal
+ names instead.
+
+ * src/cmpt.c: Better document reasons why certain functions are
+ included.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/all: Use bool instead of int and false/true instead of 0/non-0
+ for boolean variables and values.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in: Remove the manually maintained dependency list;
+ make all object files depend on every header.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in ($(OBJ)): Add the config.h dependency.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Use the more standard authorship phrase "and others".
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Wgetrc Commands): Remove the "lockable boolean"
+ feature.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Overview): Remove explicit vertical spacing.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Mailing List): Remove reference to the wget-cvs list,
+ which no longer exists.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/texinfo.tex: Update with a non-prehistoric version.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/texi2pod.pl: Locate perl using the "env" program, so we don't
+ need to modify texi2pod.
+
+ * doc/Makefile.in (wget.pod): Work with texi2pod.pl directly instead
+ of generating it from texi2pod.pl.in.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for signal.h. Remove the
+ AC_HEADER_TIME check. Remove the test for ANSI C prototypes.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for C99 conformant stdbool.h.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Assume existence of gettimeofday and select.
+ gettimeofday exists on all platforms we care about (except for
+ Windows where Windows-specific functions are used instead), and
+ select exists virtually everywhere.
+
+ * configure.in: Assume existence of strerror, signal, strstr, and
+ memmove, which are all required by ANSI C.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * config.sub, config.guess: Updated from canonical location.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * autogen.sh: New file.
+
+ * Makefile.svn: Deleted, replaced with the even simpler (and more
+ standard) `autogen.sh' script.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * README.svn: Renamed to README.checkout. Edited to mention the
+ autogen.sh script.
+
+2005-06-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * MAILING-LIST: Remove reference to the obsolete `wget-cvs'
+ mailing list.
+
+2005-06-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.cvs: Renamed to Makefile.svn.
+
+ * README.cvs: Renamed to README.svn.
+
+2005-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c, ptimer.c, sysdep.h, utils.c: Use #elif to simplify reading of
+ chained if-else-else-else-... statements.
+
+2005-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c: Rename "mapping" to "cell" to avoid confusion with the
+ term "mapping" (or "map") sometimes being used for the entire hash
+ table. Also rename "non-empty" to "occupied" for easier reading
+ of if (!NON_EMPTY (...)) ... .
+
+2005-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/all: Return type of signal handlers is `void'. Include signal.h
+ unconditionally.
+
+ * src/all: Don't explicitly cast values returned by malloc. We no
+ longer support ancient compilers that don't declare malloc, and we
+ never supported C++ builds.
+
+2005-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/ansi2knr.1: Removed.
+
+2005-06-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for the return type of signal
+ handlers; C89 requires it to be void.
+
+2005-06-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_lockable_boolean): Don't recognize literal "2" and
+ "-1" values; unlike 0 and 1, those should never be exposed to the
+ user. Update the error message to be more self-consistent, as
+ proposed by Benno Schulenberg.
+
+2005-06-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/all: Don't declare errno. Include both time.h and sys/time.h,
+ as long as sys/time.h exists. Don't dereference function pointers
+ when invoking the functions they point to.
+
+ * src/cmpt.c (memmove): Remove function mandated by C89.
+ (strerror): Ditto.
+ (strstr): Ditto.
+
+ * src/all: Undo the K&R-ization changes from 2005-05-03.
+
+ * src/all: Remove support for K&R compilers: use C89 function
+ declarations, remove definition of PARAMS, remove support for
+ varargs, and remove ansi2knr. Assume the presence of time.h,
+ string.h, and other headers mandated by C89.
+
+2005-06-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4: Remove support for K&R compilers.
+
+2005-06-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): When -E is in use, check for file existence
+ after appending ".html" to the name and modify the file name if
+ necessary.
+
+2005-06-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't free "head" before using it to save
+ headers.
+
+2005-06-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (socket_has_inet6): Removed.
+
+ * src/host.c (lookup_host): Don't use the AI_ADDRCONFIG getaddrinfo
+ hint.
+
+2005-06-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_lockable_boolean): Improve the error message so it
+ lists the more useful values first.
+
+2005-06-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Logging and Input File Options): It's --no-verbose,
+ not --non-verbose.
+
+2005-06-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Also report the system error when the POST
+ data file is missing.
+
+2005-06-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.h (ip_address): Remove the trailing comma from the type
+ enum in the no-IPv6 case.
+
+ * src/main.c (struct cmdline_option): Remove the trailing comma from
+ the enum.
+
+ Reported by Jens Schleusener.
+
+2005-06-15 Benno Schulenberg <benno@nietvergeten.nl>
+
+ * src/ftp.c, http.c, connect.c, cookies.c, html-url.c, init.c, res.c:
+ Gettext-ize messages that were previously missed.
+
+2005-06-06 Keith Moore <keithmo@exmsft.com>
+
+ * doc/Makefile.in: Fix a harmless (but annoying) installation warning.
+
+2005-05-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (strpbrk_or_eos): Check for a recent GCC version before
+ using the statement-as-expression extension.
+
+2005-05-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_spec_header): Don't split the string along the
+ commas using cmd_vector; just append the new value using
+ vec_append instead.
+
+ * src/utils.c (vec_append): New function.
+
+2005-05-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't attempt to "skip short body" if we're
+ issuing a HEAD request (in which case the response head is not
+ followed by a body).
+
+2005-05-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Removed statement that redirect in
+ response to POST is "technically disallowed", which I cannot find
+ in rfc2616 nor in rfc1945. Even if that were technically the
+ case, the widespreadedness of such responses would make the
+ prohibition irrelevant.
+
+2005-05-27 Andreas Beckmann <debian@abeckmann.de>
+
+ * src/html-url.c (tag_handle_link): Mark the content from the <link
+ src="..."> tag as expecting HTML.
+
+2005-05-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (http_atotm): Document the origin of the "cookie date"
+ format.
+
+2005-05-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (setval_internal): Report exact command name alongside
+ the "display name".
+
+2005-05-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (update_cookie_field): Explicitly cast -1 to time_t to
+ cope with systems where time_t is unsigned.
+
+ * src/cookies.c: Remove unnecessary casts to time_t from values
+ already of that type.
+
+2005-05-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (ftp_loop_internal): Same here.
+
+ * src/http.c (http_loop): Don't clobber the file when -c is specified
+ and the first attempt to retrieve the file fails.
+
+2005-05-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_check_certificate): Print all issues with a
+ certificate.
+
+2005-05-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cleanup): Don't free the non-existent opt.ftp_acc. Free
+ the SSL-related stuff.
+
+2005-05-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (print_length): Consistently print \n at end of the
+ "Length" line.
+
+2005-05-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c: Don't xfree() the line returned by ftp_response if
+ the returned code is not FTPOK.
+
+2005-05-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_connect): Announce the beginning and the end of
+ the SSL handshake when in debug mode.
+
+ * src/wget.h (PTR_FORMAT): New macro for easier printing of pointer
+ values. Use %0*lx along with PTR_FORMAT instead of %p.
+
+2005-05-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Would forget to close the connection when
+ keep_alive was not used.
+
+2005-05-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Overview): Document --[no-]proxy as primarily being
+ used to turn *off* the use of proxies.
+
+2005-05-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (pattern_match): Document the code that decides
+ whether "*" matches ".".
+
+2005-05-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (rewrite_shorthand_url): Don't rewrite "https://host" to
+ "ftp://https//host" when SSL is not used.
+
+2005-05-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-ls.c (ftp_index): Use %d to print the port number, which is
+ now int.
+ From Steven M. Schweda's VMS patches.
+
+2005-05-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_init): Always use SSL_VERIFY_NONE, so that the
+ handshake finishes even if the certificate is invalid. That way
+ ssl_check_server_identity can provide better diagnostics on why
+ the verification failed.
+
+2005-05-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_check_server_identity): Renamed to
+ ssl_check_certificate because it does more than just checking the
+ server's identity.
+ (ssl_check_certificate): Tell the user about
+ --no-check-certificate.
+
+2005-05-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (pattern_match): New function.
+ (ssl_check_server_identity): Treat peer certificate common name as
+ wildcard.
+
+2005-05-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTPS (SSL/TLS) Options): Explain certificate
+ checking in more detail.
+
+2005-05-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/res.c (res_register_specs): Correctly pass pointers to
+ hash_table_get_pair.
+
+2005-05-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_check_server_identity): Print certificate subject
+ and issuer.
+
+2005-05-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Call ssl_check_server_identity.
+
+ * src/openssl.c (ssl_check_server_identity): New function, verifies
+ that the host name in the certificate matches the actual host
+ name.
+ (verify_cert_callback): Removed, since it didn't do anything
+ except returning the preverify_ok argument.
+
+ * src/connect.c (fd_transport_context): Allow retrieval of the context
+ pointer registered with fd_register_transport.
+
+2005-05-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Test for OpenSSL includes we actually need.
+
+2005-05-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (verify_cert_callback): Renamed from verify_callback.
+ Always return the received "ok" value. Print the X509 name in
+ debug mode.
+ (ssl_init): Enable partial writes in SSL context.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/netrc.c (parse_netrc): Explicitly check for assignment != NULL
+ to silence warning from Borland C.
+
+ * src/url.c (sync_path): Don't unnecessarily increment p.
+ (url_parse): Don't unnecessarily set url_encode to NULL just
+ prior to return from the function.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.c (escnonprint_internal): Place variable declarations
+ before other statements.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (run_command): Correctly interpret the return value of
+ parse_line.
+ (commands): Re-alphabetize.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (http_loop): Check for wildcards in the URL path
+ component, not in the whole URL.
+
+ * src/ftp.c (ftp_loop): Check for wildcards in URL path before
+ unescaping, so the users can escape globbing metacharacters with %
+ escapes.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c: Include recur.h.
+
+ * src/http.c (request_new): Define as accepting no args.
+
+2005-05-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/texi2pod.pl.in: Allow an "EXAMPLES" section.
+
+2005-05-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (strpbrk_or_eos): Made inline. Use strchr(s, '\0') for
+ finding the NUL char position.
+
+2005-05-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (decide_copy_method): Renamed to char_needs_escaping.
+ Since it now returns only two possible values, change it to return
+ boolean (int).
+
+2005-05-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (decide_copy_method): Never cause reencode_escapes to
+ decode % escapes; it is too intrusive and breaks some servers.
+
+2005-05-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): When tunnelling SSL traffic over proxy with
+ CONNECT, we're really talking to the remote server directly.
+ Because of this, the request-line argument must be the URL path
+ rather than the whole URL, as it would be when using regular
+ proxies.
+ Reported by Charles Lane.
+
+2005-05-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c (ftp_request): Prevent newlines in VALUE causing
+ inadvertent sending of multiple FTP commands.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Fix wording of --secure-protocol help text.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_spec_useragent): Allow empty User-Agent.
+
+ * src/http.c (gethttp): Don't print "unknown authentication scheme"
+ for failed Basic authentication.
+ (SET_USER_AGENT): Don't set user-agent if opt.useragent is empty.
+ (gethttp): Use alloca for allocation of www_authenticate.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (strstr): Updated from glibc 2.3.5.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Document empty user-agent.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Explain that the read timeout
+ really refers to idle timeout.
+ (Download Options): Mention that decimal and subsecond values may
+ be used for timeouts.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Set MAKEINFO to "true" so build doesn't fail for
+ users without either makeinfo or the pre-packaged info files.
+
+2005-05-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in ($(srcdir)/stamp-h.in): Don't print the line with
+ the comment about running autoheader.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (touch): Set access time to current time.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_unescape): Don't unescape %00, it effectively
+ truncates the string.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (limit_bandwidth_reset): Reset sleep_adjust.
+ (limit_bandwidth): Don't allow huge "adjustment" values that
+ result from being suspended for a while.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Propagate option name to setoptval.
+
+ * src/init.c (setoptval): Accept another argument, OPTNAME. Propagate
+ that argument as the option name independently of the actual
+ command, determined by command_by_name(com).
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.c (copy_and_escape): Slightly reduce code repetition between
+ the two loops.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.c (copy_and_escape): Replace the FOR_URI argument with a
+ slightly more general mechanism for specifying different kinds of
+ escape.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (parse_line): Make the return value indicate whether
+ there was a syntax error or a setter failed.
+ (run_wgetrc): Return an indication on whether an error has been
+ encountered.
+ (initialize): Abort if there have been errors running either
+ .wgetrc file.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (http_atotm): Zero out the whole struct tm being passed
+ to strptime.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c (ftp_response): Fix printing FTP server response.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: We're using GFDL 1.2, not 1.1.
+
+2005-05-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Contributors): Updated.
+
+2005-05-05 Charles C.Fu <ccwf@bacchus.com>
+
+ * src/utils.c (proclist): Strip leading slash when calling fnmatch
+ too, otherwise wildcard comparisons always fail.
+
+2005-05-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: If gettext was found but libtintl.h wasn't, declare
+ gettext's return type to avoid type mismatches.
+
+2005-05-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Rename label `error' to avoid conflict with
+ identifier.
+
+ * src/retr.c (fd_read_body): Rename label `out' to avoid conflict with
+ identifier.
+ (fd_read_hunk): Use explicit double constant.
+ (retrieve_from_file): Don't use string concatenation.
+ (sleep_between_retrievals): Make sure xsleep is called with a
+ `double' argument.
+ (no_proxy_match): Define as static, like it is declared.
+
+ * src/progress.c (bar_create): Use 0.0 instead of 0 because K&R
+ compilers can't automatically promote it.
+
+ * src/http-ntlm.c (ntlm_output): Replace \xHH sequences with \OOO for
+ the sake of old compilers.
+
+ * src/ftp.c (ftp_loop_internal): Don't use string concatenation.
+
+ * src/http.c (request_send): Use explicit double constants when
+ calling fd_read and fd_write.
+ (post_file): Ditto.
+ (gethttp): Ditto.
+ (skip_short_body): Ditto.
+
+ * src/ftp-basic.c: When calling fd_write, specify the last argument as
+ a `double' constant for the sake of K&R compilers which don't see
+ the prototype and therefore can't promote it to double
+ automatically.
+
+ * src/cookies.c (cookie_jar_load): Rename abort label to abort_cookie
+ to avoid name conflict in K&R compilers.
+
+2005-05-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * INSTALL: Document environment variables affecting configure,
+ especially $CC.
+
+ * INSTALL: Mention that make install requires root.
+
+2005-04-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (posix_init): Since we allow _POSIX_MONOTONIC_CLOCK==0,
+ it is not enough to check for _POSIX_MONOTONIC_CLOCK-0, we must
+ also check for defined(_POSIX_MONOTONIC_CLOCK).
+
+2005-04-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't set ipv6 to yes only because struct
+ sockaddr_in6 was found. Stop the rest of the IPv6 checks when one
+ check fails. Abort if IPv6 was explicitly requested, but not
+ found.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.top.bor: Use MAKEDIR for make clean too.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.src.bor: Don't suppress unreachable code
+ warning.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.src.bor: Don't delete executables other than
+ wget.exe. Delete various auxilliary files created by the Borland
+ build process.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (commands): Wrap the use of opt.random_file in #ifdef
+ HAVE_SSL.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Correctly set the user agent.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c, hash.c, connect.c, host.c, http.c: Remove unreached code,
+ such as "break" following return or abort.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * NEWS: Advertise new-style syntax for --no-dns-cache instead
+ of --dns-cache=off.
+
+2005-04-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * INSTALL: Mention --disable-ntlm.
+
+2005-04-28 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/wget.dep: Rename gen_sslfunc.c to openssl.c.
+
+2005-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/main.c: Map --ftp-password, --http-password and --proxy-password to
+ the new ftppassword, httppassword and proxypassword commands
+ respectively. Document the --user and --password options in the help
+ string.
+
+2005-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/ftp.c: Add support for --user and --password.
+
+ * src/http.c: Add support for --user and --password.
+
+ * src/init.c: Deprecated ftppasswd, httppasswd, login, passwd and
+ proxypasswd commands. Added ftppassword, ftpuser, httppassword,
+ password, proxypassword and user commands.
+
+ * src/main.c: Renamed --ftp-passwd to --ftp-password. Added --ftp-user,
+ --http-password, --password, --proxy-password and --user. Deprecated
+ --http-passwd and --proxy-passwd. Added documentation for new options
+ and removed documentation for deprecated options in the help string.
+
+ * src/options.h (struct options): Added user and passwd members to handle
+ --user and --password respectively. Renamed ftp_acc and ftp_pass
+ members to ftp_user and ftp_passwd for consistency.
+
+2005-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Fixed a broken reference to Security Considerations
+ section in tex-generated documents (like the man page).
+
+2005-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Document --user, --password, --ftp-user and the
+ corresponding Wgetrc command. Renamed --ftp-passwd to --ftp-password,
+ --http-passwd to --http-passwd and --proxy-passwd to proxy_password.
+ Renamed ftp_passwd to ftp_password, http_passwd to http_passwd and
+ proxy_passwd to proxy_password. Removed documentation for the
+ deprecated login command.
+
+2005-04-27 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * NEWS: Mention the new --ftp-user, --ftp-password, --user and
+ --password options, the name changes for --http-passwd and
+ --proxy-passwd and the deprecation of login and passwd commands.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (ssl_init): Ditto.
+
+ * src/options.h (struct options): Allow separate specification of key
+ type and certificate type.
+
+ * src/init.c (cmd_spec_cert_type): Provide a "der" synonym for "asn1"
+ certificate encoding.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c (init_prng): Disable the weak random seed by default.
+
+ * src/http.c (gethttp): Simplify SSL initialization; disable SSL when
+ anything goes wrong with the initialization.
+
+ * src/options.h (struct options): New option opt.random_file.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Advertise "DER", not "ASN1".
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: Wrap private key commands in IF_SSL.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_spec_useragent): Free the old value of
+ opt.useragent before setting the new one.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Improve wording of command descriptions.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Document the new form of SSL/TLS options.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTPS (SSL/TLS) Options): Document --random-file.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Mention --keep-session-cookies when
+ documenting --post-data.
+
+2005-04-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Fix bind address cindex entry that
+ broke concept index generation.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/openssl.c: Renamed "gen_sslfunc.c" to "openssl.c" and
+ "gen_sslfunc.h" to "openssl.h". This reflects the intent of
+ openssl.c encapsulating the OpenSSL-specific code.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: Renamed "closure" (a synonym for context in some
+ cultures) to "place", which more accurately reflects the usage.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Call skip_short_body only if keep_alive is in
+ use.
+ (gethttp): Send the User-Agent header with the CONNECT request as
+ well.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gen_sslfunc.c (ssl_init): Use default locations for loading the
+ certificate bundles.
+ (ssl_init_prng): Disable the cryptographically weak PRNG
+ initialization fallback.
+
+ * src/init.c: Renamed SSL command-line arguments and wgetrc commands.
+ (defaults): Check the server certificate by default.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (cookie_handle_set_cookie): Delete the part of the
+ path after the trailing slash.
+
+ * src/http.c (gethttp): Call cookie_handle_set_cookie with path that
+ begins with '/'.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Option Syntax): Document boolean options. Include
+ the option syntax in the man page.
+ (Directory Options): Removed stray text after --protocol-directories.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Improved entry on
+ --keep-session-cookies.
+
+2005-04-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Directory Options): Removed stray text after
+ --protocol-directories.
+
+2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (option_data): Removed support for the undocumented flag
+ --use-proxy.
+
+2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (option_data): Don't treat -Y as a boolean switch; treat
+ it as a value switch instead, so "-Y off" continues to work.
+
+2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Document --retry-connrefused.
+
+2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Advanced Usage): Don't advertise the non-existent
+ `-s' option.
+
+2005-04-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/Makefile.in (wget.info): Depend on version.texi as well.
+
+ * doc/wget.texi: Simplify copyright. Replace remaining instances of
+ --OPTION=off with --no-OPTION.
+
+2005-04-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (aprintf): Delete unreachable statement.
+
+2005-04-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (cmp_prefer_ipv4): New function.
+ (cmp_prefer_ipv6): New function.
+ (lookup_host): Use the appropriate comparator according to
+ opt.prefer_family.
+
+ * src/init.c: New option prefer_family.
+
+ * src/host.c (is_valid_ipv6_address): Spell NS_* constants in lower
+ case to avoid clash with system headers.
+ (lookup_host): Reorder the addresses so that IPv4 ones come first.
+
+ * src/utils.c (stable_sort): New function.
+
+2005-04-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (retryable_socket_connect_error): Return 0 for
+ ENETUNREACH and EHOSTUNREACH.
+
+2005-04-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Don't claim that -6 accepts mapped
+ IPv4 addresses.
+
+2005-04-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Document --prefer-family.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Treat input as unsigned chars.
+ Required for correct encoding of binary stuff.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http-ntlm.c: Format the function definitions in an
+ ansi2knr-friendly fashion.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c: Reenable the memmove implementation for systems that
+ lack it.
+
+ * src/http.c (gethttp): Store the "authorized" state of the persistent
+ connection.
+ (request_remove_header): New function.
+ (gethttp): Don't send the "Basic" authentication if the connection
+ is already authorized.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Documented the SSL command-line options.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Wgetrc Commands): Document ftp_passwd.
+ (FTP Options): Document --ftp-passwd.
+
+2005-04-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/texi2pod.pl.in: First process @@ then @}, so @samp{-wget@@} is
+ interpreted correctly.
+
+2005-04-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Handle multiple WWW-Authentication headers,
+ only one of which is recognized. Those are sent by IIS with NTLM
+ authorization.
+ (create_authorization_line): Propagate information whether
+ authorization is finished.
+ (gethttp): Only stop authorization when it's really finished, not
+ after fixed two steps.
+
+2005-04-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/eo.po: Added Esperanto translation.
+
+2005-04-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Print the EGD option outside the cluster of
+ SSL options.
+
+2005-04-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http-ntlm.c (ntlm_output): Fix setting the domain.
+ Suggested by Sami Krank.
+
+2005-04-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gen_sslfunc.c (ssl_init): Fix warning message text; mark the
+ message as translatable.
+
+2005-04-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/vi.po: Added Vietnamese translation.
+
+2005-04-20 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/connect.c: Set IPV6_V6ONLY socket option when -6 switch is used.
+
+2005-04-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Document behavior of -6 wrt mapped IPv4 addresses.
+
+2005-04-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Document IPv6 related options.
+
+2005-04-20 FUJISHIMA Satsuki <sf@FreeBSD.org>
+
+ * src/http.c (request_set_header): Fix the check whether a new header
+ needs to be allocated.
+
+2005-04-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (base64_encode): Use the parameter order that makes more
+ sense. Return the length of the base64 written. Updated all
+ callers.
+
+2005-04-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Update mailing list information.
+
+2005-04-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Don't claim that --no-dns-cache is
+ necessary for dyndns servers -- it's not.
+
+2005-04-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * MACHINES: Removed.
+
+2005-04-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/snprintf.c (fmtstr): Declare VALUE as const char *.
+ Based on patch by Russ Allbery.
+
+2005-04-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/snprintf.c (fmtfp): More correct handling of significant digit
+ count with %g -- 0.002 has one significant digit, not three.
+
+2005-04-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (request_set_header): Free NAME when VALUE is NULL and
+ freeing the header name is requested.
+
+2005-04-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/snprintf.c: Use the PARAMS macro to handle prototypes. Write
+ function definitions in the ansi2knr-friendly way.
+ (fmtstr): If string precision is specified, don't read VALUE past
+ it.
+ (dopr): Actually print %g and %e formats.
+ (fmtfp): Fix a bug that caused 0.01 to be printed as 0.1.
+ (fmtfp): Use LLONG in floating point conversions to be able to
+ convert more digits.
+ (fmtfp): Interpret precision as number of significant digits with
+ %g.
+ (fmtfp): Omit trailing decimal zeros with %g.
+
+ * src/snprintf.c: Don't include <ctype.h> because none of it is used.
+ Include strings.h/string.h, as per Autoconf.
+
+2005-04-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Respect read timeout with non-interactive
+ or no progress gauge -- treat ETIMEDOUT specially only when
+ progress_interactive.
+ Reported by FUJISHIMA Satsuki.
+
+2005-04-16 FUJISHIMA Satsuki <sf@FreeBSD.org>
+
+ * src/http.c (gethttp): Don't use HTTP/1.0 persistent connections over
+ proxy.
+
+2005-04-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: Use _POSIX_TIMERS - 0 > 0, which handles the case when
+ _POSIX_TIMERS is defined but empty, as well as the case when it is
+ undefined. Do the same with the check for _POSIX_MONOTONIC_CLOCK.
+ Suggested by Larry Jones.
+
+2005-04-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: Check that _POSIX_TIMERS is defined as well as > 0.
+ Problem reported by Steven M. Schweda.
+
+2005-04-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (skip_short_body): Print the skipped body data in debug
+ mode.
+ (skip_short_body): Don't skip more than 4k of body data.
+ (skip_short_body): Return whether the skipping was successful.
+ (gethttp): If skip_short_body failed, invalidate the connection.
+
+2005-04-12 Gisle Vanem <giva@bgnett.no>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Open the output file in binary mode.
+
+2005-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/xmalloc.c (register_ptr): Warn the user to increase SZ prior to
+ aborting.
+
+2005-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c: Conditionalize including config.h on HAVE_CONFIG_H
+ instead of on STANDALONE.
+
+2005-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gen_sslfunc.c (ssl_print_errors): Made static.
+ (ssl_print_errors): Eliminate potentially dangerous fixed-size
+ error buffer. Passing NULL to ERR_error_string causes it to use
+ its own static buffer, which is fine for our purposes.
+
+ * src/gen_sslfunc.c: Include gen_sslfunc.h. Make the declarations of
+ ssl_init and ssl_conect match the actual definitions.
+ (ssl_connect): Simply return a boolean, the SSL context is no
+ longer useful as a return value.
+
+ * src/retr.c: Don't include SSL headers; we don't need them.
+
+2005-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/convert.c (convert_cleanup): Free converted_files.
+
+2005-04-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h: Don't define _VA_LIST under Solaris; it breaks
+ compilation with GCC 3.4 under Solaris 10. (It was defined to
+ avoid a warning with previous versions of GCC.)
+
+2005-04-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (DEBUGP): Use __builtin_expect to give a hint to GCC that
+ opt.debug is false in the vast majority of cases.
+
+2005-04-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h: Declare alloca as void *, not char *.
+
+2005-04-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c: Use "static const" in preference to "const static".
+ Sun's cc warns that "storage class after type is obsolescent".
+
+ * src/url.c (urlchr_table): Don't mark ~ as unsafe, too many broken
+ web sites are confused when ~ is changed to %7E. Their servers
+ redirect /%7Efoo/ to /~foo/, which Wget again accesses using %7E,
+ causing further redirections, therefore looping infinitely. See
+ Debian bug #301624 for an example.
+
+2005-04-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/recur.c (download_child_p): When -p is used, (temporarily)
+ ignore accept/reject rules for HTMLs, even when they are at the
+ maximum recursion depth. That is because with -p we are, if
+ necessary, overstepping the max. depth to get the requisites.
+
+2005-04-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http-ntlm.c (ntlm_output): Use "char", not "unsigned char" for
+ ntlmbuf. Our base64 functions accept char anyway.
+ (ntlm_output): Join up the format string, since we nominally
+ support K&R compilers.
+ (ntlm_output): Ditto.
+
+2005-04-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/alloca.c: Include wget.h to be able to use xmalloc. In addition
+ to defining malloc to xmalloc, also define free to xfree.
+
+2005-04-08 Larry Jones <lawrence.jones@ugsplm.com>
+
+ * doc/Makefile.in (wget.info): Don't use $< in an explicit rule.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.src: Compile ptimer.c and http-ntlm.c.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: Use Windows timers under Cygwin, whose POSIX timer
+ implementation is incomplete.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (struct ptimer): Remove the unused initialized field.
+
+ * src/ptimer.c: Renamed function parameters from WT (which used to
+ stand for wget_timer or wtimer) to PT.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (ptimer_init): In fact, _POSIX_MONOTONIC_CLOCK needs to
+ be >= 0.
+
+ * src/ptimer.c (ptimer_init): Check whether _POSIX_MONOTONIC_CLOCK is
+ defined instead of whether it's greater than 0. glibc defines it
+ to 0, but still makes it available via sysconf.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (ptimer_init): Explicitly check that
+ _POSIX_MONOTONIC_CLOCK is *both* defined and >=0. (Undefined
+ symbols are >=0.)
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (ptimer_diff): Fix typo affecting Windows build.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c (posix_init): Be smarter about choosing clocks. In
+ decreasing order of preference, use CLOCK_MONOTONIC,
+ CLOCK_HIGHRES, and CLOCK_REALTIME.
+ (ptimer_allocate): Removed.
+
+ * src/ptimer.c: Refactor the code by cleanly separating the
+ architecture-dependent code from the architecture-independent
+ code.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c (str_to_int64): Rename OVERFLOW and UNDERFLOW to
+ INT64_OVERFLOW and INT64_UNDERFLOW, since those names are used.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: When checking for OpenSSL headers, check for all
+ the ones that Wget is using.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Use it.
+
+ * aclocal.m4 (WGET_POSIX_CLOCK): Check whether -lrt is needed to
+ use POSIX clock functions like clock_gettime.
+
+2005-04-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in ($(srcdir)/stamp-h.in): Don't attempt to run
+ autoheader automatically; it breaks things with fresh CVS builds.
+
+2005-04-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ptimer.c: New file. Move the "wtimer" functions from utils.c to
+ this file and rename them to ptimer_.
+
+2005-04-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (NO_ADDRESS): Define NO_ADDRESS only after the system
+ headers have been included.
+
+2005-04-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (pconn): Include NTLM data, which is per-connection.
+ (known_authentication_scheme_p): Recognize NTLM authorization.
+ (create_authorization_line): Call ntlm_input and ntlm_output.
+
+ * src/http-ntlm.c: New file, donated by Daniel Stenberg and originally
+ written for curl, heavily modified for Wget.
+
+ * src/utils.c (base64_encode): Relocated from http.c, since it is now
+ used by http-ntlm.c, and will possibly be used elsewhere.
+ (base64_decode): New function, originally based on code from GNU
+ recode.
+
+2005-04-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Allow the user to disable NTLM authorization.
+ Make sure NTLM is disabled if OpenSSL is unavailable. If NTLM is
+ *explicitly* requested and OpenSSL is unavailable, abort.
+
+ * configure.in: Renamed USE_* to ENABLE_*.
+
+2005-04-05 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/Makefile.in: removed string_t.c from list of source files.
+
+2005-04-04 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/string_t.c: Removed.
+
+ * src/string_t.h: Removed.
+
+2005-04-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (rewrite_shorthand_url): Only accept recognized schemes.
+ That way "foo:80" will correctly be rewritten to "http://foo:80"
+ instead of left unchanged and ultimately rejected because of
+ "unsupported scheme foo".
+
+2005-04-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (ftp_loop): Ditto.
+
+ * src/ftp-basic.c (ftp_pasv): Use the xzero shorthand for memset(0).
+ (ftp_lpsv): Ditto.
+
+2005-03-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (number_to_string): Avoid explicit 64-bit constants;
+ construct them by multiplication at compile-time.
+
+ * src/utils.c, elsewhere: Don't append "L" to 32-bit integer
+ constants; we aren't really compilable on 16-bit systems anyway.
+
+ * src/hash.c (prime_size): Remove primes larger than 2^31, but include
+ 2^31-1, which is prime.
+
+2005-03-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (string_set_to_array): New function.
+
+ * src/convert.c: Replace the use of "slists" with sets/hash-tables,
+ which in fact suit the intended purpose much better.
+ downloaded_html_list is removed altogether.
+
+2005-03-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (numdigit): More correct handling of negative numbers.
+
+2005-03-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.h (enum): Rename GLOBALL, GETALL, and GETONE to
+ GLOB_GLOBALL, GLOB_GETALL, and GLOB_GETONE to avoid conflict with
+ Linux headers.
+
+2005-03-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/POTFILES.in: Removed headers.c and rbuf.c.
+
+2005-03-22 Joseph Caretto <jcaretto@pitt.edu>
+
+ * doc/texi2pod.pl.in: Handle asis again. It used to work (see the
+ 2001-12-11 entry), but the local change was lost in the upgrade
+ to 1.4.
+
+2005-03-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Print the human-readable size.
+
+ * src/ftp.c (getftp): Print the human-readable size of the file to be
+ downloaded.
+
+ * src/utils.c (human_readable): New function.
+
+ * src/utils.c: Renamed "legible" to "with_thousand_seps",
+ "legible_large_int" to "with_thousand_seps_large", and "legible_1"
+ to "add_thousand_seps".
+
+2005-03-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Inhibit persistent connections when talking to
+ proxies, as mandated by RFC 2068.
+
+2005-03-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (unescape_single_char): New function.
+ (url_escape_dir): Use it to unescape slashes in directory
+ components.
+ (url_string): Escape unsafe chars in host name, except for the ':'
+ charaters, which can appear in IPv6 addresses.
+
+ * src/main.c (main): Don't access the cookie jar directly.
+
+ * src/log.c (escnonprint_internal): Correctly calculate the needed
+ string size. Don't forget the buffer's new size after having
+ reallocated it.
+ (log_cleanup): New function. Free the escnonprint ring data.
+
+ * src/init.c (cleanup): Don't free the cookie jar explicitly, it is
+ now done by http_cleanup.
+ (cleanup): opt.user_headers is now a vector, free it with
+ free_vec.
+
+ * src/http.c (gethttp): Make sure to free the request data, the status
+ message, and the response data before returning from the function.
+ (save_cookies): New function.
+ (http_cleanup): Free the cookie jar here.
+
+ * src/hash.c: Renamed string_hash to hash_string and ptrhash to
+ hash_pointer. Exported hash_pointer.
+
+ * src/xmalloc.c: Organized malloc_table (previously malloc_debug) as a
+ simple EQ hash table. register_ptr and unregister_ptr are now of
+ O(1) complexity.
+
+ * src/xmalloc.c: Renamed "*_debug" to debugging_* and "*_real" to
+ checking_*.
+
+2005-03-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_file): Use concat_strings.
+
+ * src/http.c (basic_authentication_encode): Use concat_strings.
+
+ * src/ftp-ls.c (ftp_index): Use concat_strings.
+
+ * src/ftp-basic.c (ftp_request): Use concat_strings.
+
+ * src/utils.c (concat_strings): New function.
+
+2005-03-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c (ftp_login): Don't free the string if ftp_response
+ returned an error status because the line didn't get allocated in
+ the first place.
+
+2005-03-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Undo the 2004-11-18 change. Instead,
+ always be "exact".
+
+2005-03-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (read_http_response_head): Limit the response size to 64k
+ bytes.
+
+ * src/retr.c (fd_read_hunk): Accept a MAXSIZE argument that limits the
+ number of bytes the function is allowed to allocate.
+ (fd_read_line): Limit the line to 4096 bytes.
+
+2005-03-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: Include options.h after wgint has been defined.
+
+ * src/options.h (struct options): Declare options processed with
+ cmd_bytes as wgint, not long.
+
+2005-03-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (debug_test_md5): Moved to gen-md5.c.
+
+ * src/mswindows.h: Don't declare inet_ntop, since we don't use it.
+
+ * src/mswindows.h: For consistency, also wrap closesocket, it being
+ a Winsock call.
+
+ * src/mswindows.h: Don't declare sleep and usleep; we're defining
+ xsleep now.
+
+ * src/mswindows.h (mkdir): Don't special-case Borland C, _mkdir
+ works there as well.
+
+ * src/host.c: Don't include winsock header files; the correct ones
+ are already included by mswindows.h.
+
+ * src/mswindows.c (xsleep): Round toward the nearest millisecond
+ in an attempt to avoid average short sleeps.
+
+ * src/utils.c (wtimer_granularity): Report correct values for
+ Windows timers and for high-resolution timers.
+
+ * src/utils.c (wtimer_initialize_once): New function, called to
+ initialize the timer frequency.
+
+ * src/utils.c: Replace the use of GetSystemTime with high-resolution
+ counters under Windows. When high-resolution counters are
+ unavailable, use GetTickCount().
+
+2005-03-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (simple_atof): Handle negative numbers; skip whitespace
+ before the number.
+ (simple_atoi): Ditto. Also, check for overflow and underflow.
+ (cmd_number): Bail out on negative numbers.
+ (parse_bytes_helper): Ditto.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.src.bor: Reenable warnings under Borland C,
+ disabling only specific warnings. Generate Pentium Pro code by
+ default.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (read_file): Don't use wgint for file size; LFS won't
+ work since the file is mmap'ed as a whole.
+
+ * src/options.h: Don't include stdio.h.
+
+ * src/log.c: Ditto.
+
+ * src/init.c: Disambiguate assignment from non-zero test to avoid
+ Borland C warning.
+
+ * src/http.c (response_new): Don't needlessly post-increment count.
+
+ * src/hash.c: Include stdio.h.
+
+ * src/gnu-md5.h: Don't include stdio.h.
+
+ * src/getopt.h (struct option): Always use const.
+
+ * src/ftp.c (getftp): Avoid unnecessary assignment to RES to avoid
+ Borland C warning.
+
+ * src/ftp-ls.c: Disambiguate assignment from non-zero test to avoid
+ Borland C warning.
+
+ * src/cmpt.c (strptime_internal): Don't initialize rp_backup when
+ !_NL_CURRENT to avoid Borland C warning.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (fopen_excl): Fix parse error when O_BINARY is
+ available.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Reject port numbers larger than 65535. We
+ also check for overflow while parsing port numbers.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c: Provide wrappers to Winsock functions that set
+ errno to WSAGetLastError() in case of failure. Also provide a
+ Windows-specific version of strerror.
+
+ * src/mswindows.h: Wrap calls to socket, bind, connect, recv, send,
+ select, getsockname, getpeername, and setsockopt.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (defaults): Use passive FTP by default.
+
+2005-03-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Handle multiple Set-Cookie headers sent by
+ remote server.
+
+2005-03-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_file_name): Don't allow hosts named ".." to be
+ appended as path elements.
+
+2005-03-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (retrieve_url): Escape location header.
+
+ * src/http.c (print_server_response_1): Escape server response when
+ printing it.
+ (gethttp): Escape host name, status message, location header, and
+ content type.
+ (http_loop): Escape error message from server.
+
+ * src/host.c (lookup_host): Escape host name when printing it.
+
+ * src/ftp.c (getftp): Escape user name when printing it.
+ (getftp): Escape remote file and directory for printing.
+ (getftp): Escape server listing when printing it.
+ (ftp_retrieve_list): Escape link name and file name.
+ (ftp_retrieve_glob): Escape file name.
+
+ * src/ftp-basic.c (ftp_response): Escape server response when printing
+ it.
+
+ * src/cookies.c (parse_set_cookies): Escape the cookie field when
+ printing it.
+ (parse_set_cookies): Escape contents of remote header.
+ (cookie_handle_set_cookie): Escape host name and cookie domain.
+
+ * src/connect.c (connect_to_ip): Escape the host name.
+
+ * src/log.c (escnonprint): New function, used for printing strings
+ coming from the server that possibly contain non-ASCII characters.
+ (escnonprint_uri): Ditto.
+
+2005-02-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c: Use the nnnI64 syntax for __int64 constants under all
+ Windows compilers.
+ (SPRINTF_WGINT): Use "%I64" under all Windows compilers.
+
+ * src/mswindows.h (WGINT_MAX): Use the nnnI64 syntax for
+ __int64 constants under all Windows compilers.
+ (struct_stat): Use `struct stati64' under Borland C.
+ (fstat): Don't redefine to _fstati64 under Borland.
+
+ * src/mswindows.c: Define str_to_int64 under Borland C as well as
+ under (older) Visual C.
+
+2005-02-26 Gisle Vanem <giva@bgnett.no>
+
+ * src/utils.c: Use the nnnLL syntax under GCC. Define struct_stat to
+ struct _stati64 under __MINGW32__ as well as under MS VC.
+
+2005-02-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Initialize err to suppress compiler warning.
+
+2005-02-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c (wget_ftello): Removed.
+
+ * src/mswindows.h: Remove bogus definition of stat.
+ (wget_ftello): Remove the leftover ftello replacement.
+
+2005-02-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Test for AI_ADDRCONFIG directly, instead
+ of checking for HAVE_GETADDRINFO_AI_ADDRCONFIG.
+
+2005-02-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): When we're not supposed to overwrite files,
+ use fopen_excl to open the file and recompute the file name.
+
+ * src/log.c (redirect_output): Use unique_create to avoid a race
+ condition.
+
+ * src/mswindows.c (fake_fork_child): Use unique_create.
+
+ * src/utils.c (fopen_excl): New function that opens a stdio stream
+ with the O_EXCL flag (where available).
+ (unique_create): New function, like unique_name, but also creating
+ the file and returning a file pointer.
+ (fork_to_background): Use unique_create to create the file
+ immediately to avoid race condition with multiple instances of
+ wget -b.
+
+2005-02-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (ftp_expected_bytes): Fix bug that caused infloop because
+ of not correctly skipping the '(' character.
+
+2005-02-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (is_valid_ipv6_address): Move here from url.c.
+ (lookup_host): If the address is numeric, don't print the
+ "resolving..." line, don't set up DNS timeouts, and set the
+ AI_NUMERICHOST hint, where available.
+
+2005-02-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/mswindows.c (wget_ftello): Wget's replacement for ftello.
+
+ * src/utils.c (file_size): Use ftello where available.
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Use str_to_wgint to parse the file
+ size.
+ (ftp_parse_winnt_ls): Ditto.
+
+ * src/ftp-basic.c (ftp_size): Use str_to_wgint to convert number to
+ wgint; pass 10 instead of 0 as the BASE argument.
+
+ * src/ftp.c (ftp_expected_bytes): Use str_to_wgint to parse the file
+ size.
+
+ * src/sysdep.h (LARGE_INT_FMT): Use __int64 as LARGE_INT on
+ MSVC/Windows; print it with "%I64".
+
+ * src/wget.h: Define a `wgint' type, normally aliased to (the possibly
+ 64-bit variant of) off_t.
+
+ * src/all: Use `wgint' instead of `long' for numeric variables that
+ can hold file sizes.
+
+ * src/utils.c (number_to_string): Support printing of `wgint'
+ argument.
+ (number_to_static_string): New function.
+
+ * src/all: Replace printf("%ld", long_value) with printf("%s",
+ number_to_static_string(wgint_value)).
+
+2005-02-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for LFS. Determine SIZEOF_OFF_T.
+ Check for ftello.
+
+2005-02-18 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/main.c: Added the --ftp-passwd command line option.
+
+ * src/init.c: Renamed command passwd to ftppasswd.
+
+2005-02-18 Marco Colombo <m.colombo@ed.ac.uk>
+
+ * po/it.po: Updated Italian translation.
+
+2005-02-11 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/string_t.c: Fixed a bug in do_escape and triggered escape of
+ backslashes in string_escape to avoid ambiguities in the result
+ string.
+
+2005-02-11 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Added Simone Piunno as new contributor.
+
+2005-02-10 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/string.h: Renamed to string_t.h to fix a compilation conflict
+ with the string.h header in the standard C library.
+
+ * src/string.c: Renamed to string_t.c for consistency with string.h.
+
+ * src/string_t.c: Ditto.
+
+ * src/string_t.h: Ditto.
+
+2005-01-01 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * doc/wget.texi: Updated copyright information, added new contributors.
+
+2004-12-31 Mauro Tortonesi <mauro@ferrara.linux.it>
+
+ * src/string.c: New file.
+
+ * src/string.h: New file.
+
+ * src/Makefile.in: Added string.c to the list of modules to compile.
+
+ * src/main.c: Updated copyright.
+
+2004-11-20 Hans-Andreas Engel <engel@node.ch>
+
+ * doc/wget.texi: Describe limitations of combining `-O' with `-k'.
+
+2004-11-18 Ulf Harnhammar <ulf.harnhammar.9485@student.uu.se>
+
+ * src/ftp-ls.c: Fixed a problem in ftp_parse_winnt_ls that could allow a
+ malicious remote FTP server to crash wget.
+
+2004-11-18 Mauro Tortonesi <mauro@deepspace6.net>
+
+ * src/connect.c: Minor correction to the comment in front of fd_peek.
+
+2004-11-18 Leonid Petrov <nouser@lpetrov.net>
+
+ * src/retr.c: Fix a timeout problem in fd_read_body when using http_proxy.
+
+2004-11-18 Hans-Andreas Engel <engel@node.ch>
+
+ * src/http.c: Enable --convert-links (-k) when a single page is downloaded
+ via --output-document (-O).
+
+2004-11-15 YAMAZAKI Makoto <Yamazaki.Makoto@fujixerox.co.jp>
+
+ * src/netrc.c: Fix termination by assertion bug in netrc parsing.
+
+2004-06-12 Larry Jones <lawrence.jones@ugsplm.com>
+
+ * src/recur.c (download_child_p): Correct the logic in check number 6:
+ test opt.reclevel (not DEPTH) against INFINITE_RECURSION.
+
+2004-05-13 Nico R. <n-roeser@gmx.net>
+
+ * doc/Makefile.in: Allow building in a separate tree with source tree
+ write-protected.
+
+2004-05-09 David Fritz <zeroxdf@att.net>
+
+ * windows/Makefile.src.bor: Fix broken build rule. Add clean target.
+
+ * windows/Makefile.top.bor: Use tabs instead of spaces. Ignore
+ errors in clean rules. Use lowercase filenames when building
+ distribution .zip archive.
+
+ * windows/config.h.bor: Don't define HAVE_UINT32_T.
+
+ * windows/Makefile.doc: Fix remaining instance of build rules
+ indented with spaces instead of tabs.
+
+ * windows/Makefile.src: Update copyright year.
+
+ * windows/Makefile.top: Update copyright year.
+
+ * windows/config.h.mingw (WGET_USE_STDARG, HAVE_SIG_ATOMIC_T): Define.
+
+ * windows/config.h.ms (HAVE_STRPBRK, HAVE_LIMITS_H)
+ (HAVE_LOCALE_H): Define.
+
+ * windows/Makefile.watcom: Add /I. to CFLAGS. Remove reference to
+ specific Wget version from linker flags. Add missing
+ dependencies.
+
+2004-05-09 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (fake_fork): Pass entire command line to the child
+ process.
+
+2004-03-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Fix typo: SCHEME_SSL -> SCHEME_HTTPS.
+
+2004-03-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Send the Proxy-Authorization header over
+ non-SSL connections too.
+
+2004-03-25 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (fake_fork_child): Ignore error code when
+ OpenFileMapping() fails; assume it failed because the object does
+ not exist.
+
+2004-03-24 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (fake_fork): New function.
+
+ * src/mswindows.c (fork_to_background): Use it.
+
+2004-03-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Decode %HH sequences in host name.
+
+2004-03-19 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (ws_hangup): Incorporate old fork_to_background()
+ code. Add event name argument.
+ (fork_to_backgorund): Now a simple wrapper around ws_hangup().
+ (ws_handler): Correctly handle the case when neither CTRLC_BACKGND
+ nor CTRLBREAK_BACKGND are defined. Don't bother handling close,
+ logoff, or shutdown events. Call ws_hangup() with the correct
+ event name; don't assume it was CTRL+Break.
+
+2004-03-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/convert.c (local_quote_string): Quote "#" as "%23" and "%" as
+ "%25" when creating links to local files.
+
+2004-03-04 Gisle Vanem <giva@bgnett.no>
+
+ * src/retr.c (fd_read_body): Don't change console title if quiet.
+
+2004-03-02 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (ws_percenttitle): Guard against future changes by
+ doing nothing if the proper variables have not been initialized.
+ Clamp percentage value.
+
+2004-02-25 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.c (set_sleep_mode): Remove argument and return value.
+ Call GetModuleHandle() instead of LoadLibrary()/FreeLibrary() for
+ kernel32.dll. Use typedef for function-pointer. Don't cast
+ l-value. Don't use dereference operator when calling through
+ function-pointer.
+ (ws_startup): Update call to set_sleep_mode().
+ (ws_cleanup): Remove call to set_sleep_mode().
+
+2004-02-23 David Fritz <zeroxdf@att.net>
+
+ * src/mswindows.h: Ditto.
+
+ * src/mswindows.c: Misc. formatting/comment tweaks throughout.
+
+2004-02-23 David Fritz <zeroxdf@att.net>
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (ftp_loop_internal): Update call to ws_changetitle().
+
+ * src/main.c (main): Don't bother calling ws_changetitle().
+
+ * src/mswindows.h (ws_changetitle): Update prototype.
+
+ * src/mswindows.c (ws_changetitle): Remove second argument. Use
+ xfree_null().
+ (ws_percenttitle): Only update title when percentage has changed.
+
+2004-02-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Contributors): Updated.
+
+2004-02-20 David Fritz <zeroxdf@att.net>
+
+ * src/main.c (print_help): Remove call to ws_help().
+
+ * src/mswindows.c (ws_help): Remove.
+
+ * src/mswindows.h (ws_help): Remove.
+
+2004-02-16 David Fritz <zeroxdf@att.net>
+
+ * src/init.c (home_dir): Use aprintf() instead of xmalloc()/sprintf().
+ Under Windows, if $HOME is not defined, use the directory that
+ contains the Wget binary instead of hard-coded `C:\'.
+ (wgetrc_file_name): Under Windows, look for $HOME/.wgetrc then, if
+ not found, look for wget.ini in the directory of the Wget binary.
+
+ * src/mswindows.c (ws_mypath): Employ slightly more robust methodology.
+ Strip trailing path separator.
+
+2004-02-12 Jens Roesner <jens.roesner@gmx.de>
+
+ * doc/wget.texi (Wgetrc Commands): Document `-e' here.
+
+2004-02-09 David Fritz <zeroxdf@att.net>
+
+ * configure.bat.in: Don't clear the screen.
+
+ * windows/README: Add introductory paragraph. Re-word a few
+ sentences. Correct minor typographical errors. Use consistent
+ capitalization of Wget, SSL, and OpenSSL. Refer to Microsoft
+ Visual C++ as MSVC instead of VC++. Mention the --msvc option to
+ configure.bat. Reflow paragraphs.
+
+ * windows/Makefile.top: Use tabs instead of spaces. Ignore errors
+ in clean rules. Use lowercase filenames when building distribution
+ .zip archive.
+
+ * windows/Makefile.doc: Use tabs instead of spaces. Ignore errors
+ in clean rules.
+
+ * windows/Makefile.src: Clean-up clean rules. Use tabs instead of
+ spaces. Link against gdi32.lib. Don't define SYSTEM_WGETRC.
+ Remove unused macros. Remove anachronistic and superfluous linker
+ flags. Don't rename wget.exe to all upper-case. Add
+ `preprocessor' conditionals for SSL and newer MSVC options. Use
+ batch rules. Don't suppress all warnings.
+
+2004-02-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Security Considerations): Put @item contents on a
+ separate line.
+ Reported by Ted Rodriguez-Bell.
+
+2004-02-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Respect --ignore-length.
+ (gethttp): Inhibit keep-alive if --ignore-length is specified.
+
+2004-02-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (sockaddr_set_data): Zero out
+ sockaddr_in/sockaddr_in6. Apparently BSD-derived stacks need this
+ when binding a socket to local address.
+
+2004-02-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Wgetrc Commands): Document --no-http-keep-alive and
+ the corresponding Wgetrc command.
+
+2004-02-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c: Make the file compilable outside Wget source tree when
+ -DSTANDALONE is used.
+
+2004-01-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (determine_screen_width): Return 0 if not running on
+ Windows or on a TIOCGWINSZ-capable system.
+
+2004-01-28 David Fritz <zeroxdf@att.net>
+
+ * src/utils.c (determine_screen_width): Correctly determine console
+ width under Windows.
+
+2004-01-28 Christian Biere <christianbiere@gmx.de>
+
+ * src/progress.c (bar_set_params): Fixed syntax error when HAVE_ISATTY
+ was undefined.
+
+ * src/ftp.c (ftp_loop_internal): Allocate a larger buffer in case
+ "try" gets translated to something large. Ditto in http_loop in
+ http.c.
+
+ * src/http.c (response_header_copy): Don't write to buf[BUFSIZE].
+
+ * src/ftp-opie.c (skey_response): Eliminate unnecessary string
+ concatenation; just call gen_md5_update twice.
+
+2004-01-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (xsleep): Don't call usleep with values larger than
+ 1,000,000.
+
+2003-12-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Fix generation of `Content-Length'.
+
+2003-12-15 Gisle Vanem <giva@bgnett.no>
+
+ * src/url.c (url_skip_credentials): Fixed return value; 'url' if no
+ credentials.
+
+2003-12-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_skip_credentials): Return a pointer directly.
+
+2003-12-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_file_name): Ditto.
+ (parse_errors): Ditto.
+
+ * src/retr.c (retr_rate): Ditto.
+
+ * src/progress.c (create_image): Ditto.
+
+ * src/netrc.c (parse_netrc): Ditto.
+
+ * src/main.c (struct cmdline_option): Ditto.
+ (redirect_output_signal): Ditto.
+
+ * src/init.c (commands): Ditto.
+
+ * src/ftp-ls.c (ftp_index): Ditto.
+
+ * src/cookies.c (check_domain_match): Declare the pointer to a literal
+ string as `const'.
+
+2003-12-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Pass total size to progress_create, not
+ the remaining amount.
+
+2003-12-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Don't fiddle with "interactive timeout"
+ if read timeout is unset.
+
+2003-12-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (bind_local): Don't set the IPV6_V6ONLY option on the
+ socket.
+
+2003-12-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_file_name): Respect the setting of
+ opt.protocol_directories.
+
+ * src/main.c (main): Only check for ret=='?' when longindex is unset.
+ (option_data): New option --protocol-directories.
+
+2003-12-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Correctly calculate bandwidth as total data
+ read divided with download time.
+
+ * src/retr.c (fd_read_body): Separate the return values for data
+ written and read.
+
+2003-12-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Document the new option `--protocol-directories'.
+
+2003-12-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Don't incorrectly claim that `-O'
+ sets the number of retries to 1.
+
+2003-12-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (H_REDIRECTED): Respect the HTTP/1.1 "303 See Other"
+ response code.
+ Suggested by Dan Razzell.
+
+2003-11-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Sanitize arguments and document them
+ better. Make sure the timer is created and updated only if
+ necessary. Updated callers.
+
+2003-11-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (fd_read_body): Report the amount of data *written* as
+ amount_read. This is not entirely logical, but that's what the
+ callers expect, and it's not easy to change.
+
+ * src/ftp.c (ftp_loop_internal): Ditto.
+
+ * src/http.c (http_loop): Be smarter about assigning restval; if we're
+ in the nth pass of a download, simply use the information we have
+ about how much data has been retrieved as restval.
+
+ * src/ftp.c (getftp): Ditto for FTP "REST" command.
+
+ * src/http.c (gethttp): When the server doesn't respect range, skip
+ the first RESTVAL bytes of the read body. Never truncate the
+ output file.
+
+ * src/retr.c (fd_read_body): Support skipping initial STARTPOS octets.
+
+2003-11-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (skip_short_body): Renamed skip_body to skip_short_body;
+ don't bother calling fd_read_body.
+
+2003-11-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (skip_body): New function.
+ (gethttp): Use it to skip the body of the responses we don't care
+ to download. That allows us to reuse the connection.
+ (gethttp): Trust that the HEAD requests will not generate body
+ data.
+
+ * src/retr.c (fd_read_body): Don't write to OUT if it's NULL.
+
+2003-11-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Initialize SSL only the first time when SSL
+ URL is downloaded.
+
+2003-11-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (cookie_header): Only generate the contents of the
+ header, not the leading "Cookie: " or the trailing "\r\n".
+
+ * src/http.c (gethttp): When adding headers specified with `--header',
+ allow them to override the headers generated by Wget.
+
+ * src/init.c (cmd_spec_header): Made opt.user_headers a vector.
+
+ * src/http.c (request_new): New function. Returns a request structure
+ which can be modified in various ways, most notably by adding HTTP
+ headers to the request.
+ (request_set_header): New function for adding the header to the
+ request. If the header is already available, it gets replaced.
+ (request_send): Construct and send the request.
+ (gethttp): Use the request_* functions to generate the request.
+
+2003-11-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: Don't #include netinet/Winsock stuff.
+
+2003-11-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c: Deleted the old functions header_process,
+ header_extract_number, header_exists, header_strdup,
+ http_process_range, http_process_none, http_process_type, and
+ http_process_connection.
+
+ * src/http.c (response_new): New function.
+ (response_header_bounds): Ditto.
+ (response_header_copy): Ditto.
+ (response_header_strdup): Ditto.
+ (response_status): Ditto.
+ (gethttp): Use the new response_* functions to parse the response.
+ Support HTTP/0.9 responses.
+
+2003-11-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Use the CONNECT handle to establish SSL
+ passthrough through non-SSL proxies.
+
+2003-11-28 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Don't include the Proxy-Authorization header
+ in the request tunneled through proxy.
+
+2003-11-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Don't calculate ETA if nothing has
+ been downloaded yet, because it causes division by zero.
+
+2003-11-27 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (bind_local): Rename sa_len to addrlen because IRIX
+ headers define sa_len as a macro.
+
+2003-11-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-parse.c (convert_and_copy): Remove embedded newlines when
+ AP_TRIM_BLANKS is specified.
+
+2003-11-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c: Set con->csock to -1 where rbuf_uninitialize was
+ previously used.
+
+2003-11-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in (http$o): Added the trailing backslash that was
+ missing.
+
+2003-11-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4: Don't check for AI_V4MAPPED and for AI_ALL, since
+ Wget doesn't need them.
+
+ * configure.in: Check for struct sockaddr_storage.
+
+2003-11-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/rbuf.c: Removed.
+
+ * src/ftp-basic.c (ftp_response): Use fd_read_line. No longer use
+ struct rbuf. Updated all callers.
+
+ * src/http.c (gethttp): Use fd_read_head to read all the headers in
+ one go.
+ (next_header): New function.
+
+ * src/retr.c (fd_read_line): New function: reads a line from FD,
+ leaving the rest of the data unread.
+ (fd_read_head): New function.
+
+ * src/connect.c (fd_peek): New function, implements peeking.
+ (poll_internal): New function.
+ (fd_read): Use it.
+ (fd_write): Ditto.
+ (fd_peek): Ditto.
+ (fd_register_transport): Allow registering a "peeker" callback.
+
+2003-11-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/headers.c: Removed. The file is no longer relevant, now that no
+ special handling of headers is done by the rbuf code. Moved
+ portions to http.c.
+
+2003-11-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c: Renamed xread/xwrite/xclose to
+ fd_read/fd_write/fd_close. The "x" prefix is not appropriate
+ because the semantics have diverged from read/write/close too
+ significantly. Updated all callers.
+
+2003-11-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (sock_write): It's not necessary to initialize RES.
+
+2003-11-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Don't reference opt.ipv4_only and opt.ipv6_only
+ if IPv6 is disabled.
+
+2003-11-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (socket_has_inet6): Only compile it if IPv6 is enabled
+ and AI_ADDRCONFIG is missing.
+
+2003-11-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (address_list_contains): Renamed address_list_find to
+ address_list_contains because its result is boolean.
+
+2003-11-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gen_sslfunc.c (ssl_init_prng): Warn the user when using a weak
+ random seed.
+
+2003-11-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (select_fd): Return 1 if select is not available.
+
+2003-11-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Fix alignment of FTP options output.
+
+2003-11-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Check for the ability to create IPv6
+ sockets here.
+
+ * src/init.c (defaults): Don't auto-set --inet4-only on IPv6-less
+ systems.
+
+2003-11-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (connect_to_host): Don't reference address list after
+ releasing it.
+
+2003-11-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Fix typo in `-O' help message. Fix docs of
+ -Y/--proxy. Fix docs of `--cookies' and `--glob'. Improve docs
+ of --convert-links. Fix docs of SSL options.
+
+2003-11-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Don't allow setting of both opt.ipv4_only and
+ opt.ipv6_only.
+
+ * src/init.c (defaults): Mark opt.ipv4_only specially when set
+ automatically.
+
+2003-11-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c: Don't include <arpa/inet.h> and others because
+ they're no longer needed.
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: Make sure the options are in alphabetic order!
+
+ * src/host.c (lookup_host): Merge lookup_host_passive and lookup_host
+ after all -- having both would result in some code duplication.
+ (lookup_host): Set hints.ai_family to AF_INET if ipv4_only is
+ requested. Likewise, set it to AF_INET6 for ipv6_only. Specify
+ AI_ADDRCONFIG where available.
+ (lookup_host): New flag LH_REFRESH that specifies that a cached
+ entry for HOST should be refreshed.
+ (cache_query): New function.
+ (cache_store): Ditto.
+ (cache_remove): Ditto.
+ (forget_host_lookup): No longer necessary, replaced with static
+ function cache_remove.
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (persistent_available_p): Correctly specify the endpoint
+ argument to socket_ip_address.
+ (gethttp): When printing the "reusing connection to..." message,
+ specify the host name of the reused connection, not the current
+ host name. That makes more sense because it provides a useful
+ piece of information -- we know to which host we're supposed to
+ connect anyway!
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c: Don't refer to the now-removed function
+ forget_host_lookup in the documentation of lookup_host.
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Use AI_ADDRCONFIG only if the family is
+ unspecified. This ensures that specifying `--no-inet4' on systems
+ where IPv6 resolves, but doesn't work behaves the same regardless
+ of the availability of AI_ADDRCONFIG.
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Documented that --dont-remove-listing is now
+ --no-remove-listing.
+
+2003-11-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Portability): Update slightly.
+
+2003-11-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (uri_merge): Merging "foo" and "bar" should result in
+ "bar", not in "foo/bar".
+ (path_simplify): Don't remove empty path elements; don't
+ special-case leading slash.
+ (path_simplify): Don't swallow ".."'s at the beginning of string.
+ E.g. simplify "foo/../../bar" as "../bar", not as "bar".
+ (append_uri_pathel): Defang ".." path element upon encountering
+ it.
+
+2003-11-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c: Enable -4 and -6 only if IPv6 is enabled.
+
+2003-11-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (register_transport): Renamed from register_extended.
+ Explain the intended usage.
+
+2003-11-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/fdl.texi: New file.
+
+ * doc/wget.texi: Upgrade to GNU Free Documentation License 1.2.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (CONNECT_ERROR): Use it.
+
+ * src/connect.c (unsupported_socket_family_error): New function.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (defaults): Turn on opt.ipv4_only if we're compiling with
+ IPv6, and AI_ADDRINFO is not available, and AF_INET6 sockets can't
+ be created.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (persistent_available_p): Don't attempt to talk to two
+ different SSL sites over the same secure connection.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (gethttp): Ditto.
+
+ * src/ftp.c (getftp): Use retryable_socket_connect_error instead of
+ CONNECT_ERROR.
+
+ * src/wget.h (CONNECT_ERROR): Removed.
+
+ * src/connect.c (retryable_socket_connect_error): New function instead
+ of unsupported_socket_family_error.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Document the fact that the addresses are
+ returned in order.
+
+2003-11-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (bind_local): Renamed bindport to bind_local; return
+ the socket directly. Updated callers.
+ (accept_connection): Renamed acceptport to accept_connection;
+ return the created socket directly. Updated callers.
+
+2003-11-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c: Use limits.h only where available.
+
+ * src/hash.c: Use INVALID_PTR and INVALID_PTR_BYTE. Include limits.h.
+
+2003-11-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Use a more standard checking message when checking
+ for md5.h.
+
+2003-11-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Tweak ansi2knr test, use : instead of true.
+
+2003-11-12 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for limits.h.
+
+2003-11-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c: Added options --inet4-only and --inet6-only.
+
+2003-11-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (host_errstr): Use the more standard message "Unknown
+ host".
+
+2003-11-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Special-case the numeric addresses only in
+ the non-IPv6 case.
+
+2003-11-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (resolve_bind_address): Call lookup_host_passive.
+ Make sure that opt.bind_address is resolved only once.
+
+ * src/host.c (lookup_host_passive): New function, handles "passive"
+ lookups.
+ (lookup_host): Remove the passive flags. Remove the
+ family-related flags -- use ip_default_family instead.
+
+2003-11-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (connect_to_host): Use that flag to decide whether to
+ re-resolve the host name.
+
+ * src/host.c (struct address_list): Added a flag that maintains
+ whether the connection worked at some point.
+
+2003-11-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4 (WGET_STRUCT_UTIMBUF): Use AC_CHECK_TYPES instead of
+ AC_EGREP_CPP to check for struct utimbuf.
+
+2003-11-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4 (WGET_SOCKLEN_T): Use AC_COMPILE_IFELSE instead of
+ AC_TRY_COMPILE.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (option_data): Specify the command to use for --mirror.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c: Get URLs from <object data="...">.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Remove next/previous/up node links. Makeinfo doesn't
+ require them, and they make the document harder to modify.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: No longer document options -s, -C, -g, and -G.
+ (Contributors): Update my email address.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't attempt to use Emacs as a makeinfo
+ substitute.
+
+2003-11-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4 (WGET_WITH_NLS): Respect the user's setting of
+ LINGUAS, e.g. `LINGUAS="en bg ja" ./configure'.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (wtimer_allocate): Bless the use of wtimer_read on a
+ timer that has merely been allocated because get_contents() does
+ that.
+ (wtimer_update): Abort if the timer is not initialized.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (get_contents): Pass the timer to limit_bandwidth().
+
+ * src/utils.c (wtimer_update): New function instead of wget_elapsed;
+ just update the timer, but don't return anything.
+ (wtimer_read): Read and return the last known value of the timer.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (update_speed_ring): Clear the speed ring when the
+ download stalls.
+
+ * src/retr.c (get_contents): Specify 0.95s read timeout, so that the
+ progress gauge can be updated even when data arrives very slowly
+ or stalls.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Removed one-letter options `-C', `-g', `-G', and
+ `-s'.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Add --dont-remove-listing for backward
+ compatibility with previous versions.
+ (print_help): Fix typo, spotted by Dennis Smit.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (persistent_available_p): No reason for the host lookup
+ to be silent -- it's a lookup like any other.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (persistent_available_p): Instead of matching all the
+ addresses of HOST and last host, determine the peer's IP address
+ with socket_ip_address and see if that address is one of those
+ HOST resolves to.
+
+ * src/host.c (address_list_match_all): Removed.
+ (address_list_find): New function, finds an IP address in the
+ address list.
+
+ * src/ftp.c (ftp_do_pasv): Get the peer's address here, and pass it to
+ ftp_epsv so it doesn't need to call getpeername.
+
+ * src/ftp-basic.c (ftp_port): Use socket_ip_address instead of
+ getpeername.
+ (ftp_lprt): Ditto.
+
+ * src/connect.c (socket_ip_address): Replaces conaddr, generalized to
+ either get peer's or local address.
+ (sockaddr_get_data): Made local to this file.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (HASH_POSITION): Explicitly accept the hash function.
+ (grow_hash_table): Extract ht->hash_function outside the loop.
+ (hash_table_remove): Ditto.
+ (hash_table_clear): Fill entries with 0xff to clear them.
+ (hash_table_remove): Mark entries as deleted with the correct
+ marker.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (cookie_handle_set_cookie): Specify exact match for
+ unspecified domains.
+
+2003-11-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (register_extended): Check that fd >= 0.
+
+2003-11-08 Gisle Vanem <giva@bgnett.no>
+
+ * src/ftp-basic.c: Support Windows-2000 ftp servers. Win-2000 *is*
+ Win-NT 5.0 so calling it ST_WINNT is okay I guess.
+
+2003-11-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Allow empty ports.
+
+2003-11-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Break the help string into multiple chunks.
+ (cmdline_option): New option handler OPT_FUNCALL. Generalized
+ HANDLE_CMD to generic DATA.
+ (option_data): Use the new OPT_FUNCALL feature.
+
+2003-11-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (NON_EMPTY): Use the all-bit-set value as the marker that
+ the field is empty. This allows NULL pointer and 0 value to be
+ used as keys, which is necessary for the connect.c code to work
+ when fd==0.
+ (hash_table_new): Fill mappings with 0xff.
+ (grow_hash_table): Ditto.
+
+2003-11-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (LAZY_RETRIEVE_INFO): Set LAST_INFO.
+
+2003-11-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * README: Remove explicit version reference, so that the file
+ doesn't have to be updated for each new release.
+
+2003-11-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (init_switches): New function. Convert option_data to
+ long_options and short_options, which can be fed to getopt_long.
+ (main): Execute command-line options by consulting option_data.
+
+2003-11-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.h: Declare log_init, log_close, and
+ log_request_redirect_output here.
+
+2003-11-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/gen_sslfunc.c (ssl_read): Implement a more correct check for
+ EINTR.
+ (ssl_write): Ditto.
+ (init_ssl): Use a global SSL context.
+
+2003-11-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c: Updated all callers of
+ iread/ssl_iread/iwrite/ssl_iwrite to use xread and xwrite instead.
+
+ * src/rbuf.h (struct rbuf): Removed the SSL member because SSL is
+ handled automatically by xread.
+
+ * src/hash.c (ptrhash): Made private.
+ (ptrcmp): Ditto.
+ (inthash): Removed.
+
+ * src/connect.c (select_fd): Don't set errno, leave it to the caller.
+
+ * src/gen_sslfunc.c (connect_ssl): Use register_extended to register
+ SSL callbacks for communication with SSL-enabled endpoints.
+ (ssl_read): New function.
+ (ssl_write): Ditto.
+ (ssl_poll): Ditto.
+ (ssl_close): Ditto.
+
+ * src/connect.c (register_extended): New function -- register
+ callbacks for basic socket operations.
+ (xread): Ditto.
+ (xwrite): Ditto.
+ (xclose): Ditto.
+ (sock_read): New function, default implementation for reading.
+ (sock_write): Ditto for writing.
+ (sock_poll): Ditto for polling.
+ (sock_close): Ditto for closing.
+
+2003-11-06 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (xclose): Free INFO even if it doesn't provide a
+ closer.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/config.h.ms: MSVC doesn't have uint32_t.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (save_cookies_mapper): Respect the setting of
+ keep-session-cookies.
+ (cookie_jar_load): Import session cookies.
+ Based on code submitted by Nicolas Schodet.
+
+ * src/utils.c (datetime_str): Use information in TM when it's
+ non-NULL.
+
+ * src/main.c (main): New option `--keep-session-cookies'.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (resolve_bind_address): Use a more accurate error
+ message -- we're not binding to ANY, we're disabling bind
+ altogether.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (connect_to_ip): More compact error checking.
+ (bindport): Don't treat failed setsockopt as a fatal error.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (bindport): Fix compilation under pre-C99 compilers.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * libtool.m4, ltmain.sh, config.sub, config.guess: Upgrade to
+ libtool 1.5.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Document `--keep-session-cookies'.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Use the Autoconf macro AC_C_PROTOTYPES instead of
+ the old AM_C_PROTOTYPES.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Substitute ANSI2KNR and U, so we can compile.
+
+2003-11-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Remove the broken check for socks.
+
+2003-11-05 Dennis Smit <ds@nerds-incorporated.org>
+
+ * src/main.c: (main): added --preserve-permissions option.
+
+ * src/ftp.c (ftp_retrieve_list): added support for
+ --preserve-permissions option.
+
+ * src/init.c: added support for --preserve-permission option.
+
+ * src/option.h: added support for --preserve-permission option.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (progress_handle_sigwinch): Don't call
+ determine_screen_width() from the signal handler. Instead, just
+ set a volatile variable.
+ (bar_create): Check whether SIGWINCH was received.
+ (bar_update): Ditto.
+
+ * src/sysdep.h: Define SYSTEM_FNMATCH only if HAVE_FNMATCH_H is true.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config-post.h: New file, included from now autogenerated
+ config.h.in.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in (realclean): Delete config.h.in.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Use the new form of AC_OUTPUT.
+
+ * Makefile.cvs (prep): Invoke autoheader.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Require Autoconf 2.57.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Move some checks into aclocal.m4. Check whether
+ fnmatch.h is includable.
+
+ * configure.in: Also check whether #include <md5.h> works before
+ deciding to use Solaris libmd5.
+
+ * configure.in: Use AC_MSG_NOTICE instead of echo. Use
+ AC_MSG_ERROR for fatal errors.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't misuse AC_MSG_RESULT. Use AC_MSG_NOTICE
+ where appropriate.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check whether volatile is supported. Don't check
+ for gethostname and uname, which are not used.
+
+2003-11-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4: Ditto.
+
+ * configure.in: Add description annotations to AC_DEFINE.
+
+ * Makefile.in: Update maintenance targets, preparing them for the
+ use of `autoheader'.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (N_): Don't parenthesize argument.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (xsleep): New function. Uses nanosleep where available,
+ resuming sleeps interrupted by signals. Updated callers of sleep
+ and usleep to use xsleep.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.c (logvprintf): Documented better. Renamed to
+ log_vprintf_internal to avoid confusion with the public API
+ functions logprintf and logputs.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.h (ADDRESS_IPV4_DATA): Don't take the address of in.s_addr
+ because that doesn't work on machines that define it as bitfield.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c (ftp_login): Remove shadowing (and bogus)
+ declaration of SEED.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (select_fd): Generalize the third argument into WAIT,
+ so that the caller can request waiting for both read and write.
+ Updated callers.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Look for nanosleep in -lrt and -lposix4, which is
+ where Solaris has them.
+
+2003-11-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for nanosleep.
+
+2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: Retired the `boolean' type. Moved the DEFAULT_LOGFILE
+ define to log.h. Moved the INFINITE_RECURSION define to recur.h.
+
+ * src/xmalloc.h: Renamed FREE_MAYBE to xfree_null and moved the
+ definition from wget.h to xmalloc.h.
+
+2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (cleanup_html_url): Destroy the hash tables, don't
+ just call free on them.
+ (init_interesting): Use hash_table_put instead of string_set_add
+ because we don't need the strdup that the latter function
+ performs.
+
+ * src/init.c (cleanup): Don't pass NULL to cookie_jar_delete.
+
+ * src/xmalloc.c (xfree_real): Abort when passed a NULL pointer.
+ (xfree_debug): Print at the file and line of the offending call to
+ free.
+
+2003-11-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-parse.c (decode_entity): New function; split the decoding
+ of entities here.
+ (convert_and_copy): Use it to decode entities.
+ (decode_entity): Handle the &apos entity.
+ (decode_entity): Don't decode Latin 1 numeric entities. Don't
+ decode &#0.
+
+2003-11-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c: Removed the ip_default_family global variable.
+
+ * src/host.c (lookup_host): Document the function. Fixed declaration
+ of VEC.
+
+2003-11-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-opie.c (calculate_skey_response): Use uint32_t instead of
+ `unsigned long' for the cheksum array. Document the function.
+
+2003-11-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (acceptport): Don't call select_fd when timeout is not
+ requested.
+
+2003-10-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h: Move declarations of malloc and logging code to
+ xmalloc.h and log.h respectively to unclutter this file.
+ (STRDUP_ALLOCA): Made it side-effect free.
+
+ * src/xmalloc.h: New files. Define macros xnew, xnew0, xnew_array,
+ and xnew0_array.
+
+ * src/xmalloc.c: New file. Move the xmalloc routines here.
+
+2003-10-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/various: Use new macros xnew, xnew0, xnew_array, and xnew0_array
+ in various places.
+
+2003-10-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h (CLOSE): Don't call close on file descriptors less than
+ 0, i.e. on uncreated sockets.
+
+ * src/connect.c (resolve_bind_address): Work on struct sockaddr
+ directly.
+ (connect_to_host): Replacement for connect_to_many. Resolve HOST
+ and connect to any of its addresses. If we can't connect and the
+ host name lookup was cached, try to resolve it again. This should
+ fix problems with hosts behind dynamic DNS. Updated all callers.
+ (connect_to_ip): Replacement for connect_to_one. Removed SILENT;
+ added the argument PRINT instead. Updated all callers.
+ (set_connection_host_name): Removed.
+
+ * src/host.c (address_list_address_at): New function instead of
+ address_list_copy_one. It returns a pointer to ip_address *, so
+ it's not necessary to copy the data.
+ (address_list_cached_p): New function.
+ (forget_host_lookup): Ditto.
+
+ * src/connect.c: Got rid of the MSOCK global variable. Made bindport
+ return the local socket it creates. Added a new argument to
+ acceptport, the socket to call accept on. Updated callers.
+ (closeport): Removed.
+
+ * src/connect.c: Moved the sockaddr code from host.c to this file,
+ because most of that stuff is used for connecting, and has nothing
+ to do with host names anyway.
+ (sockaddr_set_data, sockaddr_get_data): New functions, replace the
+ old sockaddr_set_address, sockaddr_set_port, sockaddr_get_address,
+ and sockaddr_get_port.
+
+2003-10-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (address_list_from_single): Removed.
+ (address_list_from_ipv4_addresses): Renamed from
+ address_list_from_vector.
+
+2003-10-31 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (sockaddr_set_data): Remove the broken code that
+ checked for NULL address.
+
+2003-10-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (append_uri_pathel): New argument ESCAPED_P that says
+ whether [B, E) is to be treated as URL-escaped or not. If
+ ESCAPED_P is false, don't unescape the region.
+ (url_file_name): u->file is not URL-escaped.
+
+2003-10-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Use `S >= 8' rather than `S == 8' when looking for
+ large integers.
+
+2003-10-30 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (retrieve_from_file): Use retrieve_tree for
+ page-requisites.
+
+ * src/main.c (main): Don't define opt.recursive when -p is used.
+ Instead, make sure that recursion is used for HTTP in that case.
+
+2003-10-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.h: Defined accessors for elements of ip_address. Updated
+ all callers.
+ (address_list_match_all): Use memcmp in the non-IPv6 case.
+
+ * src/wget.h (CONNECT_ERROR): Don't retry connecting if connect()
+ returned EAFNOSUPPORT.
+
+2003-10-29 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Reenable IPv6 autodetection.
+
+2003-10-27 Mauro Tortonesi <mauro@deepspace6.net>
+
+ * src/connect.h: changed bindport prototype and added the related
+ BIND_ON_IPV4_ONLY and BIND_ON_IPV6_ONLY flags.
+
+ * src/connect.c: changed bindport and resolve_bind_address to allow
+ protocol-version specific DNS resolution. modified conaddr,
+ acceptport and connect_to_one to make use of struct
+ sockaddr_storage and of the new ip_address structure.
+
+ * src/ftp-basic.c: added LPRT/LPSV (RFC1639) support, refactored
+ PORT/PASV (RFC959) and EPRT/EPSV (RFC2428) support code.
+
+ * src/ftp.c: added the ftp_do_port and ftp_do_pasv functions to
+ handle FTP over IPv6.
+
+ * src/ftp.h: changed prototype of ftp_epsv and added prototypes for
+ ftp_lpsv, ftp_lprt and ftp_eprt.
+
+ * src/host.c: renamed the
+ wget_sockaddr_set_address and wget_sockaddr_get_addr, and
+ wget_sockaddr_{s,g}et_port couples to sockaddr_{s,g}et_address and
+ sockaddr_{g,s}et_port respectively. changed
+ address_list_match_all, address_list_from_addrinfo sockaddr_len,
+ pretty_print_address, lookup_host, sockaddr_{s,g}et_address and
+ sockaddr_{g,s}et_port to make use of struct sockaddr_storage and
+ of the new ip_address structure. removed map_ipv4_to_ip and
+ map_ip_to_ipv4.
+
+ * src/host.h: redefined structure ip_address and removed structure
+ wget_sockaddr.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/config.h.mingw: Ditto.
+
+ * windows/Makefile.top.mingw: Ditto.
+
+ * windows/Makefile.src.mingw: New file.
+
+ * windows/wget.dep: Support convert.o.
+
+ * configure.bat.in: New option `--mingw'.
+ From Chin-yuan Kuo.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/config.h.bor: DEBUG is now ENABLE_DEBUG. Borland has
+ snprintf, but not u_int32_t.
+
+ * windows/Makefile.src.bor (OBJS): Use convert.c.
+
+ From Chin-yuan Kuo.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * windows/Makefile.src.watcom (OBJS): Use convert.c.
+ From Chin-yuan Kuo.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Include inttypes.h where available.
+
+ * src/host.c: Switch from u_int32_t to uint32_t.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/netrc.c (parse_netrc): Reset the QUOTE flag after the closing
+ quote.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Wgetrc Commands): Fixed typo.
+ From DervishD <raul@pleyades.net>.
+
+2003-10-26 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Switch from u_int32_t to uint32_t. Check for
+ inttypes.h so it's used to get the definition of uint32_t where
+ available.
+
+2003-10-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (is_valid_ipv6_address): Reformat to GNU coding style.
+ Use enums for NS_IN* constants. Use ISXDIGIT.
+
+ * src/convert.c (construct_relative): Document better how the function
+ works.
+
+2003-10-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/Makefile.in (install.info): Handle the case when only wget.info
+ is generated from wget.texi. In that case, wget.info-*[0-9]
+ doesn't match anything and therefore ends up as a bogus value of
+ FILE in the loop. Fix this by not calling INSTALL_DATA on
+ nonexistent files.
+
+2003-10-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/version.c: Bump version.
+
+2003-10-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c: Ditto.
+
+ * src/html-parse.c (advance_declaration): Don't use trailing comma in
+ enum because older compilers don't support it.
+
+ * src/utils.c: Don't redefine HAVE_SIGSETJMP.
+
+2003-10-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config.h.in: Deploy preprocessor magic to avoid Ultrix's
+ <netdb.h> include <bitypes.h> which defines its own u_int32_t.
+ Reported by Bernhard Simon.
+
+2003-10-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (dist): Depend on configure.bat.
+ (realclean-top): Delete configure.bat.
+
+2003-10-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (distclean-top): Remove the libtool script, because
+ it's generated by configure.
+
+2003-10-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/convert.c (construct_relative): Don't handle absolute files
+ specially -- for example, -P/tmp/foo shouldn't imply that
+ converted files must refer to "/tmp/foo/..."!
+
+2003-10-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for int32_t because we're not really
+ using it.
+
+2003-10-15 Philip Stadermann <philip.stadermann@credativ.de>
+
+ * src/ftp.c (ftp_retrieve_glob): Correctly loop through the list whose
+ elements might have been deleted.
+
+2003-10-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c: Consider status 307 a valid redirect.
+
+2003-10-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Only define u_int32_t.
+
+2003-10-13 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (tag_handle_meta): Set the Refresh link to expect
+ HTML.
+ (append_one_url): Renamed to append_url.
+
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (large_int_to_string): Use snprintf() to print the
+ number. This will work even on systems where libc doesn't
+ understand %lld, but the compiler does, because it will use our
+ snprintf replacement.
+
+ * src/init.c (parse_bytes_helper): New function.
+ (cmd_bytes): Use it to parse bytes, but cast the result to long.
+ (cmd_bytes_large): Ditto, but store the result to LARGE_INT. Used
+ for --quota so that --quota=10G works even on machines without
+ long long.
+
+ * src/options.h (struct options): Declare quota as LARGE_INT.
+
+ * src/retr.c (downloaded_exceeds_quota): Removed.
+ (downloaded_increase): Ditto.
+ (total_downloaded_bytes): New variable, replaces opt.downloaded,
+ which was the wrong place for it anyway. Updated callers of
+ downloaded_exceeds_quota and downloaded_increase to check this
+ variable directly.
+
+ * src/sysdep.h: Get rid of VERY_LONG_TYPE. Use LARGE_INT for the same
+ purpose, defined as `long', `long long' or `double', depending on
+ size of long and whether long long is available.
+
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/sysdep.h: Also check size of short for int32_t.
+
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Use u_int32_t to store the result of
+ inet_addr(). That removes the need for offset fiddling, caring
+ about endian-ness, etc.
+
+ * src/sysdep.h: Define int32_t and u_int32_t if not available.
+
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp-basic.c (ftp_epsv): Use socklen_t * as the third argument to
+ getpeername.
+
+ * src/config.h.in: Define socklen_t stub.
+
+ * src/host.c (sockaddr_len): Return socklen_t.
+
+ * src/connect.c (conaddr): Use socklen_t as the third argument to
+ accept, getsockname, and connect.
+
+2003-10-11 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Check for int32_t and u_int32_t. Check for
+ SIZEOF_INT.
+
+2003-10-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/recur.c (retrieve_tree): Don't descend into documents that are
+ not expected to contain HTML, regardless of their content-type.
+
+ * src/html-url.c (tag_url_attributes): Record which attributes are
+ supposed to yield HTML links that can be followed.
+ (tag_find_urls): Propagate that information to the caller through
+ struct urlpos.
+
+2003-10-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (hash_table_new): Slightly change the meaning of the
+ first parameter. Instead of being the minimum initial size, it is
+ now the minimum number of items that the hash table can take
+ without needing to resize.
+
+2003-10-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (find_mapping): Return the next available mapping when
+ the key is not found, not NULL.
+ (hash_table_put): Use find_mapping to find the storage for the new
+ data.
+ (hash_table_put): Grow the table before exceeding maximum
+ fullness, not afterwards.
+
+2003-10-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/tr.po: Ditto.
+
+ * po/sv.po: Updated from TP.
+
+2003-10-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4 (WGET_WITH_NLS): First check for gettext in libintl,
+ then use the libc version. That way systems that get libintl.h
+ from /usr/local/include will get the matching gettext.
+
+2003-10-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (init_interesting): Initialize interesting_tags and
+ interesting_attributes as hash tables. This simplifies the code
+ immensely because hash tables handle allocation and remove
+ duplicates automatically.
+ (find_tag): Removed.
+ (collect_tags_mapper): Instead of calling find_tag, simply get the
+ entry from interesting_tags hash table, which is both simpler and
+ faster.
+
+2003-10-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/hash.c (hash_table_get): Declare hash-table argument as const.
+ (find_mapping): Ditto.
+ (hash_table_get_pair): Ditto.
+ (hash_table_contains): Ditto.
+ (hash_table_count): Ditto.
+
+2003-10-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/ft.po, po/sk.po, po/ja.po: Updated from the TP.
+
+2003-10-09 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.watcom (OBJS): Ditto.
+
+ * windows/Makefile.src.bor: Ditto.
+
+ * windows/wget.dep: Ditto.
+
+ * windows/Makefile.src: Removed references to fnmatch.c and
+ fnmatch.o.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (print_help): Fix typo; stured -> stored.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (get_urls_html): Parse the appropriate flags to
+ html-parse.c.
+
+ * src/html-parse.c (map_html_tags): Accept FLAGS from the caller
+ instead of examining OPT.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-url.c (find_tag): Switch to binary search.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/getopt.c: Newer version, imported from Free libit.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/getopt.c: Add definitions of getopt_long and getopt_long_only.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (has_insecure_name_p): Define it here.
+
+ * src/utils.c (has_wildcards_p): Define it here.
+
+ * src/sysdep.h: Declare fnmatch-related macros here, if not using
+ system fnmatch(). Update .c files to not declare fnmatch.h
+ directly.
+
+ * src/cmpt.c (fnmatch): Moved here. Use it only under non-GNU libc.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config.h.in: Renamed DEBUG to ENABLE_DEBUG. ENABLE_DEBUG is, I
+ think, a better name, because it implies that debugging output is
+ merely possible, not "on by default", as might be construed from
+ just DEBUG.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/wget.pot: Recreated.
+
+2003-10-08 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Renamed DEBUG to ENABLE_DEBUG.
+
+2003-10-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (struct cookie): Remove unused backpointer to cookie
+ jar.
+
+2003-10-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cmpt.c (memmove): Comment out, since it's no longer used.
+
+ * src/cookies.c (cookie_jar_generate_cookie_header): Allocate room for
+ chains in one pass.
+ (find_chains_of_host): Assume that the caller has allocated DEST
+ to be sufficiently large to take all the data.
+ (eliminate_dups): Run through the array and eliminate dups on the
+ fly instead of using memmove.
+ (cookie_jar_process_set_cookie): Free cookie->domain before
+ re-setting it.
+
+2003-10-07 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (HTTP Options): Documented --post-file and
+ --post-data.
+
+2003-10-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (file_size): Return -1 if fopen() returns NULL. Prior
+ to this patch, wget --post-file=nosuchfile dumped core.
+
+2003-10-05 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (set_sleep_mode): Fix type of
+ _SetThreadExecutionState.
+
+2003-10-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/log.c: Use `...' in function definitions; ansi2knr will convert
+ them to va_dcl. This allowed removal of the ugly VA_START_1 and
+ VA_START_2 macros.
+
+2003-10-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * libtool.m4: New file with contents imported from libtool.
+
+ * aclocal.m4: Move libtool stuff into a separate file. That
+ leaves this file only with Wget-specific stuff.
+
+2003-10-04 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (run_with_timeout): Use WaitForSingleObject to wait
+ for thread termination.
+
+2003-10-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-parse.c (convert_and_copy): Move variable declarations
+ before statements.
+
+2003-10-03 Gisle Vanem <giva@bgnett.no>
+
+ * src/connect.c: And don't include them here.
+
+ * src/mswindows.h: Include winsock headers here.
+
+2003-10-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (XMALLOC_ARRAY): Removed.
+ (ALLOCA_ARRAY): Ditto.
+
+ * src/html-parse.c: Renamed alloca_p to resized.
+ (GROW_ARRAY): Renamed DO_REALLOC_FROM_ALLOCA to GROW_ARRAY and
+ returned it to html-parse.c, since nothing else was using it.
+
+2003-10-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (alarm_set): New function; use either setitimer or alarm
+ to set up the alarm.
+ (alarm_cancel): New function; cancel the alarm set up by
+ alarm_set.
+ (run_with_timeout): Use them.
+
+2003-10-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (retrieve_url): Initialize DUMMY storage for DT. Caught
+ by valgrind.
+
+2003-10-02 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/html-parse.c (convert_and_copy): Handle numeric entities in
+ hexadecimal, &#xHH.
+ (convert_and_copy): Copy the contents directly to the pool without
+ a stack-allocated intermediary.
+
+2003-10-02 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (run_with_timeout): For Windows: Run the 'fun' in a
+ thread via a helper function. Continually query the thread's
+ exit-code until finished or timed out.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Don't leak memory when a reencoded URL turns
+ out to be invalid.
+
+ * src/url.c (parse_errors): Mark error messages for translation.
+ (url_error): Translate error messages returned to the caller.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/ftp.c (ftp_loop_internal): Initialize TMRATE to NULL to shut up
+ the compiler.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/hu.po: Updated from the TP.
+
+ * po/et.po: Updated from the TP.
+
+ * po/ro.po: New file from the TP.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/hr.po: Updated.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * po/POTFILES.in: Added src/convert.c.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Renamed prep.ai.mit.edu to ftp.gnu.org.
+
+2003-10-01 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Contributors): Updated from ChangeLog entries.
+
+2003-09-30 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src (OBJ): Fix typo.
+
+2003-09-29 Aaron Hawley <Aaron.Hawley@uvm.edu>
+
+ * src/ftp.c (getftp): --spider option should now work with FTP
+ downloads.
+ (ftp_loop_internal): quiet reports and calculations of downloads
+ when --spider option set, nor try deleting when --delete-after
+ also set.
+ (ftp_loop): --spider will skip HTML-ification of .listing file.
+
+2003-09-26 Gisle Vanem <giva@bgnett.no>
+
+ * windows/config.h.ms: Don't declare alloca under compilers that
+ support it.
+
+ * windows/config.h.ms: Define HAVE_SNPRINTF, HAVE_VSNPRINTF, and
+ HAVE_MEMMOVE.
+
+2003-09-26 Gisle Vanem <giva@bgnett.no>
+
+ * src/src/mswindows.c: Added ws_percenttitle() showing progress in the
+ window titlebar. Called from retr.c. Secured ws_mypath().
+
+ * src/windows/config.h.ms: alloca() prototype not needed. Removed
+ "#undef ENABLE_NLS"; should be in Makefile IMHO. Moved
+ WGET_USE_STDARG from mswindows.h to config.ms.h because of #ifdef
+ in log.c. (MSVC's vararg.h and stdarg.h are incompatible).
+
+2003-09-26 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (read_registry): Removed.
+ (set_sleep_mode): New function.
+ (windows_main_junk): Call it.
+
+2003-09-26 Gisle Vanem <giva@bgnett.no>
+
+ * src/mswindows.c (read_registry): Fix invocation of registry
+ functions.
+
+ * src/mswindows.c (read_registry): Condition definitions of sleep and
+ usleep with not HAVE_SLEEP and HAVE_USLEEP respectively. Define
+ HAVE_SLEEP and HAVE_USLEEP under __DMC__.
+
+2003-09-25 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src: Updated OBJ list.
+
+2003-09-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_escape_1): Revert unintentional change to lowercase
+ xdigit escapes.
+ (url_escape_dir): Document that this function depends on the
+ output of url_escape_1.
+
+2003-09-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Print the current ETA if we're done
+ with the download.
+ (create_image): Change '-' display char to '+' in the progress bar.
+
+ * src/Makefile.in (clean): Remove .libs.
+
+2003-09-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (struct cookie): New flag domain_exact.
+ (update_cookie_field): Skip leading dot in domain.
+ (find_matching_chains): Match numeric addresses exactly; don't
+ needlessly copy HOST to the stack.
+ (matching_cookie): Added argument HOST. If cookie->domain_exact
+ is set, check that HOST is equal to cookie->domain.
+ (cookie_jar_load): Only use TAB as delimiter. Document the
+ meaning of DOMAIN-FLAG. Skip leading dot in domain.
+ (cookie_jar_load): Don't ignore DOMAIN-FLAG -- instead, set
+ domain_exact to true if DOMAIN-FLAG is false.
+ (save_cookies_mapper): If domain_exact is false, prepend the
+ domain with dot, like Mozilla does.
+
+2003-09-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (distclean-top): Remove autom4te.cache.
+
+2003-09-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (clean-top): Remove .libs.
+
+2003-09-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (path_simplify): Instead of calls to memmove, handle "./"
+ and "../" by advancing pointers.
+
+2003-09-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/safe-ctype.h (_sch_test): The cast of BIT to unsigned char was
+ broken -- _sch_istable bitmasks are 16-bit, not 8-bit! Cast BIT
+ to unsigned short instead.
+
+2003-09-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (getproxy): Moved from url.c.
+
+ * src/convert.c: Split off link conversion from url.c into separate
+ file. Also included the book-keeping stuff from recur.c.
+
+2003-09-22 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (create_image): Print the initial part of the
+ download with '-' characters, analogous to how dot progress prints
+ the initial part with ','.
+
+ * src/hash.c (ptrhash): New function.
+ (ptrcmp): Ditto.
+ (hash_table_new): Default to identity hash table.
+
+2003-09-21 Matthew J. Mellon <mellon@tymenet.com>
+
+ * src/http.c (gethttp): Recognize content-type "application/xhtml+xml"
+ as what Wget considers "text/html".
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): Use setoptval() for setting the options. Use
+ run_command for `-e'.
+
+ * src/init.c (parse_line): Rewritten to return COMIND right away.
+ Changed linkage to static.
+ (run_wgetrc): Use the available comind when calling setval, so it
+ doesn't have to be computed twice.
+ (setval_internal): New function, runs the command's action without
+ any error checking.
+ (setoptval): New function, does what setval used to do, but exits
+ in case of error.
+ (run_command): New function.
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: Improved documentation of functions.
+ (cmd_boolean): Attempt to make code that tries to avoid calling
+ strcmp for "speed" a bit more readable.
+
+ * src/init.c (simple_atof): Report error on encountering non-digit,
+ non-"." character.
+ (simple_atoi): Replacement for myatoi(), calling interface
+ compatible with simple_atof. Updated myatoi's callers.
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (simple_atof): New function.
+ (cmd_time): Use it.
+ (cmd_bytes): Accept things like "1.5k" and such. Use simple_atof
+ to parse decimals.
+
+ * src/retr.c (limit_bandwidth): Adjust each sleep by the error of the
+ previous one.
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (select_fd): Change MAXTIME's type to double. Handle
+ its decimal part.
+
+ * src/retr.c (sleep_between_retrievals): In the random-wait case, use
+ random_float() to wait between 0 and 2*opt.wait seconds.
+
+ * src/utils.c (run_with_timeout): Accept `double' timeouts. Correctly
+ handle timeout values in (0, 1) range.
+ (random_float): New function.
+
+ * src/options.h (struct options): Change the types of wait, waitretry,
+ and timeout to double.
+
+ * src/init.c (cmd_time): Accept floating point time.
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/connect.c (connect_with_timeout): Made timeout type double.
+
+ * src/options.h (struct options): New members read_timeout,
+ dns_timeout, and connect_timeout.
+ Use them.
+
+2003-09-21 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Documented the new timeout options.
+
+2003-09-21 Bertrand Demiddelaer <bert@b3rt.org>
+
+ * src/url.c (path_simplify): Would read two bytes past the end of the
+ string in the "./" case.
+
+2003-09-21 Aaron S. Hawley <Aaron.Hawley@uvm.edu>
+
+ * doc/wget.texi: Split version to version.texi. Tweak documentation's
+ phrasing and markup.
+
+2003-09-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (uri_merge): Get rid of uri_merge_1.
+ (uri_merge): Merge "foo//", "bar" as "foo//bar", not "foo///bar",
+ i.e. don't add an extra slash merely because BASE ends with two
+ slashes.
+ (parse_credentials): Renamed from parse_uname. Rewrittern in
+ standard [beg, end) calling style.
+ (url_skip_credentials): Renamed from url_skip_uname. Made static.
+ (url_skip_credentials): Include # and ; as terminators. Old code
+ would mistakenly consider "http://foo.com#hniksic@iskon.hr" to
+ contain a username.
+ (url_skip_scheme): Removed because it was unused.
+ (url_has_scheme): Require "scheme" to be at least one char long.
+
+2003-09-20 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (get_contents): Cosmetic fixes.
+
+2003-09-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (BOUNDED_TO_ALLOCA): Evaluate PLACE only once.
+ (ARRAY_SIZE): Renamed to countof. All callers updated.
+
+2003-09-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_file_name): Expect NULL dir_prefix.
+
+ * src/init.c (cmd_file): Use a macro to prevent multiple #ifdef
+ WINDOWS.
+ (defaults): Set dir_prefix to NULL by default.
+
+2003-09-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/safe-ctype.h (_sch_test): Cast BIT to unsigned char, like latest
+ gcc does.
+
+2003-09-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/main.c (main): New option --strict-comments.
+
+ * src/html-parse.c (find_comment_end): New function: simple BM search
+ for "-->".
+ (map_html_tags): Use it if looking at a comment and not in strict
+ comments mode.
+
+2003-09-19 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Changed @itemx not preceded by @item to @item.
+
+2003-09-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/safe-ctype.h: Don't #define ctype.h macros to errors because
+ that loses when someone #include's ctype.h after safe-ctype.h.
+
+2003-09-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (get_contents): Pass the correct argument to ssl_iread.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c: Undef U, W, C after use.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_escape_1): New function.
+ (url_escape): Use it.
+ (sync_path): Handle pathological cases where u->file and u->dir
+ contain really strange characters.
+ (ENCODE): Deleted.
+ (REENCODE): Deleted.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_spec_restrict_file_names): Allow the OS setting to
+ be augmented by ",nocontrol" which means don't escape the control
+ characters, but otherwise keep OS settings.
+
+ * src/url.c (file_unsafe_char): Deleted.
+ (append_uri_pathel): Query filechr_table directly.
+ (filechr_table): Separated Unix, Windows, and control-unsafe
+ characters.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * ltmain.sh, aclocal.m4: Upgrade to libtool 1.4.3. Libtool 1.5
+ has been out for a while now, but it can wait until after Wget 1.9
+ is released.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * install-sh, mkinstalldirs: Updated from Autoconf 2.57.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Explain new --restrict-file-names
+ semantics.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Explain how --tries works by
+ default.
+
+2003-09-17 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * config.sub: Ditto.
+
+ * config.guess: Updated from Autoconf 2.57.
+
+2003-09-17 Aurelien Marchand <artaxerxes@users.sf.net>
+
+ * src/ftp.h: Added OS400 system in enum
+ * src/ftp-basic.c: recognize OS400 systems
+ * src/ftp.c: don't prepend the CWD if talking to OS400, since it
+ breaks the change in library
+
+2003-09-16 Noel Kothe <noel@debian.org>
+
+ * doc/wget.texi (Download Options): Fix misspelling.
+
+2003-09-16 Mauro Tortonesi <mauro@deepspace6.net>
+
+ * configure.in, aclocal.m4: Added proper IPv6 detection.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * util/dist-wget: Fixed portable echo checking under Bash.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (wtimer_sys_diff): Convert the time difference to signed
+ __int64, then to double. This works around MS VC++ 6 which can't
+ convert unsigned __int64 to double directly.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_file_name): Don't reallocate FNAME if the file
+ doesn't exist, as is usually the case.
+
+ * src/utils.c (unique_name): New flag allow_passthrough.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/http.c (post_file): Don't pad the file if it's not large
+ enough. Bail out instead.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/Makefile.in (clean): Also remove the core.<number> files
+ produced by recent Linux systems.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi: Set the man page title to a string more descriptive
+ than "Wget manual".
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/Makefile.in ($(TEXI2POD)): Update only the #! line.
+
+ * doc/texi2pod.pl: New version from Gcc.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Change AC_CHECK_FUNC(getaddrinfo...) to
+ AC_CHECK_FUNCS, which automatically defines HAVE_GETADDRINFO.
+
+2003-09-16 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * Makefile.in (all): Don't build configure.bat by default.
+
+2003-09-15 Nicolas Schodet <schodet@efrei.fr>
+
+ * doc/wget.texi (Download Options): Add link to Proxies.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/wget.h (XDIGIT_TO_XCHAR): Implement as index into a literal
+ string.
+ (XDIGIT_TO_xchar): Ditto.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c: Change the type of timer-related functions from long to
+ double, for better precision. On machines supporting gettimeofday
+ the timers now work with granularity of less than one millisecond.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (strpbrk_or_eos): Implement as a macro under Gcc.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/retr.c (get_contents): Reduce the buffer size to the amount of
+ data that may pass through for one second. This prevents long
+ sleeps when limiting bandwidth.
+
+ * src/connect.c (connect_to_one): Reduce the socket's RCVBUF when
+ bandwidth limitation to small values is requested.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/progress.c (update_speed_ring): Moved the speed ring update to a
+ separate function and documented it better.
+
+ * src/progress.c: Use `double' for most timers to support granularity
+ smaller than 1ms.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (parse_set_cookies): Fixed the parser to handle more
+ edge conditions.
+ (test_cookies): New function, contains a test suite for
+ parse_set_cookies.
+
+2003-09-15 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/cookies.c (parse_set_cookies): Allow trailing space in
+ set-cookies header. Also, allow any amount of whitespace, not
+ only one character. Allow empty set-cookies header without
+ spewing an error.
+
+2003-09-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/utils.c (wtimer_sys_set): Extracted the code that sets the
+ current time here.
+ (wtimer_reset): Call it.
+ (wtimer_sys_diff): Extracted the code that calculates the
+ difference between two system times here.
+ (wtimer_elapsed): Call it.
+ (wtimer_elapsed): Don't return a value smaller than the previous
+ one, which could previously happen when system time is set back.
+ Instead, reset start time to current time and note the elapsed
+ offset for future calculations. The returned times are now
+ guaranteed to be monotonically nondecreasing.
+
+2003-09-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (append_uri_pathel): Use opt.restrict_file_names when
+ calling file_unsafe_char.
+
+ * src/init.c: New command restrict_file_names.
+
+ * src/main.c (main): New option --restrict-file-names[=windows,unix].
+
+ * src/url.c (url_file_name): Renamed from url_filename.
+ (url_file_name): Add directory and hostdir prefix here, not in
+ mkstruct.
+ (append_dir_structure): New function, does part of the work that
+ used to be in mkstruct. Iterates over path elements in u->path,
+ calling append_uri_pathel on each one to append it to the file
+ name.
+ (append_uri_pathel): URL-unescape a path element and reencode it
+ with a different set of rules, more appropriate for handling of
+ files.
+ (file_unsafe_char): New function, uses a lookup table to decide
+ whether a character should be escaped for use in file name.
+ (append_string): New utility function.
+ (append_char): Ditto.
+ (file_unsafe_char): New argument restrict_for_windows, decide
+ whether Windows file names should be escaped in run-time.
+
+ * src/connect.c: Include <stdlib.h> to get prototype for abort().
+
+2003-09-14 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Document the new option
+ --restrict-file-names and the corresponding wgetrc command.
+
+2003-09-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c: New command dns_cache.
+
+ * src/main.c (main): New option --dns-cache[=off].
+
+2003-09-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_boolean): Accept yes/no along with on/off.
+ (cmd_lockable_boolean): Ditto.
+
+2003-09-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/host.c (lookup_host): Print the result of the DNS lookup.
+
+2003-09-10 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * doc/wget.texi (Download Options): Documented new option --dns-cache.
+
+2003-09-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (url_parse): Return an error if the URL contains a [...]
+ IPv6 numeric address and we don't support IPv6.
+
+2003-09-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/config.h.in: Initialize HAVE_GETADDRINFO and ENABLE_IPV6.
+
+ * src/all: Use #ifdef ENABLE_IPV6 instead of the older INET6. Use
+ HAVE_GETADDRINFO for getaddrinfo-related stuff.
+
+2003-09-09 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in, aclocal.m4: Added configure check for IPv6 and
+ getaddrinfo. From Daniel Stenberg.
+
+2003-09-05 Mauro Tortonesi <mauro@deepspace6.net>
+
+ src/url.c: added RFC 2732 compliance for URL parsing. The
+ functions is_*_address valid are a modified version of
+ glibc 2.3.2 inet_pton's code.
+
+2003-09-05 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
+
+ * configure.in: Additional M4 quoting.
+
+2003-09-05 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/url.c (is_valid_ipv6_address): Modified to not require
+ zero-terminated strings.
+ (is_valid_ipv4_address): Ditto.
+
+2003-09-04 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * aclocal.m4, configure.in: Made them work under Autoconf 2.5x.
+
+2003-09-03 Ahmon Dancy <dancy@dancysoft.com>
+
+ * src/main.c init.c options.h: Added --retry-connrefused option so
+ that Connection Refused failures are treated as non-fatal (when
+ trying to retrieve from busy servers).
+
+ * src/wget.h: New CONNECT_ERROR macro for encapsulating this
+ modification.
+
+ * src/ftp.c http.c : Use CONNECT_ERROR macro in places where
+ ECONNREFUSED was checked.
+
+2003-03-09 Nicolas Schodet <contact@ni.fr.eu.org>
+
+ * Makefile.in: Fixed bad configure.bat scrdir.
+
+2003-02-25 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * libtool.m4, ltmain.sh, config.sub, config.guess: Upgrade to
+ libtool 1.5.14.
+
+2003-02-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * configure.in: Don't check for AI_ADDRCONFIG here, it is checked
+ for in the source directly.
+
+2003-02-23 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * libtool.m4, ltmain.sh, config.sub, config.guess: Upgrade to
+ libtool 1.5.8.
+
+2003-01-11 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/ftp.c (ftp_retrieve_glob): Reject insecure filenames as determined
+ by calling new function has_insecure_name_p. This is based on a
+ patch by Red Hat.
+
+ * src/fnmatch.c (has_insecure_name_p): New function: returns non-zero
+ if filename starts with `/' or contains `../' and is therefore
+ considered insecure.
+
+ * src/fnmatch.h: Declare has_insecure_name_p().
+
+2002-08-03 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/init.c (cmd_file): Allocate RESULT correctly.
+
+2002-07-24 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * src/recur.c (retrieve_tree): Check whether downloaded_html_set is
+ non-NULL before using it.
+
+2002-05-27 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/config.h.bor: Do #define WGET_USE_STDARG.
+
+2002-05-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-parse.c (NAME_CHAR_P): Allow almost any character here.
+
+2002-05-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_set_params): Fall back to dot progress if the
+ terminal type is "emacs".
+
+2002-05-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * windows/config.h.ms: Ditto.
+
+ * windows/config.h.bor: Don't #define __STDC__.
+
+2002-05-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/log.c: Don't #undef WGET_USE_STDARG.
+
+2002-05-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * ALL: Update the license to reflect the OpenSSL exception.
+
+2002-05-16 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/url.c (schemes_are_similar_p): New function to test enumerated
+ scheme codes for similarity.
+
+ * src/url.h: Declare it.
+
+ * src/recur.c (download_child_p): Use it to compare schemes. This
+ also fixes a bug that allows hosts to be spanned (without the
+ -H option) when the parent scheme is https and the child's is
+ http or vice versa.
+
+2002-05-16 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/recur.c (download_child_p): Minor optimization to avoid an
+ unnecessary additional call to schemes_are_similar_p function.
+
+2002-05-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.c (prime_size): Store the offset of the prime number in the
+ prime table. When searching, start with the given offset.
+ (hash_table_new): Pass the pointer to ht->prime_offset to
+ prime_size.
+ (grow_hash_table): Ditto.
+ (prime_size): Make 13 the first prime to make empty hash tables
+ slightly smaller.
+
+2002-05-14 Bill Richardson <bill@riverstonenet.com>
+
+ * src/ftp.c (getftp): Don't ftruncate stdout.
+
+ * src/http.c (gethttp): Don't ftruncate stdout.
+
+2002-05-09 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/cmpt.c (strptime_internal): Synched with glibc-2.1.3.
+ (get_number): Ditto.
+ (get_alt_number): Ditto.
+ (__isleap): New function-like macro used by strptime.
+ (day_of_the_week): New function used by strptime.
+ (day_of_the_year): Ditto.
+ (__mon_yday): Now shared by mktime and strptime implementations.
+
+2002-05-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (check_domain_match): Use match_tail in case
+ insensitive mode.
+
+ * src/utils.c (match_tail): Allow the caller to specify case
+ insensitive mode.
+
+ * src/cookies.c (store_cookie): When expiry_time is 0, print it as
+ undefined, not indefinite.
+
+2002-05-07 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/cookies.c (cookie_jar_process_set_cookie): Do not store
+ discarded cookie.
+
+2002-04012 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/http.c (http_loop): Compensate for MS Windows two-second
+ granularity of file modification time when comparing timestamps.
+
+ * src/ftp.c (ftp_retrieve_list): Ditto.
+
+2002-04-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Robot Exclusion): Explain how to turn off the robot
+ exclusion support from the command line.
+ (Wgetrc Commands): Explain that the `robots' variable also takes
+ effect on the "nofollow" matching.
+
+2002-04-23 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/config.h.ms: Accounted for MSVC not defining `__STDC__' when
+ Microsoft's extensions are enabled and define it anyway (set to `1').
+ Defined some things that broke as a result of this.
+
+2002-04-21 Thomas Lussnig <thomas.lussnig@bewegungsmelder.de>
+
+ * src/gen_ssl.c:
+ - allow checking of server cert
+ - allow defining client cert type
+ - allow limit of ssl protocol
+ - check more return values
+ - added debug message on break
+
+2002-04-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (download_child_p): Revert order of items in check
+ number 6 for clarity.
+
+2002-04-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (check_domain_match): Allow cookies to be set for
+ subdomains of unknown top-level domains under some circumstances.
+
+2002-04-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c: Ditto.
+
+ * src/main.c: Ditto.
+
+ * src/http.c: Use the new interface.
+
+ * src/cookies.c: Provide an OO-style "cookie jar" interface to enable
+ separate cookie jars.
+
+ * src/http.c (http_atotm): Declare argument as const.
+
+2002-04-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (cookie_new): Default to PORT_ANY.
+ (find_cookie_chain_exact): Only search by DOMAIN.
+ (find_matching_cookie): Also check that PORT matches.
+ (store_cookie): Only match the domain.
+ (set_cookie_header_cb): When a cookie "fakes" a domain, assume it
+ is valid for that host rather than discarding it completely.
+ (find_matching_chains): Don't search by PORT.
+ (matching_cookie): Also match PORT.
+ (load_cookies): Set the port if specified, otherwise leave it as
+ ANY.
+ (save_cookies_mapper): Save the port if specified, otherwise leave
+ it empty.
+
+2002-04-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/de.po: Updated from the TP.
+
+2002-04-19 Thomas Lussnig <thomas.lussnig@bewegungsmelder.de>
+
+ * src/init.c: The option `egdfile' was not in sort order.
+
+2002-04-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): If Content-Type is not given, assume
+ text/html.
+
+2002-04-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Treat directories that begin with <letter>: as
+ absolute.
+ (getftp): Strip trailing slashes from con->id before merging it
+ with TARGET.
+
+2002-04-15 Ian Abbott <abbotti@mev.co.uk>
+
+ Makefile.in: Updated several dependencies for object files to take
+ account of nested include files.
+
+2002-04-15 Ian Abbott <abbotti@mev.co.uk>
+
+ Makefile.in: The target `connect$o' (connect.o) now depends on
+ `utils.h'
+
+2002-04-15 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/host.c (SET_H_ERRNO): New function-like macro to set `h_errno'.
+ (gethostbyname_with_timeout): Use it.
+
+ * src/utils.c: Don't define `SETJMP()', `run_with_timeout_env' or
+ `abort_run_with_timeout()' when `USE_SIGNAL_TIMEOUT' is undefined.
+
+2002-04-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (download_child_p): Don't ignore rejection of HTML
+ documents that are themselves leaves of recursion.
+
+2002-04-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (getaddrinfo_with_timeout): New function.
+ (gethostbyname_with_timeout): Ditto.
+ (lookup_host): Use them.
+
+2002-04-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Editing the Project-Id-Version to say "wget" rather
+ than "GNU Wget".
+
+2002-04-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Download Options): Fix the documentation of
+ `--progress'.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (number_to_string): Handle the case when n < -INT_MAX.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Make sure that POST is not honored for
+ redirections.
+
+ * src/http.c (gethttp): Send the POST data when requested.
+ (post_file): New function.
+ (gethttp): Use it.
+
+ * src/main.c (main): Ditto.
+
+ * src/init.c: Add new options.
+
+ * src/options.h (struct options): New options post_data and
+ post_file_name.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (print_help): Document `--post-data' and `--post-file'.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (comind): Use a marginally faster implementation of
+ binary search. To quote Martin Buchholz, "a nanosecond saved is a
+ nanosecond earned."
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Ditto.
+
+ * src/retr.c (retrieve_url): Initialize variables to appease the
+ compiler.
+
+ * src/gen_sslfunc.c (ssl_iread): Don't handle EINTR when calling
+ select_fd.
+ (ssl_iwrite): Ditto.
+
+ * src/connect.c (select_fd): Rewrite to handle EINTR. Set errno to
+ ETIMEDOUT in case of timeout.
+ (iread): No need to handle EINTR when calling select_fd.
+ (iwrite): Ditto.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (connect_with_timeout): Firing SIGALRM can result in
+ connect() exiting with EINTR. Treat EINTR the same as ETIMEDOUT.
+
+2002-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Wgetrc Commands): Document `--limit-rate'.
+
+2002-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (getproxy): Accept a struct url argument. This obviates
+ the need for USE_PROXY_P.
+
+ * src/retr.c (retrieve_url): Allow proxy to be a non-FTP URL.
+
+ * src/ftp.c (getftp): Recognize FWTK-style proxy.
+
+2002-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (connect_with_timeout): Use it.
+
+ * src/utils.c (run_with_timeout): New function.
+
+2002-04-12 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/config.h.bor: Account for Borland not defining `__STDC__'
+ when Borland's extensions enabled, and define it anyway.
+
+2002-04-12 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/Makefile.src.bor: Removed pre-compiled header options as
+ they increase build time (on my machine).
+
+2002-04-12 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/utils.c (has_html_suffix_p): New function to test filename for
+ common html extensions.
+
+ * src/utils.h: Declare it.
+
+ * src/http.c (http_loop): Use it instead of previous test.
+
+ * src/retr.c (retrieve_url): Ditto.
+
+ * src/recur.c (download_child_p): Ditto.
+
+2002-04-12 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/Makefile.in: Specify libtool mode explicitly when linking.
+
+2002-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (connect_with_timeout): New function.
+ (connect_to_one): Use it.
+
+ * src/config.h.in: Add stubs for HAVE_SIGSETJMP, HAVE_SIGBLOCK, and
+ HAVE_SETJMP_H.
+
+2002-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Only define _VA_LIST when compiled with gcc.
+
+2002-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Define _VA_LIST on Solaris to prevent stdio.h from
+ declaring va_list.
+ From Kevin Rodgers <kevinr@ihs.com>.
+
+2002-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for <setjmp.h>. Check for sigsetjmp and
+ sigblock.
+
+2002-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (url_filename): Use compose_file_name regardless of
+ whether opt.dirstruct is set.
+ (mkstruct): Don't handle the query and the reencoding of DIR; that
+ is done in compose_file_name.
+
+2002-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (struct progress_implementation): Use PARAMS when
+ declaring the parameters of *create, *update, *finish, and
+ *set_params.
+
+ * src/netrc.c: Ditto.
+
+ * src/http.c: Reformat some function definitions so that ansi2knr can
+ read them.
+
+ * src/hash.c (struct hash_table): Use the PARAMS macro around
+ parameters in the declaration of hash_function and test_function.
+ (prime_size): Spell 2580823717UL and 3355070839UL as (unsigned
+ long)0x99d43ea5 and (unsigned long)0xc7fa5177 respectively, so
+ that pre-ANSI compilers can read them.
+ (find_mapping): Use PARAMS when declaring EQUALS.
+ (hash_table_put): Ditto.
+
+ * src/ftp.h: Wrap the parameters of ftp_index declaration in PARAMS.
+
+ * src/cookies.c (cookie_new): Use (unsigned long)0 instead of 0UL,
+ which was unsupported by pre-ANSI compilers.
+
+ From Nelson H. F. Beebe <beebe@math.utah.edu>, for the most part.
+
+2002-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_create): If INITIAL is larger than TOTAL, fix
+ TOTAL.
+ (bar_finish): Likewise.
+
+2002-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/log.c: Set WGET_USE_STDARG if __STDC__ is defined and stdarg.h
+ is present.
+
+2002-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (tag_handle_form): New function. Pick up form
+ actions and mark them for conversion only.
+
+2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h: Ditto for extern char *exec_name.
+
+ * src/options.h: Don't guard against OPTIONS_DEFINED_HERE -- it is
+ perfectly legal to follow an `extern' with a non-`extern' ones,
+ provided the types match.
+
+ * src/main.c: Don't define OPTIONS_DEFINED_HERE.
+
+2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (create_image): Revert to calculating ETA based on
+ average download speed.
+ (create_image): Don't print ETA until the download has been active
+ for at least 3 seconds.
+ (create_image): When ETA is not available, don't print anything.
+ The previous version would print --:--.
+
+2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_update): Keep updating a subinterval until it
+ reaches or exceeds a watermark. That way the measurement will be
+ guaranteed to span a configurable minimum of time. The current
+ default is 3s in 30 100ms intervals.
+
+2002-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Warn about the dangers of specifying passwords on the
+ command line and in unencrypted files.
+
+2002-04-09 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/config.h.bor: define `HACK_BCC_UTIME_BUG'. Define `utime'
+ as `borland_utime' if `HACK_BCC_UTIME_BUG' is defined.
+
+2002-04-09 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/mswindows.c (borland_utime): New function conditionally defined
+ when `HACK_BCC_UTIME_BUG' is defined. A reimplementation of
+ `utime()' as Borland's `utime()' function is broken on Windows 9x
+ systems. (Original patch by Chin-yuan Kuo <sr1111111@yahoo.com.tw>.)
+
+2002-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_update): Maintain an array of the time it took
+ to perform previous 30 network reads.
+ (create_image): Calculate the download speed and ETA based on the
+ last 30 reads, not the entire download.
+ (create_image): Make sure that the ETA is not changed more than
+ once per second.
+
+2002-04-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop): Propagate the result of ftp_retrieve_glob.
+
+2002-03-26 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/wget.dep: Updated several dependencies for object files.
+
+2002-03-26 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/Makefile.in: Updated several dependencies for object files.
+
+2002-03-20 Ian Abbott <abbotti@mev.co.uk>
+
+ * windows/config.h.bor:
+ * windows/config.h.ms:
+ Removed conditional cruft that was there for Unix-like systems.
+
+2002-03-20 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/mswindows.c: Include "utils.h".
+
+2002-03-20 Ian Abbott <abbotti@mev.co.uk>
+
+ * * windows/wget.dep: Fix dependencies for target mswindows$o
+ (mswindows.obj)
+
+2002-03-19 Chin-yuan Kuo <sr1111111@yahoo.com.tw>
+
+ * configure.bat.in: Do not check %BORPATH% as C++Builder compiler
+ does not use it.
+
+ * windows/Makefile.src.bor:
+ * windows/config.h.bor:
+ Migrated to free (as in beer) C++Builder compiler.
+
+2002-03-18 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/host.h: Don't include netdb.h on windows.
+
+2002-03-13 Ian Abbott <abbotti@mev.co.uk>
+
+ * configure.bat: Removed (renamed to configure.bat.ini).
+
+ * configure.bat.in: New (renamed from configure.bat).
+
+ * Makefile.in: Add rule to copy configure.bat.in to configure.bat,
+ converting line endings to MS-DOS format in the process.
+
+2002-02-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (url_parse): Don't treat '?' as query string separator
+ when parsing FTP URLs.
+
+2002-02-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Handle the case when start_url doesn't
+ parse.
+
+2002-02-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.h: Include Unix-specific includes #ifndef WINDOWS.
+ Patch originally provided by Christian Lackas.
+
+2002-02-19 Andreas Damm <andreas-sourceforge@radab.org>
+
+ * src/wget.h (DO_REALLOC_FROM_ALLOCA): Multiply with sizeof(type) when
+ calling xmalloc and memcpy.
+
+2002-02-19 Alan Eldridge <alane@geeksrus.net>
+
+ * src/host.h: Also include <netinet/in.h> and <sys/socket.h>.
+
+ * src/ftp-basic.c: Also include <netinet/in.h>.
+
+2002-02-11 Christian Lackas <delta@lackas.net>
+
+ * src/recur.c: recurive downloading for https fixed.
+
+2002-02-05 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/http.c (gethttp): when -c used, mark already fully retrieved
+ file as successfully retrieved.
+
+2002-02-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (tag_handle_meta): Don't crash on <meta
+ http-equiv=refresh> where content is missing.
+
+2002-01-31 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * src/ftp-basic.c, host.c: don't include sys/socket.h, arpa/inet.h,
+ netdb.h on windows.
+
+2002-01-30 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Remove redirection cycle detection. This
+ is because some sites legitimately redirect the user back to the
+ same location, e.g. after an authorization check performed by
+ another page. MAX_REDIRECTIONS is still used to prevent infinite
+ redirection loops.
+
+2002-01-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (urlchr_table): Make square braces reserved, so we can
+ parse http://[::1]/.
+ (url_parse): Handle host in braces.
+ (url_string): If url->host contains colons, wrap it in braces.
+
+2002-01-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (url_parse): Allow all hex digits, not only decimal ones,
+ to form an IP address.
+
+2002-01-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Wrap host name in square brackets if it
+ contains a colon.
+
+2002-01-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/source: Integrated IPv6 support.
+ Written by Thomas Lussnig <thomas.lussnig@bewegungsmelder.de>.
+
+2002-01-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (lookup_host): Use sizeof(ip4_address) to calculate the
+ offset.
+ (address_list_new): Use map_ipv4_to_ip.
+ (wget_sockaddr_set_address): Convert ADDR to IPv4 before using it
+ in IPv4 context.
+
+2002-01-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (resolve_bind_address): New function.
+ (connect_to_one): Use it.
+ (bindport): Ditto.
+
+ * src/init.c: Don't resolve bind-address here.
+
+ * src/host.c (wget_sockaddr_set_address): Would bug out with ADDR == NULL.
+
+2002-01-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/netrc.c (parse_netrc): Skip leading whitespace before testing
+ whether the line is empty. Empty lines still contain the line
+ terminator.
+
+2002-01-15 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/init.c (cmd_file): Change `\' to `/' for Windows (yes, really!)
+ (cmd_directory): New function. Like cmd_file(), but strips
+ trailing directory separators.
+ (commands): Change action for "dirprefix" from `cmd_file' to
+ `cmd_directory'.
+
+ * src/utils.c (make_directory): Allow intermediate `mkdir' calls to
+ fail, as not all path components that do not exist should be
+ directory components, especially under Windows.
+
+2002-01-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c (ssl_iread): Call select on the file descriptor
+ only if no data is pending in SSL buffers.
+ From tony@bluetail.com.
+
+2002-01-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * MACHINES: OS X entry by Jonathan Davis.
+
+2002-01-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (parse_uname): URL-decode *USER and *PASSWD.
+
+2002-01-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Invalidate SOCK if get_contents encountered an
+ error.
+
+2002-01-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/headers.c (header_get): Strip trailing whitespace from the
+ header.
+
+2002-01-07 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/url.c (uri_merge_1): Deal with "net path" relative URL (one that
+ starts with "//").
+
+2001-12-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8.1 is released.
+
+2001-12-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8.1-pre3 is released.
+
+2001-12-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Enqueue the canonical representation of
+ start_url, so that the test against dl_url_file_map works.
+
+2001-12-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/log.c (logputs): Check for requested verbosity before printing
+ anything.
+
+2001-12-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (tag_handle_link): Treat the "shortcut icon" link as
+ inline.
+
+2001-12-19 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: add gen-md5.obj and progress.obj to the
+ list of "sources"
+
+ * configure.bat: add section for Watcom
+
+2001-12-18 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/recur.c (retrieve_tree): Pass on referring URL when retrieving
+ recursed URL.
+
+2001-12-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Make a copy of file obtained from
+ dl_url_file_map because the code calls xfree(file) later.
+
+2001-12-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (register_html): Maintain a hash table of HTML files
+ along with the list. Disallow duplicates.
+ (retrieve_tree): Use downloaded_html_set to check whether the file
+ found in dl_url_file_map is an HTML file, and descend into it if
+ so.
+ (convert_all_links): Don't guard against duplicates in
+ downloaded_html_list, since they are no longer possible.
+
+2001-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8.1-pre2 is released.
+
+2001-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (sleep_between_retrievals): Simplify indentation.
+
+2001-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c (ssl_init_prng): Use random_number to get a byte
+ of "randomness" at a time.
+ (ssl_init_prng): Don't seed the PRNG; random_number will do that.
+
+ * src/retr.c (sleep_between_retrievals): Use it. Make sure that the
+ random amount averages in opt.wait.
+ (sleep_between_retrievals): Don't seed the PRNG; random_number
+ will do that.
+
+ * src/utils.c (random_number): New function.
+
+2001-12-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Wgetrc Commands): Undocument simple_host_check.
+
+2001-12-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (path_simplify): Move here from utils.c, and make static.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8.1-pre1 is released.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/res.c (matches): Fix broken URL in the docstring.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (register_download): Don't abort when one URL references
+ two different files.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (wgetrc_file_name): Print correct message when loading
+ getenv("WGETRC") fails.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Check for conn->scheme, not u->scheme, before
+ calling ssl_iwrite.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (tag_url_attributes): Mark <embed href=...> as
+ external.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/ja.po: Ditto.
+
+ * po/sv.po: Ditto.
+
+ * po/de.po: Ditto.
+
+ * po/es.po: Ditto.
+
+ * po/fr.po: Ditto.
+
+ * po/et.po: Ditto.
+
+ * po/tr.po: Ditto.
+
+ * po/ru.po: Update from TP.
+
+2001-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Robots): Fix broken URLs that point to the webcrawler
+ web site.
+
+2001-12-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (get_urls_file): Cosmetic changes.
+
+2001-12-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (collect_tags_mapper): Break into several functions.
+ (tag_url_attributes): Collect <embed href=...>.
+
+2001-12-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (append_one_url): Resurrect warning when unable to
+ resolve a relative link.
+
+2001-12-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Autodetect SSL. Check for SSL includes too.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c: New type ipv4_address. Use it consistently instead of
+ `unsigned char[4]' and `unsigned char *'.
+ (pretty_print_address): Accept a `const void *', to require even
+ less casting.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Fix obvious memory leaks.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (HTTP Options): Explain how to make IE produce a
+ `cookies.txt'-compatible file.
+ Reported by Herold Heiko.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/texi2pod.pl.in: Handle @asis in table.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for md5_calc rather than MD5Update when
+ looking for Solaris md5.
+
+2001-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * config.sub: Ditto.
+
+ * config.guess: Ditto.
+
+ * aclocal.m4: Ditto.
+
+ * ltmain.sh: Upgrade to libtool 1.4.2.
+
+2001-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (path_simplify): Rewrite, with better comments, and
+ without the use of strcpy to move overlapping blocks.
+
+2001-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (path_simplify): Correctly handle the unlikely case that
+ b starts out as path + 1.
+
+2001-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (long_to_string): Return a pointer after where the
+ number ends.
+ (long_to_string): Rename to number_to_string.
+
+2001-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Initialize progress after fork_to_background, so
+ that it knows when to use dots.
+
+ * src/mswindows.c (ws_hangup): Call log_request_redirect_output.
+
+ * src/utils.c (fork_to_background): Print the PID of the child
+ process.
+
+ * src/log.c (log_request_redirect_output): Set a flag that output
+ redirection has been requested. Doing anything else in a signal
+ handler is unsafe.
+ (check_redirect_output): New function: check whether redirection
+ has been requested and, if so, call redirect_output().
+ (logputs): Call check_redirect_output.
+ (logprintf): Ditto.
+ (debug_logprintf): Ditto.
+ (redirect_output): Print clearer messages.
+
+ * src/main.c (redirect_output_signal): Don't call
+ redirect_output_signal directly. Instead, call
+ log_request_redirect_output.
+
+ * src/utils.c (memfatal): Ditto.
+
+ * src/progress.c (display_image): Use it.
+
+ * src/log.c (log_set_save_context): New function: allow the caller to
+ turn off saving log context lines.
+
+2001-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (address_list_set_faulty): Uncomment a sanity check.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8 is released.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (reencode_string): Declare static.
+
+ * src/res.c (registered_specs): Declare static.
+
+ * src/progress.c (current_impl_locked): Declare static.
+
+ * src/log.c (flush_log_p): Declare static.
+ (needs_flushing): Ditto.
+
+ * src/http.c (digest_authentication_encode): Declare static.
+
+ * src/html-url.c (init_interesting): Declare static.
+
+ * src/host.c (host_name_addresses_map): Declare static.
+
+ * src/cookies.c (find_matching_chains): Declare static.
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Warn about the memory leak
+ indicated by lint.
+
+ * src/utils.c (path_simplify): Remove unused variable STUB_CHAR.
+
+ * src/host.c (address_list_set_faulty): Document that INDEX is
+ currently unused.
+
+ * src/url.c (rewrite_shorthand_url): Remove unused variable PATH.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (create_image): Fix ETA padding when hours are prined.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Remove stray debugging message.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (cmd_spec_progress): Resurrect. Check whether VAL is a
+ valid progress type before setting it.
+
+2001-12-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Bump version to 1.8.
+
+2001-12-08 R.I.P. Deaddog <maddog@linuxhall.org>
+
+ * po/zh_TW.po: Updated for 1.8.
+
+2001-12-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8-pre2 is released.
+
+2001-12-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/tr.po: Ditto.
+
+ * po/sv.po: Ditto.
+
+ * po/ru.po: Ditto.
+
+ * po/fr.po: Ditto.
+
+ * po/es.po: Ditto.
+
+ * po/de.po: Update from TP.
+
+2001-12-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (HTTP Options): Provide more specific information
+ about how --load-cookies is meant to be used.
+
+2001-12-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/texi2pod.pl: Include the EXAMPLES section.
+
+ * doc/wget.texi (Overview): Shorten the man page DESCRIPTION.
+ (Examples): Redo the Examples chapter. Include it in the man
+ page.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8-pre1 is released.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (read_whole_line): Handle lines beginning with \0.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (scheme_disable): New function.
+
+ * src/main.c (main): Call ssl_init_prng from here rather than from
+ init_ssl, so that it has a chance to disable support for https
+ before a URL has been resolved.
+
+ * src/gen_sslfunc.c (ssl_init_prng): Seed with rand() if all else
+ failed.
+ (ssl_init_prng): Disable support for https if seeding the PRNG
+ fails.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (progress_handle_sigwinch): Set up the signal again.
+
+ * src/utils.c: Include <sys/termios.h>, where Solaris defines
+ TIOCGWINSZ.
+
+ * src/progress.c (bar_create): Don't use the last column on the screen.
+ (create_image): Pad ETA to constant size. Pad SIZE to nine digits
+ only until it exceeded them.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (progress_create): Make sure that, when the output is
+ redirected, the progress implementation gets changed to the
+ fallback one.
+ (bar_set_params): Set current_impl_locked to 1 when "force" is
+ specified.
+ (progress_create): Don't change the progress implementation if
+ current_impl_locked is non-zero.
+
+ * src/main.c (redirect_output_signal): Call
+ progress_schedule_redirect.
+
+ * src/progress.c (progress_schedule_redirect): New function.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/log.c (logvprintf): Restructure to allow being called multiple
+ times.
+ (logprintf): Call logvprintf in a loop.
+ (debug_logprintf): Ditto.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c (ssl_init_prng): Make the printed message
+ translatable.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c (ssl_init_prng): Allow the user to disable EGD by
+ setting egd_file it to empty string.
+
+ * src/main.c (main): Change the option name from --sslegdsock to
+ --egd-file.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/et.po: Update from the TP.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/de.po: Ditto.
+
+ * po/fr.po: Ditto.
+
+ * po/tr.po: Ditto.
+
+ * po/sv.po: Ditto.
+
+ * po/et.po: Update from TP.
+
+ * po/hu.po: New file from TP.
+
+2001-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for <termios.h>
+
+2001-12-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (path_simplify): Document with test cases.
+
+2001-12-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (convert_all_links): Guard against duplicates in
+ downloaded_html_files.
+ (register_download): Don't invalidate similar-looking URLs.
+ (match_except_index): New function.
+
+2001-12-04 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/snprintf.c (dopr): Use `unsigned int' as the second argument to
+ va_arg when casting to `unsigned short' is intended.
+
+2001-12-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (local_quote_string): Reenable quoting of question marks,
+ but only when `--html-extension' is used.
+
+2001-12-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Check whether the URL was already
+ downloaded before downloading it again.
+ (descend_child_p): Renamed to download_child_p.
+ (register_download): When one URL is downloaded to a file already
+ "owned" by another URL, delete all references that map any URL to
+ that file.
+ (register_delete_file): New function.
+ (retrieve_tree): Use it after deleting a file.
+
+ * src/url.c (url_parse): Re-canonicalize the URL also if the path is
+ empty, so that e.g. "http://www.server.com" ->
+ "http://www.server.com/".
+ (lowercase_str): Use ISUPPER instead of !ISLOWER.
+
+ * src/retr.c (retrieve_url): Use the canonical URL form when calling
+ register_download().
+
+2001-12-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c: Ditto.
+
+ * src/rbuf.c: Include <string.h>.
+
+2001-12-04 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows\Makefile.src: add gen_sslfunc.c
+
+ * windows\Makefile.src.bor: ditto.
+
+2001-12-04 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * src/gen_sslfunc.c: on windows provide ssl crypto random
+ initialization through RAND_screen(); could possibly
+ be not enough for strong ssl communication (see the
+ relevant manual page from the openssl package).
+
+2001-12-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8-beta3 is released.
+
+2001-12-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/snprintf.c (dopr): Replace `short int' and `unsigned short int'
+ with `int' when using it as the second argument to `va_arg'.
+
+2001-12-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/snprintf.c (dopr): Cast the result of va_arg to short int and
+ short unsigned int where these types are expected to be used.
+
+2001-12-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (address_list_new_one): New function.
+ (lookup_host): Use it.
+
+2001-12-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp-basic.c (ftp_port): Don't return HOSTERR if we fail getting
+ the socket data.
+
+ * src/ftp.c: Ditto.
+
+ * src/http.c: No need to declare h_errno.
+
+ * src/host.c: Declare h_errno.
+
+2001-12-03 Andre Majorel <amajorel@teaser.fr>
+
+ * src/host.c (lookup_host): Don't initialize TMPSTORE directly because
+ it's not legal C.
+
+2001-12-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8-beta2 is released.
+
+2001-12-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (file_merge): If BASE doesn't contain a slash, just
+ return a copy of FILE.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.8-beta1 is released.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (url_full_path): Document better.
+
+ * src/http.c (gethttp): Use the full path when creating digest
+ authorization.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (replace_attr_refresh_hack): New function.
+ (convert_links): Call replace_attr_refresh_hack for Refresh
+ links. It will add the "TMOUT; URL=" junk before the link.
+
+ * src/html-url.c (collect_tags_mapper): Set ID to the ID of the
+ "content" attribute, not "http-equiv".
+ (collect_tags_mapper): Don't use OFFSET to hack the raw_* values;
+ instead, store the information that this entry belongs to a
+ "refresh" link.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (get_urls_file): If opt.base_href is specified, merge each
+ URL with the base.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Allow -p retrievals to exceed maximum
+ depth by more than one.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (print_help): Don't document the removed `-nh'.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): When PWD fails, assume "/".
+
+ * src/ftp-basic.c (ftp_syst): Fix indentation.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (path_matches): Return 0 if PREFIX doesn't begin with
+ '/'.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (path_matches): FULL_PATH doesn't begin with '/', but
+ PREFIX does.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (check_domain_match): Reimplement to match Netscape's
+ "preliminary specification" for cookies.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Updated Croatian translation.
+
+2001-12-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Update the manual with the new recursive retrieval
+ stuff.
+
+2001-11-30 T. Bharath <TBharath@responsenetworks.com>
+
+ * src/http.c (persistent_available_p): Call SHUTDOWN_SSL if
+ test_socket_open fails.
+
+2001-11-30 Ingo T. Storm <tux-sparc@computerbild.de>
+
+ * doc/sample.wgetrc: Document ftp_proxy, too.
+
+2001-11-30 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Don't allow more than 20 redirections.
+
+2001-11-30 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): Skip the non-inline entries when
+ enqueuing the children of a leaf HTML node in -p mode.
+ (descend_url_p): Ignore opt.no_parent when in -p mode and UPOS is
+ "inline".
+
+ * src/html-url.c (get_urls_html): Don't accept dash_p_leaf_HTML.
+ (collect_tags_mapper): When an entry is "inline", mark it as such.
+
+ * src/recur.c (descend_url_p): Fix test when checking for
+ acceptance/rejection rules.
+
+2001-11-30 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (display_image): Just print one CR to reset the
+ cursor position.
+
+2001-11-30 Christian Fraenkel <c.fraenkel@gmx.net>
+
+ * src/init.c: New command `ssl_egd_sock'.
+
+ * src/main.c (main): New option `--sslegdsock'.
+
+ * src/gen_sslfunc.c (ssl_init_prng): Seed the RNG using EGD.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (descend_url_p): When resolving no_parent, compare with
+ start_url, not parent url. Otherwise link from /a/b/ to /a/c/
+ wouldn't be followed, although the download started from /a/.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_process_range): Accept the broken output of
+ "JavaWebServer/1.1.1".
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (address_list_new): Initialize al->faulty.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/headers: Guard against header files being included twice.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen-md5.c: Use unsigned char * as the buffer argument to
+ gen_md5_update.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.h: Declare select_fd.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cmpt.c (memmove): Include a simple memmove implementation.
+
+2001-11-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Use SSL's MD5 if we're compiling with SSL anyway.
+
+2001-11-28 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (dot_set_params): If PARAMS is unspecified, use
+ dot_style, if available.
+
+ * src/init.c: Ditto.
+
+ * src/main.c (main): Resurect --dot-style.
+
+ * src/progress.c (dot_finish): Print the quantity if we're left at the
+ beginning of a row.
+
+2001-11-27 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/retr.c (retrieve_from_file): Initialize `new_file' to NULL to
+ prevent seg fault.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): Don't translate %d-%d.
+
+ * src/main.c (print_help): Remove stray HAVE_RANDOM code.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c: Change the default progress implementation to "bar".
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_create): Print two newlines.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Improve output after sending PASV. Don't
+ attempt to "look up" the IP address we already know; call
+ connect_to_one directly.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (connect_to_many): Use address_list_set_faulty to
+ prevent the faulty address from being reused.
+
+ * src/host.c (address_list_set_faulty): New function.
+ (address_list_get_bounds): New function, instead of
+ address_list_count.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cmpt.c (random): Removed.
+
+ * src/retr.c (sleep_between_retrievals): Use the more portable rand()
+ instead of random().
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cmpt.c (random): New function, a simple-minded replacement for
+ random() on systems that don't have it.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Updated.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Don't check for random.
+
+2001-11-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for random.
+
+2001-11-26 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/http.c (gethttp): fix undeclared variable 'err' when compiled
+ with HAVE_SSL.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (retrieve_tree): In case of followed redirection,
+ blacklist the pre-redirection URL.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (descend_redirect_p): New function.
+ (retrieve_tree): Make sure redirections are not blindly followed.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c: Don't allocate new timers; use the timing data
+ propagated from the caller.
+
+ * src/retr.c (get_contents): Allocate and use a timer.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (last_host_ip): Made into an address_list.
+ (invalidate_persistent): Release pc_last_host_ip.
+ (register_persistent): Use lookup_host.
+ (persistent_available_p): Check for equality of hosts using
+ address_list_match_all. Call address_list_release.
+ (http_cleanup): New function.
+
+ * src/ftp.c (getftp): Use lookup_host and connect_to_many.
+
+ * src/http.c (gethttp): Use lookup_host and connect_to_many.
+
+ * src/connect.c (make_connection): Removed.
+ (connect_to_one): New function.
+ (connect_to_many): Ditto.
+ (set_connection_host_name): Ditto.
+
+ * src/host.c (lookup_host): New function; new return type.
+ (address_list_new): New function.
+ (address_list_count): Ditto.
+ (address_list_copy_one): Ditto.
+ (address_list_delete): Ditto.
+ (address_list_release): Ditto.
+ (pretty_print_address): Ditto.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Put a HAVE_USLEEP stub.
+
+ * src/cmpt.c (usleep): Replacement implementation of usleep using
+ select.
+
+ * src/init.c: New option init_rate.
+
+ * src/main.c (main): New option --limit-rate.
+
+ * src/retr.c (limit_bandwidth): New function.
+ (get_contents): Call it to limit the bandwidth used when
+ downloading.
+
+ * src/progress.c (dot_update): Would print the wrong download speed on
+ rows other than the first one when the download was continued.
+ (dot_finish): Ditto.
+
+2001-11-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for usleep.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * util/dist-wget: New file: the script used for building Wget.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (reencode_string): Use unsigned char, not char --
+ otherwise the hex digits come out wrong for 8-bit chars such as
+ nbsp.
+ (lowercase_str): New function.
+ (url_parse): Canonicalize u->url if needed.
+ (get_urls_file): Parse each URL, and return only the valid ones.
+ (free_urlpos): Call url_free.
+ (mkstruct): Add :port if the port is non-standard.
+ (mkstruct): Append the query string to the file name, if any.
+ (urlpath_length): Use strpbrk_or_eos.
+ (uri_merge_1): Handle the cases where LINK is an empty string,
+ where LINK consists only of query, and where LINK consists only of
+ fragment.
+ (convert_links): Count and report both kinds of conversion.
+ (downloaded_file): Use a hash table, not a list.
+ (downloaded_files_free): Free the hash table.
+
+ * src/retr.c (retrieve_from_file): Ditto.
+
+ * src/main.c (main): Call either retrieve_url or retrieve_tree
+ for each URL, not both.
+
+ * src/retr.c (register_all_redirections): New function.
+ (register_redirections_mapper): Ditto.
+ (retrieve_url): Register the redirections.
+ (retrieve_url): Make the string "Error parsing proxy ..."
+ translatable.
+
+ * src/res.c (add_path): Strip leading slash from robots.txt paths so
+ that the path representations are "compatible".
+ (free_specs): Free each individual path, too.
+ (res_cleanup): New function.
+ (cleanup_hash_table_mapper): Ditto.
+
+ * src/recur.c (url_queue_new): New function.
+ (url_queue_delete): Ditto.
+ (url_enqueue): Ditto.
+ (url_dequeue): Ditto.
+ (retrieve_tree): New function, replacement for recursive_retrieve.
+ (descend_url_p): New function.
+ (register_redirection): New function.
+
+ * src/progress.c (create_image): Cosmetic changes.
+
+ * src/init.c (cleanup): Do all those complex cleanups only if
+ DEBUG_MALLOC is defined.
+
+ * src/main.c: Removed --simple-check and the corresponding
+ simple_host_check in init.c.
+
+ * src/html-url.c (handle_link): Parse the URL here, and propagate the
+ parsed URL to the caller, who would otherwise have to parse it
+ again.
+
+ * src/host.c (xstrdup_lower): Moved to utils.c.
+ (realhost): Removed.
+ (same_host): Ditto.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): Handle CO_NULLIFY_BASE.
+
+ * src/recur.c (retrieve_tree): Ignore download-ignorable children.
+ (convert_all_links): Specify CO_NULLIFY_BASE when link_base_p.
+
+ * src/html-url.c (handle_link): Return the newly created urlpos.
+ (collect_tags_mapper): When dealing with BASE, store the base
+ reference and mark it as download-ignorable.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): Attempt to quote '?' as "%3F" when
+ linking to local files. Given up on the attempt, as it breaks
+ local browsing.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (descend_url_p): Be more conservative with blacklisting
+ URLs.
+ (convert_all_links): Print how many files have been converted, and
+ how long it took.
+
+ * src/progress.c (create_image): Place the number of downloaded bytes
+ right after the progress bar.
+
+ * src/utils.c (suffix): Return a pointer into the string.
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (dot_create): Align the "[ skipping ... ]" string
+ with the dots.
+
+ * src/retr.c (rate): Split into two functions: calc_rate and
+ retr_rate.
+
+ * src/progress.c (create_image): Draw a dummy progress bar even when
+ total size is unknown.
+ (display_image): Place the text cursor at the end of the "image".
+
+2001-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (private_initialize): Removed.
+ (main): Don't call private_initialize.
+
+ * src/http.c: Call lookup_host.
+
+ * src/host.c (host_init): Removed.
+ (add_host_to_cache): Initialize host_name_address_map here, on
+ demand.
+ (ngethostbyname): Commented out.
+
+ * src/connect.c (make_connection): Remove dead code; use lookup_host.
+
+ * src/host.c (store_hostaddress): Renamed to lookup_host and reversed
+ the args.
+ Removed host_address_name_map and host_slave_master_map.
+
+2001-11-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (path_simplify): Preserver the (non-)existence of
+ leading slash. Return non-zero if changes were made.
+
+2001-11-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): When the redirection URL doesn't parse,
+ print the correct error message rather than "UNKNOWN".
+
+2001-11-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (recursive_retrieve): Fix typo.
+
+2001-11-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_update): Don't modify bp->total_length if it is
+ zero.
+
+2001-11-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_finish): If the timer didn't record any time
+ since the download beginning, fake 1ms.
+
+2001-11-23 Lemble Gregory <gregory.lemble@st.com>
+
+ * src/gen_sslfunc.c (ssl_init_prng): New function; seed the SSL RNG.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (determine_screen_width): New function.
+
+ * src/main.c (main): New option `--progress=TYPE'.
+ (main): Implement compatibility with the old option `--dot-style'.
+
+ * src/init.c: Removed cmd_spec_dotstyle -- that logic is now in
+ dp_set_params.
+ (cmd_spec_progress): New function.
+
+ * src/retr.c (get_contents): Use the progress_* functions instead of
+ the old show_progress().
+ (show_progress): Removed.
+ (rate): Print "xxxx.xx K/s" instead of "KB/s". Ditto for MB/s,
+ etc.
+
+ * src/progress.c (set_progress_implementation): New function.
+ (valid_progress_implementation_p): Ditto.
+ (progress_create): Ditto.
+ (progress_update): Ditto.
+ (progress_finish): Ditto.
+ (dp_create): Ditto.
+ (dp_update): Ditto.
+ (dp_finish): Ditto.
+ (dp_set_params): Ditto.
+ (print_elapsed): Ditto.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c: Renamed dp_* functions to dot_* for greater clarity
+ and consistency with bar_*.
+ (print_download_speed): Get rid of the unneeded '@' character.
+ (create_image): Fix download rate geometry.
+
+ * src/progress.c (print_elapsed): Remove spurious space.
+ (print_elapsed): Renamed to print_download_speed, since that's
+ what it does.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (create_image): Don't translate "%ld ".
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_update): If the downloaded amount becomes larger
+ than the expected amount, adjust the expected amount accordingly.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/progress.c (bar_set_params): Allow the user to force the use of
+ the bar.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/wget.pot: Rebuild.
+
+ * po/POTFILES.in: Update with the new source files.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: A major overhaul.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Download Options): Document the new `--progress'
+ option.
+
+2001-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for sys/ioctl.h.
+
+2001-11-22 Jochen Hein <jochen@jochen.org>
+
+ * src/main.c (main): Split the copyright notice for easier
+ translation.
+
+2001-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * windows/Makefile.doc: Update docs generation.
+
+2001-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (path_simplify): Don't remove trailing slashes.
+
+ * src/ftp.c (ftp_get_listing): Use it.
+
+ * src/utils.c (file_merge): New function.
+
+ * src/url.c (opt_url): Removed.
+
+ * src/recur.c (recursive_retrieve): Inline "opt_url" logic.
+
+ * src/main.c (main): Use xfree(), not free().
+
+ * src/url.c (rewrite_url_maybe): Renamed to rewrite_shorthand_url.
+
+ * src/ftp.c (ccon): Move `ccon' typedef here, since it's only used
+ internally.
+
+ * src/config.h.in: Include a stub for HAVE_STRPBRK.
+
+ * src/cmpt.c (strpbrk): Include a replacement for systems without
+ strpbrk().
+
+ * src/ftp.c: Use url_set_dir and url_set_file when modifying the URL.
+
+ * src/url.c (url_set_dir): New function.
+ (url_set_file): Ditto.
+
+ * src/ftp-basic.c (ftp_process_type): Process FTP type here; the URL
+ parser makes the URL "params" available, so we can do that in this
+ function.
+
+ * src/retr.c: Ditto.
+
+ * src/ftp.c: Ditto; pass the local file information in `ccon'.
+
+ * src/http.c: Get rid of the ugly kludge that had URL being replaced
+ with the proxy URL when proxy retrieval was requested. Use a
+ separate parameter to http_loop and gethttp for the proxy URL.
+
+ * src/http.c: Changed to reflect the fact that local file, proxy, and
+ referer information are no longer stored in struct url. The local
+ file information is passed in `struct hstat' now.
+
+ * src/url.c: Reworked URL parsing to be more regular. Reencode the
+ URL using reencode_string.
+ Removed non-URL-related information from struct url. This
+ includes fields `proxy', `local', and `referer'.
+
+2001-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (show_progress): Use it.
+
+ * src/log.c (log_set_flush): New function.
+
+2001-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Proxies): Fix typo.
+ (Proxies): Sync the text with the example.
+ (Wgetrc Commands): There is no -f option. It's --follow-ftp.
+ Reported by Wojtek Kotwica.
+
+2001-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for strpbrk().
+
+2001-11-22 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Readme
+ * windows/Makefile.doc
+ Windows documentation update.
+ * windows/Makefile.src
+ Cleanup config.h
+
+2001-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (parseurl): Don't depend on the now-obsolete TYPE.
+
+2001-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c: Clean up handling of URL schemes.
+
+2001-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (getproxy): Handle URL shorthands.
+
+2001-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c: Remove --wait / --waitretry backwards compatibility
+ code.
+
+2001-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Use it.
+
+ * src/url.c (rewrite_url_maybe): New function.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.7.1 is released.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/res.c (res_register_specs): Initialize OLD and HP_OLD to appease
+ the compiler.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/md5.h: Renamed to gnu-md5.h.
+
+ * src/md5.c: Renamed to gnu-md5.c.
+
+ * src/http.c: Ditto.
+
+ * src/ftp-opie.c: Use the new macros.
+
+ * src/sysdep.h: Define md5-related macros.
+
+ * src/config.h.in: Define HAVE_SOLARIS_MD5 or HAVE_BUILTIN_MD5
+ depending on which md5 implementation is used.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Print the whole response line when printing
+ headers is requested.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/Makefile.in: Conditionally compile getopt.o.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/: Installed ja.po, et.po, he.po, fr.po, da.po, uk.po, es.po,
+ sl.po, nl.po from the Translation Project.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for getopt_long in libc.
+
+2001-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for Solaris libmd5.
+
+2001-11-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/Makefile.in (install.info): If info files from the build
+ directory are not available, use the ones from $(srcdir).
+
+2001-11-16 Peter Farmer <peter.farmer@zveno.com>
+
+ * doc/Makefile.in: Use $? instead of $<. Use TEXI2POD more
+ consistently.
+
+2001-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-parse.c (map_html_tags): Support XML-style empty tags.
+
+2001-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-parse.c (advance_declaration): Use 0x22 instead of '"' or
+ '\"'. Different compilers' assert macros are broken in different
+ ways.
+
+2001-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/headers.c (header_extract_number): Ignore trailing whitespace.
+
+2001-11-16 Chris Seawood <cls@seawood.org>
+
+ * src/init.c: Ditto.
+
+ * src/host.c: Ditto.
+
+ * src/connect.c: Ditto.
+
+ * src/sysdep.h: Support compilation under BEOS.
+
+2001-11-04 Alan Eldridge <alane@geeksrus.net>
+
+ * src/config.h.in: added HAVE_RANDOM.
+
+ * src/options.h: added random_wait to struct options.
+
+ * src/main.c (print_help [HAVE_RANDOM], main): added arg parsing, help
+ for --random-wait.
+
+ * src/retr.c (sleep_between_retrievals) [HAVE_RANDOM]: added
+ implementation of random wait times.
+
+ * src/init.c (commands): added "randomwait" keyword.
+
+2001-11-04 Alan Eldridge <alane@geeksrus.net>
+
+ * doc/wget.texi: Document --random-wait, randomwait=on/off.
+
+2001-10-31 Daniel BODEA <dali@dali-designs.com>
+
+ * src/netrc.c (search_netrc): When slack_default is 0, still look for
+ an account with matching password, just not the "default account".
+ HTTP Authorization using .netrc should now work as expected.
+
+2001-09-29 Christian Fraenkel <c.fraenkel@gmx.net>
+
+ * src/http.c (gethttp): print debug output for errors occuring during
+ the ssl handshake.
+
+2001-08-24 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/html-url.c (collect_tags_mapper): Fix bug converting links
+ with -k option for tags with multiple link attributes by
+ handling links in the order they appear.
+
+2001-08-21 Dave Turner <dct25@hermes.cam.ac.uk>
+
+ * src/ftp-basic.c (ftp_size): New function to send non-standard SIZE
+ command to server to request file size.
+ * src/ftp.h (ftp_size): Export it.
+ * src/ftp.c (getftp): Use new ftp_size function if restoring
+ transfer of a file with unknown size.
+
+2001-08-15 Ian Abbott <abbotti@mev.co.uk>
+
+ * src/ftp.c (ftp_loop_internal): Avoid a potential buffer overflow in
+ the call to the 'rate' function by moving it past the error
+ checking for the 'getftp' function return value.
+
+2001-06-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h (DO_REALLOC_FROM_ALLOCA): Set SIZEVAR after the memcpy()
+ call because it needs the old value.
+
+2001-06-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h (DO_REALLOC_FROM_ALLOCA): Check for do_realloc_newsize in
+ loop condition because we're no longer setting SIZEVAR here.
+
+2001-06-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (url_filename): Make sure that slashes that sneak in to
+ u->file via query string get protected.
+ (file_name_protect_query_string): New function.
+
+2001-06-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (ATTR_NAME_CHAR): Allow almost any character to be in
+ an attribute name.
+
+2001-06-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Updated version to 1.7.1.
+
+2001-06-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * MACHINES: Added mips-sgi-irix6.5, as reported by Edward
+ J. Sabol.
+
+2001-06-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/da.po: New version from TP.
+
+2001-06-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/Makefile.in (install.wgetrc): Use $(DESTDIR) when testing
+ whether $(WGETRC) exists.
+
+2001-06-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/Makefile.in (install.wgetrc): Take $(DESTDIR) into account when
+ running mkinstalldirs.
+
+2001-06-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * config.sub: New version from libtool 1.4.
+
+ * config.guess: New version from libtool 1.4.
+
+ * ltmain.sh: New version from libtool 1.4.
+
+ * aclocal.m4: Imported `libtool.m4' from libtool 1.4.
+
+ * ltconfig: Removed.
+
+ * configure.in: First check the compiler, then invoke libtool.
+
+2001-06-15 Adam J. Richter <adam@yggdrasil.com>
+
+ * doc/Makefile.in (install.wgetrc): Make `make install'
+ non-interactive in all cases.
+
+2001-06-14 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
+
+ * configure.in: Use `libtool' to test linking of external
+ libraries.
+
+2001-06-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/sysdep.h (MAP_FAILED): Provide MAP_FAILED for systems that don't
+ define it.
+
+2001-06-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (recursive_retrieve): Also check undesirable_urls with
+ canonicalized URL.
+
+2001-06-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Search `.netrc' with real host, not the proxy
+ one.
+
+2001-06-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/: Install new files from the TP: sv.po, cs.po, et.po, tr.po,
+ es.po, de.po, gl.po, sk.po, ru.po, fr.po.
+
+2001-06-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for both gethostbyname and inet_ntoa before
+ concluding that -lnsl is not needed.
+
+2001-06-09 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp.h: Provide correct prototype for ftp_parse_ls().
+
+2001-06-08 Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov>
+
+ * src/url.c (url_equal): Fix a memory leak when parseurl returns an
+ error on the second URL. Also, since url_equal is not used at the
+ moment, do not compile it.
+
+ * src/url.h: Ditto for the prototype of url_equal.
+
+2001-06-05 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * po/cs.po: Updated to match the 1.7 POT.
+
+2001-06-05 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * doc/Makefile.in (wget.info): Added -I$(srcdir) to support compilation
+ outside the source tree.
+ (install.man): Replaced $(srcdir)$(MAN) with $(MAN). The former
+ did not work when compiling outside the source tree.
+
+2001-06-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.7 is released.
+
+2001-06-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/: New versions of de.po and gl.po from the TP.
+
+2001-06-03 Karl Eichwalder <ke@suse.de>
+
+ * src/ftp-ls.c (ftp_parse_ls): Fix typo.
+
+2001-06-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/wget.pot: Updated.
+
+2001-06-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Updated to match the new POT.
+
+2001-06-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/es.po: Use the version from TP.
+
+2001-06-02 R.I.P. Deaddog <maddog@linuxhall.org>
+
+ * po/zh_TW.po: Updated for 1.7.
+
+2001-06-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/pl.po: Use iso-8859-1 as charset.
+
+ * po/hr.po: Update.
+
+2001-06-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/: Updated ru.po, et.po, and sv.po. Added tr.po.
+
+2001-05-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Mailing List): Fix the mailing list address.
+
+2001-05-28 Maciej W. Rozycki <macro@ds2.pg.gda.pl>
+
+ * configure.in: Use $host_os instead of non-existent "$opsys" when
+ deciding based on host type.
+
+ * configure.in: Print "cross" when cross-compiling.
+
+2001-05-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/all: Update copyright information.
+
+2001-05-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Copying): Clarify. Link to
+ "free-software-for-freedom.html".
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Wget 1.7-pre1 is released.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Updated version to 1.7-pre1.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Indicate that the continued download failed
+ for *this* file.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Updated.
+
+ * po/wget.pot: Regenerated from sources.
+
+ * README: Updated copyright statement.
+
+ * INSTALL: Document the new OpenSSL autodetector.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Updated version to 1.7.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Updated version to 1.7-pre1.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Contributors): Updated list of contributors.
+
+2001-05-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Provide a default for AC_TRY_RUN when
+ cross-compiling. Effectively, assume that when cross-compiling,
+ working linkage implies working executable.
+
+2001-05-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Rewrote OpenSSL library detection. Now the code
+ loops over system locations where libssl/libcrypto might be
+ located. Aside from linking, it actually tries to run the
+ executable before concluding that the linking "worked".
+
+2001-05-16 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: Make linker accept space-separated list
+ of object files.
+
+2001-05-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Use real URL data for cookies, not the proxy
+ stuff.
+
+2001-05-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.c: Don't include <sys/time.h> directly.
+
+2001-05-14 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src: Update for SSL.
+
+2001-05-14 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src:
+ * windows/Makefile.src.bor:
+ * windows/Makefile.watcom:
+ * windows/config.h.bor:
+ * windows/config.h.ms:
+ * windows/wget.dep:
+ Windows update.
+
+2001-05-14 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: Updated.
+
+2001-05-14 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: Rewritten.
+
+2001-05-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c: Get rid of `protostrings'.
+ (skip_proto): Don't use protostrings.
+ (has_proto): Ditto.
+
+2001-05-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/res.c: New file. Implement all RES-related code here.
+
+2001-05-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (print_help): Document `--no-http-keep-alive'.
+
+ * src/utils.c (numdigit): Handle negative numbers *correctly*.
+
+ * src/hash.c (make_nocase_string_hash_table): Use term "nocase" rather
+ than the confusing "unsigned".
+
+ * src/utils.c (string_set_contains): Renamed from string_set_exists.
+
+ * src/hash.c (hash_table_contains): Renamed from hash_table_exists.
+
+ * src/cookies.c: Move case-insensitive hash tables to hash.c.
+
+2001-05-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Before concluding that the file is already
+ fully retrieved, make sure that the file existed and `Range' was
+ actually requested.
+
+2001-05-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (eliminate_dups): New function.
+ (build_cookies_request): Use it.
+ (build_cookies_request): Set chain_store_size after reallocating
+ all_chains.
+ (check_domain_match): Annotated for easier future debugging.
+ (store_cookie): In the debug message, print whether the cookie is
+ permanent.
+
+2001-05-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): Reset no_truncate before deciding whether to
+ set it.
+ (gethttp): Further clarify "-c conflicts with existing file" error
+ message, based on input from Herold Heiko.
+
+2001-05-07 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): If restval is set, set no_truncate to 1
+ unconditionally.
+
+2001-05-02 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Assure months are being correctly
+ converted. Pointed out by <Stefan.Weil@de.heidelberg.com>.
+ (ftp_parse_vms_ls): Ditto.
+
+2001-04-30 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (cmd_address): Zero SIN before using it; apparently
+ needed on *BSD.
+
+2001-04-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Make `--cookies' respect its argument.
+
+2001-04-29 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop_internal): Don't set NO_TRUNCATE if the file is
+ empty.
+
+2001-04-28 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Removed undocumented option `--email-address'.
+
+ * src/netrc.c: Use the latest read_whole_line.
+
+ * src/init.c (defaults): Set opt.ftp_pass to "-wget@".
+
+ * src/mswindows.c (pwd_cuserid): Ditto.
+
+ * src/utils.c (pwd_cuserid): Removed.
+
+ * src/host.c (ftp_getaddress): Removed.
+
+2001-04-28 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Return RETRUNNEEDED when the retrieval is
+ unneeded because the file is already there and fully downloaded,
+ and -c is specified.
+ (http_loop): Handle RETRUNNEEDED.
+
+ * src/wget.h (uerr_t): New value RETRUNNEEDED.
+
+ * src/http.c (http_loop): Set no_truncate for files that both exist
+ and are non-empty.
+ (gethttp): Consider the download finished when restval >= contlen,
+ not only when restval==contlen.
+ (gethttp): Handle redirection before giving up due to -c.
+ (gethttp): Clarify error message which explains that -c will not
+ truncate the file.
+ (gethttp): When returning CONTNOTSUPPORTED, don't forget to free
+ the stuff that needs freeing and release the socket.
+
+2001-04-28 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Wgetrc Commands): Update docs for `continue'.
+
+2001-04-28 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ (http_loop): Allocate space for filename_plus_orig_suffix with
+ alloca; this is more efficient and removes the need to free it
+ before each and every return.
+
+2001-04-28 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/wget.dep: Update.
+
+ * windows/Makefile.src: Update.
+
+ * windows/config.h.ms: Define inline to __inline.
+ Define ftruncate to chsize.
+
+2001-04-28 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: Update.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/safe-ctype.h: Instead of throwing #error when isalpha is
+ defined, redefine it to something that will throw a compile-time
+ error if actually *used*. Do the same for the rest of the
+ standard C macros.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (print_help): Wget booleans accept "off", not "no".
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (mktime_from_utc): Improve documentation.
+ (http_atotm): Put format strings into a separate array.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): If allow_cache is zero, always disable
+ caching, not only when retrieving through proxy.
+
+ * src/init.c: Ditto.
+
+ * src/options.h (struct options): Rename proxy_cache to allow_cache.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/ja.po: New update by Hiroshi Takekawa.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/hr.po: Updated.
+
+2001-04-27 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (HTTP Options): Document cookie options.
+
+2001-04-26 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (getproxy): Ignore empty proxy vars.
+
+2001-04-25 Roger L. Beeman <beeman@cisco.com>
+
+ * src/http.c (http_atotm): Initialize t.tm_isdst to 0.
+ (mktime_from_utc): Prevent mktime() from having discontinuities at
+ DST transition points.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c: Document timer functions.
+
+ * src/retr.c (rate): Use it.
+ (rate): Print in GB/s if transfer rate exceeds 1 GB/s.
+
+ * src/utils.c (wtimer_granularity): New function.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c: Define each DIGITS_* in one line.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (UNSAFE_CHAR): Reimplement using a static table.
+ (url_init): Removed.
+ (init_unsafe_char_table): Removed.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/snprintf.c (dopr): Replace ISDIGIT with '0' <= ch && ch <= '9'.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): Would load cookies every time.
+
+ * src/cookies.c (load_cookies): Handle cookies whose values contain
+ embedded spaces.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (get_urls_html): Fix documentation.
+
+2001-04-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/POTFILES.in: Add src/cookies.c.
+
+2001-04-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (numdigit): Handle negative numbers.
+
+2001-04-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (long_to_string): New, faster version. Favors smaller
+ numbers; much of the calculation is now done at compile-time.
+
+2001-04-24 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (show_progress): Ditto.
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Use new timer functions.
+
+ * src/utils.c (wtimer_allocate): New function.
+ (wtimer_new): Ditto.
+ (wtimer_delete): Ditto.
+ (wtimer_reset): Ditto.
+ (wtimer_elapsed): Ditto.
+
+2001-04-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (show_progress): Print the download rate even when the
+ percentages are not available.
+
+2001-04-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Adjust expected_bytes if the length is
+ authoritative.
+
+2001-04-15 Ian Abbott <abbotti@mev.co.uk>
+
+ windows/wget.dep: The target `connect$o' (connect.obj) now depends on
+ `utils.h'.
+
+2001-04-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/da.po: Ditto.
+
+ * po/de.po: Ditto.
+
+ * po/el.po: Ditto.
+
+ * po/es.po: Ditto.
+
+ * po/et.po: Ditto.
+
+ * po/fr.po: Ditto.
+
+ * po/gl.po: Ditto.
+
+ * po/he.po: Ditto.
+
+ * po/ja.po: Ditto.
+
+ * po/pl.po: Ditto.
+
+ * po/sk.po: Ditto.
+
+ * po/sl.po: Ditto.
+
+ * po/sv.po: Ditto.
+
+ * po/tr.po: Ditto.
+
+ * po/zh_TW.po: Update from TP.
+
+ * po/ca.po: Ditto.
+
+ * po/bg.po: New file from TP.
+
+2001-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c: Don't declare `construct'.
+
+ * src/hash.c (grow_hash_table): Speed up rehashing; inline storing of
+ mappings to new locations.
+ (hash_table_new): Make resize_threshold a field in the hash table,
+ so we don't have to recalculate it in each hash_table_put.
+ (grow_hash_table): Update resize_threshold.
+ (MAX): Remove unused macro.
+ (prime_size): Made static.
+
+2001-04-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Call uri_merge, not url_concat.
+
+ * src/html-url.c (collect_tags_mapper): Call uri_merge, not
+ url_concat.
+
+ * src/url.c (mkstruct): Use encode_string instead of xstrdup followed
+ by URL_CLEANSE.
+ (path_simplify_with_kludge): Deleted.
+ (contains_unsafe): Deleted.
+ (construct): Renamed to uri_merge_1.
+ (url_concat): Renamed to uri_merge.
+
+2001-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h (XDIGIT_TO_xchar): Define here.
+
+ * src/url.c (decode_string): Use new name.
+ (encode_string): Ditto.
+
+ * src/http.c (XDIGIT_TO_xchar): Rename HEXD2asc to XDIGIT_TO_xchar.
+ (dump_hash): Use new name.
+
+ * src/wget.h: Rename ASC2HEXD and HEXD2ASC to XCHAR_TO_XDIGIT and
+ XDIGIT_TO_XCHAR respectively.
+
+2001-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (str_url): Use encode_string instead of the unnecessary
+ CLEANDUP.
+ (encode_string_maybe): New function, returns input string if no
+ encoding is needed.
+ (encode_string): Call encode_string_maybe to do the dirty work,
+ xstrdup if no work needed.
+
+2001-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c: Include cookies.h.
+
+ * src/cookies.h: Declare cookies_cleanup.
+
+ * src/cookies.c (check_domain_match): Remove unused variable.
+ (save_cookies): Remove extraneous argument from debug statement.
+
+ * src/host.c (same_host): Don't call skip_url.
+
+ * src/url.c (skip_url): Removed. Removed its calls from various
+ functions in url.c.
+
+2001-04-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (unsigned_string_hash): Use the new code in
+ string_hash as reference.
+
+ * src/hash.c (hash_table_map): Allow deletion and change of the
+ element processed by MAPFUN.
+ (string_hash): Use the function from glib.
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.h: Declare hash_table_get_pair and hash_table_count.
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp-ls.c (ftp_parse_vms_ls): Make seconds optional in time
+ specification.
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Use octal constants for
+ permissions. A compiler that doesn't accept octal constants is
+ seriously broken and shouldn't be used -- octal constants were
+ present in K&R C!
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c: Declare http_atotm.
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Include #undef stub.
+
+ * src/hash.c (hash_table_remove): Rewrite to actually clear deleted
+ entries instead of just marking them as deleted.
+
+2001-04-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for inline.
+
+2001-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (parseurl): Don't strip trailing slash when u->dir is "/"
+ because that strips the *leading* slash, thus forcing relative
+ FTP retrieval.
+
+2001-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/zh_TW.po: Reinstated, after an update by Abel Cheung.
+
+ * po/zh_TW.Big5.po: Removed.
+
+2001-04-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/zh_TW.Big5.po: New file, submitted by Abel Cheung.
+
+ * po/zh.po: Removed outdated file.
+
+2001-04-10 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp.c (getftp): Convert initial FTP directory from VMS to UNIX
+ notation for VMS servers.
+ (ftp_retrieve_dirs): Do not prepend '/' to f->name when
+ odir is an empty string.
+
+2001-04-10 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Made the fix for AM/PM more
+ effective. Suggested by Edward J. Sabol.
+
+2001-04-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/cookies.c (build_cookies_request): Use and sort cookies from all
+ matching domains.
+ (build_cookies_request): Check for duplicates before generating
+ the `Cookies' header.
+
+ * src/main.c (main): Don't load cookies here.
+ (main): Make loadcookies and savecookies call the correct command.
+
+ * src/http.c (http_loop): Load cookies on-demand.
+
+2001-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (cmd_file): New function.
+ (enable_tilde_expansion): New variable.
+ (run_wgetrc): Use it.
+ (cmd_file): Use it.
+
+2001-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Fix indentation of SSL ifdef.
+
+2001-04-09 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_retrieve_dirs): Don't forcibly prepend "/" to u->dir;
+ that hack is no longer necessary.
+ (getftp): Prepend initial directory to *non*-absolute u->dir's.
+
+2001-04-08 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): The AM/PM change did assume
+ 12:01PM == 00:01, which was obviously wrong. Taken care of this
+ anomaly.
+
+ * src/ChangeLog: Removed an excess conflict marker. Reformatted the
+ entry by Philipp Thomas from 2001-03-09.
+
+ * src/ftp-ls.c (ftp_parse_winnt_ls): Ensure that adjusted PM hours lay
+ between 0 and 23. Elminate unused variable `sec'.
+
+2001-04-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (datetime_str): New function.
+
+2001-04-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c: Include cookie-related options.
+
+ * src/main.c (main): Include cookie-specific options.
+ (main): Load cookies before download is finished.
+ (main): Save cookies when done.
+
+ * src/http.c (gethttp): Process the `Set-Cookie' header.
+ (gethttp): Include cookies in the response.
+
+ * src/cookies.c: New file.
+
+2001-04-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.c (hash_table_count): New function.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (read_file): Cast MAP_FAILED to char *. Enforced by
+ Digital Unix cc.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/sysdep.h: Don't define VERY_LONG_FORMAT.
+
+ * src/utils.c (very_long_to_string): New function.
+ (legible_very_long): Use it; don't use VERY_LONG_FORMAT.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Prepend literal newline with `\n\'.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.c: Include <string.h>.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Oops, do the namespace tweaks only on systems we
+ know about.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Define "compilation environment" options that work
+ under Linux and Solaris. To be reviewed on other OS'es.
+
+2001-04-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * aclocal.m4 (AM_PROG_CC_STDC): Don't use -Xc under SYSV. It
+ forces strict ANSI mode, which means we lose `long long'.
+ Generally, don't require __STDC__ to be defined to 1 because that
+ signifies strict ANSI.
+
+2001-04-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * NEWS: Cosmetic changes.
+
+2001-04-04 Christian Fraenkel <christian.fraenkel@gmx.net>
+
+ * src/url.c (parse_uname): Would run past the end of the string if the
+ username was present, but the URL did not contain a slash, e.g.
+ http://foo:bar@myhost.
+
+2001-04-03 Trond Eivind Glomsrod <teg@redhat.com>
+
+ * po/da.po: Ditto.
+
+ * po/no.po: The charset is iso-8859-1, not iso-8859-2.
+
+2001-04-03 Paul Bludov <paul@ozero.net>
+
+ * src/mswindows.c (sleep): Use SleepEx() instead of Sleep().
+ (ws_changetitle): Use alloca() instead of malloc() to avoid memory
+ leak.
+ (ws_mypath): Use GetModuleFileName instead of argv[0].
+ (ws_startup): Use data.wVersion for comparison.
+
+2001-04-03 KOJIMA Hajime <kjm@rins.ryukoku.ac.jp>
+
+ * src/http.c (http_atotm): Use %A instead of %a to match full
+ weekday. (On most systems there is no difference.)
+
+2001-04-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): New variable global_download_count used
+ to identify first retrieval.
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Rewind opt.dfp only on first retrieval.
+
+2001-04-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/netrc.c (parse_netrc): Don't trim the line endings explicitly;
+ they will be handled as whitespace.
+ (parse_netrc): Correctly handle lines that end with whitespace.
+
+2001-04-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (cmd_address): Heap-allocate the address that gets stored
+ to CLOSURE. Old code would simply assign an address on the stack.
+
+2001-04-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (ftp_loop_internal): Made the check whether to continue
+ retrieval `-O'-friendly.
+
+2001-04-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/et.po: New version by Toomas Soome.
+
+2001-04-01 Nicolas Lichtmaier <nick@debian.org>
+
+ * src/main.c (main): Add -C to the string that is the third arg to
+ getopt_long().
+
+2001-04-01 Nicolas Lichtmaier <nick@debian.org>
+
+ * src/ftp.c (ftp_get_listing): Propagate error status.
+ (ftp_retrieve_glob): Use it.
+ (ftp_loop): Ditto.
+
+2001-04-01 Nicolas Lichtmaier <nick@debian.org>
+
+ * po/es.po: New file.
+
+2001-04-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Don't start the download from scratch if `-c'
+ was specified, but the file is already fully downloaded.
+
+ * src/http.c (gethttp): Don't truncate a pre-existing file if `-c' was
+ specified and the server doesn't support continued download.
+ (gethttp): Don't start the download from scratch if `-c' was
+ specified, but the file is already fully downloaded.
+
+2001-04-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Recursive Retrieval Options): Document more
+ accurately what --convert-links does.
+
+2001-03-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Call register_download() for downloaded
+ files and register_html() for downloaded HTML files.
+
+ * src/recur.c (register_download): New function; register here that a
+ file has been downloaded, rather than in recursive_retrieve().
+ (register_html): New function; enqueue the location of HTML files
+ here rather than in recursive_retrieve().
+
+2001-03-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (recursive_retrieve): Clear the hash tables only when
+ they are defined.
+
+2001-03-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (print_help): Use multiple fputs instead of a single ugly
+ printf().
+ (main): Consistently assign numbers >128 to options without a
+ corresponding character.
+
+2001-03-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Make sure the socket is closed with
+ CLOSE_INVALIDATE before we have drained the body.
+
+2001-03-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ (recursive_retrieve): Don't clear the hash tables at this point at
+ all; it interferes with the normal operation of register_download.
+
+2001-03-27 Dan Harkless <wget@harkless.org>
+
+ * src/Makefile.in: Moved top_builddir out of "User configuration
+ section" of top Makefile and analogous spot in this one.
+
+2001-03-27 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in: Moved top_builddir out of "User configuration
+ section" of top Makefile and analogous spot in this one.
+
+2001-03-27 Dan Harkless <wget@harkless.org>
+
+ * INSTALL: Updated to reflect --with-ssl's new optional parameter.
+
+ * configure.in: Christian Fraenkel's tests for -lcrypto and -lssl
+ were in the wrong order, causing a link failure if you're using
+ libcrypto.a and libssl.a rather than shared libraries. Also put
+ in checks for -ldl, necessary since the libcrypto shared library
+ doesn't record its dependency on libdl.
+
+ * {.,util,windows}/Makefile.in: Moved top_builddir out of "User
+ configuration section" of top Makefile and analogous spot in others.
+
+ * po/Makefile.in.in: Previous addition of top_builddir to
+ po/Makefile.in was bogus -- it's generated from po/Makefile.in.in.
+
+2001-03-26 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Explained that you need
+ to use -r -l1 -p to get the two levels of requisites for a
+ <FRAMESET> page. Also made a few other wording improvements.
+
+2001-03-26 Dan Harkless <wget@harkless.org>
+
+ * TODO: -p should probably go "_two_ more hops" on <FRAMESET> pages.
+
+2001-03-22 Dan Harkless <wget@harkless.org>
+
+ * MACHINES: Added rs6000-ibm-aix4.3.3.0.
+
+2001-03-21 Dan Harkless <wget@harkless.org>
+
+ * MACHINES: Added armv4l-unknown-linux-gnu.
+
+2001-03-20 Dan Harkless <wget@harkless.org>
+
+ * TODO: Oops. Hostless absolute link conversion _is_ working. My
+ test that led me to believe it wasn't was exposing a different bug
+ -- URLs specified on the commandline as opposed to being recursed
+ to don't always get re-converted at the end of the Wget run.
+
+2001-03-17 Dan Harkless <wget@harkless.org>
+
+ * src/Makefile.in: Include @SSL_INCLUDES@ substition in INCLUDES.
+ Define top_builddir. Link wget with libtool so the user doesn't
+ have to supply a bunch of custom environment variables to
+ correctly link with the OpenSSL shared libraries.
+
+2001-03-17 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in: Using '^' in the sed call caused a weird failure on
+ Solaris 2.6. Changed it to a ','. Defined top_builddir.
+
+2001-03-17 Dan Harkless <wget@harkless.org>
+
+ * aclocal.m4: Appended libtool 1.3.5's libtool.m4 to it.
+
+ * configure.in: Use AM_PROG_LIBTOOL macro (now defined in our
+ aclocal.m4) to create a libtool script from ltconfig and ltmain.sh.
+ If --with-ssl specified, look in /usr/local/ssl/lib by default for
+ OpenSSL libs. Allow override with --with-ssl=<OpenSSL_root_dir>.
+ Set up -I<OpenSSL_root_dir>/include and -R<OpenSSL_root_dir>/lib
+ (possibly rewritten by libtool) as well. Don't appear to be
+ looking for a function main() in -lcrypto. If the OpenSSL lib
+ checks fail, don't just silently build a wget without https
+ support -- issue a warning. Define top_builddir.
+
+ * ltconfig: New file from libtool 1.3.5 distribution.
+
+ * ltmain.sh: New file from libtool 1.3.5 distribution.
+
+ * {.,po,util,windows}/Makefile.in: Define top_builddir.
+
+2001-03-16 Dan Harkless <wget@harkless.org>
+
+ * TODO: For some reason on 2000-11-19, Hrvoje removed the item
+ about converting hostless absolute links. That isn't working yet,
+ so I've put the item back, with a modified wording.
+
+ * config.guess: Hadn't been updated since 1996 -- didn't work for recent
+ machines and OSes, such as NetWinder ARM Linux. Updated to latest
+ version (2001-03-16) from <ftp://ftp.gnu.org/pub/gnu/config/>.
+
+ * config.sub: Ditto -- updated to latest version (2001-03-12).
+
+2001-03-12 Dan Harkless <wget@harkless.org>
+
+ * TODO: Only normal recursion should respect -np -- page-requisite
+ recursion should not.
+
+2001-03-09 Philipp Thomas <pthomas@suse.de>
+
+ * src/safe-ctype.h: New file. Locale independent ctype.h replacement
+ taken from libiberty.
+
+ * src/safe-ctype.c: New file. Tables for above.
+
+ * src/Makefile.in: Add safe-ctype$o to OBJS. Add dependencies for
+ safe-ctype$o.
+
+ * src/cmpt.c: Remove include of ctype.h. Use ISSPACE instead of
+ isspace.
+
+ * src/ftp-basic.c: Don't include ctype.h.
+
+ * src/ftp-ls.c: Likewise.
+
+ * src/ftp.c: Likewise.
+
+ * src/headers.c: Likewise.
+
+ * src/host.c: Likewise.
+
+ * src/html-parse.c: Likewise.
+
+ * src/html-url.c: Likewise.
+
+ * src/http.c: Likewise.
+
+ * src/init.c: Likewise.
+
+ * src/main.c: Likewise. Set LC_CTYPE along with LC_MESSAGES.
+
+ * src/netrc.c: Likewise.
+
+ * src/recur.c: Likewise.
+
+ * src/retr.c: Likewise.
+
+ * src/snprintf.c: Replace ctype.h with safe-ctype.h. Use ISDIGIT
+ instead of isdigit.
+
+ * src/sysdep.h: Remove defines of ctype macros as they aren't needed
+ for safe-ctype-h.
+
+ * src/url.c: Don't include ctype.h.
+
+ * src/utils.c: Likewise.
+
+ * src/wget.h: Include safe-ctype.h.
+
+2001-03-07 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * TODO: Removed an obsolete item about adding VMS and MS FTP
+ server support.
+
+2001-03-06 Hack Kampbjorn <hack@hackdata.com>
+
+ * src/http.c (gethttp): skip :port in host header if it is the
+ DEFAULT_HTTPS_PORT when using SSL.
+
+ * src/url.c: move the #define of DEFAULT_HTTP_PORT, DEFAULT_FTP_PORT
+ and DEFAULT_HTTPS_PORT to the header file so it can be use in the
+ rest of the code.
+ * src/url.h: Ditto
+
+2001-03-05 Dan Harkless <wget@harkless.org>
+
+ * TODO: Add a --range option to download only a given byte range.
+
+2001-03-01 Jonas Jensen <bones@huleboer.dk>
+
+ * src/retr.c (show_progress): Correctly calculate the number of bytes
+ in the first line of the download that have been actually
+ downloaded in this run.
+
+2001-03-01 Dan Harkless <wget@harkless.org>
+
+ * ChangeLog.README: Renamed from README.branches and added a note
+ that Wget has multiple ChangeLog files (currently ./ChangeLog,
+ doc/ChangeLog, and src/ChangeLog), since this is unusual and
+ people have complained their patches hadn't been applied after
+ checking only the top-level ChangeLog.
+
+2001-02-28 Dan Harkless <wget@harkless.org>
+
+ * MACHINES: Explicitly tell people to send us config.guess output.
+
+2001-02-27 Dan Harkless <wget@harkless.org>
+
+ * TODO: Re-use FTP connection if multiple URLs on one host
+ specified. Make "ftp://<host>/%2F<file>" cause an initial "CWD /".
+
+2001-02-23 Dan Harkless <wget@harkless.org>
+
+ * src/main.c (print_help): --help documentation for -N said it would
+ re-download files if they had the _same_ timestamp on server.
+ (print_help): -nr belongs in "FTP options" section of --help
+ output, not "Recursive retrieval" section. Alphabetized FTP
+ options by long option name.
+
+2001-02-23 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi: Corrections, clarifications, and English fixes to
+ time-stamping documentation. Also moved -nr from "Recursive
+ Retrieval Options" to "FTP Options" and gave it a @cindex entry.
+ Alphabetized FTP options by long option name. Mentioned that
+ .listing symlinked to /etc/passwd is not a security hole, but that
+ other files could be, so root shouldn't run wget in user dirs.
+
+2001-02-23 Dan Harkless <wget@harkless.org>
+
+ * NEWS: Note that Wget now has a man page again.
+
+ * po/*.po*: Updated after changing --help's description of -N and
+ moving -nr to a different category.
+
+ * TODO: "Timestamps are sometimes not copied over on files
+ retrieved by FTP." removed. Hopefully all the failures I was
+ seeing were due to the fact that it wasn't documented that
+ non-globbing, non-recursive FTP downloads need -N to get the
+ remote timestamp to be preserved.
+
+2001-02-22 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in: Make wget man page and install it if we have
+ pod2man. Added some missing '$(srcdir)/'s. Added missing
+ dependencies on install targets (allowing you to just do `make
+ install' rather than forcing you to do `make && make install').
+ Also, Makefile rules should always use output file parameters if
+ available rather than redirecting stdout with '>', or you falsely
+ satisfy dependencies if the tool you're running is missing or
+ fails -- fixed call of texi2pod.pl that did this wrong.
+
+ * doc/texi2pod.pl: Removed from CVS. Now automatically generated.
+
+ * doc/texi2pod.pl.in: This new file is processed into texi2pod.pl,
+ getting the appropriate path to the Perl 5+ executable on this
+ system and becoming executable (CVS files, by contrast, don't
+ arrive executable).
+
+2001-02-22 Dan Harkless <wget@harkless.org>
+
+ * TODO: Remove empty directories created due to --accept/--reject.
+
+ * configure.in: Look for perl and pod2man and make substitutions.
+
+ * Makefile.in (install): Do install.man if we have pod2man.
+
+2001-02-19 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Download Options): Further improvement to --continue
+ documentation -- explain interaction with -r and -N, mention
+ usefulness for downloading new sections of appended-to files, etc.
+
+2001-02-16 Dan Harkless <wget@harkless.org>
+
+ * src/init.c (commands): Hack Kampbjørn <hack@hackdata.com> discovered
+ that "httpsproxy" had been inserted into commands[] out of
+ alphabetical order, causing "BUG: unknown command `httpuser'".
+
+2001-02-13 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * windows/Makefile.src: Removed references to ftpparse sources.
+
+ * windows/wget.dep: Ditto.
+
+ * windows/Makefile.watcom: Ditto.
+
+2001-02-13 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_ls): Added support of ST_MACOS (Unix-like
+ listing without correct permissons).
+
+ * src/ftp.h (stype): Added ST_MACOS to identify the NetPresenz MacOS
+ FTP server.
+
+ * src/ftp.c (ftp_retrieve_list): New mirroring logic: A remote file
+ shall be donwloaded only when it's newer than the local copy or
+ when it has the same timeestamp but its size is different. ST_VMS
+ and ST_MACOS as special cases that lie about file size.
+
+ * src/ftp-ls.c (ftp_parse_ls): Support for ST_MACOS.
+
+ * src/Makefile.in: Removed dependency on ftpparse library due to unclear
+ copyright issues and absence of any feedback to our queries.
+
+ * src/ftp-ls.c: Removed dependency on ftpparse library due to unclear
+ copyright issues and absence of any feedback to our queries.
+ (ftp_parse_ls): Added a warning message when remote server system
+ does not seem to be suported by wget.
+ (ftp_parse_vms_ls): New function for parsing VMS ftp
+ server listing output.
+ (clean_line): New function responsible for removing
+ end-of-line characters from FTP listing texts.
+
+ * src/ftp.c (getftp): Global variables pwd and host_type are now
+ member of the ccon structure under names ccon.id and ccon.rs.
+
+ * src/ftp.h (struct ccon): Added formed global variables from ftp.c,
+ enum stype rs (remote system identification) and char *id (initial
+ working directory), as suggested by Hrvoje.
+
+ * src/url.c (parse_uname): Added support for passwords containing '@'
+ characters.
+ (skip_uname): Ditto.
+
+2001-02-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop_internal): Disable padding.
+ (getftp): Ditto.
+
+ * src/http.c (http_loop): Disable padding.
+
+ * src/retr.c (show_progress): Use it to enable padding.
+
+ * src/retr.c (rate): Optional parameter PAD for padding the rate.
+
+2001-02-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop): Reset con.
+
+2001-02-11 Hack Kampbjørn <hack@hackdata.com>
+
+ * src/url.c (parseurl): Debug-print u->ftp_type.
+
+2001-02-10 Tim Mooney <mooney@dogbert.cc.ndsu.NoDak.edu>
+
+ * src/ftp.h: Rename enums `command' to `wget_ftp_command' and
+ `fstatus' to `wget_ftp_status' because old names clash with Tru64
+ net/if.h.
+
+2001-02-10 Jonas Jensen <bones@huleboer.dk>
+
+ * src/retr.c (show_progress): Print the download rate along with the
+ percentages.
+ Along with Anders Thorsby <anders@thorsby.dk>.
+
+2001-02-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (show_progress): Make sure that the last output line
+ includes progress.
+
+2001-02-08 Christian Fraenkel <christian.fraenkel@gmx.net>
+
+ * src/gen_sslfunc.c: verify_callback is now static
+
+ * src/gen_sslfunc.c (init_ssl): load certificate if specified
+
+ * src/gen_sslfunc.c (ssl_printerr): new function
+
+ * src/init.c: added new --sslcertfile and --sslcertkey switches
+
+ * src/main.c: ditto
+
+ * src/options.h: ditto
+
+ * src/http.c (gethttp): abort when init_ssl fails
+
+2001-01-23 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src: Don't attempt to compile in alloca.c; it
+ doesn't work and it's not needed.
+
+2001-01-23 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * src/mswindows.h: Include <malloc.h>; it's needed for alloca().
+
+2001-01-23 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * src/config.h.ms, mswindows.h: defined HAVE_ISATTY, use _isatty for
+ MS VC; somebody with Borland compiler please check and provide
+ patch if possible;
+
+ * src/cmpt.c: provided a usleep emulation.
+
+2001-01-20 Karl Eichwalder <ke@suse.de>
+
+ * src/Makefile.in: Provide and use DESTDIR according to the Coding
+ Standards.
+
+2001-01-20 Karl Eichwalder <ke@suse.de>
+
+ * doc/Makefile.in: Provide and use DESTDIR according to the Coding
+ Standards.
+
+2001-01-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * NEWS: Added more NEWS items.
+
+2001-01-15 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * util/wget.spec: Updated to 1.7, merged with the spec file from
+ RedHat.
+
+ * po/Makefile.in.in: `make realclean' equal to `make
+ maintainer-clean'.
+
+ * Makefile.in (realclean-top): Remove 'configure' as well.
+
+2001-01-15 Dan Harkless <wget@harkless.org>
+
+ * NEWS: Was not being maintained. Added some significant 1.7-dev stuff.
+
+2001-01-11 Dan Harkless <wget@harkless.org>
+
+ * TODO: If -c used with -N, check to make sure a file hasn't
+ changed on the server before "continuing" to download it.
+
+2001-01-11 Adrian Aichner <Adrian.Aichner@t-online.de>
+
+ * windows/Makefile.src: Updated.
+
+ * windows/wget.dep: Ditto.
+
+2001-01-10 Dan Harkless <wget@harkless.org>
+
+ * src/url.c (str_url): Clarified this function's comment header after
+ Hrvoje answered my question on the list as to when hide != 1.
+ Also Hrvoje pointed out I need to use xstrdup() on the string literal.
+
+2001-01-09 Dan Harkless <wget@harkless.org>
+
+ * src/html-url.c: A bunch of fixup of `--page-requisites'-related
+ comments to reflect Hrvoje's changes to my code when transplanting
+ it into this new file, to fix spelling mistakes, to clarify, etc.
+
+ * src/url.c (write_backup_file): Clarified a comment.
+ (str_url): Henrik van Ginhoven pointed out on the list that we
+ shouldn't give away the number of characters in the password by
+ replacing each character with a 'x'. Use "<password>" instead.
+
+ * src/ftp.c (ftp_retrieve_dirs): The bug where recursion into FTP
+ directories didn't work if logging in put you in a directory other
+ than "/" is fixed now. Removed the comment here warning of the bug.
+
+ * src/main.c (print_help): --continue's description was misleading.
+ We don't "restart", we "resume". Also, better to say
+ "partially-downloaded file" rather than just "existing file".
+
+2001-01-09 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Download Options): Did a bunch of clarification and
+ correction to the description of --continue.
+
+2001-01-09 Dan Harkless <wget@harkless.org>
+
+ * TODO: If -c is on, don't re-download a 100%-downloaded file.
+
+ * TODO: The bug where you couldn't recurse into ftp directories if
+ logging in put you somewhere else besides the server's "/"
+ directory got fixed without the TODO entry for it being removed.
+
+ * TODO: Add a "rollback" option to have --continue throw away X
+ corrupted (e.g. by proxy) bytes from end of file before resuming.
+
+ * po/*.po*: Updated after changing --help's description of -c.
+
+2001-01-06 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/url.c (parse_uname): Added support for passwords containing '@'
+ characters.
+ (skip_uname): Ditto.
+
+2001-01-06 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * doc/wget.texi (Reporting Bugs): Deleted the setence about Cc-ing the
+ bug report to Wget mailing list as the bug report address is an
+ alias for the mailing ist anyway.
+ (Mailing List): Added URL for the alternate archive.
+
+ * doc/wget.texi: Bunch of cosmetical changes.
+
+ * doc/Makefile.in: Added targets for manpage generation using
+ texi2pod.pl and pod2man (comes with Perl5). As we cannot rely on
+ Perl5 being available on the system, manpage is not being built
+ automatically. Updated '*clean' targets to remove
+ 'sample.wgetrc.munged...', 'wget.pod', and 'wget.man'.
+
+ * doc/texi2pod.pl: New file copied from GCC distribution to facilitate
+ automatic manpage generation.
+
+2001-01-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/connect.c (bindport): Declare addrlen as int. Diagnosed by
+ Drazen Kacar <dave@arsdigita.com>.
+ (conaddr): Ditto.
+
+2001-01-06 Dan Harkless <wget@harkless.org>
+
+ * src/ChangeLog: The '[Not in 1.6 branch.]'s were decided not to be
+ the best way to go about my aim. Removed them in favor of:
+
+ * src/ChangeLog-branches/1.6_branch.ChangeLog: New file.
+
+2001-01-06 Dan Harkless <wget@harkless.org>
+
+ * doc/ChangeLog: The '[Not in 1.6 branch.]'s were decided not to be
+ the best way to go about my aim. Removed them in favor of:
+
+ * doc/ChangeLog-branches/1.6_branch.ChangeLog: New file.
+
+2001-01-06 Dan Harkless <wget@harkless.org>
+
+ * ChangeLog: The '[Not in 1.6 branch.]'s were decided not to be
+ the best way to go about my aim. Removed them in favor of:
+
+ * ChangeLog-branches/1.6_branch.ChangeLog: New file.
+
+ * README.branches: Explains the 1.6_branch.ChangeLog files.
+
+ * README.cvs: Falsely claimed you only needed GNU autoconf to
+ build from the CVS sources. You also need GNU gettext and
+ texinfo. I also did a bunch of general re-writing of this file.
+
+2001-01-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (replace_attr): New function, to be used by both
+ TO_COMPLETE and TO_RELATIVE case in convert_links.
+ (find_fragment): New function for finding URL fragments.
+ (replace_attr): Better handle the case where the original string
+ is not quoted. Use find_fragment.
+ (convert_links): Use replace_attr().
+
+2001-01-03 Dan Harkless <wget@harkless.org>
+
+ * TODO: We should make a simple man page referring to info doco.
+
+2000-12-31 Dan Harkless <wget@harkless.org>
+
+ * src/ChangeLog: Since this flat file doesn't have multiple branches,
+ looking at the dates would make you think that things went into
+ 1.6 that actually just went into the 1.7-dev branch. Added "[Not
+ in 1.6 branch.]" where appropriate to clarify.
+
+2000-12-31 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in (distclean): sample.wgetrc.munged_for_texi_inclusion
+ needs to be included in the distribution or it'll get regenerated
+ due to the wget.info dependency, and then that file will get
+ regenerated, forcing people to have makeinfo installed
+ unnecessarily. We could use a kludge of a 0-length file in the
+ distro, but the file isn't that big and should compress very well.
+
+ * doc/wget.texi: Changed "VERSION 1.5.3+dev" to "VERSION 1.7-dev" and
+ "UPDATED Feb 2000" to "UPDATED Dec 2000". Like the comment in the
+ file says, it'd be nice if these were handled automatically...
+
+ * doc/ChangeLog: Since this flat file doesn't have multiple branches,
+ looking at the dates would make you think that things went into
+ 1.6 that actually just went into the 1.7-dev branch. Added "[Not
+ in 1.6 branch.]" where appropriate to clarify.
+
+2000-12-31 Dan Harkless <wget@harkless.org>
+
+ * README: Changed 1.5.3 in the FTP URL to 1.6.
+
+ * NEWS: Released Wget version 1.6.
+
+ * po/*.po: 'Project-Id-Version's were very haphazard, saying
+ either "wget" or "GNU wget", and with versions of 1.5.2-b[124],
+ 1.5.3, the nonexistent 1.5.4, and 1.6-pre. Standardized all to
+ "GNU Wget 1.7-dev". Perhaps this is wrong to do because some of
+ the translations haven't been updated since the versions they
+ state, but I know some of the files were updated specifically for
+ 1.6, and none of them used this version (unless you count the sole
+ "1.6-pre" guy). In any case, the 'POT-Creation-Date's and
+ 'PO-Revision-Date's remain the best indicator of whether a
+ translation's out of date.
+
+ * ChangeLog: Since this flat file doesn't have multiple branches,
+ looking at the dates would make you think that things went into
+ 1.6 that actually just went into the 1.7-dev branch. Added "[Not
+ in 1.6 branch.]" where appropriate to clarify.
+
+2000-12-30 Dan Harkless <wget@harkless.org>
+
+ * src/ftp.c, http.c: Applied Hack Kampbjørn <hack@hackdata.com>'s
+ patch to deal with h_errno not being defined in netdb.h under Cygwin.
+
+2000-12-18 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * windows/Makefile.watcom: Updated.
+
+2000-12-18 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * src/sysdep.h: Include <malloc.h> and <io.h> under Watcom.
+
+2000-12-17 Igor Khristophorov <igor@atdot.org>
+
+ * src/http.c (check_end): Fix test for '+' or '-'.
+
+2000-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (parseurl): Rename inner loop var from i to ind to avoid
+ clash with the function top-level-declared variable i.
+ (str_url): Likewise, rename inner-loop i to j.
+
+ * src/recur.c (parse_robots): Don't declare LEN at top of function.
+ (robots_match): Renamed parameter FORBIDDEN to avoid hiding of
+ global variable.
+
+ * src/main.c (main): Change erroneous use of bitwise and to logical.
+
+ * src/init.c (cmd_address): Don't heap-allocate `sin'; it can be on
+ the stack because it will be copied to closure.
+
+ Thanks to Csaba Raduly's run of PC-LINT over the sources.
+
+2000-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/mswindows.c: Include <errno.h>.
+
+ * src/gen_sslfunc.c: Include <errno.h>.
+
+ * src/ftp-basic.c: Don't attempt to declare errno or h_errno because
+ they're not used.
+
+ * src/main.c: Include <errno.h> because errno is used.
+
+ * src/ftp.c: Ditto.
+
+ * src/http.c: Include <netdb.h> for h_errno.
+
+2000-12-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (basic_authentication_encode): Use xmalloc(), not
+ malloc(). Thanks to Csaba Raduly's run of PC-LINT over the
+ sources.
+
+2000-12-17 Csaba Raduly <csaba.raduly@sophos.com>
+
+ * src/sysdep.h: Test for __EMX__ rather than for EMXOS2 for OS/2
+ compilation.
+
+2000-12-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-parse.c (advance_declaration): MSVC assert() chokes on
+ '\"'. Use '"' instead.
+
+2000-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (xfree_real): Removed.
+ (xfree_debug): Just call free().
+
+ * src/wget.h (xfree): Make it an alias for free.
+
+2000-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): Furthermore, touch output_document only if
+ it is known to be an existing regular file.
+
+2000-12-11 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_retrieve_list): Ditto.
+
+ * src/http.c (http_loop): Touch output_document if that is used for
+ output.
+
+2000-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * po/POTFILES.in: Updated.
+
+2000-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/Makefile.in (install.info): Info files are *not* in $(srcdir),
+ but in the current build dir.
+
+2000-12-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Add windows/Makefile to the output block.
+
+ * windows/Makefile.in: New file.
+
+ * README.cvs: New file.
+
+2000-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/rbuf.h: Implement only a single version of RBUF_READCHAR, using
+ rbuf_read_bufferful when the buffer is depleted.
+
+ * src/rbuf.c (rbuf_read_bufferful): New function.
+
+2000-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c: Include gen_sslfunc.h after including Wget's headers.
+ (persistent_available_p): Needed coma before `int ssl'.
+
+2000-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/gen_sslfunc.h: Use ansi2knr style function declarations.
+
+ * src/gen_sslfunc.c: Reformat according to the GNU coding standards.
+ More should be done.
+
+ * src/http.c (persistent_available_p): Place the cheap SSL test nearer
+ the top of the function.
+ (CLOSE_FINISH, CLOSE_INVALIDATE): Define only one version of each.
+
+2000-12-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop_internal): Ditto.
+
+ * src/http.c (http_loop): Use it.
+
+ * src/retr.c (sleep_between_retrievals): New function that handles the
+ logic of opt.wait and opt.waitretry.
+
+2000-12-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (init_unsafe_char_table): Reinstate space as an unsafe
+ char.
+
+2000-12-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Don't unconditionally define HAVE_SSL, even when
+ --with-ssl is given.
+
+2000-12-03 Christian Fraenkel <christian.fraenkel@gmx.net>
+
+ * src/Makefile.in: added gen_sslfunc object
+ * src/config.h.in: added HAVE_SSL define
+ * src/connect.c: changed select_fd from static int to int
+ * src/connect.h: ditto
+ * src/gen_sslfunc.h: New file
+ * src/gen_sslfunc.c: ditto
+ * src/http.c: added HTTPS fuctionality
+ * src/retrc.c: ditto
+ * src/url.c: ditto
+ * src/init.c: added opt.httpsproxy
+ * src/options.h: ditto
+ * src/rbuf.h: added alternate rbuf struct
+ * src/wget.h: added CONSSLERR
+ * src/rbuf.c: ditto
+
+ * src/http.c: Added HTTPS fuctionality.
+
+ * src/retrc.c: Ditto.
+
+ * src/url.c: Ditto.
+
+ * src/init.c: Added opt.httpsproxy.
+
+ * src/options.h: Ditto.
+
+ * src/rbuf.h: Added alternate rbuf struct.
+
+ * src/wget.h: Added CONSSLERR.
+
+ * src/rbuf.c: Ditto.
+
+2000-12-03 Christian Fraenkel <christian.fraenkel@gmx.net>
+
+ * INSTALL: Added the --with-ssl switch.
+
+ * configure.in: Ditto.
+
+ * TODO: Removed the corresponding entry.
+
+2000-11-30 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Added second parameter
+ "ignore_perms" to ignore file and directory permissions for
+ Windows NT FTP server listings.
+ (ftp_parse_winnt_ls): New function.
+ (ftp_parse_ls): Parses UNIX and Windows NT listings
+ separately. Simple heuristics for distinguishing between UNIX and
+ MS-DOS-like FTP listing provided by Windows NT FTP service.
+
+2000-11-30 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Added second parameter
+ "ignore_perms" to ignore file and directory permissions for
+ Windows NT FTP server listings.
+ (ftp_parse_winnt_ls): New function.
+ (ftp_parse_ls): Parses UNIX and Windows NT listings
+ separately. Simple heuristics for distinguishing between UNIX
+ and MS-DOS-like FTP listing provided by Windows NT FTP service.
+
+2000-11-29 John Summerfield <summer@OS2.ami.com.au>
+
+ * src/netrc.c (parse_netrc): Get rid of line ending.
+
+2000-11-25 Karl Eichwalder <ke@suse.de>
+
+ * Makefile.in (SUBDIRS): Add 'windows'.
+ (dist, DISTFILES): Don't distribute CVS directories.
+
+2000-11-25 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_retrieve_list): Undo typo "fix" until resolution by
+ Dan.
+
+2000-11-24 Karl Eichwalder <ke@suse.de>
+
+ * src/main.c (print_help): Untabify.
+
+2000-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (xrealloc_debug): Do the unregister/register thing only
+ if the pointer has actually changed.
+ (xmalloc_real): Declare `static' in DEBUG_MALLOC builds.
+ (xfree_real): Ditto.
+ (xrealloc_real): Ditto.
+ (xstrdup_real): Ditto.
+
+2000-11-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Build ALL_LINGUAS dynamically.
+
+2000-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): ftp_getaddress() returns a malloc'ed copy of the
+ string; no need to strdup() it.
+ (getftp): Make pwd_len a local variable.
+ (ftp_loop): Free PWD before returning.
+
+ * src/init.c (cleanup): Free opt.ftp_pass only if it's non-NULL.
+
+2000-11-22 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/all: Use xfree() instead of free.
+
+ * src/utils.c (xfree): New function.
+
+2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): HTML-quote the converted string.
+
+ * src/utils.c (html_quote_string): Move here from ftp-ls.c
+ (html_quote_string): Make non-static; declare in utils.h.
+ (html_quote_string): Convert SP to &#32;.
+
+2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.c (hash_table_put): Don't overwrite deleted mappings.
+
+2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/hash.c (find_mapping): New function.
+ (hash_table_get): Use it.
+ (hash_table_get_pair): Ditto.
+ (hash_table_exists): Ditto.
+ (hash_table_remove): Ditto.
+ (hash_table_remove): Really delete the entry if the mapping
+ following LOCATION is empty.
+
+ * src/utils.c (string_set_add): Check whether the element has existed
+ before.
+
+ * src/hash.c (hash_table_get_pair): New function.
+
+2000-11-21 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Reformat Jan's code according to GNU coding
+ standards; remove (debugging?) printf's; use '\0' for the ASCII
+ zero character. Use alloca() instead of malloc() for
+ inter-function temporary allocations.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/version.c: Bump version from 1.5.3+dev to 1.7-dev.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/recur.c (recursive_retrieve): Print the "so we don't load"
+ debugging message only if we really don't load.
+
+ * src/http.c (gethttp): Inhibit keep-alive if proxy is being used.
+ (gethttp): Don't request keep-alive if keep-alive is inhibited.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_process_type): Ignore trailing whitespace; use
+ strdupdelim().
+
+ * src/recur.c (recursive_retrieve): Use the new `convert' field.
+ (convert_all_links): Ditto.
+ (convert_all_links): Don't respect meta_disallow_follow.
+
+ * src/html-url.c (handle_link): Fill out link_relative_p and
+ link_complete_p.
+
+ * src/url.h (struct _urlpos): Make elements more readable.
+
+ * src/recur.c (recursive_retrieve): Call slist_prepend instead of
+ slist_append.
+ (convert_all_links): Call slist_nreverse before iterating through
+ urls_html.
+
+ * src/utils.c (slist_prepend): New function.
+ (slist_nreverse): Ditto.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (http_loop): If username and password are known, try the
+ `Basic' authentication scheme by default.
+
+ * src/connect.h: Declare test_socket_open.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Don't use the return value of sprintf().
+ (gethttp): Inhibit keep-alive if opt.http_keep_alive is 0.
+
+2000-11-20 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (check_end): Constify.
+
+2000-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): Handle UREL2ABS case.
+
+ * src/recur.c (recursive_retrieve): Instead of the list
+ urls_downloaded, use hash tables dl_file_url_map and
+ dl_url_file_map.
+ (convert_all_links): Use them to retrieve data.
+
+ * src/host.c (clean_hosts): Free the hash tables.
+
+ * src/main.c (private_initialize): Call host_init().
+
+ * src/host.c (store_hostaddress): Use a saner, hash table-based data
+ model.
+ (realhost): Ditto.
+ (host_init): Initialize the hash tables.
+
+2000-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (get_contents): If use_expected, make sure that the
+ appropriate amount of data is being read.
+
+ * src/http.c (gethttp): Check for both `Keep-Alive: ...' and
+ `Connection: Keep-Alive'.
+
+ * src/wget.h (DEBUGP): Call debug_logprintf only if opt.debug is
+ turned on.
+
+2000-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (gethttp): Make the HTTP persistent connections more
+ robust.
+
+2000-11-19 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/http.c (connection_available_p): Use it.
+
+ * src/connect.c (test_socket_open): New function.
+
+ * src/http.c (gethttp): Support persistent connections. Based on the
+ ideas, and partly on code, by Sam Horrocks <sam@daemoninc.com>.
+ (register_persistent): New function.
+ (connection_available_p): Ditto.
+ (invalidate_connection): Ditto.
+
+2000-11-18 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftpparse.c, ftpparse.h: New files.
+
+ * src/ftp-ls.c (ftp_parse_ls): Use ftp_parse_unix_ls for UNIX servers
+ only. Use ftp_parse_nonunix_ls otherwise.
+ (ftp_parse_nonunix_ls): Stub to the ftpparse library handling all
+ exotic FTP servers.
+
+ * src/ftp.h (stype): New enum, distinguishes UNIX, VMS, and "other"
+ FTP servers.
+
+ * src/ftp.c: New static wariables host_type, pwd, and pwd_len.
+ (getftp): Support for VMS. Support for FTP servers that do not
+ place you in the root directory after login.
+ (ftp_retrieve_list): VMS is silent about the real file size, issue
+ a more appropriate message.
+ (ftp_get_listing): Pass host_type to ftp_parse_ls.
+
+ * src/ftp-basic.c (ftp_pwd, ftp_syst): New functions.
+
+2000-11-18 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/ftpparse.c, ftpparse.h: New files.
+
+ * src/ftp-ls.c (ftp_parse_ls): Use ftp_parse_unix_ls for UNIX servers
+ only. Use ftp_parse_nonunix_ls otherwise.
+ (ftp_parse_nonunix_ls): Stub to the ftpparse library handling all
+ exotic FTP servers.
+
+ * src/ftp.h (stype): New enum, distinguishes UNIX, VMS, and "other"
+ FTP servers.
+
+ * src/ftp.c: New static wariables host_type, pwd, and pwd_len.
+ (getftp): Support for VMS. Support for FTP servers that do not
+ place you in the root directory after login.
+ (ftp_retrieve_list): VMS is silent about the real file size, issue
+ a more appropriate message.
+ (ftp_get_listing): Pass host_type to ftp_parse_ls.
+
+ * src/ftp-basic.c (ftp_pwd, ftp_syst): New functions.
+
+2000-11-18 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (slist_append): Eviscerate NOSORT. Hash tables are now
+ used for what the sorted slists used to be used for.
+ (slist_contains): Don't rely on the list being sorted.
+ (slist_append): Simplify the code.
+
+ * src/recur.c (recursive_cleanup): Use free_string_set.
+
+ * src/utils.c (string_set_add, string_set_exists, string_set_free):
+ New functions for easier freeing of hash tables whose keys are
+ strdup'ed strings.
+
+ * src/recur.c (recursive_retrieve): Use the hash table functions for
+ storing undesirable URLs.
+
+ * src/hash.c: New file.
+
+2000-11-17 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (private_initialize): Call url_init.
+ (main): Call private_initialize.
+
+ * src/url.c (unsafe_char_table): New table.
+ (UNSAFE_CHAR): Use it.
+ (init_unsafe_char_table): New function.
+ (url_init): New function; call init_unsafe_char_table.
+
+2000-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * windows/config.h.ms: snprintf and vsnprintf exist under Windows.
+
+ * windows/Makefile.src: Back out previous change.
+
+2000-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/mswindows.h: Define snprintf and vsnprintf to _snprintf and
+ _vsnprintf respectively.
+
+2000-11-16 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Use --- consistently.
+ Spell "Wget" with starting capital letter consistently.
+ Use ``...'' or @dfn{} instead of simple double quotes where
+ appropriate.
+ Use double space as separator between sentences consistently.
+
+2000-11-16 Herold Heiko <Heiko.Herold@previnet.it>
+
+ * windows/Makefile.src: Compile in vsnprintf.c.
+
+2000-11-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html-url.c (handle_link): Handle HTML fragment identifiers.
+
+ * src/recur.c (recursive_retrieve): If norobot info is respected and
+ the file is specified not to be followed by robots, respect that.
+
+ * src/html-url.c (collect_tags_mapper): Handle <meta name=robots
+ content=X>. For us the important cases are where X is NONE or
+ where X contains NOFOLLOW.
+ (get_urls_html): Propagate that information to the caller.
+
+2000-11-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/config.h.in: Do the _XOPEN_SOURCE and _SVID_SOURCE things only
+ on Linux.
+
+2000-11-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Robots): Rearrange text. Mention the meta tag.
+
+2000-11-15 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (Robots): Document that we now support the meta tag
+ exclusion.
+
+2000-11-14 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Add GFDL; remove norobots specification.
+
+ * doc/wget.texi (Sample Wgetrc): Remove warnings with lateish
+ makeinfo, mostly by changing xref{} to pxref{} when inside
+ parentheses.
+
+2000-11-13 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (convert_links): Unlink the file we might be reading from
+ before writing to it.
+ (convert_links): Use alloca instead of malloc for
+ filename_plus_orig_suffix.
+
+2000-11-12 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/host.c (realhost): Add HOST to the list with quality==0 only if
+ it wasn't already there.
+ Based on analysis by Lu Guohan <feng@public.bjnet.edu.cn>.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (get_urls_file): Ditto.
+ (convert_links): Ditto.
+
+ * src/html-url.c (get_urls_html): Use read_file() instead of
+ load_file().
+
+ * src/utils.c (read_file): New function, instead of the old
+ load_file().
+ (read_file_free): Ditto.
+
+ * src/url.c (findurl): Search only for the supported protocols.
+ (convert_links): Use fwrite() when writing out a region of
+ characters.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (run_wgetrc): Don't bother killing off '\r' since
+ pars_line() skips whitespace at end of line anyway.
+ (parse_line): Oops, it didn't. Now it does.
+
+ * src/recur.c (parse_robots): Ditto here.
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Kill off the newline character
+ manually because read_whole_line no longer does.
+
+ * src/utils.c (read_whole_line): Rewrite to: a) use less memory
+ (reallocates to needed size after work), b) work faster -->
+ fgets() instead of getc, c) be more correct --> doesn't kill the
+ newline character at the end of line.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c (comind): Initialize MAX to array size - 1.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp-ls.c: Move html_quote_string and ftp_index here.
+
+ * src/url.c: Remove get_urls_html, since that's now in html-url.c.
+
+ * src/html-url.c: New file.
+
+ * src/html-parse.c: New file.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: cc.fer.hr -> srk.fer.hr.
+
+2000-11-10 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Test for MMAP.
+
+2000-11-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (construct): Handle the case where host name is not
+ followed by a slash.
+
+2000-11-08 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (construct): Changed last_slash[-1] to *(last_slash - 1).
+ Suggested by Edward J. Sabol.
+
+2000-11-06 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/init.c: commands[] need to be sorted! ("base" wasn't.)
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h (DO_REALLOC_FROM_ALLOCA): Use braces to disambiguate
+ `if'.
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (construct): Insert unneeded initialization for the
+ compiler to shut up.
+
+ * src/config.h.in: Define _XOPEN_SOURCE to 500 to get the prototype
+ for strptime() (*duh*). Define _SVID_SOURCE to get S_IFLNK which
+ otherwise gets lost when you define _XOPEN_SOURCE.
+
+ * src/utils.c (touch): Include the file name in the error message.
+ From Debian.
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (construct): Fix comment.
+ (find_last_char): Document.
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/log.c (logvprintf): Use vsnprintf() in all cases. If necessary,
+ resize the buffer to fit the formated message. That way, messages
+ of arbitrary size may be printed.
+ (logvprintf): Use saved_append() to optionally log the last
+ several lines of output.
+ (logputs): Ditto.
+ (log_close): Adapt to new data structures.
+ (log_dump): Ditto.
+ (redirect_output): Print messages to stderr, not to stdout.
+
+ * src/log.c (saved_append_1): New function. Replaces the old logging
+ system ("log all output until 10M characters") with a new, much
+ more reasonable one ("log last screenful of text").
+ (saved_append): New function; call saved_append_1.
+ (free_log_line): New function.
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi: Updated names of contributors.
+
+2000-11-05 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/Makefile.in (sample.wgetrc.munged_for_texi_inclusion): Use $(srcdir).
+
+2000-11-04 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/snprintf.c: New file.
+
+2000-11-03 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h: If HAVE_STDARG_H is not defined, don't declare argument
+ types to logprintf() and debug_logprintf().
+
+2000-11-02 Tyler Riddle <triddle@liquidmarket.com>
+
+ * src/http.c (known_authentication_scheme_p): Recognize NTML
+ authentication.
+ (create_authorization_line): Treat NTML the same as `Basic'.
+
+2000-11-02 Matthew Seaman <m.seaman@inpharmatica.co.uk>
+
+ * util/rmold.pl: Various fixes.
+
+2000-11-02 Junio Hamano <junio@twinsun.com>
+
+ * src/ftp-basic.c (ftp_login): Make comparison case-insensitive.
+
+2000-11-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (parseurl): Remove possible reading past the end of
+ sup_protos[]. Spotted by Mark A. Mankins <Mankins_Mark@prc.com>.
+
+2000-11-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Free url before returning.
+ (retrieve_url): Free mynewloc before returning.
+ Spotted by Mark A. Mankins <Mankins_Mark@prc.com>.
+
+2000-11-02 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (ftp_loop_internal): Hide the password from the URL when
+ printing non-verbose. Problem spotted by Dariusz Mlynarczyk
+ <darekm@bydg.lomac.com.pl>.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/wget.h (enum): Remove extra space after last enumeration.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/utils.c (long_to_string): Update with a later, better version.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (path_simplify_with_kludge): New function.
+ (path_simplify_with_kludge): Disable it. Instead...
+ (parse_dir): ...make sure that at this point the right thing is
+ done, i.e. that "query" part of the URL (?...) is always assigned
+ to the file, never to the directory portion of the path.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (get_urls_html): Decode HTML entities using
+ html_decode_entities.
+
+ * src/html.c (htmlfindurl): Don't count the `#' in numeric entities
+ (&#NNN;) as an HTML fragemnt.
+ (html_decode_entities): New function.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/url.c (construct): Rewritten for clarity. Avoids the
+ unnecessary copying and stack-allocation the old version
+ performed.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Detect redirection cycles.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): Use legible_very_long() for printing
+ opt.downloaded.
+
+ * src/utils.c (legible_1): New function that operates on strings and
+ does the brunt of legible()'s work.
+ (legible): Use legible_1().
+ (legible_very_long): New function; dump the argument with
+ sprintf(), and call legible_1().
+
+ * src/options.h (struct options): Use VERY_LONG_TYPE for
+ opt.downloaded.
+
+ * src/sysdep.h (VERY_LONG_TYPE): Define it to have a 64-bit or greater
+ type.
+
+ * src/config.h.in: Make sure that SIZEOF_LONG and SIZEOF_LONG_LONG get
+ defined. Define HAVE_LONG_LONG if long long is available.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/main.c (main): In case of opt.downloaded overflowing, print
+ <overflow> instead of a totally bogus random value.
+
+ * src/retr.c (retrieve_from_file): Ditto.
+
+ * src/recur.c (recursive_retrieve): Ditto.
+
+ * src/main.c (main): Ditto.
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (ftp_loop_internal): Use downloaded_increase() instead of
+ `+=', and downloaded_exceeds_quota() instead of the simple-minded
+ check.
+ (ftp_retrieve_list): Ditto.
+ (ftp_retrieve_dirs): Ditto.
+ (ftp_retrieve_glob): Ditto.
+
+ * src/retr.c (downloaded_increase): New function. Notice overflows of
+ opt.downloaded.
+ (downloaded_exceeds_quota): Make sure that opt.downloaded is not
+ used if it overflowed.
+
+ * src/options.h (struct options): New member downloaded_overflow.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/html.c (htmlfindurl): Fix recognition of # HTML fragments.
+
+2000-11-01 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * configure.in: Check for size of long and long long.
+
+2000-10-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/retr.c (retrieve_url): Use url_concat() to handle relative
+ redirections instead of /ad hoc/ code.
+
+ * src/url.c (url_concat): New function encapsulating weird
+ construct().
+ (urllen_http_hack): New function.
+ (construct): When constructing new URLs, recognize that `?' does
+ not form part of the file name in HTTP.
+
+2000-10-31 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Rewind the stream when retrying from scratch.
+
+2000-10-30 Dan Harkless <wget@harkless.org>
+
+ * NEWS: Hrvoje pointed out that relative URL grokking deserves mention.
+
+2000-10-27 Dan Harkless <wget@harkless.org>
+
+ * src/retr.c (retrieve_url): Manually applied T. Bharath
+ <TBharath@responsenetworks.com>'s patch to get wget to grok
+ illegal relative URL redirects. Reformatted and re-commented it.
+
+2000-10-27 Dan Harkless <wget@harkless.org>
+
+ * TODO: wget now groks illegal relative URL HTTP redirects.
+
+2000-10-24 Dan Harkless <wget@harkless.org>
+
+ * NEWS: Forgot to update regarding new --bind-address option.
+
+2000-10-23 Hrvoje Niksic <hniksic@arsdigita.com>
+
+ * doc/wget.texi (HTTP Options): Remove Netscape bullying.
+
+2000-10-23 Dan Harkless <wget@harkless.org>
+
+ * src/connect.c (make_connection and bindport): Manually applied Rob
+ Mayoff <mayoff@dqd.com>'s 1.5.3 patch to add --bind-address,
+ changing coding style to GNU's.
+
+ * src/ftp.c (ftp_loop_internal): --delete-after wasn't implemented for
+ files downloaded via FTP. Per a comment, .listing files were not
+ counted towards number of bytes and files downloaded because they're
+ deleted anyway. Well, they aren't under -nr, so count them then.
+
+ * src/init.c: Manually applied Rob Mayoff's 1.5.3 patch to add
+ --bind-address, alphabetizing, changing coding style to GNU's,
+ commenting, and renaming cmd_ip_address() to cmd_address() to
+ imply hostnames also okay.
+
+ * src/main.c (main): --delete-after didn't delete the root of the
+ tree. Ignore --convert-links if --delete-after was specified.
+ Manually applied Rob Mayoff's 1.5.3 patch to add --bind-address,
+ fixing duplicate use of added-since-1.5.3 case value.
+ (print_help): Clarified that --delete-after deletes local files.
+ Rob forgot to add a line for his new --bind-address option.
+
+ * src/options.h (struct options): Manually applied Rob Mayoff's patch
+ to add --bind-address (bind_address structure member).
+
+ * src/recur.c (recursive_retrieve): Improved comment; added DEBUGP().
+ Ignore --convert-links if --delete-after was specified.
+
+ * src/retr.c (retrieve_from_file): Just added a DEBUGP().
+
+2000-10-23 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Improved --delete-after docs.
+ (Download Options): Documented Rob Mayoff's new --bind-address option.
+ (Wgetrc Commands): Documented Rob Mayoff's new bind_address command.
+
+2000-10-20 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Sugg. -E on 1-page download.
+
+2000-10-20 Dan Harkless <wget@harkless.org>
+
+ * TODO: -k needs to convert '?' to "%3F" in links to saved files
+ containing the '?' character (e.g. CGI output). Also, we need to
+ check the HTTP spec w.r.t. simplification of absolute URLs.
+ Generalize --html-extension to something like --mime-extension.
+
+ * MAILING-LIST: I didn't realize <wget@sunsite.auc.dk> allowed posting
+ by non-subscribers. <bug-wget@gnu.org> soon to be an alias for it.
+
+ * NEWS: Always forget to update this file when making user-vis. changes.
+
+2000-10-19 Dan Harkless <wget@harkless.org>
+
+ * src/ftp.c (ftp_loop_internal): downloaded_file() enumerators changed.
+ (getftp): Applied Piotr Sulecki <Piotr.Sulecki@ios.krakow.pl>'s
+ patch to work around FTP servers that incorrectly respond to the
+ "REST" command with the remaining size rather than the total file size.
+
+ * src/http.c (gethttp): Improved a comment and added code to tack on
+ ".html" to text/html files without that extension when -E specified.
+ (http_loop): Use new downloaded_file() enumerators and deal with
+ the case of gethttp() called xrealloc() on u->local.
+
+ * src/init.c (commands): Added new "htmlextension" command.
+ Also renamed John Daily's cmd_quad() to the more descriptive
+ cmd_lockable_boolean(), alpha-sorted the CMD_DECLARE()s and
+ removed duplicate cmd_boolean() declaration.
+
+ * src/main.c (print_help): Added my new -E / --html-extension option.
+ (main): Undocumented --email-address option previously used -E synonym.
+ Stole it away for the much more deserving --html-extension's use.
+
+ * src/options.h (struct options): Added html_extension field.
+
+ * src/url.c (convert_links): URL X that we saved as X.html locally due
+ to -E needs to be backed up as X.orig, not X.html.orig. Added comments.
+ (downloaded_file): Now remembers if we added .html extension to a file.
+
+ * src/url.h (downloaded_file_t): Added extra enumerators to support above.
+ (downloaded_file): Now takes and returns a downloaded_file_t.
+
+ * src/wget.h (unnamed "dt" enum): Added ADDED_HTML_EXTENSION enumerator.
+
+2000-10-19 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (HTTP Options): Documented my new -E / --html-extension.
+ (Wgetrc Commands): Documented my new html_extension option and
+ John Daily's "quad" values (which I renamed to "lockable
+ Boolean"). When I documented Damir Dzeko's --referer, I forgot to
+ add the .wgetrc equivalent; mentioned the "referrer" spelling issue.
+
+2000-10-19 Dan Harkless <wget@harkless.org>
+
+ * TODO: -E / --html-extension / html_extension has been implemented.
+ Make -I and -X allow an optional hostname before the directory name?
+ When simplifying paths, wget needs to stop at any '?' character.
+
+ * configure.in: Put "it" language in proper alphabetical order and
+ added new languages "pl" and "ru".
+
+ * po/pl.{gmo,po}: Added Grzegorz Kowal <g_kowal@poczta.onet.pl>'s
+ Polish message translation file.
+
+ * po/ru.{gmo,po}: Added Const Kaplinsky <const@ce.cctpu.edu.ru>'s
+ Russian message translation file.
+
+2000-10-16 Dan Harkless <wget@harkless.org>
+
+ * TODO: Add option to save local filenames without extra %-encoding.
+
+2000-10-13 Adrian Aichner <adrian@xemacs.org>
+
+ * src/retr.c: Add msec timing support for WINDOWS.
+ * src/retr.c (reset_timer): GetSystemTime() on WINDOWS.
+ * src/retr.c (elapsed_time): Calculate delta time to msec on WINDOWS.
+
+2000-10-09 Dan Harkless <wget@harkless.org>
+
+ * src/html.c (htmlfindurl): Added unneeded initialization to quiet warning.
+
+ * src/main.c (print_help): Clarified what --retr-symlinks does.
+
+2000-10-09 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (FTP Options): --retr-symlinks wasn't documented properly.
+
+2000-10-09 Dan Harkless <wget@harkless.org>
+
+ * TODO: --retr-symlinks should cause wget to traverse links to dirs too.
+
+2000-09-25 Dan Harkless <wget@harkless.org>
+
+ * TODO: Make wget return nonzero in situations like bad HTTP
+ auth. Make wget follow (illegal) relative URL HTTP redirects.
+
+2000-09-15 John Daily <jdaily@cyberdude.com>
+
+ * src/init.c: Add support for "always" and "never" values to allow
+ .wgetrc to override commandline (useful e.g. with .pm files
+ calling `wget --passive-ftp' when your firewall doesn't allow that).
+
+ * src/ftp.c (getftp): passive_ftp is first option to support always/never.
+
+2000-08-30 Dan Harkless <wget@harkless.org>
+
+ * src/ftp.c (ftp_retrieve_list): Use new INFINITE_RECURSION #define.
+
+ * src/html.c: htmlfindurl() now takes final `dash_p_leaf_HTML' parameter.
+ Wrapped some > 80-column lines. When -p is specified and we're at a
+ leaf node, do not traverse <A>, <AREA>, or <LINK> tags other than
+ <LINK REL="stylesheet">.
+
+ * src/html.h (htmlfindurl): Now takes final `dash_p_leaf_HTML' parameter.
+
+ * src/init.c: Added new -p / --page-requisites / page_requisites option.
+
+ * src/main.c (print_help): Clarified that -l inf and -l 0 both allow
+ infinite recursion. Changed the unhelpful --mirrior description
+ to simply give the options it's equivalent to. Added new -p option.
+ (main): Added some comments; handle new -p / --page-requisites.
+
+ * src/options.h (struct options): Added new page_requisites field.
+
+ * src/recur.c: Changed "URL-s" to "URLs" and "HTML-s" to "HTMLs".
+ Calculate and pass down new `dash_p_leaf_HTML' parameter to
+ get_urls_html(). Use new INFINITE_RECURSION #define.
+
+ * src/retr.c: Changed "URL-s" to "URLs". get_urls_html() now takes
+ final `dash_p_leaf_HTML' parameter.
+
+ * src/url.c: get_urls_html() and htmlfindurl() now take final
+ `dash_p_leaf_HTML' parameter.
+
+ * src/url.h (get_urls_html): Now takes final `dash_p_leaf_HTML' parameter.
+
+ * src/wget.h: Added some comments and new INFINITE_RECURSION #define.
+
+2000-08-30 Dan Harkless <wget@harkless.org>
+
+ * po/*.{gmo,po,pot}: Regenerated after modifying wget --help output.
+
+ * MACHINES: Previously said to send updates to "me" (Hrvoje) --
+ now says to email the mailing list or bug-wget@gnu.org.
+
+ * MAILING-LIST: Added mention of bug-wget@gnu.org.
+
+ * NEWS: Added --waitretry and --page-requisites.
+
+2000-08-30 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Documented new -p option.
+ (Wgetrc Commands): Documented -p's equvialent, page_requisites.
+
+2000-08-25 Dan Harkless <wget@harkless.org>
+
+ * MACHINES: Alphabetized, changed "architectures" to "OSes and
+ architectures", added missing company names, removed needless ^L,
+ made AIX and FreeBSD entries more general to reflect successful
+ use on those platforms by myself and others, removed the
+ non-factual "this version of", and fixed some grammatical errors.
+
+2000-08-23 Dan Harkless <wget@harkless.org>
+
+ * src/main.c (print_help): -B / --base was not mentioned.
+
+2000-08-23 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Download Options): Using -c on a file that's already fully
+ downloaded results in an unchanged file and no second ".1" copy.
+
+ * doc/wget.texi (Logging and Input File Options): -B / --base was not
+ documented as a separate item, and the .wgetrc version was misleading.
+
+ * doc/wget.texi (Wgetrc Commands): Changed all instances of
+ ", the same as" to the more grammatical " -- the same as".
+
+2000-08-22 Dan Harkless <wget@harkless.org>
+
+ * src/main.c (print_help): Modified -nc description to mention that it
+ also prevents the creation of multiple versions of the same file
+ with ".<number>" suffixes.
+
+2000-08-22 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Download Options): --no-clobber's documentation was
+ severely lacking -- ameliorated the situation. Some of the
+ previously-undocumented stuff (like the multiple-file-version
+ numeric-suffixing) that's now mentioned for the first (and only)
+ time in the -nc documentation should probably be mentioned
+ elsewhere, but due to the way that wget.texi's hierarchy is laid
+ out, I had a hard time finding anywhere else appropriate.
+
+2000-07-21 Dan Harkless <wget@harkless.org>
+
+ * TODO: But Brian McMahon <bm@iucr.org> wants old behavior as an option.
+
+2000-07-19 Dan Harkless <wget@harkless.org>
+
+ * TODO: -k should convert "hostless absolute" URLs, like "/index.html".
+
+2000-07-17 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (HTTP Options): Minor clarification in "download a
+ single HTML page and all files necessary to display it" example.
+
+2000-07-14 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * src/retr.c (retrieve_url): Consistently strdup opt.referer when
+ setting u->referer.
+
+2000-06-09 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/url.c (encode_string): Fix comment.
+ Suggested by Herold Heiko <Heiko.Herold@previnet.it>.
+
+2000-06-09 Dan Harkless <wget@harkless.org>
+
+ * src/main.c (print_help): --help output for --waitretry was over 80 cols.
+
+2000-06-01 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/url.c (str_url): Print the port number only if it's different
+ from the default port number for that protocol.
+
+2000-06-01 Const Kaplinsky <const@ce.cctpu.edu.ru>
+
+ * src/ftp.c (ftp_retrieve_list): Change permissions only on plain
+ files.
+
+2000-05-24 Dan Harkless <wget@harkless.org>
+
+ * TODO: Timestamps sometimes not copied over on files retrieved by FTP.
+
+2000-05-22 Dan Harkless <wget@harkless.org>
+
+ * src/main.c (print_help): Added --help line for Damir Dzeko
+ <ddzeko@zesoi.fer.hr>'s until-now-undocumented --referer option.
+ Removed comments that --referer and --waitretry were undocumented.
+ Changed "`.wgetrc' command" to "`.wgetrc'-style command" on --help
+ line for --execute.
+
+2000-05-22 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (HTTP Options): Damir Dzeko <ddzeko@zesoi.fer.hr> did
+ not document his new --referer option. Did so.
+
+2000-05-22 Dan Harkless <wget@harkless.org>
+
+ * AUTHORS: Added myself to this file, as Hrvoje got confirmation
+ of my FSF copyright assignment.
+
+ * TODO: Added note that fragment identifiers don't work properly.
+
+ * po/*.{gmo,po,pot}: Regenerated after modifying wget --help output.
+
+2000-05-18 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Check for return value of fclose/fflush.
+
+2000-05-17 Dan Harkless <wget@harkless.org>
+
+ * TODO: Make `-k' check for files that were downloaded in the past
+ and convert links to them in newly-downloaded documents.
+
+2000-04-18 Dan Harkless <wget@harkless.org>
+
+ * doc/sample.wgetrc: Realized I put a global setting in the local section.
+
+2000-04-13 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in (sample.wgetrc.munged_for_texi_inclusion): Added
+ build, dependencies, and distclean cleanup of this new file.
+
+ * doc/sample.wgetrc: Uncommented waitretry and set it to 10, clarified
+ some wording, and re-wrapped some text to 71 columns due to
+ @sample indentation in wget.texi.
+
+ * doc/wget.texi: Herold further expounded on the behavior of waitretry
+ -- reworded docs again. Changed note saying _all_ lines in
+ sample.wgetrc are commented out. Don't have an entire hand-
+ cut-and-pasted copy of sample.wgetrc in this file -- use @include.
+
+2000-04-12 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/http.c (gethttp): Don't free REQUEST -- it was allocated with
+ alloca().
+ Pointed out by Gisle Vanem <gvanem@eunet.no>.
+
+2000-04-12 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/host.c (store_hostaddress): Instead of shifting ADDR, start
+ copying from the correct address.
+
+2000-04-12 Dan Harkless <wget@harkless.org>
+
+ * doc/Makefile.in (install.wgetrc): I completely missed the message
+ that the new wgetrc wasn't being installed the first couple of
+ times I ran `make install' after changing sample.wgetrc. Added
+ blank lines around the message and a "<Hit RETURN to
+ acknowledge>", and reworded the message to be a bit more clear.
+
+ * doc/sample.wgetrc: Added entries for backup_converted and waitretry.
+
+ * doc/wget.texi (Download Options and Wgetrc Commands): Herold Heiko
+ <Heiko.Herold@previnet.it>'s new --waitretry option was
+ undocumented until now. Reworded the suggested documentation he
+ sent to the list.
+
+2000-04-05 Dan Harkless <wget@harkless.org>
+
+ * TODO: Make -K only leave .orig files around when different. Add
+ an option to save all text/html files with .html extension. Allow
+ mirroring of FTP URLs where logging in puts you somewhere else
+ besides '/'.
+
+2000-04-04 Dan Harkless <wget@harkless.org>
+
+ * src/host.c (store_hostaddress): R. K. Owen's patch introduces a
+ "left shift count >= width of type" warning on 32-bit
+ architectures. Got rid of it by tricking the compiler w/ a variable.
+
+ * src/url.c (UNSAFE_CHAR): The macro didn't include all the illegal
+ characters per RFC1738, namely everything above '~'. It also
+ generated a warning on OSes where char =~ unsigned char. Fixed.
+
+2000-04-04 Dan Harkless <wget@harkless.org>
+
+ * NEWS (--follow-tags, -G / --ignore-tags): Forgot to mention
+ these new options when I added them.
+
+2000-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/Use TOUPPER/TOLOWER.
+
+2000-03-21 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * src/wget.h (DO_REALLOC_FROM_ALLOCA): Ditto.
+
+ * src/sysdep.h (ISALNUM): New macro.
+ (TOLOWER): Ditto.
+ (TOUPPER): Ditto.
+
+2000-03-10 Dan Harkless <wget@harkless.org>
+
+ * src/html.c (idmatch): Implemented checking of my new --follow-tags
+ and --ignore-tags options.
+
+ * src/init.c (commands): Added comment reminding people adding new
+ entries doing allocation to add corresponding freeing in cleanup().
+ (commands): Added new followtags and ignoretags commands.
+ (cleanup): Free storage for new followtags and ignoretags.
+
+ * src/main.c: Use of "comma-separated list" was random -- normalized
+ it. Did some alphabetization. Added comments pointing out
+ "Options without arguments" and "Options accepting an argument"
+ sections of long_options[]. Added new options --follow-tags and
+ -G / --ignore-tags. Added comment that Damir's --referer is
+ currently undocumented. Added comment that Heiko's --waitretry is
+ partially undocumented (mentioned in --help but not in
+ wget.texi). Moved improperly sorted 24, 129, and 'G' cases.
+
+ * src/options.h (struct options): Added new fields follow_tags and
+ ignore_tags.
+
+ * src/wget.h: Added "#define EQ 0" so we can say "strcmp(a, b) == EQ".
+
+2000-03-10 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): In -K description,
+ added a link to the discussion of interaction with -N.
+ (Recursive Accept/Reject Options): Did some alphabetizing and added
+ descriptions of new --follow-tags and -G / --ignore-tags options.
+ (Following Links): Changed "the loads of" to "loads of".
+ (Wgetrc Commands): Added descriptions of new follow_tags and
+ ignore_tags commands.
+
+2000-03-10 Dan Harkless <wget@harkless.org>
+
+ * TODO: Removed done item: we now have an option (-G) that makes
+ it easy to download a single HTML document and all its constituents.
+
+ * po/*.{gmo,po,pot}: Regenerated after adding new options.
+
+ * po/hr.po: Hrvoje forgot '\n's on his translations of my altered
+ messages, causing msgfmt to balk and `make install' to fail.
+
+2000-03-02 Hrvoje Niksic <hniksic@iskon.hr>
+
+ * doc/wget.texi (Contributors): Update contributors list.
+
+2000-03-02 HIROSE Masaaki <hirose31@t3.rim.or.jp>
+
+ * src/html.c (html_allow): Add <link href=...> and <script src=...>.
+
+2000-03-02 Daniel S. Lewart <d-lewart@uiuc.edu>
+
+ * doc/wget.texi: Fix spelling and grammatical mistakes.
+
+2000-03-02 Dan Harkless <wget@harkless.org>
+
+ * src/ftp.c (ftp_loop_internal): Heiko introduced "suggest explicit
+ braces to avoid ambiguous `else'" warnings. Eliminated them.
+
+ * src/http.c (gethttp): Dan Berger's query string patch is totally
+ bogus. If you have two different URLs, gen_page.cgi?page1 and
+ get_page.cgi?page2, they'll both be saved as get_page.cgi and the
+ second will overwrite the first. Also, parameters to implicit
+ CGIs, like "http://www.host.com/db/?2000-03-02" cause the URLs to
+ be printed with trailing garbage characters, and could seg fault.
+ Backing out the patch, which Dan B. informed me by email was just
+ a kludge to download StarOffice from Sun made necessary due to
+ wget's unconditional escaping of certain characters (room for an
+ option there?).
+ (http_loop): Heiko introduced "suggest explicit braces to avoid
+ ambiguous `else'" warnings. Eliminated them.
+
+ * src/main.c: Heiko's --wait / --waitretry backwards compatibility
+ code looks to have been totally untested -- automatic variable
+ 'wr' was used without being initialized, and a long int was passed
+ into setval()'s char* val parameter.
+
+ * src/recur.c (parse_robots): Applied Edward J. Sabol
+ <sabol@alderaan.gsfc.nasa.gov>'s patch for Guan Yang's reported
+ problem with "User-agent:<space>*<space>" lines in robots.txt.
+
+ * src/url.c (parseurl, str_url): Removing Dan Berger's code (see
+ http.c above for explanation).
+
+2000-03-01 Dan Harkless <wget@harkless.org>
+
+ * src/ftp.c (ftp_loop_internal): Call new downloaded_file() function,
+ even though we don't do conversion on HTML files retrieved via
+ FTP, so _current_ usage of downloaded_file() makes this call unneeded.
+ (ftp_retrieve_list): Added a comment saying where we need to
+ stat() a .orig file if FTP'd HTML file conversion is ever implemented.
+ (ftp_retrieve_list): "Local file '%s' is more recent," is sometimes
+ a lie -- reworded as "Server file no newer than local file '%s' --".
+
+ * src/http.c (http_loop): Fixed a typo and clarified a comment.
+ (http_loop): When -K and -N are specified together, compare size
+ and timestamp of server file X against local file X.orig (if
+ extant) rather than converted local file X.
+ (http_loop): "Local file '%s' is more recent," is sometimes a lie
+ -- reworded as "Server file no newer than local file '%s' --".
+ (http_loop): Call new downloaded_file() function to prevent
+ wrongful overwriting of .orig file when -N is specified.
+
+ * src/url.c (convert_links): When -K specified, only rename X to
+ X.orig if downloaded_file() returns TRUE. Otherwise when we skip
+ file X due to -N, we clobber an X.orig from a previous invocation.
+ (convert_links): Call the failsafe xstrdup(), not the real strdup().
+ (convert_links): Added a note asking anyone who understands how
+ multiple URLs can correspond to a single file to comment it.
+ (downloaded_file): Added this new function.
+
+ * src/url.h (downloaded_file): Added prototype for this new function
+ as well as its downloaded_file_t enum type.
+
+ * src/wget.h (boolean): Added this new typedef and TRUE and FALSE #defines.
+
+2000-03-01 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (HTTP Time-Stamping Internals): Added a note about my
+ newly-implemented interaction between -K and -N.
+
+2000-03-01 Dan Harkless <wget@harkless.org>
+
+ * NEWS (-K): Now possible to use -N with -k thanks to this option.
+
+ * TODO: Removed the -K / -N interaction item.
+
+2000-02-29 Dan Harkless <wget@harkless.org>
+
+ * src/version.c: Upped version to developer-only "1.5.3+dev".
+
+2000-02-29 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi: Updated version to 1.5.3+dev, updated copyrights to
+ 2000, changed Hrvoje's old, invalid email address to his new one,
+ and added " and the developers" to the .texi file's byline.
+
+2000-02-29 Dan Harkless <wget@harkless.org>
+
+ * NEWS (-K / --backup-converted): Mentioned this new option.
+
+2000-02-18 Dan Harkless <wget@harkless.org>
+
+ * src/init.c (backup_converted): Added this new option.
+
+ * src/main.c (-K / --backup-converted): Added this new option.
+
+ * src/options.h (backup_converted): Added this new option.
+
+ * src/url.c (convert_links): When backup_converted is specified, save
+ file X as X.orig before converting.
+
+ * src/url.h (urlpos): Fixed typo -- said "Rekative" instead of "Relative".
+
+2000-02-18 Dan Harkless <wget@harkless.org>
+
+ * doc/wget.texi (Recursive Retrieval Options): Documented my new -K /
+ --backup-converted option.
+ (Wgetrc Commands): Documented backup_converted equivalent.
+
+2000-02-18 Dan Harkless <wget@harkless.org>
+
+ * TODO: When -K is used with -N, check local X.orig against server X.
+
+2000-01-30 Damir Dzeko <ddzeko@zesoi.fer.hr>
+
+ * src/http.c (gethttp): Send custom Referer, if required.
+
+1999-09-24 Charles G Waldman <cgw@fnal.gov>
+
+ * src/netrc.c (parse_netrc): Allow passwords to contain spaces.
+
+ * src/netrc.c (parse_netrc): New function.
+
+1999-09-17 Dan Berger <dberger@ix.netcom.com>
+
+ * src/http.c (gethttp): Send it.
+
+ * src/url.c (parseurl): Detect query string in HTTP URL-s.
+ (str_url): Print it.
+
+1999-08-25 Heiko Herold <Heiko.Herold@previnet.it>
+
+ * src/ftp.c: Respect new option waitretry.
+
+1999-05-02 andrew deryabin <djsf@softhome.net>
+
+ * src/http.c (gethttp): Specify port in `Host' header only if it's
+ different from 80.
+
+1998-12-22 Alexander V. Lukyanov <lav@yars.free.net>
+
+ * src/ftp-opie.c (btoe): Zero-terminate OSTORE.
+
+1998-12-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (UNSAFE_CHAR): New macro.
+ (contains_unsafe): Use it.
+ (encode_string): Ditto.
+
+1998-12-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (i18n_initialize): Use LC_MESSAGES only if available.
+
+1998-12-01 "R. K. Owen" <rkowen@Nersc.GOV>
+
+ * src/host.c (store_hostaddress): Fix for big endian 64-bit machines.
+
+1998-11-03 Edward J. Sabol <sabol@alderaan.gsfc.nasa.gov>
+
+ * src/recur.c (recursive_retrieve): If a finite maximum depth is
+ specified, and we're are already at that depth, don't download the
+ HTML file for parsing.
+
+1998-10-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_process_type): Removed needless strdup(), a memory
+ leak.
+
+1998-09-25 Simon Munton <simonm@m4data.co.uk>
+
+ * src/init.c (wgetrc_file_name): Don't free HOME under Windows.
+
+1998-09-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/html.c (htmlfindurl): Set PH to the first occurrence of `#'.
+
+1998-09-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.3 is released.
+
+1998-09-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (ftp_getaddress): Don't warn when reverse-lookup of local
+ address doesn't yield FQDN.
+
+1998-09-21 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * src/cmpt.c (strerror): Fix declaration of sys_errlist.
+
+1998-09-11 Szakacsits Szabolcs <szaka@sienet.hu>
+
+ * src/html.c (htmlfindurl): Download table background.
+
+1998-09-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): Don't use an array subscript as the first
+ argument to STRDUP_ALLOCA.
+ From Kaveh R. Ghazi.
+
+1998-09-11 Hans Grobler <grobh@conde.ee.sun.ac.za>
+
+ * src/init.c (parse_line): Would free *com before allocating it.
+ (parse_line): Would free com instead of *com.
+
+1998-09-10 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * src/log.c: Use <stdarg.h> only when __STDC__.
+
+1998-09-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Don't print status code if quiet.
+
+1998-09-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (HTTP Options): Warn against masquerading as Mozilla.
+
+1998-09-10 Howard Gayle <howard@fjst.com>
+
+ * src/url.c (get_urls_html): Would drop the last character of the
+ link.
+
+1998-09-10 Howard Gayle <howard@fjst.com>
+
+ * src/ftp.c (ftp_retrieve_list): Don't update the time stamp of a file
+ not retrieved.
+
+1998-09-10 Adam D. Moss <adam@foxbox.org>
+
+ * src/html.c (htmlfindurl): Download <layer src=...>.
+
+1998-06-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c: Include <libc.h> on NeXT.
+
+1998-06-26 Heinz Salzmann <heinz.salzmann@intermetall.de>
+
+ * src/url.c (get_urls_html): Fix calculation of URL position.
+
+1998-06-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.2 is released.
+
+1998-06-23 Dave Love <d.love@dl.ac.uk>
+
+ * src/ftp.c, init.c, netrc.c: Include errno.h.
+
+ * src/http.c: Include errno.h and time header.
+
+ * src/Makefile.in (exext): Define.
+ (install.bin, uninstall.bin): Use it.
+
+1998-06-23 Dave Love <d.love@dl.ac.uk>
+
+ * configure.in (exext): Define.
+
+1998-06-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Don't attempt to compare local and remote
+ sizes if the remote size is unknown.
+
+1998-06-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Use malloc() instead of alloca in the
+ loop.
+
+1998-06-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.2-b4 is released.
+
+1998-06-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Ignore spaces before and after the URI.
+
+1998-06-08 Wanderlei Antonio Cavassin <cavassin@conectiva.com.br>
+
+ * src/ftp.c (getftp): Translate `done'.
+
+1998-06-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.2-b3 is released.
+
+1998-06-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (make_directory): Twiddle.
+
+ * src/config.h.in: Added template for access().
+
+1998-06-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * configure.in: Check for access().
+
+1998-06-06 Alexander Kourakos <awk@bnt.com>
+
+ * src/init.c (cleanup): Close dfp, don't free it.
+
+1998-06-05 Mathieu Guillaume <mat@cythere.com>
+
+ * src/html.c (htmlfindurl): Download <input src=...>
+
+1998-06-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (file_exists_p): Use access() with two arguments.
+
+1998-05-27 Martin Kraemer <Martin.Kraemer@mch.sni.de>
+
+ * src/netrc.c (parse_netrc): Correct logic.
+
+1998-05-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Added `break'; suggested by Lin Zhe Min
+ <ljm@ljm.wownet.net>.
+
+1998-05-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.2-b2 is released.
+
+1998-05-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in (clean): Remove HTML files.
+
+1998-05-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * po/hr.po: Some fixes, as per suggestions by Francois Pinard.
+
+1998-05-19 Toomas Soome <tsoome@ut.ee>
+
+ * po/et.po: Updated.
+
+1998-05-19 Dominique Delamarre <dominique.delamarre@hol.fr>
+
+ * po/fr.po: New file.
+
+1998-05-18 Juan Jose Rodriguez <jcnsoft@jal1.telmex.net.mx>
+
+ * src/mswindows.h: Don't translate mkdir to _mkdir under Borland.
+
+1998-05-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (elapsed_time): Return correct value when
+ HAVE_GETTIMEOFDAY is undefined.
+
+1998-05-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.2-b1 is released.
+
+1998-05-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Various updates.
+ (Proxies): New node.
+
+1998-05-11 Simos KSenitellis <simos@teiath.gr>
+
+ * po/el.po: New file.
+
+1998-05-09 Toomas Soome <tsoome@ut.ee>
+
+ * po/et.po: New file.
+
+1998-05-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/texinfo.tex: New file.
+
+1998-05-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * aclocal.m4 (WGET_WITH_NLS): Print available catalogs.
+
+1998-05-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/getopt.c (_getopt_internal): Use exec_name instead of argv[0].
+ (_getopt_internal): Don't translate `#if 0'-ed strings.
+
+1998-05-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in (dvi): New target.
+
+1998-05-06 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * windows/makefile.bor: Updated.
+
+ * windows/Makefile.src: Ditto.
+
+1998-05-06 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * src/mswindows.c (ws_handler): Use fork_to_background().
+
+1998-05-06 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * configure.bat: set up for either Borland or Visual C
+
+ * windows/wget.dep: new file
+
+ * windows/Makefile.*: use wget.dep
+
+ * rename windows/Makefile.bor to Makefile.src.bor
+
+1998-05-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.1 is released.
+
+1998-05-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (parse_http_status_line): Avoid `minor' and `major'
+ names.
+
+1998-05-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (mkdirhier): Renamed to make_directory.
+
+1998-05-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Recursive Retrieval): Fix typo. Suggested by
+ Francois Pinard.
+
+1998-05-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/mswindows.c (fork_to_background): Define under Windows.
+
+ * src/utils.c (fork_to_background): New function.
+
+ * src/html.c (htmlfindurl): Removed rerdundant casts.
+
+1998-05-01 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * src/mswindows.c (ws_mypath): Cache the path.
+
+1998-04-30 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * windows/config.h.bor: New file.
+
+ * windows/makefile.bor: New file.
+
+1998-04-30 Douglas E. Wegscheid <wegscd@whirlpool.com>
+
+ * src/ftp.h: Prefix enum ftype members with FT_.
+
+ * src/ftp-ls.c, ftp.c, html.h: Adjust accordingly.
+
+ * src/mswindows.h: Use stat under Borland, _stat under MSVC.
+
+1998-04-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (known_authentication_scheme_p): New function.
+ (gethttp): Handle authorization more correctly.
+
+ * src/ftp-basic.h: Removed.
+
+ * src/cmpt.h: Removed.
+
+ * src/utils.c: Include <unistd.h> before <pwd.h>; needed under SunOS
+ with gcc 2.8.
+ (numdigit): Use `while' loop.
+
+ * src/http.c (create_authorization_line): Detect authentication
+ schemes case-insensitively.
+
+ * src/http.c (extract_header_attr): Use strdupdelim().
+ (digest_authentication_encode): Move declaration of local
+ variables to smaller scope.
+ (digest_authentication_encode): Reset REALM, OPAQUE and NONCE.
+ (create_authorization_line): Detect authentication schemes
+ case-insensitively.
+
+ * src/utils.c (touch): Constify.
+
+ * src/http.c (gethttp): Report a nicer error when no data is received.
+
+ * src/rbuf.h (RBUF_READCHAR): Ditto.
+
+ * src/ftp-basic.c (ftp_response): Use sizeof.
+
+1998-04-27 John Burden <john@futuresguide.com>
+
+ * windows/Makefile.*: Cleanup.
+
+1998-04-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (print_percentage): EXPECTED is long, not int.
+ (print_percentage): Use floating-point arithmetic to avoid
+ overflow with large files' sizes multiplied with 100.
+
+1998-04-27 Gregor Hoffleit <flight@mathi.uni-heidelberg.de>
+
+ * src/config.h.in: Added pid_t stub.
+
+ * src/sysdep.h (S_ISREG): Moved here from mswindows.h (NeXT doesn't
+ define it).
+
+1998-04-27 Gregor Hoffleit <flight@mathi.uni-heidelberg.de>
+
+ * configure.in: Check for PID_T.
+
+1998-04-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5.0 is released.
+
+1998-04-19 Wanderlei Cavassin <cavassin@conectiva.com.br>
+
+ * po/pt_BR.po: Updated.
+
+1998-04-19 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * po/cs.po: Updated.
+
+1998-04-19 Giovanni Bortolozzo <borto@dei.unipd.it>
+
+ * po/it.po: Updated.
+
+1998-04-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (str_url): Ditto.
+
+ * src/ftp-basic.c (ftp_rest): Use new name.
+
+ * src/utils.c (long_to_string): Renamed from prnum().
+
+1998-04-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Fixed @dircategory, courtesy Karl Eichwalder.
+
+1998-04-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b17 is released.
+
+1998-04-08 Wanderlei Cavassin <cavassin@conectiva.com.br>
+
+ * po/pt_BR.po: Updated.
+
+1998-04-08 Stefan Hornburg <racke@gundel.han.de>
+
+ * Makefile (dist): New target.
+
+1998-04-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b16 is released.
+
+1998-04-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (commands): Renamed `always_rest' to `continue'.
+
+1998-04-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/headers.c (header_get): New argument FLAGS.
+
+ * src/http.c (gethttp): If request is malformed, bail out of the
+ header loop.
+ (gethttp): Check for empty header *after* the status line checks.
+ (gethttp): Disallow continuations for status line.
+
+1998-04-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/all: Use it.
+
+ * src/log.c (logputs): New argument.
+ (logvprintf): Ditto.
+ (logprintf): Ditto.
+
+1998-04-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b15 is released.
+
+1998-04-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.h: Declare file_non_directory_p().
+
+1998-04-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_atotm): Update comment.
+
+ * src/main.c (i18n_initialize): Set LC_MESSAGES, not LC_ALL.
+
+ * src/wget.h: Renamed ENABLED_NLS to HAVE_NLS.
+
+ * src/main.c (i18n_initialize): New function.
+ (main): Use it.
+
+ * src/log.c: Include <unistd.h>.
+
+ * src/retr.c (show_progress): Cast alloca to char *.
+
+1998-04-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * aclocal.m4 (WGET_WITH_NLS): Renamed USE_NLS to HAVE_NLS.
+
+ * ABOUT-NLS: Removed.
+
+ * Makefile.in (stamp-h): Clean up stamp-h-related dependencies.
+ Don't attempt to write to stamp-h.in.
+
+ * aclocal.m4 (WGET_PROCESS_PO): Reset srcdir to ac_given_srcdir.
+
+1998-04-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): It's `tries', not `numtries' now.
+
+1998-04-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * Makefile.in (distclean-top): Remove stamp-h.
+
+1998-04-02 Robert Schmidt <rsc@vingmed.no>
+
+ * po/no.po: New file.
+
+1998-04-01 Tim Charron <tcharron@interlog.com>
+
+ * src/log.c (logvprintf): Don't use ARGS twice.
+
+1998-04-01 Junio Hamano <junio@twinsun.com>
+
+ * src/http.c: Document all the Digest functions.
+
+1998-04-01 John <john@futuresguide.com>
+
+ * src/mswindows.c: Cleaned up.
+
+1998-04-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b14 is released.
+
+1998-04-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (file_non_directory_p): Renamed from isfile().
+
+ * src/mswindows.h (S_ISREG): New macro, suggested by Tim Adam.
+
+1998-04-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (getperms): Removed.
+
+1998-04-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp-opie.c (STRLEN4): New macro.
+ (btoe): Use it.
+
+1998-04-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * configure.in: New option `--disable-debug'.
+
+1998-03-31 Junio Hamano <junio@twinsun.com>
+
+ * src/http.c (HEXD2asc): New macro.
+ (dump_hash): Use it.
+
+1998-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b13 is released.
+
+1998-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (mkdirhier): Use 0777 instead of opt.dirmode.
+
+ * src/init.c (cmd_spec_dotstyle): Use 48 dots per line for binary
+ style.
+ (cmd_permissions): Removed.
+
+ * src/config.h.in: Add template for WORDS_BIGENDIAN.
+
+1998-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): Don't try to use `com'.
+
+1998-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in: Don't attempt to (un)install the man-page.
+
+1998-03-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * configure.in: Check for endianness.
+
+1998-03-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b12 is released.
+
+1998-03-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (commands): Renamed `numtries' to `tries'.
+ (cmd_spec_debug): Removed.
+ (home_dir): Under Windows, return `C:\' if HOME is undefined.
+
+1998-03-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (cmd_permissions): New function.
+
+1998-03-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.1: Removed it.
+
+1998-03-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b11 is released.
+
+1998-03-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/config.h.in: Define _XOPEN_SOURCE.
+
+ * src/init.c (check_user_specified_header): New function.
+ (cmd_spec_header): Use it.
+ (cmd_spec_useragent): New function.
+
+1998-03-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Invoking): Split into more sections, analogous to
+ output of `wget --help'.
+ (HTTP Options): Document --user-agent.
+
+1998-03-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * aclocal.m4 (WGET_PROCESS_PO): Use echo instead of AC_MSG_RESULT.
+
+1998-03-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/wget.h: Include <libintl.h> only if NLS is enabled.
+
+1998-03-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * aclocal.m4 (WGET_WITH_NLS): Disable USE_NLS if gettext is
+ unavailable.
+
+ * aclocal.m4: Renamed AM_STRUCT_UTIMBUF to WGET_STRUCT_UTIMBUF;
+ renamed AM_WITH_NLS to WGET_WITH_NLS.
+
+ * aclocal.m4: Eliminate POSUBS.
+
+1998-03-26 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/options.h (struct options): Made `wait' a long.
+ (struct options): Ditto for `timeout'.
+
+1998-03-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (exists): Renamed to file_exists_p.
+ (file_exists_p): Use access() if available.
+
+1998-03-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (memfatal): Set save_log_p to 0 to avoid potential
+ infloop.
+
+ * src/log.c: do_logging -> save_log_p.
+
+ * src/config.h.in: Added template for HAVE_VSNPRINTF.
+
+1998-03-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * Makefile.in: config.h* -> src/config.h*
+
+ * configure.in: Check for vsnprintf().
+
+ * po/POTFILES.in: Updated.
+
+1998-03-16 Jan Prikryl <prikryl@cg.tuwien.ac.at>
+
+ * po/cs.po: New file.
+
+1998-03-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b10 is released.
+
+1998-03-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c: Ditto.
+
+ * src/http.c: Protect declaration against non-ANSI compiler.
+
+ * src/log.c (logvprintf): Use vsnprintf() if available.
+
+ * src/getopt.c (main): Don't translate test stuff.
+
+1998-03-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * po/POTFILES.in: Removed extraneous newline at end of line, which
+ caused an error in `Makefile' which Sun make choked on.
+
+1998-03-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Contributors): Updated with oodles of new names.
+
+1998-03-12 Wanderlei Cavassin <cavassin@conectiva.com.br>
+
+ * po/pt_BR.po: New file.
+
+1998-03-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Don't translate "CWD %s".
+
+ * src/wget.h (GCC_FORMAT_ATTR): Renamed from FORMAT_ATTR.
+
+1998-03-07 Tim Adam <tma@osa.com.au>
+
+ * src/recur.c (parse_robots): Correctly reset `entries' on empty
+ disallow.
+
+1998-03-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (cmd_spec_debug): Use cmd_boolean().
+
+1998-03-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp-opie.c (btoe): Use memcpy() instead of strncat().
+
+ * src/log.c (logputs): New function.
+ (logvprintf): Renamed from vlogmsg; use logputs().
+
+ * src/retr.c (show_progress): Print `[100%]' when the retrieval is
+ finished.
+
+ * src/init.c (run_wgetrc): Use FILE, not PATH.
+ (wgetrc_file_name): Ditto.
+
+1998-03-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * PROBLEMS: New file.
+
+1998-02-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Create proxy-authorization correctly.
+
+1998-02-22 Karl Eichwalder <ke@suse.de>
+
+ * po/Makefile.in.in (install-data-yes): Fix creation of
+ directories for LC_MESSAGE files.
+
+1998-02-22 Karl Eichwalder <ke@suse.de>
+
+ * doc/Makefile.in (install.info): only info files (no *info.orig,
+ etc.).
+
+1998-02-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b9 is released.
+
+1998-02-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (recursive_retrieve): Reset `first_time'.
+
+ * src/ftp.c (getftp): Added `default' clause to switches of uerr_t.
+
+ * src/rbuf.c (rbuf_peek): Simplified.
+ (rbuf_flush): Use MINVAL.
+
+ * src/wget.h (MINVAL): Moved from url.h.
+
+ * src/rbuf.h (RBUF_FD): New macro.
+
+ * src/url.c (add_url): Add to the head of the list.
+
+ * src/ftp.c (ftp_retrieve_list): Set the permissions to downloaded
+ file.
+ (getftp): Set the default permissions to 0600.
+
+1998-02-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/md5.c: Ditto.
+
+ * src/getopt.c: Use ANSI function definitions.
+
+ * src/ftp-opie.c: New file.
+
+ * src/options.h: Don't redefine EXTERN.
+
+ * src/init.c: Sort it correctly.
+
+1998-02-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * configure.in: Removed `-Wno-switch' for gcc.
+
+ * po/Makefile.in.in (install-data-yes): Use mkinstalldirs to
+ create the directory first.
+
+1998-02-21 Karl Eichwalder <karl@suse.de>
+
+ * po/de.po: Updated.
+
+1998-02-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Ditto.
+ (convert_links): Ditto.
+
+ * src/recur.c (parse_robots): Ditto.
+
+ * src/html.c (ftp_index): Ditto.
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Open file as binary.
+
+ * src/init.c (defaults): Initialize `opt' to zero via memset.
+
+ * src/http.c (digest_authentication_encode): goto considered harmful.
+
+1998-02-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (delelement): Simplify and fix leak.
+
+1998-02-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * Makefile.in (check): New empty target.
+
+1998-02-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (dump_hash): Use HEXD2ASC instead of home-grown stuff.
+
+ * src/url.h (HEXD2ASC): Removed warning.
+
+ * src/init.c (comind): Use binary search.
+ (commands): Reorganized.
+ (setval): Ditto.
+ (cmd_boolean): New function.
+ (cmd_number): Ditto.
+ (cmd_number_inf): Ditto.
+ (cmd_string): Ditto.
+ (cmd_vector): Ditto.
+ (cmd_directory_vector): Ditto.
+ (cmd_bytes): Ditto.
+ (cmd_time): Ditto.
+ (cmd_spec_debug): Ditto.
+ (cmd_spec_dirmode): Ditto.
+ (cmd_spec_dirstruct): Ditto.
+ (cmd_spec_dotstyle): Ditto.
+ (cmd_spec_header): Ditto.
+ (cmd_spec_htmlify): Ditto.
+ (cmd_spec_mirror): Ditto.
+ (cmd_spec_outputdocument): Ditto.
+ (cmd_spec_recursive): Ditto.
+ (settime): Merged with cmd_time().
+ (setbytes): Merged with cmd_bytes().
+ (setonoff): Merged with cmd_boolean().
+ (onoff): Ditto.
+
+1998-02-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b8 is released.
+
+1998-02-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (digest_authentication_encode): New function.
+ (create_authorization_line): Use it.
+ (dump_hash): New function.
+ (digest_authentication_encode): Use it.
+
+ * src/fnmatch.c: Renamed from `mtch.c'.
+
+1998-02-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/Makefile.in (distclean): Remove `config.h'.
+
+1998-02-15 Karl Eichwalder <ke@suse.de>
+
+ * src/main.c (main): Tag "Written by..." string as translatable.
+
+1998-02-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/wget.h (FREE_MAYBE): New macro.
+
+ * src/http.c (create_authorization_line): Don't use ANSI C string
+ concatenation feature.
+ (basic_authentication_encode): Use alloca() for temporary
+ variables.
+
+ * src/recur.h: Ditto.
+
+ * src/http.c: Ditto.
+
+ * src/headers.h: Ditto.
+
+ * src/ftp-basic.c: Protect declaration against non-ANSI compiler.
+
+ * src/http.c (create_authorization_line): Cast `unsigned char *' to
+ `char *' for sprintf, to shut up the noisy Digital Unix cc.
+
+1998-02-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b7 is released.
+
+1998-02-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/cmpt.c (strstr): Synched with glibc-2.0.6.
+
+ * src/ftp-basic.c (calculate_skey_response): Ditto.
+ (calculate_skey_response): Use alloca().
+
+ * src/http.c (create_authorization_line): Work with FSF's version of
+ md5.c.
+
+ * src/md5.c: New file, from GNU libc.
+
+1998-02-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.h (URL_CLEANSE): Name the temporary variable more carefully.
+
+1998-02-13 Junio Hamano <junio@twinsun.com>
+
+ * src/http.c: Add HTTP-DA support.
+ * src/ftp-basic.c: Add Opie/S-key support.
+ * src/config.h.in, Makefile.in: Add HTTP-DA and Opie/S-key support.
+ * src/md5.c, md5.h: New files.
+
+1998-02-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_process_range): Renamed from hprocrange().
+ (http_process_range): Parse the whole header.
+
+ * src/headers.c: New file.
+ (header_process): New function.
+ (header_get): Renamed from fetch_next_header.
+
+ * src/all: Include utils.h only where necessary.
+
+ * src/wget.h: Declare xmalloc(), xrealloc() and xstrdup() here.
+
+ * src/wget.h: Add provisions for dmalloc.
+
+1998-02-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (basic_authentication_encode): New function, instead of
+ the macro.
+
+1998-02-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b6 is released.
+
+1998-02-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop): Determine `filename' more precisely.
+
+ * src/init.c (setval): Don't set `opt.quiet' if output-document is
+ `-'.
+
+ * src/log.c (log_init): Print to STDERR instead of STDOUT.
+ (vlogmsg): Use STDERR by default.
+ (logflush): Ditto.
+
+1998-02-11 Simon Josefsson <jas@pdc.kth.se>
+
+ * src/host.c: Use addr_in again.
+
+1998-02-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * po/it.po: New file, by Antonio Rosella.
+
+1998-02-08 Karl Eichwalder <karl@suse.de>
+
+ * src/http.c (gethttp): Fixed typo.
+
+1998-02-08 Karl Eichwalder <karl@suse.de>
+
+ * po/de.po: Updated.
+
+1998-02-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b5 is released.
+
+1998-02-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (show_progress): Use it.
+
+ * src/log.c (logflush): New function.
+
+ * src/wget.h: Utilize __attribute__ if on gcc.
+
+1998-02-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * aclocal.m4: Cleaned up.
+
+ * po/hr.po: Updated.
+
+ * configure.in: Removed check for POSIXized ISC.
+
+1998-02-07 Karl Eichwalder <ke@suse.de>
+
+ * Makefile.in (install.info uninstall.info install.man
+ uninstall.man install.wgetrc): Use it.
+
+ * Makefile.in (install.mo): New target.
+
+1998-02-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (base64_encode_line): New argument LENGTH.
+ (BASIC_AUTHENTICATION_ENCODE): Use it.
+ (BASIC_AUTHENTICATION_ENCODE): Take length of HEADER into account.
+
+ * src/main.c (main): Fixed fprintf() format mismatch.
+
+1998-02-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b4 is released.
+
+1998-02-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (cleanup): Use it.
+
+ * src/recur.c (recursive_cleanup): New function.
+
+ * src/retr.c (retrieve_from_file): Ditto.
+
+ * src/main.c (main): Use it.
+
+ * src/recur.c (recursive_reset): New function.
+
+ * src/retr.c (retrieve_from_file): Ditto.
+
+ * src/main.c (main): Simplify call to recursive_retrieve().
+
+ * src/recur.c (recursive_retrieve): Removed FLAGS argument.
+
+ * src/http.c (gethttp): Changed call to iwrite().
+
+1998-02-03 Simon Josefsson <jas@pdc.kth.se>
+
+ * src/host.c: use sockaddr_in instead of addr_in.
+
+1998-02-03 Karl Eichwalder <ke@suse.de>
+
+ * po/POTFILES.in: Touch it (needed for NLS); add src/ftp.c,
+ src/getopt.c, src/host.c, src/html.c, src/http.c, src/init.c,
+ src/main.c, src/mswindows.c, src/netrc.c, src/recur.c, src/retr.c,
+ src/url.c, and src/utils.c.
+
+ * intl/po2tbl.sed.in: Add from gettext-0.10.32 (needed for NLS).
+
+ * po/Makefile.in.in: Add from gettext-0.10.32.
+
+ * Makefile.in (SUBDIRS): Add po/.
+
+ * configure.in (ALL_LINGUAS): New variable. Add "de" and "hr".
+ (AM_GNU_GETTEXT): Add.
+ (AC_OUTPUT): Add po/Makefile.in; run the sed command.
+
+ * aclocal.m4 (AM_WITH_NLS, AM_GNU_GETTEXT, AM_LC_MESSAGES,
+ AM_PATH_PROG_WITH_TEST): from gettext-0.10.32.
+
+1998-02-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b3 is released.
+
+ * src/host.c (ftp_getaddress): Don't print to stderr directly.
+
+ * src/init.c (setbytes): Support `g' for gigabytes.
+ (cmdtype): New specification CTIME.
+ (setval): Use it with settime().
+ (commands): Use it for WAIT and TIMEOUT.
+
+1998-02-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Ditto.
+ (free_urlpos): Ditto.
+ (mkstruct): Ditto.
+ (construct): Ditto.
+
+ * src/retr.c (retrieve_url): Move declaration of local variables to
+ smaller scope.
+
+ * src/url.c (urlproto): Use it.
+ (parseurl): Ditto.
+ (str_url): Ditto.
+ (get_urls_html): Ditto.
+
+ * src/utils.h (ARRAY_SIZE): New macro.
+
+ * src/url.c (proto): Moved from url.h.
+
+ * src/url.h (URL_CLEANSE): Reformatted.
+ (USE_PROXY_P): Renamed from USE_PROXY.
+
+ * src/ftp-basic.c: Adjust to the new interface of iwrite().
+
+ * src/ftp-basic.c (ftp_port): Use alloca().
+
+1998-02-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (BASIC_AUTHENTICATION_ENCODE): New macro.
+ (gethttp): Use it.
+
+ * src/utils.c (unique_name_1): Moved from url.c.
+ (unique_name): Ditto.
+
+ * src/url.c (url_filename): Ditto.
+
+ * src/log.c (redirect_output): Changed call to unique_name().
+
+ * src/url.c (unique_name_1): Renamed from unique_name().
+ (unique_name): Changed interface.
+
+ * src/init.c (enum cmdid): Moved from init.h.
+ (cmdtype): Ditto.
+ (struct cmd): Ditto.
+
+ * src/main.c (main): Use it.
+ (main): Moved `--backups' to not have a short option.
+
+ * src/options.h (struct options): New member BACKGROUND.
+
+ * src/main.c (print_help): Rearranged.
+ (main): New long options for -n* short options: --no-directories,
+ --no-host-directories, --non-verbose, --no-host-lookup and
+ --dont-remove-listing.
+
+1998-02-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): Use log_close().
+
+ * src/log.c: New variable LOGFP.
+ (vlogmsg): Use it.
+ (redirect_output): Don't open /dev/null; set LOGFP to stdin
+ instead.
+ (log_close): New function.
+
+ * src/options.h (struct options): Removed LFILE.
+
+ * src/log.c (log_enable): Removed.
+
+ * src/main.c (main): Use it.
+
+ * src/log.c (log_init): New function.
+
+ * src/url.c (get_urls_html): Removed needless assignment to BASE.
+
+ * src/host.c (add_hlist): Don't set CMP needlessly.
+
+ * src/utils.c (match_backwards): Ditto.
+ (in_acclist): Ditto.
+
+ * src/url.c (findurl): Ditto.
+
+ * src/netrc.c (parse_netrc): Ditto.
+
+ * src/log.c (log_dump): Ditto.
+
+ * src/html.c (html_quote_string): Ditto.
+
+ * src/ftp-basic.c (ftp_request): Made static.
+
+ * src/connect.c: Made global variables static.
+
+ * src/url.c (construct): Ditto.
+
+ * src/init.c (init_path): Avoid assignment inside `if'-condition.
+
+ * src/ftp.c: Don't include in.h or winsock.h.
+
+ * src/ftp.c (ftp_loop): Use SZ.
+
+ * src/connect.c (bindport): Cast &addrlen to int *.
+ (conaddr): Ditto.
+
+ * src/init.c (initialize): Don't use SYSTEM_WGETRC unconditionally.
+
+1998-01-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget 1.5-b2 is released.
+
+ * src/netrc.c (NETRC_FILE_NAME): Moved from netrc.h.
+
+ * src/utils.c (proclist): Pass FNM_PATHNAME to fnmatch().
+
+ * src/ftp-basic.c (ftp_pasv): Avoid unnecessary casting to unsigned
+ char.
+
+ * src/log.c: Don't attempt to hide arguments from ansi2knr.
+
+ * src/cmpt.c: Synched strptime() and mktime() with glibc-2.0.6.
+
+ * src/ansi2knr.c: Use a later version, from fileutils-3.16l alpha.
+
+ * src/ftp.c (getftp): Ditto.
+
+ * src/http.c (gethttp): Use it.
+
+ * src/retr.c (get_contents): New argument EXPECTED; pass it to
+ show_progress().
+ (show_progress): New argument EXPECTED; use it to display
+ percentages.
+
+ * src/init.c (setval): Ditto.
+
+ * src/http.c (gethttp): Ditto.
+ (http_loop): Ditto.
+
+ * src/ftp.c (getftp): Ditto.
+ (ftp_loop_internal): Ditto.
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Use abort() instead of assert(0).
+
+ * src/sysdep.h (CLOSE): Simplify; use DEBUGP.
+
+ * src/netrc.c (search_netrc): Use alloca().
+
+ * src/init.c (defaults): Initialize no_flush.
+
+ * src/log.c (vlogmsg): Don't flush if no_flush.
+
+ * src/options.h (struct options): New variable no_flush.
+
+ * src/main.c (main): Don't play games with buffering.
+
+ * src/log.c (vlogmsg): Flush the output after every message.
+
+1998-01-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (parse_robots): Check for comments more correctly.
+
+ * src/host.c (ftp_getaddress): Use STRDUP_ALLOCA.
+ (ftp_getaddress): Add diagnostics when reverse-lookup yields only
+ hostname.
+
+1998-01-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (parse_line): Ditto.
+
+ * src/url.c (get_urls_html): Ditto.
+
+ * src/main.c (main): Don't cast to unsigned char.
+
+ * src/init.c (run_wgetrc): Don't cast to unsigned char.
+ (parse_line): Accept char instead of unsigned char.
+
+ * src/html.c (htmlfindurl): Use char instead of unsigned char.
+
+ * src/all: Use them.
+
+ * src/sysdep.h: Add wrappers to ctype macros to make them
+ eight-bit-clean:
+
+1998-01-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Initialize opt.ftp_pass here.
+ (ftp_retrieve_dirs): Use alloca().
+
+ * src/init.c (defaults): Don't initialize opt.ftp_pass.
+
+ * src/sysdep.h (S_ISLNK): Declare for OS/2; ditto for lstat.
+ From Ivan F. Martinez <ivanfm@ecodigit.com.br>.
+
+1998-01-31 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in (install.wgetrc): Don't use `!'.
+
+1998-01-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Cosmetic changes.
+
+ * src/http.c (check_end): Allow `+D...' instead of `GMT'.
+ From Fabrizio Pollastri <pollastri@cstv.to.cnr.it>.
+
+ * src/url.c (process_ftp_type): New function.
+ (parseurl): Use it.
+
+ * src/connect.c (iwrite): Allow writing in a few chunks.
+ (bindport): Made SRV static, so addr can point to it.
+ (select_fd): Removed HPUX kludge.
+
+ * src/host.c (free_hlist): Incorporated into clean_hosts().
+
+1998-01-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/html.c (htmlfindurl): Download <img lowsrc=...>
+
+ * src/main.c (main): Ignore SIGPIPE.
+
+ * src/connect.c (select_fd): New argument WRITEP.
+ (iwrite): Call select_fd().
+
+1998-01-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget v1.5-b1 is released.
+
+ * src/http.c (hgetlen): Use sizeof() to get the header length.
+ (hgetrange): Ditto.
+ (hgettype): Ditto.
+ (hgetlocation): Ditto.
+ (hgetmodified): Ditto.
+ (haccepts_none): Ditto.
+
+ * src/main.c (main): Updated `--version' and `--help' output, as per
+ Francois Pinard's suggestions.
+
+ * src/main.c: Include locale.h; call setlocale(), bindtextdomain() and
+ textdomain().
+
+ * src/config.h.in: Define stubs for I18N3.
+
+ * src/wget.h: Include libintl.h.
+
+1998-01-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (hlist): Made static.
+ (search_address): Cosmetic change.
+
+1998-01-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (mkstruct): Check for opt.cut_dirs.
+ (mkstruct): alloca()-te more, xmalloc() less.
+
+ * src/utils.c (load_file): Check for ferror().
+
+ * src/url.c (get_urls_file): Close only the files we opened.
+ (get_urls_html): Ditto.
+ (count_slashes): New function.
+
+ * src/http.h: Removed.
+
+ * src/http.c (gethttp): Respect username and password provided by
+ proxy URL.
+ (base64_encode_line): Write into an existing buffer instead of
+ malloc-ing a new one.
+ (struct http_stat): Moved from http.h
+
+ * src/retr.c (retrieve_url): Free SUF.
+
+ * src/all: Removed lots of unnecessary .h dependencies.
+
+ * src/html.c (global_state): Made static.
+
+ * src/utils.h (ALLOCA_ARRAY): New macro.
+
+ * src/main.c (main): New option `--cut-dirs'.
+
+ * src/url.c (construct): Use alloca() for T.
+
+ * src/utils.c (mkdirhier): Use STRDUP_ALLOCA.
+
+ * src/host.c (_host_t): Moved from host.h.
+ (struct host): Renamed from _host_t.
+ (store_hostaddress): Use STRDUP_ALLOCA for INET_S.
+ (realhost): Ditto.
+
+ * src/host.h: Don't include url.h.
+
+ * src/ftp.c (LIST_FILENAME): Moved from ftp.h.
+
+ * src/init.c (DEFAULT_FTP_ACCT): Moved from ftp.h.
+
+ * src/main.c (main): Enable log if the output goes to a TTY.
+
+ * src/connect.h: Removed unused constant `BACKLOG'.
+
+ * src/config.h.in: Check for isatty().
+
+ * src/Makefile.in (LINK): Use CFLAGS when linking.
+
+1998-01-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Expanded.
+
+1998-01-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/mswindows.c (ws_hangup): Use redirect_output().
+
+ * src/main.c (redirect_output_signal): New function; use
+ redirect_output().
+
+ * src/log.c (redirect_output): New function, based on hangup(), which
+ is deleted.
+
+ * src/log.c (vlogmsg): New function.
+
+ * src/wget.h (DEBUGP): Use debug_logmsg().
+
+ * src/main.c (hangup): Use it.
+
+ * src/log.c (log_dump): New function.
+
+ * src/utils.h (DO_REALLOC): Use `long' for various sizes.
+
+ * src/http.c (hskip_lws): Use `while', for clarity.
+ (HTTP_DYNAMIC_LINE_BUFFER): New constant.
+ (fetch_next_header): Use it instead of DYNAMIC_LINE_BUFFER.
+
+ * src/ftp-basic.c (FTP_DYNAMIC_LINE_BUFFER): New constant.
+ (ftp_response): Use it instead of DYNAMIC_LINE_BUFFER.
+
+ * src/utils.c (DYNAMIC_LINE_BUFFER): Moved from utils.c.
+ (LEGIBLE_SEPARATOR): Ditto.
+ (FILE_BUFFER_SIZE): Ditto.
+
+ * src/retr.c (BUFFER_SIZE): Moved from retr.h.
+
+ * src/log.c: New file.
+ (logmsg): Moved from utils.c.
+ (debug_logmsg): New function.
+
+ * src/mswindows.h: Include it here.
+
+ * src/init.c: Ditto.
+
+ * src/utils.c: Don't include <windows.h>.
+
+1998-01-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (ftp_getaddress): Ditto.
+
+ * src/main.c (main): Use it.
+
+ * src/utils.h (STRDUP_ALLOCA): New macro.
+
+ * src/init.c: Prepend `wget: ' to error messages printed on stderr.
+
+ * src/utils.c (mkdirhier): Renamed from mymkdir.
+ (touch): Renamed from my_touch.
+ (pwd_cuserid): Renamed from my_cuserid().
+
+1998-01-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document `--cache'.
+ (Contributors): Added Brian.
+
+1998-01-24 Karl Heuer <kwzh@gnu.org>
+
+ * src/netrc.c (search_netrc): Initialize `l' only after processing
+ netrc.
+
+ * src/main.c (main): Don't trap SIGHUP if it's being ignored.
+
+1998-01-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (parse_robots): Respect opt.useragent; use alloca().
+
+ * src/http.c (gethttp): Construct useragent accordingly.
+
+ * src/version.c: Changed version string to numbers-only.
+
+ * src/main.c (print_help): List all the options.
+
+ * src/mswindows.c (windows_main_junk): Initialize argv0 here.
+
+1998-01-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/all: Use logmsg().
+
+ * src/utils.c (time_str): Moved from retr.c.
+ (logmsg): New function.
+ (logmsg_noflush): Ditto.
+
+ * src/rbuf.c: New file, moved buf_* functions here.
+
+ * src/ftp.c (ftp_expected_bytes): Moved from ftp-basic.c.
+
+ * src/ftp-basic.c (ftp_rest): Use prnum().
+
+ * src/ftp-basic.c: Ditto.
+
+ * src/ftp.c: Use the new reading functions and macros.
+
+ * src/retr.c (buf_initialize): New function.
+ (buf_initialized_p): Ditto.
+ (buf_uninitialize): Ditto.
+ (buf_fd): Ditto.
+
+ * src/http.c (fetch_next_header): Use the BUF_READCHAR macro for
+ efficiency.
+ (gethttp): Use alloca() where appropriate.
+
+ * src/retr.c (buf_readchar): Use it.
+ (buf_peek): Use rstreams.
+
+ * src/retr.h (BUF_READCHAR): New macro.
+
+ * src/init.c (home_dir): Rewritten for clarity.
+ (init_path): Ditto.
+
+ * src/mswindows.c (ws_backgnd): Made static.
+ (read_registry): Ditto.
+ (ws_cleanup): Ditto.
+ (ws_handler): Ditto.
+
+1998-01-24 Andy Eskilsson <andy.eskilsson@telelogic.se>
+
+ * src/utils.c (accdir): Process wildcards.
+ (proclist): New function.
+ (accdir): Use it to avoid code repetition.
+
+1998-01-23 Karl Heuer <kwzh@gnu.org>
+
+ * doc/wget.texi (Advanced Options): Updated.
+
+1998-01-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/alloca.c: New file.
+
+ * src/Makefile.in (ALLOCA): Define.
+
+ * src/mswindows.c (ws_help): Constify.
+ (ws_help): Use alloca.
+
+ * src/mswindows.c: Reformat.
+
+ * src/all: Added _(...) annotations for I18N snarfing and translation.
+
+ * src/host.c (ftp_getaddress): Nuke SYSINFO.
+ (ftp_getaddress): Don't use getdomainname().
+ (ftp_getaddress): Use uname(), where available.
+
+ * src/http.c (gethttp): Protect a stray fprintf().
+
+ * src/init.c (settime): New function.
+ (setval): Treat WAIT specially, allowing suffixes like `m' for
+ minutes, etc.
+
+1998-01-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in: Use `test ...' rather than `[ ... ]'.
+
+ * doc/wget.texi (Advanced Options): Explained suffices.
+
+1998-01-21 Jordan Mendelson <jordy@wserv.com>
+
+ * src/url.c (rotate_backups): New function.
+
+ * src/http.c (gethttp): Ditto.
+
+ * src/ftp.c (getftp): Rotate backups.
+
+1998-01-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Use alloca() for TEMP.
+
+1997-12-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/all: Renamed nmalloc(), nrealloc() and nstrdup() to xmalloc(),
+ xrealloc() and xstrdup(). Use the new functions.
+
+ * src/url.c (decode_string): Made static.
+ (has_proto): Ditto.
+ (parse_dir): Ditto.
+ (parse_uname): Ditto.
+ (mkstruct): Ditto.
+ (construct): Ditto.
+ (construct_relative): Ditto.
+
+ * src/retr.c (show_progress): Made static.
+
+ * src/recur.c (robots_url): Made static.
+ (retrieve_robots): Ditto.
+ (parse_robots): Ditto.
+ (robots_match): Ditto.
+
+ * src/main.h: Removed.
+
+ * src/main.c (printhelp): Made static.
+ (hangup): Ditto.
+
+ * src/init.c (comind): Made static.
+ (defaults): Ditto.
+ (init_path): Ditto.
+ (run_wgetrc): Ditto.
+ (onoff): Ditto.
+ (setonoff): Ditto.
+ (setnum): Ditto.
+ (myatoi): Ditto.
+ (getperms): Ditto.
+ (setbytes): Ditto.
+
+ * src/http.c (fetch_next_header): Made static.
+ (hparsestatline): Ditto.
+ (hskip_lws): Ditto.
+ (hgetlen): Ditto.
+ (hgetrange): Ditto.
+ (hgettype): Ditto.
+ (hgetlocation): Ditto.
+ (hgetmodified): Ditto.
+ (haccepts_none): Ditto.
+ (gethttp): Ditto.
+ (base64_encode_line): Ditto.
+ (mktime_from_utc): Ditto.
+ (http_atotm): Ditto.
+
+ * src/html.c (idmatch): Made static.
+
+ * src/host.c (search_host): Made static.
+ (search_address): Ditto.
+ (free_hlist): Ditto.
+
+ * src/ftp.c (getftp): Made static.
+ (ftp_loop_internal): Ditto.
+ (ftp_get_listing): Ditto.
+ (ftp_retrieve_list): Ditto.
+ (ftp_retrieve_dirs): Ditto.
+ (ftp_retrieve_glob): Ditto.
+ (freefileinfo): Ditto.
+ (delelement): Ditto.
+
+ * src/ftp-ls.c (symperms): Made static.
+ (ftp_parse_unix_ls): Ditto.
+
+ * src/connect.c (select_fd): Made static.
+
+ * src/utils.c (xmalloc): Renamed from nmalloc.
+ (xrealloc): Renamed from nrealloc.
+ (xstrdup): Renamed from nstrdup.
+
+ * src/getopt.c (exchange): Use alloca.
+
+ * src/mswindows.c (mycuserid): Use strncpy.
+
+ * src/New files mswindows.c, mswindows.h, sysdep.h. winjunk.c,
+ systhings.h, windecl.h and winjunk.h removed.
+
+ * src/mswindows.c (sleep): New function.
+
+ * src/utils.c: Include <windows.h> under Windows.
+
+1997-12-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Mailing List): Update.
+
+1997-07-26 Francois Pinard <pinard@iro.umontreal.ca>
+
+ * doc/Makefile.in (install.wgetrc): Print the sample.wgetrc warning
+ only if the files actually differ.
+
+1997-06-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/cmpt.c (strptime_internal): Handle years more correctly for
+ `%y'.
+
+1997-06-12 Darko Budor <dbudor@zesoi.fer.hr>
+
+ * src/url.h (URL_UNSAFE): Change default under Windows.
+
+ * src/retr.c (retrieve_from_file): Respect opt.delete_after.
+
+ * src/main.c (main): Call ws_help on Windows.
+
+ * src/winjunk.c (windows_main_junk): New function.
+
+ * src/main.c (main): Junk-process argv[0].
+
+ * src/http.c (mktime_from_utc): Return -1 if mktime failed.
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (ftp_loop_internal): Change title on Windows when using a
+ new URL.
+
+ * src/winjunk.c (getdomainname): Lots of functions.
+
+1997-06-09 Mike Thomas <mthomas@reality.ctron.com>
+
+ * src/http.c (gethttp): Allocate enough space for
+ `Proxy-Authorization' header.
+
+1997-05-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Wget/1.4.5 is released.
+
+1997-05-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (get_contents): Check return value of fwrite more
+ carefully.
+
+1997-04-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document `--follow-ftp'.
+
+1997-03-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (isfile): Use `lstat' instead of `stat'.
+
+1997-03-30 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+
+ * src/cmpt.c (strptime_internal) [case 'Y']: Always subtract 1900 from
+ year, regardless of century.
+
+1997-03-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (numdigit): Use explicit test.
+
+1997-03-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Always use `url_filename' to get u->local.
+
+1997-03-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c: Recognize https.
+
+1997-03-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (recursive_retrieve): Lowercase just the host name.
+
+1997-03-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_file): Use the correct test.
+ (get_urls_html): Ditto.
+
+1997-03-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/connect.c: Reverted addrlen to int.
+
+ * src/init.c (parse_line): Check for -1 instead of NONE.
+
+ * src/version.c: Changed version to 1.4.5.
+
+1997-02-27 Fila Kolodny <fila@ibi.com>
+
+ * src/ftp.c (ftp_retrieve_list): If retrieving symlink and the proper
+ one already exists, just skip it.
+
+1997-02-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c: New option netrc.
+ (initialize): Don't parse .netrc.
+
+ * src/cmpt.c (recursive): Return rp.
+ (strptime_internal): Match the long strings first, the abbreviated
+ second.
+
+1997-02-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document --proxy-user and
+ --proxy-passwd.
+
+1997-02-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (check_end): New function.
+ (http_atotm): Use it.
+
+1997-02-14 Karl Eichwalder <ke@ke.Central.DE>
+
+ * doc/Makefile.in (install.wgetrc): Never ever nuke an existing rc file.
+
+1997-02-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_retrieve_list): Create links even if not relative.
+
+1997-02-13 gilles Cedoc <gilles@cedocar.fr>
+
+ * src/http.c (gethttp): Use them.
+
+ * src/init.c: New options proxy_user and proxy_passwd.
+
+1997-02-10 Marin Purgar <pmc@asgard.hr>
+
+ * src/connect.c: Make addrlen size_t instead of int.
+ (conaddr): Ditto.
+
+1997-02-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (recursive_retrieve): Lowercase the host name, if the
+ URL is not "optimized".
+
+ * src/host.c (realhost): Return l->hostname, even if it matches with
+ host.
+
+1997-02-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.3.
+
+ * src/url.c: Futher update to list of protostrings.
+ (skip_proto): Skip `//' correctly for FTP and HTTP.
+
+ * src/url.c (get_urls_html): Handle bogus `http:' things a little
+ different.
+
+ * src/main.c (main): Removed `follow-ftp' from `f'.
+ (main): Dumped the `prefix-files' and `file-prefix' options and
+ features; old and bogus.
+ (main): Exit on failed setval() in `-e'.
+
+ * src/http.c (fetch_next_header): Use it to detect header continuation
+ correctly.
+
+ * src/retr.c (buf_peek): New function.
+
+1997-02-09 Gregor Hoffleit <flight@mathi.uni-heidelberg.DE>
+
+ * src/systhings.h: Define S_ISLNK on NeXT too.
+
+1997-02-08 Roger Beeman <beeman@cisco.com>
+
+ * src/ftp.c: Include <time.h>
+
+1997-02-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/wget.h: Include time.h and stuff.
+
+1997-02-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (findurl): Would read over buffer limits.
+
+1997-02-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp-ls.c (ftp_parse_unix_ls): Allow spaces in file names.
+
+1997-02-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_atotm): Initialize tm.is_dst.
+
+1997-02-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Don't print the number of retrieved headers.
+
+ * src/main.c (main): New option `--no-clobber', alias for `-nc'.
+
+ * src/url.c: Recognize `https://'.
+
+1997-02-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Updated and revised.
+
+ * doc/wget.texi (Contributors): Update.
+ (Advanced Options): Removed bogus **/* example.
+
+ * doc/wget.texi: Use ``...'' instead of "...".
+
+1997-02-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (herrmsg): Don't use h_errno.
+
+1997-02-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Domain Acceptance): Document --exclude-domains.
+
+1997-01-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (accept_domain): Use it.
+
+ * src/main.c (main): New option `--exclude-domains'.
+
+ * src/retr.c (retrieve_url): Use it.
+ (retrieve_url): Bail out when an URL is redirecting to itself.
+
+ * src/url.c (url_equal): New function.
+
+1997-01-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/connect.c: Include arpa/inet.h instead of arpa/nameser.h.
+
+ * src/http.c (mk_utc_time): New function.
+ (http_atotm): Use it; handle time zones correctly.
+
+1997-01-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c: Ditto.
+
+ * src/ftp-basic.c: Use it instead of WRITE.
+
+ * src/connect.c (iwrite): New function.
+
+1997-01-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/cmpt.c (mktime): New function.
+
+ * src/netrc.c: Include <sys/types.h>.
+
+ * src/main.c (main): Wouldn't recognize --spider.
+
+ * src/retr.c (rate): Use `B', `KB' and `MB'.
+ (reset_timer,elapsed_time): Moved from utils.c.
+
+ * src/ftp.c (ftp_retrieve_list): Ditto.
+
+ * src/http.c (http_loop): Don't touch the file if opt.dfp.
+
+1997-01-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/cmpt.c: New file.
+
+ * src/ftp.c (ftp_retrieve_glob): New argument semantics.
+ (ftp_retrieve_dirs): Use it.
+ (ftp_loop): Ditto.
+
+ * src/html.c (htmlfindurl): Recognize `'' as the quote char.
+
+1997-01-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop_internal): Use it.
+
+ * src/utils.c (remove_link): New function.
+
+1997-01-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (retrieve_url): Require STRICT redirection URL.
+
+ * src/url.c (parseurl): New argument STRICT.
+
+ * src/http.c (hparsestatline): Be a little-bit less strict about
+ status line format.
+
+1997-01-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Use it.
+
+ * src/main.c (main): Don't use '<digit>' as options.
+
+ * src/init.c: New option ignore_length.
+
+ * src/http.c (gethttp): Ditto.
+ (http_loop): Check for redirection without Location:.
+ (gethttp): Don't print Length unless RETROKF.
+
+ * src/ftp.c (getftp): Use it.
+
+ * src/url.c (mkalldirs): New function.
+
+ * src/utils.c (mymkdir): Don't check for existing non-directory.
+
+ * src/url.c (mkstruct): Don't create the directory.
+
+1997-01-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document --ignore-length.
+
+1997-01-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (setval): Removed NO_RECURSION checks.
+
+1997-01-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Time-Stamping): New node.
+
+1997-01-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4.3-pre2.
+
+ * src/recur.c (recursive_retrieve): Bypass host checking only if URL
+ is ftp AND parent URL is not ftp.
+
+ * src/ftp-basic.c (ftp_request): Print out Turtle Power.
+
+ * src/ftp.c (ftp_loop): Call ftp_retrieve_glob with 0 if there's no
+ wildcard.
+ (ftp_retrieve_glob): Call ftp_loop_internal even on empty list, if
+ not glob.
+
+ * src/http.c (gethttp): Be a little bit smarter about status codes.
+
+ * src/recur.c (recursive_retrieve): Always reset opt.recursive when
+ dealing with FTP.
+
+1997-01-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (retrieve_url): New variable location_changed; use it for
+ tests instead of mynewloc.
+ (retrieve_url): Allow heuristic adding of html.
+
+ * src/url.c (url_filename): Don't use the `%' in Windows file names.
+
+ * src/http.c (http_loop): Always time-stamp the local file.
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (ftp_retrieve_list): Use it.
+
+ * src/utils.c (my_touch): New function.
+
+ * src/ftp.c (ftp_retrieve_list): Use #ifdef HAVE_STRUCT_UTIMBUF
+ instead of #ifndef NeXT.
+
+ * src/utils.c (strptime): New version, by Ulrich Drepper.
+
+1997-01-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (haccepts_none): Renamed from `haccepts_bytes'.
+ (gethttp): If haccepts_none(), disable ACCEPTRANGES.
+ (http_loop): Would remove ACCEPTRANGES.
+
+ * src/ftp.c (getftp): Call ftp_list with NULL.
+
+1997-01-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/html.c (ftp_index): Don't print minutes and seconds if we don't
+ know them; beautify the output.
+
+ * src/ftp.c (getftp): Don't close the socket on FTPNSFOD.
+
+1997-01-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (strptime): New function.
+ (strptime): Don't use get_alt_number.
+ (strptime): Don't use locale.
+ (match_string): Made it a function.
+
+1997-01-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_atotm): New function.
+ (http_loop): Use it.
+
+ * src/atotm.c: Removed from the distribution.
+
+ * src/http.c (base64_encode_line): Rewrite.
+
+1997-01-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/Makefile.in (distclean): Don't remove wget.info*.
+
+1997-01-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Use ftp_expected_bytes; print size.
+
+ * src/ftp-basic.c (ftp_response): Use ftp_last_respline.
+ (ftp_expected_bytes): New function.
+
+ * src/ftp.c (getftp): Print the unauthoritative file length.
+
+ * src/ftp-ls.c: Renamed from ftp-unix.c.
+ (ftp_parse_ls): Moved from ftp.c.
+ (ftp_parse_unix_ls): Recognize seconds in time spec.
+ (ftp_parse_unix_ls): Recognize year-less dates of the previous
+ year.
+
+1997-01-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp-basic.c: Don't declare errno if #defined.
+
+ * src/host.c (ftp_getaddress): Check for sysinfo legally.
+
+1997-01-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Mailing List): Update archive.
+ (Portability): Update the Windows port by Budor.
+
+1997-01-08 Darko Budor <dbudor@diana.zems.fer.hr>
+
+ * src/connect.c (iread): Use READ.
+
+1996-12-26 Darko Budor <dbudor@zems.fer.hr>
+
+ * src/wget.h: READ and WRITE macros for use instead of read and write
+ on sockets, grep READ *.c, grep WRITE *.c
+
+ * src/wsstartup.c: new file - startup for winsock
+
+ * src/wsstartup.h: new file
+
+ * src/win32decl.h: new file - fixup for <errno.h> and winsock trouble
+
+ * src/configure.bat: Configure utility for MSVC
+
+ * src/src/Makefile.ms,config.h.ms: new files for use with MSVC 4.x
+
+1996-12-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c: Recognize finger, rlogin, tn3270, mid and cid as valid
+ schemes.
+
+1996-12-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.3-pre.
+
+ * src/utils.c (prnum): Accept long.
+ (legible): Use prnum().
+
+ * src/connect.c (make_connection): Accept port as short.
+ (bindport): Ditto.
+
+ * src/http.c (gethttp): Use search_netrc.
+
+1996-12-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (ftp_getaddress): Allow `.' in hostname.
+
+1996-12-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Use search_netrc.
+
+ * src/netrc.c (free_netrc): New function.
+
+ * src/init.c (home_dir): New function.
+
+ * src/url.c (convert_links): Allow REL2ABS changes.
+
+1996-12-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Security Considerations): New node.
+
+1996-12-21 Gordon Matzigkeit <gord@gnu.ai.mit.edu>
+
+ * src/netrc.c: New file.
+ (parse_netrc, maybe_add_to_list): New functions.
+
+1996-12-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document --passive.
+
+1996-12-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (retrieve_url): Reset opt.recursion before calling
+ ftp_loop if it is reached through newloc.
+
+ * src/init.c (run_wgetrc): Print the wgetrc path too, when reporting
+ error; don't use "Syntax error", since we don't know if it is
+ really a syntax error.
+
+1996-12-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (acceptable): Extract the filename part of the path.
+
+ * src/recur.c (recursive_retrieve): Call acceptable() with the right
+ argument; would bug out on wildcards.
+
+ * src/init.c (parse_line): Likewise.
+
+ * src/html.c (htmlfindurl): Cast to char * when calling stuff.
+
+1996-12-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (parseurl): Debug output.
+
+ * src/utils.c (path_simplify): New one, adapted from bash's
+ canonicalize_pathname().
+
+1996-12-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Use ftp_pasv.
+
+ * src/ftp-basic.c (ftp_request): Accept NULL value.
+ (ftp_pasv): New function.
+
+ * src/options.h (struct options): Add passive FTP option.
+
+1996-12-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Don't discard the buffer.
+
+ * src/retr.c (get_contents): New parameter nobuf.
+
+1996-12-13 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/url.c (get_urls_html): Skip "http:".
+
+1996-12-13 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/html.c (htmlfindurl): Recognize <meta contents="d; URL=...".
+
+ * src/init.c (setval): Strip the trailing slashes on CVECDIR.
+
+1996-12-13 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * src/(configure.in, config.h.in, src/Makefile.in, src/*.[ch]): Add
+ ansi2knr support for compilers which don't support ANSI style
+ function prototypes and signatures.
+
+ * src/(aclocal.m4, src/ansi2knr.c, src/ansi2knr.1): New files.
+
+1996-12-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (strcasecmp): From glibc.
+ (strncasecmp): Also.
+ (strstr): Also.
+
+ * src/url.c: Added javascript: to the list of URLs prefixes.
+
+1996-12-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c: Make excludes and includes under CVECDIR instead of
+ CVEC.
+
+1996-12-12 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/recur.c (retrieve_robots): Print the warning message only if
+ verbose.
+
+1996-12-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/systhings.h: New file.
+
+ * src/../configure.in: Check for utime.h
+
+ * src/ftp.c: Check whether we have unistd.h.
+
+1996-12-12 Gregor Hoffleit <flight@mathi.uni-heidelberg.DE>
+
+ * src/ftp.c (ftp_retrieve_list): Use NeXT old utime interface.
+
+1996-12-12 Dieter Baron <dillo@danbala.tuwien.ac.at>
+
+ * doc/wget.texi (Advanced Usage): Would reference prep instead of
+ wuarchive.
+
+1996-11-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (recursive_retrieve): Send the canonical URL as referer.
+ (recursive_retrieve): Call get_urls_html with the canonical URL.
+
+1996-11-26 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c: Use it; Recognize paths ending with "." and ".." as
+ directories.
+ (url_filename): Append .n whenever file exists and could be a
+ directory.
+
+ * src/url.h (ISDDOT): New macro.
+
+ * src/init.c (parse_line): Use unsigned char.
+
+ * src/url.c (get_urls_html): Cast to unsigned char * when calling
+ htmlfindurl.
+
+ * src/html.c (htmlfindurl): Use unsigned char.
+
+ * src/version.c: Changed version to 1.4.3.
+
+1996-11-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.2.
+
+ * src/ftp.c (getftp): Simplified assertion.
+ (ftp_loop_internal): Remove symlink before downloading.
+ (ftp_retrieve_list): Unlink the symlink name before attempting to
+ create a symlink!
+
+ * src/options.h (struct options): Renamed print_server_response to
+ server_response.
+
+ * src/ftp.c (rel_constr): Removed.
+ (ftp_retrieve_list): Don't use it.
+ (ftp_retrieve_list): Use opt.retr_symlinks.
+
+1996-11-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Documented --retr-symlinks.
+
+1996-11-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): New option retr_symlinks.
+
+ * src/url.c (convert_links): Print verbose message.
+
+1996-11-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Reset newloc in the beginning of function;
+ would cause FMR in retrieve_url.
+
+1996-11-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (convert_all_links): Find the URL of each HTML document,
+ and feed it to get_urls_html; would bug out.
+ (convert_all_links): Check for l2 instead of dl; removed dl.
+
+ * src/url.c (convert_links): Don't refer to freed newname.
+
+ * src/recur.c (recursive_retrieve): Add this_url to urls_downloaded.
+
+ * src/main.c (main): Print the OS_TYPE in the debug output, too.
+
+ * src/recur.c (recursive_retrieve): Check for opt.delete_after.
+
+ * src/main.c (main): New option delete-after.
+
+ * src/init.c (setval): Cleaned up.
+
+1996-11-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document --delete-after.
+
+1996-11-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Portability): Add IRIX and FreeBSD as the "regular"
+ platforms.
+
+1996-11-21 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/html.c (htmlfindurl): Reset s->in_quote after getting out of
+ quotes.
+
+1996-11-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/Makefile.in (wget): Make `wget' the default target.
+
+ * src/ftp.c (ftp_loop_internal): Move noclobber checking out of the
+ loop.
+ (ftp_retrieve_list): Warn about non-matching sizes.
+
+ * src/http.c (http_loop): Made -nc non-dependent on opt.recursive.
+
+ * src/init.c (setnum): Renamed from setnuminf; New argument flags.
+ (setval): Use it.
+
+ * src/main.c (main): Sorted the options.
+ (main): New option --wait.
+
+1996-11-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.1.
+
+ * src/html.c (html_quote_string): New function.
+ (ftp_index): Use it.
+ (htmlfindurl): A more gentle ending debug message.
+
+ * src/ftp.c (ftp_loop): Check for opt.htmlify.
+
+ * src/init.c: New command htmlify.
+
+ * src/ftp.c (getftp): Nicer error messages, with `'-encapsulated
+ strings.
+ (ftp_loop): Print size of index.html.
+
+ * src/init.c (setval): Implement "styles".
+
+ * src/main.c (main): New option dotstyle.
+
+1996-11-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Changed version to 1.4.2.
+
+1996-11-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Usage): Document dot-style.
+
+1996-11-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Close the master socket in case of errors, after
+ bindport().
+
+ * src/connect.c (bindport): Initialize msock to -1.
+
+ * src/ftp.c (getftp): Initialize dtsock to -1.
+
+ * src/connect.c (closeport): Don't close sock if sock == -1.
+
+1996-11-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (setnuminf): Nuked default value -- just leave unchanged.
+ (setval): Don't send default values.
+ (defaults): Use DEFAULT_TIMEOUT -- aaargh.
+
+ * src/options.h (struct options): Use long for dot_bytes.
+
+ * src/init.c (setquota): Renamed to setbytes.
+ (setval): Use setbytes on DOTBYTES.
+
+1996-11-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Usage): Dot customization example.
+ (Sample Wgetrc): Likewise.
+
+1996-11-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Initialize con->dltime.
+
+ * src/recur.c (recursive_retrieve): Use same_host instead of
+ try_robots; simply load robots_txt whenever the host is changed.
+ (recursive_retrieve): Free forbidden before calling parse_robots.
+
+1996-11-16 Mark Boyns <boyns@sdsu.edu>
+
+ * src/recur.c (recursive_retrieve): Retrieve directories regardless of
+ acc/rej rules; check for empty u->file.
+
+1996-11-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (show_progress): Use them.
+
+ * src/options.h (struct options): New options dot_bytes, dots_on_line
+ and dot_spacing.
+
+1996-11-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Wgetrc Syntax): Explained emptying lists.
+
+1996-11-14 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/recur.c (recursive_retrieve): Use base_url instead of this_url
+ for no_parent.
+
+1996-11-14 Shawn McHorse <riffraff@txdirect.net>
+
+ * src/html.c (htmlfindurl): Reset s->in_quote after exiting the quote.
+
+1996-11-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (setval): Use it.
+
+ * src/utils.c (merge_vecs): New function.
+
+ * src/init.c (setval): Reset the list-type functions when encountering
+ "".
+
+1996-11-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c (sepstring): Rewrote; don't use strtok.
+
+ * src/recur.c (recursive_retrieve): Enter assorted this_url to slist
+ when running the first time.
+ (retrieve_robots): Warn to ignore errors when robots are loaded.
+
+ * src/utils.c (load_file): Moved from url.c.
+
+ * src/http.c: Made static variables const too in h* functions.
+
+ * src/main.c (main): Renamed --continue-ftp to --continue.
+
+ * src/recur.c (recursive_retrieve): Use it.
+
+ * src/utils.c (frontcmp): New function.
+
+ * src/url.c (accdir): New function.
+
+ * src/html.c (htmlfindurl): Recognize <area href=...>.
+
+ * src/ftp.c (ftp_retrieve_dirs): Implemented opt.includes.
+
+ * src/init.c (setval): Free the existing opt.excludes and
+ opt.includes, if available.
+
+ * src/main.c (main): New option -I.
+
+1996-11-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document includes/excludes.
+ (Wgetrc Commands): Likewise.
+
+1996-11-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_retrieve_glob): Do not weed out directories.
+
+ * src/version.c: Changed version to 1.4.1.
+
+1996-11-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.0.
+
+1996-11-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/main.c (main): Free com and val after parse_line.
+ (printhelp): Reorder the listing.
+
+ * src/http.c: More robust header parsing.
+
+ * src/http.c: Allow any number of spaces, or no spaces, precede ':'.
+ (hskip_lws): New function.
+ (haccepts_bytes): New function.
+ (gethttp): Use it.
+
+ * src/init.c (setval): Check header sanity.
+ (setval): Allow resetting of headers.
+
+1996-11-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Don't use has_wildcards.
+
+ * src/http.c (gethttp): Free all_headers -- would leak.
+
+ * src/recur.c (recursive_retrieve): Initialize depth to 1 instead of
+ 0 -- this fixes a long-standing bug in -rl.
+
+1996-11-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Options): Document headers.
+
+1996-11-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c: Use -1 as "impossible" value for con->fd.
+
+ * src/url.h (URL_SEPARATOR): Don't treat `*' and `+' as separators.
+
+ * src/init.c (parse_line): Use isalpha.
+
+ * src/ftp-unix.c: Use HAVE_UNISTD_H.
+
+ * src/mtch.c (has_wildcards): Don't match \.
+
+ * src/http.c (http_loop): Warn on HTTP wildcard usage.
+
+1996-11-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (url_filename): Do not create numbered suffixes if
+ opt.noclobber -- would bug out on -nc.
+
+1996-11-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (parse_robots): Don't chuck out the commands without
+ arguments (`Disallow:<empty>' didn't work).
+ (parse_robots): Compare versions lowercase.
+ (parse_robots): Match on base_version, not version_string!
+ (parse_robots): Handle comments properly.
+ (parse_robots): Match versions in a sane way.
+
+ * src/init.c: Print nicer error messages.
+
+ * src/version.c: Changed version to 1.4.0.
+
+1996-11-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/sample.wgetrc: Added header examples.
+
+1996-11-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.0-test2.
+
+ * src/init.c (run_wgetrc): Close fp.
+
+ * src/ftp.c (ftp_retrieve_dirs): Allocate the correct length for
+ u->dir.
+
+1996-11-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c (setquota): Allow inf as quota specification.
+
+1996-11-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Docfixes.
+
+1996-11-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/sample.wgetrc: Rewritten.
+
+ * doc/Makefile.in (install.wgetrc): Install sample.wgetrc.
+ (uninstall.info): Use $(RM).
+
+1996-11-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_retrieve_dirs): Return QUOTEXC if quota exceeded.
+ (ftp_retrieve_glob): Return QUOTEXC on quota exceeded.
+
+ * src/main.c (main): Check for quota by comparison with downloaded
+ stuff, not from status.
+
+ * src/connect.c (select_fd): Should compile on HPUX without warnings now.
+
+ * src/ftp.c (ftp_get_listing): Check whether ftp_loop_internal
+ returned RETROK.
+
+1996-11-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_retrieve_glob): Print the pattern nicely.
+ (getftp): Return FTPRETRINT on control connection error.
+
+ * src/html.c (htmlfindurl): Recognize <embed src=...> and
+ <bgsound src=...>.
+ (ftp_index): Handle username and password correctly.
+
+ * src/main.c (main): Made `-np' a synonim for --no-parent.
+
+1996-11-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Proofread; *many* docfixes.
+
+1996-11-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4.0-test1.
+
+ * src/url.c (str_url): Don't use sprintf when creating %2F-prefixed
+ directory.
+ (convert_links): Removed definition of make_backup.
+
+ * src/http.h: Removed definition of MAX_ERROR_LENGTH.
+
+ * src/host.c (ftp_getaddress): Check for "(none)" domains.
+
+ * src/ftp.c (ftp_retrieve_dirs): Docfix.
+
+ * src/http.c (gethttp): Use ou->referer instead of u->referer.
+
+ * src/retr.c (retrieve_url): Reset u to avoid freeing pointers twice;
+ this was known to cause coredumps on Linux.
+
+ * src/html.c (ftp_index): Cast the argument to local_time to time_t *.
+
+1996-11-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop): Check for opt.ftp_glob too before calling
+ ftp_retrieve_glob.
+
+ * src/version.c: Changed version to 1.4.0-test2.
+
+1996-11-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Introduction): Updated robots mailing list address.
+
+1996-11-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/connect.c (select_fd): Use exceptfds -- once and for all.
+
+ * src/retr.c (retrieve_from_file): Free filename after
+ recursive_retrieve.
+ (retrieve_from_file): Send RFIRST_TIME to recursive_retrieve on
+ first-time retrieval.
+ (retrieve_from_file): Return uerr_t; new argument, count.
+ (retrieve_from_file): Break on QUOTEXC.
+
+ * src/init.c (setquota): Fixed a bug that caused rejection of
+ non-postfixed values..
+
+1996-11-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi: Minor docfixes.
+
+1996-10-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Changed name to wget.
+
+ * src/connect.c (iread): Smarter use of select.
+ (select_fd): Set errno on timeout. If not timeout, return 1
+ instead of 0.
+
+1996-10-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop_internal): Don't use con->cmd before
+ establishing it.
+
+1996-10-26 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Send correct referer when using proxy.
+ (gethttp): Use struct urlinfo ou to access the relevant data; send
+ correct authorization in all cases.
+
+ * src/host.c (same_host): Use skip_uname to skip username and
+ password.
+
+ * src/url.c (skip_uname): New function.
+ (parseurl): Use it.
+
+ * src/host.c (same_host): Do not assume HTTP -- same_host should now
+ be totally foolproof.
+
+ * src/url.c (skip_proto): New function.
+ (parse_uname): Use it.
+
+ * src/http.c (gethttp): Create local user and passwd from what is
+ given.
+
+ * src/url.c (parseurl): Check for HTTP username and password too.
+
+1996-10-26 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/wget.texi (Advanced Usage): Document passwords better.
+
+ * doc/Makefile.in (distclean): Remove wget.1 on make distclean.
+
+ * doc/wget.texi (Option Syntax): Explain --.
+
+1996-10-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/config.h.in: Removed #define gethostbyname R...
+
+1996-10-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Changed version to 1.4.0-test1.
+
+1996-10-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b29.
+
+ * src/recur.c (recursive_retrieve): Check for no_parent.
+
+ * src/init.c (setval): Option update.
+
+ * src/main.c (main): New option no-parent.
+
+ * src/options.h (struct options): New variable no_parent.
+
+ * src/recur.c (recursive_retrieve): Only files are checked for
+ opt.accepts and opt.rejects.
+ (recursive_retrieve): Check directories for opt.excludes.
+ (recursive_retrieve): Make the dir absolute when checking
+ opt.excludes.
+
+ * src/html.c (htmlfindurl): Recognize <applet code=...> and <script
+ src=...>
+
+1996-10-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/fetch.texi (No Parent): update.
+
+1996-10-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b28.
+
+ * src/ftp.c (ftp_loop_internal): Check whether f->size == len and
+ don't continue the loop if it is.
+ (ftp_get_listing): Remove list_filename on unsuccesful loop.
+
+1996-10-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (getftp): Do not line-break assert entries at all.
+ (ftp_retrieve_dirs): docfix.
+
+ * src/connect.c (select_fd): Use fd + 1 as nfds.
+
+ * src/version.c: Changed version to 1.4b29.
+
+1996-10-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/fetch.texi (Advanced Options): Docfix.
+
+1996-10-17 Tage Stabell-Kulo <tage@acm.org>
+
+ * doc/geturl.texi (Advanced Options): Sort alphabetically.
+
+1996-10-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (parse_robots): Fixed an off-by-one bug when looking for
+ ':'.
+
+ * src/html.c (htmlfindurl): Fixed several possible off-by-one bugs by
+ moving `bufsize &&' to the beginning of each check in for-loops.
+
+ * src/recur.c (parse_robots): Close fp on exit.
+
+ * src/url.c (mymkdir): Check for each directory before creating.
+
+1996-10-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop_internal): Use strcpy to initialize tmp.
+ (getftp): Do not use multiline assert.
+
+ * src/http.c (hparsestatline): Use mjr and mnr instead of major and
+ minor, which don't compile on Ultrix.
+ (http_loop): Use strcpy() to initialize tmp.
+
+ * src/all: Geturl -> Fetch
+
+1996-10-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Changed version to 1.4b28.
+
+1996-10-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b27.
+
+ * src/init.c (parse_line): Use isspace.
+ (parse_line): Free *com on all errors.
+
+ * src/ftp.c (ftp_loop): Change FTPOK to RETROK before exiting.
+ (delelement): Use next instead of f->next and prev instead of
+ f->prev.
+ (delelement): Free the members of the deleted element.
+
+ * src/http.c (http_loop): Do not return RETROK on code != 20x.
+
+ * src/init.c (cleanup): Free opt.user_header.
+ (cleanup): Free opt.domains.
+
+ * src/url.c (freelists): Moved to cleanup().
+
+ * src/http.c (hparsestatline): Docfix.
+
+ * src/main.c (main): Return with error status on unsuccesful
+ retrieval.
+
+ * src/init.c (setval): Do not remove listing when mirroring.
+
+ * src/url.c (url_filename): Use opt.fileprefix.
+
+ * src/ftp.c (ftp_get_listing): Use url_filename to get filename for
+ .listing.
+
+ * src/main.c (main): New option: -rn.
+
+1996-10-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/geturl.texi (Advanced Options): Describe -nr.
+ (Advanced Usage): Moved -O pipelines to Guru Usage.
+ (Simple Usage): Update.
+ (Advanced Options): Docfix.
+
+ * doc/Makefile.in (RM): RM = rm -f.
+
+1996-10-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/Makefile.in (RM): Added RM = rm -f.
+
+ * src/host.c (clean_hosts): New function.
+ (free_hlist): Just free the list, no reset.
+
+ * src/version.c: Changed version to 1.4b27.
+
+1996-10-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/geturl.texi (Guru Usage): Add proxy-filling example.
+
+1996-10-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b26.
+
+ * src/retr.c (retrieve_from_file): If call get_urls_html with
+ opt.spider to make it silent in spider mode.
+
+ * src/url.c (str_url): Use CLEANDUP instead of URL_CLEANSE.
+
+ * src/url.h (CLEANDUP): New macro.
+
+ * src/http.c (gethttp): Fixed a bug that freed location only when it
+ was NULL.
+
+ * src/retr.c (retrieve_url): Free url if it will not be stored,
+ i.e. newloc is NULL.
+
+ * src/html.c (htmlfindurl): Handle exiting from quotes correctly; the
+ old version would bug out on <a href="x#a"href="y">.
+
+ * src/html.h (state_t): New member in_quote.
+
+ * src/html.c (htmlfindurl): Free s->attr at the beginning of
+ attr-loop.
+
+ * src/recur.c (recursive_retrieve): Recognize RCLEANUP.
+ (tried_robots): Make hosts a global variable.
+ (recursive_retrieve): Free constr after URL host optimization.
+ (tried_robots): Free urlinfo before exiting.
+
+ * src/utils.c (free_slist): New function.
+
+ * src/recur.c (recursive_retrieve): Use flags to add cleanup
+ possibility.
+
+ * src/main.c (main): Free filename after recursive_retrieve.
+
+ * src/http.c (gethttp): Store successful responses too.
+
+1996-10-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/all: Constified the whole source. This required some minor
+ changes in many functions in url.c, possibly introducing bugs -- I
+ hope not.
+
+ * src/ftp-basic.c: Removed last_respline.
+
+ * src/http.c (gethttp): Free type.
+
+ * src/host.c (same_host): Free real1 and real2.
+
+ * src/main.c (main): New option --spider.
+
+ * src/retr.c (get_contents): Don't reset errno.
+
+ * src/main.c (main): Sorted the options.
+
+ * src/connect.c (iread): Set errno to ETIMEDOUT only if it was left
+ uninitialized by select().
+
+ * src/http.c (http_loop): Print the time when the connection is
+ closed.
+ (gethttp): Debug-print the HTTP request.
+
+1996-10-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/geturl.texi (Advanced Options): Added --spider.
+
+1996-10-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/connect.c (iread): Do not try reading after timeout.
+
+ * src/main.c (main): Would bug out on -T.
+
+ * src/connect.c (select_fd): Do not use exceptfds.
+ (iread): Set ETIMEDOUT on select_fd <= 0.
+
+ * src/version.c: Changed version to 1.4b26.
+
+1996-10-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b25.
+
+ * src/ftp-unix.c (ftp_parse_unix_ls): Ignore lines without file name
+ or link name.
+
+ * src/http.c (gethttp): Add errcode to struct hstat.
+ (http_loop): Use it.
+
+ * src/url.c (no_proxy_match): Simplify using char** for no_proxy.
+
+ * src/options.h (struct options): Make opt.no_proxy a vector.
+
+ * src/utils.c (sepstring): Use !*s instead of !strlen(s).
+
+ * src/init.c (setval): Set opt.maxreclevel to 0 on --mirror.
+ (getperms): Use ISODIGIT instead of isdigit.
+
+ * src/ftp.c (getftp): Print time.
+
+ * src/main.c (main): Use legible output of downloaded quantity.
+
+ * src/ftp.c (getftp): Use elapsed_time().
+ (ftp_loop_internal): Use rate().
+
+ * src/http.c (http_loop): Add download ratio output; Use rate().
+
+ * src/utils.c (rate): New function.
+
+1996-10-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Use timer.
+
+ * src/ftp.c: Split to ftp-basic.c and ftp.c
+
+ * src/utils.c (reset_timer): New function.
+ (elapsed_time): New function.
+
+ * src/retr.c (show_progress): Make bytes_in_line and offs long; should
+ work on 16-bit machines.
+
+1996-10-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (in_acclist): New argument backward.
+
+ * src/ftp.c (ftp_retrieve_glob): Use acceptable() to determine whether
+ a file should be retrieved according to suffix.
+ (ftp_get_listing): Check the return value of unlink; Do not call
+ ftp_retrieve_dirs if depth reached maxreclevel.
+ (ftp_retrieve_dirs): Check whether the directory is in
+ exclude-list.
+
+ * src/main.c (main): Print the version number at the beginning of
+ DEBUG output.
+ (main): Use strrchr when creating exec_name.
+
+ * src/ftp.c (ftp_retrieve_glob): Do not close control connection.
+
+ * src/version.c: Changed version to 1.4b25.
+
+1996-10-08 Hrvoje Niksic <hniksic@srce.hr>
+
+ * doc/geturl.texi (Advanced Options): Added -X.
+
+ * doc/Makefile.in: Added $(srcdir) where appropriate (I hope).
+
+1996-10-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b24.
+
+ * src/Makefile.in: Rewrite.
+
+ * src/ftp.c (ftp_loop_internal): Likewise.
+
+ * src/retr.c (time_str): Check for failed time().
+
+ * src/html.c (htmlfindurl): Recognize <fig src> and <overlay src> from
+ HTML3.0.
+
+ * src/retr.c (time_str): Return time_t *.
+
+ * src/connect.c (bindport): Close msock on unsuccesful bind.
+ (bindport): The same for getsockname and listen.
+
+ * src/retr.c (retrieve_url): Allow any number of retries on
+ proxy.
+
+ * src/http.c (gethttp): Do not treat errno == 0 as timeout.
+ (http_loop): Likewise.
+ (http_loop): Cosmetic changes.
+
+ * src/connect.c (iread): Set errno to ETIMEDOUT in case of timeout.
+
+ * src/retr.c (get_contents): Reset errno.
+
+ * src/ftp.c (getftp): Minor fixes.
+
+1996-10-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b23.
+
+ * src/ftp.c (ftp_loop_internal): Get the time after getftp.
+
+ * src/Makefile.in (install.info): New target.
+ (install): Use it.
+
+ * src/http.c (http_loop): Fix output when doing -O.
+
+1996-10-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c: Do not use backups.
+
+ * src/geturl.1 (WARNING): Warn that man-page could be obsolete.
+
+ * src/getopt.c (getopt_long): Moved to getopt.c
+
+ * src/geturl.texi: Enhanced.
+
+ * src/main.c (main): Use it.
+
+ * src/recur.c (convert_all_links): New function.
+
+ * src/utils.c (add_slist): New argument flags.
+
+ * src/recur.c (recursive_retrieve): Update a list of downloaded URLs.
+ (parse_robots): Do not chuck out empty value fields.
+ (parse_robots): Make yourself welcome on empty Disallow.
+
+ * src/version.c: Changed version to 1.4b24.
+
+1996-10-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/geturl.texi: New file.
+
+ * src/main.c (main): Do not print the warnings and download summary if
+ opt.quiet is set.
+
+ * src/version.c: Changed version to 1.4b23.
+
+1996-10-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/"Released" 1.4b22.
+
+ * src/atotm.c (atotm): Use True and False instead of TRUE and FALSE,
+ to avoid redefinition warnings.
+
+ * src/host.c (store_hostaddress): Use memcpy() to copy the address
+ returned by inet_addr.
+
+ * src/version.c: Changed version to 1.4b22.
+
+1996-10-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b21.
+
+ * src/ftp-unix.c (ftp_parse_ls): Renamed to ftp_parse_unix_ls.
+
+ * src/ftp.c (ftp_port): Use conaddr.
+ (getftp): Print the file length.
+ (ftp_retrieve_list): Check the stamps of plain files only.
+
+ * src/connect.c (closeport): Do not call shutdown().
+ (conaddr): New function.
+
+ * src/html.c (ftp_index): Made it dfp-aware.
+
+ * src/init.c (cleanup): New name of freemem. Close opt.dfp.
+
+ * src/ftp.c (getftp): Use opt.dfp if it is set.
+
+ * src/ftp-unix.c (ftp_parse_ls): Recognize time in h:mm format.
+
+ * src/ftp.c (ftp_retrieve_dirs): Fixed a bug that caused incorrect
+ CWDs to be sent with recursive FTP retrievals.
+
+1996-10-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/recur.c (parse_robots): Made it more compliant with "official"
+ specifications.
+
+ * src/http.c: New function.
+
+ * src/ftp-unix.c (ftp_parse_ls): Added better debug output.
+
+ * src/ftp.c (getftp): Print out the LIST in case of
+ opt.print_server_response.
+
+ * src/version.c: Changed version to 1.4b21.
+
+1996-10-01 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b20.
+
+ * src/README: Update.
+
+ * src/http.c (gethttp): Preset lengths of various headers instead of
+ calculating them dynamically.
+ (gethttp): Check for 206 partial contents.
+
+1996-09-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/configure.in: Set SYSTEM_GETURLRC to $libdir/geturlrc
+
+ * src/http.c (gethttp): Send the port number in the Host: header.
+
+1996-09-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Send host: header.
+ (gethttp): Add the possibility of user-defined headers.
+ (gethttp): Move decision about pragma: no-cache to http_loop,
+ where it belongs.
+ (gethttp): Pass a struct instead of enormous argument list.
+ (http_loop): Use a new, fancier display format.
+ (ftp_loop): Likewise.
+
+ * src/main.c: (hangup): Turn off buffering of the new log file.
+
+ * src/install-sh: Likewise.
+
+ * src/config.sub: Replace with the one in autoconf-2.10
+
+ * src/geturl.1: Update.
+
+ * src/init.c: New options httpuser and httppasswd.
+
+ * src/http.c: (base64_encode_line): New function.
+ (gethttp): Send authentication.
+
+ * src/connect.c (make_connection): Use store_hostaddress.
+
+1996-09-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (store_hostaddress): New function.
+
+ * src/NEWS: Update.
+
+ * src/http.c (hgetrange): New function.
+ (gethttp): Use ranges.
+
+ * src/utils.c (numdigit): Accept long instead of int.
+
+ * src/http.c (http_loop): Add restart capabilities.
+
+ * src/ftp.c (ftp_retrieve_glob): Fixed a bug that could cause matchres
+ being used uninitialized.
+ (ftp_retrieve_list): Similar fix.
+
+ * src/host.c (add_hlist): Fixed a bug that could cause cmp being used
+ uninitialized.
+
+ * src/url.c (construct_relative): New function.
+
+ * src/recur.c (recursive_retrieve): Use it.
+
+ * src/retr.c (convert_links): New function.
+
+1996-09-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (free_urlpos): New function.
+
+ * src/recur.c (recursive_retrieve): Adapt.
+
+ * src/url.c (get_urls_html): Return a linked list instead of a vector.
+
+ * src/url.c (get_urls_file): Return a linked list instead of a vector.
+
+ * src/geturl.1: Update.
+
+ * src/http.c (gethttp): Implement it.
+
+ * src/init.c (setval): New option: SAVEHEADERS
+
+ * src/ftp.c (ftp_loop_internal): Do not set restval if listing is to
+ be retrieved. Lack of this test caused bugs when the connection
+ was lost during listing.
+
+ * src/retr.c (retrieve_url): Fixed a bug that caused
+ coredumps. *newloc is now reset by default.
+ (retrieve_url): Lift the twenty-tries limit on proxies.
+
+ * src/version.c: Changed version to 1.4b20.
+
+1996-09-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b19.
+
+1996-09-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop_internal): Renamed from ftp_1fl_loop.
+ (getftp): Changed prototype to accept ccon *.
+
+1996-09-17 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_retrieve_list): Fixed a bug that caused setting
+ incorrect values to files pointed to by symbolic links.
+ (ftp_1fl_loop): Do not count listings among the downloaded URL-s.
+
+1996-09-16 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (mkstruct): Do not prepend "./" in front of a pathname.
+
+ * src/main.c (main): New option: --user-agent.
+
+ * src/geturl.1: Ditto.
+
+ * src/init.h: Ditto.
+
+ * src/init.c (setval): Ditto.
+
+ * src/main.c (main): Rename "server-headers" to "server-response".
+
+ * src/ftp-unix.c (ftp_parse_ls): Check for asterisks at the end of
+ executables in 'ls -F' listings.
+
+1996-09-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (parseurl): Remove realloc() and sprintf().
+ (str_url): Get rid of sprintf().
+
+ * src/recur.c (recursive_retrieve): Enable FTP recursion through proxy
+ servers.
+
+ * src/url.h (URL_CLEANSE): Made it else-resistant.
+ (USE_PROXY): New macro.
+
+1996-09-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b18.
+
+ * src/url.c: Made it reallocate space exponentially.
+
+1996-09-14 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/NEWS: Update.
+
+ * src/version.c: Changed version to 1.4b19.
+
+1996-09-14 Drazen Kacar <dave@fly.cc.fer.hr>
+
+ * src/html.c (htmlfindurl): Added <frame src> and <iframe src> among
+ the list of stuff to fetch.
+
+1996-09-13 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (get_urls_html): Fixed a bug that caused SIGSEGV's with
+ -Fi.
+
+ * src/html.c (htmlfindurl): Rewrite.
+
+ * src/http.c (gethttp): Use opt.proxy_cache.
+
+ * src/main.c (main): Added --cache option.
+
+ * src/ftp.c (ftp_response): Print server response if opt.print_server
+ response is set.
+ (getftp): Print newlines after each request if the server response
+ is to be printed.
+ (ftp_response): Copy the last response line to last_respline.
+
+ * src/http.c (gethttp): Add Pragma: nocache for retried
+ proxy-retrievals.
+
+ * src/ftp.c (getftp): Use it.
+
+ * src/retr.c (buf_discard): New function.
+
+ * src/ftp.c (ftp_response): Use buf_readchar().
+ (getftp): Flush the control connection buffer before calling
+ get_contents().
+
+ * src/retr.c (buf_readchar): New function.
+ (buf_flush): New function.
+ (get_contents): Use buf_readchar() instead of read(x, x, 1).
+ (get_contents): Use buf_flush.
+
+1996-09-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (hgetlen): Compute the header length the first time only.
+ (hgettype): Ditto.
+ (hgetlocation): Ditto.
+ (hgetmodified): Ditto.
+
+1996-09-12 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c: Incorporate changes to ftp_response.
+
+ * src/ftp.c (ftp_response): Allocate the server response dynamically,
+ as in read_whole_line and fetch_next_header.
+
+ * src/utils.c (read_whole_line): Fixed a bug that prevented reading
+ the last line if it is not \n-terminated. Also fixed a possible
+ memory overflow.
+
+ * src/http.c (fetch_next_header): Return malloc-ed string as large as
+ needed.
+ (gethttp): Use new fetch_next_header.
+
+1996-09-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/sample.geturlrc: Update.
+
+1996-09-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b17.
+
+ * src/ftp-unix.c (ftp_parse_ls): If unable to open file, return NULL
+ instead of failed assertion.
+
+1996-09-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): Ditto.
+
+ * src/ftp.c (getftp): Open the output file as binary.
+
+ * src/version.c: Changed version to 1.4b18.
+
+1996-09-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_get_listing): Add a numbered suffix to LIST_FILENAME
+ if a file of that name already exists.
+
+1996-09-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_1fl_loop): Handler FTPPORTERR and FOPENERR correctly.
+
+ * src/config.h.in: Define gethostbyname as Rgethostbyname when using
+ Socks.
+
+ * src/configure.in: Check for -lresolv if using Socks.
+
+ * src/version.c: Changed version to 1.4b17.
+
+1996-07-15 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b16.
+
+ * src/http.c (gethttp): More intelligent check for first line of HTTP
+ response.
+ (gethttp): Would bug out on time-stamping.
+
+ * src/version.c: Changed version to 1.4b16.
+
+1996-07-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Released 1.4b15.
+
+ * src/http.c (http_loop): Print \n after the loop entry, not before.
+
+ * src/url.c (url_filename): Use ISDOT.
+
+ * src/url.h (ISDOT): New macro.
+
+ * src/recur.c (recursive_retrieve): Change only opt.recursive for
+ following FTP.
+
+1996-07-11 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (url_filename): Check for opt.dirstruct instead for
+ opt.recursive && opt.dirstruct.
+
+ * src/init.c (defaults): Ditto.
+ (defaults): Reset dirstruct by default.
+ (setval): Set opt.dirstruct whenever setting recursive.
+
+ * src/init.h: Removed FORCEDIRHIER.
+
+ * src/INSTALL: Added -L to socks-description.
+
+ * src/version.c: Changed version to 1.4b15.
+
+1996-07-11 Antonio Rosella <antonio.rosella@agip.it>
+
+ * src/socks/geturl.cgi: Fixed version No.
+
+ * src/socks/download-netscape.html: Ditto.
+
+ * src/socks/download.html: Changed socks.html to download.html.
+
+1996-07-10 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b14.
+
+ * src/geturl.1: Update AUTHOR to include Rosella as contributor.
+
+ * src/NEWS: Update.
+
+ * src/socks/geturl.cgi: Simplified command creation, nuked <blink>.
+
+ * src/socks/geturl.cgi: Wrap nutscape extensions within if $netscape.
+ (cal_time): Fix == to eq.
+
+ * src/socks/geturl.cgi: GPL-ized with permission of A. Rosella.
+
+ * src/geturl.1 (hostname): Moved URL CONVENTIONS to the beginning.
+
+ * src/Makefile.in: Use @VERSION@.
+
+ * src/configure.in: Check version from version.c.
+
+ * src/socks/geturl.cgi: Changed /pub/bin/perl to /usr/bin/perl.
+
+ * src/socks/download.html: Created from download-netscape.html, made
+ HTML-2.0 compliant.
+
+ * src/recur.c (recursive_retrieve): Set opt.force_dir_hier when
+ following FTP links from recursions.
+
+1996-07-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b13.
+
+ * src/url.c (make_backup): New function.
+
+ * src/http.c (http_loop): Make a backup copy of the local file (using
+ rename(2)) before opening it.
+
+ * src/main.c (main): Added --backups.
+
+ * src/host.c (ftp_getaddress): Bail out on failed mycuserid().
+ (ftp_getaddress): Check for leading dot on MY_DOMAIN.
+ (ftp_getaddress): Check for empty, null or (null) domain.
+
+ * src/url.c (get_urls_html): If this_url is NULL, the base must have a
+ protocol.
+ (parseurl): Use has_proto.
+
+ * src/retr.c (retrieve_url): Warn when proxy is used with more than 20
+ retries.
+
+ * src/url.c (mkstruct): Create the directory (calling mymkdir()) only
+ if it is not already there.
+ (has_proto): New function.
+ (get_urls_html): Eliminate the remaining call to findurl -- use
+ has_proto.
+
+ * src/geturl.1: Ditto.
+
+ * src/main.c: Change -X to -x.
+
+ * src/url.c (url_filename): Simplify creation of filename if
+ prefix_files is set.
+ (url_filename): Simplify everything. And I do mean *everything*.
+ (mkstruct): Add dir_prefix before hostname.
+ (path_simplify): Fixed a bug that caused writing outside the path
+ string in case of "." and ".." path strings.
+
+1996-07-09 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (mymkdir): Fixed a bug that prevented mymkdir() to create
+ absolute directories correctly.
+
+ * src/version.c: Changed version to 1.4b14.
+
+1996-07-06 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/init.c: Added --mirror.
+
+ * src/main.c (main): Added -X to force saving of directory hierarchy.
+
+ * src/ftp.c (ftp_retrieve_list): Added recursion depth counter.
+ (ftp_retrieve_list): Check whether quota is exceeded.
+
+ * src/url.c (get_urls_html): Skip leading blanks for absolute URIs.
+
+ * src/http.c (gethttp): Use referer if present.
+
+ * src/recur.c (recursive_retrieve): Set u->referer before calling
+ retrieve_url.
+
+ * src/url.c (newurl): Use memset to nullify the struct members.
+ (freeurl): Free the referer field too.
+
+ * src/url.h: Added referer to urlinfo.
+
+ * src/geturl.1: Updated the manual to document some of the new features.
+
+ * src/utils.c (numdigit): Moved from url.c.
+
+ * src/README: Rewritten.
+
+ * src/config.h.in: Add the support for socks.
+
+ * src/configure.in: Add the support for socks.
+
+ * src/url.c (url_filename): If the dir_prefix is ".", work with just
+ the file name.
+ (url_filename): Do not look for .n extensions if timestamping if
+ turned on.
+
+ * src/retr.c (show_progress): Skip the over-abundant restval data, and
+ print the rest of it with ',' instead of '.'.
+
+1996-07-05 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (show_progress): Changed second arg. to long (as it
+ should be).
+ (show_progress): Moved to retr.c.
+ (get_contents): Moved to retr.c.
+
+ * src/version.c: Change version to 1.4b13.
+
+1996-07-05 Hrvoje Lacko <hlacko@fly.cc.fer.hr>
+
+ * src/url.c (in_acclist): Would return after the first suffix.
+
+1996-07-04 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: "Released" 1.4b12.
+
+ * src/url.c (path_simplify): More kludgifications.
+ (get_urls_html): Use new parameters for htmlfindurl.
+
+ * src/html.c: Removed memorizing "parser states", since the new
+ organization does not require them.
+
+ * src/init.c (run_geturlrc): Use read_whole_line.
+
+ * src/ftp-unix.c (ftp_parse_ls): Use read_whole_line.
+
+ * src/recur.c (parse_robots): Use read_whole_line.
+
+ * src/utils.c (read_whole_line): New function.
+
+ * src/recur.c (tried_robots): Use add_slist/in_slist, *much* cleaner.
+
+ * src/host.c (ngethostbyname): Call inet_addr just once. Yet to be
+ tested on OSF and Ultrix.
+ (add_hlist): New function.
+ (free_hlist): New function.
+ (search_host): New function.
+ (search_address): New function.
+ (realhost): Use search_host, search_address and add_hlist.
+ (same_host): Replaced realloc() with strdupdelim(), made
+ case-insensitive, fixed a memory leak.
+
+ * src/html.c (ftp_index): Fixed tm_min and tm_sec to be tm_hour and
+ tm_min, like intended.
+
+ * src/version.c: Change user agent information to
+ Geturl/version.
+
+1996-07-03 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/utils.c: Renamed nmalloc.c to utils.c, .h likewise.
+
+ * src/url.c (acceptable): Always accept directories.
+
+ * src/ftp-unix.c (ftp_parse_ls): Support brain-damaged "ls -F"-loving
+ servers by stripping trailing @ from symlinks and trailing / from
+ directories.
+
+ * src/ftp.c (ftp_loop): Debugged the "enhanced" heuristics. :-)
+
+ * src/url.c (skip_url): Use toupper instead of UCASE.
+
+ * src/host.c (sufmatch): Made it case-insensitive.
+
+ * src/url.c (match_backwards_or_pattern): Fixed i == -1 to j == -1.
+ (match_backwards): New function, instead of
+ match_backwards_or_pattern.
+
+ * src/recur.c (recursive_retrieve): Increased performance by
+ introducing inl, which reduces number of calls to in_slist to only
+ one.
+
+ * src/ftp.c (ftp_loop): Enhanced the heuristics that decides which
+ routine to use.
+
+ * src/main.c (printhelp): Removed the warranty stuff.
+
+1996-07-02 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (add_slist): Simplify.
+ (match_backwards_or_pattern): New function.
+ (in_acclist): Use match_backwards_or_pattern.
+ (matches): Remove.
+
+1996-06-30 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (ftp_loop): Call ftp_index on empty file names, if not
+ recursive.
+
+ * src/html.c (ftp_index): Fixed to work. Beautified the output.
+
+ * src/ftp.c (ftp_retrieve_glob): Another argument to control whether
+ globbing is to be used.
+ (ftp_retrieve_list): Compare the time-stamps of local and remote
+ files to determine whether to download.
+
+1996-06-29 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (rel_constr): New function.
+
+ * src/retr.c (retrieve_from_file): Check for text/html before
+ retrieving recursively.
+
+ * src/main.c (main): Check whether the file is HTML before going into
+ recursive HTML retrieving.
+
+ * src/ftp.c (ftp_retrieve_list): Manage directories.
+ (ftp_retrieve_glob): Pass all the file-types to ftp_retrieve_list.
+ (ftp_1fl_loop): Fixed a bug that caused con->com to be incorrectly
+ initialized, causing bugchecks in getftp to fail.
+
+ * src/configure.in: Check for symlink.
+
+ * src/ftp.c (ftp_retrieve_list): Added support for symlinks.
+
+ * src/version.c: "Released" 1.4b10.
+
+ * src/atotm.c (atotm): Redeclared as time_t.
+
+ * src/init.c: New variable "timestamping".
+
+ * src/main.c (main): New option 'N'.
+
+ * src/http.c (hgetlocation): Case-insensitive match.
+ (hgetmodified): New function.
+ (http_loop): Implement time-stamping.
+
+1996-06-28 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: Changed version to 1.4b10
+
+ * src/atotm.c: New file, from phttpd.
+
+ * src/options.h (struct options): New parameter timestamping.
+
+ * src/version.c: 1.4b9 "released".
+
+ * src/recur.c (recursive_retrieve): Used linked list (ulist) for
+ faster storing of URLs.
+
+ * src/url.c (get_urls_html): Removed the old kludge with comparing the
+ outputs of htmlfindurl and findurl.
+ (get_urls_html): Added better protocol support here.
+ (create_hash): Removed, as well as add_hash and in_hash.
+ (addslist): New function.
+ (in_slist): ditto
+
+ * src/version.c: Released 1.4b8, changed version to b9.
+
+1996-06-27 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/ftp.c (freefileinfo): New function.
+ (delelement): New function.
+
+ * src/everywhere: GPL!
+
+ * src/ftp.c (ftp_loop): Use ccon.
+ (ftp_retrieve_glob): Likewise.
+
+ * src/ftp.h: Define ccon, to define status of control connection.
+
+ * src/ftp.c (ftp_get_listing): New function.
+ (ftp_retrieve_more): New function.
+ (ftp_retrieve_glob): New function.
+
+1996-06-25 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/configure.in: Removed the search for cuserid().
+
+ * src/init.c (getmode): Renamed to getperms.
+
+1996-06-24 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/version.c: New version.
+
+ * src/main.c (hangup): New function, that handles hangup. Hangup
+ signal now causes geturl to stop writing on stdout, and to write
+ to a log file.
+
+ * src/ftp.c (getftp): "Released" 1.4b7.
+
+ * src/html.c (htmlfindurl): Ignore everything inside <head>...</head>.
+ (ftp_index): Use fileinfo/urlinfo.
+
+ * src/ftp-unix.c (ftp_parse_ls): New function.
+ (symperms): New function.
+
+ * src/ftp.c (ftp_1fl_loop): New function, to handle 1-file loops.
+
+ * src/retr.c (retrieve_url): Added FTP support.
+
+1996-06-23 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/geturl.h: Removed NOTFTP2HTML enum.
+ Added DO_LOGIN, DO_CWD and DO_LIST. LIST_ONLY is obsolete.
+
+ * src/ftp.c (getftp): Resynched with urlinfo.
+ (getftp): Removed HMTL-ization of index.html from getftp.
+
+ * src/version.c: 1.4b6 "released".
+
+ * src/options.h (options): New struct, to keep options in.
+
+ * src/http.c (http_loop,gethttp): Synched with proxy.
+
+ * src/retr.c (retrieve_url): Implemented proxy retrieval.
+
+ * src/main.c (main): Use retrieve_from_file.
+
+1996-06-22 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/retr.c (retrieve_from_file): New function.
+
+ * src/url.c (parseurl): Modified to return URLOK if all OK. Protocol
+ can be found in u->proto.
+
+ * src/ftp.c (ftp_response): Fixed to accept multi-line responses as
+ per RFC 959.
+
+ * src/recr.c (recursive_retrieve): Take newloc from retrieve_url.
+
+ * src/url.c (mymkdir): Removed the file of the same name, if one
+ exists.
+ (isfile): New function.
+ (mkstruct): Fixed the '/' glitches.
+ (path_simplify): Hacked to treat something/.. correctly.
+
+1996-06-21 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (gethttp): Close the socket after error in headers.
+ (http_loop): HEOF no longer a fatal header.
+
+ * src/loop.c (retrieve_url): When dt is NULL, do not modify it. This
+ simplifies the syntax of calling retrieve_url.
+
+ * src/recr.c (recursive_retrieve): Modified to use get_urls_html.
+
+ * src/url.c (get_urls_file): New function.
+ (get_urls_html): New function.
+
+ * src/recr.c (recursive_retrieve): Patched up to conform to the
+ standards.
+
+ * src/http.c (gethttp): Synched with the rest...
+ (gethttp): Treat only CONREFUSED specially, with connection
+ errors.
+
+ * src/init.c,geturl.1,http.c (http_loop): Removed kill_error.
+
+1996-06-20 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/http.c (http_loop): New function.
+
+ * src/loop.c: Removed *lots* of stuff from retrieve_url.
+
+ * src/url.c (parseurl): Changed to work with urlinfo. Integrated
+ username finding and path parsing.
+ (newurl): New function.
+ (freeurl): New function.
+ (mkstruct): Removed the old bogosities, made it urlinfo-compliant.
+ (url_filename): Likewise.
+ (path_simplify): Accept relative paths too.
+ (opt_url): Made urlinfo-compliant, removed bogosities.
+ (path_simplify): Expanded to accept relative paths.
+ (str_url): A replacement for hide_url
+ (decode_string): Fixed a bug that caused malfunctioning when
+ encountering an illegal %.. combination.
+ (opt_url): Removed the argument. Dot-optimizations are now default.
+
+ * src/nmalloc.c (strdupdelim): New function.
+
+ * src/url.h: Added the urlinfo structure
+
+1996-06-19 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/url.c (hide_url): Thrown out the protocol assertion. Do not
+ change the URL if the protocol if not recognized.
+ (findurl): Put continue instead of break.
+
+1996-06-18 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/sample.geturlrc: Changed the defaults to be commented out and
+ harmless (previous defaults caused pains if copied to
+ ~/.geturlrc).
+
+ * src/http.c (gethttp): Print the HTTP request in debug mode.
+
+ * src/connect.c (iread): Added EINTR check loop to select-ing
+ too. EINTR is now correctly handled with select().
+
+ * src/TODO: new file
+
+1996-05-07 Hrvoje Niksic <hniksic@srce.hr>
+
+ * src/host.c (same_host): Made the function a little bit more
+ intelligent regarding diversified URL syntaxes.
+
+ * src/url.c (skip_url): Spaces are now skipped after URL:
+
+ * src/Released 1.3.1 with the patch to prevent crashing when sending
+ NULL to robot* functions and the patch to compile "out of the box"
+ on AIX.
+
+ * src/recr.c (recursive_retrieve): Added checking whether this_url is
+ NULL when calling the robot functions.
+
+ * src/ChangeLog: New file.
diff --git a/GNUmakefile b/GNUmakefile
new file mode 100644
index 0000000..770923b
--- /dev/null
+++ b/GNUmakefile
@@ -0,0 +1,127 @@
+# Having a separate GNUmakefile lets me 'include' the dynamically
+# generated rules created via cfg.mk (package-local configuration)
+# as well as maint.mk (generic maintainer rules).
+# This makefile is used only if you run GNU Make.
+# It is necessary if you want to build targets usually of interest
+# only to the maintainer.
+
+# Copyright (C) 2001, 2003, 2006-2020 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/>.
+
+# If the user runs GNU make but has not yet run ./configure,
+# give them a diagnostic.
+_gl-Makefile := $(wildcard [M]akefile)
+ifneq ($(_gl-Makefile),)
+
+# Make tar archive easier to reproduce.
+export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner
+
+# Allow the user to add to this in the Makefile.
+ALL_RECURSIVE_TARGETS =
+
+include Makefile
+
+# Some projects override e.g., _autoreconf here.
+-include $(srcdir)/cfg.mk
+
+# Allow cfg.mk to override these.
+_build-aux ?= build-aux
+_autoreconf ?= autoreconf -v
+
+include $(srcdir)/maint.mk
+
+# Ensure that $(VERSION) is up to date for dist-related targets, but not
+# for others: rerunning autoreconf and recompiling everything isn't cheap.
+_have-git-version-gen := \
+ $(shell test -f $(srcdir)/$(_build-aux)/git-version-gen && echo yes)
+ifeq ($(_have-git-version-gen)0,yes$(MAKELEVEL))
+ _is-dist-target ?= $(filter-out %clean, \
+ $(filter maintainer-% dist% alpha beta stable,$(MAKECMDGOALS)))
+ _is-install-target ?= $(filter-out %check, $(filter install%,$(MAKECMDGOALS)))
+ ifneq (,$(_is-dist-target)$(_is-install-target))
+ _curr-ver := $(shell cd $(srcdir) \
+ && $(_build-aux)/git-version-gen \
+ .tarball-version \
+ $(git-version-gen-tag-sed-script))
+ ifneq ($(_curr-ver),$(VERSION))
+ ifeq ($(_curr-ver),UNKNOWN)
+ $(info WARNING: unable to verify if $(VERSION) is the correct version)
+ else
+ ifneq (,$(_is-install-target))
+ # GNU Coding Standards state that 'make install' should not cause
+ # recompilation after 'make all'. But as long as changing the version
+ # string alters config.h, the cost of having 'make all' always have an
+ # up-to-date version is prohibitive. So, as a compromise, we merely
+ # warn when installing a version string that is out of date; the user
+ # should run 'autoreconf' (or something like 'make distcheck') to
+ # fix the version, 'make all' to propagate it, then 'make install'.
+ $(info WARNING: version string $(VERSION) is out of date;)
+ $(info run '$(MAKE) _version' to fix it)
+ else
+ $(info INFO: running autoreconf for new version string: $(_curr-ver))
+GNUmakefile: _version
+ touch GNUmakefile
+ endif
+ endif
+ endif
+ endif
+endif
+
+.PHONY: _version
+_version:
+ cd $(srcdir) && rm -rf autom4te.cache .version && $(_autoreconf)
+ $(MAKE) $(AM_MAKEFLAGS) Makefile
+
+else
+
+.DEFAULT_GOAL := abort-due-to-no-makefile
+srcdir = .
+
+# The package can override .DEFAULT_GOAL to run actions like autoreconf.
+-include ./cfg.mk
+
+# Allow cfg.mk to override these.
+_build-aux ?= build-aux
+_autoreconf ?= autoreconf -v
+
+include ./maint.mk
+
+ifeq ($(.DEFAULT_GOAL),abort-due-to-no-makefile)
+$(MAKECMDGOALS): abort-due-to-no-makefile
+endif
+
+abort-due-to-no-makefile:
+ @echo There seems to be no Makefile in this directory. 1>&2
+ @echo "You must run ./configure before running '$(MAKE)'." 1>&2
+ @exit 1
+
+endif
+
+# Tell version 3.79 and up of GNU make to not build goals in this
+# directory in parallel, in case someone tries to build multiple
+# targets, and one of them can cause a recursive target to be invoked.
+
+# Only set this if Automake doesn't provide it.
+AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
+ $(RECURSIVE_CLEAN_TARGETS:-recursive=) \
+ dist distcheck tags ctags
+
+ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)
+
+ifneq ($(word 2, $(MAKECMDGOALS)), )
+ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
+.NOTPARALLEL:
+endif
+endif
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..8865734
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,368 @@
+Installation Instructions
+*************************
+
+ Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
+Foundation, Inc.
+
+ Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved. This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+ Briefly, the shell command './configure && make && make install'
+should configure, build, and install this package. The following
+more-detailed instructions are generic; see the 'README' file for
+instructions specific to this package. Some packages provide this
+'INSTALL' file but do not implement all of the features documented
+below. The lack of an optional feature in a given package is not
+necessarily a bug. More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+ The 'configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a 'Makefile' in each directory of the package.
+It may also create one or more '.h' files containing system-dependent
+definitions. Finally, it creates a shell script 'config.status' that
+you can run in the future to recreate the current configuration, and a
+file 'config.log' containing compiler output (useful mainly for
+debugging 'configure').
+
+ It can also use an optional file (typically called 'config.cache' and
+enabled with '--cache-file=config.cache' or simply '-C') that saves the
+results of its tests to speed up reconfiguring. Caching is disabled by
+default to prevent problems with accidental use of stale cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how 'configure' could check whether to do them, and mail
+diffs or instructions to the address given in the 'README' so they can
+be considered for the next release. If you are using the cache, and at
+some point 'config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file 'configure.ac' (or 'configure.in') is used to create
+'configure' by a program called 'autoconf'. You need 'configure.ac' if
+you want to change it or regenerate 'configure' using a newer version of
+'autoconf'.
+
+ The simplest way to compile this package is:
+
+ 1. 'cd' to the directory containing the package's source code and type
+ './configure' to configure the package for your system.
+
+ Running 'configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type 'make' to compile the package.
+
+ 3. Optionally, type 'make check' to run any self-tests that come with
+ the package, generally using the just-built uninstalled binaries.
+
+ 4. Type 'make install' to install the programs and any data files and
+ documentation. When installing into a prefix owned by root, it is
+ recommended that the package be configured and built as a regular
+ user, and only the 'make install' phase executed with root
+ privileges.
+
+ 5. Optionally, type 'make installcheck' to repeat any self-tests, but
+ this time using the binaries in their final installed location.
+ This target does not install anything. Running this target as a
+ regular user, particularly if the prior 'make install' required
+ root privileges, verifies that the installation completed
+ correctly.
+
+ 6. You can remove the program binaries and object files from the
+ source code directory by typing 'make clean'. To also remove the
+ files that 'configure' created (so you can compile the package for
+ a different kind of computer), type 'make distclean'. There is
+ also a 'make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 7. Often, you can also type 'make uninstall' to remove the installed
+ files again. In practice, not all packages have tested that
+ uninstallation works correctly, even though it is required by the
+ GNU Coding Standards.
+
+ 8. Some packages, particularly those that use Automake, provide 'make
+ distcheck', which can by used by developers to test that all other
+ targets like 'make install' and 'make uninstall' work correctly.
+ This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the 'configure' script does not know about. Run './configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give 'configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here is
+an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU 'make'. 'cd' to the
+directory where you want the object files and executables to go and run
+the 'configure' script. 'configure' automatically checks for the source
+code in the directory that 'configure' is in and in '..'. This is known
+as a "VPATH" build.
+
+ With a non-GNU 'make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use 'make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple '-arch' options to the
+compiler but only a single '-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the 'lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, 'make install' installs the package's commands under
+'/usr/local/bin', include files under '/usr/local/include', etc. You
+can specify an installation prefix other than '/usr/local' by giving
+'configure' the option '--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like '--bindir=DIR' to specify different values for particular
+kinds of files. Run 'configure --help' for a list of the directories
+you can set and what kinds of files go in them. In general, the default
+for these options is expressed in terms of '${prefix}', so that
+specifying just '--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+ The most portable way to affect installation locations is to pass the
+correct locations to 'configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+'make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+ The first method involves providing an override variable for each
+affected directory. For example, 'make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+'${prefix}'. Any directories that were specified during 'configure',
+but not in terms of '${prefix}', must each be overridden at install time
+for the entire installation to be relocated. The approach of makefile
+variable overrides for each directory variable is required by the GNU
+Coding Standards, and ideally causes no recompilation. However, some
+platforms have known limitations with the semantics of shared libraries
+that end up requiring recompilation when using this method, particularly
+noticeable in packages that use GNU Libtool.
+
+ The second method involves providing the 'DESTDIR' variable. For
+example, 'make install DESTDIR=/alternate/directory' will prepend
+'/alternate/directory' before all installation names. The approach of
+'DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters. On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of '${prefix}'
+at 'configure' time.
+
+Optional Features
+=================
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving 'configure' the
+option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
+
+ Some packages pay attention to '--enable-FEATURE' options to
+'configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to '--with-PACKAGE' options, where PACKAGE
+is something like 'gnu-as' or 'x' (for the X Window System). The
+'README' should mention any '--enable-' and '--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, 'configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the 'configure' options '--x-includes=DIR' and
+'--x-libraries=DIR' to specify their locations.
+
+ Some packages offer the ability to configure how verbose the
+execution of 'make' will be. For these packages, running './configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with 'make V=1'; while running './configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with 'make V=0'.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC
+is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ HP-UX 'make' updates targets which have the same time stamps as their
+prerequisites, which makes it generally unusable when shipped generated
+files such as 'configure' are involved. Use GNU 'make' instead.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its '<wchar.h>' header file. The option '-nodtk' can be used as a
+workaround. If GNU CC is not installed, it is therefore recommended to
+try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+ On Solaris, don't put '/usr/ucb' early in your 'PATH'. This
+directory contains several dysfunctional programs; working variants of
+these programs are available in '/usr/bin'. So, if you need '/usr/ucb'
+in your 'PATH', put it _after_ '/usr/bin'.
+
+ On Haiku, software installed for all users goes in '/boot/common',
+not '/usr/local'. It is recommended to use the following options:
+
+ ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+ There may be some features 'configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, 'configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+'--build=TYPE' option. TYPE can either be a short name for the system
+type, such as 'sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS
+ KERNEL-OS
+
+ See the file 'config.sub' for the possible values of each field. If
+'config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option '--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with '--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for 'configure' scripts to share,
+you can create a site shell script called 'config.site' that gives
+default values for variables like 'CC', 'cache_file', and 'prefix'.
+'configure' looks for 'PREFIX/share/config.site' if it exists, then
+'PREFIX/etc/config.site' if it exists. Or, you can set the
+'CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all 'configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to 'configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the 'configure' command line, using 'VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified 'gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
+Autoconf limitation. Until the limitation is lifted, you can use this
+workaround:
+
+ CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+'configure' Invocation
+======================
+
+ 'configure' recognizes the following options to control how it
+operates.
+
+'--help'
+'-h'
+ Print a summary of all of the options to 'configure', and exit.
+
+'--help=short'
+'--help=recursive'
+ Print a summary of the options unique to this package's
+ 'configure', and exit. The 'short' variant lists options used only
+ in the top level, while the 'recursive' variant lists options also
+ present in any nested packages.
+
+'--version'
+'-V'
+ Print the version of Autoconf used to generate the 'configure'
+ script, and exit.
+
+'--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally 'config.cache'. FILE defaults to '/dev/null' to
+ disable caching.
+
+'--config-cache'
+'-C'
+ Alias for '--cache-file=config.cache'.
+
+'--quiet'
+'--silent'
+'-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to '/dev/null' (any error
+ messages will still be shown).
+
+'--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ 'configure' can determine that directory automatically.
+
+'--prefix=DIR'
+ Use DIR as the installation prefix. *note Installation Names:: for
+ more details, including other options available for fine-tuning the
+ installation locations.
+
+'--no-create'
+'-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+'configure' also accepts some other, not widely useful, options. Run
+'configure --help' for more details.
diff --git a/MAILING-LIST b/MAILING-LIST
new file mode 100644
index 0000000..d8ce69c
--- /dev/null
+++ b/MAILING-LIST
@@ -0,0 +1,30 @@
+Mailing Lists
+=============
+
+Primary List
+------------
+
+The primary mailinglist for discussion, bug-reports, or questions about
+GNU Wget is at <bug-wget@gnu.org>. To subscribe, send an email to
+<bug-wget-join@gnu.org>, or visit
+`https://lists.gnu.org/mailman/listinfo/bug-wget'.
+
+ You do not need to subscribe to send a message to the list; however,
+please note that unsubscribed messages are moderated, and may take a
+while before they hit the list--*usually around a day*. If you want
+your message to show up immediately, please subscribe to the list
+before posting. Archives for the list may be found at
+`https://lists.gnu.org/pipermail/bug-wget/'.
+
+Obsolete Lists
+--------------
+
+Previously, the mailing list <wget@sunsite.dk> was used as the main
+discussion list, and another list, <wget-patches@sunsite.dk> was used
+for submitting and discussing patches to GNU Wget.
+
+ Messages from <wget@sunsite.dk> are archived at
+ `https://www.mail-archive.com/wget%40sunsite.dk/' and at
+
+ Messages from <wget-patches@sunsite.dk> are archived at
+ `https://news.gmane.org/gmane.comp.web.wget.patches'.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..43ea3f2
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,109 @@
+# Makefile for `Wget' utility
+# Copyright (C) 1995-1997, 2006-2020 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/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+
+
+# We can't help that installing wget.info leaves /usr/share/info/dir
+# around, and we need to prevent uninstallation of the possibly
+# previously-existing /etc/wgetrc.
+distuninstallcheck_listfiles = find . -type f | \
+ grep -Ev '(/share/info/dir|/etc/wgetrc)$$'
+
+# Search for macros in the m4 subdirectory:
+ACLOCAL_AMFLAGS = -I m4
+
+# subdirectories in the distribution
+SUBDIRS = lib src doc po gnulib_po util fuzz tests testenv
+
+EXTRA_DIST = MAILING-LIST \
+ msdos/config.h msdos/Makefile.DJ \
+ msdos/Makefile.WC ABOUT-NLS \
+ build-aux/build_info.pl build-aux/git-version-gen .version
+
+CLEANFILES = *~ *.bak $(DISTNAME).tar.gz
+DISTCLEANFILES = po/stamp-po gnulib_po/stamp-po
+
+BUILT_SOURCES = .version
+
+clean-generic:
+ rm -f install-info
+
+.version:
+ echo $(VERSION) > $@-t && mv $@-t $@
+
+# Arrange so that .tarball-version appears only in the distribution
+# tarball, and never in a checked-out repository.
+dist-hook: gen-ChangeLog
+ $(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
+
+gen_start_date = 2014-12-10
+.PHONY: gen-ChangeLog
+gen-ChangeLog:
+ $(AM_V_GEN)if test -d .git; then \
+ log_fix="$(srcdir)/build-aux/git-log-fix"; \
+ test -e "$$log_fix" \
+ || amend_git_log=; \
+ $(top_srcdir)/build-aux/gitlog-to-changelog \
+ $$amend_git_log --since=$(gen_start_date) > $(distdir)/cl-t && \
+ echo >> $(distdir)/cl-t && \
+ cat ChangeLog-2014-12-10 >> $(distdir)/cl-t && \
+ { rm -f $(distdir)/ChangeLog && \
+ mv $(distdir)/cl-t $(distdir)/ChangeLog; } \
+ fi
+
+check-valgrind:
+ TESTS_ENVIRONMENT="VALGRIND_TESTS=1" $(MAKE) check
+
+LCOV_INFO=wget.info
+
+clean-lcov:
+ rm -rf $(LCOV_INFO) */*.gc?? */.libs/*.gc?? lcov/
+ lcov --zerocounters --directory src/
+
+check-coverage: clean clean-lcov
+ $(MAKE) CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ lcov --capture --initial --directory src/ --output-file $(LCOV_INFO)
+ $(MAKE) CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage" VALGRIND_TESTS=0 check
+ lcov --capture --directory src/ --output-file $(LCOV_INFO)
+ lcov --remove $(LCOV_INFO) '/usr/include/*' '*/lib/*' -o $(LCOV_INFO)
+ genhtml --prefix . --ignore-errors source $(LCOV_INFO) --legend --title "Wget" --output-directory=lcov
+ @echo
+ @echo "You can now view the coverage report with 'xdg-open lcov/index.html'"
+
+fuzz-coverage: clean clean-lcov
+ $(MAKE) -C lib
+ $(MAKE) -C src CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ $(MAKE) -C fuzz check CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ lcov --capture --initial --directory fuzz --directory src --output-file $(LCOV_INFO)
+ lcov --capture --directory fuzz --directory src --output-file $(LCOV_INFO)
+ lcov --remove $(LCOV_INFO) '/usr/include/*' '*/lib/*' -o $(LCOV_INFO)
+ genhtml --prefix . --ignore-errors source $(LCOV_INFO) --legend --title "Wget-fuzz" --output-directory=lcov
+ @echo
+ @echo "You can now view the coverage report with 'xdg-open lcov/index.html'"
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..1e6e925
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,2181 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `Wget' utility
+# Copyright (C) 1995-1997, 2006-2020 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/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = tests/certs/interca.conf tests/certs/rootca.conf
+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 =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir distdir-am dist dist-all distcheck
+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
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(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/missing \
+ $(top_srcdir)/tests/certs/interca.conf.in \
+ $(top_srcdir)/tests/certs/rootca.conf.in ABOUT-NLS AUTHORS \
+ COPYING ChangeLog INSTALL NEWS README 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 build-aux/texinfo.tex
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+
+# We can't help that installing wget.info leaves /usr/share/info/dir
+# around, and we need to prevent uninstallation of the possibly
+# previously-existing /etc/wgetrc.
+distuninstallcheck_listfiles = find . -type f | \
+ grep -Ev '(/share/info/dir|/etc/wgetrc)$$'
+
+
+# Search for macros in the m4 subdirectory:
+ACLOCAL_AMFLAGS = -I m4
+
+# subdirectories in the distribution
+SUBDIRS = lib src doc po gnulib_po util fuzz tests testenv
+EXTRA_DIST = MAILING-LIST \
+ msdos/config.h msdos/Makefile.DJ \
+ msdos/Makefile.WC ABOUT-NLS \
+ build-aux/build_info.pl build-aux/git-version-gen .version
+
+CLEANFILES = *~ *.bak $(DISTNAME).tar.gz
+DISTCLEANFILES = po/stamp-po gnulib_po/stamp-po
+BUILT_SOURCES = .version
+gen_start_date = 2014-12-10
+LCOV_INFO = wget.info
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+tests/certs/interca.conf: $(top_builddir)/config.status $(top_srcdir)/tests/certs/interca.conf.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+tests/certs/rootca.conf: $(top_builddir)/config.status $(top_srcdir)/tests/certs/rootca.conf.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-hook
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+ install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am clean clean-cscope clean-generic \
+ 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 dist-zstd distcheck distclean distclean-generic \
+ distclean-tags distcleancheck distdir distuninstallcheck dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-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 pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+clean-generic:
+ rm -f install-info
+
+.version:
+ echo $(VERSION) > $@-t && mv $@-t $@
+
+# Arrange so that .tarball-version appears only in the distribution
+# tarball, and never in a checked-out repository.
+dist-hook: gen-ChangeLog
+ $(AM_V_GEN)echo $(VERSION) > $(distdir)/.tarball-version
+.PHONY: gen-ChangeLog
+gen-ChangeLog:
+ $(AM_V_GEN)if test -d .git; then \
+ log_fix="$(srcdir)/build-aux/git-log-fix"; \
+ test -e "$$log_fix" \
+ || amend_git_log=; \
+ $(top_srcdir)/build-aux/gitlog-to-changelog \
+ $$amend_git_log --since=$(gen_start_date) > $(distdir)/cl-t && \
+ echo >> $(distdir)/cl-t && \
+ cat ChangeLog-2014-12-10 >> $(distdir)/cl-t && \
+ { rm -f $(distdir)/ChangeLog && \
+ mv $(distdir)/cl-t $(distdir)/ChangeLog; } \
+ fi
+
+check-valgrind:
+ TESTS_ENVIRONMENT="VALGRIND_TESTS=1" $(MAKE) check
+
+clean-lcov:
+ rm -rf $(LCOV_INFO) */*.gc?? */.libs/*.gc?? lcov/
+ lcov --zerocounters --directory src/
+
+check-coverage: clean clean-lcov
+ $(MAKE) CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ lcov --capture --initial --directory src/ --output-file $(LCOV_INFO)
+ $(MAKE) CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage" VALGRIND_TESTS=0 check
+ lcov --capture --directory src/ --output-file $(LCOV_INFO)
+ lcov --remove $(LCOV_INFO) '/usr/include/*' '*/lib/*' -o $(LCOV_INFO)
+ genhtml --prefix . --ignore-errors source $(LCOV_INFO) --legend --title "Wget" --output-directory=lcov
+ @echo
+ @echo "You can now view the coverage report with 'xdg-open lcov/index.html'"
+
+fuzz-coverage: clean clean-lcov
+ $(MAKE) -C lib
+ $(MAKE) -C src CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ $(MAKE) -C fuzz check CFLAGS="$(CFLAGS) --coverage" LDFLAGS="$(LDFLAGS) --coverage"
+ lcov --capture --initial --directory fuzz --directory src --output-file $(LCOV_INFO)
+ lcov --capture --directory fuzz --directory src --output-file $(LCOV_INFO)
+ lcov --remove $(LCOV_INFO) '/usr/include/*' '*/lib/*' -o $(LCOV_INFO)
+ genhtml --prefix . --ignore-errors source $(LCOV_INFO) --legend --title "Wget-fuzz" --output-directory=lcov
+ @echo
+ @echo "You can now view the coverage report with 'xdg-open lcov/index.html'"
+
+# 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/NEWS b/NEWS
new file mode 100644
index 0000000..fbb6393
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1166 @@
+GNU Wget NEWS -- history of user-visible changes.
+
+Copyright (C) 1997-2020 Free Software Foundation, Inc.
+See the end for copying conditions.
+
+Please send GNU Wget bug reports to <bug-wget@gnu.org>.
+
+* Changes in Wget 1.21
+
+** Improve the number of translated strings
+
+** Remove all uses of alloca
+ In some places the length of untrusted strings has been used, e.g.
+ strings from the command line or from remote.
+
+** Fix buffer overflows in progress bar code in some locales
+
+** Fix two null pointer accesses
+
+** Amend cookie file header to be recognized by the 'file' command
+
+** Post Handshake Authentication for OpenSSL
+
+** Require gettext version 0.19.3+
+
+** Add configure flags --enable-fsanitize-ubsan, --enable-fsanitize-asan
+ and --enable-fsanitize-msan for gcc and clang
+
+** Make several smaller fixes, enhance fuzzing, enhance building
+
+
+* Changes in Wget 1.20.3
+
+** Fixed a buffer overflow vulnerability
+
+
+* Changes in Wget 1.20.2
+
+** NTLM authentication will retry under certain cases
+
+
+* Changes in Wget 1.20.1
+
+** --xattr is no longer default since it introduces privacy issues.
+
+** --xattr saves the Referer as scheme/host/port, user/pw/path/query/fragment
+ are no longer saved to prevent privacy issues.
+
+** --xattr saves the Original URL without user/password to prevent
+ privacy issues.
+
+
+* Changes in Wget 1.20
+
+** Add new option `--retry-on-host-error` to treat local errors as transient
+and hence Wget will retry to download the file after a brief waiting period.
+
+** Fixed multiple potential resource leaks as found by static analysis
+
+** Wget will now not create an empty wget-log file when running with -q and -b
+switches together
+
+** When compiled using the GnuTLS >= 3.6.3, Wget now has support for TLSv1.3
+
+** Now there is support for using libpcre2 for regex pattern matching
+
+** When downloading over FTP recursively, one can now use the
+--{accept,reject}-regex switches to fine-tune the downloaded files
+
+** Building Wget from the git sources now requires autoconf 2.63 or above.
+Building from the Tarballs works as it used to.
+
+
+* Changes in Wget 1.19.5
+
+* Fix cookie injection (CVE-2018-0494)
+
+* Enable TLS1.3 with recent OpenSSL environment
+
+* New option --ciphers to set GnuTLS / OpenSSL ciphers directly
+
+* Updated CSS grammar to CSS 2.2
+
+* Fixed several memleaks found by OSS-Fuzz
+
+* Fixed several buffer overflows found by OSS-Fuzz
+
+* Fixed several integer overflows found by OSS-Fuzz
+
+* Several minor bug fixes
+
+
+* Changes in Wget 1.19.4
+
+* A major bug that caused GZip'ed pages to never be decompressed has been fixed
+
+* Support for Content-Encoding and Transfer-Encoding have been marked as
+ experimental and disabled by default
+
+
+* Changes in Wget 1.19.3
+
+* Prevent erroneous decompression of .gz and .tgz files with broken servers
+
+* Added support for HTTP 308 Permanent Redirect response
+
+* Fix a segfault in some cases where the Content-Type header is not sent
+
+* Support OpenSSL 1.1 builds without using deprecated features
+
+* Fix netrc file detection on Windows
+
+* Several minor bug fixes
+
+
+* Changes in Wget 1.19.2
+
+* Fix CVE-2017-13089 (Stack overflow in HTTP protocol handling)
+
+* Fix CVE-2017-13090 (Heap overflow in HTTP protocol handling)
+
+* New option --compression for gzip Content-Encoding
+
+* New option --[no]-netrc to control .netrc parsing
+
+* Added GNU extensions to .netrc parsing
+
+* Improved IDNA 2003 compatibility
+
+* Fix VPATH issues
+
+* Improved and extended the test suite
+
+* Support Wayback Machine's X-Archive-Orig-last-modified
+
+* Several bug fixes
+
+
+* Changes in Wget 1.19.1
+
+* Fix bugs, a regression, portability/build issues
+
+* Add new option --retry-on-http-error
+
+
+* Changes in Wget 1.19
+
+* New option --use-askpass=COMMAND. Fetch user/password by calling
+ an external program.
+
+* Use IDNA2008 (+ TR46 if available) through libidn2
+
+* When processing a Metalink header, --metalink-index=<number> allows
+ to process the header's application/metalink4+xml files.
+
+* When processing a Metalink file, --trust-server-names enables the
+ use of the destination file names specified in the Metalink file,
+ otherwise a safe destination file name is computed.
+
+* When processing a Metalink file, enforce a safe destination path.
+ Remove any drive letter prefix under w32, i.e. 'C:D:file'. Call
+ libmetalink's metalink_check_safe_path() to prevent absolute,
+ relative, or home paths:
+ https://tools.ietf.org/html/rfc5854#section-4.1.2.1
+ https://tools.ietf.org/html/rfc5854#section-4.2.8.3
+
+* When processing a Metalink file, --directory-prefix=<prefix> sets
+ the top of the retrieval tree to prefix for Metalink downloads.
+
+* When processing a Metalink file, reject downloaded files which don't
+ agree with their own metalink:size value:
+ https://tools.ietf.org/html/rfc5854#section-4.2.16
+
+* When processing a Metalink file, with --continue resume partially
+ downloaded files and keep fully downloaded files even if they fail
+ the verification.
+
+* When processing a Metalink file, create the parent directories of a
+ "path/file" destination file name:
+ https://tools.ietf.org/html/rfc5854#section-4.1.2.1
+ https://tools.ietf.org/html/rfc5854#section-4.2.8.3
+
+* On a recursive download, append a .tmp suffix to temporary files
+ that will be deleted after being parsed, and create them
+ readable/writable only by the owner.
+
+* New make target 'check-valgrind'
+
+* Fix several bugs
+
+* Fix compatibility issues
+
+* Changes in Wget 1.18
+
+* By default, on server redirects to a FTP resource, use the original
+ URL to get the local file name. Close CVE-2016-4971. This
+ introduces a backward-incompatibility for HTTP->FTP redirects and
+ any script that relies on the old behaviour must use
+ --trust-server-names.
+
+* Check the HSTS file is not world-writable before using it.
+
+* Parse <img srcset> attributes on a recursive download.
+
+* Fix problem with SNI server names having trailing dot(s)
+
+* New options --bind-dns-address and --dns-servers.
+
+* When Wget is built with libiconv, it now converts non-ASCII URIs to
+ the locale's codeset when it creates files. The encoding of the
+ remote files and URIs is taken from --remote-encoding, defaulting to
+ UTF-8. The result is that non-ASCII URIs and files downloaded via
+ HTTP/HTTPS and FTP will have names on the local filesystem that
+ correspond to their remote names.
+
+* Changes in Wget 1.17.1
+
+* Fix compile error when IPv6 is disabled or SSL is not present.
+
+* Fix HSTS memory leak.
+
+* Fix progress output in non-C locales.
+
+* Fix SIGSEGV when -N and --content-disposition are used together.
+
+* Add --check-certificate=quiet to tell wget to not print any warning about
+ invalid certificates.
+
+* Changes in Wget 1.17
+
+** Remove FTP passive to active fallback due to privacy concerns.
+
+** Add support for --if-modified-since.
+
+** Add support for metalink through --input-metalink and --metalink-over-http.
+
+** Add support for HSTS through --hsts and --hsts-file.
+
+** Add option to restrict filenames under VMS.
+
+** Add support for --rejected-log which logs to a separate file the reasons why
+ URLs are being rejected and some context around it.
+
+** Add support for FTPS.
+
+** Do not download/save file on error when --spider enabled
+
+** Add --convert-file-only option. This option converts only the
+ filename part of the URLs, leaving the rest of the URLs untouched.
+
+* Changes in Wget 1.16.3
+
+** Fix a regression introduced by wget 1.16.2 that --quiet is not
+ really quiet anymore.
+
+* Changes in Wget 1.16.2
+
+** Native uuid generation on Windows
+
+** Fix build on Solaris
+
+** Allow progress bar on stderr when -o is used
+
+** Accept 5-digit port numbers in FTP EPSV responses.
+
+** Support older versions of flex.
+
+** Updated translations.
+
+* Changes in Wget 1.16.1
+
+** Add --enable-assert configure option.
+
+** Use pkg-config to check for libraries presence.
+
+** Do not limit --secure-protocol=auto|pfs to TLSv1.0.
+
+** Add --secure-protocol=TLSv1_1|TLSv1_2 .
+
+** Full C89 source code compliance.
+
+** Select and use the most secure authentication scheme with HTTP connections.
+
+** Fix issues with turkish locales.
+
+** Handle 504 Gateway Timeout.
+
+** New option --crl-file to load Certificate Revocation Lists.
+
+** Add valgrind support to tests suite.
+
+** Fix an off-by-one problem in the progress bar (introduced in 1.16).
+
+* Changes in Wget 1.16
+
+** No longer create local symbolic links by default. Closes CVE-2014-4877.
+
+** Use libpsl for verifying cookie domains.
+
+** Default progress bar output changed.
+
+** Introduce --show-progress to force display the progress bar.
+
+** Introduce --no-config. The wgetrc files will not be read.
+
+** Introduce --start-pos to allow starting downloads from a specified position.
+
+** Fix a problem with ISA Server Proxy and keep-alive connections.
+
+* Changes in Wget 1.15
+
+** Add support for --method.
+
+** Add support for file names longer than MAX_FILE.
+
+** Support FTP listing for the FTP Server on Windows Server 2008 R2.
+
+** Fix a regression when -c and --content-disposition are used together.
+
+** Support shorthand URLs in an input file.
+
+** Fix -c with servers that don't specify a content-length.
+
+** Add support for MD5-SESS
+
+** Do not fail on non fatal GNU TLS alerts during handshake.
+
+** Add support for --https-only. When used wget will follow only
+ HTTPS links in recursive mode.
+
+** Support Perfect-Forward Secrecy in --secure-protocol.
+
+** Fix a problem with some IRI links that are not followed when contained in a
+ HTML document.
+
+** Support some FTP servers that return an empty list with "LIST -a".
+
+** Specify Host with the HTTP CONNECT method.
+
+** Use the correct HTTP method on a redirection.
+
+* Changes in Wget 1.14
+
+** Add support for content-on-error. It allows to store the HTTP
+ payload on 4xx or 5xx errors.
+
+** Add support for WARC files.
+
+** Fix a memory leak problem in the GNU TLS backend.
+
+** Autoreconf works again for distributed tarballs.
+
+** Print some diagnostic messages to stderr not to stdout.
+
+** Report stdout close errors.
+
+** Accept the --report-speed option.
+
+** Enable client certificates when GNU TLS is used.
+
+** Add support for TLS Server Name Indication.
+
+** Accept the arguments --accept-regex and --reject-regex.
+
+** The GNU TLS backend honors correctly the timeout value.
+
+** Add support for RFC 2617 Digest Access Authentication.
+
+* Changes in Wget 1.13.4
+
+** Now --version and --help work again.
+
+** Fix a build error on solaris 10 sparc.
+
+** Now --timestamping and --continue work well together.
+
+** Return a network failure when FTP downloads fail and --timestamping
+ is specified.
+
+** Fix a segfault on an incomplete STYLE tag.
+
+* Changes in Wget 1.13.3
+
+** Support HTTP/1.1
+
+** Now by default the GNU TLS library for secure connections, instead of
+ OpenSSL.
+
+** Fix some portability issues.
+
+** Handle properly malformed status line in a HTTP response.
+
+** Ignore zero length domains in $no_proxy.
+
+** Set new cookies after an authorization failure.
+
+** Exit with failure if -k is specified and -O is not a regular file.
+
+** Cope better with unclosed html tags.
+
+** Print diagnostic messages to stderr, not stdout.
+
+** Do not use an additional HEAD request when --content-disposition is used,
+ but use directly GET.
+
+** Report the average transfer speed correctly when multiple URL's are specified
+ and -c influences the transferred data amount.
+
+** GNU TLS backend works again.
+
+** Now --timestamping and --continue works well together.
+
+** By default, on server redirects, use the original URL to get the
+ local file name. Close CVE-2010-2252. This introduces a
+ backward-incompatibility; any script that relies on the old
+ behaviour must use --trust-server-names.
+
+** Fix a problem when -k is used and some URLs are specified trough
+ CSS.
+
+** Convert correctly URLs that need to be encoded to local files when following
+ links.
+
+** Use persistent connections with proxies supporting them.
+
+** Print the total download time as part of the summary for recursive downloads.
+
+** Now it is possible to specify a different startup configuration file trough
+ the --config option.
+
+** Fix an infinite loop with the error '<filename> has sprung into existence'
+ on a network error and -nc is used.
+
+** Now --adjust-extension does not modify the file extension if the file ends
+ in .htm.
+
+** Support HTTP/1.1 307 redirects keep request method.
+
+** Now --no-parent doesn't fetch undesired files if HTTP and HTTPS are used
+ by the same host on different pages.
+
+** Do not attempt to remove the file if it is not in the accept rules but
+ it is the output destination file.
+
+** Introduce `show_all_dns_entries' to print all IP addresses corresponding to
+ a DNS name when it is resolved.
+
+* Changes in Wget 1.12
+
+** Mailing list MOVED to bug-wget@gnu.org
+
+** SECURITY FIX: It had been possible to trick Wget into accepting
+SSL certificates that don't match the host name, through the trick of
+embedding NUL characters into the certs' common name. Fixed by Joao
+Ferreira <joao@joaoff.com>.
+
+** Added support for CSS. This includes:
+ - Parsing links from CSS files, and from CSS content found in HTML
+ style tags and attributes.
+ - Supporting conversion of links found within CSS content, when
+ --convert-links is specified.
+ - Ensuring that CSS files end in the ".css" filename extension,
+ when --convert-links is specified.
+
+ CSS support in Wget is thanks to Ted Mielczarek
+ <ted.mielczarek@gmail.com>.
+
+** Added support for Internationalized Resource Identifiers (IRIs, RFC
+3987). When support is enabled (requires libidn and libiconv), links
+with non-ASCII bytes are translated from their source encoding to UTF-8
+before percent-encoding. IRI support was added by Saint Xavier
+<wget@sxav.eu>, as his project for the Google Summer of Code.
+
+** Wget now provides more sensible exit status codes when downloads
+don't proceed as expected (see the manual).
+
+** --default-page option (and associated wgetrc command) added to
+support alternative default names for index.html.
+
+** --ask-password option (and associated wgetrc command) added to
+support password prompts at the console.
+
+** The --input-file option now also handles retrieving links from
+an external file.
+
+** The output generated by the --version option now includes
+information on how it was built, and the set of configure-time options
+that were selected.
+
+** --html-extension has been renamed to --adjust-extension, to reflect
+the fact that it now also applies to CSS content. --html-extension is
+still acceptable, but is now deprecated.
+
+** An "ascii" specifier is now accepted by --restrict-file-names, which
+forces the percent-encoding of all non-ASCII bytes
+
+** Several previously existing, but undocumented .wgetrc options are
+now documented: save_headers, spider, and user_agent,
+auth_no_challenge, and keep_session_cookies. Also added documentation
+for the "lowercase" and "uppercase" values for --restrict-file-names, which had been present since Wget 1.11.
+
+* Changes in Wget 1.11.4
+
+** Fixed an issue (apparently a regression) where -O would refuse to
+download when -nc was given, even though the file didn't exist.
+
+** Fixed a situation where Wget could abort with --continue if the
+remote server gives a content-length of zero when the file exists
+locally with content.
+
+** Fixed a crash on some systems, due to Wget casting a pointer-to-long
+to a pointer-to-time_t.
+
+** Translation updates for Catalan.
+
+* Changes in Wget 1.11.3
+
+** Downgraded -N with -O to a warning, rather than an error.
+
+** Translation updates
+
+* Changes in Wget 1.11.2
+
+** Fixed a problem in authenticating over HTTPS through a proxy.
+(Regression in 1.11 over 1.10.2.)
+
+** The combination of -r or -p with -O, which was disallowed in 1.11,
+has been downgraded to a warning in 1.11.2. (-O and -N, which was never
+meaningful, is still an error.)
+
+** Further improvements to progress bar displays in non-English locales
+(too many spaces could be inserted, causing the display to scroll).
+
+** Successive invocations of Wget on FTP URLS, with --no-remove-listing
+and --continue, was causing Wget to append, rather than replace,
+information in the .listing file, and thereby download the same files
+multiple times. This has been fixed in 1.11.2.
+
+** Wget 1.11 no longer allowed ".." to persist at the beginning of URLs,
+for improved conformance with RFC 3986. However, this behavior presents
+problems for some FTP setups, and so they are now preserved again, for
+FTP URLs only.
+
+* Changes in Wget 1.11.1.
+
+** Interrupted downloads no longer result in renaming the file
+(regression in 1.11 over 1.10.2).
+
+** Progress bar now displays correctly in non-English locales (and a
+related assertion failure was fixed).
+
+** Wget no longer issues a GET request over HTTP for files it should
+know it's not going to download (regression in 1.11 over 1.10.2).
+
+** Added option --auth-no-challenge, to support broken pre-1.11
+authentication-before-server-challenge, which turns out to still be
+useful for some limited cases.
+
+** Documentation of accept/reject lists in the manual's "Types of
+Files" section now explains various aspects of their behavior that may
+be surprising, and notes that they may change in the future.
+
+** Documentation of --no-parents now explains how a trailing slash, or
+lack thereof, in the specified URL, will affect behavior.
+
+* Changes in Wget 1.11.
+
+** Timestamping now uses the value from the most recent HTTP response,
+rather than the first one it got.
+
+** Authentication information is no longer sent as part of the Referer
+header in recursive fetches.
+
+** No authentication credentials are sent until a challenge is issued,
+for improved security. Authentication handling is still not
+RFC-compliant, as once a Basic challenge has been received, it will
+assume it can send credentials to any URL at that same host, and not
+just the ones at or below the original authenticated location.
+Credentials for Digest authentication are still never saved or issued
+automatically, and continue to require a challenge for each resource.
+
+** Added --max-redirect option, allowing the user to specify what should
+be the maximum number of HTTP redirects to follow.
+
+** Wget now supports saving HTTP downloads using file names specified by
+the `Content-Disposition' header. This is a standard way of specifying
+the file name used by many web dynamically generated pages. However, the
+current implementation is inefficient, and known to have bugs. It is
+EXPERIMENTAL only, and not enabled by default. Use --content-disposition
+to enable it.
+
+** The new option `--ignore-case' makes Wget ignore case when
+matching files, directories, and wildcards. This affects the -X, -I,
+-A, and -R options, as well as globbing in FTP URLs.
+
+** ETA projection is now displayed in "dot" progress output as well as
+in the default progress bar. (The dot progress is used by default when
+logging Wget's output to file using the `-o' option.)
+
+** The "lockable boolean" argument type is no longer supported. It
+was only used by the passive_ftp .wgetrc setting. If you're running
+broken scripts or Perl modules that unconditionally specify
+`--passive-ftp' and your firewall disallows it, you can override them
+by replacing wget with a script that execs wget "$@" --no-passive-ftp.
+
+** The source code has been migrated to Mercurial. The repositories are
+available at http://hg.addictivecode.org/. Prior to this, the source
+code was hosted on Subversion (migrated from the original CVS); you can
+still get access to older tags and branches for Wget in the Subversion
+repository at http://addictivecode.org/svn/wget/.
+
+* Changes in Wget 1.10.
+
+** Downloading files larger than 2GB, sometimes referred to as "large
+files", now works on systems that support them. This includes the
+majority of modern Unixes, as well as MS Windows.
+
+** IPv6 is now supported by Wget. Unlike the experimental code in
+1.9, this version supports dual-family systems. The new flags
+`--inet4' and `--inet6' (or `-4' and `-6' for short) force the use of
+IPv4 and IPv6 respectively. Note that IPv6 support has not yet been
+tested on Windows.
+
+** Microsoft's proprietary "NTLM" method of HTTP authentication is now
+supported. This authentication method is undocumented and only used
+by IIS. Note that *proxy* authentication is not supported in this
+release; you can only authenticate to the target web site.
+
+** Wget no longer truncates partially downloaded files when download
+has to start over because the server doesn't support Range. Instead,
+with such servers Wget now simply ignores the data up to the byte
+where the last attempt left off, and only then continues appending to
+the file. That way the downloaded file never shrinks, and download
+retries from servers without support for partial downloads work even
+when downloading to stdout.
+
+** SSL/TLS changes:
+
+*** SSL/TLS downloads now attempt to verify the server's certificate
+against the recognized certificate authorities. This requires CA
+certificates to have been installed in a location visible to the
+OpenSSL library. If this is not the case, you can get the bundle
+yourself from a source you trust (for example, the bundle extracted
+from Mozilla available at http://curl.haxx.se/docs/caextract.html),
+and point Wget to the PEM file using the `--ca-certificate'
+command-line option or the corresponding `.wgetrc' command.
+
+*** Secure downloads now verify that the host name in the URL matches
+the "common name" in the certificate presented by the server.
+
+*** Although the above checks provide more secure downloads, they
+unavoidably break interoperability with some sites that worked with
+previous versions, particularly those using self-signed, expired, or
+otherwise invalid certificates. If you encounter "certificate
+verification" errors or complaints that "common name doesn't match
+requested host name" and are convinced of the site's authenticity, you
+can use `--no-check-certificate' to bypass both checks.
+
+*** Talking to SSL/TLS servers over proxies now actually works.
+Previous versions of Wget erroneously sent GET requests for https
+URLs. Wget 1.10 utilizes the CONNECT method designed for this
+purpose.
+
+*** The SSL/TLS-related options have been redesigned and, for the
+first time, documented in the manual. The old, undocumented, options
+are no longer supported.
+
+** Passive FTP is now the default FTP transfer mode. Use
+`--no-passive-ftp' or specify `passive_ftp = off' in your init file to
+revert to the old behavior.
+
+** The `--header' option can now be used to override generated
+headers. For example, `wget --header="Host: foo.bar"
+http://127.0.0.1' tells Wget to connect to localhost, but to specify
+"foo.bar" in the `Host' header. In previous versions such use of
+`--header' lead to duplicate headers in HTTP requests.
+
+** The responses without headers, aka "HTTP 0.9" responses, are
+detected and handled. Although HTTP 0.9 has long been obsolete, it is
+still occasionally used, sometimes by accident.
+
+** The progress bar is now updated regularly even when the data does
+not arrive from the network.
+
+** Wget no longer preserves permissions of files retrieved by FTP by
+default. Anonymous FTP servers frequently use permissions like "664",
+which might not be what the user wants. The new option
+`--preserve-permissions' and the corresponding `.wgetrc' variable can
+be used to revert to the old behavior.
+
+** The new option `--protocol-directories' instructs Wget to also use
+the protocol name as a directory component of local file names.
+
+** Options that previously unconditionally set or unset various flags
+are now boolean options that can be invoked as either `--OPTION' or
+`--no-OPTION'. Options that required an argument "on" or "off" have
+also been changed this way, but they still accept the old syntax for
+backward compatibility. For example, instead of `--glob=off' you can
+write `--no-glob'.
+
+Allowing `--no-OPTION' for every `--OPTION' and the other way around
+is useful because it allows the user to override non-default behavior
+specified via `.wgetrc'.
+
+** The new option `--keep-session-cookies' causes `--save-cookies' to
+save session cookies (normally only kept in memory) along with the
+permanent ones. This is useful because many sites track important
+information, such as whether the user has authenticated, in session
+cookies. With this option multiple Wget runs are treated as a single
+browser session.
+
+** Wget now supports the --ftp-user and --ftp-password command
+switches to set username and password for FTP, and the --user and
+--password command switches to set username and password for both FTP
+and HTTP. The --http-passwd and --proxy-passwd command switches have
+been renamed to --http-password and --proxy-password respectively, and
+the related http_passwd and proxy_passwd .wgetrc commands to
+http_password and proxy_password respectively. The login and passwd
+.wgetrc commands have been deprecated.
+
+* `wget -b' now works correctly under Windows.
+
+* Wget 1.9.1 is a bugfix release with no user-visible changes.
+
+* Changes in Wget 1.9.
+
+** It is now possible to specify that POST method be used for HTTP
+requests. For example, `wget --post-data="id=foo&data=bar" URL' will
+send a POST request with the specified contents.
+
+** IPv6 support is available, although it's still experimental.
+
+** The `--timeout' option now also affects DNS lookup and establishing
+the TCP connection. Previously it only affected reading and writing
+data. Those three timeouts can be set separately using
+`--dns-timeout', `--connection-timeout', and `--read-timeout',
+respectively.
+
+** Download speed shown by the progress bar is based on the data
+recently read, rather than the average speed of the entire download.
+The ETA projection is still based on the overall average.
+
+** It is now possible to connect to FTP servers through FWTK
+firewalls. Set ftp_proxy to an FTP URL, and Wget will automatically
+log on to the proxy as "username@host".
+
+** The new option `--retry-connrefused' makes Wget retry downloads
+even in the face of refused connections, which are otherwise
+considered a fatal error.
+
+** The new option `--no-dns-cache' may be used to prevent Wget from
+caching DNS lookups.
+
+** Wget no longer escapes characters in local file names based on
+whether they're appropriate in URLs. Escaping can still occur for
+nonprintable characters or for '/', but no longer for frequent
+characters such as space. You can use the new option
+--restrict-file-names to relax or strengthen these rules, which can be
+useful if you dislike the default or if you're downloading to
+non-native partitions.
+
+** Handling of HTML comments has been dumbed down to conform to what
+users expect and other browsers do: instead of being treated as SGML
+declaration, a comment is terminated at the first occurrence of "-->".
+Use `--strict-comments' to revert to the old behavior.
+
+** Wget now correctly handles relative URIs that begin with "//", such
+as "//img.foo.com/foo.jpg".
+
+** Boolean options in `.wgetrc' and on the command line now accept
+values "yes" and "no" along with the traditional "on" and "off".
+
+** It is now possible to specify decimal values for timeouts, waiting
+periods, and download rate. For instance, `--wait=0.5' now works as
+expected, as does `--dns-timeout=0.5' and even `--limit-rate=2.5k'.
+
+* Wget 1.8.2 is a bugfix release with no user-visible changes.
+
+* Wget 1.8.1 is a bugfix release with no user-visible changes.
+
+* Changes in Wget 1.8.
+
+** A new progress indicator is now available and used by default.
+You can choose the progress bar type with `--progress=TYPE'. Two
+types are available, "bar" (the new default), and "dot" (the old
+dotted indicator). You can permanently revert to the old progress
+indicator by putting `progress = dot' in your `.wgetrc'.
+
+** You can limit the download rate of the retrieval using the
+`--limit-rate' option. For example, `wget --limit-rate=15k URL' will
+tell Wget not to download the body of the URL faster than 15 kilobytes
+per second.
+
+** Recursive retrieval and link conversion have been revamped:
+
+*** Wget now traverses links breadth-first. This makes the
+calculation of depth much more reliable than before. Also, recursive
+downloads are faster and consume *significantly* less memory than
+before.
+
+*** Links are converted only when the entire retrieval is complete.
+This is the only safe thing to do, as only then is it known what URLs
+have been downloaded.
+
+*** BASE tags are handled correctly when converting links. Since Wget
+already resolves <base href="..."> when resolving handling URLs, link
+conversion now makes the BASE tags point to an empty string.
+
+*** HTML anchors are now handled correctly. Links to an anchor in the
+same document (<a href="#anchorname">), which used to confuse Wget,
+are now converted correctly.
+
+*** When in page-requisites (-p) mode, no-parent (-np) is ignored when
+retrieving for inline images, stylesheets, and other documents needed
+to display the page.
+
+*** Page-requisites (-p) mode now works with frames. In other words,
+`wget -p URL-THAT-USES-FRAMES' will now download the frame HTML files,
+and all the files that they need to be displayed properly.
+
+** `--base' now works conjunction with `--input-file', providing a
+base for each URL and thereby allowing the URLs in the file to be
+relative.
+
+** If a host has more than one IP address, Wget uses the other
+addresses when accessing the first one fails.
+
+** Host directories now contain port information if the URL is at a
+non-standard port.
+
+** Wget now supports the robots.txt directives specified in
+<http://www.robotstxt.org/norobots-rfc.txt>.
+
+** URL parser has been fixed, especially the infamous overzealous
+quoting. Wget no longer dequotes reserved characters, e.g. `%3F' is
+no longer translated to `?', nor `%2B' to `+'. Unsafe characters
+which are not reserved are still escaped, of course.
+
+** No more than 20 successive redirections are allowed.
+
+* Wget 1.7.1 is a bugfix release with no user-visible changes.
+
+* Changes in Wget 1.7.
+
+** SSL (`https') pages now work if you compile Wget with SSL support;
+use the `--with-ssl' configure flag. You need to have OpenSSL
+installed.
+
+** Cookies are now supported. Wget will accept cookies sent by the
+server and return them in later requests. Additionally, it can load
+and save cookies to disk, in the same format that Netscape uses.
+
+** "Keep-alive" (persistent) HTTP connections are now supported.
+Using keep-alive allows Wget to share one TCP/IP connection for
+many retrievals, making multiple-file downloads faster and less
+stressing for the server and the network.
+
+** Wget now recognizes FTP directory listings generated by NT and VMS
+servers.
+
+** It is now possible to recurse through FTP sites where logging in
+puts you in some directory other than '/'.
+
+** You may now use `~' to mean home directory in `.wgetrc'. For
+example, `load_cookies = ~/.netscape/cookies.txt' works as you would
+expect.
+
+** The HTML parser has been rewritten. The new one works more
+reliably, allows finer-grained control over which tags and attributes
+are detected, and has better support for some features like correctly
+skipping comments and declarations, decoding entities, etc. It is
+also more general.
+
+** <meta name="robots"> tags are now respected.
+
+** Wget's internal tables now use hash tables instead of linked lists
+where appropriate. This results in huge speedups when retrieving
+large sites (thousands of documents).
+
+** Wget now has a man page, automatically generated from the Texinfo
+documentation. (The last version that shipped with a man page was
+1.4.5). To get this, you need to have pod2man from the Perl
+distribution installed on your system.
+
+* Changes in Wget 1.6
+
+** Administrative changes.
+
+*** Maintainership. Due to Hrvoje being plagued with a "real job",
+Dan Harkless is the most active maintainer (not that he doesn't have a
+real job as well). Hrvoje still participates occasionally, and both
+are being helped by many other people.
+
+*** Web page. Thanks to Jan Prikryl, Wget has an "official" web page.
+Take a look at:
+
+ http://sunsite.dk/wget/
+
+*** Anonymous CVS. Thanks to ever-helpful Karsten Thygesen, Wget
+sources are now available at an anonymous CVS server. Take a look at
+the web page for downloading instructions.
+
+** New -K / --backup-converted / backup_converted = on option causes files
+modified due to -k to be saved with a .orig prefix before being changed. When
+using -N as well, it is these .orig files that are compared against the server.
+
+** New --follow-tags / follow_tags = ... option allows you to restrict
+Wget to following only certain HTML tags when doing a recursive
+retrieval. -G / --ignore-tags / ignore_tags = ... is just the
+opposite -- all tags but the ones you specify will be followed.
+
+** New --waitretry / waitretry = SECONDS option allows waiting between retries
+of failed downloads. Wget will use "linear" backoff, waiting 1 second after the
+first failure, 2 after the second, up to SECONDS. waitretry is set to 10 by
+default in the system wgetrc.
+
+** New -p / --page-requisites / page_requisites = on option causes
+Wget to download all ancillary files necessary to display a given HTML
+page properly (e.g. inlined images).
+
+** New -E / --html-extension / html_extension = on option causes Wget
+to append ".html" to text/html filenames not ending in regexp
+"\.[Hh][Tt][Mm][Ll]?".
+
+** New type of .wgetrc command -- "lockable Boolean". Can be set to on, off,
+always, or never. This allows the .wgetrc to override the commandline. So far,
+passive_ftp is the only .wgetrc command which takes a lockable Boolean.
+
+** A number of new translation files have been added.
+
+** New --bind-address / bind_address = <address> option for people on hosts
+bound to multiple IP addresses.
+
+** wget now accepts (illegal per HTTP spec) relative URLs in HTTP redirects.
+
+* Wget 1.5.3 is a bugfix release with no user-visible changes.
+
+* Wget 1.5.2 is a bugfix release with no user-visible changes.
+
+* Wget 1.5.1 is a bugfix release with no user-visible changes.
+
+* Changes in Wget 1.5.0
+
+** Wget speaks many languages!
+
+On systems with gettext(), Wget will output messages in the language
+set by the current locale, if available. At this time we support
+Czech, German, Croatian, Italian, Norwegian and Portuguese.
+
+** Opie (Skey) is now supported with FTP.
+
+** HTTP Digest Access Authentication (RFC2069) is now supported.
+
+** The new `-b' option makes Wget go to background automatically.
+
+** The `-I' and `-X' options now accept wildcard arguments.
+
+** The `-w' option now accepts suffixes `s' for seconds, `m' for
+minutes, `h' for hours, `d' for days and `w' for weeks.
+
+** Upon getting SIGHUP, the whole previous log is now copied to
+`wget-log'.
+
+** Wget now understands proxy settings with explicit usernames and
+passwords, e.g. `http://user:password@proxy.foo.com/'.
+
+** You can use the new `--cut-dirs' option to make Wget create less
+directories.
+
+** The `;type=a' appendix to FTP URLs is now recognized. For
+instance, the following command will retrieve the welcoming message in
+ASCII type transfer:
+
+ wget "ftp://ftp.somewhere.com/welcome.msg;type=a"
+
+** `--help' and `--version' options have been redone to conform to
+standards set by other GNU utilities.
+
+** Wget should now be compilable under MS Windows environment. MS
+Visual C++ and Watcom C have been used successfully.
+
+** If the file length is known, percentages are displayed during
+download.
+
+** The manual page, now hopelessly out of date, is no longer
+distributed with Wget.
+
+* Wget 1.4.5 is a bugfix release with no user-visible changes.
+
+* Wget 1.4.4 is a bugfix release with no user-visible changes.
+
+* Changes in Wget 1.4.3
+
+** Wget is now a GNU utility.
+
+** Can do passive FTP.
+
+** Reads .netrc.
+
+** Info documentation expanded.
+
+** Compiles on pre-ANSI compilers.
+
+** Global wgetrc now goes to /usr/local/etc (i.e. $sysconfdir).
+
+** Lots of bugfixes.
+
+* Changes in Wget 1.4.2
+
+** New mirror site at ftp://sunsite.auc.dk/pub/infosystems/wget/,
+thanks to Karsten Thygesen.
+
+** Mailing list! Mail to wget-request@sunsite.auc.dk to subscribe.
+
+** New option --delete-after for proxy prefetching.
+
+** New option --retr-symlinks to retrieve symbolic links like plain
+files.
+
+** rmold.pl -- script to remove files deleted on the remote server
+
+** --convert-links should work now.
+
+** Minor bugfixes.
+
+* Changes in Wget 1.4.1
+
+** Minor bugfixes.
+
+** Added -I (the opposite of -X).
+
+** Dot tracing is now customizable; try wget --dot-style=binary
+
+* Changes in Wget 1.4.0
+
+** Wget 1.4.0 [formerly known as Geturl] is an extensive rewrite of
+Geturl. Although many things look suspiciously similar, most of the
+stuff was rewritten, like recursive retrieval, HTTP, FTP and mostly
+everything else. Wget should be now easier to debug, maintain and,
+most importantly, use.
+
+** Recursive HTTP should now work without glitches, even with Location
+changes, server-generated directory listings and other naughty stuff.
+
+** HTTP regetting is supported on servers that support Range
+specification. WWW authorization is supported -- try
+wget http://user:password@hostname/
+
+** FTP support was rewritten and widely enhanced. Globbing should now
+work flawlessly. Symbolic links are created locally. All the
+information the Unix-style ls listing can give is now recognized.
+
+** Recursive FTP is supported, e.g.
+ wget -r ftp://gnjilux.cc.fer.hr/pub/unix/util/
+
+** You can specify "rejected" directories, to which you do not want to
+enter, e.g. with wget -X /pub
+
+** Time-stamping is supported, with both HTTP and FTP. Try wget -N URL.
+
+** A new texinfo reference manual is provided. It can be read with
+Emacs, standalone info, or converted to HTML, dvi or postscript.
+
+** Fixed a long-standing bug, so that Wget now works over SLIP
+connections.
+
+** You can have a system-wide wgetrc (/usr/local/lib/wgetrc by
+default). Settings in $HOME/.wgetrc override the global ones, of
+course :-)
+
+** You can set up quota in .wgetrc to prevent sucking too much
+data. Try `quota = 5M' in .wgetrc (or quota = 100K if you want your
+sysadmin to like you).
+
+** Download rate is printed after retrieval.
+
+** Wget now sends the `Referer' header when retrieving
+recursively.
+
+** With the new --no-parent option Wget can retrieve FTP recursively
+through a proxy server.
+
+** HTML parser, as well as the whole of Wget was rewritten to be much
+faster and less memory-consuming (yes, both).
+
+** Absolute links can be converted to relative links locally. Check
+wget -k.
+
+** Wget catches hangup, filtering the output to a log file and
+resuming work. Try kill -HUP %?wget.
+
+** User-defined headers can be sent. Try
+
+ wget http://fly.cc.her.hr/ --header='Accept-Charset: iso-8859-2'
+
+** Acceptance/Rejection lists may contain wildcards.
+
+** Wget can display HTTP headers and/or FTP server response with the
+new `-S' option. It can save the original HTTP headers with `-s'.
+
+** socks library is now supported (thanks to Antonio Rosella
+<Antonio.Rosella@agip.it>). Configure with --with-socks.
+
+** There is a nicer display of REST-ed output.
+
+** Many new options (like -x to force directory hierarchy, or -m to
+turn on mirroring options).
+
+** Wget is now distributed under GNU General Public License (GPL).
+
+** Lots of small features I can't remember. :-)
+
+** A host of bugfixes.
+
+* Changes in Geturl 1.3
+
+** Added FTP globbing support (ftp://fly.cc.fer.hr/*)
+
+** Added support for no_proxy
+
+** Added support for ftp://user:password@host/
+
+** Added support for %xx in URL syntax
+
+** More natural command-line options
+
+** Added -e switch to execute .geturlrc commands from the command-line
+
+** Added support for robots.txt
+
+** Fixed some minor bugs
+
+* Geturl 1.2 is a bugfix release with no user-visible changes.
+
+* Changes in Geturl 1.1
+
+** REST supported in FTP
+
+** Proxy servers supported
+
+** GNU getopt used, which enables command-line arguments to be ordered
+as you wish, e.g. geturl http://fly.cc.fer.hr/ -vo log is the same as
+geturl -vo log http://fly.cc.fer.hr/
+
+** Netscape-compatible URL syntax for HTTP supported: host[:port]/dir/file
+
+** NcFTP-compatible colon URL syntax for FTP supported: host:/dir/file
+
+** <base href="xxx"> supported
+
+** autoconf supported
+
+----------------------------------------------------------------------
+Copyright information:
+
+Copyright (C) 1997-2005 Free Software Foundation, Inc.
+
+ Permission is granted to anyone to make or distribute verbatim
+ copies of this document as received, in any medium, provided that
+ the copyright notice and this permission notice are preserved, thus
+ giving the recipient permission to redistribute in turn.
+
+ Permission is granted to distribute modified versions of this
+ document, or of portions of it, under the above conditions,
+ provided also that they carry prominent notices stating who last
+ changed them.
diff --git a/README b/README
new file mode 100644
index 0000000..fd41b47
--- /dev/null
+++ b/README
@@ -0,0 +1,89 @@
+ -*- text -*-
+GNU Wget
+========
+ Current Web home: https://www.gnu.org/software/wget/
+
+GNU Wget is a free utility for non-interactive download of files from
+the Web. It supports HTTP, HTTPS, and FTP protocols, as well as
+retrieval through HTTP proxies.
+
+It can follow links in HTML pages and create local versions of remote
+web sites, fully recreating the directory structure of the original
+site. This is sometimes referred to as "recursive downloading."
+While doing that, Wget respects the Robot Exclusion Standard
+(/robots.txt). Wget can be instructed to convert the links in
+downloaded HTML files to the local files for offline viewing.
+
+Recursive downloading also works with FTP, where Wget can retrieve a
+hierarchy of directories and files.
+
+With both HTTP and FTP, Wget can check whether a remote file has
+changed on the server since the previous run, and only download the
+newer files.
+
+Wget has been designed for robustness over slow or unstable network
+connections; if a download fails due to a network problem, it will
+keep retrying until the whole file has been retrieved. If the server
+supports regetting, it will instruct the server to continue the
+download from where it left off.
+
+If you are behind a firewall that requires the use of a socks style
+gateway, you can get the socks library and compile wget with support
+for socks.
+
+Most of the features are configurable, either through command-line
+options, or via initialization file .wgetrc. Wget allows you to
+install a global startup file (/usr/local/etc/wgetrc by default) for
+site settings.
+
+Wget works under almost all Unix variants in use today and, unlike
+many of its historical predecessors, is written entirely in C, thus
+requiring no additional software, such as Perl. The external software
+it does work with, such as OpenSSL, is optional. As Wget uses the GNU
+Autoconf, it is easily built on and ported to new Unix-like systems.
+The installation procedure is described in the INSTALL file.
+
+As with other GNU software, the latest version of Wget can be found at
+the master GNU archive site ftp.gnu.org, and its mirrors. Wget
+resides at <ftp://ftp.gnu.org/pub/gnu/wget/>.
+
+Please report bugs in Wget to <bug-wget@gnu.org>.
+
+See the file `MAILING-LIST' for information about Wget mailing lists.
+Wget's home page is at <https://www.gnu.org/software/wget/>.
+
+If you would like to contribute code for Wget, please read
+CONTRIBUTING.md.
+
+Wget was originally written and mainained by Hrvoje Niksic. Please see
+the file AUTHORS for a list of major contributors, and the ChangeLogs
+for a detailed listing of all contributions.
+
+
+Copyright (C) 1995-2020 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, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..28b66c2
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,2305 @@
+# generated automatically by aclocal 1.16.2 -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.70],,
+[m4_warning([this file was generated for autoconf 2.70.
+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'.])])
+
+# gpgme.m4 - autoconf macro to detect GPGME.
+# Copyright (C) 2002, 2003, 2004, 2014, 2018 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
+# modifications, as long as this notice is preserved.
+#
+# This file 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.
+#
+# Last-changed: 2018-11-12
+
+
+AC_DEFUN([_AM_PATH_GPGME_CONFIG],
+[ AC_ARG_WITH(gpgme-prefix,
+ AC_HELP_STRING([--with-gpgme-prefix=PFX],
+ [prefix where GPGME is installed (optional)]),
+ gpgme_config_prefix="$withval", gpgme_config_prefix="")
+ if test x"${GPGME_CONFIG}" = x ; then
+ if test x"${gpgme_config_prefix}" != x ; then
+ GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config"
+ else
+ case "${SYSROOT}" in
+ /*)
+ if test -x "${SYSROOT}/bin/gpgme-config" ; then
+ GPGME_CONFIG="${SYSROOT}/bin/gpgme-config"
+ fi
+ ;;
+ '')
+ ;;
+ *)
+ AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.])
+ ;;
+ esac
+ fi
+ fi
+
+ use_gpgrt_config=""
+ if test x"${GPGME_CONFIG}" = x -a x"$GPGRT_CONFIG" != x -a "$GPGRT_CONFIG" != "no"; then
+ if $GPGRT_CONFIG gpgme --exists; then
+ GPGME_CONFIG="$GPGRT_CONFIG gpgme"
+ AC_MSG_NOTICE([Use gpgrt-config as gpgme-config])
+ use_gpgrt_config=yes
+ fi
+ fi
+ if test -z "$use_gpgrt_config"; then
+ AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no)
+ fi
+
+ if test "$GPGME_CONFIG" != "no" ; then
+ if test -z "$use_gpgrt_config"; then
+ gpgme_version=`$GPGME_CONFIG --version`
+ else
+ gpgme_version=`$GPGME_CONFIG --modversion`
+ fi
+ fi
+ gpgme_version_major=`echo $gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
+ gpgme_version_minor=`echo $gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
+ gpgme_version_micro=`echo $gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
+])
+
+
+AC_DEFUN([_AM_PATH_GPGME_CONFIG_HOST_CHECK],
+[
+ if test -z "$use_gpgrt_config"; then
+ gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none`
+ else
+ gpgme_config_host=`$GPGME_CONFIG --variable=host 2>/dev/null || echo none`
+ fi
+ if test x"$gpgme_config_host" != xnone ; then
+ if test x"$gpgme_config_host" != x"$host" ; then
+ AC_MSG_WARN([[
+***
+*** The config script "$GPGME_CONFIG" was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***]])
+ gpg_config_script_warn="$gpg_config_script_warn gpgme"
+ fi
+ fi
+])
+
+
+dnl AM_PATH_GPGME([MINIMUM-VERSION,
+dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS.
+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_GPGME],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+ tmp=ifelse([$1], ,1:0.4.2,$1)
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_gpgme_api=0
+ min_gpgme_version="$tmp"
+ fi
+
+ AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version)
+ ok=no
+ if test "$GPGME_CONFIG" != "no" ; then
+ req_major=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+ req_minor=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+ req_micro=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+ if test "$gpgme_version_major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$gpgme_version_major" -eq "$req_major"; then
+ if test "$gpgme_version_minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$gpgme_version_minor" -eq "$req_minor"; then
+ if test "$gpgme_version_micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ # If we have a recent GPGME, we should also check that the
+ # API is compatible.
+ if test "$req_gpgme_api" -gt 0 ; then
+ if test -z "$use_gpgrt_config"; then
+ tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+ else
+ tmp=`$GPGME_CONFIG --variable=api_version 2>/dev/null || echo 0`
+ fi
+ if test "$tmp" -gt 0 ; then
+ if test "$req_gpgme_api" -ne "$tmp" ; then
+ ok=no
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ GPGME_CFLAGS=`$GPGME_CONFIG --cflags`
+ GPGME_LIBS=`$GPGME_CONFIG --libs`
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
+ else
+ GPGME_CFLAGS=""
+ GPGME_LIBS=""
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GPGME_CFLAGS)
+ AC_SUBST(GPGME_LIBS)
+])
+
+dnl AM_PATH_GPGME_PTHREAD([MINIMUM-VERSION,
+dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme and define GPGME_PTHREAD_CFLAGS
+dnl and GPGME_PTHREAD_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME_PTHREAD],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+ tmp=ifelse([$1], ,1:0.4.2,$1)
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_gpgme_api=0
+ min_gpgme_version="$tmp"
+ fi
+
+ AC_MSG_CHECKING(for GPGME pthread - version >= $min_gpgme_version)
+ ok=no
+ if test "$GPGME_CONFIG" != "no" ; then
+ if `$GPGME_CONFIG --thread=pthread 2> /dev/null` ; then
+ req_major=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+ req_minor=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+ req_micro=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+ if test "$gpgme_version_major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$gpgme_version_major" -eq "$req_major"; then
+ if test "$gpgme_version_minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$gpgme_version_minor" -eq "$req_minor"; then
+ if test "$gpgme_version_micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ # If we have a recent GPGME, we should also check that the
+ # API is compatible.
+ if test "$req_gpgme_api" -gt 0 ; then
+ tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+ if test "$tmp" -gt 0 ; then
+ if test "$req_gpgme_api" -ne "$tmp" ; then
+ ok=no
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ GPGME_PTHREAD_CFLAGS=`$GPGME_CONFIG --thread=pthread --cflags`
+ GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs`
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
+ else
+ GPGME_PTHREAD_CFLAGS=""
+ GPGME_PTHREAD_LIBS=""
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GPGME_PTHREAD_CFLAGS)
+ AC_SUBST(GPGME_PTHREAD_LIBS)
+])
+
+
+dnl AM_PATH_GPGME_GLIB([MINIMUM-VERSION,
+dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+dnl Test for libgpgme-glib and define GPGME_GLIB_CFLAGS and GPGME_GLIB_LIBS.
+dnl
+AC_DEFUN([AM_PATH_GPGME_GLIB],
+[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
+ tmp=ifelse([$1], ,1:0.4.2,$1)
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_gpgme_api=0
+ min_gpgme_version="$tmp"
+ fi
+
+ AC_MSG_CHECKING(for GPGME - version >= $min_gpgme_version)
+ ok=no
+ if test "$GPGME_CONFIG" != "no" ; then
+ req_major=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
+ req_minor=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
+ req_micro=`echo $min_gpgme_version | \
+ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
+ if test "$gpgme_version_major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$gpgme_version_major" -eq "$req_major"; then
+ if test "$gpgme_version_minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$gpgme_version_minor" -eq "$req_minor"; then
+ if test "$gpgme_version_micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ # If we have a recent GPGME, we should also check that the
+ # API is compatible.
+ if test "$req_gpgme_api" -gt 0 ; then
+ if test -z "$use_gpgrt_config"; then
+ tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+ else
+ tmp=`$GPGME_CONFIG --variable=api_version 2>/dev/null || echo 0`
+ fi
+ if test "$tmp" -gt 0 ; then
+ if test "$req_gpgme_api" -ne "$tmp" ; then
+ ok=no
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ if test -z "$use_gpgrt_config"; then
+ GPGME_GLIB_CFLAGS=`$GPGME_CONFIG --glib --cflags`
+ GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs`
+ else
+ if $GPGRT_CONFIG gpgme-glib --exists; then
+ GPGME_CONFIG="$GPGRT_CONFIG gpgme-glib"
+ GPGME_GLIB_CFLAGS=`$GPGME_CONFIG --cflags`
+ GPGME_GLIB_LIBS=`$GPGME_CONFIG --libs`
+ else
+ ok = no
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
+ else
+ GPGME_GLIB_CFLAGS=""
+ GPGME_GLIB_LIBS=""
+ AC_MSG_RESULT(no)
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GPGME_GLIB_CFLAGS)
+ AC_SUBST(GPGME_GLIB_LIBS)
+])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+# serial 11 (pkg-config-0.29.1)
+
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_default([$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes ],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ AC_MSG_RESULT([no])
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+ ])
+elif test $pkg_failed = untried; then
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+ ])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+ [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+ [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
+dnl [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------
+dnl
+dnl Prepare a "--with-" configure option using the lowercase
+dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and
+dnl PKG_CHECK_MODULES in a single macro.
+AC_DEFUN([PKG_WITH_MODULES],
+[
+m4_pushdef([with_arg], m4_tolower([$1]))
+
+m4_pushdef([description],
+ [m4_default([$5], [build with ]with_arg[ support])])
+
+m4_pushdef([def_arg], [m4_default([$6], [auto])])
+m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes])
+m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no])
+
+m4_case(def_arg,
+ [yes],[m4_pushdef([with_without], [--without-]with_arg)],
+ [m4_pushdef([with_without],[--with-]with_arg)])
+
+AC_ARG_WITH(with_arg,
+ AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),,
+ [AS_TR_SH([with_]with_arg)=def_arg])
+
+AS_CASE([$AS_TR_SH([with_]with_arg)],
+ [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)],
+ [auto],[PKG_CHECK_MODULES([$1],[$2],
+ [m4_n([def_action_if_found]) $3],
+ [m4_n([def_action_if_not_found]) $4])])
+
+m4_popdef([with_arg])
+m4_popdef([description])
+m4_popdef([def_arg])
+
+])dnl PKG_WITH_MODULES
+
+dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [DESCRIPTION], [DEFAULT])
+dnl -----------------------------------------------
+dnl
+dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES
+dnl check._[VARIABLE-PREFIX] is exported as make variable.
+AC_DEFUN([PKG_HAVE_WITH_MODULES],
+[
+PKG_WITH_MODULES([$1],[$2],,,[$3],[$4])
+
+AM_CONDITIONAL([HAVE_][$1],
+ [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"])
+])dnl PKG_HAVE_WITH_MODULES
+
+dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES,
+dnl [DESCRIPTION], [DEFAULT])
+dnl ------------------------------------------------------
+dnl
+dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after
+dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make
+dnl and preprocessor variable.
+AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES],
+[
+PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4])
+
+AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"],
+ [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])])
+])dnl PKG_HAVE_DEFINE_WITH_MODULES
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+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.16.2], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.2])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-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <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: <https://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 The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages. To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable. To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement. MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+ dnl Find a Python interpreter. Python versions prior to 2.0 are not
+ dnl supported. (2.0 was released on October 16, 2000).
+ m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 dnl
+ python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl
+ python3.2 python3.1 python3.0 dnl
+ python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl
+ python2.0])
+
+ AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+ m4_if([$1],[],[
+ dnl No version check is needed.
+ # Find any Python interpreter.
+ if test -z "$PYTHON"; then
+ AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+ fi
+ am_display_PYTHON=python
+ ], [
+ dnl A version check is needed.
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ AC_MSG_CHECKING([whether $PYTHON version is >= $1])
+ AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_RESULT([no])
+ AC_MSG_ERROR([Python interpreter is too old])])
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+ [am_cv_pathless_PYTHON],[
+ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+ done])
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+ ])
+
+ if test "$PYTHON" = :; then
+ dnl Run any user-specified action, or abort.
+ m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+ else
+
+ dnl Query Python for its version number. Getting [:3] seems to be
+ dnl the best way to do this; it's what "site.py" does in the standard
+ dnl library.
+
+ AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+ [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+ AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+ dnl Use the values of $prefix and $exec_prefix for the corresponding
+ dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made
+ dnl distinct variables so they can be overridden if need be. However,
+ dnl general consensus is that you shouldn't need this ability.
+
+ AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+ AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+ dnl At times (like when building shared libraries) you may want
+ dnl to know which OS platform Python thinks this is.
+
+ AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+ [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+ AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+ # Just factor out some code duplication.
+ am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x. See automake bug#10227.
+try:
+ import sysconfig
+except ImportError:
+ can_use_sysconfig = 0
+else:
+ can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+ from platform import python_implementation
+ if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7':
+ can_use_sysconfig = 0
+except ImportError:
+ pass"
+
+ dnl Set up 4 directories:
+
+ dnl pythondir -- where to install python scripts. This is the
+ dnl site-packages directory, not the python standard library
+ dnl directory like in previous automake betas. This behavior
+ dnl is more consistent with lispdir.m4 for example.
+ dnl Query distutils for this directory.
+ AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+ [am_cv_python_pythondir],
+ [if test "x$prefix" = xNONE
+ then
+ am_py_prefix=$ac_default_prefix
+ else
+ am_py_prefix=$prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+ ;;
+ *)
+ case $am_py_prefix in
+ /usr|/System*) ;;
+ *)
+ am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+ ;;
+ esac
+ ;;
+ esac
+ ])
+ AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+ dnl pkgpythondir -- $PACKAGE directory under pythondir. Was
+ dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
+ dnl more consistent with the rest of automake.
+
+ AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+ dnl pyexecdir -- directory for installing python extension modules
+ dnl (shared libraries)
+ dnl Query distutils for this directory.
+ AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+ [am_cv_python_pyexecdir],
+ [if test "x$exec_prefix" = xNONE
+ then
+ am_py_exec_prefix=$am_py_prefix
+ else
+ am_py_exec_prefix=$exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+ ;;
+ *)
+ case $am_py_exec_prefix in
+ /usr|/System*) ;;
+ *)
+ am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+ ;;
+ esac
+ ;;
+ esac
+ ])
+ AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+ dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+ AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+ dnl Run any user-specified action.
+ $2
+ fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+ AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <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
+
+ 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/00gnulib.m4])
+m4_include([m4/__inline.m4])
+m4_include([m4/absolute-header.m4])
+m4_include([m4/access.m4])
+m4_include([m4/af_alg.m4])
+m4_include([m4/alloca.m4])
+m4_include([m4/arpa_inet_h.m4])
+m4_include([m4/asm-underscore.m4])
+m4_include([m4/base32.m4])
+m4_include([m4/btowc.m4])
+m4_include([m4/builtin-expect.m4])
+m4_include([m4/byteswap.m4])
+m4_include([m4/canonicalize.m4])
+m4_include([m4/chdir-long.m4])
+m4_include([m4/clock_time.m4])
+m4_include([m4/close.m4])
+m4_include([m4/closedir.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/ctype.m4])
+m4_include([m4/d-ino.m4])
+m4_include([m4/dirent_h.m4])
+m4_include([m4/dirfd.m4])
+m4_include([m4/double-slash-root.m4])
+m4_include([m4/dup.m4])
+m4_include([m4/dup2.m4])
+m4_include([m4/eaccess.m4])
+m4_include([m4/eealloc.m4])
+m4_include([m4/environ.m4])
+m4_include([m4/errno_h.m4])
+m4_include([m4/error.m4])
+m4_include([m4/exponentd.m4])
+m4_include([m4/extensions.m4])
+m4_include([m4/extern-inline.m4])
+m4_include([m4/fatal-signal.m4])
+m4_include([m4/fchdir.m4])
+m4_include([m4/fcntl-o.m4])
+m4_include([m4/fcntl.m4])
+m4_include([m4/fcntl_h.m4])
+m4_include([m4/fdopendir.m4])
+m4_include([m4/fflush.m4])
+m4_include([m4/filenamecat.m4])
+m4_include([m4/findprog-in.m4])
+m4_include([m4/flexmember.m4])
+m4_include([m4/float_h.m4])
+m4_include([m4/flock.m4])
+m4_include([m4/fnmatch.m4])
+m4_include([m4/fnmatch_h.m4])
+m4_include([m4/fopen.m4])
+m4_include([m4/fpurge.m4])
+m4_include([m4/freading.m4])
+m4_include([m4/free.m4])
+m4_include([m4/fseek.m4])
+m4_include([m4/fseeko.m4])
+m4_include([m4/fstat.m4])
+m4_include([m4/fstatat.m4])
+m4_include([m4/ftell.m4])
+m4_include([m4/ftello.m4])
+m4_include([m4/futimens.m4])
+m4_include([m4/getaddrinfo.m4])
+m4_include([m4/getcwd-abort-bug.m4])
+m4_include([m4/getcwd-path-max.m4])
+m4_include([m4/getcwd.m4])
+m4_include([m4/getdelim.m4])
+m4_include([m4/getdtablesize.m4])
+m4_include([m4/getgroups.m4])
+m4_include([m4/getline.m4])
+m4_include([m4/getopt.m4])
+m4_include([m4/getpagesize.m4])
+m4_include([m4/getpass.m4])
+m4_include([m4/getprogname.m4])
+m4_include([m4/getrandom.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/gettime.m4])
+m4_include([m4/gettimeofday.m4])
+m4_include([m4/gl-openssl.m4])
+m4_include([m4/gnulib-common.m4])
+m4_include([m4/gnulib-comp.m4])
+m4_include([m4/group-member.m4])
+m4_include([m4/host-cpu-c-abi.m4])
+m4_include([m4/hostent.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/iconv_h.m4])
+m4_include([m4/include_next.m4])
+m4_include([m4/inet_ntop.m4])
+m4_include([m4/inline.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/intmax_t.m4])
+m4_include([m4/inttypes.m4])
+m4_include([m4/inttypes_h.m4])
+m4_include([m4/ioctl.m4])
+m4_include([m4/isblank.m4])
+m4_include([m4/iswblank.m4])
+m4_include([m4/iswdigit.m4])
+m4_include([m4/iswxdigit.m4])
+m4_include([m4/langinfo_h.m4])
+m4_include([m4/largefile.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/libunistring-base.m4])
+m4_include([m4/libunistring-optional.m4])
+m4_include([m4/libunistring.m4])
+m4_include([m4/limits-h.m4])
+m4_include([m4/link.m4])
+m4_include([m4/localcharset.m4])
+m4_include([m4/locale-fr.m4])
+m4_include([m4/locale-ja.m4])
+m4_include([m4/locale-zh.m4])
+m4_include([m4/locale_h.m4])
+m4_include([m4/localeconv.m4])
+m4_include([m4/lock.m4])
+m4_include([m4/lseek.m4])
+m4_include([m4/lstat.m4])
+m4_include([m4/malloc.m4])
+m4_include([m4/malloca.m4])
+m4_include([m4/mbchar.m4])
+m4_include([m4/mbiter.m4])
+m4_include([m4/mbrtowc.m4])
+m4_include([m4/mbsinit.m4])
+m4_include([m4/mbsrtowcs.m4])
+m4_include([m4/mbstate_t.m4])
+m4_include([m4/mbtowc.m4])
+m4_include([m4/md4.m4])
+m4_include([m4/md5.m4])
+m4_include([m4/memchr.m4])
+m4_include([m4/mempcpy.m4])
+m4_include([m4/memrchr.m4])
+m4_include([m4/minmax.m4])
+m4_include([m4/mkdir.m4])
+m4_include([m4/mkostemp.m4])
+m4_include([m4/mkstemp.m4])
+m4_include([m4/mktime.m4])
+m4_include([m4/mmap-anon.m4])
+m4_include([m4/mode_t.m4])
+m4_include([m4/msvc-inval.m4])
+m4_include([m4/msvc-nothrow.m4])
+m4_include([m4/multiarch.m4])
+m4_include([m4/nanosleep.m4])
+m4_include([m4/netdb_h.m4])
+m4_include([m4/netinet_in_h.m4])
+m4_include([m4/nl_langinfo.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/nocrash.m4])
+m4_include([m4/off_t.m4])
+m4_include([m4/open-cloexec.m4])
+m4_include([m4/open-slash.m4])
+m4_include([m4/open.m4])
+m4_include([m4/openat.m4])
+m4_include([m4/opendir.m4])
+m4_include([m4/pathmax.m4])
+m4_include([m4/pipe.m4])
+m4_include([m4/pipe2.m4])
+m4_include([m4/po.m4])
+m4_include([m4/posix_spawn.m4])
+m4_include([m4/posix_spawn_faction_addchdir.m4])
+m4_include([m4/printf.m4])
+m4_include([m4/pthread_rwlock_rdlock.m4])
+m4_include([m4/quote.m4])
+m4_include([m4/quotearg.m4])
+m4_include([m4/raise.m4])
+m4_include([m4/rawmemchr.m4])
+m4_include([m4/readdir.m4])
+m4_include([m4/readlink.m4])
+m4_include([m4/realloc.m4])
+m4_include([m4/regex.m4])
+m4_include([m4/rewinddir.m4])
+m4_include([m4/save-cwd.m4])
+m4_include([m4/sched_h.m4])
+m4_include([m4/secure_getenv.m4])
+m4_include([m4/select.m4])
+m4_include([m4/servent.m4])
+m4_include([m4/setlocale_null.m4])
+m4_include([m4/sh-filename.m4])
+m4_include([m4/sha1.m4])
+m4_include([m4/sha256.m4])
+m4_include([m4/sha512.m4])
+m4_include([m4/sig_atomic_t.m4])
+m4_include([m4/sigaction.m4])
+m4_include([m4/signal_h.m4])
+m4_include([m4/signalblocking.m4])
+m4_include([m4/sigpipe.m4])
+m4_include([m4/size_max.m4])
+m4_include([m4/snprintf.m4])
+m4_include([m4/socketlib.m4])
+m4_include([m4/sockets.m4])
+m4_include([m4/socklen.m4])
+m4_include([m4/sockpfaf.m4])
+m4_include([m4/spawn-pipe.m4])
+m4_include([m4/spawn_h.m4])
+m4_include([m4/ssize_t.m4])
+m4_include([m4/stat-time.m4])
+m4_include([m4/stat.m4])
+m4_include([m4/stdalign.m4])
+m4_include([m4/stdbool.m4])
+m4_include([m4/stddef_h.m4])
+m4_include([m4/stdint.m4])
+m4_include([m4/stdint_h.m4])
+m4_include([m4/stdio_h.m4])
+m4_include([m4/stdlib_h.m4])
+m4_include([m4/stpcpy.m4])
+m4_include([m4/strcase.m4])
+m4_include([m4/strchrnul.m4])
+m4_include([m4/strdup.m4])
+m4_include([m4/strerror.m4])
+m4_include([m4/strerror_r.m4])
+m4_include([m4/string_h.m4])
+m4_include([m4/strings_h.m4])
+m4_include([m4/strndup.m4])
+m4_include([m4/strnlen.m4])
+m4_include([m4/strpbrk.m4])
+m4_include([m4/strptime.m4])
+m4_include([m4/strtok_r.m4])
+m4_include([m4/strtol.m4])
+m4_include([m4/strtoll.m4])
+m4_include([m4/symlink.m4])
+m4_include([m4/sys_file_h.m4])
+m4_include([m4/sys_ioctl_h.m4])
+m4_include([m4/sys_random_h.m4])
+m4_include([m4/sys_select_h.m4])
+m4_include([m4/sys_socket_h.m4])
+m4_include([m4/sys_stat_h.m4])
+m4_include([m4/sys_time_h.m4])
+m4_include([m4/sys_types_h.m4])
+m4_include([m4/sys_uio_h.m4])
+m4_include([m4/sys_wait_h.m4])
+m4_include([m4/tempname.m4])
+m4_include([m4/threadlib.m4])
+m4_include([m4/time_h.m4])
+m4_include([m4/time_r.m4])
+m4_include([m4/timegm.m4])
+m4_include([m4/timespec.m4])
+m4_include([m4/tm_gmtoff.m4])
+m4_include([m4/tmpdir.m4])
+m4_include([m4/unistd-safer.m4])
+m4_include([m4/unistd_h.m4])
+m4_include([m4/unlink.m4])
+m4_include([m4/unlocked-io.m4])
+m4_include([m4/utime.m4])
+m4_include([m4/utime_h.m4])
+m4_include([m4/utimens.m4])
+m4_include([m4/utimes.m4])
+m4_include([m4/vasnprintf.m4])
+m4_include([m4/vasprintf.m4])
+m4_include([m4/visibility.m4])
+m4_include([m4/vsnprintf.m4])
+m4_include([m4/wait-process.m4])
+m4_include([m4/waitpid.m4])
+m4_include([m4/warn-on-use.m4])
+m4_include([m4/warnings.m4])
+m4_include([m4/wchar_h.m4])
+m4_include([m4/wchar_t.m4])
+m4_include([m4/wcrtomb.m4])
+m4_include([m4/wctype_h.m4])
+m4_include([m4/wcwidth.m4])
+m4_include([m4/wget.m4])
+m4_include([m4/wget_manywarnings.m4])
+m4_include([m4/wint_t.m4])
+m4_include([m4/wmemchr.m4])
+m4_include([m4/wmempcpy.m4])
+m4_include([m4/write.m4])
+m4_include([m4/xalloc.m4])
+m4_include([m4/xsize.m4])
+m4_include([m4/xstrndup.m4])
+m4_include([m4/zzgnulib.m4])
diff --git a/build-aux/announce-gen b/build-aux/announce-gen
new file mode 100755
index 0000000..ff8d450
--- /dev/null
+++ b/build-aux/announce-gen
@@ -0,0 +1,572 @@
+#!/bin/sh
+#! -*-perl-*-
+
+# Generate a release announcement message.
+
+# Copyright (C) 2002-2020 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/>.
+#
+# Written by Jim Meyering
+
+# This is a prologue that allows to run a perl script as an executable
+# on systems that are compliant to a POSIX version before POSIX:2017.
+# On such systems, the usual invocation of an executable through execlp()
+# or execvp() fails with ENOEXEC if it is a script that does not start
+# with a #! line. The script interpreter mentioned in the #! line has
+# to be /bin/sh, because on GuixSD systems that is the only program that
+# has a fixed file name. The second line is essential for perl and is
+# also useful for editing this file in Emacs. The next two lines below
+# are valid code in both sh and perl. When executed by sh, they re-execute
+# the script through the perl program found in $PATH. The '-x' option
+# is essential as well; without it, perl would re-execute the script
+# through /bin/sh. When executed by perl, the next two lines are a no-op.
+eval 'exec perl -wSx "$0" "$@"'
+ if 0;
+
+my $VERSION = '2020-05-10 16:13'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+use strict;
+use Getopt::Long;
+use POSIX qw(strftime);
+
+(my $ME = $0) =~ s|.*/||;
+
+my %valid_release_types = map {$_ => 1} qw (alpha beta stable);
+my @archive_suffixes = qw (tar.gz tar.bz2 tar.lz tar.lzma tar.xz);
+my %digest_classes =
+ (
+ 'md5' => (eval { require Digest::MD5; } and 'Digest::MD5'),
+ 'sha1' => ((eval { require Digest::SHA; } and 'Digest::SHA')
+ or (eval { require Digest::SHA1; } and 'Digest::SHA1'))
+ );
+my $srcdir = '.';
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try '$ME --help' for more information.\n";
+ }
+ else
+ {
+ my @types = sort keys %valid_release_types;
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS]
+Generate an announcement message. Run this from builddir.
+
+OPTIONS:
+
+These options must be specified:
+
+ --release-type=TYPE TYPE must be one of @types
+ --package-name=PACKAGE_NAME
+ --previous-version=VER
+ --current-version=VER
+ --gpg-key-id=ID The GnuPG ID of the key used to sign the tarballs
+ --url-directory=URL_DIR
+
+The following are optional:
+
+ --news=NEWS_FILE include the NEWS section about this release
+ from this NEWS_FILE; accumulates.
+ --srcdir=DIR where to find the NEWS_FILEs (default: $srcdir)
+ --bootstrap-tools=TOOL_LIST a comma-separated list of tools, e.g.,
+ autoconf,automake,bison,gnulib
+ --gnulib-version=VERSION report VERSION as the gnulib version, where
+ VERSION is the result of running git describe
+ in the gnulib source directory.
+ required if gnulib is in TOOL_LIST.
+ --no-print-checksums do not emit MD5 or SHA1 checksums
+ --archive-suffix=SUF add SUF to the list of archive suffixes
+ --mail-headers=HEADERS a space-separated list of mail headers, e.g.,
+ To: x\@example.com Cc: y-announce\@example.com,...
+
+ --help display this help and exit
+ --version output version information and exit
+
+EOF
+ }
+ exit $exit_code;
+}
+
+
+=item C<%size> = C<sizes (@file)>
+
+Compute the sizes of the C<@file> and return them as a hash. Return
+C<undef> if one of the computation failed.
+
+=cut
+
+sub sizes (@)
+{
+ my (@file) = @_;
+
+ my $fail = 0;
+ my %res;
+ foreach my $f (@file)
+ {
+ my $cmd = "du -h $f";
+ my $t = `$cmd`;
+ # FIXME-someday: give a better diagnostic, a la $PROCESS_STATUS
+ $@
+ and (warn "command failed: '$cmd'\n"), $fail = 1;
+ chomp $t;
+ $t =~ s/^\s*([\d.]+[MkK]).*/${1}B/;
+ $res{$f} = $t;
+ }
+ return $fail ? undef : %res;
+}
+
+=item C<print_locations ($title, \@url, \%size, @file)
+
+Print a section C<$title> dedicated to the list of <@file>, which
+sizes are stored in C<%size>, and which are available from the C<@url>.
+
+=cut
+
+sub print_locations ($\@\%@)
+{
+ my ($title, $url, $size, @file) = @_;
+ print "Here are the $title:\n";
+ foreach my $url (@{$url})
+ {
+ for my $file (@file)
+ {
+ print " $url/$file";
+ print " (", $$size{$file}, ")"
+ if exists $$size{$file};
+ print "\n";
+ }
+ }
+ print "\n";
+}
+
+=item C<print_checksums (@file)
+
+Print the MD5 and SHA1 signature section for each C<@file>.
+
+=cut
+
+sub print_checksums (@)
+{
+ my (@file) = @_;
+
+ print "Here are the MD5 and SHA1 checksums:\n";
+ print "\n";
+
+ foreach my $meth (qw (md5 sha1))
+ {
+ my $class = $digest_classes{$meth} or next;
+ foreach my $f (@file)
+ {
+ open IN, '<', $f
+ or die "$ME: $f: cannot open for reading: $!\n";
+ binmode IN;
+ my $dig = $class->new->addfile(*IN)->hexdigest;
+ close IN;
+ print "$dig $f\n";
+ }
+ }
+ print "\n";
+}
+
+=item C<print_news_deltas ($news_file, $prev_version, $curr_version)
+
+Print the section of the NEWS file C<$news_file> addressing changes
+between versions C<$prev_version> and C<$curr_version>.
+
+=cut
+
+sub print_news_deltas ($$$)
+{
+ my ($news_file, $prev_version, $curr_version) = @_;
+
+ my $news_name = $news_file;
+ $news_name =~ s|^\Q$srcdir\E/||;
+
+ print "\n$news_name\n\n";
+
+ # Print all lines from $news_file, starting with the first one
+ # that mentions $curr_version up to but not including
+ # the first occurrence of $prev_version.
+ my $in_items;
+
+ my $re_prefix = qr/(?:\* )?(?:Noteworthy c|Major c|C)(?i:hanges)/;
+
+ my $found_news;
+ open NEWS, '<', $news_file
+ or die "$ME: $news_file: cannot open for reading: $!\n";
+ while (defined (my $line = <NEWS>))
+ {
+ if ( ! $in_items)
+ {
+ # Match lines like these:
+ # * Major changes in release 5.0.1:
+ # * Noteworthy changes in release 6.6 (2006-11-22) [stable]
+ $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$curr_version\E(?:[^\d.]|$)/o
+ or next;
+ $in_items = 1;
+ print $line;
+ }
+ else
+ {
+ # This regexp must not match version numbers in NEWS items.
+ # For example, they might well say "introduced in 4.5.5",
+ # and we don't want that to match.
+ $line =~ /^$re_prefix.*(?:[^\d.]|$)\Q$prev_version\E(?:[^\d.]|$)/o
+ and last;
+ print $line;
+ $line =~ /\S/
+ and $found_news = 1;
+ }
+ }
+ close NEWS;
+
+ $in_items
+ or die "$ME: $news_file: no matching lines for '$curr_version'\n";
+ $found_news
+ or die "$ME: $news_file: no news item found for '$curr_version'\n";
+}
+
+sub print_changelog_deltas ($$)
+{
+ my ($package_name, $prev_version) = @_;
+
+ # Print new ChangeLog entries.
+
+ # First find all CVS-controlled ChangeLog files.
+ use File::Find;
+ my @changelog;
+ find ({wanted => sub {$_ eq 'ChangeLog' && -d 'CVS'
+ and push @changelog, $File::Find::name}},
+ '.');
+
+ # If there are no ChangeLog files, we're done.
+ @changelog
+ or return;
+ my %changelog = map {$_ => 1} @changelog;
+
+ # Reorder the list of files so that if there are ChangeLog
+ # files in the specified directories, they're listed first,
+ # in this order:
+ my @dir = qw ( . src lib m4 config doc );
+
+ # A typical @changelog array might look like this:
+ # ./ChangeLog
+ # ./po/ChangeLog
+ # ./m4/ChangeLog
+ # ./lib/ChangeLog
+ # ./doc/ChangeLog
+ # ./config/ChangeLog
+ my @reordered;
+ foreach my $d (@dir)
+ {
+ my $dot_slash = $d eq '.' ? $d : "./$d";
+ my $target = "$dot_slash/ChangeLog";
+ delete $changelog{$target}
+ and push @reordered, $target;
+ }
+
+ # Append any remaining ChangeLog files.
+ push @reordered, sort keys %changelog;
+
+ # Remove leading './'.
+ @reordered = map { s!^\./!!; $_ } @reordered;
+
+ print "\nChangeLog entries:\n\n";
+ # print join ("\n", @reordered), "\n";
+
+ $prev_version =~ s/\./_/g;
+ my $prev_cvs_tag = "\U$package_name\E-$prev_version";
+
+ my $cmd = "cvs -n diff -u -r$prev_cvs_tag -rHEAD @reordered";
+ open DIFF, '-|', $cmd
+ or die "$ME: cannot run '$cmd': $!\n";
+ # Print two types of lines, making minor changes:
+ # Lines starting with '+++ ', e.g.,
+ # +++ ChangeLog 22 Feb 2003 16:52:51 -0000 1.247
+ # and those starting with '+'.
+ # Don't print the others.
+ my $prev_printed_line_empty = 1;
+ while (defined (my $line = <DIFF>))
+ {
+ if ($line =~ /^\+\+\+ /)
+ {
+ my $separator = "*"x70 ."\n";
+ $line =~ s///;
+ $line =~ s/\s.*//;
+ $prev_printed_line_empty
+ or print "\n";
+ print $separator, $line, $separator;
+ }
+ elsif ($line =~ /^\+/)
+ {
+ $line =~ s///;
+ print $line;
+ $prev_printed_line_empty = ($line =~ /^$/);
+ }
+ }
+ close DIFF;
+
+ # The exit code should be 1.
+ # Allow in case there are no modified ChangeLog entries.
+ $? == 256 || $? == 128
+ or warn "warning: '$cmd' had unexpected exit code or signal ($?)\n";
+}
+
+sub get_tool_versions ($$)
+{
+ my ($tool_list, $gnulib_version) = @_;
+ @$tool_list
+ or return ();
+
+ my $fail;
+ my @tool_version_pair;
+ foreach my $t (@$tool_list)
+ {
+ if ($t eq 'gnulib')
+ {
+ push @tool_version_pair, ucfirst $t . ' ' . $gnulib_version;
+ next;
+ }
+ # Assume that the last "word" on the first line of
+ # 'tool --version' output is the version string.
+ my ($first_line, undef) = split ("\n", `$t --version`);
+ if ($first_line =~ /.* (\d[\w.-]+)$/)
+ {
+ $t = ucfirst $t;
+ push @tool_version_pair, "$t $1";
+ }
+ else
+ {
+ defined $first_line
+ and $first_line = '';
+ warn "$t: unexpected --version output\n:$first_line";
+ $fail = 1;
+ }
+ }
+
+ $fail
+ and exit 1;
+
+ return @tool_version_pair;
+}
+
+{
+ # Use the C locale so that, for instance, "du" does not
+ # print "1,2" instead of "1.2", which would confuse our regexps.
+ $ENV{LC_ALL} = "C";
+
+ my $mail_headers;
+ my $release_type;
+ my $package_name;
+ my $prev_version;
+ my $curr_version;
+ my $gpg_key_id;
+ my @url_dir_list;
+ my @news_file;
+ my $bootstrap_tools;
+ my $gnulib_version;
+ my $print_checksums_p = 1;
+
+ # Reformat the warnings before displaying them.
+ local $SIG{__WARN__} = sub
+ {
+ my ($msg) = @_;
+ # Warnings from GetOptions.
+ $msg =~ s/Option (\w)/option --$1/;
+ warn "$ME: $msg";
+ };
+
+ GetOptions
+ (
+ 'mail-headers=s' => \$mail_headers,
+ 'release-type=s' => \$release_type,
+ 'package-name=s' => \$package_name,
+ 'previous-version=s' => \$prev_version,
+ 'current-version=s' => \$curr_version,
+ 'gpg-key-id=s' => \$gpg_key_id,
+ 'url-directory=s' => \@url_dir_list,
+ 'news=s' => \@news_file,
+ 'srcdir=s' => \$srcdir,
+ 'bootstrap-tools=s' => \$bootstrap_tools,
+ 'gnulib-version=s' => \$gnulib_version,
+ 'print-checksums!' => \$print_checksums_p,
+ 'archive-suffix=s' => \@archive_suffixes,
+
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ ) or usage 1;
+
+ my $fail = 0;
+ # Ensure that each required option is specified.
+ $release_type
+ or (warn "release type not specified\n"), $fail = 1;
+ $package_name
+ or (warn "package name not specified\n"), $fail = 1;
+ $prev_version
+ or (warn "previous version string not specified\n"), $fail = 1;
+ $curr_version
+ or (warn "current version string not specified\n"), $fail = 1;
+ $gpg_key_id
+ or (warn "GnuPG key ID not specified\n"), $fail = 1;
+ @url_dir_list
+ or (warn "URL directory name(s) not specified\n"), $fail = 1;
+
+ my @tool_list = split ',', $bootstrap_tools
+ if $bootstrap_tools;
+
+ grep (/^gnulib$/, @tool_list) ^ defined $gnulib_version
+ and (warn "when specifying gnulib as a tool, you must also specify\n"
+ . "--gnulib-version=V, where V is the result of running git describe\n"
+ . "in the gnulib source directory.\n"), $fail = 1;
+
+ !$release_type || exists $valid_release_types{$release_type}
+ or (warn "'$release_type': invalid release type\n"), $fail = 1;
+
+ @ARGV
+ and (warn "too many arguments:\n", join ("\n", @ARGV), "\n"),
+ $fail = 1;
+ $fail
+ and usage 1;
+
+ my $my_distdir = "$package_name-$curr_version";
+
+ my $xd = "$package_name-$prev_version-$curr_version.xdelta";
+
+ my @candidates = map { "$my_distdir.$_" } @archive_suffixes;
+ my @tarballs = grep {-f $_} @candidates;
+
+ @tarballs
+ or die "$ME: none of " . join(', ', @candidates) . " were found\n";
+ my @sizable = @tarballs;
+ -f $xd
+ and push @sizable, $xd;
+ my %size = sizes (@sizable);
+ %size
+ or exit 1;
+
+ my $headers = '';
+ if (defined $mail_headers)
+ {
+ ($headers = $mail_headers) =~ s/\s+(\S+:)/\n$1/g;
+ $headers .= "\n";
+ }
+
+ # The markup is escaped as <\# so that when this script is sent by
+ # mail (or part of a diff), Gnus is not triggered.
+ print <<EOF;
+
+${headers}Subject: $my_distdir released [$release_type]
+
+<\#secure method=pgpmime mode=sign>
+
+FIXME: put comments here
+
+EOF
+
+ if (@url_dir_list == 1 && @tarballs == 1)
+ {
+ # When there's only one tarball and one URL, use a more concise form.
+ my $m = "$url_dir_list[0]/$tarballs[0]";
+ print "Here are the compressed sources and a GPG detached signature[*]:\n"
+ . " $m\n"
+ . " $m.sig\n\n";
+ }
+ else
+ {
+ print_locations ("compressed sources", @url_dir_list, %size, @tarballs);
+ -f $xd
+ and print_locations ("xdelta diffs (useful? if so, "
+ . "please tell bug-gnulib\@gnu.org)",
+ @url_dir_list, %size, $xd);
+ my @sig_files = map { "$_.sig" } @tarballs;
+ print_locations ("GPG detached signatures[*]", @url_dir_list, %size,
+ @sig_files);
+ }
+
+ if ($url_dir_list[0] =~ "gnu\.org")
+ {
+ print "Use a mirror for higher download bandwidth:\n";
+ if (@tarballs == 1 && $url_dir_list[0] =~ m!https://ftp\.gnu\.org/gnu/!)
+ {
+ (my $m = "$url_dir_list[0]/$tarballs[0]")
+ =~ s!https://ftp\.gnu\.org/gnu/!https://ftpmirror\.gnu\.org/!;
+ print " $m\n"
+ . " $m.sig\n\n";
+
+ }
+ else
+ {
+ print " https://www.gnu.org/order/ftp.html\n\n";
+ }
+ }
+
+ $print_checksums_p
+ and print_checksums (@sizable);
+
+ print <<EOF;
+[*] Use a .sig file to verify that the corresponding file (without the
+.sig suffix) is intact. First, be sure to download both the .sig file
+and the corresponding tarball. Then, run a command like this:
+
+ gpg --verify $tarballs[0].sig
+
+If that command fails because you don't have the required public key,
+then run this command to import it:
+
+ gpg --keyserver keys.gnupg.net --recv-keys $gpg_key_id
+
+and rerun the 'gpg --verify' command.
+EOF
+
+ my @tool_versions = get_tool_versions (\@tool_list, $gnulib_version);
+ @tool_versions
+ and print "\nThis release was bootstrapped with the following tools:",
+ join ('', map {"\n $_"} @tool_versions), "\n";
+
+ print_news_deltas ($_, $prev_version, $curr_version)
+ foreach @news_file;
+
+ $release_type eq 'stable'
+ or print_changelog_deltas ($package_name, $prev_version);
+
+ exit 0;
+}
+
+### Setup "GNU" style for perl-mode and cperl-mode.
+## Local Variables:
+## mode: perl
+## perl-indent-level: 2
+## perl-continued-statement-offset: 2
+## perl-continued-brace-offset: 0
+## perl-brace-offset: 0
+## perl-brace-imaginary-offset: 0
+## perl-label-offset: -2
+## perl-extra-newline-before-brace: t
+## perl-merge-trailing-else: nil
+## eval: (add-hook 'before-save-hook 'time-stamp)
+## time-stamp-line-limit: 50
+## time-stamp-start: "my $VERSION = '"
+## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+## time-stamp-time-zone: "UTC0"
+## time-stamp-end: "'; # UTC"
+## End:
diff --git a/build-aux/build_info.pl b/build-aux/build_info.pl
new file mode 100755
index 0000000..6c63b36
--- /dev/null
+++ b/build-aux/build_info.pl
@@ -0,0 +1,140 @@
+#!/usr/bin/env perl
+
+# Generate build_info.c.
+
+# Copyright (C) 2009-2011, 2018-2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Carp qw(croak);
+
+my $file = shift @ARGV;
+
+{
+ my $data = parse_config();
+ output_code($data);
+}
+
+sub parse_config
+{
+ my $features = [];
+ my $choice_key;
+ my $choice = [];
+ my $list = $features;
+
+ open(my $fh, '<', "$file.in") or die "Cannot open $file.in: $!";
+
+ while (<$fh>) {
+ next if /^\s*$/;
+
+ if ($list eq $choice) {
+ unless (s/^\s+//) {
+ $list = $features;
+ push @$features, [$choice_key, $choice];
+ $choice = [];
+ undef $choice_key;
+ }
+ } elsif (/^([A-Za-z0-9_-]+) \s+ choice:\s*$/x) {
+ $choice_key = $1;
+ $list = $choice;
+ next;
+ }
+
+ if (/^([A-Za-z0-9_-]+) \s+ (.*)$/x) {
+ push @$list, [$1, $2];
+ } else {
+ croak "Can't parse line: $_";
+ }
+ }
+
+ if ($list eq $choice) {
+ push @$features, [$choice_key, $choice];
+ }
+
+ close($fh);
+
+ return $features;
+}
+
+sub output_code
+{
+ my $features = shift;
+
+ open(my $fh, '>', "$file") or die "Cannot open $file: $!";
+
+ print $fh do { local $/; <DATA> }, "\n";
+ print $fh <<EOC;
+const char *compiled_features[] =
+{
+
+EOC
+ foreach my $feature (sort { $a->[0] cmp $b->[0] } @$features) {
+ my ($name, $check) = @$feature;
+
+ if (ref $check eq 'ARRAY') {
+ my ($ch_name, $ch_check) = @{ shift @$check };
+ print $fh <<EOC;
+#if $ch_check
+ "+$name/$ch_name",
+EOC
+ foreach my $choice (@$check) {
+ ($ch_name, $ch_check) = @$choice;
+
+ print $fh <<EOC;
+#elif $ch_check
+ "+$name/$ch_name",
+EOC
+ }
+ print $fh <<EOC;
+#else
+ "-$name",
+#endif
+
+EOC
+ } else {
+ print $fh <<EOC;
+#if $check
+ "+$name",
+#else
+ "-$name",
+#endif
+
+EOC
+ }
+ }
+ print $fh <<EOC;
+
+ /* sentinel value */
+ NULL
+};
+
+
+EOC
+}
+
+__DATA__
+/* Autogenerated by build_info.pl - DO NOT EDIT */
+
+/* This stores global variables that are initialized with
+ preprocessor declarations for output with the --version flag.
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+ 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. */
+
+#include "wget.h"
+#include <stdio.h>
+#include "version.h"
diff --git a/build-aux/compile b/build-aux/compile
new file mode 100755
index 0000000..23fcba0
--- /dev/null
+++ b/build-aux/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# 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>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN* | MSYS*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/* | msys/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/config.guess b/build-aux/config.guess
new file mode 100755
index 0000000..699b3a1
--- /dev/null
+++ b/build-aux/config.guess
@@ -0,0 +1,1698 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2020 Free Software Foundation, Inc.
+
+timestamp='2020-11-19'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <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 Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=$(echo "$0" | sed -e 's,.*/,,')
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2020 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039
+ { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD="$driver"
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
+UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
+UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
+UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ sysctl="sysctl -n hw.machine_arch"
+ UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
+ "/sbin/$sysctl" 2>/dev/null || \
+ "/usr/sbin/$sysctl" 2>/dev/null || \
+ echo unknown))
+ case "$UNAME_MACHINE_ARCH" in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ 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) and ABI.
+ case "$UNAME_MACHINE_ARCH" in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # 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
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case "$UNAME_VERSION" in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | 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}${abi-}"
+ exit ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
+ echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+ exit ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
+ echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+ exit ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
+ echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+ exit ;;
+ *:MidnightBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+ exit ;;
+ *:ekkoBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+ exit ;;
+ *:SolidBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+ exit ;;
+ *:OS108:*:*)
+ echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
+ exit ;;
+ macppc:MirBSD:*:*)
+ echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+ exit ;;
+ *:MirBSD:*:*)
+ echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+ exit ;;
+ *:Sortix:*:*)
+ echo "$UNAME_MACHINE"-unknown-sortix
+ exit ;;
+ *:Twizzler:*:*)
+ echo "$UNAME_MACHINE"-unknown-twizzler
+ exit ;;
+ *:Redox:*:*)
+ echo "$UNAME_MACHINE"-unknown-redox
+ exit ;;
+ mips:OSF1:*.*)
+ echo mips-dec-osf1
+ exit ;;
+ alpha:OSF1:*:*)
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
+ ;;
+ *5.*)
+ UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
+ case "$ALPHA_CPU_TYPE" in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-unknown-sysv4
+ exit ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo "$UNAME_MACHINE"-unknown-amigaos
+ exit ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ echo "$UNAME_MACHINE"-unknown-morphos
+ exit ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit ;;
+ *:z/VM:*:*)
+ echo s390-ibm-zvmoe
+ exit ;;
+ *:OS400:*:*)
+ echo powerpc-ibm-os400
+ exit ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix"$UNAME_RELEASE"
+ exit ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ echo arm-unknown-riscos
+ exit ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "$( (/bin/universe) 2>/dev/null)" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit ;;
+ DRS?6000:unix:4.0:6*)
+ echo sparc-icl-nx6
+ exit ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case $(/usr/bin/uname -p) in
+ sparc) echo sparc-icl-nx7; exit ;;
+ esac ;;
+ s390x:SunOS:*:*)
+ echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
+ exit ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+ exit ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
+ exit ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ echo i386-pc-auroraux"$UNAME_RELEASE"
+ exit ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+ exit ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+ exit ;;
+ sun4*:SunOS:*:*)
+ case "$(/usr/bin/arch -k)" in
+ Series*|S4*)
+ UNAME_RELEASE=$(uname -v)
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
+ exit ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos"$UNAME_RELEASE"
+ exit ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case "$(/bin/arch)" in
+ sun3)
+ echo m68k-sun-sunos"$UNAME_RELEASE"
+ ;;
+ sun4)
+ echo sparc-sun-sunos"$UNAME_RELEASE"
+ ;;
+ esac
+ exit ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos"$UNAME_RELEASE"
+ exit ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint"$UNAME_RELEASE"
+ exit ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint"$UNAME_RELEASE"
+ exit ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint"$UNAME_RELEASE"
+ exit ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint"$UNAME_RELEASE"
+ exit ;;
+ m68k:machten:*:*)
+ echo m68k-apple-machten"$UNAME_RELEASE"
+ exit ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten"$UNAME_RELEASE"
+ exit ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix"$UNAME_RELEASE"
+ exit ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix"$UNAME_RELEASE"
+ exit ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix"$UNAME_RELEASE"
+ exit ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
+ SYSTEM_NAME=$("$dummy" "$dummyarg") &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo mips-mips-riscos"$UNAME_RELEASE"
+ exit ;;
+ Motorola:PowerMAX_OS:*:*)
+ echo powerpc-motorola-powermax
+ exit ;;
+ Motorola:*:4.3:PL8-*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ echo powerpc-harris-powermax
+ exit ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=$(/usr/bin/uname -p)
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ echo m88k-dg-dgux"$UNAME_RELEASE"
+ else
+ echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+ fi
+ else
+ echo i586-dg-dgux"$UNAME_RELEASE"
+ fi
+ exit ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
+ exit ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
+ i*86:AIX:*:*)
+ echo i386-ibm-aix
+ exit ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=$(/usr/bin/oslevel)
+ else
+ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ fi
+ echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+ exit ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
+ then
+ echo "$SYSTEM_NAME"
+ else
+ echo rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
+ else
+ IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+ fi
+ echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+ exit ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ echo romp-ibm-bsd4.4
+ exit ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
+ exit ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
+ case "$UNAME_MACHINE" in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
+ sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
+ case "$sc_cpu_version" in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "$sc_kernel_bits" in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+ exit ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
+ echo ia64-hp-hpux"$HPUX_REV"
+ exit ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
+ { echo "$SYSTEM_NAME"; exit; }
+ echo unknown-hitachi-hiuxwe2
+ exit ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ echo hppa1.1-hp-bsd
+ exit ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ echo hppa1.1-hp-osf
+ exit ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ echo "$UNAME_MACHINE"-unknown-osf1mk
+ else
+ echo "$UNAME_MACHINE"-unknown-osf1
+ fi
+ exit ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*T3E:*:*:*)
+ echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*SV1:*:*:*)
+ echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ *:UNICOS/mp:*:*)
+ echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+ exit ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
+ FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+ FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
+ FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+ exit ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi"$UNAME_RELEASE"
+ exit ;;
+ *:BSD/OS:*:*)
+ echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+ exit ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=$(uname -p)
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
+ else
+ echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
+ fi
+ exit ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=$(/usr/bin/uname -p)
+ case "$UNAME_PROCESSOR" in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
+ exit ;;
+ i*:CYGWIN*:*)
+ echo "$UNAME_MACHINE"-pc-cygwin
+ exit ;;
+ *:MINGW64*:*)
+ echo "$UNAME_MACHINE"-pc-mingw64
+ exit ;;
+ *:MINGW*:*)
+ echo "$UNAME_MACHINE"-pc-mingw32
+ exit ;;
+ *:MSYS*:*)
+ echo "$UNAME_MACHINE"-pc-msys
+ exit ;;
+ i*:PW*:*)
+ echo "$UNAME_MACHINE"-pc-pw32
+ exit ;;
+ *:Interix*:*)
+ case "$UNAME_MACHINE" in
+ x86)
+ echo i586-pc-interix"$UNAME_RELEASE"
+ exit ;;
+ authenticamd | genuineintel | EM64T)
+ echo x86_64-unknown-interix"$UNAME_RELEASE"
+ exit ;;
+ IA64)
+ echo ia64-unknown-interix"$UNAME_RELEASE"
+ exit ;;
+ esac ;;
+ i*:UWIN*:*)
+ echo "$UNAME_MACHINE"-pc-uwin
+ exit ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ echo x86_64-pc-cygwin
+ exit ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
+ exit ;;
+ *:GNU:*:*)
+ # the GNU system
+ echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
+ exit ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
+ exit ;;
+ *:Minix:*:*)
+ echo "$UNAME_MACHINE"-unknown-minix
+ exit ;;
+ aarch64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ alpha:Linux:*:*)
+ case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ arc:Linux:*:* | arceb:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+ else
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+ fi
+ fi
+ exit ;;
+ avr32*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ cris:Linux:*:*)
+ echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+ exit ;;
+ crisv32:Linux:*:*)
+ echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+ exit ;;
+ e2k:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ frv:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ hexagon:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ i*86:Linux:*:*)
+ echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+ exit ;;
+ ia64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ k1om:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ m32r*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ m68*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-"$LIBC"
+ exit ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ padre:Linux:*:*)
+ echo sparc-unknown-linux-"$LIBC"
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-"$LIBC"
+ exit ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
+ PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+ PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+ *) echo hppa-unknown-linux-"$LIBC" ;;
+ esac
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-"$LIBC"
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-"$LIBC"
+ exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-"$LIBC"
+ exit ;;
+ ppcle:Linux:*:*)
+ echo powerpcle-unknown-linux-"$LIBC"
+ exit ;;
+ riscv32:Linux:*:* | riscv64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+ exit ;;
+ sh64*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ sh*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ tile*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ vax:Linux:*:*)
+ echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+ exit ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_X32 >/dev/null
+ then
+ LIBCABI="$LIBC"x32
+ fi
+ fi
+ echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
+ exit ;;
+ xtensa*:Linux:*:*)
+ echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+ exit ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ echo i386-sequent-sysv4
+ exit ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+ exit ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ echo "$UNAME_MACHINE"-pc-os2-emx
+ exit ;;
+ i*86:XTS-300:*:STOP)
+ echo "$UNAME_MACHINE"-unknown-stop
+ exit ;;
+ i*86:atheos:*:*)
+ echo "$UNAME_MACHINE"-unknown-atheos
+ exit ;;
+ i*86:syllable:*:*)
+ echo "$UNAME_MACHINE"-pc-syllable
+ exit ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ echo i386-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ i*86:*DOS:*:*)
+ echo "$UNAME_MACHINE"-pc-msdosdjgpp
+ exit ;;
+ i*86:*:4.*:*)
+ UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+ else
+ echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+ fi
+ exit ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case $(/bin/uname -X | grep "^Machine") in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+ exit ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
+ echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+ else
+ echo "$UNAME_MACHINE"-pc-sysv32
+ fi
+ exit ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ echo i586-pc-msdosdjgpp
+ exit ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
+ fi
+ exit ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ echo m68k-convergent-sysv
+ exit ;;
+ M680?0:D-NIX:5.3:*)
+ echo m68k-diab-dnix
+ exit ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ echo m68k-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ rs6000:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+ exit ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv"$UNAME_RELEASE"
+ exit ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=$( (uname -p) 2>/dev/null)
+ echo "$UNAME_MACHINE"-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo "$UNAME_MACHINE"-stratus-vos
+ exit ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ echo hppa1.1-stratus-vos
+ exit ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux"$UNAME_RELEASE"
+ exit ;;
+ news*:NEWS-OS:6*:*)
+ echo mips-sony-newsos6
+ exit ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ echo mips-nec-sysv"$UNAME_RELEASE"
+ else
+ echo mips-unknown-sysv"$UNAME_RELEASE"
+ fi
+ exit ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ echo i586-pc-haiku
+ exit ;;
+ x86_64:Haiku:*:*)
+ echo x86_64-unknown-haiku
+ exit ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-6:SUPER-UX:*:*)
+ echo sx6-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-7:SUPER-UX:*:*)
+ echo sx7-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-8:SUPER-UX:*:*)
+ echo sx8-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-8R:SUPER-UX:*:*)
+ echo sx8r-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ SX-ACE:SUPER-UX:*:*)
+ echo sxace-nec-superux"$UNAME_RELEASE"
+ exit ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+ exit ;;
+ *:Rhapsody:*:*)
+ echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+ exit ;;
+ arm64:Darwin:*:*)
+ echo aarch64-apple-darwin"$UNAME_RELEASE"
+ exit ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=$(uname -p)
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+ exit ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=$(uname -p)
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+ exit ;;
+ *:QNX:*:4*)
+ echo i386-pc-qnx
+ exit ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ echo nse-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ echo nsr-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ echo nsv-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ echo nsx-tandem-nsk"$UNAME_RELEASE"
+ exit ;;
+ *:NonStop-UX:*:*)
+ echo mips-compaq-nonstopux
+ exit ;;
+ BS2000:POSIX*:*:*)
+ echo bs2000-siemens-sysv
+ exit ;;
+ DS/*:UNIX_System_V:*:*)
+ echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+ exit ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ # shellcheck disable=SC2154
+ if test "$cputype" = 386; then
+ UNAME_MACHINE=i386
+ else
+ UNAME_MACHINE="$cputype"
+ fi
+ echo "$UNAME_MACHINE"-unknown-plan9
+ exit ;;
+ *:TOPS-10:*:*)
+ echo pdp10-unknown-tops10
+ exit ;;
+ *:TENEX:*:*)
+ echo pdp10-unknown-tenex
+ exit ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ echo pdp10-dec-tops20
+ exit ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ echo pdp10-xkl-tops20
+ exit ;;
+ *:TOPS-20:*:*)
+ echo pdp10-unknown-tops20
+ exit ;;
+ *:ITS:*:*)
+ echo pdp10-unknown-its
+ exit ;;
+ SEI:*:*:SEIUX)
+ echo mips-sei-seiux"$UNAME_RELEASE"
+ exit ;;
+ *:DragonFly:*:*)
+ echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
+ exit ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=$( (uname -p) 2>/dev/null)
+ case "$UNAME_MACHINE" in
+ A*) echo alpha-dec-vms ; exit ;;
+ I*) echo ia64-dec-vms ; exit ;;
+ V*) echo vax-dec-vms ; exit ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ echo i386-pc-xenix
+ exit ;;
+ i*86:skyos:*:*)
+ echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
+ exit ;;
+ i*86:rdos:*:*)
+ echo "$UNAME_MACHINE"-pc-rdos
+ exit ;;
+ i*86:AROS:*:*)
+ echo "$UNAME_MACHINE"-pc-aros
+ exit ;;
+ x86_64:VMkernel:*:*)
+ echo "$UNAME_MACHINE"-unknown-esx
+ exit ;;
+ amd64:Isilon\ OneFS:*:*)
+ echo x86_64-unknown-onefs
+ exit ;;
+ *:Unleashed:*:*)
+ echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+ exit ;;
+esac
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#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 (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
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#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; }
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+year=$(echo $timestamp | sed 's,-.*,,')
+# shellcheck disable=SC2003
+if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
+ cat >&2 <<EOF
+
+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
+
+uname -m = $( (uname -m) 2>/dev/null || echo unknown)
+uname -r = $( (uname -r) 2>/dev/null || echo unknown)
+uname -s = $( (uname -s) 2>/dev/null || echo unknown)
+uname -v = $( (uname -v) 2>/dev/null || echo unknown)
+
+/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
+/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
+
+hostinfo = $( (hostinfo) 2>/dev/null)
+/bin/universe = $( (/bin/universe) 2>/dev/null)
+/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
+/bin/arch = $( (/bin/arch) 2>/dev/null)
+/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
+/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
new file mode 100755
index 0000000..b625621
--- /dev/null
+++ b/build-aux/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+# Copyright 1996-2014 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+# than 256 bytes, otherwise the compiler driver will dump core. The only
+# known workaround is to choose shorter directory names for the build
+# directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | cygwin* | pw32* | os2* | cegcc*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ case $cc_basename in
+ ecc*)
+ wl='-Wl,'
+ ;;
+ icc* | ifort*)
+ wl='-Wl,'
+ ;;
+ lf95*)
+ wl='-Wl,'
+ ;;
+ nagfor*)
+ wl='-Wl,-Wl,,'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ xl* | bgxl* | bgf* | mpixl*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ F* | *Sun*Fortran*)
+ wl=
+ ;;
+ *Sun\ C*)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ newsos6)
+ ;;
+ *nto* | *qnx*)
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+ wl='-Qoption ld '
+ ;;
+ *)
+ wl='-Wl,'
+ ;;
+ esac
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ wl='-Wl,'
+ ;;
+ unicos*)
+ wl='-Wl,'
+ ;;
+ uts4*)
+ ;;
+ esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+ cygwin* | mingw* | pw32* | cegcc*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ # Unlike libtool, we use -rpath here, not --rpath, since the documented
+ # option of GNU ld is called -rpath, not --rpath.
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ case "$host_os" in
+ aix[3-9]*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ haiku*)
+ ;;
+ interix[3-9]*)
+ hardcode_direct=no
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ netbsd*)
+ ;;
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs=no
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = no; then
+ hardcode_libdir_flag_spec=
+ fi
+else
+ case "$host_os" in
+ aix3*)
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$GCC" = yes; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+ aix[4-9]*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ else
+ aix_use_runtimelinking=no
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+ fi
+ hardcode_direct=yes
+ hardcode_libdir_separator=':'
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ hardcode_direct=unsupported
+ hardcode_minus_L=yes
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_libdir_separator=
+ fi
+ ;;
+ esac
+ fi
+ # Begin _LT_AC_SYS_LIBPATH_AIX.
+ echo 'int main () { return 0; }' > conftest.c
+ ${CC} ${LDFLAGS} conftest.c -o conftest
+ aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+ fi
+ if test -z "$aix_libpath"; then
+ aix_libpath="/usr/lib:/lib"
+ fi
+ rm -f conftest.c conftest
+ # End _LT_AC_SYS_LIBPATH_AIX.
+ if test "$aix_use_runtimelinking" = yes; then
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ else
+ if test "$host_cpu" = ia64; then
+ hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ else
+ hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ fi
+ fi
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc)
+ ;;
+ m68k)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ hardcode_libdir_flag_spec=' '
+ libext=lib
+ ;;
+ darwin* | rhapsody*)
+ hardcode_direct=no
+ if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ dgux*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ freebsd2.[01]*)
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ freebsd* | dragonfly*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ hpux9*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ hpux10*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ fi
+ ;;
+ hpux11*)
+ if test "$with_gnu_ld" = no; then
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_direct=no
+ ;;
+ *)
+ hardcode_direct=yes
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ esac
+ fi
+ ;;
+ irix5* | irix6* | nonstopux*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ netbsd*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ ;;
+ newsos6)
+ hardcode_direct=yes
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ *nto* | *qnx*)
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ hardcode_direct=yes
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ else
+ case "$host_os" in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ *)
+ hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+ osf3*)
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+ osf4* | osf5*)
+ if test "$GCC" = yes; then
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ else
+ # Both cc and cxx compiler support -rpath directly
+ hardcode_libdir_flag_spec='-rpath $libdir'
+ fi
+ hardcode_libdir_separator=:
+ ;;
+ solaris*)
+ hardcode_libdir_flag_spec='-R$libdir'
+ ;;
+ sunos4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+ sysv4)
+ case $host_vendor in
+ sni)
+ hardcode_direct=yes # is this really true???
+ ;;
+ siemens)
+ hardcode_direct=no
+ ;;
+ motorola)
+ hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ ;;
+ sysv4.3*)
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ ld_shlibs=yes
+ fi
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator=':'
+ ;;
+ uts4*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec= # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ library_names_spec='$libname.a'
+ ;;
+ aix[4-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ amigaos*)
+ case "$host_cpu" in
+ powerpc*)
+ library_names_spec='$libname$shrext' ;;
+ m68k)
+ library_names_spec='$libname.a' ;;
+ esac
+ ;;
+ beos*)
+ library_names_spec='$libname$shrext'
+ ;;
+ bsdi[45]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ cygwin* | mingw* | pw32* | cegcc*)
+ shrext=.dll
+ library_names_spec='$libname.dll.a $libname.lib'
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ library_names_spec='$libname$shrext'
+ ;;
+ dgux*)
+ library_names_spec='$libname$shrext'
+ ;;
+ freebsd[23].*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ freebsd* | dragonfly*)
+ library_names_spec='$libname$shrext'
+ ;;
+ gnu*)
+ library_names_spec='$libname$shrext'
+ ;;
+ haiku*)
+ library_names_spec='$libname$shrext'
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $host_cpu in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ library_names_spec='$libname$shrext'
+ ;;
+ interix[3-9]*)
+ library_names_spec='$libname$shrext'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ library_names_spec='$libname$shrext'
+ case "$host_os" in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+ *) libsuff= shlibsuff= ;;
+ esac
+ ;;
+ esac
+ ;;
+ linux*oldld* | linux*aout* | linux*coff*)
+ ;;
+ linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ knetbsd*-gnu)
+ library_names_spec='$libname$shrext'
+ ;;
+ netbsd*)
+ library_names_spec='$libname$shrext'
+ ;;
+ newsos6)
+ library_names_spec='$libname$shrext'
+ ;;
+ *nto* | *qnx*)
+ library_names_spec='$libname$shrext'
+ ;;
+ openbsd*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ library_names_spec='$libname.a'
+ ;;
+ osf3* | osf4* | osf5*)
+ library_names_spec='$libname$shrext'
+ ;;
+ rdos*)
+ ;;
+ solaris*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sunos4*)
+ library_names_spec='$libname$shrext$versuffix'
+ ;;
+ sysv4 | sysv4.3*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv4*MP*)
+ library_names_spec='$libname$shrext'
+ ;;
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ library_names_spec='$libname$shrext'
+ ;;
+ tpf*)
+ library_names_spec='$libname$shrext'
+ ;;
+ uts4*)
+ library_names_spec='$libname$shrext'
+ ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/build-aux/config.sub b/build-aux/config.sub
new file mode 100755
index 0000000..19c9553
--- /dev/null
+++ b/build-aux/config.sub
@@ -0,0 +1,1854 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2020 Free Software Foundation, Inc.
+
+timestamp='2020-12-02'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <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 Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# 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.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=$(echo "$0" | sed -e 's,.*/,,')
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2020 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=$(echo "$1" | sed -e 's/86.*/86/')
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=$(echo "$basic_machine" | sed 's/-.*//')
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
+ ;;
+ arm64-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv64 \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
+ ;;
+ os2-emx)
+ kernel=os2
+ os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=$(echo $basic_os | sed -e 's|nto|qnx|')
+ ;;
+ linux*)
+ kernel=linux
+ os=$(echo $basic_os | sed -e 's|linux|gnu|')
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=$(echo $os | sed -e 's|solaris1|sunos4|')
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=$(echo "$os" | sed -e 's|mac|macos|')
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
+ ;;
+ sunos6*)
+ os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=$(echo $os | sed -e 's|sinix|sysv|')
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-abi", so those need to count as OSes.
+ musl* | newlib* | uclibc*)
+ ;;
+ # Likewise for "kernel-libc"
+ eabi | eabihf | gnueabi | gnueabihf)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/depcomp b/build-aux/depcomp
new file mode 100755
index 0000000..6b39162
--- /dev/null
+++ b/build-aux/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2020 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <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.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputting dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'. On the theory
+## that the space means something, we add a space to the output as
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts '$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for ':'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+ "$@" $dashmflag |
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/git-version-gen b/build-aux/git-version-gen
new file mode 100755
index 0000000..f4e8592
--- /dev/null
+++ b/build-aux/git-version-gen
@@ -0,0 +1,226 @@
+#!/bin/sh
+# Print a version string.
+scriptversion=2019-10-13.15; # UTC
+
+# Copyright (C) 2007-2020 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 script is derived from GIT-VERSION-GEN from GIT: https://git-scm.com/.
+# It may be run two ways:
+# - from a git repository in which the "git describe" command below
+# produces useful output (thus requiring at least one signed tag)
+# - from a non-git-repo directory containing a .tarball-version file, which
+# presumes this script is invoked like "./git-version-gen .tarball-version".
+
+# In order to use intra-version strings in your project, you will need two
+# separate generated version string files:
+#
+# .tarball-version - present only in a distribution tarball, and not in
+# a checked-out repository. Created with contents that were learned at
+# the last time autoconf was run, and used by git-version-gen. Must not
+# be present in either $(srcdir) or $(builddir) for git-version-gen to
+# give accurate answers during normal development with a checked out tree,
+# but must be present in a tarball when there is no version control system.
+# Therefore, it cannot be used in any dependencies. GNUmakefile has
+# hooks to force a reconfigure at distribution time to get the value
+# correct, without penalizing normal development with extra reconfigures.
+#
+# .version - present in a checked-out repository and in a distribution
+# tarball. Usable in dependencies, particularly for files that don't
+# want to depend on config.h but do want to track version changes.
+# Delete this file prior to any autoconf run where you want to rebuild
+# files to pick up a version string change; and leave it stale to
+# minimize rebuild time after unrelated changes to configure sources.
+#
+# As with any generated file in a VC'd directory, you should add
+# /.version to .gitignore, so that you don't accidentally commit it.
+# .tarball-version is never generated in a VC'd directory, so needn't
+# be listed there.
+#
+# Use the following line in your configure.ac, so that $(VERSION) will
+# automatically be up-to-date each time configure is run (and note that
+# since configure.ac no longer includes a version string, Makefile rules
+# should not depend on configure.ac for version updates).
+#
+# AC_INIT([GNU project],
+# m4_esyscmd([build-aux/git-version-gen .tarball-version]),
+# [bug-project@example])
+#
+# Then use the following lines in your Makefile.am, so that .version
+# will be present for dependencies, and so that .version and
+# .tarball-version will exist in distribution tarballs.
+#
+# EXTRA_DIST = $(top_srcdir)/.version
+# BUILT_SOURCES = $(top_srcdir)/.version
+# $(top_srcdir)/.version:
+# echo $(VERSION) > $@-t && mv $@-t $@
+# dist-hook:
+# echo $(VERSION) > $(distdir)/.tarball-version
+
+
+me=$0
+
+year=`expr "$scriptversion" : '\([^-]*\)'`
+version="git-version-gen $scriptversion
+
+Copyright $year Free Software Foundation, Inc.
+There is NO warranty. You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="\
+Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
+Print a version string.
+
+Options:
+
+ --prefix PREFIX prefix of git tags (default 'v')
+ --fallback VERSION
+ fallback version to use if \"git --version\" fails
+
+ --help display this help and exit
+ --version output version information and exit
+
+Running without arguments will suffice in most cases."
+
+prefix=v
+fallback=
+
+while test $# -gt 0; do
+ case $1 in
+ --help) echo "$usage"; exit 0;;
+ --version) echo "$version"; exit 0;;
+ --prefix) shift; prefix=${1?};;
+ --fallback) shift; fallback=${1?};;
+ -*)
+ echo "$0: Unknown option '$1'." >&2
+ echo "$0: Try '--help' for more information." >&2
+ exit 1;;
+ *)
+ if test "x$tarball_version_file" = x; then
+ tarball_version_file="$1"
+ elif test "x$tag_sed_script" = x; then
+ tag_sed_script="$1"
+ else
+ echo "$0: extra non-option argument '$1'." >&2
+ exit 1
+ fi;;
+ esac
+ shift
+done
+
+if test "x$tarball_version_file" = x; then
+ echo "$usage"
+ exit 1
+fi
+
+tag_sed_script="${tag_sed_script:-s/x/x/}"
+
+nl='
+'
+
+# Avoid meddling by environment variable of the same name.
+v=
+v_from_git=
+
+# First see if there is a tarball-only version file.
+# then try "git describe", then default.
+if test -f $tarball_version_file
+then
+ v=`cat $tarball_version_file` || v=
+ case $v in
+ *$nl*) v= ;; # reject multi-line output
+ esac
+ test "x$v" = x \
+ && echo "$0: WARNING: $tarball_version_file is damaged" 1>&2
+fi
+
+if test "x$v" != x
+then
+ : # use $v
+# Otherwise, if there is at least one git commit involving the working
+# directory, and "git describe" output looks sensible, use that to
+# derive a version string.
+elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
+ && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
+ || git describe --abbrev=4 HEAD 2>/dev/null` \
+ && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
+ && case $v in
+ $prefix[0-9]*) ;;
+ *) (exit 1) ;;
+ esac
+then
+ # Is this a new git that lists number of commits since the last
+ # tag or the previous older version that did not?
+ # Newer: v6.10-77-g0f8faeb
+ # Older: v6.10-g0f8faeb
+ vprefix=`expr "X$v" : 'X\(.*\)-g[^-]*$'` || vprefix=$v
+ case $vprefix in
+ *-*) : git describe is probably okay three part flavor ;;
+ *)
+ : git describe is older two part flavor
+ # Recreate the number of commits and rewrite such that the
+ # result is the same as if we were using the newer version
+ # of git describe.
+ vtag=`echo "$v" | sed 's/-.*//'`
+ commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
+ || { commit_list=failed;
+ echo "$0: WARNING: git rev-list failed" 1>&2; }
+ numcommits=`echo "$commit_list" | wc -l`
+ v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
+ test "$commit_list" = failed && v=UNKNOWN
+ ;;
+ esac
+
+ # Change the penultimate "-" to ".", for version-comparing tools.
+ # Remove the "g" to save a byte.
+ v=`echo "$v" | sed 's/-\([^-]*\)-g\([^-]*\)$/.\1-\2/'`;
+ v_from_git=1
+elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
+ v=UNKNOWN
+else
+ v=$fallback
+fi
+
+v=`echo "$v" |sed "s/^$prefix//"`
+
+# Test whether to append the "-dirty" suffix only if the version
+# string we're using came from git. I.e., skip the test if it's "UNKNOWN"
+# or if it came from .tarball-version.
+if test "x$v_from_git" != x; then
+ # Don't declare a version "dirty" merely because a timestamp has changed.
+ git update-index --refresh > /dev/null 2>&1
+
+ dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
+ case "$dirty" in
+ '') ;;
+ *) # Append the suffix only if there isn't one already.
+ case $v in
+ *-dirty) ;;
+ *) v="$v-dirty" ;;
+ esac ;;
+ esac
+fi
+
+# Omit the trailing newline, so that m4_esyscmd can use the result directly.
+printf %s "$v"
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
new file mode 100755
index 0000000..be8082e
--- /dev/null
+++ b/build-aux/gitlog-to-changelog
@@ -0,0 +1,515 @@
+#!/bin/sh
+#! -*-perl-*-
+
+# Convert git log output to ChangeLog format.
+
+# Copyright (C) 2008-2020 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/>.
+#
+# Written by Jim Meyering
+
+# This is a prologue that allows to run a perl script as an executable
+# on systems that are compliant to a POSIX version before POSIX:2017.
+# On such systems, the usual invocation of an executable through execlp()
+# or execvp() fails with ENOEXEC if it is a script that does not start
+# with a #! line. The script interpreter mentioned in the #! line has
+# to be /bin/sh, because on GuixSD systems that is the only program that
+# has a fixed file name. The second line is essential for perl and is
+# also useful for editing this file in Emacs. The next two lines below
+# are valid code in both sh and perl. When executed by sh, they re-execute
+# the script through the perl program found in $PATH. The '-x' option
+# is essential as well; without it, perl would re-execute the script
+# through /bin/sh. When executed by perl, the next two lines are a no-op.
+eval 'exec perl -wSx "$0" "$@"'
+ if 0;
+
+my $VERSION = '2020-04-04 15:07'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+use strict;
+use warnings;
+use Getopt::Long;
+use POSIX qw(strftime);
+
+(my $ME = $0) =~ s|.*/||;
+
+# use File::Coda; # https://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try '$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS] [ARGS]
+
+Convert git log output to ChangeLog format. If present, any ARGS
+are passed to "git log". To avoid ARGS being parsed as options to
+$ME, they may be preceded by '--'.
+
+OPTIONS:
+
+ --amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
+ makes a change to SHA1's commit log text or metadata.
+ --append-dot append a dot to the first line of each commit message if
+ there is no other punctuation or blank at the end.
+ --no-cluster never cluster commit messages under the same date/author
+ header; the default is to cluster adjacent commit messages
+ if their headers are the same and neither commit message
+ contains multiple paragraphs.
+ --srcdir=DIR the root of the source tree, from which the .git/
+ directory can be derived.
+ --since=DATE convert only the logs since DATE;
+ the default is to convert all log entries.
+ --until=DATE convert only the logs older than DATE.
+ --ignore-matching=PAT ignore commit messages whose first lines match PAT.
+ --ignore-line=PAT ignore lines of commit messages that match PAT.
+ --format=FMT set format string for commit subject and body;
+ see 'man git-log' for the list of format metacharacters;
+ the default is '%s%n%b%n'
+ --strip-tab remove one additional leading TAB from commit message lines.
+ --strip-cherry-pick remove data inserted by "git cherry-pick";
+ this includes the "cherry picked from commit ..." line,
+ and the possible final "Conflicts:" paragraph.
+ --help display this help and exit
+ --version output version information and exit
+
+EXAMPLE:
+
+ $ME --since=2008-01-01 > ChangeLog
+ $ME -- -n 5 foo > last-5-commits-to-branch-foo
+
+SPECIAL SYNTAX:
+
+The following types of strings are interpreted specially when they appear
+at the beginning of a log message line. They are not copied to the output.
+
+ Copyright-paperwork-exempt: Yes
+ Append the "(tiny change)" notation to the usual "date name email"
+ ChangeLog header to mark a change that does not require a copyright
+ assignment.
+ Co-authored-by: Joe User <user\@example.com>
+ List the specified name and email address on a second
+ ChangeLog header, denoting a co-author.
+ Signed-off-by: Joe User <user\@example.com>
+ These lines are simply elided.
+
+In a FILE specified via --amend, comment lines (starting with "#") are ignored.
+FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
+a line) referring to a commit in the current project, and CODE refers to one
+or more consecutive lines of Perl code. Pairs must be separated by one or
+more blank line.
+
+Here is sample input for use with --amend=FILE, from coreutils:
+
+3a169f4c5d9159283548178668d2fae6fced3030
+# fix typo in title:
+s/all tile types/all file types/
+
+1379ed974f1fa39b12e2ffab18b3f7a607082202
+# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
+# Change the author to be Paul. Note the escaped "@":
+s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
+
+EOF
+ }
+ exit $exit_code;
+}
+
+# If the string $S is a well-behaved file name, simply return it.
+# If it contains white space, quotes, etc., quote it, and return the new string.
+sub shell_quote($)
+{
+ my ($s) = @_;
+ if ($s =~ m![^\w+/.,-]!)
+ {
+ # Convert each single quote to '\''
+ $s =~ s/\'/\'\\\'\'/g;
+ # Then single quote the string.
+ $s = "'$s'";
+ }
+ return $s;
+}
+
+sub quoted_cmd(@)
+{
+ return join (' ', map {shell_quote $_} @_);
+}
+
+# Parse file F.
+# Comment lines (starting with "#") are ignored.
+# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
+# (alone on a line) referring to a commit in the current project, and
+# CODE refers to one or more consecutive lines of Perl code.
+# Pairs must be separated by one or more blank line.
+sub parse_amend_file($)
+{
+ my ($f) = @_;
+
+ open F, '<', $f
+ or die "$ME: $f: failed to open for reading: $!\n";
+
+ my $fail;
+ my $h = {};
+ my $in_code = 0;
+ my $sha;
+ while (defined (my $line = <F>))
+ {
+ $line =~ /^\#/
+ and next;
+ chomp $line;
+ $line eq ''
+ and $in_code = 0, next;
+
+ if (!$in_code)
+ {
+ $line =~ /^([[:xdigit:]]{40})$/
+ or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
+ $fail = 1, next;
+ $sha = lc $1;
+ $in_code = 1;
+ exists $h->{$sha}
+ and (warn "$ME: $f:$.: duplicate SHA1\n"),
+ $fail = 1, next;
+ }
+ else
+ {
+ $h->{$sha} ||= '';
+ $h->{$sha} .= "$line\n";
+ }
+ }
+ close F;
+
+ $fail
+ and exit 1;
+
+ return $h;
+}
+
+# git_dir_option $SRCDIR
+#
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
+# is undef). Return as a list (0 or 1 element).
+sub git_dir_option($)
+{
+ my ($srcdir) = @_;
+ my @res = ();
+ if (defined $srcdir)
+ {
+ my $qdir = shell_quote $srcdir;
+ my $cmd = "cd $qdir && git rev-parse --show-toplevel";
+ my $qcmd = shell_quote $cmd;
+ my $git_dir = qx($cmd);
+ defined $git_dir
+ or die "$ME: cannot run $qcmd: $!\n";
+ $? == 0
+ or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
+ chomp $git_dir;
+ push @res, "--git-dir=$git_dir/.git";
+ }
+ @res;
+}
+
+{
+ my $since_date;
+ my $until_date;
+ my $format_string = '%s%n%b%n';
+ my $amend_file;
+ my $append_dot = 0;
+ my $cluster = 1;
+ my $ignore_matching;
+ my $ignore_line;
+ my $strip_tab = 0;
+ my $strip_cherry_pick = 0;
+ my $srcdir;
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'until=s' => \$until_date,
+ 'format=s' => \$format_string,
+ 'amend=s' => \$amend_file,
+ 'append-dot' => \$append_dot,
+ 'cluster!' => \$cluster,
+ 'ignore-matching=s' => \$ignore_matching,
+ 'ignore-line=s' => \$ignore_line,
+ 'strip-tab' => \$strip_tab,
+ 'strip-cherry-pick' => \$strip_cherry_pick,
+ 'srcdir=s' => \$srcdir,
+ ) or usage 1;
+
+ defined $since_date
+ and unshift @ARGV, "--since=$since_date";
+ defined $until_date
+ and unshift @ARGV, "--until=$until_date";
+
+ # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
+ # that makes a correction in the log or attribution of that commit.
+ my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
+
+ my @cmd = ('git',
+ git_dir_option $srcdir,
+ qw(log --log-size),
+ '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV);
+ open PIPE, '-|', @cmd
+ or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
+ . "(Is your Git too old? Version 1.5.1 or later is required.)\n");
+
+ my $prev_multi_paragraph;
+ my $prev_date_line = '';
+ my @prev_coauthors = ();
+ my @skipshas = ();
+ while (1)
+ {
+ defined (my $in = <PIPE>)
+ or last;
+ $in =~ /^log size (\d+)$/
+ or die "$ME:$.: Invalid line (expected log size):\n$in";
+ my $log_nbytes = $1;
+
+ my $log;
+ my $n_read = read PIPE, $log, $log_nbytes;
+ $n_read == $log_nbytes
+ or die "$ME:$.: unexpected EOF\n";
+
+ # Extract leading hash.
+ my ($sha, $rest) = split ':', $log, 2;
+ defined $sha
+ or die "$ME:$.: malformed log entry\n";
+ $sha =~ /^[[:xdigit:]]{40}$/
+ or die "$ME:$.: invalid SHA1: $sha\n";
+
+ my $skipflag = 0;
+ if (@skipshas)
+ {
+ foreach(@skipshas)
+ {
+ if ($sha =~ /^$_/)
+ {
+ $skipflag = $_;
+ last;
+ }
+ }
+ }
+
+ # If this commit's log requires any transformation, do it now.
+ my $code = $amend_code->{$sha};
+ if (defined $code)
+ {
+ eval 'use Safe';
+ my $s = new Safe;
+ # Put the unpreprocessed entry into "$_".
+ $_ = $rest;
+
+ # Let $code operate on it, safely.
+ my $r = $s->reval("$code")
+ or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
+
+ # Note that we've used this entry.
+ delete $amend_code->{$sha};
+
+ # Update $rest upon success.
+ $rest = $_;
+ }
+
+ # Remove lines inserted by "git cherry-pick".
+ if ($strip_cherry_pick)
+ {
+ $rest =~ s/^\s*Conflicts:\n.*//sm;
+ $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
+ }
+
+ my @line = split /[ \t]*\n/, $rest;
+ my $author_line = shift @line;
+ defined $author_line
+ or die "$ME:$.: unexpected EOF\n";
+ $author_line =~ /^(\d+) (.*>)$/
+ or die "$ME:$.: Invalid line "
+ . "(expected date/author/email):\n$author_line\n";
+
+ # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
+ # `(tiny change)' annotation.
+ my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line)
+ ? ' (tiny change)' : '');
+
+ my $date_line = sprintf "%s %s$tiny\n",
+ strftime ("%Y-%m-%d", localtime ($1)), $2;
+
+ my @coauthors = grep /^Co-authored-by:.*$/, @line;
+ # Omit meta-data lines we've already interpreted.
+ @line = grep !/^(?:Signed-off-by:[ ].*>$
+ |Co-authored-by:[ ]
+ |Copyright-paperwork-exempt:[ ]
+ |Tiny-change:[ ]
+ )/x, @line;
+
+ # Remove leading and trailing blank lines.
+ if (@line)
+ {
+ while ($line[0] =~ /^\s*$/) { shift @line; }
+ while ($line[$#line] =~ /^\s*$/) { pop @line; }
+ }
+
+ # Handle Emacs gitmerge.el "skipped" commits.
+ # Yes, this should be controlled by an option. So sue me.
+ if ( grep /^(; )?Merge from /, @line )
+ {
+ my $found = 0;
+ foreach (@line)
+ {
+ if (grep /^The following commit.*skipped:$/, $_)
+ {
+ $found = 1;
+ ## Reset at each merge to reduce chance of false matches.
+ @skipshas = ();
+ next;
+ }
+ if ($found && $_ =~ /^([[:xdigit:]]{7,}) [^ ]/)
+ {
+ push ( @skipshas, $1 );
+ }
+ }
+ }
+
+ # Ignore commits that match the --ignore-matching pattern, if specified.
+ if (defined $ignore_matching && @line && $line[0] =~ /$ignore_matching/)
+ {
+ $skipflag = 1;
+ }
+ elsif ($skipflag)
+ {
+ ## Perhaps only warn if a pattern matches more than once?
+ warn "$ME: warning: skipping $sha due to $skipflag\n";
+ }
+
+ if (! $skipflag)
+ {
+ if (defined $ignore_line && @line)
+ {
+ @line = grep ! /$ignore_line/, @line;
+ while ($line[$#line] =~ /^\s*$/) { pop @line; }
+ }
+
+ # Record whether there are two or more paragraphs.
+ my $multi_paragraph = grep /^\s*$/, @line;
+
+ # Format 'Co-authored-by: A U Thor <email@example.com>' lines in
+ # standard multi-author ChangeLog format.
+ for (@coauthors)
+ {
+ s/^Co-authored-by:\s*/\t /;
+ s/\s*</ </;
+
+ /<.*?@.*\..*>/
+ or warn "$ME: warning: missing email address for "
+ . substr ($_, 5) . "\n";
+ }
+
+ # If clustering of commit messages has been disabled, if this header
+ # would be different from the previous date/name/etc. header,
+ # or if this or the previous entry consists of two or more paragraphs,
+ # then print the header.
+ if ( ! $cluster
+ || $date_line ne $prev_date_line
+ || "@coauthors" ne "@prev_coauthors"
+ || $multi_paragraph
+ || $prev_multi_paragraph)
+ {
+ $prev_date_line eq ''
+ or print "\n";
+ print $date_line;
+ @coauthors
+ and print join ("\n", @coauthors), "\n";
+ }
+ $prev_date_line = $date_line;
+ @prev_coauthors = @coauthors;
+ $prev_multi_paragraph = $multi_paragraph;
+
+ # If there were any lines
+ if (@line == 0)
+ {
+ warn "$ME: warning: empty commit message:\n $date_line\n";
+ }
+ else
+ {
+ if ($append_dot)
+ {
+ # If the first line of the message has enough room, then
+ if (length $line[0] < 72)
+ {
+ # append a dot if there is no other punctuation or blank
+ # at the end.
+ $line[0] =~ /[[:punct:]\s]$/
+ or $line[0] .= '.';
+ }
+ }
+
+ # Remove one additional leading TAB from each line.
+ $strip_tab
+ and map { s/^\t// } @line;
+
+ # Prefix each non-empty line with a TAB.
+ @line = map { length $_ ? "\t$_" : '' } @line;
+
+ print "\n", join ("\n", @line), "\n";
+ }
+ }
+
+ defined ($in = <PIPE>)
+ or last;
+ $in ne "\n"
+ and die "$ME:$.: unexpected line:\n$in";
+ }
+
+ close PIPE
+ or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
+ # FIXME-someday: include $PROCESS_STATUS in the diagnostic
+
+ # Complain about any unused entry in the --amend=F specified file.
+ my $fail = 0;
+ foreach my $sha (keys %$amend_code)
+ {
+ warn "$ME:$amend_file: unused entry: $sha\n";
+ $fail = 1;
+ }
+
+ exit $fail;
+}
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-line-limit: 50
+# time-stamp-start: "my $VERSION = '"
+# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "'; # UTC"
+# End:
diff --git a/build-aux/gnupload b/build-aux/gnupload
new file mode 100755
index 0000000..e4ea542
--- /dev/null
+++ b/build-aux/gnupload
@@ -0,0 +1,473 @@
+#!/bin/sh
+# Sign files and upload them.
+
+scriptversion=2018-05-19.18; # UTC
+
+# Copyright (C) 2004-2020 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, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that 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/>.
+
+# Originally written by Alexandre Duret-Lutz <adl@gnu.org>.
+# The master copy of this file is maintained in the gnulib Git repository.
+# Please send bug reports and feature requests to bug-gnulib@gnu.org.
+
+set -e
+
+GPG=gpg
+# Choose the proper version of gpg, so as to avoid a
+# "gpg-agent is not available in this session" error
+# when gpg-agent is version 3 but gpg is still version 1.
+# FIXME-2020: remove, once all major distros ship gpg version 3 as /usr/bin/gpg
+gpg_agent_version=`(gpg-agent --version) 2>/dev/null | sed -e '2,$d' -e 's/^[^0-9]*//'`
+case "$gpg_agent_version" in
+ 2.*)
+ gpg_version=`(gpg --version) 2>/dev/null | sed -e '2,$d' -e 's/^[^0-9]*//'`
+ case "$gpg_version" in
+ 1.*)
+ if (type gpg2) >/dev/null 2>/dev/null; then
+ # gpg2 is present.
+ GPG=gpg2
+ else
+ # gpg2 is missing. Ubuntu users should install the package 'gnupg2'.
+ echo "WARNING: Using 'gpg', which is too old. You should install 'gpg2'." 1>&2
+ fi
+ ;;
+ esac
+ ;;
+esac
+
+GPG="${GPG} --batch --no-tty"
+conffile=.gnuploadrc
+to=
+dry_run=false
+replace=
+symlink_files=
+delete_files=
+delete_symlinks=
+collect_var=
+dbg=
+nl='
+'
+
+usage="Usage: $0 [OPTION]... [CMD] FILE... [[CMD] FILE...]
+
+Sign all FILES, and process them at the destinations specified with --to.
+If CMD is not given, it defaults to uploading. See examples below.
+
+Commands:
+ --delete delete FILES from destination
+ --symlink create symbolic links
+ --rmsymlink remove symbolic links
+ -- treat the remaining arguments as files to upload
+
+Options:
+ --to DEST specify a destination DEST for FILES
+ (multiple --to options are allowed)
+ --user NAME sign with key NAME
+ --replace allow replacements of existing files
+ --symlink-regex[=EXPR] use sed script EXPR to compute symbolic link names
+ -n, --dry-run do nothing, show what would have been done
+ (including the constructed directive file)
+ --version output version information and exit
+ -h, --help print this help text and exit
+
+If --symlink-regex is given without EXPR, then the link target name
+is created by replacing the version information with '-latest', e.g.:
+ foo-1.3.4.tar.gz -> foo-latest.tar.gz
+
+Recognized destinations are:
+ alpha.gnu.org:DIRECTORY
+ savannah.gnu.org:DIRECTORY
+ savannah.nongnu.org:DIRECTORY
+ ftp.gnu.org:DIRECTORY
+ build directive files and upload files by FTP
+ download.gnu.org.ua:{alpha|ftp}/DIRECTORY
+ build directive files and upload files by SFTP
+ [user@]host:DIRECTORY upload files with scp
+
+Options and commands are applied in order. If the file $conffile exists
+in the current working directory, its contents are prepended to the
+actual command line options. Use this to keep your defaults. Comments
+(#) and empty lines in $conffile are allowed.
+
+<https://www.gnu.org/prep/maintain/html_node/Automated-FTP-Uploads.html>
+gives some further background.
+
+Examples:
+1. Upload foobar-1.0.tar.gz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz
+
+2. Upload foobar-1.0.tar.gz and foobar-1.0.tar.xz to ftp.gnu.org:
+ gnupload --to ftp.gnu.org:foobar foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+3. Same as above, and also create symbolic links to foobar-latest.tar.*:
+ gnupload --to ftp.gnu.org:foobar \\
+ --symlink-regex \\
+ foobar-1.0.tar.gz foobar-1.0.tar.xz
+
+4. Create a symbolic link foobar-latest.tar.gz -> foobar-1.0.tar.gz
+ and likewise for the corresponding .sig file:
+ gnupload --to ftp.gnu.org:foobar \\
+ --symlink foobar-1.0.tar.gz foobar-latest.tar.gz \\
+ foobar-1.0.tar.gz.sig foobar-latest.tar.gz.sig
+ or (equivalent):
+ gnupload --to ftp.gnu.org:foobar \\
+ --symlink foobar-1.0.tar.gz foobar-latest.tar.gz \\
+ --symlink foobar-1.0.tar.gz.sig foobar-latest.tar.gz.sig
+
+5. Upload foobar-0.9.90.tar.gz to two sites:
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ foobar-0.9.90.tar.gz
+
+6. Delete oopsbar-0.9.91.tar.gz and upload foobar-0.9.91.tar.gz
+ (the -- terminates the list of files to delete):
+ gnupload --to alpha.gnu.org:foobar \\
+ --to sources.redhat.com:~ftp/pub/foobar \\
+ --delete oopsbar-0.9.91.tar.gz \\
+ -- foobar-0.9.91.tar.gz
+
+gnupload executes a program ncftpput to do the transfers; if you don't
+happen to have an ncftp package installed, the ncftpput-ftp script in
+the build-aux/ directory of the gnulib package
+(https://savannah.gnu.org/projects/gnulib) may serve as a replacement.
+
+Send patches and bug reports to <bug-gnulib@gnu.org>."
+
+# Read local configuration file
+if test -r "$conffile"; then
+ echo "$0: Reading configuration file $conffile"
+ conf=`sed 's/#.*$//;/^$/d' "$conffile" | tr "\015$nl" ' '`
+ eval set x "$conf \"\$@\""
+ shift
+fi
+
+while test -n "$1"; do
+ case $1 in
+ -*)
+ collect_var=
+ case $1 in
+ -h | --help)
+ echo "$usage"
+ exit $?
+ ;;
+ --to)
+ if test -z "$2"; then
+ echo "$0: Missing argument for --to" 1>&2
+ exit 1
+ elif echo "$2" | grep 'ftp-upload\.gnu\.org' >/dev/null; then
+ echo "$0: Use ftp.gnu.org:PKGNAME or alpha.gnu.org:PKGNAME" >&2
+ echo "$0: for the destination, not ftp-upload.gnu.org (which" >&2
+ echo "$0: is used for direct ftp uploads, not with gnupload)." >&2
+ echo "$0: See --help and its examples if need be." >&2
+ exit 1
+ else
+ to="$to $2"
+ shift
+ fi
+ ;;
+ --user)
+ if test -z "$2"; then
+ echo "$0: Missing argument for --user" 1>&2
+ exit 1
+ else
+ GPG="$GPG --local-user $2"
+ shift
+ fi
+ ;;
+ --delete)
+ collect_var=delete_files
+ ;;
+ --replace)
+ replace="replace: true"
+ ;;
+ --rmsymlink)
+ collect_var=delete_symlinks
+ ;;
+ --symlink-regex=*)
+ symlink_expr=`expr "$1" : '[^=]*=\(.*\)'`
+ ;;
+ --symlink-regex)
+ symlink_expr='s|-[0-9][0-9\.]*\(-[0-9][0-9]*\)\{0,1\}\.|-latest.|'
+ ;;
+ --symlink)
+ collect_var=symlink_files
+ ;;
+ -n | --dry-run)
+ dry_run=:
+ ;;
+ --version)
+ echo "gnupload $scriptversion"
+ exit $?
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ echo "$0: Unknown option '$1', try '$0 --help'" 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *)
+ if test -z "$collect_var"; then
+ break
+ else
+ eval "$collect_var=\"\$$collect_var $1\""
+ fi
+ ;;
+ esac
+ shift
+done
+
+dprint()
+{
+ echo "Running $* ..."
+}
+
+if $dry_run; then
+ dbg=dprint
+fi
+
+if test -z "$to"; then
+ echo "$0: Missing destination sites" >&2
+ exit 1
+fi
+
+if test -n "$symlink_files"; then
+ x=`echo "$symlink_files" | sed 's/[^ ]//g;s/ //g'`
+ if test -n "$x"; then
+ echo "$0: Odd number of symlink arguments" >&2
+ exit 1
+ fi
+fi
+
+if test $# = 0; then
+ if test -z "${symlink_files}${delete_files}${delete_symlinks}"; then
+ echo "$0: No file to upload" 1>&2
+ exit 1
+ fi
+else
+ # Make sure all files exist. We don't want to ask
+ # for the passphrase if the script will fail.
+ for file
+ do
+ if test ! -f $file; then
+ echo "$0: Cannot find '$file'" 1>&2
+ exit 1
+ elif test -n "$symlink_expr"; then
+ linkname=`echo $file | sed "$symlink_expr"`
+ if test -z "$linkname"; then
+ echo "$0: symlink expression produces empty results" >&2
+ exit 1
+ elif test "$linkname" = $file; then
+ echo "$0: symlink expression does not alter file name" >&2
+ exit 1
+ fi
+ fi
+ done
+fi
+
+# Make sure passphrase is not exported in the environment.
+unset passphrase
+unset passphrase_fd_0
+GNUPGHOME=${GNUPGHOME:-$HOME/.gnupg}
+
+# Reset PATH to be sure that echo is a built-in. We will later use
+# 'echo $passphrase' to output the passphrase, so it is important that
+# it is a built-in (third-party programs tend to appear in 'ps'
+# listings with their arguments...).
+# Remember this script runs with 'set -e', so if echo is not built-in
+# it will exit now.
+if $dry_run || grep -q "^use-agent" $GNUPGHOME/gpg.conf; then :; else
+ PATH=/empty echo -n "Enter GPG passphrase: "
+ stty -echo
+ read -r passphrase
+ stty echo
+ echo
+ passphrase_fd_0="--passphrase-fd 0"
+fi
+
+if test $# -ne 0; then
+ for file
+ do
+ echo "Signing $file ..."
+ rm -f $file.sig
+ echo "$passphrase" | $dbg $GPG $passphrase_fd_0 -ba -o $file.sig $file
+ done
+fi
+
+
+# mkdirective DESTDIR BASE FILE STMT
+# Arguments: See upload, below
+mkdirective ()
+{
+ stmt="$4"
+ if test -n "$3"; then
+ stmt="
+filename: $3$stmt"
+ fi
+
+ cat >${2}.directive<<EOF
+version: 1.2
+directory: $1
+comment: gnupload v. $scriptversion$stmt
+EOF
+ if $dry_run; then
+ echo "File ${2}.directive:"
+ cat ${2}.directive
+ echo "File ${2}.directive:" | sed 's/./-/g'
+ fi
+}
+
+mksymlink ()
+{
+ while test $# -ne 0
+ do
+ echo "symlink: $1 $2"
+ shift
+ shift
+ done
+}
+
+# upload DEST DESTDIR BASE FILE STMT FILES
+# Arguments:
+# DEST Destination site;
+# DESTDIR Destination directory;
+# BASE Base name for the directive file;
+# FILE Name of the file to distribute (may be empty);
+# STMT Additional statements for the directive file;
+# FILES List of files to upload.
+upload ()
+{
+ dest=$1
+ destdir=$2
+ base=$3
+ file=$4
+ stmt=$5
+ files=$6
+
+ rm -f $base.directive $base.directive.asc
+ case $dest in
+ alpha.gnu.org:*)
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
+ $dbg ncftpput ftp-upload.gnu.org /incoming/alpha $files $base.directive.asc
+ ;;
+ ftp.gnu.org:*)
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
+ $dbg ncftpput ftp-upload.gnu.org /incoming/ftp $files $base.directive.asc
+ ;;
+ savannah.gnu.org:*)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg ncftpput savannah.gnu.org /incoming/savannah/$destdir $files
+ ;;
+ savannah.nongnu.org:*)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg ncftpput savannah.nongnu.org /incoming/savannah/$destdir $files
+ ;;
+ download.gnu.org.ua:alpha/*|download.gnu.org.ua:ftp/*)
+ destdir_p1=`echo "$destdir" | sed 's,^[^/]*/,,'`
+ destdir_topdir=`echo "$destdir" | sed 's,/.*,,'`
+ mkdirective "$destdir_p1" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
+ for f in $files $base.directive.asc
+ do
+ echo put $f
+ done | $dbg sftp -b - puszcza.gnu.org.ua:/incoming/$destdir_topdir
+ ;;
+ /*)
+ dest_host=`echo "$dest" | sed 's,:.*,,'`
+ mkdirective "$destdir" "$base" "$file" "$stmt"
+ echo "$passphrase" | $dbg $GPG $passphrase_fd_0 --clearsign $base.directive
+ $dbg cp $files $base.directive.asc $dest_host
+ ;;
+ *)
+ if test -z "$files"; then
+ echo "$0: warning: standalone directives not applicable for $dest" >&2
+ fi
+ $dbg scp $files $dest
+ ;;
+ esac
+ rm -f $base.directive $base.directive.asc
+}
+
+#####
+# Process any standalone directives
+stmt=
+if test -n "$symlink_files"; then
+ stmt="$stmt
+`mksymlink $symlink_files`"
+fi
+
+for file in $delete_files
+do
+ stmt="$stmt
+archive: $file"
+done
+
+for file in $delete_symlinks
+do
+ stmt="$stmt
+rmsymlink: $file"
+done
+
+if test -n "$stmt"; then
+ for dest in $to
+ do
+ destdir=`echo $dest | sed 's/[^:]*://'`
+ upload "$dest" "$destdir" "`hostname`-$$" "" "$stmt"
+ done
+fi
+
+# Process actual uploads
+for dest in $to
+do
+ for file
+ do
+ echo "Uploading $file to $dest ..."
+ stmt=
+ #
+ # allowing file replacement is all or nothing.
+ if test -n "$replace"; then stmt="$stmt
+$replace"
+ fi
+ #
+ files="$file $file.sig"
+ destdir=`echo $dest | sed 's/[^:]*://'`
+ if test -n "$symlink_expr"; then
+ linkname=`echo $file | sed "$symlink_expr"`
+ stmt="$stmt
+symlink: $file $linkname
+symlink: $file.sig $linkname.sig"
+ fi
+ upload "$dest" "$destdir" "$file" "$file" "$stmt" "$files"
+ done
+done
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
new file mode 100755
index 0000000..ec298b5
--- /dev/null
+++ b/build-aux/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
new file mode 100755
index 0000000..6a6a4bc
--- /dev/null
+++ b/build-aux/mdate-sh
@@ -0,0 +1,228 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1995-2020 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
+
+# Use UTC to get reproducible result.
+TZ=UTC0
+export TZ
+
+# 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 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
new file mode 100755
index 0000000..8d0eaad
--- /dev/null
+++ b/build-aux/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2020 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
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that 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.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+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 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/test-driver b/build-aux/test-driver
new file mode 100755
index 0000000..89dba1e
--- /dev/null
+++ b/build-aux/test-driver
@@ -0,0 +1,148 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2011-2020 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <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>.
+
+# Make unconditional expansion of undefined variables an error. This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+ echo "$0: $*" >&2
+ print_usage >&2
+ exit 2
+}
+
+print_usage ()
+{
+ cat <<END
+Usage:
+ test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+ [--expect-failure={yes|no}] [--color-tests={yes|no}]
+ [--enable-hard-errors={yes|no}] [--]
+ TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file= # Where to save the output of the test script.
+trs_file= # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+ case $1 in
+ --help) print_usage; exit $?;;
+ --version) echo "test-driver $scriptversion"; exit $?;;
+ --test-name) test_name=$2; shift;;
+ --log-file) log_file=$2; shift;;
+ --trs-file) trs_file=$2; shift;;
+ --color-tests) color_tests=$2; shift;;
+ --expect-failure) expect_failure=$2; shift;;
+ --enable-hard-errors) enable_hard_errors=$2; shift;;
+ --) shift; break;;
+ -*) usage_error "invalid option: '$1'";;
+ *) break;;
+ esac
+ shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file" = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+ usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+ usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+ # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+ red='' # Red.
+ grn='' # Green.
+ lgn='' # Light green.
+ blu='' # Blue.
+ mgn='' # Magenta.
+ std='' # No color.
+else
+ red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+ tweaked_estatus=1
+else
+ tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+ 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+ 0:*) col=$grn res=PASS recheck=no gcopy=no;;
+ 77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
+ 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
+ *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
+ *:*) col=$red res=FAIL recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
new file mode 100644
index 0000000..deca599
--- /dev/null
+++ b/build-aux/texinfo.tex
@@ -0,0 +1,11614 @@
+% 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{2020-02-11.09}
+%
+% Copyright 1985, 1986, 1988, 1990-2019 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 of the
+% License, 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 program. 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 Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+% https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+% https://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% 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}
+
+% LaTeX's \typeout. This ensures that the messages it is used for
+% are identical in format to the corresponding ones from latex/pdflatex.
+\def\typeout{\immediate\write17}%
+
+\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\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexsp=\sp
+\let\ptexstar=\*
+\let\ptexsup=\sup
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% 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\putworderror\undefined \gdef\putworderror{error}\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
+
+% Give the space character the catcode for a space.
+\def\spaceisspace{\catcode`\ =10\relax}
+
+% Likewise for ^^M, the end of line character.
+\def\endlineisspace{\catcode13=10\relax}
+
+\chardef\dashChar = `\-
+\chardef\slashChar = `\/
+\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
+}
+
+% 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\thisisundefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% @errormsg{MSG}. Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+%
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% 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}
+
+% Output routine
+%
+
+% 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 }
+
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.
+
+% \domark is called twice inside \chapmacro, to add one
+% mark before the section break, and one after.
+% In the second call \prevchapterdefs is the same as \currentchapterdefs,
+% and \prevsectiondefs is the same as \currentsectiondefs.
+% Then if the page is not broken at the mark, some of the previous
+% section appears on the page, and we can get the name of this section
+% from \firstmark for @everyheadingmarks top.
+% @everyheadingmarks bottom uses \botmark.
+%
+% See page 260 of The TeXbook.
+\def\domark{%
+ \toks0=\expandafter{\currentchapterdefs}%
+ \toks2=\expandafter{\currentsectiondefs}%
+ \toks4=\expandafter{\prevchapterdefs}%
+ \toks6=\expandafter{\prevsectiondefs}%
+ \toks8=\expandafter{\currentcolordefs}%
+ \mark{%
+ \the\toks0 \the\toks2 % 0: marks for @everyheadingmarks top
+ \noexpand\or \the\toks4 \the\toks6 % 1: for @everyheadingmarks bottom
+ \noexpand\else \the\toks8 % 2: color marks
+ }%
+}
+
+% \gettopheadingmarks, \getbottomheadingmarks,
+% \getcolormarks - extract needed part of mark.
+%
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+ \ifcase0\the\savedtopmark\fi
+ \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\the\savedtopmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\currentchapterdefs{}
+\def\currentsectiondefs{}
+\def\currentsection{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\currentcolordefs{}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\txipagewidth \newdimen\txipageheight
+
+% Main output routine.
+%
+\chardef\PAGE = 255
+\newtoks\defaultoutput
+\defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}}
+\output=\expandafter{\the\defaultoutput}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% When outputting the double column layout for indices, an output routine
+% is run several times, which hides the original value of \topmark. This
+% can lead to a page heading being output and duplicating the chapter heading
+% of the index. Hence, save the contents of \topmark at the beginning of
+% the output routine. The saved contents are valid until we actually
+% \shipout a page.
+%
+% (We used to run a short output routine to actually set \topmark and
+% \firstmark to the right values, but if this was called with an empty page
+% containing whatsits for writing index entries, the whatsits would be thrown
+% away and the index auxiliary file would remain empty.)
+%
+\newtoks\savedtopmark
+\newif\iftopmarksaved
+\topmarksavedtrue
+\def\savetopmark{%
+ \iftopmarksaved\else
+ \global\savedtopmark=\expandafter{\topmark}%
+ \global\topmarksavedtrue
+ \fi
+}
+
+% \onepageout takes a vbox as an argument.
+% \shipout a vbox for a single page, adding an optional header, footer
+% and footnote. This also causes index entries for this page to be written
+% to the auxiliary files.
+%
+\def\onepageout#1{%
+ \hoffset=\normaloffset
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Retrieve the information for the headings from the marks in the page,
+ % and call Plain TeX's \makeheadline and \makefootline, which use the
+ % values in \headline and \footline.
+ %
+ % This is used to check if we are on the first page of a chapter.
+ \ifcase1\the\savedtopmark\fi
+ \let\prevchaptername\thischaptername
+ \ifcase0\firstmark\fi
+ \let\curchaptername\thischaptername
+ %
+ \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+ %
+ \ifx\curchaptername\prevchaptername
+ \let\thischapterheading\thischapter
+ \else
+ % \thischapterheading is the same as \thischapter except it is blank
+ % for the first page of a chapter. This is to prevent the chapter name
+ % being shown twice.
+ \def\thischapterheading{}%
+ \fi
+ %
+ % Common context changes for both heading and footing.
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars}
+ %
+ \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}%
+ %
+ \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+ \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}%
+ %
+ {%
+ % Set context for writing to auxiliary files like index files.
+ % 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.
+ %
+ \atdummies % don't expand commands in the output.
+ \turnoffactive
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\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
+ %
+ }%
+ }%
+ \global\topmarksavedfalse
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+% Main part of page, including any footnotes
+\def\pagebody#1{\vbox to\txipageheight{\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\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+
+% Argument parsing
+
+% 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.
+% For example, \def\foo{\parsearg\fooxxx}.
+%
+\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. Pass the result on to
+% \argcheckspaces.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence 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.
+% (Similarly, 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 - define a command taking an argument on the line
+%
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+\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 environments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, 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
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ outside 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.
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% 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\*{\unskip\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.
+ \addgroupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+
+\def\addgroupbox{
+ % \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 = \txipageheight \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\txipageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+}
+
+%
+% 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
+
+\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'. Not documented, written for gawk manual.
+%
+\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 -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable % we want to expand any @value in FILE.
+ \turnoffactive % and allow special characters in the expansion
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \wlog{texinfo.tex: doing @include of #1^^J}%
+ \edef\temp{\noexpand\input #1 }%
+ %
+ % This trickery is to read FILE outside of a group, in case it makes
+ % definitions, etc.
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \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\centersub\centerH
+ \else
+ \let\centersub\centerV
+ \fi
+ \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+ \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+ % The idea here is the same as in \startdefun, \cartouche, etc.: if
+ % @center is the first thing after a section heading, we need to wipe
+ % out the negative parskip inserted by \sectionheading, but still
+ % prevent a page break here.
+ \centerpenalty = \lastpenalty
+ \ifnum\centerpenalty>10000 \vskip\parskip \fi
+ \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+ \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\c{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\cxxx}
+{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
+%
+\let\comment\c
+
+% @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 = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @setfilename INFO-FILENAME - ignored
+\let\setfilename=\comment
+
+% @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
+\newbox\boxB
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+%
+% For LuaTeX
+%
+
+\newif\iftxiuseunicodedestname
+\txiuseunicodedestnamefalse % For pdfTeX etc.
+
+\ifx\luatexversion\thisisundefined
+\else
+ % Use Unicode destination names
+ \txiuseunicodedestnametrue
+ % Escape PDF strings with converting UTF-16 from UTF-8
+ \begingroup
+ \catcode`\%=12
+ \directlua{
+ function UTF16oct(str)
+ tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
+ for c in string.utfvalues(str) do
+ if c < 0x10000 then
+ tex.sprint(
+ string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+ string.char(0x5c) .. string.char(0x25) .. '03o',
+ math.floor(c / 256), math.floor(c % 256)))
+ else
+ c = c - 0x10000
+ local c_hi = c / 1024 + 0xd800
+ local c_lo = c % 1024 + 0xdc00
+ tex.sprint(
+ string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+ string.char(0x5c) .. string.char(0x25) .. '03o' ..
+ string.char(0x5c) .. string.char(0x25) .. '03o' ..
+ string.char(0x5c) .. string.char(0x25) .. '03o',
+ math.floor(c_hi / 256), math.floor(c_hi % 256),
+ math.floor(c_lo / 256), math.floor(c_lo % 256)))
+ end
+ end
+ end
+ }
+ \endgroup
+ \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
+ % Escape PDF strings without converting
+ \begingroup
+ \directlua{
+ function PDFescstr(str)
+ for c in string.bytes(str) do
+ if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
+ tex.sprint(-2,
+ string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
+ c))
+ else
+ tex.sprint(-2, string.char(c))
+ end
+ end
+ end
+ }
+ % The -2 in the arguments here gives all the input to TeX catcode 12
+ % (other) or 10 (space), preventing undefined control sequence errors. See
+ % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
+ %
+ \endgroup
+ \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
+ \ifnum\luatexversion>84
+ % For LuaTeX >= 0.85
+ \def\pdfdest{\pdfextension dest}
+ \let\pdfoutput\outputmode
+ \def\pdfliteral{\pdfextension literal}
+ \def\pdfcatalog{\pdfextension catalog}
+ \def\pdftexversion{\numexpr\pdffeedback version\relax}
+ \let\pdfximage\saveimageresource
+ \let\pdfrefximage\useimageresource
+ \let\pdflastximage\lastsavedimageresourceindex
+ \def\pdfendlink{\pdfextension endlink\relax}
+ \def\pdfoutline{\pdfextension outline}
+ \def\pdfstartlink{\pdfextension startlink}
+ \def\pdffontattr{\pdfextension fontattr}
+ \def\pdfobj{\pdfextension obj}
+ \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
+ \let\pdfpagewidth\pagewidth
+ \let\pdfpageheight\pageheight
+ \edef\pdfhorigin{\pdfvariable horigin}
+ \edef\pdfvorigin{\pdfvariable vorigin}
+ \fi
+\fi
+
+% 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 being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+\newif\ifpdforxetex
+\pdforxetexfalse
+\ifpdf
+ \pdforxetextrue
+\fi
+\ifx\XeTeXrevision\thisisundefined\else
+ \pdforxetextrue
+\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.
+%
+% See http://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. pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+ \ifx\pdfescapestring\thisisundefined
+ % No primitive available; should we give a warning or log?
+ % Many times it won't matter.
+ \xdef#1{#1}%
+ \else
+ % The expandable \pdfescapestring primitive escapes parentheses,
+ % backslashes, and other special chars.
+ \xdef#1{\pdfescapestring{#1}}%
+ \fi
+}
+\def\txiescapepdfutfsixteen#1{%
+ \ifx\pdfescapestrutfsixteen\thisisundefined
+ % No UTF-16 converting macro available.
+ \txiescapepdf{#1}%
+ \else
+ \xdef#1{\pdfescapestrutfsixteen{#1}}%
+ \fi
+}
+
+\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
+ %
+ % Color manipulation macros using ideas from pdfcolor.tex,
+ % except using rgb instead of cmyk; the latter is said to render as a
+ % very dark gray on-screen and a very dark halftone in print, instead
+ % of actual black. The dark red here is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing. We use
+ % black by default, though.
+ \def\rgbDarkRed{0.50 0.09 0.12}
+ \def\rgbBlack{0 0 0}
+ %
+ % rg sets the color for filling (usual text, etc.);
+ % RG sets the color for stroking (thin rules, e.g., normal _'s).
+ \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}}
+ %
+ % Set color, and create a mark which defines \thiscolor accordingly,
+ % so that \makeheadline knows which color to restore.
+ \def\setcolor#1{%
+ \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+ \domark
+ \pdfsetcolor{#1}%
+ }
+ %
+ \def\maincolor{\rgbBlack}
+ \pdfsetcolor{\maincolor}
+ \edef\thiscolor{\maincolor}
+ \def\currentcolordefs{}
+ %
+ \def\makefootline{%
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}%
+ }
+ %
+ \def\makeheadline{%
+ \vbox to 0pt{%
+ \vskip-22.5pt
+ \line{%
+ \vbox to8.5pt{}%
+ % Extract \thiscolor definition from the marks.
+ \getcolormarks
+ % Typeset the headline with \maincolor, then restore the color.
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+ }%
+ \vss
+ }%
+ \nointerlineskip
+ }
+ %
+ %
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+ % others). Let's try in that order, PDF first since if
+ % someone has a scalable image, presumably better to use that than a
+ % bitmap.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.pdf \ifeof 1
+ \openin 1 #1.PDF \ifeof 1
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \else \gdef\pdfimgext{PDF}%
+ \fi
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, ancient 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 \pdfimagewidth \fi
+ \ifdim \wd2 >0pt height \pdfimageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\setpdfdestname#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
+ \makevalueexpandable
+ \turnoffactive
+ \iftxiuseunicodedestname
+ \ifx \declaredencoding \latone
+ % Pass through Latin-1 characters.
+ % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
+ \else
+ \ifx \declaredencoding \utfeight
+ % Pass through Unicode characters.
+ \else
+ % Use ASCII approximations in destination names.
+ \passthroughcharsfalse
+ \fi
+ \fi
+ \else
+ % Use ASCII approximations in destination names.
+ \passthroughcharsfalse
+ \fi
+ \def\pdfdestname{#1}%
+ \txiescapepdf\pdfdestname
+ }}
+ %
+ \def\setpdfoutlinetext#1{{%
+ \indexnofonts
+ \makevalueexpandable
+ \turnoffactive
+ \ifx \declaredencoding \latone
+ % The PDF format can use an extended form of Latin-1 in bookmark
+ % strings. See Appendix D of the PDF Reference, Sixth Edition, for
+ % the "PDFDocEncoding".
+ \passthroughcharstrue
+ % Pass through Latin-1 characters.
+ % LuaTeX: Convert to Unicode
+ % pdfTeX: Use Latin-1 as PDFDocEncoding
+ \def\pdfoutlinetext{#1}%
+ \else
+ \ifx \declaredencoding \utfeight
+ \ifx\luatexversion\thisisundefined
+ % For pdfTeX with UTF-8.
+ % TODO: the PDF format can use UTF-16 in bookmark strings,
+ % but the code for this isn't done yet.
+ % Use ASCII approximations.
+ \passthroughcharsfalse
+ \def\pdfoutlinetext{#1}%
+ \else
+ % For LuaTeX with UTF-8.
+ % Pass through Unicode characters for title texts.
+ \passthroughcharstrue
+ \def\pdfoutlinetext{#1}%
+ \fi
+ \else
+ % For non-Latin-1 or non-UTF-8 encodings.
+ % Use ASCII approximations.
+ \passthroughcharsfalse
+ \def\pdfoutlinetext{#1}%
+ \fi
+ \fi
+ % LuaTeX: Convert to UTF-16
+ % pdfTeX: Use Latin-1 as PDFDocEncoding
+ \txiescapepdfutfsixteen\pdfoutlinetext
+ }}
+ %
+ \def\pdfmkdest#1{%
+ \setpdfdestname{#1}%
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use black for everything.
+ \def\urlcolor{\rgbBlack}
+ \def\linkcolor{\rgbBlack}
+ \def\endlink{\setcolor{\maincolor}\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.
+ \setpdfoutlinetext{#1}
+ \setpdfdestname{#3}
+ \ifx\pdfdestname\empty
+ \def\pdfdestname{#4}%
+ \fi
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\partentry##1##2##3##4{}% ignore parts in the outlines
+ \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.
+ %
+ % TODO this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Too
+ % much work for too little return. Just use the ASCII equivalents
+ % we use for the index sort strings.
+ %
+ \indexnofonts
+ \setupdatafile
+ % We can have normal brace characters in the PDF outlines, unlike
+ % Texinfo index files. So set that up.
+ \def\{{\lbracecharliteral}%
+ \def\}{\rbracecharliteral}%
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ {\catcode`[=1 \catcode`]=2
+ \catcode`{=\other \catcode`}=\other
+ \gdef\lbracecharliteral[{]%
+ \gdef\rbracecharliteral[}]%
+ ]
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \nextsp}
+ \def\getfilename#1{%
+ \filenamelength=0
+ % If we don't expand the argument now, \skipspaces will get
+ % snagged on things like "@value{foo}".
+ \edef\temp{#1}%
+ \expandafter\skipspaces\temp|\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
+ % do we want to go so far as to use \indexnofonts instead of just
+ % special-casing \var here?
+ \def\var##1{##1}%
+ %
+ \leavevmode\setcolor{\urlcolor}%
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ % \pdfgettoks - Surround page numbers in #1 with @pdflink. #1 may
+ % be a simple number, or a list of numbers in the case of an index
+ % entry.
+ \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}}
+ \setcolor{\linkcolor}#1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ % non-pdf mode
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\setcolor = \gobble
+ \let\pdfsetcolor = \gobble
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+%
+% For XeTeX
+%
+\ifx\XeTeXrevision\thisisundefined
+\else
+ %
+ % XeTeX version check
+ %
+ \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
+ % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
+ % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
+ % For avoiding PDF destination name replacement, we use this special
+ % instead of xdvipdfmx's command line option `-C 0x0010'.
+ \special{dvipdfmx:config C 0x0010}
+ % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
+ % It can handle Unicode destination names for PDF.
+ \txiuseunicodedestnametrue
+ \else
+ % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
+ % `dvipdfmx:config' special.
+ % So for avoiding PDF destination name replacement,
+ % xdvipdfmx's command line option `-C 0x0010' is necessary.
+ %
+ % XeTeX < 0.99995 can not handle Unicode destination names for PDF
+ % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
+ % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+ \txiuseunicodedestnamefalse
+ \fi
+ %
+ % Color support
+ %
+ \def\rgbDarkRed{0.50 0.09 0.12}
+ \def\rgbBlack{0 0 0}
+ %
+ \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
+ %
+ % Set color, and create a mark which defines \thiscolor accordingly,
+ % so that \makeheadline knows which color to restore.
+ \def\setcolor#1{%
+ \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+ \domark
+ \pdfsetcolor{#1}%
+ }
+ %
+ \def\maincolor{\rgbBlack}
+ \pdfsetcolor{\maincolor}
+ \edef\thiscolor{\maincolor}
+ \def\currentcolordefs{}
+ %
+ \def\makefootline{%
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}%
+ }
+ %
+ \def\makeheadline{%
+ \vbox to 0pt{%
+ \vskip-22.5pt
+ \line{%
+ \vbox to8.5pt{}%
+ % Extract \thiscolor definition from the marks.
+ \getcolormarks
+ % Typeset the headline with \maincolor, then restore the color.
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+ }%
+ \vss
+ }%
+ \nointerlineskip
+ }
+ %
+ % PDF outline support
+ %
+ % Emulate pdfTeX primitive
+ \def\pdfdest name#1 xyz{%
+ \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
+ }
+ %
+ \def\setpdfdestname#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
+ \makevalueexpandable
+ \turnoffactive
+ \iftxiuseunicodedestname
+ % Pass through Unicode characters.
+ \else
+ % Use ASCII approximations in destination names.
+ \passthroughcharsfalse
+ \fi
+ \def\pdfdestname{#1}%
+ \txiescapepdf\pdfdestname
+ }}
+ %
+ \def\setpdfoutlinetext#1{{%
+ \turnoffactive
+ % Always use Unicode characters in title texts.
+ \def\pdfoutlinetext{#1}%
+ % For XeTeX, xdvipdfmx converts to UTF-16.
+ % So we do not convert.
+ \txiescapepdf\pdfoutlinetext
+ }}
+ %
+ \def\pdfmkdest#1{%
+ \setpdfdestname{#1}%
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }
+ %
+ % by default, use black for everything.
+ \def\urlcolor{\rgbBlack}
+ \def\linkcolor{\rgbBlack}
+ \def\endlink{\setcolor{\maincolor}\pdfendlink}
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ \setpdfoutlinetext{#1}
+ \setpdfdestname{#3}
+ \ifx\pdfdestname\empty
+ \def\pdfdestname{#4}%
+ \fi
+ %
+ \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
+ << /S /GoTo /D (\pdfdestname) >> >> }%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ %
+ % For XeTeX, counts of subentries are not necessary.
+ % Therefore, we read toc only once.
+ %
+ % We use node names as destinations.
+ \def\partentry##1##2##3##4{}% ignore parts in the outlines
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{1}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{2}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{3}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{4}{##3}{##4}}%
+ %
+ \let\appentry\numchapentry%
+ \let\appsecentry\numsecentry%
+ \let\appsubsecentry\numsubsecentry%
+ \let\appsubsubsecentry\numsubsubsecentry%
+ \let\unnchapentry\numchapentry%
+ \let\unnsecentry\numsecentry%
+ \let\unnsubsecentry\numsubsecentry%
+ \let\unnsubsubsecentry\numsubsubsecentry%
+ %
+ % For XeTeX, xdvipdfmx converts strings to UTF-16.
+ % Therefore, the encoding and the language may not be considered.
+ %
+ \indexnofonts
+ \setupdatafile
+ % We can have normal brace characters in the PDF outlines, unlike
+ % Texinfo index files. So set that up.
+ \def\{{\lbracecharliteral}%
+ \def\}{\rbracecharliteral}%
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ {\catcode`[=1 \catcode`]=2
+ \catcode`{=\other \catcode`}=\other
+ \gdef\lbracecharliteral[{]%
+ \gdef\rbracecharliteral[}]%
+ ]
+
+ \special{pdf:docview << /PageMode /UseOutlines >> }
+ % ``\special{pdf:tounicode ...}'' is not necessary
+ % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
+ % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
+ % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
+ % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+%
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \nextsp}
+ \def\getfilename#1{%
+ \filenamelength=0
+ % If we don't expand the argument now, \skipspaces will get
+ % snagged on things like "@value{foo}".
+ \edef\temp{#1}%
+ \expandafter\skipspaces\temp|\relax
+ }
+ % 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
+ % do we want to go so far as to use \indexnofonts instead of just
+ % special-casing \var here?
+ \def\var##1{##1}%
+ %
+ \leavevmode\setcolor{\urlcolor}%
+ \special{pdf:bann << /Border [0 0 0]
+ /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
+ \endgroup}
+ \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
+ \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{%
+ \special{pdf:bann << /Border [0 0 0]
+ /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
+ \setcolor{\linkcolor}#1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+%
+ %
+ % @image support
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\doxeteximage#1#2#3{%
+ \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
+ % others). Let's try in that order, PDF first since if
+ % someone has a scalable image, presumably better to use that than a
+ % bitmap.
+ \let\xeteximgext=\empty
+ \begingroup
+ \openin 1 #1.pdf \ifeof 1
+ \openin 1 #1.PDF \ifeof 1
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \errmessage{Could not find image file #1 for XeTeX}%
+ \else \gdef\xeteximgext{JPG}%
+ \fi
+ \else \gdef\xeteximgext{jpeg}%
+ \fi
+ \else \gdef\xeteximgext{jpg}%
+ \fi
+ \else \gdef\xeteximgext{png}%
+ \fi
+ \else \gdef\xeteximgext{PDF}%
+ \fi
+ \else \gdef\xeteximgext{pdf}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ \def\xetexpdfext{pdf}%
+ \ifx\xeteximgext\xetexpdfext
+ \XeTeXpdffile "#1".\xeteximgext ""
+ \else
+ \def\xetexpdfext{PDF}%
+ \ifx\xeteximgext\xetexpdfext
+ \XeTeXpdffile "#1".\xeteximgext ""
+ \else
+ \XeTeXpicfile "#1".\xeteximgext ""
+ \fi
+ \fi
+ \ifdim \wd0 >0pt width \xeteximagewidth \fi
+ \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+ }
+\fi
+
+
+%
+\message{fonts,}
+
+% 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}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+ \dimen0 = #1\relax
+ \normalbaselineskip = \baselinefactor\dimen0
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+ \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}%
+ }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\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
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\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. (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
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defsl\slshape{10}{\magstep1}{OT1}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\ttslfont=\defttsl \let\slfont=\defsl \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
+\def\smallecsize{0900}
+
+% 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
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% 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\titleecsize{2074}
+
+% 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
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{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
+\def\sececsize{1440}
+
+% 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
+\def\ssececsize{1200}
+
+% Reduced fonts for @acronym 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
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% 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
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defsl\slshape{10}{\magstephalf}{OT1}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\slfont=\defsl \let\ttslfont=\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
+\def\smallecsize{0900}
+
+% 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
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% 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\titleecsize{2074}
+
+% 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
+\def\chapecsize{1440}
+
+% 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
+\def\sececsize{1200}
+
+% 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
+\def\ssececsize{1000}
+
+% Reduced fonts for @acronym 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
+\def\reducedecsize{0900}
+
+\divide\parskip by 2 % reduce space between paragraphs
+\textleading = 12pt % line spacing for 10pt CM
+\textfonts % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+% 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}
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\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
+}
+
+%
+% 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 #1font\endcsname % change the current font
+}
+
+\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}}
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.
+% We don't bother to reset \scriptscriptfont; awaiting user need.
+%
+\def\resetmathfonts{%
+ \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
+ \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
+ \textfont\ttfam=\ttfont \textfont\sffam=\sffont
+ %
+ % Fonts for superscript. Note that the 7pt fonts are used regardless
+ % of the current font size.
+ \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
+ \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
+ \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
+ \scriptfont\sffam=\sevensf
+}
+
+%
+
+% The font-changing commands (all called \...fonts) redefine the meanings
+% of \STYLEfont, 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 \STYLEfont to set the current font.
+%
+% The fonts used for \ifont are for "math italics" (\itfont is for italics
+% in regular text). \syfont is also used in math mode only.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used
+% in, e.g., the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+
+\def\assignfonts#1{%
+ \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
+ \expandafter\let\expandafter\itfont\csname #1it\endcsname
+ \expandafter\let\expandafter\slfont\csname #1sl\endcsname
+ \expandafter\let\expandafter\bffont\csname #1bf\endcsname
+ \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
+ \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
+ \expandafter\let\expandafter\sffont \csname #1sf\endcsname
+ \expandafter\let\expandafter\ifont \csname #1i\endcsname
+ \expandafter\let\expandafter\syfont \csname #1sy\endcsname
+ \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
+}
+
+\newif\ifrmisbold
+
+% Select smaller font size with the current style. Used to change font size
+% in, e.g., the LaTeX logo and acronyms. If we are using bold fonts for
+% normal roman text, also use bold fonts for roman text in the smaller size.
+\def\switchtolllsize{%
+ \expandafter\assignfonts\expandafter{\lllsize}%
+ \ifrmisbold
+ \let\rmfont\bffont
+ \fi
+ \csname\curfontstyle\endcsname
+}%
+
+\def\switchtolsize{%
+ \expandafter\assignfonts\expandafter{\lsize}%
+ \ifrmisbold
+ \let\rmfont\bffont
+ \fi
+ \csname\curfontstyle\endcsname
+}%
+
+\def\definefontsetatsize#1#2#3#4#5{%
+\expandafter\def\csname #1fonts\endcsname{%
+ \def\curfontsize{#1}%
+ \def\lsize{#2}\def\lllsize{#3}%
+ \csname rmisbold#5\endcsname
+ \assignfonts{#1}%
+ \resetmathfonts
+ \setleading{#4}%
+}}
+
+\definefontsetatsize{text} {reduced}{smaller}{\textleading}{false}
+\definefontsetatsize{title} {chap} {subsec} {27pt} {true}
+\definefontsetatsize{chap} {sec} {text} {19pt} {true}
+\definefontsetatsize{sec} {subsec} {reduced}{17pt} {true}
+\definefontsetatsize{ssec} {text} {small} {15pt} {true}
+\definefontsetatsize{reduced}{small} {smaller}{10.5pt}{false}
+\definefontsetatsize{small} {smaller}{smaller}{10.5pt}{false}
+\definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
+
+\def\titlefont#1{{\titlefonts\rm #1}}
+\let\subsecfonts = \ssecfonts
+\let\subsubsecfonts = \ssecfonts
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% 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
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% 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 }
+
+% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style.
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+ \def\currentmarkupstyle{#1}%
+ \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+ \expandafter\def\expandafter\markupstylesetup
+ \expandafter{\markupstylesetup #1}%
+ \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+ \expandafter\let\expandafter \temp
+ \csname markupsetuplq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+ \expandafter\let\expandafter \temp
+ \csname markupsetuprq\currentmarkupstyle\endcsname
+ \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd \markupsetcodequoteleft
+\let\markupsetuprqkbd \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead 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{%
+ \ifmonospace
+ \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else \char'15 \fi
+ \else \char'15 \fi
+ \else
+ '%
+ \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{%
+ \ifmonospace
+ \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ % [Knuth] pp. 380,381,391
+ % \relax disables Spanish ligatures ?` and !` of \tt font.
+ \relax`%
+ \else \char'22 \fi
+ \else \char'22 \fi
+ \else
+ \relax`%
+ \fi
+}
+
+% Commands to set the quote options.
+%
+\parseargdef\codequoteundirected{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxicodequoteundirected\endcsname
+ = t%
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxicodequoteundirected\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+ \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxicodequotebacktick\endcsname
+ = t%
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxicodequotebacktick\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+ \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+ \ifusingtt
+ {{\ttsl #2}\let\next=\relax}%
+ {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+ \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+ \ifx\next,%
+ \else\ifx\next-%
+ \else\ifx\next.%
+ \else\ifx\next\.%
+ \else\ifx\next\comma%
+ \else\ptexslash
+ \fi\fi\fi\fi\fi
+ \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic. @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+ \let\saveaftersmartic = \aftersmartic
+ \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+ \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% 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
+
+% @b, explicit bold. Also @strong.
+\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`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
+ \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@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
+
+% @t, explicit typewriter.
+\def\t#1{%
+ {\tt \plainfrenchspacing #1}%
+ \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\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
+ %
+ \plainfrenchspacing
+ #1%
+ }%
+ \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% (But see \codedashfinish below.)
+% 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\let'=\rq \global\let`=\lq % default definitions
+ %
+ \global\def\code{\begingroup
+ \setupmarkupstyle{code}%
+ % The following should really be moved into \setupmarkupstyle handlers.
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\normaldash
+ \let_\realunder
+ \fi
+ % Given -foo (with a single dash), we do not want to allow a break
+ % after the hyphen.
+ \global\let\codedashprev=\codedash
+ %
+ \codex
+ }
+ %
+ \gdef\codedash{\futurelet\next\codedashfinish}
+ \gdef\codedashfinish{%
+ \normaldash % always output the dash character itself.
+ %
+ % Now, output a discretionary to allow a line break, unless
+ % (a) the next character is a -, or
+ % (b) the preceding character is a -.
+ % E.g., given --posix, we do not want to allow a break after either -.
+ % Given --foo-bar, we do want to allow a break between the - and the b.
+ \ifx\next\codedash \else
+ \ifx\codedashprev\codedash
+ \else \discretionary{}{}{}\fi
+ \fi
+ % we need the space after the = for the case when \next itself is a
+ % space token; it would get swallowed otherwise. As in @code{- a}.
+ \global\let\codedashprev= \next
+ }
+}
+\def\normaldash{-}
+%
+\def\codex #1{\tclose{#1}\endgroup}
+
+\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{}{}{}}%
+ {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\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', must be true|false}%
+ \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') aka @url 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.
+
+% TeX-only option to allow changing PDF output to show only the second
+% arg (if given), and not the url (which is then just the link target).
+\newif\ifurefurlonlylink
+
+% The main macro is \urefbreak, which allows breaking at expected
+% places within the url. (There used to be another version, which
+% didn't support automatic breaking.)
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+%
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}% look for second arg
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ % For pdfTeX and LuaTeX
+ \ifurefurlonlylink
+ % PDF plus option to not display url, show just arg
+ \unhbox0
+ \else
+ % PDF, normally display both arg and url for consistency,
+ % visibility, if the pdf is eventually used to print, etc.
+ \unhbox0\ (\urefcode{#1})%
+ \fi
+ \else
+ \ifx\XeTeXrevision\thisisundefined
+ \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
+ \else
+ % For XeTeX
+ \ifurefurlonlylink
+ % PDF plus option to not display url, show just arg
+ \unhbox0
+ \else
+ % PDF, normally display both arg and url for consistency,
+ % visibility, if the pdf is eventually used to print, etc.
+ \unhbox0\ (\urefcode{#1})%
+ \fi
+ \fi
+ \fi
+ \else
+ \urefcode{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+ \catcode`\&=\active \catcode`\.=\active
+ \catcode`\#=\active \catcode`\?=\active
+ \catcode`\/=\active
+}
+{
+ \urefcatcodes
+ %
+ \global\def\urefcode{\begingroup
+ \setupmarkupstyle{code}%
+ \urefcatcodes
+ \let&\urefcodeamp
+ \let.\urefcodedot
+ \let#\urefcodehash
+ \let?\urefcodequest
+ \let/\urefcodeslash
+ \codex
+ }
+ %
+ % By default, they are just regular characters.
+ \global\def&{\normalamp}
+ \global\def.{\normaldot}
+ \global\def#{\normalhash}
+ \global\def?{\normalquest}
+ \global\def/{\normalslash}
+}
+
+\def\urefcodeamp{\urefprebreak \&\urefpostbreak}
+\def\urefcodedot{\urefprebreak .\urefpostbreak}
+\def\urefcodehash{\urefprebreak \#\urefpostbreak}
+\def\urefcodequest{\urefprebreak ?\urefpostbreak}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+ \catcode`\/=\active
+ \global\def\urefcodeslashfinish{%
+ \urefprebreak \slashChar
+ % Allow line break only after the final / in a sequence of
+ % slashes, to avoid line break between the slashes in http://.
+ \ifx\next/\else \urefpostbreak \fi
+ }
+}
+
+% By default we'll break after the special characters, but some people like to
+% break before the special chars, so allow that. Also allow no breaking at
+% all, for manual control.
+%
+\parseargdef\urefbreakstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\wordnone
+ \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+ \else\ifx\txiarg\wordbefore
+ \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak}
+ \else\ifx\txiarg\wordafter
+ \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak}
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+ \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+% Allow a ragged right output to aid breaking long URL's. There can
+% be a break at the \allowbreak with no extra glue (if the existing stretch in
+% the line is sufficent), a break at the \penalty100 with extra glue added
+% at the end of the line, or no break at all here.
+% Changing the value of the penalty and/or the amount of stretch affects how
+% preferrable one choice is over the other.
+\def\urefallowbreak{%
+ \allowbreak
+ \hskip 0pt plus 2 em\relax
+ \penalty300
+ \hskip 0pt plus -2 em\relax
+}
+
+\urefbreakstyle after
+
+% @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}
+\ifpdforxetex
+ \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
+
+% @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 setting `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+ \def\one{#1}\def\three{#3}\def\threex{??}%
+ \ifx\one\xkey\ifx\threex\three \key{#2}%
+ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+ \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge. Doesn't adjust to text size.
+%\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}}}}
+
+% definition of @key with no lozenge. If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle. But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+ \nohyphenation
+ \ifmonospace\else\tt\fi
+ #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% 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}
+
+% @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{%
+ {\switchtolsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+ \null % reset \spacefactor=1000
+}
+
+% @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
+ \null % reset \spacefactor=1000
+}
+
+% @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 math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \ifmmode\else % only go into math if not in math mode already
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ % make the texinfo accent commands work in math mode
+ \let\"=\ddot
+ \let\'=\acute
+ \let\==\bar
+ \let\^=\hat
+ \let\`=\grave
+ \let\u=\breve
+ \let\v=\check
+ \let\~=\tilde
+ \let\dotaccent=\dot
+ % have to provide another name for sup operator
+ \let\mathopsup=\sup
+ $\expandafter\finishmath\fi
+}
+\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
+ \catcode`' = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ \let' = \ptexquoteright
+ }
+}
+
+% for @sub and @sup, if in math mode, just do a normal sub/superscript.
+% If in text, use math to place as sub/superscript, but switch
+% into text mode, with smaller fonts. This is a different font than the
+% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
+% fix it (significant additions to font machinery) until someone notices.
+%
+\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
+\def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
+%
+\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
+\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+%
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+ \def\inlinefmtname{#1}%
+ \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
+}
+%
+% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
+% FMTNAME is tex, else ELSE-TEXT.
+\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
+\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
+ \def\inlinefmtname{#1}%
+ \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
+}
+%
+% For raw, must switch into @tex before parsing the argument, to avoid
+% setting catcodes prematurely. Doing it this way means that, for
+% example, @inlineraw{html, foo{bar} gets a parse error instead of being
+% ignored. But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too. We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+%
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+ \def\inlinerawname{#1}%
+ \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+ \endgroup % close group opened by \tex.
+}
+
+% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
+%
+\long\def\inlineifset#1{\doinlineifset #1,\finish}
+\long\def\doinlineifset#1,#2,\finish{%
+ \def\inlinevarname{#1}%
+ \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
+ \else\ignorespaces#2\fi
+}
+
+% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
+%
+\long\def\inlineifclear#1{\doinlineifclear #1,\finish}
+\long\def\doinlineifclear#1,#2,\finish{%
+ \def\inlinevarname{#1}%
+ \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
+}
+
+
+\message{glyphs,}
+% and logos.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
+\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
+\let\{=\lbracechar
+\let\}=\rbracechar
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\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{\switchtolllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \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 \ifmmode\imath \else\ptexi \fi
+ \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+ \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{%
+ \ifx\textnominalsize\xwordpt
+ % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
+ % Revert to plain's \scriptsize, which is 7pt.
+ \count255=\the\fam $\fam\count255 \scriptstyle A$%
+ \else
+ % For 11pt, we can use our lllsize.
+ \switchtolllsize A%
+ \fi
+ }%
+ \vss
+ }}%
+ \kern-.15em
+ \TeX
+}
+
+% Some math mode symbols. Define \ensuremath to switch into math mode
+% unless we are already there. Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
+
+% @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
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\ttfont \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 \putworderror\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}
+
+% @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 http://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
+}
+
+% Glyphs from the EC fonts. We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases. We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+ \def\temp{#1}%
+ \ifx\temp\macrocharA\Aogonek
+ \else\ifx\temp\macrochara\aogonek
+ \else\ifx\temp\macrocharE\Eogonek
+ \else\ifx\temp\macrochare\eogonek
+ \else
+ \ecfont \setbox0=\hbox{#1}%
+ \ifdim\ht0=1ex\accent"0C #1%
+ \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+ \fi
+ \fi\fi\fi\fi
+ }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs. That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding). Both are part of the ec
+% package and follow the same conventions.
+%
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
+ % We can't distinguish serif/sans and italic/slanted, but this
+ % is used for crude hacks anyway (like adding French and German
+ % quotes to documents typeset with CM, where we lose kerning), so
+ % hopefully nobody will notice/care.
+ \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+ \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+ \ifmonospace
+ % typewriter:
+ \font\thisecfont = #1ctt\ecsize \space at \nominalsize
+ \else
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
+ \else
+ % regular:
+ \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+ \fi
+ \fi
+ \thisecfont
+}
+
+% @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{\switchtolllsize 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\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\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
+
+% @setcontentsaftertitlepage used to do an implicit @contents or
+% @shortcontents after @end titlepage, but it is now obsolete.
+\def\setcontentsaftertitlepage{%
+ \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
+ command; move your @contents command if you want the contents
+ after the title page.}}%
+\def\setshortcontentsaftertitlepage{%
+ \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
+ command; move your @shortcontents and @contents commands if you
+ want the contents after the title page.}}%
+
+\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
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right. This should be used
+% inside a \vbox, and fonts need to be set appropriately first. \par should
+% be specified before the end of the \vbox, since a vbox is a group.
+%
+\def\raggedtitlesettings{%
+ \rm
+ \hyphenpenalty=10000
+ \parindent=0pt
+ \tolerance=5000
+ \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\rmfont
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \vbox{\titlefonts \raggedtitlesettings #1\par}%
+ % 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
+ {\secfonts\rm \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 \makeheadline and \makefootline in Plain 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\txipageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+% These define \getoddheadingmarks, \getevenheadingmarks,
+% \getoddfootingmarks, and \getevenfootingmarks, each to one of
+% \gettopheadingmarks, \getbottomheadingmarks.
+%
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
+ \headingmarks{odd}{heading}{#1} }
+\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
+ \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+ \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+ \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @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.
+
+\parseargdef\headings{\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+ \evenheadline={\hfil}\evenfootline={\hfil}%
+ \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff % it's the default
+
+% 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{\thischapterheading\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{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\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{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\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\thisisundefined
+\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\relax
+ \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
+ %
+ % Try typesetting the item mark so that if the document erroneously says
+ % something like @itemize @samp (intending @table), there's an error
+ % right away at the @itemize. It's not the best error message in the
+ % world, but it's better than leaving it to the @item. This means if
+ % the user wants an empty mark, they have to say @w{} not just @w.
+ \def\itemcontents{#1}%
+ \setbox0 = \hbox{\itemcontents}%
+ %
+ % @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}%
+ %
+ \ifinner\else
+ \vadjust{\penalty 1200}% not good to break after first line of item.
+ \fi
+ % We can be in inner vertical mode in a footnote, although an
+ % @itemize looks awful there.
+ }%
+ \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. \everycr below resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+ \checkenv\multitable
+ \crcr
+ \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
+ \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+ \the\everytab % for the first item
+}%
+%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
+% 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 again encounter the problem the 1sp was intended to solve.
+% --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={}% Reset from possible headitem.
+ \global\colcount=0 % Reset the column counter.
+ %
+ % Check for saved footnotes, etc.:
+ \checkinserts
+ %
+ % Perhaps a \nobreak, then reset:
+ \headitemcrhook
+ \global\let\headitemcrhook=\relax
+ }%
+ }%
+ %
+ \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-\normaldash \let_\normalunderscore
+ }
+}
+
+\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
+}
+
+% Like \expandablevalue, but completely expandable (the \message in the
+% definition above operates at the execution level of TeX). Used when
+% writing to auxiliary files, due to the expansion that \write does.
+% If flag is undefined, pass through an unexpanded @value command: maybe it
+% will be set by the time it is read back in.
+%
+% NB flag names containing - or _ may not work here.
+\def\dummyvalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ \string\value{#1}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% Used for @value's in index entries to form the sort key: expand the @value
+% if possible, otherwise sort late.
+\def\indexnofontsvalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ ZZZZZZZ%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get the special treatment we need for `@end ifset,' we call
+% \makecond and then 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 executes 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}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined. We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+%
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname #2\endcsname\relax
+ #1% If not defined, \let\next as above.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+ \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @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 IX.
+% It automatically defines \IXindex such that
+% \IXindex ...rest of line... puts an entry in the index IX.
+% It also defines \IXindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is IX.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \expandafter\chardef\csname#1indfile\endcsname=0
+ \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{%
+ \expandafter\chardef\csname#1indfile\endcsname=0
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+% The default indices:
+\newindex{cp}% concepts,
+\newcodeindex{fn}% functions,
+\newcodeindex{vr}% variables,
+\newcodeindex{tp}% types,
+\newcodeindex{ky}% keys
+\newcodeindex{pg}% and programs.
+
+
+% @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{%
+ \requireopenindexfile{#3}%
+ % 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 index macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is the two-letter name of the index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
+\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
+
+% Used for the aux, toc and index files to prevent expansion of Texinfo
+% commands.
+%
+\def\atdummies{%
+ \definedummyletter\@%
+ \definedummyletter\ %
+ \definedummyletter\{%
+ \definedummyletter\}%
+ \definedummyletter\&%
+ %
+ % Do the redefinitions.
+ \definedummies
+ \otherbackslash
+}
+
+% \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.
+%
+% 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).
+%
+% For control letters, we have \definedummyletter, which omits the
+% space.
+%
+\def\definedummyword #1{\def#1{\string#1\space}}%
+\def\definedummyletter#1{\def#1{\string#1}}%
+\let\definedummyaccent\definedummyletter
+
+% Called from \atdummies to prevent the expansion of commands.
+%
+\def\definedummies{%
+ %
+ \let\commondummyword\definedummyword
+ \let\commondummyletter\definedummyletter
+ \let\commondummyaccent\definedummyaccent
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ \definedummyletter\-%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\DH
+ \definedummyword\L
+ \definedummyword\O
+ \definedummyword\OE
+ \definedummyword\TH
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\dh
+ \definedummyword\exclamdown
+ \definedummyword\l
+ \definedummyword\o
+ \definedummyword\oe
+ \definedummyword\ordf
+ \definedummyword\ordm
+ \definedummyword\questiondown
+ \definedummyword\ss
+ \definedummyword\th
+ %
+ % 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\ampchar
+ \definedummyword\atchar
+ \definedummyword\arrow
+ \definedummyword\backslashchar
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\entrybreak
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\expansion
+ \definedummyword\geq
+ \definedummyword\guillemetleft
+ \definedummyword\guillemetright
+ \definedummyword\guilsinglleft
+ \definedummyword\guilsinglright
+ \definedummyword\lbracechar
+ \definedummyword\leq
+ \definedummyword\mathopsup
+ \definedummyword\minus
+ \definedummyword\ogonek
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\quotedblbase
+ \definedummyword\quotedblleft
+ \definedummyword\quotedblright
+ \definedummyword\quoteleft
+ \definedummyword\quoteright
+ \definedummyword\quotesinglbase
+ \definedummyword\rbracechar
+ \definedummyword\result
+ \definedummyword\sub
+ \definedummyword\sup
+ \definedummyword\textdegree
+ %
+ \definedummyword\subentry
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ \let\value\dummyvalue
+ %
+ \normalturnoffactive
+}
+
+% \commondummiesnofonts: common to \definedummies and \indexnofonts.
+% Define \commondummyletter, \commondummyaccent and \commondummyword before
+% using. Used for accents, font commands, and various control letters.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \commondummyletter\!%
+ \commondummyaccent\"%
+ \commondummyaccent\'%
+ \commondummyletter\*%
+ \commondummyaccent\,%
+ \commondummyletter\.%
+ \commondummyletter\/%
+ \commondummyletter\:%
+ \commondummyaccent\=%
+ \commondummyletter\?%
+ \commondummyaccent\^%
+ \commondummyaccent\`%
+ \commondummyaccent\~%
+ \commondummyword\u
+ \commondummyword\v
+ \commondummyword\H
+ \commondummyword\dotaccent
+ \commondummyword\ogonek
+ \commondummyword\ringaccent
+ \commondummyword\tieaccent
+ \commondummyword\ubaraccent
+ \commondummyword\udotaccent
+ \commondummyword\dotless
+ %
+ % Texinfo font commands.
+ \commondummyword\b
+ \commondummyword\i
+ \commondummyword\r
+ \commondummyword\sansserif
+ \commondummyword\sc
+ \commondummyword\slanted
+ \commondummyword\t
+ %
+ % Commands that take arguments.
+ \commondummyword\abbr
+ \commondummyword\acronym
+ \commondummyword\anchor
+ \commondummyword\cite
+ \commondummyword\code
+ \commondummyword\command
+ \commondummyword\dfn
+ \commondummyword\dmn
+ \commondummyword\email
+ \commondummyword\emph
+ \commondummyword\env
+ \commondummyword\file
+ \commondummyword\image
+ \commondummyword\indicateurl
+ \commondummyword\inforef
+ \commondummyword\kbd
+ \commondummyword\key
+ \commondummyword\math
+ \commondummyword\option
+ \commondummyword\pxref
+ \commondummyword\ref
+ \commondummyword\samp
+ \commondummyword\strong
+ \commondummyword\tie
+ \commondummyword\U
+ \commondummyword\uref
+ \commondummyword\url
+ \commondummyword\var
+ \commondummyword\verb
+ \commondummyword\w
+ \commondummyword\xref
+}
+
+\let\indexlbrace\relax
+\let\indexrbrace\relax
+\let\indexatchar\relax
+\let\indexbackslash\relax
+
+{\catcode`\@=0
+\catcode`\\=13
+ @gdef@backslashdisappear{@def\{}}
+}
+
+{
+\catcode`\<=13
+\catcode`\-=13
+\catcode`\`=13
+ \gdef\indexnonalnumdisappear{%
+ \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
+ % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
+ % (Introduced for FSFS 2nd ed.)
+ \let`=\empty
+ \fi
+ %
+ \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
+ \backslashdisappear
+ \fi
+ %
+ \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
+ \def-{}%
+ \fi
+ \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
+ \def<{}%
+ \fi
+ \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
+ \def\@{}%
+ \fi
+ }
+
+ \gdef\indexnonalnumreappear{%
+ \let-\normaldash
+ \let<\normalless
+ }
+}
+
+
+% \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\commondummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\commondummyletter##1{\let##1\empty}%
+ % All control words become @asis by default; overrides below.
+ \let\commondummyword\commondummyaccent
+ \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\@{@}%
+ \def\_{\normalunderscore}%
+ \def\-{}% @- shouldn't affect sorting
+ %
+ \uccode`\1=`\{ \uppercase{\def\{{1}}%
+ \uccode`\1=`\} \uppercase{\def\}{1}}%
+ \let\lbracechar\{%
+ \let\rbracechar\}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\DH{DZZ}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\TH{TH}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\dh{dzz}%
+ \def\exclamdown{!}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ \def\o{o}%
+ \def\questiondown{?}%
+ \def\ss{ss}%
+ \def\th{th}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters. \defglyph gives the control sequence a
+ % definition that removes the {} that follows its use.
+ \defglyph\atchar{@}%
+ \defglyph\arrow{->}%
+ \defglyph\bullet{bullet}%
+ \defglyph\comma{,}%
+ \defglyph\copyright{copyright}%
+ \defglyph\dots{...}%
+ \defglyph\enddots{...}%
+ \defglyph\equiv{==}%
+ \defglyph\error{error}%
+ \defglyph\euro{euro}%
+ \defglyph\expansion{==>}%
+ \defglyph\geq{>=}%
+ \defglyph\guillemetleft{<<}%
+ \defglyph\guillemetright{>>}%
+ \defglyph\guilsinglleft{<}%
+ \defglyph\guilsinglright{>}%
+ \defglyph\leq{<=}%
+ \defglyph\lbracechar{\{}%
+ \defglyph\minus{-}%
+ \defglyph\point{.}%
+ \defglyph\pounds{pounds}%
+ \defglyph\print{-|}%
+ \defglyph\quotedblbase{"}%
+ \defglyph\quotedblleft{"}%
+ \defglyph\quotedblright{"}%
+ \defglyph\quoteleft{`}%
+ \defglyph\quoteright{'}%
+ \defglyph\quotesinglbase{,}%
+ \defglyph\rbracechar{\}}%
+ \defglyph\registeredsymbol{R}%
+ \defglyph\result{=>}%
+ \defglyph\textdegree{o}%
+ %
+ % 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\value\indexnofontsvalue
+}
+\def\defglyph#1#2{\def#1##1{#2}} % see above
+
+
+
+
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{%
+ \iflinks
+ {%
+ %
+ \requireopenindexfile{#1}%
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \def\indextext{#2}%
+ \safewhatsit\doindwrite
+ }%
+ \fi
+}
+
+% Check if an index file has been opened, and if not, open it.
+\def\requireopenindexfile#1{%
+\ifnum\csname #1indfile\endcsname=0
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \edef\suffix{#1}%
+ % A .fls suffix would conflict with the file extension for the output
+ % of -recorder, so use .f1s instead.
+ \ifx\suffix\indexisfl\def\suffix{f1}\fi
+ % Open the file
+ \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
+ % Using \immediate above here prevents an object entering into the current
+ % box, which could confound checks such as those in \safewhatsit for
+ % preceding skips.
+ \typeout{Writing index file \jobname.\suffix}%
+\fi}
+\def\indexisfl{fl}
+
+% Definition for writing index entry sort key.
+{
+\catcode`\-=13
+\gdef\indexwritesortas{%
+ \begingroup
+ \indexnonalnumreappear
+ \indexwritesortasxxx}
+\gdef\indexwritesortasxxx#1{%
+ \xdef\indexsortkey{#1}\endgroup}
+}
+
+\def\indexwriteseealso#1{
+ \gdef\pagenumbertext{\string\seealso{#1}}%
+}
+\def\indexwriteseeentry#1{
+ \gdef\pagenumbertext{\string\seeentry{#1}}%
+}
+
+% The default definitions
+\def\sortas#1{}%
+\def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only
+\def\putwordSeeAlso{See also}
+\def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only
+
+
+% Given index entry text like "aaa @subentry bbb @sortas{ZZZ}":
+% * Set \bracedtext to "{aaa}{bbb}"
+% * Set \fullindexsortkey to "aaa @subentry ZZZ"
+% * If @seealso occurs, set \pagenumbertext
+%
+\def\splitindexentry#1{%
+ \gdef\fullindexsortkey{}%
+ \xdef\bracedtext{}%
+ \def\sep{}%
+ \def\seealso##1{}%
+ \def\seeentry##1{}%
+ \expandafter\doindexsegment#1\subentry\finish\subentry
+}
+
+% append the results from the next segment
+\def\doindexsegment#1\subentry{%
+ \def\segment{#1}%
+ \ifx\segment\isfinish
+ \else
+ %
+ % Fully expand the segment, throwing away any @sortas directives, and
+ % trim spaces.
+ \edef\trimmed{\segment}%
+ \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+ %
+ \xdef\bracedtext{\bracedtext{\trimmed}}%
+ %
+ % Get the string to sort by. Process the segment with all
+ % font commands turned off.
+ \bgroup
+ \let\sortas\indexwritesortas
+ \let\seealso\indexwriteseealso
+ \let\seeentry\indexwriteseeentry
+ \indexnofonts
+ % The braces around the commands are recognized by texindex.
+ \def\lbracechar{{\string\indexlbrace}}%
+ \def\rbracechar{{\string\indexrbrace}}%
+ \let\{=\lbracechar
+ \let\}=\rbracechar
+ \def\@{{\string\indexatchar}}%
+ \def\atchar##1{\@}%
+ \def\backslashchar{{\string\indexbackslash}}%
+ \uccode`\~=`\\ \uppercase{\let~\backslashchar}%
+ %
+ \let\indexsortkey\empty
+ \global\let\pagenumbertext\empty
+ % Execute the segment and throw away the typeset output. This executes
+ % any @sortas or @seealso commands in this segment.
+ \setbox\dummybox = \hbox{\segment}%
+ \ifx\indexsortkey\empty{%
+ \indexnonalnumdisappear
+ \xdef\trimmed{\segment}%
+ \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+ \xdef\indexsortkey{\trimmed}%
+ \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
+ }\fi
+ %
+ % Append to \fullindexsortkey.
+ \edef\tmp{\gdef\noexpand\fullindexsortkey{%
+ \fullindexsortkey\sep\indexsortkey}}%
+ \tmp
+ \egroup
+ \def\sep{\subentry}%
+ %
+ \expandafter\doindexsegment
+ \fi
+}
+\def\isfinish{\finish}%
+\newbox\dummybox % used above
+
+\let\subentry\relax
+
+% Use \ instead of @ in index files. To support old texi2dvi and texindex.
+% This works without changing the escape character used in the toc or aux
+% files because the index entries are fully expanded here, and \string uses
+% the current value of \escapechar.
+\def\escapeisbackslash{\escapechar=`\\}
+
+% Use \ in index files by default. texi2dvi didn't support @ as the escape
+% character (as it checked for "\entry" in the files, and not "@entry"). When
+% the new version of texi2dvi has had a chance to become more prevalent, then
+% the escape character can change back to @ again. This should be an easy
+% change to make now because both @ and \ are only used as escape characters in
+% index files, never standing for themselves.
+%
+\set txiindexescapeisbackslash
+
+% Write the entry in \indextext to the index file.
+%
+\def\doindwrite{%
+ \maybemarginindex
+ %
+ \atdummies
+ %
+ \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else
+ \escapeisbackslash
+ \fi
+ %
+ % For texindex which always views { and } as separators.
+ \def\{{\lbracechar{}}%
+ \def\}{\rbracechar{}}%
+ \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}%
+ %
+ % Split the entry into primary entry and any subentries, and get the index
+ % sort key.
+ \splitindexentry\indextext
+ %
+ % 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{\fullindexsortkey}%
+ {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}%
+ \bracedtext}%
+ }%
+ \temp
+}
+
+% Put the index entry in the margin if desired (undocumented).
+\def\maybemarginindex{%
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}%
+ \fi
+}
+\let\SETmarginindex=\relax
+
+
+% 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
+ % -\whatsitskip 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}
+% \entry {topic}{}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+% \secondary {subtopic}{}
+% for a subtopic with sub-subtopics
+% \tertiary {subtopic}{subsubtopic}{pagelist}
+% for each sub-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}
+
+% 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 comment in \requireopenindexfile.
+ \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
+ %
+ % See if the index file exists and is nonempty.
+ \openin 1 \jobname.\indexname s
+ \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
+ \typeout{No file \jobname.\indexname s.}%
+ \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 \thisline
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ \expandafter\printindexzz\thisline\relax\relax\finish%
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% If the index file starts with a backslash, forgo reading the index
+% file altogether. If somebody upgrades texinfo.tex they may still have
+% old index files using \ as the escape character. Reading this would
+% at best lead to typesetting garbage, at worst a TeX syntax error.
+\def\printindexzz#1#2\finish{%
+ \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax
+ \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
+ \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax
+\errmessage{%
+ERROR: A sorted index file in an obsolete format was skipped.
+To fix this problem, please upgrade your version of 'texi2dvi'
+or 'texi2pdf' to that at <https://ftp.gnu.org/gnu/texinfo>.
+If you are using an old version of 'texindex' (part of the Texinfo
+distribution), you may also need to upgrade to a newer version (at least 6.0).
+You may be able to typeset the index if you run
+'texindex \jobname.\indexname' yourself.
+You could also try setting the 'txiindexescapeisbackslash' flag by
+running a command like
+'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'. If you do
+this, Texinfo will try to use index files in the old format.
+If you continue to have problems, deleting the index files and starting again
+might help (with 'rm \jobname.?? \jobname.??s')%
+}%
+ \else
+ (Skipped sorted index file in obsolete format)
+ \fi
+ \else
+ \begindoublecolumns
+ \input \jobname.\indexname s
+ \enddoublecolumns
+ \fi
+ \else
+ \begindoublecolumns
+ \catcode`\\=0\relax
+ \catcode`\@=12\relax
+ \input \jobname.\indexname s
+ \enddoublecolumns
+ \fi
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialglyphs{%
+ % special control sequences used in the index sort key
+ \let\indexlbrace\{%
+ \let\indexrbrace\}%
+ \let\indexatchar\@%
+ \def\indexbackslash{\math{\backslash}}%
+ %
+ % Some changes for non-alphabetic characters. Using the glyphs from the
+ % math fonts looks more consistent than the typewriter font used elsewhere
+ % for these characters.
+ \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}}
+ %
+ % In case @\ is used for backslash
+ \uppercase{\let\\=~}
+ % Can't get bold backslash so don't use bold forward slash
+ \catcode`\/=13
+ \def/{{\secrmnotbold \normalslash}}%
+ \def-{{\normaldash\normaldash}}% en dash `--'
+ \def^{{\chapbf \normalcaret}}%
+ \def~{{\chapbf \normaltilde}}%
+ \def\_{%
+ \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
+ \def|{$\vert$}%
+ \def<{$\less$}%
+ \def>{$\gtr$}%
+ \def+{$\normalplus$}%
+}}
+
+\def\initial{%
+ \bgroup
+ \initialglyphs
+ \initialx
+}
+
+\def\initialx#1{%
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ % The glue before the bonus allows a little bit of space at the
+ % bottom of a column to reduce an increase in inter-line spacing.
+ \nobreak
+ \vskip 0pt plus 5\baselineskip
+ \penalty -300
+ \vskip 0pt plus -5\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 1\baselineskip
+ \leftline{\secfonts \kern-0.05em \secbf #1}%
+ % \secfonts is inside the argument of \leftline so that the change of
+ % \baselineskip will not affect any glue inserted before the vbox that
+ % \leftline creates.
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+ \egroup % \initialglyphs
+}
+
+\newdimen\entryrightmargin
+\entryrightmargin=0pt
+
+% \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.
+%
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % When reading the text of entry, convert explicit line breaks
+ % from @* into spaces. The user might give these in long section
+ % titles, for instance.
+ \def\*{\unskip\space\ignorespaces}%
+ \def\entrybreak{\hfil\break}% An undocumented command
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+ % Save the text of the entry
+ \global\setbox\boxA=\hbox\bgroup
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+ % Not absorbing as a macro argument reduces the chance of problems
+ % with catcodes occurring.
+}
+{\catcode`\@=11
+\gdef\finishentry#1{%
+ \egroup % end box A
+ \dimen@ = \wd\boxA % Length of text of entry
+ \global\setbox\boxA=\hbox\bgroup
+ \unhbox\boxA
+ % #1 is the page number.
+ %
+ % Get the width of the page numbers, and only use
+ % leaders if they are present.
+ \global\setbox\boxB = \hbox{#1}%
+ \ifdim\wd\boxB = 0pt
+ \null\nobreak\hfill\ %
+ \else
+ %
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ \ifpdforxetex
+ \pdfgettoks#1.%
+ \hskip\skip\thinshrinkable\the\toksA
+ \else
+ \hskip\skip\thinshrinkable #1%
+ \fi
+ \fi
+ \egroup % end \boxA
+ \ifdim\wd\boxB = 0pt
+ \noindent\unhbox\boxA\par
+ \nobreak
+ \else\bgroup
+ % We want the text of the entries to be aligned to the left, and the
+ % page numbers to be aligned to the right.
+ %
+ \parindent = 0pt
+ \advance\leftskip by 0pt plus 1fil
+ \advance\leftskip by 0pt plus -1fill
+ \rightskip = 0pt plus -1fil
+ \advance\rightskip by 0pt plus 1fill
+ % Cause last line, which could consist of page numbers on their own
+ % if the list of page numbers is long, to be aligned to the right.
+ \parfillskip=0pt plus -1fill
+ %
+ \advance\rightskip by \entryrightmargin
+ % Determine how far we can stretch into the margin.
+ % This allows, e.g., "Appendix H GNU Free Documentation License" to
+ % fit on one line in @letterpaper format.
+ \ifdim\entryrightmargin>2.1em
+ \dimen@i=2.1em
+ \else
+ \dimen@i=0em
+ \fi
+ \advance \parfillskip by 0pt minus 1\dimen@i
+ %
+ \dimen@ii = \hsize
+ \advance\dimen@ii by -1\leftskip
+ \advance\dimen@ii by -1\entryrightmargin
+ \advance\dimen@ii by 1\dimen@i
+ \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
+ \ifdim\dimen@ > 0.8\dimen@ii % due to long index text
+ % Try to split the text roughly evenly. \dimen@ will be the length of
+ % the first line.
+ \dimen@ = 0.7\dimen@
+ \dimen@ii = \hsize
+ \ifnum\dimen@>\dimen@ii
+ % If the entry is too long (for example, if it needs more than
+ % two lines), use all the space in the first line.
+ \dimen@ = \dimen@ii
+ \fi
+ \advance\leftskip by 0pt plus 1fill % ragged right
+ \advance \dimen@ by 1\rightskip
+ \parshape = 2 0pt \dimen@ 0em \dimen@ii
+ % Ideally we'd add a finite glue at the end of the first line only,
+ % instead of using \parshape with explicit line lengths, but TeX
+ % doesn't seem to provide a way to do such a thing.
+ %
+ % Indent all lines but the first one.
+ \advance\leftskip by 1em
+ \advance\parindent by -1em
+ \fi\fi
+ \indent % start paragraph
+ \unhbox\boxA
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % Word spacing - no stretch
+ \spaceskip=\fontdimen2\font minus \fontdimen4\font
+ %
+ \linepenalty=1000 % Discourage line breaks.
+ \hyphenpenalty=5000 % Discourage hyphenation.
+ %
+ \par % format the paragraph
+ \egroup % The \vbox
+ \fi
+ \endgroup
+}}
+
+\newskip\thinshrinkable
+\skip\thinshrinkable=.15em minus .15em
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+% The filll stretch here overpowers both the fil and fill stretch to push
+% the page number to the right.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
+
+
+\def\primary #1{\line{#1\hfil}}
+
+\def\secondary{\indententry{0.5cm}}
+\def\tertiary{\indententry{1cm}}
+
+\def\indententry#1#2#3{%
+ \bgroup
+ \leftskip=#1
+ \entry{#2}{#3}%
+ \egroup
+}
+
+% 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 % private names
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % If not much space left on page, start a new page.
+ \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
+ %
+ % Grab any single-column material above us.
+ \output = {%
+ \savetopmark
+ %
+ \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
+ %
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \advance\vsize by -\ht\partialpage
+ \vsize = 2\vsize
+ %
+ % For the benefit of balancing columns
+ \advance\baselineskip by 0pt plus 0.5pt
+}
+
+% The double-column output routine for all double-column pages except
+% the last, which is done by \balancecolumns.
+%
+\def\doublecolumnout{%
+ %
+ \savetopmark
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
+ \global\advance\vsize by 2\ht\partialpage
+ \onepageout\pagesofar % empty except for the first time we are called
+ \unvbox\PAGE
+ \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\txipagewidth{\box0\hfil\box2}%
+}
+
+
+% Finished 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 \txipageheight (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.
+ \savetopmark
+ \balancecolumns
+ }%
+ \eject % call the \output just set
+ \ifdim\pagetotal=0pt
+ % Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away.
+ \global\output=\expandafter{\the\defaultoutput}
+ %
+ \endgroup % started in \begindoublecolumns
+ % Leave the double-column material on the current page, no automatic
+ % page break.
+ \box\balancedcolumns
+ %
+ % \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.
+ \global\vsize = \txipageheight %
+ \pagegoal = \txipageheight %
+ \else
+ % We had some left-over material. This might happen when \doublecolumnout
+ % is called in \balancecolumns. Try again.
+ \expandafter\enddoublecolumns
+ \fi
+}
+\newbox\balancedcolumns
+\setbox\balancedcolumns=\vbox{shouldnt see this}%
+%
+% Only called for the last of the double column material. \doublecolumnout
+% does the others.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \ifdim\dimen@<7\baselineskip
+ % Don't split a short final column in two.
+ \setbox2=\vbox{}%
+ \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+ \else
+ % double the leading vertical space
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ \dimen@ii = \dimen@
+ \splittopskip = \topskip
+ % Loop until left column is at least as high as the right column.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht1<\ht3
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ % Now the left column is in box 1, and the right column in box 3.
+ %
+ % Check whether the left column has come out higher than the page itself.
+ % (Note that we have doubled \vsize for the double columns, so
+ % the actual height of the page is 0.5\vsize).
+ \ifdim2\ht1>\vsize
+ % It appears that we have been called upon to balance too much material.
+ % Output some of it with \doublecolumnout, leaving the rest on the page.
+ \setbox\PAGE=\box0
+ \doublecolumnout
+ \else
+ % Compare the heights of the two columns.
+ \ifdim4\ht1>5\ht3
+ % Column heights are too different, so don't make their bottoms
+ % flush with each other.
+ \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
+ \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
+ \else
+ % Make column bottoms flush with each other.
+ \setbox2=\vbox to\ht1{\unvbox3\unskip}%
+ \setbox0=\vbox to\ht1{\unvbox1\unskip}%
+ \fi
+ \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+ \fi
+ \fi
+ %
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+ \chapoddpage
+ \null
+ \vskip.3\vsize % move it down on the page a bit
+ \begingroup
+ \noindent \titlefonts\rm #1\par % the text
+ \let\lastnode=\empty % no node to associate with
+ \writetocentry{part}{#1}{}% but put it in the toc
+ \headingsoff % no headline or footline on the part page
+ % This outputs a mark at the end of the page that clears \thischapter
+ % and \thissection, as is done in \startcontents.
+ \let\pchapsepmacro\relax
+ \chapmacro{}{Yomitfromtoc}{}%
+ \chapoddpage
+ \endgroup
+}
+
+% \unnumberedno is an oxymoron. 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 these (using marks) as the number+name, number
+% and name of the chapter. Page headings and footings can use
+% these. @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\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}
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \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 < \unnlevel
+ \chardef\unnlevel = \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 > \unnlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unnlevel = 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
+ %
+ % \putwordChapter can contain complex things in translations.
+ \toks0=\expandafter{\putwordChapter}%
+ \message{\the\toks0 \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 calls appendixzzz
+%
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ % \putwordAppendix can contain complex things in translations.
+ \toks0=\expandafter{\putwordAppendix}%
+ \message{\the\toks0 \space \appendixletter}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\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{%
+ \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}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+%
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+%
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\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
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ \vbox{\chapfonts \raggedtitlesettings #1\par}%
+ \nobreak\bigskip \nobreak
+ \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}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+
+% Start a new page
+\def\chappager{\par\vfill\supereject}
+
+% \chapoddpage - start on an odd page for a new chapter
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong. But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+ \chappager
+ \ifodd\pageno \else
+ \begingroup
+ \headingsoff
+ \null
+ \chappager
+ \endgroup
+ \fi
+}
+
+\parseargdef\setchapternewpage{\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
+
+% \chapmacro - Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% Not used for @heading series.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yappendixkeyword{Yappendix}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+%
+\def\chapmacro#1#2#3{%
+ \expandafter\ifx\thisenv\titlepage\else
+ \checkenv{}% chapters, etc., should not start inside an environment.
+ \fi
+ % Insert the first mark before the heading break (see notes for \domark).
+ \let\prevchapterdefs=\currentchapterdefs
+ \let\prevsectiondefs=\currentsectiondefs
+ \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+ \gdef\thissection{}}%
+ %
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{\thischaptername}}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{}}%
+ \else\ifx\temptype\Yappendixkeyword
+ \toks0={#1}%
+ \xdef\currentchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\appendixletter}%
+ % \noexpand\putwordAppendix avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \else
+ \toks0={#1}%
+ \xdef\currentchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\the\chapno}%
+ % \noexpand\putwordChapter avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+ \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \fi\fi\fi
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert the chapter heading break.
+ \pchapsepmacro
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevchapterdefs=\currentchapterdefs
+ \let\prevsectiondefs=\currentsectiondefs
+ \domark
+ %
+ {%
+ \chapfonts \rm
+ \let\footnote=\errfootnoteheading % give better error message
+ %
+ % Have to define \currentsection 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\currentsection{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \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.
+ \nobreak % Avoid page breaks at the interline glue.
+ \vbox{\raggedtitlesettings \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
+}
+
+
+% 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 of the title,
+% #2 is the section level (sec/subsec/subsubsec),
+% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
+% #4 is the section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ % It is ok for the @heading series commands to appear inside an
+ % environment (it's been historically allowed, though the logic is
+ % dubious), but not the others.
+ \ifx\temptype\Yomitfromtockeyword\else
+ \checkenv{}% non-@*heading should not be in an environment.
+ \fi
+ \let\footnote=\errfootnoteheading
+ %
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ % Insert first mark before the heading break (see notes for \domark).
+ \let\prevsectiondefs=\currentsectiondefs
+ \ifx\temptype\Ynothingkeyword
+ \ifx\sectionlevel\seckeyword
+ \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+ \gdef\thissection{\thissectionname}}%
+ \fi
+ \else\ifx\temptype\Yomitfromtockeyword
+ % Don't redefine \thissection.
+ \else\ifx\temptype\Yappendixkeyword
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\currentsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \else
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\currentsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ % \noexpand\putwordSection avoids expanding indigestible
+ % commands in some of the translations.
+ \gdef\noexpand\thissection{\noexpand\putwordSection{}
+ \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \fi\fi\fi
+ %
+ % Go into vertical mode. Usually we'll already be there, but we
+ % don't want the following whatsit to end up in a preceding paragraph
+ % if the document didn't happen to have a blank line.
+ \par
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \global\let\prevsectiondefs=\currentsectiondefs
+ \domark
+ %
+ % Only insert the space after the number if we have a section number.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\currentsection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \currentsection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\currentsection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\currentsection{#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 \ptexraggedright
+ \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.) However, when a paragraph is not started next
+ % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+ % or the negative glue will cause weirdly wrong output, typically
+ % obscuring the section heading with something else.
+ \vskip-\parskip
+ %
+ % This is so the last item on the main vertical list is a known
+ % \penalty > 10000, so \startdefun, etc., can recognize the situation
+ % and do the needful.
+ \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'.
+ \ifpdforxetex
+ \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 \tocreadfilename
+}
+
+\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.
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \entryrightmargin=\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref. We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \tocreadfilename\space
+ \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\partentry = \shortpartentry
+ \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 \tocreadfilename\space
+ \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, ...
+
+% Parts, in the main contents. Replace the part number, which doesn't
+% exist, with an empty box. Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{%
+ % Add stretch and a bonus for breaking the page before the part heading.
+ % This reduces the chance of the page being broken immediately after the
+ % part heading, before a following chapter heading.
+ \vskip 0pt plus 5\baselineskip
+ \penalty-300
+ \vskip 0pt plus -5\baselineskip
+ \dochapentry{\numeralbox\labelspace#1}{}%
+}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+ \penalty-300
+ \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+ \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% 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}\hskip.7em#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
+ % Move the page numbers slightly to the right
+ \advance\entryrightmargin by -0.05em
+ \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.
+
+% @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 @ character.
+
+\envdef\tex{%
+ \setupmarkupstyle{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
+ \catcode `\`=\other
+ \catcode `\'=\other
+ %
+ % ' is active in math mode (mathcode"8000). So reset it, and all our
+ % other math active characters (just in case), to plain's definitions.
+ \mathactive
+ %
+ % Inverse of the list at the beginning of the file.
+ \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\sp=\ptexsp
+ \let\*=\ptexstar
+ %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
+ \let\t=\ptext
+ \expandafter \let\csname top\endcsname=\ptextop % we've made it outer
+ \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
+ \ifnum\lastpenalty<10000
+ % Penalize breaking before the environment, because preceding text
+ % often leads into it.
+ \penalty100
+ \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\def\afterenvbreak{{%
+ % =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
+}}
+
+% \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.
+
+%
+\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
+
+% only require the font if @cartouche is actually used
+\def\cartouchefontdefs{%
+ \font\circle=lcircle10\relax
+ \circthick=\fontdimen8\circle
+}
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+
+
+\envdef\cartouche{%
+ \cartouchefontdefs
+ \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
+ %
+ % If this cartouche directly follows a sectioning command, we need the
+ % \parskip glue (backspaced over by default) or the cartouche can
+ % collide with the section heading.
+ \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+ %
+ \setbox\groupbox=\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
+ \addgroupbox
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+ \aboveenvbreak
+ \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % 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
+ % Turn off paragraph indentation but redefine \indent to emulate
+ % the normal \indent.
+ \nonfillparindent=\parindent
+ \parindent = 0pt
+ \let\indent\nonfillindent
+ %
+ \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
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% 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 in one command. #1 is the env name, #2 the definition.
+\def\makedispenvdef#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 environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+ \makedispenvdef{#1}{#3}%
+ \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+ \nonfillstart
+ \tt\setupmarkupstyle{example}%
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{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\relax
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification. From plain.tex.
+\envdef\raggedright{%
+ \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+ \parindent=0pt \leftskip0pt plus2em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+ \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+ \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+ \hbadness=10000 % Last line will usually be underfull, so turn off
+ % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @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.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+ \indentedblockstart % same as \indentedblock, but increase right margin too.
+ \ifx\nonarrowing\relax
+ \advance\rightskip by \lispnarrowing
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\thisisundefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% 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
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+%
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+ {\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
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+ \par
+ {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% 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\"%
+ % Don't do the quotes -- if we do, @set txicodequoteundirected and
+ % @set txicodequotebacktick will not have effect on @verb and
+ % @verbatim, and ?` and !` ligatures won't get disabled.
+ %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% 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}%
+ \setupmarkupstyle{verb}%
+ \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
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs. The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group. Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset. Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+ \divide\dimen\verbbox by\tabw
+ \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+ \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw
+ \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+ }%
+ }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \tt % easiest (and conventionally used) font for verbatim
+ % The \leavevmode here is for blank lines. Otherwise, we would
+ % never \starttabbox and the \egroup would end verbatim mode.
+ \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+ \tabexpand
+ \setupmarkupstyle{verbatim}%
+ % 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
+ {%
+ \indexnofonts % Allow `@@' and other weird things in file names.
+ \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+ \edef\tmp{\noexpand\input #1 }
+ \expandafter
+ }\tmp
+ \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 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 further 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\relax
+ \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 remaining 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 { (defn. of \deffnheader) }
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \doingtypefnfalse % distinguish typed functions from all else
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+\newif\ifdoingtypefn % doing typed function?
+\newif\ifrettypeownline % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line. This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+%
+\parseargdef\deftypefnnewline{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETtxideftypefnnl\endcsname
+ = \empty
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETtxideftypefnnl\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @txideftypefnnl value `\temp',
+ must be on|off}%
+ \fi\fi
+}
+
+% \dosubind {index}{topic}{subtopic}
+%
+% If SUBTOPIC is present, precede it with a space, and call \doind.
+% (At some time during the 20th century, this made a two-level entry in an
+% index such as the operation index. Nobody seemed to notice the change in
+% behaviour though.)
+\def\dosubind#1#2#3{%
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty
+ \doind{#1}{#2}%
+ \else
+ \doind{#1}{#2\space#3}%
+ \fi
+}
+
+% 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{%
+ \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}%
+ \doingtypefntrue
+ \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 {} }
+
+% Types:
+
+% @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{%
+ \par
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % Determine if we are typesetting the return type of a typed function
+ % on a line by itself.
+ \rettypeownlinefalse
+ \ifdoingtypefn % doing a typed function specifically?
+ % then check user option for putting return type on its own line:
+ \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+ \rettypeownlinetrue
+ \fi
+ \fi
+ %
+ % How we'll format the category 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. We'll always have at
+ % least two.
+ \tempnum = 2
+ %
+ % 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
+ %
+ % If doing a return type on its own line, we'll have another line.
+ \ifrettypeownline
+ \advance\tempnum by 1
+ \def\maybeshapeline{0in \hsize}%
+ \else
+ \def\maybeshapeline{}%
+ \fi
+ %
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ %
+ % The final paragraph shape:
+ \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2
+ %
+ % Put the category name at 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}% text of the return type
+ \ifx\temp\empty\else
+ \tclose{\temp}% typeset the return type
+ \ifrettypeownline
+ % put return type on its own line; prohibit line break following:
+ \hfil\vadjust{\nobreak}\break
+ \else
+ \space % type on same line, so just followed by a space
+ \fi
+ \fi % no return type
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \rmfont
+ %
+ \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. We used to recommend @var for that, so
+ % leave the code in, but it's strange for @var to lead to typewriter.
+ % Nowadays we recommend @code, since the difference between a ttsl hyphen
+ % and a tt hyphen is pretty tiny. @code also disables ?` !`.
+ \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+ #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}
+}
+\let\ampchar\&
+
+\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
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+ \message{Warning: unbalanced parentheses in @def...}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \message{Warning: unbalanced square brackets 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\thisisundefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+% Used at the time of macro expansion.
+% Argument is macro body with arguments substituted
+\def\scanmacro#1{%
+ \newlinechar`\^^M
+ \def\xeatspaces{\eatspaces}%
+ %
+ % Process the macro body under the current catcode regime.
+ \scantokens{#1@comment}%
+ %
+ % The \comment is to remove the \newlinechar added by \scantokens, and
+ % can be noticed by \parsearg. Note \c isn't used because this means cedilla
+ % in math mode.
+}
+
+% Used for copying and captions
+\def\scanexp#1{%
+ \expandafter\scanmacro\expandafter{#1}%
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \commondummyword\macro1\commondummyword\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\commondummyword#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 \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion. Must do this non-globally, to
+% confine the change to the current group.
+%
+% 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{% used as subroutine
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+ \passthroughcharstrue
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+ \scanctxt
+ \catcode`\@=\other
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+ \scanctxt
+ \catcode`\ =\other
+ \catcode`\@=\other
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+% Used when scanning braced macro arguments. Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\ =\active
+ \catcode`\@=\other
+ \catcode`\^^M=\other
+ \catcode`\\=\active
+}
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+ \scanctxt
+ \catcode`\@=\other
+ \catcode`\{=\other
+ \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\margbackslash#1{\char`\#1 }
+
+\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\relax
+ \else
+ \expandafter\parsemargdef \argl;%
+ \if\paramno>256\relax
+ \ifx\eTeXversion\thisisundefined
+ \errhelp = \EMsimple
+ \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+ \fi
+ \fi
+ \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\commondummyword\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\commondummyword \noexpand#1%
+ \fi
+}
+
+% \getargs -- Parse the arguments to a @macro line. Set \macname to
+% the name of the macro, and \argl to the braced argument list.
+\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}}
+% This made use of the 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.
+
+% Parse the optional {params} list to @macro or @rmacro.
+% Set \paramno to the number of arguments,
+% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
+% three-param macro.) Define \macarg.BLAH for each BLAH in the params
+% list to some hook where the argument is to be expanded. If there are
+% less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.
+%
+% That gets used by \mbodybackslash (above).
+%
+% If there are 10 or more arguments, a different technique is used: see
+% \parsemmanyargdef.
+%
+\def\parsemargdef#1;{%
+ \paramno=0\def\paramlist{}%
+ \let\hash\relax
+ % \hash is redefined to `#' later to get it into definitions
+ \let\xeatspaces\relax
+ \parsemargdefxxx#1,;,%
+ \ifnum\paramno<10\relax\else
+ \paramno0\relax
+ \parsemmanyargdef@@#1,;,% 10 or more arguments
+ \fi
+}
+\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}
+
+% \parsemacbody, \parsermacbody
+%
+% Read recursive and nonrecursive macro bodies. (They're different since
+% rec and nonrec macros end differently.)
+%
+% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro
+% body to be transformed.
+% Set \macrobody to the body of the macro, and call \defmacro.
+%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+
+% Make @ a letter, so that we can make private-to-Texinfo macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+%%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%%
+
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef the body (nothing else will expand because of
+% the catcode regime under which the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, no macro can have more than 256 arguments (else error).
+%
+% In case that there are 10 or more arguments we parse again the arguments
+% list to set new definitions for the \macarg.BLAH macros corresponding to
+% each BLAH argument. It was anyhow needed to parse already once this list
+% in order to count the arguments, and as macros with at most 9 arguments
+% are by far more frequent than macro with 10 or more arguments, defining
+% twice the \macarg.BLAH macros does not cost too much processing power.
+\def\parsemmanyargdef@@#1,{%
+ \if#1;\let\next=\relax
+ \else
+ \let\next=\parsemmanyargdef@@
+ \edef\tempb{\eatspaces{#1}}%
+ \expandafter\def\expandafter\tempa
+ \expandafter{\csname macarg.\tempb\endcsname}%
+ % Note that we need some extra \noexpand\noexpand, this is because we
+ % don't want \the to be expanded in the \parsermacbody as it uses an
+ % \xdef .
+ \expandafter\edef\tempa
+ {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+ \advance\paramno by 1\relax
+ \fi\next}
+
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition. It gets all the arguments' values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+ \def\macargdeflist@{}%
+ \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+ \def\paramlist{#2,\nil@}%
+ \def\macroname{#1}%
+ \begingroup
+ \macroargctxt
+ \def\argvaluelist{#3,\nil@}%
+ \def\@tempa{#3}%
+ \ifx\@tempa\empty
+ \setemptyargvalues@
+ \else
+ \getargvals@@
+ \fi
+}
+\def\getargvals@@{%
+ \ifx\paramlist\nilm@
+ % Some sanity check needed here that \argvaluelist is also empty.
+ \ifx\argvaluelist\nillm@
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Too many arguments in macro `\macroname'!}%
+ \fi
+ \let\next\macargexpandinbody@
+ \else
+ \ifx\argvaluelist\nillm@
+ % No more arguments values passed to macro. Set remaining named-arg
+ % macros to empty.
+ \let\next\setemptyargvalues@
+ \else
+ % pop current arg name into \@tempb
+ \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+ \expandafter\@tempa\expandafter{\paramlist}%
+ % pop current argument value into \@tempc
+ \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+ \expandafter\@tempa\expandafter{\argvaluelist}%
+ % Here \@tempb is the current arg name and \@tempc is the current arg value.
+ % First place the new argument macro definition into \@tempd
+ \expandafter\macname\expandafter{\@tempc}%
+ \expandafter\let\csname macarg.\@tempb\endcsname\relax
+ \expandafter\def\expandafter\@tempe\expandafter{%
+ \csname macarg.\@tempb\endcsname}%
+ \edef\@tempd{\long\def\@tempe{\the\macname}}%
+ \push@\@tempd\macargdeflist@
+ \let\next\getargvals@@
+ \fi
+ \fi
+ \next
+}
+
+\def\push@#1#2{%
+ \expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter#2%
+ \expandafter\expandafter\expandafter{%
+ \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa.
+%
+\def\macvalstoargs@{%
+ % To do this we use the property that token registers that are \the'ed
+ % within an \edef expand only once. So we are going to place all argument
+ % values into respective token registers.
+ %
+ % First we save the token context, and initialize argument numbering.
+ \begingroup
+ \paramno0\relax
+ % Then, for each argument number #N, we place the corresponding argument
+ % value into a new token list register \toks#N
+ \expandafter\putargsintokens@\saveparamlist@,;,%
+ % Then, we expand the body so that argument are replaced by their
+ % values. The trick for values not to be expanded themselves is that they
+ % are within tokens and that tokens expand only once in an \edef .
+ \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+ % Now we restore the token stack pointer to free the token list registers
+ % which we have used, but we make sure that expanded body is saved after
+ % group.
+ \expandafter
+ \endgroup
+ \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+ }
+
+% Define the named-macro outside of this group and then close this group.
+%
+\def\macargexpandinbody@{%
+ \expandafter
+ \endgroup
+ \macargdeflist@
+ % First the replace in body the macro arguments by their values, the result
+ % is in \@tempa .
+ \macvalstoargs@
+ % Then we point at the \norecurse or \gobble (for recursive) macro value
+ % with \@tempb .
+ \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+ % Depending on whether it is recursive or not, we need some tailing
+ % \egroup .
+ \ifx\@tempb\gobble
+ \let\@tempc\relax
+ \else
+ \let\@tempc\egroup
+ \fi
+ % And now we do the real job:
+ \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+ \@tempd
+}
+
+\def\putargsintokens@#1,{%
+ \if#1;\let\next\relax
+ \else
+ \let\next\putargsintokens@
+ % First we allocate the new token list register, and give it a temporary
+ % alias \@tempb .
+ \toksdef\@tempb\the\paramno
+ % Then we place the argument value into that token list register.
+ \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+ \expandafter\@tempb\expandafter{\@tempa}%
+ \advance\paramno by 1\relax
+ \fi
+ \next
+}
+
+% Trailing missing arguments are set to empty.
+%
+\def\setemptyargvalues@{%
+ \ifx\paramlist\nilm@
+ \let\next\macargexpandinbody@
+ \else
+ \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+ \let\next\setemptyargvalues@
+ \fi
+ \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+ \expandafter\def\expandafter\@tempa\expandafter{%
+ \expandafter\def\csname macarg.#1\endcsname{}}%
+ \push@\@tempa\macargdeflist@
+ \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+ \def#1{#3}%
+ \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+ \long\def#1{#3}%
+ \long\def#2{#4}%
+}
+
+
+%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
+
+
+% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
+% \macrobody has the body of the macro in it, with placeholders for
+% its parameters, looking like "\xeatspaces{\hash 1}".
+% \paramno is the number of parameters
+% \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
+% There are four cases: macros of zero, one, up to nine, and many arguments.
+% \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
+ \ifnum\paramno=1
+ \def\xeatspaces##1{##1}%
+ % This removes the pair of braces around the argument. We don't
+ % use \eatspaces, because this can cause ends of lines to be lost
+ % when the argument to \eatspaces is read, leading to line-based
+ % commands like "@itemize" not being read correctly.
+ \else
+ \let\xeatspaces\relax % suppress expansion
+ \fi
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\spaceisspace
+ \noexpand\endlineisspace
+ \noexpand\expandafter % skip any whitespace after the macro name.
+ \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname{%
+ \egroup
+ \noexpand\scanmacro{\macrobody}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \egroup
+ \noexpand\scanmacro{\macrobody}%
+ }%
+ \else % at most 9
+ \ifnum\paramno<10\relax
+ % @MACNAME sets the context for reading the macro argument
+ % @MACNAME@@ gets the argument, processes backslashes and appends a
+ % comma.
+ % @MACNAME@@@ removes braces surrounding the argument list.
+ % @MACNAME@@@@ scans the macro body with arguments substituted.
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup
+ \noexpand\expandafter % This \expandafter skip any spaces after the
+ \noexpand\macroargctxt % macro before we change the catcode of space.
+ \noexpand\expandafter
+ \expandafter\noexpand\csname\the\macname @@\endcsname}%
+ \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+ \noexpand\passargtomacro
+ \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+ \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname @@@@\endcsname\paramlist{%
+ \egroup\noexpand\scanmacro{\macrobody}}%
+ \else % 10 or more:
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\getargvals@{\the\macname}{\argl}%
+ }%
+ \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+ \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+ \fi
+ \fi}
+
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape
+@catcode`@_=11 % private names
+@catcode`@!=11 % used as argument separator
+
+% \passargtomacro#1#2 -
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use
+% \def or similar). This reduces the risk of this failing in contexts where
+% complete expansion is done with no execution (for example, in writing out to
+% an auxiliary file for an index entry).
+%
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
+@gdef@passargtomacro#1#2{%
+ @add_segment #1!{}@relax#2\@_finish\%
+}
+@gdef@_finish{@_finishx} @global@let@_finishx@relax
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument;
+% otherwise, remove the next token.
+@gdef@look_ahead#1!#2#3#4{%
+ @ifx#4\%
+ @expandafter@gobble_and_check_finish
+ @else
+ @expandafter@add_segment
+ @fi#1!{#2}#4#4%
+}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found. Add a single backslash, and look ahead.
+@gdef@gobble_and_check_finish#1!#2#3#4#5{%
+ @add_segment#1\!{}#5#5%
+}
+
+@gdef@is_fi{@fi}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
+% Input stream is either at the start of the argument, or just after a
+% backslash sequence, either a lone backslash, or a doubled backslash.
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish,
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash. PENDING_BACKSLASH contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to ARG_RESULT.
+@gdef@add_segment#1!#2#3#4\{%
+@ifx#3@_finish
+ @call_the_macro#1!%
+@else
+ % append the pending backslash to the result, followed by the next segment
+ @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
+ % this @fi is discarded by @look_ahead.
+ % we can't get rid of it with \expandafter because we don't know how
+ % long #4 is.
+}
+
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the
+% conditional.
+@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
+
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \braceorline MAC is used for a one-argument macro MAC. It checks
+% whether the next non-whitespace character is a {. It sets the context
+% for reading the argument (slightly different in the two cases). Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+%
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup
+ \macroargctxt
+ \expandafter\passargtomacro
+ \else
+ \macrolineargctxt\expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. 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}\omittopnode}
+
+% Used so that the @top node doesn't have to be wrapped in an @ifnottex
+% conditional.
+% \doignore goes to more effort to skip nested conditionals but we don't need
+% that here.
+\def\omittopnode{%
+ \ifx\lastnode\wordTop
+ \expandafter\ignorenode\fi
+}
+\def\wordTop{Top}
+
+% Until the next @node or @bye command, divert output to a box that is not
+% output.
+\def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}%
+\ignorenodebye
+}
+
+{\let\bye\relax
+\gdef\ignorenodebye{\let\bye\ignorenodebyedef}
+\gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}}
+% The redefinition of \bye here is because it is declared \outer
+
+\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 \currentsection,
+% 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
+ {%
+ \requireauxfile
+ \atdummies % preserve commands, but don't expand them
+ % match definition in \xrdef, \refx, \xrefX.
+ \def\value##1{##1}%
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\currentsection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+ }%
+ \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+%
+\parseargdef\xrefautomaticsectiontitle{%
+ \def\temp{#1}%
+ \ifx\temp\onword
+ \expandafter\let\csname SETxref-automatic-section-title\endcsname
+ = \empty
+ \else\ifx\temp\offword
+ \expandafter\let\csname SETxref-automatic-section-title\endcsname
+ = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+ must be on|off}%
+ \fi\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{\putwordsee{} \xrefXX}
+\def\xref{\putwordSee{} \xrefXX}
+\def\ref{\xrefXX}
+
+\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
+\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ %
+ % Get args without leading/trailing spaces.
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+ %
+ \def\infofilename{\ignorespaces #4}%
+ \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+ %
+ \def\printedmanual{\ignorespaces #5}%
+ \setbox\printedmanualbox = \hbox{\printedmanual\unskip}%
+ %
+ % If the printed reference name (arg #3) was not explicitly given in
+ % the @xref, figure out what we want to use.
+ \ifdim \wd\printedrefnamebox = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+ % Not auto section-title: use node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Auto section-title: use chapter/section title inside
+ % the square brackets if we have it.
+ \ifdim \wd\printedmanualbox > 0pt
+ % It is in another manual, so we don't have it; use node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We (should) 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
+ % For pdfTeX and LuaTeX
+ {\indexnofonts
+ \makevalueexpandable
+ \turnoffactive
+ % This expands tokens, so do it after making catcode changes, so _
+ % etc. don't get their TeX definitions. This ignores all spaces in
+ % #4, including (wrongly) those in the middle of the filename.
+ \getfilename{#4}%
+ %
+ % This (wrongly) does not take account of leading or trailing
+ % spaces in #1, which should be ignored.
+ \setpdfdestname{#1}%
+ %
+ \ifx\pdfdestname\empty
+ \def\pdfdestname{Top}% no empty targets
+ \fi
+ %
+ \leavevmode
+ \startlink attr{/Border [0 0 0]}%
+ \ifnum\filenamelength>0
+ goto file{\the\filename.pdf} name{\pdfdestname}%
+ \else
+ goto name{\pdfmkpgn{\pdfdestname}}%
+ \fi
+ }%
+ \setcolor{\linkcolor}%
+ \else
+ \ifx\XeTeXrevision\thisisundefined
+ \else
+ % For XeTeX
+ {\indexnofonts
+ \makevalueexpandable
+ \turnoffactive
+ % This expands tokens, so do it after making catcode changes, so _
+ % etc. don't get their TeX definitions. This ignores all spaces in
+ % #4, including (wrongly) those in the middle of the filename.
+ \getfilename{#4}%
+ %
+ % This (wrongly) does not take account of leading or trailing
+ % spaces in #1, which should be ignored.
+ \setpdfdestname{#1}%
+ %
+ \ifx\pdfdestname\empty
+ \def\pdfdestname{Top}% no empty targets
+ \fi
+ %
+ \leavevmode
+ \ifnum\filenamelength>0
+ % With default settings,
+ % XeTeX (xdvipdfmx) replaces link destination names with integers.
+ % In this case, the replaced destination names of
+ % remote PDFs are no longer known. In order to avoid a replacement,
+ % you can use xdvipdfmx's command line option `-C 0x0010'.
+ % If you use XeTeX 0.99996+ (TeX Live 2016+),
+ % this command line option is no longer necessary
+ % because we can use the `dvipdfmx:config' special.
+ \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+ << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
+ \else
+ \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+ << /S /GoTo /D (\pdfdestname) >> >>}%
+ \fi
+ }%
+ \setcolor{\linkcolor}%
+ \fi
+ \fi
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \def\value##1{##1}%
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". \iffloat distinguishes them by
+ % \Xthisreftitle being set to a magic string.
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd\printedrefnamebox = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % If the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd\printedmanualbox > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox 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 \wd\printedmanualbox > 0pt
+ % Cross-manual reference with a printed manual name.
+ %
+ \crossmanualxref{\cite{\printedmanual\unskip}}%
+ %
+ \else\ifdim \wd\infofilenamebox > 0pt
+ % Cross-manual reference with only an info filename (arg 4), no
+ % printed manual name (arg 5). This is essentially the same as
+ % the case above; we output the filename, since we have nothing else.
+ %
+ \crossmanualxref{\code{\infofilename\unskip}}%
+ %
+ \else
+ % Reference within this manual.
+ %
+ % 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 the macro below 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}{}%
+ % Add a , if xref followed by a space
+ \if\space\noexpand\tokenafterxref ,%
+ \else\ifx\ \tokenafterxref ,% @TAB
+ \else\ifx\*\tokenafterxref ,% @*
+ \else\ifx\ \tokenafterxref ,% @SPACE
+ \else\ifx\
+ \tokenafterxref ,% @NL
+ \else\ifx\tie\tokenafterxref ,% @tie
+ \fi\fi\fi\fi\fi\fi
+ \fi\fi
+ \fi
+ \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1. Used just above (twice).
+%
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+%
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input. By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font). Hopefully it will never happen in practice.
+%
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+%
+\def\crossmanualxref#1{%
+ \setbox\toprefbox = \hbox{Top\kern7sp}%
+ \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+ \ifdim \wd2 > 7sp % nonempty?
+ \ifdim \wd2 = \wd\toprefbox \else % same as Top?
+ \putwordSection{} ``\printedrefname'' \putwordin{}\space
+ \fi
+ \fi
+ #1%
+}
+
+% 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
+}
+
+% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME. SUFFIX
+% is output afterwards if non-empty.
+\def\refx#1#2{%
+ \requireauxfile
+ {%
+ \indexnofonts
+ \turnoffactive
+ \def\value##1{##1}%
+ \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
+ {\toks0 = {#1}% avoid expansion of possibly-complex value
+ \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+ \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. Define a control
+% sequence for a cross-reference target (we prepend XR to the control sequence
+% name to avoid collisions). The value is the page number. If this is a float
+% type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% Expand the node or anchor name to remove control sequences.
+ % \turnoffactive stops 8-bit characters being changed to commands
+ % like @'e. \refx does the same to retrieve the value in the definition.
+ \indexnofonts
+ \turnoffactive
+ \def\value##1{##1}%
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \bgroup
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}%
+ \egroup
+ % We put the \gdef inside a group to avoid the definitions building up on
+ % TeX's save stack, which can cause it to run out of space for aux files with
+ % thousands of lines. \gdef doesn't use the save stack, but \csname does
+ % when it defines an unknown control sequence as \relax.
+ %
+ % 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
+}
+
+% 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 at the beginning of the file.
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% Used when writing to the aux file, or when using data from it.
+\def\requireauxfile{%
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi
+ \global\let\requireauxfile=\relax % Only do this once.
+}
+
+% 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
+ \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
+ %
+ \catcode`\\=\active
+ %
+ % @ 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{%
+ \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
+ %
+ % Nested footnotes are not supported in TeX, that would take a lot
+ % more work. (\startsavinginserts does not suffice.)
+ \let\footnote=\errfootnotenest
+ %
+ % 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=\txipagewidth
+ \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
+ %
+ % Invoke rest of plain TeX footnote routine.
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+\def\errfootnotenest{%
+ \errhelp=\EMsimple
+ \errmessage{Nested footnotes not supported in texinfo.tex,
+ even though they work in makeinfo; sorry}
+}
+
+\def\errfootnoteheading{%
+ \errhelp=\EMsimple
+ \errmessage{Footnotes in chapters, sections, etc., are not supported}
+}
+
+% 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.
+% Similarly, 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 https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\thisisundefined
+ \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 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
+ \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \else \ifx\centersub\centerV
+ % for @center @image, we need a vbox so we can have our vertical space
+ \imagevmodetrue
+ \vbox\bgroup % vbox has better behavior than vtop herev
+ \fi\fi
+ %
+ \ifimagevmode
+ \nobreak\medskip
+ % 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
+ \fi
+ %
+ % Leave vertical mode so that indentation from an enclosing
+ % environment such as @quotation is respected.
+ % However, if we're at the top level, we don't want the
+ % normal paragraph indentation.
+ % On the other hand, if we are in the case of @center @image, we don't
+ % want to start a paragraph, which will create a hsize-width box and
+ % eradicate the centering.
+ \ifx\centersub\centerV\else \noindent \fi
+ %
+ % Output the image.
+ \ifpdf
+ % For pdfTeX and LuaTeX <= 0.80
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ \ifx\XeTeXrevision\thisisundefined
+ % For epsf.tex
+ % \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}%
+ \else
+ % For XeTeX
+ \doxeteximage{#1}{#2}{#3}%
+ \fi
+ \fi
+ %
+ \ifimagevmode
+ \medskip % space after a standalone image
+ \fi
+ \ifx\centersub\centerV \egroup \fi
+\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 \currentsection 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\currentsection{\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.
+ {%
+ \requireauxfile
+ \atdummies
+ %
+ \ifx\thisshortcaption\empty
+ \def\gtemp{\thiscaption}%
+ \else
+ \def\gtemp{\thisshortcaption}%
+ \fi
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ \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
+% \currentsection 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,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding. Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+ \catcode`\_ = \active
+ \globaldefs=1
+\parseargdef\documentlanguage{%
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file by the name they passed if it exists.
+ \let_ = \normalunderscore % normal _ character for filename test
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \documentlanguagetrywithoutunderscore #1_\finish
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup % end raw TeX
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \globaldefs = 1 % everything in the txi-LL files needs to persist
+ \input txi-#1.tex
+ \fi
+ \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages. This means we can support hyphenation in
+% Texinfo, at least to some extent. (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+ % do not set the language if the name is undefined in the current TeX.
+ \expandafter\ifx\csname lang@#1\endcsname \relax
+ \message{no patterns for #1}%
+ \else
+ \global\language = \csname lang@#1\endcsname
+ \fi
+ % but there is no harm in adjusting the hyphenmin values regardless.
+ \global\lefthyphenmin = #2\relax
+ \global\righthyphenmin = #3\relax
+}
+
+% XeTeX and LuaTeX can handle Unicode natively.
+% Their default I/O uses UTF-8 sequences instead of a byte-wise operation.
+% Other TeX engines' I/O (pdfTeX, etc.) is byte-wise.
+%
+\newif\iftxinativeunicodecapable
+\newif\iftxiusebytewiseio
+
+\ifx\XeTeXrevision\thisisundefined
+ \ifx\luatexversion\thisisundefined
+ \txinativeunicodecapablefalse
+ \txiusebytewiseiotrue
+ \else
+ \txinativeunicodecapabletrue
+ \txiusebytewiseiofalse
+ \fi
+\else
+ \txinativeunicodecapabletrue
+ \txiusebytewiseiofalse
+\fi
+
+% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
+% for non-UTF-8 (byte-wise) encodings.
+%
+\def\setbytewiseio{%
+ \ifx\XeTeXrevision\thisisundefined
+ \else
+ \XeTeXdefaultencoding "bytes" % For subsequent files to be read
+ \XeTeXinputencoding "bytes" % For document root file
+ % Unfortunately, there seems to be no corresponding XeTeX command for
+ % output encoding. This is a problem for auxiliary index and TOC files.
+ % The only solution would be perhaps to write out @U{...} sequences in
+ % place of non-ASCII characters.
+ \fi
+
+ \ifx\luatexversion\thisisundefined
+ \else
+ \directlua{
+ local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
+ local function convert_char (char)
+ return utf8_char(byte(char))
+ end
+
+ local function convert_line (line)
+ return gsub(line, ".", convert_char)
+ end
+
+ callback.register("process_input_buffer", convert_line)
+
+ local function convert_line_out (line)
+ local line_out = ""
+ for c in string.utfvalues(line) do
+ line_out = line_out .. string.char(c)
+ end
+ return line_out
+ end
+
+ callback.register("process_output_buffer", convert_line_out)
+ }
+ \fi
+
+ \txiusebytewiseiotrue
+}
+
+
+% Helpers for encodings.
+% 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\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
+\def\documentencodingzzz#1{%
+ %
+ % 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
+ \iftxinativeunicodecapable
+ \setbytewiseio
+ \fi
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \iftxinativeunicodecapable
+ \setbytewiseio
+ \fi
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \iftxinativeunicodecapable
+ \setbytewiseio
+ \fi
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \iftxinativeunicodecapable
+ % For native Unicode handling (XeTeX and LuaTeX)
+ \nativeunicodechardefs
+ \else
+ % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX)
+ \setnonasciicharscatcode\active
+ % since we already invoked \utfeightchardefs at the top level
+ % (below), do not re-invoke it, otherwise our check for duplicated
+ % definitions gets triggered. Making non-ascii chars active is
+ % sufficient.
+ \fi
+ %
+ \else
+ \message{Ignoring unknown document encoding: #1.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+ %
+ \ifx\XeTeXrevision\thisisundefined
+ \else
+ \ifx \declaredencoding \utfeight
+ \else
+ \ifx \declaredencoding \ascii
+ \else
+ \message{Warning: XeTeX with non-UTF-8 encodings cannot handle %
+ non-ASCII characters in auxiliary files.}%
+ \fi
+ \fi
+ \fi
+}
+
+% emacs-page
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing, sorry: #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
+%
+
+\def\gdefchar#1#2{%
+\gdef#1{%
+ \ifpassthroughchars
+ \string#1%
+ \else
+ #2%
+ \fi
+}}
+
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdefchar^^a0{\tie}
+ \gdefchar^^a1{\exclamdown}
+ \gdefchar^^a2{{\tcfont \char162}} % cent
+ \gdefchar^^a3{\pounds{}}
+ \gdefchar^^a4{{\tcfont \char164}} % currency
+ \gdefchar^^a5{{\tcfont \char165}} % yen
+ \gdefchar^^a6{{\tcfont \char166}} % broken bar
+ \gdefchar^^a7{\S}
+ \gdefchar^^a8{\"{}}
+ \gdefchar^^a9{\copyright{}}
+ \gdefchar^^aa{\ordf}
+ \gdefchar^^ab{\guillemetleft{}}
+ \gdefchar^^ac{\ensuremath\lnot}
+ \gdefchar^^ad{\-}
+ \gdefchar^^ae{\registeredsymbol{}}
+ \gdefchar^^af{\={}}
+ %
+ \gdefchar^^b0{\textdegree}
+ \gdefchar^^b1{$\pm$}
+ \gdefchar^^b2{$^2$}
+ \gdefchar^^b3{$^3$}
+ \gdefchar^^b4{\'{}}
+ \gdefchar^^b5{$\mu$}
+ \gdefchar^^b6{\P}
+ \gdefchar^^b7{\ensuremath\cdot}
+ \gdefchar^^b8{\cedilla\ }
+ \gdefchar^^b9{$^1$}
+ \gdefchar^^ba{\ordm}
+ \gdefchar^^bb{\guillemetright{}}
+ \gdefchar^^bc{$1\over4$}
+ \gdefchar^^bd{$1\over2$}
+ \gdefchar^^be{$3\over4$}
+ \gdefchar^^bf{\questiondown}
+ %
+ \gdefchar^^c0{\`A}
+ \gdefchar^^c1{\'A}
+ \gdefchar^^c2{\^A}
+ \gdefchar^^c3{\~A}
+ \gdefchar^^c4{\"A}
+ \gdefchar^^c5{\ringaccent A}
+ \gdefchar^^c6{\AE}
+ \gdefchar^^c7{\cedilla C}
+ \gdefchar^^c8{\`E}
+ \gdefchar^^c9{\'E}
+ \gdefchar^^ca{\^E}
+ \gdefchar^^cb{\"E}
+ \gdefchar^^cc{\`I}
+ \gdefchar^^cd{\'I}
+ \gdefchar^^ce{\^I}
+ \gdefchar^^cf{\"I}
+ %
+ \gdefchar^^d0{\DH}
+ \gdefchar^^d1{\~N}
+ \gdefchar^^d2{\`O}
+ \gdefchar^^d3{\'O}
+ \gdefchar^^d4{\^O}
+ \gdefchar^^d5{\~O}
+ \gdefchar^^d6{\"O}
+ \gdefchar^^d7{$\times$}
+ \gdefchar^^d8{\O}
+ \gdefchar^^d9{\`U}
+ \gdefchar^^da{\'U}
+ \gdefchar^^db{\^U}
+ \gdefchar^^dc{\"U}
+ \gdefchar^^dd{\'Y}
+ \gdefchar^^de{\TH}
+ \gdefchar^^df{\ss}
+ %
+ \gdefchar^^e0{\`a}
+ \gdefchar^^e1{\'a}
+ \gdefchar^^e2{\^a}
+ \gdefchar^^e3{\~a}
+ \gdefchar^^e4{\"a}
+ \gdefchar^^e5{\ringaccent a}
+ \gdefchar^^e6{\ae}
+ \gdefchar^^e7{\cedilla c}
+ \gdefchar^^e8{\`e}
+ \gdefchar^^e9{\'e}
+ \gdefchar^^ea{\^e}
+ \gdefchar^^eb{\"e}
+ \gdefchar^^ec{\`{\dotless i}}
+ \gdefchar^^ed{\'{\dotless i}}
+ \gdefchar^^ee{\^{\dotless i}}
+ \gdefchar^^ef{\"{\dotless i}}
+ %
+ \gdefchar^^f0{\dh}
+ \gdefchar^^f1{\~n}
+ \gdefchar^^f2{\`o}
+ \gdefchar^^f3{\'o}
+ \gdefchar^^f4{\^o}
+ \gdefchar^^f5{\~o}
+ \gdefchar^^f6{\"o}
+ \gdefchar^^f7{$\div$}
+ \gdefchar^^f8{\o}
+ \gdefchar^^f9{\`u}
+ \gdefchar^^fa{\'u}
+ \gdefchar^^fb{\^u}
+ \gdefchar^^fc{\"u}
+ \gdefchar^^fd{\'y}
+ \gdefchar^^fe{\th}
+ \gdefchar^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdefchar^^a4{\euro{}}
+ \gdefchar^^a6{\v S}
+ \gdefchar^^a8{\v s}
+ \gdefchar^^b4{\v Z}
+ \gdefchar^^b8{\v z}
+ \gdefchar^^bc{\OE}
+ \gdefchar^^bd{\oe}
+ \gdefchar^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdefchar^^a0{\tie}
+ \gdefchar^^a1{\ogonek{A}}
+ \gdefchar^^a2{\u{}}
+ \gdefchar^^a3{\L}
+ \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdefchar^^a5{\v L}
+ \gdefchar^^a6{\'S}
+ \gdefchar^^a7{\S}
+ \gdefchar^^a8{\"{}}
+ \gdefchar^^a9{\v S}
+ \gdefchar^^aa{\cedilla S}
+ \gdefchar^^ab{\v T}
+ \gdefchar^^ac{\'Z}
+ \gdefchar^^ad{\-}
+ \gdefchar^^ae{\v Z}
+ \gdefchar^^af{\dotaccent Z}
+ %
+ \gdefchar^^b0{\textdegree{}}
+ \gdefchar^^b1{\ogonek{a}}
+ \gdefchar^^b2{\ogonek{ }}
+ \gdefchar^^b3{\l}
+ \gdefchar^^b4{\'{}}
+ \gdefchar^^b5{\v l}
+ \gdefchar^^b6{\'s}
+ \gdefchar^^b7{\v{}}
+ \gdefchar^^b8{\cedilla\ }
+ \gdefchar^^b9{\v s}
+ \gdefchar^^ba{\cedilla s}
+ \gdefchar^^bb{\v t}
+ \gdefchar^^bc{\'z}
+ \gdefchar^^bd{\H{}}
+ \gdefchar^^be{\v z}
+ \gdefchar^^bf{\dotaccent z}
+ %
+ \gdefchar^^c0{\'R}
+ \gdefchar^^c1{\'A}
+ \gdefchar^^c2{\^A}
+ \gdefchar^^c3{\u A}
+ \gdefchar^^c4{\"A}
+ \gdefchar^^c5{\'L}
+ \gdefchar^^c6{\'C}
+ \gdefchar^^c7{\cedilla C}
+ \gdefchar^^c8{\v C}
+ \gdefchar^^c9{\'E}
+ \gdefchar^^ca{\ogonek{E}}
+ \gdefchar^^cb{\"E}
+ \gdefchar^^cc{\v E}
+ \gdefchar^^cd{\'I}
+ \gdefchar^^ce{\^I}
+ \gdefchar^^cf{\v D}
+ %
+ \gdefchar^^d0{\DH}
+ \gdefchar^^d1{\'N}
+ \gdefchar^^d2{\v N}
+ \gdefchar^^d3{\'O}
+ \gdefchar^^d4{\^O}
+ \gdefchar^^d5{\H O}
+ \gdefchar^^d6{\"O}
+ \gdefchar^^d7{$\times$}
+ \gdefchar^^d8{\v R}
+ \gdefchar^^d9{\ringaccent U}
+ \gdefchar^^da{\'U}
+ \gdefchar^^db{\H U}
+ \gdefchar^^dc{\"U}
+ \gdefchar^^dd{\'Y}
+ \gdefchar^^de{\cedilla T}
+ \gdefchar^^df{\ss}
+ %
+ \gdefchar^^e0{\'r}
+ \gdefchar^^e1{\'a}
+ \gdefchar^^e2{\^a}
+ \gdefchar^^e3{\u a}
+ \gdefchar^^e4{\"a}
+ \gdefchar^^e5{\'l}
+ \gdefchar^^e6{\'c}
+ \gdefchar^^e7{\cedilla c}
+ \gdefchar^^e8{\v c}
+ \gdefchar^^e9{\'e}
+ \gdefchar^^ea{\ogonek{e}}
+ \gdefchar^^eb{\"e}
+ \gdefchar^^ec{\v e}
+ \gdefchar^^ed{\'{\dotless{i}}}
+ \gdefchar^^ee{\^{\dotless{i}}}
+ \gdefchar^^ef{\v d}
+ %
+ \gdefchar^^f0{\dh}
+ \gdefchar^^f1{\'n}
+ \gdefchar^^f2{\v n}
+ \gdefchar^^f3{\'o}
+ \gdefchar^^f4{\^o}
+ \gdefchar^^f5{\H o}
+ \gdefchar^^f6{\"o}
+ \gdefchar^^f7{$\div$}
+ \gdefchar^^f8{\v r}
+ \gdefchar^^f9{\ringaccent u}
+ \gdefchar^^fa{\'u}
+ \gdefchar^^fb{\H u}
+ \gdefchar^^fc{\"u}
+ \gdefchar^^fd{\'y}
+ \gdefchar^^fe{\cedilla t}
+ \gdefchar^^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
+}
+
+% Give non-ASCII bytes the active definitions for processing UTF-8 sequences
+\begingroup
+ \catcode`\~13
+ \catcode`\$12
+ \catcode`\"12
+
+ % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
+ % substituting ~ and $ with a character token of that value.
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uccode`\$\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ % For bytes other than the first in a UTF-8 sequence. Not expected to
+ % be expanded except when writing to auxiliary files.
+ \countUTFx = "80
+ \countUTFy = "C2
+ \def\UTFviiiTmp{%
+ \gdef~{%
+ \ifpassthroughchars $\fi}}%
+ \UTFviiiLoop
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \gdef~{%
+ \ifpassthroughchars $%
+ \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \gdef~{%
+ \ifpassthroughchars $%
+ \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \gdef~{%
+ \ifpassthroughchars $%
+ \else\expandafter\UTFviiiFourOctets\expandafter$\fi
+ }}%
+ \UTFviiiLoop
+\endgroup
+
+\def\globallet{\global\let} % save some \expandafter's below
+
+% @U{xxxx} to produce U+xxxx, if we support it.
+\def\U#1{%
+ \expandafter\ifx\csname uni:#1\endcsname \relax
+ \iftxinativeunicodecapable
+ % All Unicode characters can be used if native Unicode handling is
+ % active. However, if the font does not have the glyph,
+ % letters are missing.
+ \begingroup
+ \uccode`\.="#1\relax
+ \uppercase{.}
+ \endgroup
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unicode character U+#1 not supported, sorry}%
+ \fi
+ \else
+ \csname uni:#1\endcsname
+ \fi
+}
+
+% These macros are used here to construct the name of a control
+% sequence to be defined.
+\def\UTFviiiTwoOctetsName#1#2{%
+ \csname u8:#1\string #2\endcsname}%
+\def\UTFviiiThreeOctetsName#1#2#3{%
+ \csname u8:#1\string #2\string #3\endcsname}%
+\def\UTFviiiFourOctetsName#1#2#3#4{%
+ \csname u8:#1\string #2\string #3\string #4\endcsname}%
+
+% For UTF-8 byte sequences (TeX, e-TeX and pdfTeX),
+% provide a definition macro to replace a Unicode character;
+% this gets used by the @U command
+%
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+ \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
+ \countUTFz = "#1\relax
+ \begingroup
+ \parseXMLCharref
+
+ % Give \u8:... its definition. The sequence of seven \expandafter's
+ % expands after the \gdef three times, e.g.
+ %
+ % 1. \UTFviiTwoOctetsName B1 B2
+ % 2. \csname u8:B1 \string B2 \endcsname
+ % 3. \u8: B1 B2 (a single control sequence token)
+ %
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\gdef \UTFviiiTmp{#2}%
+ %
+ \expandafter\ifx\csname uni:#1\endcsname \relax \else
+ \message{Internal error, already defined: #1}%
+ \fi
+ %
+ % define an additional control sequence for this code point.
+ \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
+ \endgroup}
+ %
+ % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
+ % to the corresponding UTF-8 sequence.
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
+ \fi\fi\fi
+ }
+
+ % Extract a byte from the end of the UTF-8 representation of \countUTFx.
+ % It must be a non-initial byte in the sequence.
+ % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
+ % of the bytes.
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz % Save to be the future value of \countUTFz.
+ \multiply\countUTFz by 64
+
+ % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract
+ % in order to get the last five bits.
+ \advance\countUTFx by -\countUTFz
+
+ % Convert this to the byte in the UTF-8 sequence.
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ % Used to put a UTF-8 byte sequence into \UTFviiiTmp
+ % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
+ % sequence.
+ % #2 is one of the \UTFviii*OctetsName macros.
+ % #3 is always a full stop (.)
+ % #4 is a template for the other bytes in the sequence. The values for these
+ % bytes is substituted in here with \uppercase using the \uccode's.
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro that sets a catcode to `other' non-globally
+%
+\def\DeclareUnicodeCharacterNativeOther#1#2{%
+ \catcode"#1=\other
+}
+
+% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
+% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
+% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
+% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
+% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
+%
+% Many of our renditions are less than wonderful, and all the missing
+% characters are available somewhere. Loading the necessary fonts
+% awaits user request. We can't truly support Unicode without
+% reimplementing everything that's been done in LaTeX for many years,
+% plus probably using luatex or xetex, and who knows what else.
+% We won't be doing that here in this simple file. But we can try to at
+% least make most of the characters not bomb out.
+%
+\def\unicodechardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}%
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}%
+ \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
+ \DeclareUnicodeCharacter{00A3}{\pounds{}}%
+ \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+ \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+ \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
+ \DeclareUnicodeCharacter{00A7}{\S}%
+ \DeclareUnicodeCharacter{00A8}{\"{ }}%
+ \DeclareUnicodeCharacter{00A9}{\copyright{}}%
+ \DeclareUnicodeCharacter{00AA}{\ordf}%
+ \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}%
+ \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
+ \DeclareUnicodeCharacter{00AD}{\-}%
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
+ \DeclareUnicodeCharacter{00AF}{\={ }}%
+ %
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
+ \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
+ \DeclareUnicodeCharacter{00B2}{$^2$}%
+ \DeclareUnicodeCharacter{00B3}{$^3$}%
+ \DeclareUnicodeCharacter{00B4}{\'{ }}%
+ \DeclareUnicodeCharacter{00B5}{$\mu$}%
+ \DeclareUnicodeCharacter{00B6}{\P}%
+ \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
+ \DeclareUnicodeCharacter{00B9}{$^1$}%
+ \DeclareUnicodeCharacter{00BA}{\ordm}%
+ \DeclareUnicodeCharacter{00BB}{\guillemetright{}}%
+ \DeclareUnicodeCharacter{00BC}{$1\over4$}%
+ \DeclareUnicodeCharacter{00BD}{$1\over2$}%
+ \DeclareUnicodeCharacter{00BE}{$3\over4$}%
+ \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{00D0}{\DH}%
+ \DeclareUnicodeCharacter{00D1}{\~N}%
+ \DeclareUnicodeCharacter{00D2}{\`O}%
+ \DeclareUnicodeCharacter{00D3}{\'O}%
+ \DeclareUnicodeCharacter{00D4}{\^O}%
+ \DeclareUnicodeCharacter{00D5}{\~O}%
+ \DeclareUnicodeCharacter{00D6}{\"O}%
+ \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
+ \DeclareUnicodeCharacter{00D8}{\O}%
+ \DeclareUnicodeCharacter{00D9}{\`U}%
+ \DeclareUnicodeCharacter{00DA}{\'U}%
+ \DeclareUnicodeCharacter{00DB}{\^U}%
+ \DeclareUnicodeCharacter{00DC}{\"U}%
+ \DeclareUnicodeCharacter{00DD}{\'Y}%
+ \DeclareUnicodeCharacter{00DE}{\TH}%
+ \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{00F0}{\dh}%
+ \DeclareUnicodeCharacter{00F1}{\~n}%
+ \DeclareUnicodeCharacter{00F2}{\`o}%
+ \DeclareUnicodeCharacter{00F3}{\'o}%
+ \DeclareUnicodeCharacter{00F4}{\^o}%
+ \DeclareUnicodeCharacter{00F5}{\~o}%
+ \DeclareUnicodeCharacter{00F6}{\"o}%
+ \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
+ \DeclareUnicodeCharacter{00F8}{\o}%
+ \DeclareUnicodeCharacter{00F9}{\`u}%
+ \DeclareUnicodeCharacter{00FA}{\'u}%
+ \DeclareUnicodeCharacter{00FB}{\^u}%
+ \DeclareUnicodeCharacter{00FC}{\"u}%
+ \DeclareUnicodeCharacter{00FD}{\'y}%
+ \DeclareUnicodeCharacter{00FE}{\th}%
+ \DeclareUnicodeCharacter{00FF}{\"y}%
+ %
+ \DeclareUnicodeCharacter{0100}{\=A}%
+ \DeclareUnicodeCharacter{0101}{\=a}%
+ \DeclareUnicodeCharacter{0102}{\u{A}}%
+ \DeclareUnicodeCharacter{0103}{\u{a}}%
+ \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
+ \DeclareUnicodeCharacter{0105}{\ogonek{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{010F}{d'}%
+ %
+ \DeclareUnicodeCharacter{0110}{\DH}%
+ \DeclareUnicodeCharacter{0111}{\dh}%
+ \DeclareUnicodeCharacter{0112}{\=E}%
+ \DeclareUnicodeCharacter{0113}{\=e}%
+ \DeclareUnicodeCharacter{0114}{\u{E}}%
+ \DeclareUnicodeCharacter{0115}{\u{e}}%
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
+ \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
+ \DeclareUnicodeCharacter{0119}{\ogonek{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{0122}{\cedilla{G}}%
+ \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
+ \DeclareUnicodeCharacter{0124}{\^H}%
+ \DeclareUnicodeCharacter{0125}{\^h}%
+ \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
+ \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
+ \DeclareUnicodeCharacter{0128}{\~I}%
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
+ \DeclareUnicodeCharacter{012A}{\=I}%
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
+ \DeclareUnicodeCharacter{012C}{\u{I}}%
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
+ \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
+ \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
+ %
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}%
+ \DeclareUnicodeCharacter{0132}{IJ}%
+ \DeclareUnicodeCharacter{0133}{ij}%
+ \DeclareUnicodeCharacter{0134}{\^J}%
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
+ \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
+ \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
+ \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
+ \DeclareUnicodeCharacter{0139}{\'L}%
+ \DeclareUnicodeCharacter{013A}{\'l}%
+ \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
+ \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
+ \DeclareUnicodeCharacter{013D}{L'}% should kern
+ \DeclareUnicodeCharacter{013E}{l'}% should kern
+ \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
+ %
+ \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
+ \DeclareUnicodeCharacter{0141}{\L}%
+ \DeclareUnicodeCharacter{0142}{\l}%
+ \DeclareUnicodeCharacter{0143}{\'N}%
+ \DeclareUnicodeCharacter{0144}{\'n}%
+ \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
+ \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
+ \DeclareUnicodeCharacter{0147}{\v{N}}%
+ \DeclareUnicodeCharacter{0148}{\v{n}}%
+ \DeclareUnicodeCharacter{0149}{'n}%
+ \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
+ \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
+ \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{0156}{\cedilla{R}}%
+ \DeclareUnicodeCharacter{0157}{\cedilla{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{0165}{\v{t}}%
+ \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
+ \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
+ \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{0172}{\ogonek{U}}%
+ \DeclareUnicodeCharacter{0173}{\ogonek{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{017F}{\missingcharmsg{LONG S}}%
+ %
+ \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{02DB}{\ogonek{ }}%
+ %
+ % Greek letters upper case
+ \DeclareUnicodeCharacter{0391}{{\it A}}%
+ \DeclareUnicodeCharacter{0392}{{\it B}}%
+ \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
+ \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
+ \DeclareUnicodeCharacter{0395}{{\it E}}%
+ \DeclareUnicodeCharacter{0396}{{\it Z}}%
+ \DeclareUnicodeCharacter{0397}{{\it H}}%
+ \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
+ \DeclareUnicodeCharacter{0399}{{\it I}}%
+ \DeclareUnicodeCharacter{039A}{{\it K}}%
+ \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
+ \DeclareUnicodeCharacter{039C}{{\it M}}%
+ \DeclareUnicodeCharacter{039D}{{\it N}}%
+ \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
+ \DeclareUnicodeCharacter{039F}{{\it O}}%
+ \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
+ \DeclareUnicodeCharacter{03A1}{{\it P}}%
+ %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
+ \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
+ \DeclareUnicodeCharacter{03A4}{{\it T}}%
+ \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
+ \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
+ \DeclareUnicodeCharacter{03A7}{{\it X}}%
+ \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
+ \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
+ %
+ % Vowels with accents
+ \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
+ \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
+ \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
+ \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
+ \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
+ \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
+ %
+ % Standalone accent
+ \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
+ %
+ % Greek letters lower case
+ \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
+ \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
+ \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
+ \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
+ \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
+ \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
+ \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
+ \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
+ \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
+ \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
+ \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
+ \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
+ \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
+ \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
+ \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
+ \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
+ \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
+ \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
+ \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
+ \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
+ \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
+ \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
+ \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
+ \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
+ \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
+ %
+ % More Greek vowels with accents
+ \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
+ \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
+ \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
+ \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
+ \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
+ %
+ % Variant Greek letters
+ \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
+ \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
+ \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
+ %
+ \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}%
+ %
+ % Punctuation
+ \DeclareUnicodeCharacter{2013}{--}%
+ \DeclareUnicodeCharacter{2014}{---}%
+ \DeclareUnicodeCharacter{2018}{\quoteleft{}}%
+ \DeclareUnicodeCharacter{2019}{\quoteright{}}%
+ \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}%
+ \DeclareUnicodeCharacter{201C}{\quotedblleft{}}%
+ \DeclareUnicodeCharacter{201D}{\quotedblright{}}%
+ \DeclareUnicodeCharacter{201E}{\quotedblbase{}}%
+ \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
+ \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
+ \DeclareUnicodeCharacter{2022}{\bullet{}}%
+ \DeclareUnicodeCharacter{202F}{\thinspace}%
+ \DeclareUnicodeCharacter{2026}{\dots{}}%
+ \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}%
+ \DeclareUnicodeCharacter{203A}{\guilsinglright{}}%
+ %
+ \DeclareUnicodeCharacter{20AC}{\euro{}}%
+ %
+ \DeclareUnicodeCharacter{2192}{\expansion{}}%
+ \DeclareUnicodeCharacter{21D2}{\result{}}%
+ %
+ % Mathematical symbols
+ \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
+ \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
+ \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
+ \DeclareUnicodeCharacter{2212}{\minus{}}%
+ \DeclareUnicodeCharacter{2217}{\ast}%
+ \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
+ \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
+ \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
+ \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
+ \DeclareUnicodeCharacter{2261}{\equiv{}}%
+ \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
+ \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
+ \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
+ \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
+ %
+ \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
+ \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
+ \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
+ \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
+ \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
+ \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
+ \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
+ \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
+ \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
+ \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
+ \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
+ \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
+ \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
+ \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
+ \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
+ \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
+ \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
+ \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
+ \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
+ \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
+ \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
+ \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
+ \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
+ \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
+ \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
+ \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
+ \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
+ \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
+ \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
+ \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
+ \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
+ \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
+ \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
+ \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
+ \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
+ \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
+ \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
+ \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
+ \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
+ \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
+ \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
+ \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
+ \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
+ \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
+ \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
+ \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
+ \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
+ \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
+ \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
+ \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
+ \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
+ \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
+ \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
+ \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
+ \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
+ \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
+ \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
+ \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
+ \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
+ \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
+ \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
+ \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
+ \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
+ \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
+ \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
+ \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
+ \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
+ \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
+ \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
+ \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
+ \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
+ \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
+ \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
+ \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
+ \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
+ \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
+ \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
+ \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
+ \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
+ \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
+ \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
+ \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
+ \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
+ \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
+ \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
+ \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
+ \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
+ \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
+ \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
+ \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
+ \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
+ %
+ \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
+ \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
+ \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
+ \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
+ \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}%
+ \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
+ \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
+ \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
+ \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
+ \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
+ \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
+ \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
+ \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
+ \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
+ \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
+ \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
+ \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
+ \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
+ \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
+ \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
+ \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
+ \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
+ \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
+ \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
+ \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
+ \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
+ \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
+ \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
+ \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
+ %
+ \global\mathchardef\checkmark="1370% actually the square root sign
+ \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
+}% end of \unicodechardefs
+
+% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
+% It makes the setting that replace UTF-8 byte sequence.
+\def\utfeightchardefs{%
+ \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
+ \unicodechardefs
+}
+
+% Whether the active definitions of non-ASCII characters expand to
+% non-active tokens with the same character code. This is used to
+% write characters literally, instead of using active definitions for
+% printing the correct glyphs.
+\newif\ifpassthroughchars
+\passthroughcharsfalse
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro to replace/pass-through a Unicode character
+%
+\def\DeclareUnicodeCharacterNative#1#2{%
+ \catcode"#1=\active
+ \def\dodeclareunicodecharacternative##1##2##3{%
+ \begingroup
+ \uccode`\~="##2\relax
+ \uppercase{\gdef~}{%
+ \ifpassthroughchars
+ ##1%
+ \else
+ ##3%
+ \fi
+ }
+ \endgroup
+ }
+ \begingroup
+ \uccode`\.="#1\relax
+ \uppercase{\def\UTFNativeTmp{.}}%
+ \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
+ \endgroup
+}
+
+% Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
+% It activates the setting that replaces Unicode characters.
+\def\nativeunicodechardefs{%
+ \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
+ \unicodechardefs
+}
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% make the character token expand
+% to the sequences given in \unicodechardefs for printing.
+\def\DeclareUnicodeCharacterNativeAtU#1#2{%
+ \def\UTFAtUTmp{#2}
+ \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
+}
+
+% @U command definitions for native Unicode handling (XeTeX and LuaTeX).
+\def\nativeunicodechardefsatu{%
+ \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
+ \unicodechardefs
+}
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Define all Unicode characters we know about. This makes UTF-8 the default
+% input encoding and allows @U to work.
+\iftxinativeunicodecapable
+ \nativeunicodechardefsatu
+\else
+ \utfeightchardefs
+\fi
+
+\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 very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, 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
+ \txipageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \txipagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ % if we don't reset these, they will remain at "1 true in" of
+ % whatever layout pdftex was dumped with.
+ \pdfhorigin = 1 true in
+ \pdfvorigin = 1 true in
+ \else
+ \ifx\XeTeXrevision\thisisundefined
+ \special{papersize=#8,#7}%
+ \else
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ % XeTeX does not have \pdfhorigin and \pdfvorigin.
+ \fi
+ \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{607.2pt}{6in}% that's 46 lines
+ {\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}%
+ {-.2in}{0in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \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
+ \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{673.2pt}{160mm}% that's 51 lines
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \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
+ \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\relax
+ \advance\dimen0 by \voffset
+ \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+% Default value of \hfuzz, for suppressing warnings about overfull hboxes.
+\hfuzz = 1pt
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% 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}
+
+% Set catcodes for Texinfo file
+
+% Active characters for printing the wanted glyph.
+% 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\activetilde{{\tt\char126}} \let~ = \activetilde
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+\let\realunder=_
+
+\catcode`\|=\active \def|{{\tt\char124}}
+
+\chardef \less=`\<
+\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
+\chardef \gtr=`\>
+\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
+\catcode`\+=\active \def+{{\tt \char 43}}
+\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+\catcode`\-=\active \let-=\normaldash
+
+
+% used for headline/footline in the output routine, in case the page
+% breaks in the middle of an @tex block.
+\def\texinfochars{%
+ \let< = \activeless
+ \let> = \activegtr
+ \let~ = \activetilde
+ \let^ = \activehat
+ \markupsetuplqdefault \markupsetuprqdefault
+ \let\b = \strong
+ \let\i = \smartitalic
+ % in principle, all other definitions in \tex have to be undone too.
+}
+
+% 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=`\\
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% In Texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active % @ for escape char from now on.
+
+% Print a typewriter backslash. For math mode, we can't simply use
+% \backslashcurfont: the story here is that in math mode, the \char
+% of \backslashcurfont ends up printing the roman \ from the math symbol
+% font (because \char in math mode uses the \mathcode, and plain.tex
+% sets \mathcode`\\="026E). Hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C). We can't use " for the
+% usual hex value because it has already been made active.
+
+@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
+
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+{@catcode`- = @active
+ @gdef@normalturnoffactive{%
+ @passthroughcharstrue
+ @let-=@normaldash
+ @let"=@normaldoublequote
+ @let$=@normaldollar %$ font-lock fix
+ @let+=@normalplus
+ @let<=@normalless
+ @let>=@normalgreater
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let~=@normaltilde
+ @let\=@ttbackslash
+ @markupsetuplqdefault
+ @markupsetuprqdefault
+ @unsepspaces
+ }
+}
+
+% 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 @fixbackslash turn them back on.
+@catcode`+=@other @catcode`@_=@other
+
+% \enablebackslashhack - allow file to begin `\input texinfo'
+%
+% 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.
+% If the file did not have a `\input texinfo', then it is turned off after
+% the first line; otherwise the first `\' in the file would cause an error.
+% This is used on the very last line of this file, texinfo.tex.
+% We also use @c to call @fixbackslash, in case ends of lines are hidden.
+{
+@catcode`@^=7
+@catcode`@^^M=13@gdef@enablebackslashhack{%
+ @global@let\ = @eatinput%
+ @catcode`@^^M=13%
+ @def@c{@fixbackslash@c}%
+ % Definition for the newline at the end of this file.
+ @def ^^M{@let^^M@secondlinenl}%
+ % Definition for a newline in the main Texinfo file.
+ @gdef @secondlinenl{@fixbackslash}%
+ % In case the first line has a whole-line command on it
+ @let@originalparsearg@parsearg
+ @def@parsearg{@fixbackslash@originalparsearg}
+}}
+
+{@catcode`@^=7 @catcode`@^^M=13%
+@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
+
+% Emergency active definition of newline, in case an active newline token
+% appears by mistake.
+{@catcode`@^=7 @catcode13=13%
+@gdef@enableemergencynewline{%
+ @gdef^^M{%
+ @par%
+ %<warning: active newline>@par%
+}}}
+
+
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @ttbackslash @fi
+ @catcode13=5 % regular end of line
+ @enableemergencynewline
+ @let@c=@comment
+ @let@parsearg@originalparsearg
+ % Also turn back on active characters that might appear in the input
+ % file name, in case not using a pre-dumped format.
+ @catcode`+=@active
+ @catcode`@_=@active
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets
+ % called at the beginning of every Texinfo file. Not opening texinfo.cnf
+ % directly in this file, texinfo.tex, makes it possible to make a format
+ % file for Texinfo.
+ %
+ @openin 1 texinfo.cnf
+ @ifeof 1 @else @input texinfo.cnf @fi
+ @closein 1
+}
+
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+@def@normaldot{.}
+@def@normalquest{?}
+@def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+@catcode`@& = @other @def@normalamp{&}
+@catcode`@# = @other @def@normalhash{#}
+@catcode`@% = @other @def@normalpercent{%}
+
+@let @hashchar = @normalhash
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'before-save-hook 'time-stamp)
+@c page-delimiter: "^\\\\message\\|emacs-page"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@enablebackslashhack
diff --git a/build-aux/update-copyright b/build-aux/update-copyright
new file mode 100755
index 0000000..d9b7f68
--- /dev/null
+++ b/build-aux/update-copyright
@@ -0,0 +1,302 @@
+#!/bin/sh
+#! -*-perl-*-
+
+# Update an FSF copyright year list to include the current year.
+
+# Copyright (C) 2009-2020 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, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that 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/>.
+#
+# Written by Jim Meyering and Joel E. Denny
+
+# This script updates an FSF copyright year list to include the current year.
+# Usage: update-copyright [FILE...]
+#
+# The arguments to this script should be names of files that contain
+# copyright statements to be updated. The copyright holder's name
+# defaults to "Free Software Foundation, Inc." but may be changed to
+# any other name by using the "UPDATE_COPYRIGHT_HOLDER" environment
+# variable.
+#
+# For example, you might wish to use the update-copyright target rule
+# in maint.mk from gnulib's maintainer-makefile module.
+#
+# Iff a copyright statement is recognized in a file and the final
+# year is not the current year, then the statement is updated for the
+# new year and it is reformatted to:
+#
+# 1. Fit within 72 columns.
+# 2. Convert 2-digit years to 4-digit years by prepending "19".
+# 3. Expand copyright year intervals. (See "Environment variables"
+# below.)
+#
+# A warning is printed for every file for which no copyright
+# statement is recognized.
+#
+# Each file's copyright statement must be formatted correctly in
+# order to be recognized. For example, each of these is fine:
+#
+# Copyright @copyright{} 1990-2005, 2007-2009 Free Software
+# Foundation, Inc.
+#
+# # Copyright (C) 1990-2005, 2007-2009 Free Software
+# # Foundation, Inc.
+#
+# /*
+# * Copyright &copy; 90,2005,2007-2009
+# * Free Software Foundation, Inc.
+# */
+#
+# However, the following format is not recognized because the line
+# prefix changes after the first line:
+#
+# ## Copyright (C) 1990-2005, 2007-2009 Free Software
+# # Foundation, Inc.
+#
+# However, any correctly formatted copyright statement following
+# a non-matching copyright statements would be recognized.
+#
+# The exact conditions that a file's copyright statement must meet
+# to be recognized are:
+#
+# 1. It is the first copyright statement that meets all of the
+# following conditions. Subsequent copyright statements are
+# ignored.
+# 2. Its format is "Copyright (C)", then a list of copyright years,
+# and then the name of the copyright holder.
+# 3. The "(C)" takes one of the following forms or is omitted
+# entirely:
+#
+# A. (C)
+# B. (c)
+# C. @copyright{}
+# D. &copy;
+# E. ©
+#
+# 4. The "Copyright" appears at the beginning of a line, except that it
+# may be prefixed by any sequence (e.g., a comment) of no more than
+# 5 characters -- including white space.
+# 5. Iff such a prefix is present, the same prefix appears at the
+# beginning of each remaining line within the FSF copyright
+# statement. There is one exception in order to support C-style
+# comments: if the first line's prefix contains nothing but
+# whitespace surrounding a "/*", then the prefix for all subsequent
+# lines is the same as the first line's prefix except with each of
+# "/" and possibly "*" replaced by a " ". The replacement of "*"
+# by " " is consistent throughout all subsequent lines.
+# 6. Blank lines, even if preceded by the prefix, do not appear
+# within the FSF copyright statement.
+# 7. Each copyright year is 2 or 4 digits, and years are separated by
+# commas, "-", or "--". Whitespace may appear after commas.
+#
+# Environment variables:
+#
+# 1. If UPDATE_COPYRIGHT_FORCE=1, a recognized FSF copyright statement
+# is reformatted even if it does not need updating for the new
+# year. If unset or set to 0, only updated FSF copyright
+# statements are reformatted.
+# 2. If UPDATE_COPYRIGHT_USE_INTERVALS=1, every series of consecutive
+# copyright years (such as 90, 1991, 1992-2007, 2008) in a
+# reformatted FSF copyright statement is collapsed to a single
+# interval (such as 1990-2008). If unset or set to 0, all existing
+# copyright year intervals in a reformatted FSF copyright statement
+# are expanded instead.
+# If UPDATE_COPYRIGHT_USE_INTERVALS=2, convert a sequence with gaps
+# to the minimal containing range. For example, convert
+# 2000, 2004-2007, 2009 to 2000-2009.
+# 3. For testing purposes, you can set the assumed current year in
+# UPDATE_COPYRIGHT_YEAR.
+# 4. The default maximum line length for a copyright line is 72.
+# Set UPDATE_COPYRIGHT_MAX_LINE_LENGTH to use a different length.
+# 5. Set UPDATE_COPYRIGHT_HOLDER if the copyright holder is other
+# than "Free Software Foundation, Inc.".
+
+# This is a prologue that allows to run a perl script as an executable
+# on systems that are compliant to a POSIX version before POSIX:2017.
+# On such systems, the usual invocation of an executable through execlp()
+# or execvp() fails with ENOEXEC if it is a script that does not start
+# with a #! line. The script interpreter mentioned in the #! line has
+# to be /bin/sh, because on GuixSD systems that is the only program that
+# has a fixed file name. The second line is essential for perl and is
+# also useful for editing this file in Emacs. The next two lines below
+# are valid code in both sh and perl. When executed by sh, they re-execute
+# the script through the perl program found in $PATH. The '-x' option
+# is essential as well; without it, perl would re-execute the script
+# through /bin/sh. When executed by perl, the next two lines are a no-op.
+eval 'exec perl -wSx -0777 -pi "$0" "$@"'
+ if 0;
+
+my $VERSION = '2020-04-04.15:07'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+use strict;
+use warnings;
+
+my $copyright_re = 'Copyright';
+my $circle_c_re = '(?:\([cC]\)|@copyright\{}|\\\\\(co|&copy;|©)';
+my $holder = $ENV{UPDATE_COPYRIGHT_HOLDER};
+$holder ||= 'Free Software Foundation, Inc.';
+my $prefix_max = 5;
+my $margin = $ENV{UPDATE_COPYRIGHT_MAX_LINE_LENGTH};
+!$margin || $margin !~ m/^\d+$/
+ and $margin = 72;
+
+my $tab_width = 8;
+
+my $this_year = $ENV{UPDATE_COPYRIGHT_YEAR};
+if (!$this_year || $this_year !~ m/^\d{4}$/)
+ {
+ my ($sec, $min, $hour, $mday, $month, $year) = localtime (time ());
+ $this_year = $year + 1900;
+ }
+
+# Unless the file consistently uses "\r\n" as the EOL, use "\n" instead.
+my $eol = /(?:^|[^\r])\n/ ? "\n" : "\r\n";
+
+my $leading;
+my $prefix;
+my $ws_re;
+my $stmt_re;
+while (/(^|\n)(.{0,$prefix_max})$copyright_re/g)
+ {
+ $leading = "$1$2";
+ $prefix = $2;
+ if ($prefix =~ /^(\s*\/)\*(\s*)$/)
+ {
+ $prefix =~ s,/, ,;
+ my $prefix_ws = $prefix;
+ $prefix_ws =~ s/\*/ /; # Only whitespace.
+ if (/\G(?:[^*\n]|\*[^\/\n])*\*?\n$prefix_ws/)
+ {
+ $prefix = $prefix_ws;
+ }
+ }
+ $ws_re = '[ \t\r\f]'; # \s without \n
+ $ws_re =
+ "(?:$ws_re*(?:$ws_re|\\n" . quotemeta($prefix) . ")$ws_re*)";
+ my $holder_re = $holder;
+ $holder_re =~ s/\s/$ws_re/g;
+ my $stmt_remainder_re =
+ "(?:$ws_re$circle_c_re)?"
+ . "$ws_re(?:(?:\\d\\d)?\\d\\d(?:,$ws_re?|--?))*"
+ . "((?:\\d\\d)?\\d\\d)$ws_re$holder_re";
+ if (/\G$stmt_remainder_re/)
+ {
+ $stmt_re =
+ quotemeta($leading) . "($copyright_re$stmt_remainder_re)";
+ last;
+ }
+ }
+if (defined $stmt_re)
+ {
+ /$stmt_re/ or die; # Should never die.
+ my $stmt = $1;
+ my $final_year_orig = $2;
+
+ # Handle two-digit year numbers like "98" and "99".
+ my $final_year = $final_year_orig;
+ $final_year <= 99
+ and $final_year += 1900;
+
+ if ($final_year != $this_year)
+ {
+ # Update the year.
+ $stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/;
+ }
+ if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
+ {
+ # Normalize all whitespace including newline-prefix sequences.
+ $stmt =~ s/$ws_re/ /g;
+
+ # Put spaces after commas.
+ $stmt =~ s/, ?/, /g;
+
+ # Convert 2-digit to 4-digit years.
+ $stmt =~ s/(\b\d\d\b)/19$1/g;
+
+ # Make the use of intervals consistent.
+ if (!$ENV{UPDATE_COPYRIGHT_USE_INTERVALS})
+ {
+ $stmt =~ s/(\d{4})--?(\d{4})/join(', ', $1..$2)/eg;
+ }
+ else
+ {
+ my $ndash = $ARGV =~ /\.tex(i(nfo)?)?$/ ? "--" : "-";
+
+ $stmt =~
+ s/
+ (\d{4})
+ (?:
+ (,\ |--?)
+ ((??{
+ if ($2 ne ', ') { '\d{4}'; }
+ elsif (!$3) { $1 + 1; }
+ else { $3 + 1; }
+ }))
+ )+
+ /$1$ndash$3/gx;
+
+ # When it's 2, emit a single range encompassing all year numbers.
+ $ENV{UPDATE_COPYRIGHT_USE_INTERVALS} == 2
+ and $stmt =~ s/\b(\d{4})\b.*\b(\d{4})\b/$1$ndash$2/;
+ }
+
+ # Format within margin.
+ my $stmt_wrapped;
+ my $text_margin = $margin - length($prefix);
+ if ($prefix =~ /^(\t+)/)
+ {
+ $text_margin -= length($1) * ($tab_width - 1);
+ }
+ while (length $stmt)
+ {
+ if (($stmt =~ s/^(.{1,$text_margin})(?: |$)//)
+ || ($stmt =~ s/^([\S]+)(?: |$)//))
+ {
+ my $line = $1;
+ $stmt_wrapped .= $stmt_wrapped ? "$eol$prefix" : $leading;
+ $stmt_wrapped .= $line;
+ }
+ else
+ {
+ # Should be unreachable, but we don't want an infinite
+ # loop if it can be reached.
+ die;
+ }
+ }
+
+ # Replace the old copyright statement.
+ s/$stmt_re/$stmt_wrapped/;
+ }
+ }
+else
+ {
+ print STDERR "$ARGV: warning: copyright statement not found\n";
+ }
+
+# Hey Emacs!
+# Local variables:
+# coding: utf-8
+# mode: perl
+# indent-tabs-mode: nil
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-line-limit: 200
+# time-stamp-start: "my $VERSION = '"
+# time-stamp-format: "%:y-%02m-%02d.%02H:%02M"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "'; # UTC"
+# End:
diff --git a/build-aux/useless-if-before-free b/build-aux/useless-if-before-free
new file mode 100755
index 0000000..c9a168f
--- /dev/null
+++ b/build-aux/useless-if-before-free
@@ -0,0 +1,226 @@
+#!/bin/sh
+#! -*-perl-*-
+
+# Detect instances of "if (p) free (p);".
+# Likewise "if (p != 0)", "if (0 != p)", or with NULL; and with braces.
+
+# Copyright (C) 2008-2020 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/>.
+#
+# Written by Jim Meyering
+
+# This is a prologue that allows to run a perl script as an executable
+# on systems that are compliant to a POSIX version before POSIX:2017.
+# On such systems, the usual invocation of an executable through execlp()
+# or execvp() fails with ENOEXEC if it is a script that does not start
+# with a #! line. The script interpreter mentioned in the #! line has
+# to be /bin/sh, because on GuixSD systems that is the only program that
+# has a fixed file name. The second line is essential for perl and is
+# also useful for editing this file in Emacs. The next two lines below
+# are valid code in both sh and perl. When executed by sh, they re-execute
+# the script through the perl program found in $PATH. The '-x' option
+# is essential as well; without it, perl would re-execute the script
+# through /bin/sh. When executed by perl, the next two lines are a no-op.
+eval 'exec perl -wSx "$0" "$@"'
+ if 0;
+
+my $VERSION = '2020-04-04 15:07'; # UTC
+# The definition above must lie within the first 8 lines in order
+# for the Emacs time-stamp write hook (at end) to update it.
+# If you change this file with Emacs, please let the write hook
+# do its job. Otherwise, update this string manually.
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+(my $ME = $0) =~ s|.*/||;
+
+# use File::Coda; # https://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try '$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM <<EOF;
+Usage: $ME [OPTIONS] FILE...
+
+Detect any instance in FILE of a useless "if" test before a free call, e.g.,
+"if (p) free (p);". Any such test may be safely removed without affecting
+the semantics of the C code in FILE. Use --name=FOO --name=BAR to also
+detect free-like functions named FOO and BAR.
+
+OPTIONS:
+
+ --list print only the name of each matching FILE (\\0-terminated)
+ --name=N add name N to the list of \'free\'-like functions to detect;
+ may be repeated
+
+ --help display this help and exit
+ --version output version information and exit
+
+Exit status:
+
+ 0 one or more matches
+ 1 no match
+ 2 an error
+
+EXAMPLE:
+
+For example, this command prints all removable "if" tests before "free"
+and "kfree" calls in the linux kernel sources:
+
+ git ls-files -z |xargs -0 $ME --name=kfree
+
+EOF
+ }
+ exit $exit_code;
+}
+
+sub is_NULL ($)
+{
+ my ($expr) = @_;
+ return ($expr eq 'NULL' || $expr eq '0');
+}
+
+{
+ sub EXIT_MATCH {0}
+ sub EXIT_NO_MATCH {1}
+ sub EXIT_ERROR {2}
+ my $err = EXIT_NO_MATCH;
+
+ my $list;
+ my @name = qw(free);
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ list => \$list,
+ 'name=s@' => \@name,
+ ) or usage 1;
+
+ # Make sure we have the right number of non-option arguments.
+ # Always tell the user why we fail.
+ @ARGV < 1
+ and (warn "$ME: missing FILE argument\n"), usage EXIT_ERROR;
+
+ my $or = join '|', @name;
+ my $regexp = qr/(?:$or)/;
+
+ # Set the input record separator.
+ # Note: this makes it impractical to print line numbers.
+ $/ = '"';
+
+ my $found_match = 0;
+ FILE:
+ foreach my $file (@ARGV)
+ {
+ open FH, '<', $file
+ or (warn "$ME: can't open '$file' for reading: $!\n"),
+ $err = EXIT_ERROR, next;
+ while (defined (my $line = <FH>))
+ {
+ # Skip non-matching lines early to save time
+ $line =~ /\bif\b/
+ or next;
+ while ($line =~
+ /\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*([^)]+?))?\s*\)
+ # 1 2 3
+ (?: \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;|
+ \s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
+ {
+ my $all = $1;
+ my ($lhs, $rhs) = ($2, $3);
+ my ($free_opnd, $braced_free_opnd) = ($4, $5);
+ my $non_NULL;
+ if (!defined $rhs) { $non_NULL = $lhs }
+ elsif (is_NULL $rhs) { $non_NULL = $lhs }
+ elsif (is_NULL $lhs) { $non_NULL = $rhs }
+ else { next }
+
+ # Compare the non-NULL part of the "if" expression and the
+ # free'd expression, without regard to white space.
+ $non_NULL =~ tr/ \t//d;
+ my $e2 = defined $free_opnd ? $free_opnd : $braced_free_opnd;
+ $e2 =~ tr/ \t//d;
+ if ($non_NULL eq $e2)
+ {
+ $found_match = 1;
+ $list
+ and (print "$file\0"), next FILE;
+ print "$file: $all\n";
+ }
+ }
+ }
+ }
+ continue
+ {
+ close FH;
+ }
+
+ $found_match && $err == EXIT_NO_MATCH
+ and $err = EXIT_MATCH;
+
+ exit $err;
+}
+
+my $foo = <<'EOF';
+# The above is to *find* them.
+# This adjusts them, removing the unnecessary "if (p)" part.
+
+# FIXME: do something like this as an option (doesn't do braces):
+free=xfree
+git grep -l -z "$free *(" \
+ | xargs -0 useless-if-before-free -l --name="$free" \
+ | xargs -0 perl -0x3b -pi -e \
+ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s+('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\)\s*;)/$2/s'
+
+# Use the following to remove redundant uses of kfree inside braces.
+# Note that -0777 puts perl in slurp-whole-file mode;
+# but we have plenty of memory, these days...
+free=kfree
+git grep -l -z "$free *(" \
+ | xargs -0 useless-if-before-free -l --name="$free" \
+ | xargs -0 perl -0777 -pi -e \
+ 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*(?:0|NULL))?\s*\)\s*\{\s*('"$free"'\s*\((?:\s*\([^)]+\))?\s*\1\s*\);)\s*\}[^\n]*$/$2/gms'
+
+Be careful that the result of the above transformation is valid.
+If the matched string is followed by "else", then obviously, it won't be.
+
+When modifying files, refuse to process anything other than a regular file.
+EOF
+
+## Local Variables:
+## mode: perl
+## indent-tabs-mode: nil
+## eval: (add-hook 'before-save-hook 'time-stamp)
+## time-stamp-line-limit: 50
+## time-stamp-start: "my $VERSION = '"
+## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+## time-stamp-time-zone: "UTC0"
+## time-stamp-end: "'; # UTC"
+## End:
diff --git a/build-aux/vc-list-files b/build-aux/vc-list-files
new file mode 100755
index 0000000..a8b8d9a
--- /dev/null
+++ b/build-aux/vc-list-files
@@ -0,0 +1,113 @@
+#!/bin/sh
+# List version-controlled file names.
+
+# Print a version string.
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2006-2020 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/>.
+
+
+# List the specified version-controlled files.
+# With no argument, list them all. With a single DIRECTORY argument,
+# list the version-controlled files in that directory.
+
+# If there's an argument, it must be a single, "."-relative directory name.
+# cvsu is part of the cvsutils package: https://www.red-bean.com/cvsutils/
+
+postprocess=
+case $1 in
+ --help) cat <<EOF
+Usage: $0 [-C SRCDIR] [DIR...]
+
+Output a list of version-controlled files in DIR (default .), relative to
+SRCDIR (default .). SRCDIR must be the top directory of a checkout.
+
+Options:
+ --help print this help, then exit
+ --version print version number, then exit
+ -C SRCDIR change directory to SRCDIR before generating list
+
+Report bugs and patches to <bug-gnulib@gnu.org>.
+EOF
+ exit ;;
+
+ --version)
+ year=`echo "$scriptversion" | sed 's/[^0-9].*//'`
+ cat <<EOF
+vc-list-files $scriptversion
+Copyright (C) $year Free Software Foundation, Inc,
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+EOF
+ exit ;;
+
+ -C)
+ test "$2" = . || postprocess="| sed 's|^|$2/|'"
+ cd "$2" || exit 1
+ shift; shift ;;
+esac
+
+test $# = 0 && set .
+
+for dir
+do
+ if test -d .git || test -f .git; then
+ test "x$dir" = x. \
+ && dir= sed_esc= \
+ || { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
+ # Ignore git symlinks - either they point into the tree, in which case
+ # we don't need to visit the target twice, or they point somewhere
+ # else (often into a submodule), in which case the content does not
+ # belong to this package.
+ eval exec git ls-tree -r 'HEAD:"$dir"' \
+ \| sed -n '"s/^100[^ ]*./$sed_esc/p"' $postprocess
+ elif test -d .hg; then
+ eval exec hg locate '"$dir/*"' $postprocess
+ elif test -d .bzr; then
+ test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
+ eval exec bzr ls -R --versioned '"$dir"' $postprocess
+ elif test -d CVS; then
+ test "$postprocess" = '' && postprocess="| sed 's|^\./||'"
+ if test -x build-aux/cvsu; then
+ eval build-aux/cvsu --find --types=AFGM '"$dir"' $postprocess
+ elif (cvsu --help) >/dev/null 2>&1; then
+ eval cvsu --find --types=AFGM '"$dir"' $postprocess
+ else
+ eval awk -F/ \''{ \
+ if (!$1 && $3 !~ /^-/) { \
+ f=FILENAME; \
+ if (f ~ /CVS\/Entries$/) \
+ f = substr(f, 1, length(f)-11); \
+ print f $2; \
+ }}'\'' \
+ `find "$dir" -name Entries -print` /dev/null' $postprocess
+ fi
+ elif test -d .svn; then
+ eval exec svn list -R '"$dir"' $postprocess
+ else
+ echo "$0: Failed to determine type of version control used in `pwd`" 1>&2
+ exit 1
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 0000000..bf82db5
--- /dev/null
+++ b/configure
@@ -0,0 +1,57797 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.70 for wget 1.21.
+#
+# Report bugs to <bug-wget@gnu.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and bug-wget@gnu.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='wget'
+PACKAGE_TARNAME='wget'
+PACKAGE_VERSION='1.21'
+PACKAGE_STRING='wget 1.21'
+PACKAGE_BUGREPORT='bug-wget@gnu.org'
+PACKAGE_URL=''
+
+ac_unique_file="src/wget.h"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_c_list=
+gl_use_threads_default=
+gl_use_winpthreads_default=
+gt_needs=
+ac_func_c_list=
+with_openssl_default='no'
+LIB_CRYPTO=
+gl_fnmatch_required=POSIX
+gl_getopt_required=POSIX
+ac_subst_vars='gltests_LTLIBOBJS
+gltests_LIBOBJS
+gl_LTLIBOBJS
+gl_LIBOBJS
+CONFIG_INCLUDE
+am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+WITH_NTLM_FALSE
+WITH_NTLM_TRUE
+WITH_XATTR_FALSE
+WITH_XATTR_TRUE
+METALINK_IS_ENABLED_FALSE
+METALINK_IS_ENABLED_TRUE
+WITH_SSL_FALSE
+WITH_SSL_TRUE
+IRI_IS_ENABLED_FALSE
+IRI_IS_ENABLED_TRUE
+GPGME_LIBS
+GPGME_CFLAGS
+GPGME_CONFIG
+METALINK_LIBS
+METALINK_CFLAGS
+CARES_LIBS
+CARES_CFLAGS
+PCRE_LIBS
+PCRE_CFLAGS
+PCRE2_LIBS
+PCRE2_CFLAGS
+UUID_LIBS
+UUID_CFLAGS
+COMMENT_IF_NO_POD2MAN
+POD2MAN
+PERL
+NETTLE_LIBS
+LIBGNUTLS_PREFIX
+LTLIBGNUTLS
+LIBGNUTLS
+HAVE_LIBGNUTLS
+GNUTLS_LIBS
+GNUTLS_CFLAGS
+LIBSSL_PREFIX
+LTLIBSSL
+LIBSSL
+HAVE_LIBSSL
+OPENSSL_LIBS
+OPENSSL_CFLAGS
+ZLIB_LIBS
+ZLIB_CFLAGS
+LIBPSL_LIBS
+LIBPSL_CFLAGS
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+GNULIB_WARN_CFLAGS
+LIBOBJS
+LIBGNU_LTLIBDEPS
+LIBGNU_LIBDEPS
+gltests_WITNESS
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H
+NEXT_WCHAR_H
+HAVE_UTIME_H
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H
+NEXT_UTIME_H
+REPLACE_UTIME
+HAVE_UTIME
+GNULIB_MDA_UTIME
+GNULIB_UTIME
+LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE
+LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE
+LIBUNISTRING_UNIWIDTH_H
+LIBUNISTRING_UNITYPES_H
+LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE
+LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE
+LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE
+LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE
+LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE
+LIBUNISTRING_UNISTR_H
+HAVE_UNISTD_H
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
+NEXT_UNISTD_H
+LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE
+LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE
+LIBUNISTRING_UNINORM_H
+LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE
+LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE
+LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE
+LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE
+LIBUNISTRING_UNICTYPE_H
+LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE
+LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE
+LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE
+LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE
+LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE
+LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE
+LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE
+LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE
+LIBUNISTRING_UNICASE_H
+UNISTD_H_DEFINES_STRUCT_TIMESPEC
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC
+TIME_H_DEFINES_STRUCT_TIMESPEC
+NEXT_AS_FIRST_DIRECTIVE_TIME_H
+NEXT_TIME_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H
+NEXT_SYS_WAIT_H
+GNULIB_WAITPID
+HAVE_SYS_UIO_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H
+NEXT_SYS_UIO_H
+HAVE_SYS_RANDOM_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H
+NEXT_SYS_RANDOM_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H
+NEXT_SYS_IOCTL_H
+HAVE_SYS_IOCTL_H
+HAVE_SYS_FILE_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H
+NEXT_SYS_FILE_H
+HAVE_STRINGS_H
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H
+NEXT_STRINGS_H
+NEXT_AS_FIRST_DIRECTIVE_STRING_H
+NEXT_STRING_H
+HAVE_DECL_STRNCASECMP
+HAVE_STRCASECMP
+HAVE_FFS
+GNULIB_FFS
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
+NEXT_STDLIB_H
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H
+NEXT_STDIO_H
+HAVE__BOOL
+GL_GENERATE_STDBOOL_H_FALSE
+GL_GENERATE_STDBOOL_H_TRUE
+STDBOOL_H
+GL_GENERATE_STDALIGN_H_FALSE
+GL_GENERATE_STDALIGN_H_TRUE
+STDALIGN_H
+HAVE_SPAWN_H
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H
+NEXT_SPAWN_H
+ASM_SYMBOL_PREFIX
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H
+NEXT_SIGNAL_H
+HAVE_STRUCT_SCHED_PARAM
+HAVE_SCHED_H
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H
+NEXT_SCHED_H
+REPLACE_SCHED_YIELD
+HAVE_SCHED_YIELD
+GNULIB_SCHED_YIELD
+REPLACE_RAISE
+REPLACE_PTHREAD_SIGMASK
+HAVE_SIGHANDLER_T
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T
+HAVE_STRUCT_SIGACTION_SA_SIGACTION
+HAVE_SIGACTION
+HAVE_SIGINFO_T
+HAVE_SIGSET_T
+HAVE_RAISE
+HAVE_PTHREAD_SIGMASK
+HAVE_POSIX_SIGNALBLOCKING
+GNULIB_SIGACTION
+GNULIB_SIGPROCMASK
+GNULIB_SIGNAL_H_SIGPIPE
+GNULIB_RAISE
+GNULIB_PTHREAD_SIGMASK
+LIB_POSIX_SPAWN
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+REPLACE_POSIX_SPAWN
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T
+HAVE_POSIX_SPAWNATTR_T
+HAVE_POSIX_SPAWN
+GNULIB_POSIX_SPAWNATTR_DESTROY
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM
+GNULIB_POSIX_SPAWNATTR_SETPGROUP
+GNULIB_POSIX_SPAWNATTR_GETPGROUP
+GNULIB_POSIX_SPAWNATTR_SETFLAGS
+GNULIB_POSIX_SPAWNATTR_GETFLAGS
+GNULIB_POSIX_SPAWNATTR_INIT
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT
+GNULIB_POSIX_SPAWNP
+GNULIB_POSIX_SPAWN
+LIB_NL_LANGINFO
+GL_GENERATE_NETINET_IN_H_FALSE
+GL_GENERATE_NETINET_IN_H_TRUE
+NETINET_IN_H
+HAVE_NETINET_IN_H
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H
+NEXT_NETINET_IN_H
+LIB_NANOSLEEP
+LIB_SELECT
+LIBSOCKET
+HAVE_SYS_SELECT_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H
+NEXT_SYS_SELECT_H
+REPLACE_SELECT
+REPLACE_PSELECT
+HAVE_PSELECT
+GNULIB_SELECT
+GNULIB_PSELECT
+REPLACE_LOCALTIME
+REPLACE_GMTIME
+REPLACE_TZSET
+REPLACE_TIMEGM
+REPLACE_STRFTIME
+REPLACE_NANOSLEEP
+REPLACE_MKTIME
+REPLACE_LOCALTIME_R
+REPLACE_CTIME
+HAVE_TIMEZONE_T
+HAVE_TIMEGM
+HAVE_STRPTIME
+HAVE_NANOSLEEP
+HAVE_DECL_LOCALTIME_R
+GNULIB_MDA_TZSET
+GNULIB_TZSET
+GNULIB_TIME_RZ
+GNULIB_TIME_R
+GNULIB_TIMEGM
+GNULIB_STRPTIME
+GNULIB_STRFTIME
+GNULIB_NANOSLEEP
+GNULIB_LOCALTIME
+GNULIB_MKTIME
+GNULIB_CTIME
+UNDEFINE_STRTOK_R
+REPLACE_STRSIGNAL
+REPLACE_STRERRORNAME_NP
+REPLACE_STRERROR_R
+REPLACE_STRERROR
+REPLACE_STRTOK_R
+REPLACE_STRCASESTR
+REPLACE_STRSTR
+REPLACE_STRNLEN
+REPLACE_STRNDUP
+REPLACE_STRNCAT
+REPLACE_STRDUP
+REPLACE_STRCHRNUL
+REPLACE_STPNCPY
+REPLACE_MEMMEM
+REPLACE_MEMCHR
+HAVE_STRVERSCMP
+HAVE_DECL_STRSIGNAL
+HAVE_SIGDESCR_NP
+HAVE_SIGABBREV_NP
+HAVE_STRERRORNAME_NP
+HAVE_DECL_STRERROR_R
+HAVE_DECL_STRTOK_R
+HAVE_STRCASESTR
+HAVE_STRSEP
+HAVE_STRPBRK
+HAVE_DECL_STRNLEN
+HAVE_DECL_STRNDUP
+HAVE_DECL_STRDUP
+HAVE_STRCHRNUL
+HAVE_STPNCPY
+HAVE_STPCPY
+HAVE_RAWMEMCHR
+HAVE_DECL_MEMRCHR
+HAVE_MEMPCPY
+HAVE_DECL_MEMMEM
+HAVE_FFSLL
+HAVE_FFSL
+HAVE_EXPLICIT_BZERO
+GNULIB_MDA_STRDUP
+GNULIB_MDA_MEMCCPY
+HAVE_MBSLEN
+GNULIB_STRVERSCMP
+GNULIB_STRSIGNAL
+GNULIB_SIGDESCR_NP
+GNULIB_SIGABBREV_NP
+GNULIB_STRERRORNAME_NP
+GNULIB_STRERROR_R
+GNULIB_STRERROR
+GNULIB_MBSTOK_R
+GNULIB_MBSSEP
+GNULIB_MBSSPN
+GNULIB_MBSPBRK
+GNULIB_MBSCSPN
+GNULIB_MBSCASESTR
+GNULIB_MBSPCASECMP
+GNULIB_MBSNCASECMP
+GNULIB_MBSCASECMP
+GNULIB_MBSSTR
+GNULIB_MBSRCHR
+GNULIB_MBSCHR
+GNULIB_MBSNLEN
+GNULIB_MBSLEN
+GNULIB_STRTOK_R
+GNULIB_STRCASESTR
+GNULIB_STRSTR
+GNULIB_STRSEP
+GNULIB_STRPBRK
+GNULIB_STRNLEN
+GNULIB_STRNDUP
+GNULIB_STRNCAT
+GNULIB_STRDUP
+GNULIB_STRCHRNUL
+GNULIB_STPNCPY
+GNULIB_STPCPY
+GNULIB_RAWMEMCHR
+GNULIB_MEMRCHR
+GNULIB_MEMPCPY
+GNULIB_MEMMEM
+GNULIB_MEMCHR
+GNULIB_FFSLL
+GNULIB_FFSL
+GNULIB_EXPLICIT_BZERO
+HAVE_VISIBILITY
+CFLAG_VISIBILITY
+LIB_MBRTOWC
+LTLIBMULTITHREAD
+LIBMULTITHREAD
+LTLIBTHREAD
+LIBTHREAD
+LIBSTDTHREAD
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H
+NEXT_LOCALE_H
+HAVE_XLOCALE_H
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H
+NEXT_STDDEF_H
+GL_GENERATE_STDDEF_H_FALSE
+GL_GENERATE_STDDEF_H_TRUE
+STDDEF_H
+HAVE_WCHAR_T
+HAVE_MAX_ALIGN_T
+REPLACE_NULL
+REPLACE_STRUCT_LCONV
+REPLACE_FREELOCALE
+REPLACE_DUPLOCALE
+REPLACE_NEWLOCALE
+REPLACE_SETLOCALE
+REPLACE_LOCALECONV
+HAVE_FREELOCALE
+HAVE_DUPLOCALE
+HAVE_NEWLOCALE
+GNULIB_LOCALENAME
+GNULIB_DUPLOCALE
+GNULIB_SETLOCALE_NULL
+GNULIB_SETLOCALE
+GNULIB_LOCALECONV
+LOCALCHARSET_TESTS_ENVIRONMENT
+LIBUNISTRING_PREFIX
+LTLIBUNISTRING
+LIBUNISTRING
+HAVE_LIBUNISTRING
+HAVE_LANGINFO_YESEXPR
+HAVE_LANGINFO_ERA
+HAVE_LANGINFO_ALTMON
+HAVE_LANGINFO_T_FMT_AMPM
+HAVE_LANGINFO_CODESET
+HAVE_LANGINFO_H
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H
+NEXT_LANGINFO_H
+REPLACE_NL_LANGINFO
+HAVE_NL_LANGINFO
+GNULIB_NL_LANGINFO
+LOCALE_ZH_CN
+LOCALE_FR_UTF8
+LOCALE_JA
+REPLACE_TOWLOWER
+REPLACE_ISWCNTRL
+HAVE_WCTYPE_H
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H
+NEXT_WCTYPE_H
+HAVE_CRTDEFS_H
+HAVE_WINT_T
+HAVE_ISWCNTRL
+REPLACE_ISWXDIGIT
+REPLACE_ISWDIGIT
+REPLACE_ISWBLANK
+HAVE_WCTRANS_T
+HAVE_WCTYPE_T
+HAVE_ISWBLANK
+GNULIB_TOWCTRANS
+GNULIB_WCTRANS
+GNULIB_ISWCTYPE
+GNULIB_WCTYPE
+GNULIB_ISWXDIGIT
+GNULIB_ISWDIGIT
+GNULIB_ISWBLANK
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H
+NEXT_INTTYPES_H
+UINT64_MAX_EQ_ULONG_MAX
+UINT32_MAX_LT_UINTMAX_MAX
+PRIPTR_PREFIX
+INT64_MAX_EQ_LONG_MAX
+INT32_MAX_LT_INTMAX_MAX
+REPLACE_STRTOUMAX
+REPLACE_STRTOIMAX
+HAVE_IMAXDIV_T
+HAVE_DECL_STRTOUMAX
+HAVE_DECL_STRTOIMAX
+HAVE_DECL_IMAXDIV
+HAVE_DECL_IMAXABS
+GNULIB_STRTOUMAX
+GNULIB_STRTOIMAX
+GNULIB_IMAXDIV
+GNULIB_IMAXABS
+GL_GENERATE_STDINT_H_FALSE
+GL_GENERATE_STDINT_H_TRUE
+STDINT_H
+HAVE_SYS_INTTYPES_H
+HAVE_SYS_BITYPES_H
+HAVE_C99_STDINT_H
+WINT_T_SUFFIX
+WCHAR_T_SUFFIX
+SIG_ATOMIC_T_SUFFIX
+SIZE_T_SUFFIX
+PTRDIFF_T_SUFFIX
+HAVE_SIGNED_WINT_T
+HAVE_SIGNED_WCHAR_T
+HAVE_SIGNED_SIG_ATOMIC_T
+BITSIZEOF_WINT_T
+BITSIZEOF_WCHAR_T
+BITSIZEOF_SIG_ATOMIC_T
+BITSIZEOF_SIZE_T
+BITSIZEOF_PTRDIFF_T
+APPLE_UNIVERSAL_BUILD
+HAVE_STDINT_H
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H
+NEXT_STDINT_H
+HAVE_SYS_TYPES_H
+HAVE_INTTYPES_H
+HAVE_WCHAR_H
+GNULIB_OVERRIDES_WINT_T
+GL_GENERATE_LIMITS_H_FALSE
+GL_GENERATE_LIMITS_H_TRUE
+LIMITS_H
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
+NEXT_LIMITS_H
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H
+NEXT_ICONV_H
+LIB_HARD_LOCALE
+LIB_SETLOCALE_NULL
+LIB_SCHED_YIELD
+LIBPMULTITHREAD
+LIBPTHREAD
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H
+NEXT_SYS_TIME_H
+REPLACE_STRUCT_TIMEVAL
+REPLACE_GETTIMEOFDAY
+HAVE_SYS_TIME_H
+HAVE_STRUCT_TIMEVAL
+HAVE_GETTIMEOFDAY
+GNULIB_GETTIMEOFDAY
+LIB_GETRANDOM
+REPLACE_GETRANDOM
+HAVE_GETRANDOM
+GNULIB_GETRANDOM
+GNULIB_GL_UNISTD_H_GETOPT
+GETOPT_CDEFS_H
+GETOPT_H
+HAVE_SYS_CDEFS_H
+HAVE_GETOPT_H
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H
+NEXT_GETOPT_H
+GETADDRINFO_LIB
+INET_NTOP_LIB
+SERVENT_LIB
+HOSTENT_LIB
+HAVE_NETDB_H
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H
+NEXT_NETDB_H
+REPLACE_GETADDRINFO
+REPLACE_GAI_STRERROR
+HAVE_DECL_GETNAMEINFO
+HAVE_DECL_GETADDRINFO
+HAVE_DECL_GAI_STRERROR
+HAVE_DECL_FREEADDRINFO
+HAVE_STRUCT_ADDRINFO
+GNULIB_GETADDRINFO
+WINDOWS_64_BIT_ST_SIZE
+WINDOWS_STAT_TIMESPEC
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H
+NEXT_SYS_STAT_H
+REPLACE_UTIMENSAT
+REPLACE_STAT
+REPLACE_MKNOD
+REPLACE_MKFIFO
+REPLACE_MKDIR
+REPLACE_LSTAT
+REPLACE_FUTIMENS
+REPLACE_FSTATAT
+REPLACE_FSTAT
+REPLACE_FCHMODAT
+HAVE_UTIMENSAT
+HAVE_MKNODAT
+HAVE_MKNOD
+HAVE_MKFIFOAT
+HAVE_MKFIFO
+HAVE_MKDIRAT
+HAVE_LSTAT
+HAVE_LCHMOD
+HAVE_GETUMASK
+HAVE_FUTIMENS
+HAVE_FSTATAT
+HAVE_FCHMODAT
+GNULIB_MDA_UMASK
+GNULIB_MDA_MKDIR
+GNULIB_MDA_CHMOD
+GNULIB_OVERRIDES_STRUCT_STAT
+GNULIB_UTIMENSAT
+GNULIB_STAT
+GNULIB_MKNODAT
+GNULIB_MKNOD
+GNULIB_MKFIFOAT
+GNULIB_MKFIFO
+GNULIB_MKDIRAT
+GNULIB_MKDIR
+GNULIB_LSTAT
+GNULIB_LCHMOD
+GNULIB_GETUMASK
+GNULIB_FUTIMENS
+GNULIB_FSTATAT
+GNULIB_FSTAT
+GNULIB_FCHMODAT
+WINDOWS_STAT_INODES
+WINDOWS_64_BIT_OFF_T
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
+NEXT_SYS_TYPES_H
+GL_GENERATE_FNMATCH_H_FALSE
+GL_GENERATE_FNMATCH_H_TRUE
+FNMATCH_H
+HAVE_FNMATCH_H
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H
+NEXT_FNMATCH_H
+REPLACE_FNMATCH
+HAVE_FNMATCH
+GNULIB_FNMATCH
+HAVE_FLOCK
+GNULIB_FLOCK
+REPLACE_ITOLD
+GL_GENERATE_FLOAT_H_FALSE
+GL_GENERATE_FLOAT_H_TRUE
+FLOAT_H
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H
+NEXT_FLOAT_H
+REPLACE_VSPRINTF
+REPLACE_VSNPRINTF
+REPLACE_VPRINTF
+REPLACE_VFPRINTF
+REPLACE_VDPRINTF
+REPLACE_VASPRINTF
+REPLACE_TMPFILE
+REPLACE_STDIO_WRITE_FUNCS
+REPLACE_STDIO_READ_FUNCS
+REPLACE_SPRINTF
+REPLACE_SNPRINTF
+REPLACE_RENAMEAT
+REPLACE_RENAME
+REPLACE_REMOVE
+REPLACE_PRINTF
+REPLACE_POPEN
+REPLACE_PERROR
+REPLACE_OBSTACK_PRINTF
+REPLACE_GETLINE
+REPLACE_GETDELIM
+REPLACE_FTELLO
+REPLACE_FTELL
+REPLACE_FSEEKO
+REPLACE_FSEEK
+REPLACE_FREOPEN
+REPLACE_FPURGE
+REPLACE_FPRINTF
+REPLACE_FOPEN
+REPLACE_FFLUSH
+REPLACE_FDOPEN
+REPLACE_FCLOSE
+REPLACE_DPRINTF
+HAVE_VDPRINTF
+HAVE_VASPRINTF
+HAVE_RENAMEAT
+HAVE_POPEN
+HAVE_PCLOSE
+HAVE_FTELLO
+HAVE_FSEEKO
+HAVE_DPRINTF
+HAVE_DECL_VSNPRINTF
+HAVE_DECL_SNPRINTF
+HAVE_DECL_OBSTACK_PRINTF
+HAVE_DECL_GETLINE
+HAVE_DECL_GETDELIM
+HAVE_DECL_FTELLO
+HAVE_DECL_FSEEKO
+HAVE_DECL_FPURGE
+HAVE_DECL_FCLOSEALL
+GNULIB_MDA_TEMPNAM
+GNULIB_MDA_PUTW
+GNULIB_MDA_GETW
+GNULIB_MDA_FILENO
+GNULIB_MDA_FDOPEN
+GNULIB_MDA_FCLOSEALL
+GNULIB_VSPRINTF_POSIX
+GNULIB_VSNPRINTF
+GNULIB_VPRINTF_POSIX
+GNULIB_VPRINTF
+GNULIB_VFPRINTF_POSIX
+GNULIB_VFPRINTF
+GNULIB_VDPRINTF
+GNULIB_VSCANF
+GNULIB_VFSCANF
+GNULIB_VASPRINTF
+GNULIB_TMPFILE
+GNULIB_STDIO_H_SIGPIPE
+GNULIB_STDIO_H_NONBLOCKING
+GNULIB_SPRINTF_POSIX
+GNULIB_SNPRINTF
+GNULIB_SCANF
+GNULIB_RENAMEAT
+GNULIB_RENAME
+GNULIB_REMOVE
+GNULIB_PUTS
+GNULIB_PUTCHAR
+GNULIB_PUTC
+GNULIB_PRINTF_POSIX
+GNULIB_PRINTF
+GNULIB_POPEN
+GNULIB_PERROR
+GNULIB_PCLOSE
+GNULIB_OBSTACK_PRINTF_POSIX
+GNULIB_OBSTACK_PRINTF
+GNULIB_GETLINE
+GNULIB_GETDELIM
+GNULIB_GETCHAR
+GNULIB_GETC
+GNULIB_FWRITE
+GNULIB_FTELLO
+GNULIB_FTELL
+GNULIB_FSEEKO
+GNULIB_FSEEK
+GNULIB_FSCANF
+GNULIB_FREOPEN
+GNULIB_FREAD
+GNULIB_FPUTS
+GNULIB_FPUTC
+GNULIB_FPURGE
+GNULIB_FPRINTF_POSIX
+GNULIB_FPRINTF
+GNULIB_FOPEN
+GNULIB_FGETS
+GNULIB_FGETC
+GNULIB_FFLUSH
+GNULIB_FDOPEN
+GNULIB_FCLOSE
+GNULIB_DPRINTF
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H
+NEXT_FCNTL_H
+REPLACE_OPENAT
+REPLACE_OPEN
+REPLACE_FCNTL
+REPLACE_CREAT
+HAVE_OPENAT
+HAVE_FCNTL
+GNULIB_MDA_OPEN
+GNULIB_MDA_CREAT
+GNULIB_OPENAT
+GNULIB_OPEN
+GNULIB_NONBLOCKING
+GNULIB_FCNTL
+GNULIB_CREAT
+EOVERFLOW_VALUE
+EOVERFLOW_HIDDEN
+ENOLINK_VALUE
+ENOLINK_HIDDEN
+EMULTIHOP_VALUE
+EMULTIHOP_HIDDEN
+GL_GENERATE_ERRNO_H_FALSE
+GL_GENERATE_ERRNO_H_TRUE
+ERRNO_H
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H
+NEXT_ERRNO_H
+HAVE_DIRENT_H
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H
+NEXT_DIRENT_H
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H
+NEXT_CTYPE_H
+HAVE_ISBLANK
+GNULIB_ISBLANK
+LIB_CRYPTO
+REPLACE_FDOPENDIR
+REPLACE_DIRFD
+REPLACE_CLOSEDIR
+REPLACE_OPENDIR
+HAVE_ALPHASORT
+HAVE_SCANDIR
+HAVE_FDOPENDIR
+HAVE_DECL_FDOPENDIR
+HAVE_DECL_DIRFD
+HAVE_CLOSEDIR
+HAVE_REWINDDIR
+HAVE_READDIR
+HAVE_OPENDIR
+GNULIB_ALPHASORT
+GNULIB_SCANDIR
+GNULIB_FDOPENDIR
+GNULIB_DIRFD
+GNULIB_CLOSEDIR
+GNULIB_REWINDDIR
+GNULIB_READDIR
+GNULIB_OPENDIR
+HAVE_MSVC_INVALID_PARAMETER_HANDLER
+LIB_CLOCK_GETTIME
+REPLACE_WCTOMB
+REPLACE_UNSETENV
+REPLACE_STRTOLD
+REPLACE_STRTOD
+REPLACE_SETSTATE
+REPLACE_SETENV
+REPLACE_REALPATH
+REPLACE_REALLOC
+REPLACE_RANDOM_R
+REPLACE_RANDOM
+REPLACE_QSORT_R
+REPLACE_PUTENV
+REPLACE_PTSNAME_R
+REPLACE_PTSNAME
+REPLACE_POSIX_MEMALIGN
+REPLACE_MKSTEMP
+REPLACE_MBTOWC
+REPLACE_MALLOC
+REPLACE_INITSTATE
+REPLACE_FREE
+REPLACE_CANONICALIZE_FILE_NAME
+REPLACE_CALLOC
+REPLACE_ALIGNED_ALLOC
+HAVE_DECL_UNSETENV
+HAVE_UNLOCKPT
+HAVE_SYS_LOADAVG_H
+HAVE_STRUCT_RANDOM_DATA
+HAVE_STRTOULL
+HAVE_STRTOLL
+HAVE_STRTOLD
+HAVE_STRTOD
+HAVE_DECL_SETSTATE
+HAVE_SETSTATE
+HAVE_DECL_SETENV
+HAVE_SETENV
+HAVE_SECURE_GETENV
+HAVE_RPMATCH
+HAVE_REALPATH
+HAVE_REALLOCARRAY
+HAVE_RANDOM_R
+HAVE_RANDOM_H
+HAVE_RANDOM
+HAVE_QSORT_R
+HAVE_PTSNAME_R
+HAVE_PTSNAME
+HAVE_POSIX_OPENPT
+HAVE_POSIX_MEMALIGN
+HAVE_MKSTEMPS
+HAVE_MKSTEMP
+HAVE_MKOSTEMPS
+HAVE_MKOSTEMP
+HAVE_MKDTEMP
+HAVE_MBTOWC
+HAVE_DECL_INITSTATE
+HAVE_INITSTATE
+HAVE_GRANTPT
+HAVE_GETSUBOPT
+HAVE_DECL_GETLOADAVG
+HAVE_DECL_GCVT
+HAVE_DECL_FCVT
+HAVE_DECL_ECVT
+HAVE_CANONICALIZE_FILE_NAME
+HAVE_ATOLL
+HAVE_ALIGNED_ALLOC
+HAVE__EXIT
+GNULIB_MDA_PUTENV
+GNULIB_MDA_MKTEMP
+GNULIB_MDA_GCVT
+GNULIB_MDA_FCVT
+GNULIB_MDA_ECVT
+GNULIB_WCTOMB
+GNULIB_UNSETENV
+GNULIB_UNLOCKPT
+GNULIB_SYSTEM_POSIX
+GNULIB_STRTOULL
+GNULIB_STRTOLL
+GNULIB_STRTOLD
+GNULIB_STRTOD
+GNULIB_SETENV
+GNULIB_SECURE_GETENV
+GNULIB_RPMATCH
+GNULIB_REALPATH
+GNULIB_REALLOC_POSIX
+GNULIB_REALLOCARRAY
+GNULIB_RANDOM_R
+GNULIB_RANDOM
+GNULIB_QSORT_R
+GNULIB_PUTENV
+GNULIB_PTSNAME_R
+GNULIB_PTSNAME
+GNULIB_POSIX_OPENPT
+GNULIB_POSIX_MEMALIGN
+GNULIB_MKSTEMPS
+GNULIB_MKSTEMP
+GNULIB_MKOSTEMPS
+GNULIB_MKOSTEMP
+GNULIB_MKDTEMP
+GNULIB_MBTOWC
+GNULIB_MALLOC_POSIX
+GNULIB_GRANTPT
+GNULIB_GETSUBOPT
+GNULIB_GETLOADAVG
+GNULIB_FREE_POSIX
+GNULIB_CANONICALIZE_FILE_NAME
+GNULIB_CALLOC_POSIX
+GNULIB_ATOLL
+GNULIB_ALIGNED_ALLOC
+GNULIB__EXIT
+GL_GENERATE_BYTESWAP_H_FALSE
+GL_GENERATE_BYTESWAP_H_TRUE
+BYTESWAP_H
+LOCALE_FR
+REPLACE_WCSTOK
+REPLACE_WCSFTIME
+REPLACE_WCSWIDTH
+REPLACE_WCWIDTH
+REPLACE_WCSNRTOMBS
+REPLACE_WCSRTOMBS
+REPLACE_WCRTOMB
+REPLACE_MBSNRTOWCS
+REPLACE_MBSRTOWCS
+REPLACE_MBRLEN
+REPLACE_MBRTOWC
+REPLACE_MBSINIT
+REPLACE_WCTOB
+REPLACE_BTOWC
+REPLACE_MBSTATE_T
+HAVE_DECL_WCWIDTH
+HAVE_DECL_WCSDUP
+HAVE_DECL_WCTOB
+HAVE_WCSFTIME
+HAVE_WCSWIDTH
+HAVE_WCSTOK
+HAVE_WCSSTR
+HAVE_WCSPBRK
+HAVE_WCSSPN
+HAVE_WCSCSPN
+HAVE_WCSRCHR
+HAVE_WCSCHR
+HAVE_WCSDUP
+HAVE_WCSXFRM
+HAVE_WCSCOLL
+HAVE_WCSNCASECMP
+HAVE_WCSCASECMP
+HAVE_WCSNCMP
+HAVE_WCSCMP
+HAVE_WCSNCAT
+HAVE_WCSCAT
+HAVE_WCPNCPY
+HAVE_WCSNCPY
+HAVE_WCPCPY
+HAVE_WCSCPY
+HAVE_WCSNLEN
+HAVE_WCSLEN
+HAVE_WMEMSET
+HAVE_WMEMPCPY
+HAVE_WMEMMOVE
+HAVE_WMEMCPY
+HAVE_WMEMCMP
+HAVE_WMEMCHR
+HAVE_WCSNRTOMBS
+HAVE_WCSRTOMBS
+HAVE_WCRTOMB
+HAVE_MBSNRTOWCS
+HAVE_MBSRTOWCS
+HAVE_MBRLEN
+HAVE_MBRTOWC
+HAVE_MBSINIT
+HAVE_BTOWC
+GNULIB_MDA_WCSDUP
+GNULIB_WCSFTIME
+GNULIB_WCSWIDTH
+GNULIB_WCSTOK
+GNULIB_WCSSTR
+GNULIB_WCSPBRK
+GNULIB_WCSSPN
+GNULIB_WCSCSPN
+GNULIB_WCSRCHR
+GNULIB_WCSCHR
+GNULIB_WCSDUP
+GNULIB_WCSXFRM
+GNULIB_WCSCOLL
+GNULIB_WCSNCASECMP
+GNULIB_WCSCASECMP
+GNULIB_WCSNCMP
+GNULIB_WCSCMP
+GNULIB_WCSNCAT
+GNULIB_WCSCAT
+GNULIB_WCPNCPY
+GNULIB_WCSNCPY
+GNULIB_WCPCPY
+GNULIB_WCSCPY
+GNULIB_WCSNLEN
+GNULIB_WCSLEN
+GNULIB_WMEMSET
+GNULIB_WMEMPCPY
+GNULIB_WMEMMOVE
+GNULIB_WMEMCPY
+GNULIB_WMEMCMP
+GNULIB_WMEMCHR
+GNULIB_WCWIDTH
+GNULIB_WCSNRTOMBS
+GNULIB_WCSRTOMBS
+GNULIB_WCRTOMB
+GNULIB_MBSNRTOWCS
+GNULIB_MBSRTOWCS
+GNULIB_MBRLEN
+GNULIB_MBRTOWC
+GNULIB_MBSINIT
+GNULIB_WCTOB
+GNULIB_BTOWC
+HAVE_FEATURES_H
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H
+NEXT_ARPA_INET_H
+HAVE_ARPA_INET_H
+REPLACE_INET_PTON
+REPLACE_INET_NTOP
+HAVE_DECL_INET_PTON
+HAVE_DECL_INET_NTOP
+GNULIB_INET_PTON
+GNULIB_INET_NTOP
+HAVE_ALLOCA_H
+GL_GENERATE_ALLOCA_H_FALSE
+GL_GENERATE_ALLOCA_H_TRUE
+ALLOCA_H
+ALLOCA
+HAVE_WINSOCK2_H
+REPLACE_IOCTL
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
+SYS_IOCTL_H_HAVE_WINSOCK2_H
+GNULIB_IOCTL
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
+UNISTD_H_HAVE_WINSOCK2_H
+UNISTD_H_HAVE_SYS_RANDOM_H
+REPLACE_WRITE
+REPLACE_USLEEP
+REPLACE_UNLINKAT
+REPLACE_UNLINK
+REPLACE_TTYNAME_R
+REPLACE_TRUNCATE
+REPLACE_SYMLINKAT
+REPLACE_SYMLINK
+REPLACE_SLEEP
+REPLACE_RMDIR
+REPLACE_READLINKAT
+REPLACE_READLINK
+REPLACE_READ
+REPLACE_PWRITE
+REPLACE_PREAD
+REPLACE_LSEEK
+REPLACE_LINKAT
+REPLACE_LINK
+REPLACE_LCHOWN
+REPLACE_ISATTY
+REPLACE_GETPASS
+REPLACE_GETPAGESIZE
+REPLACE_GETGROUPS
+REPLACE_GETLOGIN_R
+REPLACE_GETDTABLESIZE
+REPLACE_GETDOMAINNAME
+REPLACE_GETCWD
+REPLACE_FTRUNCATE
+REPLACE_FCHOWNAT
+REPLACE_FACCESSAT
+REPLACE_EXECVPE
+REPLACE_EXECVP
+REPLACE_EXECVE
+REPLACE_EXECV
+REPLACE_EXECLP
+REPLACE_EXECLE
+REPLACE_EXECL
+REPLACE_DUP2
+REPLACE_DUP
+REPLACE_CLOSE
+REPLACE_CHOWN
+REPLACE_ACCESS
+HAVE_SYS_PARAM_H
+HAVE_OS_H
+HAVE_DECL_TTYNAME_R
+HAVE_DECL_TRUNCATE
+HAVE_DECL_SETHOSTNAME
+HAVE_DECL_GETUSERSHELL
+HAVE_DECL_GETPAGESIZE
+HAVE_DECL_GETLOGIN_R
+HAVE_DECL_GETLOGIN
+HAVE_DECL_GETDOMAINNAME
+HAVE_DECL_FDATASYNC
+HAVE_DECL_FCHDIR
+HAVE_DECL_EXECVPE
+HAVE_DECL_ENVIRON
+HAVE_USLEEP
+HAVE_UNLINKAT
+HAVE_SYMLINKAT
+HAVE_SYMLINK
+HAVE_SLEEP
+HAVE_SETHOSTNAME
+HAVE_READLINKAT
+HAVE_READLINK
+HAVE_PWRITE
+HAVE_PREAD
+HAVE_PIPE2
+HAVE_PIPE
+HAVE_LINKAT
+HAVE_LINK
+HAVE_LCHOWN
+HAVE_GROUP_MEMBER
+HAVE_GETPASS
+HAVE_GETPAGESIZE
+HAVE_GETLOGIN
+HAVE_GETHOSTNAME
+HAVE_GETGROUPS
+HAVE_GETENTROPY
+HAVE_GETDTABLESIZE
+HAVE_FTRUNCATE
+HAVE_FSYNC
+HAVE_FDATASYNC
+HAVE_FCHOWNAT
+HAVE_FCHDIR
+HAVE_FACCESSAT
+HAVE_EXECVPE
+HAVE_EUIDACCESS
+HAVE_DUP3
+HAVE_COPY_FILE_RANGE
+HAVE_CHOWN
+GNULIB_MDA_WRITE
+GNULIB_MDA_UNLINK
+GNULIB_MDA_SWAB
+GNULIB_MDA_RMDIR
+GNULIB_MDA_READ
+GNULIB_MDA_LSEEK
+GNULIB_MDA_ISATTY
+GNULIB_MDA_GETPID
+GNULIB_MDA_GETCWD
+GNULIB_MDA_EXECVPE
+GNULIB_MDA_EXECVP
+GNULIB_MDA_EXECVE
+GNULIB_MDA_EXECV
+GNULIB_MDA_EXECLP
+GNULIB_MDA_EXECLE
+GNULIB_MDA_EXECL
+GNULIB_MDA_DUP2
+GNULIB_MDA_DUP
+GNULIB_MDA_CLOSE
+GNULIB_MDA_CHDIR
+GNULIB_MDA_ACCESS
+GNULIB_WRITE
+GNULIB_USLEEP
+GNULIB_UNLINKAT
+GNULIB_UNLINK
+GNULIB_UNISTD_H_SIGPIPE
+GNULIB_UNISTD_H_NONBLOCKING
+GNULIB_TTYNAME_R
+GNULIB_TRUNCATE
+GNULIB_SYMLINKAT
+GNULIB_SYMLINK
+GNULIB_SLEEP
+GNULIB_SETHOSTNAME
+GNULIB_RMDIR
+GNULIB_READLINKAT
+GNULIB_READLINK
+GNULIB_READ
+GNULIB_PWRITE
+GNULIB_PREAD
+GNULIB_PIPE2
+GNULIB_PIPE
+GNULIB_LSEEK
+GNULIB_LINKAT
+GNULIB_LINK
+GNULIB_LCHOWN
+GNULIB_ISATTY
+GNULIB_GROUP_MEMBER
+GNULIB_GETUSERSHELL
+GNULIB_GETPASS
+GNULIB_GETPAGESIZE
+GNULIB_GETOPT_POSIX
+GNULIB_GETLOGIN_R
+GNULIB_GETLOGIN
+GNULIB_GETHOSTNAME
+GNULIB_GETGROUPS
+GNULIB_GETENTROPY
+GNULIB_GETDTABLESIZE
+GNULIB_GETDOMAINNAME
+GNULIB_GETCWD
+GNULIB_FTRUNCATE
+GNULIB_FSYNC
+GNULIB_FDATASYNC
+GNULIB_FCHOWNAT
+GNULIB_FCHDIR
+GNULIB_FACCESSAT
+GNULIB_EXECVPE
+GNULIB_EXECVP
+GNULIB_EXECVE
+GNULIB_EXECV
+GNULIB_EXECLP
+GNULIB_EXECLE
+GNULIB_EXECL
+GNULIB_EUIDACCESS
+GNULIB_ENVIRON
+GNULIB_DUP3
+GNULIB_DUP2
+GNULIB_DUP
+GNULIB_COPY_FILE_RANGE
+GNULIB_CLOSE
+GNULIB_CHOWN
+GNULIB_CHDIR
+GNULIB_ACCESS
+HAVE_WS2TCPIP_H
+HAVE_SYS_SOCKET_H
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H
+NEXT_SYS_SOCKET_H
+PRAGMA_COLUMNS
+PRAGMA_SYSTEM_HEADER
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE
+INCLUDE_NEXT
+HAVE_ACCEPT4
+HAVE_SA_FAMILY_T
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
+HAVE_STRUCT_SOCKADDR_STORAGE
+GNULIB_ACCEPT4
+GNULIB_SHUTDOWN
+GNULIB_SETSOCKOPT
+GNULIB_SENDTO
+GNULIB_RECVFROM
+GNULIB_SEND
+GNULIB_RECV
+GNULIB_LISTEN
+GNULIB_GETSOCKOPT
+GNULIB_GETSOCKNAME
+GNULIB_GETPEERNAME
+GNULIB_BIND
+GNULIB_ACCEPT
+GNULIB_CONNECT
+GNULIB_SOCKET
+GL_COND_LIBTOOL_FALSE
+GL_COND_LIBTOOL_TRUE
+GL_GENERATE_ICONV_H_FALSE
+GL_GENERATE_ICONV_H_TRUE
+ICONV_H
+REPLACE_ICONV_UTF
+REPLACE_ICONV_OPEN
+REPLACE_ICONV
+ICONV_CONST
+GNULIB_ICONV
+LEXLIB
+LEX_OUTPUT_ROOT
+LEX
+POSUB
+LTLIBINTL
+LIBINTL
+INTLLIBS
+LTLIBICONV
+LIBICONV
+INTL_MACOSX_LIBS
+XGETTEXT_EXTRA_OPTIONS
+MSGMERGE
+XGETTEXT_015
+XGETTEXT
+GMSGFMT_015
+MSGFMT_015
+GMSGFMT
+MSGFMT
+GETTEXT_MACRO_VERSION
+USE_NLS
+SED
+HAVE_PYTHON3_FALSE
+HAVE_PYTHON3_TRUE
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_PLATFORM
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_VERSION
+PYTHON
+RANLIB
+ARFLAGS
+AR
+EGREP
+GREP
+CPP
+VALGRIND_TESTS
+HAVE_VALGRIND
+WARN_CFLAGS
+FUZZ_LIBS
+FUZZING_FALSE
+FUZZING_TRUE
+LIB_FUZZING_ENGINE
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+with_libpsl
+with_ssl
+with_zlib
+with_metalink
+with_cares
+enable_fuzzing
+enable_fsanitize_ubsan
+enable_fsanitize_asan
+enable_fsanitize_msan
+enable_opie
+enable_digest
+enable_ntlm
+enable_debug
+enable_valgrind_tests
+enable_assert
+enable_largefile
+enable_threads
+enable_nls
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_libintl_prefix
+enable_cross_guesses
+with_linux_crypto
+with_openssl
+with_included_libunistring
+with_libunistring_prefix
+with_included_regex
+enable_manywarnings
+with_libssl_prefix
+with_libgnutls_prefix
+enable_ipv6
+enable_iri
+with_libidn
+with_libuuid
+enable_pcre2
+enable_pcre
+with_gpgme_prefix
+enable_xattr
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+PYTHON
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+LIBPSL_CFLAGS
+LIBPSL_LIBS
+ZLIB_CFLAGS
+ZLIB_LIBS
+OPENSSL_CFLAGS
+OPENSSL_LIBS
+GNUTLS_CFLAGS
+GNUTLS_LIBS
+UUID_CFLAGS
+UUID_LIBS
+PCRE2_CFLAGS
+PCRE2_LIBS
+PCRE_CFLAGS
+PCRE_LIBS
+CARES_CFLAGS
+CARES_LIBS
+METALINK_CFLAGS
+METALINK_LIBS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures wget 1.21 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/wget]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of wget 1.21:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-fuzzing Turn on fuzzing build (for developers)
+ --enable-fsanitize-ubsan
+ Turn on Undefined Behavior Sanitizer (for
+ developers)
+ --enable-fsanitize-asan Turn on Address Sanitizer (for developers) (mutually
+ exclusive with Memory/Thread sanitizer or Valgrind
+ tests)
+ --enable-fsanitize-msan Turn on Memory Sanitizer (for developers) (mutually
+ exclusive with Address/Thread sanitizer or Valgrind
+ tests)
+ --disable-opie disable support for opie or s/key FTP login
+ --disable-digest disable support for HTTP digest authorization
+ --disable-ntlm disable support for NTLM authorization
+ --disable-debug disable support for debugging output
+ --enable-valgrind-tests enable using Valgrind for tests
+ --enable-assert enable assertions in code base
+ --disable-largefile omit support for large files
+ --enable-threads={isoc|posix|isoc+posix|windows}
+ specify multithreading API
+ --disable-threads build without multithread safety
+ --disable-nls do not use Native Language Support
+ --disable-rpath do not hardcode runtime library paths
+ --enable-cross-guesses={conservative|risky}
+ specify policy for cross-compilation guesses
+ --enable-manywarnings Turn on extra compiler warnings (for developers)
+ --disable-ipv6 disable IPv6 support
+ --disable-iri disable IDN/IRIs support
+ --disable-pcre2 Disable PCRE2 style regular expressions
+ --disable-pcre Disable PCRE style regular expressions
+ --disable-xattr disable support for POSIX Extended Attributes
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --without-libpsl disable support for libpsl cookie checking.
+ --with-ssl={gnutls,openssl,no}
+ specify SSL backend. GNU TLS is the default.
+ --without-zlib disable zlib.
+ --with-metalink enable support for metalinks.
+ --with-cares enable support for C-Ares DNS lookup.
+ --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
+ --without-libintl-prefix don't search for libintl in includedir and libdir
+ --with-linux-crypto use Linux kernel cryptographic API (if available)
+ --with-openssl use libcrypto hash routines. Valid ARGs are: 'yes',
+ 'no', 'auto' => use if any version available,
+ 'auto-gpl-compat' => use if gpl compatible version
+ available, 'optional' => use if available and warn
+ if not available; default is 'no'. Note also
+ --with-linux-crypto, which will enable use of kernel
+ crypto routines, which have precedence
+ --with-included-libunistring use the libunistring parts included here
+ --with-libunistring-prefix[=DIR] search for libunistring in DIR/include and DIR/lib
+ --without-libunistring-prefix don't search for libunistring in includedir and libdir
+ --without-included-regex
+ don't compile regex; this is the default on systems
+ with recent-enough versions of the GNU C Library
+ (use with caution on other systems).
+ --with-libssl-prefix[=DIR] search for libssl in DIR/include and DIR/lib
+ --without-libssl-prefix don't search for libssl in includedir and libdir
+ --with-libgnutls-prefix[=DIR] search for libgnutls in DIR/include and DIR/lib
+ --without-libgnutls-prefix don't search for libgnutls in includedir and libdir
+ --with-libidn=DIR Support IDN2008/IRIs (needs GNU libidn2 +
+ libunicode)
+ --without-libuuid Generate UUIDs for WARC files via libuuid
+ --with-gpgme-prefix=PFX prefix where GPGME is installed (optional)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+ PYTHON the Python interpreter
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+ LIBPSL_CFLAGS
+ C compiler flags for LIBPSL, overriding pkg-config
+ LIBPSL_LIBS linker flags for LIBPSL, overriding pkg-config
+ ZLIB_CFLAGS C compiler flags for ZLIB, overriding pkg-config
+ ZLIB_LIBS linker flags for ZLIB, overriding pkg-config
+ OPENSSL_CFLAGS
+ C compiler flags for OPENSSL, overriding pkg-config
+ OPENSSL_LIBS
+ linker flags for OPENSSL, overriding pkg-config
+ GNUTLS_CFLAGS
+ C compiler flags for GNUTLS, overriding pkg-config
+ GNUTLS_LIBS linker flags for GNUTLS, overriding pkg-config
+ UUID_CFLAGS C compiler flags for UUID, overriding pkg-config
+ UUID_LIBS linker flags for UUID, overriding pkg-config
+ PCRE2_CFLAGS
+ C compiler flags for PCRE2, overriding pkg-config
+ PCRE2_LIBS linker flags for PCRE2, overriding pkg-config
+ PCRE_CFLAGS C compiler flags for PCRE, overriding pkg-config
+ PCRE_LIBS linker flags for PCRE, overriding pkg-config
+ CARES_CFLAGS
+ C compiler flags for CARES, overriding pkg-config
+ CARES_LIBS linker flags for CARES, overriding pkg-config
+ METALINK_CFLAGS
+ C compiler flags for METALINK, overriding pkg-config
+ METALINK_LIBS
+ linker flags for METALINK, overriding pkg-config
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-wget@gnu.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+wget configure 1.21
+generated by GNU Autoconf 2.70
+
+Copyright (C) 2020 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid; break
+else $as_nop
+ as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_lo=$ac_mid; break
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+else $as_nop
+ ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_hi=$ac_mid
+else $as_nop
+ as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main (void)
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ return 1;
+ if (($2) < 0)
+ {
+ long int i = longval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%ld", i);
+ }
+ else
+ {
+ unsigned long int i = ulongval ();
+ if (i != ($2))
+ return 1;
+ fprintf (f, "%lu", i);
+ }
+ /* Do not output a trailing newline, as this causes \r\n confusion
+ on some platforms. */
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else $as_nop
+ ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+ fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ 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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+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 (void)
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ ac_save_ac_compile="$ac_compile"
+ if test -n "$ac_compile_for_check_decl"; then
+ ac_compile="$ac_compile_for_check_decl"
+ fi
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ # Initialize each $ac_[]_AC_LANG_ABBREV[]_decl_warn_flag once.
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag="$ac_c_decl_warn_flag$ac_c_werror_flag"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_werror_flag
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ ac_compile="$ac_save_ac_compile"
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below. */
+
+#include <limits.h>
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main (void)
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+printf %s "checking for $2.$3... " >&6; }
+if eval test \${$4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main (void)
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$4=yes"
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$5
+int
+main (void)
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$4=yes"
+else $as_nop
+ eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$4
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+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 wget $as_me 1.21, which was
+generated by GNU Autoconf 2.70. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H"
+as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H"
+gt_needs="$gt_needs need-ngettext"
+as_fn_append ac_header_c_list " sys/socket.h sys_socket_h HAVE_SYS_SOCKET_H"
+as_fn_append ac_header_c_list " arpa/inet.h arpa_inet_h HAVE_ARPA_INET_H"
+as_fn_append ac_header_c_list " features.h features_h HAVE_FEATURES_H"
+as_fn_append ac_func_c_list " btowc HAVE_BTOWC"
+as_fn_append ac_func_c_list " canonicalize_file_name HAVE_CANONICALIZE_FILE_NAME"
+as_fn_append ac_func_c_list " faccessat HAVE_FACCESSAT"
+as_fn_append ac_func_c_list " realpath HAVE_REALPATH"
+as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H"
+as_fn_append ac_func_c_list " _set_invalid_parameter_handler HAVE__SET_INVALID_PARAMETER_HANDLER"
+as_fn_append ac_func_c_list " fchdir HAVE_FCHDIR"
+as_fn_append ac_header_c_list " dirent.h dirent_h HAVE_DIRENT_H"
+as_fn_append ac_func_c_list " fcntl HAVE_FCNTL"
+as_fn_append ac_func_c_list " symlink HAVE_SYMLINK"
+as_fn_append ac_func_c_list " fdopendir HAVE_FDOPENDIR"
+as_fn_append ac_func_c_list " mempcpy HAVE_MEMPCPY"
+as_fn_append ac_func_c_list " flock HAVE_FLOCK"
+as_fn_append ac_header_c_list " fnmatch.h fnmatch_h HAVE_FNMATCH_H"
+as_fn_append ac_func_c_list " fnmatch HAVE_FNMATCH"
+as_fn_append ac_func_c_list " mbsrtowcs HAVE_MBSRTOWCS"
+gl_fnmatch_required=GNU
+as_fn_append ac_header_c_list " stdio_ext.h stdio_ext_h HAVE_STDIO_EXT_H"
+as_fn_append ac_func_c_list " fpurge HAVE_FPURGE"
+as_fn_append ac_func_c_list " __fpurge HAVE___FPURGE"
+as_fn_append ac_func_c_list " __freading HAVE___FREADING"
+as_fn_append ac_func_c_list " fstatat HAVE_FSTATAT"
+as_fn_append ac_func_c_list " futimens HAVE_FUTIMENS"
+as_fn_append ac_header_c_list " netdb.h netdb_h HAVE_NETDB_H"
+as_fn_append ac_header_c_list " netinet/in.h netinet_in_h HAVE_NETINET_IN_H"
+as_fn_append ac_func_c_list " getdelim HAVE_GETDELIM"
+as_fn_append ac_func_c_list " getdtablesize HAVE_GETDTABLESIZE"
+gl_getopt_required=GNU
+as_fn_append ac_header_c_list " getopt.h getopt_h HAVE_GETOPT_H"
+as_fn_append ac_header_c_list " sys/cdefs.h sys_cdefs_h HAVE_SYS_CDEFS_H"
+as_fn_append ac_func_c_list " getpass HAVE_GETPASS"
+as_fn_append ac_header_c_list " termios.h termios_h HAVE_TERMIOS_H"
+as_fn_append ac_func_c_list " __fsetlocking HAVE___FSETLOCKING"
+as_fn_append ac_func_c_list " getprogname HAVE_GETPROGNAME"
+as_fn_append ac_func_c_list " getexecname HAVE_GETEXECNAME"
+as_fn_append ac_func_c_list " getrandom HAVE_GETRANDOM"
+as_fn_append ac_func_c_list " gettimeofday HAVE_GETTIMEOFDAY"
+as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H"
+as_fn_append ac_header_c_list " threads.h threads_h HAVE_THREADS_H"
+as_fn_append ac_header_c_list " iconv.h iconv_h HAVE_ICONV_H"
+as_fn_append ac_header_c_list " limits.h limits_h HAVE_LIMITS_H"
+as_fn_append ac_func_c_list " isblank HAVE_ISBLANK"
+as_fn_append ac_func_c_list " iswcntrl HAVE_ISWCNTRL"
+as_fn_append ac_header_c_list " crtdefs.h crtdefs_h HAVE_CRTDEFS_H"
+as_fn_append ac_header_c_list " wctype.h wctype_h HAVE_WCTYPE_H"
+as_fn_append ac_func_c_list " iswblank HAVE_ISWBLANK"
+as_fn_append ac_header_c_list " langinfo.h langinfo_h HAVE_LANGINFO_H"
+as_fn_append ac_func_c_list " link HAVE_LINK"
+as_fn_append ac_header_c_list " xlocale.h xlocale_h HAVE_XLOCALE_H"
+as_fn_append ac_func_c_list " lstat HAVE_LSTAT"
+as_fn_append ac_func_c_list " mbsinit HAVE_MBSINIT"
+as_fn_append ac_func_c_list " mbrtowc HAVE_MBRTOWC"
+as_fn_append ac_header_c_list " sys/mman.h sys_mman_h HAVE_SYS_MMAN_H"
+as_fn_append ac_func_c_list " mprotect HAVE_MPROTECT"
+as_fn_append ac_func_c_list " mkostemp HAVE_MKOSTEMP"
+as_fn_append ac_func_c_list " mkstemp HAVE_MKSTEMP"
+as_fn_append ac_header_c_list " sys/select.h sys_select_h HAVE_SYS_SELECT_H"
+as_fn_append ac_func_c_list " nl_langinfo HAVE_NL_LANGINFO"
+as_fn_append ac_func_c_list " openat HAVE_OPENAT"
+as_fn_append ac_func_c_list " pipe HAVE_PIPE"
+as_fn_append ac_func_c_list " pipe2 HAVE_PIPE2"
+as_fn_append ac_func_c_list " posix_spawn_file_actions_addchdir_np HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP"
+as_fn_append ac_func_c_list " posix_spawn_file_actions_addchdir HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR"
+as_fn_append ac_func_c_list " readlink HAVE_READLINK"
+as_fn_append ac_header_c_list " malloc.h malloc_h HAVE_MALLOC_H"
+as_fn_append ac_func_c_list " iswctype HAVE_ISWCTYPE"
+as_fn_append ac_func_c_list " secure_getenv HAVE_SECURE_GETENV"
+as_fn_append ac_func_c_list " getuid HAVE_GETUID"
+as_fn_append ac_func_c_list " geteuid HAVE_GETEUID"
+as_fn_append ac_func_c_list " getgid HAVE_GETGID"
+as_fn_append ac_func_c_list " getegid HAVE_GETEGID"
+as_fn_append ac_func_c_list " sigaction HAVE_SIGACTION"
+as_fn_append ac_func_c_list " sigaltstack HAVE_SIGALTSTACK"
+as_fn_append ac_func_c_list " siginterrupt HAVE_SIGINTERRUPT"
+as_fn_append ac_func_c_list " snprintf HAVE_SNPRINTF"
+as_fn_append ac_header_c_list " spawn.h spawn_h HAVE_SPAWN_H"
+as_fn_append ac_func_c_list " strerror_r HAVE_STRERROR_R"
+as_fn_append ac_func_c_list " __xpg_strerror_r HAVE___XPG_STRERROR_R"
+as_fn_append ac_func_c_list " catgets HAVE_CATGETS"
+as_fn_append ac_func_c_list " strndup HAVE_STRNDUP"
+as_fn_append ac_func_c_list " strptime HAVE_STRPTIME"
+as_fn_append ac_header_c_list " sys/file.h sys_file_h HAVE_SYS_FILE_H"
+as_fn_append ac_header_c_list " sys/ioctl.h sys_ioctl_h HAVE_SYS_IOCTL_H"
+as_fn_append ac_header_c_list " sys/random.h sys_random_h HAVE_SYS_RANDOM_H"
+as_fn_append ac_header_c_list " sys/uio.h sys_uio_h HAVE_SYS_UIO_H"
+as_fn_append ac_header_c_list " sys/wait.h sys_wait_h HAVE_SYS_WAIT_H"
+as_fn_append ac_func_c_list " localtime_r HAVE_LOCALTIME_R"
+as_fn_append ac_func_c_list " timegm HAVE_TIMEGM"
+as_fn_append ac_header_c_list " utime.h utime_h HAVE_UTIME_H"
+as_fn_append ac_func_c_list " futimes HAVE_FUTIMES"
+as_fn_append ac_func_c_list " futimesat HAVE_FUTIMESAT"
+as_fn_append ac_func_c_list " utimensat HAVE_UTIMENSAT"
+as_fn_append ac_func_c_list " lutimes HAVE_LUTIMES"
+as_fn_append ac_func_c_list " vasnprintf HAVE_VASNPRINTF"
+as_fn_append ac_func_c_list " wcrtomb HAVE_WCRTOMB"
+as_fn_append ac_func_c_list " wcwidth HAVE_WCWIDTH"
+as_fn_append ac_func_c_list " wmempcpy HAVE_WMEMPCPY"
+as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.rpath config.guess config.sub compile missing install-sh"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}/build-aux"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: configuring for GNU Wget $PACKAGE_VERSION" >&5
+printf "%s\n" "$as_me: configuring for GNU Wget $PACKAGE_VERSION" >&6;}
+
+
+
+
+
+
+am__api_version='1.16'
+
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+ *)
+ MISSING="\${SHELL} $am_aux_dir/missing" ;;
+ esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+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}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='wget'
+ VERSION='1.21'
+
+
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <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: <https://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
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c11" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c11" != xno
+then :
+ ac_prog_cc_stdc=c11
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c99" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno
+then :
+ ac_prog_cc_stdc=c99
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c89" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno
+then :
+ ac_prog_cc_stdc=c89
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+else $as_nop
+ ac_prog_cc_stdc=no
+ ac_cv_prog_cc_stdc=no
+fi
+
+fi
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$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
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5
+printf %s "checking whether the compiler is clang... " >&6; }
+if test ${gl_cv_compiler_clang+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifdef __clang__
+ barfbarf
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_clang=no
+else $as_nop
+ gl_cv_compiler_clang=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5
+printf "%s\n" "$gl_cv_compiler_clang" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
+printf %s "checking for compiler option needed when checking for declarations... " >&6; }
+if test ${gl_cv_compiler_check_decl_option+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $gl_cv_compiler_clang = yes; then
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
+else $as_nop
+ gl_cv_compiler_check_decl_option=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
+printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; }
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if test ${ac_cv_safe_to_define___extensions__+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# define __EXTENSIONS__ 1
+ $ac_includes_default
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_safe_to_define___extensions__=yes
+else $as_nop
+ ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
+printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; }
+if test ${ac_cv_should_define__xopen_source+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_should_define__xopen_source=no
+ if test $ac_cv_header_wchar_h = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define _XOPEN_SOURCE 500
+ #include <wchar.h>
+ mbstate_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_should_define__xopen_source=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
+printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; }
+
+ printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
+
+ printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
+
+ printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
+
+ printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+ if test $ac_cv_header_minix_config_h = yes
+then :
+ MINIX=yes
+ printf "%s\n" "#define _MINIX 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h
+
+ printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+else $as_nop
+ MINIX=
+fi
+ if test $ac_cv_safe_to_define___extensions__ = yes
+then :
+ printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h
+
+fi
+ if test $ac_cv_should_define__xopen_source = yes
+then :
+ printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c11" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c11"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c11" != xno
+then :
+ ac_prog_cc_stdc=c11
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc1x -qlanglvl=extc99
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c99" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c99"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno
+then :
+ ac_prog_cc_stdc=c99
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+ac_prog_cc_stdc_options=
+case "x$ac_cv_prog_cc_c89" in #(
+ x) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; } ;; #(
+ xno) :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; } ;; #(
+ *) :
+ ac_prog_cc_stdc_options=" $ac_cv_prog_cc_c89"
+ CC="$CC$ac_prog_cc_stdc_options"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno
+then :
+ ac_prog_cc_stdc=c89
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+else $as_nop
+ ac_prog_cc_stdc=no
+ ac_cv_prog_cc_stdc=no
+fi
+
+fi
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ 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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$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
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler is clang" >&5
+printf %s "checking whether the compiler is clang... " >&6; }
+if test ${gl_cv_compiler_clang+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifdef __clang__
+ barfbarf
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_clang=no
+else $as_nop
+ gl_cv_compiler_clang=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_clang" >&5
+printf "%s\n" "$gl_cv_compiler_clang" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler option needed when checking for declarations" >&5
+printf %s "checking for compiler option needed when checking for declarations... " >&6; }
+if test ${gl_cv_compiler_check_decl_option+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $gl_cv_compiler_clang = yes; then
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'
+else $as_nop
+ gl_cv_compiler_check_decl_option=none
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_compiler_check_decl_option" >&5
+printf "%s\n" "$gl_cv_compiler_check_decl_option" >&6; }
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+printf "%s\n" "#define OS_TYPE \"$host_os\"" >>confdefs.h
+
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=0;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" '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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+
+
+
+# Check whether --with-libpsl was given.
+if test ${with_libpsl+y}
+then :
+ withval=$with_libpsl;
+fi
+
+
+
+# Check whether --with-ssl was given.
+if test ${with_ssl+y}
+then :
+ withval=$with_ssl;
+fi
+
+
+
+# Check whether --with-zlib was given.
+if test ${with_zlib+y}
+then :
+ withval=$with_zlib;
+fi
+
+
+
+# Check whether --with-metalink was given.
+if test ${with_metalink+y}
+then :
+ withval=$with_metalink;
+fi
+
+
+
+# Check whether --with-cares was given.
+if test ${with_cares+y}
+then :
+ withval=$with_cares; with_cares=$withval
+else $as_nop
+ with_cares=no
+fi
+
+
+
+# Check whether --enable-fuzzing was given.
+if test ${enable_fuzzing+y}
+then :
+ enableval=$enable_fuzzing; enable_fuzzing=yes;
+
+
+printf "%s\n" "#define FUZZING 1" >>confdefs.h
+
+
+else $as_nop
+ enable_fuzzing=no; LIB_FUZZING_ENGINE=""
+fi
+
+ if test "$enable_fuzzing" = "yes"; then
+ FUZZING_TRUE=
+ FUZZING_FALSE='#'
+else
+ FUZZING_TRUE='#'
+ FUZZING_FALSE=
+fi
+
+
+OLD_LIBS="$LIBS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
+printf %s "checking for library containing dlopen... " >&6; }
+if test ${ac_cv_search_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dl dld
+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_dlopen=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_dlopen+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_dlopen+y}
+then :
+
+else $as_nop
+ ac_cv_search_dlopen=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
+printf "%s\n" "$ac_cv_search_dlopen" >&6; }
+ac_res=$ac_cv_search_dlopen
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+if [ "${ac_cv_search_dlopen#-l}" != "${ac_cv_search_dlopen}" ]; then
+ FUZZ_LIBS="${ac_cv_search_dlopen}"
+
+fi
+LIBS="$OLD_LIBS"
+
+
+# Check whether --enable-fsanitize-ubsan was given.
+if test ${enable_fsanitize_ubsan+y}
+then :
+ enableval=$enable_fsanitize_ubsan; gl_cc_sanitize_ubsan=yes
+else $as_nop
+ gl_cc_sanitize_ubsan=no
+fi
+
+
+# Check whether --enable-fsanitize-asan was given.
+if test ${enable_fsanitize_asan+y}
+then :
+ enableval=$enable_fsanitize_asan; gl_cc_sanitize_asan=yes
+else $as_nop
+ gl_cc_sanitize_asan=no
+fi
+
+
+# Check whether --enable-fsanitize-msan was given.
+if test ${enable_fsanitize_msan+y}
+then :
+ enableval=$enable_fsanitize_msan; gl_cc_sanitize_msan=yes
+else $as_nop
+ gl_cc_sanitize_msan=no
+fi
+
+
+if test "$gl_cc_sanitize_asan" = yes; then
+ if test "$gl_cc_sanitize_msan" = yes; then
+ as_fn_error $? "Address Sanitizer and Memory Sanitizer are mutually exclusive" "$LINENO" 5
+ fi
+fi
+
+if test "$gl_cc_sanitize_ubsan" = yes; then
+
+ 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
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5
+printf %s "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; }
+if test ${gl_cv_warn_c__Werror__Wunknown_warning_option+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__Werror__Wunknown_warning_option=yes
+else $as_nop
+ gl_cv_warn_c__Werror__Wunknown_warning_option=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror__Wunknown_warning_option" >&5
+printf "%s\n" "$gl_cv_warn_c__Werror__Wunknown_warning_option" >&6; }
+if test "x$gl_cv_warn_c__Werror__Wunknown_warning_option" = xyes
+then :
+ gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'
+else $as_nop
+ gl_unknown_warnings_are_errors=
+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
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=undefined" >&5
+printf %s "checking whether C compiler handles -fsanitize=undefined... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_undefined+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=undefined"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_undefined=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_undefined=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_undefined" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_undefined" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_undefined" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=undefined"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fno-sanitize-recover=undefined" >&5
+printf %s "checking whether C compiler handles -fno-sanitize-recover=undefined... " >&6; }
+if test ${gl_cv_warn_c__fno_sanitize_recover_undefined+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fno-sanitize-recover=undefined"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fno_sanitize_recover_undefined=yes
+else $as_nop
+ gl_cv_warn_c__fno_sanitize_recover_undefined=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fno_sanitize_recover_undefined" >&5
+printf "%s\n" "$gl_cv_warn_c__fno_sanitize_recover_undefined" >&6; }
+if test "x$gl_cv_warn_c__fno_sanitize_recover_undefined" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fno-sanitize-recover=undefined"
+fi
+
+
+
+ # additional clang options
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=integer" >&5
+printf %s "checking whether C compiler handles -fsanitize=integer... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_integer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=integer"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_integer=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_integer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_integer" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_integer" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_integer" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=integer"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=nullability" >&5
+printf %s "checking whether C compiler handles -fsanitize=nullability... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_nullability+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=nullability"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_nullability=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_nullability=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_nullability" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_nullability" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_nullability" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=nullability"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fno-sanitize-recover=nullability" >&5
+printf %s "checking whether C compiler handles -fno-sanitize-recover=nullability... " >&6; }
+if test ${gl_cv_warn_c__fno_sanitize_recover_nullability+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fno-sanitize-recover=nullability"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fno_sanitize_recover_nullability=yes
+else $as_nop
+ gl_cv_warn_c__fno_sanitize_recover_nullability=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fno_sanitize_recover_nullability" >&5
+printf "%s\n" "$gl_cv_warn_c__fno_sanitize_recover_nullability" >&6; }
+if test "x$gl_cv_warn_c__fno_sanitize_recover_nullability" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fno-sanitize-recover=nullability"
+fi
+
+
+fi
+
+if test "$gl_cc_sanitize_asan" = yes; then
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=address" >&5
+printf %s "checking whether C compiler handles -fsanitize=address... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_address+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=address"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_address=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_address=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_address" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_address" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_address" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=address"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fno-omit-frame-pointer" >&5
+printf %s "checking whether C compiler handles -fno-omit-frame-pointer... " >&6; }
+if test ${gl_cv_warn_c__fno_omit_frame_pointer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fno-omit-frame-pointer"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fno_omit_frame_pointer=yes
+else $as_nop
+ gl_cv_warn_c__fno_omit_frame_pointer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fno_omit_frame_pointer" >&5
+printf "%s\n" "$gl_cv_warn_c__fno_omit_frame_pointer" >&6; }
+if test "x$gl_cv_warn_c__fno_omit_frame_pointer" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fno-omit-frame-pointer"
+fi
+
+
+
+ # additional clang option
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize-address-use-after-scope" >&5
+printf %s "checking whether C compiler handles -fsanitize-address-use-after-scope... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_address_use_after_scope+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize-address-use-after-scope"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_address_use_after_scope=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_address_use_after_scope=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_address_use_after_scope" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_address_use_after_scope" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_address_use_after_scope" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize-address-use-after-scope"
+fi
+
+
+fi
+
+if test "$gl_cc_sanitize_msan" = yes; then
+ # clang options
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=memory" >&5
+printf %s "checking whether C compiler handles -fsanitize=memory... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_memory+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=memory"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_memory=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_memory=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_memory" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_memory" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_memory" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=memory"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize-memory-track-origins" >&5
+printf %s "checking whether C compiler handles -fsanitize-memory-track-origins... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_memory_track_origins+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize-memory-track-origins"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_memory_track_origins=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_memory_track_origins=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_memory_track_origins" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_memory_track_origins" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_memory_track_origins" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize-memory-track-origins"
+fi
+
+
+
+ # gcc options
+ if test "$CCNAME" = "gcc"; then
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fsanitize=leak" >&5
+printf %s "checking whether C compiler handles -fsanitize=leak... " >&6; }
+if test ${gl_cv_warn_c__fsanitize_leak+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fsanitize=leak"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fsanitize_leak=yes
+else $as_nop
+ gl_cv_warn_c__fsanitize_leak=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fsanitize_leak" >&5
+printf "%s\n" "$gl_cv_warn_c__fsanitize_leak" >&6; }
+if test "x$gl_cv_warn_c__fsanitize_leak" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fsanitize=leak"
+fi
+
+
+ fi
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fno-omit-frame-pointer" >&5
+printf %s "checking whether C compiler handles -fno-omit-frame-pointer... " >&6; }
+if test ${gl_cv_warn_c__fno_omit_frame_pointer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fno-omit-frame-pointer"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fno_omit_frame_pointer=yes
+else $as_nop
+ gl_cv_warn_c__fno_omit_frame_pointer=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fno_omit_frame_pointer" >&5
+printf "%s\n" "$gl_cv_warn_c__fno_omit_frame_pointer" >&6; }
+if test "x$gl_cv_warn_c__fno_omit_frame_pointer" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fno-omit-frame-pointer"
+fi
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fPIE" >&5
+printf %s "checking whether C compiler handles -fPIE... " >&6; }
+if test ${gl_cv_warn_c__fPIE+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_compiler_FLAGS="$CFLAGS"
+ as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fPIE"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_warn_c__fPIE=yes
+else $as_nop
+ gl_cv_warn_c__fPIE=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ CFLAGS="$gl_save_compiler_FLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fPIE" >&5
+printf "%s\n" "$gl_cv_warn_c__fPIE" >&6; }
+if test "x$gl_cv_warn_c__fPIE" = xyes
+then :
+ as_fn_append WARN_CFLAGS " -fPIE"
+fi
+
+
+fi
+
+
+# Check whether --enable-opie was given.
+if test ${enable_opie+y}
+then :
+ enableval=$enable_opie; ENABLE_OPIE=$enableval
+else $as_nop
+ ENABLE_OPIE=yes
+fi
+
+
+if test "x$ENABLE_OPIE" = xyes
+then :
+
+printf "%s\n" "#define ENABLE_OPIE 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-digest was given.
+if test ${enable_digest+y}
+then :
+ enableval=$enable_digest; ENABLE_DIGEST=$enableval
+else $as_nop
+ ENABLE_DIGEST=yes
+fi
+
+
+if test "x$ENABLE_DIGEST" = xyes
+then :
+
+printf "%s\n" "#define ENABLE_DIGEST 1" >>confdefs.h
+
+fi
+
+
+# Check whether --enable-ntlm was given.
+if test ${enable_ntlm+y}
+then :
+ enableval=$enable_ntlm; ENABLE_NTLM=$enableval
+else $as_nop
+ ENABLE_NTLM=auto
+
+fi
+
+
+
+# Check whether --enable-debug was given.
+if test ${enable_debug+y}
+then :
+ enableval=$enable_debug; ENABLE_DEBUG=$enableval
+else $as_nop
+ ENABLE_DEBUG=yes
+fi
+
+
+if test "x$ENABLE_DEBUG" = xyes
+then :
+
+printf "%s\n" "#define ENABLE_DEBUG 1" >>confdefs.h
+
+fi
+
+# Check whether --enable-valgrind-tests was given.
+if test ${enable_valgrind_tests+y}
+then :
+ enableval=$enable_valgrind_tests; ENABLE_VALGRIND=$enableval
+else $as_nop
+ ENABLE_VALGRIND=no
+fi
+
+
+if test "x$ENABLE_VALGRIND" != xno
+then :
+
+ # Extract the first word of "valgrind", so it can be a program name with args.
+set dummy valgrind; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_HAVE_VALGRIND+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$HAVE_VALGRIND"; then
+ ac_cv_prog_HAVE_VALGRIND="$HAVE_VALGRIND" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_HAVE_VALGRIND="yes"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_HAVE_VALGRIND" && ac_cv_prog_HAVE_VALGRIND="no"
+fi
+fi
+HAVE_VALGRIND=$ac_cv_prog_HAVE_VALGRIND
+if test -n "$HAVE_VALGRIND"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_VALGRIND" >&5
+printf "%s\n" "$HAVE_VALGRIND" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ if test "x$HAVE_VALGRIND" = xyes
+then :
+
+ if test "$gl_cc_sanitize_asan" = yes; then
+ as_fn_error $? "Valgrind and Address Sanitizer are mutually exclusive" "$LINENO" 5
+ elif test "$gl_cc_sanitize_msan" = yes; then
+ as_fn_error $? "Valgrind and Memory Sanitizer are mutually exclusive" "$LINENO" 5
+ fi
+
+ VALGRIND_TESTS="1"
+
+ VALGRIND_INFO="Test suite will be run under Valgrind"
+
+else $as_nop
+
+ VALGRIND_INFO="Valgrind not found"
+
+fi
+
+else $as_nop
+
+ VALGRIND_INFO="Valgrind testing not enabled"
+
+fi
+
+# Check whether --enable-assert was given.
+if test ${enable_assert+y}
+then :
+ enableval=$enable_assert; ENABLE_ASSERTION=$enableval
+else $as_nop
+ ENABLE_ASSERTION=no
+
+fi
+
+
+if test "x$ENABLE_ASSERTION" != xyes
+then :
+
+ CFLAGS="-DNDEBUG $CFLAGS"
+
+fi
+
+
+test -z "$CFLAGS" && CFLAGS= auto_cflags=1
+test -z "$CC" && cc_specified=yes
+
+
+
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
+printf %s "checking for Minix Amsterdam compiler... " >&6; }
+if test ${gl_cv_c_amsterdam_compiler+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __ACK__
+Amsterdam
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Amsterdam" >/dev/null 2>&1
+then :
+ gl_cv_c_amsterdam_compiler=yes
+else $as_nop
+ gl_cv_c_amsterdam_compiler=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
+printf "%s\n" "$gl_cv_c_amsterdam_compiler" >&6; }
+
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ if test -z "$AR"; then
+ AR='cc -c.a'
+ fi
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='-o'
+ fi
+ else
+ :
+ fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_AR" = x; then
+ AR="ar"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='cr'
+ fi
+
+
+
+ if test -z "$RANLIB"; then
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ RANLIB=':'
+ else
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+ fi
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+printf %s "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_source+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main (void)
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main (void)
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+printf "%s\n" "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+printf "%s\n" "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+ case "$host_os" in
+ hpux*)
+
+printf "%s\n" "#define _LARGEFILE_SOURCE 1" >>confdefs.h
+
+ ;;
+ esac
+
+# Check whether --enable-largefile was given.
+if test ${enable_largefile+y}
+then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+printf %s "checking for special C compiler options needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ 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 conftest.beam
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test ${ac_cv_sys_file_offset_bits+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam 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 (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+printf %s "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test ${ac_cv_sys_large_files+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam 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 (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+printf "%s\n" "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ fi
+fi
+
+
+
+
+
+
+
+ # Check whether --enable-threads was given.
+if test ${enable_threads+y}
+then :
+ enableval=$enable_threads; gl_use_threads=$enableval
+else $as_nop
+ if test -n "$gl_use_threads_default"; then
+ gl_use_threads="$gl_use_threads_default"
+ else
+ case "$host_os" in
+ osf*) gl_use_threads=no ;;
+ cygwin*)
+ case `uname -r` in
+ 1.[0-5].*) gl_use_threads=no ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ;;
+ mingw*)
+ case "$gl_use_winpthreads_default" in
+ yes) gl_use_threads=posix ;;
+ no) gl_use_threads=windows ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ;;
+ *) gl_use_threads=yes ;;
+ esac
+ fi
+
+fi
+
+ if test "$gl_use_threads" = yes \
+ || test "$gl_use_threads" = isoc \
+ || test "$gl_use_threads" = posix \
+ || test "$gl_use_threads" = isoc+posix; then
+ # For using <threads.h> or <pthread.h>:
+
+
+ if test -z "$gl_anythreadlib_early_done"; then
+ case "$host_os" in
+ osf*)
+ # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ # groks <pthread.h>. cc also understands the flag -pthread, but
+ # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # 2. putting a flag into CPPFLAGS that has an effect on the linker
+ # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
+ # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ ;;
+ esac
+ # Some systems optimize for single-threaded programs by default, and
+ # need special flags to disable these optimizations. For example, the
+ # definition of 'errno' in <errno.h>.
+ case "$host_os" in
+ aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+ solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+ esac
+ gl_anythreadlib_early_done=done
+ fi
+
+ fi
+
+
+
+ # Pre-early section.
+
+
+
+
+ # Code from module absolute-header:
+ # Code from module accept:
+ # Code from module access:
+ # Code from module alloca:
+ # Code from module alloca-opt:
+ # Code from module announce-gen:
+ # Code from module arpa_inet:
+ # Code from module array-mergesort:
+ # Code from module assure:
+ # Code from module at-internal:
+ # Code from module attribute:
+ # Code from module base32:
+ # Code from module basename-lgpl:
+ # Code from module binary-io:
+ # Code from module bind:
+ # Code from module bitrotate:
+ # Code from module btowc:
+ # Code from module builtin-expect:
+ # Code from module byteswap:
+ # Code from module c-ctype:
+ # Code from module c-strcase:
+ # Code from module c-strcaseeq:
+ # Code from module c-strcasestr:
+ # Code from module c99:
+ # Code from module canonicalize:
+ # Code from module chdir:
+ # Code from module chdir-long:
+ # Code from module clock-time:
+ # Code from module cloexec:
+ # Code from module close:
+ # Code from module closedir:
+ # Code from module concat-filename:
+ # Code from module connect:
+ # Code from module crypto/af_alg:
+ # Code from module crypto/md2:
+ # Code from module crypto/md4:
+ # Code from module crypto/md5:
+ # Code from module crypto/md5-buffer:
+ # Code from module crypto/sha1:
+ # Code from module crypto/sha1-buffer:
+ # Code from module crypto/sha256:
+ # Code from module crypto/sha256-buffer:
+ # Code from module crypto/sha512:
+ # Code from module crypto/sha512-buffer:
+ # Code from module ctype:
+ # Code from module d-ino:
+ # Code from module dirent:
+ # Code from module dirfd:
+ # Code from module dirname:
+ # Code from module dirname-lgpl:
+ # Code from module double-slash-root:
+ # Code from module dup:
+ # Code from module dup2:
+ # Code from module environ:
+ # Code from module errno:
+ # Code from module error:
+ # Code from module exitfail:
+ # Code from module extensions:
+ # Code from module extern-inline:
+ # Code from module fatal-signal:
+ # Code from module fchdir:
+ # Code from module fcntl:
+ # Code from module fcntl-h:
+ # Code from module fd-hook:
+ # Code from module fd-safer-flag:
+ # Code from module fdopendir:
+ # Code from module fflush:
+
+ # Code from module file-set:
+ # Code from module filename:
+ # Code from module filenamecat-lgpl:
+ # Code from module findprog-in:
+ # Code from module flexmember:
+ # Code from module float:
+ # Code from module flock:
+ # Code from module fnmatch:
+ # Code from module fnmatch-gnu:
+ # Code from module fnmatch-h:
+ # Code from module fopen:
+ # Code from module fopen-gnu:
+ # Code from module fpurge:
+ # Code from module freading:
+ # Code from module free-posix:
+ # Code from module fseek:
+ # Code from module fseeko:
+
+ # Code from module fstat:
+ # Code from module fstatat:
+ # Code from module ftell:
+ # Code from module ftello:
+
+ # Code from module futimens:
+ # Code from module getaddrinfo:
+ # Code from module getcwd:
+ # Code from module getcwd-lgpl:
+ # Code from module getdelim:
+ # Code from module getdtablesize:
+ # Code from module getgroups:
+ # Code from module getline:
+ # Code from module getopt-gnu:
+ # Code from module getopt-posix:
+ # Code from module getpass:
+ # Code from module getpass-gnu:
+ # Code from module getpeername:
+ # Code from module getprogname:
+ # Code from module getrandom:
+ # Code from module getsockname:
+ # Code from module gettext-h:
+ # Code from module gettime:
+ # Code from module gettimeofday:
+ # Code from module git-version-gen:
+ # Code from module gitlog-to-changelog:
+ # Code from module gnumakefile:
+ # Code from module gnupload:
+ # Code from module gperf:
+ # Code from module group-member:
+ # Code from module hard-locale:
+ # Code from module hash:
+ # Code from module hash-pjw:
+ # Code from module hash-triple-simple:
+ # Code from module havelib:
+ # Code from module hostent:
+ # Code from module iconv:
+ # Code from module iconv-h:
+ # Code from module idx:
+ # Code from module include_next:
+ # Code from module inet_ntop:
+ # Code from module inline:
+ # Code from module intprops:
+ # Code from module inttypes:
+ # Code from module inttypes-incomplete:
+ # Code from module ioctl:
+ # Code from module isblank:
+ # Code from module iswblank:
+ # Code from module iswdigit:
+ # Code from module iswxdigit:
+ # Code from module langinfo:
+ # Code from module largefile:
+
+ # Code from module libc-config:
+ # Code from module libunistring-optional:
+ # Code from module limits-h:
+ # Code from module link:
+ # Code from module listen:
+ # Code from module localcharset:
+ # Code from module locale:
+ # Code from module localeconv:
+ # Code from module lock:
+ # Code from module lseek:
+ # Code from module lstat:
+ # Code from module maintainer-makefile:
+ # Code from module malloc-posix:
+ # Code from module malloca:
+ # Code from module mbchar:
+ # Code from module mbiter:
+ # Code from module mbrtowc:
+ # Code from module mbsinit:
+ # Code from module mbsrtowcs:
+ # Code from module mbtowc:
+ # Code from module memchr:
+ # Code from module mempcpy:
+ # Code from module memrchr:
+ # Code from module minmax:
+ # Code from module mkdir:
+ # Code from module mkostemp:
+ # Code from module mkstemp:
+ # Code from module mktime:
+ # Code from module mktime-internal:
+ # Code from module msvc-inval:
+ # Code from module msvc-nothrow:
+ # Code from module multiarch:
+ # Code from module nanosleep:
+ # Code from module netdb:
+ # Code from module netinet_in:
+ # Code from module nl_langinfo:
+ # Code from module nocrash:
+ # Code from module open:
+ # Code from module openat:
+ # Code from module openat-die:
+ # Code from module openat-h:
+ # Code from module opendir:
+ # Code from module pathmax:
+ # Code from module pipe-posix:
+ # Code from module pipe2:
+ # Code from module pipe2-safer:
+ # Code from module posix_spawn:
+ # Code from module posix_spawn-internal:
+ # Code from module posix_spawn_file_actions_addchdir:
+ # Code from module posix_spawn_file_actions_addclose:
+ # Code from module posix_spawn_file_actions_adddup2:
+ # Code from module posix_spawn_file_actions_addopen:
+ # Code from module posix_spawn_file_actions_destroy:
+ # Code from module posix_spawn_file_actions_init:
+ # Code from module posix_spawnattr_destroy:
+ # Code from module posix_spawnattr_init:
+ # Code from module posix_spawnattr_setflags:
+ # Code from module posix_spawnattr_setpgroup:
+ # Code from module posix_spawnattr_setsigmask:
+ # Code from module posix_spawnp:
+ # Code from module quote:
+ # Code from module quotearg:
+ # Code from module quotearg-simple:
+ # Code from module raise:
+ # Code from module rawmemchr:
+ # Code from module readdir:
+ # Code from module readlink:
+ # Code from module realloc-posix:
+ # Code from module recv:
+ # Code from module regex:
+ # Code from module rewinddir:
+ # Code from module same-inode:
+ # Code from module save-cwd:
+ # Code from module sched:
+ # Code from module scratch_buffer:
+ # Code from module secure_getenv:
+ # Code from module select:
+ # Code from module send:
+ # Code from module servent:
+ # Code from module setlocale-null:
+ # Code from module setsockopt:
+ # Code from module sh-filename:
+ # Code from module sigaction:
+ # Code from module signal-h:
+ # Code from module sigpipe:
+ # Code from module sigprocmask:
+ # Code from module size_max:
+ # Code from module snippet/_Noreturn:
+ # Code from module snippet/arg-nonnull:
+ # Code from module snippet/c++defs:
+ # Code from module snippet/unused-parameter:
+ # Code from module snippet/warn-on-use:
+ # Code from module snprintf:
+ # Code from module socket:
+ # Code from module socketlib:
+ # Code from module sockets:
+ # Code from module socklen:
+ # Code from module spawn:
+ # Code from module spawn-pipe:
+ # Code from module ssize_t:
+ # Code from module stat:
+ # Code from module stat-time:
+ # Code from module std-gnu11:
+ # Code from module stdalign:
+ # Code from module stdbool:
+ # Code from module stddef:
+ # Code from module stdint:
+ # Code from module stdio:
+ # Code from module stdlib:
+ # Code from module stpcpy:
+ # Code from module strcase:
+ # Code from module strchrnul:
+ # Code from module strdup-posix:
+ # Code from module streq:
+ # Code from module strerror:
+ # Code from module strerror-override:
+ # Code from module strerror_r-posix:
+ # Code from module string:
+ # Code from module strings:
+ # Code from module strndup:
+ # Code from module strnlen:
+ # Code from module strnlen1:
+ # Code from module strpbrk:
+ # Code from module strptime:
+ # Code from module strtok_r:
+ # Code from module strtol:
+ # Code from module strtoll:
+ # Code from module symlink:
+ # Code from module sys_file:
+ # Code from module sys_ioctl:
+ # Code from module sys_random:
+ # Code from module sys_select:
+ # Code from module sys_socket:
+ # Code from module sys_stat:
+ # Code from module sys_time:
+ # Code from module sys_types:
+ # Code from module sys_uio:
+ # Code from module sys_wait:
+ # Code from module tempname:
+ # Code from module thread-optim:
+ # Code from module threadlib:
+
+
+
+ # Code from module time:
+ # Code from module time_r:
+ # Code from module timegm:
+ # Code from module timespec:
+ # Code from module tmpdir:
+ # Code from module u64:
+ # Code from module unicase/base:
+ # Code from module unicase/cased:
+ # Code from module unicase/empty-prefix-context:
+ # Code from module unicase/empty-suffix-context:
+ # Code from module unicase/ignorable:
+ # Code from module unicase/special-casing:
+ # Code from module unicase/tolower:
+ # Code from module unicase/u8-casemap:
+ # Code from module unicase/u8-tolower:
+ # Code from module unictype/base:
+ # Code from module unictype/combining-class:
+ # Code from module unictype/property-soft-dotted:
+ # Code from module uninorm/base:
+ # Code from module uninorm/decompose-internal:
+ # Code from module uninorm/u8-normalize:
+ # Code from module unistd:
+ # Code from module unistd-safer:
+ # Code from module unistr/base:
+ # Code from module unistr/u8-cpy:
+ # Code from module unistr/u8-mbtouc-unsafe:
+ # Code from module unistr/u8-strlen:
+ # Code from module unistr/u8-uctomb:
+ # Code from module unitypes:
+ # Code from module uniwidth/base:
+ # Code from module uniwidth/width:
+ # Code from module unlink:
+ # Code from module unlocked-io:
+ # Code from module update-copyright:
+ # Code from module useless-if-before-free:
+ # Code from module utime:
+ # Code from module utime-h:
+ # Code from module utimens:
+ # Code from module vasnprintf:
+ # Code from module vasprintf:
+ # Code from module vc-list-files:
+ # Code from module verify:
+ # Code from module vsnprintf:
+ # Code from module wait-process:
+ # Code from module waitpid:
+ # Code from module warnings:
+ # Code from module wchar:
+ # Code from module wcrtomb:
+ # Code from module wctype-h:
+ # Code from module wcwidth:
+ # Code from module windows-mutex:
+ # Code from module windows-once:
+ # Code from module windows-recmutex:
+ # Code from module windows-rwlock:
+ # Code from module windows-spawn:
+ # Code from module wmemchr:
+ # Code from module wmempcpy:
+ # Code from module write:
+ # Code from module xalloc:
+ # Code from module xalloc-die:
+ # Code from module xalloc-oversized:
+ # Code from module xmemdup0:
+ # Code from module xsize:
+ # Code from module xstrndup:
+
+
+
+
+
+
+
+
+ if test -n "$PYTHON"; then
+ # If the user set $PYTHON, use it and don't search something else.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3.0" >&5
+printf %s "checking whether $PYTHON version is >= 3.0... " >&6; }
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '3.0'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+ ($PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "Python interpreter is too old" "$LINENO" 5
+fi
+ am_display_PYTHON=$PYTHON
+ else
+ # Otherwise, try each interpreter until we find one that satisfies
+ # VERSION.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3.0" >&5
+printf %s "checking for a Python interpreter with version >= 3.0... " >&6; }
+if test ${am_cv_pathless_PYTHON+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ for am_cv_pathless_PYTHON in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do
+ test "$am_cv_pathless_PYTHON" = none && break
+ prog="import sys
+# split strings by '.' and convert to numeric. Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '3.0'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+ if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5
+ ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+then :
+ break
+fi
+ done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5
+printf "%s\n" "$am_cv_pathless_PYTHON" >&6; }
+ # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+ if test "$am_cv_pathless_PYTHON" = none; then
+ PYTHON=:
+ else
+ # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
+set dummy $am_cv_pathless_PYTHON; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PYTHON+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PYTHON in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PYTHON="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+printf "%s\n" "$PYTHON" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+ am_display_PYTHON=$am_cv_pathless_PYTHON
+ fi
+
+
+ if test "$PYTHON" = :; then
+ :
+ else
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
+printf %s "checking for $am_display_PYTHON version... " >&6; }
+if test ${am_cv_python_version+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
+printf "%s\n" "$am_cv_python_version" >&6; }
+ PYTHON_VERSION=$am_cv_python_version
+
+
+
+ PYTHON_PREFIX='${prefix}'
+
+ PYTHON_EXEC_PREFIX='${exec_prefix}'
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
+printf %s "checking for $am_display_PYTHON platform... " >&6; }
+if test ${am_cv_python_platform+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
+printf "%s\n" "$am_cv_python_platform" >&6; }
+ PYTHON_PLATFORM=$am_cv_python_platform
+
+
+ # Just factor out some code duplication.
+ am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x. See automake bug#10227.
+try:
+ import sysconfig
+except ImportError:
+ can_use_sysconfig = 0
+else:
+ can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+ from platform import python_implementation
+ if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
+ can_use_sysconfig = 0
+except ImportError:
+ pass"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
+printf %s "checking for $am_display_PYTHON script directory... " >&6; }
+if test ${am_cv_python_pythondir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$prefix" = xNONE
+ then
+ am_py_prefix=$ac_default_prefix
+ else
+ am_py_prefix=$prefix
+ fi
+ am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ case $am_cv_python_pythondir in
+ $am_py_prefix*)
+ am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+ am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+ ;;
+ *)
+ case $am_py_prefix in
+ /usr|/System*) ;;
+ *)
+ am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
+printf "%s\n" "$am_cv_python_pythondir" >&6; }
+ pythondir=$am_cv_python_pythondir
+
+
+
+ pkgpythondir=\${pythondir}/$PACKAGE
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
+printf %s "checking for $am_display_PYTHON extension module directory... " >&6; }
+if test ${am_cv_python_pyexecdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$exec_prefix" = xNONE
+ then
+ am_py_exec_prefix=$am_py_prefix
+ else
+ am_py_exec_prefix=$exec_prefix
+ fi
+ am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+ sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
+else:
+ from distutils import sysconfig
+ sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+ case $am_cv_python_pyexecdir in
+ $am_py_exec_prefix*)
+ am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+ am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+ ;;
+ *)
+ case $am_py_exec_prefix in
+ /usr|/System*) ;;
+ *)
+ am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
+printf "%s\n" "$am_cv_python_pyexecdir" >&6; }
+ pyexecdir=$am_cv_python_pyexecdir
+
+
+
+ pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+
+
+ fi
+
+
+ if test "$PYTHON" != :; then
+ HAVE_PYTHON3_TRUE=
+ HAVE_PYTHON3_FALSE='#'
+else
+ HAVE_PYTHON3_TRUE='#'
+ HAVE_PYTHON3_FALSE=
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+printf %s "checking for a sed that does not truncate output... " >&6; }
+if test ${ac_cv_path_SED+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for ac_i in 1 2 3 4 5 6 7; do
+ ac_script="$ac_script$as_nl$ac_script"
+ done
+ echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+ { ac_script=; unset ac_script;}
+ if test -z "$SED"; then
+ ac_path_SED_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in sed gsed
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_SED="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+ # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+ ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" '' >> "conftest.nl"
+ "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_SED_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_SED="$ac_path_SED"
+ ac_path_SED_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_SED_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_SED"; then
+ as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+ fi
+else
+ ac_cv_path_SED=$SED
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+printf "%s\n" "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+ rm -f conftest.sed
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+printf %s "checking whether NLS is requested... " >&6; }
+ # Check whether --enable-nls was given.
+if test ${enable_nls+y}
+then :
+ enableval=$enable_nls; USE_NLS=$enableval
+else $as_nop
+ USE_NLS=yes
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
+
+
+
+
+ GETTEXT_MACRO_VERSION=0.19
+
+
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --statistics /dev/null >&5 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); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+printf "%s\n" "$MSGFMT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GMSGFMT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GMSGFMT="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+printf "%s\n" "$GMSGFMT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+ case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+ *) MSGFMT_015=$MSGFMT ;;
+ esac
+
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_XGETTEXT+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+printf "%s\n" "$XGETTEXT" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ rm -f messages.po
+
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+
+
+ # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_MSGMERGE+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$MSGMERGE" in
+ /*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test -n "$MSGMERGE"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+printf "%s\n" "$MSGMERGE" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$localedir" || localedir='${datadir}/locale'
+
+
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+ ac_config_commands="$ac_config_commands po-directories"
+
+
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test ${with_gnu_ld+y}
+then :
+ withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else $as_nop
+ with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ # 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
+
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld" >&5
+printf %s "checking for ld... " >&6; }
+elif test "$GCC" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+printf %s "checking for ld used by $CC... " >&6; }
+elif test "$with_gnu_ld" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+printf %s "checking for GNU ld... " >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+printf %s "checking for non-GNU ld... " >&6; }
+fi
+if test -n "$LD"; then
+ # Let the user override the test with a path.
+ :
+else
+ if test ${acl_cv_path_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ acl_cv_path_LD= # Final result of this test
+ ac_prog=ld # Program to search in $PATH
+ if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ acl_output=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $acl_output in
+ # Accept absolute paths.
+ [\\/]* | ?:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the pathname of ld
+ acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'`
+ while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do
+ acl_output=`echo $acl_output | sed "s%$re_direlt%/%"`
+ done
+ # Got the pathname. No search in PATH is needed.
+ acl_cv_path_LD="$acl_output"
+ ac_prog=
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ fi
+ if test -n "$ac_prog"; then
+ # Search for $ac_prog in $PATH.
+ 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 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
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+ fi
+ case $host in
+ *-*-aix*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __powerpc64__ || defined _ARCH_PPC64
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # The compiler produces 64-bit code. Add option '-b64' so that the
+ # linker groks 64-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -b64 "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;;
+ esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ sparc64-*-netbsd*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ # The compiler produces 32-bit code. Add option '-m elf32_sparc'
+ # so that the linker groks 32-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -m elf32_sparc "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;;
+ esac
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ esac
+
+fi
+
+ LD="$acl_cv_path_LD"
+fi
+if test -n "$LD"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+printf %s "checking if the linker ($LD) is GNU ld... " >&6; }
+if test ${acl_cv_prog_gnu_ld+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # 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=no
+ ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+printf "%s\n" "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+printf %s "checking for shared library run path origin... " >&6; }
+if test ${acl_cv_rpath+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ 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
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+printf "%s\n" "$acl_cv_rpath" >&6; }
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ acl_hardcode_direct="$acl_cv_hardcode_direct"
+ acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath was given.
+if test ${enable_rpath+y}
+then :
+ enableval=$enable_rpath; :
+else $as_nop
+ enable_rpath=yes
+fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5
+printf %s "checking 32-bit host C ABI... " >&6; }
+if test ${gl_cv_host_cpu_c_abi_32bit+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$gl_cv_host_cpu_c_abi"; then
+ case "$gl_cv_host_cpu_c_abi" in
+ i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
+ gl_cv_host_cpu_c_abi_32bit=yes ;;
+ x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
+ gl_cv_host_cpu_c_abi_32bit=no ;;
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown ;;
+ esac
+ else
+ case "$host_cpu" in
+
+ # CPUs that only support a 32-bit ABI.
+ arc \
+ | bfin \
+ | cris* \
+ | csky \
+ | epiphany \
+ | ft32 \
+ | h8300 \
+ | m68k \
+ | microblaze | microblazeel \
+ | nds32 | nds32le | nds32be \
+ | nios2 | nios2eb | nios2el \
+ | or1k* \
+ | or32 \
+ | sh | sh1234 | sh1234elb \
+ | tic6x \
+ | xtensa* )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ # CPUs that only support a 64-bit ABI.
+ alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
+ | mmix )
+ gl_cv_host_cpu_c_abi_32bit=no
+ ;;
+
+ i[34567]86 )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ x86_64 )
+ # On x86_64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+ # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+ # with native Windows (mingw, MSVC).
+ # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if (defined __x86_64__ || defined __amd64__ \
+ || defined _M_X64 || defined _M_AMD64) \
+ && !(defined __ILP32__ || defined _ILP32)
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ arm* | aarch64 )
+ # Assume arm with EABI.
+ # On arm64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+ # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32)
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+ # On hppa, the C compiler may be generating 32-bit code or 64-bit
+ # code. In the latter case, it defines _LP64 and __LP64__.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ ia64* )
+ # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+ # 32-bit code. In the latter case, it defines _ILP32.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=yes
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ mips* )
+ # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+ # at 32.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ powerpc* )
+ # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+ # No need to distinguish them here; the caller may distinguish
+ # them based on the OS.
+ # On powerpc64 systems, the C compiler may still be generating
+ # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+ # be generating 64-bit code.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __powerpc64__ || defined _ARCH_PPC64
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ rs6000 )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ riscv32 | riscv64 )
+ # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+ # Size of 'long' and 'void *':
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ s390* )
+ # On s390x, the C compiler may be generating 64-bit (= s390x) code
+ # or 31-bit (= s390) code.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__ || defined __s390x__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ sparc | sparc64 )
+ # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+ # C compiler still generates 32-bit code.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_host_cpu_c_abi_32bit=no
+else $as_nop
+ gl_cv_host_cpu_c_abi_32bit=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown
+ ;;
+ esac
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5
+printf "%s\n" "$gl_cv_host_cpu_c_abi_32bit" >&6; }
+
+ HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5
+printf %s "checking for ELF binary format... " >&6; }
+if test ${gl_cv_elf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_elf=yes
+else $as_nop
+ gl_cv_elf=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5
+printf "%s\n" "$gl_cv_elf" >&6; }
+ if test $gl_cv_elf = yes; then
+ # Extract the ELF class of a file (5th byte) in decimal.
+ # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+ if od -A x < /dev/null >/dev/null 2>/dev/null; then
+ # Use POSIX od.
+ func_elfclass ()
+ {
+ od -A n -t d1 -j 4 -N 1
+ }
+ else
+ # Use BSD hexdump.
+ func_elfclass ()
+ {
+ dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
+ echo
+ }
+ fi
+ # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+ # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+ # not 1 or 2.
+ case $HOST_CPU_C_ABI_32BIT in
+ yes)
+ # 32-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null
+ }
+ ;;
+ no)
+ # 64-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null
+ }
+ ;;
+ *)
+ # Unknown.
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ ;;
+ esac
+ else
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5
+printf %s "checking for the common suffixes of directories in the library search path... " >&6; }
+if test ${acl_cv_libdirstems+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ acl_libdirstem3=
+ case "$host_os" in
+ solaris*)
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ acl_libdirstem2=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem3=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
+ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ # 32-bit or unknown ABI.
+ if test -d /usr/lib32; then
+ acl_libdirstem2=lib32
+ fi
+ fi
+ if test $HOST_CPU_C_ABI_32BIT != yes; then
+ # 64-bit or unknown ABI.
+ if test -d /usr/lib64; then
+ acl_libdirstem3=lib64
+ fi
+ fi
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64 ) acl_libdirstem3=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ if test $HOST_CPU_C_ABI_32BIT = yes; then
+ # 32-bit ABI.
+ acl_libdirstem3=
+ fi
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ # 64-bit ABI.
+ acl_libdirstem2=
+ fi
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+ test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
+ acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5
+printf "%s\n" "$acl_cv_libdirstems" >&6; }
+ acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
+ acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
+ acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test ${with_libiconv_prefix+y}
+then :
+ withval=$with_libiconv_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ LIBICONV_PREFIX=
+ HAVE_LIBICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ 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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ 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"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'iconv'; then
+ LIBICONV_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+printf %s "checking for CFPreferencesCopyAppValue... " >&6; }
+if test ${gt_cv_func_CFPreferencesCopyAppValue+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFPreferences.h>
+int
+main (void)
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gt_cv_func_CFPreferencesCopyAppValue=yes
+else $as_nop
+ gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+printf "%s\n" "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+printf "%s\n" "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+printf %s "checking for CFLocaleCopyCurrent... " >&6; }
+if test ${gt_cv_func_CFLocaleCopyCurrent+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <CoreFoundation/CFLocale.h>
+int
+main (void)
+{
+CFLocaleCopyCurrent();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gt_cv_func_CFLocaleCopyCurrent=yes
+else $as_nop
+ gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gt_save_LIBS"
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+printf "%s\n" "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+ if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+printf "%s\n" "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+ fi
+ INTL_MACOSX_LIBS=
+ if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+
+
+
+
+
+
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+
+
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+printf %s "checking for GNU gettext in libc... " >&6; }
+if eval test \${$gt_func_gnugettext_libc+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ eval "$gt_func_gnugettext_libc=yes"
+else $as_nop
+ eval "$gt_func_gnugettext_libc=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$gt_func_gnugettext_libc
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+
+
+
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main (void)
+{
+int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ 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 ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_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,
+ &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 ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &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. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ {
+ /* Try standardized names. */
+ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+ /* Try IRIX, OSF/1 names. */
+ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+ /* Try AIX names. */
+ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+ /* Try HP-UX names. */
+ iconv_t cd4 = iconv_open ("utf8", "eucJP");
+ if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+ && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+ result |= 16;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close (cd2);
+ if (cd3 != (iconv_t)(-1))
+ iconv_close (cd3);
+ if (cd4 != (iconv_t)(-1))
+ iconv_close (cd4);
+ }
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test ${with_libintl_prefix+y}
+then :
+ withval=$with_libintl_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ LIBINTL_PREFIX=
+ HAVE_LIBINTL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='intl '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ 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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ 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"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'intl'; then
+ LIBINTL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+printf %s "checking for GNU gettext in libintl... " >&6; }
+if eval test \${$gt_func_gnugettext_libintl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ 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;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main (void)
+{
+
+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 :
+ eval "$gt_func_gnugettext_libintl=yes"
+else $as_nop
+ eval "$gt_func_gnugettext_libintl=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+ 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;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main (void)
+{
+
+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"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"
+fi
+eval ac_res=\$$gt_func_gnugettext_libintl
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ fi
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+
+
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+printf "%s\n" "#define ENABLE_NLS 1" >>confdefs.h
+
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+printf %s "checking whether to use NLS... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+printf "%s\n" "$USE_NLS" >&6; }
+ if test "$USE_NLS" = "yes"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+printf %s "checking where the gettext function comes from... " >&6; }
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+printf "%s\n" "$gt_source" >&6; }
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+printf %s "checking how to link with libintl... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+printf "%s\n" "$LIBINTL" >&6; }
+
+ for element in $INCINTL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+ fi
+
+
+printf "%s\n" "#define HAVE_GETTEXT 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_DCGETTEXT 1" >>confdefs.h
+
+ fi
+
+ POSUB=po
+ fi
+
+
+
+ INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+for ac_prog in flex lex
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LEX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$LEX"; then
+ ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_LEX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+LEX=$ac_cv_prog_LEX
+if test -n "$LEX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
+printf "%s\n" "$LEX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=":"
+
+ if test "x$LEX" != "x:"; then
+ cat >conftest.l <<_ACEOF
+%{
+#ifdef __cplusplus
+extern "C"
+#endif
+int yywrap(void);
+%}
+%%
+a { ECHO; }
+b { REJECT; }
+c { yymore (); }
+d { yyless (1); }
+e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */
+#ifdef __cplusplus
+ yyless ((yyinput () != 0));
+#else
+ yyless ((input () != 0));
+#endif
+ }
+f { unput (yytext[0]); }
+. { BEGIN INITIAL; }
+%%
+#ifdef YYTEXT_POINTER
+extern char *yytext;
+#endif
+int
+yywrap (void)
+{
+ return 1;
+}
+int
+main (void)
+{
+ return ! yylex ();
+}
+_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex output file root" >&5
+printf %s "checking for lex output file root... " >&6; }
+if test ${ac_cv_prog_lex_root+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ac_cv_prog_lex_root=unknown
+{ { ac_try="$LEX conftest.l"
+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\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$LEX conftest.l") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } &&
+if test -f lex.yy.c; then
+ ac_cv_prog_lex_root=lex.yy
+elif test -f lexyy.c; then
+ ac_cv_prog_lex_root=lexyy
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
+printf "%s\n" "$ac_cv_prog_lex_root" >&6; }
+if test "$ac_cv_prog_lex_root" = unknown
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find output from $LEX; giving up on $LEX" >&5
+printf "%s\n" "$as_me: WARNING: cannot find output from $LEX; giving up on $LEX" >&2;}
+ LEX=: LEXLIB=
+fi
+LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
+
+if test ${LEXLIB+y}
+then :
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5
+printf %s "checking for lex library... " >&6; }
+if test ${ac_cv_lib_lex+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ ac_found=false
+ for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do
+ case $ac_cv_lib_lex in #(
+ 'none needed') :
+ ;; #(
+ 'not found') :
+ break ;; #(
+ *) :
+ LIBS="$ac_cv_lib_lex $ac_save_LIBS" ;; #(
+ *) :
+ ;;
+esac
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_found=:
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if $ac_found; then
+ break
+ fi
+ done
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
+printf "%s\n" "$ac_cv_lib_lex" >&6; }
+ if test "$ac_cv_lib_lex" = 'not found'
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required lex library not found; giving up on $LEX" >&5
+printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LEX" >&2;}
+ LEX=: LEXLIB=
+elif test "$ac_cv_lib_lex" = 'none needed'
+then :
+ LEXLIB=''
+else $as_nop
+ LEXLIB=$ac_cv_lib_lex
+fi
+ ac_save_LIBS="$LIBS"
+ LIBS=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing yywrap" >&5
+printf %s "checking for library containing yywrap... " >&6; }
+if test ${ac_cv_search_yywrap+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char yywrap ();
+int
+main (void)
+{
+return yywrap ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' fl l
+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_yywrap=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_yywrap+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_yywrap+y}
+then :
+
+else $as_nop
+ ac_cv_search_yywrap=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_yywrap" >&5
+printf "%s\n" "$ac_cv_search_yywrap" >&6; }
+ac_res=$ac_cv_search_yywrap
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ LEXLIB="$LIBS"
+fi
+
+ LIBS="$ac_save_LIBS"
+fi
+
+
+if test "$LEX" != :
+then :
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
+printf %s "checking whether yytext is a pointer... " >&6; }
+if test ${ac_cv_prog_lex_yytext_pointer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # POSIX says lex can declare yytext either as a pointer or an array; the
+# default is implementation-dependent. Figure out which it is, since
+# not all implementations provide the %pointer and %array declarations.
+ac_cv_prog_lex_yytext_pointer=no
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define YYTEXT_POINTER 1
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_lex_yytext_pointer=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
+printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; }
+if test $ac_cv_prog_lex_yytext_pointer = yes; then
+
+printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h
+
+fi
+
+fi
+rm -f conftest.l $LEX_OUTPUT_ROOT.c
+
+fi
+
+if test -n "$auto_cflags"; then
+ if test -n "$GCC"; then
+ CFLAGS="$CFLAGS -O2 -Wall -Wextra"
+ else
+ case "$host_os" in
+ *hpux*) CFLAGS="$CFLAGS +O3" ;;
+ *ultrix* | *osf*) CFLAGS="$CFLAGS -O -Olimit 2000" ;;
+ *) CFLAGS="$CFLAGS -O" ;;
+ esac
+ fi
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+printf %s "checking for an ANSI C-conforming const... " >&6; }
+if test ${ac_cv_c_const+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* IBM XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_const=yes
+else $as_nop
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+printf "%s\n" "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+printf "%s\n" "#define const /**/" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+printf %s "checking for inline... " >&6; }
+if test ${ac_cv_c_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo (void) {return 0; }
+$ac_kw foo_t foo (void) {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+printf "%s\n" "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working volatile" >&5
+printf %s "checking for working volatile... " >&6; }
+if test ${ac_cv_c_volatile+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+volatile int x;
+int * volatile y = (int *) 0;
+return !x && !y;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_volatile=yes
+else $as_nop
+ ac_cv_c_volatile=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_volatile" >&5
+printf "%s\n" "$ac_cv_c_volatile" >&6; }
+if test $ac_cv_c_volatile = no; then
+
+printf "%s\n" "#define volatile /**/" >>confdefs.h
+
+fi
+
+
+# Autoupdate added the next two lines to ensure that your configure
+# script's behavior did not change. They are probably safe to remove.
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+
+
+# Check whether --enable-largefile was given.
+if test ${enable_largefile+y}
+then :
+ enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+printf %s "checking for special C compiler options needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ 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 conftest.beam
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; }
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if test ${ac_cv_sys_file_offset_bits+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam 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 (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+ ac_cv_sys_file_offset_bits=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+printf %s "checking for _LARGE_FILES value needed for large files... " >&6; }
+if test ${ac_cv_sys_large_files+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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 (void)
+{
+
+ ;
+ 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.beam 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 (void)
+{
+
+ ;
+ 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.beam conftest.$ac_ext
+ ac_cv_sys_large_files=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+printf "%s\n" "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+ fi
+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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5
+printf %s "checking size of off_t... " >&6; }
+if test ${ac_cv_sizeof_off_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" "$ac_includes_default"
+then :
+
+else $as_nop
+ if test "$ac_cv_type_off_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (off_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_off_t=0
+ fi
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_off_t" >&5
+printf "%s\n" "$ac_cv_sizeof_off_t" >&6; }
+
+
+
+printf "%s\n" "#define SIZEOF_OFF_T $ac_cv_sizeof_off_t" >>confdefs.h
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+printf %s "checking for stdbool.h that conforms to C99... " >&6; }
+if test ${ac_cv_header_stdbool_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stdbool.h>
+
+ #ifdef __cplusplus
+ typedef bool Bool;
+ #else
+ typedef _Bool Bool;
+ #ifndef bool
+ "error: bool is not defined"
+ #endif
+ #ifndef false
+ "error: false is not defined"
+ #endif
+ #if false
+ "error: false is not 0"
+ #endif
+ #ifndef true
+ "error: true is not defined"
+ #endif
+ #if true != 1
+ "error: true is not 1"
+ #endif
+ #endif
+
+ #ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+ #endif
+
+ struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
+
+ char a[true == 1 ? 1 : -1];
+ char b[false == 0 ? 1 : -1];
+ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+ char d[(bool) 0.5 == true ? 1 : -1];
+ /* See body of main program for 'e'. */
+ char f[(Bool) 0.0 == false ? 1 : -1];
+ char g[true];
+ char h[sizeof (Bool)];
+ char i[sizeof s.t];
+ enum { j = false, k = true, l = false * true, m = true * 256 };
+ /* The following fails for
+ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+ Bool n[m];
+ char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+ char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+ /* Catch a bug in an HP-UX C compiler. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ */
+ Bool q = true;
+ Bool *pq = &q;
+ bool *qq = &q;
+
+int
+main (void)
+{
+
+ bool e = &s;
+ *pq |= q; *pq |= ! q;
+ *qq |= q; *qq |= ! q;
+ /* Refer to every declared value, to avoid compiler optimizations. */
+ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+ + !m + !n + !o + !p + !q + !pq + !qq);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_header_stdbool_h=yes
+else $as_nop
+ ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+printf "%s\n" "$ac_cv_header_stdbool_h" >&6; }
+ ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes
+then :
+
+printf "%s\n" "#define HAVE__BOOL 1" >>confdefs.h
+
+
+fi
+
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+printf "%s\n" "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default"
+if test "x$ac_cv_header_termios_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_ioctl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_select_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default"
+if test "x$ac_cv_header_utime_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UTIME_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/utime.h" "ac_cv_header_sys_utime_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_utime_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_UTIME_H 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_inttypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default"
+if test "x$ac_cv_header_pwd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default"
+if test "x$ac_cv_header_wchar_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCHAR_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h
+
+fi
+
+
+# The Clang compiler raises a warning for an undeclared identifier that matches
+# a compiler builtin function. All extant Clang versions are affected, as of
+# Clang 3.6.0. Test a builtin known to every version. This problem affects the
+# C and Objective C languages, but Clang does report an error under C++ and
+# Objective C++.
+#
+# Passing -fno-builtin to the compiler would suppress this problem. That
+# strategy would have the advantage of being insensitive to stray warnings, but
+# it would make tests less realistic.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how $CC reports undeclared, standard C functions" >&5
+printf %s "checking how $CC reports undeclared, standard C functions... " >&6; }
+if test ${ac_cv_c_decl_report+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+(void) strchr;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test -s conftest.err
+then :
+ # For AC_CHECK_DECL to react to warnings, the compiler must be silent on
+ # valid AC_CHECK_DECL input. No library function is consistently available
+ # on freestanding implementations, so test against a dummy declaration.
+ # Include always-available headers on the off chance that they somehow
+ # elicit warnings.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);
+int
+main (void)
+{
+#ifdef __cplusplus
+ (void) ac_decl ((int) 0, (char *) 0);
+ (void) ac_decl;
+#else
+ (void) ac_decl;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test -s conftest.err
+then :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot detect from compiler exit status or warnings
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ ac_cv_c_decl_report=warning
+fi
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compile a simple declaration test
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "compiler does not report undeclared identifiers
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+else $as_nop
+ ac_cv_c_decl_report=error
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_decl_report" >&5
+printf "%s\n" "$ac_cv_c_decl_report" >&6; }
+
+case $ac_cv_c_decl_report in
+ warning) ac_c_decl_warn_flag=yes ;;
+ *) ac_c_decl_warn_flag= ;;
+esac
+
+ac_fn_c_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" "#include <netdb.h>
+"
+if test "x$ac_cv_have_decl_h_errno" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_H_ERRNO $ac_have_decl" >>confdefs.h
+
+
+# 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.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+printf %s "checking size of long... " >&6; }
+if test ${ac_cv_sizeof_long+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"
+then :
+
+else $as_nop
+ if test "$ac_cv_type_long" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+printf "%s\n" "$ac_cv_sizeof_long" >&6; }
+
+
+
+printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h
+
+
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
+
+fi
+
+
+ ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
+"
+if test "x$ac_cv_type_pid_t" = xyes
+then :
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #if defined _WIN64 && !defined __CYGWIN__
+ LLP64
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_pid_type='int'
+else $as_nop
+ ac_pid_type='__int64'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
+
+
+fi
+
+
+ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "$ac_includes_default"
+if test "x$ac_cv_type_uint32_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_UINT32_T 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintptr_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_UINTPTR_T 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "intptr_t" "ac_cv_type_intptr_t" "$ac_includes_default"
+if test "x$ac_cv_type_intptr_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_INTPTR_T 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "int64_t" "ac_cv_type_int64_t" "$ac_includes_default"
+if test "x$ac_cv_type_int64_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_INT64_T 1" >>confdefs.h
+
+
+fi
+
+ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "
+#include <stdio.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_sig_atomic_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIG_ATOMIC_T 1" >>confdefs.h
+
+
+fi
+
+
+# gnulib, AM_ICONV should be placed before gl_INIT
+
+
+ GNULIB_ICONV=0;
+ ICONV_CONST=;
+ REPLACE_ICONV=0;
+ REPLACE_ICONV_OPEN=0;
+ REPLACE_ICONV_UTF=0;
+ ICONV_H='';
+ if false; then
+ ICONV_H='iconv.h'
+ fi
+
+ if test -n "$ICONV_H"; then
+ GL_GENERATE_ICONV_H_TRUE=
+ GL_GENERATE_ICONV_H_FALSE='#'
+else
+ GL_GENERATE_ICONV_H_TRUE='#'
+ GL_GENERATE_ICONV_H_FALSE=
+fi
+
+
+
+
+
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+printf %s "checking for iconv... " >&6; }
+if test ${am_cv_func_iconv+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main (void)
+{
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+printf "%s\n" "$am_cv_func_iconv" >&6; }
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+printf %s "checking for working iconv... " >&6; }
+if test ${am_cv_func_iconv_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ am_save_LIBS="$LIBS"
+ if test $am_cv_lib_iconv = yes; then
+ LIBS="$LIBS $LIBICONV"
+ fi
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main (void)
+{
+int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ 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 ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_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,
+ &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 ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &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. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ {
+ /* Try standardized names. */
+ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+ /* Try IRIX, OSF/1 names. */
+ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+ /* Try AIX names. */
+ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+ /* Try HP-UX names. */
+ iconv_t cd4 = iconv_open ("utf8", "eucJP");
+ if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+ && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+ result |= 16;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close (cd2);
+ if (cd3 != (iconv_t)(-1))
+ iconv_close (cd3);
+ if (cd4 != (iconv_t)(-1))
+ iconv_close (cd4);
+ }
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+printf "%s\n" "$am_cv_func_iconv_works" >&6; }
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+
+printf "%s\n" "#define HAVE_ICONV 1" >>confdefs.h
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+printf %s "checking how to link with libiconv... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+printf "%s\n" "$LIBICONV" >&6; }
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+ if test "$am_cv_func_iconv" = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iconv is compatible with its POSIX signature" >&5
+printf %s "checking whether iconv is compatible with its POSIX signature... " >&6; }
+if test ${gl_cv_iconv_nonconst+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_iconv_nonconst=yes
+else $as_nop
+ gl_cv_iconv_nonconst=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_iconv_nonconst" >&5
+printf "%s\n" "$gl_cv_iconv_nonconst" >&6; }
+ else
+ gl_cv_iconv_nonconst=yes
+ fi
+ if test $gl_cv_iconv_nonconst = yes; then
+ iconv_arg1=""
+ else
+ iconv_arg1="const"
+ fi
+
+printf "%s\n" "#define ICONV_CONST $iconv_arg1" >>confdefs.h
+
+
+ if test $gl_cv_iconv_nonconst != yes; then
+ ICONV_CONST="const"
+ fi
+
+
+
+
+
+
+
+
+
+
+ # Check whether --enable-cross-guesses was given.
+if test ${enable_cross_guesses+y}
+then :
+ enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
+printf "%s\n" "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
+ enableval=conservative
+ fi
+ gl_cross_guesses="$enableval"
+else $as_nop
+ gl_cross_guesses=conservative
+fi
+
+ if test $gl_cross_guesses = risky; then
+ gl_cross_guess_normal="guessing yes"
+ gl_cross_guess_inverted="guessing no"
+ else
+ gl_cross_guess_normal="guessing no"
+ gl_cross_guess_inverted="guessing yes"
+ fi
+ LIBC_FATAL_STDERR_=1
+ export LIBC_FATAL_STDERR_
+
+
+
+ GNULIB_SOCKET=0;
+ GNULIB_CONNECT=0;
+ GNULIB_ACCEPT=0;
+ GNULIB_BIND=0;
+ GNULIB_GETPEERNAME=0;
+ GNULIB_GETSOCKNAME=0;
+ GNULIB_GETSOCKOPT=0;
+ GNULIB_LISTEN=0;
+ GNULIB_RECV=0;
+ GNULIB_SEND=0;
+ GNULIB_RECVFROM=0;
+ GNULIB_SENDTO=0;
+ GNULIB_SETSOCKOPT=0;
+ GNULIB_SHUTDOWN=0;
+ GNULIB_ACCEPT4=0;
+ HAVE_STRUCT_SOCKADDR_STORAGE=1;
+ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1;
+
+ HAVE_SA_FAMILY_T=1;
+ HAVE_ACCEPT4=1;
+
+
+
+ if test $ac_cv_header_sys_socket_h = no; then
+ ac_fn_c_check_header_compile "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default"
+if test "x$ac_cv_header_ws2tcpip_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h
+
+fi
+
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
+printf %s "checking whether the preprocessor supports include_next... " >&6; }
+if test ${gl_cv_have_include_next+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -rf conftestd1a conftestd1b conftestd2
+ mkdir conftestd1a conftestd1b conftestd2
+ cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_have_include_next=yes
+else $as_nop
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_have_include_next=buggy
+else $as_nop
+ gl_cv_have_include_next=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ rm -rf conftestd1a conftestd1b conftestd2
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
+printf "%s\n" "$gl_cv_have_include_next" >&6; }
+ PRAGMA_SYSTEM_HEADER=
+ if test $gl_cv_have_include_next = yes; then
+ INCLUDE_NEXT=include_next
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ if test -n "$GCC"; then
+ PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+ fi
+ else
+ if test $gl_cv_have_include_next = buggy; then
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ else
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+ fi
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether source code line length is unlimited" >&5
+printf %s "checking whether source code line length is unlimited... " >&6; }
+if test ${gl_cv_source_line_length_unlimited+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __TANDEM
+choke me
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "choke me" >/dev/null 2>&1
+then :
+ gl_cv_source_line_length_unlimited=no
+else $as_nop
+ gl_cv_source_line_length_unlimited=yes
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_source_line_length_unlimited" >&5
+printf "%s\n" "$gl_cv_source_line_length_unlimited" >&6; }
+ if test $gl_cv_source_line_length_unlimited = no; then
+ PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+ else
+ PRAGMA_COLUMNS=
+ fi
+
+
+
+ GNULIB_ACCESS=0;
+ GNULIB_CHDIR=0;
+ GNULIB_CHOWN=0;
+ GNULIB_CLOSE=0;
+ GNULIB_COPY_FILE_RANGE=0;
+ GNULIB_DUP=0;
+ GNULIB_DUP2=0;
+ GNULIB_DUP3=0;
+ GNULIB_ENVIRON=0;
+ GNULIB_EUIDACCESS=0;
+ GNULIB_EXECL=0;
+ GNULIB_EXECLE=0;
+ GNULIB_EXECLP=0;
+ GNULIB_EXECV=0;
+ GNULIB_EXECVE=0;
+ GNULIB_EXECVP=0;
+ GNULIB_EXECVPE=0;
+ GNULIB_FACCESSAT=0;
+ GNULIB_FCHDIR=0;
+ GNULIB_FCHOWNAT=0;
+ GNULIB_FDATASYNC=0;
+ GNULIB_FSYNC=0;
+ GNULIB_FTRUNCATE=0;
+ GNULIB_GETCWD=0;
+ GNULIB_GETDOMAINNAME=0;
+ GNULIB_GETDTABLESIZE=0;
+ GNULIB_GETENTROPY=0;
+ GNULIB_GETGROUPS=0;
+ GNULIB_GETHOSTNAME=0;
+ GNULIB_GETLOGIN=0;
+ GNULIB_GETLOGIN_R=0;
+ GNULIB_GETOPT_POSIX=0;
+ GNULIB_GETPAGESIZE=0;
+ GNULIB_GETPASS=0;
+ GNULIB_GETUSERSHELL=0;
+ GNULIB_GROUP_MEMBER=0;
+ GNULIB_ISATTY=0;
+ GNULIB_LCHOWN=0;
+ GNULIB_LINK=0;
+ GNULIB_LINKAT=0;
+ GNULIB_LSEEK=0;
+ GNULIB_PIPE=0;
+ GNULIB_PIPE2=0;
+ GNULIB_PREAD=0;
+ GNULIB_PWRITE=0;
+ GNULIB_READ=0;
+ GNULIB_READLINK=0;
+ GNULIB_READLINKAT=0;
+ GNULIB_RMDIR=0;
+ GNULIB_SETHOSTNAME=0;
+ GNULIB_SLEEP=0;
+ GNULIB_SYMLINK=0;
+ GNULIB_SYMLINKAT=0;
+ GNULIB_TRUNCATE=0;
+ GNULIB_TTYNAME_R=0;
+ GNULIB_UNISTD_H_NONBLOCKING=0;
+ GNULIB_UNISTD_H_SIGPIPE=0;
+ GNULIB_UNLINK=0;
+ GNULIB_UNLINKAT=0;
+ GNULIB_USLEEP=0;
+ GNULIB_WRITE=0;
+ GNULIB_MDA_ACCESS=1;
+ GNULIB_MDA_CHDIR=1;
+ GNULIB_MDA_CLOSE=1;
+ GNULIB_MDA_DUP=1;
+ GNULIB_MDA_DUP2=1;
+ GNULIB_MDA_EXECL=1;
+ GNULIB_MDA_EXECLE=1;
+ GNULIB_MDA_EXECLP=1;
+ GNULIB_MDA_EXECV=1;
+ GNULIB_MDA_EXECVE=1;
+ GNULIB_MDA_EXECVP=1;
+ GNULIB_MDA_EXECVPE=1;
+ GNULIB_MDA_GETCWD=1;
+ GNULIB_MDA_GETPID=1;
+ GNULIB_MDA_ISATTY=1;
+ GNULIB_MDA_LSEEK=1;
+ GNULIB_MDA_READ=1;
+ GNULIB_MDA_RMDIR=1;
+ GNULIB_MDA_SWAB=1;
+ GNULIB_MDA_UNLINK=1;
+ GNULIB_MDA_WRITE=1;
+ HAVE_CHOWN=1;
+ HAVE_COPY_FILE_RANGE=1;
+ HAVE_DUP3=1;
+ HAVE_EUIDACCESS=1;
+ HAVE_EXECVPE=1;
+ HAVE_FACCESSAT=1;
+ HAVE_FCHDIR=1;
+ HAVE_FCHOWNAT=1;
+ HAVE_FDATASYNC=1;
+ HAVE_FSYNC=1;
+ HAVE_FTRUNCATE=1;
+ HAVE_GETDTABLESIZE=1;
+ HAVE_GETENTROPY=1;
+ HAVE_GETGROUPS=1;
+ HAVE_GETHOSTNAME=1;
+ HAVE_GETLOGIN=1;
+ HAVE_GETPAGESIZE=1;
+ HAVE_GETPASS=1;
+ HAVE_GROUP_MEMBER=1;
+ HAVE_LCHOWN=1;
+ HAVE_LINK=1;
+ HAVE_LINKAT=1;
+ HAVE_PIPE=1;
+ HAVE_PIPE2=1;
+ HAVE_PREAD=1;
+ HAVE_PWRITE=1;
+ HAVE_READLINK=1;
+ HAVE_READLINKAT=1;
+ HAVE_SETHOSTNAME=1;
+ HAVE_SLEEP=1;
+ HAVE_SYMLINK=1;
+ HAVE_SYMLINKAT=1;
+ HAVE_UNLINKAT=1;
+ HAVE_USLEEP=1;
+ HAVE_DECL_ENVIRON=1;
+ HAVE_DECL_EXECVPE=1;
+ HAVE_DECL_FCHDIR=1;
+ HAVE_DECL_FDATASYNC=1;
+ HAVE_DECL_GETDOMAINNAME=1;
+ HAVE_DECL_GETLOGIN=1;
+ HAVE_DECL_GETLOGIN_R=1;
+ HAVE_DECL_GETPAGESIZE=1;
+ HAVE_DECL_GETUSERSHELL=1;
+ HAVE_DECL_SETHOSTNAME=1;
+ HAVE_DECL_TRUNCATE=1;
+ HAVE_DECL_TTYNAME_R=1;
+ HAVE_OS_H=0;
+ HAVE_SYS_PARAM_H=0;
+ REPLACE_ACCESS=0;
+ REPLACE_CHOWN=0;
+ REPLACE_CLOSE=0;
+ REPLACE_DUP=0;
+ REPLACE_DUP2=0;
+ REPLACE_EXECL=0;
+ REPLACE_EXECLE=0;
+ REPLACE_EXECLP=0;
+ REPLACE_EXECV=0;
+ REPLACE_EXECVE=0;
+ REPLACE_EXECVP=0;
+ REPLACE_EXECVPE=0;
+ REPLACE_FACCESSAT=0;
+ REPLACE_FCHOWNAT=0;
+ REPLACE_FTRUNCATE=0;
+ REPLACE_GETCWD=0;
+ REPLACE_GETDOMAINNAME=0;
+ REPLACE_GETDTABLESIZE=0;
+ REPLACE_GETLOGIN_R=0;
+ REPLACE_GETGROUPS=0;
+ REPLACE_GETPAGESIZE=0;
+ REPLACE_GETPASS=0;
+ REPLACE_ISATTY=0;
+ REPLACE_LCHOWN=0;
+ REPLACE_LINK=0;
+ REPLACE_LINKAT=0;
+ REPLACE_LSEEK=0;
+ REPLACE_PREAD=0;
+ REPLACE_PWRITE=0;
+ REPLACE_READ=0;
+ REPLACE_READLINK=0;
+ REPLACE_READLINKAT=0;
+ REPLACE_RMDIR=0;
+ REPLACE_SLEEP=0;
+ REPLACE_SYMLINK=0;
+ REPLACE_SYMLINKAT=0;
+ REPLACE_TRUNCATE=0;
+ REPLACE_TTYNAME_R=0;
+ REPLACE_UNLINK=0;
+ REPLACE_UNLINKAT=0;
+ REPLACE_USLEEP=0;
+ REPLACE_WRITE=0;
+ UNISTD_H_HAVE_SYS_RANDOM_H=0;
+ UNISTD_H_HAVE_WINSOCK2_H=0;
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+
+
+
+ GNULIB_IOCTL=0;
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=0;
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+
+ REPLACE_IOCTL=0;
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+printf %s "checking for C/C++ restrict keyword... " >&6; }
+if test ${ac_cv_c_restrict+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_restrict=no
+ # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+ # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+ # Put 'restrict' last, because C++ lacks it.
+ for ac_kw in __restrict__ __restrict _Restrict restrict; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+typedef int *int_ptr;
+ int foo (int_ptr $ac_kw ip) { return ip[0]; }
+ int bar (int [$ac_kw]); /* Catch GCC bug 14050. */
+ int bar (int ip[$ac_kw]) { return ip[0]; }
+
+int
+main (void)
+{
+int s[1];
+ int *$ac_kw t = s;
+ t[0] = 0;
+ return foo (t) + bar (t);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_restrict=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$ac_cv_c_restrict" != no && break
+ done
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+printf "%s\n" "$ac_cv_c_restrict" >&6; }
+
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no) printf "%s\n" "#define restrict /**/" >>confdefs.h
+ ;;
+ *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h
+ ;;
+ esac
+
+
+
+
+
+ case "$host_os" in
+ osf*)
+
+printf "%s\n" "#define _POSIX_PII_SOCKET 1" >>confdefs.h
+
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/socket.h> is self-contained" >&5
+printf %s "checking whether <sys/socket.h> is self-contained... " >&6; }
+if test ${gl_cv_header_sys_socket_h_selfcontained+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/socket.h>
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_sys_socket_h_selfcontained=yes
+else $as_nop
+ gl_cv_header_sys_socket_h_selfcontained=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_selfcontained" >&5
+printf "%s\n" "$gl_cv_header_sys_socket_h_selfcontained" >&6; }
+ if test $gl_cv_header_sys_socket_h_selfcontained = yes; then
+ ac_fn_c_check_func "$LINENO" "shutdown" "ac_cv_func_shutdown"
+if test "x$ac_cv_func_shutdown" = xyes
+then :
+ printf "%s\n" "#define HAVE_SHUTDOWN 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_shutdown = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/socket.h> defines the SHUT_* macros" >&5
+printf %s "checking whether <sys/socket.h> defines the SHUT_* macros... " >&6; }
+if test ${gl_cv_header_sys_socket_h_shut+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/socket.h>
+int
+main (void)
+{
+int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_sys_socket_h_shut=yes
+else $as_nop
+ gl_cv_header_sys_socket_h_shut=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_socket_h_shut" >&5
+printf "%s\n" "$gl_cv_header_sys_socket_h_shut" >&6; }
+ if test $gl_cv_header_sys_socket_h_shut = no; then
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ fi
+ fi
+ # We need to check for ws2tcpip.h now.
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_socket_h='<'sys/socket.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/socket.h>" >&5
+printf %s "checking absolute name of <sys/socket.h>... " >&6; }
+if test ${gl_cv_next_sys_socket_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_socket_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/socket.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/socket.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_socket_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_socket_h
+ gl_cv_next_sys_socket_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_socket_h='<'sys/socket.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_socket_h" >&5
+printf "%s\n" "$gl_cv_next_sys_socket_h" >&6; }
+ fi
+ NEXT_SYS_SOCKET_H=$gl_cv_next_sys_socket_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/socket.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_socket_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_SYS_SOCKET_H=1
+ else
+ HAVE_SYS_SOCKET_H=0
+ fi
+
+
+
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_WS2TCPIP_H=0
+ else
+ if test $ac_cv_header_ws2tcpip_h = yes; then
+ HAVE_WS2TCPIP_H=1
+ else
+ HAVE_WS2TCPIP_H=0
+ fi
+ fi
+
+
+
+ ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_type_struct_sockaddr_storage" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h
+
+
+fi
+ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" "
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_type_sa_family_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SA_FAMILY_T 1" >>confdefs.h
+
+
+fi
+
+ if test $ac_cv_type_struct_sockaddr_storage = no; then
+ HAVE_STRUCT_SOCKADDR_STORAGE=0
+ fi
+ if test $ac_cv_type_sa_family_t = no; then
+ HAVE_SA_FAMILY_T=0
+ fi
+ if test $ac_cv_type_struct_sockaddr_storage != no; then
+ ac_fn_c_check_member "$LINENO" "struct sockaddr_storage" "ss_family" "ac_cv_member_struct_sockaddr_storage_ss_family" "#include <sys/types.h>
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+ #ifdef HAVE_WS2TCPIP_H
+ #include <ws2tcpip.h>
+ #endif
+
+"
+if test "x$ac_cv_member_struct_sockaddr_storage_ss_family" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1" >>confdefs.h
+
+
+else $as_nop
+ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0
+fi
+
+ fi
+ if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \
+ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+
+
+
+
+
+
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+printf %s "checking for working alloca.h... " >&6; }
+if test ${ac_cv_working_alloca_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <alloca.h>
+int
+main (void)
+{
+char *p = (char *) alloca (2 * sizeof (int));
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_working_alloca_h=yes
+else $as_nop
+ ac_cv_working_alloca_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+printf "%s\n" "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+printf %s "checking for alloca... " >&6; }
+if test ${ac_cv_func_alloca_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $ac_cv_working_alloca_h = yes; then
+ ac_cv_func_alloca_works=yes
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stddef.h>
+#ifndef alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+int
+main (void)
+{
+char *p = (char *) alloca (1);
+ if (p) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_func_alloca_works=yes
+else $as_nop
+ ac_cv_func_alloca_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+printf "%s\n" "$ac_cv_func_alloca_works" >&6; }
+fi
+
+if test $ac_cv_func_alloca_works = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+else
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+
+
+
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+printf %s "checking stack direction for C alloca... " >&6; }
+if test ${ac_cv_c_stack_direction+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ ac_cv_c_stack_direction=0
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_stack_direction=1
+else $as_nop
+ ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+printf "%s\n" "$ac_cv_c_stack_direction" >&6; }
+printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h
+
+
+fi
+
+
+ GNULIB_INET_NTOP=0;
+ GNULIB_INET_PTON=0;
+ HAVE_DECL_INET_NTOP=1;
+ HAVE_DECL_INET_PTON=1;
+ REPLACE_INET_NTOP=0;
+ REPLACE_INET_PTON=0;
+
+
+
+
+
+ if test $ac_cv_header_features_h = yes; then
+ HAVE_FEATURES_H=1
+ else
+ HAVE_FEATURES_H=0
+ fi
+
+
+
+ GNULIB_BTOWC=0;
+ GNULIB_WCTOB=0;
+ GNULIB_MBSINIT=0;
+ GNULIB_MBRTOWC=0;
+ GNULIB_MBRLEN=0;
+ GNULIB_MBSRTOWCS=0;
+ GNULIB_MBSNRTOWCS=0;
+ GNULIB_WCRTOMB=0;
+ GNULIB_WCSRTOMBS=0;
+ GNULIB_WCSNRTOMBS=0;
+ GNULIB_WCWIDTH=0;
+ GNULIB_WMEMCHR=0;
+ GNULIB_WMEMCMP=0;
+ GNULIB_WMEMCPY=0;
+ GNULIB_WMEMMOVE=0;
+ GNULIB_WMEMPCPY=0;
+ GNULIB_WMEMSET=0;
+ GNULIB_WCSLEN=0;
+ GNULIB_WCSNLEN=0;
+ GNULIB_WCSCPY=0;
+ GNULIB_WCPCPY=0;
+ GNULIB_WCSNCPY=0;
+ GNULIB_WCPNCPY=0;
+ GNULIB_WCSCAT=0;
+ GNULIB_WCSNCAT=0;
+ GNULIB_WCSCMP=0;
+ GNULIB_WCSNCMP=0;
+ GNULIB_WCSCASECMP=0;
+ GNULIB_WCSNCASECMP=0;
+ GNULIB_WCSCOLL=0;
+ GNULIB_WCSXFRM=0;
+ GNULIB_WCSDUP=0;
+ GNULIB_WCSCHR=0;
+ GNULIB_WCSRCHR=0;
+ GNULIB_WCSCSPN=0;
+ GNULIB_WCSSPN=0;
+ GNULIB_WCSPBRK=0;
+ GNULIB_WCSSTR=0;
+ GNULIB_WCSTOK=0;
+ GNULIB_WCSWIDTH=0;
+ GNULIB_WCSFTIME=0;
+ GNULIB_MDA_WCSDUP=1;
+ HAVE_BTOWC=1;
+ HAVE_MBSINIT=1;
+ HAVE_MBRTOWC=1;
+ HAVE_MBRLEN=1;
+ HAVE_MBSRTOWCS=1;
+ HAVE_MBSNRTOWCS=1;
+ HAVE_WCRTOMB=1;
+ HAVE_WCSRTOMBS=1;
+ HAVE_WCSNRTOMBS=1;
+ HAVE_WMEMCHR=1;
+ HAVE_WMEMCMP=1;
+ HAVE_WMEMCPY=1;
+ HAVE_WMEMMOVE=1;
+ HAVE_WMEMPCPY=1;
+ HAVE_WMEMSET=1;
+ HAVE_WCSLEN=1;
+ HAVE_WCSNLEN=1;
+ HAVE_WCSCPY=1;
+ HAVE_WCPCPY=1;
+ HAVE_WCSNCPY=1;
+ HAVE_WCPNCPY=1;
+ HAVE_WCSCAT=1;
+ HAVE_WCSNCAT=1;
+ HAVE_WCSCMP=1;
+ HAVE_WCSNCMP=1;
+ HAVE_WCSCASECMP=1;
+ HAVE_WCSNCASECMP=1;
+ HAVE_WCSCOLL=1;
+ HAVE_WCSXFRM=1;
+ HAVE_WCSDUP=1;
+ HAVE_WCSCHR=1;
+ HAVE_WCSRCHR=1;
+ HAVE_WCSCSPN=1;
+ HAVE_WCSSPN=1;
+ HAVE_WCSPBRK=1;
+ HAVE_WCSSTR=1;
+ HAVE_WCSTOK=1;
+ HAVE_WCSWIDTH=1;
+ HAVE_WCSFTIME=1;
+ HAVE_DECL_WCTOB=1;
+ HAVE_DECL_WCSDUP=1;
+ HAVE_DECL_WCWIDTH=1;
+ REPLACE_MBSTATE_T=0;
+ REPLACE_BTOWC=0;
+ REPLACE_WCTOB=0;
+ REPLACE_MBSINIT=0;
+ REPLACE_MBRTOWC=0;
+ REPLACE_MBRLEN=0;
+ REPLACE_MBSRTOWCS=0;
+ REPLACE_MBSNRTOWCS=0;
+ REPLACE_WCRTOMB=0;
+ REPLACE_WCSRTOMBS=0;
+ REPLACE_WCSNRTOMBS=0;
+ REPLACE_WCWIDTH=0;
+ REPLACE_WCSWIDTH=0;
+ REPLACE_WCSFTIME=0;
+ REPLACE_WCSTOK=0;
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
+printf %s "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
+if test ${gl_cv_header_wchar_h_correct_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_wchar_h_correct_inline=yes
+ case "$host_os" in
+ *-gnu* | gnu*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ extern int zero (void);
+ int main () { return zero(); }
+
+_ACEOF
+ save_ac_compile="$ac_compile"
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+ if echo '#include "conftest.c"' >conftest1.c \
+ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ int zero (void) { return 0; }
+
+_ACEOF
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+ if echo '#include "conftest.c"' >conftest2.c \
+ && { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&5 2>&1; then
+ :
+ else
+ gl_cv_header_wchar_h_correct_inline=no
+ fi
+ fi
+ fi
+ ac_compile="$save_ac_compile"
+ rm -f conftest12.c conftest12.$ac_objext conftest$ac_exeext
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_wchar_h_correct_inline" >&5
+printf "%s\n" "$gl_cv_header_wchar_h_correct_inline" >&6; }
+ if test $gl_cv_header_wchar_h_correct_inline = no; then
+ as_fn_error $? "<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+ - Add the flag -fgnu89-inline to CC and reconfigure, or
+ - Fix your include files, using parts of
+ <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+ - Use a gcc version older than 4.3, or
+ - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted." "$LINENO" 5
+ fi
+
+ac_func=
+for ac_item in $ac_func_c_list
+do
+ if test $ac_func; then
+ ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func
+ if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then
+ echo "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_func=
+ else
+ ac_func=$ac_item
+ fi
+done
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+printf %s "checking for nl_langinfo and CODESET... " >&6; }
+if test ${am_cv_langinfo_codeset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int
+main (void)
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ am_cv_langinfo_codeset=yes
+else $as_nop
+ am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+printf "%s\n" "$am_cv_langinfo_codeset" >&6; }
+ if test $am_cv_langinfo_codeset = yes; then
+
+printf "%s\n" "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional french locale" >&5
+printf %s "checking for a traditional french locale... " >&6; }
+if test ${gt_cv_locale_fr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
+ one byte long. This excludes the UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
+# if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+# endif
+ return 0;
+#endif
+}
+
+_ACEOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the native Windows locale name.
+ if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=French_France.1252
+ else
+ # None found.
+ gt_cv_locale_fr=none
+ fi
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO-8859-1
+ else
+ # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
+ if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO8859-1
+ else
+ # Test for the HP-UX locale name.
+ if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.iso88591
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr
+ else
+ # None found.
+ gt_cv_locale_fr=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr" >&5
+printf "%s\n" "$gt_cv_locale_fr" >&6; }
+ LOCALE_FR=$gt_cv_locale_fr
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5
+printf %s "checking whether lstat correctly handles trailing slash... " >&6; }
+if test ${gl_cv_func_lstat_dereferences_slashed_symlink+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f conftest.sym conftest.file
+ echo >conftest.file
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ linux-* | linux)
+ # Guess yes on Linux systems.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+ *-gnu* | gnu*)
+ # Guess yes on glibc systems.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+ mingw*)
+ # Guess no on native Windows.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
+ *)
+ # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+struct stat sbuf;
+ if (symlink ("conftest.file", "conftest.sym") != 0)
+ return 1;
+ /* Linux will dereference the symlink and fail, as required by
+ POSIX. That is better in the sense that it means we will not
+ have to compile and use the lstat wrapper. */
+ return lstat ("conftest.sym/", &sbuf) == 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_lstat_dereferences_slashed_symlink=yes
+else $as_nop
+ gl_cv_func_lstat_dereferences_slashed_symlink=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.sym conftest.file
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lstat_dereferences_slashed_symlink" >&5
+printf "%s\n" "$gl_cv_func_lstat_dereferences_slashed_symlink" >&6; }
+ case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
+ *yes)
+
+printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+printf %s "checking whether // is distinct from /... " >&6; }
+if test ${gl_cv_double_slash_root+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test x"$cross_compiling" = xyes ; then
+ # When cross-compiling, there is no way to tell whether // is special
+ # short of a list of hosts. However, the only known hosts to date
+ # that have a distinct // are Apollo DomainOS (too old to port to),
+ # Cygwin, and z/OS. If anyone knows of another system for which // has
+ # special semantics and is distinct from /, please report it to
+ # <bug-gnulib@gnu.org>.
+ case $host in
+ *-cygwin | i370-ibm-openedition)
+ gl_cv_double_slash_root=yes ;;
+ *)
+ # Be optimistic and assume that / and // are the same when we
+ # don't know.
+ gl_cv_double_slash_root='unknown, assuming no' ;;
+ esac
+ else
+ set x `ls -di / // 2>/dev/null`
+ if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+ gl_cv_double_slash_root=no
+ else
+ gl_cv_double_slash_root=yes
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+printf "%s\n" "$gl_cv_double_slash_root" >&6; }
+ if test "$gl_cv_double_slash_root" = yes; then
+
+printf "%s\n" "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
+
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether realpath works" >&5
+printf %s "checking whether realpath works... " >&6; }
+if test ${gl_cv_func_realpath_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ rm -rf conftest.a conftest.d
+ touch conftest.a
+ mkdir conftest.d
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_realpath_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_realpath_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+ #include <stdlib.h>
+ #include <string.h>
+
+int
+main (void)
+{
+
+ int result = 0;
+ {
+ char *name = realpath ("conftest.a", NULL);
+ if (!(name && *name == '/'))
+ result |= 1;
+ free (name);
+ }
+ {
+ char *name = realpath ("conftest.b/../conftest.a", NULL);
+ if (name != NULL)
+ result |= 2;
+ free (name);
+ }
+ {
+ char *name = realpath ("conftest.a/", NULL);
+ if (name != NULL)
+ result |= 4;
+ free (name);
+ }
+ {
+ char *name1 = realpath (".", NULL);
+ char *name2 = realpath ("conftest.d//./..", NULL);
+ if (! name1 || ! name2 || strcmp (name1, name2))
+ result |= 8;
+ free (name1);
+ free (name2);
+ }
+ return result;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_realpath_works=yes
+else $as_nop
+ gl_cv_func_realpath_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -rf conftest.a conftest.d
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_realpath_works" >&5
+printf "%s\n" "$gl_cv_func_realpath_works" >&6; }
+ case "$gl_cv_func_realpath_works" in
+ *yes)
+
+printf "%s\n" "#define FUNC_REALPATH_WORKS 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+ GNULIB__EXIT=0;
+ GNULIB_ALIGNED_ALLOC=0;
+ GNULIB_ATOLL=0;
+ GNULIB_CALLOC_POSIX=0;
+ GNULIB_CANONICALIZE_FILE_NAME=0;
+ GNULIB_FREE_POSIX=0;
+ GNULIB_GETLOADAVG=0;
+ GNULIB_GETSUBOPT=0;
+ GNULIB_GRANTPT=0;
+ GNULIB_MALLOC_POSIX=0;
+ GNULIB_MBTOWC=0;
+ GNULIB_MKDTEMP=0;
+ GNULIB_MKOSTEMP=0;
+ GNULIB_MKOSTEMPS=0;
+ GNULIB_MKSTEMP=0;
+ GNULIB_MKSTEMPS=0;
+ GNULIB_POSIX_MEMALIGN=0;
+ GNULIB_POSIX_OPENPT=0;
+ GNULIB_PTSNAME=0;
+ GNULIB_PTSNAME_R=0;
+ GNULIB_PUTENV=0;
+ GNULIB_QSORT_R=0;
+ GNULIB_RANDOM=0;
+ GNULIB_RANDOM_R=0;
+ GNULIB_REALLOCARRAY=0;
+ GNULIB_REALLOC_POSIX=0;
+ GNULIB_REALPATH=0;
+ GNULIB_RPMATCH=0;
+ GNULIB_SECURE_GETENV=0;
+ GNULIB_SETENV=0;
+ GNULIB_STRTOD=0;
+ GNULIB_STRTOLD=0;
+ GNULIB_STRTOLL=0;
+ GNULIB_STRTOULL=0;
+ GNULIB_SYSTEM_POSIX=0;
+ GNULIB_UNLOCKPT=0;
+ GNULIB_UNSETENV=0;
+ GNULIB_WCTOMB=0;
+ GNULIB_MDA_ECVT=1;
+ GNULIB_MDA_FCVT=1;
+ GNULIB_MDA_GCVT=1;
+ GNULIB_MDA_MKTEMP=1;
+ GNULIB_MDA_PUTENV=1;
+ HAVE__EXIT=1;
+ HAVE_ALIGNED_ALLOC=1;
+ HAVE_ATOLL=1;
+ HAVE_CANONICALIZE_FILE_NAME=1;
+ HAVE_DECL_ECVT=1;
+ HAVE_DECL_FCVT=1;
+ HAVE_DECL_GCVT=1;
+ HAVE_DECL_GETLOADAVG=1;
+ HAVE_GETSUBOPT=1;
+ HAVE_GRANTPT=1;
+ HAVE_INITSTATE=1;
+ HAVE_DECL_INITSTATE=1;
+ HAVE_MBTOWC=1;
+ HAVE_MKDTEMP=1;
+ HAVE_MKOSTEMP=1;
+ HAVE_MKOSTEMPS=1;
+ HAVE_MKSTEMP=1;
+ HAVE_MKSTEMPS=1;
+ HAVE_POSIX_MEMALIGN=1;
+ HAVE_POSIX_OPENPT=1;
+ HAVE_PTSNAME=1;
+ HAVE_PTSNAME_R=1;
+ HAVE_QSORT_R=1;
+ HAVE_RANDOM=1;
+ HAVE_RANDOM_H=1;
+ HAVE_RANDOM_R=1;
+ HAVE_REALLOCARRAY=1;
+ HAVE_REALPATH=1;
+ HAVE_RPMATCH=1;
+ HAVE_SECURE_GETENV=1;
+ HAVE_SETENV=1;
+ HAVE_DECL_SETENV=1;
+ HAVE_SETSTATE=1;
+ HAVE_DECL_SETSTATE=1;
+ HAVE_STRTOD=1;
+ HAVE_STRTOLD=1;
+ HAVE_STRTOLL=1;
+ HAVE_STRTOULL=1;
+ HAVE_STRUCT_RANDOM_DATA=1;
+ HAVE_SYS_LOADAVG_H=0;
+ HAVE_UNLOCKPT=1;
+ HAVE_DECL_UNSETENV=1;
+ REPLACE_ALIGNED_ALLOC=0;
+ REPLACE_CALLOC=0;
+ REPLACE_CANONICALIZE_FILE_NAME=0;
+ REPLACE_FREE=0;
+ REPLACE_INITSTATE=0;
+ REPLACE_MALLOC=0;
+ REPLACE_MBTOWC=0;
+ REPLACE_MKSTEMP=0;
+ REPLACE_POSIX_MEMALIGN=0;
+ REPLACE_PTSNAME=0;
+ REPLACE_PTSNAME_R=0;
+ REPLACE_PUTENV=0;
+ REPLACE_QSORT_R=0;
+ REPLACE_RANDOM=0;
+ REPLACE_RANDOM_R=0;
+ REPLACE_REALLOC=0;
+ REPLACE_REALPATH=0;
+ REPLACE_SETENV=0;
+ REPLACE_SETSTATE=0;
+ REPLACE_STRTOD=0;
+ REPLACE_STRTOLD=0;
+ REPLACE_UNSETENV=0;
+ REPLACE_WCTOMB=0;
+
+
+
+
+
+
+
+
+ if test $ac_cv_func__set_invalid_parameter_handler = yes; then
+ HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
+
+printf "%s\n" "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h
+
+ else
+ HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
+ fi
+
+
+
+
+ GNULIB_OPENDIR=0;
+ GNULIB_READDIR=0;
+ GNULIB_REWINDDIR=0;
+ GNULIB_CLOSEDIR=0;
+ GNULIB_DIRFD=0;
+ GNULIB_FDOPENDIR=0;
+ GNULIB_SCANDIR=0;
+ GNULIB_ALPHASORT=0;
+ HAVE_OPENDIR=1;
+ HAVE_READDIR=1;
+ HAVE_REWINDDIR=1;
+ HAVE_CLOSEDIR=1;
+ HAVE_DECL_DIRFD=1;
+ HAVE_DECL_FDOPENDIR=1;
+ HAVE_FDOPENDIR=1;
+ HAVE_SCANDIR=1;
+ HAVE_ALPHASORT=1;
+ REPLACE_OPENDIR=0;
+ REPLACE_CLOSEDIR=0;
+ REPLACE_DIRFD=0;
+ REPLACE_FDOPENDIR=0;
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether linux/if_alg.h has struct sockaddr_alg." >&5
+printf %s "checking whether linux/if_alg.h has struct sockaddr_alg.... " >&6; }
+if test ${gl_cv_header_linux_if_alg_salg+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/socket.h>
+ #include <linux/if_alg.h>
+ struct sockaddr_alg salg = {
+ .salg_family = AF_ALG,
+ .salg_type = "hash",
+ .salg_name = "sha1",
+ };
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_linux_if_alg_salg=yes
+else $as_nop
+ gl_cv_header_linux_if_alg_salg=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_linux_if_alg_salg" >&5
+printf "%s\n" "$gl_cv_header_linux_if_alg_salg" >&6; }
+ if test "$gl_cv_header_linux_if_alg_salg" = yes; then
+
+printf "%s\n" "#define HAVE_LINUX_IF_ALG_H 1" >>confdefs.h
+
+ fi
+
+ use_af_alg=no
+
+# Check whether --with-linux-crypto was given.
+if test ${with_linux_crypto+y}
+then :
+ withval=$with_linux_crypto; use_af_alg=$withval
+else $as_nop
+ use_af_alg=no
+fi
+
+ if test "$gl_cv_header_linux_if_alg_salg" != yes; then
+ if test "$use_af_alg" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Linux kernel cryptographic API not found" >&5
+printf "%s\n" "$as_me: WARNING: Linux kernel cryptographic API not found" >&2;}
+ fi
+ use_af_alg=no
+ fi
+
+ if test "$use_af_alg" != no; then
+ USE_AF_ALG=1
+ else
+ USE_AF_ALG=0
+ fi
+
+printf "%s\n" "#define USE_LINUX_CRYPTO_API $USE_AF_ALG" >>confdefs.h
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+printf %s "checking whether byte ordering is bigendian... " >&6; }
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes
+then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+unsigned short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ unsigned short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ unsigned short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ unsigned short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_bigendian=no
+else $as_nop
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+printf "%s\n" "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+ yes)
+ printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+ no)
+ ;; #(
+ universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+
+ GNULIB_ISBLANK=0;
+ HAVE_ISBLANK=1;
+
+
+gl_mda_defines='
+#if defined _WIN32 && !defined __CYGWIN__
+#define access _access
+#define chdir _chdir
+#define chmod _chmod
+#define close _close
+#define creat _creat
+#define dup _dup
+#define dup2 _dup2
+#define ecvt _ecvt
+#define execl _execl
+#define execle _execle
+#define execlp _execlp
+#define execv _execv
+#define execve _execve
+#define execvp _execvp
+#define execvpe _execvpe
+#define fcloseall _fcloseall
+#define fcvt _fcvt
+#define fdopen _fdopen
+#define fileno _fileno
+#define gcvt _gcvt
+#define getcwd _getcwd
+#define getpid _getpid
+#define getw _getw
+#define isatty _isatty
+#define j0 _j0
+#define j1 _j1
+#define jn _jn
+#define lfind _lfind
+#define lsearch _lsearch
+#define lseek _lseek
+#define memccpy _memccpy
+#define mkdir _mkdir
+#define mktemp _mktemp
+#define open _open
+#define putenv _putenv
+#define putw _putw
+#define read _read
+#define rmdir _rmdir
+#define strdup _strdup
+#define swab _swab
+#define tempnam _tempnam
+#define tzset _tzset
+#define umask _umask
+#define unlink _unlink
+#define utime _utime
+#define wcsdup _wcsdup
+#define write _write
+#define y0 _y0
+#define y1 _y1
+#define yn _yn
+#endif
+'
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
+printf %s "checking if environ is properly declared... " >&6; }
+if test ${gt_cv_var_environ_declaration+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
+ /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */
+ #include <stdlib.h>
+
+ extern struct { int foo; } environ;
+int
+main (void)
+{
+environ.foo = 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_var_environ_declaration=no
+else $as_nop
+ gt_cv_var_environ_declaration=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
+printf "%s\n" "$gt_cv_var_environ_declaration" >&6; }
+ if test $gt_cv_var_environ_declaration = yes; then
+
+printf "%s\n" "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
+
+ fi
+
+
+ if test $gt_cv_var_environ_declaration != yes; then
+ HAVE_DECL_ENVIRON=0
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
+printf %s "checking for complete errno.h... " >&6; }
+if test ${gl_cv_header_errno_h_complete+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "booboo" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_complete=no
+else $as_nop
+ gl_cv_header_errno_h_complete=yes
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
+printf "%s\n" "$gl_cv_header_errno_h_complete" >&6; }
+ if test $gl_cv_header_errno_h_complete = yes; then
+ ERRNO_H=''
+ else
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_errno_h='<'errno.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
+printf %s "checking absolute name of <errno.h>... " >&6; }
+if test ${gl_cv_next_errno_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <errno.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'errno.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_errno_h
+ gl_cv_next_errno_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
+printf "%s\n" "$gl_cv_next_errno_h" >&6; }
+ fi
+ NEXT_ERRNO_H=$gl_cv_next_errno_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'errno.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_errno_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive
+
+
+
+
+ ERRNO_H='errno.h'
+ fi
+
+ if test -n "$ERRNO_H"; then
+ GL_GENERATE_ERRNO_H_TRUE=
+ GL_GENERATE_ERRNO_H_FALSE='#'
+else
+ GL_GENERATE_ERRNO_H_TRUE='#'
+ GL_GENERATE_ERRNO_H_FALSE=
+fi
+
+
+ if test -n "$ERRNO_H"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
+printf %s "checking for EMULTIHOP value... " >&6; }
+if test ${gl_cv_header_errno_h_EMULTIHOP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EMULTIHOP=yes
+else $as_nop
+ gl_cv_header_errno_h_EMULTIHOP=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EMULTIHOP = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EMULTIHOP=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
+ case $gl_cv_header_errno_h_EMULTIHOP in
+ yes | no)
+ EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
+ ;;
+ *)
+ EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
+ ;;
+ esac
+
+
+ fi
+
+
+ if test -n "$ERRNO_H"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
+printf %s "checking for ENOLINK value... " >&6; }
+if test ${gl_cv_header_errno_h_ENOLINK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_ENOLINK=yes
+else $as_nop
+ gl_cv_header_errno_h_ENOLINK=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_ENOLINK = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_ENOLINK=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_ENOLINK = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
+printf "%s\n" "$gl_cv_header_errno_h_ENOLINK" >&6; }
+ case $gl_cv_header_errno_h_ENOLINK in
+ yes | no)
+ ENOLINK_HIDDEN=0; ENOLINK_VALUE=
+ ;;
+ *)
+ ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
+ ;;
+ esac
+
+
+ fi
+
+
+ if test -n "$ERRNO_H"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
+printf %s "checking for EOVERFLOW value... " >&6; }
+if test ${gl_cv_header_errno_h_EOVERFLOW+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EOVERFLOW=yes
+else $as_nop
+ gl_cv_header_errno_h_EOVERFLOW=no
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EOVERFLOW = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1
+then :
+ gl_cv_header_errno_h_EOVERFLOW=hidden
+fi
+rm -rf conftest*
+
+ if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
+ if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW" "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+"
+then :
+
+fi
+
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
+printf "%s\n" "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
+ case $gl_cv_header_errno_h_EOVERFLOW in
+ yes | no)
+ EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
+ ;;
+ *)
+ EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
+ ;;
+ esac
+
+
+ fi
+
+
+ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strerror_r" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRERROR_R $ac_have_decl" >>confdefs.h
+
+
+if test $ac_cv_have_decl_strerror_r = yes; then
+ # For backward compatibility's sake, define HAVE_STRERROR_R.
+ # (We used to run AC_CHECK_FUNCS_ONCE for strerror_r, as well
+ # as AC_CHECK_DECLS_ONCE.)
+
+printf "%s\n" "#define HAVE_STRERROR_R 1" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
+printf %s "checking whether strerror_r returns char *... " >&6; }
+if test ${ac_cv_func_strerror_r_char_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_cv_func_strerror_r_char_p=no
+ if test $ac_cv_have_decl_strerror_r = yes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+int
+main (void)
+{
+
+ char buf[100];
+ char x = *strerror_r (0, buf, sizeof buf);
+ char *p = strerror_r (0, buf, sizeof buf);
+ return !p || x;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_func_strerror_r_char_p=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
+printf "%s\n" "$ac_cv_func_strerror_r_char_p" >&6; }
+if test $ac_cv_func_strerror_r_char_p = yes; then
+
+printf "%s\n" "#define STRERROR_R_CHAR_P 1" >>confdefs.h
+
+fi
+
+
+ XGETTEXT_EXTRA_OPTIONS=
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include <signal.h>
+"
+if test "x$ac_cv_type_sig_atomic_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIG_ATOMIC_T 1" >>confdefs.h
+
+
+else $as_nop
+
+printf "%s\n" "#define sig_atomic_t int" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_decl "$LINENO" "fchdir" "ac_cv_have_decl_fchdir" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fchdir" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FCHDIR $ac_have_decl" >>confdefs.h
+
+
+ GNULIB_CREAT=0;
+ GNULIB_FCNTL=0;
+ GNULIB_NONBLOCKING=0;
+ GNULIB_OPEN=0;
+ GNULIB_OPENAT=0;
+ GNULIB_MDA_CREAT=1;
+ GNULIB_MDA_OPEN=1;
+ HAVE_FCNTL=1;
+ HAVE_OPENAT=1;
+ REPLACE_CREAT=0;
+ REPLACE_FCNTL=0;
+ REPLACE_OPEN=0;
+ REPLACE_OPENAT=0;
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
+printf %s "checking for working fcntl.h... " >&6; }
+if test ${gl_cv_header_working_fcntl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess 'no' on native Windows.
+ mingw*) gl_cv_header_working_fcntl_h='no' ;;
+ *) gl_cv_header_working_fcntl_h=cross-compiling ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ # include <stdlib.h>
+ # defined sleep(n) _sleep ((n) * 1000)
+ #endif
+ #include <fcntl.h>
+
+
+$gl_mda_defines
+
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
+ #ifndef O_NOFOLLOW
+ #define O_NOFOLLOW 0
+ #endif
+ static int const constants[] =
+ {
+ O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+ O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+ };
+
+int
+main (void)
+{
+
+ int result = !constants;
+ #if HAVE_SYMLINK
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink ("/dev/null", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ if (unlink (sym) != 0 || symlink (".", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ unlink (sym);
+ }
+ #endif
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ if (fd < 0)
+ result |= 8;
+ else
+ {
+ struct stat st0;
+ if (fstat (fd, &st0) != 0)
+ result |= 16;
+ else
+ {
+ char c;
+ sleep (1);
+ if (read (fd, &c, 1) != 1)
+ result |= 24;
+ else
+ {
+ if (close (fd) != 0)
+ result |= 32;
+ else
+ {
+ struct stat st1;
+ if (stat (file, &st1) != 0)
+ result |= 40;
+ else
+ if (st0.st_atime != st1.st_atime)
+ result |= 64;
+ }
+ }
+ }
+ }
+ }
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_header_working_fcntl_h=yes
+else $as_nop
+ case $? in #(
+ 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
+printf "%s\n" "$gl_cv_header_working_fcntl_h" >&6; }
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOATIME $ac_val" >>confdefs.h
+
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+
+printf "%s\n" "#define HAVE_WORKING_O_NOFOLLOW $ac_val" >>confdefs.h
+
+
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define mode_t int" >>confdefs.h
+
+fi
+
+
+
+ GNULIB_DPRINTF=0;
+ GNULIB_FCLOSE=0;
+ GNULIB_FDOPEN=0;
+ GNULIB_FFLUSH=0;
+ GNULIB_FGETC=0;
+ GNULIB_FGETS=0;
+ GNULIB_FOPEN=0;
+ GNULIB_FPRINTF=0;
+ GNULIB_FPRINTF_POSIX=0;
+ GNULIB_FPURGE=0;
+ GNULIB_FPUTC=0;
+ GNULIB_FPUTS=0;
+ GNULIB_FREAD=0;
+ GNULIB_FREOPEN=0;
+ GNULIB_FSCANF=0;
+ GNULIB_FSEEK=0;
+ GNULIB_FSEEKO=0;
+ GNULIB_FTELL=0;
+ GNULIB_FTELLO=0;
+ GNULIB_FWRITE=0;
+ GNULIB_GETC=0;
+ GNULIB_GETCHAR=0;
+ GNULIB_GETDELIM=0;
+ GNULIB_GETLINE=0;
+ GNULIB_OBSTACK_PRINTF=0;
+ GNULIB_OBSTACK_PRINTF_POSIX=0;
+ GNULIB_PCLOSE=0;
+ GNULIB_PERROR=0;
+ GNULIB_POPEN=0;
+ GNULIB_PRINTF=0;
+ GNULIB_PRINTF_POSIX=0;
+ GNULIB_PUTC=0;
+ GNULIB_PUTCHAR=0;
+ GNULIB_PUTS=0;
+ GNULIB_REMOVE=0;
+ GNULIB_RENAME=0;
+ GNULIB_RENAMEAT=0;
+ GNULIB_SCANF=0;
+ GNULIB_SNPRINTF=0;
+ GNULIB_SPRINTF_POSIX=0;
+ GNULIB_STDIO_H_NONBLOCKING=0;
+ GNULIB_STDIO_H_SIGPIPE=0;
+ GNULIB_TMPFILE=0;
+ GNULIB_VASPRINTF=0;
+ GNULIB_VFSCANF=0;
+ GNULIB_VSCANF=0;
+ GNULIB_VDPRINTF=0;
+ GNULIB_VFPRINTF=0;
+ GNULIB_VFPRINTF_POSIX=0;
+ GNULIB_VPRINTF=0;
+ GNULIB_VPRINTF_POSIX=0;
+ GNULIB_VSNPRINTF=0;
+ GNULIB_VSPRINTF_POSIX=0;
+ GNULIB_MDA_FCLOSEALL=1;
+ GNULIB_MDA_FDOPEN=1;
+ GNULIB_MDA_FILENO=1;
+ GNULIB_MDA_GETW=1;
+ GNULIB_MDA_PUTW=1;
+ GNULIB_MDA_TEMPNAM=1;
+ HAVE_DECL_FCLOSEALL=1;
+ HAVE_DECL_FPURGE=1;
+ HAVE_DECL_FSEEKO=1;
+ HAVE_DECL_FTELLO=1;
+ HAVE_DECL_GETDELIM=1;
+ HAVE_DECL_GETLINE=1;
+ HAVE_DECL_OBSTACK_PRINTF=1;
+ HAVE_DECL_SNPRINTF=1;
+ HAVE_DECL_VSNPRINTF=1;
+ HAVE_DPRINTF=1;
+ HAVE_FSEEKO=1;
+ HAVE_FTELLO=1;
+ HAVE_PCLOSE=1;
+ HAVE_POPEN=1;
+ HAVE_RENAMEAT=1;
+ HAVE_VASPRINTF=1;
+ HAVE_VDPRINTF=1;
+ REPLACE_DPRINTF=0;
+ REPLACE_FCLOSE=0;
+ REPLACE_FDOPEN=0;
+ REPLACE_FFLUSH=0;
+ REPLACE_FOPEN=0;
+ REPLACE_FPRINTF=0;
+ REPLACE_FPURGE=0;
+ REPLACE_FREOPEN=0;
+ REPLACE_FSEEK=0;
+ REPLACE_FSEEKO=0;
+ REPLACE_FTELL=0;
+ REPLACE_FTELLO=0;
+ REPLACE_GETDELIM=0;
+ REPLACE_GETLINE=0;
+ REPLACE_OBSTACK_PRINTF=0;
+ REPLACE_PERROR=0;
+ REPLACE_POPEN=0;
+ REPLACE_PRINTF=0;
+ REPLACE_REMOVE=0;
+ REPLACE_RENAME=0;
+ REPLACE_RENAMEAT=0;
+ REPLACE_SNPRINTF=0;
+ REPLACE_SPRINTF=0;
+ REPLACE_STDIO_READ_FUNCS=0;
+ REPLACE_STDIO_WRITE_FUNCS=0;
+ REPLACE_TMPFILE=0;
+ REPLACE_VASPRINTF=0;
+ REPLACE_VDPRINTF=0;
+ REPLACE_VFPRINTF=0;
+ REPLACE_VPRINTF=0;
+ REPLACE_VSNPRINTF=0;
+ REPLACE_VSPRINTF=0;
+
+
+
+ ac_fn_c_check_func "$LINENO" "eaccess" "ac_cv_func_eaccess"
+if test "x$ac_cv_func_eaccess" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define eaccess access" >>confdefs.h
+
+fi
+
+
+
+ GNULIB_FLOCK=0;
+ HAVE_FLOCK=1;
+
+
+
+ GNULIB_FNMATCH=0;
+ HAVE_FNMATCH=1;
+ REPLACE_FNMATCH=0;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_fnmatch_h='<'fnmatch.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <fnmatch.h>" >&5
+printf %s "checking absolute name of <fnmatch.h>... " >&6; }
+if test ${gl_cv_next_fnmatch_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_fnmatch_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fnmatch.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'fnmatch.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_fnmatch_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_fnmatch_h
+ gl_cv_next_fnmatch_h='"'$gl_header'"'
+ else
+ gl_cv_next_fnmatch_h='<'fnmatch.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fnmatch_h" >&5
+printf "%s\n" "$gl_cv_next_fnmatch_h" >&6; }
+ fi
+ NEXT_FNMATCH_H=$gl_cv_next_fnmatch_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'fnmatch.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_fnmatch_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+ if test $ac_cv_header_fnmatch_h = yes; then
+ HAVE_FNMATCH_H=1
+ else
+ HAVE_FNMATCH_H=0
+ fi
+
+
+ FNMATCH_H=''
+ if false; then
+ FNMATCH_H=fnmatch.h
+ else
+ if test $ac_cv_header_fnmatch_h != yes; then
+ FNMATCH_H=fnmatch.h
+ fi
+ fi
+
+
+ if test -n "$FNMATCH_H"; then
+ GL_GENERATE_FNMATCH_H_TRUE=
+ GL_GENERATE_FNMATCH_H_FALSE='#'
+else
+ GL_GENERATE_FNMATCH_H_TRUE='#'
+ GL_GENERATE_FNMATCH_H_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
+printf %s "checking for mbstate_t... " >&6; }
+if test ${ac_cv_type_mbstate_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+ #include <wchar.h>
+int
+main (void)
+{
+mbstate_t x; return sizeof x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_type_mbstate_t=yes
+else $as_nop
+ ac_cv_type_mbstate_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mbstate_t" >&5
+printf "%s\n" "$ac_cv_type_mbstate_t" >&6; }
+ if test $ac_cv_type_mbstate_t = yes; then
+
+printf "%s\n" "#define HAVE_MBSTATE_T 1" >>confdefs.h
+
+ else
+
+printf "%s\n" "#define mbstate_t int" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdin defaults to large file offsets" >&5
+printf %s "checking whether stdin defaults to large file offsets... " >&6; }
+if test ${gl_cv_var_stdin_large_offset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+#if defined __SL64 && defined __SCLE /* cygwin */
+ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making
+ fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and
+ it is easier to do a version check than building a runtime test. */
+# include <cygwin/version.h>
+# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25)
+ choke me
+# endif
+#endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_var_stdin_large_offset=yes
+else $as_nop
+ gl_cv_var_stdin_large_offset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var_stdin_large_offset" >&5
+printf "%s\n" "$gl_cv_var_stdin_large_offset" >&6; }
+
+
+
+
+
+ case "$host_os" in
+ mingw*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit off_t" >&5
+printf %s "checking for 64-bit off_t... " >&6; }
+if test ${gl_cv_type_off_t_64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_off_t_64=yes
+else $as_nop
+ gl_cv_type_off_t_64=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_off_t_64" >&5
+printf "%s\n" "$gl_cv_type_off_t_64" >&6; }
+ if test $gl_cv_type_off_t_64 = no; then
+ WINDOWS_64_BIT_OFF_T=1
+ else
+ WINDOWS_64_BIT_OFF_T=0
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit st_size" >&5
+printf %s "checking for 64-bit st_size... " >&6; }
+if test ${gl_cv_member_st_size_64+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ struct stat buf;
+ int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_member_st_size_64=yes
+else $as_nop
+ gl_cv_member_st_size_64=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_member_st_size_64" >&5
+printf "%s\n" "$gl_cv_member_st_size_64" >&6; }
+ if test $gl_cv_member_st_size_64 = no; then
+ WINDOWS_64_BIT_ST_SIZE=1
+ else
+ WINDOWS_64_BIT_ST_SIZE=0
+ fi
+ ;;
+ *)
+ WINDOWS_64_BIT_OFF_T=0
+ WINDOWS_64_BIT_ST_SIZE=0
+ ;;
+ esac
+
+
+
+
+
+
+
+
+
+printf "%s\n" "#define _USE_STD_STAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_types_h='<'sys/types.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
+printf %s "checking absolute name of <sys/types.h>... " >&6; }
+if test ${gl_cv_next_sys_types_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/types.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_types_h
+ gl_cv_next_sys_types_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
+printf "%s\n" "$gl_cv_next_sys_types_h" >&6; }
+ fi
+ NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/types.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_types_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+ WINDOWS_STAT_INODES=0
+
+
+
+ac_fn_c_check_decl "$LINENO" "fseeko" "ac_cv_have_decl_fseeko" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fseeko" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FSEEKO $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5
+printf %s "checking for fseeko... " >&6; }
+if test ${gl_cv_func_fseeko+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+
+int
+main (void)
+{
+fseeko (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_fseeko=yes
+else $as_nop
+ gl_cv_func_fseeko=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5
+printf "%s\n" "$gl_cv_func_fseeko" >&6; }
+
+
+ if test $ac_cv_have_decl_fseeko = no; then
+ HAVE_DECL_FSEEKO=0
+ fi
+
+ if test $gl_cv_func_fseeko = no; then
+ HAVE_FSEEKO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FSEEKO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FSEEKO=1
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fflush works on input streams" >&5
+printf %s "checking whether fflush works on input streams... " >&6; }
+if test ${gl_cv_func_fflush_stdin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo hello world > conftest.txt
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_fflush_stdin="guessing no" ;;
+ *) gl_cv_func_fflush_stdin=cross ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.txt", "r");
+ char buffer[10];
+ int fd;
+ int c;
+ if (f == NULL)
+ return 1;
+ fd = fileno (f);
+ if (fd < 0 || fread (buffer, 1, 5, f) != 5)
+ { fclose (f); return 2; }
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ { fclose (f); return 3; }
+ /* POSIX requires fflush-fseek to set file offset of fd. This fails
+ on BSD systems and on mingw. */
+ if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
+ { fclose (f); return 4; }
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ { fclose (f); return 5; }
+ /* Verify behaviour of fflush after ungetc. See
+ <https://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> */
+ /* Verify behaviour of fflush after a backup ungetc. This fails on
+ mingw. */
+ c = fgetc (f);
+ ungetc (c, f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 6; }
+ /* Verify behaviour of fflush after a non-backup ungetc. This fails
+ on glibc 2.8 and on BSD systems. */
+ c = fgetc (f);
+ ungetc ('@', f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 7; }
+ fclose (f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fflush_stdin=yes
+else $as_nop
+ gl_cv_func_fflush_stdin=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm conftest.txt
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fflush_stdin" >&5
+printf "%s\n" "$gl_cv_func_fflush_stdin" >&6; }
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) gl_func_fflush_stdin=1 ;;
+ *no) gl_func_fflush_stdin=0 ;;
+ *) gl_func_fflush_stdin='(-1)' ;;
+ esac
+
+printf "%s\n" "#define FUNC_FFLUSH_STDIN $gl_func_fflush_stdin" >>confdefs.h
+
+
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) ;;
+ *) REPLACE_FSEEKO=1 ;;
+ esac
+
+ fi
+
+
+ GNULIB_FCHMODAT=0;
+ GNULIB_FSTAT=0;
+ GNULIB_FSTATAT=0;
+ GNULIB_FUTIMENS=0;
+ GNULIB_GETUMASK=0;
+ GNULIB_LCHMOD=0;
+ GNULIB_LSTAT=0;
+ GNULIB_MKDIR=0;
+ GNULIB_MKDIRAT=0;
+ GNULIB_MKFIFO=0;
+ GNULIB_MKFIFOAT=0;
+ GNULIB_MKNOD=0;
+ GNULIB_MKNODAT=0;
+ GNULIB_STAT=0;
+ GNULIB_UTIMENSAT=0;
+ GNULIB_OVERRIDES_STRUCT_STAT=0;
+ GNULIB_MDA_CHMOD=1;
+ GNULIB_MDA_MKDIR=1;
+ GNULIB_MDA_UMASK=1;
+ HAVE_FCHMODAT=1;
+ HAVE_FSTATAT=1;
+ HAVE_FUTIMENS=1;
+ HAVE_GETUMASK=1;
+ HAVE_LCHMOD=1;
+ HAVE_LSTAT=1;
+ HAVE_MKDIRAT=1;
+ HAVE_MKFIFO=1;
+ HAVE_MKFIFOAT=1;
+ HAVE_MKNOD=1;
+ HAVE_MKNODAT=1;
+ HAVE_UTIMENSAT=1;
+ REPLACE_FCHMODAT=0;
+ REPLACE_FSTAT=0;
+ REPLACE_FSTATAT=0;
+ REPLACE_FUTIMENS=0;
+ REPLACE_LSTAT=0;
+ REPLACE_MKDIR=0;
+ REPLACE_MKFIFO=0;
+ REPLACE_MKNOD=0;
+ REPLACE_STAT=0;
+ REPLACE_UTIMENSAT=0;
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
+printf %s "checking whether stat file-mode macros are broken... " >&6; }
+if test ${ac_cv_header_stat_broken+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined S_ISBLK && defined S_IFDIR
+extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#endif
+
+#if defined S_ISBLK && defined S_IFCHR
+extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
+#endif
+
+#if defined S_ISLNK && defined S_IFREG
+extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
+#endif
+
+#if defined S_ISSOCK && defined S_IFREG
+extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_header_stat_broken=no
+else $as_nop
+ ac_cv_header_stat_broken=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
+printf "%s\n" "$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
+
+printf "%s\n" "#define STAT_MACROS_BROKEN 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
+printf %s "checking absolute name of <sys/stat.h>... " >&6; }
+if test ${gl_cv_next_sys_stat_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_stat_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/stat.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/stat.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_stat_h
+ gl_cv_next_sys_stat_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
+printf "%s\n" "$gl_cv_next_sys_stat_h" >&6; }
+ fi
+ NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/stat.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_stat_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+ WINDOWS_STAT_TIMESPEC=0
+
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_type_nlink_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define nlink_t int" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+ case "$host_os" in
+ mingw*)
+ ac_fn_c_check_header_compile "$LINENO" "sdkddkver.h" "ac_cv_header_sdkddkver_h" "$ac_includes_default"
+if test "x$ac_cv_header_sdkddkver_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SDKDDKVER_H 1" >>confdefs.h
+
+fi
+
+ ;;
+ esac
+
+
+ac_fn_c_check_decl "$LINENO" "ftello" "ac_cv_have_decl_ftello" "$ac_includes_default"
+if test "x$ac_cv_have_decl_ftello" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FTELLO $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_ftello = no; then
+ HAVE_DECL_FTELLO=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5
+printf %s "checking for ftello... " >&6; }
+if test ${gl_cv_func_ftello+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+ftello (stdin);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_ftello=yes
+else $as_nop
+ gl_cv_func_ftello=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5
+printf "%s\n" "$gl_cv_func_ftello" >&6; }
+ if test $gl_cv_func_ftello = no; then
+ HAVE_FTELLO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FTELLO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FTELLO=1
+ fi
+ if test $REPLACE_FTELLO = 0; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5
+printf %s "checking whether ftello works... " >&6; }
+if test ${gl_cv_func_ftello_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris.
+ solaris*) gl_cv_func_ftello_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_ftello_works="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_ftello_works="guessing yes" ;;
+ esac
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define TESTFILE "conftest.tmp"
+int
+main (void)
+{
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ return 70;
+ if (fwrite ("foogarsh", 1, 8, fp) < 8)
+ { fclose (fp); return 71; }
+ if (fclose (fp))
+ return 72;
+
+ /* The file's contents is now "foogarsh". */
+
+ /* Try writing after reading to EOF. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ return 73;
+ if (fseek (fp, -1, SEEK_END))
+ { fclose (fp); return 74; }
+ if (!(getc (fp) == 'h'))
+ { fclose (fp); return 1; }
+ if (!(getc (fp) == EOF))
+ { fclose (fp); return 2; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 3; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 4; }
+ if (!(putc ('!', fp) == '!'))
+ { fclose (fp); return 5; }
+ if (!(ftell (fp) == 9))
+ { fclose (fp); return 6; }
+ if (!(fclose (fp) == 0))
+ return 7;
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ return 75;
+ {
+ char buf[10];
+ if (!(fread (buf, 1, 10, fp) == 9))
+ { fclose (fp); return 10; }
+ if (!(memcmp (buf, "foogarsh!", 9) == 0))
+ { fclose (fp); return 11; }
+ }
+ if (!(fclose (fp) == 0))
+ return 12;
+
+ /* The file's contents is now "foogarsh!". */
+
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_ftello_works=yes
+else $as_nop
+ gl_cv_func_ftello_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5
+printf "%s\n" "$gl_cv_func_ftello_works" >&6; }
+ case "$gl_cv_func_ftello_works" in
+ *yes) ;;
+ *)
+ REPLACE_FTELLO=1
+
+printf "%s\n" "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+ fi
+
+
+
+ GNULIB_GETADDRINFO=0;
+ HAVE_STRUCT_ADDRINFO=1;
+ HAVE_DECL_FREEADDRINFO=1;
+ HAVE_DECL_GAI_STRERROR=1;
+ HAVE_DECL_GETADDRINFO=1;
+ HAVE_DECL_GETNAMEINFO=1;
+ REPLACE_GAI_STRERROR=0;
+ REPLACE_GETADDRINFO=0;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_netdb_h='<'netdb.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <netdb.h>" >&5
+printf %s "checking absolute name of <netdb.h>... " >&6; }
+if test ${gl_cv_next_netdb_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_netdb_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netdb.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'netdb.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_netdb_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_netdb_h
+ gl_cv_next_netdb_h='"'$gl_header'"'
+ else
+ gl_cv_next_netdb_h='<'netdb.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netdb_h" >&5
+printf "%s\n" "$gl_cv_next_netdb_h" >&6; }
+ fi
+ NEXT_NETDB_H=$gl_cv_next_netdb_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'netdb.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_netdb_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_NETDB_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_netdb_h = yes; then
+ HAVE_NETDB_H=1
+ else
+ HAVE_NETDB_H=0
+ fi
+
+
+
+
+
+
+
+ HOSTENT_LIB=
+ gl_saved_libs="$LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+printf %s "checking for library containing gethostbyname... " >&6; }
+if test ${ac_cv_search_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char gethostbyname ();
+int
+main (void)
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl network net
+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_gethostbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_gethostbyname+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_gethostbyname+y}
+then :
+
+else $as_nop
+ ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+printf "%s\n" "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_gethostbyname" != "none required"; then
+ HOSTENT_LIB="$ac_cv_search_gethostbyname"
+ fi
+fi
+
+ LIBS="$gl_saved_libs"
+ if test -z "$HOSTENT_LIB"; then
+
+ for ac_func in gethostbyname
+do :
+ ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in winsock2.h and -lws2_32" >&5
+printf %s "checking for gethostbyname in winsock2.h and -lws2_32... " >&6; }
+if test ${gl_cv_w32_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_w32_gethostbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+gethostbyname(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_w32_gethostbyname=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gl_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_gethostbyname" >&5
+printf "%s\n" "$gl_cv_w32_gethostbyname" >&6; }
+ if test "$gl_cv_w32_gethostbyname" = "yes"; then
+ HOSTENT_LIB="-lws2_32"
+ fi
+
+fi
+
+done
+ fi
+
+
+
+ SERVENT_LIB=
+ gl_saved_libs="$LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyname" >&5
+printf %s "checking for library containing getservbyname... " >&6; }
+if test ${ac_cv_search_getservbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char getservbyname ();
+int
+main (void)
+{
+return getservbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket network net
+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_getservbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_getservbyname+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_getservbyname+y}
+then :
+
+else $as_nop
+ ac_cv_search_getservbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyname" >&5
+printf "%s\n" "$ac_cv_search_getservbyname" >&6; }
+ac_res=$ac_cv_search_getservbyname
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_getservbyname" != "none required"; then
+ SERVENT_LIB="$ac_cv_search_getservbyname"
+ fi
+fi
+
+ LIBS="$gl_saved_libs"
+ if test -z "$SERVENT_LIB"; then
+
+ for ac_func in getservbyname
+do :
+ ac_fn_c_check_func "$LINENO" "getservbyname" "ac_cv_func_getservbyname"
+if test "x$ac_cv_func_getservbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETSERVBYNAME 1" >>confdefs.h
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getservbyname in winsock2.h and -lws2_32" >&5
+printf %s "checking for getservbyname in winsock2.h and -lws2_32... " >&6; }
+if test ${gl_cv_w32_getservbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_w32_getservbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+getservbyname(NULL,NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_w32_getservbyname=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gl_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getservbyname" >&5
+printf "%s\n" "$gl_cv_w32_getservbyname" >&6; }
+ if test "$gl_cv_w32_getservbyname" = "yes"; then
+ SERVENT_LIB="-lws2_32"
+ fi
+
+fi
+
+done
+ fi
+
+
+
+
+
+
+
+
+
+ HAVE_INET_NTOP=1
+ INET_NTOP_LIB=
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+ if test $HAVE_WINSOCK2_H = 1; then
+ REPLACE_INET_NTOP=1
+ ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <ws2tcpip.h>
+"
+if test "x$ac_cv_have_decl_inet_ntop" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_INET_NTOP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_inet_ntop = yes; then
+ INET_NTOP_LIB="-lws2_32"
+ else
+ HAVE_DECL_INET_NTOP=0
+ fi
+ else
+ gl_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5
+printf %s "checking for library containing inet_ntop... " >&6; }
+if test ${ac_cv_search_inet_ntop+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char inet_ntop ();
+int
+main (void)
+{
+return inet_ntop ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl resolv network
+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_inet_ntop=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_inet_ntop+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_inet_ntop+y}
+then :
+
+else $as_nop
+ ac_cv_search_inet_ntop=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5
+printf "%s\n" "$ac_cv_search_inet_ntop" >&6; }
+ac_res=$ac_cv_search_inet_ntop
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop"
+if test "x$ac_cv_func_inet_ntop" = xyes
+then :
+ printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_inet_ntop = no; then
+ HAVE_INET_NTOP=0
+ fi
+
+fi
+
+ LIBS=$gl_save_LIBS
+
+ if test "$ac_cv_search_inet_ntop" != "no" \
+ && test "$ac_cv_search_inet_ntop" != "none required"; then
+ INET_NTOP_LIB="$ac_cv_search_inet_ntop"
+ fi
+
+
+ ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <arpa/inet.h>
+ #if HAVE_NETDB_H
+ # include <netdb.h>
+ #endif
+
+"
+if test "x$ac_cv_have_decl_inet_ntop" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_INET_NTOP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_inet_ntop = no; then
+ HAVE_DECL_INET_NTOP=0
+ fi
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IPv4 sockets" >&5
+printf %s "checking for IPv4 sockets... " >&6; }
+if test ${gl_cv_socket_ipv4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+int
+main (void)
+{
+int x = AF_INET; struct in_addr y; struct sockaddr_in z;
+ if (&x && &y && &z) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_socket_ipv4=yes
+else $as_nop
+ gl_cv_socket_ipv4=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv4" >&5
+printf "%s\n" "$gl_cv_socket_ipv4" >&6; }
+ if test $gl_cv_socket_ipv4 = yes; then
+
+printf "%s\n" "#define HAVE_IPV4 1" >>confdefs.h
+
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IPv6 sockets" >&5
+printf %s "checking for IPv6 sockets... " >&6; }
+if test ${gl_cv_socket_ipv6+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+int
+main (void)
+{
+int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z;
+ if (&x && &y && &z) return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_socket_ipv6=yes
+else $as_nop
+ gl_cv_socket_ipv6=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socket_ipv6" >&5
+printf "%s\n" "$gl_cv_socket_ipv6" >&6; }
+ if test $gl_cv_socket_ipv6 = yes; then
+
+printf "%s\n" "#define HAVE_IPV6 1" >>confdefs.h
+
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd (NULL, 0) allocates memory for result" >&5
+printf %s "checking whether getcwd (NULL, 0) allocates memory for result... " >&6; }
+if test ${gl_cv_func_getcwd_null+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_getcwd_null="guessing yes";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <stdlib.h>
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# else /* on Windows with MSVC */
+# include <direct.h>
+# endif
+
+
+$gl_mda_defines
+
+# ifndef getcwd
+ char *getcwd ();
+# endif
+
+int
+main (void)
+{
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but _getcwd does allocate.
+ However, mingw fails to honor non-zero size. */
+#else
+ if (chdir ("/") != 0)
+ return 1;
+ else
+ {
+ char *f = getcwd (NULL, 0);
+ if (! f)
+ return 2;
+ if (f[0] != '/')
+ { free (f); return 3; }
+ if (f[1] != '\0')
+ { free (f); return 4; }
+ free (f);
+ return 0;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getcwd_null=yes
+else $as_nop
+ gl_cv_func_getcwd_null=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_null" >&5
+printf "%s\n" "$gl_cv_func_getcwd_null" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getcwd with POSIX signature" >&5
+printf %s "checking for getcwd with POSIX signature... " >&6; }
+if test ${gl_cv_func_getcwd_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ char *getcwd (char *, size_t);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_getcwd_posix_signature=yes
+else $as_nop
+ gl_cv_func_getcwd_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_getcwd_posix_signature" >&6; }
+
+ac_fn_c_check_decl "$LINENO" "getcwd" "ac_cv_have_decl_getcwd" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getcwd" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETCWD $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "getdelim" "ac_cv_have_decl_getdelim" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getdelim" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETDELIM $ac_have_decl" >>confdefs.h
+
+
+
+ac_fn_c_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getdtablesize" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETDTABLESIZE $ac_have_decl" >>confdefs.h
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+printf %s "checking for uid_t in sys/types.h... " >&6; }
+if test ${ac_cv_type_uid_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "uid_t" >/dev/null 2>&1
+then :
+ ac_cv_type_uid_t=yes
+else $as_nop
+ ac_cv_type_uid_t=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+printf "%s\n" "$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
+
+printf "%s\n" "#define uid_t int" >>confdefs.h
+
+
+printf "%s\n" "#define gid_t int" >>confdefs.h
+
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking type of array argument to getgroups" >&5
+printf %s "checking type of array argument to getgroups... " >&6; }
+if test ${ac_cv_type_getgroups+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ ac_cv_type_getgroups=cross
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Thanks to Mike Rendell for this test. */
+$ac_includes_default
+#define NGID 256
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
+int
+main (void)
+{
+ gid_t gidset[NGID];
+ int i, n;
+ union { gid_t gval; long int lval; } val;
+
+ val.lval = -1;
+ for (i = 0; i < NGID; i++)
+ gidset[i] = val.gval;
+ n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1,
+ gidset);
+ /* Exit non-zero if getgroups seems to require an array of ints. This
+ happens when gid_t is short int but getgroups modifies an array
+ of ints. */
+ return n > 0 && gidset[n] != val.gval;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_type_getgroups=gid_t
+else $as_nop
+ ac_cv_type_getgroups=int
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+if test $ac_cv_type_getgroups = cross; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1
+then :
+ ac_cv_type_getgroups=gid_t
+else $as_nop
+ ac_cv_type_getgroups=int
+fi
+rm -rf conftest*
+
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_getgroups" >&5
+printf "%s\n" "$ac_cv_type_getgroups" >&6; }
+
+printf "%s\n" "#define GETGROUPS_T $ac_cv_type_getgroups" >>confdefs.h
+
+
+ac_fn_c_check_decl "$LINENO" "getline" "ac_cv_have_decl_getline" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getline" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETLINE $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_getopt_h='<'getopt.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <getopt.h>" >&5
+printf %s "checking absolute name of <getopt.h>... " >&6; }
+if test ${gl_cv_next_getopt_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_getopt_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <getopt.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'getopt.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_getopt_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_getopt_h
+ gl_cv_next_getopt_h='"'$gl_header'"'
+ else
+ gl_cv_next_getopt_h='<'getopt.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_getopt_h" >&5
+printf "%s\n" "$gl_cv_next_getopt_h" >&6; }
+ fi
+ NEXT_GETOPT_H=$gl_cv_next_getopt_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'getopt.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_getopt_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_GETOPT_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_getopt_h = yes; then
+ HAVE_GETOPT_H=1
+ else
+ HAVE_GETOPT_H=0
+ fi
+
+
+ gl_replace_getopt=
+
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ for ac_header in getopt.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "getopt.h" "ac_cv_header_getopt_h" "$ac_includes_default"
+if test "x$ac_cv_header_getopt_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETOPT_H 1" >>confdefs.h
+
+else $as_nop
+ gl_replace_getopt=yes
+fi
+
+done
+ fi
+
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+
+ for ac_func in getopt_long_only
+do :
+ ac_fn_c_check_func "$LINENO" "getopt_long_only" "ac_cv_func_getopt_long_only"
+if test "x$ac_cv_func_getopt_long_only" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETOPT_LONG_ONLY 1" >>confdefs.h
+
+else $as_nop
+ gl_replace_getopt=yes
+fi
+
+done
+ fi
+
+ if test -z "$gl_replace_getopt"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getopt is POSIX compatible" >&5
+printf %s "checking whether getopt is POSIX compatible... " >&6; }
+if test ${gl_cv_func_getopt_posix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $cross_compiling = no; then
+ if test "$cross_compiling" = yes
+then :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char a[] = "-a";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, a, foo, bar, NULL };
+ int c;
+
+ c = getopt (4, argv, "ab");
+ if (!(c == 'a'))
+ return 1;
+ c = getopt (4, argv, "ab");
+ if (!(c == -1))
+ return 2;
+ if (!(optind == 2))
+ return 3;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getopt_posix=maybe
+else $as_nop
+ gl_cv_func_getopt_posix=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ if test $gl_cv_func_getopt_posix = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char donald[] = "donald";
+ static char p[] = "-p";
+ static char billy[] = "billy";
+ static char duck[] = "duck";
+ static char a[] = "-a";
+ static char bar[] = "bar";
+ char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
+ int c;
+
+ c = getopt (7, argv, "+abp:q:");
+ if (!(c == -1))
+ return 4;
+ if (!(strcmp (argv[0], "program") == 0))
+ return 5;
+ if (!(strcmp (argv[1], "donald") == 0))
+ return 6;
+ if (!(strcmp (argv[2], "-p") == 0))
+ return 7;
+ if (!(strcmp (argv[3], "billy") == 0))
+ return 8;
+ if (!(strcmp (argv[4], "duck") == 0))
+ return 9;
+ if (!(strcmp (argv[5], "-a") == 0))
+ return 10;
+ if (!(strcmp (argv[6], "bar") == 0))
+ return 11;
+ if (!(optind == 1))
+ return 12;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getopt_posix=maybe
+else $as_nop
+ gl_cv_func_getopt_posix=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
+ if test $gl_cv_func_getopt_posix = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char ab[] = "-ab";
+ char *argv[3] = { program, ab, NULL };
+ if (getopt (2, argv, "ab:") != 'a')
+ return 13;
+ if (getopt (2, argv, "ab:") != '?')
+ return 14;
+ if (optopt != 'b')
+ return 15;
+ if (optind != 2)
+ return 16;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getopt_posix=yes
+else $as_nop
+ gl_cv_func_getopt_posix=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
+ else
+ case "$host_os" in
+ darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
+ *) gl_cv_func_getopt_posix="guessing yes";;
+ esac
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_posix" >&5
+printf "%s\n" "$gl_cv_func_getopt_posix" >&6; }
+ case "$gl_cv_func_getopt_posix" in
+ *no) gl_replace_getopt=yes ;;
+ esac
+ fi
+
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt function" >&5
+printf %s "checking for working GNU getopt function... " >&6; }
+if test ${gl_cv_func_getopt_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
+ # optstring is necessary for programs like m4 that have POSIX-mandated
+ # semantics for supporting options interspersed with files.
+ # Also, since getopt_long is a GNU extension, we require optind=0.
+ # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
+ # so take care to revert to the correct (non-)export state.
+ gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
+ case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
+ xx) gl_had_POSIXLY_CORRECT=exported ;;
+ x) gl_had_POSIXLY_CORRECT=yes ;;
+ *) gl_had_POSIXLY_CORRECT= ;;
+ esac
+ POSIXLY_CORRECT=1
+ export POSIXLY_CORRECT
+ if test "$cross_compiling" = yes
+then :
+ gl_cv_func_getopt_gnu="$gl_cross_guess_normal"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+
+
+int
+main (void)
+{
+
+ int result = 0;
+
+ nocrash_init();
+
+ /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
+ and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
+ OSF/1 5.1, Solaris 10. */
+ {
+ static char conftest[] = "conftest";
+ static char plus[] = "-+";
+ char *argv[3] = { conftest, plus, NULL };
+ opterr = 0;
+ if (getopt (2, argv, "+a") != '?')
+ result |= 1;
+ }
+ /* This code succeeds on glibc 2.8, mingw,
+ and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+ IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
+ {
+ static char program[] = "program";
+ static char p[] = "-p";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, p, foo, bar, NULL };
+
+ optind = 1;
+ if (getopt (4, argv, "p::") != 'p')
+ result |= 2;
+ else if (optarg != NULL)
+ result |= 4;
+ else if (getopt (4, argv, "p::") != -1)
+ result |= 6;
+ else if (optind != 2)
+ result |= 8;
+ }
+ /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
+ {
+ static char program[] = "program";
+ static char foo[] = "foo";
+ static char p[] = "-p";
+ char *argv[] = { program, foo, p, NULL };
+ optind = 0;
+ if (getopt (3, argv, "-p") != 1)
+ result |= 16;
+ else if (getopt (3, argv, "-p") != 'p')
+ result |= 16;
+ }
+ /* This code fails on glibc 2.11. */
+ {
+ static char program[] = "program";
+ static char b[] = "-b";
+ static char a[] = "-a";
+ char *argv[] = { program, b, a, NULL };
+ optind = opterr = 0;
+ if (getopt (3, argv, "+:a:b") != 'b')
+ result |= 32;
+ else if (getopt (3, argv, "+:a:b") != ':')
+ result |= 32;
+ }
+ /* This code dumps core on glibc 2.14. */
+ {
+ static char program[] = "program";
+ static char w[] = "-W";
+ static char dummy[] = "dummy";
+ char *argv[] = { program, w, dummy, NULL };
+ optind = opterr = 1;
+ if (getopt (3, argv, "W;") != 'W')
+ result |= 64;
+ }
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getopt_gnu=yes
+else $as_nop
+ gl_cv_func_getopt_gnu=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ case $gl_had_POSIXLY_CORRECT in
+ exported) ;;
+ yes) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;}; POSIXLY_CORRECT=1 ;;
+ *) { POSIXLY_CORRECT=; unset POSIXLY_CORRECT;} ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_gnu" >&5
+printf "%s\n" "$gl_cv_func_getopt_gnu" >&6; }
+ if test "$gl_cv_func_getopt_gnu" != yes; then
+ gl_replace_getopt=yes
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working GNU getopt_long function" >&5
+printf %s "checking for working GNU getopt_long function... " >&6; }
+if test ${gl_cv_func_getopt_long_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
+ *) gl_cv_func_getopt_long_gnu="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+
+int
+main (void)
+{
+static const struct option long_options[] =
+ {
+ { "xtremely-",no_argument, NULL, 1003 },
+ { "xtra", no_argument, NULL, 1001 },
+ { "xtreme", no_argument, NULL, 1002 },
+ { "xtremely", no_argument, NULL, 1003 },
+ { NULL, 0, NULL, 0 }
+ };
+ /* This code fails on OpenBSD 5.0. */
+ {
+ static char program[] = "program";
+ static char xtremel[] = "--xtremel";
+ char *argv[] = { program, xtremel, NULL };
+ int option_index;
+ optind = 1; opterr = 0;
+ if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
+ return 1;
+ }
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getopt_long_gnu=yes
+else $as_nop
+ gl_cv_func_getopt_long_gnu=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getopt_long_gnu" >&5
+printf "%s\n" "$gl_cv_func_getopt_long_gnu" >&6; }
+ case "$gl_cv_func_getopt_long_gnu" in
+ *yes) ;;
+ *) gl_replace_getopt=yes ;;
+ esac
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_getpass = no; then
+ HAVE_GETPASS=0
+ fi
+
+
+
+ac_fn_c_check_decl "$LINENO" "fflush_unlocked" "ac_cv_have_decl_fflush_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fflush_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FFLUSH_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "flockfile" "ac_cv_have_decl_flockfile" "$ac_includes_default"
+if test "x$ac_cv_have_decl_flockfile" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FLOCKFILE $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fputs_unlocked" "ac_cv_have_decl_fputs_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fputs_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FPUTS_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "funlockfile" "ac_cv_have_decl_funlockfile" "$ac_includes_default"
+if test "x$ac_cv_have_decl_funlockfile" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FUNLOCKFILE $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "putc_unlocked" "ac_cv_have_decl_putc_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_putc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_PUTC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+
+
+ GNULIB_GETRANDOM=0;
+ HAVE_GETRANDOM=1;
+ REPLACE_GETRANDOM=0;
+
+
+:
+
+
+ GNULIB_GETTIMEOFDAY=0;
+ HAVE_GETTIMEOFDAY=1;
+ HAVE_STRUCT_TIMEVAL=1;
+ HAVE_SYS_TIME_H=1;
+ REPLACE_GETTIMEOFDAY=0;
+ REPLACE_STRUCT_TIMEVAL=0;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_time_h='<'sys/time.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/time.h>" >&5
+printf %s "checking absolute name of <sys/time.h>... " >&6; }
+if test ${gl_cv_next_sys_time_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_time_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/time.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/time.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_time_h
+ gl_cv_next_sys_time_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_time_h='<'sys/time.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_time_h" >&5
+printf "%s\n" "$gl_cv_next_sys_time_h" >&6; }
+ fi
+ NEXT_SYS_TIME_H=$gl_cv_next_sys_time_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/time.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_time_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H=$gl_next_as_first_directive
+
+
+
+
+
+ if test $ac_cv_header_sys_time_h != yes; then
+ HAVE_SYS_TIME_H=0
+ fi
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timeval" >&5
+printf %s "checking for struct timeval... " >&6; }
+if test ${gl_cv_sys_struct_timeval+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #if HAVE_WINSOCK2_H
+ # include <winsock2.h>
+ #endif
+
+int
+main (void)
+{
+static struct timeval x; x.tv_sec = x.tv_usec;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timeval=yes
+else $as_nop
+ gl_cv_sys_struct_timeval=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval" >&5
+printf "%s\n" "$gl_cv_sys_struct_timeval" >&6; }
+ if test $gl_cv_sys_struct_timeval != yes; then
+ HAVE_STRUCT_TIMEVAL=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wide-enough struct timeval.tv_sec member" >&5
+printf %s "checking for wide-enough struct timeval.tv_sec member... " >&6; }
+if test ${gl_cv_sys_struct_timeval_tv_sec+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #if HAVE_WINSOCK2_H
+ # include <winsock2.h>
+ #endif
+
+int
+main (void)
+{
+static struct timeval x;
+ typedef int verify_tv_sec_type[
+ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1
+ ];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timeval_tv_sec=yes
+else $as_nop
+ gl_cv_sys_struct_timeval_tv_sec=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timeval_tv_sec" >&5
+printf "%s\n" "$gl_cv_sys_struct_timeval_tv_sec" >&6; }
+ if test $gl_cv_sys_struct_timeval_tv_sec != yes; then
+ REPLACE_STRUCT_TIMEVAL=1
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ if test -z "$gl_pthreadlib_body_done"; then
+ gl_pthread_api=no
+ LIBPTHREAD=
+ LIBPMULTITHREAD=
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+ gl_have_pthread_h=yes
+else $as_nop
+ gl_have_pthread_h=no
+fi
+
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ #
+ # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+ # needs -pthread for some reason. See:
+ # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+ save_LIBS=$LIBS
+ for gl_pthread in '' '-pthread'; do
+ LIBS="$LIBS $gl_pthread"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+ pthread_mutex_t m;
+ pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+ pthread_mutexattr_init (&ma);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=$gl_pthread
+ LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$save_LIBS
+ test $gl_pthread_api = yes && break
+ done
+
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ LIBPMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ # On Solaris 10 or newer, this test is no longer needed, because
+ # libc contains the fully functional pthread functions.
+ case "$host_os" in
+ solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+ esac
+
+fi
+
+ elif test $gl_pthread_api != yes; then
+ # Some library is needed. Try libpthread and libc_r.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lpthread
+ LIBPMULTITHREAD=-lpthread
+fi
+
+ if test $gl_pthread_api != yes; then
+ # For FreeBSD 4.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lc_r
+ LIBPMULTITHREAD=-lc_r
+fi
+
+ fi
+ fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+ if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+ fi
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ LIB_SCHED_YIELD=
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+ ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lrt
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4 $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. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+ ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+ gl_pthreadlib_body_done=done
+ fi
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_all_mtsafe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+ *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+ gl_cv_func_setlocale_null_all_mtsafe=no ;;
+ # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+ *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+ gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_all_mtsafe" in
+ *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+ esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_one_mtsafe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ # Guess no on OpenBSD, AIX.
+ openbsd* | aix*)
+ gl_cv_func_setlocale_null_one_mtsafe=no ;;
+ # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+ *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+ gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_one_mtsafe" in
+ *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+ esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h
+
+
+ if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+ case "$host_os" in
+ mingw*) LIB_SETLOCALE_NULL= ;;
+ *)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_have_weak=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $gl_cv_have_weak = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_have_weak="guessing yes"
+else $as_nop
+ gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+ return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_have_weak=yes
+else $as_nop
+ gl_cv_have_weak=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
+ case " $LDFLAGS " in
+ *" -static "*) gl_cv_have_weak=no ;;
+ esac
+ case "$gl_cv_have_weak" in
+ *yes)
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ : > conftest1.c
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+ cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+ return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+ || gl_cv_have_weak=no
+ rm -f conftest1.c libempty.so conftest2.c conftest
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+ case "$gl_cv_have_weak" in
+ *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_have_weak" in
+ *yes) LIB_SETLOCALE_NULL= ;;
+ *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+ esac
+ ;;
+ esac
+ else
+ LIB_SETLOCALE_NULL=
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_limits_h='<'limits.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
+printf %s "checking absolute name of <limits.h>... " >&6; }
+if test ${gl_cv_next_limits_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_limits_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'limits.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_limits_h
+ gl_cv_next_limits_h='"'$gl_header'"'
+ else
+ gl_cv_next_limits_h='<'limits.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
+printf "%s\n" "$gl_cv_next_limits_h" >&6; }
+ fi
+ NEXT_LIMITS_H=$gl_cv_next_limits_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'limits.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_limits_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5
+printf %s "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_limits_width+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <limits.h>
+ long long llm = LLONG_MAX;
+ int wb = WORD_BIT;
+ int ullw = ULLONG_WIDTH;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_limits_width=yes
+else $as_nop
+ gl_cv_header_limits_width=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
+printf "%s\n" "$gl_cv_header_limits_width" >&6; }
+ if test "$gl_cv_header_limits_width" = yes; then
+ LIMITS_H=
+ else
+ LIMITS_H=limits.h
+ fi
+
+ if test -n "$LIMITS_H"; then
+ GL_GENERATE_LIMITS_H_TRUE=
+ GL_GENERATE_LIMITS_H_FALSE='#'
+else
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
+printf %s "checking for wint_t... " >&6; }
+if test ${gt_cv_c_wint_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_wint_t=yes
+else $as_nop
+ gt_cv_c_wint_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
+printf "%s\n" "$gt_cv_c_wint_t" >&6; }
+ if test $gt_cv_c_wint_t = yes; then
+
+printf "%s\n" "#define HAVE_WINT_T 1" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wint_t is large enough" >&5
+printf %s "checking whether wint_t is large enough... " >&6; }
+if test ${gl_cv_type_wint_t_large_enough+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wint_t_large_enough=yes
+else $as_nop
+ gl_cv_type_wint_t_large_enough=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_large_enough" >&5
+printf "%s\n" "$gl_cv_type_wint_t_large_enough" >&6; }
+ if test $gl_cv_type_wint_t_large_enough = no; then
+ GNULIB_OVERRIDES_WINT_T=1
+ else
+ GNULIB_OVERRIDES_WINT_T=0
+ fi
+ else
+ GNULIB_OVERRIDES_WINT_T=0
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler produces multi-arch binaries" >&5
+printf %s "checking whether the compiler produces multi-arch binaries... " >&6; }
+if test ${gl_cv_c_multiarch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_c_multiarch=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_multiarch" >&5
+printf "%s\n" "$gl_cv_c_multiarch" >&6; }
+ if test $gl_cv_c_multiarch = yes; then
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+
+
+
+
+
+
+
+
+printf "%s\n" "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+
+
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+
+
+
+ if test $ac_cv_header_inttypes_h = yes; then
+ HAVE_INTTYPES_H=1
+ else
+ HAVE_INTTYPES_H=0
+ fi
+
+
+
+ if test $ac_cv_header_sys_types_h = yes; then
+ HAVE_SYS_TYPES_H=1
+ else
+ HAVE_SYS_TYPES_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdint_h='<'stdint.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
+printf %s "checking absolute name of <stdint.h>... " >&6; }
+if test ${gl_cv_next_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_stdint_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdint.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdint.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdint_h
+ gl_cv_next_stdint_h='"'$gl_header'"'
+ else
+ gl_cv_next_stdint_h='<'stdint.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
+printf "%s\n" "$gl_cv_next_stdint_h" >&6; }
+ fi
+ NEXT_STDINT_H=$gl_cv_next_stdint_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdint.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdint_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ HAVE_STDINT_H=1
+ else
+ HAVE_STDINT_H=0
+ fi
+
+
+ if test $ac_cv_header_stdint_h = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
+printf %s "checking whether stdint.h conforms to C99... " >&6; }
+if test ${gl_cv_header_working_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_working_stdint_h=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>. */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible. */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
+ || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+ int check_PTRDIFF:
+ PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+ && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+ ? 1 : -1;
+ /* Detect bug in FreeBSD 6.0 / ia64. */
+ int check_SIG_ATOMIC:
+ SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+ && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+ ? 1 : -1;
+ int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+ int check_WCHAR:
+ WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+ && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+ ? 1 : -1;
+ /* Detect bug in mingw. */
+ int check_WINT:
+ WINT_MIN == TYPE_MINIMUM (wint_t)
+ && WINT_MAX == TYPE_MAXIMUM (wint_t)
+ ? 1 : -1;
+
+ /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */
+ int check_UINT8_C:
+ (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+ int check_UINT16_C:
+ (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+ /* Detect bugs in OpenBSD 3.9 stdint.h. */
+#ifdef UINT8_MAX
+ int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+ int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+ int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+ int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+ int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+ int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+ int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+ int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+ int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+ int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+ int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+ int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+ int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+ int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+ int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+ # In general, assume it works.
+ *) gl_cv_header_working_stdint_h="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+ {
+#ifdef INT8_MAX
+ MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+ MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+ MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+ MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+ MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+ MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+ MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+ MVAL (UINT64_MAX),
+#endif
+ NULL
+ };
+
+int
+main (void)
+{
+
+ const char **mv;
+ for (mv = macro_values; *mv != NULL; mv++)
+ {
+ const char *value = *mv;
+ /* Test whether it looks like a cast expression. */
+ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+ || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+ || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+ || strncmp (value, "((int)"/*)*/, 6) == 0
+ || strncmp (value, "((signed short)"/*)*/, 15) == 0
+ || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+ return mv - macro_values + 1;
+ }
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_header_working_stdint_h=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_working_stdint_h" >&6; }
+ fi
+
+ HAVE_C99_STDINT_H=0
+ HAVE_SYS_BITYPES_H=0
+ HAVE_SYS_INTTYPES_H=0
+ STDINT_H=stdint.h
+ case "$gl_cv_header_working_stdint_h" in
+ *yes)
+ HAVE_C99_STDINT_H=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h works without ISO C predefines" >&5
+printf %s "checking whether stdint.h works without ISO C predefines... " >&6; }
+if test ${gl_cv_header_stdint_without_STDC_macros+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_stdint_without_STDC_macros=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_without_STDC_macros=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_without_STDC_macros" >&5
+printf "%s\n" "$gl_cv_header_stdint_without_STDC_macros" >&6; }
+
+ if test $gl_cv_header_stdint_without_STDC_macros = no; then
+
+printf "%s\n" "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h
+
+
+printf "%s\n" "#define __STDC_LIMIT_MACROS 1" >>confdefs.h
+
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
+printf %s "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
+if test ${gl_cv_header_stdint_width+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_header_stdint_width=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <stdint.h>
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ int iw = UINTMAX_WIDTH;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_width=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
+printf "%s\n" "$gl_cv_header_stdint_width" >&6; }
+ if test "$gl_cv_header_stdint_width" = yes; then
+ STDINT_H=
+ fi
+ ;;
+ *)
+ ac_fn_c_check_header_compile "$LINENO" "sys/inttypes.h" "ac_cv_header_sys_inttypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_inttypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_INTTYPES_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_bitypes_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ fi
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ fi
+
+
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+ for gltype in ptrdiff_t size_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" "
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+ result=unknown
+fi
+
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+ fi
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+printf %s "checking for bit size of $gltype... " >&6; }
+if eval test \${gl_cv_bitsizeof_${gltype}+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result" "
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+#include <limits.h>"
+then :
+
+else $as_nop
+ result=unknown
+fi
+
+ eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ printf "%s\n" "#define BITSIZEOF_${GLTYPE} $result" >>confdefs.h
+
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+
+
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
+printf %s "checking whether $gltype is signed... " >&6; }
+if eval test \${gl_cv_type_${gltype}_signed+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ result=yes
+else $as_nop
+ result=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+eval ac_res=\$gl_cv_type_${gltype}_signed
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ printf "%s\n" "#define HAVE_SIGNED_${GLTYPE} 1" >>confdefs.h
+
+ eval HAVE_SIGNED_${GLTYPE}=1
+ else
+ eval HAVE_SIGNED_${GLTYPE}=0
+ fi
+ done
+
+
+ gl_cv_type_ptrdiff_t_signed=yes
+ gl_cv_type_size_t_signed=no
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+ for gltype in ptrdiff_t size_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+ done
+
+
+ fi
+
+
+ for gltype in sig_atomic_t wchar_t wint_t ; do
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+printf %s "checking for $gltype integer literal suffix... " >&6; }
+if eval test \${gl_cv_type_${gltype}_suffix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+
+ extern $gltype foo;
+ extern $gltype1 foo;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval gl_cv_type_${gltype}_suffix=\$glsuf
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done
+fi
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ printf "%s\n" "#define ${GLTYPE}_SUFFIX $result" >>confdefs.h
+
+ done
+
+
+
+ if test $GNULIB_OVERRIDES_WINT_T = 1; then
+ BITSIZEOF_WINT_T=32
+ fi
+
+ ;;
+ esac
+
+
+
+ LIMITS_H='limits.h'
+ if test -n "$LIMITS_H"; then
+ GL_GENERATE_LIMITS_H_TRUE=
+ GL_GENERATE_LIMITS_H_FALSE='#'
+else
+ GL_GENERATE_LIMITS_H_TRUE='#'
+ GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+
+
+
+
+ if test -n "$STDINT_H"; then
+ GL_GENERATE_STDINT_H_TRUE=
+ GL_GENERATE_STDINT_H_FALSE='#'
+else
+ GL_GENERATE_STDINT_H_TRUE='#'
+ GL_GENERATE_STDINT_H_FALSE=
+fi
+
+
+
+ GNULIB_IMAXABS=0;
+ GNULIB_IMAXDIV=0;
+ GNULIB_STRTOIMAX=0;
+ GNULIB_STRTOUMAX=0;
+ HAVE_DECL_IMAXABS=1;
+ HAVE_DECL_IMAXDIV=1;
+ HAVE_DECL_STRTOIMAX=1;
+ HAVE_DECL_STRTOUMAX=1;
+ HAVE_IMAXDIV_T=1;
+ REPLACE_STRTOIMAX=0;
+ REPLACE_STRTOUMAX=0;
+ INT32_MAX_LT_INTMAX_MAX=1;
+ INT64_MAX_EQ_LONG_MAX='defined _LP64';
+ PRIPTR_PREFIX=__PRIPTR_PREFIX;
+ UINT32_MAX_LT_UINTMAX_MAX=1;
+ UINT64_MAX_EQ_ULONG_MAX='defined _LP64';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_inttypes_h='<'inttypes.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <inttypes.h>" >&5
+printf %s "checking absolute name of <inttypes.h>... " >&6; }
+if test ${gl_cv_next_inttypes_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_inttypes_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <inttypes.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'inttypes.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_inttypes_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_inttypes_h
+ gl_cv_next_inttypes_h='"'$gl_header'"'
+ else
+ gl_cv_next_inttypes_h='<'inttypes.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_inttypes_h" >&5
+printf "%s\n" "$gl_cv_next_inttypes_h" >&6; }
+ fi
+ NEXT_INTTYPES_H=$gl_cv_next_inttypes_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'inttypes.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_inttypes_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GNULIB_ISWBLANK=0;
+ GNULIB_ISWDIGIT=0;
+ GNULIB_ISWXDIGIT=0;
+ GNULIB_WCTYPE=0;
+ GNULIB_ISWCTYPE=0;
+ GNULIB_WCTRANS=0;
+ GNULIB_TOWCTRANS=0;
+ HAVE_ISWBLANK=1;
+ HAVE_WCTYPE_T=1;
+ HAVE_WCTRANS_T=1;
+ REPLACE_ISWBLANK=0;
+ REPLACE_ISWDIGIT=0;
+ REPLACE_ISWXDIGIT=0;
+
+
+
+
+
+ if test $ac_cv_header_crtdefs_h = yes; then
+ HAVE_CRTDEFS_H=1
+ else
+ HAVE_CRTDEFS_H=0
+ fi
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+
+
+
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
+printf %s "checking absolute name of <wctype.h>... " >&6; }
+if test ${gl_cv_next_wctype_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_wctype_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wctype.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'wctype.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_wctype_h
+ gl_cv_next_wctype_h='"'$gl_header'"'
+ else
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
+printf "%s\n" "$gl_cv_next_wctype_h" >&6; }
+ fi
+ NEXT_WCTYPE_H=$gl_cv_next_wctype_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'wctype.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_wctype_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
+printf %s "checking whether iswcntrl works... " >&6; }
+if test ${gl_cv_func_iswcntrl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works="guessing yes"
+else $as_nop
+ gl_cv_func_iswcntrl_works="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works=yes
+else $as_nop
+ gl_cv_func_iswcntrl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
+printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; }
+ fi
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+
+
+ if test $GNULIB_OVERRIDES_WINT_T = 1; then
+ REPLACE_ISWCNTRL=1
+ else
+ case "$gl_cv_func_iswcntrl_works" in
+ *yes) REPLACE_ISWCNTRL=0 ;;
+ *) REPLACE_ISWCNTRL=1 ;;
+ esac
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ fi
+
+ if test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_TOWLOWER=1
+ else
+ ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
+if test "x$ac_cv_func_towlower" = xyes
+then :
+ printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_towlower = yes; then
+ REPLACE_TOWLOWER=0
+ else
+ ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+
+"
+if test "x$ac_cv_have_decl_towlower" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_towlower = yes; then
+ REPLACE_TOWLOWER=1
+ else
+ REPLACE_TOWLOWER=0
+ fi
+ fi
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+ :
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
+printf %s "checking for wctype_t... " >&6; }
+if test ${gl_cv_type_wctype_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ wctype_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctype_t=yes
+else $as_nop
+ gl_cv_type_wctype_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
+printf "%s\n" "$gl_cv_type_wctype_t" >&6; }
+ if test $gl_cv_type_wctype_t = no; then
+ HAVE_WCTYPE_T=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
+printf %s "checking for wctrans_t... " >&6; }
+if test ${gl_cv_type_wctrans_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #include <wctype.h>
+ wctrans_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctrans_t=yes
+else $as_nop
+ gl_cv_type_wctrans_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
+printf "%s\n" "$gl_cv_type_wctrans_t" >&6; }
+ if test $gl_cv_type_wctrans_t = no; then
+ HAVE_WCTRANS_T=0
+ fi
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a traditional japanese locale" >&5
+printf %s "checking for a traditional japanese locale... " >&6; }
+if test ${gt_cv_locale_ja+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales
+ on Cygwin 1.5.x. */
+ if (MB_CUR_MAX == 1)
+ return 1;
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding (except on MirBSD). */
+ {
+ const char *p;
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ }
+ return 0;
+#endif
+}
+
+_ACEOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Note that on native Windows, the Japanese locale is
+ # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we
+ # cannot use it here.
+ gt_cv_locale_ja=none
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the AIX locale name.
+ if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC-JP
+ else
+ # Test for the HP-UX, OSF/1, NetBSD locale name.
+ if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # Test for the IRIX, FreeBSD locale name.
+ if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja
+ else
+ # Special test for NetBSD 1.6.
+ if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # None found.
+ gt_cv_locale_ja=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_ja" >&5
+printf "%s\n" "$gt_cv_locale_ja" >&6; }
+ LOCALE_JA=$gt_cv_locale_ja
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a french Unicode locale" >&5
+printf %s "checking for a french Unicode locale... " >&6; }
+if test ${gt_cv_locale_fr_utf8+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if !(defined __BEOS__ || defined __HAIKU__)
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
+ two bytes long, with UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 4
+ || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
+ return 1;
+#endif
+#if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+#endif
+ return 0;
+}
+
+_ACEOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the hypothetical native Windows locale name.
+ if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=French_France.65001
+ else
+ # None found.
+ gt_cv_locale_fr_utf8=none
+ fi
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR.UTF-8
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr.UTF-8
+ else
+ # None found.
+ gt_cv_locale_fr_utf8=none
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_fr_utf8" >&5
+printf "%s\n" "$gt_cv_locale_fr_utf8" >&6; }
+ LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a transitional chinese locale" >&5
+printf %s "checking for a transitional chinese locale... " >&6; }
+if test ${gt_cv_locale_zh_CN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding (except on MirBSD). */
+ {
+ const char *p;
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ }
+ /* Check whether a typical GB18030 multibyte sequence is recognized as a
+ single wide character. This excludes the GB2312 and GBK encodings. */
+ if (mblen ("\203\062\332\066", 5) != 4)
+ return 1;
+ return 0;
+#endif
+}
+
+_ACEOF
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the hypothetical native Windows locale name.
+ if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=Chinese_China.54936
+ else
+ # None found.
+ gt_cv_locale_zh_CN=none
+ fi
+ ;;
+ solaris2.8)
+ # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are
+ # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK.
+ # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core.
+ gt_cv_locale_zh_CN=none
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the locale name without encoding suffix.
+ if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN.GB18030
+ else
+ # None found.
+ gt_cv_locale_zh_CN=none
+ fi
+ fi
+ ;;
+ esac
+ else
+ # If there was a link error, due to mblen(), the system is so old that
+ # it certainly doesn't have a chinese locale.
+ gt_cv_locale_zh_CN=none
+ fi
+ rm -fr conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_locale_zh_CN" >&5
+printf "%s\n" "$gt_cv_locale_zh_CN" >&6; }
+ LOCALE_ZH_CN=$gt_cv_locale_zh_CN
+
+
+
+ GNULIB_NL_LANGINFO=0;
+ HAVE_NL_LANGINFO=1;
+ REPLACE_NL_LANGINFO=0;
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether included libunistring is requested" >&5
+printf %s "checking whether included libunistring is requested... " >&6; }
+
+# Check whether --with-included-libunistring was given.
+if test ${with_included_libunistring+y}
+then :
+ withval=$with_included_libunistring; gl_libunistring_force_included=$withval
+else $as_nop
+ gl_libunistring_force_included=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_libunistring_force_included" >&5
+printf "%s\n" "$gl_libunistring_force_included" >&6; }
+ gl_libunistring_use_included="$gl_libunistring_force_included"
+ if test "$gl_libunistring_use_included" = yes; then
+ if test -z "$HAVE_LIBUNISTRING"; then
+ HAVE_LIBUNISTRING=no
+ fi
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ else
+
+
+ if test -n "$LIBICONV"; then
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libunistring-prefix was given.
+if test ${with_libunistring_prefix+y}
+then :
+ withval=$with_libunistring_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ INCUNISTRING=
+ LIBUNISTRING_PREFIX=
+ HAVE_LIBUNISTRING=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='unistring '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_a"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_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" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCUNISTRING="${INCUNISTRING}${INCUNISTRING:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$dep"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCUNISTRING; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunistring" >&5
+printf %s "checking for libunistring... " >&6; }
+if test ${ac_cv_libunistring+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ case " $LIBUNISTRING" in
+ *" -l"*) LIBS="$LIBS $LIBUNISTRING" ;;
+ *) LIBS="$LIBUNISTRING $LIBS" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <uniconv.h>
+int
+main (void)
+{
+u8_strconv_from_locale((char*)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_libunistring=yes
+else $as_nop
+ ac_cv_libunistring='no, trying again together with libiconv'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libunistring" >&5
+printf "%s\n" "$ac_cv_libunistring" >&6; }
+ if test "$ac_cv_libunistring" = yes; then
+ HAVE_LIBUNISTRING=yes
+
+printf "%s\n" "#define HAVE_LIBUNISTRING 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libunistring" >&5
+printf %s "checking how to link with libunistring... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBUNISTRING" >&5
+printf "%s\n" "$LIBUNISTRING" >&6; }
+ else
+ HAVE_LIBUNISTRING=no
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ LIBUNISTRING_PREFIX=
+ fi
+
+
+
+
+
+
+
+ if test "$ac_cv_libunistring" != yes; then
+ unset ac_cv_libunistring
+ glus_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libunistring-prefix was given.
+if test ${with_libunistring_prefix+y}
+then :
+ withval=$with_libunistring_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ INCUNISTRING=
+ LIBUNISTRING_PREFIX=
+ HAVE_LIBUNISTRING=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='unistring '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_a"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_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" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCUNISTRING="${INCUNISTRING}${INCUNISTRING:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$dep"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCUNISTRING; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunistring" >&5
+printf %s "checking for libunistring... " >&6; }
+if test ${ac_cv_libunistring+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ case " $LIBUNISTRING" in
+ *" -l"*) LIBS="$LIBS $LIBUNISTRING" ;;
+ *) LIBS="$LIBUNISTRING $LIBS" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <uniconv.h>
+int
+main (void)
+{
+u8_strconv_from_locale((char*)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_libunistring=yes
+else $as_nop
+ ac_cv_libunistring='no, consider installing GNU libunistring'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libunistring" >&5
+printf "%s\n" "$ac_cv_libunistring" >&6; }
+ if test "$ac_cv_libunistring" = yes; then
+ HAVE_LIBUNISTRING=yes
+
+printf "%s\n" "#define HAVE_LIBUNISTRING 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libunistring" >&5
+printf %s "checking how to link with libunistring... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBUNISTRING" >&5
+printf "%s\n" "$LIBUNISTRING" >&6; }
+ else
+ HAVE_LIBUNISTRING=no
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ LIBUNISTRING_PREFIX=
+ fi
+
+
+
+
+
+
+
+ if test -n "$LIBUNISTRING"; then
+ LIBUNISTRING="$LIBUNISTRING $LIBICONV"
+ LTLIBUNISTRING="$LTLIBUNISTRING $LTLIBICONV"
+ fi
+ LIBS="$glus_save_LIBS"
+ fi
+ else
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libunistring-prefix was given.
+if test ${with_libunistring_prefix+y}
+then :
+ withval=$with_libunistring_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ INCUNISTRING=
+ LIBUNISTRING_PREFIX=
+ HAVE_LIBUNISTRING=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='unistring '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_so"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$found_a"
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_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" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'unistring'; then
+ LIBUNISTRING_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCUNISTRING="${INCUNISTRING}${INCUNISTRING:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBUNISTRING; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$dep"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }-l$name"
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBUNISTRING="${LIBUNISTRING}${LIBUNISTRING:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBUNISTRING="${LTLIBUNISTRING}${LTLIBUNISTRING:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCUNISTRING; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunistring" >&5
+printf %s "checking for libunistring... " >&6; }
+if test ${ac_cv_libunistring+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ case " $LIBUNISTRING" in
+ *" -l"*) LIBS="$LIBS $LIBUNISTRING" ;;
+ *) LIBS="$LIBUNISTRING $LIBS" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <uniconv.h>
+int
+main (void)
+{
+u8_strconv_from_locale((char*)0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_libunistring=yes
+else $as_nop
+ ac_cv_libunistring='no, consider installing GNU libunistring'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libunistring" >&5
+printf "%s\n" "$ac_cv_libunistring" >&6; }
+ if test "$ac_cv_libunistring" = yes; then
+ HAVE_LIBUNISTRING=yes
+
+printf "%s\n" "#define HAVE_LIBUNISTRING 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libunistring" >&5
+printf %s "checking how to link with libunistring... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBUNISTRING" >&5
+printf "%s\n" "$LIBUNISTRING" >&6; }
+ else
+ HAVE_LIBUNISTRING=no
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ LIBUNISTRING_PREFIX=
+ fi
+
+
+
+
+
+
+
+ fi
+ if test $HAVE_LIBUNISTRING = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libunistring version" >&5
+printf %s "checking for libunistring version... " >&6; }
+if test ${gl_cv_libunistring_version+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "_LIBUNISTRING_VERSION" "gl_libunistring_hexversion" "#include <unistring/version.h>"
+then :
+
+fi
+
+ if test $gl_libunistring_hexversion = 9; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistring/cdefs.h>
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_libunistring_version092=true
+else $as_nop
+ gl_cv_libunistring_version092=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if $gl_cv_libunistring_version092; then
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistr.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'unistr.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_unistr_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ if test -n "$gl_cv_absolute_unistr_h" \
+ && grep 'Copy no more than N units of SRC to DEST. Return a pointer' $gl_cv_absolute_unistr_h > /dev/null; then
+ gl_libunistring_hexversion=2307
+ else
+ gl_libunistring_hexversion=2306
+ fi
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unicase.h>
+ casing_suffix_context_t ct;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_libunistring_version091=true
+else $as_nop
+ gl_cv_libunistring_version091=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if $gl_cv_libunistring_version091; then
+ gl_libunistring_hexversion=2305
+ else
+ gl_libunistring_hexversion=2304
+ fi
+ fi
+ fi
+ gl_libunistring_major=`expr $gl_libunistring_hexversion / 65536`
+ gl_libunistring_minor=`expr $gl_libunistring_hexversion / 256 % 256`
+ gl_libunistring_subminor=`expr $gl_libunistring_hexversion % 256`
+ gl_cv_libunistring_version="$gl_libunistring_major.$gl_libunistring_minor.$gl_libunistring_subminor"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_libunistring_version" >&5
+printf "%s\n" "$gl_cv_libunistring_version" >&6; }
+ LIBUNISTRING_VERSION="$gl_cv_libunistring_version"
+ fi
+
+ if test $HAVE_LIBUNISTRING = no; then
+ gl_libunistring_use_included=yes
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ fi
+ fi
+
+
+
+
+ GNULIB_LOCALECONV=0;
+ GNULIB_SETLOCALE=0;
+ GNULIB_SETLOCALE_NULL=0;
+ GNULIB_DUPLOCALE=0;
+ GNULIB_LOCALENAME=0;
+ HAVE_NEWLOCALE=1;
+ HAVE_DUPLOCALE=1;
+ HAVE_FREELOCALE=1;
+ REPLACE_LOCALECONV=0;
+ REPLACE_SETLOCALE=0;
+ REPLACE_NEWLOCALE=0;
+ REPLACE_DUPLOCALE=0;
+ REPLACE_FREELOCALE=0;
+ REPLACE_STRUCT_LCONV=0;
+
+
+ REPLACE_NULL=0;
+ HAVE_MAX_ALIGN_T=1;
+ HAVE_WCHAR_T=1;
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
+printf %s "checking for wchar_t... " >&6; }
+if test ${gt_cv_c_wchar_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_wchar_t=yes
+else $as_nop
+ gt_cv_c_wchar_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
+printf "%s\n" "$gt_cv_c_wchar_t" >&6; }
+ if test $gt_cv_c_wchar_t = yes; then
+
+printf "%s\n" "#define HAVE_WCHAR_T 1" >>confdefs.h
+
+ fi
+
+
+
+
+ STDDEF_H=
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
+printf %s "checking for good max_align_t... " >&6; }
+if test ${gl_cv_type_max_align_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ unsigned int s = sizeof (max_align_t);
+ #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+ int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_max_align_t=yes
+else $as_nop
+ gl_cv_type_max_align_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
+printf "%s\n" "$gl_cv_type_max_align_t" >&6; }
+ if test $gl_cv_type_max_align_t = no; then
+ HAVE_MAX_ALIGN_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
+printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; }
+if test ${gl_cv_decl_null_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_decl_null_works=yes
+else $as_nop
+ gl_cv_decl_null_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
+printf "%s\n" "$gl_cv_decl_null_works" >&6; }
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ STDDEF_H=stddef.h
+ fi
+
+
+ if test -n "$STDDEF_H"; then
+ GL_GENERATE_STDDEF_H_TRUE=
+ GL_GENERATE_STDDEF_H_FALSE='#'
+else
+ GL_GENERATE_STDDEF_H_TRUE='#'
+ GL_GENERATE_STDDEF_H_FALSE=
+fi
+
+ if test -n "$STDDEF_H"; then
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stddef_h='<'stddef.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
+printf %s "checking absolute name of <stddef.h>... " >&6; }
+if test ${gl_cv_next_stddef_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stddef.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stddef_h
+ gl_cv_next_stddef_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
+printf "%s\n" "$gl_cv_next_stddef_h" >&6; }
+ fi
+ NEXT_STDDEF_H=$gl_cv_next_stddef_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stddef.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stddef_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
+
+
+
+
+ fi
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h defines locale_t" >&5
+printf %s "checking whether locale.h defines locale_t... " >&6; }
+if test ${gl_cv_header_locale_has_locale_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <locale.h>
+ locale_t x;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_locale_has_locale_t=yes
+else $as_nop
+ gl_cv_header_locale_has_locale_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_has_locale_t" >&5
+printf "%s\n" "$gl_cv_header_locale_has_locale_t" >&6; }
+
+
+ if test $ac_cv_header_xlocale_h = yes; then
+ HAVE_XLOCALE_H=1
+ if test $gl_cv_header_locale_has_locale_t = yes; then
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ else
+ gl_cv_header_locale_h_needs_xlocale_h=yes
+ fi
+ HAVE_LOCALE_T=1
+ else
+ HAVE_XLOCALE_H=0
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ if test $gl_cv_header_locale_has_locale_t = yes; then
+ HAVE_LOCALE_T=1
+ else
+ HAVE_LOCALE_T=0
+ fi
+ fi
+
+
+
+
+ gl_threads_api=none
+ LIBTHREAD=
+ LTLIBTHREAD=
+ LIBMULTITHREAD=
+ LTLIBMULTITHREAD=
+ if test "$gl_use_threads" != no; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_have_weak=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $gl_cv_have_weak = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_have_weak="guessing yes"
+else $as_nop
+ gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+ return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_have_weak=yes
+else $as_nop
+ gl_cv_have_weak=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
+ case " $LDFLAGS " in
+ *" -static "*) gl_cv_have_weak=no ;;
+ esac
+ case "$gl_cv_have_weak" in
+ *yes)
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ : > conftest1.c
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+ cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+ return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+ || gl_cv_have_weak=no
+ rm -f conftest1.c libempty.so conftest2.c conftest
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+ case "$gl_cv_have_weak" in
+ *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+ ;;
+ esac
+
+ if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+
+ :
+ fi
+ if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
+
+ gl_have_isoc_threads="$ac_cv_header_threads_h"
+ fi
+ if test "$gl_use_threads" = yes \
+ || test "$gl_use_threads" = posix \
+ || test "$gl_use_threads" = isoc+posix; then
+
+
+ if test -z "$gl_pthreadlib_body_done"; then
+ gl_pthread_api=no
+ LIBPTHREAD=
+ LIBPMULTITHREAD=
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+ gl_have_pthread_h=yes
+else $as_nop
+ gl_have_pthread_h=no
+fi
+
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ #
+ # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+ # needs -pthread for some reason. See:
+ # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+ save_LIBS=$LIBS
+ for gl_pthread in '' '-pthread'; do
+ LIBS="$LIBS $gl_pthread"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+ pthread_mutex_t m;
+ pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+ pthread_mutexattr_init (&ma);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=$gl_pthread
+ LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$save_LIBS
+ test $gl_pthread_api = yes && break
+ done
+
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ LIBPMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ # On Solaris 10 or newer, this test is no longer needed, because
+ # libc contains the fully functional pthread functions.
+ case "$host_os" in
+ solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+ esac
+
+fi
+
+ elif test $gl_pthread_api != yes; then
+ # Some library is needed. Try libpthread and libc_r.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lpthread
+ LIBPMULTITHREAD=-lpthread
+fi
+
+ if test $gl_pthread_api != yes; then
+ # For FreeBSD 4.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lc_r
+ LIBPMULTITHREAD=-lc_r
+fi
+
+ fi
+ fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+ if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+ fi
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ LIB_SCHED_YIELD=
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+ ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lrt
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4 $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. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+ ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+ gl_pthreadlib_body_done=done
+ fi
+
+ LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
+ LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
+ if test $gl_pthread_api = yes; then
+ if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
+ gl_threads_api='isoc+posix'
+
+printf "%s\n" "#define USE_ISOC_AND_POSIX_THREADS 1" >>confdefs.h
+
+ LIBTHREAD= LTLIBTHREAD=
+ else
+ gl_threads_api=posix
+
+printf "%s\n" "#define USE_POSIX_THREADS 1" >>confdefs.h
+
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+
+printf "%s\n" "#define USE_POSIX_THREADS_WEAK 1" >>confdefs.h
+
+ LIBTHREAD= LTLIBTHREAD=
+ else
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+ fi
+ ;;
+ esac
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $gl_threads_api = none; then
+ if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
+
+
+
+ if test -z "$gl_stdthreadlib_body_done"; then
+
+
+ case "$host_os" in
+ mingw*)
+ LIBSTDTHREAD=
+ ;;
+ *)
+
+
+ if test -z "$gl_pthreadlib_body_done"; then
+ gl_pthread_api=no
+ LIBPTHREAD=
+ LIBPMULTITHREAD=
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
+ gl_have_pthread_h=yes
+else $as_nop
+ gl_have_pthread_h=no
+fi
+
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ #
+ # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+ # needs -pthread for some reason. See:
+ # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+ save_LIBS=$LIBS
+ for gl_pthread in '' '-pthread'; do
+ LIBS="$LIBS $gl_pthread"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+ pthread_mutex_t m;
+ pthread_mutexattr_t ma;
+
+int
+main (void)
+{
+pthread_mutex_lock (&m);
+ pthread_mutexattr_init (&ma);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=$gl_pthread
+ LIBPMULTITHREAD=$gl_pthread
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS=$save_LIBS
+ test $gl_pthread_api = yes && break
+ done
+
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ LIBPMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ # On Solaris 10 or newer, this test is no longer needed, because
+ # libc contains the fully functional pthread functions.
+ case "$host_os" in
+ solaris | solaris2.1-9 | solaris2.1-9.* | hpux*)
+
+printf "%s\n" "#define PTHREAD_IN_USE_DETECTION_HARD 1" >>confdefs.h
+
+ esac
+
+fi
+
+ elif test $gl_pthread_api != yes; then
+ # Some library is needed. Try libpthread and libc_r.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lpthread" >&5
+printf %s "checking for pthread_kill in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pthread_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_pthread_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_kill" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lpthread
+ LIBPMULTITHREAD=-lpthread
+fi
+
+ if test $gl_pthread_api != yes; then
+ # For FreeBSD 4.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_kill in -lc_r" >&5
+printf %s "checking for pthread_kill in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_kill+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r $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. */
+char pthread_kill ();
+int
+main (void)
+{
+return pthread_kill ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_c_r_pthread_kill=yes
+else $as_nop
+ ac_cv_lib_c_r_pthread_kill=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_kill" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_kill" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_kill" = xyes
+then :
+ gl_pthread_api=yes
+ LIBPTHREAD=-lc_r
+ LIBPMULTITHREAD=-lc_r
+fi
+
+ fi
+ fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether POSIX threads API is available" >&5
+printf %s "checking whether POSIX threads API is available... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_pthread_api" >&5
+printf "%s\n" "$gl_pthread_api" >&6; }
+
+
+ if test $gl_pthread_api = yes; then
+
+printf "%s\n" "#define HAVE_PTHREAD_API 1" >>confdefs.h
+
+ fi
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sched.h>
+int
+main (void)
+{
+sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ LIB_SCHED_YIELD=
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5
+printf %s "checking for sched_yield in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_rt_sched_yield=yes
+else $as_nop
+ ac_cv_lib_rt_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_rt_sched_yield" >&6; }
+if test "x$ac_cv_lib_rt_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lrt
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lposix4" >&5
+printf %s "checking for sched_yield in -lposix4... " >&6; }
+if test ${ac_cv_lib_posix4_sched_yield+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix4 $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. */
+char sched_yield ();
+int
+main (void)
+{
+return sched_yield ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_posix4_sched_yield=yes
+else $as_nop
+ ac_cv_lib_posix4_sched_yield=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix4_sched_yield" >&5
+printf "%s\n" "$ac_cv_lib_posix4_sched_yield" >&6; }
+if test "x$ac_cv_lib_posix4_sched_yield" = xyes
+then :
+ LIB_SCHED_YIELD=-lposix4
+fi
+
+fi
+
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+ gl_pthreadlib_body_done=done
+ fi
+
+ if test $ac_cv_header_threads_h = yes; then
+ ac_fn_c_check_func "$LINENO" "thrd_create" "ac_cv_func_thrd_create"
+if test "x$ac_cv_func_thrd_create" = xyes
+then :
+ printf "%s\n" "#define HAVE_THRD_CREATE 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_thrd_create = yes; then
+ LIBSTDTHREAD=
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thrd_create in -lstdthreads" >&5
+printf %s "checking for thrd_create in -lstdthreads... " >&6; }
+if test ${ac_cv_lib_stdthreads_thrd_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lstdthreads $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. */
+char thrd_create ();
+int
+main (void)
+{
+return thrd_create ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_stdthreads_thrd_create=yes
+else $as_nop
+ ac_cv_lib_stdthreads_thrd_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_stdthreads_thrd_create" >&5
+printf "%s\n" "$ac_cv_lib_stdthreads_thrd_create" >&6; }
+if test "x$ac_cv_lib_stdthreads_thrd_create" = xyes
+then :
+
+ LIBSTDTHREAD='-lstdthreads -lpthread'
+
+else $as_nop
+
+ LIBSTDTHREAD="$LIBPMULTITHREAD"
+
+fi
+
+ fi
+ else
+ LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
+ fi
+ ;;
+ esac
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ISO C threads API is available" >&5
+printf %s "checking whether ISO C threads API is available... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_threads_h" >&5
+printf "%s\n" "$ac_cv_header_threads_h" >&6; }
+ gl_stdthreadlib_body_done=done
+ fi
+
+ LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
+ LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
+ gl_threads_api=isoc
+
+printf "%s\n" "#define USE_ISOC_THREADS 1" >>confdefs.h
+
+ fi
+ fi
+ if test $gl_threads_api = none; then
+ case "$gl_use_threads" in
+ yes | windows | win32) # The 'win32' is for backward compatibility.
+ if { case "$host_os" in
+ mingw*) true;;
+ *) false;;
+ esac
+ }; then
+ gl_threads_api=windows
+
+printf "%s\n" "#define USE_WINDOWS_THREADS 1" >>confdefs.h
+
+ fi
+ ;;
+ esac
+ fi
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for multithread API to use" >&5
+printf %s "checking for multithread API to use... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_threads_api" >&5
+printf "%s\n" "$gl_threads_api" >&6; }
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5
+printf %s "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; }
+if test ${gl_cv_func_malloc_posix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#if defined _WIN32 && ! defined __CYGWIN__
+ choke me
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_malloc_posix=yes
+else $as_nop
+ gl_cv_func_malloc_posix=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5
+printf "%s\n" "$gl_cv_func_malloc_posix" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5
+printf %s "checking for GNU libc compatible malloc... " >&6; }
+if test ${ac_cv_func_malloc_0_nonnull+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on platforms where we know the result.
+ *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
+ | hpux* | solaris* | cygwin* | mingw*)
+ ac_cv_func_malloc_0_nonnull="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+int
+main (void)
+{
+char *p = malloc (0);
+ int result = !p;
+ free (p);
+ return result;
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_malloc_0_nonnull=yes
+else $as_nop
+ ac_cv_func_malloc_0_nonnull=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5
+printf "%s\n" "$ac_cv_func_malloc_0_nonnull" >&6; }
+ case "$ac_cv_func_malloc_0_nonnull" in
+ *yes)
+ gl_cv_func_malloc_0_nonnull=1
+ ;;
+ *)
+ gl_cv_func_malloc_0_nonnull=0
+ ;;
+ esac
+
+
+printf "%s\n" "#define MALLOC_0_IS_NONNULL $gl_cv_func_malloc_0_nonnull" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_EXPLICIT_BZERO=0;
+ GNULIB_FFSL=0;
+ GNULIB_FFSLL=0;
+ GNULIB_MEMCHR=0;
+ GNULIB_MEMMEM=0;
+ GNULIB_MEMPCPY=0;
+ GNULIB_MEMRCHR=0;
+ GNULIB_RAWMEMCHR=0;
+ GNULIB_STPCPY=0;
+ GNULIB_STPNCPY=0;
+ GNULIB_STRCHRNUL=0;
+ GNULIB_STRDUP=0;
+ GNULIB_STRNCAT=0;
+ GNULIB_STRNDUP=0;
+ GNULIB_STRNLEN=0;
+ GNULIB_STRPBRK=0;
+ GNULIB_STRSEP=0;
+ GNULIB_STRSTR=0;
+ GNULIB_STRCASESTR=0;
+ GNULIB_STRTOK_R=0;
+ GNULIB_MBSLEN=0;
+ GNULIB_MBSNLEN=0;
+ GNULIB_MBSCHR=0;
+ GNULIB_MBSRCHR=0;
+ GNULIB_MBSSTR=0;
+ GNULIB_MBSCASECMP=0;
+ GNULIB_MBSNCASECMP=0;
+ GNULIB_MBSPCASECMP=0;
+ GNULIB_MBSCASESTR=0;
+ GNULIB_MBSCSPN=0;
+ GNULIB_MBSPBRK=0;
+ GNULIB_MBSSPN=0;
+ GNULIB_MBSSEP=0;
+ GNULIB_MBSTOK_R=0;
+ GNULIB_STRERROR=0;
+ GNULIB_STRERROR_R=0;
+ GNULIB_STRERRORNAME_NP=0;
+ GNULIB_SIGABBREV_NP=0;
+ GNULIB_SIGDESCR_NP=0;
+ GNULIB_STRSIGNAL=0;
+ GNULIB_STRVERSCMP=0;
+ HAVE_MBSLEN=0;
+ GNULIB_MDA_MEMCCPY=1;
+ GNULIB_MDA_STRDUP=1;
+ HAVE_EXPLICIT_BZERO=1;
+ HAVE_FFSL=1;
+ HAVE_FFSLL=1;
+ HAVE_DECL_MEMMEM=1;
+ HAVE_MEMPCPY=1;
+ HAVE_DECL_MEMRCHR=1;
+ HAVE_RAWMEMCHR=1;
+ HAVE_STPCPY=1;
+ HAVE_STPNCPY=1;
+ HAVE_STRCHRNUL=1;
+ HAVE_DECL_STRDUP=1;
+ HAVE_DECL_STRNDUP=1;
+ HAVE_DECL_STRNLEN=1;
+ HAVE_STRPBRK=1;
+ HAVE_STRSEP=1;
+ HAVE_STRCASESTR=1;
+ HAVE_DECL_STRTOK_R=1;
+ HAVE_DECL_STRERROR_R=1;
+ HAVE_STRERRORNAME_NP=1;
+ HAVE_SIGABBREV_NP=1;
+ HAVE_SIGDESCR_NP=1;
+ HAVE_DECL_STRSIGNAL=1;
+ HAVE_STRVERSCMP=1;
+ REPLACE_MEMCHR=0;
+ REPLACE_MEMMEM=0;
+ REPLACE_STPNCPY=0;
+ REPLACE_STRCHRNUL=0;
+ REPLACE_STRDUP=0;
+ REPLACE_STRNCAT=0;
+ REPLACE_STRNDUP=0;
+ REPLACE_STRNLEN=0;
+ REPLACE_STRSTR=0;
+ REPLACE_STRCASESTR=0;
+ REPLACE_STRTOK_R=0;
+ REPLACE_STRERROR=0;
+ REPLACE_STRERROR_R=0;
+ REPLACE_STRERRORNAME_NP=0;
+ REPLACE_STRSIGNAL=0;
+ UNDEFINE_STRTOK_R=0;
+
+
+
+
+
+
+ # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+ # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+ # irrelevant for anonymous mappings.
+ ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap"
+if test "x$ac_cv_func_mmap" = xyes
+then :
+ gl_have_mmap=yes
+else $as_nop
+ gl_have_mmap=no
+fi
+
+
+ # Try to allow MAP_ANONYMOUS.
+ gl_have_mmap_anonymous=no
+ if test $gl_have_mmap = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAP_ANONYMOUS" >&5
+printf %s "checking for MAP_ANONYMOUS... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+ I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+ gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+ if test $gl_have_mmap_anonymous != yes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/mman.h>
+#ifdef MAP_ANON
+ I cannot identify this map
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "I cannot identify this map" >/dev/null 2>&1
+then :
+
+printf "%s\n" "#define MAP_ANONYMOUS MAP_ANON" >>confdefs.h
+
+ gl_have_mmap_anonymous=yes
+fi
+rm -rf conftest*
+
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_have_mmap_anonymous" >&5
+printf "%s\n" "$gl_have_mmap_anonymous" >&6; }
+ if test $gl_have_mmap_anonymous = yes; then
+
+printf "%s\n" "#define HAVE_MAP_ANONYMOUS 1" >>confdefs.h
+
+ fi
+ fi
+
+
+
+
+
+ # Detect platform-specific bugs in some versions of glibc:
+ # memchr should not dereference anything with length 0
+ # https://bugzilla.redhat.com/show_bug.cgi?id=499689
+ # memchr should not dereference overestimated length after a match
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+ # memchr should cast the second argument to 'unsigned char'.
+ # This bug exists in Android 4.3.
+ # Assume that memchr works on platforms that lack mprotect.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether memchr works" >&5
+printf %s "checking whether memchr works... " >&6; }
+if test ${gl_cv_func_memchr_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_memchr_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+
+int
+main (void)
+{
+
+ int result = 0;
+ char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
+#endif
+ if (fence)
+ {
+ /* Test against bugs on glibc systems. */
+ if (memchr (fence, 0, 0))
+ result |= 1;
+ strcpy (fence - 9, "12345678");
+ if (memchr (fence - 9, 0, 79) != fence - 1)
+ result |= 2;
+ if (memchr (fence - 1, 0, 3) != fence - 1)
+ result |= 4;
+ /* Test against bug on AIX 7.2. */
+ if (memchr (fence - 4, '6', 16) != fence - 4)
+ result |= 8;
+ }
+ /* Test against bug on Android 4.3. */
+ {
+ char input[3];
+ input[0] = 'a';
+ input[1] = 'b';
+ input[2] = 'c';
+ if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
+ result |= 16;
+ }
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_memchr_works=yes
+else $as_nop
+ gl_cv_func_memchr_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_memchr_works" >&5
+printf "%s\n" "$gl_cv_func_memchr_works" >&6; }
+ case "$gl_cv_func_memchr_works" in
+ *yes) ;;
+ *) REPLACE_MEMCHR=1 ;;
+ esac
+
+ac_fn_c_check_decl "$LINENO" "memrchr" "ac_cv_have_decl_memrchr" "$ac_includes_default"
+if test "x$ac_cv_have_decl_memrchr" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_MEMRCHR $ac_have_decl" >>confdefs.h
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <limits.h> defines MIN and MAX" >&5
+printf %s "checking whether <limits.h> defines MIN and MAX... " >&6; }
+if test ${gl_cv_minmax_in_limits_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ int x = MIN (42, 17);
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_minmax_in_limits_h=yes
+else $as_nop
+ gl_cv_minmax_in_limits_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_limits_h" >&5
+printf "%s\n" "$gl_cv_minmax_in_limits_h" >&6; }
+ if test $gl_cv_minmax_in_limits_h = yes; then
+
+printf "%s\n" "#define HAVE_MINMAX_IN_LIMITS_H 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/param.h> defines MIN and MAX" >&5
+printf %s "checking whether <sys/param.h> defines MIN and MAX... " >&6; }
+if test ${gl_cv_minmax_in_sys_param_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/param.h>
+ int x = MIN (42, 17);
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_minmax_in_sys_param_h=yes
+else $as_nop
+ gl_cv_minmax_in_sys_param_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_minmax_in_sys_param_h" >&5
+printf "%s\n" "$gl_cv_minmax_in_sys_param_h" >&6; }
+ if test $gl_cv_minmax_in_sys_param_h = yes; then
+
+printf "%s\n" "#define HAVE_MINMAX_IN_SYS_PARAM_H 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+
+
+ GNULIB_CTIME=0;
+ GNULIB_MKTIME=0;
+ GNULIB_LOCALTIME=0;
+ GNULIB_NANOSLEEP=0;
+ GNULIB_STRFTIME=0;
+ GNULIB_STRPTIME=0;
+ GNULIB_TIMEGM=0;
+ GNULIB_TIME_R=0;
+ GNULIB_TIME_RZ=0;
+ GNULIB_TZSET=0;
+ GNULIB_MDA_TZSET=1;
+ HAVE_DECL_LOCALTIME_R=1;
+ HAVE_NANOSLEEP=1;
+ HAVE_STRPTIME=1;
+ HAVE_TIMEGM=1;
+ HAVE_TIMEZONE_T=0;
+ REPLACE_CTIME=GNULIB_PORTCHECK;
+ REPLACE_LOCALTIME_R=GNULIB_PORTCHECK;
+ REPLACE_MKTIME=GNULIB_PORTCHECK;
+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK;
+ REPLACE_STRFTIME=GNULIB_PORTCHECK;
+ REPLACE_TIMEGM=GNULIB_PORTCHECK;
+ REPLACE_TZSET=GNULIB_PORTCHECK;
+
+ : ${GNULIB_GETTIMEOFDAY=0};
+ REPLACE_GMTIME=0;
+ REPLACE_LOCALTIME=0;
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether time_t is signed" >&5
+printf %s "checking whether time_t is signed... " >&6; }
+if test ${gl_cv_time_t_is_signed+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+ char time_t_signed[(time_t) -1 < 0 ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_time_t_is_signed=yes
+else $as_nop
+ gl_cv_time_t_is_signed=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_t_is_signed" >&5
+printf "%s\n" "$gl_cv_time_t_is_signed" >&6; }
+ if test $gl_cv_time_t_is_signed = yes; then
+
+printf "%s\n" "#define TIME_T_IS_SIGNED 1" >>confdefs.h
+
+ fi
+
+ac_fn_c_check_decl "$LINENO" "alarm" "ac_cv_have_decl_alarm" "$ac_includes_default"
+if test "x$ac_cv_have_decl_alarm" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_ALARM $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5
+printf %s "checking for working mktime... " >&6; }
+if test ${gl_cv_func_working_mktime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple Mac OS X platforms.
+ # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode.
+ # But we need a configuration result that is valid in both modes.
+ gl_cv_func_working_mktime="guessing no"
+ else
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_mktime="guessing no" ;;
+ *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Test program from Paul Eggert and Tony Leneis. */
+#include <limits.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_DECL_ALARM
+# include <signal.h>
+#endif
+
+
+
+$gl_mda_defines
+
+
+#ifndef TIME_T_IS_SIGNED
+# define TIME_T_IS_SIGNED 0
+#endif
+
+static time_t time_t_max;
+static time_t time_t_min;
+
+/* Values we'll use to set the TZ environment variable. */
+static char *tz_strings[] = {
+ (char *) 0, "TZ=GMT0", "TZ=JST-9",
+ "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
+};
+#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
+
+/* Return 0 if mktime fails to convert a date in the spring-forward gap.
+ Based on a problem report from Andreas Jaeger. */
+static int
+spring_forward_gap ()
+{
+ /* glibc (up to about 1998-10-07) failed this test. */
+ struct tm tm;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ tm.tm_year = 98;
+ tm.tm_mon = 3;
+ tm.tm_mday = 5;
+ tm.tm_hour = 2;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ return mktime (&tm) != (time_t) -1;
+}
+
+static int
+mktime_test1 (time_t now)
+{
+ struct tm *lt;
+ return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (time_t now)
+{
+ return (mktime_test1 (now)
+ && mktime_test1 ((time_t) (time_t_max - now))
+ && mktime_test1 ((time_t) (time_t_min + now)));
+}
+
+static int
+irix_6_4_bug ()
+{
+ /* Based on code from Ariel Faigon. */
+ struct tm tm;
+ tm.tm_year = 96;
+ tm.tm_mon = 3;
+ tm.tm_mday = 0;
+ tm.tm_hour = 0;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ mktime (&tm);
+ return tm.tm_mon == 2 && tm.tm_mday == 31;
+}
+
+static int
+bigtime_test (int j)
+{
+ struct tm tm;
+ time_t now;
+ tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
+ now = mktime (&tm);
+ if (now != (time_t) -1)
+ {
+ struct tm *lt = localtime (&now);
+ if (! (lt
+ && lt->tm_year == tm.tm_year
+ && lt->tm_mon == tm.tm_mon
+ && lt->tm_mday == tm.tm_mday
+ && lt->tm_hour == tm.tm_hour
+ && lt->tm_min == tm.tm_min
+ && lt->tm_sec == tm.tm_sec
+ && lt->tm_yday == tm.tm_yday
+ && lt->tm_wday == tm.tm_wday
+ && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
+ == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
+ return 0;
+ }
+ return 1;
+}
+
+static int
+year_2050_test ()
+{
+ /* The correct answer for 2050-02-01 00:00:00 in Pacific time,
+ ignoring leap seconds. */
+ unsigned long int answer = 2527315200UL;
+
+ struct tm tm;
+ time_t t;
+ tm.tm_year = 2050 - 1900;
+ tm.tm_mon = 2 - 1;
+ tm.tm_mday = 1;
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ t = mktime (&tm);
+
+ /* Check that the result is either a failure, or close enough
+ to the correct answer that we can assume the discrepancy is
+ due to leap seconds. */
+ return (t == (time_t) -1
+ || (0 < t && answer - 120 <= t && t <= answer + 120));
+}
+
+int
+main ()
+{
+ int result = 0;
+ time_t t, delta;
+ int i, j;
+ int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1;
+
+#if HAVE_DECL_ALARM
+ /* This test makes some buggy mktime implementations loop.
+ Give up after 60 seconds; a mktime slower than that
+ isn't worth using anyway. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (60);
+#endif
+
+ time_t_max = (! TIME_T_IS_SIGNED
+ ? (time_t) -1
+ : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1)
+ * 2 + 1));
+ time_t_min = (! TIME_T_IS_SIGNED
+ ? (time_t) 0
+ : time_t_signed_magnitude
+ ? ~ (time_t) 0
+ : ~ time_t_max);
+
+ delta = time_t_max / 997; /* a suitable prime number */
+ for (i = 0; i < N_STRINGS; i++)
+ {
+ if (tz_strings[i])
+ putenv (tz_strings[i]);
+
+ for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta)
+ if (! mktime_test (t))
+ result |= 1;
+ if ((result & 2) == 0
+ && ! (mktime_test ((time_t) 1)
+ && mktime_test ((time_t) (60 * 60))
+ && mktime_test ((time_t) (60 * 60 * 24))))
+ result |= 2;
+
+ for (j = 1; (result & 4) == 0; j <<= 1)
+ {
+ if (! bigtime_test (j))
+ result |= 4;
+ if (INT_MAX / 2 < j)
+ break;
+ }
+ if ((result & 8) == 0 && ! bigtime_test (INT_MAX))
+ result |= 8;
+ }
+ if (! irix_6_4_bug ())
+ result |= 16;
+ if (! spring_forward_gap ())
+ result |= 32;
+ if (! year_2050_test ())
+ result |= 64;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_working_mktime=yes
+else $as_nop
+ gl_cv_func_working_mktime=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mktime" >&5
+printf "%s\n" "$gl_cv_func_working_mktime" >&6; }
+
+
+
+
+
+ GNULIB_PSELECT=0;
+ GNULIB_SELECT=0;
+ HAVE_PSELECT=1;
+ REPLACE_PSELECT=0;
+ REPLACE_SELECT=0;
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/select.h> is self-contained" >&5
+printf %s "checking whether <sys/select.h> is self-contained... " >&6; }
+if test ${gl_cv_header_sys_select_h_selfcontained+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/select.h>
+int
+main (void)
+{
+struct timeval b;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_sys_select_h_selfcontained=yes
+else $as_nop
+ gl_cv_header_sys_select_h_selfcontained=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $gl_cv_header_sys_select_h_selfcontained = yes; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/select.h>
+int
+main (void)
+{
+int memset; int bzero;
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/select.h>
+int
+main (void)
+{
+
+ #undef memset
+ #define memset nonexistent_memset
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ void *memset (void *, int, unsigned long);
+ #undef bzero
+ #define bzero nonexistent_bzero
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ void bzero (void *, unsigned long);
+ fd_set fds;
+ FD_ZERO (&fds);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+ gl_cv_header_sys_select_h_selfcontained=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_sys_select_h_selfcontained" >&5
+printf "%s\n" "$gl_cv_header_sys_select_h_selfcontained" >&6; }
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_select_h='<'sys/select.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/select.h>" >&5
+printf %s "checking absolute name of <sys/select.h>... " >&6; }
+if test ${gl_cv_next_sys_select_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_select_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/select.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/select.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_select_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_select_h
+ gl_cv_next_sys_select_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_select_h='<'sys/select.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_select_h" >&5
+printf "%s\n" "$gl_cv_next_sys_select_h" >&6; }
+ fi
+ NEXT_SYS_SELECT_H=$gl_cv_next_sys_select_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/select.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_select_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_sys_select_h = yes; then
+ HAVE_SYS_SELECT_H=1
+ else
+ HAVE_SYS_SELECT_H=0
+ fi
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+ LIBSOCKET=
+ if test $HAVE_WINSOCK2_H = 1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for WSAStartup" >&5
+printf %s "checking for WSAStartup... " >&6; }
+if test ${gl_cv_func_wsastartup+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif
+int
+main (void)
+{
+
+ WORD wVersionRequested = MAKEWORD(1, 1);
+ WSADATA wsaData;
+ int err = WSAStartup(wVersionRequested, &wsaData);
+ WSACleanup ();
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_wsastartup=yes
+else $as_nop
+ gl_cv_func_wsastartup=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gl_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wsastartup" >&5
+printf "%s\n" "$gl_cv_func_wsastartup" >&6; }
+ if test "$gl_cv_func_wsastartup" = "yes"; then
+
+printf "%s\n" "#define WINDOWS_SOCKETS 1" >>confdefs.h
+
+ LIBSOCKET='-lws2_32'
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing setsockopt" >&5
+printf %s "checking for library containing setsockopt... " >&6; }
+if test ${gl_cv_lib_socket+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_lib_socket=
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();
+int
+main (void)
+{
+setsockopt();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+ gl_save_LIBS="$LIBS"
+ LIBS="$gl_save_LIBS -lsocket"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();
+int
+main (void)
+{
+setsockopt();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_lib_socket="-lsocket"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnetwork"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();
+int
+main (void)
+{
+setsockopt();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_lib_socket="-lnetwork"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnet"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();
+int
+main (void)
+{
+setsockopt();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_lib_socket="-lnet"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ fi
+ fi
+ LIBS="$gl_save_LIBS"
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test -z "$gl_cv_lib_socket"; then
+ gl_cv_lib_socket="none needed"
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_socket" >&5
+printf "%s\n" "$gl_cv_lib_socket" >&6; }
+ if test "$gl_cv_lib_socket" != "none needed"; then
+ LIBSOCKET="$gl_cv_lib_socket"
+ fi
+ fi
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ REPLACE_SELECT=1
+ else
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether select supports a 0 argument" >&5
+printf %s "checking whether select supports a 0 argument... " >&6; }
+if test ${gl_cv_func_select_supports0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no on Interix.
+ interix*) gl_cv_func_select_supports0="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_select_supports0="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+int main ()
+{
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_select_supports0=yes
+else $as_nop
+ gl_cv_func_select_supports0=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_supports0" >&5
+printf "%s\n" "$gl_cv_func_select_supports0" >&6; }
+ case "$gl_cv_func_select_supports0" in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether select detects invalid fds" >&5
+printf %s "checking whether select detects invalid fds... " >&6; }
+if test ${gl_cv_func_select_detects_ebadf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#include <unistd.h>
+#include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+
+ fd_set set;
+ dup2(0, 16);
+ FD_ZERO(&set);
+ FD_SET(16, &set);
+ close(16);
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_select_detects_ebadf=yes
+else $as_nop
+ gl_cv_func_select_detects_ebadf=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_detects_ebadf" >&5
+printf "%s\n" "$gl_cv_func_select_detects_ebadf" >&6; }
+ case $gl_cv_func_select_detects_ebadf in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+ fi
+
+ LIB_SELECT="$LIBSOCKET"
+ if test $REPLACE_SELECT = 1; then
+ case "$host_os" in
+ mingw*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+int
+main ()
+{
+ MsgWaitForMultipleObjects (0, NULL, 0, 0, 0);
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+ LIB_SELECT="$LIB_SELECT -luser32"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ;;
+ esac
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for O_CLOEXEC" >&5
+printf %s "checking for O_CLOEXEC... " >&6; }
+if test ${gl_cv_macro_O_CLOEXEC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fcntl.h>
+ #ifndef O_CLOEXEC
+ choke me;
+ #endif
+
+int
+main (void)
+{
+return O_CLOEXEC;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_macro_O_CLOEXEC=yes
+else $as_nop
+ gl_cv_macro_O_CLOEXEC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_macro_O_CLOEXEC" >&5
+printf "%s\n" "$gl_cv_macro_O_CLOEXEC" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for promoted mode_t type" >&5
+printf %s "checking for promoted mode_t type... " >&6; }
+if test ${gl_cv_promoted_mode_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main (void)
+{
+typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_promoted_mode_t='int'
+else $as_nop
+ gl_cv_promoted_mode_t='mode_t'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_promoted_mode_t" >&5
+printf "%s\n" "$gl_cv_promoted_mode_t" >&6; }
+
+printf "%s\n" "#define PROMOTED_MODE_T $gl_cv_promoted_mode_t" >>confdefs.h
+
+
+
+
+
+
+ GNULIB_POSIX_SPAWN=0;
+ GNULIB_POSIX_SPAWNP=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0;
+ GNULIB_POSIX_SPAWNATTR_INIT=0;
+ GNULIB_POSIX_SPAWNATTR_GETFLAGS=0;
+ GNULIB_POSIX_SPAWNATTR_SETFLAGS=0;
+ GNULIB_POSIX_SPAWNATTR_GETPGROUP=0;
+ GNULIB_POSIX_SPAWNATTR_SETPGROUP=0;
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0;
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0;
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0;
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0;
+ GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0;
+ GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0;
+ GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0;
+ GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0;
+ GNULIB_POSIX_SPAWNATTR_DESTROY=0;
+ HAVE_POSIX_SPAWN=1;
+ HAVE_POSIX_SPAWNATTR_T=1;
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;
+
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1;
+
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=1;
+
+ REPLACE_POSIX_SPAWN=0;
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
+
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
+
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
+
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
+
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
+
+
+
+
+
+ LIB_POSIX_SPAWN=
+
+ gl_saved_libs=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing posix_spawn" >&5
+printf %s "checking for library containing posix_spawn... " >&6; }
+if test ${ac_cv_search_posix_spawn+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char posix_spawn ();
+int
+main (void)
+{
+return posix_spawn ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' rt
+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_posix_spawn=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_posix_spawn+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_posix_spawn+y}
+then :
+
+else $as_nop
+ ac_cv_search_posix_spawn=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_posix_spawn" >&5
+printf "%s\n" "$ac_cv_search_posix_spawn" >&6; }
+ac_res=$ac_cv_search_posix_spawn
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ test "$ac_cv_search_posix_spawn" = "none required" ||
+ LIB_POSIX_SPAWN=$ac_cv_search_posix_spawn
+fi
+
+ ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn"
+if test "x$ac_cv_func_posix_spawn" = xyes
+then :
+ printf "%s\n" "#define HAVE_POSIX_SPAWN 1" >>confdefs.h
+
+fi
+
+ LIBS=$gl_saved_libs
+
+ if test $ac_cv_func_posix_spawn != yes; then
+ HAVE_POSIX_SPAWN=0
+ fi
+
+
+
+
+
+ if test $ac_cv_func_posix_spawn = yes; then
+
+ if test $ac_cv_func_posix_spawn_file_actions_addchdir_np = no; then
+ REPLACE_POSIX_SPAWN=1
+ fi
+
+
+ if test $REPLACE_POSIX_SPAWN = 0; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn works" >&5
+printf %s "checking whether posix_spawn works... " >&6; }
+if test ${gl_cv_func_posix_spawn_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $cross_compiling = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+$gl_mda_defines
+
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "/non/exist/ent"
+
+static int
+fd_safer (int fd)
+{
+ if (0 <= fd && fd <= 2)
+ {
+ int f = fd_safer (dup (fd));
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
+
+int
+main ()
+{
+ char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
+ int ofd[2];
+ sigset_t blocked_signals;
+ sigset_t fatal_signal_set;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ setvbuf (stdout, NULL, _IOFBF, 0);
+ puts ("This should be seen only once.");
+ if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
+ {
+ perror ("cannot create pipe");
+ exit (1);
+ }
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ sigemptyset (&fatal_signal_set);
+ sigaddset (&fatal_signal_set, SIGINT);
+ sigaddset (&fatal_signal_set, SIGTERM);
+ sigaddset (&fatal_signal_set, SIGHUP);
+ sigaddset (&fatal_signal_set, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
+ || (err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+ || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+ || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ if (err == ENOENT)
+ return 0;
+ else
+ {
+ errno = err;
+ perror ("subprocess failed");
+ exit (1);
+ }
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ close (ofd[0]);
+ close (ofd[1]);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ exit (1);
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 127)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ exit (1);
+ }
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext > conftest.out \
+ && echo 'This should be seen only once.' > conftest.ok \
+ && cmp conftest.out conftest.ok >/dev/null 2>&1; then
+ gl_cv_func_posix_spawn_works=yes
+ else
+ gl_cv_func_posix_spawn_works=no
+ fi
+else $as_nop
+ gl_cv_func_posix_spawn_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $gl_cv_func_posix_spawn_works = yes; then
+ if test "$cross_compiling" = yes
+then :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Test whether posix_spawn_file_actions_addopen supports filename arguments
+ that contain special characters such as '*'. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+
+$gl_mda_defines
+
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "conftest"
+#define DATA_FILENAME "conftest%=*#?"
+
+static int
+parent_main (void)
+{
+ FILE *fp;
+ char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ /* Create a data file with specific contents. */
+ fp = fopen (DATA_FILENAME, "wb");
+ if (fp == NULL)
+ {
+ perror ("cannot create data file");
+ return 1;
+ }
+ fwrite ("Halle Potta", 1, 11, fp);
+ if (fflush (fp) || fclose (fp))
+ {
+ perror ("cannot prepare data file");
+ return 2;
+ }
+
+ /* Avoid reading from our stdin, as it could block. */
+ freopen ("/dev/null", "rb", stdin);
+
+ /* Test whether posix_spawn_file_actions_addopen with this file name
+ actually works, but spawning a child that reads from this file. */
+ actions_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
+ || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ errno = err;
+ perror ("subprocess failed");
+ return 3;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ return 4;
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ return 5;
+ }
+ return 0;
+}
+
+static int
+child_main (void)
+{
+ char buf[1024];
+
+ /* See if reading from STDIN_FILENO yields the expected contents. */
+ if (fread (buf, 1, sizeof (buf), stdin) == 11
+ && memcmp (buf, "Halle Potta", 11) == 0)
+ return 0;
+ else
+ return 8;
+}
+
+static void
+cleanup_then_die (int sig)
+{
+ /* Clean up data file. */
+ unlink (DATA_FILENAME);
+
+ /* Re-raise the signal and die from it. */
+ signal (sig, SIG_DFL);
+ raise (sig);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int exitstatus;
+
+ if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
+ {
+ /* This is the parent process. */
+ signal (SIGINT, cleanup_then_die);
+ signal (SIGTERM, cleanup_then_die);
+ #ifdef SIGHUP
+ signal (SIGHUP, cleanup_then_die);
+ #endif
+
+ exitstatus = parent_main ();
+ }
+ else
+ {
+ /* This is the child process. */
+
+ exitstatus = child_main ();
+ }
+ unlink (DATA_FILENAME);
+ return exitstatus;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+
+else $as_nop
+ gl_cv_func_posix_spawn_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+ else
+ case "$host_os" in
+ aix*) gl_cv_func_posix_spawn_works="guessing no";;
+ *) gl_cv_func_posix_spawn_works="guessing yes";;
+ esac
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_works" >&6; }
+
+ case "$gl_cv_func_posix_spawn_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ fi
+ if test $REPLACE_POSIX_SPAWN = 0; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn rejects scripts without shebang" >&5
+printf %s "checking whether posix_spawn rejects scripts without shebang... " >&6; }
+if test ${gl_cv_func_posix_spawn_secure_exec+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo ':' > conftest.scr
+ chmod a+x conftest.scr
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on GNU/Hurd.
+ gnu*)
+ gl_cv_func_posix_spawn_secure_exec="guessing no" ;;
+ # Guess yes on all other platforms.
+ *)
+ gl_cv_func_posix_spawn_secure_exec="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+ #include <spawn.h>
+ #include <stddef.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ int
+ main ()
+ {
+ const char *prog_path = "./conftest.scr";
+ const char *prog_argv[2] = { prog_path, NULL };
+ const char *environment[2] = { "PATH=.", NULL };
+ pid_t child;
+ int status;
+ int err = posix_spawn (&child, prog_path, NULL, NULL,
+ (char **) prog_argv, (char **) environment);
+ if (err == ENOEXEC)
+ return 0;
+ if (err != 0)
+ return 1;
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ return 2;
+ if (WEXITSTATUS (status) != 127)
+ return 3;
+ return 0;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_posix_spawn_secure_exec=yes
+else $as_nop
+ gl_cv_func_posix_spawn_secure_exec=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.scr
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_secure_exec" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_secure_exec" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnp rejects scripts without shebang" >&5
+printf %s "checking whether posix_spawnp rejects scripts without shebang... " >&6; }
+if test ${gl_cv_func_posix_spawnp_secure_exec+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo ':' > conftest.scr
+ chmod a+x conftest.scr
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems (glibc >= 2.15 actually) except GNU/Hurd,
+ # musl libc, NetBSD.
+ *-gnu* | *-musl* | netbsd*)
+ gl_cv_func_posix_spawnp_secure_exec="guessing yes" ;;
+ # Guess no on GNU/Hurd, macOS, FreeBSD, OpenBSD, AIX, Solaris, Cygwin.
+ gnu* | darwin* | freebsd* | dragonfly* | openbsd* | aix* | solaris* | cygwin*)
+ gl_cv_func_posix_spawnp_secure_exec="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_posix_spawnp_secure_exec="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+ #include <spawn.h>
+ #include <stddef.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ int
+ main ()
+ {
+ const char *prog_path = "./conftest.scr";
+ const char *prog_argv[2] = { prog_path, NULL };
+ const char *environment[2] = { "PATH=.", NULL };
+ pid_t child;
+ int status;
+ int err = posix_spawnp (&child, prog_path, NULL, NULL,
+ (char **) prog_argv, (char **) environment);
+ if (err == ENOEXEC)
+ return 0;
+ if (err != 0)
+ return 1;
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ return 2;
+ if (WEXITSTATUS (status) != 127)
+ return 3;
+ return 0;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_posix_spawnp_secure_exec=yes
+else $as_nop
+ gl_cv_func_posix_spawnp_secure_exec=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.scr
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawnp_secure_exec" >&5
+printf "%s\n" "$gl_cv_func_posix_spawnp_secure_exec" >&6; }
+
+ case "$gl_cv_func_posix_spawn_secure_exec" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ case "$gl_cv_func_posix_spawnp_secure_exec" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ fi
+ if test $REPLACE_POSIX_SPAWN = 0; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedpolicy is supported" >&5
+printf %s "checking whether posix_spawnattr_setschedpolicy is supported... " >&6; }
+if test ${gl_cv_func_spawnattr_setschedpolicy+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDULER
+ POSIX scheduling supported
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "POSIX scheduling supported" >/dev/null 2>&1
+then :
+ gl_cv_func_spawnattr_setschedpolicy=yes
+else $as_nop
+ gl_cv_func_spawnattr_setschedpolicy=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedpolicy" >&5
+printf "%s\n" "$gl_cv_func_spawnattr_setschedpolicy" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawnattr_setschedparam is supported" >&5
+printf %s "checking whether posix_spawnattr_setschedparam is supported... " >&6; }
+if test ${gl_cv_func_spawnattr_setschedparam+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDPARAM
+ POSIX scheduling supported
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "POSIX scheduling supported" >/dev/null 2>&1
+then :
+ gl_cv_func_spawnattr_setschedparam=yes
+else $as_nop
+ gl_cv_func_spawnattr_setschedparam=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_spawnattr_setschedparam" >&5
+printf "%s\n" "$gl_cv_func_spawnattr_setschedparam" >&6; }
+ fi
+ fi
+ if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then
+
+printf "%s\n" "#define REPLACE_POSIX_SPAWN 1" >>confdefs.h
+
+ fi
+
+
+
+ GNULIB_PTHREAD_SIGMASK=0;
+ GNULIB_RAISE=0;
+ GNULIB_SIGNAL_H_SIGPIPE=0;
+ GNULIB_SIGPROCMASK=0;
+ GNULIB_SIGACTION=0;
+ HAVE_POSIX_SIGNALBLOCKING=1;
+ HAVE_PTHREAD_SIGMASK=1;
+ HAVE_RAISE=1;
+ HAVE_SIGSET_T=1;
+ HAVE_SIGINFO_T=1;
+ HAVE_SIGACTION=1;
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
+
+ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
+
+ HAVE_SIGHANDLER_T=1;
+ REPLACE_PTHREAD_SIGMASK=0;
+ REPLACE_RAISE=0;
+
+
+ ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "
+ #include <signal.h>
+ /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>. */
+ #include <sys/types.h>
+
+"
+if test "x$ac_cv_type_sigset_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIGSET_T 1" >>confdefs.h
+
+gl_cv_type_sigset_t=yes
+else $as_nop
+ gl_cv_type_sigset_t=no
+fi
+
+ if test $gl_cv_type_sigset_t != yes; then
+ HAVE_SIGSET_T=0
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIGPIPE" >&5
+printf %s "checking for SIGPIPE... " >&6; }
+if test ${gl_cv_header_signal_h_SIGPIPE+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <signal.h>
+#if !defined SIGPIPE
+booboo
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "booboo" >/dev/null 2>&1
+then :
+ gl_cv_header_signal_h_SIGPIPE=no
+else $as_nop
+ gl_cv_header_signal_h_SIGPIPE=yes
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_signal_h_SIGPIPE" >&5
+printf "%s\n" "$gl_cv_header_signal_h_SIGPIPE" >&6; }
+
+
+
+
+
+ GNULIB_SCHED_YIELD=0;
+ HAVE_SCHED_YIELD=1;
+ REPLACE_SCHED_YIELD=0;
+
+
+
+
+
+
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+MicrosoftCompiler
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "MicrosoftCompiler" >/dev/null 2>&1
+then :
+ rm -f conftest*
+ echo 'int dummy;' > conftest.c
+ { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null 2>&1
+ if test -f conftest.o; then
+ gl_asmext='s'
+ gl_c_asm_opt='-S'
+ else
+ gl_asmext='asm'
+ gl_c_asm_opt='-c -Fa'
+ fi
+ rm -f conftest*
+
+else $as_nop
+ gl_asmext='s'
+ gl_c_asm_opt='-S'
+
+fi
+rm -rf conftest*
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C symbols are prefixed with underscore at the linker level" >&5
+printf %s "checking whether C symbols are prefixed with underscore at the linker level... " >&6; }
+if test ${gl_cv_prog_as_underscore+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" int foo (void);
+#endif
+int foo(void) { return 0; }
+EOF
+ # Look for the assembly language name in the .s file.
+ { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null 2>&1
+ if LC_ALL=C $EGREP '(^|[^a-zA-Z0-9_])_foo([^a-zA-Z0-9_]|$)' conftest.$gl_asmext >/dev/null; then
+ gl_cv_prog_as_underscore=yes
+ else
+ gl_cv_prog_as_underscore=no
+ fi
+ rm -f conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_prog_as_underscore" >&5
+printf "%s\n" "$gl_cv_prog_as_underscore" >&6; }
+ if test $gl_cv_prog_as_underscore = yes; then
+ USER_LABEL_PREFIX=_
+ else
+ USER_LABEL_PREFIX=
+ fi
+
+printf "%s\n" "#define USER_LABEL_PREFIX $USER_LABEL_PREFIX" >>confdefs.h
+
+ ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf returns a byte count as in C99" >&5
+printf %s "checking whether snprintf returns a byte count as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_retval_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_snprintf_retval_c99="guessing yes"
+else $as_nop
+ gl_cv_func_snprintf_retval_c99="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+ return 1;
+ if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
+ return 2;
+ if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
+ return 3;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_retval_c99=yes
+else $as_nop
+ gl_cv_func_snprintf_retval_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_retval_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_retval_c99" >&6; }
+
+ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default"
+if test "x$ac_cv_have_decl_snprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_SNPRINTF $ac_have_decl" >>confdefs.h
+
+
+ac_fn_c_check_decl "$LINENO" "fcloseall" "ac_cv_have_decl_fcloseall" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fcloseall" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FCLOSEALL $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "ecvt" "ac_cv_have_decl_ecvt" "$ac_includes_default"
+if test "x$ac_cv_have_decl_ecvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_ECVT $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fcvt" "ac_cv_have_decl_fcvt" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fcvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FCVT $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "gcvt" "ac_cv_have_decl_gcvt" "$ac_includes_default"
+if test "x$ac_cv_have_decl_gcvt" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GCVT $ac_have_decl" >>confdefs.h
+
+
+ GNULIB_FFS=0;
+ HAVE_FFS=1;
+ HAVE_STRCASECMP=1;
+ HAVE_DECL_STRNCASECMP=1;
+
+ac_fn_c_check_decl "$LINENO" "strdup" "ac_cv_have_decl_strdup" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strdup" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRDUP $ac_have_decl" >>confdefs.h
+
+
+ REPLACE_STRERROR_0=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5
+printf %s "checking whether strerror(0) succeeds... " >&6; }
+if test ${gl_cv_func_strerror_0_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+ #include <errno.h>
+
+int
+main (void)
+{
+int result = 0;
+ char *str;
+ errno = 0;
+ str = strerror (0);
+ if (!*str) result |= 1;
+ if (errno) result |= 2;
+ if (strstr (str, "nknown") || strstr (str, "ndefined"))
+ result |= 4;
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strerror_0_works=yes
+else $as_nop
+ gl_cv_func_strerror_0_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_0_works" >&6; }
+ case "$gl_cv_func_strerror_0_works" in
+ *yes) ;;
+ *)
+ REPLACE_STRERROR_0=1
+
+printf "%s\n" "#define REPLACE_STRERROR_0 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_strerror_r = yes; then
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for strerror_r with POSIX signature" >&5
+printf %s "checking for strerror_r with POSIX signature... " >&6; }
+if test ${gl_cv_func_strerror_r_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+ int strerror_r (int, char *, size_t);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_strerror_r_posix_signature=yes
+else $as_nop
+ gl_cv_func_strerror_r_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_posix_signature" >&6; }
+ if test $gl_cv_func_strerror_r_posix_signature = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strerror_r works" >&5
+printf %s "checking whether strerror_r works... " >&6; }
+if test ${gl_cv_func_strerror_r_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no on AIX.
+ aix*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess no on HP-UX.
+ hpux*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess no on BSD variants.
+ *bsd*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_strerror_r_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <errno.h>
+ #include <string.h>
+
+int
+main (void)
+{
+int result = 0;
+ char buf[79];
+ if (strerror_r (EACCES, buf, 0) < 0)
+ result |= 1;
+ errno = 0;
+ if (strerror_r (EACCES, buf, sizeof buf) != 0)
+ result |= 2;
+ strcpy (buf, "Unknown");
+ if (strerror_r (0, buf, sizeof buf) != 0)
+ result |= 4;
+ if (errno)
+ result |= 8;
+ if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
+ result |= 0x10;
+ errno = 0;
+ *buf = 0;
+ if (strerror_r (-3, buf, sizeof buf) < 0)
+ result |= 0x20;
+ if (errno)
+ result |= 0x40;
+ if (!*buf)
+ result |= 0x80;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strerror_r_works=yes
+else $as_nop
+ gl_cv_func_strerror_r_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_works" >&6; }
+ else
+
+ if test $ac_cv_func___xpg_strerror_r = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __xpg_strerror_r works" >&5
+printf %s "checking whether __xpg_strerror_r works... " >&6; }
+if test ${gl_cv_func_strerror_r_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ gl_cv_func_strerror_r_works="$gl_cross_guess_normal"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <errno.h>
+ #include <string.h>
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ int __xpg_strerror_r(int, char *, size_t);
+
+int
+main (void)
+{
+int result = 0;
+ char buf[256] = "^";
+ char copy[256];
+ char *str = strerror (-1);
+ strcpy (copy, str);
+ if (__xpg_strerror_r (-2, buf, 1) == 0)
+ result |= 1;
+ if (*buf)
+ result |= 2;
+ __xpg_strerror_r (-2, buf, 256);
+ if (strcmp (str, copy))
+ result |= 4;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strerror_r_works=yes
+else $as_nop
+ gl_cv_func_strerror_r_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_r_works" >&5
+printf "%s\n" "$gl_cv_func_strerror_r_works" >&6; }
+ fi
+ fi
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_string_h='<'string.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
+printf %s "checking absolute name of <string.h>... " >&6; }
+if test ${gl_cv_next_string_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'string.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_string_h
+ gl_cv_next_string_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
+printf "%s\n" "$gl_cv_next_string_h" >&6; }
+ fi
+ NEXT_STRING_H=$gl_cv_next_string_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'string.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_string_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_strings_h='<'strings.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <strings.h>" >&5
+printf %s "checking absolute name of <strings.h>... " >&6; }
+if test ${gl_cv_next_strings_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_strings_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <strings.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'strings.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_strings_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_strings_h
+ gl_cv_next_strings_h='"'$gl_header'"'
+ else
+ gl_cv_next_strings_h='<'strings.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_strings_h" >&5
+printf "%s\n" "$gl_cv_next_strings_h" >&6; }
+ fi
+ NEXT_STRINGS_H=$gl_cv_next_strings_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'strings.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_strings_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STRINGS_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_strings_h = yes; then
+ HAVE_STRINGS_H=1
+ else
+ HAVE_STRINGS_H=0
+ fi
+
+
+
+
+
+
+ac_fn_c_check_decl "$LINENO" "strndup" "ac_cv_have_decl_strndup" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strndup" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRNDUP $ac_have_decl" >>confdefs.h
+
+
+ac_fn_c_check_decl "$LINENO" "strnlen" "ac_cv_have_decl_strnlen" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strnlen" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRNLEN $ac_have_decl" >>confdefs.h
+
+
+
+ ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include <time.h>
+"
+if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes
+then :
+
+printf "%s\n" "#define HAVE_TM_GMTOFF 1" >>confdefs.h
+
+fi
+
+
+ac_fn_c_check_decl "$LINENO" "strtok_r" "ac_cv_have_decl_strtok_r" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strtok_r" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRTOK_R $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+
+ GNULIB_WAITPID=0;
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <time.h>" >&5
+printf %s "checking for struct timespec in <time.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_time_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timespec_in_time_h=yes
+else $as_nop
+ gl_cv_sys_struct_timespec_in_time_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_time_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_time_h" >&6; }
+
+ TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0
+ UNISTD_H_DEFINES_STRUCT_TIMESPEC=0
+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+ TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <sys/time.h>" >&5
+printf %s "checking for struct timespec in <sys/time.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_sys_time_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/time.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timespec_in_sys_time_h=yes
+else $as_nop
+ gl_cv_sys_struct_timespec_in_sys_time_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_sys_time_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_sys_time_h" >&6; }
+ if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <pthread.h>" >&5
+printf %s "checking for struct timespec in <pthread.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_pthread_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <pthread.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timespec_in_pthread_h=yes
+else $as_nop
+ gl_cv_sys_struct_timespec_in_pthread_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_pthread_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_pthread_h" >&6; }
+ if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then
+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct timespec in <unistd.h>" >&5
+printf %s "checking for struct timespec in <unistd.h>... " >&6; }
+if test ${gl_cv_sys_struct_timespec_in_unistd_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+int
+main (void)
+{
+static struct timespec x; x.tv_sec = x.tv_nsec;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_timespec_in_unistd_h=yes
+else $as_nop
+ gl_cv_sys_struct_timespec_in_unistd_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_timespec_in_unistd_h" >&5
+printf "%s\n" "$gl_cv_sys_struct_timespec_in_unistd_h" >&6; }
+ if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then
+ UNISTD_H_DEFINES_STRUCT_TIMESPEC=1
+ fi
+ fi
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_time_h='<'time.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <time.h>" >&5
+printf %s "checking absolute name of <time.h>... " >&6; }
+if test ${gl_cv_next_time_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <time.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'time.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_time_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_time_h
+ gl_cv_next_time_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_time_h" >&5
+printf "%s\n" "$gl_cv_next_time_h" >&6; }
+ fi
+ NEXT_TIME_H=$gl_cv_next_time_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'time.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_time_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_TIME_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+
+
+ if test "$HAVE_LIBUNISTRING" = yes; then
+ LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
+ LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ fi
+
+ac_fn_c_check_decl "$LINENO" "execvpe" "ac_cv_have_decl_execvpe" "$ac_includes_default"
+if test "x$ac_cv_have_decl_execvpe" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_EXECVPE $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "clearerr_unlocked" "ac_cv_have_decl_clearerr_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_clearerr_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_CLEARERR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "feof_unlocked" "ac_cv_have_decl_feof_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_feof_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FEOF_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "ferror_unlocked" "ac_cv_have_decl_ferror_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_ferror_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FERROR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fgets_unlocked" "ac_cv_have_decl_fgets_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fgets_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FGETS_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fputc_unlocked" "ac_cv_have_decl_fputc_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fputc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FPUTC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fread_unlocked" "ac_cv_have_decl_fread_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fread_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FREAD_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "fwrite_unlocked" "ac_cv_have_decl_fwrite_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_fwrite_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FWRITE_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "getchar_unlocked" "ac_cv_have_decl_getchar_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getchar_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETCHAR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+ac_fn_c_check_decl "$LINENO" "putchar_unlocked" "ac_cv_have_decl_putchar_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_putchar_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_PUTCHAR_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+ GNULIB_UTIME=0;
+ GNULIB_MDA_UTIME=1;
+ HAVE_UTIME=1;
+ REPLACE_UTIME=0;
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the utimes function works" >&5
+printf %s "checking whether the utimes function works... " >&6; }
+if test ${gl_cv_func_working_utimes+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_utimes="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_utimes="guessing no" ;;
+ *) gl_cv_func_working_utimes="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <utime.h>
+#include <errno.h>
+
+
+$gl_mda_defines
+
+
+static int
+inorder (time_t a, time_t b, time_t c)
+{
+ return a <= b && b <= c;
+}
+
+int
+main ()
+{
+ int result = 0;
+ char const *file = "conftest.utimes";
+ /* On OS/2, file timestamps must be on or after 1980 in local time,
+ with an even number of seconds. */
+ static struct timeval timeval[2] = {{315620000 + 10, 10},
+ {315620000 + 1000000, 999998}};
+
+ /* Test whether utimes() essentially works. */
+ {
+ struct stat sbuf;
+ FILE *f = fopen (file, "w");
+ if (f == NULL)
+ result |= 1;
+ else if (fclose (f) != 0)
+ result |= 1;
+ else if (utimes (file, timeval) != 0)
+ result |= 2;
+ else if (lstat (file, &sbuf) != 0)
+ result |= 1;
+ else if (!(sbuf.st_atime == timeval[0].tv_sec
+ && sbuf.st_mtime == timeval[1].tv_sec))
+ result |= 4;
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ /* Test whether utimes() with a NULL argument sets the file's timestamp
+ to the current time. Use 'fstat' as well as 'time' to
+ determine the "current" time, to accommodate NFS file systems
+ if there is a time skew between the host and the NFS server. */
+ {
+ int fd = open (file, O_WRONLY|O_CREAT, 0644);
+ if (fd < 0)
+ result |= 1;
+ else
+ {
+ time_t t0, t2;
+ struct stat st0, st1, st2;
+ if (time (&t0) == (time_t) -1)
+ result |= 1;
+ else if (fstat (fd, &st0) != 0)
+ result |= 1;
+ else if (utimes (file, timeval) != 0
+ && (errno != EACCES
+ /* OS/2 kLIBC utimes fails on opened files. */
+ || close (fd) != 0
+ || utimes (file, timeval) != 0
+ || (fd = open (file, O_WRONLY)) < 0))
+ result |= 2;
+ else if (utimes (file, NULL) != 0
+ && (errno != EACCES
+ /* OS/2 kLIBC utimes fails on opened files. */
+ || close (fd) != 0
+ || utimes (file, NULL) != 0
+ || (fd = open (file, O_WRONLY)) < 0))
+ result |= 8;
+ else if (fstat (fd, &st1) != 0)
+ result |= 1;
+ else if (write (fd, "\n", 1) != 1)
+ result |= 1;
+ else if (fstat (fd, &st2) != 0)
+ result |= 1;
+ else if (time (&t2) == (time_t) -1)
+ result |= 1;
+ else
+ {
+ int m_ok_POSIX = inorder (t0, st1.st_mtime, t2);
+ int m_ok_NFS = inorder (st0.st_mtime, st1.st_mtime, st2.st_mtime);
+ if (! (st1.st_atime == st1.st_mtime))
+ result |= 16;
+ if (! (m_ok_POSIX || m_ok_NFS))
+ result |= 32;
+ }
+ if (close (fd) != 0)
+ result |= 1;
+ }
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ /* Test whether utimes() with a NULL argument works on read-only files. */
+ {
+ int fd = open (file, O_WRONLY|O_CREAT, 0444);
+ if (fd < 0)
+ result |= 1;
+ else if (close (fd) != 0)
+ result |= 1;
+ else if (utimes (file, NULL) != 0)
+ result |= 64;
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ return result;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_working_utimes=yes
+else $as_nop
+ gl_cv_func_working_utimes=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_utimes" >&5
+printf "%s\n" "$gl_cv_func_working_utimes" >&6; }
+
+ case "$gl_cv_func_working_utimes" in
+ *yes)
+
+printf "%s\n" "#define HAVE_WORKING_UTIMES 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inttypes.h" >&5
+printf %s "checking for inttypes.h... " >&6; }
+if test ${gl_cv_header_inttypes_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_inttypes_h=yes
+else $as_nop
+ gl_cv_header_inttypes_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_inttypes_h" >&5
+printf "%s\n" "$gl_cv_header_inttypes_h" >&6; }
+ if test $gl_cv_header_inttypes_h = yes; then
+
+printf "%s\n" "#define HAVE_INTTYPES_H_WITH_UINTMAX 1" >>confdefs.h
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stdint.h" >&5
+printf %s "checking for stdint.h... " >&6; }
+if test ${gl_cv_header_stdint_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <stdint.h>
+int
+main (void)
+{
+uintmax_t i = (uintmax_t) -1; return !i;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_stdint_h=yes
+else $as_nop
+ gl_cv_header_stdint_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_h" >&5
+printf "%s\n" "$gl_cv_header_stdint_h" >&6; }
+ if test $gl_cv_header_stdint_h = yes; then
+
+printf "%s\n" "#define HAVE_STDINT_H_WITH_UINTMAX 1" >>confdefs.h
+
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for intmax_t" >&5
+printf %s "checking for intmax_t... " >&6; }
+if test ${gt_cv_c_intmax_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+
+int
+main (void)
+{
+intmax_t x = -1; return !x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_c_intmax_t=yes
+else $as_nop
+ gt_cv_c_intmax_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_intmax_t" >&5
+printf "%s\n" "$gt_cv_c_intmax_t" >&6; }
+ if test $gt_cv_c_intmax_t = yes; then
+
+printf "%s\n" "#define HAVE_INTMAX_T 1" >>confdefs.h
+
+ else
+
+printf "%s\n" "#define intmax_t long long" >>confdefs.h
+
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking where to find the exponent in a 'double'" >&5
+printf %s "checking where to find the exponent in a 'double'... " >&6; }
+if test ${gl_cv_cc_double_expbit0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined arm || defined __arm || defined __arm__
+ mixed_endianness
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "mixed_endianness" >/dev/null 2>&1
+then :
+ gl_cv_cc_double_expbit0="unknown"
+else $as_nop
+
+ :
+if test ${ac_cv_c_bigendian+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_c_bigendian=unknown
+ # See if we're dealing with a universal compiler.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+ # Check for potential -arch flags. It is not universal unless
+ # there are at least two -arch flags with different values.
+ ac_arch=
+ ac_prev=
+ for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+ if test -n "$ac_prev"; then
+ case $ac_word in
+ i?86 | x86_64 | ppc | ppc64)
+ if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+ ac_arch=$ac_word
+ else
+ ac_cv_c_bigendian=universal
+ break
+ fi
+ ;;
+ esac
+ ac_prev=
+ elif test "x$ac_word" = "x-arch"; then
+ ac_prev=arch
+ fi
+ done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if sys/param.h defines the BYTE_ORDER macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+ && LITTLE_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/param.h>
+
+int
+main (void)
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+ bogus endian macros
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ # It does; now see whether it defined to _BIG_ENDIAN or not.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+
+int
+main (void)
+{
+#ifndef _BIG_ENDIAN
+ not big endian
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_bigendian=yes
+else $as_nop
+ ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $ac_cv_c_bigendian = unknown; then
+ # Compile a test program.
+ if test "$cross_compiling" = yes
+then :
+ # Try to guess by grepping values from an object file.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+unsigned short int ascii_mm[] =
+ { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+ unsigned short int ascii_ii[] =
+ { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+ int use_ascii (int i) {
+ return ascii_mm[i] + ascii_ii[i];
+ }
+ unsigned short int ebcdic_ii[] =
+ { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+ unsigned short int ebcdic_mm[] =
+ { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+ int use_ebcdic (int i) {
+ return ebcdic_mm[i] + ebcdic_ii[i];
+ }
+ extern int foo;
+
+int
+main (void)
+{
+return use_ascii (foo) == use_ebcdic (foo);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+ ac_cv_c_bigendian=yes
+ fi
+ if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+ if test "$ac_cv_c_bigendian" = unknown; then
+ ac_cv_c_bigendian=no
+ else
+ # finding both strings is unlikely to happen, but who knows?
+ ac_cv_c_bigendian=unknown
+ fi
+ fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long int l;
+ char c[sizeof (long int)];
+ } u;
+ u.l = 1;
+ return u.c[sizeof (long int) - 1] == 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_c_bigendian=no
+else $as_nop
+ ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+fi
+:
+ case $ac_cv_c_bigendian in #(
+ yes)
+ gl_cv_cc_double_expbit0="word 0 bit 20";; #(
+ no)
+ gl_cv_cc_double_expbit0="word 1 bit 20" ;; #(
+ universal)
+
+printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+ ;; #(
+ *)
+ gl_cv_cc_double_expbit0="unknown" ;;
+ esac
+
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (double x)
+{
+ memory_double m;
+ size_t i;
+ /* Clear it first, in case sizeof (double) < sizeof (memory_double). */
+ memset (&m, 0, sizeof (memory_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25);
+ add_to_ored_words (0.5);
+ add_to_ored_words (1.0);
+ add_to_ored_words (2.0);
+ add_to_ored_words (4.0);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_cc_double_expbit0=`cat conftest.out`
+else $as_nop
+ gl_cv_cc_double_expbit0="unknown"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.out
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_double_expbit0" >&5
+printf "%s\n" "$gl_cv_cc_double_expbit0" >&6; }
+ case "$gl_cv_cc_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
+
+printf "%s\n" "#define DBL_EXPBIT0_WORD $word" >>confdefs.h
+
+
+printf "%s\n" "#define DBL_EXPBIT0_BIT $bit" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf truncates the result as in C99" >&5
+printf %s "checking whether snprintf truncates the result as in C99... " >&6; }
+if test ${gl_cv_func_snprintf_truncation_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ my_snprintf (buf, 3, "%d %d", 4567, 89);
+ if (memcmp (buf, "45\0DEF", 6) != 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_truncation_c99=yes
+else $as_nop
+ gl_cv_func_snprintf_truncation_c99=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_truncation_c99" >&5
+printf "%s\n" "$gl_cv_func_snprintf_truncation_c99" >&6; }
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen"
+if test "x$ac_cv_func_strnlen" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcslen" "ac_cv_func_wcslen"
+if test "x$ac_cv_func_wcslen" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcsnlen" "ac_cv_func_wcsnlen"
+if test "x$ac_cv_func_wcsnlen" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCSNLEN 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "mbrtowc" "ac_cv_func_mbrtowc"
+if test "x$ac_cv_func_mbrtowc" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBRTOWC 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcrtomb" "ac_cv_func_wcrtomb"
+if test "x$ac_cv_func_wcrtomb" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCRTOMB 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_decl "$LINENO" "_snprintf" "ac_cv_have_decl__snprintf" "#include <stdio.h>
+"
+if test "x$ac_cv_have_decl__snprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL__SNPRINTF $ac_have_decl" >>confdefs.h
+
+
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_RETVAL_C99 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+
+printf "%s\n" "#define HAVE_SNPRINTF_TRUNCATION_C99 1" >>confdefs.h
+
+ ;;
+ esac
+
+ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default"
+if test "x$ac_cv_have_decl_vsnprintf" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_VSNPRINTF $ac_have_decl" >>confdefs.h
+
+
+
+
+
+ if false; then
+ GL_COND_LIBTOOL_TRUE=
+ GL_COND_LIBTOOL_FALSE='#'
+else
+ GL_COND_LIBTOOL_TRUE='#'
+ GL_COND_LIBTOOL_FALSE=
+fi
+
+ gl_cond_libtool=false
+ gl_libdeps=
+ gl_ltlibdeps=
+ gl_m4_base='m4'
+
+
+
+
+
+
+
+
+
+
+ gl_source_base='lib'
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS accept.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_ACCEPT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ACCEPT 1" >>confdefs.h
+
+
+
+
+
+
+ case "$host_os" in
+ mingw*) REPLACE_ACCESS=1 ;;
+ esac
+
+ if test $REPLACE_ACCESS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS access.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_ACCESS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ACCESS 1" >>confdefs.h
+
+
+
+
+
+ if test $ac_cv_func_alloca_works = no; then
+ :
+ fi
+
+ # Define an additional variable used in the Makefile substitution.
+ if test $ac_cv_working_alloca_h = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
+printf %s "checking for alloca as a compiler built-in... " >&6; }
+if test ${gl_cv_rpl_alloca+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+ Need own alloca
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Need own alloca" >/dev/null 2>&1
+then :
+ gl_cv_rpl_alloca=yes
+else $as_nop
+ gl_cv_rpl_alloca=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
+printf "%s\n" "$gl_cv_rpl_alloca" >&6; }
+ if test $gl_cv_rpl_alloca = yes; then
+
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
+
+ ALLOCA_H=alloca.h
+ else
+ ALLOCA_H=
+ fi
+ else
+ ALLOCA_H=alloca.h
+ fi
+
+ if test -n "$ALLOCA_H"; then
+ GL_GENERATE_ALLOCA_H_TRUE=
+ GL_GENERATE_ALLOCA_H_FALSE='#'
+else
+ GL_GENERATE_ALLOCA_H_TRUE='#'
+ GL_GENERATE_ALLOCA_H_FALSE=
+fi
+
+
+ if test $ac_cv_working_alloca_h = yes; then
+ HAVE_ALLOCA_H=1
+ else
+ HAVE_ALLOCA_H=0
+ fi
+
+
+
+
+
+
+ if test $ac_cv_header_arpa_inet_h = yes; then
+ HAVE_ARPA_INET_H=1
+ else
+ HAVE_ARPA_INET_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_arpa_inet_h='<'arpa/inet.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <arpa/inet.h>" >&5
+printf %s "checking absolute name of <arpa/inet.h>... " >&6; }
+if test ${gl_cv_next_arpa_inet_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_arpa_inet_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <arpa/inet.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'arpa/inet.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_arpa_inet_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_arpa_inet_h
+ gl_cv_next_arpa_inet_h='"'$gl_header'"'
+ else
+ gl_cv_next_arpa_inet_h='<'arpa/inet.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_arpa_inet_h" >&5
+printf "%s\n" "$gl_cv_next_arpa_inet_h" >&6; }
+ fi
+ NEXT_ARPA_INET_H=$gl_cv_next_arpa_inet_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'arpa/inet.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_arpa_inet_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_WS2TCPIP_H=0
+ else
+ if test $ac_cv_header_ws2tcpip_h = yes; then
+ HAVE_WS2TCPIP_H=1
+ else
+ HAVE_WS2TCPIP_H=0
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS bind.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_BIND=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_BIND 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_btowc = no; then
+ HAVE_BTOWC=0
+ else
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether btowc(0) is correct" >&5
+printf %s "checking whether btowc(0) is correct... " >&6; }
+if test ${gl_cv_func_btowc_nul+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no on Cygwin.
+ cygwin*) gl_cv_func_btowc_nul="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_btowc_nul="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_btowc_nul="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wchar.h>
+int main ()
+{
+ if (btowc ('\0') != 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_btowc_nul=yes
+else $as_nop
+ gl_cv_func_btowc_nul=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_nul" >&5
+printf "%s\n" "$gl_cv_func_btowc_nul" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether btowc(EOF) is correct" >&5
+printf %s "checking whether btowc(EOF) is correct... " >&6; }
+if test ${gl_cv_func_btowc_eof+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on IRIX.
+ irix*) gl_cv_func_btowc_eof="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_btowc_eof="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_btowc_eof="guessing yes" ;;
+ esac
+ if test $LOCALE_FR != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdio.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (btowc (EOF) != WEOF)
+ return 1;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_btowc_eof=yes
+else $as_nop
+ gl_cv_func_btowc_eof=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_btowc_eof" >&5
+printf "%s\n" "$gl_cv_func_btowc_eof" >&6; }
+
+ case "$gl_cv_func_btowc_nul" in
+ *yes) ;;
+ *) REPLACE_BTOWC=1 ;;
+ esac
+ case "$gl_cv_func_btowc_eof" in
+ *yes) ;;
+ *) REPLACE_BTOWC=1 ;;
+ esac
+ fi
+
+ if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS btowc.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_BTOWC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_BTOWC 1" >>confdefs.h
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5
+printf %s "checking for __builtin_expect... " >&6; }
+if test ${gl_cv___builtin_expect+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ int
+ main (int argc, char **argv)
+ {
+ argc = __builtin_expect (argc, 100);
+ return argv[argc != 100][0];
+ }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv___builtin_expect=yes
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <builtins.h>
+ int
+ main (int argc, char **argv)
+ {
+ argc = __builtin_expect (argc, 100);
+ return argv[argc != 100][0];
+ }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv___builtin_expect="in <builtins.h>"
+else $as_nop
+ gl_cv___builtin_expect=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv___builtin_expect" >&5
+printf "%s\n" "$gl_cv___builtin_expect" >&6; }
+ if test "$gl_cv___builtin_expect" = yes; then
+ printf "%s\n" "#define HAVE___BUILTIN_EXPECT 1" >>confdefs.h
+
+ elif test "$gl_cv___builtin_expect" = "in <builtins.h>"; then
+ printf "%s\n" "#define HAVE___BUILTIN_EXPECT 2" >>confdefs.h
+
+ fi
+
+
+
+ for ac_header in byteswap.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default"
+if test "x$ac_cv_header_byteswap_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_BYTESWAP_H 1" >>confdefs.h
+
+ BYTESWAP_H=''
+
+else $as_nop
+
+ BYTESWAP_H='byteswap.h'
+
+fi
+
+done
+
+ if test -n "$BYTESWAP_H"; then
+ GL_GENERATE_BYTESWAP_H_TRUE=
+ GL_GENERATE_BYTESWAP_H_FALSE='#'
+else
+ GL_GENERATE_BYTESWAP_H_TRUE='#'
+ GL_GENERATE_BYTESWAP_H_FALSE=
+fi
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ HAVE_CANONICALIZE_FILE_NAME=0
+ else
+ case "$gl_cv_func_realpath_works" in
+ *yes) ;;
+ *) REPLACE_CANONICALIZE_FILE_NAME=1 ;;
+ esac
+ fi
+
+
+
+printf "%s\n" "#define GNULIB_CANONICALIZE 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CANONICALIZE 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_CANONICALIZE_FILE_NAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CANONICALIZE_FILE_NAME 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ GNULIB_CHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CHDIR 1" >>confdefs.h
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether this system supports file names of any length" >&5
+printf %s "checking whether this system supports file names of any length... " >&6; }
+if test ${gl_cv_have_unlimited_file_name_length+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+#ifdef PATH_MAX
+have_arbitrary_file_name_length_limit
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "have_arbitrary_file_name_length_limit" >/dev/null 2>&1
+then :
+ gl_cv_have_unlimited_file_name_length=no
+else $as_nop
+ gl_cv_have_unlimited_file_name_length=yes
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_unlimited_file_name_length" >&5
+printf "%s\n" "$gl_cv_have_unlimited_file_name_length" >&6; }
+
+ if test $gl_cv_have_unlimited_file_name_length = no; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS chdir-long.$ac_objext"
+
+ :
+ fi
+
+
+
+ # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+
+ # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all*
+ # programs in the package would end up linked with that potentially-shared
+ # library, inducing unnecessary run-time overhead.
+ LIB_CLOCK_GETTIME=
+
+ gl_saved_libs=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+printf %s "checking for library containing clock_gettime... " >&6; }
+if test ${ac_cv_search_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char clock_gettime ();
+int
+main (void)
+{
+return clock_gettime ();
+ ;
+ 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_clock_gettime=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_clock_gettime+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_clock_gettime+y}
+then :
+
+else $as_nop
+ ac_cv_search_clock_gettime=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
+printf "%s\n" "$ac_cv_search_clock_gettime" >&6; }
+ac_res=$ac_cv_search_clock_gettime
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ test "$ac_cv_search_clock_gettime" = "none required" ||
+ LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
+fi
+
+ ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime"
+if test "x$ac_cv_func_clock_gettime" = xyes
+then :
+ printf "%s\n" "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "clock_settime" "ac_cv_func_clock_settime"
+if test "x$ac_cv_func_clock_settime" = xyes
+then :
+ printf "%s\n" "#define HAVE_CLOCK_SETTIME 1" >>confdefs.h
+
+fi
+
+ LIBS=$gl_saved_libs
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOEXEC 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_CLOSE=1
+ fi
+
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+ if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+ REPLACE_CLOSE=1
+ fi
+
+
+ if test $REPLACE_CLOSE = 0; then
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_CLOSE=1
+ fi
+ fi
+
+
+ if test $REPLACE_CLOSE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_CLOSE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOSE 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "closedir" "ac_cv_func_closedir"
+if test "x$ac_cv_func_closedir" = xyes
+then :
+ printf "%s\n" "#define HAVE_CLOSEDIR 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_closedir = no; then
+ HAVE_CLOSEDIR=0
+ fi
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ if test $HAVE_CLOSEDIR = 1; then
+ REPLACE_CLOSEDIR=1
+ fi
+ fi
+
+ case $host_os,$HAVE_CLOSEDIR in
+ os2*,1)
+ REPLACE_CLOSEDIR=1;;
+ esac
+
+ if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS closedir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_CLOSEDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CLOSEDIR 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS connect.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_CONNECT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_CONNECT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ :
+
+
+printf "%s\n" "#define GL_COMPILE_CRYPTO_STREAM 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-openssl was given.
+if test ${with_openssl+y}
+then :
+ withval=$with_openssl;
+else $as_nop
+ with_openssl=$with_openssl_default
+fi
+
+
+
+ if test "x$with_openssl" != xno; then
+ if test "x$with_openssl" = xauto-gpl-compat; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether openssl is GPL compatible" >&5
+printf %s "checking whether openssl is GPL compatible... " >&6; }
+if test ${gl_cv_openssl_gpl_compat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_MAJOR < 3
+ #error "openssl >= version 3 not found"
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_openssl_gpl_compat=yes
+else $as_nop
+ gl_cv_openssl_gpl_compat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_openssl_gpl_compat" >&5
+printf "%s\n" "$gl_cv_openssl_gpl_compat" >&6; }
+ fi
+ if test "x$with_openssl" != xauto-gpl-compat ||
+ test "x$gl_cv_openssl_gpl_compat" = xyes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MD5 in -lcrypto" >&5
+printf %s "checking for MD5 in -lcrypto... " >&6; }
+if test ${ac_cv_lib_crypto_MD5+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $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. */
+char MD5 ();
+int
+main (void)
+{
+return MD5 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_crypto_MD5=yes
+else $as_nop
+ ac_cv_lib_crypto_MD5=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_MD5" >&5
+printf "%s\n" "$ac_cv_lib_crypto_MD5" >&6; }
+if test "x$ac_cv_lib_crypto_MD5" = xyes
+then :
+ for ac_header in openssl/md5.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "openssl/md5.h" "ac_cv_header_openssl_md5_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_md5_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENSSL_MD5_H 1" >>confdefs.h
+ LIB_CRYPTO=-lcrypto
+
+printf "%s\n" "#define HAVE_OPENSSL_MD5 1" >>confdefs.h
+
+fi
+
+done
+fi
+
+ fi
+ if test "x$LIB_CRYPTO" = x; then
+ if test "x$with_openssl" = xyes; then
+ as_fn_error $? "openssl development library not found for MD5" "$LINENO" 5
+ elif test "x$with_openssl" = xoptional; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: openssl development library not found for MD5" >&5
+printf "%s\n" "$as_me: WARNING: openssl development library not found for MD5" >&2;}
+ fi
+ fi
+ fi
+
+
+
+printf "%s\n" "#define GL_COMPILE_CRYPTO_STREAM 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-openssl was given.
+if test ${with_openssl+y}
+then :
+ withval=$with_openssl;
+else $as_nop
+ with_openssl=$with_openssl_default
+fi
+
+
+
+ if test "x$with_openssl" != xno; then
+ if test "x$with_openssl" = xauto-gpl-compat; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether openssl is GPL compatible" >&5
+printf %s "checking whether openssl is GPL compatible... " >&6; }
+if test ${gl_cv_openssl_gpl_compat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_MAJOR < 3
+ #error "openssl >= version 3 not found"
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_openssl_gpl_compat=yes
+else $as_nop
+ gl_cv_openssl_gpl_compat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_openssl_gpl_compat" >&5
+printf "%s\n" "$gl_cv_openssl_gpl_compat" >&6; }
+ fi
+ if test "x$with_openssl" != xauto-gpl-compat ||
+ test "x$gl_cv_openssl_gpl_compat" = xyes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SHA1 in -lcrypto" >&5
+printf %s "checking for SHA1 in -lcrypto... " >&6; }
+if test ${ac_cv_lib_crypto_SHA1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $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. */
+char SHA1 ();
+int
+main (void)
+{
+return SHA1 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_crypto_SHA1=yes
+else $as_nop
+ ac_cv_lib_crypto_SHA1=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SHA1" >&5
+printf "%s\n" "$ac_cv_lib_crypto_SHA1" >&6; }
+if test "x$ac_cv_lib_crypto_SHA1" = xyes
+then :
+ for ac_header in openssl/sha.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "openssl/sha.h" "ac_cv_header_openssl_sha_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_sha_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENSSL_SHA_H 1" >>confdefs.h
+ LIB_CRYPTO=-lcrypto
+
+printf "%s\n" "#define HAVE_OPENSSL_SHA1 1" >>confdefs.h
+
+fi
+
+done
+fi
+
+ fi
+ if test "x$LIB_CRYPTO" = x; then
+ if test "x$with_openssl" = xyes; then
+ as_fn_error $? "openssl development library not found for SHA1" "$LINENO" 5
+ elif test "x$with_openssl" = xoptional; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: openssl development library not found for SHA1" >&5
+printf "%s\n" "$as_me: WARNING: openssl development library not found for SHA1" >&2;}
+ fi
+ fi
+ fi
+
+
+
+printf "%s\n" "#define GL_COMPILE_CRYPTO_STREAM 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-openssl was given.
+if test ${with_openssl+y}
+then :
+ withval=$with_openssl;
+else $as_nop
+ with_openssl=$with_openssl_default
+fi
+
+
+
+ if test "x$with_openssl" != xno; then
+ if test "x$with_openssl" = xauto-gpl-compat; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether openssl is GPL compatible" >&5
+printf %s "checking whether openssl is GPL compatible... " >&6; }
+if test ${gl_cv_openssl_gpl_compat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_MAJOR < 3
+ #error "openssl >= version 3 not found"
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_openssl_gpl_compat=yes
+else $as_nop
+ gl_cv_openssl_gpl_compat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_openssl_gpl_compat" >&5
+printf "%s\n" "$gl_cv_openssl_gpl_compat" >&6; }
+ fi
+ if test "x$with_openssl" != xauto-gpl-compat ||
+ test "x$gl_cv_openssl_gpl_compat" = xyes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SHA256 in -lcrypto" >&5
+printf %s "checking for SHA256 in -lcrypto... " >&6; }
+if test ${ac_cv_lib_crypto_SHA256+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $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. */
+char SHA256 ();
+int
+main (void)
+{
+return SHA256 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_crypto_SHA256=yes
+else $as_nop
+ ac_cv_lib_crypto_SHA256=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SHA256" >&5
+printf "%s\n" "$ac_cv_lib_crypto_SHA256" >&6; }
+if test "x$ac_cv_lib_crypto_SHA256" = xyes
+then :
+ for ac_header in openssl/sha.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "openssl/sha.h" "ac_cv_header_openssl_sha_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_sha_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENSSL_SHA_H 1" >>confdefs.h
+ LIB_CRYPTO=-lcrypto
+
+printf "%s\n" "#define HAVE_OPENSSL_SHA256 1" >>confdefs.h
+
+fi
+
+done
+fi
+
+ fi
+ if test "x$LIB_CRYPTO" = x; then
+ if test "x$with_openssl" = xyes; then
+ as_fn_error $? "openssl development library not found for SHA256" "$LINENO" 5
+ elif test "x$with_openssl" = xoptional; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: openssl development library not found for SHA256" >&5
+printf "%s\n" "$as_me: WARNING: openssl development library not found for SHA256" >&2;}
+ fi
+ fi
+ fi
+
+
+
+printf "%s\n" "#define GL_COMPILE_CRYPTO_STREAM 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-openssl was given.
+if test ${with_openssl+y}
+then :
+ withval=$with_openssl;
+else $as_nop
+ with_openssl=$with_openssl_default
+fi
+
+
+
+ if test "x$with_openssl" != xno; then
+ if test "x$with_openssl" = xauto-gpl-compat; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether openssl is GPL compatible" >&5
+printf %s "checking whether openssl is GPL compatible... " >&6; }
+if test ${gl_cv_openssl_gpl_compat+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_MAJOR < 3
+ #error "openssl >= version 3 not found"
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_openssl_gpl_compat=yes
+else $as_nop
+ gl_cv_openssl_gpl_compat=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_openssl_gpl_compat" >&5
+printf "%s\n" "$gl_cv_openssl_gpl_compat" >&6; }
+ fi
+ if test "x$with_openssl" != xauto-gpl-compat ||
+ test "x$gl_cv_openssl_gpl_compat" = xyes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SHA512 in -lcrypto" >&5
+printf %s "checking for SHA512 in -lcrypto... " >&6; }
+if test ${ac_cv_lib_crypto_SHA512+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcrypto $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. */
+char SHA512 ();
+int
+main (void)
+{
+return SHA512 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_crypto_SHA512=yes
+else $as_nop
+ ac_cv_lib_crypto_SHA512=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_SHA512" >&5
+printf "%s\n" "$ac_cv_lib_crypto_SHA512" >&6; }
+if test "x$ac_cv_lib_crypto_SHA512" = xyes
+then :
+ for ac_header in openssl/sha.h
+do :
+ ac_fn_c_check_header_compile "$LINENO" "openssl/sha.h" "ac_cv_header_openssl_sha_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_sha_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENSSL_SHA_H 1" >>confdefs.h
+ LIB_CRYPTO=-lcrypto
+
+printf "%s\n" "#define HAVE_OPENSSL_SHA512 1" >>confdefs.h
+
+fi
+
+done
+fi
+
+ fi
+ if test "x$LIB_CRYPTO" = x; then
+ if test "x$with_openssl" = xyes; then
+ as_fn_error $? "openssl development library not found for SHA512" "$LINENO" 5
+ elif test "x$with_openssl" = xoptional; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: openssl development library not found for SHA512" >&5
+printf "%s\n" "$as_me: WARNING: openssl development library not found for SHA512" >&2;}
+ fi
+ fi
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_ctype_h='<'ctype.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <ctype.h>" >&5
+printf %s "checking absolute name of <ctype.h>... " >&6; }
+if test ${gl_cv_next_ctype_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'ctype.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_ctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_ctype_h
+ gl_cv_next_ctype_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_ctype_h" >&5
+printf "%s\n" "$gl_cv_next_ctype_h" >&6; }
+ fi
+ NEXT_CTYPE_H=$gl_cv_next_ctype_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'ctype.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_ctype_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_CTYPE_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for d_ino member in directory struct" >&5
+printf %s "checking for d_ino member in directory struct... " >&6; }
+if test ${gl_cv_struct_dirent_d_ino+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems with Linux kernel.
+ linux*-gnu*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+ # Guess yes on musl systems with Linux kernel.
+ linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_struct_dirent_d_ino="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <dirent.h>
+
+int
+main (void)
+{
+DIR *dp = opendir (".");
+ struct dirent *e;
+ struct stat st;
+ if (! dp)
+ return 1;
+ e = readdir (dp);
+ if (! e)
+ { closedir (dp); return 2; }
+ if (lstat (e->d_name, &st) != 0)
+ { closedir (dp); return 3; }
+ if (e->d_ino != st.st_ino)
+ { closedir (dp); return 4; }
+ closedir (dp);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_struct_dirent_d_ino=yes
+else $as_nop
+ gl_cv_struct_dirent_d_ino=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_struct_dirent_d_ino" >&5
+printf "%s\n" "$gl_cv_struct_dirent_d_ino" >&6; }
+ case "$gl_cv_struct_dirent_d_ino" in
+ *yes)
+
+printf "%s\n" "#define D_INO_IN_DIRENT 1" >>confdefs.h
+
+ ;;
+ esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_dirent_h='<'dirent.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <dirent.h>" >&5
+printf %s "checking absolute name of <dirent.h>... " >&6; }
+if test ${gl_cv_next_dirent_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_dirent_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <dirent.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'dirent.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_dirent_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_dirent_h
+ gl_cv_next_dirent_h='"'$gl_header'"'
+ else
+ gl_cv_next_dirent_h='<'dirent.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_dirent_h" >&5
+printf "%s\n" "$gl_cv_next_dirent_h" >&6; }
+ fi
+ NEXT_DIRENT_H=$gl_cv_next_dirent_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'dirent.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_dirent_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_DIRENT_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_dirent_h = yes; then
+ HAVE_DIRENT_H=1
+ else
+ HAVE_DIRENT_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd"
+if test "x$ac_cv_func_dirfd" = xyes
+then :
+ printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include <sys/types.h>
+ #include <dirent.h>
+"
+if test "x$ac_cv_have_decl_dirfd" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_DIRFD $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_dirfd = no; then
+ HAVE_DECL_DIRFD=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dirfd is a macro" >&5
+printf %s "checking whether dirfd is a macro... " >&6; }
+if test ${gl_cv_func_dirfd_macro+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "dirent_header_defines_dirfd" >/dev/null 2>&1
+then :
+ gl_cv_func_dirfd_macro=yes
+else $as_nop
+ gl_cv_func_dirfd_macro=no
+fi
+rm -rf conftest*
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dirfd_macro" >&5
+printf "%s\n" "$gl_cv_func_dirfd_macro" >&6; }
+
+ # Use the replacement if we have no function or macro with that name,
+ # or if OS/2 kLIBC whose dirfd() does not work.
+ # Replace only if the system declares dirfd already.
+ case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
+ no,no,*,yes | *,*,os2*,yes)
+ REPLACE_DIRFD=1
+
+printf "%s\n" "#define REPLACE_DIRFD 1" >>confdefs.h
+;;
+ esac
+
+ if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no \
+ || test $REPLACE_DIRFD = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS dirfd.$ac_objext"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to get the file descriptor associated with an open DIR*" >&5
+printf %s "checking how to get the file descriptor associated with an open DIR*... " >&6; }
+if test ${gl_cv_sys_dir_fd_member_name+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ dirfd_save_CFLAGS=$CFLAGS
+ for ac_expr in d_fd dd_fd; do
+
+ CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <dirent.h>
+int
+main (void)
+{
+DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ dir_fd_found=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$dirfd_save_CFLAGS
+ test "$dir_fd_found" = yes && break
+ done
+ test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+ gl_cv_sys_dir_fd_member_name=$ac_expr
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_dir_fd_member_name" >&5
+printf "%s\n" "$gl_cv_sys_dir_fd_member_name" >&6; }
+ if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+
+printf "%s\n" "#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name" >>confdefs.h
+
+ fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_DIRFD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DIRFD 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_DIRNAME 1" >>confdefs.h
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+printf %s "checking whether // is distinct from /... " >&6; }
+if test ${gl_cv_double_slash_root+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test x"$cross_compiling" = xyes ; then
+ # When cross-compiling, there is no way to tell whether // is special
+ # short of a list of hosts. However, the only known hosts to date
+ # that have a distinct // are Apollo DomainOS (too old to port to),
+ # Cygwin, and z/OS. If anyone knows of another system for which // has
+ # special semantics and is distinct from /, please report it to
+ # <bug-gnulib@gnu.org>.
+ case $host in
+ *-cygwin | i370-ibm-openedition)
+ gl_cv_double_slash_root=yes ;;
+ *)
+ # Be optimistic and assume that / and // are the same when we
+ # don't know.
+ gl_cv_double_slash_root='unknown, assuming no' ;;
+ esac
+ else
+ set x `ls -di / // 2>/dev/null`
+ if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+ gl_cv_double_slash_root=no
+ else
+ gl_cv_double_slash_root=yes
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+printf "%s\n" "$gl_cv_double_slash_root" >&6; }
+ if test "$gl_cv_double_slash_root" = yes; then
+
+printf "%s\n" "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
+
+ fi
+
+
+
+
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_DUP=1
+ fi
+
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_DUP=1
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dup works" >&5
+printf %s "checking whether dup works... " >&6; }
+if test ${gl_cv_func_dup_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_dup_works="guessing no" ;;
+ *) gl_cv_func_dup_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+ #include <fcntl.h>
+ #include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+/* On OS/2 kLIBC, dup does not work on a directory fd. */
+ int fd = open (".", O_RDONLY);
+ return fd < 0 ? 1 : dup (fd) < 0 ? 2 : 0;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_dup_works=yes
+else $as_nop
+ gl_cv_func_dup_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup_works" >&5
+printf "%s\n" "$gl_cv_func_dup_works" >&6; }
+ case "$gl_cv_func_dup_works" in
+ *yes) ;;
+ *)
+ REPLACE_DUP=1
+ ;;
+ esac
+
+ if test $REPLACE_DUP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS dup.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_DUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DUP 1" >>confdefs.h
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5
+printf %s "checking whether dup2 works... " >&6; }
+if test ${gl_cv_func_dup2_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ mingw*) # on this platform, dup2 always returns 0 for success
+ gl_cv_func_dup2_works="guessing no" ;;
+ cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+ gl_cv_func_dup2_works="guessing no" ;;
+ aix* | freebsd*)
+ # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+ # not EBADF.
+ gl_cv_func_dup2_works="guessing no" ;;
+ haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+ gl_cv_func_dup2_works="guessing no" ;;
+ *-android*) # implemented using dup3(), which fails if oldfd == newfd
+ gl_cv_func_dup2_works="guessing no" ;;
+ os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+ gl_cv_func_dup2_works="guessing no" ;;
+ *) gl_cv_func_dup2_works="guessing yes" ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+ #include <fcntl.h>
+ #include <limits.h>
+ #include <sys/resource.h>
+ #include <unistd.h>
+
+
+$gl_mda_defines
+
+ #ifndef RLIM_SAVED_CUR
+ # define RLIM_SAVED_CUR RLIM_INFINITY
+ #endif
+ #ifndef RLIM_SAVED_MAX
+ # define RLIM_SAVED_MAX RLIM_INFINITY
+ #endif
+
+int
+main (void)
+{
+int result = 0;
+ int bad_fd = INT_MAX;
+ struct rlimit rlim;
+ if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+ && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+ && rlim.rlim_cur != RLIM_INFINITY
+ && rlim.rlim_cur != RLIM_SAVED_MAX
+ && rlim.rlim_cur != RLIM_SAVED_CUR)
+ bad_fd = rlim.rlim_cur;
+ #ifdef FD_CLOEXEC
+ if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+ result |= 1;
+ #endif
+ if (dup2 (1, 1) != 1)
+ result |= 2;
+ #ifdef FD_CLOEXEC
+ if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+ result |= 4;
+ #endif
+ close (0);
+ if (dup2 (0, 0) != -1)
+ result |= 8;
+ /* Many gnulib modules require POSIX conformance of EBADF. */
+ if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+ result |= 16;
+ /* Flush out some cygwin core dumps. */
+ if (dup2 (2, -1) != -1 || errno != EBADF)
+ result |= 32;
+ dup2 (2, 255);
+ dup2 (2, 256);
+ /* On OS/2 kLIBC, dup2() does not work on a directory fd. */
+ {
+ int fd = open (".", O_RDONLY);
+ if (fd == -1)
+ result |= 64;
+ else if (dup2 (fd, fd + 1) == -1)
+ result |= 128;
+ close (fd);
+ }
+ return result;
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_dup2_works=yes
+else $as_nop
+ gl_cv_func_dup2_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5
+printf "%s\n" "$gl_cv_func_dup2_works" >&6; }
+ case "$gl_cv_func_dup2_works" in
+ *yes) ;;
+ *)
+ REPLACE_DUP2=1
+ ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize"
+if test "x$ac_cv_func_setdtablesize" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETDTABLESIZE 1" >>confdefs.h
+
+fi
+
+ ;;
+ esac
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_DUP2=1
+ fi
+
+
+ if test $REPLACE_DUP2 = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"
+
+
+ fi
+
+
+
+
+
+ GNULIB_DUP2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_DUP2 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ GNULIB_ENVIRON=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
+printf %s "checking for error_at_line... " >&6; }
+if test ${ac_cv_lib_error_at_line+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <error.h>
+int
+main (void)
+{
+error_at_line (0, 0, "", 0, "an error occurred");
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_error_at_line=yes
+else $as_nop
+ ac_cv_lib_error_at_line=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
+printf "%s\n" "$ac_cv_lib_error_at_line" >&6; }
+
+ if test $ac_cv_lib_error_at_line = no; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format"
+
+
+
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format"
+
+
+
+
+
+ :
+
+
+
+
+
+
+ if test $ac_cv_have_decl_fchdir = no; then
+ HAVE_DECL_FCHDIR=0
+ fi
+
+
+ if test $HAVE_FCHDIR = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fchdir.$ac_objext"
+
+ :
+
+printf "%s\n" "#define REPLACE_FCHDIR 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open can visit directories" >&5
+printf %s "checking whether open can visit directories... " >&6; }
+if test ${gl_cv_func_open_directory_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_open_directory_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_open_directory_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fcntl.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+return open(".", O_RDONLY) < 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_open_directory_works=yes
+else $as_nop
+ gl_cv_func_open_directory_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_directory_works" >&5
+printf "%s\n" "$gl_cv_func_open_directory_works" >&6; }
+ case "$gl_cv_func_open_directory_works" in
+ *yes) ;;
+ *)
+
+printf "%s\n" "#define REPLACE_OPEN_DIRECTORY 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+
+
+
+
+
+
+ GNULIB_FCHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FCHDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_fcntl = no; then
+
+
+
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5
+printf %s "checking whether fcntl handles F_DUPFD correctly... " >&6; }
+if test ${gl_cv_func_fcntl_f_dupfd_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case $host_os in
+ aix* | cygwin* | haiku*)
+ gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
+ *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <errno.h>
+ #include <fcntl.h>
+ #include <limits.h>
+ #include <sys/resource.h>
+ #include <unistd.h>
+
+
+$gl_mda_defines
+
+ #ifndef RLIM_SAVED_CUR
+ # define RLIM_SAVED_CUR RLIM_INFINITY
+ #endif
+ #ifndef RLIM_SAVED_MAX
+ # define RLIM_SAVED_MAX RLIM_INFINITY
+ #endif
+
+int
+main (void)
+{
+int result = 0;
+ int bad_fd = INT_MAX;
+ struct rlimit rlim;
+ if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+ && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+ && rlim.rlim_cur != RLIM_INFINITY
+ && rlim.rlim_cur != RLIM_SAVED_MAX
+ && rlim.rlim_cur != RLIM_SAVED_CUR)
+ bad_fd = rlim.rlim_cur;
+ if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
+ if (errno != EINVAL) result |= 2;
+ if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
+ if (errno != EINVAL) result |= 8;
+ /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
+ {
+ int fd;
+ fd = open (".", O_RDONLY);
+ if (fd == -1)
+ result |= 16;
+ else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
+ result |= 32;
+
+ close (fd);
+ }
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fcntl_f_dupfd_works=yes
+else $as_nop
+ gl_cv_func_fcntl_f_dupfd_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5
+printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_works" >&6; }
+ case $gl_cv_func_fcntl_f_dupfd_works in
+ *yes) ;;
+ *)
+
+
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+
+
+printf "%s\n" "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5
+printf %s "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; }
+if test ${gl_cv_func_fcntl_f_dupfd_cloexec+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on NetBSD.
+ netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
+ *) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fcntl.h>
+ #include <unistd.h>
+ int main (int argc, char *argv[])
+ {
+ if (argc == 1)
+ /* parent process */
+ {
+ if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
+ return 1;
+ return execl ("./conftest", "./conftest", "child", NULL);
+ }
+ else
+ /* child process */
+ return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
+ }
+
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+ it to support the semantics on older kernels that failed with EINVAL. */
+choke me
+#endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_fcntl_f_dupfd_cloexec=yes
+else $as_nop
+ gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+ gl_cv_func_fcntl_f_dupfd_cloexec=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5
+printf "%s\n" "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
+ case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
+ *yes) ;;
+ *)
+
+
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+
+ ;;
+ esac
+ fi
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+
+
+
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+
+ fi
+
+
+ if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FCNTL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FCNTL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_fcntl_h='<'fcntl.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <fcntl.h>" >&5
+printf %s "checking absolute name of <fcntl.h>... " >&6; }
+if test ${gl_cv_next_fcntl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fcntl.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'fcntl.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_fcntl_h
+ gl_cv_next_fcntl_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5
+printf "%s\n" "$gl_cv_next_fcntl_h" >&6; }
+ fi
+ NEXT_FCNTL_H=$gl_cv_next_fcntl_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'fcntl.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_fcntl_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FD_SAFER_FLAG 1" >>confdefs.h
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "fdopendir" "ac_cv_have_decl_fdopendir" "
+#include <dirent.h>
+
+"
+if test "x$ac_cv_have_decl_fdopendir" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FDOPENDIR $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+
+else $as_nop
+ HAVE_DECL_FDOPENDIR=0
+fi
+
+
+ if test $ac_cv_func_fdopendir = no; then
+ HAVE_FDOPENDIR=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fdopendir works" >&5
+printf %s "checking whether fdopendir works... " >&6; }
+if test ${gl_cv_func_fdopendir_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_fdopendir_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_fdopendir_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_fdopendir_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+
+$gl_mda_defines
+
+#if !HAVE_DECL_FDOPENDIR
+extern
+# ifdef __cplusplus
+"C"
+# endif
+DIR *fdopendir (int);
+#endif
+
+int
+main (void)
+{
+int result = 0;
+ int fd = open ("conftest.c", O_RDONLY);
+ if (fd < 0) result |= 1;
+ if (fdopendir (fd)) result |= 2;
+ if (close (fd)) result |= 4;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fdopendir_works=yes
+else $as_nop
+ gl_cv_func_fdopendir_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fdopendir_works" >&5
+printf "%s\n" "$gl_cv_func_fdopendir_works" >&6; }
+ case "$gl_cv_func_fdopendir_works" in
+ *yes) ;;
+ *)
+ REPLACE_FDOPENDIR=1
+ ;;
+ esac
+ fi
+
+ if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fdopendir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FDOPENDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FDOPENDIR 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_FDOPENDIR 1" >>confdefs.h
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fflush works on input streams" >&5
+printf %s "checking whether fflush works on input streams... " >&6; }
+if test ${gl_cv_func_fflush_stdin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo hello world > conftest.txt
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_fflush_stdin="guessing no" ;;
+ *) gl_cv_func_fflush_stdin=cross ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.txt", "r");
+ char buffer[10];
+ int fd;
+ int c;
+ if (f == NULL)
+ return 1;
+ fd = fileno (f);
+ if (fd < 0 || fread (buffer, 1, 5, f) != 5)
+ { fclose (f); return 2; }
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ { fclose (f); return 3; }
+ /* POSIX requires fflush-fseek to set file offset of fd. This fails
+ on BSD systems and on mingw. */
+ if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
+ { fclose (f); return 4; }
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ { fclose (f); return 5; }
+ /* Verify behaviour of fflush after ungetc. See
+ <https://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> */
+ /* Verify behaviour of fflush after a backup ungetc. This fails on
+ mingw. */
+ c = fgetc (f);
+ ungetc (c, f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 6; }
+ /* Verify behaviour of fflush after a non-backup ungetc. This fails
+ on glibc 2.8 and on BSD systems. */
+ c = fgetc (f);
+ ungetc ('@', f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 7; }
+ fclose (f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fflush_stdin=yes
+else $as_nop
+ gl_cv_func_fflush_stdin=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm conftest.txt
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fflush_stdin" >&5
+printf "%s\n" "$gl_cv_func_fflush_stdin" >&6; }
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) gl_func_fflush_stdin=1 ;;
+ *no) gl_func_fflush_stdin=0 ;;
+ *) gl_func_fflush_stdin='(-1)' ;;
+ esac
+
+printf "%s\n" "#define FUNC_FFLUSH_STDIN $gl_func_fflush_stdin" >>confdefs.h
+
+
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) ;;
+ *) REPLACE_FFLUSH=1 ;;
+ esac
+
+ if test $REPLACE_FFLUSH = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fflush.$ac_objext"
+
+ :
+ fi
+
+
+printf "%s\n" "#define GNULIB_FFLUSH 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_FFLUSH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FFLUSH 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5
+printf %s "checking for flexible array member... " >&6; }
+if test ${ac_cv_c_flexmember+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #include <stdio.h>
+ #include <stddef.h>
+ struct m { struct m *next, **list; char name[]; };
+ struct s { struct s *p; struct m *m; int n; double d[]; };
+int
+main (void)
+{
+int m = getchar ();
+ size_t nbytes = offsetof (struct s, d) + m * sizeof (double);
+ nbytes += sizeof (struct s) - 1;
+ nbytes -= nbytes % sizeof (struct s);
+ struct s *p = malloc (nbytes);
+ p->p = p;
+ p->m = NULL;
+ p->d[0] = 0.0;
+ return p->d != (double *) NULL;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_c_flexmember=yes
+else $as_nop
+ ac_cv_c_flexmember=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_flexmember" >&5
+printf "%s\n" "$ac_cv_c_flexmember" >&6; }
+ if test $ac_cv_c_flexmember = yes; then
+
+printf "%s\n" "#define FLEXIBLE_ARRAY_MEMBER /**/" >>confdefs.h
+
+ else
+ printf "%s\n" "#define FLEXIBLE_ARRAY_MEMBER 1" >>confdefs.h
+
+ fi
+
+
+
+
+ FLOAT_H=
+ REPLACE_FLOAT_LDBL=0
+ case "$host_os" in
+ aix* | beos* | openbsd* | mirbsd* | irix*)
+ FLOAT_H=float.h
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_cpu" in
+ i[34567]86 )
+ FLOAT_H=float.h
+ ;;
+ x86_64 )
+ # On x86_64 systems, the C compiler may still be generating
+ # 32-bit code.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__ || defined __x86_64__ || defined __amd64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ FLOAT_H=float.h
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ esac
+ ;;
+ linux*)
+ case "$host_cpu" in
+ powerpc*)
+ FLOAT_H=float.h
+ ;;
+ esac
+ ;;
+ esac
+ case "$host_os" in
+ aix* | freebsd* | dragonfly* | linux*)
+ if test -n "$FLOAT_H"; then
+ REPLACE_FLOAT_LDBL=1
+ fi
+ ;;
+ esac
+
+ REPLACE_ITOLD=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether conversion from 'int' to 'long double' works" >&5
+printf %s "checking whether conversion from 'int' to 'long double' works... " >&6; }
+if test ${gl_cv_func_itold_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host" in
+ sparc*-*-linux*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined __LP64__ || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_itold_works="guessing no"
+else $as_nop
+ gl_cv_func_itold_works="guessing yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_itold_works="guessing yes" ;;
+ *) gl_cv_func_itold_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int i = -1;
+volatile long double ld;
+int main ()
+{
+ ld += i * 1.0L;
+ if (ld > 0)
+ return 1;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_itold_works=yes
+else $as_nop
+ gl_cv_func_itold_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_itold_works" >&5
+printf "%s\n" "$gl_cv_func_itold_works" >&6; }
+ case "$gl_cv_func_itold_works" in
+ *no)
+ REPLACE_ITOLD=1
+ FLOAT_H=float.h
+ ;;
+ esac
+
+ if test -n "$FLOAT_H"; then
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_float_h='<'float.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <float.h>" >&5
+printf %s "checking absolute name of <float.h>... " >&6; }
+if test ${gl_cv_next_float_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'float.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_float_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_float_h
+ gl_cv_next_float_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_float_h" >&5
+printf "%s\n" "$gl_cv_next_float_h" >&6; }
+ fi
+ NEXT_FLOAT_H=$gl_cv_next_float_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'float.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_float_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_FLOAT_H=$gl_next_as_first_directive
+
+
+
+
+ fi
+
+ if test -n "$FLOAT_H"; then
+ GL_GENERATE_FLOAT_H_TRUE=
+ GL_GENERATE_FLOAT_H_FALSE='#'
+else
+ GL_GENERATE_FLOAT_H_TRUE='#'
+ GL_GENERATE_FLOAT_H_FALSE=
+fi
+
+
+
+ if test $REPLACE_FLOAT_LDBL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS float.$ac_objext"
+
+ fi
+ if test $REPLACE_ITOLD = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS itold.$ac_objext"
+
+ fi
+
+
+
+ if test $ac_cv_func_flock = no; then
+ HAVE_FLOCK=0
+ fi
+
+ if test $HAVE_FLOCK = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS flock.$ac_objext"
+
+
+
+
+
+ ac_fn_c_check_member "$LINENO" "struct flock" "l_type" "ac_cv_member_struct_flock_l_type" "#include <fcntl.h>
+"
+if test "x$ac_cv_member_struct_flock_l_type" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_FLOCK_L_TYPE 1" >>confdefs.h
+
+
+fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_FLOCK=1
+
+
+
+
+
+
+
+
+ gl_fnmatch_required_lowercase=`
+ echo $gl_fnmatch_required | LC_ALL=C tr '[A-Z]' '[a-z]'
+ `
+
+ if test $ac_cv_func_fnmatch = no; then
+ HAVE_FNMATCH=0
+ else
+ gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working $gl_fnmatch_required fnmatch" >&5
+printf %s "checking for working $gl_fnmatch_required fnmatch... " >&6; }
+if eval test \${$gl_fnmatch_cache_var+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $gl_fnmatch_required = GNU; then
+ gl_fnmatch_gnu_start=
+ gl_fnmatch_gnu_end=
+ else
+ gl_fnmatch_gnu_start='#if 0'
+ gl_fnmatch_gnu_end='#endif'
+ fi
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) eval "$gl_fnmatch_cache_var=\"guessing yes\"" ;;
+ # Guess no otherwise, even on glibc systems.
+ *) eval "$gl_fnmatch_cache_var=\"guessing no\"" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <fnmatch.h>
+ static int
+ y (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == 0;
+ }
+ static int
+ n (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == FNM_NOMATCH;
+ }
+
+int
+main (void)
+{
+char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]";
+ char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]";
+ static char const A_1[] = { 'A' - 1, 0 };
+ static char const A01[] = { 'A' + 1, 0 };
+ static char const a_1[] = { 'a' - 1, 0 };
+ static char const a01[] = { 'a' + 1, 0 };
+ static char const bs_1[] = { '\\\\' - 1, 0 };
+ static char const bs01[] = { '\\\\' + 1, 0 };
+ int result = 0;
+ if (!n ("a*", "", 0))
+ return 1;
+ if (!y ("a*", "abc", 0))
+ return 1;
+ if (!y ("[/b", "[/b", 0)) /*"]]"*/ /* glibc Bugzilla bug 12378 */
+ return 1;
+ if (!n ("d*/*1", "d/s/1", FNM_PATHNAME))
+ return 2;
+ if (!y ("a\\\\bc", "abc", 0))
+ return 3;
+ if (!n ("a\\\\bc", "abc", FNM_NOESCAPE))
+ return 3;
+ if (!y ("*x", ".x", 0))
+ return 4;
+ if (!n ("*x", ".x", FNM_PERIOD))
+ return 4;
+ if (!y (Apat, "\\\\", 0))
+ return 5;
+ if (!y (Apat, "A", 0))
+ return 5;
+ if (!y (apat, "\\\\", 0))
+ return 5;
+ if (!y (apat, "a", 0))
+ return 5;
+ if (!(n (Apat, A_1, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(n (apat, a_1, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(y (Apat, A01, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(y (apat, a01, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(y (Apat, bs_1, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(y (apat, bs_1, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(n (Apat, bs01, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(n (apat, bs01, 0) == ('a' < '\\\\')))
+ return 5;
+ $gl_fnmatch_gnu_start
+ if (!y ("xxXX", "xXxX", FNM_CASEFOLD))
+ result |= 8;
+ if (!y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH))
+ result |= 16;
+ if (!n ("d*/*1", "d/s/1", FNM_FILE_NAME))
+ result |= 32;
+ if (!y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ if (!y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ if (!y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ $gl_fnmatch_gnu_end
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ eval "$gl_fnmatch_cache_var=yes"
+else $as_nop
+ eval "$gl_fnmatch_cache_var=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
+eval ac_res=\$$gl_fnmatch_cache_var
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\""
+ case "$gl_fnmatch_result" in
+ *yes) ;;
+ *) REPLACE_FNMATCH=1 ;;
+ esac
+ fi
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+
+
+ FNMATCH_H='fnmatch.h'
+ if test -n "$FNMATCH_H"; then
+ GL_GENERATE_FNMATCH_H_TRUE=
+ GL_GENERATE_FNMATCH_H_FALSE='#'
+else
+ GL_GENERATE_FNMATCH_H_TRUE='#'
+ GL_GENERATE_FNMATCH_H_FALSE=
+fi
+
+
+ fi
+
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext"
+
+
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_FNMATCH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FNMATCH 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fnmatch.$ac_objext"
+
+
+
+
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_FNMATCH_GNU 1" >>confdefs.h
+
+
+
+
+
+
+ case "$host_os" in
+ mingw* | pw*)
+ REPLACE_FOPEN=1
+ gl_cv_func_fopen_slash="guessing no"
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen recognizes a trailing slash" >&5
+printf %s "checking whether fopen recognizes a trailing slash... " >&6; }
+if test ${gl_cv_func_fopen_slash+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+ gl_cv_func_fopen_slash="guessing no" ;;
+ *)
+ gl_cv_func_fopen_slash="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <stdio.h>
+int main ()
+{
+ FILE *fp = fopen ("conftest.sl/", "w");
+ int result = (fp != NULL);
+ if (fp != NULL)
+ fclose (fp);
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fopen_slash=yes
+else $as_nop
+ gl_cv_func_fopen_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.sl
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_slash" >&5
+printf "%s\n" "$gl_cv_func_fopen_slash" >&6; }
+ ;;
+ esac
+ case "$gl_cv_func_fopen_slash" in
+ *no)
+
+printf "%s\n" "#define FOPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+ REPLACE_FOPEN=1
+ ;;
+ esac
+
+ if test $REPLACE_FOPEN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_FOPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FOPEN 1" >>confdefs.h
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'x'" >&5
+printf %s "checking whether fopen supports the mode character 'x'... " >&6; }
+if test ${gl_cv_func_fopen_mode_x+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -f conftest.x
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc and musl systems.
+ linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+ gl_cv_func_fopen_mode_x="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <errno.h>
+int main ()
+{
+ FILE *fp;
+ fp = fopen ("conftest.x", "w");
+ fclose (fp);
+ fp = fopen ("conftest.x", "wx");
+ if (fp != NULL)
+ /* 'x' ignored */
+ return 1;
+ else if (errno == EEXIST)
+ return 0;
+ else
+ /* 'x' rejected */
+ return 2;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fopen_mode_x=yes
+else $as_nop
+ gl_cv_func_fopen_mode_x=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.x
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_x" >&5
+printf "%s\n" "$gl_cv_func_fopen_mode_x" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fopen supports the mode character 'e'" >&5
+printf %s "checking whether fopen supports the mode character 'e'... " >&6; }
+if test ${gl_cv_func_fopen_mode_e+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo foo > conftest.x
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc and musl systems.
+ linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+ gl_cv_func_fopen_mode_e="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*)
+ gl_cv_func_fopen_mode_e="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+$gl_mda_defines
+
+int main ()
+{
+ FILE *fp = fopen ("conftest.x", "re");
+ if (fp != NULL)
+ {
+ if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC)
+ return 0;
+ else
+ /* 'e' ignored */
+ return 1;
+ }
+ else
+ /* 'e' rejected */
+ return 2;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fopen_mode_e=yes
+else $as_nop
+ gl_cv_func_fopen_mode_e=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.x
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fopen_mode_e" >&5
+printf "%s\n" "$gl_cv_func_fopen_mode_e" >&6; }
+ case "$gl_cv_func_fopen_mode_x" in
+ *no) REPLACE_FOPEN=1 ;;
+ esac
+ case "$gl_cv_func_fopen_mode_e" in
+ *no) REPLACE_FOPEN=1 ;;
+ esac
+
+ if test $REPLACE_FOPEN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fopen.$ac_objext"
+
+ :
+ fi
+
+
+printf "%s\n" "#define GNULIB_FOPEN_GNU 1" >>confdefs.h
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "fpurge" "ac_cv_have_decl_fpurge" "#include <stdio.h>
+"
+if test "x$ac_cv_have_decl_fpurge" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FPURGE $ac_have_decl" >>confdefs.h
+
+ if test "x$ac_cv_func_fpurge" = xyes; then
+ HAVE_FPURGE=1
+ # Detect BSD bug. Only cygwin 1.7 and musl are known to be immune.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fpurge works" >&5
+printf %s "checking whether fpurge works... " >&6; }
+if test ${gl_cv_func_fpurge_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_fpurge_works="guessing yes" ;;
+ # Otherwise obey --enable-cross-guesses.
+ *) gl_cv_func_fpurge_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.txt", "w+");
+ if (!f)
+ return 1;
+ if (fputc ('a', f) != 'a')
+ { fclose (f); return 2; }
+ rewind (f);
+ if (fgetc (f) != 'a')
+ { fclose (f); return 3; }
+ if (fgetc (f) != EOF)
+ { fclose (f); return 4; }
+ if (fpurge (f) != 0)
+ { fclose (f); return 5; }
+ if (putc ('b', f) != 'b')
+ { fclose (f); return 6; }
+ if (fclose (f) != 0)
+ return 7;
+ if ((f = fopen ("conftest.txt", "r")) == NULL)
+ return 8;
+ if (fgetc (f) != 'a')
+ { fclose (f); return 9; }
+ if (fgetc (f) != 'b')
+ { fclose (f); return 10; }
+ if (fgetc (f) != EOF)
+ { fclose (f); return 11; }
+ if (fclose (f) != 0)
+ return 12;
+ if (remove ("conftest.txt") != 0)
+ return 13;
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fpurge_works=yes
+else $as_nop
+ gl_cv_func_fpurge_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fpurge_works" >&5
+printf "%s\n" "$gl_cv_func_fpurge_works" >&6; }
+ case "$gl_cv_func_fpurge_works" in
+ *yes) ;;
+ *) REPLACE_FPURGE=1 ;;
+ esac
+ else
+ HAVE_FPURGE=0
+ fi
+ if test "x$ac_cv_have_decl_fpurge" = xno; then
+ HAVE_DECL_FPURGE=0
+ fi
+
+ if test $HAVE_FPURGE = 0 || test $REPLACE_FPURGE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fpurge.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FPURGE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FPURGE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether free is known to preserve errno" >&5
+printf %s "checking whether free is known to preserve errno... " >&6; }
+if test ${gl_cv_func_free_preserves_errno+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+int
+main (void)
+{
+#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+ #elif defined __OpenBSD__
+ #elif defined __sun
+ #else
+ #error "'free' is not known to preserve errno"
+ #endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_free_preserves_errno=yes
+else $as_nop
+ gl_cv_func_free_preserves_errno=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_free_preserves_errno" >&5
+printf "%s\n" "$gl_cv_func_free_preserves_errno" >&6; }
+
+ case $gl_cv_func_free_preserves_errno in
+ *yes) ;;
+ *) REPLACE_FREE=1 ;;
+ esac
+
+ if test $REPLACE_FREE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS free.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_FREE_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FREE_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then
+ REPLACE_FSEEK=1
+ fi
+
+ if test $REPLACE_FSEEK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fseek.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FSEEK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSEEK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fseeko" >&5
+printf %s "checking for fseeko... " >&6; }
+if test ${gl_cv_func_fseeko+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+
+int
+main (void)
+{
+fseeko (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_fseeko=yes
+else $as_nop
+ gl_cv_func_fseeko=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fseeko" >&5
+printf "%s\n" "$gl_cv_func_fseeko" >&6; }
+
+
+ if test $ac_cv_have_decl_fseeko = no; then
+ HAVE_DECL_FSEEKO=0
+ fi
+
+ if test $gl_cv_func_fseeko = no; then
+ HAVE_FSEEKO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FSEEKO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FSEEKO=1
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fflush works on input streams" >&5
+printf %s "checking whether fflush works on input streams... " >&6; }
+if test ${gl_cv_func_fflush_stdin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo hello world > conftest.txt
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_fflush_stdin="guessing no" ;;
+ *) gl_cv_func_fflush_stdin=cross ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+FILE *f = fopen ("conftest.txt", "r");
+ char buffer[10];
+ int fd;
+ int c;
+ if (f == NULL)
+ return 1;
+ fd = fileno (f);
+ if (fd < 0 || fread (buffer, 1, 5, f) != 5)
+ { fclose (f); return 2; }
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ { fclose (f); return 3; }
+ /* POSIX requires fflush-fseek to set file offset of fd. This fails
+ on BSD systems and on mingw. */
+ if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
+ { fclose (f); return 4; }
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ { fclose (f); return 5; }
+ /* Verify behaviour of fflush after ungetc. See
+ <https://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> */
+ /* Verify behaviour of fflush after a backup ungetc. This fails on
+ mingw. */
+ c = fgetc (f);
+ ungetc (c, f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 6; }
+ /* Verify behaviour of fflush after a non-backup ungetc. This fails
+ on glibc 2.8 and on BSD systems. */
+ c = fgetc (f);
+ ungetc ('@', f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 7; }
+ fclose (f);
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fflush_stdin=yes
+else $as_nop
+ gl_cv_func_fflush_stdin=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm conftest.txt
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fflush_stdin" >&5
+printf "%s\n" "$gl_cv_func_fflush_stdin" >&6; }
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) gl_func_fflush_stdin=1 ;;
+ *no) gl_func_fflush_stdin=0 ;;
+ *) gl_func_fflush_stdin='(-1)' ;;
+ esac
+
+printf "%s\n" "#define FUNC_FFLUSH_STDIN $gl_func_fflush_stdin" >>confdefs.h
+
+
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) ;;
+ *) REPLACE_FSEEKO=1 ;;
+ esac
+
+ fi
+
+ if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fseeko.$ac_objext"
+
+
+ ac_fn_c_check_func "$LINENO" "_fseeki64" "ac_cv_func__fseeki64"
+if test "x$ac_cv_func__fseeki64" = xyes
+then :
+ printf "%s\n" "#define HAVE__FSEEKI64 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func__fseeki64 = yes; then
+ ac_fn_c_check_decl "$LINENO" "_fseeki64" "ac_cv_have_decl__fseeki64" "$ac_includes_default"
+if test "x$ac_cv_have_decl__fseeki64" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL__FSEEKI64 $ac_have_decl" >>confdefs.h
+
+ fi
+
+ fi
+
+
+
+
+
+ GNULIB_FSEEKO=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSEEKO 1" >>confdefs.h
+
+
+
+
+
+
+
+ case "$host_os" in
+ mingw* | solaris*)
+ REPLACE_FSTAT=1
+ ;;
+ esac
+
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ case "$gl_cv_func_open_directory_works" in
+ *yes) ;;
+ *)
+ REPLACE_FSTAT=1
+ ;;
+ esac
+ fi
+
+
+ if test $REPLACE_FSTAT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fstat.$ac_objext"
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
+
+ ;;
+ esac
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_FSTAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSTAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_fstatat = no; then
+ HAVE_FSTATAT=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fstatat (..., 0) works" >&5
+printf %s "checking whether fstatat (..., 0) works... " >&6; }
+if test ${gl_cv_func_fstatat_zero_flag+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
+ *) gl_cv_func_fstatat_zero_flag="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ int
+ main (void)
+ {
+ struct stat a;
+ return fstatat (AT_FDCWD, ".", &a, 0) != 0;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_fstatat_zero_flag=yes
+else $as_nop
+ gl_cv_func_fstatat_zero_flag=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fstatat_zero_flag" >&5
+printf "%s\n" "$gl_cv_func_fstatat_zero_flag" >&6; }
+
+ case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
+ *yes+*yes) ;;
+ *) REPLACE_FSTATAT=1 ;;
+ esac
+
+ case $host_os in
+ solaris*)
+ REPLACE_FSTATAT=1 ;;
+ esac
+
+ case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
+ 1,*yes)
+
+printf "%s\n" "#define HAVE_WORKING_FSTATAT_ZERO_FLAG 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+
+ if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS fstatat.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FSTATAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FSTATAT 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then
+ REPLACE_FTELL=1
+ fi
+
+ if test $REPLACE_FTELL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS ftell.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FTELL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FTELL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_ftello = no; then
+ HAVE_DECL_FTELLO=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ftello" >&5
+printf %s "checking for ftello... " >&6; }
+if test ${gl_cv_func_ftello+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+ftello (stdin);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_ftello=yes
+else $as_nop
+ gl_cv_func_ftello=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello" >&5
+printf "%s\n" "$gl_cv_func_ftello" >&6; }
+ if test $gl_cv_func_ftello = no; then
+ HAVE_FTELLO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FTELLO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FTELLO=1
+ fi
+ if test $REPLACE_FTELLO = 0; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ftello works" >&5
+printf %s "checking whether ftello works... " >&6; }
+if test ${gl_cv_func_ftello_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris.
+ solaris*) gl_cv_func_ftello_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_ftello_works="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_ftello_works="guessing yes" ;;
+ esac
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define TESTFILE "conftest.tmp"
+int
+main (void)
+{
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ return 70;
+ if (fwrite ("foogarsh", 1, 8, fp) < 8)
+ { fclose (fp); return 71; }
+ if (fclose (fp))
+ return 72;
+
+ /* The file's contents is now "foogarsh". */
+
+ /* Try writing after reading to EOF. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ return 73;
+ if (fseek (fp, -1, SEEK_END))
+ { fclose (fp); return 74; }
+ if (!(getc (fp) == 'h'))
+ { fclose (fp); return 1; }
+ if (!(getc (fp) == EOF))
+ { fclose (fp); return 2; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 3; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 4; }
+ if (!(putc ('!', fp) == '!'))
+ { fclose (fp); return 5; }
+ if (!(ftell (fp) == 9))
+ { fclose (fp); return 6; }
+ if (!(fclose (fp) == 0))
+ return 7;
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ return 75;
+ {
+ char buf[10];
+ if (!(fread (buf, 1, 10, fp) == 9))
+ { fclose (fp); return 10; }
+ if (!(memcmp (buf, "foogarsh!", 9) == 0))
+ { fclose (fp); return 11; }
+ }
+ if (!(fclose (fp) == 0))
+ return 12;
+
+ /* The file's contents is now "foogarsh!". */
+
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_ftello_works=yes
+else $as_nop
+ gl_cv_func_ftello_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ftello_works" >&5
+printf "%s\n" "$gl_cv_func_ftello_works" >&6; }
+ case "$gl_cv_func_ftello_works" in
+ *yes) ;;
+ *)
+ REPLACE_FTELLO=1
+
+printf "%s\n" "#define FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+ fi
+
+ if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS ftello.$ac_objext"
+
+
+ ac_fn_c_check_func "$LINENO" "_ftelli64" "ac_cv_func__ftelli64"
+if test "x$ac_cv_func__ftelli64" = xyes
+then :
+ printf "%s\n" "#define HAVE__FTELLI64 1" >>confdefs.h
+
+fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_FTELLO=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FTELLO 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $ac_cv_func_futimens = no; then
+ HAVE_FUTIMENS=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether futimens works" >&5
+printf %s "checking whether futimens works... " >&6; }
+if test ${gl_cv_func_futimens_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_futimens_works="guessing no" ;;
+ # Guess no on musl systems.
+ *-musl*) gl_cv_func_futimens_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_futimens_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+struct timespec ts[2];
+ int fd = creat ("conftest.file", 0600);
+ struct stat st;
+ if (fd < 0) return 1;
+ ts[0].tv_sec = 1;
+ ts[0].tv_nsec = UTIME_OMIT;
+ ts[1].tv_sec = 1;
+ ts[1].tv_nsec = UTIME_NOW;
+ errno = 0;
+ if (futimens (AT_FDCWD, NULL) == 0) return 2;
+ if (errno != EBADF) return 3;
+ if (futimens (fd, ts)) return 4;
+ sleep (1);
+ ts[0].tv_nsec = UTIME_NOW;
+ ts[1].tv_nsec = UTIME_OMIT;
+ if (futimens (fd, ts)) return 5;
+ if (fstat (fd, &st)) return 6;
+ if (st.st_ctime < st.st_atime) return 7;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_futimens_works=yes
+else $as_nop
+ gl_cv_func_futimens_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.file
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_futimens_works" >&5
+printf "%s\n" "$gl_cv_func_futimens_works" >&6; }
+ case "$gl_cv_func_futimens_works" in
+ *yes) ;;
+ *)
+ REPLACE_FUTIMENS=1
+ ;;
+ esac
+ fi
+
+ if test $HAVE_FUTIMENS = 0 || test $REPLACE_FUTIMENS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS futimens.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_FUTIMENS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_FUTIMENS 1" >>confdefs.h
+
+
+
+
+ GETADDRINFO_LIB=
+ gai_saved_LIBS="$LIBS"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5
+printf %s "checking for library containing getaddrinfo... " >&6; }
+if test ${ac_cv_search_getaddrinfo+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char getaddrinfo ();
+int
+main (void)
+{
+return getaddrinfo ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket network net
+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_getaddrinfo=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_getaddrinfo+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_getaddrinfo+y}
+then :
+
+else $as_nop
+ ac_cv_search_getaddrinfo=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getaddrinfo" >&5
+printf "%s\n" "$ac_cv_search_getaddrinfo" >&6; }
+ac_res=$ac_cv_search_getaddrinfo
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_getaddrinfo" != "none required"; then
+ GETADDRINFO_LIB="$ac_cv_search_getaddrinfo"
+ fi
+fi
+
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+
+ HAVE_GETADDRINFO=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5
+printf %s "checking for getaddrinfo... " >&6; }
+if test ${gl_cv_func_getaddrinfo+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+getaddrinfo("", "", NULL, NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_getaddrinfo=yes
+else $as_nop
+ gl_cv_func_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getaddrinfo" >&5
+printf "%s\n" "$gl_cv_func_getaddrinfo" >&6; }
+ if test $gl_cv_func_getaddrinfo = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in ws2tcpip.h and -lws2_32" >&5
+printf %s "checking for getaddrinfo in ws2tcpip.h and -lws2_32... " >&6; }
+if test ${gl_cv_w32_getaddrinfo+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_w32_getaddrinfo=no
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+getaddrinfo(NULL, NULL, NULL, NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_w32_getaddrinfo=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$am_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getaddrinfo" >&5
+printf "%s\n" "$gl_cv_w32_getaddrinfo" >&6; }
+ if test "$gl_cv_w32_getaddrinfo" = "yes"; then
+ GETADDRINFO_LIB="-lws2_32"
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo with POSIX signature" >&5
+printf %s "checking for getaddrinfo with POSIX signature... " >&6; }
+if test ${gl_cv_func_getaddrinfo_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int getaddrinfo (const char *, const char *, const struct addrinfo *, struct addrinfo **);
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_getaddrinfo_posix_signature=yes
+else $as_nop
+ gl_cv_func_getaddrinfo_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getaddrinfo_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_getaddrinfo_posix_signature" >&6; }
+ if test $gl_cv_func_getaddrinfo_posix_signature = no; then
+ REPLACE_GETADDRINFO=1
+ fi
+ else
+ HAVE_GETADDRINFO=0
+ fi
+ fi
+
+printf "%s\n" "#define HAVE_GETADDRINFO $HAVE_GETADDRINFO" >>confdefs.h
+
+
+ # We can't use AC_REPLACE_FUNCS here because gai_strerror may be an
+ # inline function declared in ws2tcpip.h, so we need to get that
+ # header included somehow.
+ ac_fn_c_check_decl "$LINENO" "gai_strerror" "ac_cv_have_decl_gai_strerror" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+
+"
+if test "x$ac_cv_have_decl_gai_strerror" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GAI_STRERROR $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_gai_strerror = yes; then
+ ac_fn_c_check_decl "$LINENO" "gai_strerrorA" "ac_cv_have_decl_gai_strerrorA" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+
+"
+if test "x$ac_cv_have_decl_gai_strerrorA" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GAI_STRERRORA $ac_have_decl" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gai_strerror with POSIX signature" >&5
+printf %s "checking for gai_strerror with POSIX signature... " >&6; }
+if test ${gl_cv_func_gai_strerror_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *gai_strerror(int);
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_gai_strerror_posix_signature=yes
+else $as_nop
+ gl_cv_func_gai_strerror_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gai_strerror_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_gai_strerror_posix_signature" >&6; }
+ if test $gl_cv_func_gai_strerror_posix_signature = no; then
+ REPLACE_GAI_STRERROR=1
+ fi
+ fi
+
+ LIBS="$gai_saved_LIBS"
+
+
+
+
+
+
+
+
+ ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "
+#include <sys/types.h>
+#include <sys/socket.h>
+
+"
+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h
+
+
+fi
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "getaddrinfo" "ac_cv_have_decl_getaddrinfo" "
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_getaddrinfo" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETADDRINFO $ac_have_decl" >>confdefs.h
+ac_fn_c_check_decl "$LINENO" "freeaddrinfo" "ac_cv_have_decl_freeaddrinfo" "
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_freeaddrinfo" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_FREEADDRINFO $ac_have_decl" >>confdefs.h
+ac_fn_c_check_decl "$LINENO" "getnameinfo" "ac_cv_have_decl_getnameinfo" "
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_have_decl_getnameinfo" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETNAMEINFO $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_getaddrinfo = no; then
+ HAVE_DECL_GETADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_freeaddrinfo = no; then
+ HAVE_DECL_FREEADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_gai_strerror = no; then
+ HAVE_DECL_GAI_STRERROR=0
+ fi
+ if test $ac_cv_have_decl_getnameinfo = no; then
+ HAVE_DECL_GETNAMEINFO=0
+ fi
+
+ ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_type_struct_addrinfo" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_ADDRINFO 1" >>confdefs.h
+
+
+fi
+
+ if test $ac_cv_type_struct_addrinfo = no; then
+ HAVE_STRUCT_ADDRINFO=0
+ fi
+
+ case " $GETADDRINFO_LIB " in
+ *" $HOSTENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $HOSTENT_LIB" ;;
+ esac
+
+ case " $GETADDRINFO_LIB " in
+ *" $SERVENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;;
+ esac
+
+ case " $GETADDRINFO_LIB " in
+ *" $INET_NTOP_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;;
+ esac
+
+
+
+
+ if test $HAVE_GETADDRINFO = 0 || test $REPLACE_GETADDRINFO = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getaddrinfo.$ac_objext"
+
+ fi
+ if test $HAVE_DECL_GAI_STRERROR = 0 || test $REPLACE_GAI_STRERROR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS gai_strerror.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETADDRINFO=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETADDRINFO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ gl_abort_bug=no
+ case "$host_os" in
+ mingw*)
+ gl_cv_func_getcwd_path_max=yes
+ ;;
+ *)
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd handles long file names properly" >&5
+printf %s "checking whether getcwd handles long file names properly... " >&6; }
+if test ${gl_cv_func_getcwd_path_max+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir3"
+ if test "$cross_compiling" = yes
+then :
+ # Cross-compilation guesses:
+ case "$host_os" in
+ aix*) # On AIX, it has the AIX bug.
+ gl_cv_func_getcwd_path_max='guessing no, it has the AIX bug' ;;
+ gnu*) # On Hurd, it is 'yes'.
+ gl_cv_func_getcwd_path_max='guessing yes' ;;
+ linux* | kfreebsd*)
+ # On older Linux+glibc it's 'no, but it is partly working',
+ # on newer Linux+glibc it's 'yes'.
+ # On Linux+musl libc, it's 'no, but it is partly working'.
+ # On kFreeBSD+glibc, it's 'no, but it is partly working'.
+ gl_cv_func_getcwd_path_max='guessing no, but it is partly working' ;;
+ *) # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_getcwd_path_max="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else
+# include <direct.h>
+#endif
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Use the getcwd function, not any macro. */
+#undef getcwd
+
+
+
+$gl_mda_defines
+
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* The length of this name must be 8. */
+#define DIR_NAME "confdir3"
+#define DIR_NAME_LEN 8
+#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)
+
+/* The length of "../". */
+#define DOTDOTSLASH_LEN 3
+
+/* Leftover bytes in the buffer, to work around library or OS bugs. */
+#define BUF_SLOP 20
+
+int
+main ()
+{
+#ifndef PATH_MAX
+ /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
+ at least not on a local file system. And if we were to start worrying
+ about remote file systems, we'd have to enable the wrapper function
+ all of the time, just to be safe. That's not worth the cost. */
+ exit (0);
+#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
+ - DIR_NAME_SIZE - BUF_SLOP) \
+ <= PATH_MAX)
+ /* FIXME: Assuming there's a system for which this is true,
+ this should be done in a compile test. */
+ exit (0);
+#else
+ char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
+ + DIR_NAME_SIZE + BUF_SLOP];
+ char *cwd = getcwd (buf, PATH_MAX);
+ size_t initial_cwd_len;
+ size_t cwd_len;
+ int fail = 0;
+ size_t n_chdirs = 0;
+
+ if (cwd == NULL)
+ exit (10);
+
+ cwd_len = initial_cwd_len = strlen (cwd);
+
+ while (1)
+ {
+ size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
+ char *c = NULL;
+
+ cwd_len += DIR_NAME_SIZE;
+ /* If mkdir or chdir fails, it could be that this system cannot create
+ any file with an absolute name longer than PATH_MAX, such as cygwin.
+ If so, leave fail as 0, because the current working directory can't
+ be too long for getcwd if it can't even be created. On Linux with
+ the 9p file system, mkdir fails with error EINVAL when cwd_len gets
+ too long; ignore this failure because the getcwd() system call
+ produces good results whereas the gnulib substitute calls getdents64
+ which fails with error EPROTO.
+ For other errors, be pessimistic and consider that as a failure,
+ too. */
+ if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
+ {
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ #ifdef __linux__
+ if (! (errno == EINVAL))
+ #endif
+ fail = 20;
+ break;
+ }
+
+ if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+ {
+ struct stat sb;
+
+ c = getcwd (buf, PATH_MAX);
+ if (!c && errno == ENOENT)
+ {
+ fail = 11;
+ break;
+ }
+ if (c)
+ {
+ fail = 31;
+ break;
+ }
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ {
+ fail = 21;
+ break;
+ }
+
+ /* Our replacement needs to be able to stat() long ../../paths,
+ so generate a path larger than PATH_MAX to check,
+ avoiding the replacement if we can't stat(). */
+ c = getcwd (buf, cwd_len + 1);
+ if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno))
+ {
+ fail = 32;
+ break;
+ }
+ }
+
+ if (dotdot_max <= cwd_len - initial_cwd_len)
+ {
+ if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
+ break;
+ c = getcwd (buf, cwd_len + 1);
+ if (!c)
+ {
+ if (! (errno == ERANGE || errno == ENOENT
+ || is_ENAMETOOLONG (errno)))
+ {
+ fail = 22;
+ break;
+ }
+ if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+ {
+ fail = 12;
+ break;
+ }
+ }
+ }
+
+ if (c && strlen (c) != cwd_len)
+ {
+ fail = 23;
+ break;
+ }
+ ++n_chdirs;
+ }
+
+ /* Leaving behind such a deep directory is not polite.
+ So clean up here, right away, even though the driving
+ shell script would also clean up. */
+ {
+ size_t i;
+
+ /* Try rmdir first, in case the chdir failed. */
+ rmdir (DIR_NAME);
+ for (i = 0; i <= n_chdirs; i++)
+ {
+ if (chdir ("..") < 0)
+ break;
+ if (rmdir (DIR_NAME) != 0)
+ break;
+ }
+ }
+
+ exit (fail);
+#endif
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getcwd_path_max=yes
+else $as_nop
+ case $? in
+ 10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+ 31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';;
+ 32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';;
+ *) gl_cv_func_getcwd_path_max=no;;
+ esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_path_max" >&5
+printf "%s\n" "$gl_cv_func_getcwd_path_max" >&6; }
+
+ case "$gl_cv_func_getcwd_null" in
+ *yes)
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpagesize" >&5
+printf %s "checking for getpagesize... " >&6; }
+if test ${gl_cv_func_getpagesize+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+int
+main (void)
+{
+return getpagesize();
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_getpagesize=yes
+else $as_nop
+ gl_cv_func_getpagesize=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getpagesize" >&5
+printf "%s\n" "$gl_cv_func_getpagesize" >&6; }
+
+ if test $gl_cv_func_getpagesize = yes; then
+
+printf "%s\n" "#define HAVE_GETPAGESIZE 1" >>confdefs.h
+
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getcwd succeeds when 4k < cwd_length < 16k" >&5
+printf %s "checking whether getcwd succeeds when 4k < cwd_length < 16k... " >&6; }
+if test ${gl_cv_func_getcwd_succeeds_beyond_4k+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Remove any remnants of a previous test.
+ rm -rf confdir-14B---
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir-14B---"
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getcwd_succeeds_beyond_4k="guessing yes" ;;
+ # Guess no otherwise, even on glibc systems.
+ *) gl_cv_func_getcwd_succeeds_beyond_4k="guessing no"
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <direct.h>
+#endif
+#include <string.h>
+#include <sys/stat.h>
+
+
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+
+
+
+$gl_mda_defines
+
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* FIXME: skip the run-test altogether on systems without getpagesize. */
+#if ! HAVE_GETPAGESIZE
+# define getpagesize() 0
+#endif
+
+/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
+ the 16kB pagesize on ia64 linux. Those conditions make the code below
+ trigger a bug in glibc's getcwd implementation before 2.4.90-10. */
+#define TARGET_LEN (5 * 1024)
+
+int
+main ()
+{
+ char *cwd;
+ size_t initial_cwd_len;
+ int fail = 0;
+
+ /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+ this relatively expensive and invasive test if that's not true. */
+#ifdef PATH_MAX
+ int bug_possible = PATH_MAX < getpagesize ();
+#else
+ int bug_possible = 0;
+#endif
+ if (! bug_possible)
+ return 0;
+
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ return 2;
+
+ initial_cwd_len = strlen (cwd);
+ free (cwd);
+
+ if (1)
+ {
+ static char const dir_name[] = "confdir-14B---";
+ size_t desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+ / sizeof dir_name);
+ size_t d;
+ for (d = 0; d < desired_depth; d++)
+ {
+ if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+ {
+ if (! (errno == ERANGE || errno == ENAMETOOLONG
+ || errno == ENOENT))
+ fail = 3; /* Unable to construct deep hierarchy. */
+ break;
+ }
+ }
+
+ /* If libc has the bug in question, this invocation of getcwd
+ results in a failed assertion. */
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ fail = 4; /* getcwd didn't assert, but it failed for a long name
+ where the answer could have been learned. */
+ free (cwd);
+
+ /* Call rmdir first, in case the above chdir failed. */
+ rmdir (dir_name);
+ while (0 < d--)
+ {
+ if (chdir ("..") < 0)
+ {
+ fail = 5;
+ break;
+ }
+ rmdir (dir_name);
+ }
+ }
+
+ return fail;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getcwd_succeeds_beyond_4k=yes
+else $as_nop
+ ret=$?
+ if test $ret -ge 128 || test $ret = 4; then
+ gl_cv_func_getcwd_succeeds_beyond_4k=no
+ else
+ gl_cv_func_getcwd_succeeds_beyond_4k=yes
+ fi
+
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getcwd_succeeds_beyond_4k" >&5
+printf "%s\n" "$gl_cv_func_getcwd_succeeds_beyond_4k" >&6; }
+ case "$gl_cv_func_getcwd_succeeds_beyond_4k" in
+ *no)
+ gl_abort_bug=yes
+ ;;
+ *)
+
+ ;;
+ esac
+
+ ;;
+ esac
+ ;;
+ esac
+ case "$gl_cv_func_getcwd_path_max" in
+ *"no" | *"no, it has the AIX bug") ;;
+ *)
+
+printf "%s\n" "#define HAVE_MINIMALLY_WORKING_GETCWD 1" >>confdefs.h
+
+ ;;
+ esac
+ case "$gl_cv_func_getcwd_path_max" in
+ *"no, but it is partly working")
+
+printf "%s\n" "#define HAVE_PARTLY_WORKING_GETCWD 1" >>confdefs.h
+
+ ;;
+ *"yes, but with shorter paths")
+
+printf "%s\n" "#define HAVE_GETCWD_SHORTER 1" >>confdefs.h
+
+ ;;
+ esac
+
+ if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
+ || test $gl_cv_func_getcwd_posix_signature != yes \
+ || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
+ || test $gl_abort_bug = yes; then
+ REPLACE_GETCWD=1
+ fi
+
+ if test $REPLACE_GETCWD = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getcwd.$ac_objext"
+
+
+
+
+ :
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_GETCWD 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_GETCWD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCWD 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
+ *yes,yes) ;;
+ *)
+ REPLACE_GETCWD=1
+ ;;
+ esac
+
+ if test $REPLACE_GETCWD = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getcwd-lgpl.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETCWD=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETCWD 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_getdelim = yes; then
+ HAVE_GETDELIM=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getdelim function" >&5
+printf %s "checking for working getdelim function... " >&6; }
+if test ${gl_cv_func_working_getdelim+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1
+then :
+ gl_cv_func_working_getdelim="guessing yes"
+else $as_nop
+ case "$host_os" in
+ *-musl*) gl_cv_func_working_getdelim="guessing yes" ;;
+ *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getdelim (&line, &siz, '\n', in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ { free (line); fclose (in); return 2; }
+ free (line);
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getdelim (&line, &siz, '\n', in) == -1)
+ { fclose (in); return 3; }
+ free (line);
+ }
+ fclose (in);
+ return 0;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_working_getdelim=yes
+else $as_nop
+ gl_cv_func_working_getdelim=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_getdelim" >&5
+printf "%s\n" "$gl_cv_func_working_getdelim" >&6; }
+ case "$gl_cv_func_working_getdelim" in
+ *yes) ;;
+ *) REPLACE_GETDELIM=1 ;;
+ esac
+ else
+ HAVE_GETDELIM=0
+ fi
+
+ if test $ac_cv_have_decl_getdelim = no; then
+ HAVE_DECL_GETDELIM=0
+ fi
+
+ if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getdelim.$ac_objext"
+
+
+ ac_fn_c_check_func "$LINENO" "flockfile" "ac_cv_func_flockfile"
+if test "x$ac_cv_func_flockfile" = xyes
+then :
+ printf "%s\n" "#define HAVE_FLOCKFILE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "funlockfile" "ac_cv_func_funlockfile"
+if test "x$ac_cv_func_funlockfile" = xyes
+then :
+ printf "%s\n" "#define HAVE_FUNLOCKFILE 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_decl "$LINENO" "getc_unlocked" "ac_cv_have_decl_getc_unlocked" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getc_unlocked" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_GETC_UNLOCKED $ac_have_decl" >>confdefs.h
+
+
+ fi
+
+
+
+
+
+ GNULIB_GETDELIM=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETDELIM 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_getdtablesize = yes &&
+ test $ac_cv_have_decl_getdtablesize = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5
+printf %s "checking whether getdtablesize works... " >&6; }
+if test ${gl_cv_func_getdtablesize_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
+ *)
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
+ gl_cv_func_getdtablesize_works="guessing no" ;;
+ *) gl_cv_func_getdtablesize_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <unistd.h>
+
+
+$gl_mda_defines
+
+
+int
+main (void)
+{
+int size = getdtablesize();
+ if (dup2 (0, getdtablesize()) != -1)
+ return 1;
+ if (size != getdtablesize())
+ return 2;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getdtablesize_works=yes
+else $as_nop
+ gl_cv_func_getdtablesize_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5
+printf "%s\n" "$gl_cv_func_getdtablesize_works" >&6; }
+ case "$gl_cv_func_getdtablesize_works" in
+ *yes | "no (limitation)") ;;
+ *) REPLACE_GETDTABLESIZE=1 ;;
+ esac
+ else
+ HAVE_GETDTABLESIZE=0
+ fi
+
+ if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_GETDTABLESIZE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups"
+if test "x$ac_cv_func_getgroups" = xyes
+then :
+
+fi
+
+
+ # If we don't yet have getgroups, see if it's in -lbsd.
+ # This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1.
+ ac_save_LIBS=$LIBS
+ if test $ac_cv_func_getgroups = no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getgroups in -lbsd" >&5
+printf %s "checking for getgroups in -lbsd... " >&6; }
+if test ${ac_cv_lib_bsd_getgroups+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $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. */
+char getgroups ();
+int
+main (void)
+{
+return getgroups ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_bsd_getgroups=yes
+else $as_nop
+ ac_cv_lib_bsd_getgroups=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_getgroups" >&5
+printf "%s\n" "$ac_cv_lib_bsd_getgroups" >&6; }
+if test "x$ac_cv_lib_bsd_getgroups" = xyes
+then :
+ GETGROUPS_LIB=-lbsd
+fi
+
+ fi
+
+ # Run the program to test the functionality of the system-supplied
+ # getgroups function only if there is such a function.
+ if test $ac_cv_func_getgroups = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getgroups" >&5
+printf %s "checking for working getgroups... " >&6; }
+if test ${ac_cv_func_getgroups_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) ac_cv_func_getgroups_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) ac_cv_func_getgroups_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) ac_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+/* On NeXTstep 3.2, getgroups (0, 0) always fails. */
+ return getgroups (0, 0) == -1;
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_getgroups_works=yes
+else $as_nop
+ ac_cv_func_getgroups_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getgroups_works" >&5
+printf "%s\n" "$ac_cv_func_getgroups_works" >&6; }
+ else
+ ac_cv_func_getgroups_works=no
+ fi
+ case "$ac_cv_func_getgroups_works" in
+ *yes)
+
+printf "%s\n" "#define HAVE_GETGROUPS 1" >>confdefs.h
+
+ ;;
+ esac
+ LIBS=$ac_save_LIBS
+
+ if test $ac_cv_func_getgroups != yes; then
+ HAVE_GETGROUPS=0
+ else
+ if test "$ac_cv_type_getgroups" != gid_t \
+ || { case "$ac_cv_func_getgroups_works" in
+ *yes) false;;
+ *) true;;
+ esac
+ }; then
+ REPLACE_GETGROUPS=1
+
+printf "%s\n" "#define GETGROUPS_ZERO_BUG 1" >>confdefs.h
+
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getgroups handles negative values" >&5
+printf %s "checking whether getgroups handles negative values... " >&6; }
+if test ${gl_cv_func_getgroups_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_getgroups_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getgroups_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+int size = getgroups (0, 0);
+ gid_t *list = malloc (size * sizeof *list);
+ int result = getgroups (-1, list) != -1;
+ free (list);
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_getgroups_works=yes
+else $as_nop
+ gl_cv_func_getgroups_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getgroups_works" >&5
+printf "%s\n" "$gl_cv_func_getgroups_works" >&6; }
+ case "$gl_cv_func_getgroups_works" in
+ *yes) ;;
+ *) REPLACE_GETGROUPS=1 ;;
+ esac
+ fi
+ fi
+ test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS"
+
+ if test $HAVE_GETGROUPS = 0 || test $REPLACE_GETGROUPS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getgroups.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETGROUPS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETGROUPS 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ gl_getline_needs_run_time_check=no
+ ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline"
+if test "x$ac_cv_func_getline" = xyes
+then :
+ gl_getline_needs_run_time_check=yes
+else $as_nop
+ am_cv_func_working_getline=no
+fi
+
+ if test $gl_getline_needs_run_time_check = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working getline function" >&5
+printf %s "checking for working getline function... " >&6; }
+if test ${am_cv_func_working_getline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1
+then :
+ am_cv_func_working_getline="guessing yes"
+else $as_nop
+ case "$host_os" in
+ *-musl*) am_cv_func_working_getline="guessing yes" ;;
+ *) am_cv_func_working_getline="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getline (&line, &siz, in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ { free (line); fclose (in); return 2; }
+ free (line);
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getline (&line, &siz, in) == -1)
+ { fclose (in); return 3; }
+ free (line);
+ }
+ fclose (in);
+ return 0;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ am_cv_func_working_getline=yes
+else $as_nop
+ am_cv_func_working_getline=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_working_getline" >&5
+printf "%s\n" "$am_cv_func_working_getline" >&6; }
+ fi
+
+ if test $ac_cv_have_decl_getline = no; then
+ HAVE_DECL_GETLINE=0
+ fi
+
+ case "$am_cv_func_working_getline" in
+ *yes) ;;
+ *)
+ REPLACE_GETLINE=1
+ ;;
+ esac
+
+ if test $REPLACE_GETLINE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getline.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_GETLINE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETLINE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ REPLACE_GETOPT=0
+ if test -n "$gl_replace_getopt"; then
+ REPLACE_GETOPT=1
+ fi
+
+ if test $REPLACE_GETOPT = 1; then
+
+
+ if test $ac_cv_header_sys_cdefs_h = yes; then
+ HAVE_SYS_CDEFS_H=1
+ else
+ HAVE_SYS_CDEFS_H=0
+ fi
+
+
+
+printf "%s\n" "#define __GETOPT_PREFIX rpl_" >>confdefs.h
+
+ GETOPT_H=getopt.h
+ GETOPT_CDEFS_H=getopt-cdefs.h
+
+
+
+ fi
+
+ if test $REPLACE_GETOPT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getopt.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getopt1.$ac_objext"
+
+ GNULIB_GL_UNISTD_H_GETOPT=1
+ fi
+
+
+
+
+
+
+ GNULIB_GETOPT_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETOPT_POSIX 1" >>confdefs.h
+
+
+
+
+ if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getpass.$ac_objext"
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "__fsetlocking" "ac_cv_have_decl___fsetlocking" "#include <stdio.h>
+ #if HAVE_STDIO_EXT_H
+ #include <stdio_ext.h>
+ #endif
+"
+if test "x$ac_cv_have_decl___fsetlocking" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL___FSETLOCKING $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcgetattr" >&5
+printf %s "checking for tcgetattr... " >&6; }
+if test ${gl_cv_func_tcgetattr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termios.h>
+ struct termios x;
+
+int
+main (void)
+{
+return tcgetattr(0,&x);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_tcgetattr=yes
+else $as_nop
+ gl_cv_func_tcgetattr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcgetattr" >&5
+printf "%s\n" "$gl_cv_func_tcgetattr" >&6; }
+ if test $gl_cv_func_tcgetattr = yes; then
+ HAVE_TCGETATTR=1
+ else
+ HAVE_TCGETATTR=0
+ fi
+
+printf "%s\n" "#define HAVE_TCGETATTR $HAVE_TCGETATTR" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcsetattr" >&5
+printf %s "checking for tcsetattr... " >&6; }
+if test ${gl_cv_func_tcsetattr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termios.h>
+ struct termios x;
+
+int
+main (void)
+{
+return tcsetattr(0,0,&x);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_tcsetattr=yes
+else $as_nop
+ gl_cv_func_tcsetattr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcsetattr" >&5
+printf "%s\n" "$gl_cv_func_tcsetattr" >&6; }
+ if test $gl_cv_func_tcsetattr = yes; then
+ HAVE_TCSETATTR=1
+ else
+ HAVE_TCSETATTR=0
+ fi
+
+printf "%s\n" "#define HAVE_TCSETATTR $HAVE_TCSETATTR" >>confdefs.h
+
+
+ fi
+
+
+
+
+
+ GNULIB_GETPASS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETPASS 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $ac_cv_func_getpass = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpass without length limitations" >&5
+printf %s "checking for getpass without length limitations... " >&6; }
+if test ${gl_cv_func_getpass_good+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky GNU user" >/dev/null 2>&1
+then :
+ gl_cv_func_getpass_good=yes
+else $as_nop
+ gl_cv_func_getpass_good=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getpass_good" >&5
+printf "%s\n" "$gl_cv_func_getpass_good" >&6; }
+ if test $gl_cv_func_getpass_good != yes; then
+ REPLACE_GETPASS=1
+ fi
+ fi
+
+ if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getpass.$ac_objext"
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "__fsetlocking" "ac_cv_have_decl___fsetlocking" "#include <stdio.h>
+ #if HAVE_STDIO_EXT_H
+ #include <stdio_ext.h>
+ #endif
+"
+if test "x$ac_cv_have_decl___fsetlocking" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL___FSETLOCKING $ac_have_decl" >>confdefs.h
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcgetattr" >&5
+printf %s "checking for tcgetattr... " >&6; }
+if test ${gl_cv_func_tcgetattr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termios.h>
+ struct termios x;
+
+int
+main (void)
+{
+return tcgetattr(0,&x);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_tcgetattr=yes
+else $as_nop
+ gl_cv_func_tcgetattr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcgetattr" >&5
+printf "%s\n" "$gl_cv_func_tcgetattr" >&6; }
+ if test $gl_cv_func_tcgetattr = yes; then
+ HAVE_TCGETATTR=1
+ else
+ HAVE_TCGETATTR=0
+ fi
+
+printf "%s\n" "#define HAVE_TCGETATTR $HAVE_TCGETATTR" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tcsetattr" >&5
+printf %s "checking for tcsetattr... " >&6; }
+if test ${gl_cv_func_tcsetattr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <termios.h>
+ struct termios x;
+
+int
+main (void)
+{
+return tcsetattr(0,0,&x);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_tcsetattr=yes
+else $as_nop
+ gl_cv_func_tcsetattr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_tcsetattr" >&5
+printf "%s\n" "$gl_cv_func_tcsetattr" >&6; }
+ if test $gl_cv_func_tcsetattr = yes; then
+ HAVE_TCSETATTR=1
+ else
+ HAVE_TCSETATTR=0
+ fi
+
+printf "%s\n" "#define HAVE_TCSETATTR $HAVE_TCSETATTR" >>confdefs.h
+
+
+ fi
+
+
+
+
+
+ GNULIB_GETPASS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETPASS 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getpeername.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETPEERNAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETPEERNAME 1" >>confdefs.h
+
+
+
+
+
+
+ ac_found=0
+ ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
+"
+if test "x$ac_cv_have_decl_program_invocation_name" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+ ac_found=1
+fi
+
+ ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
+"
+if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+ ac_found=1
+fi
+
+ ac_fn_c_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include <stdlib.h>
+"
+if test "x$ac_cv_have_decl___argv" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL___ARGV $ac_have_decl" >>confdefs.h
+if test $ac_have_decl = 1
+then :
+ ac_found=1
+fi
+
+
+ # Incur the cost of this test only if none of the above worked.
+ if test $ac_found = 0; then
+ # On OpenBSD 5.1, using the global __progname variable appears to be
+ # the only way to implement getprogname.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5
+printf %s "checking whether __progname is defined in default libraries... " >&6; }
+if test ${gl_cv_var___progname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_var___progname=
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern char *__progname;
+int
+main (void)
+{
+return *__progname;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_var___progname=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5
+printf "%s\n" "$gl_cv_var___progname" >&6; }
+ if test "$gl_cv_var___progname" = yes; then
+
+printf "%s\n" "#define HAVE_VAR___PROGNAME 1" >>confdefs.h
+
+ fi
+ fi
+
+
+
+
+
+ if test "$ac_cv_func_getrandom" != yes; then
+ HAVE_GETRANDOM=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getrandom is compatible with its GNU+BSD signature" >&5
+printf %s "checking whether getrandom is compatible with its GNU+BSD signature... " >&6; }
+if test ${gl_cv_func_getrandom_ok+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Additional includes are needed before <sys/random.h> on uClibc
+ and Mac OS X. */
+ #include <sys/types.h>
+ #include <stdlib.h>
+ #include <sys/random.h>
+ ssize_t getrandom (void *, size_t, unsigned int);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_getrandom_ok=yes
+else $as_nop
+ gl_cv_func_getrandom_ok=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getrandom_ok" >&5
+printf "%s\n" "$gl_cv_func_getrandom_ok" >&6; }
+ if test $gl_cv_func_getrandom_ok = no; then
+ REPLACE_GETRANDOM=1
+ fi
+ fi
+
+ case "$host_os" in
+ mingw*)
+ ac_fn_c_check_header_compile "$LINENO" "bcrypt.h" "ac_cv_header_bcrypt_h" "#include <windows.h>
+
+"
+if test "x$ac_cv_header_bcrypt_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_BCRYPT_H 1" >>confdefs.h
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the bcrypt library is guaranteed to be present" >&5
+printf %s "checking whether the bcrypt library is guaranteed to be present... " >&6; }
+if test ${gl_cv_lib_assume_bcrypt+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <windows.h>
+int
+main (void)
+{
+#if !(_WIN32_WINNT >= _WIN32_WINNT_WIN7)
+ cannot assume it
+ #endif
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_lib_assume_bcrypt=yes
+else $as_nop
+ gl_cv_lib_assume_bcrypt=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_lib_assume_bcrypt" >&5
+printf "%s\n" "$gl_cv_lib_assume_bcrypt" >&6; }
+ if test $gl_cv_lib_assume_bcrypt = yes; then
+
+printf "%s\n" "#define HAVE_LIB_BCRYPT 1" >>confdefs.h
+
+ LIB_GETRANDOM='-lbcrypt'
+ else
+ LIB_GETRANDOM='-ladvapi32'
+ fi
+ ;;
+ *)
+ LIB_GETRANDOM= ;;
+ esac
+
+
+ if test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getrandom.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETRANDOM=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETRANDOM 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS getsockname.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_GETSOCKNAME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETSOCKNAME 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gl_gettimeofday_timezone=void
+ if test $ac_cv_func_gettimeofday != yes; then
+ HAVE_GETTIMEOFDAY=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gettimeofday with POSIX signature" >&5
+printf %s "checking for gettimeofday with POSIX signature... " >&6; }
+if test ${gl_cv_func_gettimeofday_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/time.h>
+ struct timeval c;
+ int gettimeofday (struct timeval *restrict, void *restrict);
+
+int
+main (void)
+{
+/* glibc uses struct timezone * rather than the POSIX void *
+ if _GNU_SOURCE is defined. However, since the only portable
+ use of gettimeofday uses NULL as the second parameter, and
+ since the glibc definition is actually more typesafe, it is
+ not worth wrapping this to get a compliant signature. */
+ int (*f) (struct timeval *restrict, void *restrict)
+ = gettimeofday;
+ int x = f (&c, 0);
+ return !(x | c.tv_sec | c.tv_usec);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_gettimeofday_posix_signature=yes
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/time.h>
+int gettimeofday (struct timeval *restrict, struct timezone *restrict);
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_gettimeofday_posix_signature=almost
+else $as_nop
+ gl_cv_func_gettimeofday_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_gettimeofday_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_gettimeofday_posix_signature" >&6; }
+ if test $gl_cv_func_gettimeofday_posix_signature = almost; then
+ gl_gettimeofday_timezone='struct timezone'
+ elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
+ REPLACE_GETTIMEOFDAY=1
+ fi
+ if test $REPLACE_STRUCT_TIMEVAL = 1; then
+ REPLACE_GETTIMEOFDAY=1
+ fi
+ case "$host_os" in
+ mingw*) REPLACE_GETTIMEOFDAY=1 ;;
+ esac
+ fi
+
+printf "%s\n" "#define GETTIMEOFDAY_TIMEZONE $gl_gettimeofday_timezone" >>confdefs.h
+
+
+ if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS gettimeofday.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_GETTIMEOFDAY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GETTIMEOFDAY 1" >>confdefs.h
+
+
+
+ # Autoconf 2.61a.99 and earlier don't support linking a file only
+ # in VPATH builds. But since GNUmakefile is for maintainer use
+ # only, it does not matter if we skip the link with older autoconf.
+ # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
+ # builds, so use a shell variable to bypass this.
+ GNUmakefile=GNUmakefile
+ ac_config_links="$ac_config_links $GNUmakefile:$GNUmakefile"
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "group_member" "ac_cv_func_group_member"
+if test "x$ac_cv_func_group_member" = xyes
+then :
+
+else $as_nop
+
+ HAVE_GROUP_MEMBER=0
+
+fi
+
+
+ if test $HAVE_GROUP_MEMBER = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS group-member.$ac_objext"
+
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_GROUP_MEMBER=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_GROUP_MEMBER 1" >>confdefs.h
+
+
+
+
+ LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL"
+
+
+
+ HOSTENT_LIB=
+ gl_saved_libs="$LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+printf %s "checking for library containing gethostbyname... " >&6; }
+if test ${ac_cv_search_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char gethostbyname ();
+int
+main (void)
+{
+return gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl network net
+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_gethostbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_gethostbyname+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_gethostbyname+y}
+then :
+
+else $as_nop
+ ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+printf "%s\n" "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_gethostbyname" != "none required"; then
+ HOSTENT_LIB="$ac_cv_search_gethostbyname"
+ fi
+fi
+
+ LIBS="$gl_saved_libs"
+ if test -z "$HOSTENT_LIB"; then
+
+ for ac_func in gethostbyname
+do :
+ ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in winsock2.h and -lws2_32" >&5
+printf %s "checking for gethostbyname in winsock2.h and -lws2_32... " >&6; }
+if test ${gl_cv_w32_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_w32_gethostbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+gethostbyname(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_w32_gethostbyname=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gl_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_gethostbyname" >&5
+printf "%s\n" "$gl_cv_w32_gethostbyname" >&6; }
+ if test "$gl_cv_w32_gethostbyname" = "yes"; then
+ HOSTENT_LIB="-lws2_32"
+ fi
+
+fi
+
+done
+ fi
+
+
+
+
+
+
+
+
+ GNULIB_ICONV=1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_iconv_h='<'iconv.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <iconv.h>" >&5
+printf %s "checking absolute name of <iconv.h>... " >&6; }
+if test ${gl_cv_next_iconv_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_iconv_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <iconv.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'iconv.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_iconv_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_iconv_h
+ gl_cv_next_iconv_h='"'$gl_header'"'
+ else
+ gl_cv_next_iconv_h='<'iconv.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_iconv_h" >&5
+printf "%s\n" "$gl_cv_next_iconv_h" >&6; }
+ fi
+ NEXT_ICONV_H=$gl_cv_next_iconv_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'iconv.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_iconv_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_ICONV_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HAVE_INET_NTOP=1
+ INET_NTOP_LIB=
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+ if test $HAVE_WINSOCK2_H = 1; then
+ REPLACE_INET_NTOP=1
+ ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <ws2tcpip.h>
+"
+if test "x$ac_cv_have_decl_inet_ntop" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_INET_NTOP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_inet_ntop = yes; then
+ INET_NTOP_LIB="-lws2_32"
+ else
+ HAVE_DECL_INET_NTOP=0
+ fi
+ else
+ gl_save_LIBS=$LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5
+printf %s "checking for library containing inet_ntop... " >&6; }
+if test ${ac_cv_search_inet_ntop+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char inet_ntop ();
+int
+main (void)
+{
+return inet_ntop ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' nsl resolv network
+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_inet_ntop=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_inet_ntop+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_inet_ntop+y}
+then :
+
+else $as_nop
+ ac_cv_search_inet_ntop=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5
+printf "%s\n" "$ac_cv_search_inet_ntop" >&6; }
+ac_res=$ac_cv_search_inet_ntop
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else $as_nop
+ ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop"
+if test "x$ac_cv_func_inet_ntop" = xyes
+then :
+ printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_inet_ntop = no; then
+ HAVE_INET_NTOP=0
+ fi
+
+fi
+
+ LIBS=$gl_save_LIBS
+
+ if test "$ac_cv_search_inet_ntop" != "no" \
+ && test "$ac_cv_search_inet_ntop" != "none required"; then
+ INET_NTOP_LIB="$ac_cv_search_inet_ntop"
+ fi
+
+
+ ac_fn_c_check_decl "$LINENO" "inet_ntop" "ac_cv_have_decl_inet_ntop" "#include <arpa/inet.h>
+ #if HAVE_NETDB_H
+ # include <netdb.h>
+ #endif
+
+"
+if test "x$ac_cv_have_decl_inet_ntop" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_INET_NTOP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_inet_ntop = no; then
+ HAVE_DECL_INET_NTOP=0
+ fi
+ fi
+
+
+ if test $HAVE_INET_NTOP = 0 || test $REPLACE_INET_NTOP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS inet_ntop.$ac_objext"
+
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_INET_NTOP=1
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler generally respects inline" >&5
+printf %s "checking whether the compiler generally respects inline... " >&6; }
+if test ${gl_cv_c_inline_effective+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $ac_cv_c_inline = no; then
+ gl_cv_c_inline_effective=no
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifdef __NO_INLINE__
+ #error "inline is not effective"
+ #endif
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_c_inline_effective=yes
+else $as_nop
+ gl_cv_c_inline_effective=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_inline_effective" >&5
+printf "%s\n" "$gl_cv_c_inline_effective" >&6; }
+ if test $gl_cv_c_inline_effective = yes; then
+
+printf "%s\n" "#define HAVE_INLINE 1" >>confdefs.h
+
+ fi
+
+
+
+
+ PRIPTR_PREFIX=
+ if test -n "$STDINT_H"; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifdef _WIN64
+ LLP64
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ PRIPTR_PREFIX='"l"'
+else $as_nop
+ PRIPTR_PREFIX='"ll"'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ else
+ for glpfx in '' l ll I64; do
+ case $glpfx in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ I64) gltype1='__int64';;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdint.h>
+ extern intptr_t foo;
+ extern $gltype1 foo;
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ PRIPTR_PREFIX='"'$glpfx'"'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test -n "$PRIPTR_PREFIX" && break
+ done
+ fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether INT32_MAX < INTMAX_MAX" >&5
+printf %s "checking whether INT32_MAX < INTMAX_MAX... " >&6; }
+if test ${gl_cv_test_INT32_MAX_LT_INTMAX_MAX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if defined INT32_MAX && defined INTMAX_MAX
+ #define CONDITION (INT32_MAX < INTMAX_MAX)
+ #else
+ #define CONDITION (sizeof (int) < sizeof (long long int))
+ #endif
+ int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_test_INT32_MAX_LT_INTMAX_MAX=yes
+else $as_nop
+ gl_cv_test_INT32_MAX_LT_INTMAX_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&5
+printf "%s\n" "$gl_cv_test_INT32_MAX_LT_INTMAX_MAX" >&6; }
+ if test $gl_cv_test_INT32_MAX_LT_INTMAX_MAX = yes; then
+ INT32_MAX_LT_INTMAX_MAX=1;
+ else
+ INT32_MAX_LT_INTMAX_MAX=0;
+ fi
+
+
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether INT64_MAX == LONG_MAX" >&5
+printf %s "checking whether INT64_MAX == LONG_MAX... " >&6; }
+if test ${gl_cv_test_INT64_MAX_EQ_LONG_MAX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if defined INT64_MAX
+ #define CONDITION (INT64_MAX == LONG_MAX)
+ #else
+ #define CONDITION (sizeof (long long int) == sizeof (long int))
+ #endif
+ int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_test_INT64_MAX_EQ_LONG_MAX=yes
+else $as_nop
+ gl_cv_test_INT64_MAX_EQ_LONG_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&5
+printf "%s\n" "$gl_cv_test_INT64_MAX_EQ_LONG_MAX" >&6; }
+ if test $gl_cv_test_INT64_MAX_EQ_LONG_MAX = yes; then
+ INT64_MAX_EQ_LONG_MAX=1;
+ else
+ INT64_MAX_EQ_LONG_MAX=0;
+ fi
+
+
+ else
+ INT64_MAX_EQ_LONG_MAX=-1
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UINT32_MAX < UINTMAX_MAX" >&5
+printf %s "checking whether UINT32_MAX < UINTMAX_MAX... " >&6; }
+if test ${gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if defined UINT32_MAX && defined UINTMAX_MAX
+ #define CONDITION (UINT32_MAX < UINTMAX_MAX)
+ #else
+ #define CONDITION (sizeof (unsigned int) < sizeof (unsigned long long int))
+ #endif
+ int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=yes
+else $as_nop
+ gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&5
+printf "%s\n" "$gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX" >&6; }
+ if test $gl_cv_test_UINT32_MAX_LT_UINTMAX_MAX = yes; then
+ UINT32_MAX_LT_UINTMAX_MAX=1;
+ else
+ UINT32_MAX_LT_UINTMAX_MAX=0;
+ fi
+
+
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UINT64_MAX == ULONG_MAX" >&5
+printf %s "checking whether UINT64_MAX == ULONG_MAX... " >&6; }
+if test ${gl_cv_test_UINT64_MAX_EQ_ULONG_MAX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if defined UINT64_MAX
+ #define CONDITION (UINT64_MAX == ULONG_MAX)
+ #else
+ #define CONDITION (sizeof (unsigned long long int) == sizeof (unsigned long int))
+ #endif
+ int test[CONDITION ? 1 : -1];
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=yes
+else $as_nop
+ gl_cv_test_UINT64_MAX_EQ_ULONG_MAX=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&5
+printf "%s\n" "$gl_cv_test_UINT64_MAX_EQ_ULONG_MAX" >&6; }
+ if test $gl_cv_test_UINT64_MAX_EQ_ULONG_MAX = yes; then
+ UINT64_MAX_EQ_ULONG_MAX=1;
+ else
+ UINT64_MAX_EQ_ULONG_MAX=0;
+ fi
+
+
+ else
+ UINT64_MAX_EQ_ULONG_MAX=-1
+ fi
+
+
+
+
+
+
+ HAVE_IOCTL=1
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_IOCTL=0
+ else
+ ac_fn_c_check_func "$LINENO" "ioctl" "ac_cv_func_ioctl"
+if test "x$ac_cv_func_ioctl" = xyes
+then :
+ printf "%s\n" "#define HAVE_IOCTL 1" >>confdefs.h
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ioctl with POSIX signature" >&5
+printf %s "checking for ioctl with POSIX signature... " >&6; }
+if test ${gl_cv_func_ioctl_posix_signature+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/ioctl.h>
+ /* On some platforms, ioctl() is declared in <unistd.h>. */
+ #include <unistd.h>
+
+int
+main (void)
+{
+extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ int ioctl (int, int, ...);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_ioctl_posix_signature=yes
+else $as_nop
+ gl_cv_func_ioctl_posix_signature=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_ioctl_posix_signature" >&5
+printf "%s\n" "$gl_cv_func_ioctl_posix_signature" >&6; }
+ if test $gl_cv_func_ioctl_posix_signature != yes; then
+ REPLACE_IOCTL=1
+ fi
+ fi
+
+ if test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS ioctl.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_IOCTL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_IOCTL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_isblank = no; then
+ HAVE_ISBLANK=0
+ fi
+
+ if test $HAVE_ISBLANK = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS isblank.$ac_objext"
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_ISBLANK 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_ISBLANK=1
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "iswblank" "ac_cv_have_decl_iswblank" "
+ #include <wchar.h>
+ #include <wctype.h>
+
+"
+if test "x$ac_cv_have_decl_iswblank" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_ISWBLANK $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_func_iswblank = no; then
+ HAVE_ISWBLANK=0
+ if test $ac_cv_have_decl_iswblank = yes; then
+ REPLACE_ISWBLANK=1
+ fi
+ fi
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+ :
+ fi
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS iswblank.$ac_objext"
+
+ fi
+ fi
+
+
+
+
+
+ GNULIB_ISWBLANK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWBLANK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswdigit is ISO C compliant" >&5
+printf %s "checking whether iswdigit is ISO C compliant... " >&6; }
+if test ${gl_cv_func_iswdigit_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+ freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+ gl_cv_func_iswdigit_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_iswdigit_works="guessing yes" ;;
+ esac
+ if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswdigit for the multibyte character s[0..n-1]. */
+static int
+for_character (const char *s, size_t n)
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, s, n, &state);
+ if (ret != n)
+ abort ();
+
+ return iswdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int is;
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ /* This fails on mingw, MSVC 14. */
+ /* U+00B2 SUPERSCRIPT TWO */
+ is = for_character ("\262", 1);
+ if (!(is == 0))
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ /* This fails on NetBSD 8.0. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 2;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */
+ /* U+0663 ARABIC-INDIC DIGIT THREE */
+ is = for_character ("\331\243", 2);
+ if (!(is == 0))
+ result |= 4;
+ /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\357\274\221", 3);
+ if (!(is == 0))
+ result |= 8;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 16;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_iswdigit_works=yes
+else $as_nop
+ gl_cv_func_iswdigit_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswdigit_works" >&5
+printf "%s\n" "$gl_cv_func_iswdigit_works" >&6; }
+ case "$gl_cv_func_iswdigit_works" in
+ *yes) ;;
+ *) REPLACE_ISWDIGIT=1 ;;
+ esac
+ fi
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $REPLACE_ISWDIGIT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS iswdigit.$ac_objext"
+
+ fi
+ fi
+
+
+
+
+
+ GNULIB_ISWDIGIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWDIGIT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL"
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswxdigit is ISO C compliant" >&5
+printf %s "checking whether iswxdigit is ISO C compliant... " >&6; }
+if test ${gl_cv_func_iswxdigit_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+ freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+ gl_cv_func_iswxdigit_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_iswxdigit_works="guessing yes" ;;
+ esac
+ if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswxdigit for the multibyte character s[0..n-1]. */
+static int
+for_character (const char *s, size_t n)
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, s, n, &state);
+ if (ret != n)
+ abort ();
+
+ return iswxdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int is;
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ /* This fails on NetBSD 8.0. */
+ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+ is = for_character ("\243\301", 2);
+ if (!(is == 0))
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ /* This fails on FreeBSD 12. */
+ /* U+0663 ARABIC-INDIC DIGIT THREE */
+ is = for_character ("\331\243", 2);
+ if (!(is == 0))
+ result |= 2;
+ /* This fails on MSVC 14. */
+ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+ is = for_character ("\357\274\241", 3);
+ if (!(is == 0))
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ /* This fails on Solaris 10, Solaris 11.4. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 8;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_iswxdigit_works=yes
+else $as_nop
+ gl_cv_func_iswxdigit_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswxdigit_works" >&5
+printf "%s\n" "$gl_cv_func_iswxdigit_works" >&6; }
+ case "$gl_cv_func_iswxdigit_works" in
+ *yes) ;;
+ *) REPLACE_ISWXDIGIT=1 ;;
+ esac
+ fi
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $REPLACE_ISWXDIGIT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS iswxdigit.$ac_objext"
+
+ fi
+ fi
+
+
+
+
+
+ GNULIB_ISWXDIGIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_ISWXDIGIT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_langinfo_h='<'langinfo.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <langinfo.h>" >&5
+printf %s "checking absolute name of <langinfo.h>... " >&6; }
+if test ${gl_cv_next_langinfo_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_langinfo_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'langinfo.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_langinfo_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_langinfo_h
+ gl_cv_next_langinfo_h='"'$gl_header'"'
+ else
+ gl_cv_next_langinfo_h='<'langinfo.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_langinfo_h" >&5
+printf "%s\n" "$gl_cv_next_langinfo_h" >&6; }
+ fi
+ NEXT_LANGINFO_H=$gl_cv_next_langinfo_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'langinfo.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_langinfo_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H=$gl_next_as_first_directive
+
+
+
+
+
+ HAVE_LANGINFO_CODESET=0
+ HAVE_LANGINFO_T_FMT_AMPM=0
+ HAVE_LANGINFO_ALTMON=0
+ HAVE_LANGINFO_ERA=0
+ HAVE_LANGINFO_YESEXPR=0
+
+ if test $ac_cv_header_langinfo_h = yes; then
+ HAVE_LANGINFO_H=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines CODESET" >&5
+printf %s "checking whether langinfo.h defines CODESET... " >&6; }
+if test ${gl_cv_header_langinfo_codeset+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int a = CODESET;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_langinfo_codeset=yes
+else $as_nop
+ gl_cv_header_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_codeset" >&5
+printf "%s\n" "$gl_cv_header_langinfo_codeset" >&6; }
+ if test $gl_cv_header_langinfo_codeset = yes; then
+ HAVE_LANGINFO_CODESET=1
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines T_FMT_AMPM" >&5
+printf %s "checking whether langinfo.h defines T_FMT_AMPM... " >&6; }
+if test ${gl_cv_header_langinfo_t_fmt_ampm+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int a = T_FMT_AMPM;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_langinfo_t_fmt_ampm=yes
+else $as_nop
+ gl_cv_header_langinfo_t_fmt_ampm=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_t_fmt_ampm" >&5
+printf "%s\n" "$gl_cv_header_langinfo_t_fmt_ampm" >&6; }
+ if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then
+ HAVE_LANGINFO_T_FMT_AMPM=1
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ALTMON_1" >&5
+printf %s "checking whether langinfo.h defines ALTMON_1... " >&6; }
+if test ${gl_cv_header_langinfo_altmon+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int a = ALTMON_1;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_langinfo_altmon=yes
+else $as_nop
+ gl_cv_header_langinfo_altmon=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_altmon" >&5
+printf "%s\n" "$gl_cv_header_langinfo_altmon" >&6; }
+ if test $gl_cv_header_langinfo_altmon = yes; then
+ HAVE_LANGINFO_ALTMON=1
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines ERA" >&5
+printf %s "checking whether langinfo.h defines ERA... " >&6; }
+if test ${gl_cv_header_langinfo_era+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int a = ERA;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_langinfo_era=yes
+else $as_nop
+ gl_cv_header_langinfo_era=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_era" >&5
+printf "%s\n" "$gl_cv_header_langinfo_era" >&6; }
+ if test $gl_cv_header_langinfo_era = yes; then
+ HAVE_LANGINFO_ERA=1
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether langinfo.h defines YESEXPR" >&5
+printf %s "checking whether langinfo.h defines YESEXPR... " >&6; }
+if test ${gl_cv_header_langinfo_yesexpr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+int a = YESEXPR;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_langinfo_yesexpr=yes
+else $as_nop
+ gl_cv_header_langinfo_yesexpr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_langinfo_yesexpr" >&5
+printf "%s\n" "$gl_cv_header_langinfo_yesexpr" >&6; }
+ if test $gl_cv_header_langinfo_yesexpr = yes; then
+ HAVE_LANGINFO_YESEXPR=1
+ fi
+ else
+ HAVE_LANGINFO_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports the __inline keyword" >&5
+printf %s "checking whether the compiler supports the __inline keyword... " >&6; }
+if test ${gl_cv_c___inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+typedef int foo_t;
+ static __inline foo_t foo (void) { return 0; }
+int
+main (void)
+{
+return foo ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_c___inline=yes
+else $as_nop
+ gl_cv_c___inline=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c___inline" >&5
+printf "%s\n" "$gl_cv_c___inline" >&6; }
+ if test $gl_cv_c___inline = yes; then
+
+printf "%s\n" "#define HAVE___INLINE 1" >>confdefs.h
+
+ fi
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to use the included libunistring" >&5
+printf %s "checking whether to use the included libunistring... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_libunistring_use_included" >&5
+printf "%s\n" "$gl_libunistring_use_included" >&6; }
+
+
+
+
+
+ if test $ac_cv_func_link = no; then
+ HAVE_LINK=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether link obeys POSIX" >&5
+printf %s "checking whether link obeys POSIX... " >&6; }
+if test ${gl_cv_func_link_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ touch conftest.a
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.a conftest.lnk
+ fi
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_link_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_link_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_link_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+ #include <stdio.h>
+
+int
+main (void)
+{
+int result = 0;
+ if (!link ("conftest.a", "conftest.b/"))
+ result |= 1;
+#if HAVE_LSTAT
+ if (!link ("conftest.lnk/", "conftest.b"))
+ result |= 2;
+ if (rename ("conftest.a", "conftest.b"))
+ result |= 4;
+ if (!link ("conftest.b", "conftest.lnk"))
+ result |= 8;
+#endif
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_link_works=yes
+else $as_nop
+ gl_cv_func_link_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.a conftest.b conftest.lnk
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_link_works" >&5
+printf "%s\n" "$gl_cv_func_link_works" >&6; }
+ case "$gl_cv_func_link_works" in
+ *yes) ;;
+ *)
+ REPLACE_LINK=1
+ ;;
+ esac
+ fi
+
+ if test $HAVE_LINK = 0 || test $REPLACE_LINK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS link.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_LINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LINK 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS listen.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_LISTEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LISTEN 1" >>confdefs.h
+
+
+
+
+
+
+ LOCALCHARSET_TESTS_ENVIRONMENT=
+
+
+
+
+
+
+
+
+
+
+
+ case "$host_os" in
+ solaris*)
+
+printf "%s\n" "#define _LCONV_C99 1" >>confdefs.h
+
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether locale.h conforms to POSIX:2001" >&5
+printf %s "checking whether locale.h conforms to POSIX:2001... " >&6; }
+if test ${gl_cv_header_locale_h_posix2001+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <locale.h>
+ int x = LC_MESSAGES;
+ int y = sizeof (((struct lconv *) 0)->decimal_point);
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_locale_h_posix2001=yes
+else $as_nop
+ gl_cv_header_locale_h_posix2001=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_locale_h_posix2001" >&5
+printf "%s\n" "$gl_cv_header_locale_h_posix2001" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct lconv is properly defined" >&5
+printf %s "checking whether struct lconv is properly defined... " >&6; }
+if test ${gl_cv_sys_struct_lconv_ok+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <locale.h>
+ struct lconv l;
+ int x = sizeof (l.decimal_point);
+ int y = sizeof (l.int_p_cs_precedes);
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_sys_struct_lconv_ok=yes
+else $as_nop
+ gl_cv_sys_struct_lconv_ok=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_struct_lconv_ok" >&5
+printf "%s\n" "$gl_cv_sys_struct_lconv_ok" >&6; }
+ if test $gl_cv_sys_struct_lconv_ok = no; then
+ case "$host_os" in
+ mingw*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Special
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Special" >/dev/null 2>&1
+then :
+
+else $as_nop
+ REPLACE_STRUCT_LCONV=1
+fi
+rm -rf conftest*
+
+ ;;
+ *) REPLACE_STRUCT_LCONV=1 ;;
+ esac
+ fi
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_locale_h='<'locale.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <locale.h>" >&5
+printf %s "checking absolute name of <locale.h>... " >&6; }
+if test ${gl_cv_next_locale_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <locale.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'locale.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_locale_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_locale_h
+ gl_cv_next_locale_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_locale_h" >&5
+printf "%s\n" "$gl_cv_next_locale_h" >&6; }
+ fi
+ NEXT_LOCALE_H=$gl_cv_next_locale_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'locale.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_locale_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_LOCALE_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_STRUCT_LCONV = 1; then
+ REPLACE_LOCALECONV=1
+ fi
+
+ if test $REPLACE_LOCALECONV = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS localeconv.$ac_objext"
+
+
+ ac_fn_c_check_member "$LINENO" "struct lconv" "decimal_point" "ac_cv_member_struct_lconv_decimal_point" "#include <locale.h>
+"
+if test "x$ac_cv_member_struct_lconv_decimal_point" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_LCONV_DECIMAL_POINT 1" >>confdefs.h
+
+
+fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_LOCALECONV=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LOCALECONV 1" >>confdefs.h
+
+
+
+
+
+ if test "$gl_threads_api" = posix; then
+ # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
+ # pthread_rwlock_* functions.
+ has_rwlock=false
+ ac_fn_c_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include <pthread.h>
+"
+if test "x$ac_cv_type_pthread_rwlock_t" = xyes
+then :
+ has_rwlock=true
+
+printf "%s\n" "#define HAVE_PTHREAD_RWLOCK 1" >>confdefs.h
+
+fi
+
+ if $has_rwlock; then
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthread_rwlock_rdlock prefers a writer to a reader" >&5
+printf %s "checking whether pthread_rwlock_rdlock prefers a writer to a reader... " >&6; }
+if test ${gl_cv_pthread_rwlock_rdlock_prefer_writer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBMULTITHREAD"
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess no on musl systems.
+ *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess no on bionic systems.
+ *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess yes on native Windows with the mingw-w64 winpthreads library.
+ # Guess no on native Windows with the gnulib windows-rwlock module.
+ mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes"
+ else
+ gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no"
+ fi
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define SUCCEED() exit (0)
+#define FAILURE() exit (1)
+#define UNEXPECTED(n) (exit (10 + (n)))
+
+/* The main thread creates the waiting writer and the requesting reader threads
+ in the default way; this guarantees that they have the same priority.
+ We can reuse the main thread as first reader thread. */
+
+static pthread_rwlock_t lock;
+static pthread_t reader1;
+static pthread_t writer;
+static pthread_t reader2;
+static pthread_t timer;
+/* Used to pass control from writer to reader2 and from reader2 to timer,
+ as in a relay race.
+ Passing control from one running thread to another running thread
+ is most likely faster than to create the second thread. */
+static pthread_mutex_t baton;
+
+static void *
+timer_func (void *ignored)
+{
+ /* Step 13 (can be before or after step 12):
+ The timer thread takes the baton, then waits a moment to make sure
+ it can tell whether the second reader thread is blocked at step 12. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (13);
+ usleep (100000);
+ /* By the time we get here, it's clear that the second reader thread is
+ blocked at step 12. This is the desired behaviour. */
+ SUCCEED ();
+}
+
+static void *
+reader2_func (void *ignored)
+{
+ int err;
+
+ /* Step 8 (can be before or after step 7):
+ The second reader thread takes the baton, then waits a moment to make sure
+ the writer thread has reached step 7. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (8);
+ usleep (100000);
+ /* Step 9: The second reader thread requests the lock. */
+ err = pthread_rwlock_tryrdlock (&lock);
+ if (err == 0)
+ FAILURE ();
+ else if (err != EBUSY)
+ UNEXPECTED (9);
+ /* Step 10: Launch a timer, to test whether the next call blocks. */
+ if (pthread_create (&timer, NULL, timer_func, NULL))
+ UNEXPECTED (10);
+ /* Step 11: Release the baton. */
+ if (pthread_mutex_unlock (&baton))
+ UNEXPECTED (11);
+ /* Step 12: The second reader thread requests the lock. */
+ err = pthread_rwlock_rdlock (&lock);
+ if (err == 0)
+ FAILURE ();
+ else
+ UNEXPECTED (12);
+}
+
+static void *
+writer_func (void *ignored)
+{
+ /* Step 4: Take the baton, so that the second reader thread does not go ahead
+ too early. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (4);
+ /* Step 5: Create the second reader thread. */
+ if (pthread_create (&reader2, NULL, reader2_func, NULL))
+ UNEXPECTED (5);
+ /* Step 6: Release the baton. */
+ if (pthread_mutex_unlock (&baton))
+ UNEXPECTED (6);
+ /* Step 7: The writer thread requests the lock. */
+ if (pthread_rwlock_wrlock (&lock))
+ UNEXPECTED (7);
+ return NULL;
+}
+
+int
+main ()
+{
+ reader1 = pthread_self ();
+
+ /* Step 1: The main thread initializes the lock and the baton. */
+ if (pthread_rwlock_init (&lock, NULL))
+ UNEXPECTED (1);
+ if (pthread_mutex_init (&baton, NULL))
+ UNEXPECTED (1);
+ /* Step 2: The main thread acquires the lock as a reader. */
+ if (pthread_rwlock_rdlock (&lock))
+ UNEXPECTED (2);
+ /* Step 3: Create the writer thread. */
+ if (pthread_create (&writer, NULL, writer_func, NULL))
+ UNEXPECTED (3);
+ /* Job done. Go to sleep. */
+ for (;;)
+ {
+ sleep (1);
+ }
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_pthread_rwlock_rdlock_prefer_writer=yes
+else $as_nop
+ gl_cv_pthread_rwlock_rdlock_prefer_writer=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ LIBS="$save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pthread_rwlock_rdlock_prefer_writer" >&5
+printf "%s\n" "$gl_cv_pthread_rwlock_rdlock_prefer_writer" >&6; }
+ case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in
+ *yes)
+
+printf "%s\n" "#define HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER 1" >>confdefs.h
+
+ ;;
+ esac
+
+ fi
+ # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <pthread.h>
+int
+main (void)
+{
+
+#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
+ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+printf "%s\n" "#define HAVE_PTHREAD_MUTEX_RECURSIVE 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ :
+
+
+
+printf "%s\n" "#define GNULIB_LOCK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lseek detects pipes" >&5
+printf %s "checking whether lseek detects pipes... " >&6; }
+if test ${gl_cv_func_lseek_pipe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ mingw*)
+ gl_cv_func_lseek_pipe=no
+ ;;
+ *)
+ if test $cross_compiling = no; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h> /* for off_t */
+#include <stdio.h> /* for SEEK_CUR */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+
+ /* Exit with success only if stdin is seekable. */
+ return lseek (0, (off_t)0, SEEK_CUR) < 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext < conftest.$ac_ext \
+ && test 1 = "`echo hi \
+ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then
+ gl_cv_func_lseek_pipe=yes
+ else
+ gl_cv_func_lseek_pipe=no
+ fi
+
+else $as_nop
+ gl_cv_func_lseek_pipe=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined __BEOS__
+/* BeOS mistakenly return 0 when trying to seek on pipes. */
+ Choke me.
+#endif
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_lseek_pipe=yes
+else $as_nop
+ gl_cv_func_lseek_pipe=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_lseek_pipe" >&5
+printf "%s\n" "$gl_cv_func_lseek_pipe" >&6; }
+ if test $gl_cv_func_lseek_pipe = no; then
+ REPLACE_LSEEK=1
+
+printf "%s\n" "#define LSEEK_PIPE_BROKEN 1" >>confdefs.h
+
+ fi
+
+
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_LSEEK=1
+ fi
+
+ if test $REPLACE_LSEEK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS lseek.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_LSEEK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LSEEK 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $ac_cv_func_lstat = yes; then
+
+ case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in
+ solaris* | *no)
+ REPLACE_LSTAT=1
+ ;;
+ esac
+ else
+ HAVE_LSTAT=0
+ fi
+
+ if test $REPLACE_LSTAT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS lstat.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_LSTAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_LSTAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_func_malloc_posix = yes; then
+
+printf "%s\n" "#define HAVE_MALLOC_POSIX 1" >>confdefs.h
+
+ else
+ REPLACE_MALLOC=1
+ fi
+
+ if test $REPLACE_MALLOC = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_MALLOC_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if case "$host_os" in
+ mingw*) true ;;
+ *) test $ac_cv_func_mbsinit = yes ;;
+ esac \
+ && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+ if test $LOCALE_JA != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ else
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+ if test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+ gl_cv_func_mbrtowc_sanitycheck=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+
+
+
+ if test $ac_cv_func_mbrtowc = no; then
+ HAVE_MBRTOWC=0
+ ac_fn_c_check_decl "$LINENO" "mbrtowc" "ac_cv_have_decl_mbrtowc" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_mbrtowc" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_MBRTOWC $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_mbrtowc = yes; then
+ REPLACE_MBRTOWC=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBRTOWC=1
+ else
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL pwc argument" >&5
+printf %s "checking whether mbrtowc handles a NULL pwc argument... " >&6; }
+if test ${gl_cv_func_mbrtowc_null_arg1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris.
+ solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
+ esac
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "\303\237er";
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 5, &state);
+ if (ret != 2)
+ result |= 1;
+ if (!mbsinit (&state))
+ result |= 2;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ ret = mbrtowc (NULL, input, 5, &state);
+ if (ret != 2) /* Solaris 7 fails here: ret is -1. */
+ result |= 4;
+ if (!mbsinit (&state))
+ result |= 8;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_null_arg1=yes
+else $as_nop
+ gl_cv_func_mbrtowc_null_arg1=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg1" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_null_arg1" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles a NULL string argument" >&5
+printf %s "checking whether mbrtowc handles a NULL string argument... " >&6; }
+if test ${gl_cv_func_mbrtowc_null_arg2+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on OSF/1.
+ osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
+ esac
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+ int ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ mbrtowc (&wc, NULL, 5, &state);
+ /* Check that wc was not modified. */
+ if (wc != (wchar_t) 0xBADFACE)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_null_arg2=yes
+else $as_nop
+ gl_cv_func_mbrtowc_null_arg2=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_null_arg2" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_null_arg2" >&6; }
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc has a correct return value" >&5
+printf %s "checking whether mbrtowc has a correct return value... " >&6; }
+if test ${gl_cv_func_mbrtowc_retval+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on HP-UX, Solaris, native Windows.
+ hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_retval="guessing yes" ;;
+ esac
+ if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
+ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ int found_some_locale = 0;
+ /* This fails on Solaris. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 1)
+ result |= 1;
+ }
+ found_some_locale = 1;
+ }
+ /* This fails on HP-UX 11.11. */
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 2)
+ result |= 2;
+ }
+ found_some_locale = 1;
+ }
+ /* This fails on native Windows. */
+ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+ {
+ char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 4;
+ }
+ found_some_locale = 1;
+ }
+ if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+ {
+ char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 8;
+ }
+ found_some_locale = 1;
+ }
+ if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+ {
+ char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 16;
+ }
+ found_some_locale = 1;
+ }
+ return (found_some_locale ? result : 77);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_retval=yes
+else $as_nop
+ if test $? != 77; then
+ gl_cv_func_mbrtowc_retval=no
+ fi
+
+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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_retval" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_retval" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc returns 0 when parsing a NUL character" >&5
+printf %s "checking whether mbrtowc returns 0 when parsing a NUL character... " >&6; }
+if test ${gl_cv_func_mbrtowc_nul_retval+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris 8 and 9.
+ solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
+ esac
+ if test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8 and 9. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "", 1, &state) != 0)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_nul_retval=yes
+else $as_nop
+ gl_cv_func_mbrtowc_nul_retval=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_nul_retval" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_nul_retval" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc stores incomplete characters" >&5
+printf %s "checking whether mbrtowc stores incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_stores_incomplete+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;;
+ *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;;
+ esac
+ case "$host_os" in
+ mingw*)
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "French_France.65001") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 2;
+ }
+ if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 8;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_stores_incomplete=no
+else $as_nop
+ gl_cv_func_mbrtowc_stores_incomplete=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ ;;
+ *)
+
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ return 1;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_stores_incomplete=no
+else $as_nop
+ gl_cv_func_mbrtowc_stores_incomplete=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_stores_incomplete" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_stores_incomplete" >&6; }
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works on empty input" >&5
+printf %s "checking whether mbrtowc works on empty input... " >&6; }
+if test ${gl_cv_func_mbrtowc_empty_input+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX and glibc systems.
+ aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+ *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+ esac
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ static wchar_t wc;
+ static mbstate_t mbs;
+ int
+ main (void)
+ {
+ return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_empty_input=yes
+else $as_nop
+ gl_cv_func_mbrtowc_empty_input=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_empty_input" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_empty_input" >&6; }
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C locale is free of encoding errors" >&5
+printf %s "checking whether the C locale is free of encoding errors... " >&6; }
+if test ${gl_cv_func_mbrtowc_C_locale_sans_EILSEQ+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ #include <locale.h>
+ #include <wchar.h>
+
+int
+main (void)
+{
+
+ int i;
+ char *locale = setlocale (LC_ALL, "C");
+ if (! locale)
+ return 2;
+ for (i = CHAR_MIN; i <= CHAR_MAX; i++)
+ {
+ char c = i;
+ wchar_t wc;
+ mbstate_t mbs = { 0, };
+ size_t ss = mbrtowc (&wc, &c, 1, &mbs);
+ if (1 < ss)
+ return 3;
+ }
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes
+else $as_nop
+ gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" >&6; }
+
+ case "$gl_cv_func_mbrtowc_null_arg1" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_NULL_ARG1_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_null_arg2" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_NULL_ARG2_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_retval" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_RETVAL_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_nul_retval" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_NUL_RETVAL_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_stores_incomplete" in
+ *no) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_STORES_INCOMPLETE_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_empty_input" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_EMPTY_INPUT_BUG 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ 1" >>confdefs.h
+
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ fi
+ fi
+ if test $REPLACE_MBSTATE_T = 1; then
+ case "$host_os" in
+ mingw*) LIB_MBRTOWC= ;;
+ *)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_have_weak=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $gl_cv_have_weak = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_have_weak="guessing yes"
+else $as_nop
+ gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+ return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_have_weak=yes
+else $as_nop
+ gl_cv_have_weak=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
+ case " $LDFLAGS " in
+ *" -static "*) gl_cv_have_weak=no ;;
+ esac
+ case "$gl_cv_have_weak" in
+ *yes)
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ : > conftest1.c
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+ cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+ return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+ || gl_cv_have_weak=no
+ rm -f conftest1.c libempty.so conftest2.c conftest
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+ case "$gl_cv_have_weak" in
+ *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_have_weak" in
+ *yes) LIB_MBRTOWC= ;;
+ *) LIB_MBRTOWC="$LIBPTHREAD" ;;
+ esac
+ ;;
+ esac
+ else
+ LIB_MBRTOWC=
+ fi
+
+
+ if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbrtowc.$ac_objext"
+
+ if test $REPLACE_MBSTATE_T = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS lc-charset-dispatch.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbtowc-lock.$ac_objext"
+
+
+
+
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
+printf %s "checking whether the -Werror option is usable... " >&6; }
+if test ${gl_cv_cc_vis_werror+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_vis_werror=yes
+else $as_nop
+ gl_cv_cc_vis_werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+printf "%s\n" "$gl_cv_cc_vis_werror" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+printf %s "checking for simple visibility declarations... " >&6; }
+if test ${gl_cv_cc_visibility+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_visibility=yes
+else $as_nop
+ gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+printf "%s\n" "$gl_cv_cc_visibility" >&6; }
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+
+
+
+printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h
+
+
+
+ fi
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_MBRTOWC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBRTOWC 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if case "$host_os" in
+ mingw*) true ;;
+ *) test $ac_cv_func_mbsinit = yes ;;
+ esac \
+ && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+ if test $LOCALE_JA != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ else
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+ if test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+ gl_cv_func_mbrtowc_sanitycheck=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+
+
+
+ if test $ac_cv_func_mbsinit = no; then
+ HAVE_MBSINIT=0
+ ac_fn_c_check_decl "$LINENO" "mbsinit" "ac_cv_have_decl_mbsinit" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_mbsinit" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_MBSINIT $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_mbsinit = yes; then
+ REPLACE_MBSINIT=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSINIT=1
+ else
+ case "$host_os" in
+ mingw*) REPLACE_MBSINIT=1 ;;
+ esac
+ fi
+ fi
+
+ if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbsinit.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_MBSINIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBSINIT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if case "$host_os" in
+ mingw*) true ;;
+ *) test $ac_cv_func_mbsinit = yes ;;
+ esac \
+ && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+ if test $LOCALE_JA != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ else
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+ if test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+ gl_cv_func_mbrtowc_sanitycheck=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+
+
+
+ if test $ac_cv_func_mbsrtowcs = no; then
+ HAVE_MBSRTOWCS=0
+ ac_fn_c_check_decl "$LINENO" "mbsrtowcs" "ac_cv_have_decl_mbsrtowcs" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_mbsrtowcs" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_MBSRTOWCS $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_mbsrtowcs = yes; then
+ REPLACE_MBSRTOWCS=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSRTOWCS=1
+ else
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbsrtowcs works" >&5
+printf %s "checking whether mbsrtowcs works... " >&6; }
+if test ${gl_cv_func_mbsrtowcs_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on HP-UX, Solaris, mingw.
+ hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbsrtowcs_works="guessing yes" ;;
+ esac
+ if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ /* Test whether the function supports a NULL destination argument.
+ This fails on native Windows. */
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ const char input[] = "\337er";
+ const char *src = input;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbsrtowcs (NULL, &src, 1, &state) != 3
+ || src != input)
+ result |= 1;
+ }
+ /* Test whether the function works when started with a conversion state
+ in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ result |= 2;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "<\306\374\313\334\270\354>";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 4;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 3)
+ result |= 4;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ const char input[] = "B\250\271\201\060\211\070er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ result |= 8;
+ }
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbsrtowcs_works=yes
+else $as_nop
+ gl_cv_func_mbsrtowcs_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbsrtowcs_works" >&5
+printf "%s\n" "$gl_cv_func_mbsrtowcs_works" >&6; }
+
+ case "$gl_cv_func_mbsrtowcs_works" in
+ *yes) ;;
+ *) REPLACE_MBSRTOWCS=1 ;;
+ esac
+ fi
+ fi
+
+ if test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbsrtowcs.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbsrtowcs-state.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_MBSRTOWCS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBSRTOWCS 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc"
+if test "x$ac_cv_func_mbtowc" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBTOWC 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_mbtowc = no; then
+ HAVE_MBTOWC=0
+ else
+ if false; then
+ REPLACE_MBTOWC=1
+ fi
+ fi
+
+ if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mbtowc.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_MBTOWC=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MBTOWC 1" >>confdefs.h
+
+
+
+
+ if test $REPLACE_MEMCHR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS memchr.$ac_objext"
+
+
+ ac_fn_c_check_header_compile "$LINENO" "bp-sym.h" "ac_cv_header_bp_sym_h" "$ac_includes_default"
+if test "x$ac_cv_header_bp_sym_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_BP_SYM_H 1" >>confdefs.h
+
+fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_MEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "mempcpy" "ac_cv_func_mempcpy"
+if test "x$ac_cv_func_mempcpy" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMPCPY 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_mempcpy = no; then
+ HAVE_MEMPCPY=0
+ fi
+
+ if test $HAVE_MEMPCPY = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mempcpy.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_MEMPCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMPCPY 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_memrchr = no; then
+ HAVE_DECL_MEMRCHR=0
+ fi
+
+ ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
+if test "x$ac_cv_func_memrchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMRCHR 1" >>confdefs.h
+
+fi
+
+
+ if test $ac_cv_func_memrchr = no; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS memrchr.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_MEMRCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MEMRCHR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing slash" >&5
+printf %s "checking whether mkdir handles trailing slash... " >&6; }
+if test ${gl_cv_func_mkdir_trailing_slash_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -rf conftest.dir
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef _MSC_VER
+ Known
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Known" >/dev/null 2>&1
+then :
+ gl_cv_func_mkdir_trailing_slash_works="guessing yes"
+else $as_nop
+ gl_cv_func_mkdir_trailing_slash_works="guessing no"
+fi
+rm -rf conftest*
+
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_mkdir_trailing_slash_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+return mkdir ("conftest.dir/", 0700);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mkdir_trailing_slash_works=yes
+else $as_nop
+ gl_cv_func_mkdir_trailing_slash_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -rf conftest.dir
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mkdir_trailing_slash_works" >&5
+printf "%s\n" "$gl_cv_func_mkdir_trailing_slash_works" >&6; }
+ case "$gl_cv_func_mkdir_trailing_slash_works" in
+ *yes) ;;
+ *)
+ REPLACE_MKDIR=1
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mkdir handles trailing dot" >&5
+printf %s "checking whether mkdir handles trailing dot... " >&6; }
+if test ${gl_cv_func_mkdir_trailing_dot_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ rm -rf conftest.dir
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_mkdir_trailing_dot_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_mkdir_trailing_dot_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+return !mkdir ("conftest.dir/./", 0700);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mkdir_trailing_dot_works=yes
+else $as_nop
+ gl_cv_func_mkdir_trailing_dot_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -rf conftest.dir
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mkdir_trailing_dot_works" >&5
+printf "%s\n" "$gl_cv_func_mkdir_trailing_dot_works" >&6; }
+ case "$gl_cv_func_mkdir_trailing_dot_works" in
+ *yes) ;;
+ *)
+ REPLACE_MKDIR=1
+
+printf "%s\n" "#define FUNC_MKDIR_DOT_BUG 1" >>confdefs.h
+
+ ;;
+ esac
+
+ if test $REPLACE_MKDIR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mkdir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_MKDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MKDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_mkostemp != yes; then
+ HAVE_MKOSTEMP=0
+ fi
+
+ if test $HAVE_MKOSTEMP = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mkostemp.$ac_objext"
+
+
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_MKOSTEMP 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_MKOSTEMP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MKOSTEMP 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $ac_cv_func_mkstemp = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mkstemp" >&5
+printf %s "checking for working mkstemp... " >&6; }
+if test ${gl_cv_func_working_mkstemp+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ mkdir conftest.mkstemp
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_working_mkstemp="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_mkstemp="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_mkstemp="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_working_mkstemp="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int result = 0;
+ int i;
+ off_t large = (off_t) 4294967295u;
+ if (large < 0)
+ large = 2147483647;
+ umask (0);
+ for (i = 0; i < 70; i++)
+ {
+ char templ[] = "conftest.mkstemp/coXXXXXX";
+ int (*mkstemp_function) (char *) = mkstemp;
+ int fd = mkstemp_function (templ);
+ if (fd < 0)
+ result |= 1;
+ else
+ {
+ struct stat st;
+ if (lseek (fd, large, SEEK_SET) != large)
+ result |= 2;
+ if (fstat (fd, &st) < 0)
+ result |= 4;
+ else if (st.st_mode & 0077)
+ result |= 8;
+ if (close (fd))
+ result |= 16;
+ }
+ }
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_working_mkstemp=yes
+else $as_nop
+ gl_cv_func_working_mkstemp=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -rf conftest.mkstemp
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_mkstemp" >&5
+printf "%s\n" "$gl_cv_func_working_mkstemp" >&6; }
+ case "$gl_cv_func_working_mkstemp" in
+ *yes) ;;
+ *)
+ REPLACE_MKSTEMP=1
+ ;;
+ esac
+ else
+ HAVE_MKSTEMP=0
+ fi
+
+ if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mkstemp.$ac_objext"
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_MKSTEMP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MKSTEMP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ REPLACE_MKTIME=0
+ if test "$gl_cv_func_working_mktime" != yes; then
+ REPLACE_MKTIME=1
+
+printf "%s\n" "#define NEED_MKTIME_WORKING 1" >>confdefs.h
+
+ fi
+ case "$host_os" in
+ mingw*)
+ REPLACE_MKTIME=1
+
+printf "%s\n" "#define NEED_MKTIME_WINDOWS 1" >>confdefs.h
+
+ ;;
+ esac
+
+ if test $REPLACE_MKTIME = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_MKTIME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_MKTIME 1" >>confdefs.h
+
+
+
+
+
+
+ WANT_MKTIME_INTERNAL=0
+ ac_fn_c_check_func "$LINENO" "__mktime_internal" "ac_cv_func___mktime_internal"
+if test "x$ac_cv_func___mktime_internal" = xyes
+then :
+
+printf "%s\n" "#define mktime_internal __mktime_internal" >>confdefs.h
+
+
+else $as_nop
+ WANT_MKTIME_INTERNAL=1
+
+printf "%s\n" "#define NEED_MKTIME_INTERNAL 1" >>confdefs.h
+
+
+fi
+
+
+ if test $WANT_MKTIME_INTERNAL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS mktime.$ac_objext"
+
+ :
+ fi
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext"
+
+ fi
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext"
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_MSVC_NOTHROW 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nanosleep_save_libs=$LIBS
+
+ # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+ LIB_NANOSLEEP=
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5
+printf %s "checking for library containing nanosleep... " >&6; }
+if test ${ac_cv_search_nanosleep+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char nanosleep ();
+int
+main (void)
+{
+return nanosleep ();
+ ;
+ 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_nanosleep=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_nanosleep+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_nanosleep+y}
+then :
+
+else $as_nop
+ ac_cv_search_nanosleep=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5
+printf "%s\n" "$ac_cv_search_nanosleep" >&6; }
+ac_res=$ac_cv_search_nanosleep
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ test "$ac_cv_search_nanosleep" = "none required" ||
+ LIB_NANOSLEEP=$ac_cv_search_nanosleep
+fi
+
+ if test "x$ac_cv_search_nanosleep" != xno; then
+
+
+ if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple Mac OS X platforms.
+ # The test result would be 'no (mishandles large arguments)' in 64-bit
+ # mode but 'yes' in 32-bit mode. But we need a configuration result that
+ # is valid in both modes.
+ gl_cv_func_nanosleep='no (mishandles large arguments)'
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working nanosleep" >&5
+printf %s "checking for working nanosleep... " >&6; }
+if test ${gl_cv_func_nanosleep+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in linux*) # Guess it halfway works when the kernel is Linux.
+ gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
+ mingw*) # Guess no on native Windows.
+ gl_cv_func_nanosleep='guessing no' ;;
+ *) # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_nanosleep="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <errno.h>
+ #include <limits.h>
+ #include <signal.h>
+ #if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #include <unistd.h>
+ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+ #define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+
+ #if HAVE_DECL_ALARM
+ static void
+ check_for_SIGALRM (int sig)
+ {
+ if (sig != SIGALRM)
+ _exit (1);
+ }
+ #endif
+
+ int
+ main ()
+ {
+ static struct timespec ts_sleep;
+ static struct timespec ts_remaining;
+ /* Test for major problems first. */
+ if (! nanosleep)
+ return 2;
+ ts_sleep.tv_sec = 0;
+ ts_sleep.tv_nsec = 1;
+ #if HAVE_DECL_ALARM
+ {
+ static struct sigaction act;
+ act.sa_handler = check_for_SIGALRM;
+ sigemptyset (&act.sa_mask);
+ sigaction (SIGALRM, &act, NULL);
+ alarm (1);
+ if (nanosleep (&ts_sleep, NULL) != 0)
+ return 3;
+ /* Test for a minor problem: the handling of large arguments. */
+ ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
+ ts_sleep.tv_nsec = 999999999;
+ alarm (1);
+ if (nanosleep (&ts_sleep, &ts_remaining) != -1)
+ return 4;
+ if (errno != EINTR)
+ return 5;
+ if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10)
+ return 6;
+ }
+ #else /* A simpler test for native Windows. */
+ if (nanosleep (&ts_sleep, &ts_remaining) < 0)
+ return 3;
+ #endif
+ return 0;
+ }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_nanosleep=yes
+else $as_nop
+ case $? in 4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; *) gl_cv_func_nanosleep=no;;
+ esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_nanosleep" >&5
+printf "%s\n" "$gl_cv_func_nanosleep" >&6; }
+ case "$gl_cv_func_nanosleep" in
+ *yes)
+ REPLACE_NANOSLEEP=0
+ ;;
+ *)
+ REPLACE_NANOSLEEP=1
+ case "$gl_cv_func_nanosleep" in
+ *"mishandles large arguments"*)
+
+printf "%s\n" "#define HAVE_BUG_BIG_NANOSLEEP 1" >>confdefs.h
+
+ ;;
+ *)
+ # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
+ for ac_lib in $LIBSOCKET; do
+ case " $LIB_NANOSLEEP " in
+ *" $ac_lib "*) ;;
+ *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ esac
+ else
+ HAVE_NANOSLEEP=0
+ fi
+ LIBS=$nanosleep_save_libs
+
+ if test $HAVE_NANOSLEEP = 0 || test $REPLACE_NANOSLEEP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS nanosleep.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_NANOSLEEP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_NANOSLEEP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_netdb_h='<'netdb.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <netdb.h>" >&5
+printf %s "checking absolute name of <netdb.h>... " >&6; }
+if test ${gl_cv_next_netdb_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_netdb_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netdb.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'netdb.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_netdb_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_netdb_h
+ gl_cv_next_netdb_h='"'$gl_header'"'
+ else
+ gl_cv_next_netdb_h='<'netdb.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netdb_h" >&5
+printf "%s\n" "$gl_cv_next_netdb_h" >&6; }
+ fi
+ NEXT_NETDB_H=$gl_cv_next_netdb_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'netdb.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_netdb_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_NETDB_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_netdb_h = yes; then
+ HAVE_NETDB_H=1
+ else
+ HAVE_NETDB_H=0
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <netinet/in.h> is self-contained" >&5
+printf %s "checking whether <netinet/in.h> is self-contained... " >&6; }
+if test ${gl_cv_header_netinet_in_h_selfcontained+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netinet/in.h>
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_netinet_in_h_selfcontained=yes
+else $as_nop
+ gl_cv_header_netinet_in_h_selfcontained=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_netinet_in_h_selfcontained" >&5
+printf "%s\n" "$gl_cv_header_netinet_in_h_selfcontained" >&6; }
+ if test $gl_cv_header_netinet_in_h_selfcontained = yes; then
+ NETINET_IN_H=''
+ else
+ NETINET_IN_H='netinet/in.h'
+ ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default"
+if test "x$ac_cv_header_netinet_in_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_netinet_in_h='<'netinet/in.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <netinet/in.h>" >&5
+printf %s "checking absolute name of <netinet/in.h>... " >&6; }
+if test ${gl_cv_next_netinet_in_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_netinet_in_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <netinet/in.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'netinet/in.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_netinet_in_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_netinet_in_h
+ gl_cv_next_netinet_in_h='"'$gl_header'"'
+ else
+ gl_cv_next_netinet_in_h='<'netinet/in.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_netinet_in_h" >&5
+printf "%s\n" "$gl_cv_next_netinet_in_h" >&6; }
+ fi
+ NEXT_NETINET_IN_H=$gl_cv_next_netinet_in_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'netinet/in.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_netinet_in_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_netinet_in_h = yes; then
+ HAVE_NETINET_IN_H=1
+ else
+ HAVE_NETINET_IN_H=0
+ fi
+
+ fi
+
+ if test -n "$NETINET_IN_H"; then
+ GL_GENERATE_NETINET_IN_H_TRUE=
+ GL_GENERATE_NETINET_IN_H_FALSE='#'
+else
+ GL_GENERATE_NETINET_IN_H_TRUE='#'
+ GL_GENERATE_NETINET_IN_H_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_nl_langinfo = yes; then
+ # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether YESEXPR works" >&5
+printf %s "checking whether YESEXPR works... " >&6; }
+if test ${gl_cv_func_nl_langinfo_yesexpr_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no on irix systems.
+ irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";;
+ # Guess yes elsewhere.
+ *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <langinfo.h>
+
+int
+main (void)
+{
+return !*nl_langinfo(YESEXPR);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_nl_langinfo_yesexpr_works=yes
+else $as_nop
+ gl_cv_func_nl_langinfo_yesexpr_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_nl_langinfo_yesexpr_works" >&5
+printf "%s\n" "$gl_cv_func_nl_langinfo_yesexpr_works" >&6; }
+ case $gl_cv_func_nl_langinfo_yesexpr_works in
+ *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;;
+ *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;;
+ esac
+
+printf "%s\n" "#define FUNC_NL_LANGINFO_YESEXPR_WORKS $FUNC_NL_LANGINFO_YESEXPR_WORKS" >>confdefs.h
+
+ # On Solaris 10 and Solaris 11.3, nl_langinfo is not multithread-safe.
+ case "$host_os" in
+ solaris*) NL_LANGINFO_MTSAFE=0 ;;
+ *) NL_LANGINFO_MTSAFE=1 ;;
+ esac
+
+printf "%s\n" "#define NL_LANGINFO_MTSAFE $NL_LANGINFO_MTSAFE" >>confdefs.h
+
+ if test $HAVE_LANGINFO_CODESET = 1 \
+ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \
+ && test $HAVE_LANGINFO_ALTMON = 1 \
+ && test $HAVE_LANGINFO_ERA = 1 \
+ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1 \
+ && test $NL_LANGINFO_MTSAFE = 1; then
+ :
+ else
+ REPLACE_NL_LANGINFO=1
+
+printf "%s\n" "#define REPLACE_NL_LANGINFO 1" >>confdefs.h
+
+ fi
+ else
+ HAVE_NL_LANGINFO=0
+ fi
+ if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then
+ LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL"
+ else
+ LIB_NL_LANGINFO=
+ fi
+
+
+ if test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS nl_langinfo.$ac_objext"
+
+ fi
+ if test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS nl_langinfo-lock.$ac_objext"
+
+
+
+
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
+printf %s "checking whether the -Werror option is usable... " >&6; }
+if test ${gl_cv_cc_vis_werror+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_vis_werror=yes
+else $as_nop
+ gl_cv_cc_vis_werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+printf "%s\n" "$gl_cv_cc_vis_werror" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+printf %s "checking for simple visibility declarations... " >&6; }
+if test ${gl_cv_cc_visibility+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_visibility=yes
+else $as_nop
+ gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+printf "%s\n" "$gl_cv_cc_visibility" >&6; }
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+
+
+
+printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_NL_LANGINFO=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_NL_LANGINFO 1" >>confdefs.h
+
+
+
+
+
+
+ case "$host_os" in
+ mingw* | pw*)
+ REPLACE_OPEN=1
+ ;;
+ *)
+
+ if test "$gl_cv_macro_O_CLOEXEC" != yes; then
+ REPLACE_OPEN=1
+ fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether open recognizes a trailing slash" >&5
+printf %s "checking whether open recognizes a trailing slash... " >&6; }
+if test ${gl_cv_func_open_slash+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ touch conftest.tmp
+ ln -s conftest.tmp conftest.lnk
+ fi
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+ gl_cv_func_open_slash="guessing no" ;;
+ *)
+ gl_cv_func_open_slash="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <fcntl.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+
+$gl_mda_defines
+
+int main ()
+{
+ int result = 0;
+#if HAVE_LSTAT
+ if (open ("conftest.lnk/", O_RDONLY) != -1)
+ result |= 1;
+#endif
+ if (open ("conftest.sl/", O_CREAT, 0600) >= 0)
+ result |= 2;
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_open_slash=yes
+else $as_nop
+ gl_cv_func_open_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.sl conftest.tmp conftest.lnk
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_open_slash" >&5
+printf "%s\n" "$gl_cv_func_open_slash" >&6; }
+ case "$gl_cv_func_open_slash" in
+ *no)
+
+printf "%s\n" "#define OPEN_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_func_open_slash" in
+ *no)
+ REPLACE_OPEN=1
+ ;;
+ esac
+ ;;
+ esac
+
+ if test $REPLACE_OPEN = 0; then
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_OPEN=1
+ fi
+ fi
+
+
+
+ if test $REPLACE_OPEN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS open.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_OPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPEN 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in
+ yes+*yes+yes)
+ ;;
+ yes+*)
+ # Solaris 10 lacks O_CLOEXEC.
+ # Solaris 9 has *at functions, but uniformly mishandles trailing
+ # slash in all of them.
+ REPLACE_OPENAT=1
+ ;;
+ *)
+ HAVE_OPENAT=0
+ ;;
+ esac
+
+ if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS openat.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_OPENAT 1" >>confdefs.h
+
+
+
+
+
+
+ GNULIB_OPENAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPENAT 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "opendir" "ac_cv_func_opendir"
+if test "x$ac_cv_func_opendir" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENDIR 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_opendir = no; then
+ HAVE_OPENDIR=0
+ fi
+
+
+
+
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+
+ if test $HAVE_FCHDIR = 0; then
+ if test $HAVE_OPENDIR = 1; then
+ REPLACE_OPENDIR=1
+ fi
+ fi
+
+ case $host_os,$HAVE_OPENDIR in
+ os2*,1)
+ REPLACE_OPENDIR=1;;
+ esac
+
+ if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS opendir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_OPENDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_OPENDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_pipe != yes; then
+ HAVE_PIPE=0
+ fi
+
+ if test $HAVE_PIPE = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS pipe.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_PIPE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PIPE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_pipe2 != yes; then
+ HAVE_PIPE2=0
+ fi
+
+
+
+
+
+
+ GNULIB_PIPE2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_PIPE2 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_PIPE2_SAFER 1" >>confdefs.h
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawni.$ac_objext"
+
+
+ ac_fn_c_check_header_compile "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default"
+if test "x$ac_cv_header_paths_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_PATHS_H 1" >>confdefs.h
+
+fi
+
+ ac_fn_c_check_func "$LINENO" "confstr" "ac_cv_func_confstr"
+if test "x$ac_cv_func_confstr" = xyes
+then :
+ printf "%s\n" "#define HAVE_CONFSTR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sched_setparam" "ac_cv_func_sched_setparam"
+if test "x$ac_cv_func_sched_setparam" = xyes
+then :
+ printf "%s\n" "#define HAVE_SCHED_SETPARAM 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sched_setscheduler" "ac_cv_func_sched_setscheduler"
+if test "x$ac_cv_func_sched_setscheduler" = xyes
+then :
+ printf "%s\n" "#define HAVE_SCHED_SETSCHEDULER 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid"
+if test "x$ac_cv_func_setegid" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid"
+if test "x$ac_cv_func_seteuid" = xyes
+then :
+ printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "vfork" "ac_cv_func_vfork"
+if test "x$ac_cv_func_vfork" = xyes
+then :
+ printf "%s\n" "#define HAVE_VFORK 1" >>confdefs.h
+
+fi
+
+
+ fi
+
+
+
+
+
+
+
+ if test $ac_cv_func_posix_spawn_file_actions_addchdir = yes; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+ else
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0
+ fi
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addchdir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addclose works" >&5
+printf %s "checking whether posix_spawn_file_actions_addclose works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_addclose_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ # Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ solaris*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <spawn.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_addclose (&actions, 10000000) == 0)
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_posix_spawn_file_actions_addclose_works=yes
+else $as_nop
+ gl_cv_func_posix_spawn_file_actions_addclose_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addclose_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_addclose_works" >&6; }
+ case "$gl_cv_func_posix_spawn_file_actions_addclose_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1 ;;
+ esac
+ fi
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addclose.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_adddup2 works" >&5
+printf %s "checking whether posix_spawn_file_actions_adddup2 works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_adddup2_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ # Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+ solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <spawn.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_posix_spawn_file_actions_adddup2_works=yes
+else $as_nop
+ gl_cv_func_posix_spawn_file_actions_adddup2_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_adddup2_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_adddup2_works" >&6; }
+ case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
+ esac
+ fi
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_adddup2.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether posix_spawn_file_actions_addopen works" >&5
+printf %s "checking whether posix_spawn_file_actions_addopen works... " >&6; }
+if test ${gl_cv_func_posix_spawn_file_actions_addopen_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ # Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+ solaris*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <spawn.h>
+#include <fcntl.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_addopen (&actions, 10000000, "foo", 0, O_RDONLY)
+ == 0)
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_posix_spawn_file_actions_addopen_works=yes
+else $as_nop
+ gl_cv_func_posix_spawn_file_actions_addopen_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_posix_spawn_file_actions_addopen_works" >&5
+printf "%s\n" "$gl_cv_func_posix_spawn_file_actions_addopen_works" >&6; }
+ case "$gl_cv_func_posix_spawn_file_actions_addopen_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1 ;;
+ esac
+ fi
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_addopen.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_destroy.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_DESTROY 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawn_faction_init.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnattr_destroy.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNATTR_DESTROY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_DESTROY 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnattr_init.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNATTR_INIT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_INIT 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnattr_setflags.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNATTR_SETFLAGS=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnattr_setpgroup.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNATTR_SETPGROUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnattr_setsigmask.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNATTR_SETSIGMASK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK 1" >>confdefs.h
+
+
+
+
+
+
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS spawnp.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_POSIX_SPAWNP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_POSIX_SPAWNP 1" >>confdefs.h
+
+
+
+
+ :
+
+
+
+ :
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "raise" "ac_cv_func_raise"
+if test "x$ac_cv_func_raise" = xyes
+then :
+ printf "%s\n" "#define HAVE_RAISE 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_raise = no; then
+ HAVE_RAISE=0
+ else
+
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_RAISE=1
+ fi
+
+
+
+
+
+ HAVE_POSIX_SIGNALBLOCKING=0
+ if test "$gl_cv_type_sigset_t" = yes; then
+ ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
+if test "x$ac_cv_func_sigprocmask" = xyes
+then :
+ HAVE_POSIX_SIGNALBLOCKING=1
+fi
+
+ fi
+
+ if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+
+
+
+
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_RAISE=1
+ fi
+
+ fi
+
+ fi
+
+ if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS raise.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_RAISE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RAISE 1" >>confdefs.h
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "rawmemchr" "ac_cv_func_rawmemchr"
+if test "x$ac_cv_func_rawmemchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_RAWMEMCHR 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_rawmemchr = no; then
+ HAVE_RAWMEMCHR=0
+ fi
+
+ if test $HAVE_RAWMEMCHR = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS rawmemchr.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_RAWMEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RAWMEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "readdir" "ac_cv_func_readdir"
+if test "x$ac_cv_func_readdir" = xyes
+then :
+ printf "%s\n" "#define HAVE_READDIR 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_readdir = no; then
+ HAVE_READDIR=0
+ fi
+
+ if test $HAVE_READDIR = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS readdir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_READDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_READDIR 1" >>confdefs.h
+
+
+
+
+
+
+ if test $ac_cv_func_readlink = no; then
+ HAVE_READLINK=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink signature is correct" >&5
+printf %s "checking whether readlink signature is correct... " >&6; }
+if test ${gl_cv_decl_readlink_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+ /* Cause compilation failure if original declaration has wrong type. */
+ ssize_t readlink (const char *, char *, size_t);
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_decl_readlink_works=yes
+else $as_nop
+ gl_cv_decl_readlink_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_readlink_works" >&5
+printf "%s\n" "$gl_cv_decl_readlink_works" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink handles trailing slash correctly" >&5
+printf %s "checking whether readlink handles trailing slash correctly... " >&6; }
+if test ${gl_cv_func_readlink_trailing_slash+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # We have readlink, so assume ln -s works.
+ ln -s conftest.no-such conftest.link
+ ln -s conftest.link conftest.lnk2
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux or glibc systems.
+ linux-* | linux | *-gnu* | gnu*)
+ gl_cv_func_readlink_trailing_slash="guessing yes" ;;
+ # Guess no on AIX or HP-UX.
+ aix* | hpux*)
+ gl_cv_func_readlink_trailing_slash="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_readlink_trailing_slash="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+int
+main (void)
+{
+char buf[20];
+ return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_readlink_trailing_slash=yes
+else $as_nop
+ gl_cv_func_readlink_trailing_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.link conftest.lnk2
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_trailing_slash" >&5
+printf "%s\n" "$gl_cv_func_readlink_trailing_slash" >&6; }
+ case "$gl_cv_func_readlink_trailing_slash" in
+ *yes)
+ if test "$gl_cv_decl_readlink_works" != yes; then
+ REPLACE_READLINK=1
+ fi
+ ;;
+ *)
+
+printf "%s\n" "#define READLINK_TRAILING_SLASH_BUG 1" >>confdefs.h
+
+ REPLACE_READLINK=1
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether readlink truncates results correctly" >&5
+printf %s "checking whether readlink truncates results correctly... " >&6; }
+if test ${gl_cv_func_readlink_truncate+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # We have readlink, so assume ln -s works.
+ ln -s ab conftest.link
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux or glibc systems.
+ linux-* | linux | *-gnu* | gnu*)
+ gl_cv_func_readlink_truncate="guessing yes" ;;
+ # Guess no on AIX or HP-UX.
+ aix* | hpux*)
+ gl_cv_func_readlink_truncate="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+int
+main (void)
+{
+char c;
+ return readlink ("conftest.link", &c, 1) != 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_readlink_truncate=yes
+else $as_nop
+ gl_cv_func_readlink_truncate=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.link conftest.lnk2
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_readlink_truncate" >&5
+printf "%s\n" "$gl_cv_func_readlink_truncate" >&6; }
+ case $gl_cv_func_readlink_truncate in
+ *yes)
+ if test "$gl_cv_decl_readlink_works" != yes; then
+ REPLACE_READLINK=1
+ fi
+ ;;
+ *)
+
+printf "%s\n" "#define READLINK_TRUNCATE_BUG 1" >>confdefs.h
+
+ REPLACE_READLINK=1
+ ;;
+ esac
+ fi
+
+ if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS readlink.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_READLINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_READLINK 1" >>confdefs.h
+
+
+
+
+
+
+ if test $gl_cv_func_malloc_posix = yes; then
+
+printf "%s\n" "#define HAVE_REALLOC_POSIX 1" >>confdefs.h
+
+ else
+ REPLACE_REALLOC=1
+ fi
+
+ if test $REPLACE_REALLOC = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS realloc.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_REALLOC_POSIX=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS recv.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_RECV=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_RECV 1" >>confdefs.h
+
+
+
+
+
+# Check whether --with-included-regex was given.
+if test ${with_included_regex+y}
+then :
+ withval=$with_included_regex;
+fi
+
+
+ case $with_included_regex in #(
+ yes|no) ac_use_included_regex=$with_included_regex
+ ;;
+ '')
+ # If the system regex support is good enough that it passes the
+ # following run test, then default to *not* using the included regex.c.
+ # If cross compiling, assume the test would fail and use the included
+ # regex.c.
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working re_compile_pattern" >&5
+printf %s "checking for working re_compile_pattern... " >&6; }
+if test ${gl_cv_func_re_compile_pattern_working+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;;
+ # Otherwise obey --enable-cross-guesses.
+ *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <regex.h>
+
+ #include <locale.h>
+ #include <limits.h>
+ #include <string.h>
+
+ #if defined M_CHECK_ACTION || HAVE_DECL_ALARM
+ # include <signal.h>
+ # include <unistd.h>
+ #endif
+
+ #if HAVE_MALLOC_H
+ # include <malloc.h>
+ #endif
+
+ #ifdef M_CHECK_ACTION
+ /* Exit with distinguishable exit code. */
+ static void sigabrt_no_core (int sig) { raise (SIGTERM); }
+ #endif
+
+int
+main (void)
+{
+int result = 0;
+ static struct re_pattern_buffer regex;
+ unsigned char folded_chars[UCHAR_MAX + 1];
+ int i;
+ const char *s;
+ struct re_registers regs;
+
+ /* Some builds of glibc go into an infinite loop on this
+ test. Use alarm to force death, and mallopt to avoid
+ malloc recursion in diagnosing the corrupted heap. */
+#if HAVE_DECL_ALARM
+ signal (SIGALRM, SIG_DFL);
+ alarm (2);
+#endif
+#ifdef M_CHECK_ACTION
+ signal (SIGABRT, sigabrt_no_core);
+ mallopt (M_CHECK_ACTION, 2);
+#endif
+
+ if (setlocale (LC_ALL, "en_US.UTF-8"))
+ {
+ {
+ /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html
+ This test needs valgrind to catch the bug on Debian
+ GNU/Linux 3.1 x86, but it might catch the bug better
+ on other platforms and it shouldn't hurt to try the
+ test here. */
+ static char const pat[] = "insert into";
+ static char const data[] =
+ "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK";
+ re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE
+ | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern (pat, sizeof pat - 1, &regex);
+ if (s)
+ result |= 1;
+ else
+ {
+ if (re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, &regs)
+ != -1)
+ result |= 1;
+ regfree (&regex);
+ }
+ }
+
+ {
+ /* This test is from glibc bug 15078.
+ The test case is from Andreas Schwab in
+ <https://sourceware.org/ml/libc-alpha/2013-01/msg00967.html>.
+ */
+ static char const pat[] = "[^x]x";
+ static char const data[] =
+ /* <U1000><U103B><U103D><U1014><U103A><U102F><U1015><U103A> */
+ "\xe1\x80\x80"
+ "\xe1\x80\xbb"
+ "\xe1\x80\xbd"
+ "\xe1\x80\x94"
+ "\xe1\x80\xba"
+ "\xe1\x80\xaf"
+ "\xe1\x80\x95"
+ "\xe1\x80\xba"
+ "x";
+ re_set_syntax (0);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern (pat, sizeof pat - 1, &regex);
+ if (s)
+ result |= 1;
+ else
+ {
+ i = re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, 0);
+ if (i != 0 && i != 21)
+ result |= 1;
+ regfree (&regex);
+ }
+ }
+
+ if (! setlocale (LC_ALL, "C"))
+ return 1;
+ }
+
+ /* This test is from glibc bug 3957, reported by Andrew Mackey. */
+ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[^x]b", 6, &regex);
+ if (s)
+ result |= 2;
+ else
+ {
+ /* This should fail, but succeeds for glibc-2.5. */
+ if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
+ result |= 2;
+ regfree (&regex);
+ }
+
+ /* This regular expression is from Spencer ere test number 75
+ in grep-2.3. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ for (i = 0; i <= UCHAR_MAX; i++)
+ folded_chars[i] = i;
+ regex.translate = folded_chars;
+ s = re_compile_pattern ("a[[:]:]]b\n", 11, &regex);
+ /* This should fail with _Invalid character class name_ error. */
+ if (!s)
+ {
+ result |= 4;
+ regfree (&regex);
+ }
+
+ /* Ensure that [b-a] is diagnosed as invalid, when
+ using RE_NO_EMPTY_RANGES. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[b-a]", 6, &regex);
+ if (s == 0)
+ {
+ result |= 8;
+ regfree (&regex);
+ }
+
+ /* This should succeed, but does not for glibc-2.1.3. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("{1", 2, &regex);
+ if (s)
+ result |= 8;
+ else
+ regfree (&regex);
+
+ /* The following example is derived from a problem report
+ against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[an\371]*n", 7, &regex);
+ if (s)
+ result |= 8;
+ else
+ {
+ /* This should match, but does not for glibc-2.2.1. */
+ if (re_match (&regex, "an", 2, 0, &regs) != 2)
+ result |= 8;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ result |= 8;
+ else
+ {
+ /* glibc-2.2.93 does not work with a negative RANGE argument. */
+ if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+ result |= 8;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ /* The version of regex.c in older versions of gnulib
+ ignored RE_ICASE. Detect that problem too. */
+ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ result |= 16;
+ else
+ {
+ if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
+ result |= 16;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ /* Catch a bug reported by Vin Shelton in
+ https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html
+ */
+ re_set_syntax (RE_SYNTAX_POSIX_BASIC
+ & ~RE_CONTEXT_INVALID_DUP
+ & ~RE_NO_EMPTY_RANGES);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, &regex);
+ if (s)
+ result |= 32;
+ else
+ regfree (&regex);
+
+ /* REG_STARTEND was added to glibc on 2004-01-15.
+ Reject older versions. */
+ if (! REG_STARTEND)
+ result |= 64;
+
+ /* Matching with the compiled form of this regexp would provoke
+ an assertion failure prior to glibc-2.28:
+ regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed
+ With glibc-2.28, compilation fails and reports the invalid
+ back reference. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("0|()0|\\1|0", 10, &regex);
+ if (!s)
+ result |= 64;
+ else
+ {
+ if (strcmp (s, "Invalid back reference"))
+ result |= 64;
+ regfree (&regex);
+ }
+
+#if 0
+ /* It would be nice to reject hosts whose regoff_t values are too
+ narrow (including glibc on hosts with 64-bit ptrdiff_t and
+ 32-bit int), but we should wait until glibc implements this
+ feature. Otherwise, support for equivalence classes and
+ multibyte collation symbols would always be broken except
+ when compiling --without-included-regex. */
+ if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+ || sizeof (regoff_t) < sizeof (ssize_t))
+ result |= 64;
+#endif
+
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_re_compile_pattern_working=yes
+else $as_nop
+ gl_cv_func_re_compile_pattern_working=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_re_compile_pattern_working" >&5
+printf "%s\n" "$gl_cv_func_re_compile_pattern_working" >&6; }
+ case "$gl_cv_func_re_compile_pattern_working" in #(
+ *yes) ac_use_included_regex=no;; #(
+ *no) ac_use_included_regex=yes;;
+ esac
+ ;;
+ *) as_fn_error $? "Invalid value for --with-included-regex: $with_included_regex" "$LINENO" 5
+ ;;
+ esac
+
+ if test $ac_use_included_regex = yes; then
+
+printf "%s\n" "#define _REGEX_INCLUDE_LIMITS_H 1" >>confdefs.h
+
+
+printf "%s\n" "#define _REGEX_LARGE_OFFSETS 1" >>confdefs.h
+
+
+printf "%s\n" "#define re_syntax_options rpl_re_syntax_options" >>confdefs.h
+
+
+printf "%s\n" "#define re_set_syntax rpl_re_set_syntax" >>confdefs.h
+
+
+printf "%s\n" "#define re_compile_pattern rpl_re_compile_pattern" >>confdefs.h
+
+
+printf "%s\n" "#define re_compile_fastmap rpl_re_compile_fastmap" >>confdefs.h
+
+
+printf "%s\n" "#define re_search rpl_re_search" >>confdefs.h
+
+
+printf "%s\n" "#define re_search_2 rpl_re_search_2" >>confdefs.h
+
+
+printf "%s\n" "#define re_match rpl_re_match" >>confdefs.h
+
+
+printf "%s\n" "#define re_match_2 rpl_re_match_2" >>confdefs.h
+
+
+printf "%s\n" "#define re_set_registers rpl_re_set_registers" >>confdefs.h
+
+
+printf "%s\n" "#define re_comp rpl_re_comp" >>confdefs.h
+
+
+printf "%s\n" "#define re_exec rpl_re_exec" >>confdefs.h
+
+
+printf "%s\n" "#define regcomp rpl_regcomp" >>confdefs.h
+
+
+printf "%s\n" "#define regexec rpl_regexec" >>confdefs.h
+
+
+printf "%s\n" "#define regerror rpl_regerror" >>confdefs.h
+
+
+printf "%s\n" "#define regfree rpl_regfree" >>confdefs.h
+
+ fi
+
+ if test $ac_use_included_regex = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS regex.$ac_objext"
+
+
+
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
+if test "x$ac_cv_header_libintl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBINTL_H 1" >>confdefs.h
+
+fi
+
+
+ ac_fn_c_check_decl "$LINENO" "isblank" "ac_cv_have_decl_isblank" "#include <ctype.h>
+"
+if test "x$ac_cv_have_decl_isblank" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_ISBLANK $ac_have_decl" >>confdefs.h
+
+
+ fi
+
+
+
+ ac_fn_c_check_func "$LINENO" "rewinddir" "ac_cv_func_rewinddir"
+if test "x$ac_cv_func_rewinddir" = xyes
+then :
+ printf "%s\n" "#define HAVE_REWINDDIR 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_rewinddir = no; then
+ HAVE_REWINDDIR=0
+ fi
+
+ if test $HAVE_REWINDDIR = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS rewinddir.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_REWINDDIR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_REWINDDIR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "sched.h" "ac_cv_header_sched_h" "#if HAVE_SYS_CDEFS_H
+ #include <sys/cdefs.h>
+ #endif
+
+"
+if test "x$ac_cv_header_sched_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SCHED_H 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sched_h='<'sched.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sched.h>" >&5
+printf %s "checking absolute name of <sched.h>... " >&6; }
+if test ${gl_cv_next_sched_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sched.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sched.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sched_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sched_h
+ gl_cv_next_sched_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sched_h" >&5
+printf "%s\n" "$gl_cv_next_sched_h" >&6; }
+ fi
+ NEXT_SCHED_H=$gl_cv_next_sched_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sched.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sched_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SCHED_H=$gl_next_as_first_directive
+
+
+
+
+
+ if test "$ac_cv_header_sched_h" = yes; then
+ HAVE_SCHED_H=1
+ else
+ HAVE_SCHED_H=0
+ fi
+
+
+ if test "$HAVE_SCHED_H" = 1; then
+ ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#if HAVE_SYS_CDEFS_H
+ #include <sys/cdefs.h>
+ #endif
+ #include <sched.h>
+
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+ HAVE_STRUCT_SCHED_PARAM=1
+else $as_nop
+ HAVE_STRUCT_SCHED_PARAM=0
+fi
+
+ else
+ HAVE_STRUCT_SCHED_PARAM=0
+ case "$host_os" in
+ os2*)
+ ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <spawn.h>
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+ HAVE_STRUCT_SCHED_PARAM=1
+fi
+
+ ;;
+ vms)
+ ac_fn_c_check_type "$LINENO" "struct sched_param" "ac_cv_type_struct_sched_param" "#include <pthread.h>
+"
+if test "x$ac_cv_type_struct_sched_param" = xyes
+then :
+ HAVE_STRUCT_SCHED_PARAM=1
+fi
+
+ ;;
+ esac
+ fi
+
+
+ if test "$ac_cv_header_sys_cdefs_h" = yes; then
+ HAVE_SYS_CDEFS_H=1
+ else
+ HAVE_SYS_CDEFS_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_secure_getenv = no; then
+ HAVE_SECURE_GETENV=0
+ fi
+
+ if test $HAVE_SECURE_GETENV = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS secure_getenv.$ac_objext"
+
+
+ ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv"
+if test "x$ac_cv_func___secure_getenv" = xyes
+then :
+ printf "%s\n" "#define HAVE___SECURE_GETENV 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func___secure_getenv = no; then
+ ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid"
+if test "x$ac_cv_func_issetugid" = xyes
+then :
+ printf "%s\n" "#define HAVE_ISSETUGID 1" >>confdefs.h
+
+fi
+
+ fi
+
+
+ fi
+
+
+
+
+
+ GNULIB_SECURE_GETENV=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SECURE_GETENV 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ REPLACE_SELECT=1
+ else
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether select supports a 0 argument" >&5
+printf %s "checking whether select supports a 0 argument... " >&6; }
+if test ${gl_cv_func_select_supports0+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess no on Interix.
+ interix*) gl_cv_func_select_supports0="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_select_supports0="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+int main ()
+{
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_select_supports0=yes
+else $as_nop
+ gl_cv_func_select_supports0=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_supports0" >&5
+printf "%s\n" "$gl_cv_func_select_supports0" >&6; }
+ case "$gl_cv_func_select_supports0" in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether select detects invalid fds" >&5
+printf %s "checking whether select detects invalid fds... " >&6; }
+if test ${gl_cv_func_select_detects_ebadf+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#include <unistd.h>
+#include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+
+ fd_set set;
+ dup2(0, 16);
+ FD_ZERO(&set);
+ FD_SET(16, &set);
+ close(16);
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_select_detects_ebadf=yes
+else $as_nop
+ gl_cv_func_select_detects_ebadf=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_select_detects_ebadf" >&5
+printf "%s\n" "$gl_cv_func_select_detects_ebadf" >&6; }
+ case $gl_cv_func_select_detects_ebadf in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+ fi
+
+ LIB_SELECT="$LIBSOCKET"
+ if test $REPLACE_SELECT = 1; then
+ case "$host_os" in
+ mingw*)
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+int
+main ()
+{
+ MsgWaitForMultipleObjects (0, NULL, 0, 0, 0);
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+else $as_nop
+ LIB_SELECT="$LIB_SELECT -luser32"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ;;
+ esac
+ fi
+
+
+ if test $REPLACE_SELECT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS select.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_SELECT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SELECT 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS send.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_SEND=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SEND 1" >>confdefs.h
+
+
+
+
+ SERVENT_LIB=
+ gl_saved_libs="$LIBS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyname" >&5
+printf %s "checking for library containing getservbyname... " >&6; }
+if test ${ac_cv_search_getservbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char getservbyname ();
+int
+main (void)
+{
+return getservbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' socket network net
+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_getservbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_getservbyname+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_getservbyname+y}
+then :
+
+else $as_nop
+ ac_cv_search_getservbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyname" >&5
+printf "%s\n" "$ac_cv_search_getservbyname" >&6; }
+ac_res=$ac_cv_search_getservbyname
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ if test "$ac_cv_search_getservbyname" != "none required"; then
+ SERVENT_LIB="$ac_cv_search_getservbyname"
+ fi
+fi
+
+ LIBS="$gl_saved_libs"
+ if test -z "$SERVENT_LIB"; then
+
+ for ac_func in getservbyname
+do :
+ ac_fn_c_check_func "$LINENO" "getservbyname" "ac_cv_func_getservbyname"
+if test "x$ac_cv_func_getservbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETSERVBYNAME 1" >>confdefs.h
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getservbyname in winsock2.h and -lws2_32" >&5
+printf %s "checking for getservbyname in winsock2.h and -lws2_32... " >&6; }
+if test ${gl_cv_w32_getservbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_w32_getservbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+
+int
+main (void)
+{
+getservbyname(NULL,NULL);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_w32_getservbyname=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$gl_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_w32_getservbyname" >&5
+printf "%s\n" "$gl_cv_w32_getservbyname" >&6; }
+ if test "$gl_cv_w32_getservbyname" = "yes"; then
+ SERVENT_LIB="-lws2_32"
+ fi
+
+fi
+
+done
+ fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (LC_ALL, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (LC_ALL, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_all_mtsafe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+ *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+ gl_cv_func_setlocale_null_all_mtsafe=no ;;
+ # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+ *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+ gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_all_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_all_mtsafe" >&6; }
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_all_mtsafe" in
+ *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+ esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ALL_MTSAFE $SETLOCALE_NULL_ALL_MTSAFE" >>confdefs.h
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether setlocale (category, NULL) is multithread-safe" >&5
+printf %s "checking whether setlocale (category, NULL) is multithread-safe... " >&6; }
+if test ${gl_cv_func_setlocale_null_one_mtsafe+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ # Guess no on OpenBSD, AIX.
+ openbsd* | aix*)
+ gl_cv_func_setlocale_null_one_mtsafe=no ;;
+ # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+ *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+ gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setlocale_null_one_mtsafe" >&5
+printf "%s\n" "$gl_cv_func_setlocale_null_one_mtsafe" >&6; }
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_one_mtsafe" in
+ *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+ esac
+
+printf "%s\n" "#define SETLOCALE_NULL_ONE_MTSAFE $SETLOCALE_NULL_ONE_MTSAFE" >>confdefs.h
+
+
+ if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+ case "$host_os" in
+ mingw*) LIB_SETLOCALE_NULL= ;;
+ *)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether imported symbols can be declared weak" >&5
+printf %s "checking whether imported symbols can be declared weak... " >&6; }
+if test ${gl_cv_have_weak+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_cv_have_weak=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern void xyzzy ();
+#pragma weak xyzzy
+int
+main (void)
+{
+xyzzy();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_have_weak=maybe
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $gl_cv_have_weak = maybe; then
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Extensible Linking Format" >/dev/null 2>&1
+then :
+ gl_cv_have_weak="guessing yes"
+else $as_nop
+ gl_cv_have_weak="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+ return (fputs == NULL);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_have_weak=yes
+else $as_nop
+ gl_cv_have_weak=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
+ case " $LDFLAGS " in
+ *" -static "*) gl_cv_have_weak=no ;;
+ esac
+ case "$gl_cv_have_weak" in
+ *yes)
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ : > conftest1.c
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&5 2>&1
+ cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+ return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&5 2>&1 \
+ || gl_cv_have_weak=no
+ rm -f conftest1.c libempty.so conftest2.c conftest
+ ;;
+ esac
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_weak" >&5
+printf "%s\n" "$gl_cv_have_weak" >&6; }
+ case "$gl_cv_have_weak" in
+ *yes)
+
+printf "%s\n" "#define HAVE_WEAK_SYMBOLS 1" >>confdefs.h
+
+ ;;
+ esac
+
+ case "$gl_cv_have_weak" in
+ *yes) LIB_SETLOCALE_NULL= ;;
+ *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+ esac
+ ;;
+ esac
+ else
+ LIB_SETLOCALE_NULL=
+ fi
+
+
+ if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS setlocale-lock.$ac_objext"
+
+
+
+
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the -Werror option is usable" >&5
+printf %s "checking whether the -Werror option is usable... " >&6; }
+if test ${gl_cv_cc_vis_werror+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_vis_werror=yes
+else $as_nop
+ gl_cv_cc_vis_werror=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_vis_werror" >&5
+printf "%s\n" "$gl_cv_cc_vis_werror" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for simple visibility declarations" >&5
+printf %s "checking for simple visibility declarations... " >&6; }
+if test ${gl_cv_cc_visibility+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_cc_visibility=yes
+else $as_nop
+ gl_cv_cc_visibility=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS="$gl_save_CFLAGS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_visibility" >&5
+printf "%s\n" "$gl_cv_cc_visibility" >&6; }
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+
+
+
+printf "%s\n" "#define HAVE_VISIBILITY $HAVE_VISIBILITY" >>confdefs.h
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_SETLOCALE_NULL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SETLOCALE_NULL 1" >>confdefs.h
+
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS setsockopt.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_SETSOCKOPT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SETSOCKOPT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_sigaction = yes; then
+ ac_fn_c_check_member "$LINENO" "struct sigaction" "sa_sigaction" "ac_cv_member_struct_sigaction_sa_sigaction" "#include <signal.h>
+"
+if test "x$ac_cv_member_struct_sigaction_sa_sigaction" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SIGACTION_SA_SIGACTION 1" >>confdefs.h
+
+
+fi
+
+ if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
+ fi
+ else
+ HAVE_SIGACTION=0
+ fi
+
+ if test $HAVE_SIGACTION = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS sigaction.$ac_objext"
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "siginfo_t" "ac_cv_type_siginfo_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_siginfo_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_SIGINFO_T 1" >>confdefs.h
+
+
+fi
+
+ if test $ac_cv_type_siginfo_t = no; then
+ HAVE_SIGINFO_T=0
+ fi
+
+ fi
+
+
+
+
+
+ GNULIB_SIGACTION=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGACTION 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_signal_h='<'signal.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <signal.h>" >&5
+printf %s "checking absolute name of <signal.h>... " >&6; }
+if test ${gl_cv_next_signal_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <signal.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'signal.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_signal_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_signal_h
+ gl_cv_next_signal_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_signal_h" >&5
+printf "%s\n" "$gl_cv_next_signal_h" >&6; }
+ fi
+ NEXT_SIGNAL_H=$gl_cv_next_signal_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'signal.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_signal_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H=$gl_next_as_first_directive
+
+
+
+
+
+# AIX declares sig_atomic_t to already include volatile, and C89 compilers
+# then choke on 'volatile sig_atomic_t'. C99 requires that it compile.
+ ac_fn_c_check_type "$LINENO" "volatile sig_atomic_t" "ac_cv_type_volatile_sig_atomic_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_volatile_sig_atomic_t" = xyes
+then :
+
+else $as_nop
+ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0
+fi
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "sighandler_t" "ac_cv_type_sighandler_t" "
+#include <signal.h>
+
+"
+if test "x$ac_cv_type_sighandler_t" = xyes
+then :
+
+else $as_nop
+ HAVE_SIGHANDLER_T=0
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SIGPIPE 1" >>confdefs.h
+
+
+
+ GNULIB_SIGNAL_H_SIGPIPE=1
+
+
+ GNULIB_STDIO_H_SIGPIPE=1
+
+ GNULIB_UNISTD_H_SIGPIPE=1
+
+
+
+ HAVE_POSIX_SIGNALBLOCKING=0
+ if test "$gl_cv_type_sigset_t" = yes; then
+ ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask"
+if test "x$ac_cv_func_sigprocmask" = xyes
+then :
+ HAVE_POSIX_SIGNALBLOCKING=1
+fi
+
+ fi
+
+ if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS sigprocmask.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_SIGPROCMASK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SIGPROCMASK 1" >>confdefs.h
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SIZE_MAX" >&5
+printf %s "checking for SIZE_MAX... " >&6; }
+if test ${gl_cv_size_max+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ gl_cv_size_max=no
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Found it" >/dev/null 2>&1
+then :
+ gl_cv_size_max=yes
+fi
+rm -rf conftest*
+
+ if test $gl_cv_size_max != yes; then
+ if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) * CHAR_BIT - 1" "size_t_bits_minus_1" "#include <stddef.h>
+#include <limits.h>"
+then :
+
+else $as_nop
+ size_t_bits_minus_1=
+fi
+
+ if ac_fn_c_compute_int "$LINENO" "sizeof (size_t) <= sizeof (unsigned int)" "fits_in_uint" "#include <stddef.h>"
+then :
+
+else $as_nop
+ fits_in_uint=
+fi
+
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ fits_in_uint=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ fi
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_size_max" >&5
+printf "%s\n" "$gl_cv_size_max" >&6; }
+ if test "$gl_cv_size_max" != yes; then
+
+printf "%s\n" "#define SIZE_MAX $gl_cv_size_max" >>confdefs.h
+
+ fi
+
+
+
+
+ gl_cv_func_snprintf_usable=no
+ ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
+if test "x$ac_cv_func_snprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_snprintf = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_size1=yes
+else $as_nop
+ gl_cv_func_snprintf_size1=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_positions=yes
+else $as_nop
+ gl_cv_func_printf_positions=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_snprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS snprintf.$ac_objext"
+
+ if test $ac_cv_func_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ else
+
+ if test $ac_cv_have_decl_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ fi
+ fi
+ :
+
+ fi
+
+ if test $ac_cv_have_decl_snprintf = no; then
+ HAVE_DECL_SNPRINTF=0
+ fi
+
+
+
+
+
+
+ GNULIB_SNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SNPRINTF 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_SNPRINTF 1" >>confdefs.h
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS socket.$ac_objext"
+
+ fi
+ # When this module is used, sockets may actually occur as file descriptors,
+ # hence it is worth warning if the modules 'close' and 'ioctl' are not used.
+
+
+
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+ fi
+
+
+
+
+
+ GNULIB_SOCKET=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SOCKET 1" >>confdefs.h
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "
+/* <sys/types.h> is not needed according to POSIX, but the
+ <sys/socket.h> in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#elif HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_type_socklen_t" = xyes
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5
+printf %s "checking for socklen_t equivalent... " >&6; }
+if test ${gl_cv_socklen_t_equiv+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ gl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t "unsigned int" "long int" "unsigned long int"; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+ #include <sys/socket.h>
+
+ int getpeername (int, $arg2 *, $t *);
+int
+main (void)
+{
+$t len;
+ getpeername (0, 0, &len);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_socklen_t_equiv="$t"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ if test "$gl_cv_socklen_t_equiv" = ""; then
+ as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5
+ fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_socklen_t_equiv" >&5
+printf "%s\n" "$gl_cv_socklen_t_equiv" >&6; }
+
+printf "%s\n" "#define socklen_t $gl_cv_socklen_t_equiv" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_spawn_h='<'spawn.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <spawn.h>" >&5
+printf %s "checking absolute name of <spawn.h>... " >&6; }
+if test ${gl_cv_next_spawn_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_spawn_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <spawn.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'spawn.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_spawn_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_spawn_h
+ gl_cv_next_spawn_h='"'$gl_header'"'
+ else
+ gl_cv_next_spawn_h='<'spawn.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_spawn_h" >&5
+printf "%s\n" "$gl_cv_next_spawn_h" >&6; }
+ fi
+ NEXT_SPAWN_H=$gl_cv_next_spawn_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'spawn.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_spawn_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SPAWN_H=$gl_next_as_first_directive
+
+
+
+
+
+ if test $ac_cv_header_spawn_h = yes; then
+ HAVE_SPAWN_H=1
+ ac_fn_c_check_type "$LINENO" "posix_spawnattr_t" "ac_cv_type_posix_spawnattr_t" "
+#include <spawn.h>
+
+"
+if test "x$ac_cv_type_posix_spawnattr_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_POSIX_SPAWNATTR_T 1" >>confdefs.h
+
+
+else $as_nop
+ HAVE_POSIX_SPAWNATTR_T=0
+fi
+
+ ac_fn_c_check_type "$LINENO" "posix_spawn_file_actions_t" "ac_cv_type_posix_spawn_file_actions_t" "
+#include <spawn.h>
+
+"
+if test "x$ac_cv_type_posix_spawn_file_actions_t" = xyes
+then :
+
+printf "%s\n" "#define HAVE_POSIX_SPAWN_FILE_ACTIONS_T 1" >>confdefs.h
+
+
+else $as_nop
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+fi
+
+ else
+ HAVE_SPAWN_H=0
+ HAVE_POSIX_SPAWNATTR_T=0
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ case "$host_os" in
+ os2*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS os2-spawn.$ac_objext"
+
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
+printf %s "checking for ssize_t... " >&6; }
+if test ${gt_cv_ssize_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+int
+main (void)
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gt_cv_ssize_t=yes
+else $as_nop
+ gt_cv_ssize_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
+printf "%s\n" "$gt_cv_ssize_t" >&6; }
+ if test $gt_cv_ssize_t = no; then
+
+printf "%s\n" "#define ssize_t int" >>confdefs.h
+
+ fi
+
+
+
+
+
+ case "$host_os" in
+ mingw*)
+ REPLACE_STAT=1
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat handles trailing slashes on files" >&5
+printf %s "checking whether stat handles trailing slashes on files... " >&6; }
+if test ${gl_cv_func_stat_file_slash+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ touch conftest.tmp
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/stat.h>
+
+int
+main (void)
+{
+int result = 0;
+ struct stat st;
+ if (!stat ("conftest.tmp/", &st))
+ result |= 1;
+#if HAVE_LSTAT
+ if (!stat ("conftest.lnk/", &st))
+ result |= 2;
+#endif
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_stat_file_slash=yes
+else $as_nop
+ gl_cv_func_stat_file_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.tmp conftest.lnk
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_stat_file_slash" >&5
+printf "%s\n" "$gl_cv_func_stat_file_slash" >&6; }
+ case $gl_cv_func_stat_file_slash in
+ *no)
+ REPLACE_STAT=1
+
+printf "%s\n" "#define REPLACE_FUNC_STAT_FILE 1" >>confdefs.h
+;;
+ esac
+ case $host_os in
+ solaris*)
+ REPLACE_FSTAT=1 ;;
+ esac
+ ;;
+ esac
+
+ if test $REPLACE_STAT = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS stat.$ac_objext"
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS stat-w32.$ac_objext"
+
+ ;;
+ esac
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_STAT=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STAT 1" >>confdefs.h
+
+
+
+
+
+
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_struct_stat_st_atim_tv_nsec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC 1" >>confdefs.h
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct stat.st_atim is of type struct timespec" >&5
+printf %s "checking whether struct stat.st_atim is of type struct timespec... " >&6; }
+if test ${ac_cv_typeof_struct_stat_st_atim_is_struct_timespec+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_SYS_TIME_H
+ # include <sys/time.h>
+ #endif
+ #include <time.h>
+ struct timespec ts;
+ struct stat st;
+
+int
+main (void)
+{
+
+ st.st_atim = ts;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes
+else $as_nop
+ ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&5
+printf "%s\n" "$ac_cv_typeof_struct_stat_st_atim_is_struct_timespec" >&6; }
+ if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
+
+printf "%s\n" "#define TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC 1" >>confdefs.h
+
+ fi
+else $as_nop
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC 1" >>confdefs.h
+
+
+else $as_nop
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIMENSEC 1" >>confdefs.h
+
+
+else $as_nop
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.st__tim.tv_nsec" "ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_atim_st__tim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC 1" >>confdefs.h
+
+
+fi
+
+fi
+
+fi
+
+fi
+
+
+
+
+
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec.tv_nsec" "ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtimespec_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC 1" >>confdefs.h
+
+
+else $as_nop
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimensec" "ac_cv_member_struct_stat_st_birthtimensec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtimensec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC 1" >>confdefs.h
+
+
+else $as_nop
+ ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim.tv_nsec" "ac_cv_member_struct_stat_st_birthtim_tv_nsec" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_member_struct_stat_st_birthtim_tv_nsec" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC 1" >>confdefs.h
+
+
+fi
+
+fi
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working stdalign.h" >&5
+printf %s "checking for working stdalign.h... " >&6; }
+if test ${gl_cv_header_working_stdalign_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdalign.h>
+ #include <stddef.h>
+
+ /* Test that alignof yields a result consistent with offsetof.
+ This catches GCC bug 52023
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>. */
+ #ifdef __cplusplus
+ template <class t> struct alignof_helper { char a; t b; };
+ # define ao(type) offsetof (alignof_helper<type>, b)
+ #else
+ # define ao(type) offsetof (struct { char a; type b; }, b)
+ #endif
+ char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1];
+ char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1];
+ char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1];
+
+ /* Test _Alignas only on platforms where gnulib can help. */
+ #if \
+ ((defined __cplusplus && 201103 <= __cplusplus) \
+ || (defined __APPLE__ && defined __MACH__ \
+ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ : __GNUC__) \
+ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \
+ || 1300 <= _MSC_VER)
+ struct alignas_test { char c; char alignas (8) alignas_8; };
+ char test_alignas[offsetof (struct alignas_test, alignas_8) == 8
+ ? 1 : -1];
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_header_working_stdalign_h=yes
+else $as_nop
+ gl_cv_header_working_stdalign_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdalign_h" >&5
+printf "%s\n" "$gl_cv_header_working_stdalign_h" >&6; }
+
+ if test $gl_cv_header_working_stdalign_h = yes; then
+ STDALIGN_H=''
+ else
+ STDALIGN_H='stdalign.h'
+ fi
+
+
+ if test -n "$STDALIGN_H"; then
+ GL_GENERATE_STDALIGN_H_TRUE=
+ GL_GENERATE_STDALIGN_H_FALSE='#'
+else
+ GL_GENERATE_STDALIGN_H_TRUE='#'
+ GL_GENERATE_STDALIGN_H_FALSE=
+fi
+
+
+
+
+
+
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ case "$host_os" in
+ solaris*)
+ if test -z "$GCC"; then
+ STDBOOL_H='stdbool.h'
+ else
+ STDBOOL_H=''
+ fi
+ ;;
+ *)
+ STDBOOL_H=''
+ ;;
+ esac
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+
+ if test -n "$STDBOOL_H"; then
+ GL_GENERATE_STDBOOL_H_TRUE=
+ GL_GENERATE_STDBOOL_H_FALSE='#'
+else
+ GL_GENERATE_STDBOOL_H_TRUE='#'
+ GL_GENERATE_STDBOOL_H_FALSE=
+fi
+
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+
+
+
+
+
+ STDDEF_H=
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
+printf %s "checking for good max_align_t... " >&6; }
+if test ${gl_cv_type_max_align_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ unsigned int s = sizeof (max_align_t);
+ #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+ int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_max_align_t=yes
+else $as_nop
+ gl_cv_type_max_align_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
+printf "%s\n" "$gl_cv_type_max_align_t" >&6; }
+ if test $gl_cv_type_max_align_t = no; then
+ HAVE_MAX_ALIGN_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
+printf %s "checking whether NULL can be used in arbitrary expressions... " >&6; }
+if test ${gl_cv_decl_null_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_decl_null_works=yes
+else $as_nop
+ gl_cv_decl_null_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
+printf "%s\n" "$gl_cv_decl_null_works" >&6; }
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ STDDEF_H=stddef.h
+ fi
+
+
+ if test -n "$STDDEF_H"; then
+ GL_GENERATE_STDDEF_H_TRUE=
+ GL_GENERATE_STDDEF_H_FALSE='#'
+else
+ GL_GENERATE_STDDEF_H_TRUE='#'
+ GL_GENERATE_STDDEF_H_FALSE=
+fi
+
+ if test -n "$STDDEF_H"; then
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stddef_h='<'stddef.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
+printf %s "checking absolute name of <stddef.h>... " >&6; }
+if test ${gl_cv_next_stddef_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stddef.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stddef_h
+ gl_cv_next_stddef_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
+printf "%s\n" "$gl_cv_next_stddef_h" >&6; }
+ fi
+ NEXT_STDDEF_H=$gl_cv_next_stddef_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stddef.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stddef_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
+
+
+
+
+ fi
+
+
+
+
+ printf "%s\n" "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdio_h='<'stdio.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
+printf %s "checking absolute name of <stdio.h>... " >&6; }
+if test ${gl_cv_next_stdio_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdio.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdio_h
+ gl_cv_next_stdio_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
+printf "%s\n" "$gl_cv_next_stdio_h" >&6; }
+ fi
+ NEXT_STDIO_H=$gl_cv_next_stdio_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdio.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdio_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
+printf %s "checking which flavor of printf attribute matches inttypes macros... " >&6; }
+if test ${gl_cv_func_printf_attribute_flavor+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #define __STDC_FORMAT_MACROS 1
+ #include <stdio.h>
+ #include <inttypes.h>
+ /* For non-mingw systems, compilation will trivially succeed.
+ For mingw, compilation will succeed for older mingw (system
+ printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+ #if (defined _WIN32 && ! defined __CYGWIN__) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+ extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_printf_attribute_flavor=system
+else $as_nop
+ gl_cv_func_printf_attribute_flavor=gnu
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
+printf "%s\n" "$gl_cv_func_printf_attribute_flavor" >&6; }
+ if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+
+printf "%s\n" "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h
+
+ fi
+
+ GNULIB_FSCANF=1
+
+
+printf "%s\n" "#define GNULIB_FSCANF 1" >>confdefs.h
+
+
+ GNULIB_SCANF=1
+
+
+printf "%s\n" "#define GNULIB_SCANF 1" >>confdefs.h
+
+
+ GNULIB_FGETC=1
+ GNULIB_GETC=1
+ GNULIB_GETCHAR=1
+ GNULIB_FGETS=1
+ GNULIB_FREAD=1
+
+
+ GNULIB_FPRINTF=1
+ GNULIB_PRINTF=1
+ GNULIB_VFPRINTF=1
+ GNULIB_VPRINTF=1
+ GNULIB_FPUTC=1
+ GNULIB_PUTC=1
+ GNULIB_PUTCHAR=1
+ GNULIB_FPUTS=1
+ GNULIB_PUTS=1
+ GNULIB_FWRITE=1
+
+
+
+
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS stdio-write.$ac_objext"
+
+ fi
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_fcloseall = no; then
+ HAVE_DECL_FCLOSEALL=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_stdlib_h='<'stdlib.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
+printf %s "checking absolute name of <stdlib.h>... " >&6; }
+if test ${gl_cv_next_stdlib_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'stdlib.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_stdlib_h
+ gl_cv_next_stdlib_h='"'$gl_header'"'
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
+printf "%s\n" "$gl_cv_next_stdlib_h" >&6; }
+ fi
+ NEXT_STDLIB_H=$gl_cv_next_stdlib_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'stdlib.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_stdlib_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_ecvt = no; then
+ HAVE_DECL_ECVT=0
+ fi
+
+ if test $ac_cv_have_decl_fcvt = no; then
+ HAVE_DECL_FCVT=0
+ fi
+
+ if test $ac_cv_have_decl_gcvt = no; then
+ HAVE_DECL_GCVT=0
+ fi
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy"
+if test "x$ac_cv_func_stpcpy" = xyes
+then :
+ printf "%s\n" "#define HAVE_STPCPY 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_stpcpy = no; then
+ HAVE_STPCPY=0
+ fi
+
+ if test $HAVE_STPCPY = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_STPCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STPCPY 1" >>confdefs.h
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp"
+if test "x$ac_cv_func_strcasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+ fi
+
+
+
+ ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp"
+if test "x$ac_cv_func_strncasecmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strncasecmp = yes; then
+ HAVE_STRNCASECMP=1
+ else
+ HAVE_STRNCASECMP=0
+ fi
+ ac_fn_c_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strncasecmp" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_STRNCASECMP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_strncasecmp = no; then
+ HAVE_DECL_STRNCASECMP=0
+ fi
+
+
+ if test $HAVE_STRCASECMP = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strcasecmp.$ac_objext"
+
+
+ :
+
+ fi
+ if test $HAVE_STRNCASECMP = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strncasecmp.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "strchrnul" "ac_cv_func_strchrnul"
+if test "x$ac_cv_func_strchrnul" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRCHRNUL 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strchrnul = no; then
+ HAVE_STRCHRNUL=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strchrnul works" >&5
+printf %s "checking whether strchrnul works... " >&6; }
+if test ${gl_cv_func_strchrnul_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#if defined __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9)
+ Lucky user
+ #endif
+#else
+ Lucky user
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "Lucky user" >/dev/null 2>&1
+then :
+ gl_cv_func_strchrnul_works="guessing yes"
+else $as_nop
+ gl_cv_func_strchrnul_works="guessing no"
+fi
+rm -rf conftest*
+
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <string.h> /* for strchrnul */
+
+int
+main (void)
+{
+const char *buf = "a";
+ return strchrnul (buf, 'b') != buf + 1;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strchrnul_works=yes
+else $as_nop
+ gl_cv_func_strchrnul_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strchrnul_works" >&5
+printf "%s\n" "$gl_cv_func_strchrnul_works" >&6; }
+ case "$gl_cv_func_strchrnul_works" in
+ *yes) ;;
+ *) REPLACE_STRCHRNUL=1 ;;
+ esac
+ fi
+
+ if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strchrnul.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_STRCHRNUL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRCHRNUL 1" >>confdefs.h
+
+
+
+
+
+
+ if test $gl_cv_func_malloc_posix != yes; then
+ REPLACE_STRDUP=1
+ fi
+
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+
+ if test $REPLACE_STRDUP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strdup.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_STRDUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRDUP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5
+printf %s "checking for working strerror function... " >&6; }
+if test ${gl_cv_func_working_strerror+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_strerror="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+int
+main (void)
+{
+if (!*strerror (-2)) return 1;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_working_strerror=yes
+else $as_nop
+ gl_cv_func_working_strerror=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5
+printf "%s\n" "$gl_cv_func_working_strerror" >&6; }
+ case "$gl_cv_func_working_strerror" in
+ *yes) ;;
+ *)
+ REPLACE_STRERROR=1
+ ;;
+ esac
+
+ case "$gl_cv_func_strerror_r_works" in
+ *no) REPLACE_STRERROR=1 ;;
+ esac
+
+ else
+ REPLACE_STRERROR=1
+ fi
+
+ if test $REPLACE_STRERROR = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"
+
+ fi
+
+
+printf "%s\n" "#define GNULIB_STRERROR 1" >>confdefs.h
+
+
+
+
+
+
+
+ GNULIB_STRERROR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRERROR 1" >>confdefs.h
+
+
+
+
+
+ if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext"
+
+
+
+
+
+ if test $ac_cv_header_sys_socket_h != yes; then
+ ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
+
+fi
+
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+
+
+ fi
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_strerror_r = no; then
+ HAVE_DECL_STRERROR_R=0
+ fi
+
+ if test $ac_cv_func_strerror_r = yes; then
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ if test $gl_cv_func_strerror_r_posix_signature = yes; then
+ case "$gl_cv_func_strerror_r_works" in
+ *no) REPLACE_STRERROR_R=1 ;;
+ esac
+ else
+ REPLACE_STRERROR_R=1
+ fi
+ else
+ REPLACE_STRERROR_R=1
+ fi
+ fi
+
+ if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strerror_r.$ac_objext"
+
+
+
+
+
+
+ fi
+
+
+
+
+
+ GNULIB_STRERROR_R=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRERROR_R 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define GNULIB_STRERROR_R_POSIX 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_strndup = no; then
+ HAVE_DECL_STRNDUP=0
+ fi
+
+ if test $ac_cv_func_strndup = yes; then
+ HAVE_STRNDUP=1
+ # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strndup" >&5
+printf %s "checking for working strndup... " >&6; }
+if test ${gl_cv_func_strndup_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+
+ case $host_os in
+ aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
+ *) gl_cv_func_strndup_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <string.h>
+ #include <stdlib.h>
+int
+main (void)
+{
+
+#if !HAVE_DECL_STRNDUP
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ char *strndup (const char *, size_t);
+#endif
+ int result;
+ char *s;
+ s = strndup ("some longer string", 15);
+ free (s);
+ s = strndup ("shorter string", 13);
+ result = s[13] != '\0';
+ free (s);
+ return result;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strndup_works=yes
+else $as_nop
+ gl_cv_func_strndup_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strndup_works" >&5
+printf "%s\n" "$gl_cv_func_strndup_works" >&6; }
+ case $gl_cv_func_strndup_works in
+ *no) REPLACE_STRNDUP=1 ;;
+ esac
+ else
+ HAVE_STRNDUP=0
+ fi
+
+ if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strndup.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_STRNDUP=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRNDUP 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_strnlen = no; then
+ HAVE_DECL_STRNLEN=0
+ else
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working strnlen" >&5
+printf %s "checking for working strnlen... " >&6; }
+if test ${ac_cv_func_strnlen_working+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ # Guess no on AIX systems, yes otherwise.
+ case "$host_os" in
+ aix*) ac_cv_func_strnlen_working=no;;
+ *) ac_cv_func_strnlen_working=yes;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main (void)
+{
+
+#define S "foobar"
+#define S_LEN (sizeof S - 1)
+
+ /* At least one implementation is buggy: that of AIX 4.3 would
+ give strnlen (S, 1) == 3. */
+
+ int i;
+ for (i = 0; i < S_LEN + 1; ++i)
+ {
+ int expected = i <= S_LEN ? i : S_LEN;
+ if (strnlen (S, i) != expected)
+ return 1;
+ }
+ return 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_strnlen_working=yes
+else $as_nop
+ ac_cv_func_strnlen_working=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strnlen_working" >&5
+printf "%s\n" "$ac_cv_func_strnlen_working" >&6; }
+test $ac_cv_func_strnlen_working = no && :
+
+
+ if test $ac_cv_func_strnlen_working = no; then
+ REPLACE_STRNLEN=1
+ fi
+ fi
+
+ if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strnlen.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_STRNLEN=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRNLEN 1" >>confdefs.h
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "strpbrk" "ac_cv_func_strpbrk"
+if test "x$ac_cv_func_strpbrk" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRPBRK 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strpbrk = no; then
+ HAVE_STRPBRK=0
+ fi
+
+ if test $HAVE_STRPBRK = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strpbrk.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_STRPBRK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRPBRK 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $ac_cv_func_strptime != yes; then
+ HAVE_STRPTIME=0
+ fi
+
+ if test $HAVE_STRPTIME = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strptime.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_STRPTIME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRPTIME 1" >>confdefs.h
+
+
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r"
+if test "x$ac_cv_func_strtok_r" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRTOK_R 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strtok_r = yes; then
+ HAVE_STRTOK_R=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether strtok_r works" >&5
+printf %s "checking whether strtok_r works... " >&6; }
+if test ${gl_cv_func_strtok_r_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_strtok_r_works="guessing yes" ;;
+ *) gl_cv_func_strtok_r_works="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #ifndef __OPTIMIZE__
+ # define __OPTIMIZE__ 1
+ #endif
+ #undef __OPTIMIZE_SIZE__
+ #undef __NO_INLINE__
+ #include <stdlib.h>
+ #include <string.h>
+
+int
+main (void)
+{
+static const char dummy[] = "\177\01a";
+ char delimiters[] = "xxxxxxxx";
+ char *save_ptr = (char *) dummy;
+ strtok_r (delimiters, "x", &save_ptr);
+ strtok_r (NULL, "x", &save_ptr);
+ return 0;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_strtok_r_works=yes
+else $as_nop
+ gl_cv_func_strtok_r_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strtok_r_works" >&5
+printf "%s\n" "$gl_cv_func_strtok_r_works" >&6; }
+ case "$gl_cv_func_strtok_r_works" in
+ *no)
+ UNDEFINE_STRTOK_R=1
+ ;;
+ esac
+ else
+ HAVE_STRTOK_R=0
+ fi
+
+ if test $ac_cv_have_decl_strtok_r = no; then
+ HAVE_DECL_STRTOK_R=0
+ fi
+
+ if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strtok_r.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_STRTOK_R=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRTOK_R 1" >>confdefs.h
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol"
+if test "x$ac_cv_func_strtol" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h
+
+fi
+
+
+ if test $ac_cv_func_strtol = no; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strtol.$ac_objext"
+
+ fi
+
+
+ ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll"
+if test "x$ac_cv_func_strtoll" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_strtoll = no; then
+ HAVE_STRTOLL=0
+ fi
+
+ if test $HAVE_STRTOLL = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS strtoll.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_STRTOLL=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_STRTOLL 1" >>confdefs.h
+
+
+
+
+
+
+ if test $ac_cv_func_symlink = no; then
+ HAVE_SYMLINK=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether symlink handles trailing slash correctly" >&5
+printf %s "checking whether symlink handles trailing slash correctly... " >&6; }
+if test ${gl_cv_func_symlink_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_symlink_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_symlink_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_symlink_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+
+int
+main (void)
+{
+int result = 0;
+ if (!symlink ("a", "conftest.link/"))
+ result |= 1;
+ if (symlink ("conftest.f", "conftest.lnk2"))
+ result |= 2;
+ else if (!symlink ("a", "conftest.lnk2/"))
+ result |= 4;
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_symlink_works=yes
+else $as_nop
+ gl_cv_func_symlink_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.f conftest.link conftest.lnk2
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_symlink_works" >&5
+printf "%s\n" "$gl_cv_func_symlink_works" >&6; }
+ case "$gl_cv_func_symlink_works" in
+ *yes) ;;
+ *)
+ REPLACE_SYMLINK=1
+ ;;
+ esac
+ fi
+
+ if test $HAVE_SYMLINK = 0 || test $REPLACE_SYMLINK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS symlink.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_SYMLINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_SYMLINK 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_file_h='<'sys/file.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/file.h>" >&5
+printf %s "checking absolute name of <sys/file.h>... " >&6; }
+if test ${gl_cv_next_sys_file_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_file_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/file.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/file.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_file_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_file_h
+ gl_cv_next_sys_file_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_file_h='<'sys/file.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_file_h" >&5
+printf "%s\n" "$gl_cv_next_sys_file_h" >&6; }
+ fi
+ NEXT_SYS_FILE_H=$gl_cv_next_sys_file_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/file.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_file_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H=$gl_next_as_first_directive
+
+
+
+
+
+ if test $ac_cv_header_sys_file_h = yes; then
+ HAVE_SYS_FILE_H=1
+ else
+ HAVE_SYS_FILE_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_header_sys_ioctl_h = yes; then
+ HAVE_SYS_IOCTL_H=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether <sys/ioctl.h> declares ioctl" >&5
+printf %s "checking whether <sys/ioctl.h> declares ioctl... " >&6; }
+if test ${gl_cv_decl_ioctl_in_sys_ioctl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/ioctl.h>
+int
+main (void)
+{
+(void) ioctl;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_decl_ioctl_in_sys_ioctl_h=yes
+else $as_nop
+ gl_cv_decl_ioctl_in_sys_ioctl_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_ioctl_in_sys_ioctl_h" >&5
+printf "%s\n" "$gl_cv_decl_ioctl_in_sys_ioctl_h" >&6; }
+ else
+ HAVE_SYS_IOCTL_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_ioctl_h='<'sys/ioctl.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/ioctl.h>" >&5
+printf %s "checking absolute name of <sys/ioctl.h>... " >&6; }
+if test ${gl_cv_next_sys_ioctl_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_ioctl_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/ioctl.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/ioctl.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_ioctl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_ioctl_h
+ gl_cv_next_sys_ioctl_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_ioctl_h='<'sys/ioctl.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_ioctl_h" >&5
+printf "%s\n" "$gl_cv_next_sys_ioctl_h" >&6; }
+ fi
+ NEXT_SYS_IOCTL_H=$gl_cv_next_sys_ioctl_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/ioctl.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_ioctl_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_random_h='<'sys/random.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/random.h>" >&5
+printf %s "checking absolute name of <sys/random.h>... " >&6; }
+if test ${gl_cv_next_sys_random_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_random_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/random.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/random.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_random_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_random_h
+ gl_cv_next_sys_random_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_random_h='<'sys/random.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_random_h" >&5
+printf "%s\n" "$gl_cv_next_sys_random_h" >&6; }
+ fi
+ NEXT_SYS_RANDOM_H=$gl_cv_next_sys_random_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/random.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_random_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_sys_random_h = yes; then
+ HAVE_SYS_RANDOM_H=1
+ else
+ HAVE_SYS_RANDOM_H=0
+ fi
+
+
+
+ if test $ac_cv_header_sys_random_h = yes; then
+ UNISTD_H_HAVE_SYS_RANDOM_H=1
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/stat.h>" >&5
+printf %s "checking absolute name of <sys/stat.h>... " >&6; }
+if test ${gl_cv_next_sys_stat_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_stat_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/stat.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/stat.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_stat_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_stat_h
+ gl_cv_next_sys_stat_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_stat_h='<'sys/stat.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_stat_h" >&5
+printf "%s\n" "$gl_cv_next_sys_stat_h" >&6; }
+ fi
+ NEXT_SYS_STAT_H=$gl_cv_next_sys_stat_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/stat.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_stat_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+ WINDOWS_STAT_TIMESPEC=0
+
+
+
+
+
+
+
+
+ ac_fn_c_check_type "$LINENO" "nlink_t" "ac_cv_type_nlink_t" "#include <sys/types.h>
+ #include <sys/stat.h>
+"
+if test "x$ac_cv_type_nlink_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define nlink_t int" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_uio_h='<'sys/uio.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/uio.h>" >&5
+printf %s "checking absolute name of <sys/uio.h>... " >&6; }
+if test ${gl_cv_next_sys_uio_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_uio_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/uio.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/uio.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_uio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_uio_h
+ gl_cv_next_sys_uio_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_uio_h='<'sys/uio.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_uio_h" >&5
+printf "%s\n" "$gl_cv_next_sys_uio_h" >&6; }
+ fi
+ NEXT_SYS_UIO_H=$gl_cv_next_sys_uio_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/uio.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_uio_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_sys_uio_h = yes; then
+ HAVE_SYS_UIO_H=1
+ else
+ HAVE_SYS_UIO_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_sys_wait_h='<'sys/wait.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/wait.h>" >&5
+printf %s "checking absolute name of <sys/wait.h>... " >&6; }
+if test ${gl_cv_next_sys_wait_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_sys_wait_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/wait.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'sys/wait.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_sys_wait_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_sys_wait_h
+ gl_cv_next_sys_wait_h='"'$gl_header'"'
+ else
+ gl_cv_next_sys_wait_h='<'sys/wait.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_wait_h" >&5
+printf "%s\n" "$gl_cv_next_sys_wait_h" >&6; }
+ fi
+ NEXT_SYS_WAIT_H=$gl_cv_next_sys_wait_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'sys/wait.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_sys_wait_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :
+
+
+
+
+printf "%s\n" "#define GNULIB_TEMPNAME 1" >>confdefs.h
+
+
+ ac_fn_c_check_header_compile "$LINENO" "sys/single_threaded.h" "ac_cv_header_sys_single_threaded_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_single_threaded_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SINGLE_THREADED_H 1" >>confdefs.h
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "localtime_r" "ac_cv_have_decl_localtime_r" "/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+
+"
+if test "x$ac_cv_have_decl_localtime_r" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_LOCALTIME_R $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_localtime_r = no; then
+ HAVE_DECL_LOCALTIME_R=0
+ fi
+
+
+ if test $ac_cv_func_localtime_r = yes; then
+ HAVE_LOCALTIME_R=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether localtime_r is compatible with its POSIX signature" >&5
+printf %s "checking whether localtime_r is compatible with its POSIX signature... " >&6; }
+if test ${gl_cv_time_r_posix+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+
+int
+main (void)
+{
+/* We don't need to append 'restrict's to the argument types,
+ even though the POSIX signature has the 'restrict's,
+ since C99 says they can't affect type compatibility. */
+ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r;
+ if (ptr) return 0;
+ /* Check the return type is a pointer.
+ On HP-UX 10 it is 'int'. */
+ *localtime_r (0, 0);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_time_r_posix=yes
+else $as_nop
+ gl_cv_time_r_posix=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_time_r_posix" >&5
+printf "%s\n" "$gl_cv_time_r_posix" >&6; }
+ if test $gl_cv_time_r_posix = yes; then
+ REPLACE_LOCALTIME_R=0
+ else
+ REPLACE_LOCALTIME_R=1
+ fi
+ else
+ HAVE_LOCALTIME_R=0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether localtime_r exists as an inline function" >&5
+printf %s "checking whether localtime_r exists as an inline function... " >&6; }
+if test ${gl_cv_func_localtime_r_inline+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+
+int
+main (void)
+{
+time_t a;
+ struct tm r;
+ localtime_r (&a, &r);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_localtime_r_inline=yes
+else $as_nop
+ gl_cv_func_localtime_r_inline=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_localtime_r_inline" >&5
+printf "%s\n" "$gl_cv_func_localtime_r_inline" >&6; }
+ if test $gl_cv_func_localtime_r_inline = yes; then
+ REPLACE_LOCALTIME_R=1
+ fi
+ fi
+
+ if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS time_r.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_TIME_R=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_TIME_R 1" >>confdefs.h
+
+
+
+
+
+
+ REPLACE_TIMEGM=0
+
+ if test $ac_cv_func_timegm = yes; then
+ if test "$gl_cv_func_working_mktime" != yes; then
+ # Assume that timegm is buggy if mktime is.
+ REPLACE_TIMEGM=1
+ fi
+ else
+ HAVE_TIMEGM=0
+ fi
+
+ if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS timegm.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_TIMEGM=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_TIMEGM 1" >>confdefs.h
+
+
+
+ :
+ :
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNICASE_H='unicase.h'
+ else
+ LIBUNISTRING_UNICASE_H=
+ fi
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 1
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE=
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 1
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE=
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE=
+fi
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE=
+ LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE=
+ LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNICTYPE_H='unictype.h'
+ else
+ LIBUNISTRING_UNICTYPE_H=
+ fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE=
+ LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE=
+fi
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE=
+ LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE='#'
+ LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNINORM_H='uninorm.h'
+ else
+ LIBUNISTRING_UNINORM_H=
+ fi
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_UNINORM_U8_NORMALIZE 1" >>confdefs.h
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE=
+ LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE='#'
+ LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_unistd_h='<'unistd.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
+printf %s "checking absolute name of <unistd.h>... " >&6; }
+if test ${gl_cv_next_unistd_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_unistd_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <unistd.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'unistd.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_unistd_h
+ gl_cv_next_unistd_h='"'$gl_header'"'
+ else
+ gl_cv_next_unistd_h='<'unistd.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
+printf "%s\n" "$gl_cv_next_unistd_h" >&6; }
+ fi
+ NEXT_UNISTD_H=$gl_cv_next_unistd_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'unistd.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_unistd_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ else
+ HAVE_UNISTD_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_have_decl_execvpe = no; then
+ HAVE_DECL_EXECVPE=0
+ fi
+
+
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNISTR_H='unistr.h'
+ else
+ LIBUNISTRING_UNISTR_H=
+ fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE=
+ LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE='#'
+ LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE=
+fi
+
+
+
+
+printf "%s\n" "#define GNULIB_UNISTR_U8_MBTOUC_UNSAFE 1" >>confdefs.h
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE=
+ LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE='#'
+ LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE=
+ LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE='#'
+ LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE=
+fi
+
+
+
+
+printf "%s\n" "#define GNULIB_UNISTR_U8_UCTOMB 1" >>confdefs.h
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 0
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE=
+ LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE='#'
+ LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE=
+fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNITYPES_H='unitypes.h'
+ else
+ LIBUNISTRING_UNITYPES_H=
+ fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 4
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_UNIWIDTH_H='uniwidth.h'
+ else
+ LIBUNISTRING_UNIWIDTH_H=
+ fi
+
+
+
+
+ if { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+
+
+
+ test $LIBUNISTRING_VERSION_MAJOR -lt 0 \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq 0 \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt 9 \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq 9 \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt 8
+ }
+ }
+ }
+
+
+
+
+ }
+ }; then
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE=
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE='#'
+else
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE='#'
+ LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE=
+fi
+
+
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether unlink honors trailing slashes" >&5
+printf %s "checking whether unlink honors trailing slashes... " >&6; }
+if test ${gl_cv_func_unlink_honors_slashes+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ touch conftest.file
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.file conftest.lnk
+ fi
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_unlink_honors_slashes="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ #endif
+ #include <errno.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int result = 0;
+ if (!unlink ("conftest.file/"))
+ result |= 1;
+ else if (errno != ENOTDIR)
+ result |= 2;
+#if HAVE_LSTAT
+ if (!unlink ("conftest.lnk/"))
+ result |= 4;
+ else if (errno != ENOTDIR)
+ result |= 8;
+#endif
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_unlink_honors_slashes=yes
+else $as_nop
+ gl_cv_func_unlink_honors_slashes=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.file conftest.lnk
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_honors_slashes" >&5
+printf "%s\n" "$gl_cv_func_unlink_honors_slashes" >&6; }
+ case "$gl_cv_func_unlink_honors_slashes" in
+ *no)
+ REPLACE_UNLINK=1
+ ;;
+ esac
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether unlink of a parent directory fails as it should" >&5
+printf %s "checking whether unlink of a parent directory fails as it should... " >&6; }
+if test ${gl_cv_func_unlink_parent_fails+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case "$host_os" in
+ darwin*)
+ if {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=/tmp/gt$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ }; then
+ mkdir "$tmp/subdir"
+ GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
+ export GL_SUBDIR_FOR_UNLINK
+ if test "$cross_compiling" = yes
+then :
+ # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <stdlib.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <direct.h>
+ # include <io.h>
+ #endif
+
+
+$gl_mda_defines
+
+ int main ()
+ {
+ int result = 0;
+ if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
+ result |= 1;
+ else if (unlink ("..") == 0)
+ result |= 2;
+ return result;
+ }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_unlink_parent_fails=yes
+else $as_nop
+ gl_cv_func_unlink_parent_fails=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ unset GL_SUBDIR_FOR_UNLINK
+ rm -rf "$tmp"
+ else
+ gl_cv_func_unlink_parent_fails="guessing no"
+ fi
+ ;;
+ *)
+ gl_cv_func_unlink_parent_fails="guessing yes"
+ ;;
+ esac
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unlink_parent_fails" >&5
+printf "%s\n" "$gl_cv_func_unlink_parent_fails" >&6; }
+ case "$gl_cv_func_unlink_parent_fails" in
+ *no)
+ REPLACE_UNLINK=1
+
+printf "%s\n" "#define UNLINK_PARENT_BUG 1" >>confdefs.h
+
+ ;;
+ esac
+
+ if test $REPLACE_UNLINK = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS unlink.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_UNLINK=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_UNLINK 1" >>confdefs.h
+
+
+
+
+
+printf "%s\n" "#define USE_UNLOCKED_IO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ case "$host_os" in
+ mingw*)
+ REPLACE_UTIME=1
+ ;;
+ *)
+ ac_fn_c_check_func "$LINENO" "utime" "ac_cv_func_utime"
+if test "x$ac_cv_func_utime" = xyes
+then :
+ printf "%s\n" "#define HAVE_UTIME 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_utime = no; then
+ HAVE_UTIME=0
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether utime handles trailing slashes on files" >&5
+printf %s "checking whether utime handles trailing slashes on files... " >&6; }
+if test ${gl_cv_func_utime_file_slash+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ touch conftest.tmp
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_utime_file_slash="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_utime_file_slash="guessing yes" ;;
+ # Guess no on macOS.
+ darwin*) gl_cv_func_utime_file_slash="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_utime_file_slash="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stddef.h>
+ #include <time.h>
+
+int
+main (void)
+{
+int result = 0;
+ if (!utime ("conftest.tmp/", NULL))
+ result |= 1;
+ #if HAVE_LSTAT
+ if (!utime ("conftest.lnk/", NULL))
+ result |= 2;
+ #endif
+ return result;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_utime_file_slash=yes
+else $as_nop
+ gl_cv_func_utime_file_slash=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.tmp conftest.lnk
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_utime_file_slash" >&5
+printf "%s\n" "$gl_cv_func_utime_file_slash" >&6; }
+ case $gl_cv_func_stat_file_slash in
+ *no)
+ REPLACE_UTIME=1
+
+printf "%s\n" "#define REPLACE_FUNC_UTIME_FILE 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+ ;;
+ esac
+
+ if test $HAVE_UTIME = 0 || test $REPLACE_UTIME = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS utime.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_UTIME=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_UTIME 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_utime_h='<'utime.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <utime.h>" >&5
+printf %s "checking absolute name of <utime.h>... " >&6; }
+if test ${gl_cv_next_utime_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_utime_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <utime.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'utime.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_utime_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_utime_h
+ gl_cv_next_utime_h='"'$gl_header'"'
+ else
+ gl_cv_next_utime_h='<'utime.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_utime_h" >&5
+printf "%s\n" "$gl_cv_next_utime_h" >&6; }
+ fi
+ NEXT_UTIME_H=$gl_cv_next_utime_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'utime.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_utime_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_UTIME_H=$gl_next_as_first_directive
+
+
+
+
+
+ if test $ac_cv_header_utime_h = yes; then
+ HAVE_UTIME_H=1
+ else
+ HAVE_UTIME_H=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_futimens = no && test $ac_cv_func_futimesat = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether futimesat handles NULL file" >&5
+printf %s "checking whether futimesat handles NULL file... " >&6; }
+if test ${gl_cv_func_futimesat_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ touch conftest.file
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_futimesat_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_futimesat_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_futimesat_works="$gl_cross_guess_normal" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stddef.h>
+#include <sys/times.h>
+#include <fcntl.h>
+
+
+$gl_mda_defines
+
+int
+main (void)
+{
+int fd = open ("conftest.file", O_RDWR);
+ if (fd < 0) return 1;
+ if (futimesat (fd, NULL, NULL)) return 2;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_futimesat_works=yes
+else $as_nop
+ gl_cv_func_futimesat_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ rm -f conftest.file
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_futimesat_works" >&5
+printf "%s\n" "$gl_cv_func_futimesat_works" >&6; }
+ case "$gl_cv_func_futimesat_works" in
+ *yes) ;;
+ *)
+
+printf "%s\n" "#define FUTIMESAT_NULL_BUG 1" >>confdefs.h
+
+ ;;
+ esac
+ fi
+
+
+
+
+ if test $ac_cv_func_vasnprintf = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vasnprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-args.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS printf-parse.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS asnprintf.$ac_objext"
+
+ if test $ac_cv_func_vasnprintf = yes; then
+
+printf "%s\n" "#define REPLACE_VASNPRINTF 1" >>confdefs.h
+
+ 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 :
+
+else $as_nop
+
+printf "%s\n" "#define ptrdiff_t long" >>confdefs.h
+
+
+fi
+
+
+
+
+
+
+
+ fi
+
+
+ ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
+if test "x$ac_cv_func_vasprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_vasprintf = no; then
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vasprintf.$ac_objext"
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS asprintf.$ac_objext"
+
+
+ if test $ac_cv_func_vasprintf = yes; then
+ REPLACE_VASPRINTF=1
+ else
+ HAVE_VASPRINTF=0
+ fi
+
+
+
+
+
+
+
+
+ fi
+
+
+
+
+
+
+ GNULIB_VASPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VASPRINTF 1" >>confdefs.h
+
+
+
+
+
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=asprintf:2:c-format"
+
+
+
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=vasprintf:2:c-format"
+
+
+
+ gl_cv_func_vsnprintf_usable=no
+ ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_vsnprintf = yes; then
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether snprintf respects a size of 1" >&5
+printf %s "checking whether snprintf respects a size of 1... " >&6; }
+if test ${gl_cv_func_snprintf_size1+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_snprintf_size1=yes
+else $as_nop
+ gl_cv_func_snprintf_size1=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_snprintf_size1" >&5
+printf "%s\n" "$gl_cv_func_snprintf_size1" >&6; }
+
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether printf supports POSIX/XSI format strings with positions" >&5
+printf %s "checking whether printf supports POSIX/XSI format strings with positions... " >&6; }
+if test ${gl_cv_func_printf_positions+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_printf_positions=yes
+else $as_nop
+ gl_cv_func_printf_positions=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_positions" >&5
+printf "%s\n" "$gl_cv_func_printf_positions" >&6; }
+
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_vsnprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_usable = no; then
+
+
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS vsnprintf.$ac_objext"
+
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ else
+
+ if test $ac_cv_have_decl_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ fi
+ fi
+ :
+
+ fi
+
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+
+
+
+
+
+
+ GNULIB_VSNPRINTF=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_VSNPRINTF 1" >>confdefs.h
+
+
+
+
+
+ ac_fn_c_check_func "$LINENO" "waitid" "ac_cv_func_waitid"
+if test "x$ac_cv_func_waitid" = xyes
+then :
+ printf "%s\n" "#define HAVE_WAITID 1" >>confdefs.h
+
+fi
+
+
+
+
+ HAVE_WAITPID=1
+ case $host_os in
+ mingw*) HAVE_WAITPID=0 ;;
+ esac
+
+ if test $HAVE_WAITPID = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS waitpid.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_WAITPID=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WAITPID 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_wchar_h='<'wchar.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wchar.h>" >&5
+printf %s "checking absolute name of <wchar.h>... " >&6; }
+if test ${gl_cv_next_wchar_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_wchar_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'wchar.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_wchar_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_wchar_h
+ gl_cv_next_wchar_h='"'$gl_header'"'
+ else
+ gl_cv_next_wchar_h='<'wchar.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wchar_h" >&5
+printf "%s\n" "$gl_cv_next_wchar_h" >&6; }
+ fi
+ NEXT_WCHAR_H=$gl_cv_next_wchar_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'wchar.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_wchar_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_WCHAR_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+
+
+
+
+
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "wcsdup" "ac_cv_have_decl_wcsdup" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_wcsdup" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_WCSDUP $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_wcsdup = no; then
+ HAVE_DECL_WCSDUP=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+ if case "$host_os" in
+ mingw*) true ;;
+ *) test $ac_cv_func_mbsinit = yes ;;
+ esac \
+ && test $ac_cv_func_mbrtowc = yes; then
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc handles incomplete characters" >&5
+printf %s "checking whether mbrtowc handles incomplete characters... " >&6; }
+if test ${gl_cv_func_mbrtowc_incomplete_state+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+ if test $LOCALE_JA != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+ else
+ if test $LOCALE_FR_UTF8 != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_incomplete_state=yes
+else $as_nop
+ gl_cv_func_mbrtowc_incomplete_state=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_incomplete_state" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_incomplete_state" >&6; }
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc works as well as mbtowc" >&5
+printf %s "checking whether mbrtowc works as well as mbtowc... " >&6; }
+if test ${gl_cv_func_mbrtowc_sanitycheck+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+ if test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 2;
+ }
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_mbrtowc_sanitycheck=yes
+else $as_nop
+ gl_cv_func_mbrtowc_sanitycheck=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_mbrtowc_sanitycheck" >&5
+printf "%s\n" "$gl_cv_func_mbrtowc_sanitycheck" >&6; }
+
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+
+
+
+ if test $ac_cv_func_wcrtomb = no; then
+ HAVE_WCRTOMB=0
+ ac_fn_c_check_decl "$LINENO" "wcrtomb" "ac_cv_have_decl_wcrtomb" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_wcrtomb" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_WCRTOMB $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_wcrtomb = yes; then
+ REPLACE_WCRTOMB=1
+ fi
+ else
+ if test $REPLACE_WCRTOMB = 0; then
+
+
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb works in the C locale" >&5
+printf %s "checking whether wcrtomb works in the C locale... " >&6; }
+if test ${gl_cv_func_wcrtomb_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_wcrtomb_works="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcrtomb_works="guessing yes";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <string.h>
+#include <stdlib.h>
+#include <wchar.h>
+int main ()
+{
+ mbstate_t state;
+ char out[64];
+ int count;
+ memset (&state, 0, sizeof (state));
+ out[0] = 'x';
+ count = wcrtomb (out, L'a', &state);
+ return !(count == 1 && out[0] == 'a');
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_wcrtomb_works=yes
+else $as_nop
+ gl_cv_func_wcrtomb_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_works" >&5
+printf "%s\n" "$gl_cv_func_wcrtomb_works" >&6; }
+ case "$gl_cv_func_wcrtomb_works" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define WCRTOMB_C_LOCALE_BUG 1" >>confdefs.h
+
+ REPLACE_WCRTOMB=1 ;;
+ esac
+ fi
+ if test $REPLACE_WCRTOMB = 0; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcrtomb return value is correct" >&5
+printf %s "checking whether wcrtomb return value is correct... " >&6; }
+if test ${gl_cv_func_wcrtomb_retval+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ case "$host_os" in
+ # Guess no on AIX 4, OSF/1, Solaris, native Windows.
+ aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcrtomb_retval="guessing yes" ;;
+ esac
+ if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ if test "$cross_compiling" = yes
+then :
+ :
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+#include <stdlib.h>
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 2;
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ if (mbtowc (&wc, "\303\274", 2) == 2)
+ if (wcrtomb (NULL, wc, NULL) != 1)
+ result |= 2;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 8;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_wcrtomb_retval=yes
+else $as_nop
+ gl_cv_func_wcrtomb_retval=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcrtomb_retval" >&5
+printf "%s\n" "$gl_cv_func_wcrtomb_retval" >&6; }
+ case "$gl_cv_func_wcrtomb_retval" in
+ *yes) ;;
+ *)
+printf "%s\n" "#define WCRTOMB_RETVAL_BUG 1" >>confdefs.h
+
+ REPLACE_WCRTOMB=1 ;;
+ esac
+ fi
+ fi
+
+ if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS wcrtomb.$ac_objext"
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_WCRTOMB=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WCRTOMB 1" >>confdefs.h
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+
+
+
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test $gl_cv_have_include_next = yes; then
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking absolute name of <wctype.h>" >&5
+printf %s "checking absolute name of <wctype.h>... " >&6; }
+if test ${gl_cv_next_wctype_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test $ac_cv_header_wctype_h = yes; then
+
+
+
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wctype.h>
+_ACEOF
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo 'wctype.h' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+
+ gl_cv_absolute_wctype_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+ sed -n "$gl_absolute_header_sed"`
+
+ gl_header=$gl_cv_absolute_wctype_h
+ gl_cv_next_wctype_h='"'$gl_header'"'
+ else
+ gl_cv_next_wctype_h='<'wctype.h'>'
+ fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_wctype_h" >&5
+printf "%s\n" "$gl_cv_next_wctype_h" >&6; }
+ fi
+ NEXT_WCTYPE_H=$gl_cv_next_wctype_h
+
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'wctype.h'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=$gl_cv_next_wctype_h
+ fi
+ NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H=$gl_next_as_first_directive
+
+
+
+
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether iswcntrl works" >&5
+printf %s "checking whether iswcntrl works... " >&6; }
+if test ${gl_cv_func_iswcntrl_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works="guessing yes"
+else $as_nop
+ gl_cv_func_iswcntrl_works="guessing no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_iswcntrl_works=yes
+else $as_nop
+ gl_cv_func_iswcntrl_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_iswcntrl_works" >&5
+printf "%s\n" "$gl_cv_func_iswcntrl_works" >&6; }
+ fi
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+
+
+ if test $GNULIB_OVERRIDES_WINT_T = 1; then
+ REPLACE_ISWCNTRL=1
+ else
+ case "$gl_cv_func_iswcntrl_works" in
+ *yes) REPLACE_ISWCNTRL=0 ;;
+ *) REPLACE_ISWCNTRL=1 ;;
+ esac
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ fi
+
+ if test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_TOWLOWER=1
+ else
+ ac_fn_c_check_func "$LINENO" "towlower" "ac_cv_func_towlower"
+if test "x$ac_cv_func_towlower" = xyes
+then :
+ printf "%s\n" "#define HAVE_TOWLOWER 1" >>confdefs.h
+
+fi
+
+ if test $ac_cv_func_towlower = yes; then
+ REPLACE_TOWLOWER=0
+ else
+ ac_fn_c_check_decl "$LINENO" "towlower" "ac_cv_have_decl_towlower" "#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+
+"
+if test "x$ac_cv_have_decl_towlower" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_TOWLOWER $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_towlower = yes; then
+ REPLACE_TOWLOWER=1
+ else
+ REPLACE_TOWLOWER=0
+ fi
+ fi
+ fi
+
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+ :
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctype_t" >&5
+printf %s "checking for wctype_t... " >&6; }
+if test ${gl_cv_type_wctype_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ wctype_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctype_t=yes
+else $as_nop
+ gl_cv_type_wctype_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctype_t" >&5
+printf "%s\n" "$gl_cv_type_wctype_t" >&6; }
+ if test $gl_cv_type_wctype_t = no; then
+ HAVE_WCTYPE_T=0
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wctrans_t" >&5
+printf %s "checking for wctrans_t... " >&6; }
+if test ${gl_cv_type_wctrans_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+ #include <wctype.h>
+ wctrans_t a;
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ gl_cv_type_wctrans_t=yes
+else $as_nop
+ gl_cv_type_wctrans_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wctrans_t" >&5
+printf "%s\n" "$gl_cv_type_wctrans_t" >&6; }
+ if test $gl_cv_type_wctrans_t = no; then
+ HAVE_WCTRANS_T=0
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ac_fn_c_check_decl "$LINENO" "wcwidth" "ac_cv_have_decl_wcwidth" "
+ #include <wchar.h>
+
+"
+if test "x$ac_cv_have_decl_wcwidth" = xyes
+then :
+ ac_have_decl=1
+else $as_nop
+ ac_have_decl=0
+fi
+
+printf "%s\n" "#define HAVE_DECL_WCWIDTH $ac_have_decl" >>confdefs.h
+
+ if test $ac_cv_have_decl_wcwidth != yes; then
+ HAVE_DECL_WCWIDTH=0
+ fi
+
+ if test $ac_cv_func_wcwidth != yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth is a macro" >&5
+printf %s "checking whether wcwidth is a macro... " >&6; }
+if test ${gl_cv_func_wcwidth_macro+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <wchar.h>
+#ifdef wcwidth
+ wchar_header_defines_wcwidth
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "wchar_header_defines_wcwidth" >/dev/null 2>&1
+then :
+ gl_cv_func_wcwidth_macro=yes
+else $as_nop
+ gl_cv_func_wcwidth_macro=no
+fi
+rm -rf conftest*
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_macro" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_macro" >&6; }
+ fi
+
+ if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
+ HAVE_WCWIDTH=1
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether wcwidth works reasonably in UTF-8 locales" >&5
+printf %s "checking whether wcwidth works reasonably in UTF-8 locales... " >&6; }
+if test ${gl_cv_func_wcwidth_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ if test "$cross_compiling" = yes
+then :
+
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on AIX 7 systems.
+ aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";;
+ *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
+ esac
+
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <locale.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
+ {
+ if (wcwidth (0x0301) > 0)
+ result |= 1;
+ if (wcwidth (0x05B0) > 0)
+ result |= 2;
+ if (wcwidth (0x200B) > 0)
+ result |= 4;
+ if (wcwidth (0xFF1A) == 0)
+ result |= 8;
+ if (wcwidth (0x2202) > 1)
+ result |= 16;
+ }
+ return result;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ gl_cv_func_wcwidth_works=yes
+else $as_nop
+ gl_cv_func_wcwidth_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wcwidth_works" >&5
+printf "%s\n" "$gl_cv_func_wcwidth_works" >&6; }
+ case "$gl_cv_func_wcwidth_works" in
+ *yes) ;;
+ *no) REPLACE_WCWIDTH=1 ;;
+ esac
+ else
+ HAVE_WCWIDTH=0
+ fi
+
+ if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS wcwidth.$ac_objext"
+
+
+
+ :
+
+ fi
+
+
+
+
+
+ GNULIB_WCWIDTH=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WCWIDTH 1" >>confdefs.h
+
+
+
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS windows-mutex.$ac_objext"
+
+ ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS windows-once.$ac_objext"
+
+ ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS windows-recmutex.$ac_objext"
+
+ ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS windows-rwlock.$ac_objext"
+
+ ;;
+ esac
+
+ case "$host_os" in
+ mingw*)
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS windows-spawn.$ac_objext"
+
+ ;;
+ esac
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wmemchr" >&5
+printf %s "checking for wmemchr... " >&6; }
+if test ${gl_cv_func_wmemchr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <wchar.h>
+
+int
+main (void)
+{
+return ! wmemchr ((const wchar_t *) 0, (wchar_t) ' ', 0);
+ ;
+ return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ gl_cv_func_wmemchr=yes
+else $as_nop
+ gl_cv_func_wmemchr=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_wmemchr" >&5
+printf "%s\n" "$gl_cv_func_wmemchr" >&6; }
+ if test $gl_cv_func_wmemchr = no; then
+ HAVE_WMEMCHR=0
+ fi
+
+ if test $HAVE_WMEMCHR = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS wmemchr.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_WMEMCHR=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WMEMCHR 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+ if test $ac_cv_func_wmempcpy = no; then
+ HAVE_WMEMPCPY=0
+ fi
+
+ if test $HAVE_WMEMPCPY = 0; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS wmempcpy.$ac_objext"
+
+ fi
+
+
+
+
+
+ GNULIB_WMEMPCPY=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WMEMPCPY 1" >>confdefs.h
+
+
+
+
+
+
+
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_WRITE=1
+ fi
+
+
+
+
+
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_WRITE=1
+ fi
+
+
+
+ if test $REPLACE_WRITE = 1; then
+
+
+
+
+
+
+
+
+ gl_LIBOBJS="$gl_LIBOBJS write.$ac_objext"
+
+ :
+ fi
+
+
+
+
+
+ GNULIB_WRITE=1
+
+
+
+
+
+printf "%s\n" "#define GNULIB_TEST_WRITE 1" >>confdefs.h
+
+
+
+ :
+
+
+printf "%s\n" "#define GNULIB_XALLOC 1" >>confdefs.h
+
+
+
+
+printf "%s\n" "#define GNULIB_XALLOC_DIE 1" >>confdefs.h
+
+
+
+
+ ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h
+
+fi
+
+
+
+
+ :
+
+
+ # End of code from modules
+
+
+
+
+
+
+
+
+
+ gltests_libdeps=
+ gltests_ltlibdeps=
+
+
+
+
+
+
+
+
+
+
+ gl_source_base='lib/tests'
+ gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+
+ gl_module_indicator_condition=$gltests_WITNESS
+
+
+
+
+
+
+
+
+
+ LIBGNU_LIBDEPS="$gl_libdeps"
+
+ LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+
+
+
+AX_CODE_COVERAGE
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+printf %s "checking for working mmap... " >&6; }
+if test ${ac_cv_func_mmap_fixed_mapped+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
+ case "$host_os" in # ((
+ # Guess yes on platforms where we know the result.
+ linux*) ac_cv_func_mmap_fixed_mapped=yes ;;
+ # If we don't know, assume the worst.
+ *) ac_cv_func_mmap_fixed_mapped=no ;;
+ esac
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the file system buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propagated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main (void)
+{
+ char *data, *data2, *data3;
+ const char *cdata2;
+ int i, pagesize;
+ int fd, fd2;
+
+ pagesize = getpagesize ();
+
+ /* First, make a file with some known garbage in it. */
+ data = (char *) malloc (pagesize);
+ if (!data)
+ return 1;
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand ();
+ umask (0);
+ fd = creat ("conftest.mmap", 0600);
+ if (fd < 0)
+ return 2;
+ if (write (fd, data, pagesize) != pagesize)
+ return 3;
+ close (fd);
+
+ /* Next, check that the tail of a page is zero-filled. File must have
+ non-zero length, otherwise we risk SIGBUS for entire page. */
+ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+ if (fd2 < 0)
+ return 4;
+ cdata2 = "";
+ if (write (fd2, cdata2, 1) != 1)
+ return 5;
+ data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+ if (data2 == MAP_FAILED)
+ return 6;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data2 + i))
+ return 7;
+ close (fd2);
+ if (munmap (data2, pagesize))
+ return 8;
+
+ /* Next, try to mmap the file at a fixed address which already has
+ something else allocated at it. If we can, also make sure that
+ we see the same garbage. */
+ fd = open ("conftest.mmap", O_RDWR);
+ if (fd < 0)
+ return 9;
+ if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ return 10;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ return 11;
+
+ /* Finally, make sure that changes to the mapped area do not
+ percolate back to the file as seen by read(). (This is a bug on
+ some variants of i386 svr4.0.) */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = (char *) malloc (pagesize);
+ if (!data3)
+ return 12;
+ if (read (fd, data3, pagesize) != pagesize)
+ return 13;
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ return 14;
+ close (fd);
+ free (data);
+ free (data3);
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"
+then :
+ ac_cv_func_mmap_fixed_mapped=yes
+else $as_nop
+ ac_cv_func_mmap_fixed_mapped=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
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+printf %s "checking for _LARGEFILE_SOURCE value needed for large files... " >&6; }
+if test ${ac_cv_sys_largefile_source+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ while :; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main (void)
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_sys_largefile_source=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#define _LARGEFILE_SOURCE 1
+#include <sys/types.h> /* for off_t */
+ #include <stdio.h>
+int
+main (void)
+{
+int (*fp) (FILE *, off_t, int) = fseeko;
+ return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_sys_largefile_source=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ ac_cv_sys_largefile_source=unknown
+ break
+done
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_source" >&5
+printf "%s\n" "$ac_cv_sys_largefile_source" >&6; }
+case $ac_cv_sys_largefile_source in #(
+ no | unknown) ;;
+ *)
+printf "%s\n" "#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source" >>confdefs.h
+;;
+esac
+rm -rf conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+if test $ac_cv_sys_largefile_source != unknown; then
+
+printf "%s\n" "#define HAVE_FSEEKO 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strptime" "ac_cv_func_strptime"
+if test "x$ac_cv_func_strptime" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRPTIME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm"
+if test "x$ac_cv_func_timegm" = xyes
+then :
+ printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf"
+if test "x$ac_cv_func_vasprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "drand48" "ac_cv_func_drand48"
+if test "x$ac_cv_func_drand48" = xyes
+then :
+ printf "%s\n" "#define HAVE_DRAND48 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "pathconf" "ac_cv_func_pathconf"
+if test "x$ac_cv_func_pathconf" = xyes
+then :
+ printf "%s\n" "#define HAVE_PATHCONF 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll"
+if test "x$ac_cv_func_strtoll" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "usleep" "ac_cv_func_usleep"
+if test "x$ac_cv_func_usleep" = xyes
+then :
+ printf "%s\n" "#define HAVE_USLEEP 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "ftello" "ac_cv_func_ftello"
+if test "x$ac_cv_func_ftello" = xyes
+then :
+ printf "%s\n" "#define HAVE_FTELLO 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sigblock" "ac_cv_func_sigblock"
+if test "x$ac_cv_func_sigblock" = xyes
+then :
+ printf "%s\n" "#define HAVE_SIGBLOCK 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sigsetjmp" "ac_cv_func_sigsetjmp"
+if test "x$ac_cv_func_sigsetjmp" = xyes
+then :
+ printf "%s\n" "#define HAVE_SIGSETJMP 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "memrchr" "ac_cv_func_memrchr"
+if test "x$ac_cv_func_memrchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMRCHR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "wcwidth" "ac_cv_func_wcwidth"
+if test "x$ac_cv_func_wcwidth" = xyes
+then :
+ printf "%s\n" "#define HAVE_WCWIDTH 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "mbtowc" "ac_cv_func_mbtowc"
+if test "x$ac_cv_func_mbtowc" = xyes
+then :
+ printf "%s\n" "#define HAVE_MBTOWC 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "sleep" "ac_cv_func_sleep"
+if test "x$ac_cv_func_sleep" = xyes
+then :
+ printf "%s\n" "#define HAVE_SLEEP 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "symlink" "ac_cv_func_symlink"
+if test "x$ac_cv_func_symlink" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYMLINK 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "utime" "ac_cv_func_utime"
+if test "x$ac_cv_func_utime" = xyes
+then :
+ printf "%s\n" "#define HAVE_UTIME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
+if test "x$ac_cv_func_strlcpy" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "random" "ac_cv_func_random"
+if test "x$ac_cv_func_random" = xyes
+then :
+ printf "%s\n" "#define HAVE_RANDOM 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "fmemopen" "ac_cv_func_fmemopen"
+if test "x$ac_cv_func_fmemopen" = xyes
+then :
+ printf "%s\n" "#define HAVE_FMEMOPEN 1" >>confdefs.h
+
+fi
+
+
+if test x"$ENABLE_OPIE" = xyes; then
+ case " $LIBOBJS " in
+ *" ftp-opie.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS ftp-opie.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h
+
+
+printf "%s\n" "#define HAVE_ISATTY 1" >>confdefs.h
+
+
+case $host_os in
+ *mingw32* )
+ LIBS+=' -lws2_32'
+ case " $LIBOBJS " in
+ *" mswindows.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS mswindows.$ac_objext"
+ ;;
+esac
+
+ ;;
+esac
+
+# enable all possible compiler warnings in WARN_FLAGS
+#
+# to enable by default: create a file '.manywarnings'
+# enable explicitly : ./configure --enable-manywarnings
+# disable explicitly: ./configure --disable-manywarnings
+sanitizer_flags="$WARN_CFLAGS"
+
+ #
+ # check if manywarnings is requested
+ #
+ # Check whether --enable-manywarnings was given.
+if test ${enable_manywarnings+y}
+then :
+ enableval=$enable_manywarnings; case $enableval in
+ yes|no) ;;
+ *) as_fn_error $? "Bad value $enableval for --enable-manywarnings option" "$LINENO" 5 ;;
+ esac
+ wget_manywarnings=$enableval
+
+else $as_nop
+
+ test -f .manywarnings && wget_manywarnings=yes || wget_manywarnings=no
+
+
+fi
+
+
+ WARN_CFLAGS=""
+
+ if test "$wget_manywarnings" = yes; then
+ # AC_PROG_CC sets $GCC to 'yes' if compiler is gcc
+ # AC_REQUIRE([AC_PROG_CC])
+
+ case $CC in
+ *gcc*) CCNAME="gcc";;
+ *clang*) CCNAME="clang";;
+ esac
+
+ if test "$CCNAME" = "gcc"; then
+ test -n "C" && wget_LANGUAGE=C || wget_LANGUAGE=C
+
+ # add -Wall -Wextra to reduce number of warn flags
+
+ ret=$CFLAGS
+ words=" $CFLAGS "
+ for word in "-Wall -Wextra -Wformat=2"; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ wget_WARN_CFLAGS=$ret
+
+
+ # collect all disabled warn flags in $WARN_CFLAGS
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" "$($CC $wget_WARN_CFLAGS -Q --help=warning,$wget_LANGUAGE|\
+ awk '{ if (($2 == "[disabled]" || $2 == "")\
+ && $1!~/=/ && $1~/^-W/ && $1!~/</ && $1!="-Wall") print $1 }')
+
+ GCC_VERSION=$($CC -dumpversion | cut -f1 -d.)
+ if test $GCC_VERSION -ge 6; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Warray-bounds=2 -Wnormalized=nfc -Wshift-overflow=2 -Wunused-const-variable=2"
+ fi
+ if test $GCC_VERSION -ge 7; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Wformat-overflow=2 -Wformat-truncation=1 -Wstringop-overflow=2"
+ fi
+
+ elif test "$CCNAME" = "clang"; then
+ # set all warn flags on
+
+ ret=$CFLAGS
+ words=" $CFLAGS "
+ for word in "-Weverything"; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ wget_WARN_CFLAGS=$ret
+
+ fi
+
+ WARN_CFLAGS=$wget_WARN_CFLAGS
+ fi
+
+WARN_CFLAGS="$WARN_CFLAGS $sanitizer_flags"
+
+if test -n "$WARN_CFLAGS"; then
+ if test "$CCNAME" = "gcc"; then
+ # Set up list of unwanted warnings
+ nw=
+ nw="$nw -Wsystem-headers" # System headers may trigger lot's of useless warnings
+ nw="$nw -Wvla" # This project is C99
+ nw="$nw -Wstack-protector"
+ nw="$nw -Wmissing-field-initializer"
+ nw="$nw -Wtraditional"
+ nw="$nw -Wtraditional-conversion"
+ nw="$nw -Wc++-compat"
+ nw="$nw -Wcast-qual"
+ nw="$nw -Wconversion"
+ nw="$nw -Wsign-conversion"
+ nw="$nw -Wunsuffixed-float-constants"
+ nw="$nw -Wdeclaration-after-statement" # C89 only, messing up gcc < 5
+ nw="$nw -Wcast-function-type" # gcc 8, very noisy
+ nw="$nw -Wabi" # gcc 8, very noisy
+ nw="$nw -Wunused-macros" # triggers in auto-generated lex css parser, #pragma doesn't work, conflicts with -Werror
+ nw="$nw -Wchkp" # Deprecated option
+ if test "$cross_compiling" = yes; then
+ nw="$nw -Wformat"
+ fi
+
+ # remove unwanted warn flags
+
+ ret=
+ words=" $nw "
+ for word in $WARN_CFLAGS; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ WARN_CFLAGS=$ret
+
+
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-undef -Wno-float-equal"
+
+ # add more flags as you like
+ if test $GCC_VERSION -ge 5; then
+ WARN_CFLAGS="$WARN_CFLAGS -fdiagnostics-color=always"
+ fi
+ if test "$cross_compiling" = yes; then
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-format"
+ fi
+ if test $GCC_VERSION -ge 8; then
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-cast-function-type"
+ fi
+ # WARN_CFLAGS="$WARN_CFLAGS -Werror"
+
+ # We use a slightly smaller set of warning options for lib/.
+ # Remove the following and save the result in GNULIB_WARN_CFLAGS.
+ # Removing is not enough if these switches are implicitly set by other
+ # flags like -Wall or -Wextra. We have to explicitly unset them
+ # with -Wno-....
+ nw=
+ nw="$nw -Wpedantic"
+ nw="$nw -Wsign-compare"
+ nw="$nw -Wunused-parameter"
+ nw="$nw -Wswitch-default"
+ nw="$nw -Wformat-nonliteral"
+ nw="$nw -Wsuggest-attribute=pure"
+ nw="$nw -Wunsafe-loop-optimizations"
+ nw="$nw -Wundef"
+ nw="$nw -Wswitch-enum"
+ nw="$nw -Wbad-function-cast"
+ nw="$nw -Wredundant-decls"
+ nw="$nw -Werror"
+
+ ret=
+ words=" $nw "
+ for word in $WARN_CFLAGS; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ GNULIB_WARN_CFLAGS=$ret
+
+
+ ret=
+ words=" -Werror "
+ for word in $CFLAGS; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ CFLAGS=$ret
+
+
+ # disable options implicitly set by other options
+ GNULIB_WARN_CFLAGS="-Wno-error $GNULIB_WARN_CFLAGS"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-sign-compare -Wno-unused-parameter -Wno-alloca"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-float-conversion -Wno-cast-function-type"
+ if test "$cross_compiling" = yes; then
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-incompatible-pointer-types"
+ fi
+
+ elif test "$CCNAME" = "clang"; then
+ # setup flags for this project
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-system-headers -Wno-vla -Wno-cast-qual -Wno-padded"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-reserved-id-macro -Wno-sign-conversion -Wno-disabled-macro-expansion"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-documentation -Wno-documentation-unknown-command"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-covered-switch-default -Wno-unused-macros"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-missing-field-initializers"
+
+ # remove all flags from WARN_FLAGS that are already in CFLAGS
+ # wget_WORD_REMOVE([WARN_CFLAGS], [$WARN_CFLAGS], [$CFLAGS])
+
+
+ ret=
+ words=" -Werror "
+ for word in $CFLAGS; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ CFLAGS=$ret
+
+
+ # disable verbose options
+ GNULIB_WARN_CFLAGS="-Wno-error $GNULIB_WARN_CFLAGS"
+ GNULIB_WARN_CFLAGS="$WARN_CFLAGS -Wno-sign-compare -Wno-unused-parameter -Wno-undef -Wno-format-nonliteral"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-conversion -Wno-disabled-macro-expansion -Wno-c++98-compat"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-gnu-statement-expression -Wno-shorten-64-to-32 -Wno-switch-enum"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-unused-macros -Wno-missing-field-initializers"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-gnu-zero-variadic-macro-arguments -Wno-conditional-uninitialized"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-comma -Wno-assign-enum -Wno-unreachable-code -Wno-error"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-missing-field-initializers"
+
+ # remove all flags from GNULIB_WARN_FLAGS that are already in CFLAGS
+ # wget_WORD_REMOVE([GNULIB_WARN_CFLAGS], [$GNULIB_WARN_CFLAGS], [$CFLAGS])
+ fi
+
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+printf "%s\n" "$PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+ ac_pt_PKG_CONFIG=$PKG_CONFIG
+ # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_PKG_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $ac_pt_PKG_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_pt_PKG_CONFIG" = x; then
+ PKG_CONFIG=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ PKG_CONFIG=$ac_pt_PKG_CONFIG
+ fi
+else
+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=0.9.0
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ PKG_CONFIG=""
+ fi
+fi
+
+if test "x$with_libpsl" != xno
+then :
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LIBPSL" >&5
+printf %s "checking for LIBPSL... " >&6; }
+
+if test -n "$LIBPSL_CFLAGS"; then
+ pkg_cv_LIBPSL_CFLAGS="$LIBPSL_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpsl") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LIBPSL_CFLAGS=`$PKG_CONFIG --cflags "libpsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$LIBPSL_LIBS"; then
+ pkg_cv_LIBPSL_LIBS="$LIBPSL_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpsl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpsl") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_LIBPSL_LIBS=`$PKG_CONFIG --libs "libpsl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ LIBPSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpsl" 2>&1`
+ else
+ LIBPSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpsl" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$LIBPSL_PKG_ERRORS" >&5
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing psl_builtin" >&5
+printf %s "checking for library containing psl_builtin... " >&6; }
+if test ${ac_cv_search_psl_builtin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char psl_builtin ();
+int
+main (void)
+{
+return psl_builtin ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' psl
+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_psl_builtin=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_psl_builtin+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_psl_builtin+y}
+then :
+
+else $as_nop
+ ac_cv_search_psl_builtin=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_psl_builtin" >&5
+printf "%s\n" "$ac_cv_search_psl_builtin" >&6; }
+ac_res=$ac_cv_search_psl_builtin
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ with_libpsl=yes;
+printf "%s\n" "#define HAVE_LIBPSL 1" >>confdefs.h
+
+else $as_nop
+ with_libpsl=no; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *** libpsl was not found. Fallback to builtin cookie checking." >&5
+printf "%s\n" "$as_me: WARNING: *** libpsl was not found. Fallback to builtin cookie checking." >&2;}
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing psl_builtin" >&5
+printf %s "checking for library containing psl_builtin... " >&6; }
+if test ${ac_cv_search_psl_builtin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char psl_builtin ();
+int
+main (void)
+{
+return psl_builtin ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' psl
+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_psl_builtin=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_psl_builtin+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_psl_builtin+y}
+then :
+
+else $as_nop
+ ac_cv_search_psl_builtin=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_psl_builtin" >&5
+printf "%s\n" "$ac_cv_search_psl_builtin" >&6; }
+ac_res=$ac_cv_search_psl_builtin
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ with_libpsl=yes;
+printf "%s\n" "#define HAVE_LIBPSL 1" >>confdefs.h
+
+else $as_nop
+ with_libpsl=no; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *** libpsl was not found. Fallback to builtin cookie checking." >&5
+printf "%s\n" "$as_me: WARNING: *** libpsl was not found. Fallback to builtin cookie checking." >&2;}
+fi
+
+
+else
+ LIBPSL_CFLAGS=$pkg_cv_LIBPSL_CFLAGS
+ LIBPSL_LIBS=$pkg_cv_LIBPSL_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ with_libpsl=yes
+ # correct $LIBPSL_LIBS (in libpsl <= 0.6.0)
+ if test "x$LIBPSL_LIBS" = "x-llibpsl "
+then :
+ LIBPSL_LIBS="-lpsl"
+fi
+ LIBS="$LIBPSL_LIBS $LIBS"
+ CFLAGS="$LIBPSL_CFLAGS $CFLAGS"
+
+printf "%s\n" "#define HAVE_LIBPSL 1" >>confdefs.h
+
+
+fi
+
+fi
+
+if test x"$with_libpsl" = xyes
+then :
+
+ ac_fn_c_check_func "$LINENO" "psl_latest" "ac_cv_func_psl_latest"
+if test "x$ac_cv_func_psl_latest" = xyes
+then :
+ printf "%s\n" "#define HAVE_PSL_LATEST 1" >>confdefs.h
+
+fi
+
+
+fi
+
+if test x"$with_zlib" != xno
+then :
+
+ with_zlib=yes
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ZLIB" >&5
+printf %s "checking for ZLIB... " >&6; }
+
+if test -n "$ZLIB_CFLAGS"; then
+ pkg_cv_ZLIB_CFLAGS="$ZLIB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_CFLAGS=`$PKG_CONFIG --cflags "zlib" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$ZLIB_LIBS"; then
+ pkg_cv_ZLIB_LIBS="$ZLIB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"zlib\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "zlib") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_ZLIB_LIBS=`$PKG_CONFIG --libs "zlib" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "zlib" 2>&1`
+ else
+ ZLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "zlib" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$ZLIB_PKG_ERRORS" >&5
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5
+printf %s "checking for compress in -lz... " >&6; }
+if test ${ac_cv_lib_z_compress+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $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. */
+char compress ();
+int
+main (void)
+{
+return compress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_z_compress=yes
+else $as_nop
+ ac_cv_lib_z_compress=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
+printf "%s\n" "$ac_cv_lib_z_compress" >&6; }
+if test "x$ac_cv_lib_z_compress" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h
+
+ LIBS="-lz $LIBS"
+
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5
+printf %s "checking for compress in -lz... " >&6; }
+if test ${ac_cv_lib_z_compress+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz $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. */
+char compress ();
+int
+main (void)
+{
+return compress ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_z_compress=yes
+else $as_nop
+ ac_cv_lib_z_compress=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
+printf "%s\n" "$ac_cv_lib_z_compress" >&6; }
+if test "x$ac_cv_lib_z_compress" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h
+
+ LIBS="-lz $LIBS"
+
+fi
+
+
+else
+ ZLIB_CFLAGS=$pkg_cv_ZLIB_CFLAGS
+ ZLIB_LIBS=$pkg_cv_ZLIB_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ LIBS="$ZLIB_LIBS $LIBS"
+ CFLAGS="$ZLIB_CFLAGS $CFLAGS"
+
+printf "%s\n" "#define HAVE_LIBZ 1" >>confdefs.h
+
+
+fi
+
+fi
+
+if test x"$with_ssl" = xopenssl
+then :
+
+ if test x"$with_libssl_prefix" = x; then
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
+printf %s "checking for OPENSSL... " >&6; }
+
+if test -n "$OPENSSL_CFLAGS"; then
+ pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$OPENSSL_LIBS"; then
+ pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "openssl" 2>&1`
+ else
+ OPENSSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "openssl" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$OPENSSL_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (openssl) were not met:
+
+$OPENSSL_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables OPENSSL_CFLAGS
+and OPENSSL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables OPENSSL_CFLAGS
+and OPENSSL_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
+ OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: compiling in support for SSL via OpenSSL" >&5
+printf "%s\n" "$as_me: compiling in support for SSL via OpenSSL" >&6;}
+ case " $LIBOBJS " in
+ *" openssl.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS openssl.$ac_objext"
+ ;;
+esac
+
+ LIBS="$OPENSSL_LIBS $LIBS"
+ CFLAGS="$OPENSSL_CFLAGS -DHAVE_LIBSSL $CFLAGS"
+ LIBSSL=" " # ntlm check below wants this
+ ac_fn_c_check_func "$LINENO" "RAND_egd" "ac_cv_func_RAND_egd"
+if test "x$ac_cv_func_RAND_egd" = xyes
+then :
+ printf "%s\n" "#define HAVE_RAND_EGD 1" >>confdefs.h
+
+fi
+
+
+printf "%s\n" "#define HAVE_LIBSSL 1" >>confdefs.h
+
+ ssl_found=yes
+
+fi
+ fi
+ if test x"$ssl_found" != xyes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main (void)
+{
+return dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_dlopen=yes
+else $as_nop
+ ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h
+
+ LIBS="-ldl $LIBS"
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldl" >&5
+printf %s "checking for shl_load in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_shl_load+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main (void)
+{
+return shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_dl_shl_load=yes
+else $as_nop
+ ac_cv_lib_dl_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_shl_load" >&5
+printf "%s\n" "$ac_cv_lib_dl_shl_load" >&6; }
+if test "x$ac_cv_lib_dl_shl_load" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBDL 1" >>confdefs.h
+
+ LIBS="-ldl $LIBS"
+
+fi
+
+
+fi
+
+
+ ssl_found=no
+ case $host_os in
+ *mingw32* )
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EVP_MD_CTX_init in -leay32" >&5
+printf %s "checking for EVP_MD_CTX_init in -leay32... " >&6; }
+if test ${ac_cv_lib_eay32_EVP_MD_CTX_init+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-leay32 $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. */
+char EVP_MD_CTX_init ();
+int
+main (void)
+{
+return EVP_MD_CTX_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_eay32_EVP_MD_CTX_init=yes
+else $as_nop
+ ac_cv_lib_eay32_EVP_MD_CTX_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_eay32_EVP_MD_CTX_init" >&5
+printf "%s\n" "$ac_cv_lib_eay32_EVP_MD_CTX_init" >&6; }
+if test "x$ac_cv_lib_eay32_EVP_MD_CTX_init" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBEAY32 1" >>confdefs.h
+
+ LIBS="-leay32 $LIBS"
+
+fi
+
+ if test x"$ac_cv_lib_eay32_EVP_MD_CTX_init" != xno
+ then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SSL_connect in -lssl32" >&5
+printf %s "checking for SSL_connect in -lssl32... " >&6; }
+if test ${ac_cv_lib_ssl32_SSL_connect+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lssl32 $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. */
+char SSL_connect ();
+int
+main (void)
+{
+return SSL_connect ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_ssl32_SSL_connect=yes
+else $as_nop
+ ac_cv_lib_ssl32_SSL_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl32_SSL_connect" >&5
+printf "%s\n" "$ac_cv_lib_ssl32_SSL_connect" >&6; }
+if test "x$ac_cv_lib_ssl32_SSL_connect" = xyes
+then :
+
+ ssl_found=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Enabling support for SSL via OpenSSL (shared)" >&5
+printf "%s\n" "$as_me: Enabling support for SSL via OpenSSL (shared)" >&6;}
+ case " $LIBOBJS " in
+ *" openssl.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS openssl.$ac_objext"
+ ;;
+esac
+
+ LIBS="${LIBS} -lssl32"
+
+printf "%s\n" "#define HAVE_LIBSSL32 1" >>confdefs.h
+
+
+else $as_nop
+ as_fn_error $? "openssl not found: shared lib eay32 found but ssl32 not found" "$LINENO" 5
+fi
+
+
+ else
+ LIBS+=' -lgdi32'
+ fi
+ ;;
+ esac
+
+ if test x$ssl_found != xyes
+then :
+
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libssl-prefix was given.
+if test ${with_libssl_prefix+y}
+then :
+ withval=$with_libssl_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBSSL=
+ LTLIBSSL=
+ INCSSL=
+ LIBSSL_PREFIX=
+ HAVE_LIBSSL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='ssl crypto'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBSSL="${LIBSSL}${LIBSSL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBSSL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBSSL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$found_so"
+ else
+ LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$found_a"
+ else
+ LIBSSL="${LIBSSL}${LIBSSL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'ssl'; then
+ LIBSSL_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" = 'ssl'; then
+ LIBSSL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'ssl'; then
+ LIBSSL_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCSSL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCSSL="${INCSSL}${INCSSL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBSSL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBSSL="${LIBSSL}${LIBSSL:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBSSL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$dep"
+ LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBSSL="${LIBSSL}${LIBSSL:+ }-l$name"
+ LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBSSL="${LIBSSL}${LIBSSL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBSSL="${LTLIBSSL}${LTLIBSSL:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCSSL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libssl" >&5
+printf %s "checking for libssl... " >&6; }
+if test ${ac_cv_libssl+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ case " $LIBSSL" in
+ *" -l"*) LIBS="$LIBS $LIBSSL" ;;
+ *) LIBS="$LIBSSL $LIBS" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+#include <openssl/des.h>
+#include <openssl/md4.h>
+#include <openssl/md5.h>
+
+int
+main (void)
+{
+SSL_library_init ()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_libssl=yes
+else $as_nop
+ ac_cv_libssl='no'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libssl" >&5
+printf "%s\n" "$ac_cv_libssl" >&6; }
+ if test "$ac_cv_libssl" = yes; then
+ HAVE_LIBSSL=yes
+
+printf "%s\n" "#define HAVE_LIBSSL 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libssl" >&5
+printf %s "checking how to link with libssl... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBSSL" >&5
+printf "%s\n" "$LIBSSL" >&6; }
+ else
+ HAVE_LIBSSL=no
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBSSL=
+ LTLIBSSL=
+ LIBSSL_PREFIX=
+ fi
+
+
+
+
+
+
+
+ if test x"$LIBSSL" != x
+ then
+ ssl_found=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: compiling in support for SSL via OpenSSL" >&5
+printf "%s\n" "$as_me: compiling in support for SSL via OpenSSL" >&6;}
+ case " $LIBOBJS " in
+ *" openssl.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS openssl.$ac_objext"
+ ;;
+esac
+
+ LIBS="$LIBSSL $LIBS"
+ ac_fn_c_check_func "$LINENO" "RAND_egd" "ac_cv_func_RAND_egd"
+if test "x$ac_cv_func_RAND_egd" = xyes
+then :
+ printf "%s\n" "#define HAVE_RAND_EGD 1" >>confdefs.h
+
+fi
+
+ elif test x"$with_ssl" != x
+ then
+ as_fn_error $? "--with-ssl=openssl was given, but SSL is not available." "$LINENO" 5
+ fi
+
+fi
+ fi
+
+else $as_nop
+
+ # --with-ssl is not openssl: check if it's no
+ if test x"$with_ssl" != xno
+then :
+
+ with_ssl=gnutls
+
+ if test x"$with_libgnutls_prefix" = x; then
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNUTLS" >&5
+printf %s "checking for GNUTLS... " >&6; }
+
+if test -n "$GNUTLS_CFLAGS"; then
+ pkg_cv_GNUTLS_CFLAGS="$GNUTLS_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$GNUTLS_LIBS"; then
+ pkg_cv_GNUTLS_LIBS="$GNUTLS_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_GNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ GNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls" 2>&1`
+ else
+ GNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$GNUTLS_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (gnutls) were not met:
+
+$GNUTLS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GNUTLS_CFLAGS
+and GNUTLS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GNUTLS_CFLAGS
+and GNUTLS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ GNUTLS_CFLAGS=$pkg_cv_GNUTLS_CFLAGS
+ GNUTLS_LIBS=$pkg_cv_GNUTLS_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: compiling in support for SSL via GnuTLS" >&5
+printf "%s\n" "$as_me: compiling in support for SSL via GnuTLS" >&6;}
+ case " $LIBOBJS " in
+ *" gnutls.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS gnutls.$ac_objext"
+ ;;
+esac
+
+ LIBS="$GNUTLS_LIBS $LIBS"
+ CFLAGS="$GNUTLS_CFLAGS -DHAVE_LIBGNUTLS $CFLAGS"
+
+printf "%s\n" "#define HAVE_LIBGNUTLS 1" >>confdefs.h
+
+ ssl_found=yes
+
+fi
+ fi
+ if test x"$ssl_found" != xyes; then
+
+
+
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libgnutls-prefix was given.
+if test ${with_libgnutls_prefix+y}
+then :
+ withval=$with_libgnutls_prefix;
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+
+fi
+
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ LIBGNUTLS=
+ LTLIBGNUTLS=
+ INCGNUTLS=
+ LIBGNUTLS_PREFIX=
+ HAVE_LIBGNUTLS=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='gnutls '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBGNUTLS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$acl_hardcode_direct" = yes; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBGNUTLS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_so"
+ else
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$found_a"
+ else
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ if test "$name" = 'gnutls'; then
+ LIBGNUTLS_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" = 'gnutls'; then
+ LIBGNUTLS_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = 'gnutls'; then
+ LIBGNUTLS_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCGNUTLS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCGNUTLS="${INCGNUTLS}${INCGNUTLS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBGNUTLS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBGNUTLS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$dep"
+ LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }-l$name"
+ LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGNUTLS="${LIBGNUTLS}${LIBGNUTLS:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBGNUTLS="${LTLIBGNUTLS}${LTLIBGNUTLS:+ }-R$found_dir"
+ done
+ fi
+
+
+
+
+
+
+ ac_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCGNUTLS; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgnutls" >&5
+printf %s "checking for libgnutls... " >&6; }
+if test ${ac_cv_libgnutls+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ case " $LIBGNUTLS" in
+ *" -l"*) LIBS="$LIBS $LIBGNUTLS" ;;
+ *) LIBS="$LIBGNUTLS $LIBS" ;;
+ esac
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <gnutls/gnutls.h>
+
+int
+main (void)
+{
+gnutls_global_init()
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_libgnutls=yes
+else $as_nop
+ ac_cv_libgnutls='no'
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_save_LIBS"
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libgnutls" >&5
+printf "%s\n" "$ac_cv_libgnutls" >&6; }
+ if test "$ac_cv_libgnutls" = yes; then
+ HAVE_LIBGNUTLS=yes
+
+printf "%s\n" "#define HAVE_LIBGNUTLS 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to link with libgnutls" >&5
+printf %s "checking how to link with libgnutls... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIBGNUTLS" >&5
+printf "%s\n" "$LIBGNUTLS" >&6; }
+ else
+ HAVE_LIBGNUTLS=no
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIBGNUTLS=
+ LTLIBGNUTLS=
+ LIBGNUTLS_PREFIX=
+ fi
+
+
+
+
+
+
+
+ if test x"$LIBGNUTLS" != x
+ then
+ ssl_found=yes
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: compiling in support for SSL via GnuTLS" >&5
+printf "%s\n" "$as_me: compiling in support for SSL via GnuTLS" >&6;}
+ case " $LIBOBJS " in
+ *" gnutls.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS gnutls.$ac_objext"
+ ;;
+esac
+
+ LIBS="$LIBGNUTLS $LIBS"
+ else
+ as_fn_error $? "GnuTLS has not been found. Use --with-ssl=openssl if you explicitly want OpenSSL." "$LINENO" 5
+ fi
+ fi
+
+ ac_fn_c_check_func "$LINENO" "gnutls_priority_set_direct" "ac_cv_func_gnutls_priority_set_direct"
+if test "x$ac_cv_func_gnutls_priority_set_direct" = xyes
+then :
+ printf "%s\n" "#define HAVE_GNUTLS_PRIORITY_SET_DIRECT 1" >>confdefs.h
+
+fi
+
+
+fi # endif: --with-ssl != no?
+
+fi # endif: --with-ssl == openssl?
+
+if test x"$LIBSSL" != x || test "$ac_cv_lib_ssl32_SSL_connect" = yes
+then
+ if test x"$ENABLE_NTLM" != xno
+ then
+ ENABLE_NTLM=yes
+
+printf "%s\n" "#define ENABLE_NTLM 1" >>confdefs.h
+
+ case " $LIBOBJS " in
+ *" http-ntlm.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS http-ntlm.$ac_objext"
+ ;;
+esac
+
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for nettle_md4_init in -lnettle" >&5
+printf %s "checking for nettle_md4_init in -lnettle... " >&6; }
+if test ${ac_cv_lib_nettle_nettle_md4_init+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnettle $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. */
+char nettle_md4_init ();
+int
+main (void)
+{
+return nettle_md4_init ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_nettle_nettle_md4_init=yes
+else $as_nop
+ ac_cv_lib_nettle_nettle_md4_init=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nettle_nettle_md4_init" >&5
+printf "%s\n" "$ac_cv_lib_nettle_nettle_md4_init" >&6; }
+if test "x$ac_cv_lib_nettle_nettle_md4_init" = xyes
+then :
+ HAVE_NETTLE=yes
+else $as_nop
+ HAVE_NETTLE=no; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *** libnettle was not found. You will not be able to use NTLM" >&5
+printf "%s\n" "$as_me: WARNING: *** libnettle was not found. You will not be able to use NTLM" >&2;}
+fi
+
+
+ if test x"$HAVE_NETTLE" = xyes
+ then
+ NETTLE_LIBS="-lnettle"
+
+
+printf "%s\n" "#define HAVE_NETTLE 1" >>confdefs.h
+
+ if test x"$ENABLE_NTLM" != xno
+ then
+ ENABLE_NTLM=yes
+
+printf "%s\n" "#define ENABLE_NTLM 1" >>confdefs.h
+
+ case " $LIBOBJS " in
+ *" http-ntlm.$ac_objext "* ) ;;
+ *) LIBOBJS="$LIBOBJS http-ntlm.$ac_objext"
+ ;;
+esac
+
+ LIBS="$NETTLE_LIBS $LIBS"
+ fi
+ else
+ if test x"$ENABLE_NTLM" = xyes
+ then
+ as_fn_error $? "NTLM authorization requested and SSL not enabled; aborting" "$LINENO" 5
+ fi
+ fi
+fi
+
+
+
+# Check whether --enable-ipv6 was given.
+if test ${enable_ipv6+y}
+then :
+ enableval=$enable_ipv6; case "${enable_ipv6}" in
+ no)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: disabling IPv6 at user request" >&5
+printf "%s\n" "$as_me: disabling IPv6 at user request" >&6;}
+ ipv6=no
+ ;;
+ yes)
+ ipv6=yes
+ force_ipv6=yes
+ ;;
+ auto)
+ ipv6=yes
+ ;;
+ *)
+ as_fn_error $? "Invalid --enable-ipv6 argument \`$enable_ipv6'" "$LINENO" 5
+ ;;
+ esac
+
+else $as_nop
+
+ ipv6=yes
+
+
+fi
+
+
+if test "X$ipv6" = "Xyes"; then
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for INET6 protocol support" >&5
+printf %s "checking for INET6 protocol support... " >&6; }
+if test ${wget_cv_proto_inet6+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#ifndef PF_INET6
+#error Missing PF_INET6
+#endif
+#ifndef AF_INET6
+#error Missing AF_INET6
+#endif
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+ wget_cv_proto_inet6=yes
+
+else $as_nop
+
+ wget_cv_proto_inet6=no
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $wget_cv_proto_inet6" >&5
+printf "%s\n" "$wget_cv_proto_inet6" >&6; }
+
+ if test "X$wget_cv_proto_inet6" = "Xyes"; then :
+
+ else :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling IPv6 support: your system does not support the PF_INET6 protocol family" >&5
+printf "%s\n" "$as_me: Disabling IPv6 support: your system does not support the PF_INET6 protocol family" >&6;}
+ ipv6=no
+
+ fi
+
+fi
+
+if test "X$ipv6" = "Xyes"; then
+
+ wget_have_sockaddr_in6=
+ ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_type_struct_sockaddr_in6" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6 1" >>confdefs.h
+
+
+ wget_have_sockaddr_in6=yes
+
+else $as_nop
+
+ wget_have_sockaddr_in6=no
+
+fi
+
+
+ if test "X$wget_have_sockaddr_in6" = "Xyes"; then :
+
+ else :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling IPv6 support: your system does not support \`struct sockaddr_in6'" >&5
+printf "%s\n" "$as_me: Disabling IPv6 support: your system does not support \`struct sockaddr_in6'" >&6;}
+ ipv6=no
+
+ fi
+
+ if test "X$ipv6" = "Xyes"; then
+
+ ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
+"
+if test "x$ac_cv_type_struct_sockaddr_storage" = xyes
+then :
+
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h
+
+
+fi
+
+
+
+
+
+ wget_member_sin6_scope_id=
+ if test "X$wget_have_sockaddr_in6" = "Xyes"; then
+ ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_scope_id" "ac_cv_member_struct_sockaddr_in6_sin6_scope_id" "
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+
+"
+if test "x$ac_cv_member_struct_sockaddr_in6_sin6_scope_id" = xyes
+then :
+
+ wget_member_sin6_scope_id=yes
+
+else $as_nop
+
+ wget_member_sin6_scope_id=no
+
+fi
+
+ fi
+
+ if test "X$wget_member_sin6_scope_id" = "Xyes"; then
+
+printf "%s\n" "#define HAVE_SOCKADDR_IN6_SCOPE_ID 1" >>confdefs.h
+
+
+ else :
+
+ fi
+
+ fi
+fi
+
+if test "X$ipv6" = "Xyes"; then
+
+printf "%s\n" "#define ENABLE_IPV6 1" >>confdefs.h
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Enabling support for IPv6." >&5
+printf "%s\n" "$as_me: Enabling support for IPv6." >&6;}
+elif test "x$force_ipv6" = "xyes"; then
+ as_fn_error $? "IPv6 support requested but not found; aborting" "$LINENO" 5
+fi
+
+
+for ac_prog in makeinfo
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_MAKEINFO+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$MAKEINFO"; then
+ ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MAKEINFO="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+MAKEINFO=$ac_cv_prog_MAKEINFO
+if test -n "$MAKEINFO"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
+printf "%s\n" "$MAKEINFO" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$MAKEINFO" && break
+done
+test -n "$MAKEINFO" || MAKEINFO="true"
+
+
+
+for ac_prog in perl5 perl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_PERL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $PERL in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$PERL" && break
+done
+test -n "$PERL" || PERL="no"
+
+# Extract the first word of "pod2man", so it can be a program name with args.
+set dummy pod2man; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_POD2MAN+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $POD2MAN in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_POD2MAN="$POD2MAN" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_POD2MAN="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_POD2MAN" && ac_cv_path_POD2MAN="no"
+ ;;
+esac
+fi
+POD2MAN=$ac_cv_path_POD2MAN
+if test -n "$POD2MAN"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $POD2MAN" >&5
+printf "%s\n" "$POD2MAN" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+
+if test "x${POD2MAN}" = xno; then
+ COMMENT_IF_NO_POD2MAN="# "
+else
+ COMMENT_IF_NO_POD2MAN=
+fi
+
+
+
+
+# Check whether --enable-iri was given.
+if test ${enable_iri+y}
+then :
+ enableval=$enable_iri; case "${enable_iri}" in
+ no)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: disabling IRIs at user request" >&5
+printf "%s\n" "$as_me: disabling IRIs at user request" >&6;}
+ iri=no
+ ;;
+ yes)
+ iri=yes
+ force_iri=yes
+ ;;
+ auto)
+ iri=yes
+ ;;
+ *)
+ as_fn_error $? "Invalid --enable-iri argument \`$enable_iri'" "$LINENO" 5
+ ;;
+ esac
+
+else $as_nop
+
+ iri=yes
+
+
+fi
+
+
+if test "X$iri" != "Xno"
+then :
+
+ if test "X$am_cv_func_iconv" != "Xyes"; then
+ iri=no
+ if test "X$force_iri" = "Xyes"; then
+ as_fn_error $? "Libiconv is required for IRIs support" "$LINENO" 5
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: disabling IRIs because libiconv wasn't found" >&5
+printf "%s\n" "$as_me: disabling IRIs because libiconv wasn't found" >&6;}
+ fi
+ fi
+
+fi
+
+
+# Check whether --with-libidn was given.
+if test ${with_libidn+y}
+then :
+ withval=$with_libidn; libidn=$withval
+else $as_nop
+ libidn=""
+fi
+
+if test "X$iri" != "Xno"; then
+ if test "x$with_libidn2" != xno
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing idn2_lookup_u8" >&5
+printf %s "checking for library containing idn2_lookup_u8... " >&6; }
+if test ${ac_cv_search_idn2_lookup_u8+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char idn2_lookup_u8 ();
+int
+main (void)
+{
+return idn2_lookup_u8 ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' idn2
+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_idn2_lookup_u8=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_idn2_lookup_u8+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_idn2_lookup_u8+y}
+then :
+
+else $as_nop
+ ac_cv_search_idn2_lookup_u8=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_idn2_lookup_u8" >&5
+printf "%s\n" "$ac_cv_search_idn2_lookup_u8" >&6; }
+ac_res=$ac_cv_search_idn2_lookup_u8
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ with_libidn2=yes;
+printf "%s\n" "#define ENABLE_IRI 1" >>confdefs.h
+
+else $as_nop
+ with_libidn2=no; iri=no; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: *** LIBIDN2 was not found. You will not be able to use IDN2008 support" >&5
+printf "%s\n" "$as_me: WARNING: *** LIBIDN2 was not found. You will not be able to use IDN2008 support" >&2;}
+fi
+
+
+# AS_IF([test "x$with_libidn2" = xyes], [
+# AC_SEARCH_LIBS(u8_tolower, unistring,
+# [AC_DEFINE([ENABLE_IRI], 1, [Define if IRI support is enabled.])],
+# [iri=no; AC_MSG_WARN(*** LIBUNISTRING was not found. You will not be able to use IDN2008 support)])
+# ])
+
+fi
+fi
+
+
+
+# Check whether --with-libuuid was given.
+if test ${with_libuuid+y}
+then :
+ withval=$with_libuuid;
+fi
+
+
+if test "x$with_libuuid" = xyes
+then :
+
+ # libuuid was explicitly requested
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for UUID" >&5
+printf %s "checking for UUID... " >&6; }
+
+if test -n "$UUID_CFLAGS"; then
+ pkg_cv_UUID_CFLAGS="$UUID_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "uuid") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_UUID_CFLAGS=`$PKG_CONFIG --cflags "uuid" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$UUID_LIBS"; then
+ pkg_cv_UUID_LIBS="$UUID_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"uuid\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "uuid") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_UUID_LIBS=`$PKG_CONFIG --libs "uuid" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ UUID_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "uuid" 2>&1`
+ else
+ UUID_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "uuid" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$UUID_PKG_ERRORS" >&5
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5
+printf %s "checking for library containing uuid_generate... " >&6; }
+if test ${ac_cv_search_uuid_generate+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char uuid_generate ();
+int
+main (void)
+{
+return uuid_generate ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' uuid
+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_uuid_generate=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_uuid_generate+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_uuid_generate+y}
+then :
+
+else $as_nop
+ ac_cv_search_uuid_generate=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_uuid_generate" >&5
+printf "%s\n" "$ac_cv_search_uuid_generate" >&6; }
+ac_res=$ac_cv_search_uuid_generate
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ uuid_mode=1
+else $as_nop
+ as_fn_error $? "*** libuuid was explicitly requested but wasn't found." "$LINENO" 5
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5
+printf %s "checking for library containing uuid_generate... " >&6; }
+if test ${ac_cv_search_uuid_generate+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char uuid_generate ();
+int
+main (void)
+{
+return uuid_generate ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' uuid
+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_uuid_generate=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_uuid_generate+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_uuid_generate+y}
+then :
+
+else $as_nop
+ ac_cv_search_uuid_generate=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_uuid_generate" >&5
+printf "%s\n" "$ac_cv_search_uuid_generate" >&6; }
+ac_res=$ac_cv_search_uuid_generate
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ uuid_mode=1
+else $as_nop
+ as_fn_error $? "*** libuuid was explicitly requested but wasn't found." "$LINENO" 5
+fi
+
+
+else
+ UUID_CFLAGS=$pkg_cv_UUID_CFLAGS
+ UUID_LIBS=$pkg_cv_UUID_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ LIBS="$UUID_LIBS $LIBS"
+ CFLAGS="$UUID_CFLAGS $CFLAGS"
+ uuid_mode=1
+
+fi
+
+elif test "x$with_libuuid" = xno
+then :
+
+ # libuuid was explicitly *not* requested
+ ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default"
+if test "x$ac_cv_header_uuid_h" = xyes
+then :
+ ac_fn_c_check_func "$LINENO" "uuid_create" "ac_cv_func_uuid_create"
+if test "x$ac_cv_func_uuid_create" = xyes
+then :
+ uuid_mode=2
+fi
+
+fi
+
+
+else $as_nop
+
+ # default:
+ ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default"
+if test "x$ac_cv_header_uuid_h" = xyes
+then :
+
+ ac_fn_c_check_func "$LINENO" "uuid_create" "ac_cv_func_uuid_create"
+if test "x$ac_cv_func_uuid_create" = xyes
+then :
+ uuid_mode=2
+fi
+
+
+else $as_nop
+
+ ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default"
+if test "x$ac_cv_header_uuid_uuid_h" = xyes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5
+printf %s "checking for library containing uuid_generate... " >&6; }
+if test ${ac_cv_search_uuid_generate+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ 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. */
+char uuid_generate ();
+int
+main (void)
+{
+return uuid_generate ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' uuid
+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_uuid_generate=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_uuid_generate+y}
+then :
+ break
+fi
+done
+if test ${ac_cv_search_uuid_generate+y}
+then :
+
+else $as_nop
+ ac_cv_search_uuid_generate=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_uuid_generate" >&5
+printf "%s\n" "$ac_cv_search_uuid_generate" >&6; }
+ac_res=$ac_cv_search_uuid_generate
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+ uuid_mode=1
+fi
+
+fi
+
+
+fi
+
+
+fi
+
+if test "x$uuid_mode" = x1
+then :
+
+
+printf "%s\n" "#define HAVE_LIBUUID 1" >>confdefs.h
+
+
+elif test "x$uuid_mode" = x2
+then :
+
+
+printf "%s\n" "#define HAVE_UUID_CREATE 1" >>confdefs.h
+
+
+fi
+
+
+# Check whether --enable-pcre2 was given.
+if test ${enable_pcre2+y}
+then :
+ enableval=$enable_pcre2;
+fi
+
+# Check whether --enable-pcre was given.
+if test ${enable_pcre+y}
+then :
+ enableval=$enable_pcre;
+fi
+
+
+if test "X$enable_pcre2" != "Xno"
+then :
+
+ enable_pcre2=no
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PCRE2" >&5
+printf %s "checking for PCRE2... " >&6; }
+
+if test -n "$PCRE2_CFLAGS"; then
+ pkg_cv_PCRE2_CFLAGS="$PCRE2_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre2-8\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpcre2-8") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PCRE2_CFLAGS=`$PKG_CONFIG --cflags "libpcre2-8" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$PCRE2_LIBS"; then
+ pkg_cv_PCRE2_LIBS="$PCRE2_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre2-8\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpcre2-8") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PCRE2_LIBS=`$PKG_CONFIG --libs "libpcre2-8" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ PCRE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpcre2-8" 2>&1`
+ else
+ PCRE2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpcre2-8" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$PCRE2_PKG_ERRORS" >&5
+
+
+ ac_fn_c_check_header_compile "$LINENO" "pcre2.h" "ac_cv_header_pcre2_h" "$ac_includes_default"
+if test "x$ac_cv_header_pcre2_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcre2_compile_8 in -lpcre2-8" >&5
+printf %s "checking for pcre2_compile_8 in -lpcre2-8... " >&6; }
+if test ${ac_cv_lib_pcre2_8_pcre2_compile_8+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcre2-8 $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. */
+char pcre2_compile_8 ();
+int
+main (void)
+{
+return pcre2_compile_8 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pcre2_8_pcre2_compile_8=yes
+else $as_nop
+ ac_cv_lib_pcre2_8_pcre2_compile_8=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre2_8_pcre2_compile_8" >&5
+printf "%s\n" "$ac_cv_lib_pcre2_8_pcre2_compile_8" >&6; }
+if test "x$ac_cv_lib_pcre2_8_pcre2_compile_8" = xyes
+then :
+
+ LIBS="${LIBS} -lpcre2-8"
+
+printf "%s\n" "#define HAVE_LIBPCRE2 1" >>confdefs.h
+
+ enable_pcre2=yes
+
+fi
+
+
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ ac_fn_c_check_header_compile "$LINENO" "pcre2.h" "ac_cv_header_pcre2_h" "$ac_includes_default"
+if test "x$ac_cv_header_pcre2_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcre2_compile_8 in -lpcre2-8" >&5
+printf %s "checking for pcre2_compile_8 in -lpcre2-8... " >&6; }
+if test ${ac_cv_lib_pcre2_8_pcre2_compile_8+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcre2-8 $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. */
+char pcre2_compile_8 ();
+int
+main (void)
+{
+return pcre2_compile_8 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pcre2_8_pcre2_compile_8=yes
+else $as_nop
+ ac_cv_lib_pcre2_8_pcre2_compile_8=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre2_8_pcre2_compile_8" >&5
+printf "%s\n" "$ac_cv_lib_pcre2_8_pcre2_compile_8" >&6; }
+if test "x$ac_cv_lib_pcre2_8_pcre2_compile_8" = xyes
+then :
+
+ LIBS="${LIBS} -lpcre2-8"
+
+printf "%s\n" "#define HAVE_LIBPCRE2 1" >>confdefs.h
+
+ enable_pcre2=yes
+
+fi
+
+
+fi
+
+
+else
+ PCRE2_CFLAGS=$pkg_cv_PCRE2_CFLAGS
+ PCRE2_LIBS=$pkg_cv_PCRE2_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ CFLAGS="$PCRE2_CFLAGS $CFLAGS"
+ LIBS="$PCRE2_LIBS $LIBS"
+
+printf "%s\n" "#define HAVE_LIBPCRE2 1" >>confdefs.h
+
+ enable_pcre2=yes
+
+fi
+
+fi
+
+if test "X$enable_pcre" != "Xno" && test "X$enable_pcre2" != "Xyes"
+then :
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PCRE" >&5
+printf %s "checking for PCRE... " >&6; }
+
+if test -n "$PCRE_CFLAGS"; then
+ pkg_cv_PCRE_CFLAGS="$PCRE_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpcre") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PCRE_CFLAGS=`$PKG_CONFIG --cflags "libpcre" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$PCRE_LIBS"; then
+ pkg_cv_PCRE_LIBS="$PCRE_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libpcre") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_PCRE_LIBS=`$PKG_CONFIG --libs "libpcre" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ PCRE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpcre" 2>&1`
+ else
+ PCRE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpcre" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$PCRE_PKG_ERRORS" >&5
+
+
+ ac_fn_c_check_header_compile "$LINENO" "pcre.h" "ac_cv_header_pcre_h" "$ac_includes_default"
+if test "x$ac_cv_header_pcre_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcre_compile in -lpcre" >&5
+printf %s "checking for pcre_compile in -lpcre... " >&6; }
+if test ${ac_cv_lib_pcre_pcre_compile+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcre $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. */
+char pcre_compile ();
+int
+main (void)
+{
+return pcre_compile ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pcre_pcre_compile=yes
+else $as_nop
+ ac_cv_lib_pcre_pcre_compile=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_compile" >&5
+printf "%s\n" "$ac_cv_lib_pcre_pcre_compile" >&6; }
+if test "x$ac_cv_lib_pcre_pcre_compile" = xyes
+then :
+
+ LIBS="${LIBS} -lpcre"
+
+printf "%s\n" "#define HAVE_LIBPCRE 1" >>confdefs.h
+
+
+fi
+
+
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ ac_fn_c_check_header_compile "$LINENO" "pcre.h" "ac_cv_header_pcre_h" "$ac_includes_default"
+if test "x$ac_cv_header_pcre_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcre_compile in -lpcre" >&5
+printf %s "checking for pcre_compile in -lpcre... " >&6; }
+if test ${ac_cv_lib_pcre_pcre_compile+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcre $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. */
+char pcre_compile ();
+int
+main (void)
+{
+return pcre_compile ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_pcre_pcre_compile=yes
+else $as_nop
+ ac_cv_lib_pcre_pcre_compile=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcre_pcre_compile" >&5
+printf "%s\n" "$ac_cv_lib_pcre_pcre_compile" >&6; }
+if test "x$ac_cv_lib_pcre_pcre_compile" = xyes
+then :
+
+ LIBS="${LIBS} -lpcre"
+
+printf "%s\n" "#define HAVE_LIBPCRE 1" >>confdefs.h
+
+
+fi
+
+
+fi
+
+
+else
+ PCRE_CFLAGS=$pkg_cv_PCRE_CFLAGS
+ PCRE_LIBS=$pkg_cv_PCRE_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ CFLAGS="$PCRE_CFLAGS $CFLAGS"
+ ac_fn_c_check_header_compile "$LINENO" "pcre.h" "ac_cv_header_pcre_h" "$ac_includes_default"
+if test "x$ac_cv_header_pcre_h" = xyes
+then :
+
+ LIBS="$PCRE_LIBS $LIBS"
+
+printf "%s\n" "#define HAVE_LIBPCRE 1" >>confdefs.h
+
+ enable_pcre=yes
+
+fi
+
+
+fi
+
+fi
+
+if test "X$enable_pcre2" = Xyes
+then :
+ PCRE_INFO="yes, via libpcre2"
+elif test "X$enable_pcre" = Xyes
+then :
+ PCRE_INFO="yes, via libpcre"
+else $as_nop
+ PCRE_INFO=no
+fi
+
+
+if test "X$with_cares" = "Xyes"
+then :
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CARES" >&5
+printf %s "checking for CARES... " >&6; }
+
+if test -n "$CARES_CFLAGS"; then
+ pkg_cv_CARES_CFLAGS="$CARES_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcares\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libcares") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_CARES_CFLAGS=`$PKG_CONFIG --cflags "libcares" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$CARES_LIBS"; then
+ pkg_cv_CARES_LIBS="$CARES_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcares\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libcares") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_CARES_LIBS=`$PKG_CONFIG --libs "libcares" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ CARES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcares" 2>&1`
+ else
+ CARES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcares" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$CARES_PKG_ERRORS" >&5
+
+
+ ac_fn_c_check_header_compile "$LINENO" "ares.h" "ac_cv_header_ares_h" "$ac_includes_default"
+if test "x$ac_cv_header_ares_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ares_set_local_ip4 in -lcares" >&5
+printf %s "checking for ares_set_local_ip4 in -lcares... " >&6; }
+if test ${ac_cv_lib_cares_ares_set_local_ip4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcares $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. */
+char ares_set_local_ip4 ();
+int
+main (void)
+{
+return ares_set_local_ip4 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_cares_ares_set_local_ip4=yes
+else $as_nop
+ ac_cv_lib_cares_ares_set_local_ip4=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cares_ares_set_local_ip4" >&5
+printf "%s\n" "$ac_cv_lib_cares_ares_set_local_ip4" >&6; }
+if test "x$ac_cv_lib_cares_ares_set_local_ip4" = xyes
+then :
+
+ LIBS="-lcares ${LIBS}"
+
+printf "%s\n" "#define HAVE_LIBCARES 1" >>confdefs.h
+
+ RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
+
+fi
+
+
+fi
+
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ ac_fn_c_check_header_compile "$LINENO" "ares.h" "ac_cv_header_ares_h" "$ac_includes_default"
+if test "x$ac_cv_header_ares_h" = xyes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ares_set_local_ip4 in -lcares" >&5
+printf %s "checking for ares_set_local_ip4 in -lcares... " >&6; }
+if test ${ac_cv_lib_cares_ares_set_local_ip4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcares $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. */
+char ares_set_local_ip4 ();
+int
+main (void)
+{
+return ares_set_local_ip4 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_lib_cares_ares_set_local_ip4=yes
+else $as_nop
+ ac_cv_lib_cares_ares_set_local_ip4=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cares_ares_set_local_ip4" >&5
+printf "%s\n" "$ac_cv_lib_cares_ares_set_local_ip4" >&6; }
+if test "x$ac_cv_lib_cares_ares_set_local_ip4" = xyes
+then :
+
+ LIBS="-lcares ${LIBS}"
+
+printf "%s\n" "#define HAVE_LIBCARES 1" >>confdefs.h
+
+ RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
+
+fi
+
+
+fi
+
+
+else
+ CARES_CFLAGS=$pkg_cv_CARES_CFLAGS
+ CARES_LIBS=$pkg_cv_CARES_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ CFLAGS="$CARES_CFLAGS $CFLAGS"
+ ac_fn_c_check_header_compile "$LINENO" "ares.h" "ac_cv_header_ares_h" "$ac_includes_default"
+if test "x$ac_cv_header_ares_h" = xyes
+then :
+
+ LIBS="$CARES_LIBS $LIBS"
+
+printf "%s\n" "#define HAVE_LIBCARES 1" >>confdefs.h
+
+ RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
+
+fi
+
+
+fi
+
+else $as_nop
+
+ RESOLVER_INFO="libc, --bind-dns-address and --dns-servers not available"
+
+fi
+
+
+# Check whether --with-gpgme-prefix was given.
+if test ${with_gpgme_prefix+y}
+then :
+ withval=$with_gpgme_prefix; gpgme_config_prefix="$withval"
+else $as_nop
+ gpgme_config_prefix=""
+fi
+
+ if test x"${GPGME_CONFIG}" = x ; then
+ if test x"${gpgme_config_prefix}" != x ; then
+ GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config"
+ else
+ case "${SYSROOT}" in
+ /*)
+ if test -x "${SYSROOT}/bin/gpgme-config" ; then
+ GPGME_CONFIG="${SYSROOT}/bin/gpgme-config"
+ fi
+ ;;
+ '')
+ ;;
+ *)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&5
+printf "%s\n" "$as_me: WARNING: Ignoring \$SYSROOT as it is not an absolute path." >&2;}
+ ;;
+ esac
+ fi
+ fi
+
+ use_gpgrt_config=""
+ if test x"${GPGME_CONFIG}" = x -a x"$GPGRT_CONFIG" != x -a "$GPGRT_CONFIG" != "no"; then
+ if $GPGRT_CONFIG gpgme --exists; then
+ GPGME_CONFIG="$GPGRT_CONFIG gpgme"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Use gpgrt-config as gpgme-config" >&5
+printf "%s\n" "$as_me: Use gpgrt-config as gpgme-config" >&6;}
+ use_gpgrt_config=yes
+ fi
+ fi
+ if test -z "$use_gpgrt_config"; then
+ # Extract the first word of "gpgme-config", so it can be a program name with args.
+set dummy gpgme-config; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GPGME_CONFIG+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ case $GPGME_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GPGME_CONFIG="$GPGME_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GPGME_CONFIG="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_GPGME_CONFIG" && ac_cv_path_GPGME_CONFIG="no"
+ ;;
+esac
+fi
+GPGME_CONFIG=$ac_cv_path_GPGME_CONFIG
+if test -n "$GPGME_CONFIG"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GPGME_CONFIG" >&5
+printf "%s\n" "$GPGME_CONFIG" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+
+ if test "$GPGME_CONFIG" != "no" ; then
+ if test -z "$use_gpgrt_config"; then
+ gpgme_version=`$GPGME_CONFIG --version`
+ else
+ gpgme_version=`$GPGME_CONFIG --modversion`
+ fi
+ fi
+ gpgme_version_major=`echo $gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
+ gpgme_version_minor=`echo $gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
+ gpgme_version_micro=`echo $gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
+
+if test x"$with_metalink" != xno
+then :
+
+
+pkg_failed=no
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for METALINK" >&5
+printf %s "checking for METALINK... " >&6; }
+
+if test -n "$METALINK_CFLAGS"; then
+ pkg_cv_METALINK_CFLAGS="$METALINK_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmetalink\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libmetalink") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_METALINK_CFLAGS=`$PKG_CONFIG --cflags "libmetalink" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$METALINK_LIBS"; then
+ pkg_cv_METALINK_LIBS="$METALINK_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmetalink\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libmetalink") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_METALINK_LIBS=`$PKG_CONFIG --libs "libmetalink" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ METALINK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmetalink" 2>&1`
+ else
+ METALINK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmetalink" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$METALINK_PKG_ERRORS" >&5
+
+
+ with_metalink=no
+
+elif test $pkg_failed = untried; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+ with_metalink=no
+
+else
+ METALINK_CFLAGS=$pkg_cv_METALINK_CFLAGS
+ METALINK_LIBS=$pkg_cv_METALINK_LIBS
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ LIBS="$METALINK_LIBS $LIBS"
+ CFLAGS="$METALINK_CFLAGS $CFLAGS"
+
+printf "%s\n" "#define HAVE_METALINK 1" >>confdefs.h
+
+ with_metalink=yes
+
+fi
+
+ have_gpg=no
+ if test x"$with_metalink" = xyes
+then :
+
+
+ tmp=1:0.4.2
+ if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+ req_gpgme_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'`
+ min_gpgme_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+ else
+ req_gpgme_api=0
+ min_gpgme_version="$tmp"
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GPGME - version >= $min_gpgme_version" >&5
+printf %s "checking for GPGME - version >= $min_gpgme_version... " >&6; }
+ ok=no
+ if test "$GPGME_CONFIG" != "no" ; then
+ req_major=`echo $min_gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
+ req_minor=`echo $min_gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
+ req_micro=`echo $min_gpgme_version | \
+ sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
+ if test "$gpgme_version_major" -gt "$req_major"; then
+ ok=yes
+ else
+ if test "$gpgme_version_major" -eq "$req_major"; then
+ if test "$gpgme_version_minor" -gt "$req_minor"; then
+ ok=yes
+ else
+ if test "$gpgme_version_minor" -eq "$req_minor"; then
+ if test "$gpgme_version_micro" -ge "$req_micro"; then
+ ok=yes
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ # If we have a recent GPGME, we should also check that the
+ # API is compatible.
+ if test "$req_gpgme_api" -gt 0 ; then
+ if test -z "$use_gpgrt_config"; then
+ tmp=`$GPGME_CONFIG --api-version 2>/dev/null || echo 0`
+ else
+ tmp=`$GPGME_CONFIG --variable=api_version 2>/dev/null || echo 0`
+ fi
+ if test "$tmp" -gt 0 ; then
+ if test "$req_gpgme_api" -ne "$tmp" ; then
+ ok=no
+ fi
+ fi
+ fi
+ fi
+ if test $ok = yes; then
+ GPGME_CFLAGS=`$GPGME_CONFIG --cflags`
+ GPGME_LIBS=`$GPGME_CONFIG --libs`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+ # Put libgpgme to the end of the library list since it introduces a -L linker flags.
+ # That -L might break the build if there are two different version of
+ # a library (e.g. GnuTLS) in /usr/local and in the system directory.
+ LIBS="$LIBS $GPGME_LIBS"
+ CFLAGS="$GPGME_CFLAGS $CFLAGS"
+
+printf "%s\n" "#define HAVE_GPGME 1" >>confdefs.h
+
+ have_gpg=yes
+
+
+ if test -z "$use_gpgrt_config"; then
+ gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none`
+ else
+ gpgme_config_host=`$GPGME_CONFIG --variable=host 2>/dev/null || echo none`
+ fi
+ if test x"$gpgme_config_host" != xnone ; then
+ if test x"$gpgme_config_host" != x"$host" ; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING:
+***
+*** The config script \"$GPGME_CONFIG\" was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***" >&5
+printf "%s\n" "$as_me: WARNING:
+***
+*** The config script \"$GPGME_CONFIG\" was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***" >&2;}
+ gpg_config_script_warn="$gpg_config_script_warn gpgme"
+ fi
+ fi
+
+ else
+ GPGME_CFLAGS=""
+ GPGME_LIBS=""
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ :
+ fi
+
+
+
+
+
+fi
+
+fi
+
+
+# Check whether --enable-xattr was given.
+if test ${enable_xattr+y}
+then :
+ enableval=$enable_xattr; ENABLE_XATTR=$enableval
+else $as_nop
+ ENABLE_XATTR=yes
+fi
+
+
+case "$host_os" in
+ *linux* | *darwin*) xattr_syscalls="fsetxattr" ;;
+ freebsd*) xattr_syscalls="extattr_set_fd" ;;
+ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling Extended Attribute support: your system is not known to support extended attributes." >&5
+printf "%s\n" "$as_me: Disabling Extended Attribute support: your system is not known to support extended attributes." >&6;}
+ ENABLE_XATTR=no
+esac
+
+if test "X${ENABLE_XATTR}" = "Xyes"; then
+
+ for ac_func in $xattr_syscalls
+do :
+ as_ac_var=`printf "%s\n" "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 `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling Extended Attribute support: your system does not support $xattr_syscalls" >&5
+printf "%s\n" "$as_me: Disabling Extended Attribute support: your system does not support $xattr_syscalls" >&6;}
+ ENABLE_XATTR=no
+
+fi
+
+done
+fi
+
+test "X${ENABLE_XATTR}" = "Xyes" &&
+printf "%s\n" "#define ENABLE_XATTR 1" >>confdefs.h
+
+
+ if test "X$iri" != "Xno"; then
+ IRI_IS_ENABLED_TRUE=
+ IRI_IS_ENABLED_FALSE='#'
+else
+ IRI_IS_ENABLED_TRUE='#'
+ IRI_IS_ENABLED_FALSE=
+fi
+
+ if test "X$with_ssl" != "Xno"; then
+ WITH_SSL_TRUE=
+ WITH_SSL_FALSE='#'
+else
+ WITH_SSL_TRUE='#'
+ WITH_SSL_FALSE=
+fi
+
+ if test "X$with_metalink" != "Xno"; then
+ METALINK_IS_ENABLED_TRUE=
+ METALINK_IS_ENABLED_FALSE='#'
+else
+ METALINK_IS_ENABLED_TRUE='#'
+ METALINK_IS_ENABLED_FALSE=
+fi
+
+ if test "X$ENABLE_XATTR" != "Xno"; then
+ WITH_XATTR_TRUE=
+ WITH_XATTR_FALSE='#'
+else
+ WITH_XATTR_TRUE='#'
+ WITH_XATTR_FALSE=
+fi
+
+ if test "X$ENABLE_NTLM" == "Xyes"; then
+ WITH_NTLM_TRUE=
+ WITH_NTLM_FALSE='#'
+else
+ WITH_NTLM_TRUE='#'
+ WITH_NTLM_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile src/Makefile doc/Makefile util/Makefile po/Makefile.in gnulib_po/Makefile.in tests/Makefile fuzz/Makefile lib/Makefile testenv/Makefile tests/certs/interca.conf tests/certs/rootca.conf"
+
+ac_config_headers="$ac_config_headers src/config.h"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "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
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FUZZING_TRUE}" && test -z "${FUZZING_FALSE}"; then
+ as_fn_error $? "conditional \"FUZZING\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PYTHON3_TRUE}" && test -z "${HAVE_PYTHON3_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_PYTHON3\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ICONV_H_TRUE}" && test -z "${GL_GENERATE_ICONV_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_ICONV_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
+ as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_BYTESWAP_H_TRUE}" && test -z "${GL_GENERATE_BYTESWAP_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_BYTESWAP_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_FLOAT_H_TRUE}" && test -z "${GL_GENERATE_FLOAT_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_FLOAT_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_FNMATCH_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_FNMATCH_H_TRUE}" && test -z "${GL_GENERATE_FNMATCH_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_FNMATCH_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+CONFIG_INCLUDE=src/config.h
+
+if test -z "${GL_GENERATE_NETINET_IN_H_TRUE}" && test -z "${GL_GENERATE_NETINET_IN_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_NETINET_IN_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDALIGN_H_TRUE}" && test -z "${GL_GENERATE_STDALIGN_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_STDALIGN_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
+ as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_TOLOWER_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_TOLOWER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_CPY_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_CPY\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE}" && test -z "${LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_FALSE}"; then
+ as_fn_error $? "conditional \"LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+
+ gl_libobjs=
+ gl_ltlibobjs=
+ if test -n "$gl_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gl_libobjs="$gl_libobjs $i.$ac_objext"
+ gl_ltlibobjs="$gl_ltlibobjs $i.lo"
+ done
+ fi
+ gl_LIBOBJS=$gl_libobjs
+
+ gl_LTLIBOBJS=$gl_ltlibobjs
+
+
+
+ gltests_libobjs=
+ gltests_ltlibobjs=
+ if test -n "$gltests_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gltests_libobjs="$gltests_libobjs $i.$ac_objext"
+ gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
+ done
+ fi
+ gltests_LIBOBJS=$gltests_libobjs
+
+ gltests_LTLIBOBJS=$gltests_ltlibobjs
+
+
+if test -z "${IRI_IS_ENABLED_TRUE}" && test -z "${IRI_IS_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"IRI_IS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_SSL_TRUE}" && test -z "${WITH_SSL_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_SSL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${METALINK_IS_ENABLED_TRUE}" && test -z "${METALINK_IS_ENABLED_FALSE}"; then
+ as_fn_error $? "conditional \"METALINK_IS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_XATTR_TRUE}" && test -z "${WITH_XATTR_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_XATTR\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WITH_NTLM_TRUE}" && test -z "${WITH_NTLM_FALSE}"; then
+ as_fn_error $? "conditional \"WITH_NTLM\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by wget $as_me 1.21, which was
+generated by GNU Autoconf 2.70. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_links="$ac_config_links"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration links:
+$config_links
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-wget@gnu.org>."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+wget config.status 1.21
+configured by $0, generated by GNU Autoconf 2.70,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2020 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake < 1.5.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+
+GNUmakefile=$GNUmakefile
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
+ "$GNUmakefile") CONFIG_LINKS="$CONFIG_LINKS $GNUmakefile:$GNUmakefile" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+ "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+ "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "gnulib_po/Makefile.in") CONFIG_FILES="$CONFIG_FILES gnulib_po/Makefile.in" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+ "fuzz/Makefile") CONFIG_FILES="$CONFIG_FILES fuzz/Makefile" ;;
+ "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
+ "testenv/Makefile") CONFIG_FILES="$CONFIG_FILES testenv/Makefile" ;;
+ "tests/certs/interca.conf") CONFIG_FILES="$CONFIG_FILES tests/certs/interca.conf" ;;
+ "tests/certs/rootca.conf") CONFIG_FILES="$CONFIG_FILES tests/certs/rootca.conf" ;;
+ "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_LINKS+y} || CONFIG_LINKS=$config_links
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ printf "%s\n" "/* $configure_input */" >&1 \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$_am_arg" : 'X\(//\)[^/]' \| \
+ X"$_am_arg" : 'X\(//\)$' \| \
+ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$_am_arg" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+ :L)
+ #
+ # CONFIG_LINK
+ #
+
+ if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
+ :
+ else
+ # Prefer the file from the source tree if names are identical.
+ if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
+ ac_source=$srcdir/$ac_source
+ fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
+printf "%s\n" "$as_me: linking $ac_source to $ac_file" >&6;}
+
+ if test ! -r "$ac_source"; then
+ as_fn_error $? "$ac_source: file not found" "$LINENO" 5
+ fi
+ rm -f "$ac_file"
+
+ # Try a relative symlink, then a hard link, then a copy.
+ case $ac_source in
+ [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
+ *) ac_rel_source=$ac_top_build_prefix$ac_source ;;
+ esac
+ ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
+ ln "$ac_source" "$ac_file" 2>/dev/null ||
+ cp -p "$ac_source" "$ac_file" ||
+ as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
+ fi
+ ;;
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+ "po-directories":C)
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ 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_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.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ 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"
+ 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
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ 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 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 assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Summary of build options:
+
+ Version: $PACKAGE_VERSION
+ Host OS: $host_os
+ Install prefix: $prefix
+ Compiler: $CC
+ CFlags: $CFLAGS $CPPFLAGS $WARN_CFLAGS
+ LDFlags: $LDFLAGS
+ Libs: $LIBS
+ SSL: $with_ssl
+ Zlib: $with_zlib
+ PSL: $with_libpsl
+ PCRE: $PCRE_INFO
+ Digest: $ENABLE_DIGEST
+ NTLM: $ENABLE_NTLM
+ OPIE: $ENABLE_OPIE
+ POSIX xattr: $ENABLE_XATTR
+ Debugging: $ENABLE_DEBUG
+ Assertions: $ENABLE_ASSERTION
+ Valgrind: $VALGRIND_INFO
+ Metalink: $with_metalink
+ Resolver: $RESOLVER_INFO
+ GPGME: $have_gpg
+ IRI: $iri
+ Fuzzing build: $enable_fuzzing, $LIB_FUZZING_ENGINE
+" >&5
+printf "%s\n" "$as_me: Summary of build options:
+
+ Version: $PACKAGE_VERSION
+ Host OS: $host_os
+ Install prefix: $prefix
+ Compiler: $CC
+ CFlags: $CFLAGS $CPPFLAGS $WARN_CFLAGS
+ LDFlags: $LDFLAGS
+ Libs: $LIBS
+ SSL: $with_ssl
+ Zlib: $with_zlib
+ PSL: $with_libpsl
+ PCRE: $PCRE_INFO
+ Digest: $ENABLE_DIGEST
+ NTLM: $ENABLE_NTLM
+ OPIE: $ENABLE_OPIE
+ POSIX xattr: $ENABLE_XATTR
+ Debugging: $ENABLE_DEBUG
+ Assertions: $ENABLE_ASSERTION
+ Valgrind: $VALGRIND_INFO
+ Metalink: $with_metalink
+ Resolver: $RESOLVER_INFO
+ GPGME: $have_gpg
+ IRI: $iri
+ Fuzzing build: $enable_fuzzing, $LIB_FUZZING_ENGINE
+" >&6;}
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..9227f31
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,1018 @@
+dnl Template file for GNU Autoconf
+dnl Copyright (C) 1995-1997, 2001, 2007-2014, 2018-2020 Free Software
+dnl Foundation, Inc.
+
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+dnl Additional permission under GNU GPL version 3 section 7
+
+dnl If you modify this program, or any covered work, by linking or
+dnl combining it with the OpenSSL project's OpenSSL library (or a
+dnl modified version of that library), containing parts covered by the
+dnl terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+dnl grants you additional permission to convey the resulting work.
+dnl Corresponding Source for a non-source form of such a combination
+dnl shall include the source code for the parts of OpenSSL used as well
+dnl as that of the covered work.
+
+dnl
+dnl Process this file with autoconf to produce a configure script.
+dnl
+
+AC_INIT([wget],[m4_esyscmd(build-aux/git-version-gen .tarball-version)],[bug-wget@gnu.org])
+AC_PREREQ([2.64])
+
+dnl
+dnl What version of Wget are we building?
+dnl
+AC_MSG_NOTICE([configuring for GNU Wget $PACKAGE_VERSION])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_AUX_DIR([build-aux])
+
+AC_CONFIG_SRCDIR([src/wget.h])
+
+dnl
+dnl Automake setup
+dnl
+AM_INIT_AUTOMAKE([subdir-objects])
+
+AC_USE_SYSTEM_EXTENSIONS
+AC_PROG_CC
+AM_PROG_CC_C_O
+
+dnl
+dnl Get canonical host
+dnl
+AC_CANONICAL_HOST
+AC_DEFINE_UNQUOTED([OS_TYPE], "$host_os",
+ [Define to be the name of the operating system.])
+
+dnl Non-verbose make
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+dnl
+dnl Process External Libraries
+dnl
+
+dnl Libpsl: Public Suffix List checking
+AC_ARG_WITH([libpsl],
+ [AS_HELP_STRING([--without-libpsl], [disable support for libpsl cookie checking.])])
+
+dnl SSL: Configure SSL backend to use
+AC_ARG_WITH([ssl],
+ [AS_HELP_STRING([--with-ssl={gnutls,openssl,no}], [specify SSL backend. GNU TLS is the default.])])
+
+dnl Zlib: Configure use of zlib for compression
+AC_ARG_WITH([zlib],
+ [AS_HELP_STRING([--without-zlib], [disable zlib.])])
+
+dnl Metalink: Configure use of the Metalink library
+AC_ARG_WITH([metalink],
+ [AS_HELP_STRING([--with-metalink], [enable support for metalinks.])])
+
+dnl C-Ares: Configure use of the c-ares library for DNS lookup
+AC_ARG_WITH(cares, AS_HELP_STRING([--with-cares], [enable support for C-Ares DNS lookup.]), with_cares=$withval, with_cares=no)
+
+dnl
+dnl Process features
+dnl
+
+AC_ARG_ENABLE([fuzzing],
+ [AS_HELP_STRING([--enable-fuzzing], [Turn on fuzzing build (for developers)])],
+ [enable_fuzzing=yes;
+ AC_SUBST([LIB_FUZZING_ENGINE])
+ AC_DEFINE([FUZZING], 1, [Define to 1 if this is a fuzzing build])
+ ], [enable_fuzzing=no; LIB_FUZZING_ENGINE=""])
+AM_CONDITIONAL([FUZZING], [test "$enable_fuzzing" = "yes"])
+
+dnl needed for some fuzzers
+OLD_LIBS="$LIBS"
+AC_SEARCH_LIBS([dlopen], [dl dld])
+if [[ "${ac_cv_search_dlopen#-l}" != "${ac_cv_search_dlopen}" ]]; then
+ FUZZ_LIBS="${ac_cv_search_dlopen}"
+ AC_SUBST([FUZZ_LIBS])
+fi
+LIBS="$OLD_LIBS"
+
+
+AC_ARG_ENABLE([fsanitize-ubsan],
+ [AS_HELP_STRING([--enable-fsanitize-ubsan], [Turn on Undefined Behavior Sanitizer (for developers)])],
+ [gl_cc_sanitize_ubsan=yes], [gl_cc_sanitize_ubsan=no])
+
+AC_ARG_ENABLE([fsanitize-asan],
+ [AS_HELP_STRING([--enable-fsanitize-asan], [Turn on Address Sanitizer (for developers) (mutually exclusive with Memory/Thread sanitizer or Valgrind tests)])],
+ [gl_cc_sanitize_asan=yes], [gl_cc_sanitize_asan=no])
+
+AC_ARG_ENABLE([fsanitize-msan],
+ [AS_HELP_STRING([--enable-fsanitize-msan], [Turn on Memory Sanitizer (for developers) (mutually exclusive with Address/Thread sanitizer or Valgrind tests)])],
+ [gl_cc_sanitize_msan=yes], [gl_cc_sanitize_msan=no])
+
+if test "$gl_cc_sanitize_asan" = yes; then
+ if test "$gl_cc_sanitize_msan" = yes; then
+ AC_MSG_ERROR([Address Sanitizer and Memory Sanitizer are mutually exclusive])
+ fi
+fi
+
+if test "$gl_cc_sanitize_ubsan" = yes; then
+ gl_WARN_ADD([-fsanitize=undefined])
+ gl_WARN_ADD([-fno-sanitize-recover=undefined])
+
+ # additional clang options
+ gl_WARN_ADD([-fsanitize=integer])
+ gl_WARN_ADD([-fsanitize=nullability])
+ gl_WARN_ADD([-fno-sanitize-recover=nullability])
+fi
+
+if test "$gl_cc_sanitize_asan" = yes; then
+ gl_WARN_ADD([-fsanitize=address])
+ gl_WARN_ADD([-fno-omit-frame-pointer])
+
+ # additional clang option
+ gl_WARN_ADD([-fsanitize-address-use-after-scope])
+fi
+
+if test "$gl_cc_sanitize_msan" = yes; then
+ # clang options
+ gl_WARN_ADD([-fsanitize=memory])
+ gl_WARN_ADD([-fsanitize-memory-track-origins])
+
+ # gcc options
+ if test "$CCNAME" = "gcc"; then
+ gl_WARN_ADD([-fsanitize=leak])
+ fi
+
+ gl_WARN_ADD([-fno-omit-frame-pointer])
+ gl_WARN_ADD([-fPIE])
+fi
+
+
+dnl Opie: Support for opie s/key FTP logins
+AC_ARG_ENABLE([opie],
+ [AS_HELP_STRING([--disable-opie], [disable support for opie or s/key FTP login])],
+ [ENABLE_OPIE=$enableval],
+ [ENABLE_OPIE=yes])
+
+AS_IF([test "x$ENABLE_OPIE" = xyes],
+ [AC_DEFINE([ENABLE_OPIE], [1], [Define if you want Opie support for FTP compiled in.])],
+ []
+)
+
+
+dnl Digest: Support for HTTP Digest Authentication
+AC_ARG_ENABLE([digest],
+ [AS_HELP_STRING([--disable-digest], [disable support for HTTP digest authorization])],
+ [ENABLE_DIGEST=$enableval],
+ [ENABLE_DIGEST=yes])
+
+AS_IF([test "x$ENABLE_DIGEST" = xyes],
+ [AC_DEFINE([ENABLE_DIGEST], [1], [Define if you want the HTTP Digest Authorization compiled in.])],
+ []
+)
+
+
+dnl NTLM: Support for HTTP NTLM Authentication
+AC_ARG_ENABLE([ntlm],
+ [AS_HELP_STRING([--disable-ntlm], [disable support for NTLM authorization])],
+ [ENABLE_NTLM=$enableval],
+ [ENABLE_NTLM=auto]
+)
+
+
+dnl Debug: Support for printing debugging output
+AC_ARG_ENABLE([debug],
+ [AS_HELP_STRING([--disable-debug], [disable support for debugging output])],
+ [ENABLE_DEBUG=$enableval],
+ [ENABLE_DEBUG=yes])
+
+AS_IF([test "x$ENABLE_DEBUG" = xyes],
+ [AC_DEFINE([ENABLE_DEBUG], [1], [Define if you want the debug output support compiled in.])],
+ []
+)
+
+dnl Valgrind-tests: Should test suite be run under valgrind?
+AC_ARG_ENABLE(valgrind-tests,
+ [AS_HELP_STRING([--enable-valgrind-tests], [enable using Valgrind for tests])],
+ [ENABLE_VALGRIND=$enableval],
+ [ENABLE_VALGRIND=no])
+
+AS_IF([test "x$ENABLE_VALGRIND" != xno], [
+ AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
+ AS_IF([test "x$HAVE_VALGRIND" = xyes], [
+ if test "$gl_cc_sanitize_asan" = yes; then
+ AC_MSG_ERROR([Valgrind and Address Sanitizer are mutually exclusive])
+ elif test "$gl_cc_sanitize_msan" = yes; then
+ AC_MSG_ERROR([Valgrind and Memory Sanitizer are mutually exclusive])
+ fi
+
+ VALGRIND_TESTS="1"
+ AC_SUBST(VALGRIND_TESTS)
+ VALGRIND_INFO="Test suite will be run under Valgrind"
+ ], [
+ VALGRIND_INFO="Valgrind not found"
+ ])
+], [
+ VALGRIND_INFO="Valgrind testing not enabled"
+])
+
+AC_ARG_ENABLE(assert,
+ [AS_HELP_STRING([--enable-assert], [enable assertions in code base])],
+ [ENABLE_ASSERTION=$enableval],
+ [ENABLE_ASSERTION=no]
+)
+
+AS_IF([test "x$ENABLE_ASSERTION" != xyes], [
+ CFLAGS="-DNDEBUG $CFLAGS"
+ ],
+ [])
+
+dnl
+dnl Find the compiler
+dnl
+
+dnl We want these before the checks, so the checks can modify their values.
+test -z "$CFLAGS" && CFLAGS= auto_cflags=1
+test -z "$CC" && cc_specified=yes
+
+gl_EARLY
+
+dnl
+dnl Find python3
+dnl
+AM_PATH_PYTHON([3.0],,[:])
+AM_CONDITIONAL([HAVE_PYTHON3], [test "$PYTHON" != :])
+
+dnl
+dnl Gettext
+dnl
+AM_GNU_GETTEXT([external],[need-ngettext])
+AM_GNU_GETTEXT_VERSION([0.19.3])
+
+AC_PROG_RANLIB
+
+AC_PROG_LEX
+
+dnl Turn on optimization by default. Specifically:
+dnl
+dnl if the user hasn't specified CFLAGS, then
+dnl if compiler is gcc, then
+dnl use -O2 and some warning flags
+dnl else
+dnl use os-specific flags or -O
+dnl
+dnl For these tests, the system considers clang to be gcc
+if test -n "$auto_cflags"; then
+ if test -n "$GCC"; then
+ CFLAGS="$CFLAGS -O2 -Wall -Wextra"
+ else
+ case "$host_os" in
+ *hpux*) CFLAGS="$CFLAGS +O3" ;;
+ *ultrix* | *osf*) CFLAGS="$CFLAGS -O -Olimit 2000" ;;
+ *) CFLAGS="$CFLAGS -O" ;;
+ esac
+ fi
+fi
+
+dnl
+dnl Checks for basic compiler characteristics.
+dnl
+AC_C_CONST
+AC_C_INLINE
+AC_C_VOLATILE
+
+dnl Check for basic headers, even though we expect them to exist and
+dnl #include them unconditionally in the code. Their detection is
+dnl still needed because test programs used by Autoconf macros check.
+dnl Without the checks they will fail to be included in test programs,
+dnl which will subsequently fail.
+AC_HEADER_STDC
+
+dnl Check for large file support. This check needs to come fairly
+dnl early because it could (in principle) affect whether functions and
+dnl headers are available, whether they work, etc.
+AC_SYS_LARGEFILE
+AC_CHECK_SIZEOF(off_t)
+
+dnl
+dnl Checks for system header files that might be missing.
+dnl
+AC_HEADER_STDBOOL
+AC_CHECK_HEADERS(unistd.h sys/time.h)
+AC_CHECK_HEADERS(termios.h sys/ioctl.h sys/select.h utime.h sys/utime.h)
+AC_CHECK_HEADERS(stdint.h inttypes.h pwd.h wchar.h dlfcn.h)
+
+AC_CHECK_DECLS(h_errno,,,[#include <netdb.h>])
+
+dnl
+dnl Check sizes of integer types. These are used to find n-bit
+dnl integral types on older systems that fail to provide intN_t and
+dnl uintN_t typedefs.
+dnl
+AC_CHECK_SIZEOF([long])
+
+dnl
+dnl Checks for non-universal or system-specific types.
+dnl
+AC_TYPE_SIZE_T
+AC_TYPE_PID_T
+AC_CHECK_TYPES([uint32_t, uintptr_t, intptr_t, int64_t])
+AC_CHECK_TYPES(sig_atomic_t, [], [], [
+#include <stdio.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <signal.h>
+])
+
+# gnulib, AM_ICONV should be placed before gl_INIT
+AM_ICONV
+gl_INIT
+
+AX_CODE_COVERAGE
+
+dnl
+dnl Checks for library functions.
+dnl
+AC_FUNC_MMAP
+AC_FUNC_FSEEKO
+AC_CHECK_FUNCS(strptime timegm vsnprintf vasprintf drand48 pathconf)
+AC_CHECK_FUNCS(strtoll usleep ftello sigblock sigsetjmp memrchr wcwidth mbtowc)
+AC_CHECK_FUNCS(sleep symlink utime strlcpy random fmemopen)
+
+if test x"$ENABLE_OPIE" = xyes; then
+ AC_LIBOBJ([ftp-opie])
+fi
+
+dnl We expect to have these functions on Unix-like systems configure
+dnl runs on. The defines are provided to get them in config.h.in so
+dnl Wget can still be ported to non-Unix systems (such as Windows)
+dnl that lack some of these functions.
+AC_DEFINE([HAVE_STRDUP], 1, [Define to 1 if you have the `strdup' function.])
+AC_DEFINE([HAVE_ISATTY], 1, [Define to 1 if you have the `isatty' function.])
+
+dnl Deal with specific hosts
+case $host_os in
+ *mingw32* )
+ LIBS+=' -lws2_32'
+ AC_LIBOBJ([mswindows])
+ ;;
+esac
+
+# enable all possible compiler warnings in WARN_FLAGS
+#
+# to enable by default: create a file '.manywarnings'
+# enable explicitly : ./configure --enable-manywarnings
+# disable explicitly: ./configure --disable-manywarnings
+sanitizer_flags="$WARN_CFLAGS"
+wget_MANYWARNINGS(WARN_CFLAGS, C)
+WARN_CFLAGS="$WARN_CFLAGS $sanitizer_flags"
+
+if test -n "$WARN_CFLAGS"; then
+ if test "$CCNAME" = "gcc"; then
+ # Set up list of unwanted warnings
+ nw=
+ nw="$nw -Wsystem-headers" # System headers may trigger lot's of useless warnings
+ nw="$nw -Wvla" # This project is C99
+ nw="$nw -Wstack-protector"
+ nw="$nw -Wmissing-field-initializer"
+ nw="$nw -Wtraditional"
+ nw="$nw -Wtraditional-conversion"
+ nw="$nw -Wc++-compat"
+ nw="$nw -Wcast-qual"
+ nw="$nw -Wconversion"
+ nw="$nw -Wsign-conversion"
+ nw="$nw -Wunsuffixed-float-constants"
+ nw="$nw -Wdeclaration-after-statement" # C89 only, messing up gcc < 5
+ nw="$nw -Wcast-function-type" # gcc 8, very noisy
+ nw="$nw -Wabi" # gcc 8, very noisy
+ nw="$nw -Wunused-macros" # triggers in auto-generated lex css parser, #pragma doesn't work, conflicts with -Werror
+ nw="$nw -Wchkp" # Deprecated option
+ if test "$cross_compiling" = yes; then
+ nw="$nw -Wformat"
+ fi
+
+ # remove unwanted warn flags
+ wget_WORD_REMOVE([WARN_CFLAGS], [$WARN_CFLAGS], [$nw])
+
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-undef -Wno-float-equal"
+
+ # add more flags as you like
+ if test $GCC_VERSION -ge 5; then
+ WARN_CFLAGS="$WARN_CFLAGS -fdiagnostics-color=always"
+ fi
+ if test "$cross_compiling" = yes; then
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-format"
+ fi
+ if test $GCC_VERSION -ge 8; then
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-cast-function-type"
+ fi
+ # WARN_CFLAGS="$WARN_CFLAGS -Werror"
+
+ # We use a slightly smaller set of warning options for lib/.
+ # Remove the following and save the result in GNULIB_WARN_CFLAGS.
+ # Removing is not enough if these switches are implicitly set by other
+ # flags like -Wall or -Wextra. We have to explicitly unset them
+ # with -Wno-....
+ nw=
+ nw="$nw -Wpedantic"
+ nw="$nw -Wsign-compare"
+ nw="$nw -Wunused-parameter"
+ nw="$nw -Wswitch-default"
+ nw="$nw -Wformat-nonliteral"
+ nw="$nw -Wsuggest-attribute=pure"
+ nw="$nw -Wunsafe-loop-optimizations"
+ nw="$nw -Wundef"
+ nw="$nw -Wswitch-enum"
+ nw="$nw -Wbad-function-cast"
+ nw="$nw -Wredundant-decls"
+ nw="$nw -Werror"
+ wget_WORD_REMOVE([GNULIB_WARN_CFLAGS], [$WARN_CFLAGS], [$nw])
+ wget_WORD_REMOVE([CFLAGS], [$CFLAGS], [-Werror])
+
+ # disable options implicitly set by other options
+ GNULIB_WARN_CFLAGS="-Wno-error $GNULIB_WARN_CFLAGS"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-sign-compare -Wno-unused-parameter -Wno-alloca"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-float-conversion -Wno-cast-function-type"
+ if test "$cross_compiling" = yes; then
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-incompatible-pointer-types"
+ fi
+
+ elif test "$CCNAME" = "clang"; then
+ # setup flags for this project
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-system-headers -Wno-vla -Wno-cast-qual -Wno-padded"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-reserved-id-macro -Wno-sign-conversion -Wno-disabled-macro-expansion"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-documentation -Wno-documentation-unknown-command"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-covered-switch-default -Wno-unused-macros"
+ WARN_CFLAGS="$WARN_CFLAGS -Wno-missing-field-initializers"
+
+ # remove all flags from WARN_FLAGS that are already in CFLAGS
+ # wget_WORD_REMOVE([WARN_CFLAGS], [$WARN_CFLAGS], [$CFLAGS])
+
+ wget_WORD_REMOVE([CFLAGS], [$CFLAGS], [-Werror])
+
+ # disable verbose options
+ GNULIB_WARN_CFLAGS="-Wno-error $GNULIB_WARN_CFLAGS"
+ GNULIB_WARN_CFLAGS="$WARN_CFLAGS -Wno-sign-compare -Wno-unused-parameter -Wno-undef -Wno-format-nonliteral"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-conversion -Wno-disabled-macro-expansion -Wno-c++98-compat"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-gnu-statement-expression -Wno-shorten-64-to-32 -Wno-switch-enum"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-unused-macros -Wno-missing-field-initializers"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-gnu-zero-variadic-macro-arguments -Wno-conditional-uninitialized"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-comma -Wno-assign-enum -Wno-unreachable-code -Wno-error"
+ GNULIB_WARN_CFLAGS="$GNULIB_WARN_CFLAGS -Wno-missing-field-initializers"
+
+ # remove all flags from GNULIB_WARN_FLAGS that are already in CFLAGS
+ # wget_WORD_REMOVE([GNULIB_WARN_CFLAGS], [$GNULIB_WARN_CFLAGS], [$CFLAGS])
+ fi
+
+ AC_SUBST([WARN_CFLAGS])
+ AC_SUBST([GNULIB_WARN_CFLAGS])
+fi
+
+
+dnl
+dnl Checks for libraries.
+dnl
+
+PKG_PROG_PKG_CONFIG
+
+AS_IF([test "x$with_libpsl" != xno], [
+ PKG_CHECK_MODULES([LIBPSL], libpsl, [
+ with_libpsl=yes
+ # correct $LIBPSL_LIBS (in libpsl <= 0.6.0)
+ AS_IF([test "x$LIBPSL_LIBS" = "x-llibpsl "], [LIBPSL_LIBS="-lpsl"])
+ LIBS="$LIBPSL_LIBS $LIBS"
+ CFLAGS="$LIBPSL_CFLAGS $CFLAGS"
+ AC_DEFINE([HAVE_LIBPSL], [1], [PSL support enabled])
+ ], [
+ AC_SEARCH_LIBS(psl_builtin, psl,
+ [with_libpsl=yes; AC_DEFINE([HAVE_LIBPSL], [1], [PSL support enabled])],
+ [with_libpsl=no; AC_MSG_WARN(*** libpsl was not found. Fallback to builtin cookie checking.)])
+ ])
+])
+
+AS_IF([test x"$with_libpsl" = xyes], [
+ AC_CHECK_FUNCS(psl_latest)
+])
+
+AS_IF([test x"$with_zlib" != xno], [
+ with_zlib=yes
+ PKG_CHECK_MODULES([ZLIB], zlib, [
+ LIBS="$ZLIB_LIBS $LIBS"
+ CFLAGS="$ZLIB_CFLAGS $CFLAGS"
+ AC_DEFINE([HAVE_LIBZ], [1], [Define if using zlib.])
+ ], [
+ AC_CHECK_LIB(z, compress)
+ ])
+])
+
+AS_IF([test x"$with_ssl" = xopenssl], [
+ if [test x"$with_libssl_prefix" = x]; then
+ PKG_CHECK_MODULES([OPENSSL], [openssl], [
+ AC_MSG_NOTICE([compiling in support for SSL via OpenSSL])
+ AC_LIBOBJ([openssl])
+ LIBS="$OPENSSL_LIBS $LIBS"
+ CFLAGS="$OPENSSL_CFLAGS -DHAVE_LIBSSL $CFLAGS"
+ LIBSSL=" " # ntlm check below wants this
+ AC_CHECK_FUNCS([RAND_egd])
+ AC_DEFINE([HAVE_LIBSSL], [1], [Define if using openssl.])
+ ssl_found=yes
+ ])
+ fi
+ if [test x"$ssl_found" != xyes]; then
+ dnl As of this writing (OpenSSL 0.9.6), the libcrypto shared library
+ dnl doesn't record its dependency on libdl, so we need to make sure
+ dnl -ldl ends up in LIBS on systems that have it. Most OSes use
+ dnl dlopen(), but HP-UX uses shl_load().
+ AC_CHECK_LIB(dl, dlopen, [], [
+ AC_CHECK_LIB(dl, shl_load)
+ ])
+
+ ssl_found=no
+ case $host_os in
+ *mingw32* )
+ dnl prefer link to openssl dlls if possible. if not then fallback on static libs. if not then error
+
+ AC_CHECK_LIB(eay32, EVP_MD_CTX_init)
+ if test x"$ac_cv_lib_eay32_EVP_MD_CTX_init" != xno
+ then
+ AC_CHECK_LIB(ssl32, SSL_connect, [
+ ssl_found=yes
+ AC_MSG_NOTICE([Enabling support for SSL via OpenSSL (shared)])
+ AC_LIBOBJ([openssl])
+ LIBS="${LIBS} -lssl32"
+ AC_DEFINE([HAVE_LIBSSL32], [1], [Define to 1 if you have the `ssl32' library (-lssl32).])
+ ],
+ AC_MSG_ERROR([openssl not found: shared lib eay32 found but ssl32 not found]))
+
+ else
+ LIBS+=' -lgdi32'
+ dnl fallback and test static libs
+ fi
+ dnl add zdll lib as dep for above tests?
+ ;;
+ esac
+
+ AS_IF([test x$ssl_found != xyes], [
+ dnl Now actually check for -lssl if it wasn't already found
+ AC_LIB_HAVE_LINKFLAGS([ssl], [crypto], [
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+#include <openssl/des.h>
+#include <openssl/md4.h>
+#include <openssl/md5.h>
+ ], [SSL_library_init ()])
+ if test x"$LIBSSL" != x
+ then
+ ssl_found=yes
+ AC_MSG_NOTICE([compiling in support for SSL via OpenSSL])
+ AC_LIBOBJ([openssl])
+ LIBS="$LIBSSL $LIBS"
+ AC_CHECK_FUNCS([RAND_egd])
+ elif test x"$with_ssl" != x
+ then
+ AC_MSG_ERROR([--with-ssl=openssl was given, but SSL is not available.])
+ fi
+ ])
+ fi
+], [
+ # --with-ssl is not openssl: check if it's no
+ AS_IF([test x"$with_ssl" != xno], [
+ dnl default is -lgnutls
+ with_ssl=gnutls
+
+ dnl Now actually check for -lgnutls
+ if [test x"$with_libgnutls_prefix" = x]; then
+ PKG_CHECK_MODULES([GNUTLS], [gnutls], [
+ AC_MSG_NOTICE([compiling in support for SSL via GnuTLS])
+ AC_LIBOBJ([gnutls])
+ LIBS="$GNUTLS_LIBS $LIBS"
+ CFLAGS="$GNUTLS_CFLAGS -DHAVE_LIBGNUTLS $CFLAGS"
+ AC_DEFINE([HAVE_LIBGNUTLS], [1], [Define if using gnutls.])
+ ssl_found=yes
+ ])
+ fi
+ if [test x"$ssl_found" != xyes]; then
+ AC_LIB_HAVE_LINKFLAGS([gnutls], [], [
+#include <gnutls/gnutls.h>
+ ], [gnutls_global_init()])
+ if test x"$LIBGNUTLS" != x
+ then
+ ssl_found=yes
+ AC_MSG_NOTICE([compiling in support for SSL via GnuTLS])
+ AC_LIBOBJ([gnutls])
+ LIBS="$LIBGNUTLS $LIBS"
+ else
+ AC_MSG_ERROR([GnuTLS has not been found. Use --with-ssl=openssl if you explicitly want OpenSSL.])
+ fi
+ fi
+
+ AC_CHECK_FUNCS(gnutls_priority_set_direct)
+ ]) # endif: --with-ssl != no?
+]) # endif: --with-ssl == openssl?
+
+dnl Enable NTLM if requested and if SSL is available.
+if test x"$LIBSSL" != x || test "$ac_cv_lib_ssl32_SSL_connect" = yes
+then
+ if test x"$ENABLE_NTLM" != xno
+ then
+ ENABLE_NTLM=yes
+ AC_DEFINE([ENABLE_NTLM], 1,
+ [Define if you want the NTLM authorization support compiled in.])
+ AC_LIBOBJ([http-ntlm])
+ fi
+else
+ AC_CHECK_LIB(nettle, nettle_md4_init, [HAVE_NETTLE=yes], [HAVE_NETTLE=no; AC_MSG_WARN(*** libnettle was not found. You will not be able to use NTLM)])
+
+ if test x"$HAVE_NETTLE" = xyes
+ then
+ AC_SUBST(NETTLE_LIBS, "-lnettle")
+ AC_DEFINE([HAVE_NETTLE], [1], [Use libnettle])
+ if test x"$ENABLE_NTLM" != xno
+ then
+ ENABLE_NTLM=yes
+ AC_DEFINE([ENABLE_NTLM], 1,
+ [Define if you want the NTLM authorization support compiled in.])
+ AC_LIBOBJ([http-ntlm])
+ LIBS="$NETTLE_LIBS $LIBS"
+ fi
+ else
+ dnl If SSL is unavailable and the user explicitly requested NTLM,
+ dnl abort.
+ if test x"$ENABLE_NTLM" = xyes
+ then
+ AC_MSG_ERROR([NTLM authorization requested and SSL not enabled; aborting])
+ fi
+ fi
+fi
+
+dnl **********************************************************************
+dnl Checks for IPv6
+dnl **********************************************************************
+
+dnl
+dnl We test for IPv6 by checking, in turn, for availability of
+dnl presence of the INET6 address/protocol family and the existence of
+dnl struct sockaddr_in6. If any of them is missing, IPv6 is disabled,
+dnl and the code reverts to old-style gethostbyname.
+dnl
+dnl If --enable-ipv6 is explicitly specified on the configure command
+dnl line, we check for IPv6 and abort if not found. If --disable-ipv6
+dnl is specified, we disable IPv6 and don't check for it. The default
+dnl is to autodetect IPv6 and use it where available.
+dnl
+
+AC_ARG_ENABLE(ipv6,
+ AS_HELP_STRING([--disable-ipv6],[disable IPv6 support]),
+ [case "${enable_ipv6}" in
+ no)
+ AC_MSG_NOTICE([disabling IPv6 at user request])
+ dnl Disable IPv6 checking
+ ipv6=no
+ ;;
+ yes)
+ dnl IPv6 explicitly enabled: force its use (abort if unavailable).
+ ipv6=yes
+ force_ipv6=yes
+ ;;
+ auto)
+ dnl Auto-detect IPv6, i.e. check for IPv6, but don't force it.
+ ipv6=yes
+ ;;
+ *)
+ AC_MSG_ERROR([Invalid --enable-ipv6 argument \`$enable_ipv6'])
+ ;;
+ esac
+ ], [
+ dnl If nothing is specified, assume auto-detection.
+ ipv6=yes
+ ]
+)
+
+if test "X$ipv6" = "Xyes"; then
+ PROTO_INET6([], [
+ AC_MSG_NOTICE([Disabling IPv6 support: your system does not support the PF_INET6 protocol family])
+ ipv6=no
+ ])
+fi
+
+if test "X$ipv6" = "Xyes"; then
+ TYPE_STRUCT_SOCKADDR_IN6([],[
+ AC_MSG_NOTICE([Disabling IPv6 support: your system does not support \`struct sockaddr_in6'])
+ ipv6=no
+ ])
+ if test "X$ipv6" = "Xyes"; then
+ WGET_STRUCT_SOCKADDR_STORAGE
+ MEMBER_SIN6_SCOPE_ID
+ fi
+fi
+
+if test "X$ipv6" = "Xyes"; then
+ AC_DEFINE([ENABLE_IPV6], 1, [Define if IPv6 support is enabled.])
+ AC_MSG_NOTICE([Enabling support for IPv6.])
+elif test "x$force_ipv6" = "xyes"; then
+ AC_MSG_ERROR([IPv6 support requested but not found; aborting])
+fi
+
+dnl
+dnl Find makeinfo. We used to provide support for Emacs processing
+dnl Texinfo using `emacs -batch -eval ...' where makeinfo is
+dnl unavailable, but that broke with the addition of makeinfo-specific
+dnl command-line options, such as `-I'. Now we depend on makeinfo to
+dnl build the Info documentation.
+dnl
+
+AC_CHECK_PROGS(MAKEINFO, [makeinfo], [true])
+
+dnl
+dnl Find perl and pod2man
+dnl
+
+AC_PATH_PROGS(PERL, [perl5 perl], no)
+AC_PATH_PROG(POD2MAN, pod2man, no)
+
+if test "x${POD2MAN}" = xno; then
+ COMMENT_IF_NO_POD2MAN="# "
+else
+ COMMENT_IF_NO_POD2MAN=
+fi
+AC_SUBST(COMMENT_IF_NO_POD2MAN)
+
+
+dnl
+dnl Check for IDN/IRIs
+dnl
+
+AC_ARG_ENABLE(iri,
+ AS_HELP_STRING([--disable-iri],[disable IDN/IRIs support]),
+ [case "${enable_iri}" in
+ no)
+ dnl Disable IRIs checking
+ AC_MSG_NOTICE([disabling IRIs at user request])
+ iri=no
+ ;;
+ yes)
+ dnl IRIs explicitly enabled
+ iri=yes
+ force_iri=yes
+ ;;
+ auto)
+ dnl Auto-detect IRI
+ iri=yes
+ ;;
+ *)
+ AC_MSG_ERROR([Invalid --enable-iri argument \`$enable_iri'])
+ ;;
+ esac
+ ], [
+ dnl If nothing is specified, assume auto-detection
+ iri=yes
+ ]
+)
+
+AS_IF([test "X$iri" != "Xno"],[
+ if test "X$am_cv_func_iconv" != "Xyes"; then
+ iri=no
+ if test "X$force_iri" = "Xyes"; then
+ AC_MSG_ERROR([Libiconv is required for IRIs support])
+ else
+ AC_MSG_NOTICE([disabling IRIs because libiconv wasn't found])
+ fi
+ fi
+])
+
+AC_ARG_WITH(libidn, AS_HELP_STRING([--with-libidn=[DIR]],[Support IDN2008/IRIs (needs GNU libidn2 + libunicode)]),
+ libidn=$withval, libidn="")
+if test "X$iri" != "Xno"; then
+ AS_IF([test "x$with_libidn2" != xno], [
+ AC_SEARCH_LIBS(idn2_lookup_u8, idn2,
+ [with_libidn2=yes; AC_DEFINE([ENABLE_IRI], 1, [Define if IRI support is enabled.])],
+ [with_libidn2=no; iri=no; AC_MSG_WARN(*** LIBIDN2 was not found. You will not be able to use IDN2008 support)])
+
+# AS_IF([test "x$with_libidn2" = xyes], [
+# AC_SEARCH_LIBS(u8_tolower, unistring,
+# [AC_DEFINE([ENABLE_IRI], 1, [Define if IRI support is enabled.])],
+# [iri=no; AC_MSG_WARN(*** LIBUNISTRING was not found. You will not be able to use IDN2008 support)])
+# ])
+ ])
+fi
+
+dnl
+dnl Check for UUID
+dnl
+
+AC_ARG_WITH(libuuid, AS_HELP_STRING([--without-libuuid],[Generate UUIDs for WARC files via libuuid]))
+
+AS_IF([test "x$with_libuuid" = xyes], [
+ # libuuid was explicitly requested
+ PKG_CHECK_MODULES([UUID], uuid, [
+ LIBS="$UUID_LIBS $LIBS"
+ CFLAGS="$UUID_CFLAGS $CFLAGS"
+ uuid_mode=1
+ ], [
+ AC_SEARCH_LIBS(uuid_generate, uuid,
+ [uuid_mode=1],
+ [AC_MSG_ERROR(*** libuuid was explicitly requested but wasn't found.)])
+ ])
+], [test "x$with_libuuid" = xno], [
+ # libuuid was explicitly *not* requested
+ AC_CHECK_HEADER(uuid.h,
+ AC_CHECK_FUNC(uuid_create, [uuid_mode=2]))
+], [
+ # default:
+ AC_CHECK_HEADER(uuid.h, [
+ AC_CHECK_FUNC(uuid_create, [uuid_mode=2])
+ ], [
+ AC_CHECK_HEADER(uuid/uuid.h,
+ AC_SEARCH_LIBS(uuid_generate, uuid, [uuid_mode=1]))
+ ])
+])
+
+AS_IF([test "x$uuid_mode" = x1], [
+ AC_DEFINE([HAVE_LIBUUID], [1], [Define if using libuuid.])
+], [test "x$uuid_mode" = x2], [
+ AC_DEFINE([HAVE_UUID_CREATE], 1, [Define if uuid_create is available.])
+])
+
+dnl
+dnl Check for PCRE2 / PCRE
+dnl
+
+AC_ARG_ENABLE(pcre2, AS_HELP_STRING([--disable-pcre2],[Disable PCRE2 style regular expressions]))
+AC_ARG_ENABLE(pcre, AS_HELP_STRING([--disable-pcre],[Disable PCRE style regular expressions]))
+
+AS_IF([test "X$enable_pcre2" != "Xno"],[
+ enable_pcre2=no
+ PKG_CHECK_MODULES([PCRE2], libpcre2-8, [
+ CFLAGS="$PCRE2_CFLAGS $CFLAGS"
+ LIBS="$PCRE2_LIBS $LIBS"
+ AC_DEFINE([HAVE_LIBPCRE2], [1], [Define if libpcre2 is available.])
+ enable_pcre2=yes
+ ], [
+ AC_CHECK_HEADER(pcre2.h, [
+ AC_CHECK_LIB(pcre2-8, pcre2_compile_8, [
+ LIBS="${LIBS} -lpcre2-8"
+ AC_DEFINE([HAVE_LIBPCRE2], 1, [Define if libpcre2 is available.])
+ enable_pcre2=yes
+ ])
+ ])
+ ])
+])
+
+AS_IF([test "X$enable_pcre" != "Xno" && test "X$enable_pcre2" != "Xyes"],[
+ PKG_CHECK_MODULES([PCRE], libpcre, [
+ CFLAGS="$PCRE_CFLAGS $CFLAGS"
+ AC_CHECK_HEADER(pcre.h, [
+ LIBS="$PCRE_LIBS $LIBS"
+ AC_DEFINE([HAVE_LIBPCRE], [1], [Define if libpcre is available.])
+ enable_pcre=yes
+ ])
+ ], [
+ AC_CHECK_HEADER(pcre.h, [
+ AC_CHECK_LIB(pcre, pcre_compile, [
+ LIBS="${LIBS} -lpcre"
+ AC_DEFINE([HAVE_LIBPCRE], 1, [Define if libpcre is available.])
+ ])
+ ])
+ ])
+])
+
+AS_IF([test "X$enable_pcre2" = Xyes], [PCRE_INFO="yes, via libpcre2"], [test "X$enable_pcre" = Xyes], [PCRE_INFO="yes, via libpcre"], [PCRE_INFO=no])
+
+dnl
+dnl Check for libcares (resolver library)
+dnl
+
+AS_IF([test "X$with_cares" = "Xyes"],[
+ PKG_CHECK_MODULES([CARES], libcares, [
+ CFLAGS="$CARES_CFLAGS $CFLAGS"
+ AC_CHECK_HEADER(ares.h, [
+ LIBS="$CARES_LIBS $LIBS"
+ AC_DEFINE([HAVE_LIBCARES], [1], [Define if libcares is available.])
+ RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
+ ])
+ ], [
+ AC_CHECK_HEADER(ares.h, [
+ AC_CHECK_LIB(cares, ares_set_local_ip4, [
+ LIBS="-lcares ${LIBS}"
+ AC_DEFINE([HAVE_LIBCARES], 1, [Define if libcares is available.])
+ RESOLVER_INFO="libcares, --bind-dns-address and --dns-servers available"
+ ])
+ ])
+ ])
+], [
+ RESOLVER_INFO="libc, --bind-dns-address and --dns-servers not available"
+])
+
+dnl
+dnl Check for libmetalink
+dnl
+AS_IF([test x"$with_metalink" != xno], [
+ PKG_CHECK_MODULES([METALINK], libmetalink, [
+ LIBS="$METALINK_LIBS $LIBS"
+ CFLAGS="$METALINK_CFLAGS $CFLAGS"
+ AC_DEFINE([HAVE_METALINK], [1], [Define if using metalink.])
+ with_metalink=yes
+ ], [
+ with_metalink=no
+ ])
+
+ have_gpg=no
+ AS_IF([test x"$with_metalink" = xyes], [
+ dnl
+ dnl Check for GPGME
+ dnl
+ m4_ifdef([AM_PATH_GPGME], [
+ AM_PATH_GPGME([], [
+ # Put libgpgme to the end of the library list since it introduces a -L linker flags.
+ # That -L might break the build if there are two different version of
+ # a library (e.g. GnuTLS) in /usr/local and in the system directory.
+ LIBS="$LIBS $GPGME_LIBS"
+ CFLAGS="$GPGME_CFLAGS $CFLAGS"
+ AC_DEFINE([HAVE_GPGME], [1], [Define if GPGME is available.])
+ have_gpg=yes
+ ])
+ ])
+ ])
+])
+
+dnl
+dnl Extended Attribute support
+dnl
+
+AC_ARG_ENABLE([xattr],
+ [AS_HELP_STRING([--disable-xattr], [disable support for POSIX Extended Attributes])],
+ [ENABLE_XATTR=$enableval],
+ [ENABLE_XATTR=yes])
+
+case "$host_os" in
+ *linux* | *darwin*) xattr_syscalls="fsetxattr" ;;
+ freebsd*) xattr_syscalls="extattr_set_fd" ;;
+ *) AC_MSG_NOTICE([Disabling Extended Attribute support: your system is not known to support extended attributes.])
+ ENABLE_XATTR=no
+esac
+
+if test "X${ENABLE_XATTR}" = "Xyes"; then
+ AC_CHECK_FUNCS([$xattr_syscalls], [], [
+ AC_MSG_NOTICE([Disabling Extended Attribute support: your system does not support $xattr_syscalls])
+ ENABLE_XATTR=no
+ ])
+fi
+
+test "X${ENABLE_XATTR}" = "Xyes" && AC_DEFINE([ENABLE_XATTR], 1,
+ [Define if you want file meta-data storing into POSIX Extended Attributes compiled in.])
+
+dnl Needed by src/Makefile.am
+AM_CONDITIONAL([IRI_IS_ENABLED], [test "X$iri" != "Xno"])
+AM_CONDITIONAL([WITH_SSL], [test "X$with_ssl" != "Xno"])
+AM_CONDITIONAL([METALINK_IS_ENABLED], [test "X$with_metalink" != "Xno"])
+AM_CONDITIONAL([WITH_XATTR], [test "X$ENABLE_XATTR" != "Xno"])
+AM_CONDITIONAL([WITH_NTLM], [test "X$ENABLE_NTLM" == "Xyes"])
+
+dnl
+dnl Create output
+dnl
+AC_CONFIG_FILES([Makefile src/Makefile doc/Makefile util/Makefile
+ po/Makefile.in gnulib_po/Makefile.in tests/Makefile
+ fuzz/Makefile lib/Makefile testenv/Makefile
+ tests/certs/interca.conf tests/certs/rootca.conf])
+AC_CONFIG_HEADERS([src/config.h])
+AC_OUTPUT
+
+AC_MSG_NOTICE([Summary of build options:
+
+ Version: $PACKAGE_VERSION
+ Host OS: $host_os
+ Install prefix: $prefix
+ Compiler: $CC
+ CFlags: $CFLAGS $CPPFLAGS $WARN_CFLAGS
+ LDFlags: $LDFLAGS
+ Libs: $LIBS
+ SSL: $with_ssl
+ Zlib: $with_zlib
+ PSL: $with_libpsl
+ PCRE: $PCRE_INFO
+ Digest: $ENABLE_DIGEST
+ NTLM: $ENABLE_NTLM
+ OPIE: $ENABLE_OPIE
+ POSIX xattr: $ENABLE_XATTR
+ Debugging: $ENABLE_DEBUG
+ Assertions: $ENABLE_ASSERTION
+ Valgrind: $VALGRIND_INFO
+ Metalink: $with_metalink
+ Resolver: $RESOLVER_INFO
+ GPGME: $have_gpg
+ IRI: $iri
+ Fuzzing build: $enable_fuzzing, $LIB_FUZZING_ENGINE
+])
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..678d01a
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,119 @@
+# Makefile for `wget' utility
+# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2020 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# Version: @VERSION@
+#
+
+# Program to convert DVI files to PostScript
+DVIPS = dvips -D 300
+# Program to convert texinfo files to html
+TEXI2HTML = texi2html -expandinfo -split_chapter
+
+manext = 1
+RM = rm -f
+
+TEXI2POD = $(srcdir)/texi2pod.pl
+POD2MAN = @POD2MAN@
+MAN = wget.$(manext)
+WGETRC = $(sysconfdir)/wgetrc
+SAMPLERCTEXI = sample.wgetrc.munged_for_texi_inclusion
+
+#
+# Dependencies for building
+#
+
+man_MANS = $(MAN)
+
+all: wget.info @COMMENT_IF_NO_POD2MAN@$(MAN)
+
+everything: all wget_us.ps wget_a4.ps wget_toc.html
+
+$(SAMPLERCTEXI): $(srcdir)/sample.wgetrc
+ sed s/@/@@/g $? > $@
+
+info_TEXINFOS = wget.texi
+wget_TEXINFOS = fdl.texi sample.wgetrc.munged_for_texi_inclusion
+
+EXTRA_DIST = sample.wgetrc \
+ $(SAMPLERCTEXI) \
+ texi2pod.pl
+
+wget.pod: $(srcdir)/wget.texi version.texi
+ $(TEXI2POD) -D VERSION="$(VERSION)" $(srcdir)/wget.texi $@
+
+$(MAN): wget.pod
+ $(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" --utf8 $? > $@ || \
+ $(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" $? > $@
+
+#wget.cat: $(MAN)
+# nroff -man $? > $@
+
+wget_us.ps: wget.dvi
+ $(DVIPS) -t letter -o $@ wget.dvi
+
+wget_a4.ps: wget.dvi
+ $(DVIPS) -t a4 -o $@ wget.dvi
+
+wget_toc.html: $(srcdir)/wget.texi
+ $(TEXI2HTML) $(srcdir)/wget.texi
+
+#
+# Dependencies for installing
+#
+
+# install all the documentation
+install-data-local: install.wgetrc @COMMENT_IF_NO_POD2MAN@install.man
+
+# uninstall all the documentation
+uninstall-local: @COMMENT_IF_NO_POD2MAN@uninstall.man
+
+
+# install man page, creating install directory if necessary
+install.man: $(MAN)
+ $(mkinstalldirs) $(DESTDIR)$(mandir)/man$(manext)
+ $(INSTALL_DATA) $(MAN) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
+
+# install sample.wgetrc
+install.wgetrc: $(srcdir)/sample.wgetrc
+ $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
+ @if test -f $(DESTDIR)$(WGETRC); then \
+ if cmp -s $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); then echo ""; \
+ else \
+ echo ' $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new'; \
+ $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new; \
+ echo; \
+ echo "WARNING: Differing \`$(DESTDIR)$(WGETRC)'"; \
+ echo " exists and has been spared. You might want to"; \
+ echo " consider merging in the new lines from"; \
+ echo " \`$(DESTDIR)$(WGETRC).new'."; \
+ echo; \
+ fi; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); \
+ fi
+
+# uninstall man page
+uninstall.man:
+ $(RM) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
+
+#
+# Dependencies for cleanup
+#
+
+CLEANFILES = *~ *.bak *.cat *.pod
+DISTCLEANFILES = $(MAN)
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..061b3e2
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,2147 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `wget' utility
+# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2020 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#
+# Version: @VERSION@
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/version.texi \
+ $(srcdir)/stamp-vti $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/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)/wget.info
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
+DVIS = wget.dvi
+PDFS = wget.pdf
+PSS = wget.ps
+HTMLS = wget.html
+TEXINFOS = wget.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+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)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/build-aux/mdate-sh \
+ $(top_srcdir)/build-aux/texinfo.tex $(wget_TEXINFOS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+
+# Program to convert DVI files to PostScript
+DVIPS = dvips -D 300
+# Program to convert texinfo files to html
+TEXI2HTML = texi2html -expandinfo -split_chapter
+manext = 1
+RM = rm -f
+TEXI2POD = $(srcdir)/texi2pod.pl
+MAN = wget.$(manext)
+WGETRC = $(sysconfdir)/wgetrc
+SAMPLERCTEXI = sample.wgetrc.munged_for_texi_inclusion
+
+#
+# Dependencies for building
+#
+man_MANS = $(MAN)
+info_TEXINFOS = wget.texi
+wget_TEXINFOS = fdl.texi sample.wgetrc.munged_for_texi_inclusion
+EXTRA_DIST = sample.wgetrc \
+ $(SAMPLERCTEXI) \
+ texi2pod.pl
+
+
+#
+# Dependencies for cleanup
+#
+CLEANFILES = *~ *.bak *.cat *.pod
+DISTCLEANFILES = $(MAN)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu doc/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+.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)/wget.info: wget.texi $(srcdir)/version.texi $(wget_TEXINFOS)
+wget.dvi: wget.texi $(srcdir)/version.texi $(wget_TEXINFOS)
+wget.pdf: wget.texi $(srcdir)/version.texi $(wget_TEXINFOS)
+wget.html: wget.texi $(srcdir)/version.texi $(wget_TEXINFOS)
+$(srcdir)/version.texi: $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: wget.texi $(top_srcdir)/configure
+ @(dir=.; test -f ./wget.texi || dir=$(srcdir); \
+ set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/wget.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.tmp$$$$ && \
+ mv $(srcdir)/version.texi.tmp$$$$ $(srcdir)/version.texi)) && \
+ rm -f vti.tmp$$$$ $(srcdir)/version.texi.$$$$
+ @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+ -rm -f vti.tmp* $(srcdir)/version.texi.tmp*
+
+maintainer-clean-vti:
+ -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 wget.t2d wget.t2p
+
+clean-aminfo:
+ -test -z "wget.dvi wget.pdf wget.ps wget.html" \
+ || rm -rf wget.dvi wget.pdf wget.ps wget.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
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(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)
+installdirs:
+ for dir in "$(DESTDIR)$(infodir)"; 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 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-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-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-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-pdf-am uninstall-ps-am
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
+ cscopelist-am ctags-am dist-info distclean distclean-generic \
+ 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-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-vti pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am \
+ uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-local uninstall-pdf-am uninstall-ps-am
+
+.PRECIOUS: Makefile
+
+
+all: wget.info @COMMENT_IF_NO_POD2MAN@$(MAN)
+
+everything: all wget_us.ps wget_a4.ps wget_toc.html
+
+$(SAMPLERCTEXI): $(srcdir)/sample.wgetrc
+ sed s/@/@@/g $? > $@
+
+wget.pod: $(srcdir)/wget.texi version.texi
+ $(TEXI2POD) -D VERSION="$(VERSION)" $(srcdir)/wget.texi $@
+
+$(MAN): wget.pod
+ $(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" --utf8 $? > $@ || \
+ $(POD2MAN) --center="GNU Wget" --release="GNU Wget @VERSION@" $? > $@
+
+#wget.cat: $(MAN)
+# nroff -man $? > $@
+
+wget_us.ps: wget.dvi
+ $(DVIPS) -t letter -o $@ wget.dvi
+
+wget_a4.ps: wget.dvi
+ $(DVIPS) -t a4 -o $@ wget.dvi
+
+wget_toc.html: $(srcdir)/wget.texi
+ $(TEXI2HTML) $(srcdir)/wget.texi
+
+#
+# Dependencies for installing
+#
+
+# install all the documentation
+install-data-local: install.wgetrc @COMMENT_IF_NO_POD2MAN@install.man
+
+# uninstall all the documentation
+uninstall-local: @COMMENT_IF_NO_POD2MAN@uninstall.man
+
+# install man page, creating install directory if necessary
+install.man: $(MAN)
+ $(mkinstalldirs) $(DESTDIR)$(mandir)/man$(manext)
+ $(INSTALL_DATA) $(MAN) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
+
+# install sample.wgetrc
+install.wgetrc: $(srcdir)/sample.wgetrc
+ $(mkinstalldirs) $(DESTDIR)$(sysconfdir)
+ @if test -f $(DESTDIR)$(WGETRC); then \
+ if cmp -s $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); then echo ""; \
+ else \
+ echo ' $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new'; \
+ $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC).new; \
+ echo; \
+ echo "WARNING: Differing \`$(DESTDIR)$(WGETRC)'"; \
+ echo " exists and has been spared. You might want to"; \
+ echo " consider merging in the new lines from"; \
+ echo " \`$(DESTDIR)$(WGETRC).new'."; \
+ echo; \
+ fi; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/sample.wgetrc $(DESTDIR)$(WGETRC); \
+ fi
+
+# uninstall man page
+uninstall.man:
+ $(RM) $(DESTDIR)$(mandir)/man$(manext)/$(MAN)
+
+# 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/fdl.texi b/doc/fdl.texi
new file mode 100644
index 0000000..93db1ab
--- /dev/null
+++ b/doc/fdl.texi
@@ -0,0 +1,506 @@
+@c The GNU Free Documentation License.
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000-2002, 2007-2008, 2015, 2018-2020 Free
+Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject. (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, La@TeX{} input
+format, SGML or XML using a publicly available
+DTD, and standard-conforming simple HTML,
+PostScript or PDF designed for human modification. Examples
+of transparent image formats include PNG, XCF and
+JPG@. Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, SGML or
+XML for which the DTD and/or processing tools are
+not generally available, and the machine-generated HTML,
+PostScript or PDF produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document). You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page. If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on. These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles. Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''. Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation. If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works. A
+public wiki that anybody can edit is an example of such a server. A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@page
+@heading ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+ Copyright (C) @var{year} @var{your name}.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.''@: line with this:
+
+@smallexample
+@group
+ with the Invariant Sections being @var{list their titles}, with
+ the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+ being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
diff --git a/doc/sample.wgetrc b/doc/sample.wgetrc
new file mode 100644
index 0000000..c0d0779
--- /dev/null
+++ b/doc/sample.wgetrc
@@ -0,0 +1,137 @@
+###
+### Sample Wget initialization file .wgetrc
+###
+
+## You can use this file to change the default behaviour of wget or to
+## avoid having to type many many command-line options. This file does
+## not contain a comprehensive list of commands -- look at the manual
+## to find out what you can put into this file. You can find this here:
+## $ info wget.info 'Startup File'
+## Or online here:
+## https://www.gnu.org/software/wget/manual/wget.html#Startup-File
+##
+## Wget initialization file can reside in /usr/local/etc/wgetrc
+## (global, for all users) or $HOME/.wgetrc (for a single user).
+##
+## To use the settings in this file, you will have to uncomment them,
+## as well as change them, in most cases, as the values on the
+## commented-out lines are the default values (e.g. "off").
+##
+## Command are case-, underscore- and minus-insensitive.
+## For example ftp_proxy, ftp-proxy and ftpproxy are the same.
+
+
+##
+## Global settings (useful for setting up in /usr/local/etc/wgetrc).
+## Think well before you change them, since they may reduce wget's
+## functionality, and make it behave contrary to the documentation:
+##
+
+# You can set retrieve quota for beginners by specifying a value
+# optionally followed by 'K' (kilobytes) or 'M' (megabytes). The
+# default quota is unlimited.
+#quota = inf
+
+# You can lower (or raise) the default number of retries when
+# downloading a file (default is 20).
+#tries = 20
+
+# Lowering the maximum depth of the recursive retrieval is handy to
+# prevent newbies from going too "deep" when they unwittingly start
+# the recursive retrieval. The default is 5.
+#reclevel = 5
+
+# By default Wget uses "passive FTP" transfer where the client
+# initiates the data connection to the server rather than the other
+# way around. That is required on systems behind NAT where the client
+# computer cannot be easily reached from the Internet. However, some
+# firewalls software explicitly supports active FTP and in fact has
+# problems supporting passive transfer. If you are in such
+# environment, use "passive_ftp = off" to revert to active FTP.
+#passive_ftp = off
+
+# The "wait" command below makes Wget wait between every connection.
+# If, instead, you want Wget to wait only between retries of failed
+# downloads, set waitretry to maximum number of seconds to wait (Wget
+# will use "linear backoff", waiting 1 second after the first failure
+# on a file, 2 seconds after the second failure, etc. up to this max).
+#waitretry = 10
+
+
+##
+## Local settings (for a user to set in his $HOME/.wgetrc). It is
+## *highly* undesirable to put these settings in the global file, since
+## they are potentially dangerous to "normal" users.
+##
+## Even when setting up your own ~/.wgetrc, you should know what you
+## are doing before doing so.
+##
+
+# Set this to on to use timestamping by default:
+#timestamping = off
+
+# It is a good idea to make Wget send your email address in a `From:'
+# header with your request (so that server administrators can contact
+# you in case of errors). Wget does *not* send `From:' by default.
+#header = From: Your Name <username@site.domain>
+
+# You can set up other headers, like Accept-Language. Accept-Language
+# is *not* sent by default.
+#header = Accept-Language: en
+
+# You can set the default proxies for Wget to use for http, https, and ftp.
+# They will override the value in the environment.
+#https_proxy = http://proxy.yoyodyne.com:18023/
+#http_proxy = http://proxy.yoyodyne.com:18023/
+#ftp_proxy = http://proxy.yoyodyne.com:18023/
+
+# If you do not want to use proxy at all, set this to off.
+#use_proxy = on
+
+# You can customize the retrieval outlook. Valid options are default,
+# binary, mega and micro.
+#dot_style = default
+
+# Setting this to off makes Wget not download /robots.txt. Be sure to
+# know *exactly* what /robots.txt is and how it is used before changing
+# the default!
+#robots = on
+
+# It can be useful to make Wget wait between connections. Set this to
+# the number of seconds you want Wget to wait.
+#wait = 0
+
+# You can force creating directory structure, even if a single is being
+# retrieved, by setting this to on.
+#dirstruct = off
+
+# You can turn on recursive retrieving by default (don't do this if
+# you are not sure you know what it means) by setting this to on.
+#recursive = off
+
+# To always back up file X as X.orig before converting its links (due
+# to -k / --convert-links / convert_links = on having been specified),
+# set this variable to on:
+#backup_converted = off
+
+# To have Wget follow FTP links from HTML files by default, set this
+# to on:
+#follow_ftp = off
+
+# To try ipv6 addresses first:
+#prefer-family = IPv6
+
+# Set default IRI support state
+#iri = off
+
+# Force the default system encoding
+#localencoding = UTF-8
+
+# Force the default remote server encoding
+#remoteencoding = UTF-8
+
+# Turn on to prevent following non-HTTPS links when in recursive mode
+#httpsonly = off
+
+# Tune HTTPS security (auto, SSLv2, SSLv3, TLSv1, PFS)
+#secureprotocol = auto
diff --git a/doc/sample.wgetrc.munged_for_texi_inclusion b/doc/sample.wgetrc.munged_for_texi_inclusion
new file mode 100644
index 0000000..3c7f2f4
--- /dev/null
+++ b/doc/sample.wgetrc.munged_for_texi_inclusion
@@ -0,0 +1,137 @@
+###
+### Sample Wget initialization file .wgetrc
+###
+
+## You can use this file to change the default behaviour of wget or to
+## avoid having to type many many command-line options. This file does
+## not contain a comprehensive list of commands -- look at the manual
+## to find out what you can put into this file. You can find this here:
+## $ info wget.info 'Startup File'
+## Or online here:
+## https://www.gnu.org/software/wget/manual/wget.html#Startup-File
+##
+## Wget initialization file can reside in /usr/local/etc/wgetrc
+## (global, for all users) or $HOME/.wgetrc (for a single user).
+##
+## To use the settings in this file, you will have to uncomment them,
+## as well as change them, in most cases, as the values on the
+## commented-out lines are the default values (e.g. "off").
+##
+## Command are case-, underscore- and minus-insensitive.
+## For example ftp_proxy, ftp-proxy and ftpproxy are the same.
+
+
+##
+## Global settings (useful for setting up in /usr/local/etc/wgetrc).
+## Think well before you change them, since they may reduce wget's
+## functionality, and make it behave contrary to the documentation:
+##
+
+# You can set retrieve quota for beginners by specifying a value
+# optionally followed by 'K' (kilobytes) or 'M' (megabytes). The
+# default quota is unlimited.
+#quota = inf
+
+# You can lower (or raise) the default number of retries when
+# downloading a file (default is 20).
+#tries = 20
+
+# Lowering the maximum depth of the recursive retrieval is handy to
+# prevent newbies from going too "deep" when they unwittingly start
+# the recursive retrieval. The default is 5.
+#reclevel = 5
+
+# By default Wget uses "passive FTP" transfer where the client
+# initiates the data connection to the server rather than the other
+# way around. That is required on systems behind NAT where the client
+# computer cannot be easily reached from the Internet. However, some
+# firewalls software explicitly supports active FTP and in fact has
+# problems supporting passive transfer. If you are in such
+# environment, use "passive_ftp = off" to revert to active FTP.
+#passive_ftp = off
+
+# The "wait" command below makes Wget wait between every connection.
+# If, instead, you want Wget to wait only between retries of failed
+# downloads, set waitretry to maximum number of seconds to wait (Wget
+# will use "linear backoff", waiting 1 second after the first failure
+# on a file, 2 seconds after the second failure, etc. up to this max).
+#waitretry = 10
+
+
+##
+## Local settings (for a user to set in his $HOME/.wgetrc). It is
+## *highly* undesirable to put these settings in the global file, since
+## they are potentially dangerous to "normal" users.
+##
+## Even when setting up your own ~/.wgetrc, you should know what you
+## are doing before doing so.
+##
+
+# Set this to on to use timestamping by default:
+#timestamping = off
+
+# It is a good idea to make Wget send your email address in a `From:'
+# header with your request (so that server administrators can contact
+# you in case of errors). Wget does *not* send `From:' by default.
+#header = From: Your Name <username@@site.domain>
+
+# You can set up other headers, like Accept-Language. Accept-Language
+# is *not* sent by default.
+#header = Accept-Language: en
+
+# You can set the default proxies for Wget to use for http, https, and ftp.
+# They will override the value in the environment.
+#https_proxy = http://proxy.yoyodyne.com:18023/
+#http_proxy = http://proxy.yoyodyne.com:18023/
+#ftp_proxy = http://proxy.yoyodyne.com:18023/
+
+# If you do not want to use proxy at all, set this to off.
+#use_proxy = on
+
+# You can customize the retrieval outlook. Valid options are default,
+# binary, mega and micro.
+#dot_style = default
+
+# Setting this to off makes Wget not download /robots.txt. Be sure to
+# know *exactly* what /robots.txt is and how it is used before changing
+# the default!
+#robots = on
+
+# It can be useful to make Wget wait between connections. Set this to
+# the number of seconds you want Wget to wait.
+#wait = 0
+
+# You can force creating directory structure, even if a single is being
+# retrieved, by setting this to on.
+#dirstruct = off
+
+# You can turn on recursive retrieving by default (don't do this if
+# you are not sure you know what it means) by setting this to on.
+#recursive = off
+
+# To always back up file X as X.orig before converting its links (due
+# to -k / --convert-links / convert_links = on having been specified),
+# set this variable to on:
+#backup_converted = off
+
+# To have Wget follow FTP links from HTML files by default, set this
+# to on:
+#follow_ftp = off
+
+# To try ipv6 addresses first:
+#prefer-family = IPv6
+
+# Set default IRI support state
+#iri = off
+
+# Force the default system encoding
+#localencoding = UTF-8
+
+# Force the default remote server encoding
+#remoteencoding = UTF-8
+
+# Turn on to prevent following non-HTTPS links when in recursive mode
+#httpsonly = off
+
+# Tune HTTPS security (auto, SSLv2, SSLv3, TLSv1, PFS)
+#secureprotocol = auto
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644
index 0000000..6705e02
--- /dev/null
+++ b/doc/stamp-vti
@@ -0,0 +1,4 @@
+@set UPDATED 7 September 2020
+@set UPDATED-MONTH September 2020
+@set EDITION 1.21
+@set VERSION 1.21
diff --git a/doc/texi2pod.pl b/doc/texi2pod.pl
new file mode 100755
index 0000000..02f0352
--- /dev/null
+++ b/doc/texi2pod.pl
@@ -0,0 +1,453 @@
+#! /usr/bin/env perl
+
+# Copyright (C) 1999-2001, 2003, 2007, 2009-2011, 2015, 2018-2020 Free
+# Software Foundation, Inc.
+
+# This file is part of GCC.
+
+# GCC 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.
+
+# GCC is distributed in the hope that 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 GCC. If not, see <http://www.gnu.org/licenses/>.
+
+# This does trivial (and I mean _trivial_) conversion of Texinfo
+# markup to Perl POD format. It's intended to be used to extract
+# something suitable for a manpage from a Texinfo document.
+
+use warnings;
+BEGIN { eval { require warnings; } and warnings->import; }
+
+$output = 0;
+$skipping = 0;
+%sects = ();
+$section = "";
+@icstack = ();
+@endwstack = ();
+@skstack = ();
+@instack = ();
+$shift = "";
+%defs = ();
+$fnno = 1;
+$inf = "";
+$ibase = "";
+
+while ($_ = shift) {
+ if (/^-D(.*)$/) {
+ if ($1 ne "") {
+ $flag = $1;
+ } else {
+ $flag = shift;
+ }
+ $value = "";
+ ($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);
+ die "no flag specified for -D\n"
+ unless $flag ne "";
+ die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
+ unless $flag =~ /^[a-zA-Z0-9_-]+$/;
+ $defs{$flag} = $value;
+ } elsif (/^-/) {
+ usage();
+ } else {
+ $in = $_, next unless defined $in;
+ $out = $_, next unless defined $out;
+ usage();
+ }
+}
+
+if (defined $in) {
+ $inf = gensym();
+ open($inf, "<$in") or die "opening \"$in\": $!\n";
+ $ibase = $1 if $in =~ m|^(.+)/[^/]+$|;
+} else {
+ $inf = \*STDIN;
+}
+
+if (defined $out) {
+ open(STDOUT, ">$out") or die "opening \"$out\": $!\n";
+}
+
+while(defined $inf) {
+while(<$inf>) {
+ # Certain commands are discarded without further processing.
+ /^\@(?:
+ [a-z]+index # @*index: useful only in complete manual
+ |need # @need: useful only in printed manual
+ |(?:end\s+)?group # @group .. @end group: ditto
+ |page # @page: ditto
+ |node # @node: useful only in .info file
+ |(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents
+ )\b/x and next;
+
+ chomp;
+
+ # Look for filename and title markers.
+ /^\@setfilename\s+([^.]+)/ and $fn = $1, next;
+ /^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next;
+
+ # Identify a man title but keep only the one we are interested in.
+ /^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do {
+ if (exists $defs{$1}) {
+ $fn = $1;
+ $tl = postprocess($2);
+ }
+ next;
+ };
+
+ # Look for blocks surrounded by @c man begin SECTION ... @c man end.
+ # This really oughta be @ifman ... @end ifman and the like, but such
+ # would require rev'ing all other Texinfo translators.
+ /^\@c\s+man\s+begin\s+([A-Z]+)\s+([A-Za-z0-9-]+)/ and do {
+ $output = 1 if exists $defs{$2};
+ $sect = $1;
+ next;
+ };
+ /^\@c\s+man\s+begin\s+([A-Z]+)/ and $sect = $1, $output = 1, next;
+ /^\@c\s+man\s+end/ and do {
+ $sects{$sect} = "" unless exists $sects{$sect};
+ $sects{$sect} .= postprocess($section);
+ $section = "";
+ $output = 0;
+ next;
+ };
+
+ # handle variables
+ /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do {
+ $defs{$1} = $2;
+ next;
+ };
+ /^\@clear\s+([a-zA-Z0-9_-]+)/ and do {
+ delete $defs{$1};
+ next;
+ };
+
+ next unless $output;
+
+ # Discard comments. (Can't do it above, because then we'd never see
+ # @c man lines.)
+ /^\@c\b/ and next;
+
+ # End-block handler goes up here because it needs to operate even
+ # if we are skipping.
+ /^\@end\s+([a-z]+)/ and do {
+ # Ignore @end foo, where foo is not an operation which may
+ # cause us to skip, if we are presently skipping.
+ my $ended = $1;
+ next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|copying)$/;
+
+ die "\@end $ended without \@$ended at line $.\n" unless defined $endw;
+ die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw;
+
+ $endw = pop @endwstack;
+
+ if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex)$/) {
+ $skipping = pop @skstack;
+ next;
+ } elsif ($ended =~ /^(?:example|smallexample|display)$/) {
+ $shift = "";
+ $_ = ""; # need a paragraph break
+ } elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {
+ $_ = "\n=back\n";
+ $ic = pop @icstack;
+ } else {
+ die "unknown command \@end $ended at line $.\n";
+ }
+ };
+
+ # We must handle commands which can cause skipping even while we
+ # are skipping, otherwise we will not process nested conditionals
+ # correctly.
+ /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do {
+ push @endwstack, $endw;
+ push @skstack, $skipping;
+ $endw = "ifset";
+ $skipping = 1 unless exists $defs{$1};
+ next;
+ };
+
+ /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do {
+ push @endwstack, $endw;
+ push @skstack, $skipping;
+ $endw = "ifclear";
+ $skipping = 1 if exists $defs{$1};
+ next;
+ };
+
+ /^\@(ignore|menu|iftex|copying)\b/ and do {
+ push @endwstack, $endw;
+ push @skstack, $skipping;
+ $endw = $1;
+ $skipping = 1;
+ next;
+ };
+
+ next if $skipping;
+
+ # Character entities. First the ones that can be replaced by raw text
+ # or discarded outright:
+ s/\@copyright\{\}/(c)/g;
+ s/\@dots\{\}/.../g;
+ s/\@enddots\{\}/..../g;
+ s/\@([.!? ])/$1/g;
+ s/\@[:-]//g;
+ s/\@bullet(?:\{\})?/*/g;
+ s/\@TeX\{\}/TeX/g;
+ s/\@pounds\{\}/\#/g;
+ s/\@minus(?:\{\})?/-/g;
+ s/\\,/,/g;
+
+ # Now the ones that have to be replaced by special escapes
+ # (which will be turned back into text by unmunge())
+ s/&/&amp;/g;
+ s/\@\@/&at;/g;
+ s/\@\{/&lbrace;/g;
+ s/\@\}/&rbrace;/g;
+
+ # Inside a verbatim block, handle @var specially.
+ if ($shift ne "") {
+ s/\@var\{([^\}]*)\}/<$1>/g;
+ }
+
+ # POD doesn't interpret E<> inside a verbatim block.
+ if ($shift eq "") {
+ s/</&lt;/g;
+ s/>/&gt;/g;
+ } else {
+ s/</&LT;/g;
+ s/>/&GT;/g;
+ }
+
+ # Single line command handlers.
+
+ /^\@include\s+(.+)$/ and do {
+ push @instack, $inf;
+ $inf = gensym();
+ $file = postprocess($1);
+
+ # Try cwd and $ibase.
+ open($inf, "<" . $file)
+ or open($inf, "<" . $ibase . "/" . $file)
+ or die "cannot open $file or $ibase/$file: $!\n";
+ next;
+ };
+
+ /^\@(?:section|unnumbered|unnumberedsec|center)\s+(.+)$/
+ and $_ = "\n=head2 $1\n";
+ /^\@subsection\s+(.+)$/
+ and $_ = "\n=head3 $1\n";
+
+ # Block command handlers:
+ /^\@itemize(?:\s+(\@[a-z]+|\*|-))?/ and do {
+ push @endwstack, $endw;
+ push @icstack, $ic;
+ if (defined $1) {
+ $ic = $1;
+ } else {
+ $ic = '@bullet';
+ }
+ $_ = "\n=over 4\n";
+ $endw = "itemize";
+ };
+
+ /^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do {
+ push @endwstack, $endw;
+ push @icstack, $ic;
+ if (defined $1) {
+ $ic = $1 . ".";
+ } else {
+ $ic = "1.";
+ }
+ $_ = "\n=over 4\n";
+ $endw = "enumerate";
+ };
+
+ /^\@([fv]?table)\s+(\@[a-z]+)/ and do {
+ push @endwstack, $endw;
+ push @icstack, $ic;
+ $endw = $1;
+ $ic = $2;
+ $ic =~ s/\@(?:samp|strong|key|gcctabopt|env)/B/;
+ $ic =~ s/\@(?:code|kbd)/C/;
+ $ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
+ $ic =~ s/\@(?:file)/F/;
+ $_ = "\n=over 4\n";
+ };
+
+ /^\@((?:small)?example|display)/ and do {
+ push @endwstack, $endw;
+ $endw = $1;
+ $shift = "\t";
+ $_ = ""; # need a paragraph break
+ };
+
+ /^\@itemx?\s*(.+)?$/ and do {
+ if (defined $1) {
+ my $thing = $1;
+ if ($ic =~ /\@asis/) {
+ $_ = "\n=item C<$thing>\n";
+ } else {
+ # Entity escapes prevent munging by the <> processing below.
+ $_ = "\n=item $ic\&LT;$thing\&GT;\n";
+ }
+ } else {
+ $_ = "\n=item $ic\n";
+ $ic =~ y/A-Ya-y/B-Zb-z/;
+ $ic =~ s/(\d+)/$1 + 1/eg;
+ }
+ };
+
+ $section .= $shift.$_."\n";
+}
+# End of current file.
+close($inf);
+$inf = pop @instack;
+}
+
+die "No filename or title\n" unless defined $fn && defined $tl;
+
+$sects{NAME} = "$fn \- $tl\n";
+$sects{FOOTNOTES} .= "=back\n" if exists $sects{FOOTNOTES};
+
+print "=encoding utf-8\n\n";
+
+for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT EXITSTATUS
+ FILES BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {
+ if(exists $sects{$sect}) {
+ $head = $sect;
+ $head =~ s/SEEALSO/SEE ALSO/;
+ $head =~ s/EXITSTATUS/EXIT STATUS/;
+ print "=head1 $head\n\n";
+ print scalar unmunge ($sects{$sect});
+ print "\n";
+ }
+}
+
+sub usage
+{
+ die "usage: $0 [-D toggle...] [infile [outfile]]\n";
+}
+
+sub postprocess
+{
+ local $_ = $_[0];
+
+ # @value{foo} is replaced by whatever 'foo' is defined as.
+ while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) {
+ if (! exists $defs{$2}) {
+ print STDERR "Option $2 not defined\n";
+ s/\Q$1\E//;
+ } else {
+ $value = $defs{$2};
+ s/\Q$1\E/$value/;
+ }
+ }
+
+ # Formatting commands.
+ # Temporary escape for @r.
+ s/\@r\{([^\}]*)\}/R<$1>/g;
+ s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g;
+ s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g;
+ s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g;
+ s/\@sc\{([^\}]*)\}/\U$1/g;
+ s/\@file\{([^\}]*)\}/F<$1>/g;
+ s/\@w\{([^\}]*)\}/S<$1>/g;
+ s/\@(?:dmn|math)\{([^\}]*)\}/$1/g;
+
+ # keep references of the form @ref{...}, print them bold
+ s/\@(?:ref)\{([^\}]*)\}/B<$1>/g;
+
+ # Change double single quotes to double quotes.
+ s/''/"/g;
+ s/``/"/g;
+
+ # Cross references are thrown away, as are @noindent and @refill.
+ # (@noindent is impossible in .pod, and @refill is unnecessary.)
+ # @* is also impossible in .pod; we discard it and any newline that
+ # follows it. Similarly, our macro @gol must be discarded.
+
+ s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
+ s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
+ s/;\s+\@pxref\{(?:[^\}]*)\}//g;
+ s/\@noindent\s*//g;
+ s/\@refill//g;
+ s/\@gol//g;
+ s/\@\*\s*\n?//g;
+
+ # @uref can take one, two, or three arguments, with different
+ # semantics each time. @url and @email are just like @uref with
+ # one argument, for our purposes.
+ s/\@(?:uref|url|email)\{([^\},]*)\}/&lt;B<$1>&gt;/g;
+ s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g;
+ s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g;
+
+ # Un-escape <> at this point.
+ s/&LT;/</g;
+ s/&GT;/>/g;
+
+ # Now un-nest all B<>, I<>, R<>. Theoretically we could have
+ # indefinitely deep nesting; in practice, one level suffices.
+ 1 while s/([BIR])<([^<>]*)([BIR])<([^<>]*)>/$1<$2>$3<$4>$1</g;
+
+ # Replace R<...> with bare ...; eliminate empty markup, B<>;
+ # shift white space at the ends of [BI]<...> expressions outside
+ # the expression.
+ s/R<([^<>]*)>/$1/g;
+ s/[BI]<>//g;
+ s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g;
+ s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g;
+
+ # Extract footnotes. This has to be done after all other
+ # processing because otherwise the regexp will choke on formatting
+ # inside @footnote.
+ while (/\@footnote/g) {
+ s/\@footnote\{([^\}]+)\}/[$fnno]/;
+ add_footnote($1, $fnno);
+ $fnno++;
+ }
+
+ return $_;
+}
+
+sub unmunge
+{
+ # Replace escaped symbols with their equivalents.
+ local $_ = $_[0];
+
+ s/&lt;/E<lt>/g;
+ s/&gt;/E<gt>/g;
+ s/&lbrace;/\{/g;
+ s/&rbrace;/\}/g;
+ s/&at;/\@/g;
+ s/&amp;/&/g;
+ return $_;
+}
+
+sub add_footnote
+{
+ unless (exists $sects{FOOTNOTES}) {
+ $sects{FOOTNOTES} = "\n=over 4\n\n";
+ }
+
+ $sects{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++;
+ $sects{FOOTNOTES} .= $_[0];
+ $sects{FOOTNOTES} .= "\n\n";
+}
+
+# stolen from Symbol.pm
+{
+ my $genseq = 0;
+ sub gensym
+ {
+ my $name = "GEN" . $genseq++;
+ my $ref = \*{$name};
+ delete $::{$name};
+ return $ref;
+ }
+}
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644
index 0000000..6705e02
--- /dev/null
+++ b/doc/version.texi
@@ -0,0 +1,4 @@
+@set UPDATED 7 September 2020
+@set UPDATED-MONTH September 2020
+@set EDITION 1.21
+@set VERSION 1.21
diff --git a/doc/wget.info b/doc/wget.info
new file mode 100644
index 0000000..b59c06c
--- /dev/null
+++ b/doc/wget.info
@@ -0,0 +1,5094 @@
+This is wget.info, produced by makeinfo version 6.7 from wget.texi.
+
+This file documents the GNU Wget utility for downloading network data.
+
+ Copyright © 1996-2011, 2015, 2018-2020 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled “GNU
+Free Documentation Licenseâ€.
+INFO-DIR-SECTION Network applications
+START-INFO-DIR-ENTRY
+* Wget: (wget). Non-interactive network downloader.
+END-INFO-DIR-ENTRY
+
+
+File: wget.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir)
+
+Wget 1.21
+*********
+
+This file documents the GNU Wget utility for downloading network data.
+
+ Copyright © 1996-2011, 2015, 2018-2020 Free Software Foundation, Inc.
+
+ Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled “GNU
+Free Documentation Licenseâ€.
+
+* Menu:
+
+* Overview:: Features of Wget.
+* Invoking:: Wget command-line arguments.
+* Recursive Download:: Downloading interlinked pages.
+* Following Links:: The available methods of chasing links.
+* Time-Stamping:: Mirroring according to time-stamps.
+* Startup File:: Wget’s initialization file.
+* Examples:: Examples of usage.
+* Various:: The stuff that doesn’t fit anywhere else.
+* Appendices:: Some useful references.
+* Copying this manual:: You may give out copies of this manual.
+* Concept Index:: Topics covered by this manual.
+
+
+File: wget.info, Node: Overview, Next: Invoking, Prev: Top, Up: Top
+
+1 Overview
+**********
+
+GNU Wget is a free utility for non-interactive download of files from
+the Web. It supports HTTP, HTTPS, and FTP protocols, as well as
+retrieval through HTTP proxies.
+
+ This chapter is a partial overview of Wget’s features.
+
+ • Wget is non-interactive, meaning that it can work in the
+ background, while the user is not logged on. This allows you to
+ start a retrieval and disconnect from the system, letting Wget
+ finish the work. By contrast, most of the Web browsers require
+ constant user’s presence, which can be a great hindrance when
+ transferring a lot of data.
+
+ • Wget can follow links in HTML, XHTML, and CSS pages, to create
+ local versions of remote web sites, fully recreating the directory
+ structure of the original site. This is sometimes referred to as
+ “recursive downloading.†While doing that, Wget respects the Robot
+ Exclusion Standard (‘/robots.txt’). Wget can be instructed to
+ convert the links in downloaded files to point at the local files,
+ for offline viewing.
+
+ • File name wildcard matching and recursive mirroring of directories
+ are available when retrieving via FTP. Wget can read the
+ time-stamp information given by both HTTP and FTP servers, and
+ store it locally. Thus Wget can see if the remote file has changed
+ since last retrieval, and automatically retrieve the new version if
+ it has. This makes Wget suitable for mirroring of FTP sites, as
+ well as home pages.
+
+ • Wget has been designed for robustness over slow or unstable network
+ connections; if a download fails due to a network problem, it will
+ keep retrying until the whole file has been retrieved. If the
+ server supports regetting, it will instruct the server to continue
+ the download from where it left off.
+
+ • Wget supports proxy servers, which can lighten the network load,
+ speed up retrieval and provide access behind firewalls. Wget uses
+ the passive FTP downloading by default, active FTP being an option.
+
+ • Wget supports IP version 6, the next generation of IP. IPv6 is
+ autodetected at compile-time, and can be disabled at either build
+ or run time. Binaries built with IPv6 support work well in both
+ IPv4-only and dual family environments.
+
+ • Built-in features offer mechanisms to tune which links you wish to
+ follow (*note Following Links::).
+
+ • The progress of individual downloads is traced using a progress
+ gauge. Interactive downloads are tracked using a
+ “thermometerâ€-style gauge, whereas non-interactive ones are traced
+ with dots, each dot representing a fixed amount of data received
+ (1KB by default). Either gauge can be customized to your
+ preferences.
+
+ • Most of the features are fully configurable, either through command
+ line options, or via the initialization file ‘.wgetrc’ (*note
+ Startup File::). Wget allows you to define “global†startup files
+ (‘/usr/local/etc/wgetrc’ by default) for site settings. You can
+ also specify the location of a startup file with the –config
+ option. To disable the reading of config files, use –no-config.
+ If both –config and –no-config are given, –no-config is ignored.
+
+ • Finally, GNU Wget is free software. This means that everyone may
+ use it, redistribute it and/or modify it under the terms of the GNU
+ General Public License, as published by the Free Software
+ Foundation (see the file ‘COPYING’ that came with GNU Wget, for
+ details).
+
+
+File: wget.info, Node: Invoking, Next: Recursive Download, Prev: Overview, Up: Top
+
+2 Invoking
+**********
+
+By default, Wget is very simple to invoke. The basic syntax is:
+
+ wget [OPTION]... [URL]...
+
+ Wget will simply download all the URLs specified on the command line.
+URL is a “Uniform Resource Locatorâ€, as defined below.
+
+ However, you may wish to change some of the default parameters of
+Wget. You can do it two ways: permanently, adding the appropriate
+command to ‘.wgetrc’ (*note Startup File::), or specifying it on the
+command line.
+
+* Menu:
+
+* URL Format::
+* Option Syntax::
+* Basic Startup Options::
+* Logging and Input File Options::
+* Download Options::
+* Directory Options::
+* HTTP Options::
+* HTTPS (SSL/TLS) Options::
+* FTP Options::
+* Recursive Retrieval Options::
+* Recursive Accept/Reject Options::
+* Exit Status::
+
+
+File: wget.info, Node: URL Format, Next: Option Syntax, Prev: Invoking, Up: Invoking
+
+2.1 URL Format
+==============
+
+“URL†is an acronym for Uniform Resource Locator. A uniform resource
+locator is a compact string representation for a resource available via
+the Internet. Wget recognizes the URL syntax as per RFC1738. This is
+the most widely used form (square brackets denote optional parts):
+
+ http://host[:port]/directory/file
+ ftp://host[:port]/directory/file
+
+ You can also encode your username and password within a URL:
+
+ ftp://user:password@host/path
+ http://user:password@host/path
+
+ Either USER or PASSWORD, or both, may be left out. If you leave out
+either the HTTP username or password, no authentication will be sent.
+If you leave out the FTP username, ‘anonymous’ will be used. If you
+leave out the FTP password, your email address will be supplied as a
+default password.(1)
+
+ *Important Note*: if you specify a password-containing URL on the
+command line, the username and password will be plainly visible to all
+users on the system, by way of ‘ps’. On multi-user systems, this is a
+big security risk. To work around it, use ‘wget -i -’ and feed the URLs
+to Wget’s standard input, each on a separate line, terminated by ‘C-d’.
+
+ You can encode unsafe characters in a URL as ‘%xy’, ‘xy’ being the
+hexadecimal representation of the character’s ASCII value. Some common
+unsafe characters include ‘%’ (quoted as ‘%25’), ‘:’ (quoted as ‘%3A’),
+and ‘@’ (quoted as ‘%40’). Refer to RFC1738 for a comprehensive list of
+unsafe characters.
+
+ Wget also supports the ‘type’ feature for FTP URLs. By default, FTP
+documents are retrieved in the binary mode (type ‘i’), which means that
+they are downloaded unchanged. Another useful mode is the ‘a’ (“ASCIIâ€)
+mode, which converts the line delimiters between the different operating
+systems, and is thus useful for text files. Here is an example:
+
+ ftp://host/directory/file;type=a
+
+ Two alternative variants of URL specification are also supported,
+because of historical (hysterical?) reasons and their widespreaded use.
+
+ FTP-only syntax (supported by ‘NcFTP’):
+ host:/dir/file
+
+ HTTP-only syntax (introduced by ‘Netscape’):
+ host[:port]/dir/file
+
+ These two alternative forms are deprecated, and may cease being
+supported in the future.
+
+ If you do not understand the difference between these notations, or
+do not know which one to use, just use the plain ordinary format you use
+with your favorite browser, like ‘Lynx’ or ‘Netscape’.
+
+ ---------- Footnotes ----------
+
+ (1) If you have a ‘.netrc’ file in your home directory, password will
+also be searched for there.
+
+
+File: wget.info, Node: Option Syntax, Next: Basic Startup Options, Prev: URL Format, Up: Invoking
+
+2.2 Option Syntax
+=================
+
+Since Wget uses GNU getopt to process command-line arguments, every
+option has a long form along with the short one. Long options are more
+convenient to remember, but take time to type. You may freely mix
+different option styles, or specify options after the command-line
+arguments. Thus you may write:
+
+ wget -r --tries=10 http://fly.srk.fer.hr/ -o log
+
+ The space between the option accepting an argument and the argument
+may be omitted. Instead of ‘-o log’ you can write ‘-olog’.
+
+ You may put several options that do not require arguments together,
+like:
+
+ wget -drc URL
+
+ This is completely equivalent to:
+
+ wget -d -r -c URL
+
+ Since the options can be specified after the arguments, you may
+terminate them with ‘--’. So the following will try to download URL
+‘-x’, reporting failure to ‘log’:
+
+ wget -o log -- -x
+
+ The options that accept comma-separated lists all respect the
+convention that specifying an empty list clears its value. This can be
+useful to clear the ‘.wgetrc’ settings. For instance, if your ‘.wgetrc’
+sets ‘exclude_directories’ to ‘/cgi-bin’, the following example will
+first reset it, and then set it to exclude ‘/~nobody’ and ‘/~somebody’.
+You can also clear the lists in ‘.wgetrc’ (*note Wgetrc Syntax::).
+
+ wget -X '' -X /~nobody,/~somebody
+
+ Most options that do not accept arguments are “boolean†options, so
+named because their state can be captured with a yes-or-no (“booleanâ€)
+variable. For example, ‘--follow-ftp’ tells Wget to follow FTP links
+from HTML files and, on the other hand, ‘--no-glob’ tells it not to
+perform file globbing on FTP URLs. A boolean option is either
+“affirmative†or “negative†(beginning with ‘--no’). All such options
+share several properties.
+
+ Unless stated otherwise, it is assumed that the default behavior is
+the opposite of what the option accomplishes. For example, the
+documented existence of ‘--follow-ftp’ assumes that the default is to
+_not_ follow FTP links from HTML pages.
+
+ Affirmative options can be negated by prepending the ‘--no-’ to the
+option name; negative options can be negated by omitting the ‘--no-’
+prefix. This might seem superfluous—if the default for an affirmative
+option is to not do something, then why provide a way to explicitly turn
+it off? But the startup file may in fact change the default. For
+instance, using ‘follow_ftp = on’ in ‘.wgetrc’ makes Wget _follow_ FTP
+links by default, and using ‘--no-follow-ftp’ is the only way to restore
+the factory default from the command line.
+
+
+File: wget.info, Node: Basic Startup Options, Next: Logging and Input File Options, Prev: Option Syntax, Up: Invoking
+
+2.3 Basic Startup Options
+=========================
+
+‘-V’
+‘--version’
+ Display the version of Wget.
+
+‘-h’
+‘--help’
+ Print a help message describing all of Wget’s command-line options.
+
+‘-b’
+‘--background’
+ Go to background immediately after startup. If no output file is
+ specified via the ‘-o’, output is redirected to ‘wget-log’.
+
+‘-e COMMAND’
+‘--execute COMMAND’
+ Execute COMMAND as if it were a part of ‘.wgetrc’ (*note Startup
+ File::). A command thus invoked will be executed _after_ the
+ commands in ‘.wgetrc’, thus taking precedence over them. If you
+ need to specify more than one wgetrc command, use multiple
+ instances of ‘-e’.
+
+
+File: wget.info, Node: Logging and Input File Options, Next: Download Options, Prev: Basic Startup Options, Up: Invoking
+
+2.4 Logging and Input File Options
+==================================
+
+‘-o LOGFILE’
+‘--output-file=LOGFILE’
+ Log all messages to LOGFILE. The messages are normally reported to
+ standard error.
+
+‘-a LOGFILE’
+‘--append-output=LOGFILE’
+ Append to LOGFILE. This is the same as ‘-o’, only it appends to
+ LOGFILE instead of overwriting the old log file. If LOGFILE does
+ not exist, a new file is created.
+
+‘-d’
+‘--debug’
+ Turn on debug output, meaning various information important to the
+ developers of Wget if it does not work properly. Your system
+ administrator may have chosen to compile Wget without debug
+ support, in which case ‘-d’ will not work. Please note that
+ compiling with debug support is always safe—Wget compiled with the
+ debug support will _not_ print any debug info unless requested with
+ ‘-d’. *Note Reporting Bugs::, for more information on how to use
+ ‘-d’ for sending bug reports.
+
+‘-q’
+‘--quiet’
+ Turn off Wget’s output.
+
+‘-v’
+‘--verbose’
+ Turn on verbose output, with all the available data. The default
+ output is verbose.
+
+‘-nv’
+‘--no-verbose’
+ Turn off verbose without being completely quiet (use ‘-q’ for
+ that), which means that error messages and basic information still
+ get printed.
+
+‘--report-speed=TYPE’
+ Output bandwidth as TYPE. The only accepted value is ‘bits’.
+
+‘-i FILE’
+‘--input-file=FILE’
+ Read URLs from a local or external FILE. If ‘-’ is specified as
+ FILE, URLs are read from the standard input. (Use ‘./-’ to read
+ from a file literally named ‘-’.)
+
+ If this function is used, no URLs need be present on the command
+ line. If there are URLs both on the command line and in an input
+ file, those on the command lines will be the first ones to be
+ retrieved. If ‘--force-html’ is not specified, then FILE should
+ consist of a series of URLs, one per line.
+
+ However, if you specify ‘--force-html’, the document will be
+ regarded as ‘html’. In that case you may have problems with
+ relative links, which you can solve either by adding ‘<base
+ href="URL">’ to the documents or by specifying ‘--base=URL’ on the
+ command line.
+
+ If the FILE is an external one, the document will be automatically
+ treated as ‘html’ if the Content-Type matches ‘text/html’.
+ Furthermore, the FILE’s location will be implicitly used as base
+ href if none was specified.
+
+‘--input-metalink=FILE’
+ Downloads files covered in local Metalink FILE. Metalink version 3
+ and 4 are supported.
+
+‘--keep-badhash’
+ Keeps downloaded Metalink’s files with a bad hash. It appends
+ .badhash to the name of Metalink’s files which have a checksum
+ mismatch, except without overwriting existing files.
+
+‘--metalink-over-http’
+ Issues HTTP HEAD request instead of GET and extracts Metalink
+ metadata from response headers. Then it switches to Metalink
+ download. If no valid Metalink metadata is found, it falls back to
+ ordinary HTTP download. Enables ‘Content-Type:
+ application/metalink4+xml’ files download/processing.
+
+‘--metalink-index=NUMBER’
+ Set the Metalink ‘application/metalink4+xml’ metaurl ordinal
+ NUMBER. From 1 to the total number of “application/metalink4+xmlâ€
+ available. Specify 0 or ‘inf’ to choose the first good one.
+ Metaurls, such as those from a ‘--metalink-over-http’, may have
+ been sorted by priority key’s value; keep this in mind to choose
+ the right NUMBER.
+
+‘--preferred-location’
+ Set preferred location for Metalink resources. This has effect if
+ multiple resources with same priority are available.
+
+‘--xattr’
+ Enable use of file system’s extended attributes to save the
+ original URL and the Referer HTTP header value if used.
+
+ Be aware that the URL might contain private information like access
+ tokens or credentials.
+
+‘-F’
+‘--force-html’
+ When input is read from a file, force it to be treated as an HTML
+ file. This enables you to retrieve relative links from existing
+ HTML files on your local disk, by adding ‘<base href="URL">’ to
+ HTML, or using the ‘--base’ command-line option.
+
+‘-B URL’
+‘--base=URL’
+ Resolves relative links using URL as the point of reference, when
+ reading links from an HTML file specified via the
+ ‘-i’/‘--input-file’ option (together with ‘--force-html’, or when
+ the input file was fetched remotely from a server describing it as
+ HTML). This is equivalent to the presence of a ‘BASE’ tag in the
+ HTML input file, with URL as the value for the ‘href’ attribute.
+
+ For instance, if you specify ‘http://foo/bar/a.html’ for URL, and
+ Wget reads ‘../baz/b.html’ from the input file, it would be
+ resolved to ‘http://foo/baz/b.html’.
+
+‘--config=FILE’
+ Specify the location of a startup file you wish to use instead of
+ the default one(s). Use –no-config to disable reading of config
+ files. If both –config and –no-config are given, –no-config is
+ ignored.
+
+‘--rejected-log=LOGFILE’
+ Logs all URL rejections to LOGFILE as comma separated values. The
+ values include the reason of rejection, the URL and the parent URL
+ it was found in.
+
+
+File: wget.info, Node: Download Options, Next: Directory Options, Prev: Logging and Input File Options, Up: Invoking
+
+2.5 Download Options
+====================
+
+‘--bind-address=ADDRESS’
+ When making client TCP/IP connections, bind to ADDRESS on the local
+ machine. ADDRESS may be specified as a hostname or IP address.
+ This option can be useful if your machine is bound to multiple IPs.
+
+‘--bind-dns-address=ADDRESS’
+ [libcares only] This address overrides the route for DNS requests.
+ If you ever need to circumvent the standard settings from
+ /etc/resolv.conf, this option together with ‘--dns-servers’ is your
+ friend. ADDRESS must be specified either as IPv4 or IPv6 address.
+ Wget needs to be built with libcares for this option to be
+ available.
+
+‘--dns-servers=ADDRESSES’
+ [libcares only] The given address(es) override the standard
+ nameserver addresses, e.g. as configured in /etc/resolv.conf.
+ ADDRESSES may be specified either as IPv4 or IPv6 addresses,
+ comma-separated. Wget needs to be built with libcares for this
+ option to be available.
+
+‘-t NUMBER’
+‘--tries=NUMBER’
+ Set number of tries to NUMBER. Specify 0 or ‘inf’ for infinite
+ retrying. The default is to retry 20 times, with the exception of
+ fatal errors like “connection refused†or “not found†(404), which
+ are not retried.
+
+‘-O FILE’
+‘--output-document=FILE’
+ The documents will not be written to the appropriate files, but all
+ will be concatenated together and written to FILE. If ‘-’ is used
+ as FILE, documents will be printed to standard output, disabling
+ link conversion. (Use ‘./-’ to print to a file literally named
+ ‘-’.)
+
+ Use of ‘-O’ is _not_ intended to mean simply “use the name FILE
+ instead of the one in the URL;†rather, it is analogous to shell
+ redirection: ‘wget -O file http://foo’ is intended to work like
+ ‘wget -O - http://foo > file’; ‘file’ will be truncated
+ immediately, and _all_ downloaded content will be written there.
+
+ For this reason, ‘-N’ (for timestamp-checking) is not supported in
+ combination with ‘-O’: since FILE is always newly created, it will
+ always have a very new timestamp. A warning will be issued if this
+ combination is used.
+
+ Similarly, using ‘-r’ or ‘-p’ with ‘-O’ may not work as you expect:
+ Wget won’t just download the first file to FILE and then download
+ the rest to their normal names: _all_ downloaded content will be
+ placed in FILE. This was disabled in version 1.11, but has been
+ reinstated (with a warning) in 1.11.2, as there are some cases
+ where this behavior can actually have some use.
+
+ A combination with ‘-nc’ is only accepted if the given output file
+ does not exist.
+
+ Note that a combination with ‘-k’ is only permitted when
+ downloading a single document, as in that case it will just convert
+ all relative URIs to external ones; ‘-k’ makes no sense for
+ multiple URIs when they’re all being downloaded to a single file;
+ ‘-k’ can be used only when the output is a regular file.
+
+‘-nc’
+‘--no-clobber’
+ If a file is downloaded more than once in the same directory,
+ Wget’s behavior depends on a few options, including ‘-nc’. In
+ certain cases, the local file will be “clobberedâ€, or overwritten,
+ upon repeated download. In other cases it will be preserved.
+
+ When running Wget without ‘-N’, ‘-nc’, ‘-r’, or ‘-p’, downloading
+ the same file in the same directory will result in the original
+ copy of FILE being preserved and the second copy being named
+ ‘FILE.1’. If that file is downloaded yet again, the third copy
+ will be named ‘FILE.2’, and so on. (This is also the behavior with
+ ‘-nd’, even if ‘-r’ or ‘-p’ are in effect.) When ‘-nc’ is
+ specified, this behavior is suppressed, and Wget will refuse to
+ download newer copies of ‘FILE’. Therefore, “‘no-clobber’†is
+ actually a misnomer in this mode—it’s not clobbering that’s
+ prevented (as the numeric suffixes were already preventing
+ clobbering), but rather the multiple version saving that’s
+ prevented.
+
+ When running Wget with ‘-r’ or ‘-p’, but without ‘-N’, ‘-nd’, or
+ ‘-nc’, re-downloading a file will result in the new copy simply
+ overwriting the old. Adding ‘-nc’ will prevent this behavior,
+ instead causing the original version to be preserved and any newer
+ copies on the server to be ignored.
+
+ When running Wget with ‘-N’, with or without ‘-r’ or ‘-p’, the
+ decision as to whether or not to download a newer copy of a file
+ depends on the local and remote timestamp and size of the file
+ (*note Time-Stamping::). ‘-nc’ may not be specified at the same
+ time as ‘-N’.
+
+ A combination with ‘-O’/‘--output-document’ is only accepted if the
+ given output file does not exist.
+
+ Note that when ‘-nc’ is specified, files with the suffixes ‘.html’
+ or ‘.htm’ will be loaded from the local disk and parsed as if they
+ had been retrieved from the Web.
+
+‘--backups=BACKUPS’
+ Before (over)writing a file, back up an existing file by adding a
+ ‘.1’ suffix (‘_1’ on VMS) to the file name. Such backup files are
+ rotated to ‘.2’, ‘.3’, and so on, up to BACKUPS (and lost beyond
+ that).
+
+‘--no-netrc’
+ Do not try to obtain credentials from ‘.netrc’ file. By default
+ ‘.netrc’ file is searched for credentials in case none have been
+ passed on command line and authentication is required.
+
+‘-c’
+‘--continue’
+ Continue getting a partially-downloaded file. This is useful when
+ you want to finish up a download started by a previous instance of
+ Wget, or by another program. For instance:
+
+ wget -c ftp://sunsite.doc.ic.ac.uk/ls-lR.Z
+
+ If there is a file named ‘ls-lR.Z’ in the current directory, Wget
+ will assume that it is the first portion of the remote file, and
+ will ask the server to continue the retrieval from an offset equal
+ to the length of the local file.
+
+ Note that you don’t need to specify this option if you just want
+ the current invocation of Wget to retry downloading a file should
+ the connection be lost midway through. This is the default
+ behavior. ‘-c’ only affects resumption of downloads started
+ _prior_ to this invocation of Wget, and whose local files are still
+ sitting around.
+
+ Without ‘-c’, the previous example would just download the remote
+ file to ‘ls-lR.Z.1’, leaving the truncated ‘ls-lR.Z’ file alone.
+
+ If you use ‘-c’ on a non-empty file, and the server does not
+ support continued downloading, Wget will restart the download from
+ scratch and overwrite the existing file entirely.
+
+ Beginning with Wget 1.7, if you use ‘-c’ on a file which is of
+ equal size as the one on the server, Wget will refuse to download
+ the file and print an explanatory message. The same happens when
+ the file is smaller on the server than locally (presumably because
+ it was changed on the server since your last download
+ attempt)—because “continuing†is not meaningful, no download
+ occurs.
+
+ On the other side of the coin, while using ‘-c’, any file that’s
+ bigger on the server than locally will be considered an incomplete
+ download and only ‘(length(remote) - length(local))’ bytes will be
+ downloaded and tacked onto the end of the local file. This
+ behavior can be desirable in certain cases—for instance, you can
+ use ‘wget -c’ to download just the new portion that’s been appended
+ to a data collection or log file.
+
+ However, if the file is bigger on the server because it’s been
+ _changed_, as opposed to just _appended_ to, you’ll end up with a
+ garbled file. Wget has no way of verifying that the local file is
+ really a valid prefix of the remote file. You need to be
+ especially careful of this when using ‘-c’ in conjunction with
+ ‘-r’, since every file will be considered as an "incomplete
+ download" candidate.
+
+ Another instance where you’ll get a garbled file if you try to use
+ ‘-c’ is if you have a lame HTTP proxy that inserts a “transfer
+ interrupted†string into the local file. In the future a
+ “rollback†option may be added to deal with this case.
+
+ Note that ‘-c’ only works with FTP servers and with HTTP servers
+ that support the ‘Range’ header.
+
+‘--start-pos=OFFSET’
+ Start downloading at zero-based position OFFSET. Offset may be
+ expressed in bytes, kilobytes with the ‘k’ suffix, or megabytes
+ with the ‘m’ suffix, etc.
+
+ ‘--start-pos’ has higher precedence over ‘--continue’. When
+ ‘--start-pos’ and ‘--continue’ are both specified, wget will emit a
+ warning then proceed as if ‘--continue’ was absent.
+
+ Server support for continued download is required, otherwise
+ ‘--start-pos’ cannot help. See ‘-c’ for details.
+
+‘--progress=TYPE’
+ Select the type of the progress indicator you wish to use. Legal
+ indicators are “dot†and “barâ€.
+
+ The “bar†indicator is used by default. It draws an ASCII progress
+ bar graphics (a.k.a “thermometer†display) indicating the status of
+ retrieval. If the output is not a TTY, the “dot†bar will be used
+ by default.
+
+ Use ‘--progress=dot’ to switch to the “dot†display. It traces the
+ retrieval by printing dots on the screen, each dot representing a
+ fixed amount of downloaded data.
+
+ The progress TYPE can also take one or more parameters. The
+ parameters vary based on the TYPE selected. Parameters to TYPE are
+ passed by appending them to the type sperated by a colon (:) like
+ this: ‘--progress=TYPE:PARAMETER1:PARAMETER2’.
+
+ When using the dotted retrieval, you may set the “style†by
+ specifying the type as ‘dot:STYLE’. Different styles assign
+ different meaning to one dot. With the ‘default’ style each dot
+ represents 1K, there are ten dots in a cluster and 50 dots in a
+ line. The ‘binary’ style has a more “computerâ€-like orientation—8K
+ dots, 16-dots clusters and 48 dots per line (which makes for 384K
+ lines). The ‘mega’ style is suitable for downloading large
+ files—each dot represents 64K retrieved, there are eight dots in a
+ cluster, and 48 dots on each line (so each line contains 3M). If
+ ‘mega’ is not enough then you can use the ‘giga’ style—each dot
+ represents 1M retrieved, there are eight dots in a cluster, and 32
+ dots on each line (so each line contains 32M).
+
+ With ‘--progress=bar’, there are currently two possible parameters,
+ FORCE and NOSCROLL.
+
+ When the output is not a TTY, the progress bar always falls back to
+ “dotâ€, even if ‘--progress=bar’ was passed to Wget during
+ invocation. This behaviour can be overridden and the “bar†output
+ forced by using the “force†parameter as ‘--progress=bar:force’.
+
+ By default, the ‘bar’ style progress bar scroll the name of the
+ file from left to right for the file being downloaded if the
+ filename exceeds the maximum length allotted for its display. In
+ certain cases, such as with ‘--progress=bar:force’, one may not
+ want the scrolling filename in the progress bar. By passing the
+ “noscroll†parameter, Wget can be forced to display as much of the
+ filename as possible without scrolling through it.
+
+ Note that you can set the default style using the ‘progress’
+ command in ‘.wgetrc’. That setting may be overridden from the
+ command line. For example, to force the bar output without
+ scrolling, use ‘--progress=bar:force:noscroll’.
+
+‘--show-progress’
+ Force wget to display the progress bar in any verbosity.
+
+ By default, wget only displays the progress bar in verbose mode.
+ One may however, want wget to display the progress bar on screen in
+ conjunction with any other verbosity modes like ‘--no-verbose’ or
+ ‘--quiet’. This is often a desired a property when invoking wget
+ to download several small/large files. In such a case, wget could
+ simply be invoked with this parameter to get a much cleaner output
+ on the screen.
+
+ This option will also force the progress bar to be printed to
+ ‘stderr’ when used alongside the ‘--output-file’ option.
+
+‘-N’
+‘--timestamping’
+ Turn on time-stamping. *Note Time-Stamping::, for details.
+
+‘--no-if-modified-since’
+ Do not send If-Modified-Since header in ‘-N’ mode. Send
+ preliminary HEAD request instead. This has only effect in ‘-N’
+ mode.
+
+‘--no-use-server-timestamps’
+ Don’t set the local file’s timestamp by the one on the server.
+
+ By default, when a file is downloaded, its timestamps are set to
+ match those from the remote file. This allows the use of
+ ‘--timestamping’ on subsequent invocations of wget. However, it is
+ sometimes useful to base the local file’s timestamp on when it was
+ actually downloaded; for that purpose, the
+ ‘--no-use-server-timestamps’ option has been provided.
+
+‘-S’
+‘--server-response’
+ Print the headers sent by HTTP servers and responses sent by FTP
+ servers.
+
+‘--spider’
+ When invoked with this option, Wget will behave as a Web “spiderâ€,
+ which means that it will not download the pages, just check that
+ they are there. For example, you can use Wget to check your
+ bookmarks:
+
+ wget --spider --force-html -i bookmarks.html
+
+ This feature needs much more work for Wget to get close to the
+ functionality of real web spiders.
+
+‘-T seconds’
+‘--timeout=SECONDS’
+ Set the network timeout to SECONDS seconds. This is equivalent to
+ specifying ‘--dns-timeout’, ‘--connect-timeout’, and
+ ‘--read-timeout’, all at the same time.
+
+ When interacting with the network, Wget can check for timeout and
+ abort the operation if it takes too long. This prevents anomalies
+ like hanging reads and infinite connects. The only timeout enabled
+ by default is a 900-second read timeout. Setting a timeout to 0
+ disables it altogether. Unless you know what you are doing, it is
+ best not to change the default timeout settings.
+
+ All timeout-related options accept decimal values, as well as
+ subsecond values. For example, ‘0.1’ seconds is a legal (though
+ unwise) choice of timeout. Subsecond timeouts are useful for
+ checking server response times or for testing network latency.
+
+‘--dns-timeout=SECONDS’
+ Set the DNS lookup timeout to SECONDS seconds. DNS lookups that
+ don’t complete within the specified time will fail. By default,
+ there is no timeout on DNS lookups, other than that implemented by
+ system libraries.
+
+‘--connect-timeout=SECONDS’
+ Set the connect timeout to SECONDS seconds. TCP connections that
+ take longer to establish will be aborted. By default, there is no
+ connect timeout, other than that implemented by system libraries.
+
+‘--read-timeout=SECONDS’
+ Set the read (and write) timeout to SECONDS seconds. The “time†of
+ this timeout refers to “idle timeâ€: if, at any point in the
+ download, no data is received for more than the specified number of
+ seconds, reading fails and the download is restarted. This option
+ does not directly affect the duration of the entire download.
+
+ Of course, the remote server may choose to terminate the connection
+ sooner than this option requires. The default read timeout is 900
+ seconds.
+
+‘--limit-rate=AMOUNT’
+ Limit the download speed to AMOUNT bytes per second. Amount may be
+ expressed in bytes, kilobytes with the ‘k’ suffix, or megabytes
+ with the ‘m’ suffix. For example, ‘--limit-rate=20k’ will limit
+ the retrieval rate to 20KB/s. This is useful when, for whatever
+ reason, you don’t want Wget to consume the entire available
+ bandwidth.
+
+ This option allows the use of decimal numbers, usually in
+ conjunction with power suffixes; for example, ‘--limit-rate=2.5k’
+ is a legal value.
+
+ Note that Wget implements the limiting by sleeping the appropriate
+ amount of time after a network read that took less time than
+ specified by the rate. Eventually this strategy causes the TCP
+ transfer to slow down to approximately the specified rate.
+ However, it may take some time for this balance to be achieved, so
+ don’t be surprised if limiting the rate doesn’t work well with very
+ small files.
+
+‘-w SECONDS’
+‘--wait=SECONDS’
+ Wait the specified number of seconds between the retrievals. Use
+ of this option is recommended, as it lightens the server load by
+ making the requests less frequent. Instead of in seconds, the time
+ can be specified in minutes using the ‘m’ suffix, in hours using
+ ‘h’ suffix, or in days using ‘d’ suffix.
+
+ Specifying a large value for this option is useful if the network
+ or the destination host is down, so that Wget can wait long enough
+ to reasonably expect the network error to be fixed before the
+ retry. The waiting interval specified by this function is
+ influenced by ‘--random-wait’, which see.
+
+‘--waitretry=SECONDS’
+ If you don’t want Wget to wait between _every_ retrieval, but only
+ between retries of failed downloads, you can use this option. Wget
+ will use “linear backoffâ€, waiting 1 second after the first failure
+ on a given file, then waiting 2 seconds after the second failure on
+ that file, up to the maximum number of SECONDS you specify.
+
+ By default, Wget will assume a value of 10 seconds.
+
+‘--random-wait’
+ Some web sites may perform log analysis to identify retrieval
+ programs such as Wget by looking for statistically significant
+ similarities in the time between requests. This option causes the
+ time between requests to vary between 0.5 and 1.5 * WAIT seconds,
+ where WAIT was specified using the ‘--wait’ option, in order to
+ mask Wget’s presence from such analysis.
+
+ A 2001 article in a publication devoted to development on a popular
+ consumer platform provided code to perform this analysis on the
+ fly. Its author suggested blocking at the class C address level to
+ ensure automated retrieval programs were blocked despite changing
+ DHCP-supplied addresses.
+
+ The ‘--random-wait’ option was inspired by this ill-advised
+ recommendation to block many unrelated users from a web site due to
+ the actions of one.
+
+‘--no-proxy’
+ Don’t use proxies, even if the appropriate ‘*_proxy’ environment
+ variable is defined.
+
+ *Note Proxies::, for more information about the use of proxies with
+ Wget.
+
+‘-Q QUOTA’
+‘--quota=QUOTA’
+ Specify download quota for automatic retrievals. The value can be
+ specified in bytes (default), kilobytes (with ‘k’ suffix), or
+ megabytes (with ‘m’ suffix).
+
+ Note that quota will never affect downloading a single file. So if
+ you specify ‘wget -Q10k https://example.com/ls-lR.gz’, all of the
+ ‘ls-lR.gz’ will be downloaded. The same goes even when several
+ URLs are specified on the command-line. The quota is checked only
+ at the end of each downloaded file, so it will never result in a
+ partially downloaded file. Thus you may safely type ‘wget -Q2m -i
+ sites’—download will be aborted after the file that exhausts the
+ quota is completely downloaded.
+
+ Setting quota to 0 or to ‘inf’ unlimits the download quota.
+
+‘--no-dns-cache’
+ Turn off caching of DNS lookups. Normally, Wget remembers the IP
+ addresses it looked up from DNS so it doesn’t have to repeatedly
+ contact the DNS server for the same (typically small) set of hosts
+ it retrieves from. This cache exists in memory only; a new Wget
+ run will contact DNS again.
+
+ However, it has been reported that in some situations it is not
+ desirable to cache host names, even for the duration of a
+ short-running application like Wget. With this option Wget issues
+ a new DNS lookup (more precisely, a new call to ‘gethostbyname’ or
+ ‘getaddrinfo’) each time it makes a new connection. Please note
+ that this option will _not_ affect caching that might be performed
+ by the resolving library or by an external caching layer, such as
+ NSCD.
+
+ If you don’t understand exactly what this option does, you probably
+ won’t need it.
+
+‘--restrict-file-names=MODES’
+ Change which characters found in remote URLs must be escaped during
+ generation of local filenames. Characters that are “restricted†by
+ this option are escaped, i.e. replaced with ‘%HH’, where ‘HH’ is
+ the hexadecimal number that corresponds to the restricted
+ character. This option may also be used to force all alphabetical
+ cases to be either lower- or uppercase.
+
+ By default, Wget escapes the characters that are not valid or safe
+ as part of file names on your operating system, as well as control
+ characters that are typically unprintable. This option is useful
+ for changing these defaults, perhaps because you are downloading to
+ a non-native partition, or because you want to disable escaping of
+ the control characters, or you want to further restrict characters
+ to only those in the ASCII range of values.
+
+ The MODES are a comma-separated set of text values. The acceptable
+ values are ‘unix’, ‘windows’, ‘nocontrol’, ‘ascii’, ‘lowercase’,
+ and ‘uppercase’. The values ‘unix’ and ‘windows’ are mutually
+ exclusive (one will override the other), as are ‘lowercase’ and
+ ‘uppercase’. Those last are special cases, as they do not change
+ the set of characters that would be escaped, but rather force local
+ file paths to be converted either to lower- or uppercase.
+
+ When “unix†is specified, Wget escapes the character ‘/’ and the
+ control characters in the ranges 0–31 and 128–159. This is the
+ default on Unix-like operating systems.
+
+ When “windows†is given, Wget escapes the characters ‘\’, ‘|’, ‘/’,
+ ‘:’, ‘?’, ‘"’, ‘*’, ‘<’, ‘>’, and the control characters in the
+ ranges 0–31 and 128–159. In addition to this, Wget in Windows mode
+ uses ‘+’ instead of ‘:’ to separate host and port in local file
+ names, and uses ‘@’ instead of ‘?’ to separate the query portion of
+ the file name from the rest. Therefore, a URL that would be saved
+ as ‘www.xemacs.org:4300/search.pl?input=blah’ in Unix mode would be
+ saved as ‘www.xemacs.org+4300/search.pl@input=blah’ in Windows
+ mode. This mode is the default on Windows.
+
+ If you specify ‘nocontrol’, then the escaping of the control
+ characters is also switched off. This option may make sense when
+ you are downloading URLs whose names contain UTF-8 characters, on a
+ system which can save and display filenames in UTF-8 (some possible
+ byte values used in UTF-8 byte sequences fall in the range of
+ values designated by Wget as “controlsâ€).
+
+ The ‘ascii’ mode is used to specify that any bytes whose values are
+ outside the range of ASCII characters (that is, greater than 127)
+ shall be escaped. This can be useful when saving filenames whose
+ encoding does not match the one used locally.
+
+‘-4’
+‘--inet4-only’
+‘-6’
+‘--inet6-only’
+ Force connecting to IPv4 or IPv6 addresses. With ‘--inet4-only’ or
+ ‘-4’, Wget will only connect to IPv4 hosts, ignoring AAAA records
+ in DNS, and refusing to connect to IPv6 addresses specified in
+ URLs. Conversely, with ‘--inet6-only’ or ‘-6’, Wget will only
+ connect to IPv6 hosts and ignore A records and IPv4 addresses.
+
+ Neither options should be needed normally. By default, an
+ IPv6-aware Wget will use the address family specified by the host’s
+ DNS record. If the DNS responds with both IPv4 and IPv6 addresses,
+ Wget will try them in sequence until it finds one it can connect
+ to. (Also see ‘--prefer-family’ option described below.)
+
+ These options can be used to deliberately force the use of IPv4 or
+ IPv6 address families on dual family systems, usually to aid
+ debugging or to deal with broken network configuration. Only one
+ of ‘--inet6-only’ and ‘--inet4-only’ may be specified at the same
+ time. Neither option is available in Wget compiled without IPv6
+ support.
+
+‘--prefer-family=none/IPv4/IPv6’
+ When given a choice of several addresses, connect to the addresses
+ with specified address family first. The address order returned by
+ DNS is used without change by default.
+
+ This avoids spurious errors and connect attempts when accessing
+ hosts that resolve to both IPv6 and IPv4 addresses from IPv4
+ networks. For example, ‘www.kame.net’ resolves to
+ ‘2001:200:0:8002:203:47ff:fea5:3085’ and to ‘203.178.141.194’.
+ When the preferred family is ‘IPv4’, the IPv4 address is used
+ first; when the preferred family is ‘IPv6’, the IPv6 address is
+ used first; if the specified value is ‘none’, the address order
+ returned by DNS is used without change.
+
+ Unlike ‘-4’ and ‘-6’, this option doesn’t inhibit access to any
+ address family, it only changes the _order_ in which the addresses
+ are accessed. Also note that the reordering performed by this
+ option is “stableâ€â€”it doesn’t affect order of addresses of the same
+ family. That is, the relative order of all IPv4 addresses and of
+ all IPv6 addresses remains intact in all cases.
+
+‘--retry-connrefused’
+ Consider “connection refused†a transient error and try again.
+ Normally Wget gives up on a URL when it is unable to connect to the
+ site because failure to connect is taken as a sign that the server
+ is not running at all and that retries would not help. This option
+ is for mirroring unreliable sites whose servers tend to disappear
+ for short periods of time.
+
+‘--user=USER’
+‘--password=PASSWORD’
+ Specify the username USER and password PASSWORD for both FTP and
+ HTTP file retrieval. These parameters can be overridden using the
+ ‘--ftp-user’ and ‘--ftp-password’ options for FTP connections and
+ the ‘--http-user’ and ‘--http-password’ options for HTTP
+ connections.
+
+‘--ask-password’
+ Prompt for a password for each connection established. Cannot be
+ specified when ‘--password’ is being used, because they are
+ mutually exclusive.
+
+‘--use-askpass=COMMAND’
+ Prompt for a user and password using the specified command. If no
+ command is specified then the command in the environment variable
+ WGET_ASKPASS is used. If WGET_ASKPASS is not set then the command
+ in the environment variable SSH_ASKPASS is used.
+
+ You can set the default command for use-askpass in the ‘.wgetrc’.
+ That setting may be overridden from the command line.
+
+‘--no-iri’
+
+ Turn off internationalized URI (IRI) support. Use ‘--iri’ to turn
+ it on. IRI support is activated by default.
+
+ You can set the default state of IRI support using the ‘iri’
+ command in ‘.wgetrc’. That setting may be overridden from the
+ command line.
+
+‘--local-encoding=ENCODING’
+
+ Force Wget to use ENCODING as the default system encoding. That
+ affects how Wget converts URLs specified as arguments from locale
+ to UTF-8 for IRI support.
+
+ Wget use the function ‘nl_langinfo()’ and then the ‘CHARSET’
+ environment variable to get the locale. If it fails, ASCII is
+ used.
+
+ You can set the default local encoding using the ‘local_encoding’
+ command in ‘.wgetrc’. That setting may be overridden from the
+ command line.
+
+‘--remote-encoding=ENCODING’
+
+ Force Wget to use ENCODING as the default remote server encoding.
+ That affects how Wget converts URIs found in files from remote
+ encoding to UTF-8 during a recursive fetch. This options is only
+ useful for IRI support, for the interpretation of non-ASCII
+ characters.
+
+ For HTTP, remote encoding can be found in HTTP ‘Content-Type’
+ header and in HTML ‘Content-Type http-equiv’ meta tag.
+
+ You can set the default encoding using the ‘remoteencoding’ command
+ in ‘.wgetrc’. That setting may be overridden from the command
+ line.
+
+‘--unlink’
+
+ Force Wget to unlink file instead of clobbering existing file.
+ This option is useful for downloading to the directory with
+ hardlinks.
+
+
+File: wget.info, Node: Directory Options, Next: HTTP Options, Prev: Download Options, Up: Invoking
+
+2.6 Directory Options
+=====================
+
+‘-nd’
+‘--no-directories’
+ Do not create a hierarchy of directories when retrieving
+ recursively. With this option turned on, all files will get saved
+ to the current directory, without clobbering (if a name shows up
+ more than once, the filenames will get extensions ‘.n’).
+
+‘-x’
+‘--force-directories’
+ The opposite of ‘-nd’—create a hierarchy of directories, even if
+ one would not have been created otherwise. E.g. ‘wget -x
+ http://fly.srk.fer.hr/robots.txt’ will save the downloaded file to
+ ‘fly.srk.fer.hr/robots.txt’.
+
+‘-nH’
+‘--no-host-directories’
+ Disable generation of host-prefixed directories. By default,
+ invoking Wget with ‘-r http://fly.srk.fer.hr/’ will create a
+ structure of directories beginning with ‘fly.srk.fer.hr/’. This
+ option disables such behavior.
+
+‘--protocol-directories’
+ Use the protocol name as a directory component of local file names.
+ For example, with this option, ‘wget -r http://HOST’ will save to
+ ‘http/HOST/...’ rather than just to ‘HOST/...’.
+
+‘--cut-dirs=NUMBER’
+ Ignore NUMBER directory components. This is useful for getting a
+ fine-grained control over the directory where recursive retrieval
+ will be saved.
+
+ Take, for example, the directory at
+ ‘ftp://ftp.xemacs.org/pub/xemacs/’. If you retrieve it with ‘-r’,
+ it will be saved locally under ‘ftp.xemacs.org/pub/xemacs/’. While
+ the ‘-nH’ option can remove the ‘ftp.xemacs.org/’ part, you are
+ still stuck with ‘pub/xemacs’. This is where ‘--cut-dirs’ comes in
+ handy; it makes Wget not “see†NUMBER remote directory components.
+ Here are several examples of how ‘--cut-dirs’ option works.
+
+ No options -> ftp.xemacs.org/pub/xemacs/
+ -nH -> pub/xemacs/
+ -nH --cut-dirs=1 -> xemacs/
+ -nH --cut-dirs=2 -> .
+
+ --cut-dirs=1 -> ftp.xemacs.org/xemacs/
+ ...
+
+ If you just want to get rid of the directory structure, this option
+ is similar to a combination of ‘-nd’ and ‘-P’. However, unlike
+ ‘-nd’, ‘--cut-dirs’ does not lose with subdirectories—for instance,
+ with ‘-nH --cut-dirs=1’, a ‘beta/’ subdirectory will be placed to
+ ‘xemacs/beta’, as one would expect.
+
+‘-P PREFIX’
+‘--directory-prefix=PREFIX’
+ Set directory prefix to PREFIX. The “directory prefix†is the
+ directory where all other files and subdirectories will be saved
+ to, i.e. the top of the retrieval tree. The default is ‘.’ (the
+ current directory).
+
+
+File: wget.info, Node: HTTP Options, Next: HTTPS (SSL/TLS) Options, Prev: Directory Options, Up: Invoking
+
+2.7 HTTP Options
+================
+
+‘--default-page=NAME’
+ Use NAME as the default file name when it isn’t known (i.e., for
+ URLs that end in a slash), instead of ‘index.html’.
+
+‘-E’
+‘--adjust-extension’
+ If a file of type ‘application/xhtml+xml’ or ‘text/html’ is
+ downloaded and the URL does not end with the regexp
+ ‘\.[Hh][Tt][Mm][Ll]?’, this option will cause the suffix ‘.html’ to
+ be appended to the local filename. This is useful, for instance,
+ when you’re mirroring a remote site that uses ‘.asp’ pages, but you
+ want the mirrored pages to be viewable on your stock Apache server.
+ Another good use for this is when you’re downloading CGI-generated
+ materials. A URL like ‘http://site.com/article.cgi?25’ will be
+ saved as ‘article.cgi?25.html’.
+
+ Note that filenames changed in this way will be re-downloaded every
+ time you re-mirror a site, because Wget can’t tell that the local
+ ‘X.html’ file corresponds to remote URL ‘X’ (since it doesn’t yet
+ know that the URL produces output of type ‘text/html’ or
+ ‘application/xhtml+xml’.
+
+ As of version 1.12, Wget will also ensure that any downloaded files
+ of type ‘text/css’ end in the suffix ‘.css’, and the option was
+ renamed from ‘--html-extension’, to better reflect its new
+ behavior. The old option name is still acceptable, but should now
+ be considered deprecated.
+
+ As of version 1.19.2, Wget will also ensure that any downloaded
+ files with a ‘Content-Encoding’ of ‘br’, ‘compress’, ‘deflate’ or
+ ‘gzip’ end in the suffix ‘.br’, ‘.Z’, ‘.zlib’ and ‘.gz’
+ respectively.
+
+ At some point in the future, this option may well be expanded to
+ include suffixes for other types of content, including content
+ types that are not parsed by Wget.
+
+‘--http-user=USER’
+‘--http-password=PASSWORD’
+ Specify the username USER and password PASSWORD on an HTTP server.
+ According to the type of the challenge, Wget will encode them using
+ either the ‘basic’ (insecure), the ‘digest’, or the Windows ‘NTLM’
+ authentication scheme.
+
+ Another way to specify username and password is in the URL itself
+ (*note URL Format::). Either method reveals your password to
+ anyone who bothers to run ‘ps’. To prevent the passwords from
+ being seen, use the ‘--use-askpass’ or store them in ‘.wgetrc’ or
+ ‘.netrc’, and make sure to protect those files from other users
+ with ‘chmod’. If the passwords are really important, do not leave
+ them lying in those files either—edit the files and delete them
+ after Wget has started the download.
+
+‘--no-http-keep-alive’
+ Turn off the “keep-alive†feature for HTTP downloads. Normally,
+ Wget asks the server to keep the connection open so that, when you
+ download more than one document from the same server, they get
+ transferred over the same TCP connection. This saves time and at
+ the same time reduces the load on the server.
+
+ This option is useful when, for some reason, persistent
+ (keep-alive) connections don’t work for you, for example due to a
+ server bug or due to the inability of server-side scripts to cope
+ with the connections.
+
+‘--no-cache’
+ Disable server-side cache. In this case, Wget will send the remote
+ server appropriate directives (‘Cache-Control: no-cache’ and
+ ‘Pragma: no-cache’) to get the file from the remote service, rather
+ than returning the cached version. This is especially useful for
+ retrieving and flushing out-of-date documents on proxy servers.
+
+ Caching is allowed by default.
+
+‘--no-cookies’
+ Disable the use of cookies. Cookies are a mechanism for
+ maintaining server-side state. The server sends the client a
+ cookie using the ‘Set-Cookie’ header, and the client responds with
+ the same cookie upon further requests. Since cookies allow the
+ server owners to keep track of visitors and for sites to exchange
+ this information, some consider them a breach of privacy. The
+ default is to use cookies; however, _storing_ cookies is not on by
+ default.
+
+‘--load-cookies FILE’
+ Load cookies from FILE before the first HTTP retrieval. FILE is a
+ textual file in the format originally used by Netscape’s
+ ‘cookies.txt’ file.
+
+ You will typically use this option when mirroring sites that
+ require that you be logged in to access some or all of their
+ content. The login process typically works by the web server
+ issuing an HTTP cookie upon receiving and verifying your
+ credentials. The cookie is then resent by the browser when
+ accessing that part of the site, and so proves your identity.
+
+ Mirroring such a site requires Wget to send the same cookies your
+ browser sends when communicating with the site. This is achieved
+ by ‘--load-cookies’—simply point Wget to the location of the
+ ‘cookies.txt’ file, and it will send the same cookies your browser
+ would send in the same situation. Different browsers keep textual
+ cookie files in different locations:
+
+ Netscape 4.x.
+ The cookies are in ‘~/.netscape/cookies.txt’.
+
+ Mozilla and Netscape 6.x.
+ Mozilla’s cookie file is also named ‘cookies.txt’, located
+ somewhere under ‘~/.mozilla’, in the directory of your
+ profile. The full path usually ends up looking somewhat like
+ ‘~/.mozilla/default/SOME-WEIRD-STRING/cookies.txt’.
+
+ Internet Explorer.
+ You can produce a cookie file Wget can use by using the File
+ menu, Import and Export, Export Cookies. This has been tested
+ with Internet Explorer 5; it is not guaranteed to work with
+ earlier versions.
+
+ Other browsers.
+ If you are using a different browser to create your cookies,
+ ‘--load-cookies’ will only work if you can locate or produce a
+ cookie file in the Netscape format that Wget expects.
+
+ If you cannot use ‘--load-cookies’, there might still be an
+ alternative. If your browser supports a “cookie managerâ€, you can
+ use it to view the cookies used when accessing the site you’re
+ mirroring. Write down the name and value of the cookie, and
+ manually instruct Wget to send those cookies, bypassing the
+ “official†cookie support:
+
+ wget --no-cookies --header "Cookie: NAME=VALUE"
+
+‘--save-cookies FILE’
+ Save cookies to FILE before exiting. This will not save cookies
+ that have expired or that have no expiry time (so-called “session
+ cookiesâ€), but also see ‘--keep-session-cookies’.
+
+‘--keep-session-cookies’
+ When specified, causes ‘--save-cookies’ to also save session
+ cookies. Session cookies are normally not saved because they are
+ meant to be kept in memory and forgotten when you exit the browser.
+ Saving them is useful on sites that require you to log in or to
+ visit the home page before you can access some pages. With this
+ option, multiple Wget runs are considered a single browser session
+ as far as the site is concerned.
+
+ Since the cookie file format does not normally carry session
+ cookies, Wget marks them with an expiry timestamp of 0. Wget’s
+ ‘--load-cookies’ recognizes those as session cookies, but it might
+ confuse other browsers. Also note that cookies so loaded will be
+ treated as other session cookies, which means that if you want
+ ‘--save-cookies’ to preserve them again, you must use
+ ‘--keep-session-cookies’ again.
+
+‘--ignore-length’
+ Unfortunately, some HTTP servers (CGI programs, to be more precise)
+ send out bogus ‘Content-Length’ headers, which makes Wget go wild,
+ as it thinks not all the document was retrieved. You can spot this
+ syndrome if Wget retries getting the same document again and again,
+ each time claiming that the (otherwise normal) connection has
+ closed on the very same byte.
+
+ With this option, Wget will ignore the ‘Content-Length’ header—as
+ if it never existed.
+
+‘--header=HEADER-LINE’
+ Send HEADER-LINE along with the rest of the headers in each HTTP
+ request. The supplied header is sent as-is, which means it must
+ contain name and value separated by colon, and must not contain
+ newlines.
+
+ You may define more than one additional header by specifying
+ ‘--header’ more than once.
+
+ wget --header='Accept-Charset: iso-8859-2' \
+ --header='Accept-Language: hr' \
+ http://fly.srk.fer.hr/
+
+ Specification of an empty string as the header value will clear all
+ previous user-defined headers.
+
+ As of Wget 1.10, this option can be used to override headers
+ otherwise generated automatically. This example instructs Wget to
+ connect to localhost, but to specify ‘foo.bar’ in the ‘Host’
+ header:
+
+ wget --header="Host: foo.bar" http://localhost/
+
+ In versions of Wget prior to 1.10 such use of ‘--header’ caused
+ sending of duplicate headers.
+
+‘--compression=TYPE’
+ Choose the type of compression to be used. Legal values are
+ ‘auto’, ‘gzip’ and ‘none’.
+
+ If ‘auto’ or ‘gzip’ are specified, Wget asks the server to compress
+ the file using the gzip compression format. If the server
+ compresses the file and responds with the ‘Content-Encoding’ header
+ field set appropriately, the file will be decompressed
+ automatically.
+
+ If ‘none’ is specified, wget will not ask the server to compress
+ the file and will not decompress any server responses. This is the
+ default.
+
+ Compression support is currently experimental. In case it is
+ turned on, please report any bugs to ‘bug-wget@gnu.org’.
+
+‘--max-redirect=NUMBER’
+ Specifies the maximum number of redirections to follow for a
+ resource. The default is 20, which is usually far more than
+ necessary. However, on those occasions where you want to allow
+ more (or fewer), this is the option to use.
+
+‘--proxy-user=USER’
+‘--proxy-password=PASSWORD’
+ Specify the username USER and password PASSWORD for authentication
+ on a proxy server. Wget will encode them using the ‘basic’
+ authentication scheme.
+
+ Security considerations similar to those with ‘--http-password’
+ pertain here as well.
+
+‘--referer=URL’
+ Include ‘Referer: URL’ header in HTTP request. Useful for
+ retrieving documents with server-side processing that assume they
+ are always being retrieved by interactive web browsers and only
+ come out properly when Referer is set to one of the pages that
+ point to them.
+
+‘--save-headers’
+ Save the headers sent by the HTTP server to the file, preceding the
+ actual contents, with an empty line as the separator.
+
+‘-U AGENT-STRING’
+‘--user-agent=AGENT-STRING’
+ Identify as AGENT-STRING to the HTTP server.
+
+ The HTTP protocol allows the clients to identify themselves using a
+ ‘User-Agent’ header field. This enables distinguishing the WWW
+ software, usually for statistical purposes or for tracing of
+ protocol violations. Wget normally identifies as ‘Wget/VERSION’,
+ VERSION being the current version number of Wget.
+
+ However, some sites have been known to impose the policy of
+ tailoring the output according to the ‘User-Agent’-supplied
+ information. While this is not such a bad idea in theory, it has
+ been abused by servers denying information to clients other than
+ (historically) Netscape or, more frequently, Microsoft Internet
+ Explorer. This option allows you to change the ‘User-Agent’ line
+ issued by Wget. Use of this option is discouraged, unless you
+ really know what you are doing.
+
+ Specifying empty user agent with ‘--user-agent=""’ instructs Wget
+ not to send the ‘User-Agent’ header in HTTP requests.
+
+‘--post-data=STRING’
+‘--post-file=FILE’
+ Use POST as the method for all HTTP requests and send the specified
+ data in the request body. ‘--post-data’ sends STRING as data,
+ whereas ‘--post-file’ sends the contents of FILE. Other than that,
+ they work in exactly the same way. In particular, they _both_
+ expect content of the form ‘key1=value1&key2=value2’, with
+ percent-encoding for special characters; the only difference is
+ that one expects its content as a command-line parameter and the
+ other accepts its content from a file. In particular,
+ ‘--post-file’ is _not_ for transmitting files as form attachments:
+ those must appear as ‘key=value’ data (with appropriate
+ percent-coding) just like everything else. Wget does not currently
+ support ‘multipart/form-data’ for transmitting POST data; only
+ ‘application/x-www-form-urlencoded’. Only one of ‘--post-data’ and
+ ‘--post-file’ should be specified.
+
+ Please note that wget does not require the content to be of the
+ form ‘key1=value1&key2=value2’, and neither does it test for it.
+ Wget will simply transmit whatever data is provided to it. Most
+ servers however expect the POST data to be in the above format when
+ processing HTML Forms.
+
+ When sending a POST request using the ‘--post-file’ option, Wget
+ treats the file as a binary file and will send every character in
+ the POST request without stripping trailing newline or formfeed
+ characters. Any other control characters in the text will also be
+ sent as-is in the POST request.
+
+ Please be aware that Wget needs to know the size of the POST data
+ in advance. Therefore the argument to ‘--post-file’ must be a
+ regular file; specifying a FIFO or something like ‘/dev/stdin’
+ won’t work. It’s not quite clear how to work around this
+ limitation inherent in HTTP/1.0. Although HTTP/1.1 introduces
+ “chunked†transfer that doesn’t require knowing the request length
+ in advance, a client can’t use chunked unless it knows it’s talking
+ to an HTTP/1.1 server. And it can’t know that until it receives a
+ response, which in turn requires the request to have been completed
+ – a chicken-and-egg problem.
+
+ Note: As of version 1.15 if Wget is redirected after the POST
+ request is completed, its behaviour will depend on the response
+ code returned by the server. In case of a 301 Moved Permanently,
+ 302 Moved Temporarily or 307 Temporary Redirect, Wget will, in
+ accordance with RFC2616, continue to send a POST request. In case
+ a server wants the client to change the Request method upon
+ redirection, it should send a 303 See Other response code.
+
+ This example shows how to log in to a server using POST and then
+ proceed to download the desired pages, presumably only accessible
+ to authorized users:
+
+ # Log in to the server. This can be done only once.
+ wget --save-cookies cookies.txt \
+ --post-data 'user=foo&password=bar' \
+ http://example.com/auth.php
+
+ # Now grab the page or pages we care about.
+ wget --load-cookies cookies.txt \
+ -p http://example.com/interesting/article.php
+
+ If the server is using session cookies to track user
+ authentication, the above will not work because ‘--save-cookies’
+ will not save them (and neither will browsers) and the
+ ‘cookies.txt’ file will be empty. In that case use
+ ‘--keep-session-cookies’ along with ‘--save-cookies’ to force
+ saving of session cookies.
+
+‘--method=HTTP-METHOD’
+ For the purpose of RESTful scripting, Wget allows sending of other
+ HTTP Methods without the need to explicitly set them using
+ ‘--header=Header-Line’. Wget will use whatever string is passed to
+ it after ‘--method’ as the HTTP Method to the server.
+
+‘--body-data=DATA-STRING’
+‘--body-file=DATA-FILE’
+ Must be set when additional data needs to be sent to the server
+ along with the Method specified using ‘--method’. ‘--body-data’
+ sends STRING as data, whereas ‘--body-file’ sends the contents of
+ FILE. Other than that, they work in exactly the same way.
+
+ Currently, ‘--body-file’ is _not_ for transmitting files as a
+ whole. Wget does not currently support ‘multipart/form-data’ for
+ transmitting data; only ‘application/x-www-form-urlencoded’. In
+ the future, this may be changed so that wget sends the
+ ‘--body-file’ as a complete file instead of sending its contents to
+ the server. Please be aware that Wget needs to know the contents
+ of BODY Data in advance, and hence the argument to ‘--body-file’
+ should be a regular file. See ‘--post-file’ for a more detailed
+ explanation. Only one of ‘--body-data’ and ‘--body-file’ should be
+ specified.
+
+ If Wget is redirected after the request is completed, Wget will
+ suspend the current method and send a GET request till the
+ redirection is completed. This is true for all redirection
+ response codes except 307 Temporary Redirect which is used to
+ explicitly specify that the request method should _not_ change.
+ Another exception is when the method is set to ‘POST’, in which
+ case the redirection rules specified under ‘--post-data’ are
+ followed.
+
+‘--content-disposition’
+
+ If this is set to on, experimental (not fully-functional) support
+ for ‘Content-Disposition’ headers is enabled. This can currently
+ result in extra round-trips to the server for a ‘HEAD’ request, and
+ is known to suffer from a few bugs, which is why it is not
+ currently enabled by default.
+
+ This option is useful for some file-downloading CGI programs that
+ use ‘Content-Disposition’ headers to describe what the name of a
+ downloaded file should be.
+
+ When combined with ‘--metalink-over-http’ and
+ ‘--trust-server-names’, a ‘Content-Type: application/metalink4+xml’
+ file is named using the ‘Content-Disposition’ filename field, if
+ available.
+
+‘--content-on-error’
+
+ If this is set to on, wget will not skip the content when the
+ server responds with a http status code that indicates error.
+
+‘--trust-server-names’
+
+ If this is set, on a redirect, the local file name will be based on
+ the redirection URL. By default the local file name is based on the
+ original URL. When doing recursive retrieving this can be helpful
+ because in many web sites redirected URLs correspond to an
+ underlying file structure, while link URLs do not.
+
+‘--auth-no-challenge’
+
+ If this option is given, Wget will send Basic HTTP authentication
+ information (plaintext username and password) for all requests,
+ just like Wget 1.10.2 and prior did by default.
+
+ Use of this option is not recommended, and is intended only to
+ support some few obscure servers, which never send HTTP
+ authentication challenges, but accept unsolicited auth info, say,
+ in addition to form-based authentication.
+
+‘--retry-on-host-error’
+ Consider host errors, such as “Temporary failure in name
+ resolutionâ€, as non-fatal, transient errors.
+
+‘--retry-on-http-error=CODE[,CODE,...]’
+ Consider given HTTP response codes as non-fatal, transient errors.
+ Supply a comma-separated list of 3-digit HTTP response codes as
+ argument. Useful to work around special circumstances where
+ retries are required, but the server responds with an error code
+ normally not retried by Wget. Such errors might be 503 (Service
+ Unavailable) and 429 (Too Many Requests). Retries enabled by this
+ option are performed subject to the normal retry timing and retry
+ count limitations of Wget.
+
+ Using this option is intended to support special use cases only and
+ is generally not recommended, as it can force retries even in cases
+ where the server is actually trying to decrease its load. Please
+ use wisely and only if you know what you are doing.
+
+
+File: wget.info, Node: HTTPS (SSL/TLS) Options, Next: FTP Options, Prev: HTTP Options, Up: Invoking
+
+2.8 HTTPS (SSL/TLS) Options
+===========================
+
+To support encrypted HTTP (HTTPS) downloads, Wget must be compiled with
+an external SSL library. The current default is GnuTLS. In addition,
+Wget also supports HSTS (HTTP Strict Transport Security). If Wget is
+compiled without SSL support, none of these options are available.
+
+‘--secure-protocol=PROTOCOL’
+ Choose the secure protocol to be used. Legal values are ‘auto’,
+ ‘SSLv2’, ‘SSLv3’, ‘TLSv1’, ‘TLSv1_1’, ‘TLSv1_2’, ‘TLSv1_3’ and
+ ‘PFS’. If ‘auto’ is used, the SSL library is given the liberty of
+ choosing the appropriate protocol automatically, which is achieved
+ by sending a TLSv1 greeting. This is the default.
+
+ Specifying ‘SSLv2’, ‘SSLv3’, ‘TLSv1’, ‘TLSv1_1’, ‘TLSv1_2’ or
+ ‘TLSv1_3’ forces the use of the corresponding protocol. This is
+ useful when talking to old and buggy SSL server implementations
+ that make it hard for the underlying SSL library to choose the
+ correct protocol version. Fortunately, such servers are quite
+ rare.
+
+ Specifying ‘PFS’ enforces the use of the so-called Perfect Forward
+ Security cipher suites. In short, PFS adds security by creating a
+ one-time key for each SSL connection. It has a bit more CPU impact
+ on client and server. We use known to be secure ciphers (e.g. no
+ MD4) and the TLS protocol. This mode also explicitly excludes
+ non-PFS key exchange methods, such as RSA.
+
+‘--https-only’
+ When in recursive mode, only HTTPS links are followed.
+
+‘--ciphers’
+ Set the cipher list string. Typically this string sets the cipher
+ suites and other SSL/TLS options that the user wish should be used,
+ in a set order of preference (GnuTLS calls it ’priority string’).
+ This string will be fed verbatim to the SSL/TLS engine (OpenSSL or
+ GnuTLS) and hence its format and syntax is dependent on that. Wget
+ will not process or manipulate it in any way. Refer to the OpenSSL
+ or GnuTLS documentation for more information.
+
+‘--no-check-certificate’
+ Don’t check the server certificate against the available
+ certificate authorities. Also don’t require the URL host name to
+ match the common name presented by the certificate.
+
+ As of Wget 1.10, the default is to verify the server’s certificate
+ against the recognized certificate authorities, breaking the SSL
+ handshake and aborting the download if the verification fails.
+ Although this provides more secure downloads, it does break
+ interoperability with some sites that worked with previous Wget
+ versions, particularly those using self-signed, expired, or
+ otherwise invalid certificates. This option forces an “insecureâ€
+ mode of operation that turns the certificate verification errors
+ into warnings and allows you to proceed.
+
+ If you encounter “certificate verification†errors or ones saying
+ that “common name doesn’t match requested host nameâ€, you can use
+ this option to bypass the verification and proceed with the
+ download. _Only use this option if you are otherwise convinced of
+ the site’s authenticity, or if you really don’t care about the
+ validity of its certificate._ It is almost always a bad idea not
+ to check the certificates when transmitting confidential or
+ important data. For self-signed/internal certificates, you should
+ download the certificate and verify against that instead of forcing
+ this insecure mode. If you are really sure of not desiring any
+ certificate verification, you can specify –check-certificate=quiet
+ to tell wget to not print any warning about invalid certificates,
+ albeit in most cases this is the wrong thing to do.
+
+‘--certificate=FILE’
+ Use the client certificate stored in FILE. This is needed for
+ servers that are configured to require certificates from the
+ clients that connect to them. Normally a certificate is not
+ required and this switch is optional.
+
+‘--certificate-type=TYPE’
+ Specify the type of the client certificate. Legal values are ‘PEM’
+ (assumed by default) and ‘DER’, also known as ‘ASN1’.
+
+‘--private-key=FILE’
+ Read the private key from FILE. This allows you to provide the
+ private key in a file separate from the certificate.
+
+‘--private-key-type=TYPE’
+ Specify the type of the private key. Accepted values are ‘PEM’
+ (the default) and ‘DER’.
+
+‘--ca-certificate=FILE’
+ Use FILE as the file with the bundle of certificate authorities
+ (“CAâ€) to verify the peers. The certificates must be in PEM
+ format.
+
+ Without this option Wget looks for CA certificates at the
+ system-specified locations, chosen at OpenSSL installation time.
+
+‘--ca-directory=DIRECTORY’
+ Specifies directory containing CA certificates in PEM format. Each
+ file contains one CA certificate, and the file name is based on a
+ hash value derived from the certificate. This is achieved by
+ processing a certificate directory with the ‘c_rehash’ utility
+ supplied with OpenSSL. Using ‘--ca-directory’ is more efficient
+ than ‘--ca-certificate’ when many certificates are installed
+ because it allows Wget to fetch certificates on demand.
+
+ Without this option Wget looks for CA certificates at the
+ system-specified locations, chosen at OpenSSL installation time.
+
+‘--crl-file=FILE’
+ Specifies a CRL file in FILE. This is needed for certificates that
+ have been revocated by the CAs.
+
+‘--pinnedpubkey=file/hashes’
+ Tells wget to use the specified public key file (or hashes) to
+ verify the peer. This can be a path to a file which contains a
+ single public key in PEM or DER format, or any number of base64
+ encoded sha256 hashes preceded by “sha256//†and separated by “;â€
+
+ When negotiating a TLS or SSL connection, the server sends a
+ certificate indicating its identity. A public key is extracted
+ from this certificate and if it does not exactly match the public
+ key(s) provided to this option, wget will abort the connection
+ before sending or receiving any data.
+
+‘--random-file=FILE’
+ [OpenSSL and LibreSSL only] Use FILE as the source of random data
+ for seeding the pseudo-random number generator on systems without
+ ‘/dev/urandom’.
+
+ On such systems the SSL library needs an external source of
+ randomness to initialize. Randomness may be provided by EGD (see
+ ‘--egd-file’ below) or read from an external source specified by
+ the user. If this option is not specified, Wget looks for random
+ data in ‘$RANDFILE’ or, if that is unset, in ‘$HOME/.rnd’.
+
+ If you’re getting the “Could not seed OpenSSL PRNG; disabling SSL.â€
+ error, you should provide random data using some of the methods
+ described above.
+
+‘--egd-file=FILE’
+ [OpenSSL only] Use FILE as the EGD socket. EGD stands for “Entropy
+ Gathering Daemonâ€, a user-space program that collects data from
+ various unpredictable system sources and makes it available to
+ other programs that might need it. Encryption software, such as
+ the SSL library, needs sources of non-repeating randomness to seed
+ the random number generator used to produce cryptographically
+ strong keys.
+
+ OpenSSL allows the user to specify his own source of entropy using
+ the ‘RAND_FILE’ environment variable. If this variable is unset,
+ or if the specified file does not produce enough randomness,
+ OpenSSL will read random data from EGD socket specified using this
+ option.
+
+ If this option is not specified (and the equivalent startup command
+ is not used), EGD is never contacted. EGD is not needed on modern
+ Unix systems that support ‘/dev/urandom’.
+
+‘--no-hsts’
+ Wget supports HSTS (HTTP Strict Transport Security, RFC 6797) by
+ default. Use ‘--no-hsts’ to make Wget act as a non-HSTS-compliant
+ UA. As a consequence, Wget would ignore all the
+ ‘Strict-Transport-Security’ headers, and would not enforce any
+ existing HSTS policy.
+
+‘--hsts-file=FILE’
+ By default, Wget stores its HSTS database in ‘~/.wget-hsts’. You
+ can use ‘--hsts-file’ to override this. Wget will use the supplied
+ file as the HSTS database. Such file must conform to the correct
+ HSTS database format used by Wget. If Wget cannot parse the
+ provided file, the behaviour is unspecified.
+
+ The Wget’s HSTS database is a plain text file. Each line contains
+ an HSTS entry (ie. a site that has issued a
+ ‘Strict-Transport-Security’ header and that therefore has specified
+ a concrete HSTS policy to be applied). Lines starting with a dash
+ (‘#’) are ignored by Wget. Please note that in spite of this
+ convenient human-readability hand-hacking the HSTS database is
+ generally not a good idea.
+
+ An HSTS entry line consists of several fields separated by one or
+ more whitespace:
+
+ ‘<hostname> SP [<port>] SP <include subdomains> SP <created> SP
+ <max-age>’
+
+ The HOSTNAME and PORT fields indicate the hostname and port to
+ which the given HSTS policy applies. The PORT field may be zero,
+ and it will, in most of the cases. That means that the port number
+ will not be taken into account when deciding whether such HSTS
+ policy should be applied on a given request (only the hostname will
+ be evaluated). When PORT is different to zero, both the target
+ hostname and the port will be evaluated and the HSTS policy will
+ only be applied if both of them match. This feature has been
+ included for testing/development purposes only. The Wget testsuite
+ (in ‘testenv/’) creates HSTS databases with explicit ports with the
+ purpose of ensuring Wget’s correct behaviour. Applying HSTS
+ policies to ports other than the default ones is discouraged by RFC
+ 6797 (see Appendix B "Differences between HSTS Policy and
+ Same-Origin Policy"). Thus, this functionality should not be used
+ in production environments and PORT will typically be zero. The
+ last three fields do what they are expected to. The field
+ INCLUDE_SUBDOMAINS can either be ‘1’ or ‘0’ and it signals whether
+ the subdomains of the target domain should be part of the given
+ HSTS policy as well. The CREATED and MAX-AGE fields hold the
+ timestamp values of when such entry was created (first seen by
+ Wget) and the HSTS-defined value ’max-age’, which states how long
+ should that HSTS policy remain active, measured in seconds elapsed
+ since the timestamp stored in CREATED. Once that time has passed,
+ that HSTS policy will no longer be valid and will eventually be
+ removed from the database.
+
+ If you supply your own HSTS database via ‘--hsts-file’, be aware
+ that Wget may modify the provided file if any change occurs between
+ the HSTS policies requested by the remote servers and those in the
+ file. When Wget exits, it effectively updates the HSTS database by
+ rewriting the database file with the new entries.
+
+ If the supplied file does not exist, Wget will create one. This
+ file will contain the new HSTS entries. If no HSTS entries were
+ generated (no ‘Strict-Transport-Security’ headers were sent by any
+ of the servers) then no file will be created, not even an empty
+ one. This behaviour applies to the default database file
+ (‘~/.wget-hsts’) as well: it will not be created until some server
+ enforces an HSTS policy.
+
+ Care is taken not to override possible changes made by other Wget
+ processes at the same time over the HSTS database. Before dumping
+ the updated HSTS entries on the file, Wget will re-read it and
+ merge the changes.
+
+ Using a custom HSTS database and/or modifying an existing one is
+ discouraged. For more information about the potential security
+ threats arose from such practice, see section 14 "Security
+ Considerations" of RFC 6797, specially section 14.9 "Creative
+ Manipulation of HSTS Policy Store".
+
+‘--warc-file=FILE’
+ Use FILE as the destination WARC file.
+
+‘--warc-header=STRING’
+ Use STRING into as the warcinfo record.
+
+‘--warc-max-size=SIZE’
+ Set the maximum size of the WARC files to SIZE.
+
+‘--warc-cdx’
+ Write CDX index files.
+
+‘--warc-dedup=FILE’
+ Do not store records listed in this CDX file.
+
+‘--no-warc-compression’
+ Do not compress WARC files with GZIP.
+
+‘--no-warc-digests’
+ Do not calculate SHA1 digests.
+
+‘--no-warc-keep-log’
+ Do not store the log file in a WARC record.
+
+‘--warc-tempdir=DIR’
+ Specify the location for temporary files created by the WARC
+ writer.
+
+
+File: wget.info, Node: FTP Options, Next: Recursive Retrieval Options, Prev: HTTPS (SSL/TLS) Options, Up: Invoking
+
+2.9 FTP Options
+===============
+
+‘--ftp-user=USER’
+‘--ftp-password=PASSWORD’
+ Specify the username USER and password PASSWORD on an FTP server.
+ Without this, or the corresponding startup option, the password
+ defaults to ‘-wget@’, normally used for anonymous FTP.
+
+ Another way to specify username and password is in the URL itself
+ (*note URL Format::). Either method reveals your password to
+ anyone who bothers to run ‘ps’. To prevent the passwords from
+ being seen, store them in ‘.wgetrc’ or ‘.netrc’, and make sure to
+ protect those files from other users with ‘chmod’. If the
+ passwords are really important, do not leave them lying in those
+ files either—edit the files and delete them after Wget has started
+ the download.
+
+‘--no-remove-listing’
+ Don’t remove the temporary ‘.listing’ files generated by FTP
+ retrievals. Normally, these files contain the raw directory
+ listings received from FTP servers. Not removing them can be
+ useful for debugging purposes, or when you want to be able to
+ easily check on the contents of remote server directories (e.g. to
+ verify that a mirror you’re running is complete).
+
+ Note that even though Wget writes to a known filename for this
+ file, this is not a security hole in the scenario of a user making
+ ‘.listing’ a symbolic link to ‘/etc/passwd’ or something and asking
+ ‘root’ to run Wget in his or her directory. Depending on the
+ options used, either Wget will refuse to write to ‘.listing’,
+ making the globbing/recursion/time-stamping operation fail, or the
+ symbolic link will be deleted and replaced with the actual
+ ‘.listing’ file, or the listing will be written to a
+ ‘.listing.NUMBER’ file.
+
+ Even though this situation isn’t a problem, though, ‘root’ should
+ never run Wget in a non-trusted user’s directory. A user could do
+ something as simple as linking ‘index.html’ to ‘/etc/passwd’ and
+ asking ‘root’ to run Wget with ‘-N’ or ‘-r’ so the file will be
+ overwritten.
+
+‘--no-glob’
+ Turn off FTP globbing. Globbing refers to the use of shell-like
+ special characters (“wildcardsâ€), like ‘*’, ‘?’, ‘[’ and ‘]’ to
+ retrieve more than one file from the same directory at once, like:
+
+ wget ftp://gnjilux.srk.fer.hr/*.msg
+
+ By default, globbing will be turned on if the URL contains a
+ globbing character. This option may be used to turn globbing on or
+ off permanently.
+
+ You may have to quote the URL to protect it from being expanded by
+ your shell. Globbing makes Wget look for a directory listing,
+ which is system-specific. This is why it currently works only with
+ Unix FTP servers (and the ones emulating Unix ‘ls’ output).
+
+‘--no-passive-ftp’
+ Disable the use of the “passive†FTP transfer mode. Passive FTP
+ mandates that the client connect to the server to establish the
+ data connection rather than the other way around.
+
+ If the machine is connected to the Internet directly, both passive
+ and active FTP should work equally well. Behind most firewall and
+ NAT configurations passive FTP has a better chance of working.
+ However, in some rare firewall configurations, active FTP actually
+ works when passive FTP doesn’t. If you suspect this to be the
+ case, use this option, or set ‘passive_ftp=off’ in your init file.
+
+‘--preserve-permissions’
+ Preserve remote file permissions instead of permissions set by
+ umask.
+
+‘--retr-symlinks’
+ By default, when retrieving FTP directories recursively and a
+ symbolic link is encountered, the symbolic link is traversed and
+ the pointed-to files are retrieved. Currently, Wget does not
+ traverse symbolic links to directories to download them
+ recursively, though this feature may be added in the future.
+
+ When ‘--retr-symlinks=no’ is specified, the linked-to file is not
+ downloaded. Instead, a matching symbolic link is created on the
+ local filesystem. The pointed-to file will not be retrieved unless
+ this recursive retrieval would have encountered it separately and
+ downloaded it anyway. This option poses a security risk where a
+ malicious FTP Server may cause Wget to write to files outside of
+ the intended directories through a specially crafted .LISTING file.
+
+ Note that when retrieving a file (not a directory) because it was
+ specified on the command-line, rather than because it was recursed
+ to, this option has no effect. Symbolic links are always traversed
+ in this case.
+
+2.10 FTPS Options
+=================
+
+‘--ftps-implicit’
+ This option tells Wget to use FTPS implicitly. Implicit FTPS
+ consists of initializing SSL/TLS from the very beginning of the
+ control connection. This option does not send an ‘AUTH TLS’
+ command: it assumes the server speaks FTPS and directly starts an
+ SSL/TLS connection. If the attempt is successful, the session
+ continues just like regular FTPS (‘PBSZ’ and ‘PROT’ are sent,
+ etc.). Implicit FTPS is no longer a requirement for FTPS
+ implementations, and thus many servers may not support it. If
+ ‘--ftps-implicit’ is passed and no explicit port number specified,
+ the default port for implicit FTPS, 990, will be used, instead of
+ the default port for the "normal" (explicit) FTPS which is the same
+ as that of FTP, 21.
+
+‘--no-ftps-resume-ssl’
+ Do not resume the SSL/TLS session in the data channel. When
+ starting a data connection, Wget tries to resume the SSL/TLS
+ session previously started in the control connection. SSL/TLS
+ session resumption avoids performing an entirely new handshake by
+ reusing the SSL/TLS parameters of a previous session. Typically,
+ the FTPS servers want it that way, so Wget does this by default.
+ Under rare circumstances however, one might want to start an
+ entirely new SSL/TLS session in every data connection. This is
+ what ‘--no-ftps-resume-ssl’ is for.
+
+‘--ftps-clear-data-connection’
+ All the data connections will be in plain text. Only the control
+ connection will be under SSL/TLS. Wget will send a ‘PROT C’ command
+ to achieve this, which must be approved by the server.
+
+‘--ftps-fallback-to-ftp’
+ Fall back to FTP if FTPS is not supported by the target server.
+ For security reasons, this option is not asserted by default. The
+ default behaviour is to exit with an error. If a server does not
+ successfully reply to the initial ‘AUTH TLS’ command, or in the
+ case of implicit FTPS, if the initial SSL/TLS connection attempt is
+ rejected, it is considered that such server does not support FTPS.
+
+
+File: wget.info, Node: Recursive Retrieval Options, Next: Recursive Accept/Reject Options, Prev: FTP Options, Up: Invoking
+
+2.11 Recursive Retrieval Options
+================================
+
+‘-r’
+‘--recursive’
+ Turn on recursive retrieving. *Note Recursive Download::, for more
+ details. The default maximum depth is 5.
+
+‘-l DEPTH’
+‘--level=DEPTH’
+ Set the maximum number of subdirectories that Wget will recurse
+ into to DEPTH. In order to prevent one from accidentally
+ downloading very large websites when using recursion this is
+ limited to a depth of 5 by default, i.e., it will traverse at most
+ 5 directories deep starting from the provided URL. Set ‘-l 0’ or
+ ‘-l inf’ for infinite recursion depth.
+
+ wget -r -l 0 http://SITE/1.html
+
+ Ideally, one would expect this to download just ‘1.html’. but
+ unfortunately this is not the case, because ‘-l 0’ is equivalent to
+ ‘-l inf’—that is, infinite recursion. To download a single HTML
+ page (or a handful of them), specify them all on the command line
+ and leave away ‘-r’ and ‘-l’. To download the essential items to
+ view a single HTML page, see ‘page requisites’.
+
+‘--delete-after’
+ This option tells Wget to delete every single file it downloads,
+ _after_ having done so. It is useful for pre-fetching popular
+ pages through a proxy, e.g.:
+
+ wget -r -nd --delete-after http://whatever.com/~popular/page/
+
+ The ‘-r’ option is to retrieve recursively, and ‘-nd’ to not create
+ directories.
+
+ Note that ‘--delete-after’ deletes files on the local machine. It
+ does not issue the ‘DELE’ command to remote FTP sites, for
+ instance. Also note that when ‘--delete-after’ is specified,
+ ‘--convert-links’ is ignored, so ‘.orig’ files are simply not
+ created in the first place.
+
+‘-k’
+‘--convert-links’
+ After the download is complete, convert the links in the document
+ to make them suitable for local viewing. This affects not only the
+ visible hyperlinks, but any part of the document that links to
+ external content, such as embedded images, links to style sheets,
+ hyperlinks to non-HTML content, etc.
+
+ Each link will be changed in one of the two ways:
+
+ • The links to files that have been downloaded by Wget will be
+ changed to refer to the file they point to as a relative link.
+
+ Example: if the downloaded file ‘/foo/doc.html’ links to
+ ‘/bar/img.gif’, also downloaded, then the link in ‘doc.html’
+ will be modified to point to ‘../bar/img.gif’. This kind of
+ transformation works reliably for arbitrary combinations of
+ directories.
+
+ • The links to files that have not been downloaded by Wget will
+ be changed to include host name and absolute path of the
+ location they point to.
+
+ Example: if the downloaded file ‘/foo/doc.html’ links to
+ ‘/bar/img.gif’ (or to ‘../bar/img.gif’), then the link in
+ ‘doc.html’ will be modified to point to
+ ‘http://HOSTNAME/bar/img.gif’.
+
+ Because of this, local browsing works reliably: if a linked file
+ was downloaded, the link will refer to its local name; if it was
+ not downloaded, the link will refer to its full Internet address
+ rather than presenting a broken link. The fact that the former
+ links are converted to relative links ensures that you can move the
+ downloaded hierarchy to another directory.
+
+ Note that only at the end of the download can Wget know which links
+ have been downloaded. Because of that, the work done by ‘-k’ will
+ be performed at the end of all the downloads.
+
+‘--convert-file-only’
+ This option converts only the filename part of the URLs, leaving
+ the rest of the URLs untouched. This filename part is sometimes
+ referred to as the "basename", although we avoid that term here in
+ order not to cause confusion.
+
+ It works particularly well in conjunction with
+ ‘--adjust-extension’, although this coupling is not enforced. It
+ proves useful to populate Internet caches with files downloaded
+ from different hosts.
+
+ Example: if some link points to ‘//foo.com/bar.cgi?xyz’ with
+ ‘--adjust-extension’ asserted and its local destination is intended
+ to be ‘./foo.com/bar.cgi?xyz.css’, then the link would be converted
+ to ‘//foo.com/bar.cgi?xyz.css’. Note that only the filename part
+ has been modified. The rest of the URL has been left untouched,
+ including the net path (‘//’) which would otherwise be processed by
+ Wget and converted to the effective scheme (ie. ‘http://’).
+
+‘-K’
+‘--backup-converted’
+ When converting a file, back up the original version with a ‘.orig’
+ suffix. Affects the behavior of ‘-N’ (*note HTTP Time-Stamping
+ Internals::).
+
+‘-m’
+‘--mirror’
+ Turn on options suitable for mirroring. This option turns on
+ recursion and time-stamping, sets infinite recursion depth and
+ keeps FTP directory listings. It is currently equivalent to ‘-r -N
+ -l inf --no-remove-listing’.
+
+‘-p’
+‘--page-requisites’
+ This option causes Wget to download all the files that are
+ necessary to properly display a given HTML page. This includes
+ such things as inlined images, sounds, and referenced stylesheets.
+
+ Ordinarily, when downloading a single HTML page, any requisite
+ documents that may be needed to display it properly are not
+ downloaded. Using ‘-r’ together with ‘-l’ can help, but since Wget
+ does not ordinarily distinguish between external and inlined
+ documents, one is generally left with “leaf documents†that are
+ missing their requisites.
+
+ For instance, say document ‘1.html’ contains an ‘<IMG>’ tag
+ referencing ‘1.gif’ and an ‘<A>’ tag pointing to external document
+ ‘2.html’. Say that ‘2.html’ is similar but that its image is
+ ‘2.gif’ and it links to ‘3.html’. Say this continues up to some
+ arbitrarily high number.
+
+ If one executes the command:
+
+ wget -r -l 2 http://SITE/1.html
+
+ then ‘1.html’, ‘1.gif’, ‘2.html’, ‘2.gif’, and ‘3.html’ will be
+ downloaded. As you can see, ‘3.html’ is without its requisite
+ ‘3.gif’ because Wget is simply counting the number of hops (up to
+ 2) away from ‘1.html’ in order to determine where to stop the
+ recursion. However, with this command:
+
+ wget -r -l 2 -p http://SITE/1.html
+
+ all the above files _and_ ‘3.html’’s requisite ‘3.gif’ will be
+ downloaded. Similarly,
+
+ wget -r -l 1 -p http://SITE/1.html
+
+ will cause ‘1.html’, ‘1.gif’, ‘2.html’, and ‘2.gif’ to be
+ downloaded. One might think that:
+
+ wget -r -l 0 -p http://SITE/1.html
+
+ would download just ‘1.html’ and ‘1.gif’, but unfortunately this is
+ not the case, because ‘-l 0’ is equivalent to ‘-l inf’—that is,
+ infinite recursion. To download a single HTML page (or a handful
+ of them, all specified on the command-line or in a ‘-i’ URL input
+ file) and its (or their) requisites, simply leave off ‘-r’ and
+ ‘-l’:
+
+ wget -p http://SITE/1.html
+
+ Note that Wget will behave as if ‘-r’ had been specified, but only
+ that single page and its requisites will be downloaded. Links from
+ that page to external documents will not be followed. Actually, to
+ download a single page and all its requisites (even if they exist
+ on separate websites), and make sure the lot displays properly
+ locally, this author likes to use a few options in addition to
+ ‘-p’:
+
+ wget -E -H -k -K -p http://SITE/DOCUMENT
+
+ To finish off this topic, it’s worth knowing that Wget’s idea of an
+ external document link is any URL specified in an ‘<A>’ tag, an
+ ‘<AREA>’ tag, or a ‘<LINK>’ tag other than ‘<LINK
+ REL="stylesheet">’.
+
+‘--strict-comments’
+ Turn on strict parsing of HTML comments. The default is to
+ terminate comments at the first occurrence of ‘-->’.
+
+ According to specifications, HTML comments are expressed as SGML
+ “declarationsâ€. Declaration is special markup that begins with
+ ‘<!’ and ends with ‘>’, such as ‘<!DOCTYPE ...>’, that may contain
+ comments between a pair of ‘--’ delimiters. HTML comments are
+ “empty declarationsâ€, SGML declarations without any non-comment
+ text. Therefore, ‘<!--foo-->’ is a valid comment, and so is
+ ‘<!--one-- --two-->’, but ‘<!--1--2-->’ is not.
+
+ On the other hand, most HTML writers don’t perceive comments as
+ anything other than text delimited with ‘<!--’ and ‘-->’, which is
+ not quite the same. For example, something like ‘<!------------>’
+ works as a valid comment as long as the number of dashes is a
+ multiple of four (!). If not, the comment technically lasts until
+ the next ‘--’, which may be at the other end of the document.
+ Because of this, many popular browsers completely ignore the
+ specification and implement what users have come to expect:
+ comments delimited with ‘<!--’ and ‘-->’.
+
+ Until version 1.9, Wget interpreted comments strictly, which
+ resulted in missing links in many web pages that displayed fine in
+ browsers, but had the misfortune of containing non-compliant
+ comments. Beginning with version 1.9, Wget has joined the ranks of
+ clients that implements “naive†comments, terminating each comment
+ at the first occurrence of ‘-->’.
+
+ If, for whatever reason, you want strict comment parsing, use this
+ option to turn it on.
+
+
+File: wget.info, Node: Recursive Accept/Reject Options, Next: Exit Status, Prev: Recursive Retrieval Options, Up: Invoking
+
+2.12 Recursive Accept/Reject Options
+====================================
+
+‘-A ACCLIST --accept ACCLIST’
+‘-R REJLIST --reject REJLIST’
+ Specify comma-separated lists of file name suffixes or patterns to
+ accept or reject (*note Types of Files::). Note that if any of the
+ wildcard characters, ‘*’, ‘?’, ‘[’ or ‘]’, appear in an element of
+ ACCLIST or REJLIST, it will be treated as a pattern, rather than a
+ suffix. In this case, you have to enclose the pattern into quotes
+ to prevent your shell from expanding it, like in ‘-A "*.mp3"’ or
+ ‘-A '*.mp3'’.
+
+‘--accept-regex URLREGEX’
+‘--reject-regex URLREGEX’
+ Specify a regular expression to accept or reject the complete URL.
+
+‘--regex-type REGEXTYPE’
+ Specify the regular expression type. Possible types are ‘posix’ or
+ ‘pcre’. Note that to be able to use ‘pcre’ type, wget has to be
+ compiled with libpcre support.
+
+‘-D DOMAIN-LIST’
+‘--domains=DOMAIN-LIST’
+ Set domains to be followed. DOMAIN-LIST is a comma-separated list
+ of domains. Note that it does _not_ turn on ‘-H’.
+
+‘--exclude-domains DOMAIN-LIST’
+ Specify the domains that are _not_ to be followed (*note Spanning
+ Hosts::).
+
+‘--follow-ftp’
+ Follow FTP links from HTML documents. Without this option, Wget
+ will ignore all the FTP links.
+
+‘--follow-tags=LIST’
+ Wget has an internal table of HTML tag / attribute pairs that it
+ considers when looking for linked documents during a recursive
+ retrieval. If a user wants only a subset of those tags to be
+ considered, however, he or she should be specify such tags in a
+ comma-separated LIST with this option.
+
+‘--ignore-tags=LIST’
+ This is the opposite of the ‘--follow-tags’ option. To skip
+ certain HTML tags when recursively looking for documents to
+ download, specify them in a comma-separated LIST.
+
+ In the past, this option was the best bet for downloading a single
+ page and its requisites, using a command-line like:
+
+ wget --ignore-tags=a,area -H -k -K -r http://SITE/DOCUMENT
+
+ However, the author of this option came across a page with tags
+ like ‘<LINK REL="home" HREF="/">’ and came to the realization that
+ specifying tags to ignore was not enough. One can’t just tell Wget
+ to ignore ‘<LINK>’, because then stylesheets will not be
+ downloaded. Now the best bet for downloading a single page and its
+ requisites is the dedicated ‘--page-requisites’ option.
+
+‘--ignore-case’
+ Ignore case when matching files and directories. This influences
+ the behavior of -R, -A, -I, and -X options, as well as globbing
+ implemented when downloading from FTP sites. For example, with
+ this option, ‘-A "*.txt"’ will match ‘file1.txt’, but also
+ ‘file2.TXT’, ‘file3.TxT’, and so on. The quotes in the example are
+ to prevent the shell from expanding the pattern.
+
+‘-H’
+‘--span-hosts’
+ Enable spanning across hosts when doing recursive retrieving (*note
+ Spanning Hosts::).
+
+‘-L’
+‘--relative’
+ Follow relative links only. Useful for retrieving a specific home
+ page without any distractions, not even those from the same hosts
+ (*note Relative Links::).
+
+‘-I LIST’
+‘--include-directories=LIST’
+ Specify a comma-separated list of directories you wish to follow
+ when downloading (*note Directory-Based Limits::). Elements of
+ LIST may contain wildcards.
+
+‘-X LIST’
+‘--exclude-directories=LIST’
+ Specify a comma-separated list of directories you wish to exclude
+ from download (*note Directory-Based Limits::). Elements of LIST
+ may contain wildcards.
+
+‘-np’
+‘--no-parent’
+ Do not ever ascend to the parent directory when retrieving
+ recursively. This is a useful option, since it guarantees that
+ only the files _below_ a certain hierarchy will be downloaded.
+ *Note Directory-Based Limits::, for more details.
+
+
+File: wget.info, Node: Exit Status, Prev: Recursive Accept/Reject Options, Up: Invoking
+
+2.13 Exit Status
+================
+
+Wget may return one of several error codes if it encounters problems.
+
+0
+ No problems occurred.
+
+1
+ Generic error code.
+
+2
+ Parse error—for instance, when parsing command-line options, the
+ ‘.wgetrc’ or ‘.netrc’...
+
+3
+ File I/O error.
+
+4
+ Network failure.
+
+5
+ SSL verification failure.
+
+6
+ Username/password authentication failure.
+
+7
+ Protocol errors.
+
+8
+ Server issued an error response.
+
+ With the exceptions of 0 and 1, the lower-numbered exit codes take
+precedence over higher-numbered ones, when multiple types of errors are
+encountered.
+
+ In versions of Wget prior to 1.12, Wget’s exit status tended to be
+unhelpful and inconsistent. Recursive downloads would virtually always
+return 0 (success), regardless of any issues encountered, and
+non-recursive fetches only returned the status corresponding to the most
+recently-attempted download.
+
+
+File: wget.info, Node: Recursive Download, Next: Following Links, Prev: Invoking, Up: Top
+
+3 Recursive Download
+********************
+
+GNU Wget is capable of traversing parts of the Web (or a single HTTP or
+FTP server), following links and directory structure. We refer to this
+as to “recursive retrievalâ€, or “recursionâ€.
+
+ With HTTP URLs, Wget retrieves and parses the HTML or CSS from the
+given URL, retrieving the files the document refers to, through markup
+like ‘href’ or ‘src’, or CSS URI values specified using the ‘url()’
+functional notation. If the freshly downloaded file is also of type
+‘text/html’, ‘application/xhtml+xml’, or ‘text/css’, it will be parsed
+and followed further.
+
+ Recursive retrieval of HTTP and HTML/CSS content is “breadth-firstâ€.
+This means that Wget first downloads the requested document, then the
+documents linked from that document, then the documents linked by them,
+and so on. In other words, Wget first downloads the documents at depth
+1, then those at depth 2, and so on until the specified maximum depth.
+
+ The maximum “depth†to which the retrieval may descend is specified
+with the ‘-l’ option. The default maximum depth is five layers.
+
+ When retrieving an FTP URL recursively, Wget will retrieve all the
+data from the given directory tree (including the subdirectories up to
+the specified depth) on the remote server, creating its mirror image
+locally. FTP retrieval is also limited by the ‘depth’ parameter.
+Unlike HTTP recursion, FTP recursion is performed depth-first.
+
+ By default, Wget will create a local directory tree, corresponding to
+the one found on the remote server.
+
+ Recursive retrieving can find a number of applications, the most
+important of which is mirroring. It is also useful for WWW
+presentations, and any other opportunities where slow network
+connections should be bypassed by storing the files locally.
+
+ You should be warned that recursive downloads can overload the remote
+servers. Because of that, many administrators frown upon them and may
+ban access from your site if they detect very fast downloads of big
+amounts of content. When downloading from Internet servers, consider
+using the ‘-w’ option to introduce a delay between accesses to the
+server. The download will take a while longer, but the server
+administrator will not be alarmed by your rudeness.
+
+ Of course, recursive download may cause problems on your machine. If
+left to run unchecked, it can easily fill up the disk. If downloading
+from local network, it can also take bandwidth on the system, as well as
+consume memory and CPU.
+
+ Try to specify the criteria that match the kind of download you are
+trying to achieve. If you want to download only one page, use
+‘--page-requisites’ without any additional recursion. If you want to
+download things under one directory, use ‘-np’ to avoid downloading
+things from other directories. If you want to download all the files
+from one directory, use ‘-l 1’ to make sure the recursion depth never
+exceeds one. *Note Following Links::, for more information about this.
+
+ Recursive retrieval should be used with care. Don’t say you were not
+warned.
+
+
+File: wget.info, Node: Following Links, Next: Time-Stamping, Prev: Recursive Download, Up: Top
+
+4 Following Links
+*****************
+
+When retrieving recursively, one does not wish to retrieve loads of
+unnecessary data. Most of the time the users bear in mind exactly what
+they want to download, and want Wget to follow only specific links.
+
+ For example, if you wish to download the music archive from
+‘fly.srk.fer.hr’, you will not want to download all the home pages that
+happen to be referenced by an obscure part of the archive.
+
+ Wget possesses several mechanisms that allows you to fine-tune which
+links it will follow.
+
+* Menu:
+
+* Spanning Hosts:: (Un)limiting retrieval based on host name.
+* Types of Files:: Getting only certain files.
+* Directory-Based Limits:: Getting only certain directories.
+* Relative Links:: Follow relative links only.
+* FTP Links:: Following FTP links.
+
+
+File: wget.info, Node: Spanning Hosts, Next: Types of Files, Prev: Following Links, Up: Following Links
+
+4.1 Spanning Hosts
+==================
+
+Wget’s recursive retrieval normally refuses to visit hosts different
+than the one you specified on the command line. This is a reasonable
+default; without it, every retrieval would have the potential to turn
+your Wget into a small version of google.
+
+ However, visiting different hosts, or “host spanning,†is sometimes a
+useful option. Maybe the images are served from a different server.
+Maybe you’re mirroring a site that consists of pages interlinked between
+three servers. Maybe the server has two equivalent names, and the HTML
+pages refer to both interchangeably.
+
+Span to any host—‘-H’
+
+ The ‘-H’ option turns on host spanning, thus allowing Wget’s
+ recursive run to visit any host referenced by a link. Unless
+ sufficient recursion-limiting criteria are applied depth, these
+ foreign hosts will typically link to yet more hosts, and so on
+ until Wget ends up sucking up much more data than you have
+ intended.
+
+Limit spanning to certain domains—‘-D’
+
+ The ‘-D’ option allows you to specify the domains that will be
+ followed, thus limiting the recursion only to the hosts that belong
+ to these domains. Obviously, this makes sense only in conjunction
+ with ‘-H’. A typical example would be downloading the contents of
+ ‘www.example.com’, but allowing downloads from
+ ‘images.example.com’, etc.:
+
+ wget -rH -Dexample.com http://www.example.com/
+
+ You can specify more than one address by separating them with a
+ comma, e.g. ‘-Ddomain1.com,domain2.com’.
+
+Keep download off certain domains—‘--exclude-domains’
+
+ If there are domains you want to exclude specifically, you can do
+ it with ‘--exclude-domains’, which accepts the same type of
+ arguments of ‘-D’, but will _exclude_ all the listed domains. For
+ example, if you want to download all the hosts from ‘foo.edu’
+ domain, with the exception of ‘sunsite.foo.edu’, you can do it like
+ this:
+
+ wget -rH -Dfoo.edu --exclude-domains sunsite.foo.edu \
+ http://www.foo.edu/
+
+
+File: wget.info, Node: Types of Files, Next: Directory-Based Limits, Prev: Spanning Hosts, Up: Following Links
+
+4.2 Types of Files
+==================
+
+When downloading material from the web, you will often want to restrict
+the retrieval to only certain file types. For example, if you are
+interested in downloading GIFs, you will not be overjoyed to get loads
+of PostScript documents, and vice versa.
+
+ Wget offers two options to deal with this problem. Each option
+description lists a short name, a long name, and the equivalent command
+in ‘.wgetrc’.
+
+‘-A ACCLIST’
+‘--accept ACCLIST’
+‘accept = ACCLIST’
+‘--accept-regex URLREGEX’
+‘accept-regex = URLREGEX’
+ The argument to ‘--accept’ option is a list of file suffixes or
+ patterns that Wget will download during recursive retrieval. A
+ suffix is the ending part of a file, and consists of “normalâ€
+ letters, e.g. ‘gif’ or ‘.jpg’. A matching pattern contains
+ shell-like wildcards, e.g. ‘books*’ or ‘zelazny*196[0-9]*’.
+
+ So, specifying ‘wget -A gif,jpg’ will make Wget download only the
+ files ending with ‘gif’ or ‘jpg’, i.e. GIFs and JPEGs. On the
+ other hand, ‘wget -A "zelazny*196[0-9]*"’ will download only files
+ beginning with ‘zelazny’ and containing numbers from 1960 to 1969
+ anywhere within. Look up the manual of your shell for a
+ description of how pattern matching works.
+
+ Of course, any number of suffixes and patterns can be combined into
+ a comma-separated list, and given as an argument to ‘-A’.
+
+ The argument to ‘--accept-regex’ option is a regular expression
+ which is matched against the complete URL.
+
+‘-R REJLIST’
+‘--reject REJLIST’
+‘reject = REJLIST’
+‘--reject-regex URLREGEX’
+‘reject-regex = URLREGEX’
+ The ‘--reject’ option works the same way as ‘--accept’, only its
+ logic is the reverse; Wget will download all files _except_ the
+ ones matching the suffixes (or patterns) in the list.
+
+ So, if you want to download a whole page except for the cumbersome
+ MPEGs and .AU files, you can use ‘wget -R mpg,mpeg,au’.
+ Analogously, to download all files except the ones beginning with
+ ‘bjork’, use ‘wget -R "bjork*"’. The quotes are to prevent
+ expansion by the shell.
+
+ The argument to ‘--accept-regex’ option is a regular expression which
+is matched against the complete URL.
+
+The ‘-A’ and ‘-R’ options may be combined to achieve even better
+fine-tuning of which files to retrieve. E.g. ‘wget -A "*zelazny*" -R
+.ps’ will download all the files having ‘zelazny’ as a part of their
+name, but _not_ the PostScript files.
+
+ Note that these two options do not affect the downloading of HTML
+files (as determined by a ‘.htm’ or ‘.html’ filename prefix). This
+behavior may not be desirable for all users, and may be changed for
+future versions of Wget.
+
+ Note, too, that query strings (strings at the end of a URL beginning
+with a question mark (‘?’) are not included as part of the filename for
+accept/reject rules, even though these will actually contribute to the
+name chosen for the local file. It is expected that a future version of
+Wget will provide an option to allow matching against query strings.
+
+ Finally, it’s worth noting that the accept/reject lists are matched
+_twice_ against downloaded files: once against the URL’s filename
+portion, to determine if the file should be downloaded in the first
+place; then, after it has been accepted and successfully downloaded, the
+local file’s name is also checked against the accept/reject lists to see
+if it should be removed. The rationale was that, since ‘.htm’ and
+‘.html’ files are always downloaded regardless of accept/reject rules,
+they should be removed _after_ being downloaded and scanned for links,
+if they did match the accept/reject lists. However, this can lead to
+unexpected results, since the local filenames can differ from the
+original URL filenames in the following ways, all of which can change
+whether an accept/reject rule matches:
+
+ • If the local file already exists and ‘--no-directories’ was
+ specified, a numeric suffix will be appended to the original name.
+ • If ‘--adjust-extension’ was specified, the local filename might
+ have ‘.html’ appended to it. If Wget is invoked with ‘-E -A.php’,
+ a filename such as ‘index.php’ will match be accepted, but upon
+ download will be named ‘index.php.html’, which no longer matches,
+ and so the file will be deleted.
+ • Query strings do not contribute to URL matching, but are included
+ in local filenames, and so _do_ contribute to filename matching.
+
+This behavior, too, is considered less-than-desirable, and may change in
+a future version of Wget.
+
+
+File: wget.info, Node: Directory-Based Limits, Next: Relative Links, Prev: Types of Files, Up: Following Links
+
+4.3 Directory-Based Limits
+==========================
+
+Regardless of other link-following facilities, it is often useful to
+place the restriction of what files to retrieve based on the directories
+those files are placed in. There can be many reasons for this—the home
+pages may be organized in a reasonable directory structure; or some
+directories may contain useless information, e.g. ‘/cgi-bin’ or ‘/dev’
+directories.
+
+ Wget offers three different options to deal with this requirement.
+Each option description lists a short name, a long name, and the
+equivalent command in ‘.wgetrc’.
+
+‘-I LIST’
+‘--include LIST’
+‘include_directories = LIST’
+ ‘-I’ option accepts a comma-separated list of directories included
+ in the retrieval. Any other directories will simply be ignored.
+ The directories are absolute paths.
+
+ So, if you wish to download from ‘http://host/people/bozo/’
+ following only links to bozo’s colleagues in the ‘/people’
+ directory and the bogus scripts in ‘/cgi-bin’, you can specify:
+
+ wget -I /people,/cgi-bin http://host/people/bozo/
+
+‘-X LIST’
+‘--exclude LIST’
+‘exclude_directories = LIST’
+ ‘-X’ option is exactly the reverse of ‘-I’—this is a list of
+ directories _excluded_ from the download. E.g. if you do not want
+ Wget to download things from ‘/cgi-bin’ directory, specify ‘-X
+ /cgi-bin’ on the command line.
+
+ The same as with ‘-A’/‘-R’, these two options can be combined to
+ get a better fine-tuning of downloading subdirectories. E.g. if
+ you want to load all the files from ‘/pub’ hierarchy except for
+ ‘/pub/worthless’, specify ‘-I/pub -X/pub/worthless’.
+
+‘-np’
+‘--no-parent’
+‘no_parent = on’
+ The simplest, and often very useful way of limiting directories is
+ disallowing retrieval of the links that refer to the hierarchy
+ “above†than the beginning directory, i.e. disallowing ascent to
+ the parent directory/directories.
+
+ The ‘--no-parent’ option (short ‘-np’) is useful in this case.
+ Using it guarantees that you will never leave the existing
+ hierarchy. Supposing you issue Wget with:
+
+ wget -r --no-parent http://somehost/~luzer/my-archive/
+
+ You may rest assured that none of the references to
+ ‘/~his-girls-homepage/’ or ‘/~luzer/all-my-mpegs/’ will be
+ followed. Only the archive you are interested in will be
+ downloaded. Essentially, ‘--no-parent’ is similar to
+ ‘-I/~luzer/my-archive’, only it handles redirections in a more
+ intelligent fashion.
+
+ *Note* that, for HTTP (and HTTPS), the trailing slash is very
+ important to ‘--no-parent’. HTTP has no concept of a
+ “directoryâ€â€”Wget relies on you to indicate what’s a directory and
+ what isn’t. In ‘http://foo/bar/’, Wget will consider ‘bar’ to be a
+ directory, while in ‘http://foo/bar’ (no trailing slash), ‘bar’
+ will be considered a filename (so ‘--no-parent’ would be
+ meaningless, as its parent is ‘/’).
+
+
+File: wget.info, Node: Relative Links, Next: FTP Links, Prev: Directory-Based Limits, Up: Following Links
+
+4.4 Relative Links
+==================
+
+When ‘-L’ is turned on, only the relative links are ever followed.
+Relative links are here defined those that do not refer to the web
+server root. For example, these links are relative:
+
+ <a href="foo.gif">
+ <a href="foo/bar.gif">
+ <a href="../foo/bar.gif">
+
+ These links are not relative:
+
+ <a href="/foo.gif">
+ <a href="/foo/bar.gif">
+ <a href="http://www.example.com/foo/bar.gif">
+
+ Using this option guarantees that recursive retrieval will not span
+hosts, even without ‘-H’. In simple cases it also allows downloads to
+“just work†without having to convert links.
+
+ This option is probably not very useful and might be removed in a
+future release.
+
+
+File: wget.info, Node: FTP Links, Prev: Relative Links, Up: Following Links
+
+4.5 Following FTP Links
+=======================
+
+The rules for FTP are somewhat specific, as it is necessary for them to
+be. FTP links in HTML documents are often included for purposes of
+reference, and it is often inconvenient to download them by default.
+
+ To have FTP links followed from HTML documents, you need to specify
+the ‘--follow-ftp’ option. Having done that, FTP links will span hosts
+regardless of ‘-H’ setting. This is logical, as FTP links rarely point
+to the same host where the HTTP server resides. For similar reasons,
+the ‘-L’ options has no effect on such downloads. On the other hand,
+domain acceptance (‘-D’) and suffix rules (‘-A’ and ‘-R’) apply
+normally.
+
+ Also note that followed links to FTP directories will not be
+retrieved recursively further.
+
+
+File: wget.info, Node: Time-Stamping, Next: Startup File, Prev: Following Links, Up: Top
+
+5 Time-Stamping
+***************
+
+One of the most important aspects of mirroring information from the
+Internet is updating your archives.
+
+ Downloading the whole archive again and again, just to replace a few
+changed files is expensive, both in terms of wasted bandwidth and money,
+and the time to do the update. This is why all the mirroring tools
+offer the option of incremental updating.
+
+ Such an updating mechanism means that the remote server is scanned in
+search of “new†files. Only those new files will be downloaded in the
+place of the old ones.
+
+ A file is considered new if one of these two conditions are met:
+
+ 1. A file of that name does not already exist locally.
+
+ 2. A file of that name does exist, but the remote file was modified
+ more recently than the local file.
+
+ To implement this, the program needs to be aware of the time of last
+modification of both local and remote files. We call this information
+the “time-stamp†of a file.
+
+ The time-stamping in GNU Wget is turned on using ‘--timestamping’
+(‘-N’) option, or through ‘timestamping = on’ directive in ‘.wgetrc’.
+With this option, for each file it intends to download, Wget will check
+whether a local file of the same name exists. If it does, and the
+remote file is not newer, Wget will not download it.
+
+ If the local file does not exist, or the sizes of the files do not
+match, Wget will download the remote file no matter what the time-stamps
+say.
+
+* Menu:
+
+* Time-Stamping Usage::
+* HTTP Time-Stamping Internals::
+* FTP Time-Stamping Internals::
+
+
+File: wget.info, Node: Time-Stamping Usage, Next: HTTP Time-Stamping Internals, Prev: Time-Stamping, Up: Time-Stamping
+
+5.1 Time-Stamping Usage
+=======================
+
+The usage of time-stamping is simple. Say you would like to download a
+file so that it keeps its date of modification.
+
+ wget -S http://www.gnu.ai.mit.edu/
+
+ A simple ‘ls -l’ shows that the time stamp on the local file equals
+the state of the ‘Last-Modified’ header, as returned by the server. As
+you can see, the time-stamping info is preserved locally, even without
+‘-N’ (at least for HTTP).
+
+ Several days later, you would like Wget to check if the remote file
+has changed, and download it if it has.
+
+ wget -N http://www.gnu.ai.mit.edu/
+
+ Wget will ask the server for the last-modified date. If the local
+file has the same timestamp as the server, or a newer one, the remote
+file will not be re-fetched. However, if the remote file is more
+recent, Wget will proceed to fetch it.
+
+ The same goes for FTP. For example:
+
+ wget "ftp://ftp.ifi.uio.no/pub/emacs/gnus/*"
+
+ (The quotes around that URL are to prevent the shell from trying to
+interpret the ‘*’.)
+
+ After download, a local directory listing will show that the
+timestamps match those on the remote server. Reissuing the command with
+‘-N’ will make Wget re-fetch _only_ the files that have been modified
+since the last download.
+
+ If you wished to mirror the GNU archive every week, you would use a
+command like the following, weekly:
+
+ wget --timestamping -r ftp://ftp.gnu.org/pub/gnu/
+
+ Note that time-stamping will only work for files for which the server
+gives a timestamp. For HTTP, this depends on getting a ‘Last-Modified’
+header. For FTP, this depends on getting a directory listing with dates
+in a format that Wget can parse (*note FTP Time-Stamping Internals::).
+
+
+File: wget.info, Node: HTTP Time-Stamping Internals, Next: FTP Time-Stamping Internals, Prev: Time-Stamping Usage, Up: Time-Stamping
+
+5.2 HTTP Time-Stamping Internals
+================================
+
+Time-stamping in HTTP is implemented by checking of the ‘Last-Modified’
+header. If you wish to retrieve the file ‘foo.html’ through HTTP, Wget
+will check whether ‘foo.html’ exists locally. If it doesn’t, ‘foo.html’
+will be retrieved unconditionally.
+
+ If the file does exist locally, Wget will first check its local
+time-stamp (similar to the way ‘ls -l’ checks it), and then send a
+‘HEAD’ request to the remote server, demanding the information on the
+remote file.
+
+ The ‘Last-Modified’ header is examined to find which file was
+modified more recently (which makes it “newerâ€). If the remote file is
+newer, it will be downloaded; if it is older, Wget will give up.(1)
+
+ When ‘--backup-converted’ (‘-K’) is specified in conjunction with
+‘-N’, server file ‘X’ is compared to local file ‘X.orig’, if extant,
+rather than being compared to local file ‘X’, which will always differ
+if it’s been converted by ‘--convert-links’ (‘-k’).
+
+ Arguably, HTTP time-stamping should be implemented using the
+‘If-Modified-Since’ request.
+
+ ---------- Footnotes ----------
+
+ (1) As an additional check, Wget will look at the ‘Content-Length’
+header, and compare the sizes; if they are not the same, the remote file
+will be downloaded no matter what the time-stamp says.
+
+
+File: wget.info, Node: FTP Time-Stamping Internals, Prev: HTTP Time-Stamping Internals, Up: Time-Stamping
+
+5.3 FTP Time-Stamping Internals
+===============================
+
+In theory, FTP time-stamping works much the same as HTTP, only FTP has
+no headers—time-stamps must be ferreted out of directory listings.
+
+ If an FTP download is recursive or uses globbing, Wget will use the
+FTP ‘LIST’ command to get a file listing for the directory containing
+the desired file(s). It will try to analyze the listing, treating it
+like Unix ‘ls -l’ output, extracting the time-stamps. The rest is
+exactly the same as for HTTP. Note that when retrieving individual
+files from an FTP server without using globbing or recursion, listing
+files will not be downloaded (and thus files will not be time-stamped)
+unless ‘-N’ is specified.
+
+ Assumption that every directory listing is a Unix-style listing may
+sound extremely constraining, but in practice it is not, as many
+non-Unix FTP servers use the Unixoid listing format because most (all?)
+of the clients understand it. Bear in mind that RFC959 defines no
+standard way to get a file list, let alone the time-stamps. We can only
+hope that a future standard will define this.
+
+ Another non-standard solution includes the use of ‘MDTM’ command that
+is supported by some FTP servers (including the popular ‘wu-ftpd’),
+which returns the exact time of the specified file. Wget may support
+this command in the future.
+
+
+File: wget.info, Node: Startup File, Next: Examples, Prev: Time-Stamping, Up: Top
+
+6 Startup File
+**************
+
+Once you know how to change default settings of Wget through command
+line arguments, you may wish to make some of those settings permanent.
+You can do that in a convenient way by creating the Wget startup
+file—‘.wgetrc’.
+
+ Besides ‘.wgetrc’ is the “main†initialization file, it is convenient
+to have a special facility for storing passwords. Thus Wget reads and
+interprets the contents of ‘$HOME/.netrc’, if it finds it. You can find
+‘.netrc’ format in your system manuals.
+
+ Wget reads ‘.wgetrc’ upon startup, recognizing a limited set of
+commands.
+
+* Menu:
+
+* Wgetrc Location:: Location of various wgetrc files.
+* Wgetrc Syntax:: Syntax of wgetrc.
+* Wgetrc Commands:: List of available commands.
+* Sample Wgetrc:: A wgetrc example.
+
+
+File: wget.info, Node: Wgetrc Location, Next: Wgetrc Syntax, Prev: Startup File, Up: Startup File
+
+6.1 Wgetrc Location
+===================
+
+When initializing, Wget will look for a “global†startup file,
+‘/usr/local/etc/wgetrc’ by default (or some prefix other than
+‘/usr/local’, if Wget was not installed there) and read commands from
+there, if it exists.
+
+ Then it will look for the user’s file. If the environmental variable
+‘WGETRC’ is set, Wget will try to load that file. Failing that, no
+further attempts will be made.
+
+ If ‘WGETRC’ is not set, Wget will try to load ‘$HOME/.wgetrc’.
+
+ The fact that user’s settings are loaded after the system-wide ones
+means that in case of collision user’s wgetrc _overrides_ the
+system-wide wgetrc (in ‘/usr/local/etc/wgetrc’ by default). Fascist
+admins, away!
+
+
+File: wget.info, Node: Wgetrc Syntax, Next: Wgetrc Commands, Prev: Wgetrc Location, Up: Startup File
+
+6.2 Wgetrc Syntax
+=================
+
+The syntax of a wgetrc command is simple:
+
+ variable = value
+
+ The “variable†will also be called “commandâ€. Valid “values†are
+different for different commands.
+
+ The commands are case-, underscore- and minus-insensitive. Thus
+‘DIr__PrefiX’, ‘DIr-PrefiX’ and ‘dirprefix’ are the same. Empty lines,
+lines beginning with ‘#’ and lines containing white-space only are
+discarded.
+
+ Commands that expect a comma-separated list will clear the list on an
+empty command. So, if you wish to reset the rejection list specified in
+global ‘wgetrc’, you can do it with:
+
+ reject =
+
+
+File: wget.info, Node: Wgetrc Commands, Next: Sample Wgetrc, Prev: Wgetrc Syntax, Up: Startup File
+
+6.3 Wgetrc Commands
+===================
+
+The complete set of commands is listed below. Legal values are listed
+after the ‘=’. Simple Boolean values can be set or unset using ‘on’ and
+‘off’ or ‘1’ and ‘0’.
+
+ Some commands take pseudo-arbitrary values. ADDRESS values can be
+hostnames or dotted-quad IP addresses. N can be any positive integer,
+or ‘inf’ for infinity, where appropriate. STRING values can be any
+non-empty string.
+
+ Most of these commands have direct command-line equivalents. Also,
+any wgetrc command can be specified on the command line using the
+‘--execute’ switch (*note Basic Startup Options::.)
+
+accept/reject = STRING
+ Same as ‘-A’/‘-R’ (*note Types of Files::).
+
+add_hostdir = on/off
+ Enable/disable host-prefixed file names. ‘-nH’ disables it.
+
+ask_password = on/off
+ Prompt for a password for each connection established. Cannot be
+ specified when ‘--password’ is being used, because they are
+ mutually exclusive. Equivalent to ‘--ask-password’.
+
+auth_no_challenge = on/off
+ If this option is given, Wget will send Basic HTTP authentication
+ information (plaintext username and password) for all requests.
+ See ‘--auth-no-challenge’.
+
+background = on/off
+ Enable/disable going to background—the same as ‘-b’ (which enables
+ it).
+
+backup_converted = on/off
+ Enable/disable saving pre-converted files with the suffix
+ ‘.orig’—the same as ‘-K’ (which enables it).
+
+backups = NUMBER
+ Use up to NUMBER backups for a file. Backups are rotated by adding
+ an incremental counter that starts at ‘1’. The default is ‘0’.
+
+base = STRING
+ Consider relative URLs in input files (specified via the ‘input’
+ command or the ‘--input-file’/‘-i’ option, together with
+ ‘force_html’ or ‘--force-html’) as being relative to STRING—the
+ same as ‘--base=STRING’.
+
+bind_address = ADDRESS
+ Bind to ADDRESS, like the ‘--bind-address=ADDRESS’.
+
+ca_certificate = FILE
+ Set the certificate authority bundle file to FILE. The same as
+ ‘--ca-certificate=FILE’.
+
+ca_directory = DIRECTORY
+ Set the directory used for certificate authorities. The same as
+ ‘--ca-directory=DIRECTORY’.
+
+cache = on/off
+ When set to off, disallow server-caching. See the ‘--no-cache’
+ option.
+
+certificate = FILE
+ Set the client certificate file name to FILE. The same as
+ ‘--certificate=FILE’.
+
+certificate_type = STRING
+ Specify the type of the client certificate, legal values being
+ ‘PEM’ (the default) and ‘DER’ (aka ASN1). The same as
+ ‘--certificate-type=STRING’.
+
+check_certificate = on/off
+ If this is set to off, the server certificate is not checked
+ against the specified client authorities. The default is “onâ€.
+ The same as ‘--check-certificate’.
+
+connect_timeout = N
+ Set the connect timeout—the same as ‘--connect-timeout’.
+
+content_disposition = on/off
+ Turn on recognition of the (non-standard) ‘Content-Disposition’
+ HTTP header—if set to ‘on’, the same as ‘--content-disposition’.
+
+trust_server_names = on/off
+ If set to on, construct the local file name from redirection URLs
+ rather than original URLs.
+
+continue = on/off
+ If set to on, force continuation of preexistent partially retrieved
+ files. See ‘-c’ before setting it.
+
+convert_links = on/off
+ Convert non-relative links locally. The same as ‘-k’.
+
+cookies = on/off
+ When set to off, disallow cookies. See the ‘--cookies’ option.
+
+cut_dirs = N
+ Ignore N remote directory components. Equivalent to
+ ‘--cut-dirs=N’.
+
+debug = on/off
+ Debug mode, same as ‘-d’.
+
+default_page = STRING
+ Default page name—the same as ‘--default-page=STRING’.
+
+delete_after = on/off
+ Delete after download—the same as ‘--delete-after’.
+
+dir_prefix = STRING
+ Top of directory tree—the same as ‘-P STRING’.
+
+dirstruct = on/off
+ Turning dirstruct on or off—the same as ‘-x’ or ‘-nd’,
+ respectively.
+
+dns_cache = on/off
+ Turn DNS caching on/off. Since DNS caching is on by default, this
+ option is normally used to turn it off and is equivalent to
+ ‘--no-dns-cache’.
+
+dns_timeout = N
+ Set the DNS timeout—the same as ‘--dns-timeout’.
+
+domains = STRING
+ Same as ‘-D’ (*note Spanning Hosts::).
+
+dot_bytes = N
+ Specify the number of bytes “contained†in a dot, as seen
+ throughout the retrieval (1024 by default). You can postfix the
+ value with ‘k’ or ‘m’, representing kilobytes and megabytes,
+ respectively. With dot settings you can tailor the dot retrieval
+ to suit your needs, or you can use the predefined “styles†(*note
+ Download Options::).
+
+dot_spacing = N
+ Specify the number of dots in a single cluster (10 by default).
+
+dots_in_line = N
+ Specify the number of dots that will be printed in each line
+ throughout the retrieval (50 by default).
+
+egd_file = FILE
+ Use STRING as the EGD socket file name. The same as
+ ‘--egd-file=FILE’.
+
+exclude_directories = STRING
+ Specify a comma-separated list of directories you wish to exclude
+ from download—the same as ‘-X STRING’ (*note Directory-Based
+ Limits::).
+
+exclude_domains = STRING
+ Same as ‘--exclude-domains=STRING’ (*note Spanning Hosts::).
+
+follow_ftp = on/off
+ Follow FTP links from HTML documents—the same as ‘--follow-ftp’.
+
+follow_tags = STRING
+ Only follow certain HTML tags when doing a recursive retrieval,
+ just like ‘--follow-tags=STRING’.
+
+force_html = on/off
+ If set to on, force the input filename to be regarded as an HTML
+ document—the same as ‘-F’.
+
+ftp_password = STRING
+ Set your FTP password to STRING. Without this setting, the
+ password defaults to ‘-wget@’, which is a useful default for
+ anonymous FTP access.
+
+ This command used to be named ‘passwd’ prior to Wget 1.10.
+
+ftp_proxy = STRING
+ Use STRING as FTP proxy, instead of the one specified in
+ environment.
+
+ftp_user = STRING
+ Set FTP user to STRING.
+
+ This command used to be named ‘login’ prior to Wget 1.10.
+
+glob = on/off
+ Turn globbing on/off—the same as ‘--glob’ and ‘--no-glob’.
+
+header = STRING
+ Define a header for HTTP downloads, like using ‘--header=STRING’.
+
+compression = STRING
+ Choose the compression type to be used. Legal values are ‘auto’
+ (the default), ‘gzip’, and ‘none’. The same as
+ ‘--compression=STRING’.
+
+adjust_extension = on/off
+ Add a ‘.html’ extension to ‘text/html’ or ‘application/xhtml+xml’
+ files that lack one, a ‘.css’ extension to ‘text/css’ files that
+ lack one, and a ‘.br’, ‘.Z’, ‘.zlib’ or ‘.gz’ to compressed files
+ like ‘-E’. Previously named ‘html_extension’ (still acceptable,
+ but deprecated).
+
+http_keep_alive = on/off
+ Turn the keep-alive feature on or off (defaults to on). Turning it
+ off is equivalent to ‘--no-http-keep-alive’.
+
+http_password = STRING
+ Set HTTP password, equivalent to ‘--http-password=STRING’.
+
+http_proxy = STRING
+ Use STRING as HTTP proxy, instead of the one specified in
+ environment.
+
+http_user = STRING
+ Set HTTP user to STRING, equivalent to ‘--http-user=STRING’.
+
+https_only = on/off
+ When in recursive mode, only HTTPS links are followed (defaults to
+ off).
+
+https_proxy = STRING
+ Use STRING as HTTPS proxy, instead of the one specified in
+ environment.
+
+ignore_case = on/off
+ When set to on, match files and directories case insensitively; the
+ same as ‘--ignore-case’.
+
+ignore_length = on/off
+ When set to on, ignore ‘Content-Length’ header; the same as
+ ‘--ignore-length’.
+
+ignore_tags = STRING
+ Ignore certain HTML tags when doing a recursive retrieval, like
+ ‘--ignore-tags=STRING’.
+
+include_directories = STRING
+ Specify a comma-separated list of directories you wish to follow
+ when downloading—the same as ‘-I STRING’.
+
+iri = on/off
+ When set to on, enable internationalized URI (IRI) support; the
+ same as ‘--iri’.
+
+inet4_only = on/off
+ Force connecting to IPv4 addresses, off by default. You can put
+ this in the global init file to disable Wget’s attempts to resolve
+ and connect to IPv6 hosts. Available only if Wget was compiled
+ with IPv6 support. The same as ‘--inet4-only’ or ‘-4’.
+
+inet6_only = on/off
+ Force connecting to IPv6 addresses, off by default. Available only
+ if Wget was compiled with IPv6 support. The same as ‘--inet6-only’
+ or ‘-6’.
+
+input = FILE
+ Read the URLs from STRING, like ‘-i FILE’.
+
+keep_session_cookies = on/off
+ When specified, causes ‘save_cookies = on’ to also save session
+ cookies. See ‘--keep-session-cookies’.
+
+limit_rate = RATE
+ Limit the download speed to no more than RATE bytes per second.
+ The same as ‘--limit-rate=RATE’.
+
+load_cookies = FILE
+ Load cookies from FILE. See ‘--load-cookies FILE’.
+
+local_encoding = ENCODING
+ Force Wget to use ENCODING as the default system encoding. See
+ ‘--local-encoding’.
+
+logfile = FILE
+ Set logfile to FILE, the same as ‘-o FILE’.
+
+max_redirect = NUMBER
+ Specifies the maximum number of redirections to follow for a
+ resource. See ‘--max-redirect=NUMBER’.
+
+mirror = on/off
+ Turn mirroring on/off. The same as ‘-m’.
+
+netrc = on/off
+ Turn reading netrc on or off.
+
+no_clobber = on/off
+ Same as ‘-nc’.
+
+no_parent = on/off
+ Disallow retrieving outside the directory hierarchy, like
+ ‘--no-parent’ (*note Directory-Based Limits::).
+
+no_proxy = STRING
+ Use STRING as the comma-separated list of domains to avoid in proxy
+ loading, instead of the one specified in environment.
+
+output_document = FILE
+ Set the output filename—the same as ‘-O FILE’.
+
+page_requisites = on/off
+ Download all ancillary documents necessary for a single HTML page
+ to display properly—the same as ‘-p’.
+
+passive_ftp = on/off
+ Change setting of passive FTP, equivalent to the ‘--passive-ftp’
+ option.
+
+password = STRING
+ Specify password STRING for both FTP and HTTP file retrieval. This
+ command can be overridden using the ‘ftp_password’ and
+ ‘http_password’ command for FTP and HTTP respectively.
+
+post_data = STRING
+ Use POST as the method for all HTTP requests and send STRING in the
+ request body. The same as ‘--post-data=STRING’.
+
+post_file = FILE
+ Use POST as the method for all HTTP requests and send the contents
+ of FILE in the request body. The same as ‘--post-file=FILE’.
+
+prefer_family = none/IPv4/IPv6
+ When given a choice of several addresses, connect to the addresses
+ with specified address family first. The address order returned by
+ DNS is used without change by default. The same as
+ ‘--prefer-family’, which see for a detailed discussion of why this
+ is useful.
+
+private_key = FILE
+ Set the private key file to FILE. The same as
+ ‘--private-key=FILE’.
+
+private_key_type = STRING
+ Specify the type of the private key, legal values being ‘PEM’ (the
+ default) and ‘DER’ (aka ASN1). The same as
+ ‘--private-type=STRING’.
+
+progress = STRING
+ Set the type of the progress indicator. Legal types are ‘dot’ and
+ ‘bar’. Equivalent to ‘--progress=STRING’.
+
+protocol_directories = on/off
+ When set, use the protocol name as a directory component of local
+ file names. The same as ‘--protocol-directories’.
+
+proxy_password = STRING
+ Set proxy authentication password to STRING, like
+ ‘--proxy-password=STRING’.
+
+proxy_user = STRING
+ Set proxy authentication user name to STRING, like
+ ‘--proxy-user=STRING’.
+
+quiet = on/off
+ Quiet mode—the same as ‘-q’.
+
+quota = QUOTA
+ Specify the download quota, which is useful to put in the global
+ ‘wgetrc’. When download quota is specified, Wget will stop
+ retrieving after the download sum has become greater than quota.
+ The quota can be specified in bytes (default), kbytes ‘k’ appended)
+ or mbytes (‘m’ appended). Thus ‘quota = 5m’ will set the quota to
+ 5 megabytes. Note that the user’s startup file overrides system
+ settings.
+
+random_file = FILE
+ Use FILE as a source of randomness on systems lacking
+ ‘/dev/random’.
+
+random_wait = on/off
+ Turn random between-request wait times on or off. The same as
+ ‘--random-wait’.
+
+read_timeout = N
+ Set the read (and write) timeout—the same as ‘--read-timeout=N’.
+
+reclevel = N
+ Recursion level (depth)—the same as ‘-l N’.
+
+recursive = on/off
+ Recursive on/off—the same as ‘-r’.
+
+referer = STRING
+ Set HTTP ‘Referer:’ header just like ‘--referer=STRING’. (Note
+ that it was the folks who wrote the HTTP spec who got the spelling
+ of “referrer†wrong.)
+
+relative_only = on/off
+ Follow only relative links—the same as ‘-L’ (*note Relative
+ Links::).
+
+remote_encoding = ENCODING
+ Force Wget to use ENCODING as the default remote server encoding.
+ See ‘--remote-encoding’.
+
+remove_listing = on/off
+ If set to on, remove FTP listings downloaded by Wget. Setting it
+ to off is the same as ‘--no-remove-listing’.
+
+restrict_file_names = unix/windows
+ Restrict the file names generated by Wget from URLs. See
+ ‘--restrict-file-names’ for a more detailed description.
+
+retr_symlinks = on/off
+ When set to on, retrieve symbolic links as if they were plain
+ files; the same as ‘--retr-symlinks’.
+
+retry_connrefused = on/off
+ When set to on, consider “connection refused†a transient error—the
+ same as ‘--retry-connrefused’.
+
+robots = on/off
+ Specify whether the norobots convention is respected by Wget, “onâ€
+ by default. This switch controls both the ‘/robots.txt’ and the
+ ‘nofollow’ aspect of the spec. *Note Robot Exclusion::, for more
+ details about this. Be sure you know what you are doing before
+ turning this off.
+
+save_cookies = FILE
+ Save cookies to FILE. The same as ‘--save-cookies FILE’.
+
+save_headers = on/off
+ Same as ‘--save-headers’.
+
+secure_protocol = STRING
+ Choose the secure protocol to be used. Legal values are ‘auto’
+ (the default), ‘SSLv2’, ‘SSLv3’, and ‘TLSv1’. The same as
+ ‘--secure-protocol=STRING’.
+
+server_response = on/off
+ Choose whether or not to print the HTTP and FTP server
+ responses—the same as ‘-S’.
+
+show_all_dns_entries = on/off
+ When a DNS name is resolved, show all the IP addresses, not just
+ the first three.
+
+span_hosts = on/off
+ Same as ‘-H’.
+
+spider = on/off
+ Same as ‘--spider’.
+
+strict_comments = on/off
+ Same as ‘--strict-comments’.
+
+timeout = N
+ Set all applicable timeout values to N, the same as ‘-T N’.
+
+timestamping = on/off
+ Turn timestamping on/off. The same as ‘-N’ (*note
+ Time-Stamping::).
+
+use_server_timestamps = on/off
+ If set to ‘off’, Wget won’t set the local file’s timestamp by the
+ one on the server (same as ‘--no-use-server-timestamps’).
+
+tries = N
+ Set number of retries per URL—the same as ‘-t N’.
+
+use_proxy = on/off
+ When set to off, don’t use proxy even when proxy-related
+ environment variables are set. In that case it is the same as
+ using ‘--no-proxy’.
+
+user = STRING
+ Specify username STRING for both FTP and HTTP file retrieval. This
+ command can be overridden using the ‘ftp_user’ and ‘http_user’
+ command for FTP and HTTP respectively.
+
+user_agent = STRING
+ User agent identification sent to the HTTP Server—the same as
+ ‘--user-agent=STRING’.
+
+verbose = on/off
+ Turn verbose on/off—the same as ‘-v’/‘-nv’.
+
+wait = N
+ Wait N seconds between retrievals—the same as ‘-w N’.
+
+wait_retry = N
+ Wait up to N seconds between retries of failed retrievals only—the
+ same as ‘--waitretry=N’. Note that this is turned on by default in
+ the global ‘wgetrc’.
+
+
+File: wget.info, Node: Sample Wgetrc, Prev: Wgetrc Commands, Up: Startup File
+
+6.4 Sample Wgetrc
+=================
+
+This is the sample initialization file, as given in the distribution.
+It is divided in two section—one for global usage (suitable for global
+startup file), and one for local usage (suitable for ‘$HOME/.wgetrc’).
+Be careful about the things you change.
+
+ Note that almost all the lines are commented out. For a command to
+have any effect, you must remove the ‘#’ character at the beginning of
+its line.
+
+ ###
+ ### Sample Wget initialization file .wgetrc
+ ###
+
+ ## You can use this file to change the default behaviour of wget or to
+ ## avoid having to type many many command-line options. This file does
+ ## not contain a comprehensive list of commands -- look at the manual
+ ## to find out what you can put into this file. You can find this here:
+ ## $ info wget.info 'Startup File'
+ ## Or online here:
+ ## https://www.gnu.org/software/wget/manual/wget.html#Startup-File
+ ##
+ ## Wget initialization file can reside in /usr/local/etc/wgetrc
+ ## (global, for all users) or $HOME/.wgetrc (for a single user).
+ ##
+ ## To use the settings in this file, you will have to uncomment them,
+ ## as well as change them, in most cases, as the values on the
+ ## commented-out lines are the default values (e.g. "off").
+ ##
+ ## Command are case-, underscore- and minus-insensitive.
+ ## For example ftp_proxy, ftp-proxy and ftpproxy are the same.
+
+
+ ##
+ ## Global settings (useful for setting up in /usr/local/etc/wgetrc).
+ ## Think well before you change them, since they may reduce wget's
+ ## functionality, and make it behave contrary to the documentation:
+ ##
+
+ # You can set retrieve quota for beginners by specifying a value
+ # optionally followed by 'K' (kilobytes) or 'M' (megabytes). The
+ # default quota is unlimited.
+ #quota = inf
+
+ # You can lower (or raise) the default number of retries when
+ # downloading a file (default is 20).
+ #tries = 20
+
+ # Lowering the maximum depth of the recursive retrieval is handy to
+ # prevent newbies from going too "deep" when they unwittingly start
+ # the recursive retrieval. The default is 5.
+ #reclevel = 5
+
+ # By default Wget uses "passive FTP" transfer where the client
+ # initiates the data connection to the server rather than the other
+ # way around. That is required on systems behind NAT where the client
+ # computer cannot be easily reached from the Internet. However, some
+ # firewalls software explicitly supports active FTP and in fact has
+ # problems supporting passive transfer. If you are in such
+ # environment, use "passive_ftp = off" to revert to active FTP.
+ #passive_ftp = off
+
+ # The "wait" command below makes Wget wait between every connection.
+ # If, instead, you want Wget to wait only between retries of failed
+ # downloads, set waitretry to maximum number of seconds to wait (Wget
+ # will use "linear backoff", waiting 1 second after the first failure
+ # on a file, 2 seconds after the second failure, etc. up to this max).
+ #waitretry = 10
+
+
+ ##
+ ## Local settings (for a user to set in his $HOME/.wgetrc). It is
+ ## *highly* undesirable to put these settings in the global file, since
+ ## they are potentially dangerous to "normal" users.
+ ##
+ ## Even when setting up your own ~/.wgetrc, you should know what you
+ ## are doing before doing so.
+ ##
+
+ # Set this to on to use timestamping by default:
+ #timestamping = off
+
+ # It is a good idea to make Wget send your email address in a `From:'
+ # header with your request (so that server administrators can contact
+ # you in case of errors). Wget does *not* send `From:' by default.
+ #header = From: Your Name <username@site.domain>
+
+ # You can set up other headers, like Accept-Language. Accept-Language
+ # is *not* sent by default.
+ #header = Accept-Language: en
+
+ # You can set the default proxies for Wget to use for http, https, and ftp.
+ # They will override the value in the environment.
+ #https_proxy = http://proxy.yoyodyne.com:18023/
+ #http_proxy = http://proxy.yoyodyne.com:18023/
+ #ftp_proxy = http://proxy.yoyodyne.com:18023/
+
+ # If you do not want to use proxy at all, set this to off.
+ #use_proxy = on
+
+ # You can customize the retrieval outlook. Valid options are default,
+ # binary, mega and micro.
+ #dot_style = default
+
+ # Setting this to off makes Wget not download /robots.txt. Be sure to
+ # know *exactly* what /robots.txt is and how it is used before changing
+ # the default!
+ #robots = on
+
+ # It can be useful to make Wget wait between connections. Set this to
+ # the number of seconds you want Wget to wait.
+ #wait = 0
+
+ # You can force creating directory structure, even if a single is being
+ # retrieved, by setting this to on.
+ #dirstruct = off
+
+ # You can turn on recursive retrieving by default (don't do this if
+ # you are not sure you know what it means) by setting this to on.
+ #recursive = off
+
+ # To always back up file X as X.orig before converting its links (due
+ # to -k / --convert-links / convert_links = on having been specified),
+ # set this variable to on:
+ #backup_converted = off
+
+ # To have Wget follow FTP links from HTML files by default, set this
+ # to on:
+ #follow_ftp = off
+
+ # To try ipv6 addresses first:
+ #prefer-family = IPv6
+
+ # Set default IRI support state
+ #iri = off
+
+ # Force the default system encoding
+ #localencoding = UTF-8
+
+ # Force the default remote server encoding
+ #remoteencoding = UTF-8
+
+ # Turn on to prevent following non-HTTPS links when in recursive mode
+ #httpsonly = off
+
+ # Tune HTTPS security (auto, SSLv2, SSLv3, TLSv1, PFS)
+ #secureprotocol = auto
+
+
+File: wget.info, Node: Examples, Next: Various, Prev: Startup File, Up: Top
+
+7 Examples
+**********
+
+The examples are divided into three sections loosely based on their
+complexity.
+
+* Menu:
+
+* Simple Usage:: Simple, basic usage of the program.
+* Advanced Usage:: Advanced tips.
+* Very Advanced Usage:: The hairy stuff.
+
+
+File: wget.info, Node: Simple Usage, Next: Advanced Usage, Prev: Examples, Up: Examples
+
+7.1 Simple Usage
+================
+
+ • Say you want to download a URL. Just type:
+
+ wget http://fly.srk.fer.hr/
+
+ • But what will happen if the connection is slow, and the file is
+ lengthy? The connection will probably fail before the whole file
+ is retrieved, more than once. In this case, Wget will try getting
+ the file until it either gets the whole of it, or exceeds the
+ default number of retries (this being 20). It is easy to change
+ the number of tries to 45, to insure that the whole file will
+ arrive safely:
+
+ wget --tries=45 http://fly.srk.fer.hr/jpg/flyweb.jpg
+
+ • Now let’s leave Wget to work in the background, and write its
+ progress to log file ‘log’. It is tiring to type ‘--tries’, so we
+ shall use ‘-t’.
+
+ wget -t 45 -o log http://fly.srk.fer.hr/jpg/flyweb.jpg &
+
+ The ampersand at the end of the line makes sure that Wget works in
+ the background. To unlimit the number of retries, use ‘-t inf’.
+
+ • The usage of FTP is as simple. Wget will take care of login and
+ password.
+
+ wget ftp://gnjilux.srk.fer.hr/welcome.msg
+
+ • If you specify a directory, Wget will retrieve the directory
+ listing, parse it and convert it to HTML. Try:
+
+ wget ftp://ftp.gnu.org/pub/gnu/
+ links index.html
+
+
+File: wget.info, Node: Advanced Usage, Next: Very Advanced Usage, Prev: Simple Usage, Up: Examples
+
+7.2 Advanced Usage
+==================
+
+ • You have a file that contains the URLs you want to download? Use
+ the ‘-i’ switch:
+
+ wget -i FILE
+
+ If you specify ‘-’ as file name, the URLs will be read from
+ standard input.
+
+ • Create a five levels deep mirror image of the GNU web site, with
+ the same directory structure the original has, with only one try
+ per document, saving the log of the activities to ‘gnulog’:
+
+ wget -r https://www.gnu.org/ -o gnulog
+
+ • The same as the above, but convert the links in the downloaded
+ files to point to local files, so you can view the documents
+ off-line:
+
+ wget --convert-links -r https://www.gnu.org/ -o gnulog
+
+ • Retrieve only one HTML page, but make sure that all the elements
+ needed for the page to be displayed, such as inline images and
+ external style sheets, are also downloaded. Also make sure the
+ downloaded page references the downloaded links.
+
+ wget -p --convert-links http://www.example.com/dir/page.html
+
+ The HTML page will be saved to ‘www.example.com/dir/page.html’, and
+ the images, stylesheets, etc., somewhere under ‘www.example.com/’,
+ depending on where they were on the remote server.
+
+ • The same as the above, but without the ‘www.example.com/’
+ directory. In fact, I don’t want to have all those random server
+ directories anyway—just save _all_ those files under a ‘download/’
+ subdirectory of the current directory.
+
+ wget -p --convert-links -nH -nd -Pdownload \
+ http://www.example.com/dir/page.html
+
+ • Retrieve the index.html of ‘www.lycos.com’, showing the original
+ server headers:
+
+ wget -S http://www.lycos.com/
+
+ • Save the server headers with the file, perhaps for post-processing.
+
+ wget --save-headers http://www.lycos.com/
+ more index.html
+
+ • Retrieve the first two levels of ‘wuarchive.wustl.edu’, saving them
+ to ‘/tmp’.
+
+ wget -r -l2 -P/tmp ftp://wuarchive.wustl.edu/
+
+ • You want to download all the GIFs from a directory on an HTTP
+ server. You tried ‘wget http://www.example.com/dir/*.gif’, but
+ that didn’t work because HTTP retrieval does not support globbing.
+ In that case, use:
+
+ wget -r -l1 --no-parent -A.gif http://www.example.com/dir/
+
+ More verbose, but the effect is the same. ‘-r -l1’ means to
+ retrieve recursively (*note Recursive Download::), with maximum
+ depth of 1. ‘--no-parent’ means that references to the parent
+ directory are ignored (*note Directory-Based Limits::), and
+ ‘-A.gif’ means to download only the GIF files. ‘-A "*.gif"’ would
+ have worked too.
+
+ • Suppose you were in the middle of downloading, when Wget was
+ interrupted. Now you do not want to clobber the files already
+ present. It would be:
+
+ wget -nc -r https://www.gnu.org/
+
+ • If you want to encode your own username and password to HTTP or
+ FTP, use the appropriate URL syntax (*note URL Format::).
+
+ wget ftp://hniksic:mypassword@unix.example.com/.emacs
+
+ Note, however, that this usage is not advisable on multi-user
+ systems because it reveals your password to anyone who looks at the
+ output of ‘ps’.
+
+ • You would like the output documents to go to standard output
+ instead of to files?
+
+ wget -O - http://jagor.srce.hr/ http://www.srce.hr/
+
+ You can also combine the two options and make pipelines to retrieve
+ the documents from remote hotlists:
+
+ wget -O - http://cool.list.com/ | wget --force-html -i -
+
+
+File: wget.info, Node: Very Advanced Usage, Prev: Advanced Usage, Up: Examples
+
+7.3 Very Advanced Usage
+=======================
+
+ • If you wish Wget to keep a mirror of a page (or FTP
+ subdirectories), use ‘--mirror’ (‘-m’), which is the shorthand for
+ ‘-r -l inf -N’. You can put Wget in the crontab file asking it to
+ recheck a site each Sunday:
+
+ crontab
+ 0 0 * * 0 wget --mirror https://www.gnu.org/ -o /home/me/weeklog
+
+ • In addition to the above, you want the links to be converted for
+ local viewing. But, after having read this manual, you know that
+ link conversion doesn’t play well with timestamping, so you also
+ want Wget to back up the original HTML files before the conversion.
+ Wget invocation would look like this:
+
+ wget --mirror --convert-links --backup-converted \
+ https://www.gnu.org/ -o /home/me/weeklog
+
+ • But you’ve also noticed that local viewing doesn’t work all that
+ well when HTML files are saved under extensions other than ‘.html’,
+ perhaps because they were served as ‘index.cgi’. So you’d like
+ Wget to rename all the files served with content-type ‘text/html’
+ or ‘application/xhtml+xml’ to ‘NAME.html’.
+
+ wget --mirror --convert-links --backup-converted \
+ --html-extension -o /home/me/weeklog \
+ https://www.gnu.org/
+
+ Or, with less typing:
+
+ wget -m -k -K -E https://www.gnu.org/ -o /home/me/weeklog
+
+
+File: wget.info, Node: Various, Next: Appendices, Prev: Examples, Up: Top
+
+8 Various
+*********
+
+This chapter contains all the stuff that could not fit anywhere else.
+
+* Menu:
+
+* Proxies:: Support for proxy servers.
+* Distribution:: Getting the latest version.
+* Web Site:: GNU Wget’s presence on the World Wide Web.
+* Mailing Lists:: Wget mailing list for announcements and discussion.
+* Internet Relay Chat:: Wget’s presence on IRC.
+* Reporting Bugs:: How and where to report bugs.
+* Portability:: The systems Wget works on.
+* Signals:: Signal-handling performed by Wget.
+
+
+File: wget.info, Node: Proxies, Next: Distribution, Prev: Various, Up: Various
+
+8.1 Proxies
+===========
+
+“Proxies†are special-purpose HTTP servers designed to transfer data
+from remote servers to local clients. One typical use of proxies is
+lightening network load for users behind a slow connection. This is
+achieved by channeling all HTTP and FTP requests through the proxy which
+caches the transferred data. When a cached resource is requested again,
+proxy will return the data from cache. Another use for proxies is for
+companies that separate (for security reasons) their internal networks
+from the rest of Internet. In order to obtain information from the Web,
+their users connect and retrieve remote data using an authorized proxy.
+
+ Wget supports proxies for both HTTP and FTP retrievals. The standard
+way to specify proxy location, which Wget recognizes, is using the
+following environment variables:
+
+‘http_proxy’
+‘https_proxy’
+ If set, the ‘http_proxy’ and ‘https_proxy’ variables should contain
+ the URLs of the proxies for HTTP and HTTPS connections
+ respectively.
+
+‘ftp_proxy’
+ This variable should contain the URL of the proxy for FTP
+ connections. It is quite common that ‘http_proxy’ and ‘ftp_proxy’
+ are set to the same URL.
+
+‘no_proxy’
+ This variable should contain a comma-separated list of domain
+ extensions proxy should _not_ be used for. For instance, if the
+ value of ‘no_proxy’ is ‘.mit.edu’, proxy will not be used to
+ retrieve documents from MIT.
+
+ In addition to the environment variables, proxy location and settings
+may be specified from within Wget itself.
+
+‘--no-proxy’
+‘proxy = on/off’
+ This option and the corresponding command may be used to suppress
+ the use of proxy, even if the appropriate environment variables are
+ set.
+
+‘http_proxy = URL’
+‘https_proxy = URL’
+‘ftp_proxy = URL’
+‘no_proxy = STRING’
+ These startup file variables allow you to override the proxy
+ settings specified by the environment.
+
+ Some proxy servers require authorization to enable you to use them.
+The authorization consists of “username†and “passwordâ€, which must be
+sent by Wget. As with HTTP authorization, several authentication
+schemes exist. For proxy authorization only the ‘Basic’ authentication
+scheme is currently implemented.
+
+ You may specify your username and password either through the proxy
+URL or through the command-line options. Assuming that the company’s
+proxy is located at ‘proxy.company.com’ at port 8001, a proxy URL
+location containing authorization data might look like this:
+
+ http://hniksic:mypassword@proxy.company.com:8001/
+
+ Alternatively, you may use the ‘proxy-user’ and ‘proxy-password’
+options, and the equivalent ‘.wgetrc’ settings ‘proxy_user’ and
+‘proxy_password’ to set the proxy username and password.
+
+
+File: wget.info, Node: Distribution, Next: Web Site, Prev: Proxies, Up: Various
+
+8.2 Distribution
+================
+
+Like all GNU utilities, the latest version of Wget can be found at the
+master GNU archive site ftp.gnu.org, and its mirrors. For example, Wget
+1.21 can be found at <https://ftp.gnu.org/pub/gnu/wget/wget-1.21.tar.gz>
+
+
+File: wget.info, Node: Web Site, Next: Mailing Lists, Prev: Distribution, Up: Various
+
+8.3 Web Site
+============
+
+The official web site for GNU Wget is at
+<https//www.gnu.org/software/wget/>. However, most useful information
+resides at “The Wget Wgikiâ€, <http://wget.addictivecode.org/>.
+
+
+File: wget.info, Node: Mailing Lists, Next: Internet Relay Chat, Prev: Web Site, Up: Various
+
+8.4 Mailing Lists
+=================
+
+Primary List
+------------
+
+The primary mailinglist for discussion, bug-reports, or questions about
+GNU Wget is at <bug-wget@gnu.org>. To subscribe, send an email to
+<bug-wget-join@gnu.org>, or visit
+<https://lists.gnu.org/mailman/listinfo/bug-wget>.
+
+ You do not need to subscribe to send a message to the list; however,
+please note that unsubscribed messages are moderated, and may take a
+while before they hit the list—*usually around a day*. If you want your
+message to show up immediately, please subscribe to the list before
+posting. Archives for the list may be found at
+<https://lists.gnu.org/archive/html/bug-wget/>.
+
+ An NNTP/Usenettish gateway is also available via Gmane
+(http://gmane.org/about.php). You can see the Gmane archives at
+<http://news.gmane.org/gmane.comp.web.wget.general>. Note that the
+Gmane archives conveniently include messages from both the current list,
+and the previous one. Messages also show up in the Gmane archives
+sooner than they do at <https://lists.gnu.org>.
+
+Obsolete Lists
+--------------
+
+Previously, the mailing list <wget@sunsite.dk> was used as the main
+discussion list, and another list, <wget-patches@sunsite.dk> was used
+for submitting and discussing patches to GNU Wget.
+
+ Messages from <wget@sunsite.dk> are archived at
+ <https://www.mail-archive.com/wget%40sunsite.dk/> and at
+ <http://news.gmane.org/gmane.comp.web.wget.general> (which also
+ continues to archive the current list, <bug-wget@gnu.org>).
+
+ Messages from <wget-patches@sunsite.dk> are archived at
+ <http://news.gmane.org/gmane.comp.web.wget.patches>.
+
+
+File: wget.info, Node: Internet Relay Chat, Next: Reporting Bugs, Prev: Mailing Lists, Up: Various
+
+8.5 Internet Relay Chat
+=======================
+
+In addition to the mailinglists, we also have a support channel set up
+via IRC at ‘irc.freenode.org’, ‘#wget’. Come check it out!
+
+
+File: wget.info, Node: Reporting Bugs, Next: Portability, Prev: Internet Relay Chat, Up: Various
+
+8.6 Reporting Bugs
+==================
+
+You are welcome to submit bug reports via the GNU Wget bug tracker (see
+<https://savannah.gnu.org/bugs/?func=additem&group=wget>) or to our
+mailing list <bug-wget@gnu.org>.
+
+ Visit <https://lists.gnu.org/mailman/listinfo/bug-wget> to get more
+info (how to subscribe, list archives, ...).
+
+ Before actually submitting a bug report, please try to follow a few
+simple guidelines.
+
+ 1. Please try to ascertain that the behavior you see really is a bug.
+ If Wget crashes, it’s a bug. If Wget does not behave as
+ documented, it’s a bug. If things work strange, but you are not
+ sure about the way they are supposed to work, it might well be a
+ bug, but you might want to double-check the documentation and the
+ mailing lists (*note Mailing Lists::).
+
+ 2. Try to repeat the bug in as simple circumstances as possible. E.g.
+ if Wget crashes while downloading ‘wget -rl0 -kKE -t5 --no-proxy
+ http://example.com -o /tmp/log’, you should try to see if the crash
+ is repeatable, and if will occur with a simpler set of options.
+ You might even try to start the download at the page where the
+ crash occurred to see if that page somehow triggered the crash.
+
+ Also, while I will probably be interested to know the contents of
+ your ‘.wgetrc’ file, just dumping it into the debug message is
+ probably a bad idea. Instead, you should first try to see if the
+ bug repeats with ‘.wgetrc’ moved out of the way. Only if it turns
+ out that ‘.wgetrc’ settings affect the bug, mail me the relevant
+ parts of the file.
+
+ 3. Please start Wget with ‘-d’ option and send us the resulting output
+ (or relevant parts thereof). If Wget was compiled without debug
+ support, recompile it—it is _much_ easier to trace bugs with debug
+ support on.
+
+ Note: please make sure to remove any potentially sensitive
+ information from the debug log before sending it to the bug
+ address. The ‘-d’ won’t go out of its way to collect sensitive
+ information, but the log _will_ contain a fairly complete
+ transcript of Wget’s communication with the server, which may
+ include passwords and pieces of downloaded data. Since the bug
+ address is publicly archived, you may assume that all bug reports
+ are visible to the public.
+
+ 4. If Wget has crashed, try to run it in a debugger, e.g. ‘gdb `which
+ wget` core’ and type ‘where’ to get the backtrace. This may not
+ work if the system administrator has disabled core files, but it is
+ safe to try.
+
+
+File: wget.info, Node: Portability, Next: Signals, Prev: Reporting Bugs, Up: Various
+
+8.7 Portability
+===============
+
+Like all GNU software, Wget works on the GNU system. However, since it
+uses GNU Autoconf for building and configuring, and mostly avoids using
+“special†features of any particular Unix, it should compile (and work)
+on all common Unix flavors.
+
+ Various Wget versions have been compiled and tested under many kinds
+of Unix systems, including GNU/Linux, Solaris, SunOS 4.x, Mac OS X, OSF
+(aka Digital Unix or Tru64), Ultrix, *BSD, IRIX, AIX, and others. Some
+of those systems are no longer in widespread use and may not be able to
+support recent versions of Wget. If Wget fails to compile on your
+system, we would like to know about it.
+
+ Thanks to kind contributors, this version of Wget compiles and works
+on 32-bit Microsoft Windows platforms. It has been compiled
+successfully using MS Visual C++ 6.0, Watcom, Borland C, and GCC
+compilers. Naturally, it is crippled of some features available on
+Unix, but it should work as a substitute for people stuck with Windows.
+Note that Windows-specific portions of Wget are not guaranteed to be
+supported in the future, although this has been the case in practice for
+many years now. All questions and problems in Windows usage should be
+reported to Wget mailing list at <wget@sunsite.dk> where the volunteers
+who maintain the Windows-related features might look at them.
+
+ Support for building on MS-DOS via DJGPP has been contributed by
+Gisle Vanem; a port to VMS is maintained by Steven Schweda, and is
+available at <https://antinode.info/dec/sw/wget.html>.
+
+
+File: wget.info, Node: Signals, Prev: Portability, Up: Various
+
+8.8 Signals
+===========
+
+Since the purpose of Wget is background work, it catches the hangup
+signal (‘SIGHUP’) and ignores it. If the output was on standard output,
+it will be redirected to a file named ‘wget-log’. Otherwise, ‘SIGHUP’
+is ignored. This is convenient when you wish to redirect the output of
+Wget after having started it.
+
+ $ wget http://www.gnus.org/dist/gnus.tar.gz &
+ ...
+ $ kill -HUP %%
+ SIGHUP received, redirecting output to `wget-log'.
+
+ Other than that, Wget will not try to interfere with signals in any
+way. ‘C-c’, ‘kill -TERM’ and ‘kill -KILL’ should kill it alike.
+
+
+File: wget.info, Node: Appendices, Next: Copying this manual, Prev: Various, Up: Top
+
+9 Appendices
+************
+
+This chapter contains some references I consider useful.
+
+* Menu:
+
+* Robot Exclusion:: Wget’s support for RES.
+* Security Considerations:: Security with Wget.
+* Contributors:: People who helped.
+
+
+File: wget.info, Node: Robot Exclusion, Next: Security Considerations, Prev: Appendices, Up: Appendices
+
+9.1 Robot Exclusion
+===================
+
+It is extremely easy to make Wget wander aimlessly around a web site,
+sucking all the available data in progress. ‘wget -r SITE’, and you’re
+set. Great? Not for the server admin.
+
+ As long as Wget is only retrieving static pages, and doing it at a
+reasonable rate (see the ‘--wait’ option), there’s not much of a
+problem. The trouble is that Wget can’t tell the difference between the
+smallest static page and the most demanding CGI. A site I know has a
+section handled by a CGI Perl script that converts Info files to HTML on
+the fly. The script is slow, but works well enough for human users
+viewing an occasional Info file. However, when someone’s recursive Wget
+download stumbles upon the index page that links to all the Info files
+through the script, the system is brought to its knees without providing
+anything useful to the user (This task of converting Info files could be
+done locally and access to Info documentation for all installed GNU
+software on a system is available from the ‘info’ command).
+
+ To avoid this kind of accident, as well as to preserve privacy for
+documents that need to be protected from well-behaved robots, the
+concept of “robot exclusion†was invented. The idea is that the server
+administrators and document authors can specify which portions of the
+site they wish to protect from robots and those they will permit access.
+
+ The most popular mechanism, and the de facto standard supported by
+all the major robots, is the “Robots Exclusion Standard†(RES) written
+by Martijn Koster et al. in 1994. It specifies the format of a text
+file containing directives that instruct the robots which URL paths to
+avoid. To be found by the robots, the specifications must be placed in
+‘/robots.txt’ in the server root, which the robots are expected to
+download and parse.
+
+ Although Wget is not a web robot in the strictest sense of the word,
+it can download large parts of the site without the user’s intervention
+to download an individual page. Because of that, Wget honors RES when
+downloading recursively. For instance, when you issue:
+
+ wget -r http://www.example.com/
+
+ First the index of ‘www.example.com’ will be downloaded. If Wget
+finds that it wants to download more documents from that server, it will
+request ‘http://www.example.com/robots.txt’ and, if found, use it for
+further downloads. ‘robots.txt’ is loaded only once per each server.
+
+ Until version 1.8, Wget supported the first version of the standard,
+written by Martijn Koster in 1994 and available at
+<http://www.robotstxt.org/orig.html>. As of version 1.8, Wget has
+supported the additional directives specified in the internet draft
+‘<draft-koster-robots-00.txt>’ titled “A Method for Web Robots Controlâ€.
+The draft, which has as far as I know never made to an RFC, is available
+at <http://www.robotstxt.org/norobots-rfc.txt>.
+
+ This manual no longer includes the text of the Robot Exclusion
+Standard.
+
+ The second, less known mechanism, enables the author of an individual
+document to specify whether they want the links from the file to be
+followed by a robot. This is achieved using the ‘META’ tag, like this:
+
+ <meta name="robots" content="nofollow">
+
+ This is explained in some detail at
+<http://www.robotstxt.org/meta.html>. Wget supports this method of
+robot exclusion in addition to the usual ‘/robots.txt’ exclusion.
+
+ If you know what you are doing and really really wish to turn off the
+robot exclusion, set the ‘robots’ variable to ‘off’ in your ‘.wgetrc’.
+You can achieve the same effect from the command line using the ‘-e’
+switch, e.g. ‘wget -e robots=off URL...’.
+
+
+File: wget.info, Node: Security Considerations, Next: Contributors, Prev: Robot Exclusion, Up: Appendices
+
+9.2 Security Considerations
+===========================
+
+When using Wget, you must be aware that it sends unencrypted passwords
+through the network, which may present a security problem. Here are the
+main issues, and some solutions.
+
+ 1. The passwords on the command line are visible using ‘ps’. The best
+ way around it is to use ‘wget -i -’ and feed the URLs to Wget’s
+ standard input, each on a separate line, terminated by ‘C-d’.
+ Another workaround is to use ‘.netrc’ to store passwords; however,
+ storing unencrypted passwords is also considered a security risk.
+
+ 2. Using the insecure “basic†authentication scheme, unencrypted
+ passwords are transmitted through the network routers and gateways.
+
+ 3. The FTP passwords are also in no way encrypted. There is no good
+ solution for this at the moment.
+
+ 4. Although the “normal†output of Wget tries to hide the passwords,
+ debugging logs show them, in all forms. This problem is avoided by
+ being careful when you send debug logs (yes, even when you send
+ them to me).
+
+
+File: wget.info, Node: Contributors, Prev: Security Considerations, Up: Appendices
+
+9.3 Contributors
+================
+
+GNU Wget was written by Hrvoje Nikšić <hniksic@xemacs.org>,
+
+ However, the development of Wget could never have gone as far as it
+has, were it not for the help of many people, either with bug reports,
+feature proposals, patches, or letters saying “Thanks!â€.
+
+ Special thanks goes to the following people (no particular order):
+
+ • Dan Harkless—contributed a lot of code and documentation of
+ extremely high quality, as well as the ‘--page-requisites’ and
+ related options. He was the principal maintainer for some time and
+ released Wget 1.6.
+
+ • Ian Abbott—contributed bug fixes, Windows-related fixes, and
+ provided a prototype implementation of the breadth-first recursive
+ download. Co-maintained Wget during the 1.8 release cycle.
+
+ • The dotsrc.org crew, in particular Karsten Thygesen—donated system
+ resources such as the mailing list, web space, FTP space, and
+ version control repositories, along with a lot of time to make
+ these actually work. Christian Reiniger was of invaluable help
+ with setting up Subversion.
+
+ • Heiko Herold—provided high-quality Windows builds and contributed
+ bug and build reports for many years.
+
+ • Shawn McHorse—bug reports and patches.
+
+ • Kaveh R. Ghazi—on-the-fly ‘ansi2knr’-ization. Lots of portability
+ fixes.
+
+ • Gordon Matzigkeit—‘.netrc’ support.
+
+ • Zlatko ÄŒaluÅ¡ić, Tomislav Vujec and Dražen KaÄar—feature suggestions
+ and “philosophical†discussions.
+
+ • Darko Budor—initial port to Windows.
+
+ • Antonio Rosella—help and suggestions, plus the initial Italian
+ translation.
+
+ • Tomislav Petrović, Mario MikoÄević—many bug reports and
+ suggestions.
+
+ • Françis Pinard—many thorough bug reports and discussions.
+
+ • Karl Eichwalder—lots of help with internationalization, Makefile
+ layout and many other things.
+
+ • Junio Hamano—donated support for Opie and HTTP ‘Digest’
+ authentication.
+
+ • Mauro Tortonesi—improved IPv6 support, adding support for dual
+ family systems. Refactored and enhanced FTP IPv6 code. Maintained
+ GNU Wget from 2004–2007.
+
+ • Christopher G. Lewis—maintenance of the Windows version of GNU
+ WGet.
+
+ • Gisle Vanem—many helpful patches and improvements, especially for
+ Windows and MS-DOS support.
+
+ • Ralf Wildenhues—contributed patches to convert Wget to use Automake
+ as part of its build process, and various bugfixes.
+
+ • Steven Schubiger—Many helpful patches, bugfixes and improvements.
+ Notably, conversion of Wget to use the Gnulib quotes and quoteargs
+ modules, and the addition of password prompts at the console, via
+ the Gnulib getpasswd-gnu module.
+
+ • Ted Mielczarek—donated support for CSS.
+
+ • Saint Xavier—Support for IRIs (RFC 3987).
+
+ • Tim Rühsen—Loads of helpful patches, especially fuzzing support and
+ Continuous Integration. Maintainer since 2014.
+
+ • Darshit Shah—Many helpful patches. Community support on various
+ platforms. Maintainer since 2014.
+
+ • People who provided donations for development—including Brian
+ Gough.
+
+ The following people have provided patches, bug/build reports, useful
+suggestions, beta testing services, fan mail and all the other things
+that make maintenance so much fun:
+
+ Tim Adam, Adrian Aichner, Martin Baehr, Dieter Baron, Roger Beeman,
+Dan Berger, T. Bharath, Christian Biere, Paul Bludov, Daniel Bodea, Mark
+Boyns, John Burden, Julien Buty, Wanderlei Cavassin, Gilles Cedoc, Tim
+Charron, Noel Cragg, Kristijan Čonkaš, John Daily, Andreas Damm, Ahmon
+Dancy, Andrew Davison, Bertrand Demiddelaer, Alexander Dergachev, Andrew
+Deryabin, Ulrich Drepper, Marc Duponcheel, Damir Džeko, Alan Eldridge,
+Hans-Andreas Engel, Aleksandar Erkalović, Andy Eskilsson, João Ferreira,
+Christian Fraenkel, David Fritz, Mike Frysinger, Charles C. Fu,
+FUJISHIMA Satsuki, Masashi Fujita, Howard Gayle, Marcel Gerrits, Lemble
+Gregory, Hans Grobler, Alain Guibert, Mathieu Guillaume, Aaron Hawley,
+Jochen Hein, Karl Heuer, Madhusudan Hosaagrahara, HIROSE Masaaki, Ulf
+Harnhammar, Gregor Hoffleit, Erik Magnus Hulthen, Richard Huveneers,
+Jonas Jensen, Larry Jones, Simon Josefsson, Mario Jurić, Hack Kampbjørn,
+Const Kaplinsky, Goran Kezunović, Igor Khristophorov, Robert Kleine,
+KOJIMA Haime, Fila Kolodny, Alexander Kourakos, Martin Kraemer, Sami
+Krank, Jay Krell, Σίμος Ξενιτέλλης (Simos KSenitellis), Christian
+Lackas, Hrvoje Lacko, Daniel S. Lewart, Nicolás Lichtmeier, Dave Love,
+Alexander V. Lukyanov, Thomas Lußnig, Andre Majorel, Aurelien Marchand,
+Matthew J. Mellon, Jordan Mendelson, Ted Mielczarek, Robert Millan, Lin
+Zhe Min, Jan Minar, Tim Mooney, Keith Moore, Adam D. Moss, Simon Munton,
+Charlie Negyesi, R. K. Owen, Jim Paris, Kenny Parnell, Leonid Petrov,
+Simone Piunno, Andrew Pollock, Steve Pothier, Jan Přikryl, Marin Purgar,
+Csaba Ráduly, Keith Refson, Bill Richardson, Tyler Riddle, Tobias
+Ringstrom, Jochen Roderburg, Juan José Rodríguez, Maciej W. Rozycki,
+Edward J. Sabol, Heinz Salzmann, Robert Schmidt, Nicolas Schodet, Benno
+Schulenberg, Andreas Schwab, Steven M. Schweda, Chris Seawood, Pranab
+Shenoy, Dennis Smit, Toomas Soome, Tage Stabell-Kulo, Philip Stadermann,
+Daniel Stenberg, Sven Sternberger, Markus Strasser, John Summerfield,
+Szakacsits Szabolcs, Mike Thomas, Philipp Thomas, Mauro Tortonesi, Dave
+Turner, Gisle Vanem, Rabin Vincent, Russell Vincent, Željko Vrba,
+Charles G Waldman, Douglas E. Wegscheid, Ralf Wildenhues, Joshua David
+Williams, Benjamin Wolsey, Saint Xavier, YAMAZAKI Makoto, Jasmin Zainul,
+Bojan Ždrnja, Kristijan Zimmer, Xin Zou.
+
+ Apologies to all who I accidentally left out, and many thanks to all
+the subscribers of the Wget mailing list.
+
+
+File: wget.info, Node: Copying this manual, Next: Concept Index, Prev: Appendices, Up: Top
+
+Appendix A Copying this manual
+******************************
+
+* Menu:
+
+* GNU Free Documentation License:: License for copying this manual.
+
+
+File: wget.info, Node: GNU Free Documentation License, Prev: Copying this manual, Up: Copying this manual
+
+A.1 GNU Free Documentation License
+==================================
+
+ Version 1.3, 3 November 2008
+
+ Copyright © 2000-2002, 2007-2008, 2015, 2018-2020 Free
+ Software Foundation, Inc.
+ <http://fsf.org/>
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ 0. PREAMBLE
+
+ The purpose of this License is to make a manual, textbook, or other
+ functional and useful document “free†in the sense of freedom: to
+ assure everyone the effective freedom to copy and redistribute it,
+ with or without modifying it, either commercially or
+ noncommercially. Secondarily, this License preserves for the
+ author and publisher a way to get credit for their work, while not
+ being considered responsible for modifications made by others.
+
+ This License is a kind of “copyleftâ€, which means that derivative
+ works of the document must themselves be free in the same sense.
+ It complements the GNU General Public License, which is a copyleft
+ license designed for free software.
+
+ We have designed this License in order to use it for manuals for
+ free software, because free software needs free documentation: a
+ free program should come with manuals providing the same freedoms
+ that the software does. But this License is not limited to
+ software manuals; it can be used for any textual work, regardless
+ of subject matter or whether it is published as a printed book. We
+ recommend this License principally for works whose purpose is
+ instruction or reference.
+
+ 1. APPLICABILITY AND DEFINITIONS
+
+ This License applies to any manual or other work, in any medium,
+ that contains a notice placed by the copyright holder saying it can
+ be distributed under the terms of this License. Such a notice
+ grants a world-wide, royalty-free license, unlimited in duration,
+ to use that work under the conditions stated herein. The
+ “Documentâ€, below, refers to any such manual or work. Any member
+ of the public is a licensee, and is addressed as “youâ€. You accept
+ the license if you copy, modify or distribute the work in a way
+ requiring permission under copyright law.
+
+ A “Modified Version†of the Document means any work containing the
+ Document or a portion of it, either copied verbatim, or with
+ modifications and/or translated into another language.
+
+ A “Secondary Section†is a named appendix or a front-matter section
+ of the Document that deals exclusively with the relationship of the
+ publishers or authors of the Document to the Document’s overall
+ subject (or to related matters) and contains nothing that could
+ fall directly within that overall subject. (Thus, if the Document
+ is in part a textbook of mathematics, a Secondary Section may not
+ explain any mathematics.) The relationship could be a matter of
+ historical connection with the subject or with related matters, or
+ of legal, commercial, philosophical, ethical or political position
+ regarding them.
+
+ The “Invariant Sections†are certain Secondary Sections whose
+ titles are designated, as being those of Invariant Sections, in the
+ notice that says that the Document is released under this License.
+ If a section does not fit the above definition of Secondary then it
+ is not allowed to be designated as Invariant. The Document may
+ contain zero Invariant Sections. If the Document does not identify
+ any Invariant Sections then there are none.
+
+ The “Cover Texts†are certain short passages of text that are
+ listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+ that says that the Document is released under this License. A
+ Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+ be at most 25 words.
+
+ A “Transparent†copy of the Document means a machine-readable copy,
+ represented in a format whose specification is available to the
+ general public, that is suitable for revising the document
+ straightforwardly with generic text editors or (for images composed
+ of pixels) generic paint programs or (for drawings) some widely
+ available drawing editor, and that is suitable for input to text
+ formatters or for automatic translation to a variety of formats
+ suitable for input to text formatters. A copy made in an otherwise
+ Transparent file format whose markup, or absence of markup, has
+ been arranged to thwart or discourage subsequent modification by
+ readers is not Transparent. An image format is not Transparent if
+ used for any substantial amount of text. A copy that is not
+ “Transparent†is called “Opaqueâ€.
+
+ Examples of suitable formats for Transparent copies include plain
+ ASCII without markup, Texinfo input format, LaTeX input format,
+ SGML or XML using a publicly available DTD, and standard-conforming
+ simple HTML, PostScript or PDF designed for human modification.
+ Examples of transparent image formats include PNG, XCF and JPG.
+ Opaque formats include proprietary formats that can be read and
+ edited only by proprietary word processors, SGML or XML for which
+ the DTD and/or processing tools are not generally available, and
+ the machine-generated HTML, PostScript or PDF produced by some word
+ processors for output purposes only.
+
+ The “Title Page†means, for a printed book, the title page itself,
+ plus such following pages as are needed to hold, legibly, the
+ material this License requires to appear in the title page. For
+ works in formats which do not have any title page as such, “Title
+ Page†means the text near the most prominent appearance of the
+ work’s title, preceding the beginning of the body of the text.
+
+ The “publisher†means any person or entity that distributes copies
+ of the Document to the public.
+
+ A section “Entitled XYZ†means a named subunit of the Document
+ whose title either is precisely XYZ or contains XYZ in parentheses
+ following text that translates XYZ in another language. (Here XYZ
+ stands for a specific section name mentioned below, such as
+ “Acknowledgementsâ€, “Dedicationsâ€, “Endorsementsâ€, or “Historyâ€.)
+ To “Preserve the Title†of such a section when you modify the
+ Document means that it remains a section “Entitled XYZ†according
+ to this definition.
+
+ The Document may include Warranty Disclaimers next to the notice
+ which states that this License applies to the Document. These
+ Warranty Disclaimers are considered to be included by reference in
+ this License, but only as regards disclaiming warranties: any other
+ implication that these Warranty Disclaimers may have is void and
+ has no effect on the meaning of this License.
+
+ 2. VERBATIM COPYING
+
+ You may copy and distribute the Document in any medium, either
+ commercially or noncommercially, provided that this License, the
+ copyright notices, and the license notice saying this License
+ applies to the Document are reproduced in all copies, and that you
+ add no other conditions whatsoever to those of this License. You
+ may not use technical measures to obstruct or control the reading
+ or further copying of the copies you make or distribute. However,
+ you may accept compensation in exchange for copies. If you
+ distribute a large enough number of copies you must also follow the
+ conditions in section 3.
+
+ You may also lend copies, under the same conditions stated above,
+ and you may publicly display copies.
+
+ 3. COPYING IN QUANTITY
+
+ If you publish printed copies (or copies in media that commonly
+ have printed covers) of the Document, numbering more than 100, and
+ the Document’s license notice requires Cover Texts, you must
+ enclose the copies in covers that carry, clearly and legibly, all
+ these Cover Texts: Front-Cover Texts on the front cover, and
+ Back-Cover Texts on the back cover. Both covers must also clearly
+ and legibly identify you as the publisher of these copies. The
+ front cover must present the full title with all words of the title
+ equally prominent and visible. You may add other material on the
+ covers in addition. Copying with changes limited to the covers, as
+ long as they preserve the title of the Document and satisfy these
+ conditions, can be treated as verbatim copying in other respects.
+
+ If the required texts for either cover are too voluminous to fit
+ legibly, you should put the first ones listed (as many as fit
+ reasonably) on the actual cover, and continue the rest onto
+ adjacent pages.
+
+ If you publish or distribute Opaque copies of the Document
+ numbering more than 100, you must either include a machine-readable
+ Transparent copy along with each Opaque copy, or state in or with
+ each Opaque copy a computer-network location from which the general
+ network-using public has access to download using public-standard
+ network protocols a complete Transparent copy of the Document, free
+ of added material. If you use the latter option, you must take
+ reasonably prudent steps, when you begin distribution of Opaque
+ copies in quantity, to ensure that this Transparent copy will
+ remain thus accessible at the stated location until at least one
+ year after the last time you distribute an Opaque copy (directly or
+ through your agents or retailers) of that edition to the public.
+
+ It is requested, but not required, that you contact the authors of
+ the Document well before redistributing any large number of copies,
+ to give them a chance to provide you with an updated version of the
+ Document.
+
+ 4. MODIFICATIONS
+
+ You may copy and distribute a Modified Version of the Document
+ under the conditions of sections 2 and 3 above, provided that you
+ release the Modified Version under precisely this License, with the
+ Modified Version filling the role of the Document, thus licensing
+ distribution and modification of the Modified Version to whoever
+ possesses a copy of it. In addition, you must do these things in
+ the Modified Version:
+
+ A. Use in the Title Page (and on the covers, if any) a title
+ distinct from that of the Document, and from those of previous
+ versions (which should, if there were any, be listed in the
+ History section of the Document). You may use the same title
+ as a previous version if the original publisher of that
+ version gives permission.
+
+ B. List on the Title Page, as authors, one or more persons or
+ entities responsible for authorship of the modifications in
+ the Modified Version, together with at least five of the
+ principal authors of the Document (all of its principal
+ authors, if it has fewer than five), unless they release you
+ from this requirement.
+
+ C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+
+ D. Preserve all the copyright notices of the Document.
+
+ E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+
+ F. Include, immediately after the copyright notices, a license
+ notice giving the public permission to use the Modified
+ Version under the terms of this License, in the form shown in
+ the Addendum below.
+
+ G. Preserve in that license notice the full lists of Invariant
+ Sections and required Cover Texts given in the Document’s
+ license notice.
+
+ H. Include an unaltered copy of this License.
+
+ I. Preserve the section Entitled “Historyâ€, Preserve its Title,
+ and add to it an item stating at least the title, year, new
+ authors, and publisher of the Modified Version as given on the
+ Title Page. If there is no section Entitled “History†in the
+ Document, create one stating the title, year, authors, and
+ publisher of the Document as given on its Title Page, then add
+ an item describing the Modified Version as stated in the
+ previous sentence.
+
+ J. Preserve the network location, if any, given in the Document
+ for public access to a Transparent copy of the Document, and
+ likewise the network locations given in the Document for
+ previous versions it was based on. These may be placed in the
+ “History†section. You may omit a network location for a work
+ that was published at least four years before the Document
+ itself, or if the original publisher of the version it refers
+ to gives permission.
+
+ K. For any section Entitled “Acknowledgements†or “Dedicationsâ€,
+ Preserve the Title of the section, and preserve in the section
+ all the substance and tone of each of the contributor
+ acknowledgements and/or dedications given therein.
+
+ L. Preserve all the Invariant Sections of the Document, unaltered
+ in their text and in their titles. Section numbers or the
+ equivalent are not considered part of the section titles.
+
+ M. Delete any section Entitled “Endorsementsâ€. Such a section
+ may not be included in the Modified Version.
+
+ N. Do not retitle any existing section to be Entitled
+ “Endorsements†or to conflict in title with any Invariant
+ Section.
+
+ O. Preserve any Warranty Disclaimers.
+
+ If the Modified Version includes new front-matter sections or
+ appendices that qualify as Secondary Sections and contain no
+ material copied from the Document, you may at your option designate
+ some or all of these sections as invariant. To do this, add their
+ titles to the list of Invariant Sections in the Modified Version’s
+ license notice. These titles must be distinct from any other
+ section titles.
+
+ You may add a section Entitled “Endorsementsâ€, provided it contains
+ nothing but endorsements of your Modified Version by various
+ parties—for example, statements of peer review or that the text has
+ been approved by an organization as the authoritative definition of
+ a standard.
+
+ You may add a passage of up to five words as a Front-Cover Text,
+ and a passage of up to 25 words as a Back-Cover Text, to the end of
+ the list of Cover Texts in the Modified Version. Only one passage
+ of Front-Cover Text and one of Back-Cover Text may be added by (or
+ through arrangements made by) any one entity. If the Document
+ already includes a cover text for the same cover, previously added
+ by you or by arrangement made by the same entity you are acting on
+ behalf of, you may not add another; but you may replace the old
+ one, on explicit permission from the previous publisher that added
+ the old one.
+
+ The author(s) and publisher(s) of the Document do not by this
+ License give permission to use their names for publicity for or to
+ assert or imply endorsement of any Modified Version.
+
+ 5. COMBINING DOCUMENTS
+
+ You may combine the Document with other documents released under
+ this License, under the terms defined in section 4 above for
+ modified versions, provided that you include in the combination all
+ of the Invariant Sections of all of the original documents,
+ unmodified, and list them all as Invariant Sections of your
+ combined work in its license notice, and that you preserve all
+ their Warranty Disclaimers.
+
+ The combined work need only contain one copy of this License, and
+ multiple identical Invariant Sections may be replaced with a single
+ copy. If there are multiple Invariant Sections with the same name
+ but different contents, make the title of each such section unique
+ by adding at the end of it, in parentheses, the name of the
+ original author or publisher of that section if known, or else a
+ unique number. Make the same adjustment to the section titles in
+ the list of Invariant Sections in the license notice of the
+ combined work.
+
+ In the combination, you must combine any sections Entitled
+ “History†in the various original documents, forming one section
+ Entitled “Historyâ€; likewise combine any sections Entitled
+ “Acknowledgementsâ€, and any sections Entitled “Dedicationsâ€. You
+ must delete all sections Entitled “Endorsements.â€
+
+ 6. COLLECTIONS OF DOCUMENTS
+
+ You may make a collection consisting of the Document and other
+ documents released under this License, and replace the individual
+ copies of this License in the various documents with a single copy
+ that is included in the collection, provided that you follow the
+ rules of this License for verbatim copying of each of the documents
+ in all other respects.
+
+ You may extract a single document from such a collection, and
+ distribute it individually under this License, provided you insert
+ a copy of this License into the extracted document, and follow this
+ License in all other respects regarding verbatim copying of that
+ document.
+
+ 7. AGGREGATION WITH INDEPENDENT WORKS
+
+ A compilation of the Document or its derivatives with other
+ separate and independent documents or works, in or on a volume of a
+ storage or distribution medium, is called an “aggregate†if the
+ copyright resulting from the compilation is not used to limit the
+ legal rights of the compilation’s users beyond what the individual
+ works permit. When the Document is included in an aggregate, this
+ License does not apply to the other works in the aggregate which
+ are not themselves derivative works of the Document.
+
+ If the Cover Text requirement of section 3 is applicable to these
+ copies of the Document, then if the Document is less than one half
+ of the entire aggregate, the Document’s Cover Texts may be placed
+ on covers that bracket the Document within the aggregate, or the
+ electronic equivalent of covers if the Document is in electronic
+ form. Otherwise they must appear on printed covers that bracket
+ the whole aggregate.
+
+ 8. TRANSLATION
+
+ Translation is considered a kind of modification, so you may
+ distribute translations of the Document under the terms of section
+ 4. Replacing Invariant Sections with translations requires special
+ permission from their copyright holders, but you may include
+ translations of some or all Invariant Sections in addition to the
+ original versions of these Invariant Sections. You may include a
+ translation of this License, and all the license notices in the
+ Document, and any Warranty Disclaimers, provided that you also
+ include the original English version of this License and the
+ original versions of those notices and disclaimers. In case of a
+ disagreement between the translation and the original version of
+ this License or a notice or disclaimer, the original version will
+ prevail.
+
+ If a section in the Document is Entitled “Acknowledgementsâ€,
+ “Dedicationsâ€, or “Historyâ€, the requirement (section 4) to
+ Preserve its Title (section 1) will typically require changing the
+ actual title.
+
+ 9. TERMINATION
+
+ You may not copy, modify, sublicense, or distribute the Document
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, or distribute it is void,
+ and will automatically terminate your rights under this License.
+
+ However, if you cease all violation of this License, then your
+ license from a particular copyright holder is reinstated (a)
+ provisionally, unless and until the copyright holder explicitly and
+ finally terminates your license, and (b) permanently, if the
+ copyright holder fails to notify you of the violation by some
+ reasonable means prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+ reinstated permanently if the copyright holder notifies you of the
+ violation by some reasonable means, this is the first time you have
+ received notice of violation of this License (for any work) from
+ that copyright holder, and you cure the violation prior to 30 days
+ after your receipt of the notice.
+
+ Termination of your rights under this section does not terminate
+ the licenses of parties who have received copies or rights from you
+ under this License. If your rights have been terminated and not
+ permanently reinstated, receipt of a copy of some or all of the
+ same material does not give you any rights to use it.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+ The Free Software Foundation may publish new, revised versions of
+ the GNU Free Documentation 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. See
+ <http://www.gnu.org/copyleft/>.
+
+ Each version of the License is given a distinguishing version
+ number. If the Document specifies that a particular numbered
+ version of this License “or any later version†applies to it, you
+ have the option of following the terms and conditions either of
+ that specified version or of any later version that has been
+ published (not as a draft) by the Free Software Foundation. If the
+ Document does not specify a version number of this License, you may
+ choose any version ever published (not as a draft) by the Free
+ Software Foundation. If the Document specifies that a proxy can
+ decide which future versions of this License can be used, that
+ proxy’s public statement of acceptance of a version permanently
+ authorizes you to choose that version for the Document.
+
+ 11. RELICENSING
+
+ “Massive Multiauthor Collaboration Site†(or “MMC Siteâ€) means any
+ World Wide Web server that publishes copyrightable works and also
+ provides prominent facilities for anybody to edit those works. A
+ public wiki that anybody can edit is an example of such a server.
+ A “Massive Multiauthor Collaboration†(or “MMCâ€) contained in the
+ site means any set of copyrightable works thus published on the MMC
+ site.
+
+ “CC-BY-SA†means the Creative Commons Attribution-Share Alike 3.0
+ license published by Creative Commons Corporation, a not-for-profit
+ corporation with a principal place of business in San Francisco,
+ California, as well as future copyleft versions of that license
+ published by that same organization.
+
+ “Incorporate†means to publish or republish a Document, in whole or
+ in part, as part of another Document.
+
+ An MMC is “eligible for relicensing†if it is licensed under this
+ License, and if all works that were first published under this
+ License somewhere other than this MMC, and subsequently
+ incorporated in whole or in part into the MMC, (1) had no cover
+ texts or invariant sections, and (2) were thus incorporated prior
+ to November 1, 2008.
+
+ The operator of an MMC Site may republish an MMC contained in the
+ site under CC-BY-SA on the same site at any time before August 1,
+ 2009, provided the MMC is eligible for relicensing.
+
+ADDENDUM: How to use this License for your documents
+====================================================
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+ Copyright (C) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.3
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+ Texts. A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+
+ If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the “with...Texts.†line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with
+ the Front-Cover Texts being LIST, and with the Back-Cover Texts
+ being LIST.
+
+ If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+ If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of free
+software license, such as the GNU General Public License, to permit
+their use in free software.
+
+
+File: wget.info, Node: Concept Index, Prev: Copying this manual, Up: Top
+
+Concept Index
+*************
+
+
+* Menu:
+
+* #wget: Internet Relay Chat. (line 6)
+* .css extension: HTTP Options. (line 10)
+* .html extension: HTTP Options. (line 10)
+* .listing files, removing: FTP Options. (line 21)
+* .netrc: Startup File. (line 6)
+* .wgetrc: Startup File. (line 6)
+* accept directories: Directory-Based Limits.
+ (line 17)
+* accept suffixes: Types of Files. (line 15)
+* accept wildcards: Types of Files. (line 15)
+* append to log: Logging and Input File Options.
+ (line 11)
+* arguments: Invoking. (line 6)
+* authentication: Download Options. (line 536)
+* authentication <1>: HTTP Options. (line 43)
+* authentication <2>: HTTP Options. (line 393)
+* authentication credentials: Download Options. (line 113)
+* backing up converted files: Recursive Retrieval Options.
+ (line 103)
+* backing up files: Download Options. (line 107)
+* bandwidth, limit: Download Options. (line 330)
+* base for relative links in input file: Logging and Input File Options.
+ (line 111)
+* bind address: Download Options. (line 6)
+* bind DNS address: Download Options. (line 11)
+* bug reports: Reporting Bugs. (line 6)
+* bugs: Reporting Bugs. (line 6)
+* cache: HTTP Options. (line 71)
+* caching of DNS lookups: Download Options. (line 415)
+* case fold: Recursive Accept/Reject Options.
+ (line 62)
+* client DNS address: Download Options. (line 11)
+* client IP address: Download Options. (line 6)
+* clobbering, file: Download Options. (line 68)
+* command line: Invoking. (line 6)
+* comments, HTML: Recursive Retrieval Options.
+ (line 181)
+* connect timeout: Download Options. (line 314)
+* Content On Error: HTTP Options. (line 380)
+* Content-Disposition: HTTP Options. (line 363)
+* Content-Encoding, choose: HTTP Options. (line 197)
+* Content-Length, ignore: HTTP Options. (line 160)
+* continue retrieval: Download Options. (line 118)
+* continue retrieval <1>: Download Options. (line 177)
+* contributors: Contributors. (line 6)
+* conversion of links: Recursive Retrieval Options.
+ (line 45)
+* cookies: HTTP Options. (line 80)
+* cookies, loading: HTTP Options. (line 90)
+* cookies, saving: HTTP Options. (line 138)
+* cookies, session: HTTP Options. (line 143)
+* cut directories: Directory Options. (line 32)
+* debug: Logging and Input File Options.
+ (line 17)
+* default page name: HTTP Options. (line 6)
+* delete after retrieval: Recursive Retrieval Options.
+ (line 29)
+* directories: Directory-Based Limits.
+ (line 6)
+* directories, exclude: Directory-Based Limits.
+ (line 30)
+* directories, include: Directory-Based Limits.
+ (line 17)
+* directory limits: Directory-Based Limits.
+ (line 6)
+* directory prefix: Directory Options. (line 59)
+* DNS cache: Download Options. (line 415)
+* DNS IP address, client, DNS: Download Options. (line 11)
+* DNS IP address, client, DNS <1>: Download Options. (line 19)
+* DNS server: Download Options. (line 19)
+* DNS timeout: Download Options. (line 308)
+* dot style: Download Options. (line 189)
+* downloading multiple times: Download Options. (line 68)
+* EGD: HTTPS (SSL/TLS) Options.
+ (line 142)
+* entropy, specifying source of: HTTPS (SSL/TLS) Options.
+ (line 127)
+* examples: Examples. (line 6)
+* exclude directories: Directory-Based Limits.
+ (line 30)
+* execute wgetrc command: Basic Startup Options.
+ (line 19)
+* FDL, GNU Free Documentation License: GNU Free Documentation License.
+ (line 6)
+* features: Overview. (line 6)
+* file names, restrict: Download Options. (line 434)
+* file permissions: FTP Options. (line 73)
+* filling proxy cache: Recursive Retrieval Options.
+ (line 29)
+* follow FTP links: Recursive Accept/Reject Options.
+ (line 34)
+* following ftp links: FTP Links. (line 6)
+* following links: Following Links. (line 6)
+* force html: Logging and Input File Options.
+ (line 104)
+* ftp authentication: FTP Options. (line 6)
+* ftp password: FTP Options. (line 6)
+* ftp time-stamping: FTP Time-Stamping Internals.
+ (line 6)
+* ftp user: FTP Options. (line 6)
+* globbing, toggle: FTP Options. (line 45)
+* hangup: Signals. (line 6)
+* header, add: HTTP Options. (line 171)
+* hosts, spanning: Spanning Hosts. (line 6)
+* HSTS: HTTPS (SSL/TLS) Options.
+ (line 161)
+* HTML comments: Recursive Retrieval Options.
+ (line 181)
+* http password: HTTP Options. (line 43)
+* http referer: HTTP Options. (line 229)
+* http time-stamping: HTTP Time-Stamping Internals.
+ (line 6)
+* http user: HTTP Options. (line 43)
+* idn support: Download Options. (line 558)
+* ignore case: Recursive Accept/Reject Options.
+ (line 62)
+* ignore length: HTTP Options. (line 160)
+* include directories: Directory-Based Limits.
+ (line 17)
+* incomplete downloads: Download Options. (line 118)
+* incomplete downloads <1>: Download Options. (line 177)
+* incremental updating: Time-Stamping. (line 6)
+* index.html: HTTP Options. (line 6)
+* input-file: Logging and Input File Options.
+ (line 46)
+* input-metalink: Logging and Input File Options.
+ (line 69)
+* Internet Relay Chat: Internet Relay Chat. (line 6)
+* invoking: Invoking. (line 6)
+* IP address, client: Download Options. (line 6)
+* IPv6: Download Options. (line 484)
+* IRC: Internet Relay Chat. (line 6)
+* iri support: Download Options. (line 558)
+* Keep-Alive, turning off: HTTP Options. (line 59)
+* keep-badhash: Logging and Input File Options.
+ (line 73)
+* latest version: Distribution. (line 6)
+* limit bandwidth: Download Options. (line 330)
+* link conversion: Recursive Retrieval Options.
+ (line 45)
+* links: Following Links. (line 6)
+* list: Mailing Lists. (line 5)
+* loading cookies: HTTP Options. (line 90)
+* local encoding: Download Options. (line 567)
+* location of wgetrc: Wgetrc Location. (line 6)
+* log file: Logging and Input File Options.
+ (line 6)
+* mailing list: Mailing Lists. (line 6)
+* metalink-index: Logging and Input File Options.
+ (line 85)
+* metalink-over-http: Logging and Input File Options.
+ (line 78)
+* mirroring: Very Advanced Usage. (line 6)
+* no parent: Directory-Based Limits.
+ (line 43)
+* no-clobber: Download Options. (line 68)
+* nohup: Invoking. (line 6)
+* number of tries: Download Options. (line 26)
+* offset: Download Options. (line 177)
+* operating systems: Portability. (line 6)
+* option syntax: Option Syntax. (line 6)
+* Other HTTP Methods: HTTP Options. (line 330)
+* output file: Logging and Input File Options.
+ (line 6)
+* overview: Overview. (line 6)
+* page requisites: Recursive Retrieval Options.
+ (line 116)
+* passive ftp: FTP Options. (line 61)
+* password: Download Options. (line 536)
+* pause: Download Options. (line 350)
+* Persistent Connections, disabling: HTTP Options. (line 59)
+* portability: Portability. (line 6)
+* POST: HTTP Options. (line 262)
+* preferred-location: Logging and Input File Options.
+ (line 93)
+* progress indicator: Download Options. (line 189)
+* proxies: Proxies. (line 6)
+* proxy: Download Options. (line 391)
+* proxy <1>: HTTP Options. (line 71)
+* proxy authentication: HTTP Options. (line 220)
+* proxy filling: Recursive Retrieval Options.
+ (line 29)
+* proxy password: HTTP Options. (line 220)
+* proxy user: HTTP Options. (line 220)
+* quiet: Logging and Input File Options.
+ (line 28)
+* quota: Download Options. (line 398)
+* random wait: Download Options. (line 373)
+* randomness, specifying source of: HTTPS (SSL/TLS) Options.
+ (line 127)
+* rate, limit: Download Options. (line 330)
+* read timeout: Download Options. (line 319)
+* recursion: Recursive Download. (line 6)
+* recursive download: Recursive Download. (line 6)
+* redirect: HTTP Options. (line 214)
+* redirecting output: Advanced Usage. (line 89)
+* referer, http: HTTP Options. (line 229)
+* reject directories: Directory-Based Limits.
+ (line 30)
+* reject suffixes: Types of Files. (line 39)
+* reject wildcards: Types of Files. (line 39)
+* relative links: Relative Links. (line 6)
+* remote encoding: Download Options. (line 581)
+* reporting bugs: Reporting Bugs. (line 6)
+* required images, downloading: Recursive Retrieval Options.
+ (line 116)
+* resume download: Download Options. (line 118)
+* resume download <1>: Download Options. (line 177)
+* retries: Download Options. (line 26)
+* retries, waiting between: Download Options. (line 364)
+* retrieving: Recursive Download. (line 6)
+* robot exclusion: Robot Exclusion. (line 6)
+* robots.txt: Robot Exclusion. (line 6)
+* sample wgetrc: Sample Wgetrc. (line 6)
+* saving cookies: HTTP Options. (line 138)
+* security: Security Considerations.
+ (line 6)
+* server maintenance: Robot Exclusion. (line 6)
+* server response, print: Download Options. (line 274)
+* server response, save: HTTP Options. (line 236)
+* session cookies: HTTP Options. (line 143)
+* signal handling: Signals. (line 6)
+* spanning hosts: Spanning Hosts. (line 6)
+* specify config: Logging and Input File Options.
+ (line 124)
+* spider: Download Options. (line 279)
+* SSL: HTTPS (SSL/TLS) Options.
+ (line 6)
+* SSL certificate: HTTPS (SSL/TLS) Options.
+ (line 73)
+* SSL certificate authority: HTTPS (SSL/TLS) Options.
+ (line 99)
+* SSL certificate type, specify: HTTPS (SSL/TLS) Options.
+ (line 79)
+* SSL certificate, check: HTTPS (SSL/TLS) Options.
+ (line 44)
+* SSL CRL, certificate revocation list: HTTPS (SSL/TLS) Options.
+ (line 111)
+* SSL protocol, choose: HTTPS (SSL/TLS) Options.
+ (line 11)
+* SSL Public Key Pin: HTTPS (SSL/TLS) Options.
+ (line 115)
+* start position: Download Options. (line 177)
+* startup: Startup File. (line 6)
+* startup file: Startup File. (line 6)
+* suffixes, accept: Types of Files. (line 15)
+* suffixes, reject: Types of Files. (line 39)
+* symbolic links, retrieving: FTP Options. (line 77)
+* syntax of options: Option Syntax. (line 6)
+* syntax of wgetrc: Wgetrc Syntax. (line 6)
+* tag-based recursive pruning: Recursive Accept/Reject Options.
+ (line 38)
+* time-stamping: Time-Stamping. (line 6)
+* time-stamping usage: Time-Stamping Usage. (line 6)
+* timeout: Download Options. (line 290)
+* timeout, connect: Download Options. (line 314)
+* timeout, DNS: Download Options. (line 308)
+* timeout, read: Download Options. (line 319)
+* timestamping: Time-Stamping. (line 6)
+* tries: Download Options. (line 26)
+* Trust server names: HTTP Options. (line 385)
+* types of files: Types of Files. (line 6)
+* unlink: Download Options. (line 596)
+* updating the archives: Time-Stamping. (line 6)
+* URL: URL Format. (line 6)
+* URL syntax: URL Format. (line 6)
+* usage, time-stamping: Time-Stamping Usage. (line 6)
+* user: Download Options. (line 536)
+* user-agent: HTTP Options. (line 240)
+* various: Various. (line 6)
+* verbose: Logging and Input File Options.
+ (line 32)
+* wait: Download Options. (line 350)
+* wait, random: Download Options. (line 373)
+* waiting between retries: Download Options. (line 364)
+* WARC: HTTPS (SSL/TLS) Options.
+ (line 240)
+* web site: Web Site. (line 6)
+* Wget as spider: Download Options. (line 279)
+* wgetrc: Startup File. (line 6)
+* wgetrc commands: Wgetrc Commands. (line 6)
+* wgetrc location: Wgetrc Location. (line 6)
+* wgetrc syntax: Wgetrc Syntax. (line 6)
+* wildcards, accept: Types of Files. (line 15)
+* wildcards, reject: Types of Files. (line 39)
+* Windows file names: Download Options. (line 434)
+* xattr: Logging and Input File Options.
+ (line 97)
+
+
+
+Tag Table:
+Node: Top749
+Node: Overview2082
+Node: Invoking5774
+Node: URL Format6634
+Ref: URL Format-Footnote-19313
+Node: Option Syntax9419
+Node: Basic Startup Options12197
+Node: Logging and Input File Options13055
+Node: Download Options18684
+Node: Directory Options48327
+Node: HTTP Options51178
+Node: HTTPS (SSL/TLS) Options71862
+Node: FTP Options85019
+Node: Recursive Retrieval Options92081
+Node: Recursive Accept/Reject Options102122
+Node: Exit Status106327
+Node: Recursive Download107362
+Node: Following Links110601
+Node: Spanning Hosts111567
+Node: Types of Files113836
+Node: Directory-Based Limits118730
+Node: Relative Links121997
+Node: FTP Links122847
+Node: Time-Stamping123738
+Node: Time-Stamping Usage125410
+Node: HTTP Time-Stamping Internals127282
+Ref: HTTP Time-Stamping Internals-Footnote-1128630
+Node: FTP Time-Stamping Internals128833
+Node: Startup File130320
+Node: Wgetrc Location131260
+Node: Wgetrc Syntax132114
+Node: Wgetrc Commands132879
+Node: Sample Wgetrc149472
+Node: Examples155500
+Node: Simple Usage155861
+Node: Advanced Usage157310
+Node: Very Advanced Usage161126
+Node: Various162670
+Node: Proxies163379
+Node: Distribution166336
+Node: Web Site166676
+Node: Mailing Lists166976
+Node: Internet Relay Chat168713
+Node: Reporting Bugs169008
+Node: Portability171734
+Node: Signals173381
+Node: Appendices174088
+Node: Robot Exclusion174436
+Node: Security Considerations178298
+Node: Contributors179508
+Node: Copying this manual185484
+Node: GNU Free Documentation License185724
+Node: Concept Index211081
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/doc/wget.texi b/doc/wget.texi
new file mode 100644
index 0000000..cf877fe
--- /dev/null
+++ b/doc/wget.texi
@@ -0,0 +1,4691 @@
+\input texinfo @c -*-texinfo-*-
+
+@c %**start of header
+@setfilename wget.info
+@documentencoding UTF-8
+@include version.texi
+@settitle GNU Wget @value{VERSION} Manual
+@c Disable the monstrous rectangles beside overfull hbox-es.
+@finalout
+@c Use `odd' to print double-sided.
+@setchapternewpage on
+@c %**end of header
+
+@iftex
+@c Remove this if you don't use A4 paper.
+@afourpaper
+@end iftex
+
+@c Title for man page. The weird way texi2pod.pl is written requires
+@c the preceding @set.
+@set Wget Wget
+@c man title Wget The non-interactive network downloader.
+
+@dircategory Network applications
+@direntry
+* Wget: (wget). Non-interactive network downloader.
+@end direntry
+
+@copying
+This file documents the GNU Wget utility for downloading network
+data.
+
+@c man begin COPYRIGHT
+Copyright @copyright{} 1996-2011, 2015, 2018-2020 Free Software
+Foundation, Inc.
+
+@iftex
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+@end iftex
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries a copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+@end ignore
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+Texts. A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@c man end
+@end copying
+
+@titlepage
+@title GNU Wget @value{VERSION}
+@subtitle The non-interactive download utility
+@subtitle Updated for Wget @value{VERSION}, @value{UPDATED}
+@author by Hrvoje Nikšić and others
+
+@ignore
+@c man begin AUTHOR
+Originally written by Hrvoje Nikšić <hniksic@xemacs.org>.
+Currently maintained by Darshit Shah <darnir@gnu.org> and
+Tim Rühsen <tim.ruehsen@gmx.de>.
+@c man end
+@c man begin SEEALSO
+This is @strong{not} the complete manual for GNU Wget.
+For more complete information, including more detailed explanations of
+some of the options, and a number of commands available
+for use with @file{.wgetrc} files and the @samp{-e} option, see the GNU
+Info entry for @file{wget}.
+
+Also see wget2(1), the updated version of GNU Wget with even better
+support for recursive downloading and modern protocols like HTTP/2.
+@c man end
+@end ignore
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Overview, (dir), (dir)
+@top Wget @value{VERSION}
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Overview:: Features of Wget.
+* Invoking:: Wget command-line arguments.
+* Recursive Download:: Downloading interlinked pages.
+* Following Links:: The available methods of chasing links.
+* Time-Stamping:: Mirroring according to time-stamps.
+* Startup File:: Wget's initialization file.
+* Examples:: Examples of usage.
+* Various:: The stuff that doesn't fit anywhere else.
+* Appendices:: Some useful references.
+* Copying this manual:: You may give out copies of this manual.
+* Concept Index:: Topics covered by this manual.
+@end menu
+
+@node Overview, Invoking, Top, Top
+@chapter Overview
+@cindex overview
+@cindex features
+
+@c man begin DESCRIPTION
+GNU Wget is a free utility for non-interactive download of files from
+the Web. It supports @sc{http}, @sc{https}, and @sc{ftp} protocols, as
+well as retrieval through @sc{http} proxies.
+
+@c man end
+This chapter is a partial overview of Wget's features.
+
+@itemize @bullet
+@item
+@c man begin DESCRIPTION
+Wget is non-interactive, meaning that it can work in the background,
+while the user is not logged on. This allows you to start a retrieval
+and disconnect from the system, letting Wget finish the work. By
+contrast, most of the Web browsers require constant user's presence,
+which can be a great hindrance when transferring a lot of data.
+@c man end
+
+@item
+@ignore
+@c man begin DESCRIPTION
+
+@c man end
+@end ignore
+@c man begin DESCRIPTION
+Wget can follow links in @sc{html}, @sc{xhtml}, and @sc{css} pages, to
+create local versions of remote web sites, fully recreating the
+directory structure of the original site. This is sometimes referred to
+as ``recursive downloading.'' While doing that, Wget respects the Robot
+Exclusion Standard (@file{/robots.txt}). Wget can be instructed to
+convert the links in downloaded files to point at the local files, for
+offline viewing.
+@c man end
+
+@item
+File name wildcard matching and recursive mirroring of directories are
+available when retrieving via @sc{ftp}. Wget can read the time-stamp
+information given by both @sc{http} and @sc{ftp} servers, and store it
+locally. Thus Wget can see if the remote file has changed since last
+retrieval, and automatically retrieve the new version if it has. This
+makes Wget suitable for mirroring of @sc{ftp} sites, as well as home
+pages.
+
+@item
+@ignore
+@c man begin DESCRIPTION
+
+@c man end
+@end ignore
+@c man begin DESCRIPTION
+Wget has been designed for robustness over slow or unstable network
+connections; if a download fails due to a network problem, it will
+keep retrying until the whole file has been retrieved. If the server
+supports regetting, it will instruct the server to continue the
+download from where it left off.
+@c man end
+
+@item
+Wget supports proxy servers, which can lighten the network load, speed
+up retrieval and provide access behind firewalls. Wget uses the passive
+@sc{ftp} downloading by default, active @sc{ftp} being an option.
+
+@item
+Wget supports IP version 6, the next generation of IP. IPv6 is
+autodetected at compile-time, and can be disabled at either build or
+run time. Binaries built with IPv6 support work well in both
+IPv4-only and dual family environments.
+
+@item
+Built-in features offer mechanisms to tune which links you wish to follow
+(@pxref{Following Links}).
+
+@item
+The progress of individual downloads is traced using a progress gauge.
+Interactive downloads are tracked using a ``thermometer''-style gauge,
+whereas non-interactive ones are traced with dots, each dot
+representing a fixed amount of data received (1KB by default). Either
+gauge can be customized to your preferences.
+
+@item
+Most of the features are fully configurable, either through command line
+options, or via the initialization file @file{.wgetrc} (@pxref{Startup
+File}). Wget allows you to define @dfn{global} startup files
+(@file{/usr/local/etc/wgetrc} by default) for site settings. You can also
+specify the location of a startup file with the --config option.
+To disable the reading of config files, use --no-config.
+If both --config and --no-config are given, --no-config is ignored.
+
+
+@ignore
+@c man begin FILES
+@table @samp
+@item /usr/local/etc/wgetrc
+Default location of the @dfn{global} startup file.
+
+@item .wgetrc
+User startup file.
+@end table
+@c man end
+@end ignore
+
+@item
+Finally, GNU Wget is free software. This means that everyone may use
+it, redistribute it and/or modify it under the terms of the GNU General
+Public License, as published by the Free Software Foundation (see the
+file @file{COPYING} that came with GNU Wget, for details).
+@end itemize
+
+@node Invoking, Recursive Download, Overview, Top
+@chapter Invoking
+@cindex invoking
+@cindex command line
+@cindex arguments
+@cindex nohup
+
+By default, Wget is very simple to invoke. The basic syntax is:
+
+@example
+@c man begin SYNOPSIS
+wget [@var{option}]@dots{} [@var{URL}]@dots{}
+@c man end
+@end example
+
+Wget will simply download all the @sc{url}s specified on the command
+line. @var{URL} is a @dfn{Uniform Resource Locator}, as defined below.
+
+However, you may wish to change some of the default parameters of
+Wget. You can do it two ways: permanently, adding the appropriate
+command to @file{.wgetrc} (@pxref{Startup File}), or specifying it on
+the command line.
+
+@menu
+* URL Format::
+* Option Syntax::
+* Basic Startup Options::
+* Logging and Input File Options::
+* Download Options::
+* Directory Options::
+* HTTP Options::
+* HTTPS (SSL/TLS) Options::
+* FTP Options::
+* Recursive Retrieval Options::
+* Recursive Accept/Reject Options::
+* Exit Status::
+@end menu
+
+@node URL Format, Option Syntax, Invoking, Invoking
+@section URL Format
+@cindex URL
+@cindex URL syntax
+
+@dfn{URL} is an acronym for Uniform Resource Locator. A uniform
+resource locator is a compact string representation for a resource
+available via the Internet. Wget recognizes the @sc{url} syntax as per
+@sc{rfc1738}. This is the most widely used form (square brackets denote
+optional parts):
+
+@example
+http://host[:port]/directory/file
+ftp://host[:port]/directory/file
+@end example
+
+You can also encode your username and password within a @sc{url}:
+
+@example
+ftp://user:password@@host/path
+http://user:password@@host/path
+@end example
+
+Either @var{user} or @var{password}, or both, may be left out. If you
+leave out either the @sc{http} username or password, no authentication
+will be sent. If you leave out the @sc{ftp} username, @samp{anonymous}
+will be used. If you leave out the @sc{ftp} password, your email
+address will be supplied as a default password.@footnote{If you have a
+@file{.netrc} file in your home directory, password will also be
+searched for there.}
+
+@strong{Important Note}: if you specify a password-containing @sc{url}
+on the command line, the username and password will be plainly visible
+to all users on the system, by way of @code{ps}. On multi-user systems,
+this is a big security risk. To work around it, use @code{wget -i -}
+and feed the @sc{url}s to Wget's standard input, each on a separate
+line, terminated by @kbd{C-d}.
+
+You can encode unsafe characters in a @sc{url} as @samp{%xy}, @code{xy}
+being the hexadecimal representation of the character's @sc{ascii}
+value. Some common unsafe characters include @samp{%} (quoted as
+@samp{%25}), @samp{:} (quoted as @samp{%3A}), and @samp{@@} (quoted as
+@samp{%40}). Refer to @sc{rfc1738} for a comprehensive list of unsafe
+characters.
+
+Wget also supports the @code{type} feature for @sc{ftp} @sc{url}s. By
+default, @sc{ftp} documents are retrieved in the binary mode (type
+@samp{i}), which means that they are downloaded unchanged. Another
+useful mode is the @samp{a} (@dfn{ASCII}) mode, which converts the line
+delimiters between the different operating systems, and is thus useful
+for text files. Here is an example:
+
+@example
+ftp://host/directory/file;type=a
+@end example
+
+Two alternative variants of @sc{url} specification are also supported,
+because of historical (hysterical?) reasons and their widespreaded use.
+
+@sc{ftp}-only syntax (supported by @code{NcFTP}):
+@example
+host:/dir/file
+@end example
+
+@sc{http}-only syntax (introduced by @code{Netscape}):
+@example
+host[:port]/dir/file
+@end example
+
+These two alternative forms are deprecated, and may cease being
+supported in the future.
+
+If you do not understand the difference between these notations, or do
+not know which one to use, just use the plain ordinary format you use
+with your favorite browser, like @code{Lynx} or @code{Netscape}.
+
+@c man begin OPTIONS
+
+@node Option Syntax, Basic Startup Options, URL Format, Invoking
+@section Option Syntax
+@cindex option syntax
+@cindex syntax of options
+
+Since Wget uses GNU getopt to process command-line arguments, every
+option has a long form along with the short one. Long options are
+more convenient to remember, but take time to type. You may freely
+mix different option styles, or specify options after the command-line
+arguments. Thus you may write:
+
+@example
+wget -r --tries=10 http://fly.srk.fer.hr/ -o log
+@end example
+
+The space between the option accepting an argument and the argument may
+be omitted. Instead of @samp{-o log} you can write @samp{-olog}.
+
+You may put several options that do not require arguments together,
+like:
+
+@example
+wget -drc @var{URL}
+@end example
+
+This is completely equivalent to:
+
+@example
+wget -d -r -c @var{URL}
+@end example
+
+Since the options can be specified after the arguments, you may
+terminate them with @samp{--}. So the following will try to download
+@sc{url} @samp{-x}, reporting failure to @file{log}:
+
+@example
+wget -o log -- -x
+@end example
+
+The options that accept comma-separated lists all respect the convention
+that specifying an empty list clears its value. This can be useful to
+clear the @file{.wgetrc} settings. For instance, if your @file{.wgetrc}
+sets @code{exclude_directories} to @file{/cgi-bin}, the following
+example will first reset it, and then set it to exclude @file{/~nobody}
+and @file{/~somebody}. You can also clear the lists in @file{.wgetrc}
+(@pxref{Wgetrc Syntax}).
+
+@example
+wget -X '' -X /~nobody,/~somebody
+@end example
+
+Most options that do not accept arguments are @dfn{boolean} options,
+so named because their state can be captured with a yes-or-no
+(``boolean'') variable. For example, @samp{--follow-ftp} tells Wget
+to follow FTP links from HTML files and, on the other hand,
+@samp{--no-glob} tells it not to perform file globbing on FTP URLs. A
+boolean option is either @dfn{affirmative} or @dfn{negative}
+(beginning with @samp{--no}). All such options share several
+properties.
+
+Unless stated otherwise, it is assumed that the default behavior is
+the opposite of what the option accomplishes. For example, the
+documented existence of @samp{--follow-ftp} assumes that the default
+is to @emph{not} follow FTP links from HTML pages.
+
+Affirmative options can be negated by prepending the @samp{--no-} to
+the option name; negative options can be negated by omitting the
+@samp{--no-} prefix. This might seem superfluous---if the default for
+an affirmative option is to not do something, then why provide a way
+to explicitly turn it off? But the startup file may in fact change
+the default. For instance, using @code{follow_ftp = on} in
+@file{.wgetrc} makes Wget @emph{follow} FTP links by default, and
+using @samp{--no-follow-ftp} is the only way to restore the factory
+default from the command line.
+
+@node Basic Startup Options, Logging and Input File Options, Option Syntax, Invoking
+@section Basic Startup Options
+
+@table @samp
+@item -V
+@itemx --version
+Display the version of Wget.
+
+@item -h
+@itemx --help
+Print a help message describing all of Wget's command-line options.
+
+@item -b
+@itemx --background
+Go to background immediately after startup. If no output file is
+specified via the @samp{-o}, output is redirected to @file{wget-log}.
+
+@cindex execute wgetrc command
+@item -e @var{command}
+@itemx --execute @var{command}
+Execute @var{command} as if it were a part of @file{.wgetrc}
+(@pxref{Startup File}). A command thus invoked will be executed
+@emph{after} the commands in @file{.wgetrc}, thus taking precedence over
+them. If you need to specify more than one wgetrc command, use multiple
+instances of @samp{-e}.
+
+@end table
+
+@node Logging and Input File Options, Download Options, Basic Startup Options, Invoking
+@section Logging and Input File Options
+
+@table @samp
+@cindex output file
+@cindex log file
+@item -o @var{logfile}
+@itemx --output-file=@var{logfile}
+Log all messages to @var{logfile}. The messages are normally reported
+to standard error.
+
+@cindex append to log
+@item -a @var{logfile}
+@itemx --append-output=@var{logfile}
+Append to @var{logfile}. This is the same as @samp{-o}, only it appends
+to @var{logfile} instead of overwriting the old log file. If
+@var{logfile} does not exist, a new file is created.
+
+@cindex debug
+@item -d
+@itemx --debug
+Turn on debug output, meaning various information important to the
+developers of Wget if it does not work properly. Your system
+administrator may have chosen to compile Wget without debug support, in
+which case @samp{-d} will not work. Please note that compiling with
+debug support is always safe---Wget compiled with the debug support will
+@emph{not} print any debug info unless requested with @samp{-d}.
+@xref{Reporting Bugs}, for more information on how to use @samp{-d} for
+sending bug reports.
+
+@cindex quiet
+@item -q
+@itemx --quiet
+Turn off Wget's output.
+
+@cindex verbose
+@item -v
+@itemx --verbose
+Turn on verbose output, with all the available data. The default output
+is verbose.
+
+@item -nv
+@itemx --no-verbose
+Turn off verbose without being completely quiet (use @samp{-q} for
+that), which means that error messages and basic information still get
+printed.
+
+@item --report-speed=@var{type}
+Output bandwidth as @var{type}. The only accepted value is @samp{bits}.
+
+@cindex input-file
+@item -i @var{file}
+@itemx --input-file=@var{file}
+Read @sc{url}s from a local or external @var{file}. If @samp{-} is
+specified as @var{file}, @sc{url}s are read from the standard input.
+(Use @samp{./-} to read from a file literally named @samp{-}.)
+
+If this function is used, no @sc{url}s need be present on the command
+line. If there are @sc{url}s both on the command line and in an input
+file, those on the command lines will be the first ones to be
+retrieved. If @samp{--force-html} is not specified, then @var{file}
+should consist of a series of URLs, one per line.
+
+However, if you specify @samp{--force-html}, the document will be
+regarded as @samp{html}. In that case you may have problems with
+relative links, which you can solve either by adding @code{<base
+href="@var{url}">} to the documents or by specifying
+@samp{--base=@var{url}} on the command line.
+
+If the @var{file} is an external one, the document will be automatically
+treated as @samp{html} if the Content-Type matches @samp{text/html}.
+Furthermore, the @var{file}'s location will be implicitly used as base
+href if none was specified.
+
+@cindex input-metalink
+@item --input-metalink=@var{file}
+Downloads files covered in local Metalink @var{file}. Metalink version 3
+and 4 are supported.
+
+@cindex keep-badhash
+@item --keep-badhash
+Keeps downloaded Metalink's files with a bad hash. It appends .badhash
+to the name of Metalink's files which have a checksum mismatch, except
+without overwriting existing files.
+
+@cindex metalink-over-http
+@item --metalink-over-http
+Issues HTTP HEAD request instead of GET and extracts Metalink metadata
+from response headers. Then it switches to Metalink download.
+If no valid Metalink metadata is found, it falls back to ordinary HTTP download.
+Enables @samp{Content-Type: application/metalink4+xml} files download/processing.
+
+@cindex metalink-index
+@item --metalink-index=@var{number}
+Set the Metalink @samp{application/metalink4+xml} metaurl ordinal
+NUMBER. From 1 to the total number of ``application/metalink4+xml''
+available. Specify 0 or @samp{inf} to choose the first good one.
+Metaurls, such as those from a @samp{--metalink-over-http}, may have
+been sorted by priority key's value; keep this in mind to choose the
+right NUMBER.
+
+@cindex preferred-location
+@item --preferred-location
+Set preferred location for Metalink resources. This has effect if multiple
+resources with same priority are available.
+
+@cindex xattr
+@item --xattr
+Enable use of file system's extended attributes to save the
+original URL and the Referer HTTP header value if used.
+
+Be aware that the URL might contain private information like
+access tokens or credentials.
+
+
+@cindex force html
+@item -F
+@itemx --force-html
+When input is read from a file, force it to be treated as an @sc{html}
+file. This enables you to retrieve relative links from existing
+@sc{html} files on your local disk, by adding @code{<base
+href="@var{url}">} to @sc{html}, or using the @samp{--base} command-line
+option.
+
+@cindex base for relative links in input file
+@item -B @var{URL}
+@itemx --base=@var{URL}
+Resolves relative links using @var{URL} as the point of reference,
+when reading links from an HTML file specified via the
+@samp{-i}/@samp{--input-file} option (together with
+@samp{--force-html}, or when the input file was fetched remotely from
+a server describing it as @sc{html}). This is equivalent to the
+presence of a @code{BASE} tag in the @sc{html} input file, with
+@var{URL} as the value for the @code{href} attribute.
+
+For instance, if you specify @samp{http://foo/bar/a.html} for
+@var{URL}, and Wget reads @samp{../baz/b.html} from the input file, it
+would be resolved to @samp{http://foo/baz/b.html}.
+
+@cindex specify config
+@item --config=@var{FILE}
+Specify the location of a startup file you wish to use instead of the
+default one(s). Use --no-config to disable reading of config files.
+If both --config and --no-config are given, --no-config is ignored.
+
+
+@item --rejected-log=@var{logfile}
+Logs all URL rejections to @var{logfile} as comma separated values. The values
+include the reason of rejection, the URL and the parent URL it was found in.
+
+@end table
+
+@node Download Options, Directory Options, Logging and Input File Options, Invoking
+@section Download Options
+
+@table @samp
+@cindex bind address
+@cindex client IP address
+@cindex IP address, client
+@item --bind-address=@var{ADDRESS}
+When making client TCP/IP connections, bind to @var{ADDRESS} on
+the local machine. @var{ADDRESS} may be specified as a hostname or IP
+address. This option can be useful if your machine is bound to multiple
+IPs.
+
+@cindex bind DNS address
+@cindex client DNS address
+@cindex DNS IP address, client, DNS
+@item --bind-dns-address=@var{ADDRESS}
+[libcares only]
+This address overrides the route for DNS requests. If you ever need to
+circumvent the standard settings from /etc/resolv.conf, this option together
+with @samp{--dns-servers} is your friend.
+@var{ADDRESS} must be specified either as IPv4 or IPv6 address.
+Wget needs to be built with libcares for this option to be available.
+
+@cindex DNS server
+@cindex DNS IP address, client, DNS
+@item --dns-servers=@var{ADDRESSES}
+[libcares only]
+The given address(es) override the standard nameserver
+addresses, e.g. as configured in /etc/resolv.conf.
+@var{ADDRESSES} may be specified either as IPv4 or IPv6 addresses,
+comma-separated.
+Wget needs to be built with libcares for this option to be available.
+
+@cindex retries
+@cindex tries
+@cindex number of tries
+@item -t @var{number}
+@itemx --tries=@var{number}
+Set number of tries to @var{number}. Specify 0 or @samp{inf} for
+infinite retrying. The default is to retry 20 times, with the exception
+of fatal errors like ``connection refused'' or ``not found'' (404),
+which are not retried.
+
+@item -O @var{file}
+@itemx --output-document=@var{file}
+The documents will not be written to the appropriate files, but all
+will be concatenated together and written to @var{file}. If @samp{-}
+is used as @var{file}, documents will be printed to standard output,
+disabling link conversion. (Use @samp{./-} to print to a file
+literally named @samp{-}.)
+
+Use of @samp{-O} is @emph{not} intended to mean simply ``use the name
+@var{file} instead of the one in the URL;'' rather, it is
+analogous to shell redirection:
+@samp{wget -O file http://foo} is intended to work like
+@samp{wget -O - http://foo > file}; @file{file} will be truncated
+immediately, and @emph{all} downloaded content will be written there.
+
+For this reason, @samp{-N} (for timestamp-checking) is not supported
+in combination with @samp{-O}: since @var{file} is always newly
+created, it will always have a very new timestamp. A warning will be
+issued if this combination is used.
+
+Similarly, using @samp{-r} or @samp{-p} with @samp{-O} may not work as
+you expect: Wget won't just download the first file to @var{file} and
+then download the rest to their normal names: @emph{all} downloaded
+content will be placed in @var{file}. This was disabled in version
+1.11, but has been reinstated (with a warning) in 1.11.2, as there are
+some cases where this behavior can actually have some use.
+
+A combination with @samp{-nc} is only accepted if the given output
+file does not exist.
+
+Note that a combination with @samp{-k} is only permitted when
+downloading a single document, as in that case it will just convert
+all relative URIs to external ones; @samp{-k} makes no sense for
+multiple URIs when they're all being downloaded to a single file;
+@samp{-k} can be used only when the output is a regular file.
+
+@cindex clobbering, file
+@cindex downloading multiple times
+@cindex no-clobber
+@item -nc
+@itemx --no-clobber
+If a file is downloaded more than once in the same directory, Wget's
+behavior depends on a few options, including @samp{-nc}. In certain
+cases, the local file will be @dfn{clobbered}, or overwritten, upon
+repeated download. In other cases it will be preserved.
+
+When running Wget without @samp{-N}, @samp{-nc}, @samp{-r}, or
+@samp{-p}, downloading the same file in the same directory will result
+in the original copy of @var{file} being preserved and the second copy
+being named @samp{@var{file}.1}. If that file is downloaded yet
+again, the third copy will be named @samp{@var{file}.2}, and so on.
+(This is also the behavior with @samp{-nd}, even if @samp{-r} or
+@samp{-p} are in effect.) When @samp{-nc} is specified, this behavior
+is suppressed, and Wget will refuse to download newer copies of
+@samp{@var{file}}. Therefore, ``@code{no-clobber}'' is actually a
+misnomer in this mode---it's not clobbering that's prevented (as the
+numeric suffixes were already preventing clobbering), but rather the
+multiple version saving that's prevented.
+
+When running Wget with @samp{-r} or @samp{-p}, but without @samp{-N},
+@samp{-nd}, or @samp{-nc}, re-downloading a file will result in the
+new copy simply overwriting the old. Adding @samp{-nc} will prevent
+this behavior, instead causing the original version to be preserved
+and any newer copies on the server to be ignored.
+
+When running Wget with @samp{-N}, with or without @samp{-r} or
+@samp{-p}, the decision as to whether or not to download a newer copy
+of a file depends on the local and remote timestamp and size of the
+file (@pxref{Time-Stamping}). @samp{-nc} may not be specified at the
+same time as @samp{-N}.
+
+A combination with @samp{-O}/@samp{--output-document} is only accepted
+if the given output file does not exist.
+
+Note that when @samp{-nc} is specified, files with the suffixes
+@samp{.html} or @samp{.htm} will be loaded from the local disk and
+parsed as if they had been retrieved from the Web.
+
+@cindex backing up files
+@item --backups=@var{backups}
+Before (over)writing a file, back up an existing file by adding a
+@samp{.1} suffix (@samp{_1} on VMS) to the file name. Such backup
+files are rotated to @samp{.2}, @samp{.3}, and so on, up to
+@var{backups} (and lost beyond that).
+
+@cindex authentication credentials
+@item --no-netrc
+Do not try to obtain credentials from @file{.netrc} file. By default
+@file{.netrc} file is searched for credentials in case none have been
+passed on command line and authentication is required.
+
+@cindex continue retrieval
+@cindex incomplete downloads
+@cindex resume download
+@item -c
+@itemx --continue
+Continue getting a partially-downloaded file. This is useful when you
+want to finish up a download started by a previous instance of Wget, or
+by another program. For instance:
+
+@example
+wget -c ftp://sunsite.doc.ic.ac.uk/ls-lR.Z
+@end example
+
+If there is a file named @file{ls-lR.Z} in the current directory, Wget
+will assume that it is the first portion of the remote file, and will
+ask the server to continue the retrieval from an offset equal to the
+length of the local file.
+
+Note that you don't need to specify this option if you just want the
+current invocation of Wget to retry downloading a file should the
+connection be lost midway through. This is the default behavior.
+@samp{-c} only affects resumption of downloads started @emph{prior} to
+this invocation of Wget, and whose local files are still sitting around.
+
+Without @samp{-c}, the previous example would just download the remote
+file to @file{ls-lR.Z.1}, leaving the truncated @file{ls-lR.Z} file
+alone.
+
+If you use @samp{-c} on a non-empty file, and the server does not support
+continued downloading, Wget will restart the download from scratch and overwrite
+the existing file entirely.
+
+Beginning with Wget 1.7, if you use @samp{-c} on a file which is of
+equal size as the one on the server, Wget will refuse to download the
+file and print an explanatory message. The same happens when the file
+is smaller on the server than locally (presumably because it was changed
+on the server since your last download attempt)---because ``continuing''
+is not meaningful, no download occurs.
+
+On the other side of the coin, while using @samp{-c}, any file that's
+bigger on the server than locally will be considered an incomplete
+download and only @code{(length(remote) - length(local))} bytes will be
+downloaded and tacked onto the end of the local file. This behavior can
+be desirable in certain cases---for instance, you can use @samp{wget -c}
+to download just the new portion that's been appended to a data
+collection or log file.
+
+However, if the file is bigger on the server because it's been
+@emph{changed}, as opposed to just @emph{appended} to, you'll end up
+with a garbled file. Wget has no way of verifying that the local file
+is really a valid prefix of the remote file. You need to be especially
+careful of this when using @samp{-c} in conjunction with @samp{-r},
+since every file will be considered as an "incomplete download" candidate.
+
+Another instance where you'll get a garbled file if you try to use
+@samp{-c} is if you have a lame @sc{http} proxy that inserts a
+``transfer interrupted'' string into the local file. In the future a
+``rollback'' option may be added to deal with this case.
+
+Note that @samp{-c} only works with @sc{ftp} servers and with @sc{http}
+servers that support the @code{Range} header.
+
+@cindex offset
+@cindex continue retrieval
+@cindex incomplete downloads
+@cindex resume download
+@cindex start position
+@item --start-pos=@var{OFFSET}
+Start downloading at zero-based position @var{OFFSET}. Offset may be expressed
+in bytes, kilobytes with the `k' suffix, or megabytes with the `m' suffix, etc.
+
+@samp{--start-pos} has higher precedence over @samp{--continue}. When
+@samp{--start-pos} and @samp{--continue} are both specified, wget will emit a
+warning then proceed as if @samp{--continue} was absent.
+
+Server support for continued download is required, otherwise @samp{--start-pos}
+cannot help. See @samp{-c} for details.
+
+@cindex progress indicator
+@cindex dot style
+@item --progress=@var{type}
+Select the type of the progress indicator you wish to use. Legal
+indicators are ``dot'' and ``bar''.
+
+The ``bar'' indicator is used by default. It draws an @sc{ascii} progress
+bar graphics (a.k.a ``thermometer'' display) indicating the status of
+retrieval. If the output is not a TTY, the ``dot'' bar will be used by
+default.
+
+Use @samp{--progress=dot} to switch to the ``dot'' display. It traces
+the retrieval by printing dots on the screen, each dot representing a
+fixed amount of downloaded data.
+
+The progress @var{type} can also take one or more parameters. The parameters
+vary based on the @var{type} selected. Parameters to @var{type} are passed by
+appending them to the type sperated by a colon (:) like this:
+@samp{--progress=@var{type}:@var{parameter1}:@var{parameter2}}.
+
+When using the dotted retrieval, you may set the @dfn{style} by
+specifying the type as @samp{dot:@var{style}}. Different styles assign
+different meaning to one dot. With the @code{default} style each dot
+represents 1K, there are ten dots in a cluster and 50 dots in a line.
+The @code{binary} style has a more ``computer''-like orientation---8K
+dots, 16-dots clusters and 48 dots per line (which makes for 384K
+lines). The @code{mega} style is suitable for downloading large
+files---each dot represents 64K retrieved, there are eight dots in a
+cluster, and 48 dots on each line (so each line contains 3M).
+If @code{mega} is not enough then you can use the @code{giga}
+style---each dot represents 1M retrieved, there are eight dots in a
+cluster, and 32 dots on each line (so each line contains 32M).
+
+With @samp{--progress=bar}, there are currently two possible parameters,
+@var{force} and @var{noscroll}.
+
+When the output is not a TTY, the progress bar always falls back to ``dot'',
+even if @samp{--progress=bar} was passed to Wget during invocation. This
+behaviour can be overridden and the ``bar'' output forced by using the ``force''
+parameter as @samp{--progress=bar:force}.
+
+By default, the @samp{bar} style progress bar scroll the name of the file from
+left to right for the file being downloaded if the filename exceeds the maximum
+length allotted for its display. In certain cases, such as with
+@samp{--progress=bar:force}, one may not want the scrolling filename in the
+progress bar. By passing the ``noscroll'' parameter, Wget can be forced to
+display as much of the filename as possible without scrolling through it.
+
+Note that you can set the default style using the @code{progress}
+command in @file{.wgetrc}. That setting may be overridden from the
+command line. For example, to force the bar output without scrolling,
+use @samp{--progress=bar:force:noscroll}.
+
+@item --show-progress
+Force wget to display the progress bar in any verbosity.
+
+By default, wget only displays the progress bar in verbose mode. One may
+however, want wget to display the progress bar on screen in conjunction with
+any other verbosity modes like @samp{--no-verbose} or @samp{--quiet}. This
+is often a desired a property when invoking wget to download several small/large
+files. In such a case, wget could simply be invoked with this parameter to get
+a much cleaner output on the screen.
+
+This option will also force the progress bar to be printed to @file{stderr} when
+used alongside the @samp{--output-file} option.
+
+@item -N
+@itemx --timestamping
+Turn on time-stamping. @xref{Time-Stamping}, for details.
+
+@item --no-if-modified-since
+Do not send If-Modified-Since header in @samp{-N} mode. Send preliminary HEAD
+request instead. This has only effect in @samp{-N} mode.
+
+@item --no-use-server-timestamps
+Don't set the local file's timestamp by the one on the server.
+
+By default, when a file is downloaded, its timestamps are set to
+match those from the remote file. This allows the use of
+@samp{--timestamping} on subsequent invocations of wget. However, it
+is sometimes useful to base the local file's timestamp on when it was
+actually downloaded; for that purpose, the
+@samp{--no-use-server-timestamps} option has been provided.
+
+@cindex server response, print
+@item -S
+@itemx --server-response
+Print the headers sent by @sc{http} servers and responses sent by
+@sc{ftp} servers.
+
+@cindex Wget as spider
+@cindex spider
+@item --spider
+When invoked with this option, Wget will behave as a Web @dfn{spider},
+which means that it will not download the pages, just check that they
+are there. For example, you can use Wget to check your bookmarks:
+
+@example
+wget --spider --force-html -i bookmarks.html
+@end example
+
+This feature needs much more work for Wget to get close to the
+functionality of real web spiders.
+
+@cindex timeout
+@item -T seconds
+@itemx --timeout=@var{seconds}
+Set the network timeout to @var{seconds} seconds. This is equivalent
+to specifying @samp{--dns-timeout}, @samp{--connect-timeout}, and
+@samp{--read-timeout}, all at the same time.
+
+When interacting with the network, Wget can check for timeout and
+abort the operation if it takes too long. This prevents anomalies
+like hanging reads and infinite connects. The only timeout enabled by
+default is a 900-second read timeout. Setting a timeout to 0 disables
+it altogether. Unless you know what you are doing, it is best not to
+change the default timeout settings.
+
+All timeout-related options accept decimal values, as well as
+subsecond values. For example, @samp{0.1} seconds is a legal (though
+unwise) choice of timeout. Subsecond timeouts are useful for checking
+server response times or for testing network latency.
+
+@cindex DNS timeout
+@cindex timeout, DNS
+@item --dns-timeout=@var{seconds}
+Set the DNS lookup timeout to @var{seconds} seconds. DNS lookups that
+don't complete within the specified time will fail. By default, there
+is no timeout on DNS lookups, other than that implemented by system
+libraries.
+
+@cindex connect timeout
+@cindex timeout, connect
+@item --connect-timeout=@var{seconds}
+Set the connect timeout to @var{seconds} seconds. TCP connections that
+take longer to establish will be aborted. By default, there is no
+connect timeout, other than that implemented by system libraries.
+
+@cindex read timeout
+@cindex timeout, read
+@item --read-timeout=@var{seconds}
+Set the read (and write) timeout to @var{seconds} seconds. The
+``time'' of this timeout refers to @dfn{idle time}: if, at any point in
+the download, no data is received for more than the specified number
+of seconds, reading fails and the download is restarted. This option
+does not directly affect the duration of the entire download.
+
+Of course, the remote server may choose to terminate the connection
+sooner than this option requires. The default read timeout is 900
+seconds.
+
+@cindex bandwidth, limit
+@cindex rate, limit
+@cindex limit bandwidth
+@item --limit-rate=@var{amount}
+Limit the download speed to @var{amount} bytes per second. Amount may
+be expressed in bytes, kilobytes with the @samp{k} suffix, or megabytes
+with the @samp{m} suffix. For example, @samp{--limit-rate=20k} will
+limit the retrieval rate to 20KB/s. This is useful when, for whatever
+reason, you don't want Wget to consume the entire available bandwidth.
+
+This option allows the use of decimal numbers, usually in conjunction
+with power suffixes; for example, @samp{--limit-rate=2.5k} is a legal
+value.
+
+Note that Wget implements the limiting by sleeping the appropriate
+amount of time after a network read that took less time than specified
+by the rate. Eventually this strategy causes the TCP transfer to slow
+down to approximately the specified rate. However, it may take some
+time for this balance to be achieved, so don't be surprised if limiting
+the rate doesn't work well with very small files.
+
+@cindex pause
+@cindex wait
+@item -w @var{seconds}
+@itemx --wait=@var{seconds}
+Wait the specified number of seconds between the retrievals. Use of
+this option is recommended, as it lightens the server load by making the
+requests less frequent. Instead of in seconds, the time can be
+specified in minutes using the @code{m} suffix, in hours using @code{h}
+suffix, or in days using @code{d} suffix.
+
+Specifying a large value for this option is useful if the network or the
+destination host is down, so that Wget can wait long enough to
+reasonably expect the network error to be fixed before the retry. The
+waiting interval specified by this function is influenced by
+@code{--random-wait}, which see.
+
+@cindex retries, waiting between
+@cindex waiting between retries
+@item --waitretry=@var{seconds}
+If you don't want Wget to wait between @emph{every} retrieval, but only
+between retries of failed downloads, you can use this option. Wget will
+use @dfn{linear backoff}, waiting 1 second after the first failure on a
+given file, then waiting 2 seconds after the second failure on that
+file, up to the maximum number of @var{seconds} you specify.
+
+By default, Wget will assume a value of 10 seconds.
+
+@cindex wait, random
+@cindex random wait
+@item --random-wait
+Some web sites may perform log analysis to identify retrieval programs
+such as Wget by looking for statistically significant similarities in
+the time between requests. This option causes the time between requests
+to vary between 0.5 and 1.5 * @var{wait} seconds, where @var{wait} was
+specified using the @samp{--wait} option, in order to mask Wget's
+presence from such analysis.
+
+A 2001 article in a publication devoted to development on a popular
+consumer platform provided code to perform this analysis on the fly.
+Its author suggested blocking at the class C address level to ensure
+automated retrieval programs were blocked despite changing DHCP-supplied
+addresses.
+
+The @samp{--random-wait} option was inspired by this ill-advised
+recommendation to block many unrelated users from a web site due to the
+actions of one.
+
+@cindex proxy
+@item --no-proxy
+Don't use proxies, even if the appropriate @code{*_proxy} environment
+variable is defined.
+
+@c man end
+@xref{Proxies}, for more information about the use of proxies with
+Wget.
+@c man begin OPTIONS
+
+@cindex quota
+@item -Q @var{quota}
+@itemx --quota=@var{quota}
+Specify download quota for automatic retrievals. The value can be
+specified in bytes (default), kilobytes (with @samp{k} suffix), or
+megabytes (with @samp{m} suffix).
+
+Note that quota will never affect downloading a single file. So if you
+specify @samp{wget -Q10k https://example.com/ls-lR.gz}, all of the
+@file{ls-lR.gz} will be downloaded. The same goes even when several
+@sc{url}s are specified on the command-line. The quota is checked only
+at the end of each downloaded file, so it will never result in a partially
+downloaded file. Thus you may safely type @samp{wget -Q2m -i sites}---download
+will be aborted after the file that exhausts the quota is completely
+downloaded.
+
+Setting quota to 0 or to @samp{inf} unlimits the download quota.
+
+@cindex DNS cache
+@cindex caching of DNS lookups
+@item --no-dns-cache
+Turn off caching of DNS lookups. Normally, Wget remembers the IP
+addresses it looked up from DNS so it doesn't have to repeatedly
+contact the DNS server for the same (typically small) set of hosts it
+retrieves from. This cache exists in memory only; a new Wget run will
+contact DNS again.
+
+However, it has been reported that in some situations it is not
+desirable to cache host names, even for the duration of a
+short-running application like Wget. With this option Wget issues a
+new DNS lookup (more precisely, a new call to @code{gethostbyname} or
+@code{getaddrinfo}) each time it makes a new connection. Please note
+that this option will @emph{not} affect caching that might be
+performed by the resolving library or by an external caching layer,
+such as NSCD.
+
+If you don't understand exactly what this option does, you probably
+won't need it.
+
+@cindex file names, restrict
+@cindex Windows file names
+@item --restrict-file-names=@var{modes}
+Change which characters found in remote URLs must be escaped during
+generation of local filenames. Characters that are @dfn{restricted}
+by this option are escaped, i.e. replaced with @samp{%HH}, where
+@samp{HH} is the hexadecimal number that corresponds to the restricted
+character. This option may also be used to force all alphabetical
+cases to be either lower- or uppercase.
+
+By default, Wget escapes the characters that are not valid or safe as
+part of file names on your operating system, as well as control
+characters that are typically unprintable. This option is useful for
+changing these defaults, perhaps because you are downloading to a
+non-native partition, or because you want to disable escaping of the
+control characters, or you want to further restrict characters to only
+those in the @sc{ascii} range of values.
+
+The @var{modes} are a comma-separated set of text values. The
+acceptable values are @samp{unix}, @samp{windows}, @samp{nocontrol},
+@samp{ascii}, @samp{lowercase}, and @samp{uppercase}. The values
+@samp{unix} and @samp{windows} are mutually exclusive (one will
+override the other), as are @samp{lowercase} and
+@samp{uppercase}. Those last are special cases, as they do not change
+the set of characters that would be escaped, but rather force local
+file paths to be converted either to lower- or uppercase.
+
+When ``unix'' is specified, Wget escapes the character @samp{/} and
+the control characters in the ranges 0--31 and 128--159. This is the
+default on Unix-like operating systems.
+
+When ``windows'' is given, Wget escapes the characters @samp{\},
+@samp{|}, @samp{/}, @samp{:}, @samp{?}, @samp{"}, @samp{*}, @samp{<},
+@samp{>}, and the control characters in the ranges 0--31 and 128--159.
+In addition to this, Wget in Windows mode uses @samp{+} instead of
+@samp{:} to separate host and port in local file names, and uses
+@samp{@@} instead of @samp{?} to separate the query portion of the file
+name from the rest. Therefore, a URL that would be saved as
+@samp{www.xemacs.org:4300/search.pl?input=blah} in Unix mode would be
+saved as @samp{www.xemacs.org+4300/search.pl@@input=blah} in Windows
+mode. This mode is the default on Windows.
+
+If you specify @samp{nocontrol}, then the escaping of the control
+characters is also switched off. This option may make sense
+when you are downloading URLs whose names contain UTF-8 characters, on
+a system which can save and display filenames in UTF-8 (some possible
+byte values used in UTF-8 byte sequences fall in the range of values
+designated by Wget as ``controls'').
+
+The @samp{ascii} mode is used to specify that any bytes whose values
+are outside the range of @sc{ascii} characters (that is, greater than
+127) shall be escaped. This can be useful when saving filenames
+whose encoding does not match the one used locally.
+
+@cindex IPv6
+@item -4
+@itemx --inet4-only
+@itemx -6
+@itemx --inet6-only
+Force connecting to IPv4 or IPv6 addresses. With @samp{--inet4-only}
+or @samp{-4}, Wget will only connect to IPv4 hosts, ignoring AAAA
+records in DNS, and refusing to connect to IPv6 addresses specified in
+URLs. Conversely, with @samp{--inet6-only} or @samp{-6}, Wget will
+only connect to IPv6 hosts and ignore A records and IPv4 addresses.
+
+Neither options should be needed normally. By default, an IPv6-aware
+Wget will use the address family specified by the host's DNS record.
+If the DNS responds with both IPv4 and IPv6 addresses, Wget will try
+them in sequence until it finds one it can connect to. (Also see
+@code{--prefer-family} option described below.)
+
+These options can be used to deliberately force the use of IPv4 or
+IPv6 address families on dual family systems, usually to aid debugging
+or to deal with broken network configuration. Only one of
+@samp{--inet6-only} and @samp{--inet4-only} may be specified at the
+same time. Neither option is available in Wget compiled without IPv6
+support.
+
+@item --prefer-family=none/IPv4/IPv6
+When given a choice of several addresses, connect to the addresses
+with specified address family first. The address order returned by
+DNS is used without change by default.
+
+This avoids spurious errors and connect attempts when accessing hosts
+that resolve to both IPv6 and IPv4 addresses from IPv4 networks. For
+example, @samp{www.kame.net} resolves to
+@samp{2001:200:0:8002:203:47ff:fea5:3085} and to
+@samp{203.178.141.194}. When the preferred family is @code{IPv4}, the
+IPv4 address is used first; when the preferred family is @code{IPv6},
+the IPv6 address is used first; if the specified value is @code{none},
+the address order returned by DNS is used without change.
+
+Unlike @samp{-4} and @samp{-6}, this option doesn't inhibit access to
+any address family, it only changes the @emph{order} in which the
+addresses are accessed. Also note that the reordering performed by
+this option is @dfn{stable}---it doesn't affect order of addresses of
+the same family. That is, the relative order of all IPv4 addresses
+and of all IPv6 addresses remains intact in all cases.
+
+@item --retry-connrefused
+Consider ``connection refused'' a transient error and try again.
+Normally Wget gives up on a URL when it is unable to connect to the
+site because failure to connect is taken as a sign that the server is
+not running at all and that retries would not help. This option is
+for mirroring unreliable sites whose servers tend to disappear for
+short periods of time.
+
+@cindex user
+@cindex password
+@cindex authentication
+@item --user=@var{user}
+@itemx --password=@var{password}
+Specify the username @var{user} and password @var{password} for both
+@sc{ftp} and @sc{http} file retrieval. These parameters can be overridden
+using the @samp{--ftp-user} and @samp{--ftp-password} options for
+@sc{ftp} connections and the @samp{--http-user} and @samp{--http-password}
+options for @sc{http} connections.
+
+@item --ask-password
+Prompt for a password for each connection established. Cannot be specified
+when @samp{--password} is being used, because they are mutually exclusive.
+
+@item --use-askpass=@var{command}
+Prompt for a user and password using the specified command. If no command is
+specified then the command in the environment variable WGET_ASKPASS is used.
+If WGET_ASKPASS is not set then the command in the environment variable
+SSH_ASKPASS is used.
+
+You can set the default command for use-askpass in the @file{.wgetrc}. That
+setting may be overridden from the command line.
+
+@cindex iri support
+@cindex idn support
+@item --no-iri
+
+Turn off internationalized URI (IRI) support. Use @samp{--iri} to
+turn it on. IRI support is activated by default.
+
+You can set the default state of IRI support using the @code{iri}
+command in @file{.wgetrc}. That setting may be overridden from the
+command line.
+
+@cindex local encoding
+@item --local-encoding=@var{encoding}
+
+Force Wget to use @var{encoding} as the default system encoding. That affects
+how Wget converts URLs specified as arguments from locale to @sc{utf-8} for
+IRI support.
+
+Wget use the function @code{nl_langinfo()} and then the @code{CHARSET}
+environment variable to get the locale. If it fails, @sc{ascii} is used.
+
+You can set the default local encoding using the @code{local_encoding}
+command in @file{.wgetrc}. That setting may be overridden from the
+command line.
+
+@cindex remote encoding
+@item --remote-encoding=@var{encoding}
+
+Force Wget to use @var{encoding} as the default remote server encoding.
+That affects how Wget converts URIs found in files from remote encoding
+to @sc{utf-8} during a recursive fetch. This options is only useful for
+IRI support, for the interpretation of non-@sc{ascii} characters.
+
+For HTTP, remote encoding can be found in HTTP @code{Content-Type}
+header and in HTML @code{Content-Type http-equiv} meta tag.
+
+You can set the default encoding using the @code{remoteencoding}
+command in @file{.wgetrc}. That setting may be overridden from the
+command line.
+
+@cindex unlink
+@item --unlink
+
+Force Wget to unlink file instead of clobbering existing file. This
+option is useful for downloading to the directory with hardlinks.
+
+@end table
+
+@node Directory Options, HTTP Options, Download Options, Invoking
+@section Directory Options
+
+@table @samp
+@item -nd
+@itemx --no-directories
+Do not create a hierarchy of directories when retrieving recursively.
+With this option turned on, all files will get saved to the current
+directory, without clobbering (if a name shows up more than once, the
+filenames will get extensions @samp{.n}).
+
+@item -x
+@itemx --force-directories
+The opposite of @samp{-nd}---create a hierarchy of directories, even if
+one would not have been created otherwise. E.g. @samp{wget -x
+http://fly.srk.fer.hr/robots.txt} will save the downloaded file to
+@file{fly.srk.fer.hr/robots.txt}.
+
+@item -nH
+@itemx --no-host-directories
+Disable generation of host-prefixed directories. By default, invoking
+Wget with @samp{-r http://fly.srk.fer.hr/} will create a structure of
+directories beginning with @file{fly.srk.fer.hr/}. This option disables
+such behavior.
+
+@item --protocol-directories
+Use the protocol name as a directory component of local file names. For
+example, with this option, @samp{wget -r http://@var{host}} will save to
+@samp{http/@var{host}/...} rather than just to @samp{@var{host}/...}.
+
+@cindex cut directories
+@item --cut-dirs=@var{number}
+Ignore @var{number} directory components. This is useful for getting a
+fine-grained control over the directory where recursive retrieval will
+be saved.
+
+Take, for example, the directory at
+@samp{ftp://ftp.xemacs.org/pub/xemacs/}. If you retrieve it with
+@samp{-r}, it will be saved locally under
+@file{ftp.xemacs.org/pub/xemacs/}. While the @samp{-nH} option can
+remove the @file{ftp.xemacs.org/} part, you are still stuck with
+@file{pub/xemacs}. This is where @samp{--cut-dirs} comes in handy; it
+makes Wget not ``see'' @var{number} remote directory components. Here
+are several examples of how @samp{--cut-dirs} option works.
+
+@example
+@group
+No options -> ftp.xemacs.org/pub/xemacs/
+-nH -> pub/xemacs/
+-nH --cut-dirs=1 -> xemacs/
+-nH --cut-dirs=2 -> .
+
+--cut-dirs=1 -> ftp.xemacs.org/xemacs/
+...
+@end group
+@end example
+
+If you just want to get rid of the directory structure, this option is
+similar to a combination of @samp{-nd} and @samp{-P}. However, unlike
+@samp{-nd}, @samp{--cut-dirs} does not lose with subdirectories---for
+instance, with @samp{-nH --cut-dirs=1}, a @file{beta/} subdirectory will
+be placed to @file{xemacs/beta}, as one would expect.
+
+@cindex directory prefix
+@item -P @var{prefix}
+@itemx --directory-prefix=@var{prefix}
+Set directory prefix to @var{prefix}. The @dfn{directory prefix} is the
+directory where all other files and subdirectories will be saved to,
+i.e. the top of the retrieval tree. The default is @samp{.} (the
+current directory).
+@end table
+
+@node HTTP Options, HTTPS (SSL/TLS) Options, Directory Options, Invoking
+@section HTTP Options
+
+@table @samp
+@cindex default page name
+@cindex index.html
+@item --default-page=@var{name}
+Use @var{name} as the default file name when it isn't known (i.e., for
+URLs that end in a slash), instead of @file{index.html}.
+
+@cindex .html extension
+@cindex .css extension
+@item -E
+@itemx --adjust-extension
+If a file of type @samp{application/xhtml+xml} or @samp{text/html} is
+downloaded and the URL does not end with the regexp
+@samp{\.[Hh][Tt][Mm][Ll]?}, this option will cause the suffix @samp{.html}
+to be appended to the local filename. This is useful, for instance, when
+you're mirroring a remote site that uses @samp{.asp} pages, but you want
+the mirrored pages to be viewable on your stock Apache server. Another
+good use for this is when you're downloading CGI-generated materials. A URL
+like @samp{http://site.com/article.cgi?25} will be saved as
+@file{article.cgi?25.html}.
+
+Note that filenames changed in this way will be re-downloaded every time
+you re-mirror a site, because Wget can't tell that the local
+@file{@var{X}.html} file corresponds to remote URL @samp{@var{X}} (since
+it doesn't yet know that the URL produces output of type
+@samp{text/html} or @samp{application/xhtml+xml}.
+
+As of version 1.12, Wget will also ensure that any downloaded files of
+type @samp{text/css} end in the suffix @samp{.css}, and the option was
+renamed from @samp{--html-extension}, to better reflect its new
+behavior. The old option name is still acceptable, but should now be
+considered deprecated.
+
+As of version 1.19.2, Wget will also ensure that any downloaded files with
+a @code{Content-Encoding} of @samp{br}, @samp{compress}, @samp{deflate}
+or @samp{gzip} end in the suffix @samp{.br}, @samp{.Z}, @samp{.zlib}
+and @samp{.gz} respectively.
+
+At some point in the future, this option may well be expanded to
+include suffixes for other types of content, including content types
+that are not parsed by Wget.
+
+@cindex http user
+@cindex http password
+@cindex authentication
+@item --http-user=@var{user}
+@itemx --http-password=@var{password}
+Specify the username @var{user} and password @var{password} on an
+@sc{http} server. According to the type of the challenge, Wget will
+encode them using either the @code{basic} (insecure),
+the @code{digest}, or the Windows @code{NTLM} authentication scheme.
+
+Another way to specify username and password is in the @sc{url} itself
+(@pxref{URL Format}). Either method reveals your password to anyone who
+bothers to run @code{ps}. To prevent the passwords from being seen,
+use the @samp{--use-askpass} or store them in @file{.wgetrc} or @file{.netrc},
+and make sure to protect those files from other users with @code{chmod}. If
+the passwords are really important, do not leave them lying in those files
+either---edit the files and delete them after Wget has started the download.
+
+@iftex
+@xref{Security Considerations}, for more information about security
+issues with Wget.
+@end iftex
+
+@cindex Keep-Alive, turning off
+@cindex Persistent Connections, disabling
+@item --no-http-keep-alive
+Turn off the ``keep-alive'' feature for HTTP downloads. Normally, Wget
+asks the server to keep the connection open so that, when you download
+more than one document from the same server, they get transferred over
+the same TCP connection. This saves time and at the same time reduces
+the load on the server.
+
+This option is useful when, for some reason, persistent (keep-alive)
+connections don't work for you, for example due to a server bug or due
+to the inability of server-side scripts to cope with the connections.
+
+@cindex proxy
+@cindex cache
+@item --no-cache
+Disable server-side cache. In this case, Wget will send the remote
+server appropriate directives (@samp{Cache-Control: no-cache} and
+@samp{Pragma: no-cache}) to get the file from the remote service,
+rather than returning the cached version. This is especially useful
+for retrieving and flushing out-of-date documents on proxy servers.
+
+Caching is allowed by default.
+
+@cindex cookies
+@item --no-cookies
+Disable the use of cookies. Cookies are a mechanism for maintaining
+server-side state. The server sends the client a cookie using the
+@code{Set-Cookie} header, and the client responds with the same cookie
+upon further requests. Since cookies allow the server owners to keep
+track of visitors and for sites to exchange this information, some
+consider them a breach of privacy. The default is to use cookies;
+however, @emph{storing} cookies is not on by default.
+
+@cindex loading cookies
+@cindex cookies, loading
+@item --load-cookies @var{file}
+Load cookies from @var{file} before the first HTTP retrieval.
+@var{file} is a textual file in the format originally used by Netscape's
+@file{cookies.txt} file.
+
+You will typically use this option when mirroring sites that require
+that you be logged in to access some or all of their content. The login
+process typically works by the web server issuing an @sc{http} cookie
+upon receiving and verifying your credentials. The cookie is then
+resent by the browser when accessing that part of the site, and so
+proves your identity.
+
+Mirroring such a site requires Wget to send the same cookies your
+browser sends when communicating with the site. This is achieved by
+@samp{--load-cookies}---simply point Wget to the location of the
+@file{cookies.txt} file, and it will send the same cookies your browser
+would send in the same situation. Different browsers keep textual
+cookie files in different locations:
+
+@table @asis
+@item Netscape 4.x.
+The cookies are in @file{~/.netscape/cookies.txt}.
+
+@item Mozilla and Netscape 6.x.
+Mozilla's cookie file is also named @file{cookies.txt}, located
+somewhere under @file{~/.mozilla}, in the directory of your profile.
+The full path usually ends up looking somewhat like
+@file{~/.mozilla/default/@var{some-weird-string}/cookies.txt}.
+
+@item Internet Explorer.
+You can produce a cookie file Wget can use by using the File menu,
+Import and Export, Export Cookies. This has been tested with Internet
+Explorer 5; it is not guaranteed to work with earlier versions.
+
+@item Other browsers.
+If you are using a different browser to create your cookies,
+@samp{--load-cookies} will only work if you can locate or produce a
+cookie file in the Netscape format that Wget expects.
+@end table
+
+If you cannot use @samp{--load-cookies}, there might still be an
+alternative. If your browser supports a ``cookie manager'', you can use
+it to view the cookies used when accessing the site you're mirroring.
+Write down the name and value of the cookie, and manually instruct Wget
+to send those cookies, bypassing the ``official'' cookie support:
+
+@example
+wget --no-cookies --header "Cookie: @var{name}=@var{value}"
+@end example
+
+@cindex saving cookies
+@cindex cookies, saving
+@item --save-cookies @var{file}
+Save cookies to @var{file} before exiting. This will not save cookies
+that have expired or that have no expiry time (so-called ``session
+cookies''), but also see @samp{--keep-session-cookies}.
+
+@cindex cookies, session
+@cindex session cookies
+@item --keep-session-cookies
+When specified, causes @samp{--save-cookies} to also save session
+cookies. Session cookies are normally not saved because they are
+meant to be kept in memory and forgotten when you exit the browser.
+Saving them is useful on sites that require you to log in or to visit
+the home page before you can access some pages. With this option,
+multiple Wget runs are considered a single browser session as far as
+the site is concerned.
+
+Since the cookie file format does not normally carry session cookies,
+Wget marks them with an expiry timestamp of 0. Wget's
+@samp{--load-cookies} recognizes those as session cookies, but it might
+confuse other browsers. Also note that cookies so loaded will be
+treated as other session cookies, which means that if you want
+@samp{--save-cookies} to preserve them again, you must use
+@samp{--keep-session-cookies} again.
+
+@cindex Content-Length, ignore
+@cindex ignore length
+@item --ignore-length
+Unfortunately, some @sc{http} servers (@sc{cgi} programs, to be more
+precise) send out bogus @code{Content-Length} headers, which makes Wget
+go wild, as it thinks not all the document was retrieved. You can spot
+this syndrome if Wget retries getting the same document again and again,
+each time claiming that the (otherwise normal) connection has closed on
+the very same byte.
+
+With this option, Wget will ignore the @code{Content-Length} header---as
+if it never existed.
+
+@cindex header, add
+@item --header=@var{header-line}
+Send @var{header-line} along with the rest of the headers in each
+@sc{http} request. The supplied header is sent as-is, which means it
+must contain name and value separated by colon, and must not contain
+newlines.
+
+You may define more than one additional header by specifying
+@samp{--header} more than once.
+
+@example
+@group
+wget --header='Accept-Charset: iso-8859-2' \
+ --header='Accept-Language: hr' \
+ http://fly.srk.fer.hr/
+@end group
+@end example
+
+Specification of an empty string as the header value will clear all
+previous user-defined headers.
+
+As of Wget 1.10, this option can be used to override headers otherwise
+generated automatically. This example instructs Wget to connect to
+localhost, but to specify @samp{foo.bar} in the @code{Host} header:
+
+@example
+wget --header="Host: foo.bar" http://localhost/
+@end example
+
+In versions of Wget prior to 1.10 such use of @samp{--header} caused
+sending of duplicate headers.
+
+@cindex Content-Encoding, choose
+@item --compression=@var{type}
+Choose the type of compression to be used. Legal values are
+@samp{auto}, @samp{gzip} and @samp{none}.
+
+If @samp{auto} or @samp{gzip} are specified, Wget asks the server to
+compress the file using the gzip compression format. If the server
+compresses the file and responds with the @code{Content-Encoding}
+header field set appropriately, the file will be decompressed
+automatically.
+
+If @samp{none} is specified, wget will not ask the server to compress
+the file and will not decompress any server responses. This is the default.
+
+Compression support is currently experimental. In case it is turned on,
+please report any bugs to @code{bug-wget@@gnu.org}.
+
+@cindex redirect
+@item --max-redirect=@var{number}
+Specifies the maximum number of redirections to follow for a resource.
+The default is 20, which is usually far more than necessary. However, on
+those occasions where you want to allow more (or fewer), this is the
+option to use.
+
+@cindex proxy user
+@cindex proxy password
+@cindex proxy authentication
+@item --proxy-user=@var{user}
+@itemx --proxy-password=@var{password}
+Specify the username @var{user} and password @var{password} for
+authentication on a proxy server. Wget will encode them using the
+@code{basic} authentication scheme.
+
+Security considerations similar to those with @samp{--http-password}
+pertain here as well.
+
+@cindex http referer
+@cindex referer, http
+@item --referer=@var{url}
+Include `Referer: @var{url}' header in HTTP request. Useful for
+retrieving documents with server-side processing that assume they are
+always being retrieved by interactive web browsers and only come out
+properly when Referer is set to one of the pages that point to them.
+
+@cindex server response, save
+@item --save-headers
+Save the headers sent by the @sc{http} server to the file, preceding the
+actual contents, with an empty line as the separator.
+
+@cindex user-agent
+@item -U @var{agent-string}
+@itemx --user-agent=@var{agent-string}
+Identify as @var{agent-string} to the @sc{http} server.
+
+The @sc{http} protocol allows the clients to identify themselves using a
+@code{User-Agent} header field. This enables distinguishing the
+@sc{www} software, usually for statistical purposes or for tracing of
+protocol violations. Wget normally identifies as
+@samp{Wget/@var{version}}, @var{version} being the current version
+number of Wget.
+
+However, some sites have been known to impose the policy of tailoring
+the output according to the @code{User-Agent}-supplied information.
+While this is not such a bad idea in theory, it has been abused by
+servers denying information to clients other than (historically)
+Netscape or, more frequently, Microsoft Internet Explorer. This
+option allows you to change the @code{User-Agent} line issued by Wget.
+Use of this option is discouraged, unless you really know what you are
+doing.
+
+Specifying empty user agent with @samp{--user-agent=""} instructs Wget
+not to send the @code{User-Agent} header in @sc{http} requests.
+
+@cindex POST
+@item --post-data=@var{string}
+@itemx --post-file=@var{file}
+Use POST as the method for all HTTP requests and send the specified
+data in the request body. @samp{--post-data} sends @var{string} as
+data, whereas @samp{--post-file} sends the contents of @var{file}.
+Other than that, they work in exactly the same way. In particular,
+they @emph{both} expect content of the form @code{key1=value1&key2=value2},
+with percent-encoding for special characters; the only difference is
+that one expects its content as a command-line parameter and the other
+accepts its content from a file. In particular, @samp{--post-file} is
+@emph{not} for transmitting files as form attachments: those must
+appear as @code{key=value} data (with appropriate percent-coding) just
+like everything else. Wget does not currently support
+@code{multipart/form-data} for transmitting POST data; only
+@code{application/x-www-form-urlencoded}. Only one of
+@samp{--post-data} and @samp{--post-file} should be specified.
+
+Please note that wget does not require the content to be of the form
+@code{key1=value1&key2=value2}, and neither does it test for it. Wget will
+simply transmit whatever data is provided to it. Most servers however expect
+the POST data to be in the above format when processing HTML Forms.
+
+When sending a POST request using the @samp{--post-file} option, Wget treats
+the file as a binary file and will send every character in the POST request
+without stripping trailing newline or formfeed characters. Any other control
+characters in the text will also be sent as-is in the POST request.
+
+Please be aware that Wget needs to know the size of the POST data in
+advance. Therefore the argument to @code{--post-file} must be a regular
+file; specifying a FIFO or something like @file{/dev/stdin} won't work.
+It's not quite clear how to work around this limitation inherent in
+HTTP/1.0. Although HTTP/1.1 introduces @dfn{chunked} transfer that
+doesn't require knowing the request length in advance, a client can't
+use chunked unless it knows it's talking to an HTTP/1.1 server. And it
+can't know that until it receives a response, which in turn requires the
+request to have been completed -- a chicken-and-egg problem.
+
+Note: As of version 1.15 if Wget is redirected after the POST request is
+completed, its behaviour will depend on the response code returned by the
+server. In case of a 301 Moved Permanently, 302 Moved Temporarily or
+307 Temporary Redirect, Wget will, in accordance with RFC2616, continue
+to send a POST request.
+In case a server wants the client to change the Request method upon
+redirection, it should send a 303 See Other response code.
+
+This example shows how to log in to a server using POST and then proceed to
+download the desired pages, presumably only accessible to authorized
+users:
+
+@example
+@group
+# @r{Log in to the server. This can be done only once.}
+wget --save-cookies cookies.txt \
+ --post-data 'user=foo&password=bar' \
+ http://example.com/auth.php
+
+# @r{Now grab the page or pages we care about.}
+wget --load-cookies cookies.txt \
+ -p http://example.com/interesting/article.php
+@end group
+@end example
+
+If the server is using session cookies to track user authentication,
+the above will not work because @samp{--save-cookies} will not save
+them (and neither will browsers) and the @file{cookies.txt} file will
+be empty. In that case use @samp{--keep-session-cookies} along with
+@samp{--save-cookies} to force saving of session cookies.
+
+@cindex Other HTTP Methods
+@item --method=@var{HTTP-Method}
+For the purpose of RESTful scripting, Wget allows sending of other HTTP Methods
+without the need to explicitly set them using @samp{--header=Header-Line}.
+Wget will use whatever string is passed to it after @samp{--method} as the HTTP
+Method to the server.
+
+@item --body-data=@var{Data-String}
+@itemx --body-file=@var{Data-File}
+Must be set when additional data needs to be sent to the server along with the
+Method specified using @samp{--method}. @samp{--body-data} sends @var{string} as
+data, whereas @samp{--body-file} sends the contents of @var{file}. Other than that,
+they work in exactly the same way.
+
+Currently, @samp{--body-file} is @emph{not} for transmitting files as a whole.
+Wget does not currently support @code{multipart/form-data} for transmitting data;
+only @code{application/x-www-form-urlencoded}. In the future, this may be changed
+so that wget sends the @samp{--body-file} as a complete file instead of sending its
+contents to the server. Please be aware that Wget needs to know the contents of
+BODY Data in advance, and hence the argument to @samp{--body-file} should be a
+regular file. See @samp{--post-file} for a more detailed explanation.
+Only one of @samp{--body-data} and @samp{--body-file} should be specified.
+
+If Wget is redirected after the request is completed, Wget will
+suspend the current method and send a GET request till the redirection
+is completed. This is true for all redirection response codes except
+307 Temporary Redirect which is used to explicitly specify that the
+request method should @emph{not} change. Another exception is when
+the method is set to @code{POST}, in which case the redirection rules
+specified under @samp{--post-data} are followed.
+
+@cindex Content-Disposition
+@item --content-disposition
+
+If this is set to on, experimental (not fully-functional) support for
+@code{Content-Disposition} headers is enabled. This can currently result in
+extra round-trips to the server for a @code{HEAD} request, and is known
+to suffer from a few bugs, which is why it is not currently enabled by default.
+
+This option is useful for some file-downloading CGI programs that use
+@code{Content-Disposition} headers to describe what the name of a
+downloaded file should be.
+
+When combined with @samp{--metalink-over-http} and @samp{--trust-server-names},
+a @samp{Content-Type: application/metalink4+xml} file is named using the
+@code{Content-Disposition} filename field, if available.
+
+@cindex Content On Error
+@item --content-on-error
+
+If this is set to on, wget will not skip the content when the server responds
+with a http status code that indicates error.
+
+@cindex Trust server names
+@item --trust-server-names
+
+If this is set, on a redirect, the local file name will be based
+on the redirection URL. By default the local file name is based on
+the original URL. When doing recursive retrieving this can be helpful
+because in many web sites redirected URLs correspond to an underlying
+file structure, while link URLs do not.
+
+@cindex authentication
+@item --auth-no-challenge
+
+If this option is given, Wget will send Basic HTTP authentication
+information (plaintext username and password) for all requests, just
+like Wget 1.10.2 and prior did by default.
+
+Use of this option is not recommended, and is intended only to support
+some few obscure servers, which never send HTTP authentication
+challenges, but accept unsolicited auth info, say, in addition to
+form-based authentication.
+
+@item --retry-on-host-error
+Consider host errors, such as ``Temporary failure in name resolution'',
+as non-fatal, transient errors.
+
+@item --retry-on-http-error=@var{code[,code,...]}
+Consider given HTTP response codes as non-fatal, transient errors.
+Supply a comma-separated list of 3-digit HTTP response codes as
+argument. Useful to work around special circumstances where retries
+are required, but the server responds with an error code normally not
+retried by Wget. Such errors might be 503 (Service Unavailable) and
+429 (Too Many Requests). Retries enabled by this option are performed
+subject to the normal retry timing and retry count limitations of
+Wget.
+
+Using this option is intended to support special use cases only and is
+generally not recommended, as it can force retries even in cases where
+the server is actually trying to decrease its load. Please use wisely
+and only if you know what you are doing.
+
+@end table
+
+@node HTTPS (SSL/TLS) Options, FTP Options, HTTP Options, Invoking
+@section HTTPS (SSL/TLS) Options
+
+@cindex SSL
+To support encrypted HTTP (HTTPS) downloads, Wget must be compiled
+with an external SSL library. The current default is GnuTLS.
+In addition, Wget also supports HSTS (HTTP Strict Transport Security).
+If Wget is compiled without SSL support, none of these options are available.
+
+@table @samp
+@cindex SSL protocol, choose
+@item --secure-protocol=@var{protocol}
+Choose the secure protocol to be used. Legal values are @samp{auto},
+@samp{SSLv2}, @samp{SSLv3}, @samp{TLSv1}, @samp{TLSv1_1}, @samp{TLSv1_2},
+@samp{TLSv1_3} and @samp{PFS}. If @samp{auto} is used, the SSL library is
+given the liberty of choosing the appropriate protocol automatically, which is
+achieved by sending a TLSv1 greeting. This is the default.
+
+Specifying @samp{SSLv2}, @samp{SSLv3}, @samp{TLSv1}, @samp{TLSv1_1},
+@samp{TLSv1_2} or @samp{TLSv1_3} forces the use of the corresponding
+protocol. This is useful when talking to old and buggy SSL server
+implementations that make it hard for the underlying SSL library to choose
+the correct protocol version. Fortunately, such servers are quite rare.
+
+Specifying @samp{PFS} enforces the use of the so-called Perfect Forward
+Security cipher suites. In short, PFS adds security by creating a one-time
+key for each SSL connection. It has a bit more CPU impact on client and server.
+We use known to be secure ciphers (e.g. no MD4) and the TLS protocol. This mode
+also explicitly excludes non-PFS key exchange methods, such as RSA.
+
+@item --https-only
+When in recursive mode, only HTTPS links are followed.
+
+@item --ciphers
+Set the cipher list string. Typically this string sets the
+cipher suites and other SSL/TLS options that the user wish should be used, in a
+set order of preference (GnuTLS calls it 'priority string'). This string
+will be fed verbatim to the SSL/TLS engine (OpenSSL or GnuTLS) and hence
+its format and syntax is dependent on that. Wget will not process or manipulate it
+in any way. Refer to the OpenSSL or GnuTLS documentation for more information.
+
+@cindex SSL certificate, check
+@item --no-check-certificate
+Don't check the server certificate against the available certificate
+authorities. Also don't require the URL host name to match the common
+name presented by the certificate.
+
+As of Wget 1.10, the default is to verify the server's certificate
+against the recognized certificate authorities, breaking the SSL
+handshake and aborting the download if the verification fails.
+Although this provides more secure downloads, it does break
+interoperability with some sites that worked with previous Wget
+versions, particularly those using self-signed, expired, or otherwise
+invalid certificates. This option forces an ``insecure'' mode of
+operation that turns the certificate verification errors into warnings
+and allows you to proceed.
+
+If you encounter ``certificate verification'' errors or ones saying
+that ``common name doesn't match requested host name'', you can use
+this option to bypass the verification and proceed with the download.
+@emph{Only use this option if you are otherwise convinced of the
+site's authenticity, or if you really don't care about the validity of
+its certificate.} It is almost always a bad idea not to check the
+certificates when transmitting confidential or important data.
+For self-signed/internal certificates, you should download the certificate
+and verify against that instead of forcing this insecure mode.
+If you are really sure of not desiring any certificate verification, you
+can specify --check-certificate=quiet to tell wget to not print any
+warning about invalid certificates, albeit in most cases this is the
+wrong thing to do.
+
+@cindex SSL certificate
+@item --certificate=@var{file}
+Use the client certificate stored in @var{file}. This is needed for
+servers that are configured to require certificates from the clients
+that connect to them. Normally a certificate is not required and this
+switch is optional.
+
+@cindex SSL certificate type, specify
+@item --certificate-type=@var{type}
+Specify the type of the client certificate. Legal values are
+@samp{PEM} (assumed by default) and @samp{DER}, also known as
+@samp{ASN1}.
+
+@item --private-key=@var{file}
+Read the private key from @var{file}. This allows you to provide the
+private key in a file separate from the certificate.
+
+@item --private-key-type=@var{type}
+Specify the type of the private key. Accepted values are @samp{PEM}
+(the default) and @samp{DER}.
+
+@item --ca-certificate=@var{file}
+Use @var{file} as the file with the bundle of certificate authorities
+(``CA'') to verify the peers. The certificates must be in PEM format.
+
+Without this option Wget looks for CA certificates at the
+system-specified locations, chosen at OpenSSL installation time.
+
+@cindex SSL certificate authority
+@item --ca-directory=@var{directory}
+Specifies directory containing CA certificates in PEM format. Each
+file contains one CA certificate, and the file name is based on a hash
+value derived from the certificate. This is achieved by processing a
+certificate directory with the @code{c_rehash} utility supplied with
+OpenSSL. Using @samp{--ca-directory} is more efficient than
+@samp{--ca-certificate} when many certificates are installed because
+it allows Wget to fetch certificates on demand.
+
+Without this option Wget looks for CA certificates at the
+system-specified locations, chosen at OpenSSL installation time.
+
+@cindex SSL CRL, certificate revocation list
+@item --crl-file=@var{file}
+Specifies a CRL file in @var{file}. This is needed for certificates
+that have been revocated by the CAs.
+
+@cindex SSL Public Key Pin
+@item --pinnedpubkey=file/hashes
+Tells wget to use the specified public key file (or hashes) to verify the peer.
+This can be a path to a file which contains a single public key in PEM or DER
+format, or any number of base64 encoded sha256 hashes preceded by ``sha256//''
+and separated by ``;''
+
+When negotiating a TLS or SSL connection, the server sends a certificate
+indicating its identity. A public key is extracted from this certificate and if
+it does not exactly match the public key(s) provided to this option, wget will
+abort the connection before sending or receiving any data.
+
+@cindex entropy, specifying source of
+@cindex randomness, specifying source of
+@item --random-file=@var{file}
+[OpenSSL and LibreSSL only]
+Use @var{file} as the source of random data for seeding the
+pseudo-random number generator on systems without @file{/dev/urandom}.
+
+On such systems the SSL library needs an external source of randomness
+to initialize. Randomness may be provided by EGD (see
+@samp{--egd-file} below) or read from an external source specified by
+the user. If this option is not specified, Wget looks for random data
+in @code{$RANDFILE} or, if that is unset, in @file{$HOME/.rnd}.
+
+If you're getting the ``Could not seed OpenSSL PRNG; disabling SSL.''
+error, you should provide random data using some of the methods
+described above.
+
+@cindex EGD
+@item --egd-file=@var{file}
+[OpenSSL only]
+Use @var{file} as the EGD socket. EGD stands for @dfn{Entropy
+Gathering Daemon}, a user-space program that collects data from
+various unpredictable system sources and makes it available to other
+programs that might need it. Encryption software, such as the SSL
+library, needs sources of non-repeating randomness to seed the random
+number generator used to produce cryptographically strong keys.
+
+OpenSSL allows the user to specify his own source of entropy using the
+@code{RAND_FILE} environment variable. If this variable is unset, or
+if the specified file does not produce enough randomness, OpenSSL will
+read random data from EGD socket specified using this option.
+
+If this option is not specified (and the equivalent startup command is
+not used), EGD is never contacted. EGD is not needed on modern Unix
+systems that support @file{/dev/urandom}.
+
+@cindex HSTS
+@item --no-hsts
+Wget supports HSTS (HTTP Strict Transport Security, RFC 6797) by default.
+Use @samp{--no-hsts} to make Wget act as a non-HSTS-compliant UA. As a
+consequence, Wget would ignore all the @code{Strict-Transport-Security}
+headers, and would not enforce any existing HSTS policy.
+
+@item --hsts-file=@var{file}
+By default, Wget stores its HSTS database in @file{~/.wget-hsts}.
+You can use @samp{--hsts-file} to override this. Wget will use
+the supplied file as the HSTS database. Such file must conform to the
+correct HSTS database format used by Wget. If Wget cannot parse the provided
+file, the behaviour is unspecified.
+
+The Wget's HSTS database is a plain text file. Each line contains an HSTS entry
+(ie. a site that has issued a @code{Strict-Transport-Security} header and that
+therefore has specified a concrete HSTS policy to be applied). Lines starting with
+a dash (@code{#}) are ignored by Wget. Please note that in spite of this convenient
+human-readability hand-hacking the HSTS database is generally not a good idea.
+
+An HSTS entry line consists of several fields separated by one or more whitespace:
+
+@code{<hostname> SP [<port>] SP <include subdomains> SP <created> SP <max-age>}
+
+The @var{hostname} and @var{port} fields indicate the hostname and port to which
+the given HSTS policy applies. The @var{port} field may be zero, and it will, in
+most of the cases. That means that the port number will not be taken into account
+when deciding whether such HSTS policy should be applied on a given request (only
+the hostname will be evaluated). When @var{port} is different to zero, both the
+target hostname and the port will be evaluated and the HSTS policy will only be applied
+if both of them match. This feature has been included for testing/development purposes only.
+The Wget testsuite (in @file{testenv/}) creates HSTS databases with explicit ports
+with the purpose of ensuring Wget's correct behaviour. Applying HSTS policies to ports
+other than the default ones is discouraged by RFC 6797 (see Appendix B "Differences
+between HSTS Policy and Same-Origin Policy"). Thus, this functionality should not be used
+in production environments and @var{port} will typically be zero. The last three fields
+do what they are expected to. The field @var{include_subdomains} can either be @code{1}
+or @code{0} and it signals whether the subdomains of the target domain should be
+part of the given HSTS policy as well. The @var{created} and @var{max-age} fields
+hold the timestamp values of when such entry was created (first seen by Wget) and the
+HSTS-defined value 'max-age', which states how long should that HSTS policy remain active,
+measured in seconds elapsed since the timestamp stored in @var{created}. Once that time
+has passed, that HSTS policy will no longer be valid and will eventually be removed
+from the database.
+
+If you supply your own HSTS database via @samp{--hsts-file}, be aware that Wget
+may modify the provided file if any change occurs between the HSTS policies
+requested by the remote servers and those in the file. When Wget exits,
+it effectively updates the HSTS database by rewriting the database file with the new entries.
+
+If the supplied file does not exist, Wget will create one. This file will contain the new HSTS
+entries. If no HSTS entries were generated (no @code{Strict-Transport-Security} headers
+were sent by any of the servers) then no file will be created, not even an empty one. This
+behaviour applies to the default database file (@file{~/.wget-hsts}) as well: it will not be
+created until some server enforces an HSTS policy.
+
+Care is taken not to override possible changes made by other Wget processes at
+the same time over the HSTS database. Before dumping the updated HSTS entries
+on the file, Wget will re-read it and merge the changes.
+
+Using a custom HSTS database and/or modifying an existing one is discouraged.
+For more information about the potential security threats arose from such practice,
+see section 14 "Security Considerations" of RFC 6797, specially section 14.9
+"Creative Manipulation of HSTS Policy Store".
+@end table
+
+@cindex WARC
+@table @samp
+@item --warc-file=@var{file}
+Use @var{file} as the destination WARC file.
+
+@item --warc-header=@var{string}
+Use @var{string} into as the warcinfo record.
+
+@item --warc-max-size=@var{size}
+Set the maximum size of the WARC files to @var{size}.
+
+@item --warc-cdx
+Write CDX index files.
+
+@item --warc-dedup=@var{file}
+Do not store records listed in this CDX file.
+
+@item --no-warc-compression
+Do not compress WARC files with GZIP.
+
+@item --no-warc-digests
+Do not calculate SHA1 digests.
+
+@item --no-warc-keep-log
+Do not store the log file in a WARC record.
+
+@item --warc-tempdir=@var{dir}
+Specify the location for temporary files created by the WARC writer.
+@end table
+
+@node FTP Options, Recursive Retrieval Options, HTTPS (SSL/TLS) Options, Invoking
+@section FTP Options
+
+@table @samp
+@cindex ftp user
+@cindex ftp password
+@cindex ftp authentication
+@item --ftp-user=@var{user}
+@itemx --ftp-password=@var{password}
+Specify the username @var{user} and password @var{password} on an
+@sc{ftp} server. Without this, or the corresponding startup option,
+the password defaults to @samp{-wget@@}, normally used for anonymous
+FTP.
+
+Another way to specify username and password is in the @sc{url} itself
+(@pxref{URL Format}). Either method reveals your password to anyone who
+bothers to run @code{ps}. To prevent the passwords from being seen,
+store them in @file{.wgetrc} or @file{.netrc}, and make sure to protect
+those files from other users with @code{chmod}. If the passwords are
+really important, do not leave them lying in those files either---edit
+the files and delete them after Wget has started the download.
+
+@iftex
+@xref{Security Considerations}, for more information about security
+issues with Wget.
+@end iftex
+
+@cindex .listing files, removing
+@item --no-remove-listing
+Don't remove the temporary @file{.listing} files generated by @sc{ftp}
+retrievals. Normally, these files contain the raw directory listings
+received from @sc{ftp} servers. Not removing them can be useful for
+debugging purposes, or when you want to be able to easily check on the
+contents of remote server directories (e.g. to verify that a mirror
+you're running is complete).
+
+Note that even though Wget writes to a known filename for this file,
+this is not a security hole in the scenario of a user making
+@file{.listing} a symbolic link to @file{/etc/passwd} or something and
+asking @code{root} to run Wget in his or her directory. Depending on
+the options used, either Wget will refuse to write to @file{.listing},
+making the globbing/recursion/time-stamping operation fail, or the
+symbolic link will be deleted and replaced with the actual
+@file{.listing} file, or the listing will be written to a
+@file{.listing.@var{number}} file.
+
+Even though this situation isn't a problem, though, @code{root} should
+never run Wget in a non-trusted user's directory. A user could do
+something as simple as linking @file{index.html} to @file{/etc/passwd}
+and asking @code{root} to run Wget with @samp{-N} or @samp{-r} so the file
+will be overwritten.
+
+@cindex globbing, toggle
+@item --no-glob
+Turn off @sc{ftp} globbing. Globbing refers to the use of shell-like
+special characters (@dfn{wildcards}), like @samp{*}, @samp{?}, @samp{[}
+and @samp{]} to retrieve more than one file from the same directory at
+once, like:
+
+@example
+wget ftp://gnjilux.srk.fer.hr/*.msg
+@end example
+
+By default, globbing will be turned on if the @sc{url} contains a
+globbing character. This option may be used to turn globbing on or off
+permanently.
+
+You may have to quote the @sc{url} to protect it from being expanded by
+your shell. Globbing makes Wget look for a directory listing, which is
+system-specific. This is why it currently works only with Unix @sc{ftp}
+servers (and the ones emulating Unix @code{ls} output).
+
+@cindex passive ftp
+@item --no-passive-ftp
+Disable the use of the @dfn{passive} FTP transfer mode. Passive FTP
+mandates that the client connect to the server to establish the data
+connection rather than the other way around.
+
+If the machine is connected to the Internet directly, both passive and
+active FTP should work equally well. Behind most firewall and NAT
+configurations passive FTP has a better chance of working. However,
+in some rare firewall configurations, active FTP actually works when
+passive FTP doesn't. If you suspect this to be the case, use this
+option, or set @code{passive_ftp=off} in your init file.
+
+@cindex file permissions
+@item --preserve-permissions
+Preserve remote file permissions instead of permissions set by umask.
+
+@cindex symbolic links, retrieving
+@item --retr-symlinks
+By default, when retrieving @sc{ftp} directories recursively and a symbolic link
+is encountered, the symbolic link is traversed and the pointed-to files are
+retrieved. Currently, Wget does not traverse symbolic links to directories to
+download them recursively, though this feature may be added in the future.
+
+When @samp{--retr-symlinks=no} is specified, the linked-to file is not
+downloaded. Instead, a matching symbolic link is created on the local
+filesystem. The pointed-to file will not be retrieved unless this recursive
+retrieval would have encountered it separately and downloaded it anyway. This
+option poses a security risk where a malicious FTP Server may cause Wget to
+write to files outside of the intended directories through a specially crafted
+@sc{.listing} file.
+
+Note that when retrieving a file (not a directory) because it was
+specified on the command-line, rather than because it was recursed to,
+this option has no effect. Symbolic links are always traversed in this
+case.
+@end table
+
+@section FTPS Options
+
+@table @samp
+@item --ftps-implicit
+This option tells Wget to use FTPS implicitly. Implicit FTPS consists of initializing
+SSL/TLS from the very beginning of the control connection. This option does not send
+an @code{AUTH TLS} command: it assumes the server speaks FTPS and directly starts an
+SSL/TLS connection. If the attempt is successful, the session continues just like
+regular FTPS (@code{PBSZ} and @code{PROT} are sent, etc.).
+Implicit FTPS is no longer a requirement for FTPS implementations, and thus
+many servers may not support it. If @samp{--ftps-implicit} is passed and no explicit
+port number specified, the default port for implicit FTPS, 990, will be used, instead
+of the default port for the "normal" (explicit) FTPS which is the same as that of FTP,
+21.
+
+@item --no-ftps-resume-ssl
+Do not resume the SSL/TLS session in the data channel. When starting a data connection,
+Wget tries to resume the SSL/TLS session previously started in the control connection.
+SSL/TLS session resumption avoids performing an entirely new handshake by reusing
+the SSL/TLS parameters of a previous session. Typically, the FTPS servers want it that way,
+so Wget does this by default. Under rare circumstances however, one might want to
+start an entirely new SSL/TLS session in every data connection.
+This is what @samp{--no-ftps-resume-ssl} is for.
+
+@item --ftps-clear-data-connection
+All the data connections will be in plain text. Only the control connection will be
+under SSL/TLS. Wget will send a @code{PROT C} command to achieve this, which must be
+approved by the server.
+
+@item --ftps-fallback-to-ftp
+Fall back to FTP if FTPS is not supported by the target server. For security reasons,
+this option is not asserted by default. The default behaviour is to exit with an error.
+If a server does not successfully reply to the initial @code{AUTH TLS} command, or in the
+case of implicit FTPS, if the initial SSL/TLS connection attempt is rejected, it is
+considered that such server does not support FTPS.
+@end table
+
+@node Recursive Retrieval Options, Recursive Accept/Reject Options, FTP Options, Invoking
+@section Recursive Retrieval Options
+
+@table @samp
+@item -r
+@itemx --recursive
+Turn on recursive retrieving. @xref{Recursive Download}, for more
+details. The default maximum depth is 5.
+
+@item -l @var{depth}
+@itemx --level=@var{depth}
+Set the maximum number of subdirectories that Wget will recurse into to @var{depth}.
+In order to prevent one from accidentally downloading very large websites when using recursion
+this is limited to a depth of 5 by default, i.e., it will traverse at most 5 directories deep
+starting from the provided URL.
+Set @samp{-l 0} or @samp{-l inf} for infinite recursion depth.
+
+@example
+wget -r -l 0 http://@var{site}/1.html
+@end example
+
+Ideally, one would expect this to download just @file{1.html}.
+but unfortunately this is not the case, because @samp{-l 0} is equivalent to
+@samp{-l inf}---that is, infinite recursion. To download a single @sc{html}
+page (or a handful of them), specify them all on the command line and leave away @samp{-r}
+and @samp{-l}. To download the essential items to view a single @sc{html} page, see @samp{page requisites}.
+
+@cindex proxy filling
+@cindex delete after retrieval
+@cindex filling proxy cache
+@item --delete-after
+This option tells Wget to delete every single file it downloads,
+@emph{after} having done so. It is useful for pre-fetching popular
+pages through a proxy, e.g.:
+
+@example
+wget -r -nd --delete-after http://whatever.com/~popular/page/
+@end example
+
+The @samp{-r} option is to retrieve recursively, and @samp{-nd} to not
+create directories.
+
+Note that @samp{--delete-after} deletes files on the local machine. It
+does not issue the @samp{DELE} command to remote FTP sites, for
+instance. Also note that when @samp{--delete-after} is specified,
+@samp{--convert-links} is ignored, so @samp{.orig} files are simply not
+created in the first place.
+
+@cindex conversion of links
+@cindex link conversion
+@item -k
+@itemx --convert-links
+After the download is complete, convert the links in the document to
+make them suitable for local viewing. This affects not only the visible
+hyperlinks, but any part of the document that links to external content,
+such as embedded images, links to style sheets, hyperlinks to non-@sc{html}
+content, etc.
+
+Each link will be changed in one of the two ways:
+
+@itemize @bullet
+@item
+The links to files that have been downloaded by Wget will be changed to
+refer to the file they point to as a relative link.
+
+Example: if the downloaded file @file{/foo/doc.html} links to
+@file{/bar/img.gif}, also downloaded, then the link in @file{doc.html}
+will be modified to point to @samp{../bar/img.gif}. This kind of
+transformation works reliably for arbitrary combinations of directories.
+
+@item
+The links to files that have not been downloaded by Wget will be changed
+to include host name and absolute path of the location they point to.
+
+Example: if the downloaded file @file{/foo/doc.html} links to
+@file{/bar/img.gif} (or to @file{../bar/img.gif}), then the link in
+@file{doc.html} will be modified to point to
+@file{http://@var{hostname}/bar/img.gif}.
+@end itemize
+
+Because of this, local browsing works reliably: if a linked file was
+downloaded, the link will refer to its local name; if it was not
+downloaded, the link will refer to its full Internet address rather than
+presenting a broken link. The fact that the former links are converted
+to relative links ensures that you can move the downloaded hierarchy to
+another directory.
+
+Note that only at the end of the download can Wget know which links have
+been downloaded. Because of that, the work done by @samp{-k} will be
+performed at the end of all the downloads.
+
+@item --convert-file-only
+This option converts only the filename part of the URLs, leaving the rest
+of the URLs untouched. This filename part is sometimes referred to as the
+"basename", although we avoid that term here in order not to cause confusion.
+
+It works particularly well in conjunction with @samp{--adjust-extension}, although
+this coupling is not enforced. It proves useful to populate Internet caches
+with files downloaded from different hosts.
+
+Example: if some link points to @file{//foo.com/bar.cgi?xyz} with
+@samp{--adjust-extension} asserted and its local destination is intended to be
+@file{./foo.com/bar.cgi?xyz.css}, then the link would be converted to
+@file{//foo.com/bar.cgi?xyz.css}. Note that only the filename part has been
+modified. The rest of the URL has been left untouched, including the net path
+(@code{//}) which would otherwise be processed by Wget and converted to the
+effective scheme (ie. @code{http://}).
+
+@cindex backing up converted files
+@item -K
+@itemx --backup-converted
+When converting a file, back up the original version with a @samp{.orig}
+suffix. Affects the behavior of @samp{-N} (@pxref{HTTP Time-Stamping
+Internals}).
+
+@item -m
+@itemx --mirror
+Turn on options suitable for mirroring. This option turns on recursion
+and time-stamping, sets infinite recursion depth and keeps @sc{ftp}
+directory listings. It is currently equivalent to
+@samp{-r -N -l inf --no-remove-listing}.
+
+@cindex page requisites
+@cindex required images, downloading
+@item -p
+@itemx --page-requisites
+This option causes Wget to download all the files that are necessary to
+properly display a given @sc{html} page. This includes such things as
+inlined images, sounds, and referenced stylesheets.
+
+Ordinarily, when downloading a single @sc{html} page, any requisite documents
+that may be needed to display it properly are not downloaded. Using
+@samp{-r} together with @samp{-l} can help, but since Wget does not
+ordinarily distinguish between external and inlined documents, one is
+generally left with ``leaf documents'' that are missing their
+requisites.
+
+For instance, say document @file{1.html} contains an @code{<IMG>} tag
+referencing @file{1.gif} and an @code{<A>} tag pointing to external
+document @file{2.html}. Say that @file{2.html} is similar but that its
+image is @file{2.gif} and it links to @file{3.html}. Say this
+continues up to some arbitrarily high number.
+
+If one executes the command:
+
+@example
+wget -r -l 2 http://@var{site}/1.html
+@end example
+
+then @file{1.html}, @file{1.gif}, @file{2.html}, @file{2.gif}, and
+@file{3.html} will be downloaded. As you can see, @file{3.html} is
+without its requisite @file{3.gif} because Wget is simply counting the
+number of hops (up to 2) away from @file{1.html} in order to determine
+where to stop the recursion. However, with this command:
+
+@example
+wget -r -l 2 -p http://@var{site}/1.html
+@end example
+
+all the above files @emph{and} @file{3.html}'s requisite @file{3.gif}
+will be downloaded. Similarly,
+
+@example
+wget -r -l 1 -p http://@var{site}/1.html
+@end example
+
+will cause @file{1.html}, @file{1.gif}, @file{2.html}, and @file{2.gif}
+to be downloaded. One might think that:
+
+@example
+wget -r -l 0 -p http://@var{site}/1.html
+@end example
+
+would download just @file{1.html} and @file{1.gif}, but unfortunately
+this is not the case, because @samp{-l 0} is equivalent to
+@samp{-l inf}---that is, infinite recursion. To download a single @sc{html}
+page (or a handful of them, all specified on the command-line or in a
+@samp{-i} @sc{url} input file) and its (or their) requisites, simply leave off
+@samp{-r} and @samp{-l}:
+
+@example
+wget -p http://@var{site}/1.html
+@end example
+
+Note that Wget will behave as if @samp{-r} had been specified, but only
+that single page and its requisites will be downloaded. Links from that
+page to external documents will not be followed. Actually, to download
+a single page and all its requisites (even if they exist on separate
+websites), and make sure the lot displays properly locally, this author
+likes to use a few options in addition to @samp{-p}:
+
+@example
+wget -E -H -k -K -p http://@var{site}/@var{document}
+@end example
+
+To finish off this topic, it's worth knowing that Wget's idea of an
+external document link is any URL specified in an @code{<A>} tag, an
+@code{<AREA>} tag, or a @code{<LINK>} tag other than @code{<LINK
+REL="stylesheet">}.
+
+@cindex @sc{html} comments
+@cindex comments, @sc{html}
+@item --strict-comments
+Turn on strict parsing of @sc{html} comments. The default is to terminate
+comments at the first occurrence of @samp{-->}.
+
+According to specifications, @sc{html} comments are expressed as @sc{sgml}
+@dfn{declarations}. Declaration is special markup that begins with
+@samp{<!} and ends with @samp{>}, such as @samp{<!DOCTYPE ...>}, that
+may contain comments between a pair of @samp{--} delimiters. @sc{html}
+comments are ``empty declarations'', @sc{sgml} declarations without any
+non-comment text. Therefore, @samp{<!--foo-->} is a valid comment, and
+so is @samp{<!--one-- --two-->}, but @samp{<!--1--2-->} is not.
+
+On the other hand, most @sc{html} writers don't perceive comments as anything
+other than text delimited with @samp{<!--} and @samp{-->}, which is not
+quite the same. For example, something like @samp{<!------------>}
+works as a valid comment as long as the number of dashes is a multiple
+of four (!). If not, the comment technically lasts until the next
+@samp{--}, which may be at the other end of the document. Because of
+this, many popular browsers completely ignore the specification and
+implement what users have come to expect: comments delimited with
+@samp{<!--} and @samp{-->}.
+
+Until version 1.9, Wget interpreted comments strictly, which resulted in
+missing links in many web pages that displayed fine in browsers, but had
+the misfortune of containing non-compliant comments. Beginning with
+version 1.9, Wget has joined the ranks of clients that implements
+``naive'' comments, terminating each comment at the first occurrence of
+@samp{-->}.
+
+If, for whatever reason, you want strict comment parsing, use this
+option to turn it on.
+@end table
+
+@node Recursive Accept/Reject Options, Exit Status, Recursive Retrieval Options, Invoking
+@section Recursive Accept/Reject Options
+
+@table @samp
+@item -A @var{acclist} --accept @var{acclist}
+@itemx -R @var{rejlist} --reject @var{rejlist}
+Specify comma-separated lists of file name suffixes or patterns to
+accept or reject (@pxref{Types of Files}). Note that if
+any of the wildcard characters, @samp{*}, @samp{?}, @samp{[} or
+@samp{]}, appear in an element of @var{acclist} or @var{rejlist},
+it will be treated as a pattern, rather than a suffix.
+In this case, you have to enclose the pattern into quotes to prevent
+your shell from expanding it, like in @samp{-A "*.mp3"} or @samp{-A '*.mp3'}.
+
+@item --accept-regex @var{urlregex}
+@itemx --reject-regex @var{urlregex}
+Specify a regular expression to accept or reject the complete URL.
+
+@item --regex-type @var{regextype}
+Specify the regular expression type. Possible types are @samp{posix} or
+@samp{pcre}. Note that to be able to use @samp{pcre} type, wget has to be
+compiled with libpcre support.
+
+@item -D @var{domain-list}
+@itemx --domains=@var{domain-list}
+Set domains to be followed. @var{domain-list} is a comma-separated list
+of domains. Note that it does @emph{not} turn on @samp{-H}.
+
+@item --exclude-domains @var{domain-list}
+Specify the domains that are @emph{not} to be followed
+(@pxref{Spanning Hosts}).
+
+@cindex follow FTP links
+@item --follow-ftp
+Follow @sc{ftp} links from @sc{html} documents. Without this option,
+Wget will ignore all the @sc{ftp} links.
+
+@cindex tag-based recursive pruning
+@item --follow-tags=@var{list}
+Wget has an internal table of @sc{html} tag / attribute pairs that it
+considers when looking for linked documents during a recursive
+retrieval. If a user wants only a subset of those tags to be
+considered, however, he or she should be specify such tags in a
+comma-separated @var{list} with this option.
+
+@item --ignore-tags=@var{list}
+This is the opposite of the @samp{--follow-tags} option. To skip
+certain @sc{html} tags when recursively looking for documents to download,
+specify them in a comma-separated @var{list}.
+
+In the past, this option was the best bet for downloading a single page
+and its requisites, using a command-line like:
+
+@example
+wget --ignore-tags=a,area -H -k -K -r http://@var{site}/@var{document}
+@end example
+
+However, the author of this option came across a page with tags like
+@code{<LINK REL="home" HREF="/">} and came to the realization that
+specifying tags to ignore was not enough. One can't just tell Wget to
+ignore @code{<LINK>}, because then stylesheets will not be downloaded.
+Now the best bet for downloading a single page and its requisites is the
+dedicated @samp{--page-requisites} option.
+
+@cindex case fold
+@cindex ignore case
+@item --ignore-case
+Ignore case when matching files and directories. This influences the
+behavior of -R, -A, -I, and -X options, as well as globbing
+implemented when downloading from FTP sites. For example, with this
+option, @samp{-A "*.txt"} will match @samp{file1.txt}, but also
+@samp{file2.TXT}, @samp{file3.TxT}, and so on.
+The quotes in the example are to prevent the shell from expanding the
+pattern.
+
+@item -H
+@itemx --span-hosts
+Enable spanning across hosts when doing recursive retrieving
+(@pxref{Spanning Hosts}).
+
+@item -L
+@itemx --relative
+Follow relative links only. Useful for retrieving a specific home page
+without any distractions, not even those from the same hosts
+(@pxref{Relative Links}).
+
+@item -I @var{list}
+@itemx --include-directories=@var{list}
+Specify a comma-separated list of directories you wish to follow when
+downloading (@pxref{Directory-Based Limits}). Elements
+of @var{list} may contain wildcards.
+
+@item -X @var{list}
+@itemx --exclude-directories=@var{list}
+Specify a comma-separated list of directories you wish to exclude from
+download (@pxref{Directory-Based Limits}). Elements of
+@var{list} may contain wildcards.
+
+@item -np
+@item --no-parent
+Do not ever ascend to the parent directory when retrieving recursively.
+This is a useful option, since it guarantees that only the files
+@emph{below} a certain hierarchy will be downloaded.
+@xref{Directory-Based Limits}, for more details.
+@end table
+
+@c man end
+
+@node Exit Status, , Recursive Accept/Reject Options, Invoking
+@section Exit Status
+
+@c man begin EXITSTATUS
+
+Wget may return one of several error codes if it encounters problems.
+
+
+@table @asis
+@item 0
+No problems occurred.
+
+@item 1
+Generic error code.
+
+@item 2
+Parse error---for instance, when parsing command-line options, the
+@samp{.wgetrc} or @samp{.netrc}...
+
+@item 3
+File I/O error.
+
+@item 4
+Network failure.
+
+@item 5
+SSL verification failure.
+
+@item 6
+Username/password authentication failure.
+
+@item 7
+Protocol errors.
+
+@item 8
+Server issued an error response.
+@end table
+
+
+With the exceptions of 0 and 1, the lower-numbered exit codes take
+precedence over higher-numbered ones, when multiple types of errors
+are encountered.
+
+In versions of Wget prior to 1.12, Wget's exit status tended to be
+unhelpful and inconsistent. Recursive downloads would virtually always
+return 0 (success), regardless of any issues encountered, and
+non-recursive fetches only returned the status corresponding to the
+most recently-attempted download.
+
+@c man end
+
+@node Recursive Download, Following Links, Invoking, Top
+@chapter Recursive Download
+@cindex recursion
+@cindex retrieving
+@cindex recursive download
+
+GNU Wget is capable of traversing parts of the Web (or a single
+@sc{http} or @sc{ftp} server), following links and directory structure.
+We refer to this as to @dfn{recursive retrieval}, or @dfn{recursion}.
+
+With @sc{http} @sc{url}s, Wget retrieves and parses the @sc{html} or
+@sc{css} from the given @sc{url}, retrieving the files the document
+refers to, through markup like @code{href} or @code{src}, or @sc{css}
+@sc{uri} values specified using the @samp{url()} functional notation.
+If the freshly downloaded file is also of type @code{text/html},
+@code{application/xhtml+xml}, or @code{text/css}, it will be parsed
+and followed further.
+
+Recursive retrieval of @sc{http} and @sc{html}/@sc{css} content is
+@dfn{breadth-first}. This means that Wget first downloads the requested
+document, then the documents linked from that document, then the
+documents linked by them, and so on. In other words, Wget first
+downloads the documents at depth 1, then those at depth 2, and so on
+until the specified maximum depth.
+
+The maximum @dfn{depth} to which the retrieval may descend is specified
+with the @samp{-l} option. The default maximum depth is five layers.
+
+When retrieving an @sc{ftp} @sc{url} recursively, Wget will retrieve all
+the data from the given directory tree (including the subdirectories up
+to the specified depth) on the remote server, creating its mirror image
+locally. @sc{ftp} retrieval is also limited by the @code{depth}
+parameter. Unlike @sc{http} recursion, @sc{ftp} recursion is performed
+depth-first.
+
+By default, Wget will create a local directory tree, corresponding to
+the one found on the remote server.
+
+Recursive retrieving can find a number of applications, the most
+important of which is mirroring. It is also useful for @sc{www}
+presentations, and any other opportunities where slow network
+connections should be bypassed by storing the files locally.
+
+You should be warned that recursive downloads can overload the remote
+servers. Because of that, many administrators frown upon them and may
+ban access from your site if they detect very fast downloads of big
+amounts of content. When downloading from Internet servers, consider
+using the @samp{-w} option to introduce a delay between accesses to the
+server. The download will take a while longer, but the server
+administrator will not be alarmed by your rudeness.
+
+Of course, recursive download may cause problems on your machine. If
+left to run unchecked, it can easily fill up the disk. If downloading
+from local network, it can also take bandwidth on the system, as well as
+consume memory and CPU.
+
+Try to specify the criteria that match the kind of download you are
+trying to achieve. If you want to download only one page, use
+@samp{--page-requisites} without any additional recursion. If you want
+to download things under one directory, use @samp{-np} to avoid
+downloading things from other directories. If you want to download all
+the files from one directory, use @samp{-l 1} to make sure the recursion
+depth never exceeds one. @xref{Following Links}, for more information
+about this.
+
+Recursive retrieval should be used with care. Don't say you were not
+warned.
+
+@node Following Links, Time-Stamping, Recursive Download, Top
+@chapter Following Links
+@cindex links
+@cindex following links
+
+When retrieving recursively, one does not wish to retrieve loads of
+unnecessary data. Most of the time the users bear in mind exactly what
+they want to download, and want Wget to follow only specific links.
+
+For example, if you wish to download the music archive from
+@samp{fly.srk.fer.hr}, you will not want to download all the home pages
+that happen to be referenced by an obscure part of the archive.
+
+Wget possesses several mechanisms that allows you to fine-tune which
+links it will follow.
+
+@menu
+* Spanning Hosts:: (Un)limiting retrieval based on host name.
+* Types of Files:: Getting only certain files.
+* Directory-Based Limits:: Getting only certain directories.
+* Relative Links:: Follow relative links only.
+* FTP Links:: Following FTP links.
+@end menu
+
+@node Spanning Hosts, Types of Files, Following Links, Following Links
+@section Spanning Hosts
+@cindex spanning hosts
+@cindex hosts, spanning
+
+Wget's recursive retrieval normally refuses to visit hosts different
+than the one you specified on the command line. This is a reasonable
+default; without it, every retrieval would have the potential to turn
+your Wget into a small version of google.
+
+However, visiting different hosts, or @dfn{host spanning,} is sometimes
+a useful option. Maybe the images are served from a different server.
+Maybe you're mirroring a site that consists of pages interlinked between
+three servers. Maybe the server has two equivalent names, and the @sc{html}
+pages refer to both interchangeably.
+
+@table @asis
+@item Span to any host---@samp{-H}
+
+The @samp{-H} option turns on host spanning, thus allowing Wget's
+recursive run to visit any host referenced by a link. Unless sufficient
+recursion-limiting criteria are applied depth, these foreign hosts will
+typically link to yet more hosts, and so on until Wget ends up sucking
+up much more data than you have intended.
+
+@item Limit spanning to certain domains---@samp{-D}
+
+The @samp{-D} option allows you to specify the domains that will be
+followed, thus limiting the recursion only to the hosts that belong to
+these domains. Obviously, this makes sense only in conjunction with
+@samp{-H}. A typical example would be downloading the contents of
+@samp{www.example.com}, but allowing downloads from
+@samp{images.example.com}, etc.:
+
+@example
+wget -rH -Dexample.com http://www.example.com/
+@end example
+
+You can specify more than one address by separating them with a comma,
+e.g. @samp{-Ddomain1.com,domain2.com}.
+
+@item Keep download off certain domains---@samp{--exclude-domains}
+
+If there are domains you want to exclude specifically, you can do it
+with @samp{--exclude-domains}, which accepts the same type of arguments
+of @samp{-D}, but will @emph{exclude} all the listed domains. For
+example, if you want to download all the hosts from @samp{foo.edu}
+domain, with the exception of @samp{sunsite.foo.edu}, you can do it like
+this:
+
+@example
+wget -rH -Dfoo.edu --exclude-domains sunsite.foo.edu \
+ http://www.foo.edu/
+@end example
+
+@end table
+
+@node Types of Files, Directory-Based Limits, Spanning Hosts, Following Links
+@section Types of Files
+@cindex types of files
+
+When downloading material from the web, you will often want to restrict
+the retrieval to only certain file types. For example, if you are
+interested in downloading @sc{gif}s, you will not be overjoyed to get
+loads of PostScript documents, and vice versa.
+
+Wget offers two options to deal with this problem. Each option
+description lists a short name, a long name, and the equivalent command
+in @file{.wgetrc}.
+
+@cindex accept wildcards
+@cindex accept suffixes
+@cindex wildcards, accept
+@cindex suffixes, accept
+@table @samp
+@item -A @var{acclist}
+@itemx --accept @var{acclist}
+@itemx accept = @var{acclist}
+@itemx --accept-regex @var{urlregex}
+@itemx accept-regex = @var{urlregex}
+The argument to @samp{--accept} option is a list of file suffixes or
+patterns that Wget will download during recursive retrieval. A suffix
+is the ending part of a file, and consists of ``normal'' letters,
+e.g. @samp{gif} or @samp{.jpg}. A matching pattern contains shell-like
+wildcards, e.g. @samp{books*} or @samp{zelazny*196[0-9]*}.
+
+So, specifying @samp{wget -A gif,jpg} will make Wget download only the
+files ending with @samp{gif} or @samp{jpg}, i.e. @sc{gif}s and
+@sc{jpeg}s. On the other hand, @samp{wget -A "zelazny*196[0-9]*"} will
+download only files beginning with @samp{zelazny} and containing numbers
+from 1960 to 1969 anywhere within. Look up the manual of your shell for
+a description of how pattern matching works.
+
+Of course, any number of suffixes and patterns can be combined into a
+comma-separated list, and given as an argument to @samp{-A}.
+
+The argument to @samp{--accept-regex} option is a regular expression which
+is matched against the complete URL.
+
+@cindex reject wildcards
+@cindex reject suffixes
+@cindex wildcards, reject
+@cindex suffixes, reject
+@item -R @var{rejlist}
+@itemx --reject @var{rejlist}
+@itemx reject = @var{rejlist}
+@itemx --reject-regex @var{urlregex}
+@itemx reject-regex = @var{urlregex}
+The @samp{--reject} option works the same way as @samp{--accept}, only
+its logic is the reverse; Wget will download all files @emph{except} the
+ones matching the suffixes (or patterns) in the list.
+
+So, if you want to download a whole page except for the cumbersome
+@sc{mpeg}s and @sc{.au} files, you can use @samp{wget -R mpg,mpeg,au}.
+Analogously, to download all files except the ones beginning with
+@samp{bjork}, use @samp{wget -R "bjork*"}. The quotes are to prevent
+expansion by the shell.
+@end table
+
+The argument to @samp{--accept-regex} option is a regular expression which
+is matched against the complete URL.
+
+@noindent
+The @samp{-A} and @samp{-R} options may be combined to achieve even
+better fine-tuning of which files to retrieve. E.g. @samp{wget -A
+"*zelazny*" -R .ps} will download all the files having @samp{zelazny} as
+a part of their name, but @emph{not} the PostScript files.
+
+Note that these two options do not affect the downloading of @sc{html}
+files (as determined by a @samp{.htm} or @samp{.html} filename
+prefix). This behavior may not be desirable for all users, and may be
+changed for future versions of Wget.
+
+Note, too, that query strings (strings at the end of a URL beginning
+with a question mark (@samp{?}) are not included as part of the
+filename for accept/reject rules, even though these will actually
+contribute to the name chosen for the local file. It is expected that
+a future version of Wget will provide an option to allow matching
+against query strings.
+
+Finally, it's worth noting that the accept/reject lists are matched
+@emph{twice} against downloaded files: once against the URL's filename
+portion, to determine if the file should be downloaded in the first
+place; then, after it has been accepted and successfully downloaded,
+the local file's name is also checked against the accept/reject lists
+to see if it should be removed. The rationale was that, since
+@samp{.htm} and @samp{.html} files are always downloaded regardless of
+accept/reject rules, they should be removed @emph{after} being
+downloaded and scanned for links, if they did match the accept/reject
+lists. However, this can lead to unexpected results, since the local
+filenames can differ from the original URL filenames in the following
+ways, all of which can change whether an accept/reject rule matches:
+
+@itemize @bullet
+@item
+If the local file already exists and @samp{--no-directories} was
+specified, a numeric suffix will be appended to the original name.
+@item
+If @samp{--adjust-extension} was specified, the local filename might have
+@samp{.html} appended to it. If Wget is invoked with @samp{-E -A.php},
+a filename such as @samp{index.php} will match be accepted, but upon
+download will be named @samp{index.php.html}, which no longer matches,
+and so the file will be deleted.
+@item
+Query strings do not contribute to URL matching, but are included in
+local filenames, and so @emph{do} contribute to filename matching.
+@end itemize
+
+@noindent
+This behavior, too, is considered less-than-desirable, and may change
+in a future version of Wget.
+
+@node Directory-Based Limits, Relative Links, Types of Files, Following Links
+@section Directory-Based Limits
+@cindex directories
+@cindex directory limits
+
+Regardless of other link-following facilities, it is often useful to
+place the restriction of what files to retrieve based on the directories
+those files are placed in. There can be many reasons for this---the
+home pages may be organized in a reasonable directory structure; or some
+directories may contain useless information, e.g. @file{/cgi-bin} or
+@file{/dev} directories.
+
+Wget offers three different options to deal with this requirement. Each
+option description lists a short name, a long name, and the equivalent
+command in @file{.wgetrc}.
+
+@cindex directories, include
+@cindex include directories
+@cindex accept directories
+@table @samp
+@item -I @var{list}
+@itemx --include @var{list}
+@itemx include_directories = @var{list}
+@samp{-I} option accepts a comma-separated list of directories included
+in the retrieval. Any other directories will simply be ignored. The
+directories are absolute paths.
+
+So, if you wish to download from @samp{http://host/people/bozo/}
+following only links to bozo's colleagues in the @file{/people}
+directory and the bogus scripts in @file{/cgi-bin}, you can specify:
+
+@example
+wget -I /people,/cgi-bin http://host/people/bozo/
+@end example
+
+@cindex directories, exclude
+@cindex exclude directories
+@cindex reject directories
+@item -X @var{list}
+@itemx --exclude @var{list}
+@itemx exclude_directories = @var{list}
+@samp{-X} option is exactly the reverse of @samp{-I}---this is a list of
+directories @emph{excluded} from the download. E.g. if you do not want
+Wget to download things from @file{/cgi-bin} directory, specify @samp{-X
+/cgi-bin} on the command line.
+
+The same as with @samp{-A}/@samp{-R}, these two options can be combined
+to get a better fine-tuning of downloading subdirectories. E.g. if you
+want to load all the files from @file{/pub} hierarchy except for
+@file{/pub/worthless}, specify @samp{-I/pub -X/pub/worthless}.
+
+@cindex no parent
+@item -np
+@itemx --no-parent
+@itemx no_parent = on
+The simplest, and often very useful way of limiting directories is
+disallowing retrieval of the links that refer to the hierarchy
+@dfn{above} than the beginning directory, i.e. disallowing ascent to the
+parent directory/directories.
+
+The @samp{--no-parent} option (short @samp{-np}) is useful in this case.
+Using it guarantees that you will never leave the existing hierarchy.
+Supposing you issue Wget with:
+
+@example
+wget -r --no-parent http://somehost/~luzer/my-archive/
+@end example
+
+You may rest assured that none of the references to
+@file{/~his-girls-homepage/} or @file{/~luzer/all-my-mpegs/} will be
+followed. Only the archive you are interested in will be downloaded.
+Essentially, @samp{--no-parent} is similar to
+@samp{-I/~luzer/my-archive}, only it handles redirections in a more
+intelligent fashion.
+
+@strong{Note} that, for HTTP (and HTTPS), the trailing slash is very
+important to @samp{--no-parent}. HTTP has no concept of a ``directory''---Wget
+relies on you to indicate what's a directory and what isn't. In
+@samp{http://foo/bar/}, Wget will consider @samp{bar} to be a
+directory, while in @samp{http://foo/bar} (no trailing slash),
+@samp{bar} will be considered a filename (so @samp{--no-parent} would be
+meaningless, as its parent is @samp{/}).
+@end table
+
+@node Relative Links, FTP Links, Directory-Based Limits, Following Links
+@section Relative Links
+@cindex relative links
+
+When @samp{-L} is turned on, only the relative links are ever followed.
+Relative links are here defined those that do not refer to the web
+server root. For example, these links are relative:
+
+@example
+<a href="foo.gif">
+<a href="foo/bar.gif">
+<a href="../foo/bar.gif">
+@end example
+
+These links are not relative:
+
+@example
+<a href="/foo.gif">
+<a href="/foo/bar.gif">
+<a href="http://www.example.com/foo/bar.gif">
+@end example
+
+Using this option guarantees that recursive retrieval will not span
+hosts, even without @samp{-H}. In simple cases it also allows downloads
+to ``just work'' without having to convert links.
+
+This option is probably not very useful and might be removed in a future
+release.
+
+@node FTP Links, , Relative Links, Following Links
+@section Following FTP Links
+@cindex following ftp links
+
+The rules for @sc{ftp} are somewhat specific, as it is necessary for
+them to be. @sc{ftp} links in @sc{html} documents are often included
+for purposes of reference, and it is often inconvenient to download them
+by default.
+
+To have @sc{ftp} links followed from @sc{html} documents, you need to
+specify the @samp{--follow-ftp} option. Having done that, @sc{ftp}
+links will span hosts regardless of @samp{-H} setting. This is logical,
+as @sc{ftp} links rarely point to the same host where the @sc{http}
+server resides. For similar reasons, the @samp{-L} options has no
+effect on such downloads. On the other hand, domain acceptance
+(@samp{-D}) and suffix rules (@samp{-A} and @samp{-R}) apply normally.
+
+Also note that followed links to @sc{ftp} directories will not be
+retrieved recursively further.
+
+@node Time-Stamping, Startup File, Following Links, Top
+@chapter Time-Stamping
+@cindex time-stamping
+@cindex timestamping
+@cindex updating the archives
+@cindex incremental updating
+
+One of the most important aspects of mirroring information from the
+Internet is updating your archives.
+
+Downloading the whole archive again and again, just to replace a few
+changed files is expensive, both in terms of wasted bandwidth and money,
+and the time to do the update. This is why all the mirroring tools
+offer the option of incremental updating.
+
+Such an updating mechanism means that the remote server is scanned in
+search of @dfn{new} files. Only those new files will be downloaded in
+the place of the old ones.
+
+A file is considered new if one of these two conditions are met:
+
+@enumerate
+@item
+A file of that name does not already exist locally.
+
+@item
+A file of that name does exist, but the remote file was modified more
+recently than the local file.
+@end enumerate
+
+To implement this, the program needs to be aware of the time of last
+modification of both local and remote files. We call this information the
+@dfn{time-stamp} of a file.
+
+The time-stamping in GNU Wget is turned on using @samp{--timestamping}
+(@samp{-N}) option, or through @code{timestamping = on} directive in
+@file{.wgetrc}. With this option, for each file it intends to download,
+Wget will check whether a local file of the same name exists. If it
+does, and the remote file is not newer, Wget will not download it.
+
+If the local file does not exist, or the sizes of the files do not
+match, Wget will download the remote file no matter what the time-stamps
+say.
+
+@menu
+* Time-Stamping Usage::
+* HTTP Time-Stamping Internals::
+* FTP Time-Stamping Internals::
+@end menu
+
+@node Time-Stamping Usage, HTTP Time-Stamping Internals, Time-Stamping, Time-Stamping
+@section Time-Stamping Usage
+@cindex time-stamping usage
+@cindex usage, time-stamping
+
+The usage of time-stamping is simple. Say you would like to download a
+file so that it keeps its date of modification.
+
+@example
+wget -S http://www.gnu.ai.mit.edu/
+@end example
+
+A simple @code{ls -l} shows that the time stamp on the local file equals
+the state of the @code{Last-Modified} header, as returned by the server.
+As you can see, the time-stamping info is preserved locally, even
+without @samp{-N} (at least for @sc{http}).
+
+Several days later, you would like Wget to check if the remote file has
+changed, and download it if it has.
+
+@example
+wget -N http://www.gnu.ai.mit.edu/
+@end example
+
+Wget will ask the server for the last-modified date. If the local file
+has the same timestamp as the server, or a newer one, the remote file
+will not be re-fetched. However, if the remote file is more recent,
+Wget will proceed to fetch it.
+
+The same goes for @sc{ftp}. For example:
+
+@example
+wget "ftp://ftp.ifi.uio.no/pub/emacs/gnus/*"
+@end example
+
+(The quotes around that URL are to prevent the shell from trying to
+interpret the @samp{*}.)
+
+After download, a local directory listing will show that the timestamps
+match those on the remote server. Reissuing the command with @samp{-N}
+will make Wget re-fetch @emph{only} the files that have been modified
+since the last download.
+
+If you wished to mirror the GNU archive every week, you would use a
+command like the following, weekly:
+
+@example
+wget --timestamping -r ftp://ftp.gnu.org/pub/gnu/
+@end example
+
+Note that time-stamping will only work for files for which the server
+gives a timestamp. For @sc{http}, this depends on getting a
+@code{Last-Modified} header. For @sc{ftp}, this depends on getting a
+directory listing with dates in a format that Wget can parse
+(@pxref{FTP Time-Stamping Internals}).
+
+@node HTTP Time-Stamping Internals, FTP Time-Stamping Internals, Time-Stamping Usage, Time-Stamping
+@section HTTP Time-Stamping Internals
+@cindex http time-stamping
+
+Time-stamping in @sc{http} is implemented by checking of the
+@code{Last-Modified} header. If you wish to retrieve the file
+@file{foo.html} through @sc{http}, Wget will check whether
+@file{foo.html} exists locally. If it doesn't, @file{foo.html} will be
+retrieved unconditionally.
+
+If the file does exist locally, Wget will first check its local
+time-stamp (similar to the way @code{ls -l} checks it), and then send a
+@code{HEAD} request to the remote server, demanding the information on
+the remote file.
+
+The @code{Last-Modified} header is examined to find which file was
+modified more recently (which makes it ``newer''). If the remote file
+is newer, it will be downloaded; if it is older, Wget will give
+up.@footnote{As an additional check, Wget will look at the
+@code{Content-Length} header, and compare the sizes; if they are not the
+same, the remote file will be downloaded no matter what the time-stamp
+says.}
+
+When @samp{--backup-converted} (@samp{-K}) is specified in conjunction
+with @samp{-N}, server file @samp{@var{X}} is compared to local file
+@samp{@var{X}.orig}, if extant, rather than being compared to local file
+@samp{@var{X}}, which will always differ if it's been converted by
+@samp{--convert-links} (@samp{-k}).
+
+Arguably, @sc{http} time-stamping should be implemented using the
+@code{If-Modified-Since} request.
+
+@node FTP Time-Stamping Internals, , HTTP Time-Stamping Internals, Time-Stamping
+@section FTP Time-Stamping Internals
+@cindex ftp time-stamping
+
+In theory, @sc{ftp} time-stamping works much the same as @sc{http}, only
+@sc{ftp} has no headers---time-stamps must be ferreted out of directory
+listings.
+
+If an @sc{ftp} download is recursive or uses globbing, Wget will use the
+@sc{ftp} @code{LIST} command to get a file listing for the directory
+containing the desired file(s). It will try to analyze the listing,
+treating it like Unix @code{ls -l} output, extracting the time-stamps.
+The rest is exactly the same as for @sc{http}. Note that when
+retrieving individual files from an @sc{ftp} server without using
+globbing or recursion, listing files will not be downloaded (and thus
+files will not be time-stamped) unless @samp{-N} is specified.
+
+Assumption that every directory listing is a Unix-style listing may
+sound extremely constraining, but in practice it is not, as many
+non-Unix @sc{ftp} servers use the Unixoid listing format because most
+(all?) of the clients understand it. Bear in mind that @sc{rfc959}
+defines no standard way to get a file list, let alone the time-stamps.
+We can only hope that a future standard will define this.
+
+Another non-standard solution includes the use of @code{MDTM} command
+that is supported by some @sc{ftp} servers (including the popular
+@code{wu-ftpd}), which returns the exact time of the specified file.
+Wget may support this command in the future.
+
+@node Startup File, Examples, Time-Stamping, Top
+@chapter Startup File
+@cindex startup file
+@cindex wgetrc
+@cindex .wgetrc
+@cindex startup
+@cindex .netrc
+
+Once you know how to change default settings of Wget through command
+line arguments, you may wish to make some of those settings permanent.
+You can do that in a convenient way by creating the Wget startup
+file---@file{.wgetrc}.
+
+Besides @file{.wgetrc} is the ``main'' initialization file, it is
+convenient to have a special facility for storing passwords. Thus Wget
+reads and interprets the contents of @file{$HOME/.netrc}, if it finds
+it. You can find @file{.netrc} format in your system manuals.
+
+Wget reads @file{.wgetrc} upon startup, recognizing a limited set of
+commands.
+
+@menu
+* Wgetrc Location:: Location of various wgetrc files.
+* Wgetrc Syntax:: Syntax of wgetrc.
+* Wgetrc Commands:: List of available commands.
+* Sample Wgetrc:: A wgetrc example.
+@end menu
+
+@node Wgetrc Location, Wgetrc Syntax, Startup File, Startup File
+@section Wgetrc Location
+@cindex wgetrc location
+@cindex location of wgetrc
+
+When initializing, Wget will look for a @dfn{global} startup file,
+@file{/usr/local/etc/wgetrc} by default (or some prefix other than
+@file{/usr/local}, if Wget was not installed there) and read commands
+from there, if it exists.
+
+Then it will look for the user's file. If the environmental variable
+@code{WGETRC} is set, Wget will try to load that file. Failing that, no
+further attempts will be made.
+
+If @code{WGETRC} is not set, Wget will try to load @file{$HOME/.wgetrc}.
+
+The fact that user's settings are loaded after the system-wide ones
+means that in case of collision user's wgetrc @emph{overrides} the
+system-wide wgetrc (in @file{/usr/local/etc/wgetrc} by default).
+Fascist admins, away!
+
+@node Wgetrc Syntax, Wgetrc Commands, Wgetrc Location, Startup File
+@section Wgetrc Syntax
+@cindex wgetrc syntax
+@cindex syntax of wgetrc
+
+The syntax of a wgetrc command is simple:
+
+@example
+variable = value
+@end example
+
+The @dfn{variable} will also be called @dfn{command}. Valid
+@dfn{values} are different for different commands.
+
+The commands are case-, underscore- and minus-insensitive. Thus
+@samp{DIr__PrefiX}, @samp{DIr-PrefiX} and @samp{dirprefix} are the same.
+Empty lines, lines beginning with @samp{#} and lines containing white-space
+only are discarded.
+
+Commands that expect a comma-separated list will clear the list on an
+empty command. So, if you wish to reset the rejection list specified in
+global @file{wgetrc}, you can do it with:
+
+@example
+reject =
+@end example
+
+@node Wgetrc Commands, Sample Wgetrc, Wgetrc Syntax, Startup File
+@section Wgetrc Commands
+@cindex wgetrc commands
+
+The complete set of commands is listed below. Legal values are listed
+after the @samp{=}. Simple Boolean values can be set or unset using
+@samp{on} and @samp{off} or @samp{1} and @samp{0}.
+
+Some commands take pseudo-arbitrary values. @var{address} values can be
+hostnames or dotted-quad IP addresses. @var{n} can be any positive
+integer, or @samp{inf} for infinity, where appropriate. @var{string}
+values can be any non-empty string.
+
+Most of these commands have direct command-line equivalents. Also, any
+wgetrc command can be specified on the command line using the
+@samp{--execute} switch (@pxref{Basic Startup Options}.)
+
+@table @asis
+@item accept/reject = @var{string}
+Same as @samp{-A}/@samp{-R} (@pxref{Types of Files}).
+
+@item add_hostdir = on/off
+Enable/disable host-prefixed file names. @samp{-nH} disables it.
+
+@item ask_password = on/off
+Prompt for a password for each connection established. Cannot be specified
+when @samp{--password} is being used, because they are mutually
+exclusive. Equivalent to @samp{--ask-password}.
+
+@item auth_no_challenge = on/off
+If this option is given, Wget will send Basic HTTP authentication
+information (plaintext username and password) for all requests. See
+@samp{--auth-no-challenge}.
+
+@item background = on/off
+Enable/disable going to background---the same as @samp{-b} (which
+enables it).
+
+@item backup_converted = on/off
+Enable/disable saving pre-converted files with the suffix
+@samp{.orig}---the same as @samp{-K} (which enables it).
+
+@item backups = @var{number}
+Use up to @var{number} backups for a file. Backups are rotated by
+adding an incremental counter that starts at @samp{1}. The default is
+@samp{0}.
+
+@item base = @var{string}
+Consider relative @sc{url}s in input files (specified via the
+@samp{input} command or the @samp{--input-file}/@samp{-i} option,
+together with @samp{force_html} or @samp{--force-html})
+as being relative to @var{string}---the same as @samp{--base=@var{string}}.
+
+@item bind_address = @var{address}
+Bind to @var{address}, like the @samp{--bind-address=@var{address}}.
+
+@item ca_certificate = @var{file}
+Set the certificate authority bundle file to @var{file}. The same
+as @samp{--ca-certificate=@var{file}}.
+
+@item ca_directory = @var{directory}
+Set the directory used for certificate authorities. The same as
+@samp{--ca-directory=@var{directory}}.
+
+@item cache = on/off
+When set to off, disallow server-caching. See the @samp{--no-cache}
+option.
+
+@item certificate = @var{file}
+Set the client certificate file name to @var{file}. The same as
+@samp{--certificate=@var{file}}.
+
+@item certificate_type = @var{string}
+Specify the type of the client certificate, legal values being
+@samp{PEM} (the default) and @samp{DER} (aka ASN1). The same as
+@samp{--certificate-type=@var{string}}.
+
+@item check_certificate = on/off
+If this is set to off, the server certificate is not checked against
+the specified client authorities. The default is ``on''. The same as
+@samp{--check-certificate}.
+
+@item connect_timeout = @var{n}
+Set the connect timeout---the same as @samp{--connect-timeout}.
+
+@item content_disposition = on/off
+Turn on recognition of the (non-standard) @samp{Content-Disposition}
+HTTP header---if set to @samp{on}, the same as @samp{--content-disposition}.
+
+@item trust_server_names = on/off
+If set to on, construct the local file name from redirection URLs
+rather than original URLs.
+
+@item continue = on/off
+If set to on, force continuation of preexistent partially retrieved
+files. See @samp{-c} before setting it.
+
+@item convert_links = on/off
+Convert non-relative links locally. The same as @samp{-k}.
+
+@item cookies = on/off
+When set to off, disallow cookies. See the @samp{--cookies} option.
+
+@item cut_dirs = @var{n}
+Ignore @var{n} remote directory components. Equivalent to
+@samp{--cut-dirs=@var{n}}.
+
+@item debug = on/off
+Debug mode, same as @samp{-d}.
+
+@item default_page = @var{string}
+Default page name---the same as @samp{--default-page=@var{string}}.
+
+@item delete_after = on/off
+Delete after download---the same as @samp{--delete-after}.
+
+@item dir_prefix = @var{string}
+Top of directory tree---the same as @samp{-P @var{string}}.
+
+@item dirstruct = on/off
+Turning dirstruct on or off---the same as @samp{-x} or @samp{-nd},
+respectively.
+
+@item dns_cache = on/off
+Turn DNS caching on/off. Since DNS caching is on by default, this
+option is normally used to turn it off and is equivalent to
+@samp{--no-dns-cache}.
+
+@item dns_timeout = @var{n}
+Set the DNS timeout---the same as @samp{--dns-timeout}.
+
+@item domains = @var{string}
+Same as @samp{-D} (@pxref{Spanning Hosts}).
+
+@item dot_bytes = @var{n}
+Specify the number of bytes ``contained'' in a dot, as seen throughout
+the retrieval (1024 by default). You can postfix the value with
+@samp{k} or @samp{m}, representing kilobytes and megabytes,
+respectively. With dot settings you can tailor the dot retrieval to
+suit your needs, or you can use the predefined @dfn{styles}
+(@pxref{Download Options}).
+
+@item dot_spacing = @var{n}
+Specify the number of dots in a single cluster (10 by default).
+
+@item dots_in_line = @var{n}
+Specify the number of dots that will be printed in each line throughout
+the retrieval (50 by default).
+
+@item egd_file = @var{file}
+Use @var{string} as the EGD socket file name. The same as
+@samp{--egd-file=@var{file}}.
+
+@item exclude_directories = @var{string}
+Specify a comma-separated list of directories you wish to exclude from
+download---the same as @samp{-X @var{string}} (@pxref{Directory-Based
+Limits}).
+
+@item exclude_domains = @var{string}
+Same as @samp{--exclude-domains=@var{string}} (@pxref{Spanning
+Hosts}).
+
+@item follow_ftp = on/off
+Follow @sc{ftp} links from @sc{html} documents---the same as
+@samp{--follow-ftp}.
+
+@item follow_tags = @var{string}
+Only follow certain @sc{html} tags when doing a recursive retrieval,
+just like @samp{--follow-tags=@var{string}}.
+
+@item force_html = on/off
+If set to on, force the input filename to be regarded as an @sc{html}
+document---the same as @samp{-F}.
+
+@item ftp_password = @var{string}
+Set your @sc{ftp} password to @var{string}. Without this setting, the
+password defaults to @samp{-wget@@}, which is a useful default for
+anonymous @sc{ftp} access.
+
+This command used to be named @code{passwd} prior to Wget 1.10.
+
+@item ftp_proxy = @var{string}
+Use @var{string} as @sc{ftp} proxy, instead of the one specified in
+environment.
+
+@item ftp_user = @var{string}
+Set @sc{ftp} user to @var{string}.
+
+This command used to be named @code{login} prior to Wget 1.10.
+
+@item glob = on/off
+Turn globbing on/off---the same as @samp{--glob} and @samp{--no-glob}.
+
+@item header = @var{string}
+Define a header for HTTP downloads, like using
+@samp{--header=@var{string}}.
+
+@item compression = @var{string}
+Choose the compression type to be used. Legal values are @samp{auto}
+(the default), @samp{gzip}, and @samp{none}. The same as
+@samp{--compression=@var{string}}.
+
+@item adjust_extension = on/off
+Add a @samp{.html} extension to @samp{text/html} or
+@samp{application/xhtml+xml} files that lack one, a @samp{.css}
+extension to @samp{text/css} files that lack one, and a @samp{.br},
+@samp{.Z}, @samp{.zlib} or @samp{.gz} to compressed files like
+@samp{-E}. Previously named @samp{html_extension} (still acceptable,
+but deprecated).
+
+@item http_keep_alive = on/off
+Turn the keep-alive feature on or off (defaults to on). Turning it
+off is equivalent to @samp{--no-http-keep-alive}.
+
+@item http_password = @var{string}
+Set @sc{http} password, equivalent to
+@samp{--http-password=@var{string}}.
+
+@item http_proxy = @var{string}
+Use @var{string} as @sc{http} proxy, instead of the one specified in
+environment.
+
+@item http_user = @var{string}
+Set @sc{http} user to @var{string}, equivalent to
+@samp{--http-user=@var{string}}.
+
+@item https_only = on/off
+When in recursive mode, only HTTPS links are followed (defaults to off).
+
+@item https_proxy = @var{string}
+Use @var{string} as @sc{https} proxy, instead of the one specified in
+environment.
+
+@item ignore_case = on/off
+When set to on, match files and directories case insensitively; the
+same as @samp{--ignore-case}.
+
+@item ignore_length = on/off
+When set to on, ignore @code{Content-Length} header; the same as
+@samp{--ignore-length}.
+
+@item ignore_tags = @var{string}
+Ignore certain @sc{html} tags when doing a recursive retrieval, like
+@samp{--ignore-tags=@var{string}}.
+
+@item include_directories = @var{string}
+Specify a comma-separated list of directories you wish to follow when
+downloading---the same as @samp{-I @var{string}}.
+
+@item iri = on/off
+When set to on, enable internationalized URI (IRI) support; the same as
+@samp{--iri}.
+
+@item inet4_only = on/off
+Force connecting to IPv4 addresses, off by default. You can put this
+in the global init file to disable Wget's attempts to resolve and
+connect to IPv6 hosts. Available only if Wget was compiled with IPv6
+support. The same as @samp{--inet4-only} or @samp{-4}.
+
+@item inet6_only = on/off
+Force connecting to IPv6 addresses, off by default. Available only if
+Wget was compiled with IPv6 support. The same as @samp{--inet6-only}
+or @samp{-6}.
+
+@item input = @var{file}
+Read the @sc{url}s from @var{string}, like @samp{-i @var{file}}.
+
+@item keep_session_cookies = on/off
+When specified, causes @samp{save_cookies = on} to also save session
+cookies. See @samp{--keep-session-cookies}.
+
+@item limit_rate = @var{rate}
+Limit the download speed to no more than @var{rate} bytes per second.
+The same as @samp{--limit-rate=@var{rate}}.
+
+@item load_cookies = @var{file}
+Load cookies from @var{file}. See @samp{--load-cookies @var{file}}.
+
+@item local_encoding = @var{encoding}
+Force Wget to use @var{encoding} as the default system encoding. See
+@samp{--local-encoding}.
+
+@item logfile = @var{file}
+Set logfile to @var{file}, the same as @samp{-o @var{file}}.
+
+@item max_redirect = @var{number}
+Specifies the maximum number of redirections to follow for a resource.
+See @samp{--max-redirect=@var{number}}.
+
+@item mirror = on/off
+Turn mirroring on/off. The same as @samp{-m}.
+
+@item netrc = on/off
+Turn reading netrc on or off.
+
+@item no_clobber = on/off
+Same as @samp{-nc}.
+
+@item no_parent = on/off
+Disallow retrieving outside the directory hierarchy, like
+@samp{--no-parent} (@pxref{Directory-Based Limits}).
+
+@item no_proxy = @var{string}
+Use @var{string} as the comma-separated list of domains to avoid in
+proxy loading, instead of the one specified in environment.
+
+@item output_document = @var{file}
+Set the output filename---the same as @samp{-O @var{file}}.
+
+@item page_requisites = on/off
+Download all ancillary documents necessary for a single @sc{html} page to
+display properly---the same as @samp{-p}.
+
+@item passive_ftp = on/off
+Change setting of passive @sc{ftp}, equivalent to the
+@samp{--passive-ftp} option.
+
+@item password = @var{string}
+Specify password @var{string} for both @sc{ftp} and @sc{http} file retrieval.
+This command can be overridden using the @samp{ftp_password} and
+@samp{http_password} command for @sc{ftp} and @sc{http} respectively.
+
+@item post_data = @var{string}
+Use POST as the method for all HTTP requests and send @var{string} in
+the request body. The same as @samp{--post-data=@var{string}}.
+
+@item post_file = @var{file}
+Use POST as the method for all HTTP requests and send the contents of
+@var{file} in the request body. The same as
+@samp{--post-file=@var{file}}.
+
+@item prefer_family = none/IPv4/IPv6
+When given a choice of several addresses, connect to the addresses
+with specified address family first. The address order returned by
+DNS is used without change by default. The same as @samp{--prefer-family},
+which see for a detailed discussion of why this is useful.
+
+@item private_key = @var{file}
+Set the private key file to @var{file}. The same as
+@samp{--private-key=@var{file}}.
+
+@item private_key_type = @var{string}
+Specify the type of the private key, legal values being @samp{PEM}
+(the default) and @samp{DER} (aka ASN1). The same as
+@samp{--private-type=@var{string}}.
+
+@item progress = @var{string}
+Set the type of the progress indicator. Legal types are @samp{dot}
+and @samp{bar}. Equivalent to @samp{--progress=@var{string}}.
+
+@item protocol_directories = on/off
+When set, use the protocol name as a directory component of local file
+names. The same as @samp{--protocol-directories}.
+
+@item proxy_password = @var{string}
+Set proxy authentication password to @var{string}, like
+@samp{--proxy-password=@var{string}}.
+
+@item proxy_user = @var{string}
+Set proxy authentication user name to @var{string}, like
+@samp{--proxy-user=@var{string}}.
+
+@item quiet = on/off
+Quiet mode---the same as @samp{-q}.
+
+@item quota = @var{quota}
+Specify the download quota, which is useful to put in the global
+@file{wgetrc}. When download quota is specified, Wget will stop
+retrieving after the download sum has become greater than quota. The
+quota can be specified in bytes (default), kbytes @samp{k} appended) or
+mbytes (@samp{m} appended). Thus @samp{quota = 5m} will set the quota
+to 5 megabytes. Note that the user's startup file overrides system
+settings.
+
+@item random_file = @var{file}
+Use @var{file} as a source of randomness on systems lacking
+@file{/dev/random}.
+
+@item random_wait = on/off
+Turn random between-request wait times on or off. The same as
+@samp{--random-wait}.
+
+@item read_timeout = @var{n}
+Set the read (and write) timeout---the same as
+@samp{--read-timeout=@var{n}}.
+
+@item reclevel = @var{n}
+Recursion level (depth)---the same as @samp{-l @var{n}}.
+
+@item recursive = on/off
+Recursive on/off---the same as @samp{-r}.
+
+@item referer = @var{string}
+Set HTTP @samp{Referer:} header just like
+@samp{--referer=@var{string}}. (Note that it was the folks who wrote
+the @sc{http} spec who got the spelling of ``referrer'' wrong.)
+
+@item relative_only = on/off
+Follow only relative links---the same as @samp{-L} (@pxref{Relative
+Links}).
+
+@item remote_encoding = @var{encoding}
+Force Wget to use @var{encoding} as the default remote server encoding.
+See @samp{--remote-encoding}.
+
+@item remove_listing = on/off
+If set to on, remove @sc{ftp} listings downloaded by Wget. Setting it
+to off is the same as @samp{--no-remove-listing}.
+
+@item restrict_file_names = unix/windows
+Restrict the file names generated by Wget from URLs. See
+@samp{--restrict-file-names} for a more detailed description.
+
+@item retr_symlinks = on/off
+When set to on, retrieve symbolic links as if they were plain files; the
+same as @samp{--retr-symlinks}.
+
+@item retry_connrefused = on/off
+When set to on, consider ``connection refused'' a transient
+error---the same as @samp{--retry-connrefused}.
+
+@item robots = on/off
+Specify whether the norobots convention is respected by Wget, ``on'' by
+default. This switch controls both the @file{/robots.txt} and the
+@samp{nofollow} aspect of the spec. @xref{Robot Exclusion}, for more
+details about this. Be sure you know what you are doing before turning
+this off.
+
+@item save_cookies = @var{file}
+Save cookies to @var{file}. The same as @samp{--save-cookies
+@var{file}}.
+
+@item save_headers = on/off
+Same as @samp{--save-headers}.
+
+@item secure_protocol = @var{string}
+Choose the secure protocol to be used. Legal values are @samp{auto}
+(the default), @samp{SSLv2}, @samp{SSLv3}, and @samp{TLSv1}. The same
+as @samp{--secure-protocol=@var{string}}.
+
+@item server_response = on/off
+Choose whether or not to print the @sc{http} and @sc{ftp} server
+responses---the same as @samp{-S}.
+
+@item show_all_dns_entries = on/off
+When a DNS name is resolved, show all the IP addresses, not just the first
+three.
+
+@item span_hosts = on/off
+Same as @samp{-H}.
+
+@item spider = on/off
+Same as @samp{--spider}.
+
+@item strict_comments = on/off
+Same as @samp{--strict-comments}.
+
+@item timeout = @var{n}
+Set all applicable timeout values to @var{n}, the same as @samp{-T
+@var{n}}.
+
+@item timestamping = on/off
+Turn timestamping on/off. The same as @samp{-N} (@pxref{Time-Stamping}).
+
+@item use_server_timestamps = on/off
+If set to @samp{off}, Wget won't set the local file's timestamp by the
+one on the server (same as @samp{--no-use-server-timestamps}).
+
+@item tries = @var{n}
+Set number of retries per @sc{url}---the same as @samp{-t @var{n}}.
+
+@item use_proxy = on/off
+When set to off, don't use proxy even when proxy-related environment
+variables are set. In that case it is the same as using
+@samp{--no-proxy}.
+
+@item user = @var{string}
+Specify username @var{string} for both @sc{ftp} and @sc{http} file retrieval.
+This command can be overridden using the @samp{ftp_user} and
+@samp{http_user} command for @sc{ftp} and @sc{http} respectively.
+
+@item user_agent = @var{string}
+User agent identification sent to the HTTP Server---the same as
+@samp{--user-agent=@var{string}}.
+
+@item verbose = on/off
+Turn verbose on/off---the same as @samp{-v}/@samp{-nv}.
+
+@item wait = @var{n}
+Wait @var{n} seconds between retrievals---the same as @samp{-w
+@var{n}}.
+
+@item wait_retry = @var{n}
+Wait up to @var{n} seconds between retries of failed retrievals
+only---the same as @samp{--waitretry=@var{n}}. Note that this is
+turned on by default in the global @file{wgetrc}.
+@end table
+
+@node Sample Wgetrc, , Wgetrc Commands, Startup File
+@section Sample Wgetrc
+@cindex sample wgetrc
+
+This is the sample initialization file, as given in the distribution.
+It is divided in two section---one for global usage (suitable for global
+startup file), and one for local usage (suitable for
+@file{$HOME/.wgetrc}). Be careful about the things you change.
+
+Note that almost all the lines are commented out. For a command to have
+any effect, you must remove the @samp{#} character at the beginning of
+its line.
+
+@example
+@include sample.wgetrc.munged_for_texi_inclusion
+@end example
+
+@node Examples, Various, Startup File, Top
+@chapter Examples
+@cindex examples
+
+@c man begin EXAMPLES
+The examples are divided into three sections loosely based on their
+complexity.
+
+@menu
+* Simple Usage:: Simple, basic usage of the program.
+* Advanced Usage:: Advanced tips.
+* Very Advanced Usage:: The hairy stuff.
+@end menu
+
+@node Simple Usage, Advanced Usage, Examples, Examples
+@section Simple Usage
+
+@itemize @bullet
+@item
+Say you want to download a @sc{url}. Just type:
+
+@example
+wget http://fly.srk.fer.hr/
+@end example
+
+@item
+But what will happen if the connection is slow, and the file is lengthy?
+The connection will probably fail before the whole file is retrieved,
+more than once. In this case, Wget will try getting the file until it
+either gets the whole of it, or exceeds the default number of retries
+(this being 20). It is easy to change the number of tries to 45, to
+insure that the whole file will arrive safely:
+
+@example
+wget --tries=45 http://fly.srk.fer.hr/jpg/flyweb.jpg
+@end example
+
+@item
+Now let's leave Wget to work in the background, and write its progress
+to log file @file{log}. It is tiring to type @samp{--tries}, so we
+shall use @samp{-t}.
+
+@example
+wget -t 45 -o log http://fly.srk.fer.hr/jpg/flyweb.jpg &
+@end example
+
+The ampersand at the end of the line makes sure that Wget works in the
+background. To unlimit the number of retries, use @samp{-t inf}.
+
+@item
+The usage of @sc{ftp} is as simple. Wget will take care of login and
+password.
+
+@example
+wget ftp://gnjilux.srk.fer.hr/welcome.msg
+@end example
+
+@item
+If you specify a directory, Wget will retrieve the directory listing,
+parse it and convert it to @sc{html}. Try:
+
+@example
+wget ftp://ftp.gnu.org/pub/gnu/
+links index.html
+@end example
+@end itemize
+
+@node Advanced Usage, Very Advanced Usage, Simple Usage, Examples
+@section Advanced Usage
+
+@itemize @bullet
+@item
+You have a file that contains the URLs you want to download? Use the
+@samp{-i} switch:
+
+@example
+wget -i @var{file}
+@end example
+
+If you specify @samp{-} as file name, the @sc{url}s will be read from
+standard input.
+
+@item
+Create a five levels deep mirror image of the GNU web site, with the
+same directory structure the original has, with only one try per
+document, saving the log of the activities to @file{gnulog}:
+
+@example
+wget -r https://www.gnu.org/ -o gnulog
+@end example
+
+@item
+The same as the above, but convert the links in the downloaded files to
+point to local files, so you can view the documents off-line:
+
+@example
+wget --convert-links -r https://www.gnu.org/ -o gnulog
+@end example
+
+@item
+Retrieve only one @sc{html} page, but make sure that all the elements needed
+for the page to be displayed, such as inline images and external style
+sheets, are also downloaded. Also make sure the downloaded page
+references the downloaded links.
+
+@example
+wget -p --convert-links http://www.example.com/dir/page.html
+@end example
+
+The @sc{html} page will be saved to @file{www.example.com/dir/page.html}, and
+the images, stylesheets, etc., somewhere under @file{www.example.com/},
+depending on where they were on the remote server.
+
+@item
+The same as the above, but without the @file{www.example.com/} directory.
+In fact, I don't want to have all those random server directories
+anyway---just save @emph{all} those files under a @file{download/}
+subdirectory of the current directory.
+
+@example
+wget -p --convert-links -nH -nd -Pdownload \
+ http://www.example.com/dir/page.html
+@end example
+
+@item
+Retrieve the index.html of @samp{www.lycos.com}, showing the original
+server headers:
+
+@example
+wget -S http://www.lycos.com/
+@end example
+
+@item
+Save the server headers with the file, perhaps for post-processing.
+
+@example
+wget --save-headers http://www.lycos.com/
+more index.html
+@end example
+
+@item
+Retrieve the first two levels of @samp{wuarchive.wustl.edu}, saving them
+to @file{/tmp}.
+
+@example
+wget -r -l2 -P/tmp ftp://wuarchive.wustl.edu/
+@end example
+
+@item
+You want to download all the @sc{gif}s from a directory on an @sc{http}
+server. You tried @samp{wget http://www.example.com/dir/*.gif}, but that
+didn't work because @sc{http} retrieval does not support globbing. In
+that case, use:
+
+@example
+wget -r -l1 --no-parent -A.gif http://www.example.com/dir/
+@end example
+
+More verbose, but the effect is the same. @samp{-r -l1} means to
+retrieve recursively (@pxref{Recursive Download}), with maximum depth
+of 1. @samp{--no-parent} means that references to the parent directory
+are ignored (@pxref{Directory-Based Limits}), and @samp{-A.gif} means to
+download only the @sc{gif} files. @samp{-A "*.gif"} would have worked
+too.
+
+@item
+Suppose you were in the middle of downloading, when Wget was
+interrupted. Now you do not want to clobber the files already present.
+It would be:
+
+@example
+wget -nc -r https://www.gnu.org/
+@end example
+
+@item
+If you want to encode your own username and password to @sc{http} or
+@sc{ftp}, use the appropriate @sc{url} syntax (@pxref{URL Format}).
+
+@example
+wget ftp://hniksic:mypassword@@unix.example.com/.emacs
+@end example
+
+Note, however, that this usage is not advisable on multi-user systems
+because it reveals your password to anyone who looks at the output of
+@code{ps}.
+
+@cindex redirecting output
+@item
+You would like the output documents to go to standard output instead of
+to files?
+
+@example
+wget -O - http://jagor.srce.hr/ http://www.srce.hr/
+@end example
+
+You can also combine the two options and make pipelines to retrieve the
+documents from remote hotlists:
+
+@example
+wget -O - http://cool.list.com/ | wget --force-html -i -
+@end example
+@end itemize
+
+@node Very Advanced Usage, , Advanced Usage, Examples
+@section Very Advanced Usage
+
+@cindex mirroring
+@itemize @bullet
+@item
+If you wish Wget to keep a mirror of a page (or @sc{ftp}
+subdirectories), use @samp{--mirror} (@samp{-m}), which is the shorthand
+for @samp{-r -l inf -N}. You can put Wget in the crontab file asking it
+to recheck a site each Sunday:
+
+@example
+crontab
+0 0 * * 0 wget --mirror https://www.gnu.org/ -o /home/me/weeklog
+@end example
+
+@item
+In addition to the above, you want the links to be converted for local
+viewing. But, after having read this manual, you know that link
+conversion doesn't play well with timestamping, so you also want Wget to
+back up the original @sc{html} files before the conversion. Wget invocation
+would look like this:
+
+@example
+wget --mirror --convert-links --backup-converted \
+ https://www.gnu.org/ -o /home/me/weeklog
+@end example
+
+@item
+But you've also noticed that local viewing doesn't work all that well
+when @sc{html} files are saved under extensions other than @samp{.html},
+perhaps because they were served as @file{index.cgi}. So you'd like
+Wget to rename all the files served with content-type @samp{text/html}
+or @samp{application/xhtml+xml} to @file{@var{name}.html}.
+
+@example
+wget --mirror --convert-links --backup-converted \
+ --html-extension -o /home/me/weeklog \
+ https://www.gnu.org/
+@end example
+
+Or, with less typing:
+
+@example
+wget -m -k -K -E https://www.gnu.org/ -o /home/me/weeklog
+@end example
+@end itemize
+@c man end
+
+@node Various, Appendices, Examples, Top
+@chapter Various
+@cindex various
+
+This chapter contains all the stuff that could not fit anywhere else.
+
+@menu
+* Proxies:: Support for proxy servers.
+* Distribution:: Getting the latest version.
+* Web Site:: GNU Wget's presence on the World Wide Web.
+* Mailing Lists:: Wget mailing list for announcements and discussion.
+* Internet Relay Chat:: Wget's presence on IRC.
+* Reporting Bugs:: How and where to report bugs.
+* Portability:: The systems Wget works on.
+* Signals:: Signal-handling performed by Wget.
+@end menu
+
+@node Proxies, Distribution, Various, Various
+@section Proxies
+@cindex proxies
+
+@dfn{Proxies} are special-purpose @sc{http} servers designed to transfer
+data from remote servers to local clients. One typical use of proxies
+is lightening network load for users behind a slow connection. This is
+achieved by channeling all @sc{http} and @sc{ftp} requests through the
+proxy which caches the transferred data. When a cached resource is
+requested again, proxy will return the data from cache. Another use for
+proxies is for companies that separate (for security reasons) their
+internal networks from the rest of Internet. In order to obtain
+information from the Web, their users connect and retrieve remote data
+using an authorized proxy.
+
+@c man begin ENVIRONMENT
+Wget supports proxies for both @sc{http} and @sc{ftp} retrievals. The
+standard way to specify proxy location, which Wget recognizes, is using
+the following environment variables:
+
+@table @env
+@item http_proxy
+@itemx https_proxy
+If set, the @env{http_proxy} and @env{https_proxy} variables should
+contain the @sc{url}s of the proxies for @sc{http} and @sc{https}
+connections respectively.
+
+@item ftp_proxy
+This variable should contain the @sc{url} of the proxy for @sc{ftp}
+connections. It is quite common that @env{http_proxy} and
+@env{ftp_proxy} are set to the same @sc{url}.
+
+@item no_proxy
+This variable should contain a comma-separated list of domain extensions
+proxy should @emph{not} be used for. For instance, if the value of
+@env{no_proxy} is @samp{.mit.edu}, proxy will not be used to retrieve
+documents from MIT.
+@end table
+@c man end
+
+In addition to the environment variables, proxy location and settings
+may be specified from within Wget itself.
+
+@table @samp
+@item --no-proxy
+@itemx proxy = on/off
+This option and the corresponding command may be used to suppress the
+use of proxy, even if the appropriate environment variables are set.
+
+@item http_proxy = @var{URL}
+@itemx https_proxy = @var{URL}
+@itemx ftp_proxy = @var{URL}
+@itemx no_proxy = @var{string}
+These startup file variables allow you to override the proxy settings
+specified by the environment.
+@end table
+
+Some proxy servers require authorization to enable you to use them. The
+authorization consists of @dfn{username} and @dfn{password}, which must
+be sent by Wget. As with @sc{http} authorization, several
+authentication schemes exist. For proxy authorization only the
+@code{Basic} authentication scheme is currently implemented.
+
+You may specify your username and password either through the proxy
+@sc{url} or through the command-line options. Assuming that the
+company's proxy is located at @samp{proxy.company.com} at port 8001, a
+proxy @sc{url} location containing authorization data might look like
+this:
+
+@example
+http://hniksic:mypassword@@proxy.company.com:8001/
+@end example
+
+Alternatively, you may use the @samp{proxy-user} and
+@samp{proxy-password} options, and the equivalent @file{.wgetrc}
+settings @code{proxy_user} and @code{proxy_password} to set the proxy
+username and password.
+
+@node Distribution, Web Site, Proxies, Various
+@section Distribution
+@cindex latest version
+
+Like all GNU utilities, the latest version of Wget can be found at the
+master GNU archive site ftp.gnu.org, and its mirrors. For example,
+Wget @value{VERSION} can be found at
+@url{https://ftp.gnu.org/pub/gnu/wget/wget-@value{VERSION}.tar.gz}
+
+@node Web Site, Mailing Lists, Distribution, Various
+@section Web Site
+@cindex web site
+
+The official web site for GNU Wget is at
+@url{https//www.gnu.org/software/wget/}. However, most useful
+information resides at ``The Wget Wgiki'',
+@url{http://wget.addictivecode.org/}.
+
+@node Mailing Lists, Internet Relay Chat, Web Site, Various
+@section Mailing Lists
+@cindex mailing list
+@cindex list
+
+@unnumberedsubsec Primary List
+
+The primary mailinglist for discussion, bug-reports, or questions
+about GNU Wget is at @email{bug-wget@@gnu.org}. To subscribe, send an
+email to @email{bug-wget-join@@gnu.org}, or visit
+@url{https://lists.gnu.org/mailman/listinfo/bug-wget}.
+
+You do not need to subscribe to send a message to the list; however,
+please note that unsubscribed messages are moderated, and may take a
+while before they hit the list---@strong{usually around a day}. If
+you want your message to show up immediately, please subscribe to the
+list before posting. Archives for the list may be found at
+@url{https://lists.gnu.org/archive/html/bug-wget/}.
+
+An NNTP/Usenettish gateway is also available via
+@uref{http://gmane.org/about.php,Gmane}. You can see the Gmane
+archives at
+@url{http://news.gmane.org/gmane.comp.web.wget.general}. Note that the
+Gmane archives conveniently include messages from both the current
+list, and the previous one. Messages also show up in the Gmane
+archives sooner than they do at @url{https://lists.gnu.org}.
+
+@unnumberedsubsec Obsolete Lists
+
+Previously, the mailing list @email{wget@@sunsite.dk} was used as the
+main discussion list, and another list,
+@email{wget-patches@@sunsite.dk} was used for submitting and
+discussing patches to GNU Wget.
+
+Messages from @email{wget@@sunsite.dk} are archived at
+@itemize @tie{}
+@item
+@url{https://www.mail-archive.com/wget%40sunsite.dk/} and at
+@item
+@url{http://news.gmane.org/gmane.comp.web.wget.general} (which also
+continues to archive the current list, @email{bug-wget@@gnu.org}).
+@end itemize
+
+Messages from @email{wget-patches@@sunsite.dk} are archived at
+@itemize @tie{}
+@item
+@url{http://news.gmane.org/gmane.comp.web.wget.patches}.
+@end itemize
+
+@node Internet Relay Chat, Reporting Bugs, Mailing Lists, Various
+@section Internet Relay Chat
+@cindex Internet Relay Chat
+@cindex IRC
+@cindex #wget
+
+In addition to the mailinglists, we also have a support channel set up
+via IRC at @code{irc.freenode.org}, @code{#wget}. Come check it out!
+
+@node Reporting Bugs, Portability, Internet Relay Chat, Various
+@section Reporting Bugs
+@cindex bugs
+@cindex reporting bugs
+@cindex bug reports
+
+@c man begin BUGS
+You are welcome to submit bug reports via the GNU Wget bug tracker (see
+@url{https://savannah.gnu.org/bugs/?func=additem&group=wget}) or to our
+mailing list @email{bug-wget@@gnu.org}.
+
+Visit @url{https://lists.gnu.org/mailman/listinfo/bug-wget} to
+get more info (how to subscribe, list archives, ...).
+
+Before actually submitting a bug report, please try to follow a few
+simple guidelines.
+
+@enumerate
+@item
+Please try to ascertain that the behavior you see really is a bug. If
+Wget crashes, it's a bug. If Wget does not behave as documented,
+it's a bug. If things work strange, but you are not sure about the way
+they are supposed to work, it might well be a bug, but you might want to
+double-check the documentation and the mailing lists (@pxref{Mailing
+Lists}).
+
+@item
+Try to repeat the bug in as simple circumstances as possible. E.g. if
+Wget crashes while downloading @samp{wget -rl0 -kKE -t5 --no-proxy
+http://example.com -o /tmp/log}, you should try to see if the crash is
+repeatable, and if will occur with a simpler set of options. You might
+even try to start the download at the page where the crash occurred to
+see if that page somehow triggered the crash.
+
+Also, while I will probably be interested to know the contents of your
+@file{.wgetrc} file, just dumping it into the debug message is probably
+a bad idea. Instead, you should first try to see if the bug repeats
+with @file{.wgetrc} moved out of the way. Only if it turns out that
+@file{.wgetrc} settings affect the bug, mail me the relevant parts of
+the file.
+
+@item
+Please start Wget with @samp{-d} option and send us the resulting
+output (or relevant parts thereof). If Wget was compiled without
+debug support, recompile it---it is @emph{much} easier to trace bugs
+with debug support on.
+
+Note: please make sure to remove any potentially sensitive information
+from the debug log before sending it to the bug address. The
+@code{-d} won't go out of its way to collect sensitive information,
+but the log @emph{will} contain a fairly complete transcript of Wget's
+communication with the server, which may include passwords and pieces
+of downloaded data. Since the bug address is publicly archived, you
+may assume that all bug reports are visible to the public.
+
+@item
+If Wget has crashed, try to run it in a debugger, e.g. @code{gdb `which
+wget` core} and type @code{where} to get the backtrace. This may not
+work if the system administrator has disabled core files, but it is
+safe to try.
+@end enumerate
+@c man end
+
+@node Portability, Signals, Reporting Bugs, Various
+@section Portability
+@cindex portability
+@cindex operating systems
+
+Like all GNU software, Wget works on the GNU system. However, since it
+uses GNU Autoconf for building and configuring, and mostly avoids using
+``special'' features of any particular Unix, it should compile (and
+work) on all common Unix flavors.
+
+Various Wget versions have been compiled and tested under many kinds of
+Unix systems, including GNU/Linux, Solaris, SunOS 4.x, Mac OS X, OSF
+(aka Digital Unix or Tru64), Ultrix, *BSD, IRIX, AIX, and others. Some
+of those systems are no longer in widespread use and may not be able to
+support recent versions of Wget. If Wget fails to compile on your
+system, we would like to know about it.
+
+Thanks to kind contributors, this version of Wget compiles and works
+on 32-bit Microsoft Windows platforms. It has been compiled
+successfully using MS Visual C++ 6.0, Watcom, Borland C, and GCC
+compilers. Naturally, it is crippled of some features available on
+Unix, but it should work as a substitute for people stuck with
+Windows. Note that Windows-specific portions of Wget are not
+guaranteed to be supported in the future, although this has been the
+case in practice for many years now. All questions and problems in
+Windows usage should be reported to Wget mailing list at
+@email{wget@@sunsite.dk} where the volunteers who maintain the
+Windows-related features might look at them.
+
+Support for building on MS-DOS via DJGPP has been contributed by Gisle
+Vanem; a port to VMS is maintained by Steven Schweda, and is available
+at @url{https://antinode.info/dec/sw/wget.html}.
+
+@node Signals, , Portability, Various
+@section Signals
+@cindex signal handling
+@cindex hangup
+
+Since the purpose of Wget is background work, it catches the hangup
+signal (@code{SIGHUP}) and ignores it. If the output was on standard
+output, it will be redirected to a file named @file{wget-log}.
+Otherwise, @code{SIGHUP} is ignored. This is convenient when you wish
+to redirect the output of Wget after having started it.
+
+@example
+$ wget http://www.gnus.org/dist/gnus.tar.gz &
+...
+$ kill -HUP %%
+SIGHUP received, redirecting output to `wget-log'.
+@end example
+
+Other than that, Wget will not try to interfere with signals in any way.
+@kbd{C-c}, @code{kill -TERM} and @code{kill -KILL} should kill it alike.
+
+@node Appendices, Copying this manual, Various, Top
+@chapter Appendices
+
+This chapter contains some references I consider useful.
+
+@menu
+* Robot Exclusion:: Wget's support for RES.
+* Security Considerations:: Security with Wget.
+* Contributors:: People who helped.
+@end menu
+
+@node Robot Exclusion, Security Considerations, Appendices, Appendices
+@section Robot Exclusion
+@cindex robot exclusion
+@cindex robots.txt
+@cindex server maintenance
+
+It is extremely easy to make Wget wander aimlessly around a web site,
+sucking all the available data in progress. @samp{wget -r @var{site}},
+and you're set. Great? Not for the server admin.
+
+As long as Wget is only retrieving static pages, and doing it at a
+reasonable rate (see the @samp{--wait} option), there's not much of a
+problem. The trouble is that Wget can't tell the difference between the
+smallest static page and the most demanding CGI. A site I know has a
+section handled by a CGI Perl script that converts Info files to @sc{html} on
+the fly. The script is slow, but works well enough for human users
+viewing an occasional Info file. However, when someone's recursive Wget
+download stumbles upon the index page that links to all the Info files
+through the script, the system is brought to its knees without providing
+anything useful to the user (This task of converting Info files could be
+done locally and access to Info documentation for all installed GNU
+software on a system is available from the @code{info} command).
+
+To avoid this kind of accident, as well as to preserve privacy for
+documents that need to be protected from well-behaved robots, the
+concept of @dfn{robot exclusion} was invented. The idea is that
+the server administrators and document authors can specify which
+portions of the site they wish to protect from robots and those
+they will permit access.
+
+The most popular mechanism, and the @i{de facto} standard supported by
+all the major robots, is the ``Robots Exclusion Standard'' (RES) written
+by Martijn Koster et al. in 1994. It specifies the format of a text
+file containing directives that instruct the robots which URL paths to
+avoid. To be found by the robots, the specifications must be placed in
+@file{/robots.txt} in the server root, which the robots are expected to
+download and parse.
+
+Although Wget is not a web robot in the strictest sense of the word, it
+can download large parts of the site without the user's intervention to
+download an individual page. Because of that, Wget honors RES when
+downloading recursively. For instance, when you issue:
+
+@example
+wget -r http://www.example.com/
+@end example
+
+First the index of @samp{www.example.com} will be downloaded. If Wget
+finds that it wants to download more documents from that server, it will
+request @samp{http://www.example.com/robots.txt} and, if found, use it
+for further downloads. @file{robots.txt} is loaded only once per each
+server.
+
+Until version 1.8, Wget supported the first version of the standard,
+written by Martijn Koster in 1994 and available at
+@url{http://www.robotstxt.org/orig.html}. As of version 1.8,
+Wget has supported the additional directives specified in the internet
+draft @samp{<draft-koster-robots-00.txt>} titled ``A Method for Web
+Robots Control''. The draft, which has as far as I know never made to
+an @sc{rfc}, is available at
+@url{http://www.robotstxt.org/norobots-rfc.txt}.
+
+This manual no longer includes the text of the Robot Exclusion Standard.
+
+The second, less known mechanism, enables the author of an individual
+document to specify whether they want the links from the file to be
+followed by a robot. This is achieved using the @code{META} tag, like
+this:
+
+@example
+<meta name="robots" content="nofollow">
+@end example
+
+This is explained in some detail at
+@url{http://www.robotstxt.org/meta.html}. Wget supports this
+method of robot exclusion in addition to the usual @file{/robots.txt}
+exclusion.
+
+If you know what you are doing and really really wish to turn off the
+robot exclusion, set the @code{robots} variable to @samp{off} in your
+@file{.wgetrc}. You can achieve the same effect from the command line
+using the @code{-e} switch, e.g. @samp{wget -e robots=off @var{url}...}.
+
+@node Security Considerations, Contributors, Robot Exclusion, Appendices
+@section Security Considerations
+@cindex security
+
+When using Wget, you must be aware that it sends unencrypted passwords
+through the network, which may present a security problem. Here are the
+main issues, and some solutions.
+
+@enumerate
+@item
+The passwords on the command line are visible using @code{ps}. The best
+way around it is to use @code{wget -i -} and feed the @sc{url}s to
+Wget's standard input, each on a separate line, terminated by @kbd{C-d}.
+Another workaround is to use @file{.netrc} to store passwords; however,
+storing unencrypted passwords is also considered a security risk.
+
+@item
+Using the insecure @dfn{basic} authentication scheme, unencrypted
+passwords are transmitted through the network routers and gateways.
+
+@item
+The @sc{ftp} passwords are also in no way encrypted. There is no good
+solution for this at the moment.
+
+@item
+Although the ``normal'' output of Wget tries to hide the passwords,
+debugging logs show them, in all forms. This problem is avoided by
+being careful when you send debug logs (yes, even when you send them to
+me).
+@end enumerate
+
+@node Contributors, , Security Considerations, Appendices
+@section Contributors
+@cindex contributors
+
+GNU Wget was written by Hrvoje Nikšić @email{hniksic@@xemacs.org},
+
+However, the development of Wget could never have gone as far as it has, were
+it not for the help of many people, either with bug reports, feature proposals,
+patches, or letters saying ``Thanks!''.
+
+Special thanks goes to the following people (no particular order):
+
+@itemize @bullet
+@item Dan Harkless---contributed a lot of code and documentation of
+extremely high quality, as well as the @code{--page-requisites} and
+related options. He was the principal maintainer for some time and
+released Wget 1.6.
+
+@item Ian Abbott---contributed bug fixes, Windows-related fixes, and
+provided a prototype implementation of the breadth-first recursive
+download. Co-maintained Wget during the 1.8 release cycle.
+
+@item
+The dotsrc.org crew, in particular Karsten Thygesen---donated system
+resources such as the mailing list, web space, @sc{ftp} space, and
+version control repositories, along with a lot of time to make these
+actually work. Christian Reiniger was of invaluable help with setting
+up Subversion.
+
+@item
+Heiko Herold---provided high-quality Windows builds and contributed
+bug and build reports for many years.
+
+@item
+Shawn McHorse---bug reports and patches.
+
+@item
+Kaveh R. Ghazi---on-the-fly @code{ansi2knr}-ization. Lots of
+portability fixes.
+
+@item
+Gordon Matzigkeit---@file{.netrc} support.
+
+@item
+Zlatko Čalušić, Tomislav Vujec and Dražen
+KaÄar---feature suggestions and ``philosophical'' discussions.
+
+@item
+Darko Budor---initial port to Windows.
+
+@item
+Antonio Rosella---help and suggestions, plus the initial Italian
+translation.
+
+@item
+Tomislav Petrović, Mario MikoÄević---many bug reports and
+suggestions.
+
+@item
+Françis Pinard---many thorough bug reports and discussions.
+
+@item
+Karl Eichwalder---lots of help with internationalization, Makefile
+layout and many other things.
+
+@item
+Junio Hamano---donated support for Opie and @sc{http} @code{Digest}
+authentication.
+
+@item
+Mauro Tortonesi---improved IPv6 support, adding support for dual
+family systems. Refactored and enhanced FTP IPv6 code. Maintained GNU
+Wget from 2004--2007.
+
+@item
+Christopher G.@: Lewis---maintenance of the Windows version of GNU WGet.
+
+@item
+Gisle Vanem---many helpful patches and improvements, especially for
+Windows and MS-DOS support.
+
+@item
+Ralf Wildenhues---contributed patches to convert Wget to use Automake as
+part of its build process, and various bugfixes.
+
+@item
+Steven Schubiger---Many helpful patches, bugfixes and improvements.
+Notably, conversion of Wget to use the Gnulib quotes and quoteargs
+modules, and the addition of password prompts at the console, via the
+Gnulib getpasswd-gnu module.
+
+@item
+Ted Mielczarek---donated support for CSS.
+
+@item
+Saint Xavier---Support for IRIs (RFC 3987).
+
+@item
+Tim Rühsen---Loads of helpful patches, especially fuzzing support and
+Continuous Integration. Maintainer since 2014.
+
+@item
+Darshit Shah---Many helpful patches. Community support on various platforms.
+Maintainer since 2014.
+
+@item
+People who provided donations for development---including Brian Gough.
+@end itemize
+
+The following people have provided patches, bug/build reports, useful
+suggestions, beta testing services, fan mail and all the other things
+that make maintenance so much fun:
+
+Tim Adam,
+Adrian Aichner,
+Martin Baehr,
+Dieter Baron,
+Roger Beeman,
+Dan Berger,
+T.@: Bharath,
+Christian Biere,
+Paul Bludov,
+Daniel Bodea,
+Mark Boyns,
+John Burden,
+Julien Buty,
+Wanderlei Cavassin,
+Gilles Cedoc,
+Tim Charron,
+Noel Cragg,
+Kristijan Čonkaš,
+John Daily,
+Andreas Damm,
+Ahmon Dancy,
+Andrew Davison,
+Bertrand Demiddelaer,
+Alexander Dergachev,
+Andrew Deryabin,
+Ulrich Drepper,
+Marc Duponcheel,
+Damir Džeko,
+Alan Eldridge,
+Hans-Andreas Engel,
+Aleksandar Erkalović,
+Andy Eskilsson,
+João Ferreira,
+Christian Fraenkel,
+David Fritz,
+Mike Frysinger,
+Charles C.@: Fu,
+FUJISHIMA Satsuki,
+Masashi Fujita,
+Howard Gayle,
+Marcel Gerrits,
+Lemble Gregory,
+Hans Grobler,
+Alain Guibert,
+Mathieu Guillaume,
+Aaron Hawley,
+Jochen Hein,
+Karl Heuer,
+Madhusudan Hosaagrahara,
+HIROSE Masaaki,
+Ulf Harnhammar,
+Gregor Hoffleit,
+Erik Magnus Hulthen,
+Richard Huveneers,
+Jonas Jensen,
+Larry Jones,
+Simon Josefsson,
+Mario Jurić,
+Hack Kampbjørn,
+Const Kaplinsky,
+Goran Kezunović,
+Igor Khristophorov,
+Robert Kleine,
+KOJIMA Haime,
+Fila Kolodny,
+Alexander Kourakos,
+Martin Kraemer,
+Sami Krank,
+Jay Krell,
+Σίμος Ξενιτέλλης (Simos KSenitellis),
+Christian Lackas,
+Hrvoje Lacko,
+Daniel S.@: Lewart,
+Nicolás Lichtmeier,
+Dave Love,
+Alexander V.@: Lukyanov,
+Thomas Lußnig,
+Andre Majorel,
+Aurelien Marchand,
+Matthew J.@: Mellon,
+Jordan Mendelson,
+Ted Mielczarek,
+Robert Millan,
+Lin Zhe Min,
+Jan Minar,
+Tim Mooney,
+Keith Moore,
+Adam D.@: Moss,
+Simon Munton,
+Charlie Negyesi,
+R.@: K.@: Owen,
+Jim Paris,
+Kenny Parnell,
+Leonid Petrov,
+Simone Piunno,
+Andrew Pollock,
+Steve Pothier,
+Jan Přikryl,
+Marin Purgar,
+Csaba Ráduly,
+Keith Refson,
+Bill Richardson,
+Tyler Riddle,
+Tobias Ringstrom,
+Jochen Roderburg,
+Juan José Rodríguez,
+Maciej W.@: Rozycki,
+Edward J.@: Sabol,
+Heinz Salzmann,
+Robert Schmidt,
+Nicolas Schodet,
+Benno Schulenberg,
+Andreas Schwab,
+Steven M.@: Schweda,
+Chris Seawood,
+Pranab Shenoy,
+Dennis Smit,
+Toomas Soome,
+Tage Stabell-Kulo,
+Philip Stadermann,
+Daniel Stenberg,
+Sven Sternberger,
+Markus Strasser,
+John Summerfield,
+Szakacsits Szabolcs,
+Mike Thomas,
+Philipp Thomas,
+Mauro Tortonesi,
+Dave Turner,
+Gisle Vanem,
+Rabin Vincent,
+Russell Vincent,
+Željko Vrba,
+Charles G Waldman,
+Douglas E.@: Wegscheid,
+Ralf Wildenhues,
+Joshua David Williams,
+Benjamin Wolsey,
+Saint Xavier,
+YAMAZAKI Makoto,
+Jasmin Zainul,
+Bojan Ždrnja,
+Kristijan Zimmer,
+Xin Zou.
+
+Apologies to all who I accidentally left out, and many thanks to all the
+subscribers of the Wget mailing list.
+
+@node Copying this manual, Concept Index, Appendices, Top
+@appendix Copying this manual
+
+@menu
+* GNU Free Documentation License:: License for copying this manual.
+@end menu
+
+@node GNU Free Documentation License, , Copying this manual, Copying this manual
+@appendixsec GNU Free Documentation License
+@cindex FDL, GNU Free Documentation License
+
+@include fdl.texi
+
+
+@node Concept Index, , Copying this manual, Top
+@unnumbered Concept Index
+@printindex cp
+
+@contents
+
+@bye
diff --git a/fuzz/Makefile.am b/fuzz/Makefile.am
new file mode 100644
index 0000000..cf5da3b
--- /dev/null
+++ b/fuzz/Makefile.am
@@ -0,0 +1,103 @@
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+AM_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir) -I$(top_builddir)/lib -I$(top_srcdir)/lib \
+ $(CODE_COVERAGE_CPPFLAGS) \
+ -DSRCDIR=\"$(abs_srcdir)\"
+LDADD = ../lib/libgnu.a \
+ $(GETADDRINFO_LIB) $(HOSTENT_LIB) $(INET_NTOP_LIB) $(INET_PTON_LIB) \
+ $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO) $(LIB_GETLOGIN) $(LIB_NANOSLEEP) $(LIB_POLL) \
+ $(LIB_POSIX_SPAWN) $(LIB_PTHREAD_SIGMASK) $(LIB_SELECT) $(LIBICONV) $(LIBINTL) \
+ $(LIBMULTITHREAD) $(LIBTHREAD) $(SERVENT_LIB) @INTL_MACOSX_LIBS@ \
+ $(FUZZ_LIBS) $(CODE_COVERAGE_LIBS)
+
+WGET_TESTS = \
+ wget_cookie_fuzzer$(EXEEXT) \
+ wget_css_fuzzer$(EXEEXT) \
+ wget_ftpls_fuzzer$(EXEEXT) \
+ wget_html_fuzzer$(EXEEXT) \
+ wget_netrc_fuzzer$(EXEEXT) \
+ wget_options_fuzzer$(EXEEXT) \
+ wget_progress_fuzzer$(EXEEXT) \
+ wget_read_hunk_fuzzer$(EXEEXT) \
+ wget_robots_fuzzer$(EXEEXT) \
+ wget_url_fuzzer$(EXEEXT)
+
+if WITH_NTLM
+ WGET_TESTS += wget_ntlm_fuzzer$(EXEEXT)
+endif
+
+if FUZZING
+ bin_PROGRAMS = $(WGET_TESTS)
+ LDADD += $(LIB_FUZZING_ENGINE)
+ MAIN = fuzzer.h
+# AM_LDFLAGS = -no-install -all-static
+else
+ AM_CPPFLAGS += -DTEST_RUN
+ AM_TESTS_ENVIRONMENT = export VALGRIND_TESTS"=@VALGRIND_TESTS@";
+ TESTS = $(WGET_TESTS)
+ check_PROGRAMS = $(WGET_TESTS)
+ MAIN = main.c fuzzer.h
+endif
+
+# Make libunittest "PHONY" so we're always sure we're up-to-date.
+.PHONY: ../src/libunittest.a
+../src/libunittest.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C ../src libunittest.a
+
+wget_cookie_fuzzer_SOURCES = wget_cookie_fuzzer.c $(MAIN)
+wget_cookie_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_css_fuzzer_SOURCES = wget_css_fuzzer.c $(MAIN)
+wget_css_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_ftpls_fuzzer_SOURCES = wget_ftpls_fuzzer.c $(MAIN)
+wget_ftpls_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_html_fuzzer_SOURCES = wget_html_fuzzer.c $(MAIN)
+wget_html_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_netrc_fuzzer_SOURCES = wget_netrc_fuzzer.c $(MAIN)
+wget_netrc_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_ntlm_fuzzer_SOURCES = wget_ntlm_fuzzer.c $(MAIN)
+wget_ntlm_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_options_fuzzer_SOURCES = wget_options_fuzzer.c $(MAIN)
+wget_options_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_progress_fuzzer_SOURCES = wget_progress_fuzzer.c $(MAIN)
+wget_progress_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_read_hunk_fuzzer_SOURCES = wget_read_hunk_fuzzer.c $(MAIN)
+wget_read_hunk_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_robots_fuzzer_SOURCES = wget_robots_fuzzer.c $(MAIN)
+wget_robots_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+wget_url_fuzzer_SOURCES = wget_url_fuzzer.c $(MAIN)
+wget_url_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+
+#EXTRA_DIST = $(wildcard *.options) $(wildcard *.dict) \
+# $(wildcard *.in) $(wildcard *.repro)
+
+dist-hook:
+ find $(srcdir) -name '*.options' -exec cp -v '{}' $(distdir) ';'
+ find $(srcdir) -name '*.dict' -exec cp -v '{}' $(distdir) ';'
+# find $(srcdir) -name '*.in' -exec cp -vr '{}' $(distdir) ';'
+ find $(srcdir) -name '*.repro' -exec cp -vr '{}' $(distdir) ';'
+
+clean-local:
+ rm -rf *.gc?? *.log lcov
+
+oss-fuzz:
+ if test "$$OUT" != ""; then \
+ XLIBS="-lpsl -lgnutls -lhogweed -lnettle -lidn2 -lunistring"; \
+ for ccfile in wget*_fuzzer.c; do \
+ fuzzer=$$(basename $$ccfile .c); \
+ $$CXX $$CXXFLAGS -I$(top_srcdir)/src -I$(top_srcdir) -I$(top_srcdir)/lib \
+ "$${fuzzer}.c" -o "$${fuzzer}" \
+ ../src/libunittest.a ../lib/libgnu.a $${LIB_FUZZING_ENGINE} \
+ -Wl,-Bstatic $${XLIBS} -Wl,-Bdynamic; \
+ done; \
+ fi
+
+.PHONY: oss-fuzz
diff --git a/fuzz/Makefile.in b/fuzz/Makefile.in
new file mode 100644
index 0000000..d66bbfa
--- /dev/null
+++ b/fuzz/Makefile.in
@@ -0,0 +1,2583 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_NTLM_TRUE@am__append_1 = wget_ntlm_fuzzer$(EXEEXT)
+@FUZZING_TRUE@am__append_2 = $(LIB_FUZZING_ENGINE)
+# AM_LDFLAGS = -no-install -all-static
+@FUZZING_FALSE@am__append_3 = -DTEST_RUN
+subdir = fuzz
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__wget_cookie_fuzzer_SOURCES_DIST = wget_cookie_fuzzer.c main.c \
+ fuzzer.h
+@FUZZING_FALSE@am__objects_1 = main.$(OBJEXT)
+am_wget_cookie_fuzzer_OBJECTS = wget_cookie_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_cookie_fuzzer_OBJECTS = $(am_wget_cookie_fuzzer_OBJECTS)
+am__DEPENDENCIES_1 =
+@FUZZING_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+am__DEPENDENCIES_3 = ../lib/libgnu.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_2)
+wget_cookie_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_css_fuzzer_SOURCES_DIST = wget_css_fuzzer.c main.c fuzzer.h
+am_wget_css_fuzzer_OBJECTS = wget_css_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_css_fuzzer_OBJECTS = $(am_wget_css_fuzzer_OBJECTS)
+wget_css_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_ftpls_fuzzer_SOURCES_DIST = wget_ftpls_fuzzer.c main.c \
+ fuzzer.h
+am_wget_ftpls_fuzzer_OBJECTS = wget_ftpls_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_ftpls_fuzzer_OBJECTS = $(am_wget_ftpls_fuzzer_OBJECTS)
+wget_ftpls_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_html_fuzzer_SOURCES_DIST = wget_html_fuzzer.c main.c fuzzer.h
+am_wget_html_fuzzer_OBJECTS = wget_html_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_html_fuzzer_OBJECTS = $(am_wget_html_fuzzer_OBJECTS)
+wget_html_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_netrc_fuzzer_SOURCES_DIST = wget_netrc_fuzzer.c main.c \
+ fuzzer.h
+am_wget_netrc_fuzzer_OBJECTS = wget_netrc_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_netrc_fuzzer_OBJECTS = $(am_wget_netrc_fuzzer_OBJECTS)
+wget_netrc_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_ntlm_fuzzer_SOURCES_DIST = wget_ntlm_fuzzer.c main.c fuzzer.h
+am_wget_ntlm_fuzzer_OBJECTS = wget_ntlm_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_ntlm_fuzzer_OBJECTS = $(am_wget_ntlm_fuzzer_OBJECTS)
+wget_ntlm_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_options_fuzzer_SOURCES_DIST = wget_options_fuzzer.c main.c \
+ fuzzer.h
+am_wget_options_fuzzer_OBJECTS = wget_options_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_options_fuzzer_OBJECTS = $(am_wget_options_fuzzer_OBJECTS)
+wget_options_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_progress_fuzzer_SOURCES_DIST = wget_progress_fuzzer.c main.c \
+ fuzzer.h
+am_wget_progress_fuzzer_OBJECTS = wget_progress_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_progress_fuzzer_OBJECTS = $(am_wget_progress_fuzzer_OBJECTS)
+wget_progress_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_read_hunk_fuzzer_SOURCES_DIST = wget_read_hunk_fuzzer.c \
+ main.c fuzzer.h
+am_wget_read_hunk_fuzzer_OBJECTS = wget_read_hunk_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_read_hunk_fuzzer_OBJECTS = $(am_wget_read_hunk_fuzzer_OBJECTS)
+wget_read_hunk_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_robots_fuzzer_SOURCES_DIST = wget_robots_fuzzer.c main.c \
+ fuzzer.h
+am_wget_robots_fuzzer_OBJECTS = wget_robots_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_robots_fuzzer_OBJECTS = $(am_wget_robots_fuzzer_OBJECTS)
+wget_robots_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+am__wget_url_fuzzer_SOURCES_DIST = wget_url_fuzzer.c main.c fuzzer.h
+am_wget_url_fuzzer_OBJECTS = wget_url_fuzzer.$(OBJEXT) \
+ $(am__objects_1)
+wget_url_fuzzer_OBJECTS = $(am_wget_url_fuzzer_OBJECTS)
+wget_url_fuzzer_DEPENDENCIES = ../src/libunittest.a \
+ $(am__DEPENDENCIES_3)
+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)/src
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/main.Po \
+ ./$(DEPDIR)/wget_cookie_fuzzer.Po \
+ ./$(DEPDIR)/wget_css_fuzzer.Po \
+ ./$(DEPDIR)/wget_ftpls_fuzzer.Po \
+ ./$(DEPDIR)/wget_html_fuzzer.Po \
+ ./$(DEPDIR)/wget_netrc_fuzzer.Po \
+ ./$(DEPDIR)/wget_ntlm_fuzzer.Po \
+ ./$(DEPDIR)/wget_options_fuzzer.Po \
+ ./$(DEPDIR)/wget_progress_fuzzer.Po \
+ ./$(DEPDIR)/wget_read_hunk_fuzzer.Po \
+ ./$(DEPDIR)/wget_robots_fuzzer.Po \
+ ./$(DEPDIR)/wget_url_fuzzer.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(wget_cookie_fuzzer_SOURCES) $(wget_css_fuzzer_SOURCES) \
+ $(wget_ftpls_fuzzer_SOURCES) $(wget_html_fuzzer_SOURCES) \
+ $(wget_netrc_fuzzer_SOURCES) $(wget_ntlm_fuzzer_SOURCES) \
+ $(wget_options_fuzzer_SOURCES) $(wget_progress_fuzzer_SOURCES) \
+ $(wget_read_hunk_fuzzer_SOURCES) $(wget_robots_fuzzer_SOURCES) \
+ $(wget_url_fuzzer_SOURCES)
+DIST_SOURCES = $(am__wget_cookie_fuzzer_SOURCES_DIST) \
+ $(am__wget_css_fuzzer_SOURCES_DIST) \
+ $(am__wget_ftpls_fuzzer_SOURCES_DIST) \
+ $(am__wget_html_fuzzer_SOURCES_DIST) \
+ $(am__wget_netrc_fuzzer_SOURCES_DIST) \
+ $(am__wget_ntlm_fuzzer_SOURCES_DIST) \
+ $(am__wget_options_fuzzer_SOURCES_DIST) \
+ $(am__wget_progress_fuzzer_SOURCES_DIST) \
+ $(am__wget_read_hunk_fuzzer_SOURCES_DIST) \
+ $(am__wget_robots_fuzzer_SOURCES_DIST) \
+ $(am__wget_url_fuzzer_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+AM_CPPFLAGS = -I$(top_srcdir)/src -I$(srcdir) -I$(top_builddir)/lib \
+ -I$(top_srcdir)/lib $(CODE_COVERAGE_CPPFLAGS) \
+ -DSRCDIR=\"$(abs_srcdir)\" $(am__append_3)
+LDADD = ../lib/libgnu.a $(GETADDRINFO_LIB) $(HOSTENT_LIB) \
+ $(INET_NTOP_LIB) $(INET_PTON_LIB) $(LIBSOCKET) \
+ $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO) $(LIB_GETLOGIN) \
+ $(LIB_NANOSLEEP) $(LIB_POLL) $(LIB_POSIX_SPAWN) \
+ $(LIB_PTHREAD_SIGMASK) $(LIB_SELECT) $(LIBICONV) $(LIBINTL) \
+ $(LIBMULTITHREAD) $(LIBTHREAD) $(SERVENT_LIB) \
+ @INTL_MACOSX_LIBS@ $(FUZZ_LIBS) $(CODE_COVERAGE_LIBS) \
+ $(am__append_2)
+WGET_TESTS = wget_cookie_fuzzer$(EXEEXT) wget_css_fuzzer$(EXEEXT) \
+ wget_ftpls_fuzzer$(EXEEXT) wget_html_fuzzer$(EXEEXT) \
+ wget_netrc_fuzzer$(EXEEXT) wget_options_fuzzer$(EXEEXT) \
+ wget_progress_fuzzer$(EXEEXT) wget_read_hunk_fuzzer$(EXEEXT) \
+ wget_robots_fuzzer$(EXEEXT) wget_url_fuzzer$(EXEEXT) \
+ $(am__append_1)
+@FUZZING_TRUE@bin_PROGRAMS = $(WGET_TESTS)
+@FUZZING_FALSE@MAIN = main.c fuzzer.h
+@FUZZING_TRUE@MAIN = fuzzer.h
+@FUZZING_FALSE@AM_TESTS_ENVIRONMENT = export VALGRIND_TESTS"=@VALGRIND_TESTS@";
+@FUZZING_FALSE@TESTS = $(WGET_TESTS)
+@FUZZING_FALSE@check_PROGRAMS = $(WGET_TESTS)
+wget_cookie_fuzzer_SOURCES = wget_cookie_fuzzer.c $(MAIN)
+wget_cookie_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_css_fuzzer_SOURCES = wget_css_fuzzer.c $(MAIN)
+wget_css_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_ftpls_fuzzer_SOURCES = wget_ftpls_fuzzer.c $(MAIN)
+wget_ftpls_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_html_fuzzer_SOURCES = wget_html_fuzzer.c $(MAIN)
+wget_html_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_netrc_fuzzer_SOURCES = wget_netrc_fuzzer.c $(MAIN)
+wget_netrc_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_ntlm_fuzzer_SOURCES = wget_ntlm_fuzzer.c $(MAIN)
+wget_ntlm_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_options_fuzzer_SOURCES = wget_options_fuzzer.c $(MAIN)
+wget_options_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_progress_fuzzer_SOURCES = wget_progress_fuzzer.c $(MAIN)
+wget_progress_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_read_hunk_fuzzer_SOURCES = wget_read_hunk_fuzzer.c $(MAIN)
+wget_read_hunk_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_robots_fuzzer_SOURCES = wget_robots_fuzzer.c $(MAIN)
+wget_robots_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+wget_url_fuzzer_SOURCES = wget_url_fuzzer.c $(MAIN)
+wget_url_fuzzer_LDADD = ../src/libunittest.a $(LDADD)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu fuzz/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu fuzz/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+
+wget_cookie_fuzzer$(EXEEXT): $(wget_cookie_fuzzer_OBJECTS) $(wget_cookie_fuzzer_DEPENDENCIES) $(EXTRA_wget_cookie_fuzzer_DEPENDENCIES)
+ @rm -f wget_cookie_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_cookie_fuzzer_OBJECTS) $(wget_cookie_fuzzer_LDADD) $(LIBS)
+
+wget_css_fuzzer$(EXEEXT): $(wget_css_fuzzer_OBJECTS) $(wget_css_fuzzer_DEPENDENCIES) $(EXTRA_wget_css_fuzzer_DEPENDENCIES)
+ @rm -f wget_css_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_css_fuzzer_OBJECTS) $(wget_css_fuzzer_LDADD) $(LIBS)
+
+wget_ftpls_fuzzer$(EXEEXT): $(wget_ftpls_fuzzer_OBJECTS) $(wget_ftpls_fuzzer_DEPENDENCIES) $(EXTRA_wget_ftpls_fuzzer_DEPENDENCIES)
+ @rm -f wget_ftpls_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_ftpls_fuzzer_OBJECTS) $(wget_ftpls_fuzzer_LDADD) $(LIBS)
+
+wget_html_fuzzer$(EXEEXT): $(wget_html_fuzzer_OBJECTS) $(wget_html_fuzzer_DEPENDENCIES) $(EXTRA_wget_html_fuzzer_DEPENDENCIES)
+ @rm -f wget_html_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_html_fuzzer_OBJECTS) $(wget_html_fuzzer_LDADD) $(LIBS)
+
+wget_netrc_fuzzer$(EXEEXT): $(wget_netrc_fuzzer_OBJECTS) $(wget_netrc_fuzzer_DEPENDENCIES) $(EXTRA_wget_netrc_fuzzer_DEPENDENCIES)
+ @rm -f wget_netrc_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_netrc_fuzzer_OBJECTS) $(wget_netrc_fuzzer_LDADD) $(LIBS)
+
+wget_ntlm_fuzzer$(EXEEXT): $(wget_ntlm_fuzzer_OBJECTS) $(wget_ntlm_fuzzer_DEPENDENCIES) $(EXTRA_wget_ntlm_fuzzer_DEPENDENCIES)
+ @rm -f wget_ntlm_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_ntlm_fuzzer_OBJECTS) $(wget_ntlm_fuzzer_LDADD) $(LIBS)
+
+wget_options_fuzzer$(EXEEXT): $(wget_options_fuzzer_OBJECTS) $(wget_options_fuzzer_DEPENDENCIES) $(EXTRA_wget_options_fuzzer_DEPENDENCIES)
+ @rm -f wget_options_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_options_fuzzer_OBJECTS) $(wget_options_fuzzer_LDADD) $(LIBS)
+
+wget_progress_fuzzer$(EXEEXT): $(wget_progress_fuzzer_OBJECTS) $(wget_progress_fuzzer_DEPENDENCIES) $(EXTRA_wget_progress_fuzzer_DEPENDENCIES)
+ @rm -f wget_progress_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_progress_fuzzer_OBJECTS) $(wget_progress_fuzzer_LDADD) $(LIBS)
+
+wget_read_hunk_fuzzer$(EXEEXT): $(wget_read_hunk_fuzzer_OBJECTS) $(wget_read_hunk_fuzzer_DEPENDENCIES) $(EXTRA_wget_read_hunk_fuzzer_DEPENDENCIES)
+ @rm -f wget_read_hunk_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_read_hunk_fuzzer_OBJECTS) $(wget_read_hunk_fuzzer_LDADD) $(LIBS)
+
+wget_robots_fuzzer$(EXEEXT): $(wget_robots_fuzzer_OBJECTS) $(wget_robots_fuzzer_DEPENDENCIES) $(EXTRA_wget_robots_fuzzer_DEPENDENCIES)
+ @rm -f wget_robots_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_robots_fuzzer_OBJECTS) $(wget_robots_fuzzer_LDADD) $(LIBS)
+
+wget_url_fuzzer$(EXEEXT): $(wget_url_fuzzer_OBJECTS) $(wget_url_fuzzer_DEPENDENCIES) $(EXTRA_wget_url_fuzzer_DEPENDENCIES)
+ @rm -f wget_url_fuzzer$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_url_fuzzer_OBJECTS) $(wget_url_fuzzer_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_cookie_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_css_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_ftpls_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_html_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_netrc_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_ntlm_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_options_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_progress_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_read_hunk_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_robots_fuzzer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wget_url_fuzzer.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+wget_cookie_fuzzer.log: wget_cookie_fuzzer$(EXEEXT)
+ @p='wget_cookie_fuzzer$(EXEEXT)'; \
+ b='wget_cookie_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_css_fuzzer.log: wget_css_fuzzer$(EXEEXT)
+ @p='wget_css_fuzzer$(EXEEXT)'; \
+ b='wget_css_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_ftpls_fuzzer.log: wget_ftpls_fuzzer$(EXEEXT)
+ @p='wget_ftpls_fuzzer$(EXEEXT)'; \
+ b='wget_ftpls_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_html_fuzzer.log: wget_html_fuzzer$(EXEEXT)
+ @p='wget_html_fuzzer$(EXEEXT)'; \
+ b='wget_html_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_netrc_fuzzer.log: wget_netrc_fuzzer$(EXEEXT)
+ @p='wget_netrc_fuzzer$(EXEEXT)'; \
+ b='wget_netrc_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_options_fuzzer.log: wget_options_fuzzer$(EXEEXT)
+ @p='wget_options_fuzzer$(EXEEXT)'; \
+ b='wget_options_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_progress_fuzzer.log: wget_progress_fuzzer$(EXEEXT)
+ @p='wget_progress_fuzzer$(EXEEXT)'; \
+ b='wget_progress_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_read_hunk_fuzzer.log: wget_read_hunk_fuzzer$(EXEEXT)
+ @p='wget_read_hunk_fuzzer$(EXEEXT)'; \
+ b='wget_read_hunk_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_robots_fuzzer.log: wget_robots_fuzzer$(EXEEXT)
+ @p='wget_robots_fuzzer$(EXEEXT)'; \
+ b='wget_robots_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_url_fuzzer.log: wget_url_fuzzer$(EXEEXT)
+ @p='wget_url_fuzzer$(EXEEXT)'; \
+ b='wget_url_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+wget_ntlm_fuzzer.log: wget_ntlm_fuzzer$(EXEEXT)
+ @p='wget_ntlm_fuzzer$(EXEEXT)'; \
+ b='wget_ntlm_fuzzer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(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-hook
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; 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:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-local mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/wget_cookie_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_css_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_ftpls_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_html_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_netrc_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_ntlm_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_options_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_progress_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_read_hunk_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_robots_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_url_fuzzer.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/wget_cookie_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_css_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_ftpls_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_html_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_netrc_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_ntlm_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_options_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_progress_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_read_hunk_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_robots_fuzzer.Po
+ -rm -f ./$(DEPDIR)/wget_url_fuzzer.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am clean clean-binPROGRAMS clean-checkPROGRAMS \
+ clean-generic clean-local cscopelist-am ctags ctags-am \
+ dist-hook distclean distclean-compile distclean-generic \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-binPROGRAMS 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-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \
+ uninstall uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# Make libunittest "PHONY" so we're always sure we're up-to-date.
+.PHONY: ../src/libunittest.a
+../src/libunittest.a:
+ $(MAKE) $(AM_MAKEFLAGS) -C ../src libunittest.a
+
+#EXTRA_DIST = $(wildcard *.options) $(wildcard *.dict) \
+# $(wildcard *.in) $(wildcard *.repro)
+
+dist-hook:
+ find $(srcdir) -name '*.options' -exec cp -v '{}' $(distdir) ';'
+ find $(srcdir) -name '*.dict' -exec cp -v '{}' $(distdir) ';'
+# find $(srcdir) -name '*.in' -exec cp -vr '{}' $(distdir) ';'
+ find $(srcdir) -name '*.repro' -exec cp -vr '{}' $(distdir) ';'
+
+clean-local:
+ rm -rf *.gc?? *.log lcov
+
+oss-fuzz:
+ if test "$$OUT" != ""; then \
+ XLIBS="-lpsl -lgnutls -lhogweed -lnettle -lidn2 -lunistring"; \
+ for ccfile in wget*_fuzzer.c; do \
+ fuzzer=$$(basename $$ccfile .c); \
+ $$CXX $$CXXFLAGS -I$(top_srcdir)/src -I$(top_srcdir) -I$(top_srcdir)/lib \
+ "$${fuzzer}.c" -o "$${fuzzer}" \
+ ../src/libunittest.a ../lib/libgnu.a $${LIB_FUZZING_ENGINE} \
+ -Wl,-Bstatic $${XLIBS} -Wl,-Bdynamic; \
+ done; \
+ fi
+
+.PHONY: oss-fuzz
+
+# 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/fuzz/fuzzer.h b/fuzz/fuzzer.h
new file mode 100644
index 0000000..fec4478
--- /dev/null
+++ b/fuzz/fuzzer.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <stddef.h> // size_t
+#include <stdint.h> // uint8_t
+
+#define CLOSE_STDERR \
+ int bak = dup(STDERR_FILENO); \
+ int fd = open("/dev/null", O_WRONLY); \
+ dup2(fd, STDERR_FILENO); \
+ close(fd);
+
+#define RESTORE_STDERR \
+ dup2(bak, STDERR_FILENO); \
+ close(bak);
+
+#ifdef __cplusplus
+extern "C"
+#endif
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
diff --git a/fuzz/main.c b/fuzz/main.c
new file mode 100644
index 0000000..53e3a6d
--- /dev/null
+++ b/fuzz/main.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <fcntl.h>
+
+#include "fuzzer.h"
+#include "utils.h"
+
+#ifdef TEST_RUN
+
+#include <dirent.h>
+
+#ifdef _WIN32
+# define SLASH '\\'
+#else
+# define SLASH '/'
+#endif
+
+static int test_all_from(const char *dirname)
+{
+ DIR *dirp;
+
+ if ((dirp = opendir(dirname))) {
+ struct dirent *dp;
+
+ while ((dp = readdir(dirp))) {
+ if (*dp->d_name == '.') continue;
+
+ char fname[strlen(dirname) + strlen(dp->d_name) + 2];
+ snprintf(fname, sizeof(fname), "%s/%s", dirname, dp->d_name);
+
+ struct file_memory *fmem;
+ if ((fmem = wget_read_file(fname))) {
+ printf("testing %ld bytes from '%s'\n", fmem->length, fname);
+ fflush(stdout);
+ LLVMFuzzerTestOneInput((uint8_t *)fmem->content, fmem->length);
+ wget_read_file_free(fmem);
+ }
+ }
+ closedir(dirp);
+ return 0;
+ }
+
+ return 1;
+}
+
+int main(int argc, char **argv)
+{
+ // if VALGRIND testing is enabled, we have to call ourselves with valgrind checking
+ const char *valgrind = getenv("VALGRIND_TESTS");
+ const char *target;
+ size_t target_len;
+
+ if (!valgrind || !*valgrind || !strcmp(valgrind, "0")) {
+ // fallthrough
+ }
+ else if (!strcmp(valgrind, "1")) {
+ char cmd[strlen(argv[0]) + 256];
+
+ snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS=\"\" valgrind --error-exitcode=301 --leak-check=yes --show-reachable=yes --track-origins=yes %s", argv[0]);
+ return system(cmd) != 0;
+ } else {
+ char cmd[strlen(valgrind) + strlen(argv[0]) + 32];
+
+ snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS="" %s %s", valgrind, argv[0]);
+ return system(cmd) != 0;
+ }
+
+ if ((target = strrchr(argv[0], SLASH))) {
+ if (strrchr(target, '/'))
+ target = strrchr(target, '/');
+ } else
+ target = strrchr(argv[0], '/');
+
+ target = target ? target + 1 : argv[0];
+
+ if (strncmp(target, "lt-", 3) == 0)
+ target += 3;
+
+ target_len = strlen(target);
+
+#ifdef _WIN32
+ target_len -= 4; // ignore .exe
+#endif
+
+ {
+ int rc;
+ char corporadir[sizeof(SRCDIR) + 1 + target_len + 8];
+ snprintf(corporadir, sizeof(corporadir), SRCDIR "/%.*s.in", (int) target_len, target);
+
+ rc = test_all_from(corporadir);
+ if (rc)
+ fprintf(stderr, "Failed to find %s\n", corporadir);
+
+ snprintf(corporadir, sizeof(corporadir), SRCDIR "/%.*s.repro", (int) target_len, target);
+ if (test_all_from(corporadir) && rc)
+ return 77; // SKIP
+ }
+
+ return 0;
+}
+
+#else
+
+#ifndef __AFL_LOOP
+static int __AFL_LOOP(int n)
+{
+ static int first = 1;
+
+ if (first) {
+ first = 0;
+ return n && --n > 0;
+ }
+
+ return 0;
+}
+#endif
+
+int main(int argc, char **argv)
+{
+ int ret;
+ unsigned char buf[64 * 1024];
+
+ while (__AFL_LOOP(10000)) { // only works with clang - we have to use 1 because static/global vars in wget
+ ret = fread(buf, 1, sizeof(buf), stdin);
+ if (ret < 0)
+ return 0;
+
+ LLVMFuzzerTestOneInput(buf, ret);
+ }
+
+ return 0;
+}
+
+#endif /* #ifdef TEST_RUN */
diff --git a/fuzz/wget_cookie_fuzzer.c b/fuzz/wget_cookie_fuzzer.c
new file mode 100644
index 0000000..1af989e
--- /dev/null
+++ b/fuzz/wget_cookie_fuzzer.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "cookies.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct cookie_jar *cookie_jar;
+ char *set_cookie;
+
+ if (size > 1024) // same as max_len = ... in .options file
+ return 0;
+
+ set_cookie = (char *) malloc(size + 1);
+ memcpy(set_cookie, data, size);
+ set_cookie[size] = 0;
+
+ CLOSE_STDERR
+
+ cookie_jar = cookie_jar_new();
+ cookie_handle_set_cookie(cookie_jar, "x", 81, "p", set_cookie);
+ cookie_handle_set_cookie(cookie_jar, "x", 81, "p", set_cookie);
+ cookie_handle_set_cookie(cookie_jar, "x", 80, "p/d/", set_cookie);
+ cookie_jar_delete(cookie_jar);
+
+ RESTORE_STDERR
+
+ free(set_cookie);
+
+ return 0;
+}
diff --git a/fuzz/wget_cookie_fuzzer.dict b/fuzz/wget_cookie_fuzzer.dict
new file mode 100644
index 0000000..1b2c568
--- /dev/null
+++ b/fuzz/wget_cookie_fuzzer.dict
@@ -0,0 +1,6 @@
+tag1="expires="
+tag2="path="
+tag3="domain="
+tag4="httponly"
+tag5="secure"
+tag6="max-age"
diff --git a/fuzz/wget_css_fuzzer.c b/fuzz/wget_css_fuzzer.c
new file mode 100644
index 0000000..5dc197a
--- /dev/null
+++ b/fuzz/wget_css_fuzzer.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "html-url.h"
+ #include "css-url.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+static const uint8_t *g_data;
+static size_t g_size;
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+#ifdef HAVE_FMEMOPEN
+ return fmemopen((void *) g_data, g_size, mode);
+#else
+ return NULL;
+#endif
+}
+
+static int do_jump;
+static jmp_buf jmpbuf;
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ longjmp(jmpbuf, 1);
+}
+#elif defined HAVE_DLFCN_H
+#include <dlfcn.h> // dlsym
+#ifndef RTLD_NEXT
+#define RTLD_NEXT RTLD_GLOBAL
+#endif
+void exit(int status)
+{
+ if (do_jump) {
+ longjmp(jmpbuf, 1);
+ } else {
+ void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
+ libc_exit(status);
+ }
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ struct map_context ctx = {
+ .text = (char *) data,
+ .parent_base = strdup("https://x.y"),
+ .document_file = NULL,
+ };
+
+ CLOSE_STDERR
+
+ do_jump = 1;
+
+ if (setjmp(jmpbuf))
+ goto done;
+
+ get_urls_css(&ctx, 0, size);
+ free_urlpos(ctx.head);
+ free((void *) ctx.parent_base);
+
+done:
+ do_jump = 0;
+
+ RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_css_fuzzer.repro/buffer-overflow-6600180399865856 b/fuzz/wget_css_fuzzer.repro/buffer-overflow-6600180399865856
new file mode 100644
index 0000000..c279a76
--- /dev/null
+++ b/fuzz/wget_css_fuzzer.repro/buffer-overflow-6600180399865856
@@ -0,0 +1 @@
+#/*url( */ url() \ No newline at end of file
diff --git a/fuzz/wget_css_fuzzer.repro/negative-size-param-5724866467594240 b/fuzz/wget_css_fuzzer.repro/negative-size-param-5724866467594240
new file mode 100644
index 0000000..db585a9
--- /dev/null
+++ b/fuzz/wget_css_fuzzer.repro/negative-size-param-5724866467594240
@@ -0,0 +1 @@
+@import \ No newline at end of file
diff --git a/fuzz/wget_css_fuzzer.repro/slowness-6275836549267456 b/fuzz/wget_css_fuzzer.repro/slowness-6275836549267456
new file mode 100644
index 0000000..8a26340
--- /dev/null
+++ b/fuzz/wget_css_fuzzer.repro/slowness-6275836549267456
Binary files differ
diff --git a/fuzz/wget_ftpls_fuzzer.c b/fuzz/wget_ftpls_fuzzer.c
new file mode 100644
index 0000000..49307c4
--- /dev/null
+++ b/fuzz/wget_ftpls_fuzzer.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "ftp.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+static int do_jump;
+static jmp_buf jmpbuf;
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ longjmp(jmpbuf, 1);
+}
+#elif defined HAVE_DLFCN_H
+#include <dlfcn.h> // dlsym
+#ifndef RTLD_NEXT
+#define RTLD_NEXT RTLD_GLOBAL
+#endif
+void exit(int status)
+{
+ if (do_jump) {
+ longjmp(jmpbuf, 1);
+ } else {
+ void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
+ libc_exit(status);
+ }
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+#ifdef HAVE_FMEMOPEN
+ FILE *fp;
+ struct fileinfo *fi;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ fp = fmemopen((void *) data, size, "r");
+ if (!fp) return 0;
+
+ CLOSE_STDERR
+
+ do_jump = 1;
+
+ if (setjmp(jmpbuf))
+ goto done;
+
+ fi = ftp_parse_ls_fp(fp, ST_UNIX);
+ freefileinfo(fi);
+ rewind(fp);
+
+ fi = ftp_parse_ls_fp(fp, ST_VMS);
+ freefileinfo(fi);
+ rewind(fp);
+
+ fi = ftp_parse_ls_fp(fp, ST_WINNT);
+ freefileinfo(fi);
+ rewind(fp);
+
+ fi = ftp_parse_ls_fp(fp, ST_MACOS);
+
+done:
+ freefileinfo(fi);
+ fclose(fp);
+
+ do_jump = 0;
+
+ RESTORE_STDERR
+#endif
+ return 0;
+}
diff --git a/fuzz/wget_ftpls_fuzzer.dict b/fuzz/wget_ftpls_fuzzer.dict
new file mode 100644
index 0000000..2137bfa
--- /dev/null
+++ b/fuzz/wget_ftpls_fuzzer.dict
@@ -0,0 +1,20 @@
+"Jan"
+"Feb"
+"Mar"
+"Apr"
+"May"
+"Jun"
+"Jul"
+"Aug"
+"Sep"
+"Oct"
+"Nov"
+"Dec"
+"total"
+"0644"
+"0755"
+" -> "
+".."
+"Total of "
+".DIR"
+".DIR;1"
diff --git a/fuzz/wget_html_fuzzer.c b/fuzz/wget_html_fuzzer.c
new file mode 100644
index 0000000..43675d6
--- /dev/null
+++ b/fuzz/wget_html_fuzzer.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "utils.h"
+ #include "html-url.h"
+ #include "css-url.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+static const uint8_t *g_data;
+static size_t g_size;
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+#ifdef HAVE_FMEMOPEN
+ return fmemopen((void *) g_data, g_size, mode);
+#else
+ return NULL;
+#endif
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct urlpos *urls;
+ struct file_memory fm;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ CLOSE_STDERR
+
+ fm.content = (char *) data;
+ fm.length = size;
+ fm.mmap_p = 0;
+
+ urls = get_urls_html_fm("xxx", &fm, "https://x.y", NULL, NULL);
+ free_urlpos(urls);
+
+ RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_html_fuzzer.dict b/fuzz/wget_html_fuzzer.dict
new file mode 100644
index 0000000..b56efc0
--- /dev/null
+++ b/fuzz/wget_html_fuzzer.dict
@@ -0,0 +1,22 @@
+"<base"
+"<link"
+"<meta"
+"action"
+"href"
+"src"
+"srcset"
+"style"
+"follow"
+"nofollow"
+"all"
+"none"
+"robots="
+"name=\"robots\""
+"content="
+"http-equiv=\"Content-Type\""
+"charset="
+"style="
+"rel=\"shortcut icon\""
+"rel=\"stylesheet\""
+"rel=\"preload\""
+"srcset="
diff --git a/fuzz/wget_netrc_fuzzer.c b/fuzz/wget_netrc_fuzzer.c
new file mode 100644
index 0000000..3088277
--- /dev/null
+++ b/fuzz/wget_netrc_fuzzer.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <setjmp.h> // longjmp, setjmp
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "netrc.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+static int do_jump;
+static jmp_buf jmpbuf;
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ longjmp(jmpbuf, 1);
+}
+#elif defined HAVE_DLFCN_H
+#include <dlfcn.h> // dlsym
+#ifndef RTLD_NEXT
+#define RTLD_NEXT RTLD_GLOBAL
+#endif
+void exit(int status)
+{
+ if (do_jump) {
+ longjmp(jmpbuf, 1);
+ } else {
+ void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
+ libc_exit(status);
+ }
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+#ifdef HAVE_FMEMOPEN
+ FILE *fp;
+ struct fileinfo *fi;
+ const char *user = NULL, *pw = NULL;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ fp = fmemopen((void *) data, size, "r");
+ if (!fp) return 0;
+
+ CLOSE_STDERR
+
+ do_jump = 1;
+
+ if (setjmp(jmpbuf))
+ goto done;
+
+ opt.netrc = 1;
+
+ user = NULL; // get first entry
+ search_netrc("x", &user, &pw, 1, fp);
+ netrc_cleanup();
+
+ user = "u"; // get entry for user 'u'
+ search_netrc("x", &user, &pw, 1, fp);
+
+done:
+ netrc_cleanup();
+
+ fclose(fp);
+
+ do_jump = 0;
+
+ RESTORE_STDERR
+
+#endif
+ return 0;
+}
diff --git a/fuzz/wget_netrc_fuzzer.dict b/fuzz/wget_netrc_fuzzer.dict
new file mode 100644
index 0000000..d77a06e
--- /dev/null
+++ b/fuzz/wget_netrc_fuzzer.dict
@@ -0,0 +1,8 @@
+"machine"
+"default"
+"login"
+"password"
+"macdef"
+"account"
+"port"
+"force"
diff --git a/fuzz/wget_ntlm_fuzzer.c b/fuzz/wget_ntlm_fuzzer.c
new file mode 100644
index 0000000..39088fb
--- /dev/null
+++ b/fuzz/wget_ntlm_fuzzer.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2017-2019 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+#include <assert.h> // assert
+
+#include "wget.h"
+
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "http-ntlm.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ (void) pathname;
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ (void) pathname;
+ (void) mode;
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ (void) status;
+}
+#endif
+
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ if (size > 128) // same as max_len = ... in .options file
+ return 0;
+
+ // CLOSE_STDERR
+
+ struct ntlmdata *ntlm = calloc(1, sizeof(struct ntlmdata));
+ char *data0 = malloc(size + 4 + 1);
+ char *val;
+ bool ready;
+
+ assert(ntlm && data0);
+
+ memcpy(data0, "NTLM", 4);
+ memcpy(data0 + 4, data, size);
+ data0[size + 4] = 0;
+
+ if (ntlm_input(ntlm, data0))
+ free(ntlm_output(ntlm, data0 + 4, data0 + 4, &ready));
+
+ free(data0);
+ free(ntlm);
+
+// RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_options_fuzzer.c b/fuzz/wget_options_fuzzer.c
new file mode 100644
index 0000000..08a3760
--- /dev/null
+++ b/fuzz/wget_options_fuzzer.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+static const uint8_t *g_data;
+static size_t g_size;
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+#ifdef HAVE_FMEMOPEN
+ return fmemopen((void *) g_data, g_size, mode);
+#else
+ return NULL;
+#endif
+}
+
+static int do_jump;
+static jmp_buf jmpbuf;
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ longjmp(jmpbuf, 1);
+}
+#elif defined HAVE_DLFCN_H
+#include <dlfcn.h> // dlsym
+#ifndef RTLD_NEXT
+#define RTLD_NEXT RTLD_GLOBAL
+#endif
+void exit(int status)
+{
+ if (do_jump) {
+ longjmp(jmpbuf, 1);
+ } else {
+ void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit");
+ libc_exit(status);
+ }
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ static const char *argv[] = { "wget", "-q" };
+
+ if (size > 2048) // same as max_len = ... in .options file
+ return 0;
+
+ g_data = data;
+ g_size = size;
+
+ CLOSE_STDERR
+
+ do_jump = 1;
+
+ if (setjmp(jmpbuf))
+ goto done;
+
+ main_wget(sizeof(argv)/sizeof(argv[0]), argv);
+
+done:
+ cleanup();
+
+ do_jump = 0;
+
+ RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_options_fuzzer.dict b/fuzz/wget_options_fuzzer.dict
new file mode 100644
index 0000000..9a2dbd8
--- /dev/null
+++ b/fuzz/wget_options_fuzzer.dict
@@ -0,0 +1,195 @@
+"--"
+"no-"
+"on"
+"off"
+"="
+"PEM"
+"DER"
+"ASN1"
+"INF"
+"INFINITY"
+"1"
+"1k"
+"1m"
+"1g"
+"1t"
+"1s"
+"1m"
+"1h"
+"1d"
+"hard"
+"soft"
+"none"
+"ipv4"
+"ipv6"
+"bar"
+"posix"
+"pcre"
+"bytes"
+"bits"
+"human"
+"csv"
+"json"
+"accept="
+"accept-regex="
+"adjust-extension="
+"append-output="
+"ask-password="
+"auth-no-challenge="
+"backup-converted="
+"backups="
+"base="
+"bind-address="
+"ca-certificate="
+"cache="
+"ca-directory="
+"certificate="
+"certificate-type="
+"check-certificate="
+"check-hostname="
+"chunk-size="
+"clobber="
+"config="
+"connect-timeout="
+"content-disposition="
+"content-on-error="
+"continue="
+"convert-links="
+"cookies="
+"cookie-suffixes="
+"crl-file="
+"cut-dirs="
+"cut-file-get-vars="
+"cut-url-get-vars="
+"debug="
+"default-page="
+"delete-after="
+"directories="
+"directory-prefix="
+"dns-caching="
+"dns-timeout="
+"domains="
+"egd-file="
+"exclude-domains="
+"execute="
+"filter-mime-type="
+"filter-urls="
+"follow-tags="
+"force-atom="
+"force-css="
+"force-directories="
+"force-html="
+"force-metalink="
+"force-progress="
+"force-rss="
+"force-sitemap="
+"fsync-policy="
+"gnupg-homedir="
+"gnutls-options="
+"header="
+"help="
+"host-directories="
+"hpkp="
+"hpkp-file="
+"hsts="
+"hsts-file="
+"html-extension="
+"http2="
+"http2-request-window="
+"http-keep-alive="
+"http-password="
+"http-proxy="
+"http-proxy-password="
+"http-proxy-user="
+"https-enforce="
+"https-only="
+"https-proxy="
+"http-user="
+"ignore-case="
+"ignore-tags="
+"inet4-only="
+"inet6-only="
+"input-encoding="
+"input-file="
+"iri="
+"keep-session-cookies="
+"level="
+"list-plugins="
+"load-cookies="
+"local-db="
+"local-encoding="
+"local-plugin="
+"max-redirect="
+"max-threads="
+"metalink="
+"mirror="
+"netrc="
+"netrc-file="
+"no-quiet="
+"ocsp="
+"ocsp-file="
+"ocsp-stapling="
+"output-document="
+"output-file="
+"page-requisites="
+"parent="
+"password="
+"plugin="
+"plugin-dirs="
+"plugin-help="
+"plugin-opt="
+"post-data="
+"post-file="
+"prefer-family="
+"private-key="
+"private-key-type="
+"progress="
+"protocol-directories="
+"proxy="
+"quiet="
+"quota="
+"random-file="
+"random-wait="
+"read-timeout="
+"recursive="
+"referer="
+"regex-type="
+"reject="
+"reject-regex="
+"remote-encoding="
+"report-speed="
+"restrict-file-names="
+"robots="
+"save-cookies="
+"save-headers="
+"secure-protocol="
+"server-response="
+"signature-extension="
+"span-hosts="
+"spider="
+"stats-all="
+"stats-dns="
+"stats-ocsp="
+"stats-server="
+"stats-site="
+"stats-tls="
+"strict-comments="
+"tcp-fastopen="
+"timeout="
+"timestamping="
+"tls-false-start="
+"tls-resume="
+"tls-session-file="
+"tries="
+"trust-server-names="
+"use-askpass="
+"user="
+"user-agent="
+"use-server-timestamps="
+"verbose="
+"verify-save-failed="
+"verify-sig="
+"version="
+"wait="
+"waitretry="
+"xattr="
diff --git a/fuzz/wget_progress_fuzzer.c b/fuzz/wget_progress_fuzzer.c
new file mode 100644
index 0000000..e11444b
--- /dev/null
+++ b/fuzz/wget_progress_fuzzer.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2017-2019 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#include "wget.h"
+
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "progress.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ (void) pathname;
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ (void) pathname;
+ (void) mode;
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+ (void) status;
+}
+#endif
+
+
+#define NAMEPOS (2 * sizeof(wgint) + sizeof(double))
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ void *progress;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ if (size < NAMEPOS)
+ return 0;
+
+// CLOSE_STDERR
+
+ wgint start = ((wgint *) data)[0];
+ wgint end = ((wgint *) data)[1];
+ double dltime = ((wgint *) data)[2];
+
+ if (start < 0 || end < 0)
+ return 0;
+
+ if (start > end) {
+ wgint x = start;
+ start = end;
+ end = x;
+ }
+
+// double dltime = ((double *) (data + 2 * sizeof(wgint)))[0];
+
+ char *filename = strndup((char *) (data + NAMEPOS), size - NAMEPOS);
+
+// printf("%ld %ld %lf %s\n", start, end, dltime, filename);
+
+ set_progress_implementation("bar:force"); // [:force][:noscroll]
+
+ progress = progress_create (filename, start, end);
+ progress_update (progress, 0, dltime);
+ progress_update (progress, end - start, dltime);
+ progress_finish (progress, dltime);
+
+ set_progress_implementation("dot:default");// [:default|:binary|:mega|:giga]
+ progress = progress_create (filename, start, end);
+ progress_update (progress, 0, dltime);
+ progress_update (progress, end - start, dltime);
+ progress_finish (progress, dltime);
+
+ set_progress_implementation("dot:binary");// [:default|:binary|:mega|:giga]
+ progress = progress_create (filename, start, end);
+ progress_update (progress, 0, dltime);
+ progress_update (progress, end - start, dltime);
+ progress_finish (progress, dltime);
+
+ set_progress_implementation("dot:mega");// [:default|:binary|:mega|:giga]
+ progress = progress_create (filename, start, end);
+ progress_update (progress, 0, dltime);
+ progress_update (progress, end - start, dltime);
+ progress_finish (progress, dltime);
+
+ set_progress_implementation("dot:giga");// [:default|:binary|:mega|:giga]
+ progress = progress_create (filename, start, end);
+ progress_update (progress, 0, dltime);
+ progress_update (progress, end - start, dltime);
+ progress_finish (progress, dltime);
+
+ free(filename);
+
+// RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_read_hunk_fuzzer.c b/fuzz/wget_read_hunk_fuzzer.c
new file mode 100644
index 0000000..dc1da24
--- /dev/null
+++ b/fuzz/wget_read_hunk_fuzzer.c
@@ -0,0 +1,204 @@
+/*
+ * Copyright (c) 2019-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <unistd.h> // close
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <unistd.h> // close
+
+#include "wget.h"
+#include "connect.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "retr.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+// FILE *fopen_wget(const char *pathname, const char *mode);
+// FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+}
+#endif
+
+static const uint8_t *g_data;
+static size_t g_size, g_read;
+
+struct my_context {
+ int peeklen;
+ char peekbuf[512];
+};
+
+static int my_peek (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
+{
+ if (g_read < g_size) {
+ struct my_context *ctx = (struct my_context *) arg;
+ int n = rand() % (g_size - g_read);
+ if (n > bufsize)
+ n = bufsize;
+ if (n > sizeof(ctx->peekbuf))
+ n = sizeof(ctx->peekbuf);
+ memcpy(buf, g_data + g_read, n);
+ memcpy(ctx->peekbuf, g_data + g_read, n);
+ g_read += n;
+ ctx->peeklen=n;
+ return n;
+ }
+ return 0;
+}
+static int my_read (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
+{
+ struct my_context *ctx = (struct my_context *) arg;
+
+ if (ctx->peeklen) {
+ /* If we have any peek data, simply return that. */
+ int copysize = MIN (bufsize, ctx->peeklen);
+ memcpy (buf, ctx->peekbuf, copysize);
+ ctx->peeklen -= copysize;
+ if (ctx->peeklen)
+ memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
+
+ return copysize;
+ }
+
+ if (g_read < g_size) {
+ int n = rand() % (g_size - g_read);
+ if (n > bufsize)
+ n = bufsize;
+ memcpy(buf, g_data + g_read, n);
+ g_read += n;
+ return n;
+ }
+
+ return 0;
+}
+static int my_write (int fd _GL_UNUSED, char *buf _GL_UNUSED, int bufsize, void *arg _GL_UNUSED)
+{
+ return bufsize;
+}
+static int my_poll (int fd _GL_UNUSED, double timeout _GL_UNUSED, int wait_for _GL_UNUSED, void *arg)
+{
+ struct my_context *ctx = (struct my_context *) arg;
+
+ return ctx->peeklen || g_read < g_size;
+}
+static const char *my_errstr (int fd _GL_UNUSED, void *arg _GL_UNUSED)
+{
+ return "Success";
+}
+static void my_close (int fd _GL_UNUSED, void *arg _GL_UNUSED)
+{
+}
+
+static struct transport_implementation my_transport =
+{
+ my_read, my_write, my_poll,
+ my_peek, my_errstr, my_close
+};
+
+/* copied from wget's http.c */
+static const char *
+response_head_terminator (const char *start, const char *peeked, int peeklen)
+{
+ const char *p, *end;
+
+ /* If at first peek, verify whether HUNK starts with "HTTP". If
+ not, this is a HTTP/0.9 request and we must bail out without
+ reading anything. */
+ if (start == peeked && 0 != memcmp (start, "HTTP", MIN (peeklen, 4)))
+ return start;
+
+ /* Look for "\n[\r]\n", and return the following position if found.
+ Start two chars before the current to cover the possibility that
+ part of the terminator (e.g. "\n\r") arrived in the previous
+ batch. */
+ p = peeked - start < 2 ? start : peeked - 2;
+ end = peeked + peeklen;
+
+ /* Check for \n\r\n or \n\n anywhere in [p, end-2). */
+ for (; p < end - 2; p++)
+ if (*p == '\n')
+ {
+ if (p[1] == '\r' && p[2] == '\n')
+ return p + 3;
+ else if (p[1] == '\n')
+ return p + 2;
+ }
+ /* p==end-2: check for \n\n directly preceding END. */
+ if (peeklen >= 2 && p[0] == '\n' && p[1] == '\n')
+ return p + 2;
+
+ return NULL;
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ char *hunk;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+// CLOSE_STDERR
+
+ g_data = data;
+ g_size = size;
+ g_read = 0;
+
+ struct my_context *ctx = (struct my_context *) calloc(1, sizeof(struct my_context));
+ fd_register_transport(99, &my_transport, ctx);
+
+ while ((hunk = fd_read_hunk(99, response_head_terminator, 512, 65536)))
+ free(hunk);
+
+ connect_cleanup();
+ free(ctx);
+
+// RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_robots_fuzzer.c b/fuzz/wget_robots_fuzzer.c
new file mode 100644
index 0000000..159dc06
--- /dev/null
+++ b/fuzz/wget_robots_fuzzer.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <dirent.h> // opendir, readdir
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+#include <setjmp.h> // longjmp, setjmp
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "res.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct robot_specs *specs;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ CLOSE_STDERR
+
+ specs = res_parse((char *) data, (int) size);
+ if (!specs)
+ return 0;
+
+ res_match_path(specs, "a%ff%a");
+
+ res_register_specs("host", 80, specs);
+
+ res_cleanup();
+
+ RESTORE_STDERR
+
+ return 0;
+}
diff --git a/fuzz/wget_url_fuzzer.c b/fuzz/wget_url_fuzzer.c
new file mode 100644
index 0000000..695704f
--- /dev/null
+++ b/fuzz/wget_url_fuzzer.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2017-2020 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Wget.
+ *
+ * GNU Wget 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.
+ *
+ * GNU Wget is distributed in the hope that 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 Wget. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdint.h> // uint8_t
+#include <stdio.h> // fmemopen
+#include <string.h> // strncmp
+#include <stdlib.h> // free
+#include <unistd.h> // close
+#include <fcntl.h> // open flags
+#include <unistd.h> // close
+
+#include "wget.h"
+#undef fopen_wgetrc
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+ #include "url.h"
+
+ // declarations for wget internal functions
+ int main_wget(int argc, const char **argv);
+ void cleanup(void);
+ FILE *fopen_wget(const char *pathname, const char *mode);
+ FILE *fopen_wgetrc(const char *pathname, const char *mode);
+ void exit_wget(int status);
+#ifdef __cplusplus
+ }
+#endif
+
+#include "fuzzer.h"
+
+FILE *fopen_wget(const char *pathname, const char *mode)
+{
+ return fopen("/dev/null", mode);
+}
+
+FILE *fopen_wgetrc(const char *pathname, const char *mode)
+{
+ return NULL;
+}
+
+#ifdef FUZZING
+void exit_wget(int status)
+{
+}
+#endif
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct url *url;
+ struct iri iri;
+ char *in;
+
+ if (size > 4096) // same as max_len = ... in .options file
+ return 0;
+
+ CLOSE_STDERR
+
+ in = (char *) malloc(size + 1);
+ memcpy(in, data, size);
+ in[size] = 0;
+
+ iri.uri_encoding = (char *) "iso-8859-1";
+ iri.orig_url = NULL;
+
+ iri.utf8_encode = 0;
+ url = url_parse(in, NULL, &iri, 0);
+ url_free(url);
+
+ url = url_parse(in, NULL, &iri, 1);
+ url_free(url);
+
+ iri.utf8_encode = 1;
+ url = url_parse(in, NULL, &iri, 0);
+ url_free(url);
+
+ url = url_parse(in, NULL, &iri, 1);
+ url_free(url);
+
+ free(iri.orig_url);
+ free(in);
+
+ RESTORE_STDERR
+
+ return 0;
+}
diff --git a/gnulib_po/LINGUAS b/gnulib_po/LINGUAS
new file mode 100644
index 0000000..e79f7f3
--- /dev/null
+++ b/gnulib_po/LINGUAS
@@ -0,0 +1,39 @@
+# Set of available languages.
+af
+be
+bg
+ca
+cs
+da
+de
+el
+eo
+es
+et
+eu
+fi
+fr
+ga
+gl
+hu
+it
+ja
+ko
+ms
+nb
+nl
+pl
+pt
+pt_BR
+ro
+ru
+rw
+sk
+sl
+sr
+sv
+tr
+uk
+vi
+zh_CN
+zh_TW
diff --git a/gnulib_po/Makefile.in.in b/gnulib_po/Makefile.in.in
new file mode 100644
index 0000000..65184f6
--- /dev/null
+++ b/gnulib_po/Makefile.in.in
@@ -0,0 +1,475 @@
+# Makefile for PO directory in any package using GNU gettext.
+# 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
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# 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.19
+GETTEXT_MACRO_VERSION = 0.19
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SED = @SED@
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+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:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+ @echo "$(MSGFMT) -c -o $@ $<"; \
+ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+ @lang=`echo $* | sed -e 's,.*/,,'`; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ 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: 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@" \
+ || { 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; \
+ }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(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 || { \
+ echo "touch stamp-po" && \
+ echo timestamp > stamp-poT && \
+ mv stamp-poT stamp-po; \
+ }
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# 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
+ 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_prefix=''; \
+ fi; \
+ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+ else \
+ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+ fi; \
+ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$${package_prefix}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ esac
+ test ! -f $(DOMAIN).po || { \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+ else \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ else \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+ $(MAKE) $(DOMAIN).pot-update
+
+# 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): $(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) $(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
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ for file in Makevars; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+ fi; \
+ done; \
+ done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+installdirs-data-no:
+installdirs-data-yes:
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ fi; \
+ done; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+uninstall-data-no:
+uninstall-data-yes:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ done; \
+ done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+ rm -f remove-potcdate.sed
+ rm -f stamp-poT
+ rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ dists="$$dists Makevars.template"; \
+ fi; \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ dists="$$dists $(DOMAIN).pot stamp-po"; \
+ fi; \
+ if test -f $(srcdir)/ChangeLog; then \
+ dists="$$dists ChangeLog"; \
+ fi; \
+ for i in 0 1 2 3 4 5 6 7 8 9; do \
+ if test -f $(srcdir)/ChangeLog.$$i; then \
+ dists="$$dists ChangeLog.$$i"; \
+ fi; \
+ done; \
+ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+ for file in $$dists; do \
+ if test -f $$file; then \
+ cp -p $$file $(distdir) || exit 1; \
+ else \
+ cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+ fi; \
+ done
+
+update-po: Makefile
+ $(MAKE) $(DOMAIN).pot-update
+ test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+ $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+ @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+ exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+ @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ 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 \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+$(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
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gnulib_po/Makevars b/gnulib_po/Makevars
new file mode 100644
index 0000000..07fd668
--- /dev/null
+++ b/gnulib_po/Makevars
@@ -0,0 +1,68 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+
+# Usually the message domain is the same as the package name.
+# But here it has a '-gnulib' suffix.
+DOMAIN = wget-gnulib
+
+# These two variables depend on the location of this directory.
+subdir = gnulib_po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = \
+ --keyword=_ --flag=_:1:pass-c-format \
+ --keyword=N_ --flag=N_:1:pass-c-format \
+ --keyword='proper_name:1,"This is a proper name. See the gettext manual, section Names."' \
+ --keyword='proper_name_utf8:1,"This is a proper name. See the gettext manual, section Names."' \
+ --flag=error:3:c-format --flag=error_at_line:5:c-format
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. gnulib is copyrighted by the FSF.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# 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
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-gnulib@gnu.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
diff --git a/gnulib_po/POTFILES.in b/gnulib_po/POTFILES.in
new file mode 100644
index 0000000..f7c33bb
--- /dev/null
+++ b/gnulib_po/POTFILES.in
@@ -0,0 +1,476 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+
+# List of files which contain translatable strings.
+lib/_Noreturn.h
+lib/accept.c
+lib/access.c
+lib/af_alg.c
+lib/af_alg.h
+lib/alloca.c
+lib/alloca.in.h
+lib/arg-nonnull.h
+lib/arpa_inet.in.h
+lib/array-mergesort.h
+lib/asnprintf.c
+lib/asprintf.c
+lib/assure.h
+lib/at-func.c
+lib/attribute.h
+lib/base32.c
+lib/base32.h
+lib/basename-lgpl.c
+lib/basename-lgpl.h
+lib/basename.c
+lib/binary-io.c
+lib/binary-io.h
+lib/bind.c
+lib/bitrotate.c
+lib/bitrotate.h
+lib/btowc.c
+lib/byteswap.in.h
+lib/c++defs.h
+lib/c-ctype.c
+lib/c-ctype.h
+lib/c-strcase.h
+lib/c-strcasecmp.c
+lib/c-strcaseeq.h
+lib/c-strcasestr.c
+lib/c-strcasestr.h
+lib/c-strncasecmp.c
+lib/canonicalize.c
+lib/canonicalize.h
+lib/cdefs.h
+lib/chdir-long.c
+lib/chdir-long.h
+lib/cloexec.c
+lib/cloexec.h
+lib/close.c
+lib/closedir.c
+lib/concat-filename.c
+lib/concat-filename.h
+lib/connect.c
+lib/ctype.in.h
+lib/dirent-private.h
+lib/dirent.in.h
+lib/dirfd.c
+lib/dirname-lgpl.c
+lib/dirname.c
+lib/dirname.h
+lib/dup-safer-flag.c
+lib/dup-safer.c
+lib/dup.c
+lib/dup2.c
+lib/errno.in.h
+lib/error.c
+lib/error.h
+lib/exitfail.c
+lib/exitfail.h
+lib/fatal-signal.c
+lib/fatal-signal.h
+lib/fchdir.c
+lib/fcntl.c
+lib/fcntl.in.h
+lib/fd-hook.c
+lib/fd-hook.h
+lib/fd-safer-flag.c
+lib/fd-safer.c
+lib/fdopendir.c
+lib/fflush.c
+lib/file-set.c
+lib/file-set.h
+lib/filename.h
+lib/filenamecat-lgpl.c
+lib/filenamecat.h
+lib/findprog-in.c
+lib/findprog.h
+lib/flexmember.h
+lib/float+.h
+lib/float.c
+lib/float.in.h
+lib/flock.c
+lib/fnmatch.c
+lib/fnmatch.in.h
+lib/fnmatch_loop.c
+lib/fopen.c
+lib/fpurge.c
+lib/freading.c
+lib/freading.h
+lib/free.c
+lib/fseek.c
+lib/fseeko.c
+lib/fstat.c
+lib/fstatat.c
+lib/ftell.c
+lib/ftello.c
+lib/futimens.c
+lib/gai_strerror.c
+lib/getaddrinfo.c
+lib/getcwd-lgpl.c
+lib/getcwd.c
+lib/getdelim.c
+lib/getdtablesize.c
+lib/getgroups.c
+lib/getline.c
+lib/getopt-cdefs.in.h
+lib/getopt-core.h
+lib/getopt-ext.h
+lib/getopt-pfx-core.h
+lib/getopt-pfx-ext.h
+lib/getopt.c
+lib/getopt.in.h
+lib/getopt1.c
+lib/getopt_int.h
+lib/getpass.c
+lib/getpass.h
+lib/getpeername.c
+lib/getprogname.c
+lib/getprogname.h
+lib/getrandom.c
+lib/getsockname.c
+lib/gettext.h
+lib/gettime.c
+lib/gettimeofday.c
+lib/gl_openssl.h
+lib/glthread/lock.c
+lib/glthread/lock.h
+lib/glthread/threadlib.c
+lib/group-member.c
+lib/hard-locale.c
+lib/hard-locale.h
+lib/hash-pjw.c
+lib/hash-pjw.h
+lib/hash-triple-simple.c
+lib/hash-triple.h
+lib/hash.c
+lib/hash.h
+lib/iconv.in.h
+lib/idx.h
+lib/inet_ntop.c
+lib/intprops.h
+lib/inttypes.in.h
+lib/ioctl.c
+lib/isblank.c
+lib/iswblank.c
+lib/iswdigit.c
+lib/iswxdigit.c
+lib/itold.c
+lib/langinfo.in.h
+lib/lc-charset-dispatch.c
+lib/lc-charset-dispatch.h
+lib/libc-config.h
+lib/libunistring.valgrind
+lib/limits.in.h
+lib/link.c
+lib/listen.c
+lib/localcharset.c
+lib/localcharset.h
+lib/locale.in.h
+lib/localeconv.c
+lib/lseek.c
+lib/lstat.c
+lib/malloc.c
+lib/malloc/scratch_buffer.h
+lib/malloc/scratch_buffer_dupfree.c
+lib/malloc/scratch_buffer_grow.c
+lib/malloc/scratch_buffer_grow_preserve.c
+lib/malloc/scratch_buffer_set_array_size.c
+lib/malloca.c
+lib/malloca.h
+lib/mbchar.c
+lib/mbchar.h
+lib/mbiter.c
+lib/mbiter.h
+lib/mbrtowc-impl-utf8.h
+lib/mbrtowc-impl.h
+lib/mbrtowc.c
+lib/mbsinit.c
+lib/mbsrtowcs-impl.h
+lib/mbsrtowcs-state.c
+lib/mbsrtowcs.c
+lib/mbtowc-impl.h
+lib/mbtowc-lock.c
+lib/mbtowc-lock.h
+lib/mbtowc.c
+lib/md2.c
+lib/md2.h
+lib/md4.c
+lib/md4.h
+lib/md5.c
+lib/md5.h
+lib/memchr.c
+lib/memchr.valgrind
+lib/mempcpy.c
+lib/memrchr.c
+lib/minmax.h
+lib/mkdir.c
+lib/mkostemp.c
+lib/mkstemp.c
+lib/mktime-internal.h
+lib/mktime.c
+lib/msvc-inval.c
+lib/msvc-inval.h
+lib/msvc-nothrow.c
+lib/msvc-nothrow.h
+lib/nanosleep.c
+lib/netdb.in.h
+lib/netinet_in.in.h
+lib/nl_langinfo-lock.c
+lib/nl_langinfo.c
+lib/open.c
+lib/openat-die.c
+lib/openat-priv.h
+lib/openat-proc.c
+lib/openat.c
+lib/openat.h
+lib/opendir.c
+lib/os2-spawn.c
+lib/os2-spawn.h
+lib/pathmax.h
+lib/pipe-safer.c
+lib/pipe.c
+lib/pipe2-safer.c
+lib/pipe2.c
+lib/printf-args.c
+lib/printf-args.h
+lib/printf-parse.c
+lib/printf-parse.h
+lib/quote.h
+lib/quotearg.c
+lib/quotearg.h
+lib/raise.c
+lib/rawmemchr.c
+lib/rawmemchr.valgrind
+lib/readdir.c
+lib/readlink.c
+lib/realloc.c
+lib/recv.c
+lib/regcomp.c
+lib/regex.c
+lib/regex.h
+lib/regex_internal.c
+lib/regex_internal.h
+lib/regexec.c
+lib/rewinddir.c
+lib/same-inode.h
+lib/save-cwd.c
+lib/save-cwd.h
+lib/sched.in.h
+lib/scratch_buffer.h
+lib/secure_getenv.c
+lib/select.c
+lib/send.c
+lib/setlocale-lock.c
+lib/setlocale_null.c
+lib/setlocale_null.h
+lib/setsockopt.c
+lib/sha1.c
+lib/sha1.h
+lib/sha256.c
+lib/sha256.h
+lib/sha512.c
+lib/sha512.h
+lib/sig-handler.c
+lib/sig-handler.h
+lib/sigaction.c
+lib/signal.in.h
+lib/sigprocmask.c
+lib/size_max.h
+lib/snprintf.c
+lib/socket.c
+lib/sockets.c
+lib/sockets.h
+lib/spawn-pipe.c
+lib/spawn-pipe.h
+lib/spawn.c
+lib/spawn.in.h
+lib/spawn_faction_addchdir.c
+lib/spawn_faction_addclose.c
+lib/spawn_faction_adddup2.c
+lib/spawn_faction_addopen.c
+lib/spawn_faction_destroy.c
+lib/spawn_faction_init.c
+lib/spawn_int.h
+lib/spawnattr_destroy.c
+lib/spawnattr_init.c
+lib/spawnattr_setflags.c
+lib/spawnattr_setpgroup.c
+lib/spawnattr_setsigmask.c
+lib/spawni.c
+lib/spawnp.c
+lib/stat-time.c
+lib/stat-time.h
+lib/stat-w32.c
+lib/stat-w32.h
+lib/stat.c
+lib/stdalign.in.h
+lib/stdbool.in.h
+lib/stddef.in.h
+lib/stdint.in.h
+lib/stdio-impl.h
+lib/stdio-write.c
+lib/stdio.in.h
+lib/stdlib.in.h
+lib/stpcpy.c
+lib/str-two-way.h
+lib/strcasecmp.c
+lib/strchrnul.c
+lib/strchrnul.valgrind
+lib/strdup.c
+lib/streq.h
+lib/strerror-override.c
+lib/strerror-override.h
+lib/strerror.c
+lib/strerror_r.c
+lib/string.in.h
+lib/strings.in.h
+lib/stripslash.c
+lib/strncasecmp.c
+lib/strndup.c
+lib/strnlen.c
+lib/strnlen1.c
+lib/strnlen1.h
+lib/strpbrk.c
+lib/strptime.c
+lib/strtok_r.c
+lib/strtol.c
+lib/strtoll.c
+lib/symlink.c
+lib/sys-limits.h
+lib/sys_file.in.h
+lib/sys_ioctl.in.h
+lib/sys_random.in.h
+lib/sys_select.in.h
+lib/sys_socket.c
+lib/sys_socket.in.h
+lib/sys_stat.in.h
+lib/sys_time.in.h
+lib/sys_types.in.h
+lib/sys_uio.in.h
+lib/sys_wait.in.h
+lib/tempname.c
+lib/tempname.h
+lib/thread-optim.h
+lib/time.in.h
+lib/time_r.c
+lib/timegm.c
+lib/timespec.c
+lib/timespec.h
+lib/tmpdir.c
+lib/tmpdir.h
+lib/u64.c
+lib/u64.h
+lib/unicase.in.h
+lib/unicase/cased.c
+lib/unicase/cased.h
+lib/unicase/caseprop.h
+lib/unicase/context.h
+lib/unicase/empty-prefix-context.c
+lib/unicase/empty-suffix-context.c
+lib/unicase/ignorable.c
+lib/unicase/ignorable.h
+lib/unicase/simple-mapping.h
+lib/unicase/special-casing-table.gperf
+lib/unicase/special-casing.c
+lib/unicase/special-casing.in.h
+lib/unicase/tolower.c
+lib/unicase/tolower.h
+lib/unicase/u-casemap.h
+lib/unicase/u8-casemap.c
+lib/unicase/u8-tolower.c
+lib/unicase/unicasemap.h
+lib/unictype.in.h
+lib/unictype/bitmap.h
+lib/unictype/combiningclass.c
+lib/unictype/combiningclass.h
+lib/unictype/pr_soft_dotted.c
+lib/unictype/pr_soft_dotted.h
+lib/uninorm.in.h
+lib/uninorm/decompose-internal.c
+lib/uninorm/decompose-internal.h
+lib/uninorm/normalize-internal.h
+lib/uninorm/u-normalize-internal.h
+lib/uninorm/u8-normalize.c
+lib/unistd--.h
+lib/unistd-safer.h
+lib/unistd.c
+lib/unistd.in.h
+lib/unistr.in.h
+lib/unistr/u-cpy.h
+lib/unistr/u8-cpy.c
+lib/unistr/u8-mbtouc-unsafe-aux.c
+lib/unistr/u8-mbtouc-unsafe.c
+lib/unistr/u8-strlen.c
+lib/unistr/u8-uctomb-aux.c
+lib/unistr/u8-uctomb.c
+lib/unitypes.in.h
+lib/uniwidth.in.h
+lib/uniwidth/cjk.h
+lib/uniwidth/width.c
+lib/unlink.c
+lib/unlocked-io.h
+lib/unused-parameter.h
+lib/utime.c
+lib/utime.in.h
+lib/utimens.c
+lib/utimens.h
+lib/vasnprintf.c
+lib/vasnprintf.h
+lib/vasprintf.c
+lib/verify.h
+lib/vsnprintf.c
+lib/w32sock.h
+lib/wait-process.c
+lib/wait-process.h
+lib/waitpid.c
+lib/warn-on-use.h
+lib/wchar.in.h
+lib/wcrtomb.c
+lib/wctype-h.c
+lib/wctype.in.h
+lib/wcwidth.c
+lib/windows-initguard.h
+lib/windows-mutex.c
+lib/windows-mutex.h
+lib/windows-once.c
+lib/windows-once.h
+lib/windows-recmutex.c
+lib/windows-recmutex.h
+lib/windows-rwlock.c
+lib/windows-rwlock.h
+lib/windows-spawn.c
+lib/windows-spawn.h
+lib/wmemchr-impl.h
+lib/wmemchr.c
+lib/wmempcpy.c
+lib/write.c
+lib/xalloc-die.c
+lib/xalloc-oversized.h
+lib/xalloc.h
+lib/xmalloc.c
+lib/xmemdup0.c
+lib/xmemdup0.h
+lib/xsize.c
+lib/xsize.h
+lib/xstrndup.c
+lib/xstrndup.h
diff --git a/gnulib_po/Rules-quot b/gnulib_po/Rules-quot
new file mode 100644
index 0000000..9dc9630
--- /dev/null
+++ b/gnulib_po/Rules-quot
@@ -0,0 +1,58 @@
+# 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
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+ $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+ $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+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-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) $(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 \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "creation of $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+en@quot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+ rm -f *.insert-header
diff --git a/gnulib_po/af.gmo b/gnulib_po/af.gmo
new file mode 100644
index 0000000..303e31c
--- /dev/null
+++ b/gnulib_po/af.gmo
Binary files differ
diff --git a/gnulib_po/af.po b/gnulib_po/af.po
new file mode 100644
index 0000000..aa3f83e
--- /dev/null
+++ b/gnulib_po/af.po
@@ -0,0 +1,576 @@
+# coreutils-5.2.1.af.po.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Petri Jooste <rkwjpj@puknet.puk.ac.za>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: coreutils 5.2.1\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2004-03-17 11:58+0200\n"
+"Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
+"Language-Team: Afrikaans <i18n@af.org.za>\n"
+"Language: af\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Onbekende stelselfout"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fifo-lêers word nie ondersteun nie"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fifo-lêers word nie ondersteun nie"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fifo-lêers word nie ondersteun nie"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "skryffout"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Onbekende stelselfout"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: opsie `%s' is dubbelsinnig\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: opsie `%s' is dubbelsinnig\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: onbekende opsie `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: opsie `%c%s' laat nie 'n parameter toe nie\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: opsie `%s' benodig 'n parameter\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ongeldige opsie -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: opsie benodig 'n parameter -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "kon nie na aanvanklike werkgids terugkeer nie"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kon nie na aanvanklike werkgids terugkeer nie"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: ongeldige reëlmatige uitdrukking: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "ongeldige karakterklas `%s'"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "ongeldige karakterklas `%s'"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: ongeldige reëlmatige uitdrukking: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "geheue uitgeput"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: ongeldige reëlmatige uitdrukking: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "fout in soektog met reëlmatige uitdrukking"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: ongeldige reëlmatige uitdrukking: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "fout in soektog met reëlmatige uitdrukking"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "kan nie die skakel %s skep nie"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: seek het misluk"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: seek het misluk"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: seek het misluk"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "geheue uitgeput"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "ongeldige parameter %s vir %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "dubbelsinnige parameter %s vir %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Geldige parameters is soos volg:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Verpligte parameters vir langformaat opsies is ook verpligtend vir "
+#~ "kortformaat opsies.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Gebruik so: %s [OPSIE]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Probeer `%s --help' vir meer inligting.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporteer foute aan <%s>.\n"
+
+#~ msgid "NAME"
+#~ msgstr "NAAM"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "te veel parameters\n"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "leesfout"
+
+#~ msgid "write error"
+#~ msgstr "skryffout"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "kan nie %s oopmaak om te lees nie"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "kan nie %s oopmaak om te lees nie"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "fout met die les van %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "fout met die skryf na %s"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "fout met die les van %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "'open' het gefaal"
+
+#~ msgid "regular empty file"
+#~ msgstr "gewone leë lêer"
+
+#~ msgid "regular file"
+#~ msgstr "gewone lêer"
+
+#~ msgid "directory"
+#~ msgstr "lêergids"
+
+#~ msgid "block special file"
+#~ msgstr "spesiale bloklêer"
+
+#~ msgid "character special file"
+#~ msgstr "spesiale karakterlêer"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "simboliese skakel"
+
+#~ msgid "socket"
+#~ msgstr "sok"
+
+#~ msgid "message queue"
+#~ msgstr "boodskapwagtou"
+
+#~ msgid "semaphore"
+#~ msgstr "semafoor"
+
+#~ msgid "shared memory object"
+#~ msgstr "gedeeldegeheue-objek"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "gedeeldegeheue-objek"
+
+#~ msgid "weird file"
+#~ msgstr "vreemde lêer"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opsie `--%s' laat nie 'n parameter toe nie\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: onbekende opsie `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: onwettige opsie -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: opsie `-W %s' is dubbelsinnig\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: opsie `-W %s' laat nie 'n parameter toe nie\n"
+
+#~ msgid "block size"
+#~ msgstr "blokgrootte"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s bestaan maar is nie 'n lêergids nie"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "kan nie die eienaar en/of groep van %s verander nie"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "Kan nie lêergids %s skep nie."
+
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "kan nie chdir doen om na gids %s te gaan nie"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "kan nie toegangsregte van %s verander nie"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "magtigings vir %s kon nie behou word nie"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv-funksie onbruikbaar"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv-funksie is nie beskikbaar nie"
+
+#~ msgid "character out of range"
+#~ msgstr "karakter is buite die grense"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "kan nie U+%04X omskakel na 'n plaaslike karakterstel nie: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ongeldige gebruiker"
+
+#~ msgid "invalid group"
+#~ msgstr "ongeldige groep "
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "kan nie die aantekengroep van 'n numeriese UID verkry nie"
+
+# TRANSLATORS: %s denotes an author name.
+# TRANSLATORS: %s denotes an author name.
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Geskryf deur %s.\n"
+
+# TRANSLATORS: Each %s denotes an author name.
+# TRANSLATORS: Each %s denotes an author name.
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Geskryf deur %s en %s.\n"
+
+# TRANSLATORS: Each %s denotes an author name.
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Geskryf deur %s, %s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s \n"
+#~ "en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s, %s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s, %s, %s en %s.\n"
+
+# TRANSLATORS: Each %s denotes an author name.
+# You can use line breaks, estimating that each author name occupies
+# ca. 16 screen columns and that a screen line has ca. 80 columns.
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s, %s, %s, %s\n"
+#~ "en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Geskryf deur %s, %s, %s, \n"
+#~ "%s, %s, %s, %s\n"
+#~ "%s, %s en ander.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "stringvergelyking het gefaal"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Stel LC_ALL='C' om die probleem te systap"
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Die stringe wat vergelyk is, is %s en %s."
diff --git a/gnulib_po/be.gmo b/gnulib_po/be.gmo
new file mode 100644
index 0000000..b4ef5f0
--- /dev/null
+++ b/gnulib_po/be.gmo
Binary files differ
diff --git a/gnulib_po/be.po b/gnulib_po/be.po
new file mode 100644
index 0000000..e9c2d59
--- /dev/null
+++ b/gnulib_po/be.po
@@ -0,0 +1,520 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the coreutils package.
+# Ales Nyakhaychyk <nab@mail.by>, 2002, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: coreutils 5.0.91\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2003-10-30 01:10+0200\n"
+"Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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"
+"X-Generator: KBabel 1.0.2\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ ÑÑ‹ÑÑ‚ÑÐ¼Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fifo файлы непадтрымліваюцца"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fifo файлы непадтрымліваюцца"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fifo файлы непадтрымліваюцца"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "памылка запіÑу"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ ÑÑ‹ÑÑ‚ÑÐ¼Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: выбар `%s' неадназначны\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: выбар `%s' неадназначны\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: нераÑпазнаны выбар `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: выбар `%c%s' не дазвалÑе довад\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: выбар `%s' патрабуе довад\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: нерÑчаіÑны выбар -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: выбар патрабуе довад -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "немагчыма вÑрнуцца Ñž пачатковую працоўную Ñ‚Ñчку"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "немагчыма вÑрнуцца Ñž пачатковую працоўную Ñ‚Ñчку"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: нерÑчаіÑны звычайны выраз: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "нерÑчаіÑны знак %s у радку Ñ€Ñжыму %s"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "нерÑчаіÑны знак %s у радку Ñ€Ñжыму %s"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: нерÑчаіÑны звычайны выраз: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "памÑць вычарпана"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: нерÑчаіÑны звычайны выраз: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "памылка ў пошуку звычайнага выразу"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: нерÑчаіÑны звычайны выраз: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "памылка ў пошуку звычайнага выразу"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "немагчыма Ñтварыць лучыва %s"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: збой seek"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: збой seek"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: збой seek"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "памÑць вычарпана"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "нерÑчаіÑны довад %s Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "неадназначны довад %s Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "РÑчаіÑÐ½Ñ‹Ñ Ð´Ð¾Ð²Ð°Ð´Ñ‹:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Довады, абавÑÐ·ÐºÐ¾Ð²Ñ‹Ñ Ð´Ð»Ñ Ð´Ð¾ÑžÐ³Ñ–Ñ… выбараў, абавÑÐ·ÐºÐ¾Ð²Ñ‹Ñ Ð¹ Ð´Ð»Ñ ÐºÐ°Ñ€Ð¾Ñ‚ÐºÑ–Ñ….\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "ВыкарыÑтаньне: %s [ВЫБÐР]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "ПаÑпрабуйце \"%s --help\" Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆ падрабÑзных зьвеÑтак.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ПаведамлÑйце пра памылкі на <%s>.\n"
+
+#~ msgid "NAME"
+#~ msgstr "ÐÐЗВÐ"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "зашмат довадаў\n"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "памылка чытаньнÑ"
+
+#~ msgid "write error"
+#~ msgstr "памылка запіÑу"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "немагыма адчыніць %s Ð´Ð»Ñ Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "немагыма адчыніць %s Ð´Ð»Ñ Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "памылка запіÑу %s"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "памылка адкрыцьцÑ"
+
+#~ msgid "regular empty file"
+#~ msgstr "звычайны парожні файл"
+
+#~ msgid "regular file"
+#~ msgstr "звычайны файл"
+
+#~ msgid "directory"
+#~ msgstr "Ñ‚Ñчка"
+
+#~ msgid "block special file"
+#~ msgstr "аÑаблівы кавалкавы файл"
+
+#~ msgid "character special file"
+#~ msgstr "аÑаблівы знакавы файл"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "знакавае лучыва"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "message queue"
+#~ msgstr "чарга паведамленьнÑÑž"
+
+#~ msgid "semaphore"
+#~ msgstr "ÑÑмафор"
+
+#~ msgid "shared memory object"
+#~ msgstr "абьект з агульнай памÑцьцю"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "абьект з агульнай памÑцьцю"
+
+#~ msgid "weird file"
+#~ msgstr "лёÑавы файл"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: выбар `--%s' не дазвалÑе довад\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: нераÑпазнаны выбар `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: недапушчальны выраб -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: выбар `-W %s' неадназначыны\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: выбар `-W %s' не дазвалÑе довад\n"
+
+#~ msgid "block size"
+#~ msgstr "памер кавалку"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s Ñ–Ñнуе, але гÑта Ð½Ñ Ñ‚Ñчка"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "немагчыма зьмÑніць уладальніка й/ці групу %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "немагчыма Ñтварыць Ñ‚Ñчку %s"
+
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "немагчыма перайÑьці да Ñ‚Ñчкі %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "немагчыма зьмÑніць правы %s"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "збой пры захаваньні правоў Ð´Ð»Ñ %s"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[тТ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[нÐ]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ iconv непрыгодна Ð´Ð»Ñ Ð²Ñ‹ÐºÐ°Ñ€Ñ‹ÑтаньнÑ"
+
+#~ msgid "iconv function not available"
+#~ msgstr "недаÑтупна Ñ„ÑƒÐ½ÐºÑ†Ñ‹Ñ iconv"
+
+#~ msgid "character out of range"
+#~ msgstr "знак па за дапушчальнымі межамі"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "немагчыма пераўтварыць U+%04X у мÑÑцовы набор знакаў"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "немагчыма пераўтварыць U+%04X у мÑÑцовы набор знакаў: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "нерÑчаіÑны карыÑтальнік"
+
+#~ msgid "invalid group"
+#~ msgstr "нерÑчаіÑÐ½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð°"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "немагчыма атрымаць уліковую групу лічбавага UID"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Стваральнік %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Стваральнік %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Стваральнік %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "Стваральнік %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "Стваральнік %s.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "памылка Ð¿Ð°Ñ€Ð°ÑžÐ½Ð°Ð½ÑŒÐ½Ñ Ñ€Ð°Ð´ÐºÑƒ"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "УÑталюйце LC_ALL='C' каб працаваць без пытаньнÑÑž."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Радкі былі параўнаны тут %s і тут %s."
diff --git a/gnulib_po/bg.gmo b/gnulib_po/bg.gmo
new file mode 100644
index 0000000..d264491
--- /dev/null
+++ b/gnulib_po/bg.gmo
Binary files differ
diff --git a/gnulib_po/bg.po b/gnulib_po/bg.po
new file mode 100644
index 0000000..2713fe6
--- /dev/null
+++ b/gnulib_po/bg.po
@@ -0,0 +1,990 @@
+# Bulgarian translation of GNU gnulib po-file.
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Alexander Shopov <ash@kambanaria.org>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-03-10 09:45+0100\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@ludost.net>\n"
+"Language: bg\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-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "ÐеизвеÑтна ÑиÑтемна грешка"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Този вид адреÑи за името на хоÑта не Ñе поддържат"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Временен проблем при намиране на IP-адреÑа на хоÑÑ‚"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Ðеправилна ÑтойноÑÑ‚ за „ai_flags“"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Окончателен неуÑпех при намиране на IP-адреÑа на хоÑÑ‚"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "поÑочването на вид адреÑи („ai_family“) не Ñе поддържа"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "ÐеуÑпешно заделÑне на памет"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "ÐÑма IP-Ð°Ð´Ñ€ÐµÑ Ñ Ð¿Ð¾Ñоченото име на хоÑÑ‚"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Името или уÑлугата Ñа непознати"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+"Името на уÑлугата не Ñе поддържа за Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ гнездо („ai_socktype“)"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "поÑочването на вид гнездо („ai_socktype“) не Ñе поддържа"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "СиÑтемна грешка"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Буферът за аргументите е твърде малък"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "ЗаÑвката е в Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° изпълнение"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "ЗаÑвката е отменена"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "ЗаÑвката не е отменена"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Изпълнени Ñа вÑички заÑвки"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "ПрекъÑнат ÑÑŠÑ Ñигнал"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Ðеправилно кодиран низ на аргумент"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "ÐеизвеÑтна грешка"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: опциÑта „%s%s“ не е еднозначна\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: опциÑта „%s%s“ не е еднозначна. ВъзможноÑти:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: непозната Ð¾Ð¿Ñ†Ð¸Ñ â€ž%s%s“\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: опциÑта „%s%s“ Ñе използва без аргументи\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: опциÑта „%s%s“ изиÑква аргумент\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: неправилна Ð¾Ð¿Ñ†Ð¸Ñ â€” „%c“\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: опциÑта изиÑква аргумент — „%c“\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "текущата работна Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ може да Ñе запише"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не може да Ñе върне към първоначалната работна директориÑ"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "неуÑпешно изпълнение на „_open_osfhandle“"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"файловиÑÑ‚ деÑкриптор %d не може да Ñе възÑтанови: неуÑпешно изпълнение на "
+"функциÑта „dup2“"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "“"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "УÑпех"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "ÐÑма ÑъвпадениÑ"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ðеправилен регулÑрен израз"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ðеправилен знак за подредба"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ðеправилно име на ÐºÐ»Ð°Ñ Ð·Ð½Ð°Ñ†Ð¸"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Самотна „\\“ накраÑ"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ðеправилна препратка към Ñъвпадение"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "„[“, „[^“, „[:“, „[.“ или „[=“ без еш"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "„(“ или „\\(“ без еш"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "„\\{“ без еш"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ðеправилно Ñъдържание в „\\{\\}“"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ðеправилен край на диапазон"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Паметта Ñвърши"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "ПредхождащиÑÑ‚ регулÑрен израз е неправилен"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Ранен край на регулÑрен израз"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "РегулÑрниÑÑ‚ израз е прекалено голÑм"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "„)“ или „\\)“ без еш"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "ÐÑма предхождащ регулÑрен израз"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "не може да Ñе Ñъздаде програмен канал"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "дъщерниÑÑ‚ Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“ завърши неуÑпешно"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "дъщерен Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "дъщерниÑÑ‚ Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“ получи фатален Ñигнал %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "паметта е изчерпана"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "аргументът „%s“ на опциÑта „%s“ е неправилен"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "аргументът „%s“ на опциÑта „%s“ не е еднозначен"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Възможните аргументи Ñа:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "„ARGP_HELP_FMT“: ÑтойноÑтта %s е по-малка или равна на %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: параметърът „ARGP_HELP_FMT“ изиÑква ÑтойноÑÑ‚"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: непознат параметър „ARGP_HELP_FMT“"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Грешки в „ARGP_HELP_FMT“: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Ðргументите, задължителните или незадължителни за дългите опции, Ñа "
+#~ "Ñъответно задължителни или незадължителни и за кратките опции."
+
+#~ msgid "Usage:"
+#~ msgstr "Използване:"
+
+#~ msgid " or: "
+#~ msgstr " или: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [ОПЦИЯ…]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ð¹Ñ‚Ðµ „%s --help“ или „%s --usage“.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "Съобщавайте за програмни грешки на %s.\n"
+#~ "За грешки в българÑÐºÐ¸Ñ Ð¿Ñ€ÐµÐ²Ð¾Ð´ на <dict@fsa-bg.org>.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "извеждане на тази Ñправка"
+
+#~ msgid "give a short usage message"
+#~ msgstr "извеждане на кратко Ñъобщение за използването"
+
+#~ msgid "NAME"
+#~ msgstr "ИМЕ"
+
+#~ msgid "set the program name"
+#~ msgstr "задаване на името на програмата"
+
+#~ msgid "SECS"
+#~ msgstr "СЕКУÐДИ"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "Ñпиране за толкова СЕКУÐДИ (Ñтандартно е 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "извеждане на верÑиÑта на програмата"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ДЕФЕКТ Ð’ ПРОГРÐÐœÐТÐ) ÐеизвеÑтна верÑиÑ!"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Твърде много аргументи\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ДЕФЕКТ Ð’ ПРОГРÐÐœÐТÐ) ОпциÑта би Ñ‚Ñ€Ñбвало да е била разпозната!"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u побитови заделÑниÑ, оÑвободени Ñа %u (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u побитови задаваниÑ, кеширани Ñа %u (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u побитови изчиÑтваниÑ, кеширани Ñа %u (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u побитови проби, кеширани Ñа %u (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u побитови извежданиÑ\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "логаритмична хиÑтограма по брой\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "логаритмична хиÑтограма по размер\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "хиÑтограма по плътноÑÑ‚\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Побитова ÑтатиÑтика:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Ðатрупани Ð¸Ð·Ð¿ÑŠÐ»Ð½ÐµÐ½Ð¸Ñ = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "файлът ÑÑŠÑ ÑтатиÑтиките не може да Ñе прочете"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "неправилен размер на файла ÑÑŠÑ ÑтатиÑтиките\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "файлът ÑÑŠÑ ÑтатиÑтиките не може да Ñе запише"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "файлът ÑÑŠÑ ÑтатиÑтиките не може да Ñе отвори за запиÑ"
+
+#~ msgid "program error"
+#~ msgstr "програмна грешка"
+
+#~ msgid "stack overflow"
+#~ msgstr "препълване на Ñтека"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "липÑва временна директориÑ, пробвайте да укажете такава в променливата "
+#~ "„TMPDIR“"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "не може да Ñе Ñъздаде временна Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾ шаблона „%s“"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "временниÑÑ‚ файл „%s“ не може да Ñе изтрие"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "временната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ â€ž%s“ не може да Ñе изтрие"
+
+#~ msgid "error closing file"
+#~ msgstr "грешка при затварÑне на файл"
+
+#~ msgid "write error"
+#~ msgstr "грешка при запиÑ"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "запазване на правата за „%s“"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "„%s“ не може да Ñе отвори за четене"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "резервниÑÑ‚ файл „%s“ не може да Ñе отвори за запиÑ"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "грешка при четене на „%s“"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "грешка при запиÑа на „%s“"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "грешка Ñлед четене на „%s“"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "неуÑпешно отварÑне Ñ â€žfdopen()“"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "ЛипÑва компилатор за C#, инÑталирайте „mono“"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "ЛипÑва виртуална машина за C#, инÑталирайте „mono“"
+
+#~ msgid "unbalanced ["
+#~ msgstr "„[“ без еш"
+
+#~ msgid "invalid character class"
+#~ msgstr "неправилен ÐºÐ»Ð°Ñ Ð·Ð½Ð°Ñ†Ð¸"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "ÐºÐ»Ð°Ñ Ð·Ð½Ð°Ñ†Ð¸ Ñе указва чрез „[[:ИМЕ:]]“, а не „[:ИМЕ:]“"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "незавършена екранираща поÑледователноÑÑ‚ чрез „\\“"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "неправилно Ñъдържание в „\\{\\}“"
+
+#~ msgid "regular expression too big"
+#~ msgstr "прекалено голÑм регулÑрен израз"
+
+#~ msgid "unbalanced ("
+#~ msgstr "„(“ без еш"
+
+#~ msgid "no syntax specified"
+#~ msgstr "не е зададен ÑинтакÑиÑ"
+
+#~ msgid "unbalanced )"
+#~ msgstr "„)“ без еш"
+
+#~ msgid "regular empty file"
+#~ msgstr "празен, обикновен файл"
+
+#~ msgid "regular file"
+#~ msgstr "обикновен файл"
+
+#~ msgid "directory"
+#~ msgstr "директориÑ"
+
+#~ msgid "symbolic link"
+#~ msgstr "Ñимволна връзка"
+
+#~ msgid "message queue"
+#~ msgstr "опашка за ÑъобщениÑ"
+
+#~ msgid "semaphore"
+#~ msgstr "Ñемафор"
+
+#~ msgid "shared memory object"
+#~ msgstr "Ñподелен обект в паметта"
+
+#~ msgid "typed memory object"
+#~ msgstr "типов обект в паметта"
+
+#~ msgid "block special file"
+#~ msgstr "блоков Ñпециален файл"
+
+#~ msgid "character special file"
+#~ msgstr "знаков Ñпециален Ñайт"
+
+#~ msgid "contiguous data"
+#~ msgstr "поÑледователни данни"
+
+#~ msgid "fifo"
+#~ msgstr "програмен канал"
+
+#~ msgid "door"
+#~ msgstr "порта"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "мултиплекÑиран блоков Ñпециален файл"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "мултиплекÑиран знаков Ñпециален файл"
+
+#~ msgid "multiplexed file"
+#~ msgstr "мултиплекÑиран файл"
+
+#~ msgid "named file"
+#~ msgstr "именован файл"
+
+#~ msgid "network special file"
+#~ msgstr "мрежов Ñпециален файл"
+
+#~ msgid "migrated file with data"
+#~ msgstr "мигриран файл Ñ Ð´Ð°Ð½Ð½Ð¸"
+
+#~ msgid "migrated file without data"
+#~ msgstr "мигриран файл без данни"
+
+#~ msgid "port"
+#~ msgstr "порт"
+
+#~ msgid "socket"
+#~ msgstr "гнездо"
+
+#~ msgid "whiteout"
+#~ msgstr "припокриващо изтриване"
+
+#~ msgid "weird file"
+#~ msgstr "Ñтранен файл"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr ""
+#~ "неправилен аргумент „source_version“ за верÑиÑта на кода към командата "
+#~ "„compile_java_class“"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr ""
+#~ "неправилен аргумент „target_version“ за верÑиÑта на целта към командата "
+#~ "„compile_java_class“"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "„%s“ не може да Ñе Ñъздаде"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "грешка при запиÑа на „%s“"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "ЛипÑва компилатор за Java, инÑталирайте „gcj“ или задайте такъв Ñ "
+#~ "променливата „JAVAC“"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "ЛипÑва виртуална машина за Java, инÑталирайте „gcj“ или задайте такава Ñ "
+#~ "променливата „JAVA“"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s: вх./изх. грешка в дъщерен процеÑ"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "не може да Ñе получи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÑÑŠÑ â€žstat“ за „%s“"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "правата за доÑтъп до „%s“ не може да Ñе ÑменÑÑ‚"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "директориÑта „%s“ не може да Ñе Ñъздаде"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "„/dev/zero“ не може да Ñе отвори за запиÑ"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "неуÑпешно Ñъздаване на четÑща нишка"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "не може да Ñе зададе вх./изх. без блокиране за подпроцеÑа „%s“"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "неуÑпешна ÐºÐ¾Ð¼ÑƒÐ½Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð´ÑŠÑ‰ÐµÑ€Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "неуÑпешен Ð·Ð°Ð¿Ð¸Ñ ÐºÑŠÐ¼ Ð´ÑŠÑ‰ÐµÑ€Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "неуÑпешно четене от Ð´ÑŠÑ‰ÐµÑ€Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑ â€ž%s“"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "подпроцеÑÑŠÑ‚ „%s“ завърши Ñ ÐºÐ¾Ð´ за ÑÑŠÑтоÑние %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "неуÑпешно Ñъздаване н нишки"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "подпроцеÑÑŠÑ‚ на „%s“ завърши Ñ ÐºÐ¾Ð´ за ÑÑŠÑтоÑние %d\""
+
+# RECHECK
+#~ msgid "^[yY]"
+#~ msgstr "^[yYдДщЩ]"
+
+# RECHECK
+#~ msgid "^[nN]"
+#~ msgstr "^[nNнÐÑ…Ð¥]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "задаване на права на „%s“"
+
+#~ msgid "Hangup"
+#~ msgstr "ПрекъÑване на връзката"
+
+#~ msgid "Interrupt"
+#~ msgstr "ПрекъÑване"
+
+#~ msgid "Quit"
+#~ msgstr "Спиране"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Ðеправилна инÑтрукциÑ"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "ПрекъÑване за траÑиране"
+
+#~ msgid "Aborted"
+#~ msgstr "ПреуÑтановÑване"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Изключение от плаваща запетаÑ"
+
+#~ msgid "Killed"
+#~ msgstr "Убит"
+
+#~ msgid "Bus error"
+#~ msgstr "Грешка в шината"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Грешка в разделÑнето"
+
+#~ msgid "Broken pipe"
+#~ msgstr "ПрекъÑнат програмен канал"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Ðларма"
+
+#~ msgid "Terminated"
+#~ msgstr "Прекратен"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Спешно вх./изх. ÑÑŠÑтоÑние"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "СпрÑн (Ñигнал)"
+
+#~ msgid "Stopped"
+#~ msgstr "СпрÑн"
+
+#~ msgid "Continued"
+#~ msgstr "Продължен"
+
+#~ msgid "Child exited"
+#~ msgstr "ПреуÑтановен дъщерен процеÑ"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Спиране (вход от tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Спиране (изход към tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Възможен вх./изх."
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Ðадвишаване на процеÑорното време"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Ðадвишаване на размера на файл"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Изтекъл виртуален таймер"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Изтекъл профилиращ таймер"
+
+#~ msgid "Window changed"
+#~ msgstr "Преоразмерен прозорец"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "ПотребителÑки Ñигнал 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "ПотребителÑки Ñигнал 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Емулирана инÑтрукциÑ"
+
+#~ msgid "Bad system call"
+#~ msgstr "Грешно ÑиÑтемно извикване"
+
+#~ msgid "Stack fault"
+#~ msgstr "Грешка в разделÑнето"
+
+#~ msgid "Information request"
+#~ msgstr "ЗаÑвка за информациÑ"
+
+#~ msgid "Power failure"
+#~ msgstr "Проблем в захранването"
+
+#~ msgid "Resource lost"
+#~ msgstr "Загубен реÑурÑ"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "грешка при Ð·Ð°Ð¿Ð¸Ñ Ð²ÑŠÐ² вече затворен програмен канал или гнездо"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Сигнал за реално време %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Ðепознат Ñигнал %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Време за изпълнение [Ñекунди]"
+
+#~ msgid "CPU user"
+#~ msgstr "потребителÑко време"
+
+#~ msgid "CPU system"
+#~ msgstr "ÑиÑтемно време"
+
+#~ msgid "wall clock"
+#~ msgstr "общо време"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "функциÑта „iconv“ е неизползваема"
+
+#~ msgid "iconv function not available"
+#~ msgstr "функциÑта „iconv“ е недоÑтъпна"
+
+#~ msgid "character out of range"
+#~ msgstr "знак извън диапазона"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "„U+%04X“ не може да Ñе конвертира в локалното кодиране"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "„U+%04X“ не може да Ñе конвертира в локалното кодиране: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "неÑъщеÑтвуващ потребител"
+
+#~ msgid "invalid group"
+#~ msgstr "неÑъщеÑтвуваща група"
+
+#~ msgid "invalid spec"
+#~ msgstr "неправилна ÑпецификациÑ"
+
+#~ msgid "unable to display error message"
+#~ msgstr "Ñъобщението за грешка не може да Ñе изведе"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Пакетирано от %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Пакетирано от %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Лиценз — Общ публичен лиценз на GNU (GNU GPL), както е публикуван от "
+#~ "ФондациÑта\n"
+#~ "за Ñвободен Ñофтуер — верÑÐ¸Ñ 3 на лиценза или (по ваше решение) по-къÑна "
+#~ "верÑиÑ.\n"
+#~ "<%s>\n"
+#~ "Тази програма е Ñвободен Ñофтуер. Можете да Ñ Ñ€Ð°Ð·Ð¿Ñ€Ð¾ÑтранÑвате и/или "
+#~ "променÑте.\n"
+#~ "Ð¢Ñ Ñе разпроÑтранÑва БЕЗ ÐИКÐКВИ ГÐРÐÐЦИИ доколкото е позволено от "
+#~ "закона.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Създадено от %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Създадено от %s и %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Създадено от %s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Създадено от %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s и др.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Докладвайте грешки в програмата на адреÑ: %s\n"
+#~ "Докладвайте грешки в превода на адреÑ: <dict@ludost.net>\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Докладвайте грешки в „%s“ на адреÑ: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Уеб Ñтраница на „%s“: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Обща помощ за програмите на GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "неуÑпешно задаване на вид на файла като текÑтов/двоичен"
+
+#~ msgid "stdin"
+#~ msgstr "Ñтандартен вход"
+
+#~ msgid "stdout"
+#~ msgstr "Ñтандартен изход"
+
+#~ msgid "stderr"
+#~ msgstr "Ñтандартна грешка"
+
+#~ msgid "unknown stream"
+#~ msgstr "непознат поток"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "файлът „%s“ не може да Ñе отвори наново Ñ Ñ€ÐµÐ¶Ð¸Ð¼ „%s“"
+
+#~ msgid "string comparison failed"
+#~ msgstr "неуÑпешно Ñравнение на низове"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Използвайте „LC_ALL='C'“, за да заобиколите този проблем."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "СравнÑваните низове бÑха %s и %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "невъзможно форматиране на изхода"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "Ñтандартни файлови деÑкриптори"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "неправилен аргумент „%3$s“ за опциÑта „%1$s%2$s“"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "неправилен ÑÑƒÑ„Ð¸ÐºÑ Ð² аргумента „%3$s“ за опциÑта „%1$s%2$s“"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "прекалено дълъг аргумент „%3$s“ за опциÑта „%1$s%2$s“"
diff --git a/gnulib_po/boldquot.sed b/gnulib_po/boldquot.sed
new file mode 100644
index 0000000..4b937aa
--- /dev/null
+++ b/gnulib_po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
+s/“/“/g
+s/â€/â€/g
+s/‘/‘/g
+s/’/’/g
diff --git a/gnulib_po/ca.gmo b/gnulib_po/ca.gmo
new file mode 100644
index 0000000..486952e
--- /dev/null
+++ b/gnulib_po/ca.gmo
Binary files differ
diff --git a/gnulib_po/ca.po b/gnulib_po/ca.po
new file mode 100644
index 0000000..27988c1
--- /dev/null
+++ b/gnulib_po/ca.po
@@ -0,0 +1,651 @@
+# GNU Mailutils Catalan translation.
+# Copyright © 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the mailutils package.
+# Jordi Mallach <jordi@gnu.org>, 2002, 2003, 2004, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: mailutils 0.6.90\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2005-05-21 04:10+0200\n"
+"Last-Translator: Jordi Mallach <jordi@gnu.org>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "S'ha produït un error desconegut del sistema"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "els fitxers FIFO no són suportats"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "els fitxers FIFO no són suportats"
+
+#: lib/gai_strerror.c:62
+#, fuzzy
+msgid "Memory allocation failure"
+msgstr "L'operació ha fallat"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "els fitxers FIFO no són suportats"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "error d'escriptura"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+#, fuzzy
+msgid "Request canceled"
+msgstr "No es troba l'element sol·licitat"
+
+#: lib/gai_strerror.c:72
+#, fuzzy
+msgid "Request not canceled"
+msgstr "No es troba l'element sol·licitat"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "S'ha produït un error desconegut del sistema"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: l'opció «%s» és ambigua\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: l'opció «%s» és ambigua\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: l'opció «%c%s» no es reconeix\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: l'opció «%c%s» no accepta arguments\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: l'opció «%s» requereix un argument\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: l'opció no és vàlida -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: l'opció requereix un argument -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "openat: no s'ha pogut registrar el directori de treball actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "no s'ha pogut tornar al directori inicial de treball"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: l'expressió regular no és vàlida: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "la classe de caràcters «%s» no és vàlida"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "la classe de caràcters «%s» no és vàlida"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+#, fuzzy
+msgid "Invalid back reference"
+msgstr "El número no és vàlid"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+#, fuzzy
+msgid "Invalid content of \\{\\}"
+msgstr "L'opció no és vàlida -- %s"
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "el rang de pàgines no és vàlid: «%s»"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "la memòria s'ha exhaurit"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: l'expressió regular no és vàlida: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "error en la recerca de l'expressió regular"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: l'expressió regular no és vàlida: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "error en la recerca de l'expressió regular"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "No es pot crear la llista"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ha fallat el desplaçament"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: ha fallat el desplaçament"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: ha fallat el desplaçament"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "la memòria s'ha exhaurit"
+
+# Usa quote() en els 2 args. ivb
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "l'argument %s no és vàlid per %s"
+
+# Usa quote() en els 2 args. ivb
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "l'argument %s és ambigu per %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Els arguments vàlids són:"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: El paràmetre ARGP_HELP_FMT requereix un valor"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: El paràmetre d'ARGP_HELP_FMT és desconegut"
+
+# pfft, escombraries... jm
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Hi ha escombraries en ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Els arguments necessaris o opcionals per a les opcions llargues també són "
+#~ "necessaris o opcionals per a qualsevol opció curta corresponent."
+
+#~ msgid "Usage:"
+#~ msgstr "Forma d'ús:"
+
+#~ msgid " or: "
+#~ msgstr " ó: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPCIÓ...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Proveu «%s --help» o «%s --usage» per a obtindre més informació.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Informeu dels errors a %s.\n"
+
+#~ msgid "Give this help list"
+#~ msgstr "Mostra aquesta llista d'ajuda"
+
+#~ msgid "Give a short usage message"
+#~ msgstr "Mostra un curt missatge sobre l'ús"
+
+#~ msgid "NAME"
+#~ msgstr "NOM"
+
+#~ msgid "Set the program name"
+#~ msgstr "Estableix el nom del programa"
+
+#, fuzzy
+#~ msgid "SECS"
+#~ msgstr "SEGONS"
+
+#~ msgid "Hang for SECS seconds (default 3600)"
+#~ msgstr "Penja durant SEGS segons (per defecte 3600)"
+
+#~ msgid "Print program version"
+#~ msgstr "Mostra la versió del programa"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ERROR DEL PROGRAMA) Cap versió coneguda!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Massa arguments\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ERROR DEL PROGRAMA) L'opció s'hauria d'haver reconegut!?"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "error de lectura"
+
+# "underflow", bonico el paraulo.. jm
+#, fuzzy
+#~ msgid "stack overflow"
+#~ msgstr "pila buida"
+
+#~ msgid "write error"
+#~ msgstr "error d'escriptura"
+
+# Usa quote(). ivb
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "no s'ha pogut obrir %s per llegir"
+
+# Usa quote(). ivb
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "no s'ha pogut obrir %s per a escriure"
+
+# uniq no usa quote(). ivb
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "error en llegir %s"
+
+# uniq no usa quote(). ivb
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "error en escriure %s"
+
+# uniq no usa quote(). ivb
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "error en llegir %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "no s'ha pogut obrir"
+
+#~ msgid "regular empty file"
+#~ msgstr "fitxer ordinari buit"
+
+#~ msgid "regular file"
+#~ msgstr "fitxer ordinari"
+
+#~ msgid "directory"
+#~ msgstr "directori"
+
+#~ msgid "block special file"
+#~ msgstr "fitxer especial de blocs"
+
+#~ msgid "character special file"
+#~ msgstr "fitxer especial de caràcters"
+
+#~ msgid "fifo"
+#~ msgstr "cua FIFO"
+
+#~ msgid "symbolic link"
+#~ msgstr "enllaç simbòlic"
+
+#~ msgid "socket"
+#~ msgstr "connector"
+
+#~ msgid "message queue"
+#~ msgstr "cua de missatges"
+
+#~ msgid "semaphore"
+#~ msgstr "semàfor"
+
+#~ msgid "shared memory object"
+#~ msgstr "objecte de memòria compartida"
+
+#~ msgid "typed memory object"
+#~ msgstr "objecte de memòria amb tipus"
+
+#~ msgid "weird file"
+#~ msgstr "fitxer estrany"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opció «--%s» no accepta arguments\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: l'opció «--%s» no es reconeix\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: l'opció és il·legal -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: l'opció «-W %s» és ambigua\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opció «-W %s» no accepta arguments\n"
+
+# FIXME: xmalloc.h: _STRTOL_ERROR lacks i18n. ivb
+# Açò quedarà com «invalid mida de bloc `MIDA'» mentre no ho facen. ivb
+#~ msgid "block size"
+#~ msgstr "mida de bloc"
+
+# Els 4 usen quote(). ivb
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s existeix però no és un directori"
+
+# Els 3 usen quote(). ivb
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "no s'ha pogut canviar el propietari o grup de %s"
+
+# Els 3 usen quote(). ivb
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "no s'ha pogut crear el directori %s"
+
+# Usa quote(). ivb
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "no s'ha pogut canviar al directori %s"
+
+# Els 2 usen quote(). ivb
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "no s'han pogut canviar els permisos de %s"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "%s: no s'ha pogut obrir per a escriure"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[sS]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "la funció iconv() no és útil"
+
+#~ msgid "iconv function not available"
+#~ msgstr "la funció iconv() no es troba disponible"
+
+#~ msgid "character out of range"
+#~ msgstr "el caràcter es troba fora del rang"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "no s'ha pogut convertir U+%04X al joc de caràcters local: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "l'usuari no és vàlid"
+
+#~ msgid "invalid group"
+#~ msgstr "el grup no és vàlid"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "no s'ha pogut obtenir el grup d'entrada d'un UID numèric"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Aquest és programari lliure; podeu redistribuir-lo i/o modificar-lo sota "
+#~ "els\n"
+#~ "termes de la Llicència Pública General GNU tal i com ha estat publicada "
+#~ "per la\n"
+#~ "Free Software Foundation; bé sota la versió 2 de la Llicència o bé (si "
+#~ "ho\n"
+#~ "preferiu) sota qualsevol versió posterior.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Escrit per %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Escrit per %s i %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Escrit per %s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s\n"
+#~ "i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s, %s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Escrit per %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s i d'altres.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "ha fallat la comparació de cadenes"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Establiu la variable LC_ALL a «C» per evitar el problema."
+
+# Usa quote() en les 2. ivb
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Les cadenes comparades eren %s i %s."
diff --git a/gnulib_po/cs.gmo b/gnulib_po/cs.gmo
new file mode 100644
index 0000000..0d09340
--- /dev/null
+++ b/gnulib_po/cs.gmo
Binary files differ
diff --git a/gnulib_po/cs.po b/gnulib_po/cs.po
new file mode 100644
index 0000000..ba207db
--- /dev/null
+++ b/gnulib_po/cs.po
@@ -0,0 +1,889 @@
+# Czech translations for GNU textutils
+# This file is distributed under the same license as the gnulib package.
+# Copyright (C) 1996 Free Software Foundation, Inc.
+#
+# Vladimir Michl <Vladimir.Michl@seznam.cz>, 1996.
+# Marek Černocký <marek@manet.cz>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-12-04 08:50+0100\n"
+"Last-Translator: Marek Černocký <marek@manet.cz>\n"
+"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Neznámá chyba systému"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Pro název poÄítaÄe není rodina adres podporována"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "DoÄasné selhání pÅ™i pÅ™ekladu názvu"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Špatná hodnota pro příznaky ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Nenapravitelné selhání při překladu názvu"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family není podporována"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Selhalo přidělení paměti"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "K názvu poÄítaÄe není pÅ™iÅ™azena žádná adresa"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Název nebo služba nejsou známy"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Název služby není podporován pro ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype není podporován"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Chyba systému"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Vyrovnávací paměť argumentů je příliš malá"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Probíhá zpracování požadavku"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Požadavek byl zrušen"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Požadavek nebyl zrušen"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "VÅ¡echny požadavky dokonÄeny"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Přerušeno signálem"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Řetězec s parametry není správně kódován"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Neznámá chyba"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: pÅ™epínaÄ â€ž-W %s“ není jednoznaÄný\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: pÅ™epínaÄ â€ž%s“ není jednoznaÄný; možnosti:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: neznámý pÅ™epínaÄ â€ž%c%s“\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: pÅ™epínaÄ â€ž%c%s“ musí být zadán bez argumentu\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: pÅ™epínaÄ â€ž--%s“ vyžaduje argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: neplatný pÅ™epínaÄ -- „%c“\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: pÅ™epínaÄ vyžaduje argument -- „%c“\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nelze zaznamenat aktuální pracovní složku"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "selhalo vrácení poÄáteÄní pracovní složky"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "selhala funkce _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "nelze obnovit fd %d: selhala funkce dup2"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "“"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Úspěch"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Žádná shoda"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "neplatný regulární výraz"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "neplatný znak pro porovnávání"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "neplatný název třídy znaku"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Zpětné lomítko na konci"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Neplatný zpětný odkaz"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Chybí odpovídající závorka k [ nebo [^"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Chybí odpovídající závorka k ( nebo \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Chybí odpovídající závorka k \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Neplatný obsah \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Neplatný konec rozsahu"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Paměť byla vyÄerpána"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Neplatný předchozí regulární výraz"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "PÅ™edÄasný konec regulárního výrazu"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regulární výraz je příliš velký"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Chybí odpovídající závorka k ) nebo \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Žádný předchozí regulární výraz"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "nelze vytvořit rouru"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "selhal podřízený proces %s"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "podřízený proces %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "podřízený proces %s obdržel kritický signál %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "paměť byla vyÄerpána"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argument %s je pro %s neplatný"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argument %s je pro %s nejednoznaÄný"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Platné argumenty jsou:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: hodnota %s je menší nebo rovna %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: Parametr ARGP_HELP_FMT vyžaduje hodnotu"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: Parametr ARGP_HELP_FMT musí být kladný"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Neznámý parametr ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Nesmysly v ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Povinné Äi volitelné, argumenty pro dlouhé pÅ™epínaÄe jsou povinné Äi "
+#~ "volitelné, i pro případné odpovídající krátké pÅ™epínaÄe."
+
+#~ msgid "Usage:"
+#~ msgstr "Použití:"
+
+#~ msgid " or: "
+#~ msgstr " nebo:"
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [PŘEPÃNAČ…]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Více informací získáte příkazem „%s --help“ nebo „%s --usage“.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Chyby hlaste na %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "poskytne tuto přehledovou nápovědu"
+
+#~ msgid "give a short usage message"
+#~ msgstr "poskytne struÄnou informaci o používání"
+
+#~ msgid "NAME"
+#~ msgstr "NÃZEV"
+
+#~ msgid "set the program name"
+#~ msgstr "nastavit název programu"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "zastavit na SEK sekund (výchozí je 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "vypsat verzi programu"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(CHYBA PROGRAMU) Neznámá verze!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Příliš mnoho argumentů\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(CHYBA PROGRAMU) MÄ›l by být rozpoznán pÅ™epínaÄ!?"
+
+#~ msgid "program error"
+#~ msgstr "chyba programu"
+
+#~ msgid "stack overflow"
+#~ msgstr "pÅ™eteÄení zásobníku"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "nelze najít doÄasnou složku, zkusí se nastavit $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "nelze vytvoÅ™it doÄasnou složku pomocí Å¡ablony „%s“"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "nelze odstranit doÄasný soubor %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "nelze odstranit doÄasnou složku %s"
+
+#~ msgid "error closing file"
+#~ msgstr "chyba při zavírání souboru"
+
+#~ msgid "write error"
+#~ msgstr "chyba při zápisu"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "zachování práv k souboru %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "chyba pÅ™i otevírání souboru „%s“ pro Ätení"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "nelze otevřít záložní soubor „%s“ pro zápis"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "chyba pÅ™i Ätení souboru „%s“"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "chyba při zápisu do souboru „%s“"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "chyba po pÅ™eÄtení souboru „%s“"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "selhala funkce fdopen()"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "PÅ™ekladaÄ C# nebyl nalezen, zkuste nainstalovat pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "Virtuální stroj C# nebyl nalezen, zkuste nainstalovat pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "prázdný běžný soubor"
+
+#~ msgid "regular file"
+#~ msgstr "běžný soubor"
+
+#~ msgid "directory"
+#~ msgstr "složka"
+
+#~ msgid "block special file"
+#~ msgstr "speciální soubor blokového zařízení"
+
+#~ msgid "character special file"
+#~ msgstr "speciální soubor znakového zařízení"
+
+#~ msgid "fifo"
+#~ msgstr "fronta fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolický odkaz"
+
+#~ msgid "socket"
+#~ msgstr "soket"
+
+#~ msgid "message queue"
+#~ msgstr "fronta zpráv"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "sdílený paměťový objekt"
+
+#~ msgid "typed memory object"
+#~ msgstr "typový paměťový objekt"
+
+#~ msgid "weird file"
+#~ msgstr "podivný soubor"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž--%s“ musí být zadán bez argumentu\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: neznámý pÅ™epínaÄ â€ž--%s“\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž-W %s“ musí být zadán bez argumentu\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž-W %s“ vyžaduje argument\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "neplatný argument source_version pro compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "neplatný argument target_version pro compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "selhalo vytvoření „%s“"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "chyba při zápisu souboru „%s“"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "PÅ™ekladaÄ jazyka Java nebyl nalezen, zkuste nainstalovat gcj nebo "
+#~ "nastavit proměnnou $JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Virtuální stroj Java nebyl nalezen, zkuste nainstalovat gij nebo nastavit "
+#~ "proměnnou $JAVAC"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "V/V chyba podřízeného procesu %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "nelze změnit oprávnění k %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "nelze vytvořit složku %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Selhalo otevÅ™ení /dev/zero pro Ätení"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "vytvoÅ™ení Ätecího vlákna selhalo"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "nelze nastavit neblokující V/V pro podřízený proces %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "komunikace s podřízeným procesem %s selhala"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "zápis do podřízeného procesu %s selhal"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "Ätení z podřízeného procesu %s selhalo"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "podřízený proces %s byl ukonÄen s návratovým kódem %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "vytvoření vlákna selhalo"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "podřízený proces %s byl ukonÄen s návratovým kódem %d"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Franc, ois Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[aAyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "nastavení oprávnění k %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Zavěsit"
+
+#~ msgid "Interrupt"
+#~ msgstr "Přerušení"
+
+#~ msgid "Quit"
+#~ msgstr "UkonÄit"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Neplatná instrukce"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Krokování/bod přerušení"
+
+#~ msgid "Aborted"
+#~ msgstr "Přerušen"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Výjimka ve výpoÄtu s plovoucí Äárkou"
+
+#~ msgid "Killed"
+#~ msgstr "Zabit"
+
+#~ msgid "Bus error"
+#~ msgstr "Chyba sběrnice"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Porušení ochrany paměti"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Porušená roura"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Alarm od hodin"
+
+#~ msgid "Terminated"
+#~ msgstr "UkonÄen"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Urgentní stav V/V"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Pozastavit (signál)"
+
+#~ msgid "Stopped"
+#~ msgstr "Pozastaven"
+
+#~ msgid "Continued"
+#~ msgstr "PokraÄuje"
+
+#~ msgid "Child exited"
+#~ msgstr "Potomek skonÄil"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Pozastaven (vstup tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Pozastaven (výstup tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Možný V/V"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "PÅ™ekroÄeno Äasové omezení procesoru"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "PÅ™ekroÄeno omezení velikosti souboru"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuální ÄasovaÄ dobÄ›hl"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profilovací ÄasovaÄ dobÄ›hl"
+
+#~ msgid "Window changed"
+#~ msgstr "Změnilo se okno"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Uživatelsky definovaný signál 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Uživatelsky definovaný signál 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Krokování emulátoru (EMT)"
+
+#~ msgid "Bad system call"
+#~ msgstr "Chybné systémové volání"
+
+#~ msgid "Stack fault"
+#~ msgstr "Porušení zásobníku"
+
+#~ msgid "Information request"
+#~ msgstr "Žádost o informace"
+
+#~ msgid "Power failure"
+#~ msgstr "Selhalo napájení"
+
+#~ msgid "Resource lost"
+#~ msgstr "Prostředek přestal být k dispozici"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "chyba zápisu do zavřené roury nebo soketu"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Signál reálného Äasu %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Neznámý signál %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "funkce iconv není použitelná"
+
+#~ msgid "iconv function not available"
+#~ msgstr "funkce iconv není dostupná"
+
+#~ msgid "character out of range"
+#~ msgstr "znak je mimo rozsah"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "znak U+%04X nelze převést do místní znakové sady"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "znak U+%04X nelze převést do místní znakové sady: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "neplatný uživatel"
+
+#~ msgid "invalid group"
+#~ msgstr "neplatná skupina"
+
+#~ msgid "invalid spec"
+#~ msgstr "neplatné zadání"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "nelze zobrazit chybovou zprávu"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Zabalil %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Zabalil %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Licence GPLv3+: GNU GPL verze 3 nebo novější <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "Jde o svobodný software: můžete jej volně měnit a šířit.\n"
+#~ "Nejsou poskytovány ŽÃDNÉ ZÃRUKY, mimo tÄ›ch daných zákonem.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Napsal %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Napsali %s a %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Napsali %s, %s a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s\n"
+#~ "a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s, %s a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s, %s, %s a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s a %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Napsali %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s a další.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Chyby balíÄku %s hlaste na: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Domovská stránka projektu %s: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Domovská stránka projektu %s: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Obecná nápověda k používání softwaru GNU: <http://www.gnu.org/gethelp/>\n"
+
+#~ msgid "stdin"
+#~ msgstr "standardní vstup"
+
+#~ msgid "stdout"
+#~ msgstr "standardní výstup"
+
+#~ msgid "stderr"
+#~ msgstr "standardní chybový výstup"
+
+#~ msgid "unknown stream"
+#~ msgstr "neznámý proud"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "selhalo opětovné otevření %s v režimu %s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "selhalo porovnání řetězců"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Problém obejdete nastavením LC_ALL='C'."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Porovnávané řetězce byly %s a %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "nelze provést formátovaný výstup"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "neplatný argument „%3$s“ pro %1$s%2$s"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "neplatná přípona v argumentu „%3$s“ pro %1$s%2$s"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "argument „%3$s“ pro %1$s%2$s je příliš velký"
diff --git a/gnulib_po/da.gmo b/gnulib_po/da.gmo
new file mode 100644
index 0000000..3a6099c
--- /dev/null
+++ b/gnulib_po/da.gmo
Binary files differ
diff --git a/gnulib_po/da.po b/gnulib_po/da.po
new file mode 100644
index 0000000..3590551
--- /dev/null
+++ b/gnulib_po/da.po
@@ -0,0 +1,893 @@
+# Danish messages for gnulib.
+# Copyright © 1997, 2002, 2003, 2004, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Peter Antman <peter.antman@abc.se>, 1997.
+# Thomas Olsson <cid95tho@lustudat.student.lu.se>, 1997.
+# Daniel Resare <daniel@resare.com>, 1999, 2000.
+# Göran Uddeborg <goeran@uddeborg.se>, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010.
+# Keld Simonsen <keld@keldix.com>, 2011
+#
+# $Revision: 1.8 $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-01-20 22:11+0100\n"
+"Last-Translator: Keld Simonsen <keld@keldix.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ukendt systemfejl"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Adressefamilien for værtsnavnet understøttes ikke"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Midlertidig fejl i navneopslag"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Fejlagtig værdi for ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Ureparérbar fejl i navneopslag"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family understøttes ikke"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Hukommelsesallokeringsfejl"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Ingen adresse associeret med værtsnavnet"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Navn eller tjeneste ikke kendt"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname understøttes ikke for ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype understøttes ikke"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Systemfejl"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumentbufferen for lille"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Bearbejder pågående anmodning"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Anmodning annuleret"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Anmodning ikke annuleret"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Alle anmodninger udført"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Afbrudt af et signal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parameterstreng ikke korrekt kodet"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Ukendt fejl"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: flaget '%s' er flertydigt\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: flaget '%s' er flertydigt\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: ukendt flag '%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: flaget '%c%s' tager intet argument\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: flaget '%s' kræver et argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ugyldig flag -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: flaget kræver et argument -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan ikke notere aktuelt arbejdskatalog"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kunne ikke gå tilbage til det oprindelige arbejdskatalog"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle mislykkedes"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan ikke genskabe fb %d: dup2 mislykkedes"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "'"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Lykkedes"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Ingen træffer"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Fejlagtigt regulært udtryk"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ugyldigt sorteringstegn"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ugyldigt tegnklassenavn"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Afsluttende baglæns skråstreg"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ugyldig bagudreference"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ensomt [ eller [^"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ensomt ( eller \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ensomt \\\\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ugyldigt indhold i \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ugyldigt intervalslut"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Hukommelse opbrugt"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Fejlagtigt foregående regulært udtryk"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "For tidlig afslutning af regulært udtryk"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "For stort regulært udtryk"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ensomt ) eller \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Intet foregående regulært udtryk"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "kan ikke oprette datakanal"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-underproces mislykkedes"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s-underproces"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s-underproces fik ødelæggende signal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "hukommelsen opbrugt"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "Ugyldigt argument %s til %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "flertydigt argument %s til %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "gyldige argumenter er:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: værdien på %s er mindre end eller lig med %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parameteren kræver en værdi"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parameteren skal være positiv"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Ukendt ARGP_HELP_FMT-parameter"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Snavs i ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Obligatoriske eller valgfrie argumenter til lange flag er også "
+#~ "obligatoriske eller valgfrie for tilsvarende korte flag."
+
+#~ msgid "Usage:"
+#~ msgstr "Brug:"
+
+#~ msgid " or: "
+#~ msgstr " eller: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [FLAG...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Forsøg med '%s --help' eller '%s --usage' for mere information.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "Rapportér fejl til %s.\n"
+#~ "Send synspunkter på oversættelsen til <dansk@dansk-gruppen.dk>\n"
+
+#~ msgid "give this help list"
+#~ msgstr "giv denne hjælpeliste"
+
+#~ msgid "give a short usage message"
+#~ msgstr "giv en kort meddelelse om brug"
+
+#~ msgid "NAME"
+#~ msgstr "NAVN"
+
+#~ msgid "set the program name"
+#~ msgstr "angiv progravnavnet"
+
+#~ msgid "SECS"
+#~ msgstr "S"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "hæng i S sekunder (som standard 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "udskriv programversion"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMFEJL) Ingen version kendt!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: For mange argumenter\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMFEJL) Flaget burde være blevet genkendt!?"
+
+#~ msgid "program error"
+#~ msgstr "programfejl"
+
+#~ msgid "stack overflow"
+#~ msgstr "stakoverløb"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "kan ikke finde et temporært katalog, forsøg at sætte $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "kan ikke oprette et temporært katalog ved brug af skabelonen '%s'"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "kan ikke fjerne temporær fil %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "kan ikke fjerne temporært katalog %s"
+
+#~ msgid "error closing file"
+#~ msgstr "fejl ved lukning af fil"
+
+#~ msgid "write error"
+#~ msgstr "skrivefejl"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "bevarer rettigheder på %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "fejl ved åbning af '%s' for læsning"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "kan ikke åbne sikkerhedskopifil '%s' for skrivning"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "fejl ved læsning af '%s'"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "fejl ved skrivning af '%s'"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "fejl efter læsning af '%s'"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() mislykkedes"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "C#-oversætter ikke fundet, forsøg at installere pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "virtuel C#-maskine ikke fundet, forsøg at installere pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "tom normal fil"
+
+#~ msgid "regular file"
+#~ msgstr "normal fil"
+
+#~ msgid "directory"
+#~ msgstr "katalog"
+
+#~ msgid "block special file"
+#~ msgstr "blokspecialfil"
+
+#~ msgid "character special file"
+#~ msgstr "tegnspecialfil"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolsk lænke"
+
+#~ msgid "socket"
+#~ msgstr "sokkel (socket)"
+
+#~ msgid "message queue"
+#~ msgstr "meddelelsekø"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "objekt af delt hukommelse"
+
+#~ msgid "typed memory object"
+#~ msgstr "objekt af typet hukommelse"
+
+#~ msgid "weird file"
+#~ msgstr "mærkelig fil"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: flaget '--%s' tager intet argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: ukendt flag '--%s'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: flaget '-W %s' er flertydigt\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: flaget '-W %s' tager intet argument\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "ugyldigt source_version-argument til compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "ugyldigt target_version-argument til compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "det gik ikke at oprette '%s'"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "fejl ved skrivning af filen '%s'"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Javaoversætter ikke fundet, forsøg at installere gcj eller sætte $JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Virtuel Javamaskine ikke fundet, forsøg at installere gij eller sætte "
+#~ "$JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s-underproces I/O-fejl"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "kan ikke ændre rettigheder på %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "kan ikke oprette kataloget %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Mislykkedes med at åbne /dev/zero for læsning"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "oprettelse af læsetråd mislykkedes"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "kan ikke opsætte ikke-blokerende I/O til %s-underproces"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "kommunikation med %s-underproces mislykkedes"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "skrivning til %s-underproces mislykkedes"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "læsning fra %s-underproces mislykkedes"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "underproces %s afsluttet med slutstatus %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "oprettelse af tråde mislykkedes"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s-underproces afslutted med slutstatus %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yYjJ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "ændrer rettigheder på %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Lagt på"
+
+#~ msgid "Interrupt"
+#~ msgstr "Afbrudt"
+
+#~ msgid "Quit"
+#~ msgstr "Afslut"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Utilladt instruktion"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Sporings-/afbrudspunktsfælde"
+
+#~ msgid "Aborted"
+#~ msgstr "Afbrudt (abort)"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Undtagelse ved flydende tal"
+
+#~ msgid "Killed"
+#~ msgstr "Dræbt"
+
+#~ msgid "Bus error"
+#~ msgstr "Busfejl"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Segmenteringsfejl"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Brudt datakanal"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Alarmklokke"
+
+#~ msgid "Terminated"
+#~ msgstr "Afsluttet"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Hastende I/O-situation"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Stoppet (signal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Stoppet"
+
+#~ msgid "Continued"
+#~ msgstr "Genoptaget"
+
+#~ msgid "Child exited"
+#~ msgstr "Barn afsluttede"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Stoppet (terminallæsning)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Stoppet (terminalskrivning)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O muligt"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Grænse på CPU-tid overskredet"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Grænse på filstørrelse overskredet"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Alarmklokke - virtuel tid - udløb"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profileringsklokke udløb"
+
+#~ msgid "Window changed"
+#~ msgstr "Ændret vindue"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Brugersignal 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Brugersignal 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Emulatorfælde"
+
+#~ msgid "Bad system call"
+#~ msgstr "Fejlagtigt systemkald"
+
+#~ msgid "Stack fault"
+#~ msgstr "Stakfejl"
+
+#~ msgid "Information request"
+#~ msgstr "Informationsanmodning"
+
+#~ msgid "Power failure"
+#~ msgstr "Strømafbrud"
+
+#~ msgid "Resource lost"
+#~ msgstr "Tabt resurse"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "fejl ved skrivning til en lukket datakanal eller sokkel"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Realtidsignal %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Ukendt signal %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv-funktion ikke brugbar"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv-funktion ikke tilgængelig"
+
+#~ msgid "character out of range"
+#~ msgstr "tegn udenfor interval"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsæt: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ugyldig bruger"
+
+#~ msgid "invalid group"
+#~ msgstr "ugyldig gruppe"
+
+#~ msgid "invalid spec"
+#~ msgstr "ugyldig specifikation"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "kan ikke vise fejlmeddelelse"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Pakket af %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Pakket af %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Licens GPLv3+: GNU GPL version 3 eller senere <http://gnu.org/licenses/"
+#~ "gpl.html>.\n"
+#~ "Dette er frit programmel: du må ændre og videredistribuere det.\n"
+#~ "Der gives INGEN GARANTI, så vidt lov tillader.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Skrevet af %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Skrevet af %s og %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Skrevet af %s, %s og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s\n"
+#~ "og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s, %s og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s, %s, %s og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s og %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Skrevet af %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s med flere.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapportér fejl til: %s\n"
+#~ "Sende synspunkter på oversættelsen til: tp-sv@listor.tp-sv.se\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Rapportér %s-fejl til: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s hjemmeside: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s hjemmeside: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Almindelig hjælp til at bruge GNU-programmer: <http://www.gnu.org/gethelp/"
+#~ ">\n"
+
+#~ msgid "stdin"
+#~ msgstr "standard ind"
+
+#~ msgid "stdout"
+#~ msgstr "standard ud"
+
+#~ msgid "stderr"
+#~ msgstr "standard fejl"
+
+#~ msgid "unknown stream"
+#~ msgstr "ukendt strøm"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "kunne ikke genåbne %s i tilstand %s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "strengsammenligning mislykkedes"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Sæt LC_ALL='C' for at omgå problemet."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "De sammenlignede strenge var %s og %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "kan ikke udføre formateret udskrift"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "fejlagtigt %s%s-argument '%s'"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "fejlagtigt suffiks i %s%s-argument '%s'"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "%s%s argument '%s' er for stort"
diff --git a/gnulib_po/de.gmo b/gnulib_po/de.gmo
new file mode 100644
index 0000000..71e0665
--- /dev/null
+++ b/gnulib_po/de.gmo
Binary files differ
diff --git a/gnulib_po/de.po b/gnulib_po/de.po
new file mode 100644
index 0000000..4516cdf
--- /dev/null
+++ b/gnulib_po/de.po
@@ -0,0 +1,1053 @@
+# German translation of gnulib messages.
+# Copyright © 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Karl Eichwalder <ke@suse.de>, 2001-2002.
+# Lutz Behnke <lutz.behnke@gmx.de>, 1996, 1997, 1998, 1999, 2000, 2001.
+# Michael Schmidt <michael@guug.de>, 1996, 1997, 1998, 1999, 2000.
+# Michael Piefel <piefel@informatik.hu-berlin.de>, 2001, 2002, 2003, 2009.
+# Kai Wasserbäch <debian@carbon-project.org>, 2009.
+# Arun Persaud <arun@nubati.net>, 2012.
+# Roland Illig <roland.illig@gmx.de>, 2019.
+#
+# TAB: spell it out („Tabulatoren“). -ke-
+# Don't use obscure abbreviations, please. -ke-
+# No hyphenation, please. -ke-
+#
+# space: Leerzeichen oder Leerschritt
+#
+# Check:
+# idle - untätig
+# idle: untätig, ruhig, „idle“, Leerlauf
+# user idle time: Untätigkeitszeit des Benutzers, Ruhezeit, Idle-Time,
+# Benutzer im Leerlauf
+# digit - Zahl, Ziffer, Nummer, Stelle
+# logged in - angemeldet, eingeloggt
+# requested - gewünscht?
+#
+# Some comments on translations used in oder to ensure persistence:
+#
+# symbolic links: symbolische Verknüpfungen
+# hard links: harte Verknüpfungen
+# backup: Sicherung
+# mount: einhängen
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU gnulib-4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-22 20:00+0200\n"
+"Last-Translator: Roland Illig <roland.illig@gmx.de>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.2.3\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Unbekannter Systemfehler"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Adressfamilie für Hostnamen nicht unterstützt"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Temporäre Störung der Namensauflösung"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Ungültiger Wert für ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Nicht zu umgehende Störung der Namensauflösung"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family nicht unterstützt"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Speicherallokationsfehler"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Keine Adresse mit Hostnamen verbunden"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Name oder Service unbekannt"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname nicht unterstützt für ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype nicht unterstützt"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Systemfehler"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumentpuffer zu klein"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Verarbeitungsanfrage in Bearbeitung"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Anfrage abgebrochen"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Anfrage nicht abgebrochen"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Alle Anfragen erledigt"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Durch Signal unterbrochen"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parameterzeichenkette nicht korrekt kodiert"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Unbekannter Fehler"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: Option »%s%s« ist mehrdeutig\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: Option »%s%s« ist mehrdeutig; Möglichkeiten:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: unbekannte Option »%s%s«\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: Option »%s%s« erlaubt kein Argument\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: Option »%s%s« erfordert ein Argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ungültige Option -- »%c«\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: Option erfordert ein Argument -- »%c«\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "aktuelles Arbeitsverzeichnis konnte nicht bestimmt werden"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+"es konnte nicht ins ursprüngliche Arbeitsverzeichnis zurückgekehrt werden"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fehlgeschlagen"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"Dateideskriptor %d konnte nicht wiederhergestellt werden: dup2 fehlgeschlagen"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "»"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "«"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Erfolg"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Keine Ãœbereinstimmung"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ungültiger regulärer Ausdruck"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ungültiges Sortierungszeichen"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ungültiger Name für Zeichenklasse"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Unerwarteter Backslash am Ende"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ungültige Rückreferenz"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Gegenstück zu [, [^, [:, [. oder [= fehlt"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Gegenstück zu ( oder \\( fehlt"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Gegenstück zu \\{ fehlt"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ungültiger Inhalt in \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ungültiges Bereichsende"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Zu wenig Speicher vorhanden"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ungültiger vorhergehender regulärer Ausdruck"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Vorzeitiges Ende des regulären Ausdrucks"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Der reguläre Ausdruck ist zu groß"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Gegenstück zu ) oder \\) fehlt"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Kein vorhergehender regulärer Ausdruck"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "Pipe konnte nicht erzeugt werden"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: Unterprozess fehlgeschlagen"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s-Unterprozess"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s-Unterprozess bekam tödliches Signal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "Zu wenig Speicher vorhanden"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "ungültiges Argument %s für %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "mehrdeutiges Argument %s für %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Gültige Argumente sind:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: Der Wert %s ist kleiner oder gleich %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT Parameter benötigt einen Wert"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Unbekannter Parameter für ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Müll in ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Erforderliche oder optionale Argumente für lange Optionen sind auch für "
+#~ "kurze erforderlich bzw. optional."
+
+#~ msgid "Usage:"
+#~ msgstr "Aufruf:"
+
+#~ msgid " or: "
+#~ msgstr " oder: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPTION…]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "»%s --help« oder »%s --usage« liefert weitere Informationen.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Melden Sie Fehler (auf Englisch, mit LC_ALL=C) an <%s>.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "diese Hilfeliste anzeigen"
+
+#~ msgid "give a short usage message"
+#~ msgstr "eine Kurzfassung des Aufrufs anzeigen"
+
+#~ msgid "NAME"
+#~ msgstr "NAME"
+
+#~ msgid "set the program name"
+#~ msgstr "den Programmnamen festlegen"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "SEK Sekunden warten (Standardwert 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "Programmversion anzeigen"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMMFEHLER) Keine Version bekannt!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: zu viele Argumente\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMMFEHLER) Option hätte erkannt werden müssen!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u freigegeben (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u gecacht (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u gecacht (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u gecacht (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "logarithmisches Anzahlhistogramm\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "logarithmisches Größenhistogramm\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "Dichtehistogramm\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bitmengen-Statistik:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Aufsummierte Durchläufe = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "Statistikdatei konnte nicht gelesen werden"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "Statistikdatei hat falsche Größe\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "Statistikdatei konnte nicht angelegt werden"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "Statistikdatei konnte nicht zum Schreiben geöffnet werden"
+
+#~ msgid "program error"
+#~ msgstr "Programmfehler"
+
+#~ msgid "stack overflow"
+#~ msgstr "Stacküberlauf"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "kein temporäres Verzeichnis gefunden, versuchen Sie, $TMPDIR zu setzen"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr ""
+#~ "temporäres Verzeichnis mit der Schablone »%s« konnte nicht angelegt werden"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "temporäre Datei »%s« konnte nicht entfernt werden"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "temporäres Verzeichnis »%s« konnte nicht entfernt werden"
+
+#~ msgid "error closing file"
+#~ msgstr "Fehler beim Schließen der Datei"
+
+#~ msgid "write error"
+#~ msgstr "Fehler beim Schreiben der Datei"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "Zugriffsberechtigungen von »%s« werden beibehalten"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "die Datei »%s« konnte nicht zum Lesen geöffnet werden"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "die Sicherungsdatei »%s« konnte nicht zum Schreiben geöffnet werden"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "Fehler beim Lesen von »%s«"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "Fehler beim Schreiben von »%s«"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "Fehler nach dem Lesen von »%s«"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "Fehler bei fdopen()"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr ""
+#~ "C#-Compiler nicht gefunden, versuchen Sie, das Paket »mono« zu "
+#~ "installieren"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr ""
+#~ "Virtuelle Maschine für C# nicht gefunden, versuchen Sie, das Paket »mono« "
+#~ "zu installieren"
+
+#~ msgid "unbalanced ["
+#~ msgstr "öffnende eckige Klammer »[« ohne Gegenstück"
+
+#~ msgid "invalid character class"
+#~ msgstr "ungültige Zeichenklasse"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr ""
+#~ "Die Schreibweise für Zeichenklassen ist [[:space:]], nicht [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "unvollendete \\-Escapesequenz"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "Ungültiger Inhalt in \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "der reguläre Ausdruck ist zu groß"
+
+#~ msgid "unbalanced ("
+#~ msgstr "öffnende Klammer »(« ohne Gegenstück"
+
+#~ msgid "no syntax specified"
+#~ msgstr "keine Syntax angegeben"
+
+#~ msgid "unbalanced )"
+#~ msgstr "schließende Klammer »)« ohne Gegenstück"
+
+#~ msgid "regular empty file"
+#~ msgstr "reguläre leere Datei"
+
+#~ msgid "regular file"
+#~ msgstr "reguläre Datei"
+
+#~ msgid "directory"
+#~ msgstr "Verzeichnis"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolische Verknüpfung"
+
+#~ msgid "message queue"
+#~ msgstr "Nachrichtenwarteschlange"
+
+#~ msgid "semaphore"
+#~ msgstr "Semaphor"
+
+#~ msgid "shared memory object"
+#~ msgstr "Objekt gemeinsamen Speichers"
+
+#~ msgid "typed memory object"
+#~ msgstr "Objekt getypten Speichers"
+
+#~ msgid "block special file"
+#~ msgstr "blockorientierte Spezialdatei"
+
+#~ msgid "character special file"
+#~ msgstr "zeichenorientierte Spezialdatei"
+
+#~ msgid "contiguous data"
+#~ msgstr "zusammenhängende Daten"
+
+#~ msgid "fifo"
+#~ msgstr "FIFO"
+
+#~ msgid "door"
+#~ msgstr "Tür"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "gemultiplexte blockorientierte Spezialdatei"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "gemultiplexte zeichenorientierte Spezialdatei"
+
+#~ msgid "multiplexed file"
+#~ msgstr "gemultiplexte Datei"
+
+#~ msgid "named file"
+#~ msgstr "benannte Datei"
+
+#~ msgid "network special file"
+#~ msgstr "netzwerkbezogene Spezialdatei"
+
+#~ msgid "migrated file with data"
+#~ msgstr "migrierte Datei mit Daten"
+
+#~ msgid "migrated file without data"
+#~ msgstr "migrierte Datei ohne Daten"
+
+#~ msgid "port"
+#~ msgstr "Anschluss"
+
+#~ msgid "socket"
+#~ msgstr "Socket"
+
+#~ msgid "whiteout"
+#~ msgstr "Ãœberblendung"
+
+#~ msgid "weird file"
+#~ msgstr "merkwürdige Datei"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "ungültiges Argument »source_version« für »compile_java_class«"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "ungültiges Argument »target_version« für »compile_java_class«"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "Datei »%s« konnte nicht erzeugt werden"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "Fehler beim Schreiben der Datei »%s«"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Java-Compiler nicht gefunden, versuchen Sie, das Paket »gcj« zu "
+#~ "installieren oder setzen Sie $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Virtuelle Maschine für Java nicht gefunden, versuchen Sie, das Paket "
+#~ "»gij« zu installieren oder setzen Sie $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s-Unterprozess-E/A-Fehler"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "Dateieigenschaften für »%s« konnten nicht bestimmt werden"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "Zugriffsrechte von »%s« konnten nicht geändert werden"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "Verzeichnis »%s« konnte nicht angelegt werden"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Das Gerät »/dev/zero« konnte nicht zum Lesen geöffnet werden"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "Erstellen des Lese-Threads fehlgeschlagen"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr ""
+#~ "Nicht-blockierendes I/O zu Teilprozess »%s« konnte nicht hergestellt "
+#~ "werden"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "Kommunikation mit Teilprozess »%s« fehlgeschlagen"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "Schreiben zu Teilprozess »%s« fehlgeschlagen"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "Lesen von Teilprozess »%s« fehlgeschlagen"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "Teilprozess »%s« beendet mit Code %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "Erstellen von Threads fehlgeschlagen"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "Teilprozess »%s« wurde mit Code %d beendet"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "Zugriffsberechtigungen von »%s« werden festgelegt"
+
+#~ msgid "Hangup"
+#~ msgstr "Aufhängen"
+
+#~ msgid "Interrupt"
+#~ msgstr "Unterbrechung"
+
+#~ msgid "Quit"
+#~ msgstr "Beendet"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Ungültiger Maschinenbefehl"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Trace-/Breakpoint-Falle"
+
+#~ msgid "Aborted"
+#~ msgstr "Abgebrochen"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Gleitkomma-Ausnahme"
+
+#~ msgid "Killed"
+#~ msgstr "Getötet"
+
+#~ msgid "Bus error"
+#~ msgstr "Busfehler"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Speicherzugriffsfehler"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Unterbrochene Weiterleitung"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Wecker"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminiert"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Dringende I/O-Bedingung"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Gestoppt (Signal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Gestoppt"
+
+#~ msgid "Continued"
+#~ msgstr "Fortgesetzt"
+
+#~ msgid "Child exited"
+#~ msgstr "Kindprozess beendet"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Gestoppt (tty-Eingabe)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Gestoppt (tty-Ausgabe)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O möglich"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "CPU-Zeitbegrenzung überschritten"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Dateigrößenbegrenzung überschritten"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtueller Zeitgeber abgelaufen"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Zeitmesser zur Leistungsmessung abgelaufen"
+
+#~ msgid "Window changed"
+#~ msgstr "Fenster geändert"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Benutzerdefiniertes Signal 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Benutzerdefiniertes Signal 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT-Falle"
+
+#~ msgid "Bad system call"
+#~ msgstr "Fehlerhafter Systemaufruf"
+
+#~ msgid "Stack fault"
+#~ msgstr "Stapelfehler"
+
+#~ msgid "Information request"
+#~ msgstr "Informationsanfrage"
+
+#~ msgid "Power failure"
+#~ msgstr "Stromausfall"
+
+#~ msgid "Resource lost"
+#~ msgstr "Ressource verloren"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "Fehler beim Schreiben in geschlossene Pipe oder Socket"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Echtzeitsignal %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Unbekanntes Signal %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Ausführungszeiten (in Sekunden)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU Anwendung"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU System"
+
+#~ msgid "wall clock"
+#~ msgstr "Vergangene Zeit"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv-Funktion nicht benutzbar"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv-Funktion nicht verfügbar"
+
+#~ msgid "character out of range"
+#~ msgstr "Zeichen außerhalb erlaubter Grenzen"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr ""
+#~ "das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert werden"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr ""
+#~ "das Zeichen U+%04X konnte nicht in lokalen Zeichensatz konvertiert "
+#~ "werden: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ungültiger Benutzername"
+
+#~ msgid "invalid group"
+#~ msgstr "ungültiger Gruppenname"
+
+#~ msgid "invalid spec"
+#~ msgstr "ungültige Angabe"
+
+#~ msgid "unable to display error message"
+#~ msgstr "Fehlermeldung konnte nicht angezeigt werden"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Paket erstellt von %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Paket erstellt von %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Lizenz GPLv3+: GNU GPL Version 3 oder höher <%s>.\n"
+#~ "Dies ist freie Software: Sie können sie ändern und weitergeben.\n"
+#~ "Es gibt keinerlei Garantien, soweit es das Gesetz erlaubt.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Geschrieben von %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Geschrieben von %s und %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Geschrieben von %s, %s und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s\n"
+#~ "und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s, %s und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s, %s, %s und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s und %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Geschrieben von %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s und anderen.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Melden Sie Fehler im Programm (auf Englisch) an »%s«.\n"
+#~ "Melden Sie Fehler in der Ãœbersetzung an <translation-team-de@lists."
+#~ "sourceforge.net>.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Melden Sie %s-Fehler an »%s«\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s-Homepage: %s\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Allgemeine Hilfe zur Benutzung von GNU-Software: %s\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr ""
+#~ "Dateideskriptor konnte nicht zwischen Text und Binär umgeschaltet werden"
+
+#~ msgid "stdin"
+#~ msgstr "Standardeingabe (stdin)"
+
+#~ msgid "stdout"
+#~ msgstr "Standardausgabe (stdout)"
+
+#~ msgid "stderr"
+#~ msgstr "Standardfehlerausgabe (stderr)"
+
+#~ msgid "unknown stream"
+#~ msgstr "Unbekannter Datenstrom"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "Erneutes Öffnen von %s mit Modus %s fehlgeschlagen"
+
+#~ msgid "string comparison failed"
+#~ msgstr "Zeichenkettenvergleich fehlgeschlagen"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Setzen Sie »LC_ALL=C«, um das Problem zu umgehen."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Die verglichenen Zeichenketten waren »%s« und »%s«."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "formatierte Ausgabe konnte nicht durchgeführt werden"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "Standarddateideskriptoren"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "ungültiges %s%s-Argument »%s«"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "ungültige Endung in %s%s-Argument »%s«"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s-Argument »%s« zu groß"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT Parameter muss positiv sein"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: Option »--%s« erlaubt kein Argument\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: unbekannte Option »--%s«\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: Option »-W %s« erlaubt kein Argument\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: Option »-W %s« erfordert ein Argument\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Heimatseite von %s: <http://www.gnu.org/software/%s/>.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: ungültige Option -- %c\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <%s>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Melden Sie Fehler (auf Englisch, mit LC_ALL=C) an <%s>.\n"
+#~ "Melden Sie Ãœbersetzungsfehler an <translation-team-de@lists.sourceforge."
+#~ "net>\n"
+
+#~ msgid "block size"
+#~ msgstr "Blockgröße"
diff --git a/gnulib_po/el.gmo b/gnulib_po/el.gmo
new file mode 100644
index 0000000..6b6ffd0
--- /dev/null
+++ b/gnulib_po/el.gmo
Binary files differ
diff --git a/gnulib_po/el.po b/gnulib_po/el.po
new file mode 100644
index 0000000..4bb8a0a
--- /dev/null
+++ b/gnulib_po/el.po
@@ -0,0 +1,702 @@
+# Greek messages for gnulib
+# Copyright (C) 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Simos Xenitellis <simos.lists@googlemail.com>, 1999, 2000, 2001, 2002, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2012-03-11 11:25+0100\n"
+"Last-Translator: Simos Xenitellis <simos.lists@googlemail.com>\n"
+"Language-Team: Greek <team@lists.gnome.gr>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Άγνωστο σφάλμα συστήματος"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "αÏχεία fifo δεν υποστηÏίζονται"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "αÏχεία fifo δεν υποστηÏίζονται"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "αÏχεία fifo δεν υποστηÏίζονται"
+
+#
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "σφάλμα εγγÏαφής"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Άγνωστο σφάλμα συστήματος"
+
+#
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: η επιλογή `-W %s' είναι ασαφής\n"
+
+#
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: η επιλογή `%s' είναι ασαφής\n"
+
+#
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: μη αναγνωÏίσιμη επιλογή `%c%s'\n"
+
+#
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: η επιλογή `%c%s' δεν επιτÏέπει οÏίσματα\n"
+
+#
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: η επιλογή `-%s' απαιτεί ένα ÏŒÏισμα\n"
+
+#
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: μη έγκυÏη επιλογή -- %c\n"
+
+#
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: η επιλογή απαιτεί ένα ÏŒÏισμα -- %c\n"
+
+#
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: μη έγκυÏη κανονική έκφÏαση: %s"
+
+#
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "μη έγκυÏη τάξη χαÏακτήÏων `%s'"
+
+#
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "μη έγκυÏη τάξη χαÏακτήÏων `%s'"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: μη έγκυÏη κανονική έκφÏαση: %s"
+
+#
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "η μνήμη εξαντλήθηκε"
+
+#
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: μη έγκυÏη κανονική έκφÏαση: %s"
+
+#
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "σφάλμα στην ανεÏÏεση μέσω κανονικής έκφÏασης"
+
+#
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: μη έγκυÏη κανονική έκφÏαση: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "σφάλμα στην ανεÏÏεση μέσω κανονικής έκφÏασης"
+
+#
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "η μνήμη εξαντλήθηκε"
+
+#
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "μη έγκυÏο ÏŒÏισμα %s για %s"
+
+#
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "ασαφές ÏŒÏισμα %s για %s"
+
+#
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "ΈγκυÏα οÏίσματα είναι:"
+
+#
+#~ msgid " [OPTION...]"
+#~ msgstr " [ΕΠΙΛΟΓΗ...]"
+
+#
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Δοκιμάστε `%s --help' για πεÏισσότεÏη βοήθεια.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΑναφέÏατε σφάλματα στο <%s>.\n"
+
+#
+#, fuzzy
+#~ msgid "print program version"
+#~ msgstr "σφάλμα Ï€ÏογÏάμματος"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "πάÏα πολλά οÏίσματα"
+
+#
+#~ msgid "program error"
+#~ msgstr "σφάλμα Ï€ÏογÏάμματος"
+
+#
+#~ msgid "stack overflow"
+#~ msgstr "υπεÏχείλιση στοίβας"
+
+#
+#, fuzzy, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#, fuzzy, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#, fuzzy, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#~ msgid "write error"
+#~ msgstr "σφάλμα εγγÏαφής"
+
+#
+#, fuzzy, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "αδυναμία αλλαγής ιδιοκτησίας στο %s"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "αδυναμία μεταφοÏάς του `%s' στο `%s'"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "αδυναμία μεταφοÏάς του `%s' στο `%s'"
+
+#
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "σφάλμα ανάγνωσης %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "σφάλμα εγγÏαφής %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "σφάλμα ανάγνωσης %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "αποτυχία ανοίγματος"
+
+#
+#~ msgid "regular empty file"
+#~ msgstr "κανονικό κενό αÏχείο"
+
+#
+#~ msgid "regular file"
+#~ msgstr "κανονικό αÏχείο"
+
+#
+#~ msgid "directory"
+#~ msgstr "κατάλογος"
+
+#
+#~ msgid "block special file"
+#~ msgstr "ειδικό αÏχείο μπλοκ"
+
+#
+#~ msgid "character special file"
+#~ msgstr "ειδικό αÏχείο χαÏακτήÏων"
+
+#
+#~ msgid "fifo"
+#~ msgstr "φίφο"
+
+#
+#~ msgid "symbolic link"
+#~ msgstr "συμβολικός σÏνδεσμος"
+
+#
+#~ msgid "socket"
+#~ msgstr "υποδοχέας"
+
+#
+#~ msgid "message queue"
+#~ msgstr "ουÏά μηνυμάτων"
+
+#
+#~ msgid "semaphore"
+#~ msgstr "σημαφόÏος"
+
+#
+#~ msgid "weird file"
+#~ msgstr "παÏάξενο αÏχείο"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: η επιλογή `--%s' δεν επιτÏέπει οÏίσματα\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: μη αναγνωÏίσιμη επιλογή `--%s'\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: η επιλογή `-W %s' δεν επιτÏέπει οÏίσματα\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: η επιλογή `-%s' απαιτεί ένα ÏŒÏισμα\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "σφάλμα εγγÏαφής %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#, fuzzy, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "αδυναμία αλλαγής ιδιοκτησίας στο %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "αδÏνατη η δημιουÏγία καταλόγου `%s'"
+
+#
+#, fuzzy, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "αδυναμία αλλαγής ιδιοκτησίας στο %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#, fuzzy, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#, fuzzy, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "%s: μη έγκυÏη μοÏφή"
+
+#
+#~ msgid "^[yY]"
+#~ msgstr "^[yYνÎ]"
+
+#
+#~ msgid "^[nN]"
+#~ msgstr "^[nNοΟ]"
+
+#
+#, fuzzy, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "αδυναμία αλλαγής ιδιοκτησίας στο %s"
+
+#
+#, fuzzy
+#~ msgid "Bus error"
+#~ msgstr "σφάλμα εγγÏαφής"
+
+#
+#, fuzzy
+#~ msgid "character out of range"
+#~ msgstr "%s: αÏιθμός γÏαμμής έξω από τα ÏŒÏια"
+
+#
+#~ msgid "invalid user"
+#~ msgstr "μη έγκυÏος χÏήστης"
+
+#
+#~ msgid "invalid group"
+#~ msgstr "μη έγκυÏη ομάδα"
+
+#
+#, fuzzy
+#~ msgid "invalid spec"
+#~ msgstr "μη έγκυÏος χÏήστης"
+
+#
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr "ΓÏαμμένο από τον/την %s.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΑναφέÏατε σφάλματα στο <%s>.\n"
+
+#
+#, fuzzy, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ΑναφέÏατε σφάλματα στο <%s>.\n"
+
+#
+#, fuzzy
+#~ msgid "unknown stream"
+#~ msgstr "Άγνωστο σφάλμα συστήματος"
+
+#
+#, fuzzy, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "αποτυχία εγγÏαφής"
+
+#
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Θέστε LC_ALL='C' για να παÏακάμψετε το Ï€Ïόβλημα."
+
+#, fuzzy, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "δεν είναι δυνατό να δημιουÏγηθεί το %s `%s' στο `%s'"
+
+#
+#, fuzzy, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "μη έγκυÏο ÏŒÏισμα %s για %s"
+
+#
+#, fuzzy, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "μη έγκυÏο ÏŒÏισμα %s για %s"
+
+#
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: μη αναγνωÏίσιμη επιλογή -- %c\n"
+
+#
+#~ msgid "block size"
+#~ msgstr "μέγεθος μπλοκ"
+
+#
+#, fuzzy
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "το `%s' υπάÏχει ήδη άλλα δεν είναι κατάλογος"
+
+#
+#, fuzzy
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "δεν είναι δυνατό να παÏαληφθεί χÏήστης και ομάδα"
+
+#
+#, fuzzy
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "αδÏνατη η αλλαγή στο κατάλογο %s"
+
+#
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr ""
+#~ "αδÏνατη η λήψη της ομάδας εισαγωγής στο σÏστημα ενός αÏÎ¹Î¸Î¼Î·Ï„Î¹ÎºÎ¿Ï UID"
diff --git a/gnulib_po/en@boldquot.header b/gnulib_po/en@boldquot.header
new file mode 100644
index 0000000..fedb6a0
--- /dev/null
+++ b/gnulib_po/en@boldquot.header
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# 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
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/gnulib_po/en@quot.header b/gnulib_po/en@quot.header
new file mode 100644
index 0000000..a9647fc
--- /dev/null
+++ b/gnulib_po/en@quot.header
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# 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
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/gnulib_po/eo.gmo b/gnulib_po/eo.gmo
new file mode 100644
index 0000000..3792327
--- /dev/null
+++ b/gnulib_po/eo.gmo
Binary files differ
diff --git a/gnulib_po/eo.po b/gnulib_po/eo.po
new file mode 100644
index 0000000..b43aa9f
--- /dev/null
+++ b/gnulib_po/eo.po
@@ -0,0 +1,989 @@
+# translation of gnulib to Esperanto
+# Copyright (C) 2013, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Felipe Castro <fefcas@gmail.com>, 2013, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-19 18:26-0300\n"
+"Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 1.8.11\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Nekonata sistem-eraro"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Adresfamilio por komputilretnomo ne estas subtenata"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Provizora paneo en solvo de retnomo"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "MalÄusta valoro por ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Neriparebla paneo en solvo de retnomo"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family ne estas subtenata"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Rezervo de memoro fiaskis"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Neniu adreso estas asociita kun komputilretnomo"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nomo aÅ­ servo ne estas konata"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname ne estas subtenata por ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype ne estas subtenata"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Sistem-eraro"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Bufro por argumentoj tro malgrandas"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Procezado de peto daÅ­ras"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Peto estas nuligita"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Peto ne estas nuligita"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Ĉiuj petoj estas plenumitaj"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interrompita de signalo"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parametra ĉeno ne estas Äuste enkodita"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Nekonata eraro"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: la modifilo '%s%s' estas plursenca\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: la modifilo '%s%s' estas plursenca; eblecoj:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: nerekonata modifilo '%s%s'\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: la modifilo '%s%s' ne permesas argumenton\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: la modifilo '%s%s' postulas argumenton\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: malvalida modifilo -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: la modifilo postulas argumenton -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ne eblas registri la aktualan labordosierujon"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "ni fiaskis reveni al la komenca labordosierujo"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fiaskis"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ne eblas restarigi fd %d: dup2 fiaskis"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "‘"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "’"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Sukceso"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Neniu kongruaĵo"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Malvalida regulesprimo"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Malvalida ordodifina signo"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Malvalida signa klasnomo"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Vosta retroklino"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Malvalida retroreferenco"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Senpara [, [^, [:, [., aÅ­ [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Senpara ( aÅ­ \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Senpara \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Malvalida enhavo de \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Malvalida intervalofino"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoro estas plenigita"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Malvalida antaÅ­a regulesprimo"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Tro frua fino de regulesprimo"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regulesprimo tro grandas"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Senpara ) aÅ­ \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Neniu antaÅ­a regulesprimo"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "ne eblas krei dukton"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subprocezo de %s fiaskis"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "subprocezo %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "subprocezo %s ricevis neripareblan signalon %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memoro estas plenigita"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "malvalida argumento %s por %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "plursenca argumento %s por %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Validaj argumentoj estas:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: valoro de %s estas malpli aÅ­ egala al %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: parametro ARGP_HELP_FMT postulas valoron"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Nekonata parametro ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Rubaĵo en ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Devigaj aŭ nedevigaj argumentoj por longaj modifiloj ankaŭ estas devigaj "
+#~ "aÅ­ nedevigaj por iu ajn korespondanta mallonga modifilo."
+
+#~ msgid "Usage:"
+#~ msgstr "Uzmaniero:"
+
+#~ msgid " or: "
+#~ msgstr " aÅ­: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [MODIFILO...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Provu '%s --help' aÅ­ '%s --usage' por pli da informo.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Raportu program-misojn al %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "montri tiun ĉi help-liston"
+
+#~ msgid "give a short usage message"
+#~ msgstr "montri mallongan mesaÄon pri la uzmaniero"
+
+#~ msgid "NAME"
+#~ msgstr "NOMO"
+
+#~ msgid "set the program name"
+#~ msgstr "difini la program-nomon"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "halti dum SEK sekundoj (apriore 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "montri program-version"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAM-ERARO) Neniu versio estas konata!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: tro da argumentoj\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAM-ERARO) Modifilo devus esti rekonita!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u liberitaj (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u kaÅmem (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u kaÅmem (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u kaÅmem (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histogramo pri nombro-protokolado\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histogramo pri grando-protokolado\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histogramo pri denso\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bitset statistikoj:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Akumulitaj funkciadoj = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "ne eblas legi dosieron stats"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "malÄusta dosier-grando de stats\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "ne eblas skibi en dosiero stats"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "ne eblas malfermi dosieron stats por skribi"
+
+#~ msgid "program error"
+#~ msgstr "programeraro"
+
+#~ msgid "stack overflow"
+#~ msgstr "staka troigo"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "ne eblas trovi provizoran dosierujon, provu difini $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "ne eblas krei provizoran dosierujon uzante la Åablonon \"%s\""
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "ne eblas forigi la provizoran dosieron %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "ne eblas forigi la provizoran dosierujon %s"
+
+#~ msgid "error closing file"
+#~ msgstr "eraro dum fermo de dosiero"
+
+#~ msgid "write error"
+#~ msgstr "skrib-eraro"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "ni tenas la permesojn por %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "eraro dum malfermo de %s por legi"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "ne eblas malfermi la savdosieron %s por skribi"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "eraro dum lego de %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "eraro dum skribo de %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "eraro post legi %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() fiaskis"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "Kompililo C# ne estis trovata, ni provas instali mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "Virtuala maÅino C# ne estis trovata, ni provas instali mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "nekongruita ["
+
+#~ msgid "invalid character class"
+#~ msgstr "malvalida signa klaso"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "sintakso de signa klaso estas [[:space:]], ne [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "nefinigita eskapo \\"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "malvalida enhavo de \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "regulesprimo tro grandas"
+
+#~ msgid "unbalanced ("
+#~ msgstr "nekongruita ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "neniu sintakso estas indikita"
+
+#~ msgid "unbalanced )"
+#~ msgstr "nekongruita )"
+
+#~ msgid "regular empty file"
+#~ msgstr "regula malplena dosiero"
+
+#~ msgid "regular file"
+#~ msgstr "regula dosiero"
+
+#~ msgid "directory"
+#~ msgstr "dosierujo"
+
+#~ msgid "symbolic link"
+#~ msgstr "simbola ligo"
+
+#~ msgid "message queue"
+#~ msgstr "mesaÄovico"
+
+#~ msgid "semaphore"
+#~ msgstr "semaforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "komuna memorobjekto"
+
+#~ msgid "typed memory object"
+#~ msgstr "tipita memorbjekto"
+
+#~ msgid "block special file"
+#~ msgstr "bloka speciala dosiero"
+
+#~ msgid "character special file"
+#~ msgstr "bajta speciala dosiero"
+
+#~ msgid "contiguous data"
+#~ msgstr "kontinua datumaro"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "enirejo"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "multplektita bloka speciala dosiero"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "bajta multplektita speciala dosiero"
+
+#~ msgid "multiplexed file"
+#~ msgstr "multplektita dosiero"
+
+#~ msgid "named file"
+#~ msgstr "nomigita dosiero"
+
+#~ msgid "network special file"
+#~ msgstr "reta speciala dosiero"
+
+#~ msgid "migrated file with data"
+#~ msgstr "transmetis dosieron kun datumaro"
+
+#~ msgid "migrated file without data"
+#~ msgstr "transmetis dosieron sen datumaro"
+
+#~ msgid "port"
+#~ msgstr "pordo"
+
+#~ msgid "socket"
+#~ msgstr "konektingo"
+
+#~ msgid "whiteout"
+#~ msgstr "'whiteout'"
+
+#~ msgid "weird file"
+#~ msgstr "stranga dosiero"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "malvalida argumento source_version por compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "malvalida argumento target_version por compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "ni fiaskis krei \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "eraro dum skribo de dosiero \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Ĵava kompililo ne estis trovata, provu instali gcj aŭ difinu $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Ä´ava virtuala maÅino ne estis trovata, provu instali gij aŭ difinu $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s subproceza eraro de en/eligo"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "ne eblas stat %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "ne eblas ÅanÄi permesojn de %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "ne eblas krei la dosierujon %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Ni fiaskis malfermi /dev/zero por legi"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "kreo de leganta fadeno fiaskis"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "ne eblas difini neblokantan en/eligon al la subprocezo %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "komunikado kun la subprocezo %s fiaskis"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "skribo al la subprocezo %s fiaskis"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lego el la subprocezo %s fiaskis"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "la subproceso %s ĉesis kun elira kodo %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "kreo de fadenoj fiaskis"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "la subproceso %s ĉesis kun elira kodo %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "agordo de permesoj por %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Malkonekto"
+
+#~ msgid "Interrupt"
+#~ msgstr "Interrompo"
+
+#~ msgid "Quit"
+#~ msgstr "Eliri"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Malvalida instrukcio"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Spursekva/paÅ­zopunkta kaptilo"
+
+#~ msgid "Aborted"
+#~ msgstr "Ĉesigita"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Glitkoma escepto"
+
+#~ msgid "Killed"
+#~ msgstr "Mortigita"
+
+#~ msgid "Bus error"
+#~ msgstr "Bus-eraro"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Adres-eraro"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Rompita dukto"
+
+#~ msgid "Alarm clock"
+#~ msgstr "VekhorloÄo"
+
+#~ msgid "Terminated"
+#~ msgstr "Finigita"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "UrÄa en/eliga stato"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Haltigita (signalo)"
+
+#~ msgid "Stopped"
+#~ msgstr "Haltigita"
+
+#~ msgid "Continued"
+#~ msgstr "DaÅ­rigita"
+
+#~ msgid "Child exited"
+#~ msgstr "Ido finis"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Haltigita (enigo tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Haltigita (eligo tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "En/eligo eblas"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Procezila tempolimo estas atingita"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Dosiergranda limo estas atingita"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuala horloÄo senvalidiÄis"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profilanta horloÄo senvalidiÄis"
+
+#~ msgid "Window changed"
+#~ msgstr "Fenestro ÅanÄis"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Signalo 1 difinita de uzanto"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Signalo 2 difinita de uzanto"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT-kaptilo"
+
+#~ msgid "Bad system call"
+#~ msgstr "MalÄusta sistemvoko"
+
+#~ msgid "Stack fault"
+#~ msgstr "Stak-eraro"
+
+#~ msgid "Information request"
+#~ msgstr "Informo-peto"
+
+#~ msgid "Power failure"
+#~ msgstr "Elektra paneo"
+
+#~ msgid "Resource lost"
+#~ msgstr "Perdo de rimedo"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "eraro skribante al fermida dukto aŭ konektingo"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Realtempa signalo %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Nekonata signalo %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Tempo de funkciado (sekundoj)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU uzanto"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU sistemo"
+
+#~ msgid "wall clock"
+#~ msgstr "mur-horloÄo"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "funkcio iconv ne uzeblas"
+
+#~ msgid "iconv function not available"
+#~ msgstr "funkcio iconv ne disponeblas"
+
+#~ msgid "character out of range"
+#~ msgstr "signo estas for de intervalo"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "ne eblas konverti U+%04X al loka signaro"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "ne eblas konverti U+%04X al loka signaro: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "malvalida uzanto"
+
+#~ msgid "invalid group"
+#~ msgstr "malvalida grupo"
+
+#~ msgid "invalid spec"
+#~ msgstr "malvalida spec"
+
+#~ msgid "unable to display error message"
+#~ msgstr "ne eblas montri erarmesaÄon"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Pakigita de %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Pakigita de %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Permeso GPLv3+: GNU GPL versio 3 aÅ­ posta <%s>.\n"
+#~ "Tio ĉi estas libera programaro: vi estas libera por ÅanÄi kaj redisdoni "
+#~ "Äin.\n"
+#~ "Ekzistas NENIU GARANTIO, laÅ­ plej amplekse permesate de la leÄoj.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Verkita de %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Verkita de %s kaj %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Verkita de %s, %s, kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, %s, kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, %s, %s, kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, kaj %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Verkita de %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, kaj aliaj.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Raportu program-misojn al: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Raportu %s misojn al: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s hejm-paÄo: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Äœenerala helpo por uzi programaron GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "ni fiaskis difini la dosieran priaĵon teksta/cifereca reÄimo"
+
+#~ msgid "stdin"
+#~ msgstr "ĉefenigujo"
+
+#~ msgid "stdout"
+#~ msgstr "ĉefeligujo"
+
+#~ msgid "stderr"
+#~ msgstr "ĉeferarujo"
+
+#~ msgid "unknown stream"
+#~ msgstr "nekonata fluaĵo"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "ni fiaskis remalfermi %s kun reÄimo %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "ĉena komparo fiaskis"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Agordu LC_ALL='C' por ĉirkauiri la problemon."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "La komparitaj ĉenoj estis %s kaj %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "ne eblas efektivigi formatitan eligon"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "laŭnormaj dosier-priaĵoj"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "malvalida %s%s-argumento '%s'"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "malvalida sufikso en %s%s-argumento '%s'"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s-argumento '%s' tro larÄas"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s hejm-paÄo: <https://www.gnu.org/software/%s/>\n"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: parametro ARGP_HELP_FMT devas esti pozitiva"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: la modifilo '--%s' ne permesas argumenton\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: nerekonata modifilo '--%s'\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: la modifilo '-W %s' ne permesas argumenton\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: la modifilo '-W %s' postulas argumenton\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
diff --git a/gnulib_po/es.gmo b/gnulib_po/es.gmo
new file mode 100644
index 0000000..df7ac50
--- /dev/null
+++ b/gnulib_po/es.gmo
Binary files differ
diff --git a/gnulib_po/es.po b/gnulib_po/es.po
new file mode 100644
index 0000000..9fee8cd
--- /dev/null
+++ b/gnulib_po/es.po
@@ -0,0 +1,969 @@
+# Mensajes en español para gnulib 3.0.0.6062.a6b16.
+# Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Cristian Othón Martínez Vera <cfuga@cfuga.mx>, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+#
+# Los mensajes iniciales de esta traducción provienen de la traducción
+# de mailutils.
+#
+# Un agradecimiento especial a Santiago Vila por sus atinados comentarios
+# sobre esta traducción.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-08-24 11:23-0500\n"
+"Last-Translator: Cristian Othón Martínez Vera <cfuga@cfuga.mx>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Error desconocido de sistema"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "No se admiten las familias de direcciones para hostname"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Fallo temporal en la resolución del nombre"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Valor erróneo para ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Falla irrecuperable en la resolución del nombre"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "no se admite ai_family"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Falló la llamada al sistema `malloc'"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "No existe una dirección asociada con el nombre de anfitrión"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nombre o servicio desconocido"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "No se admite servname para ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "no se admite ai_socktype"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Error del sistema"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Almacenamiento temporal de argumentos demasiado pequeño"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Petición de procesamiento en progreso"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Se canceló la petición"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "No se canceló la petición"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Se completaron todas las peticiones"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interrupción por una señal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "La cadena de parámetro no está codificada correctamente"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Error desconocido"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: la opción '-W %s' es ambigua\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: la opción '%s' es ambigua; posibilidades:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: no se reconoce la opción '%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: la opción '%c%s' no admite un argumento\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: la opción '--%s' requiere de un argumento\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opción inválida -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: la opción requiere de un argumento -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "no se puede registrar el directorio de trabajo actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "no se puede volver al directorio de trabajo inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "falló _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "no se puede restaurar el df %d: falló dup2"
+
+# Vamos a probar con el símbolo de cita tradicional en español,
+# a ver qué tal queda la cosa.
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Éxito"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Sin coincidencia"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expresión regular inválida"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carácter de ordenamiento inválido"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nombre de clase de carácter inválido"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida sobrante"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Referencia hacia atrás inválida"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ o [^ sin pareja"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( o \\( sin pareja"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sin pareja"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contenido inválido de \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fin de rango inválido"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoria agotada"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expresión regular precedente inválida"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Final prematuro de la expresión regular"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expresión regular demasiado grande"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") o \\) sin pareja"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "No hay una expresión regular previa"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "no se puede una tubería"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: falló el subproceso"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "subproceso %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "el subproceso %s recibió la señal fatal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memoria agotada"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argumento %s inválido para %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argumento %s ambiguo para %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Los argumentos válidos son:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: el valor %s es menor o igual a %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: El parámetro ARGP_HELP_FMT requiere de un valor"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: El parámetro ARGP_HELP_FMT debe ser positivo"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Parámetro de ARGP_HELP_FMT desconocido"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Basura en ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Los argumentos obligatorios u opcionales para las opciones largas también "
+#~ "son obligatorios u opcionales para cualquier opción corta correspondiente."
+
+#~ msgid "Usage:"
+#~ msgstr "Modo de empleo:"
+
+#~ msgid " or: "
+#~ msgstr " o:"
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPCIÓN...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Pruebe `%s --help' ó `%s --usage' para más información.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Reporte bichos a %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "da esta lista de ayuda"
+
+#~ msgid "give a short usage message"
+#~ msgstr "da un mensaje corto de modo de empleo"
+
+#~ msgid "NAME"
+#~ msgstr "NOMBRE"
+
+#~ msgid "set the program name"
+#~ msgstr "establece el nombre del programa"
+
+#~ msgid "SECS"
+#~ msgstr "SEGUNDOS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "espera por SECS segundos (3600 por defecto)"
+
+#~ msgid "print program version"
+#~ msgstr "muestra la versión del programa"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ERROR DEL PROGRAMA) ¿¡Sin versión conocida!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Demasiados argumentos\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ERROR DEL PROGRAMA) ¿¡La opción debería reconocerse!?"
+
+#~ msgid "program error"
+#~ msgstr "error del programa"
+
+#~ msgid "stack overflow"
+#~ msgstr "desbordamiento de la pila"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "no se puede encontrar un directorio temporal, pruebe definir $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "no se puede crear un directorio temporal usando la plantilla \"%s\""
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "no se puede borrar el fichero temporal %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "no se puede borrar el directorio temporal %s"
+
+#~ msgid "error closing file"
+#~ msgstr "error al cerrar el fichero"
+
+#~ msgid "write error"
+#~ msgstr "error de escritura"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "se conservan los permisos de %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "error al abrir \"%s\" para lectura"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "no se puede abrir el fichero de respaldo \"%s\" para escritura"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "error al leer \"%s\""
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "error al escribir en \"%s\""
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "error después de leer \"%s\""
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "falló fdopen()"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "No se encontró un compilador de C#, pruebe instalando pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "No se encontró una máquina virtual de C#, pruebe instalando pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "fichero regular vacío"
+
+#~ msgid "regular file"
+#~ msgstr "fichero regular"
+
+#~ msgid "directory"
+#~ msgstr "directorio"
+
+#~ msgid "block special file"
+#~ msgstr "fichero especial de bloques"
+
+#~ msgid "character special file"
+#~ msgstr "fichero especial de caracteres"
+
+#~ msgid "fifo"
+#~ msgstr "`fifo'"
+
+#~ msgid "symbolic link"
+#~ msgstr "enlace simbólico"
+
+#~ msgid "socket"
+#~ msgstr "`socket'"
+
+#~ msgid "message queue"
+#~ msgstr "cola de mensajes"
+
+#~ msgid "semaphore"
+#~ msgstr "semáforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "objeto de memoria compartida"
+
+#~ msgid "typed memory object"
+#~ msgstr "objeto de memoria con tipo"
+
+#~ msgid "weird file"
+#~ msgstr "fichero extraño"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: la opción '--%s' no admite un argumento\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: no se reconoce la opción '--%s'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: la opción '-W %s' no admite un argumento\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: la opción '-W %s' requiere de un argumento\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argumento source_version inválido para compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argumento target_version inválido para compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "no se puede crear \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "error al escribir el fichero \"%s\""
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "No se encontró un compilador de Java, pruebe instalando gcj o definiendo "
+#~ "$JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "No se encontró una máquina virtual de Java, pruebe instalando gij o "
+#~ "definiendo $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s: error de E/S del subproceso"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "no se pueden cambiar los permisos de %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "no se puede crear el directorio %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Falló al abrir /dev/zero para lectura"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "falló la creación del hilo de lectura"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "no se puede establecer E/S sin bloqueo para el subproceso %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "falló la comunicación con el subproceso %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "falló la escritura al subproceso %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "falló la lectura del subproceso %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "el subproceso %s terminó con el código de salida %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "falló la creación de hilos"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "subproceso %s terminado con el código de salida %d"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+# Esto es para responder "sí" cuando nos pregunte.
+#~ msgid "^[yY]"
+#~ msgstr "^[sS]"
+
+# Y esto es para responder "no" cuando nos pregunte.
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "se cambian los permisos de %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Colgar"
+
+#~ msgid "Interrupt"
+#~ msgstr "Interrumpir"
+
+#~ msgid "Quit"
+#~ msgstr "Salir"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Instrucción ilegal"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Captura de rastreo/punto de quiebre"
+
+#~ msgid "Aborted"
+#~ msgstr "Abortar"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Excepción de coma flotante"
+
+#~ msgid "Killed"
+#~ msgstr "Matar"
+
+#~ msgid "Bus error"
+#~ msgstr "Error de bus"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Falta de segmentación"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Tubería rota"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Reloj de alarma"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminar"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Condición de E/S urgente"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Detener (señal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Detener"
+
+#~ msgid "Continued"
+#~ msgstr "Continuar"
+
+#~ msgid "Child exited"
+#~ msgstr "Salió el hijo"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Detener (entrada de tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Detener (salida de tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Posible E/S"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Excede el límite de tiempo de CPU"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Excede el límite de tamaño de fichero"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Expira el temporizador virtual"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Expira el temporizador de análisis de perfil"
+
+#~ msgid "Window changed"
+#~ msgstr "Cambio de ventana"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Señal 1 definida por el usuario"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Señal 2 definida por el usuario"
+
+#~ msgid "EMT trap"
+#~ msgstr "Captura EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Llamada al sistema errónea"
+
+#~ msgid "Stack fault"
+#~ msgstr "Falta en la pila"
+
+#~ msgid "Information request"
+#~ msgstr "Petición de información"
+
+#~ msgid "Power failure"
+#~ msgstr "Falla de energía"
+
+#~ msgid "Resource lost"
+#~ msgstr "Recurso perdido"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "error al escribir a una tubería o socket cerrados"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Señal de tiempo real %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Señal %d desconocida"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "la función iconv no es utilizable"
+
+#~ msgid "iconv function not available"
+#~ msgstr "la función iconv no está disponible"
+
+#~ msgid "character out of range"
+#~ msgstr "carácter fuera de rango"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "no se puede convertir U+%04X al conjunto de caracteres local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "no se puede convertir U+%04X al conjunto de caracteres local: %s"
+
+# Me niego a considerar "inválido" como palabra "políticamente incorrecta".
+# Si algún "impedido físico" lee este mensaje y se molesta por ello, entonces
+# es que además de impedido físico es tonto, pues todo el mundo sabe que,
+# *en el contexto informático*, inválido e ilegal significan
+# "no permitido por la causa que sea".
+# Luego, que unas veces sea inválido y otras ilegal, son matices que el
+# original tiene y creo necesario respetar en la traducción.
+#
+# [ Tomás Bautista sugiere "inexistente", y también para grupo ]
+#
+# FIXME:
+# Eso sí, un día tendré que preguntar a los de GNU en qué se diferencia
+# "invalid" de "not allowed" de "not recognized" y todo eso... sv
+#
+#~ msgid "invalid user"
+#~ msgstr "usuario inválido"
+
+#~ msgid "invalid group"
+#~ msgstr "grupo inválido"
+
+# Me niego a considerar "inválido" como palabra "políticamente incorrecta".
+# Si algún "impedido físico" lee este mensaje y se molesta por ello, entonces
+# es que además de impedido físico es tonto, pues todo el mundo sabe que,
+# *en el contexto informático*, inválido e ilegal significan
+# "no permitido por la causa que sea".
+# Luego, que unas veces sea inválido y otras ilegal, son matices que el
+# original tiene y creo necesario respetar en la traducción.
+#
+# [ Tomás Bautista sugiere "inexistente", y también para grupo ]
+#
+# FIXME:
+# Eso sí, un día tendré que preguntar a los de GNU en qué se diferencia
+# "invalid" de "not allowed" de "not recognized" y todo eso... sv
+#
+#~ msgid "invalid spec"
+#~ msgstr "especificación inválida"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "no se puede mostrar el mensaje de error"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Empaquetado por %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Empaquetado por %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Licencia GPLv3+: GPL de GNU versión 3 o posterior\n"
+#~ "<http://gnu.org/licenses/gpl.html>.\n"
+#~ "Esto es software libre: tiene la libertad de cambiarlo y redistribuirlo.\n"
+#~ "No tiene GARANTÃA, en la extensión permitida por la ley.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Escrito por %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Escrito por %s y %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Escrito por %s, %s, y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, y %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, y otros.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Reporte bichos a: %s.\n"
+#~ "Reporte errores de traducción a: es@li.org\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Reporte bichos de %s a: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Página web de %s: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Página web de %s: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Ayuda general para usar software de GNU: <http://www.gnu.org/gethelp/>\n"
+
+#~ msgid "stdin"
+#~ msgstr "entrada estándard"
+
+#~ msgid "stdout"
+#~ msgstr "salida estándard"
+
+#~ msgid "stderr"
+#~ msgstr "salida de error estándard"
+
+#~ msgid "unknown stream"
+#~ msgstr "flujo desconocido"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "falló al reabrir %s con modo %s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "la comparación de cadenas falló"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr ""
+#~ "Establezca LC_ALL='C' para solucionar este problema de forma temporal."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Las cadenas comparadas eran %s y %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "no se puede mostrar la salida con formato"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "argumento `$3%s' inválido para $1%s$2%s"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "sufijo inválido en el argumento `$3%s' para $1%s$2%s"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "el argumento `$3%s' es demasiado grande para $1%s$2%s"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opción ilegal -- %c\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <%s>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Reporte bichos a <%s>.\n"
+
+#~ msgid "block size"
+#~ msgstr "tamaño del bloque"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s existe pero no es un directorio"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "no se puede cambiar el propietario y/o el grupo de %s"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "no se puede cambiar al directorio %s"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "no se puede obtener el grupo de login de un UID numérico"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Este programa es software libre; se pueden redistribuir copias del "
+#~ "mismo \n"
+#~ "bajo los términos de la Licencia Pública General de GNU\n"
+#~ "<http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "NO HAY GARANTÃA, a la extensión permitida por la ley.\n"
+#~ "\n"
diff --git a/gnulib_po/et.gmo b/gnulib_po/et.gmo
new file mode 100644
index 0000000..145b359
--- /dev/null
+++ b/gnulib_po/et.gmo
Binary files differ
diff --git a/gnulib_po/et.po b/gnulib_po/et.po
new file mode 100644
index 0000000..ef70221
--- /dev/null
+++ b/gnulib_po/et.po
@@ -0,0 +1,733 @@
+# This file is distributed under the same license as the gnulib package.
+# Estonian translations for gnulib
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# Toomas Soome <Toomas.Soome@microlink.ee>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-05-19 15:10+0300\n"
+"Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
+"Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-15\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Tundmatu süsteemne viga"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Aadressiperekonda või hostinime ei toetata"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Ajutine tõrge nime lahendamisel"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Vigane ai_flags väärtus"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "nime lahendamisl tekkis taastumatu tõrge"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family ei toetata"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Tõrge mälu haaramisel"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Hosti nimega ei ole aadresse seostatud"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nimi või teenus on tundmatu"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "ai_socktype ei toeta teenuse nime"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype ei toetata"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Süsteemne viga"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumentide puhver on liiga väike"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Päringu töötlemine käib"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Päring katkestati"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Päringut ei katkestatud"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Kõik päringud täidetud"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Katkestatud signaaliga"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parameetersõne ei ole korrektselt kodeeritud"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Tundmatu viga"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: võti '%s' on segane\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: võti '%s' on segane\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: tundmatu võti '%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: võti '%c%s' ei luba kasutada argumenti\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: võti '%s' nõuab argumenti\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: vigane võti -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: võti nõuab argumenti -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ei õnnestu registreerida jooksvat töökataloogi"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "esialgsesse töökataloogi ei õnnestu tagasi minna"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle ebaõnnestus"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "failipidet %d ei õnnestu taastada: dup2 ebaõnnestus"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Vigane regulaaravaldis"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Vigane võrdlussümbol"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Vigane sümbolite klassi nimi"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Vigane tagasiviide"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Vigane vahemiku lõpp"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Mälu on otsas"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Vigane eelnev regulaaravaldis"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Enneaegne regulaaravaldise lõpp"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regulaaravaldis on liiga pikk"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Eelmist regulaaravaldist pole"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "ei õnnestu luua toru"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: alamprotsess sai vea"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s alamprotsess"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s alamprotsess sai fataalse signaali %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "mälu on otsas"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "vigane argument %s võtmel `%s'"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "segane argument %s võtmele `%s'"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Lubatud argumendid on:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s väärtus on väiksem või võrdne kui %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT parameeter nõuab väärtust"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT parameeter peab olema positiivne"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Tundmatu ARGP_HELP_FMT parameeter"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Prügi ARGP_HELP_FMT sees: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Kohustuslikud argumendid pikkadele võtmetele on kohustuslikud ka "
+#~ "lühikestele."
+
+#~ msgid "Usage:"
+#~ msgstr "Kasutamine:"
+
+#~ msgid " or: "
+#~ msgstr " või: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [VÕTI]..."
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Lisainfo saamiseks proovige `%s --help' või `%s --usage'.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Vigadest teatage palun aadressil %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "anna see abiinfo"
+
+#~ msgid "give a short usage message"
+#~ msgstr "anna kasutamise lühikirjeldus"
+
+#~ msgid "NAME"
+#~ msgstr "NIMI"
+
+#~ msgid "set the program name"
+#~ msgstr "sea programmi nimi"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "oota SEK sekundit (vaikimisi 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "väljasta programmi versioon"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMMI VIGA) Versioon ei ole teada!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Liiga palju argumente\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMMI VIGA) Võti pidanuks olema teada!?"
+
+#~ msgid "program error"
+#~ msgstr "programmi viga"
+
+#~ msgid "stack overflow"
+#~ msgstr "pinu ületäitumine"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "ei leia ajutist kataloogi, proovige seada $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "vormiga \"%s\" ei saa ajutist kataloogi luua"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "ajutist faili %s ei õnnestu kustutada"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "ajutist kataloogi %s ei õnnestu kustutada"
+
+#~ msgid "error closing file"
+#~ msgstr "viga faili sulgemisel"
+
+#~ msgid "write error"
+#~ msgstr "viga kirjutamisel"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "säilitan %s õiguseid"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "viga \"%s\" lugemiseks avamisel"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "Varukoopia faili \"%s\" ei õnnestu kirjutamiseks avada"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "viga \"%s\" lugemisel"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "viga \"%s\" kirjutamisel"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "viga peale \"%s\" lugemist"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() ebaõnnestus"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "C# kompilaatorit pole, proovige paigaldada pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "C# virtuaalmasinat pole, proovige paigaldada pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "tavaline tühi fail"
+
+#~ msgid "regular file"
+#~ msgstr "tavaline fail"
+
+#~ msgid "directory"
+#~ msgstr "Kataloog"
+
+#~ msgid "block special file"
+#~ msgstr "blokkseadme fail"
+
+#~ msgid "character special file"
+#~ msgstr "sümbolseadme fail"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "nimeviide"
+
+#~ msgid "socket"
+#~ msgstr "sokkel"
+
+#~ msgid "message queue"
+#~ msgstr "teadete järjekord"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "jagatud mälu objekt"
+
+#~ msgid "typed memory object"
+#~ msgstr "tüübitud mälu objekt"
+
+#~ msgid "weird file"
+#~ msgstr "veider fail"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: võti '--%s' ei luba kasutada argumenti\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: tundmatu võti '--%s'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: võti '-W %s' on segane\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: võti '-W %s' ei luba kasutada argumenti\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "funktsiooni compile_java_class argument source_version on vigane"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "funktsiooni compile_java_class argument target_version on vigane"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "\"%s\" ei õnnestu luua"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "viga faili \"%s\" kirjutamisel"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Java kompilaatorit pole, proovige paigaldada gcj või seada $JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr "Java virtuaalmasinat pole, proovige paigaldada gcj või seada $JAVAC"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s: alamprotsess sai S/V vea"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "ei õnnestu muuta %s õigusi"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "kataloogi `%s' ei õnnestu luua"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Faili /dev/zero saa lugemiseks avada"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "lugemise lõime loomine ebaõnnestus"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "ühendus %s alamprotsessiga ebaõnnestus"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "kirjutamine %s alamprotsessi sai vea"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lugemine %s alamprotsessist sai vea"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "lõimede loomine ebaõnnestus"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[eE]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "ei õnnestu seada %s õigusi"
+
+#~ msgid "Bus error"
+#~ msgstr "Siini viga"
+
+#~ msgid "Power failure"
+#~ msgstr "Toite viga"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv funktsioon ei ole kasutatav"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv funktsioon puudub"
+
+#~ msgid "character out of range"
+#~ msgstr "sümbol on piirkonnast väljas"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "U+%04X ei saa lokaalsesse kooditabelisse teisendada: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "vigane kasutaja"
+
+#~ msgid "invalid group"
+#~ msgstr "vigane grupp"
+
+#~ msgid "invalid spec"
+#~ msgstr "vigane spetsifikatsioon"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Kirjutanud %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Kirjutanud %s ja %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Kirjutanud %s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s\n"
+#~ "ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s, %s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Kirjutanud %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s ja teised.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Vigadest teatage palun aadressil: %s.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "%s vigadest teatage palun aadressil: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s koduleht: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s koduleht: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Üldine abiinfo GNU tarkvara kasutamisest: <http://www.gnu.org/gethelp/>\n"
+
+#~ msgid "stdin"
+#~ msgstr "standardsisend"
+
+#~ msgid "stdout"
+#~ msgstr "standardväljund"
+
+#~ msgid "stderr"
+#~ msgstr "standardvead"
+
+#~ msgid "unknown stream"
+#~ msgstr "undmatu voog"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "reopen %s moodiga %s ebaõnnestus"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "sõnede võrdlus ebaõnnestus"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Probleemi lahendamiseks seadke LC_ALL=C."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Võrreldi sõnesid %s ja %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "ei õnnestu luua vormindatud väljundit"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "vigane %s%s argument `%s'"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "vigane sufiks %s%s argument `%s'"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "%s%s argument `%s' on liiga suur"
diff --git a/gnulib_po/eu.gmo b/gnulib_po/eu.gmo
new file mode 100644
index 0000000..0da0aef
--- /dev/null
+++ b/gnulib_po/eu.gmo
Binary files differ
diff --git a/gnulib_po/eu.po b/gnulib_po/eu.po
new file mode 100644
index 0000000..8c6f893
--- /dev/null
+++ b/gnulib_po/eu.po
@@ -0,0 +1,569 @@
+# translation of coreutils-5.2.1.po to Euskara
+# Basque translation of 5.2.1.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the Coreutils-5.2.1 package.
+# Mikel Olasagasti <hey_neken@mundurat.net>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: coreutils-5.2.1\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2005-01-04 20:27+0100\n"
+"Last-Translator: Mikel Olasagasti <hey_neken@mundurat.net>\n"
+"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Sistema-errore ezezaguna"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fifo fitxategiek ez dute euskarririk"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fifo fitxategiek ez dute euskarririk"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fifo fitxategiek ez dute euskarririk"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "idazketa errorea"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Sistema-errore ezezaguna"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: '%s' aukera anbiguoa da\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: '%s' aukera anbiguoa da\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: '%c%s' aukera ezezaguna\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: '%c%s' aukerak ez du argumenturik onartzen\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: '%s' aukerak argumentu bat behar du\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: -- %c aukera baliogabea\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: aukerak --%c argumentu bat behar du\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "Inprimatu Fitxategi-izena - e e"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "Inprimatu Fitxategi-izena - e e"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "memoria agortuta"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "in bilatu"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "baliogabea"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "in bilatu"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "ezin da %s esteka sortu"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "baliogabea"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "baliogabea"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "baliogabea"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memoria agortuta"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "%s baliogabeko argumentua da %s-(r)entzat"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "%s argumentu anbiguoa da %s-(r)entzat"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Baliozko argumentuak hauek dira:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Beharrezkoak diren argumentuak aukera luzeetan, beharrezkoak dira aukera "
+#~ "txikietan ere.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Erabilera: %s [AUKERA]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Saiatu `%s --help' erabiltzen informazio gehiagorako.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Programa-erroreen berri emateko idatzi hona: <%s>.\n"
+
+#~ msgid "NAME"
+#~ msgstr "IZENA"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "e"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "irakurketa errorea"
+
+#~ msgid "write error"
+#~ msgstr "idazketa errorea"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "errepikatu arte"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "errepikatu arte"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "errorea %s irakurtzen"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "errorea %s idazten"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "errorea %s irakurtzen"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "irekitzeak huts egin du"
+
+#~ msgid "regular empty file"
+#~ msgstr "fitxategi erregular hutsa"
+
+#~ msgid "regular file"
+#~ msgstr "Espresio erregularra"
+
+#~ msgid "directory"
+#~ msgstr "direktorioa"
+
+#, fuzzy
+#~ msgid "block special file"
+#~ msgstr "bloke tamainua"
+
+#, fuzzy
+#~ msgid "character special file"
+#~ msgstr "offset karakterea zero da"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "esteka sinbolikoa"
+
+#~ msgid "socket"
+#~ msgstr "socket-a"
+
+#~ msgid "message queue"
+#~ msgstr "Bidali ilara"
+
+#~ msgid "semaphore"
+#~ msgstr "semaforoa"
+
+#~ msgid "shared memory object"
+#~ msgstr "memoria partekatuaren objektua"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "memoria partekatuaren objektua"
+
+#~ msgid "weird file"
+#~ msgstr "fitxategi arraroa"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: '--%s' aukerak ez du argumenturik onartzen\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: '--%s' aukera ezezaguna\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: -- %c aukera ilegala\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: '-W %s' aukera anbiguoa da\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: '-W.%s' aukerak ez du argumenturik onartzen\n"
+
+#~ msgid "block size"
+#~ msgstr "bloke tamainua"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s badago baina ez da direktorio bat"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "ezin da %s-(r)en jabetza eta/edo taldea aldatu"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "ezin da %s direktorioa sortu"
+
+#, fuzzy, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "ezin da %s direktoriora aldatu"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "ezin da %s-(r)en baimenak aldatu"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "baimenak errepikatu arte"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[bB]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[eE]"
+
+#~ msgid "character out of range"
+#~ msgstr "karakterea barrutitik kanpora"
+
+#~ msgid "invalid user"
+#~ msgstr "baliogabeko erabiltzailea"
+
+#~ msgid "invalid group"
+#~ msgstr "baliogabeko taldea"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "ezin da UID zenbaki baten saio taldea lortu"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "programa da eta edo - Orokorra Publikoa Lizentzia bider Libre Softwarea "
+#~ "edo e e"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "%s-k idatzia.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "%s-k eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "%s, %s eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s, %s eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s, %s, %s, eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s, %s, %s, %s,%s, eta %s-k idatzia.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "%s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s,·eta beste batzuk idatzia.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "kate konparaketak huts egin du"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Ezarri LC_ALL='C' arazo hau une batez konpontzeko"
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Alderatutako bi kateak %s eta %s izan dira."
diff --git a/gnulib_po/fi.gmo b/gnulib_po/fi.gmo
new file mode 100644
index 0000000..5b53777
--- /dev/null
+++ b/gnulib_po/fi.gmo
Binary files differ
diff --git a/gnulib_po/fi.po b/gnulib_po/fi.po
new file mode 100644
index 0000000..b9deaee
--- /dev/null
+++ b/gnulib_po/fi.po
@@ -0,0 +1,973 @@
+# Finnish messages for gnulib.
+# Copyright © 2002, 2003, 2004, 2009, 2010, 2011, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Lauri Nurmi <lanurmi@iki.fi>, 2003, 2004, 2019.
+# Matti Koskimies <matti@apulanta.fi>, 2002.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2009-2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-12-26 12:28+0200\n"
+"Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural= ( n!=1) ;\n"
+"X-Generator: Poedit 2.2.4\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Tuntematon järjestelmävirhe"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Konenimen osoiteperhe ei ole tuettu"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Väliaikainen häiriö nimenselvityksessä"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Virheellinen arvo ai_flags-kentälle"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Korjautumaton häiriö nimenselvityksessä"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family ei ole tuettu"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Muistinvarausvirhe"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Konenimeen ei liity osoitetta"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nimi tai palvelu on tuntematon"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname ei ole tuettu kohteelle ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype ei ole tuettu"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Järjestelmävirhe"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumenttipuskuri on liian pieni"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Pyynnön käsittely käynnissä"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Pyyntö peruttu"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Pyyntöä ei peruttu"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Kaikki pyynnöt suoritettu"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Signaalin keskeyttämä"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parametrimerkkijono on väärin koodattu"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Tuntematon virhe"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: valitsin â€%s%s†on moniselitteinen\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: valitsin â€%s%s†on moniselitteinen; vaihtoehdot:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: tunnistamaton valitsin â€%s%sâ€\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: valitsin â€%s%s†ei salli argumenttia\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: valitsin â€%s%s†vaatii argumentin\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: virheellinen valitsin -- â€%câ€\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: valitsin vaatii argumentin -- â€%câ€\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nykyisen työhakemiston kirjaaminen ei onnistu"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "palaaminen alkuperäiseen työhakemistoon epäonnistui"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle epäonnistui"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ei voi palauttaa tiedostokahvaa %d: dup2 epäonnistui"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "â€"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Onnistui"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Ei täsmäävyyttä"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Virheellinen säännöllinen lauseke"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Virheellinen vertailumerkki"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Virheellinen merkkiluokan nimi"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Kenoviiva lopussa"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Virheellinen takaisinviittaus"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Pariton [, [^, [:, [. tai [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Pariton ( tai \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Pariton \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Virheellinen \\{\\}:n sisältö"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Virheellinen välin loppu"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Muisti lopussa"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Virheellinen edeltävä säännöllinen lauseke"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Ennenaikainen säännöllisen lausekkeen loppu"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Säännöllinen lauseke on liian suuri"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Pariton ) tai \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Ei edellistä säännöllistä lauseketta"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "ei voida luoda putkea"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-aliprosessi epäonnistui"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s-aliprosessi"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s-aliprosessi vastaanotti fataalin signaalin %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "muisti loppui"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "virheellinen argumentti %s kontekstille %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "moniselitteinen argumentti %s kontekstille %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Kelvolliset argumentit:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s-arvo on pienempi tai yhtäsuuri kuin %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parametri vaatii arvon"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Tuntematon ARGP_HELP_FMT-parametri"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Roskaa ARGP_HELP_FMT:ssä: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Pitkien valitsinten pakolliset tai valinnaiset argumentit ovat pakollisia "
+#~ "tai valinnaisia myös vastaaville lyhyille."
+
+#~ msgid "Usage:"
+#~ msgstr "Käyttö:"
+
+#~ msgid " or: "
+#~ msgstr " tai: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [VALITSIN...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Lisätietoja komennolla â€%s --help†tai â€%s --usageâ€.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Lähetä raportit ohjelmistovioista (englanniksi) osoitteeseen %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "anna tämä opasteluettelo"
+
+#~ msgid "give a short usage message"
+#~ msgstr "anna lyhyt käyttöohje"
+
+#~ msgid "NAME"
+#~ msgstr "NIMI"
+
+#~ msgid "set the program name"
+#~ msgstr "aseta ohjelman nimi"
+
+#~ msgid "SECS"
+#~ msgstr "S"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "odota S sekuntia (oletus 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "tulosta ohjelman versio"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(OHJELMAVIRHE) Versiota ei tiedetä!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Liian monta argumenttia\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(OHJELMAVIRHE) Valitsin olisi pitänyt tunnistaa‽"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u vapautettu (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u vapautettu (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u välimuistitettu (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u välimuistitettu (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "määrälokihistogrammi\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "kokolokihistogrammi\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "tiheyshistogrammi\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr "Bitset-tilasto:\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Kertyneet ajot = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "ei voida lukea tilastotiedostoa"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "virheellinen tilastotiedoston koko\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "ei voida kirjoittaa tilastotiedostoa"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "ei voida avata tilastotiedostoa kirjoitettavaksi"
+
+#~ msgid "program error"
+#~ msgstr "ohjelmavirhe"
+
+#~ msgid "stack overflow"
+#~ msgstr "pinon ylivuoto"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "tilapäisen hakemiston löytäminen epäonnistui, yritä asettaa $TMPDIR-"
+#~ "muuttuja"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "ei voida luoda tilapäishakemistoa mallin â€%s†pohjalta"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "ei voida poistaa tilapäistiedostoa %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "ei voida poistaa tilapäishakemistoa %s"
+
+#~ msgid "error closing file"
+#~ msgstr "virhe tiedoston sulkemisessa"
+
+#~ msgid "write error"
+#~ msgstr "kirjoitusvirhe"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "säilytetään oikeudet kohteelle %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "virhe avattaessa tiedostoa %s luettavaksi"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "ei voida avata varmuuskopiotiedostoa %s kirjoitettavaksi"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "virhe luettaessa tiedostoa %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "virhe kirjoitettaessa tiedostoa %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "virhe tiedoston %s lukemisen jälkeen"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() epäonnistui"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "C#-kääntäjää ei löytynyt, yritä asentaa mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "C#-virtuaalikonetta ei löytynyt, yritä asentaa mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "pariton ["
+
+#~ msgid "invalid character class"
+#~ msgstr "virheellinen merkkiluokka"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "merkkiluokkasyntaksi on [[:space:]], ei [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "keskeneräinen \\-ohjaussarja"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "virheellinen \\{\\}:n sisältö"
+
+#~ msgid "regular expression too big"
+#~ msgstr "säännöllinen lauseke on liian suuri"
+
+#~ msgid "unbalanced ("
+#~ msgstr "pariton ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "syntaksia ei ole määritelty"
+
+#~ msgid "unbalanced )"
+#~ msgstr "pariton )"
+
+#~ msgid "regular empty file"
+#~ msgstr "tavallinen tyhjä tiedosto"
+
+#~ msgid "regular file"
+#~ msgstr "tavallinen tiedosto"
+
+#~ msgid "directory"
+#~ msgstr "hakemisto"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolinen linkki"
+
+#~ msgid "message queue"
+#~ msgstr "viestijono"
+
+#~ msgid "semaphore"
+#~ msgstr "semafori"
+
+#~ msgid "shared memory object"
+#~ msgstr "jaetun muistin objekti"
+
+#~ msgid "typed memory object"
+#~ msgstr "tyypitetty muistiobjekti"
+
+#~ msgid "block special file"
+#~ msgstr "lohkoerikoistiedosto"
+
+#~ msgid "character special file"
+#~ msgstr "merkkierikoistiedosto"
+
+#~ msgid "contiguous data"
+#~ msgstr "yhtenäistä dataa"
+
+#~ msgid "fifo"
+#~ msgstr "putkitiedosto"
+
+#~ msgid "door"
+#~ msgstr "ovi"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "limitetty lohkoerikoistiedosto"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "limitetty merkkierikoistiedosto"
+
+#~ msgid "multiplexed file"
+#~ msgstr "limitetty tiedosto"
+
+#~ msgid "named file"
+#~ msgstr "nimetty tiedosto"
+
+#~ msgid "network special file"
+#~ msgstr "verkkoerikoistiedosto"
+
+#~ msgid "migrated file with data"
+#~ msgstr "datallinen siirretty tiedosto"
+
+#~ msgid "migrated file without data"
+#~ msgstr "dataton siirretty tiedosto"
+
+#~ msgid "port"
+#~ msgstr "portti"
+
+#~ msgid "socket"
+#~ msgstr "pistoke"
+
+#~ msgid "whiteout"
+#~ msgstr "himmeä"
+
+#~ msgid "weird file"
+#~ msgstr "outo tiedosto"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "virheellinen source_version-argumentti kohteelle compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "virheellinen target_version-argumentti kohteelle compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "tiedoston â€%s†luominen epäonnistui"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "virhe kirjoitettaessa tiedostoa â€%sâ€"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Java-kääntäjää ei löytynyt, yritä asentaa gcj tai aseta $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Java-virtuaalikonetta ei löytynyt, yritä asentaa gij tai aseta $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s-aliprosessin siirräntävirhe"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "tiedoston %s tilaa ei voi lukea"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "tiedoston %s oikeuksien muuttaminen ei onnistu"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "hakemiston %s luominen ei onnistu"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Tiedoston /dev/zero avaaminen lukemista varten epäonnistui"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "lukemissäikeen luominen epäonnistui"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "ei-lukitsevan siirron asettaminen aliprosessiin %s epäonnistui"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "viestintä aliprosessin %s kanssa epäonnistui"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "kirjoittaminen aliprosessiin %s epäonnistui"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lukeminen aliprosessista %s epäonnistui"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "aliprosessi %s päättyi paluuarvolla %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "säikeiden luominen epäonnistui"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s-aliprosessi päättyi paluuarvolla %d"
+
+# Kaikkihan muistavat kääntää nämä ja vastaavat juuri näin. Ei pelkkä kK.
+#~ msgid "^[yY]"
+#~ msgstr "^[kKyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[eEnN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "asetetaan oikeudet tiedostolle %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Linjankatkaisu"
+
+#~ msgid "Interrupt"
+#~ msgstr "Keskeytys"
+
+#~ msgid "Quit"
+#~ msgstr "Lopetettu"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Virheellinen käsky"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Jäljitys-/katkaisupisteansa"
+
+#~ msgid "Aborted"
+#~ msgstr "Keskeytetty"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Liukulukupoikkeus"
+
+#~ msgid "Killed"
+#~ msgstr "Sammutettu"
+
+#~ msgid "Bus error"
+#~ msgstr "Väylävirhe"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Muistialueen ylitys"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Katkennut putki"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Herätyskello"
+
+#~ msgid "Terminated"
+#~ msgstr "Päätetty"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Kiireellinen I/O-ehto"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Pysäytetty (signaali)"
+
+#~ msgid "Stopped"
+#~ msgstr "Pysäytetty"
+
+#~ msgid "Continued"
+#~ msgstr "Jatkettu"
+
+#~ msgid "Child exited"
+#~ msgstr "Lapsi lopetti"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Pysäytetty (tty-syöte)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Pysäytetty (tty-tuloste)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O mahdollista"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Suoritinaikaraja ylittynyt"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Tiedoston kokoraja ylitetty"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuaaliajastin vanhentunut"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profilointiajastin vanhentunut"
+
+#~ msgid "Window changed"
+#~ msgstr "Ikkuna vaihtunut"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Käyttäjän määrittelemä signaali 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Käyttäjän määrittelemä signaali 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT-ansa"
+
+#~ msgid "Bad system call"
+#~ msgstr "Virheellinen järjestelmäkutsu"
+
+#~ msgid "Stack fault"
+#~ msgstr "Pinovirhe"
+
+#~ msgid "Information request"
+#~ msgstr "Tietopyyntö"
+
+#~ msgid "Power failure"
+#~ msgstr "Sähkökatko"
+
+#~ msgid "Resource lost"
+#~ msgstr "Resurssi menetetty"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "virhe kirjoitettaessa suljettuun putkeen tai pistokkeeseen"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Reaaliaikasignaali %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Tuntematon signaali %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Suoritusajat (sekuntia)"
+
+#~ msgid "CPU user"
+#~ msgstr "Suoritin (käyttäjä)"
+
+#~ msgid "CPU system"
+#~ msgstr "Suoritin (järjestelmä)"
+
+#~ msgid "wall clock"
+#~ msgstr "seinäkello"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv-funktio ei ole käyttökelpoinen"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv-funktio ei ole saatavilla"
+
+#~ msgid "character out of range"
+#~ msgstr "merkki sallitun välin ulkopuolella"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "merkin U+%04X muunnos paikalliseen merkistöön ei onnistu: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "virheellinen käyttäjä"
+
+#~ msgid "invalid group"
+#~ msgstr "virheellinen ryhmä"
+
+#~ msgid "invalid spec"
+#~ msgstr "virheellinen määrittely"
+
+#~ msgid "unable to display error message"
+#~ msgstr "ei kyetä näyttämään virheilmoitusta"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Paketoinut %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Paketoinut %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Lisenssi GPLv3+: GNU GPL versio 3 tai myöhempi <%s>.\n"
+#~ "\"Tämä on vapaa ohjelmisto; sitä saa vapaasti muuttaa ja levittää\n"
+#~ "\"edelleen. Siinä määrin kuin laki sallii, TAKUUTA EI OLE.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Kirjoittanut %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Kirjoittaneet %s ja %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Kirjoittaneet %s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s, %s,\n"
+#~ "%s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s ja %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Kirjoittaneet %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, %s ja muut.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Lähetä ilmoitukset ohjelmistovioista (englanniksi) osoitteeseen: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Ilmoita %s-vioista (englanniksi) osoitteeseen %s.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s-kotisivu: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Yleisohjeita GNU-ohjelmistojen käyttöön: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "tiedostokahvan teksti-/binääritilan asettaminen epäonnistui"
+
+#~ msgid "stdin"
+#~ msgstr "vakiosyöte"
+
+#~ msgid "stdout"
+#~ msgstr "vakiotuloste"
+
+#~ msgid "stderr"
+#~ msgstr "vakiovirhetuloste"
+
+#~ msgid "unknown stream"
+#~ msgstr "tuntematon virta"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "kohteen %s avaaminen uudelleen tilassa %s epäonnistui"
+
+#~ msgid "string comparison failed"
+#~ msgstr "merkkijonovertailu epäonnistui"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Aseta LC_ALL='C' ongelman kiertämiseksi."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Vertaillut merkkijonot olivat %s ja %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "muotoiltua tulostusta ei voitu suorittaa"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "tavalliset tiedostokahvat"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "virheellinen %s%s-argumentti â€%sâ€"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "virheellinen loppuliite %s%s-argumentissa â€%sâ€"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s-argumentti â€%s†on liian suuri"
diff --git a/gnulib_po/fr.gmo b/gnulib_po/fr.gmo
new file mode 100644
index 0000000..7358e36
--- /dev/null
+++ b/gnulib_po/fr.gmo
Binary files differ
diff --git a/gnulib_po/fr.po b/gnulib_po/fr.po
new file mode 100644
index 0000000..0593dcd
--- /dev/null
+++ b/gnulib_po/fr.po
@@ -0,0 +1,987 @@
+# Messages français pour GNU concernant gnulib.
+# Copyright © 1996-, 2008, 2011 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-.
+# Nicolas Provost <nprovost@quadriv.com>, 2008.
+# David Prévot <david@tilapin.org>, 2011.
+# Stéphane Aulery <lkppo@free.fr>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib-4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-21 20:15+0200\n"
+"Last-Translator: Stéphane Aulery <lkppo@free.fr>\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-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Lokalize 1.2\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Erreur système inconnue"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Famille d'adresses du nom d'hôte non pris en charge"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Échec temporaire lors de la résolution de noms"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Mauvaise valeur pour ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Échec définitif lors de la résolution de noms"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family non pris en charge"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Échec d'allocation mémoire"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Aucune adresse associée au nom d'hôte"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nom ou service inconnu"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Nom de serveur non pris en charge pour ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype non pris en charge"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Erreur système"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Mémoire tampon d'argument trop petite"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Traitement de la requête en cours"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Requête annulée"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Requête non annulée"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Requêtes toutes traitées"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interruption par un signal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Chaîne de paramètre mal encodé"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Erreur inconnue"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s : l'option « %s%s » est ambiguë\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s : l'option « %s%s » est ambiguë, possibilités :"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s : option « %s%s » non reconnue\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s : l'option « %s%s » ne prend pas d'argument\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s : l'option « %s%s » nécessite un argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s : option non valable -- « %c »\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s : l'option nécessite un argument -- « %c »\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "impossible de mémoriser le répertoire de travail courant"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "échec de retour au répertoire initial de travail"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "échec de _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+"impossible de restaurer le descripteur de fichier (fd) %d : échec de dup2"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "« "
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr " »"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Succès"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Pas de correspondance"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expression rationnelle non valable"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Caractère d'assemblage non valable"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nom de classe de caractères non valable"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barre oblique inverse en fin de ligne"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Référence antérieure non valable"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [. ou [= non appairé"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( non appairée"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ non appairée"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Le contenu de \\{\\} n'est pas valable"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Borne finale de l'intervalle non valable"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Mémoire épuisée"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expression rationnelle précédente non valable"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fin prématurée d'expression rationnelle"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expression rationnelle trop grande"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) non appairée"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Pas d'expression rationnelle précédente"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "impossible de créer un tube (« pipe »)"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "échec de sous-processus %s"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "sous-processus %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "le sous-processus %s a reçu un signal fatal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "mémoire épuisée"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argument %s non valable pour %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argument %s ambigu pour %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Les arguments valables sont :"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT : la valeur %s est inférieure ou égale à %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s : le paramètre ARGP_HELP_FMT nécessite une valeur"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s : paramètre ARGP_HELP_FMT inconnu"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Problème dans ARGP_HELP_FMT : %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Les arguments obligatoires pour la forme longue des options le sont aussi "
+#~ "pour les formes courtes associées."
+
+#~ msgid "Usage:"
+#~ msgstr "Utilisation :"
+
+#~ msgid " or: "
+#~ msgstr " ou : "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPTION...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Essayez « %s --help » ou « %s --usage » pour obtenir plus de "
+#~ "renseignements.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Signalez toute anomalie à %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "affiche cette aide"
+
+#~ msgid "give a short usage message"
+#~ msgstr "donne un court message d'utilisation"
+
+#~ msgid "NAME"
+#~ msgstr "NOM"
+
+#~ msgid "set the program name"
+#~ msgstr "définit le nom du programme"
+
+#~ msgid "SECS"
+#~ msgstr "SECS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "suspension pendant SECS secondes (par défaut 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "affiche la version du programme"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(Erreur du programme) pas de version connue !"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s : trop d'arguments\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(Erreur du programme) l'option aurait dû être reconnue !"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u libérés (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u cachés (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u cachés (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u cachés (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histogramme par comptage\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histogramme par taille\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histogramme par densité\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiques de bitset :\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Lancement cumulés = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "impossible de lire les permissions du fichier"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "taille du fichier de permission erroné\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "impossible d'écrire les permissions du fichier"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "impossible d'ouvrir les permissions du fichier en écriture"
+
+#~ msgid "program error"
+#~ msgstr "erreur du programme"
+
+#~ msgid "stack overflow"
+#~ msgstr "dépassement de pile"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "impossible de trouver un répertoire temporaire, essayez de définir $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr ""
+#~ "impossible de créer un répertoire temporaire en utilisant le modèle "
+#~ "« %s »."
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "impossible de supprimer le ficher temporaire %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "impossible de supprimer le répertoire temporaire %s"
+
+#~ msgid "error closing file"
+#~ msgstr "erreur de fermeture de fichier"
+
+#~ msgid "write error"
+#~ msgstr "erreur d'écriture"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "conservation des permissions de %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "erreur à l'ouverture de %s en lecture"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "impossible d'ouvrir le fichier de sauvegarde %s en écriture"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "erreur de lecture de %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "erreur d'écriture de %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "erreur après la lecture de %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "échec de fdopen()"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "compilateur C# non trouvé, essayez d'installer mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "machine virtuelle C# non trouvée, essayez d'installer mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "[ non appairée"
+
+#~ msgid "invalid character class"
+#~ msgstr "nom de classe de caractères non valable"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr ""
+#~ "la syntaxe de la classe de caractères est [[:space:]], et non [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "espace \\ non terminé"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "le contenu de \\{\\} n'est pas valable"
+
+#~ msgid "regular expression too big"
+#~ msgstr "expression rationnelle trop grande"
+
+#~ msgid "unbalanced ("
+#~ msgstr "( non appairée"
+
+#~ msgid "no syntax specified"
+#~ msgstr "pas de syntaxe spécifiée"
+
+#~ msgid "unbalanced )"
+#~ msgstr ") non appairée"
+
+#~ msgid "regular empty file"
+#~ msgstr "fichier régulier vide"
+
+#~ msgid "regular file"
+#~ msgstr "fichier régulier"
+
+#~ msgid "directory"
+#~ msgstr "répertoire"
+
+#~ msgid "symbolic link"
+#~ msgstr "lien symbolique"
+
+#~ msgid "message queue"
+#~ msgstr "file de messages"
+
+#~ msgid "semaphore"
+#~ msgstr "sémaphore"
+
+#~ msgid "shared memory object"
+#~ msgstr "objet de mémoire partagée"
+
+#~ msgid "typed memory object"
+#~ msgstr "objet mémoire typé"
+
+#~ msgid "block special file"
+#~ msgstr "fichier spécial de blocs"
+
+#~ msgid "character special file"
+#~ msgstr "fichier spécial de caractères"
+
+#~ msgid "contiguous data"
+#~ msgstr "données contiguës"
+
+#~ msgid "fifo"
+#~ msgstr "PEPS (FIFO)"
+
+#~ msgid "door"
+#~ msgstr "porte"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "fichier spécial de blocs multipléxé"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "fichier spécial de caractères mulipléxé"
+
+#~ msgid "multiplexed file"
+#~ msgstr "fichier multipléxé"
+
+#~ msgid "named file"
+#~ msgstr "fichier nommé"
+
+#~ msgid "network special file"
+#~ msgstr "fichier spécial de réseau"
+
+#~ msgid "migrated file with data"
+#~ msgstr "fichier migré avec ses données"
+
+#~ msgid "migrated file without data"
+#~ msgstr "fichier migré sans ses données"
+
+#~ msgid "port"
+#~ msgstr "port"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "whiteout"
+#~ msgstr "sans"
+
+#~ msgid "weird file"
+#~ msgstr "fichier bizarre"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argument source_version non valable pour compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argument target_version non valable pour compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "échec de création de « %s »"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "erreur lors de l'écriture du fichier « %s »"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "compilateur Java non trouvé, essayez d'installer gcj ou de définir $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "machine virtuelle Java non trouvée, essayez d'installer gij ou de définir "
+#~ "$JAVAC"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "erreur d'entrée sortie du sous-processus %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "impossible de lire les permissions de %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "impossible de modifier les permissions de %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "impossible de créer le répertoire %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Échec d'ouverture de /dev/zero en lecture"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "échec de création du processus de lecture"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr ""
+#~ "impossible de configurer l'entrée sortie non bloquante au sous-processus "
+#~ "%s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "échec de communication avec le sous-processus %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "échec d'écriture vers le sous-processus %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "échec de lecture depuis le sous-processus %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "le sous-processus %s s'est terminé avec le code de retour %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "échec de création de processus"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "le sous-processus de %s s'est terminé avec le code de retour %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[oOyY].*"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN].*"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "impossible de définir les permissions de %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Raccrocher"
+
+#~ msgid "Interrupt"
+#~ msgstr "Interrompre"
+
+#~ msgid "Quit"
+#~ msgstr "Quitter"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Instruction illégale"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Piège de trace ou point de d'arrêt "
+
+#~ msgid "Aborted"
+#~ msgstr "Abandonné"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Exception de virgule flottante"
+
+#~ msgid "Killed"
+#~ msgstr "Tué"
+
+#~ msgid "Bus error"
+#~ msgstr "Erreur de bus"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Erreur de segmentation"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Tube rompu"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Réveil"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminé"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Condition d'entrée sortie urgente"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Arrêté (signal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Arrêté"
+
+#~ msgid "Continued"
+#~ msgstr "Continué"
+
+#~ msgid "Child exited"
+#~ msgstr "Fin du processus fils"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Arrêté (entrée de tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Arrêté (sortie de tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Entrée sortie possible"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Temps limite de processeur dépassé"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Taille limite de fichier dépassée"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Temporisation virtuelle dépassée"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Temporisation de profilage dépassée"
+
+#~ msgid "Window changed"
+#~ msgstr "Fenêtre modifiée"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Signal 1 défini par utilisateur"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Signal 2 défini par utilisateur"
+
+#~ msgid "EMT trap"
+#~ msgstr "Piège EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Mauvais appel système"
+
+#~ msgid "Stack fault"
+#~ msgstr "Défaut de pile"
+
+#~ msgid "Information request"
+#~ msgstr "Demande de renseignements"
+
+#~ msgid "Power failure"
+#~ msgstr "Échec d'alimentation"
+
+#~ msgid "Resource lost"
+#~ msgstr "Ressource perdue"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "Erreur d'écriture vers un tube ou un socket fermé"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Signal %d en temps réel"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Signal %d inconnu"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Temps d'exécution (s)"
+
+#~ msgid "CPU user"
+#~ msgstr "Temps utilisateur"
+
+#~ msgid "CPU system"
+#~ msgstr "Temps système"
+
+#~ msgid "wall clock"
+#~ msgstr "horloge murale"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "fonction iconv non utilisable"
+
+#~ msgid "iconv function not available"
+#~ msgstr "fonction iconv non disponible"
+
+#~ msgid "character out of range"
+#~ msgstr "caractère hors limites"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "impossible de convertir U+%04X dans le jeu de caractères local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "impossible de convertir U+%04X dans le jeu de caractères local : %s"
+
+#~ msgid "invalid user"
+#~ msgstr "utilisateur non valable"
+
+#~ msgid "invalid group"
+#~ msgstr "groupe non valable"
+
+#~ msgid "invalid spec"
+#~ msgstr "spécification non valable"
+
+#~ msgid "unable to display error message"
+#~ msgstr "impossible d'afficher le message d'erreur"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Empaqueté par %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Empaqueté par %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licence GPLv3+ : GNU GPL version 3 ou ultérieure <%s>\n"
+#~ "Logiciel libre : vous êtes libre de le modifier ou de le redistribuer.\n"
+#~ "Il n'y a AUCUNE GARANTIE, dans les limites permises par la loi.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Écrit par %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Écrit par %s et %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Écrit par %s, %s et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s, %s, et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s, %s, %s, et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s et %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Écrit par %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s et d'autres.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Signalez toute anomalie à : %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Signalez les anomalies de %s à : %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "page d'accueil de %s : <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Aide globale sur les logiciels GNU : <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr ""
+#~ "impossible de définir le mode texte/binaire du descripteur de fichier"
+
+#~ msgid "stdin"
+#~ msgstr "entrée standard (stdin)"
+
+#~ msgid "stdout"
+#~ msgstr "sortie standard (stdout)"
+
+#~ msgid "stderr"
+#~ msgstr "sortie d'erreur (stderr)"
+
+#~ msgid "unknown stream"
+#~ msgstr "flux inconnu"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "impossible de rouvrir %s en mode %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "échec de comparaison de chaîne"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Définir LC_ALL='C' pour contourner le problème."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Les chaînes comparées étaient %s et %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "impossible mettre en forme la sortie formatée"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "descripteurs de fichier standards"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "argument %s%s non valable « %s »"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "suffixe non valable dans l'argument %s%s « %s »"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "argument %s%s « %s » trop grand"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "page d'accueil de %s : <https://www.gnu.org/software/%s/>\n"
diff --git a/gnulib_po/ga.gmo b/gnulib_po/ga.gmo
new file mode 100644
index 0000000..880c3f5
--- /dev/null
+++ b/gnulib_po/ga.gmo
Binary files differ
diff --git a/gnulib_po/ga.po b/gnulib_po/ga.po
new file mode 100644
index 0000000..d777ee1
--- /dev/null
+++ b/gnulib_po/ga.po
@@ -0,0 +1,740 @@
+# Irish translations for gnulib.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Kevin Patrick Scannell <scannell@SLU.EDU>, 2005, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 1.1\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2007-07-20 12:24-0600\n"
+"Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
+"(n>6 && n<11) ? 3 : 4;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Earráid chórais anaithnid"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Aicme sheolta d'óstainm gan tacaíocht"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Teip shealadach ar réiteach na n-ainmneacha"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Luach neamhbhailí do 'ai_flags'"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Teip dhocheartaithe ar réiteach na n-ainmneacha"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ní thacaítear le 'ai_family'"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Theip ar dháil chuimhne"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Níl seoladh ar bith ceangailte leis an óstainm"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Ainm nó seirbhís anaithnid"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Ní thacaítear le hainm freastalaithe do 'ai_socktype'"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ní thacaítear le 'ai_socktype'"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Earráid chórais"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Tá an argóint mhaoláin róbheag"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Iarratas próiseála ar siúl"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Cealaíodh an t-iarratas"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Níor cealaíodh an t-iarratas"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Cuireadh gach iarratas i gcrích"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Idirbhriste ag comhartha"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Níl an teaghrán paraiméadair ionchódaithe i gceart"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Earráid anaithnid"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: Tá an rogha `%s' débhríoch\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: Tá an rogha `%s' débhríoch\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: rogha anaithnid `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `%c%s'\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: tá argóint de dhíth i ndiaidh na rogha `%s'\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: rogha neamhbhailí -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- %c\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ní féidir an chomhadlann oibre a thaifead"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "níl aon fháil ar an chéad chomhadlann oibre"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "D'éirigh leis"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Gan mheaitseáil"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Slonn ionadaíochta neamhbhailí"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carachtar neamhbhailí comhordaithe"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ainm neamhbhailí ar aicme charachtar"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Cúlslais chun deiridh"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Cúltagairt neamhbhailí"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ nó [^ corr"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( nó \\( corr"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ corr"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ábhar neamhbhailí idir \\{ agus \\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Deireadh raoin neamhbhailí"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Cuimhne ídithe"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Is neamhbhailí an slonn ionadaíochta roimhe seo"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Deireadh le slonn ionadaíochta gan choinne"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Slonn ionadaíochta rómhór"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") nó \\) corr"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Níl aon slonn ionadaíochta roimhe seo"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "ní féidir píopa a chruthú"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "theip ar fhophróiseas %s"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "fophróiseas %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "fuair fophróiseas %s comhartha marfach %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "cuimhne ídithe"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argóint neamhbhailí %s chun %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argóint dhébhríoch %s chun %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Na hargóintí bailí:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: luach %s níos lú ná nó cothrom le %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: luach de dhíth ar pharaiméadar ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: luach deimhneach de dhíth ar pharaiméadar ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Paraiméadar anaithnid ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Truflais i ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Is riachtanach/roghnach le rogha ghearr aon argóint atá riachtanach/"
+#~ "roghnach leis an rogha fhada."
+
+#~ msgid "Usage:"
+#~ msgstr "Úsáid:"
+
+#~ msgid " or: "
+#~ msgstr " nó: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [ROGHA...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Bain triail as `%s --help' nó `%s --usage' chun tuilleadh eolais a "
+#~ "fháil.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Seol tuairiscí fabhtanna chuig %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "taispeáin an chabhair seo"
+
+#~ msgid "give a short usage message"
+#~ msgstr "tabhair teachtaireacht bheag úsáide"
+
+#~ msgid "NAME"
+#~ msgstr "AINM"
+
+#~ msgid "set the program name"
+#~ msgstr "socraigh ainm an chláir"
+
+#~ msgid "SECS"
+#~ msgstr "SOIC"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "déan moill SOIC soicind (réamhshocrú: 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "taispeáin leagan an chláir"
+
+#, c-format
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(EARRÁID CHLÁIR) Leagan anaithnid!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: An iomarca argóintí\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(EARRÁID CHLÁIR) Ba chóir an rogha a aithint!?"
+
+#~ msgid "program error"
+#~ msgstr "earráid chláir"
+
+#~ msgid "stack overflow"
+#~ msgstr "cruach thar maoil"
+
+#, fuzzy, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "ní féidir comhadlann %s a chruthú"
+
+#, fuzzy, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "ní féidir comhadlann %s a chruthú"
+
+#, fuzzy, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "ní féidir comhadlann %s a chruthú"
+
+#, fuzzy
+#~ msgid "error closing file"
+#~ msgstr "earráid agus comhad \"%s\" á scríobh"
+
+#~ msgid "write error"
+#~ msgstr "earráid sa scríobh"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "earráid agus \"%s\" á oscailt chun é a léamh"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "ní féidir comhad cúltaca \"%s\" a oscailt chun scríobh ann"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "earráid agus \"%s\" á léamh"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "earráid agus \"%s\" á scríobh"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "earráid tar éis \"%s\" á léamh"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "theip ar fdopen()"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "Tiomsaitheoir C# gan aimsiú, bain triail as pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "Meaisín fíorúil C# gan aimsiú, bain triail as pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "gnáthchomhad folamh"
+
+#~ msgid "regular file"
+#~ msgstr "gnáthchomhad"
+
+#~ msgid "directory"
+#~ msgstr "comhadlann"
+
+#~ msgid "block special file"
+#~ msgstr "comhad speisialta den chineál `bloc'"
+
+#~ msgid "character special file"
+#~ msgstr "comhad speisialta den chineál `carachtar'"
+
+# `TITA' ?! -KPS
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "nasc siombalach"
+
+#~ msgid "socket"
+#~ msgstr "soicéad"
+
+#~ msgid "message queue"
+#~ msgstr "ciú teachtaireachta"
+
+#~ msgid "semaphore"
+#~ msgstr "séamafór"
+
+# FARF --KPS
+#~ msgid "shared memory object"
+#~ msgstr "comhad comhchuimhne"
+
+#~ msgid "typed memory object"
+#~ msgstr "comhad cuimhne le cineál"
+
+#~ msgid "weird file"
+#~ msgstr "comhad aisteach"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: rogha anaithnid `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: rogha neamhcheadaithe -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: Tá an rogha `-W %s' débhríoch\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `-W %s'\n"
+
+#, fuzzy, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "fophróiseas %s"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argóint neamhbhailí \"source_version\" ar compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argóint neamhbhailí \"target_version\" ar compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "theip ar chruthú \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "earráid agus comhad \"%s\" á scríobh"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Tiomsaitheoir Java gan aimsiú, bain triail as gcj, nó socraigh $JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Meaisín fíorúil Java gan aimsiú, bain triail as gij, nó socraigh $JAVA"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "ní féidir na ceadanna de %s a athrú"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "ní féidir comhadlann %s a chruthú"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Theip ar oscailt /dev/zero chun é a léamh"
+
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# allow yes, but also 'i' as in 'is sea' or 's' for 'sea' -- KPS
+# neither of these letters is near the 'N' on standard keyboard...
+# #-#-#-#-# sh-utils-2.0.15.ga.po (sh-utils 2.0.15) #-#-#-#-#
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# allow yes, but also 'i' as in 'is sea' or 's' for 'sea' -- KPS
+# neither of these letters is near the 'N' on standard keyboard...
+# #-#-#-#-# textutils-2.1.ga.po (textutils 2.1) #-#-#-#-#
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# allow yes, but also 'i' as in 'is sea' or 's' for 'sea' -- KPS
+# neither of these letters is near the 'N' on standard keyboard...
+#~ msgid "^[yY]"
+#~ msgstr "^[yYiIsS]"
+
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# fortunately, 'n' for 'no' or 'ní hea' - KPS
+# #-#-#-#-# sh-utils-2.0.15.ga.po (sh-utils 2.0.15) #-#-#-#-#
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# fortunately, 'n' for 'no' or 'ní hea' - KPS
+# #-#-#-#-# textutils-2.1.ga.po (textutils 2.1) #-#-#-#-#
+# #-#-#-#-# findutils-4.1.7.ga.po (findutils 4.1.7) #-#-#-#-#
+# fortunately, 'n' for 'no' or 'ní hea' - KPS
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "ní féidir an fheidhm iconv a úsáid"
+
+#~ msgid "iconv function not available"
+#~ msgstr "níl an fheidhm iconv ar fáil"
+
+#~ msgid "character out of range"
+#~ msgstr "carachtar as raon"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "ní féidir U+%04X a thiontú chuig an fhoireann carachtar logánta: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "úsáideoir neamhbhailí"
+
+#~ msgid "invalid group"
+#~ msgstr "grúpa neamhbhailí"
+
+#~ msgid "invalid spec"
+#~ msgstr "sonrú neamhbhailí"
+
+#, fuzzy, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "ní féidir na ceadanna de %s a athrú"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "theip ar chomparáid idir teaghráin"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Cuir LC_ALL='C' ionas gur féidir an fhadhb seo a sheachaint."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Rinneadh comparáid idir na teaghráin %s agus %s."
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ceadúnas GPLv3+: GNU GPL leagan 3 nó níos nuaí <http://gnu.org/licenses/"
+#~ "gpl.html>\n"
+#~ "Is saorbhogearra é seo: ceadaítear duit é a athrú agus a athdháileadh.\n"
+#~ "Níl baránta AR BITH ann, an oiread atá ceadaithe de réir dlí.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Le %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Le %s agus %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Le %s, %s, agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, %s, agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, %s, %s, agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, agus %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Le %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, agus daoine eile nach iad.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <%s>.\n"
+#~ msgstr "Seol tuairiscí fabhtanna chuig %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "argóint neamhbhailí %s chun %s"
+
+#, fuzzy, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "argóint neamhbhailí %s chun %s"
+
+#, fuzzy, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "ní féidir na ceadanna de %s a athrú"
+
+#~ msgid "block size"
+#~ msgstr "méid bloc"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "Tá %s ann cheana, ach ní comhadlann é"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "ní féidir an t-úinéir agus/nó an grúpa de %s a athrú"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "ní féidir chdir a dhéanamh go dtí an chomhadlann %s"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "níl aon fháil ar an ghrúpa don UID uimhriúil seo"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Is saorbhogearra é seo. Is féidir leat cóipeanna a scaipeadh de réir na\n"
+#~ "gcoinníollacha den GNU General Public License\n"
+#~ "<http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "Níl baránta AR BITH ann, an oiread atá ceadaithe de réir dlí.\n"
+#~ "\n"
diff --git a/gnulib_po/gl.gmo b/gnulib_po/gl.gmo
new file mode 100644
index 0000000..7ff2fc7
--- /dev/null
+++ b/gnulib_po/gl.gmo
Binary files differ
diff --git a/gnulib_po/gl.po b/gnulib_po/gl.po
new file mode 100644
index 0000000..15d9ad3
--- /dev/null
+++ b/gnulib_po/gl.po
@@ -0,0 +1,778 @@
+# Galician translation of gnulib.
+# This file is distributed under the same license as the gnulib package.
+# Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 2012 Leandro Regueiro.
+#
+# Jacobo Tarrio <jtarrio@trasno.net>, 2000, 2001, 2002.
+# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
+#
+# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas
+# colaborar connosco, podes atopar máis información en http://www.trasno.net
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2012-11-11 13:26+0200\n"
+"Last-Translator: Leandro Regueiro <leandro.regueiro@gmail.com>\n"
+"Language-Team: Galician <proxecto@trasno.net>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Erro do sistema descoñecido"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family non admitido"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nome ou servizo descoñecido"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype non admitido"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Erro do sistema"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Solicitude cancelada"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Solicitude non cancelada"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Erro descoñecido"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: a opción «-W %s» é ambigua\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: a opción «%s» é ambigua; as posibilidades son:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opción «%c%s» non recoñecida\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: a opción «%c%s» non permite ningún argumento\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: a opción «--%s» require un argumento\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opción incorrecta -- «%c»\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a opción require un argumento -- «%c»\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "non foi posíbel gravar o directorio de traballo actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "non foi posíbel volver ao directorio de traballo inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle fallou"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "non foi posíbel restaurar o fd %d: dup2 fallou"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Éxito"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Sen coincidencias"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expresión regular non válida"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carácter de ordenación incorrecto"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome da clase de caracteres incorrecto"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida ao final"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ ou [^ sen parella"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sen parella"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sen parella"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contido de \\{\\} non válido"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fin de intervalo non válido"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoria esgotada"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expresión regular precedente non válida"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fin prematura da expresión regular"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expresión regular grande de máis"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sen parella"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Non hai ningunha expresión regular anterior"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "non é posíbel crear a canalización"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr ""
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr ""
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memoria esgotada"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argumento incorrecto %s para %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argumento %s ambiguo para %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Os argumentos válidos son:"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Os argumentos obrigatorios ou opcionais das opcións longas son tamén "
+#~ "obrigatorios ou opcionais para calquera opción curta que se corresponda."
+
+#~ msgid "Usage:"
+#~ msgstr "Uso:"
+
+#~ msgid " or: "
+#~ msgstr " ou: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPCIÓN...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Execute «%s --help» ou «%s --usage» para obter máis información.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Envíe os informes de fallo a %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "devolve esta lista de axuda"
+
+#~ msgid "give a short usage message"
+#~ msgstr "devolve unha mensaxe curta sobre o uso"
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "set the program name"
+#~ msgstr "define o nome do programa"
+
+#~ msgid "SECS"
+#~ msgstr "SECS"
+
+#~ msgid "print program version"
+#~ msgstr "mostra a versión do programa"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Demasiados argumentos\n"
+
+#~ msgid "program error"
+#~ msgstr "erro do programa"
+
+#~ msgid "stack overflow"
+#~ msgstr "desbordamento da pila"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "non é posíbel crear un directorio temporal empregando o patrón «%s»"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "non é posíbel retirar o ficheiro temporal %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "non é posíbel retirar o directorio temporal %s"
+
+#~ msgid "error closing file"
+#~ msgstr "produciuse un erro ao pechar o ficheiro"
+
+#~ msgid "write error"
+#~ msgstr "erro de escritura"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "conservando os permisos para %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "produciuse un erro ao abrir «%s» para lectura"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr ""
+#~ "non é posíbel abrir o ficheiro de copia de seguridade «%s» para escribir"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "produciuse un erro ao ler «%s»"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "produciuse un erro ao escribir «%s»"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "produciuse un erro despois de ler «%s»"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() fallou"
+
+#~ msgid "regular empty file"
+#~ msgstr "ficheiro normal baleiro"
+
+#~ msgid "regular file"
+#~ msgstr "ficheiro normal"
+
+#~ msgid "directory"
+#~ msgstr "directorio"
+
+#~ msgid "block special file"
+#~ msgstr "ficheiro especial de bloque"
+
+#~ msgid "character special file"
+#~ msgstr "ficheiro especial de carácter"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "ligazón simbólica"
+
+#~ msgid "message queue"
+#~ msgstr "cola de mensaxes"
+
+#~ msgid "semaphore"
+#~ msgstr "semáforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "obxecto de memoria compartida"
+
+#~ msgid "weird file"
+#~ msgstr "ficheiro estraño"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opción «--%s» non permite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: opción «--%s» non recoñecida\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a opción «-W %s» non permite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a opción «-W %s» require un argumento\n"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "produciuse un erro ao crear «%s»"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "produciuse un erro ao escribir o ficheiro «%s»"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "non foi posíbel cambiar os permisos de %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "non foi posíbel crear o directorio %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Produciuse un erro ao abrir /dev/zero para ler"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[sSyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "definindo os permisos para %s"
+
+#~ msgid "Quit"
+#~ msgstr "Saír"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Instrución inaceptábel"
+
+#~ msgid "Aborted"
+#~ msgstr "Interrompido"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Excepción de coma flotante"
+
+#~ msgid "Killed"
+#~ msgstr "Matado"
+
+#~ msgid "Bus error"
+#~ msgstr "Erro de bus"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Canalización danada"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Reloxo de alarma"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminado"
+
+#~ msgid "Stopped"
+#~ msgstr "Detido"
+
+#~ msgid "Continued"
+#~ msgstr "Continuado"
+
+#~ msgid "Child exited"
+#~ msgstr "O proceso fillo saíu"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Detido (entrada pola terminal)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Detido (saída pola terminal)"
+
+#~ msgid "I/O possible"
+#~ msgstr "A E/S é posíbel"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Excedeuse o límite de tempo de CPU"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Excedeuse o límite de tamaño do ficheiro"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Temporizador virtual esgotado"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Sinal 1 definido polo usuario"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Sinal 2 definido polo usuario"
+
+#~ msgid "Bad system call"
+#~ msgstr "Chamada ao sistema errónea"
+
+#~ msgid "Stack fault"
+#~ msgstr "Fallo de pila"
+
+#~ msgid "Information request"
+#~ msgstr "Solicitude de información"
+
+#~ msgid "Power failure"
+#~ msgstr "Fallo de subministración eléctrica"
+
+#~ msgid "Resource lost"
+#~ msgstr "Recurso perdido"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Sinal %d descoñecido"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "a función iconv non é utilizábel"
+
+#~ msgid "iconv function not available"
+#~ msgstr "a función iconv non está dispoñíbel"
+
+#~ msgid "character out of range"
+#~ msgstr "carácter fóra de intervalo"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "non é posíbel converter U+%04X ao xogo de caracteres local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "non é posíbel converter U+%04X ao xogo de caracteres local: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "usuario incorrecto"
+
+#~ msgid "invalid group"
+#~ msgstr "grupo incorrecto"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "non é posíbel mostrar a mensaxe de erro"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Empaquetado por %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Empaquetado por %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Licenza GPL3v+: GNU GPL versión3 ou posterior <http://gnu.org/licenses/"
+#~ "gpl.html>\n"
+#~ "Isto é software libre: pode modificalo e redistribuílo.\n"
+#~ "Non hai NINGUNHA GARANTÃA, ata onde o permita a lei.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Escrito por %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Escrito por %s e %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Escrito por %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, e outros.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Envíe os informes de fallo a: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Envíe os informes de fallo en %s a %s.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "PaÌxina web de %s: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Páxina web de %s: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr "Axuda xeral ao usar software GNU: <http://www.gnu.org/gethelp/>\n"
+
+#~ msgid "stdin"
+#~ msgstr "stdin"
+
+#~ msgid "stdout"
+#~ msgstr "stdout"
+
+#~ msgid "stderr"
+#~ msgstr "stderr"
+
+#~ msgid "unknown stream"
+#~ msgstr "fluxo descoñecido"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "produciuse un erro ao volver abrir %s en modo %s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "produciuse un erro ao comparar as cadeas"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Defina LC_ALL='C' para paliar o problema."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "As cadeas que se compararon foron %s e %s."
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "o argumento «%s» de %s%s é incorrecto"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "sufixo incorrecto %s%s no argumento «%s»"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opción incorrecta -- %c\n"
+
+#~ msgid "block size"
+#~ msgstr "tamaño de bloque"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s existe pero non é un directorio"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "non se pode cambia-lo propietario e/ou grupo de %s"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "non se pode cambiar ao directorio %s"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "non se pode obte-lo grupo de login dun UID numérico"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Este programa é software libre; pode redistribuílo e/ou modificalo baixo\n"
+#~ "os termos da Licencia Pública Xeral de GNU tal como a publicou a Free\n"
+#~ "Software Foundation; xa ben a versión 2 ou (á súa elección) calquera\n"
+#~ "versión posterior.\n"
+#~ "\n"
diff --git a/gnulib_po/hu.gmo b/gnulib_po/hu.gmo
new file mode 100644
index 0000000..bfef2d9
--- /dev/null
+++ b/gnulib_po/hu.gmo
Binary files differ
diff --git a/gnulib_po/hu.po b/gnulib_po/hu.po
new file mode 100644
index 0000000..e5f3c9e
--- /dev/null
+++ b/gnulib_po/hu.po
@@ -0,0 +1,896 @@
+# Hungarian translation for gnulib.
+# Copyright (C) 2002, 2003, 2004, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# Emese Kovacs <emese@instantweb.hu>, 2004.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2010.
+# Balázs Úr <urbalazs@gmail.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2014-06-25 19:51+0200\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-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ismeretlen rendszerhiba"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "A gépnév címcsaládja nem támogatott"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Ãtmeneti névfeloldási hiba"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Az ai_flags értéke hibás"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Helyrehozhatatlan névfeloldási hiba"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "Az ai_family nem támogatott"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Memóriafoglalási hiba"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "A gépnévhez nem tartozik cím"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "A név vagy szolgáltatás ismeretlen"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "A kiszolgálónév nem támogatott az ai_socktype-hoz"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "Az ai_socktype nem támogatott"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Rendszerhiba"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "A paraméterpuffer túl kicsi"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Kérés feldolgozása folyamatban"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Kérés megszakítva"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Kérés nincs megszakítva"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Minden kérés kész"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Szignál által megszakítva"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "A paraméter-karakterlánc nem megfelelő kódolású"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Ismeretlen hiba"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: a „-W %s†kapcsoló nem egyértelmű\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: a(z) „%s†kapcsoló nem egyértelmű; lehetőségek:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: a(z) „%c%s†kapcsoló ismeretlen\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: a(z) „%c%s†kapcsoló nem enged meg argumentumot\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: a(z) „--%s†kapcsolóhoz egy argumentum szükséges\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: érvénytelen kapcsoló -- „%câ€\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a kapcsoló egy argumentumot igényel -- „%câ€\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "az aktuális munkakönyvtár feljegyzése meghiúsult"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "a visszatérés meghiúsult a kiinduló munkakönyvtárba"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle sikertelen"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "az fd %d visszaállítása nem sikerült: dup2 sikertelen"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Sikerült"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Nincs találat"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Érvénytelen szabályos kifejezés"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Érvénytelen leválogatási karakter"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Érvénytelen karakterosztálynév"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Záró visszaper"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Érvénytelen visszahivatkozás"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Pár nélküli [ vagy [^"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Pár nélküli ( vagy \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Pár nélküli \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "A \\{\\} tartalma érvénytelen"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Érvénytelen tartományvég"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Elfogyott a memória"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Érvénytelen megelőző szabályos kifejezés"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "A szabályos kifejezés túl korán véget ért"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "A szabályos kifejezés túl nagy"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Pár nélküli ) vagy \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Nincs megelőző szabályos kifejezés"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "nem hozható létre adatcsatorna"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s alfolyamat sikertelen"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s alfolyamat"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s alfolyamat végzetes %d szignált kapott"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "elfogyott a memória"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "a(z) „%s†argumentum érvénytelen a következőhöz: %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "a(z) „%s†argumentum nem egyértelmű ehhez: „%sâ€"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Az érvényes argumentumok a következők:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s értéke nem nagyobb, mint %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: Az ARGP_HELP_FMT paraméter értéket igényel"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: Az ARGP_HELP_FMT paraméternek pozitívnak kell lennie"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Ismeretlen ARGP_HELP_FMT paraméter"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Szemét az ARGP_HELP_FMT-ben: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Ha egy hosszú kapcsolóhoz kötelező vagy opcionális argumentumot megadni, "
+#~ "akkor ez a megfelelő rövid kapcsolónál is kötelező vagy opcionális."
+
+#~ msgid "Usage:"
+#~ msgstr "Használat:"
+
+#~ msgid " or: "
+#~ msgstr " vagy: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [KAPCSOLÓ…]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "További információkért lásd a(z) „%s --help†vagy „%s --usage†"
+#~ "kimenetét.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "A hibák itt jelenthetők: %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "ezen súgószöveg megjelenítése"
+
+#~ msgid "give a short usage message"
+#~ msgstr "rövid használati utasítás megjelenítése"
+
+#~ msgid "NAME"
+#~ msgstr "NÉV"
+
+#~ msgid "set the program name"
+#~ msgstr "a program nevének beállítása"
+
+#~ msgid "SECS"
+#~ msgstr "MÃSODPERC"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "szünet MP másodpercre (alapértelmezetten 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "a programverzió kiírása"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMHIBA) A verzió nem ismert!"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Túl sok argumentum\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMHIBA) A kapcsolót ismerni kellene?"
+
+#~ msgid "program error"
+#~ msgstr "olvasási hiba"
+
+#~ msgid "stack overflow"
+#~ msgstr "veremtúlcsordulás"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "nem található átmeneti könyvtár, próbálja beállítani a $TMPDIR változót"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr ""
+#~ "nem lehet létrehozni átmeneti könyvtárat a(z) „%s†sablon használatával"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "nem lehet eltávolítani a(z) %s átmeneti fájlt"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "nem lehet eltávolítani a(z) %s átmeneti könyvtárat"
+
+#~ msgid "error closing file"
+#~ msgstr "hiba a fájl lezárásakor"
+
+#~ msgid "write error"
+#~ msgstr "írási hiba"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "%s jogosultságainak megőrzése"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "hiba \"%s\" megnyitásakor olvasásra"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "%s mentési fájl megnyitása írásra sikertelen"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "hiba \"%s\" olvasásakor"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "hiba \"%s\" írásakor"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "hiba \"%s\" olvasása után"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "az fdopen() sikertelen"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "a C# fordító nem található, próbálja telepíteni a pnetet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "a C# virtuális gép nem található, próbálja telepíteni a pnetet"
+
+#~ msgid "regular empty file"
+#~ msgstr "szabályos üres fájl"
+
+#~ msgid "regular file"
+#~ msgstr "szabályos fájl"
+
+#~ msgid "directory"
+#~ msgstr "könyvtár"
+
+#~ msgid "block special file"
+#~ msgstr "speciális blokkfájl"
+
+#~ msgid "character special file"
+#~ msgstr "speciális karakterfájl"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "szimbolikus link"
+
+#~ msgid "socket"
+#~ msgstr "foglalat"
+
+#~ msgid "message queue"
+#~ msgstr "üzenetsor"
+
+#~ msgid "semaphore"
+#~ msgstr "szemafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "megosztott memóriaobjektum"
+
+#~ msgid "typed memory object"
+#~ msgstr "típusos memóriaobjektum"
+
+#~ msgid "weird file"
+#~ msgstr "szokatlan fájl"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a(z) „--%s†kapcsoló nem enged meg argumentumot\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: a(z) „--%s†kapcsoló ismeretlen\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a „-W %s†kapcsoló nem enged meg argumentumot\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a „-W %s†kapcsolóhoz egy argumentum szükséges\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "érvénytelen source_version argumentum ehhez: compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "érvénytelen target_version argumentum ehhez: compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "„%s†létrehozása sikertelen"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "hiba a(z) „%s†fájl írásakor"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Java fordító nem található, próbálja meg a gcj telepítését vagy a $JAVAC "
+#~ "beállítását"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Java virtuális gép nem található, próbálja meg a gij telepítését vagy a "
+#~ "$JAVA beállítását"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s alfolyamat I/O hiba"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "nem lehet %s jogosultságait megváltoztatni"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "nem lehet létrehozni a(z) %s könyvtárat"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "A /dev/zero megnyitása olvasásra sikertelen"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "az olvasási szál létrehozása sikertelen"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "nem sikerült a nem blokkolható I/O beállítása a(z) %s alfolyamathoz"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "a(z) %s alfolyamattal történő kommunikáció sikertelen"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "a(z) %s alfolyamatba való írás sikertelen"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "a(z) %s alfolyamatból való olvasás sikertelen"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "a(z) %s alfolyamat ezzel a hibakóddal fejeződött be: %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "a szálak létrehozása sikertelen"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "a(z) %s alfolyamat ezzel a hibakóddal fejeződött be: %d"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Franc,ois Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[iIyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "%s jogosultságainak beállítása"
+
+#~ msgid "Hangup"
+#~ msgstr "Felfüggesztés"
+
+#~ msgid "Interrupt"
+#~ msgstr "Megszakítás"
+
+#~ msgid "Quit"
+#~ msgstr "Kilépés"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Illegális utasítás"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Nyomkövetési/töréspont csapda"
+
+#~ msgid "Aborted"
+#~ msgstr "Megszakítva"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Lebegőpontos kivétel"
+
+#~ msgid "Killed"
+#~ msgstr "Kilőve"
+
+#~ msgid "Bus error"
+#~ msgstr "Buszhiba"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Szegmentálási hiba"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Megszakadt csővezeték"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Ébresztőóra"
+
+#~ msgid "Terminated"
+#~ msgstr "Befejeződött"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Sürgős I/O feltétel"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Leállítva (szignál)"
+
+#~ msgid "Stopped"
+#~ msgstr "Leállítva"
+
+#~ msgid "Continued"
+#~ msgstr "Folytatva"
+
+#~ msgid "Child exited"
+#~ msgstr "Gyerekfolyamat kilépett"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Leállítva (tty bemenet)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Leállítva (tty kimenet)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O lehetséges"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "CPU-időkorlát túllépve"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Fájlméret korlátja túllépve"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuális időzítés lejárt"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "A profilozási időzítő lejárt"
+
+#~ msgid "Window changed"
+#~ msgstr "Ablakméret változott"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Felhasználói szignál 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Felhasználói szignál 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT csapda"
+
+#~ msgid "Bad system call"
+#~ msgstr "Hibás rendszerhívás"
+
+#~ msgid "Stack fault"
+#~ msgstr "Veremhiba"
+
+#~ msgid "Information request"
+#~ msgstr "Információkérés"
+
+#~ msgid "Power failure"
+#~ msgstr "Tápfeszültség-kimaradás"
+
+#~ msgid "Resource lost"
+#~ msgstr "Erőforrás elveszítve"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "hiba egy lezárt cső vagy foglalat írásakor"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Valós idejű szignál %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Ismeretlen szignál %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "az iconv függvény nem használható"
+
+#~ msgid "iconv function not available"
+#~ msgstr "az iconv függvény nem elérhető"
+
+#~ msgid "character out of range"
+#~ msgstr "tartományon kívüli karakter"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "nem lehet helyi karakterkészletbe átalakítani a következőt: U+%04X"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "az U+%04X nem konvertálható a helyi karakterkészletbe: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "érvénytelen felhasználó"
+
+#~ msgid "invalid group"
+#~ msgstr "érvénytelen csoport"
+
+#~ msgid "invalid spec"
+#~ msgstr "érvénytelen specifikáció"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "nem jeleníthető meg hibaüzenet"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Csomagolta: %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Csomagolta: %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "A licenc GPLv3+: a GNU GPL 3. vagy újabb változata <http://gnu.org/"
+#~ "licenses/gpl.html>\n"
+#~ "Ez egy szabad szoftver, terjesztheti és/vagy módosíthatja.\n"
+#~ "NINCS GARANCIA, a törvény által engedélyezett mértékig.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Ãrta: %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Ãrta: %s és %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Ãrta: %s, %s és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s\n"
+#~ "és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s, %s és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s, %s, %s és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s és %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Ãrta: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s és mások\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "A hibák a(z) %s címen jelenthetők.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "A(z) %s hibái a(z) %s címen jelenthetők.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "A(z) %s honlapja: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "A(z) %s honlapja: <http://www.gnu.org/software/%s/>.\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Ãltalános segítség a GNU szoftverek használatához: <http://www.gnu.org/"
+#~ "gethelp/>.\n"
+
+#~ msgid "stdin"
+#~ msgstr "szabványos bemenet"
+
+#~ msgid "stdout"
+#~ msgstr "szabványos kimenet"
+
+#~ msgid "stderr"
+#~ msgstr "szabványos hibakimenet"
+
+#~ msgid "unknown stream"
+#~ msgstr "ismeretlen adatfolyam"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "%s újranyitása %s móddal meghiúsult"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "karakterlánc-összehasonlítás sikertelen"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr ""
+#~ "Ãllítsa be az LC_ALL='C' környezeti változót a probléma megkerüléséhez."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Az összehasonlított karakterláncok: %s és %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "nem lehet végrehajtani formázott kimenetet"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "érvénytelen %s%s argumentum: „%sâ€"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "érvénytelen utótag a(z) %s%s argumentumban: „%sâ€"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "%s%s: a(z) „%s†argumentum túl nagy"
diff --git a/gnulib_po/insert-header.sin b/gnulib_po/insert-header.sin
new file mode 100644
index 0000000..b26de01
--- /dev/null
+++ b/gnulib_po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gnulib_po/it.gmo b/gnulib_po/it.gmo
new file mode 100644
index 0000000..dce9262
--- /dev/null
+++ b/gnulib_po/it.gmo
Binary files differ
diff --git a/gnulib_po/it.po b/gnulib_po/it.po
new file mode 100644
index 0000000..0590e2b
--- /dev/null
+++ b/gnulib_po/it.po
@@ -0,0 +1,1039 @@
+# Italian translation of gnulib
+# Copyright (C) 2008, 2009, 2010, 2011, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Marco d'Itri <md@linux.it>, 1998, 1999.
+# Giovanni Bortolozzo <borto@dei.unipd.it>, 1998.
+# Milo Casagrande <milo@milo.name>, 2008, 2009, 2010, 2011, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib-4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-21 14:07+0200\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"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.2.1\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Errore di sistema sconosciuto"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Famiglia di indirizzi per il nome host non supportata"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Errore temporaneo nella risoluzione del nome"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Valore per ai_flags errato"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Errore irreversibile nella risoluzione del nome"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family non supportato"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Allocazione memoria non riuscita"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Nessun indirizzo associato col nome host"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nome o servizio sconosciuto"
+
+# (ndt)
+#
+# define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Nome servizio non supportato per ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype non supportato"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Errore di sistema"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Buffer argomento troppo piccolo"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Elaborazione richiesta in corso"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Richiesta annullata"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Richiesta non annullata"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Tutte le richieste completate"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interrotto da un segnale"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Stringa del parametro non codificata correttamente"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Errore sconosciuto"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: l'opzione «%s%s» è ambigua\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: l'opzione «%s%s» è ambigua. Possibilità:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opzione «%s%s» non riconosciuta\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione «%s%s» non accetta un argomento\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: l'opzione «%s%s» richiede un argomento\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opzione non valida -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: l'opzione richiede un argomento -- %c\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "impossibile registrare la directory di lavoro corrente"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "ritorno alla directory di lavoro iniziale non riuscito"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle non riuscita"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "impossibile ripristinare fd %d: dup2 non riuscita"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Successo"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Nessuna corrispondenza"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Espressione regolare non valida"
+
+# (ndt) http://en.wikipedia.org/wiki/Collation
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carattere di collazione non valido"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome classe del carattere non valida"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Backslash finale"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Riferimento all'indietro non valido"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [. o [= senza corrispondenza"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( o \\( senza corrispondenza"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ senza corrispondenza"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contenuto di \\{\\} non valido"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fine dell'intervallo non valida"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoria esaurita"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Espressione regolare precedente non valida"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fine prematura dell'espressione regolare"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Espressione regolare troppo grande"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") o \\) senza corrispondenza"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Nessuna espressione regolare precedente"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "impossibile creare la pipe"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s: sottoprocesso non riuscito"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "sottoprocesso %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "il sottoprocesso %s ha ricevuto un segnale %d fatale"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memoria esaurita"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argomento %s non valido per %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argomento %s ambiguo per %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Sono argomenti validi:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: il valore %s è minore o uguale a %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: il parametro ARGP_HELP_FMT richiede un valore"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: parametro ARGP_HELP_FMT sconosciuto"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Spazzatura in ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Gli argomenti obbligatori o facoltativi per le opzioni estese lo sono "
+#~ "anche per le corrispondenti opzioni brevi."
+
+#~ msgid "Usage:"
+#~ msgstr "Uso:"
+
+#~ msgid " or: "
+#~ msgstr " o: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPZIONE...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Provare «%s --help» o «%s --usage» per ulteriori informazioni.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Segnalare i bug a %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "Mostra questo aiuto"
+
+#~ msgid "give a short usage message"
+#~ msgstr "Mostra un breve messaggio sull'uso"
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "set the program name"
+#~ msgstr "Imposta il nome del programma"
+
+#~ msgid "SECS"
+#~ msgstr "SEC"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "Resta in attesa per SEC secondi (predefinito 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "Stampa la versione del programma"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ERRORE DEL PROGRAMMA) Nessuna versione conosciuta."
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: troppi argomenti\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr ""
+#~ "(ERRORE DEL PROGRAMMA) L'opzione dovrebbe essere stata riconosciuta."
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u liberati (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u nella cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u nella cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u nella cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "istogramma registro del conteggio\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "istogramma registro delle dimensioni\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "istogramma densità\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiche bitset:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Esecuzioni accumulate = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "impossibile leggere il file delle statistiche"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "dimensione file delle statistiche errata\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "impossibile scrivere il file delle statistiche"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "impossibile aprire il file delle statistiche in scrittura"
+
+#~ msgid "program error"
+#~ msgstr "errore del programma"
+
+#~ msgid "stack overflow"
+#~ msgstr "overflow dello stack"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "impossibile trovare una directory temporanea, provare a impostare $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "impossibile creare una directory temporanea usando il modello «%s»"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "impossibile rimuovere il file temporaneo %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "impossibile rimuovere la directory temporanea %s"
+
+#~ msgid "error closing file"
+#~ msgstr "errore nel chiudere il file"
+
+#~ msgid "write error"
+#~ msgstr "errore di scrittura"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "preservazione dei permessi per %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "errore nell'aprire %s in lettura"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "impossibile aprire il file di backup %s in scrittura"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "errore nel leggere %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "errore nello scrivere %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "errore dopo la lettura di %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() non riuscita"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "compilatore C# non trovato, provare a installare mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "macchina virtuale C# non trovata, provare a installare mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "[ non bilanciata"
+
+#~ msgid "invalid character class"
+#~ msgstr "classe carattere non valida"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "la sintassi per la classe carattere è [[:space:]], non [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "escape \\ incompleto"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "contenuto di \\{\\} non valido"
+
+#~ msgid "regular expression too big"
+#~ msgstr "espressione regolare troppo grande"
+
+#~ msgid "unbalanced ("
+#~ msgstr "( non bilanciata"
+
+#~ msgid "no syntax specified"
+#~ msgstr "nessuna sintassi specificata"
+
+#~ msgid "unbalanced )"
+#~ msgstr ") non bilanciata"
+
+#~ msgid "regular empty file"
+#~ msgstr "file normale vuoto"
+
+#~ msgid "regular file"
+#~ msgstr "file normale"
+
+#~ msgid "directory"
+#~ msgstr "directory"
+
+#~ msgid "symbolic link"
+#~ msgstr "collegamento simbolico"
+
+#~ msgid "message queue"
+#~ msgstr "coda di messaggi"
+
+#~ msgid "semaphore"
+#~ msgstr "semaforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "oggetto di memoria condivisa"
+
+# (ndt) sono accettati:
+# - suggerimenti
+# - collegamenti dove si spieghi cosa sia un 'typed memory object'
+# Ma dove si spieghi VERAMENTE e CONCRETAMENTE cos'è.
+#~ msgid "typed memory object"
+#~ msgstr "oggetto di memoria con nome"
+
+#~ msgid "block special file"
+#~ msgstr "file speciale a blocchi"
+
+#~ msgid "character special file"
+#~ msgstr "file speciale a caratteri"
+
+#~ msgid "contiguous data"
+#~ msgstr "dati contigui"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "door"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "file speciale a blocchi multiplex"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "file speciale a caratteri multiplex"
+
+#~ msgid "multiplexed file"
+#~ msgstr "file multiplex"
+
+#~ msgid "named file"
+#~ msgstr "file con nome"
+
+#~ msgid "network special file"
+#~ msgstr "file speciale di rete"
+
+#~ msgid "migrated file with data"
+#~ msgstr "file migrato con dati"
+
+#~ msgid "migrated file without data"
+#~ msgstr "file migrato senza dati"
+
+#~ msgid "port"
+#~ msgstr "porta"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "whiteout"
+#~ msgstr "whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "file strano"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argomento source_version in compile_java_class non valido"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argomento target_version in compile_java_class non valido"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "creazione di \"%s\" non riuscita"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "errore durante la scrittura del file \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "compilatore Java non trovato, provare a installare gcj o impostare $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "macchina virtuale Java non trovato, provare a installare gij o impostare "
+#~ "$JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "errore di I/O nel sottoprocesso %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "impossibile eseguire stat di %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "impossibile cambiare i permessi di %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "impossibile creare la directory %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Apertura di /dev/zero in lettura non riuscita"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "creazione del thread di lettura non riuscita"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "impossibile impostare I/O non bloccante sul sottoprocesso di %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "comunicazione col sottoprocesso di %s non riuscita"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "scrittura sul sottoprocesso di %s non riuscita"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lettura dal sottoprocesso di %s non riuscita"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "sottoprocesso %s terminato con codice d'uscita %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "creazione dei thread non riuscita"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "sottoprocesso di %s terminato con codice d'uscita %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[sSyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "impostazione dei permessi per %s"
+
+# (ndt) ho preferito mettere tra parentesi il vero nome della costante del segnale, sono cose abbastanza tecniche e forse con un riferimento reale più comprensibili
+#
+# http://en.wikipedia.org/wiki/SIGHUP
+#~ msgid "Hangup"
+#~ msgstr "Chiusura"
+
+# http://en.wikipedia.org/wiki/SIGINT_(POSIX)
+#~ msgid "Interrupt"
+#~ msgstr "Interruzione"
+
+# http://en.wikipedia.org/wiki/SIGQUIT
+#~ msgid "Quit"
+#~ msgstr "Uscita (con core dump)"
+
+# http://en.wikipedia.org/wiki/SIGILL
+#~ msgid "Illegal instruction"
+#~ msgstr "Istruzione non consentita"
+
+# http://en.wikipedia.org/wiki/Trap_(computing)
+# http://en.wikipedia.org/wiki/SIGTRAP
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Rilevato trace/breakpoint"
+
+# http://en.wikipedia.org/wiki/SIGABRT
+#~ msgid "Aborted"
+#~ msgstr "Annullato"
+
+# http://en.wikipedia.org/wiki/SIGFPE
+#~ msgid "Floating point exception"
+#~ msgstr "Eccezione in virgola mobile"
+
+#~ msgid "Killed"
+#~ msgstr "Ucciso"
+
+# http://en.wikipedia.org/wiki/Bus_error
+# http://en.wikipedia.org/wiki/SIGBUS
+#~ msgid "Bus error"
+#~ msgstr "Errore di bus"
+
+# http://en.wikipedia.org/wiki/Segmentation_fault
+# http://en.wikipedia.org/wiki/SIGSEGV
+#~ msgid "Segmentation fault"
+#~ msgstr "Errore di segmentazione"
+
+# http://en.wikipedia.org/wiki/SIGPIPE
+#~ msgid "Broken pipe"
+#~ msgstr "Pipe interrotta"
+
+# (ndt) non so se convenga lasciarlo invariato... ma forse anche le altre...
+# http://en.wikipedia.org/wiki/SIGALRM
+#~ msgid "Alarm clock"
+#~ msgstr "Sveglia"
+
+# http://en.wikipedia.org/wiki/SIGTERM
+#~ msgid "Terminated"
+#~ msgstr "Terminato"
+
+# http://en.wikipedia.org/wiki/SIGURG
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Condizione di I/O urgente"
+
+# http://en.wikipedia.org/wiki/SIGSTOP
+#~ msgid "Stopped (signal)"
+#~ msgstr "Fermato"
+
+# http://en.wikipedia.org/wiki/SIGTSTP
+#~ msgid "Stopped"
+#~ msgstr "Fermato (da terminale)"
+
+# http://en.wikipedia.org/wiki/SIGCONT
+#~ msgid "Continued"
+#~ msgstr "Continuato"
+
+# http://en.wikipedia.org/wiki/SIGCHLD
+#~ msgid "Child exited"
+#~ msgstr "Processo figlio uscito"
+
+# http://en.wikipedia.org/wiki/SIGTTIN
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Fermato per input tty"
+
+# http://en.wikipedia.org/wiki/SIGTTOU
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Fermato per output tty"
+
+# (ndt) questa pare non sia posix, wikipedia riporta la stessa di SIGABRT
+#~ msgid "I/O possible"
+#~ msgstr "I/O consentito"
+
+# http://en.wikipedia.org/wiki/SIGXCPU
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Superato il limite di tempo CPU"
+
+# http://en.wikipedia.org/wiki/SIGXFSZ
+#~ msgid "File size limit exceeded"
+#~ msgstr "Superato il limite di dimensione file"
+
+# http://en.wikipedia.org/wiki/SIGVTALRM
+#~ msgid "Virtual timer expired"
+#~ msgstr "Timer virtuale terminato"
+
+# http://en.wikipedia.org/wiki/SIGPROF
+#~ msgid "Profiling timer expired"
+#~ msgstr "Timer di profiling terminato"
+
+# http://en.wikipedia.org/wiki/SIGWINCH
+#~ msgid "Window changed"
+#~ msgstr "Finestra modificata"
+
+# http://en.wikipedia.org/wiki/SIGUSR1
+#~ msgid "User defined signal 1"
+#~ msgstr "Segnale 1 definito dall'utente"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Segnale 2 definito dall'utente"
+
+# http://en.wikipedia.org/wiki/SIGEMT
+#~ msgid "EMT trap"
+#~ msgstr "Rilevato EMT"
+
+# http://en.wikipedia.org/wiki/SIGSYS
+#~ msgid "Bad system call"
+#~ msgstr "Chiamata di sistema errata"
+
+# http://en.wikipedia.org/wiki/SIGSTKFLT
+#~ msgid "Stack fault"
+#~ msgstr "Errore sullo stack"
+
+# http://en.wikipedia.org/wiki/SIGINFO
+#~ msgid "Information request"
+#~ msgstr "Richiesta informazioni"
+
+# http://en.wikipedia.org/wiki/SIGPWR
+#~ msgid "Power failure"
+#~ msgstr "Mancanza alimentazione elettrica"
+
+# http://en.wikipedia.org/wiki/SIGLOST
+#~ msgid "Resource lost"
+#~ msgstr "Risorsa persa"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "errore nello scrivere su una pipe o un socket chiusi"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Segnale real-time %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Segnale %d sconosciuto"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Tempi di esecuzione (secondi)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU utente"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU sistema"
+
+#~ msgid "wall clock"
+#~ msgstr "tempo reale"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "funzione iconv non utilizzabile"
+
+#~ msgid "iconv function not available"
+#~ msgstr "funzione iconv non disponibile"
+
+#~ msgid "character out of range"
+#~ msgstr "carattere fuori dall'intervallo"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "impossibile convertire U+%04X nel set di caratteri locale"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "impossibile convertire U+%04X nel set di caratteri locale: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "utente non valido"
+
+#~ msgid "invalid group"
+#~ msgstr "gruppo non valido"
+
+# (ndt) evinta da un commento al codice:
+#
+# /* Set U and G to nonzero length strings corresponding to user and
+# group specifiers or to NULL. If U is not NULL, it is a newly
+# allocated string. */
+#
+#~ msgid "invalid spec"
+#~ msgstr "specificatore non valido"
+
+#~ msgid "unable to display error message"
+#~ msgstr "impossibile visualizzare il messaggio di errore"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Pacchetto creato da %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Pacchetto creato da %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licenza GPLv3+: GNU GPL versione 3 o successiva <%s>.\n"
+#~ "Questo programma è software libero: siete liberi di modificarlo e "
+#~ "ridistribuirlo.\n"
+#~ "Non c'è ALCUNA GARANZIA, per quanto consentito dalle vigenti normative.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Scritto da %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Scritto da %s e %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Scritto da %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s, %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Scritto da %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s e altri.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Segnalare i bug a: %s\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Segnalare i bug di %s a: %s.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Sito web di %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Aiuto per l'utilizzo di software GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr ""
+#~ "impostazione del descrittore file in modalità testo/binario non riuscita"
+
+#~ msgid "stdin"
+#~ msgstr "stdin"
+
+#~ msgid "stdout"
+#~ msgstr "stdout"
+
+#~ msgid "stderr"
+#~ msgstr "stderr"
+
+#~ msgid "unknown stream"
+#~ msgstr "stream sconosciuto"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "riapertura di %s in modalità %s non riuscita"
+
+#~ msgid "string comparison failed"
+#~ msgstr "confronto delle stringhe non riuscito"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Impostare LC_ALL='C' per aggirare il problema."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Le stringhe confrontate erano %s e %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "impossibile mostrare l'output formattato"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "descrittori file standard"
+
+# (ndt)
+# quello che viene sostituito pare sia:
+# * il primo, hypens (con valore '--')
+# * il secondo, option
+# * il terzo, arg
+# quindi qualche cosa del genere:
+# invalid --option argument 'arg'
+#
+# (altre idee sono benvenute!)
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "l'argomento «%3$s» di %1$s%2$s non è valido"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "il suffisso nell'argomento «%3$s» di %1$s%2$s non è valido"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "l'argomento «%3$s» di %1$s%2$s è troppo grande"
diff --git a/gnulib_po/ja.gmo b/gnulib_po/ja.gmo
new file mode 100644
index 0000000..8f41b8b
--- /dev/null
+++ b/gnulib_po/ja.gmo
Binary files differ
diff --git a/gnulib_po/ja.po b/gnulib_po/ja.po
new file mode 100644
index 0000000..c13375f
--- /dev/null
+++ b/gnulib_po/ja.po
@@ -0,0 +1,929 @@
+# Japanese gnulib messages
+# Copyright (C) 2000, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Masahito Yamaga <yamaga@ipc.chiba-u.ac.jp>, 2002.
+# GOTO Masanori <gotom@debian.or.jp>, 2006.
+# derived from the version by Yasuyuki Furukawa <yasu@on.cs.keio.ac.jp> 1998.
+# Jun Nishii <jun@flatout.org> 1999.
+# Daisuke Yamashita <yamad@mb.infoweb.ne.jp> 1999.
+# Yasuaki Taniguchi <yasuakit@gmail.com>, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-09-02 18:39+0900\n"
+"Last-Translator: Yasuaki Taniguchi <yasuakit@gmail.com>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "ホストåã«å¯¾ã™ã‚‹ Address family ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "åå‰è§£æ±ºã«ä¸€æ™‚çš„ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "ai_flags ã«å¯¾ã™ã‚‹èª¤ã£ãŸå€¤ã§ã™"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "åå‰è§£æ±ºã§ãƒªã‚«ãƒãƒªã§ããªã„失敗ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "メモリé…ç½®ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "ホストåã«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "åå‰ã¾ãŸã¯ã‚µãƒ¼ãƒ“スãŒä¸æ˜Žã§ã™"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "ai_socktype ã«å¯¾ã—㦠Servname ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "システムエラー"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "引数ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "è¦æ±‚ã•ã‚ŒãŸå‡¦ç†ã¯å®Ÿè¡Œä¸­ã§ã™"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "è¦æ±‚ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "è¦æ±‚ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "ã™ã¹ã¦ã®è¦æ±‚ãŒå®Œäº†ã—ã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "シグナル割り込ã¿ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "パラメーター文字列ãŒæ­£ã—ãエンコードã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: オプション '-W %s' ã¯æ›–昧ã§ã™\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: オプション '%s' ã¯æ›–昧ã§ã™:次ã®ã‚‚ã®ãŒå¯èƒ½ã§ã™:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: オプション '%c%s' ã‚’èªè­˜ã§ãã¾ã›ã‚“\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: オプション '%c%s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: オプション '--%s' ã¯å¼•æ•°ãŒå¿…è¦ã§ã™\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: 無効ãªã‚ªãƒ—ション -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: オプションã«ã¯å¼•æ•°ãŒå¿…è¦ã§ã™ -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’記録ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "åˆæœŸä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æˆ»ã‚‹ã®ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ (fd) %d をリストアã§ãã¾ã›ã‚“: dup2 ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "æˆåŠŸã§ã™"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "一致ã—ã¾ã›ã‚“"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "無効ãªæ­£è¦è¡¨ç¾ã§ã™"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "無効ãªç…§åˆæ–‡å­—ã§ã™"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "無効ãªæ–‡å­—クラスåã§ã™"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "終端ã®ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "無効ãªå‰æ–¹å‚ç…§ã§ã™"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ ã¾ãŸã¯ [^ ãŒä¸ä¸€è‡´ã§ã™"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ã¾ãŸã¯ \\( ãŒä¸ä¸€è‡´ã§ã™"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ ãŒä¸ä¸€è‡´ã§ã™"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "\\{\\} ã®ä¸­èº«ãŒç„¡åŠ¹ã§ã™"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "無効ãªç¯„囲終了ã§ã™"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "メモリを使ã„æžœãŸã—ã¾ã—ãŸ"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "無効ãªå‰æ–¹æ­£è¦è¡¨ç¾ã§ã™"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "æ­£è¦è¡¨ç¾ãŒé€”中ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "æ­£è¦è¡¨ç¾ãŒå¤§ãã™ãŽã¾ã™"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ã¾ãŸã¯ \\) ãŒä¸ä¸€è‡´ã§ã™"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "以å‰ã«æ­£è¦è¡¨ç¾ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "パイプを作æˆã§ãã¾ã›ã‚“"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s サブプロセスãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s å­ãƒ—ロセス"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s å­ãƒ—ロセスãŒè‡´å‘½çš„ãªã‚·ã‚°ãƒŠãƒ« %d ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "メモリを使ã„æžœãŸã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "%2$s ã«å¯¾ã™ã‚‹å¼•æ•° %1$s ãŒé–“é•ã£ã¦ã„ã¾ã™"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "%2$s ã«å¯¾ã™ã‚‹å¼•æ•° %1$s ãŒæ›–昧ã§ã™"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "有効ãªå¼•æ•°:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s ã®å€¤ã¯ %s ã®å€¤ä»¥ä¸‹ã§ã™"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT パラメータã«ã¯å€¤ãŒå¿…è¦ã§ã™"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT パラメータã¯æ­£ã®å€¤ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: ä¸æ˜Žãª ARGP_HELP_FMT パラメータ"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "ARGP_HELP_FMT 中ã«ã”ã¿ãŒã‚ã‚Šã¾ã™: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "é•·ã„å½¢å¼ã®ã‚ªãƒ—ションã§å¿…é ˆã¾ãŸã¯ä»»æ„ã®å¼•æ•°ã¯ã€ãã‚Œã«å¯¾å¿œã™ã‚‹çŸ­ã„å½¢å¼ã®ã‚ªãƒ—"
+#~ "ションã§ã‚‚åŒæ§˜ã«å¿…é ˆã¾ãŸã¯ä»»æ„ã§ã™ã€‚"
+
+#~ msgid "Usage:"
+#~ msgstr "使用法:"
+
+#~ msgid " or: "
+#~ msgstr "ã¾ãŸã¯: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPTION...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "詳細㯠`%s --help' ã¾ãŸã¯ `%s --usage' を実行ã—ã¦ä¸‹ã•ã„。\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "ãƒã‚°ã‚’発見ã—ãŸã‚‰ <%s> ã«å ±å‘Šã—ã¦ä¸‹ã•ã„。\n"
+#~ "翻訳ã«é–¢ã™ã‚‹ãƒã‚°ã¯<translation-team-ja@lists.sourceforge.net>ã«å ±å‘Šã—ã¦ã"
+#~ "ã ã•ã„。\n"
+
+#~ msgid "give this help list"
+#~ msgstr "ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã™ã‚‹"
+
+#~ msgid "give a short usage message"
+#~ msgstr "短ã„使用方法を表示ã™ã‚‹"
+
+#~ msgid "NAME"
+#~ msgstr "åå‰"
+
+#~ msgid "set the program name"
+#~ msgstr "プログラムåを設定ã™ã‚‹"
+
+#~ msgid "SECS"
+#~ msgstr "SECS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "SECS 秒ã§ãƒãƒ³ã‚° (デフォルト 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "プログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(プログラムエラー) ä¸æ˜Žãªãƒãƒ¼ã‚¸ãƒ§ãƒ³!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: 引数ãŒå¤šã™ãŽã¾ã™\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(プログラムエラー) オプションã¯èªè­˜ã•ã‚Œã¦ã„ã‚‹ã¹ãã§ã™!?"
+
+#~ msgid "program error"
+#~ msgstr "プログラムエラー"
+
+#~ msgid "stack overflow"
+#~ msgstr "スタックオーãƒãƒ¼ãƒ•ãƒ­ãƒ¼"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "一時ディレクトリを作æˆã§ãã¾ã›ã‚“。 $TMPDIR を設定ã—ã¦ã¿ã¦ãã ã•ã„"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "テンプレート \"%s\" を使用ã—ãŸä¸€æ™‚ディレクトリを作æˆã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "一時ファイル %s を削除ã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "一時ディレクトリ %s を削除ã§ãã¾ã›ã‚“"
+
+#~ msgid "error closing file"
+#~ msgstr "ファイルクローズエラー"
+
+#~ msgid "write error"
+#~ msgstr "書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "%s ã®ãƒ‘ーミッションをä¿å­˜ã—ã¦ã„ã¾ã™"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "\"%s\"を読込むãŸã‚é–‹ã„ã¦ã„ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "書込ã¿ç”¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイル\"%s\"ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "\"%s\"ã®èª­è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "\"%s\"ã®æ›¸è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "\"%s\"ã®èª­è¾¼ã¿å¾Œã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen()ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "C# コンパイラãŒè¦‹ã¤ã‚Šã¾ã›ã‚“。pnet をインストールã—ã¦ã¿ã¦ãã ã•ã„"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "C# 仮想マシンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。pnet をインストールã—ã¦ã¿ã¦ãã ã•ã„"
+
+#~ msgid "regular empty file"
+#~ msgstr "通常ã®ç©ºãƒ•ã‚¡ã‚¤ãƒ«"
+
+#~ msgid "regular file"
+#~ msgstr "通常ファイル"
+
+#~ msgid "directory"
+#~ msgstr "ディレクトリ"
+
+#~ msgid "block special file"
+#~ msgstr "ブロックスペシャルファイル"
+
+#~ msgid "character special file"
+#~ msgstr "キャラクタスペシャルファイル"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "シンボリックリンク"
+
+#~ msgid "socket"
+#~ msgstr "ソケット"
+
+#~ msgid "message queue"
+#~ msgstr "メッセージキュー"
+
+#~ msgid "semaphore"
+#~ msgstr "セマフォ"
+
+#~ msgid "shared memory object"
+#~ msgstr "共有メモリオブジェクト"
+
+#~ msgid "typed memory object"
+#~ msgstr "型付メモリオブジェクト"
+
+#~ msgid "weird file"
+#~ msgstr "ä¸æ˜Žãªãƒ•ã‚¡ã‚¤ãƒ«"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: オプション '--%s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: オプション '--%s' ã‚’èªè­˜ã§ãã¾ã›ã‚“\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: オプション '-W %s' ã¯å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: オプション '-W %s' ã¯å¼•æ•°ãŒå¿…è¦ã§ã™\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "compile_java_class ã¸ã® source_version 引数ãŒç„¡åŠ¹ã§ã™"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "compile_java_class ã¸ã® target_version 引数ãŒç„¡åŠ¹ã§ã™"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "\"%s\" ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "\"%s\" ファイルã®æ›¸ãè¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Java コンパイラãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 gcj をインストールã™ã‚‹ã‹ã€ã¾ãŸã¯ $JAVAC "
+#~ "を設定ã—ã¦ã¿ã¦ãã ã•ã„"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Java 仮想マシンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 gij をインストールã™ã‚‹ã‹ã€ã¾ãŸã¯ $JAVA "
+#~ "を設定ã—ã¦ã¿ã¦ãã ã•ã„"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s サブプロセス I/O エラー"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "%s ã®ãƒ‘ーミッションを変更ã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "ディレクトリ %s を作æˆã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "/dev/zeroを読込ã¿ç”¨ã«é–‹ã‘ã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "読ã¿è¾¼ã¿ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "%s å­ãƒ—ロセスã¸éžãƒ–ロック I/O を設定ã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "%s å­ãƒ—ロセスã¨ã®é€šä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "%s å­ãƒ—ロセスã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "%s å­ãƒ—ロセスã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "å­ãƒ—ロセス %s ãŒçµ‚了コード %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "スレッドã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s å­ãƒ—ロセスãŒçµ‚了コード %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Franc,ois Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "%s ã®ãƒ‘ーミッションを設定ã—ã¾ã™"
+
+#~ msgid "Hangup"
+#~ msgstr "Hangup"
+
+#~ msgid "Interrupt"
+#~ msgstr "割り込ã¿"
+
+#~ msgid "Quit"
+#~ msgstr "終了"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Illegal instruction"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Trace/breakpoint trap"
+
+#~ msgid "Aborted"
+#~ msgstr "中止"
+
+#~ msgid "Floating point exception"
+#~ msgstr "浮動å°æ•°ç‚¹ä¾‹å¤–"
+
+#~ msgid "Killed"
+#~ msgstr "強制終了"
+
+#~ msgid "Bus error"
+#~ msgstr "ãƒã‚¹ã‚¨ãƒ©ãƒ¼"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Segmentation fault"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Broken pipe"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Alarm clock"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminated"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "緊急 I/O 状態"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "åœæ­¢ (シグナル)"
+
+#~ msgid "Stopped"
+#~ msgstr "åœæ­¢"
+
+#~ msgid "Continued"
+#~ msgstr "継続"
+
+#~ msgid "Child exited"
+#~ msgstr "å­ãƒ—ロセス終了"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "åœæ­¢ (tty 入力)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "åœæ­¢ (tty 出力)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O å¯èƒ½"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "CPU時間制é™ã‚’超éŽã—ã¾ã—ãŸ"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "ファイルサイズ制é™ã‚’超éŽã—ã¾ã—ãŸ"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "仮想タイマーãŒçµ‚了ã—ã¾ã—ãŸ"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "プロファイリングタイマーãŒçµ‚了ã—ã¾ã—ãŸ"
+
+#~ msgid "Window changed"
+#~ msgstr "Window ãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸ"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "ユーザー定義シグナル1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "ユーザー定義シグナル2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT トラップ"
+
+#~ msgid "Bad system call"
+#~ msgstr "é–“é•ã£ãŸã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«"
+
+#~ msgid "Stack fault"
+#~ msgstr "スタックエラー"
+
+#~ msgid "Information request"
+#~ msgstr "情報è¦æ±‚"
+
+#~ msgid "Power failure"
+#~ msgstr "é›»æºã‚¨ãƒ©ãƒ¼"
+
+#~ msgid "Resource lost"
+#~ msgstr "リソースãŒç„¡ããªã‚Šã¾ã—ãŸ"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "é–‰ã˜ãŸãƒ‘イプã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆã¸ã®æ›¸ãè¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "リアルタイムシグナル %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "ä¸æ˜Žãªã‚·ã‚°ãƒŠãƒ« %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv 関数ãŒä½¿ãˆã¾ã›ã‚“"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv 関数ãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#~ msgid "character out of range"
+#~ msgstr "範囲外ã®æ–‡å­—"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "U+%04X をローカル文字セットã«å¤‰æ›ã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "U+%04X をローカル文字セットã«å¤‰æ›ã§ãã¾ã›ã‚“: %s "
+
+#~ msgid "invalid user"
+#~ msgstr "無効ãªãƒ¦ãƒ¼ã‚¶"
+
+#~ msgid "invalid group"
+#~ msgstr "無効ãªã‚°ãƒ«ãƒ¼ãƒ—"
+
+#~ msgid "invalid spec"
+#~ msgstr "無効ãªæŒ‡å®š"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "エラーメッセージを表示ã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "パッケージ作æˆè€…: %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "パッケージ作æˆè€…: %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/"
+#~ "gpl.html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "作者 %s。\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "作者 %s ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "作者 %s〠%sã€ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%sã€ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%s〠%sã€ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%s〠%s〠%sã€ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%s〠%s〠%s〠%sã€\n"
+#~ "ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%s〠%s〠%s〠%sã€\n"
+#~ "%sã€ãŠã‚ˆã³ %s。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "作者 %s〠%s〠%sã€\n"
+#~ "%s〠%s〠%s〠%sã€\n"
+#~ "%s〠%s〠ãŠã‚ˆã³ä»–ã®æ–¹ã€…。\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ãƒã‚°ã‚’発見ã—ãŸã‚‰ <%s> ã«å ±å‘Šã—ã¦ä¸‹ã•ã„。\n"
+#~ "翻訳ã«é–¢ã™ã‚‹ãƒã‚°ã¯<translation-team-ja@lists.sourceforge.net>ã«å ±å‘Šã—ã¦ã"
+#~ "ã ã•ã„。\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "%s ã®ãƒã‚°ã¯ <%s> ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s ã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s ã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "GNU ソフトウェアを使用ã™ã‚‹éš›ã®ä¸€èˆ¬çš„ãªãƒ˜ãƒ«ãƒ—: <http://www.gnu.org/gethelp/"
+#~ ">\n"
+
+#~ msgid "stdin"
+#~ msgstr "標準入力"
+
+#~ msgid "stdout"
+#~ msgstr "標準出力"
+
+#~ msgid "stderr"
+#~ msgstr "標準エラー出力"
+
+#~ msgid "unknown stream"
+#~ msgstr "ä¸æ˜Žãªã‚¹ãƒˆãƒªãƒ¼ãƒ "
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "%s をモード %s ã§å†åº¦é–‹ãã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "文字列ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "å•é¡Œã‚’回é¿ã™ã‚‹ãŸã‚ã« LC_ALL='C' を指定ã—ã¦ãã ã•ã„."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "比較ã—ãŸæ–‡å­—列㯠%s 㨠%s ã§ã™."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "書å¼è¨­å®šã‚’è¡Œã£ãŸå‡ºåŠ›ã‚’実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "引数 `%3$s' ã«å¯¾ã—㦠%1$s%2$s ãŒç„¡åŠ¹ã§ã™"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "引数 `%3$s' ã«å¯¾ã—ã¦ç„¡åŠ¹ãªæŽ¥å°¾è¾ž %1$s%2$s ã§ã™"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "引数 `%3$s' ã«å¯¾ã™ã‚‹ %1$s%2$s ãŒå¤§ãã™ãŽã¾ã™"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: ä¸æ­£ãªã‚ªãƒ—ション -- %c\n"
+
+#~ msgid "block size"
+#~ msgstr "ブロックサイズ"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s ã¯å­˜åœ¨ã—ã¾ã™ãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "%s ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¨ã‚°ãƒ«ãƒ¼ãƒ—を変更ã§ãã¾ã›ã‚“"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "ディレクトリ %s ã«ç§»å‹•ã§ãã¾ã›ã‚“"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "æ•°å­—ã®UIDã®ãƒ­ã‚°ã‚¤ãƒ³ã‚°ãƒ«ãƒ¼ãƒ—ã‚’å–å¾—ã§ãã¾ã›ã‚“"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "本プログラムã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™. GNU一般公有使用許諾\n"
+#~ "<http://www.gnu.org/licenses/gpl.html> ã§å®šã‚られãŸæ¡é …ã®ä¸‹ã§æœ¬ãƒ—ログラ\n"
+#~ "ムã®ã‚³ãƒ”ーをå†é…布ã§ãã¾ã™. é©åˆ‡ãªæ³•ãŒèªã‚‹é™ã‚Šã«ãŠã„ã¦å…¨ãã®ç„¡ä¿è¨¼ã§ã™.\n"
+#~ "\n"
diff --git a/gnulib_po/ko.gmo b/gnulib_po/ko.gmo
new file mode 100644
index 0000000..ee46f1f
--- /dev/null
+++ b/gnulib_po/ko.gmo
Binary files differ
diff --git a/gnulib_po/ko.po b/gnulib_po/ko.po
new file mode 100644
index 0000000..530a81f
--- /dev/null
+++ b/gnulib_po/ko.po
@@ -0,0 +1,535 @@
+# Korean messages for GNU textutils
+# Copyright (C) 1996, 2001, 2002 Free Software Foundation, Inc.
+# Bang Jun-Young <bangjy@nownuri.nowcom.co.kr>, 1996-1997.
+# Changwoo Ryu <cwryu@debian.org>, 2001-2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU textutils 2.0.22\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2002-07-22 20:02+0900\n"
+"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+"Language-Team: Korean <translation-team-ko@lists.sourceforge.net>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-KR\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fifoÆÄÀÏÀº Áö¿øÇÏÁö ¾Ê½À´Ï´Ù"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fifoÆÄÀÏÀº Áö¿øÇÏÁö ¾Ê½À´Ï´Ù"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fifoÆÄÀÏÀº Áö¿øÇÏÁö ¾Ê½À´Ï´Ù"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "¾²±â ¿À·ù"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "¾Ë ¼ö ¾ø´Â ½Ã½ºÅÛ ¿À·ù"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: `%s'Àº(´Â) ¸ðÈ£ÇÑ ¿É¼ÇÀÔ´Ï´Ù\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: `%s'Àº(´Â) ¸ðÈ£ÇÑ ¿É¼ÇÀÔ´Ï´Ù\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: ÀνÄÇÒ ¼ö ¾ø´Â ¿É¼Ç `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: `%c%s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: `%s' ¿É¼ÇÀº Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ºÎÀûÀýÇÑ ¿É¼Ç -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: ÀÌ ¿É¼ÇÀº Àμö°¡ ÇÊ¿äÇÕ´Ï´Ù -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: ºÎÀûÀýÇÑ Á¤±Ô½Ä: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "ºÎÀûÀýÇÑ ¹®ÀÚ Å¬·¡½º `%s'"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "ºÎÀûÀýÇÑ ¹®ÀÚ Å¬·¡½º `%s'"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: ºÎÀûÀýÇÑ Á¤±Ô½Ä: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "¸Þ¸ð¸®°¡ ¹Ù´Ú³²"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: ºÎÀûÀýÇÑ Á¤±Ô½Ä: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "Á¤±Ô½Ä Ž»ö¿¡ ¿À·ù ¹ß»ý"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: ºÎÀûÀýÇÑ Á¤±Ô½Ä: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "Á¤±Ô½Ä Ž»ö¿¡ ¿À·ù ¹ß»ý"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: ºÎÀûÀýÇÑ ÆÐÅÏ"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "¸Þ¸ð¸®°¡ ¹Ù´Ú³²"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "%2$s¿¡ ´ëÇØ ºÎÀûÀýÇÑ ÀÎÀÚ %1$s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "%2$s¿¡ ´ëÇØ ¾Ö¸ÅÇÑ ÀÎÀÚ %1$s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "¿Ã¹Ù¸¥ ÀÎÀÚ´Â:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr "±ä ¿É¼Ç¿¡¼­ ²À ÇÊ¿äÇÑ Àμö´Â ªÀº ¿É¼Ç¿¡µµ ²À ÇÊ¿äÇÕ´Ï´Ù.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "»ç¿ë¹ý: %s [<¿É¼Ç>] [<ÆÄÀÏ>]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é `%s --help' ÇϽʽÿÀ.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "<%s>(À¸)·Î ¹ö±×¸¦ ¾Ë·Á ÁֽʽÿÀ.\n"
+
+#, fuzzy
+#~ msgid "Print program version"
+#~ msgstr "ÇÁ·Î±×·¥ ¿À·ù"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "Àμö°¡ ³Ê¹« ¸¹À½"
+
+#~ msgid "program error"
+#~ msgstr "ÇÁ·Î±×·¥ ¿À·ù"
+
+#~ msgid "stack overflow"
+#~ msgstr "½ºÅà ¿À¹öÇ÷οì"
+
+#~ msgid "write error"
+#~ msgstr "¾²±â ¿À·ù"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "`%s'¸¦ `%s'·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "`%s'¸¦ `%s'·Î À̵¿ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "%sÀ»(¸¦) Àд µµÁß ¿À·ù ¹ß»ý"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "%s¿¡ ¾²´Â µµÁß ¿À·ù ¹ß»ý"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "%sÀ»(¸¦) Àд µµÁß ¿À·ù ¹ß»ý"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "ÆÄÀÏ ¿­±â ½ÇÆÐ"
+
+#~ msgid "regular empty file"
+#~ msgstr "ÀÏ¹Ý ºó ÆÄÀÏ"
+
+#~ msgid "regular file"
+#~ msgstr "ÀÏ¹Ý ÆÄÀÏ"
+
+#~ msgid "directory"
+#~ msgstr "µð·ºÅ丮"
+
+#~ msgid "block special file"
+#~ msgstr "ºí·Ï Ư¼ö ÆÄÀÏ"
+
+#~ msgid "character special file"
+#~ msgstr "¹®ÀÚ Æ¯¼ö ÆÄÀÏ"
+
+#~ msgid "fifo"
+#~ msgstr "FIFO"
+
+#~ msgid "symbolic link"
+#~ msgstr "½Éº¼¸¯ ¸µÅ©"
+
+#~ msgid "socket"
+#~ msgstr "¼ÒÄÏ"
+
+#~ msgid "message queue"
+#~ msgstr "¸Þ¼¼Áö Å¥"
+
+#~ msgid "semaphore"
+#~ msgstr "¼¼¸¶Æ÷¾î"
+
+#~ msgid "shared memory object"
+#~ msgstr "°øÀ¯ ¸Þ¸ð¸® ¿ÀºêÁ§Æ®"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "°øÀ¯ ¸Þ¸ð¸® ¿ÀºêÁ§Æ®"
+
+#~ msgid "weird file"
+#~ msgstr "±«»óÇÑ ÆÄÀÏ"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: `--%s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: ÀνÄÇÒ ¼ö ¾ø´Â ¿É¼Ç `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: À߸øµÈ ¿É¼Ç -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: `-W %s'Àº(´Â) ¸ðÈ£ÇÑ ¿É¼ÇÀÔ´Ï´Ù\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: `-W %s' ¿É¼ÇÀº Àμö¸¦ Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù\n"
+
+#~ msgid "block size"
+#~ msgstr "ºí·Ï Å©±â"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%sÀÌ(°¡) Á¸ÀçÇÏÁö¸¸ µð·ºÅ丮°¡ ¾Æ´Õ´Ï´Ù"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "%sÀÇ ¼ÒÀ¯ÀÚ ±×¸®°í/ȤÀº ±×·ìÀ» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "%s µð·ºÅ丮¸¦ ¸¸µé ¼ö ¾ø½À´Ï´Ù"
+
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "%s µð·ºÅ丮·Î chdirÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "%sÀÇ Çã°¡¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "%sÀÇ Çã°¡¸¦ ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+# not usable°ú not availableÀÇ Â÷ÀÌ´Â?
+#~ msgid "iconv function not available"
+#~ msgstr "iconv ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#~ msgid "character out of range"
+#~ msgstr "¹üÀ§¸¦ ¹þ¾î³­ ¹®ÀÚ"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "U+%04XÀ»(¸¦) ·ÎÄ® ¹®ÀÚ¼ÂÀ¸·Î º¯È¯ÇÒ ¼ö ¾ø½À´Ï´Ù: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "À߸øµÈ »ç¿ëÀÚ"
+
+#~ msgid "invalid group"
+#~ msgstr "À߸øµÈ ±×·ì"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "UIDÀÇ ·Î±×ÀÎ ±×·ìÀ» ¾Ë¾Æ ³¾ ¼ö ¾ø½À´Ï´Ù"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ÀÌ ÇÁ·Î±×·¥Àº ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÔ´Ï´Ù. ¼ÒÇÁÆ®¿þ¾îÀÇ ÇǾ絵ÀÚ´Â ÀÚÀ¯ \n"
+#~ "¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÌ °øÇ¥ÇÑ GNU General Public License 2ÆÇ (¶Ç´Â ±× ÀÌÈÄ \n"
+#~ "ÆÇÀ» ÀÓÀÇ·Î ¼±ÅÃÇؼ­), ±× ±ÔÁ¤¿¡ µû¶ó ÇÁ·Î±×·¥À» °³ÀÛÇϰųª Àç¹èÆ÷ÇÒ \n"
+#~ "¼ö ÀÖ½À´Ï´Ù.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "%sÀÌ(°¡) ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "%sÀÌ(°¡) ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "%sÀÌ(°¡) ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "%sÀÌ(°¡) ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "%sÀÌ(°¡) ¸¸µé¾ú½À´Ï´Ù.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "¹®ÀÚ¿­ ºñ±³°¡ ½ÇÆÐÇß½À´Ï´Ù"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "ÀÌ ¹®Á¦¸¦ ÇÇÇØ °¡·Á¸é LC_ALL='C'ÇϽʽÿÀ."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "ºñ±³ÇÑ ¹®ÀÚ¿­Àº %s°ú(¿Í) %sÀÔ´Ï´Ù."
diff --git a/gnulib_po/ms.gmo b/gnulib_po/ms.gmo
new file mode 100644
index 0000000..008d5c0
--- /dev/null
+++ b/gnulib_po/ms.gmo
Binary files differ
diff --git a/gnulib_po/ms.po b/gnulib_po/ms.po
new file mode 100644
index 0000000..480969f
--- /dev/null
+++ b/gnulib_po/ms.po
@@ -0,0 +1,514 @@
+# Terjemahan coreutils untuk Bahasa Melayu.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Hasbullah Bin Pit <sebol@ikhlas.com>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: coreutils 5.0.90\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2003-08-10 16:00+0800\n"
+"Last-Translator: Hasbullah Bin Pit <sebol@ikhlas.com>\n"
+"Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
+"Language: ms\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ralat sistem yang tidak diketahui"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fail fifo tidak disokong"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fail fifo tidak disokong"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fail fifo tidak disokong"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "ralat menulis"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Ralat sistem yang tidak diketahui"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: opsyen `%s' adalah ambiguous\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: opsyen `%s' adalah ambiguous\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opensyen tidak dikenali `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: opsyen `%c%s' tidak mengizinkan hujah\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: opsyen `%s' memerlukan hujah\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opsyen tidak sah -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: opsyen memerlukan hujah -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "gagal untuk kembali ke direktori kerja pemulaan"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "gagal untuk kembali ke direktori kerja pemulaan"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "`"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: ungkapan biasa (regexp) tidak sah: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "aksara tidak sah pada %s pada rentetan mod %s"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "aksara tidak sah pada %s pada rentetan mod %s"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: ungkapan biasa (regexp) tidak sah: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "memori keletihan"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: ungkapan biasa (regexp) tidak sah: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "ralat pada carian ungkapan biasa (regexp)"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: ungkapan biasa (regexp) tidak sah: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "ralat pada carian ungkapan biasa (regexp)"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "tak boleh mencipta pautan %s"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "fail istimewa blok"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "fail istimewa blok"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "fail istimewa blok"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memori keletihan"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "hujah tidak sah %s bagi %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "hujah ambiguous %s bagi %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Hujah sah adalah:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Hujah mandatori kepada opsyen panjang andalah mandatori bagi opsyen "
+#~ "pendek juga.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Pengunaan: %s [OPSYEN]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Cuba `%s --help' untuk maklumat lanjut .\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Lapor pepijat ke <%s>.\n"
+
+#~ msgid "NAME"
+#~ msgstr "NAMA"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "terlalu banyak hujah"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "ralat membaca"
+
+#~ msgid "write error"
+#~ msgstr "ralat menulis"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "tak dapat buka %s untuk dibaca"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "tak dapat buka %s untuk dibaca"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "membaca %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "menulis %s"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "membaca %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "pembukaan gagal"
+
+#~ msgid "regular empty file"
+#~ msgstr "fail kosong biasa"
+
+#~ msgid "regular file"
+#~ msgstr "fail biasa"
+
+#~ msgid "directory"
+#~ msgstr "direktori"
+
+#~ msgid "block special file"
+#~ msgstr "fail istimewa blok"
+
+#~ msgid "character special file"
+#~ msgstr "fail istimewa aksara"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "pautan simbolik"
+
+#~ msgid "socket"
+#~ msgstr "soket"
+
+#~ msgid "message queue"
+#~ msgstr "giliran mesej"
+
+#~ msgid "shared memory object"
+#~ msgstr "objek memori terkongsi"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "objek memori terkongsi"
+
+#~ msgid "weird file"
+#~ msgstr "fail pelik"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opsyen `--%s' tidak mengizinkan hujah\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: opensyen tidak dikenali `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opsyen tidak dibenarkan -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: opsyen `-W %s' adalah ambiguous\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: opsyen `-W %s' tidak mengizinkan hujan\n"
+
+#~ msgid "block size"
+#~ msgstr "saiz blok"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s wujud tapi ianya bukan direktori"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "tak dapat menukar hakmilik dan/atau kumpulan %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "tak dapat mencipta direktori %s"
+
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "tak dapat chdir ke direktori %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "tak dapat menukar keizinan %s"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "gagal mengekalkan keizinan bagi %s"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[tT]"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "fungsi iconv tak boleh digunakan"
+
+#~ msgid "iconv function not available"
+#~ msgstr "fungsi iconv tidak ada"
+
+#~ msgid "character out of range"
+#~ msgstr "aksara di luar julat"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "tak dapat menukar U+%04X ke set aksara lokal"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "tak dapat menukar U+%04X ke set aksara lokal: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "pengguna tidak sah"
+
+#~ msgid "invalid group"
+#~ msgstr "kumpulan tidak sah"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "tak boleh mendapatkan kumpulan logmasuk untuk UID numerik"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Ditulis oleh %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Ditulis oleh %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Ditulis oleh %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "Ditulis oleh %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "Ditulis oleh %s.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "perbandingan rentetan gagal"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Tetapkan LC_ALL='C' untuk mengatasi masalah."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Rentetan dibandingkan adalah %s dan %s."
diff --git a/gnulib_po/nb.gmo b/gnulib_po/nb.gmo
new file mode 100644
index 0000000..c31fa1b
--- /dev/null
+++ b/gnulib_po/nb.gmo
Binary files differ
diff --git a/gnulib_po/nb.po b/gnulib_po/nb.po
new file mode 100644
index 0000000..40d3e39
--- /dev/null
+++ b/gnulib_po/nb.po
@@ -0,0 +1,516 @@
+# Norwegian messages for GNU textutils (bokmål dialect)
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Eivind Tagseth <eivindt@multinet.no>, 1996, 1997, 1999.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU textutils 2.0.20\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2002-01-27 21:35+0100\n"
+"Last-Translator: Eivind Tagseth <eivindt@multinet.no>\n"
+"Language-Team: Norwegian <i18n-nb@lister.ping.uio.no>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ukjent systemfeil"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "blokkstørrelse"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "blokkstørrelse"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "blokkstørrelse"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "feil ved skriving"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Ukjent systemfeil"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: flagget «%s» er flertydig\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: flagget «%s» er flertydig\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: ukjent flagg «%c%s»\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: flagget «%c%s» trenger et argument\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: flagget «%s» trenger et argument\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ukjent flagg -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: flagget trenger et argument -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "kan ikke opprette katalog %s"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "kan ikke opprette katalog %s"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: ugyldig regulært uttrykk: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "ugyldig tegn-klasse «%s»"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "ugyldig tegn-klasse «%s»"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: ugyldig regulært uttrykk: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "virtuelt minne oppbrukt"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: ugyldig regulært uttrykk: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "feil i søk med regulært uttrykk"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: ugyldig regulært uttrykk: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "feil i søk med regulært uttrykk"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "kan ikke opprette katalog %s"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: ugyldig mønster"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: ugyldig mønster"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: ugyldig mønster"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "virtuelt minne oppbrukt"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "ugyldig argument %s for %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "flertydig argument %s for %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Gyldige argument er:"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Obligatoriske argmenter til lange flagg er obligatoriske også for korte.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Bruk: %s [FLAGG] [FIL]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Prøv med «%s --help» for mer informasjon.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapportér feil til <bug-textutils@gnu.org>."
+
+#, fuzzy
+#~ msgid "Print program version"
+#~ msgstr "lesefeil"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "for mange argumenter"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "lesefeil"
+
+#~ msgid "write error"
+#~ msgstr "feil ved skriving"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "feil ved lesing av %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "feil ved skriving til %s"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "feil ved lesing av %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "åpning av fil feilet"
+
+#, fuzzy
+#~ msgid "regular empty file"
+#~ msgstr "feil ved lesing"
+
+#, fuzzy
+#~ msgid "regular file"
+#~ msgstr "feil ved lesing"
+
+#, fuzzy
+#~ msgid "directory"
+#~ msgstr "%s eksisterer men er ikke en katalog"
+
+#, fuzzy
+#~ msgid "block special file"
+#~ msgstr "blokkstørrelse"
+
+#, fuzzy
+#~ msgid "character special file"
+#~ msgstr "tegn-posisjon er null"
+
+#, fuzzy
+#~ msgid "symbolic link"
+#~ msgstr "kan ikke utføre ioctl på «%s»"
+
+#, fuzzy
+#~ msgid "weird file"
+#~ msgstr "feil ved lesing"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: flagget «--%s» trenger et argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: ukjent flagg «--%s»\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: ukjent flagg -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: flagget «-W %s» er flertydig\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: flagget «-W %s» tillater ikke et argument\n"
+
+#~ msgid "block size"
+#~ msgstr "blokkstørrelse"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s eksisterer men er ikke en katalog"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "kan ikke endre eier og/eller gruppe for %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "kan ikke opprette katalog %s"
+
+#, fuzzy, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "kan ikke skifte til katalog, %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "kan ikke endre rettigheter til %s"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "kan ikke endre rettigheter til %s"
+
+#, fuzzy
+#~ msgid "^[yY]"
+#~ msgstr "^[jJ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, fuzzy
+#~ msgid "iconv function not usable"
+#~ msgstr "kan ikke skrive ut U+%04X: iconv-funksjonen er ikke brukbar"
+
+#, fuzzy
+#~ msgid "iconv function not available"
+#~ msgstr "kan ikke skrive ut U+%04X: iconv-funksjon er ikke tilgjengelig"
+
+#, fuzzy
+#~ msgid "character out of range"
+#~ msgstr "U+%04X: tegn utenfor tillatte verdier"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
+
+#, fuzzy, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "kan ikke konvertere U+%04X til lokalt tegnsett"
+
+#~ msgid "invalid user"
+#~ msgstr "ugyldig bruker"
+
+#~ msgid "invalid group"
+#~ msgstr "ugyldig gruppe"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "kan ikke finne login-gruppen til en numerisk bruker-ID"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Dette programmet er fri programvare. Du kan redistribueret det og/eller\n"
+#~ "modifisere det under betingelsene gitt av GNU General Public License som\n"
+#~ "distribuert av Free Software Foundation; enten versjon 2, eller (om du "
+#~ "vil)\n"
+#~ "en hvilken som helst senere versjon.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Skrevet av %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Skrevet av %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Skrevet av %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "Skrevet av %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "Skrevet av %s.\n"
+
+#~ msgid "string comparison failed"
+#~ msgstr "strengsammenligning feilet"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Sett LC_ALL='C' for å omgå problemet."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Strengene som ble sammenlignet var «%s» og «%s»."
diff --git a/gnulib_po/nl.gmo b/gnulib_po/nl.gmo
new file mode 100644
index 0000000..8d7ca80
--- /dev/null
+++ b/gnulib_po/nl.gmo
Binary files differ
diff --git a/gnulib_po/nl.po b/gnulib_po/nl.po
new file mode 100644
index 0000000..30d7996
--- /dev/null
+++ b/gnulib_po/nl.po
@@ -0,0 +1,1005 @@
+# Dutch translations for gnulib.
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# Erick Branderhorst <branderh@debian.org>, 1996.
+# Ivo Timmermans <ivo@o2w.nl>, 2000.
+# Freek de Kruijf <f.de.kruijf@hetnet.nl>, 2004, 2005.
+# Erwin Poeze <erwin.poeze@gmail.com>, 2009, 2010.
+# Benno Schulenberg <benno@vertaalt.nl>, 2007, 2008, 2010, 2011, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib-4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-29 13:31+0200\n"
+"Last-Translator: Benno Schulenberg <vertaling@coevern.nl>\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-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Onbekende systeemfout"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Adresfamilie voor hostnaam wordt niet ondersteund"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Tijdelijk probleem in naamsherleiding"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Ongeldige waarde voor 'ai_flags'"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Onherstelbaar probleem in naamsherleiding"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "'ai_family' wordt niet ondersteund"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Onvoldoende geheugen beschikbaar"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Aan hostnaam is geen adres verbonden"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Naam of dienst is niet bekend"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servicenaam wordt niet ondersteund voor 'ai_socktype'"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "'ai_socktype' wordt niet ondersteund"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Systeemfout"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumentenbuffer is te klein"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Bezig met verwerken van verzoek"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Verzoek is geannuleerd"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Verzoek is niet geannuleerd"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Alle verzoeken zijn gedaan"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Onderbroken door een signaal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parametertekst is niet juist gecodeerd"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Onbekende fout"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: optie '%s%s' is niet eenduidig\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: optie '%s%s' is niet eenduidig; mogelijkheden zijn:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: onbekende optie '%s%s'\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: optie '%s%s' staat geen argument toe\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: optie '%s%s' vereist een argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ongeldige optie -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: optie vereist een argument -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan de huidige werkmap niet vastleggen"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kan niet terugkeren naar de oorspronkelijke werkmap"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle() is mislukt"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan bestandsdescriptor %d niet herstellen: dup2() is mislukt"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "‘"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "’"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Gelukt"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Geen overeenkomsten"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ongeldige reguliere expressie"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ongeldig samengesteld teken"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ongeldige tekenklassenaam"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Backslash aan het eind"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ongeldige terugverwijzing"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ongepaarde [, [^, [:, [., of [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ongepaarde ( of \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ongepaarde \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ongeldige inhoud van \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ongeldig bereikeinde"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Onvoldoende geheugen beschikbaar"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ongeldige voorafgaande reguliere expressie"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Voortijdig einde van reguliere expressie"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Reguliere expressie is te groot"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ongepaarde ) of \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Geen eerdere reguliere expressie"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "kan geen pijp aanmaken"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subproces %s is mislukt"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "subproces %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "subproces %s ontving het fatale signaal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "onvoldoende geheugen beschikbaar"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "ongeldig argument %s van %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argument %s van %s is niet eenduidig"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Geldige argumenten zijn:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: waarde voor '%s' is kleiner of gelijk aan %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: Parameter in ARGP_HELP_FMT vereist een waarde"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Onbekende parameter in ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Rommel in ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Een argument dat verplicht of optioneel is voor een lange optie, is dat\n"
+#~ "ook voor de overeenkomstige korte optie."
+
+#~ msgid "Usage:"
+#~ msgstr "Gebruik: "
+
+#~ msgid " or: "
+#~ msgstr " of: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPTIE...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Typ '%s --help' of '%s --usage' voor meer informatie.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "Rapporteer gebreken in het programma aan %s;\n"
+#~ "meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "deze hulptekst tonen"
+
+#~ msgid "give a short usage message"
+#~ msgstr "een korte gebruikssamenvatting tonen"
+
+#~ msgid "NAME"
+#~ msgstr "NAAM"
+
+#~ msgid "set the program name"
+#~ msgstr "de programmanaam instellen"
+
+#~ msgid "SECS"
+#~ msgstr "SECONDEN"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "dit aantal seconden pauzeren (standaard 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "programmaversie tonen"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "**Interne programmafout**: geen versie bekend!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Te veel argumenten\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "**Interne programmafout**: optie had herkend moeten worden!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u vrijgegeven (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u gecached (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u gecached (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u gecached (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histogram van aantal gezette bits\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histogram van bitset-groottes\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histogram van dichtheid aan gezette bits\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bitset-statistieken:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Aantal uitvoeringen = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "kan statistiekenbestand niet lezen"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "statistiekenbestand heeft een verkeerde grootte\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "kan statistiekenbestand niet schrijven"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "kan statistiekenbestand niet openen voor schrijven"
+
+#~ msgid "program error"
+#~ msgstr "programmafout"
+
+#~ msgid "stack overflow"
+#~ msgstr "stack-overloop"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "kan geen tijdelijke map vinden; zet $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "kan met sjabloon '%s' geen tijdelijke map aanmaken"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "kan tijdelijk bestand '%s' niet verwijderen"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "kan tijdelijke map '%s' niet verwijderen"
+
+#~ msgid "error closing file"
+#~ msgstr "fout bij sluiten van bestand"
+
+#~ msgid "write error"
+#~ msgstr "schrijffout"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "toegangsrechten van '%s' worden behouden"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "fout bij openen van %s voor lezen"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "kan reservekopiebestand %s niet openen voor schrijven"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "fout bij lezen van %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "fout bij schrijven van %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "fout na lezen van %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() is mislukt"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "C#-compiler is niet gevonden; installeer 'mono'"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "virtuele C#-machine is niet gevonden; installeer 'mono'"
+
+#~ msgid "unbalanced ["
+#~ msgstr "ongepaarde ["
+
+#~ msgid "invalid character class"
+#~ msgstr "ongeldige tekenklasse"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "syntax van tekenklasse is [[:space:]], niet [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "onafgemaakte \\-stuurcode"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "ongeldige inhoud van \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "reguliere expressie is te groot"
+
+#~ msgid "unbalanced ("
+#~ msgstr "ongepaarde ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "geen syntax opgegeven"
+
+#~ msgid "unbalanced )"
+#~ msgstr "ongepaarde )"
+
+#~ msgid "regular empty file"
+#~ msgstr "leeg normaal bestand"
+
+#~ msgid "regular file"
+#~ msgstr "normaal bestand"
+
+#~ msgid "directory"
+#~ msgstr "map"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolische koppeling"
+
+#~ msgid "message queue"
+#~ msgstr "berichtenwachtrij"
+
+#~ msgid "semaphore"
+#~ msgstr "semafoor"
+
+#~ msgid "shared memory object"
+#~ msgstr "gedeeld geheugenobject"
+
+#~ msgid "typed memory object"
+#~ msgstr "zelfstandig geheugenobject"
+
+#~ msgid "block special file"
+#~ msgstr "blok-apparaat"
+
+#~ msgid "character special file"
+#~ msgstr "byte-apparaat"
+
+#~ msgid "contiguous data"
+#~ msgstr "aaneengesloten gegevens"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "door"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "gemultiplexed blok-apparaat"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "gemultiplexed byte-apparaat"
+
+#~ msgid "multiplexed file"
+#~ msgstr "gemultiplexed bestand"
+
+#~ msgid "named file"
+#~ msgstr "benoemd bestand"
+
+#~ msgid "network special file"
+#~ msgstr "netwerkapparaat"
+
+#~ msgid "migrated file with data"
+#~ msgstr "gemigreerd bestand met gegevens"
+
+#~ msgid "migrated file without data"
+#~ msgstr "gemigreerd bestand zonder gegevens"
+
+#~ msgid "port"
+#~ msgstr "poort"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "whiteout"
+#~ msgstr "whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "merkwaardig bestand"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "ongeldige waarde voor 'source_version' in compile_java_class()"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "ongeldige waarde voor 'target_version' in compile_java_class()"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "aanmaken van '%s' is mislukt"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "fout bij schrijven van bestand '%s'"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Java-compiler is niet gevonden; installeer 'gcj' of zet $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Virtuele Java-machine is niet gevonden; installeer 'gcj' of zet $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "In-/uitvoerfout in subproces %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "kan status van '%s' niet opvragen"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "kan de toegangsrechten van %s niet veranderen"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "kan map %s niet aanmaken"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Openen van /dev/zero voor lezen is mislukt"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "Het aanmaken van een lees-thread is mislukt"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "kan geen niet-blokkerende in-/uitvoer instellen naar subproces %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "communicatie met subproces %s is mislukt"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "schrijven naar subproces %s is mislukt"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "lezen uit subproces %s is mislukt"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "subproces %s is geëindigd met afsluitwaarde %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "aanmaken van threads is mislukt"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "subproces %s is geëindigd met afsluitwaarde %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJyY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "toegangsrechten van %s worden ingesteld"
+
+# Vroeger ging dit over het afsluiten van een modemverbinding,
+# tegenwoordig over het afsluiten van een pseudoterminal.
+#~ msgid "Hangup"
+#~ msgstr "Opgehangen"
+
+#~ msgid "Interrupt"
+#~ msgstr "Onderbroken"
+
+# Verleden tijd, "Afgesloten", net als de andere actiesignaalnamen.
+#~ msgid "Quit"
+#~ msgstr "Afgesloten"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Ongeldige instructie"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Traceer/breekpunt-instructie"
+
+#~ msgid "Aborted"
+#~ msgstr "Afgebroken"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Drijvendekomma-berekeningsfout"
+
+#~ msgid "Killed"
+#~ msgstr "Geëlimineerd"
+
+#~ msgid "Bus error"
+#~ msgstr "Busfout"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Segmentatiefout"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Gebroken pijp"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Wekker"
+
+#~ msgid "Terminated"
+#~ msgstr "Beëindigd"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Urgente in-/uitvoertoestand"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Gepauzeerd (signaal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Gepauzeerd"
+
+#~ msgid "Continued"
+#~ msgstr "Doorgegaan"
+
+#~ msgid "Child exited"
+#~ msgstr "Dochter is afgesloten"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Gepauzeerd (terminalinvoer)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Gepauzeerd (terminaluitvoer)"
+
+#~ msgid "I/O possible"
+#~ msgstr "In-/uitvoer is mogelijk"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Limiet op processortijd is overschreden"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Limiet op bestandsgrootte is overschreden"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Virtuele tijdopnemer is verlopen"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Tijdopnemer voor analyse is verlopen"
+
+#~ msgid "Window changed"
+#~ msgstr "Venster is veranderd"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Gebruikergedefinieerd signaal 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Gebruikergedefinieerd signaal 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT-instructie"
+
+#~ msgid "Bad system call"
+#~ msgstr "Onjuiste systeemaanroep"
+
+#~ msgid "Stack fault"
+#~ msgstr "Stack-fout"
+
+#~ msgid "Information request"
+#~ msgstr "Verzoek om informatie"
+
+#~ msgid "Power failure"
+#~ msgstr "Stroomstoring"
+
+#~ msgid "Resource lost"
+#~ msgstr "Hulpbron verloren"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "fouten bij het schrijven naar een afgesloten 'pipe' of 'socket'"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Realtime-signaal %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Onbekend signaal %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Uitvoeringstijden (in seconden)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU (gebruiker)"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU (systeem)"
+
+#~ msgid "wall clock"
+#~ msgstr "kloktijd"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "de functie iconv() is onbruikbaar"
+
+#~ msgid "iconv function not available"
+#~ msgstr "de functie iconv() is niet beschikbaar"
+
+#~ msgid "character out of range"
+#~ msgstr "teken ligt buiten het toegestane bereik"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "kan U+%04X niet converteren naar de lokale tekenset"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "kan U+%04X niet converteren naar de lokale tekenset: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ongeldige gebruiker"
+
+#~ msgid "invalid group"
+#~ msgstr "ongeldige groep"
+
+#~ msgid "invalid spec"
+#~ msgstr "ongeldige aanduiding"
+
+#~ msgid "unable to display error message"
+#~ msgstr "kan foutmelding niet tonen"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "In pakketvorm gebracht door %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "In pakketvorm gebracht door %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Dit is vrije software: u mag het vrijelijk wijzigen en verder "
+#~ "verspreiden.\n"
+#~ "De precieze licentie is GPL-3+: GNU General Public License versie 3 of "
+#~ "later.\n"
+#~ "Zie <%s> voor de volledige (Engelse) tekst.\n"
+#~ "Deze software kent GEEN GARANTIE, voor zover de wet dit toestaat.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Geschreven door %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Geschreven door %s en %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Geschreven door %s, %s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s\n"
+#~ "en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s, %s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s, %s, %s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s en %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Geschreven door %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s en anderen.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Rapporteer gebreken in het programma aan <%s>;\n"
+#~ "meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr ""
+#~ "Rapporteer gebreken in het programma '%s' aan <%s>;\n"
+#~ "meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Webpagina van %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Algemene hulp bij gebruik van GNU-software: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "kan modus van bestandsdescriptor niet instellen op tekst of binair"
+
+#~ msgid "stdin"
+#~ msgstr "standaardinvoer"
+
+#~ msgid "stdout"
+#~ msgstr "standaarduitvoer"
+
+#~ msgid "stderr"
+#~ msgstr "standaardfoutuitvoer"
+
+#~ msgid "unknown stream"
+#~ msgstr "onbekende gegevensstroom"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "opnieuw openen van '%s' met modus %s is mislukt"
+
+#~ msgid "string comparison failed"
+#~ msgstr "vergelijking van tekenreeksen is mislukt"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Zet LC_ALL='C' om het probleem te omzeilen."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "De te vergelijken tekenreeksen waren %s en %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "kan geen opgemaakte uitvoer aanmaken"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "standaard bestandsdescriptors"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "ongeldig argument '%3$s' van %1$s%2$s"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "ongeldig achtervoegsel in argument '%3$s' van %1$s%2$s"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "argument '%3$s' van %1$s%2$s is te groot"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: Parameter in ARGP_HELP_FMT moet positief zijn"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: optie '--%s' staat geen argument toe\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: onbekende optie '--%s'\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: optie '-W %s' staat geen argument toe\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: optie '-W %s' vereist een argument\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Webpagina van %s: <http://www.gnu.org/software/%s/>\n"
diff --git a/gnulib_po/pl.gmo b/gnulib_po/pl.gmo
new file mode 100644
index 0000000..31a065a
--- /dev/null
+++ b/gnulib_po/pl.gmo
Binary files differ
diff --git a/gnulib_po/pl.po b/gnulib_po/pl.po
new file mode 100644
index 0000000..873ed47
--- /dev/null
+++ b/gnulib_po/pl.po
@@ -0,0 +1,984 @@
+# Polish messages for gnulib
+# Copyright (C) 2005, 2007, 2009, 2010, 2011, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# Jakub Bogusz <qboosh@pld-linux.org>, 2007-2019.
+# based on translation for GNU Mailutils by:
+# Sergey Poznyakoff <gray@gnu.org>, 2003,2004,2005.
+# corrections: Wojciech Polak <polak@gnu.org>, 2003
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-19 20: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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Nieznany błąd systemowy"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Rodzina adresów dla podanej nazwy hosta nie jest obsługiwana"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Tymczasowy błąd rozwiązywania nazw"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Błędna wartość ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Nienaprawialny błąd w rozwiązywaniu nazw"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family zawiera nie obsługiwaną rodzinę protokołów"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Błąd przydzielania pamięci"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Brak adresu zwiÄ…zanego z nazwÄ… hosta"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nieznana nazwa lub usługa"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Usługa nie obsługiwana dla danego ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype zawiera nie obsługiwany typ gniazda"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "BÅ‚Ä…d systemowy"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Bufor argumentu zbyt mały"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Przetwarzanie żądania jest w toku"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Żądanie anulowane"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Żądanie nie anulowane"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Wszystkie żądania wykonane"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Przerwane przez sygnał"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "ÅaÅ„cuch parametru niepoprawnie zakodowany"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Nieznany błąd"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: opcja '%s%s' jest niejednoznaczna\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: opcja '%s%s' jest niejednoznaczna; możliwości:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: nieznana opcja '%s%s'\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: opcja '%s%s' nie może mieć argumentów\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: opcja '%s%s' musi mieć argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: błędna opcja -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: opcja musi mieć argument -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "nie udało się zapisać bieżącego katalogu roboczego"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "nie udało się wrócić do początkowego katalogu roboczego"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle nie powiodło się"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "nie można odtworzyć fd %d: dup2 nie powiodło się"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Sukces"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Nic nie pasuje"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Błędne wyrażenie regularne"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Błędny znak sortowany"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Błędna nazwa klasy znaków"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Kończący znak `\\'"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Błędne odniesienie wstecz"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Niesparowane [, [^, [:, [. lub [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Niesparowane ( lub \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Niesparowane \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Błędna zawartość \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Błędny koniec zakresu"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Pamięć wyczerpana"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Błędne poprzedzające wyrażenie regularne"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Przedwczesny koniec wyrażenia regularnego"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Wyrażenie regularne zbyt duże"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Niesparowane ) lub \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Brak poprzedniego wyrażenia regularnego"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "nie można utworzyć potoku"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "podproces %s zawiódł"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "podproces %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "podproces %s dostał krytyczny sygnał %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "pamięć wyczerpana"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "błędny argument %s opcji %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "niejednoznaczny argument %s opcji %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Prawidłowe argumenty to:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: wartość %s jest mniejsza lub równa %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: Parametr ARGP_HELP_FMT wymaga podania wartości"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Nieznany parametr ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Błędne dane w ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Argumenty obowiązkowe lub opcjonalne dla długich opcji są również "
+#~ "obowiązkowe lub opcjonalne dla odpowiednich krótkich opcji."
+
+#~ msgid "Usage:"
+#~ msgstr "Składnia:"
+
+#~ msgid " or: "
+#~ msgstr " lub: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPCJA...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Polecenie '%s --help' lub '%s --usage' pozwoli uzyskać więcej "
+#~ "informacji.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Prosimy zgłaszać błędy na adres %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "wyświetlenie tego tekstu pomocy"
+
+#~ msgid "give a short usage message"
+#~ msgstr "wyświetlenie krótkiej informacji o składni polecenia"
+
+#~ msgid "NAME"
+#~ msgstr "NAZWA"
+
+#~ msgid "set the program name"
+#~ msgstr "określenie nazwy programu"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "zatrzymanie na SEK sekund (domyślnie 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "wyświetlenie wersji programu"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(BÅÄ„D PROGRAMU) Nieznana wersja!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Za dużo argumentów\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(BÅÄ„D PROGRAMU) Opcja powinna zostać rozpoznana!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u zwolniono (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u w pamięci podręcznej (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u w pamięci podręcznej (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u w pamięci podręcznej (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histogram liczników\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histogram rozmiarów\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histogram gęstości\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statystyki operacji bitset:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Uruchomień łącznie = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "nie można odczytać pliku statystyk"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "błędny rozmiar pliku statystyk\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "nie można zapisać pliku statystyk"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "nie można otworzyć pliku statystyk do zapisu"
+
+#~ msgid "program error"
+#~ msgstr "błąd programu"
+
+#~ msgid "stack overflow"
+#~ msgstr "przepełnienie stosu"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "nie można odnaleźć katalogu tymczasowego, można spróbować ustawić $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "nie można utworzyć katalogu typczasowego z użyciem szablonu \"%s\""
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "nie można usunąć pliku tymczasowego %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "nie można usunąć katalogu tymczasowego %s"
+
+#~ msgid "error closing file"
+#~ msgstr "błąd podczas zamykania pliku"
+
+#~ msgid "write error"
+#~ msgstr "błąd zapisu"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "zachowywanie uprawnień do %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "błąd podczas otwierania %s do odczytu"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "nie można otworzyć pliku zapasowego %s do zapisu"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "błąd odczytu %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "błąd zapisu %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "błąd po odczycie %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() nie powiodło się"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "Nie znaleziono kompilatora C#, proszę spróbować zainstalować mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr ""
+#~ "Nie znaleziono maszyny wirtualnej C#, proszę spróbować zainstalować mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "niesparowany ["
+
+#~ msgid "invalid character class"
+#~ msgstr "błędna klasa znaków"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "składnia klasy znaków to [[:space:]], nie [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "niedokończona sekwencja \\"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "błędna zawartość \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "wyrażenie regularne zbyt duże"
+
+#~ msgid "unbalanced ("
+#~ msgstr "niesparowany ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "nie określono składni"
+
+#~ msgid "unbalanced )"
+#~ msgstr "niesparowany )"
+
+#~ msgid "regular empty file"
+#~ msgstr "pusty zwykły plik"
+
+#~ msgid "regular file"
+#~ msgstr "zwykły plik"
+
+#~ msgid "directory"
+#~ msgstr "katalog"
+
+#~ msgid "symbolic link"
+#~ msgstr "dowiÄ…zanie symboliczne"
+
+#~ msgid "message queue"
+#~ msgstr "kolejka komunikatów"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "obiekt w pamięci współdzielonej"
+
+#~ msgid "typed memory object"
+#~ msgstr "obiekt z typem w pamięci"
+
+#~ msgid "block special file"
+#~ msgstr "blokowy plik specjalny"
+
+#~ msgid "character special file"
+#~ msgstr "znakowy plik specjalny"
+
+#~ msgid "contiguous data"
+#~ msgstr "dane ciągłe"
+
+#~ msgid "fifo"
+#~ msgstr "potok"
+
+#~ msgid "door"
+#~ msgstr "plik door"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "multipleksowany blokowy plik specjalny"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "multipleksowany znakowy plik specjalny"
+
+#~ msgid "multiplexed file"
+#~ msgstr "plik multipleksowany"
+
+#~ msgid "named file"
+#~ msgstr "plik nazwany"
+
+#~ msgid "network special file"
+#~ msgstr "sieciowy plik specjalny"
+
+#~ msgid "migrated file with data"
+#~ msgstr "zmigrowany plik z danymi"
+
+#~ msgid "migrated file without data"
+#~ msgstr "zmigrowany plik bez danych"
+
+#~ msgid "port"
+#~ msgstr "port"
+
+#~ msgid "socket"
+#~ msgstr "gniazdo"
+
+#~ msgid "whiteout"
+#~ msgstr "plik whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "dziwny plik"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "błędny argument source_version dla compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "błędny argument target_version dla compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "nie udało się utworzyć \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "błąd podczas zapisu pliku \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Nie znaleziono kompilatora Javy, proszę spróbować zainstalować gcj lub "
+#~ "ustawić $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Nie znaleziono maszyny wirtualnej Javy, proszę spróbować zainstalować gij "
+#~ "lub ustawić $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "błąd we/wy podprocesu %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "nie można wykonać stat na %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "nie można zmienić uprawnień do %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "nie można utworzyć katalogu %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Nie udało się otworzyć /dev/zero do odczytu"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "tworzenie wątku czytającego nie powiodło sie"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "nie można ustawić nieblokującego we/wy dla podprocesu %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "komunikacja z podprocesem %s nie powiodła się"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "zapis do podprocesu %s nie powiódł się"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "odczyt z podprocesu %s nie powiódł się"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "podproces %s zakończył się z kodem wyjścia %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "tworzenie wątków nie powiodło się"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "podproces %s zakończył się kodem wyjścia %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yYtT]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "ustawianie uprawnień %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Rozłączenie"
+
+#~ msgid "Interrupt"
+#~ msgstr "Przerwanie"
+
+#~ msgid "Quit"
+#~ msgstr "Wyjście"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Niedozwolona instrukcja"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Pułapka debuggera/breakpoint"
+
+#~ msgid "Aborted"
+#~ msgstr "Przerwano"
+
+#~ msgid "Floating point exception"
+#~ msgstr "BÅ‚Ä…d w obliczeniach zmiennoprzecinkowych"
+
+#~ msgid "Killed"
+#~ msgstr "Unicestwiono"
+
+#~ msgid "Bus error"
+#~ msgstr "BÅ‚Ä…d szyny"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Naruszenie ochrony pamięci"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Przerwany potok"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Budzik"
+
+#~ msgid "Terminated"
+#~ msgstr "Zakończono"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Nagły stan we/wy"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Zatrzymano (sygnał)"
+
+#~ msgid "Stopped"
+#~ msgstr "Zatrzymano"
+
+#~ msgid "Continued"
+#~ msgstr "Kontynuacja"
+
+#~ msgid "Child exited"
+#~ msgstr "Zakończenie procesu potomnego"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Zatrzymano (wejście z tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Zatrzymano (wyjście na tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Możliwa operacja we/wy"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Przekroczony limit czasu procesora"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Przekroczony limit rozmiaru pliku"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Upłynął czas stopera wirtualnego"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Upłynął czas stopera profilującego"
+
+#~ msgid "Window changed"
+#~ msgstr "Okno zmienione"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Sygnał użytkownika 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Sygnał użytkownika 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Pułapka EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Błędne wywołanie systemowe"
+
+#~ msgid "Stack fault"
+#~ msgstr "BÅ‚Ä…d stosu"
+
+#~ msgid "Information request"
+#~ msgstr "Żądanie informacji"
+
+#~ msgid "Power failure"
+#~ msgstr "Awaria zasilania"
+
+#~ msgid "Resource lost"
+#~ msgstr "Utrata zasobów"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "błąd zapisu do zamkniętego potoku lub gniazda"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Sygnał czasu rzeczywistego %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Nieznany sygnał %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Czasy wykonywania (w sekundach)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU użytkownika"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU systemu"
+
+#~ msgid "wall clock"
+#~ msgstr "zegarowo"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "nie można użyć funkcji iconv"
+
+#~ msgid "iconv function not available"
+#~ msgstr "funkcja iconv nie jest dostępna"
+
+#~ msgid "character out of range"
+#~ msgstr "znak spoza zakresu"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "nie można przekształcić U+%04X do lokalnego zestawu znaków: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "błędny użytkownik"
+
+#~ msgid "invalid group"
+#~ msgstr "błędna grupa"
+
+#~ msgid "invalid spec"
+#~ msgstr "błędna specyfikacja"
+
+#~ msgid "unable to display error message"
+#~ msgstr "nie można wyświetlić komunikatu błędu"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "PakietujÄ…cy: %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "PakietujÄ…cy: %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licencja GPLv3+: GNU GPL wersja 3 lub późniejsza:\n"
+#~ "<%s>.\n"
+#~ "To jest oprogramowanie wolnodostępne: można je modyfikować i "
+#~ "rozpowszechniać.\n"
+#~ "Nie ma ŻADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Autor: %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Autorzy: %s i %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Autorzy: %s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s\n"
+#~ "i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s, %s, %s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s i %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Autorzy: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s i inni.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Prosimy zgłaszać błędy na adres <%s>.\n"
+#~ "Błędy w tłumaczeniu prosimy zgłaszać na adres <translation-team-pl@lists."
+#~ "sourceforge.net>.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Błędy pakietującego (%s) prosimy zgłaszać na adres <%s>.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Strona domowa pakietu %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Ogólna pomoc przy używaniu oprogramowania GNU: <%s>.\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "nie udało się ustawić deskryptora pliku w tryb tekstowy/binarny"
+
+#~ msgid "stdin"
+#~ msgstr "standardowego wejścia"
+
+#~ msgid "stdout"
+#~ msgstr "standardowego wyjścia"
+
+#~ msgid "stderr"
+#~ msgstr "standardowego wyjścia diagnostycznego"
+
+#~ msgid "unknown stream"
+#~ msgstr "nieznanego strumienia"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "nie udało się ponownie otworzyć %s w trybie %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "nie udało się porównanie łańcuchów znaków"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Ustaw LC_ALL='C' żeby obejść problem"
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Porównywane łańcuchy znaków do %s i %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "nie można sformatować wyjścia"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "standardowe deskryptory plików"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "błędny argument opcji %s%s '%s'"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "błędny przyrostek argumentu opcji %s%s '%s'"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "argument opcji %s%s '%s' zbyt duży"
diff --git a/gnulib_po/pt.gmo b/gnulib_po/pt.gmo
new file mode 100644
index 0000000..9449020
--- /dev/null
+++ b/gnulib_po/pt.gmo
Binary files differ
diff --git a/gnulib_po/pt.po b/gnulib_po/pt.po
new file mode 100644
index 0000000..e397e31
--- /dev/null
+++ b/gnulib_po/pt.po
@@ -0,0 +1,968 @@
+# Portuguese (Portugal) Translation for the gnulib Package.
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Pedro Albuquerque <palbuquerque73@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-26 10:40+0100\n"
+"Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Gtranslator 2.91.7\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Erro de sistema desconhecido"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Família de endereço para nome de servidor não suportado"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Falha temporária na resolução de nome"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Valor errado para ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Falha irrecuperável na resolução de nome"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family não suportada"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Falha de alocação de memória"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Sem endereço associado ao nome de anfitrião"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nome ou serviço desconhecido"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Nome de servidor não suportado para ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype não suportado"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Erro de sistema"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Buffer de argumentos muito pequeno"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "A processar pedido em curso"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Pedido cancelado"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Pedido não cancelado"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Todos os pedidos feitos"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interrompido por um sinal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Cadeia de parâmetros incorrectamente codificada"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Erro desconhecido"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: a opção \"%s%s\" é ambígua\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: a opção \"%s%s\" é ambígua; possibilidades:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opção não reconhecida \"%s%s\"\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"%s%s\" não permite um argumento\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "\"%s: a opção \"%s%s\" requer um argumento\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opção inválida -- \"%c\"\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a opção requer um argumento -- \"%c\"\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "impossível gravar a pasta de trabalho actual"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "falha ao voltar à pasta de trabalho inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle falhou"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "impossível restaurar fd %d: dup2 falhou"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "\""
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "\""
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Sucesso"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Sem correspondência"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expressão regular inválida"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carácter de agrupamento inválido"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome de classe de carácter inválido"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida final"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Referência de recuo inválida"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., ou [= sem par"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sem par"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sem par"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Conteúdo de \\{\\} inválido"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fim de intervalo inválido"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memória esgotada"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expressão regular precedente inválida"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fim prematuro de expressão regular"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expressão regular muito grande"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sem par"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Sem expressão regular anterior"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "impossível criar túnel"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "sub-processo %s falhou"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "sub-processo %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "sub-processo %s obteve sinal fatal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memória esgotada"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argumento %s inválido para %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argumento %s ambíguo para %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Os argumentos válidos são:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: valor %s é menor ou igual que %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: o parâmetro ARGP_HELP_FMT requer um valor"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: parâmetro ARGP_HELP_FMT desconhecido"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Lixo em ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Argumentos obrigatórios ou opcionais para opções longas são igualmente "
+#~ "obrigatórios ou opcionais para opções curtas correspondentes."
+
+#~ msgid "Usage:"
+#~ msgstr "Uso:"
+
+#~ msgid " or: "
+#~ msgstr " ou: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPÇÃO...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Tente \"%s --help\" ou \"%s --usage\" para mais informação.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Reportar erros a %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "mostra esta lista de ajuda"
+
+#~ msgid "give a short usage message"
+#~ msgstr "mostrar mensagem curta de uso"
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "set the program name"
+#~ msgstr "define o nome do programa"
+
+#~ msgid "SECS"
+#~ msgstr "SEGS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "espera SEGS segundos (predefinição 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "mostra versão do programa"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ERRO DO PROGRAMA) Sem versão conhecida!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: demasiados argumentos\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ERRO DO PROGRAMA) A opção devia ter sido reconhecida!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u libertados (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histograma de diário total\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histograma de diário de tamanho\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histograma de densidade\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Estatísticas de bitset:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Execuções acumuladas = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "impossível ler ficheiro de estatísticas"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "mau tamanho de ficheiro de estatísticas\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "impossível escrever ficheiro de estatísticas"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "impossível abrir ficheiro de estatísticas para escrita"
+
+#~ msgid "program error"
+#~ msgstr "erro de programa"
+
+#~ msgid "stack overflow"
+#~ msgstr "transporte da pilha"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "impossível encontrar uma pasta temporária, tente definir $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "impossível criar uma pasta temporária usando o modelo \"%s\""
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "impossível remover o ficheiro temporário %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "impossível remover a pasta temporária %s"
+
+#~ msgid "error closing file"
+#~ msgstr "erro ao fechar o ficheiro"
+
+#~ msgid "write error"
+#~ msgstr "erro de escrita"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "preservar permissões para %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "erro ao abrir %s para leitura"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "impossível abrir a segurança %s para escrita"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "erro ao ler %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "erro ao escrever %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "erro após ler %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() falhou"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "Compilador C# não encontrado, tente instalar mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "Máquina virtual C# não encontrada, tente instalar mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "[ sem par"
+
+#~ msgid "invalid character class"
+#~ msgstr "classe de carácter inválida"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "a sintaxe da classe de carácter é [[:espaço:]], não [:espaço:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "escape \\ não terminado"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "Conteúdo de \\{\\} inválido"
+
+#~ msgid "regular expression too big"
+#~ msgstr "expressão regular muito grande"
+
+#~ msgid "unbalanced ("
+#~ msgstr "( sem par"
+
+#~ msgid "no syntax specified"
+#~ msgstr "sem sintaxe especificada"
+
+#~ msgid "unbalanced )"
+#~ msgstr ") sem par"
+
+#~ msgid "regular empty file"
+#~ msgstr "ficheiro normal vazio"
+
+#~ msgid "regular file"
+#~ msgstr "ficheiro normal"
+
+#~ msgid "directory"
+#~ msgstr "pasta"
+
+#~ msgid "symbolic link"
+#~ msgstr "ligação simbólica"
+
+#~ msgid "message queue"
+#~ msgstr "fila de mensagens"
+
+#~ msgid "semaphore"
+#~ msgstr "semáforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "objecto de memória partilhado"
+
+#~ msgid "typed memory object"
+#~ msgstr "objecto de memória tipificado"
+
+#~ msgid "block special file"
+#~ msgstr "ficheiro especial de blocos"
+
+#~ msgid "character special file"
+#~ msgstr "ficheiro especial de caracteres"
+
+#~ msgid "contiguous data"
+#~ msgstr "dados contíguos"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "porta"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "ficheiro especial de blocos multiplexado"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "ficheiro especial de caracteres multiplexado"
+
+#~ msgid "multiplexed file"
+#~ msgstr "ficheiro multiplexado"
+
+#~ msgid "named file"
+#~ msgstr "ficheiro com nome"
+
+#~ msgid "network special file"
+#~ msgstr "ficheiro especial de rede"
+
+#~ msgid "migrated file with data"
+#~ msgstr "ficheiro migrado com dados"
+
+#~ msgid "migrated file without data"
+#~ msgstr "ficheiro migrado sem dados"
+
+#~ msgid "port"
+#~ msgstr "porta"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "whiteout"
+#~ msgstr "whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "ficheiro estranho"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argumento source_version inválido para compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argumento target_version inválido para compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "falha ao criar \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "erro ao escrever o ficheiro \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "Compilador Java não encontrado, tente instalar gcj ou defina $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Máquina virtual Java não encontrada, tente instalar gij ou defina $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "erro E/S no sub-processo %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "impossível obter informação para %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "impossível alterar as permissões de %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "impossível criar a pasta %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Falha ao abrir /dev/zero para leitura"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "falha ao criar tópico de leitura"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "impossível configurar E/S não-bloqueadora para sub-pocesso %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "falha ao comunicar com o sub-processo %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "falha ao escrever no sub-processo %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "falha ao ler do sub-processo %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "sub-processo %s terminou com código de saída %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "falha ao criar tópicos"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "sub-processo %s terminou com código de saída %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[Ss]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "a definir permissões para %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Desligar"
+
+#~ msgid "Interrupt"
+#~ msgstr "Interromper"
+
+#~ msgid "Quit"
+#~ msgstr "Sair"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Instrução ilegal"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Armadilha de rastreio/ponto de quebra"
+
+#~ msgid "Aborted"
+#~ msgstr "Abortado"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Excepção de vírgula flutuante"
+
+#~ msgid "Killed"
+#~ msgstr "Morto"
+
+#~ msgid "Bus error"
+#~ msgstr "Erro de bus"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Falha de segmentação"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Túnel quebrado"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Alarme"
+
+#~ msgid "Terminated"
+#~ msgstr "Terminado"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Condição E/S urgente"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Parado (sinal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Parado"
+
+#~ msgid "Continued"
+#~ msgstr "Continuado"
+
+#~ msgid "Child exited"
+#~ msgstr "Filho saiu"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Parado (entrada tty)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Parado (saída tty)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Possível E/S"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Excedido limite de tempo da CPU"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Excedido limite de tamanho do ficheiro"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Temporizador virtual expirado"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Temporizador de perfil expirado"
+
+#~ msgid "Window changed"
+#~ msgstr "Janela alterada"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Sinal 1 definido pelo utilizador"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Sinal 2 definido pelo utilizador"
+
+#~ msgid "EMT trap"
+#~ msgstr "Armadilha EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Má chamada de sistema"
+
+#~ msgid "Stack fault"
+#~ msgstr "Falha de pilha"
+
+#~ msgid "Information request"
+#~ msgstr "Pedido de informação"
+
+#~ msgid "Power failure"
+#~ msgstr "Falha de energia"
+
+#~ msgid "Resource lost"
+#~ msgstr "Recurso perdido"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "Erro ao escrever num túnel ou socket fechado"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Sinal %d de tempo real"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Sinal %d desconhecido"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Tempos de execução (segundos)"
+
+#~ msgid "CPU user"
+#~ msgstr "utilizador de CPU"
+
+#~ msgid "CPU system"
+#~ msgstr "Sistema de CPU"
+
+#~ msgid "wall clock"
+#~ msgstr "relógio de parede"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "função iconv inutilizável"
+
+#~ msgid "iconv function not available"
+#~ msgstr "função iconv indisponível"
+
+#~ msgid "character out of range"
+#~ msgstr "carácter fora do intervalo"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "impossível converter U+%04X para conjunto de caracteres local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "impossível converter U+%04X para conjunto de caracteres local: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "utilizador inválido"
+
+#~ msgid "invalid group"
+#~ msgstr "grupo inválido"
+
+#~ msgid "invalid spec"
+#~ msgstr "especificação inválida"
+
+#~ msgid "unable to display error message"
+#~ msgstr "impossível mostrar mensagem de erro"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Empacotado por %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Empacotado por %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "(©)"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licença GPLv3+: GNU GPL versão 3 ou posterior <%s>\n"
+#~ "Este é um programa grátis: pode alterá-lo e redistribuí-lo.\n"
+#~ "Não há QUALQUER GARANTIA, até ao limite da Lei.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Escrito por %s\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Escrito por %s e %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Escrito por %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s e outros.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Reportar erros a: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Reportar erros %s a: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Página inicial %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Ajuda geral para utilizar programas GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "falha ao definir modo texto/binário do descritor de ficheiro"
+
+#~ msgid "stdin"
+#~ msgstr "stdin"
+
+#~ msgid "stdout"
+#~ msgstr "stdout"
+
+#~ msgid "stderr"
+#~ msgstr "stderr"
+
+#~ msgid "unknown stream"
+#~ msgstr "fluxo desconhecido"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "falha ao reabrir %s com modo %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "erro na comparação da cadeia"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Defina LC_ALL=\"C\" para contornar o problema."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "As cadeias comparadas foram %s e %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "impossível formatar o resultado de saída"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "descritores de ficheiro padrão"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "argumento %s%s \"%s\" inválido"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "sufixo inválido em %s%s, argumento \"%s\""
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "argumento %s%s \"%s\" muito grande"
diff --git a/gnulib_po/pt_BR.gmo b/gnulib_po/pt_BR.gmo
new file mode 100644
index 0000000..50ec203
--- /dev/null
+++ b/gnulib_po/pt_BR.gmo
Binary files differ
diff --git a/gnulib_po/pt_BR.po b/gnulib_po/pt_BR.po
new file mode 100644
index 0000000..be42193
--- /dev/null
+++ b/gnulib_po/pt_BR.po
@@ -0,0 +1,1117 @@
+# Brazilian Portuguese translations for gnulib package
+# Traduções em português brasileiro para o pacote gnulib
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Cyro Mendes De Moraes Neto <neto@conectiva.com.br>, 1998.
+# Rodrigo Stulzer Lopes <rodrigo@conectiva.com.br>, 2001.
+# Juan Carlos Castro y Castro <jcastro@vialink.com.br>, 2003.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2013, 2017, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-08-28 15:29-0300\n"
+"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
+"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
+"net>\n"
+"Language: pt_BR\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: Virtaal 1.0.0-beta1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Erro desconhecido de sistema"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Não há suporte para família de endereços para nome de máquina"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Falha temporária na resolução de nome"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Valor inválido para ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Falha irrecuperável na resolução de nome"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "Não há suporte a ai_family"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Falha na alocação de memória"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Nenhum endereço associado ao nome de máquina"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Nome ou serviço desconhecido"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Sem suporte ao nome de serviço pelo ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "Não há suporte a ai_socktype"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Erro de sistema"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Buffer de argumentos é pequeno demais"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Processamento de requisição em andamento"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Requisição cancelada"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Requisição não cancelada"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Todas as requisições foram atendidas"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Interrompido por um sinal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Texto do parâmetro codificado incorretamente"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Erro desconhecido"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: a opção \"%s%s\" é ambígua\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: a opção \"%s%s\" é ambígua; possibilidades:"
+
+# , c-format
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opção desconhecida \"%s%s\"\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"%s%s\" não permite um argumento\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: a opção \"%s%s\" exige um argumento\n"
+
+# , c-format
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opção inválida -- \"%c\"\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a opção exige um argumento -- \"%c\"\n"
+
+# , c-format
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "não foi possível registrar o diretório de trabalho atual"
+
+# , c-format
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "falha em retornar ao diretório de trabalho inicial"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle falhou"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "não foi possível restaurar descritor de arquivo %d: dup2 falhou"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "“"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Sucesso"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Nenhuma ocorrência do padrão"
+
+# , c-format
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expressão regular inválida"
+
+# , c-format
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Caractere de combinação inválido"
+
+# , c-format
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome inválido de classe de caracteres"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida no final"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Retrorreferência inválida"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., ou [= sem correspondente"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sem correspondente"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sem correspondente"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Conteúdo inválido de \\{\\}"
+
+# , c-format
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fim de intervalo inválido"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memória esgotada"
+
+# , c-format
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "A expressão regular precedente é inválida"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fim prematuro da expressão regular"
+
+# , c-format
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expressão regular grande demais"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sem correspondente"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Nenhuma expressão regular anterior"
+
+# , c-format
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "não foi possível criar redirecionamento"
+
+# , c-format
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "subprocesso %s falhou"
+
+# , c-format
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "subprocesso %s"
+
+# , c-format
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "o subprocesso %s recebeu sinal fatal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "memória esgotada"
+
+# , c-format
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "argumento inválido %s para %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "argumento ambíguo %s para %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Argumentos válidos são:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: O valor %s é menor do que ou igual a %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: O parâmetro ARGP_HELP_FMT exige um valor"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Parâmetro ARGP_HELP_FMT desconhecido"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Lixo em ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Argumentos obrigatórios ou opcionais para opções longas também o são para "
+#~ "quaisquer opções curtas correspondentes."
+
+#~ msgid "Usage:"
+#~ msgstr "Uso:"
+
+#~ msgid " or: "
+#~ msgstr " ou: "
+
+# , c-format
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPÇÃO...]"
+
+# , c-format
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Tente \"%s --help\" ou \"%s --usage\" para mais informação.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Relate erros para %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "fornece esta lista de ajuda"
+
+#~ msgid "give a short usage message"
+#~ msgstr "fornece uma mensagem de uso curta"
+
+#~ msgid "NAME"
+#~ msgstr "NOME"
+
+#~ msgid "set the program name"
+#~ msgstr "define o nome do programa"
+
+#~ msgid "SECS"
+#~ msgstr "SEGS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "segura por SEGS segundos (padrão 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "mostra a versão do programa"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ERRO NO PROGRAMA) Nenhuma versão conhecida!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Número excessivo de argumentos\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ERRO NO PROGRAMA) A opção deveria ter sido reconhecida!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u liberados (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u em cache (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "histograma de log de contagem\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "histograma de log de tamanho\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "histograma de densidade\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Estatística de bitset:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Execuções acumuladas = %u\n"
+
+# , c-format
+#~ msgid "cannot read stats file"
+#~ msgstr "não foi possível ler o arquivo de estado"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "tamanho inválido de arquivo de estado\n"
+
+# , c-format
+#~ msgid "cannot write stats file"
+#~ msgstr "não foi possível escrever o arquivo de estado"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "não foi possível abrir o arquivo de estado para escrita"
+
+#~ msgid "program error"
+#~ msgstr "erro do programa"
+
+#~ msgid "stack overflow"
+#~ msgstr "estouro de pilha"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "não foi possível localizar um diretório temporário, tente definir $TMPDIR"
+
+# , c-format
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr ""
+#~ "não foi possível criar um diretório temporário usando o modelo \"%s\""
+
+# , c-format
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "não foi possível remover o arquivo temporário %s"
+
+# , c-format
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "não foi possível remover o diretório temporário %s"
+
+#~ msgid "error closing file"
+#~ msgstr "erro ao fechar o arquivo"
+
+#~ msgid "write error"
+#~ msgstr "erro de escrita"
+
+# , c-format
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "preservando permissões de %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "erro ao abrir %s para leitura"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "não foi possível abrir o arquivo backup %s para escrita"
+
+# , c-format
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "erro ao ler %s"
+
+# , c-format
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "erro ao escrever %s"
+
+# , c-format
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "erro após leitura de %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() falhou"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "O compilador C# não foi localizado, tente instalar mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "A máquina virtual C# não foi localizada, tente instalar mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "[ não balanceado"
+
+# , c-format
+#~ msgid "invalid character class"
+#~ msgstr "classe de caracteres inválida"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "a sintaxe da classe de caracteres é [[:space:]], não [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "escape \\ não finalizado"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "conteúdo inválido de \\{\\}"
+
+# , c-format
+#~ msgid "regular expression too big"
+#~ msgstr "expressão regular grande demais"
+
+#~ msgid "unbalanced ("
+#~ msgstr "( não balanceado"
+
+#~ msgid "no syntax specified"
+#~ msgstr "nenhuma sintaxe especificada"
+
+#~ msgid "unbalanced )"
+#~ msgstr ") não balanceado"
+
+#~ msgid "regular empty file"
+#~ msgstr "arquivo comum vazio"
+
+#~ msgid "regular file"
+#~ msgstr "arquivo comum"
+
+#~ msgid "directory"
+#~ msgstr "diretório"
+
+#~ msgid "symbolic link"
+#~ msgstr "link simbólico"
+
+#~ msgid "message queue"
+#~ msgstr "fila de mensagem"
+
+#~ msgid "semaphore"
+#~ msgstr "semáforo"
+
+#~ msgid "shared memory object"
+#~ msgstr "objeto de memória compartilhada"
+
+#~ msgid "typed memory object"
+#~ msgstr "objeto de memória tipificada"
+
+#~ msgid "block special file"
+#~ msgstr "arquivo especial de bloco"
+
+#~ msgid "character special file"
+#~ msgstr "arquivo especial de caractere"
+
+#~ msgid "contiguous data"
+#~ msgstr "dados contíguos"
+
+# first-in, first-out; abreviação muito usada no meio computacional em português -- Rafael
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+# https://en.wikipedia.org/wiki/Unix_file_types#Door
+# Não traduzir para porta para evitar confusão com "port"
+#~ msgid "door"
+#~ msgstr "door"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "arquivo multiplexado especial de bloco"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "arquivo multiplexado especial de caractere"
+
+#~ msgid "multiplexed file"
+#~ msgstr "arquivo multiplexado"
+
+#~ msgid "named file"
+#~ msgstr "arquivo nomeado"
+
+#~ msgid "network special file"
+#~ msgstr "arquivo especial de rede"
+
+#~ msgid "migrated file with data"
+#~ msgstr "arquivo migrado com dados"
+
+#~ msgid "migrated file without data"
+#~ msgstr "arquivo migrado sem dados"
+
+#~ msgid "port"
+#~ msgstr "porta"
+
+#~ msgid "socket"
+#~ msgstr "soquete"
+
+#~ msgid "whiteout"
+#~ msgstr "whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "arquivo estranho"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "argumento source_version inválido para compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "argumento target_version inválido para compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "falha ao criar \"%s\""
+
+# , c-format
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "erro ao escrever o arquivo \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "O compilador de Java não foi localizado, tente instalar gcj ou definir "
+#~ "$JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "A máquina virtual de Java não foi localizada, tente instalar gij ou "
+#~ "definir $JAVA"
+
+# , c-format
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "erro de E/S no subprocesso %s"
+
+# , c-format
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "não foi possível obter estado de %s"
+
+# , c-format
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "não foi possível mudar permissões de %s"
+
+# , c-format
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "não foi possível criar o diretório %s"
+
+# , c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Falha ao abrir /dev/zero para leitura"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "a criação da thread de leitura falhou"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "não foi possível configurar E/S sem bloqueio para o subprocesso %s"
+
+# , c-format
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "a comunicação com o subprocesso %s falhou"
+
+# , c-format
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "escrita no subprocesso %s falhou"
+
+# , c-format
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "leitura do subprocesso %s falhou"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "o subprocesso %s terminou com o código de saída %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "a criação das threads falhou"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "subprocesso %s terminado com código de saída %d"
+
+# Valor exato de 'yesexpr', conforme mensagem do desenvolvedor -- Rafael
+#~ msgid "^[yY]"
+#~ msgstr "^[+1SsyY]"
+
+# Valor exato de 'noexpr', conforme mensagem do desenvolvedor -- Rafael
+#~ msgid "^[nN]"
+#~ msgstr "^[-0nN]"
+
+# , c-format
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "definindo permissões de %s"
+
+# Sinal SIGHUP
+#~ msgid "Hangup"
+#~ msgstr "Desconexão"
+
+# Sinal SIGINT
+#~ msgid "Interrupt"
+#~ msgstr "Interrupção"
+
+# Sinal SIGQUIT
+#~ msgid "Quit"
+#~ msgstr "Desistência"
+
+# Sinal SIGILL
+#~ msgid "Illegal instruction"
+#~ msgstr "Instrução ilegal"
+
+# AFAIK, o termo em inglês muito utilizado. Aceito sugestões -- Rafael
+# Sinal SIGTRAP
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Trap de trace/breakpoint"
+
+# Sinal SIGABRT
+#~ msgid "Aborted"
+#~ msgstr "Abortado"
+
+# Sinal SIGFPE
+#~ msgid "Floating point exception"
+#~ msgstr "Exceção de ponto flutuante"
+
+# Sinal SIGKILL
+#~ msgid "Killed"
+#~ msgstr "Morto"
+
+# Sinal SIGBUS
+#~ msgid "Bus error"
+#~ msgstr "Erro de barramento"
+
+# Sinal SIGSEGV
+#~ msgid "Segmentation fault"
+#~ msgstr "Falha de segmentação"
+
+# Sinal SIGPIPE
+#~ msgid "Broken pipe"
+#~ msgstr "Conexão interrompida"
+
+# Sinal SIGALRM
+#~ msgid "Alarm clock"
+#~ msgstr "Despertador"
+
+# Sinal SIGTERM
+#~ msgid "Terminated"
+#~ msgstr "Terminado"
+
+# Sinal SIGURG
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Condição urgente de E/S"
+
+# Sinal SIGSTP
+#~ msgid "Stopped (signal)"
+#~ msgstr "Suspenso (sinal)"
+
+# Sinal SIGTSTP
+#~ msgid "Stopped"
+#~ msgstr "Suspenso"
+
+# Sinal SIGCONT
+#~ msgid "Continued"
+#~ msgstr "Continuado"
+
+# Sinal SIGCHLD
+#~ msgid "Child exited"
+#~ msgstr "Processo filho saiu"
+
+# Sinal SIGTTIN
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Suspenso (entrada tty)"
+
+# Sinal SIGTTOU
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Suspenso (saída tty)"
+
+# Sinal SIGIO
+#~ msgid "I/O possible"
+#~ msgstr "E/S possível"
+
+# Sinal SIGXCPU
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Tempo na CPU excedido"
+
+# Sinal SIGXFSZ
+#~ msgid "File size limit exceeded"
+#~ msgstr "Tamanho de arquivo excedido"
+
+# Sinal SIGVTALRM
+#~ msgid "Virtual timer expired"
+#~ msgstr "Temporizador virtual expirou"
+
+# Sinal SIGPROF
+#~ msgid "Profiling timer expired"
+#~ msgstr "Temporizador de perfil expirou"
+
+#~ msgid "Window changed"
+#~ msgstr "Janela alterada"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Sinal 1 definido pelo usuário"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Sinal 2 definido pelo usuário"
+
+#~ msgid "EMT trap"
+#~ msgstr "Trap de EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Chamada de sistema inválida"
+
+#~ msgid "Stack fault"
+#~ msgstr "Falha na pilha"
+
+#~ msgid "Information request"
+#~ msgstr "Requisição de informação"
+
+#~ msgid "Power failure"
+#~ msgstr "Falha de energia"
+
+#~ msgid "Resource lost"
+#~ msgstr "Recurso perdido"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "erro de escrita para um redirecionamento (pipe) ou soquete fechado"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Sinal de tempo real %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Sinal desconhecido %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Tempos de execução (segundos)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU usuário"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU sistema"
+
+# Sinal SIGALRM
+#~ msgid "wall clock"
+#~ msgstr "relógio de parede"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "função iconv não utilizável"
+
+#~ msgid "iconv function not available"
+#~ msgstr "função iconv não disponível"
+
+# , c-format
+#~ msgid "character out of range"
+#~ msgstr "caractere fora do intervalo"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr ""
+#~ "não foi possível converter U+%04X para o conjunto de caracteres local"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr ""
+#~ "não foi possível converter U+%04X para o conjunto de caracteres local: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "usuário inválido"
+
+#~ msgid "invalid group"
+#~ msgstr "grupo inválido"
+
+#~ msgid "invalid spec"
+#~ msgstr "especificação inválida"
+
+#~ msgid "unable to display error message"
+#~ msgstr "não foi possível exibir a mensagem de erro"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Empacotado por %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Empacotado por %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licença GPLv3+: GNU GPL versão 3 ou posterior <%s>\n"
+#~ "Este é um software livre: você é livre para alterá-lo e redistribuí-lo.\n"
+#~ "NÃO Hà QUALQUER GARANTIA, na máxima extensão permitida em lei.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Escrito por %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Escrito por %s e %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Escrito por %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s e %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Escrito por %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s e outros.\n"
+
+# Adicionado endereço de email da equipe, conforme solicitação do desenvolvedor -- Rafael
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Relate erros para: %s\n"
+#~ "Relate erros de tradução para <https://translationproject.org/team/pt_BR."
+#~ "html>\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Relate erros do %s para: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Página do %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Ajuda para uso de softwares GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "falha ao definir modo texto/binário do descritor de arquivo"
+
+#~ msgid "stdin"
+#~ msgstr "entrada padrão (stdin)"
+
+#~ msgid "stdout"
+#~ msgstr "saída padrão (stdout)"
+
+#~ msgid "stderr"
+#~ msgstr "erro padrão (stderr)"
+
+#~ msgid "unknown stream"
+#~ msgstr "fluxo desconhecido"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "falha ao reabrir %s com modo %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "a comparação de textos falhou"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Defina LC_ALL='C' para contornar o problema."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Os textos comparados foram %s e %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "não foi possível fazer a saída formatada"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "descritores de arquivo padrão"
+
+# %s%s é hífen e opção, `%s' é o argumento da opção
+# , c-format
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "argumento inválido para %s%s: \"%s\""
+
+# %s%s é hífen e opção, `%s' é o argumento da opção
+# , c-format
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "sufixo inválido no argumento para %s%s \"%s\""
+
+# %s%s é hífen e opção, `%s' é o argumento da opção
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "argumento para %s%s \"%s\" é grande demais"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "Página do %s: <https://www.gnu.org/software/%s/>\n"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: O parâmetro ARGP_HELP_FMT deve ser positivo"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"--%s\" não permite um argumento\n"
+
+# , c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: opção desconhecida \"--%s\"\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" não permite um argumento\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" exige um argumento\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+# , c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opção inválida -- %c\n"
+
+#~ msgid "block size"
+#~ msgstr "tamanho do bloco"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s existe, mas não é um diretório"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "não pode substituir dono e/ou grupo de %s"
+
+# , c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "impossível mudar para diretório %s"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "nao foi possivel obter um grupo e login de um UID numerico "
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Este programa é um software livre, você pode redistribuí-lo e/ou modificá-"
+#~ "lo\n"
+#~ "sobre os termos da licença pública geral GNU (GPL - General Public "
+#~ "License)\n"
+#~ "publicada pela Free Software Foundation, versão 2 ou posteriores.\n"
+#~ "\n"
diff --git a/gnulib_po/quot.sed b/gnulib_po/quot.sed
new file mode 100644
index 0000000..0122c46
--- /dev/null
+++ b/gnulib_po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
diff --git a/gnulib_po/remove-potcdate.sin b/gnulib_po/remove-potcdate.sin
new file mode 100644
index 0000000..2436c49
--- /dev/null
+++ b/gnulib_po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gnulib_po/ro.gmo b/gnulib_po/ro.gmo
new file mode 100644
index 0000000..e5c7f62
--- /dev/null
+++ b/gnulib_po/ro.gmo
Binary files differ
diff --git a/gnulib_po/ro.po b/gnulib_po/ro.po
new file mode 100644
index 0000000..bf05296
--- /dev/null
+++ b/gnulib_po/ro.po
@@ -0,0 +1,453 @@
+# Mesajele în limba românã pentru pachetul mailutils.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Eugen Hoanca <eugenh@urban-grafx.ro>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: mailutils 0.4\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2003-12-10 08:55+0200\n"
+"Last-Translator: Eugen Hoanca <eugenh@urban-grafx.ro>\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-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: lib/error.c:195
+#, fuzzy
+msgid "Unknown system error"
+msgstr "tip de mesaj necunoscut"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:62
+#, fuzzy
+msgid "Memory allocation failure"
+msgstr "Operaþiune eºuatã"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "eroare regex"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Escape necunoscut %s"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: opþiunea `%s' este ambiguã\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: opþiunea `%s' este ambiguã\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: opþiune necunoscutã `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: opþiunea `%c%s' nu permite argumente\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: opþiunea `%s' necesitã un argument\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opþiune invalidã -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: opþiunea necesitã un argument -- %c\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr ""
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr ""
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Succes"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "Nu existã fiºier anterior"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr ""
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr ""
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+#, fuzzy
+msgid "Invalid back reference"
+msgstr "Numãr invalid"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "Tip de datã invalid"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memorie plinã"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "Nu existã fiºier anterior"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "Nu existã fiºier anterior"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "Nu existã fiºier anterior"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "Nu existã fiºier anterior"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "nu se poate crea mailerul \"%s\""
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr ""
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr ""
+
+#: lib/xalloc-die.c:34
+#, fuzzy
+msgid "memory exhausted"
+msgstr "Memorie plinã"
+
+#, fuzzy, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "nume etichetã(tag) invalid `%s' pentru `%s'"
+
+#, fuzzy, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "lipseºte argumentul pentru %s"
+
+#, fuzzy, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "argumentele if valide sunt: s | r | t"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: parametrul ARGP_HELP_FMT necesitã o valoare"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Parametru ARGP_HELP_FMT necunoscut"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Gunoi(garbage) în ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Argumentele obligatorii sau opþionale pentru opþiunile lungi sunt de "
+#~ "asemenea obligatorii sau opþionale pentru toate opþiunile scurte "
+#~ "corespunzãtoare."
+
+#~ msgid "Usage:"
+#~ msgstr "Folosire:"
+
+#~ msgid " or: "
+#~ msgstr " sau: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [OPÞIUNE...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Încercaþi `%s --help' sau `%s --usage' pentru mai multe informaþii.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Raportaþi bug-urile la %s.\n"
+
+#~ msgid "Give this help list"
+#~ msgstr "Afiºeazã aceastã listã de ajutor"
+
+#~ msgid "Give a short usage message"
+#~ msgstr "Afiºeazã un mesaj de folosire scurt"
+
+#~ msgid "NAME"
+#~ msgstr "NUME"
+
+#~ msgid "Set the program name"
+#~ msgstr "Seteazã numele programului"
+
+#, fuzzy
+#~ msgid "SECS"
+#~ msgstr "SECUNDE"
+
+#~ msgid "Hang for SECS seconds (default 3600)"
+#~ msgstr "Întrerupe(hang) pentru SECS secunde (implicit 3600)"
+
+#~ msgid "Print program version"
+#~ msgstr "Afiºeazã versiunea programului"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(EROARE DE PROGRAM) Nici o versiune cunoscutã!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Prea multe argumente\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(EROARE DE PROGRAM) Opþiunea ar fi trebuit recunoscutã!?"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "eroare de interval(range)"
+
+#, fuzzy
+#~ msgid "stack overflow"
+#~ msgstr "subrulare(underflow) a stivei(stack)"
+
+#, fuzzy
+#~ msgid "write error"
+#~ msgstr "eroare regex"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "nu se poate deschide fiºierul de ieºire(output) \"%s\": %s"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "eroare la cititrea din fiºierul de intrare(input): %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "eroare în scrierea în mailbox: %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "fork eºuat"
+
+#, fuzzy
+#~ msgid "message queue"
+#~ msgstr "%d mesaj"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opþiunea `--%s' nu permite argumente\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: opþiune necunoscutã `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opþiune ilegalã -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: opþiune `-W %s' este ambiguã\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: opþiune `-W %s' nu permite argumente\n"
+
+#, fuzzy, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "nu se poate trece în uid %lu: %m"
+
+#, fuzzy, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "nu se poate crea iterator: %s"
+
+#, fuzzy, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "nu se poate crea iterator: %s"
+
+#, fuzzy, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "Permisiuni greºite la %s. Setaþi 0600."
+
+#, fuzzy
+#~ msgid "invalid user"
+#~ msgstr "Numãr invalid"
+
+#, fuzzy
+#~ msgid "invalid group"
+#~ msgstr "Deschide grup"
+
+#, fuzzy
+#~ msgid "string comparison failed"
+#~ msgstr "Autentificare eºuatã"
diff --git a/gnulib_po/ru.gmo b/gnulib_po/ru.gmo
new file mode 100644
index 0000000..4f27a92
--- /dev/null
+++ b/gnulib_po/ru.gmo
Binary files differ
diff --git a/gnulib_po/ru.po b/gnulib_po/ru.po
new file mode 100644
index 0000000..cbf0db5
--- /dev/null
+++ b/gnulib_po/ru.po
@@ -0,0 +1,996 @@
+# translation of gnulib-2.0.0.3462.e9796.ru.po to Russian
+# Copyright (C) 2005, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# Sergey Poznyakoff <gray@gnu.org>, 2003,2004,2005.
+# Yuri Kozlov <yuray@komyakino.ru>, 2010, 2011, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-21 18:46+0300\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <gnu@d07.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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"
+"X-Generator: Lokalize 2.0\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "ÐдреÑное ÑемейÑтво не поддерживаетÑÑ Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ узла"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при определении имени"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Ðеверное значение Ð´Ð»Ñ ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "ÐевоÑÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при определении имени"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family не поддерживаетÑÑ"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Ошибка при выделении памÑти"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "С именем узла не ÑвÑзано ни одного адреÑа"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "ÐеизвеÑтное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ñлужба"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname не поддерживаетÑÑ Ð´Ð»Ñ ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype не поддерживаетÑÑ"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Слишком маленький буфер, указанный в аргументе"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "ВыполнÑетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° запроÑа"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‘Ð½"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ отменён"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Ð’Ñе запроÑÑ‹ выполнены"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Прервано по Ñигналу"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Строковый параметр неправильно закодирован"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: двуÑмыÑленный параметр «%s%s»\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: двуÑмыÑленный параметр «%s%s»; возможные варианты:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: нераÑпознанный параметр «%s%s»\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s%s» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать аргумент\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s%s» требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: неправильный параметр -- «%c»\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ -- «%c»\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не удалоÑÑŒ запомнить текущий рабочий каталог"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не удалоÑÑŒ вернутьÑÑ Ð² первоначальный рабочий каталог"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle завершилаÑÑŒ неудачно"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не удалоÑÑŒ воÑÑтановить fd %d: dup2 завершилаÑÑŒ неудачно"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "«"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "»"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "УÑпешно"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Ðет Ñовпадений"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ðеверное регулÑрное выражение"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ðеверный Ñимвол ÑравнениÑ"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ðеверное Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа Ñимволов"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÐºÐ¾ÑÐ°Ñ Ñ‡ÐµÑ€Ñ‚Ð°"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑÑылка"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ [, [^, [:, [. или [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ ( или \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "ÐедопуÑтимое Ñодержимое в \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ðеверный конец диапазона"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "ЗакончилаÑÑŒ памÑÑ‚ÑŒ"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "ÐедопуÑтимое предшеÑтвующее регулÑрное выражение"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Преждевременное завершение регулÑрного выражениÑ"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Слишком большое регулÑрное выражение"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ ) или \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "ОтÑутÑтвует предыдущее регулÑрное выражение"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "не удалоÑÑŒ Ñоздать канал"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "подпроцеÑÑ %s завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "подпроцеÑÑ %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "подпроцеÑÑ %s получил Ñигнал Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "закончилаÑÑŒ памÑÑ‚ÑŒ"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "неверный аргумент %s Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "неоднозначный аргумент %s Ð´Ð»Ñ %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Верные аргументы:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: значение %s меньше или равно %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: параметр ARGP_HELP_FMT требует значениÑ"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: неизвеÑтный параметр ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "МуÑор в ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "ОбÑзательные или необÑзательные аргументы к длинным именам параметров "
+#~ "оÑтаютÑÑ Ñ‚Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ и к ÑоответÑтвующим коротким параметрам."
+
+#~ msgid "Usage:"
+#~ msgstr "ИÑпользование:"
+
+#~ msgid " or: "
+#~ msgstr " или: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [ПÐРÐМЕТР...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Попробуйте «%s --help» или «%s --usage» Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подробного "
+#~ "опиÑаниÑ.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Об ошибках Ñообщай по адреÑу %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "показать Ñту Ñправку"
+
+#~ msgid "give a short usage message"
+#~ msgstr "показать короткую Ñправку по иÑпользованию"
+
+#~ msgid "NAME"
+#~ msgstr "ИМЯ"
+
+#~ msgid "set the program name"
+#~ msgstr "задать Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹"
+
+#~ msgid "SECS"
+#~ msgstr "СЕКУÐД"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "оÑтановитьÑÑ Ð½Ð° заданное чиÑло СЕКУÐД (по умолчанию 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "показать номер верÑии программы"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ОШИБКРПРОГРÐММЫ) ВерÑÐ¸Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтна!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Ñлишком много аргументов\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ОШИБКРПРОГРÐММЫ) Параметр должен был быть раÑпознан!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u оÑвобождено (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u кÑшировано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u кÑшировано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u кÑшировано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "количеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð»Ð¾Ð³Ð°Ñ€Ð¸Ñ„Ð¼Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð³Ð¸Ñтограмма\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "Ñ€Ð°Ð·Ð¼ÐµÑ€Ð½Ð°Ñ Ð»Ð¾Ð³Ð°Ñ€Ð¸Ñ„Ð¼Ð¸Ñ‡ÐµÑÐºÐ°Ñ Ð³Ð¸Ñтограмма\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "гиÑтограмма плотноÑти\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "СтатиÑтика bitset:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Ðакопленных запуÑков = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "невозможно прочитать файл stats"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "некорректный размер файла stats\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "невозможно запиÑать файл stats"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "невозможно открыть файл stats Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#~ msgid "program error"
+#~ msgstr "Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#~ msgid "stack overflow"
+#~ msgstr "переполнение Ñтека"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "не удалоÑÑŒ найти временный каталог, попробуйте задать $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "не удалоÑÑŒ Ñоздать временный каталог Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шаблона «%s»"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "не удалоÑÑŒ удалить временный файл %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "не удалоÑÑŒ удалить временный каталог %s"
+
+#~ msgid "error closing file"
+#~ msgstr "ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#~ msgid "write error"
+#~ msgstr "ошибка запиÑи"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "ÑохранÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð°Ð²Ð° доÑтупа Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "ошибка при открытии файла %s Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "не удалоÑÑŒ открыть файл резервной копии %s Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "ошибка запиÑи %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "ошибка поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "ошибка при выполнении fdopen()"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "Ðе найден компилÑтор C#, попробуйте уÑтановить mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "Ðе найдена Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð° C#, попробуйте уÑтановить mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "неÑбаланÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ["
+
+#~ msgid "invalid character class"
+#~ msgstr "неправильный клаÑÑ Ñимволов"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "ÑинтакÑÐ¸Ñ ÐºÐ»Ð°ÑÑа Ñимволов: [[:space:]], а не [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ \\ ÑÐºÑ€Ð°Ð½Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "неправильное Ñодержимое в \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "регулÑрное выражение Ñлишком большое"
+
+#~ msgid "unbalanced ("
+#~ msgstr "неÑбаланÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "не указан ÑинтакÑиÑ"
+
+#~ msgid "unbalanced )"
+#~ msgstr "неÑбаланÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ )"
+
+#~ msgid "regular empty file"
+#~ msgstr "пуÑтой обычный файл"
+
+#~ msgid "regular file"
+#~ msgstr "обычный файл"
+
+#~ msgid "directory"
+#~ msgstr "каталог"
+
+#~ msgid "symbolic link"
+#~ msgstr "ÑÐ¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка"
+
+#~ msgid "message queue"
+#~ msgstr "очередь Ñообщений"
+
+#~ msgid "semaphore"
+#~ msgstr "Ñемафор"
+
+#~ msgid "shared memory object"
+#~ msgstr "объект общей памÑти"
+
+#~ msgid "typed memory object"
+#~ msgstr "объект типизированной памÑти"
+
+#~ msgid "block special file"
+#~ msgstr "блочный Ñпециальный файл"
+
+#~ msgid "character special file"
+#~ msgstr "Ñимвольный Ñпециальный файл"
+
+#~ msgid "contiguous data"
+#~ msgstr "непрерывные данные"
+
+#~ msgid "fifo"
+#~ msgstr "файл-очередь"
+
+#~ msgid "door"
+#~ msgstr "дверь"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "мультиплекÑный блочный Ñпециальный файл"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "мультиплекÑный Ñимвольный Ñпециальный файл"
+
+#~ msgid "multiplexed file"
+#~ msgstr "мультиплекÑный файл"
+
+#~ msgid "named file"
+#~ msgstr "именованный файл"
+
+#~ msgid "network special file"
+#~ msgstr "Ñетевой Ñпециальный файл"
+
+#~ msgid "migrated file with data"
+#~ msgstr "переноÑной файл Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸"
+
+#~ msgid "migrated file without data"
+#~ msgstr "переноÑной файл без данных"
+
+#~ msgid "port"
+#~ msgstr "порт"
+
+#~ msgid "socket"
+#~ msgstr "Ñокет"
+
+#~ msgid "whiteout"
+#~ msgstr "замазка"
+
+#~ msgid "weird file"
+#~ msgstr "Ñтранный файл"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "неверный аргумент source_version Ð´Ð»Ñ compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "неверный аргумент target_version Ð´Ð»Ñ compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "не удалоÑÑŒ Ñоздать «%s»"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "ошибка запиÑи в файл «%s»"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Ðе найден компилÑтор Java, попробуйте уÑтановить gcj или задать $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Ðе найдена Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð° Java, попробуйте уÑтановить gcj или задать "
+#~ "$JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "ошибка вв/вывода подпроцеÑÑа %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "не удалоÑÑŒ выполнить stat Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "невозможно изменить права доÑтупа %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "невозможно Ñоздать каталог %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Ðе удалоÑÑŒ открыть /dev/zero на чтение"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "не удалоÑÑŒ Ñоздать нить Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "не удалоÑÑŒ наÑтроить неблокированный ввод-вывод в подпроцеÑÑе %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "не удалоÑÑŒ ÑвÑзатьÑÑ Ñ Ð¿Ð¾Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑÑом %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "не удалоÑÑŒ запиÑать в подпроцеÑÑ %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "не удалоÑÑŒ прочитать из подпроцеÑÑа %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "подпроцеÑÑ %s завершилÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ выхода %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "не удалоÑÑŒ Ñоздать нити"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "подпроцеÑÑ %s завершилÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ выхода %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[ДдYy]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[ÐнNn]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "задание прав доÑтупа Ð´Ð»Ñ %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Обрыв терминальной линии"
+
+#~ msgid "Interrupt"
+#~ msgstr "Прерывание"
+
+#~ msgid "Quit"
+#~ msgstr "Ðварийное прерывание"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¸Ð½ÑтрукциÑ"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Прерывание на контрольной точке"
+
+#~ msgid "Aborted"
+#~ msgstr "Прервано"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Ошибка операции Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой"
+
+#~ msgid "Killed"
+#~ msgstr "Уничтожение"
+
+#~ msgid "Bus error"
+#~ msgstr "Ошибка шины"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Ðарушение ÑегментированиÑ"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Обрыв канала"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Сигнал по таймеру"
+
+#~ msgid "Terminated"
+#~ msgstr "Завершение"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Ð¡Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð²Ð²Ð¾Ð´Ð°-вывода"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "ОÑтанов (Ñигнал)"
+
+#~ msgid "Stopped"
+#~ msgstr "ОÑтанов"
+
+#~ msgid "Continued"
+#~ msgstr "Возобновление"
+
+#~ msgid "Child exited"
+#~ msgstr "Потомок завершил работу"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "ОÑтанов (ввод Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð°Ð»Ð°)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "ОÑтанов (вывод Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð°Ð»Ð°)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Возможен ввод-вывод"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Превышен предел по процеÑÑорному времени"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Превышен предел размера файла"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Виртуальное Ð²Ñ€ÐµÐ¼Ñ Ð¸Ñтекло"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñтекло"
+
+#~ msgid "Window changed"
+#~ msgstr "Окно изменено"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "ОпределÑемый пользователем Ñигнал 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "ОпределÑемый пользователем Ñигнал 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Ловушка EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Ðеправильный ÑиÑтемный вызов"
+
+#~ msgid "Stack fault"
+#~ msgstr "Ошибка работы Ñо Ñтеком"
+
+#~ msgid "Information request"
+#~ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸"
+
+#~ msgid "Power failure"
+#~ msgstr "Отказ питаниÑ"
+
+#~ msgid "Resource lost"
+#~ msgstr "РеÑÑƒÑ€Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñн"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "ошибка запиÑи в закрытый канал или Ñокет"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Сигнал реального времени %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "ÐеизвеÑтный Ñигнал %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (Ñекунд)"
+
+#~ msgid "CPU user"
+#~ msgstr "пользовательÑкое Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° ЦП"
+
+#~ msgid "CPU system"
+#~ msgstr "ÑиÑтемное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° ЦП"
+
+#~ msgid "wall clock"
+#~ msgstr "наÑтенные чаÑÑ‹"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ iconv неприменима"
+
+#~ msgid "iconv function not available"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ iconv недоÑтупна"
+
+#~ msgid "character out of range"
+#~ msgstr "Ñимвол вне допуÑтимого диапазона"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "невозможно преобразовать U+%04X в локальную кодировку"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "невозможно преобразовать U+%04X в локальную кодировку: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "неверный пользователь"
+
+#~ msgid "invalid group"
+#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
+
+#~ msgid "invalid spec"
+#~ msgstr "неверный spec"
+
+#~ msgid "unable to display error message"
+#~ msgstr "невозможно показать Ñообщение об ошибке"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Упакован %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Упакован %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ GPLv3+: GNU GPL верÑии 3 или новее <%s>.\n"
+#~ "Это Ñвободное ПО: вы можете изменÑÑ‚ÑŒ и раÑпроÑтранÑÑ‚ÑŒ его.\n"
+#~ "Ðет ÐИКÐКИХ ГÐРÐÐТИЙ в пределах дейÑтвующего законодательÑтва.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Ðвтор программы: %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Ðвторы программы: %s и %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Ðвторы программы: %s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s, %s, %s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Ðвторы программы: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s и другие.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Об ошибках Ñообщайте по адреÑу: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Об ошибках в %s Ñообщайте по адреÑу: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Справка по работе Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°Ð¼Ð¸ GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr ""
+#~ "не удалоÑÑŒ изменить текÑтовый/двоичный режим у файлового деÑкриптора"
+
+#~ msgid "stdin"
+#~ msgstr "stdin"
+
+#~ msgid "stdout"
+#~ msgstr "stdout"
+
+#~ msgid "stderr"
+#~ msgstr "stderr"
+
+#~ msgid "unknown stream"
+#~ msgstr "неизвеÑтный поток"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "не удалоÑÑŒ повторно открыть %s в режиме %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "Ñравнение Ñтрок завершилоÑÑŒ неудачно"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Чтобы обойти Ñту проблему, уÑтановите LC_ALL='C'."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "СравнивалиÑÑŒ Ñтроки %s %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "невозможно выполнить форматированный вывод"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "Ñтандартные файловые деÑкрипторы"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "неверный аргумент %s%s в «%s»"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "недопуÑтимый ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð² аргументе %s%s Ð´Ð»Ñ Â«%s»"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "аргумент %s%s Ñлишком велик Ð´Ð»Ñ Â«%s»"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "ДомашнÑÑ Ñтраница %s: <https://www.gnu.org/software/%s/>\n"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: значение параметра ARGP_HELP_FMT должно быть положительным"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «--%s» аргумент не разрешён\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: нераÑпознанный параметр «--%s»\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: у параметра «-W %s» не может быть аргумента\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «-W %s» требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "ФренÑÐ¸Ñ ÐŸÐ¸Ð½Ð°Ñ€Ð´ (Franc,ois Pinard)"
diff --git a/gnulib_po/rw.gmo b/gnulib_po/rw.gmo
new file mode 100644
index 0000000..b7a1223
--- /dev/null
+++ b/gnulib_po/rw.gmo
Binary files differ
diff --git a/gnulib_po/rw.po b/gnulib_po/rw.po
new file mode 100644
index 0000000..93b1712
--- /dev/null
+++ b/gnulib_po/rw.po
@@ -0,0 +1,652 @@
+# Kinyarwanda translations for mailutils package.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the mailutils package.
+# Steve Murphy <murf@e-tools.com>, 2005.
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005.
+# Antoine Bigirimana <antoine@e-tools.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: mailutils 0.6\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2005-04-04 10:55-0700\n"
+"Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
+"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+"Language: rw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+#, fuzzy
+msgid "Unknown system error"
+msgstr "Sisitemu Ikosa"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "Idosiye OYA"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "Idosiye OYA"
+
+#: lib/gai_strerror.c:62
+#, fuzzy
+msgid "Memory allocation failure"
+msgstr "Byanze"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "Idosiye OYA"
+
+# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_CLASS_WRITE.text
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "Kwandika ikosa"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+#, fuzzy
+msgid "Request canceled"
+msgstr "Ikintu OYA Byabonetse"
+
+#: lib/gai_strerror.c:72
+#, fuzzy
+msgid "Request not canceled"
+msgstr "Ikintu OYA Byabonetse"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Sisitemu Ikosa"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s:Ihitamo ni"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s:Ihitamo ni"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s:Ihitamo Kwemerera"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s:Ihitamo"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s:Sibyo Ihitamo"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s:Ihitamo"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "Kuri Icyabitswe KIGEZWEHO bushyinguro"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "Byanze Kuri Garuka Kuri bushyinguro"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+# basctl/source\basicide\basidesh.src:RID_IMGBTN_REMOVEWATCH.text
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+#, fuzzy
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Ibyatunganye"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s:Sibyo Ibisanzwe imvugo"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "Sibyo Inyuguti ishuri"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "Sibyo Inyuguti ishuri"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+#, fuzzy
+msgid "Invalid back reference"
+msgstr "Umubare utari wo"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "Ipaji Urutonde"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "Ububiko"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s:Sibyo Ibisanzwe imvugo"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "Ikosa in Ibisanzwe imvugo Gushaka"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s:Sibyo Ibisanzwe imvugo"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "Ikosa in Ibisanzwe imvugo Gushaka"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "Kurema Ihuza"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s:Byanze"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s:Byanze"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s:Byanze"
+
+#: lib/xalloc-die.c:34
+#, fuzzy
+msgid "memory exhausted"
+msgstr "Ububiko"
+
+#, fuzzy, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "Sibyo kugirango"
+
+#, fuzzy, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "kugirango"
+
+#, fuzzy, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "ingingo"
+
+#, fuzzy, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr ""
+#~ "%.*Project- Id- Version: basctl\n"
+#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n"
+#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n"
+#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n"
+#~ "Content- Type: text/ plain; charset= UTF- 8\n"
+#~ "Content- Transfer- Encoding: 8bit\n"
+#~ "X- Generator: KBabel 1. 0\n"
+#~ "."
+
+#, fuzzy, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr ""
+#~ "%.*Project- Id- Version: basctl\n"
+#~ "POT- Creation- Date: 2003- 12- 07 17: 13+ 02\n"
+#~ "PO- Revision- Date: 2004- 11- 04 10: 13- 0700\n"
+#~ "Last- Translator: Language- Team:< en@ li. org> MIME- Version: 1. 0\n"
+#~ "Content- Type: text/ plain; charset= UTF- 8\n"
+#~ "Content- Transfer- Encoding: 8bit\n"
+#~ "X- Generator: KBabel 1. 0\n"
+#~ "."
+
+#, fuzzy, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "in"
+
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Cyangwa Bitari ngombwa ingingo Kuri Amahitamo Cyangwa Bitari ngombwa "
+#~ "kugirango Amahitamo"
+
+#~ msgid "Usage:"
+#~ msgstr "Ikoresha:"
+
+#, fuzzy
+#~ msgid " or: "
+#~ msgstr "Cyangwa"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Cyangwa kugirango Birenzeho Ibisobanuro"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Kuri"
+
+#, fuzzy
+#~ msgid "Give this help list"
+#~ msgstr "iyi Ifashayobora Urutonde"
+
+#, fuzzy
+#~ msgid "Give a short usage message"
+#~ msgstr "a Ikoresha: Ubutumwa"
+
+#, fuzzy
+#~ msgid "NAME"
+#~ msgstr "Izina"
+
+#, fuzzy
+#~ msgid "Set the program name"
+#~ msgstr "i Porogaramu Izina:"
+
+# offmgr/source\offapp\dialog\optgdlg.src:OFA_TP_MISC.FT_HELPAGENT_TIME_UNIT.text
+#, fuzzy
+#~ msgid "SECS"
+#~ msgstr "amasogonda"
+
+#, fuzzy
+#~ msgid "Hang for SECS seconds (default 3600)"
+#~ msgstr "kugirango amasogonda Mburabuzi"
+
+#, fuzzy
+#~ msgid "Print program version"
+#~ msgstr "Porogaramu Verisiyo"
+
+#, fuzzy
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(Verisiyo"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "ingingo"
+
+#, fuzzy
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(Verisiyo"
+
+# 4952
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "Ikosa ryo mu Isoma"
+
+# svtools/source\misc\errtxt.src:RID_ERRHDL.ERRCODE_CLASS_WRITE.text
+#, fuzzy
+#~ msgid "write error"
+#~ msgstr "Kwandika ikosa"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "Gufungura kugirango"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "Gufungura kugirango"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "Ikosa"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "Ikosa"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "Ikosa"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "Gufungura Byanze"
+
+#, fuzzy
+#~ msgid "regular empty file"
+#~ msgstr "Ibisanzwe ubusa IDOSIYE"
+
+#, fuzzy
+#~ msgid "regular file"
+#~ msgstr "Ibisanzwe IDOSIYE"
+
+# svtools/source\dialogs\filedlg2.src:STR_FILEDLG_DIR.text
+#, fuzzy
+#~ msgid "directory"
+#~ msgstr "Ububiko"
+
+#, fuzzy
+#~ msgid "block special file"
+#~ msgstr "Funga Bidasanzwe IDOSIYE"
+
+#, fuzzy
+#~ msgid "character special file"
+#~ msgstr "Inyuguti Bidasanzwe IDOSIYE"
+
+#, fuzzy
+#~ msgid "symbolic link"
+#~ msgstr "Ihuza"
+
+#, fuzzy
+#~ msgid "message queue"
+#~ msgstr "Ubutumwa Umurongo"
+
+#, fuzzy
+#~ msgid "shared memory object"
+#~ msgstr "Ububiko Igikoresho"
+
+#, fuzzy
+#~ msgid "typed memory object"
+#~ msgstr "Ububiko Igikoresho"
+
+#, fuzzy
+#~ msgid "weird file"
+#~ msgstr "IDOSIYE"
+
+#, fuzzy, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s:Ihitamo Kwemerera"
+
+#, fuzzy, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s:Ihitamo"
+
+#, fuzzy, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s:Ihitamo"
+
+#, fuzzy, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s:Ihitamo ni"
+
+#, fuzzy, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s:Ihitamo Kwemerera"
+
+#, fuzzy
+#~ msgid "block size"
+#~ msgstr "Funga Ingano"
+
+#, fuzzy, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%sni OYA a bushyinguro"
+
+#, fuzzy, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "Guhindura>> Na Cyangwa Itsinda Bya"
+
+#, fuzzy, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "Kurema bushyinguro"
+
+#, fuzzy, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "Kuri bushyinguro"
+
+#, fuzzy, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "Guhindura>> Uruhushya Bya"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "%s:Byanze Kuri Gufungura kugirango"
+
+#, fuzzy
+#~ msgid "iconv function not usable"
+#~ msgstr "Umumaro OYA"
+
+#, fuzzy
+#~ msgid "iconv function not available"
+#~ msgstr "Umumaro OYA Bihari"
+
+#, fuzzy
+#~ msgid "character out of range"
+#~ msgstr "Inyuguti Inyuma Bya Urutonde"
+
+#, fuzzy, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
+
+#, fuzzy, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "GUHINDURA U Kuri Inyuguti Gushyiraho"
+
+#, fuzzy
+#~ msgid "invalid user"
+#~ msgstr "Sibyo Ukoresha:"
+
+#, fuzzy
+#~ msgid "invalid group"
+#~ msgstr "Sibyo Itsinda"
+
+#, fuzzy
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "Kubona i Ifashayinjira Itsinda Bya a Bikurikije umubare"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Porogaramu ni Kigenga Na Cyangwa i Bya i Nka Verisiyo 2. Cyangwa ku "
+#~ "Ihitamo Verisiyo"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "ku"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "ku Na"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr "ku Na Ibindi"
+
+#, fuzzy
+#~ msgid "string comparison failed"
+#~ msgstr "Ikurikiranyanyuguti Byanze"
+
+#, fuzzy
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Kuri Akazi i"
+
+#, fuzzy, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Ikurikiranyanyuguti Na"
diff --git a/gnulib_po/sk.gmo b/gnulib_po/sk.gmo
new file mode 100644
index 0000000..36cd7aa
--- /dev/null
+++ b/gnulib_po/sk.gmo
Binary files differ
diff --git a/gnulib_po/sk.po b/gnulib_po/sk.po
new file mode 100644
index 0000000..484659b
--- /dev/null
+++ b/gnulib_po/sk.po
@@ -0,0 +1,530 @@
+# Slovak translations for GNU textutils
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Miroslav Vasko <vasko@debian.cz>, 1999
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: textutils 2.0.14\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2001-06-08 22:10 +02:00\n"
+"Last-Translator: Stanislav Meduna <stano@trillian.eunet.sk>\n"
+"Language-Team: Slovak <sk-i18n@rak.isternet.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Neznáma systémová chyba"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "tento systém nepodporuje rúry"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "tento systém nepodporuje rúry"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "tento systém nepodporuje rúry"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "chyba pri zápise"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Neznáma systémová chyba"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: voµba `%s' nie je jednoznaèná\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: voµba `%s' nie je jednoznaèná\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: neznámy prepínaè `%c%s'\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: prepínaè `%c%s' nepovoµuje argument\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: prepínaè `%s' vy¾aduje argument\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: chybný prepínaè -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: prepínaè vy¾aduje argument -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "nie je mo¾né vytvori» adresár %s"
+
+#: lib/openat-die.c:57
+#, fuzzy, c-format
+msgid "failed to return to initial working directory"
+msgstr "nie je mo¾né vytvori» adresár %s"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: chybný regulárny výraz: %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "chybná trieda znaku `%s'"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "chybná trieda znaku `%s'"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "%s: chybný regulárny výraz: %s"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "vyèerpaná pamä»"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: chybný regulárny výraz: %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "chyba pri vyhµadávaní pomocou regulárneho výrazu"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: chybný regulárny výraz: %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "chyba pri vyhµadávaní pomocou regulárneho výrazu"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "nie je mo¾né vytvori» adresár %s"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: chybný vzor"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: chybný vzor"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: chybný vzor"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "vyèerpaná pamä»"
+
+#, fuzzy, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "chybný argument %s pre `%s'"
+
+#, fuzzy, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "nejednoznaèný argument %s pre `%s'"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Platné argumenty sú:"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Pou¾itie: %s [PREPÍNAÈ] [SÚBOR]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Viac informácií získate príkazom `%s --help'.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " Chyby v programe oznamujte na adrese <bug-textutils@gnu.org> (iba\n"
+#~ "anglicky), pripomienky k prekladu zasielajte na adresu <sk@li.org> "
+#~ "(slovensky)."
+
+#, fuzzy
+#~ msgid "Print program version"
+#~ msgstr "chyba pri èítaní"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "príli¹ veµa argumentov"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "chyba pri èítaní"
+
+#~ msgid "write error"
+#~ msgstr "chyba pri zápise"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "nie je mo¾né otvori» %s pre èítanie"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "nie je mo¾né otvori» %s pre èítanie"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "chyba pri èítaní %s"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "chyba pri zápise %s"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "chyba pri èítaní %s"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "zlyhalo otvorenie"
+
+#, fuzzy
+#~ msgid "regular empty file"
+#~ msgstr "zlyhalo èítanie"
+
+#, fuzzy
+#~ msgid "regular file"
+#~ msgstr "zlyhalo èítanie"
+
+#, fuzzy
+#~ msgid "directory"
+#~ msgstr "Adresár: "
+
+#, fuzzy
+#~ msgid "block special file"
+#~ msgstr "veµkos» bloku"
+
+#, fuzzy
+#~ msgid "character special file"
+#~ msgstr "pozícia znaku je nula"
+
+#, fuzzy
+#~ msgid "symbolic link"
+#~ msgstr "ioctl na `%s' nie je mo¾né vykona»"
+
+#, fuzzy
+#~ msgid "weird file"
+#~ msgstr "zlyhalo èítanie"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: prepínaè `--%s' nepovoµuje argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: neznámy prepínaè `--%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: nepovolený prepínaè -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: prepínaè `-W %s' nie je jednoznaèný\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: prepínaè `-W %s' nepovoµuje argument\n"
+
+#~ msgid "block size"
+#~ msgstr "veµkos» bloku"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s existuje, ale nie je adresárom"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "nie je mo¾né zmeni» pou¾ívateµa a/alebo skupinu %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "nie je mo¾né vytvori» adresár %s"
+
+#, fuzzy, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "nie je mo¾né vojs» do adresára, %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "nie je mo¾né zmeni» práva %s"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "nie je mo¾né zmeni» práva %s"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yYaAáÁ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, fuzzy
+#~ msgid "iconv function not usable"
+#~ msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je pou¾iteµná"
+
+#, fuzzy
+#~ msgid "iconv function not available"
+#~ msgstr "nie je mo¾né vypísa» U+%04X: funkcia iconv nie je dostupná"
+
+#, fuzzy
+#~ msgid "character out of range"
+#~ msgstr "U+%04X: znak je mimo rozsah"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
+
+#, fuzzy, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "nie je mo¾né konvertova» U+%04X do lokálnej znakovej sady"
+
+#~ msgid "invalid user"
+#~ msgstr "neplatný pou¾ívateµ"
+
+#~ msgid "invalid group"
+#~ msgstr "neplatná skupina"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "nie je mo¾né urèi» skupinu èíselného UID"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " Tento program je voµné programové vybavenie; mô¾ete ho ¹íri» a "
+#~ "modifikova»\n"
+#~ "podµa podmienok V¹eobecnej verejnej licencie GNU, vydávanej Free "
+#~ "Software\n"
+#~ "Foundation; a to buï verzie 2 tejto licencie alebo (podµa vá¹ho "
+#~ "uvá¾enia),\n"
+#~ "ktorejkoµvek neskor¹ej verzie.\n"
+#~ "\n"
+#~ " Tento program je roz¹irovaný v nádeji, ¾e bude u¾itoèný, av¹ak BEZ "
+#~ "AKEJKO¥VEK\n"
+#~ "ZÁRUKY; neposkytujú sa ani odvodené záruky PREDAJNOSTI alebo VHODNOSTI "
+#~ "PRE\n"
+#~ "NEJAKÝ KONKRÉTNY ÚÈEL. Ïaµ¹ie podrobnosti nájdete vo V¹eobecnej verejnej\n"
+#~ "licencii GNU.\n"
+#~ "\n"
+#~ " Kópia V¹eobecnej verejnej licencie GNU mala by» dodaná spolu s týmto\n"
+#~ "programom; pokiaµ sa tak nestalo, napí¹te do Free Software Foundation, "
+#~ "Inc.,\n"
+#~ "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Napísal %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Napísal %s.\n"
+
+#, fuzzy, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Napísal %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr "Napísal %s.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr "Napísal %s.\n"
+
+#, fuzzy
+#~ msgid "string comparison failed"
+#~ msgstr "zlyhal stat"
+
+#, fuzzy, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "nie je mo¾né vytvori» odkaz %s"
diff --git a/gnulib_po/sl.gmo b/gnulib_po/sl.gmo
new file mode 100644
index 0000000..6f81e22
--- /dev/null
+++ b/gnulib_po/sl.gmo
Binary files differ
diff --git a/gnulib_po/sl.po b/gnulib_po/sl.po
new file mode 100644
index 0000000..4413c3f
--- /dev/null
+++ b/gnulib_po/sl.po
@@ -0,0 +1,937 @@
+# -*- mode: po; coding: utf-8; -*- Slovenian message catalog for GNUlib.
+# Copyright (C) 2005, 2007, 2009, 2012 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Primož Peterlin <primozz.peterlin@gmail.com>, 2005, 2007, 2009, 2012.
+# $Id: gnulib-3.0.0.6062.a6b16.sl.po,v 1.5 2012/05/20 11:08:36 peterlin Exp $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2012-05-20 13:08+0200\n"
+"Last-Translator: Primož Peterlin <primozz.peterlin@gmail.com>\n"
+"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Neznana sistemska napaka"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Družina naslovov za ime gostitelja ni podprta"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "RazreÅ¡evanje imena zaÄasno ni uspelo"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Slaba vrednost ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Nepopravljiv neuspeh pri razreševanju imena"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family ni podprt"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Dodelitev pomnilnika ni uspela"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Z imenom gostitelja ni povezan noben naslov"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Ime ali storitev ni poznana"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname ni podprt za ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype ni podprt"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Sistemska napaka"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Medpomnilnik za argumente premajhen"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Obdelava zahtevka v teku"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Zahtevek preklican"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Zahtevek ni preklican"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Vsi zahtevki obdelani"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Prekinjeno s signalom"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "ParametriÄni niz nepravilno kodiran"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Neznana napaka"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: izbira »-W %s« je dvoumna\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: izbira »%s« je dvoumna; možnosti:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: neprepoznana izbira »%c%s«\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: izbira »%c%s« ne dovoljuje argumenta\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: izbira »--%s« zahteva argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: neveljavna izbira -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: izbira zahteva argument -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "ni mogoÄe zabeležiti trenutnega delovnega imenika"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "vrnitev v zaÄetni delovni imenik ni uspela"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "klic _open_osfhandle ni uspel"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "ni mogoÄe obnoviti fd %d: klic dup2 ni uspel"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "»"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "«"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Uspešno"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Brez zadetkov"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Neveljaven regularni izraz"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Neveljaven razvrÅ¡Äevalni znak"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Neveljavno ime razreda znakov"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "ZakljuÄna obratna poÅ¡evnica"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Neveljaven povratni sklic"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Uklepaj [ ali [^ brez para"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Uklepaj ( ali \\( brez para"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Uklepaj \\{ brez para"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Neveljavna vsebina \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Neveljaven konec razpona"
+
+# ! INEXACT
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Pomnilnik izÄrpan"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Neveljaven predhodni regularni izraz"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "PredÄasen zakljuÄek regularnega izraza"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regularni izraz je preobsežen"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Zaklepaj ) ali \\) brez para"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Prejšnjega regularnega izraza ni"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "ni mogoÄe ustvariti cevovoda"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "podproces %s ni uspel"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "podproces %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "podproces %s je prejel terminalni signal %d"
+
+# ! INEXACT
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "zmanjkalo pomnilnika"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "neveljavni argument %s za %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "dvoumni argument %s za %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Veljavni argumenti so:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: vrednost %s je manjša ali enaka %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT parameter zahteva vrednost"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT parameter mora biti pozitiven"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Neznan parameter ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Smetje v ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Argumenti, navedeni kot obvezni ali neobvezni pri dolgi obliki izbire, so "
+#~ "obvezni ali neobvezni tudi pri vseh odgovarjajoÄih kratkih oblikah."
+
+#~ msgid "Usage:"
+#~ msgstr "Uporaba:"
+
+#~ msgid " or: "
+#~ msgstr " ali: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [IZBIRA...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Poskusite »%s --help« ali »%s --usage« za izÄrpnejÅ¡a navodila.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "PoroÄila o napakah: %s\n"
+
+#~ msgid "give this help list"
+#~ msgstr "poda ta seznam pomoÄi"
+
+#~ msgid "give a short usage message"
+#~ msgstr "poda kratka navodila"
+
+#~ msgid "NAME"
+#~ msgstr "IME"
+
+#~ msgid "set the program name"
+#~ msgstr "nastavi ime programa"
+
+#~ msgid "SECS"
+#~ msgstr "SEK"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "zastane za SEK sekund (privzeto 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "izpiÅ¡e razliÄico programa"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMSKA NAPAKA) RazliÄice ni moÄ ugotoviti?!"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: PreveÄ argumentov\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMSKA NAPAKA) Izbire bi morali prepoznati?!"
+
+#~ msgid "program error"
+#~ msgstr "napaka v programu"
+
+#~ msgid "stack overflow"
+#~ msgstr "prekoraÄitev sklada"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "zaÄasnega imenika ni moÄ najti, poskusite nastaviti $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "zaÄasnega imenika z uporabo Å¡ablone \"%s\" ni mogoÄe ustvariti"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "zaÄasne datoteke v %s ni mogoÄe odstraniti"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "zaÄasnega imenika %s ni mogoÄe odstraniti"
+
+#~ msgid "error closing file"
+#~ msgstr "napaka pri zapiranju datoteke"
+
+#~ msgid "write error"
+#~ msgstr "napaka pri pisanju"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "ohranjena dovoljenja za %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "napaka pri odpiranju datoteke \"%s\" za branje"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "varnostne kopije \"%s\" ni mogoÄe odpreti za pisanje"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "napaka pri branju \"%s\""
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "napaka pri pisanju na \"%s\""
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "napaka po branju \"%s\""
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "klic fdopen() ni uspel"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "prevajalnika za C# ni najti, namestite pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "virtualnega stroja C# ni najti, namestite pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "navadna prazna datoteka"
+
+#~ msgid "regular file"
+#~ msgstr "navadna datoteka"
+
+#~ msgid "directory"
+#~ msgstr "imenik"
+
+#~ msgid "block special file"
+#~ msgstr "bloÄna enota"
+
+#~ msgid "character special file"
+#~ msgstr "znakovna enota"
+
+#~ msgid "fifo"
+#~ msgstr "FIFO"
+
+# ! INEXACT
+#~ msgid "symbolic link"
+#~ msgstr "simbolna povezava"
+
+#~ msgid "socket"
+#~ msgstr "vtiÄnica"
+
+#~ msgid "message queue"
+#~ msgstr "vrsta sporoÄil"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "deljen pomnilniški predmet"
+
+#~ msgid "typed memory object"
+#~ msgstr "tipiziran pomnilniški predmet"
+
+#~ msgid "weird file"
+#~ msgstr "Äudna datoteka"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: izbira »--%s« ne dovoljuje argumenta\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: neprepoznana izbira »--%s«\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: izbira »-W %s« ne dovoljuje argumenta\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: izbira »-W %s« zahteva argument\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "neveljaven argument source_version za compile_java_class"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "neveljaven argument target_version za compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "ni mogoÄe ustvariti \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "napaka pri pisanju na datoteko \"%s\""
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "prevajalnika za Javo ni najti, nastavite $JAVAC ali namestite gcj"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "virtualnega stroja za Javo ni najti, nastavite $JAVA ali namestite gij"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "V/I napaka podprocesa %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "dovoljenj %s ni mogoÄe spremeniti"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "imenika %s ni mogoÄe ustvariti"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Datoteke /dev/null ni uspelo odpreti za branje"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "niti za pisanje ni bilo mogoÄe ustvariti"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "neblokiranega V/I za podproces %s ni mogoÄe nastaviti"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "komunikacija s podprocesom %s ni uspela"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "pisanje na podproces %s ni uspelo"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "branje s podprocesa %s ni uspelo"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "podproces %s se je zakljuÄil z izhodno kodo %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "ustvarjanje niti ni uspelo"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s podproces se je zakljuÄil z izhodno kodo %d"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "François Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[jJdD]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "nastavljena dovoljenja za %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Odklop"
+
+#~ msgid "Interrupt"
+#~ msgstr "Prekinitev"
+
+#~ msgid "Quit"
+#~ msgstr "KonÄanje"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Nedovoljen ukaz"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Past"
+
+#~ msgid "Aborted"
+#~ msgstr "Prekinjen"
+
+#~ msgid "Floating point exception"
+#~ msgstr "PrekoraÄitev plavajoÄe vejice"
+
+#~ msgid "Killed"
+#~ msgstr "Pobit"
+
+#~ msgid "Bus error"
+#~ msgstr "Napaka vodila"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Napaka segmentacije"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Prekinjen cevovod"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Budilka"
+
+#~ msgid "Terminated"
+#~ msgstr "ZakljuÄen"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Nujno V/I stanje"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Ustavljen (signal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Ustavljen"
+
+#~ msgid "Continued"
+#~ msgstr "Nadaljevan"
+
+#~ msgid "Child exited"
+#~ msgstr "Izhod nasledniškega procesa"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Ustavljen (vhod TTY)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Ustavljen (izhod TTY)"
+
+#~ msgid "I/O possible"
+#~ msgstr "MogoÄ V/I"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Presežena omejitev procesorskega Äasa"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Presežena omejitev dolžine datoteke"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Iztek virtualne Å¡toparice"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Iztek profilirne Å¡toparice"
+
+#~ msgid "Window changed"
+#~ msgstr "Zamenjano okno"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Uporabniški signal 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Uporabniški signal 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Past EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Slab sistemski klic"
+
+#~ msgid "Stack fault"
+#~ msgstr "Napaka sklada"
+
+#~ msgid "Information request"
+#~ msgstr "Informacijski zahtevek"
+
+#~ msgid "Power failure"
+#~ msgstr "Izpad toka"
+
+#~ msgid "Resource lost"
+#~ msgstr "Vir izgubljen"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "napaka pri pisanju na zaprt cevovod ali vtiÄ"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "RealnoÄasovni signal %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Neznani signal %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "funkcija iconv ne deluje"
+
+#~ msgid "iconv function not available"
+#~ msgstr "funkcija iconv ni na voljo"
+
+#~ msgid "character out of range"
+#~ msgstr "koda znaka izven obsega"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "znaka s kodo U+%04X ni mogoÄe pretvoriti v lokalni nabor znakov"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "znaka s kodo U+%04X ni moÄ pretvoriti v lokalni nabor znakov: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "neveljavno uporabniško ime"
+
+#~ msgid "invalid group"
+#~ msgstr "neveljavno ime skupine"
+
+#~ msgid "invalid spec"
+#~ msgstr "neveljavna specifikacija"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "sporoÄila o napaki ni mogoÄe prikazati"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Priprava paketa: %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Priprava paketa: %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GPLv3+: GNU GPL, 3. izdaja ali poznejša <http://www.gnu.org/licenses/gpl."
+#~ "html>\n"
+#~ "To je prosto programje; lahko ga redistribuirate in/ali spreminjate.\n"
+#~ "Za izdelek ni NOBENEGA JAMSTVA, do z zakonom dovoljene meje.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Avtor(ica): %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Avtorja: %s in %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Avtorji: %s, %s in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s\n"
+#~ "in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s, %s in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s, %s, %s in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s in %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Avtorji: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s in drugi.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "PoroÄila o napakah: %s\n"
+#~ "Napake v prevodu sporoÄite na <translation-team-sl@lists.sourceforge."
+#~ "net>.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr ""
+#~ "Napake v programu %s sporoÄite na: %s\n"
+#~ "Napake v prevodu sporoÄite na <translation-team-sl@lists.sourceforge."
+#~ "net>.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "DomaÄa stran %s: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Spletna stran %s: <http://www.gnu.org/software/%s/>.\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "SploÅ¡na pomoÄ za rabo programja GNU: <http://www.gnu.org/gethelp/>.\n"
+
+#~ msgid "stdin"
+#~ msgstr "standardni vhod"
+
+#~ msgid "stdout"
+#~ msgstr "standardni izhod"
+
+#~ msgid "stderr"
+#~ msgstr "standardna izhod za napake"
+
+#~ msgid "unknown stream"
+#~ msgstr "neznani tok"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "ponovno odpiranje %s v naÄinu %s ni uspelo"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "primerjanje nizov ni uspelo"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Nastavite LC_ALL='C', da bi odpravili težavo."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Primerjana niza sta bila %s in %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "oblikovanega izpisa ni mogoÄe izvesti"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "neveljavni %s%s argument »%s«"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "neveljavna pripona pri %s%s argumentu »%s«"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "%s%s: argument »%s« je prevelik"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: nedovoljena izbira -- %c\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <%s>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Napake v programu sporoÄite na %s.\n"
+#~ "Napake v prevodu sporoÄite na <translation-team-sl@lists.sourceforge."
+#~ "net>.\n"
+
+#~ msgid "block size"
+#~ msgstr "velikost bloka"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s obstaja, vendar ni imenik"
+
+# ! INEXACT
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "lastnika in/ali skupine %s ni mogoÄe spremeniti"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "dostop do imenika %s ni mogoÄ"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "imena skupine, ki pripada Å¡tevilÄnemu UID, ni mogoÄe ugotoviti"
+
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Ta program je prosta programska oprema; lahko ga redistribuirate in/ali\n"
+#~ "spreminjate po pogojih, doloÄenih v »GNU General Public License«, \n"
+#~ "<http://www.gnu.org/licenses/gpl.html>. Za izdelek ni NOBENEGA JAMSTVA, "
+#~ "do\n"
+#~ "z zakonom dovoljene meje.\n"
diff --git a/gnulib_po/sr.gmo b/gnulib_po/sr.gmo
new file mode 100644
index 0000000..9ec6691
--- /dev/null
+++ b/gnulib_po/sr.gmo
Binary files differ
diff --git a/gnulib_po/sr.po b/gnulib_po/sr.po
new file mode 100644
index 0000000..4772ae8
--- /dev/null
+++ b/gnulib_po/sr.po
@@ -0,0 +1,994 @@
+# Serbian translation of gnulib.
+# Copyright © 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>, 2013—2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib-4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-04-20 09:38+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"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ðепозната грешка ÑиÑтема"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Породица адреÑа за назив домаћина није подржана"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Привремени неуÑпех одређивања назива"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "ÐеиÑправна вредноÑÑ‚ за аи_опције"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Ðепоправљива грешка при одређивању назива"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "аи_породица није подржана"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "РаÑподела меморије није уÑпела"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Ðиједна адреÑа није придружена називу домаћина"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Ðије позната уÑлуга или назив"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Ðазив Ñервера није подржан за аи_врÑтуприкључка"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "аи_врÑтаприкључка није подржана"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "СиÑтемÑка грешка"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Међумеморија аргумента је премала"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Захтев обрађивања је у току"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Захтев је отказан"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Захтев није отказан"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Сви захтеви Ñу готови"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Прекинуто Ñигналом"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "ÐиÑка параметра није иÑправно кодирана"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Ðепозната грешка"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: опција „%s%s“ је нејаÑна\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: опција „%s%s“ је нејаÑна; могућноÑти:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: непозната опција „%s%s“\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: опција „%s%s“ не дозвољава аргумент\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: опција „%s%s“ захтева аргумент\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: неиÑправна опција -- „%c“\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: опција захтева аргумент -- „%c“\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не могу да Ñнимим тренутни радни директоријум"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не могу да Ñе вратим у почетни радни директоријум"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "„_open_osfhandle“ није уÑпело"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не могу да повратим фд %d: „dup2“ није уÑпело"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "„"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "“"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "УÑпешно"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Ðема подударања"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ðеправилан регуларан израз"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "ÐеиÑправан знак поретка"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "ÐеиÑправан назив клаÑе знака"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Пратећа контра коÑа црта"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "ÐеиÑправна повратна упута"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ðеупарено [, [^, [:, [., или [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ðеупарено ( или \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ðеупарено \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "ÐеиÑправан Ñадржај \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "ÐеиÑправан крај опÑега"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Меморија је потрошена"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "ÐеиÑправан регуларан израз који претходи"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Прерани крај регуларног израза"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Регуларни израз је превелик"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ðепоклопљено ) или \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Ðема претходног регуларног израза"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "не могу да направим Ñпојку"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð¸Ñ˜Ðµ уÑпео"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s потпроцеÑ"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ˜Ðµ добио кобни Ñигнал %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "меморија је потрошена"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "неиÑправан аргумент „%s“ за „%s“"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "нејаÑан аргумент „%s“ за „%s“"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "ИÑправни аргументи Ñу:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s вредноÑÑ‚ је мања од или једнака Ñа %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: „ARGP_HELP_FMT“ параметар захтева вредноÑÑ‚"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Ðепознат параметар „ARGP_HELP_FMT“"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Ђубре у „ARGP_HELP_FMT“-у: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Обавезни или опционални аргументи за дуге опције Ñу такође обавезни или "
+#~ "опционални за Ñве одговарајуће кратке опције."
+
+#~ msgid "Usage:"
+#~ msgstr "Употреба:"
+
+#~ msgid " or: "
+#~ msgstr " или: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [ОПЦИЈÐ...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Покушајте „%s --help“ или „%s --usage“ за више података.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Грешке пријавите на %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "приказује овај ÑпиÑак помоћи"
+
+#~ msgid "give a short usage message"
+#~ msgstr "приказује кратку поруку коришћења"
+
+#~ msgid "NAME"
+#~ msgstr "ÐÐЗИВ"
+
+#~ msgid "set the program name"
+#~ msgstr "поÑтавља назив програма"
+
+#~ msgid "SECS"
+#~ msgstr "СЕКУÐДЕ"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "Ñтаје за СЕКУÐДЕ Ñекунде (оÑновно је 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "иÑпиÑује издање програма"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ГРЕШКРПРОГРÐÐœÐ) Ðије познато издање!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Превише аргумената\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ГРЕШКРПРОГРÐÐœÐ) Опција треба да буде препозната!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u битÑет_доделе, %u оÑлобођених (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u битÑет_поÑтавки, %u кешираних (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u битÑет_повраћаја, %u кешираних (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u битÑет_теÑтова, %u кешираних (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u битÑет_ÑпиÑкова\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "број хиÑтограма дневника\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "величина хиÑтограма дневника\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "хиÑтограм гуÑтине\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "СтатиÑтике битÑета:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Ðагомиланих покретања = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "не могу да читам датотеку Ñтања"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "лоша величина датотеке Ñтања\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "не могу да пишем датотеку Ñтања"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "не могу да отворим датотеку Ñтања за упиÑ"
+
+#~ msgid "program error"
+#~ msgstr "грешка програма"
+
+#~ msgid "stack overflow"
+#~ msgstr "Ñтек је препуњен"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "не могу да пронађем привремени директоријум, покушавам да подеÑим "
+#~ "„$TMPDIR“"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "не могу да направим привремени директоријум кориÑтећи шаблон „%s“"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "не могу да уклоним привремену датотеку „%s“"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "не могу да уклоним привремени директоријум „%s“"
+
+#~ msgid "error closing file"
+#~ msgstr "грешка затварања датотеке"
+
+#~ msgid "write error"
+#~ msgstr "грешка запиÑивања"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "причувавам овлашћења за %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "грешка приликом отварања „%s“ за читање"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "не могу да отворим датотеку резерве „%s“ за упиÑ"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "грешка читања „%s“"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "грешка пиÑања „%s“"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "грешка након читања „%s“"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "није уÑпела функција „fdopen()“"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "ниÑам нашао Ц# преводиоца, покушајте да инÑталирате моно"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "ниÑам нашао Ц# виртуелну машину, покушајте да инÑталирате моно"
+
+#~ msgid "unbalanced ["
+#~ msgstr "неуравнотежена ["
+
+#~ msgid "invalid character class"
+#~ msgstr "неиÑправна клаÑа знака"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "ÑинтакÑа клаÑе знака је [[:space:]], а не [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "недовршена \\ излаза"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "неиÑправан Ñадржај \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "регуларни израз је превелик"
+
+#~ msgid "unbalanced ("
+#~ msgstr "неуравнотежена ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "није наведена ÑинтакÑа"
+
+#~ msgid "unbalanced )"
+#~ msgstr "неуравнотежена )"
+
+#~ msgid "regular empty file"
+#~ msgstr "обична празна датотека"
+
+#~ msgid "regular file"
+#~ msgstr "обична датотека"
+
+#~ msgid "directory"
+#~ msgstr "директоријум"
+
+#~ msgid "symbolic link"
+#~ msgstr "Ñимболичка веза"
+
+#~ msgid "message queue"
+#~ msgstr "ред порука"
+
+#~ msgid "semaphore"
+#~ msgstr "Ñемафор"
+
+#~ msgid "shared memory object"
+#~ msgstr "заједнички меморијÑки објекат"
+
+#~ msgid "typed memory object"
+#~ msgstr "типÑки меморијÑки објекат"
+
+#~ msgid "block special file"
+#~ msgstr "поÑебна датотека блока"
+
+#~ msgid "character special file"
+#~ msgstr "поÑебна датотека знака"
+
+#~ msgid "contiguous data"
+#~ msgstr "непрекидни подаци"
+
+#~ msgid "fifo"
+#~ msgstr "пупи"
+
+#~ msgid "door"
+#~ msgstr "врата"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "Ñпецијална датотека мултиплекÑираног блока"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "Ñпецијална датотека мултиплекÑираног знака"
+
+#~ msgid "multiplexed file"
+#~ msgstr "мултиплекÑирана датотека"
+
+#~ msgid "named file"
+#~ msgstr "именована датотека"
+
+#~ msgid "network special file"
+#~ msgstr "поÑебна датотека мреже"
+
+#~ msgid "migrated file with data"
+#~ msgstr "премештена датотека Ñа подацима"
+
+#~ msgid "migrated file without data"
+#~ msgstr "премештена датотека без података"
+
+#~ msgid "port"
+#~ msgstr "порт"
+
+#~ msgid "socket"
+#~ msgstr "прикључница"
+
+#~ msgid "whiteout"
+#~ msgstr "празнина"
+
+#~ msgid "weird file"
+#~ msgstr "чудна датотека"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "неиÑправан аргумент издања_извора за преведи_јава_разред"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "неиÑправан аргумент издања_мете за преведи_јава_разред"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "ниÑам уÑпео да направим „%s“"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "грешка приликом пиÑања датотеке „%s“"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "ÐиÑам нашао Јава преводиоца, покушајте да инÑталирате гцј или поÑтавите "
+#~ "„$JAVAC“"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "ÐиÑам нашао виртуелну машину Јаве, покушајте да инÑталирате гиј или да "
+#~ "поÑтавите „$JAVA“"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "У/И грешка %s потпроцеÑа"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "не могу да добавим податке за „%s“"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "не могу да променим овлашћења за „%s“"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "не могу да направим директоријум „%s“"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "ÐиÑам уÑпео да отворим „/dev/zero“ за читање"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "Ñтварање нити за читање није уÑпело"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "не могу да поÑтавим неблокирајући У/И на Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "комуницирање Ñа %s потпроцеÑом није уÑпело"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "пиÑање у %s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð¸Ñ˜Ðµ уÑпело"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "читање из %s потпроцеÑа није уÑпело"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ %s је окончан Ñа излазном шифром %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "Ñтварање нити није уÑпело"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ˜Ðµ окончан Ñа излазном шифром %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "подешавам овлашћења за %s"
+
+#~ msgid "Hangup"
+#~ msgstr "ОбуÑтави"
+
+#~ msgid "Interrupt"
+#~ msgstr "Прекини"
+
+#~ msgid "Quit"
+#~ msgstr "Изађи"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "ÐеиÑправна инÑтрукција"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Замка праћења/тачке прекида"
+
+#~ msgid "Aborted"
+#~ msgstr "Прекинуто"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Изузетак Ñа покретним зарезом"
+
+#~ msgid "Killed"
+#~ msgstr "Убијено"
+
+#~ msgid "Bus error"
+#~ msgstr "Грешка Ñабирнице"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Грешка Ñегментације"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Прекинута Ñпојка"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Будилник"
+
+#~ msgid "Terminated"
+#~ msgstr "Окончан"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Хитни У/И уÑлов"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "ЗауÑтављен (Ñигнал)"
+
+#~ msgid "Stopped"
+#~ msgstr "ЗауÑтављен"
+
+#~ msgid "Continued"
+#~ msgstr "ÐаÑтављен"
+
+#~ msgid "Child exited"
+#~ msgstr "ÐŸÐ¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ˜Ðµ напуштен"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "ЗауÑтављен (улаз конзоле)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "ЗауÑтављен (излаз конзоле)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O је могућ"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Прекорачено је временÑко ограничење процеÑора"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Прекорачено је ограничење величине датотеке"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Виртуелни одбројавач је иÑтекао"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Одбројавач профилиÑања је иÑтекао"
+
+#~ msgid "Window changed"
+#~ msgstr "Прозор је измењен"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "КориÑнички одређени Ñигнал 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "КориÑнички одређени Ñигнал 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "ЕМТ замка"
+
+#~ msgid "Bad system call"
+#~ msgstr "Лош ÑиÑтемÑки позив"
+
+#~ msgid "Stack fault"
+#~ msgstr "ÐеуÑпех Ñтека"
+
+#~ msgid "Information request"
+#~ msgstr "Захтев зе информацијама"
+
+#~ msgid "Power failure"
+#~ msgstr "ÐеуÑпех напајања"
+
+#~ msgid "Resource lost"
+#~ msgstr "Губитак изворишта"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "грешка пиÑања на затворену Ñпојку или прикључницу"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Сигнал у Ñтварном времену %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Ðепознати Ñигнал %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Времена извршења (Ñекунди)"
+
+#~ msgid "CPU user"
+#~ msgstr "ЦПЈ кориÑник"
+
+#~ msgid "CPU system"
+#~ msgstr "ЦПЈ ÑиÑтем"
+
+#~ msgid "wall clock"
+#~ msgstr "зидни Ñат"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "иконв функција није употребљива"
+
+#~ msgid "iconv function not available"
+#~ msgstr "иконв функција није доÑтупна"
+
+#~ msgid "character out of range"
+#~ msgstr "знак је ван опÑега"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "не могу да претворим U+%04X у меÑни Ñкуп знакова"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "не могу да претворим U+%04X у меÑни Ñкуп знакова: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "неиÑправан кориÑник"
+
+#~ msgid "invalid group"
+#~ msgstr "неиÑправна група"
+
+#~ msgid "invalid spec"
+#~ msgstr "неиÑправна одредница"
+
+#~ msgid "unable to display error message"
+#~ msgstr "не могу да прикажем поруку грешке"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Запаковао је %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Запаковао је %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Лиценца ОЈЛи3+: ГÐУ ОЈЛ издање 3 или новије <%s>.\n"
+#~ "Ово је Ñлободан Ñофтвер: Ñлободни Ñте да га мењате и раÑподељујете.\n"
+#~ "Ðе поÑтоји ÐИКÐКВРГÐРÐÐЦИЈÐ, у оквирима дозвољеним законом.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "ÐапиÑао је %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "ÐапиÑали Ñу %s и %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "ÐапиÑали Ñу %s, %s, и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, %s, и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, %s, %s, и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, и %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "ÐапиÑали Ñу %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, и други.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Грешке пријавите на: %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Грешке програма „%s“ пријавите на: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s матична Ñтраница: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Општа помоћ кориÑтећи ГÐУ Ñофтвер: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "ниÑам уÑпео да подеÑим текÑтуални/бинарни режим опиÑника датотеке"
+
+#~ msgid "stdin"
+#~ msgstr "Ñтдулаз"
+
+#~ msgid "stdout"
+#~ msgstr "Ñтдизлаз"
+
+#~ msgid "stderr"
+#~ msgstr "Ñтдгрешка"
+
+#~ msgid "unknown stream"
+#~ msgstr "непознат ток"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "ниÑам уÑпео да поново отворим „%s“ Ñа режимом %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "није уÑпело поређење ниÑке"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "ПоÑтавите LC_ALL='C' да решите проблем."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Поређене ниÑке Ñу „%s“ и „%s“."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "не могу да извршим обликовани излаз"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "Ñтандардни опиÑници датотеке"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "неиÑправан %s%s аргумент „%s“"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "неиÑправан ÑÑƒÑ„Ð¸ÐºÑ Ñƒ %s%s аргумент „%s“"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s аргумент „%s“ је превелик"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: „ARGP_HELP_FMT“ параметар мора бити позитиван"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: непозната опција „--%s“\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: опција „-W %s“ захтева аргумент\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "ФранÑуа Пинард"
+
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s матична Ñтраница: <http://www.gnu.org/software/%s/>\n"
diff --git a/gnulib_po/stamp-po b/gnulib_po/stamp-po
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/gnulib_po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/gnulib_po/sv.gmo b/gnulib_po/sv.gmo
new file mode 100644
index 0000000..b14e491
--- /dev/null
+++ b/gnulib_po/sv.gmo
Binary files differ
diff --git a/gnulib_po/sv.po b/gnulib_po/sv.po
new file mode 100644
index 0000000..b2e07c0
--- /dev/null
+++ b/gnulib_po/sv.po
@@ -0,0 +1,981 @@
+# Swedish messages for gnulib.
+# Copyright © 1997, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019, 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Peter Antman <peter.antman@abc.se>, 1997.
+# Thomas Olsson <cid95tho@lustudat.student.lu.se>, 1997.
+# Daniel Resare <daniel@resare.com>, 1999, 2000.
+# Göran Uddeborg <goeran@uddeborg.se>, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009, 2010, 2011, 2019, 2020.
+#
+# $Revision: 1.19 $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-05-28 21:40+0200\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
+"Language-Team: Swedish <tp-sv-list@lists.sourceforge.net>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Okänt systemfel"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Adressfamiljen för värdnamnet stöds inte"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Tillfälligt fel i namnuppslagning"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Felaktigt värde för ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Oreparabelt fel i namnuppslagning"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family stöds inte"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Minnesallokeringsfel"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Ingen adress associerad med värdnamnet"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Namn eller tjänst inte känd"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Servname stöds inte för ai_socktype"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype stöds inte"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Systemfel"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Argumentbufferten för liten"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Bearbetar pågående begäran"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Begäran annullerad"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Begäran inte annullerad"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Alla begäran utförda"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "Avbruten av en signal"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Parametersträng inte korrekt kodad"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Okänt fel"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: flaggan â€%s%s†är tvetydig\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: flaggan â€%s%s†är tvetydig: möjligheter:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: okänd flagga â€%s%sâ€\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: flaggan â€%s%s†tar inget argument\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: flaggan â€%s%s†kräver ett argument\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ogiltig flagga -- â€%câ€\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: flaggan kräver ett argument -- â€%câ€\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "kan inte notera aktuell arbetskatalog"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "kunde inte återvända till den ursprungliga arbetskatalogen"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle misslyckades"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "kan inte återställa fb %d: dup2 misslyckades"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "â€"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Lyckades"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Ingen träff"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Felaktigt reguljärt uttryck"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ogiltigt sorteringstecken"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ogiltigt teckenklassnamn"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Avslutande bakstreck"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ogiltig bakåtreferens"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ensam [, [^, [:, [. eller [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ensam ( eller \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ensam \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ogiltigt innehåll i \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ogiltigt intervallslut"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Minnet slut"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Felaktigt föregående reguljärt uttryck"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Förtida slut av reguljärt uttryck"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "För stort reguljärt uttryck"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ensam ) eller \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Inget föregående reguljärt uttryck"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "kan inte skapa rör"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s-underprocess misslyckades"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s-underprocess"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s-underprocess fick ödesdiger signal %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "minnet slut"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "felaktigt argument %s till %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "tvetydigt argument %s till %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Giltiga argument är:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: värdet på %s är mindre än eller lika med %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT-parametern kräver ett värde"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Okänd ARGP_HELP_FMT-parameter"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Skräp i ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Obligatoriska eller valfria argument till långa flaggor är obligatoriska "
+#~ "eller valfria även för motsvarande korta flaggor."
+
+#~ msgid "Usage:"
+#~ msgstr "Användning:"
+
+#~ msgid " or: "
+#~ msgstr " eller: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [FLAGGA...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "Försök med â€%s --help†eller â€%s --usage†för mer information.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "Rapportera fel till %s.\n"
+#~ "Skicka synpunkter på översättningen till <tp-sv-list@lists.sourceforge."
+#~ "net>.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "ge denna hjälplista"
+
+#~ msgid "give a short usage message"
+#~ msgstr "ge ett kort användningsmeddelande"
+
+#~ msgid "NAME"
+#~ msgstr "NAMN"
+
+#~ msgid "set the program name"
+#~ msgstr "ange programnamnet"
+
+#~ msgid "SECS"
+#~ msgstr "S"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "häng i S sekunder (3600 som standard)"
+
+#~ msgid "print program version"
+#~ msgstr "skriv ut programversion"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(PROGRAMFEL) Ingen version känd!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: För många argument\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(PROGRAMFEL) Flaggan borde ha känts igen!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset-allokeringar, %u frigjorda (%.2f %%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset-mängder, %u cachade (%.2f %%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset-återställningar, %u cachade (%.2f %%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset-tester, %u cachade (%.2f %%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset-listor\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "antalsloggshistogram\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "storleksloggshistogram\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "densitetshistogram\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bitset-statistik:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Ackumulerade körningar = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "kan inte läsa statistikfilen"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "felaktig storlek på statistikfil\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "kan inte skriva statistikfilen"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "kan inte öppna statistikfilen för skrivning"
+
+#~ msgid "program error"
+#~ msgstr "programfel"
+
+#~ msgid "stack overflow"
+#~ msgstr "stackspill"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "kan inte hitta en temporärkatalog, försök sätta $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "kan inte skapa en temporärkatalog med användning av mallen â€%sâ€"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "kan inte ta bort temporärfil %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "kan inte ta bort temporärkatalog %s"
+
+#~ msgid "error closing file"
+#~ msgstr "fel när fil stängdes"
+
+#~ msgid "write error"
+#~ msgstr "skrivfel"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "bevarar rättigheter på %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "fel när %s öppnades för läsning"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "det går inte att öppna säkerhetskopiefilen %s för skrivning"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "fel vid läsning av %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "fel vid skrivning av %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "fel efter läsning av %s"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() misslyckades"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "C#-kompilator hittades inte, försök installera mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "den virtuella C#-maskinen hittades inte, försök installera mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "obalanserad ["
+
+#~ msgid "invalid character class"
+#~ msgstr "ogiltig teckenklass"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "teckenklassyntaxen är [[:space:]], inte [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "oavslutad \\-sekvens"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "ogiltigt innehåll i \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "för stort reguljärt uttryck"
+
+#~ msgid "unbalanced ("
+#~ msgstr "obalanserad ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "ingen syntax angiven"
+
+#~ msgid "unbalanced )"
+#~ msgstr "obalanserad )"
+
+#~ msgid "regular empty file"
+#~ msgstr "tom normal fil"
+
+#~ msgid "regular file"
+#~ msgstr "normal fil"
+
+#~ msgid "directory"
+#~ msgstr "katalog"
+
+#~ msgid "symbolic link"
+#~ msgstr "symbolisk länk"
+
+#~ msgid "message queue"
+#~ msgstr "meddelandekö"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#~ msgid "shared memory object"
+#~ msgstr "objekt av delat minne"
+
+#~ msgid "typed memory object"
+#~ msgstr "objekt av typat minne"
+
+#~ msgid "block special file"
+#~ msgstr "blockspecialfil"
+
+#~ msgid "character special file"
+#~ msgstr "teckenspecialfil"
+
+#~ msgid "contiguous data"
+#~ msgstr "sammanhängande data"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "dörr"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "multiplexad blockspecialfil"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "multiplexad teckenspecialfil"
+
+#~ msgid "multiplexed file"
+#~ msgstr "multiplexad fil"
+
+#~ msgid "named file"
+#~ msgstr "namngiven fil"
+
+#~ msgid "network special file"
+#~ msgstr "nätverksspecialfil"
+
+#~ msgid "migrated file with data"
+#~ msgstr "migrerad fil med data"
+
+#~ msgid "migrated file without data"
+#~ msgstr "migrerad fil utan data"
+
+#~ msgid "port"
+#~ msgstr "port"
+
+#~ msgid "socket"
+#~ msgstr "uttag (socket)"
+
+#~ msgid "whiteout"
+#~ msgstr "övertäckningsfil"
+
+#~ msgid "weird file"
+#~ msgstr "konstig fil"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "ogiltigt source_version-argument till compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "ogiltigt target_version-argument till compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "det gick inte att skapa â€%sâ€"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "fel vid skrivning av filen â€%sâ€"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Javakompilator hittades inte, försök installera gcj eller sätta $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Virtuell Javamaskin hittades inte, försök installera gij eller sätta $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s-underprocess I/O-fel"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "kan inte ta status på %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "kan inte ändra rättigheter på %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "kan inte skapa katalogen %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Misslyckades att öppna /dev/zero för läsning"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "att skapa lästråd misslyckades"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr ""
+#~ "det gick inte att sätta upp icke blockerande I/O till %s-underprocess"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "kommunikation med %s-underprocess misslyckades"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "skrivning till %s-underprocess misslyckades"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "läsning från %s-underprocess misslyckades"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "underprocess %s avslutad med slutstatus %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "att skapa trådar misslyckades"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "%s-underprocess avslutad med slutstatus %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yYjJ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "ändrar rättigheter på %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Avringd"
+
+#~ msgid "Interrupt"
+#~ msgstr "Avbruten"
+
+#~ msgid "Quit"
+#~ msgstr "Lämnad"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Otillåten instruktion"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Spårnings-/brytpunktsfälla"
+
+#~ msgid "Aborted"
+#~ msgstr "Avbruten (abort)"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Flyttalsundantag"
+
+#~ msgid "Killed"
+#~ msgstr "Dödad"
+
+#~ msgid "Bus error"
+#~ msgstr "Bussfel"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Segmenteringsfel"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Brutet rör"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Alarmklocka"
+
+#~ msgid "Terminated"
+#~ msgstr "Avslutad"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Brådskande I/O-situation"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Stoppad (signal)"
+
+#~ msgid "Stopped"
+#~ msgstr "Stoppad"
+
+#~ msgid "Continued"
+#~ msgstr "Ã…terupptagen"
+
+#~ msgid "Child exited"
+#~ msgstr "Barn avslutade"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Stoppad (terminalläsning)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Stoppad (terminalskrivning)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O möjligt"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Begränsning av CPU-tid överskriden"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Begränsning av filstorlek överskriden"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Alarmklocka - virtuell tid gick ut"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Profileringsklocka gick ut"
+
+#~ msgid "Window changed"
+#~ msgstr "Ändrat fönster"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Användarsignal 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Användarsignal 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Emulatorfälla"
+
+#~ msgid "Bad system call"
+#~ msgstr "Felaktigt systemanrop"
+
+#~ msgid "Stack fault"
+#~ msgstr "Stackfel"
+
+#~ msgid "Information request"
+#~ msgstr "Informationsbegäran"
+
+#~ msgid "Power failure"
+#~ msgstr "Strömavbrott"
+
+#~ msgid "Resource lost"
+#~ msgstr "Förlorad resurs"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "fel vid skrivning till ett stängt rör eller uttag"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Realtidssignal %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Okänd signal %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Körtider (sekunder)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU användare"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU system"
+
+#~ msgid "wall clock"
+#~ msgstr "väggklocka"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv-funktion inte användbar"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv-funktion inte tillgänglig"
+
+#~ msgid "character out of range"
+#~ msgstr "tecken utanför intervall"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "kan inte konvertera U+%04X till lokal teckenuppsättning: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ogiltig användare"
+
+#~ msgid "invalid group"
+#~ msgstr "ogiltig grupp"
+
+#~ msgid "invalid spec"
+#~ msgstr "ogiltig specifikation"
+
+#~ msgid "unable to display error message"
+#~ msgstr "kan inte visa felmeddelande"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Paketerat av %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Paketerat av %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Licens GPLv3+: GNU GPL version 3 eller senare <%s>.\n"
+#~ "Detta är fri programvara: du får lov att ändra och vidaredistribuera "
+#~ "den.\n"
+#~ "Det finns INGEN GARANTI, så långt lagen tillåter.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Skrivet av %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Skrivet av %s och %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Skrivet av %s, %s och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s\n"
+#~ "och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s\n"
+#~ "och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s och %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Skrivet av %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s med flera.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "Rapportera fel till: %s\n"
+#~ "Skicka synpunkter på översättningen till: tp-sv-list@lists.sourceforg."
+#~ "net\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Rapportera %s-fel till: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Webbsida för %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "Allmän hjälp med att använda GNU-program: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "misslyckades att sätta filbeskrivaren i text-/binärt läge"
+
+#~ msgid "stdin"
+#~ msgstr "standard in"
+
+#~ msgid "stdout"
+#~ msgstr "standard ut"
+
+#~ msgid "stderr"
+#~ msgstr "standard fel"
+
+#~ msgid "unknown stream"
+#~ msgstr "okänd ström"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "det gick inte att öppna om %s i läget %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "strängjämförelse misslyckades"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Sätt LC_ALL='C' för att gå runt problemet."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "De jämförda strängarna var %s och %s."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "kan inte utföra formaterad utmatning"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "standard filbeskrivare"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "felaktigt %s%s-argument â€%sâ€"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "felaktigt suffix i %s%s-argument â€%sâ€"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s-argumentet â€%s†är för stort"
diff --git a/gnulib_po/tr.gmo b/gnulib_po/tr.gmo
new file mode 100644
index 0000000..de1a820
--- /dev/null
+++ b/gnulib_po/tr.gmo
Binary files differ
diff --git a/gnulib_po/tr.po b/gnulib_po/tr.po
new file mode 100644
index 0000000..7a095af
--- /dev/null
+++ b/gnulib_po/tr.po
@@ -0,0 +1,602 @@
+# translation of coreutils-5.3.0.tr.po to Turkish
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+# Ali Devin Sezer <Ali_Sezer@brown.edu>, 2002.
+# Nilgün Belma Bugüner <nilgun@superonline.com>, 2001, 2002.
+# Onur Tolga ÅžEHÄ°TOÄžLU <onur@lcsl.metu.edu.tr>, 1998.
+# Deniz Akkus Kanca <deniz@arayan.com>, 2001,2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: coreutils 5.3.0\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2005-03-14 04:17+0200\n"
+"Last-Translator: Deniz Akkus Kanca <deniz@arayan.com>\n"
+"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Bilinmeyen sistem hatası"
+
+#: lib/gai_strerror.c:57
+#, fuzzy
+msgid "Address family for hostname not supported"
+msgstr "fifo dosyaları desteklenmiyor"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+#, fuzzy
+msgid "ai_family not supported"
+msgstr "fifo dosyaları desteklenmiyor"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+#, fuzzy
+msgid "ai_socktype not supported"
+msgstr "fifo dosyaları desteklenmiyor"
+
+#: lib/gai_strerror.c:67
+#, fuzzy
+msgid "System error"
+msgstr "yazma hatası"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+#, fuzzy
+msgid "Unknown error"
+msgstr "Bilinmeyen sistem hatası"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: `%s' seçeneği belirsiz\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: `%s' seçeneği belirsiz\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: `%c%s' seçeneği bilinmiyor\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: seçenek `%c%s' argümansız kullanılır\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: `%s' seçeneği bir argümanla kullanılır\n"
+
+#: lib/getopt.c:621
+#, fuzzy, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: geçersiz seçenek -- %c\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, fuzzy, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: seçenek bir argümanla kullanılır -- %c\n"
+
+#: lib/openat-die.c:38
+#, fuzzy, c-format
+msgid "unable to record current working directory"
+msgstr "openat: çalışılan dizini kaydedemedi"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "başlangıç çalışma dizinine geri dönülemedi"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+#, fuzzy
+msgid "Invalid regular expression"
+msgstr "%s: geçersiz düzenli ifade(regular expression): %s"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "geçersiz karakter sınıfı `%s'"
+
+#: lib/regcomp.c:147
+#, fuzzy
+msgid "Invalid character class name"
+msgstr "geçersiz karakter sınıfı `%s'"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+#, fuzzy
+msgid "Invalid back reference"
+msgstr "Geçersiz sayfa aralığı `%s'"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+#, fuzzy
+msgid "Invalid range end"
+msgstr "Geçersiz sayfa aralığı `%s'"
+
+#: lib/regcomp.c:171
+#, fuzzy
+msgid "Memory exhausted"
+msgstr "bellek tükendi"
+
+#: lib/regcomp.c:174
+#, fuzzy
+msgid "Invalid preceding regular expression"
+msgstr "%s: geçersiz düzenli ifade(regular expression): %s"
+
+#: lib/regcomp.c:177
+#, fuzzy
+msgid "Premature end of regular expression"
+msgstr "düzenli ifade (regular expression) aramasında hata oluştu"
+
+#: lib/regcomp.c:180
+#, fuzzy
+msgid "Regular expression too big"
+msgstr "%s: geçersiz düzenli ifade(regular expression): %s"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+#, fuzzy
+msgid "No previous regular expression"
+msgstr "düzenli ifade (regular expression) aramasında hata oluştu"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, fuzzy, c-format
+msgid "cannot create pipe"
+msgstr "%s bağı oluşturulamadı"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, fuzzy, c-format
+msgid "%s subprocess failed"
+msgstr "%s: arama (seek) başarısız"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, fuzzy, c-format
+msgid "%s subprocess"
+msgstr "%s: arama (seek) başarısız"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, fuzzy, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s: arama (seek) başarısız"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "bellek tükendi"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "%s argümanı `%s' için geçersiz"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "%s argümanı `%s' için belirsiz"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Geçerli argümanlar:"
+
+#
+#, fuzzy
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Uzun seçenekler için zorunlu olan argümanlar kısa seçenekler için de "
+#~ "zorunludur.\n"
+
+#, fuzzy
+#~ msgid " [OPTION...]"
+#~ msgstr "Kullanım: %s [SEÇENEK]...\n"
+
+#, fuzzy, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "Daha fazla bilgi için `%s --help' yazın.\n"
+
+#, fuzzy, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Yazılım hatalarını <%s> adresine,\n"
+#~ "çeviri hatalarını <gnu-tr@belgeler.org> adresine bildirin.\n"
+
+#~ msgid "NAME"
+#~ msgstr "Ä°SÄ°M"
+
+#, fuzzy, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: çok fazla sağlama satırı"
+
+#, fuzzy
+#~ msgid "program error"
+#~ msgstr "okuma hatası"
+
+#~ msgid "write error"
+#~ msgstr "yazma hatası"
+
+#, fuzzy, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "%s okumak için açılamadı"
+
+#, fuzzy, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "%s yazmak için açılamadı"
+
+#, fuzzy, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "%s'i okunurken hata"
+
+#, fuzzy, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "%s'e yazarken hata"
+
+#, fuzzy, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "%s'i okunurken hata"
+
+#, fuzzy
+#~ msgid "fdopen() failed"
+#~ msgstr "açma işlemi başarısız"
+
+#
+#~ msgid "regular empty file"
+#~ msgstr "normal boÅŸ dosya"
+
+#
+#~ msgid "regular file"
+#~ msgstr "normal dosya"
+
+#~ msgid "directory"
+#~ msgstr "dizin"
+
+#
+#~ msgid "block special file"
+#~ msgstr "blok özel dosyası"
+
+#
+#~ msgid "character special file"
+#~ msgstr "karakter özel dosyası"
+
+#
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "symbolic link"
+#~ msgstr "sembolik baÄŸ"
+
+#~ msgid "socket"
+#~ msgstr "soket"
+
+#~ msgid "message queue"
+#~ msgstr "ileti kuyruÄŸu"
+
+#~ msgid "semaphore"
+#~ msgstr "semafor"
+
+#
+#~ msgid "shared memory object"
+#~ msgstr "paylaşımlı bellek nesnesi"
+
+#
+#~ msgid "typed memory object"
+#~ msgstr "türlenmiş bellek nesnesi"
+
+#
+#~ msgid "weird file"
+#~ msgstr "garip dosya"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: `--%s' seçeneği argümansız kullanılır\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: `--%s' seçeneği bilinmiyor\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: kuraldışı seçenek -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: `-W %s' seçeneği belirsiz\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: `-W %s' seçeneği argümansız kullanılır\n"
+
+#~ msgid "block size"
+#~ msgstr "blok uzunluÄŸu"
+
+#, c-format
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s var ama bir dizin deÄŸil"
+
+#, c-format
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "%s'in sahibi ve/veya grubu deÄŸiÅŸtirilemiyor"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "%s dizini oluşturulamıyor"
+
+#, c-format
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "%s dizinine geçilemedi"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "%s'in eriÅŸim izinleri deÄŸiÅŸtirilemiyor"
+
+#, fuzzy
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "%s: yazmak için açılamadı"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[eE]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[hH]"
+
+#
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv işlevi kullanılabilir değil"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv iÅŸlevi yok"
+
+#~ msgid "character out of range"
+#~ msgstr "karakter kapsamdışı"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "U+%04X yerel karakter kümesine dönüştürülemiyor: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "kullanıcı geçersiz"
+
+#~ msgid "invalid group"
+#~ msgstr "grup geçersiz"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "bir sayısal kullanıcı-kimliğin grubu alınamıyor"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bu, bir serbest yazılımdır; Free Software Foundation tarafından "
+#~ "yayınlanan\n"
+#~ "GNU Genel Kamu Lisansı, 2. sürüm (veya sizin seçiminize bağlı olarak) "
+#~ "daha üst \n"
+#~ "sürüm koşulları altında değişiklik yapabilir ve/veya yeniden "
+#~ "dağıtabilirsiniz. \n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "%s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "%s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "%s, %s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s \n"
+#~ "ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, %s \n"
+#~ "ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, %s, \n"
+#~ "%s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, %s, \n"
+#~ "%s, %s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, \n"
+#~ "%s, %s, %s, \n"
+#~ "%s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, \n"
+#~ "%s, %s, %s, \n"
+#~ "%s, %s ve %s tarafından yazıldı.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "%s, %s, %s, \n"
+#~ "%s, %s, %s, \n"
+#~ "%s, %s, %s ve başkaları tarafından yazıldı.\n"
+
+#
+#~ msgid "string comparison failed"
+#~ msgstr "dizge karşılaştırması başarısız"
+
+#
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Problemi devre dışı bırakmak için LC_ALL='C' tanımlayın."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Karşılaştırılan dizgeler %s ve %s idi."
diff --git a/gnulib_po/uk.gmo b/gnulib_po/uk.gmo
new file mode 100644
index 0000000..cb0ed2c
--- /dev/null
+++ b/gnulib_po/uk.gmo
Binary files differ
diff --git a/gnulib_po/uk.po b/gnulib_po/uk.po
new file mode 100644
index 0000000..0aab6ca
--- /dev/null
+++ b/gnulib_po/uk.po
@@ -0,0 +1,1001 @@
+# Ukrainian messages for gnulib
+# This file is distributed under the same license as the gnulib package.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+#
+# Sergey Poznyakoff <gray@gnu.org>, 2010.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-05-19 14:26+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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"
+"X-Generator: Lokalize 19.03.70\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Ðевідома ÑиÑтемна помилка"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "Родина Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð¸ вузла не підтримуєтьÑÑ"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "ТимчаÑова помилка розв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð·Ð²Ð¸ вузла"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "ÐедійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ai_flags"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Ðевиправна помилка розв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð·Ð²Ð¸ вузла"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ai_family не підтримуєтьÑÑ"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Помилка розподілу пам'ÑÑ‚Ñ–"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "З цією назвою вузла не пов’Ñзано жодної адреÑи"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Ðевідоме ім'Ñ Ð°Ð±Ð¾ Ñлужба"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Підтримки назв Ñлужб у ai_socktype не передбачено"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ai_socktype не підтримуєтьÑÑ"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "СиÑтемна помилка"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Замалий буфер Ð´Ð»Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð²"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "ВиконуєтьÑÑ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ° запиту"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Запит ÑкаÑовано"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Запит не ÑкаÑовано"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Ð’ÑÑ– запити оброблено"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "ÐŸÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñигналом"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Ðеправильно закодований Ñ€Ñдок параметра"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Ðевідома помилка"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: параметр «%s%s» не є однозначним\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: неоднозначний параметр «%s%s»; можливі варіанти:"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: невідомий параметр «%s%s»\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² до параметра «%s%s» не передбачено\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: до параметра «%s%s» Ñлід додати аргумент\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: Ðекоректний параметр -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: параметр вимагає аргументу -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "не вдаєтьÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ поточний каталог"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "не вдаєтьÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ поточний каталог"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "помилка _open_osfhandle"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "не вдаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ деÑкриптор %d: помилка dup2"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "`"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "'"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "УÑпіх"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Брак збігів"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ðекоректний формальний вираз"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ðекоректний об'єднувальний Ñимвол"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ðекоректна назва клаÑу Ñимволів"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Зворотна похила риÑка наприкінці виразу"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "ÐедійÑне зворотнє поÑиланнÑ"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Вираз без парних [, [^, [:, [. або [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ðезакрита ( або \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ðезакрита \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ðекоректний вміÑÑ‚ \\{\\}"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ðекоректний кінець діапазону"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Пам'ÑÑ‚ÑŒ вичерпана"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ðекоректний попередній формальний вираз"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "ПередчаÑне Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ виразу"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Завеликий формальний вираз"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ðеузгоджена ) або \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Ðе вказано попереднього формального виразу"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "не вдаєтьÑÑ Ñтворити конвеєр"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "нащадок %s зазнав невдачі"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "нащадок процеÑу %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ %s отримав фатальний Ñигнал %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "пам'ÑÑ‚ÑŒ вичерпано"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "некоректний аргумент %s Ð´Ð»Ñ %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "неоднозначний аргумент %s Ð´Ð»Ñ %s"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "Дозволені аргументи такі:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s Ñ” менше ніж або дорівнює %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: параметр ARGP_HELP_FMT вимагає значеннÑ"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Ðевідомий параметр ARGP_HELP_FMT"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Хибні дані в ARGP_HELP_FMT: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Ðргументи, обов'Ñзкові Ð´Ð»Ñ Ð´Ð¾Ð²Ð³Ð¸Ñ… ключів, Ñ” обов'Ñзковими й Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¾Ñ‚ÐºÐ¸Ñ…."
+
+#~ msgid "Usage:"
+#~ msgstr "ВикориÑтаннÑ:"
+
+#~ msgid " or: "
+#~ msgstr " чи: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [ПÐРÐМЕТР...]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Віддайте команду «%s --help» або «%s --usage», щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Про помилки звітуйте на <%s>.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "вивеÑти цю довідку"
+
+#~ msgid "give a short usage message"
+#~ msgstr "вивеÑти коротке Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ викориÑтаннÑ"
+
+#~ msgid "NAME"
+#~ msgstr "ÐÐЗВÐ"
+
+#~ msgid "set the program name"
+#~ msgstr "вÑтановити назву програми"
+
+#~ msgid "SECS"
+#~ msgstr "СЕКУÐДИ"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "зачекати вказану кількіÑÑ‚ÑŒ Ñекунд (типово 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "вивеÑти верÑÑ–ÑŽ програми"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(ПОМИЛКРПРОГРÐМУВÐÐÐЯ) Ðевідома верÑÑ–Ñ!?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: забагато аргументів\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(ПОМИЛКРПРОГРÐМУВÐÐÐЯ) Параметр мала бути розпізнана!?"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs, %u звільнено (%.2f%%).\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_sets, %u кешовано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resets, %u кешовано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests, %u кешовано (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#~ msgid "count log histogram\n"
+#~ msgstr "гіÑтограма журналу лічильників\n"
+
+#~ msgid "size log histogram\n"
+#~ msgstr "гіÑтограма журналу розміру\n"
+
+#~ msgid "density histogram\n"
+#~ msgstr "гіÑтограма щільноÑÑ‚Ñ–\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "СтатиÑтика наборів бітів:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "Ðкумульовані запуÑки = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл ÑтатиÑтичних даних"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "помилковий розмір файла ÑтатиÑтичних даних\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл ÑтатиÑтичних даних."
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл ÑтатиÑтичних даних Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу"
+
+#~ msgid "program error"
+#~ msgstr "помилка програми"
+
+#~ msgid "stack overflow"
+#~ msgstr "Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ ÑтоÑу"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "не вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ тимчаÑовий каталог, Ñпробуйте вÑтановити $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr ""
+#~ "не вдаєтьÑÑ Ñтворити тимчаÑовий каталог викориÑтовуючи шаблон \"%s\""
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "не вдаєтьÑÑ ÑƒÑунути тимчаÑовий файл %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "не вдаєтьÑÑ ÑƒÑунути тимчаÑовий каталог %s"
+
+#~ msgid "error closing file"
+#~ msgstr "помилка Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñ„Ð°Ð¹Ð»Ñƒ"
+
+#~ msgid "write error"
+#~ msgstr "помилка запиÑу"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð² доÑтупу до %s"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "помилка при відкриванні «%s» Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "не вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ резервний файл «%s» Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %s"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "помилка запиÑу %s"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "помилка піÑÐ»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Â«%s»"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "помилка fdopen()"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "не знайдено компілÑтора C#, Ñпробуйте вÑтановити mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "не знайдено віртуальної машини C#, Ñпробуйте вÑтановити mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "неврівноважена дужка ["
+
+#~ msgid "invalid character class"
+#~ msgstr "некоректний ÐºÐ»Ð°Ñ Ñимволів"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr ""
+#~ "ÑинтакÑÐ¸Ñ ÐºÐ»Ð°Ñу Ñимволів Ñ” таким: [[:space:]], — а не таким: [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "незавершене ÐµÐºÑ€Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \\"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "некоректний вміÑÑ‚ \\{\\}"
+
+#~ msgid "regular expression too big"
+#~ msgstr "занадто об'ємний формальний вираз"
+
+#~ msgid "unbalanced ("
+#~ msgstr "неврівноважена дужка ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "не вказано ÑинтакÑиÑу"
+
+#~ msgid "unbalanced )"
+#~ msgstr "неврівноважена дужка )"
+
+#~ msgid "regular empty file"
+#~ msgstr "звичайний порожній файл"
+
+#~ msgid "regular file"
+#~ msgstr "звичайний файл"
+
+#~ msgid "directory"
+#~ msgstr "каталог"
+
+#~ msgid "symbolic link"
+#~ msgstr "Ñимвольне поÑиланнÑ"
+
+#~ msgid "message queue"
+#~ msgstr "черга повідомлень"
+
+#~ msgid "semaphore"
+#~ msgstr "Ñемафор"
+
+#~ msgid "shared memory object"
+#~ msgstr "Ñпільний об'єкт пам'ÑÑ‚Ñ–"
+
+#~ msgid "typed memory object"
+#~ msgstr "типізований об'єкт пам'ÑÑ‚Ñ–"
+
+#~ msgid "block special file"
+#~ msgstr "Ñпеціальний блоковий файл"
+
+#~ msgid "character special file"
+#~ msgstr "Ñпеціальний Ñимвольний файл"
+
+#~ msgid "contiguous data"
+#~ msgstr "неперервні дані"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "двері"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "Ñпеціальний файл ущільненого блокового приÑтрою"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "Ñпеціальний файл ущільненого Ñимвольного приÑтрою"
+
+#~ msgid "multiplexed file"
+#~ msgstr "ущільнений файл"
+
+#~ msgid "named file"
+#~ msgstr "іменований файл"
+
+#~ msgid "network special file"
+#~ msgstr "Ñпеціальний файл мережі"
+
+#~ msgid "migrated file with data"
+#~ msgstr "перенеÑений файл з даними"
+
+#~ msgid "migrated file without data"
+#~ msgstr "перенеÑений файл без даних"
+
+#~ msgid "port"
+#~ msgstr "порт"
+
+#~ msgid "socket"
+#~ msgstr "гніздо"
+
+#~ msgid "whiteout"
+#~ msgstr "забілюваннÑ"
+
+#~ msgid "weird file"
+#~ msgstr "дивний файл"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "недійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ source_version Ð´Ð»Ñ compile_java_class"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "недійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ target_version Ð´Ð»Ñ compile_java_class"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "не вдалоÑÑ Ñтворити \"%s\""
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "помилка запиÑу у файл \"%s\""
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Ðе знайдено компілÑтора java, Ñпробуйте вÑтановити gcj або задати "
+#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Ðе знайдено віртуальної машини java, Ñпробуйте вÑтановити gij або задати "
+#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "помилка вводу-виводу нащадка %s"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑтатиÑтичні дані щодо %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "не вдаєтьÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ права доÑтупу до %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "не вдаєтьÑÑ Ñтворити каталог %s"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ /dev/zero Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "не вдалоÑÑ Ñтворити потік читаннÑ"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "не вдаєтьÑÑ Ð²Ñтановити неблокуючий ввід-вивід з підпроцеÑом %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "помилка зв'Ñзку з підпроцеÑом %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "помилка запиÑу у Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· підпроцеÑу %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ %s закінчивÑÑ ÐºÐ¾Ð´Ð¾Ð¼ %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "помилка ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÑ–Ð²"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ %s закінчивÑÑ ÐºÐ¾Ð´Ð¾Ð¼ %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yYтТ]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nNнÐ]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð² доÑтупу до %s"
+
+#~ msgid "Hangup"
+#~ msgstr "Відбій"
+
+#~ msgid "Interrupt"
+#~ msgstr "ПерериваннÑ"
+
+#~ msgid "Quit"
+#~ msgstr "ЗакінченнÑ"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "ÐедійÑна інÑтрукціÑ"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "ÐŸÐµÑ€ÐµÑ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°ÑуваннÑ/контрольної точки"
+
+#~ msgid "Aborted"
+#~ msgstr "Ðварійне завершеннÑ"
+
+#~ msgid "Floating point exception"
+#~ msgstr "ВинÑток операції з рухомою крапкою"
+
+#~ msgid "Killed"
+#~ msgstr "Знищено"
+
+#~ msgid "Bus error"
+#~ msgstr "Помилка шини"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Помилка Ñегментації"
+
+#~ msgid "Broken pipe"
+#~ msgstr "Розімкнений конвеєр"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Таймер"
+
+#~ msgid "Terminated"
+#~ msgstr "Закінчено"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "ЕкÑтрена ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ñ–Ñ Ð²Ð²Ð¾Ð´Ñƒ-виводу"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "ÐŸÑ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ (Ñигнал)"
+
+#~ msgid "Stopped"
+#~ msgstr "ПрипиненнÑ"
+
+#~ msgid "Continued"
+#~ msgstr "ПродовженнÑ"
+
+#~ msgid "Child exited"
+#~ msgstr "Ðащадок завершивÑÑ"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "ÐŸÑ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ (ввід з конÑолі)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "ÐŸÑ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ (вивід на конÑоль)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Можливий ввід-вивід"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу ЦП"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ розміру файлів"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Відлік віртуального таймера завершено"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Відлік таймера Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾"
+
+#~ msgid "Window changed"
+#~ msgstr "Вікно змінилоÑÑ"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Визначений кориÑтувачем Ñигнал 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Визначений кориÑтувачем Ñигнал 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "ПаÑтка EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Ðекоректний ÑиÑтемний виклик"
+
+#~ msgid "Stack fault"
+#~ msgstr "Збій ÑтоÑу"
+
+#~ msgid "Information request"
+#~ msgstr "Запит інформації"
+
+#~ msgid "Power failure"
+#~ msgstr "ÐÐ²Ð°Ñ€Ñ–Ñ Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ"
+
+#~ msgid "Resource lost"
+#~ msgstr "Втрата заÑобу"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "помилка запиÑу у закритий конвеєр або гніздо"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Сигнал реального чаÑу %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Ðевідомий Ñигнал %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ (у Ñекундах)"
+
+#~ msgid "CPU user"
+#~ msgstr "КориÑтувач процеÑора"
+
+#~ msgid "CPU system"
+#~ msgstr "СиÑтема процеÑора"
+
+#~ msgid "wall clock"
+#~ msgstr "наÑтінний годинник"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ iconv непридатна до вжитку"
+
+#~ msgid "iconv function not available"
+#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ iconv недоÑтупна"
+
+#~ msgid "character out of range"
+#~ msgstr "Ñимвол поза діапазоном"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "не вдаєтьÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ U+%04X у локальному зборі знаків"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "не вдаєтьÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ U+%04X у локальному зборі знаків: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "Ðекоректний кориÑтувач"
+
+#~ msgid "invalid group"
+#~ msgstr "недійÑна група"
+
+#~ msgid "invalid spec"
+#~ msgstr "недійÑна ÑпецифікаціÑ"
+
+#~ msgid "unable to display error message"
+#~ msgstr "не вдаєтьÑÑ Ð²Ð¸Ð²ÐµÑти Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Пакет Ñтворив %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Пакет Ñтворив %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "Умови Ð»Ñ–Ñ†ÐµÐ½Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð°Ð´ÐµÐ½Ð¾ у GPLv3+: GNU GPL верÑÑ–Ñ— 3 або новішій, <"
+#~ "%s>\n"
+#~ "Це вільне програмне забезпеченнÑ: ви можете вільно змінювати Ñ– поширювати "
+#~ "його.\n"
+#~ "Вам не надаєтьÑÑ Ð–ÐžÐ”ÐИХ ГÐРÐÐТІЙ, окрім гарантій передбачених "
+#~ "законодавÑтвом.\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Ðвтор: %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Ðвтори: %s та %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Ðвтори: %s, %s та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, %s та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, %s, %s та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, %s, %s, %s та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s та %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Ðвтори: %s, %s, %s\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s та інші.\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "Про помилки звітуйте на %s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "Про помилки у програмі %s звітуйте на %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Ð´Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr ""
+#~ "Загальна довідкова Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ñ‰Ð¾Ð´Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ "
+#~ "GNU: <%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr ""
+#~ "не вдалоÑÑ Ð²Ñтановити текÑтовий або двійковий режим Ð´Ð»Ñ Ð´ÐµÑкриптора файла"
+
+#~ msgid "stdin"
+#~ msgstr "stdin"
+
+#~ msgid "stdout"
+#~ msgstr "stdout"
+
+#~ msgid "stderr"
+#~ msgstr "stderr"
+
+#~ msgid "unknown stream"
+#~ msgstr "невідомий потік"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %s у режимі %s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "невдале порівнÑÐ½Ð½Ñ Ñ€Ñдків"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Ð’Ñтановити LC_ALL='C', щоб уникнути цієї помилки."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "ПорівнювалиÑÑ Ñ€Ñдки: \"%s\" та \"%s\"."
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "неможливо здійÑнити форматований вивід"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "Ñтандартні деÑкриптори файлів"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "некоректний аргумент %s%s — «%s»"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "некоректний ÑÑƒÑ„Ñ–ÐºÑ Ð² аргументі %s%s: «%s»"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s, аргумент «%s» є занадто об’ємним"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <https://www.gnu.org/software/%s/>\n"
+
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: параметр ARGP_HELP_FMT має бути додатнім"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: параметр '--%s' не може мати аргументу\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: невідомий параметр '--%s'\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: параметр '-W %s' не може мати аргументу\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «-W %s» Ñлід вказати аргумент\n"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Franc,ois Pinard"
diff --git a/gnulib_po/vi.gmo b/gnulib_po/vi.gmo
new file mode 100644
index 0000000..974ae39
--- /dev/null
+++ b/gnulib_po/vi.gmo
Binary files differ
diff --git a/gnulib_po/vi.po b/gnulib_po/vi.po
new file mode 100644
index 0000000..58e1470
--- /dev/null
+++ b/gnulib_po/vi.po
@@ -0,0 +1,902 @@
+# Vietnamese translation for GNU Lib.
+# Bản dịch Tiếng Việt dành cho GNU Lib.
+# Copyright © 2014 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Clytie Siddall <clytie@riverland.net.au>, 2006-2010.
+# Trần Ngá»c Quân <vnwildman@gmail.com>, 2012-2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib-3.0.0.6062.a6b16\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2014-01-13 08:31+0700\n"
+"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 1.5.5\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "Gặp lỗi hệ thống chưa biết"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "HỠđịa chỉ dành cho tên máy không được hỗ trợ"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "Tạm thá»i không thể quyết định tên"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "Giá trị sai đối vá»›i “ai_flags†(cá»)"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "Lỗi không thể phục hồi khi phân giải tên"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "Không há»— trợ “ai_familyâ€"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "Lỗi cấp phát bộ nhớ"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "Không có địa chỉ liên quan đến tên máy"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "Không nhận ra tên hay dịch vụ"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "Không hỗ trợ tên máy phục vụ đối với “ai_socktype†(kiểu ổ cắm)"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "Không hỗ trợ “ai-socktype†(kiểu ổ cắm)"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "Lỗi hệ thống"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "Vùng đệm đối số quá ngắn"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "Yêu cầu xử lý đang chạy"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "Yêu cầu bị hủy bá»"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "Yêu cầu chÆ°a bị hủy bá»"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "Má»i yêu cầu hoàn tất"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "bị tín hiệu gián đoạn"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "Chuỗi tham số không phải được mã hóa đúng"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "Gặp lỗi không rõ"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: tùy chá»n “-W %s†chÆ°a rõ ràng\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: tùy chá»n “%s†chÆ°a rõ ràng; khả năng là:"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: không nhận ra tùy chá»n “%c%sâ€\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: tùy chá»n “%c%s†không cho phép đối số\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: tùy chá»n “--%s†yêu cầu má»™t đối số\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: tùy chá»n không hợp lệ -- “%câ€\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: tùy chá»n yêu cầu má»™t đối số -- “%câ€\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "không thể ghi lại thÆ° mục làm việc hiện thá»i"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "gặp lỗi khi quay trở vỠthư mục làm việc ban đầu"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle bị lỗi"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "không thể phục hồi bộ mô tả tập tin %d: “dup2†bị lỗi"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "“"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "Thành công"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "Không khớp"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Biểu thức chính quy không hợp lệ"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ký tự đối chiếu không hợp lệ"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Tên loại ký tự không hợp lệ"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Có xuyệc ngược theo sau"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Tham chiếu ngược không hợp lệ"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "ChÆ°a khá»›p ký tá»± “[†hay “[^â€"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "ChÆ°a khá»›p ký tá»± “(†hay “\\(â€"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "ChÆ°a khá»›p ký tá»± “\\{â€"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Nội dung của “\\{\\}†không hợp lệ"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Kết thúc phạm vi không hợp lệ"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Hết bộ nhớ"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Biểu thức chính quy đi trước không hợp lệ"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Biểu thức chính quy kết thúc quá sớm"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Biểu thức chính quy quá lớn"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "ChÆ°a khá»›p ký tá»± “)†hay “\\)â€"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Không có biểu thức chính quy đi trước"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "không thể tạo ống dẫn"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "Tiến trình con %s bị lỗi"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "Tiến trình con %s"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "Tiến trình con %s đã nhận tín hiệu nghiêm trá»ng %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "hết bộ nhớ"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "đối số không hợp lệ %s cho %s"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "đối số chưa rõ ràng %s dành cho %s"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "Các đối số hợp lệ:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: giá trị %s nhỠhơn hoặc bằng %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: tham số “ARGP_HELP_FMT†cần được gán giá trị"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: tham số “ARGP_HELP_FMT†phải là số dương"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: Không biết tham số “ARGP_HELP_FMTâ€"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "Gặp rác trong “ARGP_HELP_FMTâ€: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "Các đối số là bắt buá»™c hay chỉ là tùy chá»n khi dùng vá»›i tùy chá»n dài thì "
+#~ "tùy chá»n ngắn tÆ°Æ¡ng ứng cÅ©ng vậy."
+
+#~ msgid "Usage:"
+#~ msgstr "Cách dùng:"
+
+#~ msgid " or: "
+#~ msgstr " hoặc:"
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [TÙY_CHỌN...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr ""
+#~ "Hãy chạy “%s --help†(trợ giúp) hay “%s --usage†(cách dùng) để xem thông "
+#~ "tin thêm.\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "Hãy thông báo lỗi cho %s.\n"
+
+#~ msgid "give this help list"
+#~ msgstr "hiển thị trợ giúp này"
+
+#~ msgid "give a short usage message"
+#~ msgstr "hiển thị cách dùng dạng ngắn gá»n"
+
+#~ msgid "NAME"
+#~ msgstr "TÊN"
+
+#~ msgid "set the program name"
+#~ msgstr "đặt tên chương trình"
+
+#~ msgid "SECS"
+#~ msgstr "GIÂY"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "treo trong vòng GIÂY giây (mặc định là 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "in ra phiên bản chương trình"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(LỖI CHƯƠNG TRÌNH) Không có phiên bản đã biết ?"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s: Quá nhiá»u đối số\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(Lá»–I CHƯƠNG TRÃŒNH) Tùy chá»n đáng ra nên được nhận diện!?"
+
+#~ msgid "program error"
+#~ msgstr "lỗi chương trình"
+
+#~ msgid "stack overflow"
+#~ msgstr "tràn ngăn xếp"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr ""
+#~ "không tìm thấy thÆ° mục tạm thá»i, hãy thá»­ đặt biến môi trÆ°á»ng $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "không thể tạo má»™t thÆ° mục tạm thá»i dùng mẫu “%sâ€"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "không thể gỡ bá» tập tin tạm thá»i %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "không thể gỡ bá» thÆ° mục tạm thá»i %s"
+
+#~ msgid "error closing file"
+#~ msgstr "lỗi đóng tập tin"
+
+#~ msgid "write error"
+#~ msgstr "lá»—i ghi"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "Ä‘ang bảo tồn quyá»n hạn cho %s"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "gặp lá»—i khi mở “%s†để Ä‘á»c"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "không thể mở tập tin sao lưu dự phòng “%s†để ghi"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "gặp lá»—i khi Ä‘á»c “%sâ€"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "gặp lá»—i khi ghi “%sâ€"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "gặp lá»—i sau khi Ä‘á»c “%sâ€"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() bị lỗi"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "Không tìm thấy trình biên dịch C# nên thử cài đặt pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "Không tìm thấy cơ chế ảo C# nên thử cài đặt pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "tập tin rá»—ng kiểu thÆ°á»ng"
+
+#~ msgid "regular file"
+#~ msgstr "tập tin thông thÆ°á»ng"
+
+#~ msgid "directory"
+#~ msgstr "thư mục"
+
+#~ msgid "block special file"
+#~ msgstr "tập tin đặc biệt khối"
+
+#~ msgid "character special file"
+#~ msgstr "tập tin đặc biệt ký tự"
+
+#~ msgid "fifo"
+#~ msgstr "fifo (vào trước, ra trước)"
+
+#~ msgid "symbolic link"
+#~ msgstr "liên kết má»m"
+
+#~ msgid "socket"
+#~ msgstr "ổ cắm"
+
+#~ msgid "message queue"
+#~ msgstr "hàng đợi thông điệp"
+
+#~ msgid "semaphore"
+#~ msgstr "cỠhiệu"
+
+#~ msgid "shared memory object"
+#~ msgstr "đối tượng bộ nhớ dùng chung"
+
+#~ msgid "typed memory object"
+#~ msgstr "đốí tượng bộ nhớ đánh kiểu"
+
+#~ msgid "weird file"
+#~ msgstr "tập tin kỳ quặc"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: tùy chá»n “--%s†không cho phép đối số\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: không nhận ra tùy chá»n “--%sâ€\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: tùy chá»n “-W %s†không cho phép đối số\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: tùy chá»n “-W %s†yêu cầu má»™t đối số\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr ""
+#~ "đối số phiên bản nguồn “source_version†không hợp lệ đối với hạn Java "
+#~ "biên dịch “compile_java_classâ€"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr ""
+#~ "đối số phiên bản đích “source_version†không hợp lệ đối với hạn Java biên "
+#~ "dịch “compile_java_classâ€"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "gặp lá»—i khi tạo “%sâ€"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "gặp lá»—i khi ghi tập tin “%sâ€"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr ""
+#~ "Không tìm thấy trình biên dịch Java nên thử cài đặt trình “gcj†hoặc đặt "
+#~ "biến môi trÆ°á»ng “$JAVACâ€."
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr ""
+#~ "Không tìm thấy cơ chế ảo Java nên thử cài đặt trình “gcj†hoặc đặt biến "
+#~ "môi trÆ°á»ng “$JAVACâ€."
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "Lỗi V/R tiến trình con %s"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "không thể thay đổi quyá»n hạn của %s"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "không thể tạo thư mục %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "Gặp lá»—i khi mở thiết bị “/dev/zero†để Ä‘á»c"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "gặp lá»—i khi tạo tuyến trình Ä‘á»c"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "không thể cài đặt V/R không chặn đối với tiến trình con %s"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "lỗi liên lạc với tiến trình con %s"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "gặp lỗi khi ghi vào tiến trình con %s"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "gặp lá»—i khi Ä‘á»c từ tiến trình con %s"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "tiến trình con %s đã kết thúc với mã thoát %d"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "gặp lỗi khi tạo tuyến trình"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "tiến trình con %s đã kết thúc với mã thoát %d"
+
+#~ msgid "Franc,ois Pinard"
+#~ msgstr "Franc,ois Pinard"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[cC]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[kK]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "Ä‘ang đặt quyá»n hạn cho %s"
+
+#~ msgid "Hangup"
+#~ msgstr "NgÆ°ng"
+
+#~ msgid "Interrupt"
+#~ msgstr "Ngắt"
+
+#~ msgid "Quit"
+#~ msgstr "Thoát"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "Câu lệnh sai"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "Bẫy vết/điểm ngắt"
+
+#~ msgid "Aborted"
+#~ msgstr "Bị hủy bá»"
+
+#~ msgid "Floating point exception"
+#~ msgstr "Ngoại lệ số thực dấu chấm động"
+
+#~ msgid "Killed"
+#~ msgstr "Bị buộc kết thúc"
+
+#~ msgid "Bus error"
+#~ msgstr "Lá»—i bus"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "Lỗi phân đoạn"
+
+#~ msgid "Broken pipe"
+#~ msgstr "á»ng dẫn bị há»ng"
+
+#~ msgid "Alarm clock"
+#~ msgstr "Äồng hồ báo Ä‘á»™ng"
+
+#~ msgid "Terminated"
+#~ msgstr "Bị chấm dứt"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "Äiá»u kiện V/R khẩn"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "Bị ngừng (ký hiệu)"
+
+#~ msgid "Stopped"
+#~ msgstr "Bị ngừng"
+
+#~ msgid "Continued"
+#~ msgstr "Äã tiếp tục"
+
+#~ msgid "Child exited"
+#~ msgstr "Tiến trình con đã thoát"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "Bị ngừng (đầu vào TTY)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "Bị ngừng (đầu ra TTY)"
+
+#~ msgid "I/O possible"
+#~ msgstr "Có thể V/R"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "Vượt quá thá»i hạn CPU"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "Vượt quá giới hạn kích cỡ tập tin"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "Hàm đếm thá»i gian ảo đã hết hạn"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "Hàm đếm thá»i gian Ä‘o hiệu năng sá»­ dụng đã hết hạn"
+
+#~ msgid "Window changed"
+#~ msgstr "Cửa sổ bị thay đổi"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "Tín hiệu do ngÆ°á»i dùng xác định 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "Tín hiệu do ngÆ°á»i dùng xác định 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "Bẫy EMT"
+
+#~ msgid "Bad system call"
+#~ msgstr "Cú gá»i hệ thống sai"
+
+#~ msgid "Stack fault"
+#~ msgstr "Lỗi ngăn xếp"
+
+#~ msgid "Information request"
+#~ msgstr "Yêu cầu thông tin"
+
+#~ msgid "Power failure"
+#~ msgstr "Bị mất điện đột ngột"
+
+#~ msgid "Resource lost"
+#~ msgstr "Tài nguyên bị mất"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "lá»—i ghi vào má»™t Ä‘Æ°á»ng ống hay ổ cắm bị đóng"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "Tín hiệu thá»i gian thật %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "Không rõ tín hiệu %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "hàm iconv không khả dụng"
+
+#~ msgid "iconv function not available"
+#~ msgstr "không có hàm iconv"
+
+#~ msgid "character out of range"
+#~ msgstr "Ký tự ở ngoại phạm vi"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "không thể chuyển đổi U+%04X sang bộ ký tự địa phương: %s"
+
+#~ msgid "invalid user"
+#~ msgstr "ngÆ°á»i dùng không hợp lệ"
+
+#~ msgid "invalid group"
+#~ msgstr "nhóm không hợp lệ"
+
+#~ msgid "invalid spec"
+#~ msgstr "đặc tả không hợp lệ"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "không thể hiển thị thông điệp lỗi"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "Gói đóng bởi %s (%s)\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "Gói đóng bởi %s\n"
+
+#~ msgid "(C)"
+#~ msgstr "©"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "GPLv3+: Giấy Phép Công Cộng GNU, phiên bản 3 hay mới hơn <http://gnu.org/"
+#~ "licenses/gpl.html>\n"
+#~ "Äây là phần má»m tá»± do: bạn có quyá»n thay đổi và phát hành lại nó.\n"
+#~ "KHÔNG CÓ BẢO HÀNH GÃŒ CẢ, vá»›i Ä‘iá»u kiện được pháp luật cho phép.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "Tác giả: %s.\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "Tác giả: %s và %s.\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "Tác giả: %s, %s, và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "%s, và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Tác gia: %s, %s, %s,\n"
+#~ "%s, %s, và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "%s, %s, %s, và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, và %s.\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "Tác giả: %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, và các ngÆ°á»i khác.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Hãy thông báo lỗi cho: %s\n"
+#~ "Thông báo lỗi dịch cho: <http://translationproject.org/team/vi.html>.\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr ""
+#~ "Hãy thông báo lỗi %s cho: %s\n"
+#~ "Thông báo lỗi dịch cho: <http://translationproject.org/team/vi.html>.\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "Trang chủ %s: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "Trang chủ %s: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr ""
+#~ "Trợ giúp chung vá» cách sá»­ dụng phần má»m GNU: <http://www.gnu.org/gethelp/"
+#~ ">\n"
+
+#~ msgid "stdin"
+#~ msgstr "đầu vào tiêu chuẩn"
+
+#~ msgid "stdout"
+#~ msgstr "đầu ra tiêu chuẩn"
+
+#~ msgid "stderr"
+#~ msgstr "đầu ra lỗi tiêu chuẩn"
+
+#~ msgid "unknown stream"
+#~ msgstr "không hiểu luồng dữ liệu"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "gặp lỗi khi mở lại %s trong chế độ %s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "gặp lỗi khi so sánh chuỗi"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "Hãy đặt “LC_ALL='C'†để sửa chữa trục trặc này."
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "Hai chuỗi được so sánh là %s và %s."
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "không thể thực hiện kết xuất có định dạng"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "đối số %s%s không hợp lệ “%sâ€"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "hậu tố không hợp lệ trong đối số %s%s “%sâ€"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "Äối số %s%s “%s†quá lá»›n"
diff --git a/gnulib_po/wget-gnulib.pot b/gnulib_po/wget-gnulib.pot
new file mode 100644
index 0000000..88fef0d
--- /dev/null
+++ b/gnulib_po/wget-gnulib.pot
@@ -0,0 +1,279 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the GNU wget package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr ""
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr ""
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr ""
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr ""
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr ""
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr ""
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr ""
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr ""
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr ""
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr ""
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr ""
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr ""
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr ""
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr ""
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr ""
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr ""
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr ""
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr ""
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr ""
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr ""
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr ""
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr ""
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr ""
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr ""
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr ""
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr ""
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr ""
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr ""
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr ""
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr ""
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr ""
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr ""
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr ""
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr ""
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr ""
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr ""
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr ""
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr ""
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr ""
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr ""
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr ""
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr ""
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr ""
diff --git a/gnulib_po/zh_CN.gmo b/gnulib_po/zh_CN.gmo
new file mode 100644
index 0000000..91ab5d5
--- /dev/null
+++ b/gnulib_po/zh_CN.gmo
Binary files differ
diff --git a/gnulib_po/zh_CN.po b/gnulib_po/zh_CN.po
new file mode 100644
index 0000000..4428731
--- /dev/null
+++ b/gnulib_po/zh_CN.po
@@ -0,0 +1,909 @@
+# simplified Chinese translation of gnulib.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+# Yip Chi Lap <clyip@cs.hku.hk>, 1998.
+# Abel Cheung <maddog@linux.org.hk>, 2002.
+# Anthony Fok <anthony@thizlinux.com>, 2002.
+# Funda Wang <fundawang@linux.net.cn>, 2004, 2005.
+# Ji ZhengYu <zhengyuji@gmail.com>, 2009, 2010.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 2.0.0.3462.e9796\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2010-02-26 09:54+0800\n"
+"Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "未知的系统错误"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "ä¸æ”¯æŒä¸»æœºå的地å€æ—"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "å称解æžæ—¶å‘生临时错误"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "ai_flags 的值错误"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "å称解æžæ—¶å‘生ä¸å¯æ¢å¤çš„错误"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ä¸æ”¯æŒ ai_family"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "内存分é…错误"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "主机å未分é…到地å€"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "未知的å称或æœåŠ¡"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "ai_socktype ä¸æ”¯æŒçš„æœåŠ¡å"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ä¸æ”¯æŒ ai_socktype"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "系统错误"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "å‚数缓冲区太å°"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "正在处ç†è¿›ç¨‹çš„请求"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "请求已å–消"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "请求未å–消"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "已处ç†æ‰€æœ‰è¯·æ±‚"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "被一个信å·ä¸­æ–­"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "å‚数字符串未正确编ç "
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "未知错误"
+
+#: lib/getopt.c:278
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s: 选项\"%s\"歧义\n"
+
+#: lib/getopt.c:284
+#, fuzzy, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s: 选项\"%s\"歧义\n"
+
+#: lib/getopt.c:319
+#, fuzzy, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s: 无法识别的选项\"%c%s\"\n"
+
+#: lib/getopt.c:345
+#, fuzzy, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s: 选项\"%c%s\"ä¸è¦å‚æ•°\n"
+
+#: lib/getopt.c:360
+#, fuzzy, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s: 选项\"%s\"必须带å‚æ•°\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: 无效选项 -- \"%c\"\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: 选项需è¦å‚æ•° -- \"%c\"\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "无法记录当å‰å·¥ä½œçš„目录"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "返回到åˆå§‹å·¥ä½œç›®å½•å¤±è´¥"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle 失败"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "无法æ¢å¤æ–‡ä»¶æ述符 %d: dup2 失败"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "“"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "â€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "æˆåŠŸ"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "ä¸åŒ¹é…"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "正则表达å¼æ— æ•ˆ"
+
+#: lib/regcomp.c:144
+#, fuzzy
+msgid "Invalid collation character"
+msgstr "无效的é‡ç»„字符"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "无效的字符类å"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "多余的åæ–œæ "
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "无效的å‘åŽç´¢å¼•"
+
+#: lib/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ 或 [^ ä¸åŒ¹é…"
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( 或 \\( ä¸åŒ¹é…"
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ ä¸åŒ¹é…"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "\\{\\} 的内容无效"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "无效的范围结尾"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "内存用尽"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "å‰ç½®çš„正则表达å¼æ— æ•ˆ"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "正则表达å¼ç»“尾过早"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "正则表达å¼å¤ªå¤§"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") 或 \\) ä¸åŒ¹é…"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "没有å‰æ¬¡æ­£åˆ™è¡¨è¾¾å¼"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "无法创建管é“"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s å­è¿›ç¨‹é”™è¯¯"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s å­è¿›ç¨‹"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s å­è¿›ç¨‹èŽ·å¾—ç»ˆç»“ä¿¡å· %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "内存用尽"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "%2$s çš„å‚æ•° %1$s 无效"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "%2$s çš„å‚æ•° %1$s 有歧义"
+
+#, c-format
+#~ msgid "Valid arguments are:"
+#~ msgstr "有效的å‚数为:"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT: %s 的值å°äºŽæˆ–等于 %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s: ARGP_HELP_FMT å‚数需è¦ä¸€ä¸ªå€¼"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter must be positive"
+#~ msgstr "%.*s: ARGP_HELP_FMT å‚数必须为正值"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s: 未知的 ARGP_HELP_FMT å‚æ•°"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "ARGP_HELP_FMT 中的无效å‚æ•°: %s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr ""
+#~ "选项完整形å¼æ‰€å¿…须用的或是å¯é€‰çš„å‚数,在使用选项缩写形å¼æ—¶ä¹Ÿæ˜¯å¿…须的或是å¯"
+#~ "选的。"
+
+#~ msgid "Usage:"
+#~ msgstr "用法:"
+
+#~ msgid " or: "
+#~ msgstr " 或者: "
+
+#~ msgid " [OPTION...]"
+#~ msgstr "[选项...]"
+
+#, c-format
+#~ msgid "Try `%s --help' or `%s --usage' for more information.\n"
+#~ msgstr "请å°è¯•æ‰§è¡Œâ€œ%s --helpâ€æˆ–“%s --usageâ€æ¥èŽ·å–更多信æ¯ã€‚\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "è¯·å‘ %s 报告错误。\n"
+
+#~ msgid "give this help list"
+#~ msgstr "显示此帮助列表"
+
+#~ msgid "give a short usage message"
+#~ msgstr "显示一份简æ´çš„用法信æ¯"
+
+#~ msgid "NAME"
+#~ msgstr "NAME"
+
+#~ msgid "set the program name"
+#~ msgstr "设定程åºå称"
+
+#~ msgid "SECS"
+#~ msgstr "SECS"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "挂起 SECS 秒(默认 3600 秒)"
+
+#~ msgid "print program version"
+#~ msgstr "打å°ç¨‹åºç‰ˆæœ¬"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(程åºé”™è¯¯ï¼‰æœªçŸ¥ç‰ˆæœ¬ï¼ï¼Ÿ"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s:å‚数太多\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(程åºé”™è¯¯ï¼‰æœªçŸ¥çš„选项ï¼ï¼Ÿ"
+
+#~ msgid "program error"
+#~ msgstr "程åºé”™è¯¯"
+
+#~ msgid "stack overflow"
+#~ msgstr "堆栈溢出"
+
+#, c-format
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "无法找到一个临时目录,请å°è¯•è®¾ç½® $TMPDIR 环境å˜é‡"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "无法以模æ¿â€œ%sâ€åˆ›å»ºä¸€ä¸ªä¸´æ—¶ç›®å½•"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "无法删除临时文件 %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "无法删除临时目录 %s"
+
+#~ msgid "error closing file"
+#~ msgstr "关闭文件时å‘生错误"
+
+#~ msgid "write error"
+#~ msgstr "写入错误"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "ä¿ç•™ %s çš„æƒé™"
+
+#, c-format
+#~ msgid "error while opening \"%s\" for reading"
+#~ msgstr "打开“%sâ€è¯»å–æ•°æ®æ—¶å‘生错误"
+
+#, c-format
+#~ msgid "cannot open backup file \"%s\" for writing"
+#~ msgstr "无法打开备份文件“%sâ€å†™å…¥æ•°æ®"
+
+#, c-format
+#~ msgid "error reading \"%s\""
+#~ msgstr "读入“%sâ€æ—¶é”™è¯¯"
+
+#, c-format
+#~ msgid "error writing \"%s\""
+#~ msgstr "写入“%sâ€æ—¶é”™è¯¯"
+
+#, c-format
+#~ msgid "error after reading \"%s\""
+#~ msgstr "读入“%sâ€åŽé”™è¯¯"
+
+#, c-format
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() 错误"
+
+#, c-format
+#~ msgid "C# compiler not found, try installing pnet"
+#~ msgstr "未找到 C# 编译器,å°è¯•å®‰è£… pnet"
+
+#, c-format
+#~ msgid "C# virtual machine not found, try installing pnet"
+#~ msgstr "未找到 C# 虚拟机,å°è¯•å®‰è£… pnet"
+
+#~ msgid "regular empty file"
+#~ msgstr "一般空文件"
+
+#~ msgid "regular file"
+#~ msgstr "一般文件"
+
+#~ msgid "directory"
+#~ msgstr "目录"
+
+#~ msgid "block special file"
+#~ msgstr "å—特殊文件"
+
+#~ msgid "character special file"
+#~ msgstr "字符特殊文件"
+
+#~ msgid "fifo"
+#~ msgstr "先进先出"
+
+#~ msgid "symbolic link"
+#~ msgstr "符å·é“¾æŽ¥"
+
+#~ msgid "socket"
+#~ msgstr "套接字"
+
+#~ msgid "message queue"
+#~ msgstr "消æ¯é˜Ÿåˆ—"
+
+#~ msgid "semaphore"
+#~ msgstr "ä¿¡å·é‡"
+
+#~ msgid "shared memory object"
+#~ msgstr "共享内存对象"
+
+#~ msgid "typed memory object"
+#~ msgstr "标准内存对象"
+
+#~ msgid "weird file"
+#~ msgstr "å¤æ€ªæ–‡ä»¶"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: 选项\"--%s\"ä¸è¦å‚æ•°\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: 无法识别的选项\"--%s\"\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: 选项\"-W %s\"有歧义\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: 选项\"-W %s\"ä¸è¦å¸¦å‚æ•°\n"
+
+#, c-format
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "compile_java_class çš„ source_version å‚数无效"
+
+#, c-format
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "compile_java_class çš„ target_version å‚数无效"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "无法创建“%sâ€"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "正在写入“%sâ€æ–‡ä»¶æ—¶å‘生错误"
+
+#, c-format
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "未找到 Java 编译器,å°è¯•å®‰è£… gcj 或是设置 $JAVAC"
+
+#, c-format
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr "未找到 Java 虚拟机,å°è¯•å®‰è£… gij 或是设置 $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s å­è¿›ç¨‹è¾“å…¥/输出错误"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "无法更改 %s çš„æƒé™"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "无法创建目录 %s"
+
+#, c-format
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "无法以读方å¼æ‰“å¼€ /dev/zero"
+
+#, c-format
+#~ msgid "creation of reading thread failed"
+#~ msgstr "读线程创建错误"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "无法为 %s å­è¿›ç¨‹è®¾ç½®éžé˜»å¡žæ€§ I/O"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "与 %s å­è¿›ç¨‹é€šè®¯é”™è¯¯"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "写入 %s å­è¿›ç¨‹é”™è¯¯"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "è¯»å– %s å­è¿›ç¨‹é”™è¯¯"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "å­è¿›ç¨‹ %s ç”±é€€å‡ºç  %d 终止"
+
+#, c-format
+#~ msgid "creation of threads failed"
+#~ msgstr "线程创建失败"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "å­è¿›ç¨‹ %s ç”±é€€å‡ºç  %d 终止"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "设置 %s çš„æƒé™"
+
+#~ msgid "Hangup"
+#~ msgstr "挂起"
+
+#~ msgid "Interrupt"
+#~ msgstr "中断"
+
+#~ msgid "Quit"
+#~ msgstr "退出"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "éžæ³•æŒ‡ä»¤"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "跟踪(断点)"
+
+#~ msgid "Aborted"
+#~ msgstr "å–消"
+
+#~ msgid "Floating point exception"
+#~ msgstr "浮点溢出"
+
+#~ msgid "Killed"
+#~ msgstr "强行终止"
+
+#~ msgid "Bus error"
+#~ msgstr "总线错误"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "段错误"
+
+#~ msgid "Broken pipe"
+#~ msgstr "管é“æ–­å¼€"
+
+#~ msgid "Alarm clock"
+#~ msgstr "时钟警报"
+
+#~ msgid "Terminated"
+#~ msgstr "被终止"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "I/O æ¡ä»¶ä¸è¶³"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "被åœæ­¢(通过信å·)"
+
+#~ msgid "Stopped"
+#~ msgstr "被åœæ­¢"
+
+#~ msgid "Continued"
+#~ msgstr "继续"
+
+#~ msgid "Child exited"
+#~ msgstr "å­è¿›ç¨‹é€€å‡º"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "被åœæ­¢(tty 输入)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "被åœæ­¢(tty 输出)"
+
+#~ msgid "I/O possible"
+#~ msgstr "I/O å¯èƒ½"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "超出CPU 时间é™åˆ¶"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "超出文件大å°é™åˆ¶"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "虚拟计时器过期"
+
+#, fuzzy
+#~ msgid "Profiling timer expired"
+#~ msgstr "æ•°æ®è®¡æ—¶å™¨è¿‡æœŸ"
+
+#~ msgid "Window changed"
+#~ msgstr "窗å£æ”¹å˜"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "ç”¨æˆ·è‡ªå®šä¹‰ä¿¡å· 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "ç”¨æˆ·è‡ªå®šä¹‰ä¿¡å· 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "仿真程åºé™·é˜±"
+
+#~ msgid "Bad system call"
+#~ msgstr "错误的系统调用"
+
+#~ msgid "Stack fault"
+#~ msgstr "堆栈错误"
+
+#~ msgid "Information request"
+#~ msgstr "ä¿¡æ¯è¯·æ±‚"
+
+#~ msgid "Power failure"
+#~ msgstr "电力问题"
+
+#~ msgid "Resource lost"
+#~ msgstr "资æºä¸¢å¤±"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "写入一个已关闭的管é“或套接字时å‘生错误"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "å®žæ—¶ä¿¡å· %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "æœªçŸ¥ä¿¡å· %d"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv 函数无法使用"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv 函数ä¸å­˜åœ¨"
+
+#~ msgid "character out of range"
+#~ msgstr "字符值超出å¯æŽ¥å—的范围以外"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "无法将 U+%04X 转æ¢è‡³ç”¨æˆ·çš„字符集"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "无法将 U+%04X 转æ¢è‡³ç”¨æˆ·çš„字符集:%s"
+
+#~ msgid "invalid user"
+#~ msgstr "无效的用户"
+
+#~ msgid "invalid group"
+#~ msgstr "无效的组"
+
+#~ msgid "invalid spec"
+#~ msgstr "无效的 spec"
+
+#, c-format
+#~ msgid "unable to display error message"
+#~ msgstr "无法显示错误信æ¯"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "由 %s (%s) 打包\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "由 %s 打包\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#~ msgid ""
+#~ "\n"
+#~ "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+#~ "html>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "授æƒåè®® GPLv3+: GNU GPL 版本 3 或更新版本 <http://gnu.org/licenses/gpl."
+#~ "html>\n"
+#~ "这是自由软件:您å¯ä»¥è‡ªç”±çš„更改并é‡æ–°å‘布它。\n"
+#~ "在法律å…许的范围内,没有任何担ä¿ã€‚\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "由 %s 编写。\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "由 %s 和 %s 编写。\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "ç”± %sã€%s å’Œ %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%s å’Œ\n"
+#~ "%s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%s 和 %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%s å’Œ %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%sã€%s å’Œ %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%sã€%sã€%s\n"
+#~ "和 %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%sã€%sã€%sã€\n"
+#~ "%sã€å’Œ %s 编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%sã€%sã€%sã€\n"
+#~ "%sã€%sã€å’Œå…¶ä»–人编写。\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to: %s\n"
+#~ msgstr ""
+#~ "\n"
+#~ "è¯·å‘ %s æŠ¥å‘Šé”™è¯¯ã€‚å‘ <i18n-zh@googlegroups.com> 报告翻译错误。\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "将 %s 错误报告给: %s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s 主页: <%s>\n"
+
+#, c-format
+#~ msgid "%s home page: <http://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s 主页: <http://www.gnu.org/software/%s/>\n"
+
+#~ msgid "General help using GNU software: <http://www.gnu.org/gethelp/>\n"
+#~ msgstr "GNU 软件的通用帮助: <http://www.gnu.org/gethelp/>\n"
+
+#~ msgid "stdin"
+#~ msgstr "标准输入"
+
+#~ msgid "stdout"
+#~ msgstr "标准输出"
+
+#~ msgid "stderr"
+#~ msgstr "标准错误输出"
+
+#~ msgid "unknown stream"
+#~ msgstr "未知的æµ"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "无法以 %2$s 模å¼é‡æ–°æ‰“å¼€ %1$s"
+
+#, c-format
+#~ msgid "string comparison failed"
+#~ msgstr "字符串比较出现错误"
+
+#, c-format
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "请设定 LC_ALL='C' é¿å…问题出现。"
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "è¦æ¯”较的字符串为 %s å’Œ %s。"
+
+#, c-format
+#~ msgid "cannot perform formatted output"
+#~ msgstr "无法执行格å¼åŒ–输出"
+
+#, c-format
+#~ msgid "invalid %s%s argument `%s'"
+#~ msgstr "%s%s å‚数‘%s’无效"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument `%s'"
+#~ msgstr "%s%s å‚数‘%s’的åŽç¼€æ— æ•ˆ"
+
+#, c-format
+#~ msgid "%s%s argument `%s' too large"
+#~ msgstr "%s%s å‚数‘%s’太长"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s:éžæ³•é€‰é¡¹ -- %c\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <%s>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "è¯·å‘ <%s> 报告错误。\n"
+
+#~ msgid "block size"
+#~ msgstr "å—大å°"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s 存在但并éžç›®å½•"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "无法更改 %s 的属主和/或组"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "无法切æ¢åˆ°ç›®å½• %s"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "无法å–å¾— UID 数值所表示的用户的主组"
diff --git a/gnulib_po/zh_TW.gmo b/gnulib_po/zh_TW.gmo
new file mode 100644
index 0000000..1ad3d55
--- /dev/null
+++ b/gnulib_po/zh_TW.gmo
Binary files differ
diff --git a/gnulib_po/zh_TW.po b/gnulib_po/zh_TW.po
new file mode 100644
index 0000000..8659770
--- /dev/null
+++ b/gnulib_po/zh_TW.po
@@ -0,0 +1,1011 @@
+# traditional Chinese translation of coreutils.
+# Copyright (C) 1998, 2002, 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnulib package.
+#
+# # Merged from textutils, sh-utils and fileutils translation:
+#
+# # Yip Chi Lap <clyip@cs.hku.hk>, 1998.
+# # Yuan-Chung Cheng <platin@ms.ccafps.khc.edu.tw>, 1998.
+# # Abel Cheung <abelcheung@gmail.com>, 2002.
+# # Pofeng Lee <pofeng@linux.org.tw>, 1998, 2002.
+# Abel Cheung <abelcheung@gmail.com>, 2005.
+# pan93412 <pan93412@gmail.com>, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnulib 4.0.0.2567\n"
+"Report-Msgid-Bugs-To: bug-gnulib@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-12-15 13:01+0800\n"
+"Last-Translator: pan93412 <pan93412@gmail.com>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@lists.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-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Lokalize 19.12.0\n"
+
+#: lib/error.c:195
+msgid "Unknown system error"
+msgstr "未知系統錯誤"
+
+#: lib/gai_strerror.c:57
+msgid "Address family for hostname not supported"
+msgstr "ä¸æ”¯æ´ä¸»æ©Ÿå稱的ä½å€å®¶æ—"
+
+#: lib/gai_strerror.c:58
+msgid "Temporary failure in name resolution"
+msgstr "解æžå稱時發生暫時性錯誤"
+
+#: lib/gai_strerror.c:59
+msgid "Bad value for ai_flags"
+msgstr "ai_flags 的值無效"
+
+#: lib/gai_strerror.c:60
+msgid "Non-recoverable failure in name resolution"
+msgstr "解æžå稱時發生無法復原錯誤"
+
+#: lib/gai_strerror.c:61
+msgid "ai_family not supported"
+msgstr "ä¸æ”¯æ´ ai_family"
+
+#: lib/gai_strerror.c:62
+msgid "Memory allocation failure"
+msgstr "分é…記憶體失敗"
+
+#: lib/gai_strerror.c:63
+msgid "No address associated with hostname"
+msgstr "沒有ä½å€é—œè¯è‡³æ­¤ä¸»æ©Ÿå稱"
+
+#: lib/gai_strerror.c:64
+msgid "Name or service not known"
+msgstr "å稱或æœå‹™æœªçŸ¥"
+
+#: lib/gai_strerror.c:65
+msgid "Servname not supported for ai_socktype"
+msgstr "ai_socktype ä¸æ”¯æ´ä¼ºæœå™¨å稱 (Servname)"
+
+#: lib/gai_strerror.c:66
+msgid "ai_socktype not supported"
+msgstr "ä¸æ”¯æ´ ai_socktype"
+
+#: lib/gai_strerror.c:67
+msgid "System error"
+msgstr "系統錯誤"
+
+#: lib/gai_strerror.c:68
+msgid "Argument buffer too small"
+msgstr "åƒæ•¸ç·©è¡å€éŽå°"
+
+#: lib/gai_strerror.c:70
+msgid "Processing request in progress"
+msgstr "正在處ç†è«‹æ±‚"
+
+#: lib/gai_strerror.c:71
+msgid "Request canceled"
+msgstr "å·²å–消請求"
+
+#: lib/gai_strerror.c:72
+msgid "Request not canceled"
+msgstr "未å–消請求"
+
+#: lib/gai_strerror.c:73
+msgid "All requests done"
+msgstr "所有請求完æˆ"
+
+#: lib/gai_strerror.c:74
+msgid "Interrupted by a signal"
+msgstr "é­ä¿¡è™Ÿä¸­æ–·"
+
+#: lib/gai_strerror.c:75
+msgid "Parameter string not correctly encoded"
+msgstr "未正確編碼åƒæ•¸å­—串"
+
+#: lib/gai_strerror.c:87
+msgid "Unknown error"
+msgstr "未知錯誤"
+
+#: lib/getopt.c:278
+#, c-format
+msgid "%s: option '%s%s' is ambiguous\n"
+msgstr "%s:「%s%sã€é¸é …ä¸æ˜Žç¢º\n"
+
+#: lib/getopt.c:284
+#, c-format
+msgid "%s: option '%s%s' is ambiguous; possibilities:"
+msgstr "%s:「%s%sã€é¸é …ä¸æ˜Žç¢ºï¼›å¯èƒ½æ˜¯ï¼š"
+
+#: lib/getopt.c:319
+#, c-format
+msgid "%s: unrecognized option '%s%s'\n"
+msgstr "%s:無法識別「%s%sã€é¸é …\n"
+
+#: lib/getopt.c:345
+#, c-format
+msgid "%s: option '%s%s' doesn't allow an argument\n"
+msgstr "%s:「%s%sã€é¸é …ä¸æŽ¥å—åƒæ•¸\n"
+
+#: lib/getopt.c:360
+#, c-format
+msgid "%s: option '%s%s' requires an argument\n"
+msgstr "%s:「%s%sã€é¸é …需è¦åƒæ•¸\n"
+
+#: lib/getopt.c:621
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s:無效é¸é … -- '%c'\n"
+
+#: lib/getopt.c:636 lib/getopt.c:682
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s:é¸é …需è¦åƒæ•¸ -- '%c'\n"
+
+#: lib/openat-die.c:38
+#, c-format
+msgid "unable to record current working directory"
+msgstr "無法記錄目å‰å·¥ä½œç›®éŒ„"
+
+#: lib/openat-die.c:57
+#, c-format
+msgid "failed to return to initial working directory"
+msgstr "無法回到åˆå§‹å·¥ä½œç›®éŒ„"
+
+#: lib/os2-spawn.c:46
+#, c-format
+msgid "_open_osfhandle failed"
+msgstr "_open_osfhandle 失敗"
+
+#: lib/os2-spawn.c:83
+#, c-format
+msgid "cannot restore fd %d: dup2 failed"
+msgstr "無法復原 fd %d:dup2 失敗"
+
+#. TRANSLATORS:
+#. Get translations for open and closing quotation marks.
+#. The message catalog should translate "`" to a left
+#. quotation mark suitable for the locale, and similarly for
+#. "'". For example, a French Unicode local should translate
+#. these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+#. QUOTATION MARK), respectively.
+#.
+#. If the catalog has no translation, we will try to
+#. use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+#. Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+#. current locale is not Unicode, locale_quoting_style
+#. will quote 'like this', and clocale_quoting_style will
+#. quote "like this". You should always include translations
+#. for "`" and "'" even if U+2018 and U+2019 are appropriate
+#. for your locale.
+#.
+#. If you don't know what to put here, please see
+#. <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+#. and use glyphs suitable for your language.
+#: lib/quotearg.c:355
+msgid "`"
+msgstr "「"
+
+#: lib/quotearg.c:356
+msgid "'"
+msgstr "ã€"
+
+#: lib/regcomp.c:135
+msgid "Success"
+msgstr "æˆåŠŸ"
+
+#: lib/regcomp.c:138
+msgid "No match"
+msgstr "無符åˆé …ç›®"
+
+#: lib/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "æ­£è¦è¡¨ç¤ºå¼ç„¡æ•ˆ"
+
+#: lib/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "定åºå­—元無效"
+
+#: lib/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "字元類型å稱無效"
+
+#: lib/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "末尾å斜線"
+
+#: lib/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "å‘後åƒè€ƒç„¡æ•ˆ"
+
+#: lib/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "ä¸å°ç¨±çš„ [ã€[^ã€[:ã€[. 或 [="
+
+#: lib/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "ä¸å°ç¨±çš„ ( 或 \\("
+
+#: lib/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "ä¸å°ç¨±çš„ \\{"
+
+#: lib/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "\\{\\} 中內容無效"
+
+#: lib/regcomp.c:168
+msgid "Invalid range end"
+msgstr "çµæŸç¯„åœç„¡æ•ˆ"
+
+#: lib/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "記憶體用盡"
+
+#: lib/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "å‰ç½®æ­£è¦è¡¨ç¤ºå¼ç„¡æ•ˆ"
+
+#: lib/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "æ­£è¦è¡¨ç¤ºå¼éŽæ—©çµæŸ"
+
+#: lib/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "æ­£è¦è¡¨ç¤ºå¼éŽé•·"
+
+#: lib/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "ä¸å°ç¨±çš„ ) 或 \\)"
+
+#: lib/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "沒有上一個正è¦è¡¨ç¤ºå¼"
+
+#: lib/spawn-pipe.c:218 lib/spawn-pipe.c:221 lib/spawn-pipe.c:460
+#: lib/spawn-pipe.c:463
+#, c-format
+msgid "cannot create pipe"
+msgstr "無法建立管線"
+
+#: lib/spawn-pipe.c:598 lib/wait-process.c:290 lib/wait-process.c:364
+#, c-format
+msgid "%s subprocess failed"
+msgstr "%s å­åŸ·è¡Œç¨‹åºåŸ·è¡Œå¤±æ•—"
+
+#: lib/wait-process.c:231 lib/wait-process.c:263 lib/wait-process.c:325
+#, c-format
+msgid "%s subprocess"
+msgstr "%s å­åŸ·è¡Œç¨‹åº"
+
+#: lib/wait-process.c:282 lib/wait-process.c:354
+#, c-format
+msgid "%s subprocess got fatal signal %d"
+msgstr "%s å­åŸ·è¡Œç¨‹åºæ”¶åˆ°åš´é‡éŒ¯èª¤ä¿¡è™Ÿ %d"
+
+#: lib/xalloc-die.c:34
+msgid "memory exhausted"
+msgstr "記憶體用盡"
+
+#, c-format
+#~ msgid "invalid argument %s for %s"
+#~ msgstr "傳入 %2$s 之åƒæ•¸ %1$s 無效"
+
+#, c-format
+#~ msgid "ambiguous argument %s for %s"
+#~ msgstr "傳入 %2$s 之åƒæ•¸ %1$s ä¸æ˜Žç¢º"
+
+#~ msgid "Valid arguments are:"
+#~ msgstr "有效的åƒæ•¸ç‚ºï¼š"
+
+#, c-format
+#~ msgid "ARGP_HELP_FMT: %s value is less than or equal to %s"
+#~ msgstr "ARGP_HELP_FMT:%s 值å°æ–¼æˆ–等於 %s"
+
+#, c-format
+#~ msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
+#~ msgstr "%.*s:ARGP_HELP_FMT åƒæ•¸éœ€è¦ä¸€å€‹å€¼"
+
+#, c-format
+#~ msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
+#~ msgstr "%.*s:未知 ARGP_HELP_FMT åƒæ•¸"
+
+#, c-format
+#~ msgid "Garbage in ARGP_HELP_FMT: %s"
+#~ msgstr "ARGP_HELP_FMT 中的廢棄內容:%s"
+
+#~ msgid ""
+#~ "Mandatory or optional arguments to long options are also mandatory or "
+#~ "optional for any corresponding short options."
+#~ msgstr "é•·é¸é …所使用的åƒæ•¸ï¼Œåœ¨ç›¸å°æ‡‰çš„短é¸é …也必須使用。"
+
+#~ msgid "Usage:"
+#~ msgstr "用法:"
+
+#~ msgid " or: "
+#~ msgstr " 或:"
+
+#~ msgid " [OPTION...]"
+#~ msgstr " [é¸é ……]"
+
+#, c-format
+#~ msgid "Try '%s --help' or '%s --usage' for more information.\n"
+#~ msgstr "嘗試「%s --helpã€æˆ–「%s --usageã€å–得更多資訊。\n"
+
+#, c-format
+#~ msgid "Report bugs to %s.\n"
+#~ msgstr "è«‹å‘ %s 匯報錯誤。\n"
+
+#~ msgid "give this help list"
+#~ msgstr "æ供此說明清單"
+
+#~ msgid "give a short usage message"
+#~ msgstr "æ供短用法訊æ¯"
+
+#~ msgid "NAME"
+#~ msgstr "å稱"
+
+#~ msgid "set the program name"
+#~ msgstr "設定程å¼å稱"
+
+#~ msgid "SECS"
+#~ msgstr "秒"
+
+#~ msgid "hang for SECS seconds (default 3600)"
+#~ msgstr "掛斷秒數(é è¨­ 3600)"
+
+#~ msgid "print program version"
+#~ msgstr "輸出程å¼ç‰ˆæœ¬"
+
+#~ msgid "(PROGRAM ERROR) No version known!?"
+#~ msgstr "(程å¼éŒ¯èª¤ï¼‰æ²’有已知版本?ï¼"
+
+#, c-format
+#~ msgid "%s: Too many arguments\n"
+#~ msgstr "%s:éŽå¤šåƒæ•¸\n"
+
+#~ msgid "(PROGRAM ERROR) Option should have been recognized!?"
+#~ msgstr "(程å¼éŒ¯èª¤ï¼‰é¸é …應該已被識別?ï¼"
+
+#, c-format
+#~ msgid "%u bitset_allocs, %u freed (%.2f%%).\n"
+#~ msgstr "%u bitset_allocs,已釋放 %u (%.2f%%)。\n"
+
+#, c-format
+#~ msgid "%u bitset_sets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_setsï¼Œå·²å¿«å– %u (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_resets, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_resetsï¼Œå·²å¿«å– %u (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_tests, %u cached (%.2f%%)\n"
+#~ msgstr "%u bitset_tests,%u å·²å¿«å– (%.2f%%)\n"
+
+#, c-format
+#~ msgid "%u bitset_lists\n"
+#~ msgstr "%u bitset_lists\n"
+
+#, c-format
+#~ msgid ""
+#~ "Bitset statistics:\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Bitset 統計:\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Accumulated runs = %u\n"
+#~ msgstr "ç´¯ç©åŸ·è¡Œæ¬¡æ•¸ = %u\n"
+
+#~ msgid "cannot read stats file"
+#~ msgstr "無法讀å–統計檔案"
+
+#, c-format
+#~ msgid "bad stats file size\n"
+#~ msgstr "統計檔案大å°ç„¡æ•ˆ\n"
+
+#~ msgid "cannot write stats file"
+#~ msgstr "無法寫入統計檔案"
+
+#~ msgid "cannot open stats file for writing"
+#~ msgstr "無法開啟統計檔案寫入"
+
+#~ msgid "program error"
+#~ msgstr "程å¼éŒ¯èª¤"
+
+#~ msgid "stack overflow"
+#~ msgstr "堆疊溢出"
+
+#~ msgid "cannot find a temporary directory, try setting $TMPDIR"
+#~ msgstr "未找到暫存目錄,請嘗試設定 $TMPDIR"
+
+#, c-format
+#~ msgid "cannot create a temporary directory using template \"%s\""
+#~ msgstr "無法使用「%sã€ç¯„本建立暫存目錄"
+
+#, c-format
+#~ msgid "cannot remove temporary file %s"
+#~ msgstr "無法移除暫存檔 %s"
+
+#, c-format
+#~ msgid "cannot remove temporary directory %s"
+#~ msgstr "無法移除暫存目錄 %s"
+
+#~ msgid "error closing file"
+#~ msgstr "關閉檔案時發生錯誤"
+
+#~ msgid "write error"
+#~ msgstr "寫入時發生錯誤"
+
+#, c-format
+#~ msgid "preserving permissions for %s"
+#~ msgstr "正在ä¿ç•™ %s 的權é™"
+
+#, c-format
+#~ msgid "error while opening %s for reading"
+#~ msgstr "é–‹å•Ÿ %s 讀å–時發生錯誤"
+
+#, c-format
+#~ msgid "cannot open backup file %s for writing"
+#~ msgstr "無法開啟備份檔 %s 寫入"
+
+#, c-format
+#~ msgid "error reading %s"
+#~ msgstr "è®€å– %s 時發生錯誤"
+
+#, c-format
+#~ msgid "error writing %s"
+#~ msgstr "寫入 %s 時發生錯誤"
+
+#, c-format
+#~ msgid "error after reading %s"
+#~ msgstr "è®€å– %s 後發生錯誤"
+
+#~ msgid "fdopen() failed"
+#~ msgstr "fdopen() 失敗"
+
+#~ msgid "C# compiler not found, try installing mono"
+#~ msgstr "未找到 C# ç·¨è­¯å™¨ï¼Œå˜—è©¦å®‰è£ mono"
+
+#~ msgid "C# virtual machine not found, try installing mono"
+#~ msgstr "未找到 C# è™›æ“¬æ©Ÿï¼Œå˜—è©¦å®‰è£ mono"
+
+#~ msgid "unbalanced ["
+#~ msgstr "ä¸å°ç¨±çš„ ["
+
+#~ msgid "invalid character class"
+#~ msgstr "字元類型無效"
+
+#~ msgid "character class syntax is [[:space:]], not [:space:]"
+#~ msgstr "字元類型語法為 [[:space:]] è€Œéž [:space:]"
+
+#~ msgid "unfinished \\ escape"
+#~ msgstr "未完æˆçš„ \\ 跳脫字元"
+
+#~ msgid "invalid content of \\{\\}"
+#~ msgstr "\\{\\} 的內容無效"
+
+#~ msgid "regular expression too big"
+#~ msgstr "æ­£è¦è¡¨ç¤ºå¼éŽé•·"
+
+#~ msgid "unbalanced ("
+#~ msgstr "ä¸å°ç¨±çš„ ("
+
+#~ msgid "no syntax specified"
+#~ msgstr "未指定語法"
+
+#~ msgid "unbalanced )"
+#~ msgstr "ä¸å°ç¨±çš„ )"
+
+#~ msgid "regular empty file"
+#~ msgstr "一般空白檔案"
+
+#~ msgid "regular file"
+#~ msgstr "一般檔案"
+
+#~ msgid "directory"
+#~ msgstr "目錄"
+
+#~ msgid "symbolic link"
+#~ msgstr "符號連çµ"
+
+#~ msgid "message queue"
+#~ msgstr "訊æ¯ä½‡åˆ—"
+
+#~ msgid "semaphore"
+#~ msgstr "旗號"
+
+#~ msgid "shared memory object"
+#~ msgstr "共用記憶體物件"
+
+#~ msgid "typed memory object"
+#~ msgstr "具類型記憶體物件"
+
+#~ msgid "block special file"
+#~ msgstr "å€å¡Šç‰¹æ®Šæª”案"
+
+#~ msgid "character special file"
+#~ msgstr "字元特殊檔案"
+
+#~ msgid "contiguous data"
+#~ msgstr "連續資料"
+
+#~ msgid "fifo"
+#~ msgstr "fifo"
+
+#~ msgid "door"
+#~ msgstr "é–€ (door)"
+
+#~ msgid "multiplexed block special file"
+#~ msgstr "多工å€å¡Šç‰¹æ®Šæª”"
+
+#~ msgid "multiplexed character special file"
+#~ msgstr "多工字元特殊檔"
+
+#~ msgid "multiplexed file"
+#~ msgstr "多工檔案"
+
+#~ msgid "named file"
+#~ msgstr "命å檔案"
+
+#~ msgid "network special file"
+#~ msgstr "網路特殊檔案"
+
+#~ msgid "migrated file with data"
+#~ msgstr "移轉檔(å«è³‡æ–™ï¼‰"
+
+#~ msgid "migrated file without data"
+#~ msgstr "移轉檔(ä¸å«è³‡æ–™ï¼‰"
+
+#~ msgid "port"
+#~ msgstr "連線埠"
+
+#~ msgid "socket"
+#~ msgstr "socket"
+
+#~ msgid "whiteout"
+#~ msgstr "whiteout"
+
+#~ msgid "weird file"
+#~ msgstr "ä¸æ­£å¸¸æª”案"
+
+#~ msgid "invalid source_version argument to compile_java_class"
+#~ msgstr "傳入 compile_java_class çš„ source_version åƒæ•¸ç„¡æ•ˆ"
+
+#~ msgid "invalid target_version argument to compile_java_class"
+#~ msgstr "傳入 compile_java_class çš„ target_version åƒæ•¸ç„¡æ•ˆ"
+
+#, c-format
+#~ msgid "failed to create \"%s\""
+#~ msgstr "無法建立「%sã€"
+
+#, c-format
+#~ msgid "error while writing \"%s\" file"
+#~ msgstr "寫入「%sã€æª”時發生錯誤"
+
+#~ msgid "Java compiler not found, try installing gcj or set $JAVAC"
+#~ msgstr "未找到 Java ç·¨è­¯å™¨ã€‚å˜—è©¦å®‰è£ gcj,或設定 $JAVAC"
+
+#~ msgid "Java virtual machine not found, try installing gij or set $JAVA"
+#~ msgstr "未找到 Java è™›æ“¬æ©Ÿã€‚å˜—è©¦å®‰è£ gij,或設定 $JAVA"
+
+#, c-format
+#~ msgid "%s subprocess I/O error"
+#~ msgstr "%s å­åŸ·è¡Œç¨‹åºç™¼ç”Ÿ I/O 錯誤"
+
+#, c-format
+#~ msgid "cannot stat %s"
+#~ msgstr "無法å–å¾— %s 的資訊"
+
+#, c-format
+#~ msgid "cannot change permissions of %s"
+#~ msgstr "無法變更 %s 的權é™"
+
+#, c-format
+#~ msgid "cannot create directory %s"
+#~ msgstr "無法建立 %s 目錄"
+
+#~ msgid "Failed to open /dev/zero for read"
+#~ msgstr "無法開啟 /dev/zero 讀å–"
+
+#~ msgid "creation of reading thread failed"
+#~ msgstr "建立讀å–執行緒失敗"
+
+#, c-format
+#~ msgid "cannot set up nonblocking I/O to %s subprocess"
+#~ msgstr "ç„¡æ³•å° %s å­åŸ·è¡Œç¨‹åºè¨­å®šéžå°éŽ– I/O"
+
+#, c-format
+#~ msgid "communication with %s subprocess failed"
+#~ msgstr "與 %s å­åŸ·è¡Œç¨‹åºé€šè¨Šå¤±æ•—"
+
+#, c-format
+#~ msgid "write to %s subprocess failed"
+#~ msgstr "寫入 %s å­ç¨‹åºå¤±æ•—"
+
+#, c-format
+#~ msgid "read from %s subprocess failed"
+#~ msgstr "自 %s å­åŸ·è¡Œç¨‹åºè®€å–失敗"
+
+#, c-format
+#~ msgid "subprocess %s terminated with exit code %d"
+#~ msgstr "å­åŸ·è¡Œç¨‹åº %s 終止,çµæŸç¢¼ %d"
+
+#~ msgid "creation of threads failed"
+#~ msgstr "建立執行緒失敗"
+
+#, c-format
+#~ msgid "%s subprocess terminated with exit code %d"
+#~ msgstr "å­åŸ·è¡Œç¨‹åº %s 終止,çµæŸç¢¼ %d"
+
+#~ msgid "^[yY]"
+#~ msgstr "^[yY]"
+
+#~ msgid "^[nN]"
+#~ msgstr "^[nN]"
+
+#, c-format
+#~ msgid "setting permissions for %s"
+#~ msgstr "正在設定 %s 的權é™"
+
+#~ msgid "Hangup"
+#~ msgstr "掛斷"
+
+#~ msgid "Interrupt"
+#~ msgstr "中斷"
+
+#~ msgid "Quit"
+#~ msgstr "退出"
+
+#~ msgid "Illegal instruction"
+#~ msgstr "無效指令"
+
+#~ msgid "Trace/breakpoint trap"
+#~ msgstr "追蹤 / 斷點陷阱"
+
+#~ msgid "Aborted"
+#~ msgstr "中止"
+
+#~ msgid "Floating point exception"
+#~ msgstr "浮點數例外"
+
+#~ msgid "Killed"
+#~ msgstr "強制çµæŸ"
+
+#~ msgid "Bus error"
+#~ msgstr "匯æµæŽ’錯誤"
+
+#~ msgid "Segmentation fault"
+#~ msgstr "程å¼è¨˜æ†¶é«”å€æ®µéŒ¯èª¤"
+
+#~ msgid "Broken pipe"
+#~ msgstr "管線æ壞"
+
+#~ msgid "Alarm clock"
+#~ msgstr "鬧é˜"
+
+#~ msgid "Terminated"
+#~ msgstr "終止"
+
+#~ msgid "Urgent I/O condition"
+#~ msgstr "緊急 I/O æ¢ä»¶"
+
+#~ msgid "Stopped (signal)"
+#~ msgstr "åœæ­¢ï¼ˆä¿¡è™Ÿï¼‰"
+
+#~ msgid "Stopped"
+#~ msgstr "åœæ­¢"
+
+#~ msgid "Continued"
+#~ msgstr "繼續"
+
+#~ msgid "Child exited"
+#~ msgstr "å­ç¨‹åºé€€å‡º"
+
+#~ msgid "Stopped (tty input)"
+#~ msgstr "åœæ­¢ï¼ˆtty 輸入)"
+
+#~ msgid "Stopped (tty output)"
+#~ msgstr "åœæ­¢ï¼ˆtty 輸出)"
+
+#~ msgid "I/O possible"
+#~ msgstr "å¯èƒ½ I/O"
+
+#~ msgid "CPU time limit exceeded"
+#~ msgstr "åˆ°é” CPU 時間上é™"
+
+#~ msgid "File size limit exceeded"
+#~ msgstr "到é”檔案大å°ä¸Šé™"
+
+#~ msgid "Virtual timer expired"
+#~ msgstr "虛擬計時器éŽæœŸ"
+
+#~ msgid "Profiling timer expired"
+#~ msgstr "分æžè¨ˆæ™‚器éŽæœŸ"
+
+#~ msgid "Window changed"
+#~ msgstr "已變更視窗"
+
+#~ msgid "User defined signal 1"
+#~ msgstr "使用者定義信號 1"
+
+#~ msgid "User defined signal 2"
+#~ msgstr "使用者定義信號 2"
+
+#~ msgid "EMT trap"
+#~ msgstr "EMT 陷阱"
+
+#~ msgid "Bad system call"
+#~ msgstr "無效系統呼å«"
+
+#~ msgid "Stack fault"
+#~ msgstr "堆疊錯誤"
+
+#~ msgid "Information request"
+#~ msgstr "資訊請求"
+
+#~ msgid "Power failure"
+#~ msgstr "é›»æºéŒ¯èª¤"
+
+#~ msgid "Resource lost"
+#~ msgstr "資æºéºå¤±"
+
+#~ msgid "error writing to a closed pipe or socket"
+#~ msgstr "寫入已關閉管線或 socket 時發生錯誤"
+
+#, c-format
+#~ msgid "Real-time signal %d"
+#~ msgstr "å³æ™‚信號 %d"
+
+#, c-format
+#~ msgid "Unknown signal %d"
+#~ msgstr "未知信號 %d"
+
+#~ msgid "Execution times (seconds)"
+#~ msgstr "執行次數(秒)"
+
+#~ msgid "CPU user"
+#~ msgstr "CPU 使用者"
+
+#~ msgid "CPU system"
+#~ msgstr "CPU 系統"
+
+#~ msgid "wall clock"
+#~ msgstr "掛é˜"
+
+#~ msgid "iconv function not usable"
+#~ msgstr "iconv 功能沒有用"
+
+#~ msgid "iconv function not available"
+#~ msgstr "iconv 功能ä¸èƒ½ä½¿ç”¨"
+
+#~ msgid "character out of range"
+#~ msgstr "字元超出範åœ"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set"
+#~ msgstr "無法將 U+%04X 轉æ›è‡³ä½¿ç”¨è€…的字元集"
+
+#, c-format
+#~ msgid "cannot convert U+%04X to local character set: %s"
+#~ msgstr "無法將 U+%04X 轉æ›è‡³ä½¿ç”¨è€…的字元集:%s"
+
+#~ msgid "invalid user"
+#~ msgstr "使用者無效"
+
+#~ msgid "invalid group"
+#~ msgstr "群組無效"
+
+#~ msgid "invalid spec"
+#~ msgstr "è¦æ ¼ç„¡æ•ˆ"
+
+#~ msgid "unable to display error message"
+#~ msgstr "無法顯示錯誤訊æ¯"
+
+#, c-format
+#~ msgid "Packaged by %s (%s)\n"
+#~ msgstr "由 %s (%s) 打包\n"
+
+#, c-format
+#~ msgid "Packaged by %s\n"
+#~ msgstr "由 %s 打包\n"
+
+#~ msgid "(C)"
+#~ msgstr "(C)"
+
+#, c-format
+#~ msgid ""
+#~ "License GPLv3+: GNU GPL version 3 or later <%s>.\n"
+#~ "This is free software: you are free to change and redistribute it.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ msgstr ""
+#~ "GPLv3+ 授權:GNU GPL 第三版或更新版本 <%s>。\n"
+#~ "此為自由軟體:您能自由變更åŠé‡æ•£ä½ˆã€‚\n"
+#~ "在法律所å…許的範åœä¹‹å…§ã€Œæ²’有任何ä¿è­‰ã€ã€‚\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Written by %s.\n"
+#~ msgstr "由 %s 編寫。\n"
+
+#, c-format
+#~ msgid "Written by %s and %s.\n"
+#~ msgstr "由 %s 和 %s 編寫。\n"
+
+#, c-format
+#~ msgid "Written by %s, %s, and %s.\n"
+#~ msgstr "ç”± %sã€%s å’Œ %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%s\n"
+#~ "和 %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%s 和 %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€\n"
+#~ "%sã€%s å’Œ %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€%sã€\n"
+#~ "%sã€%s å’Œ %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€%sã€\n"
+#~ "%sã€%sã€%s å’Œ %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, and %s.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€%sã€\n"
+#~ "%sã€%sã€%sã€%s\n"
+#~ "和 %s 編寫。\n"
+
+#, c-format
+#~ msgid ""
+#~ "Written by %s, %s, %s,\n"
+#~ "%s, %s, %s, %s,\n"
+#~ "%s, %s, and others.\n"
+#~ msgstr ""
+#~ "ç”± %sã€%sã€%sã€%sã€\n"
+#~ "%sã€%sã€%sã€%s\n"
+#~ "和 %s 等人編寫。\n"
+
+#, c-format
+#~ msgid "Report bugs to: %s\n"
+#~ msgstr "匯報錯誤至:%s\n"
+
+#, c-format
+#~ msgid "Report %s bugs to: %s\n"
+#~ msgstr "請將 %s 的臭蟲匯報至:%s\n"
+
+#, c-format
+#~ msgid "%s home page: <%s>\n"
+#~ msgstr "%s 首é ï¼š<%s>\n"
+
+#, c-format
+#~ msgid "General help using GNU software: <%s>\n"
+#~ msgstr "使用 GNU 軟體的一般說明:<%s>\n"
+
+#~ msgid "failed to set file descriptor text/binary mode"
+#~ msgstr "無法將檔案æ述符設定æˆæ–‡å­— / 二進ä½æ¨¡å¼"
+
+#~ msgid "stdin"
+#~ msgstr "標準輸入"
+
+#~ msgid "stdout"
+#~ msgstr "標準輸出"
+
+#~ msgid "stderr"
+#~ msgstr "標準錯誤"
+
+#~ msgid "unknown stream"
+#~ msgstr "未知串æµ"
+
+#, c-format
+#~ msgid "failed to reopen %s with mode %s"
+#~ msgstr "無法使用 %2$s 模å¼é‡é–‹å•Ÿ %1$s"
+
+#~ msgid "string comparison failed"
+#~ msgstr "比較字串失敗"
+
+#~ msgid "Set LC_ALL='C' to work around the problem."
+#~ msgstr "請設定 LC_ALL='C' é¿å…æ­¤å•é¡Œç™¼ç”Ÿã€‚"
+
+#, c-format
+#~ msgid "The strings compared were %s and %s."
+#~ msgstr "è¦æ¯”較的字串為 %s å’Œ %s。"
+
+#~ msgid "cannot perform formatted output"
+#~ msgstr "無法執行格å¼åŒ–輸出"
+
+#~ msgid "standard file descriptors"
+#~ msgstr "標準檔案æ述符"
+
+#, c-format
+#~ msgid "invalid %s%s argument '%s'"
+#~ msgstr "%s%s åƒæ•¸ã€Œ%sã€ç„¡æ•ˆ"
+
+#, c-format
+#~ msgid "invalid suffix in %s%s argument '%s'"
+#~ msgstr "%s%s åƒæ•¸ã€Œ%sã€æœ‰ç„¡æ•ˆå¾Œç¶´"
+
+#, c-format
+#~ msgid "%s%s argument '%s' too large"
+#~ msgstr "%s%s åƒæ•¸ã€Œ%sã€éŽé•·"
+
+#~ msgid "%s home page: <https://www.gnu.org/software/%s/>\n"
+#~ msgstr "%s 首é ï¼š<https://www.gnu.org/software/%s/>\n"
+
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s:é¸é …‘--%s’ä¸å¯é…åˆåƒæ•¸ä½¿ç”¨\n"
+
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s:無法識別的é¸é …‘--%s’\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s:ä¸åˆæ³•çš„é¸é … ─ %c\n"
+
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s:é¸é …‘-W %s’ä¸æ˜Žç¢º\n"
+
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s:é¸é …‘-W %s’ä¸å¯é…åˆåƒæ•¸ä½¿ç”¨\n"
+
+#, fuzzy
+#~ msgid "block size"
+#~ msgstr "å€å¡Šç‰¹æ®Šæª”案"
+
+#~ msgid "%s exists but is not a directory"
+#~ msgstr "%s已存在但ä¸æ˜¯ç›®éŒ„"
+
+#~ msgid "cannot change owner and/or group of %s"
+#~ msgstr "無法更改%sçš„æ“有者和/或所屬群組"
+
+#~ msgid "cannot chdir to directory %s"
+#~ msgstr "無法進入%s目錄"
+
+#~ msgid "cannot get the login group of a numeric UID"
+#~ msgstr "無法å–å¾— UID 數值所代表的登入群組"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "This is free software. You may redistribute copies of it under the terms "
+#~ "of\n"
+#~ "the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.\n"
+#~ "There is NO WARRANTY, to the extent permitted by law.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "本程å¼æ˜¯è‡ªç”±è»Ÿé«”;你å¯ä»¥æ ¹æ“š Free Software Foundation 所公佈的 GNU\n"
+#~ "General Public License 第二版或(自由é¸æ“‡)較新的版本中的æ¢æ¬¾åŽ»é‡æ–°\n"
+#~ "散佈åŠ/或修改本軟體。\n"
+#~ "\n"
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644
index 0000000..e58fa28
--- /dev/null
+++ b/lib/Makefile.am
@@ -0,0 +1,14 @@
+MOSTLYCLEANFILES =
+noinst_LTLIBRARIES =
+EXTRA_DIST =
+BUILT_SOURCES =
+MOSTLYCLEANDIRS =
+CLEANFILES =
+SUFFIXES =
+noinst_LIBRARIES =
+MAINTAINERCLEANFILES =
+
+AM_CFLAGS = $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS)
+AM_CPPFLAGS =
+
+include gnulib.mk
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644
index 0000000..08feadc
--- /dev/null
+++ b/lib/Makefile.in
@@ -0,0 +1,5047 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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@
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+# --lib=libgnu \
+# --source-base=lib \
+# --m4-base=m4 \
+# --po-base=gnulib_po \
+# --doc-base=doc \
+# --tests-base=lib/tests \
+# --aux-dir=build-aux \
+# --makefile-name=gnulib.mk \
+# --no-conditional-dependencies \
+# --no-libtool \
+# --macro-prefix=gl \
+# --po-domain=wget \
+# accept \
+# announce-gen \
+# base32 \
+# bind \
+# c-ctype \
+# c-strcase \
+# c-strcasestr \
+# clock-time \
+# close \
+# connect \
+# crypto/md2 \
+# crypto/md4 \
+# crypto/md5 \
+# crypto/sha1 \
+# crypto/sha256 \
+# crypto/sha512 \
+# dirname \
+# fcntl \
+# flock \
+# fnmatch-gnu \
+# fopen \
+# ftello \
+# futimens \
+# getaddrinfo \
+# getline \
+# getopt-gnu \
+# getpass-gnu \
+# getpeername \
+# getsockname \
+# gettext-h \
+# git-version-gen \
+# gitlog-to-changelog \
+# gnupload \
+# group-member \
+# hostent \
+# iconv \
+# iconv-h \
+# inet_ntop \
+# intprops \
+# inttypes \
+# ioctl \
+# langinfo \
+# libunistring-optional \
+# limits-h \
+# link \
+# listen \
+# maintainer-makefile \
+# mbiter \
+# mbtowc \
+# memrchr \
+# mkdir \
+# mkostemp \
+# mkstemp \
+# nanosleep \
+# open \
+# pipe-posix \
+# posix_spawn \
+# quote \
+# quotearg \
+# recv \
+# regex \
+# select \
+# send \
+# setsockopt \
+# signal-h \
+# sigpipe \
+# sigprocmask \
+# snprintf \
+# socket \
+# spawn-pipe \
+# stat \
+# stdbool \
+# stdint \
+# strcase \
+# strerror_r-posix \
+# strpbrk \
+# strptime \
+# strtok_r \
+# strtol \
+# strtoll \
+# symlink \
+# sys_types \
+# timegm \
+# tmpdir \
+# unicase/u8-tolower \
+# unistr/u8-strlen \
+# unlink \
+# unlocked-io \
+# update-copyright \
+# utime \
+# utime-h \
+# utimens \
+# vasprintf \
+# vsnprintf \
+# warnings \
+# wcwidth \
+# write \
+# xmemdup0 \
+# xstrndup
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE@am__append_1 = unicase/empty-prefix-context.c
+@LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE@am__append_2 = unicase/empty-suffix-context.c
+@LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE@am__append_3 = unicase/tolower.c
+@LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE@am__append_4 = unicase/u8-tolower.c
+@LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE@am__append_5 = unictype/combiningclass.c
+@LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE@am__append_6 = unictype/pr_soft_dotted.c
+@LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE@am__append_7 = uninorm/u8-normalize.c
+@LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE@am__append_8 = unistr/u8-cpy.c
+@LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@am__append_9 = unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c
+@LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE@am__append_10 = unistr/u8-strlen.c
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__append_11 = unistr/u8-uctomb.c unistr/u8-uctomb-aux.c
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__append_12 = uniwidth/width.c
+subdir = lib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libgnu_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 =
+am__libgnu_a_SOURCES_DIST = openat-priv.h openat-proc.c base32.h \
+ base32.c basename-lgpl.c binary-io.h binary-io.c bitrotate.h \
+ bitrotate.c c-ctype.h c-ctype.c c-strcase.h c-strcasecmp.c \
+ c-strncasecmp.c c-strcasestr.h c-strcasestr.c canonicalize.c \
+ cloexec.c concat-filename.c af_alg.c md2.c md4.c md5.c sha1.c \
+ sha256.c sha512.c dirname.c basename.c dirname-lgpl.c \
+ stripslash.c exitfail.c fatal-signal.h fatal-signal.c \
+ fd-hook.c fd-safer-flag.c dup-safer-flag.c file-set.c \
+ filenamecat-lgpl.c findprog.h findprog-in.c freading.c \
+ getprogname.h getprogname.c gettext.h gettime.c hard-locale.c \
+ hash.c hash-pjw.h hash-pjw.c hash-triple-simple.c idx.h \
+ localcharset.c glthread/lock.h glthread/lock.c malloca.c \
+ mbchar.c mbiter.h mbiter.c minmax.h openat-die.c pipe2.c \
+ pipe2-safer.c quotearg.c save-cwd.c \
+ malloc/scratch_buffer_dupfree.c malloc/scratch_buffer_grow.c \
+ malloc/scratch_buffer_grow_preserve.c \
+ malloc/scratch_buffer_set_array_size.c setlocale_null.c \
+ sig-handler.c size_max.h sockets.h sockets.c spawn-pipe.h \
+ spawn-pipe.c stat-time.c strnlen1.h strnlen1.c sys_socket.c \
+ tempname.c glthread/threadlib.c timespec.c tmpdir.h tmpdir.c \
+ u64.c unicase/cased.c unicase/empty-prefix-context.c \
+ unicase/empty-suffix-context.c unicase/ignorable.c \
+ unicase/special-casing.c unicase/tolower.c \
+ unicase/u8-casemap.c unicase/u8-tolower.c \
+ unictype/combiningclass.c unictype/pr_soft_dotted.c \
+ uninorm/decompose-internal.c uninorm/u8-normalize.c unistd.c \
+ dup-safer.c fd-safer.c pipe-safer.c unistr/u8-cpy.c \
+ unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c \
+ unistr/u8-strlen.c unistr/u8-uctomb.c unistr/u8-uctomb-aux.c \
+ uniwidth/width.c utimens.c wait-process.h wait-process.c \
+ wctype-h.c xmalloc.c xalloc-die.c xmemdup0.h xmemdup0.c \
+ xsize.h xsize.c xstrndup.h xstrndup.c
+am__dirstamp = $(am__leading_dot)dirstamp
+@LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT_TRUE@am__objects_1 = unicase/empty-prefix-context.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT_TRUE@am__objects_2 = unicase/empty-suffix-context.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNICASE_TOLOWER_TRUE@am__objects_3 = unicase/tolower.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER_TRUE@am__objects_4 = unicase/u8-tolower.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS_TRUE@am__objects_5 = unictype/combiningclass.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED_TRUE@am__objects_6 = unictype/pr_soft_dotted.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE_TRUE@am__objects_7 = uninorm/u8-normalize.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_CPY_TRUE@am__objects_8 = unistr/u8-cpy.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@am__objects_9 = unistr/u8-mbtouc-unsafe.$(OBJEXT) \
+@LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE_TRUE@ unistr/u8-mbtouc-unsafe-aux.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN_TRUE@am__objects_10 = unistr/u8-strlen.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@am__objects_11 = unistr/u8-uctomb.$(OBJEXT) \
+@LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB_TRUE@ unistr/u8-uctomb-aux.$(OBJEXT)
+@LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH_TRUE@am__objects_12 = uniwidth/width.$(OBJEXT)
+am_libgnu_a_OBJECTS = openat-proc.$(OBJEXT) base32.$(OBJEXT) \
+ basename-lgpl.$(OBJEXT) binary-io.$(OBJEXT) \
+ bitrotate.$(OBJEXT) c-ctype.$(OBJEXT) c-strcasecmp.$(OBJEXT) \
+ c-strncasecmp.$(OBJEXT) c-strcasestr.$(OBJEXT) \
+ canonicalize.$(OBJEXT) cloexec.$(OBJEXT) \
+ concat-filename.$(OBJEXT) af_alg.$(OBJEXT) md2.$(OBJEXT) \
+ md4.$(OBJEXT) md5.$(OBJEXT) sha1.$(OBJEXT) sha256.$(OBJEXT) \
+ sha512.$(OBJEXT) dirname.$(OBJEXT) basename.$(OBJEXT) \
+ dirname-lgpl.$(OBJEXT) stripslash.$(OBJEXT) exitfail.$(OBJEXT) \
+ fatal-signal.$(OBJEXT) fd-hook.$(OBJEXT) \
+ fd-safer-flag.$(OBJEXT) dup-safer-flag.$(OBJEXT) \
+ file-set.$(OBJEXT) filenamecat-lgpl.$(OBJEXT) \
+ findprog-in.$(OBJEXT) freading.$(OBJEXT) getprogname.$(OBJEXT) \
+ gettime.$(OBJEXT) hard-locale.$(OBJEXT) hash.$(OBJEXT) \
+ hash-pjw.$(OBJEXT) hash-triple-simple.$(OBJEXT) \
+ localcharset.$(OBJEXT) glthread/lock.$(OBJEXT) \
+ malloca.$(OBJEXT) mbchar.$(OBJEXT) mbiter.$(OBJEXT) \
+ openat-die.$(OBJEXT) pipe2.$(OBJEXT) pipe2-safer.$(OBJEXT) \
+ quotearg.$(OBJEXT) save-cwd.$(OBJEXT) \
+ malloc/scratch_buffer_dupfree.$(OBJEXT) \
+ malloc/scratch_buffer_grow.$(OBJEXT) \
+ malloc/scratch_buffer_grow_preserve.$(OBJEXT) \
+ malloc/scratch_buffer_set_array_size.$(OBJEXT) \
+ setlocale_null.$(OBJEXT) sig-handler.$(OBJEXT) \
+ sockets.$(OBJEXT) spawn-pipe.$(OBJEXT) stat-time.$(OBJEXT) \
+ strnlen1.$(OBJEXT) sys_socket.$(OBJEXT) tempname.$(OBJEXT) \
+ glthread/threadlib.$(OBJEXT) timespec.$(OBJEXT) \
+ tmpdir.$(OBJEXT) u64.$(OBJEXT) unicase/cased.$(OBJEXT) \
+ $(am__objects_1) $(am__objects_2) unicase/ignorable.$(OBJEXT) \
+ unicase/special-casing.$(OBJEXT) $(am__objects_3) \
+ unicase/u8-casemap.$(OBJEXT) $(am__objects_4) $(am__objects_5) \
+ $(am__objects_6) uninorm/decompose-internal.$(OBJEXT) \
+ $(am__objects_7) unistd.$(OBJEXT) dup-safer.$(OBJEXT) \
+ fd-safer.$(OBJEXT) pipe-safer.$(OBJEXT) $(am__objects_8) \
+ $(am__objects_9) $(am__objects_10) $(am__objects_11) \
+ $(am__objects_12) utimens.$(OBJEXT) wait-process.$(OBJEXT) \
+ wctype-h.$(OBJEXT) xmalloc.$(OBJEXT) xalloc-die.$(OBJEXT) \
+ xmemdup0.$(OBJEXT) xsize.$(OBJEXT) xstrndup.$(OBJEXT)
+libgnu_a_OBJECTS = $(am_libgnu_a_OBJECTS)
+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)/src
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/accept.Po ./$(DEPDIR)/access.Po \
+ ./$(DEPDIR)/af_alg.Po ./$(DEPDIR)/alloca.Po \
+ ./$(DEPDIR)/asnprintf.Po ./$(DEPDIR)/asprintf.Po \
+ ./$(DEPDIR)/at-func.Po ./$(DEPDIR)/base32.Po \
+ ./$(DEPDIR)/basename-lgpl.Po ./$(DEPDIR)/basename.Po \
+ ./$(DEPDIR)/binary-io.Po ./$(DEPDIR)/bind.Po \
+ ./$(DEPDIR)/bitrotate.Po ./$(DEPDIR)/btowc.Po \
+ ./$(DEPDIR)/c-ctype.Po ./$(DEPDIR)/c-strcasecmp.Po \
+ ./$(DEPDIR)/c-strcasestr.Po ./$(DEPDIR)/c-strncasecmp.Po \
+ ./$(DEPDIR)/canonicalize.Po ./$(DEPDIR)/chdir-long.Po \
+ ./$(DEPDIR)/cloexec.Po ./$(DEPDIR)/close.Po \
+ ./$(DEPDIR)/closedir.Po ./$(DEPDIR)/concat-filename.Po \
+ ./$(DEPDIR)/connect.Po ./$(DEPDIR)/dirfd.Po \
+ ./$(DEPDIR)/dirname-lgpl.Po ./$(DEPDIR)/dirname.Po \
+ ./$(DEPDIR)/dup-safer-flag.Po ./$(DEPDIR)/dup-safer.Po \
+ ./$(DEPDIR)/dup.Po ./$(DEPDIR)/dup2.Po ./$(DEPDIR)/error.Po \
+ ./$(DEPDIR)/exitfail.Po ./$(DEPDIR)/fatal-signal.Po \
+ ./$(DEPDIR)/fchdir.Po ./$(DEPDIR)/fcntl.Po \
+ ./$(DEPDIR)/fd-hook.Po ./$(DEPDIR)/fd-safer-flag.Po \
+ ./$(DEPDIR)/fd-safer.Po ./$(DEPDIR)/fdopendir.Po \
+ ./$(DEPDIR)/fflush.Po ./$(DEPDIR)/file-set.Po \
+ ./$(DEPDIR)/filenamecat-lgpl.Po ./$(DEPDIR)/findprog-in.Po \
+ ./$(DEPDIR)/float.Po ./$(DEPDIR)/flock.Po \
+ ./$(DEPDIR)/fnmatch.Po ./$(DEPDIR)/fnmatch_loop.Po \
+ ./$(DEPDIR)/fopen.Po ./$(DEPDIR)/fpurge.Po \
+ ./$(DEPDIR)/freading.Po ./$(DEPDIR)/free.Po \
+ ./$(DEPDIR)/fseek.Po ./$(DEPDIR)/fseeko.Po \
+ ./$(DEPDIR)/fstat.Po ./$(DEPDIR)/fstatat.Po \
+ ./$(DEPDIR)/ftell.Po ./$(DEPDIR)/ftello.Po \
+ ./$(DEPDIR)/futimens.Po ./$(DEPDIR)/gai_strerror.Po \
+ ./$(DEPDIR)/getaddrinfo.Po ./$(DEPDIR)/getcwd-lgpl.Po \
+ ./$(DEPDIR)/getcwd.Po ./$(DEPDIR)/getdelim.Po \
+ ./$(DEPDIR)/getdtablesize.Po ./$(DEPDIR)/getgroups.Po \
+ ./$(DEPDIR)/getline.Po ./$(DEPDIR)/getopt.Po \
+ ./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/getpass.Po \
+ ./$(DEPDIR)/getpeername.Po ./$(DEPDIR)/getprogname.Po \
+ ./$(DEPDIR)/getrandom.Po ./$(DEPDIR)/getsockname.Po \
+ ./$(DEPDIR)/gettime.Po ./$(DEPDIR)/gettimeofday.Po \
+ ./$(DEPDIR)/group-member.Po ./$(DEPDIR)/hard-locale.Po \
+ ./$(DEPDIR)/hash-pjw.Po ./$(DEPDIR)/hash-triple-simple.Po \
+ ./$(DEPDIR)/hash.Po ./$(DEPDIR)/inet_ntop.Po \
+ ./$(DEPDIR)/ioctl.Po ./$(DEPDIR)/isblank.Po \
+ ./$(DEPDIR)/iswblank.Po ./$(DEPDIR)/iswdigit.Po \
+ ./$(DEPDIR)/iswxdigit.Po ./$(DEPDIR)/itold.Po \
+ ./$(DEPDIR)/lc-charset-dispatch.Po ./$(DEPDIR)/link.Po \
+ ./$(DEPDIR)/listen.Po ./$(DEPDIR)/localcharset.Po \
+ ./$(DEPDIR)/localeconv.Po ./$(DEPDIR)/lseek.Po \
+ ./$(DEPDIR)/lstat.Po ./$(DEPDIR)/malloc.Po \
+ ./$(DEPDIR)/malloca.Po ./$(DEPDIR)/mbchar.Po \
+ ./$(DEPDIR)/mbiter.Po ./$(DEPDIR)/mbrtowc.Po \
+ ./$(DEPDIR)/mbsinit.Po ./$(DEPDIR)/mbsrtowcs-state.Po \
+ ./$(DEPDIR)/mbsrtowcs.Po ./$(DEPDIR)/mbtowc-lock.Po \
+ ./$(DEPDIR)/mbtowc.Po ./$(DEPDIR)/md2.Po ./$(DEPDIR)/md4.Po \
+ ./$(DEPDIR)/md5.Po ./$(DEPDIR)/memchr.Po \
+ ./$(DEPDIR)/mempcpy.Po ./$(DEPDIR)/memrchr.Po \
+ ./$(DEPDIR)/mkdir.Po ./$(DEPDIR)/mkostemp.Po \
+ ./$(DEPDIR)/mkstemp.Po ./$(DEPDIR)/mktime.Po \
+ ./$(DEPDIR)/msvc-inval.Po ./$(DEPDIR)/msvc-nothrow.Po \
+ ./$(DEPDIR)/nanosleep.Po ./$(DEPDIR)/nl_langinfo-lock.Po \
+ ./$(DEPDIR)/nl_langinfo.Po ./$(DEPDIR)/open.Po \
+ ./$(DEPDIR)/openat-die.Po ./$(DEPDIR)/openat-proc.Po \
+ ./$(DEPDIR)/openat.Po ./$(DEPDIR)/opendir.Po \
+ ./$(DEPDIR)/os2-spawn.Po ./$(DEPDIR)/pipe-safer.Po \
+ ./$(DEPDIR)/pipe.Po ./$(DEPDIR)/pipe2-safer.Po \
+ ./$(DEPDIR)/pipe2.Po ./$(DEPDIR)/printf-args.Po \
+ ./$(DEPDIR)/printf-parse.Po ./$(DEPDIR)/quotearg.Po \
+ ./$(DEPDIR)/raise.Po ./$(DEPDIR)/rawmemchr.Po \
+ ./$(DEPDIR)/readdir.Po ./$(DEPDIR)/readlink.Po \
+ ./$(DEPDIR)/realloc.Po ./$(DEPDIR)/recv.Po \
+ ./$(DEPDIR)/regcomp.Po ./$(DEPDIR)/regex.Po \
+ ./$(DEPDIR)/regex_internal.Po ./$(DEPDIR)/regexec.Po \
+ ./$(DEPDIR)/rewinddir.Po ./$(DEPDIR)/save-cwd.Po \
+ ./$(DEPDIR)/secure_getenv.Po ./$(DEPDIR)/select.Po \
+ ./$(DEPDIR)/send.Po ./$(DEPDIR)/setlocale-lock.Po \
+ ./$(DEPDIR)/setlocale_null.Po ./$(DEPDIR)/setsockopt.Po \
+ ./$(DEPDIR)/sha1.Po ./$(DEPDIR)/sha256.Po \
+ ./$(DEPDIR)/sha512.Po ./$(DEPDIR)/sig-handler.Po \
+ ./$(DEPDIR)/sigaction.Po ./$(DEPDIR)/sigprocmask.Po \
+ ./$(DEPDIR)/snprintf.Po ./$(DEPDIR)/socket.Po \
+ ./$(DEPDIR)/sockets.Po ./$(DEPDIR)/spawn-pipe.Po \
+ ./$(DEPDIR)/spawn.Po ./$(DEPDIR)/spawn_faction_addchdir.Po \
+ ./$(DEPDIR)/spawn_faction_addclose.Po \
+ ./$(DEPDIR)/spawn_faction_adddup2.Po \
+ ./$(DEPDIR)/spawn_faction_addopen.Po \
+ ./$(DEPDIR)/spawn_faction_destroy.Po \
+ ./$(DEPDIR)/spawn_faction_init.Po \
+ ./$(DEPDIR)/spawnattr_destroy.Po ./$(DEPDIR)/spawnattr_init.Po \
+ ./$(DEPDIR)/spawnattr_setflags.Po \
+ ./$(DEPDIR)/spawnattr_setpgroup.Po \
+ ./$(DEPDIR)/spawnattr_setsigmask.Po ./$(DEPDIR)/spawni.Po \
+ ./$(DEPDIR)/spawnp.Po ./$(DEPDIR)/stat-time.Po \
+ ./$(DEPDIR)/stat-w32.Po ./$(DEPDIR)/stat.Po \
+ ./$(DEPDIR)/stdio-write.Po ./$(DEPDIR)/stpcpy.Po \
+ ./$(DEPDIR)/strcasecmp.Po ./$(DEPDIR)/strchrnul.Po \
+ ./$(DEPDIR)/strdup.Po ./$(DEPDIR)/strerror-override.Po \
+ ./$(DEPDIR)/strerror.Po ./$(DEPDIR)/strerror_r.Po \
+ ./$(DEPDIR)/stripslash.Po ./$(DEPDIR)/strncasecmp.Po \
+ ./$(DEPDIR)/strndup.Po ./$(DEPDIR)/strnlen.Po \
+ ./$(DEPDIR)/strnlen1.Po ./$(DEPDIR)/strpbrk.Po \
+ ./$(DEPDIR)/strptime.Po ./$(DEPDIR)/strtok_r.Po \
+ ./$(DEPDIR)/strtol.Po ./$(DEPDIR)/strtoll.Po \
+ ./$(DEPDIR)/symlink.Po ./$(DEPDIR)/sys_socket.Po \
+ ./$(DEPDIR)/tempname.Po ./$(DEPDIR)/time_r.Po \
+ ./$(DEPDIR)/timegm.Po ./$(DEPDIR)/timespec.Po \
+ ./$(DEPDIR)/tmpdir.Po ./$(DEPDIR)/u64.Po ./$(DEPDIR)/unistd.Po \
+ ./$(DEPDIR)/unlink.Po ./$(DEPDIR)/utime.Po \
+ ./$(DEPDIR)/utimens.Po ./$(DEPDIR)/vasnprintf.Po \
+ ./$(DEPDIR)/vasprintf.Po ./$(DEPDIR)/vsnprintf.Po \
+ ./$(DEPDIR)/wait-process.Po ./$(DEPDIR)/waitpid.Po \
+ ./$(DEPDIR)/wcrtomb.Po ./$(DEPDIR)/wctype-h.Po \
+ ./$(DEPDIR)/wcwidth.Po ./$(DEPDIR)/windows-mutex.Po \
+ ./$(DEPDIR)/windows-once.Po ./$(DEPDIR)/windows-recmutex.Po \
+ ./$(DEPDIR)/windows-rwlock.Po ./$(DEPDIR)/windows-spawn.Po \
+ ./$(DEPDIR)/wmemchr.Po ./$(DEPDIR)/wmempcpy.Po \
+ ./$(DEPDIR)/write.Po ./$(DEPDIR)/xalloc-die.Po \
+ ./$(DEPDIR)/xmalloc.Po ./$(DEPDIR)/xmemdup0.Po \
+ ./$(DEPDIR)/xsize.Po ./$(DEPDIR)/xstrndup.Po \
+ glthread/$(DEPDIR)/lock.Po glthread/$(DEPDIR)/threadlib.Po \
+ malloc/$(DEPDIR)/scratch_buffer_dupfree.Po \
+ malloc/$(DEPDIR)/scratch_buffer_grow.Po \
+ malloc/$(DEPDIR)/scratch_buffer_grow_preserve.Po \
+ malloc/$(DEPDIR)/scratch_buffer_set_array_size.Po \
+ unicase/$(DEPDIR)/cased.Po \
+ unicase/$(DEPDIR)/empty-prefix-context.Po \
+ unicase/$(DEPDIR)/empty-suffix-context.Po \
+ unicase/$(DEPDIR)/ignorable.Po \
+ unicase/$(DEPDIR)/special-casing.Po \
+ unicase/$(DEPDIR)/tolower.Po unicase/$(DEPDIR)/u8-casemap.Po \
+ unicase/$(DEPDIR)/u8-tolower.Po \
+ unictype/$(DEPDIR)/combiningclass.Po \
+ unictype/$(DEPDIR)/pr_soft_dotted.Po \
+ uninorm/$(DEPDIR)/decompose-internal.Po \
+ uninorm/$(DEPDIR)/u8-normalize.Po unistr/$(DEPDIR)/u8-cpy.Po \
+ unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Po \
+ unistr/$(DEPDIR)/u8-mbtouc-unsafe.Po \
+ unistr/$(DEPDIR)/u8-strlen.Po \
+ unistr/$(DEPDIR)/u8-uctomb-aux.Po \
+ unistr/$(DEPDIR)/u8-uctomb.Po uniwidth/$(DEPDIR)/width.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libgnu_a_SOURCES) $(EXTRA_libgnu_a_SOURCES)
+DIST_SOURCES = $(am__libgnu_a_SOURCES_DIST) $(EXTRA_libgnu_a_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# 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__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/gnulib.mk \
+ $(top_srcdir)/build-aux/depcomp alloca.c
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+MOSTLYCLEANFILES = core *.stackdump alloca.h alloca.h-t arpa/inet.h \
+ arpa/inet.h-t byteswap.h byteswap.h-t ctype.h ctype.h-t \
+ dirent.h dirent.h-t errno.h errno.h-t fcntl.h fcntl.h-t \
+ float.h float.h-t fnmatch.h fnmatch.h-t getopt.h getopt.h-t \
+ getopt-cdefs.h getopt-cdefs.h-t iconv.h iconv.h-t inttypes.h \
+ inttypes.h-t langinfo.h langinfo.h-t limits.h limits.h-t \
+ locale.h locale.h-t netdb.h netdb.h-t netinet/in.h \
+ netinet/in.h-t sched.h sched.h-t signal.h signal.h-t spawn.h \
+ spawn.h-t stdalign.h stdalign.h-t stdbool.h stdbool.h-t \
+ stddef.h stddef.h-t stdint.h stdint.h-t stdio.h stdio.h-t \
+ stdlib.h stdlib.h-t string.h string.h-t strings.h strings.h-t \
+ sys/file.h sys/file.h-t sys/ioctl.h sys/ioctl.h-t sys/random.h \
+ sys/random.h-t sys/select.h sys/select.h-t sys/socket.h \
+ sys/socket.h-t sys/stat.h sys/stat.h-t sys/time.h sys/time.h-t \
+ sys/types.h sys/types.h-t sys/uio.h sys/uio.h-t sys/wait.h \
+ sys/wait.h-t time.h time.h-t unicase.h unicase.h-t \
+ unicase/special-casing-table.h-t unicase/special-casing.h \
+ unicase/special-casing.h-t unictype.h unictype.h-t uninorm.h \
+ uninorm.h-t unistd.h unistd.h-t unistr.h unistr.h-t unitypes.h \
+ unitypes.h-t uniwidth.h uniwidth.h-t utime.h utime.h-t wchar.h \
+ wchar.h-t wctype.h wctype.h-t
+noinst_LTLIBRARIES =
+EXTRA_DIST = accept.c w32sock.h access.c alloca.c alloca.in.h \
+ $(top_srcdir)/build-aux/announce-gen arpa_inet.in.h \
+ array-mergesort.h assure.h attribute.h basename-lgpl.h bind.c \
+ w32sock.h btowc.c byteswap.in.h c-strcaseeq.h str-two-way.h \
+ canonicalize.h chdir-long.c chdir-long.h cloexec.h close.c \
+ closedir.c dirent-private.h concat-filename.h connect.c \
+ w32sock.h af_alg.h sys-limits.h md2.h md4.h gl_openssl.h md5.h \
+ gl_openssl.h sha1.h gl_openssl.h sha256.h gl_openssl.h \
+ sha512.h ctype.in.h dirent.in.h dirfd.c stripslash.c dirname.h \
+ dup.c dup2.c errno.in.h error.c error.h exitfail.h fchdir.c \
+ fcntl.c fcntl.in.h fd-hook.h fdopendir.c fflush.c stdio-impl.h \
+ file-set.h filename.h filenamecat.h flexmember.h float.c \
+ float.in.h itold.c flock.c fnmatch.c fnmatch_loop.c fnmatch.c \
+ fnmatch.in.h fopen.c fopen.c fpurge.c stdio-impl.h freading.h \
+ stdio-impl.h free.c fseek.c fseeko.c stdio-impl.h fstat.c \
+ stat-w32.c stat-w32.h at-func.c fstatat.c ftell.c ftello.c \
+ stdio-impl.h futimens.c gai_strerror.c getaddrinfo.c getcwd.c \
+ getcwd-lgpl.c getdelim.c getdtablesize.c getgroups.c getline.c \
+ getopt-cdefs.in.h getopt-core.h getopt-ext.h getopt-pfx-core.h \
+ getopt-pfx-ext.h getopt.c getopt.in.h getopt1.c getopt_int.h \
+ getpass.c getpass.h getpass.c getpass.h getpeername.c \
+ w32sock.h getrandom.c getsockname.c w32sock.h gettimeofday.c \
+ $(top_srcdir)/build-aux/git-version-gen \
+ $(top_srcdir)/build-aux/gitlog-to-changelog \
+ $(top_srcdir)/GNUmakefile $(top_srcdir)/build-aux/gnupload \
+ group-member.c hard-locale.h hash.h hash-triple.h \
+ $(top_srcdir)/build-aux/config.rpath iconv.in.h inet_ntop.c \
+ intprops.h inttypes.in.h ioctl.c w32sock.h isblank.c \
+ iswblank.c iswdigit.c iswxdigit.c langinfo.in.h cdefs.h \
+ libc-config.h libunistring.valgrind limits.in.h link.c \
+ listen.c w32sock.h localcharset.h locale.in.h localeconv.c \
+ lseek.c lstat.c $(top_srcdir)/maint.mk malloc.c malloca.h \
+ mbchar.h lc-charset-dispatch.c lc-charset-dispatch.h \
+ mbrtowc-impl-utf8.h mbrtowc-impl.h mbrtowc.c mbtowc-lock.c \
+ mbtowc-lock.h windows-initguard.h mbsinit.c mbsrtowcs-impl.h \
+ mbsrtowcs-state.c mbsrtowcs.c mbtowc-impl.h mbtowc.c memchr.c \
+ memchr.valgrind mempcpy.c memrchr.c mkdir.c mkostemp.c \
+ mkstemp.c mktime-internal.h mktime.c mktime-internal.h \
+ mktime.c msvc-inval.c msvc-inval.h msvc-nothrow.c \
+ msvc-nothrow.h nanosleep.c netdb.in.h netinet_in.in.h \
+ nl_langinfo-lock.c nl_langinfo.c windows-initguard.h open.c \
+ openat.c openat.h dirent-private.h opendir.c pathmax.h pipe.c \
+ spawn.c spawn_int.h spawni.c spawn_faction_addchdir.c \
+ spawn_int.h spawn_faction_addclose.c spawn_int.h \
+ spawn_faction_adddup2.c spawn_int.h spawn_faction_addopen.c \
+ spawn_int.h spawn_faction_destroy.c spawn_faction_init.c \
+ spawn_int.h spawnattr_destroy.c spawnattr_init.c \
+ spawnattr_setflags.c spawnattr_setpgroup.c \
+ spawnattr_setsigmask.c spawnp.c quote.h quote.h quotearg.h \
+ raise.c rawmemchr.c rawmemchr.valgrind dirent-private.h \
+ readdir.c readlink.c realloc.c recv.c w32sock.h regcomp.c \
+ regex.c regex.h regex_internal.c regex_internal.h regexec.c \
+ dirent-private.h rewinddir.c same-inode.h save-cwd.h \
+ sched.in.h malloc/scratch_buffer.h scratch_buffer.h \
+ secure_getenv.c select.c send.c w32sock.h setlocale-lock.c \
+ setlocale_null.h windows-initguard.h setsockopt.c w32sock.h \
+ sig-handler.h sigaction.c signal.in.h stdio-write.c \
+ sigprocmask.c _Noreturn.h arg-nonnull.h c++defs.h \
+ unused-parameter.h warn-on-use.h snprintf.c socket.c w32sock.h \
+ w32sock.h spawn.in.h os2-spawn.c os2-spawn.h stat-w32.c \
+ stat-w32.h stat.c stat-time.h stdalign.in.h stdbool.in.h \
+ stddef.in.h stdint.in.h stdio.in.h stdlib.in.h stpcpy.c \
+ strcasecmp.c strncasecmp.c strchrnul.c strchrnul.valgrind \
+ strdup.c streq.h strerror.c strerror-override.c \
+ strerror-override.h strerror_r.c string.in.h strings.in.h \
+ strndup.c strnlen.c strpbrk.c strptime.c strtok_r.c strtol.c \
+ strtol.c strtoll.c symlink.c sys_file.in.h sys_ioctl.in.h \
+ sys_random.in.h sys_select.in.h sys_socket.in.h sys_stat.in.h \
+ sys_time.in.h sys_types.in.h sys_uio.in.h sys_wait.in.h \
+ tempname.h thread-optim.h time.in.h time_r.c mktime-internal.h \
+ timegm.c timespec.h u64.h unicase.in.h unicase/cased.h \
+ unicase/caseprop.h unictype/bitmap.h unicase/caseprop.h \
+ unicase/ignorable.h unictype/bitmap.h \
+ unicase/special-casing-table.h \
+ unicase/special-casing-table.gperf unicase/special-casing.in.h \
+ unicase/simple-mapping.h unicase/tolower.h unicase/context.h \
+ unicase/u-casemap.h unicase/unicasemap.h unictype.in.h \
+ unictype/combiningclass.h unictype/bitmap.h \
+ unictype/pr_soft_dotted.h uninorm.in.h \
+ uninorm/decompose-internal.h uninorm/normalize-internal.h \
+ uninorm/u-normalize-internal.h unistd.in.h unistd--.h \
+ unistd-safer.h unistr.in.h unistr/u-cpy.h unitypes.in.h \
+ localcharset.h uniwidth.in.h uniwidth/cjk.h unlink.c \
+ unlocked-io.h $(top_srcdir)/build-aux/update-copyright \
+ $(top_srcdir)/build-aux/useless-if-before-free utime.c \
+ utime.in.h utimens.h asnprintf.c float+.h printf-args.c \
+ printf-args.h printf-parse.c printf-parse.h vasnprintf.c \
+ vasnprintf.h asprintf.c vasprintf.c \
+ $(top_srcdir)/build-aux/vc-list-files verify.h vsnprintf.c \
+ waitpid.c wchar.in.h wcrtomb.c wctype.in.h wcwidth.c \
+ windows-initguard.h windows-mutex.c windows-mutex.h \
+ windows-once.c windows-once.h windows-initguard.h \
+ windows-recmutex.c windows-recmutex.h windows-initguard.h \
+ windows-rwlock.c windows-rwlock.h windows-spawn.c \
+ windows-spawn.h wmemchr-impl.h wmemchr.c wmempcpy.c write.c \
+ xalloc.h xalloc.h xalloc-oversized.h
+BUILT_SOURCES = $(ALLOCA_H) arpa/inet.h $(BYTESWAP_H) ctype.h dirent.h \
+ $(ERRNO_H) fcntl.h $(FLOAT_H) $(FNMATCH_H) $(GETOPT_H) \
+ $(GETOPT_CDEFS_H) $(ICONV_H) inttypes.h langinfo.h $(LIMITS_H) \
+ locale.h netdb.h $(NETINET_IN_H) sched.h signal.h spawn.h \
+ $(STDALIGN_H) $(STDBOOL_H) $(STDDEF_H) $(STDINT_H) stdio.h \
+ stdlib.h string.h strings.h sys/file.h sys/ioctl.h \
+ sys/random.h sys/select.h sys/socket.h sys/stat.h sys/time.h \
+ sys/types.h sys/uio.h sys/wait.h time.h \
+ $(LIBUNISTRING_UNICASE_H) unicase/special-casing-table.h \
+ unicase/special-casing.h $(LIBUNISTRING_UNICTYPE_H) \
+ $(LIBUNISTRING_UNINORM_H) unistd.h $(LIBUNISTRING_UNISTR_H) \
+ $(LIBUNISTRING_UNITYPES_H) $(LIBUNISTRING_UNIWIDTH_H) utime.h \
+ wchar.h wctype.h
+MOSTLYCLEANDIRS = arpa netinet sys sys sys sys sys sys sys sys
+CLEANFILES =
+SUFFIXES =
+# No GNU Make output.
+noinst_LIBRARIES = libgnu.a
+MAINTAINERCLEANFILES = unicase/special-casing-table.h
+AM_CFLAGS = $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS)
+AM_CPPFLAGS = -DDEFAULT_TEXT_DOMAIN=\"wget-gnulib\"
+libgnu_a_SOURCES = openat-priv.h openat-proc.c base32.h base32.c \
+ basename-lgpl.c binary-io.h binary-io.c bitrotate.h \
+ bitrotate.c c-ctype.h c-ctype.c c-strcase.h c-strcasecmp.c \
+ c-strncasecmp.c c-strcasestr.h c-strcasestr.c canonicalize.c \
+ cloexec.c concat-filename.c af_alg.c md2.c md4.c md5.c sha1.c \
+ sha256.c sha512.c dirname.c basename.c dirname-lgpl.c \
+ stripslash.c exitfail.c fatal-signal.h fatal-signal.c \
+ fd-hook.c fd-safer-flag.c dup-safer-flag.c file-set.c \
+ filenamecat-lgpl.c findprog.h findprog-in.c freading.c \
+ getprogname.h getprogname.c gettext.h gettime.c hard-locale.c \
+ hash.c hash-pjw.h hash-pjw.c hash-triple-simple.c idx.h \
+ localcharset.c glthread/lock.h glthread/lock.c malloca.c \
+ mbchar.c mbiter.h mbiter.c minmax.h openat-die.c pipe2.c \
+ pipe2-safer.c quotearg.c save-cwd.c \
+ malloc/scratch_buffer_dupfree.c malloc/scratch_buffer_grow.c \
+ malloc/scratch_buffer_grow_preserve.c \
+ malloc/scratch_buffer_set_array_size.c setlocale_null.c \
+ sig-handler.c size_max.h sockets.h sockets.c spawn-pipe.h \
+ spawn-pipe.c stat-time.c strnlen1.h strnlen1.c sys_socket.c \
+ tempname.c glthread/threadlib.c timespec.c tmpdir.h tmpdir.c \
+ u64.c unicase/cased.c $(am__append_1) $(am__append_2) \
+ unicase/ignorable.c unicase/special-casing.c $(am__append_3) \
+ unicase/u8-casemap.c $(am__append_4) $(am__append_5) \
+ $(am__append_6) uninorm/decompose-internal.c $(am__append_7) \
+ unistd.c dup-safer.c fd-safer.c pipe-safer.c $(am__append_8) \
+ $(am__append_9) $(am__append_10) $(am__append_11) \
+ $(am__append_12) utimens.c wait-process.h wait-process.c \
+ wctype-h.c xmalloc.c xalloc-die.c xmemdup0.h xmemdup0.c \
+ xsize.h xsize.c xstrndup.h xstrndup.c
+libgnu_a_LIBADD = $(gl_LIBOBJS) @ALLOCA@
+libgnu_a_DEPENDENCIES = $(gl_LIBOBJS) @ALLOCA@
+EXTRA_libgnu_a_SOURCES = accept.c access.c alloca.c bind.c btowc.c \
+ chdir-long.c close.c closedir.c connect.c dirfd.c stripslash.c \
+ dup.c dup2.c error.c fchdir.c fcntl.c fdopendir.c fflush.c \
+ float.c itold.c flock.c fnmatch.c fnmatch_loop.c fnmatch.c \
+ fopen.c fopen.c fpurge.c free.c fseek.c fseeko.c fstat.c \
+ stat-w32.c at-func.c fstatat.c ftell.c ftello.c futimens.c \
+ gai_strerror.c getaddrinfo.c getcwd.c getcwd-lgpl.c getdelim.c \
+ getdtablesize.c getgroups.c getline.c getopt.c getopt1.c \
+ getpass.c getpass.c getpeername.c getrandom.c getsockname.c \
+ gettimeofday.c group-member.c inet_ntop.c ioctl.c isblank.c \
+ iswblank.c iswdigit.c iswxdigit.c link.c listen.c localeconv.c \
+ lseek.c lstat.c malloc.c lc-charset-dispatch.c mbrtowc.c \
+ mbtowc-lock.c mbsinit.c mbsrtowcs-state.c mbsrtowcs.c mbtowc.c \
+ memchr.c mempcpy.c memrchr.c mkdir.c mkostemp.c mkstemp.c \
+ mktime.c mktime.c msvc-inval.c msvc-nothrow.c nanosleep.c \
+ nl_langinfo-lock.c nl_langinfo.c open.c openat.c opendir.c \
+ pipe.c spawn.c spawni.c spawn_faction_addchdir.c \
+ spawn_faction_addclose.c spawn_faction_adddup2.c \
+ spawn_faction_addopen.c spawn_faction_destroy.c \
+ spawn_faction_init.c spawnattr_destroy.c spawnattr_init.c \
+ spawnattr_setflags.c spawnattr_setpgroup.c \
+ spawnattr_setsigmask.c spawnp.c raise.c rawmemchr.c readdir.c \
+ readlink.c realloc.c recv.c regcomp.c regex.c regex_internal.c \
+ regexec.c rewinddir.c secure_getenv.c select.c send.c \
+ setlocale-lock.c setsockopt.c sigaction.c stdio-write.c \
+ sigprocmask.c snprintf.c socket.c os2-spawn.c stat-w32.c \
+ stat.c stpcpy.c strcasecmp.c strncasecmp.c strchrnul.c \
+ strdup.c strerror.c strerror-override.c strerror_r.c strndup.c \
+ strnlen.c strpbrk.c strptime.c strtok_r.c strtol.c strtol.c \
+ strtoll.c symlink.c time_r.c timegm.c unlink.c utime.c \
+ asnprintf.c printf-args.c printf-parse.c vasnprintf.c \
+ asprintf.c vasprintf.c vsnprintf.c waitpid.c wcrtomb.c \
+ wcwidth.c windows-mutex.c windows-once.c windows-recmutex.c \
+ windows-rwlock.c windows-spawn.c wmemchr.c wmempcpy.c write.c
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
+GPERF = gperf
+V_GPERF = $(V_GPERF_@AM_V@)
+V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@)
+V_GPERF_0 = @echo " GPERF " $@;
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+_NORETURN_H = $(srcdir)/_Noreturn.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+ARG_NONNULL_H = $(srcdir)/arg-nonnull.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+CXXDEFS_H = $(srcdir)/c++defs.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+UNUSED_PARAMETER_H = $(srcdir)/unused-parameter.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+WARN_ON_USE_H = $(srcdir)/warn-on-use.h
+all: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu lib/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+$(srcdir)/gnulib.mk $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+glthread/$(am__dirstamp):
+ @$(MKDIR_P) glthread
+ @: > glthread/$(am__dirstamp)
+glthread/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) glthread/$(DEPDIR)
+ @: > glthread/$(DEPDIR)/$(am__dirstamp)
+glthread/lock.$(OBJEXT): glthread/$(am__dirstamp) \
+ glthread/$(DEPDIR)/$(am__dirstamp)
+malloc/$(am__dirstamp):
+ @$(MKDIR_P) malloc
+ @: > malloc/$(am__dirstamp)
+malloc/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) malloc/$(DEPDIR)
+ @: > malloc/$(DEPDIR)/$(am__dirstamp)
+malloc/scratch_buffer_dupfree.$(OBJEXT): malloc/$(am__dirstamp) \
+ malloc/$(DEPDIR)/$(am__dirstamp)
+malloc/scratch_buffer_grow.$(OBJEXT): malloc/$(am__dirstamp) \
+ malloc/$(DEPDIR)/$(am__dirstamp)
+malloc/scratch_buffer_grow_preserve.$(OBJEXT): malloc/$(am__dirstamp) \
+ malloc/$(DEPDIR)/$(am__dirstamp)
+malloc/scratch_buffer_set_array_size.$(OBJEXT): \
+ malloc/$(am__dirstamp) malloc/$(DEPDIR)/$(am__dirstamp)
+glthread/threadlib.$(OBJEXT): glthread/$(am__dirstamp) \
+ glthread/$(DEPDIR)/$(am__dirstamp)
+unicase/$(am__dirstamp):
+ @$(MKDIR_P) unicase
+ @: > unicase/$(am__dirstamp)
+unicase/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unicase/$(DEPDIR)
+ @: > unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/cased.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/empty-prefix-context.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/empty-suffix-context.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/ignorable.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/special-casing.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/tolower.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/u8-casemap.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unicase/u8-tolower.$(OBJEXT): unicase/$(am__dirstamp) \
+ unicase/$(DEPDIR)/$(am__dirstamp)
+unictype/$(am__dirstamp):
+ @$(MKDIR_P) unictype
+ @: > unictype/$(am__dirstamp)
+unictype/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unictype/$(DEPDIR)
+ @: > unictype/$(DEPDIR)/$(am__dirstamp)
+unictype/combiningclass.$(OBJEXT): unictype/$(am__dirstamp) \
+ unictype/$(DEPDIR)/$(am__dirstamp)
+unictype/pr_soft_dotted.$(OBJEXT): unictype/$(am__dirstamp) \
+ unictype/$(DEPDIR)/$(am__dirstamp)
+uninorm/$(am__dirstamp):
+ @$(MKDIR_P) uninorm
+ @: > uninorm/$(am__dirstamp)
+uninorm/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) uninorm/$(DEPDIR)
+ @: > uninorm/$(DEPDIR)/$(am__dirstamp)
+uninorm/decompose-internal.$(OBJEXT): uninorm/$(am__dirstamp) \
+ uninorm/$(DEPDIR)/$(am__dirstamp)
+uninorm/u8-normalize.$(OBJEXT): uninorm/$(am__dirstamp) \
+ uninorm/$(DEPDIR)/$(am__dirstamp)
+unistr/$(am__dirstamp):
+ @$(MKDIR_P) unistr
+ @: > unistr/$(am__dirstamp)
+unistr/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unistr/$(DEPDIR)
+ @: > unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-cpy.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-mbtouc-unsafe.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-mbtouc-unsafe-aux.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-strlen.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-uctomb.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+unistr/u8-uctomb-aux.$(OBJEXT): unistr/$(am__dirstamp) \
+ unistr/$(DEPDIR)/$(am__dirstamp)
+uniwidth/$(am__dirstamp):
+ @$(MKDIR_P) uniwidth
+ @: > uniwidth/$(am__dirstamp)
+uniwidth/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) uniwidth/$(DEPDIR)
+ @: > uniwidth/$(DEPDIR)/$(am__dirstamp)
+uniwidth/width.$(OBJEXT): uniwidth/$(am__dirstamp) \
+ uniwidth/$(DEPDIR)/$(am__dirstamp)
+
+libgnu.a: $(libgnu_a_OBJECTS) $(libgnu_a_DEPENDENCIES) $(EXTRA_libgnu_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libgnu.a
+ $(AM_V_AR)$(libgnu_a_AR) libgnu.a $(libgnu_a_OBJECTS) $(libgnu_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libgnu.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f glthread/*.$(OBJEXT)
+ -rm -f malloc/*.$(OBJEXT)
+ -rm -f unicase/*.$(OBJEXT)
+ -rm -f unictype/*.$(OBJEXT)
+ -rm -f uninorm/*.$(OBJEXT)
+ -rm -f unistr/*.$(OBJEXT)
+ -rm -f uniwidth/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/accept.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/access.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/af_alg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/at-func.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base32.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary-io.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bind.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitrotate.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/btowc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-ctype.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strcasecmp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strcasestr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/c-strncasecmp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/canonicalize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chdir-long.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cloexec.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closedir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concat-filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirfd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup-safer-flag.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exitfail.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fatal-signal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fchdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcntl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-hook.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-safer-flag.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdopendir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fflush.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file-set.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filenamecat-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findprog-in.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch_loop.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fopen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fpurge.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/freading.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseek.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fseeko.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstatat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftell.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftello.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/futimens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gai_strerror.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaddrinfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcwd-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getcwd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdelim.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdtablesize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getgroups.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpass.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpeername.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getprogname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getrandom.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getsockname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gettimeofday.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/group-member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hard-locale.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash-pjw.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash-triple-simple.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet_ntop.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isblank.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswblank.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswdigit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iswxdigit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itold.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lc-charset-dispatch.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/link.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localcharset.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localeconv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lseek.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lstat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloca.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbchar.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbiter.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbrtowc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbsinit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbsrtowcs-state.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbsrtowcs.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbtowc-lock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbtowc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mempcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memrchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkostemp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkstemp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mktime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nanosleep.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nl_langinfo-lock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nl_langinfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/open.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat-die.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat-proc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opendir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/os2-spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe2-safer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipe2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-args.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printf-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quotearg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/raise.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rawmemchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regcomp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex_internal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rewinddir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/save-cwd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secure_getenv.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/select.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/send.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setlocale-lock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setlocale_null.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setsockopt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha256.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig-handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigaction.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigprocmask.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockets.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn-pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_addchdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_addclose.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_adddup2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_addopen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_destroy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawn_faction_init.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnattr_destroy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnattr_init.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnattr_setflags.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnattr_setpgroup.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnattr_setsigmask.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawni.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spawnp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat-time.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat-w32.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdio-write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasecmp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror-override.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror_r.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncasecmp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strndup.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strnlen1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strpbrk.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strptime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtoll.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symlink.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tempname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time_r.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timegm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timespec.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tmpdir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/u64.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unlink.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utime.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utimens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vasprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vsnprintf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wait-process.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/waitpid.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcrtomb.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wctype-h.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcwidth.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-mutex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-once.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-recmutex.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-rwlock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windows-spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmemchr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmempcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xalloc-die.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmemdup0.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@glthread/$(DEPDIR)/lock.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@glthread/$(DEPDIR)/threadlib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@malloc/$(DEPDIR)/scratch_buffer_dupfree.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@malloc/$(DEPDIR)/scratch_buffer_grow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@malloc/$(DEPDIR)/scratch_buffer_grow_preserve.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@malloc/$(DEPDIR)/scratch_buffer_set_array_size.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/cased.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/empty-prefix-context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/empty-suffix-context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/ignorable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/special-casing.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/tolower.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-casemap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unicase/$(DEPDIR)/u8-tolower.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/combiningclass.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unictype/$(DEPDIR)/pr_soft_dotted.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/decompose-internal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@uninorm/$(DEPDIR)/u8-normalize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-cpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-mbtouc-unsafe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-strlen.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-uctomb-aux.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unistr/$(DEPDIR)/u8-uctomb.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@uniwidth/$(DEPDIR)/width.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(LIBRARIES) $(LTLIBRARIES)
+installdirs:
+install: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+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)
+ -rm -f glthread/$(DEPDIR)/$(am__dirstamp)
+ -rm -f glthread/$(am__dirstamp)
+ -rm -f malloc/$(DEPDIR)/$(am__dirstamp)
+ -rm -f malloc/$(am__dirstamp)
+ -rm -f unicase/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unicase/$(am__dirstamp)
+ -rm -f unictype/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unictype/$(am__dirstamp)
+ -rm -f uninorm/$(DEPDIR)/$(am__dirstamp)
+ -rm -f uninorm/$(am__dirstamp)
+ -rm -f unistr/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unistr/$(am__dirstamp)
+ -rm -f uniwidth/$(DEPDIR)/$(am__dirstamp)
+ -rm -f uniwidth/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstLTLIBRARIES \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/accept.Po
+ -rm -f ./$(DEPDIR)/access.Po
+ -rm -f ./$(DEPDIR)/af_alg.Po
+ -rm -f ./$(DEPDIR)/alloca.Po
+ -rm -f ./$(DEPDIR)/asnprintf.Po
+ -rm -f ./$(DEPDIR)/asprintf.Po
+ -rm -f ./$(DEPDIR)/at-func.Po
+ -rm -f ./$(DEPDIR)/base32.Po
+ -rm -f ./$(DEPDIR)/basename-lgpl.Po
+ -rm -f ./$(DEPDIR)/basename.Po
+ -rm -f ./$(DEPDIR)/binary-io.Po
+ -rm -f ./$(DEPDIR)/bind.Po
+ -rm -f ./$(DEPDIR)/bitrotate.Po
+ -rm -f ./$(DEPDIR)/btowc.Po
+ -rm -f ./$(DEPDIR)/c-ctype.Po
+ -rm -f ./$(DEPDIR)/c-strcasecmp.Po
+ -rm -f ./$(DEPDIR)/c-strcasestr.Po
+ -rm -f ./$(DEPDIR)/c-strncasecmp.Po
+ -rm -f ./$(DEPDIR)/canonicalize.Po
+ -rm -f ./$(DEPDIR)/chdir-long.Po
+ -rm -f ./$(DEPDIR)/cloexec.Po
+ -rm -f ./$(DEPDIR)/close.Po
+ -rm -f ./$(DEPDIR)/closedir.Po
+ -rm -f ./$(DEPDIR)/concat-filename.Po
+ -rm -f ./$(DEPDIR)/connect.Po
+ -rm -f ./$(DEPDIR)/dirfd.Po
+ -rm -f ./$(DEPDIR)/dirname-lgpl.Po
+ -rm -f ./$(DEPDIR)/dirname.Po
+ -rm -f ./$(DEPDIR)/dup-safer-flag.Po
+ -rm -f ./$(DEPDIR)/dup-safer.Po
+ -rm -f ./$(DEPDIR)/dup.Po
+ -rm -f ./$(DEPDIR)/dup2.Po
+ -rm -f ./$(DEPDIR)/error.Po
+ -rm -f ./$(DEPDIR)/exitfail.Po
+ -rm -f ./$(DEPDIR)/fatal-signal.Po
+ -rm -f ./$(DEPDIR)/fchdir.Po
+ -rm -f ./$(DEPDIR)/fcntl.Po
+ -rm -f ./$(DEPDIR)/fd-hook.Po
+ -rm -f ./$(DEPDIR)/fd-safer-flag.Po
+ -rm -f ./$(DEPDIR)/fd-safer.Po
+ -rm -f ./$(DEPDIR)/fdopendir.Po
+ -rm -f ./$(DEPDIR)/fflush.Po
+ -rm -f ./$(DEPDIR)/file-set.Po
+ -rm -f ./$(DEPDIR)/filenamecat-lgpl.Po
+ -rm -f ./$(DEPDIR)/findprog-in.Po
+ -rm -f ./$(DEPDIR)/float.Po
+ -rm -f ./$(DEPDIR)/flock.Po
+ -rm -f ./$(DEPDIR)/fnmatch.Po
+ -rm -f ./$(DEPDIR)/fnmatch_loop.Po
+ -rm -f ./$(DEPDIR)/fopen.Po
+ -rm -f ./$(DEPDIR)/fpurge.Po
+ -rm -f ./$(DEPDIR)/freading.Po
+ -rm -f ./$(DEPDIR)/free.Po
+ -rm -f ./$(DEPDIR)/fseek.Po
+ -rm -f ./$(DEPDIR)/fseeko.Po
+ -rm -f ./$(DEPDIR)/fstat.Po
+ -rm -f ./$(DEPDIR)/fstatat.Po
+ -rm -f ./$(DEPDIR)/ftell.Po
+ -rm -f ./$(DEPDIR)/ftello.Po
+ -rm -f ./$(DEPDIR)/futimens.Po
+ -rm -f ./$(DEPDIR)/gai_strerror.Po
+ -rm -f ./$(DEPDIR)/getaddrinfo.Po
+ -rm -f ./$(DEPDIR)/getcwd-lgpl.Po
+ -rm -f ./$(DEPDIR)/getcwd.Po
+ -rm -f ./$(DEPDIR)/getdelim.Po
+ -rm -f ./$(DEPDIR)/getdtablesize.Po
+ -rm -f ./$(DEPDIR)/getgroups.Po
+ -rm -f ./$(DEPDIR)/getline.Po
+ -rm -f ./$(DEPDIR)/getopt.Po
+ -rm -f ./$(DEPDIR)/getopt1.Po
+ -rm -f ./$(DEPDIR)/getpass.Po
+ -rm -f ./$(DEPDIR)/getpeername.Po
+ -rm -f ./$(DEPDIR)/getprogname.Po
+ -rm -f ./$(DEPDIR)/getrandom.Po
+ -rm -f ./$(DEPDIR)/getsockname.Po
+ -rm -f ./$(DEPDIR)/gettime.Po
+ -rm -f ./$(DEPDIR)/gettimeofday.Po
+ -rm -f ./$(DEPDIR)/group-member.Po
+ -rm -f ./$(DEPDIR)/hard-locale.Po
+ -rm -f ./$(DEPDIR)/hash-pjw.Po
+ -rm -f ./$(DEPDIR)/hash-triple-simple.Po
+ -rm -f ./$(DEPDIR)/hash.Po
+ -rm -f ./$(DEPDIR)/inet_ntop.Po
+ -rm -f ./$(DEPDIR)/ioctl.Po
+ -rm -f ./$(DEPDIR)/isblank.Po
+ -rm -f ./$(DEPDIR)/iswblank.Po
+ -rm -f ./$(DEPDIR)/iswdigit.Po
+ -rm -f ./$(DEPDIR)/iswxdigit.Po
+ -rm -f ./$(DEPDIR)/itold.Po
+ -rm -f ./$(DEPDIR)/lc-charset-dispatch.Po
+ -rm -f ./$(DEPDIR)/link.Po
+ -rm -f ./$(DEPDIR)/listen.Po
+ -rm -f ./$(DEPDIR)/localcharset.Po
+ -rm -f ./$(DEPDIR)/localeconv.Po
+ -rm -f ./$(DEPDIR)/lseek.Po
+ -rm -f ./$(DEPDIR)/lstat.Po
+ -rm -f ./$(DEPDIR)/malloc.Po
+ -rm -f ./$(DEPDIR)/malloca.Po
+ -rm -f ./$(DEPDIR)/mbchar.Po
+ -rm -f ./$(DEPDIR)/mbiter.Po
+ -rm -f ./$(DEPDIR)/mbrtowc.Po
+ -rm -f ./$(DEPDIR)/mbsinit.Po
+ -rm -f ./$(DEPDIR)/mbsrtowcs-state.Po
+ -rm -f ./$(DEPDIR)/mbsrtowcs.Po
+ -rm -f ./$(DEPDIR)/mbtowc-lock.Po
+ -rm -f ./$(DEPDIR)/mbtowc.Po
+ -rm -f ./$(DEPDIR)/md2.Po
+ -rm -f ./$(DEPDIR)/md4.Po
+ -rm -f ./$(DEPDIR)/md5.Po
+ -rm -f ./$(DEPDIR)/memchr.Po
+ -rm -f ./$(DEPDIR)/mempcpy.Po
+ -rm -f ./$(DEPDIR)/memrchr.Po
+ -rm -f ./$(DEPDIR)/mkdir.Po
+ -rm -f ./$(DEPDIR)/mkostemp.Po
+ -rm -f ./$(DEPDIR)/mkstemp.Po
+ -rm -f ./$(DEPDIR)/mktime.Po
+ -rm -f ./$(DEPDIR)/msvc-inval.Po
+ -rm -f ./$(DEPDIR)/msvc-nothrow.Po
+ -rm -f ./$(DEPDIR)/nanosleep.Po
+ -rm -f ./$(DEPDIR)/nl_langinfo-lock.Po
+ -rm -f ./$(DEPDIR)/nl_langinfo.Po
+ -rm -f ./$(DEPDIR)/open.Po
+ -rm -f ./$(DEPDIR)/openat-die.Po
+ -rm -f ./$(DEPDIR)/openat-proc.Po
+ -rm -f ./$(DEPDIR)/openat.Po
+ -rm -f ./$(DEPDIR)/opendir.Po
+ -rm -f ./$(DEPDIR)/os2-spawn.Po
+ -rm -f ./$(DEPDIR)/pipe-safer.Po
+ -rm -f ./$(DEPDIR)/pipe.Po
+ -rm -f ./$(DEPDIR)/pipe2-safer.Po
+ -rm -f ./$(DEPDIR)/pipe2.Po
+ -rm -f ./$(DEPDIR)/printf-args.Po
+ -rm -f ./$(DEPDIR)/printf-parse.Po
+ -rm -f ./$(DEPDIR)/quotearg.Po
+ -rm -f ./$(DEPDIR)/raise.Po
+ -rm -f ./$(DEPDIR)/rawmemchr.Po
+ -rm -f ./$(DEPDIR)/readdir.Po
+ -rm -f ./$(DEPDIR)/readlink.Po
+ -rm -f ./$(DEPDIR)/realloc.Po
+ -rm -f ./$(DEPDIR)/recv.Po
+ -rm -f ./$(DEPDIR)/regcomp.Po
+ -rm -f ./$(DEPDIR)/regex.Po
+ -rm -f ./$(DEPDIR)/regex_internal.Po
+ -rm -f ./$(DEPDIR)/regexec.Po
+ -rm -f ./$(DEPDIR)/rewinddir.Po
+ -rm -f ./$(DEPDIR)/save-cwd.Po
+ -rm -f ./$(DEPDIR)/secure_getenv.Po
+ -rm -f ./$(DEPDIR)/select.Po
+ -rm -f ./$(DEPDIR)/send.Po
+ -rm -f ./$(DEPDIR)/setlocale-lock.Po
+ -rm -f ./$(DEPDIR)/setlocale_null.Po
+ -rm -f ./$(DEPDIR)/setsockopt.Po
+ -rm -f ./$(DEPDIR)/sha1.Po
+ -rm -f ./$(DEPDIR)/sha256.Po
+ -rm -f ./$(DEPDIR)/sha512.Po
+ -rm -f ./$(DEPDIR)/sig-handler.Po
+ -rm -f ./$(DEPDIR)/sigaction.Po
+ -rm -f ./$(DEPDIR)/sigprocmask.Po
+ -rm -f ./$(DEPDIR)/snprintf.Po
+ -rm -f ./$(DEPDIR)/socket.Po
+ -rm -f ./$(DEPDIR)/sockets.Po
+ -rm -f ./$(DEPDIR)/spawn-pipe.Po
+ -rm -f ./$(DEPDIR)/spawn.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addchdir.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addclose.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_adddup2.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addopen.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_destroy.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_init.Po
+ -rm -f ./$(DEPDIR)/spawnattr_destroy.Po
+ -rm -f ./$(DEPDIR)/spawnattr_init.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setflags.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setpgroup.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setsigmask.Po
+ -rm -f ./$(DEPDIR)/spawni.Po
+ -rm -f ./$(DEPDIR)/spawnp.Po
+ -rm -f ./$(DEPDIR)/stat-time.Po
+ -rm -f ./$(DEPDIR)/stat-w32.Po
+ -rm -f ./$(DEPDIR)/stat.Po
+ -rm -f ./$(DEPDIR)/stdio-write.Po
+ -rm -f ./$(DEPDIR)/stpcpy.Po
+ -rm -f ./$(DEPDIR)/strcasecmp.Po
+ -rm -f ./$(DEPDIR)/strchrnul.Po
+ -rm -f ./$(DEPDIR)/strdup.Po
+ -rm -f ./$(DEPDIR)/strerror-override.Po
+ -rm -f ./$(DEPDIR)/strerror.Po
+ -rm -f ./$(DEPDIR)/strerror_r.Po
+ -rm -f ./$(DEPDIR)/stripslash.Po
+ -rm -f ./$(DEPDIR)/strncasecmp.Po
+ -rm -f ./$(DEPDIR)/strndup.Po
+ -rm -f ./$(DEPDIR)/strnlen.Po
+ -rm -f ./$(DEPDIR)/strnlen1.Po
+ -rm -f ./$(DEPDIR)/strpbrk.Po
+ -rm -f ./$(DEPDIR)/strptime.Po
+ -rm -f ./$(DEPDIR)/strtok_r.Po
+ -rm -f ./$(DEPDIR)/strtol.Po
+ -rm -f ./$(DEPDIR)/strtoll.Po
+ -rm -f ./$(DEPDIR)/symlink.Po
+ -rm -f ./$(DEPDIR)/sys_socket.Po
+ -rm -f ./$(DEPDIR)/tempname.Po
+ -rm -f ./$(DEPDIR)/time_r.Po
+ -rm -f ./$(DEPDIR)/timegm.Po
+ -rm -f ./$(DEPDIR)/timespec.Po
+ -rm -f ./$(DEPDIR)/tmpdir.Po
+ -rm -f ./$(DEPDIR)/u64.Po
+ -rm -f ./$(DEPDIR)/unistd.Po
+ -rm -f ./$(DEPDIR)/unlink.Po
+ -rm -f ./$(DEPDIR)/utime.Po
+ -rm -f ./$(DEPDIR)/utimens.Po
+ -rm -f ./$(DEPDIR)/vasnprintf.Po
+ -rm -f ./$(DEPDIR)/vasprintf.Po
+ -rm -f ./$(DEPDIR)/vsnprintf.Po
+ -rm -f ./$(DEPDIR)/wait-process.Po
+ -rm -f ./$(DEPDIR)/waitpid.Po
+ -rm -f ./$(DEPDIR)/wcrtomb.Po
+ -rm -f ./$(DEPDIR)/wctype-h.Po
+ -rm -f ./$(DEPDIR)/wcwidth.Po
+ -rm -f ./$(DEPDIR)/windows-mutex.Po
+ -rm -f ./$(DEPDIR)/windows-once.Po
+ -rm -f ./$(DEPDIR)/windows-recmutex.Po
+ -rm -f ./$(DEPDIR)/windows-rwlock.Po
+ -rm -f ./$(DEPDIR)/windows-spawn.Po
+ -rm -f ./$(DEPDIR)/wmemchr.Po
+ -rm -f ./$(DEPDIR)/wmempcpy.Po
+ -rm -f ./$(DEPDIR)/write.Po
+ -rm -f ./$(DEPDIR)/xalloc-die.Po
+ -rm -f ./$(DEPDIR)/xmalloc.Po
+ -rm -f ./$(DEPDIR)/xmemdup0.Po
+ -rm -f ./$(DEPDIR)/xsize.Po
+ -rm -f ./$(DEPDIR)/xstrndup.Po
+ -rm -f glthread/$(DEPDIR)/lock.Po
+ -rm -f glthread/$(DEPDIR)/threadlib.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_dupfree.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_grow.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_grow_preserve.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_set_array_size.Po
+ -rm -f unicase/$(DEPDIR)/cased.Po
+ -rm -f unicase/$(DEPDIR)/empty-prefix-context.Po
+ -rm -f unicase/$(DEPDIR)/empty-suffix-context.Po
+ -rm -f unicase/$(DEPDIR)/ignorable.Po
+ -rm -f unicase/$(DEPDIR)/special-casing.Po
+ -rm -f unicase/$(DEPDIR)/tolower.Po
+ -rm -f unicase/$(DEPDIR)/u8-casemap.Po
+ -rm -f unicase/$(DEPDIR)/u8-tolower.Po
+ -rm -f unictype/$(DEPDIR)/combiningclass.Po
+ -rm -f unictype/$(DEPDIR)/pr_soft_dotted.Po
+ -rm -f uninorm/$(DEPDIR)/decompose-internal.Po
+ -rm -f uninorm/$(DEPDIR)/u8-normalize.Po
+ -rm -f unistr/$(DEPDIR)/u8-cpy.Po
+ -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Po
+ -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe.Po
+ -rm -f unistr/$(DEPDIR)/u8-strlen.Po
+ -rm -f unistr/$(DEPDIR)/u8-uctomb-aux.Po
+ -rm -f unistr/$(DEPDIR)/u8-uctomb.Po
+ -rm -f uniwidth/$(DEPDIR)/width.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/accept.Po
+ -rm -f ./$(DEPDIR)/access.Po
+ -rm -f ./$(DEPDIR)/af_alg.Po
+ -rm -f ./$(DEPDIR)/alloca.Po
+ -rm -f ./$(DEPDIR)/asnprintf.Po
+ -rm -f ./$(DEPDIR)/asprintf.Po
+ -rm -f ./$(DEPDIR)/at-func.Po
+ -rm -f ./$(DEPDIR)/base32.Po
+ -rm -f ./$(DEPDIR)/basename-lgpl.Po
+ -rm -f ./$(DEPDIR)/basename.Po
+ -rm -f ./$(DEPDIR)/binary-io.Po
+ -rm -f ./$(DEPDIR)/bind.Po
+ -rm -f ./$(DEPDIR)/bitrotate.Po
+ -rm -f ./$(DEPDIR)/btowc.Po
+ -rm -f ./$(DEPDIR)/c-ctype.Po
+ -rm -f ./$(DEPDIR)/c-strcasecmp.Po
+ -rm -f ./$(DEPDIR)/c-strcasestr.Po
+ -rm -f ./$(DEPDIR)/c-strncasecmp.Po
+ -rm -f ./$(DEPDIR)/canonicalize.Po
+ -rm -f ./$(DEPDIR)/chdir-long.Po
+ -rm -f ./$(DEPDIR)/cloexec.Po
+ -rm -f ./$(DEPDIR)/close.Po
+ -rm -f ./$(DEPDIR)/closedir.Po
+ -rm -f ./$(DEPDIR)/concat-filename.Po
+ -rm -f ./$(DEPDIR)/connect.Po
+ -rm -f ./$(DEPDIR)/dirfd.Po
+ -rm -f ./$(DEPDIR)/dirname-lgpl.Po
+ -rm -f ./$(DEPDIR)/dirname.Po
+ -rm -f ./$(DEPDIR)/dup-safer-flag.Po
+ -rm -f ./$(DEPDIR)/dup-safer.Po
+ -rm -f ./$(DEPDIR)/dup.Po
+ -rm -f ./$(DEPDIR)/dup2.Po
+ -rm -f ./$(DEPDIR)/error.Po
+ -rm -f ./$(DEPDIR)/exitfail.Po
+ -rm -f ./$(DEPDIR)/fatal-signal.Po
+ -rm -f ./$(DEPDIR)/fchdir.Po
+ -rm -f ./$(DEPDIR)/fcntl.Po
+ -rm -f ./$(DEPDIR)/fd-hook.Po
+ -rm -f ./$(DEPDIR)/fd-safer-flag.Po
+ -rm -f ./$(DEPDIR)/fd-safer.Po
+ -rm -f ./$(DEPDIR)/fdopendir.Po
+ -rm -f ./$(DEPDIR)/fflush.Po
+ -rm -f ./$(DEPDIR)/file-set.Po
+ -rm -f ./$(DEPDIR)/filenamecat-lgpl.Po
+ -rm -f ./$(DEPDIR)/findprog-in.Po
+ -rm -f ./$(DEPDIR)/float.Po
+ -rm -f ./$(DEPDIR)/flock.Po
+ -rm -f ./$(DEPDIR)/fnmatch.Po
+ -rm -f ./$(DEPDIR)/fnmatch_loop.Po
+ -rm -f ./$(DEPDIR)/fopen.Po
+ -rm -f ./$(DEPDIR)/fpurge.Po
+ -rm -f ./$(DEPDIR)/freading.Po
+ -rm -f ./$(DEPDIR)/free.Po
+ -rm -f ./$(DEPDIR)/fseek.Po
+ -rm -f ./$(DEPDIR)/fseeko.Po
+ -rm -f ./$(DEPDIR)/fstat.Po
+ -rm -f ./$(DEPDIR)/fstatat.Po
+ -rm -f ./$(DEPDIR)/ftell.Po
+ -rm -f ./$(DEPDIR)/ftello.Po
+ -rm -f ./$(DEPDIR)/futimens.Po
+ -rm -f ./$(DEPDIR)/gai_strerror.Po
+ -rm -f ./$(DEPDIR)/getaddrinfo.Po
+ -rm -f ./$(DEPDIR)/getcwd-lgpl.Po
+ -rm -f ./$(DEPDIR)/getcwd.Po
+ -rm -f ./$(DEPDIR)/getdelim.Po
+ -rm -f ./$(DEPDIR)/getdtablesize.Po
+ -rm -f ./$(DEPDIR)/getgroups.Po
+ -rm -f ./$(DEPDIR)/getline.Po
+ -rm -f ./$(DEPDIR)/getopt.Po
+ -rm -f ./$(DEPDIR)/getopt1.Po
+ -rm -f ./$(DEPDIR)/getpass.Po
+ -rm -f ./$(DEPDIR)/getpeername.Po
+ -rm -f ./$(DEPDIR)/getprogname.Po
+ -rm -f ./$(DEPDIR)/getrandom.Po
+ -rm -f ./$(DEPDIR)/getsockname.Po
+ -rm -f ./$(DEPDIR)/gettime.Po
+ -rm -f ./$(DEPDIR)/gettimeofday.Po
+ -rm -f ./$(DEPDIR)/group-member.Po
+ -rm -f ./$(DEPDIR)/hard-locale.Po
+ -rm -f ./$(DEPDIR)/hash-pjw.Po
+ -rm -f ./$(DEPDIR)/hash-triple-simple.Po
+ -rm -f ./$(DEPDIR)/hash.Po
+ -rm -f ./$(DEPDIR)/inet_ntop.Po
+ -rm -f ./$(DEPDIR)/ioctl.Po
+ -rm -f ./$(DEPDIR)/isblank.Po
+ -rm -f ./$(DEPDIR)/iswblank.Po
+ -rm -f ./$(DEPDIR)/iswdigit.Po
+ -rm -f ./$(DEPDIR)/iswxdigit.Po
+ -rm -f ./$(DEPDIR)/itold.Po
+ -rm -f ./$(DEPDIR)/lc-charset-dispatch.Po
+ -rm -f ./$(DEPDIR)/link.Po
+ -rm -f ./$(DEPDIR)/listen.Po
+ -rm -f ./$(DEPDIR)/localcharset.Po
+ -rm -f ./$(DEPDIR)/localeconv.Po
+ -rm -f ./$(DEPDIR)/lseek.Po
+ -rm -f ./$(DEPDIR)/lstat.Po
+ -rm -f ./$(DEPDIR)/malloc.Po
+ -rm -f ./$(DEPDIR)/malloca.Po
+ -rm -f ./$(DEPDIR)/mbchar.Po
+ -rm -f ./$(DEPDIR)/mbiter.Po
+ -rm -f ./$(DEPDIR)/mbrtowc.Po
+ -rm -f ./$(DEPDIR)/mbsinit.Po
+ -rm -f ./$(DEPDIR)/mbsrtowcs-state.Po
+ -rm -f ./$(DEPDIR)/mbsrtowcs.Po
+ -rm -f ./$(DEPDIR)/mbtowc-lock.Po
+ -rm -f ./$(DEPDIR)/mbtowc.Po
+ -rm -f ./$(DEPDIR)/md2.Po
+ -rm -f ./$(DEPDIR)/md4.Po
+ -rm -f ./$(DEPDIR)/md5.Po
+ -rm -f ./$(DEPDIR)/memchr.Po
+ -rm -f ./$(DEPDIR)/mempcpy.Po
+ -rm -f ./$(DEPDIR)/memrchr.Po
+ -rm -f ./$(DEPDIR)/mkdir.Po
+ -rm -f ./$(DEPDIR)/mkostemp.Po
+ -rm -f ./$(DEPDIR)/mkstemp.Po
+ -rm -f ./$(DEPDIR)/mktime.Po
+ -rm -f ./$(DEPDIR)/msvc-inval.Po
+ -rm -f ./$(DEPDIR)/msvc-nothrow.Po
+ -rm -f ./$(DEPDIR)/nanosleep.Po
+ -rm -f ./$(DEPDIR)/nl_langinfo-lock.Po
+ -rm -f ./$(DEPDIR)/nl_langinfo.Po
+ -rm -f ./$(DEPDIR)/open.Po
+ -rm -f ./$(DEPDIR)/openat-die.Po
+ -rm -f ./$(DEPDIR)/openat-proc.Po
+ -rm -f ./$(DEPDIR)/openat.Po
+ -rm -f ./$(DEPDIR)/opendir.Po
+ -rm -f ./$(DEPDIR)/os2-spawn.Po
+ -rm -f ./$(DEPDIR)/pipe-safer.Po
+ -rm -f ./$(DEPDIR)/pipe.Po
+ -rm -f ./$(DEPDIR)/pipe2-safer.Po
+ -rm -f ./$(DEPDIR)/pipe2.Po
+ -rm -f ./$(DEPDIR)/printf-args.Po
+ -rm -f ./$(DEPDIR)/printf-parse.Po
+ -rm -f ./$(DEPDIR)/quotearg.Po
+ -rm -f ./$(DEPDIR)/raise.Po
+ -rm -f ./$(DEPDIR)/rawmemchr.Po
+ -rm -f ./$(DEPDIR)/readdir.Po
+ -rm -f ./$(DEPDIR)/readlink.Po
+ -rm -f ./$(DEPDIR)/realloc.Po
+ -rm -f ./$(DEPDIR)/recv.Po
+ -rm -f ./$(DEPDIR)/regcomp.Po
+ -rm -f ./$(DEPDIR)/regex.Po
+ -rm -f ./$(DEPDIR)/regex_internal.Po
+ -rm -f ./$(DEPDIR)/regexec.Po
+ -rm -f ./$(DEPDIR)/rewinddir.Po
+ -rm -f ./$(DEPDIR)/save-cwd.Po
+ -rm -f ./$(DEPDIR)/secure_getenv.Po
+ -rm -f ./$(DEPDIR)/select.Po
+ -rm -f ./$(DEPDIR)/send.Po
+ -rm -f ./$(DEPDIR)/setlocale-lock.Po
+ -rm -f ./$(DEPDIR)/setlocale_null.Po
+ -rm -f ./$(DEPDIR)/setsockopt.Po
+ -rm -f ./$(DEPDIR)/sha1.Po
+ -rm -f ./$(DEPDIR)/sha256.Po
+ -rm -f ./$(DEPDIR)/sha512.Po
+ -rm -f ./$(DEPDIR)/sig-handler.Po
+ -rm -f ./$(DEPDIR)/sigaction.Po
+ -rm -f ./$(DEPDIR)/sigprocmask.Po
+ -rm -f ./$(DEPDIR)/snprintf.Po
+ -rm -f ./$(DEPDIR)/socket.Po
+ -rm -f ./$(DEPDIR)/sockets.Po
+ -rm -f ./$(DEPDIR)/spawn-pipe.Po
+ -rm -f ./$(DEPDIR)/spawn.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addchdir.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addclose.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_adddup2.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_addopen.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_destroy.Po
+ -rm -f ./$(DEPDIR)/spawn_faction_init.Po
+ -rm -f ./$(DEPDIR)/spawnattr_destroy.Po
+ -rm -f ./$(DEPDIR)/spawnattr_init.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setflags.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setpgroup.Po
+ -rm -f ./$(DEPDIR)/spawnattr_setsigmask.Po
+ -rm -f ./$(DEPDIR)/spawni.Po
+ -rm -f ./$(DEPDIR)/spawnp.Po
+ -rm -f ./$(DEPDIR)/stat-time.Po
+ -rm -f ./$(DEPDIR)/stat-w32.Po
+ -rm -f ./$(DEPDIR)/stat.Po
+ -rm -f ./$(DEPDIR)/stdio-write.Po
+ -rm -f ./$(DEPDIR)/stpcpy.Po
+ -rm -f ./$(DEPDIR)/strcasecmp.Po
+ -rm -f ./$(DEPDIR)/strchrnul.Po
+ -rm -f ./$(DEPDIR)/strdup.Po
+ -rm -f ./$(DEPDIR)/strerror-override.Po
+ -rm -f ./$(DEPDIR)/strerror.Po
+ -rm -f ./$(DEPDIR)/strerror_r.Po
+ -rm -f ./$(DEPDIR)/stripslash.Po
+ -rm -f ./$(DEPDIR)/strncasecmp.Po
+ -rm -f ./$(DEPDIR)/strndup.Po
+ -rm -f ./$(DEPDIR)/strnlen.Po
+ -rm -f ./$(DEPDIR)/strnlen1.Po
+ -rm -f ./$(DEPDIR)/strpbrk.Po
+ -rm -f ./$(DEPDIR)/strptime.Po
+ -rm -f ./$(DEPDIR)/strtok_r.Po
+ -rm -f ./$(DEPDIR)/strtol.Po
+ -rm -f ./$(DEPDIR)/strtoll.Po
+ -rm -f ./$(DEPDIR)/symlink.Po
+ -rm -f ./$(DEPDIR)/sys_socket.Po
+ -rm -f ./$(DEPDIR)/tempname.Po
+ -rm -f ./$(DEPDIR)/time_r.Po
+ -rm -f ./$(DEPDIR)/timegm.Po
+ -rm -f ./$(DEPDIR)/timespec.Po
+ -rm -f ./$(DEPDIR)/tmpdir.Po
+ -rm -f ./$(DEPDIR)/u64.Po
+ -rm -f ./$(DEPDIR)/unistd.Po
+ -rm -f ./$(DEPDIR)/unlink.Po
+ -rm -f ./$(DEPDIR)/utime.Po
+ -rm -f ./$(DEPDIR)/utimens.Po
+ -rm -f ./$(DEPDIR)/vasnprintf.Po
+ -rm -f ./$(DEPDIR)/vasprintf.Po
+ -rm -f ./$(DEPDIR)/vsnprintf.Po
+ -rm -f ./$(DEPDIR)/wait-process.Po
+ -rm -f ./$(DEPDIR)/waitpid.Po
+ -rm -f ./$(DEPDIR)/wcrtomb.Po
+ -rm -f ./$(DEPDIR)/wctype-h.Po
+ -rm -f ./$(DEPDIR)/wcwidth.Po
+ -rm -f ./$(DEPDIR)/windows-mutex.Po
+ -rm -f ./$(DEPDIR)/windows-once.Po
+ -rm -f ./$(DEPDIR)/windows-recmutex.Po
+ -rm -f ./$(DEPDIR)/windows-rwlock.Po
+ -rm -f ./$(DEPDIR)/windows-spawn.Po
+ -rm -f ./$(DEPDIR)/wmemchr.Po
+ -rm -f ./$(DEPDIR)/wmempcpy.Po
+ -rm -f ./$(DEPDIR)/write.Po
+ -rm -f ./$(DEPDIR)/xalloc-die.Po
+ -rm -f ./$(DEPDIR)/xmalloc.Po
+ -rm -f ./$(DEPDIR)/xmemdup0.Po
+ -rm -f ./$(DEPDIR)/xsize.Po
+ -rm -f ./$(DEPDIR)/xstrndup.Po
+ -rm -f glthread/$(DEPDIR)/lock.Po
+ -rm -f glthread/$(DEPDIR)/threadlib.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_dupfree.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_grow.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_grow_preserve.Po
+ -rm -f malloc/$(DEPDIR)/scratch_buffer_set_array_size.Po
+ -rm -f unicase/$(DEPDIR)/cased.Po
+ -rm -f unicase/$(DEPDIR)/empty-prefix-context.Po
+ -rm -f unicase/$(DEPDIR)/empty-suffix-context.Po
+ -rm -f unicase/$(DEPDIR)/ignorable.Po
+ -rm -f unicase/$(DEPDIR)/special-casing.Po
+ -rm -f unicase/$(DEPDIR)/tolower.Po
+ -rm -f unicase/$(DEPDIR)/u8-casemap.Po
+ -rm -f unicase/$(DEPDIR)/u8-tolower.Po
+ -rm -f unictype/$(DEPDIR)/combiningclass.Po
+ -rm -f unictype/$(DEPDIR)/pr_soft_dotted.Po
+ -rm -f uninorm/$(DEPDIR)/decompose-internal.Po
+ -rm -f uninorm/$(DEPDIR)/u8-normalize.Po
+ -rm -f unistr/$(DEPDIR)/u8-cpy.Po
+ -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe-aux.Po
+ -rm -f unistr/$(DEPDIR)/u8-mbtouc-unsafe.Po
+ -rm -f unistr/$(DEPDIR)/u8-strlen.Po
+ -rm -f unistr/$(DEPDIR)/u8-uctomb-aux.Po
+ -rm -f unistr/$(DEPDIR)/u8-uctomb.Po
+ -rm -f uniwidth/$(DEPDIR)/width.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: all check install install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstLTLIBRARIES \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-local 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 maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-local pdf pdf-am ps ps-am tags \
+ tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ALLOCA_H_TRUE@alloca.h: alloca.in.h $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ALLOCA_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_ALLOCA_H_TRUE@ sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \
+@GL_GENERATE_ALLOCA_H_TRUE@ } > $@-t && \
+@GL_GENERATE_ALLOCA_H_TRUE@ mv -f $@-t $@
+@GL_GENERATE_ALLOCA_H_FALSE@alloca.h: $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_FALSE@ rm -f $@
+
+# We need the following in order to create <arpa/inet.h> when the system
+# doesn't have one.
+arpa/inet.h: arpa_inet.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) arpa
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_ARPA_INET_H''@|$(NEXT_ARPA_INET_H)|g' \
+ -e 's|@''HAVE_ARPA_INET_H''@|$(HAVE_ARPA_INET_H)|g' \
+ -e 's/@''GNULIB_INET_NTOP''@/$(GNULIB_INET_NTOP)/g' \
+ -e 's/@''GNULIB_INET_PTON''@/$(GNULIB_INET_PTON)/g' \
+ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \
+ -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \
+ -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \
+ -e 's|@''REPLACE_INET_NTOP''@|$(REPLACE_INET_NTOP)|g' \
+ -e 's|@''REPLACE_INET_PTON''@|$(REPLACE_INET_PTON)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/arpa_inet.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <byteswap.h> when the system
+# doesn't have one.
+@GL_GENERATE_BYTESWAP_H_TRUE@byteswap.h: byteswap.in.h $(top_builddir)/config.status
+@GL_GENERATE_BYTESWAP_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_BYTESWAP_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_BYTESWAP_H_TRUE@ cat $(srcdir)/byteswap.in.h; \
+@GL_GENERATE_BYTESWAP_H_TRUE@ } > $@-t && \
+@GL_GENERATE_BYTESWAP_H_TRUE@ mv -f $@-t $@
+@GL_GENERATE_BYTESWAP_H_FALSE@byteswap.h: $(top_builddir)/config.status
+@GL_GENERATE_BYTESWAP_H_FALSE@ rm -f $@
+
+# We need the following in order to create <ctype.h> when the system
+# doesn't have one that works with the given compiler.
+ctype.h: ctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_CTYPE_H''@|$(NEXT_CTYPE_H)|g' \
+ -e 's/@''GNULIB_ISBLANK''@/$(GNULIB_ISBLANK)/g' \
+ -e 's/@''HAVE_ISBLANK''@/$(HAVE_ISBLANK)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/ctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+dirent.h: dirent.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_DIRENT_H''@|$(HAVE_DIRENT_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+ -e 's/@''GNULIB_OPENDIR''@/$(GNULIB_OPENDIR)/g' \
+ -e 's/@''GNULIB_READDIR''@/$(GNULIB_READDIR)/g' \
+ -e 's/@''GNULIB_REWINDDIR''@/$(GNULIB_REWINDDIR)/g' \
+ -e 's/@''GNULIB_CLOSEDIR''@/$(GNULIB_CLOSEDIR)/g' \
+ -e 's/@''GNULIB_DIRFD''@/$(GNULIB_DIRFD)/g' \
+ -e 's/@''GNULIB_FDOPENDIR''@/$(GNULIB_FDOPENDIR)/g' \
+ -e 's/@''GNULIB_SCANDIR''@/$(GNULIB_SCANDIR)/g' \
+ -e 's/@''GNULIB_ALPHASORT''@/$(GNULIB_ALPHASORT)/g' \
+ -e 's/@''HAVE_OPENDIR''@/$(HAVE_OPENDIR)/g' \
+ -e 's/@''HAVE_READDIR''@/$(HAVE_READDIR)/g' \
+ -e 's/@''HAVE_REWINDDIR''@/$(HAVE_REWINDDIR)/g' \
+ -e 's/@''HAVE_CLOSEDIR''@/$(HAVE_CLOSEDIR)/g' \
+ -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+ -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
+ -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+ -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+ -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+ -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+ -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+ -e 's|@''REPLACE_DIRFD''@|$(REPLACE_DIRFD)|g' \
+ -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/dirent.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+@GL_GENERATE_ERRNO_H_TRUE@errno.h: errno.in.h $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ERRNO_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_ERRNO_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@ < $(srcdir)/errno.in.h; \
+@GL_GENERATE_ERRNO_H_TRUE@ } > $@-t && \
+@GL_GENERATE_ERRNO_H_TRUE@ mv $@-t $@
+@GL_GENERATE_ERRNO_H_FALSE@errno.h: $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_FALSE@ rm -f $@
+
+# We need the following in order to create <fcntl.h> when the system
+# doesn't have one that works with the given compiler.
+fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
+ -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
+ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
+ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
+ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+ -e 's/@''GNULIB_MDA_CREAT''@/$(GNULIB_MDA_CREAT)/g' \
+ -e 's/@''GNULIB_MDA_OPEN''@/$(GNULIB_MDA_OPEN)/g' \
+ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
+ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
+ -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
+ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
+ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
+ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/fcntl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <float.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_FLOAT_H_TRUE@float.h: float.in.h $(top_builddir)/config.status
+@GL_GENERATE_FLOAT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_FLOAT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_FLOAT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+@GL_GENERATE_FLOAT_H_TRUE@ < $(srcdir)/float.in.h; \
+@GL_GENERATE_FLOAT_H_TRUE@ } > $@-t && \
+@GL_GENERATE_FLOAT_H_TRUE@ mv $@-t $@
+@GL_GENERATE_FLOAT_H_FALSE@float.h: $(top_builddir)/config.status
+@GL_GENERATE_FLOAT_H_FALSE@ rm -f $@
+
+# We need the following in order to create <fnmatch.h>.
+@GL_GENERATE_FNMATCH_H_TRUE@fnmatch.h: fnmatch.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+@GL_GENERATE_FNMATCH_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_FNMATCH_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_FNMATCH_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''HAVE_FNMATCH_H''@|$(HAVE_FNMATCH_H)|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''NEXT_FNMATCH_H''@|$(NEXT_FNMATCH_H)|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's/@''GNULIB_FNMATCH''@/$(GNULIB_FNMATCH)/g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''HAVE_FNMATCH''@|$(HAVE_FNMATCH)|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e 's|@''REPLACE_FNMATCH''@|$(REPLACE_FNMATCH)|g' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@GL_GENERATE_FNMATCH_H_TRUE@ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@GL_GENERATE_FNMATCH_H_TRUE@ < $(srcdir)/fnmatch.in.h; \
+@GL_GENERATE_FNMATCH_H_TRUE@ } > $@-t && \
+@GL_GENERATE_FNMATCH_H_TRUE@ mv $@-t $@
+@GL_GENERATE_FNMATCH_H_FALSE@fnmatch.h: $(top_builddir)/config.status
+@GL_GENERATE_FNMATCH_H_FALSE@ rm -f $@
+
+# We need the following in order to create <getopt.h> when the system
+# doesn't have one that works with the given compiler.
+getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/getopt.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+getopt-cdefs.h: getopt-cdefs.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \
+ < $(srcdir)/getopt-cdefs.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+distclean-local: clean-GNUmakefile
+clean-GNUmakefile:
+ test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile
+
+# We need the following in order to create <iconv.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ICONV_H_TRUE@iconv.h: iconv.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+@GL_GENERATE_ICONV_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ICONV_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_ICONV_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''NEXT_ICONV_H''@|$(NEXT_ICONV_H)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's/@''GNULIB_ICONV''@/$(GNULIB_ICONV)/g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''ICONV_CONST''@|$(ICONV_CONST)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''REPLACE_ICONV''@|$(REPLACE_ICONV)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''REPLACE_ICONV_OPEN''@|$(REPLACE_ICONV_OPEN)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e 's|@''REPLACE_ICONV_UTF''@|$(REPLACE_ICONV_UTF)|g' \
+@GL_GENERATE_ICONV_H_TRUE@ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+@GL_GENERATE_ICONV_H_TRUE@ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+@GL_GENERATE_ICONV_H_TRUE@ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+@GL_GENERATE_ICONV_H_TRUE@ < $(srcdir)/iconv.in.h; \
+@GL_GENERATE_ICONV_H_TRUE@ } > $@-t && \
+@GL_GENERATE_ICONV_H_TRUE@ mv $@-t $@
+@GL_GENERATE_ICONV_H_FALSE@iconv.h: $(top_builddir)/config.status
+@GL_GENERATE_ICONV_H_FALSE@ rm -f $@
+
+# We need the following in order to create <inttypes.h> when the system
+# doesn't have one that works with the given compiler.
+inttypes.h: inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
+ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \
+ -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \
+ -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \
+ -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \
+ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
+ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
+ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
+ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \
+ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \
+ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \
+ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \
+ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \
+ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \
+ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \
+ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/inttypes.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create an empty placeholder for
+# <langinfo.h> when the system doesn't have one.
+langinfo.h: langinfo.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \
+ -e 's/@''GNULIB_NL_LANGINFO''@/$(GNULIB_NL_LANGINFO)/g' \
+ -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \
+ -e 's|@''HAVE_LANGINFO_T_FMT_AMPM''@|$(HAVE_LANGINFO_T_FMT_AMPM)|g' \
+ -e 's|@''HAVE_LANGINFO_ALTMON''@|$(HAVE_LANGINFO_ALTMON)|g' \
+ -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \
+ -e 's|@''HAVE_LANGINFO_YESEXPR''@|$(HAVE_LANGINFO_YESEXPR)|g' \
+ -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \
+ -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/langinfo.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+@GL_GENERATE_LIMITS_H_TRUE@limits.h: limits.in.h $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_LIMITS_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_LIMITS_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@ < $(srcdir)/limits.in.h; \
+@GL_GENERATE_LIMITS_H_TRUE@ } > $@-t && \
+@GL_GENERATE_LIMITS_H_TRUE@ mv $@-t $@
+@GL_GENERATE_LIMITS_H_FALSE@limits.h: $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_FALSE@ rm -f $@
+
+# We need the following in order to create <locale.h> when the system
+# doesn't have one that provides all definitions.
+locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \
+ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \
+ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \
+ -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GNULIB_SETLOCALE_NULL)/g' \
+ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \
+ -e 's/@''GNULIB_LOCALENAME''@/$(GNULIB_LOCALENAME)/g' \
+ -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \
+ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \
+ -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \
+ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \
+ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \
+ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \
+ -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \
+ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \
+ -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \
+ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/locale.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <netdb.h> when the system
+# doesn't have one that works with the given compiler.
+netdb.h: netdb.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \
+ -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \
+ -e 's/@''GNULIB_GETADDRINFO''@/$(GNULIB_GETADDRINFO)/g' \
+ -e 's|@''HAVE_STRUCT_ADDRINFO''@|$(HAVE_STRUCT_ADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_FREEADDRINFO''@|$(HAVE_DECL_FREEADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \
+ -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \
+ -e 's|@''REPLACE_GAI_STRERROR''@|$(REPLACE_GAI_STRERROR)|g' \
+ -e 's|@''REPLACE_GETADDRINFO''@|$(REPLACE_GETADDRINFO)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/netdb.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <netinet/in.h> when the system
+# doesn't have one.
+@GL_GENERATE_NETINET_IN_H_TRUE@netinet/in.h: netinet_in.in.h $(top_builddir)/config.status
+@GL_GENERATE_NETINET_IN_H_TRUE@ $(AM_V_at)$(MKDIR_P) netinet
+@GL_GENERATE_NETINET_IN_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_NETINET_IN_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_NETINET_IN_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \
+@GL_GENERATE_NETINET_IN_H_TRUE@ < $(srcdir)/netinet_in.in.h; \
+@GL_GENERATE_NETINET_IN_H_TRUE@ } > $@-t && \
+@GL_GENERATE_NETINET_IN_H_TRUE@ mv $@-t $@
+@GL_GENERATE_NETINET_IN_H_FALSE@netinet/in.h: $(top_builddir)/config.status
+@GL_GENERATE_NETINET_IN_H_FALSE@ rm -f $@
+
+# We need the following in order to create a replacement for <sched.h> when
+# the system doesn't have one.
+sched.h: sched.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SCHED_H''@|$(HAVE_SCHED_H)|g' \
+ -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SCHED_H''@|$(NEXT_SCHED_H)|g' \
+ -e 's|@''HAVE_STRUCT_SCHED_PARAM''@|$(HAVE_STRUCT_SCHED_PARAM)|g' \
+ -e 's/@''GNULIB_SCHED_YIELD''@/$(GNULIB_SCHED_YIELD)/g' \
+ -e 's|@''HAVE_SCHED_YIELD''@|$(HAVE_SCHED_YIELD)|g' \
+ -e 's|@''REPLACE_SCHED_YIELD''@|$(REPLACE_SCHED_YIELD)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sched.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <signal.h> when the system
+# doesn't have a complete one.
+signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
+ -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \
+ -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \
+ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \
+ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \
+ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
+ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \
+ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \
+ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \
+ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \
+ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \
+ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \
+ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \
+ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \
+ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \
+ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/signal.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create a replacement for <spawn.h> when
+# the system doesn't have one.
+spawn.h: spawn.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SPAWN_H''@|$(HAVE_SPAWN_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
+ -e 's/@''GNULIB_POSIX_SPAWN''@/$(GNULIB_POSIX_SPAWN)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GNULIB_POSIX_SPAWNP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GNULIB_POSIX_SPAWNATTR_INIT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
+ -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
+ -e 's|@''HAVE_POSIX_SPAWNATTR_T''@|$(HAVE_POSIX_SPAWNATTR_T)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN''@|$(REPLACE_POSIX_SPAWN)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/spawn.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <stdalign.h> when the system
+# doesn't have one that works.
+@GL_GENERATE_STDALIGN_H_TRUE@stdalign.h: stdalign.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDALIGN_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDALIGN_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDALIGN_H_TRUE@ cat $(srcdir)/stdalign.in.h; \
+@GL_GENERATE_STDALIGN_H_TRUE@ } > $@-t && \
+@GL_GENERATE_STDALIGN_H_TRUE@ mv $@-t $@
+@GL_GENERATE_STDALIGN_H_FALSE@stdalign.h: $(top_builddir)/config.status
+@GL_GENERATE_STDALIGN_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+@GL_GENERATE_STDBOOL_H_TRUE@stdbool.h: stdbool.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDBOOL_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDBOOL_H_TRUE@ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
+@GL_GENERATE_STDBOOL_H_TRUE@ } > $@-t && \
+@GL_GENERATE_STDBOOL_H_TRUE@ mv $@-t $@
+@GL_GENERATE_STDBOOL_H_FALSE@stdbool.h: $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDDEF_H_TRUE@stddef.h: stddef.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDDEF_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_STDDEF_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@ < $(srcdir)/stddef.in.h; \
+@GL_GENERATE_STDDEF_H_TRUE@ } > $@-t && \
+@GL_GENERATE_STDDEF_H_TRUE@ mv $@-t $@
+@GL_GENERATE_STDDEF_H_FALSE@stddef.h: $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDINT_H_TRUE@stdint.h: stdint.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_TRUE@ $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDINT_H_TRUE@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDINT_H_TRUE@ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@ < $(srcdir)/stdint.in.h; \
+@GL_GENERATE_STDINT_H_TRUE@ } > $@-t && \
+@GL_GENERATE_STDINT_H_TRUE@ mv $@-t $@
+@GL_GENERATE_STDINT_H_FALSE@stdint.h: $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_FALSE@ rm -f $@
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
+ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
+ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
+ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
+ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
+ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
+ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
+ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
+ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
+ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
+ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
+ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
+ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
+ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
+ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
+ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
+ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
+ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
+ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
+ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
+ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
+ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
+ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
+ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
+ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
+ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
+ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
+ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
+ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
+ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
+ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
+ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
+ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
+ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
+ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
+ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
+ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
+ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
+ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
+ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
+ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GNULIB_MDA_FCLOSEALL)/g' \
+ -e 's/@''GNULIB_MDA_FDOPEN''@/$(GNULIB_MDA_FDOPEN)/g' \
+ -e 's/@''GNULIB_MDA_FILENO''@/$(GNULIB_MDA_FILENO)/g' \
+ -e 's/@''GNULIB_MDA_GETW''@/$(GNULIB_MDA_GETW)/g' \
+ -e 's/@''GNULIB_MDA_PUTW''@/$(GNULIB_MDA_PUTW)/g' \
+ -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GNULIB_MDA_TEMPNAM)/g' \
+ < $(srcdir)/stdio.in.h | \
+ sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+ -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
+ -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GNULIB_ALIGNED_ALLOC)/g' \
+ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
+ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GNULIB_FREE_POSIX)/g' \
+ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
+ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
+ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
+ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
+ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
+ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+ -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GNULIB_POSIX_MEMALIGN)/g' \
+ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
+ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
+ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
+ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
+ -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
+ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
+ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
+ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
+ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
+ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
+ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
+ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
+ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
+ -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
+ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
+ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
+ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
+ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
+ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
+ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+ -e 's/@''GNULIB_MDA_ECVT''@/$(GNULIB_MDA_ECVT)/g' \
+ -e 's/@''GNULIB_MDA_FCVT''@/$(GNULIB_MDA_FCVT)/g' \
+ -e 's/@''GNULIB_MDA_GCVT''@/$(GNULIB_MDA_GCVT)/g' \
+ -e 's/@''GNULIB_MDA_MKTEMP''@/$(GNULIB_MDA_MKTEMP)/g' \
+ -e 's/@''GNULIB_MDA_PUTENV''@/$(GNULIB_MDA_PUTENV)/g' \
+ < $(srcdir)/stdlib.in.h | \
+ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+ -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
+ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+ -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+ -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
+ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
+ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+ -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
+ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
+ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
+ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
+ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
+ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
+ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
+ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
+ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
+ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
+ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
+ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
+ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
+ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
+ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
+ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
+ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
+ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
+ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
+ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
+ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
+ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
+ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
+ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
+ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
+ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
+ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
+ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
+ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
+ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
+ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
+ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
+ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
+ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
+ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
+ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
+ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
+ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
+ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
+ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
+ -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GNULIB_STRERRORNAME_NP)/g' \
+ -e 's/@''GNULIB_SIGABBREV_NP''@/$(GNULIB_SIGABBREV_NP)/g' \
+ -e 's/@''GNULIB_SIGDESCR_NP''@/$(GNULIB_SIGDESCR_NP)/g' \
+ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
+ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+ -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GNULIB_MDA_MEMCCPY)/g' \
+ -e 's/@''GNULIB_MDA_STRDUP''@/$(GNULIB_MDA_STRDUP)/g' \
+ < $(srcdir)/string.in.h | \
+ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+ -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+ -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+ -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
+ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+ -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
+ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ < $(srcdir)/string.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <strings.h> when the system
+# doesn't have one that works with the given compiler.
+strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
+ -e 's/@''GNULIB_FFS''@/$(GNULIB_FFS)/g' \
+ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \
+ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/strings.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/file.h> when the system
+# has one that is incomplete.
+sys/file.h: sys_file.in.h $(top_builddir)/config.status $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_SYS_FILE_H''@/$(HAVE_SYS_FILE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_FILE_H''@|$(NEXT_SYS_FILE_H)|g' \
+ -e 's/@''HAVE_FLOCK''@/$(HAVE_FLOCK)/g' \
+ -e 's/@''GNULIB_FLOCK''@/$(GNULIB_FLOCK)/g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_file.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+sys/ioctl.h: sys_ioctl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+ -e 's/@''GNULIB_IOCTL''@/$(GNULIB_IOCTL)/g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e 's|@''REPLACE_IOCTL''@|$(REPLACE_IOCTL)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_ioctl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/random.h> when the system
+# doesn't have one.
+sys/random.h: sys_random.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_RANDOM_H''@|$(NEXT_SYS_RANDOM_H)|g' \
+ -e 's|@''HAVE_SYS_RANDOM_H''@|$(HAVE_SYS_RANDOM_H)|g' \
+ -e 's/@''GNULIB_GETRANDOM''@/$(GNULIB_GETRANDOM)/g' \
+ -e 's/@''HAVE_GETRANDOM''@/$(HAVE_GETRANDOM)/g' \
+ -e 's/@''REPLACE_GETRANDOM''@/$(REPLACE_GETRANDOM)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_random.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+# We need the following in order to create <sys/select.h> when the system
+# doesn't have one that works with the given compiler.
+sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \
+ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \
+ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \
+ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \
+ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \
+ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_select.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/socket.h> when the system
+# doesn't have one that works with the given compiler.
+sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \
+ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \
+ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \
+ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \
+ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \
+ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \
+ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \
+ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \
+ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \
+ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \
+ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \
+ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \
+ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \
+ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \
+ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \
+ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \
+ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \
+ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \
+ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \
+ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_socket.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+# We need the following in order to create <sys/stat.h> when the system
+# has one that is incomplete.
+sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \
+ -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \
+ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \
+ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \
+ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \
+ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \
+ -e 's/@''GNULIB_GETUMASK''@/$(GNULIB_GETUMASK)/g' \
+ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \
+ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \
+ -e 's/@''GNULIB_MKDIR''@/$(GNULIB_MKDIR)/g' \
+ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \
+ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \
+ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \
+ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \
+ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \
+ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \
+ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \
+ -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \
+ -e 's/@''GNULIB_MDA_CHMOD''@/$(GNULIB_MDA_CHMOD)/g' \
+ -e 's/@''GNULIB_MDA_MKDIR''@/$(GNULIB_MDA_MKDIR)/g' \
+ -e 's/@''GNULIB_MDA_UMASK''@/$(GNULIB_MDA_UMASK)/g' \
+ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
+ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
+ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
+ -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \
+ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
+ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \
+ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \
+ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
+ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
+ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
+ -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \
+ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
+ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
+ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
+ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
+ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
+ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
+ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
+ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
+ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_stat.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/time.h> when the system
+# doesn't have one that works with the given compiler.
+sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \
+ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \
+ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+sys/types.h: sys_types.in.h $(top_builddir)/config.status
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+ < $(srcdir)/sys_types.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <sys/uio.h> when the system
+# doesn't have one that works with the given compiler.
+sys/uio.h: sys_uio.in.h $(top_builddir)/config.status
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \
+ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \
+ < $(srcdir)/sys_uio.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+# We need the following in order to create <sys/wait.h> when the system
+# has one that is incomplete.
+sys/wait.h: sys_wait.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_WAIT_H''@|$(NEXT_SYS_WAIT_H)|g' \
+ -e 's/@''GNULIB_WAITPID''@/$(GNULIB_WAITPID)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_wait.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <time.h> when the system
+# doesn't have one that works with the given compiler.
+time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
+ -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \
+ -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \
+ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \
+ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \
+ -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \
+ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \
+ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
+ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
+ -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \
+ -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \
+ -e 's/@''GNULIB_MDA_TZSET''@/$(GNULIB_MDA_TZSET)/g' \
+ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \
+ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \
+ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
+ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
+ -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \
+ -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \
+ -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
+ -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \
+ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
+ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \
+ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
+ -e 's|@''REPLACE_STRFTIME''@|$(REPLACE_STRFTIME)|g' \
+ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \
+ -e 's|@''REPLACE_TZSET''@|$(REPLACE_TZSET)|g' \
+ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+unicase.h: unicase.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unicase.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+$(srcdir)/unicase/special-casing-table.h: $(srcdir)/unicase/special-casing-table.gperf
+ $(V_GPERF)$(GPERF) -m 10 $(srcdir)/unicase/special-casing-table.gperf > $(srcdir)/unicase/special-casing-table.h-t && \
+ mv $(srcdir)/unicase/special-casing-table.h-t $(srcdir)/unicase/special-casing-table.h
+
+# Generate special-casing.h with a declaration that depends on the gperf version.
+unicase/special-casing.h: unicase/special-casing.in.h unicase/special-casing-table.h
+ $(AM_V_at)$(MKDIR_P) unicase
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ declaration=`grep '^gl_unicase_special_lookup' $(srcdir)/unicase/special-casing-table.h | sed -e 's/register //g'` && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e "/gl_unicase_special_lookup/s/gl_unicase_special_lookup.*/$${declaration};/" $(srcdir)/unicase/special-casing.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+unictype.h: unictype.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unictype.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+uninorm.h: uninorm.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/uninorm.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
+ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
+ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
+ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
+ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
+ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
+ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
+ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
+ -e 's/@''GNULIB_EXECL''@/$(GNULIB_EXECL)/g' \
+ -e 's/@''GNULIB_EXECLE''@/$(GNULIB_EXECLE)/g' \
+ -e 's/@''GNULIB_EXECLP''@/$(GNULIB_EXECLP)/g' \
+ -e 's/@''GNULIB_EXECV''@/$(GNULIB_EXECV)/g' \
+ -e 's/@''GNULIB_EXECVE''@/$(GNULIB_EXECVE)/g' \
+ -e 's/@''GNULIB_EXECVP''@/$(GNULIB_EXECVP)/g' \
+ -e 's/@''GNULIB_EXECVPE''@/$(GNULIB_EXECVPE)/g' \
+ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
+ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
+ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
+ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
+ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
+ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
+ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
+ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
+ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
+ -e 's/@''GNULIB_GETENTROPY''@/$(GNULIB_GETENTROPY)/g' \
+ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
+ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
+ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
+ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
+ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GNULIB_GETOPT_POSIX)/g' \
+ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
+ -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
+ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
+ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
+ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
+ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
+ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
+ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
+ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
+ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
+ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
+ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
+ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
+ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
+ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
+ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
+ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
+ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
+ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
+ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
+ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
+ -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
+ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
+ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
+ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
+ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
+ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
+ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+ -e 's/@''GNULIB_MDA_ACCESS''@/$(GNULIB_MDA_ACCESS)/g' \
+ -e 's/@''GNULIB_MDA_CHDIR''@/$(GNULIB_MDA_CHDIR)/g' \
+ -e 's/@''GNULIB_MDA_CLOSE''@/$(GNULIB_MDA_CLOSE)/g' \
+ -e 's/@''GNULIB_MDA_DUP''@/$(GNULIB_MDA_DUP)/g' \
+ -e 's/@''GNULIB_MDA_DUP2''@/$(GNULIB_MDA_DUP2)/g' \
+ -e 's/@''GNULIB_MDA_EXECL''@/$(GNULIB_MDA_EXECL)/g' \
+ -e 's/@''GNULIB_MDA_EXECLE''@/$(GNULIB_MDA_EXECLE)/g' \
+ -e 's/@''GNULIB_MDA_EXECLP''@/$(GNULIB_MDA_EXECLP)/g' \
+ -e 's/@''GNULIB_MDA_EXECV''@/$(GNULIB_MDA_EXECV)/g' \
+ -e 's/@''GNULIB_MDA_EXECVE''@/$(GNULIB_MDA_EXECVE)/g' \
+ -e 's/@''GNULIB_MDA_EXECVP''@/$(GNULIB_MDA_EXECVP)/g' \
+ -e 's/@''GNULIB_MDA_EXECVPE''@/$(GNULIB_MDA_EXECVPE)/g' \
+ -e 's/@''GNULIB_MDA_GETCWD''@/$(GNULIB_MDA_GETCWD)/g' \
+ -e 's/@''GNULIB_MDA_GETPID''@/$(GNULIB_MDA_GETPID)/g' \
+ -e 's/@''GNULIB_MDA_ISATTY''@/$(GNULIB_MDA_ISATTY)/g' \
+ -e 's/@''GNULIB_MDA_LSEEK''@/$(GNULIB_MDA_LSEEK)/g' \
+ -e 's/@''GNULIB_MDA_READ''@/$(GNULIB_MDA_READ)/g' \
+ -e 's/@''GNULIB_MDA_RMDIR''@/$(GNULIB_MDA_RMDIR)/g' \
+ -e 's/@''GNULIB_MDA_SWAB''@/$(GNULIB_MDA_SWAB)/g' \
+ -e 's/@''GNULIB_MDA_UNLINK''@/$(GNULIB_MDA_UNLINK)/g' \
+ -e 's/@''GNULIB_MDA_WRITE''@/$(GNULIB_MDA_WRITE)/g' \
+ < $(srcdir)/unistd.in.h | \
+ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+ -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
+ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
+ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+ -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
+ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+ -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+ -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+ -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+ -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+ -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+ -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+ -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
+ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+
+unistr.h: unistr.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unistr.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+unitypes.h: unitypes.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unitypes.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+uniwidth.h: uniwidth.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/uniwidth.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+# We need the following in order to create <utime.h> when the system
+# doesn't have one that works with the given compiler.
+utime.h: utime.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_UTIME_H''@/$(HAVE_UTIME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UTIME_H''@|$(NEXT_UTIME_H)|g' \
+ -e 's/@''GNULIB_UTIME''@/$(GNULIB_UTIME)/g' \
+ -e 's/@''GNULIB_MDA_UTIME''@/$(GNULIB_MDA_UTIME)/g' \
+ -e 's|@''HAVE_UTIME''@|$(HAVE_UTIME)|g' \
+ -e 's|@''REPLACE_UTIME''@|$(REPLACE_UTIME)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/utime.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <wchar.h> when the system
+# version does not work standalone.
+wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
+ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \
+ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \
+ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \
+ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \
+ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \
+ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \
+ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \
+ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \
+ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \
+ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \
+ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \
+ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \
+ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \
+ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \
+ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \
+ -e 's/@''GNULIB_WMEMPCPY''@/$(GNULIB_WMEMPCPY)/g' \
+ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \
+ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \
+ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \
+ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \
+ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \
+ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \
+ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \
+ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \
+ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \
+ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \
+ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \
+ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \
+ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \
+ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \
+ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \
+ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \
+ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \
+ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \
+ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \
+ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \
+ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \
+ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \
+ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \
+ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \
+ -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \
+ -e 's/@''GNULIB_MDA_WCSDUP''@/$(GNULIB_MDA_WCSDUP)/g' \
+ < $(srcdir)/wchar.in.h | \
+ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
+ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
+ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
+ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \
+ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \
+ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \
+ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \
+ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \
+ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \
+ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \
+ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \
+ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
+ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
+ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
+ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
+ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
+ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
+ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \
+ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \
+ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \
+ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \
+ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \
+ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \
+ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \
+ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \
+ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \
+ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \
+ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \
+ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \
+ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \
+ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \
+ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \
+ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \
+ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
+ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
+ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
+ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \
+ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
+ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
+ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+ -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
+ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
+ | \
+ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
+ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
+ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
+ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
+ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
+ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \
+ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \
+ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \
+ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \
+ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \
+ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
+ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \
+ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \
+ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+
+# We need the following in order to create <wctype.h> when the system
+# doesn't have one that works with the given compiler.
+wctype.h: wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+ -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \
+ -e 's/@''GNULIB_ISWDIGIT''@/$(GNULIB_ISWDIGIT)/g' \
+ -e 's/@''GNULIB_ISWXDIGIT''@/$(GNULIB_ISWXDIGIT)/g' \
+ -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \
+ -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \
+ -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \
+ -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \
+ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
+ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
+ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/wctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+
+mostlyclean-local: mostlyclean-generic
+ @for dir in '' $(MOSTLYCLEANDIRS); do \
+ if test -n "$$dir" && test -d $$dir; then \
+ echo "rmdir $$dir"; rmdir $$dir; \
+ fi; \
+ done; \
+ :
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h
new file mode 100644
index 0000000..394ca3c
--- /dev/null
+++ b/lib/_Noreturn.h
@@ -0,0 +1,43 @@
+/* A C macro for declaring that a function does not return.
+ Copyright (C) 2011-2020 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/>. */
+
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || 4 < __GNUC__ + (7 <= __GNUC_MINOR__) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))
+ /* _Noreturn works as-is. */
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
diff --git a/lib/accept.c b/lib/accept.c
new file mode 100644
index 0000000..9be0211
--- /dev/null
+++ b/lib/accept.c
@@ -0,0 +1,52 @@
+/* accept.c --- wrappers for Windows accept function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef accept
+
+int
+rpl_accept (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ SOCKET fh = accept (sock, addr, addrlen);
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+ }
+}
diff --git a/lib/access.c b/lib/access.c
new file mode 100644
index 0000000..ba515cc
--- /dev/null
+++ b/lib/access.c
@@ -0,0 +1,31 @@
+/* Test the access rights of a file.
+ Copyright (C) 2019-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <fcntl.h>
+#include <io.h>
+
+int
+access (const char *file, int mode)
+{
+ if ((mode & X_OK) != 0)
+ mode = (mode & ~X_OK) | R_OK;
+ return _access (file, mode);
+}
diff --git a/lib/af_alg.c b/lib/af_alg.c
new file mode 100644
index 0000000..1d84e80
--- /dev/null
+++ b/lib/af_alg.c
@@ -0,0 +1,213 @@
+/* af_alg.c - Compute message digests from file streams and buffers.
+ Copyright (C) 2018-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Matteo Croce <mcroce@redhat.com>, 2018. */
+
+#include <config.h>
+
+#include "af_alg.h"
+
+#if USE_LINUX_CRYPTO_API
+
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <linux/if_alg.h>
+#include <sys/stat.h>
+#include <sys/sendfile.h>
+#include <sys/socket.h>
+
+#include "sys-limits.h"
+
+#define BLOCKSIZE 32768
+
+/* Return a newly created socket for ALG.
+ On error, return a negative error number. */
+static int
+alg_socket (char const *alg)
+{
+ struct sockaddr_alg salg = {
+ .salg_family = AF_ALG,
+ .salg_type = "hash",
+ };
+ /* Copy alg into salg.salg_name, without calling strcpy nor strlen. */
+ for (size_t i = 0; (salg.salg_name[i] = alg[i]) != '\0'; i++)
+ if (i == sizeof salg.salg_name - 1)
+ /* alg is too long. */
+ return -EINVAL;
+
+ int cfd = socket (AF_ALG, SOCK_SEQPACKET | SOCK_CLOEXEC, 0);
+ if (cfd < 0)
+ return -EAFNOSUPPORT;
+ int ofd = (bind (cfd, (struct sockaddr *) &salg, sizeof salg) == 0
+ ? accept4 (cfd, NULL, 0, SOCK_CLOEXEC)
+ : -1);
+ close (cfd);
+ return ofd < 0 ? -EAFNOSUPPORT : ofd;
+}
+
+int
+afalg_buffer (const char *buffer, size_t len, const char *alg,
+ void *resblock, ssize_t hashlen)
+{
+ /* On Linux < 4.9, the value for an empty stream is wrong (all zeroes).
+ See <https://patchwork.kernel.org/patch/9308641/>.
+ This was not fixed properly until November 2016,
+ see <https://patchwork.kernel.org/patch/9434741/>. */
+ if (len == 0)
+ return -EAFNOSUPPORT;
+
+ int ofd = alg_socket (alg);
+ if (ofd < 0)
+ return ofd;
+
+ int result;
+
+ for (;;)
+ {
+ ssize_t size = (len > BLOCKSIZE ? BLOCKSIZE : len);
+ if (send (ofd, buffer, size, MSG_MORE) != size)
+ {
+ result = -EAFNOSUPPORT;
+ break;
+ }
+ buffer += size;
+ len -= size;
+ if (len == 0)
+ {
+ result = read (ofd, resblock, hashlen) == hashlen ? 0 : -EAFNOSUPPORT;
+ break;
+ }
+ }
+
+ close (ofd);
+ return result;
+}
+
+int
+afalg_stream (FILE *stream, const char *alg,
+ void *resblock, ssize_t hashlen)
+{
+ int ofd = alg_socket (alg);
+ if (ofd < 0)
+ return ofd;
+
+ /* If STREAM's size is known and nonzero and not too large, attempt
+ sendfile to pipe the data. The nonzero restriction avoids issues
+ with /proc files that pretend to be empty, and lets the classic
+ read-write loop work around an empty-input bug noted below. */
+ int fd = fileno (stream);
+ int result;
+ struct stat st;
+ off_t off = ftello (stream);
+ if (0 <= off && fstat (fd, &st) == 0
+ && (S_ISREG (st.st_mode) || S_TYPEISSHM (&st) || S_TYPEISTMO (&st))
+ && off < st.st_size && st.st_size - off < SYS_BUFSIZE_MAX)
+ {
+ /* Make sure the offset of fileno (stream) reflects how many bytes
+ have been read from stream before this function got invoked.
+ Note: fflush on an input stream after ungetc does not work as expected
+ on some platforms. Therefore this situation is not supported here. */
+ if (fflush (stream))
+ result = -EIO;
+ else
+ {
+ off_t nbytes = st.st_size - off;
+ if (sendfile (ofd, fd, &off, nbytes) == nbytes)
+ {
+ if (read (ofd, resblock, hashlen) == hashlen)
+ {
+ /* The input buffers of stream are no longer valid. */
+ if (lseek (fd, off, SEEK_SET) != (off_t)-1)
+ result = 0;
+ else
+ /* The file position of fd has not changed. */
+ result = -EAFNOSUPPORT;
+ }
+ else
+ /* The file position of fd has not changed. */
+ result = -EAFNOSUPPORT;
+ }
+ else
+ /* The file position of fd has not changed. */
+ result = -EAFNOSUPPORT;
+ }
+ }
+ else
+ {
+ /* sendfile not possible, do a classic read-write loop. */
+
+ /* Number of bytes to seek (backwards) in case of error. */
+ off_t nseek = 0;
+
+ for (;;)
+ {
+ char buf[BLOCKSIZE];
+ /* When the stream is not seekable, start with a single-byte block,
+ so that we can use ungetc() in the case that send() fails. */
+ size_t blocksize = (nseek == 0 && off < 0 ? 1 : BLOCKSIZE);
+ ssize_t size = fread (buf, 1, blocksize, stream);
+ if (size == 0)
+ {
+ /* On Linux < 4.9, the value for an empty stream is wrong (all 0).
+ See <https://patchwork.kernel.org/patch/9308641/>.
+ This was not fixed properly until November 2016,
+ see <https://patchwork.kernel.org/patch/9434741/>. */
+ result = ferror (stream) ? -EIO : nseek == 0 ? -EAFNOSUPPORT : 0;
+ break;
+ }
+ nseek -= size;
+ if (send (ofd, buf, size, MSG_MORE) != size)
+ {
+ if (nseek == -1)
+ {
+ /* 1 byte of pushback buffer is guaranteed on stream, even
+ if stream is not seekable. */
+ ungetc ((unsigned char) buf[0], stream);
+ result = -EAFNOSUPPORT;
+ }
+ else if (fseeko (stream, nseek, SEEK_CUR) == 0)
+ /* The position of stream has been restored. */
+ result = -EAFNOSUPPORT;
+ else
+ result = -EIO;
+ break;
+ }
+
+ /* Don't assume that EOF is sticky. See:
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=19476>. */
+ if (feof (stream))
+ {
+ result = 0;
+ break;
+ }
+ }
+
+ if (result == 0 && read (ofd, resblock, hashlen) != hashlen)
+ {
+ if (nseek == 0 || fseeko (stream, nseek, SEEK_CUR) == 0)
+ /* The position of stream has been restored. */
+ result = -EAFNOSUPPORT;
+ else
+ result = -EIO;
+ }
+ }
+ close (ofd);
+ return result;
+}
+
+#endif
diff --git a/lib/af_alg.h b/lib/af_alg.h
new file mode 100644
index 0000000..fcfb12f
--- /dev/null
+++ b/lib/af_alg.h
@@ -0,0 +1,115 @@
+/* af_alg.h - Compute message digests from file streams and buffers.
+ Copyright (C) 2018-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Matteo Croce <mcroce@redhat.com>, 2018.
+ Documentation by Bruno Haible <bruno@clisp.org>, 2018. */
+
+/* Declare specific functions for computing message digests
+ using the Linux kernel crypto API, if available. This kernel API gives
+ access to specialized crypto instructions (that would also be available
+ in user space) or to crypto devices (not directly available in user space).
+
+ For a more complete set of facilities that use the Linux kernel crypto API,
+ look at libkcapi. */
+
+#ifndef AF_ALG_H
+# define AF_ALG_H 1
+
+# include <stdio.h>
+# include <errno.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if USE_LINUX_CRYPTO_API
+
+/* Compute a message digest of a memory region.
+
+ The memory region starts at BUFFER and is LEN bytes long.
+
+ ALG is the message digest algorithm; see the file /proc/crypto.
+
+ RESBLOCK points to a block of HASHLEN bytes, for the result.
+ HASHLEN must be the length of the message digest, in bytes, in particular:
+
+ alg | hashlen
+ -------+--------
+ md5 | 16
+ sha1 | 20
+ sha224 | 28
+ sha256 | 32
+ sha384 | 48
+ sha512 | 64
+
+ If successful, fill RESBLOCK and return 0.
+ Upon failure, return a negated error number. */
+int
+afalg_buffer (const char *buffer, size_t len, const char *alg,
+ void *resblock, ssize_t hashlen);
+
+/* Compute a message digest of data read from STREAM.
+
+ STREAM is an open file stream. The last operation on STREAM should
+ not be 'ungetc', and if STREAM is also open for writing it should
+ have been fflushed since its last write. Read from the current
+ position to the end of STREAM. Handle regular files efficiently.
+
+ ALG is the message digest algorithm; see the file /proc/crypto.
+
+ RESBLOCK points to a block of HASHLEN bytes, for the result.
+ HASHLEN must be the length of the message digest, in bytes, in particular:
+
+ alg | hashlen
+ -------+--------
+ md5 | 16
+ sha1 | 20
+ sha224 | 28
+ sha256 | 32
+ sha384 | 48
+ sha512 | 64
+
+ If successful, fill RESBLOCK and return 0.
+ Upon failure, return a negated error number.
+ Unless returning 0 or -EIO, restore STREAM's file position so that
+ the caller can fall back on some other method. */
+int
+afalg_stream (FILE *stream, const char *alg,
+ void *resblock, ssize_t hashlen);
+
+# else
+
+static inline int
+afalg_buffer (const char *buffer, size_t len, const char *alg,
+ void *resblock, ssize_t hashlen)
+{
+ return -EAFNOSUPPORT;
+}
+
+static inline int
+afalg_stream (FILE *stream, const char *alg,
+ void *resblock, ssize_t hashlen)
+{
+ return -EAFNOSUPPORT;
+}
+
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* AF_ALG_H */
diff --git a/lib/alloca.c b/lib/alloca.c
new file mode 100644
index 0000000..91b9ec3
--- /dev/null
+++ b/lib/alloca.c
@@ -0,0 +1,200 @@
+/* alloca.c -- allocate automatically reclaimed memory
+ (Mostly) portable public-domain implementation -- D A Gwyn
+
+ This implementation of the PWB library alloca function,
+ which is used to allocate space off the run-time stack so
+ that it is automatically reclaimed upon procedure exit,
+ was inspired by discussions with J. Q. Johnson of Cornell.
+ J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+ There are some preprocessor constants that can
+ be defined when compiling for your specific system, for
+ improved efficiency; however, the defaults should be okay.
+
+ The general concept of this implementation is to keep
+ track of all alloca-allocated blocks, and reclaim any
+ that are found to be deeper in the stack than the current
+ invocation. This heuristic does not reclaim storage as
+ soon as it becomes invalid, but it will do so eventually.
+
+ As a special case, alloca(0) reclaims storage without
+ allocating any. It is a good idea to use alloca(0) in
+ your main control loop, etc. to force garbage collection. */
+
+#include <config.h>
+
+#include <alloca.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef emacs
+# include "lisp.h"
+# include "blockinput.h"
+# ifdef EMACS_FREE
+# undef free
+# define free EMACS_FREE
+# endif
+#else
+# define memory_full() abort ()
+#endif
+
+/* If compiling with GCC or clang, this file is not needed. */
+#if !(defined __GNUC__ || defined __clang__)
+
+/* If someone has defined alloca as a macro,
+ there must be some other way alloca is supposed to work. */
+# ifndef alloca
+
+# ifdef emacs
+# ifdef static
+/* actually, only want this if static is defined as ""
+ -- this is for usg, in which emacs must undefine static
+ in order to make unexec workable
+ */
+# ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+ old and obscure compilers. */
+# endif /* STACK_DIRECTION undefined */
+# endif /* static */
+# endif /* emacs */
+
+/* Define STACK_DIRECTION if you know the direction of stack
+ growth for your system; otherwise it will be automatically
+ deduced at run-time.
+
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+
+# ifndef STACK_DIRECTION
+# define STACK_DIRECTION 0 /* Direction unknown. */
+# endif
+
+# if STACK_DIRECTION != 0
+
+# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */
+
+# else /* STACK_DIRECTION == 0; need run-time code. */
+
+static int stack_dir; /* 1 or -1 once known. */
+# define STACK_DIR stack_dir
+
+static int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+# endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+ (a) chain together all alloca'ed blocks;
+ (b) keep track of stack depth.
+
+ It is very important that sizeof(header) agree with malloc
+ alignment chunk size. The following default should work okay. */
+
+# ifndef ALIGN_SIZE
+# define ALIGN_SIZE sizeof(double)
+# endif
+
+typedef union hdr
+{
+ char align[ALIGN_SIZE]; /* To force sizeof(header). */
+ struct
+ {
+ union hdr *next; /* For chaining headers. */
+ char *deep; /* For stack depth measure. */
+ } h;
+} header;
+
+static header *last_alloca_header = NULL; /* -> last alloca header. */
+
+/* Return a pointer to at least SIZE bytes of storage,
+ which will be automatically reclaimed upon exit from
+ the procedure that called alloca. Originally, this space
+ was supposed to be taken from the current stack frame of the
+ caller, but that method cannot be made to work for some
+ implementations of C, for example under Gould's UTX/32. */
+
+void *
+alloca (size_t size)
+{
+ auto char probe; /* Probes stack depth: */
+ register char *depth = &probe;
+
+# if STACK_DIRECTION == 0
+ if (STACK_DIR == 0) /* Unknown growth direction. */
+ STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
+# endif
+
+ /* Reclaim garbage, defined as all alloca'd storage that
+ was allocated from deeper in the stack than currently. */
+
+ {
+ register header *hp; /* Traverses linked list. */
+
+# ifdef emacs
+ BLOCK_INPUT;
+# endif
+
+ for (hp = last_alloca_header; hp != NULL;)
+ if ((STACK_DIR > 0 && hp->h.deep > depth)
+ || (STACK_DIR < 0 && hp->h.deep < depth))
+ {
+ register header *np = hp->h.next;
+
+ free (hp); /* Collect garbage. */
+
+ hp = np; /* -> next header. */
+ }
+ else
+ break; /* Rest are not deeper. */
+
+ last_alloca_header = hp; /* -> last valid storage. */
+
+# ifdef emacs
+ UNBLOCK_INPUT;
+# endif
+ }
+
+ if (size == 0)
+ return NULL; /* No allocation required. */
+
+ /* Allocate combined header + user data storage. */
+
+ {
+ /* Address of header. */
+ register header *new;
+
+ size_t combined_size = sizeof (header) + size;
+ if (combined_size < sizeof (header))
+ memory_full ();
+
+ new = malloc (combined_size);
+
+ if (! new)
+ memory_full ();
+
+ new->h.next = last_alloca_header;
+ new->h.deep = depth;
+
+ last_alloca_header = new;
+
+ /* User storage begins just after header. */
+
+ return (void *) (new + 1);
+ }
+}
+
+# endif /* no alloca */
+#endif /* not GCC || clang */
diff --git a/lib/alloca.in.h b/lib/alloca.in.h
new file mode 100644
index 0000000..c71e9bf
--- /dev/null
+++ b/lib/alloca.in.h
@@ -0,0 +1,74 @@
+/* Memory allocation on the stack.
+
+ Copyright (C) 1995, 1999, 2001-2004, 2006-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>.
+ */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+ means there is a real alloca function. */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+ allocated on the stack, which will last until the function returns.
+ Use of alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns,
+ - for huge N (say, N >= 65536) - you never know how large (or small)
+ the stack is, and when the stack cannot fulfill the memory allocation
+ request, the program just crashes.
+ */
+
+#ifndef alloca
+ /* Some version of mingw have an <alloca.h> that causes trouble when
+ included after 'alloca' gets defined as a macro. As a workaround,
+ include this <alloca.h> first and define 'alloca' as a macro afterwards
+ if needed. */
+# if defined __GNUC__ && (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
+# include_next <alloca.h>
+# endif
+#endif
+#ifndef alloca
+# if defined __GNUC__ || (__clang_major__ >= 4)
+# define alloca __builtin_alloca
+# elif defined _AIX
+# define alloca __alloca
+# elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# elif defined __DECC && defined __VMS
+# define alloca __ALLOCA
+# elif defined __TANDEM && defined _TNS_E_TARGET
+# ifdef __cplusplus
+extern "C"
+# endif
+void *_alloca (unsigned short);
+# pragma intrinsic (_alloca)
+# define alloca _alloca
+# elif defined __MVS__
+# include <stdlib.h>
+# else
+# include <stddef.h>
+# ifdef __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/lib/arg-nonnull.h b/lib/arg-nonnull.h
new file mode 100644
index 0000000..db9d9ae
--- /dev/null
+++ b/lib/arg-nonnull.h
@@ -0,0 +1,26 @@
+/* A C macro for declaring that specific arguments must not be NULL.
+ Copyright (C) 2009-2020 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/>. */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+ that the values passed as arguments n, ..., m must be non-NULL pointers.
+ n = 1 stands for the first argument, n = 2 for the second argument etc. */
+#ifndef _GL_ARG_NONNULL
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+# define _GL_ARG_NONNULL(params)
+# endif
+#endif
diff --git a/lib/arpa_inet.in.h b/lib/arpa_inet.in.h
new file mode 100644
index 0000000..9f13d48
--- /dev/null
+++ b/lib/arpa_inet.in.h
@@ -0,0 +1,150 @@
+/* A GNU-like <arpa/inet.h>.
+
+ Copyright (C) 2005-2006, 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_ARPA_INET_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_FEATURES_H@
+# include <features.h> /* for __GLIBC__ */
+#endif
+
+/* Gnulib's sys/socket.h is responsible for defining socklen_t (used below) and
+ for pulling in winsock2.h etc. under MinGW.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <sys/socket.h>
+#endif
+
+/* On NonStop Kernel, inet_ntop and inet_pton are declared in <netdb.h>.
+ But avoid namespace pollution on glibc systems. */
+#if defined __TANDEM && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+#if @HAVE_ARPA_INET_H@
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_ARPA_INET_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_ARPA_INET_H
+#define _@GUARD_PREFIX@_ARPA_INET_H
+
+/* Get all possible declarations of inet_ntop() and inet_pton(). */
+#if (@GNULIB_INET_NTOP@ || @GNULIB_INET_PTON@ || defined GNULIB_POSIXCHECK) \
+ && @HAVE_WS2TCPIP_H@
+# include <ws2tcpip.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if @GNULIB_INET_NTOP@
+/* Converts an internet address from internal format to a printable,
+ presentable format.
+ AF is an internet address family, such as AF_INET or AF_INET6.
+ SRC points to a 'struct in_addr' (for AF_INET) or 'struct in6_addr'
+ (for AF_INET6).
+ DST points to a buffer having room for CNT bytes.
+ The printable representation of the address (in numeric form, not
+ surrounded by [...], no reverse DNS is done) is placed in DST, and
+ DST is returned. If an error occurs, the return value is NULL and
+ errno is set. If CNT bytes are not sufficient to hold the result,
+ the return value is NULL and errno is set to ENOSPC. A good value
+ for CNT is 46.
+
+ For more details, see the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/inet_ntop.html>. */
+# if @REPLACE_INET_NTOP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef inet_ntop
+# define inet_ntop rpl_inet_ntop
+# endif
+_GL_FUNCDECL_RPL (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt));
+# else
+# if !@HAVE_DECL_INET_NTOP@
+_GL_FUNCDECL_SYS (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+/* Need to cast, because on NonStop Kernel, the fourth parameter is
+ size_t cnt. */
+_GL_CXXALIAS_SYS_CAST (inet_ntop, const char *,
+ (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (inet_ntop);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef inet_ntop
+# if HAVE_RAW_DECL_INET_NTOP
+_GL_WARN_ON_USE (inet_ntop, "inet_ntop is unportable - "
+ "use gnulib module inet_ntop for portability");
+# endif
+#endif
+
+#if @GNULIB_INET_PTON@
+# if @REPLACE_INET_PTON@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef inet_pton
+# define inet_pton rpl_inet_pton
+# endif
+_GL_FUNCDECL_RPL (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst));
+# else
+# if !@HAVE_DECL_INET_PTON@
+_GL_FUNCDECL_SYS (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (inet_pton, int,
+ (int af, const char *restrict src, void *restrict dst));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (inet_pton);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef inet_pton
+# if HAVE_RAW_DECL_INET_PTON
+_GL_WARN_ON_USE (inet_pton, "inet_pton is unportable - "
+ "use gnulib module inet_pton for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
+#endif /* _@GUARD_PREFIX@_ARPA_INET_H */
diff --git a/lib/array-mergesort.h b/lib/array-mergesort.h
new file mode 100644
index 0000000..5cfe65e
--- /dev/null
+++ b/lib/array-mergesort.h
@@ -0,0 +1,281 @@
+/* Stable-sorting of an array using mergesort.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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 file implements stable sorting of an array, using the mergesort
+ algorithm.
+ Worst-case running time for an array of length N is O(N log N).
+ Unlike the mpsort module, the algorithm here attempts to minimize not
+ only the number of comparisons, but also the number of copying operations.
+
+ Before including this file, you need to define
+ ELEMENT The type of every array element.
+ COMPARE A two-argument macro that takes two 'const ELEMENT *'
+ pointers and returns a negative, zero, or positive 'int'
+ value if the element pointed to by the first argument is,
+ respectively, less, equal, or greater than the element
+ pointed to by the second argument.
+ STATIC The storage class of the functions being defined.
+ STATIC_FROMTO (Optional.) Overrides STATIC for the 'merge_sort_fromto'
+ function.
+ Before including this file, you also need to include:
+ #include <stddef.h>
+ */
+
+/* Merge the sorted arrays src1[0..n1-1] and src2[0..n2-1] into
+ dst[0..n1+n2-1]. In case of ambiguity, put the elements of src1
+ before the elements of src2.
+ n1 and n2 must be > 0.
+ The arrays src1 and src2 must not overlap the dst array, except that
+ src1 may be dst[n2..n1+n2-1], or src2 may be dst[n1..n1+n2-1]. */
+static void
+merge (const ELEMENT *src1, size_t n1,
+ const ELEMENT *src2, size_t n2,
+ ELEMENT *dst)
+{
+ for (;;) /* while (n1 > 0 && n2 > 0) */
+ {
+ if (COMPARE (src1, src2) <= 0)
+ {
+ *dst++ = *src1++;
+ n1--;
+ if (n1 == 0)
+ break;
+ }
+ else
+ {
+ *dst++ = *src2++;
+ n2--;
+ if (n2 == 0)
+ break;
+ }
+ }
+ /* Here n1 == 0 || n2 == 0 but also n1 > 0 || n2 > 0. */
+ if (n1 > 0)
+ {
+ if (dst != src1)
+ do
+ {
+ *dst++ = *src1++;
+ n1--;
+ }
+ while (n1 > 0);
+ }
+ else /* n2 > 0 */
+ {
+ if (dst != src2)
+ do
+ {
+ *dst++ = *src2++;
+ n2--;
+ }
+ while (n2 > 0);
+ }
+}
+
+/* Sort src[0..n-1] into dst[0..n-1], using tmp[0..n/2-1] as temporary
+ (scratch) storage.
+ The arrays src, dst, tmp must not overlap. */
+#ifdef STATIC_FROMTO
+STATIC_FROMTO
+#else
+STATIC
+#endif
+void
+merge_sort_fromto (const ELEMENT *src, ELEMENT *dst, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ return;
+ case 1:
+ /* Nothing to do. */
+ dst[0] = src[0];
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ }
+ else
+ {
+ dst[0] = src[1];
+ dst[1] = src[0];
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ dst[0] = src[0];
+ dst[1] = src[2];
+ dst[2] = src[1];
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ dst[0] = src[2];
+ dst[1] = src[0];
+ dst[2] = src[1];
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ dst[0] = src[1];
+ dst[1] = src[0];
+ dst[2] = src[2];
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ dst[0] = src[1];
+ dst[1] = src[2];
+ dst[2] = src[0];
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ dst[0] = src[2];
+ dst[1] = src[1];
+ dst[2] = src[0];
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1] into dst[n1..n-1], scratching tmp[0..n2/2-1]. */
+ merge_sort_fromto (src + n1, dst + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching dst[0..n1-1]. */
+ merge_sort_fromto (src, tmp, n1, dst);
+ /* Merge the two half results. */
+ merge (tmp, n1, dst + n1, n2, dst);
+ }
+ break;
+ }
+}
+
+/* Sort src[0..n-1], using tmp[0..n-1] as temporary (scratch) storage.
+ The arrays src, tmp must not overlap. */
+STATIC void
+merge_sort_inplace (ELEMENT *src, size_t n, ELEMENT *tmp)
+{
+ switch (n)
+ {
+ case 0:
+ case 1:
+ /* Nothing to do. */
+ return;
+ case 2:
+ /* Trivial case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ /* src[0] <= src[1] */
+ }
+ else
+ {
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ break;
+ case 3:
+ /* Simple case. */
+ if (COMPARE (&src[0], &src[1]) <= 0)
+ {
+ if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[0] <= src[1] <= src[2] */
+ }
+ else if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[0] <= src[2] < src[1] */
+ ELEMENT t = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[0] <= src[1] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = src[1];
+ src[1] = t;
+ }
+ }
+ else
+ {
+ if (COMPARE (&src[0], &src[2]) <= 0)
+ {
+ /* src[1] < src[0] <= src[2] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = t;
+ }
+ else if (COMPARE (&src[1], &src[2]) <= 0)
+ {
+ /* src[1] <= src[2] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[1];
+ src[1] = src[2];
+ src[2] = t;
+ }
+ else
+ {
+ /* src[2] < src[1] < src[0] */
+ ELEMENT t = src[0];
+ src[0] = src[2];
+ src[2] = t;
+ }
+ }
+ break;
+ default:
+ {
+ size_t n1 = n / 2;
+ size_t n2 = (n + 1) / 2;
+ /* Note: n1 + n2 = n, n1 <= n2. */
+ /* Sort src[n1..n-1], scratching tmp[0..n2-1]. */
+ merge_sort_inplace (src + n1, n2, tmp);
+ /* Sort src[0..n1-1] into tmp[0..n1-1], scratching tmp[n1..2*n1-1]. */
+ merge_sort_fromto (src, tmp, n1, tmp + n1);
+ /* Merge the two half results. */
+ merge (tmp, n1, src + n1, n2, src);
+ }
+ break;
+ }
+}
+
+#undef ELEMENT
+#undef COMPARE
+#undef STATIC
diff --git a/lib/asnprintf.c b/lib/asnprintf.c
new file mode 100644
index 0000000..37dcf92
--- /dev/null
+++ b/lib/asnprintf.c
@@ -0,0 +1,34 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "vasnprintf.h"
+
+#include <stdarg.h>
+
+char *
+asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+{
+ va_list args;
+ char *result;
+
+ va_start (args, format);
+ result = vasnprintf (resultbuf, lengthp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/lib/asprintf.c b/lib/asprintf.c
new file mode 100644
index 0000000..f97580f
--- /dev/null
+++ b/lib/asprintf.c
@@ -0,0 +1,39 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <stdarg.h>
+
+int
+asprintf (char **resultp, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = vasprintf (resultp, format, args);
+ va_end (args);
+ return result;
+}
diff --git a/lib/assure.h b/lib/assure.h
new file mode 100644
index 0000000..09a4edf
--- /dev/null
+++ b/lib/assure.h
@@ -0,0 +1,57 @@
+/* Run-time assert-like macros.
+
+ Copyright (C) 2014-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_ASSURE_H
+#define _GL_ASSURE_H
+
+#include <assert.h>
+#include "verify.h"
+
+/* Evaluate an assertion E that is guaranteed to be true.
+ If NDEBUG is not defined, abort the program if E is false.
+ If NDEBUG is defined, the compiler can assume E and behavior is
+ undefined if E is false, fails to evaluate, or has side effects.
+
+ Unlike standard 'assert', this macro evaluates E even when NDEBUG
+ is defined, so as to catch typos, avoid some GCC warnings, and
+ improve performance when E is simple enough.
+
+ Also see the documentation for 'assume' in verify.h. */
+
+#ifdef NDEBUG
+# define affirm(E) assume (E)
+#else
+# define affirm(E) assert (E)
+#endif
+
+/* Check E's value at runtime, and report an error and abort if not.
+ However, do nothing if NDEBUG is defined.
+
+ Unlike standard 'assert', this macro compiles E even when NDEBUG
+ is defined, so as to catch typos and avoid some GCC warnings.
+ Unlike 'affirm', it is OK for E to use hard-to-optimize features,
+ since E is not executed if NDEBUG is defined. */
+
+#ifdef NDEBUG
+# define assure(E) ((void) (0 && (E)))
+#else
+# define assure(E) assert (E)
+#endif
+
+#endif
diff --git a/lib/at-func.c b/lib/at-func.c
new file mode 100644
index 0000000..90022e0
--- /dev/null
+++ b/lib/at-func.c
@@ -0,0 +1,146 @@
+/* Define at-style functions like fstatat, unlinkat, fchownat, etc.
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+
+#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
+# include <errno.h>
+# ifndef ENOTSUP
+# define ENOTSUP EINVAL
+# endif
+#else
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+#endif
+
+#ifdef AT_FUNC_USE_F1_COND
+# define CALL_FUNC(F) \
+ (flag == AT_FUNC_USE_F1_COND \
+ ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
+ : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) \
+ if (flag & ~AT_FUNC_USE_F1_COND) \
+ { \
+ errno = EINVAL; \
+ return FUNC_FAIL; \
+ }
+#else
+# define CALL_FUNC(F) (AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS))
+# define VALIDATE_FLAG(F) /* empty */
+#endif
+
+#ifdef AT_FUNC_RESULT
+# define FUNC_RESULT AT_FUNC_RESULT
+#else
+# define FUNC_RESULT int
+#endif
+
+#ifdef AT_FUNC_FAIL
+# define FUNC_FAIL AT_FUNC_FAIL
+#else
+# define FUNC_FAIL -1
+#endif
+
+/* Call AT_FUNC_F1 to operate on FILE, which is in the directory
+ open on descriptor FD. If AT_FUNC_USE_F1_COND is defined to a value,
+ AT_FUNC_POST_FILE_PARAM_DECLS must include a parameter named flag;
+ call AT_FUNC_F2 if FLAG is 0 or fail if FLAG contains more bits than
+ AT_FUNC_USE_F1_COND. Return int and fail with -1 unless AT_FUNC_RESULT
+ or AT_FUNC_FAIL are defined. If possible, do it without changing the
+ working directory. Otherwise, resort to using save_cwd/fchdir,
+ then AT_FUNC_F?/restore_cwd. If either the save_cwd or the restore_cwd
+ fails, then give a diagnostic and exit nonzero. */
+FUNC_RESULT
+AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
+{
+ VALIDATE_FLAG (flag);
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return CALL_FUNC (file);
+
+#ifdef GNULIB_SUPPORT_ONLY_AT_FDCWD
+ errno = ENOTSUP;
+ return FUNC_FAIL;
+#else
+ {
+ /* Be careful to choose names unlikely to conflict with
+ AT_FUNC_POST_FILE_PARAM_DECLS. */
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ FUNC_RESULT err;
+
+ {
+ char proc_buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (proc_buf, fd, file);
+ if (proc_file)
+ {
+ FUNC_RESULT proc_result = CALL_FUNC (proc_file);
+ int proc_errno = errno;
+ if (proc_file != proc_buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (FUNC_FAIL != proc_result)
+ return proc_result;
+ if (! EXPECTED_ERRNO (proc_errno))
+ {
+ errno = proc_errno;
+ return proc_result;
+ }
+ }
+ }
+
+ if (save_cwd (&saved_cwd) != 0)
+ openat_save_fail (errno);
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return FUNC_FAIL;
+ }
+
+ if (fchdir (fd) != 0)
+ {
+ saved_errno = errno;
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return FUNC_FAIL;
+ }
+
+ err = CALL_FUNC (file);
+ saved_errno = (err == FUNC_FAIL ? errno : 0);
+
+ if (restore_cwd (&saved_cwd) != 0)
+ openat_restore_fail (errno);
+
+ free_cwd (&saved_cwd);
+
+ if (saved_errno)
+ errno = saved_errno;
+ return err;
+ }
+#endif
+}
+#undef CALL_FUNC
+#undef FUNC_RESULT
+#undef FUNC_FAIL
diff --git a/lib/attribute.h b/lib/attribute.h
new file mode 100644
index 0000000..5afcb8e
--- /dev/null
+++ b/lib/attribute.h
@@ -0,0 +1,218 @@
+/* ATTRIBUTE_* macros for using attributes in GCC and similar compilers
+
+ Copyright 2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+/* Provide public ATTRIBUTE_* names for the private _GL_ATTRIBUTE_*
+ macros used within Gnulib. */
+
+/* These attributes can be placed in two ways:
+ - At the start of a declaration (i.e. even before storage-class
+ specifiers!); then they apply to all entities that are declared
+ by the declaration.
+ - Immediately after the name of an entity being declared by the
+ declaration; then they apply to that entity only. */
+
+#ifndef _GL_ATTRIBUTE_H
+#define _GL_ATTRIBUTE_H
+
+
+/* This file defines two types of attributes:
+ * C2X standard attributes. These have macro names that do not begin with
+ 'ATTRIBUTE_'.
+ * Selected GCC attributes; see:
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html
+ https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
+ These names begin with 'ATTRIBUTE_' to avoid name clashes. */
+
+
+/* =============== Attributes for specific kinds of functions =============== */
+
+/* Attributes for functions that should not be used. */
+
+/* Warn if the entity is used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: namespace, class, template specialization. */
+#define DEPRECATED _GL_ATTRIBUTE_DEPRECATED
+
+/* If a function call is not optimized way, warn with MSG. */
+/* Applies to: functions. */
+#define ATTRIBUTE_WARNING(msg) _GL_ATTRIBUTE_WARNING (msg)
+
+/* If a function call is not optimized way, report an error with MSG. */
+/* Applies to: functions. */
+#define ATTRIBUTE_ERROR(msg) _GL_ATTRIBUTE_ERROR (msg)
+
+
+/* Attributes for memory-allocating functions. */
+
+/* The function returns a pointer to freshly allocated memory. */
+/* Applies to: functions. */
+#define ATTRIBUTE_MALLOC _GL_ATTRIBUTE_MALLOC
+
+/* ATTRIBUTE_ALLOC_SIZE ((N)) - The Nth argument of the function
+ is the size of the returned memory block.
+ ATTRIBUTE_ALLOC_SIZE ((M, N)) - Multiply the Mth and Nth arguments
+ to determine the size of the returned memory block. */
+/* Applies to: function, pointer to function, function types. */
+#define ATTRIBUTE_ALLOC_SIZE(args) _GL_ATTRIBUTE_ALLOC_SIZE (args)
+
+
+/* Attributes for variadic functions. */
+
+/* The variadic function expects a trailing NULL argument.
+ ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
+ ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
+/* Applies to: functions. */
+#define ATTRIBUTE_SENTINEL(pos) _GL_ATTRIBUTE_SENTINEL (pos)
+
+
+/* ================== Attributes for compiler diagnostics ================== */
+
+/* Attributes that help the compiler diagnose programmer mistakes.
+ Some of them may also help for some compiler optimizations. */
+
+/* ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)) -
+ The STRING-INDEXth function argument is a format string of style
+ ARCHETYPE, which is one of:
+ printf, gnu_printf
+ scanf, gnu_scanf,
+ strftime, gnu_strftime,
+ strfmon,
+ or the same thing prefixed and suffixed with '__'.
+ If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
+ are suitable for the format string. */
+/* Applies to: functions. */
+#define ATTRIBUTE_FORMAT(spec) _GL_ATTRIBUTE_FORMAT (spec)
+
+/* ATTRIBUTE_NONNULL ((N1, N2,...)) - Arguments N1, N2,... must not be NULL.
+ ATTRIBUTE_NONNULL () - All pointer arguments must not be null. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NONNULL(args) _GL_ATTRIBUTE_NONNULL (args)
+
+/* The function's return value is a non-NULL pointer. */
+/* Applies to: functions. */
+#define ATTRIBUTE_RETURNS_NONNULL _GL_ATTRIBUTE_RETURNS_NONNULL
+
+/* Warn if the caller does not use the return value,
+ unless the caller uses something like ignore_value. */
+/* Applies to: function, enumeration, class. */
+#define NODISCARD _GL_ATTRIBUTE_NODISCARD
+
+
+/* Attributes that disable false alarms when the compiler diagnoses
+ programmer "mistakes". */
+
+/* Do not warn if the entity is not used. */
+/* Applies to:
+ - function, variable,
+ - struct, union, struct/union member,
+ - enumeration, enumeration item,
+ - typedef,
+ in C++ also: class. */
+#define MAYBE_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+
+/* The contents of a character array is not meant to be NUL-terminated. */
+/* Applies to: struct/union members and variables that are arrays of element
+ type '[[un]signed] char'. */
+#define ATTRIBUTE_NONSTRING _GL_ATTRIBUTE_NONSTRING
+
+/* Do not warn if control flow falls through to the immediately
+ following 'case' or 'default' label. */
+/* Applies to: Empty statement (;), inside a 'switch' statement. */
+#define FALLTHROUGH _GL_ATTRIBUTE_FALLTHROUGH
+
+
+/* ================== Attributes for debugging information ================== */
+
+/* Attributes regarding debugging information emitted by the compiler. */
+
+/* Omit the function from stack traces when debugging. */
+/* Applies to: function. */
+#define ATTRIBUTE_ARTIFICIAL _GL_ATTRIBUTE_ARTIFICIAL
+
+/* Make the entity visible to debuggers etc., even with '-fwhole-program'. */
+/* Applies to: functions, variables. */
+#define ATTRIBUTE_EXTERNALLY_VISIBLE _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+
+
+/* ========== Attributes that mainly direct compiler optimizations ========== */
+
+/* The function does not throw exceptions. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NOTHROW _GL_ATTRIBUTE_NOTHROW
+
+/* Do not inline the function. */
+/* Applies to: functions. */
+#define ATTRIBUTE_NOINLINE _GL_ATTRIBUTE_NOINLINE
+
+/* Always inline the function, and report an error if the compiler
+ cannot inline. */
+/* Applies to: function. */
+#define ATTRIBUTE_ALWAYS_INLINE _GL_ATTRIBUTE_ALWAYS_INLINE
+
+/* It is OK for a compiler to omit duplicate calls with the same arguments.
+ This attribute is safe for a function that neither depends on
+ nor affects observable state, and always returns exactly once -
+ e.g., does not loop forever, and does not call longjmp.
+ (This attribute is stricter than ATTRIBUTE_PURE.) */
+/* Applies to: functions. */
+#define ATTRIBUTE_CONST _GL_ATTRIBUTE_CONST
+
+/* It is OK for a compiler to omit duplicate calls with the same
+ arguments if observable state is not changed between calls.
+ This attribute is safe for a function that does not affect
+ observable state, and always returns exactly once.
+ (This attribute is looser than ATTRIBUTE_CONST.) */
+/* Applies to: functions. */
+#define ATTRIBUTE_PURE _GL_ATTRIBUTE_PURE
+
+/* The function is rarely executed. */
+/* Applies to: functions. */
+#define ATTRIBUTE_COLD _GL_ATTRIBUTE_COLD
+
+/* If called from some other compilation unit, the function executes
+ code from that unit only by return or by exception handling,
+ letting the compiler optimize that unit more aggressively. */
+/* Applies to: functions. */
+#define ATTRIBUTE_LEAF _GL_ATTRIBUTE_LEAF
+
+/* For struct members: The member has the smallest possible alignment.
+ For struct, union, class: All members have the smallest possible alignment,
+ minimizing the memory required. */
+/* Applies to: struct members, struct, union,
+ in C++ also: class. */
+#define ATTRIBUTE_PACKED _GL_ATTRIBUTE_PACKED
+
+
+/* ================ Attributes that make invalid code valid ================ */
+
+/* Attributes that prevent fatal compiler optimizations for code that is not
+ fully ISO C compliant. */
+
+/* Pointers to the type may point to the same storage as pointers to
+ other types, thus disabling strict aliasing optimization. */
+/* Applies to: types. */
+#define ATTRIBUTE_MAY_ALIAS _GL_ATTRIBUTE_MAY_ALIAS
+
+
+#endif /* _GL_ATTRIBUTE_H */
diff --git a/lib/base32.c b/lib/base32.c
new file mode 100644
index 0000000..ffff972
--- /dev/null
+++ b/lib/base32.c
@@ -0,0 +1,587 @@
+/* base32.c -- Encode binary data using printable characters.
+ Copyright (C) 1999-2001, 2004-2006, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
+ *
+ * See also RFC 4648 <https://www.ietf.org/rfc/rfc4648.txt>.
+ *
+ * Be careful with error checking. Here is how you would typically
+ * use these functions:
+ *
+ * bool ok = base32_decode_alloc (in, inlen, &out, &outlen);
+ * if (!ok)
+ * FAIL: input was not valid base32
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN
+ *
+ * size_t outlen = base32_encode_alloc (in, inlen, &out);
+ * if (out == NULL && outlen == 0 && inlen != 0)
+ * FAIL: input too long
+ * if (out == NULL)
+ * FAIL: memory allocation error
+ * OK: data in OUT/OUTLEN.
+ *
+ */
+
+#include <config.h>
+
+/* Get prototype. */
+#include "base32.h"
+
+/* Get malloc. */
+#include <stdlib.h>
+
+/* Get UCHAR_MAX. */
+#include <limits.h>
+
+#include <string.h>
+
+/* C89 compliant way to cast 'char' to 'unsigned char'. */
+static unsigned char
+to_uchar (char ch)
+{
+ return ch;
+}
+
+/* Base32 encode IN array of size INLEN into OUT array of size OUTLEN.
+ If OUTLEN is less than BASE32_LENGTH(INLEN), write as many bytes as
+ possible. If OUTLEN is larger than BASE32_LENGTH(INLEN), also zero
+ terminate the output buffer. */
+void
+base32_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen)
+{
+ static const char b32str[32] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+
+ while (inlen && outlen)
+ {
+ *out++ = b32str[(to_uchar (in[0]) >> 3) & 0x1f];
+ if (!--outlen)
+ break;
+ *out++ = b32str[((to_uchar (in[0]) << 2)
+ + (--inlen ? to_uchar (in[1]) >> 6 : 0))
+ & 0x1f];
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[(to_uchar (in[1]) >> 1) & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[1]) << 4)
+ + (--inlen ? to_uchar (in[2]) >> 4 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[2]) << 1)
+ + (--inlen ? to_uchar (in[3]) >> 7 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[(to_uchar (in[3]) >> 2) & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ =
+ (inlen
+ ? b32str[((to_uchar (in[3]) << 3)
+ + (--inlen ? to_uchar (in[4]) >> 5 : 0))
+ & 0x1f]
+ : '=');
+ if (!--outlen)
+ break;
+ *out++ = inlen ? b32str[to_uchar (in[4]) & 0x1f] : '=';
+ if (!--outlen)
+ break;
+ if (inlen)
+ inlen--;
+ if (inlen)
+ in += 5;
+ }
+
+ if (outlen)
+ *out = '\0';
+}
+
+/* Allocate a buffer and store zero terminated base32 encoded data
+ from array IN of size INLEN, returning BASE32_LENGTH(INLEN), i.e.,
+ the length of the encoded data, excluding the terminating zero. On
+ return, the OUT variable will hold a pointer to newly allocated
+ memory that must be deallocated by the caller. If output string
+ length would overflow, 0 is returned and OUT is set to NULL. If
+ memory allocation failed, OUT is set to NULL, and the return value
+ indicates length of the requested memory block, i.e.,
+ BASE32_LENGTH(inlen) + 1. */
+size_t
+base32_encode_alloc (const char *in, size_t inlen, char **out)
+{
+ size_t outlen = 1 + BASE32_LENGTH (inlen);
+
+ /* Check for overflow in outlen computation.
+ *
+ * If there is no overflow, outlen >= inlen.
+ *
+ * TODO Is this a sufficient check? (See the notes in base64.c.)
+ */
+ if (inlen > outlen)
+ {
+ *out = NULL;
+ return 0;
+ }
+
+ *out = malloc (outlen);
+ if (!*out)
+ return outlen;
+
+ base32_encode (in, inlen, *out, outlen);
+
+ return outlen - 1;
+}
+
+/* With this approach this file works independent of the charset used
+ (think EBCDIC). However, it does assume that the characters in the
+ Base32 alphabet (A-Z2-7) are encoded in 0..255. POSIX
+ 1003.1-2001 require that char and unsigned char are 8-bit
+ quantities, though, taking care of that problem. But this may be a
+ potential problem on non-POSIX C99 platforms.
+
+ IBM C V6 for AIX mishandles "#define B32(x) ...'x'...", so use "_"
+ as the formal parameter rather than "x". */
+#define B32(_) \
+ ((_) == 'A' ? 0 \
+ : (_) == 'B' ? 1 \
+ : (_) == 'C' ? 2 \
+ : (_) == 'D' ? 3 \
+ : (_) == 'E' ? 4 \
+ : (_) == 'F' ? 5 \
+ : (_) == 'G' ? 6 \
+ : (_) == 'H' ? 7 \
+ : (_) == 'I' ? 8 \
+ : (_) == 'J' ? 9 \
+ : (_) == 'K' ? 10 \
+ : (_) == 'L' ? 11 \
+ : (_) == 'M' ? 12 \
+ : (_) == 'N' ? 13 \
+ : (_) == 'O' ? 14 \
+ : (_) == 'P' ? 15 \
+ : (_) == 'Q' ? 16 \
+ : (_) == 'R' ? 17 \
+ : (_) == 'S' ? 18 \
+ : (_) == 'T' ? 19 \
+ : (_) == 'U' ? 20 \
+ : (_) == 'V' ? 21 \
+ : (_) == 'W' ? 22 \
+ : (_) == 'X' ? 23 \
+ : (_) == 'Y' ? 24 \
+ : (_) == 'Z' ? 25 \
+ : (_) == '2' ? 26 \
+ : (_) == '3' ? 27 \
+ : (_) == '4' ? 28 \
+ : (_) == '5' ? 29 \
+ : (_) == '6' ? 30 \
+ : (_) == '7' ? 31 \
+ : -1)
+
+static const signed char b32[0x100] = {
+ B32 (0), B32 (1), B32 (2), B32 (3),
+ B32 (4), B32 (5), B32 (6), B32 (7),
+ B32 (8), B32 (9), B32 (10), B32 (11),
+ B32 (12), B32 (13), B32 (14), B32 (15),
+ B32 (16), B32 (17), B32 (18), B32 (19),
+ B32 (20), B32 (21), B32 (22), B32 (23),
+ B32 (24), B32 (25), B32 (26), B32 (27),
+ B32 (28), B32 (29), B32 (30), B32 (31),
+ B32 (32), B32 (33), B32 (34), B32 (35),
+ B32 (36), B32 (37), B32 (38), B32 (39),
+ B32 (40), B32 (41), B32 (42), B32 (43),
+ B32 (44), B32 (45), B32 (46), B32 (47),
+ B32 (48), B32 (49), B32 (50), B32 (51),
+ B32 (52), B32 (53), B32 (54), B32 (55),
+ B32 (56), B32 (57), B32 (58), B32 (59),
+ B32 (60), B32 (61), B32 (62), B32 (63),
+ B32 (32), B32 (65), B32 (66), B32 (67),
+ B32 (68), B32 (69), B32 (70), B32 (71),
+ B32 (72), B32 (73), B32 (74), B32 (75),
+ B32 (76), B32 (77), B32 (78), B32 (79),
+ B32 (80), B32 (81), B32 (82), B32 (83),
+ B32 (84), B32 (85), B32 (86), B32 (87),
+ B32 (88), B32 (89), B32 (90), B32 (91),
+ B32 (92), B32 (93), B32 (94), B32 (95),
+ B32 (96), B32 (97), B32 (98), B32 (99),
+ B32 (100), B32 (101), B32 (102), B32 (103),
+ B32 (104), B32 (105), B32 (106), B32 (107),
+ B32 (108), B32 (109), B32 (110), B32 (111),
+ B32 (112), B32 (113), B32 (114), B32 (115),
+ B32 (116), B32 (117), B32 (118), B32 (119),
+ B32 (120), B32 (121), B32 (122), B32 (123),
+ B32 (124), B32 (125), B32 (126), B32 (127),
+ B32 (128), B32 (129), B32 (130), B32 (131),
+ B32 (132), B32 (133), B32 (134), B32 (135),
+ B32 (136), B32 (137), B32 (138), B32 (139),
+ B32 (140), B32 (141), B32 (142), B32 (143),
+ B32 (144), B32 (145), B32 (146), B32 (147),
+ B32 (148), B32 (149), B32 (150), B32 (151),
+ B32 (152), B32 (153), B32 (154), B32 (155),
+ B32 (156), B32 (157), B32 (158), B32 (159),
+ B32 (160), B32 (161), B32 (162), B32 (163),
+ B32 (132), B32 (165), B32 (166), B32 (167),
+ B32 (168), B32 (169), B32 (170), B32 (171),
+ B32 (172), B32 (173), B32 (174), B32 (175),
+ B32 (176), B32 (177), B32 (178), B32 (179),
+ B32 (180), B32 (181), B32 (182), B32 (183),
+ B32 (184), B32 (185), B32 (186), B32 (187),
+ B32 (188), B32 (189), B32 (190), B32 (191),
+ B32 (192), B32 (193), B32 (194), B32 (195),
+ B32 (196), B32 (197), B32 (198), B32 (199),
+ B32 (200), B32 (201), B32 (202), B32 (203),
+ B32 (204), B32 (205), B32 (206), B32 (207),
+ B32 (208), B32 (209), B32 (210), B32 (211),
+ B32 (212), B32 (213), B32 (214), B32 (215),
+ B32 (216), B32 (217), B32 (218), B32 (219),
+ B32 (220), B32 (221), B32 (222), B32 (223),
+ B32 (224), B32 (225), B32 (226), B32 (227),
+ B32 (228), B32 (229), B32 (230), B32 (231),
+ B32 (232), B32 (233), B32 (234), B32 (235),
+ B32 (236), B32 (237), B32 (238), B32 (239),
+ B32 (240), B32 (241), B32 (242), B32 (243),
+ B32 (244), B32 (245), B32 (246), B32 (247),
+ B32 (248), B32 (249), B32 (250), B32 (251),
+ B32 (252), B32 (253), B32 (254), B32 (255)
+};
+
+#if UCHAR_MAX == 255
+# define uchar_in_range(c) true
+#else
+# define uchar_in_range(c) ((c) <= 255)
+#endif
+
+/* Return true if CH is a character from the Base32 alphabet, and
+ false otherwise. Note that '=' is padding and not considered to be
+ part of the alphabet. */
+bool
+isbase32 (char ch)
+{
+ return uchar_in_range (to_uchar (ch)) && 0 <= b32[to_uchar (ch)];
+}
+
+/* Initialize decode-context buffer, CTX. */
+void
+base32_decode_ctx_init (struct base32_decode_context *ctx)
+{
+ ctx->i = 0;
+}
+
+/* If CTX->i is 0 or 8, there are eight or more bytes in [*IN..IN_END), and
+ none of those eight is a newline, then return *IN. Otherwise, copy up to
+ 4 - CTX->i non-newline bytes from that range into CTX->buf, starting at
+ index CTX->i and setting CTX->i to reflect the number of bytes copied,
+ and return CTX->buf. In either case, advance *IN to point to the byte
+ after the last one processed, and set *N_NON_NEWLINE to the number of
+ verified non-newline bytes accessible through the returned pointer. */
+static char *
+get_8 (struct base32_decode_context *ctx,
+ char const *restrict *in, char const *restrict in_end,
+ size_t *n_non_newline)
+{
+ if (ctx->i == 8)
+ ctx->i = 0;
+
+ if (ctx->i == 0)
+ {
+ char const *t = *in;
+ if (8 <= in_end - *in && memchr (t, '\n', 8) == NULL)
+ {
+ /* This is the common case: no newline. */
+ *in += 8;
+ *n_non_newline = 8;
+ return (char *) t;
+ }
+ }
+
+ {
+ /* Copy non-newline bytes into BUF. */
+ char const *p = *in;
+ while (p < in_end)
+ {
+ char c = *p++;
+ if (c != '\n')
+ {
+ ctx->buf[ctx->i++] = c;
+ if (ctx->i == 8)
+ break;
+ }
+ }
+
+ *in = p;
+ *n_non_newline = ctx->i;
+ return ctx->buf;
+ }
+}
+
+#define return_false \
+ do \
+ { \
+ *outp = out; \
+ return false; \
+ } \
+ while (false)
+
+/* Decode eight bytes of base32-encoded data, IN, of length INLEN
+ into the output buffer, *OUT, of size *OUTLEN bytes. Return true if
+ decoding is successful, false otherwise. If *OUTLEN is too small,
+ as many bytes as possible are written to *OUT. On return, advance
+ *OUT to point to the byte after the last one written, and decrement
+ *OUTLEN to reflect the number of bytes remaining in *OUT. */
+static bool
+decode_8 (char const *restrict in, size_t inlen,
+ char *restrict *outp, size_t *outleft)
+{
+ char *out = *outp;
+ if (inlen < 8)
+ return false;
+
+ if (!isbase32 (in[0]) || !isbase32 (in[1]) )
+ return false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[0])] << 3)
+ | (b32[to_uchar (in[1])] >> 2));
+ --*outleft;
+ }
+
+ if (in[2] == '=')
+ {
+ if (in[3] != '=' || in[4] != '=' || in[5] != '='
+ || in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[2]) || !isbase32 (in[3]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[1])] << 6)
+ | (b32[to_uchar (in[2])] << 1)
+ | (b32[to_uchar (in[3])] >> 4));
+ --*outleft;
+ }
+
+ if (in[4] == '=')
+ {
+ if (in[5] != '=' || in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[4]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[3])] << 4)
+ | (b32[to_uchar (in[4])] >> 1));
+ --*outleft;
+ }
+
+ if (in[5] == '=')
+ {
+ if (in[6] != '=' || in[7] != '=')
+ return_false;
+ }
+ else
+ {
+ if (!isbase32 (in[5]) || !isbase32 (in[6]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[4])] << 7)
+ | (b32[to_uchar (in[5])] << 2)
+ | (b32[to_uchar (in[6])] >> 3));
+ --*outleft;
+ }
+
+ if (in[7] != '=')
+ {
+ if (!isbase32 (in[7]))
+ return_false;
+
+ if (*outleft)
+ {
+ *out++ = ((b32[to_uchar (in[6])] << 5)
+ | (b32[to_uchar (in[7])]));
+ --*outleft;
+ }
+ }
+ }
+ }
+ }
+
+ *outp = out;
+ return true;
+}
+
+/* Decode base32-encoded input array IN of length INLEN to output array
+ OUT that can hold *OUTLEN bytes. The input data may be interspersed
+ with newlines. Return true if decoding was successful, i.e. if the
+ input was valid base32 data, false otherwise. If *OUTLEN is too
+ small, as many bytes as possible will be written to OUT. On return,
+ *OUTLEN holds the length of decoded bytes in OUT. Note that as soon
+ as any non-alphabet, non-newline character is encountered, decoding
+ is stopped and false is returned. If INLEN is zero, then process
+ only whatever data is stored in CTX.
+
+ Initially, CTX must have been initialized via base32_decode_ctx_init.
+ Subsequent calls to this function must reuse whatever state is recorded
+ in that buffer. It is necessary for when a octuple of base32 input
+ bytes spans two input buffers.
+
+ If CTX is NULL then newlines are treated as garbage and the input
+ buffer is processed as a unit. */
+
+bool
+base32_decode_ctx (struct base32_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen)
+{
+ size_t outleft = *outlen;
+ bool ignore_newlines = ctx != NULL;
+ bool flush_ctx = false;
+ unsigned int ctx_i = 0;
+
+ if (ignore_newlines)
+ {
+ ctx_i = ctx->i;
+ flush_ctx = inlen == 0;
+ }
+
+
+ while (true)
+ {
+ size_t outleft_save = outleft;
+ if (ctx_i == 0 && !flush_ctx)
+ {
+ while (true)
+ {
+ /* Save a copy of outleft, in case we need to re-parse this
+ block of four bytes. */
+ outleft_save = outleft;
+ if (!decode_8 (in, inlen, &out, &outleft))
+ break;
+
+ in += 8;
+ inlen -= 8;
+ }
+ }
+
+ if (inlen == 0 && !flush_ctx)
+ break;
+
+ /* Handle the common case of 72-byte wrapped lines.
+ This also handles any other multiple-of-8-byte wrapping. */
+ if (inlen && *in == '\n' && ignore_newlines)
+ {
+ ++in;
+ --inlen;
+ continue;
+ }
+
+ /* Restore OUT and OUTLEFT. */
+ out -= outleft_save - outleft;
+ outleft = outleft_save;
+
+ {
+ char const *in_end = in + inlen;
+ char const *non_nl;
+
+ if (ignore_newlines)
+ non_nl = get_8 (ctx, &in, in_end, &inlen);
+ else
+ non_nl = in; /* Might have nl in this case. */
+
+ /* If the input is empty or consists solely of newlines (0 non-newlines),
+ then we're done. Likewise if there are fewer than 8 bytes when not
+ flushing context and not treating newlines as garbage. */
+ if (inlen == 0 || (inlen < 8 && !flush_ctx && ignore_newlines))
+ {
+ inlen = 0;
+ break;
+ }
+ if (!decode_8 (non_nl, inlen, &out, &outleft))
+ break;
+
+ inlen = in_end - in;
+ }
+ }
+
+ *outlen -= outleft;
+
+ return inlen == 0;
+}
+
+/* Allocate an output buffer in *OUT, and decode the base32 encoded
+ data stored in IN of size INLEN to the *OUT buffer. On return, the
+ size of the decoded data is stored in *OUTLEN. OUTLEN may be NULL,
+ if the caller is not interested in the decoded length. *OUT may be
+ NULL to indicate an out of memory error, in which case *OUTLEN
+ contains the size of the memory block needed. The function returns
+ true on successful decoding and memory allocation errors. (Use the
+ *OUT and *OUTLEN parameters to differentiate between successful
+ decoding and memory error.) The function returns false if the
+ input was invalid, in which case *OUT is NULL and *OUTLEN is
+ undefined. */
+bool
+base32_decode_alloc_ctx (struct base32_decode_context *ctx,
+ const char *in, size_t inlen, char **out,
+ size_t *outlen)
+{
+ /* This may allocate a few bytes too many, depending on input,
+ but it's not worth the extra CPU time to compute the exact size.
+ The exact size is 5 * inlen / 8, minus one or more bytes if the
+ input is padded with one or more "=".
+ Dividing before multiplying avoids the possibility of overflow. */
+ size_t needlen = 5 * (inlen / 8) + 5;
+
+ *out = malloc (needlen);
+ if (!*out)
+ return true;
+
+ if (!base32_decode_ctx (ctx, in, inlen, *out, &needlen))
+ {
+ free (*out);
+ *out = NULL;
+ return false;
+ }
+
+ if (outlen)
+ *outlen = needlen;
+
+ return true;
+}
diff --git a/lib/base32.h b/lib/base32.h
new file mode 100644
index 0000000..e45f3a0
--- /dev/null
+++ b/lib/base32.h
@@ -0,0 +1,60 @@
+/* base32.h -- Encode binary data using printable characters.
+ Copyright (C) 2004-2006, 2009-2020 Free Software Foundation, Inc.
+ Adapted from Simon Josefsson's base64 code by Gijs van Tulder.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef BASE32_H
+# define BASE32_H
+
+/* Get size_t. */
+# include <stddef.h>
+
+/* Get bool. */
+# include <stdbool.h>
+
+/* This uses that the expression (n+(k-1))/k means the smallest
+ integer >= n/k, i.e., the ceiling of n/k. */
+# define BASE32_LENGTH(inlen) ((((inlen) + 4) / 5) * 8)
+
+struct base32_decode_context
+{
+ unsigned int i;
+ char buf[8];
+};
+
+extern bool isbase32 (char ch) _GL_ATTRIBUTE_CONST;
+
+extern void base32_encode (const char *restrict in, size_t inlen,
+ char *restrict out, size_t outlen);
+
+extern size_t base32_encode_alloc (const char *in, size_t inlen, char **out);
+
+extern void base32_decode_ctx_init (struct base32_decode_context *ctx);
+
+extern bool base32_decode_ctx (struct base32_decode_context *ctx,
+ const char *restrict in, size_t inlen,
+ char *restrict out, size_t *outlen);
+
+extern bool base32_decode_alloc_ctx (struct base32_decode_context *ctx,
+ const char *in, size_t inlen,
+ char **out, size_t *outlen);
+
+#define base32_decode(in, inlen, out, outlen) \
+ base32_decode_ctx (NULL, in, inlen, out, outlen)
+
+#define base32_decode_alloc(in, inlen, out, outlen) \
+ base32_decode_alloc_ctx (NULL, in, inlen, out, outlen)
+
+#endif /* BASE32_H */
diff --git a/lib/basename-lgpl.c b/lib/basename-lgpl.c
new file mode 100644
index 0000000..6bb28d4
--- /dev/null
+++ b/lib/basename-lgpl.c
@@ -0,0 +1,71 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "basename-lgpl.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include "filename.h"
+
+char *
+last_component (char const *name)
+{
+ char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
+ char const *p;
+ bool last_was_slash = false;
+
+ while (ISSLASH (*base))
+ base++;
+
+ for (p = base; *p; p++)
+ {
+ if (ISSLASH (*p))
+ last_was_slash = true;
+ else if (last_was_slash)
+ {
+ base = p;
+ last_was_slash = false;
+ }
+ }
+
+ return (char *) base;
+}
+
+size_t
+base_len (char const *name)
+{
+ size_t len;
+ size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+ for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--)
+ continue;
+
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
+ && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
+ return 2;
+
+ if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
+ && len == prefix_len && ISSLASH (name[prefix_len]))
+ return prefix_len + 1;
+
+ return len;
+}
diff --git a/lib/basename-lgpl.h b/lib/basename-lgpl.h
new file mode 100644
index 0000000..3807094
--- /dev/null
+++ b/lib/basename-lgpl.h
@@ -0,0 +1,78 @@
+/* Extract the last component (base name) of a file name.
+
+ Copyright (C) 1998, 2001, 2003-2006, 2009-2020 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/>. */
+
+#ifndef _BASENAME_LGPL_H
+#define _BASENAME_LGPL_H
+
+#include <stddef.h>
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the address of the last file name component of FILENAME.
+ If FILENAME has some trailing slash(es), they are considered to be
+ part of the last component.
+ If FILENAME has no relative file name components because it is a file
+ system root, return the empty string.
+ Examples:
+ FILENAME RESULT
+ "foo.c" "foo.c"
+ "foo/bar.c" "bar.c"
+ "/foo/bar.c" "bar.c"
+ "foo/bar/" "bar/"
+ "foo/bar//" "bar//"
+ "/" ""
+ "//" ""
+ "" ""
+ The return value is a tail of the given FILENAME; do NOT free() it! */
+
+/* This function was traditionally called 'basename', but we avoid this
+ function name because
+ * Various platforms have different functions in their libc.
+ In particular, the glibc basename(), defined in <string.h>, does
+ not consider trailing slashes to be part of the component:
+ FILENAME RESULT
+ "foo/bar/" ""
+ "foo/bar//" ""
+ * The 'basename' command eliminates trailing slashes and for a root
+ produces a non-empty result:
+ FILENAME RESULT
+ "foo/bar/" "bar"
+ "foo/bar//" "bar"
+ "/" "/"
+ "//" "/"
+ */
+extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE;
+
+/* Return the length of the basename FILENAME.
+ Typically FILENAME is the value returned by base_name or last_component.
+ Act like strlen (FILENAME), except omit all trailing slashes. */
+extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* _BASENAME_LGPL_H */
diff --git a/lib/basename.c b/lib/basename.c
new file mode 100644
index 0000000..b14417f
--- /dev/null
+++ b/lib/basename.c
@@ -0,0 +1,58 @@
+/* basename.c -- return the last element in a file name
+
+ Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+#include "xalloc.h"
+#include "xstrndup.h"
+
+char *
+base_name (char const *name)
+{
+ char const *base = last_component (name);
+ size_t length;
+
+ /* If there is no last component, then name is a file system root or the
+ empty string. */
+ if (! *base)
+ return xstrndup (name, base_len (name));
+
+ /* Collapse a sequence of trailing slashes into one. */
+ length = base_len (base);
+ if (ISSLASH (base[length]))
+ length++;
+
+ /* On systems with drive letters, "a/b:c" must return "./b:c" rather
+ than "b:c" to avoid confusion with a drive letter. On systems
+ with pure POSIX semantics, this is not an issue. */
+ if (FILE_SYSTEM_PREFIX_LEN (base))
+ {
+ char *p = xmalloc (length + 3);
+ p[0] = '.';
+ p[1] = '/';
+ memcpy (p + 2, base, length);
+ p[length + 2] = '\0';
+ return p;
+ }
+
+ /* Finally, copy the basename. */
+ return xstrndup (base, length);
+}
diff --git a/lib/binary-io.c b/lib/binary-io.c
new file mode 100644
index 0000000..e84e223
--- /dev/null
+++ b/lib/binary-io.c
@@ -0,0 +1,39 @@
+/* Binary mode I/O.
+ Copyright 2017-2020 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/>. */
+
+#include <config.h>
+
+#define BINARY_IO_INLINE _GL_EXTERN_INLINE
+#include "binary-io.h"
+
+#if defined __DJGPP__ || defined __EMX__
+# include <unistd.h>
+
+int
+set_binary_mode (int fd, int mode)
+{
+ if (isatty (fd))
+ /* If FD refers to a console (not a pipe, not a regular file),
+ O_TEXT is the only reasonable mode, both on input and on output.
+ Silently ignore the request. If we were to return -1 here,
+ all programs that use xset_binary_mode would fail when run
+ with console input or console output. */
+ return O_TEXT;
+ else
+ return __gl_setmode (fd, mode);
+}
+
+#endif
diff --git a/lib/binary-io.h b/lib/binary-io.h
new file mode 100644
index 0000000..d17af7c
--- /dev/null
+++ b/lib/binary-io.h
@@ -0,0 +1,77 @@
+/* Binary mode I/O.
+ Copyright (C) 2001, 2003, 2005, 2008-2020 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/>. */
+
+#ifndef _BINARY_H
+#define _BINARY_H
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is guaranteed by the gnulib <fcntl.h>. */
+#include <fcntl.h>
+
+/* The MSVC7 <stdio.h> doesn't like to be included after '#define fileno ...',
+ so we include it here first. */
+#include <stdio.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef BINARY_IO_INLINE
+# define BINARY_IO_INLINE _GL_INLINE
+#endif
+
+#if O_BINARY
+# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__
+# include <io.h> /* declares setmode() */
+# define __gl_setmode setmode
+# else
+# define __gl_setmode _setmode
+# undef fileno
+# define fileno _fileno
+# endif
+#else
+ /* On reasonable systems, binary I/O is the only choice. */
+ /* Use a function rather than a macro, to avoid gcc warnings
+ "warning: statement with no effect". */
+BINARY_IO_INLINE int
+__gl_setmode (int fd _GL_UNUSED, int mode _GL_UNUSED)
+{
+ return O_BINARY;
+}
+#endif
+
+/* Set FD's mode to MODE, which should be either O_TEXT or O_BINARY.
+ Return the old mode if successful, -1 (setting errno) on failure.
+ Ordinarily this function would be called 'setmode', since that is
+ its old name on MS-Windows, but it is called 'set_binary_mode' here
+ to avoid colliding with a BSD function of another name. */
+
+#if defined __DJGPP__ || defined __EMX__
+extern int set_binary_mode (int fd, int mode);
+#else
+BINARY_IO_INLINE int
+set_binary_mode (int fd, int mode)
+{
+ return __gl_setmode (fd, mode);
+}
+#endif
+
+/* This macro is obsolescent. */
+#define SET_BINARY(fd) ((void) set_binary_mode (fd, O_BINARY))
+
+_GL_INLINE_HEADER_END
+
+#endif /* _BINARY_H */
diff --git a/lib/bind.c b/lib/bind.c
new file mode 100644
index 0000000..3c60a76
--- /dev/null
+++ b/lib/bind.c
@@ -0,0 +1,49 @@
+/* bind.c --- wrappers for Windows bind function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef bind
+
+int
+rpl_bind (int fd, const struct sockaddr *sockaddr, socklen_t len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = bind (sock, sockaddr, len);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/bitrotate.c b/lib/bitrotate.c
new file mode 100644
index 0000000..a8f6028
--- /dev/null
+++ b/lib/bitrotate.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define BITROTATE_INLINE _GL_EXTERN_INLINE
+#include "bitrotate.h"
diff --git a/lib/bitrotate.h b/lib/bitrotate.h
new file mode 100644
index 0000000..59827e2
--- /dev/null
+++ b/lib/bitrotate.h
@@ -0,0 +1,138 @@
+/* bitrotate.h - Rotate bits in integers
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Simon Josefsson <simon@josefsson.org>, 2008. */
+
+#ifndef _GL_BITROTATE_H
+#define _GL_BITROTATE_H
+
+#include <limits.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef BITROTATE_INLINE
+# define BITROTATE_INLINE _GL_INLINE
+#endif
+
+#ifdef UINT64_MAX
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 63 inclusive. */
+BITROTATE_INLINE uint64_t
+rotl64 (uint64_t x, int n)
+{
+ return ((x << n) | (x >> (64 - n))) & UINT64_MAX;
+}
+
+/* Given an unsigned 64-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 63 inclusive.*/
+BITROTATE_INLINE uint64_t
+rotr64 (uint64_t x, int n)
+{
+ return ((x >> n) | (x << (64 - n))) & UINT64_MAX;
+}
+#endif
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ 31 inclusive. */
+BITROTATE_INLINE uint32_t
+rotl32 (uint32_t x, int n)
+{
+ return ((x << n) | (x >> (32 - n))) & UINT32_MAX;
+}
+
+/* Given an unsigned 32-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ 31 inclusive.*/
+BITROTATE_INLINE uint32_t
+rotr32 (uint32_t x, int n)
+{
+ return ((x >> n) | (x << (32 - n))) & UINT32_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 and
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+BITROTATE_INLINE size_t
+rotl_sz (size_t x, int n)
+{
+ return ((x << n) | (x >> ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given a size_t argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be between 1 to
+ (CHAR_BIT * sizeof (size_t) - 1) inclusive. */
+BITROTATE_INLINE size_t
+rotr_sz (size_t x, int n)
+{
+ return ((x >> n) | (x << ((CHAR_BIT * sizeof x) - n))) & SIZE_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to
+ 15 inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+BITROTATE_INLINE uint16_t
+rotl16 (uint16_t x, int n)
+{
+ return (((unsigned int) x << n) | ((unsigned int) x >> (16 - n)))
+ & UINT16_MAX;
+}
+
+/* Given an unsigned 16-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 15
+ inclusive, but on most relevant targets N can also be 0 and 16
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+BITROTATE_INLINE uint16_t
+rotr16 (uint16_t x, int n)
+{
+ return (((unsigned int) x >> n) | ((unsigned int) x << (16 - n)))
+ & UINT16_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the left. N must be between 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+BITROTATE_INLINE uint8_t
+rotl8 (uint8_t x, int n)
+{
+ return (((unsigned int) x << n) | ((unsigned int) x >> (8 - n))) & UINT8_MAX;
+}
+
+/* Given an unsigned 8-bit argument X, return the value corresponding
+ to rotating the bits N steps to the right. N must be in 1 to 7
+ inclusive, but on most relevant targets N can also be 0 and 8
+ because 'int' is at least 32 bits and the arguments must widen
+ before shifting. */
+BITROTATE_INLINE uint8_t
+rotr8 (uint8_t x, int n)
+{
+ return (((unsigned int) x >> n) | ((unsigned int) x << (8 - n))) & UINT8_MAX;
+}
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_BITROTATE_H */
diff --git a/lib/btowc.c b/lib/btowc.c
new file mode 100644
index 0000000..6828b70
--- /dev/null
+++ b/lib/btowc.c
@@ -0,0 +1,39 @@
+/* Convert unibyte character to wide character.
+ Copyright (C) 2008, 2010-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+wint_t
+btowc (int c)
+{
+ if (c != EOF)
+ {
+ char buf[1];
+ wchar_t wc;
+
+ buf[0] = c;
+ if (mbtowc (&wc, buf, 1) >= 0)
+ return wc;
+ }
+ return WEOF;
+}
diff --git a/lib/byteswap.in.h b/lib/byteswap.in.h
new file mode 100644
index 0000000..e690b3c
--- /dev/null
+++ b/lib/byteswap.in.h
@@ -0,0 +1,44 @@
+/* byteswap.h - Byte swapping
+ Copyright (C) 2005, 2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Oskar Liljeblad <oskar@osk.mine.nu>, 2005.
+
+ 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/>. */
+
+#ifndef _GL_BYTESWAP_H
+#define _GL_BYTESWAP_H
+
+/* Given an unsigned 16-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_16(x) ((((x) & 0x00FF) << 8) | \
+ (((x) & 0xFF00) >> 8))
+
+/* Given an unsigned 32-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_32(x) ((((x) & 0x000000FF) << 24) | \
+ (((x) & 0x0000FF00) << 8) | \
+ (((x) & 0x00FF0000) >> 8) | \
+ (((x) & 0xFF000000) >> 24))
+
+/* Given an unsigned 64-bit argument X, return the value corresponding to
+ X with reversed byte order. */
+#define bswap_64(x) ((((x) & 0x00000000000000FFULL) << 56) | \
+ (((x) & 0x000000000000FF00ULL) << 40) | \
+ (((x) & 0x0000000000FF0000ULL) << 24) | \
+ (((x) & 0x00000000FF000000ULL) << 8) | \
+ (((x) & 0x000000FF00000000ULL) >> 8) | \
+ (((x) & 0x0000FF0000000000ULL) >> 24) | \
+ (((x) & 0x00FF000000000000ULL) >> 40) | \
+ (((x) & 0xFF00000000000000ULL) >> 56))
+
+#endif /* _GL_BYTESWAP_H */
diff --git a/lib/c++defs.h b/lib/c++defs.h
new file mode 100644
index 0000000..01ef814
--- /dev/null
+++ b/lib/c++defs.h
@@ -0,0 +1,331 @@
+/* C++ compatible function declaration macros.
+ Copyright (C) 2010-2020 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/>. */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+ * For providing a substitute for a function that is missing on some
+ platforms, but is declared and works fine on the platforms on which
+ it exists:
+
+ #if @GNULIB_FOO@
+ # if !@HAVE_FOO@
+ _GL_FUNCDECL_SYS (foo, ...);
+ # endif
+ _GL_CXXALIAS_SYS (foo, ...);
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+
+ * For providing a replacement for a function that exists on all platforms,
+ but is broken/insufficient and needs to be replaced on some platforms:
+
+ #if @GNULIB_FOO@
+ # if @REPLACE_FOO@
+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+ # undef foo
+ # define foo rpl_foo
+ # endif
+ _GL_FUNCDECL_RPL (foo, ...);
+ _GL_CXXALIAS_RPL (foo, ...);
+ # else
+ _GL_CXXALIAS_SYS (foo, ...);
+ # endif
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+
+ * For providing a replacement for a function that exists on some platforms
+ but is broken/insufficient and needs to be replaced on some of them and
+ is additionally either missing or undeclared on some other platforms:
+
+ #if @GNULIB_FOO@
+ # if @REPLACE_FOO@
+ # if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+ # undef foo
+ # define foo rpl_foo
+ # endif
+ _GL_FUNCDECL_RPL (foo, ...);
+ _GL_CXXALIAS_RPL (foo, ...);
+ # else
+ # if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
+ _GL_FUNCDECL_SYS (foo, ...);
+ # endif
+ _GL_CXXALIAS_SYS (foo, ...);
+ # endif
+ _GL_CXXALIASWARN (foo);
+ #elif defined GNULIB_POSIXCHECK
+ ...
+ #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+ performs the declaration with C linkage. */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+ declares a replacement function, named rpl_func, with the given prototype,
+ consisting of return type, parameters, and attributes.
+ Example:
+ _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+ _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+ declares the system function, named func, with the given prototype,
+ consisting of return type, parameters, and attributes.
+ Example:
+ _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+ declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+ Example:
+ _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+ Wrapping rpl_func in an object with an inline conversion operator
+ avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+ actually used in the program. */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return ::rpl_func; \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA (func, rettype, parameters);
+ is to be used when func is a Microsoft deprecated alias, on native Windows.
+ It declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to _func, if GNULIB_NAMESPACE is defined.
+ Example:
+ _GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+ */
+#define _GL_CXXALIAS_MDA(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+ is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+ except that the C function rpl_func may have a slightly different
+ declaration. A cast is used to silence the "invalid conversion" error
+ that would otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>(::rpl_func); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_MDA_CAST (func, rettype, parameters);
+ is like _GL_CXXALIAS_MDA (func, rettype, parameters);
+ except that the C function func may have a slightly different declaration.
+ A cast is used to silence the "invalid conversion" error that would
+ otherwise occur. */
+#define _GL_CXXALIAS_MDA_CAST(func,rettype,parameters) \
+ _GL_CXXALIAS_RPL_CAST_1 (func, _##func, rettype, parameters)
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+ declares a C++ alias called GNULIB_NAMESPACE::func
+ that redirects to the system provided function func, if GNULIB_NAMESPACE
+ is defined.
+ Example:
+ _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+ Wrapping func in an object with an inline conversion operator
+ avoids a reference to func unless GNULIB_NAMESPACE::func is
+ actually used in the program. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return ::func; \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+ is like _GL_CXXALIAS_SYS (func, rettype, parameters);
+ except that the C function func may have a slightly different declaration.
+ A cast is used to silence the "invalid conversion" error that would
+ otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>(::func); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+ is like _GL_CXXALIAS_SYS (func, rettype, parameters);
+ except that the C function is picked among a set of overloaded functions,
+ namely the one with rettype2 and parameters2. Two consecutive casts
+ are used to silence the "cannot find a match" and "invalid conversion"
+ errors that would otherwise occur. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+ /* The outer cast must be a reinterpret_cast.
+ The inner cast: When the function is defined as a set of overloaded
+ functions, it works as a static_cast<>, choosing the designated variant.
+ When the function is defined as a single variant, it works as a
+ reinterpret_cast<>. The parenthesized cast syntax works both ways. */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+ namespace GNULIB_NAMESPACE \
+ { \
+ static const struct _gl_ ## func ## _wrapper \
+ { \
+ typedef rettype (*type) parameters; \
+ \
+ inline operator type () const \
+ { \
+ return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); \
+ } \
+ } func = {}; \
+ } \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+ causes a warning to be emitted when ::func is used but not when
+ GNULIB_NAMESPACE::func is used. func must be defined without overloaded
+ variants. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+ _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+ _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+ we enable the warning only when not optimizing. */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ _GL_WARN_ON_USE (func, \
+ "The symbol ::" #func " refers to the system function. " \
+ "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ extern __typeof__ (func) func
+# else
+# define _GL_CXXALIASWARN_2(func,namespace) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+ causes a warning to be emitted when the given overloaded variant of ::func
+ is used but not when GNULIB_NAMESPACE::func is used. */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+ _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+ GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+ _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+ we enable the warning only when not optimizing. */
+# if !(defined __GNUC__ && !defined __clang__ && __OPTIMIZE__)
+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+ _GL_WARN_ON_USE_CXX (func, rettype, rettype, parameters_and_attributes, \
+ "The symbol ::" #func " refers to the system function. " \
+ "Use " #namespace "::" #func " instead.")
+# else
+# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+ _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
diff --git a/lib/c-ctype.c b/lib/c-ctype.c
new file mode 100644
index 0000000..5d9d4d8
--- /dev/null
+++ b/lib/c-ctype.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define C_CTYPE_INLINE _GL_EXTERN_INLINE
+#include "c-ctype.h"
diff --git a/lib/c-ctype.h b/lib/c-ctype.h
new file mode 100644
index 0000000..fbd11b3
--- /dev/null
+++ b/lib/c-ctype.h
@@ -0,0 +1,366 @@
+/* Character handling in C locale.
+
+ These functions work like the corresponding functions in <ctype.h>,
+ except that they have the C (POSIX) locale hardwired, whereas the
+ <ctype.h> functions' behaviour depends on the current locale set via
+ setlocale.
+
+ Copyright (C) 2000-2003, 2006, 2008-2020 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/>. */
+
+#ifndef C_CTYPE_H
+#define C_CTYPE_H
+
+#include <stdbool.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef C_CTYPE_INLINE
+# define C_CTYPE_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. */
+
+
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ASCII or one of its variants or extensions, not EBCDIC.
+ Testing the value of '\n' and '\r' is not relevant. */
+# define C_CTYPE_ASCII 1
+#elif ! (' ' == '\x40' && '0' == '\xf0' \
+ && 'A' == '\xc1' && 'J' == '\xd1' && 'S' == '\xe2' \
+ && 'a' == '\x81' && 'j' == '\x91' && 's' == '\xa2')
+# error "Only ASCII and EBCDIC are supported"
+#endif
+
+#if 'A' < 0
+# error "EBCDIC and char is signed -- not supported"
+#endif
+
+/* Cases for control characters. */
+
+#define _C_CTYPE_CNTRL \
+ case '\a': case '\b': case '\f': case '\n': \
+ case '\r': case '\t': case '\v': \
+ _C_CTYPE_OTHER_CNTRL
+
+/* ASCII control characters other than those with \-letter escapes. */
+
+#if C_CTYPE_ASCII
+# define _C_CTYPE_OTHER_CNTRL \
+ case '\x00': case '\x01': case '\x02': case '\x03': \
+ case '\x04': case '\x05': case '\x06': case '\x0e': \
+ case '\x0f': case '\x10': case '\x11': case '\x12': \
+ case '\x13': case '\x14': case '\x15': case '\x16': \
+ case '\x17': case '\x18': case '\x19': case '\x1a': \
+ case '\x1b': case '\x1c': case '\x1d': case '\x1e': \
+ case '\x1f': case '\x7f'
+#else
+ /* Use EBCDIC code page 1047's assignments for ASCII control chars;
+ assume all EBCDIC code pages agree about these assignments. */
+# define _C_CTYPE_OTHER_CNTRL \
+ case '\x00': case '\x01': case '\x02': case '\x03': \
+ case '\x07': case '\x0e': case '\x0f': case '\x10': \
+ case '\x11': case '\x12': case '\x13': case '\x18': \
+ case '\x19': case '\x1c': case '\x1d': case '\x1e': \
+ case '\x1f': case '\x26': case '\x27': case '\x2d': \
+ case '\x2e': case '\x32': case '\x37': case '\x3c': \
+ case '\x3d': case '\x3f'
+#endif
+
+/* Cases for lowercase hex letters, and lowercase letters, all offset by N. */
+
+#define _C_CTYPE_LOWER_A_THRU_F_N(N) \
+ case 'a' + (N): case 'b' + (N): case 'c' + (N): case 'd' + (N): \
+ case 'e' + (N): case 'f' + (N)
+#define _C_CTYPE_LOWER_N(N) \
+ _C_CTYPE_LOWER_A_THRU_F_N(N): \
+ case 'g' + (N): case 'h' + (N): case 'i' + (N): case 'j' + (N): \
+ case 'k' + (N): case 'l' + (N): case 'm' + (N): case 'n' + (N): \
+ case 'o' + (N): case 'p' + (N): case 'q' + (N): case 'r' + (N): \
+ case 's' + (N): case 't' + (N): case 'u' + (N): case 'v' + (N): \
+ case 'w' + (N): case 'x' + (N): case 'y' + (N): case 'z' + (N)
+
+/* Cases for hex letters, digits, lower, punct, and upper. */
+
+#define _C_CTYPE_A_THRU_F \
+ _C_CTYPE_LOWER_A_THRU_F_N (0): \
+ _C_CTYPE_LOWER_A_THRU_F_N ('A' - 'a')
+#define _C_CTYPE_DIGIT \
+ case '0': case '1': case '2': case '3': \
+ case '4': case '5': case '6': case '7': \
+ case '8': case '9'
+#define _C_CTYPE_LOWER _C_CTYPE_LOWER_N (0)
+#define _C_CTYPE_PUNCT \
+ case '!': case '"': case '#': case '$': \
+ case '%': case '&': case '\'': case '(': \
+ case ')': case '*': case '+': case ',': \
+ case '-': case '.': case '/': case ':': \
+ case ';': case '<': case '=': case '>': \
+ case '?': case '@': case '[': case '\\': \
+ case ']': case '^': case '_': case '`': \
+ case '{': case '|': case '}': case '~'
+#define _C_CTYPE_UPPER _C_CTYPE_LOWER_N ('A' - 'a')
+
+
+/* Function definitions. */
+
+/* Unlike the functions in <ctype.h>, which require an argument in the range
+ of the 'unsigned char' type, the functions here operate on values that are
+ in the 'unsigned char' range or in the 'char' range. In other words,
+ when you have a 'char' value, you need to cast it before using it as
+ argument to a <ctype.h> function:
+
+ const char *s = ...;
+ if (isalpha ((unsigned char) *s)) ...
+
+ but you don't need to cast it for the functions defined in this file:
+
+ const char *s = ...;
+ if (c_isalpha (*s)) ...
+ */
+
+C_CTYPE_INLINE bool
+c_isalnum (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_DIGIT:
+ _C_CTYPE_LOWER:
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isalpha (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_LOWER:
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+/* The function isascii is not locale dependent.
+ Its use in EBCDIC is questionable. */
+C_CTYPE_INLINE bool
+c_isascii (int c)
+{
+ switch (c)
+ {
+ case ' ':
+ _C_CTYPE_CNTRL:
+ _C_CTYPE_DIGIT:
+ _C_CTYPE_LOWER:
+ _C_CTYPE_PUNCT:
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isblank (int c)
+{
+ return c == ' ' || c == '\t';
+}
+
+C_CTYPE_INLINE bool
+c_iscntrl (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_CNTRL:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isdigit (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_DIGIT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isgraph (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_DIGIT:
+ _C_CTYPE_LOWER:
+ _C_CTYPE_PUNCT:
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_islower (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_LOWER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isprint (int c)
+{
+ switch (c)
+ {
+ case ' ':
+ _C_CTYPE_DIGIT:
+ _C_CTYPE_LOWER:
+ _C_CTYPE_PUNCT:
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_ispunct (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_PUNCT:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isspace (int c)
+{
+ switch (c)
+ {
+ case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isupper (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_UPPER:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE bool
+c_isxdigit (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_DIGIT:
+ _C_CTYPE_A_THRU_F:
+ return true;
+ default:
+ return false;
+ }
+}
+
+C_CTYPE_INLINE int
+c_tolower (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_UPPER:
+ return c - 'A' + 'a';
+ default:
+ return c;
+ }
+}
+
+C_CTYPE_INLINE int
+c_toupper (int c)
+{
+ switch (c)
+ {
+ _C_CTYPE_LOWER:
+ return c - 'a' + 'A';
+ default:
+ return c;
+ }
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* C_CTYPE_H */
diff --git a/lib/c-strcase.h b/lib/c-strcase.h
new file mode 100644
index 0000000..3b711f5
--- /dev/null
+++ b/lib/c-strcase.h
@@ -0,0 +1,56 @@
+/* Case-insensitive string comparison functions in C locale.
+ Copyright (C) 1995-1996, 2001, 2003, 2005, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef C_STRCASE_H
+#define C_STRCASE_H
+
+#include <stddef.h>
+
+
+/* The functions defined in this file assume the "C" locale and a character
+ set without diacritics (ASCII-US or EBCDIC-US or something like that).
+ Even if the "C" locale on a particular system is an extension of the ASCII
+ character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it
+ is ISO-8859-1), the functions in this file recognize only the ASCII
+ characters. More precisely, one of the string arguments must be an ASCII
+ string; the other one can also contain non-ASCII characters (but then
+ the comparison result will be nonzero). */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2. */
+extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE;
+
+/* Compare no more than N characters of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2. */
+extern int c_strncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASE_H */
diff --git a/lib/c-strcasecmp.c b/lib/c-strcasecmp.c
new file mode 100644
index 0000000..f1a4b98
--- /dev/null
+++ b/lib/c-strcasecmp.c
@@ -0,0 +1,56 @@
+/* c-strcasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strcasecmp (const char *s1, const char *s2)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return _GL_CMP (c1, c2);
+}
diff --git a/lib/c-strcaseeq.h b/lib/c-strcaseeq.h
new file mode 100644
index 0000000..0f7c50a
--- /dev/null
+++ b/lib/c-strcaseeq.h
@@ -0,0 +1,181 @@
+/* Optimized case-insensitive string comparison in C locale.
+ Copyright (C) 2001-2002, 2007, 2009-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include "c-strcase.h"
+#include "c-ctype.h"
+
+/* STRCASEEQ allows to optimize string comparison with a small literal string.
+ STRCASEEQ (s, "UTF-8", 'U','T','F','-','8',0,0,0,0)
+ is semantically equivalent to
+ c_strcasecmp (s, "UTF-8") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
+
+/* Case insensitive comparison of ASCII characters. */
+# if C_CTYPE_ASCII
+# define CASEEQ(other,upper) \
+ (c_isupper (upper) ? ((other) & ~0x20) == (upper) : (other) == (upper))
+# else
+# define CASEEQ(other,upper) \
+ (c_toupper (other) == (upper))
+# endif
+
+static inline int
+strcaseeq9 (const char *s1, const char *s2)
+{
+ return c_strcasecmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+strcaseeq8 (const char *s1, const char *s2, char s28)
+{
+ if (CASEEQ (s1[8], s28))
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return strcaseeq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (CASEEQ (s1[7], s27))
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return strcaseeq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[6], s26))
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return strcaseeq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[5], s25))
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return strcaseeq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[4], s24))
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return strcaseeq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[3], s23))
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return strcaseeq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[2], s22))
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return strcaseeq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[1], s21))
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return strcaseeq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+strcaseeq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (CASEEQ (s1[0], s20))
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return strcaseeq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ strcaseeq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STRCASEEQ(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (c_strcasecmp (s1, s2) == 0)
+
+#endif
diff --git a/lib/c-strcasestr.c b/lib/c-strcasestr.c
new file mode 100644
index 0000000..b55b31f
--- /dev/null
+++ b/lib/c-strcasestr.c
@@ -0,0 +1,77 @@
+/* c-strcasestr.c -- case insensitive substring search in C locale
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2005.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcasestr.h"
+
+#include <stdbool.h>
+#include <string.h>
+
+#include "c-ctype.h"
+#include "c-strcase.h"
+
+/* Two-Way algorithm. */
+#define RETURN_TYPE char *
+#define AVAILABLE(h, h_l, j, n_l) \
+ (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
+ && ((h_l) = (j) + (n_l)))
+#define CANON_ELEMENT c_tolower
+#define CMP_FUNC(p1, p2, l) \
+ c_strncasecmp ((const char *) (p1), (const char *) (p2), l)
+#include "str-two-way.h"
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison from the C locale, regardless of the current locale. */
+char *
+c_strcasestr (const char *haystack_start, const char *needle_start)
+{
+ const char *haystack = haystack_start;
+ const char *needle = needle_start;
+ size_t needle_len; /* Length of NEEDLE. */
+ size_t haystack_len; /* Known minimum length of HAYSTACK. */
+ bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
+
+ /* Determine length of NEEDLE, and in the process, make sure
+ HAYSTACK is at least as long (no point processing all of a long
+ NEEDLE if HAYSTACK is too short). */
+ while (*haystack && *needle)
+ ok &= (c_tolower ((unsigned char) *haystack++)
+ == c_tolower ((unsigned char) *needle++));
+ if (*needle)
+ return NULL;
+ if (ok)
+ return (char *) haystack_start;
+ needle_len = needle - needle_start;
+ haystack = haystack_start + 1;
+ haystack_len = needle_len - 1;
+
+ /* Perform the search. Abstract memory is considered to be an array
+ of 'unsigned char' values, not an array of 'char' values. See
+ ISO C 99 section 6.2.6.1. */
+ if (needle_len < LONG_NEEDLE_THRESHOLD)
+ return two_way_short_needle ((const unsigned char *) haystack,
+ haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+ return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
+ (const unsigned char *) needle_start,
+ needle_len);
+}
+
+#undef LONG_NEEDLE_THRESHOLD
diff --git a/lib/c-strcasestr.h b/lib/c-strcasestr.h
new file mode 100644
index 0000000..a6eb80a
--- /dev/null
+++ b/lib/c-strcasestr.h
@@ -0,0 +1,36 @@
+/* Case-insensitive searching in a string in C locale.
+ Copyright (C) 2005, 2009-2020 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/>. */
+
+#ifndef C_STRCASESTR_H
+#define C_STRCASESTR_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+extern char *c_strcasestr (const char *haystack, const char *needle);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* C_STRCASESTR_H */
diff --git a/lib/c-strncasecmp.c b/lib/c-strncasecmp.c
new file mode 100644
index 0000000..1d6e141
--- /dev/null
+++ b/lib/c-strncasecmp.c
@@ -0,0 +1,56 @@
+/* c-strncasecmp.c -- case insensitive string comparator in C locale
+ Copyright (C) 1998-1999, 2005-2006, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "c-strcase.h"
+
+#include <limits.h>
+
+#include "c-ctype.h"
+
+int
+c_strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = c_tolower (*p1);
+ c2 = c_tolower (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return _GL_CMP (c1, c2);
+}
diff --git a/lib/canonicalize.c b/lib/canonicalize.c
new file mode 100644
index 0000000..2606683
--- /dev/null
+++ b/lib/canonicalize.c
@@ -0,0 +1,493 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2020 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/>. */
+
+#include <config.h>
+
+#include "canonicalize.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include <filename.h>
+#include <idx.h>
+#include <intprops.h>
+#include <scratch_buffer.h>
+
+#include "attribute.h"
+#include "file-set.h"
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Suppress bogus GCC -Wmaybe-uninitialized warnings. */
+#if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* True if adding two valid object sizes might overflow idx_t.
+ As a practical matter, this cannot happen on 64-bit machines. */
+enum { NARROW_ADDRESSES = IDX_MAX >> 31 >> 31 == 0 };
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT false
+#endif
+
+#if ISSLASH ('\\')
+# define SLASHES "/\\"
+#else
+# define SLASHES "/"
+#endif
+
+/* Return true if FILE's existence can be shown, false (setting errno)
+ otherwise. Follow symbolic links. */
+static bool
+file_accessible (char const *file)
+{
+# if HAVE_FACCESSAT
+ return faccessat (AT_FDCWD, file, F_OK, AT_EACCESS) == 0;
+# else
+ struct stat st;
+ return stat (file, &st) == 0 || errno == EOVERFLOW;
+# endif
+}
+
+/* True if concatenating END as a suffix to a file name means that the
+ code needs to check that the file name is that of a searchable
+ directory, since the canonicalize_filename_mode_stk code won't
+ check this later anyway when it checks an ordinary file name
+ component within END. END must either be empty, or start with a
+ slash. */
+
+static bool _GL_ATTRIBUTE_PURE
+suffix_requires_dir_check (char const *end)
+{
+ /* If END does not start with a slash, the suffix is OK. */
+ while (ISSLASH (*end))
+ {
+ /* Two or more slashes act like a single slash. */
+ do
+ end++;
+ while (ISSLASH (*end));
+
+ switch (*end++)
+ {
+ default: return false; /* An ordinary file name component is OK. */
+ case '\0': return true; /* Trailing "/" is trouble. */
+ case '.': break; /* Possibly "." or "..". */
+ }
+ /* Trailing "/.", or "/.." even if not trailing, is trouble. */
+ if (!*end || (*end == '.' && (!end[1] || ISSLASH (end[1]))))
+ return true;
+ }
+
+ return false;
+}
+
+/* Append this to a file name to test whether it is a searchable directory.
+ On POSIX platforms "/" suffices, but "/./" is sometimes needed on
+ macOS 10.13 <https://bugs.gnu.org/30350>, and should also work on
+ platforms like AIX 7.2 that need at least "/.". */
+
+#ifdef LSTAT_FOLLOWS_SLASHED_SYMLINK
+static char const dir_suffix[] = "/";
+#else
+static char const dir_suffix[] = "/./";
+#endif
+
+/* Return true if DIR is a searchable dir, false (setting errno) otherwise.
+ DIREND points to the NUL byte at the end of the DIR string.
+ Store garbage into DIREND[0 .. strlen (dir_suffix)]. */
+
+static bool
+dir_check (char *dir, char *dirend)
+{
+ strcpy (dirend, dir_suffix);
+ return file_accessible (dir);
+}
+
+#if !((HAVE_CANONICALIZE_FILE_NAME && FUNC_REALPATH_WORKS) \
+ || GNULIB_CANONICALIZE_LGPL)
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any ".", ".." components nor any repeated file name
+ separators ('/') or symlinks. All components must exist.
+ The result is malloc'd. */
+
+char *
+canonicalize_file_name (const char *name)
+{
+ return canonicalize_filename_mode (name, CAN_EXISTING);
+}
+#endif /* !HAVE_CANONICALIZE_FILE_NAME */
+
+static bool
+multiple_bits_set (canonicalize_mode_t i)
+{
+ return (i & (i - 1)) != 0;
+}
+
+/* Return true if we've already seen the triple, <FILENAME, dev, ino>.
+ If *HT is not initialized, initialize it. */
+static bool
+seen_triple (Hash_table **ht, char const *filename, struct stat const *st)
+{
+ if (*ht == NULL)
+ {
+ idx_t initial_capacity = 7;
+ *ht = hash_initialize (initial_capacity,
+ NULL,
+ triple_hash,
+ triple_compare_ino_str,
+ triple_free);
+ if (*ht == NULL)
+ xalloc_die ();
+ }
+
+ if (seen_file (*ht, filename, st))
+ return true;
+
+ record_file (*ht, filename, st);
+ return false;
+}
+
+
+/* Act like canonicalize_filename_mode (see below), with an additional argument
+ rname_buf that can be used as temporary storage.
+
+ If GCC_LINT is defined, do not inline this function with GCC 10.1
+ and later, to avoid creating a pointer to the stack that GCC
+ -Wreturn-local-addr incorrectly complains about. See:
+ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644
+ Although the noinline attribute can hurt performance a bit, no better way
+ to pacify GCC is known; even an explicit #pragma does not pacify GCC.
+ When the GCC bug is fixed this workaround should be limited to the
+ broken GCC versions. */
+#if _GL_GNUC_PREREQ (10, 1)
+# if defined GCC_LINT || defined lint
+__attribute__ ((__noinline__))
+# elif __OPTIMIZE__ && !__NO_INLINE__
+# define GCC_BOGUS_WRETURN_LOCAL_ADDR
+# endif
+#endif
+static char *
+canonicalize_filename_mode_stk (const char *name, canonicalize_mode_t can_mode,
+ struct scratch_buffer *rname_buf)
+{
+ char *dest;
+ char const *start;
+ char const *end;
+ Hash_table *ht = NULL;
+ bool logical = (can_mode & CAN_NOLINKS) != 0;
+ int num_links = 0;
+
+ canonicalize_mode_t can_exist = can_mode & CAN_MODE_MASK;
+ if (multiple_bits_set (can_exist))
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (name == NULL)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ struct scratch_buffer extra_buffer, link_buffer;
+ scratch_buffer_init (&extra_buffer);
+ scratch_buffer_init (&link_buffer);
+ scratch_buffer_init (rname_buf);
+ char *rname_on_stack = rname_buf->data;
+ char *rname = rname_on_stack;
+ bool end_in_extra_buffer = false;
+ bool failed = true;
+
+ /* This is always zero for Posix hosts, but can be 2 for MS-Windows
+ and MS-DOS X:/foo/bar file names. */
+ idx_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+ if (!IS_ABSOLUTE_FILE_NAME (name))
+ {
+ while (!getcwd (rname, rname_buf->length))
+ {
+ switch (errno)
+ {
+ case ERANGE:
+ if (scratch_buffer_grow (rname_buf))
+ break;
+ FALLTHROUGH;
+ case ENOMEM:
+ xalloc_die ();
+
+ default:
+ dest = rname;
+ goto error;
+ }
+ rname = rname_buf->data;
+ }
+ dest = rawmemchr (rname, '\0');
+ start = name;
+ prefix_len = FILE_SYSTEM_PREFIX_LEN (rname);
+ }
+ else
+ {
+ dest = mempcpy (rname, name, prefix_len);
+ *dest++ = '/';
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
+ {
+ if (prefix_len == 0 /* implies ISSLASH (name[0]) */
+ && ISSLASH (name[1]) && !ISSLASH (name[2]))
+ {
+ *dest++ = '/';
+#if defined _WIN32 && !defined __CYGWIN__
+ /* For UNC file names '\\server\path\to\file', extend the prefix
+ to include the server: '\\server\'. */
+ {
+ idx_t i;
+ for (i = 2; name[i] != '\0' && !ISSLASH (name[i]); )
+ i++;
+ if (name[i] != '\0' /* implies ISSLASH (name[i]) */
+ && i + 1 < rname_buf->length)
+ {
+ prefix_len = i;
+ memcpy (dest, name + 2, i - 2 + 1);
+ dest += i - 2 + 1;
+ }
+ else
+ {
+ /* Either name = '\\server'; this is an invalid file name.
+ Or name = '\\server\...' and server is more than
+ rname_buf->length - 4 bytes long. In either
+ case, stop the UNC processing. */
+ }
+ }
+#endif
+ }
+ *dest = '\0';
+ }
+ start = name + prefix_len;
+ }
+
+ for ( ; *start; start = end)
+ {
+ /* Skip sequence of multiple file name separators. */
+ while (ISSLASH (*start))
+ ++start;
+
+ /* Find end of component. */
+ for (end = start; *end && !ISSLASH (*end); ++end)
+ /* Nothing. */;
+
+ /* Length of this file name component; it can be zero if a file
+ name ends in '/'. */
+ idx_t startlen = end - start;
+
+ if (startlen == 0)
+ break;
+ else if (startlen == 1 && start[0] == '.')
+ /* nothing */;
+ else if (startlen == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rname + prefix_len + 1)
+ for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
+ continue;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT
+ && dest == rname + 1 && !prefix_len
+ && ISSLASH (*dest) && !ISSLASH (dest[1]))
+ dest++;
+ }
+ else
+ {
+ if (!ISSLASH (dest[-1]))
+ *dest++ = '/';
+
+ while (rname + rname_buf->length - dest
+ < startlen + sizeof dir_suffix)
+ {
+ idx_t dest_offset = dest - rname;
+ if (!scratch_buffer_grow_preserve (rname_buf))
+ xalloc_die ();
+ rname = rname_buf->data;
+ dest = rname + dest_offset;
+ }
+
+ dest = mempcpy (dest, start, startlen);
+ *dest = '\0';
+
+ char *buf;
+ ssize_t n = -1;
+ if (!logical)
+ {
+ while (true)
+ {
+ buf = link_buffer.data;
+ idx_t bufsize = link_buffer.length;
+ n = readlink (rname, buf, bufsize - 1);
+ if (n < bufsize - 1)
+ break;
+ if (!scratch_buffer_grow (&link_buffer))
+ xalloc_die ();
+ }
+ }
+ if (0 <= n)
+ {
+ /* A physical traversal and RNAME is a symbolic link. */
+
+ if (num_links < 20)
+ num_links++;
+ else if (*start)
+ {
+ /* Enough symlinks have been seen that it is time to
+ worry about being in a symlink cycle.
+ Get the device and inode of the parent directory, as
+ pre-2017 POSIX says this info is not reliable for
+ symlinks. */
+ struct stat st;
+ dest[- startlen] = '\0';
+ if (stat (*rname ? rname : ".", &st) != 0)
+ goto error;
+ dest[- startlen] = *start;
+
+ /* Detect loops. We cannot use the cycle-check module here,
+ since it's possible to encounter the same parent
+ directory more than once in a given traversal. However,
+ encountering the same (parentdir, START) pair twice does
+ indicate a loop. */
+ if (seen_triple (&ht, start, &st))
+ {
+ if (can_exist == CAN_MISSING)
+ continue;
+ errno = ELOOP;
+ goto error;
+ }
+ }
+
+ buf[n] = '\0';
+
+ char *extra_buf = extra_buffer.data;
+ idx_t end_idx IF_LINT (= 0);
+ if (end_in_extra_buffer)
+ end_idx = end - extra_buf;
+ size_t len = strlen (end);
+ if (NARROW_ADDRESSES && INT_ADD_OVERFLOW (len, n))
+ xalloc_die ();
+ while (extra_buffer.length <= len + n)
+ {
+ if (!scratch_buffer_grow_preserve (&extra_buffer))
+ xalloc_die ();
+ extra_buf = extra_buffer.data;
+ }
+ if (end_in_extra_buffer)
+ end = extra_buf + end_idx;
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+ end_in_extra_buffer = true;
+
+ if (IS_ABSOLUTE_FILE_NAME (buf))
+ {
+ idx_t pfxlen = FILE_SYSTEM_PREFIX_LEN (buf);
+
+ dest = mempcpy (rname, buf, pfxlen);
+ *dest++ = '/'; /* It's an absolute symlink */
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT)
+ {
+ if (ISSLASH (buf[1]) && !ISSLASH (buf[2]) && !pfxlen)
+ *dest++ = '/';
+ *dest = '\0';
+ }
+ /* Install the new prefix to be in effect hereafter. */
+ prefix_len = pfxlen;
+ }
+ else
+ {
+ /* Back up to previous component, ignore if at root
+ already: */
+ if (dest > rname + prefix_len + 1)
+ for (--dest; dest > rname && !ISSLASH (dest[-1]); --dest)
+ continue;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1
+ && ISSLASH (*dest) && !ISSLASH (dest[1]) && !prefix_len)
+ dest++;
+ }
+ }
+ else if (! (can_exist == CAN_MISSING
+ || (suffix_requires_dir_check (end)
+ ? dir_check (rname, dest)
+ : !logical
+ ? errno == EINVAL
+ : *end || file_accessible (rname))
+ || (can_exist == CAN_ALL_BUT_LAST
+ && errno == ENOENT
+ && !end[strspn (end, SLASHES)])))
+ goto error;
+ }
+ }
+ if (dest > rname + prefix_len + 1 && ISSLASH (dest[-1]))
+ --dest;
+ if (DOUBLE_SLASH_IS_DISTINCT_ROOT && dest == rname + 1 && !prefix_len
+ && ISSLASH (*dest) && !ISSLASH (dest[1]))
+ dest++;
+ failed = false;
+
+error:
+ if (ht)
+ hash_free (ht);
+ scratch_buffer_free (&extra_buffer);
+ scratch_buffer_free (&link_buffer);
+
+ if (failed)
+ {
+ scratch_buffer_free (rname_buf);
+ return NULL;
+ }
+
+ *dest++ = '\0';
+ char *result = scratch_buffer_dupfree (rname_buf, dest - rname);
+ if (!result)
+ xalloc_die ();
+ return result;
+}
+
+/* Return the canonical absolute name of file NAME, while treating
+ missing elements according to CAN_MODE. A canonical name
+ does not contain any ".", ".." components nor any repeated file name
+ separators ('/') or, depending on other CAN_MODE flags, symlinks.
+ Whether components must exist or not depends on canonicalize mode.
+ The result is malloc'd. */
+
+char *
+canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode)
+{
+ #ifdef GCC_BOGUS_WRETURN_LOCAL_ADDR
+ #warning "GCC might issue a bogus -Wreturn-local-addr warning here."
+ #warning "See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93644>."
+ #endif
+ struct scratch_buffer rname_buffer;
+ return canonicalize_filename_mode_stk (name, can_mode, &rname_buffer);
+}
diff --git a/lib/canonicalize.h b/lib/canonicalize.h
new file mode 100644
index 0000000..1815297
--- /dev/null
+++ b/lib/canonicalize.h
@@ -0,0 +1,57 @@
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2007, 2009-2020 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/>. */
+
+#ifndef CANONICALIZE_H_
+# define CANONICALIZE_H_
+
+#include <stdlib.h> /* for canonicalize_file_name */
+
+#define CAN_MODE_MASK (CAN_EXISTING | CAN_ALL_BUT_LAST | CAN_MISSING)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum canonicalize_mode_t
+ {
+ /* All components must exist. */
+ CAN_EXISTING = 0,
+
+ /* All components excluding last one must exist. */
+ CAN_ALL_BUT_LAST = 1,
+
+ /* No requirements on components existence. */
+ CAN_MISSING = 2,
+
+ /* Don't expand symlinks. */
+ CAN_NOLINKS = 4
+ };
+typedef enum canonicalize_mode_t canonicalize_mode_t;
+
+/* Return the canonical absolute name of file NAME, while treating
+ missing elements according to CAN_MODE. A canonical name
+ does not contain any `.', `..' components nor any repeated file name
+ separators ('/') or, depending on other CAN_MODE flags, symlinks.
+ Whether components must exist or not depends on canonicalize mode.
+ The result is malloc'd.
+ Upon failure, return NULL with errno set. */
+char *canonicalize_filename_mode (const char *, canonicalize_mode_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !CANONICALIZE_H_ */
diff --git a/lib/cdefs.h b/lib/cdefs.h
new file mode 100644
index 0000000..1a2805d
--- /dev/null
+++ b/lib/cdefs.h
@@ -0,0 +1,548 @@
+/* Copyright (C) 1992-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_CDEFS_H
+#define _SYS_CDEFS_H 1
+
+/* We are almost always included from features.h. */
+#ifndef _FEATURES_H
+# include <features.h>
+#endif
+
+/* The GNU libc does not support any K&R compilers or the traditional mode
+ of ISO C compilers anymore. Check for some of the combinations not
+ anymore supported. */
+#if defined __GNUC__ && !defined __STDC__
+# error "You need a ISO C conforming compiler to use the glibc headers"
+#endif
+
+/* Some user header file might have defined this before. */
+#undef __P
+#undef __PMT
+
+/* Compilers that are not clang may object to
+ #if defined __clang__ && __has_attribute(...)
+ even though they do not need to evaluate the right-hand side of the &&. */
+#if defined __clang__ && defined __has_attribute
+# define __glibc_clang_has_attribute(name) __has_attribute (name)
+#else
+# define __glibc_clang_has_attribute(name) 0
+#endif
+
+/* Compilers that are not clang may object to
+ #if defined __clang__ && __has_builtin(...)
+ even though they do not need to evaluate the right-hand side of the &&. */
+#if defined __clang__ && defined __has_builtin
+# define __glibc_clang_has_builtin(name) __has_builtin (name)
+#else
+# define __glibc_clang_has_builtin(name) 0
+#endif
+
+/* Compilers that are not clang may object to
+ #if defined __clang__ && __has_extension(...)
+ even though they do not need to evaluate the right-hand side of the &&. */
+#if defined __clang__ && defined __has_extension
+# define __glibc_clang_has_extension(ext) __has_extension (ext)
+#else
+# define __glibc_clang_has_extension(ext) 0
+#endif
+
+#if defined __GNUC__ || defined __clang__
+
+/* All functions, except those with callbacks or those that
+ synchronize memory, are leaf functions. */
+# if __GNUC_PREREQ (4, 6) && !defined _LIBC
+# define __LEAF , __leaf__
+# define __LEAF_ATTR __attribute__ ((__leaf__))
+# else
+# define __LEAF
+# define __LEAF_ATTR
+# endif
+
+/* GCC can always grok prototypes. For C++ programs we add throw()
+ to help it optimize the function calls. But this works only with
+ gcc 2.8.x and egcs. For gcc 3.4 and up we even mark C functions
+ as non-throwing using a function attribute since programs can use
+ the -fexceptions options for C code as well. */
+# if !defined __cplusplus \
+ && (__GNUC_PREREQ (3, 4) || __glibc_clang_has_attribute (__nothrow__))
+# define __THROW __attribute__ ((__nothrow__ __LEAF))
+# define __THROWNL __attribute__ ((__nothrow__))
+# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct
+# define __NTHNL(fct) __attribute__ ((__nothrow__)) fct
+# else
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major >= 4)
+# define __THROW throw ()
+# define __THROWNL throw ()
+# define __NTH(fct) __LEAF_ATTR fct throw ()
+# define __NTHNL(fct) fct throw ()
+# else
+# define __THROW
+# define __THROWNL
+# define __NTH(fct) fct
+# define __NTHNL(fct) fct
+# endif
+# endif
+
+#else /* Not GCC or clang. */
+
+# if (defined __cplusplus \
+ || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+# define __inline inline
+# else
+# define __inline /* No inline functions. */
+# endif
+
+# define __THROW
+# define __THROWNL
+# define __NTH(fct) fct
+
+#endif /* GCC || clang. */
+
+/* These two macros are not used in glibc anymore. They are kept here
+ only because some other projects expect the macros to be defined. */
+#define __P(args) args
+#define __PMT(args) args
+
+/* For these things, GCC behaves the ANSI way normally,
+ and the non-ANSI way under -traditional. */
+
+#define __CONCAT(x,y) x ## y
+#define __STRING(x) #x
+
+/* This is not a typedef so `const __ptr_t' does the right thing. */
+#define __ptr_t void *
+
+
+/* C++ needs to know that types and declarations are C, not C++. */
+#ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# define __END_DECLS }
+#else
+# define __BEGIN_DECLS
+# define __END_DECLS
+#endif
+
+
+/* Fortify support. */
+#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
+#define __bos0(ptr) __builtin_object_size (ptr, 0)
+
+#if __GNUC_PREREQ (4,3)
+# define __warndecl(name, msg) \
+ extern void name (void) __attribute__((__warning__ (msg)))
+# define __warnattr(msg) __attribute__((__warning__ (msg)))
+# define __errordecl(name, msg) \
+ extern void name (void) __attribute__((__error__ (msg)))
+#elif __glibc_clang_has_attribute (__diagnose_if__) && 0
+/* These definitions are not enabled, because they produce bogus warnings
+ in the glibc Fortify functions. These functions are written in a style
+ that works with GCC. In order to work with clang, these functions would
+ need to be modified. */
+# define __warndecl(name, msg) \
+ extern void name (void) __attribute__((__diagnose_if__ (1, msg, "warning")))
+# define __warnattr(msg) __attribute__((__diagnose_if__ (1, msg, "warning")))
+# define __errordecl(name, msg) \
+ extern void name (void) __attribute__((__diagnose_if__ (1, msg, "error")))
+#else
+# define __warndecl(name, msg) extern void name (void)
+# define __warnattr(msg)
+# define __errordecl(name, msg) extern void name (void)
+#endif
+
+/* Support for flexible arrays.
+ Headers that should use flexible arrays only if they're "real"
+ (e.g. only if they won't affect sizeof()) should test
+ #if __glibc_c99_flexarr_available. */
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
+# define __flexarr []
+# define __glibc_c99_flexarr_available 1
+#elif __GNUC_PREREQ (2,97) || defined __clang__
+/* GCC 2.97 and clang support C99 flexible array members as an extension,
+ even when in C89 mode or compiling C++ (any version). */
+# define __flexarr []
+# define __glibc_c99_flexarr_available 1
+#elif defined __GNUC__
+/* Pre-2.97 GCC did not support C99 flexible arrays but did have
+ an equivalent extension with slightly different notation. */
+# define __flexarr [0]
+# define __glibc_c99_flexarr_available 1
+#else
+/* Some other non-C99 compiler. Approximate with [1]. */
+# define __flexarr [1]
+# define __glibc_c99_flexarr_available 0
+#endif
+
+
+/* __asm__ ("xyz") is used throughout the headers to rename functions
+ at the assembly language level. This is wrapped by the __REDIRECT
+ macro, in order to support compilers that can do this some other
+ way. When compilers don't support asm-names at all, we have to do
+ preprocessor tricks instead (which don't have exactly the right
+ semantics, but it's the best we can do).
+
+ Example:
+ int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
+
+#if (defined __GNUC__ && __GNUC__ >= 2) || (__clang_major__ >= 4)
+
+# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
+# ifdef __cplusplus
+# define __REDIRECT_NTH(name, proto, alias) \
+ name proto __THROW __asm__ (__ASMNAME (#alias))
+# define __REDIRECT_NTHNL(name, proto, alias) \
+ name proto __THROWNL __asm__ (__ASMNAME (#alias))
+# else
+# define __REDIRECT_NTH(name, proto, alias) \
+ name proto __asm__ (__ASMNAME (#alias)) __THROW
+# define __REDIRECT_NTHNL(name, proto, alias) \
+ name proto __asm__ (__ASMNAME (#alias)) __THROWNL
+# endif
+# define __ASMNAME(cname) __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
+# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
+
+/*
+#elif __SOME_OTHER_COMPILER__
+
+# define __REDIRECT(name, proto, alias) name proto; \
+ _Pragma("let " #name " = " #alias)
+*/
+#endif
+
+/* GCC and clang have various useful declarations that can be made with
+ the '__attribute__' syntax. All of the ways we use this do fine if
+ they are omitted for compilers that don't understand it. */
+#if !(defined __GNUC__ || defined __clang__)
+# define __attribute__(xyz) /* Ignore */
+#endif
+
+/* At some point during the gcc 2.96 development the `malloc' attribute
+ for functions was introduced. We don't want to use it unconditionally
+ (although this would be possible) since it generates warnings. */
+#if __GNUC_PREREQ (2,96) || __glibc_clang_has_attribute (__malloc__)
+# define __attribute_malloc__ __attribute__ ((__malloc__))
+#else
+# define __attribute_malloc__ /* Ignore */
+#endif
+
+/* Tell the compiler which arguments to an allocation function
+ indicate the size of the allocation. */
+#if __GNUC_PREREQ (4, 3)
+# define __attribute_alloc_size__(params) \
+ __attribute__ ((__alloc_size__ params))
+#else
+# define __attribute_alloc_size__(params) /* Ignore. */
+#endif
+
+/* At some point during the gcc 2.96 development the `pure' attribute
+ for functions was introduced. We don't want to use it unconditionally
+ (although this would be possible) since it generates warnings. */
+#if __GNUC_PREREQ (2,96) || __glibc_clang_has_attribute (__pure__)
+# define __attribute_pure__ __attribute__ ((__pure__))
+#else
+# define __attribute_pure__ /* Ignore */
+#endif
+
+/* This declaration tells the compiler that the value is constant. */
+#if __GNUC_PREREQ (2,5) || __glibc_clang_has_attribute (__const__)
+# define __attribute_const__ __attribute__ ((__const__))
+#else
+# define __attribute_const__ /* Ignore */
+#endif
+
+/* At some point during the gcc 3.1 development the `used' attribute
+ for functions was introduced. We don't want to use it unconditionally
+ (although this would be possible) since it generates warnings. */
+#if __GNUC_PREREQ (3,1) || __glibc_clang_has_attribute (__used__)
+# define __attribute_used__ __attribute__ ((__used__))
+# define __attribute_noinline__ __attribute__ ((__noinline__))
+#else
+# define __attribute_used__ __attribute__ ((__unused__))
+# define __attribute_noinline__ /* Ignore */
+#endif
+
+/* Since version 3.2, gcc allows marking deprecated functions. */
+#if __GNUC_PREREQ (3,2) || __glibc_clang_has_attribute (__deprecated__)
+# define __attribute_deprecated__ __attribute__ ((__deprecated__))
+#else
+# define __attribute_deprecated__ /* Ignore */
+#endif
+
+/* Since version 4.5, gcc also allows one to specify the message printed
+ when a deprecated function is used. clang claims to be gcc 4.2, but
+ may also support this feature. */
+#if __GNUC_PREREQ (4,5) || \
+ __glibc_clang_has_extension (__attribute_deprecated_with_message__)
+# define __attribute_deprecated_msg__(msg) \
+ __attribute__ ((__deprecated__ (msg)))
+#else
+# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
+#endif
+
+/* At some point during the gcc 2.8 development the `format_arg' attribute
+ for functions was introduced. We don't want to use it unconditionally
+ (although this would be possible) since it generates warnings.
+ If several `format_arg' attributes are given for the same function, in
+ gcc-3.0 and older, all but the last one are ignored. In newer gccs,
+ all designated arguments are considered. */
+#if __GNUC_PREREQ (2,8) || __glibc_clang_has_attribute (__format_arg__)
+# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
+#else
+# define __attribute_format_arg__(x) /* Ignore */
+#endif
+
+/* At some point during the gcc 2.97 development the `strfmon' format
+ attribute for functions was introduced. We don't want to use it
+ unconditionally (although this would be possible) since it
+ generates warnings. */
+#if __GNUC_PREREQ (2,97) || __glibc_clang_has_attribute (__format__)
+# define __attribute_format_strfmon__(a,b) \
+ __attribute__ ((__format__ (__strfmon__, a, b)))
+#else
+# define __attribute_format_strfmon__(a,b) /* Ignore */
+#endif
+
+/* The nonnull function attribute marks pointer parameters that
+ must not be NULL. Do not define __nonnull if it is already defined,
+ for portability when this file is used in Gnulib. */
+#ifndef __nonnull
+# if __GNUC_PREREQ (3,3) || __glibc_clang_has_attribute (__nonnull__)
+# define __nonnull(params) __attribute__ ((__nonnull__ params))
+# else
+# define __nonnull(params)
+# endif
+#endif
+
+/* If fortification mode, we warn about unused results of certain
+ function calls which can lead to problems. */
+#if __GNUC_PREREQ (3,4) || __glibc_clang_has_attribute (__warn_unused_result__)
+# define __attribute_warn_unused_result__ \
+ __attribute__ ((__warn_unused_result__))
+# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
+# define __wur __attribute_warn_unused_result__
+# endif
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+#ifndef __wur
+# define __wur /* Ignore */
+#endif
+
+/* Forces a function to be always inlined. */
+#if __GNUC_PREREQ (3,2) || __glibc_clang_has_attribute (__always_inline__)
+/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
+ it conflicts with this definition. Therefore undefine it first to
+ allow either header to be included first. */
+# undef __always_inline
+# define __always_inline __inline __attribute__ ((__always_inline__))
+#else
+# undef __always_inline
+# define __always_inline __inline
+#endif
+
+/* Associate error messages with the source location of the call site rather
+ than with the source location inside the function. */
+#if __GNUC_PREREQ (4,3) || __glibc_clang_has_attribute (__artificial__)
+# define __attribute_artificial__ __attribute__ ((__artificial__))
+#else
+# define __attribute_artificial__ /* Ignore */
+#endif
+
+/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+ inline semantics, unless -fgnu89-inline is used. Using __GNUC_STDC_INLINE__
+ or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
+ older than 4.3 may define these macros and still not guarantee GNU inlining
+ semantics.
+
+ clang++ identifies itself as gcc-4.2, but has support for GNU inlining
+ semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and
+ __GNUC_GNU_INLINE__ macro definitions. */
+#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
+ || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
+ || defined __GNUC_GNU_INLINE__)))
+# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
+# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
+# define __extern_always_inline \
+ extern __always_inline __attribute__ ((__gnu_inline__))
+# else
+# define __extern_inline extern __inline
+# define __extern_always_inline extern __always_inline
+# endif
+#endif
+
+#ifdef __extern_always_inline
+# define __fortify_function __extern_always_inline __attribute_artificial__
+#endif
+
+/* GCC 4.3 and above allow passing all anonymous arguments of an
+ __extern_always_inline function to some other vararg function. */
+#if __GNUC_PREREQ (4,3)
+# define __va_arg_pack() __builtin_va_arg_pack ()
+# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
+#endif
+
+/* It is possible to compile containing GCC extensions even if GCC is
+ run in pedantic mode if the uses are carefully marked using the
+ `__extension__' keyword. But this is not generally available before
+ version 2.8. */
+#if !(__GNUC_PREREQ (2,8) || defined __clang__)
+# define __extension__ /* Ignore */
+#endif
+
+/* __restrict is known in EGCS 1.2 and above, and in clang.
+ It works also in C++ mode (outside of arrays), but only when spelled
+ as '__restrict', not 'restrict'. */
+#if !(__GNUC_PREREQ (2,92) || __clang_major__ >= 3)
+# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+# define __restrict restrict
+# else
+# define __restrict /* Ignore */
+# endif
+#endif
+
+/* ISO C99 also allows to declare arrays as non-overlapping. The syntax is
+ array_name[restrict]
+ GCC 3.1 and clang support this.
+ This syntax is not usable in C++ mode. */
+#if (__GNUC_PREREQ (3,1) || __clang_major__ >= 3) && !defined __cplusplus
+# define __restrict_arr __restrict
+#else
+# ifdef __GNUC__
+# define __restrict_arr /* Not supported in old GCC. */
+# else
+# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+# define __restrict_arr restrict
+# else
+/* Some other non-C99 compiler. */
+# define __restrict_arr /* Not supported. */
+# endif
+# endif
+#endif
+
+#if (__GNUC__ >= 3) || __glibc_clang_has_builtin (__builtin_expect)
+# define __glibc_unlikely(cond) __builtin_expect ((cond), 0)
+# define __glibc_likely(cond) __builtin_expect ((cond), 1)
+#else
+# define __glibc_unlikely(cond) (cond)
+# define __glibc_likely(cond) (cond)
+#endif
+
+#ifdef __has_attribute
+# define __glibc_has_attribute(attr) __has_attribute (attr)
+#else
+# define __glibc_has_attribute(attr) 0
+#endif
+
+#if (!defined _Noreturn \
+ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
+ && !(__GNUC_PREREQ (4,7) \
+ || (3 < __clang_major__ + (5 <= __clang_minor__))))
+# if __GNUC_PREREQ (2,8)
+# define _Noreturn __attribute__ ((__noreturn__))
+# else
+# define _Noreturn
+# endif
+#endif
+
+#if __GNUC_PREREQ (8, 0)
+/* Describes a char array whose address can safely be passed as the first
+ argument to strncpy and strncat, as the char array is not necessarily
+ a NUL-terminated string. */
+# define __attribute_nonstring__ __attribute__ ((__nonstring__))
+#else
+# define __attribute_nonstring__
+#endif
+
+#if (!defined _Static_assert && !defined __cplusplus \
+ && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
+ && (!(__GNUC_PREREQ (4, 6) || __clang_major__ >= 4) \
+ || defined __STRICT_ANSI__))
+# define _Static_assert(expr, diagnostic) \
+ extern int (*__Static_assert_function (void)) \
+ [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
+#endif
+
+/* The #ifndef lets Gnulib avoid including these on non-glibc
+ platforms, where the includes typically do not exist. */
+#ifndef __WORDSIZE
+# include <bits/wordsize.h>
+# include <bits/long-double.h>
+#endif
+
+#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
+# define __LDBL_COMPAT 1
+# ifdef __REDIRECT
+# define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
+# define __LDBL_REDIR(name, proto) \
+ __LDBL_REDIR1 (name, proto, __nldbl_##name)
+# define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
+# define __LDBL_REDIR_NTH(name, proto) \
+ __LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
+# define __LDBL_REDIR1_DECL(name, alias) \
+ extern __typeof (name) name __asm (__ASMNAME (#alias));
+# define __LDBL_REDIR_DECL(name) \
+ extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
+# define __REDIRECT_LDBL(name, proto, alias) \
+ __LDBL_REDIR1 (name, proto, __nldbl_##alias)
+# define __REDIRECT_NTH_LDBL(name, proto, alias) \
+ __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
+# endif
+#endif
+#if !defined __LDBL_COMPAT || !defined __REDIRECT
+# define __LDBL_REDIR1(name, proto, alias) name proto
+# define __LDBL_REDIR(name, proto) name proto
+# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
+# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
+# define __LDBL_REDIR_DECL(name)
+# ifdef __REDIRECT
+# define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
+# define __REDIRECT_NTH_LDBL(name, proto, alias) \
+ __REDIRECT_NTH (name, proto, alias)
+# endif
+#endif
+
+/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE. This is
+ intended for use in preprocessor macros.
+
+ Note: MESSAGE must be a _single_ string; concatenation of string
+ literals is not supported. */
+#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
+# define __glibc_macro_warning1(message) _Pragma (#message)
+# define __glibc_macro_warning(message) \
+ __glibc_macro_warning1 (GCC warning message)
+#else
+# define __glibc_macro_warning(msg)
+#endif
+
+/* Generic selection (ISO C11) is a C-only feature, available in GCC
+ since version 4.9. Previous versions do not provide generic
+ selection, even though they might set __STDC_VERSION__ to 201112L,
+ when in -std=c11 mode. Thus, we must check for !defined __GNUC__
+ when testing __STDC_VERSION__ for generic selection support.
+ On the other hand, Clang also defines __GNUC__, so a clang-specific
+ check is required to enable the use of generic selection. */
+#if !defined __cplusplus \
+ && (__GNUC_PREREQ (4, 9) \
+ || __glibc_clang_has_extension (c_generic_selections) \
+ || (!defined __GNUC__ && defined __STDC_VERSION__ \
+ && __STDC_VERSION__ >= 201112L))
+# define __HAVE_GENERIC_SELECTION 1
+#else
+# define __HAVE_GENERIC_SELECTION 0
+#endif
+
+#endif /* sys/cdefs.h */
diff --git a/lib/chdir-long.c b/lib/chdir-long.c
new file mode 100644
index 0000000..a38d38c
--- /dev/null
+++ b/lib/chdir-long.c
@@ -0,0 +1,264 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include "chdir-long.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "assure.h"
+
+#ifndef PATH_MAX
+# error "compile this file only if your system defines PATH_MAX"
+#endif
+
+/* The results of openat() in this file are not leaked to any
+ single-threaded code that could use stdio.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use openat_safer. */
+
+struct cd_buf
+{
+ int fd;
+};
+
+static void
+cdb_init (struct cd_buf *cdb)
+{
+ cdb->fd = AT_FDCWD;
+}
+
+static int
+cdb_fchdir (struct cd_buf const *cdb)
+{
+ return fchdir (cdb->fd);
+}
+
+static void
+cdb_free (struct cd_buf const *cdb)
+{
+ if (0 <= cdb->fd)
+ {
+ bool close_fail = close (cdb->fd);
+ assure (! close_fail);
+ }
+}
+
+/* Given a file descriptor of an open directory (or AT_FDCWD), CDB->fd,
+ try to open the CDB->fd-relative directory, DIR. If the open succeeds,
+ update CDB->fd with the resulting descriptor, close the incoming file
+ descriptor, and return zero. Upon failure, return -1 and set errno. */
+static int
+cdb_advance_fd (struct cd_buf *cdb, char const *dir)
+{
+ int new_fd = openat (cdb->fd, dir,
+ O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK);
+ if (new_fd < 0)
+ return -1;
+
+ cdb_free (cdb);
+ cdb->fd = new_fd;
+
+ return 0;
+}
+
+/* Return a pointer to the first non-slash in S. */
+static char * _GL_ATTRIBUTE_PURE
+find_non_slash (char const *s)
+{
+ size_t n_slash = strspn (s, "/");
+ return (char *) s + n_slash;
+}
+
+/* This is a function much like chdir, but without the PATH_MAX limitation
+ on the length of the directory name. A significant difference is that
+ it must be able to modify (albeit only temporarily) the directory
+ name. It handles an arbitrarily long directory name by operating
+ on manageable portions of the name. On systems without the openat
+ syscall, this means changing the working directory to more and more
+ "distant" points along the long directory name and then restoring
+ the working directory. If any of those attempts to save or restore
+ the working directory fails, this function exits nonzero.
+
+ Note that this function may still fail with errno == ENAMETOOLONG, but
+ only if the specified directory name contains a component that is long
+ enough to provoke such a failure all by itself (e.g. if the component
+ has length PATH_MAX or greater on systems that define PATH_MAX). */
+
+int
+chdir_long (char *dir)
+{
+ int e = chdir (dir);
+ if (e == 0 || errno != ENAMETOOLONG)
+ return e;
+
+ {
+ size_t len = strlen (dir);
+ char *dir_end = dir + len;
+ struct cd_buf cdb;
+ size_t n_leading_slash;
+
+ cdb_init (&cdb);
+
+ /* If DIR is the empty string, then the chdir above
+ must have failed and set errno to ENOENT. */
+ assure (0 < len);
+ assure (PATH_MAX <= len);
+
+ /* Count leading slashes. */
+ n_leading_slash = strspn (dir, "/");
+
+ /* Handle any leading slashes as well as any name that matches
+ the regular expression, m!^//hostname[/]*! . Handling this
+ prefix separately usually results in a single additional
+ cdb_advance_fd call, but it's worthwhile, since it makes the
+ code in the following loop cleaner. */
+ if (n_leading_slash == 2)
+ {
+ int err;
+ /* Find next slash.
+ We already know that dir[2] is neither a slash nor '\0'. */
+ char *slash = memchr (dir + 3, '/', dir_end - (dir + 3));
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ *slash = '\0';
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+ dir = find_non_slash (slash + 1);
+ }
+ else if (n_leading_slash)
+ {
+ if (cdb_advance_fd (&cdb, "/") != 0)
+ goto Fail;
+ dir += n_leading_slash;
+ }
+
+ assure (*dir != '/');
+ assure (dir <= dir_end);
+
+ while (PATH_MAX <= dir_end - dir)
+ {
+ int err;
+ /* Find a slash that is PATH_MAX or fewer bytes away from dir.
+ I.e. see if there is a slash that will give us a name of
+ length PATH_MAX-1 or less. */
+ char *slash = memrchr (dir, '/', PATH_MAX);
+ if (slash == NULL)
+ {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ *slash = '\0';
+ assure (slash - dir < PATH_MAX);
+ err = cdb_advance_fd (&cdb, dir);
+ *slash = '/';
+ if (err != 0)
+ goto Fail;
+
+ dir = find_non_slash (slash + 1);
+ }
+
+ if (dir < dir_end)
+ {
+ if (cdb_advance_fd (&cdb, dir) != 0)
+ goto Fail;
+ }
+
+ if (cdb_fchdir (&cdb) != 0)
+ goto Fail;
+
+ cdb_free (&cdb);
+ return 0;
+
+ Fail:
+ {
+ int saved_errno = errno;
+ cdb_free (&cdb);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+}
+
+#if TEST_CHDIR
+
+# include "closeout.h"
+# include "error.h"
+
+int
+main (int argc, char *argv[])
+{
+ char *line = NULL;
+ size_t n = 0;
+ int len;
+
+ atexit (close_stdout);
+
+ len = getline (&line, &n, stdin);
+ if (len < 0)
+ {
+ int saved_errno = errno;
+ if (feof (stdin))
+ exit (0);
+
+ error (EXIT_FAILURE, saved_errno,
+ "reading standard input");
+ }
+ else if (len == 0)
+ exit (0);
+
+ if (line[len-1] == '\n')
+ line[len-1] = '\0';
+
+ if (chdir_long (line) != 0)
+ error (EXIT_FAILURE, errno,
+ "chdir_long failed: %s", line);
+
+ if (argc <= 1)
+ {
+ /* Using 'pwd' here makes sense only if it is a robust implementation,
+ like the one in coreutils after the 2004-04-19 changes. */
+ char const *cmd = "pwd";
+ execlp (cmd, (char *) NULL);
+ error (EXIT_FAILURE, errno, "%s", cmd);
+ }
+
+ fclose (stdin);
+ fclose (stderr);
+
+ exit (EXIT_SUCCESS);
+}
+#endif
+
+/*
+Local Variables:
+compile-command: "gcc -DTEST_CHDIR=1 -g -O -W -Wall chdir-long.c libcoreutils.a"
+End:
+*/
diff --git a/lib/chdir-long.h b/lib/chdir-long.h
new file mode 100644
index 0000000..851222f
--- /dev/null
+++ b/lib/chdir-long.h
@@ -0,0 +1,30 @@
+/* provide a chdir function that tries not to fail due to ENAMETOOLONG
+ Copyright (C) 2004-2005, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <unistd.h>
+#include <limits.h>
+
+#include "pathmax.h"
+
+/* On systems without PATH_MAX, presume that chdir accepts
+ arbitrarily long directory names. */
+#ifndef PATH_MAX
+# define chdir_long(Dir) chdir (Dir)
+#else
+int chdir_long (char *dir);
+#endif
diff --git a/lib/cloexec.c b/lib/cloexec.c
new file mode 100644
index 0000000..510be3d
--- /dev/null
+++ b/lib/cloexec.c
@@ -0,0 +1,83 @@
+/* cloexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 1991, 2004-2006, 2009-2020 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/>.
+
+ The code is taken from glibc/manual/llio.texi */
+
+#include <config.h>
+
+#include "cloexec.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with 'errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int
+set_cloexec_flag (int desc, bool value)
+{
+#ifdef F_SETFD
+
+ int flags = fcntl (desc, F_GETFD, 0);
+
+ if (0 <= flags)
+ {
+ int newflags = (value ? flags | FD_CLOEXEC : flags & ~FD_CLOEXEC);
+
+ if (flags == newflags
+ || fcntl (desc, F_SETFD, newflags) != -1)
+ return 0;
+ }
+
+ return -1;
+
+#else /* !F_SETFD */
+
+ /* Use dup2 to reject invalid file descriptors; the cloexec flag
+ will be unaffected. */
+ if (desc < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (dup2 (desc, desc) < 0)
+ /* errno is EBADF here. */
+ return -1;
+
+ /* There is nothing we can do on this kind of platform. Punt. */
+ return 0;
+#endif /* !F_SETFD */
+}
+
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int
+dup_cloexec (int fd)
+{
+ return fcntl (fd, F_DUPFD_CLOEXEC, 0);
+}
diff --git a/lib/cloexec.h b/lib/cloexec.h
new file mode 100644
index 0000000..f14a997
--- /dev/null
+++ b/lib/cloexec.h
@@ -0,0 +1,38 @@
+/* cloexec.c - set or clear the close-on-exec descriptor flag
+
+ Copyright (C) 2004, 2009-2020 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/>.
+
+*/
+
+#include <stdbool.h>
+
+/* Set the 'FD_CLOEXEC' flag of DESC if VALUE is true,
+ or clear the flag if VALUE is false.
+ Return 0 on success, or -1 on error with 'errno' set.
+
+ Note that on MingW, this function does NOT protect DESC from being
+ inherited into spawned children. Instead, either use dup_cloexec
+ followed by closing the original DESC, or use interfaces such as
+ open or pipe2 that accept flags like O_CLOEXEC to create DESC
+ non-inheritable in the first place. */
+
+int set_cloexec_flag (int desc, bool value);
+
+/* Duplicates a file handle FD, while marking the copy to be closed
+ prior to exec or spawn. Returns -1 and sets errno if FD could not
+ be duplicated. */
+
+int dup_cloexec (int fd);
diff --git a/lib/close.c b/lib/close.c
new file mode 100644
index 0000000..32503c0
--- /dev/null
+++ b/lib/close.c
@@ -0,0 +1,75 @@
+/* close replacement.
+ Copyright (C) 2008-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#include "fd-hook.h"
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef close
+
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+close_nothrow (int fd)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _close (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define close_nothrow _close
+# endif
+#else
+# define close_nothrow close
+#endif
+
+/* Override close() to call into other gnulib modules. */
+
+int
+rpl_close (int fd)
+{
+#if WINDOWS_SOCKETS
+ int retval = execute_all_close_hooks (close_nothrow, fd);
+#else
+ int retval = close_nothrow (fd);
+#endif
+
+#if REPLACE_FCHDIR
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+#endif
+
+ return retval;
+}
diff --git a/lib/closedir.c b/lib/closedir.c
new file mode 100644
index 0000000..9afaa1f
--- /dev/null
+++ b/lib/closedir.c
@@ -0,0 +1,71 @@
+/* Stop reading the entries of a directory.
+ Copyright (C) 2006-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+#if HAVE_CLOSEDIR
+
+/* Override closedir(), to keep track of the open file descriptors.
+ Needed because there is a function dirfd(). */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+
+#endif
+
+int
+closedir (DIR *dirp)
+{
+# if REPLACE_FCHDIR || REPLACE_DIRFD
+ int fd = dirfd (dirp);
+# endif
+ int retval;
+
+#if HAVE_CLOSEDIR
+# undef closedir
+
+ retval = closedir (dirp);
+
+# ifdef __KLIBC__
+ if (!retval)
+ _gl_unregister_dirp_fd (fd);
+# endif
+#else
+
+ if (dirp->current != INVALID_HANDLE_VALUE)
+ FindClose (dirp->current);
+ free (dirp);
+
+ retval = 0;
+
+#endif
+
+#if REPLACE_FCHDIR
+ if (retval >= 0)
+ _gl_unregister_fd (fd);
+#endif
+ return retval;
+}
diff --git a/lib/concat-filename.c b/lib/concat-filename.c
new file mode 100644
index 0000000..367e41d
--- /dev/null
+++ b/lib/concat-filename.c
@@ -0,0 +1,73 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2006-2020 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 any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "concat-filename.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "filename.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. The directory may end with the directory separator. The second
+ argument may not start with the directory separator (it is relative).
+ Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+char *
+concatenated_filename (const char *directory, const char *filename,
+ const char *suffix)
+{
+ char *result;
+ char *p;
+
+ if (strcmp (directory, ".") == 0)
+ {
+ /* No need to prepend the directory. */
+ result = (char *) malloc (strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ p = result;
+ }
+ else
+ {
+ size_t directory_len = strlen (directory);
+ int need_slash =
+ (directory_len > FILE_SYSTEM_PREFIX_LEN (directory)
+ && !ISSLASH (directory[directory_len - 1]));
+ result = (char *) malloc (directory_len + need_slash
+ + strlen (filename)
+ + (suffix != NULL ? strlen (suffix) : 0)
+ + 1);
+ if (result == NULL)
+ return NULL; /* errno is set here */
+ memcpy (result, directory, directory_len);
+ p = result + directory_len;
+ if (need_slash)
+ *p++ = '/';
+ }
+ p = stpcpy (p, filename);
+ if (suffix != NULL)
+ stpcpy (p, suffix);
+ return result;
+}
diff --git a/lib/concat-filename.h b/lib/concat-filename.h
new file mode 100644
index 0000000..64b461e
--- /dev/null
+++ b/lib/concat-filename.h
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+ Copyright (C) 2001-2004, 2007-2020 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/>. */
+
+#ifndef _CONCAT_FILENAME_H
+#define _CONCAT_FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. Return NULL and set errno
+ upon memory allocation failure. */
+extern char *concatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+/* Concatenate a directory filename, a relative filename and an optional
+ suffix. Return a freshly allocated filename. */
+extern char *xconcatenated_filename (const char *directory,
+ const char *filename, const char *suffix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CONCAT_FILENAME_H */
diff --git a/lib/connect.c b/lib/connect.c
new file mode 100644
index 0000000..aaf36c8
--- /dev/null
+++ b/lib/connect.c
@@ -0,0 +1,56 @@
+/* connect.c --- wrappers for Windows connect function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef connect
+
+int
+rpl_connect (int fd, const struct sockaddr *sockaddr, socklen_t len)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = connect (sock, sockaddr, len);
+ if (r < 0)
+ {
+ /* EINPROGRESS is not returned by WinSock 2.0; for backwards
+ compatibility, connect(2) uses EWOULDBLOCK. */
+ if (WSAGetLastError () == WSAEWOULDBLOCK)
+ WSASetLastError (WSAEINPROGRESS);
+
+ set_winsock_errno ();
+ }
+
+ return r;
+ }
+}
diff --git a/lib/ctype.in.h b/lib/ctype.in.h
new file mode 100644
index 0000000..555677a
--- /dev/null
+++ b/lib/ctype.in.h
@@ -0,0 +1,57 @@
+/* A substitute for ISO C99 <ctype.h>, for platforms on which it is incomplete.
+
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible. */
+
+/*
+ * ISO C 99 <ctype.h> for platforms on which it is incomplete.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ctype.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_CTYPE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Include the original <ctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_CTYPE_H@
+
+#ifndef _@GUARD_PREFIX@_CTYPE_H
+#define _@GUARD_PREFIX@_CTYPE_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Return non-zero if c is a blank, i.e. a space or tab character. */
+#if @GNULIB_ISBLANK@
+# if !@HAVE_ISBLANK@
+_GL_EXTERN_C int isblank (int c);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef isblank
+# if HAVE_RAW_DECL_ISBLANK
+_GL_WARN_ON_USE (isblank, "isblank is unportable - "
+ "use gnulib module isblank for portability");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_CTYPE_H */
+#endif /* _@GUARD_PREFIX@_CTYPE_H */
diff --git a/lib/dirent-private.h b/lib/dirent-private.h
new file mode 100644
index 0000000..a3c6844
--- /dev/null
+++ b/lib/dirent-private.h
@@ -0,0 +1,44 @@
+/* Private details of the DIR type.
+ Copyright (C) 2011-2020 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/>. */
+
+#ifndef _DIRENT_PRIVATE_H
+#define _DIRENT_PRIVATE_H 1
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* Don't assume that UNICODE is not defined. */
+#undef WIN32_FIND_DATA
+#define WIN32_FIND_DATA WIN32_FIND_DATAA
+
+struct gl_directory
+{
+ /* Status, or error code to produce in next readdir() call.
+ -2 means the end of the directory is already reached,
+ -1 means the entry was already filled by FindFirstFile,
+ 0 means the entry needs to be filled using FindNextFile.
+ A positive value is an error code. */
+ int status;
+ /* Handle, reading the directory, at current position. */
+ HANDLE current;
+ /* Found directory entry. */
+ WIN32_FIND_DATA entry;
+ /* Argument to pass to FindFirstFile. It consists of the absolutized
+ directory name, followed by a directory separator and the wildcards. */
+ char dir_name_mask[1];
+};
+
+#endif /* _DIRENT_PRIVATE_H */
diff --git a/lib/dirent.in.h b/lib/dirent.in.h
new file mode 100644
index 0000000..23c4e05
--- /dev/null
+++ b/lib/dirent.in.h
@@ -0,0 +1,269 @@
+/* A GNU-like <dirent.h>.
+ Copyright (C) 2006-2020 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/>. */
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_DIRENT_H@
+# @INCLUDE_NEXT@ @NEXT_DIRENT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_DIRENT_H
+#define _@GUARD_PREFIX@_DIRENT_H
+
+/* Get ino_t. Needed on some systems, including glibc 2.8. */
+#include <sys/types.h>
+
+#if !@HAVE_DIRENT_H@
+/* Define types DIR and 'struct dirent'. */
+# if !GNULIB_defined_struct_dirent
+struct dirent
+{
+ char d_type;
+ char d_name[1];
+};
+/* Possible values for 'd_type'. */
+# define DT_UNKNOWN 0
+# define DT_FIFO 1 /* FIFO */
+# define DT_CHR 2 /* character device */
+# define DT_DIR 4 /* directory */
+# define DT_BLK 6 /* block device */
+# define DT_REG 8 /* regular file */
+# define DT_LNK 10 /* symbolic link */
+# define DT_SOCK 12 /* socket */
+# define DT_WHT 14 /* whiteout */
+typedef struct gl_directory DIR;
+# define GNULIB_defined_struct_dirent 1
+# endif
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_OPENDIR@
+# if @REPLACE_OPENDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef opendir
+# define opendir rpl_opendir
+# define GNULIB_defined_opendir 1
+# endif
+_GL_FUNCDECL_RPL (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (opendir, DIR *, (const char *dir_name));
+# else
+# if !@HAVE_OPENDIR@
+_GL_FUNCDECL_SYS (opendir, DIR *, (const char *dir_name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (opendir, DIR *, (const char *dir_name));
+# endif
+_GL_CXXALIASWARN (opendir);
+#elif defined GNULIB_POSIXCHECK
+# undef opendir
+# if HAVE_RAW_DECL_OPENDIR
+_GL_WARN_ON_USE (opendir, "opendir is not portable - "
+ "use gnulib module opendir for portability");
+# endif
+#endif
+
+#if @GNULIB_READDIR@
+# if !@HAVE_READDIR@
+_GL_FUNCDECL_SYS (readdir, struct dirent *, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (readdir, struct dirent *, (DIR *dirp));
+_GL_CXXALIASWARN (readdir);
+#elif defined GNULIB_POSIXCHECK
+# undef readdir
+# if HAVE_RAW_DECL_READDIR
+_GL_WARN_ON_USE (readdir, "readdir is not portable - "
+ "use gnulib module readdir for portability");
+# endif
+#endif
+
+#if @GNULIB_REWINDDIR@
+# if !@HAVE_REWINDDIR@
+_GL_FUNCDECL_SYS (rewinddir, void, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rewinddir, void, (DIR *dirp));
+_GL_CXXALIASWARN (rewinddir);
+#elif defined GNULIB_POSIXCHECK
+# undef rewinddir
+# if HAVE_RAW_DECL_REWINDDIR
+_GL_WARN_ON_USE (rewinddir, "rewinddir is not portable - "
+ "use gnulib module rewinddir for portability");
+# endif
+#endif
+
+#if @GNULIB_CLOSEDIR@
+# if @REPLACE_CLOSEDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef closedir
+# define closedir rpl_closedir
+# define GNULIB_defined_closedir 1
+# endif
+_GL_FUNCDECL_RPL (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (closedir, int, (DIR *dirp));
+# else
+# if !@HAVE_CLOSEDIR@
+_GL_FUNCDECL_SYS (closedir, int, (DIR *dirp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (closedir, int, (DIR *dirp));
+# endif
+_GL_CXXALIASWARN (closedir);
+#elif defined GNULIB_POSIXCHECK
+# undef closedir
+# if HAVE_RAW_DECL_CLOSEDIR
+_GL_WARN_ON_USE (closedir, "closedir is not portable - "
+ "use gnulib module closedir for portability");
+# endif
+#endif
+
+#if @GNULIB_DIRFD@
+/* Return the file descriptor associated with the given directory stream,
+ or -1 if none exists. */
+# if @REPLACE_DIRFD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dirfd
+# define dirfd rpl_dirfd
+# endif
+_GL_FUNCDECL_RPL (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (dirfd, int, (DIR *));
+
+# ifdef __KLIBC__
+/* Gnulib internal hooks needed to maintain the dirfd metadata. */
+_GL_EXTERN_C int _gl_register_dirp_fd (int fd, DIR *dirp)
+ _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_dirp_fd (int fd);
+# endif
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined dirfd
+ /* dirfd is defined as a macro and not as a function.
+ Turn it into a function and get rid of the macro. */
+static inline int (dirfd) (DIR *dp) { return dirfd (dp); }
+# undef dirfd
+# endif
+# if !(@HAVE_DECL_DIRFD@ || defined dirfd)
+_GL_FUNCDECL_SYS (dirfd, int, (DIR *) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (dirfd, int, (DIR *));
+# endif
+_GL_CXXALIASWARN (dirfd);
+#elif defined GNULIB_POSIXCHECK
+# undef dirfd
+# if HAVE_RAW_DECL_DIRFD
+_GL_WARN_ON_USE (dirfd, "dirfd is unportable - "
+ "use gnulib module dirfd for portability");
+# endif
+#endif
+
+#if @GNULIB_FDOPENDIR@
+/* Open a directory stream visiting the given directory file
+ descriptor. Return NULL and set errno if fd is not visiting a
+ directory. On success, this function consumes fd (it will be
+ implicitly closed either by this function or by a subsequent
+ closedir). */
+# if @REPLACE_FDOPENDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopendir
+# define fdopendir rpl_fdopendir
+# endif
+_GL_FUNCDECL_RPL (fdopendir, DIR *, (int fd));
+_GL_CXXALIAS_RPL (fdopendir, DIR *, (int fd));
+# else
+# if !@HAVE_FDOPENDIR@ || !@HAVE_DECL_FDOPENDIR@
+_GL_FUNCDECL_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdopendir, DIR *, (int fd));
+# endif
+_GL_CXXALIASWARN (fdopendir);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopendir
+# if HAVE_RAW_DECL_FDOPENDIR
+_GL_WARN_ON_USE (fdopendir, "fdopendir is unportable - "
+ "use gnulib module fdopendir for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANDIR@
+/* Scan the directory DIR, calling FILTER on each directory entry.
+ Entries for which FILTER returns nonzero are individually malloc'd,
+ sorted using qsort with CMP, and collected in a malloc'd array in
+ *NAMELIST. Returns the number of entries selected, or -1 on error. */
+# if !@HAVE_SCANDIR@
+_GL_FUNCDECL_SYS (scandir, int,
+ (const char *dir, struct dirent ***namelist,
+ int (*filter) (const struct dirent *),
+ int (*cmp) (const struct dirent **, const struct dirent **))
+ _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+/* Need to cast, because on glibc systems, the fourth parameter is
+ int (*cmp) (const void *, const void *). */
+_GL_CXXALIAS_SYS_CAST (scandir, int,
+ (const char *dir, struct dirent ***namelist,
+ int (*filter) (const struct dirent *),
+ int (*cmp) (const struct dirent **, const struct dirent **)));
+_GL_CXXALIASWARN (scandir);
+#elif defined GNULIB_POSIXCHECK
+# undef scandir
+# if HAVE_RAW_DECL_SCANDIR
+_GL_WARN_ON_USE (scandir, "scandir is unportable - "
+ "use gnulib module scandir for portability");
+# endif
+#endif
+
+#if @GNULIB_ALPHASORT@
+/* Compare two 'struct dirent' entries alphabetically. */
+# if !@HAVE_ALPHASORT@
+_GL_FUNCDECL_SYS (alphasort, int,
+ (const struct dirent **, const struct dirent **)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on glibc systems, the parameters are
+ (const void *, const void *). */
+_GL_CXXALIAS_SYS_CAST (alphasort, int,
+ (const struct dirent **, const struct dirent **));
+_GL_CXXALIASWARN (alphasort);
+#elif defined GNULIB_POSIXCHECK
+# undef alphasort
+# if HAVE_RAW_DECL_ALPHASORT
+_GL_WARN_ON_USE (alphasort, "alphasort is unportable - "
+ "use gnulib module alphasort for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
+#endif /* _@GUARD_PREFIX@_DIRENT_H */
diff --git a/lib/dirfd.c b/lib/dirfd.c
new file mode 100644
index 0000000..f653977
--- /dev/null
+++ b/lib/dirfd.c
@@ -0,0 +1,98 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+ Copyright (C) 2001, 2006, 2008-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include <dirent.h>
+#include <errno.h>
+
+#ifdef __KLIBC__
+# include <stdlib.h>
+# include <io.h>
+
+static struct dirp_fd_list
+{
+ DIR *dirp;
+ int fd;
+ struct dirp_fd_list *next;
+} *dirp_fd_start = NULL;
+
+/* Register fd associated with dirp to dirp_fd_list. */
+int
+_gl_register_dirp_fd (int fd, DIR *dirp)
+{
+ struct dirp_fd_list *new_dirp_fd = malloc (sizeof *new_dirp_fd);
+ if (!new_dirp_fd)
+ return -1;
+
+ new_dirp_fd->dirp = dirp;
+ new_dirp_fd->fd = fd;
+ new_dirp_fd->next = dirp_fd_start;
+
+ dirp_fd_start = new_dirp_fd;
+
+ return 0;
+}
+
+/* Unregister fd from dirp_fd_list with closing it */
+void
+_gl_unregister_dirp_fd (int fd)
+{
+ struct dirp_fd_list *dirp_fd;
+ struct dirp_fd_list *dirp_fd_prev;
+
+ for (dirp_fd_prev = NULL, dirp_fd = dirp_fd_start; dirp_fd;
+ dirp_fd_prev = dirp_fd, dirp_fd = dirp_fd->next)
+ {
+ if (dirp_fd->fd == fd)
+ {
+ if (dirp_fd_prev)
+ dirp_fd_prev->next = dirp_fd->next;
+ else /* dirp_fd == dirp_fd_start */
+ dirp_fd_start = dirp_fd_start->next;
+
+ close (fd);
+ free (dirp_fd);
+ break;
+ }
+ }
+}
+#endif
+
+int
+dirfd (DIR *dir_p)
+{
+ int fd = DIR_TO_FD (dir_p);
+ if (fd == -1)
+#ifndef __KLIBC__
+ errno = ENOTSUP;
+#else
+ {
+ struct dirp_fd_list *dirp_fd;
+
+ for (dirp_fd = dirp_fd_start; dirp_fd; dirp_fd = dirp_fd->next)
+ if (dirp_fd->dirp == dir_p)
+ return dirp_fd->fd;
+
+ errno = EINVAL;
+ }
+#endif
+
+ return fd;
+}
diff --git a/lib/dirname-lgpl.c b/lib/dirname-lgpl.c
new file mode 100644
index 0000000..27d4374
--- /dev/null
+++ b/lib/dirname-lgpl.c
@@ -0,0 +1,86 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Return the length of the prefix of FILE that will be used by
+ dir_name. If FILE is in the working directory, this returns zero
+ even though 'dir_name (FILE)' will return ".". Works properly even
+ if there are trailing slashes (by effectively ignoring them). */
+
+size_t
+dir_len (char const *file)
+{
+ size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
+ size_t length;
+
+ /* Advance prefix_length beyond important leading slashes. */
+ prefix_length += (prefix_length != 0
+ ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && ISSLASH (file[prefix_length]))
+ : (ISSLASH (file[0])
+ ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT
+ && ISSLASH (file[1]) && ! ISSLASH (file[2])
+ ? 2 : 1))
+ : 0));
+
+ /* Strip the basename and any redundant slashes before it. */
+ for (length = last_component (file) - file;
+ prefix_length < length; length--)
+ if (! ISSLASH (file[length - 1]))
+ break;
+ return length;
+}
+
+
+/* In general, we can't use the builtin 'dirname' function if available,
+ since it has different meanings in different environments.
+ In some environments the builtin 'dirname' modifies its argument.
+
+ Return the leading directories part of FILE, allocated with malloc.
+ Works properly even if there are trailing slashes (by effectively
+ ignoring them). Return NULL on failure.
+
+ If lstat (FILE) would succeed, then { chdir (dir_name (FILE));
+ lstat (base_name (FILE)); } will access the same file. Likewise,
+ if the sequence { chdir (dir_name (FILE));
+ rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE
+ to "foo" in the same directory FILE was in. */
+
+char *
+mdir_name (char const *file)
+{
+ size_t length = dir_len (file);
+ bool append_dot = (length == 0
+ || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ && length == FILE_SYSTEM_PREFIX_LEN (file)
+ && file[2] != '\0' && ! ISSLASH (file[2])));
+ char *dir = malloc (length + append_dot + 1);
+ if (!dir)
+ return NULL;
+ memcpy (dir, file, length);
+ if (append_dot)
+ dir[length++] = '.';
+ dir[length] = '\0';
+ return dir;
+}
diff --git a/lib/dirname.c b/lib/dirname.c
new file mode 100644
index 0000000..dc1997c
--- /dev/null
+++ b/lib/dirname.c
@@ -0,0 +1,38 @@
+/* dirname.c -- return all but the last element in a file name
+
+ Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include "xalloc.h"
+
+/* Just like mdir_name (dirname-lgpl.c), except, rather than
+ returning NULL upon malloc failure, here, we report the
+ "memory exhausted" condition and exit. */
+
+char *
+dir_name (char const *file)
+{
+ char *result = mdir_name (file);
+ if (!result)
+ xalloc_die ();
+ return result;
+}
diff --git a/lib/dirname.h b/lib/dirname.h
new file mode 100644
index 0000000..b2a91fd
--- /dev/null
+++ b/lib/dirname.h
@@ -0,0 +1,49 @@
+/* Take file names apart into directory and base names.
+
+ Copyright (C) 1998, 2001, 2003-2006, 2009-2020 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/>. */
+
+#ifndef DIRNAME_H_
+# define DIRNAME_H_ 1
+
+# include <stdbool.h>
+# include <stddef.h>
+# include "filename.h"
+# include "basename-lgpl.h"
+
+# ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+# endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+# if GNULIB_DIRNAME
+char *base_name (char const *file) _GL_ATTRIBUTE_MALLOC;
+char *dir_name (char const *file);
+# endif
+
+char *mdir_name (char const *file);
+size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
+
+bool strip_trailing_slashes (char *file);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* not DIRNAME_H_ */
diff --git a/lib/dup-safer-flag.c b/lib/dup-safer-flag.c
new file mode 100644
index 0000000..b2c345e
--- /dev/null
+++ b/lib/dup-safer-flag.c
@@ -0,0 +1,38 @@
+/* Duplicate a file descriptor result, avoiding clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2001, 2004-2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. If FLAG contains O_CLOEXEC, behave like
+ fcntl(F_DUPFD_CLOEXEC) rather than fcntl(F_DUPFD). */
+
+int
+dup_safer_flag (int fd, int flag)
+{
+ return fcntl (fd, (flag & O_CLOEXEC) ? F_DUPFD_CLOEXEC : F_DUPFD,
+ STDERR_FILENO + 1);
+}
diff --git a/lib/dup-safer.c b/lib/dup-safer.c
new file mode 100644
index 0000000..4ada3fe
--- /dev/null
+++ b/lib/dup-safer.c
@@ -0,0 +1,34 @@
+/* Invoke dup, but avoid some glitches.
+
+ Copyright (C) 2001, 2004-2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
+ STDERR_FILENO. */
+
+int
+dup_safer (int fd)
+{
+ return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
+}
diff --git a/lib/dup.c b/lib/dup.c
new file mode 100644
index 0000000..0e38348
--- /dev/null
+++ b/lib/dup.c
@@ -0,0 +1,92 @@
+/* Duplicate an open file descriptor.
+
+ Copyright (C) 2011-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef dup
+
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+dup_nothrow (int fd)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _dup (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define dup_nothrow _dup
+# endif
+#elif defined __KLIBC__
+# include <fcntl.h>
+# include <sys/stat.h>
+
+# include <InnoTekLIBC/backend.h>
+
+static int
+dup_nothrow (int fd)
+{
+ int dupfd;
+ struct stat sbuf;
+
+ dupfd = dup (fd);
+ if (dupfd == -1 && errno == ENOTSUP \
+ && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+ {
+ char path[_MAX_PATH];
+
+ /* Get a path from fd */
+ if (!__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+ dupfd = open (path, O_RDONLY);
+ }
+
+ return dupfd;
+}
+#else
+# define dup_nothrow dup
+#endif
+
+int
+rpl_dup (int fd)
+{
+ int result = dup_nothrow (fd);
+#if REPLACE_FCHDIR
+ if (result >= 0)
+ result = _gl_register_dup (fd, result);
+#endif
+ return result;
+}
diff --git a/lib/dup2.c b/lib/dup2.c
new file mode 100644
index 0000000..323e19b
--- /dev/null
+++ b/lib/dup2.c
@@ -0,0 +1,189 @@
+/* Duplicate an open file descriptor to a specified file descriptor.
+
+ Copyright (C) 1999, 2004-2007, 2009-2020 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/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#undef dup2
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Get declarations of the native Windows API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+# endif
+
+/* Get _get_osfhandle. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+dup2_nothrow (int fd, int desired_fd)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _dup2 (fd, desired_fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ errno = EBADF;
+ result = -1;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define dup2_nothrow _dup2
+# endif
+
+static int
+ms_windows_dup2 (int fd, int desired_fd)
+{
+ int result;
+
+ /* If fd is closed, mingw hangs on dup2 (fd, fd). If fd is open,
+ dup2 (fd, fd) returns 0, but all further attempts to use fd in
+ future dup2 calls will hang. */
+ if (fd == desired_fd)
+ {
+ if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ return fd;
+ }
+
+ /* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
+ https://bugs.winehq.org/show_bug.cgi?id=21289 */
+ if (desired_fd < 0)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ result = dup2_nothrow (fd, desired_fd);
+
+ if (result == 0)
+ result = desired_fd;
+
+ return result;
+}
+
+# define dup2 ms_windows_dup2
+
+#elif defined __KLIBC__
+
+# include <InnoTekLIBC/backend.h>
+
+static int
+klibc_dup2dirfd (int fd, int desired_fd)
+{
+ int tempfd;
+ int dupfd;
+
+ tempfd = open ("NUL", O_RDONLY);
+ if (tempfd == -1)
+ return -1;
+
+ if (tempfd == desired_fd)
+ {
+ close (tempfd);
+
+ char path[_MAX_PATH];
+ if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+ return -1;
+
+ return open(path, O_RDONLY);
+ }
+
+ dupfd = klibc_dup2dirfd (fd, desired_fd);
+
+ close (tempfd);
+
+ return dupfd;
+}
+
+static int
+klibc_dup2 (int fd, int desired_fd)
+{
+ int dupfd;
+ struct stat sbuf;
+
+ dupfd = dup2 (fd, desired_fd);
+ if (dupfd == -1 && errno == ENOTSUP \
+ && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+ {
+ close (desired_fd);
+
+ return klibc_dup2dirfd (fd, desired_fd);
+ }
+
+ return dupfd;
+}
+
+# define dup2 klibc_dup2
+#endif
+
+int
+rpl_dup2 (int fd, int desired_fd)
+{
+ int result;
+
+#ifdef F_GETFL
+ /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
+ On Cygwin 1.5.x, dup2 (1, 1) returns 0.
+ On Cygwin 1.7.17, dup2 (1, -1) dumps core.
+ On Cygwin 1.7.25, dup2 (1, 256) can dump core.
+ On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC. */
+# if HAVE_SETDTABLESIZE
+ setdtablesize (desired_fd + 1);
+# endif
+ if (desired_fd < 0)
+ fd = desired_fd;
+ if (fd == desired_fd)
+ return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
+#endif
+
+ result = dup2 (fd, desired_fd);
+
+ /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x. */
+ if (result == -1 && errno == EMFILE)
+ errno = EBADF;
+#if REPLACE_FCHDIR
+ if (fd != desired_fd && result != -1)
+ result = _gl_register_dup (fd, result);
+#endif
+ return result;
+}
diff --git a/lib/errno.in.h b/lib/errno.in.h
new file mode 100644
index 0000000..c27e0c7
--- /dev/null
+++ b/lib/errno.in.h
@@ -0,0 +1,279 @@
+/* A POSIX-like <errno.h>.
+
+ Copyright (C) 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+#define _@GUARD_PREFIX@_ERRNO_H
+
+
+/* On native Windows platforms, many macros are not defined. */
+# if defined _WIN32 && ! defined __CYGWIN__
+
+/* These are the same values as defined by MSVC 10, for interoperability. */
+
+# ifndef ENOMSG
+# define ENOMSG 122
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 111
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 121
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 134
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 104
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 132
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 129
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 117
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 106
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 105
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+# ifndef EOWNERDEAD
+# define EOWNERDEAD 133
+# define GNULIB_defined_EOWNERDEAD 1
+# endif
+
+# ifndef ENOTRECOVERABLE
+# define ENOTRECOVERABLE 127
+# define GNULIB_defined_ENOTRECOVERABLE 1
+# endif
+
+# ifndef EINPROGRESS
+# define EINPROGRESS 112
+# define EALREADY 103
+# define ENOTSOCK 128
+# define EDESTADDRREQ 109
+# define EMSGSIZE 115
+# define EPROTOTYPE 136
+# define ENOPROTOOPT 123
+# define EPROTONOSUPPORT 135
+# define EOPNOTSUPP 130
+# define EAFNOSUPPORT 102
+# define EADDRINUSE 100
+# define EADDRNOTAVAIL 101
+# define ENETDOWN 116
+# define ENETUNREACH 118
+# define ECONNRESET 108
+# define ENOBUFS 119
+# define EISCONN 113
+# define ENOTCONN 126
+# define ETIMEDOUT 138
+# define ECONNREFUSED 107
+# define ELOOP 114
+# define EHOSTUNREACH 110
+# define EWOULDBLOCK 140
+# define GNULIB_defined_ESOCK 1
+# endif
+
+# ifndef ETXTBSY
+# define ETXTBSY 139
+# define ENODATA 120 /* not required by POSIX */
+# define ENOSR 124 /* not required by POSIX */
+# define ENOSTR 125 /* not required by POSIX */
+# define ETIME 137 /* not required by POSIX */
+# define EOTHER 131 /* not required by POSIX */
+# define GNULIB_defined_ESTREAMS 1
+# endif
+
+/* These are intentionally the same values as the WSA* error numbers, defined
+ in <winsock2.h>. */
+# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
+# define EPFNOSUPPORT 10046 /* not required by POSIX */
+# define ESHUTDOWN 10058 /* not required by POSIX */
+# define ETOOMANYREFS 10059 /* not required by POSIX */
+# define EHOSTDOWN 10064 /* not required by POSIX */
+# define EPROCLIM 10067 /* not required by POSIX */
+# define EUSERS 10068 /* not required by POSIX */
+# define EDQUOT 10069
+# define ESTALE 10070
+# define EREMOTE 10071 /* not required by POSIX */
+# define GNULIB_defined_EWINSOCK 1
+
+# endif
+
+
+/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
+ EMULTIHOP, ENOLINK, EOVERFLOW are not defined. */
+# if @EMULTIHOP_HIDDEN@
+# define EMULTIHOP @EMULTIHOP_VALUE@
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+# if @ENOLINK_HIDDEN@
+# define ENOLINK @ENOLINK_VALUE@
+# define GNULIB_defined_ENOLINK 1
+# endif
+# if @EOVERFLOW_HIDDEN@
+# define EOVERFLOW @EOVERFLOW_VALUE@
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+
+/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
+ EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
+ Likewise, on NonStop Kernel, EDQUOT is not defined.
+ Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
+ HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
+
+ Note: When one of these systems defines some of these macros some day,
+ binaries will have to be recompiled so that they recognizes the new
+ errno values from the system. */
+
+# ifndef ENOMSG
+# define ENOMSG 2000
+# define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+# define EIDRM 2001
+# define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+# define ENOLINK 2002
+# define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+# define EPROTO 2003
+# define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EMULTIHOP
+# define EMULTIHOP 2004
+# define GNULIB_defined_EMULTIHOP 1
+# endif
+
+# ifndef EBADMSG
+# define EBADMSG 2005
+# define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+# define EOVERFLOW 2006
+# define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+# define ENOTSUP 2007
+# define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+# define ENETRESET 2011
+# define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+# define ECONNABORTED 2012
+# define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ESTALE
+# define ESTALE 2009
+# define GNULIB_defined_ESTALE 1
+# endif
+
+# ifndef EDQUOT
+# define EDQUOT 2010
+# define GNULIB_defined_EDQUOT 1
+# endif
+
+# ifndef ECANCELED
+# define ECANCELED 2008
+# define GNULIB_defined_ECANCELED 1
+# endif
+
+/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
+ defined. */
+
+# ifndef EOWNERDEAD
+# if defined __sun
+ /* Use the same values as defined for Solaris >= 8, for
+ interoperability. */
+# define EOWNERDEAD 58
+# define ENOTRECOVERABLE 59
+# elif defined _WIN32 && ! defined __CYGWIN__
+ /* We have a conflict here: pthreads-win32 defines these values
+ differently than MSVC 10. It's hairy to decide which one to use. */
+# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
+ /* Use the same values as defined by pthreads-win32, for
+ interoperability. */
+# define EOWNERDEAD 43
+# define ENOTRECOVERABLE 44
+# else
+ /* Use the same values as defined by MSVC 10, for
+ interoperability. */
+# define EOWNERDEAD 133
+# define ENOTRECOVERABLE 127
+# endif
+# else
+# define EOWNERDEAD 2013
+# define ENOTRECOVERABLE 2014
+# endif
+# define GNULIB_defined_EOWNERDEAD 1
+# define GNULIB_defined_ENOTRECOVERABLE 1
+# endif
+
+# ifndef EILSEQ
+# define EILSEQ 2015
+# define GNULIB_defined_EILSEQ 1
+# endif
+
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
diff --git a/lib/error.c b/lib/error.c
new file mode 100644
index 0000000..2fc7901
--- /dev/null
+++ b/lib/error.c
@@ -0,0 +1,411 @@
+/* Error handler for noninteractive utilities
+ Copyright (C) 1990-1998, 2000-2007, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include "error.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC && ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <wchar.h>
+# define mbsrtowcs __mbsrtowcs
+# define USE_UNLOCKED_IO 0
+# define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(a, b)
+# define _GL_ARG_NONNULL(a)
+#else
+# include "getprogname.h"
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+void (*error_print_progname) (void);
+
+/* This variable is incremented each time 'error' is called. */
+unsigned int error_message_count;
+
+#ifdef _LIBC
+/* In the GNU C library, there is a predefined variable for this. */
+
+# define program_name program_invocation_name
+# include <errno.h>
+# include <limits.h>
+# include <libio/libioP.h>
+
+/* In GNU libc we want do not want to use the common name 'error' directly.
+ Instead make it a weak alias. */
+extern void __error (int status, int errnum, const char *message, ...)
+ __attribute__ ((__format__ (__printf__, 3, 4)));
+extern void __error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message,
+ ...)
+ __attribute__ ((__format__ (__printf__, 5, 6)));
+# define error __error
+# define error_at_line __error_at_line
+
+# include <libio/iolibio.h>
+# define fflush(s) _IO_fflush (s)
+# undef putc
+# define putc(c, fp) _IO_putc (c, fp)
+
+# include <bits/libc-lock.h>
+
+#else /* not _LIBC */
+
+# include <fcntl.h>
+# include <unistd.h>
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Get declarations of the native Windows API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* Get _get_osfhandle. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+# endif
+
+/* The gnulib override of fcntl is not needed in this file. */
+# undef fcntl
+
+# if !(GNULIB_STRERROR_R_POSIX || HAVE_DECL_STRERROR_R)
+# ifndef HAVE_DECL_STRERROR_R
+"this configure-time declaration test was not run"
+# endif
+# if STRERROR_R_CHAR_P
+char *strerror_r (int errnum, char *buf, size_t buflen);
+# else
+int strerror_r (int errnum, char *buf, size_t buflen);
+# endif
+# endif
+
+# define program_name getprogname ()
+
+# if GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r
+# define __strerror_r strerror_r
+# endif /* GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r */
+#endif /* not _LIBC */
+
+#if !_LIBC
+/* Return non-zero if FD is open. */
+static int
+is_open (int fd)
+{
+# if defined _WIN32 && ! defined __CYGWIN__
+ /* On native Windows: The initial state of unassigned standard file
+ descriptors is that they are open but point to an INVALID_HANDLE_VALUE.
+ There is no fcntl, and the gnulib replacement fcntl does not support
+ F_GETFL. */
+ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+# else
+# ifndef F_GETFL
+# error Please port fcntl to your platform
+# endif
+ return 0 <= fcntl (fd, F_GETFL);
+# endif
+}
+#endif
+
+static void
+flush_stdout (void)
+{
+#if !_LIBC
+ int stdout_fd;
+
+# if GNULIB_FREOPEN_SAFER
+ /* Use of gnulib's freopen-safer module normally ensures that
+ fileno (stdout) == 1
+ whenever stdout is open. */
+ stdout_fd = STDOUT_FILENO;
+# else
+ /* POSIX states that fileno (stdout) after fclose is unspecified. But in
+ practice it is not a problem, because stdout is statically allocated and
+ the fd of a FILE stream is stored as a field in its allocated memory. */
+ stdout_fd = fileno (stdout);
+# endif
+ /* POSIX states that fflush (stdout) after fclose is unspecified; it
+ is safe in glibc, but not on all other platforms. fflush (NULL)
+ is always defined, but too draconian. */
+ if (0 <= stdout_fd && is_open (stdout_fd))
+#endif
+ fflush (stdout);
+}
+
+static void
+print_errno_message (int errnum)
+{
+ char const *s;
+
+#if _LIBC || GNULIB_STRERROR_R_POSIX || defined HAVE_STRERROR_R
+ char errbuf[1024];
+# if _LIBC || (!GNULIB_STRERROR_R_POSIX && STRERROR_R_CHAR_P)
+ s = __strerror_r (errnum, errbuf, sizeof errbuf);
+# else
+ if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
+ s = errbuf;
+ else
+ s = 0;
+# endif
+#else
+ s = strerror (errnum);
+#endif
+
+#if !_LIBC
+ if (! s)
+ s = _("Unknown system error");
+#endif
+
+#if _LIBC
+ __fxprintf (NULL, ": %s", s);
+#else
+ fprintf (stderr, ": %s", s);
+#endif
+}
+
+static void _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0) _GL_ARG_NONNULL ((3))
+error_tail (int status, int errnum, const char *message, va_list args)
+{
+#if _LIBC
+ if (_IO_fwide (stderr, 0) > 0)
+ {
+ size_t len = strlen (message) + 1;
+ wchar_t *wmessage = NULL;
+ mbstate_t st;
+ size_t res;
+ const char *tmp;
+ bool use_malloc = false;
+
+ while (1)
+ {
+ if (__libc_use_alloca (len * sizeof (wchar_t)))
+ wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
+ else
+ {
+ if (!use_malloc)
+ wmessage = NULL;
+
+ wchar_t *p = (wchar_t *) realloc (wmessage,
+ len * sizeof (wchar_t));
+ if (p == NULL)
+ {
+ free (wmessage);
+ fputws_unlocked (L"out of memory\n", stderr);
+ return;
+ }
+ wmessage = p;
+ use_malloc = true;
+ }
+
+ memset (&st, '\0', sizeof (st));
+ tmp = message;
+
+ res = mbsrtowcs (wmessage, &tmp, len, &st);
+ if (res != len)
+ break;
+
+ if (__builtin_expect (len >= SIZE_MAX / sizeof (wchar_t) / 2, 0))
+ {
+ /* This really should not happen if everything is fine. */
+ res = (size_t) -1;
+ break;
+ }
+
+ len *= 2;
+ }
+
+ if (res == (size_t) -1)
+ {
+ /* The string cannot be converted. */
+ if (use_malloc)
+ {
+ free (wmessage);
+ use_malloc = false;
+ }
+ wmessage = (wchar_t *) L"???";
+ }
+
+ __vfwprintf (stderr, wmessage, args);
+
+ if (use_malloc)
+ free (wmessage);
+ }
+ else
+#endif
+ vfprintf (stderr, message, args);
+
+ ++error_message_count;
+ if (errnum)
+ print_errno_message (errnum);
+#if _LIBC
+ __fxprintf (NULL, "\n");
+#else
+ putc ('\n', stderr);
+#endif
+ fflush (stderr);
+ if (status)
+ exit (status);
+}
+
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+ format string with optional args.
+ If ERRNUM is nonzero, print its corresponding system error message.
+ Exit with status STATUS if it is nonzero. */
+void
+error (int status, int errnum, const char *message, ...)
+{
+ va_list args;
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s: ", program_name);
+#else
+ fprintf (stderr, "%s: ", program_name);
+#endif
+ }
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+ va_end (args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+int error_one_per_line;
+
+void
+error_at_line (int status, int errnum, const char *file_name,
+ unsigned int line_number, const char *message, ...)
+{
+ va_list args;
+
+ if (error_one_per_line)
+ {
+ static const char *old_file_name;
+ static unsigned int old_line_number;
+
+ if (old_line_number == line_number
+ && (file_name == old_file_name
+ || (old_file_name != NULL
+ && file_name != NULL
+ && strcmp (old_file_name, file_name) == 0)))
+
+ /* Simply return and print nothing. */
+ return;
+
+ old_file_name = file_name;
+ old_line_number = line_number;
+ }
+
+#if defined _LIBC && defined __libc_ptf_call
+ /* We do not want this call to be cut short by a thread
+ cancellation. Therefore disable cancellation for now. */
+ int state = PTHREAD_CANCEL_ENABLE;
+ __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+ 0);
+#endif
+
+ flush_stdout ();
+#ifdef _LIBC
+ _IO_flockfile (stderr);
+#endif
+ if (error_print_progname)
+ (*error_print_progname) ();
+ else
+ {
+#if _LIBC
+ __fxprintf (NULL, "%s:", program_name);
+#else
+ fprintf (stderr, "%s:", program_name);
+#endif
+ }
+
+#if _LIBC
+ __fxprintf (NULL, file_name != NULL ? "%s:%u: " : " ",
+ file_name, line_number);
+#else
+ fprintf (stderr, file_name != NULL ? "%s:%u: " : " ",
+ file_name, line_number);
+#endif
+
+ va_start (args, message);
+ error_tail (status, errnum, message, args);
+ va_end (args);
+
+#ifdef _LIBC
+ _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+ __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+#ifdef _LIBC
+/* Make the weak alias. */
+# undef error
+# undef error_at_line
+weak_alias (__error, error)
+weak_alias (__error_at_line, error_at_line)
+#endif
diff --git a/lib/error.h b/lib/error.h
new file mode 100644
index 0000000..6f6c90e
--- /dev/null
+++ b/lib/error.h
@@ -0,0 +1,66 @@
+/* Declaration for error-reporting function
+ Copyright (C) 1995-1997, 2003, 2006, 2008-2020 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _ERROR_H
+#define _ERROR_H 1
+
+/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM. */
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with 'fprintf (stderr, FORMAT, ...)';
+ if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+ If STATUS is nonzero, terminate the program with 'exit (STATUS)'. */
+
+extern void error (int __status, int __errnum, const char *__format, ...)
+#if GNULIB_VFPRINTF_POSIX
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4))
+#else
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 3, 4))
+#endif
+ ;
+
+extern void error_at_line (int __status, int __errnum, const char *__fname,
+ unsigned int __lineno, const char *__format, ...)
+#if GNULIB_VFPRINTF_POSIX
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 5, 6))
+#else
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, 5, 6))
+#endif
+ ;
+
+/* If NULL, error will flush stdout, then print on stderr the program
+ name, a colon and a space. Otherwise, error will call this
+ function without parameters instead. */
+extern void (*error_print_progname) (void);
+
+/* This variable is incremented each time 'error' is called. */
+extern unsigned int error_message_count;
+
+/* Sometimes we want to have at most one error per line. This
+ variable controls whether this mode is selected or not. */
+extern int error_one_per_line;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* error.h */
diff --git a/lib/exitfail.c b/lib/exitfail.c
new file mode 100644
index 0000000..189fa16
--- /dev/null
+++ b/lib/exitfail.c
@@ -0,0 +1,24 @@
+/* Failure exit status
+
+ Copyright (C) 2002-2003, 2005-2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "exitfail.h"
+
+#include <stdlib.h>
+
+int volatile exit_failure = EXIT_FAILURE;
diff --git a/lib/exitfail.h b/lib/exitfail.h
new file mode 100644
index 0000000..a69a03b
--- /dev/null
+++ b/lib/exitfail.h
@@ -0,0 +1,18 @@
+/* Failure exit status
+
+ Copyright (C) 2002, 2009-2020 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/>. */
+
+extern int volatile exit_failure;
diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c
new file mode 100644
index 0000000..14ecfe7
--- /dev/null
+++ b/lib/fatal-signal.c
@@ -0,0 +1,362 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "fatal-signal.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "glthread/lock.h"
+#include "thread-optim.h"
+#include "sig-handler.h"
+#include "xalloc.h"
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+/* ========================================================================= */
+
+
+/* The list of fatal signals.
+ These are those signals whose default action is to terminate the process
+ without a core dump, except
+ SIGKILL - because it cannot be caught,
+ SIGALRM SIGUSR1 SIGUSR2 SIGPOLL SIGIO SIGLOST - because applications
+ often use them for their own purpose,
+ SIGPROF SIGVTALRM - because they are used for profiling,
+ SIGSTKFLT - because it is more similar to SIGFPE, SIGSEGV, SIGBUS,
+ SIGSYS - because it is more similar to SIGABRT, SIGSEGV,
+ SIGPWR - because it of too special use,
+ SIGRTMIN...SIGRTMAX - because they are reserved for application use.
+ plus
+ SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
+
+static int fatal_signals[] =
+ {
+ /* ISO C 99 signals. */
+#ifdef SIGINT
+ SIGINT,
+#endif
+#ifdef SIGTERM
+ SIGTERM,
+#endif
+ /* POSIX:2001 signals. */
+#ifdef SIGHUP
+ SIGHUP,
+#endif
+#ifdef SIGPIPE
+ SIGPIPE,
+#endif
+ /* BSD signals. */
+#ifdef SIGXCPU
+ SIGXCPU,
+#endif
+#ifdef SIGXFSZ
+ SIGXFSZ,
+#endif
+ /* Native Windows signals. */
+#ifdef SIGBREAK
+ SIGBREAK,
+#endif
+ 0
+ };
+
+#define num_fatal_signals (SIZEOF (fatal_signals) - 1)
+
+/* Eliminate signals whose signal handler is SIG_IGN. */
+
+static void
+init_fatal_signals (void)
+{
+ /* This function is multithread-safe even without synchronization, because
+ if two threads execute it simultaneously, the fatal_signals[] array will
+ not change any more after the first of the threads has completed this
+ function. */
+ static bool fatal_signals_initialized = false;
+ if (!fatal_signals_initialized)
+ {
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ {
+ struct sigaction action;
+
+ if (sigaction (fatal_signals[i], NULL, &action) >= 0
+ && get_handler (&action) == SIG_IGN)
+ fatal_signals[i] = -1;
+ }
+
+ fatal_signals_initialized = true;
+ }
+}
+
+
+/* ========================================================================= */
+
+
+typedef _GL_ASYNC_SAFE void (*action_t) (int sig);
+
+/* Type of an entry in the actions array.
+ The 'action' field is accessed from within the fatal_signal_handler(),
+ therefore we mark it as 'volatile'. */
+typedef struct
+{
+ volatile action_t action;
+}
+actions_entry_t;
+
+/* The registered cleanup actions. */
+static actions_entry_t static_actions[32];
+static actions_entry_t * volatile actions = static_actions;
+static sig_atomic_t volatile actions_count = 0;
+static size_t actions_allocated = SIZEOF (static_actions);
+
+
+/* The saved signal handlers.
+ Size 32 would not be sufficient: On HP-UX, SIGXCPU = 33, SIGXFSZ = 34. */
+static struct sigaction saved_sigactions[64];
+
+
+/* Uninstall the handlers. */
+static _GL_ASYNC_SAFE void
+uninstall_handlers (void)
+{
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+ if (saved_sigactions[sig].sa_handler == SIG_IGN)
+ saved_sigactions[sig].sa_handler = SIG_DFL;
+ sigaction (sig, &saved_sigactions[sig], NULL);
+ }
+}
+
+
+/* The signal handler. It gets called asynchronously. */
+static _GL_ASYNC_SAFE void
+fatal_signal_handler (int sig)
+{
+ for (;;)
+ {
+ /* Get the last registered cleanup action, in a reentrant way. */
+ action_t action;
+ size_t n = actions_count;
+ if (n == 0)
+ break;
+ n--;
+ actions_count = n;
+ action = actions[n].action;
+ /* Execute the action. */
+ action (sig);
+ }
+
+ /* Now execute the signal's default action.
+ If the signal being delivered was blocked, the re-raised signal would be
+ delivered when this handler returns. But the way we install this handler,
+ no signal is blocked, and the re-raised signal is delivered already
+ during raise(). */
+ uninstall_handlers ();
+ raise (sig);
+}
+
+
+/* Install the handlers. */
+static void
+install_handlers (void)
+{
+ size_t i;
+ struct sigaction action;
+
+ action.sa_handler = &fatal_signal_handler;
+ /* If we get a fatal signal while executing fatal_signal_handler, enter
+ fatal_signal_handler recursively, since it is reentrant. Hence no
+ SA_RESETHAND. */
+ action.sa_flags = SA_NODEFER;
+ sigemptyset (&action.sa_mask);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ {
+ int sig = fatal_signals[i];
+
+ if (!(sig < sizeof (saved_sigactions) / sizeof (saved_sigactions[0])))
+ abort ();
+ sigaction (sig, &action, &saved_sigactions[sig]);
+ }
+}
+
+
+/* Lock that makes at_fatal_signal multi-thread safe. */
+gl_lock_define_initialized (static, at_fatal_signal_lock)
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs. */
+void
+at_fatal_signal (action_t action)
+{
+ bool mt = gl_multithreaded ();
+
+ if (mt) gl_lock_lock (at_fatal_signal_lock);
+
+ static bool cleanup_initialized = false;
+ if (!cleanup_initialized)
+ {
+ init_fatal_signals ();
+ install_handlers ();
+ cleanup_initialized = true;
+ }
+
+ if (actions_count == actions_allocated)
+ {
+ /* Extend the actions array. Note that we cannot use xrealloc(),
+ because then the cleanup() function could access an already
+ deallocated array. */
+ actions_entry_t *old_actions = actions;
+ size_t old_actions_allocated = actions_allocated;
+ size_t new_actions_allocated = 2 * actions_allocated;
+ actions_entry_t *new_actions =
+ XNMALLOC (new_actions_allocated, actions_entry_t);
+ size_t k;
+
+ /* Don't use memcpy() here, because memcpy takes non-volatile arguments
+ and is therefore not guaranteed to complete all memory stores before
+ the next statement. */
+ for (k = 0; k < old_actions_allocated; k++)
+ new_actions[k] = old_actions[k];
+ actions = new_actions;
+ actions_allocated = new_actions_allocated;
+ /* Now we can free the old actions array. */
+ /* No, we can't do that. If fatal_signal_handler is running in a
+ different thread and has already fetched the actions pointer (getting
+ old_actions) but not yet accessed its n-th element, that thread may
+ crash when accessing an element of the already freed old_actions
+ array. */
+ #if 0
+ if (old_actions != static_actions)
+ free (old_actions);
+ #endif
+ }
+ /* The two uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the actions_count only after
+ the new action has been written to the memory location
+ actions[actions_count]. */
+ actions[actions_count].action = action;
+ actions_count++;
+
+ if (mt) gl_lock_unlock (at_fatal_signal_lock);
+}
+
+
+/* ========================================================================= */
+
+
+static sigset_t fatal_signal_set;
+
+static void
+do_init_fatal_signal_set (void)
+{
+ size_t i;
+
+ init_fatal_signals ();
+
+ sigemptyset (&fatal_signal_set);
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ sigaddset (&fatal_signal_set, fatal_signals[i]);
+}
+
+/* Ensure that do_init_fatal_signal_set is called once only. */
+gl_once_define(static, fatal_signal_set_once)
+
+static void
+init_fatal_signal_set (void)
+{
+ gl_once (fatal_signal_set_once, do_init_fatal_signal_set);
+}
+
+/* Lock and counter that allow block_fatal_signals/unblock_fatal_signals pairs
+ to occur in different threads and even overlap in time. */
+gl_lock_define_initialized (static, fatal_signals_block_lock)
+static unsigned int fatal_signals_block_counter = 0;
+
+/* Temporarily delay the catchable fatal signals. */
+void
+block_fatal_signals (void)
+{
+ bool mt = gl_multithreaded ();
+
+ if (mt) gl_lock_lock (fatal_signals_block_lock);
+
+ if (fatal_signals_block_counter++ == 0)
+ {
+ init_fatal_signal_set ();
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ }
+
+ if (mt) gl_lock_unlock (fatal_signals_block_lock);
+}
+
+/* Stop delaying the catchable fatal signals. */
+void
+unblock_fatal_signals (void)
+{
+ bool mt = gl_multithreaded ();
+
+ if (mt) gl_lock_lock (fatal_signals_block_lock);
+
+ if (fatal_signals_block_counter == 0)
+ /* There are more calls to unblock_fatal_signals() than to
+ block_fatal_signals(). */
+ abort ();
+ if (--fatal_signals_block_counter == 0)
+ {
+ init_fatal_signal_set ();
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ }
+
+ if (mt) gl_lock_unlock (fatal_signals_block_lock);
+}
+
+
+unsigned int
+get_fatal_signals (int signals[64])
+{
+ init_fatal_signal_set ();
+
+ {
+ int *p = signals;
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ if (fatal_signals[i] >= 0)
+ *p++ = fatal_signals[i];
+ return p - signals;
+ }
+}
+
+const sigset_t *
+get_fatal_signal_set (void)
+{
+ init_fatal_signal_set ();
+ return &fatal_signal_set;
+}
diff --git a/lib/fatal-signal.h b/lib/fatal-signal.h
new file mode 100644
index 0000000..54270fa
--- /dev/null
+++ b/lib/fatal-signal.h
@@ -0,0 +1,94 @@
+/* Emergency actions in case of a fatal signal.
+ Copyright (C) 2003-2004, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+
+#ifndef _FATAL_SIGNAL_H
+#define _FATAL_SIGNAL_H
+
+#include <signal.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* It is often useful to do some cleanup action when a usually fatal signal
+ terminates the process, like removing a temporary file or killing a
+ subprocess that may be stuck waiting for a device, pipe or network input.
+ Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others.
+ The limitation of this facility is that it cannot work for SIGKILL.
+
+ Signals with a SIG_IGN handler are considered to be non-fatal. The
+ functions in this file assume that when a SIG_IGN handler is installed
+ for a signal, it was installed before any functions in this file were
+ called and it stays so for the whole lifetime of the process. */
+
+/* Register a cleanup function to be executed when a catchable fatal signal
+ occurs.
+
+ Restrictions for the cleanup function:
+ - The cleanup function can do all kinds of system calls. It may also
+ modify (clobber) errno.
+ - It can also access application dependent memory locations and data
+ structures provided they are in a consistent state. One way to ensure
+ this is through block_fatal_signals()/unblock_fatal_signals(), see
+ below. Another - more tricky - way to ensure this is the careful use
+ of 'volatile'.
+ However,
+ - malloc() and similarly complex facilities are not safe to be called
+ because they are not guaranteed to be in a consistent state.
+ - Also, the cleanup function must not block the catchable fatal signals
+ and leave them blocked upon return.
+
+ The cleanup function is executed asynchronously. It is unspecified
+ whether during its execution the catchable fatal signals are blocked
+ or not. */
+extern void at_fatal_signal (_GL_ASYNC_SAFE void (*function) (int sig));
+
+
+/* Sometimes it is necessary to block the usually fatal signals while the
+ data structures being accessed by the cleanup action are being built or
+ reorganized. This is the case, for example, when a temporary file or
+ directory is created through mkstemp() or mkdtemp(), because these
+ functions create the temporary file or directory _before_ returning its
+ name to the application. */
+
+/* Temporarily delay the catchable fatal signals.
+ The signals will be blocked (= delayed) until the next call to
+ unblock_fatal_signals(). If the signals are already blocked, a further
+ call to block_fatal_signals() has no effect. */
+extern void block_fatal_signals (void);
+
+/* Stop delaying the catchable fatal signals. */
+extern void unblock_fatal_signals (void);
+
+
+/* Return the list of signals that block_fatal_signals/unblock_fatal_signals
+ would block or unblock.
+ Fills signals[0..count-1] and returns count. */
+extern unsigned int get_fatal_signals (int signals[64]);
+
+/* Return the list of signals that block_fatal_signals/unblock_fatal_signals
+ would block or unblock. */
+extern const sigset_t * get_fatal_signal_set (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FATAL_SIGNAL_H */
diff --git a/lib/fchdir.c b/lib/fchdir.c
new file mode 100644
index 0000000..1fa9a7e
--- /dev/null
+++ b/lib/fchdir.c
@@ -0,0 +1,209 @@
+/* fchdir replacement.
+ Copyright (C) 2006-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "assure.h"
+#include "filename.h"
+#include "filenamecat.h"
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+/* This replacement assumes that a directory is not renamed while opened
+ through a file descriptor.
+
+ FIXME: On mingw, this would be possible to enforce if we were to
+ also open a HANDLE to each directory currently visited by a file
+ descriptor, since mingw refuses to rename any in-use file system
+ object. */
+
+/* Array of file descriptors opened. If REPLACE_OPEN_DIRECTORY or if it points
+ to a directory, it stores info about this directory. */
+typedef struct
+{
+ char *name; /* Absolute name of the directory, or NULL. */
+ /* FIXME - add a DIR* member to make dirfd possible on mingw? */
+} dir_info_t;
+static dir_info_t *dirs;
+static size_t dirs_allocated;
+
+/* Try to ensure dirs has enough room for a slot at index fd; free any
+ contents already in that slot. Return false and set errno to
+ ENOMEM on allocation failure. */
+static bool
+ensure_dirs_slot (size_t fd)
+{
+ if (fd < dirs_allocated)
+ free (dirs[fd].name);
+ else
+ {
+ size_t new_allocated;
+ dir_info_t *new_dirs;
+
+ new_allocated = 2 * dirs_allocated + 1;
+ if (new_allocated <= fd)
+ new_allocated = fd + 1;
+ new_dirs =
+ (dirs != NULL
+ ? (dir_info_t *) realloc (dirs, new_allocated * sizeof *dirs)
+ : (dir_info_t *) malloc (new_allocated * sizeof *dirs));
+ if (new_dirs == NULL)
+ return false;
+ memset (new_dirs + dirs_allocated, 0,
+ (new_allocated - dirs_allocated) * sizeof *dirs);
+ dirs = new_dirs;
+ dirs_allocated = new_allocated;
+ }
+ return true;
+}
+
+/* Return an absolute name of DIR in malloc'd storage.
+ Upon failure, return NULL with errno set. */
+static char *
+get_name (char const *dir)
+{
+ char *cwd;
+ char *result;
+ int saved_errno;
+
+ if (IS_ABSOLUTE_FILE_NAME (dir))
+ return strdup (dir);
+
+ /* We often encounter "."; treat it as a special case. */
+ cwd = getcwd (NULL, 0);
+ if (!cwd || (dir[0] == '.' && dir[1] == '\0'))
+ return cwd;
+
+ result = mfile_name_concat (cwd, dir, NULL);
+ saved_errno = errno;
+ free (cwd);
+ errno = saved_errno;
+ return result;
+}
+
+/* Hook into the gnulib replacements for open() and close() to keep track
+ of the open file descriptors. */
+
+/* Close FD, cleaning up any fd to name mapping if fd was visiting a
+ directory. */
+void
+_gl_unregister_fd (int fd)
+{
+ if (fd >= 0 && fd < dirs_allocated)
+ {
+ free (dirs[fd].name);
+ dirs[fd].name = NULL;
+ }
+}
+
+/* Mark FD as visiting FILENAME. FD must be non-negative, and refer
+ to an open file descriptor. If REPLACE_OPEN_DIRECTORY is non-zero,
+ this should only be called if FD is visiting a directory. Close FD
+ and return -1 with errno set if there is insufficient memory to track
+ the directory name; otherwise return FD. */
+int
+_gl_register_fd (int fd, const char *filename)
+{
+ struct stat statbuf;
+
+ assure (0 <= fd);
+ if (REPLACE_OPEN_DIRECTORY
+ || (fstat (fd, &statbuf) == 0 && S_ISDIR (statbuf.st_mode)))
+ {
+ if (!ensure_dirs_slot (fd)
+ || (dirs[fd].name = get_name (filename)) == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ return fd;
+}
+
+/* Mark NEWFD as a duplicate of OLDFD; useful from dup, dup2, dup3,
+ and fcntl. Both arguments must be valid and distinct file
+ descriptors. Close NEWFD and return -1 if OLDFD is tracking a
+ directory, but there is insufficient memory to track the same
+ directory in NEWFD; otherwise return NEWFD. */
+int
+_gl_register_dup (int oldfd, int newfd)
+{
+ assure (0 <= oldfd && 0 <= newfd && oldfd != newfd);
+ if (oldfd < dirs_allocated && dirs[oldfd].name)
+ {
+ /* Duplicated a directory; must ensure newfd is allocated. */
+ if (!ensure_dirs_slot (newfd)
+ || (dirs[newfd].name = strdup (dirs[oldfd].name)) == NULL)
+ {
+ int saved_errno = errno;
+ close (newfd);
+ errno = saved_errno;
+ newfd = -1;
+ }
+ }
+ else if (newfd < dirs_allocated)
+ {
+ /* Duplicated a non-directory; ensure newfd is cleared. */
+ free (dirs[newfd].name);
+ dirs[newfd].name = NULL;
+ }
+ return newfd;
+}
+
+/* If FD is currently visiting a directory, then return the name of
+ that directory. Otherwise, return NULL and set errno. */
+const char *
+_gl_directory_name (int fd)
+{
+ if (0 <= fd && fd < dirs_allocated && dirs[fd].name != NULL)
+ return dirs[fd].name;
+ /* At this point, fd is either invalid, or open but not a directory.
+ If dup2 fails, errno is correctly EBADF. */
+ if (0 <= fd)
+ {
+ if (dup2 (fd, fd) == fd)
+ errno = ENOTDIR;
+ }
+ else
+ errno = EBADF;
+ return NULL;
+}
+
+
+/* Implement fchdir() in terms of chdir(). */
+
+int
+fchdir (int fd)
+{
+ const char *name = _gl_directory_name (fd);
+ return name ? chdir (name) : -1;
+}
diff --git a/lib/fcntl.c b/lib/fcntl.c
new file mode 100644
index 0000000..59bb3ca
--- /dev/null
+++ b/lib/fcntl.c
@@ -0,0 +1,629 @@
+/* Provide file descriptor control.
+
+ Copyright (C) 2009-2020 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/>. */
+
+/* Written by Eric Blake <ebb9@byu.net>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <fcntl.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef __KLIBC__
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Get declarations of the native Windows API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Get _get_osfhandle. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Upper bound on getdtablesize(). See lib/getdtablesize.c. */
+# define OPEN_MAX_MAX 0x10000
+
+/* Duplicate OLDFD into the first available slot of at least NEWFD,
+ which must be positive, with FLAGS determining whether the duplicate
+ will be inheritable. */
+static int
+dupfd (int oldfd, int newfd, int flags)
+{
+ /* Mingw has no way to create an arbitrary fd. Iterate until all
+ file descriptors less than newfd are filled up. */
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
+ unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
+ unsigned int fds_to_close_bound = 0;
+ int result;
+ BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
+ int mode;
+
+ if (newfd < 0 || getdtablesize () <= newfd)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ if (old_handle == INVALID_HANDLE_VALUE
+ || (mode = _setmode (oldfd, O_BINARY)) == -1)
+ {
+ /* oldfd is not open, or is an unassigned standard file
+ descriptor. */
+ errno = EBADF;
+ return -1;
+ }
+ _setmode (oldfd, mode);
+ flags |= mode;
+
+ for (;;)
+ {
+ HANDLE new_handle;
+ int duplicated_fd;
+ unsigned int index;
+
+ if (!DuplicateHandle (curr_process, /* SourceProcessHandle */
+ old_handle, /* SourceHandle */
+ curr_process, /* TargetProcessHandle */
+ (PHANDLE) &new_handle, /* TargetHandle */
+ (DWORD) 0, /* DesiredAccess */
+ inherit, /* InheritHandle */
+ DUPLICATE_SAME_ACCESS)) /* Options */
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_TOO_MANY_OPEN_FILES:
+ errno = EMFILE;
+ break;
+ case ERROR_INVALID_HANDLE:
+ case ERROR_INVALID_TARGET_HANDLE:
+ case ERROR_DIRECT_ACCESS_HANDLE:
+ errno = EBADF;
+ break;
+ case ERROR_INVALID_PARAMETER:
+ case ERROR_INVALID_FUNCTION:
+ case ERROR_INVALID_ACCESS:
+ errno = EINVAL;
+ break;
+ default:
+ errno = EACCES;
+ break;
+ }
+ result = -1;
+ break;
+ }
+ duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags);
+ if (duplicated_fd < 0)
+ {
+ CloseHandle (new_handle);
+ result = -1;
+ break;
+ }
+ if (newfd <= duplicated_fd)
+ {
+ result = duplicated_fd;
+ break;
+ }
+
+ /* Set the bit duplicated_fd in fds_to_close[]. */
+ index = (unsigned int) duplicated_fd / CHAR_BIT;
+ if (fds_to_close_bound <= index)
+ {
+ if (sizeof fds_to_close <= index)
+ /* Need to increase OPEN_MAX_MAX. */
+ abort ();
+ memset (fds_to_close + fds_to_close_bound, '\0',
+ index + 1 - fds_to_close_bound);
+ fds_to_close_bound = index + 1;
+ }
+ fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
+ }
+
+ /* Close the previous fds that turned out to be too small. */
+ {
+ int saved_errno = errno;
+ unsigned int duplicated_fd;
+
+ for (duplicated_fd = 0;
+ duplicated_fd < fds_to_close_bound * CHAR_BIT;
+ duplicated_fd++)
+ if ((fds_to_close[duplicated_fd / CHAR_BIT]
+ >> (duplicated_fd % CHAR_BIT))
+ & 1)
+ close (duplicated_fd);
+
+ errno = saved_errno;
+ }
+
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (oldfd, result);
+# endif
+ return result;
+}
+#endif /* W32 */
+
+/* Forward declarations, because we '#undef fcntl' in the middle of this
+ compilation unit. */
+/* Our implementation of fcntl (fd, F_DUPFD, target). */
+static int rpl_fcntl_DUPFD (int fd, int target);
+/* Our implementation of fcntl (fd, F_DUPFD_CLOEXEC, target). */
+static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target);
+#ifdef __KLIBC__
+/* Adds support for fcntl on directories. */
+static int klibc_fcntl (int fd, int action, /* arg */...);
+#endif
+
+
+/* Perform the specified ACTION on the file descriptor FD, possibly
+ using the argument ARG further described below. This replacement
+ handles the following actions, and forwards all others on to the
+ native fcntl. An unrecognized ACTION returns -1 with errno set to
+ EINVAL.
+
+ F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
+ If successful, return the duplicate, which will be inheritable;
+ otherwise return -1 and set errno.
+
+ F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
+ target fd. If successful, return the duplicate, which will not be
+ inheritable; otherwise return -1 and set errno.
+
+ F_GETFD - ARG need not be present. If successful, return a
+ non-negative value containing the descriptor flags of FD (only
+ FD_CLOEXEC is portable, but other flags may be present); otherwise
+ return -1 and set errno. */
+
+int
+fcntl (int fd, int action, /* arg */...)
+#undef fcntl
+#ifdef __KLIBC__
+# define fcntl klibc_fcntl
+#endif
+{
+ va_list arg;
+ int result = -1;
+ va_start (arg, action);
+ switch (action)
+ {
+ case F_DUPFD:
+ {
+ int target = va_arg (arg, int);
+ result = rpl_fcntl_DUPFD (fd, target);
+ break;
+ }
+
+ case F_DUPFD_CLOEXEC:
+ {
+ int target = va_arg (arg, int);
+ result = rpl_fcntl_DUPFD_CLOEXEC (fd, target);
+ break;
+ }
+
+#if !HAVE_FCNTL
+ case F_GETFD:
+ {
+# if defined _WIN32 && ! defined __CYGWIN__
+ HANDLE handle = (HANDLE) _get_osfhandle (fd);
+ DWORD flags;
+ if (handle == INVALID_HANDLE_VALUE
+ || GetHandleInformation (handle, &flags) == 0)
+ errno = EBADF;
+ else
+ result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
+# else /* !W32 */
+ /* Use dup2 to reject invalid file descriptors. No way to
+ access this information, so punt. */
+ if (0 <= dup2 (fd, fd))
+ result = 0;
+# endif /* !W32 */
+ break;
+ } /* F_GETFD */
+#endif /* !HAVE_FCNTL */
+
+ /* Implementing F_SETFD on mingw is not trivial - there is no
+ API for changing the O_NOINHERIT bit on an fd, and merely
+ changing the HANDLE_FLAG_INHERIT bit on the underlying handle
+ can lead to odd state. It may be possible by duplicating the
+ handle, using _open_osfhandle with the right flags, then
+ using dup2 to move the duplicate onto the original, but that
+ is not supported for now. */
+
+ default:
+ {
+#if HAVE_FCNTL
+ switch (action)
+ {
+ #ifdef F_BARRIERFSYNC /* macOS */
+ case F_BARRIERFSYNC:
+ #endif
+ #ifdef F_CHKCLEAN /* macOS */
+ case F_CHKCLEAN:
+ #endif
+ #ifdef F_CLOSEM /* NetBSD, HP-UX */
+ case F_CLOSEM:
+ #endif
+ #ifdef F_FLUSH_DATA /* macOS */
+ case F_FLUSH_DATA:
+ #endif
+ #ifdef F_FREEZE_FS /* macOS */
+ case F_FREEZE_FS:
+ #endif
+ #ifdef F_FULLFSYNC /* macOS */
+ case F_FULLFSYNC:
+ #endif
+ #ifdef F_GETCONFINED /* macOS */
+ case F_GETCONFINED:
+ #endif
+ #ifdef F_GETDEFAULTPROTLEVEL /* macOS */
+ case F_GETDEFAULTPROTLEVEL:
+ #endif
+ #ifdef F_GETFD /* POSIX */
+ case F_GETFD:
+ #endif
+ #ifdef F_GETFL /* POSIX */
+ case F_GETFL:
+ #endif
+ #ifdef F_GETLEASE /* Linux */
+ case F_GETLEASE:
+ #endif
+ #ifdef F_GETNOSIGPIPE /* macOS */
+ case F_GETNOSIGPIPE:
+ #endif
+ #ifdef F_GETOWN /* POSIX */
+ case F_GETOWN:
+ #endif
+ #ifdef F_GETPIPE_SZ /* Linux */
+ case F_GETPIPE_SZ:
+ #endif
+ #ifdef F_GETPROTECTIONCLASS /* macOS */
+ case F_GETPROTECTIONCLASS:
+ #endif
+ #ifdef F_GETPROTECTIONLEVEL /* macOS */
+ case F_GETPROTECTIONLEVEL:
+ #endif
+ #ifdef F_GET_SEALS /* Linux */
+ case F_GET_SEALS:
+ #endif
+ #ifdef F_GETSIG /* Linux */
+ case F_GETSIG:
+ #endif
+ #ifdef F_MAXFD /* NetBSD */
+ case F_MAXFD:
+ #endif
+ #ifdef F_RECYCLE /* macOS */
+ case F_RECYCLE:
+ #endif
+ #ifdef F_SETFIFOENH /* HP-UX */
+ case F_SETFIFOENH:
+ #endif
+ #ifdef F_THAW_FS /* macOS */
+ case F_THAW_FS:
+ #endif
+ /* These actions take no argument. */
+ result = fcntl (fd, action);
+ break;
+
+ #ifdef F_ADD_SEALS /* Linux */
+ case F_ADD_SEALS:
+ #endif
+ #ifdef F_BADFD /* Solaris */
+ case F_BADFD:
+ #endif
+ #ifdef F_CHECK_OPENEVT /* macOS */
+ case F_CHECK_OPENEVT:
+ #endif
+ #ifdef F_DUP2FD /* FreeBSD, AIX, Solaris */
+ case F_DUP2FD:
+ #endif
+ #ifdef F_DUP2FD_CLOEXEC /* FreeBSD, Solaris */
+ case F_DUP2FD_CLOEXEC:
+ #endif
+ #ifdef F_DUP2FD_CLOFORK /* Solaris */
+ case F_DUP2FD_CLOFORK:
+ #endif
+ #ifdef F_DUPFD /* POSIX */
+ case F_DUPFD:
+ #endif
+ #ifdef F_DUPFD_CLOEXEC /* POSIX */
+ case F_DUPFD_CLOEXEC:
+ #endif
+ #ifdef F_DUPFD_CLOFORK /* Solaris */
+ case F_DUPFD_CLOFORK:
+ #endif
+ #ifdef F_GETXFL /* Solaris */
+ case F_GETXFL:
+ #endif
+ #ifdef F_GLOBAL_NOCACHE /* macOS */
+ case F_GLOBAL_NOCACHE:
+ #endif
+ #ifdef F_MAKECOMPRESSED /* macOS */
+ case F_MAKECOMPRESSED:
+ #endif
+ #ifdef F_MOVEDATAEXTENTS /* macOS */
+ case F_MOVEDATAEXTENTS:
+ #endif
+ #ifdef F_NOCACHE /* macOS */
+ case F_NOCACHE:
+ #endif
+ #ifdef F_NODIRECT /* macOS */
+ case F_NODIRECT:
+ #endif
+ #ifdef F_NOTIFY /* Linux */
+ case F_NOTIFY:
+ #endif
+ #ifdef F_OPLKACK /* IRIX */
+ case F_OPLKACK:
+ #endif
+ #ifdef F_OPLKREG /* IRIX */
+ case F_OPLKREG:
+ #endif
+ #ifdef F_RDAHEAD /* macOS */
+ case F_RDAHEAD:
+ #endif
+ #ifdef F_SETBACKINGSTORE /* macOS */
+ case F_SETBACKINGSTORE:
+ #endif
+ #ifdef F_SETCONFINED /* macOS */
+ case F_SETCONFINED:
+ #endif
+ #ifdef F_SETFD /* POSIX */
+ case F_SETFD:
+ #endif
+ #ifdef F_SETFL /* POSIX */
+ case F_SETFL:
+ #endif
+ #ifdef F_SETLEASE /* Linux */
+ case F_SETLEASE:
+ #endif
+ #ifdef F_SETNOSIGPIPE /* macOS */
+ case F_SETNOSIGPIPE:
+ #endif
+ #ifdef F_SETOWN /* POSIX */
+ case F_SETOWN:
+ #endif
+ #ifdef F_SETPIPE_SZ /* Linux */
+ case F_SETPIPE_SZ:
+ #endif
+ #ifdef F_SETPROTECTIONCLASS /* macOS */
+ case F_SETPROTECTIONCLASS:
+ #endif
+ #ifdef F_SETSIG /* Linux */
+ case F_SETSIG:
+ #endif
+ #ifdef F_SINGLE_WRITER /* macOS */
+ case F_SINGLE_WRITER:
+ #endif
+ /* These actions take an 'int' argument. */
+ {
+ int x = va_arg (arg, int);
+ result = fcntl (fd, action, x);
+ }
+ break;
+
+ default:
+ /* Other actions take a pointer argument. */
+ {
+ void *p = va_arg (arg, void *);
+ result = fcntl (fd, action, p);
+ }
+ break;
+ }
+#else
+ errno = EINVAL;
+#endif
+ break;
+ }
+ }
+ va_end (arg);
+ return result;
+}
+
+static int
+rpl_fcntl_DUPFD (int fd, int target)
+{
+ int result;
+#if !HAVE_FCNTL
+ result = dupfd (fd, target, 0);
+#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
+ /* Detect invalid target; needed for cygwin 1.5.x. */
+ if (target < 0 || getdtablesize () <= target)
+ {
+ result = -1;
+ errno = EINVAL;
+ }
+ else
+ {
+ /* Haiku alpha 2 loses fd flags on original. */
+ int flags = fcntl (fd, F_GETFD);
+ if (flags < 0)
+ result = -1;
+ else
+ {
+ result = fcntl (fd, F_DUPFD, target);
+ if (0 <= result && fcntl (fd, F_SETFD, flags) == -1)
+ {
+ int saved_errno = errno;
+ close (result);
+ result = -1;
+ errno = saved_errno;
+ }
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ }
+#else
+ result = fcntl (fd, F_DUPFD, target);
+#endif
+ return result;
+}
+
+static int
+rpl_fcntl_DUPFD_CLOEXEC (int fd, int target)
+{
+ int result;
+#if !HAVE_FCNTL
+ result = dupfd (fd, target, O_CLOEXEC);
+#else /* HAVE_FCNTL */
+# if defined __NetBSD__ || defined __HAIKU__
+ /* On NetBSD 9.0, the system fcntl (fd, F_DUPFD_CLOEXEC, target)
+ has only the same effect as fcntl (fd, F_DUPFD, target). */
+ /* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
+ the FD_CLOEXEC flag on fd, not on target. Therefore avoid the
+ system fcntl in this case. */
+# define have_dupfd_cloexec -1
+# else
+ /* Try the system call first, if the headers claim it exists
+ (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
+ may be running with a glibc that has the macro but with an
+ older kernel that does not support it. Cache the
+ information on whether the system call really works, but
+ avoid caching failure if the corresponding F_DUPFD fails
+ for any reason. 0 = unknown, 1 = yes, -1 = no. */
+ static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
+ if (0 <= have_dupfd_cloexec)
+ {
+ result = fcntl (fd, F_DUPFD_CLOEXEC, target);
+ if (0 <= result || errno != EINVAL)
+ {
+ have_dupfd_cloexec = 1;
+# if REPLACE_FCHDIR
+ if (0 <= result)
+ result = _gl_register_dup (fd, result);
+# endif
+ }
+ else
+ {
+ result = rpl_fcntl_DUPFD (fd, target);
+ if (result >= 0)
+ have_dupfd_cloexec = -1;
+ }
+ }
+ else
+# endif
+ result = rpl_fcntl_DUPFD (fd, target);
+ if (0 <= result && have_dupfd_cloexec == -1)
+ {
+ int flags = fcntl (result, F_GETFD);
+ if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
+ {
+ int saved_errno = errno;
+ close (result);
+ errno = saved_errno;
+ result = -1;
+ }
+ }
+#endif /* HAVE_FCNTL */
+ return result;
+}
+
+#undef fcntl
+
+#ifdef __KLIBC__
+
+static int
+klibc_fcntl (int fd, int action, /* arg */...)
+{
+ va_list arg_ptr;
+ int arg;
+ struct stat sbuf;
+ int result;
+
+ va_start (arg_ptr, action);
+ arg = va_arg (arg_ptr, int);
+ result = fcntl (fd, action, arg);
+ /* EPERM for F_DUPFD, ENOTSUP for others */
+ if (result == -1 && (errno == EPERM || errno == ENOTSUP)
+ && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+ {
+ ULONG ulMode;
+
+ switch (action)
+ {
+ case F_DUPFD:
+ /* Find available fd */
+ while (fcntl (arg, F_GETFL) != -1 || errno != EBADF)
+ arg++;
+
+ result = dup2 (fd, arg);
+ break;
+
+ /* Using underlying APIs is right ? */
+ case F_GETFD:
+ if (DosQueryFHState (fd, &ulMode))
+ break;
+
+ result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0;
+ break;
+
+ case F_SETFD:
+ if (arg & ~FD_CLOEXEC)
+ break;
+
+ if (DosQueryFHState (fd, &ulMode))
+ break;
+
+ if (arg & FD_CLOEXEC)
+ ulMode |= OPEN_FLAGS_NOINHERIT;
+ else
+ ulMode &= ~OPEN_FLAGS_NOINHERIT;
+
+ /* Filter supported flags. */
+ ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR
+ | OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
+
+ if (DosSetFHState (fd, ulMode))
+ break;
+
+ result = 0;
+ break;
+
+ case F_GETFL:
+ result = 0;
+ break;
+
+ case F_SETFL:
+ if (arg != 0)
+ break;
+
+ result = 0;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+ }
+
+ va_end (arg_ptr);
+
+ return result;
+}
+
+#endif
diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h
new file mode 100644
index 0000000..200fa91
--- /dev/null
+++ b/lib/fcntl.in.h
@@ -0,0 +1,441 @@
+/* Like <fcntl.h>, but with non-working flags defined to 0.
+
+ Copyright (C) 2006-2020 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/>. */
+
+/* written by Paul Eggert */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_fcntl_h
+/* Special invocation convention. */
+
+/* Needed before <sys/stat.h>.
+ May also define off_t to a 64-bit type on native Windows. */
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+ <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
+ But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+ extern "C" { ... } block, which leads to errors in C++ mode with the
+ overridden <sys/stat.h> from gnulib. These errors are known to be gone
+ with g++ version >= 4.3. */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
+# include <sys/stat.h>
+#endif
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+/* Native Windows platforms declare open(), creat() in <io.h>. */
+#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+
+/* Needed before <sys/stat.h>.
+ May also define off_t to a 64-bit type on native Windows. */
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+ <fcntl.h>. On glibc systems, we would like to avoid namespace pollution.
+ But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+ extern "C" { ... } block, which leads to errors in C++ mode with the
+ overridden <sys/stat.h> from gnulib. These errors are known to be gone
+ with g++ version >= 4.3. */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
+# include <sys/stat.h>
+#endif
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+/* Native Windows platforms declare open(), creat() in <io.h>. */
+#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+#define _@GUARD_PREFIX@_FCNTL_H
+
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems. */
+# include <unistd.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_CREAT@
+# if @REPLACE_CREAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef creat
+# define creat rpl_creat
+# endif
+_GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef creat
+# define creat _creat
+# endif
+_GL_CXXALIAS_MDA (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
+#elif defined GNULIB_POSIXCHECK
+# undef creat
+/* Assume creat is always declared. */
+_GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
+ "use gnulib module creat for portability");
+#elif @GNULIB_MDA_CREAT@
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::creat always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef creat
+# define creat _creat
+# endif
+/* Need to cast, because in mingw the last argument is 'int mode'. */
+_GL_CXXALIAS_MDA_CAST (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
+#endif
+
+#if @GNULIB_FCNTL@
+# if @REPLACE_FCNTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcntl
+# define fcntl rpl_fcntl
+# endif
+_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
+_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+# if !GNULIB_defined_rpl_fcntl
+# define GNULIB_defined_rpl_fcntl 1
+# endif
+# else
+# if !@HAVE_FCNTL@
+_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+# if !GNULIB_defined_fcntl
+# define GNULIB_defined_fcntl 1
+# endif
+# endif
+_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
+# endif
+_GL_CXXALIASWARN (fcntl);
+#elif defined GNULIB_POSIXCHECK
+# undef fcntl
+# if HAVE_RAW_DECL_FCNTL
+_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
+ "use gnulib module fcntl for portability");
+# endif
+#endif
+
+#if @GNULIB_OPEN@
+# if @REPLACE_OPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef open
+# define open rpl_open
+# endif
+_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef open
+# define open _open
+# endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
+ default argument. _GL_CXXALIASWARN does not work in this case. */
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef open
+/* Assume open is always declared. */
+_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
+ "use gnulib module open for portability");
+#elif @GNULIB_MDA_OPEN@
+/* On native Windows, map 'open' to '_open', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::open always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef open
+# define open _open
+# endif
+_GL_CXXALIAS_MDA (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
+#endif
+
+#if @GNULIB_OPENAT@
+# if @REPLACE_OPENAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef openat
+# define openat rpl_openat
+# endif
+_GL_FUNCDECL_RPL (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# else
+# if !@HAVE_OPENAT@
+_GL_FUNCDECL_SYS (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (openat, int,
+ (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# endif
+_GL_CXXALIASWARN (openat);
+#elif defined GNULIB_POSIXCHECK
+# undef openat
+# if HAVE_RAW_DECL_OPENAT
+_GL_WARN_ON_USE (openat, "openat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+/* Fix up the FD_* macros, only known to be missing on mingw. */
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 1
+#endif
+
+/* Fix up the supported F_* macros. Intentionally leave other F_*
+ macros undefined. Only known to be missing on mingw. */
+
+#ifndef F_DUPFD_CLOEXEC
+# define F_DUPFD_CLOEXEC 0x40000000
+/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise. */
+# define GNULIB_defined_F_DUPFD_CLOEXEC 1
+#else
+# define GNULIB_defined_F_DUPFD_CLOEXEC 0
+#endif
+
+#ifndef F_DUPFD
+# define F_DUPFD 1
+#endif
+
+#ifndef F_GETFD
+# define F_GETFD 2
+#endif
+
+/* Fix up the O_* macros. */
+
+/* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT
+ to values outside 'int' range, so omit these misdefinitions.
+ But avoid namespace pollution on non-AIX systems. */
+#ifdef _AIX
+# include <limits.h>
+# if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX)
+# undef O_CLOEXEC
+# endif
+# if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX)
+# undef O_NOFOLLOW
+# endif
+# if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX)
+# undef O_TTY_INIT
+# endif
+#endif
+
+#if !defined O_DIRECT && defined O_DIRECTIO
+/* Tru64 spells it 'O_DIRECTIO'. */
+# define O_DIRECT O_DIRECTIO
+#endif
+
+#if !defined O_CLOEXEC && defined O_NOINHERIT
+/* Mingw spells it 'O_NOINHERIT'. */
+# define O_CLOEXEC O_NOINHERIT
+#endif
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags. */
+# define GNULIB_defined_O_CLOEXEC 1
+#else
+# define GNULIB_defined_O_CLOEXEC 0
+#endif
+
+#ifndef O_DIRECT
+# define O_DIRECT 0
+#endif
+
+#ifndef O_DIRECTORY
+# define O_DIRECTORY 0
+#endif
+
+#ifndef O_DSYNC
+# define O_DSYNC 0
+#endif
+
+#ifndef O_EXEC
+# define O_EXEC O_RDONLY /* This is often close enough in older systems. */
+#endif
+
+#ifndef O_IGNORE_CTTY
+# define O_IGNORE_CTTY 0
+#endif
+
+#ifndef O_NDELAY
+# define O_NDELAY 0
+#endif
+
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+
+/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
+ value of O_NONBLOCK. Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
+ or to 0 as fallback. */
+#if @GNULIB_NONBLOCKING@
+# if O_NONBLOCK
+# define GNULIB_defined_O_NONBLOCK 0
+# else
+# define GNULIB_defined_O_NONBLOCK 1
+# undef O_NONBLOCK
+# define O_NONBLOCK 0x40000000
+# endif
+#endif
+
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#ifndef O_NOLINK
+# define O_NOLINK 0
+#endif
+
+#ifndef O_NOLINKS
+# define O_NOLINKS 0
+#endif
+
+#ifndef O_NOTRANS
+# define O_NOTRANS 0
+#endif
+
+#ifndef O_RSYNC
+# define O_RSYNC 0
+#endif
+
+#ifndef O_SEARCH
+# define O_SEARCH O_RDONLY /* This is often close enough in older systems. */
+#endif
+
+#ifndef O_SYNC
+# define O_SYNC 0
+#endif
+
+#ifndef O_TTY_INIT
+# define O_TTY_INIT 0
+#endif
+
+#if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+# undef O_ACCMODE
+# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+ O_BINARY is usually declared in fcntl.h */
+#if !defined O_BINARY && defined _O_BINARY
+ /* For MSC-compatible compilers. */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+
+#if defined __BEOS__ || defined __HAIKU__
+ /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect. */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+# define O_TEXT 0
+#endif
+
+/* Fix up the AT_* macros. */
+
+/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive. Its
+ value exceeds INT_MAX, so its use as an int doesn't conform to the
+ C standard, and GCC and Sun C complain in some cases. If the bug
+ is present, undef AT_FDCWD here, so it can be redefined below. */
+#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
+# undef AT_FDCWD
+#endif
+
+/* Use the same bit pattern as Solaris 9, but with the proper
+ signedness. The bit pattern is important, in case this actually is
+ Solaris with the above workaround. */
+#ifndef AT_FDCWD
+# define AT_FDCWD (-3041965)
+#endif
+
+/* Use the same values as Solaris 9. This shouldn't matter, but
+ there's no real reason to differ. */
+#ifndef AT_SYMLINK_NOFOLLOW
+# define AT_SYMLINK_NOFOLLOW 4096
+#endif
+
+#ifndef AT_REMOVEDIR
+# define AT_REMOVEDIR 1
+#endif
+
+/* Solaris 9 lacks these two, so just pick unique values. */
+#ifndef AT_SYMLINK_FOLLOW
+# define AT_SYMLINK_FOLLOW 2
+#endif
+
+#ifndef AT_EACCESS
+# define AT_EACCESS 4
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif
diff --git a/lib/fd-hook.c b/lib/fd-hook.c
new file mode 100644
index 0000000..8840f63
--- /dev/null
+++ b/lib/fd-hook.c
@@ -0,0 +1,116 @@
+/* Hook for making file descriptor functions close(), ioctl() extensible.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "fd-hook.h"
+
+#include <stdlib.h>
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+/* The first and last link in the doubly linked list.
+ Initially the list is empty. */
+static struct fd_hook anchor = { &anchor, &anchor, NULL, NULL };
+
+int
+execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary,
+ int fd)
+{
+ if (remaining_list == &anchor)
+ /* End of list reached. */
+ return primary (fd);
+ else
+ return remaining_list->private_close_fn (remaining_list->private_next,
+ primary, fd);
+}
+
+int
+execute_all_close_hooks (gl_close_fn primary, int fd)
+{
+ return execute_close_hooks (anchor.private_next, primary, fd);
+}
+
+int
+execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ if (remaining_list == &anchor)
+ /* End of list reached. */
+ return primary (fd, request, arg);
+ else
+ return remaining_list->private_ioctl_fn (remaining_list->private_next,
+ primary, fd, request, arg);
+}
+
+int
+execute_all_ioctl_hooks (gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg);
+}
+
+void
+register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link)
+{
+ if (close_hook == NULL)
+ close_hook = execute_close_hooks;
+ if (ioctl_hook == NULL)
+ ioctl_hook = execute_ioctl_hooks;
+
+ if (link->private_next == NULL && link->private_prev == NULL)
+ {
+ /* Add the link to the doubly linked list. */
+ link->private_next = anchor.private_next;
+ link->private_prev = &anchor;
+ link->private_close_fn = close_hook;
+ link->private_ioctl_fn = ioctl_hook;
+ anchor.private_next->private_prev = link;
+ anchor.private_next = link;
+ }
+ else
+ {
+ /* The link is already in use. */
+ if (link->private_close_fn != close_hook
+ || link->private_ioctl_fn != ioctl_hook)
+ abort ();
+ }
+}
+
+void
+unregister_fd_hook (struct fd_hook *link)
+{
+ struct fd_hook *next = link->private_next;
+ struct fd_hook *prev = link->private_prev;
+
+ if (next != NULL && prev != NULL)
+ {
+ /* The link is in use. Remove it from the doubly linked list. */
+ prev->private_next = next;
+ next->private_prev = prev;
+ /* Clear the link, to mark it unused. */
+ link->private_next = NULL;
+ link->private_prev = NULL;
+ link->private_close_fn = NULL;
+ link->private_ioctl_fn = NULL;
+ }
+}
+
+#endif
diff --git a/lib/fd-hook.h b/lib/fd-hook.h
new file mode 100644
index 0000000..ed1a15a
--- /dev/null
+++ b/lib/fd-hook.h
@@ -0,0 +1,119 @@
+/* Hook for making file descriptor functions close(), ioctl() extensible.
+ Copyright (C) 2009-2020 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/>. */
+
+
+#ifndef FD_HOOK_H
+#define FD_HOOK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Currently, this entire code is only needed for the handling of sockets
+ on native Windows platforms. */
+#if WINDOWS_SOCKETS
+
+
+/* Type of function that closes FD. */
+typedef int (*gl_close_fn) (int fd);
+
+/* Type of function that applies a control request to FD. */
+typedef int (*gl_ioctl_fn) (int fd, int request, void *arg);
+
+/* An element of the list of file descriptor hooks.
+ In CLOS (Common Lisp Object System) speak, it consists of an "around"
+ method for the close() function and an "around" method for the ioctl()
+ function.
+ The fields of this structure are considered private. */
+struct fd_hook
+{
+ /* Doubly linked list. */
+ struct fd_hook *private_next;
+ struct fd_hook *private_prev;
+ /* Function that treats the types of FD that it knows about and calls
+ execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback. */
+ int (*private_close_fn) (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+ /* Function that treats the types of FD that it knows about and calls
+ execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a
+ fallback. */
+ int (*private_ioctl_fn) (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+};
+
+/* This type of function closes FD, applying special knowledge for the FD
+ types it knows about, and calls
+ execute_close_hooks (REMAINING_LIST, PRIMARY, FD)
+ for the other FD types.
+ In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+ and PRIMARY is the "primary" method for close(). */
+typedef int (*close_hook_fn) (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+
+/* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+ Return 0 or -1, like close() would do. */
+extern int execute_close_hooks (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd);
+
+/* Execute all close hooks, with PRIMARY as "primary" method.
+ Return 0 or -1, like close() would do. */
+extern int execute_all_close_hooks (gl_close_fn primary, int fd);
+
+/* This type of function applies a control request to FD, applying special
+ knowledge for the FD types it knows about, and calls
+ execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG)
+ for the other FD types.
+ In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+ and PRIMARY is the "primary" method for ioctl(). */
+typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+ Return 0 or -1, like ioctl() would do. */
+extern int execute_ioctl_hooks (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Execute all ioctl hooks, with PRIMARY as "primary" method.
+ Return 0 or -1, like ioctl() would do. */
+extern int execute_all_ioctl_hooks (gl_ioctl_fn primary,
+ int fd, int request, void *arg);
+
+/* Add a function pair to the list of file descriptor hooks.
+ CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change.
+ The LINK variable points to a piece of memory which is guaranteed to be
+ accessible until the corresponding call to unregister_fd_hook. */
+extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook,
+ struct fd_hook *link);
+
+/* Removes a hook from the list of file descriptor hooks. */
+extern void unregister_fd_hook (struct fd_hook *link);
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FD_HOOK_H */
diff --git a/lib/fd-safer-flag.c b/lib/fd-safer-flag.c
new file mode 100644
index 0000000..8fdf8db
--- /dev/null
+++ b/lib/fd-safer-flag.c
@@ -0,0 +1,52 @@
+/* Adjust a file descriptor result so that it avoids clobbering
+ STD{IN,OUT,ERR}_FILENO, with specific flags.
+
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. If FLAG
+ contains O_CLOEXEC, the returned FD will have close-on-exec
+ semantics. On failure to duplicate, close FD, set errno, and
+ return -1. Preserve errno if FD is negative, so that the caller
+ can always inspect errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer_flag (open ("file", O_RDONLY | flag), flag). */
+
+int
+fd_safer_flag (int fd, int flag)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer_flag (fd, flag);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/lib/fd-safer.c b/lib/fd-safer.c
new file mode 100644
index 0000000..e011c00
--- /dev/null
+++ b/lib/fd-safer.c
@@ -0,0 +1,49 @@
+/* Return a safer copy of a file descriptor.
+
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+/* Return FD, unless FD would be a copy of standard input, output, or
+ error; in that case, return a duplicate of FD, closing FD. On
+ failure to duplicate, close FD, set errno, and return -1. Preserve
+ errno if FD is negative, so that the caller can always inspect
+ errno when the returned value is negative.
+
+ This function is usefully wrapped around functions that return file
+ descriptors, e.g., fd_safer (open ("file", O_RDONLY)). */
+
+int
+fd_safer (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ int f = dup_safer (fd);
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
diff --git a/lib/fdopendir.c b/lib/fdopendir.c
new file mode 100644
index 0000000..883c0c4
--- /dev/null
+++ b/lib/fdopendir.c
@@ -0,0 +1,249 @@
+/* provide a replacement fdopendir function
+ Copyright (C) 2004-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <dirent.h>
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#if !HAVE_FDOPENDIR
+
+# include "openat.h"
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+# if GNULIB_DIRENT_SAFER
+# include "dirent--.h"
+# endif
+
+# ifndef REPLACE_FCHDIR
+# define REPLACE_FCHDIR 0
+# endif
+
+static DIR *fdopendir_with_dup (int, int, struct saved_cwd const *);
+static DIR *fd_clone_opendir (int, struct saved_cwd const *);
+
+/* Replacement for POSIX fdopendir.
+
+ First, try to simulate it via opendir ("/proc/self/fd/..."). Failing
+ that, simulate it by using fchdir metadata, or by doing
+ save_cwd/fchdir/opendir(".")/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+
+ If successful, the resulting stream is based on FD in
+ implementations where streams are based on file descriptors and in
+ applications where no other thread or signal handler allocates or
+ frees file descriptors. In other cases, consult dirfd on the result
+ to find out whether FD is still being used.
+
+ Otherwise, this function works just like POSIX fdopendir.
+
+ W A R N I N G:
+
+ Unlike other fd-related functions, this one places constraints on FD.
+ If this function returns successfully, FD is under control of the
+ dirent.h system, and the caller should not close or modify the state of
+ FD other than by the dirent.h functions. */
+# ifdef __KLIBC__
+# include <InnoTekLIBC/backend.h>
+
+DIR *
+fdopendir (int fd)
+{
+ char path[_MAX_PATH];
+ DIR *dirp;
+
+ /* Get a path from fd */
+ if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+ return NULL;
+
+ dirp = opendir (path);
+ if (!dirp)
+ return NULL;
+
+ /* Unregister fd registered by opendir() */
+ _gl_unregister_dirp_fd (dirfd (dirp));
+
+ /* Register our fd */
+ if (_gl_register_dirp_fd (fd, dirp))
+ {
+ int saved_errno = errno;
+
+ closedir (dirp);
+
+ errno = saved_errno;
+
+ dirp = NULL;
+ }
+
+ return dirp;
+}
+# else
+DIR *
+fdopendir (int fd)
+{
+ DIR *dir = fdopendir_with_dup (fd, -1, NULL);
+
+ if (! REPLACE_FCHDIR && ! dir)
+ {
+ int saved_errno = errno;
+ if (EXPECTED_ERRNO (saved_errno))
+ {
+ struct saved_cwd cwd;
+ if (save_cwd (&cwd) != 0)
+ openat_save_fail (errno);
+ dir = fdopendir_with_dup (fd, -1, &cwd);
+ saved_errno = errno;
+ free_cwd (&cwd);
+ errno = saved_errno;
+ }
+ }
+
+ return dir;
+}
+# endif
+
+/* Like fdopendir, except that if OLDER_DUPFD is not -1, it is known
+ to be a dup of FD which is less than FD - 1 and which will be
+ closed by the caller and not otherwise used by the caller. This
+ function makes sure that FD is closed and all file descriptors less
+ than FD are open, and then calls fd_clone_opendir on a dup of FD.
+ That way, barring race conditions, fd_clone_opendir returns a
+ stream whose file descriptor is FD.
+
+ If REPLACE_FCHDIR or CWD is null, use opendir ("/proc/self/fd/...",
+ falling back on fchdir metadata. Otherwise, CWD is a saved version
+ of the working directory; use fchdir/opendir(".")/restore_cwd(CWD). */
+static DIR *
+fdopendir_with_dup (int fd, int older_dupfd, struct saved_cwd const *cwd)
+{
+ int dupfd = dup (fd);
+ if (dupfd < 0 && errno == EMFILE)
+ dupfd = older_dupfd;
+ if (dupfd < 0)
+ return NULL;
+ else
+ {
+ DIR *dir;
+ int saved_errno;
+ if (dupfd < fd - 1 && dupfd != older_dupfd)
+ {
+ dir = fdopendir_with_dup (fd, dupfd, cwd);
+ saved_errno = errno;
+ }
+ else
+ {
+ close (fd);
+ dir = fd_clone_opendir (dupfd, cwd);
+ saved_errno = errno;
+ if (! dir)
+ {
+ int fd1 = dup (dupfd);
+ if (fd1 != fd)
+ openat_save_fail (fd1 < 0 ? errno : EBADF);
+ }
+ }
+
+ if (dupfd != older_dupfd)
+ close (dupfd);
+ errno = saved_errno;
+ return dir;
+ }
+}
+
+/* Like fdopendir, except the result controls a clone of FD. It is
+ the caller's responsibility both to close FD and (if the result is
+ not null) to closedir the result. */
+static DIR *
+fd_clone_opendir (int fd, struct saved_cwd const *cwd)
+{
+ if (REPLACE_FCHDIR || ! cwd)
+ {
+ DIR *dir = NULL;
+ int saved_errno = EOPNOTSUPP;
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ dir = opendir (proc_file);
+ saved_errno = errno;
+ if (proc_file != buf)
+ free (proc_file);
+ }
+# if REPLACE_FCHDIR
+ if (! dir && EXPECTED_ERRNO (saved_errno))
+ {
+ char const *name = _gl_directory_name (fd);
+ DIR *dp = name ? opendir (name) : NULL;
+
+ /* The caller has done an elaborate dance to arrange for opendir to
+ consume just the right file descriptor. If dirfd returns -1,
+ though, we're on a system like mingw where opendir does not
+ consume a file descriptor. Consume it via 'dup' instead. */
+ if (dp && dirfd (dp) < 0)
+ dup (fd);
+
+ return dp;
+ }
+# endif
+ errno = saved_errno;
+ return dir;
+ }
+ else
+ {
+ if (fchdir (fd) != 0)
+ return NULL;
+ else
+ {
+ DIR *dir = opendir (".");
+ int saved_errno = errno;
+ if (restore_cwd (cwd) != 0)
+ openat_restore_fail (errno);
+ errno = saved_errno;
+ return dir;
+ }
+ }
+}
+
+#else /* HAVE_FDOPENDIR */
+
+# include <errno.h>
+# include <sys/stat.h>
+
+# undef fdopendir
+
+/* Like fdopendir, but work around GNU/Hurd bug by validating FD. */
+
+DIR *
+rpl_fdopendir (int fd)
+{
+ struct stat st;
+ if (fstat (fd, &st))
+ return NULL;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return NULL;
+ }
+ return fdopendir (fd);
+}
+
+#endif /* HAVE_FDOPENDIR */
diff --git a/lib/fflush.c b/lib/fflush.c
new file mode 100644
index 0000000..2161b22
--- /dev/null
+++ b/lib/fflush.c
@@ -0,0 +1,235 @@
+/* fflush.c -- allow flushing input streams
+ Copyright (C) 2007-2020 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+#include "unused-parameter.h"
+
+#undef fflush
+
+
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+/* GNU libc, BeOS, Haiku, Linux libc5 */
+
+/* Clear the stream's ungetc buffer, preserving the value of ftello (fp). */
+static void
+clear_ungetc_buffer_preserving_position (FILE *fp)
+{
+ if (fp->_flags & _IO_IN_BACKUP)
+ /* _IO_free_backup_area is a bit complicated. Simply call fseek. */
+ fseeko (fp, 0, SEEK_CUR);
+}
+
+#else
+
+/* Clear the stream's ungetc buffer. May modify the value of ftello (fp). */
+static void
+clear_ungetc_buffer (FILE *fp)
+{
+# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+ if (HASUB (fp))
+ {
+ fp_->_p += fp_->_r;
+ fp_->_r = 0;
+ }
+# elif defined __EMX__ /* emx+gcc */
+ if (fp->_ungetc_count > 0)
+ {
+ fp->_ungetc_count = 0;
+ fp->_rcount = - fp->_rcount;
+ }
+# elif defined _IOERR /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+ /* Nothing to do. */
+# else /* other implementations */
+ fseeko (fp, 0, SEEK_CUR);
+# endif
+}
+
+#endif
+
+#if ! (defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1)
+/* GNU libc, BeOS, Haiku, Linux libc5 */
+
+# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
+/* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+
+static int
+disable_seek_optimization (FILE *fp)
+{
+ int saved_flags = fp_->_flags & (__SOPT | __SNPT);
+ fp_->_flags = (fp_->_flags & ~__SOPT) | __SNPT;
+ return saved_flags;
+}
+
+static void
+restore_seek_optimization (FILE *fp, int saved_flags)
+{
+ fp_->_flags = (fp_->_flags & ~(__SOPT | __SNPT)) | saved_flags;
+}
+
+# else
+
+static void
+update_fpos_cache (FILE *fp _GL_UNUSED_PARAMETER,
+ off_t pos _GL_UNUSED_PARAMETER)
+{
+# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+# if defined __CYGWIN__
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ /* Use a union, since on NetBSD, the compilation flags determine
+ whether fpos_t is typedef'd to off_t or a struct containing a
+ single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+# endif
+ fp_->_flags |= __SOFF;
+# endif
+}
+# endif
+#endif
+
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported. */
+int
+rpl_fflush (FILE *stream)
+{
+ /* When stream is NULL, POSIX and C99 only require flushing of "output
+ streams and update streams in which the most recent operation was not
+ input", and all implementations do this.
+
+ When stream is "an output stream or an update stream in which the most
+ recent operation was not input", POSIX and C99 requires that fflush
+ writes out any buffered data, and all implementations do this.
+
+ When stream is, however, an input stream or an update stream in
+ which the most recent operation was input, C99 specifies nothing,
+ and POSIX only specifies behavior if the stream is seekable.
+ mingw, in particular, drops the input buffer, leaving the file
+ descriptor positioned at the end of the input buffer. I.e. ftell
+ (stream) is lost. We don't want to call the implementation's
+ fflush in this case.
+
+ We test ! freading (stream) here, rather than fwriting (stream), because
+ what we need to know is whether the stream holds a "read buffer", and on
+ mingw this is indicated by _IOREAD, regardless of _IOWRT. */
+ if (stream == NULL || ! freading (stream))
+ return fflush (stream);
+
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+
+ clear_ungetc_buffer_preserving_position (stream);
+
+ return fflush (stream);
+
+#else
+ {
+ /* What POSIX says:
+ 1) About the file-position indicator (-> fseeko, ftello):
+ The file position indicator is incremented by fgetc() and decremented
+ by ungetc():
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fgetc.html>
+ "... the fgetc() function shall ... advance the associated file
+ position indicator for the stream ..."
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ungetc.html>
+ "The file-position indicator is decremented by each successful
+ call to ungetc()..."
+ 2) fflush discards bytes pushed back by ungetc:
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
+ "...any characters pushed back onto the stream by ungetc()
+ or ungetwc() that have not subsequently been read from the
+ stream shall be discarded..."
+ This implies implicitly: fflush does not change the file position
+ indicator.
+ 3) Effects on the file descriptor, if the file descriptor is capable of
+ seeking:
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html>
+ "...the file offset of the underlying open file description shall
+ be set to the file position of the stream..." */
+
+ /* POSIX does not specify fflush behavior for non-seekable input
+ streams. Some implementations purge unread data, some return
+ EBADF, some do nothing. */
+ off_t pos = ftello (stream);
+ if (pos == -1)
+ {
+ errno = EBADF;
+ return EOF;
+ }
+
+ /* Clear the ungetc buffer. */
+ clear_ungetc_buffer (stream);
+
+ /* To get here, we must be flushing a seekable input stream, so the
+ semantics of fpurge are now appropriate to clear the buffer. To
+ avoid losing data, the lseek is also necessary. */
+ {
+ int result = fpurge (stream);
+ if (result != 0)
+ return result;
+ }
+
+# if (defined __sferror || defined __DragonFly__ || defined __ANDROID__) && defined __SNPT
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+
+ {
+ /* Disable seek optimization for the next fseeko call. This tells the
+ following fseeko call to seek to the desired position directly, rather
+ than to seek to a block-aligned boundary. */
+ int saved_flags = disable_seek_optimization (stream);
+ int result = fseeko (stream, pos, SEEK_SET);
+
+ restore_seek_optimization (stream, saved_flags);
+ return result;
+ }
+
+# else
+
+ pos = lseek (fileno (stream), pos, SEEK_SET);
+ if (pos == -1)
+ return EOF;
+ /* After a successful lseek, update the file descriptor's position cache
+ in the stream. */
+ update_fpos_cache (stream, pos);
+
+ return 0;
+
+# endif
+ }
+#endif
+}
diff --git a/lib/file-set.c b/lib/file-set.c
new file mode 100644
index 0000000..8ecfa95
--- /dev/null
+++ b/lib/file-set.c
@@ -0,0 +1,74 @@
+/* Specialized functions to manipulate a set of files.
+ Copyright (C) 2007, 2009-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+#include "file-set.h"
+
+#include "hash-triple.h"
+#include "xalloc.h"
+
+/* Record file, FILE, and dev/ino from *STATS, in the hash table, HT.
+ If HT is NULL, return immediately.
+ If memory allocation fails, exit immediately. */
+void
+record_file (Hash_table *ht, char const *file, struct stat const *stats)
+{
+ struct F_triple *ent;
+
+ if (ht == NULL)
+ return;
+
+ ent = xmalloc (sizeof *ent);
+ ent->name = xstrdup (file);
+ ent->st_ino = stats->st_ino;
+ ent->st_dev = stats->st_dev;
+
+ {
+ struct F_triple *ent_from_table = hash_insert (ht, ent);
+ if (ent_from_table == NULL)
+ {
+ /* Insertion failed due to lack of memory. */
+ xalloc_die ();
+ }
+
+ if (ent_from_table != ent)
+ {
+ /* There was already a matching entry in the table, so ENT was
+ not inserted. Free it. */
+ triple_free (ent);
+ }
+ }
+}
+
+/* Return true if there is an entry in hash table, HT,
+ for the file described by FILE and STATS. */
+bool
+seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats)
+{
+ struct F_triple new_ent;
+
+ if (ht == NULL)
+ return false;
+
+ new_ent.name = (char *) file;
+ new_ent.st_ino = stats->st_ino;
+ new_ent.st_dev = stats->st_dev;
+
+ return !!hash_lookup (ht, &new_ent);
+}
diff --git a/lib/file-set.h b/lib/file-set.h
new file mode 100644
index 0000000..8f64a45
--- /dev/null
+++ b/lib/file-set.h
@@ -0,0 +1,33 @@
+/* Very specialized set-of-files code.
+ Copyright (C) 2007-2020 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/>. */
+
+/* Written by Jim Meyering, 2007. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+#include "hash.h"
+
+extern void record_file (Hash_table *ht, char const *file,
+ struct stat const *stats)
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || defined __clang__
+ __attribute__ ((__nonnull__ (2, 3)))
+#endif
+;
+
+extern bool seen_file (Hash_table const *ht, char const *file,
+ struct stat const *stats);
diff --git a/lib/filename.h b/lib/filename.h
new file mode 100644
index 0000000..4598fb1
--- /dev/null
+++ b/lib/filename.h
@@ -0,0 +1,110 @@
+/* Basic filename support macros.
+ Copyright (C) 2001-2004, 2007-2020 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/>. */
+
+/* From Paul Eggert and Jim Meyering. */
+
+#ifndef _FILENAME_H
+#define _FILENAME_H
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Filename support.
+ ISSLASH(C) tests whether C is a directory separator
+ character.
+ HAS_DEVICE(Filename) tests whether Filename contains a device
+ specification.
+ FILE_SYSTEM_PREFIX_LEN(Filename) length of the device specification
+ at the beginning of Filename,
+ index of the part consisting of
+ alternating components and slashes.
+ FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+ 1 when a non-empty device specification
+ can be followed by an empty or relative
+ part,
+ 0 when a non-empty device specification
+ must be followed by a slash,
+ 0 when device specification don't exist.
+ IS_ABSOLUTE_FILE_NAME(Filename)
+ tests whether Filename is independent of
+ any notion of "current directory".
+ IS_RELATIVE_FILE_NAME(Filename)
+ tests whether Filename may be concatenated
+ to a directory filename.
+ Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a
+ relative file name!
+ IS_FILE_NAME_WITH_DIR(Filename) tests whether Filename contains a device
+ or directory specification.
+ */
+#if defined _WIN32 || defined __CYGWIN__ \
+ || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__
+ /* Native Windows, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+ /* Internal macro: Tests whether a character is a drive letter. */
+# define _IS_DRIVE_LETTER(C) \
+ (((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z'))
+ /* Help the compiler optimizing it. This assumes ASCII. */
+# undef _IS_DRIVE_LETTER
+# define _IS_DRIVE_LETTER(C) \
+ (((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a')
+# define HAS_DEVICE(Filename) \
+ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0)
+# ifdef __CYGWIN__
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# else
+ /* On native Windows, OS/2, DOS, the system has the notion of a
+ "current directory" on each drive. */
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
+# endif
+# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define IS_ABSOLUTE_FILE_NAME(Filename) \
+ ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)])
+# else
+# define IS_ABSOLUTE_FILE_NAME(Filename) \
+ (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))
+# endif
+# define IS_RELATIVE_FILE_NAME(Filename) \
+ (! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)))
+# define IS_FILE_NAME_WITH_DIR(Filename) \
+ (strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \
+ || HAS_DEVICE (Filename))
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define HAS_DEVICE(Filename) ((void) (Filename), 0)
+# define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0)
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+# define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0])
+# define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0]))
+# define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL)
+#endif
+
+/* Deprecated macros. For backward compatibility with old users of the
+ 'filename' module. */
+#define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME
+#define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FILENAME_H */
diff --git a/lib/filenamecat-lgpl.c b/lib/filenamecat-lgpl.c
new file mode 100644
index 0000000..7e77d35
--- /dev/null
+++ b/lib/filenamecat-lgpl.c
@@ -0,0 +1,90 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-2007, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+/* Specification. */
+#include "filenamecat.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "basename-lgpl.h"
+#include "filename.h"
+
+#if ! HAVE_MEMPCPY && ! defined mempcpy
+# define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
+#endif
+
+/* Concatenate two file name components, DIR and BASE, in
+ newly-allocated storage and return the result.
+ The resulting file name F is such that the commands "ls F" and "(cd
+ DIR; ls ./BASE)" refer to the same file. If necessary, put
+ a separator between DIR and BASE in the result. Typically this
+ separator is "/", but in rare cases it might be ".".
+ In any case, if BASE_IN_RESULT is non-NULL, set
+ *BASE_IN_RESULT to point to the copy of BASE at the end of the
+ returned concatenation.
+
+ If malloc fails, return NULL with errno set. */
+
+char *
+mfile_name_concat (char const *dir, char const *base, char **base_in_result)
+{
+ char const *dirbase = last_component (dir);
+ size_t dirbaselen = base_len (dirbase);
+ size_t dirlen = dirbase - dir + dirbaselen;
+ size_t baselen = strlen (base);
+ char sep = '\0';
+ if (dirbaselen)
+ {
+ /* DIR is not a file system root, so separate with / if needed. */
+ if (! ISSLASH (dir[dirlen - 1]) && ! ISSLASH (*base))
+ sep = '/';
+ }
+ else if (ISSLASH (*base))
+ {
+ /* DIR is a file system root and BASE begins with a slash, so
+ separate with ".". For example, if DIR is "/" and BASE is
+ "/foo" then return "/./foo", as "//foo" would be wrong on
+ some POSIX systems. A fancier algorithm could omit "." in
+ some cases but is not worth the trouble. */
+ sep = '.';
+ }
+
+ char *p_concat = malloc (dirlen + (sep != '\0') + baselen + 1);
+ if (p_concat == NULL)
+ return NULL;
+
+ {
+ char *p;
+
+ p = mempcpy (p_concat, dir, dirlen);
+ *p = sep;
+ p += sep != '\0';
+
+ if (base_in_result)
+ *base_in_result = p;
+
+ p = mempcpy (p, base, baselen);
+ *p = '\0';
+ }
+
+ return p_concat;
+}
diff --git a/lib/filenamecat.h b/lib/filenamecat.h
new file mode 100644
index 0000000..13387b4
--- /dev/null
+++ b/lib/filenamecat.h
@@ -0,0 +1,27 @@
+/* Concatenate two arbitrary file names.
+
+ Copyright (C) 1996-1997, 2003, 2005, 2007, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#if GNULIB_FILENAMECAT
+char *file_name_concat (char const *dir, char const *base,
+ char **base_in_result);
+#endif
+
+char *mfile_name_concat (char const *dir, char const *base,
+ char **base_in_result);
diff --git a/lib/findprog-in.c b/lib/findprog-in.c
new file mode 100644
index 0000000..d0505fb
--- /dev/null
+++ b/lib/findprog-in.c
@@ -0,0 +1,399 @@
+/* Locating a program in a given path.
+ Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001, 2019.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "findprog.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "filename.h"
+#include "concat-filename.h"
+
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Native Windows, OS/2, DOS */
+# define NATIVE_SLASH '\\'
+#else
+ /* Unix */
+# define NATIVE_SLASH '/'
+#endif
+
+/* Separator in PATH like lists of pathnames. */
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+ /* Native Windows, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+ /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* The list of suffixes that the execlp/execvp function tries when searching
+ for the program. */
+static const char * const suffixes[] =
+ {
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ "", ".com", ".exe", ".bat", ".cmd"
+ /* Note: Files without any suffix are not considered executable. */
+ /* Note: The cmd.exe program does a different lookup: It searches according
+ to the PATHEXT environment variable.
+ See <https://stackoverflow.com/questions/7839150/>.
+ Also, it executes files ending in .bat and .cmd directly without letting
+ the kernel interpret the program file. */
+ #elif defined __CYGWIN__
+ "", ".exe", ".com"
+ #elif defined __EMX__
+ "", ".exe"
+ #elif defined __DJGPP__
+ "", ".com", ".exe", ".bat"
+ #else /* Unix */
+ ""
+ #endif
+ };
+
+const char *
+find_in_given_path (const char *progname, const char *path,
+ const char *directory, bool optimize_for_exec)
+{
+ {
+ bool has_slash = false;
+ {
+ const char *p;
+
+ for (p = progname; *p != '\0'; p++)
+ if (ISSLASH (*p))
+ {
+ has_slash = true;
+ break;
+ }
+ }
+ if (has_slash)
+ {
+ /* If progname contains a slash, it is either absolute or relative to
+ the current directory. PATH is not used. */
+ if (optimize_for_exec)
+ /* The execl/execv/execlp/execvp functions will try the various
+ suffixes anyway and fail if no executable is found. */
+ return progname;
+ else
+ {
+ /* Try the various suffixes and see whether one of the files
+ with such a suffix is actually executable. */
+ int failure_errno;
+ size_t i;
+
+ const char *directory_as_prefix =
+ (directory != NULL && IS_RELATIVE_FILE_NAME (progname)
+ ? directory
+ : "");
+
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ const char *progbasename;
+
+ {
+ const char *p;
+
+ progbasename = progname;
+ for (p = progname; *p != '\0'; p++)
+ if (ISSLASH (*p))
+ progbasename = p + 1;
+ }
+
+ bool progbasename_has_dot = (strchr (progbasename, '.') != NULL);
+ #endif
+
+ /* Try all platform-dependent suffixes. */
+ failure_errno = ENOENT;
+ for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+ {
+ const char *suffix = suffixes[i];
+
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ /* File names without a '.' are not considered executable, and
+ for file names with a '.' no additional suffix is tried. */
+ if ((*suffix != '\0') != progbasename_has_dot)
+ #endif
+ {
+ /* Concatenate directory_as_prefix, progname, suffix. */
+ char *progpathname =
+ concatenated_filename (directory_as_prefix, progname,
+ suffix);
+
+ if (progpathname == NULL)
+ return NULL; /* errno is set here */
+
+ /* On systems which have the eaccess() system call, let's
+ use it. On other systems, let's hope that this program
+ is not installed setuid or setgid, so that it is ok to
+ call access() despite its design flaw. */
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ /* Check that the progpathname does not point to a
+ directory. */
+ struct stat statbuf;
+
+ if (stat (progpathname, &statbuf) >= 0)
+ {
+ if (! S_ISDIR (statbuf.st_mode))
+ {
+ /* Found! */
+ if (strcmp (progpathname, progname) == 0)
+ {
+ free (progpathname);
+ return progname;
+ }
+ else
+ return progpathname;
+ }
+
+ errno = EACCES;
+ }
+ }
+
+ if (errno != ENOENT)
+ failure_errno = errno;
+
+ free (progpathname);
+ }
+ }
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ if (failure_errno == ENOENT && !progbasename_has_dot)
+ {
+ /* In the loop above, we skipped suffix = "". Do this loop
+ round now, merely to provide a better errno than ENOENT. */
+
+ char *progpathname =
+ concatenated_filename (directory_as_prefix, progname, "");
+
+ if (progpathname == NULL)
+ return NULL; /* errno is set here */
+
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ struct stat statbuf;
+
+ if (stat (progpathname, &statbuf) >= 0)
+ {
+ if (! S_ISDIR (statbuf.st_mode))
+ errno = ENOEXEC;
+ else
+ errno = EACCES;
+ }
+ }
+
+ failure_errno = errno;
+
+ free (progpathname);
+ }
+ #endif
+
+ errno = failure_errno;
+ return NULL;
+ }
+ }
+ }
+
+ if (path == NULL)
+ /* If PATH is not set, the default search path is implementation dependent.
+ In practice, it is treated like an empty PATH. */
+ path = "";
+
+ {
+ /* Make a copy, to prepare for destructive modifications. */
+ char *path_copy = strdup (path);
+ if (path_copy == NULL)
+ return NULL; /* errno is set here */
+
+ int failure_errno;
+ char *path_rest;
+ char *cp;
+
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ bool progname_has_dot = (strchr (progname, '.') != NULL);
+ #endif
+
+ failure_errno = ENOENT;
+ for (path_rest = path_copy; ; path_rest = cp + 1)
+ {
+ const char *dir;
+ bool last;
+ char *dir_as_prefix_to_free;
+ const char *dir_as_prefix;
+ size_t i;
+
+ /* Extract next directory in PATH. */
+ dir = path_rest;
+ for (cp = path_rest; *cp != '\0' && *cp != PATH_SEPARATOR; cp++)
+ ;
+ last = (*cp == '\0');
+ *cp = '\0';
+
+ /* Empty PATH components designate the current directory. */
+ if (dir == cp)
+ dir = ".";
+
+ /* Concatenate directory and dir. */
+ if (directory != NULL && IS_RELATIVE_FILE_NAME (dir))
+ {
+ dir_as_prefix_to_free =
+ concatenated_filename (directory, dir, NULL);
+ if (dir_as_prefix_to_free == NULL)
+ {
+ /* errno is set here. */
+ failure_errno = errno;
+ goto failed;
+ }
+ dir_as_prefix = dir_as_prefix_to_free;
+ }
+ else
+ {
+ dir_as_prefix_to_free = NULL;
+ dir_as_prefix = dir;
+ }
+
+ /* Try all platform-dependent suffixes. */
+ for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+ {
+ const char *suffix = suffixes[i];
+
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ /* File names without a '.' are not considered executable, and
+ for file names with a '.' no additional suffix is tried. */
+ if ((*suffix != '\0') != progname_has_dot)
+ #endif
+ {
+ /* Concatenate dir_as_prefix, progname, and suffix. */
+ char *progpathname =
+ concatenated_filename (dir_as_prefix, progname, suffix);
+
+ if (progpathname == NULL)
+ {
+ /* errno is set here. */
+ failure_errno = errno;
+ free (dir_as_prefix_to_free);
+ goto failed;
+ }
+
+ /* On systems which have the eaccess() system call, let's
+ use it. On other systems, let's hope that this program
+ is not installed setuid or setgid, so that it is ok to
+ call access() despite its design flaw. */
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ /* Check that the progpathname does not point to a
+ directory. */
+ struct stat statbuf;
+
+ if (stat (progpathname, &statbuf) >= 0)
+ {
+ if (! S_ISDIR (statbuf.st_mode))
+ {
+ /* Found! */
+ if (strcmp (progpathname, progname) == 0)
+ {
+ free (progpathname);
+
+ /* Add the "./" prefix for real, that
+ concatenated_filename() optimized away.
+ This avoids a second PATH search when the
+ caller uses execl/execv/execlp/execvp. */
+ progpathname =
+ (char *) malloc (2 + strlen (progname) + 1);
+ if (progpathname == NULL)
+ {
+ /* errno is set here. */
+ failure_errno = errno;
+ free (dir_as_prefix_to_free);
+ goto failed;
+ }
+ progpathname[0] = '.';
+ progpathname[1] = NATIVE_SLASH;
+ memcpy (progpathname + 2, progname,
+ strlen (progname) + 1);
+ }
+
+ free (dir_as_prefix_to_free);
+ free (path_copy);
+ return progpathname;
+ }
+
+ errno = EACCES;
+ }
+ }
+
+ if (errno != ENOENT)
+ failure_errno = errno;
+
+ free (progpathname);
+ }
+ }
+ #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+ if (failure_errno == ENOENT && !progname_has_dot)
+ {
+ /* In the loop above, we skipped suffix = "". Do this loop
+ round now, merely to provide a better errno than ENOENT. */
+
+ char *progpathname =
+ concatenated_filename (dir_as_prefix, progname, "");
+
+ if (progpathname == NULL)
+ {
+ /* errno is set here. */
+ failure_errno = errno;
+ free (dir_as_prefix_to_free);
+ goto failed;
+ }
+
+ if (eaccess (progpathname, X_OK) == 0)
+ {
+ struct stat statbuf;
+
+ if (stat (progpathname, &statbuf) >= 0)
+ {
+ if (! S_ISDIR (statbuf.st_mode))
+ errno = ENOEXEC;
+ else
+ errno = EACCES;
+ }
+ }
+
+ failure_errno = errno;
+
+ free (progpathname);
+ }
+ #endif
+
+ free (dir_as_prefix_to_free);
+
+ if (last)
+ break;
+ }
+
+ failed:
+ /* Not found in PATH. */
+ free (path_copy);
+
+ errno = failure_errno;
+ return NULL;
+ }
+}
diff --git a/lib/findprog.h b/lib/findprog.h
new file mode 100644
index 0000000..6e21aa2
--- /dev/null
+++ b/lib/findprog.h
@@ -0,0 +1,77 @@
+/* Locating a program in PATH.
+ Copyright (C) 2001-2003, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _FINDPROG_H
+#define _FINDPROG_H
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Looks up a program in the PATH.
+ Attempts to determine the pathname that would be called by execlp/execvp
+ of PROGNAME. If successful, it returns a pathname containing a slash
+ (either absolute or relative to the current directory). Otherwise, it
+ returns PROGNAME unmodified.
+ Because of the latter case, callers should use execlp/execvp, not
+ execl/execv on the returned pathname.
+ The returned string is freshly malloc()ed if it is != PROGNAME. */
+extern const char *find_in_path (const char *progname);
+
+/* Looks up a program in the given PATH-like string.
+
+ The PATH argument consists of a list of directories, separated by ':' or
+ (on native Windows) by ';'. An empty PATH element designates the current
+ directory. A null PATH is equivalent to an empty PATH, that is, to the
+ singleton list that contains only the current directory.
+
+ If DIRECTORY is not NULL, all relative filenames (i.e. PROGNAME when it
+ contains a slash, and the PATH elements) are considered relative to
+ DIRECTORY instead of relative to the current directory of this process.
+
+ Determines the pathname that would be called by execlp/execvp of PROGNAME.
+ - If successful, it returns a pathname containing a slash (either absolute
+ or relative to the current directory). The returned string can be used
+ with either execl/execv or execlp/execvp. It is freshly malloc()ed if it
+ is != PROGNAME.
+ - Otherwise, it sets errno and returns NULL.
+ Specific errno values include:
+ - ENOENT: means that the program's file was not found.
+ - EACCES: means that the program's file cannot be accessed (due to some
+ issue with one of the ancestor directories) or lacks the execute
+ permissions.
+ - ENOMEM: means out of memory.
+ If OPTIMIZE_FOR_EXEC is true, the function saves some work, under the
+ assumption that the resulting pathname will not be accessed directly,
+ only through execl/execv or execlp/execvp.
+
+ Here, a "slash" means:
+ - On POSIX systems excluding Cygwin: a '/',
+ - On Windows, OS/2, DOS platforms: a '/' or '\'. */
+extern const char *find_in_given_path (const char *progname, const char *path,
+ const char *directory,
+ bool optimize_for_exec);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FINDPROG_H */
diff --git a/lib/flexmember.h b/lib/flexmember.h
new file mode 100644
index 0000000..0dc77c3
--- /dev/null
+++ b/lib/flexmember.h
@@ -0,0 +1,60 @@
+/* Sizes of structs with flexible array members.
+
+ Copyright 2016-2020 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>.
+
+ Written by Paul Eggert. */
+
+#include <stddef.h>
+
+/* Nonzero multiple of alignment of TYPE, suitable for FLEXSIZEOF below.
+ On older platforms without _Alignof, use a pessimistic bound that is
+ safe in practice even if FLEXIBLE_ARRAY_MEMBER is 1.
+ On newer platforms, use _Alignof to get a tighter bound. */
+
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
+# define FLEXALIGNOF(type) (sizeof (type) & ~ (sizeof (type) - 1))
+#else
+# define FLEXALIGNOF(type) _Alignof (type)
+#endif
+
+/* Yield a properly aligned upper bound on the size of a struct of
+ type TYPE with a flexible array member named MEMBER that is
+ followed by N bytes of other data. The result is suitable as an
+ argument to malloc. For example:
+
+ struct s { int n; char d[FLEXIBLE_ARRAY_MEMBER]; };
+ struct s *p = malloc (FLEXSIZEOF (struct s, d, n * sizeof (char)));
+
+ FLEXSIZEOF (TYPE, MEMBER, N) is not simply (sizeof (TYPE) + N),
+ since FLEXIBLE_ARRAY_MEMBER may be 1 on pre-C11 platforms. Nor is
+ it simply (offsetof (TYPE, MEMBER) + N), as that might yield a size
+ that causes malloc to yield a pointer that is not properly aligned
+ for TYPE; for example, if sizeof (int) == alignof (int) == 4,
+ malloc (offsetof (struct s, d) + 3 * sizeof (char)) is equivalent
+ to malloc (7) and might yield a pointer that is not a multiple of 4
+ (which means the pointer is not properly aligned for struct s),
+ whereas malloc (FLEXSIZEOF (struct s, d, 3 * sizeof (char))) is
+ equivalent to malloc (8) and must yield a pointer that is a
+ multiple of 4.
+
+ Yield a value less than N if and only if arithmetic overflow occurs. */
+
+#define FLEXSIZEOF(type, member, n) \
+ ((offsetof (type, member) + FLEXALIGNOF (type) - 1 + (n)) \
+ & ~ (FLEXALIGNOF (type) - 1))
diff --git a/lib/float+.h b/lib/float+.h
new file mode 100644
index 0000000..1e19a71
--- /dev/null
+++ b/lib/float+.h
@@ -0,0 +1,147 @@
+/* Supplemental information about the floating-point formats.
+ Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2007.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _FLOATPLUS_H
+#define _FLOATPLUS_H
+
+#include <float.h>
+#include <limits.h>
+
+/* Number of bits in the mantissa of a floating-point number, including the
+ "hidden bit". */
+#if FLT_RADIX == 2
+# define FLT_MANT_BIT FLT_MANT_DIG
+# define DBL_MANT_BIT DBL_MANT_DIG
+# define LDBL_MANT_BIT LDBL_MANT_DIG
+#elif FLT_RADIX == 4
+# define FLT_MANT_BIT (FLT_MANT_DIG * 2)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 2)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 2)
+#elif FLT_RADIX == 16
+# define FLT_MANT_BIT (FLT_MANT_DIG * 4)
+# define DBL_MANT_BIT (DBL_MANT_DIG * 4)
+# define LDBL_MANT_BIT (LDBL_MANT_DIG * 4)
+#endif
+
+/* Bit mask that can be used to mask the exponent, as an unsigned number. */
+#define FLT_EXP_MASK ((FLT_MAX_EXP - FLT_MIN_EXP) | 7)
+#define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+#define LDBL_EXP_MASK ((LDBL_MAX_EXP - LDBL_MIN_EXP) | 7)
+
+/* Number of bits used for the exponent of a floating-point number, including
+ the exponent's sign. */
+#define FLT_EXP_BIT \
+ (FLT_EXP_MASK < 0x100 ? 8 : \
+ FLT_EXP_MASK < 0x200 ? 9 : \
+ FLT_EXP_MASK < 0x400 ? 10 : \
+ FLT_EXP_MASK < 0x800 ? 11 : \
+ FLT_EXP_MASK < 0x1000 ? 12 : \
+ FLT_EXP_MASK < 0x2000 ? 13 : \
+ FLT_EXP_MASK < 0x4000 ? 14 : \
+ FLT_EXP_MASK < 0x8000 ? 15 : \
+ FLT_EXP_MASK < 0x10000 ? 16 : \
+ FLT_EXP_MASK < 0x20000 ? 17 : \
+ FLT_EXP_MASK < 0x40000 ? 18 : \
+ FLT_EXP_MASK < 0x80000 ? 19 : \
+ FLT_EXP_MASK < 0x100000 ? 20 : \
+ FLT_EXP_MASK < 0x200000 ? 21 : \
+ FLT_EXP_MASK < 0x400000 ? 22 : \
+ FLT_EXP_MASK < 0x800000 ? 23 : \
+ FLT_EXP_MASK < 0x1000000 ? 24 : \
+ FLT_EXP_MASK < 0x2000000 ? 25 : \
+ FLT_EXP_MASK < 0x4000000 ? 26 : \
+ FLT_EXP_MASK < 0x8000000 ? 27 : \
+ FLT_EXP_MASK < 0x10000000 ? 28 : \
+ FLT_EXP_MASK < 0x20000000 ? 29 : \
+ FLT_EXP_MASK < 0x40000000 ? 30 : \
+ FLT_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define DBL_EXP_BIT \
+ (DBL_EXP_MASK < 0x100 ? 8 : \
+ DBL_EXP_MASK < 0x200 ? 9 : \
+ DBL_EXP_MASK < 0x400 ? 10 : \
+ DBL_EXP_MASK < 0x800 ? 11 : \
+ DBL_EXP_MASK < 0x1000 ? 12 : \
+ DBL_EXP_MASK < 0x2000 ? 13 : \
+ DBL_EXP_MASK < 0x4000 ? 14 : \
+ DBL_EXP_MASK < 0x8000 ? 15 : \
+ DBL_EXP_MASK < 0x10000 ? 16 : \
+ DBL_EXP_MASK < 0x20000 ? 17 : \
+ DBL_EXP_MASK < 0x40000 ? 18 : \
+ DBL_EXP_MASK < 0x80000 ? 19 : \
+ DBL_EXP_MASK < 0x100000 ? 20 : \
+ DBL_EXP_MASK < 0x200000 ? 21 : \
+ DBL_EXP_MASK < 0x400000 ? 22 : \
+ DBL_EXP_MASK < 0x800000 ? 23 : \
+ DBL_EXP_MASK < 0x1000000 ? 24 : \
+ DBL_EXP_MASK < 0x2000000 ? 25 : \
+ DBL_EXP_MASK < 0x4000000 ? 26 : \
+ DBL_EXP_MASK < 0x8000000 ? 27 : \
+ DBL_EXP_MASK < 0x10000000 ? 28 : \
+ DBL_EXP_MASK < 0x20000000 ? 29 : \
+ DBL_EXP_MASK < 0x40000000 ? 30 : \
+ DBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+#define LDBL_EXP_BIT \
+ (LDBL_EXP_MASK < 0x100 ? 8 : \
+ LDBL_EXP_MASK < 0x200 ? 9 : \
+ LDBL_EXP_MASK < 0x400 ? 10 : \
+ LDBL_EXP_MASK < 0x800 ? 11 : \
+ LDBL_EXP_MASK < 0x1000 ? 12 : \
+ LDBL_EXP_MASK < 0x2000 ? 13 : \
+ LDBL_EXP_MASK < 0x4000 ? 14 : \
+ LDBL_EXP_MASK < 0x8000 ? 15 : \
+ LDBL_EXP_MASK < 0x10000 ? 16 : \
+ LDBL_EXP_MASK < 0x20000 ? 17 : \
+ LDBL_EXP_MASK < 0x40000 ? 18 : \
+ LDBL_EXP_MASK < 0x80000 ? 19 : \
+ LDBL_EXP_MASK < 0x100000 ? 20 : \
+ LDBL_EXP_MASK < 0x200000 ? 21 : \
+ LDBL_EXP_MASK < 0x400000 ? 22 : \
+ LDBL_EXP_MASK < 0x800000 ? 23 : \
+ LDBL_EXP_MASK < 0x1000000 ? 24 : \
+ LDBL_EXP_MASK < 0x2000000 ? 25 : \
+ LDBL_EXP_MASK < 0x4000000 ? 26 : \
+ LDBL_EXP_MASK < 0x8000000 ? 27 : \
+ LDBL_EXP_MASK < 0x10000000 ? 28 : \
+ LDBL_EXP_MASK < 0x20000000 ? 29 : \
+ LDBL_EXP_MASK < 0x40000000 ? 30 : \
+ LDBL_EXP_MASK <= 0x7fffffff ? 31 : \
+ 32)
+
+/* Number of bits used for a floating-point number: the mantissa (not
+ counting the "hidden bit", since it may or may not be explicit), the
+ exponent, and the sign. */
+#define FLT_TOTAL_BIT ((FLT_MANT_BIT - 1) + FLT_EXP_BIT + 1)
+#define DBL_TOTAL_BIT ((DBL_MANT_BIT - 1) + DBL_EXP_BIT + 1)
+#define LDBL_TOTAL_BIT ((LDBL_MANT_BIT - 1) + LDBL_EXP_BIT + 1)
+
+/* Number of bytes used for a floating-point number.
+ This can be smaller than the 'sizeof'. For example, on i386 systems,
+ 'long double' most often have LDBL_MANT_BIT = 64, LDBL_EXP_BIT = 16, hence
+ LDBL_TOTAL_BIT = 80 bits, i.e. 10 bytes of consecutive memory, but
+ sizeof (long double) = 12 or = 16. */
+#define SIZEOF_FLT ((FLT_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_DBL ((DBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
+
+/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
+typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
+typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
+typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
+
+#endif /* _FLOATPLUS_H */
diff --git a/lib/float.c b/lib/float.c
new file mode 100644
index 0000000..af20b0a
--- /dev/null
+++ b/lib/float.c
@@ -0,0 +1,33 @@
+/* Auxiliary definitions for <float.h>.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
+#elif defined __i386__
+const union gl_long_double_union gl_LDBL_MAX =
+ { { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
+#else
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+#endif
diff --git a/lib/float.in.h b/lib/float.in.h
new file mode 100644
index 0000000..6b57ce6
--- /dev/null
+++ b/lib/float.in.h
@@ -0,0 +1,194 @@
+/* A correct <float.h>.
+
+ Copyright (C) 2007-2020 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/>. */
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
+
+#ifndef _@GUARD_PREFIX@_FLOAT_H
+#define _@GUARD_PREFIX@_FLOAT_H
+
+/* 'long double' properties. */
+
+#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.0842021724855044340E-19L
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.3621031431120935063E-4932L
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+# define LDBL_MAX 1.1897314953572317650E+4932L
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
+ precision in the compiler but 64 bits of precision at runtime. See
+ <https://lists.gnu.org/r/bug-gnulib/2008-07/msg00063.html>. */
+#if defined __i386__ && (defined __FreeBSD__ || defined __DragonFly__)
+/* Number of mantissa units, in base FLT_RADIX. */
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 64
+/* Number of decimal digits that is sufficient for representing a number. */
+# undef LDBL_DIG
+# define LDBL_DIG 18
+/* x-1 where x is the smallest representable number > 1. */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
+/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP (-16381)
+/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
+# undef LDBL_MAX_EXP
+# define LDBL_MAX_EXP 16384
+/* Minimum positive normalized number. */
+# undef LDBL_MIN
+# define LDBL_MIN 3.362103143112093506262677817321752E-4932L /* = 0x1p-16382L */
+/* Maximum representable finite number. */
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
+ But the largest literal that GCC allows us to write is
+ 0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
+ So, define it like this through a reference to an external variable
+
+ const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
+ extern const long double LDBL_MAX;
+
+ Unfortunately, this is not a constant expression. */
+# if !GNULIB_defined_long_double_union
+union gl_long_double_union
+ {
+ struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
+ long double ld;
+ };
+# define GNULIB_defined_long_double_union 1
+# endif
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+/* Minimum e such that 10^e is in the range of normalized numbers. */
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP (-4931)
+/* Maximum e such that 10^e is in the range of representable finite numbers. */
+# undef LDBL_MAX_10_EXP
+# define LDBL_MAX_10_EXP 4932
+#endif
+
+/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
+ wrong.
+ On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
+#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+#endif
+#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
+# undef LDBL_MAX
+/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
+ It is not easy to define:
+ #define LDBL_MAX 1.79769313486231580793728971405302307166e308L
+ is too small, whereas
+ #define LDBL_MAX 1.79769313486231580793728971405302307167e308L
+ is too large. Apparently a bug in GCC decimal-to-binary conversion.
+ Also, I can't get values larger than
+ #define LDBL63 ((long double) (1ULL << 63))
+ #define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
+ #define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
+ which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
+ So, define it like this through a reference to an external variable
+
+ const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
+ extern const long double LDBL_MAX;
+
+ or through a pointer cast
+
+ #define LDBL_MAX \
+ (*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
+
+ Unfortunately, this is not a constant expression, and the latter expression
+ does not work well when GCC is optimizing.. */
+# if !GNULIB_defined_long_double_union
+union gl_long_double_union
+ {
+ struct { double hi; double lo; } dd;
+ long double ld;
+ };
+# define GNULIB_defined_long_double_union 1
+# endif
+extern const union gl_long_double_union gl_LDBL_MAX;
+# define LDBL_MAX (gl_LDBL_MAX.ld)
+#endif
+
+/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
+ On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
+ are wrong. */
+#if defined __sgi && (LDBL_MANT_DIG >= 106)
+# undef LDBL_MANT_DIG
+# define LDBL_MANT_DIG 106
+# if defined __GNUC__
+# undef LDBL_MIN_EXP
+# define LDBL_MIN_EXP DBL_MIN_EXP
+# undef LDBL_MIN_10_EXP
+# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
+# undef LDBL_MIN
+# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
+# undef LDBL_EPSILON
+# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
+# endif
+#endif
+
+#if @REPLACE_ITOLD@
+/* Pull in a function that fixes the 'int' to 'long double' conversion
+ of glibc 2.7. */
+extern
+# ifdef __cplusplus
+"C"
+# endif
+void _Qp_itoq (long double *, int);
+static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
+#endif
+
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
+#endif /* _@GUARD_PREFIX@_FLOAT_H */
diff --git a/lib/flock.c b/lib/flock.c
new file mode 100644
index 0000000..fe1c813
--- /dev/null
+++ b/lib/flock.c
@@ -0,0 +1,224 @@
+/* Emulate flock on platforms that lack it, primarily Windows and MinGW.
+
+ This is derived from sqlite3 sources.
+ https://www.sqlite.org/src/finfo?name=src/os_win.c
+ https://www.sqlite.org/copyright.html
+
+ Written by Richard W.M. Jones <rjones.at.redhat.com>
+
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+
+ This library 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 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
+ 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/>. */
+
+#include <config.h>
+#include <sys/file.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* LockFileEx */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include <errno.h>
+
+/* _get_osfhandle */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Determine the current size of a file. Because the other braindead
+ * APIs we'll call need lower/upper 32 bit pairs, keep the file size
+ * like that too.
+ */
+static BOOL
+file_size (HANDLE h, DWORD * lower, DWORD * upper)
+{
+ *lower = GetFileSize (h, upper);
+ return 1;
+}
+
+/* LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. */
+# ifndef LOCKFILE_FAIL_IMMEDIATELY
+# define LOCKFILE_FAIL_IMMEDIATELY 1
+# endif
+
+/* Acquire a lock. */
+static BOOL
+do_lock (HANDLE h, int non_blocking, int exclusive)
+{
+ BOOL res;
+ DWORD size_lower, size_upper;
+ OVERLAPPED ovlp;
+ int flags = 0;
+
+ /* We're going to lock the whole file, so get the file size. */
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ /* Start offset is 0, and also zero the remaining members of this struct. */
+ memset (&ovlp, 0, sizeof ovlp);
+
+ if (non_blocking)
+ flags |= LOCKFILE_FAIL_IMMEDIATELY;
+ if (exclusive)
+ flags |= LOCKFILE_EXCLUSIVE_LOCK;
+
+ return LockFileEx (h, flags, 0, size_lower, size_upper, &ovlp);
+}
+
+/* Unlock reader or exclusive lock. */
+static BOOL
+do_unlock (HANDLE h)
+{
+ int res;
+ DWORD size_lower, size_upper;
+
+ res = file_size (h, &size_lower, &size_upper);
+ if (!res)
+ return 0;
+
+ return UnlockFile (h, 0, 0, size_lower, size_upper);
+}
+
+/* Now our BSD-like flock operation. */
+int
+flock (int fd, int operation)
+{
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD res;
+ int non_blocking;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ non_blocking = operation & LOCK_NB;
+ operation &= ~LOCK_NB;
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ res = do_lock (h, non_blocking, 0);
+ break;
+ case LOCK_EX:
+ res = do_lock (h, non_blocking, 1);
+ break;
+ case LOCK_UN:
+ res = do_unlock (h);
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Map Windows errors into Unix errnos. As usual MSDN fails to
+ * document the permissible error codes.
+ */
+ if (!res)
+ {
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ /* This means someone else is holding a lock. */
+ case ERROR_LOCK_VIOLATION:
+ errno = EAGAIN;
+ break;
+
+ /* Out of memory. */
+ case ERROR_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_BAD_COMMAND:
+ errno = EINVAL;
+ break;
+
+ /* Unlikely to be other errors, but at least don't lose the
+ * error code.
+ */
+ default:
+ errno = err;
+ }
+
+ return -1;
+ }
+
+ return 0;
+}
+
+#else /* !Windows */
+
+# ifdef HAVE_STRUCT_FLOCK_L_TYPE
+/* We know how to implement flock in terms of fcntl. */
+
+# include <fcntl.h>
+
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+# include <errno.h>
+# include <string.h>
+
+int
+flock (int fd, int operation)
+{
+ int cmd, r;
+ struct flock fl;
+
+ if (operation & LOCK_NB)
+ cmd = F_SETLK;
+ else
+ cmd = F_SETLKW;
+ operation &= ~LOCK_NB;
+
+ memset (&fl, 0, sizeof fl);
+ fl.l_whence = SEEK_SET;
+ /* l_start & l_len are 0, which as a special case means "whole file". */
+
+ switch (operation)
+ {
+ case LOCK_SH:
+ fl.l_type = F_RDLCK;
+ break;
+ case LOCK_EX:
+ fl.l_type = F_WRLCK;
+ break;
+ case LOCK_UN:
+ fl.l_type = F_UNLCK;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+
+ r = fcntl (fd, cmd, &fl);
+ if (r == -1 && errno == EACCES)
+ errno = EAGAIN;
+
+ return r;
+}
+
+# else /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+# error "This platform lacks flock function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+# endif /* !HAVE_STRUCT_FLOCK_L_TYPE */
+
+#endif /* !Windows */
diff --git a/lib/fnmatch.c b/lib/fnmatch.c
new file mode 100644
index 0000000..90d2a10
--- /dev/null
+++ b/lib/fnmatch.c
@@ -0,0 +1,361 @@
+/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <fnmatch.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#if defined _LIBC || HAVE_ALLOCA
+# include <alloca.h>
+#endif
+#include <wchar.h>
+#include <wctype.h>
+#include <stddef.h>
+#include <stdbool.h>
+
+/* We need some of the locale data (the collation sequence information)
+ but there is no interface to get this information in general. Therefore
+ we support a correct implementation only in glibc. */
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# include "../locale/coll-lookup.h"
+# include <shlib-compat.h>
+
+# define CONCAT(a,b) __CONCAT(a,b)
+# define btowc __btowc
+# define iswctype __iswctype
+# define mbsrtowcs __mbsrtowcs
+# define mempcpy __mempcpy
+# define strnlen __strnlen
+# define towlower __towlower
+# define wcscat __wcscat
+# define wcslen __wcslen
+# define wctype __wctype
+# define wmemchr __wmemchr
+# define wmempcpy __wmempcpy
+# define fnmatch __fnmatch
+extern int fnmatch (const char *pattern, const char *string, int flags);
+#endif
+
+#ifdef _LIBC
+# if (__GNUC__ >= 7) || (__clang_major__ >= 10)
+# define FALLTHROUGH __attribute__ ((__fallthrough__))
+# else
+# define FALLTHROUGH ((void) 0)
+# endif
+#else
+# include "attribute.h"
+#endif
+
+#include <intprops.h>
+#include <flexmember.h>
+
+#ifdef _LIBC
+typedef ptrdiff_t idx_t;
+#else
+# include "idx.h"
+#endif
+
+/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set. */
+#define NO_LEADING_PERIOD(flags) \
+ ((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
+
+#ifndef _LIBC
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* Just use malloc. */
+# define __libc_use_alloca(n) false
+# undef alloca
+# define alloca(n) malloc (n)
+# endif
+# define alloca_account(size, avar) ((avar) += (size), alloca (size))
+#endif
+
+/* Provide support for user-defined character classes, based on the functions
+ from ISO C 90 amendment 1. */
+#ifdef CHARCLASS_NAME_MAX
+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+#else
+/* This shouldn't happen but some implementation might still have this
+ problem. Use a reasonable default value. */
+# define CHAR_CLASS_MAX_LENGTH 256
+#endif
+
+#define IS_CHAR_CLASS(string) wctype (string)
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+/* Global variable. */
+static int posixly_correct;
+
+/* Note that this evaluates C many times. */
+#define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+#define CHAR char
+#define UCHAR unsigned char
+#define INT int
+#define FCT internal_fnmatch
+#define EXT ext_match
+#define END end_pattern
+#define STRUCT fnmatch_struct
+#define L_(CS) CS
+#define BTOWC(C) btowc (C)
+#define STRLEN(S) strlen (S)
+#define STRCAT(D, S) strcat (D, S)
+#define MEMPCPY(D, S, N) mempcpy (D, S, N)
+#define MEMCHR(S, C, N) memchr (S, C, N)
+#define WIDE_CHAR_VERSION 0
+#ifdef _LIBC
+# include <locale/weight.h>
+# define FINDIDX findidx
+#endif
+#include "fnmatch_loop.c"
+
+
+#define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c))
+#define CHAR wchar_t
+#define UCHAR wint_t
+#define INT wint_t
+#define FCT internal_fnwmatch
+#define EXT ext_wmatch
+#define END end_wpattern
+#define L_(CS) L##CS
+#define BTOWC(C) (C)
+#define STRLEN(S) wcslen (S)
+#define STRCAT(D, S) wcscat (D, S)
+#define MEMPCPY(D, S, N) wmempcpy (D, S, N)
+#define MEMCHR(S, C, N) wmemchr (S, C, N)
+#define WIDE_CHAR_VERSION 1
+#ifdef _LIBC
+/* Change the name the header defines so it doesn't conflict with
+ the <locale/weight.h> version included above. */
+# define findidx findidxwc
+# include <locale/weightwc.h>
+# undef findidx
+# define FINDIDX findidxwc
+#endif
+
+#undef IS_CHAR_CLASS
+/* We have to convert the wide character string in a multibyte string. But
+ we know that the character class names consist of alphanumeric characters
+ from the portable character set, and since the wide character encoding
+ for a member of the portable character set is the same code point as
+ its single-byte encoding, we can use a simplified method to convert the
+ string to a multibyte character string. */
+static wctype_t
+is_char_class (const wchar_t *wcs)
+{
+ char s[CHAR_CLASS_MAX_LENGTH + 1];
+ char *cp = s;
+
+ do
+ {
+ /* Test for a printable character from the portable character set. */
+#ifdef _LIBC
+ if (*wcs < 0x20 || *wcs > 0x7e
+ || *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
+ return (wctype_t) 0;
+#else
+ switch (*wcs)
+ {
+ case L' ': case L'!': case L'"': case L'#': case L'%':
+ case L'&': case L'\'': case L'(': case L')': case L'*':
+ case L'+': case L',': case L'-': case L'.': case L'/':
+ case L'0': case L'1': case L'2': case L'3': case L'4':
+ case L'5': case L'6': case L'7': case L'8': case L'9':
+ case L':': case L';': case L'<': case L'=': case L'>':
+ case L'?':
+ case L'A': case L'B': case L'C': case L'D': case L'E':
+ case L'F': case L'G': case L'H': case L'I': case L'J':
+ case L'K': case L'L': case L'M': case L'N': case L'O':
+ case L'P': case L'Q': case L'R': case L'S': case L'T':
+ case L'U': case L'V': case L'W': case L'X': case L'Y':
+ case L'Z':
+ case L'[': case L'\\': case L']': case L'^': case L'_':
+ case L'a': case L'b': case L'c': case L'd': case L'e':
+ case L'f': case L'g': case L'h': case L'i': case L'j':
+ case L'k': case L'l': case L'm': case L'n': case L'o':
+ case L'p': case L'q': case L'r': case L's': case L't':
+ case L'u': case L'v': case L'w': case L'x': case L'y':
+ case L'z': case L'{': case L'|': case L'}': case L'~':
+ break;
+ default:
+ return (wctype_t) 0;
+ }
+#endif
+
+ /* Avoid overrunning the buffer. */
+ if (cp == s + CHAR_CLASS_MAX_LENGTH)
+ return (wctype_t) 0;
+
+ *cp++ = (char) *wcs++;
+ }
+ while (*wcs != L'\0');
+
+ *cp = '\0';
+
+ return wctype (s);
+}
+#define IS_CHAR_CLASS(string) is_char_class (string)
+
+#include "fnmatch_loop.c"
+
+
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+ if (__glibc_unlikely (MB_CUR_MAX != 1))
+ {
+ mbstate_t ps;
+ size_t n;
+ const char *p;
+ wchar_t *wpattern_malloc = NULL;
+ wchar_t *wpattern;
+ wchar_t *wstring_malloc = NULL;
+ wchar_t *wstring;
+ size_t alloca_used = 0;
+
+ /* Convert the strings into wide characters. */
+ memset (&ps, '\0', sizeof (ps));
+ p = pattern;
+ n = strnlen (pattern, 1024);
+ if (__glibc_likely (n < 1024))
+ {
+ wpattern = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
+ alloca_used);
+ n = mbsrtowcs (wpattern, &p, n + 1, &ps);
+ if (__glibc_unlikely (n == (size_t) -1))
+ /* Something wrong.
+ XXX Do we have to set 'errno' to something which mbsrtows hasn't
+ already done? */
+ return -1;
+ if (p)
+ {
+ memset (&ps, '\0', sizeof (ps));
+ goto prepare_wpattern;
+ }
+ }
+ else
+ {
+ prepare_wpattern:
+ n = mbsrtowcs (NULL, &pattern, 0, &ps);
+ if (__glibc_unlikely (n == (size_t) -1))
+ /* Something wrong.
+ XXX Do we have to set 'errno' to something which mbsrtows hasn't
+ already done? */
+ return -1;
+ if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
+ {
+ __set_errno (ENOMEM);
+ return -2;
+ }
+ wpattern_malloc = wpattern
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
+ assert (mbsinit (&ps));
+ if (wpattern == NULL)
+ return -2;
+ (void) mbsrtowcs (wpattern, &pattern, n + 1, &ps);
+ }
+
+ assert (mbsinit (&ps));
+ n = strnlen (string, 1024);
+ p = string;
+ if (__glibc_likely (n < 1024))
+ {
+ wstring = (wchar_t *) alloca_account ((n + 1) * sizeof (wchar_t),
+ alloca_used);
+ n = mbsrtowcs (wstring, &p, n + 1, &ps);
+ if (__glibc_unlikely (n == (size_t) -1))
+ {
+ /* Something wrong.
+ XXX Do we have to set 'errno' to something which
+ mbsrtows hasn't already done? */
+ free_return:
+ free (wpattern_malloc);
+ return -1;
+ }
+ if (p)
+ {
+ memset (&ps, '\0', sizeof (ps));
+ goto prepare_wstring;
+ }
+ }
+ else
+ {
+ prepare_wstring:
+ n = mbsrtowcs (NULL, &string, 0, &ps);
+ if (__glibc_unlikely (n == (size_t) -1))
+ /* Something wrong.
+ XXX Do we have to set 'errno' to something which mbsrtows hasn't
+ already done? */
+ goto free_return;
+ if (__glibc_unlikely (n >= (size_t) -1 / sizeof (wchar_t)))
+ {
+ free (wpattern_malloc);
+ __set_errno (ENOMEM);
+ return -2;
+ }
+
+ wstring_malloc = wstring
+ = (wchar_t *) malloc ((n + 1) * sizeof (wchar_t));
+ if (wstring == NULL)
+ {
+ free (wpattern_malloc);
+ return -2;
+ }
+ assert (mbsinit (&ps));
+ (void) mbsrtowcs (wstring, &string, n + 1, &ps);
+ }
+
+ int res = internal_fnwmatch (wpattern, wstring, wstring + n,
+ flags & FNM_PERIOD, flags, NULL,
+ alloca_used);
+
+ free (wstring_malloc);
+ free (wpattern_malloc);
+
+ return res;
+ }
+
+ return internal_fnmatch (pattern, string, string + strlen (string),
+ flags & FNM_PERIOD, flags, NULL, 0);
+}
+
+#undef fnmatch
+versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
+strong_alias (__fnmatch, __fnmatch_old)
+compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
+#endif
+libc_hidden_ver (__fnmatch, fnmatch)
diff --git a/lib/fnmatch.in.h b/lib/fnmatch.in.h
new file mode 100644
index 0000000..76ac721
--- /dev/null
+++ b/lib/fnmatch.in.h
@@ -0,0 +1,110 @@
+/* Substitute for and wrapper around <fnmatch.h>.
+ Copyright (C) 1991-1993, 1996-1999, 2001-2003, 2005, 2007, 2009-2020 Free
+ Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_FNMATCH_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_FNMATCH_H@ && !@REPLACE_FNMATCH@
+# @INCLUDE_NEXT@ @NEXT_FNMATCH_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_FNMATCH_H
+#define _@GUARD_PREFIX@_FNMATCH_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if !@HAVE_FNMATCH_H@ || @REPLACE_FNMATCH@
+
+/* We #undef these before defining them because some losing systems
+ (HP-UX A.08.07 for example) define these in <unistd.h>. */
+#undef FNM_PATHNAME
+#undef FNM_NOESCAPE
+#undef FNM_PERIOD
+
+/* Bits set in the FLAGS argument to 'fnmatch'. */
+#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match '/'. */
+#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
+#define FNM_PERIOD (1 << 2) /* Leading '.' is matched only explicitly. */
+
+#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
+# define FNM_LEADING_DIR (1 << 3) /* Ignore '/...' after a match. */
+# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
+# define FNM_EXTMATCH (1 << 5) /* Use ksh-like extended matching. */
+#endif
+
+/* Value returned by 'fnmatch' if STRING does not match PATTERN. */
+#define FNM_NOMATCH 1
+
+/* This value is returned if the implementation does not support
+ 'fnmatch'. Since this is not the case here it will never be
+ returned but the conformance test suites still require the symbol
+ to be defined. */
+#ifdef _XOPEN_SOURCE
+# define FNM_NOSYS (-1)
+#endif
+
+#endif
+
+
+#if @GNULIB_FNMATCH@
+/* Match NAME against the file name pattern PATTERN,
+ returning zero if it matches, FNM_NOMATCH if not. */
+# if @REPLACE_FNMATCH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fnmatch rpl_fnmatch
+# endif
+_GL_FUNCDECL_RPL (fnmatch, int,
+ (const char *pattern, const char *name, int flags)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fnmatch, int,
+ (const char *pattern, const char *name, int flags));
+# else
+# if !@HAVE_FNMATCH@
+_GL_FUNCDECL_SYS (fnmatch, int,
+ (const char *pattern, const char *name, int flags)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (fnmatch, int,
+ (const char *pattern, const char *name, int flags));
+# endif
+# if !GNULIB_FNMATCH_GNU && __GLIBC__ >= 2
+_GL_CXXALIASWARN (fnmatch);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fnmatch
+# if HAVE_RAW_DECL_FNMATCH
+_GL_WARN_ON_USE (fnmatch,
+ "fnmatch does not portably work - "
+ "use gnulib module fnmatch for portability or gnulib module fnmatch-gnu for a glibc compatible implementation");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_FNMATCH_H */
+#endif /* _@GUARD_PREFIX@_FNMATCH_H */
diff --git a/lib/fnmatch_loop.c b/lib/fnmatch_loop.c
new file mode 100644
index 0000000..277c9e9
--- /dev/null
+++ b/lib/fnmatch_loop.c
@@ -0,0 +1,1212 @@
+/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# include <stdint.h>
+#endif
+
+struct STRUCT
+{
+ const CHAR *pattern;
+ const CHAR *string;
+ bool no_leading_period;
+};
+
+/* Match STRING against the file name pattern PATTERN, returning zero if
+ it matches, nonzero if not. */
+static int FCT (const CHAR *pattern, const CHAR *string,
+ const CHAR *string_end, bool no_leading_period, int flags,
+ struct STRUCT *ends, size_t alloca_used);
+static int EXT (INT opt, const CHAR *pattern, const CHAR *string,
+ const CHAR *string_end, bool no_leading_period, int flags,
+ size_t alloca_used);
+static const CHAR *END (const CHAR *patternp);
+
+static int
+FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags, struct STRUCT *ends, size_t alloca_used)
+{
+ const CHAR *p = pattern, *n = string;
+ UCHAR c;
+#ifdef _LIBC
+# if WIDE_CHAR_VERSION
+ const char *collseq = (const char *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+# else
+ const UCHAR *collseq = (const UCHAR *)
+ _NL_CURRENT(LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+# endif
+#endif
+
+ while ((c = *p++) != L_('\0'))
+ {
+ bool new_no_leading_period = false;
+ c = FOLD (c);
+
+ switch (c)
+ {
+ case L_('?'):
+ if (__glibc_unlikely (flags & FNM_EXTMATCH) && *p == '(')
+ {
+ int res = EXT (c, p, n, string_end, no_leading_period,
+ flags, alloca_used);
+ if (res != -1)
+ return res;
+ }
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+ else if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ return FNM_NOMATCH;
+ else if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('\\'):
+ if (!(flags & FNM_NOESCAPE))
+ {
+ c = *p++;
+ if (c == L_('\0'))
+ /* Trailing \ loses. */
+ return FNM_NOMATCH;
+ c = FOLD (c);
+ }
+ if (n == string_end || FOLD ((UCHAR) *n) != c)
+ return FNM_NOMATCH;
+ break;
+
+ case L_('*'):
+ if (__glibc_unlikely (flags & FNM_EXTMATCH) && *p == '(')
+ {
+ int res = EXT (c, p, n, string_end, no_leading_period,
+ flags, alloca_used);
+ if (res != -1)
+ return res;
+ }
+ else if (ends != NULL)
+ {
+ ends->pattern = p - 1;
+ ends->string = n;
+ ends->no_leading_period = no_leading_period;
+ return 0;
+ }
+
+ if (n != string_end && *n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ for (c = *p++; c == L_('?') || c == L_('*'); c = *p++)
+ {
+ if (*p == L_('(') && (flags & FNM_EXTMATCH) != 0)
+ {
+ const CHAR *endp = END (p);
+ if (endp != p)
+ {
+ /* This is a pattern. Skip over it. */
+ p = endp;
+ continue;
+ }
+ }
+
+ if (c == L_('?'))
+ {
+ /* A ? needs to match one character. */
+ if (n == string_end)
+ /* There isn't another character; no match. */
+ return FNM_NOMATCH;
+ else if (*n == L_('/')
+ && __glibc_unlikely (flags & FNM_FILE_NAME))
+ /* A slash does not match a wildcard under
+ FNM_FILE_NAME. */
+ return FNM_NOMATCH;
+ else
+ /* One character of the string is consumed in matching
+ this ? wildcard, so *??? won't match if there are
+ less than three characters. */
+ ++n;
+ }
+ }
+
+ if (c == L_('\0'))
+ /* The wildcard(s) is/are the last element of the pattern.
+ If the name is a file name and contains another slash
+ this means it cannot match, unless the FNM_LEADING_DIR
+ flag is set. */
+ {
+ int result = (flags & FNM_FILE_NAME) == 0 ? 0 : FNM_NOMATCH;
+
+ if (flags & FNM_FILE_NAME)
+ {
+ if (flags & FNM_LEADING_DIR)
+ result = 0;
+ else
+ {
+ if (MEMCHR (n, L_('/'), string_end - n) == NULL)
+ result = 0;
+ }
+ }
+
+ return result;
+ }
+ else
+ {
+ const CHAR *endp;
+ struct STRUCT end;
+
+ end.pattern = NULL;
+ endp = MEMCHR (n, (flags & FNM_FILE_NAME) ? L_('/') : L_('\0'),
+ string_end - n);
+ if (endp == NULL)
+ endp = string_end;
+
+ if (c == L_('[')
+ || (__glibc_unlikely (flags & FNM_EXTMATCH)
+ && (c == L_('@') || c == L_('+') || c == L_('!'))
+ && *p == L_('(')))
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+
+ for (--p; n < endp; ++n, no_leading_period = false)
+ if (FCT (p, n, string_end, no_leading_period, flags2,
+ &end, alloca_used) == 0)
+ goto found;
+ }
+ else if (c == L_('/') && (flags & FNM_FILE_NAME))
+ {
+ while (n < string_end && *n != L_('/'))
+ ++n;
+ if (n < string_end && *n == L_('/')
+ && (FCT (p, n + 1, string_end, flags & FNM_PERIOD, flags,
+ NULL, alloca_used) == 0))
+ return 0;
+ }
+ else
+ {
+ int flags2 = ((flags & FNM_FILE_NAME)
+ ? flags : (flags & ~FNM_PERIOD));
+
+ if (c == L_('\\') && !(flags & FNM_NOESCAPE))
+ c = *p;
+ c = FOLD (c);
+ for (--p; n < endp; ++n, no_leading_period = false)
+ if (FOLD ((UCHAR) *n) == c
+ && (FCT (p, n, string_end, no_leading_period, flags2,
+ &end, alloca_used) == 0))
+ {
+ found:
+ if (end.pattern == NULL)
+ return 0;
+ break;
+ }
+ if (end.pattern != NULL)
+ {
+ p = end.pattern;
+ n = end.string;
+ no_leading_period = end.no_leading_period;
+ continue;
+ }
+ }
+ }
+
+ /* If we come here no match is possible with the wildcard. */
+ return FNM_NOMATCH;
+
+ case L_('['):
+ {
+ /* Nonzero if the sense of the character class is inverted. */
+ const CHAR *p_init = p;
+ const CHAR *n_init = n;
+ bool not;
+ CHAR cold;
+ UCHAR fn;
+
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ if (n == string_end)
+ return FNM_NOMATCH;
+
+ if (*n == L_('.') && no_leading_period)
+ return FNM_NOMATCH;
+
+ if (*n == L_('/') && (flags & FNM_FILE_NAME))
+ /* '/' cannot be matched. */
+ return FNM_NOMATCH;
+
+ not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
+ if (not)
+ ++p;
+
+ fn = FOLD ((UCHAR) *n);
+
+ c = *p++;
+ for (;;)
+ {
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ c = FOLD ((UCHAR) *p);
+ ++p;
+
+ goto normal_bracket;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ /* Leave room for the null. */
+ CHAR str[CHAR_CLASS_MAX_LENGTH + 1];
+ size_t c1 = 0;
+ wctype_t wt;
+ const CHAR *startp = p;
+
+ for (;;)
+ {
+ if (c1 == CHAR_CLASS_MAX_LENGTH)
+ /* The name is too long and therefore the pattern
+ is ill-formed. */
+ return FNM_NOMATCH;
+
+ c = *++p;
+ if (c == L_(':') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c < L_('a') || c >= L_('z'))
+ {
+ /* This cannot possibly be a character class name.
+ Match it as a normal range. */
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str[c1++] = c;
+ }
+ str[c1] = L_('\0');
+
+ wt = IS_CHAR_CLASS (str);
+ if (wt == 0)
+ /* Invalid character class name. */
+ return FNM_NOMATCH;
+
+#if defined _LIBC && ! WIDE_CHAR_VERSION
+ /* The following code is glibc specific but does
+ there a good job in speeding up the code since
+ we can avoid the btowc() call. */
+ if (_ISCTYPE ((UCHAR) *n, wt))
+ goto matched;
+#else
+ if (iswctype (BTOWC ((UCHAR) *n), wt))
+ goto matched;
+#endif
+ c = *p++;
+ }
+#ifdef _LIBC
+ else if (c == L_('[') && *p == L_('='))
+ {
+ /* It's important that STR be a scalar variable rather
+ than a one-element array, because GCC (at least 4.9.2
+ -O2 on x86-64) can be confused by the array and
+ diagnose a "used initialized" in a dead branch in the
+ findidx function. */
+ UCHAR str;
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+
+ c = *++p;
+ if (c == L_('\0'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ str = c;
+
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ {
+ p = startp;
+ c = L_('[');
+ goto normal_bracket;
+ }
+ p += 2;
+
+ if (nrules == 0)
+ {
+ if ((UCHAR) *n == str)
+ goto matched;
+ }
+ else
+ {
+ const int32_t *table;
+# if WIDE_CHAR_VERSION
+ const int32_t *weights;
+ const wint_t *extra;
+# else
+ const unsigned char *weights;
+ const unsigned char *extra;
+# endif
+ const int32_t *indirect;
+ int32_t idx;
+ const UCHAR *cp = (const UCHAR *) &str;
+
+# if WIDE_CHAR_VERSION
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEWC);
+ weights = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTWC);
+ extra = (const wint_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAWC);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTWC);
+# else
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+# endif
+
+ idx = FINDIDX (table, indirect, extra, &cp, 1);
+ if (idx != 0)
+ {
+ /* We found a table entry. Now see whether the
+ character we are currently at has the same
+ equivalence class value. */
+ int len = weights[idx & 0xffffff];
+ int32_t idx2;
+ const UCHAR *np = (const UCHAR *) n;
+
+ idx2 = FINDIDX (table, indirect, extra,
+ &np, string_end - n);
+ if (idx2 != 0
+ && (idx >> 24) == (idx2 >> 24)
+ && len == weights[idx2 & 0xffffff])
+ {
+ int cnt = 0;
+
+ idx &= 0xffffff;
+ idx2 &= 0xffffff;
+
+ while (cnt < len
+ && (weights[idx + 1 + cnt]
+ == weights[idx2 + 1 + cnt]))
+ ++cnt;
+
+ if (cnt == len)
+ goto matched;
+ }
+ }
+ }
+
+ c = *p++;
+ }
+#endif
+ else if (c == L_('\0'))
+ {
+ /* [ unterminated, treat as normal character. */
+ p = p_init;
+ n = n_init;
+ c = L_('[');
+ goto normal_match;
+ }
+ else
+ {
+ bool is_range = false;
+
+#ifdef _LIBC
+ bool is_seqval = false;
+
+ if (c == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = *p == L_('-') && p[1] != L_('\0');
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the collation
+ data. Therefore we only accept the trivial
+ names consisting of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ if (!is_range && *n == startp[1])
+ goto matched;
+
+ cold = startp[1];
+ c = *p++;
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+# if WIDE_CHAR_VERSION
+ CHAR *wextra;
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ for (elem = 0; elem < table_size; elem++)
+ if (symb_table[2 * elem] != 0)
+ {
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element. */
+ idx += 1 + extra[idx];
+# if WIDE_CHAR_VERSION
+ /* Skip the byte sequence of the
+ collating element. */
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+
+ wextra = (CHAR *) &extra[idx + 4];
+
+ if (/* Compare the length of the sequence. */
+ c1 == wextra[0]
+ /* Compare the wide char sequence. */
+ && (__wmemcmp (startp + 1, &wextra[1],
+ c1)
+ == 0))
+ /* Yep, this is the entry. */
+ break;
+# else
+ if (/* Compare the length of the sequence. */
+ c1 == extra[idx]
+ /* Compare the byte sequence. */
+ && memcmp (startp + 1,
+ &extra[idx + 1], c1) == 0)
+ /* Yep, this is the entry. */
+ break;
+# endif
+ }
+
+ if (elem < table_size)
+ {
+ /* Compare the byte sequence but only if
+ this is not part of a range. */
+ if (! is_range
+
+# if WIDE_CHAR_VERSION
+ && __wmemcmp (n, &wextra[1], c1) == 0
+# else
+ && memcmp (n, &extra[idx + 1], c1) == 0
+# endif
+ )
+ {
+ n += c1 - 1;
+ goto matched;
+ }
+
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# if WIDE_CHAR_VERSION
+ cold = wextra[1 + wextra[0]];
+# else
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ cold = *((int32_t *) &extra[idx]);
+# endif
+
+ c = *p++;
+ }
+ else if (c1 == 1)
+ {
+ /* No valid character. Match it as a
+ single byte. */
+ if (!is_range && *n == startp[1])
+ goto matched;
+
+ cold = startp[1];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+ }
+ else
+#endif
+ {
+ c = FOLD (c);
+ normal_bracket:
+
+ /* We have to handling the symbols differently in
+ ranges since then the collation sequence is
+ important. */
+ is_range = (*p == L_('-') && p[1] != L_('\0')
+ && p[1] != L_(']'));
+
+ if (!is_range && c == fn)
+ goto matched;
+
+#if _LIBC
+ /* This is needed if we goto normal_bracket; from
+ outside of is_seqval's scope. */
+ is_seqval = false;
+#endif
+ cold = c;
+ c = *p++;
+ }
+
+ if (c == L_('-') && *p != L_(']'))
+ {
+#if _LIBC
+ /* We have to find the collation sequence
+ value for C. Collation sequence is nothing
+ we can regularly access. The sequence
+ value is defined by the order in which the
+ definitions of the collation values for the
+ various characters appear in the source
+ file. A strange concept, nowhere
+ documented. */
+ uint32_t fcollseq;
+ uint32_t lcollseq;
+ UCHAR cend = *p++;
+
+# if WIDE_CHAR_VERSION
+ /* Search in the 'names' array for the characters. */
+ fcollseq = __collseq_table_lookup (collseq, fn);
+ if (fcollseq == ~((uint32_t) 0))
+ /* XXX We don't know anything about the character
+ we are supposed to match. This means we are
+ failing. */
+ goto range_not_matched;
+
+ if (is_seqval)
+ lcollseq = cold;
+ else
+ lcollseq = __collseq_table_lookup (collseq, cold);
+# else
+ fcollseq = collseq[fn];
+ lcollseq = is_seqval ? cold : collseq[(UCHAR) cold];
+# endif
+
+ is_seqval = false;
+ if (cend == L_('[') && *p == L_('.'))
+ {
+ uint32_t nrules =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_NRULES);
+ const CHAR *startp = p;
+ size_t c1 = 0;
+
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('.') && p[1] == L_(']'))
+ {
+ p += 2;
+ break;
+ }
+ if (c == '\0')
+ return FNM_NOMATCH;
+ ++c1;
+ }
+
+ if (nrules == 0)
+ {
+ /* There are no names defined in the
+ collation data. Therefore we only
+ accept the trivial names consisting
+ of the character itself. */
+ if (c1 != 1)
+ return FNM_NOMATCH;
+
+ cend = startp[1];
+ }
+ else
+ {
+ int32_t table_size;
+ const int32_t *symb_table;
+ const unsigned char *extra;
+ int32_t idx;
+ int32_t elem;
+# if WIDE_CHAR_VERSION
+ CHAR *wextra;
+# endif
+
+ table_size =
+ _NL_CURRENT_WORD (LC_COLLATE,
+ _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+
+ for (elem = 0; elem < table_size; elem++)
+ if (symb_table[2 * elem] != 0)
+ {
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating
+ element. */
+ idx += 1 + extra[idx];
+# if WIDE_CHAR_VERSION
+ /* Skip the byte sequence of the
+ collating element. */
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+
+ wextra = (CHAR *) &extra[idx + 4];
+
+ if (/* Compare the length of the
+ sequence. */
+ c1 == wextra[0]
+ /* Compare the wide char sequence. */
+ && (__wmemcmp (startp + 1,
+ &wextra[1], c1)
+ == 0))
+ /* Yep, this is the entry. */
+ break;
+# else
+ if (/* Compare the length of the
+ sequence. */
+ c1 == extra[idx]
+ /* Compare the byte sequence. */
+ && memcmp (startp + 1,
+ &extra[idx + 1], c1) == 0)
+ /* Yep, this is the entry. */
+ break;
+# endif
+ }
+
+ if (elem < table_size)
+ {
+ /* Get the collation sequence value. */
+ is_seqval = true;
+# if WIDE_CHAR_VERSION
+ cend = wextra[1 + wextra[0]];
+# else
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ cend = *((int32_t *) &extra[idx]);
+# endif
+ }
+ else if (c1 == 1)
+ {
+ cend = startp[1];
+ c = *p++;
+ }
+ else
+ return FNM_NOMATCH;
+ }
+ }
+ else
+ {
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+ cend = FOLD (cend);
+ }
+
+ /* XXX It is not entirely clear to me how to handle
+ characters which are not mentioned in the
+ collation specification. */
+ if (
+# if WIDE_CHAR_VERSION
+ lcollseq == 0xffffffff ||
+# endif
+ lcollseq <= fcollseq)
+ {
+ /* We have to look at the upper bound. */
+ uint32_t hcollseq;
+
+ if (is_seqval)
+ hcollseq = cend;
+ else
+ {
+# if WIDE_CHAR_VERSION
+ hcollseq =
+ __collseq_table_lookup (collseq, cend);
+ if (hcollseq == ~((uint32_t) 0))
+ {
+ /* Hum, no information about the upper
+ bound. The matching succeeds if the
+ lower bound is matched exactly. */
+ if (lcollseq != fcollseq)
+ goto range_not_matched;
+
+ goto matched;
+ }
+# else
+ hcollseq = collseq[cend];
+# endif
+ }
+
+ if (lcollseq <= hcollseq && fcollseq <= hcollseq)
+ goto matched;
+ }
+# if WIDE_CHAR_VERSION
+ range_not_matched:
+# endif
+#else
+ /* We use a boring value comparison of the character
+ values. This is better than comparing using
+ 'strcoll' since the latter would have surprising
+ and sometimes fatal consequences. */
+ UCHAR cend = *p++;
+
+ if (!(flags & FNM_NOESCAPE) && cend == L_('\\'))
+ cend = *p++;
+ if (cend == L_('\0'))
+ return FNM_NOMATCH;
+
+ /* It is a range. */
+ if ((UCHAR) cold <= fn && fn <= cend)
+ goto matched;
+#endif
+
+ c = *p++;
+ }
+ }
+
+ if (c == L_(']'))
+ break;
+ }
+
+ if (!not)
+ return FNM_NOMATCH;
+ break;
+
+ matched:
+ /* Skip the rest of the [...] that already matched. */
+ while ((c = *p++) != L_(']'))
+ {
+ if (c == L_('\0'))
+ /* [... (unterminated) loses. */
+ return FNM_NOMATCH;
+
+ if (!(flags & FNM_NOESCAPE) && c == L_('\\'))
+ {
+ if (*p == L_('\0'))
+ return FNM_NOMATCH;
+ /* XXX 1003.2d11 is unclear if this is right. */
+ ++p;
+ }
+ else if (c == L_('[') && *p == L_(':'))
+ {
+ int c1 = 0;
+ const CHAR *startp = p;
+
+ while (1)
+ {
+ c = *++p;
+ if (++c1 == CHAR_CLASS_MAX_LENGTH)
+ return FNM_NOMATCH;
+
+ if (*p == L_(':') && p[1] == L_(']'))
+ break;
+
+ if (c < L_('a') || c >= L_('z'))
+ {
+ p = startp - 2;
+ break;
+ }
+ }
+ p += 2;
+ }
+ else if (c == L_('[') && *p == L_('='))
+ {
+ c = *++p;
+ if (c == L_('\0'))
+ return FNM_NOMATCH;
+ c = *++p;
+ if (c != L_('=') || p[1] != L_(']'))
+ return FNM_NOMATCH;
+ p += 2;
+ }
+ else if (c == L_('[') && *p == L_('.'))
+ {
+ while (1)
+ {
+ c = *++p;
+ if (c == L_('\0'))
+ return FNM_NOMATCH;
+
+ if (c == L_('.') && p[1] == L_(']'))
+ break;
+ }
+ p += 2;
+ }
+ }
+ if (not)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ case L_('+'):
+ case L_('@'):
+ case L_('!'):
+ if (__glibc_unlikely (flags & FNM_EXTMATCH) && *p == '(')
+ {
+ int res = EXT (c, p, n, string_end, no_leading_period, flags,
+ alloca_used);
+ if (res != -1)
+ return res;
+ }
+ goto normal_match;
+
+ case L_('/'):
+ if (NO_LEADING_PERIOD (flags))
+ {
+ if (n == string_end || c != (UCHAR) *n)
+ return FNM_NOMATCH;
+
+ new_no_leading_period = true;
+ break;
+ }
+ FALLTHROUGH;
+ default:
+ normal_match:
+ if (n == string_end || c != FOLD ((UCHAR) *n))
+ return FNM_NOMATCH;
+ }
+
+ no_leading_period = new_no_leading_period;
+ ++n;
+ }
+
+ if (n == string_end)
+ return 0;
+
+ if ((flags & FNM_LEADING_DIR) && n != string_end && *n == L_('/'))
+ /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
+ return 0;
+
+ return FNM_NOMATCH;
+}
+
+
+static const CHAR *
+END (const CHAR *pattern)
+{
+ const CHAR *p = pattern;
+
+ while (1)
+ if (*++p == L_('\0'))
+ /* This is an invalid pattern. */
+ return pattern;
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ /* This is no valid pattern. */
+ return pattern;
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ {
+ p = END (p + 1);
+ if (*p == L_('\0'))
+ /* This is an invalid pattern. */
+ return pattern;
+ }
+ else if (*p == L_(')'))
+ break;
+
+ return p + 1;
+}
+
+
+static int
+EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
+ bool no_leading_period, int flags, size_t alloca_used)
+{
+ const CHAR *startp;
+ size_t level;
+ struct patternlist
+ {
+ struct patternlist *next;
+ CHAR malloced;
+ CHAR str[FLEXIBLE_ARRAY_MEMBER];
+ } *list = NULL;
+ struct patternlist **lastp = &list;
+ size_t pattern_len = STRLEN (pattern);
+ bool any_malloced = false;
+ const CHAR *p;
+ const CHAR *rs;
+ int retval = 0;
+
+ /* Parse the pattern. Store the individual parts in the list. */
+ level = 0;
+ for (startp = p = pattern + 1; ; ++p)
+ if (*p == L_('\0'))
+ {
+ /* This is an invalid pattern. */
+ retval = -1;
+ goto out;
+ }
+ else if (*p == L_('['))
+ {
+ /* Handle brackets special. */
+ if (posixly_correct == 0)
+ posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+ /* Skip the not sign. We have to recognize it because of a possibly
+ following ']'. */
+ if (*++p == L_('!') || (posixly_correct < 0 && *p == L_('^')))
+ ++p;
+ /* A leading ']' is recognized as such. */
+ if (*p == L_(']'))
+ ++p;
+ /* Skip over all characters of the list. */
+ while (*p != L_(']'))
+ if (*p++ == L_('\0'))
+ {
+ /* This is no valid pattern. */
+ retval = -1;
+ goto out;
+ }
+ }
+ else if ((*p == L_('?') || *p == L_('*') || *p == L_('+') || *p == L_('@')
+ || *p == L_('!')) && p[1] == L_('('))
+ /* Remember the nesting level. */
+ ++level;
+ else if (*p == L_(')'))
+ {
+ if (level-- == 0)
+ {
+ /* This means we found the end of the pattern. */
+#define NEW_PATTERN \
+ struct patternlist *newp; \
+ size_t plen = (opt == L_('?') || opt == L_('@') \
+ ? pattern_len : (p - startp + 1UL)); \
+ idx_t slen = FLEXSIZEOF (struct patternlist, str, 0); \
+ idx_t new_used = alloca_used + slen; \
+ idx_t plensize; \
+ if (INT_MULTIPLY_WRAPV (plen, sizeof (CHAR), &plensize) \
+ || INT_ADD_WRAPV (new_used, plensize, &new_used)) \
+ { \
+ retval = -2; \
+ goto out; \
+ } \
+ slen += plensize; \
+ bool malloced = ! __libc_use_alloca (new_used); \
+ if (__glibc_unlikely (malloced)) \
+ { \
+ newp = malloc (slen); \
+ if (newp == NULL) \
+ { \
+ retval = -2; \
+ goto out; \
+ } \
+ any_malloced = true; \
+ } \
+ else \
+ newp = alloca_account (slen, alloca_used); \
+ newp->next = NULL; \
+ newp->malloced = malloced; \
+ *((CHAR *) MEMPCPY (newp->str, startp, p - startp)) = L_('\0'); \
+ *lastp = newp; \
+ lastp = &newp->next
+ NEW_PATTERN;
+ break;
+ }
+ }
+ else if (*p == L_('|'))
+ {
+ if (level == 0)
+ {
+ NEW_PATTERN;
+ startp = p + 1;
+ }
+ }
+ assert (list != NULL);
+ assert (p[-1] == L_(')'));
+#undef NEW_PATTERN
+
+ switch (opt)
+ {
+ case L_('*'):
+ if (FCT (p, string, string_end, no_leading_period, flags, NULL,
+ alloca_used) == 0)
+ goto success;
+ FALLTHROUGH;
+ case L_('+'):
+ do
+ {
+ for (rs = string; rs <= string_end; ++rs)
+ /* First match the prefix with the current pattern with the
+ current pattern. */
+ if (FCT (list->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
+ NULL, alloca_used) == 0
+ /* This was successful. Now match the rest with the rest
+ of the pattern. */
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD, NULL, alloca_used) == 0
+ /* This didn't work. Try the whole pattern. */
+ || (rs != string
+ && FCT (pattern - 1, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME
+ ? flags : flags & ~FNM_PERIOD, NULL,
+ alloca_used) == 0)))
+ /* It worked. Signal success. */
+ goto success;
+ }
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ retval = FNM_NOMATCH;
+ break;
+
+ case L_('?'):
+ if (FCT (p, string, string_end, no_leading_period, flags, NULL,
+ alloca_used) == 0)
+ goto success;
+ FALLTHROUGH;
+ case L_('@'):
+ do
+ /* I cannot believe it but 'strcat' is actually acceptable
+ here. Match the entire string with the prefix from the
+ pattern list and the rest of the pattern following the
+ pattern list. */
+ if (FCT (STRCAT (list->str, p), string, string_end,
+ no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
+ NULL, alloca_used) == 0)
+ /* It worked. Signal success. */
+ goto success;
+ while ((list = list->next) != NULL);
+
+ /* None of the patterns lead to a match. */
+ retval = FNM_NOMATCH;
+ break;
+
+ case L_('!'):
+ for (rs = string; rs <= string_end; ++rs)
+ {
+ struct patternlist *runp;
+
+ for (runp = list; runp != NULL; runp = runp->next)
+ if (FCT (runp->str, string, rs, no_leading_period,
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
+ NULL, alloca_used) == 0)
+ break;
+
+ /* If none of the patterns matched see whether the rest does. */
+ if (runp == NULL
+ && (FCT (p, rs, string_end,
+ rs == string
+ ? no_leading_period
+ : rs[-1] == '/' && NO_LEADING_PERIOD (flags),
+ flags & FNM_FILE_NAME ? flags : flags & ~FNM_PERIOD,
+ NULL, alloca_used) == 0))
+ /* This is successful. */
+ goto success;
+ }
+
+ /* None of the patterns together with the rest of the pattern
+ lead to a match. */
+ retval = FNM_NOMATCH;
+ break;
+
+ default:
+ assert (! "Invalid extended matching operator");
+ retval = -1;
+ break;
+ }
+
+ success:
+ out:
+ if (any_malloced)
+ while (list != NULL)
+ {
+ struct patternlist *old = list;
+ list = list->next;
+ if (old->malloced)
+ free (old);
+ }
+
+ return retval;
+}
+
+
+#undef FOLD
+#undef CHAR
+#undef UCHAR
+#undef INT
+#undef FCT
+#undef EXT
+#undef END
+#undef STRUCT
+#undef MEMPCPY
+#undef MEMCHR
+#undef STRLEN
+#undef STRCAT
+#undef L_
+#undef BTOWC
+#undef WIDE_CHAR_VERSION
+#undef FINDIDX
diff --git a/lib/fopen.c b/lib/fopen.c
new file mode 100644
index 0000000..2527850
--- /dev/null
+++ b/lib/fopen.c
@@ -0,0 +1,230 @@
+/* Open a stream to a file.
+ Copyright (C) 2007-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* If the user's config.h happens to include <stdio.h>, let it include only
+ the system's <stdio.h> here, so that orig_fopen doesn't recurse to
+ rpl_fopen. */
+#define _GL_ALREADY_INCLUDING_STDIO_H
+#include <config.h>
+
+/* Get the original definition of fopen. It might be defined as a macro. */
+#include <stdio.h>
+#undef _GL_ALREADY_INCLUDING_STDIO_H
+
+static FILE *
+orig_fopen (const char *filename, const char *mode)
+{
+ return fopen (filename, mode);
+}
+
+/* Specification. */
+/* Write "stdio.h" here, not <stdio.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <stdio.h> above. */
+#include "stdio.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+FILE *
+rpl_fopen (const char *filename, const char *mode)
+{
+ int open_direction;
+ int open_flags;
+#if GNULIB_FOPEN_GNU
+ bool open_flags_gnu;
+# define BUF_SIZE 80
+ char fdopen_mode_buf[BUF_SIZE + 1];
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+ /* Parse the mode. */
+ open_direction = 0;
+ open_flags = 0;
+#if GNULIB_FOPEN_GNU
+ open_flags_gnu = false;
+#endif
+ {
+ const char *p = mode;
+#if GNULIB_FOPEN_GNU
+ char *q = fdopen_mode_buf;
+#endif
+
+ for (; *p != '\0'; p++)
+ {
+ switch (*p)
+ {
+ case 'r':
+ open_direction = O_RDONLY;
+#if GNULIB_FOPEN_GNU
+ if (q < fdopen_mode_buf + BUF_SIZE)
+ *q++ = *p;
+#endif
+ continue;
+ case 'w':
+ open_direction = O_WRONLY;
+ open_flags |= O_CREAT | O_TRUNC;
+#if GNULIB_FOPEN_GNU
+ if (q < fdopen_mode_buf + BUF_SIZE)
+ *q++ = *p;
+#endif
+ continue;
+ case 'a':
+ open_direction = O_WRONLY;
+ open_flags |= O_CREAT | O_APPEND;
+#if GNULIB_FOPEN_GNU
+ if (q < fdopen_mode_buf + BUF_SIZE)
+ *q++ = *p;
+#endif
+ continue;
+ case 'b':
+ /* While it is non-standard, O_BINARY is guaranteed by
+ gnulib <fcntl.h>. We can also assume that orig_fopen
+ supports the 'b' flag. */
+ open_flags |= O_BINARY;
+#if GNULIB_FOPEN_GNU
+ if (q < fdopen_mode_buf + BUF_SIZE)
+ *q++ = *p;
+#endif
+ continue;
+ case '+':
+ open_direction = O_RDWR;
+#if GNULIB_FOPEN_GNU
+ if (q < fdopen_mode_buf + BUF_SIZE)
+ *q++ = *p;
+#endif
+ continue;
+#if GNULIB_FOPEN_GNU
+ case 'x':
+ open_flags |= O_EXCL;
+ open_flags_gnu = true;
+ continue;
+ case 'e':
+ open_flags |= O_CLOEXEC;
+ open_flags_gnu = true;
+ continue;
+#endif
+ default:
+ break;
+ }
+#if GNULIB_FOPEN_GNU
+ /* The rest of the mode string can be a platform-dependent extension.
+ Copy it unmodified. */
+ {
+ size_t len = strlen (p);
+ if (len > fdopen_mode_buf + BUF_SIZE - q)
+ len = fdopen_mode_buf + BUF_SIZE - q;
+ memcpy (q, p, len);
+ q += len;
+ }
+#endif
+ break;
+ }
+#if GNULIB_FOPEN_GNU
+ *q = '\0';
+#endif
+ }
+
+#if FOPEN_TRAILING_SLASH_BUG
+ /* Fail if the mode requires write access and the filename ends in a slash,
+ as POSIX says such a filename must name a directory
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+ "A pathname that contains at least one non-<slash> character and that
+ ends with one or more trailing <slash> characters shall not be resolved
+ successfully unless the last pathname component before the trailing
+ <slash> characters names an existing directory"
+ If the named file already exists as a directory, then if a mode that
+ requires write access is specified, fopen() must fail because POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html>
+ says that it fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ fopen() must fail since the file does not contain a '.' directory. */
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ int fd;
+ struct stat statbuf;
+ FILE *fp;
+
+ if (open_direction != O_RDONLY)
+ {
+ errno = EISDIR;
+ return NULL;
+ }
+
+ fd = open (filename, open_direction | open_flags,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+ if (fd < 0)
+ return NULL;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return NULL;
+ }
+
+# if GNULIB_FOPEN_GNU
+ fp = fdopen (fd, fdopen_mode_buf);
+# else
+ fp = fdopen (fd, mode);
+# endif
+ if (fp == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return fp;
+ }
+ }
+#endif
+
+#if GNULIB_FOPEN_GNU
+ if (open_flags_gnu)
+ {
+ int fd;
+ FILE *fp;
+
+ fd = open (filename, open_direction | open_flags,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+ if (fd < 0)
+ return NULL;
+
+ fp = fdopen (fd, fdopen_mode_buf);
+ if (fp == NULL)
+ {
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ }
+ return fp;
+ }
+#endif
+
+ return orig_fopen (filename, mode);
+}
diff --git a/lib/fpurge.c b/lib/fpurge.c
new file mode 100644
index 0000000..9df90de
--- /dev/null
+++ b/lib/fpurge.c
@@ -0,0 +1,150 @@
+/* Flushing buffers of a FILE stream.
+ Copyright (C) 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+#endif
+#include <stdlib.h>
+
+#include "stdio-impl.h"
+
+int
+fpurge (FILE *fp)
+{
+#if HAVE___FPURGE /* glibc >= 2.2, Haiku, Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.10, Android API >= 23, musl libc */
+
+ __fpurge (fp);
+ /* The __fpurge function does not have a return value. */
+ return 0;
+
+#elif HAVE_FPURGE /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin >= 1.7 */
+
+ /* Call the system's fpurge function. */
+# undef fpurge
+# if !HAVE_DECL_FPURGE
+ extern int fpurge (FILE *);
+# endif
+ int result = fpurge (fp);
+# if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+ if (result == 0)
+ /* Correct the invariants that fpurge broke.
+ <stdio.h> on BSD systems says:
+ "The following always hold: if _flags & __SRD, _w is 0."
+ If this invariant is not fulfilled and the stream is read-write but
+ currently reading, subsequent putc or fputc calls will write directly
+ into the buffer, although they shouldn't be allowed to. */
+ if ((fp_->_flags & __SRD) != 0)
+ fp_->_w = 0;
+# endif
+ return result;
+
+#else
+
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_IO_read_end = fp->_IO_read_ptr;
+ fp->_IO_write_ptr = fp->_IO_write_base;
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp->_IO_save_base != NULL)
+ {
+ free (fp->_IO_save_base);
+ fp->_IO_save_base = NULL;
+ }
+ return 0;
+# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+ fp_->_p = fp_->_bf._base;
+ fp_->_r = 0;
+ fp_->_w = ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0);
+ /* Avoid memory leak when there is an active ungetc buffer. */
+ if (fp_ub._base != NULL)
+ {
+ if (fp_ub._base != fp_->_ubuf)
+ free (fp_ub._base);
+ fp_ub._base = NULL;
+ }
+ return 0;
+# elif defined __EMX__ /* emx+gcc */
+ fp->_ptr = fp->_buffer;
+ fp->_rcount = 0;
+ fp->_wcount = 0;
+ fp->_ungetc_count = 0;
+ return 0;
+# elif defined __minix /* Minix */
+ fp->_ptr = fp->_buf;
+ if (fp->_ptr != NULL)
+ fp->_count = 0;
+ return 0;
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+ fp_->_ptr = fp_->_base;
+ if (fp_->_ptr != NULL)
+ fp_->_cnt = 0;
+ return 0;
+# elif defined __UCLIBC__ /* uClibc */
+# ifdef __STDIO_BUFFERS
+ if (fp->__modeflags & __FLAG_WRITING)
+ fp->__bufpos = fp->__bufstart;
+ else if (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING))
+ fp->__bufpos = fp->__bufread;
+# endif
+ return 0;
+# elif defined __QNX__ /* QNX */
+ fp->_Rback = fp->_Back + sizeof (fp->_Back);
+ fp->_Rsave = NULL;
+ if (fp->_Mode & 0x2000 /* _MWRITE */)
+ /* fp->_Buf <= fp->_Next <= fp->_Wend */
+ fp->_Next = fp->_Buf;
+ else
+ /* fp->_Buf <= fp->_Next <= fp->_Rend */
+ fp->_Rend = fp->_Next;
+ return 0;
+# elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__pushed_back)
+ {
+ fp->__bufp = fp->__pushback_bufp;
+ fp->__pushed_back = 0;
+ }
+ /* Preserve the current file position. */
+ if (fp->__target != -1)
+ fp->__target += fp->__bufp - fp->__buffer;
+ fp->__bufp = fp->__buffer;
+ /* Nothing in the buffer, next getc is nontrivial. */
+ fp->__get_limit = fp->__bufp;
+ /* Nothing in the buffer, next putc is nontrivial. */
+ fp->__put_limit = fp->__buffer;
+ return 0;
+# elif defined EPLAN9 /* Plan9 */
+ fp->rp = fp->wp = fp->lp = fp->buf;
+ return 0;
+# else
+# error "Please port gnulib fpurge.c to your platform! Look at the definitions of fflush, setvbuf and ungetc on your system, then report this to bug-gnulib."
+# endif
+
+#endif
+}
diff --git a/lib/freading.c b/lib/freading.c
new file mode 100644
index 0000000..38f998c
--- /dev/null
+++ b/lib/freading.c
@@ -0,0 +1,76 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "freading.h"
+
+#include "stdio-impl.h"
+
+/* Don't use glibc's __freading function in glibc < 2.7, see
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=4359> */
+#if !(HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7)))
+
+bool
+freading (FILE *fp)
+{
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+# if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+ return ((fp->_flags & _IO_NO_WRITES) != 0
+ || ((fp->_flags & (_IO_NO_READS | _IO_CURRENTLY_PUTTING)) == 0
+ && fp->_IO_read_base != NULL));
+# elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin < 1.7.34, Minix 3, Android */
+ return (fp_->_flags & __SRD) != 0;
+# elif defined __EMX__ /* emx+gcc */
+ return (fp->_flags & _IOREAD) != 0;
+# elif defined __minix /* Minix */
+ return (fp->_flags & _IOREADING) != 0;
+# elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+# if defined __sun /* Solaris */
+ return (fp_->_flag & _IOREAD) != 0 && (fp_->_flag & _IOWRT) == 0;
+# else
+ return (fp_->_flag & _IOREAD) != 0;
+# endif
+# elif defined __UCLIBC__ /* uClibc */
+ return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
+# elif defined __QNX__ /* QNX */
+ return ((fp->_Mode & 0x2 /* _MOPENW */) == 0
+ || (fp->_Mode & 0x1000 /* _MREAD */) != 0);
+# elif defined __MINT__ /* Atari FreeMiNT */
+ if (!fp->__mode.__write)
+ return 1;
+ if (!fp->__mode.__read)
+ return 0;
+# ifdef _IO_CURRENTLY_GETTING /* Flag added on 2009-02-28 */
+ return (fp->__flags & _IO_CURRENTLY_GETTING) != 0;
+# else
+ return (fp->__buffer < fp->__get_limit /*|| fp->__bufp == fp->__put_limit ??*/);
+# endif
+# elif defined EPLAN9 /* Plan9 */
+ if (fp->state == 0 /* CLOSED */ || fp->state == 4 /* WR */)
+ return 0;
+ return (fp->state == 3 /* RD */ && (fp->bufl == 0 || fp->rp < fp->wp));
+# else
+# error "Please port gnulib freading.c to your platform!"
+# endif
+}
+
+#endif
diff --git a/lib/freading.h b/lib/freading.h
new file mode 100644
index 0000000..e606b41
--- /dev/null
+++ b/lib/freading.h
@@ -0,0 +1,55 @@
+/* Retrieve information about a FILE stream.
+ Copyright (C) 2007-2020 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/>. */
+
+#include <stdbool.h>
+#include <stdio.h>
+
+/* Return true if the stream STREAM is opened read-only, or if the
+ last operation on the stream was a read operation. Return false if
+ the stream is opened write-only or append-only, or if it supports
+ writing and there is no current read operation (such as fgetc).
+
+ freading and fwriting will never both be true. If STREAM supports
+ both reads and writes, then:
+ - both freading and fwriting might be false when the stream is first
+ opened, after read encounters EOF, or after fflush,
+ - freading might be false or true and fwriting might be false
+ after repositioning (such as fseek, fsetpos, or rewind),
+ depending on the underlying implementation.
+
+ STREAM must not be wide-character oriented. */
+
+#if HAVE___FREADING && (!defined __GLIBC__ || defined __UCLIBC__ || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))
+/* Solaris >= 7, UnixWare >= 7.1.4.MP4, Cygwin >= 1.7.34, Android API >= 29, not glibc >= 2.2, but glibc >= 2.7, or musl libc */
+
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+# define freading(stream) (__freading (stream) != 0)
+
+#else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+extern bool freading (FILE *stream) _GL_ATTRIBUTE_PURE;
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/free.c b/lib/free.c
new file mode 100644
index 0000000..2f689a7
--- /dev/null
+++ b/lib/free.c
@@ -0,0 +1,33 @@
+/* Make free() preserve errno.
+
+ Copyright (C) 2003, 2006, 2009-2020 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/>. */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+void
+rpl_free (void *p)
+#undef free
+{
+ int err = errno;
+ free (p);
+ errno = err;
+}
diff --git a/lib/fseek.c b/lib/fseek.c
new file mode 100644
index 0000000..81f35a2
--- /dev/null
+++ b/lib/fseek.c
@@ -0,0 +1,30 @@
+/* An fseek() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t. */
+#include <unistd.h>
+
+int
+fseek (FILE *fp, long offset, int whence)
+{
+ /* Use the replacement fseeko function with all its workarounds. */
+ return fseeko (fp, (off_t)offset, whence);
+}
diff --git a/lib/fseeko.c b/lib/fseeko.c
new file mode 100644
index 0000000..2c3671f
--- /dev/null
+++ b/lib/fseeko.c
@@ -0,0 +1,164 @@
+/* An fseeko() function that, together with fflush(), is POSIX compliant.
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get off_t, lseek, _POSIX_VERSION. */
+#include <unistd.h>
+
+#include "stdio-impl.h"
+
+int
+fseeko (FILE *fp, off_t offset, int whence)
+#undef fseeko
+#if !HAVE_FSEEKO
+# undef fseek
+# define fseeko fseek
+#endif
+#if _GL_WINDOWS_64_BIT_OFF_T
+# undef fseeko
+# if HAVE__FSEEKI64 && HAVE_DECL__FSEEKI64 /* msvc, mingw since msvcrt8.0, mingw64 */
+# define fseeko _fseeki64
+# else /* mingw before msvcrt8.0 */
+# define fseeko fseeko64
+# endif
+#endif
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return EOF;
+#endif
+
+ /* These tests are based on fpurge.c. */
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+ if (fp->_IO_read_end == fp->_IO_read_ptr
+ && fp->_IO_write_ptr == fp->_IO_write_base
+ && fp->_IO_save_base == NULL)
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+# if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an fseeko that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+# endif
+ if (fp_->_p == fp_->_bf._base
+ && fp_->_r == 0
+ && fp_->_w == ((fp_->_flags & (__SLBF | __SNBF | __SRD)) == 0 /* fully buffered and not currently reading? */
+ ? fp_->_bf._size
+ : 0)
+ && fp_ub._base == NULL)
+#elif defined __EMX__ /* emx+gcc */
+ if (fp->_ptr == fp->_buffer
+ && fp->_rcount == 0
+ && fp->_wcount == 0
+ && fp->_ungetc_count == 0)
+#elif defined __minix /* Minix */
+ if (fp_->_ptr == fp_->_buf
+ && (fp_->_ptr == NULL || fp_->_count == 0))
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+ if (fp_->_ptr == fp_->_base
+ && (fp_->_ptr == NULL || fp_->_cnt == 0))
+#elif defined __UCLIBC__ /* uClibc */
+ if (((fp->__modeflags & __FLAG_WRITING) == 0
+ || fp->__bufpos == fp->__bufstart)
+ && ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
+ || fp->__bufpos == fp->__bufread))
+#elif defined __QNX__ /* QNX */
+ if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
+ && fp->_Rback == fp->_Back + sizeof (fp->_Back)
+ && fp->_Rsave == NULL)
+#elif defined __MINT__ /* Atari FreeMiNT */
+ if (fp->__bufp == fp->__buffer
+ && fp->__get_limit == fp->__bufp
+ && fp->__put_limit == fp->__bufp
+ && !fp->__pushed_back)
+#elif defined EPLAN9 /* Plan9 */
+ if (fp->rp == fp->buf
+ && fp->wp == fp->buf)
+#elif FUNC_FFLUSH_STDIN < 0 && 200809 <= _POSIX_VERSION
+ /* Cross-compiling to some other system advertising conformance to
+ POSIX.1-2008 or later. Assume fseeko and fflush work as advertised.
+ If this assumption is incorrect, please report the bug to
+ bug-gnulib. */
+ if (0)
+#else
+ #error "Please port gnulib fseeko.c to your platform! Look at the code in fseeko.c, then report this to bug-gnulib."
+#endif
+ {
+ /* We get here when an fflush() call immediately preceded this one (or
+ if ftell() has created buffers but no I/O has occurred on a
+ newly-opened stream). We know there are no buffers. */
+ off_t pos = lseek (fileno (fp), offset, whence);
+ if (pos == -1)
+ {
+#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+ fp_->_flags &= ~__SOFF;
+#endif
+ return -1;
+ }
+
+#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
+ /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags &= ~_IO_EOF_SEEN;
+ fp->_offset = pos;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+# if defined __CYGWIN__ || (defined __NetBSD__ && __NetBSD_Version__ >= 600000000) || defined __minix
+ /* fp_->_offset is typed as an integer. */
+ fp_->_offset = pos;
+# else
+ /* fp_->_offset is an fpos_t. */
+ {
+ /* Use a union, since on NetBSD, the compilation flags
+ determine whether fpos_t is typedef'd to off_t or a struct
+ containing a single off_t member. */
+ union
+ {
+ fpos_t f;
+ off_t o;
+ } u;
+ u.o = pos;
+ fp_->_offset = u.f;
+ }
+# endif
+ fp_->_flags |= __SOFF;
+ fp_->_flags &= ~__SEOF;
+#elif defined __EMX__ /* emx+gcc */
+ fp->_flags &= ~_IOEOF;
+#elif defined _IOERR /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, UnixWare, mingw, MSVC, NonStop Kernel, OpenVMS */
+ fp_->_flag &= ~_IOEOF;
+#elif defined __MINT__ /* Atari FreeMiNT */
+ fp->__offset = pos;
+ fp->__eof = 0;
+#endif
+ return 0;
+ }
+ return fseeko (fp, offset, whence);
+}
diff --git a/lib/fstat.c b/lib/fstat.c
new file mode 100644
index 0000000..235014a
--- /dev/null
+++ b/lib/fstat.c
@@ -0,0 +1,94 @@
+/* fstat() replacement.
+ Copyright (C) 2011-2020 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/>. */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_fstat doesn't recurse to
+ rpl_fstat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of fstat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WINDOWS_NATIVE
+#endif
+
+#if !defined WINDOWS_NATIVE
+
+static int
+orig_fstat (int fd, struct stat *buf)
+{
+ return fstat (fd, buf);
+}
+
+#endif
+
+/* Specification. */
+#ifdef __osf__
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+# include "sys/stat.h"
+#else
+# include <sys/stat.h>
+#endif
+
+#include "stat-time.h"
+
+#include <errno.h>
+#include <unistd.h>
+#ifdef WINDOWS_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+# include "stat-w32.h"
+#endif
+
+int
+rpl_fstat (int fd, struct stat *buf)
+{
+#if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY
+ /* Handle the case when rpl_open() used a dummy file descriptor to work
+ around an open() that can't normally visit directories. */
+ const char *name = _gl_directory_name (fd);
+ if (name != NULL)
+ return stat (name, buf);
+#endif
+
+#ifdef WINDOWS_NATIVE
+ /* Fill the fields ourselves, because the original fstat function returns
+ values for st_atime, st_mtime, st_ctime that depend on the current time
+ zone. See
+ <https://lists.gnu.org/r/bug-gnulib/2017-04/msg00134.html> */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ return _gl_fstat_by_handle (h, NULL, buf);
+#else
+ return stat_time_normalize (orig_fstat (fd, buf), buf);
+#endif
+}
diff --git a/lib/fstatat.c b/lib/fstatat.c
new file mode 100644
index 0000000..9da1269
--- /dev/null
+++ b/lib/fstatat.c
@@ -0,0 +1,148 @@
+/* Work around an fstatat bug on Solaris 9.
+
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_fstatat doesn't recurse to
+ rpl_fstatat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of fstatat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
+static int
+orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
+{
+ return fstatat (fd, filename, buf, flags);
+}
+#endif
+
+#ifdef __osf__
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+# include "sys/stat.h"
+#else
+# include <sys/stat.h>
+#endif
+
+#include "stat-time.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
+
+# ifndef LSTAT_FOLLOWS_SLASHED_SYMLINK
+# define LSTAT_FOLLOWS_SLASHED_SYMLINK 0
+# endif
+
+static int
+normal_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+ return stat_time_normalize (orig_fstatat (fd, file, st, flag), st);
+}
+
+/* fstatat should always follow symbolic links that end in /, but on
+ Solaris 9 it doesn't if AT_SYMLINK_NOFOLLOW is specified.
+ Likewise, trailing slash on a non-directory should be an error.
+ These are the same problems that lstat.c and stat.c address, so
+ solve it in a similar way.
+
+ AIX 7.1 fstatat (AT_FDCWD, ..., 0) always fails, which is a bug.
+ Work around this bug if FSTATAT_AT_FDCWD_0_BROKEN is nonzero. */
+
+int
+rpl_fstatat (int fd, char const *file, struct stat *st, int flag)
+{
+ int result = normal_fstatat (fd, file, st, flag);
+ size_t len;
+
+ if (LSTAT_FOLLOWS_SLASHED_SYMLINK || result != 0)
+ return result;
+ len = strlen (file);
+ if (flag & AT_SYMLINK_NOFOLLOW)
+ {
+ /* Fix lstat behavior. */
+ if (file[len - 1] != '/' || S_ISDIR (st->st_mode))
+ return 0;
+ if (!S_ISLNK (st->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ result = normal_fstatat (fd, file, st, flag & ~AT_SYMLINK_NOFOLLOW);
+ }
+ /* Fix stat behavior. */
+ if (result == 0 && !S_ISDIR (st->st_mode) && file[len - 1] == '/')
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ return result;
+}
+
+#else /* ! (HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG) */
+
+/* On mingw, the gnulib <sys/stat.h> defines 'stat' as a function-like
+ macro; but using it in AT_FUNC_F2 causes compilation failure
+ because the preprocessor sees a use of a macro that requires two
+ arguments but is only given one. Hence, we need an inline
+ forwarder to get past the preprocessor. */
+static int
+stat_func (char const *name, struct stat *st)
+{
+ return stat (name, st);
+}
+
+/* Likewise, if there is no native 'lstat', then the gnulib
+ <sys/stat.h> defined it as stat, which also needs adjustment. */
+# if !HAVE_LSTAT
+# undef lstat
+# define lstat stat_func
+# endif
+
+/* Replacement for Solaris' function by the same name.
+ <https://www.google.com/search?q=fstatat+site:docs.oracle.com>
+ First, try to simulate it via l?stat ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it via save_cwd/fchdir/(stat|lstat)/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, this function works just like Solaris' fstatat. */
+
+# define AT_FUNC_NAME fstatat
+# define AT_FUNC_F1 lstat
+# define AT_FUNC_F2 stat_func
+# define AT_FUNC_USE_F1_COND AT_SYMLINK_NOFOLLOW
+# define AT_FUNC_POST_FILE_PARAM_DECLS , struct stat *st, int flag
+# define AT_FUNC_POST_FILE_ARGS , st
+# include "at-func.c"
+# undef AT_FUNC_NAME
+# undef AT_FUNC_F1
+# undef AT_FUNC_F2
+# undef AT_FUNC_USE_F1_COND
+# undef AT_FUNC_POST_FILE_PARAM_DECLS
+# undef AT_FUNC_POST_FILE_ARGS
+
+#endif /* !HAVE_FSTATAT */
diff --git a/lib/ftell.c b/lib/ftell.c
new file mode 100644
index 0000000..234c193
--- /dev/null
+++ b/lib/ftell.c
@@ -0,0 +1,37 @@
+/* An ftell() function that works around platform bugs.
+ Copyright (C) 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+
+long
+ftell (FILE *fp)
+{
+ /* Use the replacement ftello function with all its workarounds. */
+ off_t offset = ftello (fp);
+ if (LONG_MIN <= offset && offset <= LONG_MAX)
+ return /* (long) */ offset;
+ else
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+}
diff --git a/lib/ftello.c b/lib/ftello.c
new file mode 100644
index 0000000..43d4a4d
--- /dev/null
+++ b/lib/ftello.c
@@ -0,0 +1,85 @@
+/* An ftello() function that works around platform bugs.
+ Copyright (C) 2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Get lseek. */
+#include <unistd.h>
+
+#include "stdio-impl.h"
+
+off_t
+ftello (FILE *fp)
+#undef ftello
+#if !HAVE_FTELLO
+# undef ftell
+# define ftello ftell
+#endif
+#if _GL_WINDOWS_64_BIT_OFF_T
+# undef ftello
+# if HAVE__FTELLI64 /* msvc, mingw64 */
+# define ftello _ftelli64
+# else /* mingw */
+# define ftello ftello64
+# endif
+#endif
+{
+#if LSEEK_PIPE_BROKEN
+ /* mingw gives bogus answers rather than failure on non-seekable files. */
+ if (lseek (fileno (fp), 0, SEEK_CUR) == -1)
+ return -1;
+#endif
+
+#if FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE /* Solaris */
+ /* The Solaris stdio leaves the _IOREAD flag set after reading from a file
+ reaches EOF and the program then starts writing to the file. ftello
+ gets confused by this. */
+ if (fp_->_flag & _IOWRT)
+ {
+ off_t pos;
+
+ /* Call ftello nevertheless, for the side effects that it does on fp. */
+ ftello (fp);
+
+ /* Compute the file position ourselves. */
+ pos = lseek (fileno (fp), (off_t) 0, SEEK_CUR);
+ if (pos >= 0)
+ {
+ if ((fp_->_flag & _IONBF) == 0 && fp_->_base != NULL)
+ pos += fp_->_ptr - fp_->_base;
+ }
+ return pos;
+ }
+#endif
+
+#if defined __SL64 && defined __SCLE /* Cygwin */
+ if ((fp->_flags & __SL64) == 0)
+ {
+ /* Cygwin 1.5.0 through 1.5.24 failed to open stdin in 64-bit
+ mode; but has an ftello that requires 64-bit mode. */
+ FILE *tmp = fopen ("/dev/null", "r");
+ if (!tmp)
+ return -1;
+ fp->_flags |= __SL64;
+ fp->_seek64 = tmp->_seek64;
+ fclose (tmp);
+ }
+#endif
+ return ftello (fp);
+}
diff --git a/lib/futimens.c b/lib/futimens.c
new file mode 100644
index 0000000..83fb27c
--- /dev/null
+++ b/lib/futimens.c
@@ -0,0 +1,37 @@
+/* Set the access and modification time of an open fd.
+ Copyright (C) 2009-2020 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/>. */
+
+/* written by Eric Blake */
+
+#include <config.h>
+
+#include <sys/stat.h>
+
+#include "utimens.h"
+
+/* Set the access and modification timestamps of FD to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ Fail with ENOSYS on systems without futimes (or equivalent).
+ If TIMESPEC is null, set the timestamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+int
+futimens (int fd, struct timespec const times[2])
+{
+ /* fdutimens also works around bugs in native futimens, when running
+ with glibc compiled against newer headers but on a Linux kernel
+ older than 2.6.32. */
+ return fdutimens (fd, NULL, times);
+}
diff --git a/lib/gai_strerror.c b/lib/gai_strerror.c
new file mode 100644
index 0000000..c50c3f3
--- /dev/null
+++ b/lib/gai_strerror.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 1997, 2001-2002, 2004-2006, 2008-2020 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Philip Blundell <pjb27@cam.ac.uk>, 1997.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <netdb.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(String) gettext (String)
+# define N_(String) String
+#endif
+
+#if HAVE_DECL_GAI_STRERROR
+
+# include <sys/socket.h>
+# undef gai_strerror
+# if HAVE_DECL_GAI_STRERRORA
+# define gai_strerror gai_strerrorA
+# endif
+
+const char *
+rpl_gai_strerror (int code)
+{
+ return gai_strerror (code);
+}
+
+#else /* !HAVE_DECL_GAI_STRERROR */
+
+static struct
+ {
+ int code;
+ const char *msg;
+ }
+values[] =
+ {
+ { EAI_ADDRFAMILY, N_("Address family for hostname not supported") },
+ { EAI_AGAIN, N_("Temporary failure in name resolution") },
+ { EAI_BADFLAGS, N_("Bad value for ai_flags") },
+ { EAI_FAIL, N_("Non-recoverable failure in name resolution") },
+ { EAI_FAMILY, N_("ai_family not supported") },
+ { EAI_MEMORY, N_("Memory allocation failure") },
+ { EAI_NODATA, N_("No address associated with hostname") },
+ { EAI_NONAME, N_("Name or service not known") },
+ { EAI_SERVICE, N_("Servname not supported for ai_socktype") },
+ { EAI_SOCKTYPE, N_("ai_socktype not supported") },
+ { EAI_SYSTEM, N_("System error") },
+ { EAI_OVERFLOW, N_("Argument buffer too small") },
+#ifdef EAI_INPROGRESS
+ { EAI_INPROGRESS, N_("Processing request in progress") },
+ { EAI_CANCELED, N_("Request canceled") },
+ { EAI_NOTCANCELED, N_("Request not canceled") },
+ { EAI_ALLDONE, N_("All requests done") },
+ { EAI_INTR, N_("Interrupted by a signal") },
+ { EAI_IDN_ENCODE, N_("Parameter string not correctly encoded") }
+#endif
+ };
+
+const char *
+gai_strerror (int code)
+{
+ size_t i;
+ for (i = 0; i < sizeof (values) / sizeof (values[0]); ++i)
+ if (values[i].code == code)
+ return _(values[i].msg);
+
+ return _("Unknown error");
+}
+# ifdef _LIBC
+libc_hidden_def (gai_strerror)
+# endif
+#endif /* !HAVE_DECL_GAI_STRERROR */
diff --git a/lib/getaddrinfo.c b/lib/getaddrinfo.c
new file mode 100644
index 0000000..1f45796
--- /dev/null
+++ b/lib/getaddrinfo.c
@@ -0,0 +1,505 @@
+/* Get address information (partial implementation).
+ Copyright (C) 1997, 2001-2002, 2004-2020 Free Software Foundation, Inc.
+ Contributed by Simon Josefsson <simon@josefsson.org>.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the sa == NULL test below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <config.h>
+
+#include <netdb.h>
+
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+
+/* Get inet_ntop. */
+#include <arpa/inet.h>
+
+/* Get calloc. */
+#include <stdlib.h>
+
+/* Get memcpy, strdup. */
+#include <string.h>
+
+/* Get snprintf. */
+#include <stdio.h>
+
+#include <stdbool.h>
+
+#include "gettext.h"
+#define _(String) gettext (String)
+#define N_(String) String
+
+/* BeOS has AF_INET, but not PF_INET. */
+#ifndef PF_INET
+# define PF_INET AF_INET
+#endif
+/* BeOS also lacks PF_UNSPEC. */
+#ifndef PF_UNSPEC
+# define PF_UNSPEC 0
+#endif
+
+#if HAVE_GETADDRINFO
+
+/* Override with cdecl calling convention. */
+
+int
+getaddrinfo (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+# undef getaddrinfo
+{
+ return getaddrinfo (nodename, servname, hints, res);
+}
+
+void
+freeaddrinfo (struct addrinfo *ai)
+# undef freeaddrinfo
+{
+ freeaddrinfo (ai);
+}
+
+#else
+
+# if defined _WIN32 && !defined __CYGWIN__
+# define WINDOWS_NATIVE
+# endif
+
+/* gl_sockets_startup */
+# include "sockets.h"
+
+# ifdef WINDOWS_NATIVE
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetModuleHandle
+# define GetModuleHandle GetModuleHandleA
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WINXP)
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
+typedef int (WSAAPI *getaddrinfo_func) (const char*, const char*,
+ const struct addrinfo*,
+ struct addrinfo**);
+typedef void (WSAAPI *freeaddrinfo_func) (struct addrinfo*);
+typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr*,
+ socklen_t, char*, DWORD,
+ char*, DWORD, int);
+
+static getaddrinfo_func getaddrinfo_ptr = NULL;
+static freeaddrinfo_func freeaddrinfo_ptr = NULL;
+static getnameinfo_func getnameinfo_ptr = NULL;
+
+static int
+use_win32_p (void)
+{
+ static int done = 0;
+ HMODULE h;
+
+ if (done)
+ return getaddrinfo_ptr ? 1 : 0;
+
+ done = 1;
+
+ h = GetModuleHandle ("ws2_32.dll");
+
+ if (h)
+ {
+ getaddrinfo_ptr = (getaddrinfo_func) GetProcAddress (h, "getaddrinfo");
+ freeaddrinfo_ptr = (freeaddrinfo_func) GetProcAddress (h, "freeaddrinfo");
+ getnameinfo_ptr = (getnameinfo_func) GetProcAddress (h, "getnameinfo");
+ }
+
+ /* If either is missing, something is odd. */
+ if (!getaddrinfo_ptr || !freeaddrinfo_ptr || !getnameinfo_ptr)
+ {
+ getaddrinfo_ptr = NULL;
+ freeaddrinfo_ptr = NULL;
+ getnameinfo_ptr = NULL;
+ return 0;
+ }
+
+ gl_sockets_startup (SOCKETS_1_1);
+
+ return 1;
+}
+
+# else
+
+static int
+use_win32_p (void)
+{
+ static int done = 0;
+
+ if (!done)
+ {
+ done = 1;
+
+ gl_sockets_startup (SOCKETS_1_1);
+ }
+
+ return 1;
+}
+
+# define getaddrinfo_ptr getaddrinfo
+# define freeaddrinfo_ptr freeaddrinfo
+# define getnameinfo_ptr getnameinfo
+
+# endif
+# endif
+
+static bool
+validate_family (int family)
+{
+ /* FIXME: Support more families. */
+# if HAVE_IPV4
+ if (family == PF_INET)
+ return true;
+# endif
+# if HAVE_IPV6
+ if (family == PF_INET6)
+ return true;
+# endif
+ if (family == PF_UNSPEC)
+ return true;
+ return false;
+}
+
+/* Translate name of a service location and/or a service name to set of
+ socket addresses. */
+int
+getaddrinfo (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+#undef getaddrinfo
+{
+ struct addrinfo *tmp;
+ int port = 0;
+ struct hostent *he;
+ void *storage;
+ size_t size;
+# if HAVE_IPV6
+ struct v6_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in6 sockaddr_in6;
+ };
+# endif
+# if HAVE_IPV4
+ struct v4_pair {
+ struct addrinfo addrinfo;
+ struct sockaddr_in sockaddr_in;
+ };
+# endif
+
+# ifdef WINDOWS_NATIVE
+ if (use_win32_p ())
+ return getaddrinfo_ptr (nodename, servname, hints, res);
+# endif
+
+ if (hints && (hints->ai_flags & ~(AI_CANONNAME|AI_PASSIVE)))
+ /* FIXME: Support more flags. */
+ return EAI_BADFLAGS;
+
+ if (hints && !validate_family (hints->ai_family))
+ return EAI_FAMILY;
+
+ if (hints &&
+ hints->ai_socktype != SOCK_STREAM && hints->ai_socktype != SOCK_DGRAM)
+ /* FIXME: Support other socktype. */
+ return EAI_SOCKTYPE; /* FIXME: Better return code? */
+
+ if (!nodename)
+ {
+ if (!(hints->ai_flags & AI_PASSIVE))
+ return EAI_NONAME;
+
+# ifdef HAVE_IPV6
+ nodename = (hints->ai_family == AF_INET6) ? "::" : "0.0.0.0";
+# else
+ nodename = "0.0.0.0";
+# endif
+ }
+
+ if (servname)
+ {
+ struct servent *se = NULL;
+ const char *proto =
+ (hints && hints->ai_socktype == SOCK_DGRAM) ? "udp" : "tcp";
+
+ if (hints == NULL || !(hints->ai_flags & AI_NUMERICSERV))
+ /* FIXME: Use getservbyname_r if available. */
+ se = getservbyname (servname, proto);
+
+ if (!se)
+ {
+ char *c;
+ if (!(*servname >= '0' && *servname <= '9'))
+ return EAI_NONAME;
+ port = strtoul (servname, &c, 10);
+ if (*c || port > 0xffff)
+ return EAI_NONAME;
+ port = htons (port);
+ }
+ else
+ port = se->s_port;
+ }
+
+ /* FIXME: Use gethostbyname_r if available. */
+ he = gethostbyname (nodename);
+ if (!he || he->h_addr_list[0] == NULL)
+ return EAI_NONAME;
+
+ switch (he->h_addrtype)
+ {
+# if HAVE_IPV6
+ case PF_INET6:
+ size = sizeof (struct v6_pair);
+ break;
+# endif
+
+# if HAVE_IPV4
+ case PF_INET:
+ size = sizeof (struct v4_pair);
+ break;
+# endif
+
+ default:
+ return EAI_NODATA;
+ }
+
+ storage = calloc (1, size);
+ if (!storage)
+ return EAI_MEMORY;
+
+ switch (he->h_addrtype)
+ {
+# if HAVE_IPV6
+ case PF_INET6:
+ {
+ struct v6_pair *p = storage;
+ struct sockaddr_in6 *sinp = &p->sockaddr_in6;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin6_port = port;
+
+ if (he->h_length != sizeof (sinp->sin6_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin6_addr, he->h_addr_list[0], sizeof sinp->sin6_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+# endif
+
+# if HAVE_IPV4
+ case PF_INET:
+ {
+ struct v4_pair *p = storage;
+ struct sockaddr_in *sinp = &p->sockaddr_in;
+ tmp = &p->addrinfo;
+
+ if (port)
+ sinp->sin_port = port;
+
+ if (he->h_length != sizeof (sinp->sin_addr))
+ {
+ free (storage);
+ return EAI_SYSTEM; /* FIXME: Better return code? Set errno? */
+ }
+
+ memcpy (&sinp->sin_addr, he->h_addr_list[0], sizeof sinp->sin_addr);
+
+ tmp->ai_addr = (struct sockaddr *) sinp;
+ tmp->ai_addrlen = sizeof *sinp;
+ }
+ break;
+# endif
+
+ default:
+ free (storage);
+ return EAI_NODATA;
+ }
+
+ if (hints && hints->ai_flags & AI_CANONNAME)
+ {
+ const char *cn;
+ if (he->h_name)
+ cn = he->h_name;
+ else
+ cn = nodename;
+
+ tmp->ai_canonname = strdup (cn);
+ if (!tmp->ai_canonname)
+ {
+ free (storage);
+ return EAI_MEMORY;
+ }
+ }
+
+ tmp->ai_protocol = (hints) ? hints->ai_protocol : 0;
+ tmp->ai_socktype = (hints) ? hints->ai_socktype : 0;
+ tmp->ai_addr->sa_family = he->h_addrtype;
+ tmp->ai_family = he->h_addrtype;
+
+# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ switch (he->h_addrtype)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in);
+ break;
+# endif
+# if HAVE_IPV6
+ case AF_INET6:
+ tmp->ai_addr->sa_len = sizeof (struct sockaddr_in6);
+ break;
+# endif
+ }
+# endif
+
+ /* FIXME: If more than one address, create linked list of addrinfo's. */
+
+ *res = tmp;
+
+ return 0;
+}
+
+/* Free 'addrinfo' structure AI including associated storage. */
+void
+freeaddrinfo (struct addrinfo *ai)
+#undef freeaddrinfo
+{
+# ifdef WINDOWS_NATIVE
+ if (use_win32_p ())
+ {
+ freeaddrinfo_ptr (ai);
+ return;
+ }
+# endif
+
+ while (ai)
+ {
+ struct addrinfo *cur;
+
+ cur = ai;
+ ai = ai->ai_next;
+
+ free (cur->ai_canonname);
+ free (cur);
+ }
+}
+
+int
+getnameinfo (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+#undef getnameinfo
+{
+# ifdef WINDOWS_NATIVE
+ if (use_win32_p ())
+ return getnameinfo_ptr (sa, salen, node, nodelen,
+ service, servicelen, flags);
+# endif
+
+ /* FIXME: Support other flags. */
+ if ((node && nodelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (service && servicelen > 0 && !(flags & NI_NUMERICHOST)) ||
+ (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV)))
+ return EAI_BADFLAGS;
+
+ if (sa == NULL || salen < sizeof (sa->sa_family))
+ return EAI_FAMILY;
+
+ switch (sa->sa_family)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+ if (salen < sizeof (struct sockaddr_in))
+ return EAI_FAMILY;
+ break;
+# endif
+# if HAVE_IPV6
+ case AF_INET6:
+ if (salen < sizeof (struct sockaddr_in6))
+ return EAI_FAMILY;
+ break;
+# endif
+ default:
+ return EAI_FAMILY;
+ }
+
+ if (node && nodelen > 0 && flags & NI_NUMERICHOST)
+ {
+ switch (sa->sa_family)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+ if (!inet_ntop (AF_INET,
+ &(((const struct sockaddr_in *) sa)->sin_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+# endif
+
+# if HAVE_IPV6
+ case AF_INET6:
+ if (!inet_ntop (AF_INET6,
+ &(((const struct sockaddr_in6 *) sa)->sin6_addr),
+ node, nodelen))
+ return EAI_SYSTEM;
+ break;
+# endif
+
+ default:
+ return EAI_FAMILY;
+ }
+ }
+
+ if (service && servicelen > 0 && flags & NI_NUMERICSERV)
+ switch (sa->sa_family)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+# endif
+# if HAVE_IPV6
+ case AF_INET6:
+# endif
+ {
+ unsigned short int port
+ = ntohs (((const struct sockaddr_in *) sa)->sin_port);
+ if (servicelen <= snprintf (service, servicelen, "%u", port))
+ return EAI_OVERFLOW;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+#endif
diff --git a/lib/getcwd-lgpl.c b/lib/getcwd-lgpl.c
new file mode 100644
index 0000000..90cfa0f
--- /dev/null
+++ b/lib/getcwd-lgpl.c
@@ -0,0 +1,135 @@
+/* Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ This file is part of gnulib.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification */
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if GNULIB_GETCWD
+/* Favor GPL getcwd.c if both getcwd and getcwd-lgpl modules are in use. */
+typedef int dummy;
+#else
+
+/* Get the name of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL if the directory couldn't be determined
+ (perhaps because the absolute name was longer than PATH_MAX, or
+ because of missing read/search permissions on parent directories)
+ or SIZE was too small. If successful, returns BUF. If BUF is
+ NULL, an array is allocated with 'malloc'; the array is SIZE bytes
+ long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+
+# undef getcwd
+# if defined _WIN32 && !defined __CYGWIN__
+# define getcwd _getcwd
+# endif
+
+char *
+rpl_getcwd (char *buf, size_t size)
+{
+ char *ptr;
+ char *result;
+
+ /* Handle single size operations. */
+ if (buf)
+ {
+ if (!size)
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+ return getcwd (buf, size);
+ }
+
+ if (size)
+ {
+ buf = malloc (size);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ result = getcwd (buf, size);
+ if (!result)
+ {
+ int saved_errno = errno;
+ free (buf);
+ errno = saved_errno;
+ }
+ return result;
+ }
+
+ /* Flexible sizing requested. Avoid over-allocation for the common
+ case of a name that fits within a 4k page, minus some space for
+ local variables, to be sure we don't skip over a guard page. */
+ {
+ char tmp[4032];
+ size = sizeof tmp;
+ ptr = getcwd (tmp, size);
+ if (ptr)
+ {
+ result = strdup (ptr);
+ if (!result)
+ errno = ENOMEM;
+ return result;
+ }
+ if (errno != ERANGE)
+ return NULL;
+ }
+
+ /* My what a large directory name we have. */
+ do
+ {
+ size <<= 1;
+ ptr = realloc (buf, size);
+ if (ptr == NULL)
+ {
+ free (buf);
+ errno = ENOMEM;
+ return NULL;
+ }
+ buf = ptr;
+ result = getcwd (buf, size);
+ }
+ while (!result && errno == ERANGE);
+
+ if (!result)
+ {
+ int saved_errno = errno;
+ free (buf);
+ errno = saved_errno;
+ }
+ else
+ {
+ /* Here result == buf. */
+ /* Shrink result before returning it. */
+ size_t actual_size = strlen (result) + 1;
+ if (actual_size < size)
+ {
+ char *shrinked_result = realloc (result, actual_size);
+ if (shrinked_result != NULL)
+ result = shrinked_result;
+ }
+ }
+ return result;
+}
+
+#endif
diff --git a/lib/getcwd.c b/lib/getcwd.c
new file mode 100644
index 0000000..77d413e
--- /dev/null
+++ b/lib/getcwd.c
@@ -0,0 +1,496 @@
+/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <config.h>
+# include <unistd.h>
+# include "pathmax.h"
+#else
+# define HAVE_OPENAT 1
+# define D_INO_IN_DIRENT 1
+# define HAVE_MSVC_INVALID_PARAMETER_HANDLER 0
+# define HAVE_MINIMALLY_WORKING_GETCWD 0
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#include <fcntl.h> /* For AT_FDCWD on Solaris 9. */
+
+/* If this host provides the openat function or if we're using the
+ gnulib replacement function with a native fdopendir, then enable
+ code below to make getcwd more efficient and robust. */
+#if defined HAVE_OPENAT || (defined GNULIB_OPENAT && defined HAVE_FDOPENDIR)
+# define HAVE_OPENAT_SUPPORT 1
+#else
+# define HAVE_OPENAT_SUPPORT 0
+#endif
+
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+#include <dirent.h>
+#ifndef _D_EXACT_NAMLEN
+# define _D_EXACT_NAMLEN(d) strlen ((d)->d_name)
+#endif
+#ifndef _D_ALLOC_NAMLEN
+# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
+#endif
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if _LIBC
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* In this file, PATH_MAX only serves as a threshold for choosing among two
+ algorithms. */
+#ifndef PATH_MAX
+# define PATH_MAX 8192
+#endif
+
+#if D_INO_IN_DIRENT
+# define MATCHING_INO(dp, ino) ((dp)->d_ino == (ino))
+#else
+# define MATCHING_INO(dp, ino) true
+#endif
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#if !_LIBC
+# define GETCWD_RETURN_TYPE char *
+# define __close_nocancel_nostatus close
+# define __getcwd_generic rpl_getcwd
+# undef stat64
+# define stat64 stat
+# define __fstat64 fstat
+# define __fstatat64 fstatat
+# define __lstat64 lstat
+# define __closedir closedir
+# define __opendir opendir
+# define __readdir64 readdir
+# define __fdopendir fdopendir
+# define __openat openat
+# define __rewinddir rewinddir
+# define __openat64 openat
+# define dirent64 dirent
+#else
+# include <not-cancel.h>
+#endif
+
+/* The results of opendir() in this file are not used with dirfd and fchdir,
+ and we do not leak fds to any single-threaded code that could use stdio,
+ therefore save some unnecessary recursion in fchdir.c.
+ FIXME - if the kernel ever adds support for multi-thread safety for
+ avoiding standard fds, then we should use opendir_safer and
+ openat_safer. */
+#ifdef GNULIB_defined_opendir
+# undef opendir
+#endif
+#ifdef GNULIB_defined_closedir
+# undef closedir
+#endif
+
+#if defined _WIN32 && !defined __CYGWIN__
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static char *
+getcwd_nothrow (char *buf, size_t size)
+{
+ char *result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _getcwd (buf, size);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = NULL;
+ errno = ERANGE;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define getcwd_nothrow _getcwd
+# endif
+# define getcwd_system getcwd_nothrow
+#else
+# define getcwd_system getcwd
+#endif
+
+/* Get the name of the current working directory, and put it in SIZE
+ bytes of BUF. Returns NULL with errno set if the directory couldn't be
+ determined or SIZE was too small. If successful, returns BUF. In GNU,
+ if BUF is NULL, an array is allocated with 'malloc'; the array is SIZE
+ bytes long, unless SIZE == 0, in which case it is as big as necessary. */
+
+GETCWD_RETURN_TYPE
+__getcwd_generic (char *buf, size_t size)
+{
+ /* Lengths of big file name components and entire file names, and a
+ deep level of file name nesting. These numbers are not upper
+ bounds; they are merely large values suitable for initial
+ allocations, designed to be large enough for most real-world
+ uses. */
+ enum
+ {
+ BIG_FILE_NAME_COMPONENT_LENGTH = 255,
+ BIG_FILE_NAME_LENGTH = MIN (4095, PATH_MAX - 1),
+ DEEP_NESTING = 100
+ };
+
+#if HAVE_OPENAT_SUPPORT
+ int fd = AT_FDCWD;
+ bool fd_needs_closing = false;
+#else
+ char dots[DEEP_NESTING * sizeof ".." + BIG_FILE_NAME_COMPONENT_LENGTH + 1];
+ char *dotlist = dots;
+ size_t dotsize = sizeof dots;
+ size_t dotlen = 0;
+#endif
+ DIR *dirstream = NULL;
+ dev_t rootdev, thisdev;
+ ino_t rootino, thisino;
+ char *dir;
+ register char *dirp;
+ struct stat64 st;
+ size_t allocated = size;
+ size_t used;
+
+#if HAVE_MINIMALLY_WORKING_GETCWD
+ /* If AT_FDCWD is not defined, the algorithm below is O(N**2) and
+ this is much slower than the system getcwd (at least on
+ GNU/Linux). So trust the system getcwd's results unless they
+ look suspicious.
+
+ Use the system getcwd even if we have openat support, since the
+ system getcwd works even when a parent is unreadable, while the
+ openat-based approach does not.
+
+ But on AIX 5.1..7.1, the system getcwd is not even minimally
+ working: If the current directory name is slightly longer than
+ PATH_MAX, it omits the first directory component and returns
+ this wrong result with errno = 0. */
+
+# undef getcwd
+ dir = getcwd_system (buf, size);
+ if (dir || (size && errno == ERANGE))
+ return dir;
+
+ /* Solaris getcwd (NULL, 0) fails with errno == EINVAL, but it has
+ internal magic that lets it work even if an ancestor directory is
+ inaccessible, which is better in many cases. So in this case try
+ again with a buffer that's almost always big enough. */
+ if (errno == EINVAL && buf == NULL && size == 0)
+ {
+ char big_buffer[BIG_FILE_NAME_LENGTH + 1];
+ dir = getcwd_system (big_buffer, sizeof big_buffer);
+ if (dir)
+ return strdup (dir);
+ }
+
+# if HAVE_PARTLY_WORKING_GETCWD
+ /* The system getcwd works, except it sometimes fails when it
+ shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+ if (errno != ERANGE && errno != ENAMETOOLONG && errno != ENOENT)
+ return NULL;
+# endif
+#endif
+ if (size == 0)
+ {
+ if (buf != NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ allocated = BIG_FILE_NAME_LENGTH + 1;
+ }
+
+ if (buf == NULL)
+ {
+ dir = malloc (allocated);
+ if (dir == NULL)
+ return NULL;
+ }
+ else
+ dir = buf;
+
+ dirp = dir + allocated;
+ *--dirp = '\0';
+
+ if (__lstat64 (".", &st) < 0)
+ goto lose;
+ thisdev = st.st_dev;
+ thisino = st.st_ino;
+
+ if (__lstat64 ("/", &st) < 0)
+ goto lose;
+ rootdev = st.st_dev;
+ rootino = st.st_ino;
+
+ while (!(thisdev == rootdev && thisino == rootino))
+ {
+ struct dirent64 *d;
+ dev_t dotdev;
+ ino_t dotino;
+ bool mount_point;
+ int parent_status;
+ size_t dirroom;
+ size_t namlen;
+ bool use_d_ino = true;
+
+ /* Look at the parent directory. */
+#if HAVE_OPENAT_SUPPORT
+ fd = __openat64 (fd, "..", O_RDONLY);
+ if (fd < 0)
+ goto lose;
+ fd_needs_closing = true;
+ parent_status = __fstat64 (fd, &st);
+#else
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen++] = '.';
+ dotlist[dotlen] = '\0';
+ parent_status = __lstat64 (dotlist, &st);
+#endif
+ if (parent_status != 0)
+ goto lose;
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ /* Figure out if this directory is a mount point. */
+ dotdev = st.st_dev;
+ dotino = st.st_ino;
+ mount_point = dotdev != thisdev;
+
+ /* Search for the last directory. */
+#if HAVE_OPENAT_SUPPORT
+ dirstream = __fdopendir (fd);
+ if (dirstream == NULL)
+ goto lose;
+ fd_needs_closing = false;
+#else
+ dirstream = __opendir (dotlist);
+ if (dirstream == NULL)
+ goto lose;
+ dotlist[dotlen++] = '/';
+#endif
+ for (;;)
+ {
+ /* Clear errno to distinguish EOF from error if readdir returns
+ NULL. */
+ __set_errno (0);
+ d = __readdir64 (dirstream);
+
+ /* When we've iterated through all directory entries without finding
+ one with a matching d_ino, rewind the stream and consider each
+ name again, but this time, using lstat. This is necessary in a
+ chroot on at least one system (glibc-2.3.6 + linux 2.6.12), where
+ .., ../.., ../../.., etc. all had the same device number, yet the
+ d_ino values for entries in / did not match those obtained
+ via lstat. */
+ if (d == NULL && errno == 0 && use_d_ino)
+ {
+ use_d_ino = false;
+ __rewinddir (dirstream);
+ d = __readdir64 (dirstream);
+ }
+
+ if (d == NULL)
+ {
+ if (errno == 0)
+ /* EOF on dirstream, which can mean e.g., that the current
+ directory has been removed. */
+ __set_errno (ENOENT);
+ goto lose;
+ }
+ if (d->d_name[0] == '.' &&
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0')))
+ continue;
+
+ if (use_d_ino)
+ {
+ bool match = (MATCHING_INO (d, thisino) || mount_point);
+ if (! match)
+ continue;
+ }
+
+ {
+ int entry_status;
+#if HAVE_OPENAT_SUPPORT
+ entry_status = __fstatat64 (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW);
+#else
+ /* Compute size needed for this file name, or for the file
+ name ".." in the same directory, whichever is larger.
+ Room for ".." might be needed the next time through
+ the outer loop. */
+ size_t name_alloc = _D_ALLOC_NAMLEN (d);
+ size_t filesize = dotlen + MAX (sizeof "..", name_alloc);
+
+ if (filesize < dotlen)
+ goto memory_exhausted;
+
+ if (dotsize < filesize)
+ {
+ /* My, what a deep directory tree you have, Grandma. */
+ size_t newsize = MAX (filesize, dotsize * 2);
+ size_t i;
+ if (newsize < dotsize)
+ goto memory_exhausted;
+ if (dotlist != dots)
+ free (dotlist);
+ dotlist = malloc (newsize);
+ if (dotlist == NULL)
+ goto lose;
+ dotsize = newsize;
+
+ i = 0;
+ do
+ {
+ dotlist[i++] = '.';
+ dotlist[i++] = '.';
+ dotlist[i++] = '/';
+ }
+ while (i < dotlen);
+ }
+
+ memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
+ entry_status = __lstat64 (dotlist, &st);
+#endif
+ /* We don't fail here if we cannot stat() a directory entry.
+ This can happen when (network) file systems fail. If this
+ entry is in fact the one we are looking for we will find
+ out soon as we reach the end of the directory without
+ having found anything. */
+ if (entry_status == 0 && S_ISDIR (st.st_mode)
+ && st.st_dev == thisdev && st.st_ino == thisino)
+ break;
+ }
+ }
+
+ dirroom = dirp - dir;
+ namlen = _D_EXACT_NAMLEN (d);
+
+ if (dirroom <= namlen)
+ {
+ if (size != 0)
+ {
+ __set_errno (ERANGE);
+ goto lose;
+ }
+ else
+ {
+ char *tmp;
+ size_t oldsize = allocated;
+
+ allocated += MAX (allocated, namlen);
+ if (allocated < oldsize
+ || ! (tmp = realloc (dir, allocated)))
+ goto memory_exhausted;
+
+ /* Move current contents up to the end of the buffer.
+ This is guaranteed to be non-overlapping. */
+ dirp = memcpy (tmp + allocated - (oldsize - dirroom),
+ tmp + dirroom,
+ oldsize - dirroom);
+ dir = tmp;
+ }
+ }
+ dirp -= namlen;
+ memcpy (dirp, d->d_name, namlen);
+ *--dirp = '/';
+
+ thisdev = dotdev;
+ thisino = dotino;
+ }
+
+ if (dirstream && __closedir (dirstream) != 0)
+ {
+ dirstream = NULL;
+ goto lose;
+ }
+
+ if (dirp == &dir[allocated - 1])
+ *--dirp = '/';
+
+#if ! HAVE_OPENAT_SUPPORT
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+
+ used = dir + allocated - dirp;
+ memmove (dir, dirp, used);
+
+ if (size == 0)
+ /* Ensure that the buffer is only as large as necessary. */
+ buf = (used < allocated ? realloc (dir, used) : dir);
+
+ if (buf == NULL)
+ /* Either buf was NULL all along, or 'realloc' failed but
+ we still have the original string. */
+ buf = dir;
+
+ return buf;
+
+ memory_exhausted:
+ __set_errno (ENOMEM);
+ lose:
+ {
+ int save = errno;
+ if (dirstream)
+ __closedir (dirstream);
+#if HAVE_OPENAT_SUPPORT
+ if (fd_needs_closing)
+ __close_nocancel_nostatus (fd);
+#else
+ if (dotlist != dots)
+ free (dotlist);
+#endif
+ if (buf == NULL)
+ free (dir);
+ __set_errno (save);
+ }
+ return NULL;
+}
+
+#if defined _LIBC && !defined GETCWD_RETURN_TYPE
+libc_hidden_def (__getcwd)
+weak_alias (__getcwd, getcwd)
+#endif
diff --git a/lib/getdelim.c b/lib/getdelim.c
new file mode 100644
index 0000000..fb39b46
--- /dev/null
+++ b/lib/getdelim.c
@@ -0,0 +1,147 @@
+/* getdelim.c --- Implementation of replacement getdelim function.
+ Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2020 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, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Ported from glibc by Simon Josefsson. */
+
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
+#define _GL_ARG_NONNULL(params)
+
+#include <config.h>
+
+#include <stdio.h>
+
+#include <limits.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# define getc_maybe_unlocked(fp) getc(fp)
+#elif !HAVE_FLOCKFILE || !HAVE_FUNLOCKFILE || !HAVE_DECL_GETC_UNLOCKED
+# undef flockfile
+# undef funlockfile
+# define flockfile(x) ((void) 0)
+# define funlockfile(x) ((void) 0)
+# define getc_maybe_unlocked(fp) getc(fp)
+#else
+# define getc_maybe_unlocked(fp) getc_unlocked(fp)
+#endif
+
+static void
+alloc_failed (void)
+{
+#if defined _WIN32 && ! defined __CYGWIN__
+ /* Avoid errno problem without using the realloc module; see:
+ https://lists.gnu.org/r/bug-gnulib/2016-08/msg00025.html */
+ errno = ENOMEM;
+#endif
+}
+
+/* Read up to (and including) a DELIMITER from FP into *LINEPTR (and
+ NUL-terminate it). *LINEPTR is a pointer returned from malloc (or
+ NULL), pointing to *N characters of space. It is realloc'ed as
+ necessary. Returns the number of characters read (not including
+ the null terminator), or -1 on error or EOF. */
+
+ssize_t
+getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
+{
+ ssize_t result;
+ size_t cur_len = 0;
+
+ if (lineptr == NULL || n == NULL || fp == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ flockfile (fp);
+
+ if (*lineptr == NULL || *n == 0)
+ {
+ char *new_lineptr;
+ *n = 120;
+ new_lineptr = (char *) realloc (*lineptr, *n);
+ if (new_lineptr == NULL)
+ {
+ alloc_failed ();
+ result = -1;
+ goto unlock_return;
+ }
+ *lineptr = new_lineptr;
+ }
+
+ for (;;)
+ {
+ int i;
+
+ i = getc_maybe_unlocked (fp);
+ if (i == EOF)
+ {
+ result = -1;
+ break;
+ }
+
+ /* Make enough space for len+1 (for final NUL) bytes. */
+ if (cur_len + 1 >= *n)
+ {
+ size_t needed_max =
+ SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX;
+ size_t needed = 2 * *n + 1; /* Be generous. */
+ char *new_lineptr;
+
+ if (needed_max < needed)
+ needed = needed_max;
+ if (cur_len + 1 >= needed)
+ {
+ result = -1;
+ errno = EOVERFLOW;
+ goto unlock_return;
+ }
+
+ new_lineptr = (char *) realloc (*lineptr, needed);
+ if (new_lineptr == NULL)
+ {
+ alloc_failed ();
+ result = -1;
+ goto unlock_return;
+ }
+
+ *lineptr = new_lineptr;
+ *n = needed;
+ }
+
+ (*lineptr)[cur_len] = i;
+ cur_len++;
+
+ if (i == delimiter)
+ break;
+ }
+ (*lineptr)[cur_len] = '\0';
+ result = cur_len ? cur_len : result;
+
+ unlock_return:
+ funlockfile (fp); /* doesn't set errno */
+
+ return result;
+}
diff --git a/lib/getdtablesize.c b/lib/getdtablesize.c
new file mode 100644
index 0000000..0fe7092
--- /dev/null
+++ b/lib/getdtablesize.c
@@ -0,0 +1,124 @@
+/* getdtablesize() function: Return maximum possible file descriptor value + 1.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+# include <stdio.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+# endif
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+_setmaxstdio_nothrow (int newmax)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _setmaxstdio (newmax);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define _setmaxstdio_nothrow _setmaxstdio
+# endif
+
+/* Cache for the previous getdtablesize () result. Safe to cache because
+ Windows also lacks setrlimit. */
+static int dtablesize;
+
+int
+getdtablesize (void)
+{
+ if (dtablesize == 0)
+ {
+ /* We are looking for the number N such that the valid file descriptors
+ are 0..N-1. It can be obtained through a loop as follows:
+ {
+ int fd;
+ for (fd = 3; fd < 65536; fd++)
+ if (dup2 (0, fd) == -1)
+ break;
+ return fd;
+ }
+ On Windows XP, the result is 2048.
+ The drawback of this loop is that it allocates memory for a libc
+ internal array that is never freed.
+
+ The number N can also be obtained as the upper bound for
+ _getmaxstdio (). _getmaxstdio () returns the maximum number of open
+ FILE objects. The sanity check in _setmaxstdio reveals the maximum
+ number of file descriptors. This too allocates memory, but it is
+ freed when we call _setmaxstdio with the original value. */
+ int orig_max_stdio = _getmaxstdio ();
+ unsigned int bound;
+ for (bound = 0x10000; _setmaxstdio_nothrow (bound) < 0; bound = bound / 2)
+ ;
+ _setmaxstdio_nothrow (orig_max_stdio);
+ dtablesize = bound;
+ }
+ return dtablesize;
+}
+
+#else
+
+# include <limits.h>
+# include <sys/resource.h>
+
+# ifndef RLIM_SAVED_CUR
+# define RLIM_SAVED_CUR RLIM_INFINITY
+# endif
+# ifndef RLIM_SAVED_MAX
+# define RLIM_SAVED_MAX RLIM_INFINITY
+# endif
+
+# ifdef __CYGWIN__
+ /* Cygwin 1.7.25 auto-increases the RLIMIT_NOFILE soft limit until it
+ hits the compile-time constant hard limit of 3200. We might as
+ well just report the hard limit. */
+# define rlim_cur rlim_max
+# endif
+
+int
+getdtablesize (void)
+{
+ struct rlimit lim;
+
+ if (getrlimit (RLIMIT_NOFILE, &lim) == 0
+ && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX
+ && lim.rlim_cur != RLIM_INFINITY
+ && lim.rlim_cur != RLIM_SAVED_CUR
+ && lim.rlim_cur != RLIM_SAVED_MAX)
+ return lim.rlim_cur;
+
+ return INT_MAX;
+}
+
+#endif
diff --git a/lib/getgroups.c b/lib/getgroups.c
new file mode 100644
index 0000000..4396b4d
--- /dev/null
+++ b/lib/getgroups.c
@@ -0,0 +1,131 @@
+/* provide consistent interface to getgroups for systems that don't allow N==0
+
+ Copyright (C) 1996, 1999, 2003, 2006-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#if !HAVE_GETGROUPS
+
+/* Provide a stub that fails with ENOSYS, since there is no group
+ information available on mingw. */
+int
+getgroups (int n _GL_UNUSED, GETGROUPS_T *groups _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#else /* HAVE_GETGROUPS */
+
+# undef getgroups
+# ifndef GETGROUPS_ZERO_BUG
+# define GETGROUPS_ZERO_BUG 0
+# endif
+
+/* On OS X 10.6 and later, use the usual getgroups, not the one
+ supplied when _DARWIN_C_SOURCE is defined. _DARWIN_C_SOURCE is
+ normally defined, since it means "conform to POSIX, but add
+ non-POSIX extensions even if that violates the POSIX namespace
+ rules", which is what we normally want. But with getgroups there
+ is an inconsistency, and _DARWIN_C_SOURCE means "change getgroups()
+ so that it no longer works right". The BUGS section of compat(5)
+ says that the behavior is dubious if you compile different sections
+ of a program with different _DARWIN_C_SOURCE settings, so fix only
+ the offending symbol. */
+# ifdef __APPLE__
+int posix_getgroups (int, gid_t []) __asm ("_getgroups");
+# define getgroups posix_getgroups
+# endif
+
+/* On at least NeXTstep 3.2, getgroups (0, NULL) always fails.
+ On other systems, it returns the number of supplemental
+ groups for the process. This function handles that special case
+ and lets the system-provided function handle all others. However,
+ it can fail with ENOMEM if memory is tight. It is unspecified
+ whether the effective group id is included in the list. */
+
+int
+rpl_getgroups (int n, gid_t *group)
+{
+ int n_groups;
+ GETGROUPS_T *gbuf;
+ int saved_errno;
+
+ if (n < 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (n != 0 || !GETGROUPS_ZERO_BUG)
+ {
+ int result;
+ if (sizeof *group == sizeof *gbuf)
+ return getgroups (n, (GETGROUPS_T *) group);
+
+ if (SIZE_MAX / sizeof *gbuf <= n)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ result = getgroups (n, gbuf);
+ if (0 <= result)
+ {
+ n = result;
+ while (n--)
+ group[n] = gbuf[n];
+ }
+ saved_errno = errno;
+ free (gbuf);
+ errno = saved_errno;
+ return result;
+ }
+
+ n = 20;
+ while (1)
+ {
+ /* No need to worry about address arithmetic overflow here,
+ since the ancient systems that we're running on have low
+ limits on the number of secondary groups. */
+ gbuf = malloc (n * sizeof *gbuf);
+ if (!gbuf)
+ return -1;
+ n_groups = getgroups (n, gbuf);
+ if (n_groups == -1 ? errno != EINVAL : n_groups < n)
+ break;
+ free (gbuf);
+ n *= 2;
+ }
+
+ saved_errno = errno;
+ free (gbuf);
+ errno = saved_errno;
+
+ return n_groups;
+}
+
+#endif /* HAVE_GETGROUPS */
diff --git a/lib/getline.c b/lib/getline.c
new file mode 100644
index 0000000..9d04d0a
--- /dev/null
+++ b/lib/getline.c
@@ -0,0 +1,27 @@
+/* getline.c --- Implementation of replacement getline function.
+ Copyright (C) 2005-2007, 2009-2020 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, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Simon Josefsson. */
+
+#include <config.h>
+
+#include <stdio.h>
+
+ssize_t
+getline (char **lineptr, size_t *n, FILE *stream)
+{
+ return getdelim (lineptr, n, '\n', stream);
+}
diff --git a/lib/getopt-cdefs.in.h b/lib/getopt-cdefs.in.h
new file mode 100644
index 0000000..674838c
--- /dev/null
+++ b/lib/getopt-cdefs.in.h
@@ -0,0 +1,67 @@
+/* getopt-on-non-glibc compatibility macros.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of gnulib.
+ Unlike most of the getopt implementation, it is NOT shared
+ with the GNU C Library.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 3 of
+ the License, or (at your option) any later version.
+
+ This 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 gnulib; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_CDEFS_H
+#define _GETOPT_CDEFS_H 1
+
+/* This header should not be used directly; include getopt.h or
+ unistd.h instead. It does not have a protective #error, because
+ the guard macro for getopt.h in gnulib is not fixed. */
+
+/* getopt-core.h and getopt-ext.h are shared with GNU libc, and expect
+ a number of the internal macros supplied to GNU libc's headers by
+ sys/cdefs.h. Provide fallback definitions for all of them. */
+#if @HAVE_SYS_CDEFS_H@
+# include <sys/cdefs.h>
+#endif
+
+#ifndef __BEGIN_DECLS
+# ifdef __cplusplus
+# define __BEGIN_DECLS extern "C" {
+# else
+# define __BEGIN_DECLS /* nothing */
+# endif
+#endif
+#ifndef __END_DECLS
+# ifdef __cplusplus
+# define __END_DECLS }
+# else
+# define __END_DECLS /* nothing */
+# endif
+#endif
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_VERSION__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __THROW
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#endif /* _GETOPT_CDEFS_H */
diff --git a/lib/getopt-core.h b/lib/getopt-core.h
new file mode 100644
index 0000000..d4d942e
--- /dev/null
+++ b/lib/getopt-core.h
@@ -0,0 +1,96 @@
+/* Declarations for getopt (basic, portable features only).
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library and is also part of gnulib.
+ Patches to this file should be submitted to both projects.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_CORE_H
+#define _GETOPT_CORE_H 1
+
+/* This header should not be used directly; include getopt.h or
+ unistd.h instead. Unlike most bits headers, it does not have
+ a protective #error, because the guard macro for getopt.h in
+ gnulib is not fixed. */
+
+__BEGIN_DECLS
+
+/* For communication from 'getopt' to the caller.
+ When 'getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when 'ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to 'getopt'.
+
+ On entry to 'getopt', zero means this is the first call; initialize.
+
+ When 'getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, 'optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message 'getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Get definitions and prototypes for functions to process the
+ arguments in ARGV (ARGC of them, minus the program name) for
+ options given in OPTS.
+
+ Return the option character from OPTS just read. Return -1 when
+ there are no more options. For unrecognized options, or options
+ missing arguments, 'optopt' is set to the option letter, and '?' is
+ returned.
+
+ The OPTS string is a list of characters which are recognized option
+ letters, optionally followed by colons, specifying that that letter
+ takes an argument, to be placed in 'optarg'.
+
+ If a letter in OPTS is followed by two colons, its argument is
+ optional. This behavior is specific to the GNU 'getopt'.
+
+ The argument '--' causes premature termination of argument
+ scanning, explicitly telling 'getopt' that there are no more
+ options.
+
+ If OPTS begins with '-', then non-option arguments are treated as
+ arguments to the option '\1'. This behavior is specific to the GNU
+ 'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in
+ the environment, then do not permute arguments.
+
+ For standards compliance, the 'argv' argument has the type
+ char *const *, but this is inaccurate; if argument permutation is
+ enabled, the argv array (not the strings it points to) must be
+ writable. */
+
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+__END_DECLS
+
+#endif /* _GETOPT_CORE_H */
diff --git a/lib/getopt-ext.h b/lib/getopt-ext.h
new file mode 100644
index 0000000..05f7083
--- /dev/null
+++ b/lib/getopt-ext.h
@@ -0,0 +1,77 @@
+/* Declarations for getopt (GNU extensions).
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library and is also part of gnulib.
+ Patches to this file should be submitted to both projects.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_EXT_H
+#define _GETOPT_EXT_H 1
+
+/* This header should not be used directly; include getopt.h instead.
+ Unlike most bits headers, it does not have a protective #error,
+ because the guard macro for getopt.h in gnulib is not fixed. */
+
+__BEGIN_DECLS
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of 'struct option' terminated by an element containing a name which is
+ zero.
+
+ The field 'has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field 'flag' is not NULL, it points to a variable that is set
+ to the value given in the field 'val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an 'int' to
+ a compiled-in constant, such as set a value from 'optarg', set the
+ option's 'flag' field to zero and its 'val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero 'flag' field, 'getopt'
+ returns the contents of the 'val' field. */
+
+struct option
+{
+ const char *name;
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the 'has_arg' field of 'struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind)
+ __THROW _GL_ARG_NONNULL ((2, 3));
+
+__END_DECLS
+
+#endif /* _GETOPT_EXT_H */
diff --git a/lib/getopt-pfx-core.h b/lib/getopt-pfx-core.h
new file mode 100644
index 0000000..ec545c1
--- /dev/null
+++ b/lib/getopt-pfx-core.h
@@ -0,0 +1,67 @@
+/* getopt (basic, portable features) gnulib wrapper header.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of gnulib.
+ Unlike most of the getopt implementation, it is NOT shared
+ with the GNU C Library.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 3 of
+ the License, or (at your option) any later version.
+
+ This 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 gnulib; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_PFX_CORE_H
+#define _GETOPT_PFX_CORE_H 1
+
+/* This header should not be used directly; include getopt.h or
+ unistd.h instead. It does not have a protective #error, because
+ the guard macro for getopt.h in gnulib is not fixed. */
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in getopt-core.h and getopt-ext.h. Systematically
+ rename identifiers so that they do not collide with the system
+ functions and variables. Renaming avoids problems with some
+ compilers and linkers. */
+#ifdef __GETOPT_PREFIX
+# ifndef __GETOPT_ID
+# define __GETOPT_CONCAT(x, y) x ## y
+# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
+# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
+# endif
+# undef getopt
+# undef optarg
+# undef opterr
+# undef optind
+# undef optopt
+# define getopt __GETOPT_ID (getopt)
+# define optarg __GETOPT_ID (optarg)
+# define opterr __GETOPT_ID (opterr)
+# define optind __GETOPT_ID (optind)
+# define optopt __GETOPT_ID (optopt)
+
+/* Work around a a problem on macOS, which declares getopt with a
+ trailing __DARWIN_ALIAS(getopt) that would expand to something like
+ __asm("_" "rpl_getopt" "$UNIX2003") were it not for the following
+ hack to suppress the macOS declaration <https://bugs.gnu.org/40205>. */
+# ifdef __APPLE__
+# define _GETOPT
+# endif
+
+/* The system's getopt.h may have already included getopt-core.h to
+ declare the unprefixed identifiers. Undef _GETOPT_CORE_H so that
+ getopt-core.h declares them with prefixes. */
+# undef _GETOPT_CORE_H
+#endif
+
+#include <getopt-core.h>
+
+#endif /* _GETOPT_PFX_CORE_H */
diff --git a/lib/getopt-pfx-ext.h b/lib/getopt-pfx-ext.h
new file mode 100644
index 0000000..647fae6
--- /dev/null
+++ b/lib/getopt-pfx-ext.h
@@ -0,0 +1,71 @@
+/* getopt (GNU extensions) gnulib wrapper header.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of gnulib.
+ Unlike most of the getopt implementation, it is NOT shared
+ with the GNU C Library.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 3 of
+ the License, or (at your option) any later version.
+
+ This 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 gnulib; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_PFX_EXT_H
+#define _GETOPT_PFX_EXT_H 1
+
+/* This header should not be used directly; include getopt.h instead.
+ It does not have a protective #error, because the guard macro for
+ getopt.h in gnulib is not fixed. */
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in getopt-core.h and getopt-ext.h. Systematically
+ rename identifiers so that they do not collide with the system
+ functions and variables. Renaming avoids problems with some
+ compilers and linkers. */
+#ifdef __GETOPT_PREFIX
+# ifndef __GETOPT_ID
+# define __GETOPT_CONCAT(x, y) x ## y
+# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y)
+# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y)
+# endif
+# undef getopt_long
+# undef getopt_long_only
+# undef option
+# undef _getopt_internal
+# define getopt_long __GETOPT_ID (getopt_long)
+# define getopt_long_only __GETOPT_ID (getopt_long_only)
+# define option __GETOPT_ID (option)
+# define _getopt_internal __GETOPT_ID (getopt_internal)
+
+/* The system's getopt.h may have already included getopt-ext.h to
+ declare the unprefixed identifiers. Undef _GETOPT_EXT_H so that
+ getopt-ext.h declares them with prefixes. */
+# undef _GETOPT_EXT_H
+#endif
+
+/* Standalone applications get correct prototypes for getopt_long and
+ getopt_long_only; they declare "char **argv". For backward
+ compatibility with old applications, if __GETOPT_PREFIX is not
+ defined, we supply GNU-libc-compatible, but incorrect, prototypes
+ using "char *const *argv". (GNU libc is stuck with the incorrect
+ prototypes, as they are baked into older versions of LSB.) */
+#ifndef __getopt_argv_const
+# if defined __GETOPT_PREFIX
+# define __getopt_argv_const /* empty */
+# else
+# define __getopt_argv_const const
+# endif
+#endif
+
+#include <getopt-ext.h>
+
+#endif /* _GETOPT_PFX_EXT_H */
diff --git a/lib/getopt.c b/lib/getopt.c
new file mode 100644
index 0000000..a6389d8
--- /dev/null
+++ b/lib/getopt.c
@@ -0,0 +1,811 @@
+/* Getopt for GNU.
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library and is also part of gnulib.
+ Patches to this file should be submitted to both projects.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getopt.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef _LIBC
+/* When used as part of glibc, error printing must be done differently
+ for standards compliance. getopt is not a cancellation point, so
+ it must not call functions that are, and it is specified by an
+ older standard than stdio locking, so it must not refer to
+ functions in the "user namespace" related to stdio locking.
+ Finally, it must use glibc's internal message translation so that
+ the messages are looked up in the proper text domain. */
+# include <libintl.h>
+# define fprintf __fxprintf_nocancel
+# define flockfile(fp) _IO_flockfile (fp)
+# define funlockfile(fp) _IO_funlockfile (fp)
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+/* When used standalone, flockfile and funlockfile might not be
+ available. */
+# if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \
+ || (defined _WIN32 && ! defined __CYGWIN__))
+# define flockfile(fp) /* nop */
+# define funlockfile(fp) /* nop */
+# endif
+/* When used standalone, do not attempt to use alloca. */
+# define __libc_use_alloca(size) 0
+# undef alloca
+# define alloca(size) (abort (), (void *)0)
+#endif
+
+/* This implementation of 'getopt' has three modes for handling
+ options interspersed with non-option arguments. It can stop
+ scanning for options at the first non-option argument encountered,
+ as POSIX specifies. It can continue scanning for options after the
+ first non-option argument, but permute 'argv' as it goes so that,
+ after 'getopt' is done, all the options precede all the non-option
+ arguments and 'optind' points to the first non-option argument.
+ Or, it can report non-option arguments as if they were arguments to
+ the option character '\x01'.
+
+ The default behavior of 'getopt_long' is to permute the argument list.
+ When this implementation is used standalone, the default behavior of
+ 'getopt' is to stop at the first non-option argument, but when it is
+ used as part of GNU libc it also permutes the argument list. In both
+ cases, setting the environment variable POSIXLY_CORRECT to any value
+ disables permutation.
+
+ If the first character of the OPTSTRING argument to 'getopt' or
+ 'getopt_long' is '+', both functions will stop at the first
+ non-option argument. If it is '-', both functions will report
+ non-option arguments as arguments to the option character '\x01'. */
+
+#include "getopt_int.h"
+
+/* For communication from 'getopt' to the caller.
+ When 'getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when 'ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to 'getopt'.
+
+ On entry to 'getopt', zero means this is the first call; initialize.
+
+ When 'getopt' returns -1, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, 'optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* 1003.2 says this must be 1 before any call. */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data. */
+
+static struct _getopt_data getopt_data;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ 'first_nonopt' and 'last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+ int bottom = d->__first_nonopt;
+ int middle = d->__last_nonopt;
+ int top = d->optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ d->__first_nonopt += (d->optind - d->__last_nonopt);
+ d->__last_nonopt = d->optind;
+}
+
+/* Process the argument starting with d->__nextchar as a long option.
+ d->optind should *not* have been advanced over this argument.
+
+ If the value returned is -1, it was not actually a long option, the
+ state is unchanged, and the argument should be processed as a set
+ of short options (this can only happen when long_only is true).
+ Otherwise, the option (and its argument, if any) have been consumed
+ and the return value is the value to return from _getopt_internal_r. */
+static int
+process_long_option (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, struct _getopt_data *d,
+ int print_errors, const char *prefix)
+{
+ char *nameend;
+ size_t namelen;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int n_options;
+ int option_index;
+
+ for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+ namelen = nameend - d->__nextchar;
+
+ /* First look for an exact match, counting the options as a side
+ effect. */
+ for (p = longopts, n_options = 0; p->name; p++, n_options++)
+ if (!strncmp (p->name, d->__nextchar, namelen)
+ && namelen == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ option_index = n_options;
+ break;
+ }
+
+ if (pfound == NULL)
+ {
+ /* Didn't find an exact match, so look for abbreviations. */
+ unsigned char *ambig_set = NULL;
+ int ambig_malloced = 0;
+ int ambig_fallback = 0;
+ int indfound = -1;
+
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, d->__nextchar, namelen))
+ {
+ if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else if (long_only
+ || pfound->has_arg != p->has_arg
+ || pfound->flag != p->flag
+ || pfound->val != p->val)
+ {
+ /* Second or later nonexact match found. */
+ if (!ambig_fallback)
+ {
+ if (!print_errors)
+ /* Don't waste effort tracking the ambig set if
+ we're not going to print it anyway. */
+ ambig_fallback = 1;
+ else if (!ambig_set)
+ {
+ if (__libc_use_alloca (n_options))
+ ambig_set = alloca (n_options);
+ else if ((ambig_set = malloc (n_options)) == NULL)
+ /* Fall back to simpler error message. */
+ ambig_fallback = 1;
+ else
+ ambig_malloced = 1;
+
+ if (ambig_set)
+ {
+ memset (ambig_set, 0, n_options);
+ ambig_set[indfound] = 1;
+ }
+ }
+ if (ambig_set)
+ ambig_set[option_index] = 1;
+ }
+ }
+ }
+
+ if (ambig_set || ambig_fallback)
+ {
+ if (print_errors)
+ {
+ if (ambig_fallback)
+ fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"),
+ argv[0], prefix, d->__nextchar);
+ else
+ {
+ flockfile (stderr);
+ fprintf (stderr,
+ _("%s: option '%s%s' is ambiguous; possibilities:"),
+ argv[0], prefix, d->__nextchar);
+
+ for (option_index = 0; option_index < n_options; option_index++)
+ if (ambig_set[option_index])
+ fprintf (stderr, " '%s%s'",
+ prefix, longopts[option_index].name);
+
+ /* This must use 'fprintf' even though it's only
+ printing a single character, so that it goes through
+ __fxprintf_nocancel when compiled as part of glibc. */
+ fprintf (stderr, "\n");
+ funlockfile (stderr);
+ }
+ }
+ if (ambig_malloced)
+ free (ambig_set);
+ d->__nextchar += strlen (d->__nextchar);
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ option_index = indfound;
+ }
+
+ if (pfound == NULL)
+ {
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short option,
+ then it's an error. */
+ if (!long_only || argv[d->optind][1] == '-'
+ || strchr (optstring, *d->__nextchar) == NULL)
+ {
+ if (print_errors)
+ fprintf (stderr, _("%s: unrecognized option '%s%s'\n"),
+ argv[0], prefix, d->__nextchar);
+
+ d->__nextchar = NULL;
+ d->optind++;
+ d->optopt = 0;
+ return '?';
+ }
+
+ /* Otherwise interpret it as a short option. */
+ return -1;
+ }
+
+ /* We have found a matching long option. Consume it. */
+ d->optind++;
+ d->__nextchar = NULL;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ d->optarg = nameend + 1;
+ else
+ {
+ if (print_errors)
+ fprintf (stderr,
+ _("%s: option '%s%s' doesn't allow an argument\n"),
+ argv[0], prefix, pfound->name);
+
+ d->optopt = pfound->val;
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (d->optind < argc)
+ d->optarg = argv[d->optind++];
+ else
+ {
+ if (print_errors)
+ fprintf (stderr,
+ _("%s: option '%s%s' requires an argument\n"),
+ argv[0], prefix, pfound->name);
+
+ d->optopt = pfound->val;
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+}
+
+/* Initialize internal data upon the first call to getopt. */
+
+static const char *
+_getopt_initialize (int argc _GL_UNUSED,
+ char **argv _GL_UNUSED, const char *optstring,
+ struct _getopt_data *d, int posixly_correct)
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+ if (d->optind == 0)
+ d->optind = 1;
+
+ d->__first_nonopt = d->__last_nonopt = d->optind;
+ d->__nextchar = NULL;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+ if (optstring[0] == '-')
+ {
+ d->__ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ d->__ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (posixly_correct || !!getenv ("POSIXLY_CORRECT"))
+ d->__ordering = REQUIRE_ORDER;
+ else
+ d->__ordering = PERMUTE;
+
+ d->__initialized = 1;
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If 'getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If 'getopt' finds another option character, it returns that character,
+ updating 'optind' and 'nextchar' so that the next call to 'getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, 'getopt' returns -1.
+ Then 'optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set 'opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in 'optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in 'optarg', otherwise 'optarg' is set to zero.
+
+ If OPTSTRING starts with '-' or '+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with '--' instead of '-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a '=', or else the in next ARGV-element.
+ When 'getopt' finds a long-named option, it returns 0 if that option's
+ 'flag' field is nonzero, the value of the option's 'val' field
+ if the 'flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of 'struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal_r (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind,
+ int long_only, struct _getopt_data *d, int posixly_correct)
+{
+ int print_errors = d->opterr;
+
+ if (argc < 1)
+ return -1;
+
+ d->optarg = NULL;
+
+ if (d->optind == 0 || !d->__initialized)
+ optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct);
+ else if (optstring[0] == '-' || optstring[0] == '+')
+ optstring++;
+
+ if (optstring[0] == ':')
+ print_errors = 0;
+
+ /* Test whether ARGV[optind] points to a non-option argument. */
+#define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+
+ if (d->__nextchar == NULL || *d->__nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ moved back by the user (who may also have changed the arguments). */
+ if (d->__last_nonopt > d->optind)
+ d->__last_nonopt = d->optind;
+ if (d->__first_nonopt > d->optind)
+ d->__first_nonopt = d->optind;
+
+ if (d->__ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange (argv, d);
+ else if (d->__last_nonopt != d->optind)
+ d->__first_nonopt = d->optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (d->optind < argc && NONOPTION_P)
+ d->optind++;
+ d->__last_nonopt = d->optind;
+ }
+
+ /* The special ARGV-element '--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+ {
+ d->optind++;
+
+ if (d->__first_nonopt != d->__last_nonopt
+ && d->__last_nonopt != d->optind)
+ exchange (argv, d);
+ else if (d->__first_nonopt == d->__last_nonopt)
+ d->__first_nonopt = d->optind;
+ d->__last_nonopt = argc;
+
+ d->optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (d->optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (d->__first_nonopt != d->__last_nonopt)
+ d->optind = d->__first_nonopt;
+ return -1;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if (NONOPTION_P)
+ {
+ if (d->__ordering == REQUIRE_ORDER)
+ return -1;
+ d->optarg = argv[d->optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Check whether it might be a long option. */
+ if (longopts)
+ {
+ if (argv[d->optind][1] == '-')
+ {
+ /* "--foo" is always a long option. The special option
+ "--" was handled above. */
+ d->__nextchar = argv[d->optind] + 2;
+ return process_long_option (argc, argv, optstring, longopts,
+ longind, long_only, d,
+ print_errors, "--");
+ }
+
+ /* If long_only and the ARGV-element has the form "-f",
+ where f is a valid short option, don't consider it an
+ abbreviated form of a long option that starts with f.
+ Otherwise there would be no way to give the -f short
+ option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an
+ abbreviation of the long option, just like "--fu", and
+ not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+ if (long_only && (argv[d->optind][2]
+ || !strchr (optstring, argv[d->optind][1])))
+ {
+ int code;
+ d->__nextchar = argv[d->optind] + 1;
+ code = process_long_option (argc, argv, optstring, longopts,
+ longind, long_only, d,
+ print_errors, "-");
+ if (code != -1)
+ return code;
+ }
+ }
+
+ /* It is not a long option. Skip the initial punctuation. */
+ d->__nextchar = argv[d->optind] + 1;
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *d->__nextchar++;
+ const char *temp = strchr (optstring, c);
+
+ /* Increment 'optind' when we start to process its last character. */
+ if (*d->__nextchar == '\0')
+ ++d->optind;
+
+ if (temp == NULL || c == ':' || c == ';')
+ {
+ if (print_errors)
+ fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
+ d->optopt = c;
+ return '?';
+ }
+
+ /* Convenience. Treat POSIX -W foo same as long option --foo */
+ if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL)
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ d->optarg = d->__nextchar;
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ return c;
+ }
+ else
+ d->optarg = argv[d->optind];
+
+ d->__nextchar = d->optarg;
+ d->optarg = NULL;
+ return process_long_option (argc, argv, optstring, longopts, longind,
+ 0 /* long_only */, d, print_errors, "-W ");
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ d->optind++;
+ }
+ else
+ d->optarg = NULL;
+ d->__nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*d->__nextchar != '\0')
+ {
+ d->optarg = d->__nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ d->optind++;
+ }
+ else if (d->optind == argc)
+ {
+ if (print_errors)
+ fprintf (stderr,
+ _("%s: option requires an argument -- '%c'\n"),
+ argv[0], c);
+
+ d->optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented 'optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ d->optarg = argv[d->optind++];
+ d->__nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+_getopt_internal (int argc, char **argv, const char *optstring,
+ const struct option *longopts, int *longind, int long_only,
+ int posixly_correct)
+{
+ int result;
+
+ getopt_data.optind = optind;
+ getopt_data.opterr = opterr;
+
+ result = _getopt_internal_r (argc, argv, optstring, longopts,
+ longind, long_only, &getopt_data,
+ posixly_correct);
+
+ optind = getopt_data.optind;
+ optarg = getopt_data.optarg;
+ optopt = getopt_data.optopt;
+
+ return result;
+}
+
+/* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt.
+ Standalone applications just get a POSIX-compliant getopt.
+ POSIX and LSB both require these functions to take 'char *const *argv'
+ even though this is incorrect (because of the permutation). */
+#define GETOPT_ENTRY(NAME, POSIXLY_CORRECT) \
+ int \
+ NAME (int argc, char *const *argv, const char *optstring) \
+ { \
+ return _getopt_internal (argc, (char **)argv, optstring, \
+ 0, 0, 0, POSIXLY_CORRECT); \
+ }
+
+#ifdef _LIBC
+GETOPT_ENTRY(getopt, 0)
+GETOPT_ENTRY(__posix_getopt, 1)
+#else
+GETOPT_ENTRY(getopt, 1)
+#endif
+
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of 'getopt'. */
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/getopt.in.h b/lib/getopt.in.h
new file mode 100644
index 0000000..36e04bb
--- /dev/null
+++ b/lib/getopt.in.h
@@ -0,0 +1,61 @@
+/* Declarations for getopt.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of gnulib.
+ Unlike most of the getopt implementation, it is NOT shared
+ with the GNU C Library, which supplies a different version of
+ this file.
+
+ This file is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 3 of
+ the License, or (at your option) any later version.
+
+ This 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 gnulib; if not, see <https://www.gnu.org/licenses/>. */
+
+#ifndef _@GUARD_PREFIX@_GETOPT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. We must
+ also inform the replacement unistd.h to not recursively use
+ <getopt.h>; our definitions will be present soon enough. */
+#if @HAVE_GETOPT_H@
+# define _GL_SYSTEM_GETOPT
+# @INCLUDE_NEXT@ @NEXT_GETOPT_H@
+# undef _GL_SYSTEM_GETOPT
+#endif
+
+#define _@GUARD_PREFIX@_GETOPT_H 1
+
+/* Standalone applications should #define __GETOPT_PREFIX to an
+ identifier that prefixes the external functions and variables
+ defined in getopt-core.h and getopt-ext.h. When this happens,
+ include the headers that might declare getopt so that they will not
+ cause confusion if included after this file (if the system had
+ <getopt.h>, we have already included it). */
+#if defined __GETOPT_PREFIX
+# if !@HAVE_GETOPT_H@
+# define __need_system_stdlib_h
+# include <stdlib.h>
+# undef __need_system_stdlib_h
+# include <stdio.h>
+# include <unistd.h>
+# endif
+#endif
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+#include <getopt-cdefs.h>
+#include <getopt-pfx-core.h>
+#include <getopt-pfx-ext.h>
+
+#endif /* _@GUARD_PREFIX@_GETOPT_H */
diff --git a/lib/getopt1.c b/lib/getopt1.c
new file mode 100644
index 0000000..0902efe
--- /dev/null
+++ b/lib/getopt1.c
@@ -0,0 +1,159 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library and is also part of gnulib.
+ Patches to this file should be submitted to both projects.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include "getopt.h"
+#include "getopt_int.h"
+
+int
+getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 0, 0);
+}
+
+int
+_getopt_long_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 0, d, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (int argc, char *__getopt_argv_const *argv,
+ const char *options,
+ const struct option *long_options, int *opt_index)
+{
+ return _getopt_internal (argc, (char **) argv, options, long_options,
+ opt_index, 1, 0);
+}
+
+int
+_getopt_long_only_r (int argc, char **argv, const char *options,
+ const struct option *long_options, int *opt_index,
+ struct _getopt_data *d)
+{
+ return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+ 1, d, 0);
+}
+
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (int argc, char **argv)
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static const struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value '%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value '%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/getopt_int.h b/lib/getopt_int.h
new file mode 100644
index 0000000..afcd8a6
--- /dev/null
+++ b/lib/getopt_int.h
@@ -0,0 +1,118 @@
+/* Internal declarations for getopt.
+ Copyright (C) 1989-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library and is also part of gnulib.
+ Patches to this file should be submitted to both projects.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H 1
+
+#include <getopt.h>
+
+extern int _getopt_internal (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, int __posixly_correct);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+ vectors at the same time. */
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ REQUIRE_ORDER means don't recognize them as options; stop option
+ processing when the first non-option is seen. This is what POSIX
+ specifies should happen.
+
+ PERMUTE means permute the contents of ARGV as we scan, so that
+ eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written
+ to expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were
+ written to expect options and other ARGV-elements in any order
+ and that care about the ordering of the two. We describe each
+ non-option ARGV-element as if it were the argument of an option
+ with character code 1.
+
+ The special argument '--' forces an end of option-scanning regardless
+ of the value of 'ordering'. In the case of RETURN_IN_ORDER, only
+ '--' can cause 'getopt' to return -1 with 'optind' != ARGC. */
+
+enum __ord
+ {
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+ };
+
+/* Data type for reentrant functions. */
+struct _getopt_data
+{
+ /* These have exactly the same meaning as the corresponding global
+ variables, except that they are used for the reentrant
+ versions of getopt. */
+ int optind;
+ int opterr;
+ int optopt;
+ char *optarg;
+
+ /* Internal members. */
+
+ /* True if the internal members have been initialized. */
+ int __initialized;
+
+ /* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+ char *__nextchar;
+
+ /* See __ord above. */
+ enum __ord __ordering;
+
+ /* Handle permutation of arguments. */
+
+ /* Describe the part of ARGV that contains non-options that have
+ been skipped. 'first_nonopt' is the index in ARGV of the first
+ of them; 'last_nonopt' is the index after the last of them. */
+
+ int __first_nonopt;
+ int __last_nonopt;
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+ default values and to clear the initialization flag. */
+#define _GETOPT_DATA_INITIALIZER { 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ int __long_only, struct _getopt_data *__data,
+ int __posixly_correct);
+
+extern int _getopt_long_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts, int *__longind,
+ struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char **___argv,
+ const char *__shortopts,
+ const struct option *__longopts,
+ int *__longind,
+ struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/lib/getpass.c b/lib/getpass.c
new file mode 100644
index 0000000..426f47c
--- /dev/null
+++ b/lib/getpass.c
@@ -0,0 +1,237 @@
+/* Copyright (C) 1992-2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBC
+/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
+ warns for the null checks on 'prompt' below. */
+# define _GL_ARG_NONNULL(params)
+# include <config.h>
+#endif
+
+#include "getpass.h"
+
+#include <stdio.h>
+
+#if !(defined _WIN32 && !defined __CYGWIN__)
+
+# include <stdbool.h>
+
+# if HAVE_DECL___FSETLOCKING && HAVE___FSETLOCKING
+# if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+# endif
+# else
+# define __fsetlocking(stream, type) /* empty */
+# endif
+
+# if HAVE_TERMIOS_H
+# include <termios.h>
+# endif
+
+# if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+# else
+# if !HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush_unlocked
+# define fflush_unlocked(x) fflush (x)
+# endif
+# if !HAVE_DECL_FLOCKFILE
+# undef flockfile
+# define flockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FUNLOCKFILE
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+# endif
+# if !HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs_unlocked
+# define fputs_unlocked(str,stream) fputs (str, stream)
+# endif
+# if !HAVE_DECL_PUTC_UNLOCKED
+# undef putc_unlocked
+# define putc_unlocked(c,stream) putc (c, stream)
+# endif
+# endif
+
+/* It is desirable to use this bit on systems that have it.
+ The only bit of terminal state we want to twiddle is echoing, which is
+ done in software; there is no need to change the state of the terminal
+ hardware. */
+
+# ifndef TCSASOFT
+# define TCSASOFT 0
+# endif
+
+static void
+call_fclose (void *arg)
+{
+ if (arg != NULL)
+ fclose (arg);
+}
+
+char *
+getpass (const char *prompt)
+{
+ FILE *tty;
+ FILE *in, *out;
+# if HAVE_TCGETATTR
+ struct termios s, t;
+# endif
+ bool tty_changed = false;
+ static char *buf;
+ static size_t bufsize;
+ ssize_t nread;
+
+ /* Try to write to and read from the terminal if we can.
+ If we can't open the terminal, use stderr and stdin. */
+
+ tty = fopen ("/dev/tty", "w+e");
+ if (tty == NULL)
+ {
+ in = stdin;
+ out = stderr;
+ }
+ else
+ {
+ /* We do the locking ourselves. */
+ __fsetlocking (tty, FSETLOCKING_BYCALLER);
+
+ out = in = tty;
+ }
+
+ flockfile (out);
+
+ /* Turn echoing off if it is on now. */
+# if HAVE_TCGETATTR
+ if (tcgetattr (fileno (in), &t) == 0)
+ {
+ /* Save the old one. */
+ s = t;
+ /* Tricky, tricky. */
+ t.c_lflag &= ~(ECHO | ISIG);
+ tty_changed = (tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &t) == 0);
+ }
+# endif
+
+ if (prompt)
+ {
+ /* Write the prompt. */
+ fputs_unlocked (prompt, out);
+ fflush_unlocked (out);
+ }
+
+ /* Read the password. */
+ nread = getline (&buf, &bufsize, in);
+
+ /* According to the C standard, input may not be followed by output
+ on the same stream without an intervening call to a file
+ positioning function. Suppose in == out; then without this fseek
+ call, on Solaris, HP-UX, AIX, OSF/1, the previous input gets
+ echoed, whereas on IRIX, the following newline is not output as
+ it should be. POSIX imposes similar restrictions if fileno (in)
+ == fileno (out). The POSIX restrictions are tricky and change
+ from POSIX version to POSIX version, so play it safe and invoke
+ fseek even if in != out. */
+ fseeko (out, 0, SEEK_CUR);
+
+ if (buf != NULL)
+ {
+ if (nread < 0)
+ buf[0] = '\0';
+ else if (buf[nread - 1] == '\n')
+ {
+ /* Remove the newline. */
+ buf[nread - 1] = '\0';
+ if (tty_changed)
+ {
+ /* Write the newline that was not echoed. */
+ putc_unlocked ('\n', out);
+ }
+ }
+ }
+
+ /* Restore the original setting. */
+# if HAVE_TCSETATTR
+ if (tty_changed)
+ tcsetattr (fileno (in), TCSAFLUSH | TCSASOFT, &s);
+# endif
+
+ funlockfile (out);
+
+ call_fclose (tty);
+
+ return buf;
+}
+
+#else /* W32 native */
+
+/* Windows implementation by Martin Lambers <marlam@marlam.de>,
+ improved by Simon Josefsson. */
+
+/* For PASS_MAX. */
+# include <limits.h>
+/* For _getch(). */
+# include <conio.h>
+/* For strdup(). */
+# include <string.h>
+
+# ifndef PASS_MAX
+# define PASS_MAX 512
+# endif
+
+char *
+getpass (const char *prompt)
+{
+ char getpassbuf[PASS_MAX + 1];
+ size_t i = 0;
+ int c;
+
+ if (prompt)
+ {
+ fputs (prompt, stderr);
+ fflush (stderr);
+ }
+
+ for (;;)
+ {
+ c = _getch ();
+ if (c == '\r')
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ else if (i < PASS_MAX)
+ {
+ getpassbuf[i++] = c;
+ }
+
+ if (i >= PASS_MAX)
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ }
+
+ if (prompt)
+ {
+ fputs ("\r\n", stderr);
+ fflush (stderr);
+ }
+
+ return strdup (getpassbuf);
+}
+#endif
diff --git a/lib/getpass.h b/lib/getpass.h
new file mode 100644
index 0000000..3daa1b6
--- /dev/null
+++ b/lib/getpass.h
@@ -0,0 +1,4 @@
+/* Obsolete; consider using unistd.h instead. */
+
+/* Get getpass declaration, if available. */
+#include <unistd.h>
diff --git a/lib/getpeername.c b/lib/getpeername.c
new file mode 100644
index 0000000..b025723
--- /dev/null
+++ b/lib/getpeername.c
@@ -0,0 +1,49 @@
+/* getpeername.c --- wrappers for Windows getpeername function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getpeername
+
+int
+rpl_getpeername (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = getpeername (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/getprogname.c b/lib/getprogname.c
new file mode 100644
index 0000000..7199fbd
--- /dev/null
+++ b/lib/getprogname.c
@@ -0,0 +1,298 @@
+/* Program name management.
+ Copyright (C) 2016-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "getprogname.h"
+
+#include <errno.h> /* get program_invocation_name declaration */
+#include <stdlib.h> /* get __argv declaration */
+
+#ifdef _AIX
+# include <unistd.h>
+# include <procinfo.h>
+# include <string.h>
+#endif
+
+#ifdef __MVS__
+# ifndef _OPEN_SYS
+# define _OPEN_SYS
+# endif
+# include <string.h>
+# include <sys/ps.h>
+#endif
+
+#ifdef __hpux
+# include <unistd.h>
+# include <sys/param.h>
+# include <sys/pstat.h>
+# include <string.h>
+#endif
+
+#ifdef __sgi
+# include <string.h>
+# include <unistd.h>
+# include <stdio.h>
+# include <fcntl.h>
+# include <sys/procfs.h>
+#endif
+
+#if defined __SCO_VERSION__ || defined __sysv5__
+# include <fcntl.h>
+# include <stdlib.h>
+# include <string.h>
+#endif
+
+#include "basename-lgpl.h"
+
+#ifndef HAVE_GETPROGNAME /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */
+char const *
+getprogname (void)
+{
+# if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME /* glibc, BeOS */
+ /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */
+ return program_invocation_short_name;
+# elif HAVE_DECL_PROGRAM_INVOCATION_NAME /* glibc, BeOS */
+ /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */
+ return last_component (program_invocation_name);
+# elif HAVE_GETEXECNAME /* Solaris */
+ /* https://docs.oracle.com/cd/E19253-01/816-5168/6mbb3hrb1/index.html */
+ const char *p = getexecname ();
+ if (!p)
+ p = "?";
+ return last_component (p);
+# elif HAVE_DECL___ARGV /* mingw, MSVC */
+ /* https://docs.microsoft.com/en-us/cpp/c-runtime-library/argc-argv-wargv */
+ const char *p = __argv && __argv[0] ? __argv[0] : "?";
+ return last_component (p);
+# elif HAVE_VAR___PROGNAME /* OpenBSD, Android, QNX */
+ /* https://man.openbsd.org/style.9 */
+ /* http://www.qnx.de/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.neutrino_lib_ref%2Fp%2F__progname.html */
+ /* Be careful to declare this only when we absolutely need it
+ (OpenBSD 5.1), rather than when it's available. Otherwise,
+ its mere declaration makes program_invocation_short_name
+ malfunction (have zero length) with Fedora 25's glibc. */
+ extern char *__progname;
+ const char *p = __progname;
+# if defined __ANDROID__
+ return last_component (p);
+# else
+ return p && p[0] ? p : "?";
+# endif
+# elif _AIX /* AIX */
+ /* Idea by Bastien ROUCARIÈS,
+ https://lists.gnu.org/r/bug-gnulib/2010-12/msg00095.html
+ Reference: https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.basetrf1/getprocs.htm
+ */
+ static char *p;
+ static int first = 1;
+ if (first)
+ {
+ first = 0;
+ pid_t pid = getpid ();
+ struct procentry64 procs;
+ p = (0 < getprocs64 (&procs, sizeof procs, NULL, 0, &pid, 1)
+ ? strdup (procs.pi_comm)
+ : NULL);
+ if (!p)
+ p = "?";
+ }
+ return p;
+# elif defined __hpux
+ static char *p;
+ static int first = 1;
+ if (first)
+ {
+ first = 0;
+ pid_t pid = getpid ();
+ struct pst_status status;
+ if (pstat_getproc (&status, sizeof status, 0, pid) > 0)
+ {
+ char *ucomm = status.pst_ucomm;
+ char *cmd = status.pst_cmd;
+ if (strlen (ucomm) < PST_UCOMMLEN - 1)
+ p = ucomm;
+ else
+ {
+ /* ucomm is truncated to length PST_UCOMMLEN - 1.
+ Look at cmd instead. */
+ char *space = strchr (cmd, ' ');
+ if (space != NULL)
+ *space = '\0';
+ p = strrchr (cmd, '/');
+ if (p != NULL)
+ p++;
+ else
+ p = cmd;
+ if (strlen (p) > PST_UCOMMLEN - 1
+ && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0)
+ /* p is less truncated than ucomm. */
+ ;
+ else
+ p = ucomm;
+ }
+ p = strdup (p);
+ }
+ else
+ {
+# if !defined __LP64__
+ /* Support for 32-bit programs running in 64-bit HP-UX.
+ The documented way to do this is to use the same source code
+ as above, but in a compilation unit where '#define _PSTAT64 1'
+ is in effect. I prefer a single compilation unit; the struct
+ size and the offsets are not going to change. */
+ char status64[1216];
+ if (__pstat_getproc64 (status64, sizeof status64, 0, pid) > 0)
+ {
+ char *ucomm = status64 + 288;
+ char *cmd = status64 + 168;
+ if (strlen (ucomm) < PST_UCOMMLEN - 1)
+ p = ucomm;
+ else
+ {
+ /* ucomm is truncated to length PST_UCOMMLEN - 1.
+ Look at cmd instead. */
+ char *space = strchr (cmd, ' ');
+ if (space != NULL)
+ *space = '\0';
+ p = strrchr (cmd, '/');
+ if (p != NULL)
+ p++;
+ else
+ p = cmd;
+ if (strlen (p) > PST_UCOMMLEN - 1
+ && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0)
+ /* p is less truncated than ucomm. */
+ ;
+ else
+ p = ucomm;
+ }
+ p = strdup (p);
+ }
+ else
+# endif
+ p = NULL;
+ }
+ if (!p)
+ p = "?";
+ }
+ return p;
+# elif __MVS__ /* z/OS */
+ /* https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxbd00/rtwgetp.htm */
+ static char *p = "?";
+ static int first = 1;
+ if (first)
+ {
+ pid_t pid = getpid ();
+ int token;
+ W_PSPROC buf;
+ first = 0;
+ memset (&buf, 0, sizeof(buf));
+ buf.ps_cmdptr = (char *) malloc (buf.ps_cmdlen = PS_CMDBLEN_LONG);
+ buf.ps_conttyptr = (char *) malloc (buf.ps_conttylen = PS_CONTTYBLEN);
+ buf.ps_pathptr = (char *) malloc (buf.ps_pathlen = PS_PATHBLEN);
+ if (buf.ps_cmdptr && buf.ps_conttyptr && buf.ps_pathptr)
+ {
+ for (token = 0; token >= 0;
+ token = w_getpsent (token, &buf, sizeof(buf)))
+ {
+ if (token > 0 && buf.ps_pid == pid)
+ {
+ char *s = strdup (last_component (buf.ps_pathptr));
+ if (s)
+ p = s;
+ break;
+ }
+ }
+ }
+ free (buf.ps_cmdptr);
+ free (buf.ps_conttyptr);
+ free (buf.ps_pathptr);
+ }
+ return p;
+# elif defined __sgi /* IRIX */
+ char filename[50];
+ int fd;
+
+ sprintf (filename, "/proc/pinfo/%d", (int) getpid ());
+ fd = open (filename, O_RDONLY | O_CLOEXEC);
+ if (0 <= fd)
+ {
+ prpsinfo_t buf;
+ int ioctl_ok = 0 <= ioctl (fd, PIOCPSINFO, &buf);
+ close (fd);
+ if (ioctl_ok)
+ {
+ char *name = buf.pr_fname;
+ size_t namesize = sizeof buf.pr_fname;
+ /* It may not be NUL-terminated. */
+ char *namenul = memchr (name, '\0', namesize);
+ size_t namelen = namenul ? namenul - name : namesize;
+ char *namecopy = malloc (namelen + 1);
+ if (namecopy)
+ {
+ namecopy[namelen] = '\0';
+ return memcpy (namecopy, name, namelen);
+ }
+ }
+ }
+ return NULL;
+# elif defined __SCO_VERSION__ || defined __sysv5__ /* SCO OpenServer6/UnixWare */
+ char buf[80];
+ int fd;
+ sprintf (buf, "/proc/%d/cmdline", getpid());
+ fd = open (buf, O_RDONLY);
+ if (0 <= fd)
+ {
+ size_t n = read (fd, buf, 79);
+ if (n > 0)
+ {
+ buf[n] = '\0'; /* Guarantee null-termination */
+ char *progname;
+ progname = strrchr (buf, '/');
+ if (progname)
+ {
+ progname = progname + 1; /* Skip the '/' */
+ }
+ else
+ {
+ progname = buf;
+ }
+ char *ret;
+ ret = malloc (strlen (progname) + 1);
+ if (ret)
+ {
+ strcpy (ret, progname);
+ return ret;
+ }
+ }
+ close (fd);
+ }
+ return "?";
+# else
+# error "getprogname module not ported to this OS"
+# endif
+}
+
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/getprogname.h b/lib/getprogname.h
new file mode 100644
index 0000000..676912b
--- /dev/null
+++ b/lib/getprogname.h
@@ -0,0 +1,40 @@
+/* Program name management.
+ Copyright (C) 2016-2020 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/>. */
+
+#ifndef _GL_GETPROGNAME_H
+#define _GL_GETPROGNAME_H
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the base name of the executing program.
+ On native Windows this will usually end in ".exe" or ".EXE". */
+#ifndef HAVE_GETPROGNAME
+extern char const *getprogname (void)
+# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+ _GL_ATTRIBUTE_PURE
+# endif
+ ;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/getrandom.c b/lib/getrandom.c
new file mode 100644
index 0000000..f8695ab
--- /dev/null
+++ b/lib/getrandom.c
@@ -0,0 +1,187 @@
+/* Obtain a series of random bytes.
+
+ Copyright 2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <sys/random.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# if HAVE_BCRYPT_H
+# include <bcrypt.h>
+# else
+# define NTSTATUS LONG
+typedef void * BCRYPT_ALG_HANDLE;
+# define BCRYPT_USE_SYSTEM_PREFERRED_RNG 0x00000002
+# if HAVE_LIB_BCRYPT
+extern NTSTATUS WINAPI BCryptGenRandom (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG);
+# endif
+# endif
+# if !HAVE_LIB_BCRYPT
+# include <wincrypt.h>
+# ifndef CRYPT_VERIFY_CONTEXT
+# define CRYPT_VERIFY_CONTEXT 0xF0000000
+# endif
+# endif
+#endif
+
+#include "minmax.h"
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Don't assume that UNICODE is not defined. */
+# undef LoadLibrary
+# define LoadLibrary LoadLibraryA
+# undef CryptAcquireContext
+# define CryptAcquireContext CryptAcquireContextA
+
+# if !HAVE_LIB_BCRYPT
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
+/* BCryptGenRandom with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag works only
+ starting with Windows 7. */
+typedef NTSTATUS (WINAPI * BCryptGenRandomFuncType) (BCRYPT_ALG_HANDLE, UCHAR *, ULONG, ULONG);
+static BCryptGenRandomFuncType BCryptGenRandomFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE bcrypt = LoadLibrary ("bcrypt.dll");
+ if (bcrypt != NULL)
+ {
+ BCryptGenRandomFunc =
+ (BCryptGenRandomFuncType) GetProcAddress (bcrypt, "BCryptGenRandom");
+ }
+ initialized = TRUE;
+}
+
+# else
+
+# define BCryptGenRandomFunc BCryptGenRandom
+
+# endif
+
+#else
+/* These devices exist on all platforms except native Windows. */
+
+/* Name of a device through which the kernel returns high quality random
+ numbers, from an entropy pool. When the pool is empty, the call blocks
+ until entropy sources have added enough bits of entropy. */
+# ifndef NAME_OF_RANDOM_DEVICE
+# define NAME_OF_RANDOM_DEVICE "/dev/random"
+# endif
+
+/* Name of a device through which the kernel returns random or pseudo-random
+ numbers. It uses an entropy pool, but, in order to avoid blocking, adds
+ bits generated by a pseudo-random number generator, as needed. */
+# ifndef NAME_OF_NONCE_DEVICE
+# define NAME_OF_NONCE_DEVICE "/dev/urandom"
+# endif
+
+#endif
+
+/* Set BUFFER (of size LENGTH) to random bytes under the control of FLAGS.
+ Return the number of bytes written (> 0).
+ Upon error, return -1 and set errno. */
+ssize_t
+getrandom (void *buffer, size_t length, unsigned int flags)
+#undef getrandom
+{
+#if defined _WIN32 && ! defined __CYGWIN__
+ /* BCryptGenRandom, defined in <bcrypt.h>
+ <https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom>
+ with the BCRYPT_USE_SYSTEM_PREFERRED_RNG flag
+ works in Windows 7 and newer. */
+ static int bcrypt_not_working /* = 0 */;
+ if (!bcrypt_not_working)
+ {
+# if !HAVE_LIB_BCRYPT
+ if (!initialized)
+ initialize ();
+# endif
+ if (BCryptGenRandomFunc != NULL
+ && BCryptGenRandomFunc (NULL, buffer, length,
+ BCRYPT_USE_SYSTEM_PREFERRED_RNG)
+ == 0 /*STATUS_SUCCESS*/)
+ return length;
+ bcrypt_not_working = 1;
+ }
+# if !HAVE_LIB_BCRYPT
+ /* CryptGenRandom, defined in <wincrypt.h>
+ <https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom>
+ works in older releases as well, but is now deprecated.
+ CryptAcquireContext, defined in <wincrypt.h>
+ <https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta> */
+ {
+ static int crypt_initialized /* = 0 */;
+ static HCRYPTPROV provider;
+ if (!crypt_initialized)
+ {
+ if (CryptAcquireContext (&provider, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFY_CONTEXT))
+ crypt_initialized = 1;
+ else
+ crypt_initialized = -1;
+ }
+ if (crypt_initialized >= 0)
+ {
+ if (!CryptGenRandom (provider, length, buffer))
+ {
+ errno = EIO;
+ return -1;
+ }
+ return length;
+ }
+ }
+# endif
+ errno = ENOSYS;
+ return -1;
+#elif HAVE_GETRANDOM
+ return getrandom (buffer, length, flags);
+#else
+ static int randfd[2] = { -1, -1 };
+ bool devrandom = (flags & GRND_RANDOM) != 0;
+ int fd = randfd[devrandom];
+
+ if (fd < 0)
+ {
+ static char const randdevice[][MAX (sizeof NAME_OF_NONCE_DEVICE,
+ sizeof NAME_OF_RANDOM_DEVICE)]
+ = { NAME_OF_NONCE_DEVICE, NAME_OF_RANDOM_DEVICE };
+ int oflags = (O_RDONLY + O_CLOEXEC
+ + (flags & GRND_NONBLOCK ? O_NONBLOCK : 0));
+ fd = open (randdevice[devrandom], oflags);
+ if (fd < 0)
+ return fd;
+ randfd[devrandom] = fd;
+ }
+
+ return read (fd, buffer, length);
+#endif
+}
diff --git a/lib/getsockname.c b/lib/getsockname.c
new file mode 100644
index 0000000..fcba8a8
--- /dev/null
+++ b/lib/getsockname.c
@@ -0,0 +1,49 @@
+/* getsockname.c --- wrappers for Windows getsockname function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef getsockname
+
+int
+rpl_getsockname (int fd, struct sockaddr *addr, socklen_t *addrlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = getsockname (sock, addr, addrlen);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/gettext.h b/lib/gettext.h
new file mode 100644
index 0000000..0bd1e13
--- /dev/null
+++ b/lib/gettext.h
@@ -0,0 +1,301 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+ Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option
+ or through "#define ENABLE NLS 0" before including this file. */
+#if defined ENABLE_NLS && ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions. */
+# include <libintl.h>
+
+/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
+ the gettext() and ngettext() macros. This is an alternative to calling
+ textdomain(), and is useful for libraries. */
+# ifdef DEFAULT_TEXT_DOMAIN
+# undef gettext
+# define gettext(Msgid) \
+ dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
+# endif
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+ chokes if dcgettext is defined as a macro. So include it now, to make
+ later inclusions of <locale.h> a NOP. We don't include <libintl.h>
+ as well because people using "gettext.h" will not include <libintl.h>,
+ and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+ is OK. */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
+ <libintl.h>, which chokes if dcgettext is defined as a macro. So include
+ it now, to make later inclusions of <libintl.h> a NOP. */
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
+# include <cstdlib>
+# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
+# include <libintl.h>
+# endif
+#endif
+
+/* Disabled NLS.
+ The casts to 'const char *' serve the purpose of producing warnings
+ for invalid uses of the value returned from these functions.
+ On pre-ANSI systems without 'const', the config.h file is supposed to
+ contain "#define const". */
+# undef gettext
+# define gettext(Msgid) ((const char *) (Msgid))
+# undef dgettext
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# undef dcgettext
+# define dcgettext(Domainname, Msgid, Category) \
+ ((void) (Category), dgettext (Domainname, Msgid))
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+ ((N) == 1 \
+ ? ((void) (Msgid2), (const char *) (Msgid1)) \
+ : ((void) (Msgid1), (const char *) (Msgid2)))
+# undef dngettext
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+ ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# undef dcngettext
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+ ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
+# undef textdomain
+# define textdomain(Domainname) ((const char *) (Domainname))
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+ ((void) (Domainname), (const char *) (Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+ ((void) (Domainname), (const char *) (Codeset))
+
+#endif
+
+/* Prefer gnulib's setlocale override over libintl's setlocale override. */
+#ifdef GNULIB_defined_setlocale
+# undef setlocale
+# define setlocale rpl_setlocale
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code.
+ The argument, String, should be a literal string. Concatenated strings
+ and other string expressions won't work.
+ The macro's expansion is not parenthesized, so that it is suitable as
+ initializer for static 'char[]' or 'const char[]' variables. */
+#define gettext_noop(String) String
+
+/* The separator between msgctxt and msgid in a .mo file. */
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
+ MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be
+ short and rarely need to change.
+ The letter 'p' stands for 'particular' or 'special'. */
+#ifdef DEFAULT_TEXT_DOMAIN
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#else
+# define pgettext(Msgctxt, Msgid) \
+ pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#endif
+#define dpgettext(Domainname, Msgctxt, Msgid) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
+ pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
+#ifdef DEFAULT_TEXT_DOMAIN
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#else
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#endif
+#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
+ npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+pgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ int category)
+{
+ const char *translation = dcgettext (domain, msg_ctxt_id, category);
+ if (translation == msg_ctxt_id)
+ return msgid;
+ else
+ return translation;
+}
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+npgettext_aux (const char *domain,
+ const char *msg_ctxt_id, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ const char *translation =
+ dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+ if (translation == msg_ctxt_id || translation == msgid_plural)
+ return (n == 1 ? msgid : msgid_plural);
+ else
+ return translation;
+}
+
+/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID
+ can be arbitrary expressions. But for string literals these macros are
+ less efficient than those above. */
+
+#include <string.h>
+
+/* GNULIB_NO_VLA can be defined to disable use of VLAs even if supported.
+ This relates to the -Wvla and -Wvla-larger-than warnings, enabled in
+ the default GCC many warnings set. This allows programs to disable use
+ of VLAs, which may be unintended, or may be awkward to support portably,
+ or may have security implications due to non-deterministic stack usage. */
+
+#if (!defined GNULIB_NO_VLA \
+ && (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
+ /* || (__STDC_VERSION__ == 199901L && !defined __HP_cc)
+ || (__STDC_VERSION__ >= 201112L && !defined __STDC_NO_VLA__) */ ))
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
+#else
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
+#endif
+
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+#include <stdlib.h>
+#endif
+
+#define pgettext_expr(Msgctxt, Msgid) \
+ dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
+#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
+ dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ int found_translation;
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcgettext (domain, msg_ctxt_id, category);
+ found_translation = (translation != msg_ctxt_id);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (found_translation)
+ return translation;
+ }
+ return msgid;
+}
+
+#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+ dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcnpgettext_expr (const char *domain,
+ const char *msgctxt, const char *msgid,
+ const char *msgid_plural, unsigned long int n,
+ int category)
+{
+ size_t msgctxt_len = strlen (msgctxt) + 1;
+ size_t msgid_len = strlen (msgid) + 1;
+ const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+ char buf[1024];
+ char *msg_ctxt_id =
+ (msgctxt_len + msgid_len <= sizeof (buf)
+ ? buf
+ : (char *) malloc (msgctxt_len + msgid_len));
+ if (msg_ctxt_id != NULL)
+#endif
+ {
+ int found_translation;
+ memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+ msg_ctxt_id[msgctxt_len - 1] = '\004';
+ memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+ translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+ found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+ if (msg_ctxt_id != buf)
+ free (msg_ctxt_id);
+#endif
+ if (found_translation)
+ return translation;
+ }
+ return (n == 1 ? msgid : msgid_plural);
+}
+
+#endif /* _LIBGETTEXT_H */
diff --git a/lib/gettime.c b/lib/gettime.c
new file mode 100644
index 0000000..f5b8ca5
--- /dev/null
+++ b/lib/gettime.c
@@ -0,0 +1,49 @@
+/* gettime -- get the system clock
+
+ Copyright (C) 2002, 2004-2007, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "timespec.h"
+
+#include <sys/time.h>
+
+/* Get the system time into *TS. */
+
+void
+gettime (struct timespec *ts)
+{
+#if defined CLOCK_REALTIME && HAVE_CLOCK_GETTIME
+ clock_gettime (CLOCK_REALTIME, ts);
+#else
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+ ts->tv_sec = tv.tv_sec;
+ ts->tv_nsec = tv.tv_usec * 1000;
+#endif
+}
+
+/* Return the current system time as a struct timespec. */
+
+struct timespec
+current_timespec (void)
+{
+ struct timespec ts;
+ gettime (&ts);
+ return ts;
+}
diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c
new file mode 100644
index 0000000..5301e7c
--- /dev/null
+++ b/lib/gettimeofday.c
@@ -0,0 +1,153 @@
+/* Provide gettimeofday for systems that don't have it or for which it's broken.
+
+ Copyright (C) 2001-2003, 2005-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/time.h>
+
+#include <time.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WINDOWS_NATIVE
+# include <windows.h>
+#endif
+
+#ifdef WINDOWS_NATIVE
+
+/* Don't assume that UNICODE is not defined. */
+# undef LoadLibrary
+# define LoadLibrary LoadLibraryA
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
+/* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */
+typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime);
+static GetSystemTimePreciseAsFileTimeFuncType GetSystemTimePreciseAsFileTimeFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE kernel32 = LoadLibrary ("kernel32.dll");
+ if (kernel32 != NULL)
+ {
+ GetSystemTimePreciseAsFileTimeFunc =
+ (GetSystemTimePreciseAsFileTimeFuncType) GetProcAddress (kernel32, "GetSystemTimePreciseAsFileTime");
+ }
+ initialized = TRUE;
+}
+
+# else
+
+# define GetSystemTimePreciseAsFileTimeFunc GetSystemTimePreciseAsFileTime
+
+# endif
+
+#endif
+
+/* This is a wrapper for gettimeofday. It is used only on systems
+ that lack this function, or whose implementation of this function
+ causes problems.
+ Work around the bug in some systems whereby gettimeofday clobbers
+ the static buffer that localtime uses for its return value. The
+ gettimeofday function from Mac OS X 10.0.4 (i.e., Darwin 1.3.7) has
+ this problem. */
+
+int
+gettimeofday (struct timeval *restrict tv, void *restrict tz)
+{
+#undef gettimeofday
+#ifdef WINDOWS_NATIVE
+
+ /* On native Windows, there are two ways to get the current time:
+ GetSystemTimeAsFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime>
+ or
+ GetSystemTimePreciseAsFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime>.
+ GetSystemTimeAsFileTime produces values that jump by increments of
+ 15.627 milliseconds (!) on average.
+ Whereas GetSystemTimePreciseAsFileTime values usually jump by 1 or 2
+ microseconds.
+ More discussion on this topic:
+ <http://www.windowstimestamp.com/description>. */
+ FILETIME current_time;
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8)
+ if (!initialized)
+ initialize ();
+# endif
+ if (GetSystemTimePreciseAsFileTimeFunc != NULL)
+ GetSystemTimePreciseAsFileTimeFunc (&current_time);
+ else
+ GetSystemTimeAsFileTime (&current_time);
+
+ /* Convert from FILETIME to 'struct timeval'. */
+ /* FILETIME: <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
+ ULONGLONG since_1601 =
+ ((ULONGLONG) current_time.dwHighDateTime << 32)
+ | (ULONGLONG) current_time.dwLowDateTime;
+ /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89 leap
+ years, in total 134774 days. */
+ ULONGLONG since_1970 =
+ since_1601 - (ULONGLONG) 134774 * (ULONGLONG) 86400 * (ULONGLONG) 10000000;
+ ULONGLONG microseconds_since_1970 = since_1970 / (ULONGLONG) 10;
+ tv->tv_sec = microseconds_since_1970 / (ULONGLONG) 1000000;
+ tv->tv_usec = microseconds_since_1970 % (ULONGLONG) 1000000;
+
+ return 0;
+
+#else
+
+# if HAVE_GETTIMEOFDAY
+
+# if defined timeval /* 'struct timeval' overridden by gnulib? */
+# undef timeval
+ struct timeval otv;
+ int result = gettimeofday (&otv, (struct timezone *) tz);
+ if (result == 0)
+ {
+ tv->tv_sec = otv.tv_sec;
+ tv->tv_usec = otv.tv_usec;
+ }
+# else
+ int result = gettimeofday (tv, (struct timezone *) tz);
+# endif
+
+ return result;
+
+# else
+
+# if !defined OK_TO_USE_1S_CLOCK
+# error "Only 1-second nominal clock resolution found. Is that intended?" \
+ "If so, compile with the -DOK_TO_USE_1S_CLOCK option."
+# endif
+ tv->tv_sec = time (NULL);
+ tv->tv_usec = 0;
+
+ return 0;
+
+# endif
+#endif
+}
diff --git a/lib/gl_openssl.h b/lib/gl_openssl.h
new file mode 100644
index 0000000..e985b1c
--- /dev/null
+++ b/lib/gl_openssl.h
@@ -0,0 +1,116 @@
+/* Wrap openssl crypto hash routines in gnulib interface. -*- coding: utf-8 -*-
+
+ Copyright (C) 2013-2020 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/>. */
+
+/* Written by Pádraig Brady */
+
+#ifndef GL_OPENSSL_NAME
+# error "Please define GL_OPENSSL_NAME to 1,5,256 etc."
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+# error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef GL_OPENSSL_INLINE
+# define GL_OPENSSL_INLINE _GL_INLINE
+#endif
+
+/* Concatenate two preprocessor tokens. */
+#define _GLCRYPTO_CONCAT_(prefix, suffix) prefix##suffix
+#define _GLCRYPTO_CONCAT(prefix, suffix) _GLCRYPTO_CONCAT_ (prefix, suffix)
+
+#if GL_OPENSSL_NAME == 5
+# define OPENSSL_ALG md5
+#else
+# define OPENSSL_ALG _GLCRYPTO_CONCAT (sha, GL_OPENSSL_NAME)
+#endif
+
+/* Context type mappings. */
+#if BASE_OPENSSL_TYPE != GL_OPENSSL_NAME
+# undef BASE_OPENSSL_TYPE
+# if GL_OPENSSL_NAME == 224
+# define BASE_OPENSSL_TYPE 256
+# elif GL_OPENSSL_NAME == 384
+# define BASE_OPENSSL_TYPE 512
+# endif
+# define md5_CTX MD5_CTX
+# define sha1_CTX SHA_CTX
+# define sha224_CTX SHA256_CTX
+# define sha224_ctx sha256_ctx
+# define sha256_CTX SHA256_CTX
+# define sha384_CTX SHA512_CTX
+# define sha384_ctx sha512_ctx
+# define sha512_CTX SHA512_CTX
+# undef _gl_CTX
+# undef _gl_ctx
+# define _gl_CTX _GLCRYPTO_CONCAT (OPENSSL_ALG, _CTX) /* openssl type. */
+# define _gl_ctx _GLCRYPTO_CONCAT (OPENSSL_ALG, _ctx) /* gnulib type. */
+
+struct _gl_ctx { _gl_CTX CTX; };
+#endif
+
+/* Function name mappings. */
+#define md5_prefix MD5
+#define sha1_prefix SHA1
+#define sha224_prefix SHA224
+#define sha256_prefix SHA256
+#define sha384_prefix SHA384
+#define sha512_prefix SHA512
+#define _GLCRYPTO_PREFIX _GLCRYPTO_CONCAT (OPENSSL_ALG, _prefix)
+#define OPENSSL_FN(suffix) _GLCRYPTO_CONCAT (_GLCRYPTO_PREFIX, suffix)
+#define GL_CRYPTO_FN(suffix) _GLCRYPTO_CONCAT (OPENSSL_ALG, suffix)
+
+GL_OPENSSL_INLINE void
+GL_CRYPTO_FN (_init_ctx) (struct _gl_ctx *ctx)
+{ (void) OPENSSL_FN (_Init) ((_gl_CTX *) ctx); }
+
+/* These were never exposed by gnulib. */
+#if ! (GL_OPENSSL_NAME == 224 || GL_OPENSSL_NAME == 384)
+GL_OPENSSL_INLINE void
+GL_CRYPTO_FN (_process_bytes) (const void *buf, size_t len, struct _gl_ctx *ctx)
+{ OPENSSL_FN (_Update) ((_gl_CTX *) ctx, buf, len); }
+
+GL_OPENSSL_INLINE void
+GL_CRYPTO_FN (_process_block) (const void *buf, size_t len, struct _gl_ctx *ctx)
+{ GL_CRYPTO_FN (_process_bytes) (buf, len, ctx); }
+#endif
+
+GL_OPENSSL_INLINE void *
+GL_CRYPTO_FN (_finish_ctx) (struct _gl_ctx *ctx, void *restrict res)
+{ OPENSSL_FN (_Final) ((unsigned char *) res, (_gl_CTX *) ctx); return res; }
+
+GL_OPENSSL_INLINE void *
+GL_CRYPTO_FN (_buffer) (const char *buf, size_t len, void *restrict res)
+{ return OPENSSL_FN () ((const unsigned char *) buf, len, (unsigned char *) res); }
+
+GL_OPENSSL_INLINE void *
+GL_CRYPTO_FN (_read_ctx) (const struct _gl_ctx *ctx, void *restrict res)
+{
+ /* Assume any unprocessed bytes in ctx are not to be ignored. */
+ _gl_CTX tmp_ctx = *(_gl_CTX *) ctx;
+ OPENSSL_FN (_Final) ((unsigned char *) res, &tmp_ctx);
+ return res;
+}
+
+/* Undef so we can include multiple times. */
+#undef GL_CRYPTO_FN
+#undef OPENSSL_FN
+#undef _GLCRYPTO_PREFIX
+#undef OPENSSL_ALG
+#undef GL_OPENSSL_NAME
+
+_GL_INLINE_HEADER_END
diff --git a/lib/glthread/lock.c b/lib/glthread/lock.c
new file mode 100644
index 0000000..10af6f2
--- /dev/null
+++ b/lib/glthread/lock.c
@@ -0,0 +1,749 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h. */
+
+#include <config.h>
+
+#include "glthread/lock.h"
+
+/* ========================================================================= */
+
+#if USE_ISOC_THREADS || USE_ISOC_AND_POSIX_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+int
+glthread_lock_init (gl_lock_t *lock)
+{
+ if (mtx_init (&lock->mutex, mtx_plain) != thrd_success)
+ return ENOMEM;
+ lock->init_needed = 0;
+ return 0;
+}
+
+int
+glthread_lock_lock (gl_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_lock (&lock->mutex) != thrd_success)
+ return EAGAIN;
+ return 0;
+}
+
+int
+glthread_lock_unlock (gl_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_unlock (&lock->mutex) != thrd_success)
+ return EINVAL;
+ return 0;
+}
+
+int
+glthread_lock_destroy (gl_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ mtx_destroy (&lock->mutex);
+ return 0;
+}
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+int
+glthread_rwlock_init (gl_rwlock_t *lock)
+{
+ if (mtx_init (&lock->lock, mtx_plain) != thrd_success
+ || cnd_init (&lock->waiting_readers) != thrd_success
+ || cnd_init (&lock->waiting_writers) != thrd_success)
+ return ENOMEM;
+ lock->waiting_writers_count = 0;
+ lock->runcount = 0;
+ lock->init_needed = 0;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock (gl_rwlock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_lock (&lock->lock) != thrd_success)
+ return EAGAIN;
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow, and whether no writer is waiting. The latter
+ condition is because POSIX recommends that "write locks shall take
+ precedence over read locks", to avoid "writer starvation". */
+ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ if (cnd_wait (&lock->waiting_readers, &lock->lock) != thrd_success)
+ {
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ }
+ lock->runcount++;
+ if (mtx_unlock (&lock->lock) != thrd_success)
+ return EINVAL;
+ return 0;
+}
+
+int
+glthread_rwlock_wrlock (gl_rwlock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_lock (&lock->lock) != thrd_success)
+ return EAGAIN;
+ /* Test whether no readers or writers are currently running. */
+ while (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ lock->waiting_writers_count++;
+ if (cnd_wait (&lock->waiting_writers, &lock->lock) != thrd_success)
+ {
+ lock->waiting_writers_count--;
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->waiting_writers_count--;
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ if (mtx_unlock (&lock->lock) != thrd_success)
+ return EINVAL;
+ return 0;
+}
+
+int
+glthread_rwlock_unlock (gl_rwlock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_lock (&lock->lock) != thrd_success)
+ return EAGAIN;
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ {
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers_count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ if (cnd_signal (&lock->waiting_writers) != thrd_success)
+ {
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ if (cnd_broadcast (&lock->waiting_readers) != thrd_success)
+ {
+ mtx_unlock (&lock->lock);
+ return EINVAL;
+ }
+ }
+ }
+ if (mtx_unlock (&lock->lock) != thrd_success)
+ return EINVAL;
+ return 0;
+}
+
+int
+glthread_rwlock_destroy (gl_rwlock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ mtx_destroy (&lock->lock);
+ cnd_destroy (&lock->waiting_readers);
+ cnd_destroy (&lock->waiting_writers);
+ return 0;
+}
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+int
+glthread_recursive_lock_init (gl_recursive_lock_t *lock)
+{
+ if (mtx_init (&lock->mutex, mtx_plain | mtx_recursive) != thrd_success)
+ return ENOMEM;
+ lock->init_needed = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock (gl_recursive_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_lock (&lock->mutex) != thrd_success)
+ return EAGAIN;
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock (gl_recursive_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ if (mtx_unlock (&lock->mutex) != thrd_success)
+ return EINVAL;
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy (gl_recursive_lock_t *lock)
+{
+ if (lock->init_needed)
+ call_once (&lock->init_once, lock->init_func);
+ mtx_destroy (&lock->mutex);
+ return 0;
+}
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1)))
+
+# if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP
+
+# if !HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
+ /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */
+
+int
+glthread_rwlock_init_for_glibc (pthread_rwlock_t *lock)
+{
+ pthread_rwlockattr_t attributes;
+ int err;
+
+ err = pthread_rwlockattr_init (&attributes);
+ if (err != 0)
+ return err;
+ /* Note: PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP is the only value that
+ causes the writer to be preferred. PTHREAD_RWLOCK_PREFER_WRITER_NP does not
+ do this; see
+ http://man7.org/linux/man-pages/man3/pthread_rwlockattr_setkind_np.3.html */
+ err = pthread_rwlockattr_setkind_np (&attributes,
+ PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
+ if (err == 0)
+ err = pthread_rwlock_init(lock, &attributes);
+ /* pthread_rwlockattr_destroy always returns 0. It cannot influence the
+ return value. */
+ pthread_rwlockattr_destroy (&attributes);
+ return err;
+}
+
+# endif
+# else
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_rwlock_init (&lock->rwlock, NULL);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_rdlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_rwlock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_rwlock_wrlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_rwlock_unlock (&lock->rwlock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_rwlock_destroy (&lock->rwlock);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_rwlock_init_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->lock, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_readers, NULL);
+ if (err != 0)
+ return err;
+ err = pthread_cond_init (&lock->waiting_writers, NULL);
+ if (err != 0)
+ return err;
+ lock->waiting_writers_count = 0;
+ lock->runcount = 0;
+ return 0;
+}
+
+int
+glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow, and whether no writer is waiting. The latter
+ condition is because POSIX recommends that "write locks shall take
+ precedence over read locks", to avoid "writer starvation". */
+ while (!(lock->runcount + 1 > 0 && lock->waiting_writers_count == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ err = pthread_cond_wait (&lock->waiting_readers, &lock->lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ lock->runcount++;
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ /* Test whether no readers or writers are currently running. */
+ while (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ lock->waiting_writers_count++;
+ err = pthread_cond_wait (&lock->waiting_writers, &lock->lock);
+ if (err != 0)
+ {
+ lock->waiting_writers_count--;
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ lock->waiting_writers_count--;
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_lock (&lock->lock);
+ if (err != 0)
+ return err;
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return EINVAL;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers_count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ err = pthread_cond_signal (&lock->waiting_writers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ err = pthread_cond_broadcast (&lock->waiting_readers);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->lock);
+ return err;
+ }
+ }
+ }
+ return pthread_mutex_unlock (&lock->lock);
+}
+
+int
+glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_destroy (&lock->lock);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_readers);
+ if (err != 0)
+ return err;
+ err = pthread_cond_destroy (&lock->waiting_writers);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (lock, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_mutexattr_t attributes;
+ int err;
+
+ err = pthread_mutexattr_init (&attributes);
+ if (err != 0)
+ return err;
+ err = pthread_mutexattr_settype (&attributes, PTHREAD_MUTEX_RECURSIVE);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutex_init (&lock->recmutex, &attributes);
+ if (err != 0)
+ {
+ pthread_mutexattr_destroy (&attributes);
+ return err;
+ }
+ err = pthread_mutexattr_destroy (&attributes);
+ if (err != 0)
+ return err;
+ lock->initialized = 1;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->guard);
+ if (err != 0)
+ return err;
+ if (!lock->initialized)
+ {
+ err = glthread_recursive_lock_init_multithreaded (lock);
+ if (err != 0)
+ {
+ pthread_mutex_unlock (&lock->guard);
+ return err;
+ }
+ }
+ err = pthread_mutex_unlock (&lock->guard);
+ if (err != 0)
+ return err;
+ }
+ return pthread_mutex_lock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (!lock->initialized)
+ return EINVAL;
+ return pthread_mutex_unlock (&lock->recmutex);
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ if (!lock->initialized)
+ return EINVAL;
+ err = pthread_mutex_destroy (&lock->recmutex);
+ if (err != 0)
+ return err;
+ lock->initialized = 0;
+ return 0;
+}
+
+# endif
+
+# else
+
+int
+glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock)
+{
+ int err;
+
+ err = pthread_mutex_init (&lock->mutex, NULL);
+ if (err != 0)
+ return err;
+ lock->owner = (pthread_t) 0;
+ lock->depth = 0;
+ return 0;
+}
+
+int
+glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock)
+{
+ pthread_t self = pthread_self ();
+ if (lock->owner != self)
+ {
+ int err;
+
+ err = pthread_mutex_lock (&lock->mutex);
+ if (err != 0)
+ return err;
+ lock->owner = self;
+ }
+ if (++(lock->depth) == 0) /* wraparound? */
+ {
+ lock->depth--;
+ return EAGAIN;
+ }
+ return 0;
+}
+
+int
+glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != pthread_self ())
+ return EPERM;
+ if (lock->depth == 0)
+ return EINVAL;
+ if (--(lock->depth) == 0)
+ {
+ lock->owner = (pthread_t) 0;
+ return pthread_mutex_unlock (&lock->mutex);
+ }
+ else
+ return 0;
+}
+
+int
+glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock)
+{
+ if (lock->owner != (pthread_t) 0)
+ return EBUSY;
+ return pthread_mutex_destroy (&lock->mutex);
+}
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+static const pthread_once_t fresh_once = PTHREAD_ONCE_INIT;
+
+int
+glthread_once_singlethreaded (pthread_once_t *once_control)
+{
+ /* We don't know whether pthread_once_t is an integer type, a floating-point
+ type, a pointer type, or a structure type. */
+ char *firstbyte = (char *)once_control;
+ if (*firstbyte == *(const char *)&fresh_once)
+ {
+ /* First time use of once_control. Invert the first byte. */
+ *firstbyte = ~ *(const char *)&fresh_once;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+# if !(PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK)
+
+int
+glthread_once_multithreaded (pthread_once_t *once_control,
+ void (*init_function) (void))
+{
+ int err = pthread_once (once_control, init_function);
+ if (err == ENOSYS)
+ {
+ /* This happens on FreeBSD 11: The pthread_once function in libc returns
+ ENOSYS. */
+ if (glthread_once_singlethreaded (once_control))
+ init_function ();
+ return 0;
+ }
+ return err;
+}
+
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WINDOWS_THREADS
+
+#endif
+
+/* ========================================================================= */
diff --git a/lib/glthread/lock.h b/lib/glthread/lock.h
new file mode 100644
index 0000000..59485f2
--- /dev/null
+++ b/lib/glthread/lock.h
@@ -0,0 +1,789 @@
+/* Locking in multithreaded situations.
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-posix.h, gthr-posix95.h, gthr-win32.h. */
+
+/* This file contains locking primitives for use with a given thread library.
+ It does not contain primitives for creating threads or for other
+ synchronization primitives.
+
+ Normal (non-recursive) locks:
+ Type: gl_lock_t
+ Declaration: gl_lock_define(extern, name)
+ Initializer: gl_lock_define_initialized(, name)
+ Initialization: gl_lock_init (name);
+ Taking the lock: gl_lock_lock (name);
+ Releasing the lock: gl_lock_unlock (name);
+ De-initialization: gl_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_lock_init (&name);
+ Taking the lock: err = glthread_lock_lock (&name);
+ Releasing the lock: err = glthread_lock_unlock (&name);
+ De-initialization: err = glthread_lock_destroy (&name);
+
+ Read-Write (non-recursive) locks:
+ Type: gl_rwlock_t
+ Declaration: gl_rwlock_define(extern, name)
+ Initializer: gl_rwlock_define_initialized(, name)
+ Initialization: gl_rwlock_init (name);
+ Taking the lock: gl_rwlock_rdlock (name);
+ gl_rwlock_wrlock (name);
+ Releasing the lock: gl_rwlock_unlock (name);
+ De-initialization: gl_rwlock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_rwlock_init (&name);
+ Taking the lock: err = glthread_rwlock_rdlock (&name);
+ err = glthread_rwlock_wrlock (&name);
+ Releasing the lock: err = glthread_rwlock_unlock (&name);
+ De-initialization: err = glthread_rwlock_destroy (&name);
+
+ Recursive locks:
+ Type: gl_recursive_lock_t
+ Declaration: gl_recursive_lock_define(extern, name)
+ Initializer: gl_recursive_lock_define_initialized(, name)
+ Initialization: gl_recursive_lock_init (name);
+ Taking the lock: gl_recursive_lock_lock (name);
+ Releasing the lock: gl_recursive_lock_unlock (name);
+ De-initialization: gl_recursive_lock_destroy (name);
+ Equivalent functions with control of error handling:
+ Initialization: err = glthread_recursive_lock_init (&name);
+ Taking the lock: err = glthread_recursive_lock_lock (&name);
+ Releasing the lock: err = glthread_recursive_lock_unlock (&name);
+ De-initialization: err = glthread_recursive_lock_destroy (&name);
+
+ Once-only execution:
+ Type: gl_once_t
+ Initializer: gl_once_define(extern, name)
+ Execution: gl_once (name, initfunction);
+ Equivalent functions with control of error handling:
+ Execution: err = glthread_once (&name, initfunction);
+*/
+
+
+#ifndef _LOCK_H
+#define _LOCK_H
+
+#include <errno.h>
+#include <stdlib.h>
+
+#if !defined c11_threads_in_use
+# if HAVE_THREADS_H && USE_POSIX_THREADS_WEAK
+# include <threads.h>
+# pragma weak thrd_exit
+# define c11_threads_in_use() (thrd_exit != NULL)
+# else
+# define c11_threads_in_use() 0
+# endif
+#endif
+
+/* ========================================================================= */
+
+#if USE_ISOC_THREADS || USE_ISOC_AND_POSIX_THREADS
+
+/* Use the ISO C threads library. */
+
+# include <threads.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef struct
+ {
+ int volatile init_needed;
+ once_flag init_once;
+ void (*init_func) (void);
+ mtx_t mutex;
+ }
+ gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ static void _atomic_init_##NAME (void); \
+ STORAGECLASS gl_lock_t NAME = \
+ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \
+ static void _atomic_init_##NAME (void) \
+ { \
+ if (glthread_lock_init (&(NAME))) \
+ abort (); \
+ }
+extern int glthread_lock_init (gl_lock_t *lock);
+extern int glthread_lock_lock (gl_lock_t *lock);
+extern int glthread_lock_unlock (gl_lock_t *lock);
+extern int glthread_lock_destroy (gl_lock_t *lock);
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef struct
+ {
+ int volatile init_needed;
+ once_flag init_once;
+ void (*init_func) (void);
+ mtx_t lock; /* protects the remaining fields */
+ cnd_t waiting_readers; /* waiting readers */
+ cnd_t waiting_writers; /* waiting writers */
+ unsigned int waiting_writers_count; /* number of waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ static void _atomic_init_##NAME (void); \
+ STORAGECLASS gl_rwlock_t NAME = \
+ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \
+ static void _atomic_init_##NAME (void) \
+ { \
+ if (glthread_rwlock_init (&(NAME))) \
+ abort (); \
+ }
+extern int glthread_rwlock_init (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy (gl_rwlock_t *lock);
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef struct
+ {
+ int volatile init_needed;
+ once_flag init_once;
+ void (*init_func) (void);
+ mtx_t mutex;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ static void _atomic_init_##NAME (void); \
+ STORAGECLASS gl_recursive_lock_t NAME = \
+ { 1, ONCE_FLAG_INIT, _atomic_init_##NAME }; \
+ static void _atomic_init_##NAME (void) \
+ { \
+ if (glthread_recursive_lock_init (&(NAME))) \
+ abort (); \
+ }
+extern int glthread_recursive_lock_init (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef once_flag gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS once_flag NAME = ONCE_FLAG_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (call_once (ONCE_CONTROL, INITFUNCTION), 0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <pthread.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+/* The pthread_in_use() detection needs to be done at runtime. */
+# define pthread_in_use() \
+ glthread_in_use ()
+extern int glthread_in_use (void);
+
+# endif
+
+# if USE_POSIX_THREADS_WEAK
+
+/* Use weak references to the POSIX threads library. */
+
+/* Weak references avoid dragging in external libraries if the other parts
+ of the program don't use them. Here we use them, because we don't want
+ every program that uses libintl to depend on libpthread. This assumes
+ that libpthread would not be loaded after libintl; i.e. if libintl is
+ loaded first, by an executable that does not depend on libpthread, and
+ then a module is dynamically loaded that depends on libpthread, libintl
+ will not be multithread-safe. */
+
+/* The way to test at runtime whether libpthread is present is to test
+ whether a function pointer's value, such as &pthread_mutex_init, is
+ non-NULL. However, some versions of GCC have a bug through which, in
+ PIC mode, &foo != NULL always evaluates to true if there is a direct
+ call to foo(...) in the same function. To avoid this, we test the
+ address of a function in libpthread that we don't use. */
+
+# pragma weak pthread_mutex_init
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+# pragma weak pthread_mutex_destroy
+# pragma weak pthread_rwlock_init
+# pragma weak pthread_rwlock_rdlock
+# pragma weak pthread_rwlock_wrlock
+# pragma weak pthread_rwlock_unlock
+# pragma weak pthread_rwlock_destroy
+# pragma weak pthread_once
+# pragma weak pthread_cond_init
+# pragma weak pthread_cond_wait
+# pragma weak pthread_cond_signal
+# pragma weak pthread_cond_broadcast
+# pragma weak pthread_cond_destroy
+# pragma weak pthread_mutexattr_init
+# pragma weak pthread_mutexattr_settype
+# pragma weak pthread_mutexattr_destroy
+# pragma weak pthread_rwlockattr_init
+# if __GNU_LIBRARY__ > 1
+# pragma weak pthread_rwlockattr_setkind_np
+# endif
+# pragma weak pthread_rwlockattr_destroy
+# ifndef pthread_self
+# pragma weak pthread_self
+# endif
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+ /* Considering all platforms with USE_POSIX_THREADS_WEAK, only few symbols
+ can be used to determine whether libpthread is in use. These are:
+ pthread_mutexattr_gettype
+ pthread_rwlockattr_destroy
+ pthread_rwlockattr_init
+ */
+# pragma weak pthread_mutexattr_gettype
+# define pthread_in_use() \
+ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+# endif
+
+# else
+
+# if !PTHREAD_IN_USE_DETECTION_HARD
+# define pthread_in_use() 1
+# endif
+
+# endif
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef pthread_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ PTHREAD_MUTEX_INITIALIZER
+# define glthread_lock_init(LOCK) \
+ (pthread_in_use () ? pthread_mutex_init (LOCK, NULL) : 0)
+# define glthread_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+# if HAVE_PTHREAD_RWLOCK && (HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER || (defined PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP && (__GNU_LIBRARY__ > 1)))
+
+# if defined PTHREAD_RWLOCK_INITIALIZER || defined PTHREAD_RWLOCK_INITIALIZER_NP
+
+typedef pthread_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
+# if HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
+# if defined PTHREAD_RWLOCK_INITIALIZER
+# define gl_rwlock_initializer \
+ PTHREAD_RWLOCK_INITIALIZER
+# else
+# define gl_rwlock_initializer \
+ PTHREAD_RWLOCK_INITIALIZER_NP
+# endif
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0)
+# else /* glibc with bug https://sourceware.org/bugzilla/show_bug.cgi?id=13701 */
+# define gl_rwlock_initializer \
+ PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_for_glibc (LOCK) : 0)
+extern int glthread_rwlock_init_for_glibc (pthread_rwlock_t *lock);
+# endif
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_rdlock (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_wrlock (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_unlock (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_rwlock_destroy (LOCK) : 0)
+
+# else
+
+typedef struct
+ {
+ int initialized;
+ pthread_mutex_t guard; /* protects the initialization */
+ pthread_rwlock_t rwlock; /* read-write lock */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { 0, PTHREAD_MUTEX_INITIALIZER }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t lock; /* protects the remaining fields */
+ pthread_cond_t waiting_readers; /* waiting readers */
+ pthread_cond_t waiting_writers; /* waiting writers */
+ unsigned int waiting_writers_count; /* number of waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
+# define glthread_rwlock_init(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_wrlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
+# define glthread_rwlock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
+extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
+
+# endif
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+# if HAVE_PTHREAD_MUTEX_RECURSIVE
+
+# if defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER || defined PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+
+typedef pthread_mutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_mutex_t NAME = gl_recursive_lock_initializer;
+# ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+# else
+# define gl_recursive_lock_initializer \
+ PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
+# endif
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+
+# else
+
+typedef struct
+ {
+ pthread_mutex_t recmutex; /* recursive mutex */
+ pthread_mutex_t guard; /* protects the initialization */
+ int initialized;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+# else
+
+/* Old versions of POSIX threads on Solaris did not have recursive locks.
+ We have to implement them ourselves. */
+
+typedef struct
+ {
+ pthread_mutex_t mutex;
+ pthread_t owner;
+ unsigned long depth;
+ }
+ gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
+# define glthread_recursive_lock_init(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_unlock(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
+# define glthread_recursive_lock_destroy(LOCK) \
+ (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
+extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
+extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
+
+# endif
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef pthread_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
+# if PTHREAD_IN_USE_DETECTION_HARD || USE_POSIX_THREADS_WEAK
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pthread_in_use () \
+ ? pthread_once (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+# else
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (pthread_in_use () \
+ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
+ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
+extern int glthread_once_multithreaded (pthread_once_t *once_control,
+ void (*init_function) (void));
+# endif
+extern int glthread_once_singlethreaded (pthread_once_t *once_control);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if USE_WINDOWS_THREADS
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "windows-mutex.h"
+# include "windows-rwlock.h"
+# include "windows-recmutex.h"
+# include "windows-once.h"
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* We can use CRITICAL_SECTION directly, rather than the native Windows Event,
+ Mutex, Semaphore types, because
+ - we need only to synchronize inside a single process (address space),
+ not inter-process locking,
+ - we don't need to support trylock operations. (TryEnterCriticalSection
+ does not work on Windows 95/98/ME. Packages that need trylock usually
+ define their own mutex type.) */
+
+/* There is no way to statically initialize a CRITICAL_SECTION. It needs
+ to be done lazily, once only. For this we need spinlocks. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef glwthread_mutex_t gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME;
+# define gl_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
+# define gl_lock_initializer \
+ GLWTHREAD_MUTEX_INIT
+# define glthread_lock_init(LOCK) \
+ (glwthread_mutex_init (LOCK), 0)
+# define glthread_lock_lock(LOCK) \
+ glwthread_mutex_lock (LOCK)
+# define glthread_lock_unlock(LOCK) \
+ glwthread_mutex_unlock (LOCK)
+# define glthread_lock_destroy(LOCK) \
+ glwthread_mutex_destroy (LOCK)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef glwthread_rwlock_t gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME;
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
+# define gl_rwlock_initializer \
+ GLWTHREAD_RWLOCK_INIT
+# define glthread_rwlock_init(LOCK) \
+ (glwthread_rwlock_init (LOCK), 0)
+# define glthread_rwlock_rdlock(LOCK) \
+ glwthread_rwlock_rdlock (LOCK)
+# define glthread_rwlock_wrlock(LOCK) \
+ glwthread_rwlock_wrlock (LOCK)
+# define glthread_rwlock_unlock(LOCK) \
+ glwthread_rwlock_unlock (LOCK)
+# define glthread_rwlock_destroy(LOCK) \
+ glwthread_rwlock_destroy (LOCK)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef glwthread_recmutex_t gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME;
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) \
+ STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
+# define gl_recursive_lock_initializer \
+ GLWTHREAD_RECMUTEX_INIT
+# define glthread_recursive_lock_init(LOCK) \
+ (glwthread_recmutex_init (LOCK), 0)
+# define glthread_recursive_lock_lock(LOCK) \
+ glwthread_recmutex_lock (LOCK)
+# define glthread_recursive_lock_unlock(LOCK) \
+ glwthread_recmutex_unlock (LOCK)
+# define glthread_recursive_lock_destroy(LOCK) \
+ glwthread_recmutex_destroy (LOCK)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef glwthread_once_t gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = GLWTHREAD_ONCE_INIT;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (glwthread_once (ONCE_CONTROL, INITFUNCTION), 0)
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+#if !(USE_ISOC_THREADS || USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS || USE_WINDOWS_THREADS)
+
+/* Provide dummy implementation if threads are not supported. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+typedef int gl_lock_t;
+# define gl_lock_define(STORAGECLASS, NAME)
+# define gl_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_lock_init(NAME) 0
+# define glthread_lock_lock(NAME) 0
+# define glthread_lock_unlock(NAME) 0
+# define glthread_lock_destroy(NAME) 0
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+typedef int gl_rwlock_t;
+# define gl_rwlock_define(STORAGECLASS, NAME)
+# define gl_rwlock_define_initialized(STORAGECLASS, NAME)
+# define glthread_rwlock_init(NAME) 0
+# define glthread_rwlock_rdlock(NAME) 0
+# define glthread_rwlock_wrlock(NAME) 0
+# define glthread_rwlock_unlock(NAME) 0
+# define glthread_rwlock_destroy(NAME) 0
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+typedef int gl_recursive_lock_t;
+# define gl_recursive_lock_define(STORAGECLASS, NAME)
+# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
+# define glthread_recursive_lock_init(NAME) 0
+# define glthread_recursive_lock_lock(NAME) 0
+# define glthread_recursive_lock_unlock(NAME) 0
+# define glthread_recursive_lock_destroy(NAME) 0
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+typedef int gl_once_t;
+# define gl_once_define(STORAGECLASS, NAME) \
+ STORAGECLASS gl_once_t NAME = 0;
+# define glthread_once(ONCE_CONTROL, INITFUNCTION) \
+ (*(ONCE_CONTROL) == 0 ? (*(ONCE_CONTROL) = ~ 0, INITFUNCTION (), 0) : 0)
+
+#endif
+
+/* ========================================================================= */
+
+/* Macros with built-in error handling. */
+
+/* -------------------------- gl_lock_t datatype -------------------------- */
+
+#define gl_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ------------------------- gl_rwlock_t datatype ------------------------- */
+
+#define gl_rwlock_init(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_rdlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_rdlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_wrlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_wrlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_rwlock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_rwlock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* --------------------- gl_recursive_lock_t datatype --------------------- */
+
+#define gl_recursive_lock_init(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_init (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_lock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_lock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_unlock(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_unlock (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+#define gl_recursive_lock_destroy(NAME) \
+ do \
+ { \
+ if (glthread_recursive_lock_destroy (&NAME)) \
+ abort (); \
+ } \
+ while (0)
+
+/* -------------------------- gl_once_t datatype -------------------------- */
+
+#define gl_once(NAME, INITFUNCTION) \
+ do \
+ { \
+ if (glthread_once (&NAME, INITFUNCTION)) \
+ abort (); \
+ } \
+ while (0)
+
+/* ========================================================================= */
+
+#endif /* _LOCK_H */
diff --git a/lib/glthread/threadlib.c b/lib/glthread/threadlib.c
new file mode 100644
index 0000000..501260a
--- /dev/null
+++ b/lib/glthread/threadlib.c
@@ -0,0 +1,108 @@
+/* Multithreading primitives.
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
+
+#include <config.h>
+
+/* ========================================================================= */
+
+#if USE_POSIX_THREADS || USE_ISOC_AND_POSIX_THREADS
+
+/* Use the POSIX threads library. */
+
+# include <errno.h>
+# include <pthread.h>
+# include <stdlib.h>
+
+# if PTHREAD_IN_USE_DETECTION_HARD
+
+# if defined __FreeBSD__ || defined __DragonFly__ /* FreeBSD */
+
+/* Test using pthread_key_create. */
+
+int
+glthread_in_use (void)
+{
+ static int tested;
+ static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+ if (!tested)
+ {
+ pthread_key_t key;
+ int err = pthread_key_create (&key, NULL);
+
+ if (err == ENOSYS)
+ result = 0;
+ else
+ {
+ result = 1;
+ if (err == 0)
+ pthread_key_delete (key);
+ }
+ tested = 1;
+ }
+ return result;
+}
+
+# else /* Solaris, HP-UX */
+
+/* Test using pthread_create. */
+
+/* The function to be executed by a dummy thread. */
+static void *
+dummy_thread_func (void *arg)
+{
+ return arg;
+}
+
+int
+glthread_in_use (void)
+{
+ static int tested;
+ static int result; /* 1: linked with -lpthread, 0: only with libc */
+
+ if (!tested)
+ {
+ pthread_t thread;
+
+ if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
+ /* Thread creation failed. */
+ result = 0;
+ else
+ {
+ /* Thread creation works. */
+ void *retval;
+ if (pthread_join (thread, &retval) != 0)
+ abort ();
+ result = 1;
+ }
+ tested = 1;
+ }
+ return result;
+}
+
+# endif
+
+# endif
+
+#endif
+
+/* ========================================================================= */
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
new file mode 100644
index 0000000..a2a2d6f
--- /dev/null
+++ b/lib/gnulib.mk
@@ -0,0 +1,4548 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+## Process this file with automake to produce Makefile.in.
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+# --lib=libgnu \
+# --source-base=lib \
+# --m4-base=m4 \
+# --po-base=gnulib_po \
+# --doc-base=doc \
+# --tests-base=lib/tests \
+# --aux-dir=build-aux \
+# --makefile-name=gnulib.mk \
+# --no-conditional-dependencies \
+# --no-libtool \
+# --macro-prefix=gl \
+# --po-domain=wget \
+# accept \
+# announce-gen \
+# base32 \
+# bind \
+# c-ctype \
+# c-strcase \
+# c-strcasestr \
+# clock-time \
+# close \
+# connect \
+# crypto/md2 \
+# crypto/md4 \
+# crypto/md5 \
+# crypto/sha1 \
+# crypto/sha256 \
+# crypto/sha512 \
+# dirname \
+# fcntl \
+# flock \
+# fnmatch-gnu \
+# fopen \
+# ftello \
+# futimens \
+# getaddrinfo \
+# getline \
+# getopt-gnu \
+# getpass-gnu \
+# getpeername \
+# getsockname \
+# gettext-h \
+# git-version-gen \
+# gitlog-to-changelog \
+# gnupload \
+# group-member \
+# hostent \
+# iconv \
+# iconv-h \
+# inet_ntop \
+# intprops \
+# inttypes \
+# ioctl \
+# langinfo \
+# libunistring-optional \
+# limits-h \
+# link \
+# listen \
+# maintainer-makefile \
+# mbiter \
+# mbtowc \
+# memrchr \
+# mkdir \
+# mkostemp \
+# mkstemp \
+# nanosleep \
+# open \
+# pipe-posix \
+# posix_spawn \
+# quote \
+# quotearg \
+# recv \
+# regex \
+# select \
+# send \
+# setsockopt \
+# signal-h \
+# sigpipe \
+# sigprocmask \
+# snprintf \
+# socket \
+# spawn-pipe \
+# stat \
+# stdbool \
+# stdint \
+# strcase \
+# strerror_r-posix \
+# strpbrk \
+# strptime \
+# strtok_r \
+# strtol \
+# strtoll \
+# symlink \
+# sys_types \
+# timegm \
+# tmpdir \
+# unicase/u8-tolower \
+# unistr/u8-strlen \
+# unlink \
+# unlocked-io \
+# update-copyright \
+# utime \
+# utime-h \
+# utimens \
+# vasprintf \
+# vsnprintf \
+# warnings \
+# wcwidth \
+# write \
+# xmemdup0 \
+# xstrndup
+
+
+MOSTLYCLEANFILES += core *.stackdump
+# No GNU Make output.
+
+noinst_LIBRARIES += libgnu.a
+
+libgnu_a_SOURCES =
+libgnu_a_LIBADD = $(gl_LIBOBJS)
+libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
+EXTRA_libgnu_a_SOURCES =
+
+AM_CPPFLAGS += -DDEFAULT_TEXT_DOMAIN=\"wget-gnulib\"
+
+## begin gnulib module absolute-header
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || __clang__ || 60000000 <= __DECC_VER)
+
+## end gnulib module absolute-header
+
+## begin gnulib module accept
+
+
+EXTRA_DIST += accept.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += accept.c
+
+## end gnulib module accept
+
+## begin gnulib module access
+
+
+EXTRA_DIST += access.c
+
+EXTRA_libgnu_a_SOURCES += access.c
+
+## end gnulib module access
+
+## begin gnulib module alloca
+
+
+libgnu_a_LIBADD += @ALLOCA@
+libgnu_a_DEPENDENCIES += @ALLOCA@
+EXTRA_DIST += alloca.c
+
+EXTRA_libgnu_a_SOURCES += alloca.c
+
+## end gnulib module alloca
+
+## begin gnulib module alloca-opt
+
+BUILT_SOURCES += $(ALLOCA_H)
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ALLOCA_H
+alloca.h: alloca.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+else
+alloca.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += alloca.h alloca.h-t
+
+EXTRA_DIST += alloca.in.h
+
+## end gnulib module alloca-opt
+
+## begin gnulib module announce-gen
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/announce-gen
+
+## end gnulib module announce-gen
+
+## begin gnulib module arpa_inet
+
+BUILT_SOURCES += arpa/inet.h
+
+# We need the following in order to create <arpa/inet.h> when the system
+# doesn't have one.
+arpa/inet.h: arpa_inet.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) arpa
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_ARPA_INET_H''@|$(NEXT_ARPA_INET_H)|g' \
+ -e 's|@''HAVE_ARPA_INET_H''@|$(HAVE_ARPA_INET_H)|g' \
+ -e 's/@''GNULIB_INET_NTOP''@/$(GNULIB_INET_NTOP)/g' \
+ -e 's/@''GNULIB_INET_PTON''@/$(GNULIB_INET_PTON)/g' \
+ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \
+ -e 's|@''HAVE_DECL_INET_NTOP''@|$(HAVE_DECL_INET_NTOP)|g' \
+ -e 's|@''HAVE_DECL_INET_PTON''@|$(HAVE_DECL_INET_PTON)|g' \
+ -e 's|@''REPLACE_INET_NTOP''@|$(REPLACE_INET_NTOP)|g' \
+ -e 's|@''REPLACE_INET_PTON''@|$(REPLACE_INET_PTON)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/arpa_inet.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += arpa/inet.h arpa/inet.h-t
+MOSTLYCLEANDIRS += arpa
+
+EXTRA_DIST += arpa_inet.in.h
+
+## end gnulib module arpa_inet
+
+## begin gnulib module array-mergesort
+
+
+EXTRA_DIST += array-mergesort.h
+
+## end gnulib module array-mergesort
+
+## begin gnulib module assure
+
+
+EXTRA_DIST += assure.h
+
+## end gnulib module assure
+
+## begin gnulib module at-internal
+
+libgnu_a_SOURCES += openat-priv.h openat-proc.c
+
+## end gnulib module at-internal
+
+## begin gnulib module attribute
+
+
+EXTRA_DIST += attribute.h
+
+## end gnulib module attribute
+
+## begin gnulib module base32
+
+libgnu_a_SOURCES += base32.h base32.c
+
+## end gnulib module base32
+
+## begin gnulib module basename-lgpl
+
+libgnu_a_SOURCES += basename-lgpl.c
+
+EXTRA_DIST += basename-lgpl.h
+
+## end gnulib module basename-lgpl
+
+## begin gnulib module binary-io
+
+libgnu_a_SOURCES += binary-io.h binary-io.c
+
+## end gnulib module binary-io
+
+## begin gnulib module bind
+
+
+EXTRA_DIST += bind.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += bind.c
+
+## end gnulib module bind
+
+## begin gnulib module bitrotate
+
+libgnu_a_SOURCES += bitrotate.h bitrotate.c
+
+## end gnulib module bitrotate
+
+## begin gnulib module btowc
+
+
+EXTRA_DIST += btowc.c
+
+EXTRA_libgnu_a_SOURCES += btowc.c
+
+## end gnulib module btowc
+
+## begin gnulib module byteswap
+
+BUILT_SOURCES += $(BYTESWAP_H)
+
+# We need the following in order to create <byteswap.h> when the system
+# doesn't have one.
+if GL_GENERATE_BYTESWAP_H
+byteswap.h: byteswap.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/byteswap.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+else
+byteswap.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += byteswap.h byteswap.h-t
+
+EXTRA_DIST += byteswap.in.h
+
+## end gnulib module byteswap
+
+## begin gnulib module c-ctype
+
+libgnu_a_SOURCES += c-ctype.h c-ctype.c
+
+## end gnulib module c-ctype
+
+## begin gnulib module c-strcase
+
+libgnu_a_SOURCES += c-strcase.h c-strcasecmp.c c-strncasecmp.c
+
+## end gnulib module c-strcase
+
+## begin gnulib module c-strcaseeq
+
+
+EXTRA_DIST += c-strcaseeq.h
+
+## end gnulib module c-strcaseeq
+
+## begin gnulib module c-strcasestr
+
+libgnu_a_SOURCES += c-strcasestr.h c-strcasestr.c
+
+EXTRA_DIST += str-two-way.h
+
+## end gnulib module c-strcasestr
+
+## begin gnulib module canonicalize
+
+libgnu_a_SOURCES += canonicalize.c
+
+EXTRA_DIST += canonicalize.h
+
+## end gnulib module canonicalize
+
+## begin gnulib module chdir-long
+
+
+EXTRA_DIST += chdir-long.c chdir-long.h
+
+EXTRA_libgnu_a_SOURCES += chdir-long.c
+
+## end gnulib module chdir-long
+
+## begin gnulib module cloexec
+
+libgnu_a_SOURCES += cloexec.c
+
+EXTRA_DIST += cloexec.h
+
+## end gnulib module cloexec
+
+## begin gnulib module close
+
+
+EXTRA_DIST += close.c
+
+EXTRA_libgnu_a_SOURCES += close.c
+
+## end gnulib module close
+
+## begin gnulib module closedir
+
+
+EXTRA_DIST += closedir.c dirent-private.h
+
+EXTRA_libgnu_a_SOURCES += closedir.c
+
+## end gnulib module closedir
+
+## begin gnulib module concat-filename
+
+libgnu_a_SOURCES += concat-filename.c
+
+EXTRA_DIST += concat-filename.h
+
+## end gnulib module concat-filename
+
+## begin gnulib module connect
+
+
+EXTRA_DIST += connect.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += connect.c
+
+## end gnulib module connect
+
+## begin gnulib module crypto/af_alg
+
+libgnu_a_SOURCES += af_alg.c
+
+EXTRA_DIST += af_alg.h sys-limits.h
+
+## end gnulib module crypto/af_alg
+
+## begin gnulib module crypto/md2
+
+libgnu_a_SOURCES += md2.c
+
+EXTRA_DIST += md2.h
+
+## end gnulib module crypto/md2
+
+## begin gnulib module crypto/md4
+
+libgnu_a_SOURCES += md4.c
+
+EXTRA_DIST += md4.h
+
+## end gnulib module crypto/md4
+
+## begin gnulib module crypto/md5-buffer
+
+libgnu_a_SOURCES += md5.c
+
+EXTRA_DIST += gl_openssl.h md5.h
+
+## end gnulib module crypto/md5-buffer
+
+## begin gnulib module crypto/sha1-buffer
+
+libgnu_a_SOURCES += sha1.c
+
+EXTRA_DIST += gl_openssl.h sha1.h
+
+## end gnulib module crypto/sha1-buffer
+
+## begin gnulib module crypto/sha256-buffer
+
+libgnu_a_SOURCES += sha256.c
+
+EXTRA_DIST += gl_openssl.h sha256.h
+
+## end gnulib module crypto/sha256-buffer
+
+## begin gnulib module crypto/sha512-buffer
+
+libgnu_a_SOURCES += sha512.c
+
+EXTRA_DIST += gl_openssl.h sha512.h
+
+## end gnulib module crypto/sha512-buffer
+
+## begin gnulib module ctype
+
+BUILT_SOURCES += ctype.h
+
+# We need the following in order to create <ctype.h> when the system
+# doesn't have one that works with the given compiler.
+ctype.h: ctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_CTYPE_H''@|$(NEXT_CTYPE_H)|g' \
+ -e 's/@''GNULIB_ISBLANK''@/$(GNULIB_ISBLANK)/g' \
+ -e 's/@''HAVE_ISBLANK''@/$(HAVE_ISBLANK)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/ctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += ctype.h ctype.h-t
+
+EXTRA_DIST += ctype.in.h
+
+## end gnulib module ctype
+
+## begin gnulib module dirent
+
+BUILT_SOURCES += dirent.h
+
+# We need the following in order to create <dirent.h> when the system
+# doesn't have one that works with the given compiler.
+dirent.h: dirent.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_DIRENT_H''@|$(HAVE_DIRENT_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_DIRENT_H''@|$(NEXT_DIRENT_H)|g' \
+ -e 's/@''GNULIB_OPENDIR''@/$(GNULIB_OPENDIR)/g' \
+ -e 's/@''GNULIB_READDIR''@/$(GNULIB_READDIR)/g' \
+ -e 's/@''GNULIB_REWINDDIR''@/$(GNULIB_REWINDDIR)/g' \
+ -e 's/@''GNULIB_CLOSEDIR''@/$(GNULIB_CLOSEDIR)/g' \
+ -e 's/@''GNULIB_DIRFD''@/$(GNULIB_DIRFD)/g' \
+ -e 's/@''GNULIB_FDOPENDIR''@/$(GNULIB_FDOPENDIR)/g' \
+ -e 's/@''GNULIB_SCANDIR''@/$(GNULIB_SCANDIR)/g' \
+ -e 's/@''GNULIB_ALPHASORT''@/$(GNULIB_ALPHASORT)/g' \
+ -e 's/@''HAVE_OPENDIR''@/$(HAVE_OPENDIR)/g' \
+ -e 's/@''HAVE_READDIR''@/$(HAVE_READDIR)/g' \
+ -e 's/@''HAVE_REWINDDIR''@/$(HAVE_REWINDDIR)/g' \
+ -e 's/@''HAVE_CLOSEDIR''@/$(HAVE_CLOSEDIR)/g' \
+ -e 's|@''HAVE_DECL_DIRFD''@|$(HAVE_DECL_DIRFD)|g' \
+ -e 's|@''HAVE_DECL_FDOPENDIR''@|$(HAVE_DECL_FDOPENDIR)|g' \
+ -e 's|@''HAVE_FDOPENDIR''@|$(HAVE_FDOPENDIR)|g' \
+ -e 's|@''HAVE_SCANDIR''@|$(HAVE_SCANDIR)|g' \
+ -e 's|@''HAVE_ALPHASORT''@|$(HAVE_ALPHASORT)|g' \
+ -e 's|@''REPLACE_OPENDIR''@|$(REPLACE_OPENDIR)|g' \
+ -e 's|@''REPLACE_CLOSEDIR''@|$(REPLACE_CLOSEDIR)|g' \
+ -e 's|@''REPLACE_DIRFD''@|$(REPLACE_DIRFD)|g' \
+ -e 's|@''REPLACE_FDOPENDIR''@|$(REPLACE_FDOPENDIR)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/dirent.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += dirent.h dirent.h-t
+
+EXTRA_DIST += dirent.in.h
+
+## end gnulib module dirent
+
+## begin gnulib module dirfd
+
+
+EXTRA_DIST += dirfd.c
+
+EXTRA_libgnu_a_SOURCES += dirfd.c
+
+## end gnulib module dirfd
+
+## begin gnulib module dirname
+
+libgnu_a_SOURCES += dirname.c basename.c
+
+EXTRA_DIST += stripslash.c
+
+EXTRA_libgnu_a_SOURCES += stripslash.c
+
+## end gnulib module dirname
+
+## begin gnulib module dirname-lgpl
+
+libgnu_a_SOURCES += dirname-lgpl.c stripslash.c
+
+EXTRA_DIST += dirname.h
+
+## end gnulib module dirname-lgpl
+
+## begin gnulib module dup
+
+
+EXTRA_DIST += dup.c
+
+EXTRA_libgnu_a_SOURCES += dup.c
+
+## end gnulib module dup
+
+## begin gnulib module dup2
+
+
+EXTRA_DIST += dup2.c
+
+EXTRA_libgnu_a_SOURCES += dup2.c
+
+## end gnulib module dup2
+
+## begin gnulib module errno
+
+BUILT_SOURCES += $(ERRNO_H)
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+if GL_GENERATE_ERRNO_H
+errno.h: errno.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+ -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+ -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+ -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+ -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+ -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+ -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+ < $(srcdir)/errno.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+errno.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += errno.h errno.h-t
+
+EXTRA_DIST += errno.in.h
+
+## end gnulib module errno
+
+## begin gnulib module error
+
+
+EXTRA_DIST += error.c error.h
+
+EXTRA_libgnu_a_SOURCES += error.c
+
+## end gnulib module error
+
+## begin gnulib module exitfail
+
+libgnu_a_SOURCES += exitfail.c
+
+EXTRA_DIST += exitfail.h
+
+## end gnulib module exitfail
+
+## begin gnulib module fatal-signal
+
+libgnu_a_SOURCES += fatal-signal.h fatal-signal.c
+
+## end gnulib module fatal-signal
+
+## begin gnulib module fchdir
+
+
+EXTRA_DIST += fchdir.c
+
+EXTRA_libgnu_a_SOURCES += fchdir.c
+
+## end gnulib module fchdir
+
+## begin gnulib module fcntl
+
+
+EXTRA_DIST += fcntl.c
+
+EXTRA_libgnu_a_SOURCES += fcntl.c
+
+## end gnulib module fcntl
+
+## begin gnulib module fcntl-h
+
+BUILT_SOURCES += fcntl.h
+
+# We need the following in order to create <fcntl.h> when the system
+# doesn't have one that works with the given compiler.
+fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
+ -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
+ -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
+ -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
+ -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+ -e 's/@''GNULIB_MDA_CREAT''@/$(GNULIB_MDA_CREAT)/g' \
+ -e 's/@''GNULIB_MDA_OPEN''@/$(GNULIB_MDA_OPEN)/g' \
+ -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
+ -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
+ -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
+ -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
+ -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
+ -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/fcntl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += fcntl.h fcntl.h-t
+
+EXTRA_DIST += fcntl.in.h
+
+## end gnulib module fcntl-h
+
+## begin gnulib module fd-hook
+
+libgnu_a_SOURCES += fd-hook.c
+
+EXTRA_DIST += fd-hook.h
+
+## end gnulib module fd-hook
+
+## begin gnulib module fd-safer-flag
+
+libgnu_a_SOURCES += fd-safer-flag.c dup-safer-flag.c
+
+## end gnulib module fd-safer-flag
+
+## begin gnulib module fdopendir
+
+
+EXTRA_DIST += fdopendir.c
+
+EXTRA_libgnu_a_SOURCES += fdopendir.c
+
+## end gnulib module fdopendir
+
+## begin gnulib module fflush
+
+
+EXTRA_DIST += fflush.c stdio-impl.h
+
+EXTRA_libgnu_a_SOURCES += fflush.c
+
+## end gnulib module fflush
+
+## begin gnulib module file-set
+
+libgnu_a_SOURCES += file-set.c
+
+EXTRA_DIST += file-set.h
+
+## end gnulib module file-set
+
+## begin gnulib module filename
+
+
+EXTRA_DIST += filename.h
+
+## end gnulib module filename
+
+## begin gnulib module filenamecat-lgpl
+
+libgnu_a_SOURCES += filenamecat-lgpl.c
+
+EXTRA_DIST += filenamecat.h
+
+## end gnulib module filenamecat-lgpl
+
+## begin gnulib module findprog-in
+
+libgnu_a_SOURCES += findprog.h findprog-in.c
+
+## end gnulib module findprog-in
+
+## begin gnulib module flexmember
+
+
+EXTRA_DIST += flexmember.h
+
+## end gnulib module flexmember
+
+## begin gnulib module float
+
+BUILT_SOURCES += $(FLOAT_H)
+
+# We need the following in order to create <float.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_FLOAT_H
+float.h: float.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_FLOAT_H''@|$(NEXT_FLOAT_H)|g' \
+ -e 's|@''REPLACE_ITOLD''@|$(REPLACE_ITOLD)|g' \
+ < $(srcdir)/float.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+float.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += float.h float.h-t
+
+EXTRA_DIST += float.c float.in.h itold.c
+
+EXTRA_libgnu_a_SOURCES += float.c itold.c
+
+## end gnulib module float
+
+## begin gnulib module flock
+
+
+EXTRA_DIST += flock.c
+
+EXTRA_libgnu_a_SOURCES += flock.c
+
+## end gnulib module flock
+
+## begin gnulib module fnmatch
+
+
+EXTRA_DIST += fnmatch.c fnmatch_loop.c
+
+EXTRA_libgnu_a_SOURCES += fnmatch.c fnmatch_loop.c
+
+## end gnulib module fnmatch
+
+## begin gnulib module fnmatch-gnu
+
+
+EXTRA_DIST += fnmatch.c
+
+EXTRA_libgnu_a_SOURCES += fnmatch.c
+
+## end gnulib module fnmatch-gnu
+
+## begin gnulib module fnmatch-h
+
+BUILT_SOURCES += $(FNMATCH_H)
+
+# We need the following in order to create <fnmatch.h>.
+if GL_GENERATE_FNMATCH_H
+fnmatch.h: fnmatch.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_FNMATCH_H''@|$(HAVE_FNMATCH_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_FNMATCH_H''@|$(NEXT_FNMATCH_H)|g' \
+ -e 's/@''GNULIB_FNMATCH''@/$(GNULIB_FNMATCH)/g' \
+ -e 's|@''HAVE_FNMATCH''@|$(HAVE_FNMATCH)|g' \
+ -e 's|@''REPLACE_FNMATCH''@|$(REPLACE_FNMATCH)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/fnmatch.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+fnmatch.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t
+
+EXTRA_DIST += fnmatch.in.h
+
+## end gnulib module fnmatch-h
+
+## begin gnulib module fopen
+
+
+EXTRA_DIST += fopen.c
+
+EXTRA_libgnu_a_SOURCES += fopen.c
+
+## end gnulib module fopen
+
+## begin gnulib module fopen-gnu
+
+
+EXTRA_DIST += fopen.c
+
+EXTRA_libgnu_a_SOURCES += fopen.c
+
+## end gnulib module fopen-gnu
+
+## begin gnulib module fpurge
+
+
+EXTRA_DIST += fpurge.c stdio-impl.h
+
+EXTRA_libgnu_a_SOURCES += fpurge.c
+
+## end gnulib module fpurge
+
+## begin gnulib module freading
+
+libgnu_a_SOURCES += freading.c
+
+EXTRA_DIST += freading.h stdio-impl.h
+
+## end gnulib module freading
+
+## begin gnulib module free-posix
+
+
+EXTRA_DIST += free.c
+
+EXTRA_libgnu_a_SOURCES += free.c
+
+## end gnulib module free-posix
+
+## begin gnulib module fseek
+
+
+EXTRA_DIST += fseek.c
+
+EXTRA_libgnu_a_SOURCES += fseek.c
+
+## end gnulib module fseek
+
+## begin gnulib module fseeko
+
+
+EXTRA_DIST += fseeko.c stdio-impl.h
+
+EXTRA_libgnu_a_SOURCES += fseeko.c
+
+## end gnulib module fseeko
+
+## begin gnulib module fstat
+
+
+EXTRA_DIST += fstat.c stat-w32.c stat-w32.h
+
+EXTRA_libgnu_a_SOURCES += fstat.c stat-w32.c
+
+## end gnulib module fstat
+
+## begin gnulib module fstatat
+
+
+EXTRA_DIST += at-func.c fstatat.c
+
+EXTRA_libgnu_a_SOURCES += at-func.c fstatat.c
+
+## end gnulib module fstatat
+
+## begin gnulib module ftell
+
+
+EXTRA_DIST += ftell.c
+
+EXTRA_libgnu_a_SOURCES += ftell.c
+
+## end gnulib module ftell
+
+## begin gnulib module ftello
+
+
+EXTRA_DIST += ftello.c stdio-impl.h
+
+EXTRA_libgnu_a_SOURCES += ftello.c
+
+## end gnulib module ftello
+
+## begin gnulib module futimens
+
+
+EXTRA_DIST += futimens.c
+
+EXTRA_libgnu_a_SOURCES += futimens.c
+
+## end gnulib module futimens
+
+## begin gnulib module getaddrinfo
+
+
+EXTRA_DIST += gai_strerror.c getaddrinfo.c
+
+EXTRA_libgnu_a_SOURCES += gai_strerror.c getaddrinfo.c
+
+## end gnulib module getaddrinfo
+
+## begin gnulib module getcwd
+
+
+EXTRA_DIST += getcwd.c
+
+EXTRA_libgnu_a_SOURCES += getcwd.c
+
+## end gnulib module getcwd
+
+## begin gnulib module getcwd-lgpl
+
+
+EXTRA_DIST += getcwd-lgpl.c
+
+EXTRA_libgnu_a_SOURCES += getcwd-lgpl.c
+
+## end gnulib module getcwd-lgpl
+
+## begin gnulib module getdelim
+
+
+EXTRA_DIST += getdelim.c
+
+EXTRA_libgnu_a_SOURCES += getdelim.c
+
+## end gnulib module getdelim
+
+## begin gnulib module getdtablesize
+
+
+EXTRA_DIST += getdtablesize.c
+
+EXTRA_libgnu_a_SOURCES += getdtablesize.c
+
+## end gnulib module getdtablesize
+
+## begin gnulib module getgroups
+
+
+EXTRA_DIST += getgroups.c
+
+EXTRA_libgnu_a_SOURCES += getgroups.c
+
+## end gnulib module getgroups
+
+## begin gnulib module getline
+
+
+EXTRA_DIST += getline.c
+
+EXTRA_libgnu_a_SOURCES += getline.c
+
+## end gnulib module getline
+
+## begin gnulib module getopt-posix
+
+BUILT_SOURCES += $(GETOPT_H) $(GETOPT_CDEFS_H)
+
+# We need the following in order to create <getopt.h> when the system
+# doesn't have one that works with the given compiler.
+getopt.h: getopt.in.h $(top_builddir)/config.status $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_GETOPT_H''@|$(HAVE_GETOPT_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_GETOPT_H''@|$(NEXT_GETOPT_H)|g' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ < $(srcdir)/getopt.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+getopt-cdefs.h: getopt-cdefs.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \
+ < $(srcdir)/getopt-cdefs.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+
+MOSTLYCLEANFILES += getopt.h getopt.h-t getopt-cdefs.h getopt-cdefs.h-t
+
+EXTRA_DIST += getopt-cdefs.in.h getopt-core.h getopt-ext.h getopt-pfx-core.h getopt-pfx-ext.h getopt.c getopt.in.h getopt1.c getopt_int.h
+
+EXTRA_libgnu_a_SOURCES += getopt.c getopt1.c
+
+## end gnulib module getopt-posix
+
+## begin gnulib module getpass
+
+
+EXTRA_DIST += getpass.c getpass.h
+
+EXTRA_libgnu_a_SOURCES += getpass.c
+
+## end gnulib module getpass
+
+## begin gnulib module getpass-gnu
+
+
+EXTRA_DIST += getpass.c getpass.h
+
+EXTRA_libgnu_a_SOURCES += getpass.c
+
+## end gnulib module getpass-gnu
+
+## begin gnulib module getpeername
+
+
+EXTRA_DIST += getpeername.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += getpeername.c
+
+## end gnulib module getpeername
+
+## begin gnulib module getprogname
+
+libgnu_a_SOURCES += getprogname.h getprogname.c
+
+## end gnulib module getprogname
+
+## begin gnulib module getrandom
+
+
+EXTRA_DIST += getrandom.c
+
+EXTRA_libgnu_a_SOURCES += getrandom.c
+
+## end gnulib module getrandom
+
+## begin gnulib module getsockname
+
+
+EXTRA_DIST += getsockname.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += getsockname.c
+
+## end gnulib module getsockname
+
+## begin gnulib module gettext-h
+
+libgnu_a_SOURCES += gettext.h
+
+## end gnulib module gettext-h
+
+## begin gnulib module gettime
+
+libgnu_a_SOURCES += gettime.c
+
+## end gnulib module gettime
+
+## begin gnulib module gettimeofday
+
+
+EXTRA_DIST += gettimeofday.c
+
+EXTRA_libgnu_a_SOURCES += gettimeofday.c
+
+## end gnulib module gettimeofday
+
+## begin gnulib module git-version-gen
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/git-version-gen
+
+## end gnulib module git-version-gen
+
+## begin gnulib module gitlog-to-changelog
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/gitlog-to-changelog
+
+## end gnulib module gitlog-to-changelog
+
+## begin gnulib module gnumakefile
+
+EXTRA_DIST += $(top_srcdir)/GNUmakefile
+distclean-local: clean-GNUmakefile
+clean-GNUmakefile:
+ test '$(srcdir)' = . || rm -f $(top_builddir)/GNUmakefile
+
+## end gnulib module gnumakefile
+
+## begin gnulib module gnupload
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/gnupload
+
+## end gnulib module gnupload
+
+## begin gnulib module gperf
+
+GPERF = gperf
+V_GPERF = $(V_GPERF_@AM_V@)
+V_GPERF_ = $(V_GPERF_@AM_DEFAULT_V@)
+V_GPERF_0 = @echo " GPERF " $@;
+
+## end gnulib module gperf
+
+## begin gnulib module group-member
+
+
+EXTRA_DIST += group-member.c
+
+EXTRA_libgnu_a_SOURCES += group-member.c
+
+## end gnulib module group-member
+
+## begin gnulib module hard-locale
+
+libgnu_a_SOURCES += hard-locale.c
+
+EXTRA_DIST += hard-locale.h
+
+## end gnulib module hard-locale
+
+## begin gnulib module hash
+
+libgnu_a_SOURCES += hash.c
+
+EXTRA_DIST += hash.h
+
+## end gnulib module hash
+
+## begin gnulib module hash-pjw
+
+libgnu_a_SOURCES += hash-pjw.h hash-pjw.c
+
+## end gnulib module hash-pjw
+
+## begin gnulib module hash-triple-simple
+
+libgnu_a_SOURCES += hash-triple-simple.c
+
+EXTRA_DIST += hash-triple.h
+
+## end gnulib module hash-triple-simple
+
+## begin gnulib module havelib
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/config.rpath
+
+## end gnulib module havelib
+
+## begin gnulib module iconv-h
+
+BUILT_SOURCES += $(ICONV_H)
+
+# We need the following in order to create <iconv.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ICONV_H
+iconv.h: iconv.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_ICONV_H''@|$(NEXT_ICONV_H)|g' \
+ -e 's/@''GNULIB_ICONV''@/$(GNULIB_ICONV)/g' \
+ -e 's|@''ICONV_CONST''@|$(ICONV_CONST)|g' \
+ -e 's|@''REPLACE_ICONV''@|$(REPLACE_ICONV)|g' \
+ -e 's|@''REPLACE_ICONV_OPEN''@|$(REPLACE_ICONV_OPEN)|g' \
+ -e 's|@''REPLACE_ICONV_UTF''@|$(REPLACE_ICONV_UTF)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/iconv.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+iconv.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += iconv.h iconv.h-t
+
+EXTRA_DIST += iconv.in.h
+
+## end gnulib module iconv-h
+
+## begin gnulib module idx
+
+libgnu_a_SOURCES += idx.h
+
+## end gnulib module idx
+
+## begin gnulib module inet_ntop
+
+
+EXTRA_DIST += inet_ntop.c
+
+EXTRA_libgnu_a_SOURCES += inet_ntop.c
+
+## end gnulib module inet_ntop
+
+## begin gnulib module intprops
+
+
+EXTRA_DIST += intprops.h
+
+## end gnulib module intprops
+
+## begin gnulib module inttypes-incomplete
+
+BUILT_SOURCES += inttypes.h
+
+# We need the following in order to create <inttypes.h> when the system
+# doesn't have one that works with the given compiler.
+inttypes.h: inttypes.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_INTTYPES_H''@|$(NEXT_INTTYPES_H)|g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''PRIPTR_PREFIX''@/$(PRIPTR_PREFIX)/g' \
+ -e 's/@''GNULIB_IMAXABS''@/$(GNULIB_IMAXABS)/g' \
+ -e 's/@''GNULIB_IMAXDIV''@/$(GNULIB_IMAXDIV)/g' \
+ -e 's/@''GNULIB_STRTOIMAX''@/$(GNULIB_STRTOIMAX)/g' \
+ -e 's/@''GNULIB_STRTOUMAX''@/$(GNULIB_STRTOUMAX)/g' \
+ -e 's/@''HAVE_DECL_IMAXABS''@/$(HAVE_DECL_IMAXABS)/g' \
+ -e 's/@''HAVE_DECL_IMAXDIV''@/$(HAVE_DECL_IMAXDIV)/g' \
+ -e 's/@''HAVE_DECL_STRTOIMAX''@/$(HAVE_DECL_STRTOIMAX)/g' \
+ -e 's/@''HAVE_DECL_STRTOUMAX''@/$(HAVE_DECL_STRTOUMAX)/g' \
+ -e 's/@''HAVE_IMAXDIV_T''@/$(HAVE_IMAXDIV_T)/g' \
+ -e 's/@''REPLACE_STRTOIMAX''@/$(REPLACE_STRTOIMAX)/g' \
+ -e 's/@''REPLACE_STRTOUMAX''@/$(REPLACE_STRTOUMAX)/g' \
+ -e 's/@''INT32_MAX_LT_INTMAX_MAX''@/$(INT32_MAX_LT_INTMAX_MAX)/g' \
+ -e 's/@''INT64_MAX_EQ_LONG_MAX''@/$(INT64_MAX_EQ_LONG_MAX)/g' \
+ -e 's/@''UINT32_MAX_LT_UINTMAX_MAX''@/$(UINT32_MAX_LT_UINTMAX_MAX)/g' \
+ -e 's/@''UINT64_MAX_EQ_ULONG_MAX''@/$(UINT64_MAX_EQ_ULONG_MAX)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/inttypes.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += inttypes.h inttypes.h-t
+
+EXTRA_DIST += inttypes.in.h
+
+## end gnulib module inttypes-incomplete
+
+## begin gnulib module ioctl
+
+
+EXTRA_DIST += ioctl.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += ioctl.c
+
+## end gnulib module ioctl
+
+## begin gnulib module isblank
+
+
+EXTRA_DIST += isblank.c
+
+EXTRA_libgnu_a_SOURCES += isblank.c
+
+## end gnulib module isblank
+
+## begin gnulib module iswblank
+
+
+EXTRA_DIST += iswblank.c
+
+EXTRA_libgnu_a_SOURCES += iswblank.c
+
+## end gnulib module iswblank
+
+## begin gnulib module iswdigit
+
+
+EXTRA_DIST += iswdigit.c
+
+EXTRA_libgnu_a_SOURCES += iswdigit.c
+
+## end gnulib module iswdigit
+
+## begin gnulib module iswxdigit
+
+
+EXTRA_DIST += iswxdigit.c
+
+EXTRA_libgnu_a_SOURCES += iswxdigit.c
+
+## end gnulib module iswxdigit
+
+## begin gnulib module langinfo
+
+BUILT_SOURCES += langinfo.h
+
+# We need the following in order to create an empty placeholder for
+# <langinfo.h> when the system doesn't have one.
+langinfo.h: langinfo.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_LANGINFO_H''@|$(HAVE_LANGINFO_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LANGINFO_H''@|$(NEXT_LANGINFO_H)|g' \
+ -e 's/@''GNULIB_NL_LANGINFO''@/$(GNULIB_NL_LANGINFO)/g' \
+ -e 's|@''HAVE_LANGINFO_CODESET''@|$(HAVE_LANGINFO_CODESET)|g' \
+ -e 's|@''HAVE_LANGINFO_T_FMT_AMPM''@|$(HAVE_LANGINFO_T_FMT_AMPM)|g' \
+ -e 's|@''HAVE_LANGINFO_ALTMON''@|$(HAVE_LANGINFO_ALTMON)|g' \
+ -e 's|@''HAVE_LANGINFO_ERA''@|$(HAVE_LANGINFO_ERA)|g' \
+ -e 's|@''HAVE_LANGINFO_YESEXPR''@|$(HAVE_LANGINFO_YESEXPR)|g' \
+ -e 's|@''HAVE_NL_LANGINFO''@|$(HAVE_NL_LANGINFO)|g' \
+ -e 's|@''REPLACE_NL_LANGINFO''@|$(REPLACE_NL_LANGINFO)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/langinfo.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += langinfo.h langinfo.h-t
+
+EXTRA_DIST += langinfo.in.h
+
+## end gnulib module langinfo
+
+## begin gnulib module libc-config
+
+
+EXTRA_DIST += cdefs.h libc-config.h
+
+## end gnulib module libc-config
+
+## begin gnulib module libunistring-optional
+
+
+EXTRA_DIST += libunistring.valgrind
+
+## end gnulib module libunistring-optional
+
+## begin gnulib module limits-h
+
+BUILT_SOURCES += $(LIMITS_H)
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+if GL_GENERATE_LIMITS_H
+limits.h: limits.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+ < $(srcdir)/limits.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+limits.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += limits.h limits.h-t
+
+EXTRA_DIST += limits.in.h
+
+## end gnulib module limits-h
+
+## begin gnulib module link
+
+
+EXTRA_DIST += link.c
+
+EXTRA_libgnu_a_SOURCES += link.c
+
+## end gnulib module link
+
+## begin gnulib module listen
+
+
+EXTRA_DIST += listen.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += listen.c
+
+## end gnulib module listen
+
+## begin gnulib module localcharset
+
+libgnu_a_SOURCES += localcharset.c
+
+EXTRA_DIST += localcharset.h
+
+## end gnulib module localcharset
+
+## begin gnulib module locale
+
+BUILT_SOURCES += locale.h
+
+# We need the following in order to create <locale.h> when the system
+# doesn't have one that provides all definitions.
+locale.h: locale.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_LOCALE_H''@|$(NEXT_LOCALE_H)|g' \
+ -e 's/@''GNULIB_LOCALECONV''@/$(GNULIB_LOCALECONV)/g' \
+ -e 's/@''GNULIB_SETLOCALE''@/$(GNULIB_SETLOCALE)/g' \
+ -e 's/@''GNULIB_SETLOCALE_NULL''@/$(GNULIB_SETLOCALE_NULL)/g' \
+ -e 's/@''GNULIB_DUPLOCALE''@/$(GNULIB_DUPLOCALE)/g' \
+ -e 's/@''GNULIB_LOCALENAME''@/$(GNULIB_LOCALENAME)/g' \
+ -e 's|@''HAVE_NEWLOCALE''@|$(HAVE_NEWLOCALE)|g' \
+ -e 's|@''HAVE_DUPLOCALE''@|$(HAVE_DUPLOCALE)|g' \
+ -e 's|@''HAVE_FREELOCALE''@|$(HAVE_FREELOCALE)|g' \
+ -e 's|@''HAVE_XLOCALE_H''@|$(HAVE_XLOCALE_H)|g' \
+ -e 's|@''REPLACE_LOCALECONV''@|$(REPLACE_LOCALECONV)|g' \
+ -e 's|@''REPLACE_SETLOCALE''@|$(REPLACE_SETLOCALE)|g' \
+ -e 's|@''REPLACE_NEWLOCALE''@|$(REPLACE_NEWLOCALE)|g' \
+ -e 's|@''REPLACE_DUPLOCALE''@|$(REPLACE_DUPLOCALE)|g' \
+ -e 's|@''REPLACE_FREELOCALE''@|$(REPLACE_FREELOCALE)|g' \
+ -e 's|@''REPLACE_STRUCT_LCONV''@|$(REPLACE_STRUCT_LCONV)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/locale.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += locale.h locale.h-t
+
+EXTRA_DIST += locale.in.h
+
+## end gnulib module locale
+
+## begin gnulib module localeconv
+
+
+EXTRA_DIST += localeconv.c
+
+EXTRA_libgnu_a_SOURCES += localeconv.c
+
+## end gnulib module localeconv
+
+## begin gnulib module lock
+
+libgnu_a_SOURCES += glthread/lock.h glthread/lock.c
+
+## end gnulib module lock
+
+## begin gnulib module lseek
+
+
+EXTRA_DIST += lseek.c
+
+EXTRA_libgnu_a_SOURCES += lseek.c
+
+## end gnulib module lseek
+
+## begin gnulib module lstat
+
+
+EXTRA_DIST += lstat.c
+
+EXTRA_libgnu_a_SOURCES += lstat.c
+
+## end gnulib module lstat
+
+## begin gnulib module maintainer-makefile
+
+EXTRA_DIST += $(top_srcdir)/maint.mk
+
+## end gnulib module maintainer-makefile
+
+## begin gnulib module malloc-posix
+
+
+EXTRA_DIST += malloc.c
+
+EXTRA_libgnu_a_SOURCES += malloc.c
+
+## end gnulib module malloc-posix
+
+## begin gnulib module malloca
+
+libgnu_a_SOURCES += malloca.c
+
+EXTRA_DIST += malloca.h
+
+## end gnulib module malloca
+
+## begin gnulib module mbchar
+
+libgnu_a_SOURCES += mbchar.c
+
+EXTRA_DIST += mbchar.h
+
+## end gnulib module mbchar
+
+## begin gnulib module mbiter
+
+libgnu_a_SOURCES += mbiter.h mbiter.c
+
+## end gnulib module mbiter
+
+## begin gnulib module mbrtowc
+
+
+EXTRA_DIST += lc-charset-dispatch.c lc-charset-dispatch.h mbrtowc-impl-utf8.h mbrtowc-impl.h mbrtowc.c mbtowc-lock.c mbtowc-lock.h windows-initguard.h
+
+EXTRA_libgnu_a_SOURCES += lc-charset-dispatch.c mbrtowc.c mbtowc-lock.c
+
+## end gnulib module mbrtowc
+
+## begin gnulib module mbsinit
+
+
+EXTRA_DIST += mbsinit.c
+
+EXTRA_libgnu_a_SOURCES += mbsinit.c
+
+## end gnulib module mbsinit
+
+## begin gnulib module mbsrtowcs
+
+
+EXTRA_DIST += mbsrtowcs-impl.h mbsrtowcs-state.c mbsrtowcs.c
+
+EXTRA_libgnu_a_SOURCES += mbsrtowcs-state.c mbsrtowcs.c
+
+## end gnulib module mbsrtowcs
+
+## begin gnulib module mbtowc
+
+
+EXTRA_DIST += mbtowc-impl.h mbtowc.c
+
+EXTRA_libgnu_a_SOURCES += mbtowc.c
+
+## end gnulib module mbtowc
+
+## begin gnulib module memchr
+
+
+EXTRA_DIST += memchr.c memchr.valgrind
+
+EXTRA_libgnu_a_SOURCES += memchr.c
+
+## end gnulib module memchr
+
+## begin gnulib module mempcpy
+
+
+EXTRA_DIST += mempcpy.c
+
+EXTRA_libgnu_a_SOURCES += mempcpy.c
+
+## end gnulib module mempcpy
+
+## begin gnulib module memrchr
+
+
+EXTRA_DIST += memrchr.c
+
+EXTRA_libgnu_a_SOURCES += memrchr.c
+
+## end gnulib module memrchr
+
+## begin gnulib module minmax
+
+libgnu_a_SOURCES += minmax.h
+
+## end gnulib module minmax
+
+## begin gnulib module mkdir
+
+
+EXTRA_DIST += mkdir.c
+
+EXTRA_libgnu_a_SOURCES += mkdir.c
+
+## end gnulib module mkdir
+
+## begin gnulib module mkostemp
+
+
+EXTRA_DIST += mkostemp.c
+
+EXTRA_libgnu_a_SOURCES += mkostemp.c
+
+## end gnulib module mkostemp
+
+## begin gnulib module mkstemp
+
+
+EXTRA_DIST += mkstemp.c
+
+EXTRA_libgnu_a_SOURCES += mkstemp.c
+
+## end gnulib module mkstemp
+
+## begin gnulib module mktime
+
+
+EXTRA_DIST += mktime-internal.h mktime.c
+
+EXTRA_libgnu_a_SOURCES += mktime.c
+
+## end gnulib module mktime
+
+## begin gnulib module mktime-internal
+
+
+EXTRA_DIST += mktime-internal.h mktime.c
+
+EXTRA_libgnu_a_SOURCES += mktime.c
+
+## end gnulib module mktime-internal
+
+## begin gnulib module msvc-inval
+
+
+EXTRA_DIST += msvc-inval.c msvc-inval.h
+
+EXTRA_libgnu_a_SOURCES += msvc-inval.c
+
+## end gnulib module msvc-inval
+
+## begin gnulib module msvc-nothrow
+
+
+EXTRA_DIST += msvc-nothrow.c msvc-nothrow.h
+
+EXTRA_libgnu_a_SOURCES += msvc-nothrow.c
+
+## end gnulib module msvc-nothrow
+
+## begin gnulib module nanosleep
+
+
+EXTRA_DIST += nanosleep.c
+
+EXTRA_libgnu_a_SOURCES += nanosleep.c
+
+## end gnulib module nanosleep
+
+## begin gnulib module netdb
+
+BUILT_SOURCES += netdb.h
+
+# We need the following in order to create <netdb.h> when the system
+# doesn't have one that works with the given compiler.
+netdb.h: netdb.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_NETDB_H''@|$(NEXT_NETDB_H)|g' \
+ -e 's|@''HAVE_NETDB_H''@|$(HAVE_NETDB_H)|g' \
+ -e 's/@''GNULIB_GETADDRINFO''@/$(GNULIB_GETADDRINFO)/g' \
+ -e 's|@''HAVE_STRUCT_ADDRINFO''@|$(HAVE_STRUCT_ADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_FREEADDRINFO''@|$(HAVE_DECL_FREEADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GAI_STRERROR''@|$(HAVE_DECL_GAI_STRERROR)|g' \
+ -e 's|@''HAVE_DECL_GETADDRINFO''@|$(HAVE_DECL_GETADDRINFO)|g' \
+ -e 's|@''HAVE_DECL_GETNAMEINFO''@|$(HAVE_DECL_GETNAMEINFO)|g' \
+ -e 's|@''REPLACE_GAI_STRERROR''@|$(REPLACE_GAI_STRERROR)|g' \
+ -e 's|@''REPLACE_GETADDRINFO''@|$(REPLACE_GETADDRINFO)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/netdb.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += netdb.h netdb.h-t
+
+EXTRA_DIST += netdb.in.h
+
+## end gnulib module netdb
+
+## begin gnulib module netinet_in
+
+BUILT_SOURCES += $(NETINET_IN_H)
+
+# We need the following in order to create <netinet/in.h> when the system
+# doesn't have one.
+if GL_GENERATE_NETINET_IN_H
+netinet/in.h: netinet_in.in.h $(top_builddir)/config.status
+ $(AM_V_at)$(MKDIR_P) netinet
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_NETINET_IN_H''@|$(NEXT_NETINET_IN_H)|g' \
+ -e 's|@''HAVE_NETINET_IN_H''@|$(HAVE_NETINET_IN_H)|g' \
+ < $(srcdir)/netinet_in.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+netinet/in.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += netinet/in.h netinet/in.h-t
+MOSTLYCLEANDIRS += netinet
+
+EXTRA_DIST += netinet_in.in.h
+
+## end gnulib module netinet_in
+
+## begin gnulib module nl_langinfo
+
+
+EXTRA_DIST += nl_langinfo-lock.c nl_langinfo.c windows-initguard.h
+
+EXTRA_libgnu_a_SOURCES += nl_langinfo-lock.c nl_langinfo.c
+
+## end gnulib module nl_langinfo
+
+## begin gnulib module open
+
+
+EXTRA_DIST += open.c
+
+EXTRA_libgnu_a_SOURCES += open.c
+
+## end gnulib module open
+
+## begin gnulib module openat
+
+
+EXTRA_DIST += openat.c
+
+EXTRA_libgnu_a_SOURCES += openat.c
+
+## end gnulib module openat
+
+## begin gnulib module openat-die
+
+libgnu_a_SOURCES += openat-die.c
+
+## end gnulib module openat-die
+
+## begin gnulib module openat-h
+
+
+EXTRA_DIST += openat.h
+
+## end gnulib module openat-h
+
+## begin gnulib module opendir
+
+
+EXTRA_DIST += dirent-private.h opendir.c
+
+EXTRA_libgnu_a_SOURCES += opendir.c
+
+## end gnulib module opendir
+
+## begin gnulib module pathmax
+
+
+EXTRA_DIST += pathmax.h
+
+## end gnulib module pathmax
+
+## begin gnulib module pipe-posix
+
+
+EXTRA_DIST += pipe.c
+
+EXTRA_libgnu_a_SOURCES += pipe.c
+
+## end gnulib module pipe-posix
+
+## begin gnulib module pipe2
+
+libgnu_a_SOURCES += pipe2.c
+
+## end gnulib module pipe2
+
+## begin gnulib module pipe2-safer
+
+libgnu_a_SOURCES += pipe2-safer.c
+
+## end gnulib module pipe2-safer
+
+## begin gnulib module posix_spawn
+
+
+EXTRA_DIST += spawn.c
+
+EXTRA_libgnu_a_SOURCES += spawn.c
+
+## end gnulib module posix_spawn
+
+## begin gnulib module posix_spawn-internal
+
+
+EXTRA_DIST += spawn_int.h spawni.c
+
+EXTRA_libgnu_a_SOURCES += spawni.c
+
+## end gnulib module posix_spawn-internal
+
+## begin gnulib module posix_spawn_file_actions_addchdir
+
+
+EXTRA_DIST += spawn_faction_addchdir.c spawn_int.h
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_addchdir.c
+
+## end gnulib module posix_spawn_file_actions_addchdir
+
+## begin gnulib module posix_spawn_file_actions_addclose
+
+
+EXTRA_DIST += spawn_faction_addclose.c spawn_int.h
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_addclose.c
+
+## end gnulib module posix_spawn_file_actions_addclose
+
+## begin gnulib module posix_spawn_file_actions_adddup2
+
+
+EXTRA_DIST += spawn_faction_adddup2.c spawn_int.h
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_adddup2.c
+
+## end gnulib module posix_spawn_file_actions_adddup2
+
+## begin gnulib module posix_spawn_file_actions_addopen
+
+
+EXTRA_DIST += spawn_faction_addopen.c spawn_int.h
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_addopen.c
+
+## end gnulib module posix_spawn_file_actions_addopen
+
+## begin gnulib module posix_spawn_file_actions_destroy
+
+
+EXTRA_DIST += spawn_faction_destroy.c
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_destroy.c
+
+## end gnulib module posix_spawn_file_actions_destroy
+
+## begin gnulib module posix_spawn_file_actions_init
+
+
+EXTRA_DIST += spawn_faction_init.c spawn_int.h
+
+EXTRA_libgnu_a_SOURCES += spawn_faction_init.c
+
+## end gnulib module posix_spawn_file_actions_init
+
+## begin gnulib module posix_spawnattr_destroy
+
+
+EXTRA_DIST += spawnattr_destroy.c
+
+EXTRA_libgnu_a_SOURCES += spawnattr_destroy.c
+
+## end gnulib module posix_spawnattr_destroy
+
+## begin gnulib module posix_spawnattr_init
+
+
+EXTRA_DIST += spawnattr_init.c
+
+EXTRA_libgnu_a_SOURCES += spawnattr_init.c
+
+## end gnulib module posix_spawnattr_init
+
+## begin gnulib module posix_spawnattr_setflags
+
+
+EXTRA_DIST += spawnattr_setflags.c
+
+EXTRA_libgnu_a_SOURCES += spawnattr_setflags.c
+
+## end gnulib module posix_spawnattr_setflags
+
+## begin gnulib module posix_spawnattr_setpgroup
+
+
+EXTRA_DIST += spawnattr_setpgroup.c
+
+EXTRA_libgnu_a_SOURCES += spawnattr_setpgroup.c
+
+## end gnulib module posix_spawnattr_setpgroup
+
+## begin gnulib module posix_spawnattr_setsigmask
+
+
+EXTRA_DIST += spawnattr_setsigmask.c
+
+EXTRA_libgnu_a_SOURCES += spawnattr_setsigmask.c
+
+## end gnulib module posix_spawnattr_setsigmask
+
+## begin gnulib module posix_spawnp
+
+
+EXTRA_DIST += spawnp.c
+
+EXTRA_libgnu_a_SOURCES += spawnp.c
+
+## end gnulib module posix_spawnp
+
+## begin gnulib module quote
+
+
+EXTRA_DIST += quote.h
+
+## end gnulib module quote
+
+## begin gnulib module quotearg
+
+libgnu_a_SOURCES += quotearg.c
+
+EXTRA_DIST += quote.h quotearg.h
+
+## end gnulib module quotearg
+
+## begin gnulib module raise
+
+
+EXTRA_DIST += raise.c
+
+EXTRA_libgnu_a_SOURCES += raise.c
+
+## end gnulib module raise
+
+## begin gnulib module rawmemchr
+
+
+EXTRA_DIST += rawmemchr.c rawmemchr.valgrind
+
+EXTRA_libgnu_a_SOURCES += rawmemchr.c
+
+## end gnulib module rawmemchr
+
+## begin gnulib module readdir
+
+
+EXTRA_DIST += dirent-private.h readdir.c
+
+EXTRA_libgnu_a_SOURCES += readdir.c
+
+## end gnulib module readdir
+
+## begin gnulib module readlink
+
+
+EXTRA_DIST += readlink.c
+
+EXTRA_libgnu_a_SOURCES += readlink.c
+
+## end gnulib module readlink
+
+## begin gnulib module realloc-posix
+
+
+EXTRA_DIST += realloc.c
+
+EXTRA_libgnu_a_SOURCES += realloc.c
+
+## end gnulib module realloc-posix
+
+## begin gnulib module recv
+
+
+EXTRA_DIST += recv.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += recv.c
+
+## end gnulib module recv
+
+## begin gnulib module regex
+
+
+EXTRA_DIST += regcomp.c regex.c regex.h regex_internal.c regex_internal.h regexec.c
+
+EXTRA_libgnu_a_SOURCES += regcomp.c regex.c regex_internal.c regexec.c
+
+## end gnulib module regex
+
+## begin gnulib module rewinddir
+
+
+EXTRA_DIST += dirent-private.h rewinddir.c
+
+EXTRA_libgnu_a_SOURCES += rewinddir.c
+
+## end gnulib module rewinddir
+
+## begin gnulib module same-inode
+
+
+EXTRA_DIST += same-inode.h
+
+## end gnulib module same-inode
+
+## begin gnulib module save-cwd
+
+libgnu_a_SOURCES += save-cwd.c
+
+EXTRA_DIST += save-cwd.h
+
+## end gnulib module save-cwd
+
+## begin gnulib module sched
+
+BUILT_SOURCES += sched.h
+
+# We need the following in order to create a replacement for <sched.h> when
+# the system doesn't have one.
+sched.h: sched.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SCHED_H''@|$(HAVE_SCHED_H)|g' \
+ -e 's|@''HAVE_SYS_CDEFS_H''@|$(HAVE_SYS_CDEFS_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SCHED_H''@|$(NEXT_SCHED_H)|g' \
+ -e 's|@''HAVE_STRUCT_SCHED_PARAM''@|$(HAVE_STRUCT_SCHED_PARAM)|g' \
+ -e 's/@''GNULIB_SCHED_YIELD''@/$(GNULIB_SCHED_YIELD)/g' \
+ -e 's|@''HAVE_SCHED_YIELD''@|$(HAVE_SCHED_YIELD)|g' \
+ -e 's|@''REPLACE_SCHED_YIELD''@|$(REPLACE_SCHED_YIELD)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sched.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sched.h sched.h-t
+
+EXTRA_DIST += sched.in.h
+
+## end gnulib module sched
+
+## begin gnulib module scratch_buffer
+
+libgnu_a_SOURCES += malloc/scratch_buffer_dupfree.c malloc/scratch_buffer_grow.c malloc/scratch_buffer_grow_preserve.c malloc/scratch_buffer_set_array_size.c
+
+EXTRA_DIST += malloc/scratch_buffer.h scratch_buffer.h
+
+## end gnulib module scratch_buffer
+
+## begin gnulib module secure_getenv
+
+
+EXTRA_DIST += secure_getenv.c
+
+EXTRA_libgnu_a_SOURCES += secure_getenv.c
+
+## end gnulib module secure_getenv
+
+## begin gnulib module select
+
+
+EXTRA_DIST += select.c
+
+EXTRA_libgnu_a_SOURCES += select.c
+
+## end gnulib module select
+
+## begin gnulib module send
+
+
+EXTRA_DIST += send.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += send.c
+
+## end gnulib module send
+
+## begin gnulib module setlocale-null
+
+libgnu_a_SOURCES += setlocale_null.c
+
+EXTRA_DIST += setlocale-lock.c setlocale_null.h windows-initguard.h
+
+EXTRA_libgnu_a_SOURCES += setlocale-lock.c
+
+## end gnulib module setlocale-null
+
+## begin gnulib module setsockopt
+
+
+EXTRA_DIST += setsockopt.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += setsockopt.c
+
+## end gnulib module setsockopt
+
+## begin gnulib module sigaction
+
+libgnu_a_SOURCES += sig-handler.c
+
+EXTRA_DIST += sig-handler.h sigaction.c
+
+EXTRA_libgnu_a_SOURCES += sigaction.c
+
+## end gnulib module sigaction
+
+## begin gnulib module signal-h
+
+BUILT_SOURCES += signal.h
+
+# We need the following in order to create <signal.h> when the system
+# doesn't have a complete one.
+signal.h: signal.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SIGNAL_H''@|$(NEXT_SIGNAL_H)|g' \
+ -e 's/@''GNULIB_PTHREAD_SIGMASK''@/$(GNULIB_PTHREAD_SIGMASK)/g' \
+ -e 's/@''GNULIB_RAISE''@/$(GNULIB_RAISE)/g' \
+ -e 's/@''GNULIB_SIGNAL_H_SIGPIPE''@/$(GNULIB_SIGNAL_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_SIGPROCMASK''@/$(GNULIB_SIGPROCMASK)/g' \
+ -e 's/@''GNULIB_SIGACTION''@/$(GNULIB_SIGACTION)/g' \
+ -e 's|@''HAVE_POSIX_SIGNALBLOCKING''@|$(HAVE_POSIX_SIGNALBLOCKING)|g' \
+ -e 's|@''HAVE_PTHREAD_SIGMASK''@|$(HAVE_PTHREAD_SIGMASK)|g' \
+ -e 's|@''HAVE_RAISE''@|$(HAVE_RAISE)|g' \
+ -e 's|@''HAVE_SIGSET_T''@|$(HAVE_SIGSET_T)|g' \
+ -e 's|@''HAVE_SIGINFO_T''@|$(HAVE_SIGINFO_T)|g' \
+ -e 's|@''HAVE_SIGACTION''@|$(HAVE_SIGACTION)|g' \
+ -e 's|@''HAVE_STRUCT_SIGACTION_SA_SIGACTION''@|$(HAVE_STRUCT_SIGACTION_SA_SIGACTION)|g' \
+ -e 's|@''HAVE_TYPE_VOLATILE_SIG_ATOMIC_T''@|$(HAVE_TYPE_VOLATILE_SIG_ATOMIC_T)|g' \
+ -e 's|@''HAVE_SIGHANDLER_T''@|$(HAVE_SIGHANDLER_T)|g' \
+ -e 's|@''REPLACE_PTHREAD_SIGMASK''@|$(REPLACE_PTHREAD_SIGMASK)|g' \
+ -e 's|@''REPLACE_RAISE''@|$(REPLACE_RAISE)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/signal.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += signal.h signal.h-t
+
+EXTRA_DIST += signal.in.h
+
+## end gnulib module signal-h
+
+## begin gnulib module sigpipe
+
+
+EXTRA_DIST += stdio-write.c
+
+EXTRA_libgnu_a_SOURCES += stdio-write.c
+
+## end gnulib module sigpipe
+
+## begin gnulib module sigprocmask
+
+
+EXTRA_DIST += sigprocmask.c
+
+EXTRA_libgnu_a_SOURCES += sigprocmask.c
+
+## end gnulib module sigprocmask
+
+## begin gnulib module size_max
+
+libgnu_a_SOURCES += size_max.h
+
+## end gnulib module size_max
+
+## begin gnulib module snippet/_Noreturn
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+_NORETURN_H=$(srcdir)/_Noreturn.h
+
+EXTRA_DIST += _Noreturn.h
+
+## end gnulib module snippet/_Noreturn
+
+## begin gnulib module snippet/arg-nonnull
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+ARG_NONNULL_H=$(srcdir)/arg-nonnull.h
+
+EXTRA_DIST += arg-nonnull.h
+
+## end gnulib module snippet/arg-nonnull
+
+## begin gnulib module snippet/c++defs
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+CXXDEFS_H=$(srcdir)/c++defs.h
+
+EXTRA_DIST += c++defs.h
+
+## end gnulib module snippet/c++defs
+
+## begin gnulib module snippet/unused-parameter
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+UNUSED_PARAMETER_H=$(srcdir)/unused-parameter.h
+
+EXTRA_DIST += unused-parameter.h
+
+## end gnulib module snippet/unused-parameter
+
+## begin gnulib module snippet/warn-on-use
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+WARN_ON_USE_H=$(srcdir)/warn-on-use.h
+
+EXTRA_DIST += warn-on-use.h
+
+## end gnulib module snippet/warn-on-use
+
+## begin gnulib module snprintf
+
+
+EXTRA_DIST += snprintf.c
+
+EXTRA_libgnu_a_SOURCES += snprintf.c
+
+## end gnulib module snprintf
+
+## begin gnulib module socket
+
+
+EXTRA_DIST += socket.c w32sock.h
+
+EXTRA_libgnu_a_SOURCES += socket.c
+
+## end gnulib module socket
+
+## begin gnulib module sockets
+
+libgnu_a_SOURCES += sockets.h sockets.c
+
+EXTRA_DIST += w32sock.h
+
+## end gnulib module sockets
+
+## begin gnulib module spawn
+
+BUILT_SOURCES += spawn.h
+
+# We need the following in order to create a replacement for <spawn.h> when
+# the system doesn't have one.
+spawn.h: spawn.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SPAWN_H''@|$(HAVE_SPAWN_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SPAWN_H''@|$(NEXT_SPAWN_H)|g' \
+ -e 's/@''GNULIB_POSIX_SPAWN''@/$(GNULIB_POSIX_SPAWN)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNP''@/$(GNULIB_POSIX_SPAWNP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY''@/$(GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_INIT''@/$(GNULIB_POSIX_SPAWNATTR_INIT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_GETFLAGS)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETFLAGS''@/$(GNULIB_POSIX_SPAWNATTR_SETFLAGS)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_GETPGROUP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETPGROUP''@/$(GNULIB_POSIX_SPAWNATTR_SETPGROUP)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY''@/$(GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_GETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_GETSIGMASK)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_SETSIGMASK''@/$(GNULIB_POSIX_SPAWNATTR_SETSIGMASK)/g' \
+ -e 's/@''GNULIB_POSIX_SPAWNATTR_DESTROY''@/$(GNULIB_POSIX_SPAWNATTR_DESTROY)/g' \
+ -e 's|@''HAVE_POSIX_SPAWN''@|$(HAVE_POSIX_SPAWN)|g' \
+ -e 's|@''HAVE_POSIX_SPAWNATTR_T''@|$(HAVE_POSIX_SPAWNATTR_T)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_T''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_T)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)|g' \
+ -e 's|@''HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@|$(HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN''@|$(REPLACE_POSIX_SPAWN)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR)|g' \
+ -e 's|@''REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN''@|$(REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/spawn.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += spawn.h spawn.h-t
+
+EXTRA_DIST += spawn.in.h
+
+## end gnulib module spawn
+
+## begin gnulib module spawn-pipe
+
+libgnu_a_SOURCES += spawn-pipe.h spawn-pipe.c
+
+EXTRA_DIST += os2-spawn.c os2-spawn.h
+
+EXTRA_libgnu_a_SOURCES += os2-spawn.c
+
+## end gnulib module spawn-pipe
+
+## begin gnulib module stat
+
+
+EXTRA_DIST += stat-w32.c stat-w32.h stat.c
+
+EXTRA_libgnu_a_SOURCES += stat-w32.c stat.c
+
+## end gnulib module stat
+
+## begin gnulib module stat-time
+
+libgnu_a_SOURCES += stat-time.c
+
+EXTRA_DIST += stat-time.h
+
+## end gnulib module stat-time
+
+## begin gnulib module stdalign
+
+BUILT_SOURCES += $(STDALIGN_H)
+
+# We need the following in order to create <stdalign.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDALIGN_H
+stdalign.h: stdalign.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/stdalign.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+stdalign.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += stdalign.h stdalign.h-t
+
+EXTRA_DIST += stdalign.in.h
+
+## end gnulib module stdalign
+
+## begin gnulib module stdbool
+
+BUILT_SOURCES += $(STDBOOL_H)
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDBOOL_H
+stdbool.h: stdbool.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+stdbool.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += stdbool.h stdbool.h-t
+
+EXTRA_DIST += stdbool.in.h
+
+## end gnulib module stdbool
+
+## begin gnulib module stddef
+
+BUILT_SOURCES += $(STDDEF_H)
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDDEF_H
+stddef.h: stddef.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+ -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+ -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+ -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+ < $(srcdir)/stddef.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+stddef.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += stddef.h stddef.h-t
+
+EXTRA_DIST += stddef.in.h
+
+## end gnulib module stddef
+
+## begin gnulib module stdint
+
+BUILT_SOURCES += $(STDINT_H)
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDINT_H
+stdint.h: stdint.in.h $(top_builddir)/config.status
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+ -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+ -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+ -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+ -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+ -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+ -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+ -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+ -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+ -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+ -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+ -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+ -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+ -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+ -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+ -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+ -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+ < $(srcdir)/stdint.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+else
+stdint.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += stdint.h stdint.h-t
+
+EXTRA_DIST += stdint.in.h
+
+## end gnulib module stdint
+
+## begin gnulib module stdio
+
+BUILT_SOURCES += stdio.h
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+ -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
+ -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
+ -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
+ -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
+ -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
+ -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
+ -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
+ -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
+ -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
+ -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
+ -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
+ -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
+ -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
+ -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
+ -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
+ -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
+ -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
+ -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
+ -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
+ -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
+ -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
+ -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
+ -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
+ -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
+ -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
+ -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
+ -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
+ -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
+ -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
+ -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
+ -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
+ -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
+ -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
+ -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
+ -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
+ -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
+ -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
+ -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
+ -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
+ -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
+ -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
+ -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
+ -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+ -e 's/@''GNULIB_MDA_FCLOSEALL''@/$(GNULIB_MDA_FCLOSEALL)/g' \
+ -e 's/@''GNULIB_MDA_FDOPEN''@/$(GNULIB_MDA_FDOPEN)/g' \
+ -e 's/@''GNULIB_MDA_FILENO''@/$(GNULIB_MDA_FILENO)/g' \
+ -e 's/@''GNULIB_MDA_GETW''@/$(GNULIB_MDA_GETW)/g' \
+ -e 's/@''GNULIB_MDA_PUTW''@/$(GNULIB_MDA_PUTW)/g' \
+ -e 's/@''GNULIB_MDA_TEMPNAM''@/$(GNULIB_MDA_TEMPNAM)/g' \
+ < $(srcdir)/stdio.in.h | \
+ sed -e 's|@''HAVE_DECL_FCLOSEALL''@|$(HAVE_DECL_FCLOSEALL)|g' \
+ -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+ -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+ -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+ -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+ -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+ -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+ -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+ -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+ -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+ -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+ -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+ -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+ -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+ -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+ -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+ -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+ -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+ -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+ -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+ -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+ -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+ -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+ -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+ -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+ -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+ -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+ -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+ -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+ -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+ -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+ -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+ -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+ -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+ -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+ -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+ -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+ -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+ -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+ -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+ -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+ -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+ -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+ -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+ -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+ -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdio.h stdio.h-t
+
+EXTRA_DIST += stdio.in.h
+
+## end gnulib module stdio
+
+## begin gnulib module stdlib
+
+BUILT_SOURCES += stdlib.h
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+ $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+ -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
+ -e 's/@''GNULIB_ALIGNED_ALLOC''@/$(GNULIB_ALIGNED_ALLOC)/g' \
+ -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
+ -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
+ -e 's/@''GNULIB_FREE_POSIX''@/$(GNULIB_FREE_POSIX)/g' \
+ -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+ -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
+ -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
+ -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
+ -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
+ -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
+ -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
+ -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+ -e 's/@''GNULIB_POSIX_MEMALIGN''@/$(GNULIB_POSIX_MEMALIGN)/g' \
+ -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
+ -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
+ -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
+ -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
+ -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
+ -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
+ -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
+ -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
+ -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
+ -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
+ -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
+ -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
+ -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
+ -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
+ -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
+ -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
+ -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
+ -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
+ -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
+ -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
+ -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+ -e 's/@''GNULIB_MDA_ECVT''@/$(GNULIB_MDA_ECVT)/g' \
+ -e 's/@''GNULIB_MDA_FCVT''@/$(GNULIB_MDA_FCVT)/g' \
+ -e 's/@''GNULIB_MDA_GCVT''@/$(GNULIB_MDA_GCVT)/g' \
+ -e 's/@''GNULIB_MDA_MKTEMP''@/$(GNULIB_MDA_MKTEMP)/g' \
+ -e 's/@''GNULIB_MDA_PUTENV''@/$(GNULIB_MDA_PUTENV)/g' \
+ < $(srcdir)/stdlib.in.h | \
+ sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+ -e 's|@''HAVE_ALIGNED_ALLOC''@|$(HAVE_ALIGNED_ALLOC)|g' \
+ -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+ -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''HAVE_DECL_ECVT''@|$(HAVE_DECL_ECVT)|g' \
+ -e 's|@''HAVE_DECL_FCVT''@|$(HAVE_DECL_FCVT)|g' \
+ -e 's|@''HAVE_DECL_GCVT''@|$(HAVE_DECL_GCVT)|g' \
+ -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+ -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+ -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+ -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+ -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+ -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+ -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+ -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+ -e 's|@''HAVE_POSIX_MEMALIGN''@|$(HAVE_POSIX_MEMALIGN)|g' \
+ -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+ -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+ -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+ -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+ -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+ -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+ -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+ -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+ -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+ -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+ -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+ -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+ -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+ -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+ -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+ -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+ -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+ -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+ -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+ -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+ -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+ -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+ -e 's|@''REPLACE_ALIGNED_ALLOC''@|$(REPLACE_ALIGNED_ALLOC)|g' \
+ -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
+ -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+ -e 's|@''REPLACE_FREE''@|$(REPLACE_FREE)|g' \
+ -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+ -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
+ -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+ -e 's|@''REPLACE_POSIX_MEMALIGN''@|$(REPLACE_POSIX_MEMALIGN)|g' \
+ -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+ -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+ -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+ -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+ -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+ -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+ -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+ -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+ -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+ -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+ -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+ -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+ -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+ -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += stdlib.h stdlib.h-t
+
+EXTRA_DIST += stdlib.in.h
+
+## end gnulib module stdlib
+
+## begin gnulib module stpcpy
+
+
+EXTRA_DIST += stpcpy.c
+
+EXTRA_libgnu_a_SOURCES += stpcpy.c
+
+## end gnulib module stpcpy
+
+## begin gnulib module strcase
+
+
+EXTRA_DIST += strcasecmp.c strncasecmp.c
+
+EXTRA_libgnu_a_SOURCES += strcasecmp.c strncasecmp.c
+
+## end gnulib module strcase
+
+## begin gnulib module strchrnul
+
+
+EXTRA_DIST += strchrnul.c strchrnul.valgrind
+
+EXTRA_libgnu_a_SOURCES += strchrnul.c
+
+## end gnulib module strchrnul
+
+## begin gnulib module strdup-posix
+
+
+EXTRA_DIST += strdup.c
+
+EXTRA_libgnu_a_SOURCES += strdup.c
+
+## end gnulib module strdup-posix
+
+## begin gnulib module streq
+
+
+EXTRA_DIST += streq.h
+
+## end gnulib module streq
+
+## begin gnulib module strerror
+
+
+EXTRA_DIST += strerror.c
+
+EXTRA_libgnu_a_SOURCES += strerror.c
+
+## end gnulib module strerror
+
+## begin gnulib module strerror-override
+
+
+EXTRA_DIST += strerror-override.c strerror-override.h
+
+EXTRA_libgnu_a_SOURCES += strerror-override.c
+
+## end gnulib module strerror-override
+
+## begin gnulib module strerror_r-posix
+
+
+EXTRA_DIST += strerror_r.c
+
+EXTRA_libgnu_a_SOURCES += strerror_r.c
+
+## end gnulib module strerror_r-posix
+
+## begin gnulib module string
+
+BUILT_SOURCES += string.h
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+ -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
+ -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
+ -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
+ -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
+ -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
+ -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
+ -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
+ -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
+ -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
+ -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
+ -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
+ -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
+ -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
+ -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
+ -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
+ -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
+ -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
+ -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
+ -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
+ -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
+ -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
+ -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
+ -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
+ -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
+ -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
+ -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
+ -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
+ -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
+ -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
+ -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
+ -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
+ -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
+ -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
+ -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
+ -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
+ -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
+ -e 's/@''GNULIB_STRERRORNAME_NP''@/$(GNULIB_STRERRORNAME_NP)/g' \
+ -e 's/@''GNULIB_SIGABBREV_NP''@/$(GNULIB_SIGABBREV_NP)/g' \
+ -e 's/@''GNULIB_SIGDESCR_NP''@/$(GNULIB_SIGDESCR_NP)/g' \
+ -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
+ -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+ -e 's/@''GNULIB_MDA_MEMCCPY''@/$(GNULIB_MDA_MEMCCPY)/g' \
+ -e 's/@''GNULIB_MDA_STRDUP''@/$(GNULIB_MDA_STRDUP)/g' \
+ < $(srcdir)/string.in.h | \
+ sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+ -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+ -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+ -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+ -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+ -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+ -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+ -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+ -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+ -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+ -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+ -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+ -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+ -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+ -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+ -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+ -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+ -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+ -e 's|@''HAVE_STRERRORNAME_NP''@|$(HAVE_STRERRORNAME_NP)|g' \
+ -e 's|@''HAVE_SIGABBREV_NP''@|$(HAVE_SIGABBREV_NP)|g' \
+ -e 's|@''HAVE_SIGDESCR_NP''@|$(HAVE_SIGDESCR_NP)|g' \
+ -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+ -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+ -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+ -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+ -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+ -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+ -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+ -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+ -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+ -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+ -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+ -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+ -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+ -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+ -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+ -e 's|@''REPLACE_STRERRORNAME_NP''@|$(REPLACE_STRERRORNAME_NP)|g' \
+ -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+ -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ < $(srcdir)/string.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += string.h string.h-t
+
+EXTRA_DIST += string.in.h
+
+## end gnulib module string
+
+## begin gnulib module strings
+
+BUILT_SOURCES += strings.h
+
+# We need the following in order to create <strings.h> when the system
+# doesn't have one that works with the given compiler.
+strings.h: strings.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_STRINGS_H''@|$(HAVE_STRINGS_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
+ -e 's/@''GNULIB_FFS''@/$(GNULIB_FFS)/g' \
+ -e 's|@''HAVE_FFS''@|$(HAVE_FFS)|g' \
+ -e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
+ -e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/strings.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += strings.h strings.h-t
+
+EXTRA_DIST += strings.in.h
+
+## end gnulib module strings
+
+## begin gnulib module strndup
+
+
+EXTRA_DIST += strndup.c
+
+EXTRA_libgnu_a_SOURCES += strndup.c
+
+## end gnulib module strndup
+
+## begin gnulib module strnlen
+
+
+EXTRA_DIST += strnlen.c
+
+EXTRA_libgnu_a_SOURCES += strnlen.c
+
+## end gnulib module strnlen
+
+## begin gnulib module strnlen1
+
+libgnu_a_SOURCES += strnlen1.h strnlen1.c
+
+## end gnulib module strnlen1
+
+## begin gnulib module strpbrk
+
+
+EXTRA_DIST += strpbrk.c
+
+EXTRA_libgnu_a_SOURCES += strpbrk.c
+
+## end gnulib module strpbrk
+
+## begin gnulib module strptime
+
+
+EXTRA_DIST += strptime.c
+
+EXTRA_libgnu_a_SOURCES += strptime.c
+
+## end gnulib module strptime
+
+## begin gnulib module strtok_r
+
+
+EXTRA_DIST += strtok_r.c
+
+EXTRA_libgnu_a_SOURCES += strtok_r.c
+
+## end gnulib module strtok_r
+
+## begin gnulib module strtol
+
+
+EXTRA_DIST += strtol.c
+
+EXTRA_libgnu_a_SOURCES += strtol.c
+
+## end gnulib module strtol
+
+## begin gnulib module strtoll
+
+
+EXTRA_DIST += strtol.c strtoll.c
+
+EXTRA_libgnu_a_SOURCES += strtol.c strtoll.c
+
+## end gnulib module strtoll
+
+## begin gnulib module symlink
+
+
+EXTRA_DIST += symlink.c
+
+EXTRA_libgnu_a_SOURCES += symlink.c
+
+## end gnulib module symlink
+
+## begin gnulib module sys_file
+
+BUILT_SOURCES += sys/file.h
+
+# We need the following in order to create <sys/file.h> when the system
+# has one that is incomplete.
+sys/file.h: sys_file.in.h $(top_builddir)/config.status $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_SYS_FILE_H''@/$(HAVE_SYS_FILE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_FILE_H''@|$(NEXT_SYS_FILE_H)|g' \
+ -e 's/@''HAVE_FLOCK''@/$(HAVE_FLOCK)/g' \
+ -e 's/@''GNULIB_FLOCK''@/$(GNULIB_FLOCK)/g' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_file.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/file.h sys/file.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_file.in.h
+
+## end gnulib module sys_file
+
+## begin gnulib module sys_ioctl
+
+BUILT_SOURCES += sys/ioctl.h
+
+# We need the following in order to create <sys/ioctl.h> when the system
+# does not have a complete one.
+sys/ioctl.h: sys_ioctl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_SYS_IOCTL_H''@|$(HAVE_SYS_IOCTL_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_IOCTL_H''@|$(NEXT_SYS_IOCTL_H)|g' \
+ -e 's/@''GNULIB_IOCTL''@/$(GNULIB_IOCTL)/g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e 's|@''REPLACE_IOCTL''@|$(REPLACE_IOCTL)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_ioctl.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/ioctl.h sys/ioctl.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_ioctl.in.h
+
+## end gnulib module sys_ioctl
+
+## begin gnulib module sys_random
+
+BUILT_SOURCES += sys/random.h
+
+# We need the following in order to create <sys/random.h> when the system
+# doesn't have one.
+sys/random.h: sys_random.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_RANDOM_H''@|$(NEXT_SYS_RANDOM_H)|g' \
+ -e 's|@''HAVE_SYS_RANDOM_H''@|$(HAVE_SYS_RANDOM_H)|g' \
+ -e 's/@''GNULIB_GETRANDOM''@/$(GNULIB_GETRANDOM)/g' \
+ -e 's/@''HAVE_GETRANDOM''@/$(HAVE_GETRANDOM)/g' \
+ -e 's/@''REPLACE_GETRANDOM''@/$(REPLACE_GETRANDOM)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_random.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sys/random.h sys/random.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_random.in.h
+
+## end gnulib module sys_random
+
+## begin gnulib module sys_select
+
+BUILT_SOURCES += sys/select.h
+
+# We need the following in order to create <sys/select.h> when the system
+# doesn't have one that works with the given compiler.
+sys/select.h: sys_select.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_SELECT_H''@|$(NEXT_SYS_SELECT_H)|g' \
+ -e 's|@''HAVE_SYS_SELECT_H''@|$(HAVE_SYS_SELECT_H)|g' \
+ -e 's/@''GNULIB_PSELECT''@/$(GNULIB_PSELECT)/g' \
+ -e 's/@''GNULIB_SELECT''@/$(GNULIB_SELECT)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''HAVE_PSELECT''@|$(HAVE_PSELECT)|g' \
+ -e 's|@''REPLACE_PSELECT''@|$(REPLACE_PSELECT)|g' \
+ -e 's|@''REPLACE_SELECT''@|$(REPLACE_SELECT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_select.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/select.h sys/select.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_select.in.h
+
+## end gnulib module sys_select
+
+## begin gnulib module sys_socket
+
+BUILT_SOURCES += sys/socket.h
+libgnu_a_SOURCES += sys_socket.c
+
+# We need the following in order to create <sys/socket.h> when the system
+# doesn't have one that works with the given compiler.
+sys/socket.h: sys_socket.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H) $(ARG_NONNULL_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_SOCKET_H''@|$(NEXT_SYS_SOCKET_H)|g' \
+ -e 's|@''HAVE_SYS_SOCKET_H''@|$(HAVE_SYS_SOCKET_H)|g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_SOCKET''@/$(GNULIB_SOCKET)/g' \
+ -e 's/@''GNULIB_CONNECT''@/$(GNULIB_CONNECT)/g' \
+ -e 's/@''GNULIB_ACCEPT''@/$(GNULIB_ACCEPT)/g' \
+ -e 's/@''GNULIB_BIND''@/$(GNULIB_BIND)/g' \
+ -e 's/@''GNULIB_GETPEERNAME''@/$(GNULIB_GETPEERNAME)/g' \
+ -e 's/@''GNULIB_GETSOCKNAME''@/$(GNULIB_GETSOCKNAME)/g' \
+ -e 's/@''GNULIB_GETSOCKOPT''@/$(GNULIB_GETSOCKOPT)/g' \
+ -e 's/@''GNULIB_LISTEN''@/$(GNULIB_LISTEN)/g' \
+ -e 's/@''GNULIB_RECV''@/$(GNULIB_RECV)/g' \
+ -e 's/@''GNULIB_SEND''@/$(GNULIB_SEND)/g' \
+ -e 's/@''GNULIB_RECVFROM''@/$(GNULIB_RECVFROM)/g' \
+ -e 's/@''GNULIB_SENDTO''@/$(GNULIB_SENDTO)/g' \
+ -e 's/@''GNULIB_SETSOCKOPT''@/$(GNULIB_SETSOCKOPT)/g' \
+ -e 's/@''GNULIB_SHUTDOWN''@/$(GNULIB_SHUTDOWN)/g' \
+ -e 's/@''GNULIB_ACCEPT4''@/$(GNULIB_ACCEPT4)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's|@''HAVE_WS2TCPIP_H''@|$(HAVE_WS2TCPIP_H)|g' \
+ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE''@|$(HAVE_STRUCT_SOCKADDR_STORAGE)|g' \
+ -e 's|@''HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY''@|$(HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)|g' \
+ -e 's|@''HAVE_SA_FAMILY_T''@|$(HAVE_SA_FAMILY_T)|g' \
+ -e 's|@''HAVE_ACCEPT4''@|$(HAVE_ACCEPT4)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_socket.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sys/socket.h sys/socket.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_socket.in.h
+
+## end gnulib module sys_socket
+
+## begin gnulib module sys_stat
+
+BUILT_SOURCES += sys/stat.h
+
+# We need the following in order to create <sys/stat.h> when the system
+# has one that is incomplete.
+sys/stat.h: sys_stat.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_STAT_H''@|$(NEXT_SYS_STAT_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_ST_SIZE''@|$(WINDOWS_64_BIT_ST_SIZE)|g' \
+ -e 's|@''WINDOWS_STAT_TIMESPEC''@|$(WINDOWS_STAT_TIMESPEC)|g' \
+ -e 's/@''GNULIB_FCHMODAT''@/$(GNULIB_FCHMODAT)/g' \
+ -e 's/@''GNULIB_FSTAT''@/$(GNULIB_FSTAT)/g' \
+ -e 's/@''GNULIB_FSTATAT''@/$(GNULIB_FSTATAT)/g' \
+ -e 's/@''GNULIB_FUTIMENS''@/$(GNULIB_FUTIMENS)/g' \
+ -e 's/@''GNULIB_GETUMASK''@/$(GNULIB_GETUMASK)/g' \
+ -e 's/@''GNULIB_LCHMOD''@/$(GNULIB_LCHMOD)/g' \
+ -e 's/@''GNULIB_LSTAT''@/$(GNULIB_LSTAT)/g' \
+ -e 's/@''GNULIB_MKDIR''@/$(GNULIB_MKDIR)/g' \
+ -e 's/@''GNULIB_MKDIRAT''@/$(GNULIB_MKDIRAT)/g' \
+ -e 's/@''GNULIB_MKFIFO''@/$(GNULIB_MKFIFO)/g' \
+ -e 's/@''GNULIB_MKFIFOAT''@/$(GNULIB_MKFIFOAT)/g' \
+ -e 's/@''GNULIB_MKNOD''@/$(GNULIB_MKNOD)/g' \
+ -e 's/@''GNULIB_MKNODAT''@/$(GNULIB_MKNODAT)/g' \
+ -e 's/@''GNULIB_STAT''@/$(GNULIB_STAT)/g' \
+ -e 's/@''GNULIB_UTIMENSAT''@/$(GNULIB_UTIMENSAT)/g' \
+ -e 's/@''GNULIB_OVERRIDES_STRUCT_STAT''@/$(GNULIB_OVERRIDES_STRUCT_STAT)/g' \
+ -e 's/@''GNULIB_MDA_CHMOD''@/$(GNULIB_MDA_CHMOD)/g' \
+ -e 's/@''GNULIB_MDA_MKDIR''@/$(GNULIB_MDA_MKDIR)/g' \
+ -e 's/@''GNULIB_MDA_UMASK''@/$(GNULIB_MDA_UMASK)/g' \
+ -e 's|@''HAVE_FCHMODAT''@|$(HAVE_FCHMODAT)|g' \
+ -e 's|@''HAVE_FSTATAT''@|$(HAVE_FSTATAT)|g' \
+ -e 's|@''HAVE_FUTIMENS''@|$(HAVE_FUTIMENS)|g' \
+ -e 's|@''HAVE_GETUMASK''@|$(HAVE_GETUMASK)|g' \
+ -e 's|@''HAVE_LCHMOD''@|$(HAVE_LCHMOD)|g' \
+ -e 's|@''HAVE_LSTAT''@|$(HAVE_LSTAT)|g' \
+ -e 's|@''HAVE_MKDIRAT''@|$(HAVE_MKDIRAT)|g' \
+ -e 's|@''HAVE_MKFIFO''@|$(HAVE_MKFIFO)|g' \
+ -e 's|@''HAVE_MKFIFOAT''@|$(HAVE_MKFIFOAT)|g' \
+ -e 's|@''HAVE_MKNOD''@|$(HAVE_MKNOD)|g' \
+ -e 's|@''HAVE_MKNODAT''@|$(HAVE_MKNODAT)|g' \
+ -e 's|@''HAVE_UTIMENSAT''@|$(HAVE_UTIMENSAT)|g' \
+ -e 's|@''REPLACE_FCHMODAT''@|$(REPLACE_FCHMODAT)|g' \
+ -e 's|@''REPLACE_FSTAT''@|$(REPLACE_FSTAT)|g' \
+ -e 's|@''REPLACE_FSTATAT''@|$(REPLACE_FSTATAT)|g' \
+ -e 's|@''REPLACE_FUTIMENS''@|$(REPLACE_FUTIMENS)|g' \
+ -e 's|@''REPLACE_LSTAT''@|$(REPLACE_LSTAT)|g' \
+ -e 's|@''REPLACE_MKDIR''@|$(REPLACE_MKDIR)|g' \
+ -e 's|@''REPLACE_MKFIFO''@|$(REPLACE_MKFIFO)|g' \
+ -e 's|@''REPLACE_MKNOD''@|$(REPLACE_MKNOD)|g' \
+ -e 's|@''REPLACE_STAT''@|$(REPLACE_STAT)|g' \
+ -e 's|@''REPLACE_UTIMENSAT''@|$(REPLACE_UTIMENSAT)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_stat.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/stat.h sys/stat.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_stat.in.h
+
+## end gnulib module sys_stat
+
+## begin gnulib module sys_time
+
+BUILT_SOURCES += sys/time.h
+
+# We need the following in order to create <sys/time.h> when the system
+# doesn't have one that works with the given compiler.
+sys/time.h: sys_time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_SYS_TIME_H''@/$(HAVE_SYS_TIME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TIME_H''@|$(NEXT_SYS_TIME_H)|g' \
+ -e 's/@''GNULIB_GETTIMEOFDAY''@/$(GNULIB_GETTIMEOFDAY)/g' \
+ -e 's|@''HAVE_WINSOCK2_H''@|$(HAVE_WINSOCK2_H)|g' \
+ -e 's/@''HAVE_GETTIMEOFDAY''@/$(HAVE_GETTIMEOFDAY)/g' \
+ -e 's/@''HAVE_STRUCT_TIMEVAL''@/$(HAVE_STRUCT_TIMEVAL)/g' \
+ -e 's/@''REPLACE_GETTIMEOFDAY''@/$(REPLACE_GETTIMEOFDAY)/g' \
+ -e 's/@''REPLACE_STRUCT_TIMEVAL''@/$(REPLACE_STRUCT_TIMEVAL)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/time.h sys/time.h-t
+
+EXTRA_DIST += sys_time.in.h
+
+## end gnulib module sys_time
+
+## begin gnulib module sys_types
+
+BUILT_SOURCES += sys/types.h
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+sys/types.h: sys_types.in.h $(top_builddir)/config.status
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+ < $(srcdir)/sys_types.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/types.h sys/types.h-t
+
+EXTRA_DIST += sys_types.in.h
+
+## end gnulib module sys_types
+
+## begin gnulib module sys_uio
+
+BUILT_SOURCES += sys/uio.h
+
+# We need the following in order to create <sys/uio.h> when the system
+# doesn't have one that works with the given compiler.
+sys/uio.h: sys_uio.in.h $(top_builddir)/config.status
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_UIO_H''@|$(NEXT_SYS_UIO_H)|g' \
+ -e 's|@''HAVE_SYS_UIO_H''@|$(HAVE_SYS_UIO_H)|g' \
+ < $(srcdir)/sys_uio.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += sys/uio.h sys/uio.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_uio.in.h
+
+## end gnulib module sys_uio
+
+## begin gnulib module sys_wait
+
+BUILT_SOURCES += sys/wait.h
+
+# We need the following in order to create <sys/wait.h> when the system
+# has one that is incomplete.
+sys/wait.h: sys_wait.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_at)$(MKDIR_P) sys
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_SYS_WAIT_H''@|$(NEXT_SYS_WAIT_H)|g' \
+ -e 's/@''GNULIB_WAITPID''@/$(GNULIB_WAITPID)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/sys_wait.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += sys/wait.h sys/wait.h-t
+MOSTLYCLEANDIRS += sys
+
+EXTRA_DIST += sys_wait.in.h
+
+## end gnulib module sys_wait
+
+## begin gnulib module tempname
+
+libgnu_a_SOURCES += tempname.c
+
+EXTRA_DIST += tempname.h
+
+## end gnulib module tempname
+
+## begin gnulib module thread-optim
+
+
+EXTRA_DIST += thread-optim.h
+
+## end gnulib module thread-optim
+
+## begin gnulib module threadlib
+
+libgnu_a_SOURCES += glthread/threadlib.c
+
+## end gnulib module threadlib
+
+## begin gnulib module time
+
+BUILT_SOURCES += time.h
+
+# We need the following in order to create <time.h> when the system
+# doesn't have one that works with the given compiler.
+time.h: time.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_TIME_H''@|$(NEXT_TIME_H)|g' \
+ -e 's/@''GNULIB_CTIME''@/$(GNULIB_CTIME)/g' \
+ -e 's/@''GNULIB_LOCALTIME''@/$(GNULIB_LOCALTIME)/g' \
+ -e 's/@''GNULIB_MKTIME''@/$(GNULIB_MKTIME)/g' \
+ -e 's/@''GNULIB_NANOSLEEP''@/$(GNULIB_NANOSLEEP)/g' \
+ -e 's/@''GNULIB_STRFTIME''@/$(GNULIB_STRFTIME)/g' \
+ -e 's/@''GNULIB_STRPTIME''@/$(GNULIB_STRPTIME)/g' \
+ -e 's/@''GNULIB_TIMEGM''@/$(GNULIB_TIMEGM)/g' \
+ -e 's/@''GNULIB_TIME_R''@/$(GNULIB_TIME_R)/g' \
+ -e 's/@''GNULIB_TIME_RZ''@/$(GNULIB_TIME_RZ)/g' \
+ -e 's/@''GNULIB_TZSET''@/$(GNULIB_TZSET)/g' \
+ -e 's/@''GNULIB_MDA_TZSET''@/$(GNULIB_MDA_TZSET)/g' \
+ -e 's|@''HAVE_DECL_LOCALTIME_R''@|$(HAVE_DECL_LOCALTIME_R)|g' \
+ -e 's|@''HAVE_NANOSLEEP''@|$(HAVE_NANOSLEEP)|g' \
+ -e 's|@''HAVE_STRPTIME''@|$(HAVE_STRPTIME)|g' \
+ -e 's|@''HAVE_TIMEGM''@|$(HAVE_TIMEGM)|g' \
+ -e 's|@''HAVE_TIMEZONE_T''@|$(HAVE_TIMEZONE_T)|g' \
+ -e 's|@''REPLACE_CTIME''@|$(REPLACE_CTIME)|g' \
+ -e 's|@''REPLACE_GMTIME''@|$(REPLACE_GMTIME)|g' \
+ -e 's|@''REPLACE_LOCALTIME''@|$(REPLACE_LOCALTIME)|g' \
+ -e 's|@''REPLACE_LOCALTIME_R''@|$(REPLACE_LOCALTIME_R)|g' \
+ -e 's|@''REPLACE_MKTIME''@|$(REPLACE_MKTIME)|g' \
+ -e 's|@''REPLACE_NANOSLEEP''@|$(REPLACE_NANOSLEEP)|g' \
+ -e 's|@''REPLACE_STRFTIME''@|$(REPLACE_STRFTIME)|g' \
+ -e 's|@''REPLACE_TIMEGM''@|$(REPLACE_TIMEGM)|g' \
+ -e 's|@''REPLACE_TZSET''@|$(REPLACE_TZSET)|g' \
+ -e 's|@''PTHREAD_H_DEFINES_STRUCT_TIMESPEC''@|$(PTHREAD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''SYS_TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(SYS_TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''TIME_H_DEFINES_STRUCT_TIMESPEC''@|$(TIME_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e 's|@''UNISTD_H_DEFINES_STRUCT_TIMESPEC''@|$(UNISTD_H_DEFINES_STRUCT_TIMESPEC)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/time.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += time.h time.h-t
+
+EXTRA_DIST += time.in.h
+
+## end gnulib module time
+
+## begin gnulib module time_r
+
+
+EXTRA_DIST += time_r.c
+
+EXTRA_libgnu_a_SOURCES += time_r.c
+
+## end gnulib module time_r
+
+## begin gnulib module timegm
+
+
+EXTRA_DIST += mktime-internal.h timegm.c
+
+EXTRA_libgnu_a_SOURCES += timegm.c
+
+## end gnulib module timegm
+
+## begin gnulib module timespec
+
+libgnu_a_SOURCES += timespec.c
+
+EXTRA_DIST += timespec.h
+
+## end gnulib module timespec
+
+## begin gnulib module tmpdir
+
+libgnu_a_SOURCES += tmpdir.h tmpdir.c
+
+## end gnulib module tmpdir
+
+## begin gnulib module u64
+
+libgnu_a_SOURCES += u64.c
+
+EXTRA_DIST += u64.h
+
+## end gnulib module u64
+
+## begin gnulib module unicase/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNICASE_H)
+
+unicase.h: unicase.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unicase.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += unicase.h unicase.h-t
+
+EXTRA_DIST += unicase.in.h
+
+## end gnulib module unicase/base
+
+## begin gnulib module unicase/cased
+
+libgnu_a_SOURCES += unicase/cased.c
+
+EXTRA_DIST += unicase/cased.h unicase/caseprop.h unictype/bitmap.h
+
+## end gnulib module unicase/cased
+
+## begin gnulib module unicase/empty-prefix-context
+
+if LIBUNISTRING_COMPILE_UNICASE_EMPTY_PREFIX_CONTEXT
+libgnu_a_SOURCES += unicase/empty-prefix-context.c
+endif
+
+## end gnulib module unicase/empty-prefix-context
+
+## begin gnulib module unicase/empty-suffix-context
+
+if LIBUNISTRING_COMPILE_UNICASE_EMPTY_SUFFIX_CONTEXT
+libgnu_a_SOURCES += unicase/empty-suffix-context.c
+endif
+
+## end gnulib module unicase/empty-suffix-context
+
+## begin gnulib module unicase/ignorable
+
+libgnu_a_SOURCES += unicase/ignorable.c
+
+EXTRA_DIST += unicase/caseprop.h unicase/ignorable.h unictype/bitmap.h
+
+## end gnulib module unicase/ignorable
+
+## begin gnulib module unicase/special-casing
+
+libgnu_a_SOURCES += unicase/special-casing.c
+
+$(srcdir)/unicase/special-casing-table.h: $(srcdir)/unicase/special-casing-table.gperf
+ $(V_GPERF)$(GPERF) -m 10 $(srcdir)/unicase/special-casing-table.gperf > $(srcdir)/unicase/special-casing-table.h-t && \
+ mv $(srcdir)/unicase/special-casing-table.h-t $(srcdir)/unicase/special-casing-table.h
+BUILT_SOURCES += unicase/special-casing-table.h
+MOSTLYCLEANFILES += unicase/special-casing-table.h-t
+MAINTAINERCLEANFILES += unicase/special-casing-table.h
+EXTRA_DIST += unicase/special-casing-table.h
+
+# Generate special-casing.h with a declaration that depends on the gperf version.
+unicase/special-casing.h: unicase/special-casing.in.h unicase/special-casing-table.h
+ $(AM_V_at)$(MKDIR_P) unicase
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ declaration=`grep '^gl_unicase_special_lookup' $(srcdir)/unicase/special-casing-table.h | sed -e 's/register //g'` && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e "/gl_unicase_special_lookup/s/gl_unicase_special_lookup.*/$${declaration};/" $(srcdir)/unicase/special-casing.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+BUILT_SOURCES += unicase/special-casing.h
+MOSTLYCLEANFILES += unicase/special-casing.h unicase/special-casing.h-t
+
+EXTRA_DIST += unicase/special-casing-table.gperf unicase/special-casing.in.h
+
+## end gnulib module unicase/special-casing
+
+## begin gnulib module unicase/tolower
+
+if LIBUNISTRING_COMPILE_UNICASE_TOLOWER
+libgnu_a_SOURCES += unicase/tolower.c
+endif
+
+EXTRA_DIST += unicase/simple-mapping.h unicase/tolower.h
+
+## end gnulib module unicase/tolower
+
+## begin gnulib module unicase/u8-casemap
+
+libgnu_a_SOURCES += unicase/u8-casemap.c
+
+EXTRA_DIST += unicase/context.h unicase/u-casemap.h unicase/unicasemap.h
+
+## end gnulib module unicase/u8-casemap
+
+## begin gnulib module unicase/u8-tolower
+
+if LIBUNISTRING_COMPILE_UNICASE_U8_TOLOWER
+libgnu_a_SOURCES += unicase/u8-tolower.c
+endif
+
+## end gnulib module unicase/u8-tolower
+
+## begin gnulib module unictype/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNICTYPE_H)
+
+unictype.h: unictype.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unictype.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += unictype.h unictype.h-t
+
+EXTRA_DIST += unictype.in.h
+
+## end gnulib module unictype/base
+
+## begin gnulib module unictype/combining-class
+
+if LIBUNISTRING_COMPILE_UNICTYPE_COMBINING_CLASS
+libgnu_a_SOURCES += unictype/combiningclass.c
+endif
+
+EXTRA_DIST += unictype/combiningclass.h
+
+## end gnulib module unictype/combining-class
+
+## begin gnulib module unictype/property-soft-dotted
+
+if LIBUNISTRING_COMPILE_UNICTYPE_PROPERTY_SOFT_DOTTED
+libgnu_a_SOURCES += unictype/pr_soft_dotted.c
+endif
+
+EXTRA_DIST += unictype/bitmap.h unictype/pr_soft_dotted.h
+
+## end gnulib module unictype/property-soft-dotted
+
+## begin gnulib module uninorm/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNINORM_H)
+
+uninorm.h: uninorm.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/uninorm.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += uninorm.h uninorm.h-t
+
+EXTRA_DIST += uninorm.in.h
+
+## end gnulib module uninorm/base
+
+## begin gnulib module uninorm/decompose-internal
+
+libgnu_a_SOURCES += uninorm/decompose-internal.c
+
+EXTRA_DIST += uninorm/decompose-internal.h
+
+## end gnulib module uninorm/decompose-internal
+
+## begin gnulib module uninorm/u8-normalize
+
+if LIBUNISTRING_COMPILE_UNINORM_U8_NORMALIZE
+libgnu_a_SOURCES += uninorm/u8-normalize.c
+endif
+
+EXTRA_DIST += uninorm/normalize-internal.h uninorm/u-normalize-internal.h
+
+## end gnulib module uninorm/u8-normalize
+
+## begin gnulib module unistd
+
+BUILT_SOURCES += unistd.h
+libgnu_a_SOURCES += unistd.c
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+ -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+ -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
+ -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
+ -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
+ -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+ -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
+ -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
+ -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
+ -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
+ -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
+ -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
+ -e 's/@''GNULIB_EXECL''@/$(GNULIB_EXECL)/g' \
+ -e 's/@''GNULIB_EXECLE''@/$(GNULIB_EXECLE)/g' \
+ -e 's/@''GNULIB_EXECLP''@/$(GNULIB_EXECLP)/g' \
+ -e 's/@''GNULIB_EXECV''@/$(GNULIB_EXECV)/g' \
+ -e 's/@''GNULIB_EXECVE''@/$(GNULIB_EXECVE)/g' \
+ -e 's/@''GNULIB_EXECVP''@/$(GNULIB_EXECVP)/g' \
+ -e 's/@''GNULIB_EXECVPE''@/$(GNULIB_EXECVPE)/g' \
+ -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
+ -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
+ -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
+ -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
+ -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
+ -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
+ -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
+ -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
+ -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
+ -e 's/@''GNULIB_GETENTROPY''@/$(GNULIB_GETENTROPY)/g' \
+ -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
+ -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
+ -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
+ -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
+ -e 's/@''GNULIB_GETOPT_POSIX''@/$(GNULIB_GETOPT_POSIX)/g' \
+ -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
+ -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
+ -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
+ -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
+ -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
+ -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
+ -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
+ -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
+ -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
+ -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
+ -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
+ -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
+ -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
+ -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
+ -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
+ -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
+ -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
+ -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
+ -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
+ -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
+ -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
+ -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
+ -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
+ -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
+ -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
+ -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
+ -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
+ -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
+ -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
+ -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+ -e 's/@''GNULIB_MDA_ACCESS''@/$(GNULIB_MDA_ACCESS)/g' \
+ -e 's/@''GNULIB_MDA_CHDIR''@/$(GNULIB_MDA_CHDIR)/g' \
+ -e 's/@''GNULIB_MDA_CLOSE''@/$(GNULIB_MDA_CLOSE)/g' \
+ -e 's/@''GNULIB_MDA_DUP''@/$(GNULIB_MDA_DUP)/g' \
+ -e 's/@''GNULIB_MDA_DUP2''@/$(GNULIB_MDA_DUP2)/g' \
+ -e 's/@''GNULIB_MDA_EXECL''@/$(GNULIB_MDA_EXECL)/g' \
+ -e 's/@''GNULIB_MDA_EXECLE''@/$(GNULIB_MDA_EXECLE)/g' \
+ -e 's/@''GNULIB_MDA_EXECLP''@/$(GNULIB_MDA_EXECLP)/g' \
+ -e 's/@''GNULIB_MDA_EXECV''@/$(GNULIB_MDA_EXECV)/g' \
+ -e 's/@''GNULIB_MDA_EXECVE''@/$(GNULIB_MDA_EXECVE)/g' \
+ -e 's/@''GNULIB_MDA_EXECVP''@/$(GNULIB_MDA_EXECVP)/g' \
+ -e 's/@''GNULIB_MDA_EXECVPE''@/$(GNULIB_MDA_EXECVPE)/g' \
+ -e 's/@''GNULIB_MDA_GETCWD''@/$(GNULIB_MDA_GETCWD)/g' \
+ -e 's/@''GNULIB_MDA_GETPID''@/$(GNULIB_MDA_GETPID)/g' \
+ -e 's/@''GNULIB_MDA_ISATTY''@/$(GNULIB_MDA_ISATTY)/g' \
+ -e 's/@''GNULIB_MDA_LSEEK''@/$(GNULIB_MDA_LSEEK)/g' \
+ -e 's/@''GNULIB_MDA_READ''@/$(GNULIB_MDA_READ)/g' \
+ -e 's/@''GNULIB_MDA_RMDIR''@/$(GNULIB_MDA_RMDIR)/g' \
+ -e 's/@''GNULIB_MDA_SWAB''@/$(GNULIB_MDA_SWAB)/g' \
+ -e 's/@''GNULIB_MDA_UNLINK''@/$(GNULIB_MDA_UNLINK)/g' \
+ -e 's/@''GNULIB_MDA_WRITE''@/$(GNULIB_MDA_WRITE)/g' \
+ < $(srcdir)/unistd.in.h | \
+ sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+ -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+ -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+ -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+ -e 's|@''HAVE_EXECVPE''@|$(HAVE_EXECVPE)|g' \
+ -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+ -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+ -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+ -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+ -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+ -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+ -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+ -e 's|@''HAVE_GETENTROPY''@|$(HAVE_GETENTROPY)|g' \
+ -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+ -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+ -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+ -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+ -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+ -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+ -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+ -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+ -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+ -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+ -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+ -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+ -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+ -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+ -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+ -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+ -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+ -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+ -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+ -e 's|@''HAVE_DECL_EXECVPE''@|$(HAVE_DECL_EXECVPE)|g' \
+ -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+ -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+ -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+ -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+ -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+ -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+ -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+ -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+ -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+ -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+ -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+ | \
+ sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+ -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+ -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+ -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+ -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+ -e 's|@''REPLACE_EXECL''@|$(REPLACE_EXECL)|g' \
+ -e 's|@''REPLACE_EXECLE''@|$(REPLACE_EXECLE)|g' \
+ -e 's|@''REPLACE_EXECLP''@|$(REPLACE_EXECLP)|g' \
+ -e 's|@''REPLACE_EXECV''@|$(REPLACE_EXECV)|g' \
+ -e 's|@''REPLACE_EXECVE''@|$(REPLACE_EXECVE)|g' \
+ -e 's|@''REPLACE_EXECVP''@|$(REPLACE_EXECVP)|g' \
+ -e 's|@''REPLACE_EXECVPE''@|$(REPLACE_EXECVPE)|g' \
+ -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+ -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+ -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+ -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+ -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+ -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+ -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+ -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+ -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+ -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+ -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+ -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+ -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+ -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+ -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+ -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+ -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+ -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+ -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+ -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+ -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+ -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+ -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+ -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+ -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+ -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+ -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+ -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+ -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+ -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+ -e 's|@''UNISTD_H_HAVE_SYS_RANDOM_H''@|$(UNISTD_H_HAVE_SYS_RANDOM_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+ -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += unistd.h unistd.h-t
+
+EXTRA_DIST += unistd.in.h
+
+## end gnulib module unistd
+
+## begin gnulib module unistd-safer
+
+libgnu_a_SOURCES += dup-safer.c fd-safer.c pipe-safer.c
+
+EXTRA_DIST += unistd--.h unistd-safer.h
+
+## end gnulib module unistd-safer
+
+## begin gnulib module unistr/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNISTR_H)
+
+unistr.h: unistr.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unistr.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += unistr.h unistr.h-t
+
+EXTRA_DIST += unistr.in.h
+
+## end gnulib module unistr/base
+
+## begin gnulib module unistr/u8-cpy
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_CPY
+libgnu_a_SOURCES += unistr/u8-cpy.c
+endif
+
+EXTRA_DIST += unistr/u-cpy.h
+
+## end gnulib module unistr/u8-cpy
+
+## begin gnulib module unistr/u8-mbtouc-unsafe
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_MBTOUC_UNSAFE
+libgnu_a_SOURCES += unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc-unsafe-aux.c
+endif
+
+## end gnulib module unistr/u8-mbtouc-unsafe
+
+## begin gnulib module unistr/u8-strlen
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_STRLEN
+libgnu_a_SOURCES += unistr/u8-strlen.c
+endif
+
+## end gnulib module unistr/u8-strlen
+
+## begin gnulib module unistr/u8-uctomb
+
+if LIBUNISTRING_COMPILE_UNISTR_U8_UCTOMB
+libgnu_a_SOURCES += unistr/u8-uctomb.c unistr/u8-uctomb-aux.c
+endif
+
+## end gnulib module unistr/u8-uctomb
+
+## begin gnulib module unitypes
+
+BUILT_SOURCES += $(LIBUNISTRING_UNITYPES_H)
+
+unitypes.h: unitypes.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/unitypes.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += unitypes.h unitypes.h-t
+
+EXTRA_DIST += unitypes.in.h
+
+## end gnulib module unitypes
+
+## begin gnulib module uniwidth/base
+
+BUILT_SOURCES += $(LIBUNISTRING_UNIWIDTH_H)
+
+uniwidth.h: uniwidth.in.h
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ cat $(srcdir)/uniwidth.in.h; \
+ } > $@-t && \
+ mv -f $@-t $@
+MOSTLYCLEANFILES += uniwidth.h uniwidth.h-t
+
+EXTRA_DIST += localcharset.h uniwidth.in.h
+
+## end gnulib module uniwidth/base
+
+## begin gnulib module uniwidth/width
+
+if LIBUNISTRING_COMPILE_UNIWIDTH_WIDTH
+libgnu_a_SOURCES += uniwidth/width.c
+endif
+
+EXTRA_DIST += uniwidth/cjk.h
+
+## end gnulib module uniwidth/width
+
+## begin gnulib module unlink
+
+
+EXTRA_DIST += unlink.c
+
+EXTRA_libgnu_a_SOURCES += unlink.c
+
+## end gnulib module unlink
+
+## begin gnulib module unlocked-io
+
+
+EXTRA_DIST += unlocked-io.h
+
+## end gnulib module unlocked-io
+
+## begin gnulib module update-copyright
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/update-copyright
+
+## end gnulib module update-copyright
+
+## begin gnulib module useless-if-before-free
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/useless-if-before-free
+
+## end gnulib module useless-if-before-free
+
+## begin gnulib module utime
+
+
+EXTRA_DIST += utime.c
+
+EXTRA_libgnu_a_SOURCES += utime.c
+
+## end gnulib module utime
+
+## begin gnulib module utime-h
+
+BUILT_SOURCES += utime.h
+
+# We need the following in order to create <utime.h> when the system
+# doesn't have one that works with the given compiler.
+utime.h: utime.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_UTIME_H''@/$(HAVE_UTIME_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_UTIME_H''@|$(NEXT_UTIME_H)|g' \
+ -e 's/@''GNULIB_UTIME''@/$(GNULIB_UTIME)/g' \
+ -e 's/@''GNULIB_MDA_UTIME''@/$(GNULIB_MDA_UTIME)/g' \
+ -e 's|@''HAVE_UTIME''@|$(HAVE_UTIME)|g' \
+ -e 's|@''REPLACE_UTIME''@|$(REPLACE_UTIME)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/utime.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += utime.h utime.h-t
+
+EXTRA_DIST += utime.in.h
+
+## end gnulib module utime-h
+
+## begin gnulib module utimens
+
+libgnu_a_SOURCES += utimens.c
+
+EXTRA_DIST += utimens.h
+
+## end gnulib module utimens
+
+## begin gnulib module vasnprintf
+
+
+EXTRA_DIST += asnprintf.c float+.h printf-args.c printf-args.h printf-parse.c printf-parse.h vasnprintf.c vasnprintf.h
+
+EXTRA_libgnu_a_SOURCES += asnprintf.c printf-args.c printf-parse.c vasnprintf.c
+
+## end gnulib module vasnprintf
+
+## begin gnulib module vasprintf
+
+
+EXTRA_DIST += asprintf.c vasprintf.c
+
+EXTRA_libgnu_a_SOURCES += asprintf.c vasprintf.c
+
+## end gnulib module vasprintf
+
+## begin gnulib module vc-list-files
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/vc-list-files
+
+## end gnulib module vc-list-files
+
+## begin gnulib module verify
+
+
+EXTRA_DIST += verify.h
+
+## end gnulib module verify
+
+## begin gnulib module vsnprintf
+
+
+EXTRA_DIST += vsnprintf.c
+
+EXTRA_libgnu_a_SOURCES += vsnprintf.c
+
+## end gnulib module vsnprintf
+
+## begin gnulib module wait-process
+
+libgnu_a_SOURCES += wait-process.h wait-process.c
+
+## end gnulib module wait-process
+
+## begin gnulib module waitpid
+
+
+EXTRA_DIST += waitpid.c
+
+EXTRA_libgnu_a_SOURCES += waitpid.c
+
+## end gnulib module waitpid
+
+## begin gnulib module wchar
+
+BUILT_SOURCES += wchar.h
+
+# We need the following in order to create <wchar.h> when the system
+# version does not work standalone.
+wchar.h: wchar.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''HAVE_FEATURES_H''@|$(HAVE_FEATURES_H)|g' \
+ -e 's|@''NEXT_WCHAR_H''@|$(NEXT_WCHAR_H)|g' \
+ -e 's|@''HAVE_WCHAR_H''@|$(HAVE_WCHAR_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+ -e 's/@''GNULIB_BTOWC''@/$(GNULIB_BTOWC)/g' \
+ -e 's/@''GNULIB_WCTOB''@/$(GNULIB_WCTOB)/g' \
+ -e 's/@''GNULIB_MBSINIT''@/$(GNULIB_MBSINIT)/g' \
+ -e 's/@''GNULIB_MBRTOWC''@/$(GNULIB_MBRTOWC)/g' \
+ -e 's/@''GNULIB_MBRLEN''@/$(GNULIB_MBRLEN)/g' \
+ -e 's/@''GNULIB_MBSRTOWCS''@/$(GNULIB_MBSRTOWCS)/g' \
+ -e 's/@''GNULIB_MBSNRTOWCS''@/$(GNULIB_MBSNRTOWCS)/g' \
+ -e 's/@''GNULIB_WCRTOMB''@/$(GNULIB_WCRTOMB)/g' \
+ -e 's/@''GNULIB_WCSRTOMBS''@/$(GNULIB_WCSRTOMBS)/g' \
+ -e 's/@''GNULIB_WCSNRTOMBS''@/$(GNULIB_WCSNRTOMBS)/g' \
+ -e 's/@''GNULIB_WCWIDTH''@/$(GNULIB_WCWIDTH)/g' \
+ -e 's/@''GNULIB_WMEMCHR''@/$(GNULIB_WMEMCHR)/g' \
+ -e 's/@''GNULIB_WMEMCMP''@/$(GNULIB_WMEMCMP)/g' \
+ -e 's/@''GNULIB_WMEMCPY''@/$(GNULIB_WMEMCPY)/g' \
+ -e 's/@''GNULIB_WMEMMOVE''@/$(GNULIB_WMEMMOVE)/g' \
+ -e 's/@''GNULIB_WMEMPCPY''@/$(GNULIB_WMEMPCPY)/g' \
+ -e 's/@''GNULIB_WMEMSET''@/$(GNULIB_WMEMSET)/g' \
+ -e 's/@''GNULIB_WCSLEN''@/$(GNULIB_WCSLEN)/g' \
+ -e 's/@''GNULIB_WCSNLEN''@/$(GNULIB_WCSNLEN)/g' \
+ -e 's/@''GNULIB_WCSCPY''@/$(GNULIB_WCSCPY)/g' \
+ -e 's/@''GNULIB_WCPCPY''@/$(GNULIB_WCPCPY)/g' \
+ -e 's/@''GNULIB_WCSNCPY''@/$(GNULIB_WCSNCPY)/g' \
+ -e 's/@''GNULIB_WCPNCPY''@/$(GNULIB_WCPNCPY)/g' \
+ -e 's/@''GNULIB_WCSCAT''@/$(GNULIB_WCSCAT)/g' \
+ -e 's/@''GNULIB_WCSNCAT''@/$(GNULIB_WCSNCAT)/g' \
+ -e 's/@''GNULIB_WCSCMP''@/$(GNULIB_WCSCMP)/g' \
+ -e 's/@''GNULIB_WCSNCMP''@/$(GNULIB_WCSNCMP)/g' \
+ -e 's/@''GNULIB_WCSCASECMP''@/$(GNULIB_WCSCASECMP)/g' \
+ -e 's/@''GNULIB_WCSNCASECMP''@/$(GNULIB_WCSNCASECMP)/g' \
+ -e 's/@''GNULIB_WCSCOLL''@/$(GNULIB_WCSCOLL)/g' \
+ -e 's/@''GNULIB_WCSXFRM''@/$(GNULIB_WCSXFRM)/g' \
+ -e 's/@''GNULIB_WCSDUP''@/$(GNULIB_WCSDUP)/g' \
+ -e 's/@''GNULIB_WCSCHR''@/$(GNULIB_WCSCHR)/g' \
+ -e 's/@''GNULIB_WCSRCHR''@/$(GNULIB_WCSRCHR)/g' \
+ -e 's/@''GNULIB_WCSCSPN''@/$(GNULIB_WCSCSPN)/g' \
+ -e 's/@''GNULIB_WCSSPN''@/$(GNULIB_WCSSPN)/g' \
+ -e 's/@''GNULIB_WCSPBRK''@/$(GNULIB_WCSPBRK)/g' \
+ -e 's/@''GNULIB_WCSSTR''@/$(GNULIB_WCSSTR)/g' \
+ -e 's/@''GNULIB_WCSTOK''@/$(GNULIB_WCSTOK)/g' \
+ -e 's/@''GNULIB_WCSWIDTH''@/$(GNULIB_WCSWIDTH)/g' \
+ -e 's/@''GNULIB_WCSFTIME''@/$(GNULIB_WCSFTIME)/g' \
+ -e 's/@''GNULIB_MDA_WCSDUP''@/$(GNULIB_MDA_WCSDUP)/g' \
+ < $(srcdir)/wchar.in.h | \
+ sed -e 's|@''HAVE_WINT_T''@|$(HAVE_WINT_T)|g' \
+ -e 's|@''HAVE_BTOWC''@|$(HAVE_BTOWC)|g' \
+ -e 's|@''HAVE_MBSINIT''@|$(HAVE_MBSINIT)|g' \
+ -e 's|@''HAVE_MBRTOWC''@|$(HAVE_MBRTOWC)|g' \
+ -e 's|@''HAVE_MBRLEN''@|$(HAVE_MBRLEN)|g' \
+ -e 's|@''HAVE_MBSRTOWCS''@|$(HAVE_MBSRTOWCS)|g' \
+ -e 's|@''HAVE_MBSNRTOWCS''@|$(HAVE_MBSNRTOWCS)|g' \
+ -e 's|@''HAVE_WCRTOMB''@|$(HAVE_WCRTOMB)|g' \
+ -e 's|@''HAVE_WCSRTOMBS''@|$(HAVE_WCSRTOMBS)|g' \
+ -e 's|@''HAVE_WCSNRTOMBS''@|$(HAVE_WCSNRTOMBS)|g' \
+ -e 's|@''HAVE_WMEMCHR''@|$(HAVE_WMEMCHR)|g' \
+ -e 's|@''HAVE_WMEMCMP''@|$(HAVE_WMEMCMP)|g' \
+ -e 's|@''HAVE_WMEMCPY''@|$(HAVE_WMEMCPY)|g' \
+ -e 's|@''HAVE_WMEMMOVE''@|$(HAVE_WMEMMOVE)|g' \
+ -e 's|@''HAVE_WMEMPCPY''@|$(HAVE_WMEMPCPY)|g' \
+ -e 's|@''HAVE_WMEMSET''@|$(HAVE_WMEMSET)|g' \
+ -e 's|@''HAVE_WCSLEN''@|$(HAVE_WCSLEN)|g' \
+ -e 's|@''HAVE_WCSNLEN''@|$(HAVE_WCSNLEN)|g' \
+ -e 's|@''HAVE_WCSCPY''@|$(HAVE_WCSCPY)|g' \
+ -e 's|@''HAVE_WCPCPY''@|$(HAVE_WCPCPY)|g' \
+ -e 's|@''HAVE_WCSNCPY''@|$(HAVE_WCSNCPY)|g' \
+ -e 's|@''HAVE_WCPNCPY''@|$(HAVE_WCPNCPY)|g' \
+ -e 's|@''HAVE_WCSCAT''@|$(HAVE_WCSCAT)|g' \
+ -e 's|@''HAVE_WCSNCAT''@|$(HAVE_WCSNCAT)|g' \
+ -e 's|@''HAVE_WCSCMP''@|$(HAVE_WCSCMP)|g' \
+ -e 's|@''HAVE_WCSNCMP''@|$(HAVE_WCSNCMP)|g' \
+ -e 's|@''HAVE_WCSCASECMP''@|$(HAVE_WCSCASECMP)|g' \
+ -e 's|@''HAVE_WCSNCASECMP''@|$(HAVE_WCSNCASECMP)|g' \
+ -e 's|@''HAVE_WCSCOLL''@|$(HAVE_WCSCOLL)|g' \
+ -e 's|@''HAVE_WCSXFRM''@|$(HAVE_WCSXFRM)|g' \
+ -e 's|@''HAVE_WCSDUP''@|$(HAVE_WCSDUP)|g' \
+ -e 's|@''HAVE_WCSCHR''@|$(HAVE_WCSCHR)|g' \
+ -e 's|@''HAVE_WCSRCHR''@|$(HAVE_WCSRCHR)|g' \
+ -e 's|@''HAVE_WCSCSPN''@|$(HAVE_WCSCSPN)|g' \
+ -e 's|@''HAVE_WCSSPN''@|$(HAVE_WCSSPN)|g' \
+ -e 's|@''HAVE_WCSPBRK''@|$(HAVE_WCSPBRK)|g' \
+ -e 's|@''HAVE_WCSSTR''@|$(HAVE_WCSSTR)|g' \
+ -e 's|@''HAVE_WCSTOK''@|$(HAVE_WCSTOK)|g' \
+ -e 's|@''HAVE_WCSWIDTH''@|$(HAVE_WCSWIDTH)|g' \
+ -e 's|@''HAVE_WCSFTIME''@|$(HAVE_WCSFTIME)|g' \
+ -e 's|@''HAVE_DECL_WCTOB''@|$(HAVE_DECL_WCTOB)|g' \
+ -e 's|@''HAVE_DECL_WCSDUP''@|$(HAVE_DECL_WCSDUP)|g' \
+ -e 's|@''HAVE_DECL_WCWIDTH''@|$(HAVE_DECL_WCWIDTH)|g' \
+ | \
+ sed -e 's|@''REPLACE_MBSTATE_T''@|$(REPLACE_MBSTATE_T)|g' \
+ -e 's|@''REPLACE_BTOWC''@|$(REPLACE_BTOWC)|g' \
+ -e 's|@''REPLACE_WCTOB''@|$(REPLACE_WCTOB)|g' \
+ -e 's|@''REPLACE_MBSINIT''@|$(REPLACE_MBSINIT)|g' \
+ -e 's|@''REPLACE_MBRTOWC''@|$(REPLACE_MBRTOWC)|g' \
+ -e 's|@''REPLACE_MBRLEN''@|$(REPLACE_MBRLEN)|g' \
+ -e 's|@''REPLACE_MBSRTOWCS''@|$(REPLACE_MBSRTOWCS)|g' \
+ -e 's|@''REPLACE_MBSNRTOWCS''@|$(REPLACE_MBSNRTOWCS)|g' \
+ -e 's|@''REPLACE_WCRTOMB''@|$(REPLACE_WCRTOMB)|g' \
+ -e 's|@''REPLACE_WCSRTOMBS''@|$(REPLACE_WCSRTOMBS)|g' \
+ -e 's|@''REPLACE_WCSNRTOMBS''@|$(REPLACE_WCSNRTOMBS)|g' \
+ -e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
+ -e 's|@''REPLACE_WCSWIDTH''@|$(REPLACE_WCSWIDTH)|g' \
+ -e 's|@''REPLACE_WCSFTIME''@|$(REPLACE_WCSFTIME)|g' \
+ -e 's|@''REPLACE_WCSTOK''@|$(REPLACE_WCSTOK)|g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += wchar.h wchar.h-t
+
+EXTRA_DIST += wchar.in.h
+
+## end gnulib module wchar
+
+## begin gnulib module wcrtomb
+
+
+EXTRA_DIST += wcrtomb.c
+
+EXTRA_libgnu_a_SOURCES += wcrtomb.c
+
+## end gnulib module wcrtomb
+
+## begin gnulib module wctype-h
+
+BUILT_SOURCES += wctype.h
+libgnu_a_SOURCES += wctype-h.c
+
+# We need the following in order to create <wctype.h> when the system
+# doesn't have one that works with the given compiler.
+wctype.h: wctype.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(WARN_ON_USE_H)
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+ sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+ -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
+ -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+ -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+ -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+ -e 's|@''NEXT_WCTYPE_H''@|$(NEXT_WCTYPE_H)|g' \
+ -e 's/@''HAVE_CRTDEFS_H''@/$(HAVE_CRTDEFS_H)/g' \
+ -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+ -e 's/@''GNULIB_ISWBLANK''@/$(GNULIB_ISWBLANK)/g' \
+ -e 's/@''GNULIB_ISWDIGIT''@/$(GNULIB_ISWDIGIT)/g' \
+ -e 's/@''GNULIB_ISWXDIGIT''@/$(GNULIB_ISWXDIGIT)/g' \
+ -e 's/@''GNULIB_WCTYPE''@/$(GNULIB_WCTYPE)/g' \
+ -e 's/@''GNULIB_ISWCTYPE''@/$(GNULIB_ISWCTYPE)/g' \
+ -e 's/@''GNULIB_WCTRANS''@/$(GNULIB_WCTRANS)/g' \
+ -e 's/@''GNULIB_TOWCTRANS''@/$(GNULIB_TOWCTRANS)/g' \
+ -e 's/@''HAVE_ISWBLANK''@/$(HAVE_ISWBLANK)/g' \
+ -e 's/@''HAVE_ISWCNTRL''@/$(HAVE_ISWCNTRL)/g' \
+ -e 's/@''HAVE_WCTYPE_T''@/$(HAVE_WCTYPE_T)/g' \
+ -e 's/@''HAVE_WCTRANS_T''@/$(HAVE_WCTRANS_T)/g' \
+ -e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
+ -e 's/@''REPLACE_ISWBLANK''@/$(REPLACE_ISWBLANK)/g' \
+ -e 's/@''REPLACE_ISWDIGIT''@/$(REPLACE_ISWDIGIT)/g' \
+ -e 's/@''REPLACE_ISWXDIGIT''@/$(REPLACE_ISWXDIGIT)/g' \
+ -e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
+ -e 's/@''REPLACE_TOWLOWER''@/$(REPLACE_TOWLOWER)/g' \
+ -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+ -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+ < $(srcdir)/wctype.in.h; \
+ } > $@-t && \
+ mv $@-t $@
+MOSTLYCLEANFILES += wctype.h wctype.h-t
+
+EXTRA_DIST += wctype.in.h
+
+## end gnulib module wctype-h
+
+## begin gnulib module wcwidth
+
+
+EXTRA_DIST += wcwidth.c
+
+EXTRA_libgnu_a_SOURCES += wcwidth.c
+
+## end gnulib module wcwidth
+
+## begin gnulib module windows-mutex
+
+
+EXTRA_DIST += windows-initguard.h windows-mutex.c windows-mutex.h
+
+EXTRA_libgnu_a_SOURCES += windows-mutex.c
+
+## end gnulib module windows-mutex
+
+## begin gnulib module windows-once
+
+
+EXTRA_DIST += windows-once.c windows-once.h
+
+EXTRA_libgnu_a_SOURCES += windows-once.c
+
+## end gnulib module windows-once
+
+## begin gnulib module windows-recmutex
+
+
+EXTRA_DIST += windows-initguard.h windows-recmutex.c windows-recmutex.h
+
+EXTRA_libgnu_a_SOURCES += windows-recmutex.c
+
+## end gnulib module windows-recmutex
+
+## begin gnulib module windows-rwlock
+
+
+EXTRA_DIST += windows-initguard.h windows-rwlock.c windows-rwlock.h
+
+EXTRA_libgnu_a_SOURCES += windows-rwlock.c
+
+## end gnulib module windows-rwlock
+
+## begin gnulib module windows-spawn
+
+
+EXTRA_DIST += windows-spawn.c windows-spawn.h
+
+EXTRA_libgnu_a_SOURCES += windows-spawn.c
+
+## end gnulib module windows-spawn
+
+## begin gnulib module wmemchr
+
+
+EXTRA_DIST += wmemchr-impl.h wmemchr.c
+
+EXTRA_libgnu_a_SOURCES += wmemchr.c
+
+## end gnulib module wmemchr
+
+## begin gnulib module wmempcpy
+
+
+EXTRA_DIST += wmempcpy.c
+
+EXTRA_libgnu_a_SOURCES += wmempcpy.c
+
+## end gnulib module wmempcpy
+
+## begin gnulib module write
+
+
+EXTRA_DIST += write.c
+
+EXTRA_libgnu_a_SOURCES += write.c
+
+## end gnulib module write
+
+## begin gnulib module xalloc
+
+libgnu_a_SOURCES += xmalloc.c
+
+EXTRA_DIST += xalloc.h
+
+## end gnulib module xalloc
+
+## begin gnulib module xalloc-die
+
+libgnu_a_SOURCES += xalloc-die.c
+
+EXTRA_DIST += xalloc.h
+
+## end gnulib module xalloc-die
+
+## begin gnulib module xalloc-oversized
+
+
+EXTRA_DIST += xalloc-oversized.h
+
+## end gnulib module xalloc-oversized
+
+## begin gnulib module xmemdup0
+
+libgnu_a_SOURCES += xmemdup0.h xmemdup0.c
+
+## end gnulib module xmemdup0
+
+## begin gnulib module xsize
+
+libgnu_a_SOURCES += xsize.h xsize.c
+
+## end gnulib module xsize
+
+## begin gnulib module xstrndup
+
+libgnu_a_SOURCES += xstrndup.h xstrndup.c
+
+## end gnulib module xstrndup
+
+
+mostlyclean-local: mostlyclean-generic
+ @for dir in '' $(MOSTLYCLEANDIRS); do \
+ if test -n "$$dir" && test -d $$dir; then \
+ echo "rmdir $$dir"; rmdir $$dir; \
+ fi; \
+ done; \
+ :
diff --git a/lib/group-member.c b/lib/group-member.c
new file mode 100644
index 0000000..6a6fc56
--- /dev/null
+++ b/lib/group-member.c
@@ -0,0 +1,115 @@
+/* group-member.c -- determine whether group id is in calling user's group list
+
+ Copyright (C) 1994, 1997-1998, 2003, 2005-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "xalloc-oversized.h"
+
+/* Most processes have no more than this many groups, and for these
+ processes we can avoid using malloc. */
+enum { GROUPBUF_SIZE = 100 };
+
+struct group_info
+ {
+ gid_t *group;
+ gid_t groupbuf[GROUPBUF_SIZE];
+ };
+
+static void
+free_group_info (struct group_info const *g)
+{
+ if (g->group != g->groupbuf)
+ free (g->group);
+}
+
+static int
+get_group_info (struct group_info *gi)
+{
+ int n_groups = getgroups (GROUPBUF_SIZE, gi->groupbuf);
+ gi->group = gi->groupbuf;
+
+ if (n_groups < 0)
+ {
+ int n_group_slots = getgroups (0, NULL);
+ if (0 <= n_group_slots
+ && ! xalloc_oversized (n_group_slots, sizeof *gi->group))
+ {
+ gi->group = malloc (n_group_slots * sizeof *gi->group);
+ if (gi->group)
+ n_groups = getgroups (n_group_slots, gi->group);
+ }
+ }
+
+ /* In case of error, the user loses. */
+ return n_groups;
+}
+
+/* Return non-zero if GID is one that we have in our groups list.
+ Note that the groups list is not guaranteed to contain the current
+ or effective group ID, so they should generally be checked
+ separately. */
+
+int
+group_member (gid_t gid)
+{
+ int i;
+ int found;
+ struct group_info gi;
+ int n_groups = get_group_info (&gi);
+
+ /* Search through the list looking for GID. */
+ found = 0;
+ for (i = 0; i < n_groups; i++)
+ {
+ if (gid == gi.group[i])
+ {
+ found = 1;
+ break;
+ }
+ }
+
+ free_group_info (&gi);
+
+ return found;
+}
+
+#ifdef TEST
+
+int
+main (int argc, char **argv)
+{
+ int i;
+
+ for (i = 1; i < argc; i++)
+ {
+ gid_t gid;
+
+ gid = atoi (argv[i]);
+ printf ("%d: %s\n", gid, group_member (gid) ? "yes" : "no");
+ }
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/hard-locale.c b/lib/hard-locale.c
new file mode 100644
index 0000000..730e9be
--- /dev/null
+++ b/lib/hard-locale.c
@@ -0,0 +1,35 @@
+/* hard-locale.c -- Determine whether a locale is hard.
+
+ Copyright (C) 1997-1999, 2002-2004, 2006-2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "hard-locale.h"
+
+#include <locale.h>
+#include <string.h>
+
+bool
+hard_locale (int category)
+{
+ char locale[SETLOCALE_NULL_MAX];
+
+ if (setlocale_null_r (category, locale, sizeof (locale)))
+ return false;
+
+ return !(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0);
+}
diff --git a/lib/hard-locale.h b/lib/hard-locale.h
new file mode 100644
index 0000000..1886eaa
--- /dev/null
+++ b/lib/hard-locale.h
@@ -0,0 +1,28 @@
+/* Determine whether a locale is hard.
+
+ Copyright (C) 1999, 2003-2004, 2009-2020 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/>. */
+
+#ifndef HARD_LOCALE_H_
+# define HARD_LOCALE_H_ 1
+
+# include <stdbool.h>
+
+/* Return true if the specified CATEGORY of the current locale is hard, i.e.
+ different from the C or POSIX locale that has a fixed behavior.
+ CATEGORY must be one of the LC_* values, but not LC_ALL. */
+extern bool hard_locale (int category);
+
+#endif /* HARD_LOCALE_H_ */
diff --git a/lib/hash-pjw.c b/lib/hash-pjw.c
new file mode 100644
index 0000000..f9bedab
--- /dev/null
+++ b/lib/hash-pjw.c
@@ -0,0 +1,40 @@
+/* hash-pjw.c -- compute a hash value from a NUL-terminated string.
+
+ Copyright (C) 2001, 2003, 2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "hash-pjw.h"
+
+#include <limits.h>
+
+#define SIZE_BITS (sizeof (size_t) * CHAR_BIT)
+
+/* A hash function for NUL-terminated char* strings using
+ the method described by Bruno Haible.
+ See https://www.haible.de/bruno/hashfunc.html. */
+
+size_t
+hash_pjw (const void *x, size_t tablesize)
+{
+ const char *s;
+ size_t h = 0;
+
+ for (s = x; *s; s++)
+ h = *s + ((h << 9) | (h >> (SIZE_BITS - 9)));
+
+ return h % tablesize;
+}
diff --git a/lib/hash-pjw.h b/lib/hash-pjw.h
new file mode 100644
index 0000000..6e388fd
--- /dev/null
+++ b/lib/hash-pjw.h
@@ -0,0 +1,23 @@
+/* hash-pjw.h -- declaration for a simple hash function
+ Copyright (C) 2001, 2003, 2009-2020 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/>. */
+
+#include <stddef.h>
+
+/* Compute a hash code for a NUL-terminated string starting at X,
+ and return the hash code modulo TABLESIZE.
+ The result is platform dependent: it depends on the size of the 'size_t'
+ type and on the signedness of the 'char' type. */
+extern size_t hash_pjw (void const *x, size_t tablesize) _GL_ATTRIBUTE_PURE;
diff --git a/lib/hash-triple-simple.c b/lib/hash-triple-simple.c
new file mode 100644
index 0000000..98728f2
--- /dev/null
+++ b/lib/hash-triple-simple.c
@@ -0,0 +1,59 @@
+/* Hash functions for file-related triples: name, device, inode.
+ Copyright (C) 2007, 2009-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include "hash-triple.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hash-pjw.h"
+#include "same-inode.h"
+
+#define STREQ(a, b) (strcmp (a, b) == 0)
+
+/* Hash an F_triple, and *do* consider the file name. */
+size_t
+triple_hash (void const *x, size_t table_size)
+{
+ struct F_triple const *p = x;
+ size_t tmp = hash_pjw (p->name, table_size);
+
+ /* Ignoring the device number here should be fine. */
+ return (tmp ^ p->st_ino) % table_size;
+}
+
+/* Compare two F_triple structs. */
+bool
+triple_compare_ino_str (void const *x, void const *y)
+{
+ struct F_triple const *a = x;
+ struct F_triple const *b = y;
+ return (SAME_INODE (*a, *b) && STREQ (a->name, b->name)) ? true : false;
+}
+
+/* Free an F_triple. */
+void
+triple_free (void *x)
+{
+ struct F_triple *a = x;
+ free (a->name);
+ free (a);
+}
diff --git a/lib/hash-triple.h b/lib/hash-triple.h
new file mode 100644
index 0000000..16f5330
--- /dev/null
+++ b/lib/hash-triple.h
@@ -0,0 +1,46 @@
+/* Hash functions for file-related (name, device, inode) triples.
+ Copyright (C) 2007-2020 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/>. */
+
+/* Written by Jim Meyering, 2007. */
+
+#ifndef HASH_TRIPLE_H
+#define HASH_TRIPLE_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdbool.h>
+
+/* Describe a just-created or just-renamed destination file. */
+struct F_triple
+{
+ char *name;
+ ino_t st_ino;
+ dev_t st_dev;
+};
+
+/* Defined in module 'hash-triple-simple'. */
+
+extern size_t triple_hash (void const *x, size_t table_size) _GL_ATTRIBUTE_PURE;
+extern bool triple_compare_ino_str (void const *x, void const *y)
+ _GL_ATTRIBUTE_PURE;
+extern void triple_free (void *x);
+
+/* Defined in module 'hash-triple'. */
+extern size_t triple_hash_no_name (void const *x, size_t table_size)
+ _GL_ATTRIBUTE_PURE;
+extern bool triple_compare (void const *x, void const *y);
+
+#endif
diff --git a/lib/hash.c b/lib/hash.c
new file mode 100644
index 0000000..e5ae96c
--- /dev/null
+++ b/lib/hash.c
@@ -0,0 +1,1106 @@
+/* hash - hashing table processing.
+
+ Copyright (C) 1998-2004, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+
+ Written by Jim Meyering, 1992.
+
+ 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/>. */
+
+/* A generic hash table package. */
+
+/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead
+ of malloc. If you change USE_OBSTACK, you have to recompile! */
+
+#include <config.h>
+
+#include "hash.h"
+
+#include "bitrotate.h"
+#include "xalloc-oversized.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if USE_OBSTACK
+# include "obstack.h"
+# ifndef obstack_chunk_alloc
+# define obstack_chunk_alloc malloc
+# endif
+# ifndef obstack_chunk_free
+# define obstack_chunk_free free
+# endif
+#endif
+
+struct hash_entry
+ {
+ void *data;
+ struct hash_entry *next;
+ };
+
+struct hash_table
+ {
+ /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1,
+ for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets
+ are not empty, there are N_ENTRIES active entries in the table. */
+ struct hash_entry *bucket;
+ struct hash_entry const *bucket_limit;
+ size_t n_buckets;
+ size_t n_buckets_used;
+ size_t n_entries;
+
+ /* Tuning arguments, kept in a physically separate structure. */
+ const Hash_tuning *tuning;
+
+ /* Three functions are given to 'hash_initialize', see the documentation
+ block for this function. In a word, HASHER randomizes a user entry
+ into a number up from 0 up to some maximum minus 1; COMPARATOR returns
+ true if two user entries compare equally; and DATA_FREER is the cleanup
+ function for a user entry. */
+ Hash_hasher hasher;
+ Hash_comparator comparator;
+ Hash_data_freer data_freer;
+
+ /* A linked list of freed struct hash_entry structs. */
+ struct hash_entry *free_entry_list;
+
+#if USE_OBSTACK
+ /* Whenever obstacks are used, it is possible to allocate all overflowed
+ entries into a single stack, so they all can be freed in a single
+ operation. It is not clear if the speedup is worth the trouble. */
+ struct obstack entry_stack;
+#endif
+ };
+
+/* A hash table contains many internal entries, each holding a pointer to
+ some user-provided data (also called a user entry). An entry indistinctly
+ refers to both the internal entry and its associated user entry. A user
+ entry contents may be hashed by a randomization function (the hashing
+ function, or just "hasher" for short) into a number (or "slot") between 0
+ and the current table size. At each slot position in the hash table,
+ starts a linked chain of entries for which the user data all hash to this
+ slot. A bucket is the collection of all entries hashing to the same slot.
+
+ A good "hasher" function will distribute entries rather evenly in buckets.
+ In the ideal case, the length of each bucket is roughly the number of
+ entries divided by the table size. Finding the slot for a data is usually
+ done in constant time by the "hasher", and the later finding of a precise
+ entry is linear in time with the size of the bucket. Consequently, a
+ larger hash table size (that is, a larger number of buckets) is prone to
+ yielding shorter chains, *given* the "hasher" function behaves properly.
+
+ Long buckets slow down the lookup algorithm. One might use big hash table
+ sizes in hope to reduce the average length of buckets, but this might
+ become inordinate, as unused slots in the hash table take some space. The
+ best bet is to make sure you are using a good "hasher" function (beware
+ that those are not that easy to write! :-), and to use a table size
+ larger than the actual number of entries. */
+
+/* If an insertion makes the ratio of nonempty buckets to table size larger
+ than the growth threshold (a number between 0.0 and 1.0), then increase
+ the table size by multiplying by the growth factor (a number greater than
+ 1.0). The growth threshold defaults to 0.8, and the growth factor
+ defaults to 1.414, meaning that the table will have doubled its size
+ every second time 80% of the buckets get used. */
+#define DEFAULT_GROWTH_THRESHOLD 0.8f
+#define DEFAULT_GROWTH_FACTOR 1.414f
+
+/* If a deletion empties a bucket and causes the ratio of used buckets to
+ table size to become smaller than the shrink threshold (a number between
+ 0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a
+ number greater than the shrink threshold but smaller than 1.0). The shrink
+ threshold and factor default to 0.0 and 1.0, meaning that the table never
+ shrinks. */
+#define DEFAULT_SHRINK_THRESHOLD 0.0f
+#define DEFAULT_SHRINK_FACTOR 1.0f
+
+/* Use this to initialize or reset a TUNING structure to
+ some sensible values. */
+static const Hash_tuning default_tuning =
+ {
+ DEFAULT_SHRINK_THRESHOLD,
+ DEFAULT_SHRINK_FACTOR,
+ DEFAULT_GROWTH_THRESHOLD,
+ DEFAULT_GROWTH_FACTOR,
+ false
+ };
+
+/* Information and lookup. */
+
+size_t
+hash_get_n_buckets (const Hash_table *table)
+{
+ return table->n_buckets;
+}
+
+size_t
+hash_get_n_buckets_used (const Hash_table *table)
+{
+ return table->n_buckets_used;
+}
+
+size_t
+hash_get_n_entries (const Hash_table *table)
+{
+ return table->n_entries;
+}
+
+size_t
+hash_get_max_bucket_length (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t max_bucket_length = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+ size_t bucket_length = 1;
+
+ while (cursor = cursor->next, cursor)
+ bucket_length++;
+
+ if (bucket_length > max_bucket_length)
+ max_bucket_length = bucket_length;
+ }
+ }
+
+ return max_bucket_length;
+}
+
+bool
+hash_table_ok (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+ size_t n_buckets_used = 0;
+ size_t n_entries = 0;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry const *cursor = bucket;
+
+ /* Count bucket head. */
+ n_buckets_used++;
+ n_entries++;
+
+ /* Count bucket overflow. */
+ while (cursor = cursor->next, cursor)
+ n_entries++;
+ }
+ }
+
+ if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries)
+ return true;
+
+ return false;
+}
+
+void
+hash_print_statistics (const Hash_table *table, FILE *stream)
+{
+ size_t n_entries = hash_get_n_entries (table);
+ size_t n_buckets = hash_get_n_buckets (table);
+ size_t n_buckets_used = hash_get_n_buckets_used (table);
+ size_t max_bucket_length = hash_get_max_bucket_length (table);
+
+ fprintf (stream, "# entries: %lu\n", (unsigned long int) n_entries);
+ fprintf (stream, "# buckets: %lu\n", (unsigned long int) n_buckets);
+ fprintf (stream, "# buckets used: %lu (%.2f%%)\n",
+ (unsigned long int) n_buckets_used,
+ (100.0 * n_buckets_used) / n_buckets);
+ fprintf (stream, "max bucket length: %lu\n",
+ (unsigned long int) max_bucket_length);
+}
+
+/* Hash KEY and return a pointer to the selected bucket.
+ If TABLE->hasher misbehaves, abort. */
+static struct hash_entry *
+safe_hasher (const Hash_table *table, const void *key)
+{
+ size_t n = table->hasher (key, table->n_buckets);
+ if (! (n < table->n_buckets))
+ abort ();
+ return table->bucket + n;
+}
+
+void *
+hash_lookup (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket = safe_hasher (table, entry);
+ struct hash_entry const *cursor;
+
+ if (bucket->data == NULL)
+ return NULL;
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ if (entry == cursor->data || table->comparator (entry, cursor->data))
+ return cursor->data;
+
+ return NULL;
+}
+
+/* Walking. */
+
+void *
+hash_get_first (const Hash_table *table)
+{
+ struct hash_entry const *bucket;
+
+ if (table->n_entries == 0)
+ return NULL;
+
+ for (bucket = table->bucket; ; bucket++)
+ if (! (bucket < table->bucket_limit))
+ abort ();
+ else if (bucket->data)
+ return bucket->data;
+}
+
+void *
+hash_get_next (const Hash_table *table, const void *entry)
+{
+ struct hash_entry const *bucket = safe_hasher (table, entry);
+ struct hash_entry const *cursor;
+
+ /* Find next entry in the same bucket. */
+ cursor = bucket;
+ do
+ {
+ if (cursor->data == entry && cursor->next)
+ return cursor->next->data;
+ cursor = cursor->next;
+ }
+ while (cursor != NULL);
+
+ /* Find first entry in any subsequent bucket. */
+ while (++bucket < table->bucket_limit)
+ if (bucket->data)
+ return bucket->data;
+
+ /* None found. */
+ return NULL;
+}
+
+size_t
+hash_get_entries (const Hash_table *table, void **buffer,
+ size_t buffer_size)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (counter >= buffer_size)
+ return counter;
+ buffer[counter++] = cursor->data;
+ }
+ }
+ }
+
+ return counter;
+}
+
+size_t
+hash_do_for_each (const Hash_table *table, Hash_processor processor,
+ void *processor_data)
+{
+ size_t counter = 0;
+ struct hash_entry const *bucket;
+ struct hash_entry const *cursor;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ if (! processor (cursor->data, processor_data))
+ return counter;
+ counter++;
+ }
+ }
+ }
+
+ return counter;
+}
+
+/* Allocation and clean-up. */
+
+#if USE_DIFF_HASH
+
+/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see
+ B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm,
+ Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash
+ algorithms tend to be domain-specific, so what's good for [diffutils'] io.c
+ may not be good for your application." */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+# define HASH_ONE_CHAR(Value, Byte) \
+ ((Byte) + rotl_sz (Value, 7))
+
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = HASH_ONE_CHAR (value, ch);
+ return value % n_buckets;
+
+# undef HASH_ONE_CHAR
+}
+
+#else /* not USE_DIFF_HASH */
+
+/* This one comes from 'recode', and performs a bit better than the above as
+ per a few experiments. It is inspired from a hashing routine found in the
+ very old Cyber 'snoop', itself written in typical Greg Mansfield style.
+ (By the way, what happened to this excellent man? Is he still alive?) */
+
+size_t
+hash_string (const char *string, size_t n_buckets)
+{
+ size_t value = 0;
+ unsigned char ch;
+
+ for (; (ch = *string); string++)
+ value = (value * 31 + ch) % n_buckets;
+ return value;
+}
+
+#endif /* not USE_DIFF_HASH */
+
+/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd
+ number at least equal to 11. */
+
+static bool _GL_ATTRIBUTE_CONST
+is_prime (size_t candidate)
+{
+ size_t divisor = 3;
+ size_t square = divisor * divisor;
+
+ while (square < candidate && (candidate % divisor))
+ {
+ divisor++;
+ square += 4 * divisor;
+ divisor++;
+ }
+
+ return (candidate % divisor ? true : false);
+}
+
+/* Round a given CANDIDATE number up to the nearest prime, and return that
+ prime. Primes lower than 10 are merely skipped. */
+
+static size_t _GL_ATTRIBUTE_CONST
+next_prime (size_t candidate)
+{
+ /* Skip small primes. */
+ if (candidate < 10)
+ candidate = 10;
+
+ /* Make it definitely odd. */
+ candidate |= 1;
+
+ while (SIZE_MAX != candidate && !is_prime (candidate))
+ candidate += 2;
+
+ return candidate;
+}
+
+void
+hash_reset_tuning (Hash_tuning *tuning)
+{
+ *tuning = default_tuning;
+}
+
+/* If the user passes a NULL hasher, we hash the raw pointer. */
+static size_t
+raw_hasher (const void *data, size_t n)
+{
+ /* When hashing unique pointers, it is often the case that they were
+ generated by malloc and thus have the property that the low-order
+ bits are 0. As this tends to give poorer performance with small
+ tables, we rotate the pointer value before performing division,
+ in an attempt to improve hash quality. */
+ size_t val = rotr_sz ((size_t) data, 3);
+ return val % n;
+}
+
+/* If the user passes a NULL comparator, we use pointer comparison. */
+static bool
+raw_comparator (const void *a, const void *b)
+{
+ return a == b;
+}
+
+
+/* For the given hash TABLE, check the user supplied tuning structure for
+ reasonable values, and return true if there is no gross error with it.
+ Otherwise, definitively reset the TUNING field to some acceptable default
+ in the hash table (that is, the user loses the right of further modifying
+ tuning arguments), and return false. */
+
+static bool
+check_tuning (Hash_table *table)
+{
+ const Hash_tuning *tuning = table->tuning;
+ float epsilon;
+ if (tuning == &default_tuning)
+ return true;
+
+ /* Be a bit stricter than mathematics would require, so that
+ rounding errors in size calculations do not cause allocations to
+ fail to grow or shrink as they should. The smallest allocation
+ is 11 (due to next_prime's algorithm), so an epsilon of 0.1
+ should be good enough. */
+ epsilon = 0.1f;
+
+ if (epsilon < tuning->growth_threshold
+ && tuning->growth_threshold < 1 - epsilon
+ && 1 + epsilon < tuning->growth_factor
+ && 0 <= tuning->shrink_threshold
+ && tuning->shrink_threshold + epsilon < tuning->shrink_factor
+ && tuning->shrink_factor <= 1
+ && tuning->shrink_threshold + epsilon < tuning->growth_threshold)
+ return true;
+
+ table->tuning = &default_tuning;
+ return false;
+}
+
+/* Compute the size of the bucket array for the given CANDIDATE and
+ TUNING, or return 0 if there is no possible way to allocate that
+ many entries. */
+
+static size_t _GL_ATTRIBUTE_PURE
+compute_bucket_size (size_t candidate, const Hash_tuning *tuning)
+{
+ if (!tuning->is_n_buckets)
+ {
+ float new_candidate = candidate / tuning->growth_threshold;
+ if ((float) SIZE_MAX <= new_candidate)
+ return 0;
+ candidate = new_candidate;
+ }
+ candidate = next_prime (candidate);
+ if (xalloc_oversized (candidate, sizeof (struct hash_entry *)))
+ return 0;
+ return candidate;
+}
+
+Hash_table *
+hash_initialize (size_t candidate, const Hash_tuning *tuning,
+ Hash_hasher hasher, Hash_comparator comparator,
+ Hash_data_freer data_freer)
+{
+ Hash_table *table;
+
+ if (hasher == NULL)
+ hasher = raw_hasher;
+ if (comparator == NULL)
+ comparator = raw_comparator;
+
+ table = malloc (sizeof *table);
+ if (table == NULL)
+ return NULL;
+
+ if (!tuning)
+ tuning = &default_tuning;
+ table->tuning = tuning;
+ if (!check_tuning (table))
+ {
+ /* Fail if the tuning options are invalid. This is the only occasion
+ when the user gets some feedback about it. Once the table is created,
+ if the user provides invalid tuning options, we silently revert to
+ using the defaults, and ignore further request to change the tuning
+ options. */
+ goto fail;
+ }
+
+ table->n_buckets = compute_bucket_size (candidate, tuning);
+ if (!table->n_buckets)
+ goto fail;
+
+ table->bucket = calloc (table->n_buckets, sizeof *table->bucket);
+ if (table->bucket == NULL)
+ goto fail;
+ table->bucket_limit = table->bucket + table->n_buckets;
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+
+ table->hasher = hasher;
+ table->comparator = comparator;
+ table->data_freer = data_freer;
+
+ table->free_entry_list = NULL;
+#if USE_OBSTACK
+ obstack_init (&table->entry_stack);
+#endif
+ return table;
+
+ fail:
+ free (table);
+ return NULL;
+}
+
+void
+hash_clear (Hash_table *table)
+{
+ struct hash_entry *bucket;
+
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Free the bucket overflow. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ if (table->data_freer)
+ table->data_freer (cursor->data);
+ cursor->data = NULL;
+
+ next = cursor->next;
+ /* Relinking is done one entry at a time, as it is to be expected
+ that overflows are either rare or short. */
+ cursor->next = table->free_entry_list;
+ table->free_entry_list = cursor;
+ }
+
+ /* Free the bucket head. */
+ if (table->data_freer)
+ table->data_freer (bucket->data);
+ bucket->data = NULL;
+ bucket->next = NULL;
+ }
+ }
+
+ table->n_buckets_used = 0;
+ table->n_entries = 0;
+}
+
+void
+hash_free (Hash_table *table)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+
+ /* Call the user data_freer function. */
+ if (table->data_freer && table->n_entries)
+ {
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ if (bucket->data)
+ {
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ table->data_freer (cursor->data);
+ }
+ }
+ }
+
+#if USE_OBSTACK
+
+ obstack_free (&table->entry_stack, NULL);
+
+#else
+
+ /* Free all bucket overflowed entries. */
+ for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
+ {
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+ }
+
+ /* Also reclaim the internal list of previously freed entries. */
+ for (cursor = table->free_entry_list; cursor; cursor = next)
+ {
+ next = cursor->next;
+ free (cursor);
+ }
+
+#endif
+
+ /* Free the remainder of the hash table structure. */
+ free (table->bucket);
+ free (table);
+}
+
+/* Insertion and deletion. */
+
+/* Get a new hash entry for a bucket overflow, possibly by recycling a
+ previously freed one. If this is not possible, allocate a new one. */
+
+static struct hash_entry *
+allocate_entry (Hash_table *table)
+{
+ struct hash_entry *new;
+
+ if (table->free_entry_list)
+ {
+ new = table->free_entry_list;
+ table->free_entry_list = new->next;
+ }
+ else
+ {
+#if USE_OBSTACK
+ new = obstack_alloc (&table->entry_stack, sizeof *new);
+#else
+ new = malloc (sizeof *new);
+#endif
+ }
+
+ return new;
+}
+
+/* Free a hash entry which was part of some bucket overflow,
+ saving it for later recycling. */
+
+static void
+free_entry (Hash_table *table, struct hash_entry *entry)
+{
+ entry->data = NULL;
+ entry->next = table->free_entry_list;
+ table->free_entry_list = entry;
+}
+
+/* This private function is used to help with insertion and deletion. When
+ ENTRY matches an entry in the table, return a pointer to the corresponding
+ user data and set *BUCKET_HEAD to the head of the selected bucket.
+ Otherwise, return NULL. When DELETE is true and ENTRY matches an entry in
+ the table, unlink the matching entry. */
+
+static void *
+hash_find_entry (Hash_table *table, const void *entry,
+ struct hash_entry **bucket_head, bool delete)
+{
+ struct hash_entry *bucket = safe_hasher (table, entry);
+ struct hash_entry *cursor;
+
+ *bucket_head = bucket;
+
+ /* Test for empty bucket. */
+ if (bucket->data == NULL)
+ return NULL;
+
+ /* See if the entry is the first in the bucket. */
+ if (entry == bucket->data || table->comparator (entry, bucket->data))
+ {
+ void *data = bucket->data;
+
+ if (delete)
+ {
+ if (bucket->next)
+ {
+ struct hash_entry *next = bucket->next;
+
+ /* Bump the first overflow entry into the bucket head, then save
+ the previous first overflow entry for later recycling. */
+ *bucket = *next;
+ free_entry (table, next);
+ }
+ else
+ {
+ bucket->data = NULL;
+ }
+ }
+
+ return data;
+ }
+
+ /* Scan the bucket overflow. */
+ for (cursor = bucket; cursor->next; cursor = cursor->next)
+ {
+ if (entry == cursor->next->data
+ || table->comparator (entry, cursor->next->data))
+ {
+ void *data = cursor->next->data;
+
+ if (delete)
+ {
+ struct hash_entry *next = cursor->next;
+
+ /* Unlink the entry to delete, then save the freed entry for later
+ recycling. */
+ cursor->next = next->next;
+ free_entry (table, next);
+ }
+
+ return data;
+ }
+ }
+
+ /* No entry found. */
+ return NULL;
+}
+
+/* Internal helper, to move entries from SRC to DST. Both tables must
+ share the same free entry list. If SAFE, only move overflow
+ entries, saving bucket heads for later, so that no allocations will
+ occur. Return false if the free entry list is exhausted and an
+ allocation fails. */
+
+static bool
+transfer_entries (Hash_table *dst, Hash_table *src, bool safe)
+{
+ struct hash_entry *bucket;
+ struct hash_entry *cursor;
+ struct hash_entry *next;
+ for (bucket = src->bucket; bucket < src->bucket_limit; bucket++)
+ if (bucket->data)
+ {
+ void *data;
+ struct hash_entry *new_bucket;
+
+ /* Within each bucket, transfer overflow entries first and
+ then the bucket head, to minimize memory pressure. After
+ all, the only time we might allocate is when moving the
+ bucket head, but moving overflow entries first may create
+ free entries that can be recycled by the time we finally
+ get to the bucket head. */
+ for (cursor = bucket->next; cursor; cursor = next)
+ {
+ data = cursor->data;
+ new_bucket = safe_hasher (dst, data);
+
+ next = cursor->next;
+
+ if (new_bucket->data)
+ {
+ /* Merely relink an existing entry, when moving from a
+ bucket overflow into a bucket overflow. */
+ cursor->next = new_bucket->next;
+ new_bucket->next = cursor;
+ }
+ else
+ {
+ /* Free an existing entry, when moving from a bucket
+ overflow into a bucket header. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ free_entry (dst, cursor);
+ }
+ }
+ /* Now move the bucket head. Be sure that if we fail due to
+ allocation failure that the src table is in a consistent
+ state. */
+ data = bucket->data;
+ bucket->next = NULL;
+ if (safe)
+ continue;
+ new_bucket = safe_hasher (dst, data);
+
+ if (new_bucket->data)
+ {
+ /* Allocate or recycle an entry, when moving from a bucket
+ header into a bucket overflow. */
+ struct hash_entry *new_entry = allocate_entry (dst);
+
+ if (new_entry == NULL)
+ return false;
+
+ new_entry->data = data;
+ new_entry->next = new_bucket->next;
+ new_bucket->next = new_entry;
+ }
+ else
+ {
+ /* Move from one bucket header to another. */
+ new_bucket->data = data;
+ dst->n_buckets_used++;
+ }
+ bucket->data = NULL;
+ src->n_buckets_used--;
+ }
+ return true;
+}
+
+bool
+hash_rehash (Hash_table *table, size_t candidate)
+{
+ Hash_table storage;
+ Hash_table *new_table;
+ size_t new_size = compute_bucket_size (candidate, table->tuning);
+
+ if (!new_size)
+ return false;
+ if (new_size == table->n_buckets)
+ return true;
+ new_table = &storage;
+ new_table->bucket = calloc (new_size, sizeof *new_table->bucket);
+ if (new_table->bucket == NULL)
+ return false;
+ new_table->n_buckets = new_size;
+ new_table->bucket_limit = new_table->bucket + new_size;
+ new_table->n_buckets_used = 0;
+ new_table->n_entries = 0;
+ new_table->tuning = table->tuning;
+ new_table->hasher = table->hasher;
+ new_table->comparator = table->comparator;
+ new_table->data_freer = table->data_freer;
+
+ /* In order for the transfer to successfully complete, we need
+ additional overflow entries when distinct buckets in the old
+ table collide into a common bucket in the new table. The worst
+ case possible is a hasher that gives a good spread with the old
+ size, but returns a constant with the new size; if we were to
+ guarantee table->n_buckets_used-1 free entries in advance, then
+ the transfer would be guaranteed to not allocate memory.
+ However, for large tables, a guarantee of no further allocation
+ introduces a lot of extra memory pressure, all for an unlikely
+ corner case (most rehashes reduce, rather than increase, the
+ number of overflow entries needed). So, we instead ensure that
+ the transfer process can be reversed if we hit a memory
+ allocation failure mid-transfer. */
+
+ /* Merely reuse the extra old space into the new table. */
+#if USE_OBSTACK
+ new_table->entry_stack = table->entry_stack;
+#endif
+ new_table->free_entry_list = table->free_entry_list;
+
+ if (transfer_entries (new_table, table, false))
+ {
+ /* Entries transferred successfully; tie up the loose ends. */
+ free (table->bucket);
+ table->bucket = new_table->bucket;
+ table->bucket_limit = new_table->bucket_limit;
+ table->n_buckets = new_table->n_buckets;
+ table->n_buckets_used = new_table->n_buckets_used;
+ table->free_entry_list = new_table->free_entry_list;
+ /* table->n_entries and table->entry_stack already hold their value. */
+ return true;
+ }
+
+ /* We've allocated new_table->bucket (and possibly some entries),
+ exhausted the free list, and moved some but not all entries into
+ new_table. We must undo the partial move before returning
+ failure. The only way to get into this situation is if new_table
+ uses fewer buckets than the old table, so we will reclaim some
+ free entries as overflows in the new table are put back into
+ distinct buckets in the old table.
+
+ There are some pathological cases where a single pass through the
+ table requires more intermediate overflow entries than using two
+ passes. Two passes give worse cache performance and takes
+ longer, but at this point, we're already out of memory, so slow
+ and safe is better than failure. */
+ table->free_entry_list = new_table->free_entry_list;
+ if (! (transfer_entries (table, new_table, true)
+ && transfer_entries (table, new_table, false)))
+ abort ();
+ /* table->n_entries already holds its value. */
+ free (new_table->bucket);
+ return false;
+}
+
+int
+hash_insert_if_absent (Hash_table *table, void const *entry,
+ void const **matched_ent)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ /* The caller cannot insert a NULL entry, since hash_lookup returns NULL
+ to indicate "not found", and hash_find_entry uses "bucket->data == NULL"
+ to indicate an empty bucket. */
+ if (! entry)
+ abort ();
+
+ /* If there's a matching entry already in the table, return that. */
+ if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
+ {
+ if (matched_ent)
+ *matched_ent = data;
+ return 0;
+ }
+
+ /* If the growth threshold of the buckets in use has been reached, increase
+ the table size and rehash. There's no point in checking the number of
+ entries: if the hashing function is ill-conditioned, rehashing is not
+ likely to improve it. */
+
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ > table->tuning->growth_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ float candidate =
+ (tuning->is_n_buckets
+ ? (table->n_buckets * tuning->growth_factor)
+ : (table->n_buckets * tuning->growth_factor
+ * tuning->growth_threshold));
+
+ if ((float) SIZE_MAX <= candidate)
+ return -1;
+
+ /* If the rehash fails, arrange to return NULL. */
+ if (!hash_rehash (table, candidate))
+ return -1;
+
+ /* Update the bucket we are interested in. */
+ if (hash_find_entry (table, entry, &bucket, false) != NULL)
+ abort ();
+ }
+ }
+
+ /* ENTRY is not matched, it should be inserted. */
+
+ if (bucket->data)
+ {
+ struct hash_entry *new_entry = allocate_entry (table);
+
+ if (new_entry == NULL)
+ return -1;
+
+ /* Add ENTRY in the overflow of the bucket. */
+
+ new_entry->data = (void *) entry;
+ new_entry->next = bucket->next;
+ bucket->next = new_entry;
+ table->n_entries++;
+ return 1;
+ }
+
+ /* Add ENTRY right in the bucket head. */
+
+ bucket->data = (void *) entry;
+ table->n_entries++;
+ table->n_buckets_used++;
+
+ return 1;
+}
+
+void *
+hash_insert (Hash_table *table, void const *entry)
+{
+ void const *matched_ent;
+ int err = hash_insert_if_absent (table, entry, &matched_ent);
+ return (err == -1
+ ? NULL
+ : (void *) (err == 0 ? matched_ent : entry));
+}
+
+void *
+hash_remove (Hash_table *table, const void *entry)
+{
+ void *data;
+ struct hash_entry *bucket;
+
+ data = hash_find_entry (table, entry, &bucket, true);
+ if (!data)
+ return NULL;
+
+ table->n_entries--;
+ if (!bucket->data)
+ {
+ table->n_buckets_used--;
+
+ /* If the shrink threshold of the buckets in use has been reached,
+ rehash into a smaller table. */
+
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ /* Check more fully, before starting real work. If tuning arguments
+ became invalid, the second check will rely on proper defaults. */
+ check_tuning (table);
+ if (table->n_buckets_used
+ < table->tuning->shrink_threshold * table->n_buckets)
+ {
+ const Hash_tuning *tuning = table->tuning;
+ size_t candidate =
+ (tuning->is_n_buckets
+ ? table->n_buckets * tuning->shrink_factor
+ : (table->n_buckets * tuning->shrink_factor
+ * tuning->growth_threshold));
+
+ if (!hash_rehash (table, candidate))
+ {
+ /* Failure to allocate memory in an attempt to
+ shrink the table is not fatal. But since memory
+ is low, we can at least be kind and free any
+ spare entries, rather than keeping them tied up
+ in the free entry list. */
+#if ! USE_OBSTACK
+ struct hash_entry *cursor = table->free_entry_list;
+ struct hash_entry *next;
+ while (cursor)
+ {
+ next = cursor->next;
+ free (cursor);
+ cursor = next;
+ }
+ table->free_entry_list = NULL;
+#endif
+ }
+ }
+ }
+ }
+
+ return data;
+}
+
+void *
+hash_delete (Hash_table *table, const void *entry)
+{
+ return hash_remove (table, entry);
+}
+
+/* Testing. */
+
+#if TESTING
+
+void
+hash_print (const Hash_table *table)
+{
+ struct hash_entry *bucket = (struct hash_entry *) table->bucket;
+
+ for ( ; bucket < table->bucket_limit; bucket++)
+ {
+ struct hash_entry *cursor;
+
+ if (bucket)
+ printf ("%lu:\n", (unsigned long int) (bucket - table->bucket));
+
+ for (cursor = bucket; cursor; cursor = cursor->next)
+ {
+ char const *s = cursor->data;
+ /* FIXME */
+ if (s)
+ printf (" %s\n", s);
+ }
+ }
+}
+
+#endif /* TESTING */
diff --git a/lib/hash.h b/lib/hash.h
new file mode 100644
index 0000000..e280adb
--- /dev/null
+++ b/lib/hash.h
@@ -0,0 +1,261 @@
+/* hash - hashing table processing.
+ Copyright (C) 1998-1999, 2001, 2003, 2009-2020 Free Software Foundation,
+ Inc.
+ Written by Jim Meyering <meyering@ascend.com>, 1998.
+
+ 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/>. */
+
+/* A generic hash table package. */
+
+/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use
+ obstacks instead of malloc, and recompile 'hash.c' with same setting. */
+
+#ifndef HASH_H_
+# define HASH_H_
+
+# include <stdio.h>
+# include <stdbool.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+struct hash_tuning
+ {
+ /* This structure is mainly used for 'hash_initialize', see the block
+ documentation of 'hash_reset_tuning' for more complete comments. */
+
+ float shrink_threshold; /* ratio of used buckets to trigger a shrink */
+ float shrink_factor; /* ratio of new smaller size to original size */
+ float growth_threshold; /* ratio of used buckets to trigger a growth */
+ float growth_factor; /* ratio of new bigger size to original size */
+ bool is_n_buckets; /* if CANDIDATE really means table size */
+ };
+
+typedef struct hash_tuning Hash_tuning;
+
+struct hash_table;
+
+typedef struct hash_table Hash_table;
+
+/*
+ * Information and lookup.
+ */
+
+/* The following few functions provide information about the overall hash
+ table organization: the number of entries, number of buckets and maximum
+ length of buckets. */
+
+/* Return the number of buckets in the hash table. The table size, the total
+ number of buckets (used plus unused), or the maximum number of slots, are
+ the same quantity. */
+extern size_t hash_get_n_buckets (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+/* Return the number of slots in use (non-empty buckets). */
+extern size_t hash_get_n_buckets_used (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+/* Return the number of active entries. */
+extern size_t hash_get_n_entries (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+/* Return the length of the longest chain (bucket). */
+extern size_t hash_get_max_bucket_length (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+/* Do a mild validation of a hash table, by traversing it and checking two
+ statistics. */
+extern bool hash_table_ok (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+extern void hash_print_statistics (const Hash_table *table, FILE *stream);
+
+/* If ENTRY matches an entry already in the hash table, return the
+ entry from the table. Otherwise, return NULL. */
+extern void *hash_lookup (const Hash_table *table, const void *entry);
+
+/*
+ * Walking.
+ */
+
+/* The functions in this page traverse the hash table and process the
+ contained entries. For the traversal to work properly, the hash table
+ should not be resized nor modified while any particular entry is being
+ processed. In particular, entries should not be added, and an entry
+ may be removed only if there is no shrink threshold and the entry being
+ removed has already been passed to hash_get_next. */
+
+/* Return the first data in the table, or NULL if the table is empty. */
+extern void *hash_get_first (const Hash_table *table)
+ _GL_ATTRIBUTE_PURE;
+
+/* Return the user data for the entry following ENTRY, where ENTRY has been
+ returned by a previous call to either 'hash_get_first' or 'hash_get_next'.
+ Return NULL if there are no more entries. */
+extern void *hash_get_next (const Hash_table *table, const void *entry);
+
+/* Fill BUFFER with pointers to active user entries in the hash table, then
+ return the number of pointers copied. Do not copy more than BUFFER_SIZE
+ pointers. */
+extern size_t hash_get_entries (const Hash_table *table, void **buffer,
+ size_t buffer_size);
+
+typedef bool (*Hash_processor) (void *entry, void *processor_data);
+
+/* Call a PROCESSOR function for each entry of a hash table, and return the
+ number of entries for which the processor function returned success. A
+ pointer to some PROCESSOR_DATA which will be made available to each call to
+ the processor function. The PROCESSOR accepts two arguments: the first is
+ the user entry being walked into, the second is the value of PROCESSOR_DATA
+ as received. The walking continue for as long as the PROCESSOR function
+ returns nonzero. When it returns zero, the walking is interrupted. */
+extern size_t hash_do_for_each (const Hash_table *table,
+ Hash_processor processor, void *processor_data);
+
+/*
+ * Allocation and clean-up.
+ */
+
+/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1.
+ This is a convenience routine for constructing other hashing functions. */
+extern size_t hash_string (const char *string, size_t n_buckets)
+ _GL_ATTRIBUTE_PURE;
+
+extern void hash_reset_tuning (Hash_tuning *tuning);
+
+typedef size_t (*Hash_hasher) (const void *entry, size_t table_size);
+typedef bool (*Hash_comparator) (const void *entry1, const void *entry2);
+typedef void (*Hash_data_freer) (void *entry);
+
+/* Allocate and return a new hash table, or NULL upon failure. The initial
+ number of buckets is automatically selected so as to _guarantee_ that you
+ may insert at least CANDIDATE different user entries before any growth of
+ the hash table size occurs. So, if have a reasonably tight a-priori upper
+ bound on the number of entries you intend to insert in the hash table, you
+ may save some table memory and insertion time, by specifying it here. If
+ the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE
+ argument has its meaning changed to the wanted number of buckets.
+
+ TUNING points to a structure of user-supplied values, in case some fine
+ tuning is wanted over the default behavior of the hasher. If TUNING is
+ NULL, the default tuning parameters are used instead. If TUNING is
+ provided but the values requested are out of bounds or might cause
+ rounding errors, return NULL.
+
+ The user-supplied HASHER function, when not NULL, accepts two
+ arguments ENTRY and TABLE_SIZE. It computes, by hashing ENTRY contents, a
+ slot number for that entry which should be in the range 0..TABLE_SIZE-1.
+ This slot number is then returned.
+
+ The user-supplied COMPARATOR function, when not NULL, accepts two
+ arguments pointing to user data, it then returns true for a pair of entries
+ that compare equal, or false otherwise. This function is internally called
+ on entries which are already known to hash to the same bucket index,
+ but which are distinct pointers.
+
+ The user-supplied DATA_FREER function, when not NULL, may be later called
+ with the user data as an argument, just before the entry containing the
+ data gets freed. This happens from within 'hash_free' or 'hash_clear'.
+ You should specify this function only if you want these functions to free
+ all of your 'data' data. This is typically the case when your data is
+ simply an auxiliary struct that you have malloc'd to aggregate several
+ values. */
+extern Hash_table *hash_initialize (size_t candidate,
+ const Hash_tuning *tuning,
+ Hash_hasher hasher,
+ Hash_comparator comparator,
+ Hash_data_freer data_freer)
+ _GL_ATTRIBUTE_NODISCARD;
+
+/* Same as hash_initialize, but invokes xalloc_die on memory exhaustion. */
+/* This function is defined by module 'xhash'. */
+extern Hash_table *hash_xinitialize (size_t candidate,
+ const Hash_tuning *tuning,
+ Hash_hasher hasher,
+ Hash_comparator comparator,
+ Hash_data_freer data_freer)
+ _GL_ATTRIBUTE_NODISCARD;
+
+/* Make all buckets empty, placing any chained entries on the free list.
+ Apply the user-specified function data_freer (if any) to the datas of any
+ affected entries. */
+extern void hash_clear (Hash_table *table);
+
+/* Reclaim all storage associated with a hash table. If a data_freer
+ function has been supplied by the user when the hash table was created,
+ this function applies it to the data of each entry before freeing that
+ entry. */
+extern void hash_free (Hash_table *table);
+
+/*
+ * Insertion and deletion.
+ */
+
+/* For an already existing hash table, change the number of buckets through
+ specifying CANDIDATE. The contents of the hash table are preserved. The
+ new number of buckets is automatically selected so as to _guarantee_ that
+ the table may receive at least CANDIDATE different user entries, including
+ those already in the table, before any other growth of the hash table size
+ occurs. If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the
+ exact number of buckets desired. Return true iff the rehash succeeded. */
+extern bool hash_rehash (Hash_table *table, size_t candidate)
+ _GL_ATTRIBUTE_NODISCARD;
+
+/* If ENTRY matches an entry already in the hash table, return the pointer
+ to the entry from the table. Otherwise, insert ENTRY and return ENTRY.
+ Return NULL if the storage required for insertion cannot be allocated.
+ This implementation does not support duplicate entries or insertion of
+ NULL. */
+extern void *hash_insert (Hash_table *table, const void *entry)
+ _GL_ATTRIBUTE_NODISCARD;
+
+/* Same as hash_insert, but invokes xalloc_die on memory exhaustion. */
+/* This function is defined by module 'xhash'. */
+extern void *hash_xinsert (Hash_table *table, const void *entry);
+
+/* Insert ENTRY into hash TABLE if there is not already a matching entry.
+
+ Return -1 upon memory allocation failure.
+ Return 1 if insertion succeeded.
+ Return 0 if there is already a matching entry in the table,
+ and in that case, if MATCHED_ENT is non-NULL, set *MATCHED_ENT
+ to that entry.
+
+ This interface is easier to use than hash_insert when you must
+ distinguish between the latter two cases. More importantly,
+ hash_insert is unusable for some types of ENTRY values. When using
+ hash_insert, the only way to distinguish those cases is to compare
+ the return value and ENTRY. That works only when you can have two
+ different ENTRY values that point to data that compares "equal". Thus,
+ when the ENTRY value is a simple scalar, you must use
+ hash_insert_if_absent. ENTRY must not be NULL. */
+extern int hash_insert_if_absent (Hash_table *table, const void *entry,
+ const void **matched_ent);
+
+/* If ENTRY is already in the table, remove it and return the just-deleted
+ data (the user may want to deallocate its storage). If ENTRY is not in the
+ table, don't modify the table and return NULL. */
+extern void *hash_remove (Hash_table *table, const void *entry);
+
+/* Same as hash_remove. This interface is deprecated.
+ FIXME: Remove in 2022. */
+extern void *hash_delete (Hash_table *table, const void *entry)
+ _GL_ATTRIBUTE_DEPRECATED;
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/iconv.in.h b/lib/iconv.in.h
new file mode 100644
index 0000000..9d62e4c
--- /dev/null
+++ b/lib/iconv.in.h
@@ -0,0 +1,127 @@
+/* A GNU-like <iconv.h>.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_ICONV_H@
+
+#ifndef _@GUARD_PREFIX@_ICONV_H
+#define _@GUARD_PREFIX@_ICONV_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV_OPEN@
+/* An iconv_open wrapper that supports the IANA standardized encoding names
+ ("ISO-8859-1" etc.) as far as possible. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv_open rpl_iconv_open
+# endif
+_GL_FUNCDECL_RPL (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode));
+# else
+_GL_CXXALIAS_SYS (iconv_open, iconv_t,
+ (const char *tocode, const char *fromcode));
+# endif
+_GL_CXXALIASWARN (iconv_open);
+#elif defined GNULIB_POSIXCHECK
+# undef iconv_open
+# if HAVE_RAW_DECL_ICONV_OPEN
+_GL_WARN_ON_USE (iconv_open, "iconv_open is not working correctly everywhere - "
+ "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if @REPLACE_ICONV_UTF@
+/* Special constants for supporting UTF-{16,32}{BE,LE} encodings.
+ Not public. */
+# define _ICONV_UTF8_UTF16BE (iconv_t)(-161)
+# define _ICONV_UTF8_UTF16LE (iconv_t)(-162)
+# define _ICONV_UTF8_UTF32BE (iconv_t)(-163)
+# define _ICONV_UTF8_UTF32LE (iconv_t)(-164)
+# define _ICONV_UTF16BE_UTF8 (iconv_t)(-165)
+# define _ICONV_UTF16LE_UTF8 (iconv_t)(-166)
+# define _ICONV_UTF32BE_UTF8 (iconv_t)(-167)
+# define _ICONV_UTF32LE_UTF8 (iconv_t)(-168)
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv rpl_iconv
+# endif
+_GL_FUNCDECL_RPL (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **restrict inbuf,
+ size_t *restrict inbytesleft,
+ char **restrict outbuf, size_t *restrict outbytesleft));
+_GL_CXXALIAS_RPL (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **restrict inbuf,
+ size_t *restrict inbytesleft,
+ char **restrict outbuf, size_t *restrict outbytesleft));
+# else
+/* Need to cast, because on some versions of Solaris, ICONV_CONST does
+ not have the right value for C++. */
+_GL_CXXALIAS_SYS_CAST (iconv, size_t,
+ (iconv_t cd,
+ @ICONV_CONST@ char **restrict inbuf,
+ size_t *restrict inbytesleft,
+ char **restrict outbuf, size_t *restrict outbytesleft));
+# endif
+_GL_CXXALIASWARN (iconv);
+# ifndef ICONV_CONST
+# define ICONV_CONST @ICONV_CONST@
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iconv
+# if HAVE_RAW_DECL_ICONV
+_GL_WARN_ON_USE (iconv, "iconv is not working correctly everywhere - "
+ "use gnulib module iconv for portability");
+# endif
+#endif
+
+#if @GNULIB_ICONV@
+# if @REPLACE_ICONV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iconv_close rpl_iconv_close
+# endif
+_GL_FUNCDECL_RPL (iconv_close, int, (iconv_t cd));
+_GL_CXXALIAS_RPL (iconv_close, int, (iconv_t cd));
+# else
+_GL_CXXALIAS_SYS (iconv_close, int, (iconv_t cd));
+# endif
+_GL_CXXALIASWARN (iconv_close);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_ICONV_H */
+#endif /* _@GUARD_PREFIX@_ICONV_H */
diff --git a/lib/idx.h b/lib/idx.h
new file mode 100644
index 0000000..50ad5f6
--- /dev/null
+++ b/lib/idx.h
@@ -0,0 +1,114 @@
+/* A type for indices and sizes.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _IDX_H
+#define _IDX_H
+
+/* Get ptrdiff_t. */
+#include <stddef.h>
+
+/* Get PTRDIFF_MAX. */
+#include <stdint.h>
+
+/* The type 'idx_t' holds an (array) index or an (object) size.
+ Its implementation promotes to a signed integer type,
+ which can hold the values
+ 0..2^63-1 (on 64-bit platforms) or
+ 0..2^31-1 (on 32-bit platforms).
+
+ Why a signed integer type?
+
+ * Security: Signed types can be checked for overflow via
+ '-fsanitize=undefined', but unsigned types cannot.
+
+ * Comparisons without surprises: ISO C99 § 6.3.1.8 specifies a few
+ surprising results for comparisons, such as
+
+ (int) -3 < (unsigned long) 7 => false
+ (int) -3 < (unsigned int) 7 => false
+ and on 32-bit machines:
+ (long) -3 < (unsigned int) 7 => false
+
+ This is surprising because the natural comparison order is by
+ value in the realm of infinite-precision signed integers (ℤ).
+
+ The best way to get rid of such surprises is to use signed types
+ for numerical integer values, and use unsigned types only for
+ bit masks and enums.
+
+ Why not use 'size_t' directly?
+
+ * Because 'size_t' is an unsigned type, and a signed type is better.
+ See above.
+
+ Why not use 'ptrdiff_t' directly?
+
+ * Maintainability: When reading and modifying code, it helps to know that
+ a certain variable cannot have negative values. For example, when you
+ have a loop
+
+ int n = ...;
+ for (int i = 0; i < n; i++) ...
+
+ or
+
+ ptrdiff_t n = ...;
+ for (ptrdiff_t i = 0; i < n; i++) ...
+
+ you have to ask yourself "what if n < 0?". Whereas in
+
+ idx_t n = ...;
+ for (idx_t i = 0; i < n; i++) ...
+
+ you know that this case cannot happen.
+
+ Similarly, when a programmer writes
+
+ idx_t = ptr2 - ptr1;
+
+ there is an implied assertion that ptr1 and ptr2 point into the same
+ object and that ptr1 <= ptr2.
+
+ * Being future-proof: In the future, range types (integers which are
+ constrained to a certain range of values) may be added to C compilers
+ or to the C standard. Several programming languages (Ada, Haskell,
+ Common Lisp, Pascal) already have range types. Such range types may
+ help producing good code and good warnings. The type 'idx_t' could
+ then be typedef'ed to a range type that is signed after promotion. */
+
+/* In the future, idx_t could be typedef'ed to a signed range type.
+ The clang "extended integer types", supported in Clang 11 or newer
+ <https://clang.llvm.org/docs/LanguageExtensions.html#extended-integer-types>,
+ are a special case of range types. However, these types don't support binary
+ operators with plain integer types (e.g. expressions such as x > 1).
+ Therefore, they don't behave like signed types (and not like unsigned types
+ either). So, we cannot use them here. */
+
+/* Use the signed type 'ptrdiff_t'. */
+/* Note: ISO C does not mandate that 'size_t' and 'ptrdiff_t' have the same
+ size, but it is so on all platforms we have seen since 1990. */
+typedef ptrdiff_t idx_t;
+
+/* IDX_MAX is the maximum value of an idx_t. */
+#define IDX_MAX PTRDIFF_MAX
+
+/* So far no need has been found for an IDX_WIDTH macro.
+ Perhaps there should be another macro IDX_VALUE_BITS that does not
+ count the sign bit and is therefore one less than PTRDIFF_WIDTH. */
+
+#endif /* _IDX_H */
diff --git a/lib/inet_ntop.c b/lib/inet_ntop.c
new file mode 100644
index 0000000..b380da4
--- /dev/null
+++ b/lib/inet_ntop.c
@@ -0,0 +1,260 @@
+/* inet_ntop.c -- convert IPv4 and IPv6 addresses from binary to text form
+
+ Copyright (C) 2005-2006, 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/*
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+#include <config.h>
+
+/* Specification. */
+#include <arpa/inet.h>
+
+/* Use this to suppress gcc's "...may be used before initialized" warnings.
+ Beware: The Code argument must not contain commas. */
+#ifndef IF_LINT
+# if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+# else
+# define IF_LINT(Code) /* empty */
+# endif
+#endif
+
+#if HAVE_DECL_INET_NTOP
+
+# undef inet_ntop
+
+const char *
+rpl_inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+{
+ return inet_ntop (af, src, dst, cnt);
+}
+
+#else
+
+# include <stdio.h>
+# include <string.h>
+# include <errno.h>
+
+# define NS_IN6ADDRSZ 16
+# define NS_INT16SZ 2
+
+/*
+ * WARNING: Don't even consider trying to compile this on a system where
+ * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX.
+ */
+typedef int verify_int_size[4 <= sizeof (int) ? 1 : -1];
+
+static const char *inet_ntop4 (const unsigned char *src, char *dst, socklen_t size);
+# if HAVE_IPV6
+static const char *inet_ntop6 (const unsigned char *src, char *dst, socklen_t size);
+# endif
+
+
+/* char *
+ * inet_ntop(af, src, dst, size)
+ * convert a network format address to presentation format.
+ * return:
+ * pointer to presentation format address ('dst'), or NULL (see errno).
+ * author:
+ * Paul Vixie, 1996.
+ */
+const char *
+inet_ntop (int af, const void *restrict src,
+ char *restrict dst, socklen_t cnt)
+{
+ switch (af)
+ {
+# if HAVE_IPV4
+ case AF_INET:
+ return (inet_ntop4 (src, dst, cnt));
+# endif
+
+# if HAVE_IPV6
+ case AF_INET6:
+ return (inet_ntop6 (src, dst, cnt));
+# endif
+
+ default:
+ errno = EAFNOSUPPORT;
+ return (NULL);
+ }
+ /* NOTREACHED */
+}
+
+/* const char *
+ * inet_ntop4(src, dst, size)
+ * format an IPv4 address
+ * return:
+ * 'dst' (as a const)
+ * notes:
+ * (1) uses no statics
+ * (2) takes a u_char* not an in_addr as input
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop4 (const unsigned char *src, char *dst, socklen_t size)
+{
+ char tmp[sizeof "255.255.255.255"];
+ int len;
+
+ len = sprintf (tmp, "%u.%u.%u.%u", src[0], src[1], src[2], src[3]);
+ if (len < 0)
+ return NULL;
+
+ if (len > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+# if HAVE_IPV6
+
+/* const char *
+ * inet_ntop6(src, dst, size)
+ * convert IPv6 binary address into presentation (printable) format
+ * author:
+ * Paul Vixie, 1996.
+ */
+static const char *
+inet_ntop6 (const unsigned char *src, char *dst, socklen_t size)
+{
+ /*
+ * Note that int32_t and int16_t need only be "at least" large enough
+ * to contain a value of the specified size. On some systems, like
+ * Crays, there is no such thing as an integer variable with 16 bits.
+ * Keep this in mind if you think this function should have been coded
+ * to use pointer overlays. All the world's not a VAX.
+ */
+ char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp;
+ struct
+ {
+ int base, len;
+ } best, cur;
+ unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];
+ int i;
+
+ /*
+ * Preprocess:
+ * Copy the input (bytewise) array into a wordwise array.
+ * Find the longest run of 0x00's in src[] for :: shorthanding.
+ */
+ memset (words, '\0', sizeof words);
+ for (i = 0; i < NS_IN6ADDRSZ; i += 2)
+ words[i / 2] = (src[i] << 8) | src[i + 1];
+ best.base = -1;
+ cur.base = -1;
+ IF_LINT(best.len = 0);
+ IF_LINT(cur.len = 0);
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ if (words[i] == 0)
+ {
+ if (cur.base == -1)
+ cur.base = i, cur.len = 1;
+ else
+ cur.len++;
+ }
+ else
+ {
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ cur.base = -1;
+ }
+ }
+ }
+ if (cur.base != -1)
+ {
+ if (best.base == -1 || cur.len > best.len)
+ best = cur;
+ }
+ if (best.base != -1 && best.len < 2)
+ best.base = -1;
+
+ /*
+ * Format the result.
+ */
+ tp = tmp;
+ for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++)
+ {
+ /* Are we inside the best run of 0x00's? */
+ if (best.base != -1 && i >= best.base && i < (best.base + best.len))
+ {
+ if (i == best.base)
+ *tp++ = ':';
+ continue;
+ }
+ /* Are we following an initial run of 0x00s or any real hex? */
+ if (i != 0)
+ *tp++ = ':';
+ /* Is this address an encapsulated IPv4? */
+ if (i == 6 && best.base == 0 &&
+ (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
+ {
+ if (!inet_ntop4 (src + 12, tp, sizeof tmp - (tp - tmp)))
+ return (NULL);
+ tp += strlen (tp);
+ break;
+ }
+ {
+ int len = sprintf (tp, "%x", words[i]);
+ if (len < 0)
+ return NULL;
+ tp += len;
+ }
+ }
+ /* Was it a trailing run of 0x00's? */
+ if (best.base != -1 && (best.base + best.len) ==
+ (NS_IN6ADDRSZ / NS_INT16SZ))
+ *tp++ = ':';
+ *tp++ = '\0';
+
+ /*
+ * Check for overflow, copy, and we're done.
+ */
+ if ((socklen_t) (tp - tmp) > size)
+ {
+ errno = ENOSPC;
+ return NULL;
+ }
+
+ return strcpy (dst, tmp);
+}
+
+# endif
+
+#endif
diff --git a/lib/intprops.h b/lib/intprops.h
new file mode 100644
index 0000000..bc2107c
--- /dev/null
+++ b/lib/intprops.h
@@ -0,0 +1,630 @@
+/* intprops.h -- properties of integer types
+
+ Copyright (C) 2001-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _GL_INTPROPS_H
+#define _GL_INTPROPS_H
+
+#include <limits.h>
+
+/* Return a value with the common real type of E and V and the value of V.
+ Do not evaluate E. */
+#define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v))
+
+/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
+ <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>. */
+#define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v))
+
+/* The extra casts in the following macros work around compiler bugs,
+ e.g., in Cray C 5.0.3.0. */
+
+/* True if the arithmetic type T is an integer type. bool counts as
+ an integer. */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if the real type T is signed. */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Return 1 if the real expression E, after promotion, has a
+ signed or floating type. Do not evaluate E. */
+#define EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
+
+
+/* Minimum and maximum values for integer types and expressions. */
+
+/* The width in bits of the integer type or expression T.
+ Do not evaluate T. T must not be a bit-field expression.
+ Padding bits are not supported; this is checked at compile-time below. */
+#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
+
+/* The maximum and minimum values for the integer type T. */
+#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
+#define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
+
+/* The maximum and minimum values for the type of the expression E,
+ after integer promotion. E is not evaluated. */
+#define _GL_INT_MINIMUM(e) \
+ (EXPR_SIGNED (e) \
+ ? ~ _GL_SIGNED_INT_MAXIMUM (e) \
+ : _GL_INT_CONVERT (e, 0))
+#define _GL_INT_MAXIMUM(e) \
+ (EXPR_SIGNED (e) \
+ ? _GL_SIGNED_INT_MAXIMUM (e) \
+ : _GL_INT_NEGATE_CONVERT (e, 1))
+#define _GL_SIGNED_INT_MAXIMUM(e) \
+ (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH (+ (e)) - 2)) - 1) * 2 + 1)
+
+/* Work around OpenVMS incompatibility with C99. */
+#if !defined LLONG_MAX && defined __INT64_MAX
+# define LLONG_MAX __INT64_MAX
+# define LLONG_MIN __INT64_MIN
+#endif
+
+/* This include file assumes that signed types are two's complement without
+ padding bits; the above macros have undefined behavior otherwise.
+ If this is a problem for you, please let us know how to fix it for your host.
+ This assumption is tested by the intprops-tests module. */
+
+/* Does the __typeof__ keyword work? This could be done by
+ 'configure', but for now it's easier to do it by hand. */
+#if (2 <= __GNUC__ \
+ || (4 <= __clang_major__) \
+ || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
+ || (0x5110 <= __SUNPRO_C && !__STDC__))
+# define _GL_HAVE___TYPEOF__ 1
+#else
+# define _GL_HAVE___TYPEOF__ 0
+#endif
+
+/* Return 1 if the integer type or expression T might be signed. Return 0
+ if it is definitely unsigned. T must not be a bit-field expression.
+ This macro does not evaluate its argument, and expands to an
+ integer constant expression. */
+#if _GL_HAVE___TYPEOF__
+# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
+#else
+# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
+#endif
+
+/* Bound on length of the string representing an unsigned integer
+ value representable in B bits. log10 (2.0) < 146/485. The
+ smallest value of B where this bound is not tight is 2621. */
+#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
+
+/* Bound on length of the string representing an integer type or expression T.
+ T must not be a bit-field expression.
+
+ Subtract 1 for the sign bit if T is signed, and then add 1 more for
+ a minus sign if needed.
+
+ Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 1 when its argument is
+ unsigned, this macro may overestimate the true bound by one byte when
+ applied to unsigned types of size 2, 4, 16, ... bytes. */
+#define INT_STRLEN_BOUND(t) \
+ (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \
+ + _GL_SIGNED_TYPE_OR_EXPR (t))
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+ including the terminating null. T must not be a bit-field expression. */
+#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
+
+
+/* Range overflow checks.
+
+ The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
+ operators might not yield numerically correct answers due to
+ arithmetic overflow. They do not rely on undefined or
+ implementation-defined behavior. Their implementations are simple
+ and straightforward, but they are a bit harder to use than the
+ INT_<op>_OVERFLOW macros described below.
+
+ Example usage:
+
+ long int i = ...;
+ long int j = ...;
+ if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
+ printf ("multiply would overflow");
+ else
+ printf ("product is %ld", i * j);
+
+ Restrictions on *_RANGE_OVERFLOW macros:
+
+ These macros do not check for all possible numerical problems or
+ undefined or unspecified behavior: they do not check for division
+ by zero, for bad shift counts, or for shifting negative numbers.
+
+ These macros may evaluate their arguments zero or multiple times,
+ so the arguments should not have side effects. The arithmetic
+ arguments (including the MIN and MAX arguments) must be of the same
+ integer type after the usual arithmetic conversions, and the type
+ must have minimum value MIN and maximum MAX. Unsigned types should
+ use a zero MIN of the proper type.
+
+ These macros are tuned for constant MIN and MAX. For commutative
+ operations such as A + B, they are also tuned for constant B. */
+
+/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? (a) < (min) - (b) \
+ : (max) - (b) < (a))
+
+/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? (max) + (b) < (a) \
+ : (a) < (min) + (b))
+
+/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. */
+#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
+ ((min) < 0 \
+ ? (a) < - (max) \
+ : 0 < (a))
+
+/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Avoid && and || as they tickle
+ bugs in Sun C 5.11 2010/08/13 and other compilers; see
+ <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>. */
+#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
+ ((b) < 0 \
+ ? ((a) < 0 \
+ ? (a) < (max) / (b) \
+ : (b) == -1 \
+ ? 0 \
+ : (min) / (b) < (a)) \
+ : (b) == 0 \
+ ? 0 \
+ : ((a) < 0 \
+ ? (a) < (min) / (b) \
+ : (max) / (b) < (a)))
+
+/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Do not check for division by zero. */
+#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \
+ ((min) < 0 && (b) == -1 && (a) < - (max))
+
+/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Do not check for division by zero.
+ Mathematically, % should never overflow, but on x86-like hosts
+ INT_MIN % -1 traps, and the C standard permits this, so treat this
+ as an overflow too. */
+#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \
+ INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
+
+/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
+ See above for restrictions. Here, MIN and MAX are for A only, and B need
+ not be of the same type as the other arguments. The C standard says that
+ behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
+ A is negative then A << B has undefined behavior and A >> B has
+ implementation-defined behavior, but do not check these other
+ restrictions. */
+#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \
+ ((a) < 0 \
+ ? (a) < (min) >> (b) \
+ : (max) >> (b) < (a))
+
+/* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
+ (A, B, P) work when P is non-null. */
+/* __builtin_{add,sub}_overflow exists but is not reliable in GCC 5.x and 6.x,
+ see <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98269>. */
+#if 7 <= __GNUC__ && !defined __ICC
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
+#else
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
+#endif
+
+/* True if __builtin_mul_overflow (A, B, P) works when P is non-null. */
+#ifdef __clang__
+/* Work around Clang bug <https://bugs.llvm.org/show_bug.cgi?id=16404>. */
+# define _GL_HAS_BUILTIN_MUL_OVERFLOW 0
+#else
+# define _GL_HAS_BUILTIN_MUL_OVERFLOW _GL_HAS_BUILTIN_ADD_OVERFLOW
+#endif
+
+/* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
+ __builtin_sub_overflow_p and __builtin_mul_overflow_p. */
+#if defined __clang__ || defined __ICC
+/* Clang 11 lacks __builtin_mul_overflow_p, and even if it did it
+ would presumably run afoul of Clang bug 16404. ICC 2021.1's
+ __builtin_add_overflow_p etc. are not treated as integral constant
+ expressions even when all arguments are. */
+# define _GL_HAS_BUILTIN_OVERFLOW_P 0
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_OVERFLOW_P __has_builtin (__builtin_mul_overflow_p)
+#else
+# define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
+#endif
+
+/* The _GL*_OVERFLOW macros have the same restrictions as the
+ *_RANGE_OVERFLOW macros, except that they do not assume that operands
+ (e.g., A and B) have the same type as MIN and MAX. Instead, they assume
+ that the result (e.g., A + B) has that type. */
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define _GL_ADD_OVERFLOW(a, b, min, max) \
+ __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
+ __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0)
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
+ __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0)
+#else
+# define _GL_ADD_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \
+ : (a) < 0 ? (b) <= (a) + (b) \
+ : (b) < 0 ? (a) <= (a) + (b) \
+ : (a) + (b) < (b))
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \
+ : (a) < 0 ? 1 \
+ : (b) < 0 ? (a) - (b) <= (a) \
+ : (a) < (b))
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
+ (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \
+ || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
+#endif
+#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
+ : (a) < 0 ? (b) <= (a) + (b) - 1 \
+ : (b) < 0 && (a) + (b) <= (a))
+#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \
+ ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
+ : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \
+ : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
+
+/* Return a nonzero value if A is a mathematical multiple of B, where
+ A is unsigned, B is negative, and MAX is the maximum value of A's
+ type. A's type must be the same as (A % B)'s type. Normally (A %
+ -B == 0) suffices, but things get tricky if -B would overflow. */
+#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \
+ (((b) < -_GL_SIGNED_INT_MAXIMUM (b) \
+ ? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \
+ ? (a) \
+ : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \
+ : (a) % - (b)) \
+ == 0)
+
+/* Check for integer overflow, and report low order bits of answer.
+
+ The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
+ might not yield numerically correct answers due to arithmetic overflow.
+ The INT_<op>_WRAPV macros compute the low-order bits of the sum,
+ difference, and product of two C integers, and return 1 if these
+ low-order bits are not numerically correct.
+ These macros work correctly on all known practical hosts, and do not rely
+ on undefined behavior due to signed arithmetic overflow.
+
+ Example usage, assuming A and B are long int:
+
+ if (INT_MULTIPLY_OVERFLOW (a, b))
+ printf ("result would overflow\n");
+ else
+ printf ("result is %ld (no overflow)\n", a * b);
+
+ Example usage with WRAPV flavor:
+
+ long int result;
+ bool overflow = INT_MULTIPLY_WRAPV (a, b, &result);
+ printf ("result is %ld (%s)\n", result,
+ overflow ? "after overflow" : "no overflow");
+
+ Restrictions on these macros:
+
+ These macros do not check for all possible numerical problems or
+ undefined or unspecified behavior: they do not check for division
+ by zero, for bad shift counts, or for shifting negative numbers.
+
+ These macros may evaluate their arguments zero or multiple times, so the
+ arguments should not have side effects.
+
+ The WRAPV macros are not constant expressions. They support only
+ +, binary -, and *. Because the WRAPV macros convert the result,
+ they report overflow in different circumstances than the OVERFLOW
+ macros do.
+
+ These macros are tuned for their last input argument being a constant.
+
+ Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
+ A % B, and A << B would overflow, respectively. */
+
+#define INT_ADD_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
+#define INT_SUBTRACT_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define INT_NEGATE_OVERFLOW(a) INT_SUBTRACT_OVERFLOW (0, a)
+#else
+# define INT_NEGATE_OVERFLOW(a) \
+ INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+#endif
+#define INT_MULTIPLY_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
+#define INT_DIVIDE_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
+#define INT_REMAINDER_OVERFLOW(a, b) \
+ _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
+#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
+ INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
+ _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+
+/* Return 1 if the expression A <op> B would overflow,
+ where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
+ assuming MIN and MAX are the minimum and maximum for the result type.
+ Arguments should be free of side effects. */
+#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \
+ op_result_overflow (a, b, \
+ _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \
+ _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b)))
+
+/* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
+ Return 1 if the result overflows. See above for restrictions. */
+#if _GL_HAS_BUILTIN_ADD_OVERFLOW
+# define INT_ADD_WRAPV(a, b, r) __builtin_add_overflow (a, b, r)
+# define INT_SUBTRACT_WRAPV(a, b, r) __builtin_sub_overflow (a, b, r)
+#else
+# define INT_ADD_WRAPV(a, b, r) \
+ _GL_INT_OP_WRAPV (a, b, r, +, _GL_INT_ADD_RANGE_OVERFLOW)
+# define INT_SUBTRACT_WRAPV(a, b, r) \
+ _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
+#endif
+#if _GL_HAS_BUILTIN_MUL_OVERFLOW
+# if ((9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
+ || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__)) \
+ && !defined __ICC)
+# define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
+# else
+ /* Work around GCC bug 91450. */
+# define INT_MULTIPLY_WRAPV(a, b, r) \
+ ((!_GL_SIGNED_TYPE_OR_EXPR (*(r)) && EXPR_SIGNED (a) && EXPR_SIGNED (b) \
+ && _GL_INT_MULTIPLY_RANGE_OVERFLOW (a, b, 0, (__typeof__ (*(r))) -1)) \
+ ? ((void) __builtin_mul_overflow (a, b, r), 1) \
+ : __builtin_mul_overflow (a, b, r))
+# endif
+#else
+# define INT_MULTIPLY_WRAPV(a, b, r) \
+ _GL_INT_OP_WRAPV (a, b, r, *, _GL_INT_MULTIPLY_RANGE_OVERFLOW)
+#endif
+
+/* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390. See:
+ https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193
+ https://llvm.org/bugs/show_bug.cgi?id=25390
+ For now, assume all versions of GCC-like compilers generate bogus
+ warnings for _Generic. This matters only for compilers that
+ lack relevant builtins. */
+#if __GNUC__ || defined __clang__
+# define _GL__GENERIC_BOGUS 1
+#else
+# define _GL__GENERIC_BOGUS 0
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where OP specifies
+ the operation and OVERFLOW the overflow predicate. Return 1 if the
+ result overflows. See above for restrictions. */
+#if 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS
+# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
+ (_Generic \
+ (*(r), \
+ signed char: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ signed char, SCHAR_MIN, SCHAR_MAX), \
+ unsigned char: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ unsigned char, 0, UCHAR_MAX), \
+ short int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ short int, SHRT_MIN, SHRT_MAX), \
+ unsigned short int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ unsigned short int, 0, USHRT_MAX), \
+ int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ int, INT_MIN, INT_MAX), \
+ unsigned int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ unsigned int, 0, UINT_MAX), \
+ long int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ long int, LONG_MIN, LONG_MAX), \
+ unsigned long int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ unsigned long int, 0, ULONG_MAX), \
+ long long int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+ long long int, LLONG_MIN, LLONG_MAX), \
+ unsigned long long int: \
+ _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+ unsigned long long int, 0, ULLONG_MAX)))
+#else
+/* Store the low-order bits of A <op> B into *R, where OP specifies
+ the operation and OVERFLOW the overflow predicate. If *R is
+ signed, its type is ST with bounds SMIN..SMAX; otherwise its type
+ is UT with bounds U..UMAX. ST and UT are narrower than int.
+ Return 1 if the result overflows. See above for restrictions. */
+# if _GL_HAVE___TYPEOF__
+# define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
+ (TYPE_SIGNED (__typeof__ (*(r))) \
+ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, st, smin, smax) \
+ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, ut, 0, umax))
+# else
+# define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
+ (overflow (a, b, smin, smax) \
+ ? (overflow (a, b, 0, umax) \
+ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 1) \
+ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) < 0) \
+ : (overflow (a, b, 0, umax) \
+ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) >= 0 \
+ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 0)))
+# endif
+
+# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
+ (sizeof *(r) == sizeof (signed char) \
+ ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
+ signed char, SCHAR_MIN, SCHAR_MAX, \
+ unsigned char, UCHAR_MAX) \
+ : sizeof *(r) == sizeof (short int) \
+ ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
+ short int, SHRT_MIN, SHRT_MAX, \
+ unsigned short int, USHRT_MAX) \
+ : sizeof *(r) == sizeof (int) \
+ ? (EXPR_SIGNED (*(r)) \
+ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ int, INT_MIN, INT_MAX) \
+ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+ unsigned int, 0, UINT_MAX)) \
+ : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
+# ifdef LLONG_MAX
+# define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+ (sizeof *(r) == sizeof (long int) \
+ ? (EXPR_SIGNED (*(r)) \
+ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ long int, LONG_MIN, LONG_MAX) \
+ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ unsigned long int, 0, ULONG_MAX)) \
+ : (EXPR_SIGNED (*(r)) \
+ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+ long long int, LLONG_MIN, LLONG_MAX) \
+ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+ unsigned long long int, 0, ULLONG_MAX)))
+# else
+# define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+ (EXPR_SIGNED (*(r)) \
+ ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ long int, LONG_MIN, LONG_MAX) \
+ : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+ unsigned long int, 0, ULONG_MAX))
+# endif
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where the operation
+ is given by OP. Use the unsigned type UT for calculation to avoid
+ overflow problems. *R's type is T, with extrema TMIN and TMAX.
+ T must be a signed integer type. Return 1 if the result overflows. */
+#define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \
+ (overflow (a, b, tmin, tmax) \
+ ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \
+ : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0))
+
+/* Return the low-order bits of A <op> B, where the operation is given
+ by OP. Use the unsigned type UT for calculation to avoid undefined
+ behavior on signed integer overflow, and convert the result to type T.
+ UT is at least as wide as T and is no narrower than unsigned int,
+ T is two's complement, and there is no padding or trap representations.
+ Assume that converting UT to T yields the low-order bits, as is
+ done in all known two's-complement C compilers. E.g., see:
+ https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
+
+ According to the C standard, converting UT to T yields an
+ implementation-defined result or signal for values outside T's
+ range. However, code that works around this theoretical problem
+ runs afoul of a compiler bug in Oracle Studio 12.3 x86. See:
+ https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
+ As the compiler bug is real, don't try to work around the
+ theoretical problem. */
+
+#define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \
+ ((t) ((ut) (a) op (ut) (b)))
+
+/* Return true if the numeric values A + B, A - B, A * B fall outside
+ the range TMIN..TMAX. Arguments should be integer expressions
+ without side effects. TMIN should be signed and nonpositive.
+ TMAX should be positive, and should be signed unless TMIN is zero. */
+#define _GL_INT_ADD_RANGE_OVERFLOW(a, b, tmin, tmax) \
+ ((b) < 0 \
+ ? (((tmin) \
+ ? ((EXPR_SIGNED (_GL_INT_CONVERT (a, (tmin) - (b))) || (b) < (tmin)) \
+ && (a) < (tmin) - (b)) \
+ : (a) <= -1 - (b)) \
+ || ((EXPR_SIGNED (a) ? 0 <= (a) : (tmax) < (a)) && (tmax) < (a) + (b))) \
+ : (a) < 0 \
+ ? (((tmin) \
+ ? ((EXPR_SIGNED (_GL_INT_CONVERT (b, (tmin) - (a))) || (a) < (tmin)) \
+ && (b) < (tmin) - (a)) \
+ : (b) <= -1 - (a)) \
+ || ((EXPR_SIGNED (_GL_INT_CONVERT (a, b)) || (tmax) < (b)) \
+ && (tmax) < (a) + (b))) \
+ : (tmax) < (b) || (tmax) - (b) < (a))
+#define _GL_INT_SUBTRACT_RANGE_OVERFLOW(a, b, tmin, tmax) \
+ (((a) < 0) == ((b) < 0) \
+ ? ((a) < (b) \
+ ? !(tmin) || -1 - (tmin) < (b) - (a) - 1 \
+ : (tmax) < (a) - (b)) \
+ : (a) < 0 \
+ ? ((!EXPR_SIGNED (_GL_INT_CONVERT ((a) - (tmin), b)) && (a) - (tmin) < 0) \
+ || (a) - (tmin) < (b)) \
+ : ((! (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
+ && EXPR_SIGNED (_GL_INT_CONVERT ((tmax) + (b), a))) \
+ && (tmax) <= -1 - (b)) \
+ || (tmax) + (b) < (a)))
+#define _GL_INT_MULTIPLY_RANGE_OVERFLOW(a, b, tmin, tmax) \
+ ((b) < 0 \
+ ? ((a) < 0 \
+ ? (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
+ ? (a) < (tmax) / (b) \
+ : ((INT_NEGATE_OVERFLOW (b) \
+ ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (+ (b)) - 1) \
+ : (tmax) / -(b)) \
+ <= -1 - (a))) \
+ : INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \
+ ? (EXPR_SIGNED (a) \
+ ? 0 < (a) + (tmin) \
+ : 0 < (a) && -1 - (tmin) < (a) - 1) \
+ : (tmin) / (b) < (a)) \
+ : (b) == 0 \
+ ? 0 \
+ : ((a) < 0 \
+ ? (INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (a, tmin)) && (a) == -1 \
+ ? (EXPR_SIGNED (b) ? 0 < (b) + (tmin) : -1 - (tmin) < (b) - 1) \
+ : (tmin) / (a) < (b)) \
+ : (tmax) / (b) < (a)))
+
+/* The following macros compute A + B, A - B, and A * B, respectively.
+ If no overflow occurs, they set *R to the result and return 1;
+ otherwise, they return 0 and may modify *R.
+
+ Example usage:
+
+ long int result;
+ if (INT_ADD_OK (a, b, &result))
+ printf ("result is %ld\n", result);
+ else
+ printf ("overflow\n");
+
+ A, B, and *R should be integers; they need not be the same type,
+ and they need not be all signed or all unsigned.
+
+ These macros work correctly on all known practical hosts, and do not rely
+ on undefined behavior due to signed arithmetic overflow.
+
+ These macros are not constant expressions.
+
+ These macros may evaluate their arguments zero or multiple times, so the
+ arguments should not have side effects.
+
+ These macros are tuned for B being a constant. */
+
+#define INT_ADD_OK(a, b, r) ! INT_ADD_WRAPV (a, b, r)
+#define INT_SUBTRACT_OK(a, b, r) ! INT_SUBTRACT_WRAPV (a, b, r)
+#define INT_MULTIPLY_OK(a, b, r) ! INT_MULTIPLY_WRAPV (a, b, r)
+
+#endif /* _GL_INTPROPS_H */
diff --git a/lib/inttypes.in.h b/lib/inttypes.in.h
new file mode 100644
index 0000000..596a050
--- /dev/null
+++ b/lib/inttypes.in.h
@@ -0,0 +1,1002 @@
+/* Copyright (C) 2006-2020 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Derek Price.
+ This file is part of gnulib.
+
+ 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/>. */
+
+/*
+ * ISO C 99 <inttypes.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/inttypes.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Include the original <inttypes.h> if it exists, and if this file
+ has not been included yet or if this file includes gnulib stdint.h
+ which in turn includes this file.
+ The include_next requires a split double-inclusion guard. */
+#if ! defined INTTYPES_H || defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+# if @HAVE_INTTYPES_H@
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# if defined __cplusplus && ! defined __STDC_FORMAT_MACROS
+# define __STDC_FORMAT_MACROS 1
+# endif
+
+# @INCLUDE_NEXT@ @NEXT_INTTYPES_H@
+
+# define _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H
+# endif
+#endif
+
+#if ! defined INTTYPES_H && ! defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+#define INTTYPES_H
+
+/* Include <stdint.h> or the gnulib replacement.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stdint.h>
+#endif
+/* Get CHAR_BIT, INT_MAX, LONG_MAX, etc. */
+#include <limits.h>
+/* On mingw, __USE_MINGW_ANSI_STDIO only works if <stdio.h> is also included */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <stdio.h>
+#endif
+
+#if !(INT_MAX == 0x7fffffff && INT_MIN + INT_MAX == -1)
+# error "This file assumes that 'int' is 32-bit two's complement. Please report your platform and compiler to <bug-gnulib@gnu.org>."
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* 7.8.1 Macros for format specifiers */
+
+#if defined _TNS_R_TARGET
+ /* Tandem NonStop R series and compatible platforms released before
+ July 2005 support %Ld but not %lld. */
+# define _LONG_LONG_FORMAT_PREFIX "L"
+#else
+# define _LONG_LONG_FORMAT_PREFIX "ll"
+#endif
+
+#if !defined PRId8
+# ifdef INT8_MAX
+# define PRId8 "d"
+# endif
+#endif
+#if !defined PRIi8
+# ifdef INT8_MAX
+# define PRIi8 "i"
+# endif
+#endif
+#if !defined PRIo8
+# ifdef UINT8_MAX
+# define PRIo8 "o"
+# endif
+#endif
+#if !defined PRIu8
+# ifdef UINT8_MAX
+# define PRIu8 "u"
+# endif
+#endif
+#if !defined PRIx8
+# ifdef UINT8_MAX
+# define PRIx8 "x"
+# endif
+#endif
+#if !defined PRIX8
+# ifdef UINT8_MAX
+# define PRIX8 "X"
+# endif
+#endif
+#if !defined PRId16
+# ifdef INT16_MAX
+# define PRId16 "d"
+# endif
+#endif
+#if !defined PRIi16
+# ifdef INT16_MAX
+# define PRIi16 "i"
+# endif
+#endif
+#if !defined PRIo16
+# ifdef UINT16_MAX
+# define PRIo16 "o"
+# endif
+#endif
+#if !defined PRIu16
+# ifdef UINT16_MAX
+# define PRIu16 "u"
+# endif
+#endif
+#if !defined PRIx16
+# ifdef UINT16_MAX
+# define PRIx16 "x"
+# endif
+#endif
+#if !defined PRIX16
+# ifdef UINT16_MAX
+# define PRIX16 "X"
+# endif
+#endif
+#if !defined PRId32
+# ifdef INT32_MAX
+# define PRId32 "d"
+# endif
+#endif
+#if !defined PRIi32
+# ifdef INT32_MAX
+# define PRIi32 "i"
+# endif
+#endif
+#if !defined PRIo32
+# ifdef UINT32_MAX
+# define PRIo32 "o"
+# endif
+#endif
+#if !defined PRIu32
+# ifdef UINT32_MAX
+# define PRIu32 "u"
+# endif
+#endif
+#if !defined PRIx32
+# ifdef UINT32_MAX
+# define PRIx32 "x"
+# endif
+#endif
+#if !defined PRIX32
+# ifdef UINT32_MAX
+# define PRIX32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _PRI64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRI64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+# define _PRI64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRId64
+# define PRId64 _PRI64_PREFIX "d"
+# endif
+# if !defined PRIi64
+# define PRIi64 _PRI64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _PRIu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _PRIu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+# define _PRIu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined PRIo64
+# define PRIo64 _PRIu64_PREFIX "o"
+# endif
+# if !defined PRIu64
+# define PRIu64 _PRIu64_PREFIX "u"
+# endif
+# if !defined PRIx64
+# define PRIx64 _PRIu64_PREFIX "x"
+# endif
+# if !defined PRIX64
+# define PRIX64 _PRIu64_PREFIX "X"
+# endif
+#endif
+
+#if !defined PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdLEAST64
+# define PRIdLEAST64 PRId64
+# endif
+# if !defined PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+# endif
+# if !defined PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+# endif
+# if !defined PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+# endif
+# if !defined PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIdFAST8 PRId64
+# else
+# define PRIdFAST8 "d"
+# endif
+#endif
+#if !defined PRIiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define PRIiFAST8 PRIi64
+# else
+# define PRIiFAST8 "i"
+# endif
+#endif
+#if !defined PRIoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIoFAST8 PRIo64
+# else
+# define PRIoFAST8 "o"
+# endif
+#endif
+#if !defined PRIuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIuFAST8 PRIu64
+# else
+# define PRIuFAST8 "u"
+# endif
+#endif
+#if !defined PRIxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIxFAST8 PRIx64
+# else
+# define PRIxFAST8 "x"
+# endif
+#endif
+#if !defined PRIXFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define PRIXFAST8 PRIX64
+# else
+# define PRIXFAST8 "X"
+# endif
+#endif
+#if !defined PRIdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIdFAST16 PRId64
+# else
+# define PRIdFAST16 "d"
+# endif
+#endif
+#if !defined PRIiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define PRIiFAST16 PRIi64
+# else
+# define PRIiFAST16 "i"
+# endif
+#endif
+#if !defined PRIoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIoFAST16 PRIo64
+# else
+# define PRIoFAST16 "o"
+# endif
+#endif
+#if !defined PRIuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIuFAST16 PRIu64
+# else
+# define PRIuFAST16 "u"
+# endif
+#endif
+#if !defined PRIxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIxFAST16 PRIx64
+# else
+# define PRIxFAST16 "x"
+# endif
+#endif
+#if !defined PRIXFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define PRIXFAST16 PRIX64
+# else
+# define PRIXFAST16 "X"
+# endif
+#endif
+#if !defined PRIdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIdFAST32 PRId64
+# else
+# define PRIdFAST32 "d"
+# endif
+#endif
+#if !defined PRIiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define PRIiFAST32 PRIi64
+# else
+# define PRIiFAST32 "i"
+# endif
+#endif
+#if !defined PRIoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIoFAST32 PRIo64
+# else
+# define PRIoFAST32 "o"
+# endif
+#endif
+#if !defined PRIuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIuFAST32 PRIu64
+# else
+# define PRIuFAST32 "u"
+# endif
+#endif
+#if !defined PRIxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIxFAST32 PRIx64
+# else
+# define PRIxFAST32 "x"
+# endif
+#endif
+#if !defined PRIXFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define PRIXFAST32 PRIX64
+# else
+# define PRIXFAST32 "X"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined PRIdFAST64
+# define PRIdFAST64 PRId64
+# endif
+# if !defined PRIiFAST64
+# define PRIiFAST64 PRIi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined PRIoFAST64
+# define PRIoFAST64 PRIo64
+# endif
+# if !defined PRIuFAST64
+# define PRIuFAST64 PRIu64
+# endif
+# if !defined PRIxFAST64
+# define PRIxFAST64 PRIx64
+# endif
+# if !defined PRIXFAST64
+# define PRIXFAST64 PRIX64
+# endif
+#endif
+
+#if !defined PRIdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIdMAX PRId64
+# else
+# define PRIdMAX "ld"
+# endif
+#endif
+#if !defined PRIiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define PRIiMAX PRIi64
+# else
+# define PRIiMAX "li"
+# endif
+#endif
+#if !defined PRIoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIoMAX PRIo64
+# else
+# define PRIoMAX "lo"
+# endif
+#endif
+#if !defined PRIuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIuMAX PRIu64
+# else
+# define PRIuMAX "lu"
+# endif
+#endif
+#if !defined PRIxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIxMAX PRIx64
+# else
+# define PRIxMAX "lx"
+# endif
+#endif
+#if !defined PRIXMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define PRIXMAX PRIX64
+# else
+# define PRIXMAX "lX"
+# endif
+#endif
+
+#if !defined PRIdPTR
+# ifdef INTPTR_MAX
+# define PRIdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined PRIiPTR
+# ifdef INTPTR_MAX
+# define PRIiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined PRIoPTR
+# ifdef UINTPTR_MAX
+# define PRIoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined PRIuPTR
+# ifdef UINTPTR_MAX
+# define PRIuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined PRIxPTR
+# ifdef UINTPTR_MAX
+# define PRIxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+#if !defined PRIXPTR
+# ifdef UINTPTR_MAX
+# define PRIXPTR @PRIPTR_PREFIX@ "X"
+# endif
+#endif
+
+#if !defined SCNd8
+# ifdef INT8_MAX
+# define SCNd8 "hhd"
+# endif
+#endif
+#if !defined SCNi8
+# ifdef INT8_MAX
+# define SCNi8 "hhi"
+# endif
+#endif
+#if !defined SCNo8
+# ifdef UINT8_MAX
+# define SCNo8 "hho"
+# endif
+#endif
+#if !defined SCNu8
+# ifdef UINT8_MAX
+# define SCNu8 "hhu"
+# endif
+#endif
+#if !defined SCNx8
+# ifdef UINT8_MAX
+# define SCNx8 "hhx"
+# endif
+#endif
+#if !defined SCNd16
+# ifdef INT16_MAX
+# define SCNd16 "hd"
+# endif
+#endif
+#if !defined SCNi16
+# ifdef INT16_MAX
+# define SCNi16 "hi"
+# endif
+#endif
+#if !defined SCNo16
+# ifdef UINT16_MAX
+# define SCNo16 "ho"
+# endif
+#endif
+#if !defined SCNu16
+# ifdef UINT16_MAX
+# define SCNu16 "hu"
+# endif
+#endif
+#if !defined SCNx16
+# ifdef UINT16_MAX
+# define SCNx16 "hx"
+# endif
+#endif
+#if !defined SCNd32
+# ifdef INT32_MAX
+# define SCNd32 "d"
+# endif
+#endif
+#if !defined SCNi32
+# ifdef INT32_MAX
+# define SCNi32 "i"
+# endif
+#endif
+#if !defined SCNo32
+# ifdef UINT32_MAX
+# define SCNo32 "o"
+# endif
+#endif
+#if !defined SCNu32
+# ifdef UINT32_MAX
+# define SCNu32 "u"
+# endif
+#endif
+#if !defined SCNx32
+# ifdef UINT32_MAX
+# define SCNx32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @INT64_MAX_EQ_LONG_MAX@)
+# define _SCN64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCN64_PREFIX "I64"
+# elif LONG_MAX >> 30 == 1
+# define _SCN64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNd64
+# define SCNd64 _SCN64_PREFIX "d"
+# endif
+# if !defined SCNi64
+# define SCNi64 _SCN64_PREFIX "i"
+# endif
+#endif
+#ifdef UINT64_MAX
+# if (@APPLE_UNIVERSAL_BUILD@ ? defined _LP64 : @UINT64_MAX_EQ_ULONG_MAX@)
+# define _SCNu64_PREFIX "l"
+# elif defined _MSC_VER || defined __MINGW32__
+# define _SCNu64_PREFIX "I64"
+# elif ULONG_MAX >> 31 == 1
+# define _SCNu64_PREFIX _LONG_LONG_FORMAT_PREFIX
+# endif
+# if !defined SCNo64
+# define SCNo64 _SCNu64_PREFIX "o"
+# endif
+# if !defined SCNu64
+# define SCNu64 _SCNu64_PREFIX "u"
+# endif
+# if !defined SCNx64
+# define SCNx64 _SCNu64_PREFIX "x"
+# endif
+#endif
+
+#if !defined SCNdLEAST8
+# define SCNdLEAST8 "hhd"
+#endif
+#if !defined SCNiLEAST8
+# define SCNiLEAST8 "hhi"
+#endif
+#if !defined SCNoLEAST8
+# define SCNoLEAST8 "hho"
+#endif
+#if !defined SCNuLEAST8
+# define SCNuLEAST8 "hhu"
+#endif
+#if !defined SCNxLEAST8
+# define SCNxLEAST8 "hhx"
+#endif
+#if !defined SCNdLEAST16
+# define SCNdLEAST16 "hd"
+#endif
+#if !defined SCNiLEAST16
+# define SCNiLEAST16 "hi"
+#endif
+#if !defined SCNoLEAST16
+# define SCNoLEAST16 "ho"
+#endif
+#if !defined SCNuLEAST16
+# define SCNuLEAST16 "hu"
+#endif
+#if !defined SCNxLEAST16
+# define SCNxLEAST16 "hx"
+#endif
+#if !defined SCNdLEAST32
+# define SCNdLEAST32 "d"
+#endif
+#if !defined SCNiLEAST32
+# define SCNiLEAST32 "i"
+#endif
+#if !defined SCNoLEAST32
+# define SCNoLEAST32 "o"
+#endif
+#if !defined SCNuLEAST32
+# define SCNuLEAST32 "u"
+#endif
+#if !defined SCNxLEAST32
+# define SCNxLEAST32 "x"
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdLEAST64
+# define SCNdLEAST64 SCNd64
+# endif
+# if !defined SCNiLEAST64
+# define SCNiLEAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoLEAST64
+# define SCNoLEAST64 SCNo64
+# endif
+# if !defined SCNuLEAST64
+# define SCNuLEAST64 SCNu64
+# endif
+# if !defined SCNxLEAST64
+# define SCNxLEAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNdFAST8 SCNd64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNdFAST8 "hd"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNdFAST8 "hhd"
+# else
+# define SCNdFAST8 "d"
+# endif
+#endif
+#if !defined SCNiFAST8
+# if INT_FAST8_MAX > INT32_MAX
+# define SCNiFAST8 SCNi64
+# elif INT_FAST8_MAX == 0x7fff
+# define SCNiFAST8 "hi"
+# elif INT_FAST8_MAX == 0x7f
+# define SCNiFAST8 "hhi"
+# else
+# define SCNiFAST8 "i"
+# endif
+#endif
+#if !defined SCNoFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNoFAST8 SCNo64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNoFAST8 "ho"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNoFAST8 "hho"
+# else
+# define SCNoFAST8 "o"
+# endif
+#endif
+#if !defined SCNuFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNuFAST8 SCNu64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNuFAST8 "hu"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNuFAST8 "hhu"
+# else
+# define SCNuFAST8 "u"
+# endif
+#endif
+#if !defined SCNxFAST8
+# if UINT_FAST8_MAX > UINT32_MAX
+# define SCNxFAST8 SCNx64
+# elif UINT_FAST8_MAX == 0xffff
+# define SCNxFAST8 "hx"
+# elif UINT_FAST8_MAX == 0xff
+# define SCNxFAST8 "hhx"
+# else
+# define SCNxFAST8 "x"
+# endif
+#endif
+#if !defined SCNdFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNdFAST16 SCNd64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNdFAST16 "hd"
+# else
+# define SCNdFAST16 "d"
+# endif
+#endif
+#if !defined SCNiFAST16
+# if INT_FAST16_MAX > INT32_MAX
+# define SCNiFAST16 SCNi64
+# elif INT_FAST16_MAX == 0x7fff
+# define SCNiFAST16 "hi"
+# else
+# define SCNiFAST16 "i"
+# endif
+#endif
+#if !defined SCNoFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNoFAST16 SCNo64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNoFAST16 "ho"
+# else
+# define SCNoFAST16 "o"
+# endif
+#endif
+#if !defined SCNuFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNuFAST16 SCNu64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNuFAST16 "hu"
+# else
+# define SCNuFAST16 "u"
+# endif
+#endif
+#if !defined SCNxFAST16
+# if UINT_FAST16_MAX > UINT32_MAX
+# define SCNxFAST16 SCNx64
+# elif UINT_FAST16_MAX == 0xffff
+# define SCNxFAST16 "hx"
+# else
+# define SCNxFAST16 "x"
+# endif
+#endif
+#if !defined SCNdFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNdFAST32 SCNd64
+# else
+# define SCNdFAST32 "d"
+# endif
+#endif
+#if !defined SCNiFAST32
+# if INT_FAST32_MAX > INT32_MAX
+# define SCNiFAST32 SCNi64
+# else
+# define SCNiFAST32 "i"
+# endif
+#endif
+#if !defined SCNoFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNoFAST32 SCNo64
+# else
+# define SCNoFAST32 "o"
+# endif
+#endif
+#if !defined SCNuFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNuFAST32 SCNu64
+# else
+# define SCNuFAST32 "u"
+# endif
+#endif
+#if !defined SCNxFAST32
+# if UINT_FAST32_MAX > UINT32_MAX
+# define SCNxFAST32 SCNx64
+# else
+# define SCNxFAST32 "x"
+# endif
+#endif
+#ifdef INT64_MAX
+# if !defined SCNdFAST64
+# define SCNdFAST64 SCNd64
+# endif
+# if !defined SCNiFAST64
+# define SCNiFAST64 SCNi64
+# endif
+#endif
+#ifdef UINT64_MAX
+# if !defined SCNoFAST64
+# define SCNoFAST64 SCNo64
+# endif
+# if !defined SCNuFAST64
+# define SCNuFAST64 SCNu64
+# endif
+# if !defined SCNxFAST64
+# define SCNxFAST64 SCNx64
+# endif
+#endif
+
+#if !defined SCNdMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNdMAX SCNd64
+# else
+# define SCNdMAX "ld"
+# endif
+#endif
+#if !defined SCNiMAX
+# if @INT32_MAX_LT_INTMAX_MAX@
+# define SCNiMAX SCNi64
+# else
+# define SCNiMAX "li"
+# endif
+#endif
+#if !defined SCNoMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNoMAX SCNo64
+# else
+# define SCNoMAX "lo"
+# endif
+#endif
+#if !defined SCNuMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNuMAX SCNu64
+# else
+# define SCNuMAX "lu"
+# endif
+#endif
+#if !defined SCNxMAX
+# if @UINT32_MAX_LT_UINTMAX_MAX@
+# define SCNxMAX SCNx64
+# else
+# define SCNxMAX "lx"
+# endif
+#endif
+
+#if !defined SCNdPTR
+# ifdef INTPTR_MAX
+# define SCNdPTR @PRIPTR_PREFIX@ "d"
+# endif
+#endif
+#if !defined SCNiPTR
+# ifdef INTPTR_MAX
+# define SCNiPTR @PRIPTR_PREFIX@ "i"
+# endif
+#endif
+#if !defined SCNoPTR
+# ifdef UINTPTR_MAX
+# define SCNoPTR @PRIPTR_PREFIX@ "o"
+# endif
+#endif
+#if !defined SCNuPTR
+# ifdef UINTPTR_MAX
+# define SCNuPTR @PRIPTR_PREFIX@ "u"
+# endif
+#endif
+#if !defined SCNxPTR
+# ifdef UINTPTR_MAX
+# define SCNxPTR @PRIPTR_PREFIX@ "x"
+# endif
+#endif
+
+/* 7.8.2 Functions for greatest-width integer types */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if @GNULIB_IMAXABS@
+# if !@HAVE_DECL_IMAXABS@
+extern intmax_t imaxabs (intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxabs
+# if HAVE_RAW_DECL_IMAXABS
+_GL_WARN_ON_USE (imaxabs, "imaxabs is unportable - "
+ "use gnulib module imaxabs for portability");
+# endif
+#endif
+
+#if @GNULIB_IMAXDIV@
+# if !@HAVE_IMAXDIV_T@
+# if !GNULIB_defined_imaxdiv_t
+typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t;
+# define GNULIB_defined_imaxdiv_t 1
+# endif
+# endif
+# if !@HAVE_DECL_IMAXDIV@
+extern imaxdiv_t imaxdiv (intmax_t, intmax_t);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef imaxdiv
+# if HAVE_RAW_DECL_IMAXDIV
+_GL_WARN_ON_USE (imaxdiv, "imaxdiv is unportable - "
+ "use gnulib module imaxdiv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOIMAX@
+# if @REPLACE_STRTOIMAX@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtoimax
+# define strtoimax rpl_strtoimax
+# endif
+_GL_FUNCDECL_RPL (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int));
+# else
+# if !@HAVE_DECL_STRTOIMAX@
+# undef strtoimax
+_GL_FUNCDECL_SYS (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoimax, intmax_t,
+ (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoimax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoimax
+# if HAVE_RAW_DECL_STRTOIMAX
+_GL_WARN_ON_USE (strtoimax, "strtoimax is unportable - "
+ "use gnulib module strtoimax for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOUMAX@
+# if @REPLACE_STRTOUMAX@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtoumax
+# define strtoumax rpl_strtoumax
+# endif
+_GL_FUNCDECL_RPL (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int));
+# else
+# if !@HAVE_DECL_STRTOUMAX@
+# undef strtoumax
+_GL_FUNCDECL_SYS (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoumax, uintmax_t,
+ (const char *restrict, char **restrict, int));
+# endif
+_GL_CXXALIASWARN (strtoumax);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoumax
+# if HAVE_RAW_DECL_STRTOUMAX
+_GL_WARN_ON_USE (strtoumax, "strtoumax is unportable - "
+ "use gnulib module strtoumax for portability");
+# endif
+#endif
+
+/* Don't bother defining or declaring wcstoimax and wcstoumax, since
+ wide-character functions like this are hardly ever useful. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !defined INTTYPES_H && !defined _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H */
diff --git a/lib/ioctl.c b/lib/ioctl.c
new file mode 100644
index 0000000..eb2e825
--- /dev/null
+++ b/lib/ioctl.c
@@ -0,0 +1,92 @@
+/* ioctl.c --- wrappers for Windows ioctl function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#include <sys/ioctl.h>
+
+#include <stdarg.h>
+
+#if HAVE_IOCTL
+
+/* Provide a wrapper with the POSIX prototype. */
+# undef ioctl
+int
+rpl_ioctl (int fd, int request, ... /* {void *,char *} arg */)
+{
+ void *buf;
+ va_list args;
+
+ va_start (args, request);
+ buf = va_arg (args, void *);
+ va_end (args);
+
+ /* Cast 'request' so that when the system's ioctl function takes a 64-bit
+ request argument, the value gets zero-extended, not sign-extended. */
+ return ioctl (fd, (unsigned int) request, buf);
+}
+
+#else /* mingw */
+
+# include <errno.h>
+
+/* Get HANDLE. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include "fd-hook.h"
+/* Get _get_osfhandle. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+static int
+primary_ioctl (int fd, int request, void *arg)
+{
+ /* We don't support FIONBIO on pipes here. If you want to make pipe
+ fds non-blocking, use the gnulib 'nonblocking' module, until
+ gnulib implements fcntl F_GETFL / F_SETFL with O_NONBLOCK. */
+
+ if ((HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE)
+ errno = ENOSYS;
+ else
+ errno = EBADF;
+ return -1;
+}
+
+int
+ioctl (int fd, int request, ... /* {void *,char *} arg */)
+{
+ void *arg;
+ va_list args;
+
+ va_start (args, request);
+ arg = va_arg (args, void *);
+ va_end (args);
+
+# if WINDOWS_SOCKETS
+ return execute_all_ioctl_hooks (primary_ioctl, fd, request, arg);
+# else
+ return primary_ioctl (fd, request, arg);
+# endif
+}
+
+#endif
diff --git a/lib/isblank.c b/lib/isblank.c
new file mode 100644
index 0000000..4899404
--- /dev/null
+++ b/lib/isblank.c
@@ -0,0 +1,33 @@
+/* Test whether a character is a blank.
+
+ Copyright (C) 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <ctype.h>
+
+int
+isblank (int c)
+{
+ /* On all known platforms, in all predefined locales, isblank(c) is likely
+ equivalent with (c == ' ' || c == '\t'). Look at the glibc definition
+ (in glibc/localedata/locales/i18n): The "blank" characters are '\t', ' ',
+ U+1680, U+180E, U+2000..U+2006, U+2008..U+200A, U+205F, U+3000, and none
+ except the first two is present in a common 8-bit encoding. Therefore
+ the substitute for other platforms is not more complicated than this. */
+ return (c == ' ' || c == '\t');
+}
diff --git a/lib/iswblank.c b/lib/iswblank.c
new file mode 100644
index 0000000..d668d13
--- /dev/null
+++ b/lib/iswblank.c
@@ -0,0 +1,26 @@
+/* Test wide character for being blank.
+ Copyright (C) 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+int
+iswblank (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
diff --git a/lib/iswdigit.c b/lib/iswdigit.c
new file mode 100644
index 0000000..146f6e5
--- /dev/null
+++ b/lib/iswdigit.c
@@ -0,0 +1,26 @@
+/* Test wide character for being a digit.
+ Copyright (C) 2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+int
+iswdigit (wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
diff --git a/lib/iswxdigit.c b/lib/iswxdigit.c
new file mode 100644
index 0000000..59d15b7
--- /dev/null
+++ b/lib/iswxdigit.c
@@ -0,0 +1,33 @@
+/* Test wide character for being a hexadecimal digit.
+ Copyright (C) 2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wctype.h>
+
+int
+iswxdigit (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+#if 'A' == 0x41 && 'a' == 0x61
+ /* Optimization, assuming ASCII */
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+#else
+ || (wc >= 'A' && wc <= 'F') || (wc >= 'a' && wc <= 'f')
+#endif
+ );
+}
diff --git a/lib/itold.c b/lib/itold.c
new file mode 100644
index 0000000..d764003
--- /dev/null
+++ b/lib/itold.c
@@ -0,0 +1,28 @@
+/* Replacement for 'int' to 'long double' conversion routine.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <float.h>
+
+void
+_Qp_itoq (long double *result, int a)
+{
+ /* Convert from 'int' to 'double', then from 'double' to 'long double'. */
+ *result = (double) a;
+}
diff --git a/lib/langinfo.in.h b/lib/langinfo.in.h
new file mode 100644
index 0000000..e912cd3
--- /dev/null
+++ b/lib/langinfo.in.h
@@ -0,0 +1,222 @@
+/* Substitute for and wrapper around <langinfo.h>.
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/*
+ * POSIX <langinfo.h> for platforms that lack it or have an incomplete one.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_LANGINFO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_LANGINFO_H@
+# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_LANGINFO_H
+#define _@GUARD_PREFIX@_LANGINFO_H
+
+
+#if !@HAVE_LANGINFO_H@
+
+/* A platform that lacks <langinfo.h>. */
+
+/* Assume that it also lacks <nl_types.h> and the nl_item type. */
+# if !GNULIB_defined_nl_item
+typedef int nl_item;
+# define GNULIB_defined_nl_item 1
+# endif
+
+/* nl_langinfo items of the LC_CTYPE category */
+# define CODESET 10000
+/* nl_langinfo items of the LC_NUMERIC category */
+# define RADIXCHAR 10001
+# define DECIMAL_POINT RADIXCHAR
+# define THOUSEP 10002
+# define THOUSANDS_SEP THOUSEP
+# define GROUPING 10114
+/* nl_langinfo items of the LC_TIME category */
+# define D_T_FMT 10003
+# define D_FMT 10004
+# define T_FMT 10005
+# define T_FMT_AMPM 10006
+# define AM_STR 10007
+# define PM_STR 10008
+# define DAY_1 10009
+# define DAY_2 (DAY_1 + 1)
+# define DAY_3 (DAY_1 + 2)
+# define DAY_4 (DAY_1 + 3)
+# define DAY_5 (DAY_1 + 4)
+# define DAY_6 (DAY_1 + 5)
+# define DAY_7 (DAY_1 + 6)
+# define ABDAY_1 10016
+# define ABDAY_2 (ABDAY_1 + 1)
+# define ABDAY_3 (ABDAY_1 + 2)
+# define ABDAY_4 (ABDAY_1 + 3)
+# define ABDAY_5 (ABDAY_1 + 4)
+# define ABDAY_6 (ABDAY_1 + 5)
+# define ABDAY_7 (ABDAY_1 + 6)
+# define MON_1 10023
+# define MON_2 (MON_1 + 1)
+# define MON_3 (MON_1 + 2)
+# define MON_4 (MON_1 + 3)
+# define MON_5 (MON_1 + 4)
+# define MON_6 (MON_1 + 5)
+# define MON_7 (MON_1 + 6)
+# define MON_8 (MON_1 + 7)
+# define MON_9 (MON_1 + 8)
+# define MON_10 (MON_1 + 9)
+# define MON_11 (MON_1 + 10)
+# define MON_12 (MON_1 + 11)
+# define ALTMON_1 10200
+# define ALTMON_2 (ALTMON_1 + 1)
+# define ALTMON_3 (ALTMON_1 + 2)
+# define ALTMON_4 (ALTMON_1 + 3)
+# define ALTMON_5 (ALTMON_1 + 4)
+# define ALTMON_6 (ALTMON_1 + 5)
+# define ALTMON_7 (ALTMON_1 + 6)
+# define ALTMON_8 (ALTMON_1 + 7)
+# define ALTMON_9 (ALTMON_1 + 8)
+# define ALTMON_10 (ALTMON_1 + 9)
+# define ALTMON_11 (ALTMON_1 + 10)
+# define ALTMON_12 (ALTMON_1 + 11)
+# define ABMON_1 10035
+# define ABMON_2 (ABMON_1 + 1)
+# define ABMON_3 (ABMON_1 + 2)
+# define ABMON_4 (ABMON_1 + 3)
+# define ABMON_5 (ABMON_1 + 4)
+# define ABMON_6 (ABMON_1 + 5)
+# define ABMON_7 (ABMON_1 + 6)
+# define ABMON_8 (ABMON_1 + 7)
+# define ABMON_9 (ABMON_1 + 8)
+# define ABMON_10 (ABMON_1 + 9)
+# define ABMON_11 (ABMON_1 + 10)
+# define ABMON_12 (ABMON_1 + 11)
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+/* nl_langinfo items of the LC_MONETARY category */
+# define CRNCYSTR 10052
+# define CURRENCY_SYMBOL CRNCYSTR
+# define INT_CURR_SYMBOL 10100
+# define MON_DECIMAL_POINT 10101
+# define MON_THOUSANDS_SEP 10102
+# define MON_GROUPING 10103
+# define POSITIVE_SIGN 10104
+# define NEGATIVE_SIGN 10105
+# define FRAC_DIGITS 10106
+# define INT_FRAC_DIGITS 10107
+# define P_CS_PRECEDES 10108
+# define N_CS_PRECEDES 10109
+# define P_SEP_BY_SPACE 10110
+# define N_SEP_BY_SPACE 10111
+# define P_SIGN_POSN 10112
+# define N_SIGN_POSN 10113
+/* nl_langinfo items of the LC_MESSAGES category */
+# define YESEXPR 10053
+# define NOEXPR 10054
+
+#else
+
+/* A platform that has <langinfo.h>. */
+
+# if !@HAVE_LANGINFO_CODESET@
+# define CODESET 10000
+# define GNULIB_defined_CODESET 1
+# endif
+
+# if !@HAVE_LANGINFO_T_FMT_AMPM@
+# define T_FMT_AMPM 10006
+# define GNULIB_defined_T_FMT_AMPM 1
+# endif
+
+# if !@HAVE_LANGINFO_ALTMON@
+# define ALTMON_1 10200
+# define ALTMON_2 (ALTMON_1 + 1)
+# define ALTMON_3 (ALTMON_1 + 2)
+# define ALTMON_4 (ALTMON_1 + 3)
+# define ALTMON_5 (ALTMON_1 + 4)
+# define ALTMON_6 (ALTMON_1 + 5)
+# define ALTMON_7 (ALTMON_1 + 6)
+# define ALTMON_8 (ALTMON_1 + 7)
+# define ALTMON_9 (ALTMON_1 + 8)
+# define ALTMON_10 (ALTMON_1 + 9)
+# define ALTMON_11 (ALTMON_1 + 10)
+# define ALTMON_12 (ALTMON_1 + 11)
+# define GNULIB_defined_ALTMON 1
+# endif
+
+# if !@HAVE_LANGINFO_ERA@
+# define ERA 10047
+# define ERA_D_FMT 10048
+# define ERA_D_T_FMT 10049
+# define ERA_T_FMT 10050
+# define ALT_DIGITS 10051
+# define GNULIB_defined_ERA 1
+# endif
+
+# if !@HAVE_LANGINFO_YESEXPR@
+# define YESEXPR 10053
+# define NOEXPR 10054
+# define GNULIB_defined_YESEXPR 1
+# endif
+
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Declare overridden functions. */
+
+
+/* Return a piece of locale dependent information.
+ Note: The difference between nl_langinfo (CODESET) and locale_charset ()
+ is that the latter normalizes the encoding names to GNU conventions. */
+
+#if @GNULIB_NL_LANGINFO@
+# if @REPLACE_NL_LANGINFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef nl_langinfo
+# define nl_langinfo rpl_nl_langinfo
+# endif
+_GL_FUNCDECL_RPL (nl_langinfo, char *, (nl_item item));
+_GL_CXXALIAS_RPL (nl_langinfo, char *, (nl_item item));
+# else
+# if !@HAVE_NL_LANGINFO@
+_GL_FUNCDECL_SYS (nl_langinfo, char *, (nl_item item));
+# endif
+_GL_CXXALIAS_SYS (nl_langinfo, char *, (nl_item item));
+# endif
+_GL_CXXALIASWARN (nl_langinfo);
+#elif defined GNULIB_POSIXCHECK
+# undef nl_langinfo
+# if HAVE_RAW_DECL_NL_LANGINFO
+_GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - "
+ "use gnulib module nl_langinfo for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_LANGINFO_H */
+#endif /* _@GUARD_PREFIX@_LANGINFO_H */
diff --git a/lib/lc-charset-dispatch.c b/lib/lc-charset-dispatch.c
new file mode 100644
index 0000000..79057d4
--- /dev/null
+++ b/lib/lc-charset-dispatch.c
@@ -0,0 +1,82 @@
+/* Dispatching based on the current locale's character encoding.
+ Copyright (C) 2018-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2018. */
+
+#include <config.h>
+
+/* Specification. */
+#include "lc-charset-dispatch.h"
+
+#if GNULIB_defined_mbstate_t
+
+# include "localcharset.h"
+# include "streq.h"
+
+# if GNULIB_WCHAR_SINGLE
+/* When we know that the locale does not change, provide a speedup by
+ caching the value of locale_encoding_classification. */
+# define locale_encoding_classification_cached locale_encoding_classification
+# else
+/* By default, don't make assumptions, hence no caching. */
+# define locale_encoding_classification_uncached locale_encoding_classification
+# endif
+
+# if GNULIB_WCHAR_SINGLE
+static inline
+# endif
+enc_t
+locale_encoding_classification_uncached (void)
+{
+ const char *encoding = locale_charset ();
+ if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
+ return enc_utf8;
+ if (STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
+ return enc_eucjp;
+ if (STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
+ return enc_94;
+ if (STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
+ return enc_euctw;
+ if (STREQ_OPT (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
+ return enc_gb18030;
+ if (STREQ_OPT (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
+ return enc_sjis;
+ return enc_other;
+}
+
+# if GNULIB_WCHAR_SINGLE
+
+static int cached_locale_enc = -1;
+
+enc_t
+locale_encoding_classification_cached (void)
+{
+ if (cached_locale_enc < 0)
+ cached_locale_enc = locale_encoding_classification_uncached ();
+ return cached_locale_enc;
+}
+
+# endif
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/lib/lc-charset-dispatch.h b/lib/lc-charset-dispatch.h
new file mode 100644
index 0000000..95c2316
--- /dev/null
+++ b/lib/lc-charset-dispatch.h
@@ -0,0 +1,40 @@
+/* Dispatching based on the current locale's character encoding.
+ Copyright (C) 2018-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2018. */
+
+#include <wchar.h>
+
+#if GNULIB_defined_mbstate_t
+
+/* A classification of special values of the encoding of the current locale. */
+typedef enum
+ {
+ enc_other, /* other */
+ enc_utf8, /* UTF-8 */
+ enc_eucjp, /* EUC-JP */
+ enc_94, /* EUC-KR, GB2312, BIG5 */
+ enc_euctw, /* EUC-TW */
+ enc_gb18030, /* GB18030 */
+ enc_sjis /* SJIS */
+ }
+ enc_t;
+
+/* Returns a classification of special values of the encoding of the current
+ locale. */
+extern enc_t locale_encoding_classification (void);
+
+#endif
diff --git a/lib/libc-config.h b/lib/libc-config.h
new file mode 100644
index 0000000..1300c3a
--- /dev/null
+++ b/lib/libc-config.h
@@ -0,0 +1,184 @@
+/* System definitions for code taken from the GNU C Library
+
+ Copyright 2017-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+/* This is intended to be a good-enough substitute for glibc system
+ macros like those defined in <sys/cdefs.h>, so that Gnulib code
+ shared with glibc can do this as the first #include:
+
+ #ifndef _LIBC
+ # include <libc-config.h>
+ #endif
+
+ When compiled as part of glibc this is a no-op; when compiled as
+ part of Gnulib this includes Gnulib's <config.h> and defines macros
+ that glibc library code would normally assume. */
+
+#include <config.h>
+
+/* On glibc this includes <features.h> and <sys/cdefs.h> and #defines
+ _FEATURES_H, __WORDSIZE, and __set_errno. On FreeBSD 11 it
+ includes <sys/cdefs.h> which defines __nonnull. Elsewhere it
+ is harmless. */
+#include <errno.h>
+
+/* From glibc <errno.h>. */
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+/* From glibc <features.h>. */
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) ((maj) < __GNUC__ + ((min) <= __GNUC_MINOR__))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __glibc_clang_prereq
+# if defined __clang_major__ && defined __clang_minor__
+# ifdef __apple_build_version__
+/* Apple for some reason renumbers __clang_major__ and __clang_minor__.
+ Gnulib code uses only __glibc_clang_prereq (3, 5); map it to
+ 6000000 <= __apple_build_version__. Support for other calls to
+ __glibc_clang_prereq can be added here as needed. */
+# define __glibc_clang_prereq(maj, min) \
+ ((maj) == 3 && (min) == 5 ? 6000000 <= __apple_build_version__ : 0)
+# else
+# define __glibc_clang_prereq(maj, min) \
+ ((maj) < __clang_major__ + ((min) <= __clang_minor__))
+# endif
+# else
+# define __glibc_clang_prereq(maj, min) 0
+# endif
+#endif
+
+
+/* Prepare to include <cdefs.h>, which is our copy of glibc
+ <sys/cdefs.h>. */
+
+/* Define _FEATURES_H so that <cdefs.h> does not include <features.h>. */
+#ifndef _FEATURES_H
+# define _FEATURES_H 1
+#endif
+/* Define __WORDSIZE so that <cdefs.h> does not attempt to include
+ nonexistent files. Make it a syntax error, since Gnulib does not
+ use __WORDSIZE now, and if Gnulib uses it later the syntax error
+ will let us know that __WORDSIZE needs configuring. */
+#ifndef __WORDSIZE
+# define __WORDSIZE %%%
+#endif
+/* Undef the macros unconditionally defined by our copy of glibc
+ <sys/cdefs.h>, so that they do not clash with any system-defined
+ versions. */
+#undef _SYS_CDEFS_H
+#undef __ASMNAME
+#undef __ASMNAME2
+#undef __BEGIN_DECLS
+#undef __CONCAT
+#undef __END_DECLS
+#undef __HAVE_GENERIC_SELECTION
+#undef __LDBL_COMPAT
+#undef __LDBL_REDIR
+#undef __LDBL_REDIR1
+#undef __LDBL_REDIR1_DECL
+#undef __LDBL_REDIR1_NTH
+#undef __LDBL_REDIR_DECL
+#undef __LDBL_REDIR_NTH
+#undef __LEAF
+#undef __LEAF_ATTR
+#undef __NTH
+#undef __NTHNL
+#undef __P
+#undef __PMT
+#undef __REDIRECT
+#undef __REDIRECT_LDBL
+#undef __REDIRECT_NTH
+#undef __REDIRECT_NTHNL
+#undef __REDIRECT_NTH_LDBL
+#undef __STRING
+#undef __THROW
+#undef __THROWNL
+#undef __always_inline
+#undef __attribute__
+#undef __attribute_alloc_size__
+#undef __attribute_artificial__
+#undef __attribute_const__
+#undef __attribute_deprecated__
+#undef __attribute_deprecated_msg__
+#undef __attribute_format_arg__
+#undef __attribute_format_strfmon__
+#undef __attribute_malloc__
+#undef __attribute_noinline__
+#undef __attribute_nonstring__
+#undef __attribute_pure__
+#undef __attribute_used__
+#undef __attribute_warn_unused_result__
+#undef __bos
+#undef __bos0
+#undef __errordecl
+#undef __extension__
+#undef __extern_always_inline
+#undef __extern_inline
+#undef __flexarr
+#undef __fortify_function
+#undef __glibc_c99_flexarr_available
+#undef __glibc_clang_has_extension
+#undef __glibc_likely
+#undef __glibc_macro_warning
+#undef __glibc_macro_warning1
+#undef __glibc_unlikely
+#undef __inline
+#undef __ptr_t
+#undef __restrict
+#undef __restrict_arr
+#undef __va_arg_pack
+#undef __va_arg_pack_len
+#undef __warnattr
+#undef __warndecl
+
+/* Include our copy of glibc <sys/cdefs.h>. */
+#include <cdefs.h>
+
+/* <cdefs.h> __inline is too pessimistic for non-GCC. */
+#undef __inline
+#ifndef HAVE___INLINE
+# if 199901 <= __STDC_VERSION__ || defined inline
+# define __inline inline
+# else
+# define __inline
+# endif
+#endif
+
+
+/* A substitute for glibc <libc-symbols.h>, good enough for Gnulib. */
+#define attribute_hidden
+#define libc_hidden_proto(name, ...)
+#define libc_hidden_def(name)
+#define libc_hidden_weak(name)
+#define libc_hidden_ver(local, name)
+#define strong_alias(name, aliasname)
+#define weak_alias(name, aliasname)
+
+/* A substitute for glibc <shlib-compat.h>, good enough for Gnulib. */
+#define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+#define compat_symbol(lib, local, symbol, version) extern int dummy
+#define versioned_symbol(lib, local, symbol, version) extern int dummy
diff --git a/lib/libunistring.valgrind b/lib/libunistring.valgrind
new file mode 100644
index 0000000..dea153f
--- /dev/null
+++ b/lib/libunistring.valgrind
@@ -0,0 +1,24 @@
+# Suppress valgrind messages in an installed libunistring.
+
+# Copyright (C) 2010-2020 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/>.
+
+# Suppress a valgrind message about use of uninitialized memory in freea().
+# This use is OK because it provides only a speedup.
+{
+ libunistring_freea
+ Memcheck:Cond
+ fun:libunistring_freea
+}
diff --git a/lib/limits.in.h b/lib/limits.in.h
new file mode 100644
index 0000000..d25c523
--- /dev/null
+++ b/lib/limits.in.h
@@ -0,0 +1,121 @@
+/* A GNU-like <limits.h>.
+
+ Copyright 2016-2020 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, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_LIMITS_H
+/* Special invocation convention:
+ On Haiku/x86_64, we have a sequence of nested includes
+ <limits.h> -> <syslimits.h> -> <limits.h>.
+ In this situation, LONG_MAX and INT_MAX are not yet defined,
+ therefore we should not attempt to define LONG_BIT. */
+
+#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+
+# define _GL_ALREADY_INCLUDING_LIMITS_H
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+# undef _GL_ALREADY_INCLUDING_LIMITS_H
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+#define _@GUARD_PREFIX@_LIMITS_H
+
+#ifndef LLONG_MIN
+# if defined LONG_LONG_MIN /* HP-UX 11.31 */
+# define LLONG_MIN LONG_LONG_MIN
+# elif defined LONGLONG_MIN /* IRIX 6.5 */
+# define LLONG_MIN LONGLONG_MIN
+# elif defined __GNUC__
+# define LLONG_MIN (- __LONG_LONG_MAX__ - 1LL)
+# endif
+#endif
+#ifndef LLONG_MAX
+# if defined LONG_LONG_MAX /* HP-UX 11.31 */
+# define LLONG_MAX LONG_LONG_MAX
+# elif defined LONGLONG_MAX /* IRIX 6.5 */
+# define LLONG_MAX LONGLONG_MAX
+# elif defined __GNUC__
+# define LLONG_MAX __LONG_LONG_MAX__
+# endif
+#endif
+#ifndef ULLONG_MAX
+# if defined ULONG_LONG_MAX /* HP-UX 11.31 */
+# define ULLONG_MAX ULONG_LONG_MAX
+# elif defined ULONGLONG_MAX /* IRIX 6.5 */
+# define ULLONG_MAX ULONGLONG_MAX
+# elif defined __GNUC__
+# define ULLONG_MAX (__LONG_LONG_MAX__ * 2ULL + 1ULL)
+# endif
+#endif
+
+/* The number of usable bits in an unsigned or signed integer type
+ with minimum value MIN and maximum value MAX, as an int expression
+ suitable in #if. Cover all known practical hosts. This
+ implementation exploits the fact that MAX is 1 less than a power of
+ 2, and merely counts the number of 1 bits in MAX; "COBn" means
+ "count the number of 1 bits in the low-order n bits"). */
+#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
+#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
+#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
+#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
+#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
+#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
+#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
+
+#ifndef WORD_BIT
+/* Assume 'int' is 32 bits wide. */
+# define WORD_BIT 32
+#endif
+#ifndef LONG_BIT
+/* Assume 'long' is 32 or 64 bits wide. */
+# if LONG_MAX == INT_MAX
+# define LONG_BIT 32
+# else
+# define LONG_BIT 64
+# endif
+#endif
+
+/* Macros specified by ISO/IEC TS 18661-1:2014. */
+
+#if (! defined ULLONG_WIDTH \
+ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
+# define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
+# define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
+# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
+# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
+# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
+# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
+# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
+# define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
+# define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
+# define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
+#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif
diff --git a/lib/link.c b/lib/link.c
new file mode 100644
index 0000000..be814eb
--- /dev/null
+++ b/lib/link.c
@@ -0,0 +1,233 @@
+/* Emulate link on platforms that lack it, namely native Windows platforms.
+
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_LINK
+# if defined _WIN32 && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetModuleHandle
+# define GetModuleHandle GetModuleHandleA
+# undef CreateHardLink
+# define CreateHardLink CreateHardLinkA
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WINXP)
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
+/* CreateHardLink was introduced only in Windows 2000. */
+typedef BOOL (WINAPI * CreateHardLinkFuncType) (LPCSTR lpFileName,
+ LPCSTR lpExistingFileName,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes);
+static CreateHardLinkFuncType CreateHardLinkFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE kernel32 = GetModuleHandle ("kernel32.dll");
+ if (kernel32 != NULL)
+ {
+ CreateHardLinkFunc =
+ (CreateHardLinkFuncType) GetProcAddress (kernel32, "CreateHardLinkA");
+ }
+ initialized = TRUE;
+}
+
+# else
+
+# define CreateHardLinkFunc CreateHardLink
+
+# endif
+
+int
+link (const char *file1, const char *file2)
+{
+ char *dir;
+ size_t len1 = strlen (file1);
+ size_t len2 = strlen (file2);
+
+# if !(_WIN32_WINNT >= _WIN32_WINNT_WINXP)
+ if (!initialized)
+ initialize ();
+# endif
+
+ if (CreateHardLinkFunc == NULL)
+ {
+ /* System does not support hard links. */
+ errno = EPERM;
+ return -1;
+ }
+ /* Reject trailing slashes on non-directories; mingw does not
+ support hard-linking directories. */
+ if ((len1 && (file1[len1 - 1] == '/' || file1[len1 - 1] == '\\'))
+ || (len2 && (file2[len2 - 1] == '/' || file2[len2 - 1] == '\\')))
+ {
+ struct stat st;
+ if (stat (file1, &st) == 0 && S_ISDIR (st.st_mode))
+ errno = EPERM;
+ else
+ errno = ENOTDIR;
+ return -1;
+ }
+ /* CreateHardLink("b/.","a",NULL) creates file "b", so we must check
+ that dirname(file2) exists. */
+ dir = strdup (file2);
+ if (!dir)
+ return -1;
+ {
+ struct stat st;
+ char *p = strchr (dir, '\0');
+ while (dir < p && (*--p != '/' && *p != '\\'));
+ *p = '\0';
+ if (p != dir && stat (dir, &st) != 0 && errno != EOVERFLOW)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ free (dir);
+ }
+ /* Now create the link. */
+ if (CreateHardLinkFunc (file2, file1, NULL) == 0)
+ {
+ /* It is not documented which errors CreateHardLink() can produce.
+ * The following conversions are based on tests on a Windows XP SP2
+ * system. */
+ DWORD err = GetLastError ();
+ switch (err)
+ {
+ case ERROR_ACCESS_DENIED:
+ errno = EACCES;
+ break;
+
+ case ERROR_INVALID_FUNCTION: /* fs does not support hard links */
+ errno = EPERM;
+ break;
+
+ case ERROR_NOT_SAME_DEVICE:
+ errno = EXDEV;
+ break;
+
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_FILE_NOT_FOUND:
+ errno = ENOENT;
+ break;
+
+ case ERROR_INVALID_PARAMETER:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_TOO_MANY_LINKS:
+ errno = EMLINK;
+ break;
+
+ case ERROR_ALREADY_EXISTS:
+ errno = EEXIST;
+ break;
+
+ default:
+ errno = EIO;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+
+# else /* !Windows */
+
+# error "This platform lacks a link function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+# endif /* !Windows */
+#else /* HAVE_LINK */
+
+# undef link
+
+/* Create a hard link from FILE1 to FILE2, working around platform bugs. */
+int
+rpl_link (char const *file1, char const *file2)
+{
+ size_t len1;
+ size_t len2;
+ struct stat st;
+
+ /* Don't allow IRIX to dereference dangling file2 symlink. */
+ if (lstat (file2, &st) == 0 || errno == EOVERFLOW)
+ {
+ errno = EEXIST;
+ return -1;
+ }
+
+ /* Reject trailing slashes on non-directories. */
+ len1 = strlen (file1);
+ len2 = strlen (file2);
+ if ((len1 && file1[len1 - 1] == '/')
+ || (len2 && file2[len2 - 1] == '/'))
+ {
+ /* Let link() decide whether hard-linking directories is legal.
+ If stat() fails, then link() should fail for the same reason
+ (although on Solaris 9, link("file/","oops") mistakenly
+ succeeds); if stat() succeeds, require a directory. */
+ if (stat (file1, &st))
+ return -1;
+ if (!S_ISDIR (st.st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ else
+ {
+ /* Fix Cygwin 1.5.x bug where link("a","b/.") creates file "b". */
+ char *dir = strdup (file2);
+ char *p;
+ if (!dir)
+ return -1;
+ /* We already know file2 does not end in slash. Strip off the
+ basename, then check that the dirname exists. */
+ p = strrchr (dir, '/');
+ if (p)
+ {
+ *p = '\0';
+ if (stat (dir, &st) != 0 && errno != EOVERFLOW)
+ {
+ int saved_errno = errno;
+ free (dir);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+ free (dir);
+ }
+ return link (file1, file2);
+}
+#endif /* HAVE_LINK */
diff --git a/lib/listen.c b/lib/listen.c
new file mode 100644
index 0000000..c1db145
--- /dev/null
+++ b/lib/listen.c
@@ -0,0 +1,49 @@
+/* listen.c --- wrappers for Windows listen function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef listen
+
+int
+rpl_listen (int fd, int backlog)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = listen (sock, backlog);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/localcharset.c b/lib/localcharset.c
new file mode 100644
index 0000000..721c8a9
--- /dev/null
+++ b/lib/localcharset.c
@@ -0,0 +1,1159 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+ Copyright (C) 2000-2006, 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "localcharset.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
+# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
+#endif
+
+#if defined _WIN32 && !defined __CYGWIN__
+# define WINDOWS_NATIVE
+# include <locale.h>
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */
+# ifndef OS2
+# define OS2
+# endif
+#endif
+
+#if !defined WINDOWS_NATIVE
+# if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+# else
+# if 0 /* see comment regarding use of setlocale(), below */
+# include <locale.h>
+# endif
+# endif
+# ifdef __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# endif
+#elif defined WINDOWS_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+ /* For the use of setlocale() below, the Gnulib override in setlocale.c is
+ not needed; see the platform lists in setlocale_null.m4. */
+# undef setlocale
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+/* For MB_CUR_MAX_L */
+#if defined DARWIN7
+# include <xlocale.h>
+#endif
+
+
+#if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2
+
+/* On these platforms, we use a mapping from non-canonical encoding name
+ to GNU canonical encoding name. */
+
+/* With glibc-2.1 or newer, we don't need any canonicalization,
+ because glibc has iconv and both glibc and libiconv support all
+ GNU canonical names directly. */
+# if !((defined __GNU_LIBRARY__ && __GLIBC__ >= 2) || defined __UCLIBC__)
+
+struct table_entry
+{
+ const char alias[11+1];
+ const char canonical[11+1];
+};
+
+/* Table of platform-dependent mappings, sorted in ascending order. */
+static const struct table_entry alias_table[] =
+ {
+# if defined __FreeBSD__ /* FreeBSD */
+ /*{ "ARMSCII-8", "ARMSCII-8" },*/
+ { "Big5", "BIG5" },
+ { "C", "ASCII" },
+ /*{ "CP1131", "CP1131" },*/
+ /*{ "CP1251", "CP1251" },*/
+ /*{ "CP866", "CP866" },*/
+ /*{ "GB18030", "GB18030" },*/
+ /*{ "GB2312", "GB2312" },*/
+ /*{ "GBK", "GBK" },*/
+ /*{ "ISCII-DEV", "?" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ /*{ "KOI8-R", "KOI8-R" },*/
+ /*{ "KOI8-U", "KOI8-U" },*/
+ { "SJIS", "SHIFT_JIS" },
+ { "US-ASCII", "ASCII" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" }
+# define alias_table_defined
+# endif
+# if defined __NetBSD__ /* NetBSD */
+ { "646", "ASCII" },
+ /*{ "ARMSCII-8", "ARMSCII-8" },*/
+ /*{ "BIG5", "BIG5" },*/
+ { "Big5-HKSCS", "BIG5-HKSCS" },
+ /*{ "CP1251", "CP1251" },*/
+ /*{ "CP866", "CP866" },*/
+ /*{ "GB18030", "GB18030" },*/
+ /*{ "GB2312", "GB2312" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ /*{ "KOI8-R", "KOI8-R" },*/
+ /*{ "KOI8-U", "KOI8-U" },*/
+ /*{ "PT154", "PT154" },*/
+ { "SJIS", "SHIFT_JIS" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined __OpenBSD__ /* OpenBSD */
+ { "646", "ASCII" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "US-ASCII", "ASCII" }
+# define alias_table_defined
+# endif
+# if defined __APPLE__ && defined __MACH__ /* Mac OS X */
+ /* Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is
+ useless:
+ - It returns the empty string when LANG is set to a locale of the
+ form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8
+ LC_CTYPE file.
+ - The environment variables LANG, LC_CTYPE, LC_ALL are not set by
+ the system; nl_langinfo(CODESET) returns "US-ASCII" in this case.
+ - The documentation says:
+ "... all code that calls BSD system routines should ensure
+ that the const *char parameters of these routines are in UTF-8
+ encoding. All BSD system functions expect their string
+ parameters to be in UTF-8 encoding and nothing else."
+ It also says
+ "An additional caveat is that string parameters for files,
+ paths, and other file-system entities must be in canonical
+ UTF-8. In a canonical UTF-8 Unicode string, all decomposable
+ characters are decomposed ..."
+ but this is not true: You can pass non-decomposed UTF-8 strings
+ to file system functions, and it is the OS which will convert
+ them to decomposed UTF-8 before accessing the file system.
+ - The Apple Terminal application displays UTF-8 by default.
+ - However, other applications are free to use different encodings:
+ - xterm uses ISO-8859-1 by default.
+ - TextEdit uses MacRoman by default.
+ We prefer UTF-8 over decomposed UTF-8-MAC because one should
+ minimize the use of decomposed Unicode. Unfortunately, through the
+ Darwin file system, decomposed UTF-8 strings are leaked into user
+ space nevertheless.
+ Then there are also the locales with encodings other than US-ASCII
+ and UTF-8. These locales can be occasionally useful to users (e.g.
+ when grepping through ISO-8859-1 encoded text files), when all their
+ file names are in US-ASCII.
+ */
+ { "ARMSCII-8", "ARMSCII-8" },
+ { "Big5", "BIG5" },
+ { "Big5HKSCS", "BIG5-HKSCS" },
+ { "CP1131", "CP1131" },
+ { "CP1251", "CP1251" },
+ { "CP866", "CP866" },
+ { "CP949", "CP949" },
+ { "GB18030", "GB18030" },
+ { "GB2312", "GB2312" },
+ { "GBK", "GBK" },
+ /*{ "ISCII-DEV", "?" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "KOI8-R", "KOI8-R" },
+ { "KOI8-U", "KOI8-U" },
+ { "PT154", "PT154" },
+ { "SJIS", "SHIFT_JIS" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" }
+# define alias_table_defined
+# endif
+# if defined _AIX /* AIX */
+ /*{ "GBK", "GBK" },*/
+ { "IBM-1046", "CP1046" },
+ { "IBM-1124", "CP1124" },
+ { "IBM-1129", "CP1129" },
+ { "IBM-1252", "CP1252" },
+ { "IBM-850", "CP850" },
+ { "IBM-856", "CP856" },
+ { "IBM-921", "ISO-8859-13" },
+ { "IBM-922", "CP922" },
+ { "IBM-932", "CP932" },
+ { "IBM-943", "CP943" },
+ { "IBM-eucCN", "GB2312" },
+ { "IBM-eucJP", "EUC-JP" },
+ { "IBM-eucKR", "EUC-KR" },
+ { "IBM-eucTW", "EUC-TW" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "TIS-620", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "big5", "BIG5" }
+# define alias_table_defined
+# endif
+# if defined __hpux /* HP-UX */
+ { "SJIS", "SHIFT_JIS" },
+ { "arabic8", "HP-ARABIC8" },
+ { "big5", "BIG5" },
+ { "cp1251", "CP1251" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" },
+ { "gb18030", "GB18030" },
+ { "greek8", "HP-GREEK8" },
+ { "hebrew8", "HP-HEBREW8" },
+ { "hkbig5", "BIG5-HKSCS" },
+ { "hp15CN", "GB2312" },
+ { "iso88591", "ISO-8859-1" },
+ { "iso885913", "ISO-8859-13" },
+ { "iso885915", "ISO-8859-15" },
+ { "iso88592", "ISO-8859-2" },
+ { "iso88594", "ISO-8859-4" },
+ { "iso88595", "ISO-8859-5" },
+ { "iso88596", "ISO-8859-6" },
+ { "iso88597", "ISO-8859-7" },
+ { "iso88598", "ISO-8859-8" },
+ { "iso88599", "ISO-8859-9" },
+ { "kana8", "HP-KANA8" },
+ { "koi8r", "KOI8-R" },
+ { "roman8", "HP-ROMAN8" },
+ { "tis620", "TIS-620" },
+ { "turkish8", "HP-TURKISH8" },
+ { "utf8", "UTF-8" }
+# define alias_table_defined
+# endif
+# if defined __sgi /* IRIX */
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "eucCN", "GB2312" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined __osf__ /* OSF/1 */
+ /*{ "GBK", "GBK" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "KSC5601", "CP949" },
+ { "SJIS", "SHIFT_JIS" },
+ { "TACTIS", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "big5", "BIG5" },
+ { "cp850", "CP850" },
+ { "dechanyu", "DEC-HANYU" },
+ { "dechanzi", "GB2312" },
+ { "deckanji", "DEC-KANJI" },
+ { "deckorean", "EUC-KR" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW", "EUC-TW" },
+ { "sdeckanji", "EUC-JP" }
+# define alias_table_defined
+# endif
+# if defined __sun /* Solaris */
+ { "5601", "EUC-KR" },
+ { "646", "ASCII" },
+ /*{ "BIG5", "BIG5" },*/
+ { "Big5-HKSCS", "BIG5-HKSCS" },
+ { "GB18030", "GB18030" },
+ /*{ "GBK", "GBK" },*/
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-11", "TIS-620" },
+ { "ISO8859-13", "ISO-8859-13" },
+ { "ISO8859-15", "ISO-8859-15" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-3", "ISO-8859-3" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "PCK", "SHIFT_JIS" },
+ { "TIS620.2533", "TIS-620" },
+ /*{ "UTF-8", "UTF-8" },*/
+ { "ansi-1251", "CP1251" },
+ { "cns11643", "EUC-TW" },
+ { "eucJP", "EUC-JP" },
+ { "gb2312", "GB2312" },
+ { "koi8-r", "KOI8-R" }
+# define alias_table_defined
+# endif
+# if defined __minix /* Minix */
+ { "646", "ASCII" }
+# define alias_table_defined
+# endif
+# if defined WINDOWS_NATIVE || defined __CYGWIN__ /* Windows */
+ { "CP1361", "JOHAB" },
+ { "CP20127", "ASCII" },
+ { "CP20866", "KOI8-R" },
+ { "CP20936", "GB2312" },
+ { "CP21866", "KOI8-RU" },
+ { "CP28591", "ISO-8859-1" },
+ { "CP28592", "ISO-8859-2" },
+ { "CP28593", "ISO-8859-3" },
+ { "CP28594", "ISO-8859-4" },
+ { "CP28595", "ISO-8859-5" },
+ { "CP28596", "ISO-8859-6" },
+ { "CP28597", "ISO-8859-7" },
+ { "CP28598", "ISO-8859-8" },
+ { "CP28599", "ISO-8859-9" },
+ { "CP28605", "ISO-8859-15" },
+ { "CP38598", "ISO-8859-8" },
+ { "CP51932", "EUC-JP" },
+ { "CP51936", "GB2312" },
+ { "CP51949", "EUC-KR" },
+ { "CP51950", "EUC-TW" },
+ { "CP54936", "GB18030" },
+ { "CP65001", "UTF-8" },
+ { "CP936", "GBK" }
+# define alias_table_defined
+# endif
+# if defined OS2 /* OS/2 */
+ /* The list of encodings is taken from "List of OS/2 Codepages"
+ by Alex Taylor:
+ <http://altsan.org/os2/toolkits/uls/index.html#codepages>.
+ See also "__convcp() of kLIBC":
+ <https://github.com/bitwiseworks/libc/blob/master/src/emx/src/lib/locale/__convcp.c>. */
+ { "CP1004", "CP1252" },
+ /*{ "CP1041", "CP943" },*/
+ /*{ "CP1088", "CP949" },*/
+ { "CP1089", "ISO-8859-6" },
+ /*{ "CP1114", "CP950" },*/
+ /*{ "CP1115", "GB2312" },*/
+ { "CP1208", "UTF-8" },
+ /*{ "CP1380", "GB2312" },*/
+ { "CP1381", "GB2312" },
+ { "CP1383", "GB2312" },
+ { "CP1386", "GBK" },
+ /*{ "CP301", "CP943" },*/
+ { "CP3372", "EUC-JP" },
+ { "CP4946", "CP850" },
+ /*{ "CP5048", "JIS_X0208-1990" },*/
+ /*{ "CP5049", "JIS_X0212-1990" },*/
+ /*{ "CP5067", "KS_C_5601-1987" },*/
+ { "CP813", "ISO-8859-7" },
+ { "CP819", "ISO-8859-1" },
+ { "CP878", "KOI8-R" },
+ /*{ "CP897", "CP943" },*/
+ { "CP912", "ISO-8859-2" },
+ { "CP913", "ISO-8859-3" },
+ { "CP914", "ISO-8859-4" },
+ { "CP915", "ISO-8859-5" },
+ { "CP916", "ISO-8859-8" },
+ { "CP920", "ISO-8859-9" },
+ { "CP921", "ISO-8859-13" },
+ { "CP923", "ISO-8859-15" },
+ /*{ "CP941", "CP943" },*/
+ /*{ "CP947", "CP950" },*/
+ /*{ "CP951", "CP949" },*/
+ /*{ "CP952", "JIS_X0208-1990" },*/
+ /*{ "CP953", "JIS_X0212-1990" },*/
+ { "CP954", "EUC-JP" },
+ { "CP964", "EUC-TW" },
+ { "CP970", "EUC-KR" },
+ /*{ "CP971", "KS_C_5601-1987" },*/
+ { "IBM-1004", "CP1252" },
+ /*{ "IBM-1006", "?" },*/
+ /*{ "IBM-1008", "?" },*/
+ /*{ "IBM-1041", "CP943" },*/
+ /*{ "IBM-1051", "?" },*/
+ /*{ "IBM-1088", "CP949" },*/
+ { "IBM-1089", "ISO-8859-6" },
+ /*{ "IBM-1098", "?" },*/
+ /*{ "IBM-1114", "CP950" },*/
+ /*{ "IBM-1115", "GB2312" },*/
+ /*{ "IBM-1116", "?" },*/
+ /*{ "IBM-1117", "?" },*/
+ /*{ "IBM-1118", "?" },*/
+ /*{ "IBM-1119", "?" },*/
+ { "IBM-1124", "CP1124" },
+ { "IBM-1125", "CP1125" },
+ { "IBM-1131", "CP1131" },
+ { "IBM-1208", "UTF-8" },
+ { "IBM-1250", "CP1250" },
+ { "IBM-1251", "CP1251" },
+ { "IBM-1252", "CP1252" },
+ { "IBM-1253", "CP1253" },
+ { "IBM-1254", "CP1254" },
+ { "IBM-1255", "CP1255" },
+ { "IBM-1256", "CP1256" },
+ { "IBM-1257", "CP1257" },
+ /*{ "IBM-1275", "?" },*/
+ /*{ "IBM-1276", "?" },*/
+ /*{ "IBM-1277", "?" },*/
+ /*{ "IBM-1280", "?" },*/
+ /*{ "IBM-1281", "?" },*/
+ /*{ "IBM-1282", "?" },*/
+ /*{ "IBM-1283", "?" },*/
+ /*{ "IBM-1380", "GB2312" },*/
+ { "IBM-1381", "GB2312" },
+ { "IBM-1383", "GB2312" },
+ { "IBM-1386", "GBK" },
+ /*{ "IBM-301", "CP943" },*/
+ { "IBM-3372", "EUC-JP" },
+ { "IBM-367", "ASCII" },
+ { "IBM-437", "CP437" },
+ { "IBM-4946", "CP850" },
+ /*{ "IBM-5048", "JIS_X0208-1990" },*/
+ /*{ "IBM-5049", "JIS_X0212-1990" },*/
+ /*{ "IBM-5067", "KS_C_5601-1987" },*/
+ { "IBM-813", "ISO-8859-7" },
+ { "IBM-819", "ISO-8859-1" },
+ { "IBM-850", "CP850" },
+ /*{ "IBM-851", "?" },*/
+ { "IBM-852", "CP852" },
+ { "IBM-855", "CP855" },
+ { "IBM-856", "CP856" },
+ { "IBM-857", "CP857" },
+ /*{ "IBM-859", "?" },*/
+ { "IBM-860", "CP860" },
+ { "IBM-861", "CP861" },
+ { "IBM-862", "CP862" },
+ { "IBM-863", "CP863" },
+ { "IBM-864", "CP864" },
+ { "IBM-865", "CP865" },
+ { "IBM-866", "CP866" },
+ /*{ "IBM-868", "?" },*/
+ { "IBM-869", "CP869" },
+ { "IBM-874", "CP874" },
+ { "IBM-878", "KOI8-R" },
+ /*{ "IBM-895", "?" },*/
+ /*{ "IBM-897", "CP943" },*/
+ /*{ "IBM-907", "?" },*/
+ /*{ "IBM-909", "?" },*/
+ { "IBM-912", "ISO-8859-2" },
+ { "IBM-913", "ISO-8859-3" },
+ { "IBM-914", "ISO-8859-4" },
+ { "IBM-915", "ISO-8859-5" },
+ { "IBM-916", "ISO-8859-8" },
+ { "IBM-920", "ISO-8859-9" },
+ { "IBM-921", "ISO-8859-13" },
+ { "IBM-922", "CP922" },
+ { "IBM-923", "ISO-8859-15" },
+ { "IBM-932", "CP932" },
+ /*{ "IBM-941", "CP943" },*/
+ /*{ "IBM-942", "?" },*/
+ { "IBM-943", "CP943" },
+ /*{ "IBM-947", "CP950" },*/
+ { "IBM-949", "CP949" },
+ { "IBM-950", "CP950" },
+ /*{ "IBM-951", "CP949" },*/
+ /*{ "IBM-952", "JIS_X0208-1990" },*/
+ /*{ "IBM-953", "JIS_X0212-1990" },*/
+ { "IBM-954", "EUC-JP" },
+ /*{ "IBM-955", "?" },*/
+ { "IBM-964", "EUC-TW" },
+ { "IBM-970", "EUC-KR" },
+ /*{ "IBM-971", "KS_C_5601-1987" },*/
+ { "IBM-eucCN", "GB2312" },
+ { "IBM-eucJP", "EUC-JP" },
+ { "IBM-eucKR", "EUC-KR" },
+ { "IBM-eucTW", "EUC-TW" },
+ { "IBM33722", "EUC-JP" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-3", "ISO-8859-3" },
+ { "ISO8859-4", "ISO-8859-4" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-6", "ISO-8859-6" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ /*{ "JISX0201-1976", "JISX0201-1976" },*/
+ /*{ "JISX0208-1978", "?" },*/
+ /*{ "JISX0208-1983", "JIS_X0208-1983" },*/
+ /*{ "JISX0208-1990", "JIS_X0208-1990" },*/
+ /*{ "JISX0212-1990", "JIS_X0212-1990" },*/
+ /*{ "KSC5601-1987", "KS_C_5601-1987" },*/
+ { "SJIS-1", "CP943" },
+ { "SJIS-2", "CP943" },
+ { "eucJP", "EUC-JP" },
+ { "eucKR", "EUC-KR" },
+ { "eucTW-1993", "EUC-TW" }
+# define alias_table_defined
+# endif
+# if defined VMS /* OpenVMS */
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+ section 10.7 "Handling Different Character Sets". */
+ { "DECHANYU", "DEC-HANYU" },
+ { "DECHANZI", "GB2312" },
+ { "DECKANJI", "DEC-KANJI" },
+ { "DECKOREAN", "EUC-KR" },
+ { "ISO8859-1", "ISO-8859-1" },
+ { "ISO8859-2", "ISO-8859-2" },
+ { "ISO8859-5", "ISO-8859-5" },
+ { "ISO8859-7", "ISO-8859-7" },
+ { "ISO8859-8", "ISO-8859-8" },
+ { "ISO8859-9", "ISO-8859-9" },
+ { "SDECKANJI", "EUC-JP" },
+ { "SJIS", "SHIFT_JIS" },
+ { "eucJP", "EUC-JP" },
+ { "eucTW", "EUC-TW" }
+# define alias_table_defined
+# endif
+# ifndef alias_table_defined
+ /* Just a dummy entry, to avoid a C syntax error. */
+ { "", "" }
+# endif
+ };
+
+# endif
+
+#else
+
+/* On these platforms, we use a mapping from locale name to GNU canonical
+ encoding name. */
+
+struct table_entry
+{
+ const char locale[17+1];
+ const char canonical[11+1];
+};
+
+/* Table of platform-dependent mappings, sorted in ascending order. */
+static const struct table_entry locale_table[] =
+ {
+# if defined __FreeBSD__ /* FreeBSD 4.2 */
+ { "cs_CZ.ISO_8859-2", "ISO-8859-2" },
+ { "da_DK.DIS_8859-15", "ISO-8859-15" },
+ { "da_DK.ISO_8859-1", "ISO-8859-1" },
+ { "de_AT.DIS_8859-15", "ISO-8859-15" },
+ { "de_AT.ISO_8859-1", "ISO-8859-1" },
+ { "de_CH.DIS_8859-15", "ISO-8859-15" },
+ { "de_CH.ISO_8859-1", "ISO-8859-1" },
+ { "de_DE.DIS_8859-15", "ISO-8859-15" },
+ { "de_DE.ISO_8859-1", "ISO-8859-1" },
+ { "en_AU.DIS_8859-15", "ISO-8859-15" },
+ { "en_AU.ISO_8859-1", "ISO-8859-1" },
+ { "en_CA.DIS_8859-15", "ISO-8859-15" },
+ { "en_CA.ISO_8859-1", "ISO-8859-1" },
+ { "en_GB.DIS_8859-15", "ISO-8859-15" },
+ { "en_GB.ISO_8859-1", "ISO-8859-1" },
+ { "en_US.DIS_8859-15", "ISO-8859-15" },
+ { "en_US.ISO_8859-1", "ISO-8859-1" },
+ { "es_ES.DIS_8859-15", "ISO-8859-15" },
+ { "es_ES.ISO_8859-1", "ISO-8859-1" },
+ { "fi_FI.DIS_8859-15", "ISO-8859-15" },
+ { "fi_FI.ISO_8859-1", "ISO-8859-1" },
+ { "fr_BE.DIS_8859-15", "ISO-8859-15" },
+ { "fr_BE.ISO_8859-1", "ISO-8859-1" },
+ { "fr_CA.DIS_8859-15", "ISO-8859-15" },
+ { "fr_CA.ISO_8859-1", "ISO-8859-1" },
+ { "fr_CH.DIS_8859-15", "ISO-8859-15" },
+ { "fr_CH.ISO_8859-1", "ISO-8859-1" },
+ { "fr_FR.DIS_8859-15", "ISO-8859-15" },
+ { "fr_FR.ISO_8859-1", "ISO-8859-1" },
+ { "hr_HR.ISO_8859-2", "ISO-8859-2" },
+ { "hu_HU.ISO_8859-2", "ISO-8859-2" },
+ { "is_IS.DIS_8859-15", "ISO-8859-15" },
+ { "is_IS.ISO_8859-1", "ISO-8859-1" },
+ { "it_CH.DIS_8859-15", "ISO-8859-15" },
+ { "it_CH.ISO_8859-1", "ISO-8859-1" },
+ { "it_IT.DIS_8859-15", "ISO-8859-15" },
+ { "it_IT.ISO_8859-1", "ISO-8859-1" },
+ { "ja_JP.EUC", "EUC-JP" },
+ { "ja_JP.SJIS", "SHIFT_JIS" },
+ { "ja_JP.Shift_JIS", "SHIFT_JIS" },
+ { "ko_KR.EUC", "EUC-KR" },
+ { "la_LN.ASCII", "ASCII" },
+ { "la_LN.DIS_8859-15", "ISO-8859-15" },
+ { "la_LN.ISO_8859-1", "ISO-8859-1" },
+ { "la_LN.ISO_8859-2", "ISO-8859-2" },
+ { "la_LN.ISO_8859-4", "ISO-8859-4" },
+ { "lt_LN.ASCII", "ASCII" },
+ { "lt_LN.DIS_8859-15", "ISO-8859-15" },
+ { "lt_LN.ISO_8859-1", "ISO-8859-1" },
+ { "lt_LN.ISO_8859-2", "ISO-8859-2" },
+ { "lt_LT.ISO_8859-4", "ISO-8859-4" },
+ { "nl_BE.DIS_8859-15", "ISO-8859-15" },
+ { "nl_BE.ISO_8859-1", "ISO-8859-1" },
+ { "nl_NL.DIS_8859-15", "ISO-8859-15" },
+ { "nl_NL.ISO_8859-1", "ISO-8859-1" },
+ { "no_NO.DIS_8859-15", "ISO-8859-15" },
+ { "no_NO.ISO_8859-1", "ISO-8859-1" },
+ { "pl_PL.ISO_8859-2", "ISO-8859-2" },
+ { "pt_PT.DIS_8859-15", "ISO-8859-15" },
+ { "pt_PT.ISO_8859-1", "ISO-8859-1" },
+ { "ru_RU.CP866", "CP866" },
+ { "ru_RU.ISO_8859-5", "ISO-8859-5" },
+ { "ru_RU.KOI8-R", "KOI8-R" },
+ { "ru_SU.CP866", "CP866" },
+ { "ru_SU.ISO_8859-5", "ISO-8859-5" },
+ { "ru_SU.KOI8-R", "KOI8-R" },
+ { "sl_SI.ISO_8859-2", "ISO-8859-2" },
+ { "sv_SE.DIS_8859-15", "ISO-8859-15" },
+ { "sv_SE.ISO_8859-1", "ISO-8859-1" },
+ { "uk_UA.KOI8-U", "KOI8-U" },
+ { "zh_CN.EUC", "GB2312" },
+ { "zh_TW.BIG5", "BIG5" },
+ { "zh_TW.Big5", "BIG5" }
+# define locale_table_defined
+# endif
+# if defined __DJGPP__ /* DOS / DJGPP 2.03 */
+ /* The encodings given here may not all be correct.
+ If you find that the encoding given for your language and
+ country is not the one your DOS machine actually uses, just
+ correct it in this file, and send a mail to
+ Juan Manuel Guerrero <juan.guerrero@gmx.de>
+ and <bug-gnulib@gnu.org>. */
+ { "C", "ASCII" },
+ { "ar", "CP864" },
+ { "ar_AE", "CP864" },
+ { "ar_DZ", "CP864" },
+ { "ar_EG", "CP864" },
+ { "ar_IQ", "CP864" },
+ { "ar_IR", "CP864" },
+ { "ar_JO", "CP864" },
+ { "ar_KW", "CP864" },
+ { "ar_MA", "CP864" },
+ { "ar_OM", "CP864" },
+ { "ar_QA", "CP864" },
+ { "ar_SA", "CP864" },
+ { "ar_SY", "CP864" },
+ { "be", "CP866" },
+ { "be_BE", "CP866" },
+ { "bg", "CP866" }, /* not CP855 ?? */
+ { "bg_BG", "CP866" }, /* not CP855 ?? */
+ { "ca", "CP850" },
+ { "ca_ES", "CP850" },
+ { "cs", "CP852" },
+ { "cs_CZ", "CP852" },
+ { "da", "CP865" }, /* not CP850 ?? */
+ { "da_DK", "CP865" }, /* not CP850 ?? */
+ { "de", "CP850" },
+ { "de_AT", "CP850" },
+ { "de_CH", "CP850" },
+ { "de_DE", "CP850" },
+ { "el", "CP869" },
+ { "el_GR", "CP869" },
+ { "en", "CP850" },
+ { "en_AU", "CP850" }, /* not CP437 ?? */
+ { "en_CA", "CP850" },
+ { "en_GB", "CP850" },
+ { "en_NZ", "CP437" },
+ { "en_US", "CP437" },
+ { "en_ZA", "CP850" }, /* not CP437 ?? */
+ { "eo", "CP850" },
+ { "eo_EO", "CP850" },
+ { "es", "CP850" },
+ { "es_AR", "CP850" },
+ { "es_BO", "CP850" },
+ { "es_CL", "CP850" },
+ { "es_CO", "CP850" },
+ { "es_CR", "CP850" },
+ { "es_CU", "CP850" },
+ { "es_DO", "CP850" },
+ { "es_EC", "CP850" },
+ { "es_ES", "CP850" },
+ { "es_GT", "CP850" },
+ { "es_HN", "CP850" },
+ { "es_MX", "CP850" },
+ { "es_NI", "CP850" },
+ { "es_PA", "CP850" },
+ { "es_PE", "CP850" },
+ { "es_PY", "CP850" },
+ { "es_SV", "CP850" },
+ { "es_UY", "CP850" },
+ { "es_VE", "CP850" },
+ { "et", "CP850" },
+ { "et_EE", "CP850" },
+ { "eu", "CP850" },
+ { "eu_ES", "CP850" },
+ { "fi", "CP850" },
+ { "fi_FI", "CP850" },
+ { "fr", "CP850" },
+ { "fr_BE", "CP850" },
+ { "fr_CA", "CP850" },
+ { "fr_CH", "CP850" },
+ { "fr_FR", "CP850" },
+ { "ga", "CP850" },
+ { "ga_IE", "CP850" },
+ { "gd", "CP850" },
+ { "gd_GB", "CP850" },
+ { "gl", "CP850" },
+ { "gl_ES", "CP850" },
+ { "he", "CP862" },
+ { "he_IL", "CP862" },
+ { "hr", "CP852" },
+ { "hr_HR", "CP852" },
+ { "hu", "CP852" },
+ { "hu_HU", "CP852" },
+ { "id", "CP850" }, /* not CP437 ?? */
+ { "id_ID", "CP850" }, /* not CP437 ?? */
+ { "is", "CP861" }, /* not CP850 ?? */
+ { "is_IS", "CP861" }, /* not CP850 ?? */
+ { "it", "CP850" },
+ { "it_CH", "CP850" },
+ { "it_IT", "CP850" },
+ { "ja", "CP932" },
+ { "ja_JP", "CP932" },
+ { "kr", "CP949" }, /* not CP934 ?? */
+ { "kr_KR", "CP949" }, /* not CP934 ?? */
+ { "lt", "CP775" },
+ { "lt_LT", "CP775" },
+ { "lv", "CP775" },
+ { "lv_LV", "CP775" },
+ { "mk", "CP866" }, /* not CP855 ?? */
+ { "mk_MK", "CP866" }, /* not CP855 ?? */
+ { "mt", "CP850" },
+ { "mt_MT", "CP850" },
+ { "nb", "CP865" }, /* not CP850 ?? */
+ { "nb_NO", "CP865" }, /* not CP850 ?? */
+ { "nl", "CP850" },
+ { "nl_BE", "CP850" },
+ { "nl_NL", "CP850" },
+ { "nn", "CP865" }, /* not CP850 ?? */
+ { "nn_NO", "CP865" }, /* not CP850 ?? */
+ { "no", "CP865" }, /* not CP850 ?? */
+ { "no_NO", "CP865" }, /* not CP850 ?? */
+ { "pl", "CP852" },
+ { "pl_PL", "CP852" },
+ { "pt", "CP850" },
+ { "pt_BR", "CP850" },
+ { "pt_PT", "CP850" },
+ { "ro", "CP852" },
+ { "ro_RO", "CP852" },
+ { "ru", "CP866" },
+ { "ru_RU", "CP866" },
+ { "sk", "CP852" },
+ { "sk_SK", "CP852" },
+ { "sl", "CP852" },
+ { "sl_SI", "CP852" },
+ { "sq", "CP852" },
+ { "sq_AL", "CP852" },
+ { "sr", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sr_CS", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sr_YU", "CP852" }, /* CP852 or CP866 or CP855 ?? */
+ { "sv", "CP850" },
+ { "sv_SE", "CP850" },
+ { "th", "CP874" },
+ { "th_TH", "CP874" },
+ { "tr", "CP857" },
+ { "tr_TR", "CP857" },
+ { "uk", "CP1125" },
+ { "uk_UA", "CP1125" },
+ { "zh_CN", "GBK" },
+ { "zh_TW", "CP950" } /* not CP938 ?? */
+# define locale_table_defined
+# endif
+# ifndef locale_table_defined
+ /* Just a dummy entry, to avoid a C syntax error. */
+ { "", "" }
+# endif
+ };
+
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed below.
+ The result must not be freed; it is statically allocated. The result
+ becomes invalid when setlocale() is used to change the global locale, or
+ when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+ is changed; threads in multithreaded programs should not do this.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset (void)
+{
+ const char *codeset;
+
+ /* This function must be multithread-safe. To achieve this without using
+ thread-local storage, we use a simple strcpy or memcpy to fill this static
+ buffer. Filling it through, for example, strcpy + strcat would not be
+ guaranteed to leave the buffer's contents intact if another thread is
+ currently accessing it. If necessary, the contents is first assembled in
+ a stack-allocated buffer. */
+
+#if HAVE_LANGINFO_CODESET || defined WINDOWS_NATIVE || defined OS2
+
+# if HAVE_LANGINFO_CODESET
+
+ /* Most systems support nl_langinfo (CODESET) nowadays. */
+ codeset = nl_langinfo (CODESET);
+
+# ifdef __CYGWIN__
+ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always
+ returns "US-ASCII". Return the suffix of the locale name from the
+ environment variables (if present) or the codepage as a number. */
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+ {
+ const char *locale;
+ static char resultbuf[2 + 10 + 1];
+
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return
+ it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (resultbuf))
+ {
+ /* This way of filling resultbuf is multithread-safe. */
+ memcpy (resultbuf, dot, modifier - dot);
+ resultbuf [modifier - dot] = '\0';
+ return resultbuf;
+ }
+ }
+ }
+
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP(). This encoding is used by Cygwin, unless the user
+ has set the environment variable CYGWIN=codepage:oem (which very few
+ people do).
+ Output directed to console windows needs to be converted (to
+ GetOEMCP() if the console is using a raster font, or to
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+ converting to GetConsoleOutputCP(). This leads to correct results,
+ except when SetConsoleOutputCP has been called and a raster font is
+ in use. */
+ {
+ char buf[2 + 10 + 1];
+
+ sprintf (buf, "CP%u", GetACP ());
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+ }
+# endif
+
+ if (codeset == NULL)
+ /* The canonical name cannot be determined. */
+ codeset = "";
+
+# elif defined WINDOWS_NATIVE
+
+ char buf[2 + 10 + 1];
+ static char resultbuf[2 + 10 + 1];
+
+ /* The Windows API has a function returning the locale's codepage as
+ a number, but the value doesn't change according to what the
+ 'setlocale' call specified. So we use it as a last resort, in
+ case the string returned by 'setlocale' doesn't specify the
+ codepage. */
+ char *current_locale = setlocale (LC_CTYPE, NULL);
+ char *pdot = strrchr (current_locale, '.');
+
+ if (pdot && 2 + strlen (pdot + 1) + 1 <= sizeof (buf))
+ sprintf (buf, "CP%s", pdot + 1);
+ else
+ {
+ /* The Windows API has a function returning the locale's codepage as a
+ number: GetACP().
+ When the output goes to a console window, it needs to be provided in
+ GetOEMCP() encoding if the console is using a raster font, or in
+ GetConsoleOutputCP() encoding if it is using a TrueType font.
+ But in GUI programs and for output sent to files and pipes, GetACP()
+ encoding is the best bet. */
+ sprintf (buf, "CP%u", GetACP ());
+ }
+ /* For a locale name such as "French_France.65001", in Windows 10,
+ setlocale now returns "French_France.utf8" instead. */
+ if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0)
+ codeset = "UTF-8";
+ else
+ {
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+
+# elif defined OS2
+
+ const char *locale;
+ static char resultbuf[2 + 10 + 1];
+ ULONG cp[3];
+ ULONG cplen;
+
+ codeset = NULL;
+
+ /* Allow user to override the codeset, as set in the operating system,
+ with standard language environment variables. */
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ }
+ if (locale != NULL && locale[0] != '\0')
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ const char *dot = strchr (locale, '.');
+
+ if (dot != NULL)
+ {
+ const char *modifier;
+
+ dot++;
+ /* Look for the possible @... trailer and remove it, if any. */
+ modifier = strchr (dot, '@');
+ if (modifier == NULL)
+ return dot;
+ if (modifier - dot < sizeof (resultbuf))
+ {
+ /* This way of filling resultbuf is multithread-safe. */
+ memcpy (resultbuf, dot, modifier - dot);
+ resultbuf [modifier - dot] = '\0';
+ return resultbuf;
+ }
+ }
+
+ /* For the POSIX locale, don't use the system's codepage. */
+ if (strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0)
+ codeset = "";
+ }
+
+ if (codeset == NULL)
+ {
+ /* OS/2 has a function returning the locale's codepage as a number. */
+ if (DosQueryCp (sizeof (cp), cp, &cplen))
+ codeset = "";
+ else
+ {
+ char buf[2 + 10 + 1];
+
+ sprintf (buf, "CP%u", cp[0]);
+ strcpy (resultbuf, buf);
+ codeset = resultbuf;
+ }
+ }
+
+# else
+
+# error "Add code for other platforms here."
+
+# endif
+
+ /* Resolve alias. */
+ {
+# ifdef alias_table_defined
+ /* On some platforms, UTF-8 locales are the most frequently used ones.
+ Speed up the common case and slow down the less common cases by
+ testing for this case first. */
+# if defined __OpenBSD__ || (defined __APPLE__ && defined __MACH__) || defined __sun || defined __CYGWIN__
+ if (strcmp (codeset, "UTF-8") == 0)
+ goto done_table_lookup;
+ else
+# endif
+ {
+ const struct table_entry * const table = alias_table;
+ size_t const table_size =
+ sizeof (alias_table) / sizeof (struct table_entry);
+ /* The table is sorted. Perform a binary search. */
+ size_t hi = table_size;
+ size_t lo = 0;
+ while (lo < hi)
+ {
+ /* Invariant:
+ for i < lo, strcmp (table[i].alias, codeset) < 0,
+ for i >= hi, strcmp (table[i].alias, codeset) > 0. */
+ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
+ int cmp = strcmp (table[mid].alias, codeset);
+ if (cmp < 0)
+ lo = mid + 1;
+ else if (cmp > 0)
+ hi = mid;
+ else
+ {
+ /* Found an i with
+ strcmp (table[i].alias, codeset) == 0. */
+ codeset = table[mid].canonical;
+ goto done_table_lookup;
+ }
+ }
+ }
+ if (0)
+ done_table_lookup: ;
+ else
+# endif
+ {
+ /* Did not find it in the table. */
+ /* On Mac OS X, all modern locales use the UTF-8 encoding.
+ BeOS and Haiku have a single locale, and it has UTF-8 encoding. */
+# if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__
+ codeset = "UTF-8";
+# else
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ if (codeset[0] == '\0')
+ codeset = "ASCII";
+# endif
+ }
+ }
+
+#else
+
+ /* On old systems which lack it, use setlocale or getenv. */
+ const char *locale = NULL;
+
+ /* But most old systems don't have a complete set of locales. Some
+ (like DJGPP) have only the C locale. Therefore we don't use setlocale
+ here; it would return "C" when it doesn't support the locale name the
+ user has set. */
+# if 0
+ locale = setlocale (LC_CTYPE, NULL);
+# endif
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_ALL");
+ if (locale == NULL || locale[0] == '\0')
+ {
+ locale = getenv ("LC_CTYPE");
+ if (locale == NULL || locale[0] == '\0')
+ locale = getenv ("LANG");
+ if (locale == NULL)
+ locale = "";
+ }
+ }
+
+ /* Map locale name to canonical encoding name. */
+ {
+# ifdef locale_table_defined
+ const struct table_entry * const table = locale_table;
+ size_t const table_size =
+ sizeof (locale_table) / sizeof (struct table_entry);
+ /* The table is sorted. Perform a binary search. */
+ size_t hi = table_size;
+ size_t lo = 0;
+ while (lo < hi)
+ {
+ /* Invariant:
+ for i < lo, strcmp (table[i].locale, locale) < 0,
+ for i >= hi, strcmp (table[i].locale, locale) > 0. */
+ size_t mid = (hi + lo) >> 1; /* >= lo, < hi */
+ int cmp = strcmp (table[mid].locale, locale);
+ if (cmp < 0)
+ lo = mid + 1;
+ else if (cmp > 0)
+ hi = mid;
+ else
+ {
+ /* Found an i with
+ strcmp (table[i].locale, locale) == 0. */
+ codeset = table[mid].canonical;
+ goto done_table_lookup;
+ }
+ }
+ if (0)
+ done_table_lookup: ;
+ else
+# endif
+ {
+ /* Did not find it in the table. */
+ /* On Mac OS X, all modern locales use the UTF-8 encoding.
+ BeOS and Haiku have a single locale, and it has UTF-8 encoding. */
+# if (defined __APPLE__ && defined __MACH__) || defined __BEOS__ || defined __HAIKU__
+ codeset = "UTF-8";
+# else
+ /* The canonical name cannot be determined. */
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret
+ the empty string as denoting "the locale's character encoding",
+ thus GNU libiconv would call this function a second time. */
+ codeset = "ASCII";
+# endif
+ }
+ }
+
+#endif
+
+#ifdef DARWIN7
+ /* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8"
+ (the default codeset) does not work when MB_CUR_MAX is 1. */
+ if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX_L (uselocale (NULL)) <= 1)
+ codeset = "ASCII";
+#endif
+
+ return codeset;
+}
diff --git a/lib/localcharset.h b/lib/localcharset.h
new file mode 100644
index 0000000..aa623be
--- /dev/null
+++ b/lib/localcharset.h
@@ -0,0 +1,137 @@
+/* Determine a canonical name for the current locale's character encoding.
+ Copyright (C) 2000-2003, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU CHARSET Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+ into one of the canonical names listed below.
+ The result must not be freed; it is statically allocated. The result
+ becomes invalid when setlocale() is used to change the global locale, or
+ when the value of one of the environment variables LC_ALL, LC_CTYPE, LANG
+ is changed; threads in multithreaded programs should not do this.
+ If the canonical name cannot be determined, the result is a non-canonical
+ name. */
+extern const char * locale_charset (void);
+
+/* About GNU canonical names for character encodings:
+
+ Every canonical name must be supported by GNU libiconv. Support by GNU libc
+ is also desirable.
+
+ The name is case insensitive. Usually an upper case MIME charset name is
+ preferred.
+
+ The current list of these GNU canonical names is:
+
+ name MIME? used by which systems
+ (darwin = Mac OS X, windows = native Windows)
+
+ ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin minix cygwin
+ ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-3 Y glibc solaris cygwin
+ ISO-8859-4 Y hpux osf solaris freebsd netbsd openbsd darwin
+ ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-6 Y glibc aix hpux solaris cygwin
+ ISO-8859-7 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin zos
+ ISO-8859-8 Y glibc aix hpux osf solaris cygwin zos
+ ISO-8859-9 Y glibc aix hpux irix osf solaris freebsd darwin cygwin zos
+ ISO-8859-13 glibc hpux solaris freebsd netbsd openbsd darwin cygwin
+ ISO-8859-14 glibc cygwin
+ ISO-8859-15 glibc aix irix osf solaris freebsd netbsd openbsd darwin cygwin
+ KOI8-R Y glibc hpux solaris freebsd netbsd openbsd darwin
+ KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin
+ KOI8-T glibc
+ CP437 dos
+ CP775 dos
+ CP850 aix osf dos
+ CP852 dos
+ CP855 dos
+ CP856 aix
+ CP857 dos
+ CP861 dos
+ CP862 dos
+ CP864 dos
+ CP865 dos
+ CP866 freebsd netbsd openbsd darwin dos
+ CP869 dos
+ CP874 windows dos
+ CP922 aix
+ CP932 aix cygwin windows dos
+ CP943 aix zos
+ CP949 osf darwin windows dos
+ CP950 windows dos
+ CP1046 aix
+ CP1124 aix
+ CP1125 dos
+ CP1129 aix
+ CP1131 freebsd darwin
+ CP1250 windows
+ CP1251 glibc hpux solaris freebsd netbsd openbsd darwin cygwin windows
+ CP1252 aix windows
+ CP1253 windows
+ CP1254 windows
+ CP1255 glibc windows
+ CP1256 windows
+ CP1257 windows
+ GB2312 Y glibc aix hpux irix solaris freebsd netbsd darwin cygwin zos
+ EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin
+ EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd darwin cygwin zos
+ EUC-TW glibc aix hpux irix osf solaris netbsd
+ BIG5 Y glibc aix hpux osf solaris freebsd netbsd darwin cygwin zos
+ BIG5-HKSCS glibc hpux solaris netbsd darwin
+ GBK glibc aix osf solaris freebsd darwin cygwin windows dos
+ GB18030 glibc hpux solaris freebsd netbsd darwin
+ SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin
+ JOHAB glibc solaris windows
+ TIS-620 glibc aix hpux osf solaris cygwin zos
+ VISCII Y glibc
+ TCVN5712-1 glibc
+ ARMSCII-8 glibc freebsd netbsd darwin
+ GEORGIAN-PS glibc cygwin
+ PT154 glibc netbsd cygwin
+ HP-ROMAN8 hpux
+ HP-ARABIC8 hpux
+ HP-GREEK8 hpux
+ HP-HEBREW8 hpux
+ HP-TURKISH8 hpux
+ HP-KANA8 hpux
+ DEC-KANJI osf
+ DEC-HANYU osf
+ UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin zos
+
+ Note: Names which are not marked as being a MIME name should not be used in
+ Internet protocols for information interchange (mail, news, etc.).
+
+ Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+ must understand both names and treat them as equivalent.
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/lib/locale.in.h b/lib/locale.in.h
new file mode 100644
index 0000000..4e9b3f3
--- /dev/null
+++ b/lib/locale.in.h
@@ -0,0 +1,305 @@
+/* A POSIX <locale.h>.
+ Copyright (C) 2007-2020 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (defined _WIN32 && !defined __CYGWIN__ && defined __need_locale_t) \
+ || defined _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* Special invocation convention:
+ - Inside mingw header files,
+ - To handle Solaris header files (through Solaris 10) when combined
+ with gettext's libintl.h. */
+
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+
+#define _GL_ALREADY_INCLUDING_LOCALE_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
+
+#undef _GL_ALREADY_INCLUDING_LOCALE_H
+
+#ifndef _@GUARD_PREFIX@_LOCALE_H
+#define _@GUARD_PREFIX@_LOCALE_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* Mac OS X 10.5 defines the locale_t type in <xlocale.h>. */
+#if @HAVE_XLOCALE_H@
+# include <xlocale.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
+ On systems that don't define it, use the same value as GNU libintl. */
+#if !defined LC_MESSAGES
+# define LC_MESSAGES 1729
+#endif
+
+/* On native Windows with MSVC, 'struct lconv' lacks the members int_p_* and
+ int_n_*. Instead of overriding 'struct lconv', merely define these member
+ names as macros. This avoids trouble in C++ mode. */
+#if defined _MSC_VER
+# define int_p_cs_precedes p_cs_precedes
+# define int_p_sign_posn p_sign_posn
+# define int_p_sep_by_space p_sep_by_space
+# define int_n_cs_precedes n_cs_precedes
+# define int_n_sign_posn n_sign_posn
+# define int_n_sep_by_space n_sep_by_space
+#endif
+
+/* Bionic libc's 'struct lconv' is just a dummy. */
+#if @REPLACE_STRUCT_LCONV@
+# define lconv rpl_lconv
+struct lconv
+{
+ /* All 'char *' are actually 'const char *'. */
+
+ /* Members that depend on the LC_NUMERIC category of the locale. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04> */
+
+ /* Symbol used as decimal point. */
+ char *decimal_point;
+ /* Symbol used to separate groups of digits to the left of the decimal
+ point. */
+ char *thousands_sep;
+ /* Definition of the size of groups of digits to the left of the decimal
+ point. */
+ char *grouping;
+
+ /* Members that depend on the LC_MONETARY category of the locale. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_03> */
+
+ /* Symbol used as decimal point. */
+ char *mon_decimal_point;
+ /* Symbol used to separate groups of digits to the left of the decimal
+ point. */
+ char *mon_thousands_sep;
+ /* Definition of the size of groups of digits to the left of the decimal
+ point. */
+ char *mon_grouping;
+ /* Sign used to indicate a value >= 0. */
+ char *positive_sign;
+ /* Sign used to indicate a value < 0. */
+ char *negative_sign;
+
+ /* For formatting local currency. */
+ /* Currency symbol (3 characters) followed by separator (1 character). */
+ char *currency_symbol;
+ /* Number of digits after the decimal point. */
+ char frac_digits;
+ /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+ comes after the number. */
+ char p_cs_precedes;
+ /* For values >= 0: Position of the sign. */
+ char p_sign_posn;
+ /* For values >= 0: Placement of spaces between currency symbol, sign, and
+ number. */
+ char p_sep_by_space;
+ /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+ comes after the number. */
+ char n_cs_precedes;
+ /* For values < 0: Position of the sign. */
+ char n_sign_posn;
+ /* For values < 0: Placement of spaces between currency symbol, sign, and
+ number. */
+ char n_sep_by_space;
+
+ /* For formatting international currency. */
+ /* Currency symbol (3 characters) followed by separator (1 character). */
+ char *int_curr_symbol;
+ /* Number of digits after the decimal point. */
+ char int_frac_digits;
+ /* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
+ comes after the number. */
+ char int_p_cs_precedes;
+ /* For values >= 0: Position of the sign. */
+ char int_p_sign_posn;
+ /* For values >= 0: Placement of spaces between currency symbol, sign, and
+ number. */
+ char int_p_sep_by_space;
+ /* For values < 0: 1 if the currency symbol precedes the number, 0 if it
+ comes after the number. */
+ char int_n_cs_precedes;
+ /* For values < 0: Position of the sign. */
+ char int_n_sign_posn;
+ /* For values < 0: Placement of spaces between currency symbol, sign, and
+ number. */
+ char int_n_sep_by_space;
+};
+#endif
+
+#if @GNULIB_LOCALECONV@
+# if @REPLACE_LOCALECONV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef localeconv
+# define localeconv rpl_localeconv
+# endif
+_GL_FUNCDECL_RPL (localeconv, struct lconv *, (void));
+_GL_CXXALIAS_RPL (localeconv, struct lconv *, (void));
+# else
+_GL_CXXALIAS_SYS (localeconv, struct lconv *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (localeconv);
+# endif
+#elif @REPLACE_STRUCT_LCONV@
+# undef localeconv
+# define localeconv localeconv_used_without_requesting_gnulib_module_localeconv
+#elif defined GNULIB_POSIXCHECK
+# undef localeconv
+# if HAVE_RAW_DECL_LOCALECONV
+_GL_WARN_ON_USE (localeconv,
+ "localeconv returns too few information on some platforms - "
+ "use gnulib module localeconv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETLOCALE@
+# if @REPLACE_SETLOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setlocale
+# define setlocale rpl_setlocale
+# define GNULIB_defined_setlocale 1
+# endif
+_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
+_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
+# else
+_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (setlocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setlocale
+# if HAVE_RAW_DECL_SETLOCALE
+_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
+ "use gnulib module setlocale for portability");
+# endif
+#endif
+
+#if @GNULIB_SETLOCALE_NULL@
+/* Included here for convenience. */
+# include "setlocale_null.h"
+#endif
+
+#if /*@GNULIB_NEWLOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @HAVE_NEWLOCALE@)
+# if @REPLACE_NEWLOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef newlocale
+# define newlocale rpl_newlocale
+# define GNULIB_defined_newlocale 1
+# endif
+_GL_FUNCDECL_RPL (newlocale, locale_t,
+ (int category_mask, const char *name, locale_t base)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (newlocale, locale_t,
+ (int category_mask, const char *name, locale_t base));
+# else
+# if @HAVE_NEWLOCALE@
+_GL_CXXALIAS_SYS (newlocale, locale_t,
+ (int category_mask, const char *name, locale_t base));
+# endif
+# endif
+# if @HAVE_NEWLOCALE@
+_GL_CXXALIASWARN (newlocale);
+# endif
+# if @HAVE_NEWLOCALE@ || @REPLACE_NEWLOCALE@
+# ifndef HAVE_WORKING_NEWLOCALE
+# define HAVE_WORKING_NEWLOCALE 1
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef newlocale
+# if HAVE_RAW_DECL_NEWLOCALE
+_GL_WARN_ON_USE (newlocale, "newlocale is not portable");
+# endif
+#endif
+
+#if @GNULIB_DUPLOCALE@ || (@GNULIB_LOCALENAME@ && @HAVE_DUPLOCALE@)
+# if @REPLACE_DUPLOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef duplocale
+# define duplocale rpl_duplocale
+# define GNULIB_defined_duplocale 1
+# endif
+_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
+# else
+# if @HAVE_DUPLOCALE@
+_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
+# endif
+# endif
+# if @HAVE_DUPLOCALE@
+_GL_CXXALIASWARN (duplocale);
+# endif
+# if @HAVE_DUPLOCALE@ || @REPLACE_DUPLOCALE@
+# ifndef HAVE_WORKING_DUPLOCALE
+# define HAVE_WORKING_DUPLOCALE 1
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef duplocale
+# if HAVE_RAW_DECL_DUPLOCALE
+_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
+ "use gnulib module duplocale for portability");
+# endif
+#endif
+
+#if /*@GNULIB_FREELOCALE@ ||*/ (@GNULIB_LOCALENAME@ && @HAVE_FREELOCALE@)
+# if @REPLACE_FREELOCALE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef freelocale
+# define freelocale rpl_freelocale
+# define GNULIB_defined_freelocale 1
+# endif
+_GL_FUNCDECL_RPL (freelocale, void, (locale_t locale) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (freelocale, void, (locale_t locale));
+# else
+# if @HAVE_FREELOCALE@
+/* Need to cast, because on FreeBSD and Mac OS X 10.13, the return type is
+ int. */
+_GL_CXXALIAS_SYS_CAST (freelocale, void, (locale_t locale));
+# endif
+# endif
+# if @HAVE_FREELOCALE@
+_GL_CXXALIASWARN (freelocale);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freelocale
+# if HAVE_RAW_DECL_FREELOCALE
+_GL_WARN_ON_USE (freelocale, "freelocale is not portable");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
+#endif /* _@GUARD_PREFIX@_LOCALE_H */
+#endif /* !(__need_locale_t || _GL_ALREADY_INCLUDING_LOCALE_H) */
diff --git a/lib/localeconv.c b/lib/localeconv.c
new file mode 100644
index 0000000..8aa9bbe
--- /dev/null
+++ b/lib/localeconv.c
@@ -0,0 +1,103 @@
+/* Query locale dependent information for formatting numbers.
+ Copyright (C) 2012-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <locale.h>
+
+#if HAVE_STRUCT_LCONV_DECIMAL_POINT
+
+/* Override for platforms where 'struct lconv' lacks the int_p_*, int_n_*
+ members. */
+
+struct lconv *
+localeconv (void)
+{
+ static struct lconv result;
+# undef lconv
+# undef localeconv
+ struct lconv *sys_result = localeconv ();
+
+ result.decimal_point = sys_result->decimal_point;
+ result.thousands_sep = sys_result->thousands_sep;
+ result.grouping = sys_result->grouping;
+ result.mon_decimal_point = sys_result->mon_decimal_point;
+ result.mon_thousands_sep = sys_result->mon_thousands_sep;
+ result.mon_grouping = sys_result->mon_grouping;
+ result.positive_sign = sys_result->positive_sign;
+ result.negative_sign = sys_result->negative_sign;
+ result.currency_symbol = sys_result->currency_symbol;
+ result.frac_digits = sys_result->frac_digits;
+ result.p_cs_precedes = sys_result->p_cs_precedes;
+ result.p_sign_posn = sys_result->p_sign_posn;
+ result.p_sep_by_space = sys_result->p_sep_by_space;
+ result.n_cs_precedes = sys_result->n_cs_precedes;
+ result.n_sign_posn = sys_result->n_sign_posn;
+ result.n_sep_by_space = sys_result->n_sep_by_space;
+ result.int_curr_symbol = sys_result->int_curr_symbol;
+ result.int_frac_digits = sys_result->int_frac_digits;
+ result.int_p_cs_precedes = sys_result->p_cs_precedes;
+ result.int_p_sign_posn = sys_result->p_sign_posn;
+ result.int_p_sep_by_space = sys_result->p_sep_by_space;
+ result.int_n_cs_precedes = sys_result->n_cs_precedes;
+ result.int_n_sign_posn = sys_result->n_sign_posn;
+ result.int_n_sep_by_space = sys_result->n_sep_by_space;
+
+ return &result;
+}
+
+#else
+
+/* Override for platforms where 'struct lconv' is a dummy. */
+
+# include <limits.h>
+
+struct lconv *
+localeconv (void)
+{
+ static /*const*/ struct lconv result =
+ {
+ /* decimal_point */ ".",
+ /* thousands_sep */ "",
+ /* grouping */ "",
+ /* mon_decimal_point */ "",
+ /* mon_thousands_sep */ "",
+ /* mon_grouping */ "",
+ /* positive_sign */ "",
+ /* negative_sign */ "",
+ /* currency_symbol */ "",
+ /* frac_digits */ CHAR_MAX,
+ /* p_cs_precedes */ CHAR_MAX,
+ /* p_sign_posn */ CHAR_MAX,
+ /* p_sep_by_space */ CHAR_MAX,
+ /* n_cs_precedes */ CHAR_MAX,
+ /* n_sign_posn */ CHAR_MAX,
+ /* n_sep_by_space */ CHAR_MAX,
+ /* int_curr_symbol */ "",
+ /* int_frac_digits */ CHAR_MAX,
+ /* int_p_cs_precedes */ CHAR_MAX,
+ /* int_p_sign_posn */ CHAR_MAX,
+ /* int_p_sep_by_space */ CHAR_MAX,
+ /* int_n_cs_precedes */ CHAR_MAX,
+ /* int_n_sign_posn */ CHAR_MAX,
+ /* int_n_sep_by_space */ CHAR_MAX
+ };
+
+ return &result;
+}
+
+#endif
diff --git a/lib/lseek.c b/lib/lseek.c
new file mode 100644
index 0000000..aaf9f32
--- /dev/null
+++ b/lib/lseek.c
@@ -0,0 +1,71 @@
+/* An lseek() function that detects pipes.
+ Copyright (C) 2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Windows platforms. */
+/* Get GetFileType. */
+# include <windows.h>
+/* Get _get_osfhandle. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+#else
+# include <sys/stat.h>
+#endif
+#include <errno.h>
+
+#undef lseek
+
+off_t
+rpl_lseek (int fd, off_t offset, int whence)
+{
+#if defined _WIN32 && ! defined __CYGWIN__
+ /* mingw lseek mistakenly succeeds on pipes, sockets, and terminals. */
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (GetFileType (h) != FILE_TYPE_DISK)
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#else
+ /* BeOS lseek mistakenly succeeds on pipes... */
+ struct stat statbuf;
+ if (fstat (fd, &statbuf) < 0)
+ return -1;
+ if (!S_ISREG (statbuf.st_mode))
+ {
+ errno = ESPIPE;
+ return -1;
+ }
+#endif
+#if _GL_WINDOWS_64_BIT_OFF_T || (defined __MINGW32__ && defined _FILE_OFFSET_BITS && (_FILE_OFFSET_BITS == 64))
+ return _lseeki64 (fd, offset, whence);
+#else
+ return lseek (fd, offset, whence);
+#endif
+}
diff --git a/lib/lstat.c b/lib/lstat.c
new file mode 100644
index 0000000..f74392b
--- /dev/null
+++ b/lib/lstat.c
@@ -0,0 +1,104 @@
+/* Work around a bug of lstat on some systems
+
+ Copyright (C) 1997-2006, 2008-2020 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/>. */
+
+/* written by Jim Meyering */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_lstat doesn't recurse to
+ rpl_lstat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+#if !HAVE_LSTAT
+/* On systems that lack symlinks, our replacement <sys/stat.h> already
+ defined lstat as stat, so there is nothing further to do other than
+ avoid an empty file. */
+typedef int dummy;
+#else /* HAVE_LSTAT */
+
+/* Get the original definition of lstat. It might be defined as a macro. */
+# include <sys/types.h>
+# include <sys/stat.h>
+# undef __need_system_sys_stat_h
+
+static int
+orig_lstat (const char *filename, struct stat *buf)
+{
+ return lstat (filename, buf);
+}
+
+/* Specification. */
+# ifdef __osf__
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+# include "sys/stat.h"
+# else
+# include <sys/stat.h>
+# endif
+
+# include "stat-time.h"
+
+# include <string.h>
+# include <errno.h>
+
+/* lstat works differently on Linux and Solaris systems. POSIX (see
+ "pathname resolution" in the glossary) requires that programs like
+ 'ls' take into consideration the fact that FILE has a trailing slash
+ when FILE is a symbolic link. On Linux and Solaris 10 systems, the
+ lstat function already has the desired semantics (in treating
+ 'lstat ("symlink/", sbuf)' just like 'lstat ("symlink/.", sbuf)',
+ but on Solaris 9 and earlier it does not.
+
+ If FILE has a trailing slash and specifies a symbolic link,
+ then use stat() to get more info on the referent of FILE.
+ If the referent is a non-directory, then set errno to ENOTDIR
+ and return -1. Otherwise, return stat's result. */
+
+int
+rpl_lstat (const char *file, struct stat *sbuf)
+{
+ int result = orig_lstat (file, sbuf);
+
+ /* This replacement file can blindly check against '/' rather than
+ using the ISSLASH macro, because all platforms with '\\' either
+ lack symlinks (mingw) or have working lstat (cygwin) and thus do
+ not compile this file. 0 len should have already been filtered
+ out above, with a failure return of ENOENT. */
+ if (result == 0)
+ {
+ if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/')
+ result = stat_time_normalize (result, sbuf);
+ else
+ {
+ /* At this point, a trailing slash is permitted only on
+ symlink-to-dir; but it should have found information on the
+ directory, not the symlink. Call 'stat' to get info about the
+ link's referent. Our replacement stat guarantees valid results,
+ even if the symlink is not pointing to a directory. */
+ if (!S_ISLNK (sbuf->st_mode))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ result = stat (file, sbuf);
+ }
+ }
+ return result;
+}
+
+#endif /* HAVE_LSTAT */
diff --git a/lib/malloc.c b/lib/malloc.c
new file mode 100644
index 0000000..7232f1e
--- /dev/null
+++ b/lib/malloc.c
@@ -0,0 +1,56 @@
+/* malloc() function that is glibc compatible.
+
+ Copyright (C) 1997-1998, 2006-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
+#ifdef malloc
+# define NEED_MALLOC_GNU 1
+# undef malloc
+/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */
+#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
+# define NEED_MALLOC_GNU 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Allocate an N-byte block of memory from the heap.
+ If N is zero, allocate a 1-byte block. */
+
+void *
+rpl_malloc (size_t n)
+{
+ void *result;
+
+#if NEED_MALLOC_GNU
+ if (n == 0)
+ n = 1;
+#endif
+
+ result = malloc (n);
+
+#if !HAVE_MALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/lib/malloc/scratch_buffer.h b/lib/malloc/scratch_buffer.h
new file mode 100644
index 0000000..6eca220
--- /dev/null
+++ b/lib/malloc/scratch_buffer.h
@@ -0,0 +1,151 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2015-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _SCRATCH_BUFFER_H
+#define _SCRATCH_BUFFER_H
+
+/* Scratch buffers with a default stack allocation and fallback to
+ heap allocation. It is expected that this function is used in this
+ way:
+
+ struct scratch_buffer tmpbuf;
+ scratch_buffer_init (&tmpbuf);
+
+ while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+ if (!scratch_buffer_grow (&tmpbuf))
+ return -1;
+
+ scratch_buffer_free (&tmpbuf);
+ return 0;
+
+ The allocation functions (scratch_buffer_grow,
+ scratch_buffer_grow_preserve, scratch_buffer_set_array_size) make
+ sure that the heap allocation, if any, is freed, so that the code
+ above does not have a memory leak. The buffer still remains in a
+ state that can be deallocated using scratch_buffer_free, so a loop
+ like this is valid as well:
+
+ struct scratch_buffer tmpbuf;
+ scratch_buffer_init (&tmpbuf);
+
+ while (!function_that_uses_buffer (tmpbuf.data, tmpbuf.length))
+ if (!scratch_buffer_grow (&tmpbuf))
+ break;
+
+ scratch_buffer_free (&tmpbuf);
+
+ scratch_buffer_grow and scratch_buffer_grow_preserve are guaranteed
+ to grow the buffer by at least 512 bytes. This means that when
+ using the scratch buffer as a backing store for a non-character
+ array whose element size, in bytes, is 512 or smaller, the scratch
+ buffer only has to grow once to make room for at least one more
+ element.
+*/
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Scratch buffer. Must be initialized with scratch_buffer_init
+ before its use. */
+struct scratch_buffer {
+ void *data; /* Pointer to the beginning of the scratch area. */
+ size_t length; /* Allocated space at the data pointer, in bytes. */
+ union { max_align_t __align; char __c[1024]; } __space;
+};
+
+/* Initializes *BUFFER so that BUFFER->data points to BUFFER->__space
+ and BUFFER->length reflects the available space. */
+static inline void
+scratch_buffer_init (struct scratch_buffer *buffer)
+{
+ buffer->data = buffer->__space.__c;
+ buffer->length = sizeof (buffer->__space);
+}
+
+/* Deallocates *BUFFER (if it was heap-allocated). */
+static inline void
+scratch_buffer_free (struct scratch_buffer *buffer)
+{
+ if (buffer->data != buffer->__space.__c)
+ free (buffer->data);
+}
+
+/* Grow *BUFFER by some arbitrary amount. The buffer contents is NOT
+ preserved. Return true on success, false on allocation failure (in
+ which case the old buffer is freed). On success, the new buffer is
+ larger than the previous size. On failure, *BUFFER is deallocated,
+ but remains in a free-able state, and errno is set. */
+bool __libc_scratch_buffer_grow (struct scratch_buffer *buffer);
+libc_hidden_proto (__libc_scratch_buffer_grow)
+
+/* Alias for __libc_scratch_buffer_grow. */
+static __always_inline bool
+scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+ return __glibc_likely (__libc_scratch_buffer_grow (buffer));
+}
+
+/* Like __libc_scratch_buffer_grow, but preserve the old buffer
+ contents on success, as a prefix of the new buffer. */
+bool __libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer);
+libc_hidden_proto (__libc_scratch_buffer_grow_preserve)
+
+/* Alias for __libc_scratch_buffer_grow_preserve. */
+static __always_inline bool
+scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+ return __glibc_likely (__libc_scratch_buffer_grow_preserve (buffer));
+}
+
+/* Grow *BUFFER so that it can store at least NELEM elements of SIZE
+ bytes. The buffer contents are NOT preserved. Both NELEM and SIZE
+ can be zero. Return true on success, false on allocation failure
+ (in which case the old buffer is freed, but *BUFFER remains in a
+ free-able state, and errno is set). It is unspecified whether this
+ function can reduce the array size. */
+bool __libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+ size_t nelem, size_t size);
+libc_hidden_proto (__libc_scratch_buffer_set_array_size)
+
+/* Alias for __libc_scratch_set_array_size. */
+static __always_inline bool
+scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+ size_t nelem, size_t size)
+{
+ return __glibc_likely (__libc_scratch_buffer_set_array_size
+ (buffer, nelem, size));
+}
+
+/* Return a copy of *BUFFER's first SIZE bytes as a heap-allocated block,
+ deallocating *BUFFER if it was heap-allocated. SIZE must be at
+ most *BUFFER's size. Return NULL (setting errno) on memory
+ exhaustion. */
+void *__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer,
+ size_t size);
+libc_hidden_proto (__libc_scratch_buffer_dupfree)
+
+/* Alias for __libc_scratch_dupfree. */
+static __always_inline void *
+scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+ void *r = __libc_scratch_buffer_dupfree (buffer, size);
+ return __glibc_likely (r != NULL) ? r : NULL;
+}
+
+#endif /* _SCRATCH_BUFFER_H */
diff --git a/lib/malloc/scratch_buffer_dupfree.c b/lib/malloc/scratch_buffer_dupfree.c
new file mode 100644
index 0000000..e34336f
--- /dev/null
+++ b/lib/malloc/scratch_buffer_dupfree.c
@@ -0,0 +1,41 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <string.h>
+
+void *
+__libc_scratch_buffer_dupfree (struct scratch_buffer *buffer, size_t size)
+{
+ void *data = buffer->data;
+ if (data == buffer->__space.__c)
+ {
+ void *copy = malloc (size);
+ return copy != NULL ? memcpy (copy, data, size) : NULL;
+ }
+ else
+ {
+ void *copy = realloc (data, size);
+ return copy != NULL ? copy : data;
+ }
+}
+libc_hidden_def (__libc_scratch_buffer_dupfree)
diff --git a/lib/malloc/scratch_buffer_grow.c b/lib/malloc/scratch_buffer_grow.c
new file mode 100644
index 0000000..41befe3
--- /dev/null
+++ b/lib/malloc/scratch_buffer_grow.c
@@ -0,0 +1,56 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2015-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+
+bool
+__libc_scratch_buffer_grow (struct scratch_buffer *buffer)
+{
+ void *new_ptr;
+ size_t new_length = buffer->length * 2;
+
+ /* Discard old buffer. */
+ scratch_buffer_free (buffer);
+
+ /* Check for overflow. */
+ if (__glibc_likely (new_length >= buffer->length))
+ new_ptr = malloc (new_length);
+ else
+ {
+ __set_errno (ENOMEM);
+ new_ptr = NULL;
+ }
+
+ if (__glibc_unlikely (new_ptr == NULL))
+ {
+ /* Buffer must remain valid to free. */
+ scratch_buffer_init (buffer);
+ return false;
+ }
+
+ /* Install new heap-based buffer. */
+ buffer->data = new_ptr;
+ buffer->length = new_length;
+ return true;
+}
+libc_hidden_def (__libc_scratch_buffer_grow)
diff --git a/lib/malloc/scratch_buffer_grow_preserve.c b/lib/malloc/scratch_buffer_grow_preserve.c
new file mode 100644
index 0000000..aef2329
--- /dev/null
+++ b/lib/malloc/scratch_buffer_grow_preserve.c
@@ -0,0 +1,67 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2015-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+#include <string.h>
+
+bool
+__libc_scratch_buffer_grow_preserve (struct scratch_buffer *buffer)
+{
+ size_t new_length = 2 * buffer->length;
+ void *new_ptr;
+
+ if (buffer->data == buffer->__space.__c)
+ {
+ /* Move buffer to the heap. No overflow is possible because
+ buffer->length describes a small buffer on the stack. */
+ new_ptr = malloc (new_length);
+ if (new_ptr == NULL)
+ return false;
+ memcpy (new_ptr, buffer->__space.__c, buffer->length);
+ }
+ else
+ {
+ /* Buffer was already on the heap. Check for overflow. */
+ if (__glibc_likely (new_length >= buffer->length))
+ new_ptr = realloc (buffer->data, new_length);
+ else
+ {
+ __set_errno (ENOMEM);
+ new_ptr = NULL;
+ }
+
+ if (__glibc_unlikely (new_ptr == NULL))
+ {
+ /* Deallocate, but buffer must remain valid to free. */
+ free (buffer->data);
+ scratch_buffer_init (buffer);
+ return false;
+ }
+ }
+
+ /* Install new heap-based buffer. */
+ buffer->data = new_ptr;
+ buffer->length = new_length;
+ return true;
+}
+libc_hidden_def (__libc_scratch_buffer_grow_preserve)
diff --git a/lib/malloc/scratch_buffer_set_array_size.c b/lib/malloc/scratch_buffer_set_array_size.c
new file mode 100644
index 0000000..5f5e4c2
--- /dev/null
+++ b/lib/malloc/scratch_buffer_set_array_size.c
@@ -0,0 +1,64 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2015-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <scratch_buffer.h>
+#include <errno.h>
+#include <limits.h>
+
+bool
+__libc_scratch_buffer_set_array_size (struct scratch_buffer *buffer,
+ size_t nelem, size_t size)
+{
+ size_t new_length = nelem * size;
+
+ /* Avoid overflow check if both values are small. */
+ if ((nelem | size) >> (sizeof (size_t) * CHAR_BIT / 2) != 0
+ && nelem != 0 && size != new_length / nelem)
+ {
+ /* Overflow. Discard the old buffer, but it must remain valid
+ to free. */
+ scratch_buffer_free (buffer);
+ scratch_buffer_init (buffer);
+ __set_errno (ENOMEM);
+ return false;
+ }
+
+ if (new_length <= buffer->length)
+ return true;
+
+ /* Discard old buffer. */
+ scratch_buffer_free (buffer);
+
+ char *new_ptr = malloc (new_length);
+ if (new_ptr == NULL)
+ {
+ /* Buffer must remain valid to free. */
+ scratch_buffer_init (buffer);
+ return false;
+ }
+
+ /* Install new heap-based buffer. */
+ buffer->data = new_ptr;
+ buffer->length = new_length;
+ return true;
+}
+libc_hidden_def (__libc_scratch_buffer_set_array_size)
diff --git a/lib/malloca.c b/lib/malloca.c
new file mode 100644
index 0000000..975b166
--- /dev/null
+++ b/lib/malloca.c
@@ -0,0 +1,105 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003, 2018.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Specification. */
+#include "malloca.h"
+
+#include "verify.h"
+
+/* The speed critical point in this file is freea() applied to an alloca()
+ result: it must be fast, to match the speed of alloca(). The speed of
+ mmalloca() and freea() in the other case are not critical, because they
+ are only invoked for big memory sizes.
+ Here we use a bit in the address as an indicator, an idea by Ondřej Bílka.
+ malloca() can return three types of pointers:
+ - Pointers ≡ 0 mod 2*sa_alignment_max come from stack allocation.
+ - Pointers ≡ sa_alignment_max mod 2*sa_alignment_max come from heap
+ allocation.
+ - NULL comes from a failed heap allocation. */
+
+/* Type for holding very small pointer differences. */
+typedef unsigned char small_t;
+/* Verify that it is wide enough. */
+verify (2 * sa_alignment_max - 1 <= (small_t) -1);
+
+void *
+mmalloca (size_t n)
+{
+#if HAVE_ALLOCA
+ /* Allocate one more word, used to determine the address to pass to freea(),
+ and room for the alignment ≡ sa_alignment_max mod 2*sa_alignment_max. */
+ size_t nplus = n + sizeof (small_t) + 2 * sa_alignment_max - 1;
+
+ if (nplus >= n)
+ {
+ char *mem = (char *) malloc (nplus);
+
+ if (mem != NULL)
+ {
+ char *p =
+ (char *)((((uintptr_t)mem + sizeof (small_t) + sa_alignment_max - 1)
+ & ~(uintptr_t)(2 * sa_alignment_max - 1))
+ + sa_alignment_max);
+ /* Here p >= mem + sizeof (small_t),
+ and p <= mem + sizeof (small_t) + 2 * sa_alignment_max - 1
+ hence p + n <= mem + nplus.
+ So, the memory range [p, p+n) lies in the allocated memory range
+ [mem, mem + nplus). */
+ ((small_t *) p)[-1] = p - mem;
+ /* p ≡ sa_alignment_max mod 2*sa_alignment_max. */
+ return p;
+ }
+ }
+ /* Out of memory. */
+ return NULL;
+#else
+# if !MALLOC_0_IS_NONNULL
+ if (n == 0)
+ n = 1;
+# endif
+ return malloc (n);
+#endif
+}
+
+#if HAVE_ALLOCA
+void
+freea (void *p)
+{
+ /* Check argument. */
+ if ((uintptr_t) p & (sa_alignment_max - 1))
+ {
+ /* p was not the result of a malloca() call. Invalid argument. */
+ abort ();
+ }
+ /* Determine whether p was a non-NULL pointer returned by mmalloca(). */
+ if ((uintptr_t) p & sa_alignment_max)
+ {
+ void *mem = (char *) p - ((small_t *) p)[-1];
+ free (mem);
+ }
+}
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/malloca.h b/lib/malloca.h
new file mode 100644
index 0000000..ccc485a
--- /dev/null
+++ b/lib/malloca.h
@@ -0,0 +1,123 @@
+/* Safe automatic memory allocation.
+ Copyright (C) 2003-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _MALLOCA_H
+#define _MALLOCA_H
+
+#include <alloca.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "xalloc-oversized.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* safe_alloca(N) is equivalent to alloca(N) when it is safe to call
+ alloca(N); otherwise it returns NULL. It either returns N bytes of
+ memory allocated on the stack, that lasts until the function returns,
+ or NULL.
+ Use of safe_alloca should be avoided:
+ - inside arguments of function calls - undefined behaviour,
+ - in inline functions - the allocation may actually last until the
+ calling function returns.
+*/
+#if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots.
+ This must be a macro, not a function. */
+# define safe_alloca(N) ((N) < 4032 ? alloca (N) : NULL)
+#else
+# define safe_alloca(N) ((void) (N), NULL)
+#endif
+
+/* malloca(N) is a safe variant of alloca(N). It allocates N bytes of
+ memory allocated on the stack, that must be freed using freea() before
+ the function returns. Upon failure, it returns NULL. */
+#if HAVE_ALLOCA
+# define malloca(N) \
+ ((N) < 4032 - (2 * sa_alignment_max - 1) \
+ ? (void *) (((uintptr_t) (char *) alloca ((N) + 2 * sa_alignment_max - 1) \
+ + (2 * sa_alignment_max - 1)) \
+ & ~(uintptr_t)(2 * sa_alignment_max - 1)) \
+ : mmalloca (N))
+#else
+# define malloca(N) \
+ mmalloca (N)
+#endif
+extern void * mmalloca (size_t n);
+
+/* Free a block of memory allocated through malloca(). */
+#if HAVE_ALLOCA
+extern void freea (void *p);
+#else
+# define freea free
+#endif
+
+/* nmalloca(N,S) is an overflow-safe variant of malloca (N * S).
+ It allocates an array of N objects, each with S bytes of memory,
+ on the stack. S must be positive and N must be nonnegative.
+ The array must be freed using freea() before the function returns. */
+#define nmalloca(n, s) (xalloc_oversized (n, s) ? NULL : malloca ((n) * (s)))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* ------------------- Auxiliary, non-public definitions ------------------- */
+
+/* Determine the alignment of a type at compile time. */
+#if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+# define sa_alignof __alignof__
+#elif defined __cplusplus
+ template <class type> struct sa_alignof_helper { char __slot1; type __slot2; };
+# define sa_alignof(type) offsetof (sa_alignof_helper<type>, __slot2)
+#elif defined __hpux
+ /* Work around a HP-UX 10.20 cc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#elif defined _AIX
+ /* Work around an AIX 3.2.5 xlc bug with enums constants defined as offsetof
+ values. */
+# define sa_alignof(type) (sizeof (type) <= 4 ? 4 : 8)
+#else
+# define sa_alignof(type) offsetof (struct { char __slot1; type __slot2; }, __slot2)
+#endif
+
+enum
+{
+/* The desired alignment of memory allocations is the maximum alignment
+ among all elementary types. */
+ sa_alignment_long = sa_alignof (long),
+ sa_alignment_double = sa_alignof (double),
+ sa_alignment_longlong = sa_alignof (long long),
+ sa_alignment_longdouble = sa_alignof (long double),
+ sa_alignment_max = ((sa_alignment_long - 1) | (sa_alignment_double - 1)
+ | (sa_alignment_longlong - 1)
+ | (sa_alignment_longdouble - 1)
+ ) + 1
+};
+
+#endif /* _MALLOCA_H */
diff --git a/lib/mbchar.c b/lib/mbchar.c
new file mode 100644
index 0000000..bd5c932
--- /dev/null
+++ b/lib/mbchar.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 2001, 2006, 2009-2020 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/>. */
+
+
+#include <config.h>
+
+#define MBCHAR_INLINE _GL_EXTERN_INLINE
+
+#include <limits.h>
+
+#include "mbchar.h"
+
+#if IS_BASIC_ASCII
+
+/* Bit table of characters in the ISO C "basic character set". */
+const unsigned int is_basic_table [UCHAR_MAX / 32 + 1] =
+{
+ 0x00001a00, /* '\t' '\v' '\f' */
+ 0xffffffef, /* ' '...'#' '%'...'?' */
+ 0xfffffffe, /* 'A'...'Z' '[' '\\' ']' '^' '_' */
+ 0x7ffffffe /* 'a'...'z' '{' '|' '}' '~' */
+ /* The remaining bits are 0. */
+};
+
+#endif /* IS_BASIC_ASCII */
diff --git a/lib/mbchar.h b/lib/mbchar.h
new file mode 100644
index 0000000..111a6fb
--- /dev/null
+++ b/lib/mbchar.h
@@ -0,0 +1,353 @@
+/* Multibyte character data type.
+ Copyright (C) 2001, 2005-2007, 2009-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* A multibyte character is a short subsequence of a char* string,
+ representing a single wide character.
+
+ We use multibyte characters instead of wide characters because of
+ the following goals:
+ 1) correct multibyte handling, i.e. operate according to the LC_CTYPE
+ locale,
+ 2) ease of maintenance, i.e. the maintainer needs not know all details
+ of the ISO C 99 standard,
+ 3) don't fail grossly if the input is not in the encoding set by the
+ locale, because often different encodings are in use in the same
+ countries (ISO-8859-1/UTF-8, EUC-JP/Shift_JIS, ...),
+ 4) fast in the case of ASCII characters,
+ 5) portability, i.e. don't make unportable assumptions about wchar_t.
+
+ Multibyte characters are only accessed through the mb* macros.
+
+ mb_ptr (mbc)
+ return a pointer to the beginning of the multibyte sequence.
+
+ mb_len (mbc)
+ returns the number of bytes occupied by the multibyte sequence.
+ Always > 0.
+
+ mb_iseq (mbc, sc)
+ returns true if mbc is the standard ASCII character sc.
+
+ mb_isnul (mbc)
+ returns true if mbc is the nul character.
+
+ mb_cmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2.
+
+ mb_casecmp (mbc1, mbc2)
+ returns a positive, zero, or negative value depending on whether mbc1
+ sorts after, same or before mbc2, modulo upper/lowercase conversion.
+
+ mb_equal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal.
+
+ mb_caseequal (mbc1, mbc2)
+ returns true if mbc1 and mbc2 are equal modulo upper/lowercase conversion.
+
+ mb_isalnum (mbc)
+ returns true if mbc is alphanumeric.
+
+ mb_isalpha (mbc)
+ returns true if mbc is alphabetic.
+
+ mb_isascii(mbc)
+ returns true if mbc is plain ASCII.
+
+ mb_isblank (mbc)
+ returns true if mbc is a blank.
+
+ mb_iscntrl (mbc)
+ returns true if mbc is a control character.
+
+ mb_isdigit (mbc)
+ returns true if mbc is a decimal digit.
+
+ mb_isgraph (mbc)
+ returns true if mbc is a graphic character.
+
+ mb_islower (mbc)
+ returns true if mbc is lowercase.
+
+ mb_isprint (mbc)
+ returns true if mbc is a printable character.
+
+ mb_ispunct (mbc)
+ returns true if mbc is a punctuation character.
+
+ mb_isspace (mbc)
+ returns true if mbc is a space character.
+
+ mb_isupper (mbc)
+ returns true if mbc is uppercase.
+
+ mb_isxdigit (mbc)
+ returns true if mbc is a hexadecimal digit.
+
+ mb_width (mbc)
+ returns the number of columns on the output device occupied by mbc.
+ Always >= 0.
+
+ mb_putc (mbc, stream)
+ outputs mbc on stream, a byte oriented FILE stream opened for output.
+
+ mb_setascii (&mbc, sc)
+ assigns the standard ASCII character sc to mbc.
+
+ mb_copy (&destmbc, &srcmbc)
+ copies srcmbc to destmbc.
+
+ Here are the function prototypes of the macros.
+
+ extern const char * mb_ptr (const mbchar_t mbc);
+ extern size_t mb_len (const mbchar_t mbc);
+ extern bool mb_iseq (const mbchar_t mbc, char sc);
+ extern bool mb_isnul (const mbchar_t mbc);
+ extern int mb_cmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern int mb_casecmp (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_equal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_caseequal (const mbchar_t mbc1, const mbchar_t mbc2);
+ extern bool mb_isalnum (const mbchar_t mbc);
+ extern bool mb_isalpha (const mbchar_t mbc);
+ extern bool mb_isascii (const mbchar_t mbc);
+ extern bool mb_isblank (const mbchar_t mbc);
+ extern bool mb_iscntrl (const mbchar_t mbc);
+ extern bool mb_isdigit (const mbchar_t mbc);
+ extern bool mb_isgraph (const mbchar_t mbc);
+ extern bool mb_islower (const mbchar_t mbc);
+ extern bool mb_isprint (const mbchar_t mbc);
+ extern bool mb_ispunct (const mbchar_t mbc);
+ extern bool mb_isspace (const mbchar_t mbc);
+ extern bool mb_isupper (const mbchar_t mbc);
+ extern bool mb_isxdigit (const mbchar_t mbc);
+ extern int mb_width (const mbchar_t mbc);
+ extern void mb_putc (const mbchar_t mbc, FILE *stream);
+ extern void mb_setascii (mbchar_t *new, char sc);
+ extern void mb_copy (mbchar_t *new, const mbchar_t *old);
+ */
+
+#ifndef _MBCHAR_H
+#define _MBCHAR_H 1
+
+#include <stdbool.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef MBCHAR_INLINE
+# define MBCHAR_INLINE _GL_INLINE
+#endif
+
+#define MBCHAR_BUF_SIZE 24
+
+struct mbchar
+{
+ const char *ptr; /* pointer to current character */
+ size_t bytes; /* number of bytes of current character, > 0 */
+ bool wc_valid; /* true if wc is a valid wide character */
+ wchar_t wc; /* if wc_valid: the current character */
+ char buf[MBCHAR_BUF_SIZE]; /* room for the bytes, used for file input only */
+};
+
+/* EOF (not a real character) is represented with bytes = 0 and
+ wc_valid = false. */
+
+typedef struct mbchar mbchar_t;
+
+/* Access the current character. */
+#define mb_ptr(mbc) ((mbc).ptr)
+#define mb_len(mbc) ((mbc).bytes)
+
+/* Comparison of characters. */
+#define mb_iseq(mbc, sc) ((mbc).wc_valid && (mbc).wc == (sc))
+#define mb_isnul(mbc) ((mbc).wc_valid && (mbc).wc == 0)
+#define mb_cmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) (mbc1).wc - (int) (mbc2).wc \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_casecmp(mbc1, mbc2) \
+ ((mbc1).wc_valid \
+ ? ((mbc2).wc_valid \
+ ? (int) towlower ((mbc1).wc) - (int) towlower ((mbc2).wc) \
+ : -1) \
+ : ((mbc2).wc_valid \
+ ? 1 \
+ : (mbc1).bytes == (mbc2).bytes \
+ ? memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) \
+ : (mbc1).bytes < (mbc2).bytes \
+ ? (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) > 0 ? 1 : -1) \
+ : (memcmp ((mbc1).ptr, (mbc2).ptr, (mbc2).bytes) >= 0 ? 1 : -1)))
+#define mb_equal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? (mbc1).wc == (mbc2).wc \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+#define mb_caseequal(mbc1, mbc2) \
+ ((mbc1).wc_valid && (mbc2).wc_valid \
+ ? towlower ((mbc1).wc) == towlower ((mbc2).wc) \
+ : (mbc1).bytes == (mbc2).bytes \
+ && memcmp ((mbc1).ptr, (mbc2).ptr, (mbc1).bytes) == 0)
+
+/* <ctype.h>, <wctype.h> classification. */
+#define mb_isascii(mbc) \
+ ((mbc).wc_valid && (mbc).wc >= 0 && (mbc).wc <= 127)
+#define mb_isalnum(mbc) ((mbc).wc_valid && iswalnum ((mbc).wc))
+#define mb_isalpha(mbc) ((mbc).wc_valid && iswalpha ((mbc).wc))
+#define mb_isblank(mbc) ((mbc).wc_valid && iswblank ((mbc).wc))
+#define mb_iscntrl(mbc) ((mbc).wc_valid && iswcntrl ((mbc).wc))
+#define mb_isdigit(mbc) ((mbc).wc_valid && iswdigit ((mbc).wc))
+#define mb_isgraph(mbc) ((mbc).wc_valid && iswgraph ((mbc).wc))
+#define mb_islower(mbc) ((mbc).wc_valid && iswlower ((mbc).wc))
+#define mb_isprint(mbc) ((mbc).wc_valid && iswprint ((mbc).wc))
+#define mb_ispunct(mbc) ((mbc).wc_valid && iswpunct ((mbc).wc))
+#define mb_isspace(mbc) ((mbc).wc_valid && iswspace ((mbc).wc))
+#define mb_isupper(mbc) ((mbc).wc_valid && iswupper ((mbc).wc))
+#define mb_isxdigit(mbc) ((mbc).wc_valid && iswxdigit ((mbc).wc))
+
+/* Extra <wchar.h> function. */
+
+/* Unprintable characters appear as a small box of width 1. */
+#define MB_UNPRINTABLE_WIDTH 1
+
+MBCHAR_INLINE int
+mb_width_aux (wint_t wc)
+{
+ int w = wcwidth (wc);
+ /* For unprintable characters, arbitrarily return 0 for control characters
+ and MB_UNPRINTABLE_WIDTH otherwise. */
+ return (w >= 0 ? w : iswcntrl (wc) ? 0 : MB_UNPRINTABLE_WIDTH);
+}
+
+#define mb_width(mbc) \
+ ((mbc).wc_valid ? mb_width_aux ((mbc).wc) : MB_UNPRINTABLE_WIDTH)
+
+/* Output. */
+#define mb_putc(mbc, stream) fwrite ((mbc).ptr, 1, (mbc).bytes, (stream))
+
+/* Assignment. */
+#define mb_setascii(mbc, sc) \
+ ((mbc)->ptr = (mbc)->buf, (mbc)->bytes = 1, (mbc)->wc_valid = 1, \
+ (mbc)->wc = (mbc)->buf[0] = (sc))
+
+/* Copying a character. */
+MBCHAR_INLINE void
+mb_copy (mbchar_t *new_mbc, const mbchar_t *old_mbc)
+{
+ if (old_mbc->ptr == &old_mbc->buf[0])
+ {
+ memcpy (&new_mbc->buf[0], &old_mbc->buf[0], old_mbc->bytes);
+ new_mbc->ptr = &new_mbc->buf[0];
+ }
+ else
+ new_mbc->ptr = old_mbc->ptr;
+ new_mbc->bytes = old_mbc->bytes;
+ if ((new_mbc->wc_valid = old_mbc->wc_valid))
+ new_mbc->wc = old_mbc->wc;
+}
+
+
+/* is_basic(c) tests whether the single-byte character c is in the
+ ISO C "basic character set".
+ This is a convenience function, and is in this file only to share code
+ between mbiter_multi.h and mbfile_multi.h. */
+#if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)
+/* The character set is ISO-646, not EBCDIC. */
+# define IS_BASIC_ASCII 1
+
+extern const unsigned int is_basic_table[];
+
+MBCHAR_INLINE bool
+is_basic (char c)
+{
+ return (is_basic_table [(unsigned char) c >> 5] >> ((unsigned char) c & 31))
+ & 1;
+}
+
+#else
+
+MBCHAR_INLINE bool
+is_basic (char c)
+{
+ switch (c)
+ {
+ case '\t': case '\v': case '\f':
+ case ' ': case '!': case '"': case '#': case '%':
+ case '&': case '\'': case '(': case ')': case '*':
+ case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case ':': case ';': case '<': case '=': case '>':
+ case '?':
+ case 'A': case 'B': case 'C': case 'D': case 'E':
+ case 'F': case 'G': case 'H': case 'I': case 'J':
+ case 'K': case 'L': case 'M': case 'N': case 'O':
+ case 'P': case 'Q': case 'R': case 'S': case 'T':
+ case 'U': case 'V': case 'W': case 'X': case 'Y':
+ case 'Z':
+ case '[': case '\\': case ']': case '^': case '_':
+ case 'a': case 'b': case 'c': case 'd': case 'e':
+ case 'f': case 'g': case 'h': case 'i': case 'j':
+ case 'k': case 'l': case 'm': case 'n': case 'o':
+ case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y':
+ case 'z': case '{': case '|': case '}': case '~':
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _MBCHAR_H */
diff --git a/lib/mbiter.c b/lib/mbiter.c
new file mode 100644
index 0000000..22a1ff8
--- /dev/null
+++ b/lib/mbiter.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define MBITER_INLINE _GL_EXTERN_INLINE
+#include "mbiter.h"
diff --git a/lib/mbiter.h b/lib/mbiter.h
new file mode 100644
index 0000000..a26be1a
--- /dev/null
+++ b/lib/mbiter.h
@@ -0,0 +1,218 @@
+/* Iterating through multibyte strings: macros for multi-byte encodings.
+ Copyright (C) 2001, 2005, 2007, 2009-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+/* The macros in this file implement forward iteration through a
+ multi-byte string.
+
+ With these macros, an iteration loop that looks like
+
+ char *iter;
+ for (iter = buf; iter < buf + buflen; iter++)
+ {
+ do_something (*iter);
+ }
+
+ becomes
+
+ mbi_iterator_t iter;
+ for (mbi_init (iter, buf, buflen); mbi_avail (iter); mbi_advance (iter))
+ {
+ do_something (mbi_cur_ptr (iter), mb_len (mbi_cur (iter)));
+ }
+
+ The benefit of these macros over plain use of mbrtowc is:
+ - Handling of invalid multibyte sequences is possible without
+ making the code more complicated, while still preserving the
+ invalid multibyte sequences.
+
+ mbi_iterator_t
+ is a type usable for variable declarations.
+
+ mbi_init (iter, startptr, length)
+ initializes the iterator, starting at startptr and crossing length bytes.
+
+ mbi_avail (iter)
+ returns true if there are more multibyte characters available before
+ the end of string is reached. In this case, mbi_cur (iter) is
+ initialized to the next multibyte character.
+
+ mbi_advance (iter)
+ advances the iterator by one multibyte character.
+
+ mbi_cur (iter)
+ returns the current multibyte character, of type mbchar_t. All the
+ macros defined in mbchar.h can be used on it.
+
+ mbi_cur_ptr (iter)
+ return a pointer to the beginning of the current multibyte character.
+
+ mbi_reloc (iter, ptrdiff)
+ relocates iterator when the string is moved by ptrdiff bytes.
+
+ mbi_copy (&destiter, &srciter)
+ copies srciter to destiter.
+
+ Here are the function prototypes of the macros.
+
+ extern void mbi_init (mbi_iterator_t iter,
+ const char *startptr, size_t length);
+ extern bool mbi_avail (mbi_iterator_t iter);
+ extern void mbi_advance (mbi_iterator_t iter);
+ extern mbchar_t mbi_cur (mbi_iterator_t iter);
+ extern const char * mbi_cur_ptr (mbi_iterator_t iter);
+ extern void mbi_reloc (mbi_iterator_t iter, ptrdiff_t ptrdiff);
+ extern void mbi_copy (mbi_iterator_t *new, const mbi_iterator_t *old);
+ */
+
+#ifndef _MBITER_H
+#define _MBITER_H 1
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "mbchar.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef MBITER_INLINE
+# define MBITER_INLINE _GL_INLINE
+#endif
+
+struct mbiter_multi
+{
+ const char *limit; /* pointer to end of string */
+ bool in_shift; /* true if next byte may not be interpreted as ASCII */
+ mbstate_t state; /* if in_shift: current shift state */
+ bool next_done; /* true if mbi_avail has already filled the following */
+ struct mbchar cur; /* the current character:
+ const char *cur.ptr pointer to current character
+ The following are only valid after mbi_avail.
+ size_t cur.bytes number of bytes of current character
+ bool cur.wc_valid true if wc is a valid wide character
+ wchar_t cur.wc if wc_valid: the current character
+ */
+};
+
+MBITER_INLINE void
+mbiter_multi_next (struct mbiter_multi *iter)
+{
+ if (iter->next_done)
+ return;
+ if (iter->in_shift)
+ goto with_shift;
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
+ if (is_basic (*iter->cur.ptr))
+ {
+ /* These characters are part of the basic character set. ISO C 99
+ guarantees that their wide character code is identical to their
+ char code. */
+ iter->cur.bytes = 1;
+ iter->cur.wc = *iter->cur.ptr;
+ iter->cur.wc_valid = true;
+ }
+ else
+ {
+ assert (mbsinit (&iter->state));
+ iter->in_shift = true;
+ with_shift:
+ iter->cur.bytes = mbrtowc (&iter->cur.wc, iter->cur.ptr,
+ iter->limit - iter->cur.ptr, &iter->state);
+ if (iter->cur.bytes == (size_t) -1)
+ {
+ /* An invalid multibyte sequence was encountered. */
+ iter->cur.bytes = 1;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not very important; the string is bogus anyway. */
+ }
+ else if (iter->cur.bytes == (size_t) -2)
+ {
+ /* An incomplete multibyte character at the end. */
+ iter->cur.bytes = iter->limit - iter->cur.ptr;
+ iter->cur.wc_valid = false;
+ /* Whether to set iter->in_shift = false and reset iter->state
+ or not is not important; the string end is reached anyway. */
+ }
+ else
+ {
+ if (iter->cur.bytes == 0)
+ {
+ /* A null wide character was encountered. */
+ iter->cur.bytes = 1;
+ assert (*iter->cur.ptr == '\0');
+ assert (iter->cur.wc == 0);
+ }
+ iter->cur.wc_valid = true;
+
+ /* When in the initial state, we can go back treating ASCII
+ characters more quickly. */
+ if (mbsinit (&iter->state))
+ iter->in_shift = false;
+ }
+ }
+ iter->next_done = true;
+}
+
+MBITER_INLINE void
+mbiter_multi_reloc (struct mbiter_multi *iter, ptrdiff_t ptrdiff)
+{
+ iter->cur.ptr += ptrdiff;
+ iter->limit += ptrdiff;
+}
+
+MBITER_INLINE void
+mbiter_multi_copy (struct mbiter_multi *new_iter, const struct mbiter_multi *old_iter)
+{
+ new_iter->limit = old_iter->limit;
+ if ((new_iter->in_shift = old_iter->in_shift))
+ memcpy (&new_iter->state, &old_iter->state, sizeof (mbstate_t));
+ else
+ memset (&new_iter->state, 0, sizeof (mbstate_t));
+ new_iter->next_done = old_iter->next_done;
+ mb_copy (&new_iter->cur, &old_iter->cur);
+}
+
+/* Iteration macros. */
+typedef struct mbiter_multi mbi_iterator_t;
+#define mbi_init(iter, startptr, length) \
+ ((iter).cur.ptr = (startptr), (iter).limit = (iter).cur.ptr + (length), \
+ (iter).in_shift = false, memset (&(iter).state, '\0', sizeof (mbstate_t)), \
+ (iter).next_done = false)
+#define mbi_avail(iter) \
+ ((iter).cur.ptr < (iter).limit && (mbiter_multi_next (&(iter)), true))
+#define mbi_advance(iter) \
+ ((iter).cur.ptr += (iter).cur.bytes, (iter).next_done = false)
+
+/* Access to the current character. */
+#define mbi_cur(iter) (iter).cur
+#define mbi_cur_ptr(iter) (iter).cur.ptr
+
+/* Relocation. */
+#define mbi_reloc(iter, ptrdiff) mbiter_multi_reloc (&iter, ptrdiff)
+
+/* Copying an iterator. */
+#define mbi_copy mbiter_multi_copy
+
+_GL_INLINE_HEADER_END
+
+#endif /* _MBITER_H */
diff --git a/lib/mbrtowc-impl-utf8.h b/lib/mbrtowc-impl-utf8.h
new file mode 100644
index 0000000..a826b1b
--- /dev/null
+++ b/lib/mbrtowc-impl-utf8.h
@@ -0,0 +1,138 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 1999-2002, 2005-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+/* This file contains the part of the body of the mbrtowc and mbrtoc32 functions
+ that handles the special case of the UTF-8 encoding. */
+
+ /* Cf. unistr/u8-mbtouc.c. */
+ unsigned char c = (unsigned char) p[0];
+
+ if (c < 0x80)
+ {
+ if (pwc != NULL)
+ *pwc = c;
+ res = (c == 0 ? 0 : 1);
+ goto success;
+ }
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (m == 1)
+ goto incomplete;
+ else /* m >= 2 */
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40)
+ {
+ if (pwc != NULL)
+ *pwc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (c2 ^ 0x80);
+ res = 2;
+ goto success;
+ }
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (m == 1)
+ goto incomplete;
+ else
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xe1 || c2 >= 0xa0)
+ && (c != 0xed || c2 < 0xa0))
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m >= 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if ((c3 ^ 0x80) < 0x40)
+ {
+ unsigned int wc =
+ (((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (c2 ^ 0x80) << 6)
+ | (unsigned int) (c3 ^ 0x80));
+
+ if (FITS_IN_CHAR_TYPE (wc))
+ {
+ if (pwc != NULL)
+ *pwc = wc;
+ res = 3;
+ goto success;
+ }
+ }
+ }
+ }
+ }
+ }
+ else if (c <= 0xf4)
+ {
+ if (m == 1)
+ goto incomplete;
+ else
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if ((c2 ^ 0x80) < 0x40
+ && (c >= 0xf1 || c2 >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && c2 < 0x90)))
+ {
+ if (m == 2)
+ goto incomplete;
+ else
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if ((c3 ^ 0x80) < 0x40)
+ {
+ if (m == 3)
+ goto incomplete;
+ else /* m >= 4 */
+ {
+ unsigned char c4 = (unsigned char) p[3];
+
+ if ((c4 ^ 0x80) < 0x40)
+ {
+ unsigned int wc =
+ (((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (c2 ^ 0x80) << 12)
+ | ((unsigned int) (c3 ^ 0x80) << 6)
+ | (unsigned int) (c4 ^ 0x80));
+
+ if (FITS_IN_CHAR_TYPE (wc))
+ {
+ if (pwc != NULL)
+ *pwc = wc;
+ res = 4;
+ goto success;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ goto invalid;
diff --git a/lib/mbrtowc-impl.h b/lib/mbrtowc-impl.h
new file mode 100644
index 0000000..c970439
--- /dev/null
+++ b/lib/mbrtowc-impl.h
@@ -0,0 +1,262 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 1999-2002, 2005-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2008. */
+
+/* This file contains the body of the mbrtowc and mbrtoc32 functions,
+ when GNULIB_defined_mbstate_t is defined. */
+
+ char *pstate = (char *)ps;
+
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+
+ if (n == 0)
+ return (size_t)(-2);
+
+ /* Here n > 0. */
+
+ if (pstate == NULL)
+ pstate = internal_state;
+
+ {
+ size_t nstate = pstate[0];
+ char buf[4];
+ const char *p;
+ size_t m;
+ enc_t enc;
+ int res;
+
+ switch (nstate)
+ {
+ case 0:
+ p = s;
+ m = n;
+ break;
+ case 3:
+ buf[2] = pstate[3];
+ FALLTHROUGH;
+ case 2:
+ buf[1] = pstate[2];
+ FALLTHROUGH;
+ case 1:
+ buf[0] = pstate[1];
+ p = buf;
+ m = nstate;
+ buf[m++] = s[0];
+ if (n >= 2 && m < 4)
+ {
+ buf[m++] = s[1];
+ if (n >= 3 && m < 4)
+ buf[m++] = s[2];
+ }
+ break;
+ default:
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+ /* Here m > 0. */
+
+ enc = locale_encoding_classification ();
+
+ if (enc == enc_utf8) /* UTF-8 */
+ {
+ /* Achieve
+ - multi-thread safety and
+ - the ability to produce wide character values > WCHAR_MAX
+ by not calling mbtowc() at all. */
+#include "mbrtowc-impl-utf8.h"
+ }
+ else
+ {
+ /* The hidden internal state of mbtowc would make this function not
+ multi-thread safe. Achieve multi-thread safety through a lock. */
+ wchar_t wc;
+ res = mbtowc_with_lock (&wc, p, m);
+
+ if (res >= 0)
+ {
+ if ((wc == 0) != (res == 0))
+ abort ();
+ if (pwc != NULL)
+ *pwc = wc;
+ goto success;
+ }
+
+ /* mbtowc does not distinguish between invalid and incomplete multibyte
+ sequences. But mbrtowc needs to make this distinction.
+ There are two possible approaches:
+ - Use iconv() and its return value.
+ - Use built-in knowledge about the possible encodings.
+ Given the low quality of implementation of iconv() on the systems
+ that lack mbrtowc(), we use the second approach.
+ The possible encodings are:
+ - 8-bit encodings,
+ - EUC-JP, EUC-KR, GB2312, EUC-TW, BIG5, GB18030, SJIS,
+ - UTF-8 (already handled above).
+ Use specialized code for each. */
+ if (m >= 4 || m >= MB_CUR_MAX)
+ goto invalid;
+ /* Here MB_CUR_MAX > 1 and 0 < m < 4. */
+ switch (enc)
+ {
+ /* As a reference for this code, you can use the GNU libiconv
+ implementation. Look for uses of the RET_TOOFEW macro. */
+
+ case enc_eucjp: /* EUC-JP */
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e || c == 0x8f)
+ goto incomplete;
+ }
+ if (m == 2)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8f)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0xa1 && c2 < 0xff)
+ goto incomplete;
+ }
+ }
+ goto invalid;
+ }
+
+ case enc_94: /* EUC-KR, GB2312, BIG5 */
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0xa1 && c < 0xff)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+
+ case enc_euctw: /* EUC-TW */
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0xa1 && c < 0xff) || c == 0x8e)
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c == 0x8e)
+ goto incomplete;
+ }
+ goto invalid;
+ }
+
+ case enc_gb18030: /* GB18030 */
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x90 && c <= 0xe3) || (c >= 0xf8 && c <= 0xfe))
+ goto incomplete;
+ }
+ else /* m == 2 || m == 3 */
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if (c >= 0x90 && c <= 0xe3)
+ {
+ unsigned char c2 = (unsigned char) p[1];
+
+ if (c2 >= 0x30 && c2 <= 0x39)
+ {
+ if (m == 2)
+ goto incomplete;
+ else /* m == 3 */
+ {
+ unsigned char c3 = (unsigned char) p[2];
+
+ if (c3 >= 0x81 && c3 <= 0xfe)
+ goto incomplete;
+ }
+ }
+ }
+ }
+ goto invalid;
+ }
+
+ case enc_sjis: /* SJIS */
+ {
+ if (m == 1)
+ {
+ unsigned char c = (unsigned char) p[0];
+
+ if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)
+ || (c >= 0xf0 && c <= 0xf9))
+ goto incomplete;
+ }
+ goto invalid;
+ }
+
+ default:
+ /* An unknown multibyte encoding. */
+ goto incomplete;
+ }
+ }
+
+ success:
+ /* res >= 0 is the corrected return value of
+ mbtowc_with_lock (&wc, p, m). */
+ if (nstate >= (res > 0 ? res : 1))
+ abort ();
+ res -= nstate;
+ pstate[0] = 0;
+ return res;
+
+ incomplete:
+ {
+ size_t k = nstate;
+ /* Here 0 <= k < m < 4. */
+ pstate[++k] = s[0];
+ if (k < m)
+ {
+ pstate[++k] = s[1];
+ if (k < m)
+ pstate[++k] = s[2];
+ }
+ if (k != m)
+ abort ();
+ }
+ pstate[0] = m;
+ return (size_t)(-2);
+
+ invalid:
+ errno = EILSEQ;
+ /* The conversion state is undefined, says POSIX. */
+ return (size_t)(-1);
+ }
diff --git a/lib/mbrtowc.c b/lib/mbrtowc.c
new file mode 100644
index 0000000..a71d394
--- /dev/null
+++ b/lib/mbrtowc.c
@@ -0,0 +1,158 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 1999-2002, 2005-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#if GNULIB_defined_mbstate_t
+/* Implement mbrtowc() on top of mbtowc() for the non-UTF-8 locales
+ and directly for the UTF-8 locales. */
+
+# include <errno.h>
+# include <stdint.h>
+# include <stdlib.h>
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+# if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS
+# include <threads.h>
+# pragma weak thrd_exit
+# define c11_threads_in_use() (thrd_exit != NULL)
+# else
+# define c11_threads_in_use() 0
+# endif
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+
+# endif
+
+# include "attribute.h"
+# include "verify.h"
+# include "lc-charset-dispatch.h"
+# include "mbtowc-lock.h"
+
+verify (sizeof (mbstate_t) >= 4);
+static char internal_state[4];
+
+size_t
+mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+# define FITS_IN_CHAR_TYPE(wc) ((wc) <= WCHAR_MAX)
+# include "mbrtowc-impl.h"
+}
+
+#else
+/* Override the system's mbrtowc() function. */
+
+# if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
+# include "hard-locale.h"
+# include <locale.h>
+# endif
+
+# undef mbrtowc
+
+size_t
+rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
+{
+ size_t ret;
+ wchar_t wc;
+
+# if MBRTOWC_NULL_ARG2_BUG || MBRTOWC_RETVAL_BUG || MBRTOWC_EMPTY_INPUT_BUG
+ if (s == NULL)
+ {
+ pwc = NULL;
+ s = "";
+ n = 1;
+ }
+# endif
+
+# if MBRTOWC_EMPTY_INPUT_BUG
+ if (n == 0)
+ return (size_t) -2;
+# endif
+
+ if (! pwc)
+ pwc = &wc;
+
+# if MBRTOWC_RETVAL_BUG
+ {
+ static mbstate_t internal_state;
+
+ /* Override mbrtowc's internal state. We cannot call mbsinit() on the
+ hidden internal state, but we can call it on our variable. */
+ if (ps == NULL)
+ ps = &internal_state;
+
+ if (!mbsinit (ps))
+ {
+ /* Parse the rest of the multibyte character byte for byte. */
+ size_t count = 0;
+ for (; n > 0; s++, n--)
+ {
+ ret = mbrtowc (&wc, s, 1, ps);
+
+ if (ret == (size_t)(-1))
+ return (size_t)(-1);
+ count++;
+ if (ret != (size_t)(-2))
+ {
+ /* The multibyte character has been completed. */
+ *pwc = wc;
+ return (wc == 0 ? 0 : count);
+ }
+ }
+ return (size_t)(-2);
+ }
+ }
+# endif
+
+# if MBRTOWC_STORES_INCOMPLETE_BUG
+ ret = mbrtowc (&wc, s, n, ps);
+ if (ret < (size_t) -2 && pwc != NULL)
+ *pwc = wc;
+# else
+ ret = mbrtowc (pwc, s, n, ps);
+# endif
+
+# if MBRTOWC_NUL_RETVAL_BUG
+ if (ret < (size_t) -2 && !*pwc)
+ return 0;
+# endif
+
+# if MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
+ if ((size_t) -2 <= ret && n != 0 && ! hard_locale (LC_CTYPE))
+ {
+ unsigned char uc = *s;
+ *pwc = uc;
+ return 1;
+ }
+# endif
+
+ return ret;
+}
+
+#endif
diff --git a/lib/mbsinit.c b/lib/mbsinit.c
new file mode 100644
index 0000000..981a894
--- /dev/null
+++ b/lib/mbsinit.c
@@ -0,0 +1,70 @@
+/* Test for initial conversion state.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "verify.h"
+
+#if GNULIB_defined_mbstate_t
+
+/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
+ and wcrtomb(), wcsrtombs().
+ We assume that
+ - sizeof (mbstate_t) >= 4,
+ - only stateless encodings are supported (such as UTF-8 and EUC-JP, but
+ not ISO-2022 variants),
+ - for each encoding, the number of bytes for a wide character is <= 4.
+ (This maximum is attained for UTF-8, GB18030, EUC-TW.)
+ We define the meaning of mbstate_t as follows:
+ - In mb -> wc direction, mbstate_t's first byte contains the number of
+ buffered bytes (in the range 0..3), followed by up to 3 buffered bytes.
+ See mbrtowc.c.
+ - In wc -> mb direction, mbstate_t contains no information. In other
+ words, it is always in the initial state. */
+
+verify (sizeof (mbstate_t) >= 4);
+
+int
+mbsinit (const mbstate_t *ps)
+{
+ const char *pstate = (const char *)ps;
+
+ return pstate == NULL || pstate[0] == 0;
+}
+
+#else
+
+int
+mbsinit (const mbstate_t *ps)
+{
+# if defined _WIN32 && !defined __CYGWIN__
+ /* Native Windows. */
+ /* MSVC defines 'mbstate_t' as an 8-byte struct; the first 4 bytes matter.
+ On mingw, 'mbstate_t' is sometimes defined as 'int', sometimes defined as
+ an 8-byte struct, of which the first 4 bytes matter. */
+ return ps == NULL || *(const unsigned int *)ps == 0;
+# else
+ /* Minix, HP-UX 11.00, Solaris 2.6, Interix, ... */
+ /* Maybe this definition works, maybe not... */
+ return ps == NULL || *(const char *)ps == 0;
+# endif
+}
+
+#endif
diff --git a/lib/mbsrtowcs-impl.h b/lib/mbsrtowcs-impl.h
new file mode 100644
index 0000000..06ecec2
--- /dev/null
+++ b/lib/mbsrtowcs-impl.h
@@ -0,0 +1,122 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+size_t
+FUNC (DCHAR_T *dest, const char **srcp, size_t len, mbstate_t *ps)
+{
+ if (ps == NULL)
+ ps = &INTERNAL_STATE;
+ {
+ const char *src = *srcp;
+
+ if (dest != NULL)
+ {
+ DCHAR_T *destptr = dest;
+
+ for (; len > 0; destptr++, len--)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = MBRTOWC (destptr, src, src_avail, ps);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input;
+ if (ret == 0)
+ {
+ src = NULL;
+ /* Here mbsinit (ps). */
+ break;
+ }
+ src += ret;
+ }
+
+ *srcp = src;
+ return destptr - dest;
+ }
+ else
+ {
+ /* Ignore dest and len, don't store *srcp at the end, and
+ don't clobber *ps. */
+ mbstate_t state = *ps;
+ size_t totalcount = 0;
+
+ for (;; totalcount++)
+ {
+ size_t src_avail;
+ size_t ret;
+
+ /* An optimized variant of
+ src_avail = strnlen1 (src, MB_LEN_MAX); */
+ if (src[0] == '\0')
+ src_avail = 1;
+ else if (src[1] == '\0')
+ src_avail = 2;
+ else if (src[2] == '\0')
+ src_avail = 3;
+ else if (MB_LEN_MAX <= 4 || src[3] == '\0')
+ src_avail = 4;
+ else
+ src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
+
+ /* Parse the next multibyte character. */
+ ret = MBRTOWC (NULL, src, src_avail, &state);
+
+ if (ret == (size_t)(-2))
+ /* Encountered a multibyte character that extends past a '\0' byte
+ or that is longer than MB_LEN_MAX bytes. Cannot happen. */
+ abort ();
+
+ if (ret == (size_t)(-1))
+ goto bad_input2;
+ if (ret == 0)
+ {
+ /* Here mbsinit (&state). */
+ break;
+ }
+ src += ret;
+ }
+
+ return totalcount;
+ }
+
+ bad_input:
+ *srcp = src;
+ bad_input2:
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+}
diff --git a/lib/mbsrtowcs-state.c b/lib/mbsrtowcs-state.c
new file mode 100644
index 0000000..aca1ad8
--- /dev/null
+++ b/lib/mbsrtowcs-state.c
@@ -0,0 +1,37 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <wchar.h>
+
+/* Internal state used by the functions mbsrtowcs() and mbsnrtowcs(). */
+mbstate_t _gl_mbsrtowcs_state
+/* The state must initially be in the "initial state"; so, zero-initialize it.
+ On most systems, putting it into BSS is sufficient. Not so on Mac OS X 10.3,
+ see <https://lists.gnu.org/r/bug-gnulib/2009-01/msg00329.html>.
+ When it needs an initializer, use 0 or {0} as initializer? 0 only works
+ when mbstate_t is a scalar type (such as when gnulib defines it, or on
+ AIX, IRIX, mingw). {0} works as an initializer in all cases: for a struct
+ or union type, but also for a scalar type (ISO C 99, 6.7.8.(11)). */
+#if defined __ELF__
+ /* On ELF systems, variables in BSS behave well. */
+#else
+ /* Use braces, to be on the safe side. */
+ = { 0 }
+#endif
+ ;
diff --git a/lib/mbsrtowcs.c b/lib/mbsrtowcs.c
new file mode 100644
index 0000000..6d1c685
--- /dev/null
+++ b/lib/mbsrtowcs.c
@@ -0,0 +1,36 @@
+/* Convert string to wide string.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "strnlen1.h"
+
+
+extern mbstate_t _gl_mbsrtowcs_state;
+
+#define FUNC mbsrtowcs
+#define DCHAR_T wchar_t
+#define INTERNAL_STATE _gl_mbsrtowcs_state
+#define MBRTOWC mbrtowc
+#include "mbsrtowcs-impl.h"
diff --git a/lib/mbtowc-impl.h b/lib/mbtowc-impl.h
new file mode 100644
index 0000000..22e414a
--- /dev/null
+++ b/lib/mbtowc-impl.h
@@ -0,0 +1,44 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ 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/>. */
+
+/* We don't need a static internal state, because the encoding is not state
+ dependent, and when mbrtowc returns (size_t)(-2). we throw the result
+ away. */
+
+int
+mbtowc (wchar_t *pwc, const char *s, size_t n)
+{
+ if (s == NULL)
+ return 0;
+ else
+ {
+ mbstate_t state;
+ wchar_t wc;
+ size_t result;
+
+ memset (&state, 0, sizeof (mbstate_t));
+ result = mbrtowc (&wc, s, n, &state);
+ if (result == (size_t)-1 || result == (size_t)-2)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+ if (pwc != NULL)
+ *pwc = wc;
+ return (wc == 0 ? 0 : result);
+ }
+}
diff --git a/lib/mbtowc-lock.c b/lib/mbtowc-lock.c
new file mode 100644
index 0000000..85ad3c4
--- /dev/null
+++ b/lib/mbtowc-lock.c
@@ -0,0 +1,150 @@
+/* Return the internal lock used by mbrtowc and mbrtoc32.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019-2020. */
+
+#include <config.h>
+
+/* When it is known that the gl_get_mbtowc_lock function is defined
+ by a dependency library, it should not be defined here. */
+#if OMIT_MBTOWC_LOCK
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#else
+
+/* This file defines the internal lock used by mbrtowc and mbrtoc32.
+ It is a separate compilation unit, so that only one copy of it is
+ present when linking statically. */
+
+/* Prohibit renaming this symbol. */
+# undef gl_get_mbtowc_lock
+
+/* Macro for exporting a symbol (function, not variable) defined in this file,
+ when compiled into a shared library. */
+# ifndef DLL_EXPORTED
+# if HAVE_VISIBILITY
+ /* Override the effect of the compiler option '-fvisibility=hidden'. */
+# define DLL_EXPORTED __attribute__((__visibility__("default")))
+# elif defined _WIN32 || defined __CYGWIN__
+# define DLL_EXPORTED __declspec(dllexport)
+# else
+# define DLL_EXPORTED
+# endif
+# endif
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "windows-initguard.h"
+
+/* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *',
+ because the latter is not guaranteed to be a stable ABI in the future. */
+
+/* Make sure the function gets exported from DLLs. */
+DLL_EXPORTED CRITICAL_SECTION *gl_get_mbtowc_lock (void);
+
+static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT;
+static CRITICAL_SECTION lock;
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32. */
+CRITICAL_SECTION *
+gl_get_mbtowc_lock (void)
+{
+ if (!guard.done)
+ {
+ if (InterlockedIncrement (&guard.started) == 0)
+ {
+ /* This thread is the first one to need the lock. Initialize it. */
+ InitializeCriticalSection (&lock);
+ guard.done = 1;
+ }
+ else
+ {
+ /* Don't let guard.started grow and wrap around. */
+ InterlockedDecrement (&guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this mutex. */
+ while (!guard.done)
+ Sleep (0);
+ }
+ }
+ return &lock;
+}
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED pthread_mutex_t *gl_get_mbtowc_lock (void);
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32. */
+pthread_mutex_t *
+gl_get_mbtowc_lock (void)
+{
+ return &mutex;
+}
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+# include <stdlib.h>
+
+static int volatile init_needed = 1;
+static once_flag init_once = ONCE_FLAG_INIT;
+static mtx_t mutex;
+
+static void
+atomic_init (void)
+{
+ if (mtx_init (&mutex, mtx_plain) != thrd_success)
+ abort ();
+ init_needed = 0;
+}
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED mtx_t *gl_get_mbtowc_lock (void);
+
+/* Returns the internal lock used by mbrtowc and mbrtoc32. */
+mtx_t *
+gl_get_mbtowc_lock (void)
+{
+ if (init_needed)
+ call_once (&init_once, atomic_init);
+ return &mutex;
+}
+
+# endif
+
+# if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER
+/* Make sure the '__declspec(dllimport)' in mbrtowc.c and mbrtoc32.c does not
+ cause a link failure when no DLLs are involved. */
+# if defined _WIN64 || defined _LP64
+# define IMP(x) __imp_##x
+# else
+# define IMP(x) _imp__##x
+# endif
+void * IMP(gl_get_mbtowc_lock) = &gl_get_mbtowc_lock;
+# endif
+
+#endif
diff --git a/lib/mbtowc-lock.h b/lib/mbtowc-lock.h
new file mode 100644
index 0000000..e101978
--- /dev/null
+++ b/lib/mbtowc-lock.h
@@ -0,0 +1,115 @@
+/* Use the internal lock used by mbrtowc and mbrtoc32.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019-2020. */
+
+/* Use a lock, so that no two threads can invoke mbtowc at the same time. */
+
+static inline int
+mbtowc_unlocked (wchar_t *pwc, const char *p, size_t m)
+{
+ /* Put the hidden internal state of mbtowc into its initial state.
+ This is needed at least with glibc, uClibc, and MSVC CRT.
+ See <https://sourceware.org/bugzilla/show_bug.cgi?id=9674>. */
+ mbtowc (NULL, NULL, 0);
+
+ return mbtowc (pwc, p, m);
+}
+
+/* Prohibit renaming this symbol. */
+#undef gl_get_mbtowc_lock
+
+#if defined _WIN32 && !defined __CYGWIN__
+
+extern __declspec(dllimport) CRITICAL_SECTION *gl_get_mbtowc_lock (void);
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+ CRITICAL_SECTION *lock = gl_get_mbtowc_lock ();
+ int ret;
+
+ EnterCriticalSection (lock);
+ ret = mbtowc_unlocked (pwc, p, m);
+ LeaveCriticalSection (lock);
+
+ return ret;
+}
+
+#elif HAVE_PTHREAD_API /* AIX, IRIX, Cygwin */
+
+extern
+# if defined _WIN32 || defined __CYGWIN__
+ __declspec(dllimport)
+# endif
+ pthread_mutex_t *gl_get_mbtowc_lock (void);
+
+# if HAVE_WEAK_SYMBOLS /* IRIX */
+
+ /* Avoid the need to link with '-lpthread'. */
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+
+ /* Determine whether libpthread is in use. */
+# pragma weak pthread_mutexattr_gettype
+ /* See the comments in lock.h. */
+# define pthread_in_use() \
+ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+
+# else
+# define pthread_in_use() 1
+# endif
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+ if (pthread_in_use())
+ {
+ pthread_mutex_t *lock = gl_get_mbtowc_lock ();
+ int ret;
+
+ if (pthread_mutex_lock (lock))
+ abort ();
+ ret = mbtowc_unlocked (pwc, p, m);
+ if (pthread_mutex_unlock (lock))
+ abort ();
+
+ return ret;
+ }
+ else
+ return mbtowc_unlocked (pwc, p, m);
+}
+
+#elif HAVE_THREADS_H
+
+extern mtx_t *gl_get_mbtowc_lock (void);
+
+static int
+mbtowc_with_lock (wchar_t *pwc, const char *p, size_t m)
+{
+ mtx_t *lock = gl_get_mbtowc_lock ();
+ int ret;
+
+ if (mtx_lock (lock) != thrd_success)
+ abort ();
+ ret = mbtowc_unlocked (pwc, p, m);
+ if (mtx_unlock (lock) != thrd_success)
+ abort ();
+
+ return ret;
+}
+
+#endif
diff --git a/lib/mbtowc.c b/lib/mbtowc.c
new file mode 100644
index 0000000..5fc2d28
--- /dev/null
+++ b/lib/mbtowc.c
@@ -0,0 +1,26 @@
+/* Convert multibyte character to wide character.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ 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/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#include <errno.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "mbtowc-impl.h"
diff --git a/lib/md2.c b/lib/md2.c
new file mode 100644
index 0000000..cdb479d
--- /dev/null
+++ b/lib/md2.c
@@ -0,0 +1,274 @@
+/* Functions to compute MD2 message digest of files or memory blocks.
+ according to the definition of MD2 in RFC 1319 from April 1992.
+ Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by
+ Tom St Denis. */
+
+#include <config.h>
+
+#include "md2.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <minmax.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+static void md2_update_chksum (struct md2_ctx *md);
+static void md2_compress (struct md2_ctx *md);
+
+/* Initialize structure containing state of computation.
+ (RFC 1319, 3.3: Step 3) */
+void
+md2_init_ctx (struct md2_ctx *ctx)
+{
+ memset (ctx->X, 0, sizeof (ctx->X));
+ memset (ctx->chksum, 0, sizeof (ctx->chksum));
+ memset (ctx->buf, 0, sizeof (ctx->buf));
+ ctx->curlen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md2_read_ctx (const struct md2_ctx *ctx, void *resbuf)
+{
+ memcpy (resbuf, ctx->X, 16);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md2_finish_ctx (struct md2_ctx *ctx, void *resbuf)
+{
+ unsigned long i, k;
+
+ /* pad the message */
+ k = 16 - ctx->curlen;
+ for (i = ctx->curlen; i < 16; i++)
+ {
+ ctx->buf[i] = (unsigned char) k;
+ }
+
+ /* hash and update */
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+
+ /* hash checksum */
+ memcpy (ctx->buf, ctx->chksum, 16);
+ md2_compress (ctx);
+
+ return md2_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md2_stream (FILE *stream, void *resblock)
+{
+ struct md2_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md2_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md2_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md2_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md2_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md2_ctx ctx;
+
+ /* Initialize the computation context. */
+ md2_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md2_process_block (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md2_finish_ctx (&ctx, resblock);
+}
+
+void
+md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ const char *in = buffer;
+ unsigned long n;
+
+ while (len > 0)
+ {
+ n = MIN (len, (16 - ctx->curlen));
+ memcpy (ctx->buf + ctx->curlen, in, (size_t) n);
+ ctx->curlen += n;
+ in += n;
+ len -= n;
+
+ /* is 16 bytes full? */
+ if (ctx->curlen == 16)
+ {
+ md2_compress (ctx);
+ md2_update_chksum (ctx);
+ ctx->curlen = 0;
+ }
+ }
+}
+
+static const unsigned char PI_SUBST[256] = {
+ 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
+ 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
+ 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
+ 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
+ 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
+ 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
+ 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
+ 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
+ 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
+ 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
+ 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
+ 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
+ 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
+ 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
+ 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
+ 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
+ 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
+ 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
+};
+
+/* adds 16 bytes to the checksum */
+static void
+md2_update_chksum (struct md2_ctx *ctx)
+{
+ int j;
+ unsigned char L;
+
+ L = ctx->chksum[15];
+ for (j = 0; j < 16; j++)
+ {
+ /* caution, the RFC says its "C[j] = S[M[i*16+j] xor L]" but the
+ reference source code [and test vectors] say otherwise. */
+ L = (ctx->chksum[j] ^= PI_SUBST[(int) (ctx->buf[j] ^ L)] & 255);
+ }
+}
+
+static void
+md2_compress (struct md2_ctx *ctx)
+{
+ size_t j, k;
+ unsigned char t;
+
+ /* copy block */
+ for (j = 0; j < 16; j++)
+ {
+ ctx->X[16 + j] = ctx->buf[j];
+ ctx->X[32 + j] = ctx->X[j] ^ ctx->X[16 + j];
+ }
+
+ t = (unsigned char) 0;
+
+ /* do 18 rounds */
+ for (j = 0; j < 18; j++)
+ {
+ for (k = 0; k < 48; k++)
+ {
+ t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]);
+ }
+ t = (t + (unsigned char) j) & 255;
+ }
+}
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX. */
+void
+md2_process_block (const void *buffer, size_t len, struct md2_ctx *ctx)
+{
+ md2_process_bytes (buffer, len, ctx);
+}
diff --git a/lib/md2.h b/lib/md2.h
new file mode 100644
index 0000000..c69152e
--- /dev/null
+++ b/lib/md2.h
@@ -0,0 +1,85 @@
+/* Declarations of functions and data types used for MD2 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef MD2_H
+# define MD2_H 1
+
+# include <stdio.h>
+# include <stddef.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD2_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md2_ctx
+{
+ unsigned char chksum[16], X[48], buf[16];
+ size_t curlen;
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md2_init_ctx (struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_block (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md2_process_bytes (const void *buffer, size_t len,
+ struct md2_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md2_finish_ctx (struct md2_ctx *ctx, void *restrict resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md2_read_ctx (const struct md2_ctx *ctx, void *restrict resbuf);
+
+
+/* Compute MD2 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md2_stream (FILE *stream, void *resblock);
+
+/* Compute MD2 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md2_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/md4.c b/lib/md4.c
new file mode 100644
index 0000000..6ebad1b
--- /dev/null
+++ b/lib/md4.c
@@ -0,0 +1,382 @@
+/* Functions to compute MD4 message digest of files or memory blocks.
+ according to the definition of MD4 in RFC 1320 from April 1992.
+ Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt
+ cipher/md4.c . */
+
+#include <config.h>
+
+#include "md4.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include <byteswap.h>
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) bswap_32 (n)
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1320, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1320, 3.3: Step 3) */
+void
+md4_init_ctx (struct md4_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md4_read_ctx (const struct md4_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md4_finish_ctx (struct md4_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&((char*)ctx->buffer)[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[(bytes + pad) / 4] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[(bytes + pad) / 4 + 1] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md4_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md4_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md4_stream (FILE * stream, void *resblock)
+{
+ struct md4_ctx ctx;
+ size_t sum;
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md4_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md4_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md4_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md4_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md4_ctx ctx;
+
+ /* Initialize the computation context. */
+ md4_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md4_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md4_finish_ctx (&ctx, resblock);
+}
+
+void
+md4_process_bytes (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md4_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &((char*)ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md4_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md4_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char*)ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md4_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and md4.c --- */
+
+/* MD4 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+
+/* Round functions. */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+#define R1(a,b,c,d,k,s) a=rol(a+F(b,c,d)+x[k],s);
+#define R2(a,b,c,d,k,s) a=rol(a+G(b,c,d)+x[k]+K1,s);
+#define R3(a,b,c,d,k,s) a=rol(a+H(b,c,d)+x[k]+K2,s);
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md4_process_block (const void *buffer, size_t len, struct md4_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+ uint32_t lolen = len;
+
+ /* First increment the byte count. RFC 1320 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += lolen;
+ ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ /* Round 1. */
+ R1 (A, B, C, D, 0, 3);
+ R1 (D, A, B, C, 1, 7);
+ R1 (C, D, A, B, 2, 11);
+ R1 (B, C, D, A, 3, 19);
+ R1 (A, B, C, D, 4, 3);
+ R1 (D, A, B, C, 5, 7);
+ R1 (C, D, A, B, 6, 11);
+ R1 (B, C, D, A, 7, 19);
+ R1 (A, B, C, D, 8, 3);
+ R1 (D, A, B, C, 9, 7);
+ R1 (C, D, A, B, 10, 11);
+ R1 (B, C, D, A, 11, 19);
+ R1 (A, B, C, D, 12, 3);
+ R1 (D, A, B, C, 13, 7);
+ R1 (C, D, A, B, 14, 11);
+ R1 (B, C, D, A, 15, 19);
+
+ /* Round 2. */
+ R2 (A, B, C, D, 0, 3);
+ R2 (D, A, B, C, 4, 5);
+ R2 (C, D, A, B, 8, 9);
+ R2 (B, C, D, A, 12, 13);
+ R2 (A, B, C, D, 1, 3);
+ R2 (D, A, B, C, 5, 5);
+ R2 (C, D, A, B, 9, 9);
+ R2 (B, C, D, A, 13, 13);
+ R2 (A, B, C, D, 2, 3);
+ R2 (D, A, B, C, 6, 5);
+ R2 (C, D, A, B, 10, 9);
+ R2 (B, C, D, A, 14, 13);
+ R2 (A, B, C, D, 3, 3);
+ R2 (D, A, B, C, 7, 5);
+ R2 (C, D, A, B, 11, 9);
+ R2 (B, C, D, A, 15, 13);
+
+ /* Round 3. */
+ R3 (A, B, C, D, 0, 3);
+ R3 (D, A, B, C, 8, 9);
+ R3 (C, D, A, B, 4, 11);
+ R3 (B, C, D, A, 12, 15);
+ R3 (A, B, C, D, 2, 3);
+ R3 (D, A, B, C, 10, 9);
+ R3 (C, D, A, B, 6, 11);
+ R3 (B, C, D, A, 14, 15);
+ R3 (A, B, C, D, 1, 3);
+ R3 (D, A, B, C, 9, 9);
+ R3 (C, D, A, B, 5, 11);
+ R3 (B, C, D, A, 13, 15);
+ R3 (A, B, C, D, 3, 3);
+ R3 (D, A, B, C, 11, 9);
+ R3 (C, D, A, B, 7, 11);
+ R3 (B, C, D, A, 15, 15);
+
+ A = ctx->A += A;
+ B = ctx->B += B;
+ C = ctx->C += C;
+ D = ctx->D += D;
+ }
+}
diff --git a/lib/md4.h b/lib/md4.h
new file mode 100644
index 0000000..cf0d790
--- /dev/null
+++ b/lib/md4.h
@@ -0,0 +1,91 @@
+/* Declarations of functions and data types used for MD4 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef MD4_H
+# define MD4_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# define MD4_DIGEST_SIZE 16
+
+/* Structure to save state of computation between the single steps. */
+struct md4_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen;
+ uint32_t buffer[32];
+};
+
+
+/* Initialize structure containing state of computation. */
+extern void md4_init_ctx (struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void md4_process_block (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void md4_process_bytes (const void *buffer, size_t len,
+ struct md4_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *md4_finish_ctx (struct md4_ctx *ctx, void *restrict resbuf);
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *md4_read_ctx (const struct md4_ctx *ctx, void *restrict resbuf);
+
+
+/* Compute MD4 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int md4_stream (FILE * stream, void *resblock);
+
+/* Compute MD4 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *md4_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/lib/md5.c b/lib/md5.c
new file mode 100644
index 0000000..74cf2c3
--- /dev/null
+++ b/lib/md5.c
@@ -0,0 +1,489 @@
+/* Functions to compute MD5 message digest of files or memory blocks.
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995-1997, 1999-2001, 2005-2006, 2008-2020 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
+
+#include <config.h>
+
+#if HAVE_OPENSSL_MD5
+# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
+#endif
+#include "md5.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifdef _LIBC
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+/* We need to keep the namespace clean so define the MD5 function
+ protected using leading __ . */
+# define md5_init_ctx __md5_init_ctx
+# define md5_process_block __md5_process_block
+# define md5_process_bytes __md5_process_bytes
+# define md5_finish_ctx __md5_finish_ctx
+# define md5_read_ctx __md5_read_ctx
+# define md5_stream __md5_stream
+# define md5_buffer __md5_buffer
+#endif
+
+#include <byteswap.h>
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) bswap_32 (n)
+#else
+# define SWAP(n) (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+#if ! HAVE_OPENSSL_MD5
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (struct md5_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP (ctx->total[0] << 3);
+ ctx->buffer[size - 1] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, size * 4, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+#endif
+
+#if defined _LIBC || defined GL_COMPILE_CRYPTO_STREAM
+
+#include "af_alg.h"
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (FILE *stream, void *resblock)
+{
+ switch (afalg_stream (stream, "md5", resblock, MD5_DIGEST_SIZE))
+ {
+ case 0: return 0;
+ case -EIO: return 1;
+ }
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ struct md5_ctx ctx;
+ md5_init_ctx (&ctx);
+ size_t sum;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ /* Either process a partial fread() from this loop,
+ or the fread() in afalg_stream may have gotten EOF.
+ We need to avoid a subsequent fread() as EOF may
+ not be sticky. For details of such systems, see:
+ https://sourceware.org/bugzilla/show_bug.cgi?id=1190 */
+ if (feof (stream))
+ goto process_partial_block;
+
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+process_partial_block:
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+#endif
+
+#if ! HAVE_OPENSSL_MD5
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+
+
+void
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap,
+ because ctx->buflen < 64 ≤ (left_over + add) & ~63. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md5_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ /* The regions in the following copy operation cannot overlap,
+ because left_over ≤ 64. */
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
+{
+ uint32_t correct_words[16];
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t A = ctx->A;
+ uint32_t B = ctx->B;
+ uint32_t C = ctx->C;
+ uint32_t D = ctx->D;
+ uint32_t lolen = len;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += lolen;
+ ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ uint32_t *cwp = correct_words;
+ uint32_t A_save = A;
+ uint32_t B_save = B;
+ uint32_t C_save = C;
+ uint32_t D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+
+ Here is an equivalent invocation using Perl:
+
+ perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/md5.h b/lib/md5.h
new file mode 100644
index 0000000..c728ba1
--- /dev/null
+++ b/lib/md5.h
@@ -0,0 +1,147 @@
+/* Declaration of functions and data types used for MD5 sum computing
+ library functions.
+ Copyright (C) 1995-1997, 1999-2001, 2004-2006, 2008-2020 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <stdio.h>
+#include <stdint.h>
+
+# if HAVE_OPENSSL_MD5
+# include <openssl/md5.h>
+# endif
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_BLOCK_SIZE 64
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+# else
+# define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __THROW
+# if defined __cplusplus && (__GNUC_PREREQ (2,8) || __clang_major__ >= 4)
+# define __THROW throw ()
+# else
+# define __THROW
+# endif
+#endif
+
+#ifndef _LIBC
+# define __md5_buffer md5_buffer
+# define __md5_finish_ctx md5_finish_ctx
+# define __md5_init_ctx md5_init_ctx
+# define __md5_process_block md5_process_block
+# define __md5_process_bytes md5_process_bytes
+# define __md5_read_ctx md5_read_ctx
+# define __md5_stream md5_stream
+#endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if HAVE_OPENSSL_MD5
+# define GL_OPENSSL_NAME 5
+# include "gl_openssl.h"
+# else
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+
+ uint32_t total[2];
+ uint32_t buflen; /* ≥ 0, ≤ 128 */
+ uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions 'md5_stream' and 'md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void __md5_process_block (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void __md5_process_bytes (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *restrict resbuf)
+ __THROW;
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *restrict resbuf)
+ __THROW;
+
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *__md5_buffer (const char *buffer, size_t len,
+ void *restrict resblock) __THROW;
+
+# endif
+/* Compute MD5 message digest for bytes read from STREAM.
+ STREAM is an open file stream. Regular files are handled more efficiently.
+ The contents of STREAM from its current position to its end will be read.
+ The case that the last operation on STREAM was an 'ungetc' is not supported.
+ The resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int __md5_stream (FILE *stream, void *resblock) __THROW;
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* md5.h */
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/memchr.c b/lib/memchr.c
new file mode 100644
index 0000000..bff63da
--- /dev/null
+++ b/lib/memchr.c
@@ -0,0 +1,172 @@
+/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2020
+ Free Software Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+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 any
+later version.
+
+This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#include <stddef.h>
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# define reg_char char
+#endif
+
+#include <limits.h>
+
+#if HAVE_BP_SYM_H || defined _LIBC
+# include <bp-sym.h>
+#else
+# define BP_SYM(sym) sym
+#endif
+
+#undef __memchr
+#ifdef _LIBC
+# undef memchr
+#endif
+
+#ifndef weak_alias
+# define __memchr memchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n, ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ for (; n > 0; --n, ++char_ptr)
+ {
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memchr, BP_SYM (memchr))
+#endif
diff --git a/lib/memchr.valgrind b/lib/memchr.valgrind
new file mode 100644
index 0000000..f6dd209
--- /dev/null
+++ b/lib/memchr.valgrind
@@ -0,0 +1,30 @@
+# Suppress a valgrind message about use of uninitialized memory in memchr().
+
+# Copyright (C) 2009-2020 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/>.
+
+# POSIX states that when the character is found, memchr must not read extra
+# bytes in an overestimated length (for example, where memchr is used to
+# implement strnlen). However, we use a safe word read to provide a speedup.
+{
+ memchr-value4
+ Memcheck:Value4
+ fun:rpl_memchr
+}
+{
+ memchr-value8
+ Memcheck:Value8
+ fun:rpl_memchr
+}
diff --git a/lib/mempcpy.c b/lib/mempcpy.c
new file mode 100644
index 0000000..fe832d7
--- /dev/null
+++ b/lib/mempcpy.c
@@ -0,0 +1,28 @@
+/* Copy memory area and return pointer after last written byte.
+ Copyright (C) 2003, 2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+ return (char *) memcpy (dest, src, n) + n;
+}
diff --git a/lib/memrchr.c b/lib/memrchr.c
new file mode 100644
index 0000000..7ff32e1
--- /dev/null
+++ b/lib/memrchr.c
@@ -0,0 +1,161 @@
+/* memrchr -- find the last occurrence of a byte in a memory block
+
+ Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2020 Free Software
+ Foundation, Inc.
+
+ Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
+ with help from Dan Sahlin (dan@sics.se) and
+ commentary by Jim Blandy (jimb@ai.mit.edu);
+ adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
+ and implemented by Roland McGrath (roland@ai.mit.edu).
+
+ 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/>. */
+
+#if defined _LIBC
+# include <memcopy.h>
+#else
+# include <config.h>
+# define reg_char char
+#endif
+
+#include <string.h>
+#include <limits.h>
+
+#undef __memrchr
+#ifdef _LIBC
+# undef memrchr
+#endif
+
+#ifndef weak_alias
+# define __memrchr memrchr
+#endif
+
+/* Search no more than N bytes of S for C. */
+void *
+__memrchr (void const *s, int c_in, size_t n)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned reg_char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the last few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s + n;
+ n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
+ --n)
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const void *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will test a
+ longword at a time. The tricky part is testing if *any of the four*
+ bytes in the longword in question are equal to c. We first use an xor
+ with repeated_c. This reduces the task to testing whether *any of the
+ four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ So, the test whether any byte in longword1 is zero is equivalent to
+ testing whether tmp is nonzero. */
+
+ while (n >= sizeof (longword))
+ {
+ longword longword1 = *--longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ {
+ longword_ptr++;
+ break;
+ }
+ n -= sizeof (longword);
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that either n < sizeof (longword), or one of the
+ sizeof (longword) bytes starting at char_ptr is == c. On little-endian
+ machines, we could determine the first such byte without any further
+ memory accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines. Choose code
+ that works in both cases. */
+
+ while (n-- > 0)
+ {
+ if (*--char_ptr == c)
+ return (void *) char_ptr;
+ }
+
+ return NULL;
+}
+#ifdef weak_alias
+weak_alias (__memrchr, memrchr)
+#endif
diff --git a/lib/minmax.h b/lib/minmax.h
new file mode 100644
index 0000000..b947776
--- /dev/null
+++ b/lib/minmax.h
@@ -0,0 +1,60 @@
+/* MIN, MAX macros.
+ Copyright (C) 1995, 1998, 2001, 2003, 2005, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _MINMAX_H
+#define _MINMAX_H
+
+/* Note: MIN, MAX are also defined in <sys/param.h> on some systems
+ (glibc, IRIX, HP-UX, OSF/1). Therefore you might get warnings about
+ MIN, MAX macro redefinitions on some systems; the workaround is to
+ #include this file as the last one among the #include list. */
+
+/* Before we define the following symbols we get the <limits.h> file
+ since otherwise we get redefinitions on some systems if <limits.h> is
+ included after this file. Likewise for <sys/param.h>.
+ If more than one of these system headers define MIN and MAX, pick just
+ one of the headers (because the definitions most likely are the same). */
+#if HAVE_MINMAX_IN_LIMITS_H
+# include <limits.h>
+#elif HAVE_MINMAX_IN_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+/* Note: MIN and MAX should be used with two arguments of the
+ same type. They might not return the minimum and maximum of their two
+ arguments, if the arguments have different types or have unusual
+ floating-point values. For example, on a typical host with 32-bit 'int',
+ 64-bit 'long long', and 64-bit IEEE 754 'double' types:
+
+ MAX (-1, 2147483648) returns 4294967295.
+ MAX (9007199254740992.0, 9007199254740993) returns 9007199254740992.0.
+ MAX (NaN, 0.0) returns 0.0.
+ MAX (+0.0, -0.0) returns -0.0.
+
+ and in each case the answer is in some sense bogus. */
+
+/* MAX(a,b) returns the maximum of A and B. */
+#ifndef MAX
+# define MAX(a,b) ((a) > (b) ? (a) : (b))
+#endif
+
+/* MIN(a,b) returns the minimum of A and B. */
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#endif /* _MINMAX_H */
diff --git a/lib/mkdir.c b/lib/mkdir.c
new file mode 100644
index 0000000..386344f
--- /dev/null
+++ b/lib/mkdir.c
@@ -0,0 +1,93 @@
+/* On some systems, mkdir ("foo/", 0700) fails because of the trailing
+ slash. On those systems, this wrapper removes the trailing slash.
+
+ Copyright (C) 2001, 2003, 2006, 2008-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/stat.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "dirname.h"
+
+/* Disable the definition of mkdir to rpl_mkdir (from the <sys/stat.h>
+ substitute) in this file. Otherwise, we'd get an endless recursion. */
+#undef mkdir
+
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
+ which are included in the <sys/stat.h> override. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# define mkdir(name,mode) _mkdir (name)
+# define maybe_unused _GL_UNUSED
+#else
+# define maybe_unused /* empty */
+#endif
+
+/* This function is required at least for NetBSD 1.5.2. */
+
+int
+rpl_mkdir (char const *dir, mode_t mode maybe_unused)
+{
+ int ret_val;
+ char *tmp_dir;
+ size_t len = strlen (dir);
+
+ if (len && dir[len - 1] == '/')
+ {
+ tmp_dir = strdup (dir);
+ if (!tmp_dir)
+ {
+ /* Rather than rely on strdup-posix, we set errno ourselves. */
+ errno = ENOMEM;
+ return -1;
+ }
+ strip_trailing_slashes (tmp_dir);
+ }
+ else
+ {
+ tmp_dir = (char *) dir;
+ }
+#if FUNC_MKDIR_DOT_BUG
+ /* Additionally, cygwin 1.5 mistakenly creates a directory "d/./". */
+ {
+ char *last = last_component (tmp_dir);
+ if (*last == '.' && (last[1] == '\0'
+ || (last[1] == '.' && last[2] == '\0')))
+ {
+ struct stat st;
+ if (stat (tmp_dir, &st) == 0 || errno == EOVERFLOW)
+ errno = EEXIST;
+ return -1;
+ }
+ }
+#endif /* FUNC_MKDIR_DOT_BUG */
+
+ ret_val = mkdir (tmp_dir, mode);
+
+ if (tmp_dir != dir)
+ free (tmp_dir);
+
+ return ret_val;
+}
diff --git a/lib/mkostemp.c b/lib/mkostemp.c
new file mode 100644
index 0000000..46b58e1
--- /dev/null
+++ b/lib/mkostemp.c
@@ -0,0 +1,46 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2020 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GTFILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd. */
+int
+mkostemp (char *xtemplate, int flags)
+{
+ return __gen_tempname (xtemplate, 0, flags, __GT_FILE);
+}
diff --git a/lib/mkstemp.c b/lib/mkstemp.c
new file mode 100644
index 0000000..c809de8
--- /dev/null
+++ b/lib/mkstemp.c
@@ -0,0 +1,50 @@
+/* Copyright (C) 1998-1999, 2001, 2005-2007, 2009-2020 Free Software
+ Foundation, Inc.
+ This file is derived from the one in the GNU C Library.
+
+ 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/>. */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#if !_LIBC
+# include "tempname.h"
+# define __gen_tempname gen_tempname
+# ifndef __GT_FILE
+# define __GT_FILE GT_FILE
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifndef __GT_FILE
+# define __GT_FILE 0
+#endif
+
+/* Generate a unique temporary file name from XTEMPLATE.
+ The last six characters of XTEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ Then open the file and return a fd.
+
+ If you are creating temporary files which will later be removed,
+ consider using the clean-temp module, which avoids several pitfalls
+ of using mkstemp directly. */
+int
+mkstemp (char *xtemplate)
+{
+ return __gen_tempname (xtemplate, 0, 0, __GT_FILE);
+}
diff --git a/lib/mktime-internal.h b/lib/mktime-internal.h
new file mode 100644
index 0000000..b765a37
--- /dev/null
+++ b/lib/mktime-internal.h
@@ -0,0 +1,79 @@
+/* Internals of mktime and related functions
+ Copyright 2016-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Paul Eggert <eggert@cs.ucla.edu>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <time.h>
+#endif
+
+/* mktime_offset_t is a signed type wide enough to hold a UTC offset
+ in seconds, and used as part of the type of the offset-guess
+ argument to mktime_internal. In Glibc, it is always long int.
+ When in Gnulib, use time_t on platforms where time_t
+ is signed, to be compatible with platforms like BeOS that export
+ this implementation detail of mktime. On platforms where time_t is
+ unsigned, GNU and POSIX code can assume 'int' is at least 32 bits
+ which is wide enough for a UTC offset. */
+#ifdef _LIBC
+typedef long int mktime_offset_t;
+#elif defined TIME_T_IS_SIGNED
+typedef time_t mktime_offset_t;
+#else
+typedef int mktime_offset_t;
+#endif
+
+/* The source code uses identifiers like __time64_t for glibc
+ timestamps that can contain 64-bit values even when time_t is only
+ 32 bits. These are just macros for the ordinary identifiers unless
+ compiling within glibc when time_t is 32 bits. */
+#if ! (defined _LIBC && __TIMESIZE != 64)
+# undef __time64_t
+# define __time64_t time_t
+# define __gmtime64_r __gmtime_r
+# define __localtime64_r __localtime_r
+# define __mktime64 mktime
+# define __timegm64 timegm
+#endif
+
+#ifndef _LIBC
+
+/* Although glibc source code uses leading underscores, Gnulib wants
+ ordinary names.
+
+ Portable standalone applications should supply a <time.h> that
+ declares a POSIX-compliant localtime_r, for the benefit of older
+ implementations that lack localtime_r or have a nonstandard one.
+ Similarly for gmtime_r. See the gnulib time_r module for one way
+ to implement this. */
+
+# undef __gmtime_r
+# undef __localtime_r
+# define __gmtime_r gmtime_r
+# define __localtime_r localtime_r
+
+# define __mktime_internal mktime_internal
+
+#endif
+
+/* Subroutine of mktime. Return the time_t representation of TP and
+ normalize TP, given that a struct tm * maps to a time_t as performed
+ by FUNC. Record next guess for localtime-gmtime offset in *OFFSET. */
+extern __time64_t __mktime_internal (struct tm *tp,
+ struct tm *(*func) (__time64_t const *,
+ struct tm *),
+ mktime_offset_t *offset) attribute_hidden;
diff --git a/lib/mktime.c b/lib/mktime.c
new file mode 100644
index 0000000..5b4c144
--- /dev/null
+++ b/lib/mktime.c
@@ -0,0 +1,566 @@
+/* Convert a 'struct tm' to a time_t value.
+ Copyright (C) 1993-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Paul Eggert <eggert@twinsun.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* The following macros influence what gets defined when this file is compiled:
+
+ Macro/expression Which gnulib module This compilation unit
+ should define
+
+ _LIBC (glibc proper) mktime
+
+ NEED_MKTIME_WORKING mktime rpl_mktime
+ || NEED_MKTIME_WINDOWS
+
+ NEED_MKTIME_INTERNAL mktime-internal mktime_internal
+ */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+/* Assume that leap seconds are possible, unless told otherwise.
+ If the host has a 'zic' command with a '-L leapsecondfilename' option,
+ then it supports leap seconds; otherwise it probably doesn't. */
+#ifndef LEAP_SECONDS_POSSIBLE
+# define LEAP_SECONDS_POSSIBLE 1
+#endif
+
+#include <time.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <intprops.h>
+#include <verify.h>
+
+#ifndef NEED_MKTIME_INTERNAL
+# define NEED_MKTIME_INTERNAL 0
+#endif
+#ifndef NEED_MKTIME_WINDOWS
+# define NEED_MKTIME_WINDOWS 0
+#endif
+#ifndef NEED_MKTIME_WORKING
+# define NEED_MKTIME_WORKING 0
+#endif
+
+#include "mktime-internal.h"
+
+#if !defined _LIBC && (NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS)
+static void
+my_tzset (void)
+{
+# if NEED_MKTIME_WINDOWS
+ /* Rectify the value of the environment variable TZ.
+ There are four possible kinds of such values:
+ - Traditional US time zone names, e.g. "PST8PDT". Syntax: see
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tzset>
+ - Time zone names based on geography, that contain one or more
+ slashes, e.g. "Europe/Moscow".
+ - Time zone names based on geography, without slashes, e.g.
+ "Singapore".
+ - Time zone names that contain explicit DST rules. Syntax: see
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03>
+ The Microsoft CRT understands only the first kind. It produces incorrect
+ results if the value of TZ is of the other kinds.
+ But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value
+ of the second kind for most geographies, or of the first kind in a few
+ other geographies. If it is of the second kind, neutralize it. For the
+ Microsoft CRT, an absent or empty TZ means the time zone that the user
+ has set in the Windows Control Panel.
+ If the value of TZ is of the third or fourth kind -- Cygwin programs
+ understand these syntaxes as well --, it does not matter whether we
+ neutralize it or not, since these values occur only when a Cygwin user
+ has set TZ explicitly; this case is 1. rare and 2. under the user's
+ responsibility. */
+ const char *tz = getenv ("TZ");
+ if (tz != NULL && strchr (tz, '/') != NULL)
+ _putenv ("TZ=");
+# else
+ tzset ();
+# endif
+}
+# undef __tzset
+# define __tzset() my_tzset ()
+#endif
+
+#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL
+
+/* A signed type that can represent an integer number of years
+ multiplied by four times the number of seconds in a year. It is
+ needed when converting a tm_year value times the number of seconds
+ in a year. The factor of four comes because these products need
+ to be subtracted from each other, and sometimes with an offset
+ added to them, and then with another timestamp added, without
+ worrying about overflow.
+
+ Much of the code uses long_int to represent __time64_t values, to
+ lessen the hassle of dealing with platforms where __time64_t is
+ unsigned, and because long_int should suffice to represent all
+ __time64_t values that mktime can generate even on platforms where
+ __time64_t is wider than the int components of struct tm. */
+
+#if INT_MAX <= LONG_MAX / 4 / 366 / 24 / 60 / 60
+typedef long int long_int;
+#else
+typedef long long int long_int;
+#endif
+verify (INT_MAX <= TYPE_MAXIMUM (long_int) / 4 / 366 / 24 / 60 / 60);
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+ truncating towards minus infinity. B should be in the range 0 <= B
+ <= LONG_INT_BITS - 2, where LONG_INT_BITS is the number of useful
+ bits in a long_int. LONG_INT_BITS is at least 32.
+
+ ISO C99 says that A >> B is implementation-defined if A < 0. Some
+ implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+ right in the usual way when A < 0, so SHR falls back on division if
+ ordinary A >> B doesn't seem to be the usual signed shift. */
+
+static long_int
+shr (long_int a, int b)
+{
+ long_int one = 1;
+ return (-one >> 1 == -1
+ ? a >> b
+ : (a + (a < 0)) / (one << b) - (a < 0));
+}
+
+/* Bounds for the intersection of __time64_t and long_int. */
+
+static long_int const mktime_min
+ = ((TYPE_SIGNED (__time64_t)
+ && TYPE_MINIMUM (__time64_t) < TYPE_MINIMUM (long_int))
+ ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (__time64_t));
+static long_int const mktime_max
+ = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (__time64_t)
+ ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (__time64_t));
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+verify (TM_YEAR_BASE % 100 == 0);
+
+/* Is YEAR + TM_YEAR_BASE a leap year? */
+static bool
+leapyear (long_int year)
+{
+ /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
+ Also, work even if YEAR is negative. */
+ return
+ ((year & 3) == 0
+ && (year % 100 != 0
+ || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
+}
+
+/* How many days come before each month (0-12). */
+#ifndef _LIBC
+static
+#endif
+const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+
+
+/* Do the values A and B differ according to the rules for tm_isdst?
+ A and B differ if one is zero and the other positive. */
+static bool
+isdst_differ (int a, int b)
+{
+ return (!a != !b) && (0 <= a) && (0 <= b);
+}
+
+/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
+ (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
+ were not adjusted between the timestamps.
+
+ The YEAR values uses the same numbering as TP->tm_year. Values
+ need not be in the usual range. However, YEAR1 - YEAR0 must not
+ overflow even when multiplied by three times the number of seconds
+ in a year, and likewise for YDAY1 - YDAY0 and three times the
+ number of seconds in a day. */
+
+static long_int
+ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1,
+ int year0, int yday0, int hour0, int min0, int sec0)
+{
+ verify (-1 / 2 == 0);
+
+ /* Compute intervening leap days correctly even if year is negative.
+ Take care to avoid integer overflow here. */
+ int a4 = shr (year1, 2) + shr (TM_YEAR_BASE, 2) - ! (year1 & 3);
+ int b4 = shr (year0, 2) + shr (TM_YEAR_BASE, 2) - ! (year0 & 3);
+ int a100 = (a4 + (a4 < 0)) / 25 - (a4 < 0);
+ int b100 = (b4 + (b4 < 0)) / 25 - (b4 < 0);
+ int a400 = shr (a100, 2);
+ int b400 = shr (b100, 2);
+ int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+
+ /* Compute the desired time without overflowing. */
+ long_int years = year1 - year0;
+ long_int days = 365 * years + yday1 - yday0 + intervening_leap_days;
+ long_int hours = 24 * days + hour1 - hour0;
+ long_int minutes = 60 * hours + min1 - min0;
+ long_int seconds = 60 * minutes + sec1 - sec0;
+ return seconds;
+}
+
+/* Return the average of A and B, even if A + B would overflow.
+ Round toward positive infinity. */
+static long_int
+long_int_avg (long_int a, long_int b)
+{
+ return shr (a, 1) + shr (b, 1) + ((a | b) & 1);
+}
+
+/* Return a long_int value corresponding to (YEAR-YDAY HOUR:MIN:SEC)
+ minus *TP seconds, assuming no clock adjustments occurred between
+ the two timestamps.
+
+ YEAR and YDAY must not be so large that multiplying them by three times the
+ number of seconds in a year (or day, respectively) would overflow long_int.
+ *TP should be in the usual range. */
+static long_int
+tm_diff (long_int year, long_int yday, int hour, int min, int sec,
+ struct tm const *tp)
+{
+ return ydhms_diff (year, yday, hour, min, sec,
+ tp->tm_year, tp->tm_yday,
+ tp->tm_hour, tp->tm_min, tp->tm_sec);
+}
+
+/* Use CONVERT to convert T to a struct tm value in *TM. T must be in
+ range for __time64_t. Return TM if successful, NULL (setting errno) on
+ failure. */
+static struct tm *
+convert_time (struct tm *(*convert) (const __time64_t *, struct tm *),
+ long_int t, struct tm *tm)
+{
+ __time64_t x = t;
+ return convert (&x, tm);
+}
+
+/* Use CONVERT to convert *T to a broken down time in *TP.
+ If *T is out of range for conversion, adjust it so that
+ it is the nearest in-range value and then convert that.
+ A value is in range if it fits in both __time64_t and long_int.
+ Return TP on success, NULL (setting errno) on failure. */
+static struct tm *
+ranged_convert (struct tm *(*convert) (const __time64_t *, struct tm *),
+ long_int *t, struct tm *tp)
+{
+ long_int t1 = (*t < mktime_min ? mktime_min
+ : *t <= mktime_max ? *t : mktime_max);
+ struct tm *r = convert_time (convert, t1, tp);
+ if (r)
+ {
+ *t = t1;
+ return r;
+ }
+ if (errno != EOVERFLOW)
+ return NULL;
+
+ long_int bad = t1;
+ long_int ok = 0;
+ struct tm oktm; oktm.tm_sec = -1;
+
+ /* BAD is a known out-of-range value, and OK is a known in-range one.
+ Use binary search to narrow the range between BAD and OK until
+ they differ by 1. */
+ while (true)
+ {
+ long_int mid = long_int_avg (ok, bad);
+ if (mid == ok || mid == bad)
+ break;
+ if (convert_time (convert, mid, tp))
+ ok = mid, oktm = *tp;
+ else if (errno != EOVERFLOW)
+ return NULL;
+ else
+ bad = mid;
+ }
+
+ if (oktm.tm_sec < 0)
+ return NULL;
+ *t = ok;
+ *tp = oktm;
+ return tp;
+}
+
+
+/* Convert *TP to a __time64_t value, inverting
+ the monotonic and mostly-unit-linear conversion function CONVERT.
+ Use *OFFSET to keep track of a guess at the offset of the result,
+ compared to what the result would be for UTC without leap seconds.
+ If *OFFSET's guess is correct, only one CONVERT call is needed.
+ If successful, set *TP to the canonicalized struct tm;
+ otherwise leave *TP alone, return ((time_t) -1) and set errno.
+ This function is external because it is used also by timegm.c. */
+__time64_t
+__mktime_internal (struct tm *tp,
+ struct tm *(*convert) (const __time64_t *, struct tm *),
+ mktime_offset_t *offset)
+{
+ struct tm tm;
+
+ /* The maximum number of probes (calls to CONVERT) should be enough
+ to handle any combinations of time zone rule changes, solar time,
+ leap seconds, and oscillations around a spring-forward gap.
+ POSIX.1 prohibits leap seconds, but some hosts have them anyway. */
+ int remaining_probes = 6;
+
+ /* Time requested. Copy it in case CONVERT modifies *TP; this can
+ occur if TP is localtime's returned value and CONVERT is localtime. */
+ int sec = tp->tm_sec;
+ int min = tp->tm_min;
+ int hour = tp->tm_hour;
+ int mday = tp->tm_mday;
+ int mon = tp->tm_mon;
+ int year_requested = tp->tm_year;
+ int isdst = tp->tm_isdst;
+
+ /* 1 if the previous probe was DST. */
+ int dst2 = 0;
+
+ /* Ensure that mon is in range, and set year accordingly. */
+ int mon_remainder = mon % 12;
+ int negative_mon_remainder = mon_remainder < 0;
+ int mon_years = mon / 12 - negative_mon_remainder;
+ long_int lyear_requested = year_requested;
+ long_int year = lyear_requested + mon_years;
+
+ /* The other values need not be in range:
+ the remaining code handles overflows correctly. */
+
+ /* Calculate day of year from year, month, and day of month.
+ The result need not be in range. */
+ int mon_yday = ((__mon_yday[leapyear (year)]
+ [mon_remainder + 12 * negative_mon_remainder])
+ - 1);
+ long_int lmday = mday;
+ long_int yday = mon_yday + lmday;
+
+ mktime_offset_t off = *offset;
+ int negative_offset_guess;
+
+ int sec_requested = sec;
+
+ if (LEAP_SECONDS_POSSIBLE)
+ {
+ /* Handle out-of-range seconds specially,
+ since ydhms_diff assumes every minute has 60 seconds. */
+ if (sec < 0)
+ sec = 0;
+ if (59 < sec)
+ sec = 59;
+ }
+
+ /* Invert CONVERT by probing. First assume the same offset as last
+ time. */
+
+ INT_SUBTRACT_WRAPV (0, off, &negative_offset_guess);
+ long_int t0 = ydhms_diff (year, yday, hour, min, sec,
+ EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0,
+ negative_offset_guess);
+ long_int t = t0, t1 = t0, t2 = t0;
+
+ /* Repeatedly use the error to improve the guess. */
+
+ while (true)
+ {
+ if (! ranged_convert (convert, &t, &tm))
+ return -1;
+ long_int dt = tm_diff (year, yday, hour, min, sec, &tm);
+ if (dt == 0)
+ break;
+
+ if (t == t1 && t != t2
+ && (tm.tm_isdst < 0
+ || (isdst < 0
+ ? dst2 <= (tm.tm_isdst != 0)
+ : (isdst != 0) != (tm.tm_isdst != 0))))
+ /* We can't possibly find a match, as we are oscillating
+ between two values. The requested time probably falls
+ within a spring-forward gap of size DT. Follow the common
+ practice in this case, which is to return a time that is DT
+ away from the requested time, preferring a time whose
+ tm_isdst differs from the requested value. (If no tm_isdst
+ was requested and only one of the two values has a nonzero
+ tm_isdst, prefer that value.) In practice, this is more
+ useful than returning -1. */
+ goto offset_found;
+
+ remaining_probes--;
+ if (remaining_probes == 0)
+ {
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+
+ t1 = t2, t2 = t, t += dt, dst2 = tm.tm_isdst != 0;
+ }
+
+ /* We have a match. Check whether tm.tm_isdst has the requested
+ value, if any. */
+ if (isdst_differ (isdst, tm.tm_isdst))
+ {
+ /* tm.tm_isdst has the wrong value. Look for a neighboring
+ time with the right value, and use its UTC offset.
+
+ Heuristic: probe the adjacent timestamps in both directions,
+ looking for the desired isdst. This should work for all real
+ time zone histories in the tz database. */
+
+ /* Distance between probes when looking for a DST boundary. In
+ tzdata2003a, the shortest period of DST is 601200 seconds
+ (e.g., America/Recife starting 2000-10-08 01:00), and the
+ shortest period of non-DST surrounded by DST is 694800
+ seconds (Africa/Tunis starting 1943-04-17 01:00). Use the
+ minimum of these two values, so we don't miss these short
+ periods when probing. */
+ int stride = 601200;
+
+ /* The longest period of DST in tzdata2003a is 536454000 seconds
+ (e.g., America/Jujuy starting 1946-10-01 01:00). The longest
+ period of non-DST is much longer, but it makes no real sense
+ to search for more than a year of non-DST, so use the DST
+ max. */
+ int duration_max = 536454000;
+
+ /* Search in both directions, so the maximum distance is half
+ the duration; add the stride to avoid off-by-1 problems. */
+ int delta_bound = duration_max / 2 + stride;
+
+ int delta, direction;
+
+ for (delta = stride; delta < delta_bound; delta += stride)
+ for (direction = -1; direction <= 1; direction += 2)
+ {
+ long_int ot;
+ if (! INT_ADD_WRAPV (t, delta * direction, &ot))
+ {
+ struct tm otm;
+ if (! ranged_convert (convert, &ot, &otm))
+ return -1;
+ if (! isdst_differ (isdst, otm.tm_isdst))
+ {
+ /* We found the desired tm_isdst.
+ Extrapolate back to the desired time. */
+ long_int gt = ot + tm_diff (year, yday, hour, min, sec,
+ &otm);
+ if (mktime_min <= gt && gt <= mktime_max)
+ {
+ if (convert_time (convert, gt, &tm))
+ {
+ t = gt;
+ goto offset_found;
+ }
+ if (errno != EOVERFLOW)
+ return -1;
+ }
+ }
+ }
+ }
+
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+
+ offset_found:
+ /* Set *OFFSET to the low-order bits of T - T0 - NEGATIVE_OFFSET_GUESS.
+ This is just a heuristic to speed up the next mktime call, and
+ correctness is unaffected if integer overflow occurs here. */
+ INT_SUBTRACT_WRAPV (t, t0, offset);
+ INT_SUBTRACT_WRAPV (*offset, negative_offset_guess, offset);
+
+ if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
+ {
+ /* Adjust time to reflect the tm_sec requested, not the normalized value.
+ Also, repair any damage from a false match due to a leap second. */
+ long_int sec_adjustment = sec == 0 && tm.tm_sec == 60;
+ sec_adjustment -= sec;
+ sec_adjustment += sec_requested;
+ if (INT_ADD_WRAPV (t, sec_adjustment, &t)
+ || ! (mktime_min <= t && t <= mktime_max))
+ {
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+ if (! convert_time (convert, t, &tm))
+ return -1;
+ }
+
+ *tp = tm;
+ return t;
+}
+
+#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL */
+
+#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS
+
+/* Convert *TP to a __time64_t value. */
+__time64_t
+__mktime64 (struct tm *tp)
+{
+ /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
+ time zone names contained in the external variable 'tzname' shall
+ be set as if the tzset() function had been called. */
+ __tzset ();
+
+# if defined _LIBC || NEED_MKTIME_WORKING
+ static mktime_offset_t localtime_offset;
+ return __mktime_internal (tp, __localtime64_r, &localtime_offset);
+# else
+# undef mktime
+ return mktime (tp);
+# endif
+}
+#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */
+
+#if defined _LIBC && __TIMESIZE != 64
+
+libc_hidden_def (__mktime64)
+
+time_t
+mktime (struct tm *tp)
+{
+ struct tm tm = *tp;
+ __time64_t t = __mktime64 (&tm);
+ if (in_time_t_range (t))
+ {
+ *tp = tm;
+ return t;
+ }
+ else
+ {
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+}
+
+#endif
+
+weak_alias (mktime, timelocal)
+libc_hidden_def (mktime)
+libc_hidden_weak (timelocal)
diff --git a/lib/msvc-inval.c b/lib/msvc-inval.c
new file mode 100644
index 0000000..8636688
--- /dev/null
+++ b/lib/msvc-inval.c
@@ -0,0 +1,129 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "msvc-inval.h"
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+
+/* Get _invalid_parameter_handler type and _set_invalid_parameter_handler
+ declaration. */
+# include <stdlib.h>
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+}
+
+# else
+
+/* Get declarations of the native Windows API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# if defined _MSC_VER
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+# else
+
+/* An index to thread-local storage. */
+static DWORD tls_index;
+static int tls_initialized /* = 0 */;
+
+/* Used as a fallback only. */
+static struct gl_msvc_inval_per_thread not_per_thread;
+
+struct gl_msvc_inval_per_thread *
+gl_msvc_inval_current (void)
+{
+ if (!tls_initialized)
+ {
+ tls_index = TlsAlloc ();
+ tls_initialized = 1;
+ }
+ if (tls_index == TLS_OUT_OF_INDEXES)
+ /* TlsAlloc had failed. */
+ return &not_per_thread;
+ else
+ {
+ struct gl_msvc_inval_per_thread *pointer =
+ (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index);
+ if (pointer == NULL)
+ {
+ /* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */
+ pointer =
+ (struct gl_msvc_inval_per_thread *)
+ malloc (sizeof (struct gl_msvc_inval_per_thread));
+ if (pointer == NULL)
+ /* Could not allocate memory. Use the global storage. */
+ pointer = &not_per_thread;
+ TlsSetValue (tls_index, pointer);
+ }
+ return pointer;
+ }
+}
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file,
+ unsigned int line,
+ uintptr_t dummy)
+{
+ struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current ();
+ if (current->restart_valid)
+ longjmp (current->restart, 1);
+ else
+ /* An invalid parameter notification from outside the gnulib code.
+ Give the caller a chance to intervene. */
+ RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+# endif
+
+# endif
+
+static int gl_msvc_inval_initialized /* = 0 */;
+
+void
+gl_msvc_inval_ensure_handler (void)
+{
+ if (gl_msvc_inval_initialized == 0)
+ {
+ _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
+ gl_msvc_inval_initialized = 1;
+ }
+}
+
+#endif
diff --git a/lib/msvc-inval.h b/lib/msvc-inval.h
new file mode 100644
index 0000000..93ee785
--- /dev/null
+++ b/lib/msvc-inval.h
@@ -0,0 +1,222 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _MSVC_INVAL_H
+#define _MSVC_INVAL_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+ functions like fprintf(), dup2(), or close() crash when the caller passes
+ an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
+ instead.
+ This file defines macros that turn such an invalid parameter notification
+ into a non-local exit. An error code can then be produced at the target
+ of this exit. You can thus write code like
+
+ TRY_MSVC_INVAL
+ {
+ <Code that can trigger an invalid parameter notification
+ but does not do 'return', 'break', 'continue', nor 'goto'.>
+ }
+ CATCH_MSVC_INVAL
+ {
+ <Code that handles an invalid parameter notification
+ but does not do 'return', 'break', 'continue', nor 'goto'.>
+ }
+ DONE_MSVC_INVAL;
+
+ This entire block expands to a single statement.
+
+ The handling of invalid parameters can be done in three ways:
+
+ * The default way, which is reasonable for programs (not libraries):
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING])
+
+ * The way for libraries that make "hairy" calls (like close(-1), or
+ fclose(fp) where fileno(fp) is closed, or simply getdtablesize()):
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING])
+
+ * The way for libraries that make no "hairy" calls:
+ AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING])
+ */
+
+#define DEFAULT_HANDLING 0
+#define HAIRY_LIBRARY_HANDLING 1
+#define SANE_LIBRARY_HANDLING 2
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+ && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+/* A native Windows platform with the "invalid parameter handler" concept,
+ and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+/* Default handling. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Ensure that the invalid parameter handler in installed that just returns.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ gl_msvc_inval_ensure_handler (); \
+ if (1)
+# define CATCH_MSVC_INVAL \
+ else
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+# else
+/* Handling for hairy libraries. */
+
+# include <excpt.h>
+
+/* Gnulib can define its own status codes, as described in the page
+ "Raising Software Exceptions" on microsoft.com
+ <https://docs.microsoft.com/en-us/cpp/cpp/raising-software-exceptions>.
+ Our status codes are composed of
+ - 0xE0000000, mandatory for all user-defined status codes,
+ - 0x474E550, a API identifier ("GNU"),
+ - 0, 1, 2, ..., used to distinguish different status codes from the
+ same API. */
+# define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0)
+
+# if defined _MSC_VER
+/* A compiler that supports __try/__except, as described in the page
+ "try-except statement" on microsoft.com
+ <https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement>.
+ With __try/__except, we can use the multithread-safe exception handling. */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/* Ensure that the invalid parameter handler in installed that raises a
+ software exception with code STATUS_GNULIB_INVALID_PARAMETER.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ gl_msvc_inval_ensure_handler (); \
+ __try
+# define CATCH_MSVC_INVAL \
+ __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \
+ ? EXCEPTION_EXECUTE_HANDLER \
+ : EXCEPTION_CONTINUE_SEARCH)
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+# else
+/* Any compiler.
+ We can only use setjmp/longjmp. */
+
+# include <setjmp.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+struct gl_msvc_inval_per_thread
+{
+ /* The restart that will resume execution at the code between
+ CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between
+ TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */
+ jmp_buf restart;
+
+ /* Tells whether the contents of restart is valid. */
+ int restart_valid;
+};
+
+/* Ensure that the invalid parameter handler in installed that passes
+ control to the gl_msvc_inval_restart if it is valid, or raises a
+ software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise.
+ Because we assume no other part of the program installs a different
+ invalid parameter handler, this solution is multithread-safe. */
+extern void gl_msvc_inval_ensure_handler (void);
+
+/* Return a pointer to the per-thread data for the current thread. */
+extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ struct gl_msvc_inval_per_thread *msvc_inval_current; \
+ gl_msvc_inval_ensure_handler (); \
+ msvc_inval_current = gl_msvc_inval_current (); \
+ /* First, initialize gl_msvc_inval_restart. */ \
+ if (setjmp (msvc_inval_current->restart) == 0) \
+ { \
+ /* Then, mark it as valid. */ \
+ msvc_inval_current->restart_valid = 1;
+# define CATCH_MSVC_INVAL \
+ /* Execution completed. \
+ Mark gl_msvc_inval_restart as invalid. */ \
+ msvc_inval_current->restart_valid = 0; \
+ } \
+ else \
+ { \
+ /* Execution triggered an invalid parameter notification. \
+ Mark gl_msvc_inval_restart as invalid. */ \
+ msvc_inval_current->restart_valid = 0;
+# define DONE_MSVC_INVAL \
+ } \
+ } \
+ while (0)
+
+# endif
+
+# endif
+
+#else
+/* A platform that does not need to the invalid parameter handler,
+ or when SANE_LIBRARY_HANDLING is desired. */
+
+/* The braces here avoid GCC warnings like
+ "warning: suggest explicit braces to avoid ambiguous 'else'". */
+# define TRY_MSVC_INVAL \
+ do \
+ { \
+ if (1)
+# define CATCH_MSVC_INVAL \
+ else
+# define DONE_MSVC_INVAL \
+ } \
+ while (0)
+
+#endif
+
+#endif /* _MSVC_INVAL_H */
diff --git a/lib/msvc-nothrow.c b/lib/msvc-nothrow.c
new file mode 100644
index 0000000..bf93b88
--- /dev/null
+++ b/lib/msvc-nothrow.c
@@ -0,0 +1,51 @@
+/* Wrappers that don't throw invalid parameter notifications
+ with MSVC runtime libraries.
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "msvc-nothrow.h"
+
+/* Get declarations of the native Windows API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef _get_osfhandle
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+intptr_t
+_gl_nothrow_get_osfhandle (int fd)
+{
+ intptr_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _get_osfhandle (fd);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = (intptr_t) INVALID_HANDLE_VALUE;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#endif
diff --git a/lib/msvc-nothrow.h b/lib/msvc-nothrow.h
new file mode 100644
index 0000000..fca5415
--- /dev/null
+++ b/lib/msvc-nothrow.h
@@ -0,0 +1,43 @@
+/* Wrappers that don't throw invalid parameter notifications
+ with MSVC runtime libraries.
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _MSVC_NOTHROW_H
+#define _MSVC_NOTHROW_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+ functions like fprintf(), dup2(), or close() crash when the caller passes
+ an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
+ instead.
+ This file defines wrappers that turn such an invalid parameter notification
+ into an error code. */
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Get original declaration of _get_osfhandle. */
+# include <io.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Override _get_osfhandle. */
+extern intptr_t _gl_nothrow_get_osfhandle (int fd);
+# define _get_osfhandle _gl_nothrow_get_osfhandle
+
+# endif
+
+#endif
+
+#endif /* _MSVC_NOTHROW_H */
diff --git a/lib/nanosleep.c b/lib/nanosleep.c
new file mode 100644
index 0000000..123c66b
--- /dev/null
+++ b/lib/nanosleep.c
@@ -0,0 +1,276 @@
+/* Provide a replacement for the POSIX nanosleep function.
+
+ Copyright (C) 1999-2000, 2002, 2004-2020 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/>. */
+
+/* written by Jim Meyering
+ and Bruno Haible for the native Windows part */
+
+#include <config.h>
+
+#include <time.h>
+
+#include "intprops.h"
+#include "sig-handler.h"
+#include "verify.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/select.h>
+#include <signal.h>
+
+#include <sys/time.h>
+#include <errno.h>
+
+#include <unistd.h>
+
+
+enum { BILLION = 1000 * 1000 * 1000 };
+
+#if HAVE_BUG_BIG_NANOSLEEP
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+# undef nanosleep
+{
+ /* nanosleep mishandles large sleeps due to internal overflow problems.
+ The worst known case of this is Linux 2.6.9 with glibc 2.3.4, which
+ can't sleep more than 24.85 days (2^31 milliseconds). Similarly,
+ cygwin 1.5.x, which can't sleep more than 49.7 days (2^32 milliseconds).
+ Solve this by breaking the sleep up into smaller chunks. */
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ {
+ /* Verify that time_t is large enough. */
+ verify (TYPE_MAXIMUM (time_t) / 24 / 24 / 60 / 60);
+ const time_t limit = 24 * 24 * 60 * 60;
+ time_t seconds = requested_delay->tv_sec;
+ struct timespec intermediate;
+ intermediate.tv_nsec = requested_delay->tv_nsec;
+
+ while (limit < seconds)
+ {
+ int result;
+ intermediate.tv_sec = limit;
+ result = nanosleep (&intermediate, remaining_delay);
+ seconds -= limit;
+ if (result)
+ {
+ if (remaining_delay)
+ remaining_delay->tv_sec += seconds;
+ return result;
+ }
+ intermediate.tv_nsec = 0;
+ }
+ intermediate.tv_sec = seconds;
+ return nanosleep (&intermediate, remaining_delay);
+ }
+}
+
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows platforms. */
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* The Windows API function Sleep() has a resolution of about 15 ms and takes
+ at least 5 ms to execute. We use this function for longer time periods.
+ Additionally, we use busy-looping over short time periods, to get a
+ resolution of about 0.01 ms. In order to measure such short timespans,
+ we use the QueryPerformanceCounter() function. */
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ static bool initialized;
+ /* Number of performance counter increments per nanosecond,
+ or zero if it could not be determined. */
+ static double ticks_per_nanosecond;
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* For requested delays of one second or more, 15ms resolution is
+ sufficient. */
+ if (requested_delay->tv_sec == 0)
+ {
+ if (!initialized)
+ {
+ /* Initialize ticks_per_nanosecond. */
+ LARGE_INTEGER ticks_per_second;
+
+ if (QueryPerformanceFrequency (&ticks_per_second))
+ ticks_per_nanosecond =
+ (double) ticks_per_second.QuadPart / 1000000000.0;
+
+ initialized = true;
+ }
+ if (ticks_per_nanosecond)
+ {
+ /* QueryPerformanceFrequency worked. We can use
+ QueryPerformanceCounter. Use a combination of Sleep and
+ busy-looping. */
+ /* Number of milliseconds to pass to the Sleep function.
+ Since Sleep can take up to 8 ms less or 8 ms more than requested
+ (or maybe more if the system is loaded), we subtract 10 ms. */
+ int sleep_millis = (int) requested_delay->tv_nsec / 1000000 - 10;
+ /* Determine how many ticks to delay. */
+ LONGLONG wait_ticks = requested_delay->tv_nsec * ticks_per_nanosecond;
+ /* Start. */
+ LARGE_INTEGER counter_before;
+ if (QueryPerformanceCounter (&counter_before))
+ {
+ /* Wait until the performance counter has reached this value.
+ We don't need to worry about overflow, because the performance
+ counter is reset at reboot, and with a frequency of 3.6E6
+ ticks per second 63 bits suffice for over 80000 years. */
+ LONGLONG wait_until = counter_before.QuadPart + wait_ticks;
+ /* Use Sleep for the longest part. */
+ if (sleep_millis > 0)
+ Sleep (sleep_millis);
+ /* Busy-loop for the rest. */
+ for (;;)
+ {
+ LARGE_INTEGER counter_after;
+ if (!QueryPerformanceCounter (&counter_after))
+ /* QueryPerformanceCounter failed, but succeeded earlier.
+ Should not happen. */
+ break;
+ if (counter_after.QuadPart >= wait_until)
+ /* The requested time has elapsed. */
+ break;
+ }
+ goto done;
+ }
+ }
+ }
+ /* Implementation for long delays and as fallback. */
+ Sleep (requested_delay->tv_sec * 1000 + requested_delay->tv_nsec / 1000000);
+
+ done:
+ /* Sleep is not interruptible. So there is no remaining delay. */
+ if (remaining_delay != NULL)
+ {
+ remaining_delay->tv_sec = 0;
+ remaining_delay->tv_nsec = 0;
+ }
+ return 0;
+}
+
+#else
+/* Unix platforms lacking nanosleep. */
+
+/* Some systems (MSDOS) don't have SIGCONT.
+ Using SIGTERM here turns the signal-handling code below
+ into a no-op on such systems. */
+# ifndef SIGCONT
+# define SIGCONT SIGTERM
+# endif
+
+static sig_atomic_t volatile suspended;
+
+/* Handle SIGCONT. */
+
+static _GL_ASYNC_SAFE void
+sighandler (int sig)
+{
+ suspended = 1;
+}
+
+/* Suspend execution for at least *TS_DELAY seconds. */
+
+static int
+my_usleep (const struct timespec *ts_delay)
+{
+ struct timeval tv_delay;
+ tv_delay.tv_sec = ts_delay->tv_sec;
+ tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000;
+ if (tv_delay.tv_usec == 1000000)
+ {
+ if (tv_delay.tv_sec == TYPE_MAXIMUM (time_t))
+ tv_delay.tv_usec = 1000000 - 1; /* close enough */
+ else
+ {
+ tv_delay.tv_sec++;
+ tv_delay.tv_usec = 0;
+ }
+ }
+ return select (0, NULL, NULL, NULL, &tv_delay);
+}
+
+/* Suspend execution for at least *REQUESTED_DELAY seconds. The
+ *REMAINING_DELAY part isn't implemented yet. */
+
+int
+nanosleep (const struct timespec *requested_delay,
+ struct timespec *remaining_delay)
+{
+ static bool initialized;
+
+ if (requested_delay->tv_nsec < 0 || BILLION <= requested_delay->tv_nsec)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* set up sig handler */
+ if (! initialized)
+ {
+ struct sigaction oldact;
+
+ sigaction (SIGCONT, NULL, &oldact);
+ if (get_handler (&oldact) != SIG_IGN)
+ {
+ struct sigaction newact;
+
+ newact.sa_handler = sighandler;
+ sigemptyset (&newact.sa_mask);
+ newact.sa_flags = 0;
+ sigaction (SIGCONT, &newact, NULL);
+ }
+ initialized = true;
+ }
+
+ suspended = 0;
+
+ if (my_usleep (requested_delay) == -1)
+ {
+ if (suspended)
+ {
+ /* Calculate time remaining. */
+ /* FIXME: the code in sleep doesn't use this, so there's no
+ rush to implement it. */
+
+ errno = EINTR;
+ }
+ return -1;
+ }
+
+ /* FIXME: Restore sig handler? */
+
+ return 0;
+}
+#endif
diff --git a/lib/netdb.in.h b/lib/netdb.in.h
new file mode 100644
index 0000000..b5a0d99
--- /dev/null
+++ b/lib/netdb.in.h
@@ -0,0 +1,295 @@
+/* Provide a netdb.h header file for systems lacking it (read: MinGW).
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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 file is supposed to be used on platforms that lack <netdb.h>.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#ifndef _@GUARD_PREFIX@_NETDB_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_NETDB_H@
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETDB_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_NETDB_H
+#define _@GUARD_PREFIX@_NETDB_H
+
+/* Get <netdb.h> definitions such as 'socklen_t' on IRIX 6.5 and OSF/1 4.0 and
+ 'struct hostent' on MinGW. */
+#include <sys/socket.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Declarations for a platform that lacks <netdb.h>, or where it is
+ incomplete. */
+
+#if @GNULIB_GETADDRINFO@
+
+# if !@HAVE_STRUCT_ADDRINFO@
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_addrinfo
+/* Structure to contain information about address of a service provider. */
+struct addrinfo
+{
+ int ai_flags; /* Input flags. */
+ int ai_family; /* Protocol family for socket. */
+ int ai_socktype; /* Socket type. */
+ int ai_protocol; /* Protocol for socket. */
+ socklen_t ai_addrlen; /* Length of socket address. */
+ struct sockaddr *ai_addr; /* Socket address for socket. */
+ char *ai_canonname; /* Canonical name for service location. */
+ struct addrinfo *ai_next; /* Pointer to next in list. */
+};
+# define GNULIB_defined_struct_addrinfo 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# endif
+
+/* Possible values for 'ai_flags' field in 'addrinfo' structure. */
+# ifndef AI_PASSIVE
+# define AI_PASSIVE 0x0001 /* Socket address is intended for 'bind'. */
+# endif
+# ifndef AI_CANONNAME
+# define AI_CANONNAME 0x0002 /* Request for canonical name. */
+# endif
+# ifndef AI_NUMERICSERV
+# define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */
+# endif
+
+# if 0
+# define AI_NUMERICHOST 0x0004 /* Don't use name resolution. */
+# endif
+
+/* These symbolic constants are required to be present by POSIX, but
+ our getaddrinfo replacement doesn't use them (yet). Setting them
+ to 0 on systems that doesn't have them avoids causing problems for
+ system getaddrinfo implementations that would be confused by
+ unknown values. */
+# ifndef AI_V4MAPPED
+# define AI_V4MAPPED 0 /* 0x0008: IPv4 mapped addresses are acceptable. */
+# endif
+# ifndef AI_ALL
+# define AI_ALL 0 /* 0x0010: Return IPv4 mapped and IPv6 addresses. */
+# endif
+# ifndef AI_ADDRCONFIG
+# define AI_ADDRCONFIG 0 /* 0x0020: Use configuration of this host to choose
+ returned address type. */
+# endif
+
+/* Error values for 'getaddrinfo' function. */
+# ifndef EAI_BADFLAGS
+# define EAI_BADFLAGS -1 /* Invalid value for 'ai_flags' field. */
+# define EAI_NONAME -2 /* NAME or SERVICE is unknown. */
+# define EAI_AGAIN -3 /* Temporary failure in name resolution. */
+# define EAI_FAIL -4 /* Non-recoverable failure in name res. */
+# define EAI_NODATA -5 /* No address associated with NAME. */
+# define EAI_FAMILY -6 /* 'ai_family' not supported. */
+# define EAI_SOCKTYPE -7 /* 'ai_socktype' not supported. */
+# define EAI_SERVICE -8 /* SERVICE not supported for 'ai_socktype'. */
+# define EAI_MEMORY -10 /* Memory allocation failure. */
+# endif
+
+/* Since EAI_NODATA is deprecated by RFC3493, some systems (at least
+ FreeBSD, which does define EAI_BADFLAGS) have removed the definition
+ in favor of EAI_NONAME. */
+# if !defined EAI_NODATA && defined EAI_NONAME
+# define EAI_NODATA EAI_NONAME
+# endif
+
+# ifndef EAI_OVERFLOW
+/* Not defined on mingw32 and Haiku. */
+# define EAI_OVERFLOW -12 /* Argument buffer overflow. */
+# endif
+# ifndef EAI_ADDRFAMILY
+/* Not defined on mingw32. */
+# define EAI_ADDRFAMILY -9 /* Address family for NAME not supported. */
+# endif
+# ifndef EAI_SYSTEM
+/* Not defined on mingw32. */
+# define EAI_SYSTEM -11 /* System error returned in 'errno'. */
+# endif
+
+# if 0
+/* The commented out definitions below are not yet implemented in the
+ GNULIB getaddrinfo() replacement, so are not yet needed.
+
+ If they are restored, be sure to protect the definitions with #ifndef. */
+# ifndef EAI_INPROGRESS
+# define EAI_INPROGRESS -100 /* Processing request in progress. */
+# define EAI_CANCELED -101 /* Request canceled. */
+# define EAI_NOTCANCELED -102 /* Request not canceled. */
+# define EAI_ALLDONE -103 /* All requests done. */
+# define EAI_INTR -104 /* Interrupted by a signal. */
+# define EAI_IDN_ENCODE -105 /* IDN encoding failed. */
+# endif
+# endif
+
+/* Translate name of a service location and/or a service name to set of
+ socket addresses.
+ For more details, see the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html>. */
+# if @REPLACE_GETADDRINFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getaddrinfo
+# define getaddrinfo rpl_getaddrinfo
+# endif
+_GL_FUNCDECL_RPL (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res));
+# else
+# if !@HAVE_DECL_GETADDRINFO@
+_GL_FUNCDECL_SYS (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res)
+ _GL_ARG_NONNULL ((4)));
+# endif
+_GL_CXXALIAS_SYS (getaddrinfo, int,
+ (const char *restrict nodename,
+ const char *restrict servname,
+ const struct addrinfo *restrict hints,
+ struct addrinfo **restrict res));
+# endif
+_GL_CXXALIASWARN (getaddrinfo);
+
+/* Free 'addrinfo' structure AI including associated storage.
+ For more details, see the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html>. */
+# if @REPLACE_GETADDRINFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef freeaddrinfo
+# define freeaddrinfo rpl_freeaddrinfo
+# endif
+_GL_FUNCDECL_RPL (freeaddrinfo, void, (struct addrinfo *ai)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (freeaddrinfo, void, (struct addrinfo *ai));
+# else
+# if !@HAVE_DECL_FREEADDRINFO@
+_GL_FUNCDECL_SYS (freeaddrinfo, void, (struct addrinfo *ai)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (freeaddrinfo, void, (struct addrinfo *ai));
+# endif
+_GL_CXXALIASWARN (freeaddrinfo);
+
+# if @REPLACE_GAI_STRERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gai_strerror
+# define gai_strerror rpl_gai_strerror
+# endif
+_GL_FUNCDECL_RPL (gai_strerror, const char *, (int ecode));
+_GL_CXXALIAS_RPL (gai_strerror, const char *, (int ecode));
+# else
+# if !@HAVE_DECL_GAI_STRERROR@
+/* Convert error return from getaddrinfo() to a string.
+ For more details, see the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gai_strerror.html>. */
+_GL_FUNCDECL_SYS (gai_strerror, const char *, (int ecode));
+# endif
+_GL_CXXALIAS_SYS (gai_strerror, const char *, (int ecode));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (gai_strerror);
+# endif
+
+# if !@HAVE_DECL_GETNAMEINFO@
+/* Convert socket address to printable node and service names.
+ For more details, see the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getnameinfo.html>. */
+_GL_FUNCDECL_SYS (getnameinfo, int,
+ (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on glibc systems, the seventh parameter is
+ unsigned int flags. */
+_GL_CXXALIAS_SYS_CAST (getnameinfo, int,
+ (const struct sockaddr *restrict sa, socklen_t salen,
+ char *restrict node, socklen_t nodelen,
+ char *restrict service, socklen_t servicelen,
+ int flags));
+_GL_CXXALIASWARN (getnameinfo);
+
+/* Possible flags for getnameinfo. */
+# ifndef NI_NUMERICHOST
+# define NI_NUMERICHOST 1
+# endif
+# ifndef NI_NUMERICSERV
+# define NI_NUMERICSERV 2
+# endif
+
+#elif defined GNULIB_POSIXCHECK
+
+# undef getaddrinfo
+# if HAVE_RAW_DECL_GETADDRINFO
+_GL_WARN_ON_USE (getaddrinfo, "getaddrinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef freeaddrinfo
+# if HAVE_RAW_DECL_FREEADDRINFO
+_GL_WARN_ON_USE (freeaddrinfo, "freeaddrinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef gai_strerror
+# if HAVE_RAW_DECL_GAI_STRERROR
+_GL_WARN_ON_USE (gai_strerror, "gai_strerror is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+# undef getnameinfo
+# if HAVE_RAW_DECL_GETNAMEINFO
+_GL_WARN_ON_USE (getnameinfo, "getnameinfo is unportable - "
+ "use gnulib module getaddrinfo for portability");
+# endif
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_NETDB_H */
+#endif /* _@GUARD_PREFIX@_NETDB_H */
diff --git a/lib/netinet_in.in.h b/lib/netinet_in.in.h
new file mode 100644
index 0000000..84ad215
--- /dev/null
+++ b/lib/netinet_in.in.h
@@ -0,0 +1,47 @@
+/* Substitute for <netinet/in.h>.
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_NETINET_IN_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_NETINET_IN_H@
+
+/* On many platforms, <netinet/in.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_NETINET_IN_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_NETINET_IN_H
+#define _@GUARD_PREFIX@_NETINET_IN_H
+
+#if !@HAVE_NETINET_IN_H@
+
+/* A platform that lacks <netinet/in.h>. */
+
+# include <sys/socket.h>
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_NETINET_IN_H */
+#endif /* _@GUARD_PREFIX@_NETINET_IN_H */
diff --git a/lib/nl_langinfo-lock.c b/lib/nl_langinfo-lock.c
new file mode 100644
index 0000000..c2328ab
--- /dev/null
+++ b/lib/nl_langinfo-lock.c
@@ -0,0 +1,150 @@
+/* Return the internal lock used by nl_langinfo.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019-2020. */
+
+#include <config.h>
+
+/* When it is known that the gl_get_nl_langinfo_lock function is defined
+ by a dependency library, it should not be defined here. */
+#if OMIT_NL_LANGINFO_LOCK
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#else
+
+/* This file defines the internal lock used by nl_langinfo.
+ It is a separate compilation unit, so that only one copy of it is
+ present when linking statically. */
+
+/* Prohibit renaming this symbol. */
+# undef gl_get_nl_langinfo_lock
+
+/* Macro for exporting a symbol (function, not variable) defined in this file,
+ when compiled into a shared library. */
+# ifndef DLL_EXPORTED
+# if HAVE_VISIBILITY
+ /* Override the effect of the compiler option '-fvisibility=hidden'. */
+# define DLL_EXPORTED __attribute__((__visibility__("default")))
+# elif defined _WIN32 || defined __CYGWIN__
+# define DLL_EXPORTED __declspec(dllexport)
+# else
+# define DLL_EXPORTED
+# endif
+# endif
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "windows-initguard.h"
+
+/* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *',
+ because the latter is not guaranteed to be a stable ABI in the future. */
+
+/* Make sure the function gets exported from DLLs. */
+DLL_EXPORTED CRITICAL_SECTION *gl_get_nl_langinfo_lock (void);
+
+static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT;
+static CRITICAL_SECTION lock;
+
+/* Returns the internal lock used by nl_langinfo. */
+CRITICAL_SECTION *
+gl_get_nl_langinfo_lock (void)
+{
+ if (!guard.done)
+ {
+ if (InterlockedIncrement (&guard.started) == 0)
+ {
+ /* This thread is the first one to need the lock. Initialize it. */
+ InitializeCriticalSection (&lock);
+ guard.done = 1;
+ }
+ else
+ {
+ /* Don't let guard.started grow and wrap around. */
+ InterlockedDecrement (&guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this mutex. */
+ while (!guard.done)
+ Sleep (0);
+ }
+ }
+ return &lock;
+}
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED pthread_mutex_t *gl_get_nl_langinfo_lock (void);
+
+/* Returns the internal lock used by nl_langinfo. */
+pthread_mutex_t *
+gl_get_nl_langinfo_lock (void)
+{
+ return &mutex;
+}
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+# include <stdlib.h>
+
+static int volatile init_needed = 1;
+static once_flag init_once = ONCE_FLAG_INIT;
+static mtx_t mutex;
+
+static void
+atomic_init (void)
+{
+ if (mtx_init (&mutex, mtx_plain) != thrd_success)
+ abort ();
+ init_needed = 0;
+}
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED mtx_t *gl_get_nl_langinfo_lock (void);
+
+/* Returns the internal lock used by nl_langinfo. */
+mtx_t *
+gl_get_nl_langinfo_lock (void)
+{
+ if (init_needed)
+ call_once (&init_once, atomic_init);
+ return &mutex;
+}
+
+# endif
+
+# if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER
+/* Make sure the '__declspec(dllimport)' in nl_langinfo.c does not cause
+ a link failure when no DLLs are involved. */
+# if defined _WIN64 || defined _LP64
+# define IMP(x) __imp_##x
+# else
+# define IMP(x) _imp__##x
+# endif
+void * IMP(gl_get_nl_langinfo_lock) = &gl_get_nl_langinfo_lock;
+# endif
+
+#endif
diff --git a/lib/nl_langinfo.c b/lib/nl_langinfo.c
new file mode 100644
index 0000000..2b4c0c5
--- /dev/null
+++ b/lib/nl_langinfo.c
@@ -0,0 +1,572 @@
+/* nl_langinfo() replacement: query locale dependent information.
+
+ Copyright (C) 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <langinfo.h>
+
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+# include <stdio.h>
+#endif
+
+#if REPLACE_NL_LANGINFO && !NL_LANGINFO_MTSAFE
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+# if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS
+# include <threads.h>
+# pragma weak thrd_exit
+# define c11_threads_in_use() (thrd_exit != NULL)
+# else
+# define c11_threads_in_use() 0
+# endif
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+
+# endif
+#endif
+
+/* nl_langinfo() must be multithread-safe. To achieve this without using
+ thread-local storage:
+ 1. We use a specific static buffer for each possible argument.
+ So that different threads can call nl_langinfo with different arguments,
+ without interfering.
+ 2. We use a simple strcpy or memcpy to fill this static buffer. Filling it
+ through, for example, strcpy + strcat would not be guaranteed to leave
+ the buffer's contents intact if another thread is currently accessing
+ it. If necessary, the contents is first assembled in a stack-allocated
+ buffer. */
+
+#if !REPLACE_NL_LANGINFO || GNULIB_defined_CODESET
+/* Return the codeset of the current locale, if this is easily deducible.
+ Otherwise, return "". */
+static char *
+ctype_codeset (void)
+{
+ static char result[2 + 10 + 1];
+ char buf[2 + 10 + 1];
+ char locale[SETLOCALE_NULL_MAX];
+ char *codeset;
+ size_t codesetlen;
+
+ if (setlocale_null_r (LC_CTYPE, locale, sizeof (locale)))
+ locale[0] = '\0';
+
+ codeset = buf;
+ codeset[0] = '\0';
+
+ if (locale[0])
+ {
+ /* If the locale name contains an encoding after the dot, return it. */
+ char *dot = strchr (locale, '.');
+
+ if (dot)
+ {
+ /* Look for the possible @... trailer and remove it, if any. */
+ char *codeset_start = dot + 1;
+ char const *modifier = strchr (codeset_start, '@');
+
+ if (! modifier)
+ codeset = codeset_start;
+ else
+ {
+ codesetlen = modifier - codeset_start;
+ if (codesetlen < sizeof buf)
+ {
+ codeset = memcpy (buf, codeset_start, codesetlen);
+ codeset[codesetlen] = '\0';
+ }
+ }
+ }
+ }
+
+# if defined _WIN32 && ! defined __CYGWIN__
+ /* If setlocale is successful, it returns the number of the
+ codepage, as a string. Otherwise, fall back on Windows API
+ GetACP, which returns the locale's codepage as a number (although
+ this doesn't change according to what the 'setlocale' call specified).
+ Either way, prepend "CP" to make it a valid codeset name. */
+ codesetlen = strlen (codeset);
+ if (0 < codesetlen && codesetlen < sizeof buf - 2)
+ memmove (buf + 2, codeset, codesetlen + 1);
+ else
+ sprintf (buf + 2, "%u", GetACP ());
+ /* For a locale name such as "French_France.65001", in Windows 10,
+ setlocale now returns "French_France.utf8" instead. */
+ if (strcmp (buf + 2, "65001") == 0 || strcmp (buf + 2, "utf8") == 0)
+ return (char *) "UTF-8";
+ else
+ {
+ memcpy (buf, "CP", 2);
+ strcpy (result, buf);
+ return result;
+ }
+# else
+ strcpy (result, codeset);
+ return result;
+#endif
+}
+#endif
+
+
+#if REPLACE_NL_LANGINFO
+
+/* Override nl_langinfo with support for added nl_item values. */
+
+# undef nl_langinfo
+
+/* Without locking, on Solaris 11.3, test-nl_langinfo-mt fails, with message
+ "thread5 disturbed by threadN!", even when threadN invokes only
+ nl_langinfo (CODESET);
+ nl_langinfo (CRNCYSTR);
+ Similarly on Solaris 10. */
+
+# if !NL_LANGINFO_MTSAFE /* Solaris */
+
+# define ITEMS (MAXSTRMSG + 1)
+# define MAX_RESULT_LEN 80
+
+static char *
+nl_langinfo_unlocked (nl_item item)
+{
+ static char result[ITEMS][MAX_RESULT_LEN];
+
+ /* The result of nl_langinfo is in storage that can be overwritten by
+ other calls to nl_langinfo. */
+ char *tmp = nl_langinfo (item);
+ if (item >= 0 && item < ITEMS && tmp != NULL)
+ {
+ size_t tmp_len = strlen (tmp);
+ if (tmp_len < MAX_RESULT_LEN)
+ strcpy (result[item], tmp);
+ else
+ {
+ /* Produce a truncated result. Oh well... */
+ result[item][MAX_RESULT_LEN - 1] = '\0';
+ memcpy (result[item], tmp, MAX_RESULT_LEN - 1);
+ }
+ return result[item];
+ }
+ else
+ return tmp;
+}
+
+/* Use a lock, so that no two threads can invoke nl_langinfo_unlocked
+ at the same time. */
+
+/* Prohibit renaming this symbol. */
+# undef gl_get_nl_langinfo_lock
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+extern __declspec(dllimport) CRITICAL_SECTION *gl_get_nl_langinfo_lock (void);
+
+static char *
+nl_langinfo_with_lock (nl_item item)
+{
+ CRITICAL_SECTION *lock = gl_get_nl_langinfo_lock ();
+ char *ret;
+
+ EnterCriticalSection (lock);
+ ret = nl_langinfo_unlocked (item);
+ LeaveCriticalSection (lock);
+
+ return ret;
+}
+
+# elif HAVE_PTHREAD_API
+
+extern
+# if defined _WIN32 || defined __CYGWIN__
+ __declspec(dllimport)
+# endif
+ pthread_mutex_t *gl_get_nl_langinfo_lock (void);
+
+# if HAVE_WEAK_SYMBOLS /* musl libc, FreeBSD, NetBSD, OpenBSD, Haiku */
+
+ /* Avoid the need to link with '-lpthread'. */
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+
+ /* Determine whether libpthread is in use. */
+# pragma weak pthread_mutexattr_gettype
+ /* See the comments in lock.h. */
+# define pthread_in_use() \
+ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+
+# else
+# define pthread_in_use() 1
+# endif
+
+static char *
+nl_langinfo_with_lock (nl_item item)
+{
+ if (pthread_in_use())
+ {
+ pthread_mutex_t *lock = gl_get_nl_langinfo_lock ();
+ char *ret;
+
+ if (pthread_mutex_lock (lock))
+ abort ();
+ ret = nl_langinfo_unlocked (item);
+ if (pthread_mutex_unlock (lock))
+ abort ();
+
+ return ret;
+ }
+ else
+ return nl_langinfo_unlocked (item);
+}
+
+# elif HAVE_THREADS_H
+
+extern mtx_t *gl_get_nl_langinfo_lock (void);
+
+static char *
+nl_langinfo_with_lock (nl_item item)
+{
+ mtx_t *lock = gl_get_nl_langinfo_lock ();
+ char *ret;
+
+ if (mtx_lock (lock) != thrd_success)
+ abort ();
+ ret = nl_langinfo_unlocked (item);
+ if (mtx_unlock (lock) != thrd_success)
+ abort ();
+
+ return ret;
+}
+
+# endif
+
+# else
+
+/* On other platforms, no lock is needed. */
+# define nl_langinfo_with_lock nl_langinfo
+
+# endif
+
+char *
+rpl_nl_langinfo (nl_item item)
+{
+ switch (item)
+ {
+# if GNULIB_defined_CODESET
+ case CODESET:
+ return ctype_codeset ();
+# endif
+# if GNULIB_defined_T_FMT_AMPM
+ case T_FMT_AMPM:
+ return (char *) "%I:%M:%S %p";
+# endif
+# if GNULIB_defined_ALTMON
+ case ALTMON_1:
+ case ALTMON_2:
+ case ALTMON_3:
+ case ALTMON_4:
+ case ALTMON_5:
+ case ALTMON_6:
+ case ALTMON_7:
+ case ALTMON_8:
+ case ALTMON_9:
+ case ALTMON_10:
+ case ALTMON_11:
+ case ALTMON_12:
+ /* We don't ship the appropriate localizations with gnulib. Therefore,
+ treat ALTMON_i like MON_i. */
+ item = item - ALTMON_1 + MON_1;
+ break;
+# endif
+# if GNULIB_defined_ERA
+ case ERA:
+ /* The format is not standardized. In glibc it is a sequence of strings
+ of the form "direction:offset:start_date:end_date:era_name:era_format"
+ with an empty string at the end. */
+ return (char *) "";
+ case ERA_D_FMT:
+ /* The %Ex conversion in strftime behaves like %x if the locale does not
+ have an alternative time format. */
+ item = D_FMT;
+ break;
+ case ERA_D_T_FMT:
+ /* The %Ec conversion in strftime behaves like %c if the locale does not
+ have an alternative time format. */
+ item = D_T_FMT;
+ break;
+ case ERA_T_FMT:
+ /* The %EX conversion in strftime behaves like %X if the locale does not
+ have an alternative time format. */
+ item = T_FMT;
+ break;
+ case ALT_DIGITS:
+ /* The format is not standardized. In glibc it is a sequence of 10
+ strings, appended in memory. */
+ return (char *) "\0\0\0\0\0\0\0\0\0\0";
+# endif
+# if GNULIB_defined_YESEXPR || !FUNC_NL_LANGINFO_YESEXPR_WORKS
+ case YESEXPR:
+ return (char *) "^[yY]";
+ case NOEXPR:
+ return (char *) "^[nN]";
+# endif
+ default:
+ break;
+ }
+ return nl_langinfo_with_lock (item);
+}
+
+#else
+
+/* Provide nl_langinfo from scratch, either for native MS-Windows, or
+ for old Unix platforms without locales, such as Linux libc5 or
+ BeOS. */
+
+# include <time.h>
+
+char *
+nl_langinfo (nl_item item)
+{
+ char buf[100];
+ struct tm tmm = { 0 };
+
+ switch (item)
+ {
+ /* nl_langinfo items of the LC_CTYPE category */
+ case CODESET:
+ {
+ char *codeset = ctype_codeset ();
+ if (*codeset)
+ return codeset;
+ }
+# ifdef __BEOS__
+ return (char *) "UTF-8";
+# else
+ return (char *) "ISO-8859-1";
+# endif
+ /* nl_langinfo items of the LC_NUMERIC category */
+ case RADIXCHAR:
+ return localeconv () ->decimal_point;
+ case THOUSEP:
+ return localeconv () ->thousands_sep;
+# ifdef GROUPING
+ case GROUPING:
+ return localeconv () ->grouping;
+# endif
+ /* nl_langinfo items of the LC_TIME category.
+ TODO: Really use the locale. */
+ case D_T_FMT:
+ case ERA_D_T_FMT:
+ return (char *) "%a %b %e %H:%M:%S %Y";
+ case D_FMT:
+ case ERA_D_FMT:
+ return (char *) "%m/%d/%y";
+ case T_FMT:
+ case ERA_T_FMT:
+ return (char *) "%H:%M:%S";
+ case T_FMT_AMPM:
+ return (char *) "%I:%M:%S %p";
+ case AM_STR:
+ {
+ static char result[80];
+ if (!strftime (buf, sizeof result, "%p", &tmm))
+ return (char *) "AM";
+ strcpy (result, buf);
+ return result;
+ }
+ case PM_STR:
+ {
+ static char result[80];
+ tmm.tm_hour = 12;
+ if (!strftime (buf, sizeof result, "%p", &tmm))
+ return (char *) "PM";
+ strcpy (result, buf);
+ return result;
+ }
+ case DAY_1:
+ case DAY_2:
+ case DAY_3:
+ case DAY_4:
+ case DAY_5:
+ case DAY_6:
+ case DAY_7:
+ {
+ static char result[7][50];
+ static char const days[][sizeof "Wednesday"] = {
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
+ "Friday", "Saturday"
+ };
+ tmm.tm_wday = item - DAY_1;
+ if (!strftime (buf, sizeof result[0], "%A", &tmm))
+ return (char *) days[item - DAY_1];
+ strcpy (result[item - DAY_1], buf);
+ return result[item - DAY_1];
+ }
+ case ABDAY_1:
+ case ABDAY_2:
+ case ABDAY_3:
+ case ABDAY_4:
+ case ABDAY_5:
+ case ABDAY_6:
+ case ABDAY_7:
+ {
+ static char result[7][30];
+ static char const abdays[][sizeof "Sun"] = {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+ tmm.tm_wday = item - ABDAY_1;
+ if (!strftime (buf, sizeof result[0], "%a", &tmm))
+ return (char *) abdays[item - ABDAY_1];
+ strcpy (result[item - ABDAY_1], buf);
+ return result[item - ABDAY_1];
+ }
+ {
+ static char const months[][sizeof "September"] = {
+ "January", "February", "March", "April", "May", "June", "July",
+ "September", "October", "November", "December"
+ };
+ case MON_1:
+ case MON_2:
+ case MON_3:
+ case MON_4:
+ case MON_5:
+ case MON_6:
+ case MON_7:
+ case MON_8:
+ case MON_9:
+ case MON_10:
+ case MON_11:
+ case MON_12:
+ {
+ static char result[12][50];
+ tmm.tm_mon = item - MON_1;
+ if (!strftime (buf, sizeof result[0], "%B", &tmm))
+ return (char *) months[item - MON_1];
+ strcpy (result[item - MON_1], buf);
+ return result[item - MON_1];
+ }
+ case ALTMON_1:
+ case ALTMON_2:
+ case ALTMON_3:
+ case ALTMON_4:
+ case ALTMON_5:
+ case ALTMON_6:
+ case ALTMON_7:
+ case ALTMON_8:
+ case ALTMON_9:
+ case ALTMON_10:
+ case ALTMON_11:
+ case ALTMON_12:
+ {
+ static char result[12][50];
+ tmm.tm_mon = item - ALTMON_1;
+ /* The platforms without nl_langinfo() don't support strftime with
+ %OB. We don't even need to try. */
+ #if 0
+ if (!strftime (buf, sizeof result[0], "%OB", &tmm))
+ #endif
+ if (!strftime (buf, sizeof result[0], "%B", &tmm))
+ return (char *) months[item - ALTMON_1];
+ strcpy (result[item - ALTMON_1], buf);
+ return result[item - ALTMON_1];
+ }
+ }
+ case ABMON_1:
+ case ABMON_2:
+ case ABMON_3:
+ case ABMON_4:
+ case ABMON_5:
+ case ABMON_6:
+ case ABMON_7:
+ case ABMON_8:
+ case ABMON_9:
+ case ABMON_10:
+ case ABMON_11:
+ case ABMON_12:
+ {
+ static char result[12][30];
+ static char const abmonths[][sizeof "Jan"] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul",
+ "Sep", "Oct", "Nov", "Dec"
+ };
+ tmm.tm_mon = item - ABMON_1;
+ if (!strftime (buf, sizeof result[0], "%b", &tmm))
+ return (char *) abmonths[item - ABMON_1];
+ strcpy (result[item - ABMON_1], buf);
+ return result[item - ABMON_1];
+ }
+ case ERA:
+ return (char *) "";
+ case ALT_DIGITS:
+ return (char *) "\0\0\0\0\0\0\0\0\0\0";
+ /* nl_langinfo items of the LC_MONETARY category. */
+ case CRNCYSTR:
+ return localeconv () ->currency_symbol;
+# ifdef INT_CURR_SYMBOL
+ case INT_CURR_SYMBOL:
+ return localeconv () ->int_curr_symbol;
+ case MON_DECIMAL_POINT:
+ return localeconv () ->mon_decimal_point;
+ case MON_THOUSANDS_SEP:
+ return localeconv () ->mon_thousands_sep;
+ case MON_GROUPING:
+ return localeconv () ->mon_grouping;
+ case POSITIVE_SIGN:
+ return localeconv () ->positive_sign;
+ case NEGATIVE_SIGN:
+ return localeconv () ->negative_sign;
+ case FRAC_DIGITS:
+ return & localeconv () ->frac_digits;
+ case INT_FRAC_DIGITS:
+ return & localeconv () ->int_frac_digits;
+ case P_CS_PRECEDES:
+ return & localeconv () ->p_cs_precedes;
+ case N_CS_PRECEDES:
+ return & localeconv () ->n_cs_precedes;
+ case P_SEP_BY_SPACE:
+ return & localeconv () ->p_sep_by_space;
+ case N_SEP_BY_SPACE:
+ return & localeconv () ->n_sep_by_space;
+ case P_SIGN_POSN:
+ return & localeconv () ->p_sign_posn;
+ case N_SIGN_POSN:
+ return & localeconv () ->n_sign_posn;
+# endif
+ /* nl_langinfo items of the LC_MESSAGES category
+ TODO: Really use the locale. */
+ case YESEXPR:
+ return (char *) "^[yY]";
+ case NOEXPR:
+ return (char *) "^[nN]";
+ default:
+ return (char *) "";
+ }
+}
+
+#endif
diff --git a/lib/open.c b/lib/open.c
new file mode 100644
index 0000000..0f7c6e9
--- /dev/null
+++ b/lib/open.c
@@ -0,0 +1,209 @@
+/* Open a descriptor to a file.
+ Copyright (C) 2007-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2007. */
+
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+ the system's <fcntl.h> here, so that orig_open doesn't recurse to
+ rpl_open. */
+#define __need_system_fcntl_h
+#include <config.h>
+
+/* Get the original definition of open. It might be defined as a macro. */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+static int
+orig_open (const char *filename, int flags, mode_t mode)
+{
+#if defined _WIN32 && !defined __CYGWIN__
+ return _open (filename, flags, mode);
+#else
+ return open (filename, flags, mode);
+#endif
+}
+
+/* Specification. */
+/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <fcntl.h> above. */
+#include "fcntl.h"
+
+#include "cloexec.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#ifndef REPLACE_OPEN_DIRECTORY
+# define REPLACE_OPEN_DIRECTORY 0
+#endif
+
+int
+open (const char *filename, int flags, ...)
+{
+ /* 0 = unknown, 1 = yes, -1 = no. */
+#if GNULIB_defined_O_CLOEXEC
+ int have_cloexec = -1;
+#else
+ static int have_cloexec;
+#endif
+
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+#if GNULIB_defined_O_NONBLOCK
+ /* The only known platform that lacks O_NONBLOCK is mingw, but it
+ also lacks named pipes and Unix sockets, which are the only two
+ file types that require non-blocking handling in open().
+ Therefore, it is safe to ignore O_NONBLOCK here. It is handy
+ that mingw also lacks openat(), so that is also covered here. */
+ flags &= ~O_NONBLOCK;
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+ if (strcmp (filename, "/dev/null") == 0)
+ filename = "NUL";
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* Fail if one of O_CREAT, O_WRONLY, O_RDWR is specified and the filename
+ ends in a slash, as POSIX says such a filename must name a directory
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+ "A pathname that contains at least one non-<slash> character and that
+ ends with one or more trailing <slash> characters shall not be resolved
+ successfully unless the last pathname component before the trailing
+ <slash> characters names an existing directory"
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html>
+ says that it fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if ((flags & O_CREAT)
+ || (flags & O_ACCMODE) == O_RDWR
+ || (flags & O_ACCMODE) == O_WRONLY)
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+#endif
+
+ fd = orig_open (filename,
+ flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode);
+
+ if (flags & O_CLOEXEC)
+ {
+ if (! have_cloexec)
+ {
+ if (0 <= fd)
+ have_cloexec = 1;
+ else if (errno == EINVAL)
+ {
+ fd = orig_open (filename, flags & ~O_CLOEXEC, mode);
+ have_cloexec = -1;
+ }
+ }
+ if (have_cloexec < 0 && 0 <= fd)
+ set_cloexec_flag (fd, true);
+ }
+
+
+#if REPLACE_FCHDIR
+ /* Implementing fchdir and fdopendir requires the ability to open a
+ directory file descriptor. If open doesn't support that (as on
+ mingw), we use a dummy file that behaves the same as directories
+ on Linux (ie. always reports EOF on attempts to read()), and
+ override fstat() in fchdir.c to hide the fact that we have a
+ dummy. */
+ if (REPLACE_OPEN_DIRECTORY && fd < 0 && errno == EACCES
+ && ((flags & O_ACCMODE) == O_RDONLY
+ || (O_SEARCH != O_RDONLY && (flags & O_ACCMODE) == O_SEARCH)))
+ {
+ struct stat statbuf;
+ if (stat (filename, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
+ {
+ /* Maximum recursion depth of 1. */
+ fd = open ("/dev/null", flags, mode);
+ if (0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+ }
+ else
+ errno = EACCES;
+ }
+#endif
+
+#if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX says such a filename must name a directory
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+ "A pathname that contains at least one non-<slash> character and that
+ ends with one or more trailing <slash> characters shall not be resolved
+ successfully unless the last pathname component before the trailing
+ <slash> characters names an existing directory"
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+#endif
+
+#if REPLACE_FCHDIR
+ if (!REPLACE_OPEN_DIRECTORY && 0 <= fd)
+ fd = _gl_register_fd (fd, filename);
+#endif
+
+ return fd;
+}
diff --git a/lib/openat-die.c b/lib/openat-die.c
new file mode 100644
index 0000000..fd96dd7
--- /dev/null
+++ b/lib/openat-die.c
@@ -0,0 +1,62 @@
+/* Report a save- or restore-cwd failure in our openat replacement and then exit.
+
+ Copyright (C) 2005-2006, 2008-2020 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/>. */
+
+#include <config.h>
+
+#include "openat.h"
+
+#include <stdlib.h>
+
+#ifndef GNULIB_LIBPOSIX
+# include "error.h"
+#endif
+
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+_Noreturn void
+openat_save_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+ error (exit_failure, errnum,
+ _("unable to record current working directory"));
+#endif
+ /* _Noreturn cannot be applied to error, since it returns
+ when its first argument is 0. To help compilers understand that this
+ function does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
+
+
+/* Exit with an error about failure to restore the working directory
+ during an openat emulation. The caller must ensure that fd 2 is
+ not a just-opened fd, even when openat_safer is not in use. */
+
+_Noreturn void
+openat_restore_fail (int errnum)
+{
+#ifndef GNULIB_LIBPOSIX
+ error (exit_failure, errnum,
+ _("failed to return to initial working directory"));
+#endif
+
+ /* As above. */
+ abort ();
+}
diff --git a/lib/openat-priv.h b/lib/openat-priv.h
new file mode 100644
index 0000000..5b824f7
--- /dev/null
+++ b/lib/openat-priv.h
@@ -0,0 +1,64 @@
+/* Internals for openat-like functions.
+
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT_PRIV
+#define _GL_HEADER_OPENAT_PRIV
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+/* Maximum number of bytes that it is safe to allocate as a single
+ array on the stack, and that is known as a compile-time constant.
+ The assumption is that we'll touch the array very quickly, or a
+ temporary very near the array, provoking an out-of-memory trap. On
+ some operating systems, there is only one guard page for the stack,
+ and a page size can be as small as 4096 bytes. Subtract 64 in the
+ hope that this will let the compiler touch a nearby temporary and
+ provoke a trap. */
+#define SAFER_ALLOCA_MAX (4096 - 64)
+
+#define SAFER_ALLOCA(m) ((m) < SAFER_ALLOCA_MAX ? (m) : SAFER_ALLOCA_MAX)
+
+#if defined PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (PATH_MAX)
+#elif defined _XOPEN_PATH_MAX
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (_XOPEN_PATH_MAX)
+#else
+# define OPENAT_BUFFER_SIZE SAFER_ALLOCA (1024)
+#endif
+
+char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
+
+/* Trying to access a BUILD_PROC_NAME file will fail on systems without
+ /proc support, and even on systems *with* ProcFS support. Return
+ nonzero if the failure may be legitimate, e.g., because /proc is not
+ readable, or the particular .../fd/N directory is not present. */
+#define EXPECTED_ERRNO(Errno) \
+ ((Errno) == ENOTDIR || (Errno) == ENOENT \
+ || (Errno) == EPERM || (Errno) == EACCES \
+ || (Errno) == ENOSYS /* Solaris 8 */ \
+ || (Errno) == EOPNOTSUPP /* FreeBSD */)
+
+/* Wrapper function shared among linkat and renameat. */
+int at_func2 (int fd1, char const *file1,
+ int fd2, char const *file2,
+ int (*func) (char const *file1, char const *file2));
+
+#endif /* _GL_HEADER_OPENAT_PRIV */
diff --git a/lib/openat-proc.c b/lib/openat-proc.c
new file mode 100644
index 0000000..b5aaee8
--- /dev/null
+++ b/lib/openat-proc.c
@@ -0,0 +1,135 @@
+/* Create /proc/self/fd-related names for subfiles of open directories.
+
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include "openat-priv.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __KLIBC__
+# include <InnoTekLIBC/backend.h>
+#endif
+
+#include "intprops.h"
+
+/* Set BUF to the name of the subfile of the directory identified by
+ FD, where the subfile is named FILE. If successful, return BUF if
+ the result fits in BUF, dynamically allocated memory otherwise.
+ Return NULL (setting errno) on error. */
+char *
+openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file)
+{
+ char *result = buf;
+ int dirlen;
+
+ /* Make sure the caller gets ENOENT when appropriate. */
+ if (!*file)
+ {
+ buf[0] = '\0';
+ return buf;
+ }
+
+#ifndef __KLIBC__
+# define PROC_SELF_FD_FORMAT "/proc/self/fd/%d/"
+ {
+ enum {
+ PROC_SELF_FD_DIR_SIZE_BOUND
+ = (sizeof PROC_SELF_FD_FORMAT - (sizeof "%d" - 1)
+ + INT_STRLEN_BOUND (int))
+ };
+
+ static int proc_status = 0;
+ if (! proc_status)
+ {
+ /* Set PROC_STATUS to a positive value if /proc/self/fd is
+ reliable, and a negative value otherwise. Solaris 10
+ /proc/self/fd mishandles "..", and any file name might expand
+ to ".." after symbolic link expansion, so avoid /proc/self/fd
+ if it mishandles "..". Solaris 10 has openat, but this
+ problem is exhibited on code that built on Solaris 8 and
+ running on Solaris 10. */
+
+ int proc_self_fd =
+ open ("/proc/self/fd",
+ O_SEARCH | O_DIRECTORY | O_NOCTTY | O_NONBLOCK | O_CLOEXEC);
+ if (proc_self_fd < 0)
+ proc_status = -1;
+ else
+ {
+ /* Detect whether /proc/self/fd/%i/../fd exists, where %i is the
+ number of a file descriptor open on /proc/self/fd. On Linux,
+ that name resolves to /proc/self/fd, which was opened above.
+ However, on Solaris, it may resolve to /proc/self/fd/fd, which
+ cannot exist, since all names in /proc/self/fd are numeric. */
+ char dotdot_buf[PROC_SELF_FD_DIR_SIZE_BOUND + sizeof "../fd" - 1];
+ sprintf (dotdot_buf, PROC_SELF_FD_FORMAT "../fd", proc_self_fd);
+ proc_status = access (dotdot_buf, F_OK) ? -1 : 1;
+ close (proc_self_fd);
+ }
+ }
+
+ if (proc_status < 0)
+ return NULL;
+ else
+ {
+ size_t bufsize = PROC_SELF_FD_DIR_SIZE_BOUND + strlen (file);
+ if (OPENAT_BUFFER_SIZE < bufsize)
+ {
+ result = malloc (bufsize);
+ if (! result)
+ return NULL;
+ }
+
+ dirlen = sprintf (result, PROC_SELF_FD_FORMAT, fd);
+ }
+ }
+#else
+ /* OS/2 kLIBC provides a function to retrieve a path from a fd. */
+ {
+ char dir[_MAX_PATH];
+ size_t bufsize;
+
+ if (__libc_Back_ioFHToPath (fd, dir, sizeof dir))
+ return NULL;
+
+ dirlen = strlen (dir);
+ bufsize = dirlen + 1 + strlen (file) + 1; /* 1 for '/', 1 for null */
+ if (OPENAT_BUFFER_SIZE < bufsize)
+ {
+ result = malloc (bufsize);
+ if (! result)
+ return NULL;
+ }
+
+ strcpy (result, dir);
+ result[dirlen++] = '/';
+ }
+#endif
+
+ strcpy (result + dirlen, file);
+ return result;
+}
diff --git a/lib/openat.c b/lib/openat.c
new file mode 100644
index 0000000..baf6566
--- /dev/null
+++ b/lib/openat.c
@@ -0,0 +1,312 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2020 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/>. */
+
+/* written by Jim Meyering */
+
+/* If the user's config.h happens to include <fcntl.h>, let it include only
+ the system's <fcntl.h> here, so that orig_openat doesn't recurse to
+ rpl_openat. */
+#define __need_system_fcntl_h
+#include <config.h>
+
+/* Get the original definition of open. It might be defined as a macro. */
+#include <fcntl.h>
+#include <sys/types.h>
+#undef __need_system_fcntl_h
+
+#if HAVE_OPENAT
+static int
+orig_openat (int fd, char const *filename, int flags, mode_t mode)
+{
+ return openat (fd, filename, flags, mode);
+}
+#endif
+
+/* Write "fcntl.h" here, not <fcntl.h>, otherwise OSF/1 5.1 DTK cc eliminates
+ this include because of the preliminary #include <fcntl.h> above. */
+#include "fcntl.h"
+
+#include "openat.h"
+
+#include "cloexec.h"
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#if HAVE_OPENAT
+
+/* Like openat, but support O_CLOEXEC and work around Solaris 9 bugs
+ with trailing slash. */
+int
+rpl_openat (int dfd, char const *filename, int flags, ...)
+{
+ /* 0 = unknown, 1 = yes, -1 = no. */
+#if GNULIB_defined_O_CLOEXEC
+ int have_cloexec = -1;
+#else
+ static int have_cloexec;
+#endif
+
+ mode_t mode;
+ int fd;
+
+ mode = 0;
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+# if OPEN_TRAILING_SLASH_BUG
+ /* Fail if one of O_CREAT, O_WRONLY, O_RDWR is specified and the filename
+ ends in a slash, as POSIX says such a filename must name a directory
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+ "A pathname that contains at least one non-<slash> character and that
+ ends with one or more trailing <slash> characters shall not be resolved
+ successfully unless the last pathname component before the trailing
+ <slash> characters names an existing directory"
+ If the named file already exists as a directory, then
+ - if O_CREAT is specified, open() must fail because of the semantics
+ of O_CREAT,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/openat.html>
+ says that it fails with errno = EISDIR in this case.
+ If the named file does not exist or does not name a directory, then
+ - if O_CREAT is specified, open() must fail since open() cannot create
+ directories,
+ - if O_WRONLY or O_RDWR is specified, open() must fail because the
+ file does not contain a '.' directory. */
+ if ((flags & O_CREAT)
+ || (flags & O_ACCMODE) == O_RDWR
+ || (flags & O_ACCMODE) == O_WRONLY)
+ {
+ size_t len = strlen (filename);
+ if (len > 0 && filename[len - 1] == '/')
+ {
+ errno = EISDIR;
+ return -1;
+ }
+ }
+# endif
+
+ fd = orig_openat (dfd, filename,
+ flags & ~(have_cloexec < 0 ? O_CLOEXEC : 0), mode);
+
+ if (flags & O_CLOEXEC)
+ {
+ if (! have_cloexec)
+ {
+ if (0 <= fd)
+ have_cloexec = 1;
+ else if (errno == EINVAL)
+ {
+ fd = orig_openat (dfd, filename, flags & ~O_CLOEXEC, mode);
+ have_cloexec = -1;
+ }
+ }
+ if (have_cloexec < 0 && 0 <= fd)
+ set_cloexec_flag (fd, true);
+ }
+
+
+# if OPEN_TRAILING_SLASH_BUG
+ /* If the filename ends in a slash and fd does not refer to a directory,
+ then fail.
+ Rationale: POSIX says such a filename must name a directory
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>:
+ "A pathname that contains at least one non-<slash> character and that
+ ends with one or more trailing <slash> characters shall not be resolved
+ successfully unless the last pathname component before the trailing
+ <slash> characters names an existing directory"
+ If the named file without the slash is not a directory, open() must fail
+ with ENOTDIR. */
+ if (fd >= 0)
+ {
+ /* We know len is positive, since open did not fail with ENOENT. */
+ size_t len = strlen (filename);
+ if (filename[len - 1] == '/')
+ {
+ struct stat statbuf;
+
+ if (fstat (fd, &statbuf) >= 0 && !S_ISDIR (statbuf.st_mode))
+ {
+ close (fd);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+ }
+# endif
+
+ return fd;
+}
+
+#else /* !HAVE_OPENAT */
+
+# include "filename.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */
+# include "openat-priv.h"
+# include "save-cwd.h"
+
+/* Replacement for Solaris' openat function.
+ <https://www.google.com/search?q=openat+site:docs.oracle.com>
+ First, try to simulate it via open ("/proc/self/fd/FD/FILE").
+ Failing that, simulate it by doing save_cwd/fchdir/open/restore_cwd.
+ If either the save_cwd or the restore_cwd fails (relatively unlikely),
+ then give a diagnostic and exit nonzero.
+ Otherwise, upon failure, set errno and return -1, as openat does.
+ Upon successful completion, return a file descriptor. */
+int
+openat (int fd, char const *file, int flags, ...)
+{
+ mode_t mode = 0;
+
+ if (flags & O_CREAT)
+ {
+ va_list arg;
+ va_start (arg, flags);
+
+ /* We have to use PROMOTED_MODE_T instead of mode_t, otherwise GCC 4
+ creates crashing code when 'mode_t' is smaller than 'int'. */
+ mode = va_arg (arg, PROMOTED_MODE_T);
+
+ va_end (arg);
+ }
+
+ return openat_permissive (fd, file, flags, mode, NULL);
+}
+
+/* Like openat (FD, FILE, FLAGS, MODE), but if CWD_ERRNO is
+ nonnull, set *CWD_ERRNO to an errno value if unable to save
+ or restore the initial working directory. This is needed only
+ the first time remove.c's remove_dir opens a command-line
+ directory argument.
+
+ If a previous attempt to restore the current working directory
+ failed, then we must not even try to access a '.'-relative name.
+ It is the caller's responsibility not to call this function
+ in that case. */
+
+int
+openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno)
+{
+ struct saved_cwd saved_cwd;
+ int saved_errno;
+ int err;
+ bool save_ok;
+
+ if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
+ return open (file, flags, mode);
+
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, file);
+ if (proc_file)
+ {
+ int open_result = open (proc_file, flags, mode);
+ int open_errno = errno;
+ if (proc_file != buf)
+ free (proc_file);
+ /* If the syscall succeeds, or if it fails with an unexpected
+ errno value, then return right away. Otherwise, fall through
+ and resort to using save_cwd/restore_cwd. */
+ if (0 <= open_result || ! EXPECTED_ERRNO (open_errno))
+ {
+ errno = open_errno;
+ return open_result;
+ }
+ }
+ }
+
+ save_ok = (save_cwd (&saved_cwd) == 0);
+ if (! save_ok)
+ {
+ if (! cwd_errno)
+ openat_save_fail (errno);
+ *cwd_errno = errno;
+ }
+ if (0 <= fd && fd == saved_cwd.desc)
+ {
+ /* If saving the working directory collides with the user's
+ requested fd, then the user's fd must have been closed to
+ begin with. */
+ free_cwd (&saved_cwd);
+ errno = EBADF;
+ return -1;
+ }
+
+ err = fchdir (fd);
+ saved_errno = errno;
+
+ if (! err)
+ {
+ err = open (file, flags, mode);
+ saved_errno = errno;
+ if (save_ok && restore_cwd (&saved_cwd) != 0)
+ {
+ if (! cwd_errno)
+ {
+ /* Don't write a message to just-created fd 2. */
+ saved_errno = errno;
+ if (err == STDERR_FILENO)
+ close (err);
+ openat_restore_fail (saved_errno);
+ }
+ *cwd_errno = errno;
+ }
+ }
+
+ free_cwd (&saved_cwd);
+ errno = saved_errno;
+ return err;
+}
+
+/* Return true if our openat implementation must resort to
+ using save_cwd and restore_cwd. */
+bool
+openat_needs_fchdir (void)
+{
+ bool needs_fchdir = true;
+ int fd = open ("/", O_SEARCH | O_CLOEXEC);
+
+ if (0 <= fd)
+ {
+ char buf[OPENAT_BUFFER_SIZE];
+ char *proc_file = openat_proc_name (buf, fd, ".");
+ if (proc_file)
+ {
+ needs_fchdir = false;
+ if (proc_file != buf)
+ free (proc_file);
+ }
+ close (fd);
+ }
+
+ return needs_fchdir;
+}
+
+#endif /* !HAVE_OPENAT */
diff --git a/lib/openat.h b/lib/openat.h
new file mode 100644
index 0000000..824ce56
--- /dev/null
+++ b/lib/openat.h
@@ -0,0 +1,123 @@
+/* provide a replacement openat function
+ Copyright (C) 2004-2006, 2008-2020 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/>. */
+
+/* written by Jim Meyering */
+
+#ifndef _GL_HEADER_OPENAT
+#define _GL_HEADER_OPENAT
+
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdbool.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+
+#if !HAVE_OPENAT
+
+int openat_permissive (int fd, char const *file, int flags, mode_t mode,
+ int *cwd_errno);
+bool openat_needs_fchdir (void);
+
+#else
+
+# define openat_permissive(Fd, File, Flags, Mode, Cwd_errno) \
+ openat (Fd, File, Flags, Mode)
+# define openat_needs_fchdir() false
+
+#endif
+
+_Noreturn void openat_restore_fail (int);
+_Noreturn void openat_save_fail (int);
+
+/* Using these function names makes application code
+ slightly more readable than it would be with
+ fchownat (..., 0) or fchownat (..., AT_SYMLINK_NOFOLLOW). */
+
+#if GNULIB_CHOWNAT
+
+# ifndef CHOWNAT_INLINE
+# define CHOWNAT_INLINE _GL_INLINE
+# endif
+
+CHOWNAT_INLINE int
+chownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, 0);
+}
+
+CHOWNAT_INLINE int
+lchownat (int fd, char const *file, uid_t owner, gid_t group)
+{
+ return fchownat (fd, file, owner, group, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_CHMODAT
+
+# ifndef CHMODAT_INLINE
+# define CHMODAT_INLINE _GL_INLINE
+# endif
+
+CHMODAT_INLINE int
+chmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, 0);
+}
+
+CHMODAT_INLINE int
+lchmodat (int fd, char const *file, mode_t mode)
+{
+ return fchmodat (fd, file, mode, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+#if GNULIB_STATAT
+
+# ifndef STATAT_INLINE
+# define STATAT_INLINE _GL_INLINE
+# endif
+
+STATAT_INLINE int
+statat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, 0);
+}
+
+STATAT_INLINE int
+lstatat (int fd, char const *name, struct stat *st)
+{
+ return fstatat (fd, name, st, AT_SYMLINK_NOFOLLOW);
+}
+
+#endif
+
+/* For now, there are no wrappers named laccessat or leuidaccessat,
+ since gnulib doesn't support faccessat(,AT_SYMLINK_NOFOLLOW) and
+ since access rights on symlinks are of limited utility. Likewise,
+ wrappers are not provided for accessat or euidaccessat, so as to
+ avoid dragging in -lgen on some platforms. */
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_HEADER_OPENAT */
diff --git a/lib/opendir.c b/lib/opendir.c
new file mode 100644
index 0000000..500fa44
--- /dev/null
+++ b/lib/opendir.c
@@ -0,0 +1,179 @@
+/* Start reading the entries of a directory.
+ Copyright (C) 2006-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#if HAVE_OPENDIR
+
+/* Override opendir(), to keep track of the open file descriptors.
+ Needed because there is a function dirfd(). */
+
+#else
+
+# include <stdlib.h>
+
+# include "dirent-private.h"
+# include "filename.h"
+
+#endif
+
+#if REPLACE_FCHDIR
+# include <unistd.h>
+#endif
+
+#ifdef __KLIBC__
+# include <io.h>
+# include <fcntl.h>
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Don't assume that UNICODE is not defined. */
+# undef WIN32_FIND_DATA
+# define WIN32_FIND_DATA WIN32_FIND_DATAA
+# undef GetFullPathName
+# define GetFullPathName GetFullPathNameA
+# undef FindFirstFile
+# define FindFirstFile FindFirstFileA
+#endif
+
+DIR *
+opendir (const char *dir_name)
+{
+#if HAVE_OPENDIR
+# undef opendir
+ DIR *dirp;
+
+ dirp = opendir (dir_name);
+ if (dirp == NULL)
+ return NULL;
+
+# ifdef __KLIBC__
+ {
+ int fd = open (dir_name, O_RDONLY);
+ if (fd == -1 || _gl_register_dirp_fd (fd, dirp))
+ {
+ int saved_errno = errno;
+
+ close (fd);
+ closedir (dirp);
+
+ errno = saved_errno;
+
+ return NULL;
+ }
+ }
+# endif
+#else
+
+ char dir_name_mask[MAX_PATH + 1 + 1 + 1];
+ int status;
+ HANDLE current;
+ WIN32_FIND_DATA entry;
+ struct gl_directory *dirp;
+
+ if (dir_name[0] == '\0')
+ {
+ errno = ENOENT;
+ return NULL;
+ }
+
+ /* Make the dir_name absolute, so that we continue reading the same
+ directory if the current directory changed between this opendir()
+ call and a subsequent rewinddir() call. */
+ if (!GetFullPathName (dir_name, MAX_PATH, dir_name_mask, NULL))
+ {
+ errno = EINVAL;
+ return NULL;
+ }
+
+ /* Append the mask.
+ "*" and "*.*" appear to be equivalent. */
+ {
+ char *p;
+
+ p = dir_name_mask + strlen (dir_name_mask);
+ if (p > dir_name_mask && !ISSLASH (p[-1]))
+ *p++ = '\\';
+ *p++ = '*';
+ *p = '\0';
+ }
+
+ /* Start searching the directory. */
+ status = -1;
+ current = FindFirstFile (dir_name_mask, &entry);
+ if (current == INVALID_HANDLE_VALUE)
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_FILE_NOT_FOUND:
+ status = -2;
+ break;
+ case ERROR_PATH_NOT_FOUND:
+ errno = ENOENT;
+ return NULL;
+ case ERROR_DIRECTORY:
+ errno = ENOTDIR;
+ return NULL;
+ case ERROR_ACCESS_DENIED:
+ errno = EACCES;
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+
+ /* Allocate the result. */
+ dirp =
+ (struct gl_directory *)
+ malloc (offsetof (struct gl_directory, dir_name_mask[0])
+ + strlen (dir_name_mask) + 1);
+ if (dirp == NULL)
+ {
+ if (current != INVALID_HANDLE_VALUE)
+ FindClose (current);
+ errno = ENOMEM;
+ return NULL;
+ }
+ dirp->status = status;
+ dirp->current = current;
+ if (status == -1)
+ memcpy (&dirp->entry, &entry, sizeof (WIN32_FIND_DATA));
+ strcpy (dirp->dir_name_mask, dir_name_mask);
+
+#endif
+
+#if REPLACE_FCHDIR
+ {
+ int fd = dirfd (dirp);
+ if (0 <= fd && _gl_register_fd (fd, dir_name) != fd)
+ {
+ int saved_errno = errno;
+ closedir (dirp);
+ errno = saved_errno;
+ return NULL;
+ }
+ }
+#endif
+
+ return dirp;
+}
diff --git a/lib/os2-spawn.c b/lib/os2-spawn.c
new file mode 100644
index 0000000..ac425a3
--- /dev/null
+++ b/lib/os2-spawn.c
@@ -0,0 +1,155 @@
+/* Auxiliary functions for the creation of subprocesses. OS/2 kLIBC API.
+ Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "os2-spawn.h"
+
+/* Get _open_osfhandle(). */
+#include <io.h>
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "cloexec.h"
+#include "error.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Duplicates a file handle, making the copy uninheritable.
+ Returns -1 for a file handle that is equivalent to closed. */
+static int
+dup_noinherit (int fd)
+{
+ fd = dup_cloexec (fd);
+ if (fd < 0 && errno == EMFILE)
+ error (EXIT_FAILURE, errno, _("_open_osfhandle failed"));
+
+ return fd;
+}
+
+/* Returns a file descriptor equivalent to FD, except that the resulting file
+ descriptor is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ FD must be open and non-inheritable. The result will be non-inheritable as
+ well.
+ If FD < 0, FD itself is returned. */
+static int
+fd_safer_noinherit (int fd)
+{
+ if (STDIN_FILENO <= fd && fd <= STDERR_FILENO)
+ {
+ /* The recursion depth is at most 3. */
+ int nfd = fd_safer_noinherit (dup_noinherit (fd));
+ int saved_errno = errno;
+ close (fd);
+ errno = saved_errno;
+ return nfd;
+ }
+ return fd;
+}
+
+int
+dup_safer_noinherit (int fd)
+{
+ return fd_safer_noinherit (dup_noinherit (fd));
+}
+
+void
+undup_safer_noinherit (int tempfd, int origfd)
+{
+ if (tempfd >= 0)
+ {
+ if (dup2 (tempfd, origfd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot restore fd %d: dup2 failed"),
+ origfd);
+ close (tempfd);
+ }
+ else
+ {
+ /* origfd was closed or open to no handle at all. Set it to a closed
+ state. This is (nearly) equivalent to the original state. */
+ close (origfd);
+ }
+}
+
+const char **
+prepare_spawn (const char * const *argv, char **mem_to_free)
+{
+ size_t argc;
+ const char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = (const char **) malloc ((1 + argc + 1) * sizeof (const char *));
+ if (new_argv == NULL)
+ return NULL;
+
+ /* Add an element upfront that can be used when argv[0] turns out to be a
+ script, not a program.
+ On Unix, this would be "/bin/sh". */
+ new_argv[0] = "sh.exe";
+
+ /* Put quoted arguments into the new argument vector. */
+ size_t needed_size = 0;
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+ const char *quoted_string = (string[0] == '\0' ? "\"\"" : string);
+ size_t length = strlen (quoted_string);
+ needed_size += length + 1;
+ }
+
+ char *mem;
+ if (needed_size == 0)
+ mem = NULL;
+ else
+ {
+ mem = (char *) malloc (needed_size);
+ if (mem == NULL)
+ {
+ /* Memory allocation failure. */
+ free (new_argv);
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *mem_to_free = mem;
+
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ new_argv[1 + i] = mem;
+ const char *quoted_string = (string[0] == '\0' ? "\"\"" : string);
+ size_t length = strlen (quoted_string);
+ memcpy (mem, quoted_string, length + 1);
+ mem += length + 1;
+ }
+ new_argv[1 + argc] = NULL;
+
+ return new_argv;
+}
diff --git a/lib/os2-spawn.h b/lib/os2-spawn.h
new file mode 100644
index 0000000..419f7f9
--- /dev/null
+++ b/lib/os2-spawn.h
@@ -0,0 +1,33 @@
+/* Auxiliary functions for the creation of subprocesses. OS/2 kLIBC API.
+ Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+#ifndef _OS2_SPAWN_H
+#define _OS2_SPAWN_H
+
+/* Duplicates a file handle, making the copy uninheritable and ensuring the
+ result is none of STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO.
+ Returns -1 for a file handle that is equivalent to closed. */
+extern int dup_safer_noinherit (int fd);
+
+/* Undoes the effect of TEMPFD = dup_safer_noinherit (ORIGFD); */
+extern void undup_safer_noinherit (int tempfd, int origfd);
+
+/* Prepares an argument vector before calling spawn(). */
+extern const char ** prepare_spawn (const char * const *argv,
+ char **mem_to_free);
+
+#endif /* _OS2_SPAWN_H */
diff --git a/lib/pathmax.h b/lib/pathmax.h
new file mode 100644
index 0000000..15a236f
--- /dev/null
+++ b/lib/pathmax.h
@@ -0,0 +1,83 @@
+/* Define PATH_MAX somehow. Requires sys/types.h.
+ Copyright (C) 1992, 1999, 2001, 2003, 2005, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _PATHMAX_H
+# define _PATHMAX_H
+
+/* POSIX:2008 defines PATH_MAX to be the maximum number of bytes in a filename,
+ including the terminating NUL byte.
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/limits.h.html>
+ PATH_MAX is not defined on systems which have no limit on filename length,
+ such as GNU/Hurd.
+
+ This file does *not* define PATH_MAX always. Programs that use this file
+ can handle the GNU/Hurd case in several ways:
+ - Either with a package-wide handling, or with a per-file handling,
+ - Either through a
+ #ifdef PATH_MAX
+ or through a fallback like
+ #ifndef PATH_MAX
+ # define PATH_MAX 8192
+ #endif
+ or through a fallback like
+ #ifndef PATH_MAX
+ # define PATH_MAX pathconf ("/", _PC_PATH_MAX)
+ #endif
+ */
+
+# include <unistd.h>
+
+# include <limits.h>
+
+# ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 256
+# endif
+
+/* Don't include sys/param.h if it already has been. */
+# if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+# endif
+
+# if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# endif
+
+# ifdef __hpux
+/* On HP-UX, PATH_MAX designates the maximum number of bytes in a filename,
+ *not* including the terminating NUL byte, and is set to 1023.
+ Additionally, when _XOPEN_SOURCE is defined to 500 or more, PATH_MAX is
+ not defined at all any more. */
+# undef PATH_MAX
+# define PATH_MAX 1024
+# endif
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* The page "Naming Files, Paths, and Namespaces" on msdn.microsoft.com,
+ section "Maximum Path Length Limitation",
+ <https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#maximum-path-length-limitation>
+ explains that the maximum size of a filename, including the terminating
+ NUL byte, is 260 = 3 + 256 + 1.
+ This is the same value as
+ - FILENAME_MAX in <stdio.h>,
+ - _MAX_PATH in <stdlib.h>,
+ - MAX_PATH in <windef.h>.
+ Undefine the original value, because mingw's <limits.h> gets it wrong. */
+# undef PATH_MAX
+# define PATH_MAX 260
+# endif
+
+#endif /* _PATHMAX_H */
diff --git a/lib/pipe-safer.c b/lib/pipe-safer.c
new file mode 100644
index 0000000..a90ed81
--- /dev/null
+++ b/lib/pipe-safer.c
@@ -0,0 +1,52 @@
+/* Invoke pipe, but avoid some glitches.
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. Fail with ENOSYS on
+ platforms that lack pipe. */
+
+int
+pipe_safer (int fd[2])
+{
+ if (pipe (fd) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer (fd[i]);
+ if (fd[i] < 0)
+ {
+ int saved_errno = errno;
+ close (fd[1 - i]);
+ errno = saved_errno;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+
+ return -1;
+}
diff --git a/lib/pipe.c b/lib/pipe.c
new file mode 100644
index 0000000..fd554fe
--- /dev/null
+++ b/lib/pipe.c
@@ -0,0 +1,50 @@
+/* Create a pipe.
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API. */
+
+/* Get _pipe(). */
+# include <io.h>
+
+/* Get _O_BINARY. */
+# include <fcntl.h>
+
+int
+pipe (int fd[2])
+{
+ /* Mingw changes fd to {-1,-1} on failure, but this violates
+ http://austingroupbugs.net/view.php?id=467 */
+ int tmp[2];
+ int result = _pipe (tmp, 4096, _O_BINARY);
+ if (!result)
+ {
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ }
+ return result;
+}
+
+#else
+
+# error "This platform lacks a pipe function, and Gnulib doesn't provide a replacement. This is a bug in Gnulib."
+
+#endif
diff --git a/lib/pipe2-safer.c b/lib/pipe2-safer.c
new file mode 100644
index 0000000..b644daa
--- /dev/null
+++ b/lib/pipe2-safer.c
@@ -0,0 +1,52 @@
+/* Invoke pipe2, but avoid some glitches.
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* Written by Eric Blake. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistd-safer.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+/* Like pipe2, but ensure that neither of the file descriptors is
+ STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */
+
+int
+pipe2_safer (int fd[2], int flags)
+{
+ /* This is a generalization of the pipe_safer implementation. */
+ if (pipe2 (fd, flags) == 0)
+ {
+ int i;
+ for (i = 0; i < 2; i++)
+ {
+ fd[i] = fd_safer_flag (fd[i], flags);
+ if (fd[i] < 0)
+ {
+ int e = errno;
+ close (fd[1 - i]);
+ errno = e;
+ return -1;
+ }
+ }
+
+ return 0;
+ }
+ return -1;
+}
diff --git a/lib/pipe2.c b/lib/pipe2.c
new file mode 100644
index 0000000..591e94d
--- /dev/null
+++ b/lib/pipe2.c
@@ -0,0 +1,167 @@
+/* Create a pipe, with specific opening flags.
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#include "binary-io.h"
+#include "verify.h"
+
+#if GNULIB_defined_O_NONBLOCK
+# include "nonblocking.h"
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API. */
+
+# include <io.h>
+
+#endif
+
+int
+pipe2 (int fd[2], int flags)
+{
+ /* Mingw _pipe() corrupts fd on failure; also, if we succeed at
+ creating the pipe but later fail at changing fcntl, we want
+ to leave fd unchanged: http://austingroupbugs.net/view.php?id=467 */
+ int tmp[2];
+ tmp[0] = fd[0];
+ tmp[1] = fd[1];
+
+#if HAVE_PIPE2
+# undef pipe2
+ /* Try the system call first, if it exists. (We may be running with a glibc
+ that has the function but with an older kernel that lacks it.) */
+ {
+ /* Cache the information whether the system call really exists. */
+ static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
+ if (have_pipe2_really >= 0)
+ {
+ int result = pipe2 (fd, flags);
+ if (!(result < 0 && errno == ENOSYS))
+ {
+ have_pipe2_really = 1;
+ return result;
+ }
+ have_pipe2_really = -1;
+ }
+ }
+#endif
+
+ /* Check the supported flags. */
+ if ((flags & ~(O_CLOEXEC | O_NONBLOCK | O_BINARY | O_TEXT)) != 0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API. */
+
+ if (_pipe (fd, 4096, flags & ~O_NONBLOCK) < 0)
+ {
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ return -1;
+ }
+
+ /* O_NONBLOCK handling.
+ On native Windows platforms, O_NONBLOCK is defined by gnulib. Use the
+ functions defined by the gnulib module 'nonblocking'. */
+# if GNULIB_defined_O_NONBLOCK
+ if (flags & O_NONBLOCK)
+ {
+ if (set_nonblocking_flag (fd[0], true) != 0
+ || set_nonblocking_flag (fd[1], true) != 0)
+ goto fail;
+ }
+# else
+ {
+ verify (O_NONBLOCK == 0);
+ }
+# endif
+
+ return 0;
+
+#else
+/* Unix API. */
+
+ if (pipe (fd) < 0)
+ return -1;
+
+ /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.html>
+ says that initially, the O_NONBLOCK and FD_CLOEXEC flags are cleared on
+ both fd[0] and fd[1]. */
+
+ /* O_NONBLOCK handling.
+ On Unix platforms, O_NONBLOCK is defined by the system. Use fcntl(). */
+ if (flags & O_NONBLOCK)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFL, 0)) < 0
+ || fcntl (fd[1], F_SETFL, fcntl_flags | O_NONBLOCK) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFL, 0)) < 0
+ || fcntl (fd[0], F_SETFL, fcntl_flags | O_NONBLOCK) == -1)
+ goto fail;
+ }
+
+ if (flags & O_CLOEXEC)
+ {
+ int fcntl_flags;
+
+ if ((fcntl_flags = fcntl (fd[1], F_GETFD, 0)) < 0
+ || fcntl (fd[1], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1
+ || (fcntl_flags = fcntl (fd[0], F_GETFD, 0)) < 0
+ || fcntl (fd[0], F_SETFD, fcntl_flags | FD_CLOEXEC) == -1)
+ goto fail;
+ }
+
+# if O_BINARY
+ if (flags & O_BINARY)
+ {
+ set_binary_mode (fd[1], O_BINARY);
+ set_binary_mode (fd[0], O_BINARY);
+ }
+ else if (flags & O_TEXT)
+ {
+ set_binary_mode (fd[1], O_TEXT);
+ set_binary_mode (fd[0], O_TEXT);
+ }
+# endif
+
+ return 0;
+
+#endif
+
+#if GNULIB_defined_O_NONBLOCK || !(defined _WIN32 && ! defined __CYGWIN__)
+ fail:
+ {
+ int saved_errno = errno;
+ close (fd[0]);
+ close (fd[1]);
+ fd[0] = tmp[0];
+ fd[1] = tmp[1];
+ errno = saved_errno;
+ return -1;
+ }
+#endif
+}
diff --git a/lib/printf-args.c b/lib/printf-args.c
new file mode 100644
index 0000000..943b77c
--- /dev/null
+++ b/lib/printf-args.c
@@ -0,0 +1,183 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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 file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be defined.
+ STATIC Set to 'static' to declare the function static. */
+
+#ifndef PRINTF_FETCHARGS
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_FETCHARGS
+# include "printf-args.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_FETCHARGS (va_list args, arguments *a)
+{
+ size_t i;
+ argument *ap;
+
+ for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+ switch (ap->type)
+ {
+ case TYPE_SCHAR:
+ ap->a.a_schar = va_arg (args, /*signed char*/ int);
+ break;
+ case TYPE_UCHAR:
+ ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+ break;
+ case TYPE_SHORT:
+ ap->a.a_short = va_arg (args, /*short*/ int);
+ break;
+ case TYPE_USHORT:
+ ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+ break;
+ case TYPE_INT:
+ ap->a.a_int = va_arg (args, int);
+ break;
+ case TYPE_UINT:
+ ap->a.a_uint = va_arg (args, unsigned int);
+ break;
+ case TYPE_LONGINT:
+ ap->a.a_longint = va_arg (args, long int);
+ break;
+ case TYPE_ULONGINT:
+ ap->a.a_ulongint = va_arg (args, unsigned long int);
+ break;
+ case TYPE_LONGLONGINT:
+ ap->a.a_longlongint = va_arg (args, long long int);
+ break;
+ case TYPE_ULONGLONGINT:
+ ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+ break;
+ case TYPE_DOUBLE:
+ ap->a.a_double = va_arg (args, double);
+ break;
+ case TYPE_LONGDOUBLE:
+ ap->a.a_longdouble = va_arg (args, long double);
+ break;
+ case TYPE_CHAR:
+ ap->a.a_char = va_arg (args, int);
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
+ default argument promotions", this is not the case in mingw32,
+ where wint_t is 'unsigned short'. */
+ ap->a.a_wide_char =
+ (sizeof (wint_t) < sizeof (int)
+ ? (wint_t) va_arg (args, int)
+ : va_arg (args, wint_t));
+ break;
+#endif
+ case TYPE_STRING:
+ ap->a.a_string = va_arg (args, const char *);
+ /* A null pointer is an invalid argument for "%s", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_string == NULL)
+ ap->a.a_string = "(NULL)";
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ ap->a.a_wide_string = va_arg (args, const wchar_t *);
+ /* A null pointer is an invalid argument for "%ls", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_wide_string == NULL)
+ {
+ static const wchar_t wide_null_string[] =
+ {
+ (wchar_t)'(',
+ (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
+ (wchar_t)')',
+ (wchar_t)0
+ };
+ ap->a.a_wide_string = wide_null_string;
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ ap->a.a_pointer = va_arg (args, void *);
+ break;
+ case TYPE_COUNT_SCHAR_POINTER:
+ ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ ap->a.a_count_short_pointer = va_arg (args, short *);
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ ap->a.a_count_int_pointer = va_arg (args, int *);
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ ap->a.a_count_longint_pointer = va_arg (args, long int *);
+ break;
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case TYPE_U8_STRING:
+ ap->a.a_u8_string = va_arg (args, const uint8_t *);
+ /* A null pointer is an invalid argument for "%U", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u8_string == NULL)
+ {
+ static const uint8_t u8_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u8_string = u8_null_string;
+ }
+ break;
+ case TYPE_U16_STRING:
+ ap->a.a_u16_string = va_arg (args, const uint16_t *);
+ /* A null pointer is an invalid argument for "%lU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u16_string == NULL)
+ {
+ static const uint16_t u16_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u16_string = u16_null_string;
+ }
+ break;
+ case TYPE_U32_STRING:
+ ap->a.a_u32_string = va_arg (args, const uint32_t *);
+ /* A null pointer is an invalid argument for "%llU", but in practice
+ it occurs quite frequently in printf statements that produce
+ debug output. Use a fallback in this case. */
+ if (ap->a.a_u32_string == NULL)
+ {
+ static const uint32_t u32_null_string[] =
+ { '(', 'N', 'U', 'L', 'L', ')', 0 };
+ ap->a.a_u32_string = u32_null_string;
+ }
+ break;
+#endif
+ default:
+ /* Unknown type. */
+ return -1;
+ }
+ return 0;
+}
diff --git a/lib/printf-args.h b/lib/printf-args.h
new file mode 100644
index 0000000..781f572
--- /dev/null
+++ b/lib/printf-args.h
@@ -0,0 +1,150 @@
+/* Decomposed printf argument list.
+ Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ PRINTF_FETCHARGS Name of the function to be declared.
+ STATIC Set to 'static' to declare the function static. */
+
+/* Default parameters. */
+#ifndef PRINTF_FETCHARGS
+# define PRINTF_FETCHARGS printf_fetchargs
+#endif
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get wchar_t. */
+#if HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t. */
+#if HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list. */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+ TYPE_NONE,
+ TYPE_SCHAR,
+ TYPE_UCHAR,
+ TYPE_SHORT,
+ TYPE_USHORT,
+ TYPE_INT,
+ TYPE_UINT,
+ TYPE_LONGINT,
+ TYPE_ULONGINT,
+ TYPE_LONGLONGINT,
+ TYPE_ULONGLONGINT,
+ TYPE_DOUBLE,
+ TYPE_LONGDOUBLE,
+ TYPE_CHAR,
+#if HAVE_WINT_T
+ TYPE_WIDE_CHAR,
+#endif
+ TYPE_STRING,
+#if HAVE_WCHAR_T
+ TYPE_WIDE_STRING,
+#endif
+ TYPE_POINTER,
+ TYPE_COUNT_SCHAR_POINTER,
+ TYPE_COUNT_SHORT_POINTER,
+ TYPE_COUNT_INT_POINTER,
+ TYPE_COUNT_LONGINT_POINTER,
+ TYPE_COUNT_LONGLONGINT_POINTER
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+, TYPE_U8_STRING
+, TYPE_U16_STRING
+, TYPE_U32_STRING
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+ arg_type type;
+ union
+ {
+ signed char a_schar;
+ unsigned char a_uchar;
+ short a_short;
+ unsigned short a_ushort;
+ int a_int;
+ unsigned int a_uint;
+ long int a_longint;
+ unsigned long int a_ulongint;
+ long long int a_longlongint;
+ unsigned long long int a_ulonglongint;
+ float a_float;
+ double a_double;
+ long double a_longdouble;
+ int a_char;
+#if HAVE_WINT_T
+ wint_t a_wide_char;
+#endif
+ const char* a_string;
+#if HAVE_WCHAR_T
+ const wchar_t* a_wide_string;
+#endif
+ void* a_pointer;
+ signed char * a_count_schar_pointer;
+ short * a_count_short_pointer;
+ int * a_count_int_pointer;
+ long int * a_count_longint_pointer;
+ long long int * a_count_longlongint_pointer;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ const uint8_t * a_u8_string;
+ const uint16_t * a_u16_string;
+ const uint32_t * a_u32_string;
+#endif
+ }
+ a;
+}
+argument;
+
+/* Number of directly allocated arguments (no malloc() needed). */
+#define N_DIRECT_ALLOC_ARGUMENTS 7
+
+typedef struct
+{
+ size_t count;
+ argument *arg;
+ argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int PRINTF_FETCHARGS (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/lib/printf-parse.c b/lib/printf-parse.c
new file mode 100644
index 0000000..99ddbc3
--- /dev/null
+++ b/lib/printf-parse.c
@@ -0,0 +1,632 @@
+/* Formatted output to strings.
+ Copyright (C) 1999-2000, 2002-2003, 2006-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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 file can be parametrized with the following macros:
+ CHAR_T The element type of the format string.
+ CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on CHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on CHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on CHAR_T.
+ STATIC Set to 'static' to declare the function static.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
+
+/* Specification. */
+#ifndef PRINTF_PARSE
+# include "printf-parse.h"
+#endif
+
+/* Default parameters. */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+/* Get size_t, NULL. */
+#include <stddef.h>
+
+/* Get intmax_t. */
+#if defined IN_LIBINTL || defined IN_LIBASPRINTF
+# if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+# endif
+# if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+# endif
+#else
+# include <stdint.h>
+#endif
+
+/* malloc(), realloc(), free(). */
+#include <stdlib.h>
+
+/* memcpy(). */
+#include <string.h>
+
+/* errno. */
+#include <errno.h>
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#if CHAR_T_ONLY_ASCII
+/* c_isascii(). */
+# include "c-ctype.h"
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+ const CHAR_T *cp = format; /* pointer into format */
+ size_t arg_posn = 0; /* number of regular arguments consumed */
+ size_t d_allocated; /* allocated elements of d->dir */
+ size_t a_allocated; /* allocated elements of a->arg */
+ size_t max_width_length = 0;
+ size_t max_precision_length = 0;
+
+ d->count = 0;
+ d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
+ d->dir = d->direct_alloc_dir;
+
+ a->count = 0;
+ a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
+ a->arg = a->direct_alloc_arg;
+
+#define REGISTER_ARG(_index_,_type_) \
+ { \
+ size_t n = (_index_); \
+ if (n >= a_allocated) \
+ { \
+ size_t memory_size; \
+ argument *memory; \
+ \
+ a_allocated = xtimes (a_allocated, 2); \
+ if (a_allocated <= n) \
+ a_allocated = xsum (n, 1); \
+ memory_size = xtimes (a_allocated, sizeof (argument)); \
+ if (size_overflow_p (memory_size)) \
+ /* Overflow, would lead to out of memory. */ \
+ goto out_of_memory; \
+ memory = (argument *) (a->arg != a->direct_alloc_arg \
+ ? realloc (a->arg, memory_size) \
+ : malloc (memory_size)); \
+ if (memory == NULL) \
+ /* Out of memory. */ \
+ goto out_of_memory; \
+ if (a->arg == a->direct_alloc_arg) \
+ memcpy (memory, a->arg, a->count * sizeof (argument)); \
+ a->arg = memory; \
+ } \
+ while (a->count <= n) \
+ a->arg[a->count++].type = TYPE_NONE; \
+ if (a->arg[n].type == TYPE_NONE) \
+ a->arg[n].type = (_type_); \
+ else if (a->arg[n].type != (_type_)) \
+ /* Ambiguous type for positional argument. */ \
+ goto error; \
+ }
+
+ while (*cp != '\0')
+ {
+ CHAR_T c = *cp++;
+ if (c == '%')
+ {
+ size_t arg_index = ARG_NONE;
+ DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
+
+ /* Initialize the next directive. */
+ dp->dir_start = cp - 1;
+ dp->flags = 0;
+ dp->width_start = NULL;
+ dp->width_end = NULL;
+ dp->width_arg_index = ARG_NONE;
+ dp->precision_start = NULL;
+ dp->precision_end = NULL;
+ dp->precision_arg_index = ARG_NONE;
+ dp->arg_index = ARG_NONE;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+
+ /* Read the flags. */
+ for (;;)
+ {
+ if (*cp == '\'')
+ {
+ dp->flags |= FLAG_GROUP;
+ cp++;
+ }
+ else if (*cp == '-')
+ {
+ dp->flags |= FLAG_LEFT;
+ cp++;
+ }
+ else if (*cp == '+')
+ {
+ dp->flags |= FLAG_SHOWSIGN;
+ cp++;
+ }
+ else if (*cp == ' ')
+ {
+ dp->flags |= FLAG_SPACE;
+ cp++;
+ }
+ else if (*cp == '#')
+ {
+ dp->flags |= FLAG_ALT;
+ cp++;
+ }
+ else if (*cp == '0')
+ {
+ dp->flags |= FLAG_ZERO;
+ cp++;
+ }
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ else if (*cp == 'I')
+ {
+ dp->flags |= FLAG_LOCALIZED;
+ cp++;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Parse the field width. */
+ if (*cp == '*')
+ {
+ dp->width_start = cp;
+ cp++;
+ dp->width_end = cp;
+ if (max_width_length < 1)
+ max_width_length = 1;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory later. */
+ goto error;
+ dp->width_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->width_arg_index == ARG_NONE)
+ {
+ dp->width_arg_index = arg_posn++;
+ if (dp->width_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+ }
+ else if (*cp >= '0' && *cp <= '9')
+ {
+ size_t width_length;
+
+ dp->width_start = cp;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->width_end = cp;
+ width_length = dp->width_end - dp->width_start;
+ if (max_width_length < width_length)
+ max_width_length = width_length;
+ }
+
+ /* Parse the precision. */
+ if (*cp == '.')
+ {
+ cp++;
+ if (*cp == '*')
+ {
+ dp->precision_start = cp - 1;
+ cp++;
+ dp->precision_end = cp;
+ if (max_precision_length < 2)
+ max_precision_length = 2;
+
+ /* Test for positional argument. */
+ if (*cp >= '0' && *cp <= '9')
+ {
+ const CHAR_T *np;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ ;
+ if (*np == '$')
+ {
+ size_t n = 0;
+
+ for (np = cp; *np >= '0' && *np <= '9'; np++)
+ n = xsum (xtimes (n, 10), *np - '0');
+ if (n == 0)
+ /* Positional argument 0. */
+ goto error;
+ if (size_overflow_p (n))
+ /* n too large, would lead to out of memory
+ later. */
+ goto error;
+ dp->precision_arg_index = n - 1;
+ cp = np + 1;
+ }
+ }
+ if (dp->precision_arg_index == ARG_NONE)
+ {
+ dp->precision_arg_index = arg_posn++;
+ if (dp->precision_arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+ }
+ else
+ {
+ size_t precision_length;
+
+ dp->precision_start = cp - 1;
+ for (; *cp >= '0' && *cp <= '9'; cp++)
+ ;
+ dp->precision_end = cp;
+ precision_length = dp->precision_end - dp->precision_start;
+ if (max_precision_length < precision_length)
+ max_precision_length = precision_length;
+ }
+ }
+
+ {
+ arg_type type;
+
+ /* Parse argument type/size specifiers. */
+ {
+ int flags = 0;
+
+ for (;;)
+ {
+ if (*cp == 'h')
+ {
+ flags |= (1 << (flags & 1));
+ cp++;
+ }
+ else if (*cp == 'L')
+ {
+ flags |= 4;
+ cp++;
+ }
+ else if (*cp == 'l')
+ {
+ flags += 8;
+ cp++;
+ }
+ else if (*cp == 'j')
+ {
+ if (sizeof (intmax_t) > sizeof (long))
+ {
+ /* intmax_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (intmax_t) > sizeof (int))
+ {
+ /* intmax_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 'z' || *cp == 'Z')
+ {
+ /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+ because the warning facility in gcc-2.95.2 understands
+ only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784). */
+ if (sizeof (size_t) > sizeof (long))
+ {
+ /* size_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (size_t) > sizeof (int))
+ {
+ /* size_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+ else if (*cp == 't')
+ {
+ if (sizeof (ptrdiff_t) > sizeof (long))
+ {
+ /* ptrdiff_t = long long */
+ flags += 16;
+ }
+ else if (sizeof (ptrdiff_t) > sizeof (int))
+ {
+ /* ptrdiff_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#if defined __APPLE__ && defined __MACH__
+ /* On Mac OS X 10.3, PRIdMAX is defined as "qd".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'q')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* int64_t = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* int64_t = long */
+ flags += 8;
+ }
+ cp++;
+ }
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+ /* On native Windows, PRIdMAX is defined as "I64d".
+ We cannot change it to "lld" because PRIdMAX must also
+ be understood by the system's printf routines. */
+ else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
+ {
+ if (64 / 8 > sizeof (long))
+ {
+ /* __int64 = long long */
+ flags += 16;
+ }
+ else
+ {
+ /* __int64 = long */
+ flags += 8;
+ }
+ cp += 3;
+ }
+#endif
+ else
+ break;
+ }
+
+ /* Read the conversion character. */
+ c = *cp++;
+ switch (c)
+ {
+ case 'd': case 'i':
+ /* If 'long long' is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGLONGINT;
+ else
+ /* If 'long long' is the same as 'long', we parse "lld" into
+ TYPE_LONGINT. */
+ if (flags >= 8)
+ type = TYPE_LONGINT;
+ else if (flags & 2)
+ type = TYPE_SCHAR;
+ else if (flags & 1)
+ type = TYPE_SHORT;
+ else
+ type = TYPE_INT;
+ break;
+ case 'o': case 'u': case 'x': case 'X':
+ /* If 'unsigned long long' is larger than 'unsigned long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_ULONGLONGINT;
+ else
+ /* If 'unsigned long long' is the same as 'unsigned long', we
+ parse "llu" into TYPE_ULONGINT. */
+ if (flags >= 8)
+ type = TYPE_ULONGINT;
+ else if (flags & 2)
+ type = TYPE_UCHAR;
+ else if (flags & 1)
+ type = TYPE_USHORT;
+ else
+ type = TYPE_UINT;
+ break;
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_LONGDOUBLE;
+ else
+ type = TYPE_DOUBLE;
+ break;
+ case 'c':
+ if (flags >= 8)
+#if HAVE_WINT_T
+ type = TYPE_WIDE_CHAR;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_CHAR;
+ break;
+#if HAVE_WINT_T
+ case 'C':
+ type = TYPE_WIDE_CHAR;
+ c = 'c';
+ break;
+#endif
+ case 's':
+ if (flags >= 8)
+#if HAVE_WCHAR_T
+ type = TYPE_WIDE_STRING;
+#else
+ goto error;
+#endif
+ else
+ type = TYPE_STRING;
+ break;
+#if HAVE_WCHAR_T
+ case 'S':
+ type = TYPE_WIDE_STRING;
+ c = 's';
+ break;
+#endif
+ case 'p':
+ type = TYPE_POINTER;
+ break;
+ case 'n':
+ /* If 'long long' is larger than 'long': */
+ if (flags >= 16 || (flags & 4))
+ type = TYPE_COUNT_LONGLONGINT_POINTER;
+ else
+ /* If 'long long' is the same as 'long', we parse "lln" into
+ TYPE_COUNT_LONGINT_POINTER. */
+ if (flags >= 8)
+ type = TYPE_COUNT_LONGINT_POINTER;
+ else if (flags & 2)
+ type = TYPE_COUNT_SCHAR_POINTER;
+ else if (flags & 1)
+ type = TYPE_COUNT_SHORT_POINTER;
+ else
+ type = TYPE_COUNT_INT_POINTER;
+ break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case 'U':
+ if (flags >= 16)
+ type = TYPE_U32_STRING;
+ else if (flags >= 8)
+ type = TYPE_U16_STRING;
+ else
+ type = TYPE_U8_STRING;
+ break;
+#endif
+ case '%':
+ type = TYPE_NONE;
+ break;
+ default:
+ /* Unknown conversion character. */
+ goto error;
+ }
+ }
+
+ if (type != TYPE_NONE)
+ {
+ dp->arg_index = arg_index;
+ if (dp->arg_index == ARG_NONE)
+ {
+ dp->arg_index = arg_posn++;
+ if (dp->arg_index == ARG_NONE)
+ /* arg_posn wrapped around. */
+ goto error;
+ }
+ REGISTER_ARG (dp->arg_index, type);
+ }
+ dp->conversion = c;
+ dp->dir_end = cp;
+ }
+
+ d->count++;
+ if (d->count >= d_allocated)
+ {
+ size_t memory_size;
+ DIRECTIVE *memory;
+
+ d_allocated = xtimes (d_allocated, 2);
+ memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+ if (size_overflow_p (memory_size))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
+ ? realloc (d->dir, memory_size)
+ : malloc (memory_size));
+ if (memory == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ if (d->dir == d->direct_alloc_dir)
+ memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
+ d->dir = memory;
+ }
+ }
+#if CHAR_T_ONLY_ASCII
+ else if (!c_isascii (c))
+ {
+ /* Non-ASCII character. Not supported. */
+ goto error;
+ }
+#endif
+ }
+ d->dir[d->count].dir_start = cp;
+
+ d->max_width_length = max_width_length;
+ d->max_precision_length = max_precision_length;
+ return 0;
+
+error:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = EINVAL;
+ return -1;
+
+out_of_memory:
+ if (a->arg != a->direct_alloc_arg)
+ free (a->arg);
+ if (d->dir != d->direct_alloc_dir)
+ free (d->dir);
+ errno = ENOMEM;
+ return -1;
+}
+
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
+#undef CHAR_T
diff --git a/lib/printf-parse.h b/lib/printf-parse.h
new file mode 100644
index 0000000..34b91f4
--- /dev/null
+++ b/lib/printf-parse.h
@@ -0,0 +1,193 @@
+/* Parse printf format string.
+ Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+/* This file can be parametrized with the following macros:
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ STATIC Set to 'static' to declare the function static. */
+
+#if HAVE_FEATURES_H
+# include <features.h> /* for __GLIBC__, __UCLIBC__ */
+#endif
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP 1 /* ' flag */
+#define FLAG_LEFT 2 /* - flag */
+#define FLAG_SHOWSIGN 4 /* + flag */
+#define FLAG_SPACE 8 /* space flag */
+#define FLAG_ALT 16 /* # flag */
+#define FLAG_ZERO 32
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
+#endif
+
+/* arg_index value indicating that no argument is consumed. */
+#define ARG_NONE (~(size_t)0)
+
+/* xxx_directive: A parsed directive.
+ xxx_directives: A parsed format string. */
+
+/* Number of directly allocated directives (no malloc() needed). */
+#define N_DIRECT_ALLOC_DIRECTIVES 7
+
+/* A parsed directive. */
+typedef struct
+{
+ const char* dir_start;
+ const char* dir_end;
+ int flags;
+ const char* width_start;
+ const char* width_end;
+ size_t width_arg_index;
+ const char* precision_start;
+ const char* precision_end;
+ size_t precision_arg_index;
+ char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ char_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+char_directives;
+
+#if ENABLE_UNISTDIO
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint8_t* dir_start;
+ const uint8_t* dir_end;
+ int flags;
+ const uint8_t* width_start;
+ const uint8_t* width_end;
+ size_t width_arg_index;
+ const uint8_t* precision_start;
+ const uint8_t* precision_end;
+ size_t precision_arg_index;
+ uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u8_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u8_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u8_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint16_t* dir_start;
+ const uint16_t* dir_end;
+ int flags;
+ const uint16_t* width_start;
+ const uint16_t* width_end;
+ size_t width_arg_index;
+ const uint16_t* precision_start;
+ const uint16_t* precision_end;
+ size_t precision_arg_index;
+ uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u16_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u16_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u16_directives;
+
+/* A parsed directive. */
+typedef struct
+{
+ const uint32_t* dir_start;
+ const uint32_t* dir_end;
+ int flags;
+ const uint32_t* width_start;
+ const uint32_t* width_end;
+ size_t width_arg_index;
+ const uint32_t* precision_start;
+ const uint32_t* precision_end;
+ size_t precision_arg_index;
+ uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
+ size_t arg_index;
+}
+u32_directive;
+
+/* A parsed format string. */
+typedef struct
+{
+ size_t count;
+ u32_directive *dir;
+ size_t max_width_length;
+ size_t max_precision_length;
+ u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
+}
+u32_directives;
+
+#endif
+
+
+/* Parses the format string. Fills in the number N of directives, and fills
+ in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+ to the end of the format string. Also fills in the arg_type fields of the
+ arguments and the needed count of arguments. */
+#if ENABLE_UNISTDIO
+extern int
+ ulc_printf_parse (const char *format, char_directives *d, arguments *a);
+extern int
+ u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
+extern int
+ u16_printf_parse (const uint16_t *format, u16_directives *d,
+ arguments *a);
+extern int
+ u32_printf_parse (const uint32_t *format, u32_directives *d,
+ arguments *a);
+#else
+# ifdef STATIC
+STATIC
+# else
+extern
+# endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+#endif
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/lib/quote.h b/lib/quote.h
new file mode 100644
index 0000000..391ff1a
--- /dev/null
+++ b/lib/quote.h
@@ -0,0 +1,46 @@
+/* quote.h - prototypes for quote.c
+
+ Copyright (C) 1998-2001, 2003, 2009-2020 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/>. */
+
+#ifndef QUOTE_H_
+# define QUOTE_H_ 1
+
+# include <stddef.h>
+
+/* The quoting options used by quote_n and quote. Its type is incomplete,
+ so it's useful only in expressions like '&quote_quoting_options'. */
+extern struct quoting_options quote_quoting_options;
+
+/* Return an unambiguous printable representation of ARG (of size
+ ARGSIZE), allocated in slot N, suitable for diagnostics. If
+ ARGSIZE is SIZE_MAX, use the string length of the argument for
+ ARGSIZE. */
+char const *quote_n_mem (int n, char const *arg, size_t argsize);
+
+/* Return an unambiguous printable representation of ARG (of size
+ ARGSIZE), suitable for diagnostics. If ARGSIZE is SIZE_MAX, use
+ the string length of the argument for ARGSIZE. */
+char const *quote_mem (char const *arg, size_t argsize);
+
+/* Return an unambiguous printable representation of ARG, allocated in
+ slot N, suitable for diagnostics. */
+char const *quote_n (int n, char const *arg);
+
+/* Return an unambiguous printable representation of ARG, suitable for
+ diagnostics. */
+char const *quote (char const *arg);
+
+#endif /* !QUOTE_H_ */
diff --git a/lib/quotearg.c b/lib/quotearg.c
new file mode 100644
index 0000000..b13574d
--- /dev/null
+++ b/lib/quotearg.c
@@ -0,0 +1,1082 @@
+/* quotearg.c - quote arguments for output
+
+ Copyright (C) 1998-2002, 2004-2020 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+/* Without this pragma, gcc 4.7.0 20111124 mistakenly suggests that
+ the quoting_options_from_style function might be candidate for
+ attribute 'pure' */
+#if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
+# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+#endif
+
+#include <config.h>
+
+#include "quotearg.h"
+#include "quote.h"
+
+#include "attribute.h"
+#include "minmax.h"
+#include "xalloc.h"
+#include "c-strcaseeq.h"
+#include "localcharset.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define INT_BITS (sizeof (int) * CHAR_BIT)
+
+struct quoting_options
+{
+ /* Basic quoting style. */
+ enum quoting_style style;
+
+ /* Additional flags. Bitwise combination of enum quoting_flags. */
+ int flags;
+
+ /* Quote the characters indicated by this bit vector even if the
+ quoting style would not normally require them to be quoted. */
+ unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
+
+ /* The left quote for custom_quoting_style. */
+ char const *left_quote;
+
+ /* The right quote for custom_quoting_style. */
+ char const *right_quote;
+};
+
+/* Names of quoting styles. */
+char const *const quoting_style_args[] =
+{
+ "literal",
+ "shell",
+ "shell-always",
+ "shell-escape",
+ "shell-escape-always",
+ "c",
+ "c-maybe",
+ "escape",
+ "locale",
+ "clocale",
+ 0
+};
+
+/* Correspondences to quoting style names. */
+enum quoting_style const quoting_style_vals[] =
+{
+ literal_quoting_style,
+ shell_quoting_style,
+ shell_always_quoting_style,
+ shell_escape_quoting_style,
+ shell_escape_always_quoting_style,
+ c_quoting_style,
+ c_maybe_quoting_style,
+ escape_quoting_style,
+ locale_quoting_style,
+ clocale_quoting_style
+};
+
+/* The default quoting options. */
+static struct quoting_options default_quoting_options;
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *
+clone_quoting_options (struct quoting_options *o)
+{
+ int e = errno;
+ struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
+ sizeof *o);
+ errno = e;
+ return p;
+}
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style
+get_quoting_style (struct quoting_options const *o)
+{
+ return (o ? o : &default_quoting_options)->style;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void
+set_quoting_style (struct quoting_options *o, enum quoting_style s)
+{
+ (o ? o : &default_quoting_options)->style = s;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). */
+int
+set_char_quoting (struct quoting_options *o, char c, int i)
+{
+ unsigned char uc = c;
+ unsigned int *p =
+ (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
+ int shift = uc % INT_BITS;
+ int r = (*p >> shift) & 1;
+ *p ^= ((i & 1) ^ r) << shift;
+ return r;
+}
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int
+set_quoting_flags (struct quoting_options *o, int i)
+{
+ int r;
+ if (!o)
+ o = &default_quoting_options;
+ r = o->flags;
+ o->flags = i;
+ return r;
+}
+
+void
+set_custom_quoting (struct quoting_options *o,
+ char const *left_quote, char const *right_quote)
+{
+ if (!o)
+ o = &default_quoting_options;
+ o->style = custom_quoting_style;
+ if (!left_quote || !right_quote)
+ abort ();
+ o->left_quote = left_quote;
+ o->right_quote = right_quote;
+}
+
+/* Return quoting options for STYLE, with no extra quoting. */
+static struct quoting_options /* NOT PURE!! */
+quoting_options_from_style (enum quoting_style style)
+{
+ struct quoting_options o = { literal_quoting_style, 0, { 0 }, NULL, NULL };
+ if (style == custom_quoting_style)
+ abort ();
+ o.style = style;
+ return o;
+}
+
+/* MSGID approximates a quotation mark. Return its translation if it
+ has one; otherwise, return either it or "\"", depending on S.
+
+ S is either clocale_quoting_style or locale_quoting_style. */
+static char const *
+gettext_quote (char const *msgid, enum quoting_style s)
+{
+ char const *translation = _(msgid);
+ char const *locale_code;
+
+ if (translation != msgid)
+ return translation;
+
+ /* For UTF-8 and GB-18030, use single quotes U+2018 and U+2019.
+ Here is a list of other locales that include U+2018 and U+2019:
+
+ ISO-8859-7 0xA1 KOI8-T 0x91
+ CP869 0x8B CP874 0x91
+ CP932 0x81 0x65 CP936 0xA1 0xAE
+ CP949 0xA1 0xAE CP950 0xA1 0xA5
+ CP1250 0x91 CP1251 0x91
+ CP1252 0x91 CP1253 0x91
+ CP1254 0x91 CP1255 0x91
+ CP1256 0x91 CP1257 0x91
+ EUC-JP 0xA1 0xC6 EUC-KR 0xA1 0xAE
+ EUC-TW 0xA1 0xE4 BIG5 0xA1 0xA5
+ BIG5-HKSCS 0xA1 0xA5 EUC-CN 0xA1 0xAE
+ GBK 0xA1 0xAE Georgian-PS 0x91
+ PT154 0x91
+
+ None of these is still in wide use; using iconv is overkill. */
+ locale_code = locale_charset ();
+ if (STRCASEEQ (locale_code, "UTF-8", 'U','T','F','-','8',0,0,0,0))
+ return msgid[0] == '`' ? "\xe2\x80\x98": "\xe2\x80\x99";
+ if (STRCASEEQ (locale_code, "GB18030", 'G','B','1','8','0','3','0',0,0))
+ return msgid[0] == '`' ? "\xa1\ae": "\xa1\xaf";
+
+ return (s == clocale_quoting_style ? "\"" : "'");
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using QUOTING_STYLE, FLAGS, and
+ QUOTE_THESE_TOO to control quoting.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
+
+ This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
+ ARGSIZE, O), except it breaks O into its component pieces and is
+ not careful about errno. */
+
+static size_t
+quotearg_buffer_restyled (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ enum quoting_style quoting_style, int flags,
+ unsigned int const *quote_these_too,
+ char const *left_quote,
+ char const *right_quote)
+{
+ size_t i;
+ size_t len = 0;
+ size_t orig_buffersize = 0;
+ char const *quote_string = 0;
+ size_t quote_string_len = 0;
+ bool backslash_escapes = false;
+ bool unibyte_locale = MB_CUR_MAX == 1;
+ bool elide_outer_quotes = (flags & QA_ELIDE_OUTER_QUOTES) != 0;
+ bool pending_shell_escape_end = false;
+ bool encountered_single_quote = false;
+ bool all_c_and_shell_quote_compat = true;
+
+#define STORE(c) \
+ do \
+ { \
+ if (len < buffersize) \
+ buffer[len] = (c); \
+ len++; \
+ } \
+ while (0)
+
+#define START_ESC() \
+ do \
+ { \
+ if (elide_outer_quotes) \
+ goto force_outer_quoting_style; \
+ escaping = true; \
+ if (quoting_style == shell_always_quoting_style \
+ && ! pending_shell_escape_end) \
+ { \
+ STORE ('\''); \
+ STORE ('$'); \
+ STORE ('\''); \
+ pending_shell_escape_end = true; \
+ } \
+ STORE ('\\'); \
+ } \
+ while (0)
+
+#define END_ESC() \
+ do \
+ { \
+ if (pending_shell_escape_end && ! escaping) \
+ { \
+ STORE ('\''); \
+ STORE ('\''); \
+ pending_shell_escape_end = false; \
+ } \
+ } \
+ while (0)
+
+ process_input:
+
+ switch (quoting_style)
+ {
+ case c_maybe_quoting_style:
+ quoting_style = c_quoting_style;
+ elide_outer_quotes = true;
+ FALLTHROUGH;
+ case c_quoting_style:
+ if (!elide_outer_quotes)
+ STORE ('"');
+ backslash_escapes = true;
+ quote_string = "\"";
+ quote_string_len = 1;
+ break;
+
+ case escape_quoting_style:
+ backslash_escapes = true;
+ elide_outer_quotes = false;
+ break;
+
+ case locale_quoting_style:
+ case clocale_quoting_style:
+ case custom_quoting_style:
+ {
+ if (quoting_style != custom_quoting_style)
+ {
+ /* TRANSLATORS:
+ Get translations for open and closing quotation marks.
+ The message catalog should translate "`" to a left
+ quotation mark suitable for the locale, and similarly for
+ "'". For example, a French Unicode local should translate
+ these to U+00AB (LEFT-POINTING DOUBLE ANGLE
+ QUOTATION MARK), and U+00BB (RIGHT-POINTING DOUBLE ANGLE
+ QUOTATION MARK), respectively.
+
+ If the catalog has no translation, we will try to
+ use Unicode U+2018 (LEFT SINGLE QUOTATION MARK) and
+ Unicode U+2019 (RIGHT SINGLE QUOTATION MARK). If the
+ current locale is not Unicode, locale_quoting_style
+ will quote 'like this', and clocale_quoting_style will
+ quote "like this". You should always include translations
+ for "`" and "'" even if U+2018 and U+2019 are appropriate
+ for your locale.
+
+ If you don't know what to put here, please see
+ <https://en.wikipedia.org/wiki/Quotation_marks_in_other_languages>
+ and use glyphs suitable for your language. */
+ left_quote = gettext_quote (N_("`"), quoting_style);
+ right_quote = gettext_quote (N_("'"), quoting_style);
+ }
+ if (!elide_outer_quotes)
+ for (quote_string = left_quote; *quote_string; quote_string++)
+ STORE (*quote_string);
+ backslash_escapes = true;
+ quote_string = right_quote;
+ quote_string_len = strlen (quote_string);
+ }
+ break;
+
+ case shell_escape_quoting_style:
+ backslash_escapes = true;
+ FALLTHROUGH;
+ case shell_quoting_style:
+ elide_outer_quotes = true;
+ FALLTHROUGH;
+ case shell_escape_always_quoting_style:
+ if (!elide_outer_quotes)
+ backslash_escapes = true;
+ FALLTHROUGH;
+ case shell_always_quoting_style:
+ quoting_style = shell_always_quoting_style;
+ if (!elide_outer_quotes)
+ STORE ('\'');
+ quote_string = "'";
+ quote_string_len = 1;
+ break;
+
+ case literal_quoting_style:
+ elide_outer_quotes = false;
+ break;
+
+ default:
+ abort ();
+ }
+
+ for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++)
+ {
+ unsigned char c;
+ unsigned char esc;
+ bool is_right_quote = false;
+ bool escaping = false;
+ bool c_and_shell_quote_compat = false;
+
+ if (backslash_escapes
+ && quoting_style != shell_always_quoting_style
+ && quote_string_len
+ && (i + quote_string_len
+ <= (argsize == SIZE_MAX && 1 < quote_string_len
+ /* Use strlen only if we must: when argsize is SIZE_MAX,
+ and when the quote string is more than 1 byte long.
+ If we do call strlen, save the result. */
+ ? (argsize = strlen (arg)) : argsize))
+ && memcmp (arg + i, quote_string, quote_string_len) == 0)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ is_right_quote = true;
+ }
+
+ c = arg[i];
+ switch (c)
+ {
+ case '\0':
+ if (backslash_escapes)
+ {
+ START_ESC ();
+ /* If quote_string were to begin with digits, we'd need to
+ test for the end of the arg as well. However, it's
+ hard to imagine any locale that would use digits in
+ quotes, and set_custom_quoting is documented not to
+ accept them. Use only a single \0 with shell-escape
+ as currently digits are not printed within $'...' */
+ if (quoting_style != shell_always_quoting_style
+ && i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
+ {
+ STORE ('0');
+ STORE ('0');
+ }
+ c = '0';
+ /* We don't have to worry that this last '0' will be
+ backslash-escaped because, again, quote_string should
+ not start with it and because quote_these_too is
+ documented as not accepting it. */
+ }
+ else if (flags & QA_ELIDE_NULL_BYTES)
+ continue;
+ break;
+
+ case '?':
+ switch (quoting_style)
+ {
+ case shell_always_quoting_style:
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case c_quoting_style:
+ if ((flags & QA_SPLIT_TRIGRAPHS)
+ && i + 2 < argsize && arg[i + 1] == '?')
+ switch (arg[i + 2])
+ {
+ case '!': case '\'':
+ case '(': case ')': case '-': case '/':
+ case '<': case '=': case '>':
+ /* Escape the second '?' in what would otherwise be
+ a trigraph. */
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ c = arg[i + 2];
+ i += 2;
+ STORE ('?');
+ STORE ('"');
+ STORE ('"');
+ STORE ('?');
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case '\a': esc = 'a'; goto c_escape;
+ case '\b': esc = 'b'; goto c_escape;
+ case '\f': esc = 'f'; goto c_escape;
+ case '\n': esc = 'n'; goto c_and_shell_escape;
+ case '\r': esc = 'r'; goto c_and_shell_escape;
+ case '\t': esc = 't'; goto c_and_shell_escape;
+ case '\v': esc = 'v'; goto c_escape;
+ case '\\': esc = c;
+ /* Never need to escape '\' in shell case. */
+ if (quoting_style == shell_always_quoting_style)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+ goto store_c;
+ }
+
+ /* No need to escape the escape if we are trying to elide
+ outer quotes and nothing else is problematic. */
+ if (backslash_escapes && elide_outer_quotes && quote_string_len)
+ goto store_c;
+
+ c_and_shell_escape:
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ /* fall through */
+ c_escape:
+ if (backslash_escapes)
+ {
+ c = esc;
+ goto store_escape;
+ }
+ break;
+
+ case '{': case '}': /* sometimes special if isolated */
+ if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
+ break;
+ FALLTHROUGH;
+ case '#': case '~':
+ if (i != 0)
+ break;
+ FALLTHROUGH;
+ case ' ':
+ c_and_shell_quote_compat = true;
+ FALLTHROUGH;
+ case '!': /* special in bash */
+ case '"': case '$': case '&':
+ case '(': case ')': case '*': case ';':
+ case '<':
+ case '=': /* sometimes special in 0th or (with "set -k") later args */
+ case '>': case '[':
+ case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
+ case '`': case '|':
+ /* A shell special character. In theory, '$' and '`' could
+ be the first bytes of multibyte characters, which means
+ we should check them with mbrtowc, but in practice this
+ doesn't happen so it's not worth worrying about. */
+ if (quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+ break;
+
+ case '\'':
+ encountered_single_quote = true;
+ c_and_shell_quote_compat = true;
+ if (quoting_style == shell_always_quoting_style)
+ {
+ if (elide_outer_quotes)
+ goto force_outer_quoting_style;
+
+ if (buffersize && ! orig_buffersize)
+ {
+ /* Just scan string to see if supports a more concise
+ representation, rather than writing a longer string
+ but returning the length of the more concise form. */
+ orig_buffersize = buffersize;
+ buffersize = 0;
+ }
+
+ STORE ('\'');
+ STORE ('\\');
+ STORE ('\'');
+ pending_shell_escape_end = false;
+ }
+ break;
+
+ case '%': case '+': case ',': case '-': case '.': case '/':
+ case '0': case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9': case ':':
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+ case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+ case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+ case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
+ case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
+ case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
+ case 'o': case 'p': case 'q': case 'r': case 's': case 't':
+ case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
+ /* These characters don't cause problems, no matter what the
+ quoting style is. They cannot start multibyte sequences.
+ A digit or a special letter would cause trouble if it
+ appeared at the beginning of quote_string because we'd then
+ escape by prepending a backslash. However, it's hard to
+ imagine any locale that would use digits or letters as
+ quotes, and set_custom_quoting is documented not to accept
+ them. Also, a digit or a special letter would cause
+ trouble if it appeared in quote_these_too, but that's also
+ documented as not accepting them. */
+ c_and_shell_quote_compat = true;
+ break;
+
+ default:
+ /* If we have a multibyte sequence, copy it until we reach
+ its end, find an error, or come back to the initial shift
+ state. For C-like styles, if the sequence has
+ unprintable characters, escape the whole sequence, since
+ we can't easily escape single characters within it. */
+ {
+ /* Length of multibyte sequence found so far. */
+ size_t m;
+
+ bool printable;
+
+ if (unibyte_locale)
+ {
+ m = 1;
+ printable = isprint (c) != 0;
+ }
+ else
+ {
+ mbstate_t mbstate;
+ memset (&mbstate, 0, sizeof mbstate);
+
+ m = 0;
+ printable = true;
+ if (argsize == SIZE_MAX)
+ argsize = strlen (arg);
+
+ do
+ {
+ wchar_t w;
+ size_t bytes = mbrtowc (&w, &arg[i + m],
+ argsize - (i + m), &mbstate);
+ if (bytes == 0)
+ break;
+ else if (bytes == (size_t) -1)
+ {
+ printable = false;
+ break;
+ }
+ else if (bytes == (size_t) -2)
+ {
+ printable = false;
+ while (i + m < argsize && arg[i + m])
+ m++;
+ break;
+ }
+ else
+ {
+ /* Work around a bug with older shells that "see" a '\'
+ that is really the 2nd byte of a multibyte character.
+ In practice the problem is limited to ASCII
+ chars >= '@' that are shell special chars. */
+ if ('[' == 0x5b && elide_outer_quotes
+ && quoting_style == shell_always_quoting_style)
+ {
+ size_t j;
+ for (j = 1; j < bytes; j++)
+ switch (arg[i + m + j])
+ {
+ case '[': case '\\': case '^':
+ case '`': case '|':
+ goto force_outer_quoting_style;
+
+ default:
+ break;
+ }
+ }
+
+ if (! iswprint (w))
+ printable = false;
+ m += bytes;
+ }
+ }
+ while (! mbsinit (&mbstate));
+ }
+
+ c_and_shell_quote_compat = printable;
+
+ if (1 < m || (backslash_escapes && ! printable))
+ {
+ /* Output a multibyte sequence, or an escaped
+ unprintable unibyte character. */
+ size_t ilim = i + m;
+
+ for (;;)
+ {
+ if (backslash_escapes && ! printable)
+ {
+ START_ESC ();
+ STORE ('0' + (c >> 6));
+ STORE ('0' + ((c >> 3) & 7));
+ c = '0' + (c & 7);
+ }
+ else if (is_right_quote)
+ {
+ STORE ('\\');
+ is_right_quote = false;
+ }
+ if (ilim <= i + 1)
+ break;
+ END_ESC ();
+ STORE (c);
+ c = arg[++i];
+ }
+
+ goto store_c;
+ }
+ }
+ }
+
+ if (! (((backslash_escapes && quoting_style != shell_always_quoting_style)
+ || elide_outer_quotes)
+ && quote_these_too
+ && quote_these_too[c / INT_BITS] >> (c % INT_BITS) & 1)
+ && !is_right_quote)
+ goto store_c;
+
+ store_escape:
+ START_ESC ();
+
+ store_c:
+ END_ESC ();
+ STORE (c);
+
+ if (! c_and_shell_quote_compat)
+ all_c_and_shell_quote_compat = false;
+ }
+
+ if (len == 0 && quoting_style == shell_always_quoting_style
+ && elide_outer_quotes)
+ goto force_outer_quoting_style;
+
+ /* Single shell quotes (') are commonly enough used as an apostrophe,
+ that we attempt to minimize the quoting in this case. Note itʼs
+ better to use the apostrophe modifier "\u02BC" if possible, as that
+ renders better and works with the word match regex \W+ etc. */
+ if (quoting_style == shell_always_quoting_style && ! elide_outer_quotes
+ && encountered_single_quote)
+ {
+ if (all_c_and_shell_quote_compat)
+ return quotearg_buffer_restyled (buffer, orig_buffersize, arg, argsize,
+ c_quoting_style,
+ flags, quote_these_too,
+ left_quote, right_quote);
+ else if (! buffersize && orig_buffersize)
+ {
+ /* Disable read-only scan, and reprocess to write quoted string. */
+ buffersize = orig_buffersize;
+ len = 0;
+ goto process_input;
+ }
+ }
+
+ if (quote_string && !elide_outer_quotes)
+ for (; *quote_string; quote_string++)
+ STORE (*quote_string);
+
+ if (len < buffersize)
+ buffer[len] = '\0';
+ return len;
+
+ force_outer_quoting_style:
+ /* Don't reuse quote_these_too, since the addition of outer quotes
+ sufficiently quotes the specified characters. */
+ if (quoting_style == shell_always_quoting_style && backslash_escapes)
+ quoting_style = shell_escape_always_quoting_style;
+ return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ quoting_style,
+ flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
+ left_quote, right_quote);
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is SIZE_MAX, use the string length of the argument for
+ ARGSIZE. */
+size_t
+quotearg_buffer (char *buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+ p->style, p->flags, p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ return r;
+}
+
+/* Equivalent to quotearg_alloc (ARG, ARGSIZE, NULL, O). */
+char *
+quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o)
+{
+ return quotearg_alloc_mem (arg, argsize, NULL, o);
+}
+
+/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
+ allocated storage containing the quoted string, and store the
+ resulting size into *SIZE, if non-NULL. The result can contain
+ embedded null bytes only if ARGSIZE is not SIZE_MAX, SIZE is not
+ NULL, and set_quoting_flags has not set the null byte elision
+ flag. */
+char *
+quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
+ struct quoting_options const *o)
+{
+ struct quoting_options const *p = o ? o : &default_quoting_options;
+ int e = errno;
+ /* Elide embedded null bytes if we can't return a size. */
+ int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
+ size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
+ flags, p->quote_these_too,
+ p->left_quote,
+ p->right_quote) + 1;
+ char *buf = xcharalloc (bufsize);
+ quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
+ p->quote_these_too,
+ p->left_quote, p->right_quote);
+ errno = e;
+ if (size)
+ *size = bufsize - 1;
+ return buf;
+}
+
+/* A storage slot with size and pointer to a value. */
+struct slotvec
+{
+ size_t size;
+ char *val;
+};
+
+/* Preallocate a slot 0 buffer, so that the caller can always quote
+ one small component of a "memory exhausted" message in slot 0. */
+static char slot0[256];
+static int nslots = 1;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+ struct slotvec *sv = slotvec;
+ int i;
+ for (i = 1; i < nslots; i++)
+ free (sv[i].val);
+ if (sv[0].val != slot0)
+ {
+ free (sv[0].val);
+ slotvec0.size = sizeof slot0;
+ slotvec0.val = slot0;
+ }
+ if (sv != &slotvec0)
+ {
+ free (sv);
+ slotvec = &slotvec0;
+ }
+ nslots = 1;
+}
+
+/* Use storage slot N to return a quoted version of argument ARG.
+ ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
+ null-terminated string.
+ OPTIONS specifies the quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. N is deliberately declared with type "int"
+ to allow for future extensions (using negative values). */
+static char *
+quotearg_n_options (int n, char const *arg, size_t argsize,
+ struct quoting_options const *options)
+{
+ int e = errno;
+
+ struct slotvec *sv = slotvec;
+
+ if (n < 0)
+ abort ();
+
+ if (nslots <= n)
+ {
+ bool preallocated = (sv == &slotvec0);
+ int nmax = MIN (INT_MAX, MIN (PTRDIFF_MAX, SIZE_MAX) / sizeof *sv) - 1;
+
+ if (nmax < n)
+ xalloc_die ();
+
+ slotvec = sv = xrealloc (preallocated ? NULL : sv, (n + 1) * sizeof *sv);
+ if (preallocated)
+ *sv = slotvec0;
+ memset (sv + nslots, 0, (n + 1 - nslots) * sizeof *sv);
+ nslots = n + 1;
+ }
+
+ {
+ size_t size = sv[n].size;
+ char *val = sv[n].val;
+ /* Elide embedded null bytes since we don't return a size. */
+ int flags = options->flags | QA_ELIDE_NULL_BYTES;
+ size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
+ options->style, flags,
+ options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+
+ if (size <= qsize)
+ {
+ sv[n].size = size = qsize + 1;
+ if (val != slot0)
+ free (val);
+ sv[n].val = val = xcharalloc (size);
+ quotearg_buffer_restyled (val, size, arg, argsize, options->style,
+ flags, options->quote_these_too,
+ options->left_quote,
+ options->right_quote);
+ }
+
+ errno = e;
+ return val;
+ }
+}
+
+char *
+quotearg_n (int n, char const *arg)
+{
+ return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
+}
+
+char *
+quotearg_n_mem (int n, char const *arg, size_t argsize)
+{
+ return quotearg_n_options (n, arg, argsize, &default_quoting_options);
+}
+
+char *
+quotearg (char const *arg)
+{
+ return quotearg_n (0, arg);
+}
+
+char *
+quotearg_mem (char const *arg, size_t argsize)
+{
+ return quotearg_n_mem (0, arg, argsize);
+}
+
+char *
+quotearg_n_style (int n, enum quoting_style s, char const *arg)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, SIZE_MAX, &o);
+}
+
+char *
+quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options const o = quoting_options_from_style (s);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_style (enum quoting_style s, char const *arg)
+{
+ return quotearg_n_style (0, s, arg);
+}
+
+char *
+quotearg_style_mem (enum quoting_style s, char const *arg, size_t argsize)
+{
+ return quotearg_n_style_mem (0, s, arg, argsize);
+}
+
+char *
+quotearg_char_mem (char const *arg, size_t argsize, char ch)
+{
+ struct quoting_options options;
+ options = default_quoting_options;
+ set_char_quoting (&options, ch, 1);
+ return quotearg_n_options (0, arg, argsize, &options);
+}
+
+char *
+quotearg_char (char const *arg, char ch)
+{
+ return quotearg_char_mem (arg, SIZE_MAX, ch);
+}
+
+char *
+quotearg_colon (char const *arg)
+{
+ return quotearg_char (arg, ':');
+}
+
+char *
+quotearg_colon_mem (char const *arg, size_t argsize)
+{
+ return quotearg_char_mem (arg, argsize, ':');
+}
+
+char *
+quotearg_n_style_colon (int n, enum quoting_style s, char const *arg)
+{
+ struct quoting_options options;
+ options = quoting_options_from_style (s);
+ set_char_quoting (&options, ':', 1);
+ return quotearg_n_options (n, arg, SIZE_MAX, &options);
+}
+
+char *
+quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg)
+{
+ return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
+ SIZE_MAX);
+}
+
+char *
+quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ struct quoting_options o = default_quoting_options;
+ set_custom_quoting (&o, left_quote, right_quote);
+ return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg)
+{
+ return quotearg_n_custom (0, left_quote, right_quote, arg);
+}
+
+char *
+quotearg_custom_mem (char const *left_quote, char const *right_quote,
+ char const *arg, size_t argsize)
+{
+ return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
+ argsize);
+}
+
+
+/* The quoting option used by the functions of quote.h. */
+struct quoting_options quote_quoting_options =
+ {
+ locale_quoting_style,
+ 0,
+ { 0 },
+ NULL, NULL
+ };
+
+char const *
+quote_n_mem (int n, char const *arg, size_t argsize)
+{
+ return quotearg_n_options (n, arg, argsize, &quote_quoting_options);
+}
+
+char const *
+quote_mem (char const *arg, size_t argsize)
+{
+ return quote_n_mem (0, arg, argsize);
+}
+
+char const *
+quote_n (int n, char const *arg)
+{
+ return quote_n_mem (n, arg, SIZE_MAX);
+}
+
+char const *
+quote (char const *arg)
+{
+ return quote_n (0, arg);
+}
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/quotearg.h b/lib/quotearg.h
new file mode 100644
index 0000000..3bf149b
--- /dev/null
+++ b/lib/quotearg.h
@@ -0,0 +1,425 @@
+/* quotearg.h - quote arguments for output
+
+ Copyright (C) 1998-2002, 2004, 2006, 2008-2020 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/>. */
+
+/* Written by Paul Eggert <eggert@twinsun.com> */
+
+#ifndef QUOTEARG_H_
+# define QUOTEARG_H_ 1
+
+# include <stddef.h>
+
+/* Basic quoting styles. For each style, an example is given on the
+ input strings "simple", "\0 \t\n'\"\033?""?/\\", and "a:b", using
+ quotearg_buffer, quotearg_mem, and quotearg_colon_mem with that
+ style and the default flags and quoted characters. Note that the
+ examples are shown here as valid C strings rather than what
+ displays on a terminal (with "??/" as a trigraph for "\\"). */
+enum quoting_style
+ {
+ /* Output names as-is (ls --quoting-style=literal). Can result in
+ embedded null bytes if QA_ELIDE_NULL_BYTES is not in
+ effect.
+
+ quotearg_buffer:
+ "simple", "\0 \t\n'\"\033??/\\", "a:b"
+ quotearg:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ quotearg_colon:
+ "simple", " \t\n'\"\033??/\\", "a:b"
+ */
+ literal_quoting_style,
+
+ /* Quote names for the shell if they contain shell metacharacters
+ or would cause ambiguous output (ls --quoting-style=shell).
+ Can result in embedded null bytes if QA_ELIDE_NULL_BYTES is not
+ in effect.
+
+ quotearg_buffer:
+ "simple", "'\0 \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg:
+ "simple", "' \t\n'\\''\"\033??/\\'", "a:b"
+ quotearg_colon:
+ "simple", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_quoting_style,
+
+ /* Quote names for the shell, even if they would normally not
+ require quoting (ls --quoting-style=shell-always). Can result
+ in embedded null bytes if QA_ELIDE_NULL_BYTES is not in effect.
+ Behaves like shell_quoting_style if QA_ELIDE_OUTER_QUOTES is in
+ effect.
+
+ quotearg_buffer:
+ "'simple'", "'\0 \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "' \t\n'\\''\"\033??/\\'", "'a:b'"
+ */
+ shell_always_quoting_style,
+
+ /* Quote names for the shell if they contain shell metacharacters
+ or other problematic characters (ls --quoting-style=shell-escape).
+ Non printable characters are quoted using the $'...' syntax,
+ which originated in ksh93 and is widely supported by most shells,
+ and proposed for inclusion in POSIX.
+
+ quotearg_buffer:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\\'", "a:b"
+ quotearg:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\\'", "a:b"
+ quotearg_colon:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\\'", "'a:b'"
+ */
+ shell_escape_quoting_style,
+
+ /* Quote names for the shell even if they would normally not
+ require quoting (ls --quoting-style=shell-escape).
+ Non printable characters are quoted using the $'...' syntax,
+ which originated in ksh93 and is widely supported by most shells,
+ and proposed for inclusion in POSIX. Behaves like
+ shell_escape_quoting_style if QA_ELIDE_OUTER_QUOTES is in effect.
+
+ quotearg_buffer:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\'", "a:b"
+ quotearg:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\'", "a:b"
+ quotearg_colon:
+ "simple", "''$'\\0'' '$'\\t\\n'\\''\"'$'\\033''??/\'", "'a:b'"
+ */
+ shell_escape_always_quoting_style,
+
+ /* Quote names as for a C language string (ls --quoting-style=c).
+ Behaves like c_maybe_quoting_style if QA_ELIDE_OUTER_QUOTES is
+ in effect. Split into consecutive strings if
+ QA_SPLIT_TRIGRAPHS.
+
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+ */
+ c_quoting_style,
+
+ /* Like c_quoting_style except omit the surrounding double-quote
+ characters if no quoted characters are encountered.
+
+ quotearg_buffer:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "a:b"
+ quotearg_colon:
+ "simple", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ */
+ c_maybe_quoting_style,
+
+ /* Like c_quoting_style except always omit the surrounding
+ double-quote characters and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=escape).
+
+ quotearg_buffer:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
+ quotearg_colon:
+ "simple", "\\0 \\t\\n'\"\\033??/\\\\", "a\\:b"
+ */
+ escape_quoting_style,
+
+ /* Like clocale_quoting_style, but use single quotes in the
+ default C locale or if the program does not use gettext
+ (ls --quoting-style=locale). For UTF-8 locales, quote
+ characters will use Unicode.
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a:b'"
+ quotearg_colon:
+ "`simple'", "`\\0 \\t\\n\\'\"\\033??/\\\\'", "`a\\:b'"
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ locale_quoting_style,
+
+ /* Like c_quoting_style except use quotation marks appropriate for
+ the locale and ignore QA_SPLIT_TRIGRAPHS
+ (ls --quoting-style=clocale).
+
+ LC_MESSAGES=C
+ quotearg_buffer:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a:b\""
+ quotearg_colon:
+ "\"simple\"", "\"\\0 \\t\\n'\\\"\\033??/\\\\\"", "\"a\\:b\""
+
+ LC_MESSAGES=pt_PT.utf8
+ quotearg_buffer:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a:b\302\273"
+ quotearg_colon:
+ "\302\253simple\302\273",
+ "\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
+ */
+ clocale_quoting_style,
+
+ /* Like clocale_quoting_style except use the custom quotation marks
+ set by set_custom_quoting. If custom quotation marks are not
+ set, the behavior is undefined.
+
+ left_quote = right_quote = "'"
+ quotearg_buffer:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
+ quotearg_colon:
+ "'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a\\:b'"
+
+ left_quote = "(" and right_quote = ")"
+ quotearg_buffer:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
+ quotearg_colon:
+ "(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a\\:b)"
+
+ left_quote = ":" and right_quote = " "
+ quotearg_buffer:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
+ quotearg_colon:
+ ":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a\\:b "
+
+ left_quote = "\"'" and right_quote = "'\""
+ Notice that this is treated as a single level of quotes or two
+ levels where the outer quote need not be escaped within the inner
+ quotes. For two levels where the outer quote must be escaped
+ within the inner quotes, you must use separate quotearg
+ invocations.
+ quotearg_buffer:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
+ quotearg_colon:
+ "\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a\\:b'\""
+ */
+ custom_quoting_style
+ };
+
+/* Flags for use in set_quoting_flags. */
+enum quoting_flags
+ {
+ /* Always elide null bytes from styles that do not quote them,
+ even when the length of the result is available to the
+ caller. */
+ QA_ELIDE_NULL_BYTES = 0x01,
+
+ /* Omit the surrounding quote characters if no escaped characters
+ are encountered. Note that if no other character needs
+ escaping, then neither does the escape character. */
+ QA_ELIDE_OUTER_QUOTES = 0x02,
+
+ /* In the c_quoting_style and c_maybe_quoting_style, split ANSI
+ trigraph sequences into concatenated strings (for example,
+ "?""?/" rather than "??/", which could be confused with
+ "\\"). */
+ QA_SPLIT_TRIGRAPHS = 0x04
+ };
+
+/* For now, --quoting-style=literal is the default, but this may change. */
+# ifndef DEFAULT_QUOTING_STYLE
+# define DEFAULT_QUOTING_STYLE literal_quoting_style
+# endif
+
+/* Names of quoting styles and their corresponding values. */
+extern char const *const quoting_style_args[];
+extern enum quoting_style const quoting_style_vals[];
+
+struct quoting_options;
+
+/* The functions listed below set and use a hidden variable
+ that contains the default quoting style options. */
+
+/* Allocate a new set of quoting options, with contents initially identical
+ to O if O is not null, or to the default if O is null.
+ It is the caller's responsibility to free the result. */
+struct quoting_options *clone_quoting_options (struct quoting_options *o);
+
+/* Get the value of O's quoting style. If O is null, use the default. */
+enum quoting_style get_quoting_style (struct quoting_options const *o);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to S. */
+void set_quoting_style (struct quoting_options *o, enum quoting_style s);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options for character C to I.
+ Return the old value. Currently, the only values defined for I are
+ 0 (the default) and 1 (which means to quote the character even if
+ it would not otherwise be quoted). C must never be a digit or a
+ letter that has special meaning after a backslash (for example, "\t"
+ for tab). */
+int set_char_quoting (struct quoting_options *o, char c, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting options flag to I, which can be a
+ bitwise combination of enum quoting_flags, or 0 for default
+ behavior. Return the old value. */
+int set_quoting_flags (struct quoting_options *o, int i);
+
+/* In O (or in the default if O is null),
+ set the value of the quoting style to custom_quoting_style,
+ set the left quote to LEFT_QUOTE, and set the right quote to
+ RIGHT_QUOTE. Each of LEFT_QUOTE and RIGHT_QUOTE must be
+ null-terminated and can be the empty string. Because backslashes are
+ used for escaping, it does not make sense for RIGHT_QUOTE to contain
+ a backslash. RIGHT_QUOTE must not begin with a digit or a letter
+ that has special meaning after a backslash (for example, "\t" for
+ tab). */
+void set_custom_quoting (struct quoting_options *o,
+ char const *left_quote,
+ char const *right_quote);
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+ argument ARG (of size ARGSIZE), using O to control quoting.
+ If O is null, use the default.
+ Terminate the output with a null character, and return the written
+ size of the output, not counting the terminating null.
+ If BUFFERSIZE is too small to store the output string, return the
+ value that would have been returned had BUFFERSIZE been large enough.
+ If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
+ On output, BUFFER might contain embedded null bytes if ARGSIZE was
+ not -1, the style of O does not use backslash escapes, and the
+ flags of O do not request elision of null bytes.*/
+size_t quotearg_buffer (char *restrict buffer, size_t buffersize,
+ char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_buffer, except return the result in a newly allocated
+ buffer. It is the caller's responsibility to free the result. The
+ result will not contain embedded null bytes. */
+char *quotearg_alloc (char const *arg, size_t argsize,
+ struct quoting_options const *o);
+
+/* Like quotearg_alloc, except that the length of the result,
+ excluding the terminating null byte, is stored into SIZE if it is
+ non-NULL. The result might contain embedded null bytes if ARGSIZE
+ was not -1, SIZE was not NULL, the style of O does not use
+ backslash escapes, and the flags of O do not request elision of
+ null bytes.*/
+char *quotearg_alloc_mem (char const *arg, size_t argsize,
+ size_t *size, struct quoting_options const *o);
+
+/* Use storage slot N to return a quoted version of the string ARG.
+ Use the default quoting options.
+ The returned value points to static storage that can be
+ reused by the next call to this function with the same value of N.
+ N must be nonnegative. The output of all functions in the
+ quotearg_n family are guaranteed to not contain embedded null
+ bytes.*/
+char *quotearg_n (int n, char const *arg);
+
+/* Equivalent to quotearg_n (0, ARG). */
+char *quotearg (char const *arg);
+
+/* Use storage slot N to return a quoted version of the argument ARG
+ of size ARGSIZE. This is like quotearg_n (N, ARG), except it can
+ quote null bytes. */
+char *quotearg_n_mem (int n, char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_mem (0, ARG, ARGSIZE). */
+char *quotearg_mem (char const *arg, size_t argsize);
+
+/* Use style S and storage slot N to return a quoted version of the string ARG.
+ This is like quotearg_n (N, ARG), except that it uses S with no other
+ options to specify the quoting method. */
+char *quotearg_n_style (int n, enum quoting_style s, char const *arg);
+
+/* Use style S and storage slot N to return a quoted version of the
+ argument ARG of size ARGSIZE. This is like quotearg_n_style
+ (N, S, ARG), except it can quote null bytes. */
+char *quotearg_n_style_mem (int n, enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_style (0, S, ARG). */
+char *quotearg_style (enum quoting_style s, char const *arg);
+
+/* Equivalent to quotearg_n_style_mem (0, S, ARG, ARGSIZE). */
+char *quotearg_style_mem (enum quoting_style s,
+ char const *arg, size_t argsize);
+
+/* Like quotearg (ARG), except also quote any instances of CH.
+ See set_char_quoting for a description of acceptable CH values. */
+char *quotearg_char (char const *arg, char ch);
+
+/* Like quotearg_char (ARG, CH), except it can quote null bytes. */
+char *quotearg_char_mem (char const *arg, size_t argsize, char ch);
+
+/* Equivalent to quotearg_char (ARG, ':'). */
+char *quotearg_colon (char const *arg);
+
+/* Like quotearg_colon (ARG), except it can quote null bytes. */
+char *quotearg_colon_mem (char const *arg, size_t argsize);
+
+/* Like quotearg_n_style, except with ':' quoting enabled. */
+char *quotearg_n_style_colon (int n, enum quoting_style s, char const *arg);
+
+/* Like quotearg_n_style (N, S, ARG) but with S as custom_quoting_style
+ with left quote as LEFT_QUOTE and right quote as RIGHT_QUOTE. See
+ set_custom_quoting for a description of acceptable LEFT_QUOTE and
+ RIGHT_QUOTE values. */
+char *quotearg_n_custom (int n, char const *left_quote,
+ char const *right_quote, char const *arg);
+
+/* Like quotearg_n_custom (N, LEFT_QUOTE, RIGHT_QUOTE, ARG) except it
+ can quote null bytes. */
+char *quotearg_n_custom_mem (int n, char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_custom (0, LEFT_QUOTE, RIGHT_QUOTE, ARG). */
+char *quotearg_custom (char const *left_quote, char const *right_quote,
+ char const *arg);
+
+/* Equivalent to quotearg_n_custom_mem (0, LEFT_QUOTE, RIGHT_QUOTE, ARG,
+ ARGSIZE). */
+char *quotearg_custom_mem (char const *left_quote,
+ char const *right_quote,
+ char const *arg, size_t argsize);
+
+/* Free any dynamically allocated memory. */
+void quotearg_free (void);
+
+#endif /* !QUOTEARG_H_ */
diff --git a/lib/raise.c b/lib/raise.c
new file mode 100644
index 0000000..1b93e52
--- /dev/null
+++ b/lib/raise.c
@@ -0,0 +1,83 @@
+/* Provide a non-threads replacement for the POSIX raise function.
+
+ Copyright (C) 2002-2003, 2005-2006, 2009-2020 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/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#if HAVE_RAISE
+/* Native Windows platform. */
+
+# include <errno.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+# endif
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+/* Forward declaration. */
+static int raise_nothrow (int sig);
+# else
+# define raise_nothrow raise
+# endif
+
+#else
+/* An old Unix platform. */
+
+# include <unistd.h>
+
+#endif
+
+int
+raise (int sig)
+#undef raise
+{
+#if GNULIB_defined_signal_blocking && GNULIB_defined_SIGPIPE
+ if (sig == SIGPIPE)
+ return _gl_raise_SIGPIPE ();
+#endif
+
+#if HAVE_RAISE
+ return raise_nothrow (sig);
+#else
+ return kill (getpid (), sig);
+#endif
+}
+
+#if HAVE_RAISE && HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+raise_nothrow (int sig)
+{
+ int result;
+
+ TRY_MSVC_INVAL
+ {
+ result = raise (sig);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EINVAL;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+#endif
diff --git a/lib/rawmemchr.c b/lib/rawmemchr.c
new file mode 100644
index 0000000..04bf084
--- /dev/null
+++ b/lib/rawmemchr.c
@@ -0,0 +1,136 @@
+/* Searching in a string.
+ Copyright (C) 2008-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S. */
+void *
+rawmemchr (const void *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (*char_ptr == c)
+ return (void *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 is zero.
+
+ We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 is zero is equivalent
+ to testing whether tmp is nonzero.
+
+ This test can read beyond the end of a string, depending on where
+ C_IN is encountered. However, this is considered safe since the
+ initialization phase ensured that the read will be aligned,
+ therefore, the read will not cross page boundaries and will not
+ cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+
+ if ((((longword1 - repeated_one) & ~longword1)
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == c. On little-endian machines, we
+ could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr != c)
+ char_ptr++;
+ return (void *) char_ptr;
+}
diff --git a/lib/rawmemchr.valgrind b/lib/rawmemchr.valgrind
new file mode 100644
index 0000000..53c5b31
--- /dev/null
+++ b/lib/rawmemchr.valgrind
@@ -0,0 +1,28 @@
+# Suppress a valgrind message about use of uninitialized memory in rawmemchr().
+
+# Copyright (C) 2008-2020 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 use is OK because it provides only a speedup.
+{
+ rawmemchr-value4
+ Memcheck:Value4
+ fun:rawmemchr
+}
+{
+ rawmemchr-value8
+ Memcheck:Value8
+ fun:rawmemchr
+}
diff --git a/lib/readdir.c b/lib/readdir.c
new file mode 100644
index 0000000..91a3516
--- /dev/null
+++ b/lib/readdir.c
@@ -0,0 +1,102 @@
+/* Read the next entry of a directory.
+ Copyright (C) 2011-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+#include <stddef.h>
+
+#include "dirent-private.h"
+
+/* Don't assume that UNICODE is not defined. */
+#undef FindNextFile
+#define FindNextFile FindNextFileA
+
+struct dirent *
+readdir (DIR *dirp)
+{
+ char type;
+ struct dirent *result;
+
+ /* There is no need to add code to produce entries for "." and "..".
+ According to the POSIX:2008 section "4.12 Pathname Resolution"
+ <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html>
+ "." and ".." are syntactic entities.
+ POSIX also says:
+ "If entries for dot or dot-dot exist, one entry shall be returned
+ for dot and one entry shall be returned for dot-dot; otherwise,
+ they shall not be returned." */
+
+ switch (dirp->status)
+ {
+ case -2:
+ /* End of directory already reached. */
+ return NULL;
+ case -1:
+ break;
+ case 0:
+ if (!FindNextFile (dirp->current, &dirp->entry))
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_NO_MORE_FILES:
+ dirp->status = -2;
+ return NULL;
+ default:
+ errno = EIO;
+ return NULL;
+ }
+ }
+ break;
+ default:
+ errno = dirp->status;
+ return NULL;
+ }
+
+ dirp->status = 0;
+
+ if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ type = DT_DIR;
+ else if (dirp->entry.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+ type = DT_LNK;
+ else if ((dirp->entry.dwFileAttributes
+ & ~(FILE_ATTRIBUTE_READONLY
+ | FILE_ATTRIBUTE_HIDDEN
+ | FILE_ATTRIBUTE_SYSTEM
+ | FILE_ATTRIBUTE_ARCHIVE
+ | FILE_ATTRIBUTE_NORMAL
+ | FILE_ATTRIBUTE_TEMPORARY
+ | FILE_ATTRIBUTE_SPARSE_FILE
+ | FILE_ATTRIBUTE_COMPRESSED
+ | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
+ | FILE_ATTRIBUTE_ENCRYPTED)) == 0)
+ /* Devices like COM1, LPT1, NUL would also have the attributes 0x20 but
+ they cannot occur here. */
+ type = DT_REG;
+ else
+ type = DT_UNKNOWN;
+
+ /* Reuse the memory of dirp->entry for the result. */
+ result =
+ (struct dirent *)
+ ((char *) dirp->entry.cFileName - offsetof (struct dirent, d_name[0]));
+ result->d_type = type;
+
+ return result;
+}
diff --git a/lib/readlink.c b/lib/readlink.c
new file mode 100644
index 0000000..531913e
--- /dev/null
+++ b/lib/readlink.c
@@ -0,0 +1,104 @@
+/* Read the contents of a symbolic link.
+ Copyright (C) 2003-2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#if !HAVE_READLINK
+
+/* readlink() substitute for systems that don't have a readlink() function,
+ such as DJGPP 2.03 and mingw32. */
+
+ssize_t
+readlink (char const *file, char *buf _GL_UNUSED,
+ size_t bufsize _GL_UNUSED)
+{
+ struct stat statbuf;
+
+ /* In general we should use lstat() here, not stat(). But on platforms
+ without symbolic links, lstat() - if it exists - would be equivalent to
+ stat(), therefore we can use stat(). This saves us a configure check. */
+ if (stat (file, &statbuf) >= 0)
+ errno = EINVAL;
+ return -1;
+}
+
+#else /* HAVE_READLINK */
+
+# undef readlink
+
+/* readlink() wrapper that uses correct types, for systems like cygwin
+ 1.5.x where readlink returns int, and which rejects trailing slash,
+ for Solaris 9. */
+
+ssize_t
+rpl_readlink (char const *file, char *buf, size_t bufsize)
+{
+# if READLINK_TRAILING_SLASH_BUG
+ size_t file_len = strlen (file);
+ if (file_len && file[file_len - 1] == '/')
+ {
+ /* Even if FILE without the slash is a symlink to a directory,
+ both lstat() and stat() must resolve the trailing slash to
+ the directory rather than the symlink. We can therefore
+ safely use stat() to distinguish between EINVAL and
+ ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat(). */
+ struct stat st;
+ if (stat (file, &st) == 0 || errno == EOVERFLOW)
+ errno = EINVAL;
+ return -1;
+ }
+# endif /* READLINK_TRAILING_SLASH_BUG */
+
+ ssize_t r = readlink (file, buf, bufsize);
+
+# if READLINK_TRUNCATE_BUG
+ if (r < 0 && errno == ERANGE)
+ {
+ /* Try again with a bigger buffer. This is just for test cases;
+ real code invariably discards short reads. */
+ char stackbuf[4032];
+ r = readlink (file, stackbuf, sizeof stackbuf);
+ if (r < 0)
+ {
+ if (errno == ERANGE)
+ {
+ /* Clear the buffer, which is good enough for real code.
+ Thankfully, no test cases try short reads of enormous
+ symlinks and what would be the point anyway? */
+ r = bufsize;
+ memset (buf, 0, r);
+ }
+ }
+ else
+ {
+ if (bufsize < r)
+ r = bufsize;
+ memcpy (buf, stackbuf, r);
+ }
+ }
+# endif
+
+ return r;
+}
+
+#endif /* HAVE_READLINK */
diff --git a/lib/realloc.c b/lib/realloc.c
new file mode 100644
index 0000000..a24054d
--- /dev/null
+++ b/lib/realloc.c
@@ -0,0 +1,79 @@
+/* realloc() function that is glibc compatible.
+
+ Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2020 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/>. */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+
+/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */
+#ifdef realloc
+# define NEED_REALLOC_GNU 1
+/* Whereas the gnulib module 'realloc-gnu' defines HAVE_REALLOC_GNU. */
+#elif GNULIB_REALLOC_GNU && !HAVE_REALLOC_GNU
+# define NEED_REALLOC_GNU 1
+#endif
+
+/* Infer the properties of the system's malloc function.
+ The gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU. */
+#if GNULIB_MALLOC_GNU && HAVE_MALLOC_GNU
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. If N is zero, change it to 1. If P is NULL,
+ use malloc. */
+
+void *
+rpl_realloc (void *p, size_t n)
+{
+ void *result;
+
+#if NEED_REALLOC_GNU
+ if (n == 0)
+ {
+ n = 1;
+
+ /* In theory realloc might fail, so don't rely on it to free. */
+ free (p);
+ p = NULL;
+ }
+#endif
+
+ if (p == NULL)
+ {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+ if (n == 0)
+ n = 1;
+#endif
+ result = malloc (n);
+ }
+ else
+ result = realloc (p, n);
+
+#if !HAVE_REALLOC_POSIX
+ if (result == NULL)
+ errno = ENOMEM;
+#endif
+
+ return result;
+}
diff --git a/lib/recv.c b/lib/recv.c
new file mode 100644
index 0000000..5db66e2
--- /dev/null
+++ b/lib/recv.c
@@ -0,0 +1,49 @@
+/* recv.c --- wrappers for Windows recv function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef recv
+
+ssize_t
+rpl_recv (int fd, void *buf, size_t len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = recv (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/regcomp.c b/lib/regcomp.c
new file mode 100644
index 0000000..a4b95b0
--- /dev/null
+++ b/lib/regcomp.c
@@ -0,0 +1,3919 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifdef _LIBC
+# include <locale/weight.h>
+#endif
+
+static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
+ size_t length, reg_syntax_t syntax);
+static void re_compile_fastmap_iter (regex_t *bufp,
+ const re_dfastate_t *init_state,
+ char *fastmap);
+static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
+#ifdef RE_ENABLE_I18N
+static void free_charset (re_charset_t *cset);
+#endif /* RE_ENABLE_I18N */
+static void free_workarea_compile (regex_t *preg);
+static reg_errcode_t create_initial_state (re_dfa_t *dfa);
+#ifdef RE_ENABLE_I18N
+static void optimize_utf8 (re_dfa_t *dfa);
+#endif
+static reg_errcode_t analyze (regex_t *preg);
+static reg_errcode_t preorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t postorder (bin_tree_t *root,
+ reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra);
+static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
+static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
+static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
+ bin_tree_t *node);
+static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
+static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
+static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
+static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint);
+static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint);
+static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
+static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
+ Idx node, bool root);
+static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
+static Idx fetch_number (re_string_t *input, re_token_t *token,
+ reg_syntax_t syntax);
+static int peek_token (re_token_t *token, re_string_t *input,
+ reg_syntax_t syntax);
+static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
+ re_token_t *token, reg_syntax_t syntax,
+ Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
+ re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax,
+ reg_errcode_t *err);
+static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token, int token_len,
+ re_dfa_t *dfa,
+ reg_syntax_t syntax,
+ bool accept_hyphen);
+static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
+ re_string_t *regexp,
+ re_token_t *token);
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *equiv_class_alloc,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *char_class_alloc,
+ const char *class_name,
+ reg_syntax_t syntax);
+#else /* not RE_ENABLE_I18N */
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+ const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+ bitset_t sbcset,
+ const char *class_name,
+ reg_syntax_t syntax);
+#endif /* not RE_ENABLE_I18N */
+static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
+ RE_TRANSLATE_TYPE trans,
+ const char *class_name,
+ const char *extra,
+ bool non_match, reg_errcode_t *err);
+static bin_tree_t *create_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type);
+static bin_tree_t *create_token_tree (re_dfa_t *dfa,
+ bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token);
+static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
+static void free_token (re_token_t *node);
+static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
+static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
+
+/* This table gives an error message for each of the error codes listed
+ in regex.h. Obviously the order here has to be same as there.
+ POSIX doesn't require that we do anything for REG_NOERROR,
+ but why not be nice? */
+
+static const char __re_error_msgid[] =
+ {
+#define REG_NOERROR_IDX 0
+ gettext_noop ("Success") /* REG_NOERROR */
+ "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+ gettext_noop ("No match") /* REG_NOMATCH */
+ "\0"
+#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
+ gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+ "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+ gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+ "\0"
+#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+ gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+ "\0"
+#define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
+ gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+ "\0"
+#define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
+ gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+ "\0"
+#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
+ gettext_noop ("Unmatched [, [^, [:, [., or [=") /* REG_EBRACK */
+ "\0"
+#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [, [^, [:, [., or [=")
+ gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+ "\0"
+#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+ gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+ "\0"
+#define REG_BADBR_IDX (REG_EBRACE_IDX + sizeof "Unmatched \\{")
+ gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+ "\0"
+#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+ gettext_noop ("Invalid range end") /* REG_ERANGE */
+ "\0"
+#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
+ gettext_noop ("Memory exhausted") /* REG_ESPACE */
+ "\0"
+#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
+ gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+ "\0"
+#define REG_EEND_IDX (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+ gettext_noop ("Premature end of regular expression") /* REG_EEND */
+ "\0"
+#define REG_ESIZE_IDX (REG_EEND_IDX + sizeof "Premature end of regular expression")
+ gettext_noop ("Regular expression too big") /* REG_ESIZE */
+ "\0"
+#define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
+ gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+ };
+
+static const size_t __re_error_msgid_idx[] =
+ {
+ REG_NOERROR_IDX,
+ REG_NOMATCH_IDX,
+ REG_BADPAT_IDX,
+ REG_ECOLLATE_IDX,
+ REG_ECTYPE_IDX,
+ REG_EESCAPE_IDX,
+ REG_ESUBREG_IDX,
+ REG_EBRACK_IDX,
+ REG_EPAREN_IDX,
+ REG_EBRACE_IDX,
+ REG_BADBR_IDX,
+ REG_ERANGE_IDX,
+ REG_ESPACE_IDX,
+ REG_BADRPT_IDX,
+ REG_EEND_IDX,
+ REG_ESIZE_IDX,
+ REG_ERPAREN_IDX
+ };
+
+/* Entry points for GNU code. */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+ compiles PATTERN (of length LENGTH) and puts the result in BUFP.
+ Returns 0 if the pattern was valid, otherwise an error string.
+
+ Assumes the 'allocated' (and perhaps 'buffer') and 'translate' fields
+ are set in BUFP on entry. */
+
+const char *
+re_compile_pattern (const char *pattern, size_t length,
+ struct re_pattern_buffer *bufp)
+{
+ reg_errcode_t ret;
+
+ /* And GNU code determines whether or not to get register information
+ by passing null for the REGS argument to re_match, etc., not by
+ setting no_sub, unless RE_NO_SUB is set. */
+ bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
+
+ /* Match anchors at newline. */
+ bufp->newline_anchor = 1;
+
+ ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
+
+ if (!ret)
+ return NULL;
+ return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+weak_alias (__re_compile_pattern, re_compile_pattern)
+
+/* Set by 're_set_syntax' to the current regexp syntax to recognize. Can
+ also be assigned to arbitrarily: each pattern buffer stores its own
+ syntax, so it can be changed between regex compilations. */
+/* This has no initializer because initialized variables in Emacs
+ become read-only after dumping. */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation. This provides
+ for compatibility for various utilities which historically have
+ different, incompatible syntaxes.
+
+ The argument SYNTAX is a bit mask comprised of the various bits
+ defined in regex.h. We return the old syntax. */
+
+reg_syntax_t
+re_set_syntax (reg_syntax_t syntax)
+{
+ reg_syntax_t ret = re_syntax_options;
+
+ re_syntax_options = syntax;
+ return ret;
+}
+weak_alias (__re_set_syntax, re_set_syntax)
+
+int
+re_compile_fastmap (struct re_pattern_buffer *bufp)
+{
+ re_dfa_t *dfa = bufp->buffer;
+ char *fastmap = bufp->fastmap;
+
+ memset (fastmap, '\0', sizeof (char) * SBC_MAX);
+ re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
+ if (dfa->init_state != dfa->init_state_word)
+ re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
+ if (dfa->init_state != dfa->init_state_nl)
+ re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
+ if (dfa->init_state != dfa->init_state_begbuf)
+ re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
+ bufp->fastmap_accurate = 1;
+ return 0;
+}
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+
+static inline void
+__attribute__ ((always_inline))
+re_set_fastmap (char *fastmap, bool icase, int ch)
+{
+ fastmap[ch] = 1;
+ if (icase)
+ fastmap[tolower (ch)] = 1;
+}
+
+/* Helper function for re_compile_fastmap.
+ Compile fastmap for the initial_state INIT_STATE. */
+
+static void
+re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
+ char *fastmap)
+{
+ re_dfa_t *dfa = bufp->buffer;
+ Idx node_cnt;
+ bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
+ for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
+ {
+ Idx node = init_state->nodes.elems[node_cnt];
+ re_token_type_t type = dfa->nodes[node].type;
+
+ if (type == CHARACTER)
+ {
+ re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
+#ifdef RE_ENABLE_I18N
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ unsigned char buf[MB_LEN_MAX];
+ unsigned char *p;
+ wchar_t wc;
+ mbstate_t state;
+
+ p = buf;
+ *p++ = dfa->nodes[node].opr.c;
+ while (++node < dfa->nodes_len
+ && dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].mb_partial)
+ *p++ = dfa->nodes[node].opr.c;
+ memset (&state, '\0', sizeof (state));
+ if (__mbrtowc (&wc, (const char *) buf, p - buf,
+ &state) == p - buf
+ && (__wcrtomb ((char *) buf, __towlower (wc), &state)
+ != (size_t) -1))
+ re_set_fastmap (fastmap, false, buf[0]);
+ }
+#endif
+ }
+ else if (type == SIMPLE_BRACKET)
+ {
+ int i, ch;
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ {
+ int j;
+ bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (w & ((bitset_word_t) 1 << j))
+ re_set_fastmap (fastmap, icase, ch);
+ }
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == COMPLEX_BRACKET)
+ {
+ re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+ Idx i;
+
+# ifdef _LIBC
+ /* See if we have to try all bytes which start multiple collation
+ elements.
+ e.g. In da_DK, we want to catch 'a' since "aa" is a valid
+ collation element, and don't catch 'b' since 'b' is
+ the only collation element which starts from 'b' (and
+ it is caught by SIMPLE_BRACKET). */
+ if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
+ && (cset->ncoll_syms || cset->nranges))
+ {
+ const int32_t *table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ for (i = 0; i < SBC_MAX; ++i)
+ if (table[i] < 0)
+ re_set_fastmap (fastmap, icase, i);
+ }
+# endif /* _LIBC */
+
+ /* See if we have to start the match at all multibyte characters,
+ i.e. where we would not find an invalid sequence. This only
+ applies to multibyte character sets; for single byte character
+ sets, the SIMPLE_BRACKET again suffices. */
+ if (dfa->mb_cur_max > 1
+ && (cset->nchar_classes || cset->non_match || cset->nranges
+# ifdef _LIBC
+ || cset->nequiv_classes
+# endif /* _LIBC */
+ ))
+ {
+ unsigned char c = 0;
+ do
+ {
+ mbstate_t mbs;
+ memset (&mbs, 0, sizeof (mbs));
+ if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
+ re_set_fastmap (fastmap, false, (int) c);
+ }
+ while (++c != 0);
+ }
+
+ else
+ {
+ /* ... Else catch all bytes which can start the mbchars. */
+ for (i = 0; i < cset->nmbchars; ++i)
+ {
+ char buf[256];
+ mbstate_t state;
+ memset (&state, '\0', sizeof (state));
+ if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
+ re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
+ if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+ {
+ if (__wcrtomb (buf, __towlower (cset->mbchars[i]), &state)
+ != (size_t) -1)
+ re_set_fastmap (fastmap, false, *(unsigned char *) buf);
+ }
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ else if (type == OP_PERIOD
+#ifdef RE_ENABLE_I18N
+ || type == OP_UTF8_PERIOD
+#endif /* RE_ENABLE_I18N */
+ || type == END_OF_RE)
+ {
+ memset (fastmap, '\1', sizeof (char) * SBC_MAX);
+ if (type == END_OF_RE)
+ bufp->can_be_null = 1;
+ return;
+ }
+ }
+}
+
+/* Entry point for POSIX code. */
+/* regcomp takes a regular expression as a string and compiles it.
+
+ PREG is a regex_t *. We do not expect any fields to be initialized,
+ since POSIX says we shouldn't. Thus, we set
+
+ 'buffer' to the compiled pattern;
+ 'used' to the length of the compiled pattern;
+ 'syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+ REG_EXTENDED bit in CFLAGS is set; otherwise, to
+ RE_SYNTAX_POSIX_BASIC;
+ 'newline_anchor' to REG_NEWLINE being set in CFLAGS;
+ 'fastmap' to an allocated space for the fastmap;
+ 'fastmap_accurate' to zero;
+ 're_nsub' to the number of subexpressions in PATTERN.
+
+ PATTERN is the address of the pattern string.
+
+ CFLAGS is a series of bits which affect compilation.
+
+ If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+ use POSIX basic syntax.
+
+ If REG_NEWLINE is set, then . and [^...] don't match newline.
+ Also, regexec will try a match beginning after every newline.
+
+ If REG_ICASE is set, then we considers upper- and lowercase
+ versions of letters to be equivalent when matching.
+
+ If REG_NOSUB is set, then when PREG is passed to regexec, that
+ routine will report only success or failure, and nothing about the
+ registers.
+
+ It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for
+ the return codes and their meanings.) */
+
+int
+regcomp (regex_t *__restrict preg, const char *__restrict pattern, int cflags)
+{
+ reg_errcode_t ret;
+ reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
+ : RE_SYNTAX_POSIX_BASIC);
+
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ preg->used = 0;
+
+ /* Try to allocate space for the fastmap. */
+ preg->fastmap = re_malloc (char, SBC_MAX);
+ if (__glibc_unlikely (preg->fastmap == NULL))
+ return REG_ESPACE;
+
+ syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
+
+ /* If REG_NEWLINE is set, newlines are treated differently. */
+ if (cflags & REG_NEWLINE)
+ { /* REG_NEWLINE implies neither . nor [^...] match newline. */
+ syntax &= ~RE_DOT_NEWLINE;
+ syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+ /* It also changes the matching behavior. */
+ preg->newline_anchor = 1;
+ }
+ else
+ preg->newline_anchor = 0;
+ preg->no_sub = !!(cflags & REG_NOSUB);
+ preg->translate = NULL;
+
+ ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
+
+ /* POSIX doesn't distinguish between an unmatched open-group and an
+ unmatched close-group: both are REG_EPAREN. */
+ if (ret == REG_ERPAREN)
+ ret = REG_EPAREN;
+
+ /* We have already checked preg->fastmap != NULL. */
+ if (__glibc_likely (ret == REG_NOERROR))
+ /* Compute the fastmap now, since regexec cannot modify the pattern
+ buffer. This function never fails in this implementation. */
+ (void) re_compile_fastmap (preg);
+ else
+ {
+ /* Some error occurred while compiling the expression. */
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+ }
+
+ return (int) ret;
+}
+libc_hidden_def (__regcomp)
+weak_alias (__regcomp, regcomp)
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+ from either regcomp or regexec. We don't use PREG here. */
+
+size_t
+regerror (int errcode, const regex_t *__restrict preg, char *__restrict errbuf,
+ size_t errbuf_size)
+{
+ const char *msg;
+ size_t msg_size;
+ int nerrcodes = sizeof __re_error_msgid_idx / sizeof __re_error_msgid_idx[0];
+
+ if (__glibc_unlikely (errcode < 0 || errcode >= nerrcodes))
+ /* Only error codes returned by the rest of the code should be passed
+ to this routine. If we are given anything else, or if other regex
+ code generates an invalid error code, then the program has a bug.
+ Dump core so we can fix it. */
+ abort ();
+
+ msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
+
+ msg_size = strlen (msg) + 1; /* Includes the null. */
+
+ if (__glibc_likely (errbuf_size != 0))
+ {
+ size_t cpy_size = msg_size;
+ if (__glibc_unlikely (msg_size > errbuf_size))
+ {
+ cpy_size = errbuf_size - 1;
+ errbuf[cpy_size] = '\0';
+ }
+ memcpy (errbuf, msg, cpy_size);
+ }
+
+ return msg_size;
+}
+weak_alias (__regerror, regerror)
+
+
+#ifdef RE_ENABLE_I18N
+/* This static array is used for the map to single-byte characters when
+ UTF-8 is used. Otherwise we would allocate memory just to initialize
+ it the same all the time. UTF-8 is the preferred encoding so this is
+ a worthwhile optimization. */
+static const bitset_t utf8_sb_map =
+{
+ /* Set the first 128 bits. */
+# if (defined __GNUC__ || __clang_major__ >= 4) && !defined __STRICT_ANSI__
+ [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX
+# else
+# if 4 * BITSET_WORD_BITS < ASCII_CHARS
+# error "bitset_word_t is narrower than 32 bits"
+# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX, BITSET_WORD_MAX,
+# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
+ BITSET_WORD_MAX,
+# endif
+ (BITSET_WORD_MAX
+ >> (SBC_MAX % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
+# endif
+};
+#endif
+
+
+static void
+free_dfa_content (re_dfa_t *dfa)
+{
+ Idx i, j;
+
+ if (dfa->nodes)
+ for (i = 0; i < dfa->nodes_len; ++i)
+ free_token (dfa->nodes + i);
+ re_free (dfa->nexts);
+ for (i = 0; i < dfa->nodes_len; ++i)
+ {
+ if (dfa->eclosures != NULL)
+ re_node_set_free (dfa->eclosures + i);
+ if (dfa->inveclosures != NULL)
+ re_node_set_free (dfa->inveclosures + i);
+ if (dfa->edests != NULL)
+ re_node_set_free (dfa->edests + i);
+ }
+ re_free (dfa->edests);
+ re_free (dfa->eclosures);
+ re_free (dfa->inveclosures);
+ re_free (dfa->nodes);
+
+ if (dfa->state_table)
+ for (i = 0; i <= dfa->state_hash_mask; ++i)
+ {
+ struct re_state_table_entry *entry = dfa->state_table + i;
+ for (j = 0; j < entry->num; ++j)
+ {
+ re_dfastate_t *state = entry->array[j];
+ free_state (state);
+ }
+ re_free (entry->array);
+ }
+ re_free (dfa->state_table);
+#ifdef RE_ENABLE_I18N
+ if (dfa->sb_char != utf8_sb_map)
+ re_free (dfa->sb_char);
+#endif
+ re_free (dfa->subexp_map);
+#ifdef DEBUG
+ re_free (dfa->re_str);
+#endif
+
+ re_free (dfa);
+}
+
+
+/* Free dynamically allocated space used by PREG. */
+
+void
+regfree (regex_t *preg)
+{
+ re_dfa_t *dfa = preg->buffer;
+ if (__glibc_likely (dfa != NULL))
+ {
+ lock_fini (dfa->lock);
+ free_dfa_content (dfa);
+ }
+ preg->buffer = NULL;
+ preg->allocated = 0;
+
+ re_free (preg->fastmap);
+ preg->fastmap = NULL;
+
+ re_free (preg->translate);
+ preg->translate = NULL;
+}
+libc_hidden_def (__regfree)
+weak_alias (__regfree, regfree)
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer. */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+# ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+ these names if they don't use our functions, and still use
+ regcomp/regexec above without link errors. */
+weak_function
+# endif
+re_comp (const char *s)
+{
+ reg_errcode_t ret;
+ char *fastmap;
+
+ if (!s)
+ {
+ if (!re_comp_buf.buffer)
+ return gettext ("No previous regular expression");
+ return 0;
+ }
+
+ if (re_comp_buf.buffer)
+ {
+ fastmap = re_comp_buf.fastmap;
+ re_comp_buf.fastmap = NULL;
+ __regfree (&re_comp_buf);
+ memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
+ re_comp_buf.fastmap = fastmap;
+ }
+
+ if (re_comp_buf.fastmap == NULL)
+ {
+ re_comp_buf.fastmap = re_malloc (char, SBC_MAX);
+ if (re_comp_buf.fastmap == NULL)
+ return (char *) gettext (__re_error_msgid
+ + __re_error_msgid_idx[(int) REG_ESPACE]);
+ }
+
+ /* Since 're_exec' always passes NULL for the 'regs' argument, we
+ don't need to initialize the pattern buffer fields which affect it. */
+
+ /* Match anchors at newlines. */
+ re_comp_buf.newline_anchor = 1;
+
+ ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
+
+ if (!ret)
+ return NULL;
+
+ /* Yes, we're discarding 'const' here if !HAVE_LIBINTL. */
+ return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+ __regfree (&re_comp_buf);
+}
+#endif
+
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point.
+ Compile the regular expression PATTERN, whose length is LENGTH.
+ SYNTAX indicate regular expression's syntax. */
+
+static reg_errcode_t
+re_compile_internal (regex_t *preg, const char * pattern, size_t length,
+ reg_syntax_t syntax)
+{
+ reg_errcode_t err = REG_NOERROR;
+ re_dfa_t *dfa;
+ re_string_t regexp;
+
+ /* Initialize the pattern buffer. */
+ preg->fastmap_accurate = 0;
+ preg->syntax = syntax;
+ preg->not_bol = preg->not_eol = 0;
+ preg->used = 0;
+ preg->re_nsub = 0;
+ preg->can_be_null = 0;
+ preg->regs_allocated = REGS_UNALLOCATED;
+
+ /* Initialize the dfa. */
+ dfa = preg->buffer;
+ if (__glibc_unlikely (preg->allocated < sizeof (re_dfa_t)))
+ {
+ /* If zero allocated, but buffer is non-null, try to realloc
+ enough space. This loses if buffer's address is bogus, but
+ that is the user's responsibility. If ->buffer is NULL this
+ is a simple allocation. */
+ dfa = re_realloc (preg->buffer, re_dfa_t, 1);
+ if (dfa == NULL)
+ return REG_ESPACE;
+ preg->allocated = sizeof (re_dfa_t);
+ preg->buffer = dfa;
+ }
+ preg->used = sizeof (re_dfa_t);
+
+ err = init_dfa (dfa, length);
+ if (__glibc_unlikely (err == REG_NOERROR && lock_init (dfa->lock) != 0))
+ err = REG_ESPACE;
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+#ifdef DEBUG
+ /* Note: length+1 will not overflow since it is checked in init_dfa. */
+ dfa->re_str = re_malloc (char, length + 1);
+ strncpy (dfa->re_str, pattern, length + 1);
+#endif
+
+ err = re_string_construct (&regexp, pattern, length, preg->translate,
+ (syntax & RE_ICASE) != 0, dfa);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_compile_internal_free_return:
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+ lock_fini (dfa->lock);
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ return err;
+ }
+
+ /* Parse the regular expression, and build a structure tree. */
+ preg->re_nsub = 0;
+ dfa->str_tree = parse (&regexp, preg, syntax, &err);
+ if (__glibc_unlikely (dfa->str_tree == NULL))
+ goto re_compile_internal_free_return;
+
+ /* Analyze the tree and create the nfa. */
+ err = analyze (preg);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto re_compile_internal_free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* If possible, do searching in single byte encoding to speed things up. */
+ if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
+ optimize_utf8 (dfa);
+#endif
+
+ /* Then create the initial state of the dfa. */
+ err = create_initial_state (dfa);
+
+ /* Release work areas. */
+ free_workarea_compile (preg);
+ re_string_destruct (&regexp);
+
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ lock_fini (dfa->lock);
+ free_dfa_content (dfa);
+ preg->buffer = NULL;
+ preg->allocated = 0;
+ }
+
+ return err;
+}
+
+/* Initialize DFA. We use the length of the regular expression PAT_LEN
+ as the initial length of some arrays. */
+
+static reg_errcode_t
+init_dfa (re_dfa_t *dfa, size_t pat_len)
+{
+ __re_size_t table_size;
+#ifndef _LIBC
+ const char *codeset_name;
+#endif
+#ifdef RE_ENABLE_I18N
+ size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
+#else
+ size_t max_i18n_object_size = 0;
+#endif
+ size_t max_object_size =
+ MAX (sizeof (struct re_state_table_entry),
+ MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ MAX (sizeof (regmatch_t),
+ max_i18n_object_size))));
+
+ memset (dfa, '\0', sizeof (re_dfa_t));
+
+ /* Force allocation of str_tree_storage the first time. */
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+
+ /* Avoid overflows. The extra "/ 2" is for the table_size doubling
+ calculation below, and for similar doubling calculations
+ elsewhere. And it's <= rather than <, because some of the
+ doubling calculations add 1 afterwards. */
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) / 2
+ <= pat_len))
+ return REG_ESPACE;
+
+ dfa->nodes_alloc = pat_len + 1;
+ dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
+
+ /* table_size = 2 ^ ceil(log pat_len) */
+ for (table_size = 1; ; table_size <<= 1)
+ if (table_size > pat_len)
+ break;
+
+ dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
+ dfa->state_hash_mask = table_size - 1;
+
+ dfa->mb_cur_max = MB_CUR_MAX;
+#ifdef _LIBC
+ if (dfa->mb_cur_max == 6
+ && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
+ dfa->is_utf8 = 1;
+ dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
+ != 0);
+#else
+ codeset_name = nl_langinfo (CODESET);
+ if ((codeset_name[0] == 'U' || codeset_name[0] == 'u')
+ && (codeset_name[1] == 'T' || codeset_name[1] == 't')
+ && (codeset_name[2] == 'F' || codeset_name[2] == 'f')
+ && strcmp (codeset_name + 3 + (codeset_name[3] == '-'), "8") == 0)
+ dfa->is_utf8 = 1;
+
+ /* We check exhaustively in the loop below if this charset is a
+ superset of ASCII. */
+ dfa->map_notascii = 0;
+#endif
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ if (dfa->is_utf8)
+ dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
+ else
+ {
+ int i, j, ch;
+
+ dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+ if (__glibc_unlikely (dfa->sb_char == NULL))
+ return REG_ESPACE;
+
+ /* Set the bits corresponding to single byte chars. */
+ for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ {
+ wint_t wch = __btowc (ch);
+ if (wch != WEOF)
+ dfa->sb_char[i] |= (bitset_word_t) 1 << j;
+# ifndef _LIBC
+ if (isascii (ch) && wch != ch)
+ dfa->map_notascii = 1;
+# endif
+ }
+ }
+ }
+#endif
+
+ if (__glibc_unlikely (dfa->nodes == NULL || dfa->state_table == NULL))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+/* Initialize WORD_CHAR table, which indicate which character is
+ "word". In this case "word" means that it is the word construction
+ character used by some operators like "\<", "\>", etc. */
+
+static void
+init_word_char (re_dfa_t *dfa)
+{
+ int i = 0;
+ int j;
+ int ch = 0;
+ dfa->word_ops_used = 1;
+ if (__glibc_likely (dfa->map_notascii == 0))
+ {
+ /* Avoid uint32_t and uint64_t as some non-GCC platforms lack
+ them, an issue when this code is used in Gnulib. */
+ bitset_word_t bits0 = 0x00000000;
+ bitset_word_t bits1 = 0x03ff0000;
+ bitset_word_t bits2 = 0x87fffffe;
+ bitset_word_t bits3 = 0x07fffffe;
+ if (BITSET_WORD_BITS == 64)
+ {
+ /* Pacify gcc -Woverflow on 32-bit platformns. */
+ dfa->word_char[0] = bits1 << 31 << 1 | bits0;
+ dfa->word_char[1] = bits3 << 31 << 1 | bits2;
+ i = 2;
+ }
+ else if (BITSET_WORD_BITS == 32)
+ {
+ dfa->word_char[0] = bits0;
+ dfa->word_char[1] = bits1;
+ dfa->word_char[2] = bits2;
+ dfa->word_char[3] = bits3;
+ i = 4;
+ }
+ else
+ goto general_case;
+ ch = 128;
+
+ if (__glibc_likely (dfa->is_utf8))
+ {
+ memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8);
+ return;
+ }
+ }
+
+ general_case:
+ for (; i < BITSET_WORDS; ++i)
+ for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+ if (isalnum (ch) || ch == '_')
+ dfa->word_char[i] |= (bitset_word_t) 1 << j;
+}
+
+/* Free the work area which are only used while compiling. */
+
+static void
+free_workarea_compile (regex_t *preg)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_storage_t *storage, *next;
+ for (storage = dfa->str_tree_storage; storage; storage = next)
+ {
+ next = storage->next;
+ re_free (storage);
+ }
+ dfa->str_tree_storage = NULL;
+ dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+ dfa->str_tree = NULL;
+ re_free (dfa->org_indices);
+ dfa->org_indices = NULL;
+}
+
+/* Create initial states for all contexts. */
+
+static reg_errcode_t
+create_initial_state (re_dfa_t *dfa)
+{
+ Idx first, i;
+ reg_errcode_t err;
+ re_node_set init_nodes;
+
+ /* Initial states have the epsilon closure of the node which is
+ the first node of the regular expression. */
+ first = dfa->str_tree->first->node_idx;
+ dfa->init_node = first;
+ err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ /* The back-references which are in initial states can epsilon transit,
+ since in this case all of the subexpressions can be null.
+ Then we add epsilon closures of the nodes which are the next nodes of
+ the back-references. */
+ if (dfa->nbackref > 0)
+ for (i = 0; i < init_nodes.nelem; ++i)
+ {
+ Idx node_idx = init_nodes.elems[i];
+ re_token_type_t type = dfa->nodes[node_idx].type;
+
+ Idx clexp_idx;
+ if (type != OP_BACK_REF)
+ continue;
+ for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
+ {
+ re_token_t *clexp_node;
+ clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
+ if (clexp_node->type == OP_CLOSE_SUBEXP
+ && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
+ break;
+ }
+ if (clexp_idx == init_nodes.nelem)
+ continue;
+
+ if (type == OP_BACK_REF)
+ {
+ Idx dest_idx = dfa->edests[node_idx].elems[0];
+ if (!re_node_set_contains (&init_nodes, dest_idx))
+ {
+ reg_errcode_t merge_err
+ = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
+ if (merge_err != REG_NOERROR)
+ return merge_err;
+ i = 0;
+ }
+ }
+ }
+
+ /* It must be the first time to invoke acquire_state. */
+ dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
+ /* We don't check ERR here, since the initial state must not be NULL. */
+ if (__glibc_unlikely (dfa->init_state == NULL))
+ return err;
+ if (dfa->init_state->has_constraint)
+ {
+ dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_WORD);
+ dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
+ CONTEXT_NEWLINE);
+ dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
+ &init_nodes,
+ CONTEXT_NEWLINE
+ | CONTEXT_BEGBUF);
+ if (__glibc_unlikely (dfa->init_state_word == NULL
+ || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL))
+ return err;
+ }
+ else
+ dfa->init_state_word = dfa->init_state_nl
+ = dfa->init_state_begbuf = dfa->init_state;
+
+ re_node_set_free (&init_nodes);
+ return REG_NOERROR;
+}
+
+#ifdef RE_ENABLE_I18N
+/* If it is possible to do searching in single byte encoding instead of UTF-8
+ to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
+ DFA nodes where needed. */
+
+static void
+optimize_utf8 (re_dfa_t *dfa)
+{
+ Idx node;
+ int i;
+ bool mb_chars = false;
+ bool has_period = false;
+
+ for (node = 0; node < dfa->nodes_len; ++node)
+ switch (dfa->nodes[node].type)
+ {
+ case CHARACTER:
+ if (dfa->nodes[node].opr.c >= ASCII_CHARS)
+ mb_chars = true;
+ break;
+ case ANCHOR:
+ switch (dfa->nodes[node].opr.ctx_type)
+ {
+ case LINE_FIRST:
+ case LINE_LAST:
+ case BUF_FIRST:
+ case BUF_LAST:
+ break;
+ default:
+ /* Word anchors etc. cannot be handled. It's okay to test
+ opr.ctx_type since constraints (for all DFA nodes) are
+ created by ORing one or more opr.ctx_type values. */
+ return;
+ }
+ break;
+ case OP_PERIOD:
+ has_period = true;
+ break;
+ case OP_BACK_REF:
+ case OP_ALT:
+ case END_OF_RE:
+ case OP_DUP_ASTERISK:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ break;
+ case COMPLEX_BRACKET:
+ return;
+ case SIMPLE_BRACKET:
+ /* Just double check. */
+ {
+ int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0
+ ? 0
+ : BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS);
+ for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
+ {
+ if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0)
+ return;
+ rshift = 0;
+ }
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ if (mb_chars || has_period)
+ for (node = 0; node < dfa->nodes_len; ++node)
+ {
+ if (dfa->nodes[node].type == CHARACTER
+ && dfa->nodes[node].opr.c >= ASCII_CHARS)
+ dfa->nodes[node].mb_partial = 0;
+ else if (dfa->nodes[node].type == OP_PERIOD)
+ dfa->nodes[node].type = OP_UTF8_PERIOD;
+ }
+
+ /* The search can be in single byte locale. */
+ dfa->mb_cur_max = 1;
+ dfa->is_utf8 = 0;
+ dfa->has_mb_node = dfa->nbackref > 0 || has_period;
+}
+#endif
+
+/* Analyze the structure tree, and calculate "first", "next", "edest",
+ "eclosure", and "inveclosure". */
+
+static reg_errcode_t
+analyze (regex_t *preg)
+{
+ re_dfa_t *dfa = preg->buffer;
+ reg_errcode_t ret;
+
+ /* Allocate arrays. */
+ dfa->nexts = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc);
+ dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
+ dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+ if (__glibc_unlikely (dfa->nexts == NULL || dfa->org_indices == NULL
+ || dfa->edests == NULL || dfa->eclosures == NULL))
+ return REG_ESPACE;
+
+ dfa->subexp_map = re_malloc (Idx, preg->re_nsub);
+ if (dfa->subexp_map != NULL)
+ {
+ Idx i;
+ for (i = 0; i < preg->re_nsub; i++)
+ dfa->subexp_map[i] = i;
+ preorder (dfa->str_tree, optimize_subexps, dfa);
+ for (i = 0; i < preg->re_nsub; i++)
+ if (dfa->subexp_map[i] != i)
+ break;
+ if (i == preg->re_nsub)
+ {
+ re_free (dfa->subexp_map);
+ dfa->subexp_map = NULL;
+ }
+ }
+
+ ret = postorder (dfa->str_tree, lower_subexps, preg);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ ret = postorder (dfa->str_tree, calc_first, dfa);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ preorder (dfa->str_tree, calc_next, dfa);
+ ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ ret = calc_eclosure (dfa);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+
+ /* We only need this during the prune_impossible_nodes pass in regexec.c;
+ skip it if p_i_n will not run, as calc_inveclosure can be quadratic. */
+ if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
+ if (__glibc_unlikely (dfa->inveclosures == NULL))
+ return REG_ESPACE;
+ ret = calc_inveclosure (dfa);
+ }
+
+ return ret;
+}
+
+/* Our parse trees are very unbalanced, so we cannot use a stack to
+ implement parse tree visits. Instead, we use parent pointers and
+ some hairy code in these two functions. */
+static reg_errcode_t
+postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node, *prev;
+
+ for (node = root; ; )
+ {
+ /* Descend down the tree, preferably to the left (or to the right
+ if that's the only child). */
+ while (node->left || node->right)
+ if (node->left)
+ node = node->left;
+ else
+ node = node->right;
+
+ do
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ if (node->parent == NULL)
+ return REG_NOERROR;
+ prev = node;
+ node = node->parent;
+ }
+ /* Go up while we have a node that is reached from the right. */
+ while (node->right == prev || node->right == NULL);
+ node = node->right;
+ }
+}
+
+static reg_errcode_t
+preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+ void *extra)
+{
+ bin_tree_t *node;
+
+ for (node = root; ; )
+ {
+ reg_errcode_t err = fn (extra, node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ node = node->left;
+ else
+ {
+ bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ if (!node)
+ return REG_NOERROR;
+ }
+ node = node->right;
+ }
+ }
+}
+
+/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
+ re_search_internal to map the inner one's opr.idx to this one's. Adjust
+ backreferences as well. Requires a preorder visit. */
+static reg_errcode_t
+optimize_subexps (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+
+ if (node->token.type == OP_BACK_REF && dfa->subexp_map)
+ {
+ int idx = node->token.opr.idx;
+ node->token.opr.idx = dfa->subexp_map[idx];
+ dfa->used_bkref_map |= 1 << node->token.opr.idx;
+ }
+
+ else if (node->token.type == SUBEXP
+ && node->left && node->left->token.type == SUBEXP)
+ {
+ Idx other_idx = node->left->token.opr.idx;
+
+ node->left = node->left->left;
+ if (node->left)
+ node->left->parent = node;
+
+ dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
+ if (other_idx < BITSET_WORD_BITS)
+ dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
+ }
+
+ return REG_NOERROR;
+}
+
+/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
+ of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP. */
+static reg_errcode_t
+lower_subexps (void *extra, bin_tree_t *node)
+{
+ regex_t *preg = (regex_t *) extra;
+ reg_errcode_t err = REG_NOERROR;
+
+ if (node->left && node->left->token.type == SUBEXP)
+ {
+ node->left = lower_subexp (&err, preg, node->left);
+ if (node->left)
+ node->left->parent = node;
+ }
+ if (node->right && node->right->token.type == SUBEXP)
+ {
+ node->right = lower_subexp (&err, preg, node->right);
+ if (node->right)
+ node->right->parent = node;
+ }
+
+ return err;
+}
+
+static bin_tree_t *
+lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_t *body = node->left;
+ bin_tree_t *op, *cls, *tree1, *tree;
+
+ if (preg->no_sub
+ /* We do not optimize empty subexpressions, because otherwise we may
+ have bad CONCAT nodes with NULL children. This is obviously not
+ very common, so we do not lose much. An example that triggers
+ this case is the sed "script" /\(\)/x. */
+ && node->left != NULL
+ && (node->token.opr.idx >= BITSET_WORD_BITS
+ || !(dfa->used_bkref_map
+ & ((bitset_word_t) 1 << node->token.opr.idx))))
+ return node->left;
+
+ /* Convert the SUBEXP node to the concatenation of an
+ OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP. */
+ op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
+ cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
+ tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
+ tree = create_tree (dfa, op, tree1, CONCAT);
+ if (__glibc_unlikely (tree == NULL || tree1 == NULL
+ || op == NULL || cls == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
+ op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
+ return tree;
+}
+
+/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
+ nodes. Requires a postorder visit. */
+static reg_errcode_t
+calc_first (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ if (node->token.type == CONCAT)
+ {
+ node->first = node->left->first;
+ node->node_idx = node->left->node_idx;
+ }
+ else
+ {
+ node->first = node;
+ node->node_idx = re_dfa_add_node (dfa, node->token);
+ if (__glibc_unlikely (node->node_idx == -1))
+ return REG_ESPACE;
+ if (node->token.type == ANCHOR)
+ dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 2: compute NEXT on the tree. Preorder visit. */
+static reg_errcode_t
+calc_next (void *extra, bin_tree_t *node)
+{
+ switch (node->token.type)
+ {
+ case OP_DUP_ASTERISK:
+ node->left->next = node;
+ break;
+ case CONCAT:
+ node->left->next = node->right->first;
+ node->right->next = node->next;
+ break;
+ default:
+ if (node->left)
+ node->left->next = node->next;
+ if (node->right)
+ node->right->next = node->next;
+ break;
+ }
+ return REG_NOERROR;
+}
+
+/* Pass 3: link all DFA nodes to their NEXT node (any order will do). */
+static reg_errcode_t
+link_nfa_nodes (void *extra, bin_tree_t *node)
+{
+ re_dfa_t *dfa = (re_dfa_t *) extra;
+ Idx idx = node->node_idx;
+ reg_errcode_t err = REG_NOERROR;
+
+ switch (node->token.type)
+ {
+ case CONCAT:
+ break;
+
+ case END_OF_RE:
+ DEBUG_ASSERT (node->next == NULL);
+ break;
+
+ case OP_DUP_ASTERISK:
+ case OP_ALT:
+ {
+ Idx left, right;
+ dfa->has_plural_match = 1;
+ if (node->left != NULL)
+ left = node->left->first->node_idx;
+ else
+ left = node->next->node_idx;
+ if (node->right != NULL)
+ right = node->right->first->node_idx;
+ else
+ right = node->next->node_idx;
+ DEBUG_ASSERT (left > -1);
+ DEBUG_ASSERT (right > -1);
+ err = re_node_set_init_2 (dfa->edests + idx, left, right);
+ }
+ break;
+
+ case ANCHOR:
+ case OP_OPEN_SUBEXP:
+ case OP_CLOSE_SUBEXP:
+ err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
+ break;
+
+ case OP_BACK_REF:
+ dfa->nexts[idx] = node->next->node_idx;
+ if (node->token.type == OP_BACK_REF)
+ err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
+ break;
+
+ default:
+ DEBUG_ASSERT (!IS_EPSILON_NODE (node->token.type));
+ dfa->nexts[idx] = node->next->node_idx;
+ break;
+ }
+
+ return err;
+}
+
+/* Duplicate the epsilon closure of the node ROOT_NODE.
+ Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
+ to their own constraint. */
+
+static reg_errcode_t
+duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node,
+ Idx root_node, unsigned int init_constraint)
+{
+ Idx org_node, clone_node;
+ bool ok;
+ unsigned int constraint = init_constraint;
+ for (org_node = top_org_node, clone_node = top_clone_node;;)
+ {
+ Idx org_dest, clone_dest;
+ if (dfa->nodes[org_node].type == OP_BACK_REF)
+ {
+ /* If the back reference epsilon-transit, its destination must
+ also have the constraint. Then duplicate the epsilon closure
+ of the destination of the back reference, and store it in
+ edests of the back reference. */
+ org_dest = dfa->nexts[org_node];
+ re_node_set_empty (dfa->edests + clone_node);
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (__glibc_unlikely (clone_dest == -1))
+ return REG_ESPACE;
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+ else if (dfa->edests[org_node].nelem == 0)
+ {
+ /* In case of the node can't epsilon-transit, don't duplicate the
+ destination and store the original destination as the
+ destination of the node. */
+ dfa->nexts[clone_node] = dfa->nexts[org_node];
+ break;
+ }
+ else if (dfa->edests[org_node].nelem == 1)
+ {
+ /* In case of the node can epsilon-transit, and it has only one
+ destination. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* If the node is root_node itself, it means the epsilon closure
+ has a loop. Then tie it to the destination of the root_node. */
+ if (org_node == root_node && clone_node != org_node)
+ {
+ ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ break;
+ }
+ /* In case the node has another constraint, append it. */
+ constraint |= dfa->nodes[org_node].constraint;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (__glibc_unlikely (clone_dest == -1))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+ else /* dfa->edests[org_node].nelem == 2 */
+ {
+ /* In case of the node can epsilon-transit, and it has two
+ destinations. In the bin_tree_t and DFA, that's '|' and '*'. */
+ org_dest = dfa->edests[org_node].elems[0];
+ re_node_set_empty (dfa->edests + clone_node);
+ /* Search for a duplicated node which satisfies the constraint. */
+ clone_dest = search_duplicated_node (dfa, org_dest, constraint);
+ if (clone_dest == -1)
+ {
+ /* There is no such duplicated node, create a new one. */
+ reg_errcode_t err;
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (__glibc_unlikely (clone_dest == -1))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ err = duplicate_node_closure (dfa, org_dest, clone_dest,
+ root_node, constraint);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ else
+ {
+ /* There is a duplicated node which satisfies the constraint,
+ use it to avoid infinite loop. */
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+
+ org_dest = dfa->edests[org_node].elems[1];
+ clone_dest = duplicate_node (dfa, org_dest, constraint);
+ if (__glibc_unlikely (clone_dest == -1))
+ return REG_ESPACE;
+ ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+ org_node = org_dest;
+ clone_node = clone_dest;
+ }
+ return REG_NOERROR;
+}
+
+/* Search for a node which is duplicated from the node ORG_NODE, and
+ satisfies the constraint CONSTRAINT. */
+
+static Idx
+search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+ unsigned int constraint)
+{
+ Idx idx;
+ for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
+ {
+ if (org_node == dfa->org_indices[idx]
+ && constraint == dfa->nodes[idx].constraint)
+ return idx; /* Found. */
+ }
+ return -1; /* Not found. */
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+ Return the index of the new node, or -1 if insufficient storage is
+ available. */
+
+static Idx
+duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint)
+{
+ Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
+ if (__glibc_likely (dup_idx != -1))
+ {
+ dfa->nodes[dup_idx].constraint = constraint;
+ dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
+ dfa->nodes[dup_idx].duplicated = 1;
+
+ /* Store the index of the original node. */
+ dfa->org_indices[dup_idx] = org_idx;
+ }
+ return dup_idx;
+}
+
+static reg_errcode_t
+calc_inveclosure (re_dfa_t *dfa)
+{
+ Idx src, idx;
+ bool ok;
+ for (idx = 0; idx < dfa->nodes_len; ++idx)
+ re_node_set_init_empty (dfa->inveclosures + idx);
+
+ for (src = 0; src < dfa->nodes_len; ++src)
+ {
+ Idx *elems = dfa->eclosures[src].elems;
+ for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
+ {
+ ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Calculate "eclosure" for all the node in DFA. */
+
+static reg_errcode_t
+calc_eclosure (re_dfa_t *dfa)
+{
+ Idx node_idx;
+ bool incomplete;
+ DEBUG_ASSERT (dfa->nodes_len > 0);
+ incomplete = false;
+ /* For each nodes, calculate epsilon closure. */
+ for (node_idx = 0; ; ++node_idx)
+ {
+ reg_errcode_t err;
+ re_node_set eclosure_elem;
+ if (node_idx == dfa->nodes_len)
+ {
+ if (!incomplete)
+ break;
+ incomplete = false;
+ node_idx = 0;
+ }
+
+ DEBUG_ASSERT (dfa->eclosures[node_idx].nelem != -1);
+
+ /* If we have already calculated, skip it. */
+ if (dfa->eclosures[node_idx].nelem != 0)
+ continue;
+ /* Calculate epsilon closure of 'node_idx'. */
+ err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ if (dfa->eclosures[node_idx].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Calculate epsilon closure of NODE. */
+
+static reg_errcode_t
+calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
+{
+ reg_errcode_t err;
+ Idx i;
+ re_node_set eclosure;
+ bool ok;
+ bool incomplete = false;
+ err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ /* This indicates that we are calculating this node now.
+ We reference this value to avoid infinite loop. */
+ dfa->eclosures[node].nelem = -1;
+
+ /* If the current node has constraints, duplicate all nodes
+ since they must inherit the constraints. */
+ if (dfa->nodes[node].constraint
+ && dfa->edests[node].nelem
+ && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
+ {
+ err = duplicate_node_closure (dfa, node, node, node,
+ dfa->nodes[node].constraint);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+
+ /* Expand each epsilon destination nodes. */
+ if (IS_EPSILON_NODE(dfa->nodes[node].type))
+ for (i = 0; i < dfa->edests[node].nelem; ++i)
+ {
+ re_node_set eclosure_elem;
+ Idx edest = dfa->edests[node].elems[i];
+ /* If calculating the epsilon closure of 'edest' is in progress,
+ return intermediate result. */
+ if (dfa->eclosures[edest].nelem == -1)
+ {
+ incomplete = true;
+ continue;
+ }
+ /* If we haven't calculated the epsilon closure of 'edest' yet,
+ calculate now. Otherwise use calculated epsilon closure. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ else
+ eclosure_elem = dfa->eclosures[edest];
+ /* Merge the epsilon closure of 'edest'. */
+ err = re_node_set_merge (&eclosure, &eclosure_elem);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ /* If the epsilon closure of 'edest' is incomplete,
+ the epsilon closure of this node is also incomplete. */
+ if (dfa->eclosures[edest].nelem == 0)
+ {
+ incomplete = true;
+ re_node_set_free (&eclosure_elem);
+ }
+ }
+
+ /* An epsilon closure includes itself. */
+ ok = re_node_set_insert (&eclosure, node);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ if (incomplete && !root)
+ dfa->eclosures[node].nelem = 0;
+ else
+ dfa->eclosures[node] = eclosure;
+ *new_set = eclosure;
+ return REG_NOERROR;
+}
+
+/* Functions for token which are used in the parser. */
+
+/* Fetch a token from INPUT.
+ We must not use this function inside bracket expressions. */
+
+static void
+fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
+{
+ re_string_skip_bytes (input, peek_token (result, input, syntax));
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function inside bracket expressions. */
+
+static int
+peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+ token->word_char = 0;
+#ifdef RE_ENABLE_I18N
+ token->mb_partial = 0;
+ if (input->mb_cur_max > 1
+ && !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ token->mb_partial = 1;
+ return 1;
+ }
+#endif
+ if (c == '\\')
+ {
+ unsigned char c2;
+ if (re_string_cur_idx (input) + 1 >= re_string_length (input))
+ {
+ token->type = BACK_SLASH;
+ return 1;
+ }
+
+ c2 = re_string_peek_byte_case (input, 1);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input,
+ re_string_cur_idx (input) + 1);
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (c2) != 0;
+
+ switch (c2)
+ {
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '1': case '2': case '3': case '4': case '5':
+ case '6': case '7': case '8': case '9':
+ if (!(syntax & RE_NO_BK_REFS))
+ {
+ token->type = OP_BACK_REF;
+ token->opr.idx = c2 - '1';
+ }
+ break;
+ case '<':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_FIRST;
+ }
+ break;
+ case '>':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_LAST;
+ }
+ break;
+ case 'b':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = WORD_DELIM;
+ }
+ break;
+ case 'B':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = NOT_WORD_DELIM;
+ }
+ break;
+ case 'w':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_WORD;
+ break;
+ case 'W':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTWORD;
+ break;
+ case 's':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_SPACE;
+ break;
+ case 'S':
+ if (!(syntax & RE_NO_GNU_OPS))
+ token->type = OP_NOTSPACE;
+ break;
+ case '`':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_FIRST;
+ }
+ break;
+ case '\'':
+ if (!(syntax & RE_NO_GNU_OPS))
+ {
+ token->type = ANCHOR;
+ token->opr.ctx_type = BUF_LAST;
+ }
+ break;
+ case '(':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (!(syntax & RE_NO_BK_PARENS))
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ default:
+ break;
+ }
+ return 2;
+ }
+
+ token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
+ token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+ }
+ else
+#endif
+ token->word_char = IS_WORD_CHAR (token->opr.c);
+
+ switch (c)
+ {
+ case '\n':
+ if (syntax & RE_NEWLINE_ALT)
+ token->type = OP_ALT;
+ break;
+ case '|':
+ if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
+ token->type = OP_ALT;
+ break;
+ case '*':
+ token->type = OP_DUP_ASTERISK;
+ break;
+ case '+':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_PLUS;
+ break;
+ case '?':
+ if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+ token->type = OP_DUP_QUESTION;
+ break;
+ case '{':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_OPEN_DUP_NUM;
+ break;
+ case '}':
+ if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+ token->type = OP_CLOSE_DUP_NUM;
+ break;
+ case '(':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_OPEN_SUBEXP;
+ break;
+ case ')':
+ if (syntax & RE_NO_BK_PARENS)
+ token->type = OP_CLOSE_SUBEXP;
+ break;
+ case '[':
+ token->type = OP_OPEN_BRACKET;
+ break;
+ case '.':
+ token->type = OP_PERIOD;
+ break;
+ case '^':
+ if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE))
+ && re_string_cur_idx (input) != 0)
+ {
+ char prev = re_string_peek_byte (input, -1);
+ if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_FIRST;
+ break;
+ case '$':
+ if (!(syntax & RE_CONTEXT_INDEP_ANCHORS)
+ && re_string_cur_idx (input) + 1 != re_string_length (input))
+ {
+ re_token_t next;
+ re_string_skip_bytes (input, 1);
+ peek_token (&next, input, syntax);
+ re_string_skip_bytes (input, -1);
+ if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
+ break;
+ }
+ token->type = ANCHOR;
+ token->opr.ctx_type = LINE_LAST;
+ break;
+ default:
+ break;
+ }
+ return 1;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+ We must not use this function out of bracket expressions. */
+
+static int
+peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+ unsigned char c;
+ if (re_string_eoi (input))
+ {
+ token->type = END_OF_RE;
+ return 0;
+ }
+ c = re_string_peek_byte (input, 0);
+ token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1
+ && !re_string_first_byte (input, re_string_cur_idx (input)))
+ {
+ token->type = CHARACTER;
+ return 1;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
+ && re_string_cur_idx (input) + 1 < re_string_length (input))
+ {
+ /* In this case, '\' escape a character. */
+ unsigned char c2;
+ re_string_skip_bytes (input, 1);
+ c2 = re_string_peek_byte (input, 0);
+ token->opr.c = c2;
+ token->type = CHARACTER;
+ return 1;
+ }
+ if (c == '[') /* '[' is a special char in a bracket exps. */
+ {
+ unsigned char c2;
+ int token_len;
+ if (re_string_cur_idx (input) + 1 < re_string_length (input))
+ c2 = re_string_peek_byte (input, 1);
+ else
+ c2 = 0;
+ token->opr.c = c2;
+ token_len = 2;
+ switch (c2)
+ {
+ case '.':
+ token->type = OP_OPEN_COLL_ELEM;
+ break;
+
+ case '=':
+ token->type = OP_OPEN_EQUIV_CLASS;
+ break;
+
+ case ':':
+ if (syntax & RE_CHAR_CLASSES)
+ {
+ token->type = OP_OPEN_CHAR_CLASS;
+ break;
+ }
+ FALLTHROUGH;
+ default:
+ token->type = CHARACTER;
+ token->opr.c = c;
+ token_len = 1;
+ break;
+ }
+ return token_len;
+ }
+ switch (c)
+ {
+ case '-':
+ token->type = OP_CHARSET_RANGE;
+ break;
+ case ']':
+ token->type = OP_CLOSE_BRACKET;
+ break;
+ case '^':
+ token->type = OP_NON_MATCH_LIST;
+ break;
+ default:
+ token->type = CHARACTER;
+ }
+ return 1;
+}
+
+/* Functions for parser. */
+
+/* Entry point of the parser.
+ Parse the regular expression REGEXP and return the structure tree.
+ If an error occurs, ERR is set by error code, and return NULL.
+ This function build the following tree, from regular expression <reg_exp>:
+ CAT
+ / \
+ / \
+ <reg_exp> EOR
+
+ CAT means concatenation.
+ EOR means end of regular expression. */
+
+static bin_tree_t *
+parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
+ reg_errcode_t *err)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_t *tree, *eor, *root;
+ re_token_t current_token;
+ dfa->syntax = syntax;
+ fetch_token (&current_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+ eor = create_tree (dfa, NULL, NULL, END_OF_RE);
+ if (tree != NULL)
+ root = create_tree (dfa, tree, eor, CONCAT);
+ else
+ root = eor;
+ if (__glibc_unlikely (eor == NULL || root == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ return root;
+}
+
+/* This function build the following tree, from regular expression
+ <branch1>|<branch2>:
+ ALT
+ / \
+ / \
+ <branch1> <branch2>
+
+ ALT means alternative, which represents the operator '|'. */
+
+static bin_tree_t *
+parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_t *tree, *branch = NULL;
+ bitset_word_t initial_bkref_map = dfa->completed_bkref_map;
+ tree = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+
+ while (token->type == OP_ALT)
+ {
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+ if (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map;
+ dfa->completed_bkref_map = initial_bkref_map;
+ branch = parse_branch (regexp, preg, token, syntax, nest, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && branch == NULL))
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ return NULL;
+ }
+ dfa->completed_bkref_map |= accumulated_bkref_map;
+ }
+ else
+ branch = NULL;
+ tree = create_tree (dfa, tree, branch, OP_ALT);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ <exp1><exp2>:
+ CAT
+ / \
+ / \
+ <exp1> <exp2>
+
+ CAT means concatenation. */
+
+static bin_tree_t *
+parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ bin_tree_t *tree, *expr;
+ re_dfa_t *dfa = preg->buffer;
+ tree = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+
+ while (token->type != OP_ALT && token->type != END_OF_RE
+ && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+ {
+ expr = parse_expression (regexp, preg, token, syntax, nest, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && expr == NULL))
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ return NULL;
+ }
+ if (tree != NULL && expr != NULL)
+ {
+ bin_tree_t *newtree = create_tree (dfa, tree, expr, CONCAT);
+ if (newtree == NULL)
+ {
+ postorder (expr, free_tree, NULL);
+ postorder (tree, free_tree, NULL);
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ tree = newtree;
+ }
+ else if (tree == NULL)
+ tree = expr;
+ /* Otherwise expr == NULL, we don't need to create new tree. */
+ }
+ return tree;
+}
+
+/* This function build the following tree, from regular expression a*:
+ *
+ |
+ a
+*/
+
+static bin_tree_t *
+parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_t *tree;
+ switch (token->type)
+ {
+ case CHARACTER:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (!re_string_eoi (regexp)
+ && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
+ {
+ bin_tree_t *mbc_remain;
+ fetch_token (token, regexp, syntax);
+ mbc_remain = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree, mbc_remain, CONCAT);
+ if (__glibc_unlikely (mbc_remain == NULL || tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ }
+#endif
+ break;
+
+ case OP_OPEN_SUBEXP:
+ tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+ break;
+
+ case OP_OPEN_BRACKET:
+ tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+ break;
+
+ case OP_BACK_REF:
+ if (!__glibc_likely (dfa->completed_bkref_map & (1 << token->opr.idx)))
+ {
+ *err = REG_ESUBREG;
+ return NULL;
+ }
+ dfa->used_bkref_map |= 1 << token->opr.idx;
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ ++dfa->nbackref;
+ dfa->has_mb_node = 1;
+ break;
+
+ case OP_OPEN_DUP_NUM:
+ if (syntax & RE_CONTEXT_INVALID_DUP)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ FALLTHROUGH;
+ case OP_DUP_ASTERISK:
+ case OP_DUP_PLUS:
+ case OP_DUP_QUESTION:
+ if (syntax & RE_CONTEXT_INVALID_OPS)
+ {
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ else if (syntax & RE_CONTEXT_INDEP_OPS)
+ {
+ fetch_token (token, regexp, syntax);
+ return parse_expression (regexp, preg, token, syntax, nest, err);
+ }
+ FALLTHROUGH;
+ case OP_CLOSE_SUBEXP:
+ if ((token->type == OP_CLOSE_SUBEXP)
+ && !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+ {
+ *err = REG_ERPAREN;
+ return NULL;
+ }
+ FALLTHROUGH;
+ case OP_CLOSE_DUP_NUM:
+ /* We treat it as a normal character. */
+
+ /* Then we can these characters as normal characters. */
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be initialized already
+ by peek_token. */
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ break;
+
+ case ANCHOR:
+ if ((token->opr.ctx_type
+ & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
+ && dfa->word_ops_used == 0)
+ init_word_char (dfa);
+ if (token->opr.ctx_type == WORD_DELIM
+ || token->opr.ctx_type == NOT_WORD_DELIM)
+ {
+ bin_tree_t *tree_first, *tree_last;
+ if (token->opr.ctx_type == WORD_DELIM)
+ {
+ token->opr.ctx_type = WORD_FIRST;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = WORD_LAST;
+ }
+ else
+ {
+ token->opr.ctx_type = INSIDE_WORD;
+ tree_first = create_token_tree (dfa, NULL, NULL, token);
+ token->opr.ctx_type = INSIDE_NOTWORD;
+ }
+ tree_last = create_token_tree (dfa, NULL, NULL, token);
+ tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
+ if (__glibc_unlikely (tree_first == NULL || tree_last == NULL
+ || tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ else
+ {
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ }
+ /* We must return here, since ANCHORs can't be followed
+ by repetition operators.
+ eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
+ it must not be "<ANCHOR(^)><REPEAT(*)>". */
+ fetch_token (token, regexp, syntax);
+ return tree;
+
+ case OP_PERIOD:
+ tree = create_token_tree (dfa, NULL, NULL, token);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ if (dfa->mb_cur_max > 1)
+ dfa->has_mb_node = 1;
+ break;
+
+ case OP_WORD:
+ case OP_NOTWORD:
+ tree = build_charclass_op (dfa, regexp->trans,
+ "alnum",
+ "_",
+ token->type == OP_NOTWORD, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+ break;
+
+ case OP_SPACE:
+ case OP_NOTSPACE:
+ tree = build_charclass_op (dfa, regexp->trans,
+ "space",
+ "",
+ token->type == OP_NOTSPACE, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+ return NULL;
+ break;
+
+ case OP_ALT:
+ case END_OF_RE:
+ return NULL;
+
+ case BACK_SLASH:
+ *err = REG_EESCAPE;
+ return NULL;
+
+ default:
+ /* Must not happen? */
+ DEBUG_ASSERT (false);
+ return NULL;
+ }
+ fetch_token (token, regexp, syntax);
+
+ while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
+ || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
+ {
+ bin_tree_t *dup_tree = parse_dup_op (tree, regexp, dfa, token,
+ syntax, err);
+ if (__glibc_unlikely (*err != REG_NOERROR && dup_tree == NULL))
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ return NULL;
+ }
+ tree = dup_tree;
+ /* In BRE consecutive duplications are not allowed. */
+ if ((syntax & RE_CONTEXT_INVALID_DUP)
+ && (token->type == OP_DUP_ASTERISK
+ || token->type == OP_OPEN_DUP_NUM))
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ *err = REG_BADRPT;
+ return NULL;
+ }
+ }
+
+ return tree;
+}
+
+/* This function build the following tree, from regular expression
+ (<reg_exp>):
+ SUBEXP
+ |
+ <reg_exp>
+*/
+
+static bin_tree_t *
+parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+ reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+ re_dfa_t *dfa = preg->buffer;
+ bin_tree_t *tree;
+ size_t cur_nsub;
+ cur_nsub = preg->re_nsub++;
+
+ fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+
+ /* The subexpression may be a null string. */
+ if (token->type == OP_CLOSE_SUBEXP)
+ tree = NULL;
+ else
+ {
+ tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
+ if (__glibc_unlikely (*err == REG_NOERROR
+ && token->type != OP_CLOSE_SUBEXP))
+ {
+ if (tree != NULL)
+ postorder (tree, free_tree, NULL);
+ *err = REG_EPAREN;
+ }
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+ }
+
+ if (cur_nsub <= '9' - '1')
+ dfa->completed_bkref_map |= 1 << cur_nsub;
+
+ tree = create_tree (dfa, tree, NULL, SUBEXP);
+ if (__glibc_unlikely (tree == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ tree->token.opr.idx = cur_nsub;
+ return tree;
+}
+
+/* This function parse repetition operators like "*", "+", "{1,3}" etc. */
+
+static bin_tree_t *
+parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
+ re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
+{
+ bin_tree_t *tree = NULL, *old_tree = NULL;
+ Idx i, start, end, start_idx = re_string_cur_idx (regexp);
+ re_token_t start_token = *token;
+
+ if (token->type == OP_OPEN_DUP_NUM)
+ {
+ end = 0;
+ start = fetch_number (regexp, token, syntax);
+ if (start == -1)
+ {
+ if (token->type == CHARACTER && token->opr.c == ',')
+ start = 0; /* We treat "{,m}" as "{0,m}". */
+ else
+ {
+ *err = REG_BADBR; /* <re>{} is invalid. */
+ return NULL;
+ }
+ }
+ if (__glibc_likely (start != -2))
+ {
+ /* We treat "{n}" as "{n,n}". */
+ end = ((token->type == OP_CLOSE_DUP_NUM) ? start
+ : ((token->type == CHARACTER && token->opr.c == ',')
+ ? fetch_number (regexp, token, syntax) : -2));
+ }
+ if (__glibc_unlikely (start == -2 || end == -2))
+ {
+ /* Invalid sequence. */
+ if (__glibc_unlikely (!(syntax & RE_INVALID_INTERVAL_ORD)))
+ {
+ if (token->type == END_OF_RE)
+ *err = REG_EBRACE;
+ else
+ *err = REG_BADBR;
+
+ return NULL;
+ }
+
+ /* If the syntax bit is set, rollback. */
+ re_string_set_index (regexp, start_idx);
+ *token = start_token;
+ token->type = CHARACTER;
+ /* mb_partial and word_char bits should be already initialized by
+ peek_token. */
+ return elem;
+ }
+
+ if (__glibc_unlikely ((end != -1 && start > end)
+ || token->type != OP_CLOSE_DUP_NUM))
+ {
+ /* First number greater than second. */
+ *err = REG_BADBR;
+ return NULL;
+ }
+
+ if (__glibc_unlikely (RE_DUP_MAX < (end == -1 ? start : end)))
+ {
+ *err = REG_ESIZE;
+ return NULL;
+ }
+ }
+ else
+ {
+ start = (token->type == OP_DUP_PLUS) ? 1 : 0;
+ end = (token->type == OP_DUP_QUESTION) ? 1 : -1;
+ }
+
+ fetch_token (token, regexp, syntax);
+
+ if (__glibc_unlikely (elem == NULL))
+ return NULL;
+ if (__glibc_unlikely (start == 0 && end == 0))
+ {
+ postorder (elem, free_tree, NULL);
+ return NULL;
+ }
+
+ /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}". */
+ if (__glibc_unlikely (start > 0))
+ {
+ tree = elem;
+ for (i = 2; i <= start; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (__glibc_unlikely (elem == NULL || tree == NULL))
+ goto parse_dup_op_espace;
+ }
+
+ if (start == end)
+ return tree;
+
+ /* Duplicate ELEM before it is marked optional. */
+ elem = duplicate_tree (elem, dfa);
+ if (__glibc_unlikely (elem == NULL))
+ goto parse_dup_op_espace;
+ old_tree = tree;
+ }
+ else
+ old_tree = NULL;
+
+ if (elem->token.type == SUBEXP)
+ {
+ uintptr_t subidx = elem->token.opr.idx;
+ postorder (elem, mark_opt_subexp, (void *) subidx);
+ }
+
+ tree = create_tree (dfa, elem, NULL,
+ (end == -1 ? OP_DUP_ASTERISK : OP_ALT));
+ if (__glibc_unlikely (tree == NULL))
+ goto parse_dup_op_espace;
+
+ /* This loop is actually executed only when end != -1,
+ to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?... We have
+ already created the start+1-th copy. */
+ if (TYPE_SIGNED (Idx) || end != -1)
+ for (i = start + 2; i <= end; ++i)
+ {
+ elem = duplicate_tree (elem, dfa);
+ tree = create_tree (dfa, tree, elem, CONCAT);
+ if (__glibc_unlikely (elem == NULL || tree == NULL))
+ goto parse_dup_op_espace;
+
+ tree = create_tree (dfa, tree, NULL, OP_ALT);
+ if (__glibc_unlikely (tree == NULL))
+ goto parse_dup_op_espace;
+ }
+
+ if (old_tree)
+ tree = create_tree (dfa, old_tree, tree, CONCAT);
+
+ return tree;
+
+ parse_dup_op_espace:
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* Size of the names for collating symbol/equivalence_class/character_class.
+ I'm not sure, but maybe enough. */
+#define BRACKET_NAME_BUF_SIZE 32
+
+#ifndef _LIBC
+
+# ifdef RE_ENABLE_I18N
+/* Convert the byte B to the corresponding wide character. In a
+ unibyte locale, treat B as itself. In a multibyte locale, return
+ WEOF if B is an encoding error. */
+static wint_t
+parse_byte (unsigned char b, re_charset_t *mbcset)
+{
+ return mbcset == NULL ? b : __btowc (b);
+}
+# endif
+
+ /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument since we may
+ update it. */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_range_exp (const reg_syntax_t syntax,
+ bitset_t sbcset,
+ re_charset_t *mbcset,
+ Idx *range_alloc,
+ const bracket_elem_t *start_elem,
+ const bracket_elem_t *end_elem)
+# else /* not RE_ENABLE_I18N */
+build_range_exp (const reg_syntax_t syntax,
+ bitset_t sbcset,
+ const bracket_elem_t *start_elem,
+ const bracket_elem_t *end_elem)
+# endif /* not RE_ENABLE_I18N */
+{
+ unsigned int start_ch, end_ch;
+ /* Equivalence Classes and Character Classes can't be a range start/end. */
+ if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
+ || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS
+ || end_elem->type == CHAR_CLASS))
+ return REG_ERANGE;
+
+ /* We can handle no multi character collating elements without libc
+ support. */
+ if (__glibc_unlikely ((start_elem->type == COLL_SYM
+ && strlen ((char *) start_elem->opr.name) > 1)
+ || (end_elem->type == COLL_SYM
+ && strlen ((char *) end_elem->opr.name) > 1)))
+ return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+ {
+ wchar_t wc;
+ wint_t start_wc;
+ wint_t end_wc;
+
+ start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
+ ? parse_byte (start_ch, mbcset) : start_elem->opr.wch);
+ end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+ ? parse_byte (end_ch, mbcset) : end_elem->opr.wch);
+ if (start_wc == WEOF || end_wc == WEOF)
+ return REG_ECOLLATE;
+ else if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
+ && start_wc > end_wc))
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, for !_LIBC we have no collation elements: if the
+ character set is single byte, the single byte character set
+ that we build below suffices. parse_bracket_exp passes
+ no MBCSET if dfa->mb_cur_max == 1. */
+ if (mbcset)
+ {
+ /* Check the space of the arrays. */
+ if (__glibc_unlikely (*range_alloc == mbcset->nranges))
+ {
+ /* There is not enough space, need realloc. */
+ wchar_t *new_array_start, *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ /* Use realloc since mbcset->range_starts and mbcset->range_ends
+ are NULL if *range_alloc == 0. */
+ new_array_start = re_realloc (mbcset->range_starts, wchar_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, wchar_t,
+ new_nranges);
+
+ if (__glibc_unlikely (new_array_start == NULL
+ || new_array_end == NULL))
+ {
+ re_free (new_array_start);
+ re_free (new_array_end);
+ return REG_ESPACE;
+ }
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_wc;
+ mbcset->range_ends[mbcset->nranges++] = end_wc;
+ }
+
+ /* Build the table for single byte characters. */
+ for (wc = 0; wc < SBC_MAX; ++wc)
+ {
+ if (start_wc <= wc && wc <= end_wc)
+ bitset_set (sbcset, wc);
+ }
+ }
+# else /* not RE_ENABLE_I18N */
+ {
+ unsigned int ch;
+ start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
+ : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+ : 0));
+ end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
+ : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+ : 0));
+ if (start_ch > end_ch)
+ return REG_ERANGE;
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ if (start_ch <= ch && ch <= end_ch)
+ bitset_set (sbcset, ch);
+ }
+# endif /* not RE_ENABLE_I18N */
+ return REG_NOERROR;
+}
+#endif /* not _LIBC */
+
+#ifndef _LIBC
+/* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument since we may update it. */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
+ Idx *coll_sym_alloc, const unsigned char *name)
+# else /* not RE_ENABLE_I18N */
+build_collating_symbol (bitset_t sbcset, const unsigned char *name)
+# endif /* not RE_ENABLE_I18N */
+{
+ size_t name_len = strlen ((const char *) name);
+ if (__glibc_unlikely (name_len != 1))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+}
+#endif /* not _LIBC */
+
+/* This function parse bracket expression like "[abc]", "[a-c]",
+ "[[.a-a.]]" etc. */
+
+static bin_tree_t *
+parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
+ reg_syntax_t syntax, reg_errcode_t *err)
+{
+#ifdef _LIBC
+ const unsigned char *collseqmb;
+ const char *collseqwc;
+ uint32_t nrules;
+ int32_t table_size;
+ const int32_t *symb_table;
+ const unsigned char *extra;
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Seek the collating symbol entry corresponding to NAME.
+ Return the index of the symbol in the SYMB_TABLE,
+ or -1 if not found. */
+
+ auto inline int32_t
+ __attribute__ ((always_inline))
+ seek_collating_symbol_entry (const unsigned char *name, size_t name_len)
+ {
+ int32_t elem;
+
+ for (elem = 0; elem < table_size; elem++)
+ if (symb_table[2 * elem] != 0)
+ {
+ int32_t idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ if (/* Compare the length of the name. */
+ name_len == extra[idx]
+ /* Compare the name. */
+ && memcmp (name, &extra[idx + 1], name_len) == 0)
+ /* Yep, this is the entry. */
+ return elem;
+ }
+ return -1;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Look up the collation sequence value of BR_ELEM.
+ Return the value if succeeded, UINT_MAX otherwise. */
+
+ auto inline unsigned int
+ __attribute__ ((always_inline))
+ lookup_collation_sequence_value (bracket_elem_t *br_elem)
+ {
+ if (br_elem->type == SB_CHAR)
+ {
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ return collseqmb[br_elem->opr.ch];
+ else
+ {
+ wint_t wc = __btowc (br_elem->opr.ch);
+ return __collseq_table_lookup (collseqwc, wc);
+ }
+ }
+ else if (br_elem->type == MB_CHAR)
+ {
+ if (nrules != 0)
+ return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
+ }
+ else if (br_elem->type == COLL_SYM)
+ {
+ size_t sym_name_len = strlen ((char *) br_elem->opr.name);
+ if (nrules != 0)
+ {
+ int32_t elem, idx;
+ elem = seek_collating_symbol_entry (br_elem->opr.name,
+ sym_name_len);
+ if (elem != -1)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ /* Skip the byte sequence of the collating element. */
+ idx += 1 + extra[idx];
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the multibyte collation sequence value. */
+ idx += sizeof (unsigned int);
+ /* Skip the wide char sequence of the collating element. */
+ idx += sizeof (unsigned int) *
+ (1 + *(unsigned int *) (extra + idx));
+ /* Return the collation sequence value. */
+ return *(unsigned int *) (extra + idx);
+ }
+ else if (sym_name_len == 1)
+ {
+ /* No valid character. Match it as a single byte
+ character. */
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ }
+ else if (sym_name_len == 1)
+ return collseqmb[br_elem->opr.name[0]];
+ }
+ return UINT_MAX;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Build the range expression which starts from START_ELEM, and ends
+ at END_ELEM. The result are written to MBCSET and SBCSET.
+ RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+ mbcset->range_ends, is a pointer argument since we may
+ update it. */
+
+ auto inline reg_errcode_t
+ __attribute__ ((always_inline))
+ build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc,
+ bracket_elem_t *start_elem, bracket_elem_t *end_elem)
+ {
+ unsigned int ch;
+ uint32_t start_collseq;
+ uint32_t end_collseq;
+
+ /* Equivalence Classes and Character Classes can't be a range
+ start/end. */
+ if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
+ || start_elem->type == CHAR_CLASS
+ || end_elem->type == EQUIV_CLASS
+ || end_elem->type == CHAR_CLASS))
+ return REG_ERANGE;
+
+ /* FIXME: Implement rational ranges here, too. */
+ start_collseq = lookup_collation_sequence_value (start_elem);
+ end_collseq = lookup_collation_sequence_value (end_elem);
+ /* Check start/end collation sequence values. */
+ if (__glibc_unlikely (start_collseq == UINT_MAX
+ || end_collseq == UINT_MAX))
+ return REG_ECOLLATE;
+ if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
+ && start_collseq > end_collseq))
+ return REG_ERANGE;
+
+ /* Got valid collation sequence values, add them as a new entry.
+ However, if we have no collation elements, and the character set
+ is single byte, the single byte character set that we
+ build below suffices. */
+ if (nrules > 0 || dfa->mb_cur_max > 1)
+ {
+ /* Check the space of the arrays. */
+ if (__glibc_unlikely (*range_alloc == mbcset->nranges))
+ {
+ /* There is not enough space, need realloc. */
+ uint32_t *new_array_start;
+ uint32_t *new_array_end;
+ Idx new_nranges;
+
+ /* +1 in case of mbcset->nranges is 0. */
+ new_nranges = 2 * mbcset->nranges + 1;
+ new_array_start = re_realloc (mbcset->range_starts, uint32_t,
+ new_nranges);
+ new_array_end = re_realloc (mbcset->range_ends, uint32_t,
+ new_nranges);
+
+ if (__glibc_unlikely (new_array_start == NULL
+ || new_array_end == NULL))
+ return REG_ESPACE;
+
+ mbcset->range_starts = new_array_start;
+ mbcset->range_ends = new_array_end;
+ *range_alloc = new_nranges;
+ }
+
+ mbcset->range_starts[mbcset->nranges] = start_collseq;
+ mbcset->range_ends[mbcset->nranges++] = end_collseq;
+ }
+
+ /* Build the table for single byte characters. */
+ for (ch = 0; ch < SBC_MAX; ch++)
+ {
+ uint32_t ch_collseq;
+ /*
+ if (MB_CUR_MAX == 1)
+ */
+ if (nrules == 0)
+ ch_collseq = collseqmb[ch];
+ else
+ ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
+ if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
+ bitset_set (sbcset, ch);
+ }
+ return REG_NOERROR;
+ }
+
+ /* Local function for parse_bracket_exp used in _LIBC environment.
+ Build the collating element which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+ pointer argument since we may update it. */
+
+ auto inline reg_errcode_t
+ __attribute__ ((always_inline))
+ build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
+ Idx *coll_sym_alloc, const unsigned char *name)
+ {
+ int32_t elem, idx;
+ size_t name_len = strlen ((const char *) name);
+ if (nrules != 0)
+ {
+ elem = seek_collating_symbol_entry (name, name_len);
+ if (elem != -1)
+ {
+ /* We found the entry. */
+ idx = symb_table[2 * elem + 1];
+ /* Skip the name of collating element name. */
+ idx += 1 + extra[idx];
+ }
+ else if (name_len == 1)
+ {
+ /* No valid character, treat it as a normal
+ character. */
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ else
+ return REG_ECOLLATE;
+
+ /* Got valid collation sequence, add it as a new entry. */
+ /* Check the space of the arrays. */
+ if (__glibc_unlikely (*coll_sym_alloc == mbcset->ncoll_syms))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->ncoll_syms is 0. */
+ Idx new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
+ /* Use realloc since mbcset->coll_syms is NULL
+ if *alloc == 0. */
+ int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
+ new_coll_sym_alloc);
+ if (__glibc_unlikely (new_coll_syms == NULL))
+ return REG_ESPACE;
+ mbcset->coll_syms = new_coll_syms;
+ *coll_sym_alloc = new_coll_sym_alloc;
+ }
+ mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
+ return REG_NOERROR;
+ }
+ else
+ {
+ if (__glibc_unlikely (name_len != 1))
+ return REG_ECOLLATE;
+ else
+ {
+ bitset_set (sbcset, name[0]);
+ return REG_NOERROR;
+ }
+ }
+ }
+#endif
+
+ re_token_t br_token;
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
+ Idx equiv_class_alloc = 0, char_class_alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ bool non_match = false;
+ bin_tree_t *work_tree;
+ int token_len;
+ bool first_round = true;
+#ifdef _LIBC
+ collseqmb = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules)
+ {
+ /*
+ if (MB_CUR_MAX > 1)
+ */
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
+ symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_TABLEMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_SYMB_EXTRAMB);
+ }
+#endif
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+#ifdef RE_ENABLE_I18N
+ if (__glibc_unlikely (sbcset == NULL || mbcset == NULL))
+#else
+ if (__glibc_unlikely (sbcset == NULL))
+#endif /* RE_ENABLE_I18N */
+ {
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ re_free (mbcset);
+#endif
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (__glibc_unlikely (token->type == END_OF_RE))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_NON_MATCH_LIST)
+ {
+#ifdef RE_ENABLE_I18N
+ mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+ non_match = true;
+ if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+ bitset_set (sbcset, '\n');
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+ if (__glibc_unlikely (token->type == END_OF_RE))
+ {
+ *err = REG_BADPAT;
+ goto parse_bracket_exp_free_return;
+ }
+ }
+
+ /* We treat the first ']' as a normal character. */
+ if (token->type == OP_CLOSE_BRACKET)
+ token->type = CHARACTER;
+
+ while (1)
+ {
+ bracket_elem_t start_elem, end_elem;
+ unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
+ unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
+ reg_errcode_t ret;
+ int token_len2 = 0;
+ bool is_range_exp = false;
+ re_token_t token2;
+
+ start_elem.opr.name = start_name_buf;
+ start_elem.type = COLL_SYM;
+ ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+ syntax, first_round);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+ first_round = false;
+
+ /* Get information about the next token. We need it in any case. */
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+ /* Do not check for ranges if we know they are not allowed. */
+ if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
+ {
+ if (__glibc_unlikely (token->type == END_OF_RE))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CHARSET_RANGE)
+ {
+ re_string_skip_bytes (regexp, token_len); /* Skip '-'. */
+ token_len2 = peek_token_bracket (&token2, regexp, syntax);
+ if (__glibc_unlikely (token2.type == END_OF_RE))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token2.type == OP_CLOSE_BRACKET)
+ {
+ /* We treat the last '-' as a normal character. */
+ re_string_skip_bytes (regexp, -token_len);
+ token->type = CHARACTER;
+ }
+ else
+ is_range_exp = true;
+ }
+ }
+
+ if (is_range_exp == true)
+ {
+ end_elem.opr.name = end_name_buf;
+ end_elem.type = COLL_SYM;
+ ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+ dfa, syntax, true);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ {
+ *err = ret;
+ goto parse_bracket_exp_free_return;
+ }
+
+ token_len = peek_token_bracket (token, regexp, syntax);
+
+#ifdef _LIBC
+ *err = build_range_exp (sbcset, mbcset, &range_alloc,
+ &start_elem, &end_elem);
+#else
+# ifdef RE_ENABLE_I18N
+ *err = build_range_exp (syntax, sbcset,
+ dfa->mb_cur_max > 1 ? mbcset : NULL,
+ &range_alloc, &start_elem, &end_elem);
+# else
+ *err = build_range_exp (syntax, sbcset, &start_elem, &end_elem);
+# endif
+#endif /* RE_ENABLE_I18N */
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ goto parse_bracket_exp_free_return;
+ }
+ else
+ {
+ switch (start_elem.type)
+ {
+ case SB_CHAR:
+ bitset_set (sbcset, start_elem.opr.ch);
+ break;
+#ifdef RE_ENABLE_I18N
+ case MB_CHAR:
+ /* Check whether the array has enough space. */
+ if (__glibc_unlikely (mbchar_alloc == mbcset->nmbchars))
+ {
+ wchar_t *new_mbchars;
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nmbchars is 0. */
+ mbchar_alloc = 2 * mbcset->nmbchars + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
+ mbchar_alloc);
+ if (__glibc_unlikely (new_mbchars == NULL))
+ goto parse_bracket_exp_espace;
+ mbcset->mbchars = new_mbchars;
+ }
+ mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
+ break;
+#endif /* RE_ENABLE_I18N */
+ case EQUIV_CLASS:
+ *err = build_equiv_class (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &equiv_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ goto parse_bracket_exp_free_return;
+ break;
+ case COLL_SYM:
+ *err = build_collating_symbol (sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &coll_sym_alloc,
+#endif /* RE_ENABLE_I18N */
+ start_elem.opr.name);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ goto parse_bracket_exp_free_return;
+ break;
+ case CHAR_CLASS:
+ *err = build_charclass (regexp->trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &char_class_alloc,
+#endif /* RE_ENABLE_I18N */
+ (const char *) start_elem.opr.name,
+ syntax);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ goto parse_bracket_exp_free_return;
+ break;
+ default:
+ DEBUG_ASSERT (false);
+ break;
+ }
+ }
+ if (__glibc_unlikely (token->type == END_OF_RE))
+ {
+ *err = REG_EBRACK;
+ goto parse_bracket_exp_free_return;
+ }
+ if (token->type == OP_CLOSE_BRACKET)
+ break;
+ }
+
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+
+ if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
+ || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
+ || mbcset->non_match)))
+ {
+ bin_tree_t *mbc_tree;
+ int sbc_idx;
+ /* Build a tree for complex bracket. */
+ dfa->has_mb_node = 1;
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (__glibc_unlikely (mbc_tree == NULL))
+ goto parse_bracket_exp_espace;
+ for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
+ if (sbcset[sbc_idx])
+ break;
+ /* If there are no bits set in sbcset, there is no point
+ of having both SIMPLE_BRACKET and COMPLEX_BRACKET. */
+ if (sbc_idx < BITSET_WORDS)
+ {
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (__glibc_unlikely (work_tree == NULL))
+ goto parse_bracket_exp_espace;
+
+ /* Then join them by ALT node. */
+ work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
+ if (__glibc_unlikely (work_tree == NULL))
+ goto parse_bracket_exp_espace;
+ }
+ else
+ {
+ re_free (sbcset);
+ work_tree = mbc_tree;
+ }
+ }
+ else
+#endif /* not RE_ENABLE_I18N */
+ {
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif
+ /* Build a tree for simple bracket. */
+ br_token.type = SIMPLE_BRACKET;
+ br_token.opr.sbcset = sbcset;
+ work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (__glibc_unlikely (work_tree == NULL))
+ goto parse_bracket_exp_espace;
+ }
+ return work_tree;
+
+ parse_bracket_exp_espace:
+ *err = REG_ESPACE;
+ parse_bracket_exp_free_return:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ return NULL;
+}
+
+/* Parse an element in the bracket expression. */
+
+static reg_errcode_t
+parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token, int token_len, re_dfa_t *dfa,
+ reg_syntax_t syntax, bool accept_hyphen)
+{
+#ifdef RE_ENABLE_I18N
+ int cur_char_size;
+ cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
+ if (cur_char_size > 1)
+ {
+ elem->type = MB_CHAR;
+ elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
+ re_string_skip_bytes (regexp, cur_char_size);
+ return REG_NOERROR;
+ }
+#endif /* RE_ENABLE_I18N */
+ re_string_skip_bytes (regexp, token_len); /* Skip a token. */
+ if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
+ || token->type == OP_OPEN_EQUIV_CLASS)
+ return parse_bracket_symbol (elem, regexp, token);
+ if (__glibc_unlikely (token->type == OP_CHARSET_RANGE) && !accept_hyphen)
+ {
+ /* A '-' must only appear as anything but a range indicator before
+ the closing bracket. Everything else is an error. */
+ re_token_t token2;
+ (void) peek_token_bracket (&token2, regexp, syntax);
+ if (token2.type != OP_CLOSE_BRACKET)
+ /* The actual error value is not standardized since this whole
+ case is undefined. But ERANGE makes good sense. */
+ return REG_ERANGE;
+ }
+ elem->type = SB_CHAR;
+ elem->opr.ch = token->opr.c;
+ return REG_NOERROR;
+}
+
+/* Parse a bracket symbol in the bracket expression. Bracket symbols are
+ such as [:<character_class>:], [.<collating_element>.], and
+ [=<equivalent_class>=]. */
+
+static reg_errcode_t
+parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
+ re_token_t *token)
+{
+ unsigned char ch, delim = token->opr.c;
+ int i = 0;
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ for (;; ++i)
+ {
+ if (i >= BRACKET_NAME_BUF_SIZE)
+ return REG_EBRACK;
+ if (token->type == OP_OPEN_CHAR_CLASS)
+ ch = re_string_fetch_byte_case (regexp);
+ else
+ ch = re_string_fetch_byte (regexp);
+ if (re_string_eoi(regexp))
+ return REG_EBRACK;
+ if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
+ break;
+ elem->opr.name[i] = ch;
+ }
+ re_string_skip_bytes (regexp, 1);
+ elem->opr.name[i] = '\0';
+ switch (token->type)
+ {
+ case OP_OPEN_COLL_ELEM:
+ elem->type = COLL_SYM;
+ break;
+ case OP_OPEN_EQUIV_CLASS:
+ elem->type = EQUIV_CLASS;
+ break;
+ case OP_OPEN_CHAR_CLASS:
+ elem->type = CHAR_CLASS;
+ break;
+ default:
+ break;
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the equivalence class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
+ is a pointer argument since we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
+ Idx *equiv_class_alloc, const unsigned char *name)
+#else /* not RE_ENABLE_I18N */
+build_equiv_class (bitset_t sbcset, const unsigned char *name)
+#endif /* not RE_ENABLE_I18N */
+{
+#ifdef _LIBC
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra, *cp;
+ unsigned char char_buf[2];
+ int32_t idx1, idx2;
+ unsigned int ch;
+ size_t len;
+ /* Calculate the index for equivalence class. */
+ cp = name;
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ idx1 = findidx (table, indirect, extra, &cp, -1);
+ if (__glibc_unlikely (idx1 == 0 || *cp != '\0'))
+ /* This isn't a valid character. */
+ return REG_ECOLLATE;
+
+ /* Build single byte matching table for this equivalence class. */
+ len = weights[idx1 & 0xffffff];
+ for (ch = 0; ch < SBC_MAX; ++ch)
+ {
+ char_buf[0] = ch;
+ cp = char_buf;
+ idx2 = findidx (table, indirect, extra, &cp, 1);
+/*
+ idx2 = table[ch];
+*/
+ if (idx2 == 0)
+ /* This isn't a valid character. */
+ continue;
+ /* Compare only if the length matches and the collation rule
+ index is the same. */
+ if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24)
+ && memcmp (weights + (idx1 & 0xffffff) + 1,
+ weights + (idx2 & 0xffffff) + 1, len) == 0)
+ bitset_set (sbcset, ch);
+ }
+ /* Check whether the array has enough space. */
+ if (__glibc_unlikely (*equiv_class_alloc == mbcset->nequiv_classes))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nequiv_classes is 0. */
+ Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
+ /* Use realloc since the array is NULL if *alloc == 0. */
+ int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
+ int32_t,
+ new_equiv_class_alloc);
+ if (__glibc_unlikely (new_equiv_classes == NULL))
+ return REG_ESPACE;
+ mbcset->equiv_classes = new_equiv_classes;
+ *equiv_class_alloc = new_equiv_class_alloc;
+ }
+ mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
+ }
+ else
+#endif /* _LIBC */
+ {
+ if (__glibc_unlikely (strlen ((const char *) name) != 1))
+ return REG_ECOLLATE;
+ bitset_set (sbcset, *name);
+ }
+ return REG_NOERROR;
+}
+
+ /* Helper function for parse_bracket_exp.
+ Build the character class which is represented by NAME.
+ The result are written to MBCSET and SBCSET.
+ CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
+ is a pointer argument since we may update it. */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ re_charset_t *mbcset, Idx *char_class_alloc,
+ const char *class_name, reg_syntax_t syntax)
+#else /* not RE_ENABLE_I18N */
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+ const char *class_name, reg_syntax_t syntax)
+#endif /* not RE_ENABLE_I18N */
+{
+ int i;
+ const char *name = class_name;
+
+ /* In case of REG_ICASE "upper" and "lower" match the both of
+ upper and lower cases. */
+ if ((syntax & RE_ICASE)
+ && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
+ name = "alpha";
+
+#ifdef RE_ENABLE_I18N
+ /* Check the space of the arrays. */
+ if (__glibc_unlikely (*char_class_alloc == mbcset->nchar_classes))
+ {
+ /* Not enough, realloc it. */
+ /* +1 in case of mbcset->nchar_classes is 0. */
+ Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
+ /* Use realloc since array is NULL if *alloc == 0. */
+ wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
+ new_char_class_alloc);
+ if (__glibc_unlikely (new_char_classes == NULL))
+ return REG_ESPACE;
+ mbcset->char_classes = new_char_classes;
+ *char_class_alloc = new_char_class_alloc;
+ }
+ mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
+#endif /* RE_ENABLE_I18N */
+
+#define BUILD_CHARCLASS_LOOP(ctype_func) \
+ do { \
+ if (__glibc_unlikely (trans != NULL)) \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, trans[i]); \
+ } \
+ else \
+ { \
+ for (i = 0; i < SBC_MAX; ++i) \
+ if (ctype_func (i)) \
+ bitset_set (sbcset, i); \
+ } \
+ } while (0)
+
+ if (strcmp (name, "alnum") == 0)
+ BUILD_CHARCLASS_LOOP (isalnum);
+ else if (strcmp (name, "cntrl") == 0)
+ BUILD_CHARCLASS_LOOP (iscntrl);
+ else if (strcmp (name, "lower") == 0)
+ BUILD_CHARCLASS_LOOP (islower);
+ else if (strcmp (name, "space") == 0)
+ BUILD_CHARCLASS_LOOP (isspace);
+ else if (strcmp (name, "alpha") == 0)
+ BUILD_CHARCLASS_LOOP (isalpha);
+ else if (strcmp (name, "digit") == 0)
+ BUILD_CHARCLASS_LOOP (isdigit);
+ else if (strcmp (name, "print") == 0)
+ BUILD_CHARCLASS_LOOP (isprint);
+ else if (strcmp (name, "upper") == 0)
+ BUILD_CHARCLASS_LOOP (isupper);
+ else if (strcmp (name, "blank") == 0)
+ BUILD_CHARCLASS_LOOP (isblank);
+ else if (strcmp (name, "graph") == 0)
+ BUILD_CHARCLASS_LOOP (isgraph);
+ else if (strcmp (name, "punct") == 0)
+ BUILD_CHARCLASS_LOOP (ispunct);
+ else if (strcmp (name, "xdigit") == 0)
+ BUILD_CHARCLASS_LOOP (isxdigit);
+ else
+ return REG_ECTYPE;
+
+ return REG_NOERROR;
+}
+
+static bin_tree_t *
+build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
+ const char *class_name,
+ const char *extra, bool non_match,
+ reg_errcode_t *err)
+{
+ re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset;
+ Idx alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+ reg_errcode_t ret;
+ bin_tree_t *tree;
+
+ sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+ if (__glibc_unlikely (sbcset == NULL))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+#ifdef RE_ENABLE_I18N
+ mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+ if (__glibc_unlikely (mbcset == NULL))
+ {
+ re_free (sbcset);
+ *err = REG_ESPACE;
+ return NULL;
+ }
+ mbcset->non_match = non_match;
+#endif /* RE_ENABLE_I18N */
+
+ /* We don't care the syntax in this case. */
+ ret = build_charclass (trans, sbcset,
+#ifdef RE_ENABLE_I18N
+ mbcset, &alloc,
+#endif /* RE_ENABLE_I18N */
+ class_name, 0);
+
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ {
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = ret;
+ return NULL;
+ }
+ /* \w match '_' also. */
+ for (; *extra; extra++)
+ bitset_set (sbcset, *extra);
+
+ /* If it is non-matching list. */
+ if (non_match)
+ bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure only single byte characters are set. */
+ if (dfa->mb_cur_max > 1)
+ bitset_mask (sbcset, dfa->sb_char);
+#endif
+
+ /* Build a tree for simple bracket. */
+ re_token_t br_token = { .type = SIMPLE_BRACKET, .opr.sbcset = sbcset };
+ tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (__glibc_unlikely (tree == NULL))
+ goto build_word_op_espace;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ bin_tree_t *mbc_tree;
+ /* Build a tree for complex bracket. */
+ br_token.type = COMPLEX_BRACKET;
+ br_token.opr.mbcset = mbcset;
+ dfa->has_mb_node = 1;
+ mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+ if (__glibc_unlikely (mbc_tree == NULL))
+ goto build_word_op_espace;
+ /* Then join them by ALT node. */
+ tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
+ if (__glibc_likely (mbc_tree != NULL))
+ return tree;
+ }
+ else
+ {
+ free_charset (mbcset);
+ return tree;
+ }
+#else /* not RE_ENABLE_I18N */
+ return tree;
+#endif /* not RE_ENABLE_I18N */
+
+ build_word_op_espace:
+ re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+ free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+ *err = REG_ESPACE;
+ return NULL;
+}
+
+/* This is intended for the expressions like "a{1,3}".
+ Fetch a number from 'input', and return the number.
+ Return -1 if the number field is empty like "{,1}".
+ Return RE_DUP_MAX + 1 if the number field is too large.
+ Return -2 if an error occurred. */
+
+static Idx
+fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
+{
+ Idx num = -1;
+ unsigned char c;
+ while (1)
+ {
+ fetch_token (token, input, syntax);
+ c = token->opr.c;
+ if (__glibc_unlikely (token->type == END_OF_RE))
+ return -2;
+ if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+ break;
+ num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2)
+ ? -2
+ : num == -1
+ ? c - '0'
+ : MIN (RE_DUP_MAX + 1, num * 10 + c - '0'));
+ }
+ return num;
+}
+
+#ifdef RE_ENABLE_I18N
+static void
+free_charset (re_charset_t *cset)
+{
+ re_free (cset->mbchars);
+# ifdef _LIBC
+ re_free (cset->coll_syms);
+ re_free (cset->equiv_classes);
+# endif
+ re_free (cset->range_starts);
+ re_free (cset->range_ends);
+ re_free (cset->char_classes);
+ re_free (cset);
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Functions for binary tree operation. */
+
+/* Create a tree node. */
+
+static bin_tree_t *
+create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ re_token_type_t type)
+{
+ re_token_t t = { .type = type };
+ return create_token_tree (dfa, left, right, &t);
+}
+
+static bin_tree_t *
+create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+ const re_token_t *token)
+{
+ bin_tree_t *tree;
+ if (__glibc_unlikely (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE))
+ {
+ bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
+
+ if (storage == NULL)
+ return NULL;
+ storage->next = dfa->str_tree_storage;
+ dfa->str_tree_storage = storage;
+ dfa->str_tree_storage_idx = 0;
+ }
+ tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
+
+ tree->parent = NULL;
+ tree->left = left;
+ tree->right = right;
+ tree->token = *token;
+ tree->token.duplicated = 0;
+ tree->token.opt_subexp = 0;
+ tree->first = NULL;
+ tree->next = NULL;
+ tree->node_idx = -1;
+
+ if (left != NULL)
+ left->parent = tree;
+ if (right != NULL)
+ right->parent = tree;
+ return tree;
+}
+
+/* Mark the tree SRC as an optional subexpression.
+ To be called from preorder or postorder. */
+
+static reg_errcode_t
+mark_opt_subexp (void *extra, bin_tree_t *node)
+{
+ Idx idx = (uintptr_t) extra;
+ if (node->token.type == SUBEXP && node->token.opr.idx == idx)
+ node->token.opt_subexp = 1;
+
+ return REG_NOERROR;
+}
+
+/* Free the allocated memory inside NODE. */
+
+static void
+free_token (re_token_t *node)
+{
+#ifdef RE_ENABLE_I18N
+ if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
+ free_charset (node->opr.mbcset);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
+ re_free (node->opr.sbcset);
+}
+
+/* Worker function for tree walking. Free the allocated memory inside NODE
+ and its children. */
+
+static reg_errcode_t
+free_tree (void *extra, bin_tree_t *node)
+{
+ free_token (&node->token);
+ return REG_NOERROR;
+}
+
+
+/* Duplicate the node SRC, and return new node. This is a preorder
+ visit similar to the one implemented by the generic visitor, but
+ we need more infrastructure to maintain two parallel trees --- so,
+ it's easier to duplicate. */
+
+static bin_tree_t *
+duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
+{
+ const bin_tree_t *node;
+ bin_tree_t *dup_root;
+ bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
+
+ for (node = root; ; )
+ {
+ /* Create a new tree and link it back to the current parent. */
+ *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
+ if (*p_new == NULL)
+ return NULL;
+ (*p_new)->parent = dup_node;
+ (*p_new)->token.duplicated = 1;
+ dup_node = *p_new;
+
+ /* Go to the left node, or up and to the right. */
+ if (node->left)
+ {
+ node = node->left;
+ p_new = &dup_node->left;
+ }
+ else
+ {
+ const bin_tree_t *prev = NULL;
+ while (node->right == prev || node->right == NULL)
+ {
+ prev = node;
+ node = node->parent;
+ dup_node = dup_node->parent;
+ if (!node)
+ return dup_root;
+ }
+ node = node->right;
+ p_new = &dup_node->right;
+ }
+ }
+}
diff --git a/lib/regex.c b/lib/regex.c
new file mode 100644
index 0000000..88173bb
--- /dev/null
+++ b/lib/regex.c
@@ -0,0 +1,83 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#define __STDC_WANT_IEC_60559_BFP_EXT__
+
+#ifndef _LIBC
+# include <libc-config.h>
+
+# if __GNUC_PREREQ (4, 6)
+# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+# endif
+# if __GNUC_PREREQ (4, 3)
+# pragma GCC diagnostic ignored "-Wold-style-definition"
+# pragma GCC diagnostic ignored "-Wtype-limits"
+# endif
+#endif
+
+/* Make sure no one compiles this code with a C++ compiler. */
+#if defined __cplusplus && defined _LIBC
+# error "This is C code, use a C compiler"
+#endif
+
+#ifdef _LIBC
+/* We have to keep the namespace clean. */
+# define regfree(preg) __regfree (preg)
+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+# define regerror(errcode, preg, errbuf, errbuf_size) \
+ __regerror(errcode, preg, errbuf, errbuf_size)
+# define re_set_registers(bu, re, nu, st, en) \
+ __re_set_registers (bu, re, nu, st, en)
+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+ __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+# define re_match(bufp, string, size, pos, regs) \
+ __re_match (bufp, string, size, pos, regs)
+# define re_search(bufp, string, size, startpos, range, regs) \
+ __re_search (bufp, string, size, startpos, range, regs)
+# define re_compile_pattern(pattern, length, bufp) \
+ __re_compile_pattern (pattern, length, bufp)
+# define re_set_syntax(syntax) __re_set_syntax (syntax)
+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+ __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+
+# include "../locale/localeinfo.h"
+#endif
+
+/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
+ GNU regex allows. Include it before <regex.h>, which correctly
+ #undefs RE_DUP_MAX and sets it to the right value. */
+#include <limits.h>
+
+#include <regex.h>
+#include "regex_internal.h"
+
+#include "regex_internal.c"
+#include "regcomp.c"
+#include "regexec.c"
+
+/* Binary backward compatibility. */
+#if _LIBC
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
+int re_max_failures = 2000;
+# endif
+#endif
diff --git a/lib/regex.h b/lib/regex.h
new file mode 100644
index 0000000..306521a
--- /dev/null
+++ b/lib/regex.h
@@ -0,0 +1,663 @@
+/* Definitions for data structures and routines for the regular
+ expression library.
+ Copyright (C) 1985, 1989-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+#include <sys/types.h>
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define __USE_GNU to declare GNU extensions that violate the
+ POSIX name space rules. */
+#ifdef _GNU_SOURCE
+# define __USE_GNU 1
+#endif
+
+#ifdef _REGEX_LARGE_OFFSETS
+
+/* Use types and values that are wide enough to represent signed and
+ unsigned byte offsets in memory. This currently works only when
+ the regex code is used outside of the GNU C library; it is not yet
+ supported within glibc itself, and glibc users should not define
+ _REGEX_LARGE_OFFSETS. */
+
+/* The type of object sizes. */
+typedef size_t __re_size_t;
+
+/* The type of object sizes, in places where the traditional code
+ uses unsigned long int. */
+typedef size_t __re_long_size_t;
+
+#else
+
+/* The traditional GNU regex implementation mishandles strings longer
+ than INT_MAX. */
+typedef unsigned int __re_size_t;
+typedef unsigned long int __re_long_size_t;
+
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+ wide enough to hold a value of a pointer. For most ANSI compilers
+ ptrdiff_t and size_t should be likely OK. Still size of these two
+ types is 2 for Microsoft C. Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+ recognize. The set/not-set meanings are chosen so that Emacs syntax
+ remains the value 0. The bits are given in alphabetical order, and
+ the definitions shifted by one from the previous bit; thus, when we
+ add or remove a bit, only one other definition need change. */
+typedef unsigned long int reg_syntax_t;
+
+#ifdef __USE_GNU
+/* If this bit is not set, then \ inside a bracket expression is literal.
+ If set, then such a \ quotes the following character. */
+# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+ literals.
+ If set, then \+ and \? are operators and + and ? are literals. */
+# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported. They are:
+ [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
+ [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+ If not set, then character classes are not supported. */
+# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+ expressions, of course).
+ If this bit is not set, then it depends:
+ ^ is an anchor if it is at the beginning of a regular
+ expression or after an open-group or an alternation operator;
+ $ is an anchor if it is at the end of a regular expression, or
+ before a close-group or an alternation operator.
+
+ This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+ POSIX draft 11.2 says that * etc. in leading positions is undefined.
+ We already implemented a previous draft which made those constructs
+ invalid, though, so we haven't changed the code back. */
+# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+ regardless of where they are in the pattern.
+ If this bit is not set, then special characters are special only in
+ some contexts; otherwise they are ordinary. Specifically,
+ * + ? and intervals are only special when not after the beginning,
+ open-group, or alternation operator. */
+# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+ immediately after an alternation or begin-group operator. */
+# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+ If not set, then it doesn't. */
+# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+ If not set, then it does. */
+# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+ If not set, they do. */
+# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+ interval, depending on RE_NO_BK_BRACES.
+ If not set, \{, \}, {, and } are literals. */
+# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+ If not set, they are. */
+# define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+ If not set, newline is literal. */
+# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then '{...}' defines an interval, and \{ and \}
+ are literals.
+ If not set, then '\{...\}' defines an interval. */
+# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+ If not set, \(...\) defines a group, and ( and ) are literals. */
+# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+ If not set, then \<digit> is a back-reference. */
+# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+ If not set, then \| is an alternation operator, and | is literal. */
+# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+ than the starting range point, as in [z-a], is invalid.
+ If not set, then when ending range point collates higher than the
+ starting range point, the range is ignored. */
+# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+ If not set, then an unmatched ) is invalid. */
+# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+ without further backtracking. */
+# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+ If not set, then the GNU regex operators are recognized. */
+# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+ If not set, and debugging was on, turn it off.
+ This only works if regex.c is compiled -DDEBUG.
+ We define this bit always, so that all that's needed to turn on
+ debugging is to recompile regex.c; the calling code can always have
+ this bit set, and it won't affect anything in the normal case. */
+# define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, a syntactically invalid interval is treated as
+ a string of ordinary characters. For example, the ERE 'a{1' is
+ treated as 'a\{1'. */
+# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
+
+/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
+ for ^, because it is difficult to scan the regex backwards to find
+ whether ^ should be special. */
+# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
+
+/* If this bit is set, then \{ cannot be first in a regex or
+ immediately after an alternation, open-group or \} operator. */
+# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
+
+/* If this bit is set, then no_sub will be set to 1 during
+ re_compile_pattern. */
+# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
+#endif
+
+/* This global variable defines the particular regexp syntax to use (for
+ some interfaces). When a regexp is compiled, the syntax used is
+ stored in the pattern buffer, so changing this does not affect
+ already-compiled regexps. */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef __USE_GNU
+/* Define combinations of the above bits for the standard possibilities.
+ (The [[[ comments delimit what gets put into the Texinfo file, so
+ don't delete them!) */
+/* [[[begin syntaxes]]] */
+# define RE_SYNTAX_EMACS 0
+
+# define RE_SYNTAX_AWK \
+ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
+ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CHAR_CLASSES \
+ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GNU_AWK \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
+ | RE_INVALID_INTERVAL_ORD) \
+ & ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS \
+ | RE_CONTEXT_INVALID_OPS ))
+
+# define RE_SYNTAX_POSIX_AWK \
+ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
+ | RE_INTERVALS | RE_NO_GNU_OPS \
+ | RE_INVALID_INTERVAL_ORD)
+
+# define RE_SYNTAX_GREP \
+ ((RE_SYNTAX_POSIX_BASIC | RE_NEWLINE_ALT) \
+ & ~(RE_CONTEXT_INVALID_DUP | RE_DOT_NOT_NULL))
+
+# define RE_SYNTAX_EGREP \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_INVALID_INTERVAL_ORD | RE_NEWLINE_ALT) \
+ & ~(RE_CONTEXT_INVALID_OPS | RE_DOT_NOT_NULL))
+
+/* POSIX grep -E behavior is no longer incompatible with GNU. */
+# define RE_SYNTAX_POSIX_EGREP \
+ RE_SYNTAX_EGREP
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax. */
+# define _RE_SYNTAX_POSIX_COMMON \
+ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
+ | RE_INTERVALS | RE_NO_EMPTY_RANGES)
+
+# define RE_SYNTAX_POSIX_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+ RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
+ isn't minimal, since other operators, such as \`, aren't disabled. */
+# define RE_SYNTAX_POSIX_MINIMAL_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+# define RE_SYNTAX_POSIX_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \
+ | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+ removed and RE_NO_BK_REFS is added. */
+# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow. POSIX-conforming
+ systems might define this in <limits.h>, but we want our
+ value, so remove any previous define. */
+# ifdef _REGEX_INCLUDE_LIMITS_H
+# include <limits.h>
+# endif
+# ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+# endif
+
+/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
+ the counter as a 2-byte signed integer. This is no longer true, so
+ RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
+ ((SIZE_MAX - 9) / 10) if _REGEX_LARGE_OFFSETS is defined.
+ However, there would be a huge performance problem if someone
+ actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
+ its historical value. */
+# define RE_DUP_MAX (0x7fff)
+#endif
+
+
+/* POSIX 'cflags' bits (i.e., information for 'regcomp'). */
+
+/* If this bit is set, then use extended regular expression syntax.
+ If not set, then use basic regular expression syntax. */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+#define REG_ICASE (1 << 1)
+
+/* If this bit is set, then anchors do not match at newline
+ characters in the string.
+ If not set, then anchors do match at newlines. */
+#define REG_NEWLINE (1 << 2)
+
+/* If this bit is set, then report only success or fail in regexec.
+ If not set, then returns differ between not matching and errors. */
+#define REG_NOSUB (1 << 3)
+
+
+/* POSIX 'eflags' bits (i.e., information for regexec). */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+ the beginning of the string (presumably because it's not the
+ beginning of a line).
+ If not set, then the beginning-of-line operator does match the
+ beginning of the string. */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line. */
+#define REG_NOTEOL (1 << 1)
+
+/* Use PMATCH[0] to delimit the start and end of the search in the
+ buffer. */
+#define REG_STARTEND (1 << 2)
+
+
+/* If any error codes are removed, changed, or added, update the
+ '__re_error_msgid' table in regcomp.c. */
+
+typedef enum
+{
+ _REG_ENOSYS = -1, /* This will never happen for this implementation. */
+ _REG_NOERROR = 0, /* Success. */
+ _REG_NOMATCH, /* Didn't find a match (for regexec). */
+
+ /* POSIX regcomp return error codes. (In the order listed in the
+ standard.) */
+ _REG_BADPAT, /* Invalid pattern. */
+ _REG_ECOLLATE, /* Invalid collating element. */
+ _REG_ECTYPE, /* Invalid character class name. */
+ _REG_EESCAPE, /* Trailing backslash. */
+ _REG_ESUBREG, /* Invalid back reference. */
+ _REG_EBRACK, /* Unmatched left bracket. */
+ _REG_EPAREN, /* Parenthesis imbalance. */
+ _REG_EBRACE, /* Unmatched \{. */
+ _REG_BADBR, /* Invalid contents of \{\}. */
+ _REG_ERANGE, /* Invalid range end. */
+ _REG_ESPACE, /* Ran out of memory. */
+ _REG_BADRPT, /* No preceding re for repetition op. */
+
+ /* Error codes we've added. */
+ _REG_EEND, /* Premature end. */
+ _REG_ESIZE, /* Too large (e.g., repeat count too large). */
+ _REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
+} reg_errcode_t;
+
+#if defined _XOPEN_SOURCE || defined __USE_XOPEN2K
+# define REG_ENOSYS _REG_ENOSYS
+#endif
+#define REG_NOERROR _REG_NOERROR
+#define REG_NOMATCH _REG_NOMATCH
+#define REG_BADPAT _REG_BADPAT
+#define REG_ECOLLATE _REG_ECOLLATE
+#define REG_ECTYPE _REG_ECTYPE
+#define REG_EESCAPE _REG_EESCAPE
+#define REG_ESUBREG _REG_ESUBREG
+#define REG_EBRACK _REG_EBRACK
+#define REG_EPAREN _REG_EPAREN
+#define REG_EBRACE _REG_EBRACE
+#define REG_BADBR _REG_BADBR
+#define REG_ERANGE _REG_ERANGE
+#define REG_ESPACE _REG_ESPACE
+#define REG_BADRPT _REG_BADRPT
+#define REG_EEND _REG_EEND
+#define REG_ESIZE _REG_ESIZE
+#define REG_ERPAREN _REG_ERPAREN
+
+/* This data structure represents a compiled pattern. Before calling
+ the pattern compiler, the fields 'buffer', 'allocated', 'fastmap',
+ and 'translate' can be set. After the pattern has been compiled,
+ the fields 're_nsub', 'not_bol' and 'not_eol' are available. All
+ other fields are private to the regex routines. */
+
+#ifndef RE_TRANSLATE_TYPE
+# define __RE_TRANSLATE_TYPE unsigned char *
+# ifdef __USE_GNU
+# define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE
+# endif
+#endif
+
+#ifdef __USE_GNU
+# define __REPB_PREFIX(name) name
+#else
+# define __REPB_PREFIX(name) __##name
+#endif
+
+struct re_pattern_buffer
+{
+ /* Space that holds the compiled pattern. The type
+ 'struct re_dfa_t' is private and is not declared here. */
+ struct re_dfa_t *__REPB_PREFIX(buffer);
+
+ /* Number of bytes to which 'buffer' points. */
+ __re_long_size_t __REPB_PREFIX(allocated);
+
+ /* Number of bytes actually used in 'buffer'. */
+ __re_long_size_t __REPB_PREFIX(used);
+
+ /* Syntax setting with which the pattern was compiled. */
+ reg_syntax_t __REPB_PREFIX(syntax);
+
+ /* Pointer to a fastmap, if any, otherwise zero. re_search uses the
+ fastmap, if there is one, to skip over impossible starting points
+ for matches. */
+ char *__REPB_PREFIX(fastmap);
+
+ /* Either a translate table to apply to all characters before
+ comparing them, or zero for no translation. The translation is
+ applied to a pattern when it is compiled and to a string when it
+ is matched. */
+ __RE_TRANSLATE_TYPE __REPB_PREFIX(translate);
+
+ /* Number of subexpressions found by the compiler. */
+ size_t re_nsub;
+
+ /* Zero if this pattern cannot match the empty string, one else.
+ Well, in truth it's used only in 're_search_2', to see whether or
+ not we should use the fastmap, so we don't set this absolutely
+ perfectly; see 're_compile_fastmap' (the "duplicate" case). */
+ unsigned __REPB_PREFIX(can_be_null) : 1;
+
+ /* If REGS_UNALLOCATED, allocate space in the 'regs' structure
+ for 'max (RE_NREGS, re_nsub + 1)' groups.
+ If REGS_REALLOCATE, reallocate space if necessary.
+ If REGS_FIXED, use what's there. */
+#ifdef __USE_GNU
+# define REGS_UNALLOCATED 0
+# define REGS_REALLOCATE 1
+# define REGS_FIXED 2
+#endif
+ unsigned __REPB_PREFIX(regs_allocated) : 2;
+
+ /* Set to zero when 're_compile_pattern' compiles a pattern; set to
+ one by 're_compile_fastmap' if it updates the fastmap. */
+ unsigned __REPB_PREFIX(fastmap_accurate) : 1;
+
+ /* If set, 're_match_2' does not return information about
+ subexpressions. */
+ unsigned __REPB_PREFIX(no_sub) : 1;
+
+ /* If set, a beginning-of-line anchor doesn't match at the beginning
+ of the string. */
+ unsigned __REPB_PREFIX(not_bol) : 1;
+
+ /* Similarly for an end-of-line anchor. */
+ unsigned __REPB_PREFIX(not_eol) : 1;
+
+ /* If true, an anchor at a newline matches. */
+ unsigned __REPB_PREFIX(newline_anchor) : 1;
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* Type for byte offsets within the string. POSIX mandates this. */
+#ifdef _REGEX_LARGE_OFFSETS
+/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as
+ ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t
+ is wider than ssize_t, so ssize_t is safe. ptrdiff_t is not
+ visible here, so use ssize_t. */
+typedef ssize_t regoff_t;
+#else
+/* The traditional GNU regex implementation mishandles strings longer
+ than INT_MAX. */
+typedef int regoff_t;
+#endif
+
+
+#ifdef __USE_GNU
+/* This is the structure we store register match data in. See
+ regex.texinfo for a full description of what registers match. */
+struct re_registers
+{
+ __re_size_t num_regs;
+ regoff_t *start;
+ regoff_t *end;
+};
+
+
+/* If 'regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+ 're_match_2' returns information about at least this many registers
+ the first time a 'regs' structure is passed. */
+# ifndef RE_NREGS
+# define RE_NREGS 30
+# endif
+#endif
+
+
+/* POSIX specification for registers. Aside from the different names than
+ 're_registers', POSIX uses an array of structures, instead of a
+ structure of arrays. */
+typedef struct
+{
+ regoff_t rm_so; /* Byte offset from string's start to substring's start. */
+ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
+} regmatch_t;
+
+/* Declarations for routines. */
+
+#ifdef __USE_GNU
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+ You can also simply assign to the 're_syntax_options' variable. */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+ and syntax given by the global 're_syntax_options', into the buffer
+ BUFFER. Return NULL if successful, and an error string if not.
+
+ To free the allocated storage, you must call 'regfree' on BUFFER.
+ Note that the translate table must either have been initialized by
+ 'regcomp', with a malloc'ed value, or set to NULL before calling
+ 'regfree'. */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+ struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+ accelerate searches. Return 0 if successful and -2 if was an
+ internal error. */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+ compiled into BUFFER. Start searching at position START, for RANGE
+ characters. Return the starting position of the match, -1 for no
+ match, or -2 for an internal error. Also return register
+ information in REGS (if REGS and BUFFER->no_sub are nonzero). */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+ const char *__String, regoff_t __length,
+ regoff_t __start, regoff_t __range,
+ struct re_registers *__regs);
+
+
+/* Like 're_search', but search in the concatenation of STRING1 and
+ STRING2. Also, stop searching at index START + STOP. */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, regoff_t __length1,
+ const char *__string2, regoff_t __length2,
+ regoff_t __start, regoff_t __range,
+ struct re_registers *__regs,
+ regoff_t __stop);
+
+
+/* Like 're_search', but return how many characters in STRING the regexp
+ in BUFFER matched, starting at position START. */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+ const char *__String, regoff_t __length,
+ regoff_t __start, struct re_registers *__regs);
+
+
+/* Relates to 're_match' as 're_search_2' relates to 're_search'. */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, regoff_t __length1,
+ const char *__string2, regoff_t __length2,
+ regoff_t __start, struct re_registers *__regs,
+ regoff_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using BUFFER and REGS will use this memory
+ for recording register information. STARTS and ENDS must be
+ allocated with malloc, and must each be at least 'NUM_REGS * sizeof
+ (regoff_t)' bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ BUFFER will allocate its own register data, without
+ freeing the old data. */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+ struct re_registers *__regs,
+ __re_size_t __num_regs,
+ regoff_t *__starts, regoff_t *__ends);
+#endif /* Use GNU */
+
+#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC)
+/* 4.2 bsd compatibility. */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+#endif
+
+/* For plain 'restrict', use glibc's __restrict if defined.
+ Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+# define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+# define _Restrict_ restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* For the ISO C99 syntax
+ array_name[restrict]
+ use glibc's __restrict_arr if available.
+ Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+ Other ISO C99 compilers support it as well. */
+#ifndef _Restrict_arr_
+# ifdef __restrict_arr
+# define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3) \
+ && !defined __cplusplus)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility. */
+extern int regcomp (regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __pattern,
+ int __cflags);
+
+extern int regexec (const regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __String, size_t __nmatch,
+ regmatch_t __pmatch[_Restrict_arr_],
+ int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
+ char *_Restrict_ __errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+#endif /* regex.h */
diff --git a/lib/regex_internal.c b/lib/regex_internal.c
new file mode 100644
index 0000000..bf9439e
--- /dev/null
+++ b/lib/regex_internal.c
@@ -0,0 +1,1745 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+static void re_string_construct_common (const char *str, Idx len,
+ re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa);
+static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ re_hashval_t hash);
+static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
+ const re_node_set *nodes,
+ unsigned int context,
+ re_hashval_t hash);
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+ Idx new_buf_len);
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr);
+static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr);
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr);
+static void re_string_translate_buffer (re_string_t *pstr);
+static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
+ int eflags) __attribute__ ((pure));
+
+/* Functions for string operation. */
+
+/* This function allocate the buffers. It is necessary to call
+ re_string_reconstruct before using the object. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ Idx init_buf_len;
+
+ /* Ensure at least one character fits into the buffers. */
+ if (init_len < dfa->mb_cur_max)
+ init_len = dfa->mb_cur_max;
+ init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ ret = re_string_realloc_buffers (pstr, init_buf_len);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+
+ pstr->word_char = dfa->word_char;
+ pstr->word_ops_used = dfa->word_ops_used;
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+ pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len;
+ pstr->valid_raw_len = pstr->valid_len;
+ return REG_NOERROR;
+}
+
+/* This function allocate the buffers, and initialize them. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_construct (re_string_t *pstr, const char *str, Idx len,
+ RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+ reg_errcode_t ret;
+ memset (pstr, '\0', sizeof (re_string_t));
+ re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+ if (len > 0)
+ {
+ ret = re_string_realloc_buffers (pstr, len + 1);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ }
+ pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+
+ if (icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ {
+ while (1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ if (pstr->valid_raw_len >= len)
+ break;
+ if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max)
+ break;
+ ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ }
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (trans != NULL)
+ re_string_translate_buffer (pstr);
+ else
+ {
+ pstr->valid_len = pstr->bufs_len;
+ pstr->valid_raw_len = pstr->bufs_len;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions for re_string_allocate, and re_string_construct. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
+{
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ wint_t *new_wcs;
+
+ /* Avoid overflow in realloc. */
+ const size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
+ < new_buf_len))
+ return REG_ESPACE;
+
+ new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+ if (__glibc_unlikely (new_wcs == NULL))
+ return REG_ESPACE;
+ pstr->wcs = new_wcs;
+ if (pstr->offsets != NULL)
+ {
+ Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
+ if (__glibc_unlikely (new_offsets == NULL))
+ return REG_ESPACE;
+ pstr->offsets = new_offsets;
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ {
+ unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char,
+ new_buf_len);
+ if (__glibc_unlikely (new_mbs == NULL))
+ return REG_ESPACE;
+ pstr->mbs = new_mbs;
+ }
+ pstr->bufs_len = new_buf_len;
+ return REG_NOERROR;
+}
+
+
+static void
+re_string_construct_common (const char *str, Idx len, re_string_t *pstr,
+ RE_TRANSLATE_TYPE trans, bool icase,
+ const re_dfa_t *dfa)
+{
+ pstr->raw_mbs = (const unsigned char *) str;
+ pstr->len = len;
+ pstr->raw_len = len;
+ pstr->trans = trans;
+ pstr->icase = icase;
+ pstr->mbs_allocated = (trans != NULL || icase);
+ pstr->mb_cur_max = dfa->mb_cur_max;
+ pstr->is_utf8 = dfa->is_utf8;
+ pstr->map_notascii = dfa->map_notascii;
+ pstr->stop = pstr->len;
+ pstr->raw_stop = pstr->stop;
+}
+
+#ifdef RE_ENABLE_I18N
+
+/* Build wide character buffer PSTR->WCS.
+ If the byte sequence of the string are:
+ <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
+ Then wide character buffer will be:
+ <wc1> , WEOF , <wc2> , WEOF , <wc3>
+ We use WEOF for padding, they indicate that the position isn't
+ a first byte of a multibyte character.
+
+ Note that this function assumes PSTR->VALID_LEN elements are already
+ built and starts from PSTR->VALID_LEN. */
+
+static void
+build_wcs_buffer (re_string_t *pstr)
+{
+#ifdef _LIBC
+ unsigned char buf[MB_LEN_MAX];
+ DEBUG_ASSERT (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+ unsigned char buf[64];
+#endif
+ mbstate_t prev_st;
+ Idx byte_idx, end_idx, remain_len;
+ size_t mbclen;
+
+ /* Build the buffers from pstr->valid_len to either pstr->len or
+ pstr->bufs_len. */
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+ for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ /* Apply the translation if we need. */
+ if (__glibc_unlikely (pstr->trans != NULL))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i];
+ buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (__glibc_unlikely (mbclen == (size_t) -1 || mbclen == 0
+ || (mbclen == (size_t) -2
+ && pstr->bufs_len >= pstr->len)))
+ {
+ /* We treat these cases as a singlebyte character. */
+ mbclen = 1;
+ wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+ if (__glibc_unlikely (pstr->trans != NULL))
+ wc = pstr->trans[wc];
+ pstr->cur_state = prev_st;
+ }
+ else if (__glibc_unlikely (mbclen == (size_t) -2))
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+
+ /* Write wide character and padding. */
+ pstr->wcs[byte_idx++] = wc;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+}
+
+/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
+ but for REG_ICASE. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+build_wcs_upper_buffer (re_string_t *pstr)
+{
+ mbstate_t prev_st;
+ Idx src_idx, byte_idx, end_idx, remain_len;
+ size_t mbclen;
+#ifdef _LIBC
+ char buf[MB_LEN_MAX];
+ DEBUG_ASSERT (pstr->mb_cur_max <= MB_LEN_MAX);
+#else
+ char buf[64];
+#endif
+
+ byte_idx = pstr->valid_len;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ /* The following optimization assumes that ASCII characters can be
+ mapped to wide characters with a simple cast. */
+ if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed)
+ {
+ while (byte_idx < end_idx)
+ {
+ wchar_t wc;
+ unsigned char ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+
+ if (isascii (ch) && mbsinit (&pstr->cur_state))
+ {
+ /* The next step uses the assumption that wchar_t is encoded
+ ASCII-safe: all ASCII values can be converted like this. */
+ wchar_t wcu = __towupper (ch);
+ if (isascii (wcu))
+ {
+ pstr->mbs[byte_idx] = wcu;
+ pstr->wcs[byte_idx] = wcu;
+ byte_idx++;
+ continue;
+ }
+ }
+
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc,
+ ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+ + byte_idx), remain_len, &pstr->cur_state);
+ if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
+ {
+ wchar_t wcu = __towupper (wc);
+ if (wcu != wc)
+ {
+ size_t mbcdlen;
+
+ mbcdlen = __wcrtomb (buf, wcu, &prev_st);
+ if (__glibc_likely (mbclen == mbcdlen))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else
+ {
+ src_idx = byte_idx;
+ goto offsets_needed;
+ }
+ }
+ else
+ memcpy (pstr->mbs + byte_idx,
+ pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0
+ || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+ {
+ /* It is an invalid character, an incomplete character
+ at the end of the string, or '\0'. Just use the byte. */
+ pstr->mbs[byte_idx] = ch;
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (__glibc_unlikely (mbclen == (size_t) -1))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = byte_idx;
+ return REG_NOERROR;
+ }
+ else
+ for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;)
+ {
+ wchar_t wc;
+ const char *p;
+ offsets_needed:
+ remain_len = end_idx - byte_idx;
+ prev_st = pstr->cur_state;
+ if (__glibc_unlikely (pstr->trans != NULL))
+ {
+ int i, ch;
+
+ for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+ {
+ ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i];
+ buf[i] = pstr->trans[ch];
+ }
+ p = (const char *) buf;
+ }
+ else
+ p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
+ mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+ if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
+ {
+ wchar_t wcu = __towupper (wc);
+ if (wcu != wc)
+ {
+ size_t mbcdlen;
+
+ mbcdlen = __wcrtomb ((char *) buf, wcu, &prev_st);
+ if (__glibc_likely (mbclen == mbcdlen))
+ memcpy (pstr->mbs + byte_idx, buf, mbclen);
+ else if (mbcdlen != (size_t) -1)
+ {
+ size_t i;
+
+ if (byte_idx + mbcdlen > pstr->bufs_len)
+ {
+ pstr->cur_state = prev_st;
+ break;
+ }
+
+ if (pstr->offsets == NULL)
+ {
+ pstr->offsets = re_malloc (Idx, pstr->bufs_len);
+
+ if (pstr->offsets == NULL)
+ return REG_ESPACE;
+ }
+ if (!pstr->offsets_needed)
+ {
+ for (i = 0; i < (size_t) byte_idx; ++i)
+ pstr->offsets[i] = i;
+ pstr->offsets_needed = 1;
+ }
+
+ memcpy (pstr->mbs + byte_idx, buf, mbcdlen);
+ pstr->wcs[byte_idx] = wcu;
+ pstr->offsets[byte_idx] = src_idx;
+ for (i = 1; i < mbcdlen; ++i)
+ {
+ pstr->offsets[byte_idx + i]
+ = src_idx + (i < mbclen ? i : mbclen - 1);
+ pstr->wcs[byte_idx + i] = WEOF;
+ }
+ pstr->len += mbcdlen - mbclen;
+ if (pstr->raw_stop > src_idx)
+ pstr->stop += mbcdlen - mbclen;
+ end_idx = (pstr->bufs_len > pstr->len)
+ ? pstr->len : pstr->bufs_len;
+ byte_idx += mbcdlen;
+ src_idx += mbclen;
+ continue;
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+ }
+ else
+ memcpy (pstr->mbs + byte_idx, p, mbclen);
+
+ if (__glibc_unlikely (pstr->offsets_needed != 0))
+ {
+ size_t i;
+ for (i = 0; i < mbclen; ++i)
+ pstr->offsets[byte_idx + i] = src_idx + i;
+ }
+ src_idx += mbclen;
+
+ pstr->wcs[byte_idx++] = wcu;
+ /* Write paddings. */
+ for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+ pstr->wcs[byte_idx++] = WEOF;
+ }
+ else if (mbclen == (size_t) -1 || mbclen == 0
+ || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+ {
+ /* It is an invalid character or '\0'. Just use the byte. */
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+
+ if (__glibc_unlikely (pstr->trans != NULL))
+ ch = pstr->trans [ch];
+ pstr->mbs[byte_idx] = ch;
+
+ if (__glibc_unlikely (pstr->offsets_needed != 0))
+ pstr->offsets[byte_idx] = src_idx;
+ ++src_idx;
+
+ /* And also cast it to wide char. */
+ pstr->wcs[byte_idx++] = (wchar_t) ch;
+ if (__glibc_unlikely (mbclen == (size_t) -1))
+ pstr->cur_state = prev_st;
+ }
+ else
+ {
+ /* The buffer doesn't have enough space, finish to build. */
+ pstr->cur_state = prev_st;
+ break;
+ }
+ }
+ pstr->valid_len = byte_idx;
+ pstr->valid_raw_len = src_idx;
+ return REG_NOERROR;
+}
+
+/* Skip characters until the index becomes greater than NEW_RAW_IDX.
+ Return the index. */
+
+static Idx
+re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
+{
+ mbstate_t prev_st;
+ Idx rawbuf_idx;
+ size_t mbclen;
+ wint_t wc = WEOF;
+
+ /* Skip the characters which are not necessary to check. */
+ for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len;
+ rawbuf_idx < new_raw_idx;)
+ {
+ wchar_t wc2;
+ Idx remain_len = pstr->raw_len - rawbuf_idx;
+ prev_st = pstr->cur_state;
+ mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
+ remain_len, &pstr->cur_state);
+ if (__glibc_unlikely (mbclen == (size_t) -2 || mbclen == (size_t) -1
+ || mbclen == 0))
+ {
+ /* We treat these cases as a single byte character. */
+ if (mbclen == 0 || remain_len == 0)
+ wc = L'\0';
+ else
+ wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx);
+ mbclen = 1;
+ pstr->cur_state = prev_st;
+ }
+ else
+ wc = wc2;
+ /* Then proceed the next character. */
+ rawbuf_idx += mbclen;
+ }
+ *last_wc = wc;
+ return rawbuf_idx;
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Build the buffer PSTR->MBS, and apply the translation if we need.
+ This function is used in case of REG_ICASE. */
+
+static void
+build_upper_buffer (re_string_t *pstr)
+{
+ Idx char_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
+ if (__glibc_unlikely (pstr->trans != NULL))
+ ch = pstr->trans[ch];
+ pstr->mbs[char_idx] = toupper (ch);
+ }
+ pstr->valid_len = char_idx;
+ pstr->valid_raw_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR. */
+
+static void
+re_string_translate_buffer (re_string_t *pstr)
+{
+ Idx buf_idx, end_idx;
+ end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+ for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
+ {
+ int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
+ pstr->mbs[buf_idx] = pstr->trans[ch];
+ }
+
+ pstr->valid_len = buf_idx;
+ pstr->valid_raw_len = buf_idx;
+}
+
+/* This function re-construct the buffers.
+ Concretely, convert to wide character in case of pstr->mb_cur_max > 1,
+ convert to upper case in case of REG_ICASE, apply translation. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
+{
+ Idx offset;
+
+ if (__glibc_unlikely (pstr->raw_mbs_idx <= idx))
+ offset = idx - pstr->raw_mbs_idx;
+ else
+ {
+ /* Reset buffer. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+#endif /* RE_ENABLE_I18N */
+ pstr->len = pstr->raw_len;
+ pstr->stop = pstr->raw_stop;
+ pstr->valid_len = 0;
+ pstr->raw_mbs_idx = 0;
+ pstr->valid_raw_len = 0;
+ pstr->offsets_needed = 0;
+ pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+ if (!pstr->mbs_allocated)
+ pstr->mbs = (unsigned char *) pstr->raw_mbs;
+ offset = idx;
+ }
+
+ if (__glibc_likely (offset != 0))
+ {
+ /* Should the already checked characters be kept? */
+ if (__glibc_likely (offset < pstr->valid_raw_len))
+ {
+ /* Yes, move them to the front of the buffer. */
+#ifdef RE_ENABLE_I18N
+ if (__glibc_unlikely (pstr->offsets_needed))
+ {
+ Idx low = 0, high = pstr->valid_len, mid;
+ do
+ {
+ mid = (high + low) / 2;
+ if (pstr->offsets[mid] > offset)
+ high = mid;
+ else if (pstr->offsets[mid] < offset)
+ low = mid + 1;
+ else
+ break;
+ }
+ while (low < high);
+ if (pstr->offsets[mid] < offset)
+ ++mid;
+ pstr->tip_context = re_string_context_at (pstr, mid - 1,
+ eflags);
+ /* This can be quite complicated, so handle specially
+ only the common and easy case where the character with
+ different length representation of lower and upper
+ case is present at or after offset. */
+ if (pstr->valid_len > offset
+ && mid == offset && pstr->offsets[mid] == offset)
+ {
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+ memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+ for (low = 0; low < pstr->valid_len; low++)
+ pstr->offsets[low] = pstr->offsets[low + offset] - offset;
+ }
+ else
+ {
+ /* Otherwise, just find out how long the partial multibyte
+ character at offset is and fill it with WEOF/255. */
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ while (mid > 0 && pstr->offsets[mid - 1] == offset)
+ --mid;
+ while (mid < pstr->valid_len)
+ if (pstr->wcs[mid] != WEOF)
+ break;
+ else
+ ++mid;
+ if (mid == pstr->valid_len)
+ pstr->valid_len = 0;
+ else
+ {
+ pstr->valid_len = pstr->offsets[mid] - offset;
+ if (pstr->valid_len)
+ {
+ for (low = 0; low < pstr->valid_len; ++low)
+ pstr->wcs[low] = WEOF;
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ }
+ else
+#endif
+ {
+ pstr->tip_context = re_string_context_at (pstr, offset - 1,
+ eflags);
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ memmove (pstr->wcs, pstr->wcs + offset,
+ (pstr->valid_len - offset) * sizeof (wint_t));
+#endif /* RE_ENABLE_I18N */
+ if (__glibc_unlikely (pstr->mbs_allocated))
+ memmove (pstr->mbs, pstr->mbs + offset,
+ pstr->valid_len - offset);
+ pstr->valid_len -= offset;
+ pstr->valid_raw_len -= offset;
+ DEBUG_ASSERT (pstr->valid_len > 0);
+ }
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ /* No, skip all characters until IDX. */
+ Idx prev_valid_len = pstr->valid_len;
+
+ if (__glibc_unlikely (pstr->offsets_needed))
+ {
+ pstr->len = pstr->raw_len - idx + offset;
+ pstr->stop = pstr->raw_stop - idx + offset;
+ pstr->offsets_needed = 0;
+ }
+#endif
+ pstr->valid_len = 0;
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ Idx wcs_idx;
+ wint_t wc = WEOF;
+
+ if (pstr->is_utf8)
+ {
+ const unsigned char *raw, *p, *end;
+
+ /* Special case UTF-8. Multi-byte chars start with any
+ byte other than 0x80 - 0xbf. */
+ raw = pstr->raw_mbs + pstr->raw_mbs_idx;
+ end = raw + (offset - pstr->mb_cur_max);
+ if (end < pstr->raw_mbs)
+ end = pstr->raw_mbs;
+ p = raw + offset - 1;
+#ifdef _LIBC
+ /* We know the wchar_t encoding is UCS4, so for the simple
+ case, ASCII characters, skip the conversion step. */
+ if (isascii (*p) && __glibc_likely (pstr->trans == NULL))
+ {
+ memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+ /* pstr->valid_len = 0; */
+ wc = (wchar_t) *p;
+ }
+ else
+#endif
+ for (; p >= end; --p)
+ if ((*p & 0xc0) != 0x80)
+ {
+ mbstate_t cur_state;
+ wchar_t wc2;
+ Idx mlen = raw + pstr->len - p;
+ unsigned char buf[6];
+ size_t mbclen;
+
+ const unsigned char *pp = p;
+ if (__glibc_unlikely (pstr->trans != NULL))
+ {
+ int i = mlen < 6 ? mlen : 6;
+ while (--i >= 0)
+ buf[i] = pstr->trans[p[i]];
+ pp = buf;
+ }
+ /* XXX Don't use mbrtowc, we know which conversion
+ to use (UTF-8 -> UCS4). */
+ memset (&cur_state, 0, sizeof (cur_state));
+ mbclen = __mbrtowc (&wc2, (const char *) pp, mlen,
+ &cur_state);
+ if (raw + offset - p <= mbclen
+ && mbclen < (size_t) -2)
+ {
+ memset (&pstr->cur_state, '\0',
+ sizeof (mbstate_t));
+ pstr->valid_len = mbclen - (raw + offset - p);
+ wc = wc2;
+ }
+ break;
+ }
+ }
+
+ if (wc == WEOF)
+ pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx;
+ if (wc == WEOF)
+ pstr->tip_context
+ = re_string_context_at (pstr, prev_valid_len - 1, eflags);
+ else
+ pstr->tip_context = ((__glibc_unlikely (pstr->word_ops_used != 0)
+ && IS_WIDE_WORD_CHAR (wc))
+ ? CONTEXT_WORD
+ : ((IS_WIDE_NEWLINE (wc)
+ && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ if (__glibc_unlikely (pstr->valid_len))
+ {
+ for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
+ pstr->wcs[wcs_idx] = WEOF;
+ if (pstr->mbs_allocated)
+ memset (pstr->mbs, 255, pstr->valid_len);
+ }
+ pstr->valid_raw_len = pstr->valid_len;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1];
+ pstr->valid_raw_len = 0;
+ if (pstr->trans)
+ c = pstr->trans[c];
+ pstr->tip_context = (bitset_contain (pstr->word_char, c)
+ ? CONTEXT_WORD
+ : ((IS_NEWLINE (c) && pstr->newline_anchor)
+ ? CONTEXT_NEWLINE : 0));
+ }
+ }
+ if (!__glibc_unlikely (pstr->mbs_allocated))
+ pstr->mbs += offset;
+ }
+ pstr->raw_mbs_idx = idx;
+ pstr->len -= offset;
+ pstr->stop -= offset;
+
+ /* Then build the buffers. */
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ if (pstr->icase)
+ {
+ reg_errcode_t ret = build_wcs_upper_buffer (pstr);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ }
+ else
+ build_wcs_buffer (pstr);
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ if (__glibc_unlikely (pstr->mbs_allocated))
+ {
+ if (pstr->icase)
+ build_upper_buffer (pstr);
+ else if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ else
+ pstr->valid_len = pstr->len;
+
+ pstr->cur_idx = 0;
+ return REG_NOERROR;
+}
+
+static unsigned char
+__attribute__ ((pure))
+re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
+{
+ int ch;
+ Idx off;
+
+ /* Handle the common (easiest) cases first. */
+ if (__glibc_likely (!pstr->mbs_allocated))
+ return re_string_peek_byte (pstr, idx);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1
+ && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ off = pstr->cur_idx + idx;
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ off = pstr->offsets[off];
+#endif
+
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+#ifdef RE_ENABLE_I18N
+ /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I
+ this function returns CAPITAL LETTER I instead of first byte of
+ DOTLESS SMALL LETTER I. The latter would confuse the parser,
+ since peek_byte_case doesn't advance cur_idx in any way. */
+ if (pstr->offsets_needed && !isascii (ch))
+ return re_string_peek_byte (pstr, idx);
+#endif
+
+ return ch;
+}
+
+static unsigned char
+re_string_fetch_byte_case (re_string_t *pstr)
+{
+ if (__glibc_likely (!pstr->mbs_allocated))
+ return re_string_fetch_byte (pstr);
+
+#ifdef RE_ENABLE_I18N
+ if (pstr->offsets_needed)
+ {
+ Idx off;
+ int ch;
+
+ /* For tr_TR.UTF-8 [[:islower:]] there is
+ [[: CAPITAL LETTER I WITH DOT lower:]] in mbs. Skip
+ in that case the whole multi-byte character and return
+ the original letter. On the other side, with
+ [[: DOTLESS SMALL LETTER I return [[:I, as doing
+ anything else would complicate things too much. */
+
+ if (!re_string_first_byte (pstr, pstr->cur_idx))
+ return re_string_fetch_byte (pstr);
+
+ off = pstr->offsets[pstr->cur_idx];
+ ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+ if (! isascii (ch))
+ return re_string_fetch_byte (pstr);
+
+ re_string_skip_bytes (pstr,
+ re_string_char_size_at (pstr, pstr->cur_idx));
+ return ch;
+ }
+#endif
+
+ return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++];
+}
+
+static void
+re_string_destruct (re_string_t *pstr)
+{
+#ifdef RE_ENABLE_I18N
+ re_free (pstr->wcs);
+ re_free (pstr->offsets);
+#endif /* RE_ENABLE_I18N */
+ if (pstr->mbs_allocated)
+ re_free (pstr->mbs);
+}
+
+/* Return the context at IDX in INPUT. */
+
+static unsigned int
+re_string_context_at (const re_string_t *input, Idx idx, int eflags)
+{
+ int c;
+ if (__glibc_unlikely (idx < 0))
+ /* In this case, we use the value stored in input->tip_context,
+ since we can't know the character in input->mbs[-1] here. */
+ return input->tip_context;
+ if (__glibc_unlikely (idx == input->len))
+ return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
+ : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
+#ifdef RE_ENABLE_I18N
+ if (input->mb_cur_max > 1)
+ {
+ wint_t wc;
+ Idx wc_idx = idx;
+ while(input->wcs[wc_idx] == WEOF)
+ {
+ DEBUG_ASSERT (wc_idx >= 0);
+ --wc_idx;
+ if (wc_idx < 0)
+ return input->tip_context;
+ }
+ wc = input->wcs[wc_idx];
+ if (__glibc_unlikely (input->word_ops_used != 0)
+ && IS_WIDE_WORD_CHAR (wc))
+ return CONTEXT_WORD;
+ return (IS_WIDE_NEWLINE (wc) && input->newline_anchor
+ ? CONTEXT_NEWLINE : 0);
+ }
+ else
+#endif
+ {
+ c = re_string_byte_at (input, idx);
+ if (bitset_contain (input->word_char, c))
+ return CONTEXT_WORD;
+ return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0;
+ }
+}
+
+/* Functions for set operation. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_alloc (re_node_set *set, Idx size)
+{
+ set->alloc = size;
+ set->nelem = 0;
+ set->elems = re_malloc (Idx, size);
+ if (__glibc_unlikely (set->elems == NULL)
+ && (MALLOC_0_IS_NONNULL || size != 0))
+ return REG_ESPACE;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_1 (re_node_set *set, Idx elem)
+{
+ set->alloc = 1;
+ set->nelem = 1;
+ set->elems = re_malloc (Idx, 1);
+ if (__glibc_unlikely (set->elems == NULL))
+ {
+ set->alloc = set->nelem = 0;
+ return REG_ESPACE;
+ }
+ set->elems[0] = elem;
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
+{
+ set->alloc = 2;
+ set->elems = re_malloc (Idx, 2);
+ if (__glibc_unlikely (set->elems == NULL))
+ return REG_ESPACE;
+ if (elem1 == elem2)
+ {
+ set->nelem = 1;
+ set->elems[0] = elem1;
+ }
+ else
+ {
+ set->nelem = 2;
+ if (elem1 < elem2)
+ {
+ set->elems[0] = elem1;
+ set->elems[1] = elem2;
+ }
+ else
+ {
+ set->elems[0] = elem2;
+ set->elems[1] = elem1;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
+{
+ dest->nelem = src->nelem;
+ if (src->nelem > 0)
+ {
+ dest->alloc = dest->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (__glibc_unlikely (dest->elems == NULL))
+ {
+ dest->alloc = dest->nelem = 0;
+ return REG_ESPACE;
+ }
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ }
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+}
+
+/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded.
+ Note: We assume dest->elems is NULL, when dest->alloc is 0. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, is, id, delta, sbase;
+ if (src1->nelem == 0 || src2->nelem == 0)
+ return REG_NOERROR;
+
+ /* We need dest->nelem + 2 * elems_in_intersection; this is a
+ conservative estimate. */
+ if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
+ {
+ Idx new_alloc = src1->nelem + src2->nelem + dest->alloc;
+ Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc);
+ if (__glibc_unlikely (new_elems == NULL))
+ return REG_ESPACE;
+ dest->elems = new_elems;
+ dest->alloc = new_alloc;
+ }
+
+ /* Find the items in the intersection of SRC1 and SRC2, and copy
+ into the top of DEST those that are not already in DEST itself. */
+ sbase = dest->nelem + src1->nelem + src2->nelem;
+ i1 = src1->nelem - 1;
+ i2 = src2->nelem - 1;
+ id = dest->nelem - 1;
+ for (;;)
+ {
+ if (src1->elems[i1] == src2->elems[i2])
+ {
+ /* Try to find the item in DEST. Maybe we could binary search? */
+ while (id >= 0 && dest->elems[id] > src1->elems[i1])
+ --id;
+
+ if (id < 0 || dest->elems[id] != src1->elems[i1])
+ dest->elems[--sbase] = src1->elems[i1];
+
+ if (--i1 < 0 || --i2 < 0)
+ break;
+ }
+
+ /* Lower the highest of the two items. */
+ else if (src1->elems[i1] < src2->elems[i2])
+ {
+ if (--i2 < 0)
+ break;
+ }
+ else
+ {
+ if (--i1 < 0)
+ break;
+ }
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + src1->nelem + src2->nelem - 1;
+ delta = is - sbase + 1;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place; this is more or
+ less the same loop that is in re_node_set_merge. */
+ dest->nelem += delta;
+ if (delta > 0 && id >= 0)
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (--id < 0)
+ break;
+ }
+ }
+
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx));
+
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets SRC1 and SRC2. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
+ const re_node_set *src2)
+{
+ Idx i1, i2, id;
+ if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
+ {
+ dest->alloc = src1->nelem + src2->nelem;
+ dest->elems = re_malloc (Idx, dest->alloc);
+ if (__glibc_unlikely (dest->elems == NULL))
+ return REG_ESPACE;
+ }
+ else
+ {
+ if (src1 != NULL && src1->nelem > 0)
+ return re_node_set_init_copy (dest, src1);
+ else if (src2 != NULL && src2->nelem > 0)
+ return re_node_set_init_copy (dest, src2);
+ else
+ re_node_set_init_empty (dest);
+ return REG_NOERROR;
+ }
+ for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+ {
+ if (src1->elems[i1] > src2->elems[i2])
+ {
+ dest->elems[id++] = src2->elems[i2++];
+ continue;
+ }
+ if (src1->elems[i1] == src2->elems[i2])
+ ++i2;
+ dest->elems[id++] = src1->elems[i1++];
+ }
+ if (i1 < src1->nelem)
+ {
+ memcpy (dest->elems + id, src1->elems + i1,
+ (src1->nelem - i1) * sizeof (Idx));
+ id += src1->nelem - i1;
+ }
+ else if (i2 < src2->nelem)
+ {
+ memcpy (dest->elems + id, src2->elems + i2,
+ (src2->nelem - i2) * sizeof (Idx));
+ id += src2->nelem - i2;
+ }
+ dest->nelem = id;
+ return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets DEST and SRC. And store it to
+ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_merge (re_node_set *dest, const re_node_set *src)
+{
+ Idx is, id, sbase, delta;
+ if (src == NULL || src->nelem == 0)
+ return REG_NOERROR;
+ if (dest->alloc < 2 * src->nelem + dest->nelem)
+ {
+ Idx new_alloc = 2 * (src->nelem + dest->alloc);
+ Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc);
+ if (__glibc_unlikely (new_buffer == NULL))
+ return REG_ESPACE;
+ dest->elems = new_buffer;
+ dest->alloc = new_alloc;
+ }
+
+ if (__glibc_unlikely (dest->nelem == 0))
+ {
+ dest->nelem = src->nelem;
+ memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+ return REG_NOERROR;
+ }
+
+ /* Copy into the top of DEST the items of SRC that are not
+ found in DEST. Maybe we could binary search in DEST? */
+ for (sbase = dest->nelem + 2 * src->nelem,
+ is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; )
+ {
+ if (dest->elems[id] == src->elems[is])
+ is--, id--;
+ else if (dest->elems[id] < src->elems[is])
+ dest->elems[--sbase] = src->elems[is--];
+ else /* if (dest->elems[id] > src->elems[is]) */
+ --id;
+ }
+
+ if (is >= 0)
+ {
+ /* If DEST is exhausted, the remaining items of SRC must be unique. */
+ sbase -= is + 1;
+ memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx));
+ }
+
+ id = dest->nelem - 1;
+ is = dest->nelem + 2 * src->nelem - 1;
+ delta = is - sbase + 1;
+ if (delta == 0)
+ return REG_NOERROR;
+
+ /* Now copy. When DELTA becomes zero, the remaining
+ DEST elements are already in place. */
+ dest->nelem += delta;
+ for (;;)
+ {
+ if (dest->elems[is] > dest->elems[id])
+ {
+ /* Copy from the top. */
+ dest->elems[id + delta--] = dest->elems[is--];
+ if (delta == 0)
+ break;
+ }
+ else
+ {
+ /* Slide from the bottom. */
+ dest->elems[id + delta] = dest->elems[id];
+ if (--id < 0)
+ {
+ /* Copy remaining SRC elements. */
+ memcpy (dest->elems, dest->elems + sbase,
+ delta * sizeof (Idx));
+ break;
+ }
+ }
+ }
+
+ return REG_NOERROR;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have ELEM.
+ Return true if successful. */
+
+static bool
+__attribute_warn_unused_result__
+re_node_set_insert (re_node_set *set, Idx elem)
+{
+ Idx idx;
+ /* In case the set is empty. */
+ if (set->alloc == 0)
+ return __glibc_likely (re_node_set_init_1 (set, elem) == REG_NOERROR);
+
+ if (__glibc_unlikely (set->nelem) == 0)
+ {
+ /* We already guaranteed above that set->alloc != 0. */
+ set->elems[0] = elem;
+ ++set->nelem;
+ return true;
+ }
+
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = set->alloc * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (__glibc_unlikely (new_elems == NULL))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Move the elements which follows the new element. Test the
+ first element separately to skip a check in the inner loop. */
+ if (elem < set->elems[0])
+ {
+ for (idx = set->nelem; idx > 0; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+ else
+ {
+ for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
+ set->elems[idx] = set->elems[idx - 1];
+ }
+
+ /* Insert the new element. */
+ set->elems[idx] = elem;
+ ++set->nelem;
+ return true;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+ SET should not already have any element greater than or equal to ELEM.
+ Return true if successful. */
+
+static bool
+__attribute_warn_unused_result__
+re_node_set_insert_last (re_node_set *set, Idx elem)
+{
+ /* Realloc if we need. */
+ if (set->alloc == set->nelem)
+ {
+ Idx *new_elems;
+ set->alloc = (set->alloc + 1) * 2;
+ new_elems = re_realloc (set->elems, Idx, set->alloc);
+ if (__glibc_unlikely (new_elems == NULL))
+ return false;
+ set->elems = new_elems;
+ }
+
+ /* Insert the new element. */
+ set->elems[set->nelem++] = elem;
+ return true;
+}
+
+/* Compare two node sets SET1 and SET2.
+ Return true if SET1 and SET2 are equivalent. */
+
+static bool
+__attribute__ ((pure))
+re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
+{
+ Idx i;
+ if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
+ return false;
+ for (i = set1->nelem ; --i >= 0 ; )
+ if (set1->elems[i] != set2->elems[i])
+ return false;
+ return true;
+}
+
+/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
+
+static Idx
+__attribute__ ((pure))
+re_node_set_contains (const re_node_set *set, Idx elem)
+{
+ __re_size_t idx, right, mid;
+ if (set->nelem <= 0)
+ return 0;
+
+ /* Binary search the element. */
+ idx = 0;
+ right = set->nelem - 1;
+ while (idx < right)
+ {
+ mid = (idx + right) / 2;
+ if (set->elems[mid] < elem)
+ idx = mid + 1;
+ else
+ right = mid;
+ }
+ return set->elems[idx] == elem ? idx + 1 : 0;
+}
+
+static void
+re_node_set_remove_at (re_node_set *set, Idx idx)
+{
+ if (idx < 0 || idx >= set->nelem)
+ return;
+ --set->nelem;
+ for (; idx < set->nelem; idx++)
+ set->elems[idx] = set->elems[idx + 1];
+}
+
+
+/* Add the token TOKEN to dfa->nodes, and return the index of the token.
+ Or return -1 if an error occurred. */
+
+static Idx
+re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
+{
+ if (__glibc_unlikely (dfa->nodes_len >= dfa->nodes_alloc))
+ {
+ size_t new_nodes_alloc = dfa->nodes_alloc * 2;
+ Idx *new_nexts, *new_indices;
+ re_node_set *new_edests, *new_eclosures;
+ re_token_t *new_nodes;
+
+ /* Avoid overflows in realloc. */
+ const size_t max_object_size = MAX (sizeof (re_token_t),
+ MAX (sizeof (re_node_set),
+ sizeof (Idx)));
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
+ < new_nodes_alloc))
+ return -1;
+
+ new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
+ if (__glibc_unlikely (new_nodes == NULL))
+ return -1;
+ dfa->nodes = new_nodes;
+ new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc);
+ new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc);
+ new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc);
+ new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc);
+ if (__glibc_unlikely (new_nexts == NULL || new_indices == NULL
+ || new_edests == NULL || new_eclosures == NULL))
+ {
+ re_free (new_nexts);
+ re_free (new_indices);
+ re_free (new_edests);
+ re_free (new_eclosures);
+ return -1;
+ }
+ dfa->nexts = new_nexts;
+ dfa->org_indices = new_indices;
+ dfa->edests = new_edests;
+ dfa->eclosures = new_eclosures;
+ dfa->nodes_alloc = new_nodes_alloc;
+ }
+ dfa->nodes[dfa->nodes_len] = token;
+ dfa->nodes[dfa->nodes_len].constraint = 0;
+#ifdef RE_ENABLE_I18N
+ dfa->nodes[dfa->nodes_len].accept_mb =
+ ((token.type == OP_PERIOD && dfa->mb_cur_max > 1)
+ || token.type == COMPLEX_BRACKET);
+#endif
+ dfa->nexts[dfa->nodes_len] = -1;
+ re_node_set_init_empty (dfa->edests + dfa->nodes_len);
+ re_node_set_init_empty (dfa->eclosures + dfa->nodes_len);
+ return dfa->nodes_len++;
+}
+
+static re_hashval_t
+calc_state_hash (const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash = nodes->nelem + context;
+ Idx i;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ hash += nodes->elems[i];
+ return hash;
+}
+
+/* Search for the state whose node_set is equivalent to NODES.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#if defined GCC_LINT || defined lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (__glibc_unlikely (nodes->nelem == 0))
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, 0);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (hash != state->hash)
+ continue;
+ if (re_node_set_compare (&state->nodes, nodes))
+ return state;
+ }
+
+ /* There are no appropriate state in the dfa, create the new one. */
+ new_state = create_ci_newstate (dfa, nodes, hash);
+ if (__glibc_unlikely (new_state == NULL))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Search for the state whose node_set is equivalent to NODES and
+ whose context is equivalent to CONTEXT.
+ Return the pointer to the state, if we found it in the DFA.
+ Otherwise create the new one and return it. In case of an error
+ return NULL and set the error code in ERR.
+ Note: - We assume NULL as the invalid state, then it is possible that
+ return value is NULL and ERR is REG_NOERROR.
+ - We never return non-NULL value in case of any errors, it is for
+ optimization. */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
+ const re_node_set *nodes, unsigned int context)
+{
+ re_hashval_t hash;
+ re_dfastate_t *new_state;
+ struct re_state_table_entry *spot;
+ Idx i;
+#if defined GCC_LINT || defined lint
+ /* Suppress bogus uninitialized-variable warnings. */
+ *err = REG_NOERROR;
+#endif
+ if (nodes->nelem == 0)
+ {
+ *err = REG_NOERROR;
+ return NULL;
+ }
+ hash = calc_state_hash (nodes, context);
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+ for (i = 0 ; i < spot->num ; i++)
+ {
+ re_dfastate_t *state = spot->array[i];
+ if (state->hash == hash
+ && state->context == context
+ && re_node_set_compare (state->entrance_nodes, nodes))
+ return state;
+ }
+ /* There are no appropriate state in 'dfa', create the new one. */
+ new_state = create_cd_newstate (dfa, nodes, context, hash);
+ if (__glibc_unlikely (new_state == NULL))
+ *err = REG_ESPACE;
+
+ return new_state;
+}
+
+/* Finish initialization of the new state NEWSTATE, and using its hash value
+ HASH put in the appropriate bucket of DFA's state table. Return value
+ indicates the error code if failed. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
+ re_hashval_t hash)
+{
+ struct re_state_table_entry *spot;
+ reg_errcode_t err;
+ Idx i;
+
+ newstate->hash = hash;
+ err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return REG_ESPACE;
+ for (i = 0; i < newstate->nodes.nelem; i++)
+ {
+ Idx elem = newstate->nodes.elems[i];
+ if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
+ if (! re_node_set_insert_last (&newstate->non_eps_nodes, elem))
+ return REG_ESPACE;
+ }
+
+ spot = dfa->state_table + (hash & dfa->state_hash_mask);
+ if (__glibc_unlikely (spot->alloc <= spot->num))
+ {
+ Idx new_alloc = 2 * spot->num + 2;
+ re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
+ new_alloc);
+ if (__glibc_unlikely (new_array == NULL))
+ return REG_ESPACE;
+ spot->array = new_array;
+ spot->alloc = new_alloc;
+ }
+ spot->array[spot->num++] = newstate;
+ return REG_NOERROR;
+}
+
+static void
+free_state (re_dfastate_t *state)
+{
+ re_node_set_free (&state->non_eps_nodes);
+ re_node_set_free (&state->inveclosure);
+ if (state->entrance_nodes != &state->nodes)
+ {
+ re_node_set_free (state->entrance_nodes);
+ re_free (state->entrance_nodes);
+ }
+ re_node_set_free (&state->nodes);
+ re_free (state->word_trtable);
+ re_free (state->trtable);
+ re_free (state);
+}
+
+/* Create the new state which is independent of contexts.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ re_hashval_t hash)
+{
+ Idx i;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (__glibc_unlikely (newstate == NULL))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->entrance_nodes = &newstate->nodes;
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ if (type == CHARACTER && !node->constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+ else if (type == ANCHOR || node->constraint)
+ newstate->has_constraint = 1;
+ }
+ err = register_state (dfa, newstate, hash);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
+
+/* Create the new state which is depend on the context CONTEXT.
+ Return the new state if succeeded, otherwise return NULL. */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+ unsigned int context, re_hashval_t hash)
+{
+ Idx i, nctx_nodes = 0;
+ reg_errcode_t err;
+ re_dfastate_t *newstate;
+
+ newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+ if (__glibc_unlikely (newstate == NULL))
+ return NULL;
+ err = re_node_set_init_copy (&newstate->nodes, nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_free (newstate);
+ return NULL;
+ }
+
+ newstate->context = context;
+ newstate->entrance_nodes = &newstate->nodes;
+
+ for (i = 0 ; i < nodes->nelem ; i++)
+ {
+ re_token_t *node = dfa->nodes + nodes->elems[i];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ if (type == CHARACTER && !constraint)
+ continue;
+#ifdef RE_ENABLE_I18N
+ newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+ /* If the state has the halt node, the state is a halt state. */
+ if (type == END_OF_RE)
+ newstate->halt = 1;
+ else if (type == OP_BACK_REF)
+ newstate->has_backref = 1;
+
+ if (constraint)
+ {
+ if (newstate->entrance_nodes == &newstate->nodes)
+ {
+ re_node_set *entrance_nodes = re_malloc (re_node_set, 1);
+ if (__glibc_unlikely (entrance_nodes == NULL))
+ {
+ free_state (newstate);
+ return NULL;
+ }
+ newstate->entrance_nodes = entrance_nodes;
+ if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
+ != REG_NOERROR)
+ {
+ free_state (newstate);
+ return NULL;
+ }
+ nctx_nodes = 0;
+ newstate->has_constraint = 1;
+ }
+
+ if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
+ {
+ re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
+ ++nctx_nodes;
+ }
+ }
+ }
+ err = register_state (dfa, newstate, hash);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ free_state (newstate);
+ newstate = NULL;
+ }
+ return newstate;
+}
diff --git a/lib/regex_internal.h b/lib/regex_internal.h
new file mode 100644
index 0000000..7b50b47
--- /dev/null
+++ b/lib/regex_internal.h
@@ -0,0 +1,859 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <langinfo.h>
+#include <locale.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <intprops.h>
+#include <verify.h>
+
+#if defined DEBUG && DEBUG != 0
+# include <assert.h>
+# define DEBUG_ASSERT(x) assert (x)
+#else
+# define DEBUG_ASSERT(x) assume (x)
+#endif
+
+#ifdef _LIBC
+# include <libc-lock.h>
+# define lock_define(name) __libc_lock_define (, name)
+# define lock_init(lock) (__libc_lock_init (lock), 0)
+# define lock_fini(lock) ((void) 0)
+# define lock_lock(lock) __libc_lock_lock (lock)
+# define lock_unlock(lock) __libc_lock_unlock (lock)
+#elif defined GNULIB_LOCK && !defined USE_UNLOCKED_IO
+# include "glthread/lock.h"
+# define lock_define(name) gl_lock_define (, name)
+# define lock_init(lock) glthread_lock_init (&(lock))
+# define lock_fini(lock) glthread_lock_destroy (&(lock))
+# define lock_lock(lock) glthread_lock_lock (&(lock))
+# define lock_unlock(lock) glthread_lock_unlock (&(lock))
+#elif defined GNULIB_PTHREAD && !defined USE_UNLOCKED_IO
+# include <pthread.h>
+# define lock_define(name) pthread_mutex_t name;
+# define lock_init(lock) pthread_mutex_init (&(lock), 0)
+# define lock_fini(lock) pthread_mutex_destroy (&(lock))
+# define lock_lock(lock) pthread_mutex_lock (&(lock))
+# define lock_unlock(lock) pthread_mutex_unlock (&(lock))
+#else
+# define lock_define(name)
+# define lock_init(lock) 0
+# define lock_fini(lock) ((void) 0)
+ /* The 'dfa' avoids an "unused variable 'dfa'" warning from GCC. */
+# define lock_lock(lock) ((void) dfa)
+# define lock_unlock(lock) ((void) 0)
+#endif
+
+/* In case that the system doesn't have isblank(). */
+#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+/* regex code assumes isascii has its usual numeric meaning,
+ even if the portable character set uses EBCDIC encoding,
+ and even if wint_t is wider than int. */
+#ifndef _LIBC
+# undef isascii
+# define isascii(c) (((c) & ~0x7f) == 0)
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+# define _RE_DEFINE_LOCALE_FUNCTIONS 1
+# include <locale/localeinfo.h>
+# include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages. */
+#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+# undef gettext
+# define gettext(msgid) \
+ __dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES)
+# endif
+#else
+# undef gettext
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+ strings. */
+# define gettext_noop(String) String
+#endif
+
+#if (defined MB_CUR_MAX && HAVE_WCTYPE_H && HAVE_ISWCTYPE) || _LIBC
+# define RE_ENABLE_I18N
+#endif
+
+/* Number of ASCII characters. */
+#define ASCII_CHARS 0x80
+
+/* Number of single byte characters. */
+#define SBC_MAX (UCHAR_MAX + 1)
+
+#define COLL_ELEM_LEN_MAX 8
+
+/* The character which represents newline. */
+#define NEWLINE_CHAR '\n'
+#define WIDE_NEWLINE_CHAR L'\n'
+
+/* Rename to standard API for using out of glibc. */
+#ifndef _LIBC
+# undef __wctype
+# undef __iswalnum
+# undef __iswctype
+# undef __towlower
+# undef __towupper
+# define __wctype wctype
+# define __iswalnum iswalnum
+# define __iswctype iswctype
+# define __towlower towlower
+# define __towupper towupper
+# define __btowc btowc
+# define __mbrtowc mbrtowc
+# define __wcrtomb wcrtomb
+# define __regfree regfree
+#endif /* not _LIBC */
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+#ifndef ULONG_WIDTH
+# define ULONG_WIDTH REGEX_UINTEGER_WIDTH (ULONG_MAX)
+/* The number of usable bits in an unsigned integer type with maximum
+ value MAX, as an int expression suitable in #if. Cover all known
+ practical hosts. This implementation exploits the fact that MAX is
+ 1 less than a power of 2, and merely counts the number of 1 bits in
+ MAX; "COBn" means "count the number of 1 bits in the low-order n bits". */
+# define REGEX_UINTEGER_WIDTH(max) REGEX_COB128 (max)
+# define REGEX_COB128(n) (REGEX_COB64 ((n) >> 31 >> 31 >> 2) + REGEX_COB64 (n))
+# define REGEX_COB64(n) (REGEX_COB32 ((n) >> 31 >> 1) + REGEX_COB32 (n))
+# define REGEX_COB32(n) (REGEX_COB16 ((n) >> 16) + REGEX_COB16 (n))
+# define REGEX_COB16(n) (REGEX_COB8 ((n) >> 8) + REGEX_COB8 (n))
+# define REGEX_COB8(n) (REGEX_COB4 ((n) >> 4) + REGEX_COB4 (n))
+# define REGEX_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + ((n) & 1))
+# if ULONG_MAX / 2 + 1 != 1ul << (ULONG_WIDTH - 1)
+# error "ULONG_MAX out of range"
+# endif
+#endif
+
+/* The type of indexes into strings. This is signed, not size_t,
+ since the API requires indexes to fit in regoff_t anyway, and using
+ signed integers makes the code a bit smaller and presumably faster.
+ The traditional GNU regex implementation uses int for indexes.
+ The POSIX-compatible implementation uses a possibly-wider type.
+ The name 'Idx' is three letters to minimize the hassle of
+ reindenting a lot of regex code that formerly used 'int'. */
+typedef regoff_t Idx;
+#ifdef _REGEX_LARGE_OFFSETS
+# define IDX_MAX SSIZE_MAX
+#else
+# define IDX_MAX INT_MAX
+#endif
+
+/* A hash value, suitable for computing hash tables. */
+typedef __re_size_t re_hashval_t;
+
+/* An integer used to represent a set of bits. It must be unsigned,
+ and must be at least as wide as unsigned int. */
+typedef unsigned long int bitset_word_t;
+/* All bits set in a bitset_word_t. */
+#define BITSET_WORD_MAX ULONG_MAX
+/* Number of bits in a bitset_word_t. */
+#define BITSET_WORD_BITS ULONG_WIDTH
+
+/* Number of bitset_word_t values in a bitset_t. */
+#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
+
+typedef bitset_word_t bitset_t[BITSET_WORDS];
+typedef bitset_word_t *re_bitset_ptr_t;
+typedef const bitset_word_t *re_const_bitset_ptr_t;
+
+#define PREV_WORD_CONSTRAINT 0x0001
+#define PREV_NOTWORD_CONSTRAINT 0x0002
+#define NEXT_WORD_CONSTRAINT 0x0004
+#define NEXT_NOTWORD_CONSTRAINT 0x0008
+#define PREV_NEWLINE_CONSTRAINT 0x0010
+#define NEXT_NEWLINE_CONSTRAINT 0x0020
+#define PREV_BEGBUF_CONSTRAINT 0x0040
+#define NEXT_ENDBUF_CONSTRAINT 0x0080
+#define WORD_DELIM_CONSTRAINT 0x0100
+#define NOT_WORD_DELIM_CONSTRAINT 0x0200
+
+typedef enum
+{
+ INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+ WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+ LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
+ LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
+ BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
+ BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
+ WORD_DELIM = WORD_DELIM_CONSTRAINT,
+ NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
+} re_context_type;
+
+typedef struct
+{
+ Idx alloc;
+ Idx nelem;
+ Idx *elems;
+} re_node_set;
+
+typedef enum
+{
+ NON_TYPE = 0,
+
+ /* Node type, These are used by token, node, tree. */
+ CHARACTER = 1,
+ END_OF_RE = 2,
+ SIMPLE_BRACKET = 3,
+ OP_BACK_REF = 4,
+ OP_PERIOD = 5,
+#ifdef RE_ENABLE_I18N
+ COMPLEX_BRACKET = 6,
+ OP_UTF8_PERIOD = 7,
+#endif /* RE_ENABLE_I18N */
+
+ /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
+ when the debugger shows values of this enum type. */
+#define EPSILON_BIT 8
+ OP_OPEN_SUBEXP = EPSILON_BIT | 0,
+ OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
+ OP_ALT = EPSILON_BIT | 2,
+ OP_DUP_ASTERISK = EPSILON_BIT | 3,
+ ANCHOR = EPSILON_BIT | 4,
+
+ /* Tree type, these are used only by tree. */
+ CONCAT = 16,
+ SUBEXP = 17,
+
+ /* Token type, these are used only by token. */
+ OP_DUP_PLUS = 18,
+ OP_DUP_QUESTION,
+ OP_OPEN_BRACKET,
+ OP_CLOSE_BRACKET,
+ OP_CHARSET_RANGE,
+ OP_OPEN_DUP_NUM,
+ OP_CLOSE_DUP_NUM,
+ OP_NON_MATCH_LIST,
+ OP_OPEN_COLL_ELEM,
+ OP_CLOSE_COLL_ELEM,
+ OP_OPEN_EQUIV_CLASS,
+ OP_CLOSE_EQUIV_CLASS,
+ OP_OPEN_CHAR_CLASS,
+ OP_CLOSE_CHAR_CLASS,
+ OP_WORD,
+ OP_NOTWORD,
+ OP_SPACE,
+ OP_NOTSPACE,
+ BACK_SLASH
+
+} re_token_type_t;
+
+#ifdef RE_ENABLE_I18N
+typedef struct
+{
+ /* Multibyte characters. */
+ wchar_t *mbchars;
+
+ /* Collating symbols. */
+# ifdef _LIBC
+ int32_t *coll_syms;
+# endif
+
+ /* Equivalence classes. */
+# ifdef _LIBC
+ int32_t *equiv_classes;
+# endif
+
+ /* Range expressions. */
+# ifdef _LIBC
+ uint32_t *range_starts;
+ uint32_t *range_ends;
+# else /* not _LIBC */
+ wchar_t *range_starts;
+ wchar_t *range_ends;
+# endif /* not _LIBC */
+
+ /* Character classes. */
+ wctype_t *char_classes;
+
+ /* If this character set is the non-matching list. */
+ unsigned int non_match : 1;
+
+ /* # of multibyte characters. */
+ Idx nmbchars;
+
+ /* # of collating symbols. */
+ Idx ncoll_syms;
+
+ /* # of equivalence classes. */
+ Idx nequiv_classes;
+
+ /* # of range expressions. */
+ Idx nranges;
+
+ /* # of character classes. */
+ Idx nchar_classes;
+} re_charset_t;
+#endif /* RE_ENABLE_I18N */
+
+typedef struct
+{
+ union
+ {
+ unsigned char c; /* for CHARACTER */
+ re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
+#ifdef RE_ENABLE_I18N
+ re_charset_t *mbcset; /* for COMPLEX_BRACKET */
+#endif /* RE_ENABLE_I18N */
+ Idx idx; /* for BACK_REF */
+ re_context_type ctx_type; /* for ANCHOR */
+ } opr;
+#if (__GNUC__ >= 2 || defined __clang__) && !defined __STRICT_ANSI__
+ re_token_type_t type : 8;
+#else
+ re_token_type_t type;
+#endif
+ unsigned int constraint : 10; /* context constraint */
+ unsigned int duplicated : 1;
+ unsigned int opt_subexp : 1;
+#ifdef RE_ENABLE_I18N
+ unsigned int accept_mb : 1;
+ /* These 2 bits can be moved into the union if needed (e.g. if running out
+ of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */
+ unsigned int mb_partial : 1;
+#endif
+ unsigned int word_char : 1;
+} re_token_t;
+
+#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
+
+struct re_string_t
+{
+ /* Indicate the raw buffer which is the original string passed as an
+ argument of regexec(), re_search(), etc.. */
+ const unsigned char *raw_mbs;
+ /* Store the multibyte string. In case of "case insensitive mode" like
+ REG_ICASE, upper cases of the string are stored, otherwise MBS points
+ the same address that RAW_MBS points. */
+ unsigned char *mbs;
+#ifdef RE_ENABLE_I18N
+ /* Store the wide character string which is corresponding to MBS. */
+ wint_t *wcs;
+ Idx *offsets;
+ mbstate_t cur_state;
+#endif
+ /* Index in RAW_MBS. Each character mbs[i] corresponds to
+ raw_mbs[raw_mbs_idx + i]. */
+ Idx raw_mbs_idx;
+ /* The length of the valid characters in the buffers. */
+ Idx valid_len;
+ /* The corresponding number of bytes in raw_mbs array. */
+ Idx valid_raw_len;
+ /* The length of the buffers MBS and WCS. */
+ Idx bufs_len;
+ /* The index in MBS, which is updated by re_string_fetch_byte. */
+ Idx cur_idx;
+ /* length of RAW_MBS array. */
+ Idx raw_len;
+ /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */
+ Idx len;
+ /* End of the buffer may be shorter than its length in the cases such
+ as re_match_2, re_search_2. Then, we use STOP for end of the buffer
+ instead of LEN. */
+ Idx raw_stop;
+ /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */
+ Idx stop;
+
+ /* The context of mbs[0]. We store the context independently, since
+ the context of mbs[0] may be different from raw_mbs[0], which is
+ the beginning of the input string. */
+ unsigned int tip_context;
+ /* The translation passed as a part of an argument of re_compile_pattern. */
+ RE_TRANSLATE_TYPE trans;
+ /* Copy of re_dfa_t's word_char. */
+ re_const_bitset_ptr_t word_char;
+ /* true if REG_ICASE. */
+ unsigned char icase;
+ unsigned char is_utf8;
+ unsigned char map_notascii;
+ unsigned char mbs_allocated;
+ unsigned char offsets_needed;
+ unsigned char newline_anchor;
+ unsigned char word_ops_used;
+ int mb_cur_max;
+};
+typedef struct re_string_t re_string_t;
+
+
+struct re_dfa_t;
+typedef struct re_dfa_t re_dfa_t;
+
+#ifndef _LIBC
+# define IS_IN(libc) false
+#endif
+
+#define re_string_peek_byte(pstr, offset) \
+ ((pstr)->mbs[(pstr)->cur_idx + offset])
+#define re_string_fetch_byte(pstr) \
+ ((pstr)->mbs[(pstr)->cur_idx++])
+#define re_string_first_byte(pstr, idx) \
+ ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
+#define re_string_is_single_byte_char(pstr, idx) \
+ ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
+ || (pstr)->wcs[(idx) + 1] != WEOF))
+#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
+#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
+#define re_string_get_buffer(pstr) ((pstr)->mbs)
+#define re_string_length(pstr) ((pstr)->len)
+#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
+#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
+#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
+
+#if defined _LIBC || HAVE_ALLOCA
+# include <alloca.h>
+#endif
+
+#ifndef _LIBC
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ allocate anything larger than 4096 bytes. Also care for the possibility
+ of a few compiler-allocated temporary stack slots. */
+# define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc. */
+# define __libc_use_alloca(n) 0
+# undef alloca
+# define alloca(n) malloc (n)
+# endif
+#endif
+
+#ifdef _LIBC
+# define MALLOC_0_IS_NONNULL 1
+#elif !defined MALLOC_0_IS_NONNULL
+# define MALLOC_0_IS_NONNULL 0
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
+#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
+#define re_free(p) free (p)
+
+struct bin_tree_t
+{
+ struct bin_tree_t *parent;
+ struct bin_tree_t *left;
+ struct bin_tree_t *right;
+ struct bin_tree_t *first;
+ struct bin_tree_t *next;
+
+ re_token_t token;
+
+ /* 'node_idx' is the index in dfa->nodes, if 'type' == 0.
+ Otherwise 'type' indicate the type of this node. */
+ Idx node_idx;
+};
+typedef struct bin_tree_t bin_tree_t;
+
+#define BIN_TREE_STORAGE_SIZE \
+ ((1024 - sizeof (void *)) / sizeof (bin_tree_t))
+
+struct bin_tree_storage_t
+{
+ struct bin_tree_storage_t *next;
+ bin_tree_t data[BIN_TREE_STORAGE_SIZE];
+};
+typedef struct bin_tree_storage_t bin_tree_storage_t;
+
+#define CONTEXT_WORD 1
+#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
+#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
+#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
+
+#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
+#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
+#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
+#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
+#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
+
+#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
+#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
+#define IS_WIDE_WORD_CHAR(ch) (__iswalnum (ch) || (ch) == L'_')
+#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
+
+#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
+ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
+ || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
+
+#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
+ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+ || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
+ || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
+
+struct re_dfastate_t
+{
+ re_hashval_t hash;
+ re_node_set nodes;
+ re_node_set non_eps_nodes;
+ re_node_set inveclosure;
+ re_node_set *entrance_nodes;
+ struct re_dfastate_t **trtable, **word_trtable;
+ unsigned int context : 4;
+ unsigned int halt : 1;
+ /* If this state can accept "multi byte".
+ Note that we refer to multibyte characters, and multi character
+ collating elements as "multi byte". */
+ unsigned int accept_mb : 1;
+ /* If this state has backreference node(s). */
+ unsigned int has_backref : 1;
+ unsigned int has_constraint : 1;
+};
+typedef struct re_dfastate_t re_dfastate_t;
+
+struct re_state_table_entry
+{
+ Idx num;
+ Idx alloc;
+ re_dfastate_t **array;
+};
+
+/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */
+
+typedef struct
+{
+ Idx next_idx;
+ Idx alloc;
+ re_dfastate_t **array;
+} state_array_t;
+
+/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */
+
+typedef struct
+{
+ Idx node;
+ Idx str_idx; /* The position NODE match at. */
+ state_array_t path;
+} re_sub_match_last_t;
+
+/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
+ And information about the node, whose type is OP_CLOSE_SUBEXP,
+ corresponding to NODE is stored in LASTS. */
+
+typedef struct
+{
+ Idx str_idx;
+ Idx node;
+ state_array_t *path;
+ Idx alasts; /* Allocation size of LASTS. */
+ Idx nlasts; /* The number of LASTS. */
+ re_sub_match_last_t **lasts;
+} re_sub_match_top_t;
+
+struct re_backref_cache_entry
+{
+ Idx node;
+ Idx str_idx;
+ Idx subexp_from;
+ Idx subexp_to;
+ bitset_word_t eps_reachable_subexps_map;
+ char more;
+};
+
+typedef struct
+{
+ /* The string object corresponding to the input string. */
+ re_string_t input;
+ const re_dfa_t *const dfa;
+ /* EFLAGS of the argument of regexec. */
+ int eflags;
+ /* Where the matching ends. */
+ Idx match_last;
+ Idx last_node;
+ /* The state log used by the matcher. */
+ re_dfastate_t **state_log;
+ Idx state_log_top;
+ /* Back reference cache. */
+ Idx nbkref_ents;
+ Idx abkref_ents;
+ struct re_backref_cache_entry *bkref_ents;
+ int max_mb_elem_len;
+ Idx nsub_tops;
+ Idx asub_tops;
+ re_sub_match_top_t **sub_tops;
+} re_match_context_t;
+
+typedef struct
+{
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **limited_states;
+ Idx last_node;
+ Idx last_str_idx;
+ re_node_set limits;
+} re_sift_context_t;
+
+struct re_fail_stack_ent_t
+{
+ Idx idx;
+ Idx node;
+ regmatch_t *regs;
+ re_node_set eps_via_nodes;
+};
+
+struct re_fail_stack_t
+{
+ Idx num;
+ Idx alloc;
+ struct re_fail_stack_ent_t *stack;
+};
+
+struct re_dfa_t
+{
+ re_token_t *nodes;
+ size_t nodes_alloc;
+ size_t nodes_len;
+ Idx *nexts;
+ Idx *org_indices;
+ re_node_set *edests;
+ re_node_set *eclosures;
+ re_node_set *inveclosures;
+ struct re_state_table_entry *state_table;
+ re_dfastate_t *init_state;
+ re_dfastate_t *init_state_word;
+ re_dfastate_t *init_state_nl;
+ re_dfastate_t *init_state_begbuf;
+ bin_tree_t *str_tree;
+ bin_tree_storage_t *str_tree_storage;
+ re_bitset_ptr_t sb_char;
+ int str_tree_storage_idx;
+
+ /* number of subexpressions 're_nsub' is in regex_t. */
+ re_hashval_t state_hash_mask;
+ Idx init_node;
+ Idx nbackref; /* The number of backreference in this dfa. */
+
+ /* Bitmap expressing which backreference is used. */
+ bitset_word_t used_bkref_map;
+ bitset_word_t completed_bkref_map;
+
+ unsigned int has_plural_match : 1;
+ /* If this dfa has "multibyte node", which is a backreference or
+ a node which can accept multibyte character or multi character
+ collating element. */
+ unsigned int has_mb_node : 1;
+ unsigned int is_utf8 : 1;
+ unsigned int map_notascii : 1;
+ unsigned int word_ops_used : 1;
+ int mb_cur_max;
+ bitset_t word_char;
+ reg_syntax_t syntax;
+ Idx *subexp_map;
+#ifdef DEBUG
+ char* re_str;
+#endif
+ lock_define (lock)
+};
+
+#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
+#define re_node_set_remove(set,id) \
+ (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
+#define re_node_set_empty(p) ((p)->nelem = 0)
+#define re_node_set_free(set) re_free ((set)->elems)
+
+
+typedef enum
+{
+ SB_CHAR,
+ MB_CHAR,
+ EQUIV_CLASS,
+ COLL_SYM,
+ CHAR_CLASS
+} bracket_elem_type;
+
+typedef struct
+{
+ bracket_elem_type type;
+ union
+ {
+ unsigned char ch;
+ unsigned char *name;
+ wchar_t wch;
+ } opr;
+} bracket_elem_t;
+
+
+/* Functions for bitset_t operation. */
+
+static inline void
+bitset_set (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
+}
+
+static inline void
+bitset_clear (bitset_t set, Idx i)
+{
+ set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
+}
+
+static inline bool
+bitset_contain (const bitset_t set, Idx i)
+{
+ return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
+}
+
+static inline void
+bitset_empty (bitset_t set)
+{
+ memset (set, '\0', sizeof (bitset_t));
+}
+
+static inline void
+bitset_set_all (bitset_t set)
+{
+ memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
+}
+
+static inline void
+bitset_copy (bitset_t dest, const bitset_t src)
+{
+ memcpy (dest, src, sizeof (bitset_t));
+}
+
+static inline void
+bitset_not (bitset_t set)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
+ set[bitset_i] = ~set[bitset_i];
+ if (SBC_MAX % BITSET_WORD_BITS != 0)
+ set[BITSET_WORDS - 1] =
+ ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
+ & ~set[BITSET_WORDS - 1]);
+}
+
+static inline void
+bitset_merge (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] |= src[bitset_i];
+}
+
+static inline void
+bitset_mask (bitset_t dest, const bitset_t src)
+{
+ int bitset_i;
+ for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+ dest[bitset_i] &= src[bitset_i];
+}
+
+#ifdef RE_ENABLE_I18N
+/* Functions for re_string. */
+static int
+__attribute__ ((pure, unused))
+re_string_char_size_at (const re_string_t *pstr, Idx idx)
+{
+ int byte_idx;
+ if (pstr->mb_cur_max == 1)
+ return 1;
+ for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
+ if (pstr->wcs[idx + byte_idx] != WEOF)
+ break;
+ return byte_idx;
+}
+
+static wint_t
+__attribute__ ((pure, unused))
+re_string_wchar_at (const re_string_t *pstr, Idx idx)
+{
+ if (pstr->mb_cur_max == 1)
+ return (wint_t) pstr->mbs[idx];
+ return (wint_t) pstr->wcs[idx];
+}
+
+# ifdef _LIBC
+# include <locale/weight.h>
+# endif
+
+static int
+__attribute__ ((pure, unused))
+re_string_elem_size_at (const re_string_t *pstr, Idx idx)
+{
+# ifdef _LIBC
+ const unsigned char *p, *extra;
+ const int32_t *table, *indirect;
+ uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+
+ if (nrules != 0)
+ {
+ table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+ _NL_COLLATE_INDIRECTMB);
+ p = pstr->mbs + idx;
+ findidx (table, indirect, extra, &p, pstr->len - idx);
+ return p - pstr->mbs - idx;
+ }
+ else
+# endif /* _LIBC */
+ return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#ifndef FALLTHROUGH
+# if (__GNUC__ >= 7) || (__clang_major__ >= 10)
+# define FALLTHROUGH __attribute__ ((__fallthrough__))
+# else
+# define FALLTHROUGH ((void) 0)
+# endif
+#endif
+
+#endif /* _REGEX_INTERNAL_H */
diff --git a/lib/regexec.c b/lib/regexec.c
new file mode 100644
index 0000000..395e37d
--- /dev/null
+++ b/lib/regexec.c
@@ -0,0 +1,4304 @@
+/* Extended regular expression matching and search library.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+ The GNU C Library 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.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+ Idx n);
+static void match_ctx_clean (re_match_context_t *mctx);
+static void match_ctx_free (re_match_context_t *cache);
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
+ Idx str_idx, Idx from, Idx to);
+static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx);
+static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
+ Idx str_idx);
+static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
+ Idx node, Idx str_idx);
+static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node,
+ Idx last_str_idx);
+static reg_errcode_t re_search_internal (const regex_t *preg,
+ const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop,
+ size_t nmatch, regmatch_t pmatch[],
+ int eflags);
+static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,
+ const char *string1, Idx length1,
+ const char *string2, Idx length2,
+ Idx start, regoff_t range,
+ struct re_registers *regs,
+ Idx stop, bool ret_len);
+static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
+ const char *string, Idx length, Idx start,
+ regoff_t range, Idx stop,
+ struct re_registers *regs,
+ bool ret_len);
+static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+ Idx nregs, int regs_allocated);
+static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx);
+static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first);
+static Idx check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx);
+static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node,
+ Idx cur_idx, Idx nmatch);
+static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
+ Idx str_idx, Idx dest_node, Idx nregs,
+ regmatch_t *regs,
+ re_node_set *eps_via_nodes);
+static reg_errcode_t set_regs (const regex_t *preg,
+ const re_match_context_t *mctx,
+ size_t nmatch, regmatch_t *pmatch,
+ bool fl_backtrack);
+static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs);
+
+#ifdef RE_ENABLE_I18N
+static int sift_states_iter_mb (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
+ re_sift_context_t *sctx);
+static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *cur_dest);
+static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx,
+ re_node_set *dest_nodes);
+static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates);
+static bool check_dst_limits (const re_match_context_t *mctx,
+ const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node,
+ Idx src_idx);
+static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
+ int boundaries, Idx subexp_idx,
+ Idx from_node, Idx bkref_idx);
+static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
+ Idx limit, Idx subexp_idx,
+ Idx node, Idx str_idx,
+ Idx bkref_idx);
+static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,
+ re_node_set *dest_nodes,
+ const re_node_set *candidates,
+ re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents,
+ Idx str_idx);
+static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
+ re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates);
+static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
+ re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num);
+static re_dfastate_t *find_recover_state (reg_errcode_t *err,
+ re_match_context_t *mctx);
+static re_dfastate_t *transit_state (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *state);
+static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *next_state);
+static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
+ re_node_set *cur_nodes,
+ Idx str_idx);
+#if 0
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
+ re_match_context_t *mctx,
+ re_dfastate_t *pstate);
+#endif
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
+ re_dfastate_t *pstate);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
+ const re_node_set *nodes);
+static reg_errcode_t get_subexp (re_match_context_t *mctx,
+ Idx bkref_node, Idx bkref_str_idx);
+static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
+ const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last,
+ Idx bkref_node, Idx bkref_str);
+static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type);
+static reg_errcode_t check_arrival (re_match_context_t *mctx,
+ state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str,
+ int type);
+static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
+ Idx str_idx,
+ re_node_set *cur_nodes,
+ re_node_set *next_nodes);
+static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
+ re_node_set *cur_nodes,
+ Idx ex_subexp, int type);
+static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,
+ re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp,
+ int type);
+static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
+ re_node_set *cur_nodes, Idx cur_str,
+ Idx subexp_num, int type);
+static bool build_trtable (const re_dfa_t *dfa, re_dfastate_t *state);
+#ifdef RE_ENABLE_I18N
+static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx idx);
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+ size_t name_len);
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
+ const re_dfastate_t *state,
+ re_node_set *states_node,
+ bitset_t *states_ch);
+static bool check_node_accept (const re_match_context_t *mctx,
+ const re_token_t *node, Idx idx);
+static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len);
+
+/* Entry point for POSIX code. */
+
+/* regexec searches for a given pattern, specified by PREG, in the
+ string STRING.
+
+ If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+ 'regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
+ least NMATCH elements, and we set them to the offsets of the
+ corresponding matched substrings.
+
+ EFLAGS specifies "execution flags" which affect matching: if
+ REG_NOTBOL is set, then ^ does not match at the beginning of the
+ string; if REG_NOTEOL is set, then $ does not match at the end.
+
+ We return 0 if we find a match and REG_NOMATCH if not. */
+
+int
+regexec (const regex_t *__restrict preg, const char *__restrict string,
+ size_t nmatch, regmatch_t pmatch[], int eflags)
+{
+ reg_errcode_t err;
+ Idx start, length;
+ re_dfa_t *dfa = preg->buffer;
+
+ if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
+ return REG_BADPAT;
+
+ if (eflags & REG_STARTEND)
+ {
+ start = pmatch[0].rm_so;
+ length = pmatch[0].rm_eo;
+ }
+ else
+ {
+ start = 0;
+ length = strlen (string);
+ }
+
+ lock_lock (dfa->lock);
+ if (preg->no_sub)
+ err = re_search_internal (preg, string, length, start, length,
+ length, 0, NULL, eflags);
+ else
+ err = re_search_internal (preg, string, length, start, length,
+ length, nmatch, pmatch, eflags);
+ lock_unlock (dfa->lock);
+ return err != REG_NOERROR;
+}
+
+#ifdef _LIBC
+libc_hidden_def (__regexec)
+
+# include <shlib-compat.h>
+versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+__typeof__ (__regexec) __compat_regexec;
+
+int
+attribute_compat_text_section
+__compat_regexec (const regex_t *__restrict preg,
+ const char *__restrict string, size_t nmatch,
+ regmatch_t pmatch[], int eflags)
+{
+ return regexec (preg, string, nmatch, pmatch,
+ eflags & (REG_NOTBOL | REG_NOTEOL));
+}
+compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);
+# endif
+#endif
+
+/* Entry points for GNU code. */
+
+/* re_match, re_search, re_match_2, re_search_2
+
+ The former two functions operate on STRING with length LENGTH,
+ while the later two operate on concatenation of STRING1 and STRING2
+ with lengths LENGTH1 and LENGTH2, respectively.
+
+ re_match() matches the compiled pattern in BUFP against the string,
+ starting at index START.
+
+ re_search() first tries matching at index START, then it tries to match
+ starting from index START + 1, and so on. The last start position tried
+ is START + RANGE. (Thus RANGE = 0 forces re_search to operate the same
+ way as re_match().)
+
+ The parameter STOP of re_{match,search}_2 specifies that no match exceeding
+ the first STOP characters of the concatenation of the strings should be
+ concerned.
+
+ If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
+ and all groups is stored in REGS. (For the "_2" variants, the offsets are
+ computed relative to the concatenation, not relative to the individual
+ strings.)
+
+ On success, re_match* functions return the length of the match, re_search*
+ return the position of the start of the match. Return value -1 means no
+ match was found and -2 indicates an internal error. */
+
+regoff_t
+re_match (struct re_pattern_buffer *bufp, const char *string, Idx length,
+ Idx start, struct re_registers *regs)
+{
+ return re_search_stub (bufp, string, length, start, 0, length, regs, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match, re_match)
+#endif
+
+regoff_t
+re_search (struct re_pattern_buffer *bufp, const char *string, Idx length,
+ Idx start, regoff_t range, struct re_registers *regs)
+{
+ return re_search_stub (bufp, string, length, start, range, length, regs,
+ false);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+regoff_t
+re_match_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
+ const char *string2, Idx length2, Idx start,
+ struct re_registers *regs, Idx stop)
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, 0, regs, stop, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+regoff_t
+re_search_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
+ const char *string2, Idx length2, Idx start, regoff_t range,
+ struct re_registers *regs, Idx stop)
+{
+ return re_search_2_stub (bufp, string1, length1, string2, length2,
+ start, range, regs, stop, false);
+}
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+static regoff_t
+re_search_2_stub (struct re_pattern_buffer *bufp, const char *string1,
+ Idx length1, const char *string2, Idx length2, Idx start,
+ regoff_t range, struct re_registers *regs,
+ Idx stop, bool ret_len)
+{
+ const char *str;
+ regoff_t rval;
+ Idx len;
+ char *s = NULL;
+
+ if (__glibc_unlikely ((length1 < 0 || length2 < 0 || stop < 0
+ || INT_ADD_WRAPV (length1, length2, &len))))
+ return -2;
+
+ /* Concatenate the strings. */
+ if (length2 > 0)
+ if (length1 > 0)
+ {
+ s = re_malloc (char, len);
+
+ if (__glibc_unlikely (s == NULL))
+ return -2;
+#ifdef _LIBC
+ memcpy (__mempcpy (s, string1, length1), string2, length2);
+#else
+ memcpy (s, string1, length1);
+ memcpy (s + length1, string2, length2);
+#endif
+ str = s;
+ }
+ else
+ str = string2;
+ else
+ str = string1;
+
+ rval = re_search_stub (bufp, str, len, start, range, stop, regs,
+ ret_len);
+ re_free (s);
+ return rval;
+}
+
+/* The parameters have the same meaning as those of re_search.
+ Additional parameters:
+ If RET_LEN is true the length of the match is returned (re_match style);
+ otherwise the position of the match is returned. */
+
+static regoff_t
+re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length,
+ Idx start, regoff_t range, Idx stop, struct re_registers *regs,
+ bool ret_len)
+{
+ reg_errcode_t result;
+ regmatch_t *pmatch;
+ Idx nregs;
+ regoff_t rval;
+ int eflags = 0;
+ re_dfa_t *dfa = bufp->buffer;
+ Idx last_start = start + range;
+
+ /* Check for out-of-range. */
+ if (__glibc_unlikely (start < 0 || start > length))
+ return -1;
+ if (__glibc_unlikely (length < last_start
+ || (0 <= range && last_start < start)))
+ last_start = length;
+ else if (__glibc_unlikely (last_start < 0
+ || (range < 0 && start <= last_start)))
+ last_start = 0;
+
+ lock_lock (dfa->lock);
+
+ eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
+ eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
+
+ /* Compile fastmap if we haven't yet. */
+ if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate)
+ re_compile_fastmap (bufp);
+
+ if (__glibc_unlikely (bufp->no_sub))
+ regs = NULL;
+
+ /* We need at least 1 register. */
+ if (regs == NULL)
+ nregs = 1;
+ else if (__glibc_unlikely (bufp->regs_allocated == REGS_FIXED
+ && regs->num_regs <= bufp->re_nsub))
+ {
+ nregs = regs->num_regs;
+ if (__glibc_unlikely (nregs < 1))
+ {
+ /* Nothing can be copied to regs. */
+ regs = NULL;
+ nregs = 1;
+ }
+ }
+ else
+ nregs = bufp->re_nsub + 1;
+ pmatch = re_malloc (regmatch_t, nregs);
+ if (__glibc_unlikely (pmatch == NULL))
+ {
+ rval = -2;
+ goto out;
+ }
+
+ result = re_search_internal (bufp, string, length, start, last_start, stop,
+ nregs, pmatch, eflags);
+
+ rval = 0;
+
+ /* I hope we needn't fill their regs with -1's when no match was found. */
+ if (result != REG_NOERROR)
+ rval = result == REG_NOMATCH ? -1 : -2;
+ else if (regs != NULL)
+ {
+ /* If caller wants register contents data back, copy them. */
+ bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
+ bufp->regs_allocated);
+ if (__glibc_unlikely (bufp->regs_allocated == REGS_UNALLOCATED))
+ rval = -2;
+ }
+
+ if (__glibc_likely (rval == 0))
+ {
+ if (ret_len)
+ {
+ DEBUG_ASSERT (pmatch[0].rm_so == start);
+ rval = pmatch[0].rm_eo - start;
+ }
+ else
+ rval = pmatch[0].rm_so;
+ }
+ re_free (pmatch);
+ out:
+ lock_unlock (dfa->lock);
+ return rval;
+}
+
+static unsigned
+re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
+ int regs_allocated)
+{
+ int rval = REGS_REALLOCATE;
+ Idx i;
+ Idx need_regs = nregs + 1;
+ /* We need one extra element beyond 'num_regs' for the '-1' marker GNU code
+ uses. */
+
+ /* Have the register data arrays been allocated? */
+ if (regs_allocated == REGS_UNALLOCATED)
+ { /* No. So allocate them with malloc. */
+ regs->start = re_malloc (regoff_t, need_regs);
+ if (__glibc_unlikely (regs->start == NULL))
+ return REGS_UNALLOCATED;
+ regs->end = re_malloc (regoff_t, need_regs);
+ if (__glibc_unlikely (regs->end == NULL))
+ {
+ re_free (regs->start);
+ return REGS_UNALLOCATED;
+ }
+ regs->num_regs = need_regs;
+ }
+ else if (regs_allocated == REGS_REALLOCATE)
+ { /* Yes. If we need more elements than were already
+ allocated, reallocate them. If we need fewer, just
+ leave it alone. */
+ if (__glibc_unlikely (need_regs > regs->num_regs))
+ {
+ regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
+ regoff_t *new_end;
+ if (__glibc_unlikely (new_start == NULL))
+ return REGS_UNALLOCATED;
+ new_end = re_realloc (regs->end, regoff_t, need_regs);
+ if (__glibc_unlikely (new_end == NULL))
+ {
+ re_free (new_start);
+ return REGS_UNALLOCATED;
+ }
+ regs->start = new_start;
+ regs->end = new_end;
+ regs->num_regs = need_regs;
+ }
+ }
+ else
+ {
+ DEBUG_ASSERT (regs_allocated == REGS_FIXED);
+ /* This function may not be called with REGS_FIXED and nregs too big. */
+ DEBUG_ASSERT (nregs <= regs->num_regs);
+ rval = REGS_FIXED;
+ }
+
+ /* Copy the regs. */
+ for (i = 0; i < nregs; ++i)
+ {
+ regs->start[i] = pmatch[i].rm_so;
+ regs->end[i] = pmatch[i].rm_eo;
+ }
+ for ( ; i < regs->num_regs; ++i)
+ regs->start[i] = regs->end[i] = -1;
+
+ return rval;
+}
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use
+ this memory for recording register information. STARTS and ENDS
+ must be allocated using the malloc library routine, and must each
+ be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ PATTERN_BUFFER will allocate its own register data, without
+ freeing the old data. */
+
+void
+re_set_registers (struct re_pattern_buffer *bufp, struct re_registers *regs,
+ __re_size_t num_regs, regoff_t *starts, regoff_t *ends)
+{
+ if (num_regs)
+ {
+ bufp->regs_allocated = REGS_REALLOCATE;
+ regs->num_regs = num_regs;
+ regs->start = starts;
+ regs->end = ends;
+ }
+ else
+ {
+ bufp->regs_allocated = REGS_UNALLOCATED;
+ regs->num_regs = 0;
+ regs->start = regs->end = NULL;
+ }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library. We don't define
+ them unless specifically requested. */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+int
+# ifdef _LIBC
+weak_function
+# endif
+re_exec (const char *s)
+{
+ return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
+}
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point. */
+
+/* Searches for a compiled pattern PREG in the string STRING, whose
+ length is LENGTH. NMATCH, PMATCH, and EFLAGS have the same
+ meaning as with regexec. LAST_START is START + RANGE, where
+ START and RANGE have the same meaning as with re_search.
+ Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
+ otherwise return the error code.
+ Note: We assume front end functions already check ranges.
+ (0 <= LAST_START && LAST_START <= LENGTH) */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_search_internal (const regex_t *preg, const char *string, Idx length,
+ Idx start, Idx last_start, Idx stop, size_t nmatch,
+ regmatch_t pmatch[], int eflags)
+{
+ reg_errcode_t err;
+ const re_dfa_t *dfa = preg->buffer;
+ Idx left_lim, right_lim;
+ int incr;
+ bool fl_longest_match;
+ int match_kind;
+ Idx match_first;
+ Idx match_last = -1;
+ Idx extra_nmatch;
+ bool sb;
+ int ch;
+ re_match_context_t mctx = { .dfa = dfa };
+ char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
+ && start != last_start && !preg->can_be_null)
+ ? preg->fastmap : NULL);
+ RE_TRANSLATE_TYPE t = preg->translate;
+
+ extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
+ nmatch -= extra_nmatch;
+
+ /* Check if the DFA haven't been compiled. */
+ if (__glibc_unlikely (preg->used == 0 || dfa->init_state == NULL
+ || dfa->init_state_word == NULL
+ || dfa->init_state_nl == NULL
+ || dfa->init_state_begbuf == NULL))
+ return REG_NOMATCH;
+
+ /* We assume front-end functions already check them. */
+ DEBUG_ASSERT (0 <= last_start && last_start <= length);
+
+ /* If initial states with non-begbuf contexts have no elements,
+ the regex must be anchored. If preg->newline_anchor is set,
+ we'll never use init_state_nl, so do not check it. */
+ if (dfa->init_state->nodes.nelem == 0
+ && dfa->init_state_word->nodes.nelem == 0
+ && (dfa->init_state_nl->nodes.nelem == 0
+ || !preg->newline_anchor))
+ {
+ if (start != 0 && last_start != 0)
+ return REG_NOMATCH;
+ start = last_start = 0;
+ }
+
+ /* We must check the longest matching, if nmatch > 0. */
+ fl_longest_match = (nmatch != 0 || dfa->nbackref);
+
+ err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1,
+ preg->translate, (preg->syntax & RE_ICASE) != 0,
+ dfa);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ mctx.input.stop = stop;
+ mctx.input.raw_stop = stop;
+ mctx.input.newline_anchor = preg->newline_anchor;
+
+ err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+
+ /* We will log all the DFA states through which the dfa pass,
+ if nmatch > 1, or this dfa has "multibyte node", which is a
+ back-reference or a node which can accept multibyte character or
+ multi character collating element. */
+ if (nmatch > 1 || dfa->has_mb_node)
+ {
+ /* Avoid overflow. */
+ if (__glibc_unlikely ((MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
+ <= mctx.input.bufs_len)))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+
+ mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
+ if (__glibc_unlikely (mctx.state_log == NULL))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ }
+
+ match_first = start;
+ mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+ : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
+
+ /* Check incrementally whether the input string matches. */
+ incr = (last_start < start) ? -1 : 1;
+ left_lim = (last_start < start) ? last_start : start;
+ right_lim = (last_start < start) ? start : last_start;
+ sb = dfa->mb_cur_max == 1;
+ match_kind =
+ (fastmap
+ ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0)
+ | (start <= last_start ? 2 : 0)
+ | (t != NULL ? 1 : 0))
+ : 8);
+
+ for (;; match_first += incr)
+ {
+ err = REG_NOMATCH;
+ if (match_first < left_lim || right_lim < match_first)
+ goto free_return;
+
+ /* Advance as rapidly as possible through the string, until we
+ find a plausible place to start matching. This may be done
+ with varying efficiency, so there are various possibilities:
+ only the most common of them are specialized, in order to
+ save on code size. We use a switch statement for speed. */
+ switch (match_kind)
+ {
+ case 8:
+ /* No fastmap. */
+ break;
+
+ case 7:
+ /* Fastmap with single-byte translation, match forward. */
+ while (__glibc_likely (match_first < right_lim)
+ && !fastmap[t[(unsigned char) string[match_first]]])
+ ++match_first;
+ goto forward_match_found_start_or_reached_end;
+
+ case 6:
+ /* Fastmap without translation, match forward. */
+ while (__glibc_likely (match_first < right_lim)
+ && !fastmap[(unsigned char) string[match_first]])
+ ++match_first;
+
+ forward_match_found_start_or_reached_end:
+ if (__glibc_unlikely (match_first == right_lim))
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (!fastmap[t ? t[ch] : ch])
+ goto free_return;
+ }
+ break;
+
+ case 4:
+ case 5:
+ /* Fastmap without multi-byte translation, match backwards. */
+ while (match_first >= left_lim)
+ {
+ ch = match_first >= length
+ ? 0 : (unsigned char) string[match_first];
+ if (fastmap[t ? t[ch] : ch])
+ break;
+ --match_first;
+ }
+ if (match_first < left_lim)
+ goto free_return;
+ break;
+
+ default:
+ /* In this case, we can't determine easily the current byte,
+ since it might be a component byte of a multibyte
+ character. Then we use the constructed buffer instead. */
+ for (;;)
+ {
+ /* If MATCH_FIRST is out of the valid range, reconstruct the
+ buffers. */
+ __re_size_t offset = match_first - mctx.input.raw_mbs_idx;
+ if (__glibc_unlikely (offset
+ >= (__re_size_t) mctx.input.valid_raw_len))
+ {
+ err = re_string_reconstruct (&mctx.input, match_first,
+ eflags);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+
+ offset = match_first - mctx.input.raw_mbs_idx;
+ }
+ /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+ Note that MATCH_FIRST must not be smaller than 0. */
+ ch = (match_first >= length
+ ? 0 : re_string_byte_at (&mctx.input, offset));
+ if (fastmap[ch])
+ break;
+ match_first += incr;
+ if (match_first < left_lim || match_first > right_lim)
+ {
+ err = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ break;
+ }
+
+ /* Reconstruct the buffers so that the matcher can assume that
+ the matching starts from the beginning of the buffer. */
+ err = re_string_reconstruct (&mctx.input, match_first, eflags);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+
+#ifdef RE_ENABLE_I18N
+ /* Don't consider this char as a possible match start if it part,
+ yet isn't the head, of a multibyte character. */
+ if (!sb && !re_string_first_byte (&mctx.input, 0))
+ continue;
+#endif
+
+ /* It seems to be appropriate one, then use the matcher. */
+ /* We assume that the matching starts from 0. */
+ mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
+ match_last = check_matching (&mctx, fl_longest_match,
+ start <= last_start ? &match_first : NULL);
+ if (match_last != -1)
+ {
+ if (__glibc_unlikely (match_last == -2))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ else
+ {
+ mctx.match_last = match_last;
+ if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
+ {
+ re_dfastate_t *pstate = mctx.state_log[match_last];
+ mctx.last_node = check_halt_state_context (&mctx, pstate,
+ match_last);
+ }
+ if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
+ || dfa->nbackref)
+ {
+ err = prune_impossible_nodes (&mctx);
+ if (err == REG_NOERROR)
+ break;
+ if (__glibc_unlikely (err != REG_NOMATCH))
+ goto free_return;
+ match_last = -1;
+ }
+ else
+ break; /* We found a match. */
+ }
+ }
+
+ match_ctx_clean (&mctx);
+ }
+
+ DEBUG_ASSERT (match_last != -1);
+ DEBUG_ASSERT (err == REG_NOERROR);
+
+ /* Set pmatch[] if we need. */
+ if (nmatch > 0)
+ {
+ Idx reg_idx;
+
+ /* Initialize registers. */
+ for (reg_idx = 1; reg_idx < nmatch; ++reg_idx)
+ pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
+
+ /* Set the points where matching start/end. */
+ pmatch[0].rm_so = 0;
+ pmatch[0].rm_eo = mctx.match_last;
+ /* FIXME: This function should fail if mctx.match_last exceeds
+ the maximum possible regoff_t value. We need a new error
+ code REG_OVERFLOW. */
+
+ if (!preg->no_sub && nmatch > 1)
+ {
+ err = set_regs (preg, &mctx, nmatch, pmatch,
+ dfa->has_plural_match && dfa->nbackref > 0);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+
+ /* At last, add the offset to each register, since we slid
+ the buffers so that we could assume that the matching starts
+ from 0. */
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so != -1)
+ {
+#ifdef RE_ENABLE_I18N
+ if (__glibc_unlikely (mctx.input.offsets_needed != 0))
+ {
+ pmatch[reg_idx].rm_so =
+ (pmatch[reg_idx].rm_so == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_so]);
+ pmatch[reg_idx].rm_eo =
+ (pmatch[reg_idx].rm_eo == mctx.input.valid_len
+ ? mctx.input.valid_raw_len
+ : mctx.input.offsets[pmatch[reg_idx].rm_eo]);
+ }
+#else
+ DEBUG_ASSERT (mctx.input.offsets_needed == 0);
+#endif
+ pmatch[reg_idx].rm_so += match_first;
+ pmatch[reg_idx].rm_eo += match_first;
+ }
+ for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx)
+ {
+ pmatch[nmatch + reg_idx].rm_so = -1;
+ pmatch[nmatch + reg_idx].rm_eo = -1;
+ }
+
+ if (dfa->subexp_map)
+ for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
+ if (dfa->subexp_map[reg_idx] != reg_idx)
+ {
+ pmatch[reg_idx + 1].rm_so
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
+ pmatch[reg_idx + 1].rm_eo
+ = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
+ }
+ }
+
+ free_return:
+ re_free (mctx.state_log);
+ if (dfa->nbackref)
+ match_ctx_free (&mctx);
+ re_string_destruct (&mctx.input);
+ return err;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+prune_impossible_nodes (re_match_context_t *mctx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx halt_node, match_last;
+ reg_errcode_t ret;
+ re_dfastate_t **sifted_states;
+ re_dfastate_t **lim_states = NULL;
+ re_sift_context_t sctx;
+ DEBUG_ASSERT (mctx->state_log != NULL);
+ match_last = mctx->match_last;
+ halt_node = mctx->last_node;
+
+ /* Avoid overflow. */
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
+ <= match_last))
+ return REG_ESPACE;
+
+ sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (__glibc_unlikely (sifted_states == NULL))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ if (dfa->nbackref)
+ {
+ lim_states = re_malloc (re_dfastate_t *, match_last + 1);
+ if (__glibc_unlikely (lim_states == NULL))
+ {
+ ret = REG_ESPACE;
+ goto free_return;
+ }
+ while (1)
+ {
+ memset (lim_states, '\0',
+ sizeof (re_dfastate_t *) * (match_last + 1));
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
+ match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ goto free_return;
+ if (sifted_states[0] != NULL || lim_states[0] != NULL)
+ break;
+ do
+ {
+ --match_last;
+ if (match_last < 0)
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ } while (mctx->state_log[match_last] == NULL
+ || !mctx->state_log[match_last]->halt);
+ halt_node = check_halt_state_context (mctx,
+ mctx->state_log[match_last],
+ match_last);
+ }
+ ret = merge_state_array (dfa, sifted_states, lim_states,
+ match_last + 1);
+ re_free (lim_states);
+ lim_states = NULL;
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ goto free_return;
+ }
+ else
+ {
+ sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last);
+ ret = sift_states_backward (mctx, &sctx);
+ re_node_set_free (&sctx.limits);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ goto free_return;
+ if (sifted_states[0] == NULL)
+ {
+ ret = REG_NOMATCH;
+ goto free_return;
+ }
+ }
+ re_free (mctx->state_log);
+ mctx->state_log = sifted_states;
+ sifted_states = NULL;
+ mctx->last_node = halt_node;
+ mctx->match_last = match_last;
+ ret = REG_NOERROR;
+ free_return:
+ re_free (sifted_states);
+ re_free (lim_states);
+ return ret;
+}
+
+/* Acquire an initial state and return it.
+ We must select appropriate initial state depending on the context,
+ since initial states may have constraints like "\<", "^", etc.. */
+
+static inline re_dfastate_t *
+__attribute__ ((always_inline))
+acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
+ Idx idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ if (dfa->init_state->has_constraint)
+ {
+ unsigned int context;
+ context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return dfa->init_state_word;
+ else if (IS_ORDINARY_CONTEXT (context))
+ return dfa->init_state;
+ else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_begbuf;
+ else if (IS_NEWLINE_CONTEXT (context))
+ return dfa->init_state_nl;
+ else if (IS_BEGBUF_CONTEXT (context))
+ {
+ /* It is relatively rare case, then calculate on demand. */
+ return re_acquire_state_context (err, dfa,
+ dfa->init_state->entrance_nodes,
+ context);
+ }
+ else
+ /* Must not happen? */
+ return dfa->init_state;
+ }
+ else
+ return dfa->init_state;
+}
+
+/* Check whether the regular expression match input string INPUT or not,
+ and return the index where the matching end. Return -1 if
+ there is no match, and return -2 in case of an error.
+ FL_LONGEST_MATCH means we want the POSIX longest matching.
+ If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
+ next place where we may want to try matching.
+ Note that the matcher assumes that the matching starts from the current
+ index of the buffer. */
+
+static Idx
+__attribute_warn_unused_result__
+check_matching (re_match_context_t *mctx, bool fl_longest_match,
+ Idx *p_match_first)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx match = 0;
+ Idx match_last = -1;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+ re_dfastate_t *cur_state;
+ bool at_init_state = p_match_first != NULL;
+ Idx next_start_idx = cur_str_idx;
+
+ err = REG_NOERROR;
+ cur_state = acquire_init_state_context (&err, mctx, cur_str_idx);
+ /* An initial state must not be NULL (invalid). */
+ if (__glibc_unlikely (cur_state == NULL))
+ {
+ DEBUG_ASSERT (err == REG_ESPACE);
+ return -2;
+ }
+
+ if (mctx->state_log != NULL)
+ {
+ mctx->state_log[cur_str_idx] = cur_state;
+
+ /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
+ later. E.g. Processing back references. */
+ if (__glibc_unlikely (dfa->nbackref))
+ {
+ at_init_state = false;
+ err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ if (cur_state->has_backref)
+ {
+ err = transit_state_bkref (mctx, &cur_state->nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+ }
+
+ /* If the RE accepts NULL string. */
+ if (__glibc_unlikely (cur_state->halt))
+ {
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state, cur_str_idx))
+ {
+ if (!fl_longest_match)
+ return cur_str_idx;
+ else
+ {
+ match_last = cur_str_idx;
+ match = 1;
+ }
+ }
+ }
+
+ while (!re_string_eoi (&mctx->input))
+ {
+ re_dfastate_t *old_state = cur_state;
+ Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
+
+ if ((__glibc_unlikely (next_char_idx >= mctx->input.bufs_len)
+ && mctx->input.bufs_len < mctx->input.len)
+ || (__glibc_unlikely (next_char_idx >= mctx->input.valid_len)
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ err = extend_buffers (mctx, next_char_idx + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ DEBUG_ASSERT (err == REG_ESPACE);
+ return -2;
+ }
+ }
+
+ cur_state = transit_state (&err, mctx, cur_state);
+ if (mctx->state_log != NULL)
+ cur_state = merge_state_with_log (&err, mctx, cur_state);
+
+ if (cur_state == NULL)
+ {
+ /* Reached the invalid state or an error. Try to recover a valid
+ state using the state log, if available and if we have not
+ already found a valid (even if not the longest) match. */
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return -2;
+
+ if (mctx->state_log == NULL
+ || (match && !fl_longest_match)
+ || (cur_state = find_recover_state (&err, mctx)) == NULL)
+ break;
+ }
+
+ if (__glibc_unlikely (at_init_state))
+ {
+ if (old_state == cur_state)
+ next_start_idx = next_char_idx;
+ else
+ at_init_state = false;
+ }
+
+ if (cur_state->halt)
+ {
+ /* Reached a halt state.
+ Check the halt state can satisfy the current context. */
+ if (!cur_state->has_constraint
+ || check_halt_state_context (mctx, cur_state,
+ re_string_cur_idx (&mctx->input)))
+ {
+ /* We found an appropriate halt state. */
+ match_last = re_string_cur_idx (&mctx->input);
+ match = 1;
+
+ /* We found a match, do not modify match_first below. */
+ p_match_first = NULL;
+ if (!fl_longest_match)
+ break;
+ }
+ }
+ }
+
+ if (p_match_first)
+ *p_match_first += next_start_idx;
+
+ return match_last;
+}
+
+/* Check NODE match the current context. */
+
+static bool
+check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context)
+{
+ re_token_type_t type = dfa->nodes[node].type;
+ unsigned int constraint = dfa->nodes[node].constraint;
+ if (type != END_OF_RE)
+ return false;
+ if (!constraint)
+ return true;
+ if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
+ return false;
+ return true;
+}
+
+/* Check the halt state STATE match the current context.
+ Return 0 if not match, if the node, STATE has, is a halt node and
+ match the context, return the node. */
+
+static Idx
+check_halt_state_context (const re_match_context_t *mctx,
+ const re_dfastate_t *state, Idx idx)
+{
+ Idx i;
+ unsigned int context;
+ DEBUG_ASSERT (state->halt);
+ context = re_string_context_at (&mctx->input, idx, mctx->eflags);
+ for (i = 0; i < state->nodes.nelem; ++i)
+ if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context))
+ return state->nodes.elems[i];
+ return 0;
+}
+
+/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
+ corresponding to the DFA).
+ Return the destination node, and update EPS_VIA_NODES;
+ return -1 in case of errors. */
+
+static Idx
+proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs,
+ Idx *pidx, Idx node, re_node_set *eps_via_nodes,
+ struct re_fail_stack_t *fs)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx i;
+ bool ok;
+ if (IS_EPSILON_NODE (dfa->nodes[node].type))
+ {
+ re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
+ re_node_set *edests = &dfa->edests[node];
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (__glibc_unlikely (! ok))
+ return -2;
+ /* Pick up a valid destination, or return -1 if none
+ is found. */
+ for (dest_node = -1, i = 0; i < edests->nelem; ++i)
+ {
+ Idx candidate = edests->elems[i];
+ if (!re_node_set_contains (cur_nodes, candidate))
+ continue;
+ if (dest_node == -1)
+ dest_node = candidate;
+
+ else
+ {
+ /* In order to avoid infinite loop like "(a*)*", return the second
+ epsilon-transition if the first was already considered. */
+ if (re_node_set_contains (eps_via_nodes, dest_node))
+ return candidate;
+
+ /* Otherwise, push the second epsilon-transition on the fail stack. */
+ else if (fs != NULL
+ && push_fail_stack (fs, *pidx, candidate, nregs, regs,
+ eps_via_nodes))
+ return -2;
+
+ /* We know we are going to exit. */
+ break;
+ }
+ }
+ return dest_node;
+ }
+ else
+ {
+ Idx naccepted = 0;
+ re_token_type_t type = dfa->nodes[node].type;
+
+#ifdef RE_ENABLE_I18N
+ if (dfa->nodes[node].accept_mb)
+ naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx);
+ else
+#endif /* RE_ENABLE_I18N */
+ if (type == OP_BACK_REF)
+ {
+ Idx subexp_idx = dfa->nodes[node].opr.idx + 1;
+ if (subexp_idx < nregs)
+ naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+ if (fs != NULL)
+ {
+ if (subexp_idx >= nregs
+ || regs[subexp_idx].rm_so == -1
+ || regs[subexp_idx].rm_eo == -1)
+ return -1;
+ else if (naccepted)
+ {
+ char *buf = (char *) re_string_get_buffer (&mctx->input);
+ if (mctx->input.valid_len - *pidx < naccepted
+ || (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+ naccepted)
+ != 0))
+ return -1;
+ }
+ }
+
+ if (naccepted == 0)
+ {
+ Idx dest_node;
+ ok = re_node_set_insert (eps_via_nodes, node);
+ if (__glibc_unlikely (! ok))
+ return -2;
+ dest_node = dfa->edests[node].elems[0];
+ if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node))
+ return dest_node;
+ }
+ }
+
+ if (naccepted != 0
+ || check_node_accept (mctx, dfa->nodes + node, *pidx))
+ {
+ Idx dest_node = dfa->nexts[node];
+ *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
+ if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
+ || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+ dest_node)))
+ return -1;
+ re_node_set_empty (eps_via_nodes);
+ return dest_node;
+ }
+ }
+ return -1;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
+ Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ reg_errcode_t err;
+ Idx num = fs->num++;
+ if (fs->num == fs->alloc)
+ {
+ struct re_fail_stack_ent_t *new_array;
+ new_array = re_realloc (fs->stack, struct re_fail_stack_ent_t,
+ fs->alloc * 2);
+ if (new_array == NULL)
+ return REG_ESPACE;
+ fs->alloc *= 2;
+ fs->stack = new_array;
+ }
+ fs->stack[num].idx = str_idx;
+ fs->stack[num].node = dest_node;
+ fs->stack[num].regs = re_malloc (regmatch_t, nregs);
+ if (fs->stack[num].regs == NULL)
+ return REG_ESPACE;
+ memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
+ err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
+ return err;
+}
+
+static Idx
+pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs,
+ regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+ Idx num = --fs->num;
+ DEBUG_ASSERT (num >= 0);
+ *pidx = fs->stack[num].idx;
+ memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
+ re_node_set_free (eps_via_nodes);
+ re_free (fs->stack[num].regs);
+ *eps_via_nodes = fs->stack[num].eps_via_nodes;
+ return fs->stack[num].node;
+}
+
+/* Set the positions where the subexpressions are starts/ends to registers
+ PMATCH.
+ Note: We assume that pmatch[0] is already set, and
+ pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
+ regmatch_t *pmatch, bool fl_backtrack)
+{
+ const re_dfa_t *dfa = preg->buffer;
+ Idx idx, cur_node;
+ re_node_set eps_via_nodes;
+ struct re_fail_stack_t *fs;
+ struct re_fail_stack_t fs_body = { 0, 2, NULL };
+ regmatch_t *prev_idx_match;
+ bool prev_idx_match_malloced = false;
+
+ DEBUG_ASSERT (nmatch > 1);
+ DEBUG_ASSERT (mctx->state_log != NULL);
+ if (fl_backtrack)
+ {
+ fs = &fs_body;
+ fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
+ if (fs->stack == NULL)
+ return REG_ESPACE;
+ }
+ else
+ fs = NULL;
+
+ cur_node = dfa->init_node;
+ re_node_set_init_empty (&eps_via_nodes);
+
+ if (__libc_use_alloca (nmatch * sizeof (regmatch_t)))
+ prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t));
+ else
+ {
+ prev_idx_match = re_malloc (regmatch_t, nmatch);
+ if (prev_idx_match == NULL)
+ {
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ prev_idx_match_malloced = true;
+ }
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+
+ for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
+ {
+ update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch);
+
+ if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
+ {
+ Idx reg_idx;
+ if (fs)
+ {
+ for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+ if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
+ break;
+ if (reg_idx == nmatch)
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+ }
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ }
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOERROR;
+ }
+ }
+
+ /* Proceed to next node. */
+ cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node,
+ &eps_via_nodes, fs);
+
+ if (__glibc_unlikely (cur_node < 0))
+ {
+ if (__glibc_unlikely (cur_node == -2))
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ free_fail_stack_return (fs);
+ return REG_ESPACE;
+ }
+ if (fs)
+ cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+ &eps_via_nodes);
+ else
+ {
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return REG_NOMATCH;
+ }
+ }
+ }
+ re_node_set_free (&eps_via_nodes);
+ if (prev_idx_match_malloced)
+ re_free (prev_idx_match);
+ return free_fail_stack_return (fs);
+}
+
+static reg_errcode_t
+free_fail_stack_return (struct re_fail_stack_t *fs)
+{
+ if (fs)
+ {
+ Idx fs_idx;
+ for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
+ {
+ re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
+ re_free (fs->stack[fs_idx].regs);
+ }
+ re_free (fs->stack);
+ }
+ return REG_NOERROR;
+}
+
+static void
+update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+ regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch)
+{
+ int type = dfa->nodes[cur_node].type;
+ if (type == OP_OPEN_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+
+ /* We are at the first node of this sub expression. */
+ if (reg_num < nmatch)
+ {
+ pmatch[reg_num].rm_so = cur_idx;
+ pmatch[reg_num].rm_eo = -1;
+ }
+ }
+ else if (type == OP_CLOSE_SUBEXP)
+ {
+ Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+ if (reg_num < nmatch)
+ {
+ /* We are at the last node of this sub expression. */
+ if (pmatch[reg_num].rm_so < cur_idx)
+ {
+ pmatch[reg_num].rm_eo = cur_idx;
+ /* This is a non-empty match or we are not inside an optional
+ subexpression. Accept this right away. */
+ memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+ }
+ else
+ {
+ if (dfa->nodes[cur_node].opt_subexp
+ && prev_idx_match[reg_num].rm_so != -1)
+ /* We transited through an empty match for an optional
+ subexpression, like (a?)*, and this is not the subexp's
+ first match. Copy back the old content of the registers
+ so that matches of an inner subexpression are undone as
+ well, like in ((a?))*. */
+ memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch);
+ else
+ /* We completed a subexpression, but it may be part of
+ an optional one, so do not update PREV_IDX_MATCH. */
+ pmatch[reg_num].rm_eo = cur_idx;
+ }
+ }
+ }
+}
+
+/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
+ and sift the nodes in each states according to the following rules.
+ Updated state_log will be wrote to STATE_LOG.
+
+ Rules: We throw away the Node 'a' in the STATE_LOG[STR_IDX] if...
+ 1. When STR_IDX == MATCH_LAST(the last index in the state_log):
+ If 'a' isn't the LAST_NODE and 'a' can't epsilon transit to
+ the LAST_NODE, we throw away the node 'a'.
+ 2. When 0 <= STR_IDX < MATCH_LAST and 'a' accepts
+ string 's' and transit to 'b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
+ away the node 'a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
+ thrown away, we throw away the node 'a'.
+ 3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
+ i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
+ node 'a'.
+ ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
+ we throw away the node 'a'. */
+
+#define STATE_NODE_CONTAINS(state,node) \
+ ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
+
+static reg_errcode_t
+sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
+{
+ reg_errcode_t err;
+ int null_cnt = 0;
+ Idx str_idx = sctx->last_str_idx;
+ re_node_set cur_dest;
+
+ DEBUG_ASSERT (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+
+ /* Build sifted state_log[str_idx]. It has the nodes which can epsilon
+ transit to the last_node and the last_node itself. */
+ err = re_node_set_init_1 (&cur_dest, sctx->last_node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+
+ /* Then check each states in the state_log. */
+ while (str_idx > 0)
+ {
+ /* Update counters. */
+ null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
+ if (null_cnt > mctx->max_mb_elem_len)
+ {
+ memset (sctx->sifted_states, '\0',
+ sizeof (re_dfastate_t *) * str_idx);
+ re_node_set_free (&cur_dest);
+ return REG_NOERROR;
+ }
+ re_node_set_empty (&cur_dest);
+ --str_idx;
+
+ if (mctx->state_log[str_idx])
+ {
+ err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+
+ /* Add all the nodes which satisfy the following conditions:
+ - It can epsilon transit to a node in CUR_DEST.
+ - It is in CUR_SRC.
+ And update state_log. */
+ err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+ err = REG_NOERROR;
+ free_return:
+ re_node_set_free (&cur_dest);
+ return err;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, re_node_set *cur_dest)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes;
+ Idx i;
+
+ /* Then build the next sifted state.
+ We build the next sifted state on 'cur_dest', and update
+ 'sifted_states[str_idx]' with 'cur_dest'.
+ Note:
+ 'cur_dest' is the sifted state from 'state_log[str_idx + 1]'.
+ 'cur_src' points the node_set of the old 'state_log[str_idx]'
+ (with the epsilon nodes pre-filtered out). */
+ for (i = 0; i < cur_src->nelem; i++)
+ {
+ Idx prev_node = cur_src->elems[i];
+ int naccepted = 0;
+ bool ok;
+ DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[prev_node].type));
+
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept "multi byte". */
+ if (dfa->nodes[prev_node].accept_mb)
+ naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
+ str_idx, sctx->last_str_idx);
+#endif /* RE_ENABLE_I18N */
+
+ /* We don't check backreferences here.
+ See update_cur_sifted_state(). */
+ if (!naccepted
+ && check_node_accept (mctx, dfa->nodes + prev_node, str_idx)
+ && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
+ dfa->nexts[prev_node]))
+ naccepted = 1;
+
+ if (naccepted == 0)
+ continue;
+
+ if (sctx->limits.nelem)
+ {
+ Idx to_idx = str_idx + naccepted;
+ if (check_dst_limits (mctx, &sctx->limits,
+ dfa->nexts[prev_node], to_idx,
+ prev_node, str_idx))
+ continue;
+ }
+ ok = re_node_set_insert (cur_dest, prev_node);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+
+ return REG_NOERROR;
+}
+
+/* Helper functions. */
+
+static reg_errcode_t
+clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
+{
+ Idx top = mctx->state_log_top;
+
+ if ((next_state_log_idx >= mctx->input.bufs_len
+ && mctx->input.bufs_len < mctx->input.len)
+ || (next_state_log_idx >= mctx->input.valid_len
+ && mctx->input.valid_len < mctx->input.len))
+ {
+ reg_errcode_t err;
+ err = extend_buffers (mctx, next_state_log_idx + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+
+ if (top < next_state_log_idx)
+ {
+ memset (mctx->state_log + top + 1, '\0',
+ sizeof (re_dfastate_t *) * (next_state_log_idx - top));
+ mctx->state_log_top = next_state_log_idx;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst,
+ re_dfastate_t **src, Idx num)
+{
+ Idx st_idx;
+ reg_errcode_t err;
+ for (st_idx = 0; st_idx < num; ++st_idx)
+ {
+ if (dst[st_idx] == NULL)
+ dst[st_idx] = src[st_idx];
+ else if (src[st_idx] != NULL)
+ {
+ re_node_set merged_set;
+ err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
+ &src[st_idx]->nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+ re_node_set_free (&merged_set);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+update_cur_sifted_state (const re_match_context_t *mctx,
+ re_sift_context_t *sctx, Idx str_idx,
+ re_node_set *dest_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ const re_node_set *candidates;
+ candidates = ((mctx->state_log[str_idx] == NULL) ? NULL
+ : &mctx->state_log[str_idx]->nodes);
+
+ if (dest_nodes->nelem == 0)
+ sctx->sifted_states[str_idx] = NULL;
+ else
+ {
+ if (candidates)
+ {
+ /* At first, add the nodes which can epsilon transit to a node in
+ DEST_NODE. */
+ err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ /* Then, check the limitations in the current sift_context. */
+ if (sctx->limits.nelem)
+ {
+ err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
+ mctx->bkref_ents, str_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+
+ sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+
+ if (candidates && mctx->state_log[str_idx]->has_backref)
+ {
+ err = sift_states_bkref (mctx, sctx, str_idx, candidates);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ reg_errcode_t err = REG_NOERROR;
+ Idx i;
+
+ re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ if (!state->inveclosure.alloc)
+ {
+ err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return REG_ESPACE;
+ for (i = 0; i < dest_nodes->nelem; i++)
+ {
+ err = re_node_set_merge (&state->inveclosure,
+ dfa->inveclosures + dest_nodes->elems[i]);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return REG_ESPACE;
+ }
+ }
+ return re_node_set_add_intersect (dest_nodes, candidates,
+ &state->inveclosure);
+}
+
+static reg_errcode_t
+sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes,
+ const re_node_set *candidates)
+{
+ Idx ecl_idx;
+ reg_errcode_t err;
+ re_node_set *inv_eclosure = dfa->inveclosures + node;
+ re_node_set except_nodes;
+ re_node_set_init_empty (&except_nodes);
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (cur_node == node)
+ continue;
+ if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
+ {
+ Idx edst1 = dfa->edests[cur_node].elems[0];
+ Idx edst2 = ((dfa->edests[cur_node].nelem > 1)
+ ? dfa->edests[cur_node].elems[1] : -1);
+ if ((!re_node_set_contains (inv_eclosure, edst1)
+ && re_node_set_contains (dest_nodes, edst1))
+ || (edst2 > 0
+ && !re_node_set_contains (inv_eclosure, edst2)
+ && re_node_set_contains (dest_nodes, edst2)))
+ {
+ err = re_node_set_add_intersect (&except_nodes, candidates,
+ dfa->inveclosures + cur_node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&except_nodes);
+ return err;
+ }
+ }
+ }
+ }
+ for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+ {
+ Idx cur_node = inv_eclosure->elems[ecl_idx];
+ if (!re_node_set_contains (&except_nodes, cur_node))
+ {
+ Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1;
+ re_node_set_remove_at (dest_nodes, idx);
+ }
+ }
+ re_node_set_free (&except_nodes);
+ return REG_NOERROR;
+}
+
+static bool
+check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits,
+ Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx lim_idx, src_pos, dst_pos;
+
+ Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx);
+ Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx);
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = mctx->bkref_ents + limits->elems[lim_idx];
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+
+ dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, dst_node, dst_idx,
+ dst_bkref_idx);
+ src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+ subexp_idx, src_node, src_idx,
+ src_bkref_idx);
+
+ /* In case of:
+ <src> <dst> ( <subexp> )
+ ( <subexp> ) <src> <dst>
+ ( <subexp1> <src> <subexp2> <dst> <subexp3> ) */
+ if (src_pos == dst_pos)
+ continue; /* This is unrelated limitation. */
+ else
+ return true;
+ }
+ return false;
+}
+
+static int
+check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
+ Idx subexp_idx, Idx from_node, Idx bkref_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ const re_node_set *eclosures = dfa->eclosures + from_node;
+ Idx node_idx;
+
+ /* Else, we are on the boundary: examine the nodes on the epsilon
+ closure. */
+ for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
+ {
+ Idx node = eclosures->elems[node_idx];
+ switch (dfa->nodes[node].type)
+ {
+ case OP_BACK_REF:
+ if (bkref_idx != -1)
+ {
+ struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
+ do
+ {
+ Idx dst;
+ int cpos;
+
+ if (ent->node != node)
+ continue;
+
+ if (subexp_idx < BITSET_WORD_BITS
+ && !(ent->eps_reachable_subexps_map
+ & ((bitset_word_t) 1 << subexp_idx)))
+ continue;
+
+ /* Recurse trying to reach the OP_OPEN_SUBEXP and
+ OP_CLOSE_SUBEXP cases below. But, if the
+ destination node is the same node as the source
+ node, don't recurse because it would cause an
+ infinite loop: a regex that exhibits this behavior
+ is ()\1*\1* */
+ dst = dfa->edests[node].elems[0];
+ if (dst == from_node)
+ {
+ if (boundaries & 1)
+ return -1;
+ else /* if (boundaries & 2) */
+ return 0;
+ }
+
+ cpos =
+ check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ dst, bkref_idx);
+ if (cpos == -1 /* && (boundaries & 1) */)
+ return -1;
+ if (cpos == 0 && (boundaries & 2))
+ return 0;
+
+ if (subexp_idx < BITSET_WORD_BITS)
+ ent->eps_reachable_subexps_map
+ &= ~((bitset_word_t) 1 << subexp_idx);
+ }
+ while (ent++->more);
+ }
+ break;
+
+ case OP_OPEN_SUBEXP:
+ if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx)
+ return -1;
+ break;
+
+ case OP_CLOSE_SUBEXP:
+ if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx)
+ return 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return (boundaries & 2) ? 1 : 0;
+}
+
+static int
+check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit,
+ Idx subexp_idx, Idx from_node, Idx str_idx,
+ Idx bkref_idx)
+{
+ struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
+ int boundaries;
+
+ /* If we are outside the range of the subexpression, return -1 or 1. */
+ if (str_idx < lim->subexp_from)
+ return -1;
+
+ if (lim->subexp_to < str_idx)
+ return 1;
+
+ /* If we are within the subexpression, return 0. */
+ boundaries = (str_idx == lim->subexp_from);
+ boundaries |= (str_idx == lim->subexp_to) << 1;
+ if (boundaries == 0)
+ return 0;
+
+ /* Else, examine epsilon closure. */
+ return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+ from_node, bkref_idx);
+}
+
+/* Check the limitations of sub expressions LIMITS, and remove the nodes
+ which are against limitations from DEST_NODES. */
+
+static reg_errcode_t
+check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
+ const re_node_set *candidates, re_node_set *limits,
+ struct re_backref_cache_entry *bkref_ents, Idx str_idx)
+{
+ reg_errcode_t err;
+ Idx node_idx, lim_idx;
+
+ for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+ {
+ Idx subexp_idx;
+ struct re_backref_cache_entry *ent;
+ ent = bkref_ents + limits->elems[lim_idx];
+
+ if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
+ continue; /* This is unrelated limitation. */
+
+ subexp_idx = dfa->nodes[ent->node].opr.idx;
+ if (ent->subexp_to == str_idx)
+ {
+ Idx ops_node = -1;
+ Idx cls_node = -1;
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_OPEN_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ ops_node = node;
+ else if (type == OP_CLOSE_SUBEXP
+ && subexp_idx == dfa->nodes[node].opr.idx)
+ cls_node = node;
+ }
+
+ /* Check the limitation of the open subexpression. */
+ /* Note that (ent->subexp_to = str_idx != ent->subexp_from). */
+ if (ops_node >= 0)
+ {
+ err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
+ candidates);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+
+ /* Check the limitation of the close subexpression. */
+ if (cls_node >= 0)
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ if (!re_node_set_contains (dfa->inveclosures + node,
+ cls_node)
+ && !re_node_set_contains (dfa->eclosures + node,
+ cls_node))
+ {
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ --node_idx;
+ }
+ }
+ }
+ else /* (ent->subexp_to != str_idx) */
+ {
+ for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+ {
+ Idx node = dest_nodes->elems[node_idx];
+ re_token_type_t type = dfa->nodes[node].type;
+ if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
+ {
+ if (subexp_idx != dfa->nodes[node].opr.idx)
+ continue;
+ /* It is against this limitation.
+ Remove it form the current sifted state. */
+ err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+ candidates);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+ }
+ }
+ return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx str_idx, const re_node_set *candidates)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx node_idx, node;
+ re_sift_context_t local_sctx;
+ Idx first_idx = search_cur_bkref_entry (mctx, str_idx);
+
+ if (first_idx == -1)
+ return REG_NOERROR;
+
+ local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized. */
+
+ for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
+ {
+ Idx enabled_idx;
+ re_token_type_t type;
+ struct re_backref_cache_entry *entry;
+ node = candidates->elems[node_idx];
+ type = dfa->nodes[node].type;
+ /* Avoid infinite loop for the REs like "()\1+". */
+ if (node == sctx->last_node && str_idx == sctx->last_str_idx)
+ continue;
+ if (type != OP_BACK_REF)
+ continue;
+
+ entry = mctx->bkref_ents + first_idx;
+ enabled_idx = first_idx;
+ do
+ {
+ Idx subexp_len;
+ Idx to_idx;
+ Idx dst_node;
+ bool ok;
+ re_dfastate_t *cur_state;
+
+ if (entry->node != node)
+ continue;
+ subexp_len = entry->subexp_to - entry->subexp_from;
+ to_idx = str_idx + subexp_len;
+ dst_node = (subexp_len ? dfa->nexts[node]
+ : dfa->edests[node].elems[0]);
+
+ if (to_idx > sctx->last_str_idx
+ || sctx->sifted_states[to_idx] == NULL
+ || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node)
+ || check_dst_limits (mctx, &sctx->limits, node,
+ str_idx, dst_node, to_idx))
+ continue;
+
+ if (local_sctx.sifted_states == NULL)
+ {
+ local_sctx = *sctx;
+ err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+ local_sctx.last_node = node;
+ local_sctx.last_str_idx = str_idx;
+ ok = re_node_set_insert (&local_sctx.limits, enabled_idx);
+ if (__glibc_unlikely (! ok))
+ {
+ err = REG_ESPACE;
+ goto free_return;
+ }
+ cur_state = local_sctx.sifted_states[str_idx];
+ err = sift_states_backward (mctx, &local_sctx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ if (sctx->limited_states != NULL)
+ {
+ err = merge_state_array (dfa, sctx->limited_states,
+ local_sctx.sifted_states,
+ str_idx + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+ local_sctx.sifted_states[str_idx] = cur_state;
+ re_node_set_remove (&local_sctx.limits, enabled_idx);
+
+ /* mctx->bkref_ents may have changed, reload the pointer. */
+ entry = mctx->bkref_ents + enabled_idx;
+ }
+ while (enabled_idx++, entry++->more);
+ }
+ err = REG_NOERROR;
+ free_return:
+ if (local_sctx.sifted_states != NULL)
+ {
+ re_node_set_free (&local_sctx.limits);
+ }
+
+ return err;
+}
+
+
+#ifdef RE_ENABLE_I18N
+static int
+sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
+ Idx node_idx, Idx str_idx, Idx max_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ int naccepted;
+ /* Check the node can accept "multi byte". */
+ naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
+ if (naccepted > 0 && str_idx + naccepted <= max_str_idx
+ && !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
+ dfa->nexts[node_idx]))
+ /* The node can't accept the "multi byte", or the
+ destination was already thrown away, then the node
+ couldn't accept the current input "multi byte". */
+ naccepted = 0;
+ /* Otherwise, it is sure that the node could accept
+ 'naccepted' bytes input. */
+ return naccepted;
+}
+#endif /* RE_ENABLE_I18N */
+
+
+/* Functions for state transition. */
+
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte, and update STATE_LOG if necessary.
+ If STATE can accept a multibyte char/collating element/back reference
+ update the destination of STATE_LOG. */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+transit_state (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ re_dfastate_t **trtable;
+ unsigned char ch;
+
+#ifdef RE_ENABLE_I18N
+ /* If the current state can accept multibyte. */
+ if (__glibc_unlikely (state->accept_mb))
+ {
+ *err = transit_state_mb (mctx, state);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+ }
+#endif /* RE_ENABLE_I18N */
+
+ /* Then decide the next state with the single byte. */
+#if 0
+ if (0)
+ /* don't use transition table */
+ return transit_state_sb (err, mctx, state);
+#endif
+
+ /* Use transition table */
+ ch = re_string_fetch_byte (&mctx->input);
+ for (;;)
+ {
+ trtable = state->trtable;
+ if (__glibc_likely (trtable != NULL))
+ return trtable[ch];
+
+ trtable = state->word_trtable;
+ if (__glibc_likely (trtable != NULL))
+ {
+ unsigned int context;
+ context
+ = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ if (IS_WORD_CONTEXT (context))
+ return trtable[ch + SBC_MAX];
+ else
+ return trtable[ch];
+ }
+
+ if (!build_trtable (mctx->dfa, state))
+ {
+ *err = REG_ESPACE;
+ return NULL;
+ }
+
+ /* Retry, we now have a transition table. */
+ }
+}
+
+/* Update the state_log if we need */
+static re_dfastate_t *
+merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *next_state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx cur_idx = re_string_cur_idx (&mctx->input);
+
+ if (cur_idx > mctx->state_log_top)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ mctx->state_log_top = cur_idx;
+ }
+ else if (mctx->state_log[cur_idx] == 0)
+ {
+ mctx->state_log[cur_idx] = next_state;
+ }
+ else
+ {
+ re_dfastate_t *pstate;
+ unsigned int context;
+ re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
+ /* If (state_log[cur_idx] != 0), it implies that cur_idx is
+ the destination of a multibyte char/collating element/
+ back reference. Then the next state is the union set of
+ these destinations and the results of the transition table. */
+ pstate = mctx->state_log[cur_idx];
+ log_nodes = pstate->entrance_nodes;
+ if (next_state != NULL)
+ {
+ table_nodes = next_state->entrance_nodes;
+ *err = re_node_set_init_union (&next_nodes, table_nodes,
+ log_nodes);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+ }
+ else
+ next_nodes = *log_nodes;
+ /* Note: We already add the nodes of the initial state,
+ then we don't need to add them here. */
+
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input) - 1,
+ mctx->eflags);
+ next_state = mctx->state_log[cur_idx]
+ = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ if (table_nodes != NULL)
+ re_node_set_free (&next_nodes);
+ }
+
+ if (__glibc_unlikely (dfa->nbackref) && next_state != NULL)
+ {
+ /* Check OP_OPEN_SUBEXP in the current state in case that we use them
+ later. We must check them here, since the back references in the
+ next state might use them. */
+ *err = check_subexp_matching_top (mctx, &next_state->nodes,
+ cur_idx);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+
+ /* If the next state has back references. */
+ if (next_state->has_backref)
+ {
+ *err = transit_state_bkref (mctx, &next_state->nodes);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+ next_state = mctx->state_log[cur_idx];
+ }
+ }
+
+ return next_state;
+}
+
+/* Skip bytes in the input that correspond to part of a
+ multi-byte match, then look in the log for a state
+ from which to restart matching. */
+static re_dfastate_t *
+find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
+{
+ re_dfastate_t *cur_state;
+ do
+ {
+ Idx max = mctx->state_log_top;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ do
+ {
+ if (++cur_str_idx > max)
+ return NULL;
+ re_string_skip_bytes (&mctx->input, 1);
+ }
+ while (mctx->state_log[cur_str_idx] == NULL);
+
+ cur_state = merge_state_with_log (err, mctx, NULL);
+ }
+ while (*err == REG_NOERROR && cur_state == NULL);
+ return cur_state;
+}
+
+/* Helper functions for transit_state. */
+
+/* From the node set CUR_NODES, pick up the nodes whose types are
+ OP_OPEN_SUBEXP and which have corresponding back references in the regular
+ expression. And register them to use them later for evaluating the
+ corresponding back references. */
+
+static reg_errcode_t
+check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx node_idx;
+ reg_errcode_t err;
+
+ /* TODO: This isn't efficient.
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+ for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
+ {
+ Idx node = cur_nodes->elems[node_idx];
+ if (dfa->nodes[node].type == OP_OPEN_SUBEXP
+ && dfa->nodes[node].opr.idx < BITSET_WORD_BITS
+ && (dfa->used_bkref_map
+ & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx)))
+ {
+ err = match_ctx_add_subtop (mctx, node, str_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+#if 0
+/* Return the next state to which the current state STATE will transit by
+ accepting the current input byte. */
+
+static re_dfastate_t *
+transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
+ re_dfastate_t *state)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ re_node_set next_nodes;
+ re_dfastate_t *next_state;
+ Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
+ unsigned int context;
+
+ *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ return NULL;
+ for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
+ {
+ Idx cur_node = state->nodes.elems[node_cnt];
+ if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
+ {
+ *err = re_node_set_merge (&next_nodes,
+ dfa->eclosures + dfa->nexts[cur_node]);
+ if (__glibc_unlikely (*err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return NULL;
+ }
+ }
+ }
+ context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
+ next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
+ /* We don't need to check errors here, since the return value of
+ this function is next_state and ERR is already set. */
+
+ re_node_set_free (&next_nodes);
+ re_string_skip_bytes (&mctx->input, 1);
+ return next_state;
+}
+#endif
+
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t
+transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+
+ for (i = 0; i < pstate->nodes.nelem; ++i)
+ {
+ re_node_set dest_nodes, *new_nodes;
+ Idx cur_node_idx = pstate->nodes.elems[i];
+ int naccepted;
+ Idx dest_idx;
+ unsigned int context;
+ re_dfastate_t *dest_state;
+
+ if (!dfa->nodes[cur_node_idx].accept_mb)
+ continue;
+
+ if (dfa->nodes[cur_node_idx].constraint)
+ {
+ context = re_string_context_at (&mctx->input,
+ re_string_cur_idx (&mctx->input),
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
+ context))
+ continue;
+ }
+
+ /* How many bytes the node can accept? */
+ naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input,
+ re_string_cur_idx (&mctx->input));
+ if (naccepted == 0)
+ continue;
+
+ /* The node can accepts 'naccepted' bytes. */
+ dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
+ mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
+ : mctx->max_mb_elem_len);
+ err = clean_state_log_if_needed (mctx, dest_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ DEBUG_ASSERT (dfa->nexts[cur_node_idx] != -1);
+ new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx];
+
+ dest_state = mctx->state_log[dest_idx];
+ if (dest_state == NULL)
+ dest_nodes = *new_nodes;
+ else
+ {
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes, new_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ context = re_string_context_at (&mctx->input, dest_idx - 1,
+ mctx->eflags);
+ mctx->state_log[dest_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ if (dest_state != NULL)
+ re_node_set_free (&dest_nodes);
+ if (__glibc_unlikely (mctx->state_log[dest_idx] == NULL
+ && err != REG_NOERROR))
+ return err;
+ }
+ return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx i;
+ Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+ for (i = 0; i < nodes->nelem; ++i)
+ {
+ Idx dest_str_idx, prev_nelem, bkc_idx;
+ Idx node_idx = nodes->elems[i];
+ unsigned int context;
+ const re_token_t *node = dfa->nodes + node_idx;
+ re_node_set *new_dest_nodes;
+
+ /* Check whether 'node' is a backreference or not. */
+ if (node->type != OP_BACK_REF)
+ continue;
+
+ if (node->constraint)
+ {
+ context = re_string_context_at (&mctx->input, cur_str_idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ continue;
+ }
+
+ /* 'node' is a backreference.
+ Check the substring which the substring matched. */
+ bkc_idx = mctx->nbkref_ents;
+ err = get_subexp (mctx, node_idx, cur_str_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+
+ /* And add the epsilon closures (which is 'new_dest_nodes') of
+ the backreference to appropriate state_log. */
+ DEBUG_ASSERT (dfa->nexts[node_idx] != -1);
+ for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
+ {
+ Idx subexp_len;
+ re_dfastate_t *dest_state;
+ struct re_backref_cache_entry *bkref_ent;
+ bkref_ent = mctx->bkref_ents + bkc_idx;
+ if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
+ continue;
+ subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
+ new_dest_nodes = (subexp_len == 0
+ ? dfa->eclosures + dfa->edests[node_idx].elems[0]
+ : dfa->eclosures + dfa->nexts[node_idx]);
+ dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
+ - bkref_ent->subexp_from);
+ context = re_string_context_at (&mctx->input, dest_str_idx - 1,
+ mctx->eflags);
+ dest_state = mctx->state_log[dest_str_idx];
+ prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
+ : mctx->state_log[cur_str_idx]->nodes.nelem);
+ /* Add 'new_dest_node' to state_log. */
+ if (dest_state == NULL)
+ {
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, new_dest_nodes,
+ context);
+ if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR))
+ goto free_return;
+ }
+ else
+ {
+ re_node_set dest_nodes;
+ err = re_node_set_init_union (&dest_nodes,
+ dest_state->entrance_nodes,
+ new_dest_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&dest_nodes);
+ goto free_return;
+ }
+ mctx->state_log[dest_str_idx]
+ = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+ re_node_set_free (&dest_nodes);
+ if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
+ && err != REG_NOERROR))
+ goto free_return;
+ }
+ /* We need to check recursively if the backreference can epsilon
+ transit. */
+ if (subexp_len == 0
+ && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
+ {
+ err = check_subexp_matching_top (mctx, new_dest_nodes,
+ cur_str_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ err = transit_state_bkref (mctx, new_dest_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto free_return;
+ }
+ }
+ }
+ err = REG_NOERROR;
+ free_return:
+ return err;
+}
+
+/* Enumerate all the candidates which the backreference BKREF_NODE can match
+ at BKREF_STR_IDX, and register them by match_ctx_add_entry().
+ Note that we might collect inappropriate candidates here.
+ However, the cost of checking them strictly here is too high, then we
+ delay these checking for prune_impossible_nodes(). */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ Idx subexp_num, sub_top_idx;
+ const char *buf = (const char *) re_string_get_buffer (&mctx->input);
+ /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX. */
+ Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
+ if (cache_idx != -1)
+ {
+ const struct re_backref_cache_entry *entry
+ = mctx->bkref_ents + cache_idx;
+ do
+ if (entry->node == bkref_node)
+ return REG_NOERROR; /* We already checked it. */
+ while (entry++->more);
+ }
+
+ subexp_num = dfa->nodes[bkref_node].opr.idx;
+
+ /* For each sub expression */
+ for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
+ {
+ reg_errcode_t err;
+ re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
+ re_sub_match_last_t *sub_last;
+ Idx sub_last_idx, sl_str, bkref_str_off;
+
+ if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
+ continue; /* It isn't related. */
+
+ sl_str = sub_top->str_idx;
+ bkref_str_off = bkref_str_idx;
+ /* At first, check the last node of sub expressions we already
+ evaluated. */
+ for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
+ {
+ regoff_t sl_str_diff;
+ sub_last = sub_top->lasts[sub_last_idx];
+ sl_str_diff = sub_last->str_idx - sl_str;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_diff > 0)
+ {
+ if (__glibc_unlikely (bkref_str_off + sl_str_diff
+ > mctx->input.valid_len))
+ {
+ /* Not enough chars for a successful match. */
+ if (bkref_str_off + sl_str_diff > mctx->input.len)
+ break;
+
+ err = clean_state_log_if_needed (mctx,
+ bkref_str_off
+ + sl_str_diff);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
+ /* We don't need to search this sub expression any more. */
+ break;
+ }
+ bkref_str_off += sl_str_diff;
+ sl_str += sl_str_diff;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+
+ /* Reload buf, since the preceding call might have reallocated
+ the buffer. */
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+
+ if (err == REG_NOMATCH)
+ continue;
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+
+ if (sub_last_idx < sub_top->nlasts)
+ continue;
+ if (sub_last_idx > 0)
+ ++sl_str;
+ /* Then, search for the other last nodes of the sub expression. */
+ for (; sl_str <= bkref_str_idx; ++sl_str)
+ {
+ Idx cls_node;
+ regoff_t sl_str_off;
+ const re_node_set *nodes;
+ sl_str_off = sl_str - sub_top->str_idx;
+ /* The matched string by the sub expression match with the substring
+ at the back reference? */
+ if (sl_str_off > 0)
+ {
+ if (__glibc_unlikely (bkref_str_off >= mctx->input.valid_len))
+ {
+ /* If we are at the end of the input, we cannot match. */
+ if (bkref_str_off >= mctx->input.len)
+ break;
+
+ err = extend_buffers (mctx, bkref_str_off + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ }
+ if (buf [bkref_str_off++] != buf[sl_str - 1])
+ break; /* We don't need to search this sub expression
+ any more. */
+ }
+ if (mctx->state_log[sl_str] == NULL)
+ continue;
+ /* Does this state have a ')' of the sub expression? */
+ nodes = &mctx->state_log[sl_str]->nodes;
+ cls_node = find_subexp_node (dfa, nodes, subexp_num,
+ OP_CLOSE_SUBEXP);
+ if (cls_node == -1)
+ continue; /* No. */
+ if (sub_top->path == NULL)
+ {
+ sub_top->path = calloc (sizeof (state_array_t),
+ sl_str - sub_top->str_idx + 1);
+ if (sub_top->path == NULL)
+ return REG_ESPACE;
+ }
+ /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
+ in the current context? */
+ err = check_arrival (mctx, sub_top->path, sub_top->node,
+ sub_top->str_idx, cls_node, sl_str,
+ OP_CLOSE_SUBEXP);
+ if (err == REG_NOMATCH)
+ continue;
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
+ if (__glibc_unlikely (sub_last == NULL))
+ return REG_ESPACE;
+ err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+ bkref_str_idx);
+ buf = (const char *) re_string_get_buffer (&mctx->input);
+ if (err == REG_NOMATCH)
+ continue;
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ }
+ return REG_NOERROR;
+}
+
+/* Helper functions for get_subexp(). */
+
+/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
+ If it can arrive, register the sub expression expressed with SUB_TOP
+ and SUB_LAST. */
+
+static reg_errcode_t
+get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top,
+ re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str)
+{
+ reg_errcode_t err;
+ Idx to_idx;
+ /* Can the subexpression arrive the back reference? */
+ err = check_arrival (mctx, &sub_last->path, sub_last->node,
+ sub_last->str_idx, bkref_node, bkref_str,
+ OP_OPEN_SUBEXP);
+ if (err != REG_NOERROR)
+ return err;
+ err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
+ sub_last->str_idx);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
+ return clean_state_log_if_needed (mctx, to_idx);
+}
+
+/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
+ Search '(' if FL_OPEN, or search ')' otherwise.
+ TODO: This function isn't efficient...
+ Because there might be more than one nodes whose types are
+ OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+ nodes.
+ E.g. RE: (a){2} */
+
+static Idx
+find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+ Idx subexp_idx, int type)
+{
+ Idx cls_idx;
+ for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
+ {
+ Idx cls_node = nodes->elems[cls_idx];
+ const re_token_t *node = dfa->nodes + cls_node;
+ if (node->type == type
+ && node->opr.idx == subexp_idx)
+ return cls_node;
+ }
+ return -1;
+}
+
+/* Check whether the node TOP_NODE at TOP_STR can arrive to the node
+ LAST_NODE at LAST_STR. We record the path onto PATH since it will be
+ heavily reused.
+ Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
+ Idx top_str, Idx last_node, Idx last_str, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err = REG_NOERROR;
+ Idx subexp_num, backup_cur_idx, str_idx, null_cnt;
+ re_dfastate_t *cur_state = NULL;
+ re_node_set *cur_nodes, next_nodes;
+ re_dfastate_t **backup_state_log;
+ unsigned int context;
+
+ subexp_num = dfa->nodes[top_node].opr.idx;
+ /* Extend the buffer if we need. */
+ if (__glibc_unlikely (path->alloc < last_str + mctx->max_mb_elem_len + 1))
+ {
+ re_dfastate_t **new_array;
+ Idx old_alloc = path->alloc;
+ Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1;
+ Idx new_alloc;
+ if (__glibc_unlikely (IDX_MAX - old_alloc < incr_alloc))
+ return REG_ESPACE;
+ new_alloc = old_alloc + incr_alloc;
+ if (__glibc_unlikely (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc))
+ return REG_ESPACE;
+ new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
+ if (__glibc_unlikely (new_array == NULL))
+ return REG_ESPACE;
+ path->array = new_array;
+ path->alloc = new_alloc;
+ memset (new_array + old_alloc, '\0',
+ sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
+ }
+
+ str_idx = path->next_idx ? path->next_idx : top_str;
+
+ /* Temporary modify MCTX. */
+ backup_state_log = mctx->state_log;
+ backup_cur_idx = mctx->input.cur_idx;
+ mctx->state_log = path->array;
+ mctx->input.cur_idx = str_idx;
+
+ /* Setup initial node set. */
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ if (str_idx == top_str)
+ {
+ err = re_node_set_init_1 (&next_nodes, top_node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ cur_state = mctx->state_log[str_idx];
+ if (cur_state && cur_state->has_backref)
+ {
+ err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ else
+ re_node_set_init_empty (&next_nodes);
+ }
+ if (str_idx == top_str || (cur_state && cur_state->has_backref))
+ {
+ if (next_nodes.nelem)
+ {
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ }
+
+ for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
+ {
+ re_node_set_empty (&next_nodes);
+ if (mctx->state_log[str_idx + 1])
+ {
+ err = re_node_set_merge (&next_nodes,
+ &mctx->state_log[str_idx + 1]->nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ if (cur_state)
+ {
+ err = check_arrival_add_next_nodes (mctx, str_idx,
+ &cur_state->non_eps_nodes,
+ &next_nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ ++str_idx;
+ if (next_nodes.nelem)
+ {
+ err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+ subexp_num, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ }
+ context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+ cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+ if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
+ {
+ re_node_set_free (&next_nodes);
+ return err;
+ }
+ mctx->state_log[str_idx] = cur_state;
+ null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
+ }
+ re_node_set_free (&next_nodes);
+ cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
+ : &mctx->state_log[last_str]->nodes);
+ path->next_idx = str_idx;
+
+ /* Fix MCTX. */
+ mctx->state_log = backup_state_log;
+ mctx->input.cur_idx = backup_cur_idx;
+
+ /* Then check the current node set has the node LAST_NODE. */
+ if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node))
+ return REG_NOERROR;
+
+ return REG_NOMATCH;
+}
+
+/* Helper functions for check_arrival. */
+
+/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
+ to NEXT_NODES.
+ TODO: This function is similar to the functions transit_state*(),
+ however this function has many additional works.
+ Can't we unify them? */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
+ re_node_set *cur_nodes, re_node_set *next_nodes)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ bool ok;
+ Idx cur_idx;
+#ifdef RE_ENABLE_I18N
+ reg_errcode_t err = REG_NOERROR;
+#endif
+ re_node_set union_set;
+ re_node_set_init_empty (&union_set);
+ for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
+ {
+ int naccepted = 0;
+ Idx cur_node = cur_nodes->elems[cur_idx];
+ DEBUG_ASSERT (!IS_EPSILON_NODE (dfa->nodes[cur_node].type));
+
+#ifdef RE_ENABLE_I18N
+ /* If the node may accept "multi byte". */
+ if (dfa->nodes[cur_node].accept_mb)
+ {
+ naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
+ str_idx);
+ if (naccepted > 1)
+ {
+ re_dfastate_t *dest_state;
+ Idx next_node = dfa->nexts[cur_node];
+ Idx next_idx = str_idx + naccepted;
+ dest_state = mctx->state_log[next_idx];
+ re_node_set_empty (&union_set);
+ if (dest_state)
+ {
+ err = re_node_set_merge (&union_set, &dest_state->nodes);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ ok = re_node_set_insert (&union_set, next_node);
+ if (__glibc_unlikely (! ok))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
+ &union_set);
+ if (__glibc_unlikely (mctx->state_log[next_idx] == NULL
+ && err != REG_NOERROR))
+ {
+ re_node_set_free (&union_set);
+ return err;
+ }
+ }
+ }
+#endif /* RE_ENABLE_I18N */
+ if (naccepted
+ || check_node_accept (mctx, dfa->nodes + cur_node, str_idx))
+ {
+ ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
+ if (__glibc_unlikely (! ok))
+ {
+ re_node_set_free (&union_set);
+ return REG_ESPACE;
+ }
+ }
+ }
+ re_node_set_free (&union_set);
+ return REG_NOERROR;
+}
+
+/* For all the nodes in CUR_NODES, add the epsilon closures of them to
+ CUR_NODES, however exclude the nodes which are:
+ - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
+ - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
+*/
+
+static reg_errcode_t
+check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
+ Idx ex_subexp, int type)
+{
+ reg_errcode_t err;
+ Idx idx, outside_node;
+ re_node_set new_nodes;
+ DEBUG_ASSERT (cur_nodes->nelem);
+ err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ /* Create a new node set NEW_NODES with the nodes which are epsilon
+ closures of the node in CUR_NODES. */
+
+ for (idx = 0; idx < cur_nodes->nelem; ++idx)
+ {
+ Idx cur_node = cur_nodes->elems[idx];
+ const re_node_set *eclosure = dfa->eclosures + cur_node;
+ outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type);
+ if (outside_node == -1)
+ {
+ /* There are no problematic nodes, just merge them. */
+ err = re_node_set_merge (&new_nodes, eclosure);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ else
+ {
+ /* There are problematic nodes, re-calculate incrementally. */
+ err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
+ ex_subexp, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ {
+ re_node_set_free (&new_nodes);
+ return err;
+ }
+ }
+ }
+ re_node_set_free (cur_nodes);
+ *cur_nodes = new_nodes;
+ return REG_NOERROR;
+}
+
+/* Helper function for check_arrival_expand_ecl.
+ Check incrementally the epsilon closure of TARGET, and if it isn't
+ problematic append it to DST_NODES. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
+ Idx target, Idx ex_subexp, int type)
+{
+ Idx cur_node;
+ for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
+ {
+ bool ok;
+
+ if (dfa->nodes[cur_node].type == type
+ && dfa->nodes[cur_node].opr.idx == ex_subexp)
+ {
+ if (type == OP_CLOSE_SUBEXP)
+ {
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ }
+ break;
+ }
+ ok = re_node_set_insert (dst_nodes, cur_node);
+ if (__glibc_unlikely (! ok))
+ return REG_ESPACE;
+ if (dfa->edests[cur_node].nelem == 0)
+ break;
+ if (dfa->edests[cur_node].nelem == 2)
+ {
+ reg_errcode_t err;
+ err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
+ dfa->edests[cur_node].elems[1],
+ ex_subexp, type);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ cur_node = dfa->edests[cur_node].elems[0];
+ }
+ return REG_NOERROR;
+}
+
+
+/* For all the back references in the current state, calculate the
+ destination of the back references by the appropriate entry
+ in MCTX->BKREF_ENTS. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
+ Idx cur_str, Idx subexp_num, int type)
+{
+ const re_dfa_t *const dfa = mctx->dfa;
+ reg_errcode_t err;
+ Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
+ struct re_backref_cache_entry *ent;
+
+ if (cache_idx_start == -1)
+ return REG_NOERROR;
+
+ restart:
+ ent = mctx->bkref_ents + cache_idx_start;
+ do
+ {
+ Idx to_idx, next_node;
+
+ /* Is this entry ENT is appropriate? */
+ if (!re_node_set_contains (cur_nodes, ent->node))
+ continue; /* No. */
+
+ to_idx = cur_str + ent->subexp_to - ent->subexp_from;
+ /* Calculate the destination of the back reference, and append it
+ to MCTX->STATE_LOG. */
+ if (to_idx == cur_str)
+ {
+ /* The backreference did epsilon transit, we must re-check all the
+ node in the current state. */
+ re_node_set new_dests;
+ reg_errcode_t err2, err3;
+ next_node = dfa->edests[ent->node].elems[0];
+ if (re_node_set_contains (cur_nodes, next_node))
+ continue;
+ err = re_node_set_init_1 (&new_dests, next_node);
+ err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type);
+ err3 = re_node_set_merge (cur_nodes, &new_dests);
+ re_node_set_free (&new_dests);
+ if (__glibc_unlikely (err != REG_NOERROR || err2 != REG_NOERROR
+ || err3 != REG_NOERROR))
+ {
+ err = (err != REG_NOERROR ? err
+ : (err2 != REG_NOERROR ? err2 : err3));
+ return err;
+ }
+ /* TODO: It is still inefficient... */
+ goto restart;
+ }
+ else
+ {
+ re_node_set union_set;
+ next_node = dfa->nexts[ent->node];
+ if (mctx->state_log[to_idx])
+ {
+ bool ok;
+ if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
+ next_node))
+ continue;
+ err = re_node_set_init_copy (&union_set,
+ &mctx->state_log[to_idx]->nodes);
+ ok = re_node_set_insert (&union_set, next_node);
+ if (__glibc_unlikely (err != REG_NOERROR || ! ok))
+ {
+ re_node_set_free (&union_set);
+ err = err != REG_NOERROR ? err : REG_ESPACE;
+ return err;
+ }
+ }
+ else
+ {
+ err = re_node_set_init_1 (&union_set, next_node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ return err;
+ }
+ mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
+ re_node_set_free (&union_set);
+ if (__glibc_unlikely (mctx->state_log[to_idx] == NULL
+ && err != REG_NOERROR))
+ return err;
+ }
+ }
+ while (ent++->more);
+ return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+ Return true if successful. */
+
+static bool
+build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
+{
+ reg_errcode_t err;
+ Idx i, j;
+ int ch;
+ bool need_word_trtable = false;
+ bitset_word_t elem, mask;
+ bool dests_node_malloced = false;
+ bool dest_states_malloced = false;
+ Idx ndests; /* Number of the destination states from 'state'. */
+ re_dfastate_t **trtable;
+ re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
+ re_node_set follows, *dests_node;
+ bitset_t *dests_ch;
+ bitset_t acceptable;
+
+ struct dests_alloc
+ {
+ re_node_set dests_node[SBC_MAX];
+ bitset_t dests_ch[SBC_MAX];
+ } *dests_alloc;
+
+ /* We build DFA states which corresponds to the destination nodes
+ from 'state'. 'dests_node[i]' represents the nodes which i-th
+ destination state contains, and 'dests_ch[i]' represents the
+ characters which i-th destination state accepts. */
+ if (__libc_use_alloca (sizeof (struct dests_alloc)))
+ dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
+ else
+ {
+ dests_alloc = re_malloc (struct dests_alloc, 1);
+ if (__glibc_unlikely (dests_alloc == NULL))
+ return false;
+ dests_node_malloced = true;
+ }
+ dests_node = dests_alloc->dests_node;
+ dests_ch = dests_alloc->dests_ch;
+
+ /* Initialize transition table. */
+ state->word_trtable = state->trtable = NULL;
+
+ /* At first, group all nodes belonging to 'state' into several
+ destinations. */
+ ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
+ if (__glibc_unlikely (ndests <= 0))
+ {
+ if (dests_node_malloced)
+ re_free (dests_alloc);
+ /* Return false in case of an error, true otherwise. */
+ if (ndests == 0)
+ {
+ state->trtable = (re_dfastate_t **)
+ calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ if (__glibc_unlikely (state->trtable == NULL))
+ return false;
+ return true;
+ }
+ return false;
+ }
+
+ err = re_node_set_alloc (&follows, ndests + 1);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto out_free;
+
+ /* Avoid arithmetic overflow in size calculation. */
+ size_t ndests_max
+ = ((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX)
+ / (3 * sizeof (re_dfastate_t *)));
+ if (__glibc_unlikely (ndests_max < ndests))
+ goto out_free;
+
+ if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX
+ + ndests * 3 * sizeof (re_dfastate_t *)))
+ dest_states = (re_dfastate_t **)
+ alloca (ndests * 3 * sizeof (re_dfastate_t *));
+ else
+ {
+ dest_states = re_malloc (re_dfastate_t *, ndests * 3);
+ if (__glibc_unlikely (dest_states == NULL))
+ {
+out_free:
+ if (dest_states_malloced)
+ re_free (dest_states);
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+ if (dests_node_malloced)
+ re_free (dests_alloc);
+ return false;
+ }
+ dest_states_malloced = true;
+ }
+ dest_states_word = dest_states + ndests;
+ dest_states_nl = dest_states_word + ndests;
+ bitset_empty (acceptable);
+
+ /* Then build the states for all destinations. */
+ for (i = 0; i < ndests; ++i)
+ {
+ Idx next_node;
+ re_node_set_empty (&follows);
+ /* Merge the follows of this destination states. */
+ for (j = 0; j < dests_node[i].nelem; ++j)
+ {
+ next_node = dfa->nexts[dests_node[i].elems[j]];
+ if (next_node != -1)
+ {
+ err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto out_free;
+ }
+ }
+ dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+ if (__glibc_unlikely (dest_states[i] == NULL && err != REG_NOERROR))
+ goto out_free;
+ /* If the new state has context constraint,
+ build appropriate states for these contexts. */
+ if (dest_states[i]->has_constraint)
+ {
+ dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_WORD);
+ if (__glibc_unlikely (dest_states_word[i] == NULL
+ && err != REG_NOERROR))
+ goto out_free;
+
+ if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1)
+ need_word_trtable = true;
+
+ dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
+ CONTEXT_NEWLINE);
+ if (__glibc_unlikely (dest_states_nl[i] == NULL && err != REG_NOERROR))
+ goto out_free;
+ }
+ else
+ {
+ dest_states_word[i] = dest_states[i];
+ dest_states_nl[i] = dest_states[i];
+ }
+ bitset_merge (acceptable, dests_ch[i]);
+ }
+
+ if (!__glibc_unlikely (need_word_trtable))
+ {
+ /* We don't care about whether the following character is a word
+ character, or we are in a single-byte character set so we can
+ discern by looking at the character code: allocate a
+ 256-entry transition table. */
+ trtable = state->trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
+ if (__glibc_unlikely (trtable == NULL))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (__glibc_unlikely (elem & 1))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ if (dfa->word_char[i] & mask)
+ trtable[ch] = dest_states_word[j];
+ else
+ trtable[ch] = dest_states[j];
+ }
+ }
+ else
+ {
+ /* We care about whether the following character is a word
+ character, and we are in a multi-byte character set: discern
+ by looking at the character code: build two 256-entry
+ transition tables, one starting at trtable[0] and one
+ starting at trtable[SBC_MAX]. */
+ trtable = state->word_trtable =
+ (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX);
+ if (__glibc_unlikely (trtable == NULL))
+ goto out_free;
+
+ /* For all characters ch...: */
+ for (i = 0; i < BITSET_WORDS; ++i)
+ for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+ elem;
+ mask <<= 1, elem >>= 1, ++ch)
+ if (__glibc_unlikely (elem & 1))
+ {
+ /* There must be exactly one destination which accepts
+ character ch. See group_nodes_into_DFAstates. */
+ for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+ ;
+
+ /* j-th destination accepts the word character ch. */
+ trtable[ch] = dest_states[j];
+ trtable[ch + SBC_MAX] = dest_states_word[j];
+ }
+ }
+
+ /* new line */
+ if (bitset_contain (acceptable, NEWLINE_CHAR))
+ {
+ /* The current state accepts newline character. */
+ for (j = 0; j < ndests; ++j)
+ if (bitset_contain (dests_ch[j], NEWLINE_CHAR))
+ {
+ /* k-th destination accepts newline character. */
+ trtable[NEWLINE_CHAR] = dest_states_nl[j];
+ if (need_word_trtable)
+ trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j];
+ /* There must be only one destination which accepts
+ newline. See group_nodes_into_DFAstates. */
+ break;
+ }
+ }
+
+ if (dest_states_malloced)
+ re_free (dest_states);
+
+ re_node_set_free (&follows);
+ for (i = 0; i < ndests; ++i)
+ re_node_set_free (dests_node + i);
+
+ if (dests_node_malloced)
+ re_free (dests_alloc);
+
+ return true;
+}
+
+/* Group all nodes belonging to STATE into several destinations.
+ Then for all destinations, set the nodes belonging to the destination
+ to DESTS_NODE[i] and set the characters accepted by the destination
+ to DEST_CH[i]. This function return the number of destinations. */
+
+static Idx
+group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
+ re_node_set *dests_node, bitset_t *dests_ch)
+{
+ reg_errcode_t err;
+ bool ok;
+ Idx i, j, k;
+ Idx ndests; /* Number of the destinations from 'state'. */
+ bitset_t accepts; /* Characters a node can accept. */
+ const re_node_set *cur_nodes = &state->nodes;
+ bitset_empty (accepts);
+ ndests = 0;
+
+ /* For all the nodes belonging to 'state', */
+ for (i = 0; i < cur_nodes->nelem; ++i)
+ {
+ re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
+ re_token_type_t type = node->type;
+ unsigned int constraint = node->constraint;
+
+ /* Enumerate all single byte character this node can accept. */
+ if (type == CHARACTER)
+ bitset_set (accepts, node->opr.c);
+ else if (type == SIMPLE_BRACKET)
+ {
+ bitset_merge (accepts, node->opr.sbcset);
+ }
+ else if (type == OP_PERIOD)
+ {
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ bitset_merge (accepts, dfa->sb_char);
+ else
+#endif
+ bitset_set_all (accepts);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#ifdef RE_ENABLE_I18N
+ else if (type == OP_UTF8_PERIOD)
+ {
+ if (ASCII_CHARS % BITSET_WORD_BITS == 0)
+ memset (accepts, -1, ASCII_CHARS / CHAR_BIT);
+ else
+ bitset_merge (accepts, utf8_sb_map);
+ if (!(dfa->syntax & RE_DOT_NEWLINE))
+ bitset_clear (accepts, '\n');
+ if (dfa->syntax & RE_DOT_NOT_NULL)
+ bitset_clear (accepts, '\0');
+ }
+#endif
+ else
+ continue;
+
+ /* Check the 'accepts' and sift the characters which are not
+ match it the context. */
+ if (constraint)
+ {
+ if (constraint & NEXT_NEWLINE_CONSTRAINT)
+ {
+ bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
+ bitset_empty (accepts);
+ if (accepts_newline)
+ bitset_set (accepts, NEWLINE_CHAR);
+ else
+ continue;
+ }
+ if (constraint & NEXT_ENDBUF_CONSTRAINT)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+
+ if (constraint & NEXT_WORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && !node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ if (constraint & NEXT_NOTWORD_CONSTRAINT)
+ {
+ bitset_word_t any_set = 0;
+ if (type == CHARACTER && node->word_char)
+ {
+ bitset_empty (accepts);
+ continue;
+ }
+#ifdef RE_ENABLE_I18N
+ if (dfa->mb_cur_max > 1)
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
+ else
+#endif
+ for (j = 0; j < BITSET_WORDS; ++j)
+ any_set |= (accepts[j] &= ~dfa->word_char[j]);
+ if (!any_set)
+ continue;
+ }
+ }
+
+ /* Then divide 'accepts' into DFA states, or create a new
+ state. Above, we make sure that accepts is not empty. */
+ for (j = 0; j < ndests; ++j)
+ {
+ bitset_t intersec; /* Intersection sets, see below. */
+ bitset_t remains;
+ /* Flags, see below. */
+ bitset_word_t has_intersec, not_subset, not_consumed;
+
+ /* Optimization, skip if this state doesn't accept the character. */
+ if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
+ continue;
+
+ /* Enumerate the intersection set of this state and 'accepts'. */
+ has_intersec = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
+ /* And skip if the intersection set is empty. */
+ if (!has_intersec)
+ continue;
+
+ /* Then check if this state is a subset of 'accepts'. */
+ not_subset = not_consumed = 0;
+ for (k = 0; k < BITSET_WORDS; ++k)
+ {
+ not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
+ not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
+ }
+
+ /* If this state isn't a subset of 'accepts', create a
+ new group state, which has the 'remains'. */
+ if (not_subset)
+ {
+ bitset_copy (dests_ch[ndests], remains);
+ bitset_copy (dests_ch[j], intersec);
+ err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto error_return;
+ ++ndests;
+ }
+
+ /* Put the position in the current group. */
+ ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+ if (__glibc_unlikely (! ok))
+ goto error_return;
+
+ /* If all characters are consumed, go to next node. */
+ if (!not_consumed)
+ break;
+ }
+ /* Some characters remain, create a new group. */
+ if (j == ndests)
+ {
+ bitset_copy (dests_ch[ndests], accepts);
+ err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
+ if (__glibc_unlikely (err != REG_NOERROR))
+ goto error_return;
+ ++ndests;
+ bitset_empty (accepts);
+ }
+ }
+ assume (ndests <= SBC_MAX);
+ return ndests;
+ error_return:
+ for (j = 0; j < ndests; ++j)
+ re_node_set_free (dests_node + j);
+ return -1;
+}
+
+#ifdef RE_ENABLE_I18N
+/* Check how many bytes the node 'dfa->nodes[node_idx]' accepts.
+ Return the number of the bytes the node accepts.
+ STR_IDX is the current index of the input string.
+
+ This function handles the nodes which can accept one character, or
+ one collating element like '.', '[a-z]', opposite to the other nodes
+ can only accept one byte. */
+
+# ifdef _LIBC
+# include <locale/weight.h>
+# endif
+
+static int
+check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+ const re_string_t *input, Idx str_idx)
+{
+ const re_token_t *node = dfa->nodes + node_idx;
+ int char_len, elem_len;
+ Idx i;
+
+ if (__glibc_unlikely (node->type == OP_UTF8_PERIOD))
+ {
+ unsigned char c = re_string_byte_at (input, str_idx), d;
+ if (__glibc_likely (c < 0xc2))
+ return 0;
+
+ if (str_idx + 2 > input->len)
+ return 0;
+
+ d = re_string_byte_at (input, str_idx + 1);
+ if (c < 0xe0)
+ return (d < 0x80 || d > 0xbf) ? 0 : 2;
+ else if (c < 0xf0)
+ {
+ char_len = 3;
+ if (c == 0xe0 && d < 0xa0)
+ return 0;
+ }
+ else if (c < 0xf8)
+ {
+ char_len = 4;
+ if (c == 0xf0 && d < 0x90)
+ return 0;
+ }
+ else if (c < 0xfc)
+ {
+ char_len = 5;
+ if (c == 0xf8 && d < 0x88)
+ return 0;
+ }
+ else if (c < 0xfe)
+ {
+ char_len = 6;
+ if (c == 0xfc && d < 0x84)
+ return 0;
+ }
+ else
+ return 0;
+
+ if (str_idx + char_len > input->len)
+ return 0;
+
+ for (i = 1; i < char_len; ++i)
+ {
+ d = re_string_byte_at (input, str_idx + i);
+ if (d < 0x80 || d > 0xbf)
+ return 0;
+ }
+ return char_len;
+ }
+
+ char_len = re_string_char_size_at (input, str_idx);
+ if (node->type == OP_PERIOD)
+ {
+ if (char_len <= 1)
+ return 0;
+ /* FIXME: I don't think this if is needed, as both '\n'
+ and '\0' are char_len == 1. */
+ /* '.' accepts any one character except the following two cases. */
+ if ((!(dfa->syntax & RE_DOT_NEWLINE)
+ && re_string_byte_at (input, str_idx) == '\n')
+ || ((dfa->syntax & RE_DOT_NOT_NULL)
+ && re_string_byte_at (input, str_idx) == '\0'))
+ return 0;
+ return char_len;
+ }
+
+ elem_len = re_string_elem_size_at (input, str_idx);
+ if ((elem_len <= 1 && char_len <= 1) || char_len == 0)
+ return 0;
+
+ if (node->type == COMPLEX_BRACKET)
+ {
+ const re_charset_t *cset = node->opr.mbcset;
+# ifdef _LIBC
+ const unsigned char *pin
+ = ((const unsigned char *) re_string_get_buffer (input) + str_idx);
+ Idx j;
+ uint32_t nrules;
+# endif /* _LIBC */
+ int match_len = 0;
+ wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
+ ? re_string_wchar_at (input, str_idx) : 0);
+
+ /* match with multibyte character? */
+ for (i = 0; i < cset->nmbchars; ++i)
+ if (wc == cset->mbchars[i])
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ /* match with character_class? */
+ for (i = 0; i < cset->nchar_classes; ++i)
+ {
+ wctype_t wt = cset->char_classes[i];
+ if (__iswctype (wc, wt))
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+# ifdef _LIBC
+ nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules != 0)
+ {
+ unsigned int in_collseq = 0;
+ const int32_t *table, *indirect;
+ const unsigned char *weights, *extra;
+ const char *collseqwc;
+
+ /* match with collating_symbol? */
+ if (cset->ncoll_syms)
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ for (i = 0; i < cset->ncoll_syms; ++i)
+ {
+ const unsigned char *coll_sym = extra + cset->coll_syms[i];
+ /* Compare the length of input collating element and
+ the length of current collating element. */
+ if (*coll_sym != elem_len)
+ continue;
+ /* Compare each bytes. */
+ for (j = 0; j < *coll_sym; j++)
+ if (pin[j] != coll_sym[1 + j])
+ break;
+ if (j == *coll_sym)
+ {
+ /* Match if every bytes is equal. */
+ match_len = j;
+ goto check_node_accept_bytes_match;
+ }
+ }
+
+ if (cset->nranges)
+ {
+ if (elem_len <= char_len)
+ {
+ collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+ in_collseq = __collseq_table_lookup (collseqwc, wc);
+ }
+ else
+ in_collseq = find_collation_sequence_value (pin, elem_len);
+ }
+ /* match with range expression? */
+ /* FIXME: Implement rational ranges here, too. */
+ for (i = 0; i < cset->nranges; ++i)
+ if (cset->range_starts[i] <= in_collseq
+ && in_collseq <= cset->range_ends[i])
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+
+ /* match with equivalence_class? */
+ if (cset->nequiv_classes)
+ {
+ const unsigned char *cp = pin;
+ table = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+ weights = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+ extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+ indirect = (const int32_t *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+ int32_t idx = findidx (table, indirect, extra, &cp, elem_len);
+ int32_t rule = idx >> 24;
+ idx &= 0xffffff;
+ if (idx > 0)
+ {
+ size_t weight_len = weights[idx];
+ for (i = 0; i < cset->nequiv_classes; ++i)
+ {
+ int32_t equiv_class_idx = cset->equiv_classes[i];
+ int32_t equiv_class_rule = equiv_class_idx >> 24;
+ equiv_class_idx &= 0xffffff;
+ if (weights[equiv_class_idx] == weight_len
+ && equiv_class_rule == rule
+ && memcmp (weights + idx + 1,
+ weights + equiv_class_idx + 1,
+ weight_len) == 0)
+ {
+ match_len = elem_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ }
+ }
+ else
+# endif /* _LIBC */
+ {
+ /* match with range expression? */
+ for (i = 0; i < cset->nranges; ++i)
+ {
+ if (cset->range_starts[i] <= wc && wc <= cset->range_ends[i])
+ {
+ match_len = char_len;
+ goto check_node_accept_bytes_match;
+ }
+ }
+ }
+ check_node_accept_bytes_match:
+ if (!cset->non_match)
+ return match_len;
+ else
+ {
+ if (match_len > 0)
+ return 0;
+ else
+ return (elem_len > char_len) ? elem_len : char_len;
+ }
+ }
+ return 0;
+}
+
+# ifdef _LIBC
+static unsigned int
+find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
+{
+ uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+ if (nrules == 0)
+ {
+ if (mbs_len == 1)
+ {
+ /* No valid character. Match it as a single byte character. */
+ const unsigned char *collseq = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+ return collseq[mbs[0]];
+ }
+ return UINT_MAX;
+ }
+ else
+ {
+ int32_t idx;
+ const unsigned char *extra = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+ int32_t extrasize = (const unsigned char *)
+ _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra;
+
+ for (idx = 0; idx < extrasize;)
+ {
+ int mbs_cnt;
+ bool found = false;
+ int32_t elem_mbs_len;
+ /* Skip the name of collating element name. */
+ idx = idx + extra[idx] + 1;
+ elem_mbs_len = extra[idx++];
+ if (mbs_len == elem_mbs_len)
+ {
+ for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
+ if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
+ break;
+ if (mbs_cnt == elem_mbs_len)
+ /* Found the entry. */
+ found = true;
+ }
+ /* Skip the byte sequence of the collating element. */
+ idx += elem_mbs_len;
+ /* Adjust for the alignment. */
+ idx = (idx + 3) & ~3;
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ /* Skip the wide char sequence of the collating element. */
+ idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1);
+ /* If we found the entry, return the sequence value. */
+ if (found)
+ return *(uint32_t *) (extra + idx);
+ /* Skip the collation sequence value. */
+ idx += sizeof (uint32_t);
+ }
+ return UINT_MAX;
+ }
+}
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+
+/* Check whether the node accepts the byte which is IDX-th
+ byte of the INPUT. */
+
+static bool
+check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
+ Idx idx)
+{
+ unsigned char ch;
+ ch = re_string_byte_at (&mctx->input, idx);
+ switch (node->type)
+ {
+ case CHARACTER:
+ if (node->opr.c != ch)
+ return false;
+ break;
+
+ case SIMPLE_BRACKET:
+ if (!bitset_contain (node->opr.sbcset, ch))
+ return false;
+ break;
+
+#ifdef RE_ENABLE_I18N
+ case OP_UTF8_PERIOD:
+ if (ch >= ASCII_CHARS)
+ return false;
+ FALLTHROUGH;
+#endif
+ case OP_PERIOD:
+ if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE))
+ || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL)))
+ return false;
+ break;
+
+ default:
+ return false;
+ }
+
+ if (node->constraint)
+ {
+ /* The node has constraints. Check whether the current context
+ satisfies the constraints. */
+ unsigned int context = re_string_context_at (&mctx->input, idx,
+ mctx->eflags);
+ if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+ return false;
+ }
+
+ return true;
+}
+
+/* Extend the buffers, if the buffers have run out. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+extend_buffers (re_match_context_t *mctx, int min_len)
+{
+ reg_errcode_t ret;
+ re_string_t *pstr = &mctx->input;
+
+ /* Avoid overflow. */
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) / 2
+ <= pstr->bufs_len))
+ return REG_ESPACE;
+
+ /* Double the lengths of the buffers, but allocate at least MIN_LEN. */
+ ret = re_string_realloc_buffers (pstr,
+ MAX (min_len,
+ MIN (pstr->len, pstr->bufs_len * 2)));
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+
+ if (mctx->state_log != NULL)
+ {
+ /* And double the length of state_log. */
+ /* XXX We have no indication of the size of this buffer. If this
+ allocation fail we have no indication that the state_log array
+ does not have the right size. */
+ re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *,
+ pstr->bufs_len + 1);
+ if (__glibc_unlikely (new_array == NULL))
+ return REG_ESPACE;
+ mctx->state_log = new_array;
+ }
+
+ /* Then reconstruct the buffers. */
+ if (pstr->icase)
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ {
+ ret = build_wcs_upper_buffer (pstr);
+ if (__glibc_unlikely (ret != REG_NOERROR))
+ return ret;
+ }
+ else
+#endif /* RE_ENABLE_I18N */
+ build_upper_buffer (pstr);
+ }
+ else
+ {
+#ifdef RE_ENABLE_I18N
+ if (pstr->mb_cur_max > 1)
+ build_wcs_buffer (pstr);
+ else
+#endif /* RE_ENABLE_I18N */
+ {
+ if (pstr->trans != NULL)
+ re_string_translate_buffer (pstr);
+ }
+ }
+ return REG_NOERROR;
+}
+
+
+/* Functions for matching context. */
+
+/* Initialize MCTX. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
+{
+ mctx->eflags = eflags;
+ mctx->match_last = -1;
+ if (n > 0)
+ {
+ /* Avoid overflow. */
+ size_t max_object_size =
+ MAX (sizeof (struct re_backref_cache_entry),
+ sizeof (re_sub_match_top_t *));
+ if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < n))
+ return REG_ESPACE;
+
+ mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
+ mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
+ if (__glibc_unlikely (mctx->bkref_ents == NULL || mctx->sub_tops == NULL))
+ return REG_ESPACE;
+ }
+ /* Already zero-ed by the caller.
+ else
+ mctx->bkref_ents = NULL;
+ mctx->nbkref_ents = 0;
+ mctx->nsub_tops = 0; */
+ mctx->abkref_ents = n;
+ mctx->max_mb_elem_len = 1;
+ mctx->asub_tops = n;
+ return REG_NOERROR;
+}
+
+/* Clean the entries which depend on the current input in MCTX.
+ This function must be invoked when the matcher changes the start index
+ of the input, or changes the input string. */
+
+static void
+match_ctx_clean (re_match_context_t *mctx)
+{
+ Idx st_idx;
+ for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
+ {
+ Idx sl_idx;
+ re_sub_match_top_t *top = mctx->sub_tops[st_idx];
+ for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
+ {
+ re_sub_match_last_t *last = top->lasts[sl_idx];
+ re_free (last->path.array);
+ re_free (last);
+ }
+ re_free (top->lasts);
+ if (top->path)
+ {
+ re_free (top->path->array);
+ re_free (top->path);
+ }
+ re_free (top);
+ }
+
+ mctx->nsub_tops = 0;
+ mctx->nbkref_ents = 0;
+}
+
+/* Free all the memory associated with MCTX. */
+
+static void
+match_ctx_free (re_match_context_t *mctx)
+{
+ /* First, free all the memory associated with MCTX->SUB_TOPS. */
+ match_ctx_clean (mctx);
+ re_free (mctx->sub_tops);
+ re_free (mctx->bkref_ents);
+}
+
+/* Add a new backreference entry to MCTX.
+ Note that we assume that caller never call this function with duplicate
+ entry, and call with STR_IDX which isn't smaller than any existing entry.
+*/
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from,
+ Idx to)
+{
+ if (mctx->nbkref_ents >= mctx->abkref_ents)
+ {
+ struct re_backref_cache_entry* new_entry;
+ new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
+ mctx->abkref_ents * 2);
+ if (__glibc_unlikely (new_entry == NULL))
+ {
+ re_free (mctx->bkref_ents);
+ return REG_ESPACE;
+ }
+ mctx->bkref_ents = new_entry;
+ memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
+ sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
+ mctx->abkref_ents *= 2;
+ }
+ if (mctx->nbkref_ents > 0
+ && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx)
+ mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1;
+
+ mctx->bkref_ents[mctx->nbkref_ents].node = node;
+ mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
+ mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
+
+ /* This is a cache that saves negative results of check_dst_limits_calc_pos.
+ If bit N is clear, means that this entry won't epsilon-transition to
+ an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression. If
+ it is set, check_dst_limits_calc_pos_1 will recurse and try to find one
+ such node.
+
+ A backreference does not epsilon-transition unless it is empty, so set
+ to all zeros if FROM != TO. */
+ mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map
+ = (from == to ? -1 : 0);
+
+ mctx->bkref_ents[mctx->nbkref_ents++].more = 0;
+ if (mctx->max_mb_elem_len < to - from)
+ mctx->max_mb_elem_len = to - from;
+ return REG_NOERROR;
+}
+
+/* Return the first entry with the same str_idx, or -1 if none is
+ found. Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX. */
+
+static Idx
+search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+{
+ Idx left, right, mid, last;
+ last = right = mctx->nbkref_ents;
+ for (left = 0; left < right;)
+ {
+ mid = (left + right) / 2;
+ if (mctx->bkref_ents[mid].str_idx < str_idx)
+ left = mid + 1;
+ else
+ right = mid;
+ }
+ if (left < last && mctx->bkref_ents[left].str_idx == str_idx)
+ return left;
+ else
+ return -1;
+}
+
+/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
+ at STR_IDX. */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
+{
+ DEBUG_ASSERT (mctx->sub_tops != NULL);
+ DEBUG_ASSERT (mctx->asub_tops > 0);
+ if (__glibc_unlikely (mctx->nsub_tops == mctx->asub_tops))
+ {
+ Idx new_asub_tops = mctx->asub_tops * 2;
+ re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops,
+ re_sub_match_top_t *,
+ new_asub_tops);
+ if (__glibc_unlikely (new_array == NULL))
+ return REG_ESPACE;
+ mctx->sub_tops = new_array;
+ mctx->asub_tops = new_asub_tops;
+ }
+ mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
+ if (__glibc_unlikely (mctx->sub_tops[mctx->nsub_tops] == NULL))
+ return REG_ESPACE;
+ mctx->sub_tops[mctx->nsub_tops]->node = node;
+ mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
+ return REG_NOERROR;
+}
+
+/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
+ at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP. */
+
+static re_sub_match_last_t *
+match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
+{
+ re_sub_match_last_t *new_entry;
+ if (__glibc_unlikely (subtop->nlasts == subtop->alasts))
+ {
+ Idx new_alasts = 2 * subtop->alasts + 1;
+ re_sub_match_last_t **new_array = re_realloc (subtop->lasts,
+ re_sub_match_last_t *,
+ new_alasts);
+ if (__glibc_unlikely (new_array == NULL))
+ return NULL;
+ subtop->lasts = new_array;
+ subtop->alasts = new_alasts;
+ }
+ new_entry = calloc (1, sizeof (re_sub_match_last_t));
+ if (__glibc_likely (new_entry != NULL))
+ {
+ subtop->lasts[subtop->nlasts] = new_entry;
+ new_entry->node = node;
+ new_entry->str_idx = str_idx;
+ ++subtop->nlasts;
+ }
+ return new_entry;
+}
+
+static void
+sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+ re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx)
+{
+ sctx->sifted_states = sifted_sts;
+ sctx->limited_states = limited_sts;
+ sctx->last_node = last_node;
+ sctx->last_str_idx = last_str_idx;
+ re_node_set_init_empty (&sctx->limits);
+}
diff --git a/lib/rewinddir.c b/lib/rewinddir.c
new file mode 100644
index 0000000..a18943d
--- /dev/null
+++ b/lib/rewinddir.c
@@ -0,0 +1,53 @@
+/* Restart reading the entries of a directory from the beginning.
+ Copyright (C) 2011-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <dirent.h>
+
+#include <errno.h>
+
+#include "dirent-private.h"
+
+/* Don't assume that UNICODE is not defined. */
+#undef FindFirstFile
+#define FindFirstFile FindFirstFileA
+
+void
+rewinddir (DIR *dirp)
+{
+ /* Like in closedir(). */
+ if (dirp->current != INVALID_HANDLE_VALUE)
+ FindClose (dirp->current);
+
+ /* Like in opendir(). */
+ dirp->status = -1;
+ dirp->current = FindFirstFile (dirp->dir_name_mask, &dirp->entry);
+ if (dirp->current == INVALID_HANDLE_VALUE)
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_FILE_NOT_FOUND:
+ dirp->status = -2;
+ break;
+ default:
+ /* Save the error code for the next readdir() call. */
+ dirp->status = ENOENT;
+ break;
+ }
+ }
+}
diff --git a/lib/same-inode.h b/lib/same-inode.h
new file mode 100644
index 0000000..09c339a
--- /dev/null
+++ b/lib/same-inode.h
@@ -0,0 +1,47 @@
+/* Determine whether two stat buffers are known to refer to the same file.
+
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+#ifndef SAME_INODE_H
+# define SAME_INODE_H 1
+
+# include <sys/types.h>
+
+# if defined __VMS && __CRTL_VER < 80200000
+# define SAME_INODE(a, b) \
+ ((a).st_ino[0] == (b).st_ino[0] \
+ && (a).st_ino[1] == (b).st_ino[1] \
+ && (a).st_ino[2] == (b).st_ino[2] \
+ && (a).st_dev == (b).st_dev)
+# elif defined _WIN32 && ! defined __CYGWIN__
+ /* Native Windows. */
+# if _GL_WINDOWS_STAT_INODES
+ /* stat() and fstat() set st_dev and st_ino to 0 if information about
+ the inode is not available. */
+# define SAME_INODE(a, b) \
+ (!((a).st_ino == 0 && (a).st_dev == 0) \
+ && (a).st_ino == (b).st_ino && (a).st_dev == (b).st_dev)
+# else
+ /* stat() and fstat() set st_ino to 0 always. */
+# define SAME_INODE(a, b) 0
+# endif
+# else
+# define SAME_INODE(a, b) \
+ ((a).st_ino == (b).st_ino \
+ && (a).st_dev == (b).st_dev)
+# endif
+
+#endif
diff --git a/lib/save-cwd.c b/lib/save-cwd.c
new file mode 100644
index 0000000..c2608d5
--- /dev/null
+++ b/lib/save-cwd.c
@@ -0,0 +1,97 @@
+/* save-cwd.c -- Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003-2006, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#include <config.h>
+
+#include "save-cwd.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "chdir-long.h"
+#include "unistd--.h"
+
+#if GNULIB_FCNTL_SAFER
+# include "fcntl--.h"
+#else
+# define GNULIB_FCNTL_SAFER 0
+#endif
+
+/* Record the location of the current working directory in CWD so that
+ the program may change to other directories and later use restore_cwd
+ to return to the recorded location. This function may allocate
+ space using malloc (via getcwd) or leave a file descriptor open;
+ use free_cwd to perform the necessary free or close. Upon failure,
+ no memory is allocated, any locally opened file descriptors are
+ closed; return non-zero -- in that case, free_cwd need not be
+ called, but doing so is ok. Otherwise, return zero.
+
+ The _raison d'etre_ for this interface is that the working directory
+ is sometimes inaccessible, and getcwd is not robust or as efficient.
+ So, we prefer to use the open/fchdir approach, but fall back on
+ getcwd if necessary. This module works for most cases with just
+ the getcwd-lgpl module, but to be truly robust, use the getcwd module.
+
+ Some systems lack fchdir altogether: e.g., OS/2, pre-2001 Cygwin,
+ SCO Xenix. Also, SunOS 4 and Irix 5.3 provide the function, yet it
+ doesn't work for partitions on which auditing is enabled. If
+ you're still using an obsolete system with these problems, please
+ send email to the maintainer of this code. */
+
+int
+save_cwd (struct saved_cwd *cwd)
+{
+ cwd->name = NULL;
+
+ cwd->desc = open (".", O_SEARCH | O_CLOEXEC);
+ if (!GNULIB_FCNTL_SAFER)
+ cwd->desc = fd_safer_flag (cwd->desc, O_CLOEXEC);
+ if (cwd->desc < 0)
+ {
+ cwd->name = getcwd (NULL, 0);
+ return cwd->name ? 0 : -1;
+ }
+
+ return 0;
+}
+
+/* Change to recorded location, CWD, in directory hierarchy.
+ Upon failure, return -1 (errno is set by chdir or fchdir).
+ Upon success, return zero. */
+
+int
+restore_cwd (const struct saved_cwd *cwd)
+{
+ if (0 <= cwd->desc)
+ return fchdir (cwd->desc);
+ else
+ return chdir_long (cwd->name);
+}
+
+void
+free_cwd (struct saved_cwd *cwd)
+{
+ if (cwd->desc >= 0)
+ close (cwd->desc);
+ free (cwd->name);
+}
diff --git a/lib/save-cwd.h b/lib/save-cwd.h
new file mode 100644
index 0000000..db8bfd2
--- /dev/null
+++ b/lib/save-cwd.h
@@ -0,0 +1,34 @@
+/* Save and restore current working directory.
+
+ Copyright (C) 1995, 1997-1998, 2003, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef SAVE_CWD_H
+# define SAVE_CWD_H 1
+
+struct saved_cwd
+ {
+ int desc;
+ char *name;
+ };
+
+int save_cwd (struct saved_cwd *cwd);
+int restore_cwd (const struct saved_cwd *cwd);
+void free_cwd (struct saved_cwd *cwd);
+
+#endif /* SAVE_CWD_H */
diff --git a/lib/sched.in.h b/lib/sched.in.h
new file mode 100644
index 0000000..4ee9def
--- /dev/null
+++ b/lib/sched.in.h
@@ -0,0 +1,99 @@
+/* A GNU-like <sched.h>.
+ Copyright (C) 2008-2020 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/>. */
+
+#ifndef _@GUARD_PREFIX@_SCHED_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SCHED_H@
+# if @HAVE_SYS_CDEFS_H@
+# include <sys/cdefs.h>
+# endif
+# @INCLUDE_NEXT@ @NEXT_SCHED_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SCHED_H
+#define _@GUARD_PREFIX@_SCHED_H
+
+/* Get pid_t.
+ This is needed on glibc 2.11 (see
+ glibc bug <https://sourceware.org/bugzilla/show_bug.cgi?id=13198>)
+ and Mac OS X 10.5. */
+#include <sys/types.h>
+
+#ifdef __KLIBC__
+/* On OS/2 kLIBC, struct sched_param is in spawn.h. */
+# include <spawn.h>
+#endif
+
+#ifdef __VMS
+/* On OpenVMS, struct sched_param is in <pthread.h>. */
+# include <pthread.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if !@HAVE_STRUCT_SCHED_PARAM@
+
+# if !GNULIB_defined_struct_sched_param
+struct sched_param
+{
+ int sched_priority;
+};
+# define GNULIB_defined_struct_sched_param 1
+# endif
+
+#endif
+
+#if !(defined SCHED_FIFO && defined SCHED_RR && defined SCHED_OTHER)
+# define SCHED_FIFO 1
+# define SCHED_RR 2
+# define SCHED_OTHER 0
+#endif
+
+#if @GNULIB_SCHED_YIELD@
+# if @REPLACE_SCHED_YIELD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sched_yield
+# define sched_yield rpl_sched_yield
+# endif
+_GL_FUNCDECL_RPL (sched_yield, int, (void));
+_GL_CXXALIAS_RPL (sched_yield, int, (void));
+# else
+# if !@HAVE_SCHED_YIELD@
+_GL_FUNCDECL_SYS (sched_yield, int, (void));
+# endif
+_GL_CXXALIAS_SYS (sched_yield, int, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sched_yield);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sched_yield
+# if HAVE_RAW_DECL_SCHED_YIELD
+_GL_WARN_ON_USE (sched_yield, "sched_yield is not portable - "
+ "use gnulib module sched_yield for portability");
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_SCHED_H */
+#endif /* _@GUARD_PREFIX@_SCHED_H */
diff --git a/lib/scratch_buffer.h b/lib/scratch_buffer.h
new file mode 100644
index 0000000..0b45f92
--- /dev/null
+++ b/lib/scratch_buffer.h
@@ -0,0 +1,29 @@
+/* Variable-sized buffer with on-stack default allocation.
+ Copyright (C) 2017-2020 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/>. */
+
+/* Written by Paul Eggert, 2017. */
+
+#ifndef _GL_SCRATCH_BUFFER_H
+#define _GL_SCRATCH_BUFFER_H
+
+#include <libc-config.h>
+
+#define __libc_scratch_buffer_grow gl_scratch_buffer_grow
+#define __libc_scratch_buffer_grow_preserve gl_scratch_buffer_grow_preserve
+#define __libc_scratch_buffer_set_array_size gl_scratch_buffer_set_array_size
+#include <malloc/scratch_buffer.h>
+
+#endif /* _GL_SCRATCH_BUFFER_H */
diff --git a/lib/secure_getenv.c b/lib/secure_getenv.c
new file mode 100644
index 0000000..d39f682
--- /dev/null
+++ b/lib/secure_getenv.c
@@ -0,0 +1,54 @@
+/* Look up an environment variable, returning NULL in insecure situations.
+
+ Copyright 2013-2020 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/>. */
+
+#include <config.h>
+
+#include <stdlib.h>
+
+#if !HAVE___SECURE_GETENV
+# if HAVE_ISSETUGID || (HAVE_GETUID && HAVE_GETEUID && HAVE_GETGID && HAVE_GETEGID)
+# include <unistd.h>
+# endif
+#endif
+
+char *
+secure_getenv (char const *name)
+{
+#if HAVE___SECURE_GETENV /* glibc */
+ return __secure_getenv (name);
+#elif HAVE_ISSETUGID /* OS X, FreeBSD, NetBSD, OpenBSD */
+ if (issetugid ())
+ return NULL;
+ return getenv (name);
+#elif HAVE_GETUID && HAVE_GETEUID && HAVE_GETGID && HAVE_GETEGID /* other Unix */
+ if (geteuid () != getuid () || getegid () != getgid ())
+ return NULL;
+ return getenv (name);
+#elif defined _WIN32 && ! defined __CYGWIN__ /* native Windows */
+ /* On native Windows, there is no such concept as setuid or setgid binaries.
+ - Programs launched as system services have high privileges, but they don't
+ inherit environment variables from a user.
+ - Programs launched by a user with "Run as Administrator" have high
+ privileges and use the environment variables, but the user has been asked
+ whether he agrees.
+ - Programs launched by a user without "Run as Administrator" cannot gain
+ high privileges, therefore there is no risk. */
+ return getenv (name);
+#else
+ return NULL;
+#endif
+}
diff --git a/lib/select.c b/lib/select.c
new file mode 100644
index 0000000..8ff6014
--- /dev/null
+++ b/lib/select.c
@@ -0,0 +1,597 @@
+/* Emulation for select(2)
+ Contributed by Paolo Bonzini.
+
+ Copyright 2008-2020 Free Software Foundation, Inc.
+
+ This file is part of gnulib.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/select.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows. */
+
+#include <alloca.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <limits.h>
+
+#include <winsock2.h>
+#include <windows.h>
+#include <io.h>
+#include <stdio.h>
+#include <conio.h>
+#include <time.h>
+
+/* Get the overridden 'struct timeval'. */
+#include <sys/time.h>
+
+#if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+#else
+# include <io.h>
+#endif
+
+#undef select
+
+/* Don't assume that UNICODE is not defined. */
+#undef GetModuleHandle
+#define GetModuleHandle GetModuleHandleA
+#undef PeekConsoleInput
+#define PeekConsoleInput PeekConsoleInputA
+#undef CreateEvent
+#define CreateEvent CreateEventA
+#undef PeekMessage
+#define PeekMessage PeekMessageA
+#undef DispatchMessage
+#define DispatchMessage DispatchMessageA
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+#define GetProcAddress \
+ (void *) GetProcAddress
+
+struct bitset {
+ unsigned char in[FD_SETSIZE / CHAR_BIT];
+ unsigned char out[FD_SETSIZE / CHAR_BIT];
+};
+
+/* Declare data structures for ntdll functions. */
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _IO_STATUS_BLOCK
+{
+ union {
+ DWORD Status;
+ PVOID Pointer;
+ } u;
+ ULONG_PTR Information;
+} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
+
+typedef enum _FILE_INFORMATION_CLASS {
+ FilePipeLocalInformation = 24
+} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
+
+typedef DWORD (WINAPI *PNtQueryInformationFile)
+ (HANDLE, IO_STATUS_BLOCK *, VOID *, ULONG, FILE_INFORMATION_CLASS);
+
+#ifndef PIPE_BUF
+#define PIPE_BUF 512
+#endif
+
+static BOOL IsConsoleHandle (HANDLE h)
+{
+ DWORD mode;
+ return GetConsoleMode (h, &mode) != 0;
+}
+
+static BOOL
+IsSocketHandle (HANDLE h)
+{
+ WSANETWORKEVENTS ev;
+
+ if (IsConsoleHandle (h))
+ return FALSE;
+
+ /* Under Wine, it seems that getsockopt returns 0 for pipes too.
+ WSAEnumNetworkEvents instead distinguishes the two correctly. */
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents ((SOCKET) h, NULL, &ev);
+ return ev.lNetworkEvents != 0xDEADBEEF;
+}
+
+/* Compute output fd_sets for libc descriptor FD (whose Windows handle is
+ H). */
+
+static int
+windows_poll_handle (HANDLE h, int fd,
+ struct bitset *rbits,
+ struct bitset *wbits,
+ struct bitset *xbits)
+{
+ BOOL read, write, except;
+ int i, ret;
+ INPUT_RECORD *irbuffer;
+ DWORD avail, nbuffer;
+ BOOL bRet;
+ IO_STATUS_BLOCK iosb;
+ FILE_PIPE_LOCAL_INFORMATION fpli;
+ static PNtQueryInformationFile NtQueryInformationFile;
+ static BOOL once_only;
+
+ read = write = except = FALSE;
+ switch (GetFileType (h))
+ {
+ case FILE_TYPE_DISK:
+ read = TRUE;
+ write = TRUE;
+ break;
+
+ case FILE_TYPE_PIPE:
+ if (!once_only)
+ {
+ NtQueryInformationFile = (PNtQueryInformationFile)
+ GetProcAddress (GetModuleHandle ("ntdll.dll"),
+ "NtQueryInformationFile");
+ once_only = TRUE;
+ }
+
+ if (PeekNamedPipe (h, NULL, 0, NULL, &avail, NULL) != 0)
+ {
+ if (avail)
+ read = TRUE;
+ }
+ else if (GetLastError () == ERROR_BROKEN_PIPE)
+ ;
+
+ else
+ {
+ /* It was the write-end of the pipe. Check if it is writable.
+ If NtQueryInformationFile fails, optimistically assume the pipe is
+ writable. This could happen on Windows 9x, where
+ NtQueryInformationFile is not available, or if we inherit a pipe
+ that doesn't permit FILE_READ_ATTRIBUTES access on the write end
+ (I think this should not happen since Windows XP SP2; WINE seems
+ fine too). Otherwise, ensure that enough space is available for
+ atomic writes. */
+ memset (&iosb, 0, sizeof (iosb));
+ memset (&fpli, 0, sizeof (fpli));
+
+ if (!NtQueryInformationFile
+ || NtQueryInformationFile (h, &iosb, &fpli, sizeof (fpli),
+ FilePipeLocalInformation)
+ || fpli.WriteQuotaAvailable >= PIPE_BUF
+ || (fpli.OutboundQuota < PIPE_BUF &&
+ fpli.WriteQuotaAvailable == fpli.OutboundQuota))
+ write = TRUE;
+ }
+ break;
+
+ case FILE_TYPE_CHAR:
+ write = TRUE;
+ if (!(rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ break;
+
+ ret = WaitForSingleObject (h, 0);
+ if (ret == WAIT_OBJECT_0)
+ {
+ if (!IsConsoleHandle (h))
+ {
+ read = TRUE;
+ break;
+ }
+
+ nbuffer = avail = 0;
+ bRet = GetNumberOfConsoleInputEvents (h, &nbuffer);
+
+ /* Screen buffers handles are filtered earlier. */
+ assert (bRet);
+ if (nbuffer == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ irbuffer = (INPUT_RECORD *) alloca (nbuffer * sizeof (INPUT_RECORD));
+ bRet = PeekConsoleInput (h, irbuffer, nbuffer, &avail);
+ if (!bRet || avail == 0)
+ {
+ except = TRUE;
+ break;
+ }
+
+ for (i = 0; i < avail; i++)
+ if (irbuffer[i].EventType == KEY_EVENT)
+ read = TRUE;
+ }
+ break;
+
+ default:
+ ret = WaitForSingleObject (h, 0);
+ write = TRUE;
+ if (ret == WAIT_OBJECT_0)
+ read = TRUE;
+
+ break;
+ }
+
+ ret = 0;
+ if (read && (rbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ rbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (write && (wbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ wbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ if (except && (xbits->in[fd / CHAR_BIT] & (1 << (fd & (CHAR_BIT - 1)))))
+ {
+ xbits->out[fd / CHAR_BIT] |= (1 << (fd & (CHAR_BIT - 1)));
+ ret++;
+ }
+
+ return ret;
+}
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+#undef timeval
+{
+ static struct timeval tv0;
+ static HANDLE hEvent;
+ HANDLE h, handle_array[FD_SETSIZE + 2];
+ fd_set handle_rfds, handle_wfds, handle_xfds;
+ struct bitset rbits, wbits, xbits;
+ unsigned char anyfds_in[FD_SETSIZE / CHAR_BIT];
+ DWORD ret, wait_timeout, nhandles, nsock, nbuffer;
+ MSG msg;
+ int i, fd, rc;
+ clock_t tend;
+
+ if (nfds > FD_SETSIZE)
+ nfds = FD_SETSIZE;
+
+ if (!timeout)
+ wait_timeout = INFINITE;
+ else
+ {
+ wait_timeout = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
+
+ /* select is also used as a portable usleep. */
+ if (!rfds && !wfds && !xfds)
+ {
+ Sleep (wait_timeout);
+ return 0;
+ }
+ }
+
+ if (!hEvent)
+ hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
+
+ handle_array[0] = hEvent;
+ nhandles = 1;
+ nsock = 0;
+
+ /* Copy descriptors to bitsets. At the same time, eliminate
+ bits in the "wrong" direction for console input buffers
+ and screen buffers, because screen buffers are waitable
+ and they will block until a character is available. */
+ memset (&rbits, 0, sizeof (rbits));
+ memset (&wbits, 0, sizeof (wbits));
+ memset (&xbits, 0, sizeof (xbits));
+ memset (anyfds_in, 0, sizeof (anyfds_in));
+ if (rfds)
+ for (i = 0; i < rfds->fd_count; i++)
+ {
+ fd = rfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && !GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ rbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ rfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (wfds)
+ for (i = 0; i < wfds->fd_count; i++)
+ {
+ fd = wfds->fd_array[i];
+ h = (HANDLE) _get_osfhandle (fd);
+ if (IsConsoleHandle (h)
+ && GetNumberOfConsoleInputEvents (h, &nbuffer))
+ continue;
+
+ wbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ wfds = (fd_set *) alloca (sizeof (fd_set));
+
+ if (xfds)
+ for (i = 0; i < xfds->fd_count; i++)
+ {
+ fd = xfds->fd_array[i];
+ xbits.in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ anyfds_in[fd / CHAR_BIT] |= 1 << (fd & (CHAR_BIT - 1));
+ }
+ else
+ xfds = (fd_set *) alloca (sizeof (fd_set));
+
+ /* Zero all the fd_sets, including the application's. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+ FD_ZERO (&handle_rfds);
+ FD_ZERO (&handle_wfds);
+ FD_ZERO (&handle_xfds);
+
+ /* Classify handles. Create fd sets for sockets, poll the others. */
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (!h)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (IsSocketHandle (h))
+ {
+ int requested = FD_CLOSE;
+
+ /* See above; socket handles are mapped onto select, but we
+ need to map descriptors to handles. */
+ if (rbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_READ | FD_ACCEPT;
+ FD_SET ((SOCKET) h, rfds);
+ FD_SET ((SOCKET) h, &handle_rfds);
+ }
+ if (wbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_WRITE | FD_CONNECT;
+ FD_SET ((SOCKET) h, wfds);
+ FD_SET ((SOCKET) h, &handle_wfds);
+ }
+ if (xbits.in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ {
+ requested |= FD_OOB;
+ FD_SET ((SOCKET) h, xfds);
+ FD_SET ((SOCKET) h, &handle_xfds);
+ }
+
+ WSAEventSelect ((SOCKET) h, hEvent, requested);
+ nsock++;
+ }
+ else
+ {
+ handle_array[nhandles++] = h;
+
+ /* Poll now. If we get an event, do not wait below. */
+ if (wait_timeout != 0
+ && windows_poll_handle (h, i, &rbits, &wbits, &xbits))
+ wait_timeout = 0;
+ }
+ }
+
+ /* Place a sentinel at the end of the array. */
+ handle_array[nhandles] = NULL;
+
+ /* When will the waiting period expire? */
+ if (wait_timeout != INFINITE)
+ tend = clock () + wait_timeout;
+
+restart:
+ if (wait_timeout == 0 || nsock == 0)
+ rc = 0;
+ else
+ {
+ /* See if we need to wait in the loop below. If any select is ready,
+ do MsgWaitForMultipleObjects anyway to dispatch messages, but
+ no need to call select again. */
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+ if (rc == 0)
+ {
+ /* Restore the fd_sets for the other select we do below. */
+ memcpy (&handle_rfds, rfds, sizeof (fd_set));
+ memcpy (&handle_wfds, wfds, sizeof (fd_set));
+ memcpy (&handle_xfds, xfds, sizeof (fd_set));
+ }
+ else
+ wait_timeout = 0;
+ }
+
+ /* How much is left to wait? */
+ if (wait_timeout != INFINITE)
+ {
+ clock_t tnow = clock ();
+ if (tend >= tnow)
+ wait_timeout = tend - tnow;
+ else
+ wait_timeout = 0;
+ }
+
+ for (;;)
+ {
+ ret = MsgWaitForMultipleObjects (nhandles, handle_array, FALSE,
+ wait_timeout, QS_ALLINPUT);
+
+ if (ret == WAIT_OBJECT_0 + nhandles)
+ {
+ /* new input of some other kind */
+ BOOL bRet;
+ while ((bRet = PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) != 0)
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+ }
+ else
+ break;
+ }
+
+ /* If we haven't done it yet, check the status of the sockets. */
+ if (rc == 0 && nsock > 0)
+ rc = select (0, &handle_rfds, &handle_wfds, &handle_xfds, &tv0);
+
+ if (nhandles > 1)
+ {
+ /* Count results that are not counted in the return value of select. */
+ nhandles = 1;
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (h == handle_array[nhandles])
+ {
+ /* Not a socket. */
+ nhandles++;
+ windows_poll_handle (h, i, &rbits, &wbits, &xbits);
+ if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))
+ || wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))
+ || xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ rc++;
+ }
+ }
+
+ if (rc == 0
+ && (wait_timeout == INFINITE
+ /* If NHANDLES > 1, but no bits are set, it means we've
+ been told incorrectly that some handle was signaled.
+ This happens with anonymous pipes, which always cause
+ MsgWaitForMultipleObjects to exit immediately, but no
+ data is found ready to be read by windows_poll_handle.
+ To avoid a total failure (whereby we return zero and
+ don't wait at all), let's poll in a more busy loop. */
+ || (wait_timeout != 0 && nhandles > 1)))
+ {
+ /* Sleep 1 millisecond to avoid busy wait and retry with the
+ original fd_sets. */
+ memcpy (&handle_rfds, rfds, sizeof (fd_set));
+ memcpy (&handle_wfds, wfds, sizeof (fd_set));
+ memcpy (&handle_xfds, xfds, sizeof (fd_set));
+ SleepEx (1, TRUE);
+ goto restart;
+ }
+ if (timeout && wait_timeout == 0 && rc == 0)
+ timeout->tv_sec = timeout->tv_usec = 0;
+ }
+
+ /* Now fill in the results. */
+ FD_ZERO (rfds);
+ FD_ZERO (wfds);
+ FD_ZERO (xfds);
+ nhandles = 1;
+ for (i = 0; i < nfds; i++)
+ {
+ if ((anyfds_in[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1)))) == 0)
+ continue;
+
+ h = (HANDLE) _get_osfhandle (i);
+ if (h != handle_array[nhandles])
+ {
+ /* Perform handle->descriptor mapping. */
+ WSAEventSelect ((SOCKET) h, NULL, 0);
+ if (FD_ISSET (h, &handle_rfds))
+ FD_SET (i, rfds);
+ if (FD_ISSET (h, &handle_wfds))
+ FD_SET (i, wfds);
+ if (FD_ISSET (h, &handle_xfds))
+ FD_SET (i, xfds);
+ }
+ else
+ {
+ /* Not a socket. */
+ nhandles++;
+ if (rbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ FD_SET (i, rfds);
+ if (wbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ FD_SET (i, wfds);
+ if (xbits.out[i / CHAR_BIT] & (1 << (i & (CHAR_BIT - 1))))
+ FD_SET (i, xfds);
+ }
+ }
+
+ return rc;
+}
+
+#else /* ! Native Windows. */
+
+#include <stddef.h> /* NULL */
+#include <errno.h>
+#include <unistd.h>
+
+#undef select
+
+int
+rpl_select (int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
+ struct timeval *timeout)
+{
+ int i;
+
+ /* FreeBSD 8.2 has a bug: it does not always detect invalid fds. */
+ if (nfds < 0 || nfds > FD_SETSIZE)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ for (i = 0; i < nfds; i++)
+ {
+ if (((rfds && FD_ISSET (i, rfds))
+ || (wfds && FD_ISSET (i, wfds))
+ || (xfds && FD_ISSET (i, xfds)))
+ && dup2 (i, i) != i)
+ return -1;
+ }
+
+ /* Interix 3.5 has a bug: it does not support nfds == 0. */
+ if (nfds == 0)
+ {
+ nfds = 1;
+ rfds = NULL;
+ wfds = NULL;
+ xfds = NULL;
+ }
+ return select (nfds, rfds, wfds, xfds, timeout);
+}
+
+#endif
diff --git a/lib/send.c b/lib/send.c
new file mode 100644
index 0000000..a65a806
--- /dev/null
+++ b/lib/send.c
@@ -0,0 +1,49 @@
+/* send.c --- wrappers for Windows send function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef send
+
+ssize_t
+rpl_send (int fd, const void *buf, size_t len, int flags)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ int r = send (sock, buf, len, flags);
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/setlocale-lock.c b/lib/setlocale-lock.c
new file mode 100644
index 0000000..7dde32d
--- /dev/null
+++ b/lib/setlocale-lock.c
@@ -0,0 +1,150 @@
+/* Return the internal lock used by setlocale_null_r.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019. */
+
+#include <config.h>
+
+/* When it is known that the gl_get_setlocale_null_lock function is defined
+ by a dependency library, it should not be defined here. */
+#if OMIT_SETLOCALE_LOCK
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#else
+
+/* This file defines the internal lock used by setlocale_null_r.
+ It is a separate compilation unit, so that only one copy of it is
+ present when linking statically. */
+
+/* Prohibit renaming this symbol. */
+# undef gl_get_setlocale_null_lock
+
+/* Macro for exporting a symbol (function, not variable) defined in this file,
+ when compiled into a shared library. */
+# ifndef DLL_EXPORTED
+# if HAVE_VISIBILITY
+ /* Override the effect of the compiler option '-fvisibility=hidden'. */
+# define DLL_EXPORTED __attribute__((__visibility__("default")))
+# elif defined _WIN32 || defined __CYGWIN__
+# define DLL_EXPORTED __declspec(dllexport)
+# else
+# define DLL_EXPORTED
+# endif
+# endif
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# include "windows-initguard.h"
+
+/* The return type is a 'CRITICAL_SECTION *', not a 'glwthread_mutex_t *',
+ because the latter is not guaranteed to be a stable ABI in the future. */
+
+/* Make sure the function gets exported from DLLs. */
+DLL_EXPORTED CRITICAL_SECTION *gl_get_setlocale_null_lock (void);
+
+static glwthread_initguard_t guard = GLWTHREAD_INITGUARD_INIT;
+static CRITICAL_SECTION lock;
+
+/* Returns the internal lock used by setlocale_null_r. */
+CRITICAL_SECTION *
+gl_get_setlocale_null_lock (void)
+{
+ if (!guard.done)
+ {
+ if (InterlockedIncrement (&guard.started) == 0)
+ {
+ /* This thread is the first one to need the lock. Initialize it. */
+ InitializeCriticalSection (&lock);
+ guard.done = 1;
+ }
+ else
+ {
+ /* Don't let guard.started grow and wrap around. */
+ InterlockedDecrement (&guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this mutex. */
+ while (!guard.done)
+ Sleep (0);
+ }
+ }
+ return &lock;
+}
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED pthread_mutex_t *gl_get_setlocale_null_lock (void);
+
+/* Returns the internal lock used by setlocale_null_r. */
+pthread_mutex_t *
+gl_get_setlocale_null_lock (void)
+{
+ return &mutex;
+}
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+# include <stdlib.h>
+
+static int volatile init_needed = 1;
+static once_flag init_once = ONCE_FLAG_INIT;
+static mtx_t mutex;
+
+static void
+atomic_init (void)
+{
+ if (mtx_init (&mutex, mtx_plain) != thrd_success)
+ abort ();
+ init_needed = 0;
+}
+
+/* Make sure the function gets exported from shared libraries. */
+DLL_EXPORTED mtx_t *gl_get_setlocale_null_lock (void);
+
+/* Returns the internal lock used by setlocale_null_r. */
+mtx_t *
+gl_get_setlocale_null_lock (void)
+{
+ if (init_needed)
+ call_once (&init_once, atomic_init);
+ return &mutex;
+}
+
+# endif
+
+# if (defined _WIN32 || defined __CYGWIN__) && !defined _MSC_VER
+/* Make sure the '__declspec(dllimport)' in setlocale_null.c does not cause
+ a link failure when no DLLs are involved. */
+# if defined _WIN64 || defined _LP64
+# define IMP(x) __imp_##x
+# else
+# define IMP(x) _imp__##x
+# endif
+void * IMP(gl_get_setlocale_null_lock) = &gl_get_setlocale_null_lock;
+# endif
+
+#endif
diff --git a/lib/setlocale_null.c b/lib/setlocale_null.c
new file mode 100644
index 0000000..abe55b5
--- /dev/null
+++ b/lib/setlocale_null.c
@@ -0,0 +1,411 @@
+/* Query the name of the current global locale.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019. */
+
+#include <config.h>
+
+/* Specification. */
+#include "setlocale_null.h"
+
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined _WIN32 && !defined __CYGWIN__
+# include <wchar.h>
+#endif
+
+#if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE)
+# if defined _WIN32 && !defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# elif HAVE_PTHREAD_API
+
+# include <pthread.h>
+# if HAVE_THREADS_H && HAVE_WEAK_SYMBOLS
+# include <threads.h>
+# pragma weak thrd_exit
+# define c11_threads_in_use() (thrd_exit != NULL)
+# else
+# define c11_threads_in_use() 0
+# endif
+
+# elif HAVE_THREADS_H
+
+# include <threads.h>
+
+# endif
+#endif
+
+/* Use the system's setlocale() function, not the gnulib override, here. */
+#undef setlocale
+
+static const char *
+setlocale_null_androidfix (int category)
+{
+ const char *result = setlocale (category, NULL);
+
+#ifdef __ANDROID__
+ if (result == NULL)
+ switch (category)
+ {
+ case LC_CTYPE:
+ case LC_NUMERIC:
+ case LC_TIME:
+ case LC_COLLATE:
+ case LC_MONETARY:
+ case LC_MESSAGES:
+ case LC_ALL:
+ case LC_PAPER:
+ case LC_NAME:
+ case LC_ADDRESS:
+ case LC_TELEPHONE:
+ case LC_MEASUREMENT:
+ result = "C";
+ break;
+ default:
+ break;
+ }
+#endif
+
+ return result;
+}
+
+static int
+setlocale_null_unlocked (int category, char *buf, size_t bufsize)
+{
+#if defined _WIN32 && !defined __CYGWIN__ && defined _MSC_VER
+ /* On native Windows, nowadays, the setlocale() implementation is based
+ on _wsetlocale() and uses malloc() for the result. We are better off
+ using _wsetlocale() directly. */
+ const wchar_t *result = _wsetlocale (category, NULL);
+
+ if (result == NULL)
+ {
+ /* CATEGORY is invalid. */
+ if (bufsize > 0)
+ /* Return an empty string in BUF.
+ This is a convenience for callers that don't want to write explicit
+ code for handling EINVAL. */
+ buf[0] = '\0';
+ return EINVAL;
+ }
+ else
+ {
+ size_t length = wcslen (result);
+ if (length < bufsize)
+ {
+ size_t i;
+
+ /* Convert wchar_t[] -> char[], assuming plain ASCII. */
+ for (i = 0; i <= length; i++)
+ buf[i] = result[i];
+
+ return 0;
+ }
+ else
+ {
+ if (bufsize > 0)
+ {
+ /* Return a truncated result in BUF.
+ This is a convenience for callers that don't want to write
+ explicit code for handling ERANGE. */
+ size_t i;
+
+ /* Convert wchar_t[] -> char[], assuming plain ASCII. */
+ for (i = 0; i < bufsize; i++)
+ buf[i] = result[i];
+ buf[bufsize - 1] = '\0';
+ }
+ return ERANGE;
+ }
+ }
+#else
+ const char *result = setlocale_null_androidfix (category);
+
+ if (result == NULL)
+ {
+ /* CATEGORY is invalid. */
+ if (bufsize > 0)
+ /* Return an empty string in BUF.
+ This is a convenience for callers that don't want to write explicit
+ code for handling EINVAL. */
+ buf[0] = '\0';
+ return EINVAL;
+ }
+ else
+ {
+ size_t length = strlen (result);
+ if (length < bufsize)
+ {
+ memcpy (buf, result, length + 1);
+ return 0;
+ }
+ else
+ {
+ if (bufsize > 0)
+ {
+ /* Return a truncated result in BUF.
+ This is a convenience for callers that don't want to write
+ explicit code for handling ERANGE. */
+ memcpy (buf, result, bufsize - 1);
+ buf[bufsize - 1] = '\0';
+ }
+ return ERANGE;
+ }
+ }
+#endif
+}
+
+#if !(SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE) /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */
+
+/* Use a lock, so that no two threads can invoke setlocale_null_unlocked
+ at the same time. */
+
+/* Prohibit renaming this symbol. */
+# undef gl_get_setlocale_null_lock
+
+# if defined _WIN32 && !defined __CYGWIN__
+
+extern __declspec(dllimport) CRITICAL_SECTION *gl_get_setlocale_null_lock (void);
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+ CRITICAL_SECTION *lock = gl_get_setlocale_null_lock ();
+ int ret;
+
+ EnterCriticalSection (lock);
+ ret = setlocale_null_unlocked (category, buf, bufsize);
+ LeaveCriticalSection (lock);
+
+ return ret;
+}
+
+# elif HAVE_PTHREAD_API /* musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin */
+
+extern
+# if defined _WIN32 || defined __CYGWIN__
+ __declspec(dllimport)
+# endif
+ pthread_mutex_t *gl_get_setlocale_null_lock (void);
+
+# if HAVE_WEAK_SYMBOLS /* musl libc, FreeBSD, NetBSD, OpenBSD, Haiku */
+
+ /* Avoid the need to link with '-lpthread'. */
+# pragma weak pthread_mutex_lock
+# pragma weak pthread_mutex_unlock
+
+ /* Determine whether libpthread is in use. */
+# pragma weak pthread_mutexattr_gettype
+ /* See the comments in lock.h. */
+# define pthread_in_use() \
+ (pthread_mutexattr_gettype != NULL || c11_threads_in_use ())
+
+# else
+# define pthread_in_use() 1
+# endif
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+ if (pthread_in_use())
+ {
+ pthread_mutex_t *lock = gl_get_setlocale_null_lock ();
+ int ret;
+
+ if (pthread_mutex_lock (lock))
+ abort ();
+ ret = setlocale_null_unlocked (category, buf, bufsize);
+ if (pthread_mutex_unlock (lock))
+ abort ();
+
+ return ret;
+ }
+ else
+ return setlocale_null_unlocked (category, buf, bufsize);
+}
+
+# elif HAVE_THREADS_H
+
+extern mtx_t *gl_get_setlocale_null_lock (void);
+
+static int
+setlocale_null_with_lock (int category, char *buf, size_t bufsize)
+{
+ mtx_t *lock = gl_get_setlocale_null_lock ();
+ int ret;
+
+ if (mtx_lock (lock) != thrd_success)
+ abort ();
+ ret = setlocale_null_unlocked (category, buf, bufsize);
+ if (mtx_unlock (lock) != thrd_success)
+ abort ();
+
+ return ret;
+}
+
+# endif
+
+#endif
+
+int
+setlocale_null_r (int category, char *buf, size_t bufsize)
+{
+#if SETLOCALE_NULL_ALL_MTSAFE
+# if SETLOCALE_NULL_ONE_MTSAFE
+
+ return setlocale_null_unlocked (category, buf, bufsize);
+
+# else
+
+ if (category == LC_ALL)
+ return setlocale_null_unlocked (category, buf, bufsize);
+ else
+ return setlocale_null_with_lock (category, buf, bufsize);
+
+# endif
+#else
+# if SETLOCALE_NULL_ONE_MTSAFE
+
+ if (category == LC_ALL)
+ return setlocale_null_with_lock (category, buf, bufsize);
+ else
+ return setlocale_null_unlocked (category, buf, bufsize);
+
+# else
+
+ return setlocale_null_with_lock (category, buf, bufsize);
+
+# endif
+#endif
+}
+
+const char *
+setlocale_null (int category)
+{
+#if SETLOCALE_NULL_ALL_MTSAFE && SETLOCALE_NULL_ONE_MTSAFE
+ return setlocale_null_androidfix (category);
+#else
+
+ /* This call must be multithread-safe. To achieve this without using
+ thread-local storage:
+ 1. We use a specific static buffer for each possible CATEGORY
+ argument. So that different threads can call setlocale_mtsafe
+ with different CATEGORY arguments, without interfering.
+ 2. We use a simple strcpy or memcpy to fill this static buffer.
+ Filling it through, for example, strcpy + strcat would not be
+ guaranteed to leave the buffer's contents intact if another thread
+ is currently accessing it. If necessary, the contents is first
+ assembled in a stack-allocated buffer. */
+ if (category == LC_ALL)
+ {
+# if SETLOCALE_NULL_ALL_MTSAFE
+ return setlocale_null_androidfix (LC_ALL);
+# else
+ char buf[SETLOCALE_NULL_ALL_MAX];
+ static char resultbuf[SETLOCALE_NULL_ALL_MAX];
+
+ if (setlocale_null_r (LC_ALL, buf, sizeof (buf)))
+ return "C";
+ strcpy (resultbuf, buf);
+ return resultbuf;
+# endif
+ }
+ else
+ {
+# if SETLOCALE_NULL_ONE_MTSAFE
+ return setlocale_null_androidfix (category);
+# else
+ enum
+ {
+ LC_CTYPE_INDEX,
+ LC_NUMERIC_INDEX,
+ LC_TIME_INDEX,
+ LC_COLLATE_INDEX,
+ LC_MONETARY_INDEX,
+ LC_MESSAGES_INDEX,
+# ifdef LC_PAPER
+ LC_PAPER_INDEX,
+# endif
+# ifdef LC_NAME
+ LC_NAME_INDEX,
+# endif
+# ifdef LC_ADDRESS
+ LC_ADDRESS_INDEX,
+# endif
+# ifdef LC_TELEPHONE
+ LC_TELEPHONE_INDEX,
+# endif
+# ifdef LC_MEASUREMENT
+ LC_MEASUREMENT_INDEX,
+# endif
+# ifdef LC_IDENTIFICATION
+ LC_IDENTIFICATION_INDEX,
+# endif
+ LC_INDICES_COUNT
+ }
+ i;
+ char buf[SETLOCALE_NULL_MAX];
+ static char resultbuf[LC_INDICES_COUNT][SETLOCALE_NULL_MAX];
+ int err;
+
+ err = setlocale_null_r (category, buf, sizeof (buf));
+ if (err == EINVAL)
+ return NULL;
+ if (err)
+ return "C";
+
+ switch (category)
+ {
+ case LC_CTYPE: i = LC_CTYPE_INDEX; break;
+ case LC_NUMERIC: i = LC_NUMERIC_INDEX; break;
+ case LC_TIME: i = LC_TIME_INDEX; break;
+ case LC_COLLATE: i = LC_COLLATE_INDEX; break;
+ case LC_MONETARY: i = LC_MONETARY_INDEX; break;
+ case LC_MESSAGES: i = LC_MESSAGES_INDEX; break;
+# ifdef LC_PAPER
+ case LC_PAPER: i = LC_PAPER_INDEX; break;
+# endif
+# ifdef LC_NAME
+ case LC_NAME: i = LC_NAME_INDEX; break;
+# endif
+# ifdef LC_ADDRESS
+ case LC_ADDRESS: i = LC_ADDRESS_INDEX; break;
+# endif
+# ifdef LC_TELEPHONE
+ case LC_TELEPHONE: i = LC_TELEPHONE_INDEX; break;
+# endif
+# ifdef LC_MEASUREMENT
+ case LC_MEASUREMENT: i = LC_MEASUREMENT_INDEX; break;
+# endif
+# ifdef LC_IDENTIFICATION
+ case LC_IDENTIFICATION: i = LC_IDENTIFICATION_INDEX; break;
+# endif
+ default:
+ /* If you get here, a #ifdef LC_xxx is missing. */
+ abort ();
+ }
+
+ strcpy (resultbuf[i], buf);
+ return resultbuf[i];
+# endif
+ }
+#endif
+}
diff --git a/lib/setlocale_null.h b/lib/setlocale_null.h
new file mode 100644
index 0000000..6844be5
--- /dev/null
+++ b/lib/setlocale_null.h
@@ -0,0 +1,82 @@
+/* Query the name of the current global locale.
+ Copyright (C) 2019-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2019. */
+
+#ifndef _SETLOCALE_NULL_H
+#define _SETLOCALE_NULL_H
+
+#include <stddef.h>
+
+#include "arg-nonnull.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Recommended size of a buffer for a locale name for a single category.
+ On glibc systems, you can have locale names that are relative file names;
+ assume a maximum length 256.
+ In native Windows, in 2018 the longest locale name was of length 58
+ ("FYRO Macedonian_Former Yugoslav Republic of Macedonia.1251"). */
+#define SETLOCALE_NULL_MAX (256+1)
+
+/* Recommended size of a buffer for a locale name with all categories.
+ On glibc systems, you can have locale names that are relative file names;
+ assume maximum length 256 for each. There are 12 categories; so, the
+ maximum total length is 148+12*256.
+ In native Windows, there are 5 categories, and the maximum total length is
+ 55+5*58. */
+#define SETLOCALE_NULL_ALL_MAX (148+12*256+1)
+
+/* setlocale_null_r (CATEGORY, BUF, BUFSIZE) is like setlocale (CATEGORY, NULL),
+ except that
+ - it is guaranteed to be multithread-safe,
+ - it returns the resulting locale category name or locale name in the
+ user-supplied buffer BUF, which must be BUFSIZE bytes long.
+ The recommended minimum buffer size is
+ - SETLOCALE_NULL_MAX for CATEGORY != LC_ALL, and
+ - SETLOCALE_NULL_ALL_MAX for CATEGORY == LC_ALL.
+ The return value is an error code: 0 if the call is successful, EINVAL if
+ CATEGORY is invalid, or ERANGE if BUFSIZE is smaller than the length needed
+ size (including the trailing NUL byte). In the latter case, a truncated
+ result is returned in BUF, but still NUL-terminated if BUFSIZE > 0.
+ For this call to be multithread-safe, *all* calls to
+ setlocale (CATEGORY, NULL) in all other threads must have been converted
+ to use setlocale_null_r or setlocale_null as well, and the other threads
+ must not make other setlocale invocations (since changing the global locale
+ has side effects on all threads). */
+extern int setlocale_null_r (int category, char *buf, size_t bufsize)
+ _GL_ARG_NONNULL ((2));
+
+/* setlocale_null (CATEGORY) is like setlocale (CATEGORY, NULL), except that
+ it is guaranteed to be multithread-safe.
+ The return value is NULL if CATEGORY is invalid.
+ For this call to be multithread-safe, *all* calls to
+ setlocale (CATEGORY, NULL) in all other threads must have been converted
+ to use setlocale_null_r or setlocale_null as well, and the other threads
+ must not make other setlocale invocations (since changing the global locale
+ has side effects on all threads). */
+extern const char *setlocale_null (int category);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SETLOCALE_NULL_H */
diff --git a/lib/setsockopt.c b/lib/setsockopt.c
new file mode 100644
index 0000000..ce0f9dd
--- /dev/null
+++ b/lib/setsockopt.c
@@ -0,0 +1,65 @@
+/* setsockopt.c --- wrappers for Windows setsockopt function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get struct timeval. */
+#include <sys/time.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#undef setsockopt
+
+int
+rpl_setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen)
+{
+ SOCKET sock = FD_TO_SOCKET (fd);
+ int r;
+
+ if (sock == INVALID_SOCKET)
+ {
+ errno = EBADF;
+ return -1;
+ }
+ else
+ {
+ if (level == SOL_SOCKET
+ && (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO))
+ {
+ const struct timeval *tv = optval;
+ int milliseconds = tv->tv_sec * 1000 + tv->tv_usec / 1000;
+ optval = &milliseconds;
+ r = setsockopt (sock, level, optname, optval, sizeof (int));
+ }
+ else
+ {
+ r = setsockopt (sock, level, optname, optval, optlen);
+ }
+
+ if (r < 0)
+ set_winsock_errno ();
+
+ return r;
+ }
+}
diff --git a/lib/sha1.c b/lib/sha1.c
new file mode 100644
index 0000000..bacf29c
--- /dev/null
+++ b/lib/sha1.c
@@ -0,0 +1,454 @@
+/* sha1.c - Functions to compute SHA1 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-1.
+
+ Copyright (C) 2000-2001, 2003-2006, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Scott G. Miller
+ Credits:
+ Robert Klep <robert@ilse.nl> -- Expansion function fix
+*/
+
+#include <config.h>
+
+#if HAVE_OPENSSL_SHA1
+# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
+#endif
+#include "sha1.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include <byteswap.h>
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) bswap_32 (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+#if ! HAVE_OPENSSL_SHA1
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
+ initialize it to the start constants of the SHA1 algorithm. This
+ must be called before using hash in the call to sha1_hash. */
+void
+sha1_init_ctx (struct sha1_ctx *ctx)
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+ ctx->E = 0xc3d2e1f0;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the 4 byte value from v into the memory location pointed to by *cp,
+ If your architecture allows unaligned access this is equivalent to
+ * (uint32_t *) cp = v */
+static void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result
+ must be in little endian byte order. */
+void *
+sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf)
+{
+ char *r = resbuf;
+ set_uint32 (r + 0 * sizeof ctx->A, SWAP (ctx->A));
+ set_uint32 (r + 1 * sizeof ctx->B, SWAP (ctx->B));
+ set_uint32 (r + 2 * sizeof ctx->C, SWAP (ctx->C));
+ set_uint32 (r + 3 * sizeof ctx->D, SWAP (ctx->D));
+ set_uint32 (r + 4 * sizeof ctx->E, SWAP (ctx->E));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+void *
+sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
+{
+ /* Take yet unprocessed bytes into account. */
+ uint32_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+ ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha1_process_block (ctx->buffer, size * 4, ctx);
+
+ return sha1_read_ctx (ctx, resbuf);
+}
+#endif
+
+#ifdef GL_COMPILE_CRYPTO_STREAM
+
+#include "af_alg.h"
+
+/* Compute SHA1 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 20 bytes
+ beginning at RESBLOCK. */
+int
+sha1_stream (FILE *stream, void *resblock)
+{
+ switch (afalg_stream (stream, "sha1", resblock, SHA1_DIGEST_SIZE))
+ {
+ case 0: return 0;
+ case -EIO: return 1;
+ }
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ struct sha1_ctx ctx;
+ sha1_init_ctx (&ctx);
+ size_t sum;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ /* Either process a partial fread() from this loop,
+ or the fread() in afalg_stream may have gotten EOF.
+ We need to avoid a subsequent fread() as EOF may
+ not be sticky. For details of such systems, see:
+ https://sourceware.org/bugzilla/show_bug.cgi?id=1190 */
+ if (feof (stream))
+ goto process_partial_block;
+
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha1_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha1_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ sha1_finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+#endif
+
+#if ! HAVE_OPENSSL_SHA1
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha1_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha1_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha1_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha1_finish_ctx (&ctx, resblock);
+}
+
+void
+sha1_process_bytes (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha1_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap,
+ because ctx->buflen < 64 ≤ (left_over + add) & ~63. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha1_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha1_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha1_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ /* The regions in the following copy operation cannot overlap,
+ because left_over ≤ 64. */
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between md5.c and sha1.c --- */
+
+/* SHA1 round constants */
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+#define K3 0x8f1bbcdc
+#define K4 0xca62c1d6
+
+/* Round functions. Note that F2 is the same as F4. */
+#define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
+#define F2(B,C,D) (B ^ C ^ D)
+#define F3(B,C,D) ( ( B & C ) | ( D & ( B | C ) ) )
+#define F4(B,C,D) (B ^ C ^ D)
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->A;
+ uint32_t b = ctx->B;
+ uint32_t c = ctx->C;
+ uint32_t d = ctx->D;
+ uint32_t e = ctx->E;
+ uint32_t lolen = len;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += lolen;
+ ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
+
+#define rol(x, n) (((x) << (n)) | ((uint32_t) (x) >> (32 - (n))))
+
+#define M(I) ( tm = x[I&0x0f] ^ x[(I-14)&0x0f] \
+ ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
+ , (x[I&0x0f] = rol(tm, 1)) )
+
+#define R(A,B,C,D,E,F,K,M) do { E += rol( A, 5 ) \
+ + F( B, C, D ) \
+ + K \
+ + M; \
+ B = rol( B, 30 ); \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ int t;
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, F1, K1, x[ 0] );
+ R( e, a, b, c, d, F1, K1, x[ 1] );
+ R( d, e, a, b, c, F1, K1, x[ 2] );
+ R( c, d, e, a, b, F1, K1, x[ 3] );
+ R( b, c, d, e, a, F1, K1, x[ 4] );
+ R( a, b, c, d, e, F1, K1, x[ 5] );
+ R( e, a, b, c, d, F1, K1, x[ 6] );
+ R( d, e, a, b, c, F1, K1, x[ 7] );
+ R( c, d, e, a, b, F1, K1, x[ 8] );
+ R( b, c, d, e, a, F1, K1, x[ 9] );
+ R( a, b, c, d, e, F1, K1, x[10] );
+ R( e, a, b, c, d, F1, K1, x[11] );
+ R( d, e, a, b, c, F1, K1, x[12] );
+ R( c, d, e, a, b, F1, K1, x[13] );
+ R( b, c, d, e, a, F1, K1, x[14] );
+ R( a, b, c, d, e, F1, K1, x[15] );
+ R( e, a, b, c, d, F1, K1, M(16) );
+ R( d, e, a, b, c, F1, K1, M(17) );
+ R( c, d, e, a, b, F1, K1, M(18) );
+ R( b, c, d, e, a, F1, K1, M(19) );
+ R( a, b, c, d, e, F2, K2, M(20) );
+ R( e, a, b, c, d, F2, K2, M(21) );
+ R( d, e, a, b, c, F2, K2, M(22) );
+ R( c, d, e, a, b, F2, K2, M(23) );
+ R( b, c, d, e, a, F2, K2, M(24) );
+ R( a, b, c, d, e, F2, K2, M(25) );
+ R( e, a, b, c, d, F2, K2, M(26) );
+ R( d, e, a, b, c, F2, K2, M(27) );
+ R( c, d, e, a, b, F2, K2, M(28) );
+ R( b, c, d, e, a, F2, K2, M(29) );
+ R( a, b, c, d, e, F2, K2, M(30) );
+ R( e, a, b, c, d, F2, K2, M(31) );
+ R( d, e, a, b, c, F2, K2, M(32) );
+ R( c, d, e, a, b, F2, K2, M(33) );
+ R( b, c, d, e, a, F2, K2, M(34) );
+ R( a, b, c, d, e, F2, K2, M(35) );
+ R( e, a, b, c, d, F2, K2, M(36) );
+ R( d, e, a, b, c, F2, K2, M(37) );
+ R( c, d, e, a, b, F2, K2, M(38) );
+ R( b, c, d, e, a, F2, K2, M(39) );
+ R( a, b, c, d, e, F3, K3, M(40) );
+ R( e, a, b, c, d, F3, K3, M(41) );
+ R( d, e, a, b, c, F3, K3, M(42) );
+ R( c, d, e, a, b, F3, K3, M(43) );
+ R( b, c, d, e, a, F3, K3, M(44) );
+ R( a, b, c, d, e, F3, K3, M(45) );
+ R( e, a, b, c, d, F3, K3, M(46) );
+ R( d, e, a, b, c, F3, K3, M(47) );
+ R( c, d, e, a, b, F3, K3, M(48) );
+ R( b, c, d, e, a, F3, K3, M(49) );
+ R( a, b, c, d, e, F3, K3, M(50) );
+ R( e, a, b, c, d, F3, K3, M(51) );
+ R( d, e, a, b, c, F3, K3, M(52) );
+ R( c, d, e, a, b, F3, K3, M(53) );
+ R( b, c, d, e, a, F3, K3, M(54) );
+ R( a, b, c, d, e, F3, K3, M(55) );
+ R( e, a, b, c, d, F3, K3, M(56) );
+ R( d, e, a, b, c, F3, K3, M(57) );
+ R( c, d, e, a, b, F3, K3, M(58) );
+ R( b, c, d, e, a, F3, K3, M(59) );
+ R( a, b, c, d, e, F4, K4, M(60) );
+ R( e, a, b, c, d, F4, K4, M(61) );
+ R( d, e, a, b, c, F4, K4, M(62) );
+ R( c, d, e, a, b, F4, K4, M(63) );
+ R( b, c, d, e, a, F4, K4, M(64) );
+ R( a, b, c, d, e, F4, K4, M(65) );
+ R( e, a, b, c, d, F4, K4, M(66) );
+ R( d, e, a, b, c, F4, K4, M(67) );
+ R( c, d, e, a, b, F4, K4, M(68) );
+ R( b, c, d, e, a, F4, K4, M(69) );
+ R( a, b, c, d, e, F4, K4, M(70) );
+ R( e, a, b, c, d, F4, K4, M(71) );
+ R( d, e, a, b, c, F4, K4, M(72) );
+ R( c, d, e, a, b, F4, K4, M(73) );
+ R( b, c, d, e, a, F4, K4, M(74) );
+ R( a, b, c, d, e, F4, K4, M(75) );
+ R( e, a, b, c, d, F4, K4, M(76) );
+ R( d, e, a, b, c, F4, K4, M(77) );
+ R( c, d, e, a, b, F4, K4, M(78) );
+ R( b, c, d, e, a, F4, K4, M(79) );
+
+ a = ctx->A += a;
+ b = ctx->B += b;
+ c = ctx->C += c;
+ d = ctx->D += d;
+ e = ctx->E += e;
+ }
+}
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sha1.h b/lib/sha1.h
new file mode 100644
index 0000000..b767884
--- /dev/null
+++ b/lib/sha1.h
@@ -0,0 +1,111 @@
+/* Declarations of functions and data types used for SHA1 sum
+ library functions.
+ Copyright (C) 2000-2001, 2003, 2005-2006, 2008-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef SHA1_H
+# define SHA1_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# if HAVE_OPENSSL_SHA1
+# include <openssl/sha.h>
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+#define SHA1_DIGEST_SIZE 20
+
+# if HAVE_OPENSSL_SHA1
+# define GL_OPENSSL_NAME 1
+# include "gl_openssl.h"
+# else
+/* Structure to save state of computation between the single steps. */
+struct sha1_ctx
+{
+ uint32_t A;
+ uint32_t B;
+ uint32_t C;
+ uint32_t D;
+ uint32_t E;
+
+ uint32_t total[2];
+ uint32_t buflen; /* ≥ 0, ≤ 128 */
+ uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
+};
+
+/* Initialize structure containing state of computation. */
+extern void sha1_init_ctx (struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha1_process_block (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha1_process_bytes (const void *buffer, size_t len,
+ struct sha1_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 20 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *restrict resbuf);
+
+
+/* Put result from CTX in first 20 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *restrict resbuf);
+
+
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha1_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+
+# endif
+/* Compute SHA1 message digest for bytes read from STREAM.
+ STREAM is an open file stream. Regular files are handled more efficiently.
+ The contents of STREAM from its current position to its end will be read.
+ The case that the last operation on STREAM was an 'ungetc' is not supported.
+ The resulting message digest number will be written into the 20 bytes
+ beginning at RESBLOCK. */
+extern int sha1_stream (FILE *stream, void *resblock);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sha256.c b/lib/sha256.c
new file mode 100644
index 0000000..c80dea2
--- /dev/null
+++ b/lib/sha256.c
@@ -0,0 +1,543 @@
+/* sha256.c - Functions to compute SHA256 and SHA224 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005-2006, 2008-2020 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/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#if HAVE_OPENSSL_SHA256
+# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
+#endif
+#include "sha256.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include <byteswap.h>
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) bswap_32 (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 64 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+#if ! HAVE_OPENSSL_SHA256
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 256 bit block of data (eight 32 bit ints) and
+ initializes it to the start constants of the SHA256 algorithm. This
+ must be called before using hash in the call to sha256_hash
+*/
+void
+sha256_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0x6a09e667UL;
+ ctx->state[1] = 0xbb67ae85UL;
+ ctx->state[2] = 0x3c6ef372UL;
+ ctx->state[3] = 0xa54ff53aUL;
+ ctx->state[4] = 0x510e527fUL;
+ ctx->state[5] = 0x9b05688cUL;
+ ctx->state[6] = 0x1f83d9abUL;
+ ctx->state[7] = 0x5be0cd19UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+void
+sha224_init_ctx (struct sha256_ctx *ctx)
+{
+ ctx->state[0] = 0xc1059ed8UL;
+ ctx->state[1] = 0x367cd507UL;
+ ctx->state[2] = 0x3070dd17UL;
+ ctx->state[3] = 0xf70e5939UL;
+ ctx->state[4] = 0xffc00b31UL;
+ ctx->state[5] = 0x68581511UL;
+ ctx->state[6] = 0x64f98fa7UL;
+ ctx->state[7] = 0xbefa4fa4UL;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Copy the value from v into the memory location pointed to by *CP,
+ If your architecture allows unaligned access, this is equivalent to
+ * (__typeof__ (v) *) cp = v */
+static void
+set_uint32 (char *cp, uint32_t v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 32 bytes following RESBUF.
+ The result must be in little endian byte order. */
+void *
+sha256_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha224_read_ctx (const struct sha256_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 7; i++)
+ set_uint32 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha256_conclude_ctx (struct sha256_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer.
+ Use set_uint32 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint32 ((char *) &ctx->buffer[size - 2],
+ SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)));
+ set_uint32 ((char *) &ctx->buffer[size - 1],
+ SWAP (ctx->total[0] << 3));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
+
+ /* Process last bytes. */
+ sha256_process_block (ctx->buffer, size * 4, ctx);
+}
+
+void *
+sha256_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha256_read_ctx (ctx, resbuf);
+}
+
+void *
+sha224_finish_ctx (struct sha256_ctx *ctx, void *resbuf)
+{
+ sha256_conclude_ctx (ctx);
+ return sha224_read_ctx (ctx, resbuf);
+}
+#endif
+
+#ifdef GL_COMPILE_CRYPTO_STREAM
+
+#include "af_alg.h"
+
+/* Compute message digest for bytes read from STREAM using algorithm ALG.
+ Write the message digest into RESBLOCK, which contains HASHLEN bytes.
+ The initial and finishing operations are INIT_CTX and FINISH_CTX.
+ Return zero if and only if successful. */
+static int
+shaxxx_stream (FILE *stream, char const *alg, void *resblock,
+ ssize_t hashlen, void (*init_ctx) (struct sha256_ctx *),
+ void *(*finish_ctx) (struct sha256_ctx *, void *))
+{
+ switch (afalg_stream (stream, alg, resblock, hashlen))
+ {
+ case 0: return 0;
+ case -EIO: return 1;
+ }
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ struct sha256_ctx ctx;
+ init_ctx (&ctx);
+ size_t sum;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ /* Either process a partial fread() from this loop,
+ or the fread() in afalg_stream may have gotten EOF.
+ We need to avoid a subsequent fread() as EOF may
+ not be sticky. For details of such systems, see:
+ https://sourceware.org/bugzilla/show_bug.cgi?id=1190 */
+ if (feof (stream))
+ goto process_partial_block;
+
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha256_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha256_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+int
+sha256_stream (FILE *stream, void *resblock)
+{
+ return shaxxx_stream (stream, "sha256", resblock, SHA256_DIGEST_SIZE,
+ sha256_init_ctx, sha256_finish_ctx);
+}
+
+int
+sha224_stream (FILE *stream, void *resblock)
+{
+ return shaxxx_stream (stream, "sha224", resblock, SHA224_DIGEST_SIZE,
+ sha224_init_ctx, sha224_finish_ctx);
+}
+#endif
+
+#if ! HAVE_OPENSSL_SHA256
+/* Compute SHA256 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha256_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha256_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha256_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha224_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha256_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha224_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ sha256_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha224_finish_ctx (&ctx, resblock);
+}
+
+void
+sha256_process_bytes (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ sha256_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap,
+ because ctx->buflen < 64 ≤ (left_over + add) & ~63. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (uint32_t) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ sha256_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ sha256_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ sha256_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ /* The regions in the following copy operation cannot overlap,
+ because left_over ≤ 64. */
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha256.c --- */
+
+/* SHA256 round constants */
+#define K(I) sha256_round_constants[I]
+static const uint32_t sha256_round_constants[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL,
+};
+
+/* Round functions. */
+#define F2(A,B,C) ( ( A & B ) | ( C & ( A | B ) ) )
+#define F1(E,F,G) ( G ^ ( E & ( F ^ G ) ) )
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha256_process_block (const void *buffer, size_t len, struct sha256_ctx *ctx)
+{
+ const uint32_t *words = buffer;
+ size_t nwords = len / sizeof (uint32_t);
+ const uint32_t *endp = words + nwords;
+ uint32_t x[16];
+ uint32_t a = ctx->state[0];
+ uint32_t b = ctx->state[1];
+ uint32_t c = ctx->state[2];
+ uint32_t d = ctx->state[3];
+ uint32_t e = ctx->state[4];
+ uint32_t f = ctx->state[5];
+ uint32_t g = ctx->state[6];
+ uint32_t h = ctx->state[7];
+ uint32_t lolen = len;
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += lolen;
+ ctx->total[1] += (len >> 31 >> 1) + (ctx->total[0] < lolen);
+
+#define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+#define S0(x) (rol(x,25)^rol(x,14)^(x>>3))
+#define S1(x) (rol(x,15)^rol(x,13)^(x>>10))
+#define SS0(x) (rol(x,30)^rol(x,19)^rol(x,10))
+#define SS1(x) (rol(x,26)^rol(x,21)^rol(x,7))
+
+#define M(I) ( tm = S1(x[(I-2)&0x0f]) + x[(I-7)&0x0f] \
+ + S0(x[(I-15)&0x0f]) + x[I&0x0f] \
+ , x[I&0x0f] = tm )
+
+#define R(A,B,C,D,E,F,G,H,K,M) do { t0 = SS0(A) + F2(A,B,C); \
+ t1 = H + SS1(E) \
+ + F1(E,F,G) \
+ + K \
+ + M; \
+ D += t1; H = t0 + t1; \
+ } while(0)
+
+ while (words < endp)
+ {
+ uint32_t tm;
+ uint32_t t0, t1;
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+
+ a = ctx->state[0] += a;
+ b = ctx->state[1] += b;
+ c = ctx->state[2] += c;
+ d = ctx->state[3] += d;
+ e = ctx->state[4] += e;
+ f = ctx->state[5] += f;
+ g = ctx->state[6] += g;
+ h = ctx->state[7] += h;
+ }
+}
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sha256.h b/lib/sha256.h
new file mode 100644
index 0000000..750d78a
--- /dev/null
+++ b/lib/sha256.h
@@ -0,0 +1,117 @@
+/* Declarations of functions and data types used for SHA256 and SHA224 sum
+ library functions.
+ Copyright (C) 2005-2006, 2008-2020 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/>. */
+
+#ifndef SHA256_H
+# define SHA256_H 1
+
+# include <stdio.h>
+# include <stdint.h>
+
+# if HAVE_OPENSSL_SHA256
+# include <openssl/sha.h>
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+enum { SHA224_DIGEST_SIZE = 224 / 8 };
+enum { SHA256_DIGEST_SIZE = 256 / 8 };
+
+# if HAVE_OPENSSL_SHA256
+# define GL_OPENSSL_NAME 224
+# include "gl_openssl.h"
+# define GL_OPENSSL_NAME 256
+# include "gl_openssl.h"
+# else
+/* Structure to save state of computation between the single steps. */
+struct sha256_ctx
+{
+ uint32_t state[8];
+
+ uint32_t total[2];
+ size_t buflen; /* ≥ 0, ≤ 128 */
+ uint32_t buffer[32]; /* 128 bytes; the first buflen bytes are in use */
+};
+
+/* Initialize structure containing state of computation. */
+extern void sha256_init_ctx (struct sha256_ctx *ctx);
+extern void sha224_init_ctx (struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void sha256_process_block (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void sha256_process_bytes (const void *buffer, size_t len,
+ struct sha256_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 32 (28) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha256_finish_ctx (struct sha256_ctx *ctx, void *restrict resbuf);
+extern void *sha224_finish_ctx (struct sha256_ctx *ctx, void *restrict resbuf);
+
+
+/* Put result from CTX in first 32 (28) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+extern void *sha256_read_ctx (const struct sha256_ctx *ctx,
+ void *restrict resbuf);
+extern void *sha224_read_ctx (const struct sha256_ctx *ctx,
+ void *restrict resbuf);
+
+
+/* Compute SHA256 (SHA224) message digest for LEN bytes beginning at BUFFER.
+ The result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha256_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+extern void *sha224_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+
+# endif
+/* Compute SHA256 (SHA224) message digest for bytes read from STREAM.
+ STREAM is an open file stream. Regular files are handled more efficiently.
+ The contents of STREAM from its current position to its end will be read.
+ The case that the last operation on STREAM was an 'ungetc' is not supported.
+ The resulting message digest number will be written into the 32 (28) bytes
+ beginning at RESBLOCK. */
+extern int sha256_stream (FILE *stream, void *resblock);
+extern int sha224_stream (FILE *stream, void *resblock);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sha512.c b/lib/sha512.c
new file mode 100644
index 0000000..518e336
--- /dev/null
+++ b/lib/sha512.c
@@ -0,0 +1,588 @@
+/* sha512.c - Functions to compute SHA512 and SHA384 message digest of files or
+ memory blocks according to the NIST specification FIPS-180-2.
+
+ Copyright (C) 2005-2006, 2008-2020 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/>. */
+
+/* Written by David Madore, considerably copypasting from
+ Scott G. Miller's sha1.c
+*/
+
+#include <config.h>
+
+#if HAVE_OPENSSL_SHA512
+# define GL_OPENSSL_INLINE _GL_EXTERN_INLINE
+#endif
+#include "sha512.h"
+
+#include <stdalign.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#include <byteswap.h>
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) (n)
+#else
+# define SWAP(n) bswap_64 (n)
+#endif
+
+#define BLOCKSIZE 32768
+#if BLOCKSIZE % 128 != 0
+# error "invalid BLOCKSIZE"
+#endif
+
+#if ! HAVE_OPENSSL_SHA512
+/* This array contains the bytes used to pad the buffer to the next
+ 128-byte boundary. */
+static const unsigned char fillbuf[128] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/*
+ Takes a pointer to a 512 bit block of data (eight 64 bit ints) and
+ initializes it to the start constants of the SHA512 algorithm. This
+ must be called before using hash in the call to sha512_hash
+*/
+void
+sha512_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0x6a09e667, 0xf3bcc908);
+ ctx->state[1] = u64hilo (0xbb67ae85, 0x84caa73b);
+ ctx->state[2] = u64hilo (0x3c6ef372, 0xfe94f82b);
+ ctx->state[3] = u64hilo (0xa54ff53a, 0x5f1d36f1);
+ ctx->state[4] = u64hilo (0x510e527f, 0xade682d1);
+ ctx->state[5] = u64hilo (0x9b05688c, 0x2b3e6c1f);
+ ctx->state[6] = u64hilo (0x1f83d9ab, 0xfb41bd6b);
+ ctx->state[7] = u64hilo (0x5be0cd19, 0x137e2179);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+void
+sha384_init_ctx (struct sha512_ctx *ctx)
+{
+ ctx->state[0] = u64hilo (0xcbbb9d5d, 0xc1059ed8);
+ ctx->state[1] = u64hilo (0x629a292a, 0x367cd507);
+ ctx->state[2] = u64hilo (0x9159015a, 0x3070dd17);
+ ctx->state[3] = u64hilo (0x152fecd8, 0xf70e5939);
+ ctx->state[4] = u64hilo (0x67332667, 0xffc00b31);
+ ctx->state[5] = u64hilo (0x8eb44a87, 0x68581511);
+ ctx->state[6] = u64hilo (0xdb0c2e0d, 0x64f98fa7);
+ ctx->state[7] = u64hilo (0x47b5481d, 0xbefa4fa4);
+
+ ctx->total[0] = ctx->total[1] = u64lo (0);
+ ctx->buflen = 0;
+}
+
+/* Copy the value from V into the memory location pointed to by *CP,
+ If your architecture allows unaligned access, this is equivalent to
+ * (__typeof__ (v) *) cp = v */
+static void
+set_uint64 (char *cp, u64 v)
+{
+ memcpy (cp, &v, sizeof v);
+}
+
+/* Put result from CTX in first 64 bytes following RESBUF.
+ The result must be in little endian byte order. */
+void *
+sha512_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 8; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+void *
+sha384_read_ctx (const struct sha512_ctx *ctx, void *resbuf)
+{
+ int i;
+ char *r = resbuf;
+
+ for (i = 0; i < 6; i++)
+ set_uint64 (r + i * sizeof ctx->state[0], SWAP (ctx->state[i]));
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF. */
+static void
+sha512_conclude_ctx (struct sha512_ctx *ctx)
+{
+ /* Take yet unprocessed bytes into account. */
+ size_t bytes = ctx->buflen;
+ size_t size = (bytes < 112) ? 128 / 8 : 128 * 2 / 8;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] = u64plus (ctx->total[0], u64lo (bytes));
+ if (u64lt (ctx->total[0], u64lo (bytes)))
+ ctx->total[1] = u64plus (ctx->total[1], u64lo (1));
+
+ /* Put the 128-bit file length in *bits* at the end of the buffer.
+ Use set_uint64 rather than a simple assignment, to avoid risk of
+ unaligned access. */
+ set_uint64 ((char *) &ctx->buffer[size - 2],
+ SWAP (u64or (u64shl (ctx->total[1], 3),
+ u64shr (ctx->total[0], 61))));
+ set_uint64 ((char *) &ctx->buffer[size - 1],
+ SWAP (u64shl (ctx->total[0], 3)));
+
+ memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 8 - bytes);
+
+ /* Process last bytes. */
+ sha512_process_block (ctx->buffer, size * 8, ctx);
+}
+
+void *
+sha512_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha512_read_ctx (ctx, resbuf);
+}
+
+void *
+sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf)
+{
+ sha512_conclude_ctx (ctx);
+ return sha384_read_ctx (ctx, resbuf);
+}
+#endif
+
+#ifdef GL_COMPILE_CRYPTO_STREAM
+
+#include "af_alg.h"
+
+/* Compute message digest for bytes read from STREAM using algorithm ALG.
+ Write the message digest into RESBLOCK, which contains HASHLEN bytes.
+ The initial and finishing operations are INIT_CTX and FINISH_CTX.
+ Return zero if and only if successful. */
+static int
+shaxxx_stream (FILE *stream, char const *alg, void *resblock,
+ ssize_t hashlen, void (*init_ctx) (struct sha512_ctx *),
+ void *(*finish_ctx) (struct sha512_ctx *, void *))
+{
+ switch (afalg_stream (stream, alg, resblock, hashlen))
+ {
+ case 0: return 0;
+ case -EIO: return 1;
+ }
+
+ char *buffer = malloc (BLOCKSIZE + 72);
+ if (!buffer)
+ return 1;
+
+ struct sha512_ctx ctx;
+ init_ctx (&ctx);
+ size_t sum;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ /* Either process a partial fread() from this loop,
+ or the fread() in afalg_stream may have gotten EOF.
+ We need to avoid a subsequent fread() as EOF may
+ not be sticky. For details of such systems, see:
+ https://sourceware.org/bugzilla/show_bug.cgi?id=1190 */
+ if (feof (stream))
+ goto process_partial_block;
+
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IFF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ free (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 128 == 0
+ */
+ sha512_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ sha512_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ finish_ctx (&ctx, resblock);
+ free (buffer);
+ return 0;
+}
+
+int
+sha512_stream (FILE *stream, void *resblock)
+{
+ return shaxxx_stream (stream, "sha512", resblock, SHA512_DIGEST_SIZE,
+ sha512_init_ctx, sha512_finish_ctx);
+}
+
+int
+sha384_stream (FILE *stream, void *resblock)
+{
+ return shaxxx_stream (stream, "sha384", resblock, SHA384_DIGEST_SIZE,
+ sha384_init_ctx, sha384_finish_ctx);
+}
+#endif
+
+#if ! HAVE_OPENSSL_SHA512
+/* Compute SHA512 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+sha512_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha512_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha512_finish_ctx (&ctx, resblock);
+}
+
+void *
+sha384_buffer (const char *buffer, size_t len, void *resblock)
+{
+ struct sha512_ctx ctx;
+
+ /* Initialize the computation context. */
+ sha384_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 128 bytes. */
+ sha512_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return sha384_finish_ctx (&ctx, resblock);
+}
+
+void
+sha512_process_bytes (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 256 - left_over > len ? len : 256 - left_over;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 128)
+ {
+ sha512_process_block (ctx->buffer, ctx->buflen & ~127, ctx);
+
+ ctx->buflen &= 127;
+ /* The regions in the following copy operation cannot overlap,
+ because ctx->buflen < 128 ≤ (left_over + add) & ~127. */
+ memcpy (ctx->buffer,
+ &((char *) ctx->buffer)[(left_over + add) & ~127],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 128)
+ {
+#if !(_STRING_ARCH_unaligned || _STRING_INLINE_unaligned)
+# define UNALIGNED_P(p) ((uintptr_t) (p) % alignof (u64) != 0)
+ if (UNALIGNED_P (buffer))
+ while (len > 128)
+ {
+ sha512_process_block (memcpy (ctx->buffer, buffer, 128), 128, ctx);
+ buffer = (const char *) buffer + 128;
+ len -= 128;
+ }
+ else
+#endif
+ {
+ sha512_process_block (buffer, len & ~127, ctx);
+ buffer = (const char *) buffer + (len & ~127);
+ len &= 127;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 128)
+ {
+ sha512_process_block (ctx->buffer, 128, ctx);
+ left_over -= 128;
+ /* The regions in the following copy operation cannot overlap,
+ because left_over ≤ 128. */
+ memcpy (ctx->buffer, &ctx->buffer[16], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+/* --- Code below is the primary difference between sha1.c and sha512.c --- */
+
+/* SHA512 round constants */
+#define K(I) sha512_round_constants[I]
+static u64 const sha512_round_constants[80] = {
+ u64init (0x428a2f98, 0xd728ae22), u64init (0x71374491, 0x23ef65cd),
+ u64init (0xb5c0fbcf, 0xec4d3b2f), u64init (0xe9b5dba5, 0x8189dbbc),
+ u64init (0x3956c25b, 0xf348b538), u64init (0x59f111f1, 0xb605d019),
+ u64init (0x923f82a4, 0xaf194f9b), u64init (0xab1c5ed5, 0xda6d8118),
+ u64init (0xd807aa98, 0xa3030242), u64init (0x12835b01, 0x45706fbe),
+ u64init (0x243185be, 0x4ee4b28c), u64init (0x550c7dc3, 0xd5ffb4e2),
+ u64init (0x72be5d74, 0xf27b896f), u64init (0x80deb1fe, 0x3b1696b1),
+ u64init (0x9bdc06a7, 0x25c71235), u64init (0xc19bf174, 0xcf692694),
+ u64init (0xe49b69c1, 0x9ef14ad2), u64init (0xefbe4786, 0x384f25e3),
+ u64init (0x0fc19dc6, 0x8b8cd5b5), u64init (0x240ca1cc, 0x77ac9c65),
+ u64init (0x2de92c6f, 0x592b0275), u64init (0x4a7484aa, 0x6ea6e483),
+ u64init (0x5cb0a9dc, 0xbd41fbd4), u64init (0x76f988da, 0x831153b5),
+ u64init (0x983e5152, 0xee66dfab), u64init (0xa831c66d, 0x2db43210),
+ u64init (0xb00327c8, 0x98fb213f), u64init (0xbf597fc7, 0xbeef0ee4),
+ u64init (0xc6e00bf3, 0x3da88fc2), u64init (0xd5a79147, 0x930aa725),
+ u64init (0x06ca6351, 0xe003826f), u64init (0x14292967, 0x0a0e6e70),
+ u64init (0x27b70a85, 0x46d22ffc), u64init (0x2e1b2138, 0x5c26c926),
+ u64init (0x4d2c6dfc, 0x5ac42aed), u64init (0x53380d13, 0x9d95b3df),
+ u64init (0x650a7354, 0x8baf63de), u64init (0x766a0abb, 0x3c77b2a8),
+ u64init (0x81c2c92e, 0x47edaee6), u64init (0x92722c85, 0x1482353b),
+ u64init (0xa2bfe8a1, 0x4cf10364), u64init (0xa81a664b, 0xbc423001),
+ u64init (0xc24b8b70, 0xd0f89791), u64init (0xc76c51a3, 0x0654be30),
+ u64init (0xd192e819, 0xd6ef5218), u64init (0xd6990624, 0x5565a910),
+ u64init (0xf40e3585, 0x5771202a), u64init (0x106aa070, 0x32bbd1b8),
+ u64init (0x19a4c116, 0xb8d2d0c8), u64init (0x1e376c08, 0x5141ab53),
+ u64init (0x2748774c, 0xdf8eeb99), u64init (0x34b0bcb5, 0xe19b48a8),
+ u64init (0x391c0cb3, 0xc5c95a63), u64init (0x4ed8aa4a, 0xe3418acb),
+ u64init (0x5b9cca4f, 0x7763e373), u64init (0x682e6ff3, 0xd6b2b8a3),
+ u64init (0x748f82ee, 0x5defb2fc), u64init (0x78a5636f, 0x43172f60),
+ u64init (0x84c87814, 0xa1f0ab72), u64init (0x8cc70208, 0x1a6439ec),
+ u64init (0x90befffa, 0x23631e28), u64init (0xa4506ceb, 0xde82bde9),
+ u64init (0xbef9a3f7, 0xb2c67915), u64init (0xc67178f2, 0xe372532b),
+ u64init (0xca273ece, 0xea26619c), u64init (0xd186b8c7, 0x21c0c207),
+ u64init (0xeada7dd6, 0xcde0eb1e), u64init (0xf57d4f7f, 0xee6ed178),
+ u64init (0x06f067aa, 0x72176fba), u64init (0x0a637dc5, 0xa2c898a6),
+ u64init (0x113f9804, 0xbef90dae), u64init (0x1b710b35, 0x131c471b),
+ u64init (0x28db77f5, 0x23047d84), u64init (0x32caab7b, 0x40c72493),
+ u64init (0x3c9ebe0a, 0x15c9bebc), u64init (0x431d67c4, 0x9c100d4c),
+ u64init (0x4cc5d4be, 0xcb3e42b6), u64init (0x597f299c, 0xfc657e2a),
+ u64init (0x5fcb6fab, 0x3ad6faec), u64init (0x6c44198c, 0x4a475817),
+};
+
+/* Round functions. */
+#define F2(A, B, C) u64or (u64and (A, B), u64and (C, u64or (A, B)))
+#define F1(E, F, G) u64xor (G, u64and (E, u64xor (F, G)))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 128 == 0.
+ Most of this code comes from GnuPG's cipher/sha1.c. */
+
+void
+sha512_process_block (const void *buffer, size_t len, struct sha512_ctx *ctx)
+{
+ u64 const *words = buffer;
+ u64 const *endp = words + len / sizeof (u64);
+ u64 x[16];
+ u64 a = ctx->state[0];
+ u64 b = ctx->state[1];
+ u64 c = ctx->state[2];
+ u64 d = ctx->state[3];
+ u64 e = ctx->state[4];
+ u64 f = ctx->state[5];
+ u64 g = ctx->state[6];
+ u64 h = ctx->state[7];
+ u64 lolen = u64size (len);
+
+ /* First increment the byte count. FIPS PUB 180-2 specifies the possible
+ length of the file up to 2^128 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] = u64plus (ctx->total[0], lolen);
+ ctx->total[1] = u64plus (ctx->total[1],
+ u64plus (u64size (len >> 31 >> 31 >> 2),
+ u64lo (u64lt (ctx->total[0], lolen))));
+
+#define S0(x) u64xor (u64rol(x, 63), u64xor (u64rol (x, 56), u64shr (x, 7)))
+#define S1(x) u64xor (u64rol (x, 45), u64xor (u64rol (x, 3), u64shr (x, 6)))
+#define SS0(x) u64xor (u64rol (x, 36), u64xor (u64rol (x, 30), u64rol (x, 25)))
+#define SS1(x) u64xor (u64rol(x, 50), u64xor (u64rol (x, 46), u64rol (x, 23)))
+
+#define M(I) (x[(I) & 15] \
+ = u64plus (x[(I) & 15], \
+ u64plus (S1 (x[((I) - 2) & 15]), \
+ u64plus (x[((I) - 7) & 15], \
+ S0 (x[((I) - 15) & 15])))))
+
+#define R(A, B, C, D, E, F, G, H, K, M) \
+ do \
+ { \
+ u64 t0 = u64plus (SS0 (A), F2 (A, B, C)); \
+ u64 t1 = \
+ u64plus (H, u64plus (SS1 (E), \
+ u64plus (F1 (E, F, G), u64plus (K, M)))); \
+ D = u64plus (D, t1); \
+ H = u64plus (t0, t1); \
+ } \
+ while (0)
+
+ while (words < endp)
+ {
+ int t;
+ /* FIXME: see sha1.c for a better implementation. */
+ for (t = 0; t < 16; t++)
+ {
+ x[t] = SWAP (*words);
+ words++;
+ }
+
+ R( a, b, c, d, e, f, g, h, K( 0), x[ 0] );
+ R( h, a, b, c, d, e, f, g, K( 1), x[ 1] );
+ R( g, h, a, b, c, d, e, f, K( 2), x[ 2] );
+ R( f, g, h, a, b, c, d, e, K( 3), x[ 3] );
+ R( e, f, g, h, a, b, c, d, K( 4), x[ 4] );
+ R( d, e, f, g, h, a, b, c, K( 5), x[ 5] );
+ R( c, d, e, f, g, h, a, b, K( 6), x[ 6] );
+ R( b, c, d, e, f, g, h, a, K( 7), x[ 7] );
+ R( a, b, c, d, e, f, g, h, K( 8), x[ 8] );
+ R( h, a, b, c, d, e, f, g, K( 9), x[ 9] );
+ R( g, h, a, b, c, d, e, f, K(10), x[10] );
+ R( f, g, h, a, b, c, d, e, K(11), x[11] );
+ R( e, f, g, h, a, b, c, d, K(12), x[12] );
+ R( d, e, f, g, h, a, b, c, K(13), x[13] );
+ R( c, d, e, f, g, h, a, b, K(14), x[14] );
+ R( b, c, d, e, f, g, h, a, K(15), x[15] );
+ R( a, b, c, d, e, f, g, h, K(16), M(16) );
+ R( h, a, b, c, d, e, f, g, K(17), M(17) );
+ R( g, h, a, b, c, d, e, f, K(18), M(18) );
+ R( f, g, h, a, b, c, d, e, K(19), M(19) );
+ R( e, f, g, h, a, b, c, d, K(20), M(20) );
+ R( d, e, f, g, h, a, b, c, K(21), M(21) );
+ R( c, d, e, f, g, h, a, b, K(22), M(22) );
+ R( b, c, d, e, f, g, h, a, K(23), M(23) );
+ R( a, b, c, d, e, f, g, h, K(24), M(24) );
+ R( h, a, b, c, d, e, f, g, K(25), M(25) );
+ R( g, h, a, b, c, d, e, f, K(26), M(26) );
+ R( f, g, h, a, b, c, d, e, K(27), M(27) );
+ R( e, f, g, h, a, b, c, d, K(28), M(28) );
+ R( d, e, f, g, h, a, b, c, K(29), M(29) );
+ R( c, d, e, f, g, h, a, b, K(30), M(30) );
+ R( b, c, d, e, f, g, h, a, K(31), M(31) );
+ R( a, b, c, d, e, f, g, h, K(32), M(32) );
+ R( h, a, b, c, d, e, f, g, K(33), M(33) );
+ R( g, h, a, b, c, d, e, f, K(34), M(34) );
+ R( f, g, h, a, b, c, d, e, K(35), M(35) );
+ R( e, f, g, h, a, b, c, d, K(36), M(36) );
+ R( d, e, f, g, h, a, b, c, K(37), M(37) );
+ R( c, d, e, f, g, h, a, b, K(38), M(38) );
+ R( b, c, d, e, f, g, h, a, K(39), M(39) );
+ R( a, b, c, d, e, f, g, h, K(40), M(40) );
+ R( h, a, b, c, d, e, f, g, K(41), M(41) );
+ R( g, h, a, b, c, d, e, f, K(42), M(42) );
+ R( f, g, h, a, b, c, d, e, K(43), M(43) );
+ R( e, f, g, h, a, b, c, d, K(44), M(44) );
+ R( d, e, f, g, h, a, b, c, K(45), M(45) );
+ R( c, d, e, f, g, h, a, b, K(46), M(46) );
+ R( b, c, d, e, f, g, h, a, K(47), M(47) );
+ R( a, b, c, d, e, f, g, h, K(48), M(48) );
+ R( h, a, b, c, d, e, f, g, K(49), M(49) );
+ R( g, h, a, b, c, d, e, f, K(50), M(50) );
+ R( f, g, h, a, b, c, d, e, K(51), M(51) );
+ R( e, f, g, h, a, b, c, d, K(52), M(52) );
+ R( d, e, f, g, h, a, b, c, K(53), M(53) );
+ R( c, d, e, f, g, h, a, b, K(54), M(54) );
+ R( b, c, d, e, f, g, h, a, K(55), M(55) );
+ R( a, b, c, d, e, f, g, h, K(56), M(56) );
+ R( h, a, b, c, d, e, f, g, K(57), M(57) );
+ R( g, h, a, b, c, d, e, f, K(58), M(58) );
+ R( f, g, h, a, b, c, d, e, K(59), M(59) );
+ R( e, f, g, h, a, b, c, d, K(60), M(60) );
+ R( d, e, f, g, h, a, b, c, K(61), M(61) );
+ R( c, d, e, f, g, h, a, b, K(62), M(62) );
+ R( b, c, d, e, f, g, h, a, K(63), M(63) );
+ R( a, b, c, d, e, f, g, h, K(64), M(64) );
+ R( h, a, b, c, d, e, f, g, K(65), M(65) );
+ R( g, h, a, b, c, d, e, f, K(66), M(66) );
+ R( f, g, h, a, b, c, d, e, K(67), M(67) );
+ R( e, f, g, h, a, b, c, d, K(68), M(68) );
+ R( d, e, f, g, h, a, b, c, K(69), M(69) );
+ R( c, d, e, f, g, h, a, b, K(70), M(70) );
+ R( b, c, d, e, f, g, h, a, K(71), M(71) );
+ R( a, b, c, d, e, f, g, h, K(72), M(72) );
+ R( h, a, b, c, d, e, f, g, K(73), M(73) );
+ R( g, h, a, b, c, d, e, f, K(74), M(74) );
+ R( f, g, h, a, b, c, d, e, K(75), M(75) );
+ R( e, f, g, h, a, b, c, d, K(76), M(76) );
+ R( d, e, f, g, h, a, b, c, K(77), M(77) );
+ R( c, d, e, f, g, h, a, b, K(78), M(78) );
+ R( b, c, d, e, f, g, h, a, K(79), M(79) );
+
+ a = ctx->state[0] = u64plus (ctx->state[0], a);
+ b = ctx->state[1] = u64plus (ctx->state[1], b);
+ c = ctx->state[2] = u64plus (ctx->state[2], c);
+ d = ctx->state[3] = u64plus (ctx->state[3], d);
+ e = ctx->state[4] = u64plus (ctx->state[4], e);
+ f = ctx->state[5] = u64plus (ctx->state[5], f);
+ g = ctx->state[6] = u64plus (ctx->state[6], g);
+ h = ctx->state[7] = u64plus (ctx->state[7], h);
+ }
+}
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sha512.h b/lib/sha512.h
new file mode 100644
index 0000000..21c2f58
--- /dev/null
+++ b/lib/sha512.h
@@ -0,0 +1,120 @@
+/* Declarations of functions and data types used for SHA512 and SHA384 sum
+ library functions.
+ Copyright (C) 2005-2006, 2008-2020 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/>. */
+
+#ifndef SHA512_H
+# define SHA512_H 1
+
+# include <stdio.h>
+# include "u64.h"
+
+# if HAVE_OPENSSL_SHA512
+# include <openssl/sha.h>
+# endif
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+enum { SHA384_DIGEST_SIZE = 384 / 8 };
+enum { SHA512_DIGEST_SIZE = 512 / 8 };
+
+# if HAVE_OPENSSL_SHA512
+# define GL_OPENSSL_NAME 384
+# include "gl_openssl.h"
+# define GL_OPENSSL_NAME 512
+# include "gl_openssl.h"
+# else
+/* Structure to save state of computation between the single steps. */
+struct sha512_ctx
+{
+ u64 state[8];
+
+ u64 total[2];
+ size_t buflen; /* ≥ 0, ≤ 256 */
+ u64 buffer[32]; /* 256 bytes; the first buflen bytes are in use */
+};
+
+/* Initialize structure containing state of computation. */
+extern void sha512_init_ctx (struct sha512_ctx *ctx);
+extern void sha384_init_ctx (struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 128!!! */
+extern void sha512_process_block (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 128. */
+extern void sha512_process_bytes (const void *buffer, size_t len,
+ struct sha512_ctx *ctx);
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 64 (48) bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest. */
+extern void *sha512_finish_ctx (struct sha512_ctx *ctx, void *restrict resbuf);
+extern void *sha384_finish_ctx (struct sha512_ctx *ctx, void *restrict resbuf);
+
+
+/* Put result from CTX in first 64 (48) bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *sha512_read_ctx (const struct sha512_ctx *ctx,
+ void *restrict resbuf);
+extern void *sha384_read_ctx (const struct sha512_ctx *ctx,
+ void *restrict resbuf);
+
+
+/* Compute SHA512 (SHA384) message digest for LEN bytes beginning at BUFFER.
+ The result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *sha512_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+extern void *sha384_buffer (const char *buffer, size_t len,
+ void *restrict resblock);
+
+# endif
+/* Compute SHA512 (SHA384) message digest for bytes read from STREAM.
+ STREAM is an open file stream. Regular files are handled more efficiently.
+ The contents of STREAM from its current position to its end will be read.
+ The case that the last operation on STREAM was an 'ungetc' is not supported.
+ The resulting message digest number will be written into the 64 (48) bytes
+ beginning at RESBLOCK. */
+extern int sha512_stream (FILE *stream, void *resblock);
+extern int sha384_stream (FILE *stream, void *resblock);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/sig-handler.c b/lib/sig-handler.c
new file mode 100644
index 0000000..52c3621
--- /dev/null
+++ b/lib/sig-handler.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define SIG_HANDLER_INLINE _GL_EXTERN_INLINE
+#include "sig-handler.h"
diff --git a/lib/sig-handler.h b/lib/sig-handler.h
new file mode 100644
index 0000000..17604ea
--- /dev/null
+++ b/lib/sig-handler.h
@@ -0,0 +1,51 @@
+/* Convenience declarations when working with <signal.h>.
+
+ Copyright (C) 2008-2020 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/>. */
+
+#ifndef _GL_SIG_HANDLER_H
+#define _GL_SIG_HANDLER_H
+
+#include <signal.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef SIG_HANDLER_INLINE
+# define SIG_HANDLER_INLINE _GL_INLINE
+#endif
+
+/* Convenience type when working with signal handlers. */
+typedef void (*sa_handler_t) (int);
+
+/* Return the handler of a signal, as a sa_handler_t value regardless
+ of its true type. The resulting function can be compared to
+ special values like SIG_IGN but it is not portable to call it. */
+SIG_HANDLER_INLINE sa_handler_t _GL_ATTRIBUTE_PURE
+get_handler (struct sigaction const *a)
+{
+ /* POSIX says that special values like SIG_IGN can only occur when
+ action.sa_flags does not contain SA_SIGINFO. But in Linux 2.4,
+ for example, sa_sigaction and sa_handler are aliases and a signal
+ is ignored if sa_sigaction (after casting) equals SIG_IGN. In
+ this case, this implementation relies on the fact that the two
+ are aliases, and simply returns sa_handler. */
+ return a->sa_handler;
+}
+
+_GL_INLINE_HEADER_END
+
+#endif /* _GL_SIG_HANDLER_H */
diff --git a/lib/sigaction.c b/lib/sigaction.c
new file mode 100644
index 0000000..792b3e8
--- /dev/null
+++ b/lib/sigaction.c
@@ -0,0 +1,204 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/* This implementation of sigaction is tailored to native Windows behavior:
+ signal() has SysV semantics (ie. the handler is uninstalled before
+ it is invoked). This is an inherent data race if an asynchronous
+ signal is sent twice in a row before we can reinstall our handler,
+ but there's nothing we can do about it. Meanwhile, sigprocmask()
+ is not present, and while we can use the gnulib replacement to
+ provide critical sections, it too suffers from potential data races
+ in the face of an ill-timed asynchronous signal. And we compound
+ the situation by reading static storage in a signal handler, which
+ POSIX warns is not generically async-signal-safe. Oh well.
+
+ Additionally:
+ - We don't implement SA_NOCLDSTOP or SA_NOCLDWAIT, because SIGCHLD
+ is not defined.
+ - We don't implement SA_ONSTACK, because sigaltstack() is not present.
+ - We ignore SA_RESTART, because blocking native Windows API calls are
+ not interrupted anyway when an asynchronous signal occurs, and the
+ MSVCRT runtime never sets errno to EINTR.
+ - We don't implement SA_SIGINFO because it is impossible to do so
+ portably.
+
+ POSIX states that an application should not mix signal() and
+ sigaction(). We support the use of signal() within the gnulib
+ sigprocmask() substitute, but all other application code linked
+ with this module should stick with only sigaction(). */
+
+/* Check some of our assumptions. */
+#if defined SIGCHLD || defined HAVE_SIGALTSTACK || defined HAVE_SIGINTERRUPT
+# error "Revisit the assumptions made in the sigaction module"
+#endif
+
+/* Out-of-range substitutes make a good fallback for uncatchable
+ signals. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+
+/* A signal handler. */
+typedef void (*handler_t) (int signal);
+
+/* Set of current actions. If sa_handler for an entry is NULL, then
+ that signal is not currently handled by the sigaction handler. */
+static struct sigaction volatile action_array[NSIG] /* = 0 */;
+
+/* Signal handler that is installed for signals. */
+static void
+sigaction_handler (int sig)
+{
+ handler_t handler;
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno = errno;
+ if (sig < 0 || NSIG <= sig || !action_array[sig].sa_handler)
+ {
+ /* Unexpected situation; be careful to avoid recursive abort. */
+ if (sig == SIGABRT)
+ signal (SIGABRT, SIG_DFL);
+ abort ();
+ }
+
+ /* Reinstall the signal handler when required; otherwise update the
+ bookkeeping so that the user's handler may call sigaction and get
+ accurate results. We know the signal isn't currently blocked, or
+ we wouldn't be in its handler, therefore we know that we are not
+ interrupting a sigaction() call. There is a race where any
+ asynchronous instance of the same signal occurring before we
+ reinstall the handler will trigger the default handler; oh
+ well. */
+ handler = action_array[sig].sa_handler;
+ if ((action_array[sig].sa_flags & SA_RESETHAND) == 0)
+ signal (sig, sigaction_handler);
+ else
+ action_array[sig].sa_handler = NULL;
+
+ /* Block appropriate signals. */
+ mask = action_array[sig].sa_mask;
+ if ((action_array[sig].sa_flags & SA_NODEFER) == 0)
+ sigaddset (&mask, sig);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+
+ /* Invoke the user's handler, then restore prior mask. */
+ errno = saved_errno;
+ handler (sig);
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+}
+
+/* Change and/or query the action that will be taken on delivery of
+ signal SIG. If not NULL, ACT describes the new behavior. If not
+ NULL, OACT is set to the prior behavior. Return 0 on success, or
+ set errno and return -1 on failure. */
+int
+sigaction (int sig, const struct sigaction *restrict act,
+ struct sigaction *restrict oact)
+{
+ sigset_t mask;
+ sigset_t oldmask;
+ int saved_errno;
+
+ if (sig < 0 || NSIG <= sig || sig == SIGKILL || sig == SIGSTOP
+ || (act && act->sa_handler == SIG_ERR))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+#ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+#endif
+
+ /* POSIX requires sigaction() to be async-signal-safe. In other
+ words, if an asynchronous signal can occur while we are anywhere
+ inside this function, the user's handler could then call
+ sigaction() recursively and expect consistent results. We meet
+ this rule by using sigprocmask to block all signals before
+ modifying any data structure that could be read from a signal
+ handler; this works since we know that the gnulib sigprocmask
+ replacement does not try to use sigaction() from its handler. */
+ if (!act && !oact)
+ return 0;
+ sigfillset (&mask);
+ sigprocmask (SIG_BLOCK, &mask, &oldmask);
+ if (oact)
+ {
+ if (action_array[sig].sa_handler)
+ *oact = action_array[sig];
+ else
+ {
+ /* Safe to change the handler at will here, since all
+ signals are currently blocked. */
+ oact->sa_handler = signal (sig, SIG_DFL);
+ if (oact->sa_handler == SIG_ERR)
+ goto failure;
+ signal (sig, oact->sa_handler);
+ oact->sa_flags = SA_RESETHAND | SA_NODEFER;
+ sigemptyset (&oact->sa_mask);
+ }
+ }
+
+ if (act)
+ {
+ /* Safe to install the handler before updating action_array,
+ since all signals are currently blocked. */
+ if (act->sa_handler == SIG_DFL || act->sa_handler == SIG_IGN)
+ {
+ if (signal (sig, act->sa_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig].sa_handler = NULL;
+ }
+ else
+ {
+ if (signal (sig, sigaction_handler) == SIG_ERR)
+ goto failure;
+ action_array[sig] = *act;
+ }
+ }
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ return 0;
+
+ failure:
+ saved_errno = errno;
+ sigprocmask (SIG_SETMASK, &oldmask, NULL);
+ errno = saved_errno;
+ return -1;
+}
diff --git a/lib/signal.in.h b/lib/signal.in.h
new file mode 100644
index 0000000..70a2d4a
--- /dev/null
+++ b/lib/signal.in.h
@@ -0,0 +1,487 @@
+/* A GNU-like <signal.h>.
+
+ Copyright (C) 2006-2020 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_sig_atomic_t || defined __need_sigset_t || defined _GL_ALREADY_INCLUDING_SIGNAL_H || (defined _SIGNAL_H && !defined __SIZEOF_PTHREAD_MUTEX_T)
+/* Special invocation convention:
+ - Inside glibc header files.
+ - On glibc systems we have a sequence of nested includes
+ <signal.h> -> <ucontext.h> -> <signal.h>.
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases.
+ - On glibc systems with GCC 4.3 we have a sequence of nested includes
+ <csignal> -> </usr/include/signal.h> -> <sys/ucontext.h> -> <signal.h>.
+ In this situation, some of the functions are not yet declared, therefore
+ we cannot provide the C++ aliases. */
+
+# @INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SIGNAL_H
+
+#define _GL_ALREADY_INCLUDING_SIGNAL_H
+
+/* Define pid_t, uid_t.
+ Also, mingw defines sigset_t not in <signal.h>, but in <sys/types.h>.
+ On Solaris 10, <signal.h> includes <sys/types.h>, which eventually includes
+ us; so include <sys/types.h> now, before the second inclusion guard. */
+#include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SIGNAL_H@
+
+#undef _GL_ALREADY_INCLUDING_SIGNAL_H
+
+#ifndef _@GUARD_PREFIX@_SIGNAL_H
+#define _@GUARD_PREFIX@_SIGNAL_H
+
+/* Mac OS X 10.3, FreeBSD 6.4, OpenBSD 3.8, OSF/1 4.0, Solaris 2.6, Android,
+ OS/2 kLIBC declare pthread_sigmask in <pthread.h>, not in <signal.h>.
+ But avoid namespace pollution on glibc systems.*/
+#if (@GNULIB_PTHREAD_SIGMASK@ || defined GNULIB_POSIXCHECK) \
+ && ((defined __APPLE__ && defined __MACH__) \
+ || defined __FreeBSD__ || defined __OpenBSD__ || defined __osf__ \
+ || defined __sun || defined __ANDROID__ || defined __KLIBC__) \
+ && ! defined __GLIBC__
+# include <pthread.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* On AIX, sig_atomic_t already includes volatile. C99 requires that
+ 'volatile sig_atomic_t' ignore the extra modifier, but C89 did not.
+ Hence, redefine this to a non-volatile type as needed. */
+#if ! @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+# if !GNULIB_defined_sig_atomic_t
+typedef int rpl_sig_atomic_t;
+# undef sig_atomic_t
+# define sig_atomic_t rpl_sig_atomic_t
+# define GNULIB_defined_sig_atomic_t 1
+# endif
+#endif
+
+/* A set or mask of signals. */
+#if !@HAVE_SIGSET_T@
+# if !GNULIB_defined_sigset_t
+typedef unsigned int sigset_t;
+# define GNULIB_defined_sigset_t 1
+# endif
+#endif
+
+/* Define sighandler_t, the type of signal handlers. A GNU extension. */
+#if !@HAVE_SIGHANDLER_T@
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_sighandler_t
+typedef void (*sighandler_t) (int);
+# define GNULIB_defined_sighandler_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+#endif
+
+
+#if @GNULIB_SIGNAL_H_SIGPIPE@
+# ifndef SIGPIPE
+/* Define SIGPIPE to a value that does not overlap with other signals. */
+# define SIGPIPE 13
+# define GNULIB_defined_SIGPIPE 1
+/* To actually use SIGPIPE, you also need the gnulib modules 'sigprocmask',
+ 'write', 'stdio'. */
+# endif
+#endif
+
+
+/* Maximum signal number + 1. */
+#ifndef NSIG
+# if defined __TANDEM
+# define NSIG 32
+# endif
+#endif
+
+
+#if @GNULIB_PTHREAD_SIGMASK@
+# if @REPLACE_PTHREAD_SIGMASK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pthread_sigmask
+# define pthread_sigmask rpl_pthread_sigmask
+# endif
+_GL_FUNCDECL_RPL (pthread_sigmask, int,
+ (int how,
+ const sigset_t *restrict new_mask,
+ sigset_t *restrict old_mask));
+_GL_CXXALIAS_RPL (pthread_sigmask, int,
+ (int how,
+ const sigset_t *restrict new_mask,
+ sigset_t *restrict old_mask));
+# else
+# if !(@HAVE_PTHREAD_SIGMASK@ || defined pthread_sigmask)
+_GL_FUNCDECL_SYS (pthread_sigmask, int,
+ (int how,
+ const sigset_t *restrict new_mask,
+ sigset_t *restrict old_mask));
+# endif
+_GL_CXXALIAS_SYS (pthread_sigmask, int,
+ (int how,
+ const sigset_t *restrict new_mask,
+ sigset_t *restrict old_mask));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (pthread_sigmask);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef pthread_sigmask
+# if HAVE_RAW_DECL_PTHREAD_SIGMASK
+_GL_WARN_ON_USE (pthread_sigmask, "pthread_sigmask is not portable - "
+ "use gnulib module pthread_sigmask for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RAISE@
+# if @REPLACE_RAISE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef raise
+# define raise rpl_raise
+# endif
+_GL_FUNCDECL_RPL (raise, int, (int sig));
+_GL_CXXALIAS_RPL (raise, int, (int sig));
+# else
+# if !@HAVE_RAISE@
+_GL_FUNCDECL_SYS (raise, int, (int sig));
+# endif
+_GL_CXXALIAS_SYS (raise, int, (int sig));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (raise);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef raise
+/* Assume raise is always declared. */
+_GL_WARN_ON_USE (raise, "raise can crash on native Windows - "
+ "use gnulib module raise for portability");
+#endif
+
+
+#if @GNULIB_SIGPROCMASK@
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+
+# ifndef GNULIB_defined_signal_blocking
+# define GNULIB_defined_signal_blocking 1
+# endif
+
+/* Maximum signal number + 1. */
+# ifndef NSIG
+# define NSIG 32
+# endif
+
+/* This code supports only 32 signals. */
+# if !GNULIB_defined_verify_NSIG_constraint
+typedef int verify_NSIG_constraint[NSIG <= 32 ? 1 : -1];
+# define GNULIB_defined_verify_NSIG_constraint 1
+# endif
+
+# endif
+
+/* When also using extern inline, suppress the use of static inline in
+ standard headers of problematic Apple configurations, as Libc at
+ least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
+ <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
+ Perhaps Apple will fix this some day. */
+#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
+ && (defined __i386__ || defined __x86_64__))
+# undef sigaddset
+# undef sigdelset
+# undef sigemptyset
+# undef sigfillset
+# undef sigismember
+#endif
+
+/* Test whether a given signal is contained in a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on Mac OS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigismember
+# endif
+# else
+_GL_FUNCDECL_SYS (sigismember, int, (const sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigismember, int, (const sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigismember);
+
+/* Initialize a signal set to the empty set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on Mac OS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigemptyset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigemptyset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigemptyset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigemptyset);
+
+/* Add a signal to a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on Mac OS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigaddset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigaddset, int, (sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigaddset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigaddset);
+
+/* Remove a signal from a signal set. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on Mac OS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigdelset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigdelset, int, (sigset_t *set, int sig)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigdelset, int, (sigset_t *set, int sig));
+_GL_CXXALIASWARN (sigdelset);
+
+/* Fill a signal set with all possible signals. */
+# if @HAVE_POSIX_SIGNALBLOCKING@
+/* This function is defined as a macro on Mac OS X. */
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+# undef sigfillset
+# endif
+# else
+_GL_FUNCDECL_SYS (sigfillset, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigfillset, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigfillset);
+
+/* Return the set of those blocked signals that are pending. */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+_GL_FUNCDECL_SYS (sigpending, int, (sigset_t *set) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (sigpending, int, (sigset_t *set));
+_GL_CXXALIASWARN (sigpending);
+
+/* If OLD_SET is not NULL, put the current set of blocked signals in *OLD_SET.
+ Then, if SET is not NULL, affect the current set of blocked signals by
+ combining it with *SET as indicated in OPERATION.
+ In this implementation, you are not allowed to change a signal handler
+ while the signal is blocked. */
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+# define SIG_BLOCK 0 /* blocked_set = blocked_set | *set; */
+# define SIG_SETMASK 1 /* blocked_set = *set; */
+# define SIG_UNBLOCK 2 /* blocked_set = blocked_set & ~*set; */
+_GL_FUNCDECL_SYS (sigprocmask, int,
+ (int operation,
+ const sigset_t *restrict set,
+ sigset_t *restrict old_set));
+# endif
+_GL_CXXALIAS_SYS (sigprocmask, int,
+ (int operation,
+ const sigset_t *restrict set,
+ sigset_t *restrict old_set));
+_GL_CXXALIASWARN (sigprocmask);
+
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+# ifdef __cplusplus
+extern "C" {
+# endif
+# if !GNULIB_defined_function_taking_int_returning_void_t
+typedef void (*_gl_function_taking_int_returning_void_t) (int);
+# define GNULIB_defined_function_taking_int_returning_void_t 1
+# endif
+# ifdef __cplusplus
+}
+# endif
+# if !@HAVE_POSIX_SIGNALBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define signal rpl_signal
+# endif
+_GL_FUNCDECL_RPL (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+_GL_CXXALIAS_RPL (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+# else
+/* On OpenBSD, the declaration of 'signal' may not be present at this point,
+ because it occurs in <sys/signal.h>, not <signal.h> directly. */
+# if defined __OpenBSD__
+_GL_FUNCDECL_SYS (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+# endif
+_GL_CXXALIAS_SYS (signal, _gl_function_taking_int_returning_void_t,
+ (int sig, _gl_function_taking_int_returning_void_t func));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (signal);
+# endif
+
+# if !@HAVE_POSIX_SIGNALBLOCKING@ && GNULIB_defined_SIGPIPE
+/* Raise signal SIGPIPE. */
+_GL_EXTERN_C int _gl_raise_SIGPIPE (void);
+# endif
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaddset
+# if HAVE_RAW_DECL_SIGADDSET
+_GL_WARN_ON_USE (sigaddset, "sigaddset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigdelset
+# if HAVE_RAW_DECL_SIGDELSET
+_GL_WARN_ON_USE (sigdelset, "sigdelset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigemptyset
+# if HAVE_RAW_DECL_SIGEMPTYSET
+_GL_WARN_ON_USE (sigemptyset, "sigemptyset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigfillset
+# if HAVE_RAW_DECL_SIGFILLSET
+_GL_WARN_ON_USE (sigfillset, "sigfillset is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigismember
+# if HAVE_RAW_DECL_SIGISMEMBER
+_GL_WARN_ON_USE (sigismember, "sigismember is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigpending
+# if HAVE_RAW_DECL_SIGPENDING
+_GL_WARN_ON_USE (sigpending, "sigpending is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+# undef sigprocmask
+# if HAVE_RAW_DECL_SIGPROCMASK
+_GL_WARN_ON_USE (sigprocmask, "sigprocmask is unportable - "
+ "use the gnulib module sigprocmask for portability");
+# endif
+#endif /* @GNULIB_SIGPROCMASK@ */
+
+
+#if @GNULIB_SIGACTION@
+# if !@HAVE_SIGACTION@
+
+# if !@HAVE_SIGINFO_T@
+
+# if !GNULIB_defined_siginfo_types
+
+/* Present to allow compilation, but unsupported by gnulib. */
+union sigval
+{
+ int sival_int;
+ void *sival_ptr;
+};
+
+/* Present to allow compilation, but unsupported by gnulib. */
+struct siginfo_t
+{
+ int si_signo;
+ int si_code;
+ int si_errno;
+ pid_t si_pid;
+ uid_t si_uid;
+ void *si_addr;
+ int si_status;
+ long si_band;
+ union sigval si_value;
+};
+typedef struct siginfo_t siginfo_t;
+
+# define GNULIB_defined_siginfo_types 1
+# endif
+
+# endif /* !@HAVE_SIGINFO_T@ */
+
+/* We assume that platforms which lack the sigaction() function also lack
+ the 'struct sigaction' type, and vice versa. */
+
+# if !GNULIB_defined_struct_sigaction
+
+struct sigaction
+{
+ union
+ {
+ void (*_sa_handler) (int);
+ /* Present to allow compilation, but unsupported by gnulib. POSIX
+ says that implementations may, but not must, make sa_sigaction
+ overlap with sa_handler, but we know of no implementation where
+ they do not overlap. */
+ void (*_sa_sigaction) (int, siginfo_t *, void *);
+ } _sa_func;
+ sigset_t sa_mask;
+ /* Not all POSIX flags are supported. */
+ int sa_flags;
+};
+# define sa_handler _sa_func._sa_handler
+# define sa_sigaction _sa_func._sa_sigaction
+/* Unsupported flags are not present. */
+# define SA_RESETHAND 1
+# define SA_NODEFER 2
+# define SA_RESTART 4
+
+# define GNULIB_defined_struct_sigaction 1
+# endif
+
+_GL_FUNCDECL_SYS (sigaction, int, (int, const struct sigaction *restrict,
+ struct sigaction *restrict));
+
+# elif !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+
+# define sa_sigaction sa_handler
+
+# endif /* !@HAVE_SIGACTION@, !@HAVE_STRUCT_SIGACTION_SA_SIGACTION@ */
+
+_GL_CXXALIAS_SYS (sigaction, int, (int, const struct sigaction *restrict,
+ struct sigaction *restrict));
+_GL_CXXALIASWARN (sigaction);
+
+#elif defined GNULIB_POSIXCHECK
+# undef sigaction
+# if HAVE_RAW_DECL_SIGACTION
+_GL_WARN_ON_USE (sigaction, "sigaction is unportable - "
+ "use the gnulib module sigaction for portability");
+# endif
+#endif
+
+/* Some systems don't have SA_NODEFER. */
+#ifndef SA_NODEFER
+# define SA_NODEFER 0
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SIGNAL_H */
+#endif /* _@GUARD_PREFIX@_SIGNAL_H */
+#endif
diff --git a/lib/sigprocmask.c b/lib/sigprocmask.c
new file mode 100644
index 0000000..d186106
--- /dev/null
+++ b/lib/sigprocmask.c
@@ -0,0 +1,349 @@
+/* POSIX compatible signal blocking.
+ Copyright (C) 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2006.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <signal.h>
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+/* We assume that a platform without POSIX signal blocking functions
+ also does not have the POSIX sigaction() function, only the
+ signal() function. We also assume signal() has SysV semantics,
+ where any handler is uninstalled prior to being invoked. This is
+ true for native Windows platforms. */
+
+/* We use raw signal(), but also provide a wrapper rpl_signal() so
+ that applications can query or change a blocked signal. */
+#undef signal
+
+/* Provide invalid signal numbers as fallbacks if the uncatchable
+ signals are not defined. */
+#ifndef SIGKILL
+# define SIGKILL (-1)
+#endif
+#ifndef SIGSTOP
+# define SIGSTOP (-1)
+#endif
+
+/* On native Windows, as of 2008, the signal SIGABRT_COMPAT is an alias
+ for the signal SIGABRT. Only one signal handler is stored for both
+ SIGABRT and SIGABRT_COMPAT. SIGABRT_COMPAT is not a signal of its own. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef SIGABRT_COMPAT
+# define SIGABRT_COMPAT 6
+#endif
+#ifdef SIGABRT_COMPAT
+# define SIGABRT_COMPAT_MASK (1U << SIGABRT_COMPAT)
+#else
+# define SIGABRT_COMPAT_MASK 0
+#endif
+
+typedef void (*handler_t) (int);
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static handler_t
+signal_nothrow (int sig, handler_t handler)
+{
+ handler_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = signal (sig, handler);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = SIG_ERR;
+ errno = EINVAL;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# define signal signal_nothrow
+#endif
+
+/* Handling of gnulib defined signals. */
+
+#if GNULIB_defined_SIGPIPE
+static handler_t SIGPIPE_handler = SIG_DFL;
+#endif
+
+#if GNULIB_defined_SIGPIPE
+static handler_t
+ext_signal (int sig, handler_t handler)
+{
+ switch (sig)
+ {
+ case SIGPIPE:
+ {
+ handler_t old_handler = SIGPIPE_handler;
+ SIGPIPE_handler = handler;
+ return old_handler;
+ }
+ default: /* System defined signal */
+ return signal (sig, handler);
+ }
+}
+# undef signal
+# define signal ext_signal
+#endif
+
+int
+sigismember (const sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ return (*set >> sig) & 1;
+ }
+ else
+ return 0;
+}
+
+int
+sigemptyset (sigset_t *set)
+{
+ *set = 0;
+ return 0;
+}
+
+int
+sigaddset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set |= 1U << sig;
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+int
+sigdelset (sigset_t *set, int sig)
+{
+ if (sig >= 0 && sig < NSIG)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ *set &= ~(1U << sig);
+ return 0;
+ }
+ else
+ {
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+
+int
+sigfillset (sigset_t *set)
+{
+ *set = ((2U << (NSIG - 1)) - 1) & ~ SIGABRT_COMPAT_MASK;
+ return 0;
+}
+
+/* Set of currently blocked signals. */
+static volatile sigset_t blocked_set /* = 0 */;
+
+/* Set of currently blocked and pending signals. */
+static volatile sig_atomic_t pending_array[NSIG] /* = { 0 } */;
+
+/* Signal handler that is installed for blocked signals. */
+static void
+blocked_handler (int sig)
+{
+ /* Reinstall the handler, in case the signal occurs multiple times
+ while blocked. There is an inherent race where an asynchronous
+ signal in between when the kernel uninstalled the handler and
+ when we reinstall it will trigger the default handler; oh
+ well. */
+ signal (sig, blocked_handler);
+ if (sig >= 0 && sig < NSIG)
+ pending_array[sig] = 1;
+}
+
+int
+sigpending (sigset_t *set)
+{
+ sigset_t pending = 0;
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (pending_array[sig])
+ pending |= 1U << sig;
+ *set = pending;
+ return 0;
+}
+
+/* The previous signal handlers.
+ Only the array elements corresponding to blocked signals are relevant. */
+static volatile handler_t old_handlers[NSIG];
+
+int
+sigprocmask (int operation, const sigset_t *set, sigset_t *old_set)
+{
+ if (old_set != NULL)
+ *old_set = blocked_set;
+
+ if (set != NULL)
+ {
+ sigset_t new_blocked_set;
+ sigset_t to_unblock;
+ sigset_t to_block;
+
+ switch (operation)
+ {
+ case SIG_BLOCK:
+ new_blocked_set = blocked_set | *set;
+ break;
+ case SIG_SETMASK:
+ new_blocked_set = *set;
+ break;
+ case SIG_UNBLOCK:
+ new_blocked_set = blocked_set & ~*set;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ to_unblock = blocked_set & ~new_blocked_set;
+ to_block = new_blocked_set & ~blocked_set;
+
+ if (to_block != 0)
+ {
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_block >> sig) & 1)
+ {
+ pending_array[sig] = 0;
+ if ((old_handlers[sig] = signal (sig, blocked_handler)) != SIG_ERR)
+ blocked_set |= 1U << sig;
+ }
+ }
+
+ if (to_unblock != 0)
+ {
+ sig_atomic_t received[NSIG];
+ int sig;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if ((to_unblock >> sig) & 1)
+ {
+ if (signal (sig, old_handlers[sig]) != blocked_handler)
+ /* The application changed a signal handler while the signal
+ was blocked, bypassing our rpl_signal replacement.
+ We don't support this. */
+ abort ();
+ received[sig] = pending_array[sig];
+ blocked_set &= ~(1U << sig);
+ pending_array[sig] = 0;
+ }
+ else
+ received[sig] = 0;
+
+ for (sig = 0; sig < NSIG; sig++)
+ if (received[sig])
+ raise (sig);
+ }
+ }
+ return 0;
+}
+
+/* Install the handler FUNC for signal SIG, and return the previous
+ handler. */
+handler_t
+rpl_signal (int sig, handler_t handler)
+{
+ /* We must provide a wrapper, so that a user can query what handler
+ they installed even if that signal is currently blocked. */
+ if (sig >= 0 && sig < NSIG && sig != SIGKILL && sig != SIGSTOP
+ && handler != SIG_ERR)
+ {
+ #ifdef SIGABRT_COMPAT
+ if (sig == SIGABRT_COMPAT)
+ sig = SIGABRT;
+ #endif
+
+ if (blocked_set & (1U << sig))
+ {
+ /* POSIX states that sigprocmask and signal are both
+ async-signal-safe. This is not true of our
+ implementation - there is a slight data race where an
+ asynchronous interrupt on signal A can occur after we
+ install blocked_handler but before we have updated
+ old_handlers for signal B, such that handler A can see
+ stale information if it calls signal(B). Oh well -
+ signal handlers really shouldn't try to manipulate the
+ installed handlers of unrelated signals. */
+ handler_t result = old_handlers[sig];
+ old_handlers[sig] = handler;
+ return result;
+ }
+ else
+ return signal (sig, handler);
+ }
+ else
+ {
+ errno = EINVAL;
+ return SIG_ERR;
+ }
+}
+
+#if GNULIB_defined_SIGPIPE
+/* Raise the signal SIGPIPE. */
+int
+_gl_raise_SIGPIPE (void)
+{
+ if (blocked_set & (1U << SIGPIPE))
+ pending_array[SIGPIPE] = 1;
+ else
+ {
+ handler_t handler = SIGPIPE_handler;
+ if (handler == SIG_DFL)
+ exit (128 + SIGPIPE);
+ else if (handler != SIG_IGN)
+ (*handler) (SIGPIPE);
+ }
+ return 0;
+}
+#endif
diff --git a/lib/size_max.h b/lib/size_max.h
new file mode 100644
index 0000000..f6ab19f
--- /dev/null
+++ b/lib/size_max.h
@@ -0,0 +1,30 @@
+/* size_max.h -- declare SIZE_MAX through system headers
+ Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef GNULIB_SIZE_MAX_H
+#define GNULIB_SIZE_MAX_H
+
+/* Get SIZE_MAX declaration on systems like Solaris 7/8/9. */
+# include <limits.h>
+/* Get SIZE_MAX declaration on systems like glibc 2. */
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+/* On systems where these include files don't define it, SIZE_MAX is defined
+ in config.h. */
+
+#endif /* GNULIB_SIZE_MAX_H */
diff --git a/lib/snprintf.c b/lib/snprintf.c
new file mode 100644
index 0000000..0475a67
--- /dev/null
+++ b/lib/snprintf.c
@@ -0,0 +1,71 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Paul Eggert.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to sprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+snprintf (char *str, size_t size, const char *format, ...)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+ va_list args;
+
+ va_start (args, format);
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+ va_end (args);
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (INT_MAX < len)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/lib/socket.c b/lib/socket.c
new file mode 100644
index 0000000..34e59ca
--- /dev/null
+++ b/lib/socket.c
@@ -0,0 +1,53 @@
+/* socket.c --- wrappers for Windows socket function
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <config.h>
+
+#define WIN32_LEAN_AND_MEAN
+/* Get winsock2.h. */
+#include <sys/socket.h>
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+#include "w32sock.h"
+
+#include "sockets.h"
+
+/* Don't assume that UNICODE is defined. */
+#undef WSASocket
+#define WSASocket WSASocketW
+
+int
+rpl_socket (int domain, int type, int protocol)
+{
+ SOCKET fh;
+
+ gl_sockets_startup (SOCKETS_1_1);
+
+ /* We have to use WSASocket() to create non-overlapped IO sockets.
+ Overlapped IO sockets cannot be used with read/write. */
+ fh = WSASocket (domain, type, protocol, NULL, 0, 0);
+
+ if (fh == INVALID_SOCKET)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return SOCKET_TO_FD (fh);
+}
diff --git a/lib/sockets.c b/lib/sockets.c
new file mode 100644
index 0000000..9e3251a
--- /dev/null
+++ b/lib/sockets.c
@@ -0,0 +1,161 @@
+/* sockets.c --- wrappers for Windows socket functions
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Simon Josefsson */
+
+#include <config.h>
+
+/* Specification. */
+#include "sockets.h"
+
+#if WINDOWS_SOCKETS
+
+/* This includes winsock2.h on MinGW. */
+# include <sys/socket.h>
+
+# include "fd-hook.h"
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Get set_winsock_errno, FD_TO_SOCKET etc. */
+# include "w32sock.h"
+
+static int
+close_fd_maybe_socket (const struct fd_hook *remaining_list,
+ gl_close_fn primary,
+ int fd)
+{
+ /* Note about multithread-safety: There is a race condition where, between
+ our calls to closesocket() and the primary close(), some other thread
+ could make system calls that allocate precisely the same HANDLE value
+ as sock; then the primary close() would call CloseHandle() on it. */
+ SOCKET sock;
+ WSANETWORKEVENTS ev;
+
+ /* Test whether fd refers to a socket. */
+ sock = FD_TO_SOCKET (fd);
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents (sock, NULL, &ev);
+ if (ev.lNetworkEvents != 0xDEADBEEF)
+ {
+ /* fd refers to a socket. */
+ /* FIXME: other applications, like squid, use an undocumented
+ _free_osfhnd free function. But this is not enough: The 'osfile'
+ flags for fd also needs to be cleared, but it is hard to access it.
+ Instead, here we just close twice the file descriptor. */
+ if (closesocket (sock))
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ {
+ /* This call frees the file descriptor and does a
+ CloseHandle ((HANDLE) _get_osfhandle (fd)), which fails. */
+ _close (fd);
+ return 0;
+ }
+ }
+ else
+ /* Some other type of file descriptor. */
+ return execute_close_hooks (remaining_list, primary, fd);
+}
+
+static int
+ioctl_fd_maybe_socket (const struct fd_hook *remaining_list,
+ gl_ioctl_fn primary,
+ int fd, int request, void *arg)
+{
+ SOCKET sock;
+ WSANETWORKEVENTS ev;
+
+ /* Test whether fd refers to a socket. */
+ sock = FD_TO_SOCKET (fd);
+ ev.lNetworkEvents = 0xDEADBEEF;
+ WSAEnumNetworkEvents (sock, NULL, &ev);
+ if (ev.lNetworkEvents != 0xDEADBEEF)
+ {
+ /* fd refers to a socket. */
+ if (ioctlsocket (sock, request, arg) < 0)
+ {
+ set_winsock_errno ();
+ return -1;
+ }
+ else
+ return 0;
+ }
+ else
+ /* Some other type of file descriptor. */
+ return execute_ioctl_hooks (remaining_list, primary, fd, request, arg);
+}
+
+static struct fd_hook fd_sockets_hook;
+
+static int initialized_sockets_version /* = 0 */;
+
+#endif /* WINDOWS_SOCKETS */
+
+int
+gl_sockets_startup (int version _GL_UNUSED)
+{
+#if WINDOWS_SOCKETS
+ if (version > initialized_sockets_version)
+ {
+ WSADATA data;
+ int err;
+
+ err = WSAStartup (version, &data);
+ if (err != 0)
+ return 1;
+
+ if (data.wVersion != version)
+ {
+ WSACleanup ();
+ return 2;
+ }
+
+ if (initialized_sockets_version == 0)
+ register_fd_hook (close_fd_maybe_socket, ioctl_fd_maybe_socket,
+ &fd_sockets_hook);
+
+ initialized_sockets_version = version;
+ }
+#endif
+
+ return 0;
+}
+
+int
+gl_sockets_cleanup (void)
+{
+#if WINDOWS_SOCKETS
+ int err;
+
+ initialized_sockets_version = 0;
+
+ unregister_fd_hook (&fd_sockets_hook);
+
+ err = WSACleanup ();
+ if (err != 0)
+ return 1;
+#endif
+
+ return 0;
+}
diff --git a/lib/sockets.h b/lib/sockets.h
new file mode 100644
index 0000000..4575fc5
--- /dev/null
+++ b/lib/sockets.h
@@ -0,0 +1,66 @@
+/* sockets.h - wrappers for Windows socket functions
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Simon Josefsson */
+
+#ifndef SOCKETS_H
+#define SOCKETS_H 1
+
+#define SOCKETS_1_0 0x0001
+#define SOCKETS_1_1 0x0101
+#define SOCKETS_2_0 0x0002
+#define SOCKETS_2_1 0x0102
+#define SOCKETS_2_2 0x0202
+
+int gl_sockets_startup (int version)
+#ifndef WINDOWS_SOCKETS
+ _GL_ATTRIBUTE_CONST
+#endif
+ ;
+
+int gl_sockets_cleanup (void)
+#ifndef WINDOWS_SOCKETS
+ _GL_ATTRIBUTE_CONST
+#endif
+ ;
+
+/* This function is useful it you create a socket using gnulib's
+ Winsock wrappers but needs to pass on the socket handle to some
+ other library that only accepts sockets. */
+#ifdef WINDOWS_SOCKETS
+
+# include <sys/socket.h>
+
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+static inline SOCKET
+gl_fd_to_handle (int fd)
+{
+ return _get_osfhandle (fd);
+}
+
+#else
+
+# define gl_fd_to_handle(x) (x)
+
+#endif /* WINDOWS_SOCKETS */
+
+#endif /* SOCKETS_H */
diff --git a/lib/spawn-pipe.c b/lib/spawn-pipe.c
new file mode 100644
index 0000000..768c8b6
--- /dev/null
+++ b/lib/spawn-pipe.c
@@ -0,0 +1,674 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+/* Tell clang not to warn about the 'child' variable, below. */
+#if defined __clang__
+# pragma clang diagnostic ignored "-Wconditional-uninitialized"
+#endif
+
+#include <config.h>
+
+/* Specification. */
+#include "spawn-pipe.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+
+#include "canonicalize.h"
+#include "error.h"
+#include "fatal-signal.h"
+#include "filename.h"
+#include "findprog.h"
+#include "unistd-safer.h"
+#include "wait-process.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+
+/* Choice of implementation for native Windows.
+ - Define to 0 to use the posix_spawn facility (modules 'posix_spawn' and
+ 'posix_spawnp'), that is based on the module 'windows-spawn'.
+ - Define to 1 to use the older code, that uses the module 'windows-spawn'
+ directly.
+ You can set this macro from a Makefile or at configure time, from the
+ CPPFLAGS. */
+#ifndef SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+# define SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN 0
+#endif
+
+
+#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+
+/* Native Windows API. */
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+# include <process.h>
+# include "windows-spawn.h"
+
+#elif defined __KLIBC__
+
+/* OS/2 kLIBC API. */
+# include <process.h>
+# include "os2-spawn.h"
+
+#else
+
+/* Unix API. */
+# include <spawn.h>
+
+#endif
+
+
+#ifdef EINTR
+
+/* EINTR handling for close().
+ These functions can return -1/EINTR even though we don't have any
+ signal handlers set up, namely when we get interrupted via SIGSTOP. */
+
+static int
+nonintr_close (int fd)
+{
+ int retval;
+
+ do
+ retval = close (fd);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+#undef close /* avoid warning related to gnulib module unistd */
+#define close nonintr_close
+
+#if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+static int
+nonintr_open (const char *pathname, int oflag, mode_t mode)
+{
+ int retval;
+
+ do
+ retval = open (pathname, oflag, mode);
+ while (retval < 0 && errno == EINTR);
+
+ return retval;
+}
+# undef open /* avoid warning on VMS */
+# define open nonintr_open
+#endif
+
+#endif
+
+
+/* Open a pipe connected to a child process.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child if pipe_stdin
+ * parent <- fd[0] <- STDOUT_FILENO <- child if pipe_stdout
+ * read system write
+ *
+ * At least one of pipe_stdin, pipe_stdout must be true.
+ * pipe_stdin and prog_stdin together determine the child's standard input.
+ * pipe_stdout and prog_stdout together determine the child's standard output.
+ * If pipe_stdin is true, prog_stdin is ignored.
+ * If pipe_stdout is true, prog_stdout is ignored.
+ */
+static pid_t
+create_pipe (const char *progname,
+ const char *prog_path,
+ const char * const *prog_argv,
+ const char *directory,
+ bool pipe_stdin, bool pipe_stdout,
+ const char *prog_stdin, const char *prog_stdout,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+ int saved_errno;
+ char *prog_path_to_free = NULL;
+
+ if (directory != NULL)
+ {
+ /* If a change of directory is requested, make sure PROG_PATH is absolute
+ before we do so. This is needed because
+ - posix_spawn and posix_spawnp are required to resolve a relative
+ PROG_PATH *after* changing the directory. See
+ <https://www.austingroupbugs.net/view.php?id=1208>:
+ "if this pathname does not start with a <slash> it shall be
+ interpreted relative to the working directory of the child
+ process _after_ all file_actions have been performed."
+ But this would be a surprising application behaviour, possibly
+ even security relevant.
+ - For the Windows CreateProcess() function, it is unspecified whether
+ a relative file name is interpreted to the parent's current
+ directory or to the specified directory. See
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa> */
+ if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+ {
+ const char *resolved_prog =
+ find_in_given_path (prog_path, getenv ("PATH"), NULL, false);
+ if (resolved_prog == NULL)
+ goto fail_with_errno;
+ if (resolved_prog != prog_path)
+ prog_path_to_free = (char *) resolved_prog;
+ prog_path = resolved_prog;
+
+ if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+ {
+ char *absolute_prog =
+ canonicalize_filename_mode (prog_path, CAN_MISSING | CAN_NOLINKS);
+ if (absolute_prog == NULL)
+ {
+ saved_errno = errno;
+ free (prog_path_to_free);
+ goto fail_with_saved_errno;
+ }
+ free (prog_path_to_free);
+ prog_path_to_free = absolute_prog;
+ prog_path = absolute_prog;
+
+ if (! IS_ABSOLUTE_FILE_NAME (prog_path))
+ abort ();
+ }
+ }
+ }
+
+#if ((defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN) || defined __KLIBC__
+
+ /* Native Windows API.
+ This uses _pipe(), dup2(), and _spawnv(). It could also be implemented
+ using the low-level functions CreatePipe(), DuplicateHandle(),
+ CreateProcess() and _open_osfhandle(); see the GNU make and GNU clisp
+ and cvs source code. */
+ char *argv_mem_to_free;
+ int ifd[2];
+ int ofd[2];
+ int child;
+ int nulloutfd;
+ int stdinfd;
+ int stdoutfd;
+
+ const char **argv = prepare_spawn (prog_argv, &argv_mem_to_free);
+ if (argv == NULL)
+ xalloc_die ();
+
+ if (pipe_stdout)
+ if (pipe2_safer (ifd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe2_safer (ofd, O_BINARY | O_CLOEXEC) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ child = -1;
+
+# if (defined _WIN32 && !defined __CYGWIN__) && SPAWN_PIPE_IMPL_AVOID_POSIX_SPAWN
+ bool must_close_ifd1 = pipe_stdout;
+ bool must_close_ofd0 = pipe_stdin;
+
+ /* Create standard file handles of child process. */
+ HANDLE stdin_handle = INVALID_HANDLE_VALUE;
+ HANDLE stdout_handle = INVALID_HANDLE_VALUE;
+ nulloutfd = -1;
+ stdinfd = -1;
+ stdoutfd = -1;
+ if ((!null_stderr
+ || (nulloutfd = open ("NUL", O_RDWR, 0)) >= 0)
+ && (pipe_stdin
+ || prog_stdin == NULL
+ || (stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0)
+ && (pipe_stdout
+ || prog_stdout == NULL
+ || (stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0))
+ /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
+ but it inherits the three STD*_FILENO for which we pass the handles. */
+ /* Pass the environment explicitly. This is needed if the program has
+ modified the environment using putenv() or [un]setenv(). On Windows,
+ processes have two environments, one in the "environment block" of the
+ process and managed through SetEnvironmentVariable(), and one inside the
+ process, in the location retrieved by the 'environ' macro. If we were
+ to pass NULL, the child process would inherit a copy of the environment
+ block - ignoring the effects of putenv() and [un]setenv(). */
+ {
+ stdin_handle =
+ (HANDLE) _get_osfhandle (pipe_stdin ? ofd[0] :
+ prog_stdin == NULL ? STDIN_FILENO : stdinfd);
+ if (pipe_stdin)
+ {
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE duplicate;
+ if (!DuplicateHandle (curr_process, stdin_handle,
+ curr_process, &duplicate,
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ errno = EBADF; /* arbitrary */
+ goto failed;
+ }
+ must_close_ofd0 = false;
+ close (ofd[0]); /* implies CloseHandle (stdin_handle); */
+ stdin_handle = duplicate;
+ }
+ stdout_handle =
+ (HANDLE) _get_osfhandle (pipe_stdout ? ifd[1] :
+ prog_stdout == NULL ? STDOUT_FILENO : stdoutfd);
+ if (pipe_stdout)
+ {
+ HANDLE curr_process = GetCurrentProcess ();
+ HANDLE duplicate;
+ if (!DuplicateHandle (curr_process, stdout_handle,
+ curr_process, &duplicate,
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ errno = EBADF; /* arbitrary */
+ goto failed;
+ }
+ must_close_ifd1 = false;
+ close (ifd[1]); /* implies CloseHandle (stdout_handle); */
+ stdout_handle = duplicate;
+ }
+ HANDLE stderr_handle =
+ (HANDLE) _get_osfhandle (null_stderr ? nulloutfd : STDERR_FILENO);
+
+ child = spawnpvech (P_NOWAIT, prog_path, argv + 1,
+ (const char * const *) environ, directory,
+ stdin_handle, stdout_handle, stderr_handle);
+# if 0 /* Executing arbitrary files as shell scripts is unsecure. */
+ if (child == -1 && errno == ENOEXEC)
+ {
+ /* prog is not a native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to argv. */
+ argv[1] = prog_path;
+ child = spawnpvech (P_NOWAIT, argv[0], argv,
+ (const char * const *) environ, directory,
+ stdin_handle, stdout_handle, stderr_handle);
+ }
+# endif
+ }
+ failed:
+ if (child == -1)
+ saved_errno = errno;
+ if (stdinfd >= 0)
+ close (stdinfd);
+ if (stdoutfd >= 0)
+ close (stdoutfd);
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+
+ if (pipe_stdin)
+ {
+ if (must_close_ofd0)
+ close (ofd[0]);
+ else
+ if (stdin_handle != INVALID_HANDLE_VALUE)
+ CloseHandle (stdin_handle);
+ }
+ if (pipe_stdout)
+ {
+ if (must_close_ifd1)
+ close (ifd[1]);
+ else
+ if (stdout_handle != INVALID_HANDLE_VALUE)
+ CloseHandle (stdout_handle);
+ }
+
+# else /* __KLIBC__ */
+ if (!(directory == NULL && strcmp (directory, ".") == 0))
+ {
+ /* A directory argument is not supported in this implementation. */
+ saved_errno = EINVAL;
+ goto fail_with_saved_errno;
+ }
+
+ int orig_stdin;
+ int orig_stdout;
+ int orig_stderr;
+
+ /* Save standard file handles of parent process. */
+ if (pipe_stdin || prog_stdin != NULL)
+ orig_stdin = dup_safer_noinherit (STDIN_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ orig_stdout = dup_safer_noinherit (STDOUT_FILENO);
+ if (null_stderr)
+ orig_stderr = dup_safer_noinherit (STDERR_FILENO);
+
+ /* Create standard file handles of child process. */
+ nulloutfd = -1;
+ stdinfd = -1;
+ stdoutfd = -1;
+ if ((!pipe_stdin || dup2 (ofd[0], STDIN_FILENO) >= 0)
+ && (!pipe_stdout || dup2 (ifd[1], STDOUT_FILENO) >= 0)
+ && (!null_stderr
+ || ((nulloutfd = open ("NUL", O_RDWR, 0)) >= 0
+ && (nulloutfd == STDERR_FILENO
+ || (dup2 (nulloutfd, STDERR_FILENO) >= 0
+ && close (nulloutfd) >= 0))))
+ && (pipe_stdin
+ || prog_stdin == NULL
+ || ((stdinfd = open (prog_stdin, O_RDONLY, 0)) >= 0
+ && (stdinfd == STDIN_FILENO
+ || (dup2 (stdinfd, STDIN_FILENO) >= 0
+ && close (stdinfd) >= 0))))
+ && (pipe_stdout
+ || prog_stdout == NULL
+ || ((stdoutfd = open (prog_stdout, O_WRONLY, 0)) >= 0
+ && (stdoutfd == STDOUT_FILENO
+ || (dup2 (stdoutfd, STDOUT_FILENO) >= 0
+ && close (stdoutfd) >= 0)))))
+ /* The child process doesn't inherit ifd[0], ifd[1], ofd[0], ofd[1],
+ but it inherits all open()ed or dup2()ed file handles (which is what
+ we want in the case of STD*_FILENO). */
+ {
+ child = _spawnvpe (P_NOWAIT, prog_path, argv + 1,
+ (const char **) environ);
+# if 0 /* Executing arbitrary files as shell scripts is unsecure. */
+ if (child == -1 && errno == ENOEXEC)
+ {
+ /* prog is not a native executable. Try to execute it as a
+ shell script. Note that prepare_spawn() has already prepended
+ a hidden element "sh.exe" to argv. */
+ child = _spawnvpe (P_NOWAIT, argv[0], argv,
+ (const char **) environ);
+ }
+# endif
+ }
+ if (child == -1)
+ saved_errno = errno;
+ if (stdinfd >= 0)
+ close (stdinfd);
+ if (stdoutfd >= 0)
+ close (stdoutfd);
+ if (nulloutfd >= 0)
+ close (nulloutfd);
+
+ /* Restore standard file handles of parent process. */
+ if (null_stderr)
+ undup_safer_noinherit (orig_stderr, STDERR_FILENO);
+ if (pipe_stdout || prog_stdout != NULL)
+ undup_safer_noinherit (orig_stdout, STDOUT_FILENO);
+ if (pipe_stdin || prog_stdin != NULL)
+ undup_safer_noinherit (orig_stdin, STDIN_FILENO);
+
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+# endif
+
+ free (argv);
+ free (argv_mem_to_free);
+ free (prog_path_to_free);
+
+ if (child == -1)
+ {
+ if (pipe_stdout)
+ close (ifd[0]);
+ if (pipe_stdin)
+ close (ofd[1]);
+ goto fail_with_saved_errno;
+ }
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#else
+
+ /* Unix API. */
+ int ifd[2];
+ int ofd[2];
+ sigset_t blocked_signals;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+
+ if (pipe_stdout)
+ if (pipe_safer (ifd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+ if (pipe_stdin)
+ if (pipe_safer (ofd) < 0)
+ error (EXIT_FAILURE, errno, _("cannot create pipe"));
+/* Data flow diagram:
+ *
+ * write system read
+ * parent -> ofd[1] -> ofd[0] -> child if pipe_stdin
+ * parent <- ifd[0] <- ifd[1] <- child if pipe_stdout
+ * read system write
+ *
+ */
+
+ if (slave_process)
+ {
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ block_fatal_signals ();
+ }
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (pipe_stdin
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ofd[0], STDIN_FILENO))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_adddup2 (&actions,
+ ifd[1], STDOUT_FILENO))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[0]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[1]))
+ != 0)
+ || (pipe_stdin
+ && (err = posix_spawn_file_actions_addclose (&actions, ofd[1]))
+ != 0)
+ || (pipe_stdout
+ && (err = posix_spawn_file_actions_addclose (&actions, ifd[0]))
+ != 0)
+ || (null_stderr
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDERR_FILENO,
+ "/dev/null", O_RDWR,
+ 0))
+ != 0)
+ || (!pipe_stdin
+ && prog_stdin != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDIN_FILENO,
+ prog_stdin, O_RDONLY,
+ 0))
+ != 0)
+ || (!pipe_stdout
+ && prog_stdout != NULL
+ && (err = posix_spawn_file_actions_addopen (&actions,
+ STDOUT_FILENO,
+ prog_stdout, O_WRONLY,
+ 0))
+ != 0)
+ || (directory != NULL
+ && (err = posix_spawn_file_actions_addchdir (&actions,
+ directory)))
+ || (slave_process
+ && ((err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+# if defined _WIN32 && !defined __CYGWIN__
+ (err = posix_spawnattr_setpgroup (&attrs, 0)) != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETPGROUP))
+ != 0
+# else
+ (err = posix_spawnattr_setsigmask (&attrs,
+ &blocked_signals))
+ != 0
+ || (err = posix_spawnattr_setflags (&attrs,
+ POSIX_SPAWN_SETSIGMASK))
+ != 0
+# endif
+ ) ) )
+ || (err = (directory != NULL
+ ? posix_spawn (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL,
+ (char * const *) prog_argv, environ)
+ : posix_spawnp (&child, prog_path, &actions,
+ attrs_allocated ? &attrs : NULL,
+ (char * const *) prog_argv, environ)))
+ != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ unblock_fatal_signals ();
+ if (pipe_stdout)
+ {
+ close (ifd[0]);
+ close (ifd[1]);
+ }
+ if (pipe_stdin)
+ {
+ close (ofd[0]);
+ close (ofd[1]);
+ }
+ free (prog_path_to_free);
+ saved_errno = err;
+ goto fail_with_saved_errno;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ if (slave_process)
+ {
+ register_slave_subprocess (child);
+ unblock_fatal_signals ();
+ }
+ if (pipe_stdin)
+ close (ofd[0]);
+ if (pipe_stdout)
+ close (ifd[1]);
+ free (prog_path_to_free);
+
+ if (pipe_stdout)
+ fd[0] = ifd[0];
+ if (pipe_stdin)
+ fd[1] = ofd[1];
+ return child;
+
+#endif
+
+ fail_with_errno:
+ saved_errno = errno;
+ fail_with_saved_errno:
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, saved_errno,
+ _("%s subprocess failed"), progname);
+ errno = saved_errno;
+ return -1;
+}
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ */
+pid_t
+create_pipe_bidi (const char *progname,
+ const char *prog_path, const char * const *prog_argv,
+ const char *directory,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2])
+{
+ pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
+ true, true, NULL, NULL,
+ null_stderr, slave_process, exit_on_error,
+ fd);
+ return result;
+}
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+pid_t
+create_pipe_in (const char *progname,
+ const char *prog_path, const char * const *prog_argv,
+ const char *directory,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
+ false, true, prog_stdin, NULL,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[0];
+ return result;
+}
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ */
+pid_t
+create_pipe_out (const char *progname,
+ const char *prog_path, const char * const *prog_argv,
+ const char *directory,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1])
+{
+ int iofd[2];
+ pid_t result = create_pipe (progname, prog_path, prog_argv, directory,
+ true, false, NULL, prog_stdout,
+ null_stderr, slave_process, exit_on_error,
+ iofd);
+ if (result != -1)
+ fd[0] = iofd[1];
+ return result;
+}
diff --git a/lib/spawn-pipe.h b/lib/spawn-pipe.h
new file mode 100644
index 0000000..a624822
--- /dev/null
+++ b/lib/spawn-pipe.h
@@ -0,0 +1,166 @@
+/* Creation of subprocesses, communicating via pipes.
+ Copyright (C) 2001-2003, 2006, 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _SPAWN_PIPE_H
+#define _SPAWN_PIPE_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* All these functions create a subprocess and don't wait for its termination.
+ They return the process id of the subprocess. They also return in fd[]
+ one or two file descriptors for communication with the subprocess.
+ If the subprocess creation fails: if exit_on_error is true, the main
+ process exits with an error message; otherwise, an error message is given
+ if null_stderr is false, then -1 is returned, with errno set, and fd[]
+ remain uninitialized.
+
+ After finishing communication, the caller should call wait_subprocess()
+ to get rid of the subprocess in the process table.
+
+ progname is the name of the program to be executed by the subprocess, used
+ for error messages.
+ prog_path is the file name of the program to be executed by the subprocess.
+ If it contains no slashes, a search is conducted in $PATH. An operating
+ system dependent suffix is added, if necessary.
+ prog_argv is the array of strings that the subprocess shall receive in
+ argv[]. It is a NULL-terminated array. prog_argv[0] should normally be
+ identical to prog_path.
+
+ If directory is not NULL, the subprocess is started in that directory. If
+ prog_path is a relative file name, it resolved before changing to that
+ directory. The current directory of the current process remains unchanged.
+
+ If slave_process is true, the child process will be terminated when its
+ creator receives a catchable fatal signal or exits normally. If
+ slave_process is false, the child process will continue running in this
+ case, until it is lucky enough to attempt to communicate with its creator
+ and thus get a SIGPIPE signal.
+
+ If exit_on_error is false, a child process id of -1 should be treated the
+ same way as a subprocess which accepts no input, produces no output and
+ terminates with exit code 127. Why? Some errors during posix_spawnp()
+ cause the function posix_spawnp() to return an error code; some other
+ errors cause the subprocess to exit with return code 127. It is
+ implementation dependent which error is reported which way. The caller
+ must treat both cases as equivalent.
+
+ It is recommended that no signal is blocked or ignored (i.e. have a
+ signal handler with value SIG_IGN) while any of these functions is called.
+ The reason is that child processes inherit the mask of blocked signals
+ from their parent (both through posix_spawn() and fork()/exec());
+ likewise, signals ignored in the parent are also ignored in the child
+ (except possibly for SIGCHLD). And POSIX:2001 says [in the description
+ of exec()]:
+ "it should be noted that many existing applications wrongly
+ assume that they start with certain signals set to the default
+ action and/or unblocked. In particular, applications written
+ with a simpler signal model that does not include blocking of
+ signals, such as the one in the ISO C standard, may not behave
+ properly if invoked with some signals blocked. Therefore, it is
+ best not to block or ignore signals across execs without explicit
+ reason to do so, and especially not to block signals across execs
+ of arbitrary (not closely co-operating) programs." */
+
+/* Open a pipe for output to a child process.
+ * The child's stdout goes to a file.
+ *
+ * write system read
+ * parent -> fd[0] -> STDIN_FILENO -> child
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ */
+extern pid_t create_pipe_out (const char *progname,
+ const char *prog_path,
+ const char * const *prog_argv,
+ const char *directory,
+ const char *prog_stdout, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a pipe for input from a child process.
+ * The child's stdin comes from a file.
+ *
+ * read system write
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ *
+ */
+extern pid_t create_pipe_in (const char *progname,
+ const char *prog_path,
+ const char * const *prog_argv,
+ const char *directory,
+ const char *prog_stdin, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[1]);
+
+/* Open a bidirectional pipe.
+ *
+ * write system read
+ * parent -> fd[1] -> STDIN_FILENO -> child
+ * parent <- fd[0] <- STDOUT_FILENO <- child
+ * read system write
+ *
+ * Note: When writing to a child process, it is useful to ignore the SIGPIPE
+ * signal and the EPIPE error code.
+ *
+ * Note: The parent process must be careful to avoid deadlock.
+ * 1) If you write more than PIPE_MAX bytes or, more generally, if you write
+ * more bytes than the subprocess can handle at once, the subprocess
+ * may write its data and wait on you to read it, but you are currently
+ * busy writing.
+ * 2) When you don't know ahead of time how many bytes the subprocess
+ * will produce, the usual technique of calling read (fd, buf, BUFSIZ)
+ * with a fixed BUFSIZ will, on Linux 2.2.17 and on BSD systems, cause
+ * the read() call to block until *all* of the buffer has been filled.
+ * But the subprocess cannot produce more data until you gave it more
+ * input. But you are currently busy reading from it.
+ */
+extern pid_t create_pipe_bidi (const char *progname,
+ const char *prog_path,
+ const char * const *prog_argv,
+ const char *directory,
+ bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int fd[2]);
+
+/* The name of the "always silent" device. */
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API. */
+# define DEV_NULL "NUL"
+#else
+/* Unix API. */
+# define DEV_NULL "/dev/null"
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SPAWN_PIPE_H */
diff --git a/lib/spawn.c b/lib/spawn.c
new file mode 100644
index 0000000..b658453
--- /dev/null
+++ b/lib/spawn.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawn (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, path, file_actions, attrp,
+ (const char * const *) argv, (const char * const *) envp, 0);
+}
diff --git a/lib/spawn.in.h b/lib/spawn.in.h
new file mode 100644
index 0000000..537fac7
--- /dev/null
+++ b/lib/spawn.in.h
@@ -0,0 +1,974 @@
+/* Definitions for POSIX spawn interface.
+ Copyright (C) 2000, 2003-2004, 2008-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifndef _@GUARD_PREFIX@_SPAWN_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SPAWN_H@
+# @INCLUDE_NEXT@ @NEXT_SPAWN_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SPAWN_H
+#define _@GUARD_PREFIX@_SPAWN_H
+
+/* Get definitions of 'struct sched_param' and 'sigset_t'.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <sched.h>
+# include <signal.h>
+#endif
+
+#include <sys/types.h>
+
+#ifndef __THROW
+# define __THROW
+#endif
+
+/* For plain 'restrict', use glibc's __restrict if defined.
+ Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+# define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+# define _Restrict_ restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* For the ISO C99 syntax
+ array_name[restrict]
+ use glibc's __restrict_arr if available.
+ Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
+ Other ISO C99 compilers support it as well. */
+#ifndef _Restrict_arr_
+# ifdef __restrict_arr
+# define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ \
+ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3) \
+ && !defined __cplusplus)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Data structure to contain attributes for thread creation. */
+#if @REPLACE_POSIX_SPAWN@ || (@HAVE_POSIX_SPAWNATTR_T@ && !@HAVE_POSIX_SPAWN@)
+# define posix_spawnattr_t rpl_posix_spawnattr_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWNATTR_T@ || !@HAVE_POSIX_SPAWN@
+# if !GNULIB_defined_posix_spawnattr_t
+typedef struct
+{
+ short int _flags;
+ pid_t _pgrp;
+ sigset_t _sd;
+ sigset_t _ss;
+ struct sched_param _sp;
+ int _policy;
+ int __pad[16];
+} posix_spawnattr_t;
+# define GNULIB_defined_posix_spawnattr_t 1
+# endif
+#endif
+
+
+/* Data structure to contain information about the actions to be
+ performed in the new process with respect to file descriptors. */
+#if @REPLACE_POSIX_SPAWN@ || (@HAVE_POSIX_SPAWN_FILE_ACTIONS_T@ && !@HAVE_POSIX_SPAWN@)
+# define posix_spawn_file_actions_t rpl_posix_spawn_file_actions_t
+#endif
+#if @REPLACE_POSIX_SPAWN@ || !@HAVE_POSIX_SPAWN_FILE_ACTIONS_T@ || !@HAVE_POSIX_SPAWN@
+# if !GNULIB_defined_posix_spawn_file_actions_t
+typedef struct
+{
+ int _allocated;
+ int _used;
+ struct __spawn_action *_actions;
+ int __pad[16];
+} posix_spawn_file_actions_t;
+# define GNULIB_defined_posix_spawn_file_actions_t 1
+# endif
+#endif
+
+
+/* Flags to be set in the 'posix_spawnattr_t'. */
+#if @HAVE_POSIX_SPAWN@
+/* Use the values from the system, but provide the missing ones. */
+# ifndef POSIX_SPAWN_SETSCHEDPARAM
+# define POSIX_SPAWN_SETSCHEDPARAM 0
+# endif
+# ifndef POSIX_SPAWN_SETSCHEDULER
+# define POSIX_SPAWN_SETSCHEDULER 0
+# endif
+#else
+# if @REPLACE_POSIX_SPAWN@
+/* Use the values from the system, for better compatibility. */
+/* But this implementation does not support AIX extensions. */
+# undef POSIX_SPAWN_FORK_HANDLERS
+# else
+# define POSIX_SPAWN_RESETIDS 0x01
+# define POSIX_SPAWN_SETPGROUP 0x02
+# define POSIX_SPAWN_SETSIGDEF 0x04
+# define POSIX_SPAWN_SETSIGMASK 0x08
+# define POSIX_SPAWN_SETSCHEDPARAM 0x10
+# define POSIX_SPAWN_SETSCHEDULER 0x20
+# endif
+#endif
+/* A GNU extension. Use the next free bit position. */
+#ifndef POSIX_SPAWN_USEVFORK
+# define POSIX_SPAWN_USEVFORK \
+ ((POSIX_SPAWN_RESETIDS | (POSIX_SPAWN_RESETIDS - 1) \
+ | POSIX_SPAWN_SETPGROUP | (POSIX_SPAWN_SETPGROUP - 1) \
+ | POSIX_SPAWN_SETSIGDEF | (POSIX_SPAWN_SETSIGDEF - 1) \
+ | POSIX_SPAWN_SETSIGMASK | (POSIX_SPAWN_SETSIGMASK - 1) \
+ | POSIX_SPAWN_SETSCHEDPARAM \
+ | (POSIX_SPAWN_SETSCHEDPARAM > 0 ? POSIX_SPAWN_SETSCHEDPARAM - 1 : 0) \
+ | POSIX_SPAWN_SETSCHEDULER \
+ | (POSIX_SPAWN_SETSCHEDULER > 0 ? POSIX_SPAWN_SETSCHEDULER - 1 : 0)) \
+ + 1)
+#endif
+#if !GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap
+typedef int verify_POSIX_SPAWN_USEVFORK_no_overlap
+ [(((POSIX_SPAWN_RESETIDS | POSIX_SPAWN_SETPGROUP
+ | POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER)
+ & POSIX_SPAWN_USEVFORK)
+ == 0)
+ ? 1 : -1];
+# define GNULIB_defined_verify_POSIX_SPAWN_USEVFORK_no_overlap 1
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN@
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn rpl_posix_spawn
+# endif
+_GL_FUNCDECL_RPL (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+_GL_CXXALIAS_RPL (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_]));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn, int,
+ (pid_t *_Restrict_ __pid,
+ const char *_Restrict_ __path,
+ const posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const posix_spawnattr_t *_Restrict_ __attrp,
+ char *const argv[_Restrict_arr_],
+ char *const envp[_Restrict_arr_]));
+# endif
+_GL_CXXALIASWARN (posix_spawn);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn
+# if HAVE_RAW_DECL_POSIX_SPAWN
+_GL_WARN_ON_USE (posix_spawn, "posix_spawn is unportable - "
+ "use gnulib module posix_spawn for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNP@
+/* Similar to 'posix_spawn' but search for FILE in the PATH.
+
+ This function is a possible cancellation points and therefore not
+ marked with __THROW. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnp rpl_posix_spawnp
+# endif
+_GL_FUNCDECL_RPL (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+_GL_CXXALIAS_RPL (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[]));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[])
+ _GL_ARG_NONNULL ((2, 5, 6)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnp, int,
+ (pid_t *__pid, const char *__file,
+ const posix_spawn_file_actions_t *__file_actions,
+ const posix_spawnattr_t *__attrp,
+ char *const argv[], char *const envp[]));
+# endif
+_GL_CXXALIASWARN (posix_spawnp);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnp
+# if HAVE_RAW_DECL_POSIX_SPAWNP
+_GL_WARN_ON_USE (posix_spawnp, "posix_spawnp is unportable - "
+ "use gnulib module posix_spawnp for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWNATTR_INIT@
+/* Initialize data structure with attributes for 'spawn' to default values. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_init rpl_posix_spawnattr_init
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_init, int, (posix_spawnattr_t *__attr));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_init, int, (posix_spawnattr_t *__attr));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_init);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_init
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_INIT
+_GL_WARN_ON_USE (posix_spawnattr_init, "posix_spawnattr_init is unportable - "
+ "use gnulib module posix_spawnattr_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_DESTROY@
+/* Free resources associated with ATTR. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_destroy rpl_posix_spawnattr_destroy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_destroy, int, (posix_spawnattr_t *__attr));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_DESTROY
+_GL_WARN_ON_USE (posix_spawnattr_destroy,
+ "posix_spawnattr_destroy is unportable - "
+ "use gnulib module posix_spawnattr_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+/* Store signal mask for signals with default handling from ATTR in
+ SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getsigdefault rpl_posix_spawnattr_getsigdefault
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getsigdefault, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigdefault));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getsigdefault);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_getsigdefault,
+ "posix_spawnattr_getsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_getsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+/* Set signal mask for signals with default handling in ATTR to SIGDEFAULT. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setsigdefault rpl_posix_spawnattr_setsigdefault
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setsigdefault, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigdefault));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setsigdefault);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigdefault
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGDEFAULT
+_GL_WARN_ON_USE (posix_spawnattr_setsigdefault,
+ "posix_spawnattr_setsigdefault is unportable - "
+ "use gnulib module posix_spawnattr_setsigdefault for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+/* Store signal mask for the new process from ATTR in SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getsigmask rpl_posix_spawnattr_getsigmask
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getsigmask, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ sigset_t *_Restrict_ __sigmask));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getsigmask);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_getsigmask,
+ "posix_spawnattr_getsigmask is unportable - "
+ "use gnulib module posix_spawnattr_getsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setsigmask rpl_posix_spawnattr_setsigmask
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setsigmask, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const sigset_t *_Restrict_ __sigmask));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setsigmask);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setsigmask
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSIGMASK
+_GL_WARN_ON_USE (posix_spawnattr_setsigmask,
+ "posix_spawnattr_setsigmask is unportable - "
+ "use gnulib module posix_spawnattr_setsigmask for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+/* Get flag word from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getflags rpl_posix_spawnattr_getflags
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getflags, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ short int *_Restrict_ __flags));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getflags);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_getflags,
+ "posix_spawnattr_getflags is unportable - "
+ "use gnulib module posix_spawnattr_getflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+/* Store flags in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setflags rpl_posix_spawnattr_setflags
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setflags, int,
+ (posix_spawnattr_t *__attr, short int __flags));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setflags);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setflags
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETFLAGS
+_GL_WARN_ON_USE (posix_spawnattr_setflags,
+ "posix_spawnattr_setflags is unportable - "
+ "use gnulib module posix_spawnattr_setflags for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+/* Get process group ID from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getpgroup rpl_posix_spawnattr_getpgroup
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getpgroup, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ pid_t *_Restrict_ __pgroup));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_getpgroup);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_getpgroup,
+ "posix_spawnattr_getpgroup is unportable - "
+ "use gnulib module posix_spawnattr_getpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+/* Store process group ID in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setpgroup rpl_posix_spawnattr_setpgroup
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setpgroup, int,
+ (posix_spawnattr_t *__attr, pid_t __pgroup));
+# endif
+_GL_CXXALIASWARN (posix_spawnattr_setpgroup);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setpgroup
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETPGROUP
+_GL_WARN_ON_USE (posix_spawnattr_setpgroup,
+ "posix_spawnattr_setpgroup is unportable - "
+ "use gnulib module posix_spawnattr_setpgroup for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+/* Get scheduling policy from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getschedpolicy rpl_posix_spawnattr_getschedpolicy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getschedpolicy, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ int *_Restrict_ __schedpolicy));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawnattr_getschedpolicy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_getschedpolicy,
+ "posix_spawnattr_getschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_getschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+/* Store scheduling policy in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setschedpolicy rpl_posix_spawnattr_setschedpolicy
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDULER == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setschedpolicy, int,
+ (posix_spawnattr_t *__attr, int __schedpolicy));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawnattr_setschedpolicy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedpolicy
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPOLICY
+_GL_WARN_ON_USE (posix_spawnattr_setschedpolicy,
+ "posix_spawnattr_setschedpolicy is unportable - "
+ "use gnulib module posix_spawnattr_setschedpolicy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+/* Get scheduling parameters from the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_getschedparam rpl_posix_spawnattr_getschedparam
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_getschedparam, int,
+ (const posix_spawnattr_t *_Restrict_ __attr,
+ struct sched_param *_Restrict_ __schedparam));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawnattr_getschedparam);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_getschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_GETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_getschedparam,
+ "posix_spawnattr_getschedparam is unportable - "
+ "use gnulib module posix_spawnattr_getschedparam for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+/* Store scheduling parameters in the attribute structure. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawnattr_setschedparam rpl_posix_spawnattr_setschedparam
+# endif
+_GL_FUNCDECL_RPL (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam));
+# else
+# if !@HAVE_POSIX_SPAWN@ || POSIX_SPAWN_SETSCHEDPARAM == 0
+_GL_FUNCDECL_SYS (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawnattr_setschedparam, int,
+ (posix_spawnattr_t *_Restrict_ __attr,
+ const struct sched_param *_Restrict_ __schedparam));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawnattr_setschedparam);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawnattr_setschedparam
+# if HAVE_RAW_DECL_POSIX_SPAWNATTR_SETSCHEDPARAM
+_GL_WARN_ON_USE (posix_spawnattr_setschedparam,
+ "posix_spawnattr_setschedparam is unportable - "
+ "use gnulib module posix_spawnattr_setschedparam for portability");
+# endif
+#endif
+
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+/* Initialize data structure for file attribute for 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_init rpl_posix_spawn_file_actions_init
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_init, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_init);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_init
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_INIT
+_GL_WARN_ON_USE (posix_spawn_file_actions_init,
+ "posix_spawn_file_actions_init is unportable - "
+ "use gnulib module posix_spawn_file_actions_init for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+/* Free resources associated with FILE-ACTIONS. */
+# if @REPLACE_POSIX_SPAWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_destroy rpl_posix_spawn_file_actions_destroy
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_destroy, int,
+ (posix_spawn_file_actions_t *__file_actions));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_destroy);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_destroy
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+_GL_WARN_ON_USE (posix_spawn_file_actions_destroy,
+ "posix_spawn_file_actions_destroy is unportable - "
+ "use gnulib module posix_spawn_file_actions_destroy for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'open' for the given file during the 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addopen rpl_posix_spawn_file_actions_addopen
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode)
+ __THROW _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode)
+ __THROW _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addopen, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd,
+ const char *_Restrict_ __path, int __oflag, mode_t __mode));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawn_file_actions_addopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addopen
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+_GL_WARN_ON_USE (posix_spawn_file_actions_addopen,
+ "posix_spawn_file_actions_addopen is unportable - "
+ "use gnulib module posix_spawn_file_actions_addopen for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'close' for the given file descriptor during the 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addclose rpl_posix_spawn_file_actions_addclose
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addclose, int,
+ (posix_spawn_file_actions_t *__file_actions, int __fd));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawn_file_actions_addclose);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addclose
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+_GL_WARN_ON_USE (posix_spawn_file_actions_addclose,
+ "posix_spawn_file_actions_addclose is unportable - "
+ "use gnulib module posix_spawn_file_actions_addclose for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'dup2' for the given file descriptors during the 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_adddup2 rpl_posix_spawn_file_actions_adddup2
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd));
+# else
+# if !@HAVE_POSIX_SPAWN@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_adddup2, int,
+ (posix_spawn_file_actions_t *__file_actions,
+ int __fd, int __newfd));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (posix_spawn_file_actions_adddup2);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_adddup2
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+_GL_WARN_ON_USE (posix_spawn_file_actions_adddup2,
+ "posix_spawn_file_actions_adddup2 is unportable - "
+ "use gnulib module posix_spawn_file_actions_adddup2 for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'chdir' to the given directory during the 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addchdir rpl_posix_spawn_file_actions_addchdir
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const char *_Restrict_ __path)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const char *_Restrict_ __path));
+# else
+# if !@HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const char *_Restrict_ __path)
+ __THROW _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ const char *_Restrict_ __path));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_addchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addchdir
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+_GL_WARN_ON_USE (posix_spawn_file_actions_addchdir,
+ "posix_spawn_file_actions_addchdir is unportable - "
+ "use gnulib module posix_spawn_file_actions_addchdir for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'fchdir' to the given directory during the 'spawn' call. */
+# if @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define posix_spawn_file_actions_addfchdir rpl_posix_spawn_file_actions_addfchdir
+# endif
+_GL_FUNCDECL_RPL (posix_spawn_file_actions_addfchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_spawn_file_actions_addfchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd));
+# else
+# if !@HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+_GL_FUNCDECL_SYS (posix_spawn_file_actions_addfchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd)
+ __THROW _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (posix_spawn_file_actions_addfchdir, int,
+ (posix_spawn_file_actions_t *_Restrict_ __file_actions,
+ int __fd));
+# endif
+_GL_CXXALIASWARN (posix_spawn_file_actions_addfchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_spawn_file_actions_addfchdir
+# if HAVE_RAW_DECL_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR
+_GL_WARN_ON_USE (posix_spawn_file_actions_addfchdir,
+ "posix_spawn_file_actions_addfchdir is unportable - "
+ "use gnulib module posix_spawn_file_actions_addfchdir for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SPAWN_H */
+#endif /* _@GUARD_PREFIX@_SPAWN_H */
diff --git a/lib/spawn_faction_addchdir.c b/lib/spawn_faction_addchdir.c
new file mode 100644
index 0000000..8fb6cb0
--- /dev/null
+++ b/lib/spawn_faction_addchdir.c
@@ -0,0 +1,70 @@
+/* Copyright (C) 2018-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'chdir' to the given directory during the 'spawn' call. */
+int
+posix_spawn_file_actions_addchdir (posix_spawn_file_actions_t *file_actions,
+ const char *path)
+#undef posix_spawn_file_actions_addchdir
+{
+#if !REPLACE_POSIX_SPAWN
+ return posix_spawn_file_actions_addchdir_np (file_actions, path);
+#else
+ {
+ /* Copy PATH, because the caller may free it before calling posix_spawn()
+ or posix_spawnp(). */
+ char *path_copy = strdup (path);
+ if (path_copy == NULL)
+ return ENOMEM;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ {
+ /* This can only mean we ran out of memory. */
+ free (path_copy);
+ return ENOMEM;
+ }
+
+ {
+ struct __spawn_action *rec;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_chdir;
+ rec->action.chdir_action.path = path_copy;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+ }
+ }
+#endif
+}
diff --git a/lib/spawn_faction_addclose.c b/lib/spawn_faction_addclose.c
new file mode 100644
index 0000000..5654e97
--- /dev/null
+++ b/lib/spawn_faction_addclose.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'close' for the given file descriptor during the 'spawn' call. */
+int
+posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *file_actions,
+ int fd)
+#undef posix_spawn_file_actions_addclose
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+#if !REPLACE_POSIX_SPAWN
+ return posix_spawn_file_actions_addclose (file_actions, fd);
+#else
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ {
+ struct __spawn_action *rec;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_close;
+ rec->action.open_action.fd = fd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+ }
+#endif
+}
diff --git a/lib/spawn_faction_adddup2.c b/lib/spawn_faction_adddup2.c
new file mode 100644
index 0000000..c00b0b4
--- /dev/null
+++ b/lib/spawn_faction_adddup2.c
@@ -0,0 +1,70 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'dup2' for the given file descriptors during the 'spawn' call. */
+int
+posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *file_actions,
+ int fd, int newfd)
+#undef posix_spawn_file_actions_adddup2
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || newfd < 0 || fd >= maxfd || newfd >= maxfd)
+ return EBADF;
+
+#if !REPLACE_POSIX_SPAWN
+ return posix_spawn_file_actions_adddup2 (file_actions, fd, newfd);
+#else
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ /* This can only mean we ran out of memory. */
+ return ENOMEM;
+
+ {
+ struct __spawn_action *rec;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_dup2;
+ rec->action.dup2_action.fd = fd;
+ rec->action.dup2_action.newfd = newfd;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+ }
+#endif
+}
diff --git a/lib/spawn_faction_addopen.c b/lib/spawn_faction_addopen.c
new file mode 100644
index 0000000..a3fc22e
--- /dev/null
+++ b/lib/spawn_faction_addopen.c
@@ -0,0 +1,86 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if !_LIBC
+# define __sysconf(open_max) getdtablesize ()
+#endif
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Add an action to FILE-ACTIONS which tells the implementation to call
+ 'open' for the given file during the 'spawn' call. */
+int
+posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
+ int fd, const char *path, int oflag,
+ mode_t mode)
+#undef posix_spawn_file_actions_addopen
+{
+ int maxfd = __sysconf (_SC_OPEN_MAX);
+
+ /* Test for the validity of the file descriptor. */
+ if (fd < 0 || fd >= maxfd)
+ return EBADF;
+
+#if !REPLACE_POSIX_SPAWN
+ return posix_spawn_file_actions_addopen (file_actions, fd, path, oflag, mode);
+#else
+ {
+ /* Copy PATH, because the caller may free it before calling posix_spawn()
+ or posix_spawnp(). */
+ char *path_copy = strdup (path);
+ if (path_copy == NULL)
+ return ENOMEM;
+
+ /* Allocate more memory if needed. */
+ if (file_actions->_used == file_actions->_allocated
+ && __posix_spawn_file_actions_realloc (file_actions) != 0)
+ {
+ /* This can only mean we ran out of memory. */
+ free (path_copy);
+ return ENOMEM;
+ }
+
+ {
+ struct __spawn_action *rec;
+
+ /* Add the new value. */
+ rec = &file_actions->_actions[file_actions->_used];
+ rec->tag = spawn_do_open;
+ rec->action.open_action.fd = fd;
+ rec->action.open_action.path = path_copy;
+ rec->action.open_action.oflag = oflag;
+ rec->action.open_action.mode = mode;
+
+ /* Account for the new entry. */
+ ++file_actions->_used;
+
+ return 0;
+ }
+ }
+#endif
+}
diff --git a/lib/spawn_faction_destroy.c b/lib/spawn_faction_destroy.c
new file mode 100644
index 0000000..e9985f4
--- /dev/null
+++ b/lib/spawn_faction_destroy.c
@@ -0,0 +1,61 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <stdlib.h>
+
+#if REPLACE_POSIX_SPAWN
+# include "spawn_int.h"
+#endif
+
+/* Initialize data structure for file attribute for 'spawn' call. */
+int
+posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
+#undef posix_spawn_file_actions_destroy
+{
+#if !REPLACE_POSIX_SPAWN
+ return posix_spawn_file_actions_destroy (file_actions);
+#else
+ int i;
+
+ /* Free the paths in the open actions. */
+ for (i = 0; i < file_actions->_used; ++i)
+ {
+ struct __spawn_action *sa = &file_actions->_actions[i];
+ switch (sa->tag)
+ {
+ case spawn_do_open:
+ free (sa->action.open_action.path);
+ break;
+ case spawn_do_chdir:
+ free (sa->action.chdir_action.path);
+ break;
+ default:
+ /* No cleanup required. */
+ break;
+ }
+ }
+
+ /* Free the array of actions. */
+ free (file_actions->_actions);
+
+ return 0;
+#endif
+}
diff --git a/lib/spawn_faction_init.c b/lib/spawn_faction_init.c
new file mode 100644
index 0000000..135605f
--- /dev/null
+++ b/lib/spawn_faction_init.c
@@ -0,0 +1,56 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "spawn_int.h"
+
+
+/* Function used to increase the size of the allocated array. This
+ function is called from the 'add'-functions. */
+int
+__posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *file_actions)
+{
+ int newalloc = file_actions->_allocated + 8;
+ void *newmem = realloc (file_actions->_actions,
+ newalloc * sizeof (struct __spawn_action));
+
+ if (newmem == NULL)
+ /* Not enough memory. */
+ return ENOMEM;
+
+ file_actions->_actions = (struct __spawn_action *) newmem;
+ file_actions->_allocated = newalloc;
+
+ return 0;
+}
+
+
+/* Initialize data structure for file attribute for 'spawn' call. */
+int
+posix_spawn_file_actions_init (posix_spawn_file_actions_t *file_actions)
+{
+ /* Simply clear all the elements. */
+ memset (file_actions, '\0', sizeof (*file_actions));
+ return 0;
+}
diff --git a/lib/spawn_int.h b/lib/spawn_int.h
new file mode 100644
index 0000000..60a94dd
--- /dev/null
+++ b/lib/spawn_int.h
@@ -0,0 +1,72 @@
+/* Copyright (C) 2000, 2008-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <sys/types.h>
+
+/* Data structure to contain the action information. */
+struct __spawn_action
+{
+ enum
+ {
+ spawn_do_close,
+ spawn_do_dup2,
+ spawn_do_open,
+ spawn_do_chdir,
+ spawn_do_fchdir
+ } tag;
+
+ union
+ {
+ struct
+ {
+ int fd;
+ } close_action;
+ struct
+ {
+ int fd;
+ int newfd;
+ } dup2_action;
+ struct
+ {
+ int fd;
+ char *path;
+ int oflag;
+ mode_t mode;
+ } open_action;
+ struct
+ {
+ char *path;
+ } chdir_action;
+ struct
+ {
+ int fd;
+ } fchdir_action;
+ } action;
+};
+
+#if !_LIBC
+# define __posix_spawn_file_actions_realloc gl_posix_spawn_file_actions_realloc
+#endif
+extern int __posix_spawn_file_actions_realloc (posix_spawn_file_actions_t *
+ file_actions);
+
+#if !_LIBC
+# define __spawni gl_posix_spawn_internal
+#endif
+extern int __spawni (pid_t *pid, const char *path,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, const char *const argv[],
+ const char *const envp[], int use_path);
diff --git a/lib/spawnattr_destroy.c b/lib/spawnattr_destroy.c
new file mode 100644
index 0000000..22a7d5a
--- /dev/null
+++ b/lib/spawnattr_destroy.c
@@ -0,0 +1,28 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+/* Initialize data structure for file attribute for 'spawn' call. */
+int
+posix_spawnattr_destroy (posix_spawnattr_t *attr)
+{
+ /* Nothing to do in the moment. */
+ return 0;
+}
diff --git a/lib/spawnattr_init.c b/lib/spawnattr_init.c
new file mode 100644
index 0000000..9967448
--- /dev/null
+++ b/lib/spawnattr_init.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Initialize data structure for file attribute for 'spawn' call. */
+int
+posix_spawnattr_init (posix_spawnattr_t *attr)
+{
+ /* All elements have to be initialized to the default values which
+ is generally zero. */
+ memset (attr, '\0', sizeof (*attr));
+
+ return 0;
+}
diff --git a/lib/spawnattr_setflags.c b/lib/spawnattr_setflags.c
new file mode 100644
index 0000000..084d5bc
--- /dev/null
+++ b/lib/spawnattr_setflags.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 2000, 2004, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <errno.h>
+#include <string.h>
+
+#define ALL_FLAGS (POSIX_SPAWN_RESETIDS \
+ | POSIX_SPAWN_SETPGROUP \
+ | POSIX_SPAWN_SETSIGDEF \
+ | POSIX_SPAWN_SETSIGMASK \
+ | POSIX_SPAWN_SETSCHEDPARAM \
+ | POSIX_SPAWN_SETSCHEDULER \
+ | POSIX_SPAWN_USEVFORK)
+
+/* Store flags in the attribute structure. */
+int
+posix_spawnattr_setflags (posix_spawnattr_t *attr, short int flags)
+{
+ /* Check no invalid bits are set. */
+ if (flags & ~ALL_FLAGS)
+ return EINVAL;
+
+ /* Store the flag word. */
+ attr->_flags = flags;
+
+ return 0;
+}
diff --git a/lib/spawnattr_setpgroup.c b/lib/spawnattr_setpgroup.c
new file mode 100644
index 0000000..479457a
--- /dev/null
+++ b/lib/spawnattr_setpgroup.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Store process group ID in the attribute structure. */
+int
+posix_spawnattr_setpgroup (posix_spawnattr_t *attr, pid_t pgroup)
+{
+ /* Store the process group ID. */
+ attr->_pgrp = pgroup;
+
+ return 0;
+}
diff --git a/lib/spawnattr_setsigmask.c b/lib/spawnattr_setsigmask.c
new file mode 100644
index 0000000..9b6f9ec
--- /dev/null
+++ b/lib/spawnattr_setsigmask.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include <string.h>
+
+/* Set signal mask for the new process in ATTR to SIGMASK. */
+int
+posix_spawnattr_setsigmask (posix_spawnattr_t *attr,
+ const sigset_t *sigmask)
+{
+ /* Copy the sigset_t data to the user buffer. */
+ memcpy (&attr->_ss, sigmask, sizeof (sigset_t));
+
+ return 0;
+}
diff --git a/lib/spawni.c b/lib/spawni.c
new file mode 100644
index 0000000..2f0d25f
--- /dev/null
+++ b/lib/spawni.c
@@ -0,0 +1,970 @@
+/* Guts of POSIX spawn interface. Generic POSIX.1 version.
+ Copyright (C) 2000-2006, 2008-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+#include "spawn_int.h"
+
+#include <alloca.h>
+#include <errno.h>
+
+#include <fcntl.h>
+#ifndef O_LARGEFILE
+# define O_LARGEFILE 0
+#endif
+
+#if _LIBC || HAVE_PATHS_H
+# include <paths.h>
+#else
+# define _PATH_BSHELL BOURNE_SHELL
+#endif
+
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#if _LIBC
+# include <not-cancel.h>
+#else
+# define close_not_cancel close
+# define open_not_cancel open
+#endif
+
+#if _LIBC
+# include <local-setxid.h>
+#else
+# if !HAVE_SETEUID
+# define seteuid(id) setresuid (-1, id, -1)
+# endif
+# if !HAVE_SETEGID
+# define setegid(id) setresgid (-1, id, -1)
+# endif
+# define local_seteuid(id) seteuid (id)
+# define local_setegid(id) setegid (id)
+#endif
+
+#if _LIBC
+# define alloca __alloca
+# define execve __execve
+# define dup2 __dup2
+# define fork __fork
+# define getgid __getgid
+# define getuid __getuid
+# define sched_setparam __sched_setparam
+# define sched_setscheduler __sched_setscheduler
+# define setpgid __setpgid
+# define sigaction __sigaction
+# define sigismember __sigismember
+# define sigprocmask __sigprocmask
+# define strchrnul __strchrnul
+# define vfork __vfork
+#endif
+
+
+/* The Unix standard contains a long explanation of the way to signal
+ an error after the fork() was successful. Since no new wait status
+ was wanted there is no way to signal an error using one of the
+ available methods. The committee chose to signal an error by a
+ normal program exit with the exit code 127. */
+#define SPAWN_ERROR 127
+
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Native Windows API. */
+
+/* Get declarations of the native Windows API functions. */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+# include <stdbool.h>
+# include <stdio.h>
+
+# include "filename.h"
+# include "concat-filename.h"
+# include "findprog.h"
+# include "malloca.h"
+# include "windows-spawn.h"
+
+/* Don't assume that UNICODE is not defined. */
+# undef CreateFile
+# define CreateFile CreateFileA
+# undef STARTUPINFO
+# define STARTUPINFO STARTUPINFOA
+# undef CreateProcess
+# define CreateProcess CreateProcessA
+
+/* Grows inh_handles->count so that it becomes > newfd.
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+static int
+grow_inheritable_handles (struct inheritable_handles *inh_handles, int newfd)
+{
+ if (inh_handles->allocated <= newfd)
+ {
+ size_t new_allocated = 2 * inh_handles->allocated + 1;
+ if (new_allocated <= newfd)
+ new_allocated = newfd + 1;
+ HANDLE *new_handles_array =
+ (HANDLE *)
+ realloc (inh_handles->handles, new_allocated * sizeof (HANDLE));
+ if (new_handles_array == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ unsigned char *new_flags_array =
+ (unsigned char *)
+ realloc (inh_handles->flags, new_allocated * sizeof (unsigned char));
+ if (new_flags_array == NULL)
+ {
+ free (new_handles_array);
+ errno = ENOMEM;
+ return -1;
+ }
+ inh_handles->allocated = new_allocated;
+ inh_handles->handles = new_handles_array;
+ inh_handles->flags = new_flags_array;
+ }
+
+ HANDLE *handles = inh_handles->handles;
+
+ for (; inh_handles->count <= newfd; inh_handles->count++)
+ handles[inh_handles->count] = INVALID_HANDLE_VALUE;
+
+ return 0;
+}
+
+/* Reduces inh_handles->count to the minimum needed. */
+static void
+shrink_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+ HANDLE *handles = inh_handles->handles;
+
+ while (inh_handles->count > 3
+ && handles[inh_handles->count - 1] == INVALID_HANDLE_VALUE)
+ inh_handles->count--;
+}
+
+/* Closes all handles in inh_handles. */
+static void
+close_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+ HANDLE *handles = inh_handles->handles;
+ size_t handles_count = inh_handles->count;
+ unsigned int fd;
+
+ for (fd = 0; fd < handles_count; fd++)
+ {
+ HANDLE handle = handles[fd];
+
+ if (handle != INVALID_HANDLE_VALUE)
+ CloseHandle (handle);
+ }
+}
+
+/* Tests whether a memory region, starting at P and N bytes long, contains only
+ zeroes. */
+static bool
+memiszero (const void *p, size_t n)
+{
+ const char *cp = p;
+ for (; n > 0; cp++, n--)
+ if (*cp != 0)
+ return 0;
+ return 1;
+}
+
+/* Tests whether *S contains no signals. */
+static bool
+sigisempty (const sigset_t *s)
+{
+ return memiszero (s, sizeof (sigset_t));
+}
+
+/* Opens a HANDLE to a file.
+ Upon failure, returns INVALID_HANDLE_VALUE with errno set. */
+static HANDLE
+open_handle (const char *name, int flags, mode_t mode)
+{
+ /* To ease portability. Like in open.c. */
+ if (strcmp (name, "/dev/null") == 0)
+ name = "NUL";
+
+ /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>
+ specifies: "More than two leading <slash> characters shall be treated as
+ a single <slash> character." */
+ if (ISSLASH (name[0]) && ISSLASH (name[1]) && ISSLASH (name[2]))
+ {
+ name += 2;
+ while (ISSLASH (name[1]))
+ name++;
+ }
+
+ size_t len = strlen (name);
+ size_t drive_prefix_len = (HAS_DEVICE (name) ? 2 : 0);
+
+ /* Remove trailing slashes (except the very first one, at position
+ drive_prefix_len), but remember their presence. */
+ size_t rlen;
+ bool check_dir = false;
+
+ rlen = len;
+ while (rlen > drive_prefix_len && ISSLASH (name[rlen-1]))
+ {
+ check_dir = true;
+ if (rlen == drive_prefix_len + 1)
+ break;
+ rlen--;
+ }
+
+ /* Handle '' and 'C:'. */
+ if (!check_dir && rlen == drive_prefix_len)
+ {
+ errno = ENOENT;
+ return INVALID_HANDLE_VALUE;
+ }
+
+ /* Handle '\\'. */
+ if (rlen == 1 && ISSLASH (name[0]) && len >= 2)
+ {
+ errno = ENOENT;
+ return INVALID_HANDLE_VALUE;
+ }
+
+ const char *rname;
+ char *malloca_rname;
+ if (rlen == len)
+ {
+ rname = name;
+ malloca_rname = NULL;
+ }
+ else
+ {
+ malloca_rname = malloca (rlen + 1);
+ if (malloca_rname == NULL)
+ {
+ errno = ENOMEM;
+ return INVALID_HANDLE_VALUE;
+ }
+ memcpy (malloca_rname, name, rlen);
+ malloca_rname[rlen] = '\0';
+ rname = malloca_rname;
+ }
+
+ /* For the meaning of the flags, see
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen> */
+ /* Open a handle to the file.
+ CreateFile
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea>
+ <https://docs.microsoft.com/en-us/windows/desktop/FileIO/creating-and-opening-files> */
+ HANDLE handle =
+ CreateFile (rname,
+ ((flags & (O_WRONLY | O_RDWR)) != 0
+ ? GENERIC_READ | GENERIC_WRITE
+ : GENERIC_READ),
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ ((flags & O_CREAT) != 0
+ ? ((flags & O_EXCL) != 0
+ ? CREATE_NEW
+ : ((flags & O_TRUNC) != 0 ? CREATE_ALWAYS : OPEN_ALWAYS))
+ : ((flags & O_TRUNC) != 0
+ ? TRUNCATE_EXISTING
+ : OPEN_EXISTING)),
+ /* FILE_FLAG_BACKUP_SEMANTICS is useful for opening directories,
+ which is out-of-scope here. */
+ /* FILE_FLAG_POSIX_SEMANTICS (treat file names that differ only
+ in case as different) makes sense only when applied to *all*
+ filesystem operations. */
+ /* FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_POSIX_SEMANTICS */
+ FILE_ATTRIBUTE_NORMAL
+ | ((flags & O_TEMPORARY) != 0 ? FILE_FLAG_DELETE_ON_CLOSE : 0)
+ | ((flags & O_SEQUENTIAL ) != 0 ? FILE_FLAG_SEQUENTIAL_SCAN : 0)
+ | ((flags & O_RANDOM) != 0 ? FILE_FLAG_RANDOM_ACCESS : 0),
+ NULL);
+ if (handle == INVALID_HANDLE_VALUE)
+ switch (GetLastError ())
+ {
+ /* Some of these errors probably cannot happen with the specific flags
+ that we pass to CreateFile. But who knows... */
+ case ERROR_FILE_NOT_FOUND: /* The last component of rname does not exist. */
+ case ERROR_PATH_NOT_FOUND: /* Some directory component in rname does not exist. */
+ case ERROR_BAD_PATHNAME: /* rname is such as '\\server'. */
+ case ERROR_BAD_NETPATH: /* rname is such as '\\nonexistentserver\share'. */
+ case ERROR_BAD_NET_NAME: /* rname is such as '\\server\nonexistentshare'. */
+ case ERROR_INVALID_NAME: /* rname contains wildcards, misplaced colon, etc. */
+ case ERROR_DIRECTORY:
+ errno = ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED: /* rname is such as 'C:\System Volume Information\foo'. */
+ case ERROR_SHARING_VIOLATION: /* rname is such as 'C:\pagefile.sys'. */
+ /* XXX map to EACCES or EPERM? */
+ errno = EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_WRITE_PROTECT:
+ errno = EROFS;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_DELETE_PENDING: /* XXX map to EACCES or EPERM? */
+ errno = EPERM;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ if (malloca_rname != NULL)
+ {
+ int saved_errno = errno;
+ freea (malloca_rname);
+ errno = saved_errno;
+ }
+ return handle;
+}
+
+/* Executes an 'open' action.
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_open (struct inheritable_handles *inh_handles, int newfd,
+ const char *filename, const char *directory,
+ int flags, mode_t mode, HANDLE curr_process)
+{
+ if (!(newfd >= 0 && newfd < _getmaxstdio ()))
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (grow_inheritable_handles (inh_handles, newfd) < 0)
+ return -1;
+ if (inh_handles->handles[newfd] != INVALID_HANDLE_VALUE
+ && !CloseHandle (inh_handles->handles[newfd]))
+ {
+ errno = EIO;
+ return -1;
+ }
+ if (filename == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ char *filename_to_free = NULL;
+ if (directory != NULL && IS_RELATIVE_FILE_NAME (filename))
+ {
+ char *real_filename = concatenated_filename (directory, filename, NULL);
+ if (real_filename == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ filename = real_filename;
+ filename_to_free = real_filename;
+ }
+ HANDLE handle = open_handle (filename, flags, mode);
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ int saved_errno = errno;
+ free (filename_to_free);
+ errno = saved_errno;
+ return -1;
+ }
+ free (filename_to_free);
+ /* Duplicate the handle, so that it becomes inheritable. */
+ if (!DuplicateHandle (curr_process, handle,
+ curr_process, &inh_handles->handles[newfd],
+ 0, TRUE,
+ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
+ {
+ errno = EBADF; /* arbitrary */
+ return -1;
+ }
+ inh_handles->flags[newfd] = ((flags & O_APPEND) != 0 ? 32 : 0);
+ return 0;
+}
+
+/* Executes a 'dup2' action.
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_dup2 (struct inheritable_handles *inh_handles, int oldfd, int newfd,
+ HANDLE curr_process)
+{
+ if (!(oldfd >= 0 && oldfd < inh_handles->count
+ && inh_handles->handles[oldfd] != INVALID_HANDLE_VALUE))
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (!(newfd >= 0 && newfd < _getmaxstdio ()))
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (newfd != oldfd)
+ {
+ if (grow_inheritable_handles (inh_handles, newfd) < 0)
+ return -1;
+ if (inh_handles->handles[newfd] != INVALID_HANDLE_VALUE
+ && !CloseHandle (inh_handles->handles[newfd]))
+ {
+ errno = EIO;
+ return -1;
+ }
+ /* Duplicate the handle, so that it a forthcoming do_close action on oldfd
+ has no effect on newfd. */
+ if (!DuplicateHandle (curr_process, inh_handles->handles[oldfd],
+ curr_process, &inh_handles->handles[newfd],
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ errno = EBADF; /* arbitrary */
+ return -1;
+ }
+ inh_handles->flags[newfd] = 0;
+ }
+ return 0;
+}
+
+/* Executes a 'close' action.
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+static int
+do_close (struct inheritable_handles *inh_handles, int fd)
+{
+ if (!(fd >= 0 && fd < inh_handles->count
+ && inh_handles->handles[fd] != INVALID_HANDLE_VALUE))
+ {
+ errno = EBADF;
+ return -1;
+ }
+ if (!CloseHandle (inh_handles->handles[fd]))
+ {
+ errno = EIO;
+ return -1;
+ }
+ inh_handles->handles[fd] = INVALID_HANDLE_VALUE;
+ return 0;
+}
+
+int
+__spawni (pid_t *pid, const char *prog_filename,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, const char *const prog_argv[],
+ const char *const envp[], int use_path)
+{
+ /* Validate the arguments. */
+ if (prog_filename == NULL
+ || (attrp != NULL
+ && ((attrp->_flags & ~POSIX_SPAWN_SETPGROUP) != 0
+ || attrp->_pgrp != 0
+ || ! sigisempty (&attrp->_sd)
+ || ! sigisempty (&attrp->_ss)
+ || attrp->_sp.sched_priority != 0
+ || attrp->_policy != 0)))
+ return EINVAL;
+
+ /* Process group handling:
+ Native Windows does not have the concept of process group, but it has the
+ concept of a console attached to a process.
+ So, we interpret the three cases as follows:
+ - Flag POSIX_SPAWN_SETPGROUP not set: Means, the child process is in the
+ same process group as the parent process. We interpret this as a
+ request to reuse the same console.
+ - Flag POSIX_SPAWN_SETPGROUP set with attrp->_pgrp == 0: Means the child
+ process starts a process group of its own. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html>
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgrp.html>
+ We interpret this as a request to detach from the current console.
+ - Flag POSIX_SPAWN_SETPGROUP set with attrp->_pgrp != 0: Means the child
+ process joins another, existing process group. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_spawnattr_getpgroup.html>
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/setpgid.html>
+ We don't support this case; it produces error EINVAL above. */
+ /* <https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags> */
+ DWORD process_creation_flags =
+ (attrp != NULL && (attrp->_flags & POSIX_SPAWN_SETPGROUP) != 0 ? DETACHED_PROCESS : 0);
+
+ char *argv_mem_to_free;
+ const char **argv = prepare_spawn (prog_argv, &argv_mem_to_free);
+ if (argv == NULL)
+ return errno; /* errno is set here */
+ argv++;
+
+ /* Compose the command. */
+ char *command = compose_command (argv);
+ if (command == NULL)
+ {
+ free (argv_mem_to_free);
+ return ENOMEM;
+ }
+
+ /* Copy *ENVP into a contiguous block of memory. */
+ char *envblock;
+ if (envp == NULL)
+ envblock = NULL;
+ else
+ {
+ envblock = compose_envblock (envp);
+ if (envblock == NULL)
+ {
+ free (command);
+ free (argv_mem_to_free);
+ return ENOMEM;
+ }
+ }
+
+ /* Set up the array of handles to inherit.
+ Duplicate each handle, so that a spawn_do_close action (below) has no
+ effect on the file descriptors of the current process. Alternatively,
+ we could store, for each handle, a bit that tells whether it is shared
+ with the current process. But this is simpler. */
+ struct inheritable_handles inh_handles;
+ if (init_inheritable_handles (&inh_handles, true) < 0)
+ goto failed_1;
+
+ /* Directory in which to execute the new process. */
+ const char *directory = NULL;
+
+ /* Execute the file_actions, modifying the inh_handles instead of the
+ file descriptors of the current process. */
+ if (file_actions != NULL)
+ {
+ HANDLE curr_process = GetCurrentProcess ();
+ int cnt;
+
+ for (cnt = 0; cnt < file_actions->_used; ++cnt)
+ {
+ struct __spawn_action *action = &file_actions->_actions[cnt];
+
+ switch (action->tag)
+ {
+ case spawn_do_close:
+ {
+ int fd = action->action.close_action.fd;
+ if (do_close (&inh_handles, fd) < 0)
+ goto failed_2;
+ }
+ break;
+
+ case spawn_do_open:
+ {
+ int newfd = action->action.open_action.fd;
+ const char *filename = action->action.open_action.path;
+ int flags = action->action.open_action.oflag;
+ mode_t mode = action->action.open_action.mode;
+ if (do_open (&inh_handles, newfd, filename, directory,
+ flags, mode, curr_process)
+ < 0)
+ goto failed_2;
+ }
+ break;
+
+ case spawn_do_dup2:
+ {
+ int oldfd = action->action.dup2_action.fd;
+ int newfd = action->action.dup2_action.newfd;
+ if (do_dup2 (&inh_handles, oldfd, newfd, curr_process) < 0)
+ goto failed_2;
+ }
+ break;
+
+ case spawn_do_chdir:
+ {
+ char *newdir = action->action.chdir_action.path;
+ if (directory != NULL && IS_RELATIVE_FILE_NAME (newdir))
+ {
+ newdir = concatenated_filename (directory, newdir, NULL);
+ if (newdir == NULL)
+ {
+ errno = ENOMEM;
+ goto failed_2;
+ }
+ }
+ directory = newdir;
+ }
+ break;
+
+ case spawn_do_fchdir:
+ /* Not supported in this implementation. */
+ errno = EINVAL;
+ goto failed_2;
+ }
+ }
+ }
+
+ /* Reduce inh_handles.count to the minimum needed. */
+ shrink_inheritable_handles (&inh_handles);
+
+ /* CreateProcess
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa> */
+ /* STARTUPINFO
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa> */
+ STARTUPINFO sinfo;
+ sinfo.cb = sizeof (STARTUPINFO);
+ sinfo.lpReserved = NULL;
+ sinfo.lpDesktop = NULL;
+ sinfo.lpTitle = NULL;
+ if (compose_handles_block (&inh_handles, &sinfo) < 0)
+ goto failed_2;
+
+ /* Perform the PATH search now, considering the final DIRECTORY. */
+ char *resolved_prog_filename_to_free = NULL;
+ {
+ const char *resolved_prog_filename =
+ find_in_given_path (prog_filename, use_path ? getenv ("PATH") : "",
+ directory, false);
+ if (resolved_prog_filename == NULL)
+ goto failed_3;
+ if (resolved_prog_filename != prog_filename)
+ resolved_prog_filename_to_free = (char *) resolved_prog_filename;
+ prog_filename = resolved_prog_filename;
+ }
+
+ PROCESS_INFORMATION pinfo;
+ if (!CreateProcess (prog_filename, command, NULL, NULL, TRUE,
+ process_creation_flags, envblock, directory, &sinfo,
+ &pinfo))
+ {
+ DWORD error = GetLastError ();
+
+ free (resolved_prog_filename_to_free);
+ free (sinfo.lpReserved2);
+ close_inheritable_handles (&inh_handles);
+ free_inheritable_handles (&inh_handles);
+ free (envblock);
+ free (command);
+ free (argv_mem_to_free);
+
+ return convert_CreateProcess_error (error);
+ }
+
+ if (pinfo.hThread)
+ CloseHandle (pinfo.hThread);
+
+ free (resolved_prog_filename_to_free);
+ free (sinfo.lpReserved2);
+ close_inheritable_handles (&inh_handles);
+ free_inheritable_handles (&inh_handles);
+ free (envblock);
+ free (command);
+ free (argv_mem_to_free);
+
+ if (pid != NULL)
+ *pid = (intptr_t) pinfo.hProcess;
+ return 0;
+
+ failed_3:
+ {
+ int saved_errno = errno;
+ free (sinfo.lpReserved2);
+ close_inheritable_handles (&inh_handles);
+ free_inheritable_handles (&inh_handles);
+ free (envblock);
+ free (command);
+ free (argv_mem_to_free);
+ return saved_errno;
+ }
+
+ failed_2:
+ {
+ int saved_errno = errno;
+ close_inheritable_handles (&inh_handles);
+ free_inheritable_handles (&inh_handles);
+ free (envblock);
+ free (command);
+ free (argv_mem_to_free);
+ return saved_errno;
+ }
+
+ failed_1:
+ {
+ int saved_errno = errno;
+ free (envblock);
+ free (command);
+ free (argv_mem_to_free);
+ return saved_errno;
+ }
+}
+
+#else
+
+
+/* Spawn a new process executing PATH with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+__spawni (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, const char *const argv[],
+ const char *const envp[], int use_path)
+{
+ pid_t new_pid;
+ char *path, *p, *name;
+ size_t len;
+ size_t pathlen;
+
+ /* Do this once. */
+ short int flags = attrp == NULL ? 0 : attrp->_flags;
+
+ /* Avoid gcc warning
+ "variable 'flags' might be clobbered by 'longjmp' or 'vfork'" */
+ (void) &flags;
+
+ /* Generate the new process. */
+#if HAVE_VFORK
+ if ((flags & POSIX_SPAWN_USEVFORK) != 0
+ /* If no major work is done, allow using vfork. Note that we
+ might perform the path searching. But this would be done by
+ a call to execvp(), too, and such a call must be OK according
+ to POSIX. */
+ || ((flags & (POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF
+ | POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER
+ | POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_RESETIDS)) == 0
+ && file_actions == NULL))
+ new_pid = vfork ();
+ else
+#endif
+ new_pid = fork ();
+
+ if (new_pid != 0)
+ {
+ if (new_pid < 0)
+ return errno;
+
+ /* The call was successful. Store the PID if necessary. */
+ if (pid != NULL)
+ *pid = new_pid;
+
+ return 0;
+ }
+
+ /* Set signal mask. */
+ if ((flags & POSIX_SPAWN_SETSIGMASK) != 0
+ && sigprocmask (SIG_SETMASK, &attrp->_ss, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set signal default action. */
+ if ((flags & POSIX_SPAWN_SETSIGDEF) != 0)
+ {
+ /* We have to iterate over all signals. This could possibly be
+ done better but it requires system specific solutions since
+ the sigset_t data type can be very different on different
+ architectures. */
+ int sig;
+ struct sigaction sa;
+
+ memset (&sa, '\0', sizeof (sa));
+ sa.sa_handler = SIG_DFL;
+
+ for (sig = 1; sig <= NSIG; ++sig)
+ if (sigismember (&attrp->_sd, sig) != 0
+ && sigaction (sig, &sa, NULL) != 0)
+ _exit (SPAWN_ERROR);
+
+ }
+
+#if (_LIBC ? defined _POSIX_PRIORITY_SCHEDULING : HAVE_SCHED_SETPARAM && HAVE_SCHED_SETSCHEDULER)
+ /* Set the scheduling algorithm and parameters. */
+ if ((flags & (POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER))
+ == POSIX_SPAWN_SETSCHEDPARAM)
+ {
+ if (sched_setparam (0, &attrp->_sp) == -1)
+ _exit (SPAWN_ERROR);
+ }
+ else if ((flags & POSIX_SPAWN_SETSCHEDULER) != 0)
+ {
+ if (sched_setscheduler (0, attrp->_policy,
+ (flags & POSIX_SPAWN_SETSCHEDPARAM) != 0
+ ? &attrp->_sp : NULL) == -1)
+ _exit (SPAWN_ERROR);
+ }
+#endif
+
+ /* Set the process group ID. */
+ if ((flags & POSIX_SPAWN_SETPGROUP) != 0
+ && setpgid (0, attrp->_pgrp) != 0)
+ _exit (SPAWN_ERROR);
+
+ /* Set the effective user and group IDs. */
+ if ((flags & POSIX_SPAWN_RESETIDS) != 0
+ && (local_seteuid (getuid ()) != 0
+ || local_setegid (getgid ()) != 0))
+ _exit (SPAWN_ERROR);
+
+ /* Execute the file actions. */
+ if (file_actions != NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; cnt < file_actions->_used; ++cnt)
+ {
+ struct __spawn_action *action = &file_actions->_actions[cnt];
+
+ switch (action->tag)
+ {
+ case spawn_do_close:
+ if (close_not_cancel (action->action.close_action.fd) != 0)
+ /* Signal the error. */
+ _exit (SPAWN_ERROR);
+ break;
+
+ case spawn_do_open:
+ {
+ int new_fd = open_not_cancel (action->action.open_action.path,
+ action->action.open_action.oflag
+ | O_LARGEFILE,
+ action->action.open_action.mode);
+
+ if (new_fd == -1)
+ /* The 'open' call failed. */
+ _exit (SPAWN_ERROR);
+
+ /* Make sure the desired file descriptor is used. */
+ if (new_fd != action->action.open_action.fd)
+ {
+ if (dup2 (new_fd, action->action.open_action.fd)
+ != action->action.open_action.fd)
+ /* The 'dup2' call failed. */
+ _exit (SPAWN_ERROR);
+
+ if (close_not_cancel (new_fd) != 0)
+ /* The 'close' call failed. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ break;
+
+ case spawn_do_dup2:
+ if (dup2 (action->action.dup2_action.fd,
+ action->action.dup2_action.newfd)
+ != action->action.dup2_action.newfd)
+ /* The 'dup2' call failed. */
+ _exit (SPAWN_ERROR);
+ break;
+
+ case spawn_do_chdir:
+ if (chdir (action->action.chdir_action.path) < 0)
+ /* The 'chdir' call failed. */
+ _exit (SPAWN_ERROR);
+ break;
+
+ case spawn_do_fchdir:
+ if (fchdir (action->action.fchdir_action.fd) < 0)
+ /* The 'fchdir' call failed. */
+ _exit (SPAWN_ERROR);
+ break;
+ }
+ }
+ }
+
+ if (! use_path || strchr (file, '/') != NULL)
+ {
+ /* The FILE parameter is actually a path. */
+ execve (file, (char * const *) argv, (char * const *) envp);
+
+ /* Oh, oh. 'execve' returns. This is bad. */
+ _exit (SPAWN_ERROR);
+ }
+
+ /* We have to search for FILE on the path. */
+ path = getenv ("PATH");
+ if (path == NULL)
+ {
+#if HAVE_CONFSTR
+ /* There is no 'PATH' in the environment.
+ The default search path is the current directory
+ followed by the path 'confstr' returns for '_CS_PATH'. */
+ len = confstr (_CS_PATH, (char *) NULL, 0);
+ path = (char *) alloca (1 + len);
+ path[0] = ':';
+ (void) confstr (_CS_PATH, path + 1, len);
+#else
+ /* Pretend that the PATH contains only the current directory. */
+ path = "";
+#endif
+ }
+
+ len = strlen (file) + 1;
+ pathlen = strlen (path);
+ name = alloca (pathlen + len + 1);
+ /* Copy the file name at the top. */
+ name = (char *) memcpy (name + pathlen + 1, file, len);
+ /* And add the slash. */
+ *--name = '/';
+
+ p = path;
+ do
+ {
+ char *startp;
+
+ path = p;
+ p = strchrnul (path, ':');
+
+ if (p == path)
+ /* Two adjacent colons, or a colon at the beginning or the end
+ of 'PATH' means to search the current directory. */
+ startp = name + 1;
+ else
+ startp = (char *) memcpy (name - (p - path), path, p - path);
+
+ /* Try to execute this name. If it works, execv will not return. */
+ execve (startp, (char * const *) argv, (char * const *) envp);
+
+ switch (errno)
+ {
+ case EACCES:
+ case ENOENT:
+ case ESTALE:
+ case ENOTDIR:
+ /* Those errors indicate the file is missing or not executable
+ by us, in which case we want to just try the next path
+ directory. */
+ break;
+
+ default:
+ /* Some other error means we found an executable file, but
+ something went wrong executing it; return the error to our
+ caller. */
+ _exit (SPAWN_ERROR);
+ }
+ }
+ while (*p++ != '\0');
+
+ /* Return with an error. */
+ _exit (SPAWN_ERROR);
+}
+
+#endif
diff --git a/lib/spawnp.c b/lib/spawnp.c
new file mode 100644
index 0000000..91c54a1
--- /dev/null
+++ b/lib/spawnp.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2000, 2009-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <spawn.h>
+
+#include "spawn_int.h"
+
+/* Spawn a new process executing FILE with the attributes describes in *ATTRP.
+ Before running the process perform the actions described in FILE-ACTIONS. */
+int
+posix_spawnp (pid_t *pid, const char *file,
+ const posix_spawn_file_actions_t *file_actions,
+ const posix_spawnattr_t *attrp, char *const argv[],
+ char *const envp[])
+{
+ return __spawni (pid, file, file_actions, attrp,
+ (const char * const *) argv, (const char * const *) envp, 1);
+}
diff --git a/lib/stat-time.c b/lib/stat-time.c
new file mode 100644
index 0000000..81b83dd
--- /dev/null
+++ b/lib/stat-time.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_STAT_TIME_INLINE _GL_EXTERN_INLINE
+#include "stat-time.h"
diff --git a/lib/stat-time.h b/lib/stat-time.h
new file mode 100644
index 0000000..884ffd8
--- /dev/null
+++ b/lib/stat-time.h
@@ -0,0 +1,252 @@
+/* stat-related time functions.
+
+ Copyright (C) 2005, 2007, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef STAT_TIME_H
+#define STAT_TIME_H 1
+
+#include "intprops.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <sys/stat.h>
+#include <time.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_STAT_TIME_INLINE
+# define _GL_STAT_TIME_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* STAT_TIMESPEC (ST, ST_XTIM) is the ST_XTIM member for *ST of type
+ struct timespec, if available. If not, then STAT_TIMESPEC_NS (ST,
+ ST_XTIM) is the nanosecond component of the ST_XTIM member for *ST,
+ if available. ST_XTIM can be st_atim, st_ctim, st_mtim, or st_birthtim
+ for access, status change, data modification, or birth (creation)
+ time respectively.
+
+ These macros are private to stat-time.h. */
+#if _GL_WINDOWS_STAT_TIMESPEC || defined HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+# if _GL_WINDOWS_STAT_TIMESPEC || defined TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim)
+# else
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.tv_nsec)
+# endif
+#elif defined HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
+# define STAT_TIMESPEC(st, st_xtim) ((st)->st_xtim##espec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIMENSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim##ensec)
+#elif defined HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
+# define STAT_TIMESPEC_NS(st, st_xtim) ((st)->st_xtim.st__tim.tv_nsec)
+#endif
+
+/* Return the nanosecond component of *ST's access time. */
+_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
+get_stat_atime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_atim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's status change time. */
+_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
+get_stat_ctime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_ctim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's data modification time. */
+_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
+get_stat_mtime_ns (struct stat const *st)
+{
+# if defined STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim).tv_nsec;
+# elif defined STAT_TIMESPEC_NS
+ return STAT_TIMESPEC_NS (st, st_mtim);
+# else
+ return 0;
+# endif
+}
+
+/* Return the nanosecond component of *ST's birth time. */
+_GL_STAT_TIME_INLINE long int _GL_ATTRIBUTE_PURE
+get_stat_birthtime_ns (struct stat const *st _GL_UNUSED)
+{
+# if defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
+ return STAT_TIMESPEC (st, st_birthtim).tv_nsec;
+# elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ return STAT_TIMESPEC_NS (st, st_birthtim);
+# else
+ return 0;
+# endif
+}
+
+/* Return *ST's access time. */
+_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
+get_stat_atime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_atim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_atime;
+ t.tv_nsec = get_stat_atime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's status change time. */
+_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
+get_stat_ctime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_ctim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = get_stat_ctime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's data modification time. */
+_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
+get_stat_mtime (struct stat const *st)
+{
+#ifdef STAT_TIMESPEC
+ return STAT_TIMESPEC (st, st_mtim);
+#else
+ struct timespec t;
+ t.tv_sec = st->st_mtime;
+ t.tv_nsec = get_stat_mtime_ns (st);
+ return t;
+#endif
+}
+
+/* Return *ST's birth time, if available; otherwise return a value
+ with tv_sec and tv_nsec both equal to -1. */
+_GL_STAT_TIME_INLINE struct timespec _GL_ATTRIBUTE_PURE
+get_stat_birthtime (struct stat const *st _GL_UNUSED)
+{
+ struct timespec t;
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
+ t = STAT_TIMESPEC (st, st_birthtim);
+#elif defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+ t.tv_sec = st->st_birthtime;
+ t.tv_nsec = st->st_birthtimensec;
+#elif defined _WIN32 && ! defined __CYGWIN__
+ /* Native Windows platforms (but not Cygwin) put the "file creation
+ time" in st_ctime (!). See
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions>. */
+# if _GL_WINDOWS_STAT_TIMESPEC
+ t = st->st_ctim;
+# else
+ t.tv_sec = st->st_ctime;
+ t.tv_nsec = 0;
+# endif
+#else
+ /* Birth time is not supported. */
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+#endif
+
+#if (defined HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC \
+ || defined HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC)
+ /* FreeBSD and NetBSD sometimes signal the absence of knowledge by
+ using zero. Attempt to work around this problem. Alas, this can
+ report failure even for valid timestamps. Also, NetBSD
+ sometimes returns junk in the birth time fields; work around this
+ bug if it is detected. */
+ if (! (t.tv_sec && 0 <= t.tv_nsec && t.tv_nsec < 1000000000))
+ {
+ t.tv_sec = -1;
+ t.tv_nsec = -1;
+ }
+#endif
+
+ return t;
+}
+
+/* If a stat-like function returned RESULT, normalize the timestamps
+ in *ST, in case this platform suffers from the Solaris 11 bug where
+ tv_nsec might be negative. Return the adjusted RESULT, setting
+ errno to EOVERFLOW if normalization overflowed. This function
+ is intended to be private to this .h file. */
+_GL_STAT_TIME_INLINE int
+stat_time_normalize (int result, struct stat *st _GL_UNUSED)
+{
+#if defined __sun && defined STAT_TIMESPEC
+ if (result == 0)
+ {
+ long int timespec_hz = 1000000000;
+ short int const ts_off[] = { offsetof (struct stat, st_atim),
+ offsetof (struct stat, st_mtim),
+ offsetof (struct stat, st_ctim) };
+ int i;
+ for (i = 0; i < sizeof ts_off / sizeof *ts_off; i++)
+ {
+ struct timespec *ts = (struct timespec *) ((char *) st + ts_off[i]);
+ long int q = ts->tv_nsec / timespec_hz;
+ long int r = ts->tv_nsec % timespec_hz;
+ if (r < 0)
+ {
+ r += timespec_hz;
+ q--;
+ }
+ ts->tv_nsec = r;
+ /* Overflow is possible, as Solaris 11 stat can yield
+ tv_sec == TYPE_MINIMUM (time_t) && tv_nsec == -1000000000.
+ INT_ADD_WRAPV is OK, since time_t is signed on Solaris. */
+ if (INT_ADD_WRAPV (q, ts->tv_sec, &ts->tv_sec))
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ }
+ }
+#endif
+ return result;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif
diff --git a/lib/stat-w32.c b/lib/stat-w32.c
new file mode 100644
index 0000000..108ce19
--- /dev/null
+++ b/lib/stat-w32.c
@@ -0,0 +1,461 @@
+/* Core of implementation of fstat and stat for native Windows.
+ Copyright (C) 2017-2020 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/>. */
+
+/* Written by Bruno Haible. */
+
+#include <config.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Attempt to make <windows.h> define FILE_ID_INFO.
+ But ensure that the redefinition of _WIN32_WINNT does not make us assume
+ Windows Vista or newer when building for an older version of Windows. */
+#if HAVE_SDKDDKVER_H
+# include <sdkddkver.h>
+# if _WIN32_WINNT >= _WIN32_WINNT_VISTA
+# define WIN32_ASSUME_VISTA 1
+# else
+# define WIN32_ASSUME_VISTA 0
+# endif
+# if !defined _WIN32_WINNT || (_WIN32_WINNT < _WIN32_WINNT_WIN8)
+# undef _WIN32_WINNT
+# define _WIN32_WINNT _WIN32_WINNT_WIN8
+# endif
+#else
+# define WIN32_ASSUME_VISTA (_WIN32_WINNT >= _WIN32_WINNT_VISTA)
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <limits.h>
+#include <string.h>
+#include <unistd.h>
+#include <windows.h>
+
+/* Specification. */
+#include "stat-w32.h"
+
+#include "pathmax.h"
+#include "verify.h"
+
+/* Don't assume that UNICODE is not defined. */
+#undef LoadLibrary
+#define LoadLibrary LoadLibraryA
+#undef GetFinalPathNameByHandle
+#define GetFinalPathNameByHandle GetFinalPathNameByHandleA
+
+/* Older mingw headers do not define VOLUME_NAME_NONE. */
+#ifndef VOLUME_NAME_NONE
+# define VOLUME_NAME_NONE 4
+#endif
+
+#if !WIN32_ASSUME_VISTA
+
+/* Avoid warnings from gcc -Wcast-function-type. */
+# define GetProcAddress \
+ (void *) GetProcAddress
+
+# if _GL_WINDOWS_STAT_INODES == 2
+/* GetFileInformationByHandleEx was introduced only in Windows Vista. */
+typedef DWORD (WINAPI * GetFileInformationByHandleExFuncType) (HANDLE hFile,
+ FILE_INFO_BY_HANDLE_CLASS fiClass,
+ LPVOID lpBuffer,
+ DWORD dwBufferSize);
+static GetFileInformationByHandleExFuncType GetFileInformationByHandleExFunc = NULL;
+# endif
+/* GetFinalPathNameByHandle was introduced only in Windows Vista. */
+typedef DWORD (WINAPI * GetFinalPathNameByHandleFuncType) (HANDLE hFile,
+ LPSTR lpFilePath,
+ DWORD lenFilePath,
+ DWORD dwFlags);
+static GetFinalPathNameByHandleFuncType GetFinalPathNameByHandleFunc = NULL;
+static BOOL initialized = FALSE;
+
+static void
+initialize (void)
+{
+ HMODULE kernel32 = LoadLibrary ("kernel32.dll");
+ if (kernel32 != NULL)
+ {
+# if _GL_WINDOWS_STAT_INODES == 2
+ GetFileInformationByHandleExFunc =
+ (GetFileInformationByHandleExFuncType) GetProcAddress (kernel32, "GetFileInformationByHandleEx");
+# endif
+ GetFinalPathNameByHandleFunc =
+ (GetFinalPathNameByHandleFuncType) GetProcAddress (kernel32, "GetFinalPathNameByHandleA");
+ }
+ initialized = TRUE;
+}
+
+#else
+
+# define GetFileInformationByHandleExFunc GetFileInformationByHandleEx
+# define GetFinalPathNameByHandleFunc GetFinalPathNameByHandle
+
+#endif
+
+/* Converts a FILETIME to GMT time since 1970-01-01 00:00:00. */
+#if _GL_WINDOWS_STAT_TIMESPEC
+struct timespec
+_gl_convert_FILETIME_to_timespec (const FILETIME *ft)
+{
+ struct timespec result;
+ /* FILETIME: <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
+ unsigned long long since_1601 =
+ ((unsigned long long) ft->dwHighDateTime << 32)
+ | (unsigned long long) ft->dwLowDateTime;
+ if (since_1601 == 0)
+ {
+ result.tv_sec = 0;
+ result.tv_nsec = 0;
+ }
+ else
+ {
+ /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89
+ leap years, in total 134774 days. */
+ unsigned long long since_1970 =
+ since_1601 - (unsigned long long) 134774 * (unsigned long long) 86400 * (unsigned long long) 10000000;
+ result.tv_sec = since_1970 / (unsigned long long) 10000000;
+ result.tv_nsec = (unsigned long) (since_1970 % (unsigned long long) 10000000) * 100;
+ }
+ return result;
+}
+#else
+time_t
+_gl_convert_FILETIME_to_POSIX (const FILETIME *ft)
+{
+ /* FILETIME: <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
+ unsigned long long since_1601 =
+ ((unsigned long long) ft->dwHighDateTime << 32)
+ | (unsigned long long) ft->dwLowDateTime;
+ if (since_1601 == 0)
+ return 0;
+ else
+ {
+ /* Between 1601-01-01 and 1970-01-01 there were 280 normal years and 89
+ leap years, in total 134774 days. */
+ unsigned long long since_1970 =
+ since_1601 - (unsigned long long) 134774 * (unsigned long long) 86400 * (unsigned long long) 10000000;
+ return since_1970 / (unsigned long long) 10000000;
+ }
+}
+#endif
+
+/* Fill *BUF with information about the file designated by H.
+ PATH is the file name, if known, otherwise NULL.
+ Return 0 if successful, or -1 with errno set upon failure. */
+int
+_gl_fstat_by_handle (HANDLE h, const char *path, struct stat *buf)
+{
+ /* GetFileType
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfiletype> */
+ DWORD type = GetFileType (h);
+ if (type == FILE_TYPE_DISK)
+ {
+#if !WIN32_ASSUME_VISTA
+ if (!initialized)
+ initialize ();
+#endif
+
+ /* st_mode can be determined through
+ GetFileAttributesEx
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileattributesexa>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_win32_file_attribute_data>
+ or through
+ GetFileInformationByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileinformationbyhandle>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_by_handle_file_information>
+ or through
+ GetFileInformationByHandleEx with argument FileBasicInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_basic_info>
+ The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */
+ BY_HANDLE_FILE_INFORMATION info;
+ if (! GetFileInformationByHandle (h, &info))
+ goto failed;
+
+ /* Test for error conditions before starting to fill *buf. */
+ if (sizeof (buf->st_size) <= 4 && info.nFileSizeHigh > 0)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+#if _GL_WINDOWS_STAT_INODES
+ /* st_ino can be determined through
+ GetFileInformationByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileinformationbyhandle>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_by_handle_file_information>
+ as 64 bits, or through
+ GetFileInformationByHandleEx with argument FileIdInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_id_info>
+ as 128 bits.
+ The latter requires -D_WIN32_WINNT=_WIN32_WINNT_WIN8 or higher. */
+ /* Experiments show that GetFileInformationByHandleEx does not provide
+ much more information than GetFileInformationByHandle:
+ * The dwVolumeSerialNumber from GetFileInformationByHandle is equal
+ to the low 32 bits of the 64-bit VolumeSerialNumber from
+ GetFileInformationByHandleEx, and is apparently sufficient for
+ identifying the device.
+ * The nFileIndex from GetFileInformationByHandle is equal to the low
+ 64 bits of the 128-bit FileId from GetFileInformationByHandleEx,
+ and the high 64 bits of this 128-bit FileId are zero.
+ * On a FAT file system, GetFileInformationByHandleEx fails with error
+ ERROR_INVALID_PARAMETER, whereas GetFileInformationByHandle
+ succeeds.
+ * On a CIFS/SMB file system, GetFileInformationByHandleEx fails with
+ error ERROR_INVALID_LEVEL, whereas GetFileInformationByHandle
+ succeeds. */
+# if _GL_WINDOWS_STAT_INODES == 2
+ if (GetFileInformationByHandleExFunc != NULL)
+ {
+ FILE_ID_INFO id;
+ if (GetFileInformationByHandleExFunc (h, FileIdInfo, &id, sizeof (id)))
+ {
+ buf->st_dev = id.VolumeSerialNumber;
+ verify (sizeof (ino_t) == sizeof (id.FileId));
+ memcpy (&buf->st_ino, &id.FileId, sizeof (ino_t));
+ goto ino_done;
+ }
+ else
+ {
+ switch (GetLastError ())
+ {
+ case ERROR_INVALID_PARAMETER: /* older Windows version, or FAT */
+ case ERROR_INVALID_LEVEL: /* CIFS/SMB file system */
+ goto fallback;
+ default:
+ goto failed;
+ }
+ }
+ }
+ fallback: ;
+ /* Fallback for older Windows versions. */
+ buf->st_dev = info.dwVolumeSerialNumber;
+ buf->st_ino._gl_ino[0] = ((ULONGLONG) info.nFileIndexHigh << 32) | (ULONGLONG) info.nFileIndexLow;
+ buf->st_ino._gl_ino[1] = 0;
+ ino_done: ;
+# else /* _GL_WINDOWS_STAT_INODES == 1 */
+ buf->st_dev = info.dwVolumeSerialNumber;
+ buf->st_ino = ((ULONGLONG) info.nFileIndexHigh << 32) | (ULONGLONG) info.nFileIndexLow;
+# endif
+#else
+ /* st_ino is not wide enough for identifying a file on a device.
+ Without st_ino, st_dev is pointless. */
+ buf->st_dev = 0;
+ buf->st_ino = 0;
+#endif
+
+ /* st_mode. */
+ unsigned int mode =
+ /* XXX How to handle FILE_ATTRIBUTE_REPARSE_POINT ? */
+ ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR | S_IEXEC_UGO : _S_IFREG)
+ | S_IREAD_UGO
+ | ((info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE_UGO);
+ if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* Determine whether the file is executable by looking at the file
+ name suffix.
+ If the file name is already known, use it. Otherwise, for
+ non-empty files, it can be determined through
+ GetFinalPathNameByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfinalpathnamebyhandlea>
+ or through
+ GetFileInformationByHandleEx with argument FileNameInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_name_info>
+ Both require -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */
+ if (info.nFileSizeHigh > 0 || info.nFileSizeLow > 0)
+ {
+ char fpath[PATH_MAX];
+ if (path != NULL
+ || (GetFinalPathNameByHandleFunc != NULL
+ && GetFinalPathNameByHandleFunc (h, fpath, sizeof (fpath), VOLUME_NAME_NONE)
+ < sizeof (fpath)
+ && (path = fpath, 1)))
+ {
+ const char *last_dot = NULL;
+ const char *p;
+ for (p = path; *p != '\0'; p++)
+ if (*p == '.')
+ last_dot = p;
+ if (last_dot != NULL)
+ {
+ const char *suffix = last_dot + 1;
+ if (_stricmp (suffix, "exe") == 0
+ || _stricmp (suffix, "bat") == 0
+ || _stricmp (suffix, "cmd") == 0
+ || _stricmp (suffix, "com") == 0)
+ mode |= S_IEXEC_UGO;
+ }
+ }
+ else
+ /* Cannot determine file name. Pretend that it is executable. */
+ mode |= S_IEXEC_UGO;
+ }
+ }
+ buf->st_mode = mode;
+
+ /* st_nlink can be determined through
+ GetFileInformationByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileinformationbyhandle>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_by_handle_file_information>
+ or through
+ GetFileInformationByHandleEx with argument FileStandardInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_standard_info>
+ The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */
+ buf->st_nlink = (info.nNumberOfLinks > SHRT_MAX ? SHRT_MAX : info.nNumberOfLinks);
+
+ /* There's no easy way to map the Windows SID concept to an integer. */
+ buf->st_uid = 0;
+ buf->st_gid = 0;
+
+ /* st_rdev is irrelevant for normal files and directories. */
+ buf->st_rdev = 0;
+
+ /* st_size can be determined through
+ GetFileSizeEx
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfilesizeex>
+ or through
+ GetFileAttributesEx
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileattributesexa>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_win32_file_attribute_data>
+ or through
+ GetFileInformationByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileinformationbyhandle>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_by_handle_file_information>
+ or through
+ GetFileInformationByHandleEx with argument FileStandardInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_standard_info>
+ The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */
+ if (sizeof (buf->st_size) <= 4)
+ /* Range check already done above. */
+ buf->st_size = info.nFileSizeLow;
+ else
+ buf->st_size = ((long long) info.nFileSizeHigh << 32) | (long long) info.nFileSizeLow;
+
+ /* st_atime, st_mtime, st_ctime can be determined through
+ GetFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfiletime>
+ or through
+ GetFileAttributesEx
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileattributesexa>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_win32_file_attribute_data>
+ or through
+ GetFileInformationByHandle
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileinformationbyhandle>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/ns-fileapi-_by_handle_file_information>
+ or through
+ GetFileInformationByHandleEx with argument FileBasicInfo
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getfileinformationbyhandleex>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/winbase/ns-winbase-_file_basic_info>
+ The latter requires -D_WIN32_WINNT=_WIN32_WINNT_VISTA or higher. */
+#if _GL_WINDOWS_STAT_TIMESPEC
+ buf->st_atim = _gl_convert_FILETIME_to_timespec (&info.ftLastAccessTime);
+ buf->st_mtim = _gl_convert_FILETIME_to_timespec (&info.ftLastWriteTime);
+ buf->st_ctim = _gl_convert_FILETIME_to_timespec (&info.ftCreationTime);
+#else
+ buf->st_atime = _gl_convert_FILETIME_to_POSIX (&info.ftLastAccessTime);
+ buf->st_mtime = _gl_convert_FILETIME_to_POSIX (&info.ftLastWriteTime);
+ buf->st_ctime = _gl_convert_FILETIME_to_POSIX (&info.ftCreationTime);
+#endif
+
+ return 0;
+ }
+ else if (type == FILE_TYPE_CHAR || type == FILE_TYPE_PIPE)
+ {
+ buf->st_dev = 0;
+#if _GL_WINDOWS_STAT_INODES == 2
+ buf->st_ino._gl_ino[0] = buf->st_ino._gl_ino[1] = 0;
+#else
+ buf->st_ino = 0;
+#endif
+ buf->st_mode = (type == FILE_TYPE_PIPE ? _S_IFIFO : _S_IFCHR);
+ buf->st_nlink = 1;
+ buf->st_uid = 0;
+ buf->st_gid = 0;
+ buf->st_rdev = 0;
+ if (type == FILE_TYPE_PIPE)
+ {
+ /* PeekNamedPipe
+ <https://msdn.microsoft.com/en-us/library/aa365779.aspx> */
+ DWORD bytes_available;
+ if (PeekNamedPipe (h, NULL, 0, NULL, &bytes_available, NULL))
+ buf->st_size = bytes_available;
+ else
+ buf->st_size = 0;
+ }
+ else
+ buf->st_size = 0;
+#if _GL_WINDOWS_STAT_TIMESPEC
+ buf->st_atim.tv_sec = 0; buf->st_atim.tv_nsec = 0;
+ buf->st_mtim.tv_sec = 0; buf->st_mtim.tv_nsec = 0;
+ buf->st_ctim.tv_sec = 0; buf->st_ctim.tv_nsec = 0;
+#else
+ buf->st_atime = 0;
+ buf->st_mtime = 0;
+ buf->st_ctime = 0;
+#endif
+ return 0;
+ }
+ else
+ {
+ errno = ENOENT;
+ return -1;
+ }
+
+ failed:
+ {
+ DWORD error = GetLastError ();
+ #if 0
+ fprintf (stderr, "_gl_fstat_by_handle error 0x%x\n", (unsigned int) error);
+ #endif
+ switch (error)
+ {
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ errno = EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+ return -1;
+ }
+}
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif
diff --git a/lib/stat-w32.h b/lib/stat-w32.h
new file mode 100644
index 0000000..491a754
--- /dev/null
+++ b/lib/stat-w32.h
@@ -0,0 +1,37 @@
+/* Core of implementation of fstat and stat for native Windows.
+ Copyright (C) 2017-2020 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/>. */
+
+#ifndef _STAT_W32_H
+#define _STAT_W32_H 1
+
+/* Converts a FILETIME to GMT time since 1970-01-01 00:00:00. */
+#if _GL_WINDOWS_STAT_TIMESPEC
+extern struct timespec _gl_convert_FILETIME_to_timespec (const FILETIME *ft);
+#else
+extern time_t _gl_convert_FILETIME_to_POSIX (const FILETIME *ft);
+#endif
+
+/* Fill *BUF with information about the file designated by H.
+ PATH is the file name, if known, otherwise NULL.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int _gl_fstat_by_handle (HANDLE h, const char *path, struct stat *buf);
+
+/* Bitmasks for st_mode. */
+#define S_IREAD_UGO (_S_IREAD | (_S_IREAD >> 3) | (_S_IREAD >> 6))
+#define S_IWRITE_UGO (_S_IWRITE | (_S_IWRITE >> 3) | (_S_IWRITE >> 6))
+#define S_IEXEC_UGO (_S_IEXEC | (_S_IEXEC >> 3) | (_S_IEXEC >> 6))
+
+#endif /* _STAT_W32_H */
diff --git a/lib/stat.c b/lib/stat.c
new file mode 100644
index 0000000..9d3965d
--- /dev/null
+++ b/lib/stat.c
@@ -0,0 +1,440 @@
+/* Work around platform bugs in stat.
+ Copyright (C) 2009-2020 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/>. */
+
+/* Written by Eric Blake and Bruno Haible. */
+
+/* If the user's config.h happens to include <sys/stat.h>, let it include only
+ the system's <sys/stat.h> here, so that orig_stat doesn't recurse to
+ rpl_stat. */
+#define __need_system_sys_stat_h
+#include <config.h>
+
+/* Get the original definition of stat. It might be defined as a macro. */
+#include <sys/types.h>
+#include <sys/stat.h>
+#undef __need_system_sys_stat_h
+
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WINDOWS_NATIVE
+#endif
+
+#if !defined WINDOWS_NATIVE
+
+static int
+orig_stat (const char *filename, struct stat *buf)
+{
+ return stat (filename, buf);
+}
+
+#endif
+
+/* Specification. */
+#ifdef __osf__
+/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
+ eliminates this include because of the preliminary #include <sys/stat.h>
+ above. */
+# include "sys/stat.h"
+#else
+# include <sys/stat.h>
+#endif
+
+#include "stat-time.h"
+
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <string.h>
+#include "filename.h"
+#include "malloca.h"
+#include "verify.h"
+
+#ifdef WINDOWS_NATIVE
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include "stat-w32.h"
+/* Don't assume that UNICODE is not defined. */
+# undef WIN32_FIND_DATA
+# define WIN32_FIND_DATA WIN32_FIND_DATAA
+# undef CreateFile
+# define CreateFile CreateFileA
+# undef FindFirstFile
+# define FindFirstFile FindFirstFileA
+#endif
+
+#ifdef WINDOWS_NATIVE
+/* Return TRUE if the given file name denotes an UNC root. */
+static BOOL
+is_unc_root (const char *rname)
+{
+ /* Test whether it has the syntax '\\server\share'. */
+ if (ISSLASH (rname[0]) && ISSLASH (rname[1]))
+ {
+ /* It starts with two slashes. Find the next slash. */
+ const char *p = rname + 2;
+ const char *q = p;
+ while (*q != '\0' && !ISSLASH (*q))
+ q++;
+ if (q > p && *q != '\0')
+ {
+ /* Found the next slash at q. */
+ q++;
+ const char *r = q;
+ while (*r != '\0' && !ISSLASH (*r))
+ r++;
+ if (r > q && *r == '\0')
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+#endif
+
+/* Store information about NAME into ST. Work around bugs with
+ trailing slashes. Mingw has other bugs (such as st_ino always
+ being 0 on success) which this wrapper does not work around. But
+ at least this implementation provides the ability to emulate fchdir
+ correctly. */
+
+int
+rpl_stat (char const *name, struct stat *buf)
+{
+#ifdef WINDOWS_NATIVE
+ /* Fill the fields ourselves, because the original stat function returns
+ values for st_atime, st_mtime, st_ctime that depend on the current time
+ zone. See
+ <https://lists.gnu.org/r/bug-gnulib/2017-04/msg00134.html> */
+ /* XXX Should we convert to wchar_t* and prepend '\\?\', in order to work
+ around length limitations
+ <https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file> ? */
+
+ /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>
+ specifies: "More than two leading <slash> characters shall be treated as
+ a single <slash> character." */
+ if (ISSLASH (name[0]) && ISSLASH (name[1]) && ISSLASH (name[2]))
+ {
+ name += 2;
+ while (ISSLASH (name[1]))
+ name++;
+ }
+
+ size_t len = strlen (name);
+ size_t drive_prefix_len = (HAS_DEVICE (name) ? 2 : 0);
+
+ /* Remove trailing slashes (except the very first one, at position
+ drive_prefix_len), but remember their presence. */
+ size_t rlen;
+ bool check_dir = false;
+
+ rlen = len;
+ while (rlen > drive_prefix_len && ISSLASH (name[rlen-1]))
+ {
+ check_dir = true;
+ if (rlen == drive_prefix_len + 1)
+ break;
+ rlen--;
+ }
+
+ /* Handle '' and 'C:'. */
+ if (!check_dir && rlen == drive_prefix_len)
+ {
+ errno = ENOENT;
+ return -1;
+ }
+
+ /* Handle '\\'. */
+ if (rlen == 1 && ISSLASH (name[0]) && len >= 2)
+ {
+ errno = ENOENT;
+ return -1;
+ }
+
+ const char *rname;
+ char *malloca_rname;
+ if (rlen == len)
+ {
+ rname = name;
+ malloca_rname = NULL;
+ }
+ else
+ {
+ malloca_rname = malloca (rlen + 1);
+ if (malloca_rname == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ memcpy (malloca_rname, name, rlen);
+ malloca_rname[rlen] = '\0';
+ rname = malloca_rname;
+ }
+
+ /* There are two ways to get at the requested information:
+ - by scanning the parent directory and examining the relevant
+ directory entry,
+ - by opening the file directly.
+ The first approach fails for root directories (e.g. 'C:\') and
+ UNC root directories (e.g. '\\server\share').
+ The second approach fails for some system files (e.g. 'C:\pagefile.sys'
+ and 'C:\hiberfil.sys'): ERROR_SHARING_VIOLATION.
+ The second approach gives more information (in particular, correct
+ st_dev, st_ino, st_nlink fields).
+ So we use the second approach and, as a fallback except for root and
+ UNC root directories, also the first approach. */
+ {
+ int ret;
+
+ {
+ /* Approach based on the file. */
+
+ /* Open a handle to the file.
+ CreateFile
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea>
+ <https://docs.microsoft.com/en-us/windows/desktop/FileIO/creating-and-opening-files> */
+ HANDLE h =
+ CreateFile (rname,
+ FILE_READ_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ /* FILE_FLAG_POSIX_SEMANTICS (treat file names that differ only
+ in case as different) makes sense only when applied to *all*
+ filesystem operations. */
+ FILE_FLAG_BACKUP_SEMANTICS /* | FILE_FLAG_POSIX_SEMANTICS */,
+ NULL);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ ret = _gl_fstat_by_handle (h, rname, buf);
+ CloseHandle (h);
+ goto done;
+ }
+ }
+
+ /* Test for root and UNC root directories. */
+ if ((rlen == drive_prefix_len + 1 && ISSLASH (rname[drive_prefix_len]))
+ || is_unc_root (rname))
+ goto failed;
+
+ /* Fallback. */
+ {
+ /* Approach based on the directory entry. */
+
+ if (strchr (rname, '?') != NULL || strchr (rname, '*') != NULL)
+ {
+ /* Other Windows API functions would fail with error
+ ERROR_INVALID_NAME. */
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+ errno = ENOENT;
+ return -1;
+ }
+
+ /* Get the details about the directory entry. This can be done through
+ FindFirstFile
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-findfirstfilea>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-_win32_find_dataa>
+ or through
+ FindFirstFileEx with argument FindExInfoBasic
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-findfirstfileexa>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ne-minwinbase-findex_info_levels>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-_win32_find_dataa> */
+ WIN32_FIND_DATA info;
+ HANDLE h = FindFirstFile (rname, &info);
+ if (h == INVALID_HANDLE_VALUE)
+ goto failed;
+
+ /* Test for error conditions before starting to fill *buf. */
+ if (sizeof (buf->st_size) <= 4 && info.nFileSizeHigh > 0)
+ {
+ FindClose (h);
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+# if _GL_WINDOWS_STAT_INODES
+ buf->st_dev = 0;
+# if _GL_WINDOWS_STAT_INODES == 2
+ buf->st_ino._gl_ino[0] = buf->st_ino._gl_ino[1] = 0;
+# else /* _GL_WINDOWS_STAT_INODES == 1 */
+ buf->st_ino = 0;
+# endif
+# else
+ /* st_ino is not wide enough for identifying a file on a device.
+ Without st_ino, st_dev is pointless. */
+ buf->st_dev = 0;
+ buf->st_ino = 0;
+# endif
+
+ /* st_mode. */
+ unsigned int mode =
+ /* XXX How to handle FILE_ATTRIBUTE_REPARSE_POINT ? */
+ ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? _S_IFDIR | S_IEXEC_UGO : _S_IFREG)
+ | S_IREAD_UGO
+ | ((info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? 0 : S_IWRITE_UGO);
+ if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* Determine whether the file is executable by looking at the file
+ name suffix. */
+ if (info.nFileSizeHigh > 0 || info.nFileSizeLow > 0)
+ {
+ const char *last_dot = NULL;
+ const char *p;
+ for (p = info.cFileName; *p != '\0'; p++)
+ if (*p == '.')
+ last_dot = p;
+ if (last_dot != NULL)
+ {
+ const char *suffix = last_dot + 1;
+ if (_stricmp (suffix, "exe") == 0
+ || _stricmp (suffix, "bat") == 0
+ || _stricmp (suffix, "cmd") == 0
+ || _stricmp (suffix, "com") == 0)
+ mode |= S_IEXEC_UGO;
+ }
+ }
+ }
+ buf->st_mode = mode;
+
+ /* st_nlink. Ignore hard links here. */
+ buf->st_nlink = 1;
+
+ /* There's no easy way to map the Windows SID concept to an integer. */
+ buf->st_uid = 0;
+ buf->st_gid = 0;
+
+ /* st_rdev is irrelevant for normal files and directories. */
+ buf->st_rdev = 0;
+
+ /* st_size. */
+ if (sizeof (buf->st_size) <= 4)
+ /* Range check already done above. */
+ buf->st_size = info.nFileSizeLow;
+ else
+ buf->st_size = ((long long) info.nFileSizeHigh << 32) | (long long) info.nFileSizeLow;
+
+ /* st_atime, st_mtime, st_ctime. */
+# if _GL_WINDOWS_STAT_TIMESPEC
+ buf->st_atim = _gl_convert_FILETIME_to_timespec (&info.ftLastAccessTime);
+ buf->st_mtim = _gl_convert_FILETIME_to_timespec (&info.ftLastWriteTime);
+ buf->st_ctim = _gl_convert_FILETIME_to_timespec (&info.ftCreationTime);
+# else
+ buf->st_atime = _gl_convert_FILETIME_to_POSIX (&info.ftLastAccessTime);
+ buf->st_mtime = _gl_convert_FILETIME_to_POSIX (&info.ftLastWriteTime);
+ buf->st_ctime = _gl_convert_FILETIME_to_POSIX (&info.ftCreationTime);
+# endif
+
+ FindClose (h);
+
+ ret = 0;
+ }
+
+ done:
+ if (ret >= 0 && check_dir && !S_ISDIR (buf->st_mode))
+ {
+ errno = ENOTDIR;
+ ret = -1;
+ }
+ if (malloca_rname != NULL)
+ {
+ int saved_errno = errno;
+ freea (malloca_rname);
+ errno = saved_errno;
+ }
+ return ret;
+ }
+
+ failed:
+ {
+ DWORD error = GetLastError ();
+ #if 0
+ fprintf (stderr, "rpl_stat error 0x%x\n", (unsigned int) error);
+ #endif
+
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+
+ switch (error)
+ {
+ /* Some of these errors probably cannot happen with the specific flags
+ that we pass to CreateFile. But who knows... */
+ case ERROR_FILE_NOT_FOUND: /* The last component of rname does not exist. */
+ case ERROR_PATH_NOT_FOUND: /* Some directory component in rname does not exist. */
+ case ERROR_BAD_PATHNAME: /* rname is such as '\\server'. */
+ case ERROR_BAD_NET_NAME: /* rname is such as '\\server\nonexistentshare'. */
+ case ERROR_INVALID_NAME: /* rname contains wildcards, misplaced colon, etc. */
+ case ERROR_DIRECTORY:
+ errno = ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED: /* rname is such as 'C:\System Volume Information\foo'. */
+ case ERROR_SHARING_VIOLATION: /* rname is such as 'C:\pagefile.sys' (second approach only). */
+ /* XXX map to EACCES or EPERM? */
+ errno = EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_WRITE_PROTECT:
+ errno = EROFS;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_DELETE_PENDING: /* XXX map to EACCES or EPERM? */
+ errno = EPERM;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ return -1;
+ }
+#else
+ int result = orig_stat (name, buf);
+ if (result == 0)
+ {
+# if REPLACE_FUNC_STAT_FILE
+ /* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. */
+ if (!S_ISDIR (buf->st_mode))
+ {
+ size_t len = strlen (name);
+ if (ISSLASH (name[len - 1]))
+ {
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+# endif /* REPLACE_FUNC_STAT_FILE */
+ result = stat_time_normalize (result, buf);
+ }
+ return result;
+#endif
+}
diff --git a/lib/stdalign.in.h b/lib/stdalign.in.h
new file mode 100644
index 0000000..b5b63e5
--- /dev/null
+++ b/lib/stdalign.in.h
@@ -0,0 +1,126 @@
+/* A substitute for ISO C11 <stdalign.h>.
+
+ Copyright 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Paul Eggert and Bruno Haible. */
+
+#ifndef _GL_STDALIGN_H
+#define _GL_STDALIGN_H
+
+/* ISO C11 <stdalign.h> for platforms that lack it.
+
+ References:
+ ISO C11 (latest free draft
+ <http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
+ sections 6.5.3.4, 6.7.5, 7.15.
+ C++11 (latest free draft
+ <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
+ section 18.10. */
+
+/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
+ requirement of a structure member (i.e., slot or field) that is of
+ type TYPE, as an integer constant expression.
+
+ This differs from GCC's and clang's __alignof__ operator, which can
+ yield a better-performing alignment for an object of that type. For
+ example, on x86 with GCC and on Linux/x86 with clang,
+ __alignof__ (double) and __alignof__ (long long) are 8, whereas
+ alignof (double) and alignof (long long) are 4 unless the option
+ '-malign-double' is used.
+
+ The result cannot be used as a value for an 'enum' constant, if you
+ want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc.
+
+ Include <stddef.h> for offsetof. */
+#include <stddef.h>
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+ standard headers, defines conflicting implementations of _Alignas
+ and _Alignof that are no better than ours; override them. */
+#undef _Alignas
+#undef _Alignof
+
+/* GCC releases before GCC 4.9 had a bug in _Alignof. See GCC bug 52023
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>.
+ clang versions < 8.0.0 have the same bug. */
+#if (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112 \
+ || (defined __GNUC__ && __GNUC__ < 4 + (__GNUC_MINOR__ < 9) \
+ && !defined __clang__) \
+ || (defined __clang__ && __clang_major__ < 8))
+# ifdef __cplusplus
+# if 201103 <= __cplusplus
+# define _Alignof(type) alignof (type)
+# else
+ template <class __t> struct __alignof_helper { char __a; __t __b; };
+# define _Alignof(type) offsetof (__alignof_helper<type>, __b)
+# endif
+# else
+# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
+# endif
+#endif
+#if ! (defined __cplusplus && 201103 <= __cplusplus)
+# define alignof _Alignof
+#endif
+#define __alignof_is_defined 1
+
+/* alignas (A), also known as _Alignas (A), aligns a variable or type
+ to the alignment A, where A is an integer constant expression. For
+ example:
+
+ int alignas (8) foo;
+ struct s { int a; int alignas (8) bar; };
+
+ aligns the address of FOO and the offset of BAR to be multiples of 8.
+
+ A should be a power of two that is at least the type's alignment
+ and at most the implementation's alignment limit. This limit is
+ 2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
+ to MSVC through at least version 10.0, A should be an integer
+ constant, as MSVC does not support expressions such as 1 << 3.
+ To be portable to Sun C 5.11, do not align auto variables to
+ anything stricter than their default alignment.
+
+ The following C11 requirements are not supported here:
+
+ - If A is zero, alignas has no effect.
+ - alignas can be used multiple times; the strictest one wins.
+ - alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
+
+ */
+
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112
+# if defined __cplusplus && 201103 <= __cplusplus
+# define _Alignas(a) alignas (a)
+# elif ((defined __APPLE__ && defined __MACH__ \
+ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ : __GNUC__ && !defined __ibmxl__) \
+ || (4 <= __clang_major__) \
+ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__)
+# define _Alignas(a) __attribute__ ((__aligned__ (a)))
+# elif 1300 <= _MSC_VER
+# define _Alignas(a) __declspec (align (a))
+# endif
+#endif
+#if ((defined _Alignas && ! (defined __cplusplus && 201103 <= __cplusplus)) \
+ || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
+# define alignas _Alignas
+#endif
+#if defined alignas || (defined __cplusplus && 201103 <= __cplusplus)
+# define __alignas_is_defined 1
+#endif
+
+#endif /* _GL_STDALIGN_H */
diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h
new file mode 100644
index 0000000..baacf98
--- /dev/null
+++ b/lib/stdbool.in.h
@@ -0,0 +1,132 @@
+/* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _GL_STDBOOL_H
+#define _GL_STDBOOL_H
+
+/* ISO C 99 <stdbool.h> for platforms that lack it. */
+
+/* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - Bit-fields of type 'bool' are not supported. Portable code
+ should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ - C99 allows the use of (_Bool)0.0 in constant expressions, but
+ this substitute cannot always provide this property.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
+/* 7.16. Boolean type and values */
+
+/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
+ definitions below, but temporarily we have to #undef them. */
+#if defined __BEOS__ && !defined __HAIKU__
+# include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
+#endif
+
+#ifdef __cplusplus
+# define _Bool bool
+# define bool bool
+#else
+# if defined __BEOS__ && !defined __HAIKU__
+ /* A compiler known to have 'bool'. */
+ /* If the compiler already has both 'bool' and '_Bool', we can assume they
+ are the same types. */
+# if !@HAVE__BOOL@
+typedef bool _Bool;
+# endif
+# else
+# if !defined __GNUC__
+ /* If @HAVE__BOOL@:
+ Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+ the built-in _Bool type is used. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ https://lists.gnu.org/r/bug-coreutils/2005-10/msg00086.html
+ Similar bugs are likely with other compilers as well; this file
+ wouldn't be used if <stdbool.h> was working.
+ So we override the _Bool type.
+ If !@HAVE__BOOL@:
+ Need to define _Bool ourselves. As 'signed char' or as an enum type?
+ Use of a typedef, with SunPRO C, leads to a stupid
+ "warning: _Bool is a keyword in ISO C99".
+ Use of an enum type, with IRIX cc, leads to a stupid
+ "warning(1185): enumerated type mixed with another type".
+ Even the existence of an enum type, without a typedef,
+ "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
+ The only benefit of the enum, debuggability, is not important
+ with these compilers. So use 'signed char' and no enum. */
+# define _Bool signed char
+# else
+ /* With this compiler, trust the _Bool type if the compiler has it. */
+# if !@HAVE__BOOL@
+ /* For the sake of symbolic names in gdb, define true and false as
+ enum constants, not only as macros.
+ It is tempting to write
+ typedef enum { false = 0, true = 1 } _Bool;
+ so that gdb prints values of type 'bool' symbolically. But then
+ values of type '_Bool' might promote to 'int' or 'unsigned int'
+ (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+ (see ISO C 99 6.3.1.1.(2)). So add a negative value to the
+ enum; this ensures that '_Bool' promotes to 'int'. */
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
+# endif
+# endif
+# define bool _Bool
+#endif
+
+/* The other macros must be usable in preprocessor directives. */
+#ifdef __cplusplus
+# define false false
+# define true true
+#else
+# define false 0
+# define true 1
+#endif
+
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/lib/stddef.in.h b/lib/stddef.in.h
new file mode 100644
index 0000000..87b46d5
--- /dev/null
+++ b/lib/stddef.in.h
@@ -0,0 +1,121 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+ Copyright (C) 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Eric Blake. */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_wchar_t || defined __need_size_t \
+ || defined __need_ptrdiff_t || defined __need_NULL \
+ || defined __need_wint_t
+/* Special invocation convention inside gcc header files. In
+ particular, gcc provides a version of <stddef.h> that blindly
+ redefines NULL even when __need_wint_t was defined, even though
+ wint_t is not normally provided by <stddef.h>. Hence, we must
+ remember if special invocation has ever been used to obtain wint_t,
+ in which case we need to clean up NULL yet again. */
+
+# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
+# ifdef __need_wint_t
+# define _GL_STDDEF_WINT_T
+# endif
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+# endif
+
+#else
+/* Normal invocation convention. */
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+
+/* The include_next requires a split double-inclusion guard. */
+
+# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
+# if (@REPLACE_NULL@ \
+ && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
+# undef NULL
+# ifdef __cplusplus
+ /* ISO C++ says that the macro NULL must expand to an integer constant
+ expression, hence '((void *) 0)' is not allowed in C++. */
+# if __GNUG__ >= 3
+ /* GNU C++ has a __null macro that behaves like an integer ('int' or
+ 'long') but has the same size as a pointer. Use that, to avoid
+ warnings. */
+# define NULL __null
+# else
+# define NULL 0L
+# endif
+# else
+# define NULL ((void *) 0)
+# endif
+# endif
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+# define _@GUARD_PREFIX@_STDDEF_H
+
+/* Some platforms lack wchar_t. */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+/* Some platforms lack max_align_t. The check for _GCC_MAX_ALIGN_T is
+ a hack in case the configure-time test was done with g++ even though
+ we are currently compiling with gcc.
+ On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
+ included. Its definition is good since it has an alignment of 8 (on x86
+ and x86_64). */
+#if defined _MSC_VER && defined __cplusplus
+# include <cstddef>
+#else
+# if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
+# if !GNULIB_defined_max_align_t
+/* On the x86, the maximum storage alignment of double, long, etc. is 4,
+ but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
+ and the C11 standard allows this. Work around this problem by
+ using __alignof__ (which returns 8 for double) rather than _Alignof
+ (which returns 4), and align each union member accordingly. */
+# if defined __GNUC__ || (__clang_major__ >= 4)
+# define _GL_STDDEF_ALIGNAS(type) \
+ __attribute__ ((__aligned__ (__alignof__ (type))))
+# else
+# define _GL_STDDEF_ALIGNAS(type) /* */
+# endif
+typedef union
+{
+ char *__p _GL_STDDEF_ALIGNAS (char *);
+ double __d _GL_STDDEF_ALIGNAS (double);
+ long double __ld _GL_STDDEF_ALIGNAS (long double);
+ long int __i _GL_STDDEF_ALIGNAS (long int);
+} rpl_max_align_t;
+# define max_align_t rpl_max_align_t
+# define GNULIB_defined_max_align_t 1
+# endif
+# endif
+#endif
+
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/lib/stdint.in.h b/lib/stdint.in.h
new file mode 100644
index 0000000..6f2235a
--- /dev/null
+++ b/lib/stdint.in.h
@@ -0,0 +1,740 @@
+/* Copyright (C) 2001-2002, 2004-2020 Free Software Foundation, Inc.
+ Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+ This file is part of gnulib.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_STDINT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* When including a system file that in turn includes <inttypes.h>,
+ use the system <inttypes.h>, not our substitute. This avoids
+ problems with (for example) VMS, whose <sys/bitypes.h> includes
+ <inttypes.h>. */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* On Android (Bionic libc), <sys/types.h> includes this file before
+ having defined 'time_t'. Therefore in this case avoid including
+ other system header files; just include the system's <stdint.h>.
+ Ideally we should test __BIONIC__ here, but it is only defined after
+ <sys/cdefs.h> has been included; hence test __ANDROID__ instead. */
+#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#else
+
+/* Get those types that are already defined in other system include
+ files, so that we can "#define int8_t signed char" below without
+ worrying about a later system include file containing a "typedef
+ signed char int8_t;" that will get messed up by our macro. Our
+ macros should all be consistent with the system versions, except
+ for the "fast" types and macros, which we recommend against using
+ in public interfaces due to compiler differences. */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+ /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+ with "This header file is to be used only for c99 mode compilations"
+ diagnostics. */
+# define __STDINT_H__
+# endif
+
+ /* Some pre-C++11 <stdint.h> implementations need this. */
+# ifdef __cplusplus
+# ifndef __STDC_CONSTANT_MACROS
+# define __STDC_CONSTANT_MACROS 1
+# endif
+# ifndef __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS 1
+# endif
+# endif
+
+ /* Other systems may have an incomplete or buggy <stdint.h>.
+ Include it before <inttypes.h>, since any "#include <stdint.h>"
+ in <inttypes.h> would reinclude us, skipping our contents because
+ _@GUARD_PREFIX@_STDINT_H is defined.
+ The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _@GUARD_PREFIX@_STDINT_H
+
+/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
+ LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH. */
+#include <limits.h>
+
+/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
+ wint_t. */
+#if @GNULIB_OVERRIDES_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# define WINT_MIN 0x0U
+# define WINT_MAX 0xffffffffU
+#endif
+
+#if ! @HAVE_C99_STDINT_H@
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+ IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+ AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+ Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+ relies on the system <stdint.h> definitions, so include
+ <sys/types.h> after @NEXT_STDINT_H@. */
+# if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+# include <sys/types.h>
+# endif
+
+# if @HAVE_INTTYPES_H@
+ /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+ int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+ <inttypes.h> also defines intptr_t and uintptr_t. */
+# include <inttypes.h>
+# elif @HAVE_SYS_INTTYPES_H@
+ /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+ the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX. */
+# include <sys/inttypes.h>
+# endif
+
+# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+ /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+ int{8,16,32,64}_t and __BIT_TYPES_DEFINED__. In libc5 >= 5.2.2 it is
+ included by <sys/types.h>. */
+# include <sys/bitypes.h>
+# endif
+
+# undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for an integer type under the usual assumption.
+ Return an unspecified value if BITS == 0, adding a check to pacify
+ picky compilers. */
+
+/* These are separate macros, because if you try to merge these macros into
+ a single one, HP-UX cc rejects the resulting expression in constant
+ expressions. */
+# define _STDINT_UNSIGNED_MIN(bits, zero) \
+ (zero)
+# define _STDINT_SIGNED_MIN(bits, zero) \
+ (~ _STDINT_MAX (1, bits, zero))
+
+# define _STDINT_MAX(signed, bits, zero) \
+ (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+#if !GNULIB_defined_stdint_types
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+# undef int8_t
+# undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+# define int8_t gl_int8_t
+# define uint8_t gl_uint8_t
+
+# undef int16_t
+# undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+# define int16_t gl_int16_t
+# define uint16_t gl_uint16_t
+
+# undef int32_t
+# undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+# define int32_t gl_int32_t
+# define uint32_t gl_uint32_t
+
+/* If the system defines INT64_MAX, assume int64_t works. That way,
+ if the underlying platform defines int64_t to be a 64-bit long long
+ int, the code below won't mistakenly define it to be a 64-bit long
+ int, which would mess up C++ name mangling. We must use #ifdef
+ rather than #if, to avoid an error with HP-UX 10.20 cc. */
+
+# ifdef INT64_MAX
+# define GL_INT64_T
+# else
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+ types, since otherwise it breaks platforms like Tandem/NSK. */
+# if LONG_MAX >> 31 >> 31 == 1
+# undef int64_t
+typedef long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# elif defined _MSC_VER
+# undef int64_t
+typedef __int64 gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# else
+# undef int64_t
+typedef long long int gl_int64_t;
+# define int64_t gl_int64_t
+# define GL_INT64_T
+# endif
+# endif
+
+# ifdef UINT64_MAX
+# define GL_UINT64_T
+# else
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# undef uint64_t
+typedef unsigned long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# elif defined _MSC_VER
+# undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# else
+# undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+# define uint64_t gl_uint64_t
+# define GL_UINT64_T
+# endif
+# endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
+# define _UINT8_T
+# define _UINT32_T
+# define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+# undef int_least8_t
+# undef uint_least8_t
+# undef int_least16_t
+# undef uint_least16_t
+# undef int_least32_t
+# undef uint_least32_t
+# undef int_least64_t
+# undef uint_least64_t
+# define int_least8_t int8_t
+# define uint_least8_t uint8_t
+# define int_least16_t int16_t
+# define uint_least16_t uint16_t
+# define int_least32_t int32_t
+# define uint_least32_t uint32_t
+# ifdef GL_INT64_T
+# define int_least64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+# define uint_least64_t uint64_t
+# endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+ It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. The following code normally
+ uses types consistent with glibc, as that lessens the chance of
+ incompatibility with older GNU hosts. */
+
+# undef int_fast8_t
+# undef uint_fast8_t
+# undef int_fast16_t
+# undef uint_fast16_t
+# undef int_fast32_t
+# undef uint_fast32_t
+# undef int_fast64_t
+# undef uint_fast64_t
+typedef signed char gl_int_fast8_t;
+typedef unsigned char gl_uint_fast8_t;
+
+# ifdef __sun
+/* Define types compatible with SunOS 5.10, so that code compiled under
+ earlier SunOS versions works with code compiled under SunOS 5.10. */
+typedef int gl_int_fast32_t;
+typedef unsigned int gl_uint_fast32_t;
+# else
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+# endif
+typedef gl_int_fast32_t gl_int_fast16_t;
+typedef gl_uint_fast32_t gl_uint_fast16_t;
+
+# define int_fast8_t gl_int_fast8_t
+# define uint_fast8_t gl_uint_fast8_t
+# define int_fast16_t gl_int_fast16_t
+# define uint_fast16_t gl_uint_fast16_t
+# define int_fast32_t gl_int_fast32_t
+# define uint_fast32_t gl_uint_fast32_t
+# ifdef GL_INT64_T
+# define int_fast64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+# define uint_fast64_t uint64_t
+# endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+/* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
+ definitions of intptr_t and uintptr_t (which use int and unsigned)
+ to avoid clashes with declarations of system functions like sbrk.
+ Similarly, MinGW WSL-5.4.1 <stdint.h> needs its own intptr_t and
+ uintptr_t to avoid conflicting declarations of system functions like
+ _findclose in <io.h>. */
+# if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
+ || defined __MINGW32__)
+# undef intptr_t
+# undef uintptr_t
+# ifdef _WIN64
+typedef long long int gl_intptr_t;
+typedef unsigned long long int gl_uintptr_t;
+# else
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+# endif
+# define intptr_t gl_intptr_t
+# define uintptr_t gl_uintptr_t
+# endif
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+ public header files. */
+
+/* If the system defines INTMAX_MAX, assume that intmax_t works, and
+ similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
+ assuming one type where another is used by the system. */
+
+# ifndef INTMAX_MAX
+# undef INTMAX_C
+# undef intmax_t
+# if LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# elif defined GL_INT64_T
+# define intmax_t int64_t
+# else
+typedef long int gl_intmax_t;
+# define intmax_t gl_intmax_t
+# endif
+# endif
+
+# ifndef UINTMAX_MAX
+# undef UINTMAX_C
+# undef uintmax_t
+# if ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# elif defined GL_UINT64_T
+# define uintmax_t uint64_t
+# else
+typedef unsigned long int gl_uintmax_t;
+# define uintmax_t gl_uintmax_t
+# endif
+# endif
+
+/* Verify that intmax_t and uintmax_t have the same size. Too much code
+ breaks if this is not the case. If this check fails, the reason is likely
+ to be found in the autoconf macros. */
+typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
+ ? 1 : -1];
+
+# define GNULIB_defined_stdint_types 1
+# endif /* !GNULIB_defined_stdint_types */
+
+/* 7.18.2. Limits of specified-width integer types */
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. */
+
+# undef INT8_MIN
+# undef INT8_MAX
+# undef UINT8_MAX
+# define INT8_MIN (~ INT8_MAX)
+# define INT8_MAX 127
+# define UINT8_MAX 255
+
+# undef INT16_MIN
+# undef INT16_MAX
+# undef UINT16_MAX
+# define INT16_MIN (~ INT16_MAX)
+# define INT16_MAX 32767
+# define UINT16_MAX 65535
+
+# undef INT32_MIN
+# undef INT32_MAX
+# undef UINT32_MAX
+# define INT32_MIN (~ INT32_MAX)
+# define INT32_MAX 2147483647
+# define UINT32_MAX 4294967295U
+
+# if defined GL_INT64_T && ! defined INT64_MAX
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+ evaluates the latter incorrectly in preprocessor expressions. */
+# define INT64_MIN (- INTMAX_C (1) << 63)
+# define INT64_MAX INTMAX_C (9223372036854775807)
+# endif
+
+# if defined GL_UINT64_T && ! defined UINT64_MAX
+# define UINT64_MAX UINTMAX_C (18446744073709551615)
+# endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+ are the same as the corresponding N_t types. */
+
+# undef INT_LEAST8_MIN
+# undef INT_LEAST8_MAX
+# undef UINT_LEAST8_MAX
+# define INT_LEAST8_MIN INT8_MIN
+# define INT_LEAST8_MAX INT8_MAX
+# define UINT_LEAST8_MAX UINT8_MAX
+
+# undef INT_LEAST16_MIN
+# undef INT_LEAST16_MAX
+# undef UINT_LEAST16_MAX
+# define INT_LEAST16_MIN INT16_MIN
+# define INT_LEAST16_MAX INT16_MAX
+# define UINT_LEAST16_MAX UINT16_MAX
+
+# undef INT_LEAST32_MIN
+# undef INT_LEAST32_MAX
+# undef UINT_LEAST32_MAX
+# define INT_LEAST32_MIN INT32_MIN
+# define INT_LEAST32_MAX INT32_MAX
+# define UINT_LEAST32_MAX UINT32_MAX
+
+# undef INT_LEAST64_MIN
+# undef INT_LEAST64_MAX
+# ifdef GL_INT64_T
+# define INT_LEAST64_MIN INT64_MIN
+# define INT_LEAST64_MAX INT64_MAX
+# endif
+
+# undef UINT_LEAST64_MAX
+# ifdef GL_UINT64_T
+# define UINT_LEAST64_MAX UINT64_MAX
+# endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+ are taken from the same list of types. */
+
+# undef INT_FAST8_MIN
+# undef INT_FAST8_MAX
+# undef UINT_FAST8_MAX
+# define INT_FAST8_MIN SCHAR_MIN
+# define INT_FAST8_MAX SCHAR_MAX
+# define UINT_FAST8_MAX UCHAR_MAX
+
+# undef INT_FAST16_MIN
+# undef INT_FAST16_MAX
+# undef UINT_FAST16_MAX
+# define INT_FAST16_MIN INT_FAST32_MIN
+# define INT_FAST16_MAX INT_FAST32_MAX
+# define UINT_FAST16_MAX UINT_FAST32_MAX
+
+# undef INT_FAST32_MIN
+# undef INT_FAST32_MAX
+# undef UINT_FAST32_MAX
+# ifdef __sun
+# define INT_FAST32_MIN INT_MIN
+# define INT_FAST32_MAX INT_MAX
+# define UINT_FAST32_MAX UINT_MAX
+# else
+# define INT_FAST32_MIN LONG_MIN
+# define INT_FAST32_MAX LONG_MAX
+# define UINT_FAST32_MAX ULONG_MAX
+# endif
+
+# undef INT_FAST64_MIN
+# undef INT_FAST64_MAX
+# ifdef GL_INT64_T
+# define INT_FAST64_MIN INT64_MIN
+# define INT_FAST64_MAX INT64_MAX
+# endif
+
+# undef UINT_FAST64_MAX
+# ifdef GL_UINT64_T
+# define UINT_FAST64_MAX UINT64_MAX
+# endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+# undef INTPTR_MIN
+# undef INTPTR_MAX
+# undef UINTPTR_MAX
+# ifdef _WIN64
+# define INTPTR_MIN LLONG_MIN
+# define INTPTR_MAX LLONG_MAX
+# define UINTPTR_MAX ULLONG_MAX
+# else
+# define INTPTR_MIN LONG_MIN
+# define INTPTR_MAX LONG_MAX
+# define UINTPTR_MAX ULONG_MAX
+# endif
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+# ifndef INTMAX_MAX
+# undef INTMAX_MIN
+# ifdef INT64_MAX
+# define INTMAX_MIN INT64_MIN
+# define INTMAX_MAX INT64_MAX
+# else
+# define INTMAX_MIN INT32_MIN
+# define INTMAX_MAX INT32_MAX
+# endif
+# endif
+
+# ifndef UINTMAX_MAX
+# ifdef UINT64_MAX
+# define UINTMAX_MAX UINT64_MAX
+# else
+# define UINTMAX_MAX UINT32_MAX
+# endif
+# endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+# undef PTRDIFF_MIN
+# undef PTRDIFF_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define PTRDIFF_MIN _STDINT_SIGNED_MIN (64, 0l)
+# define PTRDIFF_MAX _STDINT_MAX (1, 64, 0l)
+# else
+# define PTRDIFF_MIN _STDINT_SIGNED_MIN (32, 0)
+# define PTRDIFF_MAX _STDINT_MAX (1, 32, 0)
+# endif
+# else
+# define PTRDIFF_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# define PTRDIFF_MAX \
+ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# endif
+
+/* sig_atomic_t limits */
+# undef SIG_ATOMIC_MIN
+# undef SIG_ATOMIC_MAX
+# if @HAVE_SIGNED_SIG_ATOMIC_T@
+# define SIG_ATOMIC_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# else
+# define SIG_ATOMIC_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# endif
+# define SIG_ATOMIC_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+ 0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+# undef SIZE_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+# ifdef _LP64
+# define SIZE_MAX _STDINT_MAX (0, 64, 0ul)
+# else
+# define SIZE_MAX _STDINT_MAX (0, 32, 0ul)
+# endif
+# else
+# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+# endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+ This include is not on the top, above, because on OSF/1 4.0 we have a
+ sequence of nested includes
+ <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+ <stdint.h> and assumes its types are already defined. */
+# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
+# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# include <wchar.h>
+# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# endif
+# undef WCHAR_MIN
+# undef WCHAR_MAX
+# if @HAVE_SIGNED_WCHAR_T@
+# define WCHAR_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# else
+# define WCHAR_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# endif
+# define WCHAR_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+/* If gnulib's <wchar.h> or <wctype.h> overrides wint_t, @WINT_T_SUFFIX@ is not
+ accurate, therefore use the definitions from above. */
+# if !@GNULIB_OVERRIDES_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# if @HAVE_SIGNED_WINT_T@
+# define WINT_MIN \
+ _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# else
+# define WINT_MIN \
+ _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+# define WINT_MAX \
+ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+
+/* 7.18.4. Macros for integer constants */
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+ types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */
+
+# undef INT8_C
+# undef UINT8_C
+# define INT8_C(x) x
+# define UINT8_C(x) x
+
+# undef INT16_C
+# undef UINT16_C
+# define INT16_C(x) x
+# define UINT16_C(x) x
+
+# undef INT32_C
+# undef UINT32_C
+# define INT32_C(x) x
+# define UINT32_C(x) x ## U
+
+# undef INT64_C
+# undef UINT64_C
+# if LONG_MAX >> 31 >> 31 == 1
+# define INT64_C(x) x##L
+# elif defined _MSC_VER
+# define INT64_C(x) x##i64
+# else
+# define INT64_C(x) x##LL
+# endif
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+# define UINT64_C(x) x##UL
+# elif defined _MSC_VER
+# define UINT64_C(x) x##ui64
+# else
+# define UINT64_C(x) x##ULL
+# endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+# ifndef INTMAX_C
+# if LONG_MAX >> 30 == 1
+# define INTMAX_C(x) x##LL
+# elif defined GL_INT64_T
+# define INTMAX_C(x) INT64_C(x)
+# else
+# define INTMAX_C(x) x##L
+# endif
+# endif
+
+# ifndef UINTMAX_C
+# if ULONG_MAX >> 31 == 1
+# define UINTMAX_C(x) x##ULL
+# elif defined GL_UINT64_T
+# define UINTMAX_C(x) UINT64_C(x)
+# else
+# define UINTMAX_C(x) x##UL
+# endif
+# endif
+
+#endif /* !@HAVE_C99_STDINT_H@ */
+
+/* Macros specified by ISO/IEC TS 18661-1:2014. */
+
+#if (!defined UINTMAX_WIDTH \
+ && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# ifdef INT8_MAX
+# define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
+# endif
+# ifdef UINT8_MAX
+# define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
+# endif
+# ifdef INT16_MAX
+# define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
+# endif
+# ifdef UINT16_MAX
+# define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
+# endif
+# ifdef INT32_MAX
+# define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
+# endif
+# ifdef UINT32_MAX
+# define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
+# endif
+# ifdef INT64_MAX
+# define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
+# endif
+# ifdef UINT64_MAX
+# define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
+# endif
+# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
+# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
+# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
+# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
+# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
+# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
+# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
+# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
+# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
+# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
+# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
+# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
+# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
+# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
+# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
+# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
+# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
+# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
+# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
+# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
+# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
+# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
+# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
+# ifdef WINT_MAX
+# define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
+# endif
+# ifdef SIG_ATOMIC_MAX
+# define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
+# endif
+#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_STDINT_H */
+#endif /* !(defined __ANDROID__ && ...) */
+#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/lib/stdio-impl.h b/lib/stdio-impl.h
new file mode 100644
index 0000000..15066aa
--- /dev/null
+++ b/lib/stdio-impl.h
@@ -0,0 +1,212 @@
+/* Implementation details of FILE streams.
+ Copyright (C) 2007-2008, 2010-2020 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/>. */
+
+/* Many stdio implementations have the same logic and therefore can share
+ the same implementation of stdio extension API, except that some fields
+ have different naming conventions, or their access requires some casts. */
+
+/* Glibc 2.28 made _IO_UNBUFFERED and _IO_IN_BACKUP private. For now, work
+ around this problem by defining them ourselves. FIXME: Do not rely on glibc
+ internals. */
+#if defined _IO_EOF_SEEN
+# if !defined _IO_UNBUFFERED
+# define _IO_UNBUFFERED 0x2
+# endif
+# if !defined _IO_IN_BACKUP
+# define _IO_IN_BACKUP 0x100
+# endif
+#endif
+
+/* BSD stdio derived implementations. */
+
+#if defined __NetBSD__ /* NetBSD */
+/* Get __NetBSD_Version__. */
+# include <sys/param.h>
+#endif
+
+#include <errno.h> /* For detecting Plan9. */
+
+#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
+ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
+
+# if defined __DragonFly__ /* DragonFly */
+ /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h>. */
+# define fp_ ((struct { struct __FILE_public pub; \
+ struct { unsigned char *_base; int _size; } _bf; \
+ void *cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; int _size; } _ub; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; int _size; } _lb; \
+ int _blksize; \
+ fpos_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+ /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h>. */
+# define _p pub._p
+# define _flags pub._flags
+# define _r pub._r
+# define _w pub._w
+# elif defined __ANDROID__ /* Android */
+# ifdef __LP64__
+# define _gl_flags_file_t int
+# else
+# define _gl_flags_file_t short
+# endif
+ /* Up to this commit from 2015-10-12
+ <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
+ the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
+ see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
+ and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
+ After this commit, the innards of FILE are hidden. */
+# define fp_ ((struct { unsigned char *_p; \
+ int _r; \
+ int _w; \
+ _gl_flags_file_t _flags; \
+ _gl_flags_file_t _file; \
+ struct { unsigned char *_base; size_t _size; } _bf; \
+ int _lbfsize; \
+ void *_cookie; \
+ void *_close; \
+ void *_read; \
+ void *_seek; \
+ void *_write; \
+ struct { unsigned char *_base; size_t _size; } _ext; \
+ unsigned char *_up; \
+ int _ur; \
+ unsigned char _ubuf[3]; \
+ unsigned char _nbuf[1]; \
+ struct { unsigned char *_base; size_t _size; } _lb; \
+ int _blksize; \
+ fpos_t _offset; \
+ /* More fields, not relevant here. */ \
+ } *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
+ /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
+ and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
+ struct __sfileext
+ {
+ struct __sbuf _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
+# elif defined __ANDROID__ /* Android */
+ struct __sfileext
+ {
+ struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
+ /* More fields, not relevant here. */
+ };
+# define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub
+# else /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */
+# define fp_ub fp_->_ub
+# endif
+
+# define HASUB(fp) (fp_ub._base != NULL)
+
+# if defined __ANDROID__ /* Android */
+ /* Needed after this commit from 2016-01-25
+ <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
+# ifndef __SEOF
+# define __SLBF 1
+# define __SNBF 2
+# define __SRD 4
+# define __SWR 8
+# define __SRW 0x10
+# define __SEOF 0x20
+# define __SERR 0x40
+# endif
+# ifndef __SOFF
+# define __SOFF 0x1000
+# endif
+# endif
+
+#endif
+
+
+/* SystemV derived implementations. */
+
+#ifdef __TANDEM /* NonStop Kernel */
+# ifndef _IOERR
+/* These values were determined by the program 'stdioext-flags' at
+ <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
+# define _IOERR 0x40
+# define _IOREAD 0x80
+# define _IOWRT 0x4
+# define _IORW 0x100
+# endif
+#endif
+
+#if defined _IOERR
+
+# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
+# define fp_ ((struct { unsigned char *_ptr; \
+ unsigned char *_base; \
+ unsigned char *_end; \
+ long _cnt; \
+ int _file; \
+ unsigned int _flag; \
+ } *) fp)
+# elif defined __VMS /* OpenVMS */
+# define fp_ ((struct _iobuf *) fp)
+# else
+# define fp_ fp
+# endif
+
+# if defined _SCO_DS || (defined __SCO_VERSION__ || defined __sysv5__) /* OpenServer 5, OpenServer 6, UnixWare 7 */
+# define _cnt __cnt
+# define _ptr __ptr
+# define _base __base
+# define _flag __flag
+# endif
+
+#elif defined _WIN32 && ! defined __CYGWIN__ /* newer Windows with MSVC */
+
+/* <stdio.h> does not define the innards of FILE any more. */
+# define WINDOWS_OPAQUE_FILE
+
+struct _gl_real_FILE
+{
+ /* Note: Compared to older Windows and to mingw, it has the fields
+ _base and _cnt swapped. */
+ unsigned char *_ptr;
+ unsigned char *_base;
+ int _cnt;
+ int _flag;
+ int _file;
+ int _charbuf;
+ int _bufsiz;
+};
+# define fp_ ((struct _gl_real_FILE *) fp)
+
+/* These values were determined by a program similar to the one at
+ <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>. */
+# define _IOREAD 0x1
+# define _IOWRT 0x2
+# define _IORW 0x4
+# define _IOEOF 0x8
+# define _IOERR 0x10
+
+#endif
diff --git a/lib/stdio-write.c b/lib/stdio-write.c
new file mode 100644
index 0000000..778e7cf
--- /dev/null
+++ b/lib/stdio-write.c
@@ -0,0 +1,206 @@
+/* POSIX compatible FILE stream write function.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <stdio.h>
+
+/* Replace these functions only if module 'nonblocking' or module 'sigpipe' is
+ requested. */
+#if GNULIB_NONBLOCKING || GNULIB_SIGPIPE
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. This write() function is at the basis of the function
+ which flushes the buffer of a FILE stream. */
+
+# if defined _WIN32 && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetNamedPipeHandleState
+# define GetNamedPipeHandleState GetNamedPipeHandleStateA
+
+# if GNULIB_NONBLOCKING
+# define CLEAR_ERRNO \
+ errno = 0;
+# define HANDLE_ENOSPC \
+ if (errno == ENOSPC && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0) \
+ { \
+ HANDLE h = (HANDLE) _get_osfhandle (fd); \
+ if (GetFileType (h) == FILE_TYPE_PIPE) \
+ { \
+ /* h is a pipe or socket. */ \
+ DWORD state; \
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, \
+ NULL, NULL, 0) \
+ && (state & PIPE_NOWAIT) != 0) \
+ /* h is a pipe in non-blocking mode. \
+ Change errno from ENOSPC to EAGAIN. */ \
+ errno = EAGAIN; \
+ } \
+ } \
+ } \
+ else
+# else
+# define CLEAR_ERRNO
+# define HANDLE_ENOSPC
+# endif
+
+# if GNULIB_SIGPIPE
+# define CLEAR_LastError \
+ SetLastError (0);
+# define HANDLE_ERROR_NO_DATA \
+ if (GetLastError () == ERROR_NO_DATA && ferror (stream)) \
+ { \
+ int fd = fileno (stream); \
+ if (fd >= 0 \
+ && GetFileType ((HANDLE) _get_osfhandle (fd)) \
+ == FILE_TYPE_PIPE) \
+ { \
+ /* Try to raise signal SIGPIPE. */ \
+ raise (SIGPIPE); \
+ /* If it is currently blocked or ignored, change errno from \
+ EINVAL to EPIPE. */ \
+ errno = EPIPE; \
+ } \
+ } \
+ else
+# else
+# define CLEAR_LastError
+# define HANDLE_ERROR_NO_DATA
+# endif
+
+# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \
+ if (ferror (stream)) \
+ return (EXPRESSION); \
+ else \
+ { \
+ RETTYPE ret; \
+ CLEAR_ERRNO \
+ CLEAR_LastError \
+ ret = (EXPRESSION); \
+ if (FAILED) \
+ { \
+ HANDLE_ENOSPC \
+ HANDLE_ERROR_NO_DATA \
+ ; \
+ } \
+ return ret; \
+ }
+
+# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
+int
+printf (const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stdout, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
+int
+fprintf (FILE *stream, const char *format, ...)
+{
+ int retval;
+ va_list args;
+
+ va_start (args, format);
+ retval = vfprintf (stream, format, args);
+ va_end (args);
+
+ return retval;
+}
+# endif
+
+# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
+int
+vprintf (const char *format, va_list args)
+{
+ return vfprintf (stdout, format, args);
+}
+# endif
+
+# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
+int
+vfprintf (FILE *stream, const char *format, va_list args)
+#undef vfprintf
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, vfprintf (stream, format, args), ret == EOF)
+}
+# endif
+
+int
+putchar (int c)
+{
+ return fputc (c, stdout);
+}
+
+int
+fputc (int c, FILE *stream)
+#undef fputc
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputc (c, stream), ret == EOF)
+}
+
+int
+fputs (const char *string, FILE *stream)
+#undef fputs
+{
+ CALL_WITH_SIGPIPE_EMULATION (int, fputs (string, stream), ret == EOF)
+}
+
+int
+puts (const char *string)
+#undef puts
+{
+ FILE *stream = stdout;
+ CALL_WITH_SIGPIPE_EMULATION (int, puts (string), ret == EOF)
+}
+
+size_t
+fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
+#undef fwrite
+{
+ CALL_WITH_SIGPIPE_EMULATION (size_t, fwrite (ptr, s, n, stream), ret < n)
+}
+
+# endif
+#endif
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
new file mode 100644
index 0000000..d6aff7f
--- /dev/null
+++ b/lib/stdio.in.h
@@ -0,0 +1,1641 @@
+/* A GNU-like <stdio.h>.
+
+ Copyright (C) 2004, 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
+/* Special invocation convention:
+ - Inside glibc header files.
+ - On OSF/1 5.1 we have a sequence of nested includes
+ <stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
+ <sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+
+#define _GL_ALREADY_INCLUDING_STDIO_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#undef _GL_ALREADY_INCLUDING_STDIO_H
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+#define _@GUARD_PREFIX@_STDIO_H
+
+/* Get va_list. Needed on many systems, including glibc 2.8. */
+#include <stdarg.h>
+
+#include <stddef.h>
+
+/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8
+ and eglibc 2.11.2.
+ May also define off_t to a 64-bit type on native Windows. */
+#include <sys/types.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The __-protected variants of the attributes 'format' and 'printf' are
+ accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+ We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+ gnulib and libintl do '#define printf __printf__' when they override
+ the 'printf' function. */
+#ifndef _GL_ATTRIBUTE_FORMAT
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) || defined __clang__
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+# else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+# endif
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+ string and arguments, where the format string directives are the ones
+ standardized by ISO C99 and POSIX.
+ _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD */
+/* __gnu_printf__ is supported in GCC >= 4.4. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __gnu_printf__
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD __printf__
+#endif
+
+/* An __attribute__ __format__ specifier for a function that takes a format
+ string and arguments, where the format string directives are the ones of the
+ system printf(), rather than the ones standardized by ISO C99 and POSIX.
+ _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM */
+/* On mingw, Gnulib sets __USE_MINGW_ANSI_STDIO in order to get closer to
+ the standards. The macro GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU indicates
+ whether this change is effective. On older mingw, it is not. */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD
+#else
+# define _GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM __printf__
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system printf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_SYSTEM, formatstring_parameter, first_argument))
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+ indicates to GCC that the function takes a format string and arguments,
+ where the format string directives are the ones standardized by ISO C99
+ and POSIX. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+ except that it indicates to GCC that the supported format string directives
+ are the ones of the system scanf(), rather than the ones standardized by
+ ISO C99 and POSIX. */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+ _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
+/* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* Android 4.3 declares renameat in <sys/stat.h>, not in <stdio.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+ && ! defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC declares 'perror' in <stdlib.h>, not in <stdio.h>. We must include
+ it before we #define perror rpl_perror. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__) \
+ && ! defined __GLIBC__
+# include <stdlib.h>
+#endif
+
+/* MSVC declares 'remove' in <io.h>, not in <stdio.h>. We must include
+ it before we #define remove rpl_remove. */
+/* MSVC declares 'rename' in <io.h>, not in <stdio.h>. We must include
+ it before we #define rename rpl_rename. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__) \
+ && ! defined __GLIBC__
+# include <io.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Macros for stringification. */
+#define _GL_STDIO_STRINGIZE(token) #token
+#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token)
+
+/* When also using extern inline, suppress the use of static inline in
+ standard headers of problematic Apple configurations, as Libc at
+ least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
+ <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
+ Perhaps Apple will fix this some day. */
+#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
+ && defined __GNUC__ && defined __STDC__)
+# undef putc_unlocked
+#endif
+
+#if @GNULIB_DPRINTF@
+# if @REPLACE_DPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dprintf rpl_dprintf
+# endif
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *restrict format, ...));
+# else
+# if !@HAVE_DPRINTF@
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *restrict format, ...));
+# endif
+_GL_CXXALIASWARN (dprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef dprintf
+# if HAVE_RAW_DECL_DPRINTF
+_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
+ "use gnulib module dprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_FCLOSE@
+/* Close STREAM and its underlying file descriptor. */
+# if @REPLACE_FCLOSE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fclose rpl_fclose
+# endif
+_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fclose, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fclose, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fclose);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fclose
+/* Assume fclose is always declared. */
+_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
+ "use gnulib module fclose for portable POSIX compliance");
+#endif
+
+#if @GNULIB_MDA_FCLOSEALL@
+/* On native Windows, map 'fcloseall' to '_fcloseall', so that -loldnames is
+ not required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fcloseall on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcloseall
+# define fcloseall _fcloseall
+# endif
+_GL_CXXALIAS_MDA (fcloseall, int, (void));
+# else
+# if @HAVE_DECL_FCLOSEALL@
+# if defined __FreeBSD__
+_GL_CXXALIAS_SYS (fcloseall, void, (void));
+# else
+_GL_CXXALIAS_SYS (fcloseall, int, (void));
+# endif
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCLOSEALL@
+_GL_CXXALIASWARN (fcloseall);
+# endif
+#endif
+
+#if @GNULIB_FDOPEN@
+# if @REPLACE_FDOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen rpl_fdopen
+# endif
+_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen _fdopen
+# endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopen
+/* Assume fdopen is always declared. */
+_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module fdopen for portability");
+#elif @GNULIB_MDA_FDOPEN@
+/* On native Windows, map 'fdopen' to '_fdopen', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fdopen always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fdopen
+# define fdopen _fdopen
+# endif
+_GL_CXXALIAS_MDA (fdopen, FILE *, (int fd, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+#endif
+
+#if @GNULIB_FFLUSH@
+/* Flush all pending data on STREAM according to POSIX rules. Both
+ output and seekable input streams are supported.
+ Note! LOSS OF DATA can occur if fflush is applied on an input stream
+ that is _not_seekable_ or on an update stream that is _not_seekable_
+ and in which the most recent operation was input. Seekability can
+ be tested with lseek(fileno(fp),0,SEEK_CUR). */
+# if @REPLACE_FFLUSH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fflush rpl_fflush
+# endif
+_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream));
+_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream));
+# else
+_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fflush);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+/* Assume fflush is always declared. */
+_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
+ "use gnulib module fflush for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FGETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgetc
+# define fgetc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgetc);
+# endif
+#endif
+
+#if @GNULIB_FGETS@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fgets
+# define fgets rpl_fgets
+# endif
+_GL_FUNCDECL_RPL (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fgets, char *,
+ (char *restrict s, int n, FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgets);
+# endif
+#endif
+
+#if @GNULIB_MDA_FILENO@
+/* On native Windows, map 'fileno' to '_fileno', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fileno always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fileno
+# define fileno _fileno
+# endif
+_GL_CXXALIAS_MDA (fileno, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fileno, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (fileno);
+#endif
+
+#if @GNULIB_FOPEN@
+# if @REPLACE_FOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fopen
+# define fopen rpl_fopen
+# endif
+_GL_FUNCDECL_RPL (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode));
+# else
+_GL_CXXALIAS_SYS (fopen, FILE *,
+ (const char *restrict filename, const char *restrict mode));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fopen
+/* Assume fopen is always declared. */
+_GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module fopen for portability");
+#endif
+
+#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
+# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
+ || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fprintf rpl_fprintf
+# endif
+# define GNULIB_overrides_fprintf 1
+# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (fprintf, int,
+ (FILE *restrict fp, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fprintf);
+# endif
+#endif
+#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_fprintf
+# undef fprintf
+# endif
+/* Assume fprintf is always declared. */
+_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
+ "use gnulib module fprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_FPURGE@
+/* Discard all pending buffered I/O data on STREAM.
+ STREAM must not be wide-character oriented.
+ When discarding pending output, the file position is set back to where it
+ was before the write calls. When discarding pending input, the file
+ position is advanced to match the end of the previously read input.
+ Return 0 if successful. Upon error, return -1 and set errno. */
+# if @REPLACE_FPURGE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define fpurge rpl_fpurge
+# endif
+_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream));
+# else
+# if !@HAVE_DECL_FPURGE@
+_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream));
+# endif
+_GL_CXXALIASWARN (fpurge);
+#elif defined GNULIB_POSIXCHECK
+# undef fpurge
+# if HAVE_RAW_DECL_FPURGE
+_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
+ "use gnulib module fpurge for portability");
+# endif
+#endif
+
+#if @GNULIB_FPUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputc
+# define fputc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputc);
+# endif
+#endif
+
+#if @GNULIB_FPUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fputs
+# define fputs rpl_fputs
+# endif
+_GL_FUNCDECL_RPL (fputs, int,
+ (const char *restrict string, FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int,
+ (const char *restrict string, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fputs, int,
+ (const char *restrict string, FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputs);
+# endif
+#endif
+
+#if @GNULIB_FREAD@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fread
+# define fread rpl_fread
+# endif
+_GL_FUNCDECL_RPL (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fread, size_t,
+ (void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fread);
+# endif
+#endif
+
+#if @GNULIB_FREOPEN@
+# if @REPLACE_FREOPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef freopen
+# define freopen rpl_freopen
+# endif
+_GL_FUNCDECL_RPL (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (freopen, FILE *,
+ (const char *restrict filename, const char *restrict mode,
+ FILE *restrict stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (freopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freopen
+/* Assume freopen is always declared. */
+_GL_WARN_ON_USE (freopen,
+ "freopen on native Windows platforms is not POSIX compliant - "
+ "use gnulib module freopen for portability");
+#endif
+
+#if @GNULIB_FSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fscanf
+# define fscanf rpl_fscanf
+# endif
+_GL_FUNCDECL_RPL (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (fscanf, int,
+ (FILE *restrict stream, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fscanf);
+# endif
+#endif
+
+
+/* Set up the following warnings, based on which modules are in use.
+ GNU Coding Standards discourage the use of fseek, since it imposes
+ an arbitrary limitation on some 32-bit hosts. Remember that the
+ fseek module depends on the fseeko module, so we only have three
+ cases to consider:
+
+ 1. The developer is not using either module. Issue a warning under
+ GNULIB_POSIXCHECK for both functions, to remind them that both
+ functions have bugs on some systems. _GL_NO_LARGE_FILES has no
+ impact on this warning.
+
+ 2. The developer is using both modules. They may be unaware of the
+ arbitrary limitations of fseek, so issue a warning under
+ GNULIB_POSIXCHECK. On the other hand, they may be using both
+ modules intentionally, so the developer can define
+ _GL_NO_LARGE_FILES in the compilation units where the use of fseek
+ is safe, to silence the warning.
+
+ 3. The developer is using the fseeko module, but not fseek. Gnulib
+ guarantees that fseek will still work around platform bugs in that
+ case, but we presume that the developer is aware of the pitfalls of
+ fseek and was trying to avoid it, so issue a warning even when
+ GNULIB_POSIXCHECK is undefined. Again, _GL_NO_LARGE_FILES can be
+ defined to silence the warning in particular compilation units.
+ In C++ compilations with GNULIB_NAMESPACE, in order to avoid that
+ fseek gets defined as a macro, it is recommended that the developer
+ uses the fseek module, even if he is not calling the fseek function.
+
+ Most gnulib clients that perform stream operations should fall into
+ category 3. */
+
+#if @GNULIB_FSEEK@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 2, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseek
+# define fseek rpl_fseek
+# endif
+_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fseek);
+# endif
+#endif
+
+#if @GNULIB_FSEEKO@
+# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FSEEK_WARN /* Category 3, above. */
+# undef fseek
+# endif
+# if @REPLACE_FSEEKO@
+/* Provide an fseeko function that is aware of a preceding fflush(), and which
+ detects pipes. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fseeko
+# define fseeko rpl_fseeko
+# endif
+_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
+# else
+# if ! @HAVE_DECL_FSEEKO@
+_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (fseeko);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FSEEK_WARN /* Category 1, above. */
+# undef fseek
+# undef fseeko
+# if HAVE_RAW_DECL_FSEEKO
+_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
+ "use gnulib module fseeko for portability");
+# endif
+#endif
+
+#ifdef _GL_FSEEK_WARN
+# undef _GL_FSEEK_WARN
+/* Here, either fseek is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_fseek (declared above). */
+_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use fseeko function for handling of large files");
+#endif
+
+
+/* ftell, ftello. See the comments on fseek/fseeko. */
+
+#if @GNULIB_FTELL@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 2, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftell
+# define ftell rpl_ftell
+# endif
+_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftell, long, (FILE *fp));
+# else
+_GL_CXXALIAS_SYS (ftell, long, (FILE *fp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ftell);
+# endif
+#endif
+
+#if @GNULIB_FTELLO@
+# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
+# define _GL_FTELL_WARN /* Category 3, above. */
+# undef ftell
+# endif
+# if @REPLACE_FTELLO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftello
+# define ftello rpl_ftello
+# endif
+_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
+# else
+# if ! @HAVE_DECL_FTELLO@
+_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
+# endif
+_GL_CXXALIASWARN (ftello);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FTELL_WARN /* Category 1, above. */
+# undef ftell
+# undef ftello
+# if HAVE_RAW_DECL_FTELLO
+_GL_WARN_ON_USE (ftello, "ftello is unportable - "
+ "use gnulib module ftello for portability");
+# endif
+#endif
+
+#ifdef _GL_FTELL_WARN
+# undef _GL_FTELL_WARN
+/* Here, either ftell is undefined (but C89 guarantees that it is
+ declared), or it is defined as rpl_ftell (declared above). */
+_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
+ "on 32-bit platforms - "
+ "use ftello function for handling of large files");
+#endif
+
+
+#if @GNULIB_FWRITE@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fwrite
+# define fwrite rpl_fwrite
+# endif
+_GL_FUNCDECL_RPL (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (fwrite, size_t,
+ (const void *restrict ptr, size_t s, size_t n,
+ FILE *restrict stream));
+
+/* Work around bug 11959 when fortifying glibc 2.4 through 2.15
+ <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
+ which sometimes causes an unwanted diagnostic for fwrite calls.
+ This affects only function declaration attributes under certain
+ versions of gcc and clang, and is not needed for C++. */
+# if (0 < __USE_FORTIFY_LEVEL \
+ && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \
+ && 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \
+ && !defined __cplusplus)
+# undef fwrite
+# undef fwrite_unlocked
+extern size_t __REDIRECT (rpl_fwrite,
+ (const void *__restrict, size_t, size_t,
+ FILE *__restrict),
+ fwrite);
+extern size_t __REDIRECT (rpl_fwrite_unlocked,
+ (const void *__restrict, size_t, size_t,
+ FILE *__restrict),
+ fwrite_unlocked);
+# define fwrite rpl_fwrite
+# define fwrite_unlocked rpl_fwrite_unlocked
+# endif
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fwrite);
+# endif
+#endif
+
+#if @GNULIB_GETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getc
+# define getc rpl_fgetc
+# endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getc);
+# endif
+#endif
+
+#if @GNULIB_GETCHAR@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getchar
+# define getchar rpl_getchar
+# endif
+_GL_FUNCDECL_RPL (getchar, int, (void));
+_GL_CXXALIAS_RPL (getchar, int, (void));
+# else
+_GL_CXXALIAS_SYS (getchar, int, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getchar);
+# endif
+#endif
+
+#if @GNULIB_GETDELIM@
+/* Read input, up to (and including) the next occurrence of DELIMITER, from
+ STREAM, store it in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETDELIM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdelim
+# define getdelim rpl_getdelim
+# endif
+_GL_FUNCDECL_RPL (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+_GL_CXXALIAS_RPL (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream));
+# else
+# if !@HAVE_DECL_GETDELIM@
+_GL_FUNCDECL_SYS (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 4)));
+# endif
+_GL_CXXALIAS_SYS (getdelim, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ int delimiter,
+ FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getdelim);
+#elif defined GNULIB_POSIXCHECK
+# undef getdelim
+# if HAVE_RAW_DECL_GETDELIM
+_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
+ "use gnulib module getdelim for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLINE@
+/* Read a line, up to (and including) the next newline, from STREAM, store it
+ in *LINEPTR (and NUL-terminate it).
+ *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+ bytes of space. It is realloc'd as necessary.
+ Return the number of bytes read and stored at *LINEPTR (not including the
+ NUL terminator), or -1 on error or EOF. */
+# if @REPLACE_GETLINE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getline
+# define getline rpl_getline
+# endif
+_GL_FUNCDECL_RPL (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream));
+# else
+# if !@HAVE_DECL_GETLINE@
+_GL_FUNCDECL_SYS (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getline, ssize_t,
+ (char **restrict lineptr, size_t *restrict linesize,
+ FILE *restrict stream));
+# endif
+# if @HAVE_DECL_GETLINE@
+_GL_CXXALIASWARN (getline);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getline
+# if HAVE_RAW_DECL_GETLINE
+_GL_WARN_ON_USE (getline, "getline is unportable - "
+ "use gnulib module getline for portability");
+# endif
+#endif
+
+/* It is very rare that the developer ever has full control of stdin,
+ so any use of gets warrants an unconditional warning; besides, C11
+ removed it. */
+#undef gets
+#if HAVE_RAW_DECL_GETS && !defined __cplusplus
+_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif
+
+#if @GNULIB_MDA_GETW@
+/* On native Windows, map 'getw' to '_getw', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getw always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getw
+# define getw _getw
+# endif
+_GL_CXXALIAS_MDA (getw, int, (FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (getw, int, (FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (getw);
+#endif
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
+struct obstack;
+/* Grow an obstack with formatted output. Return the number of
+ bytes added to OBS. No trailing nul byte is added, and the
+ object should be closed with obstack_finish before use. Upon
+ memory allocation error, call obstack_alloc_failed_handler. Upon
+ other error, return -1. */
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_printf rpl_obstack_printf
+# endif
+_GL_FUNCDECL_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_printf, int,
+ (struct obstack *obs, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (obstack_printf);
+# if @REPLACE_OBSTACK_PRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define obstack_vprintf rpl_obstack_vprintf
+# endif
+_GL_FUNCDECL_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# else
+# if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (obstack_vprintf, int,
+ (struct obstack *obs, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (obstack_vprintf);
+#endif
+
+#if @GNULIB_PCLOSE@
+# if !@HAVE_PCLOSE@
+_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
+_GL_CXXALIASWARN (pclose);
+#elif defined GNULIB_POSIXCHECK
+# undef pclose
+# if HAVE_RAW_DECL_PCLOSE
+_GL_WARN_ON_USE (pclose, "pclose is unportable - "
+ "use gnulib module pclose for more portability");
+# endif
+#endif
+
+#if @GNULIB_PERROR@
+/* Print a message to standard error, describing the value of ERRNO,
+ (if STRING is not NULL and not empty) prefixed with STRING and ": ",
+ and terminated with a newline. */
+# if @REPLACE_PERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define perror rpl_perror
+# endif
+_GL_FUNCDECL_RPL (perror, void, (const char *string));
+_GL_CXXALIAS_RPL (perror, void, (const char *string));
+# else
+_GL_CXXALIAS_SYS (perror, void, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (perror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef perror
+/* Assume perror is always declared. */
+_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
+ "use gnulib module perror for portability");
+#endif
+
+#if @GNULIB_POPEN@
+# if @REPLACE_POPEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef popen
+# define popen rpl_popen
+# endif
+_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
+# else
+# if !@HAVE_POPEN@
+_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
+# endif
+_GL_CXXALIASWARN (popen);
+#elif defined GNULIB_POSIXCHECK
+# undef popen
+# if HAVE_RAW_DECL_POPEN
+_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
+ "use gnulib module popen or pipe for more portability");
+# endif
+#endif
+
+#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
+# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
+ || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if defined __GNUC__ || defined __clang__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+/* Don't break __attribute__((format(printf,M,N))). */
+# define printf __printf__
+# endif
+# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define printf rpl_printf
+# endif
+_GL_FUNCDECL_RPL (printf, int,
+ (const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (printf, int, (const char *restrict format, ...));
+# endif
+# define GNULIB_overrides_printf 1
+# else
+_GL_CXXALIAS_SYS (printf, int, (const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (printf);
+# endif
+#endif
+#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_printf
+# undef printf
+# endif
+/* Assume printf is always declared. */
+_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
+ "use gnulib module printf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_PUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putc
+# define putc rpl_fputc
+# endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putc);
+# endif
+#endif
+
+#if @GNULIB_PUTCHAR@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putchar
+# define putchar rpl_putchar
+# endif
+_GL_FUNCDECL_RPL (putchar, int, (int c));
+_GL_CXXALIAS_RPL (putchar, int, (int c));
+# else
+_GL_CXXALIAS_SYS (putchar, int, (int c));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putchar);
+# endif
+#endif
+
+#if @GNULIB_PUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef puts
+# define puts rpl_puts
+# endif
+_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (puts, int, (const char *string));
+# else
+_GL_CXXALIAS_SYS (puts, int, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (puts);
+# endif
+#endif
+
+#if @GNULIB_MDA_PUTW@
+/* On native Windows, map 'putw' to '_putw', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::putw always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putw
+# define putw _putw
+# endif
+_GL_CXXALIAS_MDA (putw, int, (int w, FILE *restrict stream));
+# else
+_GL_CXXALIAS_SYS (putw, int, (int w, FILE *restrict stream));
+# endif
+_GL_CXXALIASWARN (putw);
+#endif
+
+#if @GNULIB_REMOVE@
+# if @REPLACE_REMOVE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef remove
+# define remove rpl_remove
+# endif
+_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (remove, int, (const char *name));
+# else
+_GL_CXXALIAS_SYS (remove, int, (const char *name));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (remove);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remove
+/* Assume remove is always declared. */
+_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
+ "use gnulib module remove for more portability");
+#endif
+
+#if @GNULIB_RENAME@
+# if @REPLACE_RENAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rename
+# define rename rpl_rename
+# endif
+_GL_FUNCDECL_RPL (rename, int,
+ (const char *old_filename, const char *new_filename)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (rename, int,
+ (const char *old_filename, const char *new_filename));
+# else
+_GL_CXXALIAS_SYS (rename, int,
+ (const char *old_filename, const char *new_filename));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (rename);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rename
+/* Assume rename is always declared. */
+_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
+ "use gnulib module rename for more portability");
+#endif
+
+#if @GNULIB_RENAMEAT@
+# if @REPLACE_RENAMEAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef renameat
+# define renameat rpl_renameat
+# endif
+_GL_FUNCDECL_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# else
+# if !@HAVE_RENAMEAT@
+_GL_FUNCDECL_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (renameat, int,
+ (int fd1, char const *file1, int fd2, char const *file2));
+# endif
+_GL_CXXALIASWARN (renameat);
+#elif defined GNULIB_POSIXCHECK
+# undef renameat
+# if HAVE_RAW_DECL_RENAMEAT
+_GL_WARN_ON_USE (renameat, "renameat is not portable - "
+ "use gnulib module renameat for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if defined __GNUC__ || defined __clang__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+/* Don't break __attribute__((format(scanf,M,N))). */
+# define scanf __scanf__
+# endif
+_GL_FUNCDECL_RPL_1 (__scanf__, int,
+ (const char *restrict format, ...)
+ __asm__ (@ASM_SYMBOL_PREFIX@
+ _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *restrict format, ...));
+# else
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef scanf
+# define scanf rpl_scanf
+# endif
+_GL_FUNCDECL_RPL (scanf, int, (const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (scanf, int, (const char *restrict format, ...));
+# endif
+# else
+_GL_CXXALIAS_SYS (scanf, int, (const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (scanf);
+# endif
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define snprintf rpl_snprintf
+# endif
+_GL_FUNCDECL_RPL (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...));
+# else
+# if !@HAVE_DECL_SNPRINTF@
+_GL_FUNCDECL_SYS (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 4)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (snprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (snprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# if HAVE_RAW_DECL_SNPRINTF
+_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
+ "use gnulib module snprintf for portability");
+# endif
+#endif
+
+/* Some people would argue that all sprintf uses should be warned about
+ (for example, OpenBSD issues a link warning for it),
+ since it can cause security holes due to buffer overruns.
+ However, we believe that sprintf can be used safely, and is more
+ efficient than snprintf in those safe cases; and as proof of our
+ belief, we use sprintf in several gnulib modules. So this header
+ intentionally avoids adding a warning to sprintf except when
+ GNULIB_POSIXCHECK is defined. */
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define sprintf rpl_sprintf
+# endif
+_GL_FUNCDECL_RPL (sprintf, int,
+ (char *restrict str, const char *restrict format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int,
+ (char *restrict str, const char *restrict format, ...));
+# else
+_GL_CXXALIAS_SYS (sprintf, int,
+ (char *restrict str, const char *restrict format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+/* Assume sprintf is always declared. */
+_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
+ "use gnulib module sprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_MDA_TEMPNAM@
+/* On native Windows, map 'tempnam' to '_tempnam', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::tempnam always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tempnam
+# define tempnam _tempnam
+# endif
+_GL_CXXALIAS_MDA (tempnam, char *, (const char *dir, const char *prefix));
+# else
+_GL_CXXALIAS_SYS (tempnam, char *, (const char *dir, const char *prefix));
+# endif
+_GL_CXXALIASWARN (tempnam);
+#endif
+
+#if @GNULIB_TMPFILE@
+# if @REPLACE_TMPFILE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define tmpfile rpl_tmpfile
+# endif
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
+# else
+_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (tmpfile);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef tmpfile
+# if HAVE_RAW_DECL_TMPFILE
+_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
+ "use gnulib module tmpfile for portability");
+# endif
+#endif
+
+#if @GNULIB_VASPRINTF@
+/* Write formatted output to a string dynamically allocated with malloc().
+ If the memory allocation succeeds, store the address of the string in
+ *RESULT and return the number of resulting bytes, excluding the trailing
+ NUL. Upon memory allocation error, or some other error, return -1. */
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define asprintf rpl_asprintf
+# endif
+_GL_FUNCDECL_RPL (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (asprintf, int,
+ (char **result, const char *format, ...));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (asprintf, int,
+ (char **result, const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 3)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (asprintf, int,
+ (char **result, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (asprintf);
+# if @REPLACE_VASPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vasprintf rpl_vasprintf
+# endif
+_GL_FUNCDECL_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# else
+# if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (vasprintf, int,
+ (char **result, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vasprintf);
+#endif
+
+#if @GNULIB_VDPRINTF@
+# if @REPLACE_VDPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vdprintf rpl_vdprintf
+# endif
+_GL_FUNCDECL_RPL (vdprintf, int,
+ (int fd, const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int,
+ (int fd, const char *restrict format, va_list args));
+# else
+# if !@HAVE_VDPRINTF@
+_GL_FUNCDECL_SYS (vdprintf, int,
+ (int fd, const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((2)));
+# endif
+/* Need to cast, because on Solaris, the third parameter will likely be
+ __va_list args. */
+_GL_CXXALIAS_SYS_CAST (vdprintf, int,
+ (int fd, const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vdprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vdprintf
+# if HAVE_RAW_DECL_VDPRINTF
+_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
+ "use gnulib module vdprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
+# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
+ || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vfprintf rpl_vfprintf
+# endif
+# define GNULIB_overrides_vfprintf 1
+# if @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# else
+_GL_FUNCDECL_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_RPL (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vfprintf, int,
+ (FILE *restrict fp,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vfprintf);
+# endif
+#endif
+#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vfprintf
+# undef vfprintf
+# endif
+/* Assume vfprintf is always declared. */
+_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
+ "use gnulib module vfprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VFSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vfscanf
+# define vfscanf rpl_vfscanf
+# endif
+_GL_FUNCDECL_RPL (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vfscanf, int,
+ (FILE *restrict stream,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vfscanf);
+# endif
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
+# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
+ || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vprintf rpl_vprintf
+# endif
+# define GNULIB_overrides_vprintf 1
+# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# else
+_GL_FUNCDECL_RPL (vprintf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_RPL (vprintf, int, (const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the second parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vprintf, int,
+ (const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vprintf);
+# endif
+#endif
+#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vprintf
+# undef vprintf
+# endif
+/* Assume vprintf is always declared. */
+_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
+ "use gnulib module vprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#if @GNULIB_VSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef vscanf
+# define vscanf rpl_vscanf
+# endif
+_GL_FUNCDECL_RPL (vscanf, int, (const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *restrict format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vscanf, int, (const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vscanf);
+# endif
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsnprintf rpl_vsnprintf
+# endif
+_GL_FUNCDECL_RPL (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
+ _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args));
+# else
+# if !@HAVE_DECL_VSNPRINTF@
+_GL_FUNCDECL_SYS (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (3, 0)
+ _GL_ARG_NONNULL ((3)));
+# endif
+_GL_CXXALIAS_SYS (vsnprintf, int,
+ (char *restrict str, size_t size,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vsnprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# if HAVE_RAW_DECL_VSNPRINTF
+_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
+ "use gnulib module vsnprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define vsprintf rpl_vsprintf
+# endif
+_GL_FUNCDECL_RPL (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args)
+ _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD (2, 0)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+ __va_list args
+ and GCC's fixincludes did not change this to __gnuc_va_list. */
+_GL_CXXALIAS_SYS_CAST (vsprintf, int,
+ (char *restrict str,
+ const char *restrict format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vsprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+/* Assume vsprintf is always declared. */
+_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
+ "use gnulib module vsprintf-posix for portable "
+ "POSIX compliance");
+#endif
+
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
new file mode 100644
index 0000000..d02d72f
--- /dev/null
+++ b/lib/stdlib.in.h
@@ -0,0 +1,1321 @@
+/* A GNU-like <stdlib.h>.
+
+ Copyright (C) 1995, 2001-2004, 2006-2020 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
+/* Special invocation conventions inside some gnulib header files,
+ and inside some glibc header files, respectively. */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+#define _@GUARD_PREFIX@_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
+#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
+# include <sys/wait.h>
+#endif
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>. */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+ <sys/loadavg.h>. */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+
+/* Native Windows platforms declare _mktemp() in <io.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <io.h>
+#endif
+
+#if @GNULIB_RANDOM_R@
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+ from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
+ 'struct random_data'. */
+# if @HAVE_RANDOM_H@
+# include <random.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
+# include <stdint.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@
+/* Define 'struct random_data'.
+ But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
+# if !GNULIB_defined_struct_random_data
+struct random_data
+{
+ int32_t *fptr; /* Front pointer. */
+ int32_t *rptr; /* Rear pointer. */
+ int32_t *state; /* Array of state values. */
+ int rand_type; /* Type of random number generator. */
+ int rand_deg; /* Degree of random number generator. */
+ int rand_sep; /* Distance between front and rear. */
+ int32_t *end_ptr; /* Pointer behind state table. */
+};
+# define GNULIB_defined_struct_random_data 1
+# endif
+# endif
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__)
+/* On Mac OS X 10.3, only <unistd.h> declares mkstemp. */
+/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
+/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps. */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
+/* But avoid namespace pollution on glibc systems and native Windows. */
+# include <unistd.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definition of _Noreturn is copied here. */
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89. */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+ with proper operation of xargs. */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#if @GNULIB__EXIT@
+/* Terminate the current process with the given return code, without running
+ the 'atexit' handlers. */
+# if !@HAVE__EXIT@
+_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
+# endif
+_GL_CXXALIAS_SYS (_Exit, void, (int status));
+_GL_CXXALIASWARN (_Exit);
+#elif defined GNULIB_POSIXCHECK
+# undef _Exit
+# if HAVE_RAW_DECL__EXIT
+_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
+ "use gnulib module _Exit for portability");
+# endif
+#endif
+
+
+/* Allocate memory with indefinite extent and specified alignment. */
+#if @GNULIB_ALIGNED_ALLOC@
+# if @REPLACE_ALIGNED_ALLOC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef aligned_alloc
+# define aligned_alloc rpl_aligned_alloc
+# endif
+_GL_FUNCDECL_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+_GL_CXXALIAS_RPL (aligned_alloc, void *, (size_t alignment, size_t size));
+# else
+# if @HAVE_ALIGNED_ALLOC@
+_GL_CXXALIAS_SYS (aligned_alloc, void *, (size_t alignment, size_t size));
+# endif
+# endif
+# if @HAVE_ALIGNED_ALLOC@
+_GL_CXXALIASWARN (aligned_alloc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef aligned_alloc
+# if HAVE_RAW_DECL_ALIGNED_ALLOC
+_GL_WARN_ON_USE (aligned_alloc, "aligned_alloc is not portable - "
+ "use gnulib module aligned_alloc for portability");
+# endif
+#endif
+
+#if @GNULIB_ATOLL@
+/* Parse a signed decimal integer.
+ Returns the value of the integer. Errors are not detected. */
+# if !@HAVE_ATOLL@
+_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
+_GL_CXXALIASWARN (atoll);
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+ "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if @REPLACE_CALLOC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef calloc
+# define calloc rpl_calloc
+# endif
+_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
+# else
+_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (calloc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared. */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+ "use gnulib module calloc-posix for portability");
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define canonicalize_file_name rpl_canonicalize_file_name
+# endif
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
+# else
+# if !@HAVE_CANONICALIZE_FILE_NAME@
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
+# endif
+# ifndef GNULIB_defined_canonicalize_file_name
+# define GNULIB_defined_canonicalize_file_name \
+ (!@HAVE_CANONICALIZE_FILE_NAME@ || @REPLACE_CANONICALIZE_FILE_NAME@)
+# endif
+_GL_CXXALIASWARN (canonicalize_file_name);
+#elif defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name,
+ "canonicalize_file_name is unportable - "
+ "use gnulib module canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_MDA_ECVT@
+/* On native Windows, map 'ecvt' to '_ecvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::ecvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ecvt
+# define ecvt _ecvt
+# endif
+_GL_CXXALIAS_MDA (ecvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# else
+# if @HAVE_DECL_ECVT@
+_GL_CXXALIAS_SYS (ecvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_ECVT@
+_GL_CXXALIASWARN (ecvt);
+# endif
+#endif
+
+#if @GNULIB_MDA_FCVT@
+/* On native Windows, map 'fcvt' to '_fcvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::fcvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fcvt
+# define fcvt _fcvt
+# endif
+_GL_CXXALIAS_MDA (fcvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# else
+# if @HAVE_DECL_FCVT@
+_GL_CXXALIAS_SYS (fcvt, char *,
+ (double number, int ndigits, int *decptp, int *signp));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_FCVT@
+_GL_CXXALIASWARN (fcvt);
+# endif
+#endif
+
+#if @GNULIB_FREE_POSIX@
+# if @REPLACE_FREE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef free
+# define free rpl_free
+# endif
+_GL_FUNCDECL_RPL (free, void, (void *ptr));
+_GL_CXXALIAS_RPL (free, void, (void *ptr));
+# else
+_GL_CXXALIAS_SYS (free, void, (void *ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (free);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef free
+/* Assume free is always declared. */
+_GL_WARN_ON_USE (free, "free is not future POSIX compliant everywhere - "
+ "use gnulib module free for portability");
+#endif
+
+#if @GNULIB_MDA_GCVT@
+/* On native Windows, map 'gcvt' to '_gcvt', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::gcvt on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gcvt
+# define gcvt _gcvt
+# endif
+_GL_CXXALIAS_MDA (gcvt, char *, (double number, int ndigits, char *buf));
+# else
+# if @HAVE_DECL_GCVT@
+_GL_CXXALIAS_SYS (gcvt, char *, (double number, int ndigits, char *buf));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_GCVT@
+_GL_CXXALIASWARN (gcvt);
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+ The three numbers are the load average of the last 1 minute, the last 5
+ minutes, and the last 15 minutes, respectively.
+ LOADAVG is an array of NELEM numbers. */
+# if !@HAVE_DECL_GETLOADAVG@
+_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
+_GL_CXXALIASWARN (getloadavg);
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+ "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+ "token" or "token=value", getsubopt parses the first of these elements.
+ If the first element refers to a "token" that is member of the given
+ NULL-terminated array of tokens:
+ - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+ the first option and the comma, sets *VALUEP to the value of the
+ element (or NULL if it doesn't contain an "=" sign),
+ - It returns the index of the "token" in the given array of tokens.
+ Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+ For more details see the POSIX specification.
+ https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+_GL_FUNCDECL_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getsubopt, int,
+ (char **optionp, char *const *tokens, char **valuep));
+_GL_CXXALIASWARN (getsubopt);
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+ "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_GRANTPT@
+/* Change the ownership and access permission of the slave side of the
+ pseudo-terminal whose master side is specified by FD. */
+# if !@HAVE_GRANTPT@
+_GL_FUNCDECL_SYS (grantpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (grantpt, int, (int fd));
+_GL_CXXALIASWARN (grantpt);
+#elif defined GNULIB_POSIXCHECK
+# undef grantpt
+# if HAVE_RAW_DECL_GRANTPT
+_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
+ "use gnulib module grantpt for portability");
+# endif
+#endif
+
+/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
+ rely on GNU or POSIX semantics for malloc and realloc (for example,
+ by never specifying a zero size), so it does not need malloc or
+ realloc to be redefined. */
+#if @GNULIB_MALLOC_POSIX@
+# if @REPLACE_MALLOC@
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef malloc
+# define malloc rpl_malloc
+# endif
+_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
+# else
+_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (malloc);
+# endif
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef malloc
+/* Assume malloc is always declared. */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+ "use gnulib module malloc-posix for portability");
+#endif
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBTOWC@
+# if @REPLACE_MBTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbtowc
+# define mbtowc rpl_mbtowc
+# endif
+_GL_FUNCDECL_RPL (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# else
+# if !@HAVE_MBTOWC@
+_GL_FUNCDECL_SYS (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# endif
+_GL_CXXALIAS_SYS (mbtowc, int,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbtowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbtowc
+# if HAVE_RAW_DECL_MBTOWC
+_GL_WARN_ON_USE (mbtowc, "mbtowc is not portable - "
+ "use gnulib module mbtowc for portability");
+# endif
+#endif
+
+#if @GNULIB_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the directory name unique.
+ Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+ The directory is created mode 700. */
+# if !@HAVE_MKDTEMP@
+_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
+_GL_CXXALIASWARN (mkdtemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+ "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKOSTEMP@
+_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+ "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE before a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ The file is then created, with the specified flags, ensuring it didn't exist
+ before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKOSTEMPS@
+_GL_FUNCDECL_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemps, int,
+ (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+ "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if @REPLACE_MKSTEMP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mkstemp rpl_mkstemp
+# endif
+_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
+# else
+# if ! @HAVE_MKSTEMP@
+_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mkstemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+ "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+ The last six characters of TEMPLATE prior to a suffix of length
+ SUFFIXLEN must be "XXXXXX";
+ they are replaced with a string that makes the file name unique.
+ The file is then created, ensuring it didn't exist before.
+ The file is created read-write (mask at least 0600 & ~umask), but it may be
+ world-readable and world-writable (mask 0666 & ~umask), depending on the
+ implementation.
+ Returns the open file descriptor if successful, otherwise -1 and errno
+ set. */
+# if !@HAVE_MKSTEMPS@
+_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
+_GL_CXXALIASWARN (mkstemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+ "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MDA_MKTEMP@
+/* On native Windows, map 'mktemp' to '_mktemp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::mktemp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mktemp
+# define mktemp _mktemp
+# endif
+_GL_CXXALIAS_MDA (mktemp, char *, (char * /*template*/));
+# else
+_GL_CXXALIAS_SYS (mktemp, char *, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mktemp);
+#endif
+
+/* Allocate memory with indefinite extent and specified alignment. */
+#if @GNULIB_POSIX_MEMALIGN@
+# if @REPLACE_POSIX_MEMALIGN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef posix_memalign
+# define posix_memalign rpl_posix_memalign
+# endif
+_GL_FUNCDECL_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# else
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIAS_SYS (posix_memalign, int,
+ (void **memptr, size_t alignment, size_t size));
+# endif
+# endif
+# if @HAVE_POSIX_MEMALIGN@
+_GL_CXXALIASWARN (posix_memalign);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef posix_memalign
+# if HAVE_RAW_DECL_POSIX_MEMALIGN
+_GL_WARN_ON_USE (posix_memalign, "posix_memalign is not portable - "
+ "use gnulib module posix_memalign for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_OPENPT@
+/* Return an FD open to the master side of a pseudo-terminal. Flags should
+ include O_RDWR, and may also include O_NOCTTY. */
+# if !@HAVE_POSIX_OPENPT@
+_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
+# endif
+_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
+_GL_CXXALIASWARN (posix_openpt);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_openpt
+# if HAVE_RAW_DECL_POSIX_OPENPT
+_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
+ "use gnulib module posix_openpt for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME@
+/* Return the pathname of the pseudo-terminal slave associated with
+ the master FD is open on, or NULL on errors. */
+# if @REPLACE_PTSNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ptsname
+# define ptsname rpl_ptsname
+# endif
+_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
+_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
+# else
+# if !@HAVE_PTSNAME@
+_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIASWARN (ptsname);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname
+# if HAVE_RAW_DECL_PTSNAME
+_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
+ "use gnulib module ptsname for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME_R@
+/* Set the pathname of the pseudo-terminal slave associated with
+ the master FD is open on and return 0, or set errno and return
+ non-zero on errors. */
+# if @REPLACE_PTSNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ptsname_r
+# define ptsname_r rpl_ptsname_r
+# endif
+_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+# else
+# if !@HAVE_PTSNAME_R@
+_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+# ifndef GNULIB_defined_ptsname_r
+# define GNULIB_defined_ptsname_r (!@HAVE_PTSNAME_R@ || @REPLACE_PTSNAME_R@)
+# endif
+_GL_CXXALIASWARN (ptsname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname_r
+# if HAVE_RAW_DECL_PTSNAME_R
+_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
+ "use gnulib module ptsname_r for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv rpl_putenv
+# endif
+_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (putenv, int, (char *string));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv _putenv
+# endif
+_GL_CXXALIAS_MDA (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#elif @GNULIB_MDA_PUTENV@
+/* On native Windows, map 'putenv' to '_putenv', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::putenv always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef putenv
+# define putenv _putenv
+# endif
+/* Need to cast, because on mingw, the parameter is either
+ 'const char *string' or 'char *string'. */
+_GL_CXXALIAS_MDA_CAST (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#endif
+
+#if @GNULIB_QSORT_R@
+/* Sort an array of NMEMB elements, starting at address BASE, each element
+ occupying SIZE bytes, in ascending order according to the comparison
+ function COMPARE. */
+# if @REPLACE_QSORT_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef qsort_r
+# define qsort_r rpl_qsort_r
+# endif
+_GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ int (*compare) (void const *, void const *,
+ void *),
+ void *arg) _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ int (*compare) (void const *, void const *,
+ void *),
+ void *arg));
+# else
+# if !@HAVE_QSORT_R@
+_GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ int (*compare) (void const *, void const *,
+ void *),
+ void *arg) _GL_ARG_NONNULL ((1, 4)));
+# endif
+_GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+ int (*compare) (void const *, void const *,
+ void *),
+ void *arg));
+# endif
+_GL_CXXALIASWARN (qsort_r);
+#elif defined GNULIB_POSIXCHECK
+# undef qsort_r
+# if HAVE_RAW_DECL_QSORT_R
+_GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - "
+ "use gnulib module qsort_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+# ifndef RAND_MAX
+# define RAND_MAX 2147483647
+# endif
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef random
+# define random rpl_random
+# endif
+_GL_FUNCDECL_RPL (random, long, (void));
+_GL_CXXALIAS_RPL (random, long, (void));
+# else
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (random, long, (void));
+# endif
+/* Need to cast, because on Haiku, the return type is
+ int. */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
+# endif
+_GL_CXXALIASWARN (random);
+#elif defined GNULIB_POSIXCHECK
+# undef random
+# if HAVE_RAW_DECL_RANDOM
+_GL_WARN_ON_USE (random, "random is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef srandom
+# define srandom rpl_srandom
+# endif
+_GL_FUNCDECL_RPL (srandom, void, (unsigned int seed));
+_GL_CXXALIAS_RPL (srandom, void, (unsigned int seed));
+# else
+# if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
+# endif
+/* Need to cast, because on FreeBSD, the first parameter is
+ unsigned long seed. */
+_GL_CXXALIAS_SYS_CAST (srandom, void, (unsigned int seed));
+# endif
+_GL_CXXALIASWARN (srandom);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom
+# if HAVE_RAW_DECL_SRANDOM
+_GL_WARN_ON_USE (srandom, "srandom is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_INITSTATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef initstate
+# define initstate rpl_initstate
+# endif
+_GL_FUNCDECL_RPL (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size));
+# else
+# if !@HAVE_INITSTATE@ || !@HAVE_DECL_INITSTATE@
+_GL_FUNCDECL_SYS (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size)
+ _GL_ARG_NONNULL ((2)));
+# endif
+/* Need to cast, because on FreeBSD, the first parameter is
+ unsigned long seed. */
+_GL_CXXALIAS_SYS_CAST (initstate, char *,
+ (unsigned int seed, char *buf, size_t buf_size));
+# endif
+_GL_CXXALIASWARN (initstate);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate
+# if HAVE_RAW_DECL_INITSTATE
+_GL_WARN_ON_USE (initstate, "initstate is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_SETSTATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setstate
+# define setstate rpl_setstate
+# endif
+_GL_FUNCDECL_RPL (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setstate, char *, (char *arg_state));
+# else
+# if !@HAVE_SETSTATE@ || !@HAVE_DECL_SETSTATE@
+_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Mac OS X 10.13, HP-UX, Solaris the first parameter
+ is const char *arg_state. */
+_GL_CXXALIAS_SYS_CAST (setstate, char *, (char *arg_state));
+# endif
+_GL_CXXALIASWARN (setstate);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate
+# if HAVE_RAW_DECL_SETSTATE
+_GL_WARN_ON_USE (setstate, "setstate is unportable - "
+ "use gnulib module random for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef random_r
+# define random_r rpl_random_r
+# endif
+_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
+# endif
+_GL_CXXALIASWARN (random_r);
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef srandom_r
+# define srandom_r rpl_srandom_r
+# endif
+_GL_FUNCDECL_RPL (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (srandom_r, int,
+ (unsigned int seed, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (srandom_r);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef initstate_r
+# define initstate_r rpl_initstate_r
+# endif
+_GL_FUNCDECL_RPL (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+/* Need to cast, because on Haiku, the third parameter is
+ unsigned long buf_size. */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+ (unsigned int seed, char *buf, size_t buf_size,
+ struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (initstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setstate_r
+# define setstate_r rpl_setstate_r
+# endif
+_GL_FUNCDECL_RPL (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state));
+# else
+# if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+/* Need to cast, because on Haiku, the first parameter is
+ void *arg_state. */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+ (char *arg_state, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (setstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+ "use gnulib module random_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOC_POSIX@
+# if @REPLACE_REALLOC@
+# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+ || _GL_USE_STDLIB_ALLOC)
+# undef realloc
+# define realloc rpl_realloc
+# endif
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
+# else
+_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (realloc);
+# endif
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef realloc
+/* Assume realloc is always declared. */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+ "use gnulib module realloc-posix for portability");
+#endif
+
+
+#if @GNULIB_REALLOCARRAY@
+# if ! @HAVE_REALLOCARRAY@
+_GL_FUNCDECL_SYS (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+# endif
+_GL_CXXALIAS_SYS (reallocarray, void *,
+ (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIASWARN (reallocarray);
+#elif defined GNULIB_POSIXCHECK
+# undef reallocarray
+# if HAVE_RAW_DECL_REALLOCARRAY
+_GL_WARN_ON_USE (reallocarray, "reallocarray is not portable - "
+ "use gnulib module reallocarray for portability");
+# endif
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define realpath rpl_realpath
+# endif
+_GL_FUNCDECL_RPL (realpath, char *,
+ (const char *restrict name, char *restrict resolved)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *,
+ (const char *restrict name, char *restrict resolved));
+# else
+# if !@HAVE_REALPATH@
+_GL_FUNCDECL_SYS (realpath, char *,
+ (const char *restrict name, char *restrict resolved)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (realpath, char *,
+ (const char *restrict name, char *restrict resolved));
+# endif
+_GL_CXXALIASWARN (realpath);
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+ "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+/* Test a user response to a question.
+ Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear. */
+# if !@HAVE_RPMATCH@
+_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
+_GL_CXXALIASWARN (rpmatch);
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+ "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SECURE_GETENV@
+/* Look up NAME in the environment, returning 0 in insecure situations. */
+# if !@HAVE_SECURE_GETENV@
+_GL_FUNCDECL_SYS (secure_getenv, char *,
+ (char const *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
+_GL_CXXALIASWARN (secure_getenv);
+#elif defined GNULIB_POSIXCHECK
+# undef secure_getenv
+# if HAVE_RAW_DECL_SECURE_GETENV
+_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
+ "use gnulib module secure_getenv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+/* Set NAME to VALUE in the environment.
+ If REPLACE is nonzero, overwrite an existing value. */
+# if @REPLACE_SETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setenv
+# define setenv rpl_setenv
+# endif
+_GL_FUNCDECL_RPL (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setenv, int,
+ (const char *name, const char *value, int replace));
+# else
+# if !@HAVE_DECL_SETENV@
+_GL_FUNCDECL_SYS (setenv, int,
+ (const char *name, const char *value, int replace)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (setenv, int,
+ (const char *name, const char *value, int replace));
+# endif
+# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
+_GL_CXXALIASWARN (setenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+ "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate. */
+# if @REPLACE_STRTOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtod rpl_strtod
+# endif
+# define GNULIB_defined_strtod_function 1
+_GL_FUNCDECL_RPL (strtod, double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double,
+ (const char *restrict str, char **restrict endp));
+# else
+# if !@HAVE_STRTOD@
+_GL_FUNCDECL_SYS (strtod, double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtod, double,
+ (const char *restrict str, char **restrict endp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strtod);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+ "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLD@
+ /* Parse a 'long double' from STRING, updating ENDP if appropriate. */
+# if @REPLACE_STRTOLD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strtold rpl_strtold
+# endif
+# define GNULIB_defined_strtold_function 1
+_GL_FUNCDECL_RPL (strtold, long double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double,
+ (const char *restrict str, char **restrict endp));
+# else
+# if !@HAVE_STRTOLD@
+_GL_FUNCDECL_SYS (strtold, long double,
+ (const char *restrict str, char **restrict endp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtold, long double,
+ (const char *restrict str, char **restrict endp));
+# endif
+_GL_CXXALIASWARN (strtold);
+#elif defined GNULIB_POSIXCHECK
+# undef strtold
+# if HAVE_RAW_DECL_STRTOLD
+_GL_WARN_ON_USE (strtold, "strtold is unportable - "
+ "use gnulib module strtold for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+ to ERANGE. */
+# if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoll, long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+_GL_CXXALIASWARN (strtoll);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+ "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+ The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+ it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+ "0x").
+ If ENDPTR is not NULL, the address of the first byte after the integer is
+ stored in *ENDPTR.
+ Upon overflow, the return value is ULLONG_MAX, and errno is set to
+ ERANGE. */
+# if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoull, unsigned long long,
+ (const char *restrict string, char **restrict endptr,
+ int base));
+_GL_CXXALIASWARN (strtoull);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+ "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNLOCKPT@
+/* Unlock the slave side of the pseudo-terminal whose master side is specified
+ by FD, so that it can be opened. */
+# if !@HAVE_UNLOCKPT@
+_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
+_GL_CXXALIASWARN (unlockpt);
+#elif defined GNULIB_POSIXCHECK
+# undef unlockpt
+# if HAVE_RAW_DECL_UNLOCKPT
+_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
+ "use gnulib module unlockpt for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+/* Remove the variable NAME from the environment. */
+# if @REPLACE_UNSETENV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unsetenv
+# define unsetenv rpl_unsetenv
+# endif
+_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
+# else
+# if !@HAVE_DECL_UNSETENV@
+_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
+# endif
+# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
+_GL_CXXALIASWARN (unsetenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+ "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCTOMB@
+# if @REPLACE_WCTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctomb
+# define wctomb rpl_wctomb
+# endif
+_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
+_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
+# else
+_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctomb);
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif
diff --git a/lib/stpcpy.c b/lib/stpcpy.c
new file mode 100644
index 0000000..58265f0
--- /dev/null
+++ b/lib/stpcpy.c
@@ -0,0 +1,49 @@
+/* stpcpy.c -- copy a string and return pointer to end of new string
+ Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2020 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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 any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#undef __stpcpy
+#ifdef _LIBC
+# undef stpcpy
+#endif
+
+#ifndef weak_alias
+# define __stpcpy stpcpy
+#endif
+
+/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */
+char *
+__stpcpy (char *dest, const char *src)
+{
+ register char *d = dest;
+ register const char *s = src;
+
+ do
+ *d++ = *s;
+ while (*s++ != '\0');
+
+ return d - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpcpy, stpcpy)
+#endif
diff --git a/lib/str-two-way.h b/lib/str-two-way.h
new file mode 100644
index 0000000..6ad0130
--- /dev/null
+++ b/lib/str-two-way.h
@@ -0,0 +1,452 @@
+/* Byte-wise substring search, using the Two-Way algorithm.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Written by Eric Blake <ebb9@byu.net>, 2008.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Before including this file, you need to include <config.h> and
+ <string.h>, and define:
+ RETURN_TYPE A macro that expands to the return type.
+ AVAILABLE(h, h_l, j, n_l)
+ A macro that returns nonzero if there are
+ at least N_L bytes left starting at H[J].
+ H is 'unsigned char *', H_L, J, and N_L
+ are 'size_t'; H_L is an lvalue. For
+ NUL-terminated searches, H_L can be
+ modified each iteration to avoid having
+ to compute the end of H up front.
+
+ For case-insensitivity, you may optionally define:
+ CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
+ characters of P1 and P2 are equal.
+ CANON_ELEMENT(c) A macro that canonicalizes an element right after
+ it has been fetched from one of the two strings.
+ The argument is an 'unsigned char'; the result
+ must be an 'unsigned char' as well.
+
+ This file undefines the macros documented above, and defines
+ LONG_NEEDLE_THRESHOLD.
+*/
+
+#include <limits.h>
+#include <stdint.h>
+
+/* We use the Two-Way string matching algorithm (also known as
+ Chrochemore-Perrin), which guarantees linear complexity with
+ constant space. Additionally, for long needles, we also use a bad
+ character shift table similar to the Boyer-Moore algorithm to
+ achieve improved (potentially sub-linear) performance.
+
+ See https://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260,
+ https://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm,
+ https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.6641&rep=rep1&type=pdf
+*/
+
+/* Point at which computing a bad-byte shift table is likely to be
+ worthwhile. Small needles should not compute a table, since it
+ adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
+ speedup no greater than a factor of NEEDLE_LEN. The larger the
+ needle, the better the potential performance gain. On the other
+ hand, on non-POSIX systems with CHAR_BIT larger than eight, the
+ memory required for the table is prohibitive. */
+#if CHAR_BIT < 10
+# define LONG_NEEDLE_THRESHOLD 32U
+#else
+# define LONG_NEEDLE_THRESHOLD SIZE_MAX
+#endif
+
+#ifndef MAX
+# define MAX(a, b) ((a < b) ? (b) : (a))
+#endif
+
+#ifndef CANON_ELEMENT
+# define CANON_ELEMENT(c) c
+#endif
+#ifndef CMP_FUNC
+# define CMP_FUNC memcmp
+#endif
+
+/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
+ Return the index of the first byte in the right half, and set
+ *PERIOD to the global period of the right half.
+
+ The global period of a string is the smallest index (possibly its
+ length) at which all remaining bytes in the string are repetitions
+ of the prefix (the last repetition may be a subset of the prefix).
+
+ When NEEDLE is factored into two halves, a local period is the
+ length of the smallest word that shares a suffix with the left half
+ and shares a prefix with the right half. All factorizations of a
+ non-empty NEEDLE have a local period of at least 1 and no greater
+ than NEEDLE_LEN.
+
+ A critical factorization has the property that the local period
+ equals the global period. All strings have at least one critical
+ factorization with the left half smaller than the global period.
+ And while some strings have more than one critical factorization,
+ it is provable that with an ordered alphabet, at least one of the
+ critical factorizations corresponds to a maximal suffix.
+
+ Given an ordered alphabet, a critical factorization can be computed
+ in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
+ shorter of two ordered maximal suffixes. The ordered maximal
+ suffixes are determined by lexicographic comparison while tracking
+ periodicity. */
+static size_t
+critical_factorization (const unsigned char *needle, size_t needle_len,
+ size_t *period)
+{
+ /* Index of last byte of left half, or SIZE_MAX. */
+ size_t max_suffix, max_suffix_rev;
+ size_t j; /* Index into NEEDLE for current candidate suffix. */
+ size_t k; /* Offset into current period. */
+ size_t p; /* Intermediate period. */
+ unsigned char a, b; /* Current comparison bytes. */
+
+ /* Special case NEEDLE_LEN of 1 or 2 (all callers already filtered
+ out 0-length needles. */
+ if (needle_len < 3)
+ {
+ *period = 1;
+ return needle_len - 1;
+ }
+
+ /* Invariants:
+ 0 <= j < NEEDLE_LEN - 1
+ -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
+ min(max_suffix, max_suffix_rev) < global period of NEEDLE
+ 1 <= p <= global period of NEEDLE
+ p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
+ 1 <= k <= p
+ */
+
+ /* Perform lexicographic search. */
+ max_suffix = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix + k]);
+ if (a < b)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* b < a */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix = j++;
+ k = p = 1;
+ }
+ }
+ *period = p;
+
+ /* Perform reverse lexicographic search. */
+ max_suffix_rev = SIZE_MAX;
+ j = 0;
+ k = p = 1;
+ while (j + k < needle_len)
+ {
+ a = CANON_ELEMENT (needle[j + k]);
+ b = CANON_ELEMENT (needle[max_suffix_rev + k]);
+ if (b < a)
+ {
+ /* Suffix is smaller, period is entire prefix so far. */
+ j += k;
+ k = 1;
+ p = j - max_suffix_rev;
+ }
+ else if (a == b)
+ {
+ /* Advance through repetition of the current period. */
+ if (k != p)
+ ++k;
+ else
+ {
+ j += p;
+ k = 1;
+ }
+ }
+ else /* a < b */
+ {
+ /* Suffix is larger, start over from current location. */
+ max_suffix_rev = j++;
+ k = p = 1;
+ }
+ }
+
+ /* Choose the shorter suffix. Return the index of the first byte of
+ the right half, rather than the last byte of the left half.
+
+ For some examples, 'banana' has two critical factorizations, both
+ exposed by the two lexicographic extreme suffixes of 'anana' and
+ 'nana', where both suffixes have a period of 2. On the other
+ hand, with 'aab' and 'bba', both strings have a single critical
+ factorization of the last byte, with the suffix having a period
+ of 1. While the maximal lexicographic suffix of 'aab' is 'b',
+ the maximal lexicographic suffix of 'bba' is 'ba', which is not a
+ critical factorization. Conversely, the maximal reverse
+ lexicographic suffix of 'a' works for 'bba', but not 'ab' for
+ 'aab'. The shorter suffix of the two will always be a critical
+ factorization. */
+ if (max_suffix_rev + 1 < max_suffix + 1)
+ return max_suffix + 1;
+ *period = p;
+ return max_suffix_rev + 1;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 2 * NEEDLE_LEN comparisons.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
+static RETURN_TYPE
+two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch in the left half can
+ only advance by the period, so use memory to avoid rescanning
+ known occurrences of the period in the right half. */
+ size_t memory = 0;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = MAX (suffix, memory);
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Scan for matches in right half. */
+ i = suffix;
+ while (i < needle_len && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+/* Return the first location of non-empty NEEDLE within HAYSTACK, or
+ NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
+ method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
+ Performance is guaranteed to be linear, with an initialization cost
+ of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
+
+ If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
+ most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
+ and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
+ If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
+ HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
+ sublinear performance is not possible. */
+static RETURN_TYPE
+two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
+ const unsigned char *needle, size_t needle_len)
+{
+ size_t i; /* Index into current byte of NEEDLE. */
+ size_t j; /* Index into current window of HAYSTACK. */
+ size_t period; /* The period of the right half of needle. */
+ size_t suffix; /* The index of the right half of needle. */
+ size_t shift_table[1U << CHAR_BIT]; /* See below. */
+
+ /* Factor the needle into two halves, such that the left half is
+ smaller than the global period, and the right half is
+ periodic (with a period as large as NEEDLE_LEN - suffix). */
+ suffix = critical_factorization (needle, needle_len, &period);
+
+ /* Populate shift_table. For each possible byte value c,
+ shift_table[c] is the distance from the last occurrence of c to
+ the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
+ shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
+ for (i = 0; i < 1U << CHAR_BIT; i++)
+ shift_table[i] = needle_len;
+ for (i = 0; i < needle_len; i++)
+ shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
+
+ /* Perform the search. Each iteration compares the right half
+ first. */
+ if (CMP_FUNC (needle, needle + period, suffix) == 0)
+ {
+ /* Entire needle is periodic; a mismatch in the left half can
+ only advance by the period, so use memory to avoid rescanning
+ known occurrences of the period in the right half. */
+ size_t memory = 0;
+ size_t shift;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ if (memory && shift < period)
+ {
+ /* Since needle is periodic, but the last period has
+ a byte out of place, there can be no match until
+ after the mismatch. */
+ shift = needle_len - period;
+ }
+ memory = 0;
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = MAX (suffix, memory);
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (memory < i + 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i + 1 < memory + 1)
+ return (RETURN_TYPE) (haystack + j);
+ /* No match, so remember how many repetitions of period
+ on the right half were scanned. */
+ j += period;
+ memory = needle_len - period;
+ }
+ else
+ {
+ j += i - suffix + 1;
+ memory = 0;
+ }
+ }
+ }
+ else
+ {
+ /* The two halves of needle are distinct; no extra memory is
+ required, and any mismatch results in a maximal shift. */
+ size_t shift;
+ period = MAX (suffix, needle_len - suffix) + 1;
+ j = 0;
+ while (AVAILABLE (haystack, haystack_len, j, needle_len))
+ {
+ /* Check the last byte first; if it does not match, then
+ shift to the next possible match location. */
+ shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
+ if (0 < shift)
+ {
+ j += shift;
+ continue;
+ }
+ /* Scan for matches in right half. The last byte has
+ already been matched, by virtue of the shift table. */
+ i = suffix;
+ while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ ++i;
+ if (needle_len - 1 <= i)
+ {
+ /* Scan for matches in left half. */
+ i = suffix - 1;
+ while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
+ == CANON_ELEMENT (haystack[i + j])))
+ --i;
+ if (i == SIZE_MAX)
+ return (RETURN_TYPE) (haystack + j);
+ j += period;
+ }
+ else
+ j += i - suffix + 1;
+ }
+ }
+ return NULL;
+}
+
+#undef AVAILABLE
+#undef CANON_ELEMENT
+#undef CMP_FUNC
+#undef MAX
+#undef RETURN_TYPE
diff --git a/lib/strcasecmp.c b/lib/strcasecmp.c
new file mode 100644
index 0000000..854c52e
--- /dev/null
+++ b/lib/strcasecmp.c
@@ -0,0 +1,62 @@
+/* Case-insensitive string comparison function.
+ Copyright (C) 1998-1999, 2005-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work with multibyte strings! */
+
+int
+strcasecmp (const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return _GL_CMP (c1, c2);
+}
diff --git a/lib/strchrnul.c b/lib/strchrnul.c
new file mode 100644
index 0000000..858d66f
--- /dev/null
+++ b/lib/strchrnul.c
@@ -0,0 +1,142 @@
+/* Searching in a string.
+ Copyright (C) 2003, 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+char *
+strchrnul (const char *s, int c_in)
+{
+ /* On 32-bit hardware, choosing longword to be a 32-bit unsigned
+ long instead of a 64-bit uintmax_t tends to give better
+ performance. On 64-bit hardware, unsigned long is generally 64
+ bits already. Change this typedef to experiment with
+ performance. */
+ typedef unsigned long int longword;
+
+ const unsigned char *char_ptr;
+ const longword *longword_ptr;
+ longword repeated_one;
+ longword repeated_c;
+ unsigned char c;
+
+ c = (unsigned char) c_in;
+ if (!c)
+ return rawmemchr (s, 0);
+
+ /* Handle the first few bytes by reading one byte at a time.
+ Do this until CHAR_PTR is aligned on a longword boundary. */
+ for (char_ptr = (const unsigned char *) s;
+ (size_t) char_ptr % sizeof (longword) != 0;
+ ++char_ptr)
+ if (!*char_ptr || *char_ptr == c)
+ return (char *) char_ptr;
+
+ longword_ptr = (const longword *) char_ptr;
+
+ /* All these elucidatory comments refer to 4-byte longwords,
+ but the theory applies equally well to any size longwords. */
+
+ /* Compute auxiliary longword values:
+ repeated_one is a value which has a 1 in every byte.
+ repeated_c has c in every byte. */
+ repeated_one = 0x01010101;
+ repeated_c = c | (c << 8);
+ repeated_c |= repeated_c << 16;
+ if (0xffffffffU < (longword) -1)
+ {
+ repeated_one |= repeated_one << 31 << 1;
+ repeated_c |= repeated_c << 31 << 1;
+ if (8 < sizeof (longword))
+ {
+ size_t i;
+
+ for (i = 64; i < sizeof (longword) * 8; i *= 2)
+ {
+ repeated_one |= repeated_one << i;
+ repeated_c |= repeated_c << i;
+ }
+ }
+ }
+
+ /* Instead of the traditional loop which tests each byte, we will
+ test a longword at a time. The tricky part is testing if *any of
+ the four* bytes in the longword in question are equal to NUL or
+ c. We first use an xor with repeated_c. This reduces the task
+ to testing whether *any of the four* bytes in longword1 or
+ longword2 is zero.
+
+ Let's consider longword1. We compute tmp =
+ ((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
+ That is, we perform the following operations:
+ 1. Subtract repeated_one.
+ 2. & ~longword1.
+ 3. & a mask consisting of 0x80 in every byte.
+ Consider what happens in each byte:
+ - If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
+ and step 3 transforms it into 0x80. A carry can also be propagated
+ to more significant bytes.
+ - If a byte of longword1 is nonzero, let its lowest 1 bit be at
+ position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
+ the byte ends in a single bit of value 0 and k bits of value 1.
+ After step 2, the result is just k bits of value 1: 2^k - 1. After
+ step 3, the result is 0. And no carry is produced.
+ So, if longword1 has only non-zero bytes, tmp is zero.
+ Whereas if longword1 has a zero byte, call j the position of the least
+ significant zero byte. Then the result has a zero at positions 0, ...,
+ j-1 and a 0x80 at position j. We cannot predict the result at the more
+ significant bytes (positions j+1..3), but it does not matter since we
+ already have a non-zero bit at position 8*j+7.
+
+ The test whether any byte in longword1 or longword2 is zero is equivalent
+ to testing whether tmp1 is nonzero or tmp2 is nonzero. We can combine
+ this into a single test, whether (tmp1 | tmp2) is nonzero.
+
+ This test can read more than one byte beyond the end of a string,
+ depending on where the terminating NUL is encountered. However,
+ this is considered safe since the initialization phase ensured
+ that the read will be aligned, therefore, the read will not cross
+ page boundaries and will not cause a fault. */
+
+ while (1)
+ {
+ longword longword1 = *longword_ptr ^ repeated_c;
+ longword longword2 = *longword_ptr;
+
+ if (((((longword1 - repeated_one) & ~longword1)
+ | ((longword2 - repeated_one) & ~longword2))
+ & (repeated_one << 7)) != 0)
+ break;
+ longword_ptr++;
+ }
+
+ char_ptr = (const unsigned char *) longword_ptr;
+
+ /* At this point, we know that one of the sizeof (longword) bytes
+ starting at char_ptr is == 0 or == c. On little-endian machines,
+ we could determine the first such byte without any further memory
+ accesses, just by looking at the tmp result from the last loop
+ iteration. But this does not work on big-endian machines.
+ Choose code that works in both cases. */
+
+ char_ptr = (unsigned char *) longword_ptr;
+ while (*char_ptr && (*char_ptr != c))
+ char_ptr++;
+ return (char *) char_ptr;
+}
diff --git a/lib/strchrnul.valgrind b/lib/strchrnul.valgrind
new file mode 100644
index 0000000..a85608a
--- /dev/null
+++ b/lib/strchrnul.valgrind
@@ -0,0 +1,28 @@
+# Suppress a valgrind message about use of uninitialized memory in strchrnul().
+
+# Copyright (C) 2008-2020 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 use is OK because it provides only a speedup.
+{
+ strchrnul-value4
+ Memcheck:Value4
+ fun:strchrnul
+}
+{
+ strchrnul-value8
+ Memcheck:Value8
+ fun:strchrnul
+}
diff --git a/lib/strdup.c b/lib/strdup.c
new file mode 100644
index 0000000..4da6007
--- /dev/null
+++ b/lib/strdup.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1991, 1996-1998, 2002-2004, 2006-2007, 2009-2020 Free Software
+ Foundation, Inc.
+
+ This file is part of the GNU C Library.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+/* Get specification. */
+#include <string.h>
+
+#include <stdlib.h>
+
+#undef __strdup
+#ifdef _LIBC
+# undef strdup
+#endif
+
+#ifndef weak_alias
+# define __strdup strdup
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+char *
+__strdup (const char *s)
+{
+ size_t len = strlen (s) + 1;
+ void *new = malloc (len);
+
+ if (new == NULL)
+ return NULL;
+
+ return (char *) memcpy (new, s, len);
+}
+#ifdef libc_hidden_def
+libc_hidden_def (__strdup)
+#endif
+#ifdef weak_alias
+weak_alias (__strdup, strdup)
+#endif
diff --git a/lib/streq.h b/lib/streq.h
new file mode 100644
index 0000000..586f051
--- /dev/null
+++ b/lib/streq.h
@@ -0,0 +1,176 @@
+/* Optimized string comparison.
+ Copyright (C) 2001-2002, 2007, 2009-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>. */
+
+#ifndef _GL_STREQ_H
+#define _GL_STREQ_H
+
+#include <string.h>
+
+/* STREQ_OPT allows to optimize string comparison with a small literal string.
+ STREQ_OPT (s, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ is semantically equivalent to
+ strcmp (s, "EUC-KR") == 0
+ just faster. */
+
+/* Help GCC to generate good code for string comparisons with
+ immediate strings. */
+#if (defined __GNUC__ || defined __clang__) && defined __OPTIMIZE__
+
+static inline int
+streq9 (const char *s1, const char *s2)
+{
+ return strcmp (s1 + 9, s2 + 9) == 0;
+}
+
+static inline int
+streq8 (const char *s1, const char *s2, char s28)
+{
+ if (s1[8] == s28)
+ {
+ if (s28 == 0)
+ return 1;
+ else
+ return streq9 (s1, s2);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq7 (const char *s1, const char *s2, char s27, char s28)
+{
+ if (s1[7] == s27)
+ {
+ if (s27 == 0)
+ return 1;
+ else
+ return streq8 (s1, s2, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq6 (const char *s1, const char *s2, char s26, char s27, char s28)
+{
+ if (s1[6] == s26)
+ {
+ if (s26 == 0)
+ return 1;
+ else
+ return streq7 (s1, s2, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq5 (const char *s1, const char *s2, char s25, char s26, char s27, char s28)
+{
+ if (s1[5] == s25)
+ {
+ if (s25 == 0)
+ return 1;
+ else
+ return streq6 (s1, s2, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq4 (const char *s1, const char *s2, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[4] == s24)
+ {
+ if (s24 == 0)
+ return 1;
+ else
+ return streq5 (s1, s2, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq3 (const char *s1, const char *s2, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[3] == s23)
+ {
+ if (s23 == 0)
+ return 1;
+ else
+ return streq4 (s1, s2, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq2 (const char *s1, const char *s2, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[2] == s22)
+ {
+ if (s22 == 0)
+ return 1;
+ else
+ return streq3 (s1, s2, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq1 (const char *s1, const char *s2, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[1] == s21)
+ {
+ if (s21 == 0)
+ return 1;
+ else
+ return streq2 (s1, s2, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+static inline int
+streq0 (const char *s1, const char *s2, char s20, char s21, char s22, char s23, char s24, char s25, char s26, char s27, char s28)
+{
+ if (s1[0] == s20)
+ {
+ if (s20 == 0)
+ return 1;
+ else
+ return streq1 (s1, s2, s21, s22, s23, s24, s25, s26, s27, s28);
+ }
+ else
+ return 0;
+}
+
+#define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ streq0 (s1, s2, s20, s21, s22, s23, s24, s25, s26, s27, s28)
+
+#else
+
+#define STREQ_OPT(s1,s2,s20,s21,s22,s23,s24,s25,s26,s27,s28) \
+ (strcmp (s1, s2) == 0)
+
+#endif
+
+#endif /* _GL_STREQ_H */
diff --git a/lib/strerror-override.c b/lib/strerror-override.c
new file mode 100644
index 0000000..61b7689
--- /dev/null
+++ b/lib/strerror-override.c
@@ -0,0 +1,302 @@
+/* strerror-override.c --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+#include "strerror-override.h"
+
+#include <errno.h>
+
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+# if HAVE_WINSOCK2_H
+# include <winsock2.h>
+# endif
+#endif
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+ describing the error. Otherwise return NULL. */
+const char *
+strerror_override (int errnum)
+{
+ /* These error messages are taken from glibc/sysdeps/gnu/errlist.c. */
+ switch (errnum)
+ {
+#if REPLACE_STRERROR_0
+ case 0:
+ return "Success";
+#endif
+
+#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
+ case EINPROGRESS:
+ return "Operation now in progress";
+ case EALREADY:
+ return "Operation already in progress";
+ case ENOTSOCK:
+ return "Socket operation on non-socket";
+ case EDESTADDRREQ:
+ return "Destination address required";
+ case EMSGSIZE:
+ return "Message too long";
+ case EPROTOTYPE:
+ return "Protocol wrong type for socket";
+ case ENOPROTOOPT:
+ return "Protocol not available";
+ case EPROTONOSUPPORT:
+ return "Protocol not supported";
+ case EOPNOTSUPP:
+ return "Operation not supported";
+ case EAFNOSUPPORT:
+ return "Address family not supported by protocol";
+ case EADDRINUSE:
+ return "Address already in use";
+ case EADDRNOTAVAIL:
+ return "Cannot assign requested address";
+ case ENETDOWN:
+ return "Network is down";
+ case ENETUNREACH:
+ return "Network is unreachable";
+ case ECONNRESET:
+ return "Connection reset by peer";
+ case ENOBUFS:
+ return "No buffer space available";
+ case EISCONN:
+ return "Transport endpoint is already connected";
+ case ENOTCONN:
+ return "Transport endpoint is not connected";
+ case ETIMEDOUT:
+ return "Connection timed out";
+ case ECONNREFUSED:
+ return "Connection refused";
+ case ELOOP:
+ return "Too many levels of symbolic links";
+ case EHOSTUNREACH:
+ return "No route to host";
+ case EWOULDBLOCK:
+ return "Operation would block";
+#endif
+#if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
+ case ETXTBSY:
+ return "Text file busy";
+ case ENODATA:
+ return "No data available";
+ case ENOSR:
+ return "Out of streams resources";
+ case ENOSTR:
+ return "Device not a stream";
+ case ETIME:
+ return "Timer expired";
+ case EOTHER:
+ return "Other error";
+#endif
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+ case ESOCKTNOSUPPORT:
+ return "Socket type not supported";
+ case EPFNOSUPPORT:
+ return "Protocol family not supported";
+ case ESHUTDOWN:
+ return "Cannot send after transport endpoint shutdown";
+ case ETOOMANYREFS:
+ return "Too many references: cannot splice";
+ case EHOSTDOWN:
+ return "Host is down";
+ case EPROCLIM:
+ return "Too many processes";
+ case EUSERS:
+ return "Too many users";
+ case EDQUOT:
+ return "Disk quota exceeded";
+ case ESTALE:
+ return "Stale NFS file handle";
+ case EREMOTE:
+ return "Object is remote";
+# if HAVE_WINSOCK2_H
+ /* WSA_INVALID_HANDLE maps to EBADF */
+ /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
+ /* WSA_INVALID_PARAMETER maps to EINVAL */
+ case WSA_OPERATION_ABORTED:
+ return "Overlapped operation aborted";
+ case WSA_IO_INCOMPLETE:
+ return "Overlapped I/O event object not in signaled state";
+ case WSA_IO_PENDING:
+ return "Overlapped operations will complete later";
+ /* WSAEINTR maps to EINTR */
+ /* WSAEBADF maps to EBADF */
+ /* WSAEACCES maps to EACCES */
+ /* WSAEFAULT maps to EFAULT */
+ /* WSAEINVAL maps to EINVAL */
+ /* WSAEMFILE maps to EMFILE */
+ /* WSAEWOULDBLOCK maps to EWOULDBLOCK */
+ /* WSAEINPROGRESS maps to EINPROGRESS */
+ /* WSAEALREADY maps to EALREADY */
+ /* WSAENOTSOCK maps to ENOTSOCK */
+ /* WSAEDESTADDRREQ maps to EDESTADDRREQ */
+ /* WSAEMSGSIZE maps to EMSGSIZE */
+ /* WSAEPROTOTYPE maps to EPROTOTYPE */
+ /* WSAENOPROTOOPT maps to ENOPROTOOPT */
+ /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */
+ /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
+ /* WSAEOPNOTSUPP maps to EOPNOTSUPP */
+ /* WSAEPFNOSUPPORT is EPFNOSUPPORT */
+ /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */
+ /* WSAEADDRINUSE maps to EADDRINUSE */
+ /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */
+ /* WSAENETDOWN maps to ENETDOWN */
+ /* WSAENETUNREACH maps to ENETUNREACH */
+ /* WSAENETRESET maps to ENETRESET */
+ /* WSAECONNABORTED maps to ECONNABORTED */
+ /* WSAECONNRESET maps to ECONNRESET */
+ /* WSAENOBUFS maps to ENOBUFS */
+ /* WSAEISCONN maps to EISCONN */
+ /* WSAENOTCONN maps to ENOTCONN */
+ /* WSAESHUTDOWN is ESHUTDOWN */
+ /* WSAETOOMANYREFS is ETOOMANYREFS */
+ /* WSAETIMEDOUT maps to ETIMEDOUT */
+ /* WSAECONNREFUSED maps to ECONNREFUSED */
+ /* WSAELOOP maps to ELOOP */
+ /* WSAENAMETOOLONG maps to ENAMETOOLONG */
+ /* WSAEHOSTDOWN is EHOSTDOWN */
+ /* WSAEHOSTUNREACH maps to EHOSTUNREACH */
+ /* WSAENOTEMPTY maps to ENOTEMPTY */
+ /* WSAEPROCLIM is EPROCLIM */
+ /* WSAEUSERS is EUSERS */
+ /* WSAEDQUOT is EDQUOT */
+ /* WSAESTALE is ESTALE */
+ /* WSAEREMOTE is EREMOTE */
+ case WSASYSNOTREADY:
+ return "Network subsystem is unavailable";
+ case WSAVERNOTSUPPORTED:
+ return "Winsock.dll version out of range";
+ case WSANOTINITIALISED:
+ return "Successful WSAStartup not yet performed";
+ case WSAEDISCON:
+ return "Graceful shutdown in progress";
+ case WSAENOMORE: case WSA_E_NO_MORE:
+ return "No more results";
+ case WSAECANCELLED: case WSA_E_CANCELLED:
+ return "Call was canceled";
+ case WSAEINVALIDPROCTABLE:
+ return "Procedure call table is invalid";
+ case WSAEINVALIDPROVIDER:
+ return "Service provider is invalid";
+ case WSAEPROVIDERFAILEDINIT:
+ return "Service provider failed to initialize";
+ case WSASYSCALLFAILURE:
+ return "System call failure";
+ case WSASERVICE_NOT_FOUND:
+ return "Service not found";
+ case WSATYPE_NOT_FOUND:
+ return "Class type not found";
+ case WSAEREFUSED:
+ return "Database query was refused";
+ case WSAHOST_NOT_FOUND:
+ return "Host not found";
+ case WSATRY_AGAIN:
+ return "Nonauthoritative host not found";
+ case WSANO_RECOVERY:
+ return "Nonrecoverable error";
+ case WSANO_DATA:
+ return "Valid name, no data record of requested type";
+ /* WSA_QOS_* omitted */
+# endif
+#endif
+
+#if GNULIB_defined_ENOMSG
+ case ENOMSG:
+ return "No message of desired type";
+#endif
+
+#if GNULIB_defined_EIDRM
+ case EIDRM:
+ return "Identifier removed";
+#endif
+
+#if GNULIB_defined_ENOLINK
+ case ENOLINK:
+ return "Link has been severed";
+#endif
+
+#if GNULIB_defined_EPROTO
+ case EPROTO:
+ return "Protocol error";
+#endif
+
+#if GNULIB_defined_EMULTIHOP
+ case EMULTIHOP:
+ return "Multihop attempted";
+#endif
+
+#if GNULIB_defined_EBADMSG
+ case EBADMSG:
+ return "Bad message";
+#endif
+
+#if GNULIB_defined_EOVERFLOW
+ case EOVERFLOW:
+ return "Value too large for defined data type";
+#endif
+
+#if GNULIB_defined_ENOTSUP
+ case ENOTSUP:
+ return "Not supported";
+#endif
+
+#if GNULIB_defined_ENETRESET
+ case ENETRESET:
+ return "Network dropped connection on reset";
+#endif
+
+#if GNULIB_defined_ECONNABORTED
+ case ECONNABORTED:
+ return "Software caused connection abort";
+#endif
+
+#if GNULIB_defined_ESTALE
+ case ESTALE:
+ return "Stale NFS file handle";
+#endif
+
+#if GNULIB_defined_EDQUOT
+ case EDQUOT:
+ return "Disk quota exceeded";
+#endif
+
+#if GNULIB_defined_ECANCELED
+ case ECANCELED:
+ return "Operation canceled";
+#endif
+
+#if GNULIB_defined_EOWNERDEAD
+ case EOWNERDEAD:
+ return "Owner died";
+#endif
+
+#if GNULIB_defined_ENOTRECOVERABLE
+ case ENOTRECOVERABLE:
+ return "State not recoverable";
+#endif
+
+#if GNULIB_defined_EILSEQ
+ case EILSEQ:
+ return "Invalid or incomplete multibyte or wide character";
+#endif
+
+ default:
+ return NULL;
+ }
+}
diff --git a/lib/strerror-override.h b/lib/strerror-override.h
new file mode 100644
index 0000000..062f51c
--- /dev/null
+++ b/lib/strerror-override.h
@@ -0,0 +1,56 @@
+/* strerror-override.h --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2020 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/>. */
+
+#ifndef _GL_STRERROR_OVERRIDE_H
+# define _GL_STRERROR_OVERRIDE_H
+
+# include <errno.h>
+# include <stddef.h>
+
+/* Reasonable buffer size that should never trigger ERANGE; if this
+ proves too small, we intentionally abort(), to remind us to fix
+ this value. */
+# define STACKBUF_LEN 256
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+ describing the error. Otherwise return NULL. */
+# if REPLACE_STRERROR_0 \
+ || GNULIB_defined_ESOCK \
+ || GNULIB_defined_ESTREAMS \
+ || GNULIB_defined_EWINSOCK \
+ || GNULIB_defined_ENOMSG \
+ || GNULIB_defined_EIDRM \
+ || GNULIB_defined_ENOLINK \
+ || GNULIB_defined_EPROTO \
+ || GNULIB_defined_EMULTIHOP \
+ || GNULIB_defined_EBADMSG \
+ || GNULIB_defined_EOVERFLOW \
+ || GNULIB_defined_ENOTSUP \
+ || GNULIB_defined_ENETRESET \
+ || GNULIB_defined_ECONNABORTED \
+ || GNULIB_defined_ESTALE \
+ || GNULIB_defined_EDQUOT \
+ || GNULIB_defined_ECANCELED \
+ || GNULIB_defined_EOWNERDEAD \
+ || GNULIB_defined_ENOTRECOVERABLE \
+ || GNULIB_defined_EILSEQ
+extern const char *strerror_override (int errnum) _GL_ATTRIBUTE_CONST;
+# else
+# define strerror_override(ignored) NULL
+# endif
+
+#endif /* _GL_STRERROR_OVERRIDE_H */
diff --git a/lib/strerror.c b/lib/strerror.c
new file mode 100644
index 0000000..1a53a8b
--- /dev/null
+++ b/lib/strerror.c
@@ -0,0 +1,71 @@
+/* strerror.c --- POSIX compatible system error routine
+
+ Copyright (C) 2007-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+#include "strerror-override.h"
+#include "verify.h"
+
+/* Use the system functions, not the gnulib overrides in this file. */
+#undef sprintf
+
+char *
+strerror (int n)
+#undef strerror
+{
+ static char buf[STACKBUF_LEN];
+ size_t len;
+
+ /* Cast away const, due to the historical signature of strerror;
+ callers should not be modifying the string. */
+ const char *msg = strerror_override (n);
+ if (msg)
+ return (char *) msg;
+
+ msg = strerror (n);
+
+ /* Our strerror_r implementation might use the system's strerror
+ buffer, so all other clients of strerror have to see the error
+ copied into a buffer that we manage. This is not thread-safe,
+ even if the system strerror is, but portable programs shouldn't
+ be using strerror if they care about thread-safety. */
+ if (!msg || !*msg)
+ {
+ static char const fmt[] = "Unknown error %d";
+ verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
+ sprintf (buf, fmt, n);
+ errno = EINVAL;
+ return buf;
+ }
+
+ /* Fix STACKBUF_LEN if this ever aborts. */
+ len = strlen (msg);
+ if (sizeof buf <= len)
+ abort ();
+
+ memcpy (buf, msg, len + 1);
+ return buf;
+}
diff --git a/lib/strerror_r.c b/lib/strerror_r.c
new file mode 100644
index 0000000..3044599
--- /dev/null
+++ b/lib/strerror_r.c
@@ -0,0 +1,452 @@
+/* strerror_r.c --- POSIX compatible system error routine
+
+ Copyright (C) 2010-2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010. */
+
+#include <config.h>
+
+/* Enable declaration of sys_nerr and sys_errlist in <errno.h> on NetBSD. */
+#define _NETBSD_SOURCE 1
+
+/* Specification. */
+#include <string.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#if !HAVE_SNPRINTF
+# include <stdarg.h>
+#endif
+
+#include "strerror-override.h"
+
+#if (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__) && HAVE___XPG_STRERROR_R /* glibc >= 2.3.4, cygwin >= 1.7.9 */
+
+# define USE_XPG_STRERROR_R 1
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int __xpg_strerror_r (int errnum, char *buf, size_t buflen);
+
+#elif HAVE_DECL_STRERROR_R && !(__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__)
+
+/* The system's strerror_r function is OK, except that its third argument
+ is 'int', not 'size_t', or its return type is wrong. */
+
+# include <limits.h>
+
+# define USE_SYSTEM_STRERROR_R 1
+
+#else /* (__GLIBC__ >= 2 || defined __UCLIBC__ || defined __CYGWIN__ ? !HAVE___XPG_STRERROR_R : !HAVE_DECL_STRERROR_R) */
+
+/* Use the system's strerror(). Exclude glibc and cygwin because the
+ system strerror_r has the wrong return type, and cygwin 1.7.9
+ strerror_r clobbers strerror. */
+# undef strerror
+
+# define USE_SYSTEM_STRERROR 1
+
+# if defined __NetBSD__ || defined __hpux || (defined _WIN32 && !defined __CYGWIN__) || defined __sgi || (defined __sun && !defined _LP64) || defined __CYGWIN__
+
+/* No locking needed. */
+
+/* Get catgets internationalization functions. */
+# if HAVE_CATGETS
+# include <nl_types.h>
+# endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Get sys_nerr, sys_errlist on HP-UX (otherwise only declared in C++ mode).
+ Get sys_nerr, sys_errlist on IRIX (otherwise only declared with _SGIAPI). */
+# if defined __hpux || defined __sgi
+extern int sys_nerr;
+extern char *sys_errlist[];
+# endif
+
+/* Get sys_nerr on Solaris. */
+# if defined __sun && !defined _LP64
+extern int sys_nerr;
+# endif
+
+#ifdef __cplusplus
+}
+#endif
+
+# else
+
+# include "glthread/lock.h"
+
+/* This lock protects the buffer returned by strerror(). We assume that
+ no other uses of strerror() exist in the program. */
+gl_lock_define_initialized(static, strerror_lock)
+
+# endif
+
+#endif
+
+/* On MSVC, there is no snprintf() function, just a _snprintf().
+ It is of lower quality, but sufficient for the simple use here.
+ We only have to make sure to NUL terminate the result (_snprintf
+ does not NUL terminate, like strncpy). */
+#if !HAVE_SNPRINTF
+static int
+local_snprintf (char *buf, size_t buflen, const char *format, ...)
+{
+ va_list args;
+ int result;
+
+ va_start (args, format);
+ result = _vsnprintf (buf, buflen, format, args);
+ va_end (args);
+ if (buflen > 0 && (result < 0 || result >= buflen))
+ buf[buflen - 1] = '\0';
+ return result;
+}
+# undef snprintf
+# define snprintf local_snprintf
+#endif
+
+/* Copy as much of MSG into BUF as possible, without corrupting errno.
+ Return 0 if MSG fit in BUFLEN, otherwise return ERANGE. */
+static int
+safe_copy (char *buf, size_t buflen, const char *msg)
+{
+ size_t len = strlen (msg);
+ size_t moved = len < buflen ? len : buflen - 1;
+
+ /* Although POSIX lets memmove corrupt errno, we don't
+ know of any implementation where this is a real problem. */
+ memmove (buf, msg, moved);
+ buf[moved] = '\0';
+ return len < buflen ? 0 : ERANGE;
+}
+
+
+int
+strerror_r (int errnum, char *buf, size_t buflen)
+#undef strerror_r
+{
+ /* Filter this out now, so that rest of this replacement knows that
+ there is room for a non-empty message and trailing NUL. */
+ if (buflen <= 1)
+ {
+ if (buflen)
+ *buf = '\0';
+ return ERANGE;
+ }
+ *buf = '\0';
+
+ /* Check for gnulib overrides. */
+ {
+ char const *msg = strerror_override (errnum);
+
+ if (msg)
+ return safe_copy (buf, buflen, msg);
+ }
+
+ {
+ int ret;
+ int saved_errno = errno;
+
+#if USE_XPG_STRERROR_R
+
+ {
+ ret = __xpg_strerror_r (errnum, buf, buflen);
+ if (ret < 0)
+ ret = errno;
+ if (!*buf)
+ {
+ /* glibc 2.13 would not touch buf on err, so we have to fall
+ back to GNU strerror_r which always returns a thread-safe
+ untruncated string to (partially) copy into our buf. */
+ safe_copy (buf, buflen, strerror_r (errnum, buf, buflen));
+ }
+ }
+
+#elif USE_SYSTEM_STRERROR_R
+
+ if (buflen > INT_MAX)
+ buflen = INT_MAX;
+
+# ifdef __hpux
+ /* On HP-UX 11.31, strerror_r always fails when buflen < 80; it
+ also fails to change buf on EINVAL. */
+ {
+ char stackbuf[80];
+
+ if (buflen < sizeof stackbuf)
+ {
+ ret = strerror_r (errnum, stackbuf, sizeof stackbuf);
+ if (ret == 0)
+ ret = safe_copy (buf, buflen, stackbuf);
+ }
+ else
+ ret = strerror_r (errnum, buf, buflen);
+ }
+# else
+ ret = strerror_r (errnum, buf, buflen);
+
+ /* Some old implementations may return (-1, EINVAL) instead of EINVAL.
+ But on Haiku, valid error numbers are negative. */
+# if !defined __HAIKU__
+ if (ret < 0)
+ ret = errno;
+# endif
+# endif
+
+# if defined _AIX || defined __HAIKU__
+ /* AIX and Haiku return 0 rather than ERANGE when truncating strings; try
+ again until we are sure we got the entire string. */
+ if (!ret && strlen (buf) == buflen - 1)
+ {
+ char stackbuf[STACKBUF_LEN];
+ size_t len;
+ strerror_r (errnum, stackbuf, sizeof stackbuf);
+ len = strlen (stackbuf);
+ /* STACKBUF_LEN should have been large enough. */
+ if (len + 1 == sizeof stackbuf)
+ abort ();
+ if (buflen <= len)
+ ret = ERANGE;
+ }
+# else
+ /* Solaris 10 does not populate buf on ERANGE. OpenBSD 4.7
+ truncates early on ERANGE rather than return a partial integer.
+ We prefer the maximal string. We set buf[0] earlier, and we
+ know of no implementation that modifies buf to be an
+ unterminated string, so this strlen should be portable in
+ practice (rather than pulling in a safer strnlen). */
+ if (ret == ERANGE && strlen (buf) < buflen - 1)
+ {
+ char stackbuf[STACKBUF_LEN];
+
+ /* STACKBUF_LEN should have been large enough. */
+ if (strerror_r (errnum, stackbuf, sizeof stackbuf) == ERANGE)
+ abort ();
+ safe_copy (buf, buflen, stackbuf);
+ }
+# endif
+
+#else /* USE_SYSTEM_STRERROR */
+
+ /* Try to do what strerror (errnum) does, but without clobbering the
+ buffer used by strerror(). */
+
+# if defined __NetBSD__ || defined __hpux || (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ /* NetBSD, HP-UX, native Windows, Cygwin */
+
+ /* NetBSD: sys_nerr, sys_errlist are declared through _NETBSD_SOURCE
+ and <errno.h> above.
+ HP-UX: sys_nerr, sys_errlist are declared explicitly above.
+ native Windows: sys_nerr, sys_errlist are declared in <stdlib.h>.
+ Cygwin: sys_nerr, sys_errlist are declared in <errno.h>. */
+ if (errnum >= 0 && errnum < sys_nerr)
+ {
+# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux)
+# if defined __NetBSD__
+ nl_catd catd = catopen ("libc", NL_CAT_LOCALE);
+ const char *errmsg =
+ (catd != (nl_catd)-1
+ ? catgets (catd, 1, errnum, sys_errlist[errnum])
+ : sys_errlist[errnum]);
+# endif
+# if defined __hpux
+ nl_catd catd = catopen ("perror", NL_CAT_LOCALE);
+ const char *errmsg =
+ (catd != (nl_catd)-1
+ ? catgets (catd, 1, 1 + errnum, sys_errlist[errnum])
+ : sys_errlist[errnum]);
+# endif
+# else
+ const char *errmsg = sys_errlist[errnum];
+# endif
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+# if HAVE_CATGETS && (defined __NetBSD__ || defined __hpux)
+ if (catd != (nl_catd)-1)
+ catclose (catd);
+# endif
+ }
+ else
+ ret = EINVAL;
+
+# elif defined __sgi || (defined __sun && !defined _LP64) /* IRIX, Solaris <= 9 32-bit */
+
+ /* For a valid error number, the system's strerror() function returns
+ a pointer to a not copied string, not to a buffer. */
+ if (errnum >= 0 && errnum < sys_nerr)
+ {
+ char *errmsg = strerror (errnum);
+
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+ }
+ else
+ ret = EINVAL;
+
+# else
+
+ gl_lock_lock (strerror_lock);
+
+ {
+ char *errmsg = strerror (errnum);
+
+ /* For invalid error numbers, strerror() on
+ - IRIX 6.5 returns NULL,
+ - HP-UX 11 returns an empty string. */
+ if (errmsg == NULL || *errmsg == '\0')
+ ret = EINVAL;
+ else
+ ret = safe_copy (buf, buflen, errmsg);
+ }
+
+ gl_lock_unlock (strerror_lock);
+
+# endif
+
+#endif
+
+#if defined _WIN32 && !defined __CYGWIN__
+ /* MSVC 14 defines names for many error codes in the range 100..140,
+ but _sys_errlist contains strings only for the error codes
+ < _sys_nerr = 43. */
+ if (ret == EINVAL)
+ {
+ const char *errmsg;
+
+ switch (errnum)
+ {
+ case 100 /* EADDRINUSE */:
+ errmsg = "Address already in use";
+ break;
+ case 101 /* EADDRNOTAVAIL */:
+ errmsg = "Cannot assign requested address";
+ break;
+ case 102 /* EAFNOSUPPORT */:
+ errmsg = "Address family not supported by protocol";
+ break;
+ case 103 /* EALREADY */:
+ errmsg = "Operation already in progress";
+ break;
+ case 105 /* ECANCELED */:
+ errmsg = "Operation canceled";
+ break;
+ case 106 /* ECONNABORTED */:
+ errmsg = "Software caused connection abort";
+ break;
+ case 107 /* ECONNREFUSED */:
+ errmsg = "Connection refused";
+ break;
+ case 108 /* ECONNRESET */:
+ errmsg = "Connection reset by peer";
+ break;
+ case 109 /* EDESTADDRREQ */:
+ errmsg = "Destination address required";
+ break;
+ case 110 /* EHOSTUNREACH */:
+ errmsg = "No route to host";
+ break;
+ case 112 /* EINPROGRESS */:
+ errmsg = "Operation now in progress";
+ break;
+ case 113 /* EISCONN */:
+ errmsg = "Transport endpoint is already connected";
+ break;
+ case 114 /* ELOOP */:
+ errmsg = "Too many levels of symbolic links";
+ break;
+ case 115 /* EMSGSIZE */:
+ errmsg = "Message too long";
+ break;
+ case 116 /* ENETDOWN */:
+ errmsg = "Network is down";
+ break;
+ case 117 /* ENETRESET */:
+ errmsg = "Network dropped connection on reset";
+ break;
+ case 118 /* ENETUNREACH */:
+ errmsg = "Network is unreachable";
+ break;
+ case 119 /* ENOBUFS */:
+ errmsg = "No buffer space available";
+ break;
+ case 123 /* ENOPROTOOPT */:
+ errmsg = "Protocol not available";
+ break;
+ case 126 /* ENOTCONN */:
+ errmsg = "Transport endpoint is not connected";
+ break;
+ case 128 /* ENOTSOCK */:
+ errmsg = "Socket operation on non-socket";
+ break;
+ case 129 /* ENOTSUP */:
+ errmsg = "Not supported";
+ break;
+ case 130 /* EOPNOTSUPP */:
+ errmsg = "Operation not supported";
+ break;
+ case 132 /* EOVERFLOW */:
+ errmsg = "Value too large for defined data type";
+ break;
+ case 133 /* EOWNERDEAD */:
+ errmsg = "Owner died";
+ break;
+ case 134 /* EPROTO */:
+ errmsg = "Protocol error";
+ break;
+ case 135 /* EPROTONOSUPPORT */:
+ errmsg = "Protocol not supported";
+ break;
+ case 136 /* EPROTOTYPE */:
+ errmsg = "Protocol wrong type for socket";
+ break;
+ case 138 /* ETIMEDOUT */:
+ errmsg = "Connection timed out";
+ break;
+ case 140 /* EWOULDBLOCK */:
+ errmsg = "Operation would block";
+ break;
+ default:
+ errmsg = NULL;
+ break;
+ }
+ if (errmsg != NULL)
+ ret = safe_copy (buf, buflen, errmsg);
+ }
+#endif
+
+ if (ret == EINVAL && !*buf)
+ {
+#if defined __HAIKU__
+ /* For consistency with perror(). */
+ snprintf (buf, buflen, "Unknown Application Error (%d)", errnum);
+#else
+ snprintf (buf, buflen, "Unknown error %d", errnum);
+#endif
+ }
+
+ errno = saved_errno;
+ return ret;
+ }
+}
diff --git a/lib/string.in.h b/lib/string.in.h
new file mode 100644
index 0000000..ba2c1fd
--- /dev/null
+++ b/lib/string.in.h
@@ -0,0 +1,1173 @@
+/* A GNU-like <string.h>.
+
+ Copyright (C) 1995-1996, 2001-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_STRING_H
+/* Special invocation convention:
+ - On OS X/NetBSD we have a sequence of nested includes
+ <string.h> -> <strings.h> -> "string.h"
+ In this situation system _chk variants due to -D_FORTIFY_SOURCE
+ might be used after any replacements defined here. */
+
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+
+#define _GL_ALREADY_INCLUDING_STRING_H
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#undef _GL_ALREADY_INCLUDING_STRING_H
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+#define _@GUARD_PREFIX@_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL. */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro. */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>. */
+/* But in any case avoid namespace pollution on glibc systems. */
+#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
+ && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Clear a block of memory. The compiler will not delete a call to
+ this function, even if the block is dead after the call. */
+#if @GNULIB_EXPLICIT_BZERO@
+# if ! @HAVE_EXPLICIT_BZERO@
+_GL_FUNCDECL_SYS (explicit_bzero, void,
+ (void *__dest, size_t __n) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n));
+_GL_CXXALIASWARN (explicit_bzero);
+#elif defined GNULIB_POSIXCHECK
+# undef explicit_bzero
+# if HAVE_RAW_DECL_EXPLICIT_BZERO
+_GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - "
+ "use gnulib module explicit_bzero for portability");
+# endif
+#endif
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSL@
+# if !@HAVE_FFSL@
+_GL_FUNCDECL_SYS (ffsl, int, (long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsl, int, (long int i));
+_GL_CXXALIASWARN (ffsl);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsl
+# if HAVE_RAW_DECL_FFSL
+_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
+# endif
+#endif
+
+
+/* Find the index of the least-significant set bit. */
+#if @GNULIB_FFSLL@
+# if !@HAVE_FFSLL@
+_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+_GL_CXXALIASWARN (ffsll);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsll
+# if HAVE_RAW_DECL_FFSLL
+_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_MEMCCPY@
+/* On native Windows, map 'memccpy' to '_memccpy', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::memccpy always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef memccpy
+# define memccpy _memccpy
+# endif
+_GL_CXXALIAS_MDA (memccpy, void *,
+ (void *dest, const void *src, int c, size_t n));
+# else
+_GL_CXXALIAS_SYS (memccpy, void *,
+ (void *dest, const void *src, int c, size_t n));
+# endif
+_GL_CXXALIASWARN (memccpy);
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL. */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef memchr
+# define memchr rpl_memchr
+# endif
+_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
+# else
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const void * std::memchr (const void *, int, size_t); }
+ extern "C++" { void * std::memchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memchr,
+ void *, (void const *__s, int __c, size_t __n),
+ void const *, (void const *__s, int __c, size_t __n));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
+_GL_CXXALIASWARN1 (memchr, void const *,
+ (void const *__s, int __c, size_t __n));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (memchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared. */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+ "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define memmem rpl_memmem
+# endif
+_GL_FUNCDECL_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# else
+# if ! @HAVE_DECL_MEMMEM@
+_GL_FUNCDECL_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (memmem, void *,
+ (void const *__haystack, size_t __haystack_len,
+ void const *__needle, size_t __needle_len));
+# endif
+_GL_CXXALIASWARN (memmem);
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+ "use gnulib module memmem-simple for portability, "
+ "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+ last written byte. */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+_GL_FUNCDECL_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mempcpy, void *,
+ (void *restrict __dest, void const *restrict __src,
+ size_t __n));
+_GL_CXXALIASWARN (mempcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+ "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int). */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::memrchr (const void *, int, size_t); }
+ extern "C++" { void * std::memrchr (void *, int, size_t); } */
+_GL_CXXALIAS_SYS_CAST2 (memrchr,
+ void *, (void const *, int, size_t),
+ void const *, (void const *, int, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
+# else
+_GL_CXXALIASWARN (memrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+ "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S. More efficient than
+ memchr(S,C,N), at the expense of undefined behavior if C does not
+ occur within N bytes. */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const void * std::rawmemchr (const void *, int); }
+ extern "C++" { void * std::rawmemchr (void *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
+ void *, (void const *__s, int __c_in),
+ void const *, (void const *__s, int __c_in));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
+_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (rawmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+ "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+_GL_FUNCDECL_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpcpy, char *,
+ (char *restrict __dst, char const *restrict __src));
+_GL_CXXALIASWARN (stpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+ "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+ last non-NUL byte written into DST. */
+#if @GNULIB_STPNCPY@
+# if @REPLACE_STPNCPY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef stpncpy
+# define stpncpy rpl_stpncpy
+# endif
+_GL_FUNCDECL_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# else
+# if ! @HAVE_STPNCPY@
+_GL_FUNCDECL_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpncpy, char *,
+ (char *restrict __dst, char const *restrict __src,
+ size_t __n));
+# endif
+_GL_CXXALIASWARN (stpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+ "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strchr
+/* Assume strchr is always declared. */
+_GL_WARN_ON_USE_CXX (strchr,
+ const char *, char *, (const char *, int),
+ "strchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte. */
+#if @GNULIB_STRCHRNUL@
+# if @REPLACE_STRCHRNUL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strchrnul rpl_strchrnul
+# endif
+_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strchrnul, char *,
+ (const char *str, int ch));
+# else
+# if ! @HAVE_STRCHRNUL@
+_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * std::strchrnul (const char *, int); }
+ extern "C++" { char * std::strchrnul (char *, int); } */
+_GL_CXXALIAS_SYS_CAST2 (strchrnul,
+ char *, (char const *__s, int __c_in),
+ char const *, (char const *__s, int __c_in));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
+_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (strchrnul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+ "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup rpl_strdup
+# endif
+_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup _strdup
+# endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+ /* strdup exists as a function and as a macro. Get rid of the macro. */
+# undef strdup
+# endif
+# if !(@HAVE_DECL_STRDUP@ || defined strdup)
+_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+ "use gnulib module strdup for portability");
+# endif
+#elif @GNULIB_MDA_STRDUP@
+/* On native Windows, map 'creat' to '_creat', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::creat always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strdup
+# define strdup _strdup
+# endif
+_GL_CXXALIAS_MDA (strdup, char *, (char const *__s));
+# else
+# if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+# undef strdup
+# endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#endif
+
+/* Append no more than N characters from SRC onto DEST. */
+#if @GNULIB_STRNCAT@
+# if @REPLACE_STRNCAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strncat
+# define strncat rpl_strncat
+# endif
+_GL_FUNCDECL_RPL (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n));
+# else
+_GL_CXXALIAS_SYS (strncat, char *,
+ (char *restrict dest, const char *restrict src, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strncat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strncat
+# if HAVE_RAW_DECL_STRNCAT
+_GL_WARN_ON_USE (strncat, "strncat is unportable - "
+ "use gnulib module strncat for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING. */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strndup
+# define strndup rpl_strndup
+# endif
+_GL_FUNCDECL_RPL (strndup, char *, (char const *__s, size_t __n)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
+# else
+# if ! @HAVE_DECL_STRNDUP@
+_GL_FUNCDECL_SYS (strndup, char *, (char const *__s, size_t __n)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
+# endif
+_GL_CXXALIASWARN (strndup);
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+ "use gnulib module strndup for portability");
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+ MAXLEN bytes. If no '\0' terminator is found in that many bytes,
+ return MAXLEN. */
+#if @GNULIB_STRNLEN@
+# if @REPLACE_STRNLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strnlen
+# define strnlen rpl_strnlen
+# endif
+_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
+# else
+# if ! @HAVE_DECL_STRNLEN@
+_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
+# endif
+_GL_CXXALIASWARN (strnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+ "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strcspn
+/* Assume strcspn is always declared. */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C" { const char * strpbrk (const char *, const char *); }
+ extern "C++" { char * strpbrk (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strpbrk,
+ char *, (char const *__s, char const *__accept),
+ const char *, (char const *__s, char const *__accept));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+ (char const *__s, char const *__accept));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strpbrk);
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it does not work with multibyte strings if the
+ locale encoding is GB18030 and one of the characters to be searched is a
+ digit. */
+# undef strpbrk
+_GL_WARN_ON_USE_CXX (strpbrk,
+ const char *, char *, (const char *, const char *),
+ "strpbrk cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE_CXX (strpbrk,
+ const char *, char *, (const char *, const char *),
+ "strpbrk is unportable - "
+ "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+ Even in this simple case, it cannot work with multibyte strings. */
+# undef strspn
+/* Assume strspn is always declared. */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+ GB18030 and the character to be searched is a digit. */
+# undef strrchr
+/* Assume strrchr is always declared. */
+_GL_WARN_ON_USE_CXX (strrchr,
+ const char *, char *, (const char *, int),
+ "strrchr cannot work correctly on character strings "
+ "in some multibyte locales - "
+ "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP
+ to point to the next char after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of strtok() that is multithread-safe and supports
+ empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strtok_r(). */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+_GL_FUNCDECL_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strsep, char *,
+ (char **restrict __stringp, char const *restrict __delim));
+_GL_CXXALIASWARN (strsep);
+# if defined GNULIB_POSIXCHECK
+# undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+ "in multibyte locales - "
+ "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+ "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strstr rpl_strstr
+# endif
+_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
+# else
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strstr (const char *, const char *); }
+ extern "C++" { char * strstr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strstr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strstr, const char *,
+ (const char *haystack, const char *needle));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+ different from UTF-8:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strstr
+/* Assume strstr is always declared. */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+ "work correctly on character strings in most "
+ "multibyte locales - "
+ "use mbsstr if you care about internationalization, "
+ "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+ comparison. */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strcasestr rpl_strcasestr
+# endif
+_GL_FUNCDECL_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strcasestr, char *,
+ (const char *haystack, const char *needle));
+# else
+# if ! @HAVE_STRCASESTR@
+_GL_FUNCDECL_SYS (strcasestr, char *,
+ (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" { const char * strcasestr (const char *, const char *); }
+ extern "C++" { char * strcasestr (char *, const char *); } */
+_GL_CXXALIAS_SYS_CAST2 (strcasestr,
+ char *, (const char *haystack, const char *needle),
+ const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+ (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strcasestr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+ It is a glibc extension, and glibc implements it only for unibyte
+ locales. */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasestr if you care about "
+ "internationalization, or use c-strcasestr if you want "
+ "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ This is a variant of strtok() that is multithread-safe.
+
+ For the POSIX documentation for this function, see:
+ https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+ Caveat: It doesn't work with multibyte strings unless all of the delimiter
+ characters are ASCII characters < 0x30.
+
+ See also strsep(). */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strtok_r
+# define strtok_r rpl_strtok_r
+# endif
+_GL_FUNCDECL_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# else
+# if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+# undef strtok_r
+# endif
+# if ! @HAVE_DECL_STRTOK_R@
+_GL_FUNCDECL_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (strtok_r, char *,
+ (char *restrict s, char const *restrict delim,
+ char **restrict save_ptr));
+# endif
+_GL_CXXALIASWARN (strtok_r);
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+ "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX. They are gnulib
+ extensions. */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+ This considers multibyte characters, unlike strlen, which counts bytes. */
+# ifdef __MirBSD__ /* MirBSD defines mbslen as a macro. Override it. */
+# undef mbslen
+# endif
+# if @HAVE_MBSLEN@ /* AIX, OSF/1, MirBSD define mbslen already in libc. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbslen rpl_mbslen
+# endif
+_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
+# else
+_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
+# endif
+_GL_CXXALIASWARN (mbslen);
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+ at STRING and ending at STRING + LEN. */
+_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbschr);
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+ and return a pointer to it. Return NULL if C is not found in STRING.
+ Unlike strrchr(), this function works correctly in multibyte locales with
+ encodings such as GB18030. */
+# if defined __hpux || defined __INTERIX
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbsrchr rpl_mbsrchr /* avoid collision with system function */
+# endif
+_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbsrchr);
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK. Return NULL if NEEDLE is not found in HAYSTACK.
+ Unlike strstr(), this function works correctly in multibyte locales with
+ encodings different from UTF-8. */
+_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+ equal to or greater than zero if S1 is lexicographically less than, equal to
+ or greater than S2.
+ Note: This function may, in multibyte locales, return 0 for strings of
+ different lengths!
+ Unlike strcasecmp(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+ N characters with the initial segment of the character string S2 consisting
+ of at most N characters, ignoring case, returning less than, equal to or
+ greater than zero if the initial segment of S1 is lexicographically less
+ than, equal to or greater than the initial segment of S2.
+ Note: This function may, in multibyte locales, return 0 for initial segments
+ of different lengths!
+ Unlike strncasecmp(), this function works correctly in multibyte locales.
+ But beware that N is not a byte count but a character count! */
+_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+ at most mbslen (PREFIX) characters with the character string PREFIX,
+ ignoring case. If the two match, return a pointer to the first byte
+ after this prefix in STRING. Otherwise, return NULL.
+ Note: This function may, in multibyte locales, return non-NULL if STRING
+ is of smaller length than PREFIX!
+ Unlike strncasecmp(), this function works correctly in multibyte
+ locales. */
+_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+ string HAYSTACK, using case-insensitive comparison.
+ Note: This function may, in multibyte locales, return success even if
+ strlen (haystack) < strlen (needle) !
+ Unlike strcasestr(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strcspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+ in the character string ACCEPT. Return the pointer to it, or NULL if none
+ exists.
+ Unlike strpbrk(), this function works correctly in multibyte locales. */
+# if defined __hpux
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+# endif
+_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
+# else
+_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
+# endif
+_GL_CXXALIASWARN (mbspbrk);
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+ not in the character string REJECT. Return the number of bytes from the
+ beginning of the string to this occurrence, or to the end of the string
+ if none exists.
+ Unlike strspn(), this function works correctly in multibyte locales. */
+_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+ string DELIM) starting at the character string *STRINGP.
+ If one is found, overwrite it with a NUL, and advance *STRINGP to point
+ to the next multibyte character after it. Otherwise, set *STRINGP to NULL.
+ If *STRINGP was already NULL, nothing happens.
+ Return the old value of *STRINGP.
+
+ This is a variant of mbstok_r() that supports empty fields.
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbstok_r(). */
+_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+ the character string DELIM.
+ If STRING is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = mbstok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = mbstok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = mbstok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+
+ Caveat: It modifies the original string.
+ Caveat: These functions cannot be used on constant strings.
+ Caveat: The identity of the delimiting character is lost.
+
+ See also mbssep(). */
+_GL_EXTERN_C char * mbstok_r (char *restrict string, const char *delim,
+ char **save_ptr)
+ _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message. */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror
+# define strerror rpl_strerror
+# endif
+_GL_FUNCDECL_RPL (strerror, char *, (int));
+_GL_CXXALIAS_RPL (strerror, char *, (int));
+# else
+_GL_CXXALIAS_SYS (strerror, char *, (int));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strerror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared. */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+ "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+/* Map any int, typically from errno, into an error message. Multithread-safe.
+ Uses the POSIX declaration, not the glibc declaration. */
+#if @GNULIB_STRERROR_R@
+# if @REPLACE_STRERROR_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerror_r
+# define strerror_r rpl_strerror_r
+# endif
+_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_STRERROR_R@
+_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# endif
+# if @HAVE_DECL_STRERROR_R@
+_GL_CXXALIASWARN (strerror_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror_r
+# if HAVE_RAW_DECL_STRERROR_R
+_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
+ "use gnulib module strerror_r-posix for portability");
+# endif
+#endif
+
+/* Return the name of the system error code ERRNUM. */
+#if @GNULIB_STRERRORNAME_NP@
+# if @REPLACE_STRERRORNAME_NP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef strerrorname_np
+# define strerrorname_np rpl_strerrorname_np
+# endif
+_GL_FUNCDECL_RPL (strerrorname_np, const char *, (int errnum));
+_GL_CXXALIAS_RPL (strerrorname_np, const char *, (int errnum));
+# else
+# if !@HAVE_STRERRORNAME_NP@
+_GL_FUNCDECL_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIAS_SYS (strerrorname_np, const char *, (int errnum));
+# endif
+_GL_CXXALIASWARN (strerrorname_np);
+#elif defined GNULIB_POSIXCHECK
+# undef strerrorname_np
+# if HAVE_RAW_DECL_STRERRORNAME_NP
+_GL_WARN_ON_USE (strerrorname_np, "strerrorname_np is unportable - "
+ "use gnulib module strerrorname_np for portability");
+# endif
+#endif
+
+/* Return an abbreviation string for the signal number SIG. */
+#if @GNULIB_SIGABBREV_NP@
+# if ! @HAVE_SIGABBREV_NP@
+_GL_FUNCDECL_SYS (sigabbrev_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigabbrev_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigabbrev_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigabbrev_np
+# if HAVE_RAW_DECL_SIGABBREV_NP
+_GL_WARN_ON_USE (sigabbrev_np, "sigabbrev_np is unportable - "
+ "use gnulib module sigabbrev_np for portability");
+# endif
+#endif
+
+/* Return an English description string for the signal number SIG. */
+#if @GNULIB_SIGDESCR_NP@
+# if ! @HAVE_SIGDESCR_NP@
+_GL_FUNCDECL_SYS (sigdescr_np, const char *, (int sig));
+# endif
+_GL_CXXALIAS_SYS (sigdescr_np, const char *, (int sig));
+_GL_CXXALIASWARN (sigdescr_np);
+#elif defined GNULIB_POSIXCHECK
+# undef sigdescr_np
+# if HAVE_RAW_DECL_SIGDESCR_NP
+_GL_WARN_ON_USE (sigdescr_np, "sigdescr_np is unportable - "
+ "use gnulib module sigdescr_np for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strsignal rpl_strsignal
+# endif
+_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
+_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
+# else
+# if ! @HAVE_DECL_STRSIGNAL@
+_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is
+ 'const char *'. */
+_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
+# endif
+_GL_CXXALIASWARN (strsignal);
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+ "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
+ _GL_ATTRIBUTE_PURE
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
+_GL_CXXALIASWARN (strverscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+ "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif
diff --git a/lib/strings.in.h b/lib/strings.in.h
new file mode 100644
index 0000000..c6c8016
--- /dev/null
+++ b/lib/strings.in.h
@@ -0,0 +1,122 @@
+/* A substitute <strings.h>.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Minix 3.1.8 has a bug: <sys/types.h> must be included before <strings.h>.
+ But avoid namespace pollution on glibc systems. */
+#if defined __minix && !defined __GLIBC__
+# include <sys/types.h>
+#endif
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_STRINGS_H@
+# @INCLUDE_NEXT@ @NEXT_STRINGS_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_STRINGS_H
+#define _@GUARD_PREFIX@_STRINGS_H
+
+#if ! @HAVE_DECL_STRNCASECMP@
+/* Get size_t. */
+# include <stddef.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /* Find the index of the least-significant set bit. */
+#if @GNULIB_FFS@
+# if !@HAVE_FFS@
+_GL_FUNCDECL_SYS (ffs, int, (int i));
+# endif
+_GL_CXXALIAS_SYS (ffs, int, (int i));
+_GL_CXXALIASWARN (ffs);
+#elif defined GNULIB_POSIXCHECK
+# undef ffs
+# if HAVE_RAW_DECL_FFS
+_GL_WARN_ON_USE (ffs, "ffs is not portable - use the ffs module");
+# endif
+#endif
+
+/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+ greater than zero if S1 is lexicographically less than, equal to or greater
+ than S2.
+ Note: This function does not work in multibyte locales. */
+#if ! @HAVE_STRCASECMP@
+extern int strcasecmp (char const *s1, char const *s2)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strcasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strcasecmp
+# if HAVE_RAW_DECL_STRCASECMP
+_GL_WARN_ON_USE (strcasecmp, "strcasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbscasecmp if you care about "
+ "internationalization, or use c_strcasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+#if ! @HAVE_DECL_STRNCASECMP@
+extern int strncasecmp (char const *s1, char const *s2, size_t n)
+ _GL_ARG_NONNULL ((1, 2));
+#endif
+#if defined GNULIB_POSIXCHECK
+/* strncasecmp() does not work with multibyte strings:
+ POSIX says that it operates on "strings", and "string" in POSIX is defined
+ as a sequence of bytes, not of characters. */
+# undef strncasecmp
+# if HAVE_RAW_DECL_STRNCASECMP
+_GL_WARN_ON_USE (strncasecmp, "strncasecmp cannot work correctly on character "
+ "strings in multibyte locales - "
+ "use mbsncasecmp or mbspcasecmp if you care about "
+ "internationalization, or use c_strncasecmp , "
+ "gnulib module c-strcase) if you want a locale "
+ "independent function");
+# endif
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
diff --git a/lib/stripslash.c b/lib/stripslash.c
new file mode 100644
index 0000000..6818b30
--- /dev/null
+++ b/lib/stripslash.c
@@ -0,0 +1,45 @@
+/* stripslash.c -- remove redundant trailing slashes from a file name
+
+ Copyright (C) 1990, 2001, 2003-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "dirname.h"
+
+/* Remove trailing slashes from FILE. Return true if a trailing slash
+ was removed. This is useful when using file name completion from a
+ shell that adds a "/" after directory names (such as tcsh and
+ bash), because on symlinks to directories, several system calls
+ have different semantics according to whether a trailing slash is
+ present. */
+
+bool
+strip_trailing_slashes (char *file)
+{
+ char *base = last_component (file);
+ char *base_lim;
+ bool had_slash;
+
+ /* last_component returns "" for file system roots, but we need to turn
+ "///" into "/". */
+ if (! *base)
+ base = file;
+ base_lim = base + base_len (base);
+ had_slash = (*base_lim != '\0');
+ *base_lim = '\0';
+ return had_slash;
+}
diff --git a/lib/strncasecmp.c b/lib/strncasecmp.c
new file mode 100644
index 0000000..32e2abd
--- /dev/null
+++ b/lib/strncasecmp.c
@@ -0,0 +1,62 @@
+/* strncasecmp.c -- case insensitive string comparator
+ Copyright (C) 1998-1999, 2005-2007, 2009-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <string.h>
+
+#include <ctype.h>
+#include <limits.h>
+
+#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
+
+/* Compare no more than N bytes of strings S1 and S2, ignoring case,
+ returning less than, equal to or greater than zero if S1 is
+ lexicographically less than, equal to or greater than S2.
+ Note: This function cannot work correctly in multibyte locales. */
+
+int
+strncasecmp (const char *s1, const char *s2, size_t n)
+{
+ register const unsigned char *p1 = (const unsigned char *) s1;
+ register const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+
+ if (p1 == p2 || n == 0)
+ return 0;
+
+ do
+ {
+ c1 = TOLOWER (*p1);
+ c2 = TOLOWER (*p2);
+
+ if (--n == 0 || c1 == '\0')
+ break;
+
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ if (UCHAR_MAX <= INT_MAX)
+ return c1 - c2;
+ else
+ /* On machines where 'char' and 'int' are types of the same size, the
+ difference of two 'unsigned char' values - including the sign bit -
+ doesn't fit in an 'int'. */
+ return _GL_CMP (c1, c2);
+}
diff --git a/lib/strndup.c b/lib/strndup.c
new file mode 100644
index 0000000..d5294b8
--- /dev/null
+++ b/lib/strndup.c
@@ -0,0 +1,36 @@
+/* A replacement function, for systems that lack strndup.
+
+ Copyright (C) 1996-1998, 2001-2003, 2005-2007, 2009-2020 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <stdlib.h>
+
+char *
+strndup (char const *s, size_t n)
+{
+ size_t len = strnlen (s, n);
+ char *new = malloc (len + 1);
+
+ if (new == NULL)
+ return NULL;
+
+ new[len] = '\0';
+ return memcpy (new, s, len);
+}
diff --git a/lib/strnlen.c b/lib/strnlen.c
new file mode 100644
index 0000000..dcecf08
--- /dev/null
+++ b/lib/strnlen.c
@@ -0,0 +1,30 @@
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+#include <string.h>
+
+/* Find the length of STRING, but scan at most MAXLEN characters.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
diff --git a/lib/strnlen1.c b/lib/strnlen1.c
new file mode 100644
index 0000000..88edc18
--- /dev/null
+++ b/lib/strnlen1.c
@@ -0,0 +1,35 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "strnlen1.h"
+
+#include <string.h>
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+size_t
+strnlen1 (const char *string, size_t maxlen)
+{
+ const char *end = (const char *) memchr (string, '\0', maxlen);
+ if (end != NULL)
+ return end - string + 1;
+ else
+ return maxlen;
+}
diff --git a/lib/strnlen1.h b/lib/strnlen1.h
new file mode 100644
index 0000000..2e21fea
--- /dev/null
+++ b/lib/strnlen1.h
@@ -0,0 +1,40 @@
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ Copyright (C) 2005, 2009-2020 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/>. */
+
+#ifndef _STRNLEN1_H
+#define _STRNLEN1_H
+
+#include <stddef.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Find the length of STRING + 1, but scan at most MAXLEN bytes.
+ If no '\0' terminator is found in that many characters, return MAXLEN. */
+/* This is the same as strnlen (string, maxlen - 1) + 1. */
+extern size_t strnlen1 (const char *string, size_t maxlen)
+ _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _STRNLEN1_H */
diff --git a/lib/strpbrk.c b/lib/strpbrk.c
new file mode 100644
index 0000000..25002e6
--- /dev/null
+++ b/lib/strpbrk.c
@@ -0,0 +1,43 @@
+/* Copyright (C) 1991, 1994, 2000, 2002-2003, 2006, 2009-2020 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C Library.
+ Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+ 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, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#if _LIBC
+# undef strpbrk
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT. */
+char *
+strpbrk (const char *s, const char *accept)
+{
+ while (*s != '\0')
+ {
+ const char *a = accept;
+ while (*a != '\0')
+ if (*a++ == *s)
+ return (char *) s;
+ ++s;
+ }
+
+ return NULL;
+}
diff --git a/lib/strptime.c b/lib/strptime.c
new file mode 100644
index 0000000..23af6f5
--- /dev/null
+++ b/lib/strptime.c
@@ -0,0 +1,1163 @@
+/* Copyright (C) 2002, 2004-2005, 2007, 2009-2020 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _LIBC
+# include <config.h>
+#endif
+
+#include <time.h>
+
+#include <assert.h>
+#include <ctype.h>
+#ifdef _LIBC
+# include <langinfo.h>
+#endif
+#include <limits.h>
+#include <string.h>
+#include <strings.h>
+#include <stdbool.h>
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+#ifndef _LIBC
+enum ptime_locale_status { not, loc, raw };
+#endif
+
+
+
+#define match_char(ch1, ch2) if (ch1 != ch2) return NULL
+#if defined _LIBC && defined __GNUC__ && __GNUC__ >= 2
+# define match_string(cs1, s2) \
+ ({ size_t len = strlen (cs1); \
+ int result = __strncasecmp_l ((cs1), (s2), len, locale) == 0; \
+ if (result) (s2) += len; \
+ result; })
+#else
+/* Oh come on. Get a reasonable compiler. */
+# define match_string(cs1, s2) \
+ (strncasecmp ((cs1), (s2), strlen (cs1)) ? 0 : ((s2) += strlen (cs1), 1))
+#endif
+/* We intentionally do not use isdigit() for testing because this will
+ lead to problems with the wide character version. */
+#define get_number(from, to, n) \
+ do { \
+ int __n = n; \
+ val = 0; \
+ while (*rp == ' ') \
+ ++rp; \
+ if (*rp < '0' || *rp > '9') \
+ return NULL; \
+ do { \
+ val *= 10; \
+ val += *rp++ - '0'; \
+ } while (--__n > 0 && val * 10 <= to && *rp >= '0' && *rp <= '9'); \
+ if (val < from || val > to) \
+ return NULL; \
+ } while (0)
+#ifdef _NL_CURRENT
+# define get_alt_number(from, to, n) \
+ ({ \
+ __label__ do_normal; \
+ \
+ if (*decided != raw) \
+ { \
+ val = _nl_parse_alt_digit (&rp HELPER_LOCALE_ARG); \
+ if (val == -1 && *decided != loc) \
+ { \
+ *decided = loc; \
+ goto do_normal; \
+ } \
+ if (val < from || val > to) \
+ return NULL; \
+ } \
+ else \
+ { \
+ do_normal: \
+ get_number (from, to, n); \
+ } \
+ 0; \
+ })
+#else
+# define get_alt_number(from, to, n) \
+ /* We don't have the alternate representation. */ \
+ get_number(from, to, n)
+#endif
+#define recursive(new_fmt) \
+ (*(new_fmt) != '\0' \
+ && (rp = __strptime_internal (rp, (new_fmt), tm, \
+ decided, era_cnt LOCALE_ARG)) != NULL)
+
+
+#ifdef _LIBC
+/* This is defined in locale/C-time.c in the GNU libc. */
+extern const struct locale_data _nl_C_LC_TIME attribute_hidden;
+
+# define weekday_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (DAY_1)].string)
+# define ab_weekday_name \
+ (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABDAY_1)].string)
+# define month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (MON_1)].string)
+# define ab_month_name (&_nl_C_LC_TIME.values[_NL_ITEM_INDEX (ABMON_1)].string)
+# define HERE_D_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_T_FMT)].string)
+# define HERE_D_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (D_FMT)].string)
+# define HERE_AM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (AM_STR)].string)
+# define HERE_PM_STR (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (PM_STR)].string)
+# define HERE_T_FMT_AMPM \
+ (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT_AMPM)].string)
+# define HERE_T_FMT (_nl_C_LC_TIME.values[_NL_ITEM_INDEX (T_FMT)].string)
+
+# define strncasecmp(s1, s2, n) __strncasecmp (s1, s2, n)
+#else
+static char const weekday_name[][10] =
+ {
+ "Sunday", "Monday", "Tuesday", "Wednesday",
+ "Thursday", "Friday", "Saturday"
+ };
+static char const ab_weekday_name[][4] =
+ {
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+ };
+static char const month_name[][10] =
+ {
+ "January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"
+ };
+static char const ab_month_name[][4] =
+ {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+# define HERE_D_T_FMT "%a %b %e %H:%M:%S %Y"
+# define HERE_D_FMT "%m/%d/%y"
+# define HERE_AM_STR "AM"
+# define HERE_PM_STR "PM"
+# define HERE_T_FMT_AMPM "%I:%M:%S %p"
+# define HERE_T_FMT "%H:%M:%S"
+
+static const unsigned short int __mon_yday[2][13] =
+ {
+ /* Normal years. */
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+ /* Leap years. */
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+ };
+#endif
+
+#if defined _LIBC
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+# define strptime __strptime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# undef _NL_CURRENT_WORD
+# define _NL_CURRENT_WORD(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].word)
+# define LOCALE_PARAM , locale
+# define LOCALE_ARG , locale
+# define LOCALE_PARAM_PROTO , __locale_t locale
+# define LOCALE_PARAM_DECL __locale_t locale;
+# define HELPER_LOCALE_ARG , current
+# define ISSPACE(Ch) __isspace_l (Ch, locale)
+#else
+# define LOCALE_PARAM
+# define LOCALE_ARG
+# define LOCALE_PARAM_DECL
+# define LOCALE_PARAM_PROTO
+# define HELPER_LOCALE_ARG
+# define ISSPACE(Ch) isspace (Ch)
+#endif
+
+
+
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+ except every 100th isn't, and every 400th is). */
+# define __isleap(year) \
+ ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+/* Compute the day of the week. */
+static void
+day_of_the_week (struct tm *tm)
+{
+ /* We know that January 1st 1970 was a Thursday (= 4). Compute the
+ difference between this data in the one on TM and so determine
+ the weekday. */
+ int corr_year = 1900 + tm->tm_year - (tm->tm_mon < 2);
+ int corr_quad = corr_year / 4;
+ int wday = (-473
+ + (365 * (tm->tm_year - 70))
+ + corr_quad
+ - ((corr_quad + (corr_quad < 0)) / 25 - (corr_quad < 0))
+ + ((corr_quad / 25) / 4)
+ + __mon_yday[0][tm->tm_mon]
+ + tm->tm_mday - 1);
+ tm->tm_wday = ((wday % 7) + 7) % 7;
+}
+
+/* Compute the day of the year. */
+static void
+day_of_the_year (struct tm *tm)
+{
+ tm->tm_yday = (__mon_yday[__isleap (1900 + tm->tm_year)][tm->tm_mon]
+ + (tm->tm_mday - 1));
+}
+
+
+#ifdef _LIBC
+char *
+internal_function
+#else
+static char *
+#endif
+__strptime_internal (rp, fmt, tm, decided, era_cnt LOCALE_PARAM)
+ const char *rp;
+ const char *fmt;
+ struct tm *tm;
+ enum ptime_locale_status *decided;
+ int era_cnt;
+ LOCALE_PARAM_DECL
+{
+#ifdef _LIBC
+ struct locale_data *const current = locale->__locales[LC_TIME];
+#endif
+
+ int cnt;
+ size_t val;
+ int have_I, is_pm;
+ int century, want_century;
+ int want_era;
+ int have_wday, want_xday;
+ int have_yday;
+ int have_mon, have_mday;
+ int have_uweek, have_wweek;
+ int week_no;
+#ifdef _NL_CURRENT
+ size_t num_eras;
+ struct era_entry *era = NULL;
+ const char *rp_backup;
+#endif
+
+ have_I = is_pm = 0;
+ century = -1;
+ want_century = 0;
+ want_era = 0;
+ week_no = 0;
+
+ have_wday = want_xday = have_yday = have_mon = have_mday = have_uweek = 0;
+ have_wweek = 0;
+
+ while (*fmt != '\0')
+ {
+ /* A white space in the format string matches 0 more or white
+ space in the input string. */
+ if (ISSPACE (*fmt))
+ {
+ while (ISSPACE (*rp))
+ ++rp;
+ ++fmt;
+ continue;
+ }
+
+ /* Any character but '%' must be matched by the same character
+ in the input string. */
+ if (*fmt != '%')
+ {
+ match_char (*fmt++, *rp++);
+ continue;
+ }
+
+ ++fmt;
+#ifndef _NL_CURRENT
+ /* We need this for handling the 'E' modifier. */
+ start_over:
+#else
+ /* Make back up of current processing pointer. */
+ rp_backup = rp;
+#endif
+
+ switch (*fmt++)
+ {
+ case '%':
+ /* Match the '%' character itself. */
+ match_char ('%', *rp++);
+ break;
+ case 'a':
+ case 'A':
+ /* Match day of week. */
+ for (cnt = 0; cnt < 7; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, DAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, DAY_1 + cnt),
+ weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABDAY_1 + cnt),
+ ab_weekday_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (*decided != loc
+ && (match_string (weekday_name[cnt], rp)
+ || match_string (ab_weekday_name[cnt], rp)))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 7)
+ /* Does not match a weekday name. */
+ return NULL;
+ tm->tm_wday = cnt;
+ have_wday = 1;
+ break;
+ case 'b':
+ case 'B':
+ case 'h':
+ /* Match month name. */
+ for (cnt = 0; cnt < 12; ++cnt)
+ {
+#ifdef _NL_CURRENT
+ if (*decided !=raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, MON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, MON_1 + cnt),
+ month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, ABMON_1 + cnt), rp))
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, ABMON_1 + cnt),
+ ab_month_name[cnt]))
+ *decided = loc;
+ break;
+ }
+ }
+#endif
+ if (match_string (month_name[cnt], rp)
+ || match_string (ab_month_name[cnt], rp))
+ {
+ *decided = raw;
+ break;
+ }
+ }
+ if (cnt == 12)
+ /* Does not match a month name. */
+ return NULL;
+ tm->tm_mon = cnt;
+ want_xday = 1;
+ break;
+ case 'c':
+ /* Match locale's date and time format. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, D_T_FMT), HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ /* Match century number. */
+#ifdef _NL_CURRENT
+ match_century:
+#endif
+ get_number (0, 99, 2);
+ century = val;
+ want_xday = 1;
+ break;
+ case 'd':
+ case 'e':
+ /* Match day of month. */
+ get_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'F':
+ if (!recursive ("%Y-%m-%d"))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'x':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, D_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not
+ && strcmp (_NL_CURRENT (LC_TIME, D_FMT), HERE_D_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'D':
+ /* Match standard day format. */
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'k':
+ case 'H':
+ /* Match hour in 24-hour clock. */
+ get_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'l':
+ /* Match hour in 12-hour clock. GNU extension. */
+ case 'I':
+ /* Match hour in 12-hour clock. */
+ get_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'j':
+ /* Match day number of year. */
+ get_number (1, 366, 3);
+ tm->tm_yday = val - 1;
+ have_yday = 1;
+ break;
+ case 'm':
+ /* Match number of month. */
+ get_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minute. */
+ get_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'n':
+ case 't':
+ /* Match any white space. */
+ while (ISSPACE (*rp))
+ ++rp;
+ break;
+ case 'p':
+ /* Match locale's equivalent of AM/PM. */
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (match_string (_NL_CURRENT (LC_TIME, AM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, AM_STR), HERE_AM_STR))
+ *decided = loc;
+ break;
+ }
+ if (match_string (_NL_CURRENT (LC_TIME, PM_STR), rp))
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, PM_STR), HERE_PM_STR))
+ *decided = loc;
+ is_pm = 1;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!match_string (HERE_AM_STR, rp))
+ {
+ if (match_string (HERE_PM_STR, rp))
+ is_pm = 1;
+ else
+ return NULL;
+ }
+ break;
+ case 'q':
+ /* Match quarter of year. GNU extension. */
+ get_number (1, 4, 1);
+ tm->tm_mon = (val - 1) * 3;
+ tm->tm_mday = 1;
+ have_mon = 1;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'r':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT_AMPM)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (*decided == not &&
+ strcmp (_NL_CURRENT (LC_TIME, T_FMT_AMPM),
+ HERE_T_FMT_AMPM))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ if (!recursive (HERE_T_FMT_AMPM))
+ return NULL;
+ break;
+ case 'R':
+ if (!recursive ("%H:%M"))
+ return NULL;
+ break;
+ case 's':
+ {
+ /* The number of seconds may be very high so we cannot use
+ the 'get_number' macro. Instead read the number
+ character for character and construct the result while
+ doing this. */
+ time_t secs = 0;
+ if (*rp < '0' || *rp > '9')
+ /* We need at least one digit. */
+ return NULL;
+
+ do
+ {
+ secs *= 10;
+ secs += *rp++ - '0';
+ }
+ while (*rp >= '0' && *rp <= '9');
+
+ if (localtime_r (&secs, tm) == NULL)
+ /* Error in function. */
+ return NULL;
+ }
+ break;
+ case 'S':
+ get_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'X':
+#ifdef _NL_CURRENT
+ if (*decided != raw)
+ {
+ if (!recursive (_NL_CURRENT (LC_TIME, T_FMT)))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (_NL_CURRENT (LC_TIME, T_FMT), HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+#endif
+ /* Fall through. */
+ case 'T':
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ case 'u':
+ get_number (1, 7, 1);
+ tm->tm_wday = val % 7;
+ have_wday = 1;
+ break;
+ case 'g':
+ get_number (0, 99, 2);
+ /* XXX This cannot determine any field in TM. */
+ break;
+ case 'G':
+ if (*rp < '0' || *rp > '9')
+ return NULL;
+ /* XXX Ignore the number since we would need some more
+ information to compute a real date. */
+ do
+ ++rp;
+ while (*rp >= '0' && *rp <= '9');
+ break;
+ case 'U':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without some
+ information. */
+ break;
+ case 'w':
+ /* Match number of weekday. */
+ get_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+#ifdef _NL_CURRENT
+ match_year_in_century:
+#endif
+ /* Match year within century. */
+ get_number (0, 99, 2);
+ /* The "Year 2000: The Millennium Rollover" paper suggests that
+ values in the range 69-99 refer to the twentieth century. */
+ tm->tm_year = val >= 69 ? val : val + 100;
+ /* Indicate that we want to use the century, if specified. */
+ want_century = 1;
+ want_xday = 1;
+ break;
+ case 'Y':
+ /* Match year including century number. */
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'Z':
+ /* XXX How to handle this? */
+ break;
+ case 'z':
+ /* We recognize two formats: if two digits are given, these
+ specify hours. If fours digits are used, minutes are
+ also specified. */
+ {
+ bool neg _GL_UNUSED;
+ int n;
+
+ val = 0;
+ while (*rp == ' ')
+ ++rp;
+ if (*rp != '+' && *rp != '-')
+ return NULL;
+ neg = *rp++ == '-';
+ n = 0;
+ while (n < 4 && *rp >= '0' && *rp <= '9')
+ {
+ val = val * 10 + *rp++ - '0';
+ ++n;
+ }
+ if (n == 2)
+ val *= 100;
+ else if (n != 4)
+ /* Only two or four digits recognized. */
+ return NULL;
+ else
+ {
+ /* We have to convert the minutes into decimal. */
+ if (val % 100 >= 60)
+ return NULL;
+ val = (val / 100) * 100 + ((val % 100) * 50) / 30;
+ }
+ if (val > 1200)
+ return NULL;
+#if defined _LIBC || HAVE_TM_GMTOFF
+ tm->tm_gmtoff = (val * 3600) / 100;
+ if (neg)
+ tm->tm_gmtoff = -tm->tm_gmtoff;
+#endif
+ }
+ break;
+ case 'E':
+#ifdef _NL_CURRENT
+ switch (*fmt++)
+ {
+ case 'c':
+ /* Match locale's alternate date and time format. */
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_T_FMT))
+ *decided = loc;
+ want_xday = 1;
+ break;
+ }
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ if (!recursive (HERE_D_T_FMT))
+ return NULL;
+ want_xday = 1;
+ break;
+ case 'C':
+ if (*decided != raw)
+ {
+ if (era_cnt >= 0)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ else
+ return NULL;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL && match_string (era->era_name, rp))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+ /* The C locale has no era information, so use the
+ normal representation. */
+ goto match_century;
+ case 'y':
+ if (*decided != raw)
+ {
+ get_number(0, 9999, 4);
+ tm->tm_year = val;
+ want_era = 1;
+ want_xday = 1;
+ want_century = 1;
+
+ if (era_cnt >= 0)
+ {
+ assert (*decided == loc);
+
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ bool match = false;
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ match = (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction));
+ }
+ if (! match)
+ return NULL;
+
+ break;
+ }
+
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras; ++era_cnt)
+ {
+ era = _nl_select_era_entry (era_cnt
+ HELPER_LOCALE_ARG);
+ if (era != NULL)
+ {
+ int delta = ((tm->tm_year - era->offset)
+ * era->absolute_direction);
+ if (delta >= 0
+ && delta < (((int64_t) era->stop_date[0]
+ - (int64_t) era->start_date[0])
+ * era->absolute_direction))
+ {
+ *decided = loc;
+ break;
+ }
+ }
+ }
+ if (era_cnt != (int) num_eras)
+ break;
+
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+
+ *decided = raw;
+ }
+
+ goto match_year_in_century;
+ case 'Y':
+ if (*decided != raw)
+ {
+ num_eras = _NL_CURRENT_WORD (LC_TIME,
+ _NL_TIME_ERA_NUM_ENTRIES);
+ for (era_cnt = 0; era_cnt < (int) num_eras;
+ ++era_cnt, rp = rp_backup)
+ {
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era != NULL && recursive (era->era_format))
+ break;
+ }
+ if (era_cnt == (int) num_eras)
+ {
+ era_cnt = -1;
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ *decided = loc;
+ era_cnt = -1;
+ break;
+ }
+
+ *decided = raw;
+ }
+ get_number (0, 9999, 4);
+ tm->tm_year = val - 1900;
+ want_century = 0;
+ want_xday = 1;
+ break;
+ case 'x':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_D_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, D_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_D_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_D_FMT))
+ return NULL;
+ break;
+ case 'X':
+ if (*decided != raw)
+ {
+ const char *fmt = _NL_CURRENT (LC_TIME, ERA_T_FMT);
+
+ if (*fmt == '\0')
+ fmt = _NL_CURRENT (LC_TIME, T_FMT);
+
+ if (!recursive (fmt))
+ {
+ if (*decided == loc)
+ return NULL;
+ else
+ rp = rp_backup;
+ }
+ else
+ {
+ if (strcmp (fmt, HERE_T_FMT))
+ *decided = loc;
+ break;
+ }
+ *decided = raw;
+ }
+ if (!recursive (HERE_T_FMT))
+ return NULL;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+#else
+ /* We have no information about the era format. Just use
+ the normal format. */
+ if (*fmt != 'c' && *fmt != 'C' && *fmt != 'y' && *fmt != 'Y'
+ && *fmt != 'x' && *fmt != 'X')
+ /* This is an illegal format. */
+ return NULL;
+
+ goto start_over;
+#endif
+ case 'O':
+ switch (*fmt++)
+ {
+ case 'd':
+ case 'e':
+ /* Match day of month using alternate numeric symbols. */
+ get_alt_number (1, 31, 2);
+ tm->tm_mday = val;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'H':
+ /* Match hour in 24-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (0, 23, 2);
+ tm->tm_hour = val;
+ have_I = 0;
+ break;
+ case 'I':
+ /* Match hour in 12-hour clock using alternate numeric
+ symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_hour = val % 12;
+ have_I = 1;
+ break;
+ case 'm':
+ /* Match month using alternate numeric symbols. */
+ get_alt_number (1, 12, 2);
+ tm->tm_mon = val - 1;
+ have_mon = 1;
+ want_xday = 1;
+ break;
+ case 'M':
+ /* Match minutes using alternate numeric symbols. */
+ get_alt_number (0, 59, 2);
+ tm->tm_min = val;
+ break;
+ case 'q':
+ /* Match quarter using alternate numeric symbols. */
+ get_alt_number (1, 4, 1);
+ tm->tm_mon = (val - 1) * 3;
+ tm->tm_mday = 1;
+ have_mon = 1;
+ have_mday = 1;
+ want_xday = 1;
+ break;
+ case 'S':
+ /* Match seconds using alternate numeric symbols. */
+ get_alt_number (0, 61, 2);
+ tm->tm_sec = val;
+ break;
+ case 'U':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_uweek = 1;
+ break;
+ case 'W':
+ get_alt_number (0, 53, 2);
+ week_no = val;
+ have_wweek = 1;
+ break;
+ case 'V':
+ get_alt_number (0, 53, 2);
+ /* XXX This cannot determine any field in TM without
+ further information. */
+ break;
+ case 'w':
+ /* Match number of weekday using alternate numeric symbols. */
+ get_alt_number (0, 6, 1);
+ tm->tm_wday = val;
+ have_wday = 1;
+ break;
+ case 'y':
+ /* Match year within century using alternate numeric symbols. */
+ get_alt_number (0, 99, 2);
+ tm->tm_year = val >= 69 ? val : val + 100;
+ want_xday = 1;
+ break;
+ default:
+ return NULL;
+ }
+ break;
+ default:
+ return NULL;
+ }
+ }
+
+ if (have_I && is_pm)
+ tm->tm_hour += 12;
+
+ if (century != -1)
+ {
+ if (want_century)
+ tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
+ else
+ /* Only the century, but not the year. Strange, but so be it. */
+ tm->tm_year = (century - 19) * 100;
+ }
+
+ if (era_cnt != -1)
+ {
+#ifdef _NL_CURRENT
+ era = _nl_select_era_entry (era_cnt HELPER_LOCALE_ARG);
+ if (era == NULL)
+ return NULL;
+ if (want_era)
+ tm->tm_year = (era->start_date[0]
+ + ((tm->tm_year - era->offset)
+ * era->absolute_direction));
+ else
+ /* Era start year assumed. */
+ tm->tm_year = era->start_date[0];
+#endif
+ }
+ else
+ if (want_era)
+ {
+ /* No era found but we have seen an E modifier. Rectify some
+ values. */
+ if (want_century && century == -1 && tm->tm_year < 69)
+ tm->tm_year += 100;
+ }
+
+ if (want_xday && !have_wday)
+ {
+ if ( !(have_mon && have_mday) && have_yday)
+ {
+ /* We don't have tm_mon and/or tm_mday, compute them. */
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon] <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+ day_of_the_week (tm);
+ }
+
+ if (want_xday && !have_yday)
+ day_of_the_year (tm);
+
+ if ((have_uweek || have_wweek) && have_wday)
+ {
+ int save_wday = tm->tm_wday;
+ int save_mday = tm->tm_mday;
+ int save_mon = tm->tm_mon;
+ int w_offset = have_uweek ? 0 : 1;
+
+ tm->tm_mday = 1;
+ tm->tm_mon = 0;
+ day_of_the_week (tm);
+ if (have_mday)
+ tm->tm_mday = save_mday;
+ if (have_mon)
+ tm->tm_mon = save_mon;
+
+ if (!have_yday)
+ tm->tm_yday = ((7 - (tm->tm_wday - w_offset)) % 7
+ + (week_no - 1) *7
+ + save_wday - w_offset);
+
+ if (!have_mday || !have_mon)
+ {
+ int t_mon = 0;
+ while (__mon_yday[__isleap(1900 + tm->tm_year)][t_mon]
+ <= tm->tm_yday)
+ t_mon++;
+ if (!have_mon)
+ tm->tm_mon = t_mon - 1;
+ if (!have_mday)
+ tm->tm_mday =
+ (tm->tm_yday
+ - __mon_yday[__isleap(1900 + tm->tm_year)][t_mon - 1] + 1);
+ }
+
+ tm->tm_wday = save_wday;
+ }
+
+ return (char *) rp;
+}
+
+
+char *
+strptime (buf, format, tm LOCALE_PARAM)
+ const char *restrict buf;
+ const char *restrict format;
+ struct tm *restrict tm;
+ LOCALE_PARAM_DECL
+{
+ enum ptime_locale_status decided;
+
+#ifdef _NL_CURRENT
+ decided = not;
+#else
+ decided = raw;
+#endif
+ return __strptime_internal (buf, format, tm, &decided, -1 LOCALE_ARG);
+}
+
+#ifdef _LIBC
+weak_alias (__strptime_l, strptime_l)
+#endif
diff --git a/lib/strtok_r.c b/lib/strtok_r.c
new file mode 100644
index 0000000..1870a0a
--- /dev/null
+++ b/lib/strtok_r.c
@@ -0,0 +1,76 @@
+/* Reentrant string tokenizer. Generic version.
+ Copyright (C) 1991, 1996-1999, 2001, 2004, 2007, 2009-2020 Free Software
+ Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef _LIBC
+# undef strtok_r
+# undef __strtok_r
+#else
+# define __strtok_r strtok_r
+# define __rawmemchr strchr
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+ If S is NULL, the saved pointer in SAVE_PTR is used as
+ the next starting point. For example:
+ char s[] = "-abc-=-def";
+ char *sp;
+ x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
+ x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
+ x = strtok_r(NULL, "=", &sp); // x = NULL
+ // s = "abc\0-def\0"
+*/
+char *
+__strtok_r (char *s, const char *delim, char **save_ptr)
+{
+ char *token;
+
+ if (s == NULL)
+ s = *save_ptr;
+
+ /* Scan leading delimiters. */
+ s += strspn (s, delim);
+ if (*s == '\0')
+ {
+ *save_ptr = s;
+ return NULL;
+ }
+
+ /* Find the end of the token. */
+ token = s;
+ s = strpbrk (token, delim);
+ if (s == NULL)
+ /* This token finishes the string. */
+ *save_ptr = __rawmemchr (token, '\0');
+ else
+ {
+ /* Terminate the token and make *SAVE_PTR point past it. */
+ *s = '\0';
+ *save_ptr = s + 1;
+ }
+ return token;
+}
+#ifdef weak_alias
+libc_hidden_def (__strtok_r)
+weak_alias (__strtok_r, strtok_r)
+#endif
diff --git a/lib/strtol.c b/lib/strtol.c
new file mode 100644
index 0000000..02aafca
--- /dev/null
+++ b/lib/strtol.c
@@ -0,0 +1,393 @@
+/* Convert string representation of a number into an integer value.
+
+ Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2020 Free Software
+ Foundation, Inc.
+
+ NOTE: The canonical source of this file is maintained with the GNU C
+ Library. Bugs can be reported to bug-glibc@gnu.org.
+
+ This program is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifdef _LIBC
+# define USE_NUMBER_GROUPING
+#else
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef USE_NUMBER_GROUPING
+# include "../locale/localeinfo.h"
+#endif
+
+/* Nonzero if we are defining 'strtoul' or 'strtoull', operating on
+ unsigned integers. */
+#ifndef UNSIGNED
+# define UNSIGNED 0
+# define INT LONG int
+#else
+# define INT unsigned LONG int
+#endif
+
+/* Determine the name. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoull_l
+# else
+# define strtol __wcstoul_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoull_l
+# else
+# define strtol __strtoul_l
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol __wcstoll_l
+# else
+# define strtol __wcstol_l
+# endif
+# else
+# ifdef QUAD
+# define strtol __strtoll_l
+# else
+# define strtol __strtol_l
+# endif
+# endif
+# endif
+#else
+# if UNSIGNED
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoull
+# else
+# define strtol wcstoul
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoull
+# else
+# define strtol strtoul
+# endif
+# endif
+# else
+# ifdef USE_WIDE_CHAR
+# ifdef QUAD
+# define strtol wcstoll
+# else
+# define strtol wcstol
+# endif
+# else
+# ifdef QUAD
+# define strtol strtoll
+# endif
+# endif
+# endif
+#endif
+
+/* If QUAD is defined, we are defining 'strtoll' or 'strtoull',
+ operating on 'long long int's. */
+#ifdef QUAD
+# define LONG long long
+# define STRTOL_LONG_MIN LLONG_MIN
+# define STRTOL_LONG_MAX LLONG_MAX
+# define STRTOL_ULONG_MAX ULLONG_MAX
+# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
+ /* Work around gcc bug with using this constant. */
+ static const unsigned long long int maxquad = ULLONG_MAX;
+# undef STRTOL_ULONG_MAX
+# define STRTOL_ULONG_MAX maxquad
+# endif
+#else
+# define LONG long
+# define STRTOL_LONG_MIN LONG_MIN
+# define STRTOL_LONG_MAX LONG_MAX
+# define STRTOL_ULONG_MAX ULONG_MAX
+#endif
+
+
+/* We use this code also for the extended locale handling where the
+ function gets as an additional argument the locale which has to be
+ used. To access the values we have to redefine the _NL_CURRENT
+ macro. */
+#ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+ (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_PARAM_PROTO , __locale_t loc
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_PROTO
+#endif
+
+#ifdef USE_WIDE_CHAR
+# include <wchar.h>
+# include <wctype.h>
+# define L_(Ch) L##Ch
+# define UCHAR_TYPE wint_t
+# define STRING_TYPE wchar_t
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __iswspace_l ((Ch), loc)
+# define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __towupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) iswspace (Ch)
+# define ISALPHA(Ch) iswalpha (Ch)
+# define TOUPPER(Ch) towupper (Ch)
+# endif
+#else
+# define L_(Ch) Ch
+# define UCHAR_TYPE unsigned char
+# define STRING_TYPE char
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+# define ISSPACE(Ch) __isspace_l ((Ch), loc)
+# define ISALPHA(Ch) __isalpha_l ((Ch), loc)
+# define TOUPPER(Ch) __toupper_l ((Ch), loc)
+# else
+# define ISSPACE(Ch) isspace (Ch)
+# define ISALPHA(Ch) isalpha (Ch)
+# define TOUPPER(Ch) toupper (Ch)
+# endif
+#endif
+
+#define INTERNAL(X) INTERNAL1(X)
+#define INTERNAL1(X) __##X##_internal
+#define WEAKNAME(X) WEAKNAME1(X)
+
+#ifdef USE_NUMBER_GROUPING
+/* This file defines a function to check for correct grouping. */
+# include "grouping.h"
+#endif
+
+
+
+/* Convert NPTR to an 'unsigned long int' or 'long int' in base BASE.
+ If BASE is 0 the base is determined by the presence of a leading
+ zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
+ If BASE is < 2 or > 36, it is reset to 10.
+ If ENDPTR is not NULL, a pointer to the character after the last
+ one converted is stored in *ENDPTR. */
+
+INT
+INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base, int group LOCALE_PARAM_PROTO)
+{
+ int negative;
+ register unsigned LONG int cutoff;
+ register unsigned int cutlim;
+ register unsigned LONG int i;
+ register const STRING_TYPE *s;
+ register UCHAR_TYPE c;
+ const STRING_TYPE *save, *end;
+ int overflow;
+
+#ifdef USE_NUMBER_GROUPING
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+ struct locale_data *current = loc->__locales[LC_NUMERIC];
+# endif
+ /* The thousands character of the current locale. */
+ wchar_t thousands = L'\0';
+ /* The numeric grouping specification of the current locale,
+ in the format described in <locale.h>. */
+ const char *grouping;
+
+ if (group)
+ {
+ grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
+ if (*grouping <= 0 || *grouping == CHAR_MAX)
+ grouping = NULL;
+ else
+ {
+ /* Figure out the thousands separator character. */
+# if defined _LIBC || defined _HAVE_BTOWC
+ thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+ if (thousands == WEOF)
+ thousands = L'\0';
+# endif
+ if (thousands == L'\0')
+ grouping = NULL;
+ }
+ }
+ else
+ grouping = NULL;
+#endif
+
+ if (base < 0 || base == 1 || base > 36)
+ {
+ __set_errno (EINVAL);
+ return 0;
+ }
+
+ save = s = nptr;
+
+ /* Skip white space. */
+ while (ISSPACE (*s))
+ ++s;
+ if (*s == L_('\0'))
+ goto noconv;
+
+ /* Check for a sign. */
+ if (*s == L_('-'))
+ {
+ negative = 1;
+ ++s;
+ }
+ else if (*s == L_('+'))
+ {
+ negative = 0;
+ ++s;
+ }
+ else
+ negative = 0;
+
+ /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
+ if (*s == L_('0'))
+ {
+ if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
+ {
+ s += 2;
+ base = 16;
+ }
+ else if (base == 0)
+ base = 8;
+ }
+ else if (base == 0)
+ base = 10;
+
+ /* Save the pointer so we can check later if anything happened. */
+ save = s;
+
+#ifdef USE_NUMBER_GROUPING
+ if (group)
+ {
+ /* Find the end of the digit string and check its grouping. */
+ end = s;
+ for (c = *end; c != L_('\0'); c = *++end)
+ if ((wchar_t) c != thousands
+ && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
+ && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
+ break;
+ if (*s == thousands)
+ end = s;
+ else
+ end = correctly_grouped_prefix (s, end, thousands, grouping);
+ }
+ else
+#endif
+ end = NULL;
+
+ cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
+ cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
+
+ overflow = 0;
+ i = 0;
+ for (c = *s; c != L_('\0'); c = *++s)
+ {
+ if (s == end)
+ break;
+ if (c >= L_('0') && c <= L_('9'))
+ c -= L_('0');
+ else if (ISALPHA (c))
+ c = TOUPPER (c) - L_('A') + 10;
+ else
+ break;
+ if ((int) c >= base)
+ break;
+ /* Check for overflow. */
+ if (i > cutoff || (i == cutoff && c > cutlim))
+ overflow = 1;
+ else
+ {
+ i *= (unsigned LONG int) base;
+ i += c;
+ }
+ }
+
+ /* Check if anything actually happened. */
+ if (s == save)
+ goto noconv;
+
+ /* Store in ENDPTR the address of one character
+ past the last character we converted. */
+ if (endptr != NULL)
+ *endptr = (STRING_TYPE *) s;
+
+#if !UNSIGNED
+ /* Check for a value that is within the range of
+ 'unsigned LONG int', but outside the range of 'LONG int'. */
+ if (overflow == 0
+ && i > (negative
+ ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
+ : (unsigned LONG int) STRTOL_LONG_MAX))
+ overflow = 1;
+#endif
+
+ if (overflow)
+ {
+ __set_errno (ERANGE);
+#if UNSIGNED
+ return STRTOL_ULONG_MAX;
+#else
+ return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
+#endif
+ }
+
+ /* Return the result of the appropriate sign. */
+ return negative ? -i : i;
+
+noconv:
+ /* We must handle a special case here: the base is 0 or 16 and the
+ first two characters are '0' and 'x', but the rest are no
+ hexadecimal digits. This is no error case. We return 0 and
+ ENDPTR points to the 'x'. */
+ if (endptr != NULL)
+ {
+ if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
+ && save[-2] == L_('0'))
+ *endptr = (STRING_TYPE *) &save[-1];
+ else
+ /* There was no number to convert. */
+ *endptr = (STRING_TYPE *) nptr;
+ }
+
+ return 0L;
+}
+
+/* External user entry point. */
+
+
+INT
+#ifdef weak_function
+weak_function
+#endif
+strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
+ int base LOCALE_PARAM_PROTO)
+{
+ return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
+}
diff --git a/lib/strtoll.c b/lib/strtoll.c
new file mode 100644
index 0000000..3c7e8c0
--- /dev/null
+++ b/lib/strtoll.c
@@ -0,0 +1,33 @@
+/* Function to parse a 'long long int' from text.
+ Copyright (C) 1995-1997, 1999, 2001, 2009-2020 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+#define QUAD 1
+
+#include <strtol.c>
+
+#ifdef _LIBC
+# ifdef SHARED
+# include <shlib-compat.h>
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
+compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0);
+# endif
+
+# endif
+weak_alias (strtoll, strtoq)
+#endif
diff --git a/lib/symlink.c b/lib/symlink.c
new file mode 100644
index 0000000..b1196b9
--- /dev/null
+++ b/lib/symlink.c
@@ -0,0 +1,57 @@
+/* Stub for symlink().
+ Copyright (C) 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>
+
+
+#if HAVE_SYMLINK
+
+# undef symlink
+
+/* Create a symlink, but reject trailing slash. */
+int
+rpl_symlink (char const *contents, char const *name)
+{
+ size_t len = strlen (name);
+ if (len && name[len - 1] == '/')
+ {
+ struct stat st;
+ if (lstat (name, &st) == 0 || errno == EOVERFLOW)
+ errno = EEXIST;
+ return -1;
+ }
+ return symlink (contents, name);
+}
+
+#else /* !HAVE_SYMLINK */
+
+/* The system does not support symlinks. */
+int
+symlink (char const *contents _GL_UNUSED,
+ char const *name _GL_UNUSED)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+#endif /* !HAVE_SYMLINK */
diff --git a/lib/sys-limits.h b/lib/sys-limits.h
new file mode 100644
index 0000000..9b6b490
--- /dev/null
+++ b/lib/sys-limits.h
@@ -0,0 +1,42 @@
+/* System call limits
+
+ Copyright 2018-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _GL_SYS_LIMITS_H
+#define _GL_SYS_LIMITS_H
+
+#include <limits.h>
+
+/* Maximum number of bytes to read or write in a single system call.
+ This can be useful for system calls like sendfile on GNU/Linux,
+ which do not handle more than MAX_RW_COUNT bytes correctly.
+ The Linux kernel MAX_RW_COUNT is at least INT_MAX >> 20 << 20,
+ where the 20 comes from the Hexagon port with 1 MiB pages; use that
+ as an approximation, as the exact value may not be available to us.
+
+ Using this also works around a serious Linux bug before 2.6.16; see
+ <https://bugzilla.redhat.com/show_bug.cgi?id=612839>.
+
+ Using this also works around a Tru64 5.1 bug, where attempting
+ to read INT_MAX bytes fails with errno == EINVAL. See
+ <https://lists.gnu.org/r/bug-gnu-utils/2002-04/msg00010.html>.
+
+ Using this is likely to work around similar bugs in other operating
+ systems. */
+
+enum { SYS_BUFSIZE_MAX = INT_MAX >> 20 << 20 };
+
+#endif
diff --git a/lib/sys_file.in.h b/lib/sys_file.in.h
new file mode 100644
index 0000000..e21e159
--- /dev/null
+++ b/lib/sys_file.in.h
@@ -0,0 +1,63 @@
+/* Provide a more complete sys/file.h.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Richard W.M. Jones. */
+
+#ifndef _@GUARD_PREFIX@_SYS_FILE_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_FILE_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_FILE_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_FILE_H
+#define _@GUARD_PREFIX@_SYS_FILE_H
+
+#ifndef LOCK_SH
+/* Operations for the 'flock' call (same as Linux kernel constants). */
+# define LOCK_SH 1 /* Shared lock. */
+# define LOCK_EX 2 /* Exclusive lock. */
+# define LOCK_UN 8 /* Unlock. */
+
+/* Can be OR'd in to one of the above. */
+# define LOCK_NB 4 /* Don't block when locking. */
+#endif
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if @GNULIB_FLOCK@
+/* Apply or remove advisory locks on an open file.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if !@HAVE_FLOCK@
+extern int flock (int fd, int operation);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef flock
+# if HAVE_RAW_DECL_FLOCK
+_GL_WARN_ON_USE (flock, "flock is unportable - "
+ "use gnulib module flock for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_FILE_H */
+#endif /* _@GUARD_PREFIX@_SYS_FILE_H */
diff --git a/lib/sys_ioctl.in.h b/lib/sys_ioctl.in.h
new file mode 100644
index 0000000..8437adf
--- /dev/null
+++ b/lib/sys_ioctl.in.h
@@ -0,0 +1,79 @@
+/* Substitute for and wrapper around <sys/ioctl.h>.
+ Copyright (C) 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_IOCTL_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_IOCTL_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_IOCTL_H
+#define _@GUARD_PREFIX@_SYS_IOCTL_H
+
+/* AIX 5.1 and Solaris 10 declare ioctl() in <unistd.h> and in <stropts.h>,
+ but not in <sys/ioctl.h>.
+ Haiku declares ioctl() in <unistd.h>, but not in <sys/ioctl.h>.
+ But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+#if @GNULIB_IOCTL@
+# if @REPLACE_IOCTL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ioctl
+# define ioctl rpl_ioctl
+# endif
+_GL_FUNCDECL_RPL (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+_GL_CXXALIAS_RPL (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# else
+# if @SYS_IOCTL_H_HAVE_WINSOCK2_H@ || 1
+_GL_FUNCDECL_SYS (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# endif
+_GL_CXXALIAS_SYS (ioctl, int,
+ (int fd, int request, ... /* {void *,char *} arg */));
+# endif
+_GL_CXXALIASWARN (ioctl);
+#elif @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef ioctl
+# define ioctl ioctl_used_without_requesting_gnulib_module_ioctl
+#elif defined GNULIB_POSIXCHECK
+# undef ioctl
+# if HAVE_RAW_DECL_IOCTL
+_GL_WARN_ON_USE (ioctl, "ioctl does not portably work on sockets - "
+ "use gnulib module ioctl for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
+#endif /* _@GUARD_PREFIX@_SYS_IOCTL_H */
diff --git a/lib/sys_random.in.h b/lib/sys_random.in.h
new file mode 100644
index 0000000..a82d716
--- /dev/null
+++ b/lib/sys_random.in.h
@@ -0,0 +1,96 @@
+/* Substitute for <sys/random.h>.
+ Copyright (C) 2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_SYS_RANDOM_H
+
+#if @HAVE_SYS_RANDOM_H@
+
+/* On uClibc, <sys/random.h> assumes prior inclusion of <stddef.h>. */
+# if defined __UCLIBC__
+# include <stddef.h>
+# endif
+/* On Mac OS X 10.5, <sys/random.h> assumes prior inclusion of <sys/types.h>.
+ On Max OS X 10.13, <sys/random.h> assumes prior inclusion of a file that
+ includes <Availability.h>, such as <stdlib.h> or <unistd.h>. */
+# if defined __APPLE__ && defined __MACH__ /* Mac OS X */
+# include <sys/types.h>
+# include <stdlib.h>
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_RANDOM_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_RANDOM_H
+#define _@GUARD_PREFIX@_SYS_RANDOM_H
+
+#include <sys/types.h>
+
+/* Define the GRND_* constants. */
+#ifndef GRND_NONBLOCK
+# define GRND_NONBLOCK 1
+# define GRND_RANDOM 2
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Declare overridden functions. */
+
+
+#if @GNULIB_GETRANDOM@
+/* Fill a buffer with random bytes. */
+# if @REPLACE_GETRANDOM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getrandom
+# define getrandom rpl_getrandom
+# endif
+_GL_FUNCDECL_RPL (getrandom, ssize_t,
+ (void *buffer, size_t length, unsigned int flags)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getrandom, ssize_t,
+ (void *buffer, size_t length, unsigned int flags));
+# else
+# if !@HAVE_GETRANDOM@
+_GL_FUNCDECL_SYS (getrandom, ssize_t,
+ (void *buffer, size_t length, unsigned int flags)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getrandom, ssize_t,
+ (void *buffer, size_t length, unsigned int flags));
+# endif
+_GL_CXXALIASWARN (getrandom);
+#elif defined GNULIB_POSIXCHECK
+# undef getrandom
+# if HAVE_RAW_DECL_GETRANDOM
+_GL_WARN_ON_USE (getrandom, "getrandom is unportable - "
+ "use gnulib module getrandom for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */
+#endif /* _@GUARD_PREFIX@_SYS_RANDOM_H */
diff --git a/lib/sys_select.in.h b/lib/sys_select.in.h
new file mode 100644
index 0000000..ac1e939
--- /dev/null
+++ b/lib/sys_select.in.h
@@ -0,0 +1,326 @@
+/* Substitute for <sys/select.h>.
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+/* On OSF/1 and Solaris 2.6, <sys/types.h> and <sys/time.h>
+ both include <sys/select.h>.
+ On Cygwin, <sys/time.h> includes <sys/select.h>.
+ Simply delegate to the system's header in this case. */
+#if (@HAVE_SYS_SELECT_H@ \
+ && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H \
+ && ((defined __osf__ && defined _SYS_TYPES_H_ \
+ && defined _OSF_SOURCE) \
+ || (defined __sun && defined _SYS_TYPES_H \
+ && (! (defined _XOPEN_SOURCE || defined _POSIX_C_SOURCE) \
+ || defined __EXTENSIONS__))))
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#elif (@HAVE_SYS_SELECT_H@ \
+ && (defined _CYGWIN_SYS_TIME_H \
+ || (!defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H \
+ && ((defined __osf__ && defined _SYS_TIME_H_ \
+ && defined _OSF_SOURCE) \
+ || (defined __sun && defined _SYS_TIME_H \
+ && (! (defined _XOPEN_SOURCE \
+ || defined _POSIX_C_SOURCE) \
+ || defined __EXTENSIONS__))))))
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+/* On IRIX 6.5, <sys/timespec.h> includes <sys/types.h>, which includes
+ <sys/bsd_types.h>, which includes <sys/select.h>. At this point we cannot
+ include <signal.h>, because that includes <internal/signal_core.h>, which
+ gives a syntax error because <sys/timespec.h> has not been completely
+ processed. Simply delegate to the system's header in this case. */
+#elif @HAVE_SYS_SELECT_H@ && defined __sgi && (defined _SYS_BSD_TYPES_H && !defined _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H)
+
+# define _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_BSD_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+/* On OpenBSD 5.0, <pthread.h> includes <sys/types.h>, which includes
+ <sys/select.h>. At this point we cannot include <signal.h>, because that
+ includes gnulib's pthread.h override, which gives a syntax error because
+ /usr/include/pthread.h has not been completely processed. Simply delegate
+ to the system's header in this case. */
+#elif @HAVE_SYS_SELECT_H@ && defined __OpenBSD__ && (defined _PTHREAD_H_ && !defined PTHREAD_MUTEX_INITIALIZER)
+
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#else
+
+#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
+
+/* On many platforms, <sys/select.h> assumes prior inclusion of
+ <sys/types.h>. Also, mingw defines sigset_t there, instead of
+ in <signal.h> where it belongs. */
+#include <sys/types.h>
+
+#if @HAVE_SYS_SELECT_H@
+
+/* On OSF/1 4.0, <sys/select.h> provides only a forward declaration
+ of 'struct timeval', and no definition of this type.
+ Also, Mac OS X, AIX, HP-UX, IRIX, Solaris, Interix declare select()
+ in <sys/time.h>.
+ But avoid namespace pollution on glibc systems and "unknown type
+ name" problems on Cygwin. */
+# if !(defined __GLIBC__ || defined __CYGWIN__)
+# include <sys/time.h>
+# endif
+
+/* On AIX 7 and Solaris 10, <sys/select.h> provides an FD_ZERO implementation
+ that relies on memset(), but without including <string.h>.
+ But in any case avoid namespace pollution on glibc systems. */
+# if (defined __OpenBSD__ || defined _AIX || defined __sun || defined __osf__ || defined __BEOS__) \
+ && ! defined __GLIBC__
+# include <string.h>
+# endif
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SELECT_H@
+
+#endif
+
+/* Get definition of 'sigset_t'.
+ But avoid namespace pollution on glibc systems and "unknown type
+ name" problems on Cygwin.
+ On OS/2 kLIBC, sigset_t is defined in <sys/select.h>, too. In addition,
+ if <sys/param.h> is included, <types.h> -> <sys/types.h> -> <sys/select.h>
+ are included. Then <signal.h> -> <pthread.h> are included by GNULIB. By the
+ way, <pthread.h> requires PAGE_SIZE defined in <sys/param.h>. However,
+ <sys/param.h> has not been processed, yet. As a result, 'PAGE_SIZE'
+ undeclared error occurs in <pthread.h>.
+ Do this after the include_next (for the sake of OpenBSD 5.0) but before
+ the split double-inclusion guard (for the sake of Solaris). */
+#if !((defined __GLIBC__ || defined __CYGWIN__ || defined __KLIBC__) \
+ && !defined __UCLIBC__)
+# include <signal.h>
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_SELECT_H
+#define _@GUARD_PREFIX@_SYS_SELECT_H
+
+#if !@HAVE_SYS_SELECT_H@
+/* A platform that lacks <sys/select.h>. */
+/* Get the 'struct timeval' and 'fd_set' types and the FD_* macros
+ on most platforms. */
+# include <sys/time.h>
+/* On HP-UX 11, <sys/time.h> provides an FD_ZERO implementation
+ that relies on memset(), but without including <string.h>. */
+# if defined __hpux
+# include <string.h>
+# endif
+/* On native Windows platforms:
+ Get the 'fd_set' type.
+ Get the close() declaration before we override it. */
+# if @HAVE_WINSOCK2_H@
+# if !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+# endif
+# include <io.h>
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Fix some definitions from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+
+# if !GNULIB_defined_rpl_fd_isset
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using
+ network sockets. */
+static int
+rpl_fd_isset (SOCKET fd, fd_set * set)
+{
+ u_int i;
+ if (set == NULL)
+ return 0;
+
+ for (i = 0; i < set->fd_count; i++)
+ if (set->fd_array[i] == fd)
+ return 1;
+
+ return 0;
+}
+
+# define GNULIB_defined_rpl_fd_isset 1
+# endif
+
+# undef FD_ISSET
+# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# elif !defined __clang__
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# elif !defined __clang__
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# elif !defined __clang__
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+#endif
+
+
+#if @GNULIB_PSELECT@
+# if @REPLACE_PSELECT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pselect
+# define pselect rpl_pselect
+# endif
+_GL_FUNCDECL_RPL (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+_GL_CXXALIAS_RPL (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# else
+# if !@HAVE_PSELECT@
+_GL_FUNCDECL_SYS (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# endif
+_GL_CXXALIAS_SYS (pselect, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timespec const *restrict, const sigset_t *restrict));
+# endif
+_GL_CXXALIASWARN (pselect);
+#elif defined GNULIB_POSIXCHECK
+# undef pselect
+# if HAVE_RAW_DECL_PSELECT
+_GL_WARN_ON_USE (pselect, "pselect is not portable - "
+ "use gnulib module pselect for portability");
+# endif
+#endif
+
+#if @GNULIB_SELECT@
+# if @REPLACE_SELECT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select rpl_select
+# endif
+_GL_FUNCDECL_RPL (select, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ struct timeval *restrict));
+_GL_CXXALIAS_RPL (select, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ timeval *restrict));
+# else
+_GL_CXXALIAS_SYS (select, int,
+ (int, fd_set *restrict, fd_set *restrict, fd_set *restrict,
+ timeval *restrict));
+# endif
+_GL_CXXALIASWARN (select);
+#elif @HAVE_WINSOCK2_H@
+# undef select
+# define select select_used_without_requesting_gnulib_module_select
+#elif defined GNULIB_POSIXCHECK
+# undef select
+# if HAVE_RAW_DECL_SELECT
+_GL_WARN_ON_USE (select, "select is not always POSIX compliant - "
+ "use gnulib module select for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
+#endif /* _@GUARD_PREFIX@_SYS_SELECT_H */
+#endif /* OSF/1 */
diff --git a/lib/sys_socket.c b/lib/sys_socket.c
new file mode 100644
index 0000000..3b261da
--- /dev/null
+++ b/lib/sys_socket.c
@@ -0,0 +1,4 @@
+#include <config.h>
+#define _GL_SYS_SOCKET_INLINE _GL_EXTERN_INLINE
+#include "sys/socket.h"
+typedef int dummy;
diff --git a/lib/sys_socket.in.h b/lib/sys_socket.in.h
new file mode 100644
index 0000000..136e6e6
--- /dev/null
+++ b/lib/sys_socket.in.h
@@ -0,0 +1,734 @@
+/* Provide a sys/socket header file for systems lacking it (read: MinGW)
+ and for systems where it is incomplete.
+ Copyright (C) 2005-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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 file is supposed to be used on platforms that lack <sys/socket.h>,
+ on platforms where <sys/socket.h> cannot be included standalone, and on
+ platforms where <sys/socket.h> does not provide all necessary definitions.
+ It is intended to provide definitions and prototypes needed by an
+ application. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+/* Special invocation convention:
+ - On Cygwin 1.5.x we have a sequence of nested includes
+ <sys/socket.h> -> <cygwin/socket.h> -> <asm/socket.h> -> <cygwin/if.h>,
+ and the latter includes <sys/socket.h>. In this situation, the functions
+ are not yet declared, therefore we cannot provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
+
+#if @HAVE_SYS_SOCKET_H@
+
+# define _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+
+/* On many platforms, <sys/socket.h> assumes prior inclusion of
+ <sys/types.h>. */
+# include <sys/types.h>
+
+/* On FreeBSD 6.4, <sys/socket.h> defines some macros that assume that NULL
+ is defined. */
+# include <stddef.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_SOCKET_H@
+
+# undef _GL_ALREADY_INCLUDING_SYS_SOCKET_H
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_SOCKET_H
+#define _@GUARD_PREFIX@_SYS_SOCKET_H
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_SYS_SOCKET_INLINE
+# define _GL_SYS_SOCKET_INLINE _GL_INLINE
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#if !@HAVE_SA_FAMILY_T@
+# if !GNULIB_defined_sa_family_t
+/* On OS/2 kLIBC, sa_family_t is unsigned char unless TCPV40HDRS is defined. */
+# if !defined __KLIBC__ || defined TCPV40HDRS
+typedef unsigned short sa_family_t;
+# else
+typedef unsigned char sa_family_t;
+# endif
+# define GNULIB_defined_sa_family_t 1
+# endif
+#endif
+
+#if @HAVE_STRUCT_SOCKADDR_STORAGE@
+/* Make the 'struct sockaddr_storage' field 'ss_family' visible on AIX 7.1. */
+# if !@HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+# ifndef ss_family
+# define ss_family __ss_family
+# endif
+# endif
+#else
+# include <stdalign.h>
+/* Code taken from glibc sysdeps/unix/sysv/linux/bits/socket.h on
+ 2009-05-08, licensed under LGPLv2.1+, plus portability fixes. */
+# define __ss_aligntype unsigned long int
+# define _SS_SIZE 256
+# define _SS_PADSIZE \
+ (_SS_SIZE - ((sizeof (sa_family_t) >= alignof (__ss_aligntype) \
+ ? sizeof (sa_family_t) \
+ : alignof (__ss_aligntype)) \
+ + sizeof (__ss_aligntype)))
+
+# if !GNULIB_defined_struct_sockaddr_storage
+struct sockaddr_storage
+{
+ sa_family_t ss_family; /* Address family, etc. */
+ __ss_aligntype __ss_align; /* Force desired alignment. */
+ char __ss_padding[_SS_PADSIZE];
+};
+# define GNULIB_defined_struct_sockaddr_storage 1
+# endif
+
+#endif
+
+/* Get struct iovec. */
+/* But avoid namespace pollution on glibc systems. */
+#if ! defined __GLIBC__
+# include <sys/uio.h>
+#endif
+
+#if @HAVE_SYS_SOCKET_H@
+
+/* A platform that has <sys/socket.h>. */
+
+/* For shutdown(). */
+# if !defined SHUT_RD
+# define SHUT_RD 0
+# endif
+# if !defined SHUT_WR
+# define SHUT_WR 1
+# endif
+# if !defined SHUT_RDWR
+# define SHUT_RDWR 2
+# endif
+
+# ifdef __VMS /* OpenVMS */
+# ifndef CMSG_SPACE
+# define CMSG_SPACE(length) _CMSG_SPACE(length)
+# endif
+# ifndef CMSG_LEN
+# define CMSG_LEN(length) _CMSG_LEN(length)
+# endif
+# endif
+
+#else
+
+# ifdef __CYGWIN__
+# error "Cygwin does have a sys/socket.h, doesn't it?!?"
+# endif
+
+/* A platform that lacks <sys/socket.h>.
+
+ Currently only MinGW is supported. See the gnulib manual regarding
+ Windows sockets. MinGW has the header files winsock2.h and
+ ws2tcpip.h that declare the sys/socket.h definitions we need. Note
+ that you can influence which definitions you get by setting the
+ WINVER symbol before including these two files. For example,
+ getaddrinfo is only available if _WIN32_WINNT >= 0x0501 (that
+ symbol is set indirectly through WINVER). You can set this by
+ adding AC_DEFINE(WINVER, 0x0501) to configure.ac. Note that your
+ code may not run on older Windows releases then. My Windows 2000
+ box was not able to run the code, for example. The situation is
+ slightly confusing because
+ <https://docs.microsoft.com/en-us/windows/desktop/api/ws2tcpip/nf-ws2tcpip-getaddrinfo>
+ suggests that getaddrinfo should be available on all Windows
+ releases. */
+
+# if @HAVE_WINSOCK2_H@
+# include <winsock2.h>
+# endif
+# if @HAVE_WS2TCPIP_H@
+# include <ws2tcpip.h>
+# endif
+
+/* For shutdown(). */
+# if !defined SHUT_RD && defined SD_RECEIVE
+# define SHUT_RD SD_RECEIVE
+# endif
+# if !defined SHUT_WR && defined SD_SEND
+# define SHUT_WR SD_SEND
+# endif
+# if !defined SHUT_RDWR && defined SD_BOTH
+# define SHUT_RDWR SD_BOTH
+# endif
+
+# if @HAVE_WINSOCK2_H@
+/* Include headers needed by the emulation code. */
+# include <sys/types.h>
+# include <io.h>
+/* If these headers don't define socklen_t, <config.h> does. */
+# endif
+
+/* Rudimentary 'struct msghdr'; this works as long as you don't try to
+ access msg_control or msg_controllen. */
+struct msghdr {
+ void *msg_name;
+ socklen_t msg_namelen;
+ struct iovec *msg_iov;
+ int msg_iovlen;
+ int msg_flags;
+};
+
+#endif
+
+/* Ensure SO_REUSEPORT is defined. */
+/* For the subtle differences between SO_REUSEPORT and SO_REUSEADDR, see
+ https://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t
+ and https://lwn.net/Articles/542629/
+ */
+#ifndef SO_REUSEPORT
+# define SO_REUSEPORT SO_REUSEADDR
+#endif
+
+/* Fix some definitions from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+
+# if !GNULIB_defined_rpl_fd_isset
+
+/* Re-define FD_ISSET to avoid a WSA call while we are not using
+ network sockets. */
+_GL_SYS_SOCKET_INLINE int
+rpl_fd_isset (SOCKET fd, fd_set * set)
+{
+ u_int i;
+ if (set == NULL)
+ return 0;
+
+ for (i = 0; i < set->fd_count; i++)
+ if (set->fd_array[i] == fd)
+ return 1;
+
+ return 0;
+}
+
+# define GNULIB_defined_rpl_fd_isset 1
+# endif
+
+# undef FD_ISSET
+# define FD_ISSET(fd, set) rpl_fd_isset(fd, set)
+
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# elif !defined __clang__
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+/* Wrap everything else to use libc file descriptors for sockets. */
+
+#if @GNULIB_SOCKET@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket rpl_socket
+# endif
+_GL_FUNCDECL_RPL (socket, int, (int domain, int type, int protocol));
+_GL_CXXALIAS_RPL (socket, int, (int domain, int type, int protocol));
+# else
+_GL_CXXALIAS_SYS (socket, int, (int domain, int type, int protocol));
+# endif
+_GL_CXXALIASWARN (socket);
+#elif @HAVE_WINSOCK2_H@
+# undef socket
+# define socket socket_used_without_requesting_gnulib_module_socket
+#elif defined GNULIB_POSIXCHECK
+# undef socket
+# if HAVE_RAW_DECL_SOCKET
+_GL_WARN_ON_USE (socket, "socket is not always POSIX compliant - "
+ "use gnulib module socket for portability");
+# endif
+#endif
+
+#if @GNULIB_CONNECT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef connect
+# define connect rpl_connect
+# endif
+_GL_FUNCDECL_RPL (connect, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (connect, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen));
+# else
+/* Need to cast, because on NonStop Kernel, the third parameter is
+ size_t addrlen. */
+_GL_CXXALIAS_SYS_CAST (connect, int,
+ (int fd,
+ const struct sockaddr *addr, socklen_t addrlen));
+# endif
+_GL_CXXALIASWARN (connect);
+#elif @HAVE_WINSOCK2_H@
+# undef connect
+# define connect socket_used_without_requesting_gnulib_module_connect
+#elif defined GNULIB_POSIXCHECK
+# undef connect
+# if HAVE_RAW_DECL_CONNECT
+_GL_WARN_ON_USE (connect, "connect is not always POSIX compliant - "
+ "use gnulib module connect for portability");
+# endif
+#endif
+
+#if @GNULIB_ACCEPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef accept
+# define accept rpl_accept
+# endif
+_GL_FUNCDECL_RPL (accept, int,
+ (int fd,
+ struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+_GL_CXXALIAS_RPL (accept, int,
+ (int fd,
+ struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (accept, int,
+ (int fd,
+ struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# endif
+_GL_CXXALIASWARN (accept);
+#elif @HAVE_WINSOCK2_H@
+# undef accept
+# define accept accept_used_without_requesting_gnulib_module_accept
+#elif defined GNULIB_POSIXCHECK
+# undef accept
+# if HAVE_RAW_DECL_ACCEPT
+_GL_WARN_ON_USE (accept, "accept is not always POSIX compliant - "
+ "use gnulib module accept for portability");
+# endif
+#endif
+
+#if @GNULIB_BIND@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef bind
+# define bind rpl_bind
+# endif
+_GL_FUNCDECL_RPL (bind, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (bind, int,
+ (int fd, const struct sockaddr *addr, socklen_t addrlen));
+# else
+/* Need to cast, because on NonStop Kernel, the third parameter is
+ size_t addrlen. */
+_GL_CXXALIAS_SYS_CAST (bind, int,
+ (int fd,
+ const struct sockaddr *addr, socklen_t addrlen));
+# endif
+_GL_CXXALIASWARN (bind);
+#elif @HAVE_WINSOCK2_H@
+# undef bind
+# define bind bind_used_without_requesting_gnulib_module_bind
+#elif defined GNULIB_POSIXCHECK
+# undef bind
+# if HAVE_RAW_DECL_BIND
+_GL_WARN_ON_USE (bind, "bind is not always POSIX compliant - "
+ "use gnulib module bind for portability");
+# endif
+#endif
+
+#if @GNULIB_GETPEERNAME@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpeername
+# define getpeername rpl_getpeername
+# endif
+_GL_FUNCDECL_RPL (getpeername, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (getpeername, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (getpeername, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# endif
+_GL_CXXALIASWARN (getpeername);
+#elif @HAVE_WINSOCK2_H@
+# undef getpeername
+# define getpeername getpeername_used_without_requesting_gnulib_module_getpeername
+#elif defined GNULIB_POSIXCHECK
+# undef getpeername
+# if HAVE_RAW_DECL_GETPEERNAME
+_GL_WARN_ON_USE (getpeername, "getpeername is not always POSIX compliant - "
+ "use gnulib module getpeername for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSOCKNAME@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getsockname
+# define getsockname rpl_getsockname
+# endif
+_GL_FUNCDECL_RPL (getsockname, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (getsockname, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the third parameter is
+ void *addrlen. */
+_GL_CXXALIAS_SYS_CAST (getsockname, int,
+ (int fd, struct sockaddr *restrict addr,
+ socklen_t *restrict addrlen));
+# endif
+_GL_CXXALIASWARN (getsockname);
+#elif @HAVE_WINSOCK2_H@
+# undef getsockname
+# define getsockname getsockname_used_without_requesting_gnulib_module_getsockname
+#elif defined GNULIB_POSIXCHECK
+# undef getsockname
+# if HAVE_RAW_DECL_GETSOCKNAME
+_GL_WARN_ON_USE (getsockname, "getsockname is not always POSIX compliant - "
+ "use gnulib module getsockname for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getsockopt
+# define getsockopt rpl_getsockopt
+# endif
+_GL_FUNCDECL_RPL (getsockopt, int,
+ (int fd, int level, int optname,
+ void *restrict optval, socklen_t *restrict optlen)
+ _GL_ARG_NONNULL ((4, 5)));
+_GL_CXXALIAS_RPL (getsockopt, int,
+ (int fd, int level, int optname,
+ void *restrict optval, socklen_t *restrict optlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the fifth parameter is
+ void *optlen. */
+_GL_CXXALIAS_SYS_CAST (getsockopt, int,
+ (int fd, int level, int optname,
+ void *restrict optval, socklen_t *restrict optlen));
+# endif
+_GL_CXXALIASWARN (getsockopt);
+#elif @HAVE_WINSOCK2_H@
+# undef getsockopt
+# define getsockopt getsockopt_used_without_requesting_gnulib_module_getsockopt
+#elif defined GNULIB_POSIXCHECK
+# undef getsockopt
+# if HAVE_RAW_DECL_GETSOCKOPT
+_GL_WARN_ON_USE (getsockopt, "getsockopt is not always POSIX compliant - "
+ "use gnulib module getsockopt for portability");
+# endif
+#endif
+
+#if @GNULIB_LISTEN@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef listen
+# define listen rpl_listen
+# endif
+_GL_FUNCDECL_RPL (listen, int, (int fd, int backlog));
+_GL_CXXALIAS_RPL (listen, int, (int fd, int backlog));
+# else
+_GL_CXXALIAS_SYS (listen, int, (int fd, int backlog));
+# endif
+_GL_CXXALIASWARN (listen);
+#elif @HAVE_WINSOCK2_H@
+# undef listen
+# define listen listen_used_without_requesting_gnulib_module_listen
+#elif defined GNULIB_POSIXCHECK
+# undef listen
+# if HAVE_RAW_DECL_LISTEN
+_GL_WARN_ON_USE (listen, "listen is not always POSIX compliant - "
+ "use gnulib module listen for portability");
+# endif
+#endif
+
+#if @GNULIB_RECV@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef recv
+# define recv rpl_recv
+# endif
+_GL_FUNCDECL_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
+# else
+/* Need to cast, because on HP-UX 11.31 the return type may be
+ int,
+ depending on compiler options. */
+_GL_CXXALIAS_SYS_CAST (recv, ssize_t, (int fd, void *buf, size_t len, int flags));
+# endif
+_GL_CXXALIASWARN (recv);
+#elif @HAVE_WINSOCK2_H@
+# undef recv
+# define recv recv_used_without_requesting_gnulib_module_recv
+#elif defined GNULIB_POSIXCHECK
+# undef recv
+# if HAVE_RAW_DECL_RECV
+_GL_WARN_ON_USE (recv, "recv is not always POSIX compliant - "
+ "use gnulib module recv for portability");
+# endif
+#endif
+
+#if @GNULIB_SEND@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef send
+# define send rpl_send
+# endif
+_GL_FUNCDECL_RPL (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags));
+# else
+/* Need to cast, because on HP-UX 11.31 the return type may be
+ int,
+ depending on compiler options. */
+_GL_CXXALIAS_SYS_CAST (send, ssize_t,
+ (int fd, const void *buf, size_t len, int flags));
+# endif
+_GL_CXXALIASWARN (send);
+#elif @HAVE_WINSOCK2_H@
+# undef send
+# define send send_used_without_requesting_gnulib_module_send
+#elif defined GNULIB_POSIXCHECK
+# undef send
+# if HAVE_RAW_DECL_SEND
+_GL_WARN_ON_USE (send, "send is not always POSIX compliant - "
+ "use gnulib module send for portability");
+# endif
+#endif
+
+#if @GNULIB_RECVFROM@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef recvfrom
+# define recvfrom rpl_recvfrom
+# endif
+_GL_FUNCDECL_RPL (recvfrom, ssize_t,
+ (int fd, void *restrict buf, size_t len, int flags,
+ struct sockaddr *restrict from,
+ socklen_t *restrict fromlen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (recvfrom, ssize_t,
+ (int fd, void *restrict buf, size_t len, int flags,
+ struct sockaddr *restrict from,
+ socklen_t *restrict fromlen));
+# else
+/* Need to cast, because on Solaris 10 systems, the sixth parameter is
+ void *fromlen. */
+_GL_CXXALIAS_SYS_CAST (recvfrom, ssize_t,
+ (int fd, void *restrict buf, size_t len, int flags,
+ struct sockaddr *restrict from,
+ socklen_t *restrict fromlen));
+# endif
+_GL_CXXALIASWARN (recvfrom);
+#elif @HAVE_WINSOCK2_H@
+# undef recvfrom
+# define recvfrom recvfrom_used_without_requesting_gnulib_module_recvfrom
+#elif defined GNULIB_POSIXCHECK
+# undef recvfrom
+# if HAVE_RAW_DECL_RECVFROM
+_GL_WARN_ON_USE (recvfrom, "recvfrom is not always POSIX compliant - "
+ "use gnulib module recvfrom for portability");
+# endif
+#endif
+
+#if @GNULIB_SENDTO@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sendto
+# define sendto rpl_sendto
+# endif
+_GL_FUNCDECL_RPL (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen));
+# else
+/* Need to cast, because on NonStop Kernel, the sixth parameter is
+ size_t tolen. */
+_GL_CXXALIAS_SYS_CAST (sendto, ssize_t,
+ (int fd, const void *buf, size_t len, int flags,
+ const struct sockaddr *to, socklen_t tolen));
+# endif
+_GL_CXXALIASWARN (sendto);
+#elif @HAVE_WINSOCK2_H@
+# undef sendto
+# define sendto sendto_used_without_requesting_gnulib_module_sendto
+#elif defined GNULIB_POSIXCHECK
+# undef sendto
+# if HAVE_RAW_DECL_SENDTO
+_GL_WARN_ON_USE (sendto, "sendto is not always POSIX compliant - "
+ "use gnulib module sendto for portability");
+# endif
+#endif
+
+#if @GNULIB_SETSOCKOPT@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef setsockopt
+# define setsockopt rpl_setsockopt
+# endif
+_GL_FUNCDECL_RPL (setsockopt, int, (int fd, int level, int optname,
+ const void * optval, socklen_t optlen)
+ _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (setsockopt, int, (int fd, int level, int optname,
+ const void * optval, socklen_t optlen));
+# else
+/* Need to cast, because on NonStop Kernel, the fifth parameter is
+ size_t optlen. */
+_GL_CXXALIAS_SYS_CAST (setsockopt, int,
+ (int fd, int level, int optname,
+ const void * optval, socklen_t optlen));
+# endif
+_GL_CXXALIASWARN (setsockopt);
+#elif @HAVE_WINSOCK2_H@
+# undef setsockopt
+# define setsockopt setsockopt_used_without_requesting_gnulib_module_setsockopt
+#elif defined GNULIB_POSIXCHECK
+# undef setsockopt
+# if HAVE_RAW_DECL_SETSOCKOPT
+_GL_WARN_ON_USE (setsockopt, "setsockopt is not always POSIX compliant - "
+ "use gnulib module setsockopt for portability");
+# endif
+#endif
+
+#if @GNULIB_SHUTDOWN@
+# if @HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef shutdown
+# define shutdown rpl_shutdown
+# endif
+_GL_FUNCDECL_RPL (shutdown, int, (int fd, int how));
+_GL_CXXALIAS_RPL (shutdown, int, (int fd, int how));
+# else
+_GL_CXXALIAS_SYS (shutdown, int, (int fd, int how));
+# endif
+_GL_CXXALIASWARN (shutdown);
+#elif @HAVE_WINSOCK2_H@
+# undef shutdown
+# define shutdown shutdown_used_without_requesting_gnulib_module_shutdown
+#elif defined GNULIB_POSIXCHECK
+# undef shutdown
+# if HAVE_RAW_DECL_SHUTDOWN
+_GL_WARN_ON_USE (shutdown, "shutdown is not always POSIX compliant - "
+ "use gnulib module shutdown for portability");
+# endif
+#endif
+
+#if @GNULIB_ACCEPT4@
+/* Accept a connection on a socket, with specific opening flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ See also the Linux man page at
+ <https://www.kernel.org/doc/man-pages/online/pages/man2/accept4.2.html>. */
+# if @HAVE_ACCEPT4@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define accept4 rpl_accept4
+# endif
+_GL_FUNCDECL_RPL (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+_GL_CXXALIAS_RPL (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+# else
+_GL_FUNCDECL_SYS (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+_GL_CXXALIAS_SYS (accept4, int,
+ (int sockfd, struct sockaddr *addr, socklen_t *addrlen,
+ int flags));
+# endif
+_GL_CXXALIASWARN (accept4);
+#elif defined GNULIB_POSIXCHECK
+# undef accept4
+# if HAVE_RAW_DECL_ACCEPT4
+_GL_WARN_ON_USE (accept4, "accept4 is unportable - "
+ "use gnulib module accept4 for portability");
+# endif
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
+#endif /* _@GUARD_PREFIX@_SYS_SOCKET_H */
+#endif
diff --git a/lib/sys_stat.in.h b/lib/sys_stat.in.h
new file mode 100644
index 0000000..2ca27be
--- /dev/null
+++ b/lib/sys_stat.in.h
@@ -0,0 +1,906 @@
+/* Provide a more complete sys/stat.h header file.
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Eric Blake, Paul Eggert, and Jim Meyering. */
+
+/* This file is supposed to be used on platforms where <sys/stat.h> is
+ incomplete. It is intended to provide definitions and prototypes
+ needed by an application. Start with what the system provides. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_sys_stat_h
+/* Special invocation convention. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_STAT_H
+
+/* Get nlink_t.
+ May also define off_t to a 64-bit type on native Windows. */
+#include <sys/types.h>
+
+/* Get struct timespec. */
+#include <time.h>
+
+/* The include_next requires a split double-inclusion guard. */
+#@INCLUDE_NEXT@ @NEXT_SYS_STAT_H@
+
+#ifndef _@GUARD_PREFIX@_SYS_STAT_H
+#define _@GUARD_PREFIX@_SYS_STAT_H
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Before doing "#define mknod rpl_mknod" below, we need to include all
+ headers that may declare mknod(). OS/2 kLIBC declares mknod() in
+ <unistd.h>, not in <sys/stat.h>. */
+#ifdef __KLIBC__
+# include <unistd.h>
+#endif
+
+/* Before doing "#define mkdir rpl_mkdir" below, we need to include all
+ headers that may declare mkdir(). Native Windows platforms declare mkdir
+ in <io.h> and/or <direct.h>, not in <sys/stat.h>. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <io.h> /* mingw32, mingw64 */
+# include <direct.h> /* mingw64, MSVC 9 */
+#endif
+
+/* Native Windows platforms declare umask() in <io.h>. */
+#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+/* Large File Support on native Windows. */
+#if @WINDOWS_64_BIT_ST_SIZE@
+# define stat _stati64
+#endif
+
+/* Optionally, override 'struct stat' on native Windows. */
+#if @GNULIB_OVERRIDES_STRUCT_STAT@
+
+# undef stat
+# if @GNULIB_STAT@
+# define stat rpl_stat
+# else
+ /* Provoke a clear link error if stat() is used as a function and
+ module 'stat' is not in use. */
+# define stat stat_used_without_requesting_gnulib_module_stat
+# endif
+
+# if !GNULIB_defined_struct_stat
+struct stat
+{
+ dev_t st_dev;
+ ino_t st_ino;
+ mode_t st_mode;
+ nlink_t st_nlink;
+# if 0
+ uid_t st_uid;
+# else /* uid_t is not defined by default on native Windows. */
+ short st_uid;
+# endif
+# if 0
+ gid_t st_gid;
+# else /* gid_t is not defined by default on native Windows. */
+ short st_gid;
+# endif
+ dev_t st_rdev;
+ off_t st_size;
+# if 0
+ blksize_t st_blksize;
+ blkcnt_t st_blocks;
+# endif
+
+# if @WINDOWS_STAT_TIMESPEC@
+ struct timespec st_atim;
+ struct timespec st_mtim;
+ struct timespec st_ctim;
+# else
+ time_t st_atime;
+ time_t st_mtime;
+ time_t st_ctime;
+# endif
+};
+# if @WINDOWS_STAT_TIMESPEC@
+# define st_atime st_atim.tv_sec
+# define st_mtime st_mtim.tv_sec
+# define st_ctime st_ctim.tv_sec
+ /* Indicator, for gnulib internal purposes. */
+# define _GL_WINDOWS_STAT_TIMESPEC 1
+# endif
+# define GNULIB_defined_struct_stat 1
+# endif
+
+/* Other possible values of st_mode. */
+# if 0
+# define _S_IFBLK 0x6000
+# endif
+# if 0
+# define _S_IFLNK 0xA000
+# endif
+# if 0
+# define _S_IFSOCK 0xC000
+# endif
+
+#endif
+
+#ifndef S_IFIFO
+# ifdef _S_IFIFO
+# define S_IFIFO _S_IFIFO
+# endif
+#endif
+
+#ifndef S_IFMT
+# define S_IFMT 0170000
+#endif
+
+#if STAT_MACROS_BROKEN
+# undef S_ISBLK
+# undef S_ISCHR
+# undef S_ISDIR
+# undef S_ISFIFO
+# undef S_ISLNK
+# undef S_ISNAM
+# undef S_ISMPB
+# undef S_ISMPC
+# undef S_ISNWK
+# undef S_ISREG
+# undef S_ISSOCK
+#endif
+
+#ifndef S_ISBLK
+# ifdef S_IFBLK
+# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
+# else
+# define S_ISBLK(m) 0
+# endif
+#endif
+
+#ifndef S_ISCHR
+# ifdef S_IFCHR
+# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
+# else
+# define S_ISCHR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDIR
+# ifdef S_IFDIR
+# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+# else
+# define S_ISDIR(m) 0
+# endif
+#endif
+
+#ifndef S_ISDOOR /* Solaris 2.5 and up */
+# define S_ISDOOR(m) 0
+#endif
+
+#ifndef S_ISFIFO
+# ifdef S_IFIFO
+# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+# else
+# define S_ISFIFO(m) 0
+# endif
+#endif
+
+#ifndef S_ISLNK
+# ifdef S_IFLNK
+# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
+# else
+# define S_ISLNK(m) 0
+# endif
+#endif
+
+#ifndef S_ISMPB /* V7 */
+# ifdef S_IFMPB
+# define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
+# define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
+# else
+# define S_ISMPB(m) 0
+# define S_ISMPC(m) 0
+# endif
+#endif
+
+#ifndef S_ISMPX /* AIX */
+# define S_ISMPX(m) 0
+#endif
+
+#ifndef S_ISNAM /* Xenix */
+# ifdef S_IFNAM
+# define S_ISNAM(m) (((m) & S_IFMT) == S_IFNAM)
+# else
+# define S_ISNAM(m) 0
+# endif
+#endif
+
+#ifndef S_ISNWK /* HP/UX */
+# ifdef S_IFNWK
+# define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
+# else
+# define S_ISNWK(m) 0
+# endif
+#endif
+
+#ifndef S_ISPORT /* Solaris 10 and up */
+# define S_ISPORT(m) 0
+#endif
+
+#ifndef S_ISREG
+# ifdef S_IFREG
+# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+# else
+# define S_ISREG(m) 0
+# endif
+#endif
+
+#ifndef S_ISSOCK
+# ifdef S_IFSOCK
+# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+# else
+# define S_ISSOCK(m) 0
+# endif
+#endif
+
+
+#ifndef S_TYPEISMQ
+# define S_TYPEISMQ(p) 0
+#endif
+
+#ifndef S_TYPEISTMO
+# define S_TYPEISTMO(p) 0
+#endif
+
+
+#ifndef S_TYPEISSEM
+# ifdef S_INSEM
+# define S_TYPEISSEM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSEM)
+# else
+# define S_TYPEISSEM(p) 0
+# endif
+#endif
+
+#ifndef S_TYPEISSHM
+# ifdef S_INSHD
+# define S_TYPEISSHM(p) (S_ISNAM ((p)->st_mode) && (p)->st_rdev == S_INSHD)
+# else
+# define S_TYPEISSHM(p) 0
+# endif
+#endif
+
+/* high performance ("contiguous data") */
+#ifndef S_ISCTG
+# define S_ISCTG(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with data */
+#ifndef S_ISOFD
+# define S_ISOFD(p) 0
+#endif
+
+/* Cray DMF (data migration facility): off line, with no data */
+#ifndef S_ISOFL
+# define S_ISOFL(p) 0
+#endif
+
+/* 4.4BSD whiteout */
+#ifndef S_ISWHT
+# define S_ISWHT(m) 0
+#endif
+
+/* If any of the following are undefined,
+ define them to their de facto standard values. */
+#if !S_ISUID
+# define S_ISUID 04000
+#endif
+#if !S_ISGID
+# define S_ISGID 02000
+#endif
+
+/* S_ISVTX is a common extension to POSIX. */
+#ifndef S_ISVTX
+# define S_ISVTX 01000
+#endif
+
+#if !S_IRUSR && S_IREAD
+# define S_IRUSR S_IREAD
+#endif
+#if !S_IRUSR
+# define S_IRUSR 00400
+#endif
+#if !S_IRGRP
+# define S_IRGRP (S_IRUSR >> 3)
+#endif
+#if !S_IROTH
+# define S_IROTH (S_IRUSR >> 6)
+#endif
+
+#if !S_IWUSR && S_IWRITE
+# define S_IWUSR S_IWRITE
+#endif
+#if !S_IWUSR
+# define S_IWUSR 00200
+#endif
+#if !S_IWGRP
+# define S_IWGRP (S_IWUSR >> 3)
+#endif
+#if !S_IWOTH
+# define S_IWOTH (S_IWUSR >> 6)
+#endif
+
+#if !S_IXUSR && S_IEXEC
+# define S_IXUSR S_IEXEC
+#endif
+#if !S_IXUSR
+# define S_IXUSR 00100
+#endif
+#if !S_IXGRP
+# define S_IXGRP (S_IXUSR >> 3)
+#endif
+#if !S_IXOTH
+# define S_IXOTH (S_IXUSR >> 6)
+#endif
+
+#if !S_IRWXU
+# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
+#endif
+#if !S_IRWXG
+# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
+#endif
+#if !S_IRWXO
+# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+#endif
+
+/* Although S_IXUGO and S_IRWXUGO are not specified by POSIX and are
+ not implemented in GNU/Linux, some Gnulib-using apps use the macros. */
+#if !S_IXUGO
+# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
+#endif
+#ifndef S_IRWXUGO
+# define S_IRWXUGO (S_IRWXU | S_IRWXG | S_IRWXO)
+#endif
+
+/* Macros for futimens and utimensat. */
+#ifndef UTIME_NOW
+# define UTIME_NOW (-1)
+# define UTIME_OMIT (-2)
+#endif
+
+
+#if @GNULIB_MDA_CHMOD@
+/* On native Windows, map 'chmod' to '_chmod', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::chmod always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chmod
+# define chmod _chmod
+# endif
+/* Need to cast, because in mingw the last argument is 'int mode'. */
+_GL_CXXALIAS_MDA_CAST (chmod, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (chmod, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (chmod);
+#endif
+
+
+#if @GNULIB_FCHMODAT@
+# if @REPLACE_FCHMODAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fchmodat
+# define fchmodat rpl_fchmodat
+# endif
+_GL_FUNCDECL_RPL (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag));
+# else
+# if !@HAVE_FCHMODAT@
+_GL_FUNCDECL_SYS (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (fchmodat, int,
+ (int fd, char const *file, mode_t mode, int flag));
+# endif
+_GL_CXXALIASWARN (fchmodat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchmodat
+# if HAVE_RAW_DECL_FCHMODAT
+_GL_WARN_ON_USE (fchmodat, "fchmodat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSTAT@
+# if @REPLACE_FSTAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fstat
+# define fstat rpl_fstat
+# endif
+_GL_FUNCDECL_RPL (fstat, int, (int fd, struct stat *buf) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fstat, int, (int fd, struct stat *buf));
+# else
+_GL_CXXALIAS_SYS (fstat, int, (int fd, struct stat *buf));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fstat);
+# endif
+#elif @GNULIB_OVERRIDES_STRUCT_STAT@
+# undef fstat
+# define fstat fstat_used_without_requesting_gnulib_module_fstat
+#elif @WINDOWS_64_BIT_ST_SIZE@
+/* Above, we define stat to _stati64. */
+# define fstat _fstati64
+#elif defined GNULIB_POSIXCHECK
+# undef fstat
+# if HAVE_RAW_DECL_FSTAT
+_GL_WARN_ON_USE (fstat, "fstat has portability problems - "
+ "use gnulib module fstat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSTATAT@
+# if @REPLACE_FSTATAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fstatat
+# define fstatat rpl_fstatat
+# endif
+_GL_FUNCDECL_RPL (fstatat, int,
+ (int fd, char const *restrict name, struct stat *restrict st,
+ int flags)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (fstatat, int,
+ (int fd, char const *restrict name, struct stat *restrict st,
+ int flags));
+# else
+# if !@HAVE_FSTATAT@
+_GL_FUNCDECL_SYS (fstatat, int,
+ (int fd, char const *restrict name, struct stat *restrict st,
+ int flags)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (fstatat, int,
+ (int fd, char const *restrict name, struct stat *restrict st,
+ int flags));
+# endif
+_GL_CXXALIASWARN (fstatat);
+#elif @GNULIB_OVERRIDES_STRUCT_STAT@
+# undef fstatat
+# define fstatat fstatat_used_without_requesting_gnulib_module_fstatat
+#elif defined GNULIB_POSIXCHECK
+# undef fstatat
+# if HAVE_RAW_DECL_FSTATAT
+_GL_WARN_ON_USE (fstatat, "fstatat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FUTIMENS@
+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our futimens
+ implementation relies on futimesat, which on Solaris 10 makes an invocation
+ to futimens that is meant to invoke the libc's futimens(), not gnulib's
+ futimens(). */
+# if @REPLACE_FUTIMENS@ || (!@HAVE_FUTIMENS@ && defined __sun)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef futimens
+# define futimens rpl_futimens
+# endif
+_GL_FUNCDECL_RPL (futimens, int, (int fd, struct timespec const times[2]));
+_GL_CXXALIAS_RPL (futimens, int, (int fd, struct timespec const times[2]));
+# else
+# if !@HAVE_FUTIMENS@
+_GL_FUNCDECL_SYS (futimens, int, (int fd, struct timespec const times[2]));
+# endif
+_GL_CXXALIAS_SYS (futimens, int, (int fd, struct timespec const times[2]));
+# endif
+# if @HAVE_FUTIMENS@
+_GL_CXXALIASWARN (futimens);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef futimens
+# if HAVE_RAW_DECL_FUTIMENS
+_GL_WARN_ON_USE (futimens, "futimens is not portable - "
+ "use gnulib module futimens for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETUMASK@
+# if !@HAVE_GETUMASK@
+_GL_FUNCDECL_SYS (getumask, mode_t, (void));
+# endif
+_GL_CXXALIAS_SYS (getumask, mode_t, (void));
+# if @HAVE_GETUMASK@
+_GL_CXXALIASWARN (getumask);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getumask
+# if HAVE_RAW_DECL_GETUMASK
+_GL_WARN_ON_USE (getumask, "getumask is not portable - "
+ "use gnulib module getumask for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHMOD@
+/* Change the mode of FILENAME to MODE, without dereferencing it if FILENAME
+ denotes a symbolic link. */
+# if !@HAVE_LCHMOD@ || defined __hpux
+_GL_FUNCDECL_SYS (lchmod, int, (const char *filename, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (lchmod, int, (const char *filename, mode_t mode));
+_GL_CXXALIASWARN (lchmod);
+#elif defined GNULIB_POSIXCHECK
+# undef lchmod
+# if HAVE_RAW_DECL_LCHMOD
+_GL_WARN_ON_USE (lchmod, "lchmod is unportable - "
+ "use gnulib module lchmod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSTAT@
+# if ! @HAVE_LSTAT@
+/* mingw does not support symlinks, therefore it does not have lstat. But
+ without links, stat does just fine. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lstat stat
+# endif
+_GL_CXXALIAS_RPL_1 (lstat, stat, int,
+ (const char *restrict name, struct stat *restrict buf));
+# elif @REPLACE_LSTAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lstat
+# define lstat rpl_lstat
+# endif
+_GL_FUNCDECL_RPL (lstat, int,
+ (const char *restrict name, struct stat *restrict buf)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (lstat, int,
+ (const char *restrict name, struct stat *restrict buf));
+# else
+_GL_CXXALIAS_SYS (lstat, int,
+ (const char *restrict name, struct stat *restrict buf));
+# endif
+# if @HAVE_LSTAT@
+_GL_CXXALIASWARN (lstat);
+# endif
+#elif @GNULIB_OVERRIDES_STRUCT_STAT@
+# undef lstat
+# define lstat lstat_used_without_requesting_gnulib_module_lstat
+#elif defined GNULIB_POSIXCHECK
+# undef lstat
+# if HAVE_RAW_DECL_LSTAT
+_GL_WARN_ON_USE (lstat, "lstat is unportable - "
+ "use gnulib module lstat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKDIR@
+# if @REPLACE_MKDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkdir
+# define mkdir rpl_mkdir
+# endif
+_GL_FUNCDECL_RPL (mkdir, int, (char const *name, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+/* mingw's _mkdir() function has 1 argument, but we pass 2 arguments.
+ Additionally, it declares _mkdir (and depending on compile flags, an
+ alias mkdir), only in the nonstandard includes <direct.h> and <io.h>,
+ which are included above. */
+# if !GNULIB_defined_rpl_mkdir
+static int
+rpl_mkdir (char const *name, mode_t mode)
+{
+ return _mkdir (name);
+}
+# define GNULIB_defined_rpl_mkdir 1
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkdir
+# define mkdir rpl_mkdir
+# endif
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
+# endif
+_GL_CXXALIASWARN (mkdir);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdir
+# if HAVE_RAW_DECL_MKDIR
+_GL_WARN_ON_USE (mkdir, "mkdir does not always support two parameters - "
+ "use gnulib module mkdir for portability");
+# endif
+#elif @GNULIB_MDA_MKDIR@
+/* On native Windows, map 'mkdir' to '_mkdir', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::mkdir always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !GNULIB_defined_rpl_mkdir
+static int
+rpl_mkdir (char const *name, mode_t mode)
+{
+ return _mkdir (name);
+}
+# define GNULIB_defined_rpl_mkdir 1
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkdir
+# define mkdir rpl_mkdir
+# endif
+_GL_CXXALIAS_RPL (mkdir, int, (char const *name, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (mkdir, int, (char const *name, mode_t mode));
+# endif
+_GL_CXXALIASWARN (mkdir);
+#endif
+
+
+#if @GNULIB_MKDIRAT@
+# if !@HAVE_MKDIRAT@
+_GL_FUNCDECL_SYS (mkdirat, int, (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mkdirat, int, (int fd, char const *file, mode_t mode));
+_GL_CXXALIASWARN (mkdirat);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdirat
+# if HAVE_RAW_DECL_MKDIRAT
+_GL_WARN_ON_USE (mkdirat, "mkdirat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFO@
+# if @REPLACE_MKFIFO@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mkfifo
+# define mkfifo rpl_mkfifo
+# endif
+_GL_FUNCDECL_RPL (mkfifo, int, (char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkfifo, int, (char const *file, mode_t mode));
+# else
+# if !@HAVE_MKFIFO@
+_GL_FUNCDECL_SYS (mkfifo, int, (char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkfifo, int, (char const *file, mode_t mode));
+# endif
+_GL_CXXALIASWARN (mkfifo);
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifo
+# if HAVE_RAW_DECL_MKFIFO
+_GL_WARN_ON_USE (mkfifo, "mkfifo is not portable - "
+ "use gnulib module mkfifo for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKFIFOAT@
+# if !@HAVE_MKFIFOAT@
+_GL_FUNCDECL_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mkfifoat, int, (int fd, char const *file, mode_t mode));
+_GL_CXXALIASWARN (mkfifoat);
+#elif defined GNULIB_POSIXCHECK
+# undef mkfifoat
+# if HAVE_RAW_DECL_MKFIFOAT
+_GL_WARN_ON_USE (mkfifoat, "mkfifoat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNOD@
+# if @REPLACE_MKNOD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mknod
+# define mknod rpl_mknod
+# endif
+_GL_FUNCDECL_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mknod, int, (char const *file, mode_t mode, dev_t dev));
+# else
+# if !@HAVE_MKNOD@
+_GL_FUNCDECL_SYS (mknod, int, (char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on OSF/1 5.1, the third parameter is '...'. */
+_GL_CXXALIAS_SYS_CAST (mknod, int, (char const *file, mode_t mode, dev_t dev));
+# endif
+_GL_CXXALIASWARN (mknod);
+#elif defined GNULIB_POSIXCHECK
+# undef mknod
+# if HAVE_RAW_DECL_MKNOD
+_GL_WARN_ON_USE (mknod, "mknod is not portable - "
+ "use gnulib module mknod for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MKNODAT@
+# if !@HAVE_MKNODAT@
+_GL_FUNCDECL_SYS (mknodat, int,
+ (int fd, char const *file, mode_t mode, dev_t dev)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mknodat, int,
+ (int fd, char const *file, mode_t mode, dev_t dev));
+_GL_CXXALIASWARN (mknodat);
+#elif defined GNULIB_POSIXCHECK
+# undef mknodat
+# if HAVE_RAW_DECL_MKNODAT
+_GL_WARN_ON_USE (mknodat, "mknodat is not portable - "
+ "use gnulib module mkfifoat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_STAT@
+# if @REPLACE_STAT@
+# if !@GNULIB_OVERRIDES_STRUCT_STAT@
+ /* We can't use the object-like #define stat rpl_stat, because of
+ struct stat. This means that rpl_stat will not be used if the user
+ does (stat)(a,b). Oh well. */
+# if defined _AIX && defined stat && defined _LARGE_FILES
+ /* With _LARGE_FILES defined, AIX (only) defines stat to stat64,
+ so we have to replace stat64() instead of stat(). */
+# undef stat64
+# define stat64(name, st) rpl_stat (name, st)
+# elif @WINDOWS_64_BIT_ST_SIZE@
+ /* Above, we define stat to _stati64. */
+# if defined __MINGW32__ && defined _stati64
+# ifndef _USE_32BIT_TIME_T
+ /* The system headers define _stati64 to _stat64. */
+# undef _stat64
+# define _stat64(name, st) rpl_stat (name, st)
+# endif
+# elif defined _MSC_VER && defined _stati64
+# ifdef _USE_32BIT_TIME_T
+ /* The system headers define _stati64 to _stat32i64. */
+# undef _stat32i64
+# define _stat32i64(name, st) rpl_stat (name, st)
+# else
+ /* The system headers define _stati64 to _stat64. */
+# undef _stat64
+# define _stat64(name, st) rpl_stat (name, st)
+# endif
+# else
+# undef _stati64
+# define _stati64(name, st) rpl_stat (name, st)
+# endif
+# elif defined __MINGW32__ && defined stat
+# ifdef _USE_32BIT_TIME_T
+ /* The system headers define stat to _stat32i64. */
+# undef _stat32i64
+# define _stat32i64(name, st) rpl_stat (name, st)
+# else
+ /* The system headers define stat to _stat64. */
+# undef _stat64
+# define _stat64(name, st) rpl_stat (name, st)
+# endif
+# elif defined _MSC_VER && defined stat
+# ifdef _USE_32BIT_TIME_T
+ /* The system headers define stat to _stat32. */
+# undef _stat32
+# define _stat32(name, st) rpl_stat (name, st)
+# else
+ /* The system headers define stat to _stat64i32. */
+# undef _stat64i32
+# define _stat64i32(name, st) rpl_stat (name, st)
+# endif
+# else /* !(_AIX || __MINGW32__ || _MSC_VER) */
+# undef stat
+# define stat(name, st) rpl_stat (name, st)
+# endif /* !_LARGE_FILES */
+# endif /* !@GNULIB_OVERRIDES_STRUCT_STAT@ */
+_GL_EXTERN_C int stat (const char *restrict name, struct stat *restrict buf)
+ _GL_ARG_NONNULL ((1, 2));
+# endif
+#elif @GNULIB_OVERRIDES_STRUCT_STAT@
+/* see above:
+ #define stat stat_used_without_requesting_gnulib_module_stat
+ */
+#elif defined GNULIB_POSIXCHECK
+# undef stat
+# if HAVE_RAW_DECL_STAT
+_GL_WARN_ON_USE (stat, "stat is unportable - "
+ "use gnulib module stat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_UMASK@
+/* On native Windows, map 'umask' to '_umask', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::umask always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef umask
+# define umask _umask
+# endif
+/* Need to cast, because in mingw the last argument is 'int mode'. */
+_GL_CXXALIAS_MDA_CAST (umask, mode_t, (mode_t mask));
+# else
+_GL_CXXALIAS_SYS (umask, mode_t, (mode_t mask));
+# endif
+_GL_CXXALIASWARN (umask);
+#endif
+
+
+#if @GNULIB_UTIMENSAT@
+/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat
+ implementation relies on futimesat, which on Solaris 10 makes an invocation
+ to utimensat that is meant to invoke the libc's utimensat(), not gnulib's
+ utimensat(). */
+# if @REPLACE_UTIMENSAT@ || (!@HAVE_UTIMENSAT@ && defined __sun)
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef utimensat
+# define utimensat rpl_utimensat
+# endif
+_GL_FUNCDECL_RPL (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag));
+# else
+# if !@HAVE_UTIMENSAT@
+_GL_FUNCDECL_SYS (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (utimensat, int, (int fd, char const *name,
+ struct timespec const times[2], int flag));
+# endif
+# if @HAVE_UTIMENSAT@
+_GL_CXXALIASWARN (utimensat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef utimensat
+# if HAVE_RAW_DECL_UTIMENSAT
+_GL_WARN_ON_USE (utimensat, "utimensat is not portable - "
+ "use gnulib module utimensat for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
+#endif /* _@GUARD_PREFIX@_SYS_STAT_H */
+#endif
diff --git a/lib/sys_time.in.h b/lib/sys_time.in.h
new file mode 100644
index 0000000..1c12d5f
--- /dev/null
+++ b/lib/sys_time.in.h
@@ -0,0 +1,224 @@
+/* Provide a more complete sys/time.h.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Paul Eggert. */
+
+#ifndef _@GUARD_PREFIX@_SYS_TIME_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* On Cygwin and on many BSDish systems, <sys/time.h> includes itself
+ recursively via <sys/select.h>.
+ Simply delegate to the system's header in this case; it is a no-op.
+ Without this extra ifdef, the C++ gettimeofday declaration below
+ would be a forward declaration in gnulib's nested <sys/time.h>. */
+#if defined _CYGWIN_SYS_TIME_H || defined _SYS_TIME_H || defined _SYS_TIME_H_
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+#else
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_SYS_TIME_H@
+# @INCLUDE_NEXT@ @NEXT_SYS_TIME_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_TIME_H
+#define _@GUARD_PREFIX@_SYS_TIME_H
+
+#if ! @HAVE_SYS_TIME_H@
+# include <time.h>
+#endif
+
+/* On native Windows with MSVC, get the 'struct timeval' type.
+ Also, on native Windows with a 64-bit time_t, where we are overriding the
+ 'struct timeval' type, get all declarations of system functions whose
+ signature contains 'struct timeval'. */
+#if (defined _MSC_VER || @REPLACE_STRUCT_TIMEVAL@) && @HAVE_WINSOCK2_H@ && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !@HAVE_STRUCT_TIMEVAL@ || @REPLACE_STRUCT_TIMEVAL@
+
+# if @REPLACE_STRUCT_TIMEVAL@
+# define timeval rpl_timeval
+# endif
+
+# if !GNULIB_defined_struct_timeval
+struct timeval
+{
+ time_t tv_sec;
+ long int tv_usec;
+};
+# define GNULIB_defined_struct_timeval 1
+# endif
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#if @GNULIB_GETTIMEOFDAY@
+# if @REPLACE_GETTIMEOFDAY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gettimeofday
+# define gettimeofday rpl_gettimeofday
+# endif
+_GL_FUNCDECL_RPL (gettimeofday, int,
+ (struct timeval *restrict, void *restrict)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gettimeofday, int,
+ (struct timeval *restrict, void *restrict));
+# else
+# if !@HAVE_GETTIMEOFDAY@
+_GL_FUNCDECL_SYS (gettimeofday, int,
+ (struct timeval *restrict, void *restrict)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on glibc systems, by default, the second argument is
+ struct timezone *. */
+_GL_CXXALIAS_SYS_CAST (gettimeofday, int,
+ (struct timeval *restrict, void *restrict));
+# endif
+_GL_CXXALIASWARN (gettimeofday);
+# if defined __cplusplus && defined GNULIB_NAMESPACE
+namespace GNULIB_NAMESPACE {
+ typedef ::timeval
+# undef timeval
+ timeval;
+# if @REPLACE_STRUCT_TIMEVAL@
+# define timeval rpl_timeval
+ typedef ::timeval timeval;
+# endif
+}
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef gettimeofday
+# if HAVE_RAW_DECL_GETTIMEOFDAY
+_GL_WARN_ON_USE (gettimeofday, "gettimeofday is unportable - "
+ "use gnulib module gettimeofday for portability");
+# endif
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if defined _MSC_VER && @HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_UNISTD_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close close_used_without_including_unistd_h
+# elif !defined __clang__
+ _GL_WARN_ON_USE (close,
+ "close() used without including <unistd.h>");
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname gethostname_used_without_including_unistd_h
+# else
+ _GL_WARN_ON_USE (gethostname,
+ "gethostname() used without including <unistd.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
+#endif /* _CYGWIN_SYS_TIME_H */
+#endif /* _@GUARD_PREFIX@_SYS_TIME_H */
diff --git a/lib/sys_types.in.h b/lib/sys_types.in.h
new file mode 100644
index 0000000..e7e1a22
--- /dev/null
+++ b/lib/sys_types.in.h
@@ -0,0 +1,106 @@
+/* Provide a more complete sys/types.h.
+
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _WIN32 && !defined __CYGWIN__ \
+ && (defined __need_off_t || defined __need___off64_t \
+ || defined __need_ssize_t || defined __need_time_t)
+
+/* Special invocation convention inside mingw header files. */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* The include_next requires a split double-inclusion guard. */
+# define _GL_INCLUDING_SYS_TYPES_H
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+# undef _GL_INCLUDING_SYS_TYPES_H
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+#define _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* Override off_t if Large File Support is requested on native Windows. */
+#if @WINDOWS_64_BIT_OFF_T@
+/* Same as int64_t in <stdint.h>. */
+# if defined _MSC_VER
+# define off_t __int64
+# else
+# define off_t long long int
+# endif
+/* Indicator, for gnulib internal purposes. */
+# define _GL_WINDOWS_64_BIT_OFF_T 1
+#endif
+
+/* Override dev_t and ino_t if distinguishable inodes support is requested
+ on native Windows. */
+#if @WINDOWS_STAT_INODES@
+
+# if @WINDOWS_STAT_INODES@ == 2
+/* Experimental, not useful in Windows 10. */
+
+/* Define dev_t to a 64-bit type. */
+# if !defined GNULIB_defined_dev_t
+typedef unsigned long long int rpl_dev_t;
+# undef dev_t
+# define dev_t rpl_dev_t
+# define GNULIB_defined_dev_t 1
+# endif
+
+/* Define ino_t to a 128-bit type. */
+# if !defined GNULIB_defined_ino_t
+/* MSVC does not have a 128-bit integer type.
+ GCC has a 128-bit integer type __int128, but only on 64-bit targets. */
+typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t;
+# undef ino_t
+# define ino_t rpl_ino_t
+# define GNULIB_defined_ino_t 1
+# endif
+
+# else /* @WINDOWS_STAT_INODES@ == 1 */
+
+/* Define ino_t to a 64-bit type. */
+# if !defined GNULIB_defined_ino_t
+typedef unsigned long long int rpl_ino_t;
+# undef ino_t
+# define ino_t rpl_ino_t
+# define GNULIB_defined_ino_t 1
+# endif
+
+# endif
+
+/* Indicator, for gnulib internal purposes. */
+# define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@
+
+#endif
+
+/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__
+# include <stddef.h>
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* __need_XXX */
diff --git a/lib/sys_uio.in.h b/lib/sys_uio.in.h
new file mode 100644
index 0000000..8588d3c
--- /dev/null
+++ b/lib/sys_uio.in.h
@@ -0,0 +1,63 @@
+/* Substitute for <sys/uio.h>.
+ Copyright (C) 2011-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+# if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+# endif
+@PRAGMA_COLUMNS@
+
+#ifndef _@GUARD_PREFIX@_SYS_UIO_H
+
+#if @HAVE_SYS_UIO_H@
+
+/* On OpenBSD 4.4, <sys/uio.h> assumes prior inclusion of <sys/types.h>. */
+# include <sys/types.h>
+
+/* The include_next requires a split double-inclusion guard. */
+# @INCLUDE_NEXT@ @NEXT_SYS_UIO_H@
+
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_UIO_H
+#define _@GUARD_PREFIX@_SYS_UIO_H
+
+#if !@HAVE_SYS_UIO_H@
+/* A platform that lacks <sys/uio.h>. */
+/* Get 'size_t' and 'ssize_t'. */
+# include <sys/types.h>
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_iovec
+/* All known platforms that lack <sys/uio.h> also lack any declaration
+ of struct iovec in any other header. */
+struct iovec {
+ void *iov_base;
+ size_t iov_len;
+};
+# define GNULIB_defined_struct_iovec 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_UIO_H */
+#endif /* _@GUARD_PREFIX@_SYS_UIO_H */
diff --git a/lib/sys_wait.in.h b/lib/sys_wait.in.h
new file mode 100644
index 0000000..9308f0b
--- /dev/null
+++ b/lib/sys_wait.in.h
@@ -0,0 +1,131 @@
+/* A POSIX-like <sys/wait.h>.
+ Copyright (C) 2001-2003, 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+
+#ifndef _@GUARD_PREFIX@_SYS_WAIT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if !(defined _WIN32 && ! defined __CYGWIN__)
+# @INCLUDE_NEXT@ @NEXT_SYS_WAIT_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_SYS_WAIT_H
+#define _@GUARD_PREFIX@_SYS_WAIT_H
+
+/* Get pid_t. */
+#include <sys/types.h>
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if !(defined _WIN32 && ! defined __CYGWIN__)
+/* Unix API. */
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid().
+ On nearly all systems, including Linux/x86, WEXITSTATUS are bits 15..8 and
+ WTERMSIG are bits 7..0, while BeOS uses the opposite. Therefore programs
+ have to use the abstract macros. */
+
+/* For valid x, exactly one of WIFSIGNALED(x), WIFEXITED(x), WIFSTOPPED(x)
+ is true. */
+# ifndef WIFSIGNALED
+# define WIFSIGNALED(x) (WTERMSIG (x) != 0 && WTERMSIG(x) != 0x7f)
+# endif
+# ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+# endif
+# ifndef WIFSTOPPED
+# define WIFSTOPPED(x) (WTERMSIG (x) == 0x7f)
+# endif
+
+/* The termination signal. Only to be accessed if WIFSIGNALED(x) is true. */
+# ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+# endif
+
+/* The exit status. Only to be accessed if WIFEXITED(x) is true. */
+# ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+# endif
+
+/* The stopping signal. Only to be accessed if WIFSTOPPED(x) is true. */
+# ifndef WSTOPSIG
+# define WSTOPSIG(x) (((x) >> 8) & 0x7f)
+# endif
+
+/* True if the process dumped core. Not standardized by POSIX. */
+# ifndef WCOREDUMP
+# define WCOREDUMP(x) ((x) & 0x80)
+# endif
+
+#else
+/* Native Windows API. */
+
+# include <signal.h> /* for SIGTERM */
+
+/* The following macros apply to an argument x, that is a status of a process,
+ as returned by waitpid() or, equivalently, _cwait() or GetExitCodeProcess().
+ This value is simply an 'int', not composed of bit fields. */
+
+/* When an unhandled fatal signal terminates a process, the exit code is 3. */
+# define WIFSIGNALED(x) ((x) == 3)
+# define WIFEXITED(x) ((x) != 3)
+# define WIFSTOPPED(x) 0
+
+/* The signal that terminated a process is not known posthum. */
+# define WTERMSIG(x) SIGTERM
+
+# define WEXITSTATUS(x) (x)
+
+/* There are no stopping signals. */
+# define WSTOPSIG(x) 0
+
+/* There are no core dumps. */
+# define WCOREDUMP(x) 0
+
+#endif
+
+
+/* Declarations of functions. */
+
+#if @GNULIB_WAITPID@
+# if defined _WIN32 && ! defined __CYGWIN__
+_GL_FUNCDECL_SYS (waitpid, pid_t, (pid_t pid, int *statusp, int options));
+# endif
+/* Need to cast, because on Cygwin, the second parameter is
+ __wait_status_ptr_t statusp. */
+_GL_CXXALIAS_SYS_CAST (waitpid, pid_t, (pid_t pid, int *statusp, int options));
+_GL_CXXALIASWARN (waitpid);
+#elif defined GNULIB_POSIXCHECK
+# undef waitpid
+# if HAVE_RAW_DECL_WAITPID
+_GL_WARN_ON_USE (waitpid, "waitpid is unportable - "
+ "use gnulib module sys_wait for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */
+#endif /* _@GUARD_PREFIX@_SYS_WAIT_H */
diff --git a/lib/tempname.c b/lib/tempname.c
new file mode 100644
index 0000000..b9f7cc8
--- /dev/null
+++ b/lib/tempname.c
@@ -0,0 +1,332 @@
+/* Copyright (C) 1991-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#if !_LIBC
+# include <libc-config.h>
+# include "tempname.h"
+#endif
+
+#include <sys/types.h>
+#include <assert.h>
+
+#include <errno.h>
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# define P_tmpdir "/tmp"
+#endif
+#ifndef TMP_MAX
+# define TMP_MAX 238328
+#endif
+#ifndef __GT_FILE
+# define __GT_FILE 0
+# define __GT_DIR 1
+# define __GT_NOCREATE 2
+#endif
+#if !_LIBC && (GT_FILE != __GT_FILE || GT_DIR != __GT_DIR \
+ || GT_NOCREATE != __GT_NOCREATE)
+# error report this to bug-gnulib@gnu.org
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>
+#include <stdalign.h>
+#include <stdint.h>
+#include <sys/random.h>
+#include <sys/stat.h>
+#include <time.h>
+
+#if _LIBC
+# define struct_stat64 struct stat64
+# define __secure_getenv __libc_secure_getenv
+#else
+# define struct_stat64 struct stat
+# define __gen_tempname gen_tempname
+# define __mkdir mkdir
+# define __open open
+# define __lxstat64(version, file, buf) lstat (file, buf)
+# define __getrandom getrandom
+# define __clock_gettime64 clock_gettime
+# define __timespec64 timespec
+#endif
+
+/* Use getrandom if it works, falling back on a 64-bit linear
+ congruential generator that starts with Var's value
+ mixed in with a clock's low-order bits if available. */
+typedef uint_fast64_t random_value;
+#define RANDOM_VALUE_MAX UINT_FAST64_MAX
+#define BASE_62_DIGITS 10 /* 62**10 < UINT_FAST64_MAX */
+#define BASE_62_POWER (62LL * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62 * 62)
+
+static random_value
+random_bits (random_value var)
+{
+ random_value r;
+ if (__getrandom (&r, sizeof r, 0) == sizeof r)
+ return r;
+#if _LIBC || (defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME)
+ /* Add entropy if getrandom is not supported. */
+ struct __timespec64 tv;
+ __clock_gettime64 (CLOCK_MONOTONIC, &tv);
+ var ^= tv.tv_nsec;
+#endif
+ return 2862933555777941757 * var + 3037000493;
+}
+
+#if _LIBC
+/* Return nonzero if DIR is an existent directory. */
+static int
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+__path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ int try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+ while (dlen > 1 && dir[dlen - 1] == '/')
+ dlen--; /* remove trailing slashes */
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + 1 + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ sprintf (tmpl, "%.*s/%.*sXXXXXX", (int) dlen, dir, (int) plen, pfx);
+ return 0;
+}
+#endif /* _LIBC */
+
+#if _LIBC
+static int try_tempname_len (char *, int, void *, int (*) (char *, void *),
+ size_t);
+#endif
+
+static int
+try_file (char *tmpl, void *flags)
+{
+ int *openflags = flags;
+ return __open (tmpl,
+ (*openflags & ~O_ACCMODE)
+ | O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
+}
+
+static int
+try_dir (char *tmpl, void *flags _GL_UNUSED)
+{
+ return __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR);
+}
+
+static int
+try_nocreate (char *tmpl, void *flags _GL_UNUSED)
+{
+ struct_stat64 st;
+
+ if (__lxstat64 (_STAT_VER, tmpl, &st) == 0 || errno == EOVERFLOW)
+ __set_errno (EEXIST);
+ return errno == ENOENT ? 0 : -1;
+}
+
+/* These are the characters used in temporary file names. */
+static const char letters[] =
+"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e., end in at least X_SUFFIX_LEN "X"s,
+ possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ this function. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ __GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ __GT_FILE: create the file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ __GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+#ifdef _LIBC
+static
+#endif
+int
+gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
+ size_t x_suffix_len)
+{
+ static int (*const tryfunc[]) (char *, void *) =
+ {
+ [__GT_FILE] = try_file,
+ [__GT_DIR] = try_dir,
+ [__GT_NOCREATE] = try_nocreate
+ };
+ return try_tempname_len (tmpl, suffixlen, &flags, tryfunc[kind],
+ x_suffix_len);
+}
+
+#ifdef _LIBC
+static
+#endif
+int
+try_tempname_len (char *tmpl, int suffixlen, void *args,
+ int (*tryfunc) (char *, void *), size_t x_suffix_len)
+{
+ size_t len;
+ char *XXXXXX;
+ unsigned int count;
+ int fd = -1;
+ int save_errno = errno;
+
+ /* A lower bound on the number of temporary files to attempt to
+ generate. The maximum total number of temporary file names that
+ can exist for a given template is 62**6. It should never be
+ necessary to try all of these combinations. Instead if a reasonable
+ number of names is tried (we define reasonable as 62**3) fail to
+ give the system administrator the chance to remove the problems.
+ This value requires that X_SUFFIX_LEN be at least 3. */
+#define ATTEMPTS_MIN (62 * 62 * 62)
+
+ /* The number of times to attempt to generate a temporary file. To
+ conform to POSIX, this must be no smaller than TMP_MAX. */
+#if ATTEMPTS_MIN < TMP_MAX
+ unsigned int attempts = TMP_MAX;
+#else
+ unsigned int attempts = ATTEMPTS_MIN;
+#endif
+
+ /* A random variable. The initial value is used only the for fallback path
+ on 'random_bits' on 'getrandom' failure. Its initial value tries to use
+ some entropy from the ASLR and ignore possible bits from the stack
+ alignment. */
+ random_value v = ((uintptr_t) &v) / alignof (max_align_t);
+
+ /* How many random base-62 digits can currently be extracted from V. */
+ int vdigits = 0;
+
+ /* Least unfair value for V. If V is less than this, V can generate
+ BASE_62_DIGITS digits fairly. Otherwise it might be biased. */
+ random_value const unfair_min
+ = RANDOM_VALUE_MAX - RANDOM_VALUE_MAX % BASE_62_POWER;
+
+ len = strlen (tmpl);
+ if (len < x_suffix_len + suffixlen
+ || strspn (&tmpl[len - x_suffix_len - suffixlen], "X") < x_suffix_len)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ /* This is where the Xs start. */
+ XXXXXX = &tmpl[len - x_suffix_len - suffixlen];
+
+ for (count = 0; count < attempts; ++count)
+ {
+ for (size_t i = 0; i < x_suffix_len; i++)
+ {
+ if (vdigits == 0)
+ {
+ do
+ v = random_bits (v);
+ while (unfair_min <= v);
+
+ vdigits = BASE_62_DIGITS;
+ }
+
+ XXXXXX[i] = letters[v % 62];
+ v /= 62;
+ vdigits--;
+ }
+
+ fd = tryfunc (tmpl, args);
+ if (fd >= 0)
+ {
+ __set_errno (save_errno);
+ return fd;
+ }
+ else if (errno != EEXIST)
+ return -1;
+ }
+
+ /* We got out of the loop because we ran out of combinations to try. */
+ __set_errno (EEXIST);
+ return -1;
+}
+
+int
+__gen_tempname (char *tmpl, int suffixlen, int flags, int kind)
+{
+ return gen_tempname_len (tmpl, suffixlen, flags, kind, 6);
+}
+
+#if !_LIBC
+int
+try_tempname (char *tmpl, int suffixlen, void *args,
+ int (*tryfunc) (char *, void *))
+{
+ return try_tempname_len (tmpl, suffixlen, args, tryfunc, 6);
+}
+#endif
diff --git a/lib/tempname.h b/lib/tempname.h
new file mode 100644
index 0000000..00dcbe4
--- /dev/null
+++ b/lib/tempname.h
@@ -0,0 +1,72 @@
+/* Create a temporary file or directory.
+
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+/* header written by Eric Blake */
+
+#ifndef GL_TEMPNAME_H
+# define GL_TEMPNAME_H
+
+# include <stdio.h>
+
+# ifdef __GT_FILE
+# define GT_FILE __GT_FILE
+# define GT_DIR __GT_DIR
+# define GT_NOCREATE __GT_NOCREATE
+# else
+# define GT_FILE 0
+# define GT_DIR 1
+# define GT_NOCREATE 2
+# endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Generate a temporary file name based on TMPL. TMPL must match the
+ rules for mk[s]temp (i.e. end in "XXXXXX", possibly with a suffix).
+ The name constructed does not exist at the time of the call to
+ gen_tempname. TMPL is overwritten with the result.
+
+ KIND may be one of:
+ GT_NOCREATE: simply verify that the name does not exist
+ at the time of the call.
+ GT_FILE: create a large file using open(O_CREAT|O_EXCL)
+ and return a read-write fd. The file is mode 0600.
+ GT_DIR: create a directory, which will be mode 0700.
+
+ We use a clever algorithm to get hard-to-predict names. */
+extern int gen_tempname (char *tmpl, int suffixlen, int flags, int kind);
+/* Similar, except X_SUFFIX_LEN gives the number of Xs. */
+extern int gen_tempname_len (char *tmpl, int suffixlen, int flags, int kind,
+ size_t x_suffix_len);
+
+/* Similar to gen_tempname, but TRYFUNC is called for each temporary
+ name to try. If TRYFUNC returns a non-negative number, TRY_GEN_TEMPNAME
+ returns with this value. Otherwise, if errno is set to EEXIST, another
+ name is tried, or else TRY_GEN_TEMPNAME returns -1. */
+extern int try_tempname (char *tmpl, int suffixlen, void *args,
+ int (*tryfunc) (char *, void *));
+/* Similar, except X_SUFFIX_LEN gives the number of Xs. */
+extern int try_tempname_len (char *tmpl, int suffixlen, void *args,
+ int (*tryfunc) (char *, void *),
+ size_t x_suffix_len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GL_TEMPNAME_H */
diff --git a/lib/thread-optim.h b/lib/thread-optim.h
new file mode 100644
index 0000000..b649c50
--- /dev/null
+++ b/lib/thread-optim.h
@@ -0,0 +1,60 @@
+/* Optimization of multithreaded code.
+
+ Copyright (C) 2020 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2020. */
+
+#ifndef _THREAD_OPTIM_H
+#define _THREAD_OPTIM_H
+
+/* This file defines a way to optimize multithreaded code for the single-thread
+ case, based on the variable '__libc_single_threaded', defined in
+ glibc >= 2.32. */
+
+/* Typical use: In a block or function, use
+
+ bool mt = gl_multithreaded ();
+ ...
+ if (mt)
+ if (pthread_mutex_lock (&lock)) abort ();
+ ...
+ if (mt)
+ if (pthread_mutex_unlock (&lock)) abort ();
+
+ The gl_multithreaded () invocation determines whether the program currently
+ is multithreaded.
+
+ if (mt) STATEMENT executes STATEMENT in the multithreaded case, and skips
+ it in the single-threaded case.
+
+ The code between the gl_multithreaded () invocation and any use of the
+ variable 'mt' must not create threads or invoke functions that may
+ indirectly create threads (e.g. 'dlopen' may, indirectly through C++
+ initializers of global variables in the shared library being opened,
+ create threads).
+
+ The lock here is meant to synchronize threads in the same process. The
+ same optimization cannot be applied to locks that synchronize different
+ processes (e.g. through shared memory mappings). */
+
+#if HAVE_SYS_SINGLE_THREADED_H /* glibc >= 2.32 */
+# include <sys/single_threaded.h>
+# define gl_multithreaded() !__libc_single_threaded
+#else
+# define gl_multithreaded() 1
+#endif
+
+#endif /* _THREAD_OPTIM_H */
diff --git a/lib/time.in.h b/lib/time.in.h
new file mode 100644
index 0000000..23ac1ca
--- /dev/null
+++ b/lib/time.in.h
@@ -0,0 +1,384 @@
+/* A more-standard <time.h>.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* Don't get in the way of glibc when it includes time.h merely to
+ declare a few standard symbols, rather than to declare all the
+ symbols. (However, skip this for MinGW as it treats __need_time_t
+ incompatibly.) Also, Solaris 8 <time.h> eventually includes itself
+ recursively; if that is happening, just include the system <time.h>
+ without adding our own declarations. */
+#if (((defined __need_time_t || defined __need_clock_t \
+ || defined __need_timespec) \
+ && !defined __MINGW32__) \
+ || defined _@GUARD_PREFIX@_TIME_H)
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+#else
+
+# define _@GUARD_PREFIX@_TIME_H
+
+/* mingw's <time.h> provides the functions asctime_r, ctime_r, gmtime_r,
+ localtime_r only if <unistd.h> or <pthread.h> has been included before. */
+# if defined __MINGW32__
+# include <unistd.h>
+# endif
+
+# @INCLUDE_NEXT@ @NEXT_TIME_H@
+
+/* NetBSD 5.0 mis-defines NULL. */
+# include <stddef.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Some systems don't define struct timespec (e.g., AIX 4.1).
+ Or they define it with the wrong member names or define it in <sys/time.h>
+ (e.g., FreeBSD circa 1997). Stock Mingw prior to 3.0 does not define it,
+ but the pthreads-win32 library defines it in <pthread.h>. */
+# if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@
+# if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+# include <sys/time.h>
+# elif @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+# include <pthread.h>
+# elif @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+# include <unistd.h>
+# else
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# if !GNULIB_defined_struct_timespec
+# undef timespec
+# define timespec rpl_timespec
+struct timespec
+{
+ time_t tv_sec;
+ long int tv_nsec;
+};
+# define GNULIB_defined_struct_timespec 1
+# endif
+
+# ifdef __cplusplus
+}
+# endif
+
+# endif
+# endif
+
+# if !GNULIB_defined_struct_time_t_must_be_integral
+/* https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_types.h.html
+ requires time_t to be an integer type, even though C99 permits floating
+ point. We don't know of any implementation that uses floating
+ point, and it is much easier to write code that doesn't have to
+ worry about that corner case, so we force the issue. */
+struct __time_t_must_be_integral {
+ unsigned int __floating_time_t_unsupported : (time_t) 1;
+};
+# define GNULIB_defined_struct_time_t_must_be_integral 1
+# endif
+
+/* Sleep for at least RQTP seconds unless interrupted, If interrupted,
+ return -1 and store the remaining time into RMTP. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html>. */
+# if @GNULIB_NANOSLEEP@
+# if @REPLACE_NANOSLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define nanosleep rpl_nanosleep
+# endif
+_GL_FUNCDECL_RPL (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp));
+# else
+# if ! @HAVE_NANOSLEEP@
+_GL_FUNCDECL_SYS (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (nanosleep, int,
+ (struct timespec const *__rqtp, struct timespec *__rmtp));
+# endif
+_GL_CXXALIASWARN (nanosleep);
+# endif
+
+/* Initialize time conversion information. */
+# if @GNULIB_TZSET@
+# if @REPLACE_TZSET@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tzset
+# define tzset rpl_tzset
+# endif
+_GL_FUNCDECL_RPL (tzset, void, (void));
+_GL_CXXALIAS_RPL (tzset, void, (void));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tzset
+# define tzset _tzset
+# endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+# else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+# endif
+_GL_CXXALIASWARN (tzset);
+# elif @GNULIB_MDA_TZSET@
+/* On native Windows, map 'tzset' to '_tzset', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::tzset always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef tzset
+# define tzset _tzset
+# endif
+_GL_CXXALIAS_MDA (tzset, void, (void));
+# else
+_GL_CXXALIAS_SYS (tzset, void, (void));
+# endif
+_GL_CXXALIASWARN (tzset);
+# endif
+
+/* Return the 'time_t' representation of TP and normalize TP. */
+# if @GNULIB_MKTIME@
+# if @REPLACE_MKTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define mktime rpl_mktime
+# endif
+_GL_FUNCDECL_RPL (mktime, time_t, (struct tm *__tp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mktime, time_t, (struct tm *__tp));
+# else
+_GL_CXXALIAS_SYS (mktime, time_t, (struct tm *__tp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mktime);
+# endif
+# endif
+
+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html> and
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html>. */
+# if @GNULIB_TIME_R@
+# if @REPLACE_LOCALTIME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef localtime_r
+# define localtime_r rpl_localtime_r
+# endif
+_GL_FUNCDECL_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# else
+# if ! @HAVE_DECL_LOCALTIME_R@
+_GL_FUNCDECL_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (localtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# endif
+# if @HAVE_DECL_LOCALTIME_R@
+_GL_CXXALIASWARN (localtime_r);
+# endif
+# if @REPLACE_LOCALTIME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gmtime_r
+# define gmtime_r rpl_gmtime_r
+# endif
+_GL_FUNCDECL_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# else
+# if ! @HAVE_DECL_LOCALTIME_R@
+_GL_FUNCDECL_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (gmtime_r, struct tm *, (time_t const *restrict __timer,
+ struct tm *restrict __result));
+# endif
+# if @HAVE_DECL_LOCALTIME_R@
+_GL_CXXALIASWARN (gmtime_r);
+# endif
+# endif
+
+/* Convert TIMER to RESULT, assuming local time and UTC respectively. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime.html> and
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime.html>. */
+# if @GNULIB_LOCALTIME@ || @REPLACE_LOCALTIME@
+# if @REPLACE_LOCALTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef localtime
+# define localtime rpl_localtime
+# endif
+_GL_FUNCDECL_RPL (localtime, struct tm *, (time_t const *__timer)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (localtime, struct tm *, (time_t const *__timer));
+# else
+_GL_CXXALIAS_SYS (localtime, struct tm *, (time_t const *__timer));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (localtime);
+# endif
+# endif
+
+# if 0 || @REPLACE_GMTIME@
+# if @REPLACE_GMTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gmtime
+# define gmtime rpl_gmtime
+# endif
+_GL_FUNCDECL_RPL (gmtime, struct tm *, (time_t const *__timer)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gmtime, struct tm *, (time_t const *__timer));
+# else
+_GL_CXXALIAS_SYS (gmtime, struct tm *, (time_t const *__timer));
+# endif
+_GL_CXXALIASWARN (gmtime);
+# endif
+
+/* Parse BUF as a timestamp, assuming FORMAT specifies its layout, and store
+ the resulting broken-down time into TM. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html>. */
+# if @GNULIB_STRPTIME@
+# if ! @HAVE_STRPTIME@
+_GL_FUNCDECL_SYS (strptime, char *, (char const *restrict __buf,
+ char const *restrict __format,
+ struct tm *restrict __tm)
+ _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (strptime, char *, (char const *restrict __buf,
+ char const *restrict __format,
+ struct tm *restrict __tm));
+_GL_CXXALIASWARN (strptime);
+# endif
+
+/* Convert *TP to a date and time string. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html>. */
+# if @GNULIB_CTIME@
+# if @REPLACE_CTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define ctime rpl_ctime
+# endif
+_GL_FUNCDECL_RPL (ctime, char *, (time_t const *__tp)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ctime, char *, (time_t const *__tp));
+# else
+_GL_CXXALIAS_SYS (ctime, char *, (time_t const *__tp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ctime);
+# endif
+# endif
+
+/* Convert *TP to a date and time string. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html>. */
+# if @GNULIB_STRFTIME@
+# if @REPLACE_STRFTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define strftime rpl_strftime
+# endif
+_GL_FUNCDECL_RPL (strftime, size_t,
+ (char *restrict __buf, size_t __bufsize,
+ const char *restrict __fmt, const struct tm *restrict __tp)
+ _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (strftime, size_t,
+ (char *restrict __buf, size_t __bufsize,
+ const char *restrict __fmt, const struct tm *restrict __tp));
+# else
+_GL_CXXALIAS_SYS (strftime, size_t,
+ (char *restrict __buf, size_t __bufsize,
+ const char *restrict __fmt, const struct tm *restrict __tp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strftime);
+# endif
+# endif
+
+# if defined _GNU_SOURCE && @GNULIB_TIME_RZ@ && ! @HAVE_TIMEZONE_T@
+typedef struct tm_zone *timezone_t;
+_GL_FUNCDECL_SYS (tzalloc, timezone_t, (char const *__name));
+_GL_CXXALIAS_SYS (tzalloc, timezone_t, (char const *__name));
+_GL_FUNCDECL_SYS (tzfree, void, (timezone_t __tz));
+_GL_CXXALIAS_SYS (tzfree, void, (timezone_t __tz));
+_GL_FUNCDECL_SYS (localtime_rz, struct tm *,
+ (timezone_t __tz, time_t const *restrict __timer,
+ struct tm *restrict __result) _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_SYS (localtime_rz, struct tm *,
+ (timezone_t __tz, time_t const *restrict __timer,
+ struct tm *restrict __result));
+_GL_FUNCDECL_SYS (mktime_z, time_t,
+ (timezone_t __tz, struct tm *restrict __result)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_SYS (mktime_z, time_t,
+ (timezone_t __tz, struct tm *restrict __result));
+# endif
+
+/* Convert TM to a time_t value, assuming UTC. */
+# if @GNULIB_TIMEGM@
+# if @REPLACE_TIMEGM@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef timegm
+# define timegm rpl_timegm
+# endif
+_GL_FUNCDECL_RPL (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (timegm, time_t, (struct tm *__tm));
+# else
+# if ! @HAVE_TIMEGM@
+_GL_FUNCDECL_SYS (timegm, time_t, (struct tm *__tm) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (timegm, time_t, (struct tm *__tm));
+# endif
+_GL_CXXALIASWARN (timegm);
+# endif
+
+/* Encourage applications to avoid unsafe functions that can overrun
+ buffers when given outlandish struct tm values. Portable
+ applications should use strftime (or even sprintf) instead. */
+# if defined GNULIB_POSIXCHECK
+# undef asctime
+_GL_WARN_ON_USE (asctime, "asctime can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef asctime_r
+_GL_WARN_ON_USE (asctime_r, "asctime_r can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef ctime
+_GL_WARN_ON_USE (ctime, "ctime can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+# if defined GNULIB_POSIXCHECK
+# undef ctime_r
+_GL_WARN_ON_USE (ctime_r, "ctime_r can overrun buffers in some cases - "
+ "better use strftime (or even sprintf) instead");
+# endif
+
+#endif
diff --git a/lib/time_r.c b/lib/time_r.c
new file mode 100644
index 0000000..e8fca2d
--- /dev/null
+++ b/lib/time_r.c
@@ -0,0 +1,44 @@
+/* Reentrant time functions like localtime_r.
+
+ Copyright (C) 2003, 2006-2007, 2010-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <config.h>
+
+#include <time.h>
+
+static struct tm *
+copy_tm_result (struct tm *dest, struct tm const *src)
+{
+ if (! src)
+ return 0;
+ *dest = *src;
+ return dest;
+}
+
+
+struct tm *
+gmtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, gmtime (t));
+}
+
+struct tm *
+localtime_r (time_t const * restrict t, struct tm * restrict tp)
+{
+ return copy_tm_result (tp, localtime (t));
+}
diff --git a/lib/timegm.c b/lib/timegm.c
new file mode 100644
index 0000000..fa30943
--- /dev/null
+++ b/lib/timegm.c
@@ -0,0 +1,58 @@
+/* Convert UTC calendar time to simple time. Like mktime but assumes UTC.
+
+ Copyright (C) 1994-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 3 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#ifndef _LIBC
+# include <libc-config.h>
+#endif
+
+#include <time.h>
+#include <errno.h>
+
+#include "mktime-internal.h"
+
+__time64_t
+__timegm64 (struct tm *tmp)
+{
+ static mktime_offset_t gmtime_offset;
+ tmp->tm_isdst = 0;
+ return __mktime_internal (tmp, __gmtime64_r, &gmtime_offset);
+}
+
+#if defined _LIBC && __TIMESIZE != 64
+
+libc_hidden_def (__timegm64)
+
+time_t
+timegm (struct tm *tmp)
+{
+ struct tm tm = *tmp;
+ __time64_t t = __timegm64 (&tm);
+ if (in_time_t_range (t))
+ {
+ *tmp = tm;
+ return t;
+ }
+ else
+ {
+ __set_errno (EOVERFLOW);
+ return -1;
+ }
+}
+
+#endif
diff --git a/lib/timespec.c b/lib/timespec.c
new file mode 100644
index 0000000..2b6098e
--- /dev/null
+++ b/lib/timespec.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define _GL_TIMESPEC_INLINE _GL_EXTERN_INLINE
+#include "timespec.h"
diff --git a/lib/timespec.h b/lib/timespec.h
new file mode 100644
index 0000000..dc999f9
--- /dev/null
+++ b/lib/timespec.h
@@ -0,0 +1,101 @@
+/* timespec -- System time interface
+
+ Copyright (C) 2000, 2002, 2004-2005, 2007, 2009-2020 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/>. */
+
+#if ! defined TIMESPEC_H
+#define TIMESPEC_H
+
+#include <time.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_TIMESPEC_INLINE
+# define _GL_TIMESPEC_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "arg-nonnull.h"
+
+/* Inverse resolution of timespec timestamps (in units per second),
+ and log base 10 of the inverse resolution. */
+
+enum { TIMESPEC_HZ = 1000000000 };
+enum { LOG10_TIMESPEC_HZ = 9 };
+
+/* Obsolescent names for backward compatibility.
+ They are misnomers, because TIMESPEC_RESOLUTION is not a resolution. */
+
+enum { TIMESPEC_RESOLUTION = TIMESPEC_HZ };
+enum { LOG10_TIMESPEC_RESOLUTION = LOG10_TIMESPEC_HZ };
+
+/* Return a timespec with seconds S and nanoseconds NS. */
+
+_GL_TIMESPEC_INLINE struct timespec
+make_timespec (time_t s, long int ns)
+{
+ struct timespec r;
+ r.tv_sec = s;
+ r.tv_nsec = ns;
+ return r;
+}
+
+/* Return negative, zero, positive if A < B, A == B, A > B, respectively. */
+
+_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
+timespec_cmp (struct timespec a, struct timespec b)
+{
+ return 2 * _GL_CMP (a.tv_sec, b.tv_sec) + _GL_CMP (a.tv_nsec, b.tv_nsec);
+}
+
+/* Return -1, 0, 1, depending on the sign of A. A.tv_nsec must be
+ nonnegative. */
+_GL_TIMESPEC_INLINE int _GL_ATTRIBUTE_PURE
+timespec_sign (struct timespec a)
+{
+ return _GL_CMP (a.tv_sec, 0) + (!a.tv_sec & !!a.tv_nsec);
+}
+
+struct timespec timespec_add (struct timespec, struct timespec)
+ _GL_ATTRIBUTE_CONST;
+struct timespec timespec_sub (struct timespec, struct timespec)
+ _GL_ATTRIBUTE_CONST;
+struct timespec dtotimespec (double)
+ _GL_ATTRIBUTE_CONST;
+
+/* Return an approximation to A, of type 'double'. */
+_GL_TIMESPEC_INLINE double
+timespectod (struct timespec a)
+{
+ return a.tv_sec + a.tv_nsec / 1e9;
+}
+
+struct timespec current_timespec (void);
+void gettime (struct timespec *) _GL_ARG_NONNULL ((1));
+int settime (struct timespec const *) _GL_ARG_NONNULL ((1));
+
+#ifdef __cplusplus
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif
diff --git a/lib/tmpdir.c b/lib/tmpdir.c
new file mode 100644
index 0000000..28ff99f
--- /dev/null
+++ b/lib/tmpdir.c
@@ -0,0 +1,165 @@
+/* Copyright (C) 1999, 2001-2002, 2006, 2009-2020 Free Software Foundation,
+ Inc.
+ This file is part of the GNU C Library.
+
+ 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/>. */
+
+/* Extracted from sysdeps/posix/tempname.c. */
+
+#include <config.h>
+
+/* Specification. */
+#include "tmpdir.h"
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <errno.h>
+#ifndef __set_errno
+# define __set_errno(Val) errno = (Val)
+#endif
+
+#include <stdio.h>
+#ifndef P_tmpdir
+# ifdef _P_tmpdir /* native Windows */
+# define P_tmpdir _P_tmpdir
+# else
+# define P_tmpdir "/tmp"
+# endif
+#endif
+
+#include <sys/stat.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+#endif
+
+#include "pathmax.h"
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Don't assume that UNICODE is not defined. */
+# undef GetTempPath
+# define GetTempPath GetTempPathA
+#endif
+
+#if _LIBC
+# define struct_stat64 struct stat64
+#else
+# define struct_stat64 struct stat
+# define __libc_secure_getenv secure_getenv
+# define __xstat64(version, path, buf) stat (path, buf)
+#endif
+
+/* Pathname support.
+ ISSLASH(C) tests whether C is a directory separator character.
+ */
+#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+ /* Native Windows, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+ /* Unix */
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+
+/* Return nonzero if DIR is an existent directory. */
+static bool
+direxists (const char *dir)
+{
+ struct_stat64 buf;
+ return __xstat64 (_STAT_VER, dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+}
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+int
+path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx,
+ bool try_tmpdir)
+{
+ const char *d;
+ size_t dlen, plen;
+ bool add_slash;
+
+ if (!pfx || !pfx[0])
+ {
+ pfx = "file";
+ plen = 4;
+ }
+ else
+ {
+ plen = strlen (pfx);
+ if (plen > 5)
+ plen = 5;
+ }
+
+ if (try_tmpdir)
+ {
+ d = __libc_secure_getenv ("TMPDIR");
+ if (d != NULL && direxists (d))
+ dir = d;
+ else if (dir != NULL && direxists (dir))
+ /* nothing */ ;
+ else
+ dir = NULL;
+ }
+ if (dir == NULL)
+ {
+#if defined _WIN32 && ! defined __CYGWIN__
+ char dirbuf[PATH_MAX];
+ DWORD retval;
+
+ /* Find Windows temporary file directory.
+ We try this before P_tmpdir because Windows defines P_tmpdir to "\\"
+ and will therefore try to put all temporary files in the root
+ directory (unless $TMPDIR is set). */
+ retval = GetTempPath (PATH_MAX, dirbuf);
+ if (retval > 0 && retval < PATH_MAX && direxists (dirbuf))
+ dir = dirbuf;
+ else
+#endif
+ if (direxists (P_tmpdir))
+ dir = P_tmpdir;
+ else if (strcmp (P_tmpdir, "/tmp") != 0 && direxists ("/tmp"))
+ dir = "/tmp";
+ else
+ {
+ __set_errno (ENOENT);
+ return -1;
+ }
+ }
+
+ dlen = strlen (dir);
+#ifdef __VMS
+ add_slash = 0;
+#else
+ add_slash = dlen != 0 && !ISSLASH (dir[dlen - 1]);
+#endif
+
+ /* check we have room for "${dir}/${pfx}XXXXXX\0" */
+ if (tmpl_len < dlen + add_slash + plen + 6 + 1)
+ {
+ __set_errno (EINVAL);
+ return -1;
+ }
+
+ memcpy (tmpl, dir, dlen);
+ sprintf (tmpl + dlen, &"/%.*sXXXXXX"[!add_slash], (int) plen, pfx);
+ return 0;
+}
diff --git a/lib/tmpdir.h b/lib/tmpdir.h
new file mode 100644
index 0000000..4d694a3
--- /dev/null
+++ b/lib/tmpdir.h
@@ -0,0 +1,26 @@
+/* Determine a temporary directory.
+ Copyright (C) 2001-2002, 2009-2020 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/>. */
+
+#include <stdbool.h>
+#include <stddef.h>
+
+/* Path search algorithm, for tmpnam, tmpfile, etc. If DIR is
+ non-null and exists, uses it; otherwise uses the first of $TMPDIR,
+ P_tmpdir, /tmp that exists. Copies into TMPL a template suitable
+ for use with mk[s]temp. Will fail (-1) if DIR is non-null and
+ doesn't exist, none of the searched dirs exists, or there's not
+ enough space in TMPL. */
+extern int path_search (char *tmpl, size_t tmpl_len, const char *dir, const char *pfx, bool try_tmpdir);
diff --git a/lib/u64.c b/lib/u64.c
new file mode 100644
index 0000000..1e3854d
--- /dev/null
+++ b/lib/u64.c
@@ -0,0 +1,4 @@
+#include <config.h>
+#define _GL_U64_INLINE _GL_EXTERN_INLINE
+#include "u64.h"
+typedef int dummy;
diff --git a/lib/u64.h b/lib/u64.h
new file mode 100644
index 0000000..a8d4d96
--- /dev/null
+++ b/lib/u64.h
@@ -0,0 +1,179 @@
+/* uint64_t-like operations that work even on hosts lacking uint64_t
+
+ Copyright (C) 2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <stdint.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_U64_INLINE
+# define _GL_U64_INLINE _GL_INLINE
+#endif
+
+/* Return X rotated left by N bits, where 0 < N < 64. */
+#define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n))
+
+#ifdef UINT64_MAX
+
+/* Native implementations are trivial. See below for comments on what
+ these operations do. */
+typedef uint64_t u64;
+# define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo)))
+# define u64init(hi, lo) u64hilo (hi, lo)
+# define u64lo(x) ((u64) (x))
+# define u64size(x) u64lo (x)
+# define u64lt(x, y) ((x) < (y))
+# define u64and(x, y) ((x) & (y))
+# define u64or(x, y) ((x) | (y))
+# define u64xor(x, y) ((x) ^ (y))
+# define u64plus(x, y) ((x) + (y))
+# define u64shl(x, n) ((x) << (n))
+# define u64shr(x, n) ((x) >> (n))
+
+#else
+
+/* u64 is a 64-bit unsigned integer value.
+ u64init (HI, LO), is like u64hilo (HI, LO), but for use in
+ initializer contexts. */
+# ifdef WORDS_BIGENDIAN
+typedef struct { uint32_t hi, lo; } u64;
+# define u64init(hi, lo) { hi, lo }
+# else
+typedef struct { uint32_t lo, hi; } u64;
+# define u64init(hi, lo) { lo, hi }
+# endif
+
+/* Given the high and low-order 32-bit quantities HI and LO, return a u64
+ value representing (HI << 32) + LO. */
+_GL_U64_INLINE u64
+u64hilo (uint32_t hi, uint32_t lo)
+{
+ u64 r;
+ r.hi = hi;
+ r.lo = lo;
+ return r;
+}
+
+/* Return a u64 value representing LO. */
+_GL_U64_INLINE u64
+u64lo (uint32_t lo)
+{
+ u64 r;
+ r.hi = 0;
+ r.lo = lo;
+ return r;
+}
+
+/* Return a u64 value representing SIZE. */
+_GL_U64_INLINE u64
+u64size (size_t size)
+{
+ u64 r;
+ r.hi = size >> 31 >> 1;
+ r.lo = size;
+ return r;
+}
+
+/* Return X < Y. */
+_GL_U64_INLINE int
+u64lt (u64 x, u64 y)
+{
+ return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo);
+}
+
+/* Return X & Y. */
+_GL_U64_INLINE u64
+u64and (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi & y.hi;
+ r.lo = x.lo & y.lo;
+ return r;
+}
+
+/* Return X | Y. */
+_GL_U64_INLINE u64
+u64or (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi | y.hi;
+ r.lo = x.lo | y.lo;
+ return r;
+}
+
+/* Return X ^ Y. */
+_GL_U64_INLINE u64
+u64xor (u64 x, u64 y)
+{
+ u64 r;
+ r.hi = x.hi ^ y.hi;
+ r.lo = x.lo ^ y.lo;
+ return r;
+}
+
+/* Return X + Y. */
+_GL_U64_INLINE u64
+u64plus (u64 x, u64 y)
+{
+ u64 r;
+ r.lo = x.lo + y.lo;
+ r.hi = x.hi + y.hi + (r.lo < x.lo);
+ return r;
+}
+
+/* Return X << N. */
+_GL_U64_INLINE u64
+u64shl (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = (x.hi << n) | (x.lo >> (32 - n));
+ r.lo = x.lo << n;
+ }
+ else
+ {
+ r.hi = x.lo << (n - 32);
+ r.lo = 0;
+ }
+ return r;
+}
+
+/* Return X >> N. */
+_GL_U64_INLINE u64
+u64shr (u64 x, int n)
+{
+ u64 r;
+ if (n < 32)
+ {
+ r.hi = x.hi >> n;
+ r.lo = (x.hi << (32 - n)) | (x.lo >> n);
+ }
+ else
+ {
+ r.hi = 0;
+ r.lo = x.hi >> (n - 32);
+ }
+ return r;
+}
+
+#endif
+
+_GL_INLINE_HEADER_END
diff --git a/lib/unicase.in.h b/lib/unicase.in.h
new file mode 100644
index 0000000..c11533a
--- /dev/null
+++ b/lib/unicase.in.h
@@ -0,0 +1,465 @@
+/* Unicode character case mappings.
+ Copyright (C) 2002, 2009-2020 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/>. */
+
+#ifndef _UNICASE_H
+#define _UNICASE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get uninorm_t. */
+#include "uninorm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Character case mappings.
+ These mappings are locale and context independent.
+ WARNING! These functions are not sufficient for languages such as German.
+ Better use the functions below that treat an entire string at once and are
+ language aware. */
+
+/* Return the uppercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_toupper (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the lowercase mapping of a Unicode character. */
+extern ucs4_t
+ uc_tolower (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the titlecase mapping of a Unicode character. */
+extern ucs4_t
+ uc_totitle (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* String case mappings. */
+
+/* These functions are locale dependent. The iso639_language argument
+ identifies the language (e.g. "tr" for Turkish). NULL means to use
+ locale independent case mappings. */
+
+/* Return the ISO 639 language code of the current locale.
+ Return "" if it is unknown, or in the "C" locale. */
+extern const char *
+ uc_locale_language (void)
+ _UC_ATTRIBUTE_PURE;
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+/* Return the uppercase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_toupper (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_toupper (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_toupper (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Return the lowercase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_tolower (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_tolower (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Return the titlecase mapping of a string.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_totitle (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_totitle (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_totitle (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* The case-mapping context given by a prefix string. */
+typedef struct casing_prefix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t last_char_except_ignorable;
+ uint32_t last_char_normal_or_above;
+ }
+ casing_prefix_context_t;
+/* The case-mapping context of the empty prefix string. */
+extern const casing_prefix_context_t unicase_empty_prefix_context;
+/* Return the case-mapping context of a given prefix string. */
+extern casing_prefix_context_t
+ u8_casing_prefix_context (const uint8_t *s, size_t n);
+extern casing_prefix_context_t
+ u16_casing_prefix_context (const uint16_t *s, size_t n);
+extern casing_prefix_context_t
+ u32_casing_prefix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the prefix concat(A, S), given the
+ case-mapping context of the prefix A. */
+extern casing_prefix_context_t
+ u8_casing_prefixes_context (const uint8_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u16_casing_prefixes_context (const uint16_t *s, size_t n,
+ casing_prefix_context_t a_context);
+extern casing_prefix_context_t
+ u32_casing_prefixes_context (const uint32_t *s, size_t n,
+ casing_prefix_context_t a_context);
+
+/* The case-mapping context given by a suffix string. */
+typedef struct casing_suffix_context
+ {
+ /* These fields are private, undocumented. */
+ uint32_t first_char_except_ignorable;
+ uint32_t bits;
+ }
+ casing_suffix_context_t;
+/* The case-mapping context of the empty suffix string. */
+extern const casing_suffix_context_t unicase_empty_suffix_context;
+/* Return the case-mapping context of a given suffix string. */
+extern casing_suffix_context_t
+ u8_casing_suffix_context (const uint8_t *s, size_t n);
+extern casing_suffix_context_t
+ u16_casing_suffix_context (const uint16_t *s, size_t n);
+extern casing_suffix_context_t
+ u32_casing_suffix_context (const uint32_t *s, size_t n);
+/* Return the case-mapping context of the suffix concat(S, A), given the
+ case-mapping context of the suffix A. */
+extern casing_suffix_context_t
+ u8_casing_suffixes_context (const uint8_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u16_casing_suffixes_context (const uint16_t *s, size_t n,
+ casing_suffix_context_t a_context);
+extern casing_suffix_context_t
+ u32_casing_suffixes_context (const uint32_t *s, size_t n,
+ casing_suffix_context_t a_context);
+
+/* Return the uppercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_toupper (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_toupper (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_toupper (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Return the lowercase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_tolower (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_tolower (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_tolower (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Return the titlecase mapping of a string that is surrounded by a prefix
+ and a suffix. */
+extern uint8_t *
+ u8_ct_totitle (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_totitle (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_totitle (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Return the case folded string.
+ Comparing uN_casefold (S1) and uN_casefold (S2) with uN_cmp2() is equivalent
+ to comparing S1 and S2 with uN_casecmp().
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization. */
+extern uint8_t *
+ u8_casefold (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_casefold (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_casefold (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+/* Likewise, for a string that is surrounded by a prefix and a suffix. */
+extern uint8_t *
+ u8_ct_casefold (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_ct_casefold (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_ct_casefold (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ uninorm_t nf,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Compare S1 and S2, ignoring differences in case and normalization.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It can also be NULL, for no normalization.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_casecmp (const uint8_t *s1, size_t n1,
+ const uint8_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u16_casecmp (const uint16_t *s1, size_t n1,
+ const uint16_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u32_casecmp (const uint32_t *s1, size_t n1,
+ const uint32_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ ulc_casecmp (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+/* Convert the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_casexfrm (S1) and uN_casexfrm (S2) with the gnulib
+ function memcmp2() is equivalent to comparing S1 and S2 with uN_casecoll().
+ NF must be either UNINORM_NFC, UNINORM_NFKC, or NULL for no normalization. */
+extern char *
+ u8_casexfrm (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern char *
+ u16_casexfrm (const uint16_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern char *
+ u32_casexfrm (const uint32_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern char *
+ ulc_casexfrm (const char *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ char *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+/* Compare S1 and S2, ignoring differences in case and normalization, using the
+ collation rules of the current locale.
+ The nf argument identifies the normalization form to apply after the
+ case-mapping. It must be either UNINORM_NFC or UNINORM_NFKC. It can also
+ be NULL, for no normalization.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_casecoll (const uint8_t *s1, size_t n1,
+ const uint8_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u16_casecoll (const uint16_t *s1, size_t n1,
+ const uint16_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ u32_casecoll (const uint32_t *s1, size_t n1,
+ const uint32_t *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+extern int
+ ulc_casecoll (const char *s1, size_t n1,
+ const char *s2, size_t n2,
+ const char *iso639_language, uninorm_t nf, int *resultp);
+
+
+/* Set *RESULTP to true if mapping NFD(S) to upper case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_uppercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_uppercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_uppercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to lower case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_lowercase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_lowercase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_lowercase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if mapping NFD(S) to title case is a no-op, or to false
+ otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_titlecase (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_titlecase (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_titlecase (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if applying case folding to NFD(S) is a no-op, or to
+ false otherwise, and return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_is_casefolded (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_casefolded (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_casefolded (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+/* Set *RESULTP to true if case matters for S, that is, if mapping NFD(S) to
+ either upper case or lower case or title case is not a no-op.
+ Set *RESULTP to false if NFD(S) maps to itself under the upper case mapping,
+ under the lower case mapping, and under the title case mapping; in other
+ words, when NFD(S) consists entirely of caseless characters.
+ Upon failure, return -1 with errno set. */
+extern int
+ u8_is_cased (const uint8_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u16_is_cased (const uint16_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+extern int
+ u32_is_cased (const uint32_t *s, size_t n,
+ const char *iso639_language,
+ bool *resultp);
+
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICASE_H */
diff --git a/lib/unicase/cased.c b/lib/unicase/cased.c
new file mode 100644
index 0000000..e6d9231
--- /dev/null
+++ b/lib/unicase/cased.c
@@ -0,0 +1,53 @@
+/* Test whether a Unicode character is cased.
+ Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "cased" if it has the Lowercase
+ or Uppercase property or has a General_Category value of
+ Titlecase_Letter. */
+
+#if 0
+
+#include "unictype.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return (uc_is_property_lowercase (uc)
+ || uc_is_property_uppercase (uc)
+ || uc_is_general_category (uc, UC_TITLECASE_LETTER));
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_cased table. */
+#include "cased.h"
+
+bool
+uc_is_cased (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_cased, uc);
+}
+
+#endif
diff --git a/lib/unicase/cased.h b/lib/unicase/cased.h
new file mode 100644
index 0000000..a488ec4
--- /dev/null
+++ b/lib/unicase/cased.h
@@ -0,0 +1,367 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ unsigned int level3[21 << 4];
+ }
+u_casing_property_cased =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 160,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 176,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 192,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 208,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 224,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 256,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 272,
+ 3 + 256 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 320,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000U, 0x00000000U, 0x07FFFFFEU, 0x07FFFFFEU,
+ 0x00000000U, 0x04200400U, 0xFF7FFFFFU, 0xFF7FFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xF7FFFFFFU, 0xFFFFFFF0U, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFEFFFFFU, 0x01FFFFFFU, 0x00000003U, 0x0000001FU,
+ 0x00000000U, 0x00000000U, 0x00000020U, 0xBCCF0000U,
+ 0xFFFFD740U, 0xFFFFFFFBU, 0xFFFFFFFFU, 0xFFBFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFC03U, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFEFFFFU, 0x007FFFFFU, 0xFFFFFFFEU,
+ 0x000000FFU, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFFFFFFU, 0x000020BFU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x3F3FFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x000001FFU, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0x3F3FFFFFU, 0xFFFFFFFFU, 0xAAFF3F3FU, 0x3FFFFFFFU,
+ 0xFFFFFFFFU, 0x5FDFFFFFU, 0x0FCF1FDCU, 0x1FDC1FFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x80020000U,
+ 0x1FFF0000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x3E2FFC84U, 0xF21FBD50U, 0x000043E0U, 0xFFFFFFFFU,
+ 0x00000018U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFC00000U, 0xFFFFFFFFU, 0x000003FFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFF7FFFU, 0x7FFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x000C781FU,
+ 0xFFFFFFFFU, 0x000020BFU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0xFFFFFFFFU, 0x00003FFFU,
+ 0x3FFFFFFFU, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFFFFFCU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFF78FFU, 0x00FF7FFFU, 0x00000000U, 0x07000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFF0000U, 0xF7FFFFFFU, 0xFFFF003FU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00F8007FU, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x07FFFFFEU, 0x07FFFFFEU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0000FFFFU, 0x00000000U,
+ 0x00000000U, 0xFFFF0000U, 0xFF0FFFFFU, 0x0FFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0x0007FFFFU, 0xFFFFFFFFU, 0x0007FFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFDFFFFFU, 0xFFFFFFFFU,
+ 0xDFFFFFFFU, 0xEBFFDE64U, 0xFFFFFFEFU, 0xFFFFFFFFU,
+ 0xDFDFE7BFU, 0x7BFFFFFFU, 0xFFFDFC5FU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFF3FU, 0xF7FFFFFDU, 0xF7FFFFFFU,
+ 0xFFDFFFFFU, 0xFFDFFFFFU, 0xFFFF7FFFU, 0xFFFF7FFFU,
+ 0xFFFFFDFFU, 0xFFFFFDFFU, 0x00000FF7U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0000000FU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFF0000U, 0xFFFF03FFU, 0xFFFF03FFU,
+ 0x000003FFU, 0x00000000U, 0x00000000U, 0x00000000U
+ }
+};
diff --git a/lib/unicase/caseprop.h b/lib/unicase/caseprop.h
new file mode 100644
index 0000000..52ce099
--- /dev/null
+++ b/lib/unicase/caseprop.h
@@ -0,0 +1,34 @@
+/* Case related properties of Unicode characters.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <stdbool.h>
+#include "unitypes.h"
+
+/* Determine whether a character is "cased" according to the Unicode Standard,
+ <https://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D120. */
+extern bool
+ uc_is_cased (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Determine whether a character is "case-ignorable"
+ according to the Unicode Standard,
+ <https://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ definition D121. */
+extern bool
+ uc_is_case_ignorable (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
diff --git a/lib/unicase/context.h b/lib/unicase/context.h
new file mode 100644
index 0000000..b5baef7
--- /dev/null
+++ b/lib/unicase/context.h
@@ -0,0 +1,65 @@
+/* Case-mapping contexts of UTF-8/UTF-16/UTF-32 substring.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+
+/* The context of a prefix string combines the information of the "Before C"
+ conditions of the Unicode Standard,
+ <https://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_prefix_context_t contains the following fields:
+
+ // Helper for evaluating the FINAL_SIGMA condition:
+ // Last character that was not case-ignorable.
+ ucs4_t last_char_except_ignorable;
+
+ // Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ // Last character that was of combining class 230 ("Above") or 0.
+ ucs4_t last_char_normal_or_above;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased and uc_is_property_soft_dotted
+ ahead of time, more often than actually needed. */
+
+
+/* The context of a suffix string combines the information of the "After C"
+ conditions of the Unicode Standard,
+ <https://www.unicode.org/versions/Unicode5.0.0/ch03.pdf>, section 3.13,
+ table 3-14 "Context Specification for Casing".
+
+ casing_suffix_context_t contains the following fields:
+
+ // For evaluating the FINAL_SIGMA condition:
+ // First character that was not case-ignorable.
+ ucs4_t first_char_except_ignorable;
+
+ // For evaluating the MORE_ABOVE condition:
+ // Bit 0 is set if the suffix contains a character of combining class
+ // 230 (Above) with no character of combining class 0 or 230 (Above)
+ // before it.
+ //
+ // For evaluating the BEFORE_DOT condition:
+ // Bit 1 is set if the suffix contains a COMBINING DOT ABOVE (U+0307)
+ // with no character of combining class 0 or 230 (Above) before it.
+ //
+ uint32_t bits;
+
+ Three bits would be sufficient to carry the context information, but
+ that would require to invoke uc_is_cased ahead of time, more often than
+ actually needed. */
+#define SCC_MORE_ABOVE_MASK 1
+#define SCC_BEFORE_DOT_MASK 2
diff --git a/lib/unicase/empty-prefix-context.c b/lib/unicase/empty-prefix-context.c
new file mode 100644
index 0000000..36dded6
--- /dev/null
+++ b/lib/unicase/empty-prefix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty prefix string.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_prefix_context_t unicase_empty_prefix_context =
+ {
+ 0xFFFD /* last_char_except_ignorable */,
+ 0xFFFD /* last_char_normal_or_above */
+ };
diff --git a/lib/unicase/empty-suffix-context.c b/lib/unicase/empty-suffix-context.c
new file mode 100644
index 0000000..3fa49c6
--- /dev/null
+++ b/lib/unicase/empty-suffix-context.c
@@ -0,0 +1,27 @@
+/* Case-mapping context of empty suffix string.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+const casing_suffix_context_t unicase_empty_suffix_context =
+ {
+ 0xFFFD /* first_char_except_ignorable */,
+ 0 /* bits */
+ };
diff --git a/lib/unicase/ignorable.c b/lib/unicase/ignorable.c
new file mode 100644
index 0000000..a07497b
--- /dev/null
+++ b/lib/unicase/ignorable.c
@@ -0,0 +1,71 @@
+/* Test whether a Unicode character is case-ignorable.
+ Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "caseprop.h"
+
+/* Quoting the Unicode standard:
+ Definition: A character is defined to be "case-ignorable" if it has the
+ value MidLetter {or the value MidNumLet} for the Word_Break property or
+ its General_Category is one of Nonspacing_Mark (Mn), Enclosing_Mark (Me),
+ Format (Cf), Modifier_Letter (Lm), or Modifier_Symbol (Sk).
+ The text marked in braces was added in Unicode 5.1.0, see
+ <https://www.unicode.org/versions/Unicode5.1.0/> section "Update of
+ Definition of case-ignorable". */
+/* Since this predicate is only used for the "Before C" and "After C"
+ conditions of FINAL_SIGMA, we exclude the "cased" characters here.
+ This simplifies the evaluation of the regular expressions
+ \p{cased} (\p{case-ignorable})* C
+ and
+ C (\p{case-ignorable})* \p{cased}
+ */
+
+#if 0
+
+#include "unictype.h"
+#include "uniwbrk.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ int wbp = uc_wordbreak_property (uc);
+
+ return (wbp == WBP_MIDLETTER || wbp == WBP_MIDNUMLET
+ || uc_is_general_category_withtable (uc, UC_CATEGORY_MASK_Mn
+ | UC_CATEGORY_MASK_Me
+ | UC_CATEGORY_MASK_Cf
+ | UC_CATEGORY_MASK_Lm
+ | UC_CATEGORY_MASK_Sk))
+ && !uc_is_cased (uc);
+}
+
+#else
+
+#include "unictype/bitmap.h"
+
+/* Define u_casing_property_case_ignorable table. */
+#include "ignorable.h"
+
+bool
+uc_is_case_ignorable (ucs4_t uc)
+{
+ return bitmap_lookup (&u_casing_property_case_ignorable, uc);
+}
+
+#endif
diff --git a/lib/unicase/ignorable.h b/lib/unicase/ignorable.h
new file mode 100644
index 0000000..2bb8286
--- /dev/null
+++ b/lib/unicase/ignorable.h
@@ -0,0 +1,600 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Casing Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[15];
+ short level2[3 << 7];
+ unsigned int level3[44 << 4];
+ }
+u_casing_property_case_ignorable =
+{
+ { 15 },
+ {
+ 16 * sizeof (int) / sizeof (short) + 0,
+ 16 * sizeof (int) / sizeof (short) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 * sizeof (int) / sizeof (short) + 256
+ },
+ {
+ 16 + 384 * sizeof (short) / sizeof (int) + 0,
+ 16 + 384 * sizeof (short) / sizeof (int) + 16,
+ 16 + 384 * sizeof (short) / sizeof (int) + 32,
+ 16 + 384 * sizeof (short) / sizeof (int) + 48,
+ 16 + 384 * sizeof (short) / sizeof (int) + 64,
+ 16 + 384 * sizeof (short) / sizeof (int) + 80,
+ 16 + 384 * sizeof (short) / sizeof (int) + 96,
+ 16 + 384 * sizeof (short) / sizeof (int) + 112,
+ 16 + 384 * sizeof (short) / sizeof (int) + 128,
+ 16 + 384 * sizeof (short) / sizeof (int) + 144,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 160,
+ 16 + 384 * sizeof (short) / sizeof (int) + 176,
+ 16 + 384 * sizeof (short) / sizeof (int) + 192,
+ 16 + 384 * sizeof (short) / sizeof (int) + 208,
+ 16 + 384 * sizeof (short) / sizeof (int) + 224,
+ 16 + 384 * sizeof (short) / sizeof (int) + 240,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 256,
+ 16 + 384 * sizeof (short) / sizeof (int) + 272,
+ 16 + 384 * sizeof (short) / sizeof (int) + 288,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 304,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 320,
+ 16 + 384 * sizeof (short) / sizeof (int) + 336,
+ 16 + 384 * sizeof (short) / sizeof (int) + 352,
+ 16 + 384 * sizeof (short) / sizeof (int) + 368,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 384,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 400,
+ 16 + 384 * sizeof (short) / sizeof (int) + 416,
+ 16 + 384 * sizeof (short) / sizeof (int) + 432,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 448,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 464,
+ 16 + 384 * sizeof (short) / sizeof (int) + 480,
+ 16 + 384 * sizeof (short) / sizeof (int) + 496,
+ 16 + 384 * sizeof (short) / sizeof (int) + 512,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 528,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 544,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 560,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 576,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 592,
+ 16 + 384 * sizeof (short) / sizeof (int) + 608,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 624,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 640,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 656,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 672,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 16 + 384 * sizeof (short) / sizeof (int) + 688,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000U, 0x04004000U, 0x40000000U, 0x00000001U,
+ 0x00000000U, 0x0190A100U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFE000000U, 0xFFFFFFFCU, 0xFFFFFFE0U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFDFU, 0x0030FFFFU,
+ 0x000000B0U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x000003F8U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x02000000U, 0x00000000U,
+ 0xFFFE0000U, 0xBFFFFFFFU, 0x000000B6U, 0x00100000U,
+ 0x17FF003FU, 0x00000000U, 0xFFFFF801U, 0x00010000U,
+ 0x00000000U, 0x00000000U, 0xBFC00000U, 0x00003DFFU,
+ 0x00028000U, 0xFFFF0000U, 0x000007FFU, 0x00000000U,
+ 0x00000000U, 0x0001FFC0U, 0x00000000U, 0x043FF800U,
+ 0xFFC00000U, 0x00003FFFU, 0x0E000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0xFFF00000U, 0xFFFFFFFFU,
+ 0x00000007U, 0x14000000U, 0x00FE21FEU, 0x0002000CU,
+ 0x00000002U, 0x10000000U, 0x0000201EU, 0x0000000CU,
+ 0x00000006U, 0x10000000U, 0x00023986U, 0x00230000U,
+ 0x00000006U, 0x10000000U, 0x000021BEU, 0x0000000CU,
+ 0x00000002U, 0x90000000U, 0x0040201EU, 0x0000000CU,
+ 0x00000004U, 0x00000000U, 0x00002001U, 0x00000000U,
+ 0x00000001U, 0xC0000000U, 0x00603DC1U, 0x0000000CU,
+ 0x00000002U, 0x90000000U, 0x00003040U, 0x0000000CU,
+ 0x00000002U, 0x00000000U, 0x0000201EU, 0x0000000CU,
+ 0x00000000U, 0x00000000U, 0x005C0400U, 0x00000000U,
+ 0x00000000U, 0x07F20000U, 0x00007FC0U, 0x00000000U,
+ 0x00000000U, 0x1BF20000U, 0x00003F40U, 0x00000000U,
+ 0x03000000U, 0x02A00000U, 0x00000000U, 0x7FFE0000U,
+ 0xFEFFE0DFU, 0x1FFFFFFFU, 0x00000040U, 0x00000000U,
+ 0x00000000U, 0x66FDE000U, 0xC3000000U, 0x001E0001U,
+ 0x20002064U, 0x00000000U, 0x00000000U, 0x10000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0xE0000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x001C0000U, 0x001C0000U, 0x000C0000U, 0x000C0000U,
+ 0x00000000U, 0x3FB00000U, 0x208FFE40U, 0x00000000U,
+ 0x00007800U, 0x00000000U, 0x00000008U, 0x00000000U,
+ 0x00000060U, 0x00000200U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x0E040187U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x09800000U, 0x00000000U, 0x7F400000U, 0x9FF81FE5U,
+ 0x00000000U, 0x7FFF0080U, 0x00000000U, 0x00000000U,
+ 0x0000000FU, 0x17D00000U, 0x00000004U, 0x000FF800U,
+ 0x00000003U, 0x00003B3CU, 0x00000000U, 0x0003A340U,
+ 0x00000000U, 0x00CFF000U, 0x00000000U, 0x3F000000U,
+ 0x00000000U, 0x00000000U, 0xFFF70000U, 0x031021FDU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0xFFFFFFFFU, 0xF83FFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xA0000000U, 0xE000E003U, 0x6000E000U,
+ 0x0300F800U, 0x00007C90U, 0x00000000U, 0x0000FFDFU,
+ 0x00000000U, 0x00000000U, 0xFFFF0000U, 0x0001FFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00038000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x80008000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0xFFFFFFFFU,
+ 0x00000000U, 0x00008000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000020U, 0x083E3C00U, 0x00000000U, 0x00000000U,
+ 0x7E000000U, 0x00000000U, 0x00000000U, 0x70000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00200000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x3F000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00001000U, 0x00000000U, 0x00000000U, 0xBFF78000U,
+ 0xC0000000U, 0x00000000U, 0x00000000U, 0x00030000U,
+ 0xFFFFFFFFU, 0x00000003U, 0x00000000U, 0x00000000U,
+ 0x00000700U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000844U, 0x00000060U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000030U, 0x0003FFFFU,
+ 0x00000000U, 0x00003FC0U, 0x0003FF80U, 0x00000000U,
+ 0x00000007U, 0x13C80000U, 0x00008000U, 0x00000060U,
+ 0x00000000U, 0x00667E00U, 0x00001008U, 0x10010000U,
+ 0x00000000U, 0xC19D0000U, 0x20000002U, 0x00583000U,
+ 0x00000000U, 0x00000000U, 0x08000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00002120U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x40000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFFFC0000U, 0x00000003U, 0x00000000U,
+ 0x0008FFFFU, 0x0000FFFFU, 0x00240000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x80000000U,
+ 0x04004080U, 0x40000000U, 0x00000001U, 0x00010000U,
+ 0xC0000000U, 0x00000000U, 0x00000000U, 0x0E000008U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x20000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000001U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x07C00000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x0000F06EU, 0x87000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000060U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000002U, 0xFF000000U, 0x0000007FU, 0x80000000U,
+ 0x00000003U, 0x26780000U, 0x00000000U, 0x00000000U,
+ 0x00000007U, 0x001FEF80U, 0x00000000U, 0x00080000U,
+ 0x00000003U, 0x7FC00000U, 0x00001C00U, 0x00000000U,
+ 0x00000000U, 0x40D38000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x80000000U, 0x000007F8U,
+ 0x00000003U, 0x10000000U, 0x00000001U, 0x001F1FC0U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xFF000000U, 0x0000005CU, 0x00000000U,
+ 0x00000000U, 0x85F80000U, 0x0000000DU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xB03C0000U, 0x30000001U, 0x00000000U,
+ 0x00000000U, 0xA7F80000U, 0x00000001U, 0x00000000U,
+ 0x00000000U, 0x00BF2800U, 0x00000000U, 0x00000000U,
+ 0xE0000000U, 0x00000FBCU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0xBF7F0000U, 0x00000000U, 0x00000000U,
+ 0xFFFC0000U, 0x006DFCFFU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x001F0000U,
+ 0x00000000U, 0x007F0000U, 0x0000000FU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFF8000U, 0x00000000U, 0x00000000U, 0x00000001U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x60000000U, 0x0000000FU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0xFFF80380U,
+ 0x00000FE7U, 0x00003C00U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x0000001CU, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xF87FFFFFU, 0xFFFFFFFFU, 0x00201FFFU,
+ 0xF8000010U, 0x0000FFFEU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xF9FFFF7FU, 0x000007DBU, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x007F0000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x000007F0U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0xF8000000U,
+ 0x00000002U, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU,
+ 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0x0000FFFFU
+ }
+};
diff --git a/lib/unicase/simple-mapping.h b/lib/unicase/simple-mapping.h
new file mode 100644
index 0000000..626a24c
--- /dev/null
+++ b/lib/unicase/simple-mapping.h
@@ -0,0 +1,39 @@
+/* Simple case mapping for Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+ucs4_t
+FUNC (ucs4_t uc)
+{
+ unsigned int index1 = uc >> mapping_header_0;
+ if (index1 < mapping_header_1)
+ {
+ int lookup1 = u_mapping.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> mapping_header_2) & mapping_header_3;
+ int lookup2 = u_mapping.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & mapping_header_4);
+ int lookup3 = u_mapping.level3[lookup2 + index3];
+
+ return uc + lookup3;
+ }
+ }
+ }
+ return uc;
+}
diff --git a/lib/unicase/special-casing-table.gperf b/lib/unicase/special-casing-table.gperf
new file mode 100644
index 0000000..287f49a
--- /dev/null
+++ b/lib/unicase/special-casing-table.gperf
@@ -0,0 +1,136 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Special casing rules of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+struct special_casing_rule { char code[3]; };
+%struct-type
+%language=ANSI-C
+%define slot-name code
+%define hash-function-name gl_unicase_special_hash
+%define lookup-function-name gl_unicase_special_lookup
+%compare-lengths
+%compare-strncmp
+%readonly-tables
+%omit-struct-type
+%%
+"\x00\x49\x00", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x49\x01", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x02", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x03", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x49\x04", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }
+"\x00\x4a\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 }
+"\x00\x69\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\x69\x01", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x00\xcc\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 }
+"\x00\xcd\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 }
+"\x00\xdf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 }
+"\x01\x28\x00", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 }
+"\x01\x2e\x00", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 }
+"\x01\x30\x00", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x01", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }
+"\x01\x30\x02", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }
+"\x01\x49\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 }
+"\x01\xf0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 }
+"\x03\x07\x00", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x01", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x07\x02", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }
+"\x03\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x03\xa3\x00", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 }
+"\x03\xb0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x05\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 }
+"\x1e\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 }
+"\x1e\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 }
+"\x1e\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 }
+"\x1e\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 }
+"\x1e\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 }
+"\x1e\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 }
+"\x1f\x50\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 }
+"\x1f\x52\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 }
+"\x1f\x54\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 }
+"\x1f\x56\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 }
+"\x1f\x80\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x81\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x82\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x83\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x84\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x85\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x86\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x87\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x88\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }
+"\x1f\x89\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }
+"\x1f\x8a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }
+"\x1f\x8b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }
+"\x1f\x8c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }
+"\x1f\x8d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }
+"\x1f\x8e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }
+"\x1f\x8f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }
+"\x1f\x90\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x91\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x92\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x93\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x94\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x95\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x96\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x97\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\x98\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }
+"\x1f\x99\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }
+"\x1f\x9a\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }
+"\x1f\x9b\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }
+"\x1f\x9c\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }
+"\x1f\x9d\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }
+"\x1f\x9e\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }
+"\x1f\x9f\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }
+"\x1f\xa0\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa1\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xa2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xa3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xa4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xa5\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xa6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xa7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xa8\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }
+"\x1f\xa9\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }
+"\x1f\xaa\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }
+"\x1f\xab\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }
+"\x1f\xac\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }
+"\x1f\xad\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }
+"\x1f\xae\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }
+"\x1f\xaf\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }
+"\x1f\xb2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 }
+"\x1f\xb3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xb4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 }
+"\x1f\xb6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 }
+"\x1f\xb7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 }
+"\x1f\xbc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }
+"\x1f\xc2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 }
+"\x1f\xc3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xc4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 }
+"\x1f\xc6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 }
+"\x1f\xc7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 }
+"\x1f\xcc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }
+"\x1f\xd2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 }
+"\x1f\xd3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }
+"\x1f\xd6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 }
+"\x1f\xd7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 }
+"\x1f\xe2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 }
+"\x1f\xe3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }
+"\x1f\xe4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 }
+"\x1f\xe6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 }
+"\x1f\xe7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 }
+"\x1f\xf2\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 }
+"\x1f\xf3\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\x1f\xf4\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 }
+"\x1f\xf6\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 }
+"\x1f\xf7\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 }
+"\x1f\xfc\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }
+"\xfb\x00\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 }
+"\xfb\x01\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 }
+"\xfb\x02\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 }
+"\xfb\x03\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 }
+"\xfb\x04\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C }
+"\xfb\x05\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x06\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }
+"\xfb\x13\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 }
+"\xfb\x14\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 }
+"\xfb\x15\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 }
+"\xfb\x16\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 }
+"\xfb\x17\x00", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 }
diff --git a/lib/unicase/special-casing-table.h b/lib/unicase/special-casing-table.h
new file mode 100644
index 0000000..4943541
--- /dev/null
+++ b/lib/unicase/special-casing-table.h
@@ -0,0 +1,333 @@
+/* ANSI-C code produced by gperf version 3.1 */
+/* Command-line: gperf -m 10 ./unicase/special-casing-table.gperf */
+/* Computed positions: -k'1-3' */
+
+
+#define TOTAL_KEYWORDS 122
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 3
+#define MIN_HASH_VALUE 0
+#define MAX_HASH_VALUE 121
+/* maximum key range = 122, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+gl_unicase_special_hash (register const char *str, register size_t len)
+{
+ static const unsigned char asso_values[] =
+ {
+ 2, 0, 4, 5, 37, 12, 121, 4, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 120,
+ 119, 118, 117, 116, 122, 122, 122, 122, 122, 122,
+ 5, 3, 122, 122, 122, 122, 122, 122, 122, 122,
+ 115, 122, 122, 122, 122, 122, 114, 122, 6, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 1, 111, 122, 122, 122, 122, 122,
+ 109, 122, 108, 122, 107, 122, 106, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 33, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
+ 122, 122, 122, 122, 122, 122, 122, 122, 105, 104,
+ 103, 102, 101, 100, 99, 31, 98, 97, 96, 95,
+ 94, 93, 92, 91, 28, 90, 89, 88, 87, 86,
+ 27, 24, 23, 20, 19, 85, 84, 83, 16, 82,
+ 81, 80, 79, 15, 78, 77, 76, 75, 74, 73,
+ 72, 71, 70, 69, 68, 67, 64, 122, 65, 64,
+ 63, 122, 62, 61, 122, 122, 122, 122, 60, 122,
+ 122, 122, 122, 122, 59, 58, 57, 122, 56, 55,
+ 122, 122, 122, 122, 14, 55, 122, 122, 122, 122,
+ 53, 52, 122, 122, 51, 50, 122, 122, 122, 122,
+ 122, 122, 122, 50, 122, 122, 48, 47, 46, 122,
+ 45, 44, 122, 122, 122, 122, 122, 122, 122, 122,
+ 46, 122, 42, 41, 39, 122, 38, 35, 122, 122,
+ 122, 0, 33, 122, 122, 122, 122
+ };
+ return asso_values[(unsigned char)str[2]+1] + asso_values[(unsigned char)str[1]] + asso_values[(unsigned char)str[0]];
+}
+
+const struct special_casing_rule *
+gl_unicase_special_lookup (register const char *str, register size_t len)
+{
+ static const unsigned char lengthtable[] =
+ {
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
+ };
+ static const struct special_casing_rule wordlist[] =
+ {
+#line 126 "./unicase/special-casing-table.gperf"
+ {"\373\001\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0049, 0 }, { 0xFB01, 0, 0 }, { 0x0046, 0x0069, 0 }, { 0x0066, 0x0069, 0 }},
+#line 31 "./unicase/special-casing-table.gperf"
+ {"\001I\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x02BC, 0x004E, 0 }, { 0x0149, 0, 0 }, { 0x02BC, 0x004E, 0 }, { 0x02BC, 0x006E, 0 }},
+#line 125 "./unicase/special-casing-table.gperf"
+ {"\373\000\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0 }, { 0xFB00, 0, 0 }, { 0x0046, 0x0066, 0 }, { 0x0066, 0x0066, 0 }},
+#line 15 "./unicase/special-casing-table.gperf"
+ {"\000I\000", 1, SCC_MORE_ABOVE , { 'l', 't' }, { 0x0049, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }},
+#line 127 "./unicase/special-casing-table.gperf"
+ {"\373\002\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x004C, 0 }, { 0xFB02, 0, 0 }, { 0x0046, 0x006C, 0 }, { 0x0066, 0x006C, 0 }},
+#line 128 "./unicase/special-casing-table.gperf"
+ {"\373\003\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0, 0 }, { 0x0046, 0x0066, 0x0069 }, { 0x0066, 0x0066, 0x0069 }},
+#line 28 "./unicase/special-casing-table.gperf"
+ {"\0010\000", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }},
+#line 16 "./unicase/special-casing-table.gperf"
+ {"\000I\001", 1, -SCC_BEFORE_DOT , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }},
+#line 17 "./unicase/special-casing-table.gperf"
+ {"\000I\002", 1, -SCC_BEFORE_DOT , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }},
+#line 33 "./unicase/special-casing-table.gperf"
+ {"\003\007\000", 1, SCC_AFTER_SOFT_DOTTED, { 'l', 't' }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }},
+#line 29 "./unicase/special-casing-table.gperf"
+ {"\0010\001", 1, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }},
+#line 30 "./unicase/special-casing-table.gperf"
+ {"\0010\002", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0x0307, 0 }},
+#line 130 "./unicase/special-casing-table.gperf"
+ {"\373\005\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB05, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }},
+#line 34 "./unicase/special-casing-table.gperf"
+ {"\003\007\001", 1, SCC_AFTER_I , { 't', 'r' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }},
+#line 35 "./unicase/special-casing-table.gperf"
+ {"\003\007\002", 0, SCC_AFTER_I , { 'a', 'z' }, { 0x0307, 0, 0 }, { 0, 0, 0 }, { 0x0307, 0, 0 }, { 0x0307, 0, 0 }},
+#line 19 "./unicase/special-casing-table.gperf"
+ {"\000I\004", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }},
+#line 23 "./unicase/special-casing-table.gperf"
+ {"\000\314\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CC, 0, 0 }, { 0x0069, 0x0307, 0x0300 }, { 0x00CC, 0, 0 }, { 0x00EC, 0, 0 }},
+#line 109 "./unicase/special-casing-table.gperf"
+ {"\037\314\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }},
+#line 85 "./unicase/special-casing-table.gperf"
+ {"\037\243\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }},
+#line 80 "./unicase/special-casing-table.gperf"
+ {"\037\236\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }},
+#line 37 "./unicase/special-casing-table.gperf"
+ {"\003\243\000", 0, SCC_FINAL_SIGMA , { '\0', '\0' }, { 0x03A3, 0, 0 }, { 0x03C2, 0, 0 }, { 0x03A3, 0, 0 }, { 0x03C3, 0, 0 }},
+#line 45 "./unicase/special-casing-table.gperf"
+ {"\036\236\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1E9E, 0, 0 }, { 0x00DF, 0, 0 }, { 0x1E9E, 0, 0 }, { 0x0073, 0x0073, 0 }},
+#line 76 "./unicase/special-casing-table.gperf"
+ {"\037\232\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }},
+#line 75 "./unicase/special-casing-table.gperf"
+ {"\037\231\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }},
+#line 44 "./unicase/special-casing-table.gperf"
+ {"\036\232\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0041, 0x02BE, 0 }, { 0x1E9A, 0, 0 }, { 0x0041, 0x02BE, 0 }, { 0x0061, 0x02BE, 0 }},
+#line 43 "./unicase/special-casing-table.gperf"
+ {"\036\231\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0059, 0x030A, 0 }, { 0x1E99, 0, 0 }, { 0x0059, 0x030A, 0 }, { 0x0079, 0x030A, 0 }},
+#line 74 "./unicase/special-casing-table.gperf"
+ {"\037\230\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }},
+#line 73 "./unicase/special-casing-table.gperf"
+ {"\037\227\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }},
+#line 42 "./unicase/special-casing-table.gperf"
+ {"\036\230\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0057, 0x030A, 0 }, { 0x1E98, 0, 0 }, { 0x0057, 0x030A, 0 }, { 0x0077, 0x030A, 0 }},
+#line 41 "./unicase/special-casing-table.gperf"
+ {"\036\227\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0054, 0x0308, 0 }, { 0x1E97, 0, 0 }, { 0x0054, 0x0308, 0 }, { 0x0074, 0x0308, 0 }},
+#line 72 "./unicase/special-casing-table.gperf"
+ {"\037\226\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2E, 0x0399, 0 }, { 0x1F96, 0, 0 }, { 0x1F9E, 0, 0 }, { 0x1F26, 0x03B9, 0 }},
+#line 66 "./unicase/special-casing-table.gperf"
+ {"\037\220\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F28, 0x0399, 0 }, { 0x1F90, 0, 0 }, { 0x1F98, 0, 0 }, { 0x1F20, 0x03B9, 0 }},
+#line 40 "./unicase/special-casing-table.gperf"
+ {"\036\226\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0048, 0x0331, 0 }, { 0x1E96, 0, 0 }, { 0x0048, 0x0331, 0 }, { 0x0068, 0x0331, 0 }},
+#line 36 "./unicase/special-casing-table.gperf"
+ {"\003\220\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }},
+#line 57 "./unicase/special-casing-table.gperf"
+ {"\037\207\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }},
+#line 21 "./unicase/special-casing-table.gperf"
+ {"\000i\000", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }},
+#line 124 "./unicase/special-casing-table.gperf"
+ {"\037\374\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }},
+#line 129 "./unicase/special-casing-table.gperf"
+ {"\373\004\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0, 0 }, { 0x0046, 0x0066, 0x006C }, { 0x0066, 0x0066, 0x006C }},
+#line 123 "./unicase/special-casing-table.gperf"
+ {"\037\367\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0, 0 }, { 0x03A9, 0x0342, 0x0345 }, { 0x03C9, 0x0342, 0x03B9 }},
+#line 22 "./unicase/special-casing-table.gperf"
+ {"\000i\001", 0, SCC_ALWAYS , { 'a', 'z' }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }, { 0x0130, 0, 0 }, { 0x0069, 0, 0 }},
+#line 18 "./unicase/special-casing-table.gperf"
+ {"\000I\003", 1, SCC_ALWAYS , { 't', 'r' }, { 0x0049, 0, 0 }, { 0x0069, 0, 0 }, { 0x0049, 0, 0 }, { 0x0131, 0, 0 }},
+#line 122 "./unicase/special-casing-table.gperf"
+ {"\037\366\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0342, 0 }, { 0x1FF6, 0, 0 }, { 0x03A9, 0x0342, 0 }, { 0x03C9, 0x0342, 0 }},
+#line 121 "./unicase/special-casing-table.gperf"
+ {"\037\364\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x038F, 0x0399, 0 }, { 0x1FF4, 0, 0 }, { 0x038F, 0x0345, 0 }, { 0x03CE, 0x03B9, 0 }},
+#line 39 "./unicase/special-casing-table.gperf"
+ {"\005\207\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0535, 0x0552, 0 }, { 0x0587, 0, 0 }, { 0x0535, 0x0582, 0 }, { 0x0565, 0x0582, 0 }},
+#line 120 "./unicase/special-casing-table.gperf"
+ {"\037\363\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A9, 0x0399, 0 }, { 0x1FF3, 0, 0 }, { 0x1FFC, 0, 0 }, { 0x03C9, 0x03B9, 0 }},
+#line 119 "./unicase/special-casing-table.gperf"
+ {"\037\362\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FFA, 0x0399, 0 }, { 0x1FF2, 0, 0 }, { 0x1FFA, 0x0345, 0 }, { 0x1F7C, 0x03B9, 0 }},
+#line 32 "./unicase/special-casing-table.gperf"
+ {"\001\360\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x004A, 0x030C, 0 }, { 0x01F0, 0, 0 }, { 0x004A, 0x030C, 0 }, { 0x006A, 0x030C, 0 }},
+#line 118 "./unicase/special-casing-table.gperf"
+ {"\037\347\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0, 0 }, { 0x03A5, 0x0308, 0x0342 }, { 0x03C5, 0x0308, 0x0342 }},
+#line 117 "./unicase/special-casing-table.gperf"
+ {"\037\346\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0342, 0 }, { 0x1FE6, 0, 0 }, { 0x03A5, 0x0342, 0 }, { 0x03C5, 0x0342, 0 }},
+#line 116 "./unicase/special-casing-table.gperf"
+ {"\037\344\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A1, 0x0313, 0 }, { 0x1FE4, 0, 0 }, { 0x03A1, 0x0313, 0 }, { 0x03C1, 0x0313, 0 }},
+#line 115 "./unicase/special-casing-table.gperf"
+ {"\037\343\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }},
+#line 114 "./unicase/special-casing-table.gperf"
+ {"\037\342\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0, 0 }, { 0x03A5, 0x0308, 0x0300 }, { 0x03C5, 0x0308, 0x0300 }},
+#line 25 "./unicase/special-casing-table.gperf"
+ {"\000\337\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0053, 0 }, { 0x00DF, 0, 0 }, { 0x0053, 0x0073, 0 }, { 0x0073, 0x0073, 0 }},
+#line 113 "./unicase/special-casing-table.gperf"
+ {"\037\327\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0, 0 }, { 0x0399, 0x0308, 0x0342 }, { 0x03B9, 0x0308, 0x0342 }},
+#line 112 "./unicase/special-casing-table.gperf"
+ {"\037\326\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0342, 0 }, { 0x1FD6, 0, 0 }, { 0x0399, 0x0342, 0 }, { 0x03B9, 0x0342, 0 }},
+#line 111 "./unicase/special-casing-table.gperf"
+ {"\037\323\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0, 0 }, { 0x0399, 0x0308, 0x0301 }, { 0x03B9, 0x0308, 0x0301 }},
+#line 110 "./unicase/special-casing-table.gperf"
+ {"\037\322\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0, 0 }, { 0x0399, 0x0308, 0x0300 }, { 0x03B9, 0x0308, 0x0300 }},
+#line 24 "./unicase/special-casing-table.gperf"
+ {"\000\315\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x00CD, 0, 0 }, { 0x0069, 0x0307, 0x0301 }, { 0x00CD, 0, 0 }, { 0x00ED, 0, 0 }},
+#line 108 "./unicase/special-casing-table.gperf"
+ {"\037\307\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0, 0 }, { 0x0397, 0x0342, 0x0345 }, { 0x03B7, 0x0342, 0x03B9 }},
+#line 107 "./unicase/special-casing-table.gperf"
+ {"\037\306\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0342, 0 }, { 0x1FC6, 0, 0 }, { 0x0397, 0x0342, 0 }, { 0x03B7, 0x0342, 0 }},
+#line 106 "./unicase/special-casing-table.gperf"
+ {"\037\304\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0389, 0x0399, 0 }, { 0x1FC4, 0, 0 }, { 0x0389, 0x0345, 0 }, { 0x03AE, 0x03B9, 0 }},
+#line 105 "./unicase/special-casing-table.gperf"
+ {"\037\303\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0397, 0x0399, 0 }, { 0x1FC3, 0, 0 }, { 0x1FCC, 0, 0 }, { 0x03B7, 0x03B9, 0 }},
+#line 104 "./unicase/special-casing-table.gperf"
+ {"\037\302\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FCA, 0x0399, 0 }, { 0x1FC2, 0, 0 }, { 0x1FCA, 0x0345, 0 }, { 0x1F74, 0x03B9, 0 }},
+#line 103 "./unicase/special-casing-table.gperf"
+ {"\037\274\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }},
+#line 102 "./unicase/special-casing-table.gperf"
+ {"\037\267\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0, 0 }, { 0x0391, 0x0342, 0x0345 }, { 0x03B1, 0x0342, 0x03B9 }},
+#line 101 "./unicase/special-casing-table.gperf"
+ {"\037\266\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0342, 0 }, { 0x1FB6, 0, 0 }, { 0x0391, 0x0342, 0 }, { 0x03B1, 0x0342, 0 }},
+#line 100 "./unicase/special-casing-table.gperf"
+ {"\037\264\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0386, 0x0399, 0 }, { 0x1FB4, 0, 0 }, { 0x0386, 0x0345, 0 }, { 0x03AC, 0x03B9, 0 }},
+#line 99 "./unicase/special-casing-table.gperf"
+ {"\037\263\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0391, 0x0399, 0 }, { 0x1FB3, 0, 0 }, { 0x1FBC, 0, 0 }, { 0x03B1, 0x03B9, 0 }},
+#line 98 "./unicase/special-casing-table.gperf"
+ {"\037\262\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1FBA, 0x0399, 0 }, { 0x1FB2, 0, 0 }, { 0x1FBA, 0x0345, 0 }, { 0x1F70, 0x03B9, 0 }},
+#line 38 "./unicase/special-casing-table.gperf"
+ {"\003\260\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0, 0 }, { 0x03A5, 0x0308, 0x0301 }, { 0x03C5, 0x0308, 0x0301 }},
+#line 97 "./unicase/special-casing-table.gperf"
+ {"\037\257\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }},
+#line 96 "./unicase/special-casing-table.gperf"
+ {"\037\256\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }},
+#line 95 "./unicase/special-casing-table.gperf"
+ {"\037\255\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }},
+#line 94 "./unicase/special-casing-table.gperf"
+ {"\037\254\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }},
+#line 93 "./unicase/special-casing-table.gperf"
+ {"\037\253\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6B, 0x0399, 0 }, { 0x1FA3, 0, 0 }, { 0x1FAB, 0, 0 }, { 0x1F63, 0x03B9, 0 }},
+#line 92 "./unicase/special-casing-table.gperf"
+ {"\037\252\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }},
+#line 91 "./unicase/special-casing-table.gperf"
+ {"\037\251\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }},
+#line 90 "./unicase/special-casing-table.gperf"
+ {"\037\250\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }},
+#line 89 "./unicase/special-casing-table.gperf"
+ {"\037\247\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6F, 0x0399, 0 }, { 0x1FA7, 0, 0 }, { 0x1FAF, 0, 0 }, { 0x1F67, 0x03B9, 0 }},
+#line 88 "./unicase/special-casing-table.gperf"
+ {"\037\246\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6E, 0x0399, 0 }, { 0x1FA6, 0, 0 }, { 0x1FAE, 0, 0 }, { 0x1F66, 0x03B9, 0 }},
+#line 87 "./unicase/special-casing-table.gperf"
+ {"\037\245\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6D, 0x0399, 0 }, { 0x1FA5, 0, 0 }, { 0x1FAD, 0, 0 }, { 0x1F65, 0x03B9, 0 }},
+#line 86 "./unicase/special-casing-table.gperf"
+ {"\037\244\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6C, 0x0399, 0 }, { 0x1FA4, 0, 0 }, { 0x1FAC, 0, 0 }, { 0x1F64, 0x03B9, 0 }},
+#line 84 "./unicase/special-casing-table.gperf"
+ {"\037\242\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F6A, 0x0399, 0 }, { 0x1FA2, 0, 0 }, { 0x1FAA, 0, 0 }, { 0x1F62, 0x03B9, 0 }},
+#line 83 "./unicase/special-casing-table.gperf"
+ {"\037\241\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F69, 0x0399, 0 }, { 0x1FA1, 0, 0 }, { 0x1FA9, 0, 0 }, { 0x1F61, 0x03B9, 0 }},
+#line 82 "./unicase/special-casing-table.gperf"
+ {"\037\240\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F68, 0x0399, 0 }, { 0x1FA0, 0, 0 }, { 0x1FA8, 0, 0 }, { 0x1F60, 0x03B9, 0 }},
+#line 81 "./unicase/special-casing-table.gperf"
+ {"\037\237\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2F, 0x0399, 0 }, { 0x1F97, 0, 0 }, { 0x1F9F, 0, 0 }, { 0x1F27, 0x03B9, 0 }},
+#line 79 "./unicase/special-casing-table.gperf"
+ {"\037\235\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }},
+#line 78 "./unicase/special-casing-table.gperf"
+ {"\037\234\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }},
+#line 77 "./unicase/special-casing-table.gperf"
+ {"\037\233\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }},
+#line 71 "./unicase/special-casing-table.gperf"
+ {"\037\225\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2D, 0x0399, 0 }, { 0x1F95, 0, 0 }, { 0x1F9D, 0, 0 }, { 0x1F25, 0x03B9, 0 }},
+#line 70 "./unicase/special-casing-table.gperf"
+ {"\037\224\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2C, 0x0399, 0 }, { 0x1F94, 0, 0 }, { 0x1F9C, 0, 0 }, { 0x1F24, 0x03B9, 0 }},
+#line 69 "./unicase/special-casing-table.gperf"
+ {"\037\223\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2B, 0x0399, 0 }, { 0x1F93, 0, 0 }, { 0x1F9B, 0, 0 }, { 0x1F23, 0x03B9, 0 }},
+#line 68 "./unicase/special-casing-table.gperf"
+ {"\037\222\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F2A, 0x0399, 0 }, { 0x1F92, 0, 0 }, { 0x1F9A, 0, 0 }, { 0x1F22, 0x03B9, 0 }},
+#line 67 "./unicase/special-casing-table.gperf"
+ {"\037\221\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F29, 0x0399, 0 }, { 0x1F91, 0, 0 }, { 0x1F99, 0, 0 }, { 0x1F21, 0x03B9, 0 }},
+#line 65 "./unicase/special-casing-table.gperf"
+ {"\037\217\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0F, 0x0399, 0 }, { 0x1F87, 0, 0 }, { 0x1F8F, 0, 0 }, { 0x1F07, 0x03B9, 0 }},
+#line 64 "./unicase/special-casing-table.gperf"
+ {"\037\216\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }},
+#line 63 "./unicase/special-casing-table.gperf"
+ {"\037\215\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }},
+#line 62 "./unicase/special-casing-table.gperf"
+ {"\037\214\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }},
+#line 61 "./unicase/special-casing-table.gperf"
+ {"\037\213\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }},
+#line 60 "./unicase/special-casing-table.gperf"
+ {"\037\212\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }},
+#line 59 "./unicase/special-casing-table.gperf"
+ {"\037\211\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }},
+#line 58 "./unicase/special-casing-table.gperf"
+ {"\037\210\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }},
+#line 56 "./unicase/special-casing-table.gperf"
+ {"\037\206\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0E, 0x0399, 0 }, { 0x1F86, 0, 0 }, { 0x1F8E, 0, 0 }, { 0x1F06, 0x03B9, 0 }},
+#line 55 "./unicase/special-casing-table.gperf"
+ {"\037\205\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0D, 0x0399, 0 }, { 0x1F85, 0, 0 }, { 0x1F8D, 0, 0 }, { 0x1F05, 0x03B9, 0 }},
+#line 54 "./unicase/special-casing-table.gperf"
+ {"\037\204\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0C, 0x0399, 0 }, { 0x1F84, 0, 0 }, { 0x1F8C, 0, 0 }, { 0x1F04, 0x03B9, 0 }},
+#line 53 "./unicase/special-casing-table.gperf"
+ {"\037\203\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0B, 0x0399, 0 }, { 0x1F83, 0, 0 }, { 0x1F8B, 0, 0 }, { 0x1F03, 0x03B9, 0 }},
+#line 52 "./unicase/special-casing-table.gperf"
+ {"\037\202\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F0A, 0x0399, 0 }, { 0x1F82, 0, 0 }, { 0x1F8A, 0, 0 }, { 0x1F02, 0x03B9, 0 }},
+#line 51 "./unicase/special-casing-table.gperf"
+ {"\037\201\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F09, 0x0399, 0 }, { 0x1F81, 0, 0 }, { 0x1F89, 0, 0 }, { 0x1F01, 0x03B9, 0 }},
+#line 50 "./unicase/special-casing-table.gperf"
+ {"\037\200\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x1F08, 0x0399, 0 }, { 0x1F80, 0, 0 }, { 0x1F88, 0, 0 }, { 0x1F00, 0x03B9, 0 }},
+#line 49 "./unicase/special-casing-table.gperf"
+ {"\037V\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0, 0 }, { 0x03A5, 0x0313, 0x0342 }, { 0x03C5, 0x0313, 0x0342 }},
+#line 48 "./unicase/special-casing-table.gperf"
+ {"\037T\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0, 0 }, { 0x03A5, 0x0313, 0x0301 }, { 0x03C5, 0x0313, 0x0301 }},
+#line 47 "./unicase/special-casing-table.gperf"
+ {"\037R\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0, 0 }, { 0x03A5, 0x0313, 0x0300 }, { 0x03C5, 0x0313, 0x0300 }},
+#line 46 "./unicase/special-casing-table.gperf"
+ {"\037P\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x03A5, 0x0313, 0 }, { 0x1F50, 0, 0 }, { 0x03A5, 0x0313, 0 }, { 0x03C5, 0x0313, 0 }},
+#line 20 "./unicase/special-casing-table.gperf"
+ {"\000J\000", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x004A, 0, 0 }, { 0x006A, 0x0307, 0 }, { 0x004A, 0, 0 }, { 0x006A, 0, 0 }},
+#line 27 "./unicase/special-casing-table.gperf"
+ {"\001.\000", 0, SCC_MORE_ABOVE , { 'l', 't' }, { 0x012E, 0, 0 }, { 0x012F, 0x0307, 0 }, { 0x012E, 0, 0 }, { 0x012F, 0, 0 }},
+#line 26 "./unicase/special-casing-table.gperf"
+ {"\001(\000", 0, SCC_ALWAYS , { 'l', 't' }, { 0x0128, 0, 0 }, { 0x0069, 0x0307, 0x0303 }, { 0x0128, 0, 0 }, { 0x0129, 0, 0 }},
+#line 136 "./unicase/special-casing-table.gperf"
+ {"\373\027\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053D, 0 }, { 0xFB17, 0, 0 }, { 0x0544, 0x056D, 0 }, { 0x0574, 0x056D, 0 }},
+#line 135 "./unicase/special-casing-table.gperf"
+ {"\373\026\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x054E, 0x0546, 0 }, { 0xFB16, 0, 0 }, { 0x054E, 0x0576, 0 }, { 0x057E, 0x0576, 0 }},
+#line 134 "./unicase/special-casing-table.gperf"
+ {"\373\025\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x053B, 0 }, { 0xFB15, 0, 0 }, { 0x0544, 0x056B, 0 }, { 0x0574, 0x056B, 0 }},
+#line 133 "./unicase/special-casing-table.gperf"
+ {"\373\024\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0535, 0 }, { 0xFB14, 0, 0 }, { 0x0544, 0x0565, 0 }, { 0x0574, 0x0565, 0 }},
+#line 132 "./unicase/special-casing-table.gperf"
+ {"\373\023\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0544, 0x0546, 0 }, { 0xFB13, 0, 0 }, { 0x0544, 0x0576, 0 }, { 0x0574, 0x0576, 0 }},
+#line 131 "./unicase/special-casing-table.gperf"
+ {"\373\006\000", 0, SCC_ALWAYS , { '\0', '\0' }, { 0x0053, 0x0054, 0 }, { 0xFB06, 0, 0 }, { 0x0053, 0x0074, 0 }, { 0x0073, 0x0074, 0 }}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register unsigned int key = gl_unicase_special_hash (str, len);
+
+ if (key <= MAX_HASH_VALUE)
+ if (len == lengthtable[key])
+ {
+ register const char *s = wordlist[key].code;
+
+ if (*str == *s && !memcmp (str + 1, s + 1, len - 1))
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
diff --git a/lib/unicase/special-casing.c b/lib/unicase/special-casing.c
new file mode 100644
index 0000000..fa1f21b
--- /dev/null
+++ b/lib/unicase/special-casing.c
@@ -0,0 +1,25 @@
+/* Special casing table.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase/special-casing.h"
+
+#include <string.h>
+
+#include "unicase/special-casing-table.h"
diff --git a/lib/unicase/special-casing.in.h b/lib/unicase/special-casing.in.h
new file mode 100644
index 0000000..b28888f
--- /dev/null
+++ b/lib/unicase/special-casing.in.h
@@ -0,0 +1,61 @@
+/* Special casing table.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <stddef.h>
+
+/* A special casing context.
+ A context is negated through x -> -x. */
+enum
+{
+ SCC_ALWAYS = 0,
+ SCC_FINAL_SIGMA = 1,
+ SCC_AFTER_SOFT_DOTTED = 2,
+ SCC_MORE_ABOVE = 3,
+ SCC_BEFORE_DOT = 4,
+ SCC_AFTER_I = 5
+};
+
+struct special_casing_rule
+{
+ /* The first two bytes are the code, in big-endian order. The third byte
+ only distinguishes different rules pertaining to the same code. */
+ /*unsigned*/ char code[3];
+
+ /* True when this rule is not the last one for the given code. */
+ /*bool*/ unsigned int has_next : 1;
+
+ /* Context. */
+ signed int context : 7;
+
+ /* Language, or an empty string. */
+ char language[2];
+
+ /* Mapping to upper case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short upper[3];
+
+ /* Mapping to lower case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short lower[3];
+
+ /* Mapping to title case. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short title[3];
+
+ /* Casefolding mapping. Between 0 and 3 characters. Filled with 0s. */
+ unsigned short casefold[3];
+};
+
+extern const struct special_casing_rule *
+ gl_unicase_special_lookup (const char *str, size_t len);
diff --git a/lib/unicase/tolower.c b/lib/unicase/tolower.c
new file mode 100644
index 0000000..edf257d
--- /dev/null
+++ b/lib/unicase/tolower.c
@@ -0,0 +1,27 @@
+/* Lowercase mapping for Unicode characters (locale and context independent).
+ Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+/* Define u_mapping table. */
+#include "tolower.h"
+
+#define FUNC uc_tolower
+#include "simple-mapping.h"
diff --git a/lib/unicase/tolower.h b/lib/unicase/tolower.h
new file mode 100644
index 0000000..6795557
--- /dev/null
+++ b/lib/unicase/tolower.h
@@ -0,0 +1,647 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Simple character mapping of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+#define mapping_header_0 16
+#define mapping_header_1 2
+#define mapping_header_2 7
+#define mapping_header_3 511
+#define mapping_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ int level3[31 << 7];
+ }
+u_mapping =
+{
+ { 0, 512 },
+ {
+ 0, 128, 256, 384, 512, -1, 640, 768,
+ 896, 1024, 1152, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 1280, -1, -1, -1, -1, -1, 1408,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 1536, 1664, 1792, 1920,
+ -1, -1, 2048, 2176, -1, -1, -1, -1,
+ -1, 2304, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 2432, 2560, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 2688, 2816, 2944, 3072,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 3200, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 3328, 3456, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3584, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 3712, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 3840, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 32, 32, 32, 32, 32, 32, 32, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -199, 0, 1, 0, 1, 0, 1, 0,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -121, 1, 0, 1, 0, 1, 0, 0,
+ 0, 210, 1, 0, 1, 0, 206, 1,
+ 0, 205, 205, 1, 0, 0, 79, 202,
+ 203, 1, 0, 205, 207, 0, 211, 209,
+ 1, 0, 0, 0, 211, 213, 0, 214,
+ 1, 0, 1, 0, 1, 0, 218, 1,
+ 0, 218, 0, 0, 1, 0, 218, 1,
+ 0, 217, 217, 1, 0, 1, 0, 219,
+ 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 1, 0, 2,
+ 1, 0, 2, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 2, 1, 0, 1, 0, -97, -56,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ -130, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 10795, 1, 0, -163, 10792, 0,
+ 0, 1, 0, -195, 69, 71, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 116,
+ 0, 0, 0, 0, 0, 0, 38, 0,
+ 37, 37, 37, 0, 64, 0, 63, 63,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 0, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, -60, 0, 0, 1,
+ 0, -7, 1, 0, 0, -130, -130, -130,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 80, 80,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 15, 1, 0, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 7264, 7264,
+ 7264, 7264, 7264, 7264, 7264, 7264, 0, 7264,
+ 0, 0, 0, 0, 0, 7264, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 38864, 38864, 38864, 38864, 38864, 38864, 38864, 38864,
+ 8, 8, 8, 8, 8, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7615, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -8, 0, -8, 0, -8, 0, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -8, -8, -8, -8, -8, -8,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -74, -74, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -86, -86, -86, -86, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -100, -100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -8, -8, -112, -112, -7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ -128, -128, -126, -126, -9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -7517, 0,
+ 0, 0, -8383, -8262, 0, 0, 0, 0,
+ 0, 0, 28, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 16, 16, 16, 16, 16, 16, 16, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 26, 26, 26, 26, 26, 26, 26, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 48,
+ 48, 48, 48, 48, 48, 48, 48, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, -10743, -3814, -10727, 0, 0, 1,
+ 0, 1, 0, 1, 0, -10780, -10749, -10783,
+ -10782, 0, 1, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, -10815, -10815,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 1, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, -35332, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 0, 0, 0, 1, 0, -42280, 0, 0,
+ 1, 0, 1, 0, 0, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, -42308, -42319, -42315, -42305, -42308, 0,
+ -42258, -42282, -42261, 928, 1, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 40, 40, 40, 40,
+ 40, 40, 40, 40, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34,
+ 34, 34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/lib/unicase/u-casemap.h b/lib/unicase/u-casemap.h
new file mode 100644
index 0000000..ecfcb45
--- /dev/null
+++ b/lib/unicase/u-casemap.h
@@ -0,0 +1,416 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+UNIT *
+FUNC (const UNIT *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+
+ /* Initialize the accumulator. */
+ if (nf != NULL || resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ /* Helper for evaluating the FINAL_SIGMA condition:
+ Last character that was not case-ignorable. */
+ ucs4_t last_char_except_ignorable =
+ prefix_context.last_char_except_ignorable;
+
+ /* Helper for evaluating the AFTER_SOFT_DOTTED and AFTER_I conditions:
+ Last character that was of combining class 230 ("Above") or 0. */
+ ucs4_t last_char_normal_or_above =
+ prefix_context.last_char_normal_or_above;
+
+ while (s < s_end)
+ {
+ ucs4_t uc;
+ int count = U_MBTOUC_UNSAFE (&uc, s, s_end - s);
+
+ ucs4_t mapped_uc[3];
+ unsigned int mapped_count;
+
+ if (uc < 0x10000)
+ {
+ /* Look first in the special-casing table. */
+ char code[3];
+
+ code[0] = (uc >> 8) & 0xff;
+ code[1] = uc & 0xff;
+
+ for (code[2] = 0; ; code[2]++)
+ {
+ const struct special_casing_rule *rule =
+ gl_unicase_special_lookup (code, 3);
+
+ if (rule == NULL)
+ break;
+
+ /* Test if the condition applies. */
+ /* Does the language apply? */
+ if (rule->language[0] == '\0'
+ || (iso639_language != NULL
+ && iso639_language[0] == rule->language[0]
+ && iso639_language[1] == rule->language[1]))
+ {
+ /* Does the context apply? */
+ int context = rule->context;
+ bool applies;
+
+ if (context < 0)
+ context = - context;
+ switch (context)
+ {
+ case SCC_ALWAYS:
+ applies = true;
+ break;
+
+ case SCC_FINAL_SIGMA:
+ /* "Before" condition: preceded by a sequence
+ consisting of a cased letter and a case-ignorable
+ sequence.
+ "After" condition: not followed by a sequence
+ consisting of a case-ignorable sequence and then a
+ cased letter. */
+ /* Test the "before" condition. */
+ applies = uc_is_cased (last_char_except_ignorable);
+ /* Test the "after" condition. */
+ if (applies)
+ {
+ const UNIT *s2 = s + count;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ /* Our uc_is_case_ignorable function is
+ known to return false for all cased
+ characters. So we can call
+ uc_is_case_ignorable first. */
+ if (!uc_is_case_ignorable (uc2))
+ {
+ applies = ! uc_is_cased (uc2);
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ! uc_is_cased (suffix_context.first_char_except_ignorable);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_SOFT_DOTTED:
+ /* "Before" condition: There is a Soft_Dotted character
+ before it, with no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = uc_is_property_soft_dotted (last_char_normal_or_above);
+ break;
+
+ case SCC_MORE_ABOVE:
+ /* "After" condition: followed by a character of
+ combining class 230 (Above) with no intervening
+ character of combining class 0 or 230 (Above). */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A)
+ {
+ applies = true;
+ break;
+ }
+ if (ccc == UC_CCC_NR)
+ break;
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_MORE_ABOVE_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_BEFORE_DOT:
+ /* "After" condition: followed by COMBINING DOT ABOVE
+ (U+0307). Any sequence of characters with a
+ combining class that is neither 0 nor 230 may
+ intervene between the current character and the
+ combining dot above. */
+ /* Test the "after" condition. */
+ {
+ const UNIT *s2 = s + count;
+ applies = false;
+ for (;;)
+ {
+ if (s2 < s_end)
+ {
+ ucs4_t uc2;
+ int count2 = U_MBTOUC_UNSAFE (&uc2, s2, s_end - s2);
+ if (uc2 == 0x0307) /* COMBINING DOT ABOVE */
+ {
+ applies = true;
+ break;
+ }
+ {
+ int ccc = uc_combining_class (uc2);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ break;
+ }
+ s2 += count2;
+ }
+ else
+ {
+ applies = ((suffix_context.bits & SCC_BEFORE_DOT_MASK) != 0);
+ break;
+ }
+ }
+ }
+ break;
+
+ case SCC_AFTER_I:
+ /* "Before" condition: There is an uppercase I before
+ it, and there is no intervening character of
+ combining class 0 or 230 (Above). */
+ /* Test the "before" condition. */
+ applies = (last_char_normal_or_above == 'I');
+ break;
+
+ default:
+ abort ();
+ }
+ if (rule->context < 0)
+ applies = !applies;
+
+ if (applies)
+ {
+ /* The rule applies.
+ Look up the mapping (0 to 3 characters). */
+ const unsigned short *mapped_in_rule =
+ (const unsigned short *)((const char *)rule + offset_in_rule);
+
+ if (mapped_in_rule[0] == 0)
+ mapped_count = 0;
+ else
+ {
+ mapped_uc[0] = mapped_in_rule[0];
+ if (mapped_in_rule[1] == 0)
+ mapped_count = 1;
+ else
+ {
+ mapped_uc[1] = mapped_in_rule[1];
+ if (mapped_in_rule[2] == 0)
+ mapped_count = 2;
+ else
+ {
+ mapped_uc[2] = mapped_in_rule[2];
+ mapped_count = 3;
+ }
+ }
+ }
+ goto found_mapping;
+ }
+ }
+
+ /* Optimization: Save a hash table lookup in the next round. */
+ if (!rule->has_next)
+ break;
+ }
+ }
+
+ /* No special-cased mapping. So use the locale and context independent
+ mapping. */
+ mapped_uc[0] = single_character_map (uc);
+ mapped_count = 1;
+
+ found_mapping:
+ /* Found the mapping: uc maps to mapped_uc[0..mapped_count-1]. */
+ {
+ unsigned int i;
+
+ for (i = 0; i < mapped_count; i++)
+ {
+ ucs4_t muc = mapped_uc[i];
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result = (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret = U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+ }
+
+ if (!uc_is_case_ignorable (uc))
+ last_char_except_ignorable = uc;
+
+ {
+ int ccc = uc_combining_class (uc);
+ if (ccc == UC_CCC_A || ccc == UC_CCC_NR)
+ last_char_normal_or_above = uc;
+ }
+
+ s += count;
+ }
+ }
+
+ if (nf != NULL)
+ {
+ /* Finally, normalize the result. */
+ UNIT *normalized_result;
+
+ normalized_result = U_NORMALIZE (nf, result, length, resultbuf, lengthp);
+ if (normalized_result == NULL)
+ goto fail;
+
+ free (result);
+ return normalized_result;
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ if (result != resultbuf)
+ {
+ int saved_errno = errno;
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/lib/unicase/u8-casemap.c b/lib/unicase/u8-casemap.c
new file mode 100644
index 0000000..020f4c3
--- /dev/null
+++ b/lib/unicase/u8-casemap.c
@@ -0,0 +1,40 @@
+/* Case mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicasemap.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "uninorm.h"
+#include "unicase/caseprop.h"
+#include "context.h"
+#include "unicase/special-casing.h"
+
+#define FUNC u8_casemap
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#define U_NORMALIZE u8_normalize
+#include "u-casemap.h"
diff --git a/lib/unicase/u8-tolower.c b/lib/unicase/u8-tolower.c
new file mode 100644
index 0000000..bbb3501
--- /dev/null
+++ b/lib/unicase/u8-tolower.c
@@ -0,0 +1,120 @@
+/* Lowercase mapping for UTF-8 strings (locale dependent).
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unicase.h"
+
+#include <stddef.h>
+
+#include "unicase/unicasemap.h"
+#include "unicase/special-casing.h"
+
+uint8_t *
+u8_tolower (const uint8_t *s, size_t n, const char *iso639_language,
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp)
+{
+ return u8_casemap (s, n,
+ unicase_empty_prefix_context, unicase_empty_suffix_context,
+ iso639_language,
+ uc_tolower, offsetof (struct special_casing_rule, lower[0]),
+ nf,
+ resultbuf, lengthp);
+}
+
+
+#ifdef TEST
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Read the contents of an input stream, and return it, terminated with a NUL
+ byte. */
+char *
+read_file (FILE *stream)
+{
+#define BUFSIZE 4096
+ char *buf = NULL;
+ int alloc = 0;
+ int size = 0;
+ int count;
+
+ while (! feof (stream))
+ {
+ if (size + BUFSIZE > alloc)
+ {
+ alloc = alloc + alloc / 2;
+ if (alloc < size + BUFSIZE)
+ alloc = size + BUFSIZE;
+ buf = realloc (buf, alloc);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ }
+ count = fread (buf + size, 1, BUFSIZE, stream);
+ if (count == 0)
+ {
+ if (ferror (stream))
+ {
+ perror ("fread");
+ exit (1);
+ }
+ }
+ else
+ size += count;
+ }
+ buf = realloc (buf, size + 1);
+ if (buf == NULL)
+ {
+ fprintf (stderr, "out of memory\n");
+ exit (1);
+ }
+ buf[size] = '\0';
+ return buf;
+#undef BUFSIZE
+}
+
+int
+main (int argc, char * argv[])
+{
+ setlocale (LC_ALL, "");
+ if (argc == 1)
+ {
+ /* Display the lower case of the input string. */
+ char *input = read_file (stdin);
+ int length = strlen (input);
+ size_t output_length;
+ uint8_t *output =
+ u8_tolower ((uint8_t *) input, length, uc_locale_language (),
+ NULL,
+ NULL, &output_length);
+
+ fwrite (output, 1, output_length, stdout);
+
+ return 0;
+ }
+ else
+ return 1;
+}
+
+#endif /* TEST */
diff --git a/lib/unicase/unicasemap.h b/lib/unicase/unicasemap.h
new file mode 100644
index 0000000..be47166
--- /dev/null
+++ b/lib/unicase/unicasemap.h
@@ -0,0 +1,52 @@
+/* Case mapping for UTF-8/UTF-16/UTF-32 strings (locale dependent).
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+#include "unicase.h"
+#include "uninorm.h"
+
+extern uint8_t *
+ u8_casemap (const uint8_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint8_t *resultbuf, size_t *lengthp);
+
+extern uint16_t *
+ u16_casemap (const uint16_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint16_t *resultbuf, size_t *lengthp);
+
+extern uint32_t *
+ u32_casemap (const uint32_t *s, size_t n,
+ casing_prefix_context_t prefix_context,
+ casing_suffix_context_t suffix_context,
+ const char *iso639_language,
+ ucs4_t (*single_character_map) (ucs4_t),
+ size_t offset_in_rule, /* offset in 'struct special_casing_rule' */
+ uninorm_t nf,
+ uint32_t *resultbuf, size_t *lengthp);
diff --git a/lib/unictype.in.h b/lib/unictype.in.h
new file mode 100644
index 0000000..d27c840
--- /dev/null
+++ b/lib/unictype.in.h
@@ -0,0 +1,1053 @@
+/* Unicode character classification and properties.
+ Copyright (C) 2002, 2005-2020 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/>. */
+
+#ifndef _UNICTYPE_H
+#define _UNICTYPE_H
+
+#include "unitypes.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ========================================================================= */
+
+/* Field 1 of Unicode Character Database: Character name.
+ See "uniname.h". */
+
+/* ========================================================================= */
+
+/* Field 2 of Unicode Character Database: General category. */
+
+/* Data type denoting a General category value. This is not just a bitmask,
+ but rather a bitmask and a pointer to the lookup table, so that programs
+ that use only the predefined bitmasks (i.e. don't combine bitmasks with &
+ and |) don't have a link-time dependency towards the big general table. */
+typedef struct
+{
+ uint32_t bitmask : 31;
+ /*bool*/ unsigned int generic : 1;
+ union
+ {
+ const void *table; /* when generic is 0 */
+ bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */
+ } lookup;
+}
+uc_general_category_t;
+
+/* Bits and bit masks denoting General category values. UnicodeData-3.2.0.html
+ says a 32-bit integer will always suffice to represent them.
+ These bit masks can only be used with the uc_is_general_category_withtable
+ function. */
+enum
+{
+ UC_CATEGORY_MASK_L = 0x0000001f,
+ UC_CATEGORY_MASK_LC = 0x00000007,
+ UC_CATEGORY_MASK_Lu = 0x00000001,
+ UC_CATEGORY_MASK_Ll = 0x00000002,
+ UC_CATEGORY_MASK_Lt = 0x00000004,
+ UC_CATEGORY_MASK_Lm = 0x00000008,
+ UC_CATEGORY_MASK_Lo = 0x00000010,
+ UC_CATEGORY_MASK_M = 0x000000e0,
+ UC_CATEGORY_MASK_Mn = 0x00000020,
+ UC_CATEGORY_MASK_Mc = 0x00000040,
+ UC_CATEGORY_MASK_Me = 0x00000080,
+ UC_CATEGORY_MASK_N = 0x00000700,
+ UC_CATEGORY_MASK_Nd = 0x00000100,
+ UC_CATEGORY_MASK_Nl = 0x00000200,
+ UC_CATEGORY_MASK_No = 0x00000400,
+ UC_CATEGORY_MASK_P = 0x0003f800,
+ UC_CATEGORY_MASK_Pc = 0x00000800,
+ UC_CATEGORY_MASK_Pd = 0x00001000,
+ UC_CATEGORY_MASK_Ps = 0x00002000,
+ UC_CATEGORY_MASK_Pe = 0x00004000,
+ UC_CATEGORY_MASK_Pi = 0x00008000,
+ UC_CATEGORY_MASK_Pf = 0x00010000,
+ UC_CATEGORY_MASK_Po = 0x00020000,
+ UC_CATEGORY_MASK_S = 0x003c0000,
+ UC_CATEGORY_MASK_Sm = 0x00040000,
+ UC_CATEGORY_MASK_Sc = 0x00080000,
+ UC_CATEGORY_MASK_Sk = 0x00100000,
+ UC_CATEGORY_MASK_So = 0x00200000,
+ UC_CATEGORY_MASK_Z = 0x01c00000,
+ UC_CATEGORY_MASK_Zs = 0x00400000,
+ UC_CATEGORY_MASK_Zl = 0x00800000,
+ UC_CATEGORY_MASK_Zp = 0x01000000,
+ UC_CATEGORY_MASK_C = 0x3e000000,
+ UC_CATEGORY_MASK_Cc = 0x02000000,
+ UC_CATEGORY_MASK_Cf = 0x04000000,
+ UC_CATEGORY_MASK_Cs = 0x08000000,
+ UC_CATEGORY_MASK_Co = 0x10000000,
+ UC_CATEGORY_MASK_Cn = 0x20000000
+};
+
+/* Predefined General category values. */
+extern const uc_general_category_t UC_CATEGORY_L;
+extern const uc_general_category_t UC_CATEGORY_LC;
+extern const uc_general_category_t UC_CATEGORY_Lu;
+extern const uc_general_category_t UC_CATEGORY_Ll;
+extern const uc_general_category_t UC_CATEGORY_Lt;
+extern const uc_general_category_t UC_CATEGORY_Lm;
+extern const uc_general_category_t UC_CATEGORY_Lo;
+extern const uc_general_category_t UC_CATEGORY_M;
+extern const uc_general_category_t UC_CATEGORY_Mn;
+extern const uc_general_category_t UC_CATEGORY_Mc;
+extern const uc_general_category_t UC_CATEGORY_Me;
+extern const uc_general_category_t UC_CATEGORY_N;
+extern const uc_general_category_t UC_CATEGORY_Nd;
+extern const uc_general_category_t UC_CATEGORY_Nl;
+extern const uc_general_category_t UC_CATEGORY_No;
+extern const uc_general_category_t UC_CATEGORY_P;
+extern const uc_general_category_t UC_CATEGORY_Pc;
+extern const uc_general_category_t UC_CATEGORY_Pd;
+extern const uc_general_category_t UC_CATEGORY_Ps;
+extern const uc_general_category_t UC_CATEGORY_Pe;
+extern const uc_general_category_t UC_CATEGORY_Pi;
+extern const uc_general_category_t UC_CATEGORY_Pf;
+extern const uc_general_category_t UC_CATEGORY_Po;
+extern const uc_general_category_t UC_CATEGORY_S;
+extern const uc_general_category_t UC_CATEGORY_Sm;
+extern const uc_general_category_t UC_CATEGORY_Sc;
+extern const uc_general_category_t UC_CATEGORY_Sk;
+extern const uc_general_category_t UC_CATEGORY_So;
+extern const uc_general_category_t UC_CATEGORY_Z;
+extern const uc_general_category_t UC_CATEGORY_Zs;
+extern const uc_general_category_t UC_CATEGORY_Zl;
+extern const uc_general_category_t UC_CATEGORY_Zp;
+extern const uc_general_category_t UC_CATEGORY_C;
+extern const uc_general_category_t UC_CATEGORY_Cc;
+extern const uc_general_category_t UC_CATEGORY_Cf;
+extern const uc_general_category_t UC_CATEGORY_Cs;
+extern const uc_general_category_t UC_CATEGORY_Co;
+extern const uc_general_category_t UC_CATEGORY_Cn;
+/* Non-public. */
+extern const uc_general_category_t _UC_CATEGORY_NONE;
+
+/* Alias names for predefined General category values. */
+#define UC_LETTER UC_CATEGORY_L
+#define UC_CASED_LETTER UC_CATEGORY_LC
+#define UC_UPPERCASE_LETTER UC_CATEGORY_Lu
+#define UC_LOWERCASE_LETTER UC_CATEGORY_Ll
+#define UC_TITLECASE_LETTER UC_CATEGORY_Lt
+#define UC_MODIFIER_LETTER UC_CATEGORY_Lm
+#define UC_OTHER_LETTER UC_CATEGORY_Lo
+#define UC_MARK UC_CATEGORY_M
+#define UC_NON_SPACING_MARK UC_CATEGORY_Mn
+#define UC_COMBINING_SPACING_MARK UC_CATEGORY_Mc
+#define UC_ENCLOSING_MARK UC_CATEGORY_Me
+#define UC_NUMBER UC_CATEGORY_N
+#define UC_DECIMAL_DIGIT_NUMBER UC_CATEGORY_Nd
+#define UC_LETTER_NUMBER UC_CATEGORY_Nl
+#define UC_OTHER_NUMBER UC_CATEGORY_No
+#define UC_PUNCTUATION UC_CATEGORY_P
+#define UC_CONNECTOR_PUNCTUATION UC_CATEGORY_Pc
+#define UC_DASH_PUNCTUATION UC_CATEGORY_Pd
+#define UC_OPEN_PUNCTUATION UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */
+#define UC_CLOSE_PUNCTUATION UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */
+#define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi
+#define UC_FINAL_QUOTE_PUNCTUATION UC_CATEGORY_Pf
+#define UC_OTHER_PUNCTUATION UC_CATEGORY_Po
+#define UC_SYMBOL UC_CATEGORY_S
+#define UC_MATH_SYMBOL UC_CATEGORY_Sm
+#define UC_CURRENCY_SYMBOL UC_CATEGORY_Sc
+#define UC_MODIFIER_SYMBOL UC_CATEGORY_Sk
+#define UC_OTHER_SYMBOL UC_CATEGORY_So
+#define UC_SEPARATOR UC_CATEGORY_Z
+#define UC_SPACE_SEPARATOR UC_CATEGORY_Zs
+#define UC_LINE_SEPARATOR UC_CATEGORY_Zl
+#define UC_PARAGRAPH_SEPARATOR UC_CATEGORY_Zp
+#define UC_OTHER UC_CATEGORY_C
+#define UC_CONTROL UC_CATEGORY_Cc
+#define UC_FORMAT UC_CATEGORY_Cf
+#define UC_SURROGATE UC_CATEGORY_Cs /* all of them are invalid characters */
+#define UC_PRIVATE_USE UC_CATEGORY_Co
+#define UC_UNASSIGNED UC_CATEGORY_Cn /* some of them are invalid characters */
+
+/* Return the union of two general categories.
+ This corresponds to the unions of the two sets of characters. */
+extern uc_general_category_t
+ uc_general_category_or (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the intersection of two general categories as bit masks.
+ This *does*not* correspond to the intersection of the two sets of
+ characters. */
+extern uc_general_category_t
+ uc_general_category_and (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the intersection of a general category with the complement of a
+ second general category, as bit masks.
+ This *does*not* correspond to the intersection with complement, when
+ viewing the categories as sets of characters. */
+extern uc_general_category_t
+ uc_general_category_and_not (uc_general_category_t category1,
+ uc_general_category_t category2);
+
+/* Return the name of a general category. */
+extern const char *
+ uc_general_category_name (uc_general_category_t category)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the long name of a general category. */
+extern const char *
+ uc_general_category_long_name (uc_general_category_t category)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the general category given by name, e.g. "Lu", or by long name,
+ e.g. "Uppercase Letter". */
+extern uc_general_category_t
+ uc_general_category_byname (const char *category_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the general category of a Unicode character. */
+extern uc_general_category_t
+ uc_general_category (ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+
+/* Test whether a Unicode character belongs to a given category.
+ The CATEGORY argument can be the combination of several predefined
+ general categories. */
+extern bool
+ uc_is_general_category (ucs4_t uc, uc_general_category_t category)
+ _UC_ATTRIBUTE_PURE;
+/* Likewise. This function uses a big table comprising all categories. */
+extern bool
+ uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 3 of Unicode Character Database: Canonical combining class. */
+
+/* The possible results of uc_combining_class (0..255) are described in
+ UCD.html. The list here is not definitive; more values can be added
+ in future versions. */
+enum
+{
+ UC_CCC_NR = 0, /* Not Reordered */
+ UC_CCC_OV = 1, /* Overlay */
+ UC_CCC_NK = 7, /* Nukta */
+ UC_CCC_KV = 8, /* Kana Voicing */
+ UC_CCC_VR = 9, /* Virama */
+ UC_CCC_ATBL = 200, /* Attached Below Left */
+ UC_CCC_ATB = 202, /* Attached Below */
+ UC_CCC_ATA = 214, /* Attached Above */
+ UC_CCC_ATAR = 216, /* Attached Above Right */
+ UC_CCC_BL = 218, /* Below Left */
+ UC_CCC_B = 220, /* Below */
+ UC_CCC_BR = 222, /* Below Right */
+ UC_CCC_L = 224, /* Left */
+ UC_CCC_R = 226, /* Right */
+ UC_CCC_AL = 228, /* Above Left */
+ UC_CCC_A = 230, /* Above */
+ UC_CCC_AR = 232, /* Above Right */
+ UC_CCC_DB = 233, /* Double Below */
+ UC_CCC_DA = 234, /* Double Above */
+ UC_CCC_IS = 240 /* Iota Subscript */
+};
+
+/* Return the canonical combining class of a Unicode character. */
+extern int
+ uc_combining_class (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the name of a canonical combining class. */
+extern const char *
+ uc_combining_class_name (int ccc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the long name of a canonical combining class. */
+extern const char *
+ uc_combining_class_long_name (int ccc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the canonical combining class given by name, e.g. "BL", or by long
+ name, e.g. "Below Left". */
+extern int
+ uc_combining_class_byname (const char *ccc_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* ========================================================================= */
+
+/* Field 4 of Unicode Character Database: Bidi class.
+ Before Unicode 4.0, this field was called "Bidirectional category". */
+
+enum
+{
+ UC_BIDI_L, /* Left-to-Right */
+ UC_BIDI_LRE, /* Left-to-Right Embedding */
+ UC_BIDI_LRO, /* Left-to-Right Override */
+ UC_BIDI_R, /* Right-to-Left */
+ UC_BIDI_AL, /* Right-to-Left Arabic */
+ UC_BIDI_RLE, /* Right-to-Left Embedding */
+ UC_BIDI_RLO, /* Right-to-Left Override */
+ UC_BIDI_PDF, /* Pop Directional Format */
+ UC_BIDI_EN, /* European Number */
+ UC_BIDI_ES, /* European Number Separator */
+ UC_BIDI_ET, /* European Number Terminator */
+ UC_BIDI_AN, /* Arabic Number */
+ UC_BIDI_CS, /* Common Number Separator */
+ UC_BIDI_NSM, /* Non-Spacing Mark */
+ UC_BIDI_BN, /* Boundary Neutral */
+ UC_BIDI_B, /* Paragraph Separator */
+ UC_BIDI_S, /* Segment Separator */
+ UC_BIDI_WS, /* Whitespace */
+ UC_BIDI_ON, /* Other Neutral */
+ UC_BIDI_LRI, /* Left-to-Right Isolate */
+ UC_BIDI_RLI, /* Right-to-Left Isolate */
+ UC_BIDI_FSI, /* First Strong Isolate */
+ UC_BIDI_PDI /* Pop Directional Isolate */
+};
+
+/* Return the name of a bidi class. */
+extern const char *
+ uc_bidi_class_name (int bidi_class)
+ _UC_ATTRIBUTE_CONST;
+/* Same; obsolete function name. */
+extern const char *
+ uc_bidi_category_name (int category)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the long name of a bidi class. */
+extern const char *
+ uc_bidi_class_long_name (int bidi_class)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the bidi class given by name, e.g. "LRE", or by long name, e.g.
+ "Left-to-Right Embedding". */
+extern int
+ uc_bidi_class_byname (const char *bidi_class_name)
+ _UC_ATTRIBUTE_PURE;
+/* Same; obsolete function name. */
+extern int
+ uc_bidi_category_byname (const char *category_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the bidi class of a Unicode character. */
+extern int
+ uc_bidi_class (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+/* Same; obsolete function name. */
+extern int
+ uc_bidi_category (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test whether a Unicode character belongs to a given bidi class. */
+extern bool
+ uc_is_bidi_class (ucs4_t uc, int bidi_class)
+ _UC_ATTRIBUTE_CONST;
+/* Same; obsolete function name. */
+extern bool
+ uc_is_bidi_category (ucs4_t uc, int category)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 5 of Unicode Character Database: Character decomposition mapping.
+ See "uninorm.h". */
+
+/* ========================================================================= */
+
+/* Field 6 of Unicode Character Database: Decimal digit value. */
+
+/* Return the decimal digit value of a Unicode character. */
+extern int
+ uc_decimal_value (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 7 of Unicode Character Database: Digit value. */
+
+/* Return the digit value of a Unicode character. */
+extern int
+ uc_digit_value (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 8 of Unicode Character Database: Numeric value. */
+
+/* Return the numeric value of a Unicode character. */
+typedef struct
+{
+ int numerator;
+ int denominator;
+}
+uc_fraction_t;
+extern uc_fraction_t
+ uc_numeric_value (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 9 of Unicode Character Database: Mirrored. */
+
+/* Return the mirrored character of a Unicode character UC in *PUC. */
+extern bool
+ uc_mirror_char (ucs4_t uc, ucs4_t *puc);
+
+/* ========================================================================= */
+
+/* Field 10 of Unicode Character Database: Unicode 1.0 Name.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 11 of Unicode Character Database: ISO 10646 comment.
+ Not available in this library. */
+
+/* ========================================================================= */
+
+/* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping,
+ lowercase mapping, titlecase mapping. See "unicase.h". */
+
+/* ========================================================================= */
+
+/* Field 2 of the file ArabicShaping.txt in the Unicode Character Database. */
+
+/* Possible joining types. */
+enum
+{
+ UC_JOINING_TYPE_U, /* Non_Joining */
+ UC_JOINING_TYPE_T, /* Transparent */
+ UC_JOINING_TYPE_C, /* Join_Causing */
+ UC_JOINING_TYPE_L, /* Left_Joining */
+ UC_JOINING_TYPE_R, /* Right_Joining */
+ UC_JOINING_TYPE_D /* Dual_Joining */
+};
+
+/* Return the name of a joining type. */
+extern const char *
+ uc_joining_type_name (int joining_type)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the long name of a joining type. */
+extern const char *
+ uc_joining_type_long_name (int joining_type)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the joining type given by name, e.g. "D", or by long name, e.g.
+ "Dual Joining". */
+extern int
+ uc_joining_type_byname (const char *joining_type_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the joining type of a Unicode character. */
+extern int
+ uc_joining_type (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Field 3 of the file ArabicShaping.txt in the Unicode Character Database. */
+
+/* Possible joining groups.
+ This enumeration may be extended in the future. */
+enum
+{
+ UC_JOINING_GROUP_NONE, /* No_Joining_Group */
+ UC_JOINING_GROUP_AIN, /* Ain */
+ UC_JOINING_GROUP_ALAPH, /* Alaph */
+ UC_JOINING_GROUP_ALEF, /* Alef */
+ UC_JOINING_GROUP_BEH, /* Beh */
+ UC_JOINING_GROUP_BETH, /* Beth */
+ UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */
+ UC_JOINING_GROUP_DAL, /* Dal */
+ UC_JOINING_GROUP_DALATH_RISH, /* Dalath_Rish */
+ UC_JOINING_GROUP_E, /* E */
+ UC_JOINING_GROUP_FARSI_YEH, /* Farsi_Yeh */
+ UC_JOINING_GROUP_FE, /* Fe */
+ UC_JOINING_GROUP_FEH, /* Feh */
+ UC_JOINING_GROUP_FINAL_SEMKATH, /* Final_Semkath */
+ UC_JOINING_GROUP_GAF, /* Gaf */
+ UC_JOINING_GROUP_GAMAL, /* Gamal */
+ UC_JOINING_GROUP_HAH, /* Hah */
+ UC_JOINING_GROUP_HE, /* He */
+ UC_JOINING_GROUP_HEH, /* Heh */
+ UC_JOINING_GROUP_HEH_GOAL, /* Heh_Goal */
+ UC_JOINING_GROUP_HETH, /* Heth */
+ UC_JOINING_GROUP_KAF, /* Kaf */
+ UC_JOINING_GROUP_KAPH, /* Kaph */
+ UC_JOINING_GROUP_KHAPH, /* Khaph */
+ UC_JOINING_GROUP_KNOTTED_HEH, /* Knotted_Heh */
+ UC_JOINING_GROUP_LAM, /* Lam */
+ UC_JOINING_GROUP_LAMADH, /* Lamadh */
+ UC_JOINING_GROUP_MEEM, /* Meem */
+ UC_JOINING_GROUP_MIM, /* Mim */
+ UC_JOINING_GROUP_NOON, /* Noon */
+ UC_JOINING_GROUP_NUN, /* Nun */
+ UC_JOINING_GROUP_NYA, /* Nya */
+ UC_JOINING_GROUP_PE, /* Pe */
+ UC_JOINING_GROUP_QAF, /* Qaf */
+ UC_JOINING_GROUP_QAPH, /* Qaph */
+ UC_JOINING_GROUP_REH, /* Reh */
+ UC_JOINING_GROUP_REVERSED_PE, /* Reversed_Pe */
+ UC_JOINING_GROUP_SAD, /* Sad */
+ UC_JOINING_GROUP_SADHE, /* Sadhe */
+ UC_JOINING_GROUP_SEEN, /* Seen */
+ UC_JOINING_GROUP_SEMKATH, /* Semkath */
+ UC_JOINING_GROUP_SHIN, /* Shin */
+ UC_JOINING_GROUP_SWASH_KAF, /* Swash_Kaf */
+ UC_JOINING_GROUP_SYRIAC_WAW, /* Syriac_Waw */
+ UC_JOINING_GROUP_TAH, /* Tah */
+ UC_JOINING_GROUP_TAW, /* Taw */
+ UC_JOINING_GROUP_TEH_MARBUTA, /* Teh_Marbuta */
+ UC_JOINING_GROUP_TEH_MARBUTA_GOAL, /* Teh_Marbuta_Goal */
+ UC_JOINING_GROUP_TETH, /* Teth */
+ UC_JOINING_GROUP_WAW, /* Waw */
+ UC_JOINING_GROUP_YEH, /* Yeh */
+ UC_JOINING_GROUP_YEH_BARREE, /* Yeh_Barree */
+ UC_JOINING_GROUP_YEH_WITH_TAIL, /* Yeh_With_Tail */
+ UC_JOINING_GROUP_YUDH, /* Yudh */
+ UC_JOINING_GROUP_YUDH_HE, /* Yudh_He */
+ UC_JOINING_GROUP_ZAIN, /* Zain */
+ UC_JOINING_GROUP_ZHAIN, /* Zhain */
+ UC_JOINING_GROUP_ROHINGYA_YEH, /* Rohingya_Yeh */
+ UC_JOINING_GROUP_STRAIGHT_WAW, /* Straight_Waw */
+ UC_JOINING_GROUP_MANICHAEAN_ALEPH, /* Manichaean_Aleph */
+ UC_JOINING_GROUP_MANICHAEAN_BETH, /* Manichaean_Beth */
+ UC_JOINING_GROUP_MANICHAEAN_GIMEL, /* Manichaean_Gimel */
+ UC_JOINING_GROUP_MANICHAEAN_DALETH, /* Manichaean_Daleth */
+ UC_JOINING_GROUP_MANICHAEAN_WAW, /* Manichaean_Waw */
+ UC_JOINING_GROUP_MANICHAEAN_ZAYIN, /* Manichaean_Zayin */
+ UC_JOINING_GROUP_MANICHAEAN_HETH, /* Manichaean_Heth */
+ UC_JOINING_GROUP_MANICHAEAN_TETH, /* Manichaean_Teth */
+ UC_JOINING_GROUP_MANICHAEAN_YODH, /* Manichaean_Yodh */
+ UC_JOINING_GROUP_MANICHAEAN_KAPH, /* Manichaean_Kaph */
+ UC_JOINING_GROUP_MANICHAEAN_LAMEDH, /* Manichaean_Lamedh */
+ UC_JOINING_GROUP_MANICHAEAN_DHAMEDH, /* Manichaean_Dhamedh */
+ UC_JOINING_GROUP_MANICHAEAN_THAMEDH, /* Manichaean_Thamedh */
+ UC_JOINING_GROUP_MANICHAEAN_MEM, /* Manichaean_Mem */
+ UC_JOINING_GROUP_MANICHAEAN_NUN, /* Manichaean_Nun */
+ UC_JOINING_GROUP_MANICHAEAN_SAMEKH, /* Manichaean_Aleph */
+ UC_JOINING_GROUP_MANICHAEAN_AYIN, /* Manichaean_Ayin */
+ UC_JOINING_GROUP_MANICHAEAN_PE, /* Manichaean_Pe */
+ UC_JOINING_GROUP_MANICHAEAN_SADHE, /* Manichaean_Sadhe */
+ UC_JOINING_GROUP_MANICHAEAN_QOPH, /* Manichaean_Qoph */
+ UC_JOINING_GROUP_MANICHAEAN_RESH, /* Manichaean_Resh */
+ UC_JOINING_GROUP_MANICHAEAN_TAW, /* Manichaean_Taw */
+ UC_JOINING_GROUP_MANICHAEAN_ONE, /* Manichaean_One */
+ UC_JOINING_GROUP_MANICHAEAN_FIVE, /* Manichaean_Five */
+ UC_JOINING_GROUP_MANICHAEAN_TEN, /* Manichaean_Ten */
+ UC_JOINING_GROUP_MANICHAEAN_TWENTY, /* Manichaean_Twenty */
+ UC_JOINING_GROUP_MANICHAEAN_HUNDRED, /* Manichaean_Hundred */
+ UC_JOINING_GROUP_AFRICAN_FEH, /* African_Feh */
+ UC_JOINING_GROUP_AFRICAN_QAF, /* African_Qaf */
+ UC_JOINING_GROUP_AFRICAN_NOON /* African_Noon */
+};
+
+/* Return the name of a joining group. */
+extern const char *
+ uc_joining_group_name (int joining_group)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the joining group given by name, e.g. "Teh_Marbuta". */
+extern int
+ uc_joining_group_byname (const char *joining_group_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the joining group of a Unicode character. */
+extern int
+ uc_joining_group (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Common API for properties. */
+
+/* Data type denoting a property. This is not just a number, but rather a
+ pointer to the test functions, so that programs that use only few of the
+ properties don't have a link-time dependency towards all the tables. */
+typedef struct
+{
+ bool (*test_fn) (ucs4_t uc);
+}
+uc_property_t;
+
+/* Predefined properties. */
+/* General. */
+extern const uc_property_t UC_PROPERTY_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC;
+extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER;
+extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
+extern const uc_property_t UC_PROPERTY_DEPRECATED;
+extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
+extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR;
+extern const uc_property_t UC_PROPERTY_PRIVATE_USE;
+extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE;
+/* Case. */
+extern const uc_property_t UC_PROPERTY_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE;
+extern const uc_property_t UC_PROPERTY_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE;
+extern const uc_property_t UC_PROPERTY_TITLECASE;
+extern const uc_property_t UC_PROPERTY_CASED;
+extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED;
+extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED;
+extern const uc_property_t UC_PROPERTY_SOFT_DOTTED;
+/* Identifiers. */
+extern const uc_property_t UC_PROPERTY_ID_START;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_START;
+extern const uc_property_t UC_PROPERTY_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_XID_START;
+extern const uc_property_t UC_PROPERTY_XID_CONTINUE;
+extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE;
+extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX;
+/* Shaping and rendering. */
+extern const uc_property_t UC_PROPERTY_JOIN_CONTROL;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
+extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK;
+/* Bidi. */
+extern const uc_property_t UC_PROPERTY_BIDI_CONTROL;
+extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
+extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT;
+extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE;
+extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK;
+extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
+extern const uc_property_t UC_PROPERTY_BIDI_PDF;
+extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
+extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL;
+/* Numeric. */
+extern const uc_property_t UC_PROPERTY_HEX_DIGIT;
+extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT;
+/* CJK. */
+extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC;
+extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH;
+extern const uc_property_t UC_PROPERTY_RADICAL;
+extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR;
+extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR;
+/* Misc. */
+extern const uc_property_t UC_PROPERTY_ZERO_WIDTH;
+extern const uc_property_t UC_PROPERTY_SPACE;
+extern const uc_property_t UC_PROPERTY_NON_BREAK;
+extern const uc_property_t UC_PROPERTY_ISO_CONTROL;
+extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL;
+extern const uc_property_t UC_PROPERTY_DASH;
+extern const uc_property_t UC_PROPERTY_HYPHEN;
+extern const uc_property_t UC_PROPERTY_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR;
+extern const uc_property_t UC_PROPERTY_QUOTATION_MARK;
+extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL;
+extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL;
+extern const uc_property_t UC_PROPERTY_MATH;
+extern const uc_property_t UC_PROPERTY_OTHER_MATH;
+extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION;
+extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR;
+extern const uc_property_t UC_PROPERTY_COMBINING;
+extern const uc_property_t UC_PROPERTY_COMPOSITE;
+extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT;
+extern const uc_property_t UC_PROPERTY_NUMERIC;
+extern const uc_property_t UC_PROPERTY_DIACRITIC;
+extern const uc_property_t UC_PROPERTY_EXTENDER;
+extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL;
+
+/* Return the property given by name, e.g. "White space". */
+extern uc_property_t
+ uc_property_byname (const char *property_name);
+
+/* Test whether a property is valid. */
+#define uc_property_is_valid(property) ((property).test_fn != NULL)
+
+/* Test whether a Unicode character has a given property. */
+extern bool
+ uc_is_property (ucs4_t uc, uc_property_t property);
+extern bool uc_is_property_white_space (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_alphabetic (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_alphabetic (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_not_a_character (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_deprecated (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_logical_order_exception (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_variation_selector (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_private_use (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_unassigned_code_value (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_uppercase (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_uppercase (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_lowercase (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_lowercase (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_titlecase (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_cased (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_case_ignorable (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_changes_when_lowercased (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_changes_when_uppercased (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_changes_when_titlecased (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_changes_when_casefolded (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_changes_when_casemapped (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_soft_dotted (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_id_start (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_id_start (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_id_continue (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_id_continue (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_xid_start (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_xid_continue (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_pattern_white_space (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_pattern_syntax (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_join_control (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_grapheme_base (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_grapheme_extend (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_grapheme_extend (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_grapheme_link (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_control (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_left_to_right (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_european_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_common_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_block_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_segment_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_whitespace (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_pdf (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_bidi_other_neutral (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_hex_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_ascii_hex_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_ideographic (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_unified_ideograph (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_radical (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_ids_binary_operator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_ids_trinary_operator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_zero_width (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_space (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_non_break (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_iso_control (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_format_control (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_dash (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_hyphen (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_punctuation (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_line_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_paragraph_separator (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_quotation_mark (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_sentence_terminal (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_terminal_punctuation (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_currency_symbol (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_math (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_other_math (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_paired_punctuation (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_left_of_pair (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_combining (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_composite (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_decimal_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_numeric (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_diacritic (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_extender (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+extern bool uc_is_property_ignorable_control (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode characters into scripts. */
+
+typedef struct
+{
+ unsigned int code : 21;
+ unsigned int start : 1;
+ unsigned int end : 1;
+}
+uc_interval_t;
+typedef struct
+{
+ unsigned int nintervals;
+ const uc_interval_t *intervals;
+ const char *name;
+}
+uc_script_t;
+
+/* Return the script of a Unicode character. */
+extern const uc_script_t *
+ uc_script (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the script given by name, e.g. "HAN". */
+extern const uc_script_t *
+ uc_script_byname (const char *script_name)
+ _UC_ATTRIBUTE_PURE;
+
+/* Test whether a Unicode character belongs to a given script. */
+extern bool
+ uc_is_script (ucs4_t uc, const uc_script_t *script)
+ _UC_ATTRIBUTE_PURE;
+
+/* Get the list of all scripts. */
+extern void
+ uc_all_scripts (const uc_script_t **scripts, size_t *count);
+
+/* ========================================================================= */
+
+/* Subdivision of the Unicode character range into blocks. */
+
+typedef struct
+{
+ ucs4_t start;
+ ucs4_t end;
+ const char *name;
+}
+uc_block_t;
+
+/* Return the block a character belongs to. */
+extern const uc_block_t *
+ uc_block (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test whether a Unicode character belongs to a given block. */
+extern bool
+ uc_is_block (ucs4_t uc, const uc_block_t *block)
+ _UC_ATTRIBUTE_PURE;
+
+/* Get the list of all blocks. */
+extern void
+ uc_all_blocks (const uc_block_t **blocks, size_t *count);
+
+/* ========================================================================= */
+
+/* Properties taken from language standards. */
+
+/* Test whether a Unicode character is considered whitespace in ISO C 99. */
+extern bool
+ uc_is_c_whitespace (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test whether a Unicode character is considered whitespace in Java. */
+extern bool
+ uc_is_java_whitespace (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+enum
+{
+ UC_IDENTIFIER_START, /* valid as first or subsequent character */
+ UC_IDENTIFIER_VALID, /* valid as subsequent character only */
+ UC_IDENTIFIER_INVALID, /* not valid */
+ UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
+};
+
+/* Return the categorization of a Unicode character w.r.t. the ISO C 99
+ identifier syntax. */
+extern int
+ uc_c_ident_category (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Return the categorization of a Unicode character w.r.t. the Java
+ identifier syntax. */
+extern int
+ uc_java_ident_category (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+/* Like ISO C <ctype.h> and <wctype.h>. These functions are deprecated,
+ because this set of functions was designed with ASCII in mind and cannot
+ reflect the more diverse reality of the Unicode character set. But they
+ can be a quick-and-dirty porting aid when migrating from wchar_t APIs
+ to Unicode strings. */
+
+/* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true. */
+extern bool
+ uc_is_alnum (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character for which 'uc_is_upper' or 'uc_is_lower' is true,
+ or any character that is one of a locale-specific set of characters for
+ which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space'
+ is true. */
+extern bool
+ uc_is_alpha (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any control character. */
+extern bool
+ uc_is_cntrl (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character that corresponds to a decimal-digit character. */
+extern bool
+ uc_is_digit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character for which 'uc_is_print' is true and 'uc_is_space'
+ is false. */
+extern bool
+ uc_is_graph (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character that corresponds to a lowercase letter or is one
+ of a locale-specific set of characters for which none of 'uc_is_cntrl',
+ 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */
+extern bool
+ uc_is_lower (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any printing character. */
+extern bool
+ uc_is_print (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any printing character that is one of a locale-specific set of
+ characters for which neither 'uc_is_space' nor 'uc_is_alnum' is true. */
+extern bool
+ uc_is_punct (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character that corresponds to a locale-specific set of
+ characters for which none of 'uc_is_alnum', 'uc_is_graph', or 'uc_is_punct'
+ is true. */
+extern bool
+ uc_is_space (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character that corresponds to an uppercase letter or is one
+ of a locale-specific set of character for which none of 'uc_is_cntrl',
+ 'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true. */
+extern bool
+ uc_is_upper (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* Test for any character that corresponds to a hexadecimal-digit
+ character. */
+extern bool
+ uc_is_xdigit (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* GNU extension. */
+/* Test for any character that corresponds to a standard blank character or
+ a locale-specific set of characters for which 'uc_is_alnum' is false. */
+extern bool
+ uc_is_blank (ucs4_t uc)
+ _UC_ATTRIBUTE_CONST;
+
+/* ========================================================================= */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNICTYPE_H */
diff --git a/lib/unictype/bitmap.h b/lib/unictype/bitmap.h
new file mode 100644
index 0000000..1807206
--- /dev/null
+++ b/lib/unictype/bitmap.h
@@ -0,0 +1,48 @@
+/* Three-level bitmap lookup.
+ Copyright (C) 2000-2002, 2005-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2000-2002.
+
+ 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/>. */
+
+static inline int bitmap_lookup (const void *table, ucs4_t uc);
+
+/* These values are currently hardcoded into gen-uni-tables.c, function
+ output_predicate(). */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+
+static inline int
+bitmap_lookup (const void *table, ucs4_t uc)
+{
+ unsigned int index1 = uc >> header_0;
+ if (index1 < ((const int *) table)[0])
+ {
+ int lookup1 = ((const int *) table)[1 + index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> header_2) & header_3;
+ int lookup2 = ((const short *) table)[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc >> 5) & header_4;
+ unsigned int lookup3 = ((const unsigned int *) table)[lookup2 + index3];
+
+ return (lookup3 >> (uc & 0x1f)) & 1;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/lib/unictype/combiningclass.c b/lib/unictype/combiningclass.c
new file mode 100644
index 0000000..ddc6dcc
--- /dev/null
+++ b/lib/unictype/combiningclass.c
@@ -0,0 +1,47 @@
+/* Combining classes of Unicode characters.
+ Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+/* Define u_combclass table. */
+#include "combiningclass.h"
+
+int
+uc_combining_class (ucs4_t uc)
+{
+ unsigned int index1 = uc >> combclass_header_0;
+ if (index1 < combclass_header_1)
+ {
+ int lookup1 = u_combclass.level1[index1];
+ if (lookup1 >= 0)
+ {
+ unsigned int index2 = (uc >> combclass_header_2) & combclass_header_3;
+ int lookup2 = u_combclass.level2[lookup1 + index2];
+ if (lookup2 >= 0)
+ {
+ unsigned int index3 = (uc & combclass_header_4);
+ unsigned int lookup3 = u_combclass.level3[lookup2 + index3];
+
+ return lookup3;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/lib/unictype/combiningclass.h b/lib/unictype/combiningclass.h
new file mode 100644
index 0000000..ddfe9b0
--- /dev/null
+++ b/lib/unictype/combiningclass.h
@@ -0,0 +1,1351 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Combining class of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+#define combclass_header_0 16
+#define combclass_header_1 2
+#define combclass_header_2 7
+#define combclass_header_3 511
+#define combclass_header_4 127
+static const
+struct
+ {
+ int level1[2];
+ short level2[2 << 9];
+ unsigned char level3[75 << 7];
+ }
+u_combclass =
+{
+ { 0, 512 },
+ {
+ -1, -1, -1, -1, -1, -1, 0, -1,
+ -1, 128, -1, 256, 384, 512, 640, 768,
+ 896, 1024, 1152, 1280, 1280, 1280, 1280, 1408,
+ 1536, 1280, 1408, 1664, 1792, 1920, 2048, 2176,
+ 2304, 2432, -1, -1, -1, -1, 2560, -1,
+ -1, -1, -1, -1, -1, -1, 2688, 2816,
+ -1, 2944, 3072, -1, 3200, 3328, 3456, 3584,
+ 3712, 3840, -1, 3968, -1, -1, -1, -1,
+ -1, 4096, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 4224, 4352, 4480, -1, -1, -1, -1,
+ 4608, 4736, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 4864, 4992, -1, -1,
+ 5120, 5248, 5376, 5504, -1, 5632, -1, 5760,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 5888, -1,
+ -1, -1, -1, -1, 6016, -1, -1, -1,
+ -1, -1, -1, 6144, -1, 6272, 6400, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 6528, 6656, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 6784, 6912, 7040, 7168, 7296, 7424, 7552, -1,
+ 7680, 7808, -1, 7936, 8064, 8192, 8320, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 8064, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 8448, 8576, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 8704, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 8832, 8960, 9088, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ 9216, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 9344, 9472, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1
+ },
+ {
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 232, 220, 220,
+ 220, 220, 232, 216, 220, 220, 220, 220,
+ 220, 202, 202, 220, 220, 220, 220, 202,
+ 202, 220, 220, 220, 220, 220, 220, 220,
+ 220, 220, 220, 220, 1, 1, 1, 1,
+ 1, 220, 220, 220, 220, 230, 230, 230,
+ 230, 230, 230, 230, 230, 240, 230, 220,
+ 220, 220, 230, 230, 230, 220, 220, 0,
+ 230, 230, 230, 220, 220, 220, 220, 230,
+ 232, 220, 220, 230, 233, 234, 234, 233,
+ 234, 234, 233, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 220, 230, 230, 230, 230, 220, 230,
+ 230, 230, 222, 220, 230, 230, 230, 230,
+ 230, 230, 220, 220, 220, 220, 220, 220,
+ 230, 230, 220, 230, 230, 222, 228, 230,
+ 10, 11, 12, 13, 14, 15, 16, 17,
+ 18, 19, 19, 20, 21, 22, 0, 23,
+ 0, 24, 25, 0, 230, 220, 0, 18,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 30, 31, 32, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 27, 28, 29, 30, 31,
+ 32, 33, 34, 230, 230, 220, 220, 230,
+ 230, 230, 230, 230, 220, 230, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 35, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 230,
+ 230, 230, 230, 220, 230, 0, 0, 230,
+ 230, 0, 220, 230, 230, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 36, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 220, 230, 230, 220, 230, 230, 220,
+ 220, 220, 230, 220, 220, 230, 220, 230,
+ 230, 230, 220, 230, 220, 230, 220, 230,
+ 220, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 0, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 0, 230, 230, 230,
+ 0, 230, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 220, 220, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 0, 220, 230, 230, 220, 230,
+ 230, 220, 230, 230, 230, 220, 220, 220,
+ 27, 28, 29, 230, 230, 230, 220, 230,
+ 230, 220, 220, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 230, 220, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 84, 91, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 103, 103, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 107, 107, 107, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 118, 118, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 122, 122, 122, 122, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 220, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 220,
+ 0, 216, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 129, 130, 0, 132, 0, 0, 0,
+ 0, 0, 130, 130, 130, 130, 0, 0,
+ 130, 0, 230, 230, 9, 0, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 9, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 228, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 222, 230, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 220, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 220, 220, 220,
+ 220, 220, 220, 230, 230, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 230, 220, 230, 230, 230,
+ 230, 230, 230, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 0, 1, 220, 220, 220,
+ 220, 220, 230, 230, 220, 220, 220, 220,
+ 230, 0, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 230, 0, 0, 0,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 220, 230, 230, 230, 230, 230,
+ 230, 230, 220, 230, 230, 234, 214, 220,
+ 202, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 230, 233, 220, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 1, 1, 230, 230, 230, 230,
+ 1, 1, 1, 230, 230, 0, 0, 0,
+ 0, 230, 0, 0, 0, 1, 1, 230,
+ 220, 230, 1, 1, 220, 220, 220, 220,
+ 230, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 218, 228, 232, 222, 224, 224,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 8, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 230,
+ 0, 0, 0, 0, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 0, 230, 230, 220, 0, 0, 230,
+ 230, 0, 0, 0, 0, 0, 230, 230,
+ 0, 230, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 26, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 220,
+ 220, 220, 220, 220, 220, 220, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 220, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 1, 220, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 230, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 9, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230,
+ 230, 230, 230, 230, 230, 0, 0, 0,
+ 230, 230, 230, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 0, 0, 0, 7, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 9, 7, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
+ 7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 9, 7,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 216, 216, 1,
+ 1, 1, 0, 0, 0, 226, 216, 216,
+ 216, 216, 216, 0, 0, 0, 0, 0,
+ 0, 0, 0, 220, 220, 220, 220, 220,
+ 220, 220, 220, 0, 0, 230, 230, 230,
+ 230, 230, 220, 220, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 230, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 230, 230, 230, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 230, 230, 230, 230, 230, 230, 230, 0,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 0, 0, 230, 230, 230, 230, 230,
+ 230, 230, 0, 230, 230, 0, 230, 230,
+ 230, 230, 230, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 220, 220, 220, 220, 220, 220, 220, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 230, 230, 230, 230,
+ 230, 230, 7, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ }
+};
diff --git a/lib/unictype/pr_soft_dotted.c b/lib/unictype/pr_soft_dotted.c
new file mode 100644
index 0000000..368aeee
--- /dev/null
+++ b/lib/unictype/pr_soft_dotted.c
@@ -0,0 +1,35 @@
+/* Properties of Unicode characters.
+ Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unictype.h"
+
+#include "bitmap.h"
+
+/* Define u_property_soft_dotted table. */
+#include "pr_soft_dotted.h"
+
+bool
+uc_is_property_soft_dotted (ucs4_t uc)
+{
+ return bitmap_lookup (&u_property_soft_dotted, uc);
+}
+
+const uc_property_t UC_PROPERTY_SOFT_DOTTED =
+ { &uc_is_property_soft_dotted };
diff --git a/lib/unictype/pr_soft_dotted.h b/lib/unictype/pr_soft_dotted.h
new file mode 100644
index 0000000..57f3f3d
--- /dev/null
+++ b/lib/unictype/pr_soft_dotted.h
@@ -0,0 +1,319 @@
+/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
+/* Properties of Unicode characters. */
+/* Generated automatically by gen-uni-tables.c for Unicode 9.0.0. */
+#define header_0 16
+#define header_2 9
+#define header_3 127
+#define header_4 15
+static const
+struct
+ {
+ int header[1];
+ int level1[2];
+ short level2[2 << 7];
+ unsigned int level3[9 << 4];
+ }
+u_property_soft_dotted =
+{
+ { 2 },
+ {
+ 3 * sizeof (int) / sizeof (short) + 0,
+ 3 * sizeof (int) / sizeof (short) + 128
+ },
+ {
+ 3 + 256 * sizeof (short) / sizeof (int) + 0,
+ 3 + 256 * sizeof (short) / sizeof (int) + 16,
+ 3 + 256 * sizeof (short) / sizeof (int) + 32,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 48,
+ 3 + 256 * sizeof (short) / sizeof (int) + 64,
+ 3 + 256 * sizeof (short) / sizeof (int) + 80,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 96,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ 3 + 256 * sizeof (short) / sizeof (int) + 112,
+ 3 + 256 * sizeof (short) / sizeof (int) + 128,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1,
+ -1
+ },
+ {
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000600U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00008000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000200U, 0x00000100U,
+ 0x20000000U, 0x00040000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00080000U,
+ 0x00000000U, 0x00000000U, 0x01400000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000004U,
+ 0x00400000U, 0x00000110U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00002000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000800U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00020000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000300U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x10000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x0000000CU, 0x00C00000U, 0x00000000U,
+ 0x00000C00U, 0xC0000000U, 0x00000000U, 0x000C0000U,
+ 0x00000000U, 0x000000C0U, 0x0C000000U, 0x00000000U,
+ 0x0000C000U, 0x00000000U, 0x0000000CU, 0x00C00000U,
+ 0x00000000U, 0x00000C00U, 0xC0000000U, 0x00000000U,
+ 0x000C0000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U,
+ 0x00000000U, 0x00000000U, 0x00000000U, 0x00000000U
+ }
+};
diff --git a/lib/uninorm.in.h b/lib/uninorm.in.h
new file mode 100644
index 0000000..b20426b
--- /dev/null
+++ b/lib/uninorm.in.h
@@ -0,0 +1,248 @@
+/* Normalization forms (composition and decomposition) of Unicode strings.
+ Copyright (C) 2001-2002, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#ifndef _UNINORM_H
+#define _UNINORM_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+#include "unitypes.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+
+enum
+{
+ UC_DECOMP_CANONICAL,/* Canonical decomposition. */
+ UC_DECOMP_FONT, /* <font> A font variant (e.g. a blackletter form). */
+ UC_DECOMP_NOBREAK, /* <noBreak> A no-break version of a space or hyphen. */
+ UC_DECOMP_INITIAL, /* <initial> An initial presentation form (Arabic). */
+ UC_DECOMP_MEDIAL, /* <medial> A medial presentation form (Arabic). */
+ UC_DECOMP_FINAL, /* <final> A final presentation form (Arabic). */
+ UC_DECOMP_ISOLATED,/* <isolated> An isolated presentation form (Arabic). */
+ UC_DECOMP_CIRCLE, /* <circle> An encircled form. */
+ UC_DECOMP_SUPER, /* <super> A superscript form. */
+ UC_DECOMP_SUB, /* <sub> A subscript form. */
+ UC_DECOMP_VERTICAL,/* <vertical> A vertical layout presentation form. */
+ UC_DECOMP_WIDE, /* <wide> A wide (or zenkaku) compatibility character. */
+ UC_DECOMP_NARROW, /* <narrow> A narrow (or hankaku) compatibility character. */
+ UC_DECOMP_SMALL, /* <small> A small variant form (CNS compatibility). */
+ UC_DECOMP_SQUARE, /* <square> A CJK squared font variant. */
+ UC_DECOMP_FRACTION,/* <fraction> A vulgar fraction form. */
+ UC_DECOMP_COMPAT /* <compat> Otherwise unspecified compatibility character. */
+};
+
+/* Maximum size of decomposition of a single Unicode character. */
+#define UC_DECOMPOSITION_MAX_LENGTH 32
+
+/* Return the character decomposition mapping of a Unicode character.
+ DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
+ ucs_t elements.
+ When a decomposition exists, DECOMPOSITION[0..N-1] and *DECOMP_TAG are
+ filled and N is returned. Otherwise -1 is returned. */
+extern int
+ uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition);
+
+/* Return the canonical character decomposition mapping of a Unicode character.
+ DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
+ ucs_t elements.
+ When a decomposition exists, DECOMPOSITION[0..N-1] is filled and N is
+ returned. Otherwise -1 is returned. */
+extern int
+ uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+
+/* Attempt to combine the Unicode characters uc1, uc2.
+ uc1 is known to have canonical combining class 0.
+ Return the combination of uc1 and uc2, if it exists.
+ Return 0 otherwise.
+ Not all decompositions can be recombined using this function. See the
+ Unicode file CompositionExclusions.txt for details. */
+extern ucs4_t
+ uc_composition (ucs4_t uc1, ucs4_t uc2)
+ _UC_ATTRIBUTE_CONST;
+
+
+/* An object of type uninorm_t denotes a Unicode normalization form. */
+struct unicode_normalization_form;
+typedef const struct unicode_normalization_form *uninorm_t;
+
+/* UNINORM_NFD: Normalization form D: canonical decomposition. */
+extern const struct unicode_normalization_form uninorm_nfd;
+#define UNINORM_NFD (&uninorm_nfd)
+
+/* UNINORM_NFC: Normalization form C: canonical decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfc;
+#define UNINORM_NFC (&uninorm_nfc)
+
+/* UNINORM_NFKD: Normalization form KD: compatibility decomposition. */
+extern const struct unicode_normalization_form uninorm_nfkd;
+#define UNINORM_NFKD (&uninorm_nfkd)
+
+/* UNINORM_NFKC: Normalization form KC: compatibility decomposition, then
+ canonical composition. */
+extern const struct unicode_normalization_form uninorm_nfkc;
+#define UNINORM_NFKC (&uninorm_nfkc)
+
+/* Test whether a normalization form does compatibility decomposition. */
+#define uninorm_is_compat_decomposing(nf) \
+ ((* (const unsigned int *) (nf) >> 0) & 1)
+
+/* Test whether a normalization form includes canonical composition. */
+#define uninorm_is_composing(nf) \
+ ((* (const unsigned int *) (nf) >> 1) & 1)
+
+/* Return the decomposing variant of a normalization form.
+ This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD. */
+extern uninorm_t
+ uninorm_decomposing_form (uninorm_t nf)
+ _UC_ATTRIBUTE_PURE;
+
+
+/* Return the specified normalization form of a string. */
+extern uint8_t *
+ u8_normalize (uninorm_t nf, const uint8_t *s, size_t n,
+ uint8_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint16_t *
+ u16_normalize (uninorm_t nf, const uint16_t *s, size_t n,
+ uint16_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+extern uint32_t *
+ u32_normalize (uninorm_t nf, const uint32_t *s, size_t n,
+ uint32_t *_UC_RESTRICT resultbuf, size_t *lengthp);
+
+
+/* Compare S1 and S2, ignoring differences in normalization.
+ NF must be either UNINORM_NFD or UNINORM_NFKD.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Converts the string S of length N to a NUL-terminated byte sequence, in such
+ a way that comparing uN_normxfrm (S1) and uN_normxfrm (S2) with uN_cmp2() is
+ equivalent to comparing S1 and S2 with uN_normcoll().
+ NF must be either UNINORM_NFC or UNINORM_NFKC. */
+extern char *
+ u8_normxfrm (const uint8_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u16_normxfrm (const uint16_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+extern char *
+ u32_normxfrm (const uint32_t *s, size_t n, uninorm_t nf,
+ char *resultbuf, size_t *lengthp);
+
+
+/* Compare S1 and S2, ignoring differences in normalization, using the
+ collation rules of the current locale.
+ NF must be either UNINORM_NFC or UNINORM_NFKC.
+ If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
+ return 0. Upon failure, return -1 with errno set. */
+extern int
+ u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u16_normcoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+extern int
+ u32_normcoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
+ uninorm_t nf, int *resultp);
+
+
+/* Normalization of a stream of Unicode characters.
+
+ A "stream of Unicode characters" is essentially a function that accepts an
+ ucs4_t argument repeatedly, optionally combined with a function that
+ "flushes" the stream. */
+
+/* Data type of a stream of Unicode characters that normalizes its input
+ according to a given normalization form and passes the normalized character
+ sequence to the encapsulated stream of Unicode characters. */
+struct uninorm_filter;
+
+/* Create and return a normalization filter for Unicode characters.
+ The pair (stream_func, stream_data) is the encapsulated stream.
+ stream_func (stream_data, uc) receives the Unicode character uc
+ and returns 0 if successful, or -1 with errno set upon failure.
+ Return the new filter, or NULL with errno set upon failure. */
+extern struct uninorm_filter *
+ uninorm_filter_create (uninorm_t nf,
+ int (*stream_func) (void *stream_data, ucs4_t uc),
+ void *stream_data);
+
+/* Stuff a Unicode character into a normalizing filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream.
+ Return 0 if successful, or -1 with errno set upon failure.
+ Note! If after calling this function, additional characters are written
+ into the filter, the resulting character sequence in the encapsulated stream
+ will not necessarily be normalized. */
+extern int
+ uninorm_filter_flush (struct uninorm_filter *filter);
+
+/* Bring data buffered in the filter to its destination, the encapsulated
+ stream, then close and free the filter.
+ Return 0 if successful, or -1 with errno set upon failure. */
+extern int
+ uninorm_filter_free (struct uninorm_filter *filter);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _UNINORM_H */
diff --git a/lib/uninorm/decompose-internal.c b/lib/uninorm/decompose-internal.c
new file mode 100644
index 0000000..1775dd6
--- /dev/null
+++ b/lib/uninorm/decompose-internal.c
@@ -0,0 +1,29 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "decompose-internal.h"
+
+#define ELEMENT struct ucs4_with_ccc
+#define COMPARE(a,b) ((a)->ccc - (b)->ccc)
+#define STATIC
+#define STATIC_FROMTO static
+#define merge_sort_fromto gl_uninorm_decompose_merge_sort_fromto
+#define merge_sort_inplace gl_uninorm_decompose_merge_sort_inplace
+#include "array-mergesort.h"
diff --git a/lib/uninorm/decompose-internal.h b/lib/uninorm/decompose-internal.h
new file mode 100644
index 0000000..f341bec
--- /dev/null
+++ b/lib/uninorm/decompose-internal.h
@@ -0,0 +1,36 @@
+/* Decomposition of Unicode strings.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <stddef.h>
+
+#include "unitypes.h"
+
+/* Variant of uc_decomposition that does not produce the 'tag'. */
+extern int
+ uc_compat_decomposition (ucs4_t uc, ucs4_t *decomposition);
+
+/* A Unicode character together with its canonical combining class. */
+struct ucs4_with_ccc
+{
+ ucs4_t code;
+ int ccc; /* range 0..255 */
+};
+
+/* Stable-sort an array of 'struct ucs4_with_ccc'. */
+extern void
+ gl_uninorm_decompose_merge_sort_inplace (struct ucs4_with_ccc *src, size_t n,
+ struct ucs4_with_ccc *tmp);
diff --git a/lib/uninorm/normalize-internal.h b/lib/uninorm/normalize-internal.h
new file mode 100644
index 0000000..0cc83a8
--- /dev/null
+++ b/lib/uninorm/normalize-internal.h
@@ -0,0 +1,35 @@
+/* Normalization of Unicode strings.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include "unitypes.h"
+
+/* Complete definition of normalization form descriptor. */
+struct unicode_normalization_form
+{
+ /* Bit mask containing meta-information.
+ This must be the first field. */
+ unsigned int description;
+ #define NF_IS_COMPAT_DECOMPOSING (1 << 0)
+ #define NF_IS_COMPOSING (1 << 1)
+ /* Function that decomposes a Unicode character. */
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition);
+ /* Function that combines two Unicode characters, a starter and another
+ character. */
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2);
+ /* Decomposing variant. */
+ const struct unicode_normalization_form *decomposing_variant;
+};
diff --git a/lib/uninorm/u-normalize-internal.h b/lib/uninorm/u-normalize-internal.h
new file mode 100644
index 0000000..c257232
--- /dev/null
+++ b/lib/uninorm/u-normalize-internal.h
@@ -0,0 +1,380 @@
+/* Decomposition and composition of Unicode strings.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+UNIT *
+FUNC (uninorm_t nf, const UNIT *s, size_t n,
+ UNIT *resultbuf, size_t *lengthp)
+{
+ int (*decomposer) (ucs4_t uc, ucs4_t *decomposition) = nf->decomposer;
+ ucs4_t (*composer) (ucs4_t uc1, ucs4_t uc2) = nf->composer;
+
+ /* The result being accumulated. */
+ UNIT *result;
+ size_t length;
+ size_t allocated;
+ /* The buffer for sorting. */
+ #define SORTBUF_PREALLOCATED 64
+ struct ucs4_with_ccc sortbuf_preallocated[2 * SORTBUF_PREALLOCATED];
+ struct ucs4_with_ccc *sortbuf; /* array of size 2 * sortbuf_allocated */
+ size_t sortbuf_allocated;
+ size_t sortbuf_count;
+
+ /* Initialize the accumulator. */
+ if (resultbuf == NULL)
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ else
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ length = 0;
+
+ /* Initialize the buffer for sorting. */
+ sortbuf = sortbuf_preallocated;
+ sortbuf_allocated = SORTBUF_PREALLOCATED;
+ sortbuf_count = 0;
+
+ {
+ const UNIT *s_end = s + n;
+
+ for (;;)
+ {
+ int count;
+ ucs4_t decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int decomposed_count;
+ int i;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character. */
+ count = U_MBTOUC_UNSAFE (&decomposed[0], s, s_end - s);
+ decomposed_count = 1;
+
+ /* Decompose it, recursively.
+ It would be possible to precompute the recursive decomposition
+ and store it in a table. But this would significantly increase
+ the size of the decomposition tables, because for example for
+ U+1FC1 the recursive canonical decomposition and the recursive
+ compatibility decomposition are different. */
+ {
+ int curr;
+
+ for (curr = 0; curr < decomposed_count; )
+ {
+ /* Invariant: decomposed[0..curr-1] is fully decomposed, i.e.
+ all elements are atomic. */
+ ucs4_t curr_decomposed[UC_DECOMPOSITION_MAX_LENGTH];
+ int curr_decomposed_count;
+
+ curr_decomposed_count = decomposer (decomposed[curr], curr_decomposed);
+ if (curr_decomposed_count >= 0)
+ {
+ /* Move curr_decomposed[0..curr_decomposed_count-1] over
+ decomposed[curr], making room. It's not worth using
+ memcpy() here, since the counts are so small. */
+ int shift = curr_decomposed_count - 1;
+
+ if (shift < 0)
+ abort ();
+ if (shift > 0)
+ {
+ int j;
+
+ decomposed_count += shift;
+ if (decomposed_count > UC_DECOMPOSITION_MAX_LENGTH)
+ abort ();
+ for (j = decomposed_count - 1 - shift; j > curr; j--)
+ decomposed[j + shift] = decomposed[j];
+ }
+ for (; shift >= 0; shift--)
+ decomposed[curr + shift] = curr_decomposed[shift];
+ }
+ else
+ {
+ /* decomposed[curr] is atomic. */
+ curr++;
+ }
+ }
+ }
+ }
+ else
+ {
+ count = 0;
+ decomposed_count = 0;
+ }
+
+ i = 0;
+ for (;;)
+ {
+ ucs4_t uc;
+ int ccc;
+
+ if (s < s_end)
+ {
+ /* Fetch the next character from the decomposition. */
+ if (i == decomposed_count)
+ break;
+ uc = decomposed[i];
+ ccc = uc_combining_class (uc);
+ }
+ else
+ {
+ /* End of string reached. */
+ uc = 0;
+ ccc = 0;
+ }
+
+ if (ccc == 0)
+ {
+ size_t j;
+
+ /* Apply the canonical ordering algorithm to the accumulated
+ sequence of characters. */
+ if (sortbuf_count > 1)
+ gl_uninorm_decompose_merge_sort_inplace (sortbuf, sortbuf_count,
+ sortbuf + sortbuf_count);
+
+ if (composer != NULL)
+ {
+ /* Attempt to combine decomposed characters, as specified
+ in the Unicode Standard Annex #15 "Unicode Normalization
+ Forms". We need to check
+ 1. whether the first accumulated character is a
+ "starter" (i.e. has ccc = 0). This is usually the
+ case. But when the string starts with a
+ non-starter, the sortbuf also starts with a
+ non-starter. Btw, this check could also be
+ omitted, because the composition table has only
+ entries (code1, code2) for which code1 is a
+ starter; if the first accumulated character is not
+ a starter, no lookup will succeed.
+ 2. If the sortbuf has more than one character, check
+ for each of these characters that are not "blocked"
+ from the starter (i.e. have a ccc that is higher
+ than the ccc of the previous character) whether it
+ can be combined with the first character.
+ 3. If only one character is left in sortbuf, check
+ whether it can be combined with the next character
+ (also a starter). */
+ if (sortbuf_count > 0 && sortbuf[0].ccc == 0)
+ {
+ for (j = 1; j < sortbuf_count; )
+ {
+ if (sortbuf[j].ccc > sortbuf[j - 1].ccc)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, sortbuf[j].code);
+ if (combined)
+ {
+ size_t k;
+
+ sortbuf[0].code = combined;
+ /* sortbuf[0].ccc = 0, still valid. */
+ for (k = j + 1; k < sortbuf_count; k++)
+ sortbuf[k - 1] = sortbuf[k];
+ sortbuf_count--;
+ continue;
+ }
+ }
+ j++;
+ }
+ if (s < s_end && sortbuf_count == 1)
+ {
+ ucs4_t combined =
+ composer (sortbuf[0].code, uc);
+ if (combined)
+ {
+ uc = combined;
+ ccc = 0;
+ /* uc could be further combined with subsequent
+ characters. So don't put it into sortbuf[0] in
+ this round, only in the next round. */
+ sortbuf_count = 0;
+ }
+ }
+ }
+ }
+
+ for (j = 0; j < sortbuf_count; j++)
+ {
+ ucs4_t muc = sortbuf[j].code;
+
+ /* Append muc to the result accumulator. */
+ if (length < allocated)
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret >= 0)
+ {
+ length += ret;
+ goto done_appending;
+ }
+ }
+ {
+ size_t old_allocated = allocated;
+ size_t new_allocated = 2 * old_allocated;
+ if (new_allocated < 64)
+ new_allocated = 64;
+ if (new_allocated < old_allocated) /* integer overflow? */
+ abort ();
+ {
+ UNIT *larger_result;
+ if (result == NULL)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ else if (result == resultbuf)
+ {
+ larger_result =
+ (UNIT *) malloc (new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ U_CPY (larger_result, resultbuf, length);
+ }
+ else
+ {
+ larger_result =
+ (UNIT *) realloc (result, new_allocated * sizeof (UNIT));
+ if (larger_result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ result = larger_result;
+ allocated = new_allocated;
+ {
+ int ret =
+ U_UCTOMB (result + length, muc, allocated - length);
+ if (ret == -1)
+ {
+ errno = EINVAL;
+ goto fail;
+ }
+ if (ret < 0)
+ abort ();
+ length += ret;
+ goto done_appending;
+ }
+ }
+ }
+ done_appending: ;
+ }
+
+ /* sortbuf is now empty. */
+ sortbuf_count = 0;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ /* Append (uc, ccc) to sortbuf. */
+ if (sortbuf_count == sortbuf_allocated)
+ {
+ struct ucs4_with_ccc *new_sortbuf;
+
+ sortbuf_allocated = 2 * sortbuf_allocated;
+ if (sortbuf_allocated < sortbuf_count) /* integer overflow? */
+ abort ();
+ new_sortbuf =
+ (struct ucs4_with_ccc *) malloc (2 * sortbuf_allocated * sizeof (struct ucs4_with_ccc));
+ if (new_sortbuf == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ memcpy (new_sortbuf, sortbuf,
+ sortbuf_count * sizeof (struct ucs4_with_ccc));
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ sortbuf = new_sortbuf;
+ }
+ sortbuf[sortbuf_count].code = uc;
+ sortbuf[sortbuf_count].ccc = ccc;
+ sortbuf_count++;
+
+ i++;
+ }
+
+ if (!(s < s_end))
+ /* End of string reached. */
+ break;
+
+ s += count;
+ }
+ }
+
+ if (length == 0)
+ {
+ if (result == NULL)
+ {
+ /* Return a non-NULL value. NULL means error. */
+ result = (UNIT *) malloc (1);
+ if (result == NULL)
+ {
+ errno = ENOMEM;
+ goto fail;
+ }
+ }
+ }
+ else if (result != resultbuf && length < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ UNIT *memory;
+
+ memory = (UNIT *) realloc (result, length * sizeof (UNIT));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (sortbuf_count > 0)
+ abort ();
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+
+ *lengthp = length;
+ return result;
+
+ fail:
+ {
+ int saved_errno = errno;
+ if (sortbuf != sortbuf_preallocated)
+ free (sortbuf);
+ if (result != resultbuf)
+ free (result);
+ errno = saved_errno;
+ }
+ return NULL;
+}
diff --git a/lib/uninorm/u8-normalize.c b/lib/uninorm/u8-normalize.c
new file mode 100644
index 0000000..0b0a4d1
--- /dev/null
+++ b/lib/uninorm/u8-normalize.c
@@ -0,0 +1,38 @@
+/* Normalization of UTF-8 strings.
+ Copyright (C) 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uninorm.h"
+
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unistr.h"
+#include "unictype.h"
+#include "normalize-internal.h"
+#include "uninorm/decompose-internal.h"
+
+#define FUNC u8_normalize
+#define UNIT uint8_t
+#define U_MBTOUC_UNSAFE u8_mbtouc_unsafe
+#define U_UCTOMB u8_uctomb
+#define U_CPY u8_cpy
+#include "u-normalize-internal.h"
diff --git a/lib/unistd--.h b/lib/unistd--.h
new file mode 100644
index 0000000..05f3740
--- /dev/null
+++ b/lib/unistd--.h
@@ -0,0 +1,32 @@
+/* Like unistd.h, but redefine some names to avoid glitches.
+
+ Copyright (C) 2005, 2009-2020 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <unistd.h>
+#include "unistd-safer.h"
+
+#undef dup
+#define dup dup_safer
+
+#undef pipe
+#define pipe pipe_safer
+
+#if GNULIB_PIPE2_SAFER
+# undef pipe2
+# define pipe2 pipe2_safer
+#endif
diff --git a/lib/unistd-safer.h b/lib/unistd-safer.h
new file mode 100644
index 0000000..3e83509
--- /dev/null
+++ b/lib/unistd-safer.h
@@ -0,0 +1,31 @@
+/* Invoke unistd-like functions, but avoid some glitches.
+
+ Copyright (C) 2001, 2003, 2005, 2009-2020 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/>. */
+
+/* Written by Paul Eggert and Eric Blake. */
+
+int dup_safer (int);
+int fd_safer (int);
+int pipe_safer (int[2]);
+
+#if GNULIB_FD_SAFER_FLAG
+int dup_safer_flag (int, int);
+int fd_safer_flag (int, int);
+#endif
+
+#if GNULIB_PIPE2_SAFER
+int pipe2_safer (int[2], int);
+#endif
diff --git a/lib/unistd.c b/lib/unistd.c
new file mode 100644
index 0000000..72bad1c
--- /dev/null
+++ b/lib/unistd.c
@@ -0,0 +1,4 @@
+#include <config.h>
+#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
+#include "unistd.h"
+typedef int dummy;
diff --git a/lib/unistd.in.h b/lib/unistd.in.h
new file mode 100644
index 0000000..716eecf
--- /dev/null
+++ b/lib/unistd.in.h
@@ -0,0 +1,2303 @@
+/* Substitute for and wrapper around <unistd.h>.
+ Copyright (C) 2003-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_UNISTD_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H
+/* Special invocation convention:
+ - On Mac OS X 10.3.9 we have a sequence of nested includes
+ <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
+ In this situation, the functions are not yet declared, therefore we cannot
+ provide the C++ aliases. */
+
+#@INCLUDE_NEXT@ @NEXT_UNISTD_H@
+
+#else
+/* Normal invocation convention. */
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UNISTD_H@
+# define _GL_INCLUDING_UNISTD_H
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+# undef _GL_INCLUDING_UNISTD_H
+#endif
+
+/* Get all possible declarations of gethostname(). */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+ && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
+#define _@GUARD_PREFIX@_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
+/* But avoid namespace pollution on glibc systems. */
+#ifndef __GLIBC__
+# include <stddef.h>
+#endif
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
+/* MSVC declares 'unlink' in <stdio.h>, not in <unistd.h>. We must include
+ it before we #define unlink rpl_unlink. */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+ || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \
+ && (defined _WIN32 && ! defined __CYGWIN__)) \
+ || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
+ && defined __CYGWIN__)) \
+ && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in <fcntl.h>, not in
+ <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \
+ && (defined __CYGWIN__ || defined __ANDROID__) \
+ && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>. */
+/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
+ <unistd.h>. */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>. */
+/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system <stdlib.h> is
+ included here. */
+/* But avoid namespace pollution on glibc systems. */
+#if !defined __GLIBC__ && !defined __osf__
+# define __need_system_stdlib_h
+# include <stdlib.h>
+# undef __need_system_stdlib_h
+#endif
+
+/* Native Windows platforms declare _chdir, _getcwd, _rmdir in
+ <io.h> and/or <direct.h>, not in <unistd.h>.
+ They also declare _access(), _chmod(), _close(), _dup(), _dup2(), _isatty(),
+ _lseek(), _read(), _unlink(), _write() in <io.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <io.h>
+# include <direct.h>
+#endif
+
+/* Native Windows platforms declare _execl*, _execv* in <process.h>. */
+#if defined _WIN32 && !defined __CYGWIN__
+# include <process.h>
+#endif
+
+/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
+ NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
+ || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
+ && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+/* Mac OS X 10.13, Solaris 11.4, and Android 9.0 declare getentropy in
+ <sys/random.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_GETENTROPY@ || defined GNULIB_POSIXCHECK) \
+ && ((defined __APPLE__ && defined __MACH__) || defined __sun \
+ || defined __ANDROID__) \
+ && @UNISTD_H_HAVE_SYS_RANDOM_H@ \
+ && !defined __GLIBC__
+# include <sys/random.h>
+#endif
+
+/* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>. */
+/* But avoid namespace pollution on glibc systems. */
+#if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+ && !defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC defines off_t in <sys/types.h>.
+ May also define off_t to a 64-bit type on native Windows. */
+/* Get off_t, ssize_t, mode_t. */
+#include <sys/types.h>
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Get getopt(), optarg, optind, opterr, optopt. */
+#if @GNULIB_GETOPT_POSIX@ && @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
+# include <getopt-cdefs.h>
+# include <getopt-pfx-core.h>
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UNISTD_INLINE
+# define _GL_UNISTD_INLINE _GL_INLINE
+#endif
+
+/* Hide some function declarations from <winsock2.h>. */
+
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef socket
+# define socket socket_used_without_including_sys_socket_h
+# undef connect
+# define connect connect_used_without_including_sys_socket_h
+# undef accept
+# define accept accept_used_without_including_sys_socket_h
+# undef bind
+# define bind bind_used_without_including_sys_socket_h
+# undef getpeername
+# define getpeername getpeername_used_without_including_sys_socket_h
+# undef getsockname
+# define getsockname getsockname_used_without_including_sys_socket_h
+# undef getsockopt
+# define getsockopt getsockopt_used_without_including_sys_socket_h
+# undef listen
+# define listen listen_used_without_including_sys_socket_h
+# undef recv
+# define recv recv_used_without_including_sys_socket_h
+# undef send
+# define send send_used_without_including_sys_socket_h
+# undef recvfrom
+# define recvfrom recvfrom_used_without_including_sys_socket_h
+# undef sendto
+# define sendto sendto_used_without_including_sys_socket_h
+# undef setsockopt
+# define setsockopt setsockopt_used_without_including_sys_socket_h
+# undef shutdown
+# define shutdown shutdown_used_without_including_sys_socket_h
+# else
+ _GL_WARN_ON_USE (socket,
+ "socket() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (connect,
+ "connect() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (accept,
+ "accept() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (bind,
+ "bind() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getpeername,
+ "getpeername() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockname,
+ "getsockname() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (getsockopt,
+ "getsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (listen,
+ "listen() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recv,
+ "recv() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (send,
+ "send() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (recvfrom,
+ "recvfrom() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (sendto,
+ "sendto() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (setsockopt,
+ "setsockopt() used without including <sys/socket.h>");
+ _GL_WARN_ON_USE (shutdown,
+ "shutdown() used without including <sys/socket.h>");
+# endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef select
+# define select select_used_without_including_sys_select_h
+# else
+ _GL_WARN_ON_USE (select,
+ "select() used without including <sys/select.h>");
+# endif
+# endif
+#endif
+
+
+/* OS/2 EMX lacks these macros. */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist. */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions. */
+
+
+#if @GNULIB_ACCESS@
+# if @REPLACE_ACCESS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access rpl_access
+# endif
+_GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access _access
+# endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
+#elif defined GNULIB_POSIXCHECK
+# undef access
+# if HAVE_RAW_DECL_ACCESS
+/* The access() function is a security risk. */
+_GL_WARN_ON_USE (access, "access does not always support X_OK - "
+ "use gnulib module access for portability; "
+ "also, this function is a security risk - "
+ "use the gnulib module faccessat instead");
+# endif
+#elif @GNULIB_MDA_ACCESS@
+/* On native Windows, map 'access' to '_access', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::access always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef access
+# define access _access
+# endif
+_GL_CXXALIAS_MDA (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
+#endif
+
+
+#if @GNULIB_CHDIR@
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chdir
+# define chdir _chdir
+# endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
+#elif defined GNULIB_POSIXCHECK
+# undef chdir
+# if HAVE_RAW_DECL_CHDIR
+_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
+ "use gnulib module chdir for portability");
+# endif
+#elif @GNULIB_MDA_CHDIR@
+/* On native Windows, map 'chdir' to '_chdir', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::chdir always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chdir
+# define chdir _chdir
+# endif
+_GL_CXXALIAS_MDA (chdir, int, (const char *file));
+# else
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIASWARN (chdir);
+#endif
+
+
+#if @GNULIB_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html. */
+# if @REPLACE_CHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef chown
+# define chown rpl_chown
+# endif
+_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
+# else
+# if !@HAVE_CHOWN@
+_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
+# endif
+_GL_CXXALIASWARN (chown);
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+ "doesn't treat a uid or gid of -1 on some systems - "
+ "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close. */
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close rpl_close
+# endif
+_GL_FUNCDECL_RPL (close, int, (int fd));
+_GL_CXXALIAS_RPL (close, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close _close
+# endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared. */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+ "use gnulib module close for portability");
+#elif @GNULIB_MDA_CLOSE@
+/* On native Windows, map 'close' to '_close', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::close always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef close
+# define close _close
+# endif
+_GL_CXXALIAS_MDA (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#endif
+
+
+#if @GNULIB_COPY_FILE_RANGE@
+# if !@HAVE_COPY_FILE_RANGE@
+_GL_FUNCDECL_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+_GL_CXXALIAS_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+ int ofd, off_t *opos,
+ size_t len, unsigned flags));
+# endif
+_GL_CXXALIASWARN (copy_file_range);
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_COPY_FILE_RANGE
+_GL_WARN_ON_USE (copy_file_range,
+ "copy_file_range is unportable - "
+ "use gnulib module copy_file_range for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP@
+# if @REPLACE_DUP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup rpl_dup
+# endif
+_GL_FUNCDECL_RPL (dup, int, (int oldfd));
+_GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup
+# define dup _dup
+# endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#elif defined GNULIB_POSIXCHECK
+# undef dup
+# if HAVE_RAW_DECL_DUP
+_GL_WARN_ON_USE (dup, "dup is unportable - "
+ "use gnulib module dup for portability");
+# endif
+#elif @GNULIB_MDA_DUP@
+/* On native Windows, map 'dup' to '_dup', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::dup always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup
+# define dup _dup
+# endif
+_GL_CXXALIAS_MDA (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#endif
+
+
+#if @GNULIB_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
+ NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>. */
+# if @REPLACE_DUP2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup2 rpl_dup2
+# endif
+_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
+_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup2
+# define dup2 _dup2
+# endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+ "use gnulib module dup2 for portability");
+# endif
+#elif @GNULIB_MDA_DUP2@
+/* On native Windows, map 'dup2' to '_dup2', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::dup2 always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef dup2
+# define dup2 _dup2
+# endif
+_GL_CXXALIAS_MDA (dup2, int, (int oldfd, int newfd));
+# else
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+ specified flags.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Close NEWFD first if it is open.
+ Return newfd if successful, otherwise -1 and errno set.
+ See the Linux man page at
+ <https://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
+# if @HAVE_DUP3@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define dup3 rpl_dup3
+# endif
+_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
+# else
+_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+_GL_CXXALIASWARN (dup3);
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+ "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if defined __CYGWIN__ && !defined __i386__
+/* The 'environ' variable is defined in a DLL. Therefore its declaration needs
+ the '__declspec(dllimport)' attribute, but the system's <unistd.h> lacks it.
+ This leads to a link error on 64-bit Cygwin when the option
+ -Wl,--disable-auto-import is in use. */
+_GL_EXTERN_C __declspec(dllimport) char **environ;
+# endif
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values. An array of strings of the form
+ "VARIABLE=VALUE", terminated with a NULL. */
+# if defined __APPLE__ && defined __MACH__
+# include <TargetConditionals.h>
+# if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
+# define _GL_USE_CRT_EXTERNS
+# endif
+# endif
+# ifdef _GL_USE_CRT_EXTERNS
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron ())
+# else
+# ifdef __cplusplus
+extern "C" {
+# endif
+extern char **environ;
+# ifdef __cplusplus
+}
+# endif
+# endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+_GL_UNISTD_INLINE char ***
+_GL_WARN_ON_USE_ATTRIBUTE ("environ is unportable - "
+ "use gnulib module environ for portability")
+rpl_environ (void)
+{
+ return &environ;
+}
+# undef environ
+# define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+ the current process. */
+# if !@HAVE_EUIDACCESS@
+_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
+_GL_CXXALIASWARN (euidaccess);
+# if defined GNULIB_POSIXCHECK
+/* Like access(), this function is a security risk. */
+_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
+ "use the gnulib module faccessat instead");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+ "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_EXECL@
+# if @REPLACE_EXECL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execl
+# define execl rpl_execl
+# endif
+_GL_FUNCDECL_RPL (execl, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execl, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#elif defined GNULIB_POSIXCHECK
+# undef execl
+# if HAVE_RAW_DECL_EXECL
+_GL_WARN_ON_USE (execl, "execl behaves very differently on mingw - "
+ "use gnulib module execl for portability");
+# endif
+#elif @GNULIB_MDA_EXECL@
+/* On native Windows, map 'execl' to '_execl', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execl always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execl
+# define execl _execl
+# endif
+_GL_CXXALIAS_MDA (execl, intptr_t, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execl, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execl);
+#endif
+
+#if @GNULIB_EXECLE@
+# if @REPLACE_EXECLE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execle
+# define execle rpl_execle
+# endif
+_GL_FUNCDECL_RPL (execle, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execle, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#elif defined GNULIB_POSIXCHECK
+# undef execle
+# if HAVE_RAW_DECL_EXECLE
+_GL_WARN_ON_USE (execle, "execle behaves very differently on mingw - "
+ "use gnulib module execle for portability");
+# endif
+#elif @GNULIB_MDA_EXECLE@
+/* On native Windows, map 'execle' to '_execle', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execle always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execle
+# define execle _execle
+# endif
+_GL_CXXALIAS_MDA (execle, intptr_t,
+ (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execle, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execle);
+#endif
+
+#if @GNULIB_EXECLP@
+# if @REPLACE_EXECLP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execlp
+# define execlp rpl_execlp
+# endif
+_GL_FUNCDECL_RPL (execlp, int, (const char *program, const char *arg, ...)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (execlp, int, (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#elif defined GNULIB_POSIXCHECK
+# undef execlp
+# if HAVE_RAW_DECL_EXECLP
+_GL_WARN_ON_USE (execlp, "execlp behaves very differently on mingw - "
+ "use gnulib module execlp for portability");
+# endif
+#elif @GNULIB_MDA_EXECLP@
+/* On native Windows, map 'execlp' to '_execlp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execlp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execlp
+# define execlp _execlp
+# endif
+_GL_CXXALIAS_MDA (execlp, intptr_t,
+ (const char *program, const char *arg, ...));
+# else
+_GL_CXXALIAS_SYS (execlp, int, (const char *program, const char *arg, ...));
+# endif
+_GL_CXXALIASWARN (execlp);
+#endif
+
+
+#if @GNULIB_EXECV@
+# if @REPLACE_EXECV@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execv
+# define execv rpl_execv
+# endif
+_GL_FUNCDECL_RPL (execv, int, (const char *program, char * const *argv)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execv, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#elif defined GNULIB_POSIXCHECK
+# undef execv
+# if HAVE_RAW_DECL_EXECV
+_GL_WARN_ON_USE (execv, "execv behaves very differently on mingw - "
+ "use gnulib module execv for portability");
+# endif
+#elif @GNULIB_MDA_EXECV@
+/* On native Windows, map 'execv' to '_execv', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execv always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execv
+# define execv _execv
+# endif
+_GL_CXXALIAS_MDA_CAST (execv, intptr_t,
+ (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execv, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execv);
+#endif
+
+#if @GNULIB_EXECVE@
+# if @REPLACE_EXECVE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execve
+# define execve rpl_execve
+# endif
+_GL_FUNCDECL_RPL (execve, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#elif defined GNULIB_POSIXCHECK
+# undef execve
+# if HAVE_RAW_DECL_EXECVE
+_GL_WARN_ON_USE (execve, "execve behaves very differently on mingw - "
+ "use gnulib module execve for portability");
+# endif
+#elif @GNULIB_MDA_EXECVE@
+/* On native Windows, map 'execve' to '_execve', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execve always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execve
+# define execve _execve
+# endif
+_GL_CXXALIAS_MDA_CAST (execve, intptr_t,
+ (const char *program, char * const *argv,
+ char * const *env));
+# else
+_GL_CXXALIAS_SYS (execve, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execve);
+#endif
+
+#if @GNULIB_EXECVP@
+# if @REPLACE_EXECVP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvp
+# define execvp rpl_execvp
+# endif
+_GL_FUNCDECL_RPL (execvp, int, (const char *program, char * const *argv)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvp, int, (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#elif defined GNULIB_POSIXCHECK
+# undef execvp
+# if HAVE_RAW_DECL_EXECVP
+_GL_WARN_ON_USE (execvp, "execvp behaves very differently on mingw - "
+ "use gnulib module execvp for portability");
+# endif
+#elif @GNULIB_MDA_EXECVP@
+/* On native Windows, map 'execvp' to '_execvp', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execvp always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvp
+# define execvp _execvp
+# endif
+_GL_CXXALIAS_MDA_CAST (execvp, intptr_t,
+ (const char *program, char * const *argv));
+# else
+_GL_CXXALIAS_SYS (execvp, int, (const char *program, char * const *argv));
+# endif
+_GL_CXXALIASWARN (execvp);
+#endif
+
+#if @GNULIB_EXECVPE@
+# if @REPLACE_EXECVPE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvpe
+# define execvpe rpl_execvpe
+# endif
+_GL_FUNCDECL_RPL (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# else
+# if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+_GL_CXXALIASWARN (execvpe);
+#elif defined GNULIB_POSIXCHECK
+# undef execvpe
+# if HAVE_RAW_DECL_EXECVPE
+_GL_WARN_ON_USE (execvpe, "execvpe behaves very differently on mingw - "
+ "use gnulib module execvpe for portability");
+# endif
+#elif @GNULIB_MDA_EXECVPE@
+/* On native Windows, map 'execvpe' to '_execvpe', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::execvpe on all platforms that have
+ it. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef execvpe
+# define execvpe _execvpe
+# endif
+_GL_CXXALIAS_MDA_CAST (execvpe, intptr_t,
+ (const char *program, char * const *argv,
+ char * const *env));
+# elif @HAVE_EXECVPE@
+# if !@HAVE_DECL_EXECVPE@
+_GL_FUNCDECL_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (execvpe, int,
+ (const char *program, char * const *argv, char * const *env));
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_EXECVPE@
+_GL_CXXALIASWARN (execvpe);
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if @REPLACE_FACCESSAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef faccessat
+# define faccessat rpl_faccessat
+# endif
+_GL_FUNCDECL_RPL (faccessat, int,
+ (int fd, char const *name, int mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (faccessat, int,
+ (int fd, char const *name, int mode, int flag));
+# else
+# if !@HAVE_FACCESSAT@
+_GL_FUNCDECL_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (faccessat, int,
+ (int fd, char const *file, int mode, int flag));
+# endif
+_GL_CXXALIASWARN (faccessat);
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+ "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+/* Change the process' current working directory to the directory on which
+ the given file descriptor is open.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>. */
+# if ! @HAVE_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata. */
+_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
+ _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_fd (int fd);
+_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
+_GL_EXTERN_C const char *_gl_directory_name (int fd);
+
+# else
+# if !@HAVE_DECL_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+# endif
+# endif
+_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
+_GL_CXXALIASWARN (fchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+ "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef fchownat
+# define fchownat rpl_fchownat
+# endif
+_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# else
+# if !@HAVE_FCHOWNAT@
+_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
+ uid_t owner, gid_t group, int flag));
+# endif
+_GL_CXXALIASWARN (fchownat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FDATASYNC@
+/* Synchronize changes to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>. */
+# if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@
+_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
+_GL_CXXALIASWARN (fdatasync);
+#elif defined GNULIB_POSIXCHECK
+# undef fdatasync
+# if HAVE_RAW_DECL_FDATASYNC
+_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
+ "use gnulib module fdatasync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes, including metadata, to a file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>. */
+# if !@HAVE_FSYNC@
+_GL_FUNCDECL_SYS (fsync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fsync, int, (int fd));
+_GL_CXXALIASWARN (fsync);
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+ "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>. */
+# if @REPLACE_FTRUNCATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ftruncate
+# define ftruncate rpl_ftruncate
+# endif
+_GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length));
+_GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length));
+# else
+# if !@HAVE_FTRUNCATE@
+_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIASWARN (ftruncate);
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+ "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+ of BUF.
+ Return BUF if successful, or NULL if the directory couldn't be determined
+ or SIZE was too small.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
+ Additionally, the gnulib module 'getcwd' guarantees the following GNU
+ extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+ is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+ necessary. */
+# if @REPLACE_GETCWD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getcwd rpl_getcwd
+# endif
+_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
+_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getcwd
+# define getcwd _getcwd
+# endif
+_GL_CXXALIAS_MDA (getcwd, char *, (char *buf, size_t size));
+# else
+/* Need to cast, because on mingw, the second parameter is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+ "use gnulib module getcwd for portability");
+# endif
+#elif @GNULIB_MDA_GETCWD@
+/* On native Windows, map 'getcwd' to '_getcwd', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getcwd always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getcwd
+# define getcwd _getcwd
+# endif
+/* Need to cast, because on mingw, the second parameter is either
+ 'int size' or 'size_t size'. */
+_GL_CXXALIAS_MDA_CAST (getcwd, char *, (char *buf, size_t size));
+# else
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+ WARNING! The NIS domain name is unrelated to the fully qualified host name
+ of the machine. It is also unrelated to email addresses.
+ WARNING! The NIS domain name is usually the empty string or "(none)" when
+ not using NIS.
+
+ Put up to LEN bytes of the NIS domain name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @REPLACE_GETDOMAINNAME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdomainname
+# define getdomainname rpl_getdomainname
+# endif
+_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
+# else
+# if !@HAVE_DECL_GETDOMAINNAME@
+_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (getdomainname);
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+ "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+ In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
+# if @REPLACE_GETDTABLESIZE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getdtablesize
+# define getdtablesize rpl_getdtablesize
+# endif
+_GL_FUNCDECL_RPL (getdtablesize, int, (void));
+_GL_CXXALIAS_RPL (getdtablesize, int, (void));
+# else
+# if !@HAVE_GETDTABLESIZE@
+_GL_FUNCDECL_SYS (getdtablesize, int, (void));
+# endif
+/* Need to cast, because on AIX, the parameter list is
+ (...). */
+_GL_CXXALIAS_SYS_CAST (getdtablesize, int, (void));
+# endif
+_GL_CXXALIASWARN (getdtablesize);
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+ "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETENTROPY@
+/* Fill a buffer with random bytes. */
+# if !@HAVE_GETENTROPY@
+_GL_FUNCDECL_SYS (getentropy, int, (void *buffer, size_t length));
+# endif
+_GL_CXXALIAS_SYS (getentropy, int, (void *buffer, size_t length));
+_GL_CXXALIASWARN (getentropy);
+#elif defined GNULIB_POSIXCHECK
+# undef getentropy
+# if HAVE_RAW_DECL_GETENTROPY
+_GL_WARN_ON_USE (getentropy, "getentropy is unportable - "
+ "use gnulib module getentropy for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+ It is unspecified whether the effective group id is in the list.
+ If N is 0, return the group count; otherwise, N describes how many
+ entries are available in GROUPS. Return -1 and set errno if N is
+ not 0 and not large enough. Fails with ENOSYS on some systems. */
+# if @REPLACE_GETGROUPS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getgroups
+# define getgroups rpl_getgroups
+# endif
+_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
+_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
+# else
+# if !@HAVE_GETGROUPS@
+_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIASWARN (getgroups);
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+ "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+ WARNING! The host name may or may not be fully qualified.
+
+ Put up to LEN bytes of the host name into NAME.
+ Null terminate it if the name is shorter than LEN.
+ If the host name is longer than LEN, set errno = EINVAL and return -1.
+ Return 0 if successful, otherwise set errno and return -1. */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef gethostname
+# define gethostname rpl_gethostname
+# endif
+_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
+# else
+# if !@HAVE_GETHOSTNAME@
+_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
+ parameter is
+ int len. */
+_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (gethostname);
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+ "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found. Upon error,
+ returns NULL with errno set.
+
+ See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if !@HAVE_DECL_GETLOGIN@
+_GL_FUNCDECL_SYS (getlogin, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getlogin, char *, (void));
+_GL_CXXALIASWARN (getlogin);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+ "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+ The array pointed to by NAME has room for SIZE bytes.
+
+ Returns 0 if successful. Upon error, an error number is returned, or -1 in
+ the case that the login name cannot be found but no specific error is
+ provided (this case is hopefully rare but is left open by the POSIX spec).
+
+ See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+ Most programs don't need to use this function, because the information is
+ available through environment variables:
+ ${LOGNAME-$USER} on Unix platforms,
+ $USERNAME on native Windows platforms.
+ */
+# if @REPLACE_GETLOGIN_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getlogin_r rpl_getlogin_r
+# endif
+_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
+# else
+# if !@HAVE_DECL_GETLOGIN_R@
+_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 10 systems, the second argument is
+ int size. */
+_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
+# endif
+_GL_CXXALIASWARN (getlogin_r);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+ "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize rpl_getpagesize
+# endif
+_GL_FUNCDECL_RPL (getpagesize, int, (void));
+_GL_CXXALIAS_RPL (getpagesize, int, (void));
+# else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+ the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used. */
+# if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+# endif
+# if !@HAVE_GETPAGESIZE@
+# if !defined getpagesize
+/* This is for POSIX systems. */
+# if !defined _gl_getpagesize && defined _SC_PAGESIZE
+# if ! (defined __VMS && __VMS_VER < 70000000)
+# define _gl_getpagesize() sysconf (_SC_PAGESIZE)
+# endif
+# endif
+/* This is for older VMS. */
+# if !defined _gl_getpagesize && defined __VMS
+# ifdef __ALPHA
+# define _gl_getpagesize() 8192
+# else
+# define _gl_getpagesize() 512
+# endif
+# endif
+/* This is for BeOS. */
+# if !defined _gl_getpagesize && @HAVE_OS_H@
+# include <OS.h>
+# if defined B_PAGE_SIZE
+# define _gl_getpagesize() B_PAGE_SIZE
+# endif
+# endif
+/* This is for AmigaOS4.0. */
+# if !defined _gl_getpagesize && defined __amigaos4__
+# define _gl_getpagesize() 2048
+# endif
+/* This is for older Unix systems. */
+# if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define _gl_getpagesize() EXEC_PAGESIZE
+# else
+# ifdef NBPG
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif
+# define _gl_getpagesize() (NBPG * CLSIZE)
+# else
+# ifdef NBPC
+# define _gl_getpagesize() NBPC
+# endif
+# endif
+# endif
+# endif
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define getpagesize() _gl_getpagesize ()
+# else
+# if !GNULIB_defined_getpagesize_function
+_GL_UNISTD_INLINE int
+getpagesize ()
+{
+ return _gl_getpagesize ();
+}
+# define GNULIB_defined_getpagesize_function 1
+# endif
+# endif
+# endif
+# endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t. */
+_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
+# endif
+# if @HAVE_DECL_GETPAGESIZE@
+_GL_CXXALIASWARN (getpagesize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+ "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPASS@
+/* Function getpass() from module 'getpass':
+ Read a password from /dev/tty or stdin.
+ Function getpass() from module 'getpass-gnu':
+ Read a password of arbitrary length from /dev/tty or stdin. */
+# if @REPLACE_GETPASS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpass
+# define getpass rpl_getpass
+# endif
+_GL_FUNCDECL_RPL (getpass, char *, (const char *prompt)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getpass, char *, (const char *prompt));
+# else
+# if !@HAVE_GETPASS@
+_GL_FUNCDECL_SYS (getpass, char *, (const char *prompt)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getpass, char *, (const char *prompt));
+# endif
+_GL_CXXALIASWARN (getpass);
+#elif defined GNULIB_POSIXCHECK
+# undef getpass
+# if HAVE_RAW_DECL_GETPASS
+_GL_WARN_ON_USE (getpass, "getpass is unportable - "
+ "use gnulib module getpass or getpass-gnu for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_GETPID@
+/* On native Windows, map 'getpid' to '_getpid', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::getpid always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef getpid
+# define getpid _getpid
+# endif
+_GL_CXXALIAS_MDA (getpid, int, (void));
+# else
+_GL_CXXALIAS_SYS (getpid, pid_t, (void));
+# endif
+_GL_CXXALIASWARN (getpid);
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+ the list has been reached. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (getusershell, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getusershell, char *, (void));
+_GL_CXXALIASWARN (getusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Rewind to pointer that is advanced at each getusershell() call. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (setusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (setusershell, void, (void));
+_GL_CXXALIASWARN (setusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Free the pointer that is advanced at each getusershell() call and
+ associated resources. */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (endusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (endusershell, void, (void));
+_GL_CXXALIASWARN (endusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+ "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GROUP_MEMBER@
+/* Determine whether group id is in calling user's group list. */
+# if !@HAVE_GROUP_MEMBER@
+_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
+# endif
+_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
+_GL_CXXALIASWARN (group_member);
+#elif defined GNULIB_POSIXCHECK
+# undef group_member
+# if HAVE_RAW_DECL_GROUP_MEMBER
+_GL_WARN_ON_USE (group_member, "group_member is unportable - "
+ "use gnulib module group-member for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ISATTY@
+# if @REPLACE_ISATTY@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty rpl_isatty
+# endif
+_GL_FUNCDECL_RPL (isatty, int, (int fd));
+_GL_CXXALIAS_RPL (isatty, int, (int fd));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty _isatty
+# endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#elif defined GNULIB_POSIXCHECK
+# undef isatty
+# if HAVE_RAW_DECL_ISATTY
+_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
+ "use gnulib module isatty for portability");
+# endif
+#elif @GNULIB_MDA_ISATTY@
+/* On native Windows, map 'isatty' to '_isatty', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::isatty always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef isatty
+# define isatty _isatty
+# endif
+_GL_CXXALIAS_MDA (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#endif
+
+
+#if @GNULIB_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+ to GID (if GID is not -1). Do not follow symbolic links.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>. */
+# if @REPLACE_LCHOWN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lchown
+# define lchown rpl_lchown
+# endif
+_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
+# else
+# if !@HAVE_LCHOWN@
+_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
+# endif
+_GL_CXXALIASWARN (lchown);
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+ "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+/* Create a new hard link for an existing file.
+ Return 0 if successful, otherwise -1 and errno set.
+ See POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>. */
+# if @REPLACE_LINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define link rpl_link
+# endif
+_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
+# else
+# if !@HAVE_LINK@
+_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
+# endif
+_GL_CXXALIASWARN (link);
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+ "use gnulib module link for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINKAT@
+/* Create a new hard link for an existing file, relative to two
+ directories. FLAG controls whether symlinks are followed.
+ Return 0 if successful, otherwise -1 and errno set. */
+# if @REPLACE_LINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef linkat
+# define linkat rpl_linkat
+# endif
+_GL_FUNCDECL_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# else
+# if !@HAVE_LINKAT@
+_GL_FUNCDECL_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag)
+ _GL_ARG_NONNULL ((2, 4)));
+# endif
+_GL_CXXALIAS_SYS (linkat, int,
+ (int fd1, const char *path1, int fd2, const char *path2,
+ int flag));
+# endif
+_GL_CXXALIASWARN (linkat);
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+ "use gnulib module linkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+ Return the new offset if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>. */
+# if @REPLACE_LSEEK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define lseek rpl_lseek
+# endif
+_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lseek
+# define lseek _lseek
+# endif
+_GL_CXXALIAS_MDA (lseek, off_t, (int fd, off_t offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+ "systems - use gnulib module lseek for portability");
+# endif
+#elif @GNULIB_MDA_LSEEK@
+/* On native Windows, map 'lseek' to '_lseek', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::lseek always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef lseek
+# define lseek _lseek
+# endif
+_GL_CXXALIAS_MDA (lseek, long, (int fd, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#endif
+
+
+#if @GNULIB_PIPE@
+/* Create a pipe, defaulting to O_BINARY mode.
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure. */
+# if !@HAVE_PIPE@
+_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
+_GL_CXXALIASWARN (pipe);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe
+# if HAVE_RAW_DECL_PIPE
+_GL_WARN_ON_USE (pipe, "pipe is unportable - "
+ "use gnulib module pipe-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+ pipe and the write-end of the pipe.
+ The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+ and O_TEXT, O_BINARY (defined in "binary-io.h").
+ Store the read-end as fd[0] and the write-end as fd[1].
+ Return 0 upon success, or -1 with errno set upon failure.
+ See also the Linux man page at
+ <https://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
+# if @HAVE_PIPE2@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define pipe2 rpl_pipe2
+# endif
+_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
+# else
+_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
+# endif
+_GL_CXXALIASWARN (pipe2);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+ "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+ Return the number of bytes placed into BUF if successful, otherwise
+ set errno and return -1. 0 indicates EOF.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>. */
+# if @REPLACE_PREAD@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pread
+# define pread rpl_pread
+# endif
+_GL_FUNCDECL_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PREAD@
+_GL_FUNCDECL_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pread, ssize_t,
+ (int fd, void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pread);
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+ "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PWRITE@
+/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
+ Return the number of bytes written if successful, otherwise
+ set errno and return -1. 0 indicates nothing written. See the
+ POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>. */
+# if @REPLACE_PWRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef pwrite
+# define pwrite rpl_pwrite
+# endif
+_GL_FUNCDECL_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# else
+# if !@HAVE_PWRITE@
+_GL_FUNCDECL_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (pwrite, ssize_t,
+ (int fd, const void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pwrite);
+#elif defined GNULIB_POSIXCHECK
+# undef pwrite
+# if HAVE_RAW_DECL_PWRITE
+_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
+ "use gnulib module pwrite for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READ@
+/* Read up to COUNT bytes from file descriptor FD into the buffer starting
+ at BUF. See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>. */
+# if @REPLACE_READ@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read rpl_read
+# endif
+_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read _read
+# endif
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, size_t count));
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#elif @GNULIB_MDA_READ@
+/* On native Windows, map 'read' to '_read', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::read always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef read
+# define read _read
+# endif
+# ifdef __MINGW32__
+_GL_CXXALIAS_MDA (read, int, (int fd, void *buf, unsigned int count));
+# else
+_GL_CXXALIAS_MDA (read, ssize_t, (int fd, void *buf, unsigned int count));
+# endif
+# else
+_GL_CXXALIAS_SYS (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#endif
+
+
+#if @GNULIB_READLINK@
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+ bytes of it into BUF. Return the number of bytes placed into BUF if
+ successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
+# if @REPLACE_READLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define readlink rpl_readlink
+# endif
+_GL_FUNCDECL_RPL (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize));
+# else
+# if !@HAVE_READLINK@
+_GL_FUNCDECL_SYS (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (readlink, ssize_t,
+ (const char *restrict file,
+ char *restrict buf, size_t bufsize));
+# endif
+_GL_CXXALIASWARN (readlink);
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+ "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if @REPLACE_READLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define readlinkat rpl_readlinkat
+# endif
+_GL_FUNCDECL_RPL (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len));
+# else
+# if !@HAVE_READLINKAT@
+_GL_FUNCDECL_SYS (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len)
+ _GL_ARG_NONNULL ((2, 3)));
+# endif
+_GL_CXXALIAS_SYS (readlinkat, ssize_t,
+ (int fd, char const *restrict file,
+ char *restrict buf, size_t len));
+# endif
+_GL_CXXALIASWARN (readlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+ "use gnulib module readlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+/* Remove the directory DIR. */
+# if @REPLACE_RMDIR@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define rmdir rpl_rmdir
+# endif
+_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rmdir
+# define rmdir _rmdir
+# endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+ "use gnulib module rmdir for portability");
+# endif
+#elif @GNULIB_MDA_RMDIR@
+/* On native Windows, map 'rmdir' to '_rmdir', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::rmdir always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef rmdir
+# define rmdir _rmdir
+# endif
+_GL_CXXALIAS_MDA (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#endif
+
+
+#if @GNULIB_SETHOSTNAME@
+/* Set the host name of the machine.
+ The host name may or may not be fully qualified.
+
+ Put LEN bytes of NAME into the host name.
+ Return 0 if successful, otherwise, set errno and return -1.
+
+ Platforms with no ability to set the hostname return -1 and set
+ errno = ENOSYS. */
+# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
+_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
+ _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5
+ and FreeBSD 6.4 the second parameter is int. On Solaris 11
+ 2011-10, the first parameter is not const. */
+_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
+_GL_CXXALIASWARN (sethostname);
+#elif defined GNULIB_POSIXCHECK
+# undef sethostname
+# if HAVE_RAW_DECL_SETHOSTNAME
+_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
+ "use gnulib module sethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+/* Pause the execution of the current thread for N seconds.
+ Returns the number of seconds left to sleep.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>. */
+# if @REPLACE_SLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef sleep
+# define sleep rpl_sleep
+# endif
+_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
+_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
+# else
+# if !@HAVE_SLEEP@
+_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIASWARN (sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+ "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_MDA_SWAB@
+/* On native Windows, map 'swab' to '_swab', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::creat always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef swab
+# define swab _swab
+# endif
+_GL_CXXALIAS_MDA (swab, void, (char *from, char *to, int n));
+# else
+_GL_CXXALIAS_SYS (swab, void, (const void *from, void *to, ssize_t n));
+# endif
+_GL_CXXALIASWARN (swab);
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef symlink
+# define symlink rpl_symlink
+# endif
+_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
+# else
+# if !@HAVE_SYMLINK@
+_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
+ _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
+# endif
+_GL_CXXALIASWARN (symlink);
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+ "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if @REPLACE_SYMLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef symlinkat
+# define symlinkat rpl_symlinkat
+# endif
+_GL_FUNCDECL_RPL (symlinkat, int,
+ (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (symlinkat, int,
+ (char const *contents, int fd, char const *file));
+# else
+# if !@HAVE_SYMLINKAT@
+_GL_FUNCDECL_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file)
+ _GL_ARG_NONNULL ((1, 3)));
+# endif
+_GL_CXXALIAS_SYS (symlinkat, int,
+ (char const *contents, int fd, char const *file));
+# endif
+_GL_CXXALIASWARN (symlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+ "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCATE@
+/* Change the size of the file designated by FILENAME to become equal to LENGTH.
+ Return 0 if successful, otherwise -1 and errno set.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html>. */
+# if @REPLACE_TRUNCATE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef truncate
+# define truncate rpl_truncate
+# endif
+_GL_FUNCDECL_RPL (truncate, int, (const char *filename, off_t length)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (truncate, int, (const char *filename, off_t length));
+# else
+# if !@HAVE_DECL_TRUNCATE@
+_GL_FUNCDECL_SYS (truncate, int, (const char *filename, off_t length)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (truncate, int, (const char *filename, off_t length));
+# endif
+_GL_CXXALIASWARN (truncate);
+#elif defined GNULIB_POSIXCHECK
+# undef truncate
+# if HAVE_RAW_DECL_TRUNCATE
+_GL_WARN_ON_USE (truncate, "truncate is unportable - "
+ "use gnulib module truncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TTYNAME_R@
+/* Store at most BUFLEN characters of the pathname of the terminal FD is
+ open on in BUF. Return 0 on success, otherwise an error number. */
+# if @REPLACE_TTYNAME_R@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef ttyname_r
+# define ttyname_r rpl_ttyname_r
+# endif
+_GL_FUNCDECL_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# else
+# if !@HAVE_DECL_TTYNAME_R@
+_GL_FUNCDECL_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (ttyname_r, int,
+ (int fd, char *buf, size_t buflen));
+# endif
+_GL_CXXALIASWARN (ttyname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ttyname_r
+# if HAVE_RAW_DECL_TTYNAME_R
+_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
+ "use gnulib module ttyname_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink rpl_unlink
+# endif
+_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink _unlink
+# endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+ "use gnulib module unlink for portability");
+# endif
+#elif @GNULIB_MDA_UNLINK@
+/* On native Windows, map 'unlink' to '_unlink', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::unlink always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlink
+# define unlink _unlink
+# endif
+_GL_CXXALIAS_MDA (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef unlinkat
+# define unlinkat rpl_unlinkat
+# endif
+_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
+# else
+# if !@HAVE_UNLINKAT@
+_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
+# endif
+_GL_CXXALIASWARN (unlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+ "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+ Returns 0 on completion, or -1 on range error.
+ See the POSIX:2001 specification
+ <https://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html>. */
+# if @REPLACE_USLEEP@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef usleep
+# define usleep rpl_usleep
+# endif
+_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
+_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
+# else
+# if !@HAVE_USLEEP@
+_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
+# endif
+/* Need to cast, because on Haiku, the first parameter is
+ unsigned int n. */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIASWARN (usleep);
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+ "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+ See the POSIX:2008 specification
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>. */
+# if @REPLACE_WRITE@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write rpl_write
+# endif
+_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write _write
+# endif
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, size_t count));
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#elif @GNULIB_MDA_WRITE@
+/* On native Windows, map 'write' to '_write', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::write always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef write
+# define write _write
+# endif
+# ifdef __MINGW32__
+_GL_CXXALIAS_MDA (write, int, (int fd, const void *buf, unsigned int count));
+# else
+_GL_CXXALIAS_MDA (write, ssize_t, (int fd, const void *buf, unsigned int count));
+# endif
+# else
+_GL_CXXALIAS_SYS (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
+#endif /* _GL_INCLUDING_UNISTD_H */
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/lib/unistr.in.h b/lib/unistr.in.h
new file mode 100644
index 0000000..88cd815
--- /dev/null
+++ b/lib/unistr.in.h
@@ -0,0 +1,749 @@
+/* Elementary Unicode string functions.
+ Copyright (C) 2001-2002, 2005-2020 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/>. */
+
+#ifndef _UNISTR_H
+#define _UNISTR_H
+
+#include "unitypes.h"
+
+/* Get common macros for C. */
+#include "unused-parameter.h"
+
+/* Get bool. */
+#include <stdbool.h>
+
+/* Get size_t, ptrdiff_t. */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Conventions:
+
+ All functions prefixed with u8_ operate on UTF-8 encoded strings.
+ Their unit is an uint8_t (1 byte).
+
+ All functions prefixed with u16_ operate on UTF-16 encoded strings.
+ Their unit is an uint16_t (a 2-byte word).
+
+ All functions prefixed with u32_ operate on UCS-4 encoded strings.
+ Their unit is an uint32_t (a 4-byte word).
+
+ All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
+ n units.
+
+ All arguments starting with "str" and the arguments of functions starting
+ with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
+ which terminates at the first NUL unit. This termination unit is
+ considered part of the string for all memory allocation purposes, but
+ is not considered part of the string for all other logical purposes.
+
+ Functions returning a string result take a (resultbuf, lengthp) argument
+ pair. If resultbuf is not NULL and the result fits into *lengthp units,
+ it is put in resultbuf, and resultbuf is returned. Otherwise, a freshly
+ allocated string is returned. In both cases, *lengthp is set to the
+ length (number of units) of the returned string. In case of error,
+ NULL is returned and errno is set. */
+
+
+/* Elementary string checks. */
+
+/* Check whether an UTF-8 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint8_t *
+ u8_check (const uint8_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UTF-16 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint16_t *
+ u16_check (const uint16_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Check whether an UCS-4 string is well-formed.
+ Return NULL if valid, or a pointer to the first invalid unit otherwise. */
+extern const uint32_t *
+ u32_check (const uint32_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+
+/* Elementary string conversions. */
+
+/* Convert an UTF-8 string to an UTF-16 string. */
+extern uint16_t *
+ u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-8 string to an UCS-4 string. */
+extern uint32_t *
+ u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UTF-8 string. */
+extern uint8_t *
+ u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UTF-16 string to an UCS-4 string. */
+extern uint32_t *
+ u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-8 string. */
+extern uint8_t *
+ u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
+ size_t *lengthp);
+
+/* Convert an UCS-4 string to an UTF-16 string. */
+extern uint16_t *
+ u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
+ size_t *lengthp);
+
+
+/* Elementary string functions. */
+
+/* Return the length (number of units) of the first character in S, which is
+ no longer than N. Return 0 if it is the NUL character. Return -1 upon
+ failure. */
+/* Similar to mblen(), except that s must not be NULL. */
+extern int
+ u8_mblen (const uint8_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_mblen (const uint16_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_mblen (const uint32_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
+ and an appropriate number of units is returned.
+ The number of available units, N, must be > 0. */
+/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
+ and the NUL character is not treated specially. */
+/* The variants with _unsafe suffix are for backward compatibility with
+ libunistring versions < 0.9.7. */
+
+#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_unsafe_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc_unsafe (ucs4_t *puc,
+ const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
+# else
+extern int
+ u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
+static inline int
+u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u8_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
+# else
+extern int
+ u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
+static inline int
+u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
+{
+ uint16_t c = *s;
+
+ if (c < 0xd800 || c >= 0xe000)
+ {
+ *puc = c;
+ return 1;
+ }
+ else
+ return u16_mbtouc_aux (puc, s, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
+# else
+static inline int
+u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
+{
+ uint32_t c = *s;
+
+ if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
+ *puc = c;
+ else
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+# endif
+#endif
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
+ and -1 is returned for an invalid sequence of units, -2 is returned for an
+ incomplete sequence of units.
+ The number of available units, N, must be > 0. */
+/* Similar to u*_mbtouc(), except that the return value gives more details
+ about the failure, similar to mbrtowc(). */
+
+#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
+#endif
+
+#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
+extern int
+ u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
+#endif
+
+/* Put the multibyte character represented by UC in S, returning its
+ length. Return -1 upon failure, -2 if the number of available units, N,
+ is too small. The latter case cannot occur if N >= 6/2/1, respectively. */
+/* Similar to wctomb(), except that s must not be NULL, and the argument n
+ must be specified. */
+
+#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */
+extern int
+ u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+ u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+ if (uc < 0x80 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u8_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
+/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */
+extern int
+ u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# if !HAVE_INLINE
+extern int
+ u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
+{
+ if (uc < 0xd800 && n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ else
+ return u16_uctomb_aux (s, uc, n);
+}
+# endif
+#endif
+
+#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
+# if !HAVE_INLINE
+extern int
+ u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
+# else
+static inline int
+u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
+{
+ if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
+ {
+ if (n > 0)
+ {
+ *s = uc;
+ return 1;
+ }
+ else
+ return -2;
+ }
+ else
+ return -1;
+}
+# endif
+#endif
+
+/* Copy N units from SRC to DEST. */
+/* Similar to memcpy(). */
+extern uint8_t *
+ u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy N units from SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+/* Similar to memmove(). */
+extern uint8_t *
+ u8_move (uint8_t *dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_move (uint16_t *dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_move (uint32_t *dest, const uint32_t *src, size_t n);
+
+/* Set the first N characters of S to UC. UC should be a character that
+ occupies only 1 unit. */
+/* Similar to memset(). */
+extern uint8_t *
+ u8_set (uint8_t *s, ucs4_t uc, size_t n);
+extern uint16_t *
+ u16_set (uint16_t *s, ucs4_t uc, size_t n);
+extern uint32_t *
+ u32_set (uint32_t *s, ucs4_t uc, size_t n);
+
+/* Compare S1 and S2, each of length N. */
+/* Similar to memcmp(). */
+extern int
+ u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2. */
+/* Similar to the gnulib function memcmp2(). */
+extern int
+ u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
+ _UC_ATTRIBUTE_PURE;
+
+/* Search the string at S for UC. */
+/* Similar to memchr(). */
+extern uint8_t *
+ u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+ u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+ u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+
+/* Count the number of Unicode characters in the N units from S. */
+/* Similar to mbsnlen(). */
+extern size_t
+ u8_mbsnlen (const uint8_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u16_mbsnlen (const uint16_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u32_mbsnlen (const uint32_t *s, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Elementary string functions with memory allocation. */
+
+/* Make a freshly allocated copy of S, of length N. */
+extern uint8_t *
+ u8_cpy_alloc (const uint8_t *s, size_t n);
+extern uint16_t *
+ u16_cpy_alloc (const uint16_t *s, size_t n);
+extern uint32_t *
+ u32_cpy_alloc (const uint32_t *s, size_t n);
+
+/* Elementary string functions on NUL terminated strings. */
+
+/* Return the length (number of units) of the first character in S.
+ Return 0 if it is the NUL character. Return -1 upon failure. */
+extern int
+ u8_strmblen (const uint8_t *s)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_strmblen (const uint16_t *s)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_strmblen (const uint32_t *s)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the length (number of units) of the first character in S, putting
+ its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL
+ character. Return -1 upon failure. */
+extern int
+ u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
+extern int
+ u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
+extern int
+ u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
+
+/* Forward iteration step. Advances the pointer past the next character,
+ or returns NULL if the end of the string has been reached. Puts the
+ character's 'ucs4_t' representation in *PUC. */
+extern const uint8_t *
+ u8_next (ucs4_t *puc, const uint8_t *s);
+extern const uint16_t *
+ u16_next (ucs4_t *puc, const uint16_t *s);
+extern const uint32_t *
+ u32_next (ucs4_t *puc, const uint32_t *s);
+
+/* Backward iteration step. Advances the pointer to point to the previous
+ character, or returns NULL if the beginning of the string had been reached.
+ Puts the character's 'ucs4_t' representation in *PUC. */
+extern const uint8_t *
+ u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
+extern const uint16_t *
+ u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
+extern const uint32_t *
+ u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
+
+/* Return the number of units in S. */
+/* Similar to strlen(), wcslen(). */
+extern size_t
+ u8_strlen (const uint8_t *s)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u16_strlen (const uint16_t *s)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u32_strlen (const uint32_t *s)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the number of units in S, but at most MAXLEN. */
+/* Similar to strnlen(), wcsnlen(). */
+extern size_t
+ u8_strnlen (const uint8_t *s, size_t maxlen)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u16_strnlen (const uint16_t *s, size_t maxlen)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u32_strnlen (const uint32_t *s, size_t maxlen)
+ _UC_ATTRIBUTE_PURE;
+
+/* Copy SRC to DEST. */
+/* Similar to strcpy(), wcscpy(). */
+extern uint8_t *
+ u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */
+/* Similar to stpcpy(). */
+extern uint8_t *
+ u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+ u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+ u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Copy no more than N units of SRC to DEST. */
+/* Similar to strncpy(), wcsncpy(). */
+extern uint8_t *
+ u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Copy no more than N units of SRC to DEST. Return a pointer past the last
+ non-NUL unit written into DEST. */
+/* Similar to stpncpy(). */
+extern uint8_t *
+ u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Append SRC onto DEST. */
+/* Similar to strcat(), wcscat(). */
+extern uint8_t *
+ u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
+extern uint16_t *
+ u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
+extern uint32_t *
+ u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
+
+/* Append no more than N units of SRC onto DEST. */
+/* Similar to strncat(), wcsncat(). */
+extern uint8_t *
+ u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
+extern uint16_t *
+ u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
+extern uint32_t *
+ u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
+
+/* Compare S1 and S2. */
+/* Similar to strcmp(), wcscmp(). */
+#ifdef __sun
+/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */
+extern int
+ u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
+ _UC_ATTRIBUTE_PURE;
+# define u8_strcmp u8_strcmp_gnu
+#else
+extern int
+ u8_strcmp (const uint8_t *s1, const uint8_t *s2)
+ _UC_ATTRIBUTE_PURE;
+#endif
+extern int
+ u16_strcmp (const uint16_t *s1, const uint16_t *s2)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_strcmp (const uint32_t *s1, const uint32_t *s2)
+ _UC_ATTRIBUTE_PURE;
+
+/* Compare S1 and S2 using the collation rules of the current locale.
+ Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
+ Upon failure, set errno and return any value. */
+/* Similar to strcoll(), wcscoll(). */
+extern int
+ u8_strcoll (const uint8_t *s1, const uint8_t *s2);
+extern int
+ u16_strcoll (const uint16_t *s1, const uint16_t *s2);
+extern int
+ u32_strcoll (const uint32_t *s1, const uint32_t *s2);
+
+/* Compare no more than N units of S1 and S2. */
+/* Similar to strncmp(), wcsncmp(). */
+extern int
+ u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
+ _UC_ATTRIBUTE_PURE;
+
+/* Duplicate S, returning an identical malloc'd string. */
+/* Similar to strdup(), wcsdup(). */
+extern uint8_t *
+ u8_strdup (const uint8_t *s);
+extern uint16_t *
+ u16_strdup (const uint16_t *s);
+extern uint32_t *
+ u32_strdup (const uint32_t *s);
+
+/* Find the first occurrence of UC in STR. */
+/* Similar to strchr(), wcschr(). */
+extern uint8_t *
+ u8_strchr (const uint8_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+ u16_strchr (const uint16_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+ u32_strchr (const uint32_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+
+/* Find the last occurrence of UC in STR. */
+/* Similar to strrchr(), wcsrchr(). */
+extern uint8_t *
+ u8_strrchr (const uint8_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+ u16_strrchr (const uint16_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+ u32_strrchr (const uint32_t *str, ucs4_t uc)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters not in REJECT. */
+/* Similar to strcspn(), wcscspn(). */
+extern size_t
+ u8_strcspn (const uint8_t *str, const uint8_t *reject)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u16_strcspn (const uint16_t *str, const uint16_t *reject)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u32_strcspn (const uint32_t *str, const uint32_t *reject)
+ _UC_ATTRIBUTE_PURE;
+
+/* Return the length of the initial segment of STR which consists entirely
+ of Unicode characters in ACCEPT. */
+/* Similar to strspn(), wcsspn(). */
+extern size_t
+ u8_strspn (const uint8_t *str, const uint8_t *accept)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u16_strspn (const uint16_t *str, const uint16_t *accept)
+ _UC_ATTRIBUTE_PURE;
+extern size_t
+ u32_strspn (const uint32_t *str, const uint32_t *accept)
+ _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence in STR of any character in ACCEPT. */
+/* Similar to strpbrk(), wcspbrk(). */
+extern uint8_t *
+ u8_strpbrk (const uint8_t *str, const uint8_t *accept)
+ _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+ u16_strpbrk (const uint16_t *str, const uint16_t *accept)
+ _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+ u32_strpbrk (const uint32_t *str, const uint32_t *accept)
+ _UC_ATTRIBUTE_PURE;
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+/* Similar to strstr(), wcsstr(). */
+extern uint8_t *
+ u8_strstr (const uint8_t *haystack, const uint8_t *needle)
+ _UC_ATTRIBUTE_PURE;
+extern uint16_t *
+ u16_strstr (const uint16_t *haystack, const uint16_t *needle)
+ _UC_ATTRIBUTE_PURE;
+extern uint32_t *
+ u32_strstr (const uint32_t *haystack, const uint32_t *needle)
+ _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR starts with PREFIX. */
+extern bool
+ u8_startswith (const uint8_t *str, const uint8_t *prefix)
+ _UC_ATTRIBUTE_PURE;
+extern bool
+ u16_startswith (const uint16_t *str, const uint16_t *prefix)
+ _UC_ATTRIBUTE_PURE;
+extern bool
+ u32_startswith (const uint32_t *str, const uint32_t *prefix)
+ _UC_ATTRIBUTE_PURE;
+
+/* Test whether STR ends with SUFFIX. */
+extern bool
+ u8_endswith (const uint8_t *str, const uint8_t *suffix)
+ _UC_ATTRIBUTE_PURE;
+extern bool
+ u16_endswith (const uint16_t *str, const uint16_t *suffix)
+ _UC_ATTRIBUTE_PURE;
+extern bool
+ u32_endswith (const uint32_t *str, const uint32_t *suffix)
+ _UC_ATTRIBUTE_PURE;
+
+/* Divide STR into tokens separated by characters in DELIM.
+ This interface is actually more similar to wcstok than to strtok. */
+/* Similar to strtok_r(), wcstok(). */
+extern uint8_t *
+ u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
+ uint8_t **ptr);
+extern uint16_t *
+ u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
+ uint16_t **ptr);
+extern uint32_t *
+ u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
+ uint32_t **ptr);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNISTR_H */
diff --git a/lib/unistr/u-cpy.h b/lib/unistr/u-cpy.h
new file mode 100644
index 0000000..12b48cd
--- /dev/null
+++ b/lib/unistr/u-cpy.h
@@ -0,0 +1,33 @@
+/* Copy piece of UTF-8/UTF-16/UTF-32 string.
+ Copyright (C) 1999, 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <string.h>
+
+UNIT *
+FUNC (UNIT *dest, const UNIT *src, size_t n)
+{
+#if 0
+ UNIT *destptr = dest;
+
+ for (; n > 0; n--)
+ *destptr++ = *src++;
+#else
+ if (n > 0)
+ memcpy ((char *) dest, (const char *) src, n * sizeof (UNIT));
+#endif
+ return dest;
+}
diff --git a/lib/unistr/u8-cpy.c b/lib/unistr/u8-cpy.c
new file mode 100644
index 0000000..620993a
--- /dev/null
+++ b/lib/unistr/u8-cpy.c
@@ -0,0 +1,25 @@
+/* Copy piece of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#define FUNC u8_cpy
+#define UNIT uint8_t
+#include "u-cpy.h"
diff --git a/lib/unistr/u8-mbtouc-unsafe-aux.c b/lib/unistr/u8-mbtouc-unsafe-aux.c
new file mode 100644
index 0000000..0f45a13
--- /dev/null
+++ b/lib/unistr/u8-mbtouc-unsafe-aux.c
@@ -0,0 +1,139 @@
+/* Conversion UTF-8 to UCS-4.
+ Copyright (C) 2001-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#if defined IN_LIBUNISTRING || HAVE_INLINE
+
+int
+u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/lib/unistr/u8-mbtouc-unsafe.c b/lib/unistr/u8-mbtouc-unsafe.c
new file mode 100644
index 0000000..9ddcdde
--- /dev/null
+++ b/lib/unistr/u8-mbtouc-unsafe.c
@@ -0,0 +1,150 @@
+/* Look at first character in UTF-8 string.
+ Copyright (C) 1999-2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2001.
+
+ 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/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_mbtouc_unsafe as 'extern', not
+ 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#if !HAVE_INLINE
+
+int
+u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
+{
+ uint8_t c = *s;
+
+ if (c < 0x80)
+ {
+ *puc = c;
+ return 1;
+ }
+ else if (c >= 0xc2)
+ {
+ if (c < 0xe0)
+ {
+ if (n >= 2)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ *puc = ((unsigned int) (c & 0x1f) << 6)
+ | (unsigned int) (s[1] ^ 0x80);
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ return 1;
+ }
+ }
+ else if (c < 0xf0)
+ {
+ if (n >= 3)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xe1 || s[1] >= 0xa0)
+ && (c != 0xed || s[1] < 0xa0))
+ {
+ *puc = ((unsigned int) (c & 0x0f) << 12)
+ | ((unsigned int) (s[1] ^ 0x80) << 6)
+ | (unsigned int) (s[2] ^ 0x80);
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else
+ return 2;
+ }
+ }
+ else if (c < 0xf8)
+ {
+ if (n >= 4)
+ {
+ if ((s[1] ^ 0x80) < 0x40)
+ {
+ if ((s[2] ^ 0x80) < 0x40)
+ {
+ if ((s[3] ^ 0x80) < 0x40)
+ {
+ if ((c >= 0xf1 || s[1] >= 0x90)
+ && (c < 0xf4 || (c == 0xf4 && s[1] < 0x90))
+ )
+ {
+ *puc = ((unsigned int) (c & 0x07) << 18)
+ | ((unsigned int) (s[1] ^ 0x80) << 12)
+ | ((unsigned int) (s[2] ^ 0x80) << 6)
+ | (unsigned int) (s[3] ^ 0x80);
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 4;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 3;
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 2;
+ }
+ /* invalid multibyte character */
+ }
+ else
+ {
+ /* incomplete multibyte character */
+ *puc = 0xfffd;
+ if (n == 1 || (s[1] ^ 0x80) >= 0x40)
+ return 1;
+ else if (n == 2 || (s[2] ^ 0x80) >= 0x40)
+ return 2;
+ else
+ return 3;
+ }
+ }
+ }
+ /* invalid multibyte character */
+ *puc = 0xfffd;
+ return 1;
+}
+
+#endif
diff --git a/lib/unistr/u8-strlen.c b/lib/unistr/u8-strlen.c
new file mode 100644
index 0000000..58c1311
--- /dev/null
+++ b/lib/unistr/u8-strlen.c
@@ -0,0 +1,29 @@
+/* Determine length of UTF-8 string.
+ Copyright (C) 2002, 2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include <string.h>
+
+size_t
+u8_strlen (const uint8_t *s)
+{
+ return strlen ((const char *) s);
+}
diff --git a/lib/unistr/u8-uctomb-aux.c b/lib/unistr/u8-uctomb-aux.c
new file mode 100644
index 0000000..15e9c90
--- /dev/null
+++ b/lib/unistr/u8-uctomb-aux.c
@@ -0,0 +1,60 @@
+/* Conversion UCS-4 to UTF-8.
+ Copyright (C) 2002, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "unistr.h"
+
+#include "attribute.h"
+
+int
+u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+ int count;
+
+ if (uc < 0x80)
+ /* The case n >= 1 is already handled by the caller. */
+ return -2;
+ else if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+ else if (uc < 0x110000)
+ count = 4;
+ else
+ return -1;
+
+ if (n < count)
+ return -2;
+
+ switch (count) /* note: code falls through cases! */
+ {
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ FALLTHROUGH;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ FALLTHROUGH;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+}
diff --git a/lib/unistr/u8-uctomb.c b/lib/unistr/u8-uctomb.c
new file mode 100644
index 0000000..e356269
--- /dev/null
+++ b/lib/unistr/u8-uctomb.c
@@ -0,0 +1,79 @@
+/* Store a character in UTF-8 string.
+ Copyright (C) 2002, 2005-2006, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+#if defined IN_LIBUNISTRING
+/* Tell unistr.h to declare u8_uctomb as 'extern', not 'static inline'. */
+# include "unistring-notinline.h"
+#endif
+
+/* Specification. */
+#include "unistr.h"
+
+#include "attribute.h"
+
+#if !HAVE_INLINE
+
+int
+u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
+{
+ if (uc < 0x80)
+ {
+ if (n > 0)
+ {
+ s[0] = uc;
+ return 1;
+ }
+ /* else return -2, below. */
+ }
+ else
+ {
+ int count;
+
+ if (uc < 0x800)
+ count = 2;
+ else if (uc < 0x10000)
+ {
+ if (uc < 0xd800 || uc >= 0xe000)
+ count = 3;
+ else
+ return -1;
+ }
+ else if (uc < 0x110000)
+ count = 4;
+ else
+ return -1;
+
+ if (n >= count)
+ {
+ switch (count) /* note: code falls through cases! */
+ {
+ case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
+ FALLTHROUGH;
+ case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
+ FALLTHROUGH;
+ case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
+ /*case 1:*/ s[0] = uc;
+ }
+ return count;
+ }
+ }
+ return -2;
+}
+
+#endif
diff --git a/lib/unitypes.in.h b/lib/unitypes.in.h
new file mode 100644
index 0000000..d482131
--- /dev/null
+++ b/lib/unitypes.in.h
@@ -0,0 +1,61 @@
+/* Elementary types and macros for the GNU UniString library.
+ Copyright (C) 2002, 2005-2006, 2009-2020 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/>. */
+
+#ifndef _UNITYPES_H
+#define _UNITYPES_H
+
+/* Get uint8_t, uint16_t, uint32_t. */
+#include <stdint.h>
+
+/* Type representing a Unicode character. */
+typedef uint32_t ucs4_t;
+
+/* Attribute of a function whose result depends only on the arguments
+ (not pointers!) and which has no side effects. */
+#ifndef _UC_ATTRIBUTE_CONST
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) || defined __clang__
+# define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
+# else
+# define _UC_ATTRIBUTE_CONST
+# endif
+#endif
+
+/* Attribute of a function whose result depends only on the arguments
+ (possibly pointers) and global memory, and which has no side effects. */
+#ifndef _UC_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _UC_ATTRIBUTE_PURE
+# endif
+#endif
+
+/* Qualifier in a function declaration, that asserts that the caller must
+ pass a pointer to a different object in the specified pointer argument
+ than in the other pointer arguments. */
+#ifndef _UC_RESTRICT
+# if defined __restrict \
+ || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
+ || __clang_major__ >= 3
+# define _UC_RESTRICT __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+# define _UC_RESTRICT restrict
+# else
+# define _UC_RESTRICT
+# endif
+#endif
+
+#endif /* _UNITYPES_H */
diff --git a/lib/uniwidth.in.h b/lib/uniwidth.in.h
new file mode 100644
index 0000000..43898f6
--- /dev/null
+++ b/lib/uniwidth.in.h
@@ -0,0 +1,72 @@
+/* Display width functions.
+ Copyright (C) 2001-2002, 2005, 2007, 2009-2020 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/>. */
+
+#ifndef _UNIWIDTH_H
+#define _UNIWIDTH_H
+
+#include "unitypes.h"
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get locale_charset() declaration. */
+#include "localcharset.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Display width. */
+
+/* These functions are locale dependent. The encoding argument identifies
+ the encoding (e.g. "ISO-8859-2" for Polish). */
+
+/* Determine number of column positions required for UC. */
+extern int
+ uc_width (ucs4_t uc, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+/* Determine number of column positions required for first N units
+ (or fewer if S ends before this) in S. */
+extern int
+ u8_width (const uint8_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_width (const uint16_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_width (const uint32_t *s, size_t n, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+/* Determine number of column positions required for S. */
+extern int
+ u8_strwidth (const uint8_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u16_strwidth (const uint16_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+extern int
+ u32_strwidth (const uint32_t *s, const char *encoding)
+ _UC_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _UNIWIDTH_H */
diff --git a/lib/uniwidth/cjk.h b/lib/uniwidth/cjk.h
new file mode 100644
index 0000000..3dcc7cb
--- /dev/null
+++ b/lib/uniwidth/cjk.h
@@ -0,0 +1,37 @@
+/* Test for CJK encoding.
+ Copyright (C) 2001-2002, 2005-2007, 2009-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include "streq.h"
+
+static int
+is_cjk_encoding (const char *encoding)
+{
+ if (0
+ /* Legacy Japanese encodings */
+ || STREQ_OPT (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0)
+ /* Legacy Chinese encodings */
+ || STREQ_OPT (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
+ || STREQ_OPT (encoding, "GBK", 'G', 'B', 'K', 0, 0, 0, 0, 0, 0)
+ || STREQ_OPT (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0)
+ || STREQ_OPT (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0)
+ /* Legacy Korean encodings */
+ || STREQ_OPT (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
+ || STREQ_OPT (encoding, "CP949", 'C', 'P', '9', '4', '9', 0, 0, 0, 0)
+ || STREQ_OPT (encoding, "JOHAB", 'J', 'O', 'H', 'A', 'B', 0, 0, 0, 0))
+ return 1;
+ return 0;
+}
diff --git a/lib/uniwidth/width.c b/lib/uniwidth/width.c
new file mode 100644
index 0000000..ad92323
--- /dev/null
+++ b/lib/uniwidth/width.c
@@ -0,0 +1,468 @@
+/* Determine display width of Unicode character.
+ Copyright (C) 2001-2002, 2006-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2002.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "uniwidth.h"
+
+#include "cjk.h"
+
+/*
+ * Non-spacing attribute table.
+ * Consists of:
+ * - Non-spacing characters; generated from PropList.txt or
+ * "grep '^[^;]*;[^;]*;[^;]*;[^;]*;NSM;' UnicodeData.txt"
+ * - Format control characters; generated from
+ * "grep '^[^;]*;[^;]*;Cf;' UnicodeData.txt"
+ * - Zero width characters; generated from
+ * "grep '^[^;]*;ZERO WIDTH ' UnicodeData.txt"
+ */
+static const unsigned char nonspacing_table_data[38*64] = {
+ /* 0x0000-0x01ff */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, /* 0x0000-0x003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x0040-0x007f */
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x20, 0x00, 0x00, /* 0x0080-0x00bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00c0-0x00ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0100-0x013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0140-0x017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0180-0x01bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x01c0-0x01ff */
+ /* 0x0200-0x03ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0200-0x023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0240-0x027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0280-0x02bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x02c0-0x02ff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x0300-0x033f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, /* 0x0340-0x037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0380-0x03bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x03c0-0x03ff */
+ /* 0x0400-0x05ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0400-0x043f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0440-0x047f */
+ 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0480-0x04bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x04c0-0x04ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0500-0x053f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0540-0x057f */
+ 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, /* 0x0580-0x05bf */
+ 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x05c0-0x05ff */
+ /* 0x0600-0x07ff */
+ 0x3f, 0x00, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, /* 0x0600-0x063f */
+ 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x01, 0x00, /* 0x0640-0x067f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0680-0x06bf */
+ 0x00, 0x00, 0xc0, 0xbf, 0x9f, 0x3d, 0x00, 0x00, /* 0x06c0-0x06ff */
+ 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, /* 0x0700-0x073f */
+ 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0740-0x077f */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, /* 0x0780-0x07bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x07c0-0x07ff */
+ /* 0x0800-0x09ff */
+ 0x00, 0x00, 0xc0, 0xfb, 0xef, 0x3e, 0x00, 0x00, /* 0x0800-0x083f */
+ 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, /* 0x0840-0x087f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0880-0x08bf */
+ 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08c0-0x08ff */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, /* 0x0900-0x093f */
+ 0xfe, 0x21, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0940-0x097f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0980-0x09bf */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x09c0-0x09ff */
+ /* 0x0a00-0x0bff */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a00-0x0a3f */
+ 0x86, 0x39, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, /* 0x0a40-0x0a7f */
+ 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0a80-0x0abf */
+ 0xbe, 0x21, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0ac0-0x0aff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0x0b00-0x0b3f */
+ 0x1e, 0x20, 0x40, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0b40-0x0b7f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0b80-0x0bbf */
+ 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0bc0-0x0bff */
+ /* 0x0c00-0x0dff */
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, /* 0x0c00-0x0c3f */
+ 0xc1, 0x3d, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0c40-0x0c7f */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x0c80-0x0cbf */
+ 0x00, 0x30, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0cc0-0x0cff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d00-0x0d3f */
+ 0x1e, 0x20, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, /* 0x0d40-0x0d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0d80-0x0dbf */
+ 0x00, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0dc0-0x0dff */
+ /* 0x0e00-0x0fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x07, /* 0x0e00-0x0e3f */
+ 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0e40-0x0e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1b, /* 0x0e80-0x0ebf */
+ 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0ec0-0x0eff */
+ 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xa0, 0x02, /* 0x0f00-0x0f3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, /* 0x0f40-0x0f7f */
+ 0xdf, 0xe0, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x1f, /* 0x0f80-0x0fbf */
+ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x0fc0-0x0fff */
+ /* 0x1000-0x11ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x66, /* 0x1000-0x103f */
+ 0x00, 0x00, 0x00, 0xc3, 0x01, 0x00, 0x1e, 0x00, /* 0x1040-0x107f */
+ 0x64, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x1080-0x10bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10c0-0x10ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1100-0x113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1140-0x117f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1180-0x11bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c0-0x11ff */
+ /* 0x1200-0x13ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1200-0x123f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1240-0x127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1280-0x12bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x12c0-0x12ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1300-0x133f */
+ 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, /* 0x1340-0x137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1380-0x13bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x13c0-0x13ff */
+ /* 0x1600-0x17ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1600-0x163f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1640-0x167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1680-0x16bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16c0-0x16ff */
+ 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, /* 0x1700-0x173f */
+ 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x00, /* 0x1740-0x177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, /* 0x1780-0x17bf */
+ 0x40, 0xfe, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x00, /* 0x17c0-0x17ff */
+ /* 0x1800-0x19ff */
+ 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1800-0x183f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1840-0x187f */
+ 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* 0x1880-0x18bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18c0-0x18ff */
+ 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x04, 0x0e, /* 0x1900-0x193f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1940-0x197f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1980-0x19bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x19c0-0x19ff */
+ /* 0x1a00-0x1bff */
+ 0x00, 0x00, 0x80, 0x09, 0x00, 0x00, 0x00, 0x00, /* 0x1a00-0x1a3f */
+ 0x00, 0x00, 0x40, 0x7f, 0xe5, 0x1f, 0xf8, 0x9f, /* 0x1a40-0x1a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, /* 0x1a80-0x1abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1ac0-0x1aff */
+ 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x17, /* 0x1b00-0x1b3f */
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, /* 0x1b40-0x1b7f */
+ 0x03, 0x00, 0x00, 0x00, 0x3c, 0x3b, 0x00, 0x00, /* 0x1b80-0x1bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0xa3, 0x03, 0x00, /* 0x1bc0-0x1bff */
+ /* 0x1c00-0x1dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xcf, 0x00, /* 0x1c00-0x1c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c40-0x1c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1c80-0x1cbf */
+ 0x00, 0x00, 0xf7, 0xff, 0xfd, 0x21, 0x10, 0x03, /* 0x1cc0-0x1cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d00-0x1d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d40-0x1d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d80-0x1dbf */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, /* 0x1dc0-0x1dff */
+ /* 0x2000-0x21ff */
+ 0x00, 0xf8, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, /* 0x2000-0x203f */
+ 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0x00, 0x00, /* 0x2040-0x207f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2080-0x20bf */
+ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, /* 0x20c0-0x20ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2100-0x213f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2140-0x217f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2180-0x21bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x21c0-0x21ff */
+ /* 0x2c00-0x2dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c00-0x2c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c40-0x2c7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2c80-0x2cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, /* 0x2cc0-0x2cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d00-0x2d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x2d40-0x2d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x2d80-0x2dbf */
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, /* 0x2dc0-0x2dff */
+ /* 0x3000-0x31ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x3000-0x303f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3040-0x307f */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, /* 0x3080-0x30bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30c0-0x30ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3100-0x313f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3140-0x317f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x3180-0x31bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x31c0-0x31ff */
+ /* 0xa600-0xa7ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa600-0xa63f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf7, 0x3f, /* 0xa640-0xa67f */
+ 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, /* 0xa680-0xa6bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, /* 0xa6c0-0xa6ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa700-0xa73f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa740-0xa77f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa780-0xa7bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa7c0-0xa7ff */
+ /* 0xa800-0xa9ff */
+ 0x44, 0x08, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0xa800-0xa83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa840-0xa87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa880-0xa8bf */
+ 0x30, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x00, /* 0xa8c0-0xa8ff */
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, /* 0xa900-0xa93f */
+ 0x80, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa940-0xa97f */
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x13, /* 0xa980-0xa9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, /* 0xa9c0-0xa9ff */
+ /* 0xaa00-0xabff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x66, 0x00, /* 0xaa00-0xaa3f */
+ 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0xaa40-0xaa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0xc1, /* 0xaa80-0xaabf */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, /* 0xaac0-0xaaff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab00-0xab3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab40-0xab7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xab80-0xabbf */
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x00, 0x00, /* 0xabc0-0xabff */
+ /* 0xfa00-0xfbff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa00-0xfa3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa40-0xfa7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfa80-0xfabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfac0-0xfaff */
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, /* 0xfb00-0xfb3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb40-0xfb7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfb80-0xfbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfbc0-0xfbff */
+ /* 0xfe00-0xffff */
+ 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, /* 0xfe00-0xfe3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe40-0xfe7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xfe80-0xfebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0xfec0-0xfeff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff00-0xff3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff40-0xff7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xff80-0xffbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, /* 0xffc0-0xffff */
+ /* 0x10000-0x101ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10000-0x1003f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10040-0x1007f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10080-0x100bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x100c0-0x100ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10100-0x1013f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10140-0x1017f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10180-0x101bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /* 0x101c0-0x101ff */
+ /* 0x10200-0x103ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10200-0x1023f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10240-0x1027f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10280-0x102bf */
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, /* 0x102c0-0x102ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10300-0x1033f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, /* 0x10340-0x1037f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10380-0x103bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x103c0-0x103ff */
+ /* 0x10a00-0x10bff */
+ 0x6e, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, /* 0x10a00-0x10a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a40-0x10a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10a80-0x10abf */
+ 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* 0x10ac0-0x10aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b00-0x10b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b40-0x10b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10b80-0x10bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10bc0-0x10bff */
+ /* 0x11000-0x111ff */
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11000-0x1103f */
+ 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* 0x11040-0x1107f */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x26, /* 0x11080-0x110bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x110c0-0x110ff */
+ 0x07, 0x00, 0x00, 0x00, 0x80, 0xef, 0x1f, 0x00, /* 0x11100-0x1113f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, /* 0x11140-0x1117f */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, /* 0x11180-0x111bf */
+ 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x111c0-0x111ff */
+ /* 0x11200-0x113ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xd3, 0x40, /* 0x11200-0x1123f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11240-0x1127f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11280-0x112bf */
+ 0x00, 0x00, 0x00, 0x80, 0xf8, 0x07, 0x00, 0x00, /* 0x112c0-0x112ff */
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, /* 0x11300-0x1133f */
+ 0x01, 0x00, 0x00, 0x00, 0xc0, 0x1f, 0x1f, 0x00, /* 0x11340-0x1137f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11380-0x113bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x113c0-0x113ff */
+ /* 0x11400-0x115ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, /* 0x11400-0x1143f */
+ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11440-0x1147f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x85, /* 0x11480-0x114bf */
+ 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x114c0-0x114ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11500-0x1153f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11540-0x1157f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xb0, /* 0x11580-0x115bf */
+ 0x01, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, /* 0x115c0-0x115ff */
+ /* 0x11600-0x117ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xa7, /* 0x11600-0x1163f */
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11640-0x1167f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xbf, 0x00, /* 0x11680-0x116bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x116c0-0x116ff */
+ 0x00, 0x00, 0x00, 0xe0, 0xbc, 0x0f, 0x00, 0x00, /* 0x11700-0x1173f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11740-0x1177f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11780-0x117bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x117c0-0x117ff */
+ /* 0x11c00-0x11dff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x3f, /* 0x11c00-0x11c3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11c40-0x11c7f */
+ 0x00, 0x00, 0xfc, 0xff, 0xff, 0xfc, 0x6d, 0x00, /* 0x11c80-0x11cbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11cc0-0x11cff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d00-0x11d3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d40-0x11d7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11d80-0x11dbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x11dc0-0x11dff */
+ /* 0x16a00-0x16bff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a00-0x16a3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a40-0x16a7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16a80-0x16abf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, /* 0x16ac0-0x16aff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, /* 0x16b00-0x16b3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b40-0x16b7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16b80-0x16bbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16bc0-0x16bff */
+ /* 0x16e00-0x16fff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e00-0x16e3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e40-0x16e7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16e80-0x16ebf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16ec0-0x16eff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f00-0x16f3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f40-0x16f7f */
+ 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16f80-0x16fbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x16fc0-0x16fff */
+ /* 0x1bc00-0x1bdff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc00-0x1bc3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bc40-0x1bc7f */
+ 0x00, 0x00, 0x00, 0x60, 0x0f, 0x00, 0x00, 0x00, /* 0x1bc80-0x1bcbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bcc0-0x1bcff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd00-0x1bd3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd40-0x1bd7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bd80-0x1bdbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1bdc0-0x1bdff */
+ /* 0x1d000-0x1d1ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d000-0x1d03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d040-0x1d07f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d080-0x1d0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d0c0-0x1d0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d100-0x1d13f */
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0xf8, 0xff, /* 0x1d140-0x1d17f */
+ 0xe7, 0x0f, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, /* 0x1d180-0x1d1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d1c0-0x1d1ff */
+ /* 0x1d200-0x1d3ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d200-0x1d23f */
+ 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d240-0x1d27f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d280-0x1d2bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d2c0-0x1d2ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d300-0x1d33f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d340-0x1d37f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d380-0x1d3bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1d3c0-0x1d3ff */
+ /* 0x1da00-0x1dbff */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xf8, /* 0x1da00-0x1da3f */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x20, 0x00, /* 0x1da40-0x1da7f */
+ 0x10, 0x00, 0x00, 0xf8, 0xfe, 0xff, 0x00, 0x00, /* 0x1da80-0x1dabf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dac0-0x1daff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db00-0x1db3f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db40-0x1db7f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1db80-0x1dbbf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1dbc0-0x1dbff */
+ /* 0x1e000-0x1e1ff */
+ 0x7f, 0xff, 0xff, 0xf9, 0xdb, 0x07, 0x00, 0x00, /* 0x1e000-0x1e03f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e040-0x1e07f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e080-0x1e0bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e0c0-0x1e0ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e100-0x1e13f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e140-0x1e17f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e180-0x1e1bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e1c0-0x1e1ff */
+ /* 0x1e800-0x1e9ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e800-0x1e83f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e840-0x1e87f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e880-0x1e8bf */
+ 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e8c0-0x1e8ff */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e900-0x1e93f */
+ 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e940-0x1e97f */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x1e980-0x1e9bf */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0x1e9c0-0x1e9ff */
+};
+static const signed char nonspacing_table_ind[248] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000-0x0fff */
+ 8, 9, -1, 10, 11, 12, 13, -1, /* 0x1000-0x1fff */
+ 14, -1, -1, -1, -1, -1, 15, -1, /* 0x2000-0x2fff */
+ 16, -1, -1, -1, -1, -1, -1, -1, /* 0x3000-0x3fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x4000-0x4fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x5000-0x5fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x6000-0x6fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x7000-0x7fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x8000-0x8fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x9000-0x9fff */
+ -1, -1, -1, 17, 18, 19, -1, -1, /* 0xa000-0xafff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xb000-0xbfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xc000-0xcfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xd000-0xdfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0xe000-0xefff */
+ -1, -1, -1, -1, -1, 20, -1, 21, /* 0xf000-0xffff */
+ 22, 23, -1, -1, -1, 24, -1, -1, /* 0x10000-0x10fff */
+ 25, 26, 27, 28, -1, -1, 29, -1, /* 0x11000-0x11fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x12000-0x12fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x13000-0x13fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x14000-0x14fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x15000-0x15fff */
+ -1, -1, -1, -1, -1, 30, -1, 31, /* 0x16000-0x16fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x17000-0x17fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x18000-0x18fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x19000-0x19fff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1a000-0x1afff */
+ -1, -1, -1, -1, -1, -1, 32, -1, /* 0x1b000-0x1bfff */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 0x1c000-0x1cfff */
+ 33, 34, -1, -1, -1, 35, -1, -1, /* 0x1d000-0x1dfff */
+ 36, -1, -1, -1, 37, -1, -1, -1 /* 0x1e000-0x1efff */
+};
+
+/* Determine number of column positions required for UC. */
+int
+uc_width (ucs4_t uc, const char *encoding)
+{
+ /* Test for non-spacing or control character. */
+ if ((uc >> 9) < 248)
+ {
+ int ind = nonspacing_table_ind[uc >> 9];
+ if (ind >= 0)
+ if ((nonspacing_table_data[64*ind + ((uc >> 3) & 63)] >> (uc & 7)) & 1)
+ {
+ if (uc > 0 && uc < 0xa0)
+ return -1;
+ else
+ return 0;
+ }
+ }
+ else if ((uc >> 9) == (0xe0000 >> 9))
+ {
+ if (uc >= 0xe0100)
+ {
+ if (uc <= 0xe01ef)
+ return 0;
+ }
+ else
+ {
+ if (uc >= 0xe0020 ? uc <= 0xe007f : uc == 0xe0001)
+ return 0;
+ }
+ }
+ /* Test for double-width character.
+ * Generated from "grep '^[^;]\{4,5\};[WF]' EastAsianWidth.txt"
+ * and "grep '^[^;]\{4,5\};[^WF]' EastAsianWidth.txt"
+ */
+ if (uc >= 0x1100
+ && ((uc < 0x1160) /* Hangul Jamo */
+ || (uc >= 0x2329 && uc < 0x232b) /* Angle Brackets */
+ || (uc >= 0x2e80 && uc < 0xa4d0 /* CJK ... Yi */
+ && !(uc == 0x303f) && !(uc >= 0x4dc0 && uc < 0x4e00))
+ || (uc >= 0xac00 && uc < 0xd7a4) /* Hangul Syllables */
+ || (uc >= 0xf900 && uc < 0xfb00) /* CJK Compatibility Ideographs */
+ || (uc >= 0xfe10 && uc < 0xfe20) /* Presentation Forms for Vertical */
+ || (uc >= 0xfe30 && uc < 0xfe70) /* CJK Compatibility Forms */
+ || (uc >= 0xff00 && uc < 0xff61) /* Fullwidth Forms */
+ || (uc >= 0xffe0 && uc < 0xffe7) /* Fullwidth Signs */
+ || (uc >= 0x20000 && uc <= 0x2ffff) /* Supplementary Ideographic Plane */
+ || (uc >= 0x30000 && uc <= 0x3ffff) /* Tertiary Ideographic Plane */
+ ) )
+ return 2;
+ /* In ancient CJK encodings, Cyrillic and most other characters are
+ double-width as well. */
+ if (uc >= 0x00A1 && uc < 0xFF61 && uc != 0x20A9
+ && is_cjk_encoding (encoding))
+ return 2;
+ return 1;
+}
diff --git a/lib/unlink.c b/lib/unlink.c
new file mode 100644
index 0000000..58b1e90
--- /dev/null
+++ b/lib/unlink.c
@@ -0,0 +1,98 @@
+/* Work around unlink bugs.
+
+ Copyright (C) 2009-2020 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/>. */
+
+#include <config.h>
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include "filename.h"
+
+#undef unlink
+#if defined _WIN32 && !defined __CYGWIN__
+# define unlink _unlink
+#endif
+
+/* Remove file NAME.
+ Return 0 if successful, -1 if not. */
+
+int
+rpl_unlink (char const *name)
+{
+ /* Work around Solaris 9 bug where unlink("file/") succeeds. */
+ size_t len = strlen (name);
+ int result = 0;
+ if (len && ISSLASH (name[len - 1]))
+ {
+ /* We can't unlink(2) something if it doesn't exist. If it does
+ exist, then it resolved to a directory, due to the trailing
+ slash, and POSIX requires that the unlink attempt to remove
+ that directory (which would leave the symlink dangling).
+ Unfortunately, Solaris 9 is one of the platforms where the
+ root user can unlink directories, and we don't want to
+ cripple this behavior on real directories, even if it is
+ seldom needed (at any rate, it's nicer to let coreutils'
+ unlink(1) give the correct errno for non-root users). But we
+ don't know whether name was an actual directory, or a symlink
+ to a directory; and due to the bug of ignoring trailing
+ slash, Solaris 9 would end up successfully unlinking the
+ symlink instead of the directory. Technically, we could use
+ realpath to find the canonical directory name to attempt
+ deletion on. But that is a lot of work for a corner case; so
+ we instead just use an lstat on the shortened name, and
+ reject symlinks with trailing slashes. The root user of
+ unlink(1) will just have to live with the rule that they
+ can't delete a directory via a symlink. */
+ struct stat st;
+ result = lstat (name, &st);
+ if (result == 0 || errno == EOVERFLOW)
+ {
+ /* Trailing NUL will overwrite the trailing slash. */
+ char *short_name = malloc (len);
+ if (!short_name)
+ return -1;
+ memcpy (short_name, name, len);
+ while (len && ISSLASH (short_name[len - 1]))
+ short_name[--len] = '\0';
+ if (len && (lstat (short_name, &st) || S_ISLNK (st.st_mode)))
+ {
+ free (short_name);
+ errno = EPERM;
+ return -1;
+ }
+ free (short_name);
+ result = 0;
+ }
+ }
+ if (!result)
+ {
+#if UNLINK_PARENT_BUG
+ if (len >= 2 && name[len - 1] == '.' && name[len - 2] == '.'
+ && (len == 2 || ISSLASH (name[len - 3])))
+ {
+ errno = EISDIR; /* could also use EPERM */
+ return -1;
+ }
+#endif
+ result = unlink (name);
+ }
+ return result;
+}
diff --git a/lib/unlocked-io.h b/lib/unlocked-io.h
new file mode 100644
index 0000000..e7f7199
--- /dev/null
+++ b/lib/unlocked-io.h
@@ -0,0 +1,136 @@
+/* Prefer faster, non-thread-safe stdio functions if available.
+
+ Copyright (C) 2001-2004, 2009-2020 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/>. */
+
+/* Written by Jim Meyering. */
+
+#ifndef UNLOCKED_IO_H
+# define UNLOCKED_IO_H 1
+
+/* These are wrappers for functions/macros from the GNU C library, and
+ from other C libraries supporting POSIX's optional thread-safe functions.
+
+ The standard I/O functions are thread-safe. These *_unlocked ones are
+ more efficient but not thread-safe. That they're not thread-safe is
+ fine since all of the applications in this package are single threaded.
+
+ Also, some code that is shared with the GNU C library may invoke
+ the *_unlocked functions directly. On hosts that lack those
+ functions, invoke the non-thread-safe versions instead. */
+
+# include <stdio.h>
+
+# if HAVE_DECL_CLEARERR_UNLOCKED
+# undef clearerr
+# define clearerr(x) clearerr_unlocked (x)
+# else
+# define clearerr_unlocked(x) clearerr (x)
+# endif
+
+# if HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(x) feof_unlocked (x)
+# else
+# define feof_unlocked(x) feof (x)
+# endif
+
+# if HAVE_DECL_FERROR_UNLOCKED
+# undef ferror
+# define ferror(x) ferror_unlocked (x)
+# else
+# define ferror_unlocked(x) ferror (x)
+# endif
+
+# if HAVE_DECL_FFLUSH_UNLOCKED
+# undef fflush
+# define fflush(x) fflush_unlocked (x)
+# else
+# define fflush_unlocked(x) fflush (x)
+# endif
+
+# if HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(x,y,z) fgets_unlocked (x,y,z)
+# else
+# define fgets_unlocked(x,y,z) fgets (x,y,z)
+# endif
+
+# if HAVE_DECL_FPUTC_UNLOCKED
+# undef fputc
+# define fputc(x,y) fputc_unlocked (x,y)
+# else
+# define fputc_unlocked(x,y) fputc (x,y)
+# endif
+
+# if HAVE_DECL_FPUTS_UNLOCKED
+# undef fputs
+# define fputs(x,y) fputs_unlocked (x,y)
+# else
+# define fputs_unlocked(x,y) fputs (x,y)
+# endif
+
+# if HAVE_DECL_FREAD_UNLOCKED
+# undef fread
+# define fread(w,x,y,z) fread_unlocked (w,x,y,z)
+# else
+# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
+# endif
+
+# if HAVE_DECL_FWRITE_UNLOCKED
+# undef fwrite
+# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z)
+# else
+# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
+# endif
+
+# if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc(x) getc_unlocked (x)
+# else
+# define getc_unlocked(x) getc (x)
+# endif
+
+# if HAVE_DECL_GETCHAR_UNLOCKED
+# undef getchar
+# define getchar() getchar_unlocked ()
+# else
+# define getchar_unlocked() getchar ()
+# endif
+
+# if HAVE_DECL_PUTC_UNLOCKED
+# undef putc
+# define putc(x,y) putc_unlocked (x,y)
+# else
+# define putc_unlocked(x,y) putc (x,y)
+# endif
+
+# if HAVE_DECL_PUTCHAR_UNLOCKED
+# undef putchar
+# define putchar(x) putchar_unlocked (x)
+# else
+# define putchar_unlocked(x) putchar (x)
+# endif
+
+# undef flockfile
+# define flockfile(x) ((void) 0)
+
+# undef ftrylockfile
+# define ftrylockfile(x) 0
+
+# undef funlockfile
+# define funlockfile(x) ((void) 0)
+
+#endif /* UNLOCKED_IO_H */
diff --git a/lib/unused-parameter.h b/lib/unused-parameter.h
new file mode 100644
index 0000000..662ff1b
--- /dev/null
+++ b/lib/unused-parameter.h
@@ -0,0 +1,32 @@
+/* A C macro for declaring that specific function parameters are not used.
+ Copyright (C) 2008-2020 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/>. */
+
+/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
+ declarations for parameters that are not used. This helps to reduce
+ warnings, such as from GCC -Wunused-parameter. The syntax is as follows:
+ type param _GL_UNUSED_PARAMETER
+ or more generally
+ param_decl _GL_UNUSED_PARAMETER
+ For example:
+ int param _GL_UNUSED_PARAMETER
+ int *(*param)(void) _GL_UNUSED_PARAMETER
+ Other possible, but obscure and discouraged syntaxes:
+ int _GL_UNUSED_PARAMETER *(*param)(void)
+ _GL_UNUSED_PARAMETER int *(*param)(void)
+ */
+#ifndef _GL_UNUSED_PARAMETER
+# define _GL_UNUSED_PARAMETER _GL_ATTRIBUTE_MAYBE_UNUSED
+#endif
diff --git a/lib/utime.c b/lib/utime.c
new file mode 100644
index 0000000..bf7d7c5
--- /dev/null
+++ b/lib/utime.c
@@ -0,0 +1,287 @@
+/* Work around platform bugs in utime.
+ Copyright (C) 2017-2020 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/>. */
+
+/* Written by Bruno Haible. */
+
+#include <config.h>
+
+/* Specification. */
+#include <utime.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <stdbool.h>
+# include <windows.h>
+# include "filename.h"
+# include "malloca.h"
+
+/* Don't assume that UNICODE is not defined. */
+# undef CreateFile
+# define CreateFile CreateFileA
+# undef GetFileAttributes
+# define GetFileAttributes GetFileAttributesA
+
+int
+_gl_utimens_windows (const char *name, struct timespec ts[2])
+{
+ /* POSIX <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13>
+ specifies: "More than two leading <slash> characters shall be treated as
+ a single <slash> character." */
+ if (ISSLASH (name[0]) && ISSLASH (name[1]) && ISSLASH (name[2]))
+ {
+ name += 2;
+ while (ISSLASH (name[1]))
+ name++;
+ }
+
+ size_t len = strlen (name);
+ size_t drive_prefix_len = (HAS_DEVICE (name) ? 2 : 0);
+
+ /* Remove trailing slashes (except the very first one, at position
+ drive_prefix_len), but remember their presence. */
+ size_t rlen;
+ bool check_dir = false;
+
+ rlen = len;
+ while (rlen > drive_prefix_len && ISSLASH (name[rlen-1]))
+ {
+ check_dir = true;
+ if (rlen == drive_prefix_len + 1)
+ break;
+ rlen--;
+ }
+
+ const char *rname;
+ char *malloca_rname;
+ if (rlen == len)
+ {
+ rname = name;
+ malloca_rname = NULL;
+ }
+ else
+ {
+ malloca_rname = malloca (rlen + 1);
+ if (malloca_rname == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ memcpy (malloca_rname, name, rlen);
+ malloca_rname[rlen] = '\0';
+ rname = malloca_rname;
+ }
+
+ DWORD error;
+
+ /* Open a handle to the file.
+ CreateFile
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea>
+ <https://docs.microsoft.com/en-us/windows/desktop/FileIO/creating-and-opening-files> */
+ HANDLE handle =
+ CreateFile (rname,
+ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ NULL,
+ OPEN_EXISTING,
+ /* FILE_FLAG_POSIX_SEMANTICS (treat file names that differ only
+ in case as different) makes sense only when applied to *all*
+ filesystem operations. */
+ FILE_FLAG_BACKUP_SEMANTICS /* | FILE_FLAG_POSIX_SEMANTICS */,
+ NULL);
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ error = GetLastError ();
+ goto failed;
+ }
+
+ if (check_dir)
+ {
+ /* GetFileAttributes
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getfileattributesa> */
+ DWORD attributes = GetFileAttributes (rname);
+ if (attributes == INVALID_FILE_ATTRIBUTES)
+ {
+ error = GetLastError ();
+ CloseHandle (handle);
+ goto failed;
+ }
+ if ((attributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
+ {
+ CloseHandle (handle);
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+ errno = ENOTDIR;
+ return -1;
+ }
+ }
+
+ {
+ /* Use SetFileTime(). See
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-setfiletime>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
+ FILETIME last_access_time;
+ FILETIME last_write_time;
+ if (ts == NULL)
+ {
+ /* GetSystemTimeAsFileTime is the same as
+ GetSystemTime followed by SystemTimeToFileTime.
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime>.
+ It would be overkill to use
+ GetSystemTimePreciseAsFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime>. */
+ FILETIME current_time;
+ GetSystemTimeAsFileTime (&current_time);
+ last_access_time = current_time;
+ last_write_time = current_time;
+ }
+ else
+ {
+ {
+ ULONGLONG time_since_16010101 =
+ (ULONGLONG) ts[0].tv_sec * 10000000 + ts[0].tv_nsec / 100 + 116444736000000000LL;
+ last_access_time.dwLowDateTime = (DWORD) time_since_16010101;
+ last_access_time.dwHighDateTime = time_since_16010101 >> 32;
+ }
+ {
+ ULONGLONG time_since_16010101 =
+ (ULONGLONG) ts[1].tv_sec * 10000000 + ts[1].tv_nsec / 100 + 116444736000000000LL;
+ last_write_time.dwLowDateTime = (DWORD) time_since_16010101;
+ last_write_time.dwHighDateTime = time_since_16010101 >> 32;
+ }
+ }
+ if (SetFileTime (handle, NULL, &last_access_time, &last_write_time))
+ {
+ CloseHandle (handle);
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+ return 0;
+ }
+ else
+ {
+ #if 0
+ DWORD sft_error = GetLastError ();
+ fprintf (stderr, "utimens SetFileTime error 0x%x\n", (unsigned int) sft_error);
+ #endif
+ CloseHandle (handle);
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+ errno = EINVAL;
+ return -1;
+ }
+ }
+
+ failed:
+ {
+ #if 0
+ fprintf (stderr, "utimens CreateFile/GetFileAttributes error 0x%x\n", (unsigned int) error);
+ #endif
+ if (malloca_rname != NULL)
+ freea (malloca_rname);
+
+ switch (error)
+ {
+ /* Some of these errors probably cannot happen with the specific flags
+ that we pass to CreateFile. But who knows... */
+ case ERROR_FILE_NOT_FOUND: /* The last component of rname does not exist. */
+ case ERROR_PATH_NOT_FOUND: /* Some directory component in rname does not exist. */
+ case ERROR_BAD_PATHNAME: /* rname is such as '\\server'. */
+ case ERROR_BAD_NETPATH: /* rname is such as '\\nonexistentserver\share'. */
+ case ERROR_BAD_NET_NAME: /* rname is such as '\\server\nonexistentshare'. */
+ case ERROR_INVALID_NAME: /* rname contains wildcards, misplaced colon, etc. */
+ case ERROR_DIRECTORY:
+ errno = ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED: /* rname is such as 'C:\System Volume Information\foo'. */
+ case ERROR_SHARING_VIOLATION: /* rname is such as 'C:\pagefile.sys'. */
+ errno = (ts != NULL ? EPERM : EACCES);
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ errno = ENOMEM;
+ break;
+
+ case ERROR_WRITE_PROTECT:
+ errno = EROFS;
+ break;
+
+ case ERROR_WRITE_FAULT:
+ case ERROR_READ_FAULT:
+ case ERROR_GEN_FAILURE:
+ errno = EIO;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ errno = ENAMETOOLONG;
+ break;
+
+ case ERROR_DELETE_PENDING: /* XXX map to EACCES or EPERM? */
+ errno = EPERM;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+
+ return -1;
+ }
+}
+
+int
+utime (const char *name, const struct utimbuf *ts)
+{
+ if (ts == NULL)
+ return _gl_utimens_windows (name, NULL);
+ else
+ {
+ struct timespec ts_with_nanoseconds[2];
+ ts_with_nanoseconds[0].tv_sec = ts->actime;
+ ts_with_nanoseconds[0].tv_nsec = 0;
+ ts_with_nanoseconds[1].tv_sec = ts->modtime;
+ ts_with_nanoseconds[1].tv_nsec = 0;
+ return _gl_utimens_windows (name, ts_with_nanoseconds);
+ }
+}
+
+#else
+
+# include <sys/stat.h>
+# include "filename.h"
+
+int
+utime (const char *name, const struct utimbuf *ts)
+#undef utime
+{
+# if REPLACE_FUNC_UTIME_FILE
+ /* macOS 10.13 mistakenly succeeds when given a symbolic link to a
+ non-directory with a trailing slash. */
+ size_t len = strlen (name);
+ if (len > 0 && ISSLASH (name[len - 1]))
+ {
+ struct stat buf;
+
+ if (stat (name, &buf) == -1 && errno != EOVERFLOW)
+ return -1;
+ }
+# endif /* REPLACE_FUNC_UTIME_FILE */
+
+ return utime (name, ts);
+}
+
+#endif
diff --git a/lib/utime.in.h b/lib/utime.in.h
new file mode 100644
index 0000000..3322086
--- /dev/null
+++ b/lib/utime.in.h
@@ -0,0 +1,112 @@
+/* Substitute for and wrapper around <utime.h>.
+ Copyright (C) 2017-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _@GUARD_PREFIX@_UTIME_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_UTIME_H@
+# @INCLUDE_NEXT@ @NEXT_UTIME_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_UTIME_H
+#define _@GUARD_PREFIX@_UTIME_H
+
+#if !@HAVE_UTIME_H@
+# include <sys/utime.h>
+#endif
+
+#if @GNULIB_UTIME@
+/* Get struct timespec. */
+# include <time.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Define 'struct utimbuf' as an alias of 'struct _utimbuf'
+ (or possibly, if present, 'struct __utimbuf64'). */
+# define utimbuf _utimbuf
+
+#endif
+
+
+#if @GNULIB_UTIME@
+# if @REPLACE_UTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define utime rpl_utime
+# endif
+_GL_FUNCDECL_RPL (utime, int, (const char *filename, const struct utimbuf *ts)
+ _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (utime, int, (const char *filename, const struct utimbuf *ts));
+# elif defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef utime
+# define utime _utime
+# endif
+_GL_CXXALIAS_MDA (utime, int, (const char *filename, const struct utimbuf *ts));
+# else
+# if !@HAVE_UTIME@
+_GL_FUNCDECL_SYS (utime, int, (const char *filename, const struct utimbuf *ts)
+ _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (utime, int, (const char *filename, const struct utimbuf *ts));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (utime);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef utime
+# if HAVE_RAW_DECL_UTIME
+_GL_WARN_ON_USE (utime,
+ "utime is unportable - "
+ "use gnulib module canonicalize-lgpl for portability");
+# endif
+#elif @GNULIB_MDA_UTIME@
+/* On native Windows, map 'utime' to '_utime', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::utime always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef utime
+# define utime _utime
+# endif
+_GL_CXXALIAS_MDA (utime, int, (const char *filename, const struct utimbuf *ts));
+# else
+_GL_CXXALIAS_SYS (utime, int, (const char *filename, const struct utimbuf *ts));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (utime);
+# endif
+#endif
+
+#if @GNULIB_UTIME@
+extern int _gl_utimens_windows (const char *filename, struct timespec ts[2]);
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_UTIME_H */
+#endif /* _@GUARD_PREFIX@_UTIME_H */
diff --git a/lib/utimens.c b/lib/utimens.c
new file mode 100644
index 0000000..3f53942
--- /dev/null
+++ b/lib/utimens.c
@@ -0,0 +1,630 @@
+/* Set file access and modification times.
+
+ Copyright (C) 2003-2020 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 any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Paul Eggert. */
+
+/* derived from a function in touch.c */
+
+#include <config.h>
+
+#define _GL_UTIMENS_INLINE _GL_EXTERN_INLINE
+#include "utimens.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <utime.h>
+
+#include "stat-time.h"
+#include "timespec.h"
+
+/* On native Windows, use SetFileTime; but avoid this when compiling
+ GNU Emacs, which arranges for this in some other way and which
+ defines WIN32_LEAN_AND_MEAN itself. */
+
+#if defined _WIN32 && ! defined __CYGWIN__ && ! defined EMACS_CONFIGURATION
+# define USE_SETFILETIME
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+#endif
+
+/* Avoid recursion with rpl_futimens or rpl_utimensat. */
+#undef futimens
+#undef utimensat
+
+/* Solaris 9 mistakenly succeeds when given a non-directory with a
+ trailing slash. Force the use of rpl_stat for a fix. */
+#ifndef REPLACE_FUNC_STAT_FILE
+# define REPLACE_FUNC_STAT_FILE 0
+#endif
+
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+/* Cache variables for whether the utimensat syscall works; used to
+ avoid calling the syscall if we know it will just fail with ENOSYS,
+ and to avoid unnecessary work in massaging timestamps if the
+ syscall will work. Multiple variables are needed, to distinguish
+ between the following scenarios on Linux:
+ utimensat doesn't exist, or is in glibc but kernel 2.6.18 fails with ENOSYS
+ kernel 2.6.22 and earlier rejects AT_SYMLINK_NOFOLLOW
+ kernel 2.6.25 and earlier reject UTIME_NOW/UTIME_OMIT with non-zero tv_sec
+ kernel 2.6.32 used with xfs or ntfs-3g fail to honor UTIME_OMIT
+ utimensat completely works
+ For each cache variable: 0 = unknown, 1 = yes, -1 = no. */
+static int utimensat_works_really;
+static int lutimensat_works_really;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+/* Validate the requested timestamps. Return 0 if the resulting
+ timespec can be used for utimensat (after possibly modifying it to
+ work around bugs in utimensat). Return a positive value if the
+ timespec needs further adjustment based on stat results: 1 if any
+ adjustment is needed for utimes, and 2 if any adjustment is needed
+ for Linux utimensat. Return -1, with errno set to EINVAL, if
+ timespec is out of range. */
+static int
+validate_timespec (struct timespec timespec[2])
+{
+ int result = 0;
+ int utime_omit_count = 0;
+ if ((timespec[0].tv_nsec != UTIME_NOW
+ && timespec[0].tv_nsec != UTIME_OMIT
+ && ! (0 <= timespec[0].tv_nsec
+ && timespec[0].tv_nsec < TIMESPEC_HZ))
+ || (timespec[1].tv_nsec != UTIME_NOW
+ && timespec[1].tv_nsec != UTIME_OMIT
+ && ! (0 <= timespec[1].tv_nsec
+ && timespec[1].tv_nsec < TIMESPEC_HZ)))
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ /* Work around Linux kernel 2.6.25 bug, where utimensat fails with
+ EINVAL if tv_sec is not 0 when using the flag values of tv_nsec.
+ Flag a Linux kernel 2.6.32 bug, where an mtime of UTIME_OMIT
+ fails to bump ctime. */
+ if (timespec[0].tv_nsec == UTIME_NOW
+ || timespec[0].tv_nsec == UTIME_OMIT)
+ {
+ timespec[0].tv_sec = 0;
+ result = 1;
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ if (timespec[1].tv_nsec == UTIME_NOW
+ || timespec[1].tv_nsec == UTIME_OMIT)
+ {
+ timespec[1].tv_sec = 0;
+ result = 1;
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ utime_omit_count++;
+ }
+ return result + (utime_omit_count == 1);
+}
+
+/* Normalize any UTIME_NOW or UTIME_OMIT values in *TS, using stat
+ buffer STATBUF to obtain the current timestamps of the file. If
+ both times are UTIME_NOW, set *TS to NULL (as this can avoid some
+ permissions issues). If both times are UTIME_OMIT, return true
+ (nothing further beyond the prior collection of STATBUF is
+ necessary); otherwise return false. */
+static bool
+update_timespec (struct stat const *statbuf, struct timespec *ts[2])
+{
+ struct timespec *timespec = *ts;
+ if (timespec[0].tv_nsec == UTIME_OMIT
+ && timespec[1].tv_nsec == UTIME_OMIT)
+ return true;
+ if (timespec[0].tv_nsec == UTIME_NOW
+ && timespec[1].tv_nsec == UTIME_NOW)
+ {
+ *ts = NULL;
+ return false;
+ }
+
+ if (timespec[0].tv_nsec == UTIME_OMIT)
+ timespec[0] = get_stat_atime (statbuf);
+ else if (timespec[0].tv_nsec == UTIME_NOW)
+ gettime (&timespec[0]);
+
+ if (timespec[1].tv_nsec == UTIME_OMIT)
+ timespec[1] = get_stat_mtime (statbuf);
+ else if (timespec[1].tv_nsec == UTIME_NOW)
+ gettime (&timespec[1]);
+
+ return false;
+}
+
+/* Set the access and modification timestamps of FD (a.k.a. FILE) to be
+ TIMESPEC[0] and TIMESPEC[1], respectively.
+ FD must be either negative -- in which case it is ignored --
+ or a file descriptor that is open on FILE.
+ If FD is nonnegative, then FILE can be NULL, which means
+ use just futimes (or equivalent) instead of utimes (or equivalent),
+ and fail if on an old system without futimes (or equivalent).
+ If TIMESPEC is null, set the timestamps to the current time.
+ Return 0 on success, -1 (setting errno) on failure. */
+
+int
+fdutimens (int fd, char const *file, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* Require that at least one of FD or FILE are potentially valid, to avoid
+ a Linux bug where futimens (AT_FDCWD, NULL) changes "." rather
+ than failing. */
+ if (fd < 0 && !file)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ /* Some Linux-based NFS clients are buggy, and mishandle timestamps
+ of files in NFS file systems in some cases. We have no
+ configure-time test for this, but please see
+ <https://bugs.gentoo.org/show_bug.cgi?id=132673> for references to
+ some of the problems with Linux 2.6.16. If this affects you,
+ compile with -DHAVE_BUGGY_NFS_TIME_STAMPS; this is reported to
+ help in some cases, albeit at a cost in performance. But you
+ really should upgrade your kernel to a fixed version, since the
+ problem affects many applications. */
+
+#if HAVE_BUGGY_NFS_TIME_STAMPS
+ if (fd < 0)
+ sync ();
+ else
+ fsync (fd);
+#endif
+
+ /* POSIX 2008 added two interfaces to set file timestamps with
+ nanosecond resolution; newer Linux implements both functions via
+ a single syscall. We provide a fallback for ENOSYS (for example,
+ compiling against Linux 2.6.25 kernel headers and glibc 2.7, but
+ running on Linux 2.6.18 kernel). */
+#if HAVE_UTIMENSAT || HAVE_FUTIMENS
+ if (0 <= utimensat_works_really)
+ {
+ int result;
+# if __linux__ || __sun
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory [f]stat prior
+ to calling futimens/utimensat; fortunately, there is not much
+ timing impact due to the extra syscall even on file systems
+ where UTIME_OMIT would have worked.
+
+ The same bug occurs in Solaris 11.1 (Apr 2013).
+
+ FIXME: Simplify this for Linux in 2016 and for Solaris in
+ 2024, when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (fd < 0 ? stat (file, &st) : fstat (fd, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif
+# if HAVE_UTIMENSAT
+ if (fd < 0)
+ {
+ result = utimensat (AT_FDCWD, file, ts, 0);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ https://bugzilla.redhat.com/show_bug.cgi?id=442352
+ https://bugzilla.redhat.com/show_bug.cgi?id=449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_UTIMENSAT */
+# if HAVE_FUTIMENS
+ if (0 <= fd)
+ {
+ result = futimens (fd, ts);
+# ifdef __linux__
+ /* Work around the same bug as above. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif /* __linux__ */
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ return result;
+ }
+ }
+# endif /* HAVE_FUTIMENS */
+ }
+ utimensat_works_really = -1;
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT || HAVE_FUTIMENS */
+
+#ifdef USE_SETFILETIME
+ /* On native Windows, use SetFileTime(). See
+ <https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-setfiletime>
+ <https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime> */
+ if (0 <= fd)
+ {
+ HANDLE handle;
+ FILETIME current_time;
+ FILETIME last_access_time;
+ FILETIME last_write_time;
+
+ handle = (HANDLE) _get_osfhandle (fd);
+ if (handle == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return -1;
+ }
+
+ if (ts == NULL || ts[0].tv_nsec == UTIME_NOW || ts[1].tv_nsec == UTIME_NOW)
+ {
+ /* GetSystemTimeAsFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimeasfiletime>.
+ It would be overkill to use
+ GetSystemTimePreciseAsFileTime
+ <https://docs.microsoft.com/en-us/windows/desktop/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime>. */
+ GetSystemTimeAsFileTime (&current_time);
+ }
+
+ if (ts == NULL || ts[0].tv_nsec == UTIME_NOW)
+ {
+ last_access_time = current_time;
+ }
+ else if (ts[0].tv_nsec == UTIME_OMIT)
+ {
+ last_access_time.dwLowDateTime = 0;
+ last_access_time.dwHighDateTime = 0;
+ }
+ else
+ {
+ ULONGLONG time_since_16010101 =
+ (ULONGLONG) ts[0].tv_sec * 10000000 + ts[0].tv_nsec / 100 + 116444736000000000LL;
+ last_access_time.dwLowDateTime = (DWORD) time_since_16010101;
+ last_access_time.dwHighDateTime = time_since_16010101 >> 32;
+ }
+
+ if (ts == NULL || ts[1].tv_nsec == UTIME_NOW)
+ {
+ last_write_time = current_time;
+ }
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ {
+ last_write_time.dwLowDateTime = 0;
+ last_write_time.dwHighDateTime = 0;
+ }
+ else
+ {
+ ULONGLONG time_since_16010101 =
+ (ULONGLONG) ts[1].tv_sec * 10000000 + ts[1].tv_nsec / 100 + 116444736000000000LL;
+ last_write_time.dwLowDateTime = (DWORD) time_since_16010101;
+ last_write_time.dwHighDateTime = time_since_16010101 >> 32;
+ }
+
+ if (SetFileTime (handle, NULL, &last_access_time, &last_write_time))
+ return 0;
+ else
+ {
+ DWORD sft_error = GetLastError ();
+ #if 0
+ fprintf (stderr, "fdutimens SetFileTime error 0x%x\n", (unsigned int) sft_error);
+ #endif
+ switch (sft_error)
+ {
+ case ERROR_ACCESS_DENIED: /* fd was opened without O_RDWR */
+ errno = EACCES; /* not specified by POSIX */
+ break;
+ default:
+ errno = EINVAL;
+ break;
+ }
+ return -1;
+ }
+ }
+#endif
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || (REPLACE_FUNC_STAT_FILE && fd < 0))
+ {
+ if (adjustment_needed != 3
+ && (fd < 0 ? stat (file, &st) : fstat (fd, &st)))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ {
+#if HAVE_FUTIMESAT || HAVE_WORKING_UTIMES
+ struct timeval timeval[2];
+ struct timeval *t;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ if (fd < 0)
+ {
+# if HAVE_FUTIMESAT
+ return futimesat (AT_FDCWD, file, t);
+# endif
+ }
+ else
+ {
+ /* If futimesat or futimes fails here, don't try to speed things
+ up by returning right away. glibc can incorrectly fail with
+ errno == ENOENT if /proc isn't mounted. Also, Mandrake 10.0
+ in high security mode doesn't allow ordinary users to read
+ /proc/self, so glibc incorrectly fails with errno == EACCES.
+ If errno == EIO, EPERM, or EROFS, it's probably safe to fail
+ right away, but these cases are rare enough that they're not
+ worth optimizing, and who knows what other messed-up systems
+ are out there? So play it safe and fall back on the code
+ below. */
+
+# if (HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) || HAVE_FUTIMES
+# if HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG
+# undef futimes
+# define futimes(fd, t) futimesat (fd, NULL, t)
+# endif
+ if (futimes (fd, t) == 0)
+ {
+# if __linux__ && __GLIBC__
+ /* Work around a longstanding glibc bug, still present as
+ of 2010-12-27. On older Linux kernels that lack both
+ utimensat and utimes, glibc's futimes rounds instead of
+ truncating when falling back on utime. The same bug
+ occurs in futimesat with a null 2nd arg. */
+ if (t)
+ {
+ bool abig = 500000 <= t[0].tv_usec;
+ bool mbig = 500000 <= t[1].tv_usec;
+ if ((abig | mbig) && fstat (fd, &st) == 0)
+ {
+ /* If these two subtractions overflow, they'll
+ track the overflows inside the buggy glibc. */
+ time_t adiff = st.st_atime - t[0].tv_sec;
+ time_t mdiff = st.st_mtime - t[1].tv_sec;
+
+ struct timeval *tt = NULL;
+ struct timeval truncated_timeval[2];
+ truncated_timeval[0] = t[0];
+ truncated_timeval[1] = t[1];
+ if (abig && adiff == 1 && get_stat_atime_ns (&st) == 0)
+ {
+ tt = truncated_timeval;
+ tt[0].tv_usec = 0;
+ }
+ if (mbig && mdiff == 1 && get_stat_mtime_ns (&st) == 0)
+ {
+ tt = truncated_timeval;
+ tt[1].tv_usec = 0;
+ }
+ if (tt)
+ futimes (fd, tt);
+ }
+ }
+# endif
+
+ return 0;
+ }
+# endif
+ }
+#endif /* HAVE_FUTIMESAT || HAVE_WORKING_UTIMES */
+
+ if (!file)
+ {
+#if ! ((HAVE_FUTIMESAT && !FUTIMESAT_NULL_BUG) \
+ || (HAVE_WORKING_UTIMES && HAVE_FUTIMES))
+ errno = ENOSYS;
+#endif
+ return -1;
+ }
+
+#ifdef USE_SETFILETIME
+ return _gl_utimens_windows (file, ts);
+#elif HAVE_WORKING_UTIMES
+ return utimes (file, t);
+#else
+ {
+ struct utimbuf utimbuf;
+ struct utimbuf *ut;
+ if (ts)
+ {
+ utimbuf.actime = ts[0].tv_sec;
+ utimbuf.modtime = ts[1].tv_sec;
+ ut = &utimbuf;
+ }
+ else
+ ut = NULL;
+
+ return utime (file, ut);
+ }
+#endif /* !HAVE_WORKING_UTIMES */
+ }
+}
+
+/* Set the access and modification timestamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively. */
+int
+utimens (char const *file, struct timespec const timespec[2])
+{
+ return fdutimens (-1, file, timespec);
+}
+
+/* Set the access and modification timestamps of FILE to be
+ TIMESPEC[0] and TIMESPEC[1], respectively, without dereferencing
+ symlinks. Fail with ENOSYS if the platform does not support
+ changing symlink timestamps, but FILE was a symlink. */
+int
+lutimens (char const *file, struct timespec const timespec[2])
+{
+ struct timespec adjusted_timespec[2];
+ struct timespec *ts = timespec ? adjusted_timespec : NULL;
+ int adjustment_needed = 0;
+ struct stat st;
+
+ if (ts)
+ {
+ adjusted_timespec[0] = timespec[0];
+ adjusted_timespec[1] = timespec[1];
+ adjustment_needed = validate_timespec (ts);
+ }
+ if (adjustment_needed < 0)
+ return -1;
+
+ /* The Linux kernel did not support symlink timestamps until
+ utimensat, in version 2.6.22, so we don't need to mimic
+ fdutimens' worry about buggy NFS clients. But we do have to
+ worry about bogus return values. */
+
+#if HAVE_UTIMENSAT
+ if (0 <= lutimensat_works_really)
+ {
+ int result;
+# if __linux__ || __sun
+ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file
+ systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT,
+ but work if both times are either explicitly specified or
+ UTIME_NOW. Work around it with a preparatory lstat prior to
+ calling utimensat; fortunately, there is not much timing
+ impact due to the extra syscall even on file systems where
+ UTIME_OMIT would have worked.
+
+ The same bug occurs in Solaris 11.1 (Apr 2013).
+
+ FIXME: Simplify this for Linux in 2016 and for Solaris in
+ 2024, when file system bugs are no longer common. */
+ if (adjustment_needed == 2)
+ {
+ if (lstat (file, &st))
+ return -1;
+ if (ts[0].tv_nsec == UTIME_OMIT)
+ ts[0] = get_stat_atime (&st);
+ else if (ts[1].tv_nsec == UTIME_OMIT)
+ ts[1] = get_stat_mtime (&st);
+ /* Note that st is good, in case utimensat gives ENOSYS. */
+ adjustment_needed++;
+ }
+# endif
+ result = utimensat (AT_FDCWD, file, ts, AT_SYMLINK_NOFOLLOW);
+# ifdef __linux__
+ /* Work around a kernel bug:
+ https://bugzilla.redhat.com/show_bug.cgi?id=442352
+ https://bugzilla.redhat.com/show_bug.cgi?id=449910
+ It appears that utimensat can mistakenly return 280 rather
+ than -1 upon ENOSYS failure.
+ FIXME: remove in 2010 or whenever the offending kernels
+ are no longer in common use. */
+ if (0 < result)
+ errno = ENOSYS;
+# endif
+ if (result == 0 || errno != ENOSYS)
+ {
+ utimensat_works_really = 1;
+ lutimensat_works_really = 1;
+ return result;
+ }
+ }
+ lutimensat_works_really = -1;
+#endif /* HAVE_UTIMENSAT */
+
+ /* The platform lacks an interface to set file timestamps with
+ nanosecond resolution, so do the best we can, discarding any
+ fractional part of the timestamp. */
+
+ if (adjustment_needed || REPLACE_FUNC_STAT_FILE)
+ {
+ if (adjustment_needed != 3 && lstat (file, &st))
+ return -1;
+ if (ts && update_timespec (&st, &ts))
+ return 0;
+ }
+
+ /* On Linux, lutimes is a thin wrapper around utimensat, so there is
+ no point trying lutimes if utimensat failed with ENOSYS. */
+#if HAVE_LUTIMES && !HAVE_UTIMENSAT
+ {
+ struct timeval timeval[2];
+ struct timeval *t;
+ int result;
+ if (ts)
+ {
+ timeval[0].tv_sec = ts[0].tv_sec;
+ timeval[0].tv_usec = ts[0].tv_nsec / 1000;
+ timeval[1].tv_sec = ts[1].tv_sec;
+ timeval[1].tv_usec = ts[1].tv_nsec / 1000;
+ t = timeval;
+ }
+ else
+ t = NULL;
+
+ result = lutimes (file, t);
+ if (result == 0 || errno != ENOSYS)
+ return result;
+ }
+#endif /* HAVE_LUTIMES && !HAVE_UTIMENSAT */
+
+ /* Out of luck for symlinks, but we still handle regular files. */
+ if (!(adjustment_needed || REPLACE_FUNC_STAT_FILE) && lstat (file, &st))
+ return -1;
+ if (!S_ISLNK (st.st_mode))
+ return fdutimens (-1, file, ts);
+ errno = ENOSYS;
+ return -1;
+}
diff --git a/lib/utimens.h b/lib/utimens.h
new file mode 100644
index 0000000..fc22c8a
--- /dev/null
+++ b/lib/utimens.h
@@ -0,0 +1,49 @@
+/* Set file access and modification times.
+
+ Copyright 2012-2020 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 any
+ later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Paul Eggert. */
+
+#include <time.h>
+int fdutimens (int, char const *, struct timespec const [2]);
+int utimens (char const *, struct timespec const [2]);
+int lutimens (char const *, struct timespec const [2]);
+
+#if GNULIB_FDUTIMENSAT
+# include <fcntl.h>
+# include <sys/stat.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UTIMENS_INLINE
+# define _GL_UTIMENS_INLINE _GL_INLINE
+#endif
+
+int fdutimensat (int fd, int dir, char const *name, struct timespec const [2],
+ int atflag);
+
+/* Using this function makes application code slightly more readable. */
+_GL_UTIMENS_INLINE int
+lutimensat (int dir, char const *file, struct timespec const times[2])
+{
+ return utimensat (dir, file, times, AT_SYMLINK_NOFOLLOW);
+}
+
+_GL_INLINE_HEADER_END
+
+#endif
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
new file mode 100644
index 0000000..dfa344e
--- /dev/null
+++ b/lib/vasnprintf.c
@@ -0,0 +1,5871 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 1999, 2002-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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 file can be parametrized with the following macros:
+ VASNPRINTF The name of the function being defined.
+ FCHAR_T The element type of the format string.
+ DCHAR_T The element type of the destination (result) string.
+ FCHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII. MUST be set if
+ FCHAR_T and DCHAR_T are not the same type.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on FCHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on FCHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on FCHAR_T.
+ DCHAR_CPY memcpy like function for DCHAR_T[] arrays.
+ DCHAR_SET memset like function for DCHAR_T[] arrays.
+ DCHAR_MBSNLEN mbsnlen like function for DCHAR_T[] arrays.
+ SNPRINTF The system's snprintf (or similar) function.
+ This may be either snprintf or swprintf.
+ TCHAR_T The element type of the argument and result string
+ of the said SNPRINTF function. This may be either
+ char or wchar_t. The code exploits that
+ sizeof (TCHAR_T) | sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T).
+ DCHAR_IS_TCHAR Set to 1 if DCHAR_T and TCHAR_T are the same type.
+ DCHAR_CONV_FROM_ENCODING A function to convert from char[] to DCHAR[].
+ DCHAR_IS_UINT8_T Set to 1 if DCHAR_T is uint8_t.
+ DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t.
+ DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
+ ENABLE_WCHAR_FALLBACK Set to 1 to avoid EILSEQ during conversion of wide
+ characters (wchar_t) and wide character strings
+ (wchar_t[]) to multibyte sequences. The fallback is the
+ hexadecimal escape syntax (\unnnn or \Unnnnnnnn) or,
+ if wchar_t is not Unicode encoded, \wnnnn or \Wnnnnnnnn.
+ */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+ This must come before <config.h> because <config.h> may include
+ <features.h>, and once <features.h> has been included, it's too late. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#ifndef VASNPRINTF
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+# else
+# include "vasnprintf.h"
+# endif
+#endif
+
+#include <locale.h> /* localeconv() */
+#include <stdio.h> /* snprintf(), sprintf() */
+#include <stdlib.h> /* abort(), malloc(), realloc(), free() */
+#include <string.h> /* memcpy(), strlen() */
+#include <errno.h> /* errno */
+#include <limits.h> /* CHAR_BIT */
+#include <float.h> /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if HAVE_NL_LANGINFO
+# include <langinfo.h>
+#endif
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+# else
+# include "printf-parse.h"
+# endif
+#endif
+
+/* Checked size_t computations. */
+#include "xsize.h"
+
+#include "attribute.h"
+#include "verify.h"
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "float+.h"
+#endif
+
+#if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "fpucw.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnand-nolibm.h"
+# include "printf-frexp.h"
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+# include <math.h>
+# include "isnanl-nolibm.h"
+# include "printf-frexpl.h"
+# include "fpucw.h"
+#endif
+
+/* Default parameters. */
+#ifndef VASNPRINTF
+# if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define FCHAR_T wchar_t
+# define DCHAR_T wchar_t
+# define TCHAR_T wchar_t
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define DCHAR_CPY wmemcpy
+# define DCHAR_SET wmemset
+# else
+# define VASNPRINTF vasnprintf
+# define FCHAR_T char
+# define DCHAR_T char
+# define TCHAR_T char
+# define DCHAR_IS_TCHAR 1
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define DCHAR_CPY memcpy
+# define DCHAR_SET memset
+# endif
+#endif
+#if WIDE_CHAR_VERSION
+ /* TCHAR_T is wchar_t. */
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+ /* On Windows, the function swprintf() has a different signature than
+ on Unix; we use the function _snwprintf() or - on mingw - snwprintf()
+ instead. The mingw function snwprintf() has fewer bugs than the
+ MSVCRT function _snwprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snwprintf
+# else
+# define SNPRINTF _snwprintf
+# define USE_MSVC__SNPRINTF 1
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF swprintf
+# endif
+#else
+ /* TCHAR_T is char. */
+ /* Use snprintf if it exists under the name 'snprintf' or '_snprintf'.
+ But don't use it on BeOS, since BeOS snprintf produces no output if the
+ size argument is >= 0x3000000.
+ Also don't use it on Linux libc5, since there snprintf with size = 1
+ writes any output without bounds, like sprintf. */
+# if (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF) && !defined __BEOS__ && !(__GNU_LIBRARY__ == 1)
+# define USE_SNPRINTF 1
+# else
+# define USE_SNPRINTF 0
+# endif
+# if HAVE_DECL__SNPRINTF
+ /* Windows. The mingw function snprintf() has fewer bugs than the MSVCRT
+ function _snprintf(), so prefer that. */
+# if defined __MINGW32__
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# else
+ /* MSVC versions < 14 did not have snprintf, only _snprintf. */
+# define SNPRINTF _snprintf
+# define USE_MSVC__SNPRINTF 1
+# endif
+# else
+ /* Unix. */
+# define SNPRINTF snprintf
+ /* Here we need to call the native snprintf, not rpl_snprintf. */
+# undef snprintf
+# endif
+#endif
+/* Here we need to call the native sprintf, not rpl_sprintf. */
+#undef sprintf
+
+/* GCC >= 4.0 with -Wall emits unjustified "... may be used uninitialized"
+ warnings in this file. Use -Dlint to suppress them. */
+#if defined GCC_LINT || defined lint
+# define IF_LINT(Code) Code
+#else
+# define IF_LINT(Code) /* empty */
+#endif
+
+/* Avoid some warnings from "gcc -Wshadow".
+ This file doesn't use the exp() and remainder() functions. */
+#undef exp
+#define exp expo
+#undef remainder
+#define remainder rem
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && !WIDE_CHAR_VERSION
+# if (HAVE_STRNLEN && !defined _AIX)
+# define local_strnlen strnlen
+# else
+# ifndef local_strnlen_defined
+# define local_strnlen_defined 1
+static size_t
+local_strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+# endif
+# endif
+#endif
+
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && WIDE_CHAR_VERSION) || ((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL)) && !WIDE_CHAR_VERSION && DCHAR_IS_TCHAR)) && HAVE_WCHAR_T
+# if HAVE_WCSLEN
+# define local_wcslen wcslen
+# else
+ /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+ a dependency towards this library, here is a local substitute.
+ Define this substitute only once, even if this file is included
+ twice in the same compilation unit. */
+# ifndef local_wcslen_defined
+# define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF) && HAVE_WCHAR_T && WIDE_CHAR_VERSION
+# if HAVE_WCSNLEN
+# define local_wcsnlen wcsnlen
+# else
+# ifndef local_wcsnlen_defined
+# define local_wcsnlen_defined 1
+static size_t
+local_wcsnlen (const wchar_t *s, size_t maxlen)
+{
+ const wchar_t *ptr;
+
+ for (ptr = s; maxlen > 0 && *ptr != (wchar_t) 0; ptr++, maxlen--)
+ ;
+ return ptr - s;
+}
+# endif
+# endif
+#endif
+
+#if (((!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T) || (ENABLE_WCHAR_FALLBACK && HAVE_WINT_T)) && !WIDE_CHAR_VERSION
+# if ENABLE_WCHAR_FALLBACK
+static size_t
+wctomb_fallback (char *s, wchar_t wc)
+{
+ static char hex[16] = "0123456789ABCDEF";
+
+ s[0] = '\\';
+ if (sizeof (wchar_t) > 2 && wc > 0xffff)
+ {
+# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+ s[1] = 'U';
+# else
+ s[1] = 'W';
+# endif
+ s[2] = hex[(wc & 0xf0000000U) >> 28];
+ s[3] = hex[(wc & 0xf000000U) >> 24];
+ s[4] = hex[(wc & 0xf00000U) >> 20];
+ s[5] = hex[(wc & 0xf0000U) >> 16];
+ s[6] = hex[(wc & 0xf000U) >> 12];
+ s[7] = hex[(wc & 0xf00U) >> 8];
+ s[8] = hex[(wc & 0xf0U) >> 4];
+ s[9] = hex[wc & 0xfU];
+ return 10;
+ }
+ else
+ {
+# if __STDC_ISO_10646__ || (__GLIBC__ >= 2) || (defined _WIN32 || defined __CYGWIN__)
+ s[1] = 'u';
+# else
+ s[1] = 'w';
+# endif
+ s[2] = hex[(wc & 0xf000U) >> 12];
+ s[3] = hex[(wc & 0xf00U) >> 8];
+ s[4] = hex[(wc & 0xf0U) >> 4];
+ s[5] = hex[wc & 0xfU];
+ return 6;
+ }
+}
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+static size_t
+local_wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+{
+ size_t count = wcrtomb (s, wc, ps);
+ if (count == (size_t)(-1))
+ count = wctomb_fallback (s, wc);
+ return count;
+}
+# else
+static int
+local_wctomb (char *s, wchar_t wc)
+{
+ int count = wctomb (s, wc);
+ if (count < 0)
+ count = wctomb_fallback (s, wc);
+ return count;
+}
+# define local_wcrtomb(S, WC, PS) local_wctomb ((S), (WC))
+# endif
+# else
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+# define local_wcrtomb(S, WC, PS) wcrtomb ((S), (WC), (PS))
+# else
+# define local_wcrtomb(S, WC, PS) wctomb ((S), (WC))
+# endif
+# endif
+#endif
+
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL
+/* Determine the decimal-point character according to the current locale. */
+# ifndef decimal_point_char_defined
+# define decimal_point_char_defined 1
+static char
+decimal_point_char (void)
+{
+ const char *point;
+ /* Determine it in a multithread-safe way. We know nl_langinfo is
+ multithread-safe on glibc systems and Mac OS X systems, but is not required
+ to be multithread-safe by POSIX. sprintf(), however, is multithread-safe.
+ localeconv() is rarely multithread-safe. */
+# if HAVE_NL_LANGINFO && (__GLIBC__ || defined __UCLIBC__ || (defined __APPLE__ && defined __MACH__))
+ point = nl_langinfo (RADIXCHAR);
+# elif 1
+ char pointbuf[5];
+ sprintf (pointbuf, "%#.0f", 1.0);
+ point = &pointbuf[1];
+# else
+ point = localeconv () -> decimal_point;
+# endif
+ /* The decimal point is always a single byte: either '.' or ','. */
+ return (point[0] != '\0' ? point[0] : '.');
+}
+# endif
+#endif
+
+#if NEED_PRINTF_INFINITE_DOUBLE && !NEED_PRINTF_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zero (double x)
+{
+ return isnand (x) || x + x == x;
+}
+
+#endif
+
+#if NEED_PRINTF_INFINITE_LONG_DOUBLE && !NEED_PRINTF_LONG_DOUBLE && !defined IN_LIBINTL
+
+/* Equivalent to !isfinite(x) || x == 0, but does not require libm. */
+static int
+is_infinite_or_zerol (long double x)
+{
+ return isnanl (x) || x + x == x;
+}
+
+#endif
+
+#if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+
+/* Converting 'long double' to decimal without rare rounding bugs requires
+ real bignums. We use the naming conventions of GNU gmp, but vastly simpler
+ (and slower) algorithms. */
+
+typedef unsigned int mp_limb_t;
+# define GMP_LIMB_BITS 32
+verify (sizeof (mp_limb_t) * CHAR_BIT == GMP_LIMB_BITS);
+
+typedef unsigned long long mp_twolimb_t;
+# define GMP_TWOLIMB_BITS 64
+verify (sizeof (mp_twolimb_t) * CHAR_BIT == GMP_TWOLIMB_BITS);
+
+/* Representation of a bignum >= 0. */
+typedef struct
+{
+ size_t nlimbs;
+ mp_limb_t *limbs; /* Bits in little-endian order, allocated with malloc(). */
+} mpn_t;
+
+/* Compute the product of two bignums >= 0.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+multiply (mpn_t src1, mpn_t src2, mpn_t *dest)
+{
+ const mp_limb_t *p1;
+ const mp_limb_t *p2;
+ size_t len1;
+ size_t len2;
+
+ if (src1.nlimbs <= src2.nlimbs)
+ {
+ len1 = src1.nlimbs;
+ p1 = src1.limbs;
+ len2 = src2.nlimbs;
+ p2 = src2.limbs;
+ }
+ else
+ {
+ len1 = src2.nlimbs;
+ p1 = src2.limbs;
+ len2 = src1.nlimbs;
+ p2 = src1.limbs;
+ }
+ /* Now 0 <= len1 <= len2. */
+ if (len1 == 0)
+ {
+ /* src1 or src2 is zero. */
+ dest->nlimbs = 0;
+ dest->limbs = (mp_limb_t *) malloc (1);
+ }
+ else
+ {
+ /* Here 1 <= len1 <= len2. */
+ size_t dlen;
+ mp_limb_t *dp;
+ size_t k, i, j;
+
+ dlen = len1 + len2;
+ dp = (mp_limb_t *) malloc (dlen * sizeof (mp_limb_t));
+ if (dp == NULL)
+ return NULL;
+ for (k = len2; k > 0; )
+ dp[--k] = 0;
+ for (i = 0; i < len1; i++)
+ {
+ mp_limb_t digit1 = p1[i];
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < len2; j++)
+ {
+ mp_limb_t digit2 = p2[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ carry += dp[i + j];
+ dp[i + j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ dp[i + len2] = (mp_limb_t) carry;
+ }
+ /* Normalise. */
+ while (dlen > 0 && dp[dlen - 1] == 0)
+ dlen--;
+ dest->nlimbs = dlen;
+ dest->limbs = dp;
+ }
+ return dest->limbs;
+}
+
+/* Compute the quotient of a bignum a >= 0 and a bignum b > 0.
+ a is written as a = q * b + r with 0 <= r < b. q is the quotient, r
+ the remainder.
+ Finally, round-to-even is performed: If r > b/2 or if r = b/2 and q is odd,
+ q is incremented.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+divide (mpn_t a, mpn_t b, mpn_t *q)
+{
+ /* Algorithm:
+ First normalise a and b: a=[a[m-1],...,a[0]], b=[b[n-1],...,b[0]]
+ with m>=0 and n>0 (in base beta = 2^GMP_LIMB_BITS).
+ If m<n, then q:=0 and r:=a.
+ If m>=n=1, perform a single-precision division:
+ r:=0, j:=m,
+ while j>0 do
+ {Here (q[m-1]*beta^(m-1)+...+q[j]*beta^j) * b[0] + r*beta^j =
+ = a[m-1]*beta^(m-1)+...+a[j]*beta^j und 0<=r<b[0]<beta}
+ j:=j-1, r:=r*beta+a[j], q[j]:=floor(r/b[0]), r:=r-b[0]*q[j].
+ Normalise [q[m-1],...,q[0]], yields q.
+ If m>=n>1, perform a multiple-precision division:
+ We have a/b < beta^(m-n+1).
+ s:=intDsize-1-(highest bit in b[n-1]), 0<=s<intDsize.
+ Shift a and b left by s bits, copying them. r:=a.
+ r=[r[m],...,r[0]], b=[b[n-1],...,b[0]] with b[n-1]>=beta/2.
+ For j=m-n,...,0: {Here 0 <= r < b*beta^(j+1).}
+ Compute q* :
+ q* := floor((r[j+n]*beta+r[j+n-1])/b[n-1]).
+ In case of overflow (q* >= beta) set q* := beta-1.
+ Compute c2 := ((r[j+n]*beta+r[j+n-1]) - q* * b[n-1])*beta + r[j+n-2]
+ and c3 := b[n-2] * q*.
+ {We have 0 <= c2 < 2*beta^2, even 0 <= c2 < beta^2 if no overflow
+ occurred. Furthermore 0 <= c3 < beta^2.
+ If there was overflow and
+ r[j+n]*beta+r[j+n-1] - q* * b[n-1] >= beta, i.e. c2 >= beta^2,
+ the next test can be skipped.}
+ While c3 > c2, {Here 0 <= c2 < c3 < beta^2}
+ Put q* := q* - 1, c2 := c2 + b[n-1]*beta, c3 := c3 - b[n-2].
+ If q* > 0:
+ Put r := r - b * q* * beta^j. In detail:
+ [r[n+j],...,r[j]] := [r[n+j],...,r[j]] - q* * [b[n-1],...,b[0]].
+ hence: u:=0, for i:=0 to n-1 do
+ u := u + q* * b[i],
+ r[j+i]:=r[j+i]-(u mod beta) (+ beta, if carry),
+ u:=u div beta (+ 1, if carry in subtraction)
+ r[n+j]:=r[n+j]-u.
+ {Since always u = (q* * [b[i-1],...,b[0]] div beta^i) + 1
+ < q* + 1 <= beta,
+ the carry u does not overflow.}
+ If a negative carry occurs, put q* := q* - 1
+ and [r[n+j],...,r[j]] := [r[n+j],...,r[j]] + [0,b[n-1],...,b[0]].
+ Set q[j] := q*.
+ Normalise [q[m-n],..,q[0]]; this yields the quotient q.
+ Shift [r[n-1],...,r[0]] right by s bits and normalise; this yields the
+ rest r.
+ The room for q[j] can be allocated at the memory location of r[n+j].
+ Finally, round-to-even:
+ Shift r left by 1 bit.
+ If r > b or if r = b and q[0] is odd, q := q+1.
+ */
+ const mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ const mp_limb_t *b_ptr = b.limbs;
+ size_t b_len = b.nlimbs;
+ mp_limb_t *roomptr;
+ mp_limb_t *tmp_roomptr = NULL;
+ mp_limb_t *q_ptr;
+ size_t q_len;
+ mp_limb_t *r_ptr;
+ size_t r_len;
+
+ /* Allocate room for a_len+2 digits.
+ (Need a_len+1 digits for the real division and 1 more digit for the
+ final rounding of q.) */
+ roomptr = (mp_limb_t *) malloc ((a_len + 2) * sizeof (mp_limb_t));
+ if (roomptr == NULL)
+ return NULL;
+
+ /* Normalise a. */
+ while (a_len > 0 && a_ptr[a_len - 1] == 0)
+ a_len--;
+
+ /* Normalise b. */
+ for (;;)
+ {
+ if (b_len == 0)
+ /* Division by zero. */
+ abort ();
+ if (b_ptr[b_len - 1] == 0)
+ b_len--;
+ else
+ break;
+ }
+
+ /* Here m = a_len >= 0 and n = b_len > 0. */
+
+ if (a_len < b_len)
+ {
+ /* m<n: trivial case. q=0, r := copy of a. */
+ r_ptr = roomptr;
+ r_len = a_len;
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ q_ptr = roomptr + a_len;
+ q_len = 0;
+ }
+ else if (b_len == 1)
+ {
+ /* n=1: single precision division.
+ beta^(m-1) <= a < beta^m ==> beta^(m-2) <= a/b < beta^m */
+ r_ptr = roomptr;
+ q_ptr = roomptr + 1;
+ {
+ mp_limb_t den = b_ptr[0];
+ mp_limb_t remainder = 0;
+ const mp_limb_t *sourceptr = a_ptr + a_len;
+ mp_limb_t *destptr = q_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--sourceptr;
+ *--destptr = num / den;
+ remainder = num % den;
+ }
+ /* Normalise and store r. */
+ if (remainder > 0)
+ {
+ r_ptr[0] = remainder;
+ r_len = 1;
+ }
+ else
+ r_len = 0;
+ /* Normalise q. */
+ q_len = a_len;
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+ }
+ }
+ else
+ {
+ /* n>1: multiple precision division.
+ beta^(m-1) <= a < beta^m, beta^(n-1) <= b < beta^n ==>
+ beta^(m-n-1) <= a/b < beta^(m-n+1). */
+ /* Determine s. */
+ size_t s;
+ {
+ mp_limb_t msd = b_ptr[b_len - 1]; /* = b[n-1], > 0 */
+ /* Determine s = GMP_LIMB_BITS - integer_length (msd).
+ Code copied from gnulib's integer_length.c. */
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) \
+ || (__clang_major__ >= 4)
+ s = __builtin_clz (msd);
+# else
+# if defined DBL_EXPBIT0_WORD && defined DBL_EXPBIT0_BIT
+ if (GMP_LIMB_BITS <= DBL_MANT_BIT)
+ {
+ /* Use 'double' operations.
+ Assumes an IEEE 754 'double' implementation. */
+# define DBL_EXP_MASK ((DBL_MAX_EXP - DBL_MIN_EXP) | 7)
+# define DBL_EXP_BIAS (DBL_EXP_MASK / 2 - 1)
+# define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+ union { double value; unsigned int word[NWORDS]; } m;
+
+ /* Use a single integer to floating-point conversion. */
+ m.value = msd;
+
+ s = GMP_LIMB_BITS
+ - (((m.word[DBL_EXPBIT0_WORD] >> DBL_EXPBIT0_BIT) & DBL_EXP_MASK)
+ - DBL_EXP_BIAS);
+ }
+ else
+# undef NWORDS
+# endif
+ {
+ s = 31;
+ if (msd >= 0x10000)
+ {
+ msd = msd >> 16;
+ s -= 16;
+ }
+ if (msd >= 0x100)
+ {
+ msd = msd >> 8;
+ s -= 8;
+ }
+ if (msd >= 0x10)
+ {
+ msd = msd >> 4;
+ s -= 4;
+ }
+ if (msd >= 0x4)
+ {
+ msd = msd >> 2;
+ s -= 2;
+ }
+ if (msd >= 0x2)
+ {
+ msd = msd >> 1;
+ s -= 1;
+ }
+ }
+# endif
+ }
+ /* 0 <= s < GMP_LIMB_BITS.
+ Copy b, shifting it left by s bits. */
+ if (s > 0)
+ {
+ tmp_roomptr = (mp_limb_t *) malloc (b_len * sizeof (mp_limb_t));
+ if (tmp_roomptr == NULL)
+ {
+ free (roomptr);
+ return NULL;
+ }
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = tmp_roomptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ /* accu must be zero, since that was how s was determined. */
+ if (accu != 0)
+ abort ();
+ }
+ b_ptr = tmp_roomptr;
+ }
+ /* Copy a, shifting it left by s bits, yields r.
+ Memory layout:
+ At the beginning: r = roomptr[0..a_len],
+ at the end: r = roomptr[0..b_len-1], q = roomptr[b_len..a_len] */
+ r_ptr = roomptr;
+ if (s == 0)
+ {
+ memcpy (r_ptr, a_ptr, a_len * sizeof (mp_limb_t));
+ r_ptr[a_len] = 0;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = a_ptr;
+ mp_limb_t *destptr = r_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ *destptr++ = (mp_limb_t) accu;
+ }
+ q_ptr = roomptr + b_len;
+ q_len = a_len - b_len + 1; /* q will have m-n+1 limbs */
+ {
+ size_t j = a_len - b_len; /* m-n */
+ mp_limb_t b_msd = b_ptr[b_len - 1]; /* b[n-1] */
+ mp_limb_t b_2msd = b_ptr[b_len - 2]; /* b[n-2] */
+ mp_twolimb_t b_msdd = /* b[n-1]*beta+b[n-2] */
+ ((mp_twolimb_t) b_msd << GMP_LIMB_BITS) | b_2msd;
+ /* Division loop, traversed m-n+1 times.
+ j counts down, b is unchanged, beta/2 <= b[n-1] < beta. */
+ for (;;)
+ {
+ mp_limb_t q_star;
+ mp_limb_t c1;
+ if (r_ptr[j + b_len] < b_msd) /* r[j+n] < b[n-1] ? */
+ {
+ /* Divide r[j+n]*beta+r[j+n-1] by b[n-1], no overflow. */
+ mp_twolimb_t num =
+ ((mp_twolimb_t) r_ptr[j + b_len] << GMP_LIMB_BITS)
+ | r_ptr[j + b_len - 1];
+ q_star = num / b_msd;
+ c1 = num % b_msd;
+ }
+ else
+ {
+ /* Overflow, hence r[j+n]*beta+r[j+n-1] >= beta*b[n-1]. */
+ q_star = (mp_limb_t)~(mp_limb_t)0; /* q* = beta-1 */
+ /* Test whether r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] >= beta
+ <==> r[j+n]*beta+r[j+n-1] + b[n-1] >= beta*b[n-1]+beta
+ <==> b[n-1] < floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta)
+ {<= beta !}.
+ If yes, jump directly to the subtraction loop.
+ (Otherwise, r[j+n]*beta+r[j+n-1] - (beta-1)*b[n-1] < beta
+ <==> floor((r[j+n]*beta+r[j+n-1]+b[n-1])/beta) = b[n-1] ) */
+ if (r_ptr[j + b_len] > b_msd
+ || (c1 = r_ptr[j + b_len - 1] + b_msd) < b_msd)
+ /* r[j+n] >= b[n-1]+1 or
+ r[j+n] = b[n-1] and the addition r[j+n-1]+b[n-1] gives a
+ carry. */
+ goto subtract;
+ }
+ /* q_star = q*,
+ c1 = (r[j+n]*beta+r[j+n-1]) - q* * b[n-1] (>=0, <beta). */
+ {
+ mp_twolimb_t c2 = /* c1*beta+r[j+n-2] */
+ ((mp_twolimb_t) c1 << GMP_LIMB_BITS) | r_ptr[j + b_len - 2];
+ mp_twolimb_t c3 = /* b[n-2] * q* */
+ (mp_twolimb_t) b_2msd * (mp_twolimb_t) q_star;
+ /* While c2 < c3, increase c2 and decrease c3.
+ Consider c3-c2. While it is > 0, decrease it by
+ b[n-1]*beta+b[n-2]. Because of b[n-1]*beta+b[n-2] >= beta^2/2
+ this can happen only twice. */
+ if (c3 > c2)
+ {
+ q_star = q_star - 1; /* q* := q* - 1 */
+ if (c3 - c2 > b_msdd)
+ q_star = q_star - 1; /* q* := q* - 1 */
+ }
+ }
+ if (q_star > 0)
+ subtract:
+ {
+ /* Subtract r := r - b * q* * beta^j. */
+ mp_limb_t cr;
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_twolimb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ /* Here 0 <= carry <= q*. */
+ carry =
+ carry
+ + (mp_twolimb_t) q_star * (mp_twolimb_t) *sourceptr++
+ + (mp_limb_t) ~(*destptr);
+ /* Here 0 <= carry <= beta*q* + beta-1. */
+ *destptr++ = ~(mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS; /* <= q* */
+ }
+ cr = (mp_limb_t) carry;
+ }
+ /* Subtract cr from r_ptr[j + b_len], then forget about
+ r_ptr[j + b_len]. */
+ if (cr > r_ptr[j + b_len])
+ {
+ /* Subtraction gave a carry. */
+ q_star = q_star - 1; /* q* := q* - 1 */
+ /* Add b back. */
+ {
+ const mp_limb_t *sourceptr = b_ptr;
+ mp_limb_t *destptr = r_ptr + j;
+ mp_limb_t carry = 0;
+ size_t count;
+ for (count = b_len; count > 0; count--)
+ {
+ mp_limb_t source1 = *sourceptr++;
+ mp_limb_t source2 = *destptr;
+ *destptr++ = source1 + source2 + carry;
+ carry =
+ (carry
+ ? source1 >= (mp_limb_t) ~source2
+ : source1 > (mp_limb_t) ~source2);
+ }
+ }
+ /* Forget about the carry and about r[j+n]. */
+ }
+ }
+ /* q* is determined. Store it as q[j]. */
+ q_ptr[j] = q_star;
+ if (j == 0)
+ break;
+ j--;
+ }
+ }
+ r_len = b_len;
+ /* Normalise q. */
+ if (q_ptr[q_len - 1] == 0)
+ q_len--;
+# if 0 /* Not needed here, since we need r only to compare it with b/2, and
+ b is shifted left by s bits. */
+ /* Shift r right by s bits. */
+ if (s > 0)
+ {
+ mp_limb_t ptr = r_ptr + r_len;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = r_len; count > 0; count--)
+ {
+ accu = (mp_twolimb_t) (mp_limb_t) accu << GMP_LIMB_BITS;
+ accu += (mp_twolimb_t) *--ptr << (GMP_LIMB_BITS - s);
+ *ptr = (mp_limb_t) (accu >> GMP_LIMB_BITS);
+ }
+ }
+# endif
+ /* Normalise r. */
+ while (r_len > 0 && r_ptr[r_len - 1] == 0)
+ r_len--;
+ }
+ /* Compare r << 1 with b. */
+ if (r_len > b_len)
+ goto increment_q;
+ {
+ size_t i;
+ for (i = b_len;;)
+ {
+ mp_limb_t r_i =
+ (i <= r_len && i > 0 ? r_ptr[i - 1] >> (GMP_LIMB_BITS - 1) : 0)
+ | (i < r_len ? r_ptr[i] << 1 : 0);
+ mp_limb_t b_i = (i < b_len ? b_ptr[i] : 0);
+ if (r_i > b_i)
+ goto increment_q;
+ if (r_i < b_i)
+ goto keep_q;
+ if (i == 0)
+ break;
+ i--;
+ }
+ }
+ if (q_len > 0 && ((q_ptr[0] & 1) != 0))
+ /* q is odd. */
+ increment_q:
+ {
+ size_t i;
+ for (i = 0; i < q_len; i++)
+ if (++(q_ptr[i]) != 0)
+ goto keep_q;
+ q_ptr[q_len++] = 1;
+ }
+ keep_q:
+ if (tmp_roomptr != NULL)
+ free (tmp_roomptr);
+ q->limbs = q_ptr;
+ q->nlimbs = q_len;
+ return roomptr;
+}
+
+/* Convert a bignum a >= 0, multiplied with 10^extra_zeroes, to decimal
+ representation.
+ Destroys the contents of a.
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+convert_to_decimal (mpn_t a, size_t extra_zeroes)
+{
+ mp_limb_t *a_ptr = a.limbs;
+ size_t a_len = a.nlimbs;
+ /* 0.03345 is slightly larger than log(2)/(9*log(10)). */
+ size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
+ /* We need extra_zeroes bytes for zeroes, followed by c_len bytes for the
+ digits of a, followed by 1 byte for the terminating NUL. */
+ char *c_ptr = (char *) malloc (xsum (xsum (extra_zeroes, c_len), 1));
+ if (c_ptr != NULL)
+ {
+ char *d_ptr = c_ptr;
+ for (; extra_zeroes > 0; extra_zeroes--)
+ *d_ptr++ = '0';
+ while (a_len > 0)
+ {
+ /* Divide a by 10^9, in-place. */
+ mp_limb_t remainder = 0;
+ mp_limb_t *ptr = a_ptr + a_len;
+ size_t count;
+ for (count = a_len; count > 0; count--)
+ {
+ mp_twolimb_t num =
+ ((mp_twolimb_t) remainder << GMP_LIMB_BITS) | *--ptr;
+ *ptr = num / 1000000000;
+ remainder = num % 1000000000;
+ }
+ /* Store the remainder as 9 decimal digits. */
+ for (count = 9; count > 0; count--)
+ {
+ *d_ptr++ = '0' + (remainder % 10);
+ remainder = remainder / 10;
+ }
+ /* Normalize a. */
+ if (a_ptr[a_len - 1] == 0)
+ a_len--;
+ }
+ /* Remove leading zeroes. */
+ while (d_ptr > c_ptr && d_ptr[-1] == '0')
+ d_ptr--;
+ /* But keep at least one zero. */
+ if (d_ptr == c_ptr)
+ *d_ptr++ = '0';
+ /* Terminate the string. */
+ *d_ptr = '\0';
+ }
+ return c_ptr;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_long_double (long double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ long double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (LDBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - LDBL_MANT_BIT) * (y * 2^LDBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^LDBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'long double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'long double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (LDBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (LDBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[LDBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = LDBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# if 0 /* On FreeBSD 6.1/x86, 'long double' numbers sometimes have excess
+ precision. */
+ if (!(y == 0.0L))
+ abort ();
+# endif
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - LDBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0:
+ write x as x = 2^e * m, where m is a bignum.
+ Return the allocated memory in case of success, NULL in case of memory
+ allocation failure. */
+static void *
+decode_double (double x, int *ep, mpn_t *mp)
+{
+ mpn_t m;
+ int exp;
+ double y;
+ size_t i;
+
+ /* Allocate memory for result. */
+ m.nlimbs = (DBL_MANT_BIT + GMP_LIMB_BITS - 1) / GMP_LIMB_BITS;
+ m.limbs = (mp_limb_t *) malloc (m.nlimbs * sizeof (mp_limb_t));
+ if (m.limbs == NULL)
+ return NULL;
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ /* x = 2^exp * y = 2^(exp - DBL_MANT_BIT) * (y * 2^DBL_MANT_BIT), and the
+ latter is an integer. */
+ /* Convert the mantissa (y * 2^DBL_MANT_BIT) to a sequence of limbs.
+ I'm not sure whether it's safe to cast a 'double' value between
+ 2^31 and 2^32 to 'unsigned int', therefore play safe and cast only
+ 'double' values between 0 and 2^16 (to 'unsigned int' or 'int',
+ doesn't matter). */
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) != 0
+# if (DBL_MANT_BIT % GMP_LIMB_BITS) > GMP_LIMB_BITS / 2
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % (GMP_LIMB_BITS / 2));
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+# else
+ {
+ mp_limb_t d;
+ y *= (mp_limb_t) 1 << (DBL_MANT_BIT % GMP_LIMB_BITS);
+ d = (int) y;
+ y -= d;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[DBL_MANT_BIT / GMP_LIMB_BITS] = d;
+ }
+# endif
+# endif
+ for (i = DBL_MANT_BIT / GMP_LIMB_BITS; i > 0; )
+ {
+ mp_limb_t hi, lo;
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ hi = (int) y;
+ y -= hi;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ y *= (mp_limb_t) 1 << (GMP_LIMB_BITS / 2);
+ lo = (int) y;
+ y -= lo;
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ m.limbs[--i] = (hi << (GMP_LIMB_BITS / 2)) | lo;
+ }
+ if (!(y == 0.0))
+ abort ();
+ /* Normalise. */
+ while (m.nlimbs > 0 && m.limbs[m.nlimbs - 1] == 0)
+ m.nlimbs--;
+ *mp = m;
+ *ep = exp - DBL_MANT_BIT;
+ return m.limbs;
+}
+
+# endif
+
+/* Assuming x = 2^e * m is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_decoded (int e, mpn_t m, void *memory, int n)
+{
+ int s;
+ size_t extra_zeroes;
+ unsigned int abs_n;
+ unsigned int abs_s;
+ mp_limb_t *pow5_ptr;
+ size_t pow5_len;
+ unsigned int s_limbs;
+ unsigned int s_bits;
+ mpn_t pow5;
+ mpn_t z;
+ void *z_memory;
+ char *digits;
+
+ if (memory == NULL)
+ return NULL;
+ /* x = 2^e * m, hence
+ y = round (2^e * 10^n * m) = round (2^(e+n) * 5^n * m)
+ = round (2^s * 5^n * m). */
+ s = e + n;
+ extra_zeroes = 0;
+ /* Factor out a common power of 10 if possible. */
+ if (s > 0 && n > 0)
+ {
+ extra_zeroes = (s < n ? s : n);
+ s -= extra_zeroes;
+ n -= extra_zeroes;
+ }
+ /* Here y = round (2^s * 5^n * m) * 10^extra_zeroes.
+ Before converting to decimal, we need to compute
+ z = round (2^s * 5^n * m). */
+ /* Compute 5^|n|, possibly shifted by |s| bits if n and s have the same
+ sign. 2.322 is slightly larger than log(5)/log(2). */
+ abs_n = (n >= 0 ? n : -n);
+ abs_s = (s >= 0 ? s : -s);
+ pow5_ptr = (mp_limb_t *) malloc (((int)(abs_n * (2.322f / GMP_LIMB_BITS)) + 1
+ + abs_s / GMP_LIMB_BITS + 1)
+ * sizeof (mp_limb_t));
+ if (pow5_ptr == NULL)
+ {
+ free (memory);
+ return NULL;
+ }
+ /* Initialize with 1. */
+ pow5_ptr[0] = 1;
+ pow5_len = 1;
+ /* Multiply with 5^|n|. */
+ if (abs_n > 0)
+ {
+ static mp_limb_t const small_pow5[13 + 1] =
+ {
+ 1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625,
+ 48828125, 244140625, 1220703125
+ };
+ unsigned int n13;
+ for (n13 = 0; n13 <= abs_n; n13 += 13)
+ {
+ mp_limb_t digit1 = small_pow5[n13 + 13 <= abs_n ? 13 : abs_n - n13];
+ size_t j;
+ mp_twolimb_t carry = 0;
+ for (j = 0; j < pow5_len; j++)
+ {
+ mp_limb_t digit2 = pow5_ptr[j];
+ carry += (mp_twolimb_t) digit1 * (mp_twolimb_t) digit2;
+ pow5_ptr[j] = (mp_limb_t) carry;
+ carry = carry >> GMP_LIMB_BITS;
+ }
+ if (carry > 0)
+ pow5_ptr[pow5_len++] = (mp_limb_t) carry;
+ }
+ }
+ s_limbs = abs_s / GMP_LIMB_BITS;
+ s_bits = abs_s % GMP_LIMB_BITS;
+ if (n >= 0 ? s >= 0 : s <= 0)
+ {
+ /* Multiply with 2^|s|. */
+ if (s_bits > 0)
+ {
+ mp_limb_t *ptr = pow5_ptr;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = pow5_len; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *ptr << s_bits;
+ *ptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ {
+ *ptr = (mp_limb_t) accu;
+ pow5_len++;
+ }
+ }
+ if (s_limbs > 0)
+ {
+ size_t count;
+ for (count = pow5_len; count > 0;)
+ {
+ count--;
+ pow5_ptr[s_limbs + count] = pow5_ptr[count];
+ }
+ for (count = s_limbs; count > 0;)
+ {
+ count--;
+ pow5_ptr[count] = 0;
+ }
+ pow5_len += s_limbs;
+ }
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* Multiply m with pow5. No division needed. */
+ z_memory = multiply (m, pow5, &z);
+ }
+ else
+ {
+ /* Divide m by pow5 and round. */
+ z_memory = divide (m, pow5, &z);
+ }
+ }
+ else
+ {
+ pow5.limbs = pow5_ptr;
+ pow5.nlimbs = pow5_len;
+ if (n >= 0)
+ {
+ /* n >= 0, s < 0.
+ Multiply m with pow5, then divide by 2^|s|. */
+ mpn_t numerator;
+ mpn_t denominator;
+ void *tmp_memory;
+ tmp_memory = multiply (m, pow5, &numerator);
+ if (tmp_memory == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ /* Construct 2^|s|. */
+ {
+ mp_limb_t *ptr = pow5_ptr + pow5_len;
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ ptr[i] = 0;
+ ptr[s_limbs] = (mp_limb_t) 1 << s_bits;
+ denominator.limbs = ptr;
+ denominator.nlimbs = s_limbs + 1;
+ }
+ z_memory = divide (numerator, denominator, &z);
+ free (tmp_memory);
+ }
+ else
+ {
+ /* n < 0, s > 0.
+ Multiply m with 2^s, then divide by pow5. */
+ mpn_t numerator;
+ mp_limb_t *num_ptr;
+ num_ptr = (mp_limb_t *) malloc ((m.nlimbs + s_limbs + 1)
+ * sizeof (mp_limb_t));
+ if (num_ptr == NULL)
+ {
+ free (pow5_ptr);
+ free (memory);
+ return NULL;
+ }
+ {
+ mp_limb_t *destptr = num_ptr;
+ {
+ size_t i;
+ for (i = 0; i < s_limbs; i++)
+ *destptr++ = 0;
+ }
+ if (s_bits > 0)
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ mp_twolimb_t accu = 0;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ {
+ accu += (mp_twolimb_t) *sourceptr++ << s_bits;
+ *destptr++ = (mp_limb_t) accu;
+ accu = accu >> GMP_LIMB_BITS;
+ }
+ if (accu > 0)
+ *destptr++ = (mp_limb_t) accu;
+ }
+ else
+ {
+ const mp_limb_t *sourceptr = m.limbs;
+ size_t count;
+ for (count = m.nlimbs; count > 0; count--)
+ *destptr++ = *sourceptr++;
+ }
+ numerator.limbs = num_ptr;
+ numerator.nlimbs = destptr - num_ptr;
+ }
+ z_memory = divide (numerator, pow5, &z);
+ free (num_ptr);
+ }
+ }
+ free (pow5_ptr);
+ free (memory);
+
+ /* Here y = round (x * 10^n) = z * 10^extra_zeroes. */
+
+ if (z_memory == NULL)
+ return NULL;
+ digits = convert_to_decimal (z, extra_zeroes);
+ free (z_memory);
+ return digits;
+}
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_long_double (long double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_long_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and >= 0, and n is an integer:
+ Returns the decimal representation of round (x * 10^n).
+ Return the allocated memory - containing the decimal digits in low-to-high
+ order, terminated with a NUL character - in case of success, NULL in case
+ of memory allocation failure. */
+static char *
+scale10_round_decimal_double (double x, int n)
+{
+ int e IF_LINT(= 0);
+ mpn_t m;
+ void *memory = decode_double (x, &e, &m);
+ return scale10_round_decimal_decoded (e, m, memory, n);
+}
+
+# endif
+
+# if NEED_PRINTF_LONG_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10l (long double x)
+{
+ int exp;
+ long double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexpl (x, &exp);
+ if (!(y >= 0.0L && y < 1.0L))
+ abort ();
+ if (y == 0.0L)
+ return INT_MIN;
+ if (y < 0.5L)
+ {
+ while (y < (1.0L / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0L * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0L / (1 << 16)))
+ {
+ y *= 1.0L * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0L / (1 << 8)))
+ {
+ y *= 1.0L * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0L / (1 << 4)))
+ {
+ y *= 1.0L * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0L / (1 << 2)))
+ {
+ y *= 1.0L * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0L / (1 << 1)))
+ {
+ y *= 1.0L * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5L && y < 1.0L))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+# if NEED_PRINTF_DOUBLE
+
+/* Assuming x is finite and > 0:
+ Return an approximation for n with 10^n <= x < 10^(n+1).
+ The approximation is usually the right n, but may be off by 1 sometimes. */
+static int
+floorlog10 (double x)
+{
+ int exp;
+ double y;
+ double z;
+ double l;
+
+ /* Split into exponential part and mantissa. */
+ y = frexp (x, &exp);
+ if (!(y >= 0.0 && y < 1.0))
+ abort ();
+ if (y == 0.0)
+ return INT_MIN;
+ if (y < 0.5)
+ {
+ while (y < (1.0 / (1 << (GMP_LIMB_BITS / 2)) / (1 << (GMP_LIMB_BITS / 2))))
+ {
+ y *= 1.0 * (1 << (GMP_LIMB_BITS / 2)) * (1 << (GMP_LIMB_BITS / 2));
+ exp -= GMP_LIMB_BITS;
+ }
+ if (y < (1.0 / (1 << 16)))
+ {
+ y *= 1.0 * (1 << 16);
+ exp -= 16;
+ }
+ if (y < (1.0 / (1 << 8)))
+ {
+ y *= 1.0 * (1 << 8);
+ exp -= 8;
+ }
+ if (y < (1.0 / (1 << 4)))
+ {
+ y *= 1.0 * (1 << 4);
+ exp -= 4;
+ }
+ if (y < (1.0 / (1 << 2)))
+ {
+ y *= 1.0 * (1 << 2);
+ exp -= 2;
+ }
+ if (y < (1.0 / (1 << 1)))
+ {
+ y *= 1.0 * (1 << 1);
+ exp -= 1;
+ }
+ }
+ if (!(y >= 0.5 && y < 1.0))
+ abort ();
+ /* Compute an approximation for l = log2(x) = exp + log2(y). */
+ l = exp;
+ z = y;
+ if (z < 0.70710678118654752444)
+ {
+ z *= 1.4142135623730950488;
+ l -= 0.5;
+ }
+ if (z < 0.8408964152537145431)
+ {
+ z *= 1.1892071150027210667;
+ l -= 0.25;
+ }
+ if (z < 0.91700404320467123175)
+ {
+ z *= 1.0905077326652576592;
+ l -= 0.125;
+ }
+ if (z < 0.9576032806985736469)
+ {
+ z *= 1.0442737824274138403;
+ l -= 0.0625;
+ }
+ /* Now 0.95 <= z <= 1.01. */
+ z = 1 - z;
+ /* log2(1-z) = 1/log(2) * (- z - z^2/2 - z^3/3 - z^4/4 - ...)
+ Four terms are enough to get an approximation with error < 10^-7. */
+ l -= 1.4426950408889634074 * z * (1.0 + z * (0.5 + z * ((1.0 / 3) + z * 0.25)));
+ /* Finally multiply with log(2)/log(10), yields an approximation for
+ log10(x). */
+ l *= 0.30102999566398119523;
+ /* Round down to the next integer. */
+ return (int) l + (l < 0 ? -1 : 0);
+}
+
+# endif
+
+/* Tests whether a string of digits consists of exactly PRECISION zeroes and
+ a single '1' digit. */
+static int
+is_borderline (const char *digits, size_t precision)
+{
+ for (; precision > 0; precision--, digits++)
+ if (*digits != '0')
+ return 0;
+ if (*digits != '1')
+ return 0;
+ digits++;
+ return *digits == '\0';
+}
+
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
+
+/* Use a different function name, to make it possible that the 'wchar_t'
+ parametrization and the 'char' parametrization get compiled in the same
+ translation unit. */
+# if WIDE_CHAR_VERSION
+# define MAX_ROOM_NEEDED wmax_room_needed
+# else
+# define MAX_ROOM_NEEDED max_room_needed
+# endif
+
+/* Returns the number of TCHAR_T units needed as temporary space for the result
+ of sprintf or SNPRINTF of a single conversion directive. */
+static size_t
+MAX_ROOM_NEEDED (const arguments *ap, size_t arg_index, FCHAR_T conversion,
+ arg_type type, int flags, size_t width, int has_precision,
+ size_t precision, int pad_ourselves)
+{
+ size_t tmp_length;
+
+ switch (conversion)
+ {
+ case 'd': case 'i': case 'u':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.30103 /* binary -> decimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Multiply by 2, as an estimate for FLAG_GROUP. */
+ tmp_length = xsum (tmp_length, tmp_length);
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'o':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.333334 /* binary -> octal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 1, to account for a leading sign. */
+ tmp_length = xsum (tmp_length, 1);
+ break;
+
+ case 'x': case 'X':
+ if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+ tmp_length =
+ (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Add 2, to account for a leading sign or alternate form. */
+ tmp_length = xsum (tmp_length, 2);
+ break;
+
+ case 'f': case 'F':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ else
+ tmp_length =
+ (unsigned int) (DBL_MAX_EXP
+ * 0.30103 /* binary -> decimal */
+ * 2 /* estimate for FLAG_GROUP */
+ )
+ + 1 /* turn floor into ceil */
+ + 10; /* sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'e': case 'E': case 'g': case 'G':
+ tmp_length =
+ 12; /* sign, decimal point, exponent etc. */
+ tmp_length = xsum (tmp_length, precision);
+ break;
+
+ case 'a': case 'A':
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) (LDBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) (DBL_DIG
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+ break;
+
+ case 'c':
+# if HAVE_WINT_T && !WIDE_CHAR_VERSION
+ if (type == TYPE_WIDE_CHAR)
+ {
+ tmp_length = MB_CUR_MAX;
+# if ENABLE_WCHAR_FALLBACK
+ if (tmp_length < (sizeof (wchar_t) > 2 ? 10 : 6))
+ tmp_length = (sizeof (wchar_t) > 2 ? 10 : 6);
+# endif
+ }
+ else
+# endif
+ tmp_length = 1;
+ break;
+
+ case 's':
+# if HAVE_WCHAR_T
+ if (type == TYPE_WIDE_STRING)
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %ls in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the array, the array shall contain a null wide character."
+ So if there is a precision, we must not use wcslen. */
+ const wchar_t *arg = ap->arg[arg_index].a.a_wide_string;
+
+ if (has_precision)
+ tmp_length = local_wcsnlen (arg, precision);
+ else
+ tmp_length = local_wcslen (arg);
+# else
+ /* ISO C says about %ls in fprintf:
+ "If a precision is specified, no more than that many bytes are
+ written (including shift sequences, if any), and the array
+ shall contain a null wide character if, to equal the multibyte
+ character sequence length given by the precision, the function
+ would need to access a wide character one past the end of the
+ array."
+ So if there is a precision, we must not use wcslen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# endif
+ }
+ else
+# endif
+ {
+# if WIDE_CHAR_VERSION
+ /* ISO C says about %s in fwprintf:
+ "If the precision is not specified or is greater than the size
+ of the converted array, the converted array shall contain a
+ null wide character."
+ So if there is a precision, we must not use strlen. */
+ /* This case has already been handled separately in VASNPRINTF. */
+ abort ();
+# else
+ /* ISO C says about %s in fprintf:
+ "If the precision is not specified or greater than the size of
+ the array, the array shall contain a null character."
+ So if there is a precision, we must not use strlen. */
+ const char *arg = ap->arg[arg_index].a.a_string;
+
+ if (has_precision)
+ tmp_length = local_strnlen (arg, precision);
+ else
+ tmp_length = strlen (arg);
+# endif
+ }
+ break;
+
+ case 'p':
+ tmp_length =
+ (unsigned int) (sizeof (void *) * CHAR_BIT
+ * 0.25 /* binary -> hexadecimal */
+ )
+ + 1 /* turn floor into ceil */
+ + 2; /* account for leading 0x */
+ break;
+
+ default:
+ abort ();
+ }
+
+ if (!pad_ourselves)
+ {
+# if ENABLE_UNISTDIO
+ /* Padding considers the number of characters, therefore the number of
+ elements after padding may be
+ > max (tmp_length, width)
+ but is certainly
+ <= tmp_length + width. */
+ tmp_length = xsum (tmp_length, width);
+# else
+ /* Padding considers the number of elements, says POSIX. */
+ if (tmp_length < width)
+ tmp_length = width;
+# endif
+ }
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ return tmp_length;
+}
+
+#endif
+
+DCHAR_T *
+VASNPRINTF (DCHAR_T *resultbuf, size_t *lengthp,
+ const FCHAR_T *format, va_list args)
+{
+ DIRECTIVES d;
+ arguments a;
+
+ if (PRINTF_PARSE (format, &d, &a) < 0)
+ /* errno is already set. */
+ return NULL;
+
+#define CLEANUP() \
+ if (d.dir != d.direct_alloc_dir) \
+ free (d.dir); \
+ if (a.arg != a.direct_alloc_arg) \
+ free (a.arg);
+
+ if (PRINTF_FETCHARGS (args, &a) < 0)
+ {
+ CLEANUP ();
+ errno = EINVAL;
+ return NULL;
+ }
+
+ {
+ size_t buf_neededlength;
+ TCHAR_T *buf;
+ TCHAR_T *buf_malloced;
+ const FCHAR_T *cp;
+ size_t i;
+ DIRECTIVE *dp;
+ /* Output string accumulator. */
+ DCHAR_T *result;
+ size_t allocated;
+ size_t length;
+
+ /* Allocate a small buffer that will hold a directive passed to
+ sprintf or snprintf. */
+ buf_neededlength =
+ xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+ if (buf_neededlength < 4000 / sizeof (TCHAR_T))
+ {
+ buf = (TCHAR_T *) alloca (buf_neededlength * sizeof (TCHAR_T));
+ buf_malloced = NULL;
+ }
+ else
+#endif
+ {
+ size_t buf_memsize = xtimes (buf_neededlength, sizeof (TCHAR_T));
+ if (size_overflow_p (buf_memsize))
+ goto out_of_memory_1;
+ buf = (TCHAR_T *) malloc (buf_memsize);
+ if (buf == NULL)
+ goto out_of_memory_1;
+ buf_malloced = buf;
+ }
+
+ if (resultbuf != NULL)
+ {
+ result = resultbuf;
+ allocated = *lengthp;
+ }
+ else
+ {
+ result = NULL;
+ allocated = 0;
+ }
+ length = 0;
+ /* Invariants:
+ result is either == resultbuf or == NULL or malloc-allocated.
+ If length > 0, then result != NULL. */
+
+ /* Ensures that allocated >= needed. Aborts through a jump to
+ out_of_memory if needed is SIZE_MAX or otherwise too big. */
+#define ENSURE_ALLOCATION(needed) \
+ if ((needed) > allocated) \
+ { \
+ size_t memory_size; \
+ DCHAR_T *memory; \
+ \
+ allocated = (allocated > 0 ? xtimes (allocated, 2) : 12); \
+ if ((needed) > allocated) \
+ allocated = (needed); \
+ memory_size = xtimes (allocated, sizeof (DCHAR_T)); \
+ if (size_overflow_p (memory_size)) \
+ goto out_of_memory; \
+ if (result == resultbuf || result == NULL) \
+ memory = (DCHAR_T *) malloc (memory_size); \
+ else \
+ memory = (DCHAR_T *) realloc (result, memory_size); \
+ if (memory == NULL) \
+ goto out_of_memory; \
+ if (result == resultbuf && length > 0) \
+ DCHAR_CPY (memory, result, length); \
+ result = memory; \
+ }
+
+ for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+ {
+ if (cp != dp->dir_start)
+ {
+ size_t n = dp->dir_start - cp;
+ size_t augmented_length = xsum (length, n);
+
+ ENSURE_ALLOCATION (augmented_length);
+ /* This copies a piece of FCHAR_T[] into a DCHAR_T[]. Here we
+ need that the format string contains only ASCII characters
+ if FCHAR_T and DCHAR_T are not the same type. */
+ if (sizeof (FCHAR_T) == sizeof (DCHAR_T))
+ {
+ DCHAR_CPY (result + length, (const DCHAR_T *) cp, n);
+ length = augmented_length;
+ }
+ else
+ {
+ do
+ result[length++] = *cp++;
+ while (--n > 0);
+ }
+ }
+ if (i == d.count)
+ break;
+
+ /* Execute a single directive. */
+ if (dp->conversion == '%')
+ {
+ size_t augmented_length;
+
+ if (!(dp->arg_index == ARG_NONE))
+ abort ();
+ augmented_length = xsum (length, 1);
+ ENSURE_ALLOCATION (augmented_length);
+ result[length] = '%';
+ length = augmented_length;
+ }
+ else
+ {
+ if (!(dp->arg_index != ARG_NONE))
+ abort ();
+
+ if (dp->conversion == 'n')
+ {
+ switch (a.arg[dp->arg_index].type)
+ {
+ case TYPE_COUNT_SCHAR_POINTER:
+ *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+ break;
+ case TYPE_COUNT_SHORT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+ break;
+ case TYPE_COUNT_INT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+ break;
+ case TYPE_COUNT_LONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+ break;
+ case TYPE_COUNT_LONGLONGINT_POINTER:
+ *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+ break;
+ default:
+ abort ();
+ }
+ }
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ else if (dp->conversion == 'U')
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_U8_STRING:
+ {
+ const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;
+ const uint8_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u8_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u8_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT8_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-8 to locale encoding. */
+ converted =
+ u8_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-8 to UTF-16/UTF-32. */
+ converted =
+ U8_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U16_STRING:
+ {
+ const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;
+ const uint16_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u16_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u16_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT16_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-16 to locale encoding. */
+ converted =
+ u16_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-16 to UTF-8/UTF-32. */
+ converted =
+ U16_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ case TYPE_U32_STRING:
+ {
+ const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;
+ const uint32_t *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only PRECISION characters, from the left. */
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of
+ characters. */
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count = u32_strmblen (arg_end);
+ if (count == 0)
+ break;
+ if (count < 0)
+ {
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + u32_strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_UINT32_T
+ {
+ size_t n = arg_end - arg;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_CPY (result + length, arg, n);
+ length += n;
+ }
+# else
+ { /* Convert. */
+ DCHAR_T *converted = result + length;
+ size_t converted_len = allocated - length;
+# if DCHAR_IS_TCHAR
+ /* Convert from UTF-32 to locale encoding. */
+ converted =
+ u32_conv_to_encoding (locale_charset (),
+ iconveh_question_mark,
+ arg, arg_end - arg, NULL,
+ converted, &converted_len);
+# else
+ /* Convert from UTF-32 to UTF-8/UTF-16. */
+ converted =
+ U32_TO_DCHAR (arg, arg_end - arg,
+ converted, &converted_len);
+# endif
+ if (converted == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ if (converted != result + length)
+ {
+ ENSURE_ALLOCATION (xsum (length, converted_len));
+ DCHAR_CPY (result + length, converted, converted_len);
+ free (converted);
+ }
+ length += converted_len;
+ }
+# endif
+
+ if (characters < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+#endif
+#if (!USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || (NEED_PRINTF_DIRECTIVE_LS && !defined IN_LIBINTL) || ENABLE_WCHAR_FALLBACK) && HAVE_WCHAR_T
+ else if (dp->conversion == 's'
+# if WIDE_CHAR_VERSION
+ && a.arg[dp->arg_index].type != TYPE_WIDE_STRING
+# else
+ && a.arg[dp->arg_index].type == TYPE_WIDE_STRING
+# endif
+ )
+ {
+ /* The normal handling of the 's' directive below requires
+ allocating a temporary buffer. The determination of its
+ length (tmp_length), in the case when a precision is
+ specified, below requires a conversion between a char[]
+ string and a wchar_t[] wide string. It could be done, but
+ we have no guarantee that the implementation of sprintf will
+ use the exactly same algorithm. Without this guarantee, it
+ is possible to have buffer overrun bugs. In order to avoid
+ such bugs, we implement the entire processing of the 's'
+ directive ourselves. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+ int has_precision;
+ size_t precision;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+# if WIDE_CHAR_VERSION
+ /* %s in vasnwprintf. See the specification of fwprintf. */
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ const char *arg_end;
+ size_t characters;
+
+ if (has_precision)
+ {
+ /* Use only as many bytes as needed to produce PRECISION
+ wide characters, from the left. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (; precision > 0; precision--)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else if (has_width)
+ {
+ /* Use the entire string, and count the number of wide
+ characters. */
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrlen (arg_end, MB_CUR_MAX, &state);
+# else
+ count = mblen (arg_end, MB_CUR_MAX);
+# endif
+ if (count == 0)
+ /* Found the terminating NUL. */
+ break;
+ if (count < 0)
+ {
+ /* Invalid or incomplete multibyte character. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end += count;
+ characters++;
+ }
+ }
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + strlen (arg);
+ /* The number of characters doesn't matter. */
+ characters = 0;
+ }
+
+ if (characters < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+ if (has_precision || has_width)
+ {
+ /* We know the number of wide characters in advance. */
+ size_t remaining;
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; remaining--)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ result[length++] = wc;
+ arg += count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_MBRTOWC
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ wchar_t wc;
+ int count;
+# if HAVE_MBRTOWC
+ count = mbrtowc (&wc, arg, arg_end - arg, &state);
+# else
+ count = mbtowc (&wc, arg, arg_end - arg);
+# endif
+ if (count <= 0)
+ /* mbrtowc not consistent with mbrlen, or mbtowc
+ not consistent with mblen. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length++] = wc;
+ arg += count;
+ }
+ }
+
+ if (characters < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - characters;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# else
+ /* %ls in vasnprintf. See the specification of fprintf. */
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ const wchar_t *arg_end;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ verify (sizeof (TCHAR_T) == 1);
+ TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+ if (has_precision)
+ {
+ /* Use only as many wide characters as needed to produce
+ at most PRECISION bytes, from the left. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ while (precision > 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+ count = local_wcrtomb (cbuf, *arg_end, &state);
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ if (precision < (unsigned int) count)
+ break;
+ arg_end++;
+ characters += count;
+ precision -= count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else if (has_width)
+# else
+ else
+# endif
+ {
+ /* Use the entire string, and count the number of
+ bytes. */
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ arg_end = arg;
+ characters = 0;
+ for (;;)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg_end == 0)
+ /* Found the terminating null wide character. */
+ break;
+ count = local_wcrtomb (cbuf, *arg_end, &state);
+ if (count < 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ arg_end++;
+ characters += count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* Use the entire string. */
+ arg_end = arg + local_wcslen (arg);
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ tmpsrc = (TCHAR_T *) malloc (characters * sizeof (TCHAR_T));
+ if (tmpsrc == NULL)
+ goto out_of_memory;
+ {
+ TCHAR_T *tmpptr = tmpsrc;
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpptr, cbuf, count);
+ tmpptr += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ free (tmpsrc);
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ free (tmpsrc);
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (w < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_precision || has_width)
+ {
+ /* We know the number of bytes in advance. */
+ size_t remaining;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ ENSURE_ALLOCATION (xsum (length, characters));
+ for (remaining = characters; remaining > 0; )
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ remaining -= count;
+ }
+ if (!(arg == arg_end))
+ abort ();
+ }
+ else
+ {
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+ while (arg < arg_end)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+
+ if (*arg == 0)
+ abort ();
+ count = local_wcrtomb (cbuf, *arg, &state);
+ if (count <= 0)
+ {
+ /* Cannot convert. */
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EILSEQ;
+ return NULL;
+ }
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ arg++;
+ }
+ }
+# else
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (w < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+# endif
+ }
+#endif
+#if ENABLE_WCHAR_FALLBACK && HAVE_WINT_T && !WIDE_CHAR_VERSION
+ else if (dp->conversion == 'c'
+ && a.arg[dp->arg_index].type == TYPE_WIDE_CHAR)
+ {
+ /* Implement the 'lc' directive ourselves, in order to provide
+ the fallback that avoids EILSEQ. */
+ int flags = dp->flags;
+ int has_width;
+ size_t width;
+
+ has_width = 0;
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ has_width = 1;
+ }
+
+ /* %lc in vasnprintf. See the specification of fprintf. */
+ {
+ wchar_t arg = (wchar_t) a.arg[dp->arg_index].a.a_wide_char;
+ size_t characters;
+# if !DCHAR_IS_TCHAR
+ /* This code assumes that TCHAR_T is 'char'. */
+ verify (sizeof (TCHAR_T) == 1);
+ TCHAR_T tmpsrc[64]; /* Assume MB_CUR_MAX <= 64. */
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+# endif
+ size_t w;
+
+# if DCHAR_IS_TCHAR
+ if (has_width)
+# endif
+ {
+ /* Count the number of bytes. */
+ characters = 0;
+ if (arg != 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count < 0)
+ /* Inconsistency. */
+ abort ();
+ characters = count;
+ }
+ }
+# if DCHAR_IS_TCHAR
+ else
+ {
+ /* The number of bytes doesn't matter. */
+ characters = 0;
+ }
+# endif
+
+# if !DCHAR_IS_TCHAR
+ /* Convert the string into a piece of temporary memory. */
+ if (characters > 0) /* implies arg != 0 */
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ memcpy (tmpsrc, cbuf, count);
+ }
+
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, characters,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+# endif
+
+ if (has_width)
+ {
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, characters);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = characters;
+# endif
+ }
+ else
+ /* w doesn't matter. */
+ w = 0;
+
+ if (w < width && !(dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+
+# if DCHAR_IS_TCHAR
+ if (has_width)
+ {
+ /* We know the number of bytes in advance. */
+ ENSURE_ALLOCATION (xsum (length, characters));
+ if (characters > 0) /* implies arg != 0 */
+ {
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (result + length, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ length += count;
+ }
+ }
+ else
+ {
+ if (arg != 0)
+ {
+ char cbuf[64]; /* Assume MB_CUR_MAX <= 64. */
+ int count;
+# if HAVE_WCRTOMB && !defined GNULIB_defined_mbstate_t
+ mbstate_t state;
+ memset (&state, '\0', sizeof (mbstate_t));
+# endif
+
+ count = local_wcrtomb (cbuf, arg, &state);
+ if (count <= 0)
+ /* Inconsistency. */
+ abort ();
+ ENSURE_ALLOCATION (xsum (length, count));
+ memcpy (result + length, cbuf, count);
+ length += count;
+ }
+ }
+# else
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ length += tmpdst_len;
+# endif
+
+ if (w < width && (dp->flags & FLAG_LEFT))
+ {
+ size_t n = width - w;
+ ENSURE_ALLOCATION (xsum (length, n));
+ DCHAR_SET (result + length, ' ', n);
+ length += n;
+ }
+ }
+ }
+#endif
+#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'a' || dp->conversion == 'A')
+# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# endif
+ )
+# endif
+ )
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+ size_t width;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ size_t count;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* Allocate a temporary buffer of sufficient size. */
+ if (type == TYPE_LONGDOUBLE)
+ tmp_length =
+ (unsigned int) ((LDBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ else
+ tmp_length =
+ (unsigned int) ((DBL_DIG + 1)
+ * 0.831 /* decimal -> hexadecimal */
+ )
+ + 1; /* turn floor into ceil */
+ if (tmp_length < precision)
+ tmp_length = precision;
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+ if (type == TYPE_LONGDOUBLE)
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ long double mantissa;
+
+ if (arg > 0.0L)
+ mantissa = printf_frexpl (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0L;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ long double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5L : tail > 0.5L)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0L;
+ }
+ if (tail != 0.0L)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625L;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0L || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0L)
+ {
+ mantissa *= 16.0L;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+# else
+ abort ();
+# endif
+ }
+ else
+ {
+# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion == 'A')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+ int exponent;
+ double mantissa;
+
+ if (arg > 0.0)
+ mantissa = printf_frexp (arg, &exponent);
+ else
+ {
+ exponent = 0;
+ mantissa = 0.0;
+ }
+
+ if (has_precision
+ && precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)
+ {
+ /* Round the mantissa. */
+ double tail = mantissa;
+ size_t q;
+
+ for (q = precision; ; q--)
+ {
+ int digit = (int) tail;
+ tail -= digit;
+ if (q == 0)
+ {
+ if (digit & 1 ? tail >= 0.5 : tail > 0.5)
+ tail = 1 - tail;
+ else
+ tail = - tail;
+ break;
+ }
+ tail *= 16.0;
+ }
+ if (tail != 0.0)
+ for (q = precision; q > 0; q--)
+ tail *= 0.0625;
+ mantissa += tail;
+ }
+
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ {
+ int digit;
+
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = '0' + digit;
+ if ((flags & FLAG_ALT)
+ || mantissa > 0.0 || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ /* This loop terminates because we assume
+ that FLT_RADIX is a power of 2. */
+ while (mantissa > 0.0)
+ {
+ mantissa *= 16.0;
+ digit = (int) mantissa;
+ mantissa -= digit;
+ *p++ = digit
+ + (digit < 10
+ ? '0'
+ : dp->conversion - 10);
+ if (precision > 0)
+ precision--;
+ }
+ while (precision > 0)
+ {
+ *p++ = '0';
+ precision--;
+ }
+ }
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ }
+# else
+ abort ();
+# endif
+ }
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ count = p - tmp;
+
+ if (count < width)
+ {
+ size_t pad = width - count;
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+#endif
+#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL
+ else if ((dp->conversion == 'f' || dp->conversion == 'F'
+ || dp->conversion == 'e' || dp->conversion == 'E'
+ || dp->conversion == 'g' || dp->conversion == 'G'
+ || dp->conversion == 'a' || dp->conversion == 'A')
+ && (0
+# if NEED_PRINTF_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_DOUBLE
+# elif NEED_PRINTF_INFINITE_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_DOUBLE
+ /* The systems (mingw) which produce wrong output
+ for Inf, -Inf, and NaN also do so for -0.0.
+ Therefore we treat this case here as well. */
+ && is_infinite_or_zero (a.arg[dp->arg_index].a.a_double))
+# endif
+# if NEED_PRINTF_LONG_DOUBLE
+ || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+# elif NEED_PRINTF_INFINITE_LONG_DOUBLE
+ || (a.arg[dp->arg_index].type == TYPE_LONGDOUBLE
+ /* Some systems produce wrong output for Inf,
+ -Inf, and NaN. Some systems in this category
+ (IRIX 5.3) also do so for -0.0. Therefore we
+ treat this case here as well. */
+ && is_infinite_or_zerol (a.arg[dp->arg_index].a.a_longdouble))
+# endif
+ ))
+ {
+# if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE)
+ arg_type type = a.arg[dp->arg_index].type;
+# endif
+ int flags = dp->flags;
+ size_t width;
+ size_t count;
+ int has_precision;
+ size_t precision;
+ size_t tmp_length;
+ DCHAR_T tmpbuf[700];
+ DCHAR_T *tmp;
+ DCHAR_T *pad_ptr;
+ DCHAR_T *p;
+
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+ }
+
+ has_precision = 0;
+ precision = 0;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+
+ /* POSIX specifies the default precision to be 6 for %f, %F,
+ %e, %E, but not for %g, %G. Implementations appear to use
+ the same default precision also for %g, %G. But for %a, %A,
+ the default precision is 0. */
+ if (!has_precision)
+ if (!(dp->conversion == 'a' || dp->conversion == 'A'))
+ precision = 6;
+
+ /* Allocate a temporary buffer of sufficient size. */
+# if NEED_PRINTF_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : DBL_DIG + 1);
+# elif NEED_PRINTF_INFINITE_DOUBLE && NEED_PRINTF_LONG_DOUBLE
+ tmp_length = (type == TYPE_LONGDOUBLE ? LDBL_DIG + 1 : 0);
+# elif NEED_PRINTF_LONG_DOUBLE
+ tmp_length = LDBL_DIG + 1;
+# elif NEED_PRINTF_DOUBLE
+ tmp_length = DBL_DIG + 1;
+# else
+ tmp_length = 0;
+# endif
+ if (tmp_length < precision)
+ tmp_length = precision;
+# if NEED_PRINTF_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ if (!(isnanl (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10l (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+# if NEED_PRINTF_DOUBLE
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+ if (type == TYPE_DOUBLE)
+# endif
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ if (!(isnand (arg) || arg + arg == arg))
+ {
+ /* arg is finite and nonzero. */
+ int exponent = floorlog10 (arg < 0 ? -arg : arg);
+ if (exponent >= 0 && tmp_length < exponent + precision)
+ tmp_length = exponent + precision;
+ }
+ }
+# endif
+ /* Account for sign, decimal point etc. */
+ tmp_length = xsum (tmp_length, 12);
+
+ if (tmp_length < width)
+ tmp_length = width;
+
+ tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (DCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+
+ pad_ptr = NULL;
+ p = tmp;
+
+# if NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ if (type == TYPE_LONGDOUBLE)
+# endif
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+
+ if (isnanl (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+ DECL_LONG_DOUBLE_ROUNDING
+
+ BEGIN_LONG_DOUBLE_ROUNDING ();
+
+ if (signbit (arg)) /* arg < 0.0L or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0L && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_LONG_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_long_double (arg, precision);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0L)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0L)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0L. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10l (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ {
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_long_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ END_LONG_DOUBLE_ROUNDING ();
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t ecount = exponent + 1;
+ /* Note: count <= precision = ndigits. */
+ for (; ecount > 0; ecount--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t ecount = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; ecount > 0; ecount--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ { '%', '+', '.', '2', 'd', '\0' };
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, "%+.2d", exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, "%+.2d", exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0L))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'a' || dp->conversion == 'A')
+ {
+ *p++ = '0';
+ *p++ = dp->conversion - 'A' + 'X';
+ pad_ptr = p;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion - 'A' + 'P';
+ *p++ = '+';
+ *p++ = '0';
+ }
+ else
+ abort ();
+# endif
+ }
+
+ END_LONG_DOUBLE_ROUNDING ();
+ }
+ }
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ else
+# endif
+# endif
+# if NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+
+ if (isnand (arg))
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'N'; *p++ = 'A'; *p++ = 'N';
+ }
+ else
+ {
+ *p++ = 'n'; *p++ = 'a'; *p++ = 'n';
+ }
+ }
+ else
+ {
+ int sign = 0;
+
+ if (signbit (arg)) /* arg < 0.0 or negative zero */
+ {
+ sign = -1;
+ arg = -arg;
+ }
+
+ if (sign < 0)
+ *p++ = '-';
+ else if (flags & FLAG_SHOWSIGN)
+ *p++ = '+';
+ else if (flags & FLAG_SPACE)
+ *p++ = ' ';
+
+ if (arg > 0.0 && arg + arg == arg)
+ {
+ if (dp->conversion >= 'A' && dp->conversion <= 'Z')
+ {
+ *p++ = 'I'; *p++ = 'N'; *p++ = 'F';
+ }
+ else
+ {
+ *p++ = 'i'; *p++ = 'n'; *p++ = 'f';
+ }
+ }
+ else
+ {
+# if NEED_PRINTF_DOUBLE
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ char *digits;
+ size_t ndigits;
+
+ digits =
+ scale10_round_decimal_double (arg, precision);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits > precision)
+ do
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ while (ndigits > precision);
+ else
+ *p++ = '0';
+ /* Here ndigits <= precision. */
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > ndigits; precision--)
+ *p++ = '0';
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ int exponent;
+
+ if (arg == 0.0)
+ {
+ exponent = 0;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision + 1)
+ break;
+ if (ndigits < precision
+ || ndigits > precision + 2)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits == precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision+1. */
+ if (is_borderline (digits, precision))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)precision - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision + 1)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision+1. */
+
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > 0)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+
+ free (digits);
+ }
+
+ *p++ = dp->conversion; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ if (precision == 0)
+ precision = 1;
+ /* precision >= 1. */
+
+ if (arg == 0.0)
+ /* The exponent is 0, >= -4, < precision.
+ Use fixed-point notation. */
+ {
+ size_t ndigits = precision;
+ /* Number of trailing zeroes that have to be
+ dropped. */
+ size_t nzeroes =
+ (flags & FLAG_ALT ? 0 : precision - 1);
+
+ --ndigits;
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = '0';
+ }
+ }
+ }
+ else
+ {
+ /* arg > 0.0. */
+ int exponent;
+ int adjusted;
+ char *digits;
+ size_t ndigits;
+ size_t nzeroes;
+
+ exponent = floorlog10 (arg);
+ adjusted = 0;
+ for (;;)
+ {
+ digits =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent);
+ if (digits == NULL)
+ goto out_of_memory;
+ ndigits = strlen (digits);
+
+ if (ndigits == precision)
+ break;
+ if (ndigits < precision - 1
+ || ndigits > precision + 1)
+ /* The exponent was not guessed
+ precisely enough. */
+ abort ();
+ if (adjusted)
+ /* None of two values of exponent is
+ the right one. Prevent an endless
+ loop. */
+ abort ();
+ free (digits);
+ if (ndigits < precision)
+ exponent -= 1;
+ else
+ exponent += 1;
+ adjusted = 1;
+ }
+ /* Here ndigits = precision. */
+ if (is_borderline (digits, precision - 1))
+ {
+ /* Maybe the exponent guess was too high
+ and a smaller exponent can be reached
+ by turning a 10...0 into 9...9x. */
+ char *digits2 =
+ scale10_round_decimal_double (arg,
+ (int)(precision - 1) - exponent + 1);
+ if (digits2 == NULL)
+ {
+ free (digits);
+ goto out_of_memory;
+ }
+ if (strlen (digits2) == precision)
+ {
+ free (digits);
+ digits = digits2;
+ exponent -= 1;
+ }
+ else
+ free (digits2);
+ }
+ /* Here ndigits = precision. */
+
+ /* Determine the number of trailing zeroes
+ that have to be dropped. */
+ nzeroes = 0;
+ if ((flags & FLAG_ALT) == 0)
+ while (nzeroes < ndigits
+ && digits[nzeroes] == '0')
+ nzeroes++;
+
+ /* The exponent is now determined. */
+ if (exponent >= -4
+ && exponent < (long)precision)
+ {
+ /* Fixed-point notation:
+ max(exponent,0)+1 digits, then the
+ decimal point, then the remaining
+ digits without trailing zeroes. */
+ if (exponent >= 0)
+ {
+ size_t ecount = exponent + 1;
+ /* Note: ecount <= precision = ndigits. */
+ for (; ecount > 0; ecount--)
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ size_t ecount = -exponent - 1;
+ *p++ = '0';
+ *p++ = decimal_point_char ();
+ for (; ecount > 0; ecount--)
+ *p++ = '0';
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ }
+ else
+ {
+ /* Exponential notation. */
+ *p++ = digits[--ndigits];
+ if ((flags & FLAG_ALT) || ndigits > nzeroes)
+ {
+ *p++ = decimal_point_char ();
+ while (ndigits > nzeroes)
+ {
+ --ndigits;
+ *p++ = digits[ndigits];
+ }
+ }
+ *p++ = dp->conversion - 'G' + 'E'; /* 'e' or 'E' */
+# if WIDE_CHAR_VERSION
+ {
+ static const wchar_t decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ { '%', '+', '.', '3', 'd', '\0' };
+# else
+ { '%', '+', '.', '2', 'd', '\0' };
+# endif
+ SNPRINTF (p, 6 + 1, decimal_format, exponent);
+ }
+ while (*p != '\0')
+ p++;
+# else
+ {
+ static const char decimal_format[] =
+ /* Produce the same number of exponent digits
+ as the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ "%+.3d";
+# else
+ "%+.2d";
+# endif
+ if (sizeof (DCHAR_T) == 1)
+ {
+ sprintf ((char *) p, decimal_format, exponent);
+ while (*p != '\0')
+ p++;
+ }
+ else
+ {
+ char expbuf[6 + 1];
+ const char *ep;
+ sprintf (expbuf, decimal_format, exponent);
+ for (ep = expbuf; (*p = *ep) != '\0'; ep++)
+ p++;
+ }
+ }
+# endif
+ }
+
+ free (digits);
+ }
+ }
+ else
+ abort ();
+# else
+ /* arg is finite. */
+ if (!(arg == 0.0))
+ abort ();
+
+ pad_ptr = p;
+
+ if (dp->conversion == 'f' || dp->conversion == 'F')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ }
+ else if (dp->conversion == 'e' || dp->conversion == 'E')
+ {
+ *p++ = '0';
+ if ((flags & FLAG_ALT) || precision > 0)
+ {
+ *p++ = decimal_point_char ();
+ for (; precision > 0; precision--)
+ *p++ = '0';
+ }
+ *p++ = dp->conversion; /* 'e' or 'E' */
+ *p++ = '+';
+ /* Produce the same number of exponent digits as
+ the native printf implementation. */
+# if defined _WIN32 && ! defined __CYGWIN__
+ *p++ = '0';
+# endif
+ *p++ = '0';
+ *p++ = '0';
+ }
+ else if (dp->conversion == 'g' || dp->conversion == 'G')
+ {
+ *p++ = '0';
+ if (flags & FLAG_ALT)
+ {
+ size_t ndigits =
+ (precision > 0 ? precision - 1 : 0);
+ *p++ = decimal_point_char ();
+ for (; ndigits > 0; --ndigits)
+ *p++ = '0';
+ }
+ }
+ else
+ abort ();
+# endif
+ }
+ }
+ }
+# endif
+
+ /* The generated string now extends from tmp to p, with the
+ zero padding insertion point being at pad_ptr. */
+ count = p - tmp;
+
+ if (count < width)
+ {
+ size_t pad = width - count;
+ DCHAR_T *end = p + pad;
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > tmp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+
+ p = end;
+ }
+
+ count = p - tmp;
+
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+
+ /* Make room for the result. */
+ if (count >= allocated - length)
+ {
+ size_t n = xsum (length, count);
+
+ ENSURE_ALLOCATION (n);
+ }
+
+ /* Append the result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+ if (tmp != tmpbuf)
+ free (tmp);
+ length += count;
+ }
+#endif
+ else
+ {
+ arg_type type = a.arg[dp->arg_index].type;
+ int flags = dp->flags;
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_width;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ size_t width;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ int has_precision;
+ size_t precision;
+#endif
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ int prec_ourselves;
+#else
+# define prec_ourselves 0
+#endif
+#if NEED_PRINTF_FLAG_LEFTADJUST
+# define pad_ourselves 1
+#elif !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ int pad_ourselves;
+#else
+# define pad_ourselves 0
+#endif
+ TCHAR_T *fbp;
+ unsigned int prefix_count;
+ int prefixes[2] IF_LINT (= { 0 });
+ int orig_errno;
+#if !USE_SNPRINTF
+ size_t tmp_length;
+ TCHAR_T tmpbuf[700];
+ TCHAR_T *tmp;
+#endif
+
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 0;
+#endif
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ width = 0;
+ if (dp->width_start != dp->width_end)
+ {
+ if (dp->width_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->width_arg_index].a.a_int;
+ width = arg;
+ if (arg < 0)
+ {
+ /* "A negative field width is taken as a '-' flag
+ followed by a positive field width." */
+ flags |= FLAG_LEFT;
+ width = -width;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->width_start;
+
+ do
+ width = xsum (xtimes (width, 10), *digitp++ - '0');
+ while (digitp != dp->width_end);
+ }
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_width = 1;
+#endif
+ }
+#endif
+
+#if !USE_SNPRINTF || !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF || NEED_PRINTF_UNBOUNDED_PRECISION
+ has_precision = 0;
+ precision = 6;
+ if (dp->precision_start != dp->precision_end)
+ {
+ if (dp->precision_arg_index != ARG_NONE)
+ {
+ int arg;
+
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ arg = a.arg[dp->precision_arg_index].a.a_int;
+ /* "A negative precision is taken as if the precision
+ were omitted." */
+ if (arg >= 0)
+ {
+ precision = arg;
+ has_precision = 1;
+ }
+ }
+ else
+ {
+ const FCHAR_T *digitp = dp->precision_start + 1;
+
+ precision = 0;
+ while (digitp != dp->precision_end)
+ precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+ has_precision = 1;
+ }
+ }
+#endif
+
+ /* Decide whether to handle the precision ourselves. */
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ switch (dp->conversion)
+ {
+ case 'd': case 'i': case 'u':
+ case 'o':
+ case 'x': case 'X': case 'p':
+ prec_ourselves = has_precision && (precision > 0);
+ break;
+ default:
+ prec_ourselves = 0;
+ break;
+ }
+#endif
+
+ /* Decide whether to perform the padding ourselves. */
+#if !NEED_PRINTF_FLAG_LEFTADJUST && (!DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION)
+ switch (dp->conversion)
+ {
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ /* If we need conversion from TCHAR_T[] to DCHAR_T[], we need
+ to perform the padding after this conversion. Functions
+ with unistdio extensions perform the padding based on
+ character count rather than element count. */
+ case 'c': case 's':
+# endif
+# if NEED_PRINTF_FLAG_ZERO
+ case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+ case 'a': case 'A':
+# endif
+ pad_ourselves = 1;
+ break;
+ default:
+ pad_ourselves = prec_ourselves;
+ break;
+ }
+#endif
+
+#if !USE_SNPRINTF
+ /* Allocate a temporary buffer of sufficient size for calling
+ sprintf. */
+ tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index, dp->conversion, type,
+ flags, width, has_precision, precision,
+ pad_ourselves);
+
+ if (tmp_length <= sizeof (tmpbuf) / sizeof (TCHAR_T))
+ tmp = tmpbuf;
+ else
+ {
+ size_t tmp_memsize = xtimes (tmp_length, sizeof (TCHAR_T));
+
+ if (size_overflow_p (tmp_memsize))
+ /* Overflow, would lead to out of memory. */
+ goto out_of_memory;
+ tmp = (TCHAR_T *) malloc (tmp_memsize);
+ if (tmp == NULL)
+ /* Out of memory. */
+ goto out_of_memory;
+ }
+#endif
+
+ /* Construct the format string for calling snprintf or
+ sprintf. */
+ fbp = buf;
+ *fbp++ = '%';
+#if NEED_PRINTF_FLAG_GROUPING
+ /* The underlying implementation doesn't support the ' flag.
+ Produce no grouping characters in this case; this is
+ acceptable because the grouping is locale dependent. */
+#else
+ if (flags & FLAG_GROUP)
+ *fbp++ = '\'';
+#endif
+ if (flags & FLAG_LEFT)
+ *fbp++ = '-';
+ if (flags & FLAG_SHOWSIGN)
+ *fbp++ = '+';
+ if (flags & FLAG_SPACE)
+ *fbp++ = ' ';
+ if (flags & FLAG_ALT)
+ *fbp++ = '#';
+#if __GLIBC__ >= 2 && !defined __UCLIBC__
+ if (flags & FLAG_LOCALIZED)
+ *fbp++ = 'I';
+#endif
+ if (!pad_ourselves)
+ {
+ if (flags & FLAG_ZERO)
+ *fbp++ = '0';
+ if (dp->width_start != dp->width_end)
+ {
+ size_t n = dp->width_end - dp->width_start;
+ /* The width specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->width_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->width_start;
+ do
+ *fbp++ = *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+ if (!prec_ourselves)
+ {
+ if (dp->precision_start != dp->precision_end)
+ {
+ size_t n = dp->precision_end - dp->precision_start;
+ /* The precision specification is known to consist only
+ of standard ASCII characters. */
+ if (sizeof (FCHAR_T) == sizeof (TCHAR_T))
+ {
+ memcpy (fbp, dp->precision_start, n * sizeof (TCHAR_T));
+ fbp += n;
+ }
+ else
+ {
+ const FCHAR_T *mp = dp->precision_start;
+ do
+ *fbp++ = *mp++;
+ while (--n > 0);
+ }
+ }
+ }
+
+ switch (type)
+ {
+ case TYPE_LONGLONGINT:
+ case TYPE_ULONGLONGINT:
+#if defined _WIN32 && ! defined __CYGWIN__
+ *fbp++ = 'I';
+ *fbp++ = '6';
+ *fbp++ = '4';
+ break;
+#else
+ *fbp++ = 'l';
+#endif
+ FALLTHROUGH;
+ case TYPE_LONGINT:
+ case TYPE_ULONGINT:
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+#endif
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+#endif
+ *fbp++ = 'l';
+ break;
+ case TYPE_LONGDOUBLE:
+ *fbp++ = 'L';
+ break;
+ default:
+ break;
+ }
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ *fbp = 'f';
+ else
+#endif
+ *fbp = dp->conversion;
+#if USE_SNPRINTF
+# if ((HAVE_SNPRINTF_RETVAL_C99 && HAVE_SNPRINTF_TRUNCATION_C99) \
+ || ((__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) \
+ && !defined __UCLIBC__) \
+ || (defined __APPLE__ && defined __MACH__) \
+ || defined __ANDROID__ \
+ || (defined _WIN32 && ! defined __CYGWIN__))
+ /* On systems where we know that snprintf's return value
+ conforms to ISO C 99 (HAVE_SNPRINTF_RETVAL_C99) and that
+ snprintf always produces NUL-terminated strings
+ (HAVE_SNPRINTF_TRUNCATION_C99), it is possible to avoid
+ using %n. And it is desirable to do so, because more and
+ more platforms no longer support %n, for "security reasons".
+ In particular, the following platforms:
+ - On glibc2 systems from 2004-10-18 or newer, the use of
+ %n in format strings in writable memory may crash the
+ program (if compiled with _FORTIFY_SOURCE=2).
+ - On Mac OS X 10.13 or newer, the use of %n in format
+ strings in writable memory by default crashes the
+ program.
+ - On Android, starting on 2018-03-07, the use of %n in
+ format strings produces a fatal error (see
+ <https://android.googlesource.com/platform/bionic/+/41398d03b7e8e0dfb951660ae713e682e9fc0336>).
+ On these platforms, HAVE_SNPRINTF_RETVAL_C99 and
+ HAVE_SNPRINTF_TRUNCATION_C99 are 1. We have listed them
+ explicitly in the condition above, in case of cross-
+ compilation (just to be sure). */
+ /* On native Windows systems (such as mingw), we can avoid using
+ %n because:
+ - Although the gl_SNPRINTF_TRUNCATION_C99 test fails,
+ snprintf does not write more than the specified number
+ of bytes. (snprintf (buf, 3, "%d %d", 4567, 89) writes
+ '4', '5', '6' into buf, not '4', '5', '\0'.)
+ - Although the gl_SNPRINTF_RETVAL_C99 test fails, snprintf
+ allows us to recognize the case of an insufficient
+ buffer size: it returns -1 in this case.
+ On native Windows systems (such as mingw) where the OS is
+ Windows Vista, the use of %n in format strings by default
+ crashes the program. See
+ <https://gcc.gnu.org/ml/gcc/2007-06/msg00122.html> and
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-printf-count-output>
+ So we should avoid %n in this situation. */
+ fbp[1] = '\0';
+# else /* AIX <= 5.1, HP-UX, IRIX, OSF/1, Solaris <= 9, BeOS */
+ fbp[1] = '%';
+ fbp[2] = 'n';
+ fbp[3] = '\0';
+# endif
+#else
+ fbp[1] = '\0';
+#endif
+
+ /* Construct the arguments for calling snprintf or sprintf. */
+ prefix_count = 0;
+ if (!pad_ourselves && dp->width_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+ }
+ if (!prec_ourselves && dp->precision_arg_index != ARG_NONE)
+ {
+ if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+ abort ();
+ prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+ }
+
+#if USE_SNPRINTF
+ /* The SNPRINTF result is appended after result[0..length].
+ The latter is an array of DCHAR_T; SNPRINTF appends an
+ array of TCHAR_T to it. This is possible because
+ sizeof (TCHAR_T) divides sizeof (DCHAR_T) and
+ alignof (TCHAR_T) <= alignof (DCHAR_T). */
+# define TCHARS_PER_DCHAR (sizeof (DCHAR_T) / sizeof (TCHAR_T))
+ /* Ensure that maxlen below will be >= 2. Needed on BeOS,
+ where an snprintf() with maxlen==1 acts like sprintf(). */
+ ENSURE_ALLOCATION (xsum (length,
+ (2 + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR));
+ /* Prepare checking whether snprintf returns the count
+ via %n. */
+ *(TCHAR_T *) (result + length) = '\0';
+#endif
+
+ orig_errno = errno;
+
+ for (;;)
+ {
+ int count = -1;
+
+#if USE_SNPRINTF
+ int retcount = 0;
+ size_t maxlen = allocated - length;
+ /* SNPRINTF can fail if its second argument is
+ > INT_MAX. */
+ if (maxlen > INT_MAX / TCHARS_PER_DCHAR)
+ maxlen = INT_MAX / TCHARS_PER_DCHAR;
+ maxlen = maxlen * TCHARS_PER_DCHAR;
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ arg, &count); \
+ break; \
+ case 1: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], arg, &count); \
+ break; \
+ case 2: \
+ retcount = SNPRINTF ((TCHAR_T *) (result + length), \
+ maxlen, buf, \
+ prefixes[0], prefixes[1], arg, \
+ &count); \
+ break; \
+ default: \
+ abort (); \
+ }
+#else
+# define SNPRINTF_BUF(arg) \
+ switch (prefix_count) \
+ { \
+ case 0: \
+ count = sprintf (tmp, buf, arg); \
+ break; \
+ case 1: \
+ count = sprintf (tmp, buf, prefixes[0], arg); \
+ break; \
+ case 2: \
+ count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+ arg); \
+ break; \
+ default: \
+ abort (); \
+ }
+#endif
+
+ errno = 0;
+ switch (type)
+ {
+ case TYPE_SCHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_schar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UCHAR:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_SHORT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_short;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_USHORT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_INT:
+ {
+ int arg = a.arg[dp->arg_index].a.a_int;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_UINT:
+ {
+ unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGINT:
+ {
+ long int arg = a.arg[dp->arg_index].a.a_longint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGINT:
+ {
+ unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGLONGINT:
+ {
+ long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_ULONGLONGINT:
+ {
+ unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_DOUBLE:
+ {
+ double arg = a.arg[dp->arg_index].a.a_double;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_LONGDOUBLE:
+ {
+ long double arg = a.arg[dp->arg_index].a.a_longdouble;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ case TYPE_CHAR:
+ {
+ int arg = a.arg[dp->arg_index].a.a_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WINT_T
+ case TYPE_WIDE_CHAR:
+ {
+ wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_STRING:
+ {
+ const char *arg = a.arg[dp->arg_index].a.a_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#if HAVE_WCHAR_T
+ case TYPE_WIDE_STRING:
+ {
+ const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+#endif
+ case TYPE_POINTER:
+ {
+ void *arg = a.arg[dp->arg_index].a.a_pointer;
+ SNPRINTF_BUF (arg);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+#if USE_SNPRINTF
+ /* Portability: Not all implementations of snprintf()
+ are ISO C 99 compliant. Determine the number of
+ bytes that snprintf() has produced or would have
+ produced. */
+ if (count >= 0)
+ {
+ /* Verify that snprintf() has NUL-terminated its
+ result. */
+ if ((unsigned int) count < maxlen
+ && ((TCHAR_T *) (result + length)) [count] != '\0')
+ abort ();
+ /* Portability hack. */
+ if (retcount > count)
+ count = retcount;
+ }
+ else
+ {
+ /* snprintf() doesn't understand the '%n'
+ directive. */
+ if (fbp[1] != '\0')
+ {
+ /* Don't use the '%n' directive; instead, look
+ at the snprintf() return value. */
+ fbp[1] = '\0';
+ continue;
+ }
+ else
+ {
+ /* Look at the snprintf() return value. */
+ if (retcount < 0)
+ {
+# if !HAVE_SNPRINTF_RETVAL_C99 || USE_MSVC__SNPRINTF
+ /* HP-UX 10.20 snprintf() is doubly deficient:
+ It doesn't understand the '%n' directive,
+ *and* it returns -1 (rather than the length
+ that would have been required) when the
+ buffer is too small.
+ But a failure at this point can also come
+ from other reasons than a too small buffer,
+ such as an invalid wide string argument to
+ the %ls directive, or possibly an invalid
+ floating-point argument. */
+ size_t tmp_length =
+ MAX_ROOM_NEEDED (&a, dp->arg_index,
+ dp->conversion, type, flags,
+ width,
+ has_precision,
+ precision, pad_ourselves);
+
+ if (maxlen < tmp_length)
+ {
+ /* Make more room. But try to do through
+ this reallocation only once. */
+ size_t bigger_need =
+ xsum (length,
+ xsum (tmp_length,
+ TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ /* And always grow proportionally.
+ (There may be several arguments, each
+ needing a little more room than the
+ previous one.) */
+ size_t bigger_need2 =
+ xsum (xtimes (allocated, 2), 12);
+ if (bigger_need < bigger_need2)
+ bigger_need = bigger_need2;
+ ENSURE_ALLOCATION (bigger_need);
+ continue;
+ }
+# endif
+ }
+ else
+ count = retcount;
+ }
+ }
+#endif
+
+ /* Attempt to handle failure. */
+ if (count < 0)
+ {
+ /* SNPRINTF or sprintf failed. Save and use the errno
+ that it has set, if any. */
+ int saved_errno = errno;
+ if (saved_errno == 0)
+ {
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ saved_errno = EILSEQ;
+ else
+ saved_errno = EINVAL;
+ }
+
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+
+ errno = saved_errno;
+ return NULL;
+ }
+
+#if USE_SNPRINTF
+ /* Handle overflow of the allocated buffer.
+ If such an overflow occurs, a C99 compliant snprintf()
+ returns a count >= maxlen. However, a non-compliant
+ snprintf() function returns only count = maxlen - 1. To
+ cover both cases, test whether count >= maxlen - 1. */
+ if ((unsigned int) count + 1 >= maxlen)
+ {
+ /* If maxlen already has attained its allowed maximum,
+ allocating more memory will not increase maxlen.
+ Instead of looping, bail out. */
+ if (maxlen == INT_MAX / TCHARS_PER_DCHAR)
+ goto overflow;
+ else
+ {
+ /* Need at least (count + 1) * sizeof (TCHAR_T)
+ bytes. (The +1 is for the trailing NUL.)
+ But ask for (count + 2) * sizeof (TCHAR_T)
+ bytes, so that in the next round, we likely get
+ maxlen > (unsigned int) count + 1
+ and so we don't get here again.
+ And allocate proportionally, to avoid looping
+ eternally if snprintf() reports a too small
+ count. */
+ size_t n =
+ xmax (xsum (length,
+ ((unsigned int) count + 2
+ + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR),
+ xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ continue;
+ }
+ }
+#endif
+
+#if NEED_PRINTF_UNBOUNDED_PRECISION
+ if (prec_ourselves)
+ {
+ /* Handle the precision. */
+ TCHAR_T *prec_ptr =
+# if USE_SNPRINTF
+ (TCHAR_T *) (result + length);
+# else
+ tmp;
+# endif
+ size_t prefix_count;
+ size_t move;
+
+ prefix_count = 0;
+ /* Put the additional zeroes after the sign. */
+ if (count >= 1
+ && (*prec_ptr == '-' || *prec_ptr == '+'
+ || *prec_ptr == ' '))
+ prefix_count = 1;
+ /* Put the additional zeroes after the 0x prefix if
+ (flags & FLAG_ALT) || (dp->conversion == 'p'). */
+ else if (count >= 2
+ && prec_ptr[0] == '0'
+ && (prec_ptr[1] == 'x' || prec_ptr[1] == 'X'))
+ prefix_count = 2;
+
+ move = count - prefix_count;
+ if (precision > move)
+ {
+ /* Insert zeroes. */
+ size_t insert = precision - move;
+ TCHAR_T *prec_end;
+
+# if USE_SNPRINTF
+ size_t n =
+ xsum (length,
+ (count + insert + TCHARS_PER_DCHAR - 1)
+ / TCHARS_PER_DCHAR);
+ length += (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ ENSURE_ALLOCATION (n);
+ length -= (count + TCHARS_PER_DCHAR - 1) / TCHARS_PER_DCHAR;
+ prec_ptr = (TCHAR_T *) (result + length);
+# endif
+
+ prec_end = prec_ptr + count;
+ prec_ptr += prefix_count;
+
+ while (prec_end > prec_ptr)
+ {
+ prec_end--;
+ prec_end[insert] = prec_end[0];
+ }
+
+ prec_end += insert;
+ do
+ *--prec_end = '0';
+ while (prec_end > prec_ptr);
+
+ count += insert;
+ }
+ }
+#endif
+
+#if !USE_SNPRINTF
+ if (count >= tmp_length)
+ /* tmp_length was incorrectly calculated - fix the
+ code above! */
+ abort ();
+#endif
+
+#if !DCHAR_IS_TCHAR
+ /* Convert from TCHAR_T[] to DCHAR_T[]. */
+ if (dp->conversion == 'c' || dp->conversion == 's')
+ {
+ /* type = TYPE_CHAR or TYPE_WIDE_CHAR or TYPE_STRING
+ TYPE_WIDE_STRING.
+ The result string is not certainly ASCII. */
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t tmpdst_len;
+ /* This code assumes that TCHAR_T is 'char'. */
+ verify (sizeof (TCHAR_T) == 1);
+# if USE_SNPRINTF
+ tmpsrc = (TCHAR_T *) (result + length);
+# else
+ tmpsrc = tmp;
+# endif
+ tmpdst =
+ DCHAR_CONV_FROM_ENCODING (locale_charset (),
+ iconveh_question_mark,
+ tmpsrc, count,
+ NULL,
+ NULL, &tmpdst_len);
+ if (tmpdst == NULL)
+ {
+ int saved_errno = errno;
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = saved_errno;
+ return NULL;
+ }
+ ENSURE_ALLOCATION (xsum (length, tmpdst_len));
+ DCHAR_CPY (result + length, tmpdst, tmpdst_len);
+ free (tmpdst);
+ count = tmpdst_len;
+ }
+ else
+ {
+ /* The result string is ASCII.
+ Simple 1:1 conversion. */
+# if USE_SNPRINTF
+ /* If sizeof (DCHAR_T) == sizeof (TCHAR_T), it's a
+ no-op conversion, in-place on the array starting
+ at (result + length). */
+ if (sizeof (DCHAR_T) != sizeof (TCHAR_T))
+# endif
+ {
+ const TCHAR_T *tmpsrc;
+ DCHAR_T *tmpdst;
+ size_t n;
+
+# if USE_SNPRINTF
+ if (result == resultbuf)
+ {
+ tmpsrc = (TCHAR_T *) (result + length);
+ /* ENSURE_ALLOCATION will not move tmpsrc
+ (because it's part of resultbuf). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ }
+ else
+ {
+ /* ENSURE_ALLOCATION will move the array
+ (because it uses realloc(). */
+ ENSURE_ALLOCATION (xsum (length, count));
+ tmpsrc = (TCHAR_T *) (result + length);
+ }
+# else
+ tmpsrc = tmp;
+ ENSURE_ALLOCATION (xsum (length, count));
+# endif
+ tmpdst = result + length;
+ /* Copy backwards, because of overlapping. */
+ tmpsrc += count;
+ tmpdst += count;
+ for (n = count; n > 0; n--)
+ *--tmpdst = *--tmpsrc;
+ }
+ }
+#endif
+
+#if DCHAR_IS_TCHAR && !USE_SNPRINTF
+ /* Make room for the result. */
+ if (count > allocated - length)
+ {
+ /* Need at least count elements. But allocate
+ proportionally. */
+ size_t n =
+ xmax (xsum (length, count), xtimes (allocated, 2));
+
+ ENSURE_ALLOCATION (n);
+ }
+#endif
+
+ /* Here count <= allocated - length. */
+
+ /* Perform padding. */
+#if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO || NEED_PRINTF_FLAG_LEFTADJUST || NEED_PRINTF_FLAG_ZERO || NEED_PRINTF_UNBOUNDED_PRECISION
+ if (pad_ourselves && has_width)
+ {
+ size_t w;
+# if ENABLE_UNISTDIO
+ /* Outside POSIX, it's preferable to compare the width
+ against the number of _characters_ of the converted
+ value. */
+ w = DCHAR_MBSNLEN (result + length, count);
+# else
+ /* The width is compared against the number of _bytes_
+ of the converted value, says POSIX. */
+ w = count;
+# endif
+ if (w < width)
+ {
+ size_t pad = width - w;
+
+ /* Make room for the result. */
+ if (xsum (count, pad) > allocated - length)
+ {
+ /* Need at least count + pad elements. But
+ allocate proportionally. */
+ size_t n =
+ xmax (xsum3 (length, count, pad),
+ xtimes (allocated, 2));
+
+# if USE_SNPRINTF
+ length += count;
+ ENSURE_ALLOCATION (n);
+ length -= count;
+# else
+ ENSURE_ALLOCATION (n);
+# endif
+ }
+ /* Here count + pad <= allocated - length. */
+
+ {
+# if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ DCHAR_T * const rp = result + length;
+# else
+ DCHAR_T * const rp = tmp;
+# endif
+ DCHAR_T *p = rp + count;
+ DCHAR_T *end = p + pad;
+ DCHAR_T *pad_ptr;
+# if !DCHAR_IS_TCHAR || ENABLE_UNISTDIO
+ if (dp->conversion == 'c'
+ || dp->conversion == 's')
+ /* No zero-padding for string directives. */
+ pad_ptr = NULL;
+ else
+# endif
+ {
+ pad_ptr = (*rp == '-' ? rp + 1 : rp);
+ /* No zero-padding of "inf" and "nan". */
+ if ((*pad_ptr >= 'A' && *pad_ptr <= 'Z')
+ || (*pad_ptr >= 'a' && *pad_ptr <= 'z'))
+ pad_ptr = NULL;
+ }
+ /* The generated string now extends from rp to p,
+ with the zero padding insertion point being at
+ pad_ptr. */
+
+ count = count + pad; /* = end - rp */
+
+ if (flags & FLAG_LEFT)
+ {
+ /* Pad with spaces on the right. */
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ else if ((flags & FLAG_ZERO) && pad_ptr != NULL)
+ {
+ /* Pad with zeroes. */
+ DCHAR_T *q = end;
+
+ while (p > pad_ptr)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = '0';
+ }
+ else
+ {
+ /* Pad with spaces on the left. */
+ DCHAR_T *q = end;
+
+ while (p > rp)
+ *--q = *--p;
+ for (; pad > 0; pad--)
+ *p++ = ' ';
+ }
+ }
+ }
+ }
+#endif
+
+ /* Here still count <= allocated - length. */
+
+#if !DCHAR_IS_TCHAR || USE_SNPRINTF
+ /* The snprintf() result did fit. */
+#else
+ /* Append the sprintf() result. */
+ memcpy (result + length, tmp, count * sizeof (DCHAR_T));
+#endif
+#if !USE_SNPRINTF
+ if (tmp != tmpbuf)
+ free (tmp);
+#endif
+
+#if NEED_PRINTF_DIRECTIVE_F
+ if (dp->conversion == 'F')
+ {
+ /* Convert the %f result to upper case for %F. */
+ DCHAR_T *rp = result + length;
+ size_t rc;
+ for (rc = count; rc > 0; rc--, rp++)
+ if (*rp >= 'a' && *rp <= 'z')
+ *rp = *rp - 'a' + 'A';
+ }
+#endif
+
+ length += count;
+ break;
+ }
+ errno = orig_errno;
+#undef pad_ourselves
+#undef prec_ourselves
+ }
+ }
+ }
+
+ /* Add the final NUL. */
+ ENSURE_ALLOCATION (xsum (length, 1));
+ result[length] = '\0';
+
+ if (result != resultbuf && length + 1 < allocated)
+ {
+ /* Shrink the allocated memory if possible. */
+ DCHAR_T *memory;
+
+ memory = (DCHAR_T *) realloc (result, (length + 1) * sizeof (DCHAR_T));
+ if (memory != NULL)
+ result = memory;
+ }
+
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ *lengthp = length;
+ /* Note that we can produce a big string of a length > INT_MAX. POSIX
+ says that snprintf() fails with errno = EOVERFLOW in this case, but
+ that's only because snprintf() returns an 'int'. This function does
+ not have this limitation. */
+ return result;
+
+#if USE_SNPRINTF
+ overflow:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ CLEANUP ();
+ errno = EOVERFLOW;
+ return NULL;
+#endif
+
+ out_of_memory:
+ if (!(result == resultbuf || result == NULL))
+ free (result);
+ if (buf_malloced != NULL)
+ free (buf_malloced);
+ out_of_memory_1:
+ CLEANUP ();
+ errno = ENOMEM;
+ return NULL;
+ }
+}
+
+#undef MAX_ROOM_NEEDED
+#undef TCHARS_PER_DCHAR
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef DCHAR_SET
+#undef DCHAR_CPY
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef DCHAR_IS_TCHAR
+#undef TCHAR_T
+#undef DCHAR_T
+#undef FCHAR_T
+#undef VASNPRINTF
diff --git a/lib/vasnprintf.h b/lib/vasnprintf.h
new file mode 100644
index 0000000..f3fa3b5
--- /dev/null
+++ b/lib/vasnprintf.h
@@ -0,0 +1,72 @@
+/* vsprintf with automatic memory allocation.
+ Copyright (C) 2002-2004, 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list. */
+#include <stdarg.h>
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get _GL_ATTRIBUTE_SPEC_PRINTF_STANDARD. */
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+ You can pass a preallocated buffer for the result in RESULTBUF and its
+ size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+ If successful, return the address of the string (this may be = RESULTBUF
+ if no dynamic memory allocation was necessary) and set *LENGTHP to the
+ number of resulting bytes, excluding the trailing NUL. Upon error, set
+ errno and return NULL.
+
+ When dynamic memory allocation occurs, the preallocated buffer is left
+ alone (with possibly modified contents). This makes it possible to use
+ a statically allocated or stack-allocated buffer, like this:
+
+ char buf[100];
+ size_t len = sizeof (buf);
+ char *output = vasnprintf (buf, &len, format, args);
+ if (output == NULL)
+ ... error handling ...;
+ else
+ {
+ ... use the output string ...;
+ if (output != buf)
+ free (output);
+ }
+ */
+#if REPLACE_VASNPRINTF
+# define asnprintf rpl_asnprintf
+# define vasnprintf rpl_vasnprintf
+#endif
+extern char * asnprintf (char *restrict resultbuf, size_t *lengthp,
+ const char *format, ...)
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4));
+extern char * vasnprintf (char *restrict resultbuf, size_t *lengthp,
+ const char *format, va_list args)
+ _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 0));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/lib/vasprintf.c b/lib/vasprintf.c
new file mode 100644
index 0000000..7bb21dd
--- /dev/null
+++ b/lib/vasprintf.c
@@ -0,0 +1,50 @@
+/* Formatted output to strings.
+ Copyright (C) 1999, 2002, 2006-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#ifdef IN_LIBASPRINTF
+# include "vasprintf.h"
+#else
+# include <stdio.h>
+#endif
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "vasnprintf.h"
+
+int
+vasprintf (char **resultp, const char *format, va_list args)
+{
+ size_t length;
+ char *result = vasnprintf (NULL, &length, format, args);
+ if (result == NULL)
+ return -1;
+
+ if (length > INT_MAX)
+ {
+ free (result);
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ *resultp = result;
+ /* Return the number of resulting bytes, excluding the trailing NUL. */
+ return length;
+}
diff --git a/lib/verify.h b/lib/verify.h
new file mode 100644
index 0000000..fa1ed71
--- /dev/null
+++ b/lib/verify.h
@@ -0,0 +1,331 @@
+/* Compile-time assert-like macros.
+
+ Copyright (C) 2005-2006, 2009-2020 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/>. */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering. */
+
+#ifndef _GL_VERIFY_H
+#define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
+ works as per C11. This is supported by GCC 4.6.0 and later, in C
+ mode, and by clang (also in C++ mode).
+
+ Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
+ per C2X. This is supported by GCC 9.1 and later, and by clang in
+ C++1z mode.
+
+ Define _GL_HAVE_STATIC_ASSERT1 if static_assert (R) works as per
+ C++17. This is supported by GCC 9.1 and later, and by clang in
+ C++1z mode.
+
+ Support compilers claiming conformance to the relevant standard,
+ and also support GCC when not pedantic. If we were willing to slow
+ 'configure' down we could also use it with other compilers, but
+ since this affects only the quality of diagnostics, why bother? */
+#ifndef __cplusplus
+# if (201112L <= __STDC_VERSION__ \
+ || (!defined __STRICT_ANSI__ \
+ && (4 < __GNUC__ + (6 <= __GNUC_MINOR__) || 4 <= __clang_major__)))
+# define _GL_HAVE__STATIC_ASSERT 1
+# endif
+# if (202000L <= __STDC_VERSION__ \
+ || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
+# define _GL_HAVE__STATIC_ASSERT1 1
+# endif
+#else
+# if 4 <= __clang_major__
+# define _GL_HAVE__STATIC_ASSERT 1
+# endif
+# if 4 <= __clang_major__ && 201411 <= __cpp_static_assert
+# define _GL_HAVE__STATIC_ASSERT1 1
+# endif
+# if 201703L <= __cplusplus \
+ || 9 <= __GNUC__ \
+ || (4 <= __clang_major__ && 201411 <= __cpp_static_assert)
+# define _GL_HAVE_STATIC_ASSERT1 1
+# endif
+#endif
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+ system headers, defines a conflicting _Static_assert that is no
+ better than ours; override it. */
+#ifndef _GL_HAVE__STATIC_ASSERT
+# include <stddef.h>
+# undef _Static_assert
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ If _Static_assert works, verify (R) uses it directly. Similarly,
+ _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+ that is an operand of sizeof.
+
+ The code below uses several ideas for C++ compilers, and for C
+ compilers that do not support _Static_assert:
+
+ * The first step is ((R) ? 1 : -1). Given an expression R, of
+ integral or boolean or floating-point type, this yields an
+ expression of integral type, whose value is later verified to be
+ constant and nonnegative.
+
+ * Next this expression W is wrapped in a type
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: W;
+ }.
+ If W is negative, this yields a compile-time error. No compiler can
+ deal with a bit-field of negative size.
+
+ One might think that an array size check would have the same
+ effect, that is, that the type struct { unsigned int dummy[W]; }
+ would work as well. However, inside a function, some compilers
+ (such as C++ compilers and GNU C) allow local parameters and
+ variables inside array size expressions. With these compilers,
+ an array size check would not properly diagnose this misuse of
+ the verify macro:
+
+ void function (int n) { verify (n < 0); }
+
+ * For the verify macro, the struct _gl_verify_type will need to
+ somehow be embedded into a declaration. To be portable, this
+ declaration must declare an object, a constant, a function, or a
+ typedef name. If the declared entity uses the type directly,
+ such as in
+
+ struct dummy {...};
+ typedef struct {...} dummy;
+ extern struct {...} *dummy;
+ extern void dummy (struct {...} *);
+ extern struct {...} *dummy (void);
+
+ two uses of the verify macro would yield colliding declarations
+ if the entity names are not disambiguated. A workaround is to
+ attach the current line number to the entity name:
+
+ #define _GL_CONCAT0(x, y) x##y
+ #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+ extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+ But this has the problem that two invocations of verify from
+ within the same macro would collide, since the __LINE__ value
+ would be the same for both invocations. (The GCC __COUNTER__
+ macro solves this problem, but is not portable.)
+
+ A solution is to use the sizeof operator. It yields a number,
+ getting rid of the identity of the type. Declarations like
+
+ extern int dummy [sizeof (struct {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ can be repeated.
+
+ * Should the implementation use a named struct or an unnamed struct?
+ Which of the following alternatives can be used?
+
+ extern int dummy [sizeof (struct {...})];
+ extern int dummy [sizeof (struct _gl_verify_type {...})];
+ extern void dummy (int [sizeof (struct {...})]);
+ extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+ extern int (*dummy (void)) [sizeof (struct {...})];
+ extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+ In the second and sixth case, the struct type is exported to the
+ outer scope; two such declarations therefore collide. GCC warns
+ about the first, third, and fourth cases. So the only remaining
+ possibility is the fifth case:
+
+ extern int (*dummy (void)) [sizeof (struct {...})];
+
+ * GCC warns about duplicate declarations of the dummy function if
+ -Wredundant-decls is used. GCC 4.3 and later have a builtin
+ __COUNTER__ macro that can let us generate unique identifiers for
+ each dummy function, to suppress this warning.
+
+ * This implementation exploits the fact that older versions of GCC,
+ which do not support _Static_assert, also do not warn about the
+ last declaration mentioned above.
+
+ * GCC warns if -Wnested-externs is enabled and 'verify' is used
+ within a function body; but inside a function, you can always
+ arrange to use verify_expr instead.
+
+ * In C++, any struct definition inside sizeof is invalid.
+ Use a template type to work around the problem. */
+
+/* Concatenate two preprocessor tokens. */
+#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+#define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+ use it. Use __COUNTER__ if it works, falling back on __LINE__
+ otherwise. __LINE__ isn't perfect, but it's better than a
+ constant. */
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+#else
+# define _GL_COUNTER __LINE__
+#endif
+
+/* Generate a symbol with the given prefix, making it unique if
+ possible. */
+#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+ that returns 1. If R is false, fail at compile-time, preferably
+ with a diagnostic that includes the string-literal DIAGNOSTIC. */
+
+#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
+ (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
+
+#ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+ struct _gl_verify_type {
+ unsigned int _gl_verify_error_if_negative: w;
+ };
+# define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ _gl_verify_type<(R) ? 1 : -1>
+#elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { \
+ _Static_assert (R, DIAGNOSTIC); \
+ int _gl_dummy; \
+ }
+#else
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+ struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+#endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. If R is false, fail at compile-time.
+
+ This macro requires three or more arguments but uses at most the first
+ two, so that the _Static_assert macro optionally defined below supports
+ both the C11 two-argument syntax and the C2X one-argument syntax.
+
+ Unfortunately, unlike C11, this implementation must appear as an
+ ordinary declaration, and cannot appear inside struct { ... }. */
+
+#if defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
+#else
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) \
+ extern int (*_GL_GENSYM (_gl_verify_function) (void)) \
+ [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
+#endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h. */
+#ifdef _GL_STATIC_ASSERT_H
+# if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
+# define _Static_assert(...) \
+ _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
+# endif
+# if !defined _GL_HAVE_STATIC_ASSERT1 && !defined static_assert
+# define static_assert _Static_assert /* C11 requires this #define. */
+# endif
+#endif
+
+/* @assert.h omit start@ */
+
+#if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
+# define _GL_HAS_BUILTIN_TRAP 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap)
+#else
+# define _GL_HAS_BUILTIN_TRAP 0
+#endif
+
+#if 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
+# define _GL_HAS_BUILTIN_UNREACHABLE 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable)
+#else
+# define _GL_HAS_BUILTIN_UNREACHABLE 0
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero. To
+ be portable, R should be an integer constant expression. Unlike
+ assert (R), there is no run-time overhead.
+
+ There are two macros, since no single macro can be used in all
+ contexts in C. verify_expr (R, E) is for scalar contexts, including
+ integer constant expression contexts. verify (R) is for declaration
+ contexts, e.g., the top level. */
+
+/* Verify requirement R at compile-time. Return the value of the
+ expression E. */
+
+#define verify_expr(R, E) \
+ (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+ trailing ';'. verify (R) acts like static_assert (R) except that
+ it is portable to C11/C++14 and earlier, it can issue better
+ diagnostics, and its name is shorter and may be more convenient. */
+
+#ifdef __PGI
+/* PGI barfs if R is long. */
+# define verify(R) _GL_VERIFY (R, "verify (...)", -)
+#else
+# define verify(R) _GL_VERIFY (R, "verify (" #R ")", -)
+#endif
+
+/* Assume that R always holds. Behavior is undefined if R is false,
+ fails to evaluate, or has side effects.
+
+ 'assume (R)' is a directive from the programmer telling the
+ compiler that R is true so the compiler needn't generate code to
+ test R. This is why 'assume' is in verify.h: it's related to
+ static checking (in this case, static checking done by the
+ programmer), not dynamic checking.
+
+ 'assume (R)' can affect compilation of all the code, not just code
+ that happens to be executed after the assume (R) is "executed".
+ For example, if the code mistakenly does 'assert (R); assume (R);'
+ the compiler is entitled to optimize away the 'assert (R)'.
+
+ Although assuming R can help a compiler generate better code or
+ diagnostics, performance can suffer if R uses hard-to-optimize
+ features such as function calls not inlined by the compiler.
+
+ Avoid Clang's __builtin_assume, as it breaks GNU Emacs master
+ as of 2020-08-23T21:09:49Z!eggert@cs.ucla.edu; see
+ <https://bugs.gnu.org/43152#71>. It's not known whether this breakage
+ is a Clang bug or an Emacs bug; play it safe for now. */
+
+#if _GL_HAS_BUILTIN_UNREACHABLE
+# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
+#elif 1200 <= _MSC_VER
+# define assume(R) __assume (R)
+#elif (defined GCC_LINT || defined lint) && _GL_HAS_BUILTIN_TRAP
+ /* Doing it this way helps various packages when configured with
+ --enable-gcc-warnings, which compiles with -Dlint. It's nicer
+ when 'assume' silences warnings even with older GCCs. */
+# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
+#else
+ /* Some tools grok NOTREACHED, e.g., Oracle Studio 12.6. */
+# define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0)
+#endif
+
+/* @assert.h omit end@ */
+
+#endif
diff --git a/lib/vsnprintf.c b/lib/vsnprintf.c
new file mode 100644
index 0000000..699e675
--- /dev/null
+++ b/lib/vsnprintf.c
@@ -0,0 +1,70 @@
+/* Formatted output to strings.
+ Copyright (C) 2004, 2006-2020 Free Software Foundation, Inc.
+ Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include <stdio.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "vasnprintf.h"
+
+/* Print formatted output to string STR. Similar to vsprintf, but
+ additional length SIZE limit how much is written into STR. Returns
+ string length of formatted string (which may be larger than SIZE).
+ STR may be NULL, in which case nothing will be written. On error,
+ return a negative value. */
+int
+vsnprintf (char *str, size_t size, const char *format, va_list args)
+{
+ char *output;
+ size_t len;
+ size_t lenbuf = size;
+
+ output = vasnprintf (str, &lenbuf, format, args);
+ len = lenbuf;
+
+ if (!output)
+ return -1;
+
+ if (output != str)
+ {
+ if (size)
+ {
+ size_t pruned_len = (len < size ? len : size - 1);
+ memcpy (str, output, pruned_len);
+ str[pruned_len] = '\0';
+ }
+
+ free (output);
+ }
+
+ if (len > INT_MAX)
+ {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ return len;
+}
diff --git a/lib/w32sock.h b/lib/w32sock.h
new file mode 100644
index 0000000..9c23c9d
--- /dev/null
+++ b/lib/w32sock.h
@@ -0,0 +1,140 @@
+/* w32sock.h --- internal auxiliary functions for Windows socket functions
+
+ Copyright (C) 2008-2020 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/>. */
+
+/* Written by Paolo Bonzini */
+
+#include <errno.h>
+
+/* Get O_RDWR and O_BINARY. */
+#include <fcntl.h>
+
+/* Get _open_osfhandle(). */
+#include <io.h>
+
+/* Get _get_osfhandle(). */
+#if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+#else
+# include <io.h>
+#endif
+
+#define FD_TO_SOCKET(fd) ((SOCKET) _get_osfhandle ((fd)))
+#define SOCKET_TO_FD(fh) (_open_osfhandle ((intptr_t) (fh), O_RDWR | O_BINARY))
+
+static inline void
+set_winsock_errno (void)
+{
+ int err = WSAGetLastError ();
+
+ /* Map some WSAE* errors to the runtime library's error codes. */
+ switch (err)
+ {
+ case WSA_INVALID_HANDLE:
+ errno = EBADF;
+ break;
+ case WSA_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+ case WSA_INVALID_PARAMETER:
+ errno = EINVAL;
+ break;
+ case WSAENAMETOOLONG:
+ errno = ENAMETOOLONG;
+ break;
+ case WSAENOTEMPTY:
+ errno = ENOTEMPTY;
+ break;
+ case WSAEWOULDBLOCK:
+ errno = EWOULDBLOCK;
+ break;
+ case WSAEINPROGRESS:
+ errno = EINPROGRESS;
+ break;
+ case WSAEALREADY:
+ errno = EALREADY;
+ break;
+ case WSAENOTSOCK:
+ errno = ENOTSOCK;
+ break;
+ case WSAEDESTADDRREQ:
+ errno = EDESTADDRREQ;
+ break;
+ case WSAEMSGSIZE:
+ errno = EMSGSIZE;
+ break;
+ case WSAEPROTOTYPE:
+ errno = EPROTOTYPE;
+ break;
+ case WSAENOPROTOOPT:
+ errno = ENOPROTOOPT;
+ break;
+ case WSAEPROTONOSUPPORT:
+ errno = EPROTONOSUPPORT;
+ break;
+ case WSAEOPNOTSUPP:
+ errno = EOPNOTSUPP;
+ break;
+ case WSAEAFNOSUPPORT:
+ errno = EAFNOSUPPORT;
+ break;
+ case WSAEADDRINUSE:
+ errno = EADDRINUSE;
+ break;
+ case WSAEADDRNOTAVAIL:
+ errno = EADDRNOTAVAIL;
+ break;
+ case WSAENETDOWN:
+ errno = ENETDOWN;
+ break;
+ case WSAENETUNREACH:
+ errno = ENETUNREACH;
+ break;
+ case WSAENETRESET:
+ errno = ENETRESET;
+ break;
+ case WSAECONNABORTED:
+ errno = ECONNABORTED;
+ break;
+ case WSAECONNRESET:
+ errno = ECONNRESET;
+ break;
+ case WSAENOBUFS:
+ errno = ENOBUFS;
+ break;
+ case WSAEISCONN:
+ errno = EISCONN;
+ break;
+ case WSAENOTCONN:
+ errno = ENOTCONN;
+ break;
+ case WSAETIMEDOUT:
+ errno = ETIMEDOUT;
+ break;
+ case WSAECONNREFUSED:
+ errno = ECONNREFUSED;
+ break;
+ case WSAELOOP:
+ errno = ELOOP;
+ break;
+ case WSAEHOSTUNREACH:
+ errno = EHOSTUNREACH;
+ break;
+ default:
+ errno = (err > 10000 && err < 10025) ? err - 10000 : err;
+ break;
+ }
+}
diff --git a/lib/wait-process.c b/lib/wait-process.c
new file mode 100644
index 0000000..dd9ea1e
--- /dev/null
+++ b/lib/wait-process.c
@@ -0,0 +1,369 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2005-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+
+#include <config.h>
+
+/* Specification. */
+#include "wait-process.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "error.h"
+#include "fatal-signal.h"
+#include "xalloc.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+#define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
+
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* The return value of _spawnvp() is really a process handle as returned
+ by CreateProcess(). Therefore we can kill it using TerminateProcess. */
+# define kill(pid,sig) TerminateProcess ((HANDLE) (pid), sig)
+
+#endif
+
+
+/* Type of an entry in the slaves array.
+ The 'used' bit determines whether this entry is currently in use.
+ (If pid_t was an atomic type like sig_atomic_t, we could just set the
+ 'child' field to 0 when unregistering a slave process, and wouldn't need
+ the 'used' field.)
+ The 'used' and 'child' fields are accessed from within the cleanup_slaves()
+ action, therefore we mark them as 'volatile'. */
+typedef struct
+{
+ volatile sig_atomic_t used;
+ volatile pid_t child;
+}
+slaves_entry_t;
+
+/* The registered slave subprocesses. */
+static slaves_entry_t static_slaves[32];
+static slaves_entry_t * volatile slaves = static_slaves;
+static sig_atomic_t volatile slaves_count = 0;
+static size_t slaves_allocated = SIZEOF (static_slaves);
+
+/* The termination signal for slave subprocesses.
+ 2003-10-07: Terminator becomes Governator. */
+#ifdef SIGHUP
+# define TERMINATOR SIGHUP
+#else
+# define TERMINATOR SIGTERM
+#endif
+
+/* The cleanup action. It gets called asynchronously. */
+static _GL_ASYNC_SAFE void
+cleanup_slaves (void)
+{
+ for (;;)
+ {
+ /* Get the last registered slave. */
+ size_t n = slaves_count;
+ if (n == 0)
+ break;
+ n--;
+ slaves_count = n;
+ /* Skip unused entries in the slaves array. */
+ if (slaves[n].used)
+ {
+ pid_t slave = slaves[n].child;
+
+ /* Kill the slave. */
+ kill (slave, TERMINATOR);
+ }
+ }
+}
+
+/* The cleanup action, taking a signal argument.
+ It gets called asynchronously. */
+static _GL_ASYNC_SAFE void
+cleanup_slaves_action (int sig _GL_UNUSED)
+{
+ cleanup_slaves ();
+}
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+void
+register_slave_subprocess (pid_t child)
+{
+ static bool cleanup_slaves_registered = false;
+ if (!cleanup_slaves_registered)
+ {
+ atexit (cleanup_slaves);
+ at_fatal_signal (cleanup_slaves_action);
+ cleanup_slaves_registered = true;
+ }
+
+ /* Try to store the new slave in an unused entry of the slaves array. */
+ {
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (!s->used)
+ {
+ /* The two uses of 'volatile' in the slaves_entry_t type above
+ (and ISO C 99 section 5.1.2.3.(5)) ensure that we mark the
+ entry as used only after the child pid has been written to the
+ memory location s->child. */
+ s->child = child;
+ s->used = 1;
+ return;
+ }
+ }
+
+ if (slaves_count == slaves_allocated)
+ {
+ /* Extend the slaves array. Note that we cannot use xrealloc(),
+ because then the cleanup_slaves() function could access an already
+ deallocated array. */
+ slaves_entry_t *old_slaves = slaves;
+ size_t new_slaves_allocated = 2 * slaves_allocated;
+ slaves_entry_t *new_slaves =
+ (slaves_entry_t *)
+ malloc (new_slaves_allocated * sizeof (slaves_entry_t));
+ if (new_slaves == NULL)
+ {
+ /* xalloc_die() will call exit() which will invoke cleanup_slaves().
+ Additionally we need to kill child, because it's not yet among
+ the slaves list. */
+ kill (child, TERMINATOR);
+ xalloc_die ();
+ }
+ memcpy (new_slaves, old_slaves,
+ slaves_allocated * sizeof (slaves_entry_t));
+ slaves = new_slaves;
+ slaves_allocated = new_slaves_allocated;
+ /* Now we can free the old slaves array. */
+ if (old_slaves != static_slaves)
+ free (old_slaves);
+ }
+ /* The three uses of 'volatile' in the types above (and ISO C 99 section
+ 5.1.2.3.(5)) ensure that we increment the slaves_count only after the
+ new slave and its 'used' bit have been written to the memory locations
+ that make up slaves[slaves_count]. */
+ slaves[slaves_count].child = child;
+ slaves[slaves_count].used = 1;
+ slaves_count++;
+}
+
+/* Unregister a child from the list of slave subprocesses. */
+static void
+unregister_slave_subprocess (pid_t child)
+{
+ /* The easiest way to remove an entry from a list that can be used by
+ an asynchronous signal handler is just to mark it as unused. For this,
+ we rely on sig_atomic_t. */
+ slaves_entry_t *s = slaves;
+ slaves_entry_t *s_end = s + slaves_count;
+
+ for (; s < s_end; s++)
+ if (s->used && s->child == child)
+ s->used = 0;
+}
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127. */
+int
+wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp)
+{
+#if HAVE_WAITID && defined WNOWAIT && 0
+ /* Commented out because waitid() without WEXITED and with WNOWAIT doesn't
+ work: On Solaris 7 and OSF/1 4.0, it returns -1 and sets errno = ECHILD,
+ and on HP-UX 10.20 it just hangs. */
+ /* Use of waitid() with WNOWAIT avoids a race condition: If slave_process is
+ true, and this process sleeps a very long time between the return from
+ waitpid() and the execution of unregister_slave_subprocess(), and
+ meanwhile another process acquires the same PID as child, and then - still
+ before unregister_slave_subprocess() - this process gets a fatal signal,
+ it would kill the other totally unrelated process. */
+ siginfo_t info;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED | (slave_process ? WNOWAIT : 0))
+ < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* info.si_code is set to one of CLD_EXITED, CLD_KILLED, CLD_DUMPED,
+ CLD_TRAPPED, CLD_STOPPED, CLD_CONTINUED. Loop until the program
+ terminates. */
+ if (info.si_code == CLD_EXITED
+ || info.si_code == CLD_KILLED || info.si_code == CLD_DUMPED)
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ {
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ /* Now remove the zombie from the process list. */
+ for (;;)
+ {
+ if (waitid (P_PID, child, &info, WEXITED) < 0)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+ break;
+ }
+ }
+
+ switch (info.si_code)
+ {
+ case CLD_KILLED:
+ case CLD_DUMPED:
+ if (termsigp != NULL)
+ *termsigp = info.si_status; /* TODO: or info.si_signo? */
+# ifdef SIGPIPE
+ if (info.si_status == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, info.si_status);
+ return 127;
+ case CLD_EXITED:
+ if (info.si_status == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return info.si_status;
+ default:
+ abort ();
+ }
+#else
+ /* waitpid() is just as portable as wait() nowadays. */
+ int status;
+
+ if (termsigp != NULL)
+ *termsigp = 0;
+ status = 0;
+ for (;;)
+ {
+ int result = waitpid (child, &status, 0);
+
+ if (result != child)
+ {
+# ifdef EINTR
+ if (errno == EINTR)
+ continue;
+# endif
+# if 0 /* defined ECHILD */
+ if (errno == ECHILD)
+ {
+ /* Child process nonexistent?! Assume it terminated
+ successfully. */
+ status = 0;
+ break;
+ }
+# endif
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, errno,
+ _("%s subprocess"), progname);
+ return 127;
+ }
+
+ /* One of WIFSIGNALED (status), WIFEXITED (status), WIFSTOPPED (status)
+ must always be true, since we did not specify WCONTINUED in the
+ waitpid() call. Loop until the program terminates. */
+ if (!WIFSTOPPED (status))
+ break;
+ }
+
+ /* The child process has exited or was signalled. */
+
+ if (slave_process)
+ /* Unregister the child from the list of slave subprocesses, so that
+ later, when we exit, we don't kill a totally unrelated process which
+ may have acquired the same pid. */
+ unregister_slave_subprocess (child);
+
+ if (WIFSIGNALED (status))
+ {
+ if (termsigp != NULL)
+ *termsigp = WTERMSIG (status);
+# ifdef SIGPIPE
+ if (WTERMSIG (status) == SIGPIPE && ignore_sigpipe)
+ return 0;
+# endif
+ if (exit_on_error || (!null_stderr && termsigp == NULL))
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess got fatal signal %d"),
+ progname, (int) WTERMSIG (status));
+ return 127;
+ }
+ if (!WIFEXITED (status))
+ abort ();
+ if (WEXITSTATUS (status) == 127)
+ {
+ if (exit_on_error || !null_stderr)
+ error (exit_on_error ? EXIT_FAILURE : 0, 0,
+ _("%s subprocess failed"), progname);
+ return 127;
+ }
+ return WEXITSTATUS (status);
+#endif
+}
diff --git a/lib/wait-process.h b/lib/wait-process.h
new file mode 100644
index 0000000..849d515
--- /dev/null
+++ b/lib/wait-process.h
@@ -0,0 +1,74 @@
+/* Waiting for a subprocess to finish.
+ Copyright (C) 2001-2003, 2006, 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+ 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/>. */
+
+#ifndef _WAIT_PROCESS_H
+#define _WAIT_PROCESS_H
+
+/* Get pid_t. */
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <stdbool.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Wait for a subprocess to finish. Return its exit code.
+ If it didn't terminate correctly, exit if exit_on_error is true, otherwise
+ return 127.
+ Arguments:
+ - child is the pid of the subprocess.
+ - progname is the name of the program executed by the subprocess, used for
+ error messages.
+ - If ignore_sigpipe is true, consider a subprocess termination due to
+ SIGPIPE as equivalent to a success. This is suitable for processes whose
+ only purpose is to write to standard output. This flag can be safely set
+ to false when the process' standard output is known to go to DEV_NULL.
+ - If null_stderr is true, the usual error message to stderr will be omitted.
+ This is suitable when the subprocess does not fulfill an important task.
+ - slave_process should be set to true if the process has been launched as a
+ slave process.
+ - If exit_on_error is true, any error will cause the main process to exit
+ with an error status.
+ - If termsigp is not NULL: *termsig will be set to the signal that
+ terminated the subprocess (if supported by the platform: not on native
+ Windows platforms), otherwise 0, and the error message about the signal
+ that terminated the subprocess will be omitted.
+ Prerequisites: The signal handler for SIGCHLD should not be set to SIG_IGN,
+ otherwise this function will not work. */
+extern int wait_subprocess (pid_t child, const char *progname,
+ bool ignore_sigpipe, bool null_stderr,
+ bool slave_process, bool exit_on_error,
+ int *termsigp);
+
+/* Register a subprocess as being a slave process. This means that the
+ subprocess will be terminated when its creator receives a catchable fatal
+ signal or exits normally. Registration ends when wait_subprocess()
+ notices that the subprocess has exited. */
+extern void register_slave_subprocess (pid_t child);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _WAIT_PROCESS_H */
diff --git a/lib/waitpid.c b/lib/waitpid.c
new file mode 100644
index 0000000..2ef7661
--- /dev/null
+++ b/lib/waitpid.c
@@ -0,0 +1,30 @@
+/* Wait for process state change.
+ Copyright (C) 2001-2003, 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <sys/wait.h>
+
+/* Implementation for native Windows systems. */
+
+#include <process.h> /* for _cwait, WAIT_CHILD */
+
+pid_t
+waitpid (pid_t pid, int *statusp, int options)
+{
+ return _cwait (statusp, pid, WAIT_CHILD);
+}
diff --git a/lib/warn-on-use.h b/lib/warn-on-use.h
new file mode 100644
index 0000000..3f728d1
--- /dev/null
+++ b/lib/warn-on-use.h
@@ -0,0 +1,149 @@
+/* A C macro for emitting warnings if a function is used.
+ Copyright (C) 2010-2020 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/>. */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+ for FUNCTION which will then trigger a compiler warning containing
+ the text of "literal string" anywhere that function is called, if
+ supported by the compiler. If the compiler does not support this
+ feature, the macro expands to an unused extern declaration.
+
+ _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+ attribute used in _GL_WARN_ON_USE. If the compiler does not support
+ this feature, it expands to empty.
+
+ These macros are useful for marking a function as a potential
+ portability trap, with the intent that "literal string" include
+ instructions on the replacement function that should be used
+ instead.
+ _GL_WARN_ON_USE is for functions with 'extern' linkage.
+ _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+ linkage.
+
+ However, one of the reasons that a function is a portability trap is
+ if it has the wrong signature. Declaring FUNCTION with a different
+ signature in C is a compilation error, so this macro must use the
+ same type as any existing declaration so that programs that avoid
+ the problematic FUNCTION do not fail to compile merely because they
+ included a header that poisoned the function. But this implies that
+ _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+ have a declaration. Use of this macro implies that there must not
+ be any other macro hiding the declaration of FUNCTION; but
+ undefining FUNCTION first is part of the poisoning process anyway
+ (although for symbols that are provided only via a macro, the result
+ is a compilation error rather than a warning containing
+ "literal string"). Also note that in C++, it is only safe to use if
+ FUNCTION has no overloads.
+
+ For an example, it is possible to poison 'getline' by:
+ - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+ [getline]) in configure.ac, which potentially defines
+ HAVE_RAW_DECL_GETLINE
+ - adding this code to a header that wraps the system <stdio.h>:
+ #undef getline
+ #if HAVE_RAW_DECL_GETLINE
+ _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+ "not universally present; use the gnulib module getline");
+ #endif
+
+ It is not possible to directly poison global variables. But it is
+ possible to write a wrapper accessor function, and poison that
+ (less common usage, like &environ, will cause a compilation error
+ rather than issue the nice warning, but the end result of informing
+ the developer about their portability problem is still achieved):
+ #if HAVE_RAW_DECL_ENVIRON
+ static char ***
+ rpl_environ (void) { return &environ; }
+ _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+ # undef environ
+ # define environ (*rpl_environ ())
+ #endif
+ or better (avoiding contradictory use of 'static' and 'extern'):
+ #if HAVE_RAW_DECL_ENVIRON
+ static char ***
+ _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+ rpl_environ (void) { return &environ; }
+ # undef environ
+ # define environ (*rpl_environ ())
+ #endif
+ */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later. */
+# define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+ __attribute__ ((__warning__ (message)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang. */
+# define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function \
+ __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+ __attribute__ ((__diagnose_if__ (1, message, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function. */
+# define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+# define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype_gcc, rettype_clang, parameters_and_attributes, "message")
+ is like _GL_WARN_ON_USE (function, "message"), except that in C++ mode the
+ function is declared with the given prototype, consisting of return type,
+ parameters, and attributes.
+ This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+ not work in this case. */
+#ifndef _GL_WARN_ON_USE_CXX
+# if !defined __cplusplus
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+ _GL_WARN_ON_USE (function, msg)
+# else
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes \
+ __attribute__ ((__warning__ (msg)))
+# elif __clang_major__ >= 4
+/* Another compiler attribute is available in clang. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_clang function parameters_and_attributes \
+ __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+extern rettype_gcc function parameters_and_attributes
+# else /* Unsupported. */
+# define _GL_WARN_ON_USE_CXX(function,rettype_gcc,rettype_clang,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# endif
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+ performs the declaration with C linkage. */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+# define _GL_WARN_EXTERN_C extern "C"
+# else
+# define _GL_WARN_EXTERN_C extern
+# endif
+#endif
diff --git a/lib/wchar.in.h b/lib/wchar.in.h
new file mode 100644
index 0000000..e2da99b
--- /dev/null
+++ b/lib/wchar.in.h
@@ -0,0 +1,1258 @@
+/* A substitute for ISO C99 <wchar.h>, for platforms that have issues.
+
+ Copyright (C) 2007-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Eric Blake. */
+
+/*
+ * ISO C 99 <wchar.h> for platforms that have issues.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wchar.h.html>
+ *
+ * For now, this just ensures proper prerequisite inclusion order and
+ * the declaration of wcwidth().
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (((defined __need_mbstate_t || defined __need_wint_t) \
+ && !defined __MINGW32__) \
+ || (defined __hpux \
+ && ((defined _INTTYPES_INCLUDED \
+ && !defined _GL_FINISHED_INCLUDING_SYSTEM_INTTYPES_H) \
+ || defined _GL_JUST_INCLUDE_SYSTEM_WCHAR_H)) \
+ || (defined __MINGW32__ && defined __STRING_H_SOURCED__) \
+ || defined _GL_ALREADY_INCLUDING_WCHAR_H)
+/* Special invocation convention:
+ - Inside glibc and uClibc header files, but not MinGW.
+ - On HP-UX 11.00 we have a sequence of nested includes
+ <wchar.h> -> <stdlib.h> -> <stdint.h>, and the latter includes <wchar.h>,
+ once indirectly <stdint.h> -> <sys/types.h> -> <inttypes.h> -> <wchar.h>
+ and once directly. In both situations 'wint_t' is not yet defined,
+ therefore we cannot provide the function overrides; instead include only
+ the system's <wchar.h>.
+ - With MinGW 3.22, when <string.h> includes <wchar.h>, only some part of
+ <wchar.h> is actually processed, and that doesn't include 'mbstate_t'.
+ - On IRIX 6.5, similarly, we have an include <wchar.h> -> <wctype.h>, and
+ the latter includes <wchar.h>. But here, we have no way to detect whether
+ <wctype.h> is completely included or is still being included. */
+
+#@INCLUDE_NEXT@ @NEXT_WCHAR_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+
+#define _GL_ALREADY_INCLUDING_WCHAR_H
+
+#if @HAVE_FEATURES_H@
+# include <features.h> /* for __GLIBC__ */
+#endif
+
+/* In some builds of uClibc, <wchar.h> is nonexistent and wchar_t is defined
+ by <stddef.h>.
+ But avoid namespace pollution on glibc systems. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+#endif
+
+/* Include the original <wchar.h> if it exists.
+ Some builds of uClibc lack it. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCHAR_H@
+# @INCLUDE_NEXT@ @NEXT_WCHAR_H@
+#endif
+
+#undef _GL_ALREADY_INCLUDING_WCHAR_H
+
+#ifndef _@GUARD_PREFIX@_WCHAR_H
+#define _@GUARD_PREFIX@_WCHAR_H
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+ The attribute __pure__ was added in gcc 2.96. */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) || defined __clang__
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_ARG_NONNULL is copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+
+/* Define wint_t and WEOF. (Also done in wctype.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
+ <stddef.h>. This is too small: ISO C 99 section 7.24.1.(2) says that
+ wint_t must be "unchanged by default argument promotions". Override it. */
+# if @GNULIB_OVERRIDES_WINT_T@
+# if !GNULIB_defined_wint_t
+# if @HAVE_CRTDEFS_H@
+# include <crtdefs.h>
+# else
+# include <stddef.h>
+# endif
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+/* Override mbstate_t if it is too small.
+ On IRIX 6.5, sizeof (mbstate_t) == 1, which is not sufficient for
+ implementing mbrtowc for encodings like UTF-8.
+ On AIX and MSVC, mbrtowc needs to be overridden, but mbstate_t exists and is
+ large enough and overriding it would cause problems in C++ mode. */
+#if !(((defined _WIN32 && !defined __CYGWIN__) || @HAVE_MBSINIT@) && @HAVE_MBRTOWC@) || @REPLACE_MBSTATE_T@
+# if !GNULIB_defined_mbstate_t
+# if !(defined _AIX || defined _MSC_VER)
+typedef int rpl_mbstate_t;
+# undef mbstate_t
+# define mbstate_t rpl_mbstate_t
+# endif
+# define GNULIB_defined_mbstate_t 1
+# endif
+#endif
+
+
+/* Convert a single-byte character to a wide character. */
+#if @GNULIB_BTOWC@
+# if @REPLACE_BTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef btowc
+# define btowc rpl_btowc
+# endif
+_GL_FUNCDECL_RPL (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (btowc, wint_t, (int c));
+# else
+# if !@HAVE_BTOWC@
+_GL_FUNCDECL_SYS (btowc, wint_t, (int c) _GL_ATTRIBUTE_PURE);
+# endif
+/* Need to cast, because on mingw, the return type is 'unsigned short'. */
+_GL_CXXALIAS_SYS_CAST (btowc, wint_t, (int c));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (btowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef btowc
+# if HAVE_RAW_DECL_BTOWC
+_GL_WARN_ON_USE (btowc, "btowc is unportable - "
+ "use gnulib module btowc for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a single-byte character. */
+#if @GNULIB_WCTOB@
+# if @REPLACE_WCTOB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wctob
+# define wctob rpl_wctob
+# endif
+_GL_FUNCDECL_RPL (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wctob, int, (wint_t wc));
+# else
+# if !defined wctob && !@HAVE_DECL_WCTOB@
+/* wctob is provided by gnulib, or wctob exists but is not declared. */
+_GL_FUNCDECL_SYS (wctob, int, (wint_t wc) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wctob, int, (wint_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctob);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctob
+# if HAVE_RAW_DECL_WCTOB
+_GL_WARN_ON_USE (wctob, "wctob is unportable - "
+ "use gnulib module wctob for portability");
+# endif
+#endif
+
+
+/* Test whether *PS is in the initial state. */
+#if @GNULIB_MBSINIT@
+# if @REPLACE_MBSINIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsinit
+# define mbsinit rpl_mbsinit
+# endif
+_GL_FUNCDECL_RPL (mbsinit, int, (const mbstate_t *ps));
+_GL_CXXALIAS_RPL (mbsinit, int, (const mbstate_t *ps));
+# else
+# if !@HAVE_MBSINIT@
+_GL_FUNCDECL_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+_GL_CXXALIAS_SYS (mbsinit, int, (const mbstate_t *ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbsinit);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsinit
+# if HAVE_RAW_DECL_MBSINIT
+_GL_WARN_ON_USE (mbsinit, "mbsinit is unportable - "
+ "use gnulib module mbsinit for portability");
+# endif
+#endif
+
+
+/* Convert a multibyte character to a wide character. */
+#if @GNULIB_MBRTOWC@
+# if @REPLACE_MBRTOWC@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrtowc
+# define mbrtowc rpl_mbrtowc
+# endif
+_GL_FUNCDECL_RPL (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBRTOWC@
+_GL_FUNCDECL_SYS (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (mbrtowc, size_t,
+ (wchar_t *restrict pwc, const char *restrict s, size_t n,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbrtowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrtowc
+# if HAVE_RAW_DECL_MBRTOWC
+_GL_WARN_ON_USE (mbrtowc, "mbrtowc is unportable - "
+ "use gnulib module mbrtowc for portability");
+# endif
+#endif
+
+
+/* Recognize a multibyte character. */
+#if @GNULIB_MBRLEN@
+# if @REPLACE_MBRLEN@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbrlen
+# define mbrlen rpl_mbrlen
+# endif
+_GL_FUNCDECL_RPL (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBRLEN@
+_GL_FUNCDECL_SYS (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (mbrlen, size_t,
+ (const char *restrict s, size_t n, mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbrlen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbrlen
+# if HAVE_RAW_DECL_MBRLEN
+_GL_WARN_ON_USE (mbrlen, "mbrlen is unportable - "
+ "use gnulib module mbrlen for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSRTOWCS@
+# if @REPLACE_MBSRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsrtowcs
+# define mbsrtowcs rpl_mbsrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBSRTOWCS@
+_GL_FUNCDECL_SYS (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbsrtowcs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbsrtowcs
+# if HAVE_RAW_DECL_MBSRTOWCS
+_GL_WARN_ON_USE (mbsrtowcs, "mbsrtowcs is unportable - "
+ "use gnulib module mbsrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a string to a wide string. */
+#if @GNULIB_MBSNRTOWCS@
+# if @REPLACE_MBSNRTOWCS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef mbsnrtowcs
+# define mbsnrtowcs rpl_mbsnrtowcs
+# endif
+_GL_FUNCDECL_RPL (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_MBSNRTOWCS@
+_GL_FUNCDECL_SYS (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (mbsnrtowcs, size_t,
+ (wchar_t *restrict dest,
+ const char **restrict srcp, size_t srclen, size_t len,
+ mbstate_t *restrict ps));
+# endif
+_GL_CXXALIASWARN (mbsnrtowcs);
+#elif defined GNULIB_POSIXCHECK
+# undef mbsnrtowcs
+# if HAVE_RAW_DECL_MBSNRTOWCS
+_GL_WARN_ON_USE (mbsnrtowcs, "mbsnrtowcs is unportable - "
+ "use gnulib module mbsnrtowcs for portability");
+# endif
+#endif
+
+
+/* Convert a wide character to a multibyte character. */
+#if @GNULIB_WCRTOMB@
+# if @REPLACE_WCRTOMB@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcrtomb
+# define wcrtomb rpl_wcrtomb
+# endif
+_GL_FUNCDECL_RPL (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+_GL_CXXALIAS_RPL (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCRTOMB@
+_GL_FUNCDECL_SYS (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# endif
+_GL_CXXALIAS_SYS (wcrtomb, size_t,
+ (char *restrict s, wchar_t wc, mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcrtomb);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcrtomb
+# if HAVE_RAW_DECL_WCRTOMB
+_GL_WARN_ON_USE (wcrtomb, "wcrtomb is unportable - "
+ "use gnulib module wcrtomb for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSRTOMBS@
+# if @REPLACE_WCSRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsrtombs
+# define wcsrtombs rpl_wcsrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCSRTOMBS@
+_GL_FUNCDECL_SYS (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsrtombs, size_t,
+ (char *restrict dest, const wchar_t **restrict srcp,
+ size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsrtombs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrtombs
+# if HAVE_RAW_DECL_WCSRTOMBS
+_GL_WARN_ON_USE (wcsrtombs, "wcsrtombs is unportable - "
+ "use gnulib module wcsrtombs for portability");
+# endif
+#endif
+
+
+/* Convert a wide string to a string. */
+#if @GNULIB_WCSNRTOMBS@
+# if @REPLACE_WCSNRTOMBS@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsnrtombs
+# define wcsnrtombs rpl_wcsnrtombs
+# endif
+_GL_FUNCDECL_RPL (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps));
+# else
+# if !@HAVE_WCSNRTOMBS@ || (defined __cplusplus && defined __sun)
+_GL_FUNCDECL_SYS (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps)
+ _GL_ARG_NONNULL ((2)));
+# endif
+_GL_CXXALIAS_SYS (wcsnrtombs, size_t,
+ (char *restrict dest,
+ const wchar_t **restrict srcp, size_t srclen,
+ size_t len,
+ mbstate_t *restrict ps));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsnrtombs);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnrtombs
+# if HAVE_RAW_DECL_WCSNRTOMBS
+_GL_WARN_ON_USE (wcsnrtombs, "wcsnrtombs is unportable - "
+ "use gnulib module wcsnrtombs for portability");
+# endif
+#endif
+
+
+/* Return the number of screen columns needed for WC. */
+#if @GNULIB_WCWIDTH@
+# if @REPLACE_WCWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcwidth
+# define wcwidth rpl_wcwidth
+# endif
+_GL_FUNCDECL_RPL (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wcwidth, int, (wchar_t));
+# else
+# if !@HAVE_DECL_WCWIDTH@
+/* wcwidth exists but is not declared. */
+_GL_FUNCDECL_SYS (wcwidth, int, (wchar_t) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcwidth, int, (wchar_t));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcwidth);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcwidth
+# if HAVE_RAW_DECL_WCWIDTH
+_GL_WARN_ON_USE (wcwidth, "wcwidth is unportable - "
+ "use gnulib module wcwidth for portability");
+# endif
+#endif
+
+
+/* Search N wide characters of S for C. */
+#if @GNULIB_WMEMCHR@
+# if !@HAVE_WMEMCHR@
+_GL_FUNCDECL_SYS (wmemchr, wchar_t *, (const wchar_t *s, wchar_t c, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wmemchr (const wchar_t *, wchar_t, size_t);
+ wchar_t * std::wmemchr (wchar_t *, wchar_t, size_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wmemchr,
+ wchar_t *, (const wchar_t *, wchar_t, size_t),
+ const wchar_t *, (const wchar_t *, wchar_t, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wmemchr, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+_GL_CXXALIASWARN1 (wmemchr, const wchar_t *,
+ (const wchar_t *s, wchar_t c, size_t n));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemchr
+# if HAVE_RAW_DECL_WMEMCHR
+_GL_WARN_ON_USE (wmemchr, "wmemchr is unportable - "
+ "use gnulib module wmemchr for portability");
+# endif
+#endif
+
+
+/* Compare N wide characters of S1 and S2. */
+#if @GNULIB_WMEMCMP@
+# if !@HAVE_WMEMCMP@
+_GL_FUNCDECL_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wmemcmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemcmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcmp
+# if HAVE_RAW_DECL_WMEMCMP
+_GL_WARN_ON_USE (wmemcmp, "wmemcmp is unportable - "
+ "use gnulib module wmemcmp for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST. */
+#if @GNULIB_WMEMCPY@
+# if !@HAVE_WMEMCPY@
+_GL_FUNCDECL_SYS (wmemcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemcpy
+# if HAVE_RAW_DECL_WMEMCPY
+_GL_WARN_ON_USE (wmemcpy, "wmemcpy is unportable - "
+ "use gnulib module wmemcpy for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST, guaranteeing correct behavior for
+ overlapping memory areas. */
+#if @GNULIB_WMEMMOVE@
+# if !@HAVE_WMEMMOVE@
+_GL_FUNCDECL_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemmove, wchar_t *,
+ (wchar_t *dest, const wchar_t *src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemmove);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemmove
+# if HAVE_RAW_DECL_WMEMMOVE
+_GL_WARN_ON_USE (wmemmove, "wmemmove is unportable - "
+ "use gnulib module wmemmove for portability");
+# endif
+#endif
+
+
+/* Copy N wide characters of SRC to DEST.
+ Return pointer to wide characters after the last written wide character. */
+#if @GNULIB_WMEMPCPY@
+# if !@HAVE_WMEMPCPY@
+_GL_FUNCDECL_SYS (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmempcpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmempcpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmempcpy
+# if HAVE_RAW_DECL_WMEMPCPY
+_GL_WARN_ON_USE (wmempcpy, "wmempcpy is unportable - "
+ "use gnulib module wmempcpy for portability");
+# endif
+#endif
+
+
+/* Set N wide characters of S to C. */
+#if @GNULIB_WMEMSET@
+# if !@HAVE_WMEMSET@
+_GL_FUNCDECL_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wmemset, wchar_t *, (wchar_t *s, wchar_t c, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wmemset);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wmemset
+# if HAVE_RAW_DECL_WMEMSET
+_GL_WARN_ON_USE (wmemset, "wmemset is unportable - "
+ "use gnulib module wmemset for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S. */
+#if @GNULIB_WCSLEN@
+# if !@HAVE_WCSLEN@
+_GL_FUNCDECL_SYS (wcslen, size_t, (const wchar_t *s) _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcslen, size_t, (const wchar_t *s));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcslen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcslen
+# if HAVE_RAW_DECL_WCSLEN
+_GL_WARN_ON_USE (wcslen, "wcslen is unportable - "
+ "use gnulib module wcslen for portability");
+# endif
+#endif
+
+
+/* Return the number of wide characters in S, but at most MAXLEN. */
+#if @GNULIB_WCSNLEN@
+# if !@HAVE_WCSNLEN@
+_GL_FUNCDECL_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsnlen, size_t, (const wchar_t *s, size_t maxlen));
+_GL_CXXALIASWARN (wcsnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsnlen
+# if HAVE_RAW_DECL_WCSNLEN
+_GL_WARN_ON_USE (wcsnlen, "wcsnlen is unportable - "
+ "use gnulib module wcsnlen for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST. */
+#if @GNULIB_WCSCPY@
+# if !@HAVE_WCSCPY@
+_GL_FUNCDECL_SYS (wcscpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcscpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscpy
+# if HAVE_RAW_DECL_WCSCPY
+_GL_WARN_ON_USE (wcscpy, "wcscpy is unportable - "
+ "use gnulib module wcscpy for portability");
+# endif
+#endif
+
+
+/* Copy SRC to DEST, returning the address of the terminating L'\0' in DEST. */
+#if @GNULIB_WCPCPY@
+# if !@HAVE_WCPCPY@
+_GL_FUNCDECL_SYS (wcpcpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcpcpy, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+_GL_CXXALIASWARN (wcpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpcpy
+# if HAVE_RAW_DECL_WCPCPY
+_GL_WARN_ON_USE (wcpcpy, "wcpcpy is unportable - "
+ "use gnulib module wcpcpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N wide characters of SRC to DEST. */
+#if @GNULIB_WCSNCPY@
+# if !@HAVE_WCSNCPY@
+_GL_FUNCDECL_SYS (wcsncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncpy);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncpy
+# if HAVE_RAW_DECL_WCSNCPY
+_GL_WARN_ON_USE (wcsncpy, "wcsncpy is unportable - "
+ "use gnulib module wcsncpy for portability");
+# endif
+#endif
+
+
+/* Copy no more than N characters of SRC to DEST, returning the address of
+ the last character written into DEST. */
+#if @GNULIB_WCPNCPY@
+# if !@HAVE_WCPNCPY@
+_GL_FUNCDECL_SYS (wcpncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcpncpy, wchar_t *,
+ (wchar_t *restrict dest,
+ const wchar_t *restrict src, size_t n));
+_GL_CXXALIASWARN (wcpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef wcpncpy
+# if HAVE_RAW_DECL_WCPNCPY
+_GL_WARN_ON_USE (wcpncpy, "wcpncpy is unportable - "
+ "use gnulib module wcpncpy for portability");
+# endif
+#endif
+
+
+/* Append SRC onto DEST. */
+#if @GNULIB_WCSCAT@
+# if !@HAVE_WCSCAT@
+_GL_FUNCDECL_SYS (wcscat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# endif
+_GL_CXXALIAS_SYS (wcscat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscat
+# if HAVE_RAW_DECL_WCSCAT
+_GL_WARN_ON_USE (wcscat, "wcscat is unportable - "
+ "use gnulib module wcscat for portability");
+# endif
+#endif
+
+
+/* Append no more than N wide characters of SRC onto DEST. */
+#if @GNULIB_WCSNCAT@
+# if !@HAVE_WCSNCAT@
+_GL_FUNCDECL_SYS (wcsncat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src,
+ size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsncat, wchar_t *,
+ (wchar_t *restrict dest, const wchar_t *restrict src,
+ size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncat
+# if HAVE_RAW_DECL_WCSNCAT
+_GL_WARN_ON_USE (wcsncat, "wcsncat is unportable - "
+ "use gnulib module wcsncat for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2. */
+#if @GNULIB_WCSCMP@
+# if !@HAVE_WCSCMP@
+_GL_FUNCDECL_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscmp, int, (const wchar_t *s1, const wchar_t *s2));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscmp
+# if HAVE_RAW_DECL_WCSCMP
+_GL_WARN_ON_USE (wcscmp, "wcscmp is unportable - "
+ "use gnulib module wcscmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N wide characters of S1 and S2. */
+#if @GNULIB_WCSNCMP@
+# if !@HAVE_WCSNCMP@
+_GL_FUNCDECL_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsncmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsncmp);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncmp
+# if HAVE_RAW_DECL_WCSNCMP
+_GL_WARN_ON_USE (wcsncmp, "wcsncmp is unportable - "
+ "use gnulib module wcsncmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, ignoring case. */
+#if @GNULIB_WCSCASECMP@
+# if !@HAVE_WCSCASECMP@
+_GL_FUNCDECL_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscasecmp, int, (const wchar_t *s1, const wchar_t *s2));
+_GL_CXXALIASWARN (wcscasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcscasecmp
+# if HAVE_RAW_DECL_WCSCASECMP
+_GL_WARN_ON_USE (wcscasecmp, "wcscasecmp is unportable - "
+ "use gnulib module wcscasecmp for portability");
+# endif
+#endif
+
+
+/* Compare no more than N chars of S1 and S2, ignoring case. */
+#if @GNULIB_WCSNCASECMP@
+# if !@HAVE_WCSNCASECMP@
+_GL_FUNCDECL_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsncasecmp, int,
+ (const wchar_t *s1, const wchar_t *s2, size_t n));
+_GL_CXXALIASWARN (wcsncasecmp);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsncasecmp
+# if HAVE_RAW_DECL_WCSNCASECMP
+_GL_WARN_ON_USE (wcsncasecmp, "wcsncasecmp is unportable - "
+ "use gnulib module wcsncasecmp for portability");
+# endif
+#endif
+
+
+/* Compare S1 and S2, both interpreted as appropriate to the LC_COLLATE
+ category of the current locale. */
+#if @GNULIB_WCSCOLL@
+# if !@HAVE_WCSCOLL@
+_GL_FUNCDECL_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+# endif
+_GL_CXXALIAS_SYS (wcscoll, int, (const wchar_t *s1, const wchar_t *s2));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscoll);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscoll
+# if HAVE_RAW_DECL_WCSCOLL
+_GL_WARN_ON_USE (wcscoll, "wcscoll is unportable - "
+ "use gnulib module wcscoll for portability");
+# endif
+#endif
+
+
+/* Transform S2 into array pointed to by S1 such that if wcscmp is applied
+ to two transformed strings the result is the as applying 'wcscoll' to the
+ original strings. */
+#if @GNULIB_WCSXFRM@
+# if !@HAVE_WCSXFRM@
+_GL_FUNCDECL_SYS (wcsxfrm, size_t,
+ (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
+# endif
+_GL_CXXALIAS_SYS (wcsxfrm, size_t,
+ (wchar_t *restrict s1, const wchar_t *restrict s2, size_t n));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsxfrm);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsxfrm
+# if HAVE_RAW_DECL_WCSXFRM
+_GL_WARN_ON_USE (wcsxfrm, "wcsxfrm is unportable - "
+ "use gnulib module wcsxfrm for portability");
+# endif
+#endif
+
+
+/* Duplicate S, returning an identical malloc'd string. */
+#if @GNULIB_WCSDUP@
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsdup
+# define wcsdup _wcsdup
+# endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+# if !@HAVE_WCSDUP@
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+_GL_CXXALIASWARN (wcsdup);
+#elif defined GNULIB_POSIXCHECK
+# undef wcsdup
+# if HAVE_RAW_DECL_WCSDUP
+_GL_WARN_ON_USE (wcsdup, "wcsdup is unportable - "
+ "use gnulib module wcsdup for portability");
+# endif
+#elif @GNULIB_MDA_WCSDUP@
+/* On native Windows, map 'wcsdup' to '_wcsdup', so that -loldnames is not
+ required. In C++ with GNULIB_NAMESPACE, avoid differences between
+ platforms by defining GNULIB_NAMESPACE::wcsdup always. */
+# if defined _WIN32 && !defined __CYGWIN__
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsdup
+# define wcsdup _wcsdup
+# endif
+_GL_CXXALIAS_MDA (wcsdup, wchar_t *, (const wchar_t *s));
+# else
+_GL_FUNCDECL_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# if @HAVE_DECL_WCSDUP@
+_GL_CXXALIAS_SYS (wcsdup, wchar_t *, (const wchar_t *s));
+# endif
+# endif
+# if (defined _WIN32 && !defined __CYGWIN__) || @HAVE_DECL_WCSDUP@
+_GL_CXXALIASWARN (wcsdup);
+# endif
+#endif
+
+
+/* Find the first occurrence of WC in WCS. */
+#if @GNULIB_WCSCHR@
+# if !@HAVE_WCSCHR@
+_GL_FUNCDECL_SYS (wcschr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcschr (const wchar_t *, wchar_t);
+ wchar_t * std::wcschr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcschr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcschr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcschr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcschr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcschr
+# if HAVE_RAW_DECL_WCSCHR
+_GL_WARN_ON_USE (wcschr, "wcschr is unportable - "
+ "use gnulib module wcschr for portability");
+# endif
+#endif
+
+
+/* Find the last occurrence of WC in WCS. */
+#if @GNULIB_WCSRCHR@
+# if !@HAVE_WCSRCHR@
+_GL_FUNCDECL_SYS (wcsrchr, wchar_t *, (const wchar_t *wcs, wchar_t wc)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsrchr (const wchar_t *, wchar_t);
+ wchar_t * std::wcsrchr (wchar_t *, wchar_t);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsrchr,
+ wchar_t *, (const wchar_t *, wchar_t),
+ const wchar_t *, (const wchar_t *, wchar_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsrchr, wchar_t *, (wchar_t *wcs, wchar_t wc));
+_GL_CXXALIASWARN1 (wcsrchr, const wchar_t *, (const wchar_t *wcs, wchar_t wc));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsrchr
+# if HAVE_RAW_DECL_WCSRCHR
+_GL_WARN_ON_USE (wcsrchr, "wcsrchr is unportable - "
+ "use gnulib module wcsrchr for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters not in REJECT. */
+#if @GNULIB_WCSCSPN@
+# if !@HAVE_WCSCSPN@
+_GL_FUNCDECL_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcscspn, size_t, (const wchar_t *wcs, const wchar_t *reject));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcscspn);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcscspn
+# if HAVE_RAW_DECL_WCSCSPN
+_GL_WARN_ON_USE (wcscspn, "wcscspn is unportable - "
+ "use gnulib module wcscspn for portability");
+# endif
+#endif
+
+
+/* Return the length of the initial segmet of WCS which consists entirely
+ of wide characters in ACCEPT. */
+#if @GNULIB_WCSSPN@
+# if !@HAVE_WCSSPN@
+_GL_FUNCDECL_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcsspn, size_t, (const wchar_t *wcs, const wchar_t *accept));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsspn);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsspn
+# if HAVE_RAW_DECL_WCSSPN
+_GL_WARN_ON_USE (wcsspn, "wcsspn is unportable - "
+ "use gnulib module wcsspn for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence in WCS of any character in ACCEPT. */
+#if @GNULIB_WCSPBRK@
+# if !@HAVE_WCSPBRK@
+_GL_FUNCDECL_SYS (wcspbrk, wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcspbrk (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcspbrk (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcspbrk,
+ wchar_t *, (const wchar_t *, const wchar_t *),
+ const wchar_t *, (const wchar_t *, const wchar_t *));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcspbrk, wchar_t *,
+ (wchar_t *wcs, const wchar_t *accept));
+_GL_CXXALIASWARN1 (wcspbrk, const wchar_t *,
+ (const wchar_t *wcs, const wchar_t *accept));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcspbrk);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcspbrk
+# if HAVE_RAW_DECL_WCSPBRK
+_GL_WARN_ON_USE (wcspbrk, "wcspbrk is unportable - "
+ "use gnulib module wcspbrk for portability");
+# endif
+#endif
+
+
+/* Find the first occurrence of NEEDLE in HAYSTACK. */
+#if @GNULIB_WCSSTR@
+# if !@HAVE_WCSSTR@
+_GL_FUNCDECL_SYS (wcsstr, wchar_t *,
+ (const wchar_t *restrict haystack,
+ const wchar_t *restrict needle)
+ _GL_ATTRIBUTE_PURE);
+# endif
+ /* On some systems, this function is defined as an overloaded function:
+ extern "C++" {
+ const wchar_t * std::wcsstr (const wchar_t *, const wchar_t *);
+ wchar_t * std::wcsstr (wchar_t *, const wchar_t *);
+ } */
+_GL_CXXALIAS_SYS_CAST2 (wcsstr,
+ wchar_t *,
+ (const wchar_t *restrict, const wchar_t *restrict),
+ const wchar_t *,
+ (const wchar_t *restrict, const wchar_t *restrict));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+ && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (wcsstr, wchar_t *,
+ (wchar_t *restrict haystack,
+ const wchar_t *restrict needle));
+_GL_CXXALIASWARN1 (wcsstr, const wchar_t *,
+ (const wchar_t *restrict haystack,
+ const wchar_t *restrict needle));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsstr
+# if HAVE_RAW_DECL_WCSSTR
+_GL_WARN_ON_USE (wcsstr, "wcsstr is unportable - "
+ "use gnulib module wcsstr for portability");
+# endif
+#endif
+
+
+/* Divide WCS into tokens separated by characters in DELIM. */
+#if @GNULIB_WCSTOK@
+# if @REPLACE_WCSTOK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcstok
+# define wcstok rpl_wcstok
+# endif
+_GL_FUNCDECL_RPL (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+_GL_CXXALIAS_RPL (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# else
+# if !@HAVE_WCSTOK@
+_GL_FUNCDECL_SYS (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# endif
+_GL_CXXALIAS_SYS (wcstok, wchar_t *,
+ (wchar_t *restrict wcs, const wchar_t *restrict delim,
+ wchar_t **restrict ptr));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcstok);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcstok
+# if HAVE_RAW_DECL_WCSTOK
+_GL_WARN_ON_USE (wcstok, "wcstok is unportable - "
+ "use gnulib module wcstok for portability");
+# endif
+#endif
+
+
+/* Determine number of column positions required for first N wide
+ characters (or fewer if S ends before this) in S. */
+#if @GNULIB_WCSWIDTH@
+# if @REPLACE_WCSWIDTH@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcswidth
+# define wcswidth rpl_wcswidth
+# endif
+_GL_FUNCDECL_RPL (wcswidth, int, (const wchar_t *s, size_t n)
+ _GL_ATTRIBUTE_PURE);
+_GL_CXXALIAS_RPL (wcswidth, int, (const wchar_t *s, size_t n));
+# else
+# if !@HAVE_WCSWIDTH@
+_GL_FUNCDECL_SYS (wcswidth, int, (const wchar_t *s, size_t n)
+ _GL_ATTRIBUTE_PURE);
+# endif
+_GL_CXXALIAS_SYS (wcswidth, int, (const wchar_t *s, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcswidth);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcswidth
+# if HAVE_RAW_DECL_WCSWIDTH
+_GL_WARN_ON_USE (wcswidth, "wcswidth is unportable - "
+ "use gnulib module wcswidth for portability");
+# endif
+#endif
+
+
+/* Convert *TP to a date and time wide string. See
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/wcsftime.html>. */
+#if @GNULIB_WCSFTIME@
+# if @REPLACE_WCSFTIME@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef wcsftime
+# define wcsftime rpl_wcsftime
+# endif
+_GL_FUNCDECL_RPL (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp)
+ _GL_ARG_NONNULL ((1, 3, 4)));
+_GL_CXXALIAS_RPL (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp));
+# else
+# if !@HAVE_WCSFTIME@
+_GL_FUNCDECL_SYS (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp)
+ _GL_ARG_NONNULL ((1, 3, 4)));
+# endif
+_GL_CXXALIAS_SYS (wcsftime, size_t,
+ (wchar_t *restrict __buf, size_t __bufsize,
+ const wchar_t *restrict __fmt,
+ const struct tm *restrict __tp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wcsftime);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wcsftime
+# if HAVE_RAW_DECL_WCSFTIME
+_GL_WARN_ON_USE (wcsftime, "wcsftime is unportable - "
+ "use gnulib module wcsftime for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif /* _@GUARD_PREFIX@_WCHAR_H */
+#endif
diff --git a/lib/wcrtomb.c b/lib/wcrtomb.c
new file mode 100644
index 0000000..06105f1
--- /dev/null
+++ b/lib/wcrtomb.c
@@ -0,0 +1,80 @@
+/* Convert wide character to multibyte character.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include <errno.h>
+#include <stdlib.h>
+
+
+size_t
+wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
+#undef wcrtomb
+{
+ /* This implementation of wcrtomb supports only stateless encodings.
+ ps must be in the initial state. */
+ if (ps != NULL && !mbsinit (ps))
+ {
+ errno = EINVAL;
+ return (size_t)(-1);
+ }
+
+#if !HAVE_WCRTOMB /* IRIX 6.5 */ \
+ || WCRTOMB_RETVAL_BUG /* Solaris 11.3, MSVC */ \
+ || WCRTOMB_C_LOCALE_BUG /* Android */
+ if (s == NULL)
+ /* We know the NUL wide character corresponds to the NUL character. */
+ return 1;
+ else
+#endif
+ {
+#if HAVE_WCRTOMB
+# if WCRTOMB_C_LOCALE_BUG /* Android */
+ /* Implement consistently with mbrtowc(): through a 1:1 correspondence,
+ as in ISO-8859-1. */
+ if (wc >= 0 && wc <= 0xff)
+ {
+ *s = (unsigned char) wc;
+ return 1;
+ }
+ else
+ {
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+# else
+ return wcrtomb (s, wc, ps);
+# endif
+#else /* IRIX 6.5 */
+ /* Fallback for platforms that don't have wcrtomb().
+ Implement on top of wctomb().
+ This code is not multithread-safe. */
+ int ret = wctomb (s, wc);
+
+ if (ret >= 0)
+ return ret;
+ else
+ {
+ errno = EILSEQ;
+ return (size_t)(-1);
+ }
+#endif
+ }
+}
diff --git a/lib/wctype-h.c b/lib/wctype-h.c
new file mode 100644
index 0000000..bb5f847
--- /dev/null
+++ b/lib/wctype-h.c
@@ -0,0 +1,4 @@
+/* Normally this would be wctype.c, but that name's already taken. */
+#include <config.h>
+#define _GL_WCTYPE_INLINE _GL_EXTERN_INLINE
+#include "wctype.h"
diff --git a/lib/wctype.in.h b/lib/wctype.in.h
new file mode 100644
index 0000000..82b3c7d
--- /dev/null
+++ b/lib/wctype.in.h
@@ -0,0 +1,732 @@
+/* A substitute for ISO C99 <wctype.h>, for platforms that lack it.
+
+ Copyright (C) 2006-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible and Paul Eggert. */
+
+/*
+ * ISO C 99 <wctype.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/wctype.h.html>
+ *
+ * iswctype, towctrans, towlower, towupper, wctrans, wctype,
+ * wctrans_t, and wctype_t are not yet implemented.
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if (defined __MINGW32__ && defined __CTYPE_H_SOURCED__)
+
+/* Special invocation convention:
+ - With MinGW 3.22, when <ctype.h> includes <wctype.h>, only some part of
+ <wctype.h> is being processed, which doesn't include the idempotency
+ guard. */
+
+#@INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+
+#else
+/* Normal invocation convention. */
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+
+#if @HAVE_WINT_T@
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
+# include <wchar.h>
+#endif
+
+/* Native Windows (mingw, MSVC) have declarations of towupper, towlower, and
+ isw* functions in <ctype.h>, <wchar.h> as well as in <wctype.h>. Include
+ <ctype.h>, <wchar.h> in advance to avoid rpl_ prefix being added to the
+ declarations. */
+#if defined _WIN32 && ! defined __CYGWIN__
+# include <ctype.h>
+# include <wchar.h>
+#endif
+
+/* Include the original <wctype.h> if it exists.
+ BeOS 5 has the functions but no <wctype.h>. */
+/* The include_next requires a split double-inclusion guard. */
+#if @HAVE_WCTYPE_H@
+# @INCLUDE_NEXT@ @NEXT_WCTYPE_H@
+#endif
+
+#ifndef _@GUARD_PREFIX@_WCTYPE_H
+#define _@GUARD_PREFIX@_WCTYPE_H
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_WCTYPE_INLINE
+# define _GL_WCTYPE_INLINE _GL_INLINE
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
+
+/* The definition of _GL_WARN_ON_USE is copied here. */
+
+/* Solaris 2.6 <wctype.h> includes <widec.h> which includes <euc.h> which
+ #defines a number of identifiers in the application namespace. Revert
+ these #defines. */
+#ifdef __sun
+# undef multibyte
+# undef eucw1
+# undef eucw2
+# undef eucw3
+# undef scrw1
+# undef scrw2
+# undef scrw3
+#endif
+
+/* Define wint_t and WEOF. (Also done in wchar.in.h.) */
+#if !@HAVE_WINT_T@ && !defined wint_t
+# define wint_t int
+# ifndef WEOF
+# define WEOF -1
+# endif
+#else
+/* mingw and MSVC define wint_t as 'unsigned short' in <crtdefs.h> or
+ <stddef.h>. This is too small: ISO C 99 section 7.24.1.(2) says that
+ wint_t must be "unchanged by default argument promotions". Override it. */
+# if @GNULIB_OVERRIDES_WINT_T@
+# if !GNULIB_defined_wint_t
+# if @HAVE_CRTDEFS_H@
+# include <crtdefs.h>
+# else
+# include <stddef.h>
+# endif
+typedef unsigned int rpl_wint_t;
+# undef wint_t
+# define wint_t rpl_wint_t
+# define GNULIB_defined_wint_t 1
+# endif
+# endif
+# ifndef WEOF
+# define WEOF ((wint_t) -1)
+# endif
+#endif
+
+
+#if !GNULIB_defined_wctype_functions
+
+/* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.
+ Linux libc5 has <wctype.h> and the functions but they are broken.
+ mingw and MSVC have <wctype.h> and the functions but they take a wchar_t
+ as argument, not an rpl_wint_t.
+ Assume all 11 functions (all isw* except iswblank) are implemented the
+ same way, or not at all. */
+# if ! @HAVE_ISWCNTRL@ || @REPLACE_ISWCNTRL@
+
+# if @GNULIB_OVERRIDES_WINT_T@ /* implies @REPLACE_ISWCNTRL@ */
+
+_GL_WCTYPE_INLINE int
+rpl_iswalnum (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswalnum ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswalpha (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswalpha ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswblank (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswblank ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswcntrl (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswcntrl ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswdigit (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? wc >= '0' && wc <= '9' : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswgraph (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswgraph ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswlower (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswlower ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswprint (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswprint ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswpunct (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswpunct ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswspace (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswspace ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswupper (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? iswupper ((wchar_t) wc) : 0);
+}
+
+_GL_WCTYPE_INLINE int
+rpl_iswxdigit (wint_t wc)
+{
+ return ((wchar_t) wc == wc
+ ? (wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F')
+ : 0);
+}
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towlower (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? (wchar_t) towlower ((wchar_t) wc) : wc);
+}
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towupper (wint_t wc)
+{
+ return ((wchar_t) wc == wc ? (wchar_t) towupper ((wchar_t) wc) : wc);
+}
+
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+
+# else
+
+/* IRIX 5.3 has macros but no functions, its isw* macros refer to an
+ undefined variable _ctmp_ and to <ctype.h> macros like _P, and they
+ refer to system functions like _iswctype that are not in the
+ standard C library. Rather than try to get ancient buggy
+ implementations like this to work, just disable them. */
+# undef iswalnum
+# undef iswalpha
+# undef iswblank
+# undef iswcntrl
+# undef iswdigit
+# undef iswgraph
+# undef iswlower
+# undef iswprint
+# undef iswpunct
+# undef iswspace
+# undef iswupper
+# undef iswxdigit
+# undef towlower
+# undef towupper
+
+/* Linux libc5 has <wctype.h> and the functions but they are broken. */
+# if @REPLACE_ISWCNTRL@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswalnum rpl_iswalnum
+# define iswalpha rpl_iswalpha
+# define iswblank rpl_iswblank
+# define iswcntrl rpl_iswcntrl
+# define iswdigit rpl_iswdigit
+# define iswgraph rpl_iswgraph
+# define iswlower rpl_iswlower
+# define iswprint rpl_iswprint
+# define iswpunct rpl_iswpunct
+# define iswspace rpl_iswspace
+# define iswupper rpl_iswupper
+# define iswxdigit rpl_iswxdigit
+# endif
+# endif
+# if @REPLACE_TOWLOWER@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# define towupper rpl_towupper
+# endif
+# endif
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalnum
+# else
+iswalnum
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z'));
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswalpha
+# else
+iswalpha
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswblank
+# else
+iswblank
+# endif
+ (wint_t wc)
+{
+ return wc == ' ' || wc == '\t';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswcntrl
+# else
+iswcntrl
+# endif
+ (wint_t wc)
+{
+ return (wc & ~0x1f) == 0 || wc == 0x7f;
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWDIGIT@
+rpl_iswdigit
+# else
+iswdigit
+# endif
+ (wint_t wc)
+{
+ return wc >= '0' && wc <= '9';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswgraph
+# else
+iswgraph
+# endif
+ (wint_t wc)
+{
+ return wc >= '!' && wc <= '~';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswlower
+# else
+iswlower
+# endif
+ (wint_t wc)
+{
+ return wc >= 'a' && wc <= 'z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswprint
+# else
+iswprint
+# endif
+ (wint_t wc)
+{
+ return wc >= ' ' && wc <= '~';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswpunct
+# else
+iswpunct
+# endif
+ (wint_t wc)
+{
+ return (wc >= '!' && wc <= '~'
+ && !((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'Z')));
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswspace
+# else
+iswspace
+# endif
+ (wint_t wc)
+{
+ return (wc == ' ' || wc == '\t'
+ || wc == '\n' || wc == '\v' || wc == '\f' || wc == '\r');
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWCNTRL@
+rpl_iswupper
+# else
+iswupper
+# endif
+ (wint_t wc)
+{
+ return wc >= 'A' && wc <= 'Z';
+}
+
+_GL_WCTYPE_INLINE int
+# if @REPLACE_ISWXDIGIT@
+rpl_iswxdigit
+# else
+iswxdigit
+# endif
+ (wint_t wc)
+{
+ return ((wc >= '0' && wc <= '9')
+ || ((wc & ~0x20) >= 'A' && (wc & ~0x20) <= 'F'));
+}
+
+_GL_WCTYPE_INLINE wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towlower
+# else
+towlower
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'A' && wc <= 'Z' ? wc - 'A' + 'a' : wc);
+}
+
+_GL_WCTYPE_INLINE wint_t
+# if @REPLACE_TOWLOWER@
+rpl_towupper
+# else
+towupper
+# endif
+ (wint_t wc)
+{
+ return (wc >= 'a' && wc <= 'z' ? wc - 'a' + 'A' : wc);
+}
+
+# endif
+
+# else
+/* Only some of the functions are missing or broken. */
+
+# if @GNULIB_ISWBLANK@ && (! @HAVE_ISWBLANK@ || @REPLACE_ISWBLANK@)
+/* Only the iswblank function is missing. */
+# if @REPLACE_ISWBLANK@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define iswblank rpl_iswblank
+# endif
+_GL_FUNCDECL_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_FUNCDECL_SYS (iswblank, int, (wint_t wc));
+# endif
+# endif
+
+# if @GNULIB_ISWDIGIT@
+# if @REPLACE_ISWDIGIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswdigit
+# define iswdigit rpl_iswdigit
+# endif
+_GL_FUNCDECL_RPL (iswdigit, int, (wint_t wc));
+# endif
+# endif
+
+# if @GNULIB_ISWXDIGIT@
+# if @REPLACE_ISWXDIGIT@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswxdigit
+# define iswxdigit rpl_iswxdigit
+# endif
+_GL_FUNCDECL_RPL (iswxdigit, int, (wint_t wc));
+# endif
+# endif
+
+# endif
+
+# if defined __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@
+
+/* On native Windows, wchar_t is uint16_t, and wint_t is uint32_t.
+ The functions towlower and towupper are implemented in the MSVCRT library
+ to take a wchar_t argument and return a wchar_t result. mingw declares
+ these functions to take a wint_t argument and return a wint_t result.
+ This means that:
+ 1. When the user passes an argument outside the range 0x0000..0xFFFF, the
+ function will look only at the lower 16 bits. This is allowed according
+ to POSIX.
+ 2. The return value is returned in the lower 16 bits of the result register.
+ The upper 16 bits are random: whatever happened to be in that part of the
+ result register. We need to fix this by adding a zero-extend from
+ wchar_t to wint_t after the call. */
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towlower (wint_t wc)
+{
+ return (wint_t) (wchar_t) towlower (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towlower rpl_towlower
+# endif
+
+_GL_WCTYPE_INLINE wint_t
+rpl_towupper (wint_t wc)
+{
+ return (wint_t) (wchar_t) towupper (wc);
+}
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# define towupper rpl_towupper
+# endif
+
+# endif /* __MINGW32__ && !@GNULIB_OVERRIDES_WINT_T@ */
+
+# define GNULIB_defined_wctype_functions 1
+#endif
+
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalnum, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalnum, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswalpha, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswalpha, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswcntrl, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswcntrl, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWDIGIT@
+# if @REPLACE_ISWDIGIT@
+_GL_CXXALIAS_RPL (iswdigit, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswdigit, int, (wint_t wc));
+# endif
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswgraph, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswgraph, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswlower, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswlower, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswprint, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswprint, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswpunct, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswpunct, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswspace, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswspace, int, (wint_t wc));
+#endif
+#if @REPLACE_ISWCNTRL@
+_GL_CXXALIAS_RPL (iswupper, int, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (iswupper, int, (wint_t wc));
+#endif
+#if @GNULIB_ISWXDIGIT@
+# if @REPLACE_ISWXDIGIT@
+_GL_CXXALIAS_RPL (iswxdigit, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswxdigit, int, (wint_t wc));
+# endif
+#endif
+#if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswalnum);
+_GL_CXXALIASWARN (iswalpha);
+_GL_CXXALIASWARN (iswcntrl);
+_GL_CXXALIASWARN (iswdigit);
+_GL_CXXALIASWARN (iswgraph);
+_GL_CXXALIASWARN (iswlower);
+_GL_CXXALIASWARN (iswprint);
+_GL_CXXALIASWARN (iswpunct);
+_GL_CXXALIASWARN (iswspace);
+_GL_CXXALIASWARN (iswupper);
+_GL_CXXALIASWARN (iswxdigit);
+#endif
+
+#if @GNULIB_ISWBLANK@
+# if @REPLACE_ISWCNTRL@ || @REPLACE_ISWBLANK@
+_GL_CXXALIAS_RPL (iswblank, int, (wint_t wc));
+# else
+_GL_CXXALIAS_SYS (iswblank, int, (wint_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswblank);
+# endif
+#endif
+
+#if !@HAVE_WCTYPE_T@
+# if !GNULIB_defined_wctype_t
+typedef void * wctype_t;
+# define GNULIB_defined_wctype_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character property. */
+#if @GNULIB_WCTYPE@
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (wctype, wctype_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctype, wctype_t, (const char *name));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctype);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctype
+# if HAVE_RAW_DECL_WCTYPE
+_GL_WARN_ON_USE (wctype, "wctype is unportable - "
+ "use gnulib module wctype for portability");
+# endif
+#endif
+
+/* Test whether a wide character has a given property.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctype() function. */
+#if @GNULIB_ISWCTYPE@
+# if @GNULIB_OVERRIDES_WINT_T@
+# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+# undef iswctype
+# define iswctype rpl_iswctype
+# endif
+_GL_FUNCDECL_RPL (iswctype, int, (wint_t wc, wctype_t desc));
+_GL_CXXALIAS_RPL (iswctype, int, (wint_t wc, wctype_t desc));
+# else
+# if !@HAVE_WCTYPE_T@
+_GL_FUNCDECL_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+# endif
+_GL_CXXALIAS_SYS (iswctype, int, (wint_t wc, wctype_t desc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (iswctype);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef iswctype
+# if HAVE_RAW_DECL_ISWCTYPE
+_GL_WARN_ON_USE (iswctype, "iswctype is unportable - "
+ "use gnulib module iswctype for portability");
+# endif
+#endif
+
+#if @REPLACE_TOWLOWER@ || defined __MINGW32__
+_GL_CXXALIAS_RPL (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_RPL (towupper, wint_t, (wint_t wc));
+#else
+_GL_CXXALIAS_SYS (towlower, wint_t, (wint_t wc));
+_GL_CXXALIAS_SYS (towupper, wint_t, (wint_t wc));
+#endif
+#if __GLIBC__ >= 2
+_GL_CXXALIASWARN (towlower);
+_GL_CXXALIASWARN (towupper);
+#endif
+
+#if !@HAVE_WCTRANS_T@
+# if !GNULIB_defined_wctrans_t
+typedef void * wctrans_t;
+# define GNULIB_defined_wctrans_t 1
+# endif
+#endif
+
+/* Get a descriptor for a wide character case conversion. */
+#if @GNULIB_WCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (wctrans, wctrans_t, (const char *name));
+# endif
+_GL_CXXALIAS_SYS (wctrans, wctrans_t, (const char *name));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctrans);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef wctrans
+# if HAVE_RAW_DECL_WCTRANS
+_GL_WARN_ON_USE (wctrans, "wctrans is unportable - "
+ "use gnulib module wctrans for portability");
+# endif
+#endif
+
+/* Perform a given case conversion on a wide character.
+ The argument WC must be either a wchar_t value or WEOF.
+ The argument DESC must have been returned by the wctrans() function. */
+#if @GNULIB_TOWCTRANS@
+# if !@HAVE_WCTRANS_T@
+_GL_FUNCDECL_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+# endif
+_GL_CXXALIAS_SYS (towctrans, wint_t, (wint_t wc, wctrans_t desc));
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (towctrans);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef towctrans
+# if HAVE_RAW_DECL_TOWCTRANS
+_GL_WARN_ON_USE (towctrans, "towctrans is unportable - "
+ "use gnulib module towctrans for portability");
+# endif
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
+#endif /* _@GUARD_PREFIX@_WCTYPE_H */
+#endif
diff --git a/lib/wcwidth.c b/lib/wcwidth.c
new file mode 100644
index 0000000..6af212b
--- /dev/null
+++ b/lib/wcwidth.c
@@ -0,0 +1,73 @@
+/* Determine the number of screen columns needed for a character.
+ Copyright (C) 2006-2007, 2010-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+/* Get iswprint. */
+#include <wctype.h>
+
+#include "localcharset.h"
+#include "streq.h"
+#include "uniwidth.h"
+
+/* Returns 1 if the current locale is an UTF-8 locale, 0 otherwise. */
+static inline int
+is_locale_utf8 (void)
+{
+ const char *encoding = locale_charset ();
+ return STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0);
+}
+
+#if GNULIB_WCHAR_SINGLE
+/* When we know that the locale does not change, provide a speedup by
+ caching the value of is_locale_utf8. */
+static int cached_is_locale_utf8 = -1;
+static inline int
+is_locale_utf8_cached (void)
+{
+ if (cached_is_locale_utf8 < 0)
+ cached_is_locale_utf8 = is_locale_utf8 ();
+ return cached_is_locale_utf8;
+}
+#else
+/* By default, don't make assumptions, hence no caching. */
+# define is_locale_utf8_cached is_locale_utf8
+#endif
+
+int
+wcwidth (wchar_t wc)
+#undef wcwidth
+{
+ /* In UTF-8 locales, use a Unicode aware width function. */
+ if (is_locale_utf8_cached ())
+ {
+ /* We assume that in a UTF-8 locale, a wide character is the same as a
+ Unicode character. */
+ return uc_width (wc, "UTF-8");
+ }
+ else
+ {
+ /* Otherwise, fall back to the system's wcwidth function. */
+#if HAVE_WCWIDTH
+ return wcwidth (wc);
+#else
+ return wc == 0 ? 0 : iswprint (wc) ? 1 : -1;
+#endif
+ }
+}
diff --git a/lib/windows-initguard.h b/lib/windows-initguard.h
new file mode 100644
index 0000000..c4be45a
--- /dev/null
+++ b/lib/windows-initguard.h
@@ -0,0 +1,35 @@
+/* Init guards, somewhat like spinlocks (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#ifndef _WINDOWS_INITGUARD_H
+#define _WINDOWS_INITGUARD_H
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+typedef struct
+ {
+ volatile int done;
+ volatile LONG started;
+ }
+ glwthread_initguard_t;
+
+#define GLWTHREAD_INITGUARD_INIT { 0, -1 }
+
+#endif /* _WINDOWS_INITGUARD_H */
diff --git a/lib/windows-mutex.c b/lib/windows-mutex.c
new file mode 100644
index 0000000..7eb38a2
--- /dev/null
+++ b/lib/windows-mutex.c
@@ -0,0 +1,95 @@
+/* Plain mutexes (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "windows-mutex.h"
+
+#include <errno.h>
+
+void
+glwthread_mutex_init (glwthread_mutex_t *mutex)
+{
+ InitializeCriticalSection (&mutex->lock);
+ mutex->guard.done = 1;
+}
+
+int
+glwthread_mutex_lock (glwthread_mutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ {
+ if (InterlockedIncrement (&mutex->guard.started) == 0)
+ /* This thread is the first one to need this mutex. Initialize it. */
+ glwthread_mutex_init (mutex);
+ else
+ {
+ /* Don't let mutex->guard.started grow and wrap around. */
+ InterlockedDecrement (&mutex->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this mutex. */
+ while (!mutex->guard.done)
+ Sleep (0);
+ }
+ }
+ EnterCriticalSection (&mutex->lock);
+ return 0;
+}
+
+int
+glwthread_mutex_trylock (glwthread_mutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ {
+ if (InterlockedIncrement (&mutex->guard.started) == 0)
+ /* This thread is the first one to need this mutex. Initialize it. */
+ glwthread_mutex_init (mutex);
+ else
+ {
+ /* Don't let mutex->guard.started grow and wrap around. */
+ InterlockedDecrement (&mutex->guard.started);
+ /* Let another thread finish initializing this mutex, and let it also
+ lock this mutex. */
+ return EBUSY;
+ }
+ }
+ if (!TryEnterCriticalSection (&mutex->lock))
+ return EBUSY;
+ return 0;
+}
+
+int
+glwthread_mutex_unlock (glwthread_mutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ return EINVAL;
+ LeaveCriticalSection (&mutex->lock);
+ return 0;
+}
+
+int
+glwthread_mutex_destroy (glwthread_mutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ return EINVAL;
+ DeleteCriticalSection (&mutex->lock);
+ mutex->guard.done = 0;
+ return 0;
+}
diff --git a/lib/windows-mutex.h b/lib/windows-mutex.h
new file mode 100644
index 0000000..748b988
--- /dev/null
+++ b/lib/windows-mutex.h
@@ -0,0 +1,51 @@
+/* Plain mutexes (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#ifndef _WINDOWS_MUTEX_H
+#define _WINDOWS_MUTEX_H
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+#include "windows-initguard.h"
+
+typedef struct
+ {
+ glwthread_initguard_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock;
+ }
+ glwthread_mutex_t;
+
+#define GLWTHREAD_MUTEX_INIT { GLWTHREAD_INITGUARD_INIT }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void glwthread_mutex_init (glwthread_mutex_t *mutex);
+extern int glwthread_mutex_lock (glwthread_mutex_t *mutex);
+extern int glwthread_mutex_trylock (glwthread_mutex_t *mutex);
+extern int glwthread_mutex_unlock (glwthread_mutex_t *mutex);
+extern int glwthread_mutex_destroy (glwthread_mutex_t *mutex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINDOWS_MUTEX_H */
diff --git a/lib/windows-once.c b/lib/windows-once.c
new file mode 100644
index 0000000..c431bd6
--- /dev/null
+++ b/lib/windows-once.c
@@ -0,0 +1,62 @@
+/* Once-only control (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "windows-once.h"
+
+#include <stdlib.h>
+
+void
+glwthread_once (glwthread_once_t *once_control, void (*initfunction) (void))
+{
+ if (once_control->inited <= 0)
+ {
+ if (InterlockedIncrement (&once_control->started) == 0)
+ {
+ /* This thread is the first one to come to this once_control. */
+ InitializeCriticalSection (&once_control->lock);
+ EnterCriticalSection (&once_control->lock);
+ once_control->inited = 0;
+ initfunction ();
+ once_control->inited = 1;
+ LeaveCriticalSection (&once_control->lock);
+ }
+ else
+ {
+ /* Don't let once_control->started grow and wrap around. */
+ InterlockedDecrement (&once_control->started);
+ /* Some other thread has already started the initialization.
+ Yield the CPU while waiting for the other thread to finish
+ initializing and taking the lock. */
+ while (once_control->inited < 0)
+ Sleep (0);
+ if (once_control->inited <= 0)
+ {
+ /* Take the lock. This blocks until the other thread has
+ finished calling the initfunction. */
+ EnterCriticalSection (&once_control->lock);
+ LeaveCriticalSection (&once_control->lock);
+ if (!(once_control->inited > 0))
+ abort ();
+ }
+ }
+ }
+}
diff --git a/lib/windows-once.h b/lib/windows-once.h
new file mode 100644
index 0000000..d31717e
--- /dev/null
+++ b/lib/windows-once.h
@@ -0,0 +1,47 @@
+/* Once-only control (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#ifndef _WINDOWS_ONCE_H
+#define _WINDOWS_ONCE_H
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+typedef struct
+ {
+ volatile int inited;
+ volatile LONG started;
+ CRITICAL_SECTION lock;
+ }
+ glwthread_once_t;
+
+#define GLWTHREAD_ONCE_INIT { -1, -1 }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void glwthread_once (glwthread_once_t *once_control,
+ void (*initfunction) (void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINDOWS_ONCE_H */
diff --git a/lib/windows-recmutex.c b/lib/windows-recmutex.c
new file mode 100644
index 0000000..db3c40c
--- /dev/null
+++ b/lib/windows-recmutex.c
@@ -0,0 +1,127 @@
+/* Plain recursive mutexes (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "windows-recmutex.h"
+
+#include <errno.h>
+
+void
+glwthread_recmutex_init (glwthread_recmutex_t *mutex)
+{
+ mutex->owner = 0;
+ mutex->depth = 0;
+ InitializeCriticalSection (&mutex->lock);
+ mutex->guard.done = 1;
+}
+
+int
+glwthread_recmutex_lock (glwthread_recmutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ {
+ if (InterlockedIncrement (&mutex->guard.started) == 0)
+ /* This thread is the first one to need this mutex. Initialize it. */
+ glwthread_recmutex_init (mutex);
+ else
+ {
+ /* Don't let mutex->guard.started grow and wrap around. */
+ InterlockedDecrement (&mutex->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this mutex. */
+ while (!mutex->guard.done)
+ Sleep (0);
+ }
+ }
+ {
+ DWORD self = GetCurrentThreadId ();
+ if (mutex->owner != self)
+ {
+ EnterCriticalSection (&mutex->lock);
+ mutex->owner = self;
+ }
+ if (++(mutex->depth) == 0) /* wraparound? */
+ {
+ mutex->depth--;
+ return EAGAIN;
+ }
+ }
+ return 0;
+}
+
+int
+glwthread_recmutex_trylock (glwthread_recmutex_t *mutex)
+{
+ if (!mutex->guard.done)
+ {
+ if (InterlockedIncrement (&mutex->guard.started) == 0)
+ /* This thread is the first one to need this mutex. Initialize it. */
+ glwthread_recmutex_init (mutex);
+ else
+ {
+ /* Don't let mutex->guard.started grow and wrap around. */
+ InterlockedDecrement (&mutex->guard.started);
+ /* Let another thread finish initializing this mutex, and let it also
+ lock this mutex. */
+ return EBUSY;
+ }
+ }
+ {
+ DWORD self = GetCurrentThreadId ();
+ if (mutex->owner != self)
+ {
+ if (!TryEnterCriticalSection (&mutex->lock))
+ return EBUSY;
+ mutex->owner = self;
+ }
+ if (++(mutex->depth) == 0) /* wraparound? */
+ {
+ mutex->depth--;
+ return EAGAIN;
+ }
+ }
+ return 0;
+}
+
+int
+glwthread_recmutex_unlock (glwthread_recmutex_t *mutex)
+{
+ if (mutex->owner != GetCurrentThreadId ())
+ return EPERM;
+ if (mutex->depth == 0)
+ return EINVAL;
+ if (--(mutex->depth) == 0)
+ {
+ mutex->owner = 0;
+ LeaveCriticalSection (&mutex->lock);
+ }
+ return 0;
+}
+
+int
+glwthread_recmutex_destroy (glwthread_recmutex_t *mutex)
+{
+ if (mutex->owner != 0)
+ return EBUSY;
+ DeleteCriticalSection (&mutex->lock);
+ mutex->guard.done = 0;
+ return 0;
+}
diff --git a/lib/windows-recmutex.h b/lib/windows-recmutex.h
new file mode 100644
index 0000000..3b315e5
--- /dev/null
+++ b/lib/windows-recmutex.h
@@ -0,0 +1,57 @@
+/* Plain recursive mutexes (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#ifndef _WINDOWS_RECMUTEX_H
+#define _WINDOWS_RECMUTEX_H
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+#include "windows-initguard.h"
+
+/* The native Windows documentation says that CRITICAL_SECTION already
+ implements a recursive lock. But we need not rely on it: It's easy to
+ implement a recursive lock without this assumption. */
+
+typedef struct
+ {
+ glwthread_initguard_t guard; /* protects the initialization */
+ DWORD owner;
+ unsigned long depth;
+ CRITICAL_SECTION lock;
+ }
+ glwthread_recmutex_t;
+
+#define GLWTHREAD_RECMUTEX_INIT { GLWTHREAD_INITGUARD_INIT, 0, 0 }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void glwthread_recmutex_init (glwthread_recmutex_t *mutex);
+extern int glwthread_recmutex_lock (glwthread_recmutex_t *mutex);
+extern int glwthread_recmutex_trylock (glwthread_recmutex_t *mutex);
+extern int glwthread_recmutex_unlock (glwthread_recmutex_t *mutex);
+extern int glwthread_recmutex_destroy (glwthread_recmutex_t *mutex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINDOWS_RECMUTEX_H */
diff --git a/lib/windows-rwlock.c b/lib/windows-rwlock.c
new file mode 100644
index 0000000..64e761c
--- /dev/null
+++ b/lib/windows-rwlock.c
@@ -0,0 +1,377 @@
+/* Read-write locks (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#include <config.h>
+
+/* Specification. */
+#include "windows-rwlock.h"
+
+#include <errno.h>
+#include <stdlib.h>
+
+/* Don't assume that UNICODE is not defined. */
+#undef CreateEvent
+#define CreateEvent CreateEventA
+
+/* In this file, the waitqueues are implemented as circular arrays. */
+#define glwthread_waitqueue_t glwthread_carray_waitqueue_t
+
+static void
+glwthread_waitqueue_init (glwthread_waitqueue_t *wq)
+{
+ wq->array = NULL;
+ wq->count = 0;
+ wq->alloc = 0;
+ wq->offset = 0;
+}
+
+/* Enqueues the current thread, represented by an event, in a wait queue.
+ Returns INVALID_HANDLE_VALUE if an allocation failure occurs. */
+static HANDLE
+glwthread_waitqueue_add (glwthread_waitqueue_t *wq)
+{
+ HANDLE event;
+ unsigned int index;
+
+ if (wq->count == wq->alloc)
+ {
+ unsigned int new_alloc = 2 * wq->alloc + 1;
+ HANDLE *new_array =
+ (HANDLE *) realloc (wq->array, new_alloc * sizeof (HANDLE));
+ if (new_array == NULL)
+ /* No more memory. */
+ return INVALID_HANDLE_VALUE;
+ /* Now is a good opportunity to rotate the array so that its contents
+ starts at offset 0. */
+ if (wq->offset > 0)
+ {
+ unsigned int old_count = wq->count;
+ unsigned int old_alloc = wq->alloc;
+ unsigned int old_offset = wq->offset;
+ unsigned int i;
+ if (old_offset + old_count > old_alloc)
+ {
+ unsigned int limit = old_offset + old_count - old_alloc;
+ for (i = 0; i < limit; i++)
+ new_array[old_alloc + i] = new_array[i];
+ }
+ for (i = 0; i < old_count; i++)
+ new_array[i] = new_array[old_offset + i];
+ wq->offset = 0;
+ }
+ wq->array = new_array;
+ wq->alloc = new_alloc;
+ }
+ /* Whether the created event is a manual-reset one or an auto-reset one,
+ does not matter, since we will wait on it only once. */
+ event = CreateEvent (NULL, TRUE, FALSE, NULL);
+ if (event == INVALID_HANDLE_VALUE)
+ /* No way to allocate an event. */
+ return INVALID_HANDLE_VALUE;
+ index = wq->offset + wq->count;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ wq->array[index] = event;
+ wq->count++;
+ return event;
+}
+
+/* Notifies the first thread from a wait queue and dequeues it. */
+static void
+glwthread_waitqueue_notify_first (glwthread_waitqueue_t *wq)
+{
+ SetEvent (wq->array[wq->offset + 0]);
+ wq->offset++;
+ wq->count--;
+ if (wq->count == 0 || wq->offset == wq->alloc)
+ wq->offset = 0;
+}
+
+/* Notifies all threads from a wait queue and dequeues them all. */
+static void
+glwthread_waitqueue_notify_all (glwthread_waitqueue_t *wq)
+{
+ unsigned int i;
+
+ for (i = 0; i < wq->count; i++)
+ {
+ unsigned int index = wq->offset + i;
+ if (index >= wq->alloc)
+ index -= wq->alloc;
+ SetEvent (wq->array[index]);
+ }
+ wq->count = 0;
+ wq->offset = 0;
+}
+
+void
+glwthread_rwlock_init (glwthread_rwlock_t *lock)
+{
+ InitializeCriticalSection (&lock->lock);
+ glwthread_waitqueue_init (&lock->waiting_readers);
+ glwthread_waitqueue_init (&lock->waiting_writers);
+ lock->runcount = 0;
+ lock->guard.done = 1;
+}
+
+int
+glwthread_rwlock_rdlock (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glwthread_rwlock_init (lock);
+ else
+ {
+ /* Don't let lock->guard.started grow and wrap around. */
+ InterlockedDecrement (&lock->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow, and whether no writer is waiting. The latter
+ condition is because POSIX recommends that "write locks shall take
+ precedence over read locks", to avoid "writer starvation". */
+ if (!(lock->runcount + 1 > 0 && lock->waiting_writers.count == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_readers. */
+ HANDLE event = glwthread_waitqueue_add (&lock->waiting_readers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_readers, incremented lock->runcount. */
+ if (!(lock->runcount > 0))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount + 1 > 0));
+ }
+ }
+ lock->runcount++;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glwthread_rwlock_wrlock (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glwthread_rwlock_init (lock);
+ else
+ {
+ /* Don't let lock->guard.started grow and wrap around. */
+ InterlockedDecrement (&lock->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ }
+ EnterCriticalSection (&lock->lock);
+ /* Test whether no readers or writers are currently running. */
+ if (!(lock->runcount == 0))
+ {
+ /* This thread has to wait for a while. Enqueue it among the
+ waiting_writers. */
+ HANDLE event = glwthread_waitqueue_add (&lock->waiting_writers);
+ if (event != INVALID_HANDLE_VALUE)
+ {
+ DWORD result;
+ LeaveCriticalSection (&lock->lock);
+ /* Wait until another thread signals this event. */
+ result = WaitForSingleObject (event, INFINITE);
+ if (result == WAIT_FAILED || result == WAIT_TIMEOUT)
+ abort ();
+ CloseHandle (event);
+ /* The thread which signalled the event already did the bookkeeping:
+ removed us from the waiting_writers, set lock->runcount = -1. */
+ if (!(lock->runcount == -1))
+ abort ();
+ return 0;
+ }
+ else
+ {
+ /* Allocation failure. Weird. */
+ do
+ {
+ LeaveCriticalSection (&lock->lock);
+ Sleep (1);
+ EnterCriticalSection (&lock->lock);
+ }
+ while (!(lock->runcount == 0));
+ }
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glwthread_rwlock_init (lock);
+ else
+ {
+ /* Don't let lock->guard.started grow and wrap around. */
+ InterlockedDecrement (&lock->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ }
+ /* It's OK to wait for this critical section, because it is never taken for a
+ long time. */
+ EnterCriticalSection (&lock->lock);
+ /* Test whether only readers are currently running, and whether the runcount
+ field will not overflow, and whether no writer is waiting. The latter
+ condition is because POSIX recommends that "write locks shall take
+ precedence over read locks", to avoid "writer starvation". */
+ if (!(lock->runcount + 1 > 0 && lock->waiting_writers.count == 0))
+ {
+ /* This thread would have to wait for a while. Return instead. */
+ LeaveCriticalSection (&lock->lock);
+ return EBUSY;
+ }
+ lock->runcount++;
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ {
+ if (InterlockedIncrement (&lock->guard.started) == 0)
+ /* This thread is the first one to need this lock. Initialize it. */
+ glwthread_rwlock_init (lock);
+ else
+ {
+ /* Don't let lock->guard.started grow and wrap around. */
+ InterlockedDecrement (&lock->guard.started);
+ /* Yield the CPU while waiting for another thread to finish
+ initializing this lock. */
+ while (!lock->guard.done)
+ Sleep (0);
+ }
+ }
+ /* It's OK to wait for this critical section, because it is never taken for a
+ long time. */
+ EnterCriticalSection (&lock->lock);
+ /* Test whether no readers or writers are currently running. */
+ if (!(lock->runcount == 0))
+ {
+ /* This thread would have to wait for a while. Return instead. */
+ LeaveCriticalSection (&lock->lock);
+ return EBUSY;
+ }
+ lock->runcount--; /* runcount becomes -1 */
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glwthread_rwlock_unlock (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ EnterCriticalSection (&lock->lock);
+ if (lock->runcount < 0)
+ {
+ /* Drop a writer lock. */
+ if (!(lock->runcount == -1))
+ abort ();
+ lock->runcount = 0;
+ }
+ else
+ {
+ /* Drop a reader lock. */
+ if (!(lock->runcount > 0))
+ {
+ LeaveCriticalSection (&lock->lock);
+ return EPERM;
+ }
+ lock->runcount--;
+ }
+ if (lock->runcount == 0)
+ {
+ /* POSIX recommends that "write locks shall take precedence over read
+ locks", to avoid "writer starvation". */
+ if (lock->waiting_writers.count > 0)
+ {
+ /* Wake up one of the waiting writers. */
+ lock->runcount--;
+ glwthread_waitqueue_notify_first (&lock->waiting_writers);
+ }
+ else
+ {
+ /* Wake up all waiting readers. */
+ lock->runcount += lock->waiting_readers.count;
+ glwthread_waitqueue_notify_all (&lock->waiting_readers);
+ }
+ }
+ LeaveCriticalSection (&lock->lock);
+ return 0;
+}
+
+int
+glwthread_rwlock_destroy (glwthread_rwlock_t *lock)
+{
+ if (!lock->guard.done)
+ return EINVAL;
+ if (lock->runcount != 0)
+ return EBUSY;
+ DeleteCriticalSection (&lock->lock);
+ if (lock->waiting_readers.array != NULL)
+ free (lock->waiting_readers.array);
+ if (lock->waiting_writers.array != NULL)
+ free (lock->waiting_writers.array);
+ lock->guard.done = 0;
+ return 0;
+}
diff --git a/lib/windows-rwlock.h b/lib/windows-rwlock.h
new file mode 100644
index 0000000..ae5b82f
--- /dev/null
+++ b/lib/windows-rwlock.h
@@ -0,0 +1,68 @@
+/* Read-write locks (native Windows implementation).
+ Copyright (C) 2005-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2005.
+ Based on GCC's gthr-win32.h. */
+
+#ifndef _WINDOWS_RWLOCK_H
+#define _WINDOWS_RWLOCK_H
+
+#define WIN32_LEAN_AND_MEAN /* avoid including junk */
+#include <windows.h>
+
+#include "windows-initguard.h"
+
+/* It is impossible to implement read-write locks using plain locks, without
+ introducing an extra thread dedicated to managing read-write locks.
+ Therefore here we need to use the low-level Event type. */
+
+typedef struct
+ {
+ HANDLE *array; /* array of waiting threads, each represented by an event */
+ unsigned int count; /* number of waiting threads */
+ unsigned int alloc; /* length of allocated array */
+ unsigned int offset; /* index of first waiting thread in array */
+ }
+ glwthread_carray_waitqueue_t;
+typedef struct
+ {
+ glwthread_initguard_t guard; /* protects the initialization */
+ CRITICAL_SECTION lock; /* protects the remaining fields */
+ glwthread_carray_waitqueue_t waiting_readers; /* waiting readers */
+ glwthread_carray_waitqueue_t waiting_writers; /* waiting writers */
+ int runcount; /* number of readers running, or -1 when a writer runs */
+ }
+ glwthread_rwlock_t;
+
+#define GLWTHREAD_RWLOCK_INIT { GLWTHREAD_INITGUARD_INIT }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void glwthread_rwlock_init (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_rdlock (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_wrlock (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_tryrdlock (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_trywrlock (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_unlock (glwthread_rwlock_t *lock);
+extern int glwthread_rwlock_destroy (glwthread_rwlock_t *lock);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINDOWS_RWLOCK_H */
diff --git a/lib/windows-spawn.c b/lib/windows-spawn.c
new file mode 100644
index 0000000..a781090
--- /dev/null
+++ b/lib/windows-spawn.c
@@ -0,0 +1,727 @@
+/* Auxiliary functions for the creation of subprocesses. Native Windows API.
+ Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "windows-spawn.h"
+
+/* Get declarations of the native Windows API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+/* Get _get_osfhandle(). */
+#if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+#else
+# include <io.h>
+#endif
+#include <process.h>
+
+#include "findprog.h"
+
+/* Don't assume that UNICODE is not defined. */
+#undef STARTUPINFO
+#define STARTUPINFO STARTUPINFOA
+#undef CreateProcess
+#define CreateProcess CreateProcessA
+
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037*?"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+
+/* Returns the length of a quoted argument string. */
+static size_t
+quoted_arg_length (const char *string)
+{
+ bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ size_t length;
+ unsigned int backslashes;
+ const char *s;
+
+ length = 0;
+ backslashes = 0;
+ if (quote_around)
+ length++;
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ length += backslashes + 1;
+ length++;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ length += backslashes + 1;
+
+ return length;
+}
+
+/* Produces a quoted argument string.
+ Stores exactly quoted_arg_length (STRING) + 1 bytes, including the final
+ NUL byte, at MEM.
+ Returns a pointer past the stored quoted argument string. */
+static char *
+quoted_arg_string (const char *string, char *mem)
+{
+ bool quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+ char *p;
+ unsigned int backslashes;
+ const char *s;
+
+ p = mem;
+ backslashes = 0;
+ if (quote_around)
+ *p++ = '"';
+ for (s = string; *s != '\0'; s++)
+ {
+ char c = *s;
+ if (c == '"')
+ {
+ unsigned int j;
+ for (j = backslashes + 1; j > 0; j--)
+ *p++ = '\\';
+ }
+ *p++ = c;
+ if (c == '\\')
+ backslashes++;
+ else
+ backslashes = 0;
+ }
+ if (quote_around)
+ {
+ unsigned int j;
+ for (j = backslashes; j > 0; j--)
+ *p++ = '\\';
+ *p++ = '"';
+ }
+ *p++ = '\0';
+
+ return p;
+}
+
+const char **
+prepare_spawn (const char * const *argv, char **mem_to_free)
+{
+ size_t argc;
+ const char **new_argv;
+ size_t i;
+
+ /* Count number of arguments. */
+ for (argc = 0; argv[argc] != NULL; argc++)
+ ;
+
+ /* Allocate new argument vector. */
+ new_argv = (const char **) malloc ((1 + argc + 1) * sizeof (const char *));
+
+ /* Add an element upfront that can be used when argv[0] turns out to be a
+ script, not a program.
+ On Unix, this would be "/bin/sh". On native Windows, "sh" is actually
+ "sh.exe". We have to omit the directory part and rely on the search in
+ PATH, because the mingw "mount points" are not visible inside Windows
+ CreateProcess(). */
+ new_argv[0] = "sh.exe";
+
+ /* Put quoted arguments into the new argument vector. */
+ size_t needed_size = 0;
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+ size_t length;
+
+ if (string[0] == '\0')
+ length = strlen ("\"\"");
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ length = quoted_arg_length (string);
+ else
+ length = strlen (string);
+ needed_size += length + 1;
+ }
+
+ char *mem;
+ if (needed_size == 0)
+ mem = NULL;
+ else
+ {
+ mem = (char *) malloc (needed_size);
+ if (mem == NULL)
+ {
+ /* Memory allocation failure. */
+ free (new_argv);
+ errno = ENOMEM;
+ return NULL;
+ }
+ }
+ *mem_to_free = mem;
+
+ for (i = 0; i < argc; i++)
+ {
+ const char *string = argv[i];
+
+ new_argv[1 + i] = mem;
+ if (string[0] == '\0')
+ {
+ size_t length = strlen ("\"\"");
+ memcpy (mem, "\"\"", length + 1);
+ mem += length + 1;
+ }
+ else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+ {
+ mem = quoted_arg_string (string, mem);
+ }
+ else
+ {
+ size_t length = strlen (string);
+ memcpy (mem, string, length + 1);
+ mem += length + 1;
+ }
+ }
+ new_argv[1 + argc] = NULL;
+
+ return new_argv;
+}
+
+char *
+compose_command (const char * const *argv)
+{
+ /* Just concatenate the argv[] strings, separated by spaces. */
+ char *command;
+
+ /* Determine the size of the needed block of memory. */
+ size_t total_size = 0;
+ const char * const *ap;
+ const char *p;
+ for (ap = argv; (p = *ap) != NULL; ap++)
+ total_size += strlen (p) + 1;
+ size_t command_size = (total_size > 0 ? total_size : 1);
+
+ /* Allocate the block of memory. */
+ command = (char *) malloc (command_size);
+ if (command == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ /* Fill it. */
+ if (total_size > 0)
+ {
+ char *cp = command;
+ for (ap = argv; (p = *ap) != NULL; ap++)
+ {
+ size_t size = strlen (p) + 1;
+ memcpy (cp, p, size - 1);
+ cp += size;
+ cp[-1] = ' ';
+ }
+ cp[-1] = '\0';
+ }
+ else
+ *command = '\0';
+
+ return command;
+}
+
+char *
+compose_envblock (const char * const *envp)
+{
+ /* This is a bit hairy, because we don't have a lock that would prevent other
+ threads from making modifications in ENVP. So, just make sure we don't
+ crash; but if other threads are making modifications, part of the result
+ may be wrong. */
+ retry:
+ {
+ /* Guess the size of the needed block of memory.
+ The guess will be exact if other threads don't make modifications. */
+ size_t total_size = 0;
+ const char * const *ep;
+ const char *p;
+ for (ep = envp; (p = *ep) != NULL; ep++)
+ total_size += strlen (p) + 1;
+ size_t envblock_size = total_size;
+
+ /* Allocate the block of memory. */
+ char *envblock = (char *) malloc (envblock_size + 1);
+ if (envblock == NULL)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ size_t envblock_used = 0;
+ for (ep = envp; (p = *ep) != NULL; ep++)
+ {
+ size_t size = strlen (p) + 1;
+ if (envblock_used + size > envblock_size)
+ {
+ /* Other threads did modifications. Need more memory. */
+ envblock_size += envblock_size / 2;
+ if (envblock_used + size > envblock_size)
+ envblock_size = envblock_used + size;
+
+ char *new_envblock = (char *) realloc (envblock, envblock_size + 1);
+ if (new_envblock == NULL)
+ {
+ free (envblock);
+ errno = ENOMEM;
+ return NULL;
+ }
+ envblock = new_envblock;
+ }
+ memcpy (envblock + envblock_used, p, size);
+ envblock_used += size;
+ if (envblock[envblock_used - 1] != '\0')
+ {
+ /* Other threads did modifications. Restart. */
+ free (envblock);
+ goto retry;
+ }
+ }
+ envblock[envblock_used] = '\0';
+ return envblock;
+ }
+}
+
+int
+init_inheritable_handles (struct inheritable_handles *inh_handles,
+ bool duplicate)
+{
+ /* Determine the minimal count of handles we need to care about. */
+ size_t handles_count;
+ {
+ /* _getmaxstdio
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/getmaxstdio>
+ Default value is 512. */
+ unsigned int fdmax = _getmaxstdio ();
+ if (fdmax < 3)
+ fdmax = 3;
+ for (; fdmax > 3; fdmax--)
+ {
+ unsigned int fd = fdmax - 1;
+ /* _get_osfhandle
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle> */
+ HANDLE handle = (HANDLE) _get_osfhandle (fd);
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ DWORD hflags;
+ /* GetHandleInformation
+ <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
+ if (GetHandleInformation (handle, &hflags))
+ {
+ if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+ /* fd denotes an inheritable descriptor. */
+ break;
+ }
+ }
+ }
+ handles_count = fdmax;
+ }
+ /* Note: handles_count >= 3. */
+
+ /* Allocate the arrays. */
+ size_t handles_allocated = handles_count;
+ HANDLE *handles_array =
+ (HANDLE *) malloc (handles_allocated * sizeof (HANDLE));
+ if (handles_array == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ unsigned char *flags_array =
+ (unsigned char *) malloc (handles_allocated * sizeof (unsigned char));
+ if (flags_array == NULL)
+ {
+ free (handles_array);
+ errno = ENOMEM;
+ return -1;
+ }
+
+ /* Fill in the two arrays. */
+ {
+ HANDLE curr_process = (duplicate ? GetCurrentProcess () : INVALID_HANDLE_VALUE);
+ unsigned int fd;
+ for (fd = 0; fd < handles_count; fd++)
+ {
+ handles_array[fd] = INVALID_HANDLE_VALUE;
+ /* _get_osfhandle
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle> */
+ HANDLE handle = (HANDLE) _get_osfhandle (fd);
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ DWORD hflags;
+ /* GetHandleInformation
+ <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
+ if (GetHandleInformation (handle, &hflags))
+ {
+ if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+ {
+ /* fd denotes an inheritable descriptor. */
+ if (duplicate)
+ {
+ if (!DuplicateHandle (curr_process, handle,
+ curr_process, &handles_array[fd],
+ 0, TRUE, DUPLICATE_SAME_ACCESS))
+ {
+ unsigned int i;
+ for (i = 0; i < fd; i++)
+ if (handles_array[i] != INVALID_HANDLE_VALUE)
+ CloseHandle (handles_array[i]);
+ free (flags_array);
+ free (handles_array);
+ errno = EBADF; /* arbitrary */
+ return -1;
+ }
+ }
+ else
+ handles_array[fd] = handle;
+
+ flags_array[fd] = 0;
+ }
+ }
+ }
+ }
+ }
+
+ /* Return the result. */
+ inh_handles->count = handles_count;
+ inh_handles->allocated = handles_allocated;
+ inh_handles->handles = handles_array;
+ inh_handles->flags = flags_array;
+ return 0;
+}
+
+int
+compose_handles_block (const struct inheritable_handles *inh_handles,
+ STARTUPINFO *sinfo)
+{
+ /* STARTUPINFO
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa> */
+ sinfo->dwFlags = STARTF_USESTDHANDLES;
+ sinfo->hStdInput = inh_handles->handles[0];
+ sinfo->hStdOutput = inh_handles->handles[1];
+ sinfo->hStdError = inh_handles->handles[2];
+
+ /* On newer versions of Windows, more file descriptors / handles than the
+ first three can be passed.
+ The format is as follows: Let N be an exclusive upper bound for the file
+ descriptors to be passed. Two arrays are constructed in memory:
+ - flags[0..N-1], of element type 'unsigned char',
+ - handles[0..N-1], of element type 'HANDLE' or 'intptr_t'.
+ For used entries, handles[i] is the handle, and flags[i] is a set of flags,
+ a combination of:
+ 1 for open file descriptors,
+ 64 for handles of type FILE_TYPE_CHAR,
+ 8 for handles of type FILE_TYPE_PIPE,
+ 32 for O_APPEND.
+ For unused entries - this may include any of the first three, since they
+ are already passed above -, handles[i] is INVALID_HANDLE_VALUE and flags[i]
+ is zero.
+ lpReserved2 now is a pointer to the concatenation (without padding) of:
+ - an 'unsigned int' whose value is N,
+ - the contents of the flags[0..N-1] array,
+ - the contents of the handles[0..N-1] array.
+ cbReserved2 is the size (in bytes) of the object at lpReserved2. */
+
+ size_t handles_count = inh_handles->count;
+
+ sinfo->cbReserved2 =
+ sizeof (unsigned int)
+ + handles_count * sizeof (unsigned char)
+ + handles_count * sizeof (HANDLE);
+ /* Add some padding, so that we can work with a properly aligned HANDLE
+ array. */
+ char *hblock = (char *) malloc (sinfo->cbReserved2 + (sizeof (HANDLE) - 1));
+ if (hblock == NULL)
+ {
+ errno = ENOMEM;
+ return -1;
+ }
+ unsigned char *flags = (unsigned char *) (hblock + sizeof (unsigned int));
+ char *handles = (char *) (flags + handles_count);
+ HANDLE *handles_aligned =
+ (HANDLE *) (((uintptr_t) handles + (sizeof (HANDLE) - 1))
+ & - (uintptr_t) sizeof (HANDLE));
+
+ * (unsigned int *) hblock = handles_count;
+ {
+ unsigned int fd;
+ for (fd = 0; fd < handles_count; fd++)
+ {
+ handles_aligned[fd] = INVALID_HANDLE_VALUE;
+ flags[fd] = 0;
+
+ HANDLE handle = inh_handles->handles[fd];
+ if (handle != INVALID_HANDLE_VALUE
+ /* The first three are possibly already passed above.
+ But they need to passed here as well, if they have some flags. */
+ && (fd >= 3 || inh_handles->flags[fd] != 0))
+ {
+ DWORD hflags;
+ /* GetHandleInformation
+ <https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation> */
+ if (GetHandleInformation (handle, &hflags))
+ {
+ if ((hflags & HANDLE_FLAG_INHERIT) != 0)
+ {
+ /* fd denotes an inheritable descriptor. */
+ handles_aligned[fd] = handle;
+ /* On Microsoft Windows, it would be sufficient to set
+ flags[fd] = 1. But on ReactOS or Wine, adding the bit
+ that indicates the handle type may be necessary. So,
+ just do it everywhere. */
+ flags[fd] = 1 | inh_handles->flags[fd];
+ switch (GetFileType (handle))
+ {
+ case FILE_TYPE_CHAR:
+ flags[fd] |= 64;
+ break;
+ case FILE_TYPE_PIPE:
+ flags[fd] |= 8;
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ /* We shouldn't have any non-inheritable handles in
+ inh_handles->handles. */
+ abort ();
+ }
+ }
+ }
+ }
+ if (handles != (char *) handles_aligned)
+ memmove (handles, (char *) handles_aligned, handles_count * sizeof (HANDLE));
+
+ sinfo->lpReserved2 = (BYTE *) hblock;
+
+ return 0;
+}
+
+void
+free_inheritable_handles (struct inheritable_handles *inh_handles)
+{
+ free (inh_handles->flags);
+ free (inh_handles->handles);
+}
+
+int
+convert_CreateProcess_error (DWORD error)
+{
+ /* Some of these errors probably cannot happen. But who knows... */
+ switch (error)
+ {
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
+ case ERROR_BAD_PATHNAME:
+ case ERROR_BAD_NET_NAME:
+ case ERROR_INVALID_NAME:
+ case ERROR_DIRECTORY:
+ return ENOENT;
+ break;
+
+ case ERROR_ACCESS_DENIED:
+ case ERROR_SHARING_VIOLATION:
+ return EACCES;
+ break;
+
+ case ERROR_OUTOFMEMORY:
+ return ENOMEM;
+ break;
+
+ case ERROR_BUFFER_OVERFLOW:
+ case ERROR_FILENAME_EXCED_RANGE:
+ return ENAMETOOLONG;
+ break;
+
+ case ERROR_BAD_FORMAT:
+ case ERROR_BAD_EXE_FORMAT:
+ return ENOEXEC;
+ break;
+
+ default:
+ return EINVAL;
+ break;
+ }
+}
+
+intptr_t
+spawnpvech (int mode,
+ const char *progname, const char * const *argv,
+ const char * const *envp,
+ const char *currdir,
+ HANDLE stdin_handle, HANDLE stdout_handle, HANDLE stderr_handle)
+{
+ /* Validate the arguments. */
+ if (!(mode == P_WAIT
+ || mode == P_NOWAIT
+ || mode == P_DETACH
+ || mode == P_OVERLAY)
+ || progname == NULL || argv == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Implement the 'p' letter: search for PROGNAME in getenv ("PATH"). */
+ const char *resolved_progname =
+ find_in_given_path (progname, getenv ("PATH"), NULL, false);
+ if (resolved_progname == NULL)
+ return -1;
+
+ /* Compose the command. */
+ char *command = compose_command (argv);
+ if (command == NULL)
+ goto out_of_memory_1;
+
+ /* Copy *ENVP into a contiguous block of memory. */
+ char *envblock;
+ if (envp == NULL)
+ envblock = NULL;
+ else
+ {
+ envblock = compose_envblock (envp);
+ if (envblock == NULL)
+ goto out_of_memory_2;
+ }
+
+ /* Collect the inheritable handles. */
+ struct inheritable_handles inh_handles;
+ if (init_inheritable_handles (&inh_handles, false) < 0)
+ {
+ int saved_errno = errno;
+ if (envblock != NULL)
+ free (envblock);
+ free (command);
+ if (resolved_progname != progname)
+ free ((char *) resolved_progname);
+ errno = saved_errno;
+ return -1;
+ }
+ inh_handles.handles[0] = stdin_handle; inh_handles.flags[0] = 0;
+ inh_handles.handles[1] = stdout_handle; inh_handles.flags[1] = 0;
+ inh_handles.handles[2] = stderr_handle; inh_handles.flags[2] = 0;
+
+ /* CreateProcess
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa> */
+ /* <https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags> */
+ DWORD process_creation_flags = (mode == P_DETACH ? DETACHED_PROCESS : 0);
+ /* STARTUPINFO
+ <https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa> */
+ STARTUPINFO sinfo;
+ sinfo.cb = sizeof (STARTUPINFO);
+ sinfo.lpReserved = NULL;
+ sinfo.lpDesktop = NULL;
+ sinfo.lpTitle = NULL;
+ if (compose_handles_block (&inh_handles, &sinfo) < 0)
+ {
+ int saved_errno = errno;
+ free_inheritable_handles (&inh_handles);
+ if (envblock != NULL)
+ free (envblock);
+ free (command);
+ if (resolved_progname != progname)
+ free ((char *) resolved_progname);
+ errno = saved_errno;
+ return -1;
+ }
+
+ PROCESS_INFORMATION pinfo;
+ if (!CreateProcess (resolved_progname, command, NULL, NULL, TRUE,
+ process_creation_flags, envblock, currdir, &sinfo,
+ &pinfo))
+ {
+ DWORD error = GetLastError ();
+
+ free (sinfo.lpReserved2);
+ free_inheritable_handles (&inh_handles);
+ if (envblock != NULL)
+ free (envblock);
+ free (command);
+ if (resolved_progname != progname)
+ free ((char *) resolved_progname);
+
+ errno = convert_CreateProcess_error (error);
+ return -1;
+ }
+
+ if (pinfo.hThread)
+ CloseHandle (pinfo.hThread);
+ free (sinfo.lpReserved2);
+ free_inheritable_handles (&inh_handles);
+ if (envblock != NULL)
+ free (envblock);
+ free (command);
+ if (resolved_progname != progname)
+ free ((char *) resolved_progname);
+
+ switch (mode)
+ {
+ case P_WAIT:
+ {
+ /* Wait until it terminates. Then get its exit status code. */
+ switch (WaitForSingleObject (pinfo.hProcess, INFINITE))
+ {
+ case WAIT_OBJECT_0:
+ break;
+ case WAIT_FAILED:
+ errno = ECHILD;
+ return -1;
+ default:
+ abort ();
+ }
+
+ DWORD exit_code;
+ if (!GetExitCodeProcess (pinfo.hProcess, &exit_code))
+ {
+ errno = ECHILD;
+ return -1;
+ }
+ CloseHandle (pinfo.hProcess);
+ return exit_code;
+ }
+
+ case P_NOWAIT:
+ /* Return pinfo.hProcess, not pinfo.dwProcessId. */
+ return (intptr_t) pinfo.hProcess;
+
+ case P_DETACH:
+ case P_OVERLAY:
+ CloseHandle (pinfo.hProcess);
+ return 0;
+
+ default:
+ /* Already checked above. */
+ abort ();
+ }
+
+ /*NOTREACHED*/
+ out_of_memory_2:
+ free (command);
+ out_of_memory_1:
+ if (resolved_progname != progname)
+ free ((char *) resolved_progname);
+ errno = ENOMEM;
+ return -1;
+}
diff --git a/lib/windows-spawn.h b/lib/windows-spawn.h
new file mode 100644
index 0000000..1ff76f6
--- /dev/null
+++ b/lib/windows-spawn.h
@@ -0,0 +1,154 @@
+/* Auxiliary functions for the creation of subprocesses. Native Windows API.
+ Copyright (C) 2001, 2003-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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/>. */
+
+#ifndef _WINDOWS_SPAWN_H
+#define _WINDOWS_SPAWN_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/* Get declarations of the native Windows API functions. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+
+/* Prepares an argument vector before calling spawn().
+
+ Note that spawn() does not by itself call the command interpreter
+ (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+ ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&v);
+ v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+ }) ? "cmd.exe" : "command.com").
+ Instead it simply concatenates the arguments, separated by ' ', and calls
+ CreateProcess(). We must quote the arguments since Windows CreateProcess()
+ interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+ special way:
+ - Space and tab are interpreted as delimiters. They are not treated as
+ delimiters if they are surrounded by double quotes: "...".
+ - Unescaped double quotes are removed from the input. Their only effect is
+ that within double quotes, space and tab are treated like normal
+ characters.
+ - Backslashes not followed by double quotes are not special.
+ - But 2*n+1 backslashes followed by a double quote become
+ n backslashes followed by a double quote (n >= 0):
+ \" -> "
+ \\\" -> \"
+ \\\\\" -> \\"
+ - '*', '?' characters may get expanded through wildcard expansion in the
+ callee: By default, in the callee, the initialization code before main()
+ takes the result of GetCommandLine(), wildcard-expands it, and passes it
+ to main(). The exceptions to this rule are:
+ - programs that inspect GetCommandLine() and ignore argv,
+ - mingw programs that have a global variable 'int _CRT_glob = 0;',
+ - Cygwin programs, when invoked from a Cygwin program.
+
+ prepare_spawn creates and returns a new argument vector, where the arguments
+ are appropriately quoted and an additional argument "sh.exe" has been added
+ at the beginning. The new argument vector is freshly allocated. The memory
+ for all its elements is allocated within *MEM_TO_FREE, which is freshly
+ allocated as well. In case of memory allocation failure, NULL is returned,
+ with errno set.
+ */
+extern const char ** prepare_spawn (const char * const *argv,
+ char **mem_to_free);
+
+/* Composes the command to be passed to CreateProcess().
+ ARGV must contain appropriately quoted arguments, as returned by
+ prepare_spawn.
+ Returns a freshly allocated string. In case of memory allocation failure,
+ NULL is returned, with errno set. */
+extern char * compose_command (const char * const *argv);
+
+/* Composes the block of memory that contains the environment variables.
+ ENVP must contain an environment (a NULL-terminated array of string of the
+ form VARIABLE=VALUE).
+ Returns a freshly allocated block of memory. In case of memory allocation
+ failure, NULL is returned, with errno set. */
+extern char * compose_envblock (const char * const *envp);
+
+
+/* This struct keeps track of which handles to pass to a subprocess, and with
+ which flags. All of the handles here are inheritable.
+ Regarding handle inheritance, see
+ <https://docs.microsoft.com/en-us/windows/win32/sysinfo/handle-inheritance> */
+struct inheritable_handles
+{
+ /* The number of occupied entries in the two arrays below.
+ 3 <= count <= allocated. */
+ size_t count;
+ /* The number of allocated entries in the two arrays below. */
+ size_t allocated;
+ /* handles[0..count-1] are the occupied entries.
+ handles[fd] is either INVALID_HANDLE_VALUE or an inheritable handle. */
+ HANDLE *handles;
+ /* flags[0..count-1] are the occupied entries.
+ flags[fd] is only relevant if handles[fd] != INVALID_HANDLE_VALUE.
+ It is a bit mask consisting of:
+ - 32 for O_APPEND.
+ */
+ unsigned char *flags;
+};
+
+/* Initializes a set of inheritable handles, filling in all inheritable handles
+ assigned to file descriptors.
+ If DUPLICATE is true, the handles stored in the set are duplicates.
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+extern int init_inheritable_handles (struct inheritable_handles *inh_handles,
+ bool duplicate);
+
+/* Fills a set of inheritable handles into a STARTUPINFO for CreateProcess().
+ Returns 0 upon success. In case of failure, -1 is returned, with errno set.
+ */
+extern int compose_handles_block (const struct inheritable_handles *inh_handles,
+ STARTUPINFO *sinfo);
+
+/* Frees the memory held by a set of inheritable handles. */
+extern void free_inheritable_handles (struct inheritable_handles *inh_handles);
+
+
+/* Converts a CreateProcess() error code (retrieved through GetLastError()) to
+ an errno value. */
+extern int convert_CreateProcess_error (DWORD error);
+
+
+/* Creates a subprocess.
+ MODE is either P_WAIT or P_NOWAIT.
+ PROGNAME is the program to invoke.
+ ARGV is the NULL-terminated array of arguments, ARGV[0] being PROGNAME by
+ convention.
+ ENVP is the NULL-terminated set of environment variable assignments, or NULL
+ to inherit the initial environ variable assignments from the caller and
+ ignore all calls to putenv(), setenv(), unsetenv() done in the caller.
+ CURRDIR is the directory in which to start the program, or NULL to inherit
+ the working directory from the caller.
+ STDIN_HANDLE, STDOUT_HANDLE, STDERR_HANDLE are the handles to use for the
+ first three file descriptors in the callee process.
+ Returns
+ - 0 for success (if MODE is P_WAIT), or
+ - a handle that be passed to _cwait (on Windows) or waitpid (on OS/2), or
+ - -1 upon error, with errno set.
+ */
+extern intptr_t spawnpvech (int mode,
+ const char *progname, const char * const *argv,
+ const char * const *envp,
+ const char *currdir,
+ HANDLE stdin_handle, HANDLE stdout_handle,
+ HANDLE stderr_handle);
+
+#endif /* _WINDOWS_SPAWN_H */
diff --git a/lib/wmemchr-impl.h b/lib/wmemchr-impl.h
new file mode 100644
index 0000000..55231b3
--- /dev/null
+++ b/lib/wmemchr-impl.h
@@ -0,0 +1,27 @@
+/* Search wide character array for a wide character.
+ Copyright (C) 1999, 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 1999.
+
+ 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/>. */
+
+wchar_t *
+wmemchr (const wchar_t *s, wchar_t c, size_t n)
+{
+ for (; n > 0; s++, n--)
+ {
+ if (*s == c)
+ return (wchar_t *) s;
+ }
+ return NULL;
+}
diff --git a/lib/wmemchr.c b/lib/wmemchr.c
new file mode 100644
index 0000000..b4f1970
--- /dev/null
+++ b/lib/wmemchr.c
@@ -0,0 +1,23 @@
+/* Search wide character array for a wide character.
+ Copyright (C) 2011-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2011.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+#include "wmemchr-impl.h"
diff --git a/lib/wmempcpy.c b/lib/wmempcpy.c
new file mode 100644
index 0000000..2e96ed8
--- /dev/null
+++ b/lib/wmempcpy.c
@@ -0,0 +1,28 @@
+/* Copy wide character array, return pointer after last written wide character.
+ Copyright (C) 2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <wchar.h>
+
+/* Copy N wide characters of SRC to DEST.
+ Return pointer to wide characters after the last written wide character. */
+wchar_t *
+wmempcpy (wchar_t *dest, const wchar_t *src, size_t n)
+{
+ return wmemcpy (dest, src, n) + n;
+}
diff --git a/lib/write.c b/lib/write.c
new file mode 100644
index 0000000..deafb2a
--- /dev/null
+++ b/lib/write.c
@@ -0,0 +1,155 @@
+/* POSIX compatible write() function.
+ Copyright (C) 2008-2020 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+ 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include <unistd.h>
+
+/* On native Windows platforms, SIGPIPE does not exist. When write() is
+ called on a pipe with no readers, WriteFile() fails with error
+ GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
+ error EINVAL. */
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+# include <errno.h>
+# include <signal.h>
+# include <io.h>
+
+# define WIN32_LEAN_AND_MEAN /* avoid including junk */
+# include <windows.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+# endif
+# if GNULIB_MSVC_NOTHROW
+# include "msvc-nothrow.h"
+# else
+# include <io.h>
+# endif
+
+/* Don't assume that UNICODE is not defined. */
+# undef GetNamedPipeHandleState
+# define GetNamedPipeHandleState GetNamedPipeHandleStateA
+
+# undef write
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static ssize_t
+write_nothrow (int fd, const void *buf, size_t count)
+{
+ ssize_t result;
+
+ TRY_MSVC_INVAL
+ {
+ result = _write (fd, buf, count);
+ }
+ CATCH_MSVC_INVAL
+ {
+ result = -1;
+ errno = EBADF;
+ }
+ DONE_MSVC_INVAL;
+
+ return result;
+}
+# else
+# define write_nothrow _write
+# endif
+
+ssize_t
+rpl_write (int fd, const void *buf, size_t count)
+{
+ for (;;)
+ {
+ ssize_t ret = write_nothrow (fd, buf, count);
+
+ if (ret < 0)
+ {
+# if GNULIB_NONBLOCKING
+ if (errno == ENOSPC)
+ {
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ if (GetFileType (h) == FILE_TYPE_PIPE)
+ {
+ /* h is a pipe or socket. */
+ DWORD state;
+ if (GetNamedPipeHandleState (h, &state, NULL, NULL, NULL,
+ NULL, 0)
+ && (state & PIPE_NOWAIT) != 0)
+ {
+ /* h is a pipe in non-blocking mode.
+ We can get here in four situations:
+ 1. When the pipe buffer is full.
+ 2. When count <= pipe_buf_size and the number of
+ free bytes in the pipe buffer is < count.
+ 3. When count > pipe_buf_size and the number of free
+ bytes in the pipe buffer is > 0, < pipe_buf_size.
+ 4. When count > pipe_buf_size and the pipe buffer is
+ entirely empty.
+ The cases 1 and 2 are POSIX compliant. In cases 3 and
+ 4 POSIX specifies that write() must split the request
+ and succeed with a partial write. We fix case 4.
+ We don't fix case 3 because it is not essential for
+ programs. */
+ DWORD out_size; /* size of the buffer for outgoing data */
+ DWORD in_size; /* size of the buffer for incoming data */
+ if (GetNamedPipeInfo (h, NULL, &out_size, &in_size, NULL))
+ {
+ size_t reduced_count = count;
+ /* In theory we need only one of out_size, in_size.
+ But I don't know which of the two. The description
+ is ambiguous. */
+ if (out_size != 0 && out_size < reduced_count)
+ reduced_count = out_size;
+ if (in_size != 0 && in_size < reduced_count)
+ reduced_count = in_size;
+ if (reduced_count < count)
+ {
+ /* Attempt to write only the first part. */
+ count = reduced_count;
+ continue;
+ }
+ }
+ /* Change errno from ENOSPC to EAGAIN. */
+ errno = EAGAIN;
+ }
+ }
+ }
+ else
+# endif
+ {
+# if GNULIB_SIGPIPE
+ if (GetLastError () == ERROR_NO_DATA
+ && GetFileType ((HANDLE) _get_osfhandle (fd))
+ == FILE_TYPE_PIPE)
+ {
+ /* Try to raise signal SIGPIPE. */
+ raise (SIGPIPE);
+ /* If it is currently blocked or ignored, change errno from
+ EINVAL to EPIPE. */
+ errno = EPIPE;
+ }
+# endif
+ }
+ }
+ return ret;
+ }
+}
+
+#endif
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
new file mode 100644
index 0000000..68559de
--- /dev/null
+++ b/lib/xalloc-die.c
@@ -0,0 +1,41 @@
+/* Report a memory allocation failure and exit.
+
+ Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2020 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/>. */
+
+#include <config.h>
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xalloc_die (void)
+{
+ error (exit_failure, 0, "%s", _("memory exhausted"));
+
+ /* _Noreturn cannot be given to error, since it may return if
+ its first argument is 0. To help compilers understand the
+ xalloc_die does not return, call abort. Also, the abort is a
+ safety feature if exit_failure is 0 (which shouldn't happen). */
+ abort ();
+}
diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h
new file mode 100644
index 0000000..7cd4a74
--- /dev/null
+++ b/lib/xalloc-oversized.h
@@ -0,0 +1,60 @@
+/* xalloc-oversized.h -- memory allocation size checking
+
+ Copyright (C) 1990-2000, 2003-2004, 2006-2020 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/>. */
+
+#ifndef XALLOC_OVERSIZED_H_
+#define XALLOC_OVERSIZED_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* True if N * S would overflow in a size_t calculation,
+ or would generate a value larger than PTRDIFF_MAX.
+ This expands to a constant expression if N and S are both constants.
+ By gnulib convention, SIZE_MAX represents overflow in size
+ calculations, so the conservative size_t-based dividend to use here
+ is SIZE_MAX - 1. */
+#define __xalloc_oversized(n, s) \
+ ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n))
+
+#if PTRDIFF_MAX < SIZE_MAX
+typedef ptrdiff_t __xalloc_count_type;
+#else
+typedef size_t __xalloc_count_type;
+#endif
+
+/* Return 1 if an array of N objects, each of size S, cannot exist
+ reliably due to size or ptrdiff_t arithmetic overflow. S must be
+ positive and N must be nonnegative. This is a macro, not a
+ function, so that it works correctly even when SIZE_MAX < N. */
+
+#if 7 <= __GNUC__ && !defined __clang__
+# define xalloc_oversized(n, s) \
+ __builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1)
+#elif 5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__
+# define xalloc_oversized(n, s) \
+ (__builtin_constant_p (n) && __builtin_constant_p (s) \
+ ? __xalloc_oversized (n, s) \
+ : ({ __xalloc_count_type __xalloc_count; \
+ __builtin_mul_overflow (n, s, &__xalloc_count); }))
+
+/* Other compilers use integer division; this may be slower but is
+ more portable. */
+#else
+# define xalloc_oversized(n, s) __xalloc_oversized (n, s)
+#endif
+
+#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/lib/xalloc.h b/lib/xalloc.h
new file mode 100644
index 0000000..d4f96bf
--- /dev/null
+++ b/lib/xalloc.h
@@ -0,0 +1,270 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+ Copyright (C) 1990-2000, 2003-2004, 2006-2020 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/>. */
+
+#ifndef XALLOC_H_
+#define XALLOC_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "xalloc-oversized.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef XALLOC_INLINE
+# define XALLOC_INLINE _GL_INLINE
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if GNULIB_XALLOC_DIE
+
+/* This function is always triggered when memory is exhausted.
+ It must be defined by the application, either explicitly
+ or by using gnulib's xalloc-die module. This is the
+ function to call when one wants the program to die because of a
+ memory allocation failure. */
+/*extern*/ _Noreturn void xalloc_die (void);
+
+#endif /* GNULIB_XALLOC_DIE */
+
+#if GNULIB_XALLOC
+
+void *xmalloc (size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xzalloc (size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xcalloc (size_t n, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+void *xrealloc (void *p, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+char *xstrdup (char const *str)
+ _GL_ATTRIBUTE_MALLOC;
+
+/* In the following macros, T must be an elementary or structure/union or
+ typedef'ed type, or a pointer to such a type. To apply one of the
+ following macros to a function pointer or array type, you need to typedef
+ it first and use the typedef name. */
+
+/* Allocate an object of type T dynamically, with error checking. */
+/* extern t *XMALLOC (typename t); */
+# define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking. */
+/* extern t *XNMALLOC (size_t n, typename t); */
+# define XNMALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+
+/* Allocate an object of type T dynamically, with error checking,
+ and zero it. */
+/* extern t *XZALLOC (typename t); */
+# define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking,
+ and zero it. */
+/* extern t *XCALLOC (size_t n, typename t); */
+# define XCALLOC(n, t) \
+ ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+
+
+/* Allocate an array of N objects, each with S bytes of memory,
+ dynamically, with error checking. S must be nonzero. */
+
+XALLOC_INLINE void *xnmalloc (size_t n, size_t s)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+XALLOC_INLINE void *
+xnmalloc (size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xmalloc (n * s);
+}
+
+/* Change the size of an allocated block of memory P to an array of N
+ objects each of S bytes, with error checking. S must be nonzero. */
+
+XALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s)
+ _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+XALLOC_INLINE void *
+xnrealloc (void *p, size_t n, size_t s)
+{
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ return xrealloc (p, n * s);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+ otherwise, reallocate P so that it contains more than *PN objects
+ each of S bytes. S must be nonzero. Set *PN to the new number of
+ objects, and return the pointer to the new block. *PN is never set
+ to zero, and the returned pointer is never null.
+
+ Repeated reallocations are guaranteed to make progress, either by
+ allocating an initial block with a nonzero size, or by allocating a
+ larger block.
+
+ In the following implementation, nonzero sizes are increased by a
+ factor of approximately 1.5 so that repeated reallocations have
+ O(N) overall cost rather than O(N**2) cost, but the
+ specification for this function does not guarantee that rate.
+
+ Here is an example of use:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ p = x2nrealloc (p, &allocated, sizeof *p);
+ p[used++] = value;
+ }
+
+ This causes x2nrealloc to allocate a block of some nonzero size the
+ first time it is called.
+
+ To have finer-grained control over the initial size, set *PN to a
+ nonzero value before calling this function with P == NULL. For
+ example:
+
+ int *p = NULL;
+ size_t used = 0;
+ size_t allocated = 0;
+ size_t allocated1 = 1000;
+
+ void
+ append_int (int value)
+ {
+ if (used == allocated)
+ {
+ p = x2nrealloc (p, &allocated1, sizeof *p);
+ allocated = allocated1;
+ }
+ p[used++] = value;
+ }
+
+ */
+
+XALLOC_INLINE void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+ size_t n = *pn;
+
+ if (! p)
+ {
+ if (! n)
+ {
+ /* The approximate size to use for initial small allocation
+ requests, when the invoking code specifies an old size of
+ zero. This is the largest "small" request for the GNU C
+ library malloc. */
+ enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+ n = DEFAULT_MXFAST / s;
+ n += !n;
+ }
+ if (xalloc_oversized (n, s))
+ xalloc_die ();
+ }
+ else
+ {
+ /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0.
+ Check for overflow, so that N * S stays in both ptrdiff_t and
+ size_t range. The check may be slightly conservative, but an
+ exact check isn't worth the trouble. */
+ if ((PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX) / 3 * 2 / s
+ <= n)
+ xalloc_die ();
+ n += n / 2 + 1;
+ }
+
+ *pn = n;
+ return xrealloc (p, n * s);
+}
+
+/* Return a pointer to a new buffer of N bytes. This is like xmalloc,
+ except it returns char *. */
+
+XALLOC_INLINE char *xcharalloc (size_t n)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+XALLOC_INLINE char *
+xcharalloc (size_t n)
+{
+ return XNMALLOC (n, char);
+}
+
+#endif /* GNULIB_XALLOC */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#if GNULIB_XALLOC && defined __cplusplus
+
+/* C++ does not allow conversions from void * to other pointer types
+ without a cast. Use templates to work around the problem when
+ possible. */
+
+template <typename T> inline T *
+xrealloc (T *p, size_t s)
+{
+ return (T *) xrealloc ((void *) p, s);
+}
+
+template <typename T> inline T *
+xnrealloc (T *p, size_t n, size_t s)
+{
+ return (T *) xnrealloc ((void *) p, n, s);
+}
+
+template <typename T> inline T *
+x2realloc (T *p, size_t *pn)
+{
+ return (T *) x2realloc ((void *) p, pn);
+}
+
+template <typename T> inline T *
+x2nrealloc (T *p, size_t *pn, size_t s)
+{
+ return (T *) x2nrealloc ((void *) p, pn, s);
+}
+
+template <typename T> inline T *
+xmemdup (T const *p, size_t s)
+{
+ return (T *) xmemdup ((void const *) p, s);
+}
+
+#endif /* GNULIB_XALLOC && C++ */
+
+
+_GL_INLINE_HEADER_END
+
+#endif /* !XALLOC_H_ */
diff --git a/lib/xmalloc.c b/lib/xmalloc.c
new file mode 100644
index 0000000..69c4e7d
--- /dev/null
+++ b/lib/xmalloc.c
@@ -0,0 +1,133 @@
+/* xmalloc.c -- malloc with out of memory checking
+
+ Copyright (C) 1990-2000, 2002-2006, 2008-2020 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/>. */
+
+#include <config.h>
+
+#define XALLOC_INLINE _GL_EXTERN_INLINE
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* 1 if calloc, malloc and realloc are known to be compatible with GNU.
+ This matters if we are not also using the calloc-gnu, malloc-gnu
+ and realloc-gnu modules, which define HAVE_CALLOC_GNU,
+ HAVE_MALLOC_GNU and HAVE_REALLOC_GNU and support the GNU API even
+ on non-GNU platforms. */
+#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
+enum { HAVE_GNU_CALLOC = 1 };
+#else
+enum { HAVE_GNU_CALLOC = 0 };
+#endif
+#if defined HAVE_MALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
+enum { HAVE_GNU_MALLOC = 1 };
+#else
+enum { HAVE_GNU_MALLOC = 0 };
+#endif
+#if defined HAVE_REALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
+enum { HAVE_GNU_REALLOC = 1 };
+#else
+enum { HAVE_GNU_REALLOC = 0 };
+#endif
+
+/* Allocate N bytes of memory dynamically, with error checking. */
+
+void *
+xmalloc (size_t n)
+{
+ void *p = malloc (n);
+ if (!p && (HAVE_GNU_MALLOC || n))
+ xalloc_die ();
+ return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+ with error checking. */
+
+void *
+xrealloc (void *p, size_t n)
+{
+ if (!HAVE_GNU_REALLOC && !n && p)
+ {
+ /* The GNU and C99 realloc behaviors disagree here. Act like GNU. */
+ free (p);
+ return NULL;
+ }
+
+ void *r = realloc (p, n);
+ if (!r && (n || (HAVE_GNU_REALLOC && !p)))
+ xalloc_die ();
+ return r;
+}
+
+/* If P is null, allocate a block of at least *PN bytes; otherwise,
+ reallocate P so that it contains more than *PN bytes. *PN must be
+ nonzero unless P is null. Set *PN to the new block's size, and
+ return the pointer to the new block. *PN is never set to zero, and
+ the returned pointer is never null. */
+
+void *
+x2realloc (void *p, size_t *pn)
+{
+ return x2nrealloc (p, pn, 1);
+}
+
+/* Allocate N bytes of zeroed memory dynamically, with error checking.
+ There's no need for xnzalloc (N, S), since it would be equivalent
+ to xcalloc (N, S). */
+
+void *
+xzalloc (size_t n)
+{
+ return xcalloc (n, 1);
+}
+
+/* Allocate zeroed memory for N elements of S bytes, with error
+ checking. S must be nonzero. */
+
+void *
+xcalloc (size_t n, size_t s)
+{
+ void *p;
+ /* Test for overflow, since objects with size greater than
+ PTRDIFF_MAX cause pointer subtraction to go awry. Omit size-zero
+ tests if HAVE_GNU_CALLOC, since GNU calloc never returns NULL if
+ successful. */
+ if (xalloc_oversized (n, s)
+ || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
+ xalloc_die ();
+ return p;
+}
+
+/* Clone an object P of size S, with error checking. There's no need
+ for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
+ need for an arithmetic overflow check. */
+
+void *
+xmemdup (void const *p, size_t s)
+{
+ return memcpy (xmalloc (s), p, s);
+}
+
+/* Clone STRING. */
+
+char *
+xstrdup (char const *string)
+{
+ return xmemdup (string, strlen (string) + 1);
+}
diff --git a/lib/xmemdup0.c b/lib/xmemdup0.c
new file mode 100644
index 0000000..c076b9a
--- /dev/null
+++ b/lib/xmemdup0.c
@@ -0,0 +1,45 @@
+/* xmemdup0.c -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008-2020 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/>. */
+
+#include <config.h>
+
+#include "xmemdup0.h"
+#include "xalloc.h"
+
+#include <string.h>
+
+/* Clone an arbitrary block of bytes P of size S, with error checking,
+ and include a terminating NUL byte. P is of type 'void const *',
+ to make it easier to use this with other mem* functions that return
+ 'void *', but since appending a NUL byte only makes sense on bytes,
+ the return type is 'char *'.
+
+ The terminating NUL makes it safe to use strlen or rawmemchr to
+ check for embedded NUL; it also speeds up algorithms such as escape
+ sequence processing on arbitrary memory, by making it always safe
+ to read the byte after the escape character rather than having to
+ check if each escape character is the last byte in the object. */
+
+char *
+xmemdup0 (void const *p, size_t s)
+{
+ char *result = xcharalloc (s + 1);
+ if (s > 0)
+ memcpy (result, p, s);
+ result[s] = 0;
+ return result;
+}
diff --git a/lib/xmemdup0.h b/lib/xmemdup0.h
new file mode 100644
index 0000000..9a61ade
--- /dev/null
+++ b/lib/xmemdup0.h
@@ -0,0 +1,34 @@
+/* xmemdup0.h -- copy a block of arbitrary bytes, plus a trailing NUL
+
+ Copyright (C) 2008-2020 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/>. */
+
+#ifndef XMEMDUP_H_
+# define XMEMDUP_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+char *xmemdup0 (void const *p, size_t s);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* !XMEMDUP0_H_ */
diff --git a/lib/xsize.c b/lib/xsize.c
new file mode 100644
index 0000000..4b4914c
--- /dev/null
+++ b/lib/xsize.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define XSIZE_INLINE _GL_EXTERN_INLINE
+#include "xsize.h"
diff --git a/lib/xsize.h b/lib/xsize.h
new file mode 100644
index 0000000..26ef20b
--- /dev/null
+++ b/lib/xsize.h
@@ -0,0 +1,108 @@
+/* xsize.h -- Checked size_t computations.
+
+ Copyright (C) 2003, 2008-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that 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/>. */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t. */
+#include <stddef.h>
+
+/* Get SIZE_MAX. */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* Get ATTRIBUTE_PURE. */
+#include "attribute.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef XSIZE_INLINE
+# define XSIZE_INLINE _GL_INLINE
+#endif
+
+/* The size of memory objects is often computed through expressions of
+ type size_t. Example:
+ void* p = malloc (header_size + n * element_size).
+ These computations can lead to overflow. When this happens, malloc()
+ returns a piece of memory that is way too small, and the program then
+ crashes while attempting to fill the memory.
+ To avoid this, the functions and macros in this file check for overflow.
+ The convention is that SIZE_MAX represents overflow.
+ malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+ implementation that uses mmap --, it's recommended to use size_overflow_p()
+ or size_in_bounds_p() before invoking malloc().
+ The example thus becomes:
+ size_t size = xsum (header_size, xtimes (n, element_size));
+ void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t. */
+#define xcast_size_t(N) \
+ ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum (size_t size1, size_t size2)
+{
+ size_t sum = size1 + size2;
+ return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+ return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+ return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check. */
+XSIZE_INLINE size_t ATTRIBUTE_PURE
+xmax (size_t size1, size_t size2)
+{
+ /* No explicit check is needed here, because for any n:
+ max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
+ return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+ The count must be >= 0 and the element size must be > 0.
+ This is a macro, not a function, so that it works correctly even
+ when N is of a wider type and N > SIZE_MAX. */
+#define xtimes(N, ELSIZE) \
+ ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow. */
+#define size_overflow_p(SIZE) \
+ ((SIZE) == SIZE_MAX)
+/* Check against overflow. */
+#define size_in_bounds_p(SIZE) \
+ ((SIZE) != SIZE_MAX)
+
+_GL_INLINE_HEADER_END
+
+#endif /* _XSIZE_H */
diff --git a/lib/xstrndup.c b/lib/xstrndup.c
new file mode 100644
index 0000000..93dcfe5
--- /dev/null
+++ b/lib/xstrndup.c
@@ -0,0 +1,36 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2006-2007, 2009-2020 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/>. */
+
+#include <config.h>
+
+/* Specification. */
+#include "xstrndup.h"
+
+#include <string.h>
+#include "xalloc.h"
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+char *
+xstrndup (const char *string, size_t n)
+{
+ char *s = strndup (string, n);
+ if (! s)
+ xalloc_die ();
+ return s;
+}
diff --git a/lib/xstrndup.h b/lib/xstrndup.h
new file mode 100644
index 0000000..4f1da97
--- /dev/null
+++ b/lib/xstrndup.h
@@ -0,0 +1,23 @@
+/* Duplicate a bounded initial segment of a string, with out-of-memory
+ checking.
+ Copyright (C) 2003, 2009-2020 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/>. */
+
+#include <stddef.h>
+
+/* Return a newly allocated copy of at most N bytes of STRING.
+ In other words, return a copy of the initial segment of length N of
+ STRING. */
+extern char *xstrndup (const char *string, size_t n) _GL_ATTRIBUTE_MALLOC;
diff --git a/m4/00gnulib.m4 b/m4/00gnulib.m4
new file mode 100644
index 0000000..14628c3
--- /dev/null
+++ b/m4/00gnulib.m4
@@ -0,0 +1,85 @@
+# 00gnulib.m4 serial 8
+dnl Copyright (C) 2009-2020 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 This file must be named something that sorts before all other
+dnl gnulib-provided .m4 files. It is needed until the clang fix has
+dnl been included in Autoconf.
+
+# The following definitions arrange to use a compiler option
+# -Werror=implicit-function-declaration in AC_CHECK_DECL, when the
+# compiler is clang. Without it, clang implicitly declares "known"
+# library functions in C mode, but not in C++ mode, which would cause
+# Gnulib to omit a declaration and thus later produce an error in C++
+# mode. As of clang 9.0, these "known" functions are identified through
+# LIBBUILTIN invocations in the LLVM source file
+# llvm/tools/clang/include/clang/Basic/Builtins.def.
+# It's not possible to AC_REQUIRE the extra tests from AC_CHECK_DECL,
+# because AC_CHECK_DECL, like other Autoconf built-ins, is not supposed
+# to AC_REQUIRE anything: some configure.ac files have their first
+# AC_CHECK_DECL executed conditionally. Therefore append the extra tests
+# to AC_PROG_CC.
+AC_DEFUN([gl_COMPILER_CLANG],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([whether the compiler is clang],
+ [gl_cv_compiler_clang],
+ [dnl Use _AC_COMPILE_IFELSE instead of AC_EGREP_CPP, to avoid error
+ dnl "circular dependency of AC_LANG_COMPILER(C)" if AC_PROG_CC has
+ dnl not yet been invoked.
+ _AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifdef __clang__
+ barfbarf
+ #endif
+ ]],[[]])
+ ],
+ [gl_cv_compiler_clang=no],
+ [gl_cv_compiler_clang=yes])
+ ])
+])
+AC_DEFUN([gl_COMPILER_PREPARE_CHECK_DECL],
+[
+dnl AC_REQUIRE([AC_PROG_CC])
+dnl AC_REQUIRE([gl_COMPILER_CLANG])
+ AC_CACHE_CHECK([for compiler option needed when checking for declarations],
+ [gl_cv_compiler_check_decl_option],
+ [if test $gl_cv_compiler_clang = yes; then
+ dnl Test whether the compiler supports the option
+ dnl '-Werror=implicit-function-declaration'.
+ save_ac_compile="$ac_compile"
+ ac_compile="$ac_compile -Werror=implicit-function-declaration"
+ dnl Use _AC_COMPILE_IFELSE instead of AC_COMPILE_IFELSE, to avoid a
+ dnl warning "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+ _AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[]])],
+ [gl_cv_compiler_check_decl_option='-Werror=implicit-function-declaration'],
+ [gl_cv_compiler_check_decl_option=none])
+ ac_compile="$save_ac_compile"
+ else
+ gl_cv_compiler_check_decl_option=none
+ fi
+ ])
+ if test "x$gl_cv_compiler_check_decl_option" != xnone; then
+ ac_compile_for_check_decl="$ac_compile $gl_cv_compiler_check_decl_option"
+ else
+ ac_compile_for_check_decl="$ac_compile"
+ fi
+])
+dnl Redefine _AC_CHECK_DECL_BODY so that it references ac_compile_for_check_decl
+dnl instead of ac_compile. If, for whatever reason, the override of AC_PROG_CC
+dnl in zzgnulib.m4 is inactive, use the original ac_compile.
+m4_define([_AC_CHECK_DECL_BODY],
+[ ac_save_ac_compile="$ac_compile"
+ if test -n "$ac_compile_for_check_decl"; then
+ ac_compile="$ac_compile_for_check_decl"
+ fi]
+m4_defn([_AC_CHECK_DECL_BODY])[ ac_compile="$ac_save_ac_compile"
+])
+
+# gl_00GNULIB
+# -----------
+# Witness macro that this file has been included. Needed to force
+# Automake to include this file prior to all other gnulib .m4 files.
+AC_DEFUN([gl_00GNULIB])
diff --git a/m4/__inline.m4 b/m4/__inline.m4
new file mode 100644
index 0000000..520c8c4
--- /dev/null
+++ b/m4/__inline.m4
@@ -0,0 +1,22 @@
+# Test for __inline keyword
+dnl Copyright 2017-2020 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.
+
+AC_DEFUN([gl___INLINE],
+[
+ AC_CACHE_CHECK([whether the compiler supports the __inline keyword],
+ [gl_cv_c___inline],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[typedef int foo_t;
+ static __inline foo_t foo (void) { return 0; }]],
+ [[return foo ();]])],
+ [gl_cv_c___inline=yes],
+ [gl_cv_c___inline=no])])
+ if test $gl_cv_c___inline = yes; then
+ AC_DEFINE([HAVE___INLINE], [1],
+ [Define to 1 if the compiler supports the keyword '__inline'.])
+ fi
+])
diff --git a/m4/absolute-header.m4 b/m4/absolute-header.m4
new file mode 100644
index 0000000..c043233
--- /dev/null
+++ b/m4/absolute-header.m4
@@ -0,0 +1,100 @@
+# absolute-header.m4 serial 17
+dnl Copyright (C) 2006-2020 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 Derek Price.
+
+# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
+# ---------------------------------------
+# Find the absolute name of a header file, testing first if the header exists.
+# If the header were sys/inttypes.h, this macro would define
+# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
+# in config.h
+# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PREPROC_REQUIRE()dnl
+m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_absolute_header],
+ [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ [gl_absolute_header],
+ [AS_VAR_PUSHDEF([ac_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
+ AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
+ if test AS_VAR_GET([ac_header_exists]) = yes; then
+ gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
+ fi
+ AS_VAR_POPDEF([ac_header_exists])dnl
+ ])dnl
+ AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
+ ["AS_VAR_GET([gl_absolute_header])"],
+ [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
+ AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
+
+# gl_ABSOLUTE_HEADER_ONE(HEADER)
+# ------------------------------
+# Like gl_ABSOLUTE_HEADER, except that:
+# - it assumes that the header exists,
+# - it uses the current CPPFLAGS,
+# - it does not cache the result,
+# - it is silent.
+AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
+ dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+ dnl that contain only a #include of other header files and no
+ dnl non-comment tokens of their own. This leads to a failure to
+ dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+ dnl and others. The workaround is to force preservation of comments
+ dnl through option -C. This ensures all necessary #line directives
+ dnl are present. GCC supports option -C as well.
+ case "$host_os" in
+ aix*) gl_absname_cpp="$ac_cpp -C" ;;
+ *) gl_absname_cpp="$ac_cpp" ;;
+ esac
+changequote(,)
+ case "$host_os" in
+ mingw*)
+ dnl For the sake of native Windows compilers (excluding gcc),
+ dnl treat backslash as a directory separator, like /.
+ dnl Actually, these compilers use a double-backslash as
+ dnl directory separator, inside the
+ dnl # line "filename"
+ dnl directives.
+ gl_dirsep_regex='[/\\]'
+ ;;
+ *)
+ gl_dirsep_regex='\/'
+ ;;
+ esac
+ dnl A sed expression that turns a string into a basic regular
+ dnl expression, for use within "/.../".
+ gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+ gl_header_literal_regex=`echo '$1' \
+ | sed -e "$gl_make_literal_regex_sed"`
+ gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+ s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+ s|^/[^/]|//&|
+ p
+ q
+ }'
+changequote([,])
+ dnl eval is necessary to expand gl_absname_cpp.
+ dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+ dnl so use subshell.
+ AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
+[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+ sed -n "$gl_absolute_header_sed"`])
+])
diff --git a/m4/access.m4 b/m4/access.m4
new file mode 100644
index 0000000..cfe799d
--- /dev/null
+++ b/m4/access.m4
@@ -0,0 +1,16 @@
+# access.m4 serial 1
+dnl Copyright (C) 2019-2020 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.
+
+AC_DEFUN([gl_FUNC_ACCESS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ dnl On native Windows, access (= _access) does not support the X_OK mode.
+ dnl It works by chance on some versions of mingw.
+ case "$host_os" in
+ mingw*) REPLACE_ACCESS=1 ;;
+ esac
+])
diff --git a/m4/af_alg.m4 b/m4/af_alg.m4
new file mode 100644
index 0000000..418d690
--- /dev/null
+++ b/m4/af_alg.m4
@@ -0,0 +1,56 @@
+# af_alg.m4 serial 4
+dnl Copyright 2018-2020 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 Matteo Croce.
+
+AC_DEFUN_ONCE([gl_AF_ALG],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_REQUIRE([AC_C_INLINE])
+
+ dnl Check whether linux/if_alg.h has needed features.
+ AC_CACHE_CHECK([whether linux/if_alg.h has struct sockaddr_alg.],
+ [gl_cv_header_linux_if_alg_salg],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/socket.h>
+ #include <linux/if_alg.h>
+ struct sockaddr_alg salg = {
+ .salg_family = AF_ALG,
+ .salg_type = "hash",
+ .salg_name = "sha1",
+ };]])],
+ [gl_cv_header_linux_if_alg_salg=yes],
+ [gl_cv_header_linux_if_alg_salg=no])])
+ if test "$gl_cv_header_linux_if_alg_salg" = yes; then
+ AC_DEFINE([HAVE_LINUX_IF_ALG_H], [1],
+ [Define to 1 if you have 'struct sockaddr_alg' defined.])
+ fi
+
+ dnl The default is to not use AF_ALG if available,
+ dnl as it's system dependent as to whether the kernel
+ dnl routines are faster than libcrypto for example.
+ use_af_alg=no
+ AC_ARG_WITH([linux-crypto],
+ [AS_HELP_STRING([[--with-linux-crypto]],
+ [use Linux kernel cryptographic API (if available)])],
+ [use_af_alg=$withval],
+ [use_af_alg=no])
+ dnl We cannot use it if it is not available.
+ if test "$gl_cv_header_linux_if_alg_salg" != yes; then
+ if test "$use_af_alg" != no; then
+ AC_MSG_WARN([Linux kernel cryptographic API not found])
+ fi
+ use_af_alg=no
+ fi
+
+ if test "$use_af_alg" != no; then
+ USE_AF_ALG=1
+ else
+ USE_AF_ALG=0
+ fi
+ AC_DEFINE_UNQUOTED([USE_LINUX_CRYPTO_API], [$USE_AF_ALG],
+ [Define to 1 if you want to use the Linux kernel cryptographic API.])
+])
diff --git a/m4/alloca.m4 b/m4/alloca.m4
new file mode 100644
index 0000000..e3c377c
--- /dev/null
+++ b/m4/alloca.m4
@@ -0,0 +1,108 @@
+# alloca.m4 serial 20
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_ALLOCA],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ if test $ac_cv_func_alloca_works = no; then
+ gl_PREREQ_ALLOCA
+ fi
+
+ # Define an additional variable used in the Makefile substitution.
+ if test $ac_cv_working_alloca_h = yes; then
+ AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
+ AC_EGREP_CPP([Need own alloca], [
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+ Need own alloca
+#endif
+ ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
+ ])
+ if test $gl_cv_rpl_alloca = yes; then
+ dnl OK, alloca can be implemented through a compiler built-in.
+ AC_DEFINE([HAVE_ALLOCA], [1],
+ [Define to 1 if you have 'alloca' after including <alloca.h>,
+ a header that may be supplied by this distribution.])
+ ALLOCA_H=alloca.h
+ else
+ dnl alloca exists as a library function, i.e. it is slow and probably
+ dnl a memory leak. Don't define HAVE_ALLOCA in this case.
+ ALLOCA_H=
+ fi
+ else
+ ALLOCA_H=alloca.h
+ fi
+ AC_SUBST([ALLOCA_H])
+ AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"])
+
+ if test $ac_cv_working_alloca_h = yes; then
+ HAVE_ALLOCA_H=1
+ else
+ HAVE_ALLOCA_H=0
+ fi
+ AC_SUBST([HAVE_ALLOCA_H])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
+
+m4_version_prereq([2.70], [], [
+
+# This works around a bug in autoconf <= 2.68 and has simplifications
+# from 2.70. See:
+# https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=15edf7fd8094fd14a89d9891dd72a9624762597a
+
+# _AC_LIBOBJ_ALLOCA
+# -----------------
+# Set up the LIBOBJ replacement of 'alloca'. Well, not exactly
+# AC_LIBOBJ since we actually set the output variable 'ALLOCA'.
+# Nevertheless, for Automake, AC_LIBSOURCES it.
+m4_define([_AC_LIBOBJ_ALLOCA],
+[# The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble. Some versions do not even contain alloca or
+# contain a buggy version. If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+AC_LIBSOURCES(alloca.c)
+AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
+AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
+
+AC_CACHE_CHECK([stack direction for C alloca],
+ [ac_cv_c_stack_direction],
+[AC_RUN_IFELSE([AC_LANG_SOURCE(
+[AC_INCLUDES_DEFAULT
+int
+find_stack_direction (int *addr, int depth)
+{
+ int dir, dummy = 0;
+ if (! addr)
+ addr = &dummy;
+ *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+ dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+ return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+ return find_stack_direction (0, argc + !argv + 20) < 0;
+}])],
+ [ac_cv_c_stack_direction=1],
+ [ac_cv_c_stack_direction=-1],
+ [ac_cv_c_stack_direction=0])])
+AH_VERBATIM([STACK_DIRECTION],
+[/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION])dnl
+AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
+])# _AC_LIBOBJ_ALLOCA
+])
diff --git a/m4/arpa_inet_h.m4 b/m4/arpa_inet_h.m4
new file mode 100644
index 0000000..b394494
--- /dev/null
+++ b/m4/arpa_inet_h.m4
@@ -0,0 +1,59 @@
+# arpa_inet_h.m4 serial 14
+dnl Copyright (C) 2006, 2008-2020 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 Written by Simon Josefsson and Bruno Haible
+
+AC_DEFUN([gl_HEADER_ARPA_INET],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS])
+
+ AC_CHECK_HEADERS_ONCE([arpa/inet.h])
+ if test $ac_cv_header_arpa_inet_h = yes; then
+ HAVE_ARPA_INET_H=1
+ else
+ HAVE_ARPA_INET_H=0
+ fi
+ AC_SUBST([HAVE_ARPA_INET_H])
+ dnl <arpa/inet.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([arpa/inet.h])
+
+ AC_REQUIRE([gl_FEATURES_H])
+
+ gl_PREREQ_SYS_H_WS2TCPIP
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* On some systems, this header is not self-consistent. */
+#if !(defined __GLIBC__ || defined __UCLIBC__)
+# include <sys/socket.h>
+#endif
+#ifdef __TANDEM
+# include <netdb.h>
+#endif
+#include <arpa/inet.h>
+ ]], [inet_ntop inet_pton])
+])
+
+AC_DEFUN([gl_ARPA_INET_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_ARPA_INET_H_DEFAULTS],
+[
+ GNULIB_INET_NTOP=0; AC_SUBST([GNULIB_INET_NTOP])
+ GNULIB_INET_PTON=0; AC_SUBST([GNULIB_INET_PTON])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_INET_NTOP=1; AC_SUBST([HAVE_DECL_INET_NTOP])
+ HAVE_DECL_INET_PTON=1; AC_SUBST([HAVE_DECL_INET_PTON])
+ REPLACE_INET_NTOP=0; AC_SUBST([REPLACE_INET_NTOP])
+ REPLACE_INET_PTON=0; AC_SUBST([REPLACE_INET_PTON])
+])
diff --git a/m4/asm-underscore.m4 b/m4/asm-underscore.m4
new file mode 100644
index 0000000..6446e71
--- /dev/null
+++ b/m4/asm-underscore.m4
@@ -0,0 +1,83 @@
+# asm-underscore.m4 serial 5
+dnl Copyright (C) 2010-2020 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. Based on as-underscore.m4 in GNU clisp.
+
+# gl_ASM_SYMBOL_PREFIX
+# Tests for the prefix of C symbols at the assembly language level and the
+# linker level. This prefix is either an underscore or empty. Defines the
+# C macro USER_LABEL_PREFIX to this prefix, and sets ASM_SYMBOL_PREFIX to
+# a stringified variant of this prefix.
+
+AC_DEFUN([gl_ASM_SYMBOL_PREFIX],
+[
+ AC_REQUIRE([AC_PROG_EGREP])
+ dnl We don't use GCC's __USER_LABEL_PREFIX__ here, because
+ dnl 1. It works only for GCC.
+ dnl 2. It is incorrectly defined on some platforms, in some GCC versions.
+ AC_REQUIRE([gl_C_ASM])
+ AC_CACHE_CHECK(
+ [whether C symbols are prefixed with underscore at the linker level],
+ [gl_cv_prog_as_underscore],
+ [cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" int foo (void);
+#endif
+int foo(void) { return 0; }
+EOF
+ # Look for the assembly language name in the .s file.
+ AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
+ if LC_ALL=C $EGREP '(^|[[^a-zA-Z0-9_]])_foo([[^a-zA-Z0-9_]]|$)' conftest.$gl_asmext >/dev/null; then
+ gl_cv_prog_as_underscore=yes
+ else
+ gl_cv_prog_as_underscore=no
+ fi
+ rm -f conftest*
+ ])
+ if test $gl_cv_prog_as_underscore = yes; then
+ USER_LABEL_PREFIX=_
+ else
+ USER_LABEL_PREFIX=
+ fi
+ AC_DEFINE_UNQUOTED([USER_LABEL_PREFIX], [$USER_LABEL_PREFIX],
+ [Define to the prefix of C symbols at the assembler and linker level,
+ either an underscore or empty.])
+ ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'
+ AC_SUBST([ASM_SYMBOL_PREFIX])
+])
+
+# gl_C_ASM
+# Determines how to produce an assembly language file from C source code.
+# Sets the variables:
+# gl_asmext - the extension of assembly language output,
+# gl_c_asm_opt - the C compiler option that produces assembly language output.
+
+AC_DEFUN([gl_C_ASM],
+[
+ AC_EGREP_CPP([MicrosoftCompiler],
+ [
+#ifdef _MSC_VER
+MicrosoftCompiler
+#endif
+ ],
+ [dnl Microsoft's 'cl' and 'clang-cl' produce an .asm file, whereas 'clang'
+ dnl produces a .s file. Need to distinguish 'clang' and 'clang-cl'.
+ rm -f conftest*
+ echo 'int dummy;' > conftest.c
+ AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c) >/dev/null 2>&1
+ if test -f conftest.o; then
+ gl_asmext='s'
+ gl_c_asm_opt='-S'
+ else
+ gl_asmext='asm'
+ gl_c_asm_opt='-c -Fa'
+ fi
+ rm -f conftest*
+ ],
+ [gl_asmext='s'
+ gl_c_asm_opt='-S'
+ ])
+])
diff --git a/m4/base32.m4 b/m4/base32.m4
new file mode 100644
index 0000000..2d07d44
--- /dev/null
+++ b/m4/base32.m4
@@ -0,0 +1,15 @@
+# base32.m4 serial 4
+dnl Copyright (C) 2004, 2006, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_BASE32],
+[
+ gl_PREREQ_BASE32
+])
+
+# Prerequisites of lib/base32.c.
+AC_DEFUN([gl_PREREQ_BASE32], [
+ AC_REQUIRE([AC_C_RESTRICT])
+])
diff --git a/m4/btowc.m4 b/m4/btowc.m4
new file mode 100644
index 0000000..ec19ea0
--- /dev/null
+++ b/m4/btowc.m4
@@ -0,0 +1,105 @@
+# btowc.m4 serial 12
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_BTOWC],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ dnl Check whether <wchar.h> is usable at all, first. Otherwise the test
+ dnl program below may lead to an endless loop. See
+ dnl <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>.
+ AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
+
+ AC_CHECK_FUNCS_ONCE([btowc])
+ if test $ac_cv_func_btowc = no; then
+ HAVE_BTOWC=0
+ else
+
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Cygwin 1.7.2 btowc('\0') is WEOF, not 0.
+ AC_CACHE_CHECK([whether btowc(0) is correct],
+ [gl_cv_func_btowc_nul],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <wchar.h>
+int main ()
+{
+ if (btowc ('\0') != 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_btowc_nul=yes],
+ [gl_cv_func_btowc_nul=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Cygwin.
+ cygwin*) gl_cv_func_btowc_nul="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_btowc_nul="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_btowc_nul="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+
+ dnl IRIX 6.5 btowc(EOF) is 0xFF, not WEOF.
+ AC_CACHE_CHECK([whether btowc(EOF) is correct],
+ [gl_cv_func_btowc_eof],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on IRIX.
+ irix*) gl_cv_func_btowc_eof="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_btowc_eof="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_btowc_eof="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdio.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (btowc (EOF) != WEOF)
+ return 1;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_btowc_eof=yes],
+ [gl_cv_func_btowc_eof=no],
+ [:])
+ fi
+ ])
+
+ case "$gl_cv_func_btowc_nul" in
+ *yes) ;;
+ *) REPLACE_BTOWC=1 ;;
+ esac
+ case "$gl_cv_func_btowc_eof" in
+ *yes) ;;
+ *) REPLACE_BTOWC=1 ;;
+ esac
+ fi
+])
+
+# Prerequisites of lib/btowc.c.
+AC_DEFUN([gl_PREREQ_BTOWC], [
+ :
+])
diff --git a/m4/builtin-expect.m4 b/m4/builtin-expect.m4
new file mode 100644
index 0000000..a6e8895
--- /dev/null
+++ b/m4/builtin-expect.m4
@@ -0,0 +1,49 @@
+dnl Check for __builtin_expect.
+
+dnl Copyright 2016-2020 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 Written by Paul Eggert.
+
+AC_DEFUN([gl___BUILTIN_EXPECT],
+[
+ AC_CACHE_CHECK([for __builtin_expect],
+ [gl_cv___builtin_expect],
+ [AC_LINK_IFELSE(
+ [AC_LANG_SOURCE([[
+ int
+ main (int argc, char **argv)
+ {
+ argc = __builtin_expect (argc, 100);
+ return argv[argc != 100][0];
+ }]])],
+ [gl_cv___builtin_expect=yes],
+ [AC_LINK_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <builtins.h>
+ int
+ main (int argc, char **argv)
+ {
+ argc = __builtin_expect (argc, 100);
+ return argv[argc != 100][0];
+ }]])],
+ [gl_cv___builtin_expect="in <builtins.h>"],
+ [gl_cv___builtin_expect=no])])])
+ if test "$gl_cv___builtin_expect" = yes; then
+ AC_DEFINE([HAVE___BUILTIN_EXPECT], [1])
+ elif test "$gl_cv___builtin_expect" = "in <builtins.h>"; then
+ AC_DEFINE([HAVE___BUILTIN_EXPECT], [2])
+ fi
+ AH_VERBATIM([HAVE___BUILTIN_EXPECT],
+ [/* Define to 1 if the compiler supports __builtin_expect,
+ and to 2 if <builtins.h> does. */
+#undef HAVE___BUILTIN_EXPECT
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+ ])
+])
diff --git a/m4/byteswap.m4 b/m4/byteswap.m4
new file mode 100644
index 0000000..0f43994
--- /dev/null
+++ b/m4/byteswap.m4
@@ -0,0 +1,19 @@
+# byteswap.m4 serial 4
+dnl Copyright (C) 2005, 2007, 2009-2020 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 Written by Oskar Liljeblad.
+
+AC_DEFUN([gl_BYTESWAP],
+[
+ dnl Prerequisites of lib/byteswap.in.h.
+ AC_CHECK_HEADERS([byteswap.h], [
+ BYTESWAP_H=''
+ ], [
+ BYTESWAP_H='byteswap.h'
+ ])
+ AC_SUBST([BYTESWAP_H])
+ AM_CONDITIONAL([GL_GENERATE_BYTESWAP_H], [test -n "$BYTESWAP_H"])
+])
diff --git a/m4/canonicalize.m4 b/m4/canonicalize.m4
new file mode 100644
index 0000000..404db4c
--- /dev/null
+++ b/m4/canonicalize.m4
@@ -0,0 +1,145 @@
+# canonicalize.m4 serial 35
+
+dnl Copyright (C) 2003-2007, 2009-2020 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.
+
+# Provides canonicalize_file_name and canonicalize_filename_mode, but does
+# not provide or fix realpath.
+AC_DEFUN([gl_FUNC_CANONICALIZE_FILENAME_MODE],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+ AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ HAVE_CANONICALIZE_FILE_NAME=0
+ else
+ case "$gl_cv_func_realpath_works" in
+ *yes) ;;
+ *) REPLACE_CANONICALIZE_FILE_NAME=1 ;;
+ esac
+ fi
+])
+
+# Provides canonicalize_file_name and realpath.
+AC_DEFUN([gl_CANONICALIZE_LGPL],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([gl_CANONICALIZE_LGPL_SEPARATE])
+ if test $ac_cv_func_canonicalize_file_name = no; then
+ HAVE_CANONICALIZE_FILE_NAME=0
+ if test $ac_cv_func_realpath = no; then
+ HAVE_REALPATH=0
+ else
+ case "$gl_cv_func_realpath_works" in
+ *yes) ;;
+ *) REPLACE_REALPATH=1 ;;
+ esac
+ fi
+ else
+ case "$gl_cv_func_realpath_works" in
+ *yes)
+ ;;
+ *)
+ REPLACE_CANONICALIZE_FILE_NAME=1
+ REPLACE_REALPATH=1
+ ;;
+ esac
+ fi
+])
+
+# Like gl_CANONICALIZE_LGPL, except prepare for separate compilation
+# (no REPLACE_CANONICALIZE_FILE_NAME, no REPLACE_REALPATH, no AC_LIBOBJ).
+AC_DEFUN([gl_CANONICALIZE_LGPL_SEPARATE],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ AC_CHECK_FUNCS_ONCE([canonicalize_file_name faccessat])
+
+ dnl On native Windows, we use _getcwd(), regardless whether getcwd() is
+ dnl available through the linker option '-loldnames'.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*) ;;
+ *) AC_CHECK_FUNCS([getcwd]) ;;
+ esac
+
+ AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+ AC_REQUIRE([gl_FUNC_REALPATH_WORKS])
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+])
+
+# Check whether realpath works. Assume that if a platform has both
+# realpath and canonicalize_file_name, but the former is broken, then
+# so is the latter.
+AC_DEFUN([gl_FUNC_REALPATH_WORKS],
+[
+ AC_CHECK_FUNCS_ONCE([realpath])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether realpath works], [gl_cv_func_realpath_works], [
+ rm -rf conftest.a conftest.d
+ touch conftest.a
+ mkdir conftest.d
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+ ]GL_NOCRASH[
+ #include <stdlib.h>
+ #include <string.h>
+ ]], [[
+ int result = 0;
+ {
+ char *name = realpath ("conftest.a", NULL);
+ if (!(name && *name == '/'))
+ result |= 1;
+ free (name);
+ }
+ {
+ char *name = realpath ("conftest.b/../conftest.a", NULL);
+ if (name != NULL)
+ result |= 2;
+ free (name);
+ }
+ {
+ char *name = realpath ("conftest.a/", NULL);
+ if (name != NULL)
+ result |= 4;
+ free (name);
+ }
+ {
+ char *name1 = realpath (".", NULL);
+ char *name2 = realpath ("conftest.d//./..", NULL);
+ if (! name1 || ! name2 || strcmp (name1, name2))
+ result |= 8;
+ free (name1);
+ free (name2);
+ }
+ return result;
+ ]])
+ ],
+ [gl_cv_func_realpath_works=yes],
+ [gl_cv_func_realpath_works=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_realpath_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_realpath_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_realpath_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_realpath_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -rf conftest.a conftest.d
+ ])
+ case "$gl_cv_func_realpath_works" in
+ *yes)
+ AC_DEFINE([FUNC_REALPATH_WORKS], [1], [Define to 1 if realpath()
+ can malloc memory, always gives an absolute path, and handles
+ trailing slash correctly.])
+ ;;
+ esac
+])
diff --git a/m4/chdir-long.m4 b/m4/chdir-long.m4
new file mode 100644
index 0000000..a6e67b5
--- /dev/null
+++ b/m4/chdir-long.m4
@@ -0,0 +1,30 @@
+#serial 17
+
+# Use Gnulib's robust chdir function.
+# It can handle arbitrarily long directory names, which means
+# that when it is given the name of an existing directory, it
+# never fails with ENAMETOOLONG.
+# Arrange to compile chdir-long.c only on systems that define PATH_MAX.
+
+dnl Copyright (C) 2004-2007, 2009-2020 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.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_CHDIR_LONG],
+[
+ AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+ AC_CACHE_CHECK([whether this system supports file names of any length],
+ [gl_cv_have_unlimited_file_name_length],
+ [AC_EGREP_CPP([have_arbitrary_file_name_length_limit],
+ gl_PATHMAX_SNIPPET[
+#ifdef PATH_MAX
+have_arbitrary_file_name_length_limit
+#endif],
+ [gl_cv_have_unlimited_file_name_length=no],
+ [gl_cv_have_unlimited_file_name_length=yes])])
+])
+
+AC_DEFUN([gl_PREREQ_CHDIR_LONG], [:])
diff --git a/m4/clock_time.m4 b/m4/clock_time.m4
new file mode 100644
index 0000000..f4f51fa
--- /dev/null
+++ b/m4/clock_time.m4
@@ -0,0 +1,31 @@
+# clock_time.m4 serial 10
+dnl Copyright (C) 2002-2006, 2009-2020 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.
+
+# Check for clock_gettime and clock_settime, and set LIB_CLOCK_GETTIME.
+# For a program named, say foo, you should add a line like the following
+# in the corresponding Makefile.am file:
+# foo_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)
+
+AC_DEFUN([gl_CLOCK_TIME],
+[
+ dnl Persuade glibc and Solaris <time.h> to declare these functions.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+
+ # Save and restore LIBS so e.g., -lrt, isn't added to it. Otherwise, *all*
+ # programs in the package would end up linked with that potentially-shared
+ # library, inducing unnecessary run-time overhead.
+ LIB_CLOCK_GETTIME=
+ AC_SUBST([LIB_CLOCK_GETTIME])
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([clock_gettime], [rt posix4],
+ [test "$ac_cv_search_clock_gettime" = "none required" ||
+ LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
+ AC_CHECK_FUNCS([clock_gettime clock_settime])
+ LIBS=$gl_saved_libs
+])
diff --git a/m4/close.m4 b/m4/close.m4
new file mode 100644
index 0000000..378ec4c
--- /dev/null
+++ b/m4/close.m4
@@ -0,0 +1,35 @@
+# close.m4 serial 9
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_CLOSE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ m4_ifdef([gl_MSVC_INVAL], [
+ AC_REQUIRE([gl_MSVC_INVAL])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_CLOSE=1
+ fi
+ ])
+ m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [
+ gl_PREREQ_SYS_H_WINSOCK2
+ if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+ dnl Even if the 'socket' module is not used here, another part of the
+ dnl application may use it and pass file descriptors that refer to
+ dnl sockets to the close() function. So enable the support for sockets.
+ REPLACE_CLOSE=1
+ fi
+ ])
+ dnl Replace close() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ if test $REPLACE_CLOSE = 0; then
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_CLOSE=1
+ fi
+ fi
+ ])
+])
diff --git a/m4/closedir.m4 b/m4/closedir.m4
new file mode 100644
index 0000000..66f6d4e
--- /dev/null
+++ b/m4/closedir.m4
@@ -0,0 +1,31 @@
+# closedir.m4 serial 6
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_CLOSEDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_CHECK_FUNCS([closedir])
+ if test $ac_cv_func_closedir = no; then
+ HAVE_CLOSEDIR=0
+ fi
+ dnl Replace closedir() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ if test $HAVE_CLOSEDIR = 1; then
+ REPLACE_CLOSEDIR=1
+ fi
+ fi
+ ])
+ dnl Replace closedir() for supporting the gnulib-defined dirfd() function.
+ case $host_os,$HAVE_CLOSEDIR in
+ os2*,1)
+ REPLACE_CLOSEDIR=1;;
+ esac
+])
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644
index 0000000..9b019cf
--- /dev/null
+++ b/m4/codeset.m4
@@ -0,0 +1,24 @@
+# codeset.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2006, 2008-2014, 2016, 2019-2020 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <langinfo.h>]],
+ [[char* cs = nl_langinfo(CODESET); return !cs;]])],
+ [am_cv_langinfo_codeset=yes],
+ [am_cv_langinfo_codeset=no])
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
diff --git a/m4/ctype.m4 b/m4/ctype.m4
new file mode 100644
index 0000000..0b123d5
--- /dev/null
+++ b/m4/ctype.m4
@@ -0,0 +1,32 @@
+# ctype_h.m4 serial 6
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_CTYPE_H],
+[
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+
+ dnl <ctype.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_NEXT_HEADERS([ctype.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <ctype.h>
+ ]], [isblank])
+])
+
+AC_DEFUN([gl_CTYPE_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_CTYPE_H_DEFAULTS],
+[
+ GNULIB_ISBLANK=0; AC_SUBST([GNULIB_ISBLANK])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ISBLANK=1; AC_SUBST([HAVE_ISBLANK])
+])
diff --git a/m4/d-ino.m4 b/m4/d-ino.m4
new file mode 100644
index 0000000..64ce9ce
--- /dev/null
+++ b/m4/d-ino.m4
@@ -0,0 +1,60 @@
+# serial 20
+
+dnl From Jim Meyering.
+dnl
+dnl Check whether struct dirent has a member named d_ino.
+dnl
+
+# Copyright (C) 1997, 1999-2001, 2003-2004, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO],
+ [AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([for d_ino member in directory struct],
+ [gl_cv_struct_dirent_d_ino],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/stat.h>
+ #include <dirent.h>
+ ]],
+ [[DIR *dp = opendir (".");
+ struct dirent *e;
+ struct stat st;
+ if (! dp)
+ return 1;
+ e = readdir (dp);
+ if (! e)
+ { closedir (dp); return 2; }
+ if (lstat (e->d_name, &st) != 0)
+ { closedir (dp); return 3; }
+ if (e->d_ino != st.st_ino)
+ { closedir (dp); return 4; }
+ closedir (dp);
+ return 0;
+ ]])],
+ [gl_cv_struct_dirent_d_ino=yes],
+ [gl_cv_struct_dirent_d_ino=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems with Linux kernel.
+ linux*-gnu*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+ # Guess yes on musl systems with Linux kernel.
+ linux*-musl*) gl_cv_struct_dirent_d_ino="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_struct_dirent_d_ino="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_struct_dirent_d_ino="$gl_cross_guess_normal" ;;
+ esac
+ ])])
+ case "$gl_cv_struct_dirent_d_ino" in
+ *yes)
+ AC_DEFINE([D_INO_IN_DIRENT], [1],
+ [Define if struct dirent has a member d_ino that actually works.])
+ ;;
+ esac
+ ]
+)
diff --git a/m4/dirent_h.m4 b/m4/dirent_h.m4
new file mode 100644
index 0000000..8bef6a0
--- /dev/null
+++ b/m4/dirent_h.m4
@@ -0,0 +1,64 @@
+# dirent_h.m4 serial 16
+dnl Copyright (C) 2008-2020 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 Written by Bruno Haible.
+
+AC_DEFUN([gl_DIRENT_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ dnl <dirent.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([dirent.h])
+ if test $ac_cv_header_dirent_h = yes; then
+ HAVE_DIRENT_H=1
+ else
+ HAVE_DIRENT_H=0
+ fi
+ AC_SUBST([HAVE_DIRENT_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <dirent.h>
+ ]], [alphasort closedir dirfd fdopendir opendir readdir rewinddir scandir])
+])
+
+AC_DEFUN([gl_DIRENT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_DIRENT_H_DEFAULTS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
+ GNULIB_OPENDIR=0; AC_SUBST([GNULIB_OPENDIR])
+ GNULIB_READDIR=0; AC_SUBST([GNULIB_READDIR])
+ GNULIB_REWINDDIR=0; AC_SUBST([GNULIB_REWINDDIR])
+ GNULIB_CLOSEDIR=0; AC_SUBST([GNULIB_CLOSEDIR])
+ GNULIB_DIRFD=0; AC_SUBST([GNULIB_DIRFD])
+ GNULIB_FDOPENDIR=0; AC_SUBST([GNULIB_FDOPENDIR])
+ GNULIB_SCANDIR=0; AC_SUBST([GNULIB_SCANDIR])
+ GNULIB_ALPHASORT=0; AC_SUBST([GNULIB_ALPHASORT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_OPENDIR=1; AC_SUBST([HAVE_OPENDIR])
+ HAVE_READDIR=1; AC_SUBST([HAVE_READDIR])
+ HAVE_REWINDDIR=1; AC_SUBST([HAVE_REWINDDIR])
+ HAVE_CLOSEDIR=1; AC_SUBST([HAVE_CLOSEDIR])
+ HAVE_DECL_DIRFD=1; AC_SUBST([HAVE_DECL_DIRFD])
+ HAVE_DECL_FDOPENDIR=1;AC_SUBST([HAVE_DECL_FDOPENDIR])
+ HAVE_FDOPENDIR=1; AC_SUBST([HAVE_FDOPENDIR])
+ HAVE_SCANDIR=1; AC_SUBST([HAVE_SCANDIR])
+ HAVE_ALPHASORT=1; AC_SUBST([HAVE_ALPHASORT])
+ REPLACE_OPENDIR=0; AC_SUBST([REPLACE_OPENDIR])
+ REPLACE_CLOSEDIR=0; AC_SUBST([REPLACE_CLOSEDIR])
+ REPLACE_DIRFD=0; AC_SUBST([REPLACE_DIRFD])
+ REPLACE_FDOPENDIR=0; AC_SUBST([REPLACE_FDOPENDIR])
+])
diff --git a/m4/dirfd.m4 b/m4/dirfd.m4
new file mode 100644
index 0000000..d92445e
--- /dev/null
+++ b/m4/dirfd.m4
@@ -0,0 +1,86 @@
+# serial 26 -*- Autoconf -*-
+
+dnl Find out how to get the file descriptor associated with an open DIR*.
+
+# Copyright (C) 2001-2006, 2008-2020 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.
+
+dnl From Jim Meyering
+
+AC_DEFUN([gl_FUNC_DIRFD],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <dirent.h> to declare dirfd().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS([dirfd])
+ AC_CHECK_DECLS([dirfd], , ,
+ [[#include <sys/types.h>
+ #include <dirent.h>]])
+ if test $ac_cv_have_decl_dirfd = no; then
+ HAVE_DECL_DIRFD=0
+ fi
+
+ AC_CACHE_CHECK([whether dirfd is a macro],
+ [gl_cv_func_dirfd_macro],
+ [AC_EGREP_CPP([dirent_header_defines_dirfd], [
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif],
+ [gl_cv_func_dirfd_macro=yes],
+ [gl_cv_func_dirfd_macro=no])])
+
+ # Use the replacement if we have no function or macro with that name,
+ # or if OS/2 kLIBC whose dirfd() does not work.
+ # Replace only if the system declares dirfd already.
+ case $ac_cv_func_dirfd,$gl_cv_func_dirfd_macro,$host_os,$ac_cv_have_decl_dirfd in
+ no,no,*,yes | *,*,os2*,yes)
+ REPLACE_DIRFD=1
+ AC_DEFINE([REPLACE_DIRFD], [1],
+ [Define to 1 if gnulib's dirfd() replacement is used.]);;
+ esac
+])
+
+dnl Prerequisites of lib/dirfd.c.
+AC_DEFUN([gl_PREREQ_DIRFD],
+[
+ AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*],
+ [gl_cv_sys_dir_fd_member_name],
+ [
+ dirfd_save_CFLAGS=$CFLAGS
+ for ac_expr in d_fd dd_fd; do
+
+ CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <dirent.h>]],
+ [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
+ [dir_fd_found=yes]
+ )
+ CFLAGS=$dirfd_save_CFLAGS
+ test "$dir_fd_found" = yes && break
+ done
+ test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+ gl_cv_sys_dir_fd_member_name=$ac_expr
+ ]
+ )
+ if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+ AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
+ [$gl_cv_sys_dir_fd_member_name],
+ [the name of the file descriptor member of DIR])
+ fi
+ AH_VERBATIM([DIR_TO_FD],
+ [#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+])
+])
diff --git a/m4/double-slash-root.m4 b/m4/double-slash-root.m4
new file mode 100644
index 0000000..c463ac4
--- /dev/null
+++ b/m4/double-slash-root.m4
@@ -0,0 +1,38 @@
+# double-slash-root.m4 serial 4 -*- Autoconf -*-
+dnl Copyright (C) 2006, 2008-2020 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.
+
+AC_DEFUN([gl_DOUBLE_SLASH_ROOT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root],
+ [ if test x"$cross_compiling" = xyes ; then
+ # When cross-compiling, there is no way to tell whether // is special
+ # short of a list of hosts. However, the only known hosts to date
+ # that have a distinct // are Apollo DomainOS (too old to port to),
+ # Cygwin, and z/OS. If anyone knows of another system for which // has
+ # special semantics and is distinct from /, please report it to
+ # <bug-gnulib@gnu.org>.
+ case $host in
+ *-cygwin | i370-ibm-openedition)
+ gl_cv_double_slash_root=yes ;;
+ *)
+ # Be optimistic and assume that / and // are the same when we
+ # don't know.
+ gl_cv_double_slash_root='unknown, assuming no' ;;
+ esac
+ else
+ set x `ls -di / // 2>/dev/null`
+ if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then
+ gl_cv_double_slash_root=no
+ else
+ gl_cv_double_slash_root=yes
+ fi
+ fi])
+ if test "$gl_cv_double_slash_root" = yes; then
+ AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1],
+ [Define to 1 if // is a file system root distinct from /.])
+ fi
+])
diff --git a/m4/dup.m4 b/m4/dup.m4
new file mode 100644
index 0000000..892de99
--- /dev/null
+++ b/m4/dup.m4
@@ -0,0 +1,54 @@
+# dup.m4 serial 7
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_DUP],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ m4_ifdef([gl_MSVC_INVAL], [
+ AC_REQUIRE([gl_MSVC_INVAL])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_DUP=1
+ fi
+ ])
+ dnl Replace dup() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_DUP=1
+ fi
+ ])
+ AC_CACHE_CHECK([whether dup works], [gl_cv_func_dup_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[#include <unistd.h>
+ #include <fcntl.h>
+ #include <errno.h>
+ ]GL_MDA_DEFINES],
+ [[/* On OS/2 kLIBC, dup does not work on a directory fd. */
+ int fd = open (".", O_RDONLY);
+ return fd < 0 ? 1 : dup (fd) < 0 ? 2 : 0;
+ ]])
+ ],
+ [gl_cv_func_dup_works=yes],
+ [gl_cv_func_dup_works=no],
+ [case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_dup_works="guessing no" ;;
+ *) gl_cv_func_dup_works="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_dup_works" in
+ *yes) ;;
+ *)
+ REPLACE_DUP=1
+ ;;
+ esac
+])
+
+# Prerequisites of lib/dup.c.
+AC_DEFUN([gl_PREREQ_DUP], [:])
diff --git a/m4/dup2.m4 b/m4/dup2.m4
new file mode 100644
index 0000000..a82798d
--- /dev/null
+++ b/m4/dup2.m4
@@ -0,0 +1,105 @@
+#serial 27
+dnl Copyright (C) 2002, 2005, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_DUP2],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
+ [AC_RUN_IFELSE([
+ AC_LANG_PROGRAM(
+ [[#include <errno.h>
+ #include <fcntl.h>
+ #include <limits.h>
+ #include <sys/resource.h>
+ #include <unistd.h>
+ ]GL_MDA_DEFINES[
+ #ifndef RLIM_SAVED_CUR
+ # define RLIM_SAVED_CUR RLIM_INFINITY
+ #endif
+ #ifndef RLIM_SAVED_MAX
+ # define RLIM_SAVED_MAX RLIM_INFINITY
+ #endif
+ ]],
+ [[int result = 0;
+ int bad_fd = INT_MAX;
+ struct rlimit rlim;
+ if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+ && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+ && rlim.rlim_cur != RLIM_INFINITY
+ && rlim.rlim_cur != RLIM_SAVED_MAX
+ && rlim.rlim_cur != RLIM_SAVED_CUR)
+ bad_fd = rlim.rlim_cur;
+ #ifdef FD_CLOEXEC
+ if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+ result |= 1;
+ #endif
+ if (dup2 (1, 1) != 1)
+ result |= 2;
+ #ifdef FD_CLOEXEC
+ if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+ result |= 4;
+ #endif
+ close (0);
+ if (dup2 (0, 0) != -1)
+ result |= 8;
+ /* Many gnulib modules require POSIX conformance of EBADF. */
+ if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+ result |= 16;
+ /* Flush out some cygwin core dumps. */
+ if (dup2 (2, -1) != -1 || errno != EBADF)
+ result |= 32;
+ dup2 (2, 255);
+ dup2 (2, 256);
+ /* On OS/2 kLIBC, dup2() does not work on a directory fd. */
+ {
+ int fd = open (".", O_RDONLY);
+ if (fd == -1)
+ result |= 64;
+ else if (dup2 (fd, fd + 1) == -1)
+ result |= 128;
+ close (fd);
+ }
+ return result;]])
+ ],
+ [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
+ [case "$host_os" in
+ mingw*) # on this platform, dup2 always returns 0 for success
+ gl_cv_func_dup2_works="guessing no" ;;
+ cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+ gl_cv_func_dup2_works="guessing no" ;;
+ aix* | freebsd*)
+ # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+ # not EBADF.
+ gl_cv_func_dup2_works="guessing no" ;;
+ haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+ gl_cv_func_dup2_works="guessing no" ;;
+ *-android*) # implemented using dup3(), which fails if oldfd == newfd
+ gl_cv_func_dup2_works="guessing no" ;;
+ os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+ gl_cv_func_dup2_works="guessing no" ;;
+ *) gl_cv_func_dup2_works="guessing yes" ;;
+ esac])
+ ])
+ case "$gl_cv_func_dup2_works" in
+ *yes) ;;
+ *)
+ REPLACE_DUP2=1
+ AC_CHECK_FUNCS([setdtablesize])
+ ;;
+ esac
+ dnl Replace dup2() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_DUP2=1
+ fi
+ ])
+])
+
+# Prerequisites of lib/dup2.c.
+AC_DEFUN([gl_PREREQ_DUP2], [])
diff --git a/m4/eaccess.m4 b/m4/eaccess.m4
new file mode 100644
index 0000000..7eea8e9
--- /dev/null
+++ b/m4/eaccess.m4
@@ -0,0 +1,12 @@
+# eaccess.m4 serial 2
+dnl Copyright (C) 2003, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_EACCESS],
+[
+ AC_CHECK_FUNC([eaccess], ,
+ [AC_DEFINE([eaccess], [access],
+ [Define as 'access' if you don't have the eaccess() function.])])
+])
diff --git a/m4/eealloc.m4 b/m4/eealloc.m4
new file mode 100644
index 0000000..236f373
--- /dev/null
+++ b/m4/eealloc.m4
@@ -0,0 +1,31 @@
+# eealloc.m4 serial 3
+dnl Copyright (C) 2003, 2009-2020 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.
+
+AC_DEFUN([gl_EEALLOC],
+[
+ AC_REQUIRE([gl_EEMALLOC])
+ AC_REQUIRE([gl_EEREALLOC])
+])
+
+AC_DEFUN([gl_EEMALLOC],
+[
+ _AC_FUNC_MALLOC_IF(
+ [gl_cv_func_malloc_0_nonnull=1],
+ [gl_cv_func_malloc_0_nonnull=0])
+ AC_DEFINE_UNQUOTED([MALLOC_0_IS_NONNULL], [$gl_cv_func_malloc_0_nonnull],
+ [If malloc(0) is != NULL, define this to 1. Otherwise define this
+ to 0.])
+])
+
+AC_DEFUN([gl_EEREALLOC],
+[
+ _AC_FUNC_REALLOC_IF(
+ [gl_cv_func_realloc_0_nonnull=1],
+ [gl_cv_func_realloc_0_nonnull=0])
+ AC_DEFINE_UNQUOTED([REALLOC_0_IS_NONNULL], [$gl_cv_func_realloc_0_nonnull],
+ [If realloc(NULL,0) is != NULL, define this to 1. Otherwise define this
+ to 0.])
+])
diff --git a/m4/environ.m4 b/m4/environ.m4
new file mode 100644
index 0000000..bab85f1
--- /dev/null
+++ b/m4/environ.m4
@@ -0,0 +1,45 @@
+# environ.m4 serial 7
+dnl Copyright (C) 2001-2004, 2006-2020 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.
+
+AC_DEFUN_ONCE([gl_ENVIRON],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ dnl Persuade glibc <unistd.h> to declare environ.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ gt_CHECK_VAR_DECL(
+ [#if HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
+ /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */
+ #include <stdlib.h>
+ ],
+ [environ])
+ if test $gt_cv_var_environ_declaration != yes; then
+ HAVE_DECL_ENVIRON=0
+ fi
+])
+
+# Check if a variable is properly declared.
+# gt_CHECK_VAR_DECL(includes,variable)
+AC_DEFUN([gt_CHECK_VAR_DECL],
+[
+ define([gt_cv_var], [gt_cv_var_]$2[_declaration])
+ AC_CACHE_CHECK([if $2 is properly declared], [gt_cv_var],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[$1
+ extern struct { int foo; } $2;]],
+ [[$2.foo = 1;]])],
+ [gt_cv_var=no],
+ [gt_cv_var=yes])])
+ if test $gt_cv_var = yes; then
+ AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1,
+ [Define if you have the declaration of $2.])
+ fi
+ undefine([gt_cv_var])
+])
diff --git a/m4/errno_h.m4 b/m4/errno_h.m4
new file mode 100644
index 0000000..dd4994f
--- /dev/null
+++ b/m4/errno_h.m4
@@ -0,0 +1,133 @@
+# errno_h.m4 serial 13
+dnl Copyright (C) 2004, 2006, 2008-2020 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.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_HEADER_ERRNO_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [
+ AC_EGREP_CPP([booboo],[
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
+#endif
+ ],
+ [gl_cv_header_errno_h_complete=no],
+ [gl_cv_header_errno_h_complete=yes])
+ ])
+ if test $gl_cv_header_errno_h_complete = yes; then
+ ERRNO_H=''
+ else
+ gl_NEXT_HEADERS([errno.h])
+ ERRNO_H='errno.h'
+ fi
+ AC_SUBST([ERRNO_H])
+ AM_CONDITIONAL([GL_GENERATE_ERRNO_H], [test -n "$ERRNO_H"])
+ gl_REPLACE_ERRNO_VALUE([EMULTIHOP])
+ gl_REPLACE_ERRNO_VALUE([ENOLINK])
+ gl_REPLACE_ERRNO_VALUE([EOVERFLOW])
+])
+
+# Assuming $1 = EOVERFLOW.
+# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+# POSIX. But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and
+# some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+# Check for the value of EOVERFLOW.
+# Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE.
+AC_DEFUN([gl_REPLACE_ERRNO_VALUE],
+[
+ if test -n "$ERRNO_H"; then
+ AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [
+ AC_EGREP_CPP([yes],[
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ],
+ [gl_cv_header_errno_h_]$1[=yes],
+ [gl_cv_header_errno_h_]$1[=no])
+ if test $gl_cv_header_errno_h_]$1[ = no; then
+ AC_EGREP_CPP([yes],[
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+ ], [gl_cv_header_errno_h_]$1[=hidden])
+ if test $gl_cv_header_errno_h_]$1[ = hidden; then
+ dnl The macro exists but is hidden.
+ dnl Define it to the same value.
+ AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug. */
+#include <stdio.h>
+#include <stdlib.h>
+])
+ fi
+ fi
+ ])
+ case $gl_cv_header_errno_h_]$1[ in
+ yes | no)
+ ]$1[_HIDDEN=0; ]$1[_VALUE=
+ ;;
+ *)
+ ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1["
+ ;;
+ esac
+ AC_SUBST($1[_HIDDEN])
+ AC_SUBST($1[_VALUE])
+ fi
+])
diff --git a/m4/error.m4 b/m4/error.m4
new file mode 100644
index 0000000..60c229d
--- /dev/null
+++ b/m4/error.m4
@@ -0,0 +1,27 @@
+#serial 14
+
+# Copyright (C) 1996-1998, 2001-2004, 2009-2020 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.
+
+AC_DEFUN([gl_ERROR],
+[
+ dnl We don't use AC_FUNC_ERROR_AT_LINE any more, because it is no longer
+ dnl maintained in Autoconf and because it invokes AC_LIBOBJ.
+ AC_CACHE_CHECK([for error_at_line], [ac_cv_lib_error_at_line],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <error.h>]],
+ [[error_at_line (0, 0, "", 0, "an error occurred");]])],
+ [ac_cv_lib_error_at_line=yes],
+ [ac_cv_lib_error_at_line=no])])
+])
+
+# Prerequisites of lib/error.c.
+AC_DEFUN([gl_PREREQ_ERROR],
+[
+ AC_REQUIRE([AC_FUNC_STRERROR_R])
+ :
+])
diff --git a/m4/exponentd.m4 b/m4/exponentd.m4
new file mode 100644
index 0000000..cca8797
--- /dev/null
+++ b/m4/exponentd.m4
@@ -0,0 +1,116 @@
+# exponentd.m4 serial 3
+dnl Copyright (C) 2007-2008, 2010-2020 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.
+AC_DEFUN([gl_DOUBLE_EXPONENT_LOCATION],
+[
+ AC_CACHE_CHECK([where to find the exponent in a 'double'],
+ [gl_cv_cc_double_expbit0],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <float.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#define NWORDS \
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
+typedef union { double value; unsigned int word[NWORDS]; } memory_double;
+static unsigned int ored_words[NWORDS];
+static unsigned int anded_words[NWORDS];
+static void add_to_ored_words (double x)
+{
+ memory_double m;
+ size_t i;
+ /* Clear it first, in case sizeof (double) < sizeof (memory_double). */
+ memset (&m, 0, sizeof (memory_double));
+ m.value = x;
+ for (i = 0; i < NWORDS; i++)
+ {
+ ored_words[i] |= m.word[i];
+ anded_words[i] &= m.word[i];
+ }
+}
+int main ()
+{
+ size_t j;
+ FILE *fp = fopen ("conftest.out", "w");
+ if (fp == NULL)
+ return 1;
+ for (j = 0; j < NWORDS; j++)
+ anded_words[j] = ~ (unsigned int) 0;
+ add_to_ored_words (0.25);
+ add_to_ored_words (0.5);
+ add_to_ored_words (1.0);
+ add_to_ored_words (2.0);
+ add_to_ored_words (4.0);
+ /* Remove bits that are common (e.g. if representation of the first mantissa
+ bit is explicit). */
+ for (j = 0; j < NWORDS; j++)
+ ored_words[j] &= ~anded_words[j];
+ /* Now find the nonzero word. */
+ for (j = 0; j < NWORDS; j++)
+ if (ored_words[j] != 0)
+ break;
+ if (j < NWORDS)
+ {
+ size_t i;
+ for (i = j + 1; i < NWORDS; i++)
+ if (ored_words[i] != 0)
+ {
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+ }
+ for (i = 0; ; i++)
+ if ((ored_words[j] >> i) & 1)
+ {
+ fprintf (fp, "word %d bit %d", (int) j, (int) i);
+ return (fclose (fp) != 0);
+ }
+ }
+ fprintf (fp, "unknown");
+ return (fclose (fp) != 0);
+}
+ ]])],
+ [gl_cv_cc_double_expbit0=`cat conftest.out`],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ dnl On ARM, there are two 'double' floating-point formats, used by
+ dnl different sets of instructions: The older FPA instructions assume
+ dnl that they are stored in big-endian word order, while the words
+ dnl (like integer types) are stored in little-endian byte order.
+ dnl The newer VFP instructions assume little-endian order
+ dnl consistently.
+ AC_EGREP_CPP([mixed_endianness], [
+#if defined arm || defined __arm || defined __arm__
+ mixed_endianness
+#endif
+ ],
+ [gl_cv_cc_double_expbit0="unknown"],
+ [
+ pushdef([AC_MSG_CHECKING],[:])dnl
+ pushdef([AC_MSG_RESULT],[:])dnl
+ pushdef([AC_MSG_RESULT_UNQUOTED],[:])dnl
+ AC_C_BIGENDIAN(
+ [gl_cv_cc_double_expbit0="word 0 bit 20"],
+ [gl_cv_cc_double_expbit0="word 1 bit 20"],
+ [gl_cv_cc_double_expbit0="unknown"])
+ popdef([AC_MSG_RESULT_UNQUOTED])dnl
+ popdef([AC_MSG_RESULT])dnl
+ popdef([AC_MSG_CHECKING])dnl
+ ])
+ ])
+ rm -f conftest.out
+ ])
+ case "$gl_cv_cc_double_expbit0" in
+ word*bit*)
+ word=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word //' -e 's/ bit.*//'`
+ bit=`echo "$gl_cv_cc_double_expbit0" | sed -e 's/word.*bit //'`
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_WORD], [$word],
+ [Define as the word index where to find the exponent of 'double'.])
+ AC_DEFINE_UNQUOTED([DBL_EXPBIT0_BIT], [$bit],
+ [Define as the bit index in the word where to find bit 0 of the exponent of 'double'.])
+ ;;
+ esac
+])
diff --git a/m4/extensions.m4 b/m4/extensions.m4
new file mode 100644
index 0000000..44be1d1
--- /dev/null
+++ b/m4/extensions.m4
@@ -0,0 +1,215 @@
+# serial 21 -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006-2020 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.
+
+dnl Define to empty for the benefit of Autoconf 2.69 and earlier, so that
+dnl AC_USE_SYSTEM_EXTENSIONS (below) can be used unchanged from Autoconf 2.70+.
+m4_ifndef([AC_CHECK_INCLUDES_DEFAULT],
+ [AC_DEFUN([AC_CHECK_INCLUDES_DEFAULT], [])])
+
+# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
+# Autoconf. Perhaps we can remove this once we can assume Autoconf
+# is recent-enough everywhere, but since Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# If autoconf reports a warning
+# warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# or warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# the fix is
+# 1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
+# but always AC_REQUIREd,
+# 2) to ensure that for each occurrence of
+# AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+# or
+# AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+# the corresponding gnulib module description has 'extensions' among
+# its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
+# invocation occurs in gl_EARLY, not in gl_INIT.
+
+m4_version_prereq([2.70.1], [], [
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+# We unconditionally define as many of the known feature-enabling
+# as possible, reserving conditional behavior for macros that are
+# known to cause problems on some platforms (such as __EXTENSIONS__).
+AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
+[AC_BEFORE([$0], [AC_PREPROC_IFELSE])dnl
+AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_LINK_IFELSE])dnl
+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
+AC_BEFORE([$0], [AC_CHECK_INCLUDES_DEFAULT])dnl
+dnl #undef in AH_VERBATIM gets replaced with #define by AC_DEFINE.
+dnl Use a different key than __EXTENSIONS__, as that name broke existing
+dnl configure.ac when using autoheader 2.62.
+dnl The macros below are in alphabetical order ignoring leading _ or __
+dnl prefixes.
+AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
+[/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+])dnl
+
+ AC_REQUIRE([AC_CHECK_INCLUDES_DEFAULT])dnl
+ _AC_CHECK_HEADER_ONCE([wchar.h])
+ _AC_CHECK_HEADER_ONCE([minix/config.h])
+
+dnl Defining __EXTENSIONS__ may break the system headers on some systems.
+dnl (FIXME: Which ones?)
+ AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
+ [ac_cv_safe_to_define___extensions__],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+# define __EXTENSIONS__ 1
+ ]AC_INCLUDES_DEFAULT])],
+ [ac_cv_safe_to_define___extensions__=yes],
+ [ac_cv_safe_to_define___extensions__=no])])
+
+dnl HP-UX 11.11 defines mbstate_t only if _XOPEN_SOURCE is defined to
+dnl 500, regardless of whether compiling with -Ae or -D_HPUX_SOURCE=1.
+dnl But defining _XOPEN_SOURCE may turn *off* extensions on platforms
+dnl not covered by turn-on-extensions macros (notably Dragonfly, Free,
+dnl and OpenBSD, which don't have any equivalent of _NETBSD_SOURCE) so
+dnl it should only be defined when necessary.
+ AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
+ [ac_cv_should_define__xopen_source],
+ [ac_cv_should_define__xopen_source=no
+ AS_IF([test $ac_cv_header_wchar_h = yes],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <wchar.h>
+ mbstate_t x;]])],
+ [],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #define _XOPEN_SOURCE 500
+ #include <wchar.h>
+ mbstate_t x;]])],
+ [ac_cv_should_define__xopen_source=yes])])])])
+
+ AC_DEFINE([_ALL_SOURCE])
+ AC_DEFINE([_DARWIN_C_SOURCE])
+ AC_DEFINE([_GNU_SOURCE])
+ AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
+ AC_DEFINE([_NETBSD_SOURCE])
+ AC_DEFINE([_OPENBSD_SOURCE])
+ AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+ AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__])
+ AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__])
+ AC_DEFINE([__STDC_WANT_LIB_EXT2__])
+ AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
+ AC_DEFINE([_TANDEM_SOURCE])
+ AS_IF([test $ac_cv_header_minix_config_h = yes],
+ [MINIX=yes
+ AC_DEFINE([_MINIX])
+ AC_DEFINE([_POSIX_SOURCE])
+ AC_DEFINE([_POSIX_1_SOURCE], [2])],
+ [MINIX=])
+ AS_IF([test $ac_cv_safe_to_define___extensions__ = yes],
+ [AC_DEFINE([__EXTENSIONS__])])
+ AS_IF([test $ac_cv_should_define__xopen_source = yes],
+ [AC_DEFINE([_XOPEN_SOURCE], [500])])
+])# AC_USE_SYSTEM_EXTENSIONS
+])
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
diff --git a/m4/extern-inline.m4 b/m4/extern-inline.m4
new file mode 100644
index 0000000..7f1bb39
--- /dev/null
+++ b/m4/extern-inline.m4
@@ -0,0 +1,99 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-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.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+ AH_VERBATIM([extern_inline],
+[/* Please see the Gnulib manual for how to use these macros.
+
+ Suppress extern inline with HP-UX cc, as it appears to be broken; see
+ <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+ Suppress extern inline with Sun C in standards-conformance mode, as it
+ mishandles inline functions that call each other. E.g., for 'inline void f
+ (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+ 'reference to static identifier "f" in extern inline function'.
+ This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+ Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+ on configurations that mistakenly use 'static inline' to implement
+ functions or macros in standard C headers like <ctype.h>. For example,
+ if isdigit is mistakenly implemented via a static inline function,
+ a program containing an extern inline function that calls isdigit
+ may not work since the C standard prohibits extern inline functions
+ from calling static functions. This bug is known to occur on:
+
+ OS X 10.8 and earlier; see:
+ http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+ DragonFly; see
+ http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+ FreeBSD; see:
+ http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+ OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+ for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+ Assume DragonFly and FreeBSD will be similar. */
+#if (((defined __APPLE__ && defined __MACH__) \
+ || defined __DragonFly__ || defined __FreeBSD__) \
+ && (defined __header_inline \
+ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+ && ! defined __clang__) \
+ : ((! defined _DONT_USE_CTYPE_INLINE_ \
+ && (defined __GNUC__ || defined __cplusplus)) \
+ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+ && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+ : (199901L <= __STDC_VERSION__ \
+ && !defined __HP_cc \
+ && !(defined __SUNPRO_C && __STDC__))) \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */
+# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+# define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+# define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+# define _GL_INLINE_HEADER_CONST_PRAGMA \
+ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+ /* Suppress GCC's bogus "no previous prototype for 'FOO'"
+ and "no previous declaration for 'FOO'" diagnostics,
+ when FOO is an inline function in the header; see
+ <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113>. */
+# define _GL_INLINE_HEADER_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+ _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/m4/fatal-signal.m4 b/m4/fatal-signal.m4
new file mode 100644
index 0000000..838b291
--- /dev/null
+++ b/m4/fatal-signal.m4
@@ -0,0 +1,12 @@
+# fatal-signal.m4 serial 9
+dnl Copyright (C) 2003-2004, 2006, 2008-2020 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.
+
+AC_DEFUN([gl_FATAL_SIGNAL],
+[
+ AC_REQUIRE([gt_TYPE_SIG_ATOMIC_T])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ gl_PREREQ_SIG_HANDLER_H
+])
diff --git a/m4/fchdir.m4 b/m4/fchdir.m4
new file mode 100644
index 0000000..8e894e0
--- /dev/null
+++ b/m4/fchdir.m4
@@ -0,0 +1,68 @@
+# fchdir.m4 serial 26
+dnl Copyright (C) 2006-2020 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.
+
+AC_DEFUN([gl_FUNC_FCHDIR],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_CHECK_DECLS_ONCE([fchdir])
+ if test $ac_cv_have_decl_fchdir = no; then
+ HAVE_DECL_FCHDIR=0
+ fi
+
+ AC_REQUIRE([gl_TEST_FCHDIR])
+ if test $HAVE_FCHDIR = 0; then
+ AC_LIBOBJ([fchdir])
+ gl_PREREQ_FCHDIR
+ AC_DEFINE([REPLACE_FCHDIR], [1],
+ [Define to 1 if gnulib's fchdir() replacement is used.])
+ dnl We must also replace anything that can manipulate a directory fd,
+ dnl to keep our bookkeeping up-to-date. We don't have to replace
+ dnl fstatat, since no platform has fstatat but lacks fchdir.
+ AC_CACHE_CHECK([whether open can visit directories],
+ [gl_cv_func_open_directory_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <fcntl.h>
+ ]GL_MDA_DEFINES],
+ [[return open(".", O_RDONLY) < 0;]])],
+ [gl_cv_func_open_directory_works=yes],
+ [gl_cv_func_open_directory_works=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_open_directory_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_open_directory_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_open_directory_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_open_directory_works="$gl_cross_guess_normal" ;;
+ esac
+ ])])
+ case "$gl_cv_func_open_directory_works" in
+ *yes) ;;
+ *)
+ AC_DEFINE([REPLACE_OPEN_DIRECTORY], [1], [Define to 1 if open() should
+work around the inability to open a directory.])
+ ;;
+ esac
+ fi
+])
+
+# Determine whether to use the overrides in lib/fchdir.c.
+AC_DEFUN([gl_TEST_FCHDIR],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fchdir])
+ if test $ac_cv_func_fchdir = no; then
+ HAVE_FCHDIR=0
+ fi
+])
+
+# Prerequisites of lib/fchdir.c.
+AC_DEFUN([gl_PREREQ_FCHDIR], [:])
diff --git a/m4/fcntl-o.m4 b/m4/fcntl-o.m4
new file mode 100644
index 0000000..3ef061d
--- /dev/null
+++ b/m4/fcntl-o.m4
@@ -0,0 +1,140 @@
+# fcntl-o.m4 serial 7
+dnl Copyright (C) 2006, 2009-2020 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 Written by Paul Eggert.
+
+AC_PREREQ([2.60])
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+ dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CHECK_FUNCS_ONCE([symlink])
+ AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ # include <stdlib.h>
+ # defined sleep(n) _sleep ((n) * 1000)
+ #endif
+ #include <fcntl.h>
+ ]GL_MDA_DEFINES[
+ #ifndef O_NOATIME
+ #define O_NOATIME 0
+ #endif
+ #ifndef O_NOFOLLOW
+ #define O_NOFOLLOW 0
+ #endif
+ static int const constants[] =
+ {
+ O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+ O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+ };
+ ]],
+ [[
+ int result = !constants;
+ #if HAVE_SYMLINK
+ {
+ static char const sym[] = "conftest.sym";
+ if (symlink ("/dev/null", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ if (unlink (sym) != 0 || symlink (".", sym) != 0)
+ result |= 2;
+ else
+ {
+ int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+ if (fd >= 0)
+ {
+ close (fd);
+ result |= 4;
+ }
+ }
+ unlink (sym);
+ }
+ #endif
+ {
+ static char const file[] = "confdefs.h";
+ int fd = open (file, O_RDONLY | O_NOATIME);
+ if (fd < 0)
+ result |= 8;
+ else
+ {
+ struct stat st0;
+ if (fstat (fd, &st0) != 0)
+ result |= 16;
+ else
+ {
+ char c;
+ sleep (1);
+ if (read (fd, &c, 1) != 1)
+ result |= 24;
+ else
+ {
+ if (close (fd) != 0)
+ result |= 32;
+ else
+ {
+ struct stat st1;
+ if (stat (file, &st1) != 0)
+ result |= 40;
+ else
+ if (st0.st_atime != st1.st_atime)
+ result |= 64;
+ }
+ }
+ }
+ }
+ }
+ return result;]])],
+ [gl_cv_header_working_fcntl_h=yes],
+ [case $? in #(
+ 4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+ 64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+ 68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+ *) gl_cv_header_working_fcntl_h='no';;
+ esac],
+ [case "$host_os" in
+ # Guess 'no' on native Windows.
+ mingw*) gl_cv_header_working_fcntl_h='no' ;;
+ *) gl_cv_header_working_fcntl_h=cross-compiling ;;
+ esac
+ ])
+ ])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+ [Define to 1 if O_NOATIME works.])
+
+ case $gl_cv_header_working_fcntl_h in #(
+ *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+ *) ac_val=1;;
+ esac
+ AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+ [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/m4/fcntl.m4 b/m4/fcntl.m4
new file mode 100644
index 0000000..547ff40
--- /dev/null
+++ b/m4/fcntl.m4
@@ -0,0 +1,151 @@
+# fcntl.m4 serial 11
+dnl Copyright (C) 2009-2020 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.
+
+# For now, this module ensures that fcntl()
+# - supports F_DUPFD correctly
+# - supports or emulates F_DUPFD_CLOEXEC
+# - supports F_GETFD
+# Still to be ported to mingw:
+# - F_SETFD
+# - F_GETFL, F_SETFL
+# - F_GETOWN, F_SETOWN
+# - F_GETLK, F_SETLK, F_SETLKW
+AC_DEFUN([gl_FUNC_FCNTL],
+[
+ dnl Persuade glibc to expose F_DUPFD_CLOEXEC.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ if test $ac_cv_func_fcntl = no; then
+ gl_REPLACE_FCNTL
+ else
+ dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target
+ dnl haiku alpha 2 F_DUPFD has wrong errno
+ AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly],
+ [gl_cv_func_fcntl_f_dupfd_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <errno.h>
+ #include <fcntl.h>
+ #include <limits.h>
+ #include <sys/resource.h>
+ #include <unistd.h>
+ ]GL_MDA_DEFINES[
+ #ifndef RLIM_SAVED_CUR
+ # define RLIM_SAVED_CUR RLIM_INFINITY
+ #endif
+ #ifndef RLIM_SAVED_MAX
+ # define RLIM_SAVED_MAX RLIM_INFINITY
+ #endif
+ ]],
+ [[int result = 0;
+ int bad_fd = INT_MAX;
+ struct rlimit rlim;
+ if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+ && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+ && rlim.rlim_cur != RLIM_INFINITY
+ && rlim.rlim_cur != RLIM_SAVED_MAX
+ && rlim.rlim_cur != RLIM_SAVED_CUR)
+ bad_fd = rlim.rlim_cur;
+ if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
+ if (errno != EINVAL) result |= 2;
+ if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
+ if (errno != EINVAL) result |= 8;
+ /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
+ {
+ int fd;
+ fd = open (".", O_RDONLY);
+ if (fd == -1)
+ result |= 16;
+ else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
+ result |= 32;
+
+ close (fd);
+ }
+ return result;]])],
+ [gl_cv_func_fcntl_f_dupfd_works=yes],
+ [gl_cv_func_fcntl_f_dupfd_works=no],
+ [case $host_os in
+ aix* | cygwin* | haiku*)
+ gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
+ *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
+ esac])])
+ case $gl_cv_func_fcntl_f_dupfd_works in
+ *yes) ;;
+ *) gl_REPLACE_FCNTL
+ AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD
+ behavior does not match POSIX]) ;;
+ esac
+
+ dnl Many systems lack F_DUPFD_CLOEXEC.
+ dnl NetBSD 9.0 declares F_DUPFD_CLOEXEC but it works only like F_DUPFD.
+ AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC],
+ [gl_cv_func_fcntl_f_dupfd_cloexec],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#include <fcntl.h>
+ #include <unistd.h>
+ int main (int argc, char *argv[])
+ {
+ if (argc == 1)
+ /* parent process */
+ {
+ if (fcntl (1, F_DUPFD_CLOEXEC, 10) < 0)
+ return 1;
+ return execl ("./conftest", "./conftest", "child", NULL);
+ }
+ else
+ /* child process */
+ return (fcntl (10, F_GETFL) < 0 ? 0 : 42);
+ }
+ ]])
+ ],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+ it to support the semantics on older kernels that failed with EINVAL. */
+choke me
+#endif
+ ]])],
+ [gl_cv_func_fcntl_f_dupfd_cloexec=yes],
+ [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])
+ ],
+ [gl_cv_func_fcntl_f_dupfd_cloexec=no],
+ [case "$host_os" in
+ # Guess no on NetBSD.
+ netbsd*) gl_cv_func_fcntl_f_dupfd_cloexec="guessing no" ;;
+ *) gl_cv_func_fcntl_f_dupfd_cloexec="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_fcntl_f_dupfd_cloexec" in
+ *yes) ;;
+ *) gl_REPLACE_FCNTL
+ dnl No witness macro needed for this bug.
+ ;;
+ esac
+ fi
+ dnl Replace fcntl() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ gl_REPLACE_FCNTL
+ fi
+ ])
+])
+
+AC_DEFUN([gl_REPLACE_FCNTL],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ if test $ac_cv_func_fcntl = no; then
+ HAVE_FCNTL=0
+ else
+ REPLACE_FCNTL=1
+ fi
+])
diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4
new file mode 100644
index 0000000..c475357
--- /dev/null
+++ b/m4/fcntl_h.m4
@@ -0,0 +1,55 @@
+# serial 17
+# Configure fcntl.h.
+dnl Copyright (C) 2006-2007, 2009-2020 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 Written by Paul Eggert.
+
+AC_DEFUN([gl_FCNTL_H],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_REQUIRE([gl_FCNTL_O_FLAGS])
+ gl_NEXT_HEADERS([fcntl.h])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Ensure the type mode_t gets defined.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, if it is not common
+ dnl enough to be declared everywhere.
+ gl_WARN_ON_USE_PREPARE([[#include <fcntl.h>
+ ]], [fcntl openat])
+])
+
+AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_FCNTL_H_DEFAULTS],
+[
+ GNULIB_CREAT=0; AC_SUBST([GNULIB_CREAT])
+ GNULIB_FCNTL=0; AC_SUBST([GNULIB_FCNTL])
+ GNULIB_NONBLOCKING=0; AC_SUBST([GNULIB_NONBLOCKING])
+ GNULIB_OPEN=0; AC_SUBST([GNULIB_OPEN])
+ GNULIB_OPENAT=0; AC_SUBST([GNULIB_OPENAT])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_CREAT=1; AC_SUBST([GNULIB_MDA_CREAT])
+ GNULIB_MDA_OPEN=1; AC_SUBST([GNULIB_MDA_OPEN])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_FCNTL=1; AC_SUBST([HAVE_FCNTL])
+ HAVE_OPENAT=1; AC_SUBST([HAVE_OPENAT])
+ REPLACE_CREAT=0; AC_SUBST([REPLACE_CREAT])
+ REPLACE_FCNTL=0; AC_SUBST([REPLACE_FCNTL])
+ REPLACE_OPEN=0; AC_SUBST([REPLACE_OPEN])
+ REPLACE_OPENAT=0; AC_SUBST([REPLACE_OPENAT])
+])
diff --git a/m4/fdopendir.m4 b/m4/fdopendir.m4
new file mode 100644
index 0000000..9937a74
--- /dev/null
+++ b/m4/fdopendir.m4
@@ -0,0 +1,67 @@
+# serial 14
+# See if we need to provide fdopendir.
+
+dnl Copyright (C) 2009-2020 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.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FDOPENDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl FreeBSD 7.3 has the function, but failed to declare it.
+ AC_CHECK_DECLS([fdopendir], [], [HAVE_DECL_FDOPENDIR=0], [[
+#include <dirent.h>
+ ]])
+ AC_CHECK_FUNCS_ONCE([fdopendir])
+ if test $ac_cv_func_fdopendir = no; then
+ HAVE_FDOPENDIR=0
+ else
+ AC_CACHE_CHECK([whether fdopendir works],
+ [gl_cv_func_fdopendir_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+]GL_MDA_DEFINES[
+#if !HAVE_DECL_FDOPENDIR
+extern
+# ifdef __cplusplus
+"C"
+# endif
+DIR *fdopendir (int);
+#endif
+]],
+ [[int result = 0;
+ int fd = open ("conftest.c", O_RDONLY);
+ if (fd < 0) result |= 1;
+ if (fdopendir (fd)) result |= 2;
+ if (close (fd)) result |= 4;
+ return result;
+ ]])],
+ [gl_cv_func_fdopendir_works=yes],
+ [gl_cv_func_fdopendir_works=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_fdopendir_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_fdopendir_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_fdopendir_works="$gl_cross_guess_normal" ;;
+ esac
+ ])])
+ case "$gl_cv_func_fdopendir_works" in
+ *yes) ;;
+ *)
+ REPLACE_FDOPENDIR=1
+ ;;
+ esac
+ fi
+])
diff --git a/m4/fflush.m4 b/m4/fflush.m4
new file mode 100644
index 0000000..8f63c25
--- /dev/null
+++ b/m4/fflush.m4
@@ -0,0 +1,100 @@
+# fflush.m4 serial 18
+
+# Copyright (C) 2007-2020 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.
+
+dnl From Eric Blake
+
+dnl Find out how to obey POSIX semantics of fflush(stdin) discarding
+dnl unread input on seekable streams, rather than C99 undefined semantics.
+
+AC_DEFUN([gl_FUNC_FFLUSH],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_FUNC_FFLUSH_STDIN
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) ;;
+ *) REPLACE_FFLUSH=1 ;;
+ esac
+])
+
+dnl Determine whether fflush works on input streams.
+dnl Sets gl_cv_func_fflush_stdin.
+
+AC_DEFUN([gl_FUNC_FFLUSH_STDIN],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([whether fflush works on input streams],
+ [gl_cv_func_fflush_stdin],
+ [echo hello world > conftest.txt
+ AC_RUN_IFELSE([AC_LANG_PROGRAM(
+ [[
+#include <stdio.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+ ]GL_MDA_DEFINES],
+ [[FILE *f = fopen ("conftest.txt", "r");
+ char buffer[10];
+ int fd;
+ int c;
+ if (f == NULL)
+ return 1;
+ fd = fileno (f);
+ if (fd < 0 || fread (buffer, 1, 5, f) != 5)
+ { fclose (f); return 2; }
+ /* For deterministic results, ensure f read a bigger buffer. */
+ if (lseek (fd, 0, SEEK_CUR) == 5)
+ { fclose (f); return 3; }
+ /* POSIX requires fflush-fseek to set file offset of fd. This fails
+ on BSD systems and on mingw. */
+ if (fflush (f) != 0 || fseek (f, 0, SEEK_CUR) != 0)
+ { fclose (f); return 4; }
+ if (lseek (fd, 0, SEEK_CUR) != 5)
+ { fclose (f); return 5; }
+ /* Verify behaviour of fflush after ungetc. See
+ <https://www.opengroup.org/austin/aardvark/latest/xshbug3.txt> */
+ /* Verify behaviour of fflush after a backup ungetc. This fails on
+ mingw. */
+ c = fgetc (f);
+ ungetc (c, f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 6; }
+ /* Verify behaviour of fflush after a non-backup ungetc. This fails
+ on glibc 2.8 and on BSD systems. */
+ c = fgetc (f);
+ ungetc ('@', f);
+ fflush (f);
+ if (fgetc (f) != c)
+ { fclose (f); return 7; }
+ fclose (f);
+ return 0;
+ ]])],
+ [gl_cv_func_fflush_stdin=yes],
+ [gl_cv_func_fflush_stdin=no],
+ [case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_fflush_stdin="guessing no" ;;
+ *) gl_cv_func_fflush_stdin=cross ;;
+ esac
+ ])
+ rm conftest.txt
+ ])
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) gl_func_fflush_stdin=1 ;;
+ *no) gl_func_fflush_stdin=0 ;;
+ *) gl_func_fflush_stdin='(-1)' ;;
+ esac
+ AC_DEFINE_UNQUOTED([FUNC_FFLUSH_STDIN], [$gl_func_fflush_stdin],
+ [Define to 1 if fflush is known to work on stdin as per POSIX.1-2008,
+ 0 if fflush is known to not work, -1 if unknown.])
+])
+
+# Prerequisites of lib/fflush.c.
+AC_DEFUN([gl_PREREQ_FFLUSH], [:])
diff --git a/m4/filenamecat.m4 b/m4/filenamecat.m4
new file mode 100644
index 0000000..7eff5b9
--- /dev/null
+++ b/m4/filenamecat.m4
@@ -0,0 +1,16 @@
+# filenamecat.m4 serial 11
+dnl Copyright (C) 2002-2006, 2009-2020 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.
+
+AC_DEFUN([gl_FILE_NAME_CONCAT],
+[
+ AC_REQUIRE([gl_FILE_NAME_CONCAT_LGPL])
+])
+
+AC_DEFUN([gl_FILE_NAME_CONCAT_LGPL],
+[
+ dnl Prerequisites of lib/filenamecat-lgpl.c.
+ AC_CHECK_FUNCS_ONCE([mempcpy])
+])
diff --git a/m4/findprog-in.m4 b/m4/findprog-in.m4
new file mode 100644
index 0000000..54ea10e
--- /dev/null
+++ b/m4/findprog-in.m4
@@ -0,0 +1,11 @@
+# findprog-in.m4 serial 1
+dnl Copyright (C) 2003, 2009-2020 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.
+
+AC_DEFUN([gl_FINDPROG_IN],
+[
+ dnl Prerequisites of lib/findprog-in.c.
+ AC_REQUIRE([gl_FUNC_EACCESS])
+])
diff --git a/m4/flexmember.m4 b/m4/flexmember.m4
new file mode 100644
index 0000000..90f3ddd
--- /dev/null
+++ b/m4/flexmember.m4
@@ -0,0 +1,44 @@
+# serial 5
+# Check for flexible array member support.
+
+# Copyright (C) 2006, 2009-2020 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.
+
+# Written by Paul Eggert.
+
+AC_DEFUN([AC_C_FLEXIBLE_ARRAY_MEMBER],
+[
+ AC_CACHE_CHECK([for flexible array member],
+ ac_cv_c_flexmember,
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ #include <stdio.h>
+ #include <stddef.h>
+ struct m { struct m *next, **list; char name[]; };
+ struct s { struct s *p; struct m *m; int n; double d[]; };]],
+ [[int m = getchar ();
+ size_t nbytes = offsetof (struct s, d) + m * sizeof (double);
+ nbytes += sizeof (struct s) - 1;
+ nbytes -= nbytes % sizeof (struct s);
+ struct s *p = malloc (nbytes);
+ p->p = p;
+ p->m = NULL;
+ p->d[0] = 0.0;
+ return p->d != (double *) NULL;]])],
+ [ac_cv_c_flexmember=yes],
+ [ac_cv_c_flexmember=no])])
+ if test $ac_cv_c_flexmember = yes; then
+ AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [],
+ [Define to nothing if C supports flexible array members, and to
+ 1 if it does not. That way, with a declaration like 'struct s
+ { int n; short d@<:@FLEXIBLE_ARRAY_MEMBER@:>@; };', the struct hack
+ can be used with pre-C99 compilers.
+ Use 'FLEXSIZEOF (struct s, d, N * sizeof (short))' to calculate
+ the size in bytes of such a struct containing an N-element array.])
+ else
+ AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1])
+ fi
+])
diff --git a/m4/float_h.m4 b/m4/float_h.m4
new file mode 100644
index 0000000..3ef0bb7
--- /dev/null
+++ b/m4/float_h.m4
@@ -0,0 +1,108 @@
+# float_h.m4 serial 12
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FLOAT_H],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ FLOAT_H=
+ REPLACE_FLOAT_LDBL=0
+ case "$host_os" in
+ aix* | beos* | openbsd* | mirbsd* | irix*)
+ FLOAT_H=float.h
+ ;;
+ freebsd* | dragonfly*)
+ case "$host_cpu" in
+changequote(,)dnl
+ i[34567]86 )
+changequote([,])dnl
+ FLOAT_H=float.h
+ ;;
+ x86_64 )
+ # On x86_64 systems, the C compiler may still be generating
+ # 32-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __x86_64__ || defined __amd64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [],
+ [FLOAT_H=float.h])
+ ;;
+ esac
+ ;;
+ linux*)
+ case "$host_cpu" in
+ powerpc*)
+ FLOAT_H=float.h
+ ;;
+ esac
+ ;;
+ esac
+ case "$host_os" in
+ aix* | freebsd* | dragonfly* | linux*)
+ if test -n "$FLOAT_H"; then
+ REPLACE_FLOAT_LDBL=1
+ fi
+ ;;
+ esac
+
+ dnl Test against glibc-2.7 Linux/SPARC64 bug.
+ REPLACE_ITOLD=0
+ AC_CACHE_CHECK([whether conversion from 'int' to 'long double' works],
+ [gl_cv_func_itold_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+int i = -1;
+volatile long double ld;
+int main ()
+{
+ ld += i * 1.0L;
+ if (ld > 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_itold_works=yes],
+ [gl_cv_func_itold_works=no],
+ [case "$host" in
+ sparc*-*-linux*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_itold_works="guessing no"],
+ [gl_cv_func_itold_works="guessing yes"])
+ ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_itold_works="guessing yes" ;;
+ *) gl_cv_func_itold_works="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_itold_works" in
+ *no)
+ REPLACE_ITOLD=1
+ dnl We add the workaround to <float.h> but also to <math.h>,
+ dnl to increase the chances that the fix function gets pulled in.
+ FLOAT_H=float.h
+ ;;
+ esac
+
+ if test -n "$FLOAT_H"; then
+ gl_NEXT_HEADERS([float.h])
+ fi
+ AC_SUBST([FLOAT_H])
+ AM_CONDITIONAL([GL_GENERATE_FLOAT_H], [test -n "$FLOAT_H"])
+ AC_SUBST([REPLACE_ITOLD])
+])
diff --git a/m4/flock.m4 b/m4/flock.m4
new file mode 100644
index 0000000..bb48733
--- /dev/null
+++ b/m4/flock.m4
@@ -0,0 +1,24 @@
+# flock.m4 serial 3
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_FLOCK],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([flock])
+ if test $ac_cv_func_flock = no; then
+ HAVE_FLOCK=0
+ fi
+])
+
+dnl Prerequisites of lib/flock.c.
+AC_DEFUN([gl_PREREQ_FLOCK],
+[
+ AC_CHECK_FUNCS_ONCE([fcntl])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+
+ dnl Do we have a POSIX fcntl lock implementation?
+ AC_CHECK_MEMBERS([struct flock.l_type],[],[],[[#include <fcntl.h>]])
+])
diff --git a/m4/fnmatch.m4 b/m4/fnmatch.m4
new file mode 100644
index 0000000..2f8e4a8
--- /dev/null
+++ b/m4/fnmatch.m4
@@ -0,0 +1,153 @@
+# Check for fnmatch - serial 15. -*- coding: utf-8 -*-
+
+# Copyright (C) 2000-2007, 2009-2020 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.
+
+# Autoconf defines AC_FUNC_FNMATCH, but that is obsolescent.
+# New applications should use the macros below instead.
+
+# Request a POSIX compliant fnmatch function.
+AC_DEFUN([gl_FUNC_FNMATCH_POSIX],
+[
+ m4_divert_text([DEFAULTS], [gl_fnmatch_required=POSIX])
+
+ AC_REQUIRE([gl_FNMATCH_H])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ gl_fnmatch_required_lowercase=`
+ echo $gl_fnmatch_required | LC_ALL=C tr '[[A-Z]]' '[[a-z]]'
+ `
+ AC_CHECK_FUNCS_ONCE([fnmatch])
+ if test $ac_cv_func_fnmatch = no; then
+ HAVE_FNMATCH=0
+ else
+ gl_fnmatch_cache_var="gl_cv_func_fnmatch_${gl_fnmatch_required_lowercase}"
+ AC_CACHE_CHECK([for working $gl_fnmatch_required fnmatch],
+ [$gl_fnmatch_cache_var],
+ [dnl Some versions of Solaris, SCO, and the GNU C Library
+ dnl have a broken or incompatible fnmatch.
+ dnl So we run a test program. If we are cross-compiling, take no chance.
+ dnl Thanks to John Oleynick, François Pinard, and Paul Eggert for this
+ dnl test.
+ if test $gl_fnmatch_required = GNU; then
+ gl_fnmatch_gnu_start=
+ gl_fnmatch_gnu_end=
+ else
+ gl_fnmatch_gnu_start='#if 0'
+ gl_fnmatch_gnu_end='#endif'
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <fnmatch.h>
+ static int
+ y (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == 0;
+ }
+ static int
+ n (char const *pattern, char const *string, int flags)
+ {
+ return fnmatch (pattern, string, flags) == FNM_NOMATCH;
+ }
+ ]],
+ [[char const *Apat = 'A' < '\\\\' ? "[A-\\\\\\\\]" : "[\\\\\\\\-A]";
+ char const *apat = 'a' < '\\\\' ? "[a-\\\\\\\\]" : "[\\\\\\\\-a]";
+ static char const A_1[] = { 'A' - 1, 0 };
+ static char const A01[] = { 'A' + 1, 0 };
+ static char const a_1[] = { 'a' - 1, 0 };
+ static char const a01[] = { 'a' + 1, 0 };
+ static char const bs_1[] = { '\\\\' - 1, 0 };
+ static char const bs01[] = { '\\\\' + 1, 0 };
+ int result = 0;
+ if (!n ("a*", "", 0))
+ return 1;
+ if (!y ("a*", "abc", 0))
+ return 1;
+ if (!y ("[/b", "[/b", 0)) /*"]]"*/ /* glibc Bugzilla bug 12378 */
+ return 1;
+ if (!n ("d*/*1", "d/s/1", FNM_PATHNAME))
+ return 2;
+ if (!y ("a\\\\bc", "abc", 0))
+ return 3;
+ if (!n ("a\\\\bc", "abc", FNM_NOESCAPE))
+ return 3;
+ if (!y ("*x", ".x", 0))
+ return 4;
+ if (!n ("*x", ".x", FNM_PERIOD))
+ return 4;
+ if (!y (Apat, "\\\\", 0))
+ return 5;
+ if (!y (Apat, "A", 0))
+ return 5;
+ if (!y (apat, "\\\\", 0))
+ return 5;
+ if (!y (apat, "a", 0))
+ return 5;
+ if (!(n (Apat, A_1, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(n (apat, a_1, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(y (Apat, A01, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(y (apat, a01, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(y (Apat, bs_1, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(y (apat, bs_1, 0) == ('a' < '\\\\')))
+ return 5;
+ if (!(n (Apat, bs01, 0) == ('A' < '\\\\')))
+ return 5;
+ if (!(n (apat, bs01, 0) == ('a' < '\\\\')))
+ return 5;
+ $gl_fnmatch_gnu_start
+ if (!y ("xxXX", "xXxX", FNM_CASEFOLD))
+ result |= 8;
+ if (!y ("a++(x|yy)b", "a+xyyyyxb", FNM_EXTMATCH))
+ result |= 16;
+ if (!n ("d*/*1", "d/s/1", FNM_FILE_NAME))
+ result |= 32;
+ if (!y ("*", "x", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ if (!y ("x*", "x/y/z", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ if (!y ("*c*", "c/x", FNM_FILE_NAME | FNM_LEADING_DIR))
+ result |= 64;
+ $gl_fnmatch_gnu_end
+ return result;
+ ]])],
+ [eval "$gl_fnmatch_cache_var=yes"],
+ [eval "$gl_fnmatch_cache_var=no"],
+ [case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) eval "$gl_fnmatch_cache_var=\"guessing yes\"" ;;
+ # Guess no otherwise, even on glibc systems.
+ *) eval "$gl_fnmatch_cache_var=\"guessing no\"" ;;
+ esac
+ ])
+ ])
+ eval "gl_fnmatch_result=\"\$$gl_fnmatch_cache_var\""
+ case "$gl_fnmatch_result" in
+ *yes) ;;
+ *) REPLACE_FNMATCH=1 ;;
+ esac
+ fi
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+ gl_REPLACE_FNMATCH_H
+ fi
+])
+
+# Request a POSIX compliant fnmatch function with GNU extensions.
+AC_DEFUN([gl_FUNC_FNMATCH_GNU],
+[
+ m4_divert_text([INIT_PREPARE], [gl_fnmatch_required=GNU])
+
+ AC_REQUIRE([gl_FUNC_FNMATCH_POSIX])
+])
+
+AC_DEFUN([gl_PREREQ_FNMATCH],
+[
+ dnl Prerequisites of lib/fnmatch.c.
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_CHECK_FUNCS_ONCE([mbsrtowcs])
+])
diff --git a/m4/fnmatch_h.m4 b/m4/fnmatch_h.m4
new file mode 100644
index 0000000..a21ec2c
--- /dev/null
+++ b/m4/fnmatch_h.m4
@@ -0,0 +1,75 @@
+# fnmatch_h.m4 serial 4
+dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN_ONCE([gl_FNMATCH_H],
+[
+ AC_REQUIRE([gl_FNMATCH_H_DEFAULTS])
+ m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])])
+ AC_CHECK_HEADERS_ONCE([fnmatch.h])
+ gl_CHECK_NEXT_HEADERS([fnmatch.h])
+
+ dnl Persuade glibc <fnmatch.h> to declare FNM_CASEFOLD etc.
+ dnl This is only needed if gl_fnmatch_required = GNU. It would be possible
+ dnl to avoid this dependency for gl_FUNC_FNMATCH_POSIX by putting
+ dnl gl_FUNC_FNMATCH_GNU into a separate .m4 file.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ if test $ac_cv_header_fnmatch_h = yes; then
+ HAVE_FNMATCH_H=1
+ else
+ HAVE_FNMATCH_H=0
+ fi
+ AC_SUBST([HAVE_FNMATCH_H])
+
+ m4_ifdef([gl_POSIXCHECK],
+ [FNMATCH_H=fnmatch.h],
+ [FNMATCH_H=''
+ if m4_ifdef([gl_ANSI_CXX], [test "$CXX" != no], [false]); then
+ dnl Override <fnmatch.h> always, to support the C++ GNULIB_NAMESPACE.
+ FNMATCH_H=fnmatch.h
+ else
+ if test $ac_cv_header_fnmatch_h != yes; then
+ dnl Provide a substitute <fnmatch.h> file.
+ FNMATCH_H=fnmatch.h
+ fi
+ fi
+ ])
+ AC_SUBST([FNMATCH_H])
+ AM_CONDITIONAL([GL_GENERATE_FNMATCH_H], [test -n "$FNMATCH_H"])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <fnmatch.h>
+ ]],
+ [fnmatch])
+])
+
+dnl Unconditionally enables the replacement of <fnmatch.h>.
+AC_DEFUN([gl_REPLACE_FNMATCH_H],
+[
+ AC_REQUIRE([gl_FNMATCH_H_DEFAULTS])
+ FNMATCH_H='fnmatch.h'
+ AM_CONDITIONAL([GL_GENERATE_FNMATCH_H], [test -n "$FNMATCH_H"])
+])
+
+AC_DEFUN([gl_FNMATCH_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_FNMATCH_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_FNMATCH_H_DEFAULTS],
+[
+ GNULIB_FNMATCH=0; AC_SUBST([GNULIB_FNMATCH])
+ dnl Assume POSIX behavior unless another module says otherwise.
+ HAVE_FNMATCH=1; AC_SUBST([HAVE_FNMATCH])
+ REPLACE_FNMATCH=0; AC_SUBST([REPLACE_FNMATCH])
+])
diff --git a/m4/fopen.m4 b/m4/fopen.m4
new file mode 100644
index 0000000..a5d687a
--- /dev/null
+++ b/m4/fopen.m4
@@ -0,0 +1,148 @@
+# fopen.m4 serial 12
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_FOPEN],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw* | pw*)
+ dnl Replace fopen, for handling of "/dev/null".
+ REPLACE_FOPEN=1
+ dnl fopen on mingw also has the trailing slash bug.
+ gl_cv_func_fopen_slash="guessing no"
+ ;;
+ *)
+ dnl fopen("foo/", "w") should not create a file when the file name has a
+ dnl trailing slash.
+ AC_CACHE_CHECK([whether fopen recognizes a trailing slash],
+ [gl_cv_func_fopen_slash],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stddef.h>
+#include <stdio.h>
+int main ()
+{
+ FILE *fp = fopen ("conftest.sl/", "w");
+ int result = (fp != NULL);
+ if (fp != NULL)
+ fclose (fp);
+ return result;
+}]])],
+ [gl_cv_func_fopen_slash=yes],
+ [gl_cv_func_fopen_slash=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+ gl_cv_func_fopen_slash="guessing no" ;;
+ *)
+ gl_cv_func_fopen_slash="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ rm -f conftest.sl
+ ])
+ ;;
+ esac
+ case "$gl_cv_func_fopen_slash" in
+ *no)
+ AC_DEFINE([FOPEN_TRAILING_SLASH_BUG], [1],
+ [Define to 1 if fopen() fails to recognize a trailing slash.])
+ REPLACE_FOPEN=1
+ ;;
+ esac
+])
+
+AC_DEFUN([gl_FUNC_FOPEN_GNU],
+[
+ AC_REQUIRE([gl_FUNC_FOPEN])
+ AC_CACHE_CHECK([whether fopen supports the mode character 'x'],
+ [gl_cv_func_fopen_mode_x],
+ [rm -f conftest.x
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <errno.h>
+int main ()
+{
+ FILE *fp;
+ fp = fopen ("conftest.x", "w");
+ fclose (fp);
+ fp = fopen ("conftest.x", "wx");
+ if (fp != NULL)
+ /* 'x' ignored */
+ return 1;
+ else if (errno == EEXIST)
+ return 0;
+ else
+ /* 'x' rejected */
+ return 2;
+}]])],
+ [gl_cv_func_fopen_mode_x=yes],
+ [gl_cv_func_fopen_mode_x=no],
+ [case "$host_os" in
+ # Guess yes on glibc and musl systems.
+ linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+ gl_cv_func_fopen_mode_x="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_fopen_mode_x="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.x
+ ])
+ AC_CACHE_CHECK([whether fopen supports the mode character 'e'],
+ [gl_cv_func_fopen_mode_e],
+ [echo foo > conftest.x
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <errno.h>
+#include <fcntl.h>
+]GL_MDA_DEFINES[
+int main ()
+{
+ FILE *fp = fopen ("conftest.x", "re");
+ if (fp != NULL)
+ {
+ if (fcntl (fileno (fp), F_GETFD) & FD_CLOEXEC)
+ return 0;
+ else
+ /* 'e' ignored */
+ return 1;
+ }
+ else
+ /* 'e' rejected */
+ return 2;
+}]])],
+ [gl_cv_func_fopen_mode_e=yes],
+ [gl_cv_func_fopen_mode_e=no],
+ [case "$host_os" in
+ # Guess yes on glibc and musl systems.
+ linux*-gnu* | gnu* | kfreebsd*-gnu | *-musl*)
+ gl_cv_func_fopen_mode_e="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*)
+ gl_cv_func_fopen_mode_e="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_fopen_mode_e="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.x
+ ])
+ case "$gl_cv_func_fopen_mode_x" in
+ *no) REPLACE_FOPEN=1 ;;
+ esac
+ case "$gl_cv_func_fopen_mode_e" in
+ *no) REPLACE_FOPEN=1 ;;
+ esac
+])
+
+# Prerequisites of lib/fopen.c.
+AC_DEFUN([gl_PREREQ_FOPEN], [:])
diff --git a/m4/fpurge.m4 b/m4/fpurge.m4
new file mode 100644
index 0000000..9a486e0
--- /dev/null
+++ b/m4/fpurge.m4
@@ -0,0 +1,73 @@
+# fpurge.m4 serial 12
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_FPURGE],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h])
+ AC_CHECK_FUNCS_ONCE([fpurge])
+ AC_CHECK_FUNCS_ONCE([__fpurge])
+ AC_CHECK_DECLS([fpurge], , , [[#include <stdio.h>]])
+ if test "x$ac_cv_func_fpurge" = xyes; then
+ HAVE_FPURGE=1
+ # Detect BSD bug. Only cygwin 1.7 and musl are known to be immune.
+ AC_CACHE_CHECK([whether fpurge works], [gl_cv_func_fpurge_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdio.h>
+]],
+ [[FILE *f = fopen ("conftest.txt", "w+");
+ if (!f)
+ return 1;
+ if (fputc ('a', f) != 'a')
+ { fclose (f); return 2; }
+ rewind (f);
+ if (fgetc (f) != 'a')
+ { fclose (f); return 3; }
+ if (fgetc (f) != EOF)
+ { fclose (f); return 4; }
+ if (fpurge (f) != 0)
+ { fclose (f); return 5; }
+ if (putc ('b', f) != 'b')
+ { fclose (f); return 6; }
+ if (fclose (f) != 0)
+ return 7;
+ if ((f = fopen ("conftest.txt", "r")) == NULL)
+ return 8;
+ if (fgetc (f) != 'a')
+ { fclose (f); return 9; }
+ if (fgetc (f) != 'b')
+ { fclose (f); return 10; }
+ if (fgetc (f) != EOF)
+ { fclose (f); return 11; }
+ if (fclose (f) != 0)
+ return 12;
+ if (remove ("conftest.txt") != 0)
+ return 13;
+ return 0;
+ ]])],
+ [gl_cv_func_fpurge_works=yes],
+ [gl_cv_func_fpurge_works=no],
+ [case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_fpurge_works="guessing yes" ;;
+ # Otherwise obey --enable-cross-guesses.
+ *) gl_cv_func_fpurge_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_fpurge_works" in
+ *yes) ;;
+ *) REPLACE_FPURGE=1 ;;
+ esac
+ else
+ HAVE_FPURGE=0
+ fi
+ if test "x$ac_cv_have_decl_fpurge" = xno; then
+ HAVE_DECL_FPURGE=0
+ fi
+])
diff --git a/m4/freading.m4 b/m4/freading.m4
new file mode 100644
index 0000000..6eb25ab
--- /dev/null
+++ b/m4/freading.m4
@@ -0,0 +1,11 @@
+# freading.m4 serial 2
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_FREADING],
+[
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h])
+ AC_CHECK_FUNCS_ONCE([__freading])
+])
diff --git a/m4/free.m4 b/m4/free.m4
new file mode 100644
index 0000000..bf9fc31
--- /dev/null
+++ b/m4/free.m4
@@ -0,0 +1,49 @@
+# free.m4 serial 5
+# Copyright (C) 2003-2005, 2009-2020 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.
+
+# Written by Paul Eggert and Bruno Haible.
+
+AC_DEFUN([gl_FUNC_FREE],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl In the next release of POSIX, free must preserve errno.
+ dnl https://www.austingroupbugs.net/view.php?id=385
+ dnl https://sourceware.org/bugzilla/show_bug.cgi?id=17924
+ dnl So far, we know of three platforms that do this:
+ dnl * glibc >= 2.33, thanks to the fix for this bug:
+ dnl <https://sourceware.org/bugzilla/show_bug.cgi?id=17924>
+ dnl * OpenBSD >= 4.5, thanks to this commit:
+ dnl <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c.diff?r1=1.100&r2=1.101&f=h>
+ dnl * Solaris, because its malloc() implementation is based on brk(),
+ dnl not mmap(); hence its free() implementation makes no system calls.
+ dnl For other platforms, you can only be sure if they state it in their
+ dnl documentation, or by code inspection of the free() implementation in libc.
+ AC_CACHE_CHECK([whether free is known to preserve errno],
+ [gl_cv_func_free_preserves_errno],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ ]],
+ [[#if 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)
+ #elif defined __OpenBSD__
+ #elif defined __sun
+ #else
+ #error "'free' is not known to preserve errno"
+ #endif
+ ]])],
+ [gl_cv_func_free_preserves_errno=yes],
+ [gl_cv_func_free_preserves_errno=no])
+ ])
+
+ case $gl_cv_func_free_preserves_errno in
+ *yes) ;;
+ *) REPLACE_FREE=1 ;;
+ esac
+])
+
+# Prerequisites of lib/free.c.
+AC_DEFUN([gl_PREREQ_FREE], [:])
diff --git a/m4/fseek.m4 b/m4/fseek.m4
new file mode 100644
index 0000000..e36508c
--- /dev/null
+++ b/m4/fseek.m4
@@ -0,0 +1,15 @@
+# fseek.m4 serial 4
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_FSEEK],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_FSEEKO])
+ dnl When fseeko needs fixes, fseek needs them too.
+ if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then
+ REPLACE_FSEEK=1
+ fi
+])
diff --git a/m4/fseeko.m4 b/m4/fseeko.m4
new file mode 100644
index 0000000..a64e640
--- /dev/null
+++ b/m4/fseeko.m4
@@ -0,0 +1,77 @@
+# fseeko.m4 serial 20
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_FSEEKO],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
+ AC_REQUIRE([gl_SYS_TYPES_H])
+ AC_REQUIRE([AC_PROG_CC])
+
+ dnl Persuade glibc <stdio.h> to declare fseeko().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CACHE_CHECK([for fseeko], [gl_cv_func_fseeko],
+ [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+]], [[fseeko (stdin, 0, 0);]])],
+ [gl_cv_func_fseeko=yes], [gl_cv_func_fseeko=no])
+ ])
+
+ AC_CHECK_DECLS_ONCE([fseeko])
+ if test $ac_cv_have_decl_fseeko = no; then
+ HAVE_DECL_FSEEKO=0
+ fi
+
+ if test $gl_cv_func_fseeko = no; then
+ HAVE_FSEEKO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FSEEKO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FSEEKO=1
+ fi
+ m4_ifdef([gl_FUNC_FFLUSH_STDIN], [
+ gl_FUNC_FFLUSH_STDIN
+ case "$gl_cv_func_fflush_stdin" in
+ *yes) ;;
+ *) REPLACE_FSEEKO=1 ;;
+ esac
+ ])
+ fi
+])
+
+dnl Code shared by fseeko and ftello. Determine if large files are supported,
+dnl but stdin does not start as a large file by default.
+AC_DEFUN([gl_STDIN_LARGE_OFFSET],
+ [
+ AC_CACHE_CHECK([whether stdin defaults to large file offsets],
+ [gl_cv_var_stdin_large_offset],
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
+[[#if defined __SL64 && defined __SCLE /* cygwin */
+ /* Cygwin 1.5.24 and earlier fail to put stdin in 64-bit mode, making
+ fseeko/ftello needlessly fail. This bug was fixed in 1.5.25, and
+ it is easier to do a version check than building a runtime test. */
+# include <cygwin/version.h>
+# if CYGWIN_VERSION_DLL_COMBINED < CYGWIN_VERSION_DLL_MAKE_COMBINED (1005, 25)
+ choke me
+# endif
+#endif]])],
+ [gl_cv_var_stdin_large_offset=yes],
+ [gl_cv_var_stdin_large_offset=no])])
+])
+
+# Prerequisites of lib/fseeko.c.
+AC_DEFUN([gl_PREREQ_FSEEKO],
+[
+ dnl Native Windows has the function _fseeki64. mingw hides it in some
+ dnl circumstances, but mingw64 makes it usable again.
+ AC_CHECK_FUNCS([_fseeki64])
+ if test $ac_cv_func__fseeki64 = yes; then
+ AC_CHECK_DECLS([_fseeki64])
+ fi
+])
diff --git a/m4/fstat.m4 b/m4/fstat.m4
new file mode 100644
index 0000000..bd8cb79
--- /dev/null
+++ b/m4/fstat.m4
@@ -0,0 +1,40 @@
+# fstat.m4 serial 7
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_FSTAT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+
+ case "$host_os" in
+ mingw* | solaris*)
+ dnl On MinGW, the original stat() returns st_atime, st_mtime,
+ dnl st_ctime values that are affected by the time zone.
+ dnl Solaris stat can return a negative tv_nsec.
+ REPLACE_FSTAT=1
+ ;;
+ esac
+
+ dnl Replace fstat() for supporting the gnulib-defined open() on directories.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ case "$gl_cv_func_open_directory_works" in
+ *yes) ;;
+ *)
+ REPLACE_FSTAT=1
+ ;;
+ esac
+ fi
+ ])
+])
+
+# Prerequisites of lib/fstat.c and lib/stat-w32.c.
+AC_DEFUN([gl_PREREQ_FSTAT], [
+ AC_REQUIRE([gl_HEADER_SYS_STAT_H])
+ AC_REQUIRE([gl_PREREQ_STAT_W32])
+ :
+])
diff --git a/m4/fstatat.m4 b/m4/fstatat.m4
new file mode 100644
index 0000000..19583ed
--- /dev/null
+++ b/m4/fstatat.m4
@@ -0,0 +1,65 @@
+# fstatat.m4 serial 4
+dnl Copyright (C) 2004-2020 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.
+
+# Written by Jim Meyering.
+
+# If we have the fstatat function, and it has the bug (in AIX 7.1)
+# that it does not fill in st_size correctly, use the replacement function.
+AC_DEFUN([gl_FUNC_FSTATAT],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([fstatat])
+
+ if test $ac_cv_func_fstatat = no; then
+ HAVE_FSTATAT=0
+ else
+ dnl Test for an AIX 7.1 bug; see
+ dnl <https://lists.gnu.org/r/bug-tar/2011-09/msg00015.html>.
+ AC_CACHE_CHECK([whether fstatat (..., 0) works],
+ [gl_cv_func_fstatat_zero_flag],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+ #include <fcntl.h>
+ #include <sys/stat.h>
+ int
+ main (void)
+ {
+ struct stat a;
+ return fstatat (AT_FDCWD, ".", &a, 0) != 0;
+ }
+ ]])],
+ [gl_cv_func_fstatat_zero_flag=yes],
+ [gl_cv_func_fstatat_zero_flag=no],
+ [case "$host_os" in
+ aix*) gl_cv_func_fstatat_zero_flag="guessing no";;
+ *) gl_cv_func_fstatat_zero_flag="guessing yes";;
+ esac
+ ])
+ ])
+
+ case $gl_cv_func_fstatat_zero_flag+$gl_cv_func_lstat_dereferences_slashed_symlink in
+ *yes+*yes) ;;
+ *) REPLACE_FSTATAT=1 ;;
+ esac
+
+ case $host_os in
+ solaris*)
+ REPLACE_FSTATAT=1 ;;
+ esac
+
+ case $REPLACE_FSTATAT,$gl_cv_func_fstatat_zero_flag in
+ 1,*yes)
+ AC_DEFINE([HAVE_WORKING_FSTATAT_ZERO_FLAG], [1],
+ [Define to 1 if fstatat (..., 0) works.
+ For example, it does not work in AIX 7.1.])
+ ;;
+ esac
+ fi
+])
diff --git a/m4/ftell.m4 b/m4/ftell.m4
new file mode 100644
index 0000000..22055d4
--- /dev/null
+++ b/m4/ftell.m4
@@ -0,0 +1,15 @@
+# ftell.m4 serial 3
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_FTELL],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_FTELLO])
+ dnl When ftello needs fixes, ftell needs them too.
+ if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then
+ REPLACE_FTELL=1
+ fi
+])
diff --git a/m4/ftello.m4 b/m4/ftello.m4
new file mode 100644
index 0000000..4c629c0
--- /dev/null
+++ b/m4/ftello.m4
@@ -0,0 +1,142 @@
+# ftello.m4 serial 13
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_FTELLO],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_STDIN_LARGE_OFFSET])
+ AC_REQUIRE([gl_SYS_TYPES_H])
+
+ dnl Persuade glibc <stdio.h> to declare ftello().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([ftello])
+ if test $ac_cv_have_decl_ftello = no; then
+ HAVE_DECL_FTELLO=0
+ fi
+
+ AC_CACHE_CHECK([for ftello], [gl_cv_func_ftello],
+ [
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdio.h>]],
+ [[ftello (stdin);]])],
+ [gl_cv_func_ftello=yes],
+ [gl_cv_func_ftello=no])
+ ])
+ if test $gl_cv_func_ftello = no; then
+ HAVE_FTELLO=0
+ else
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_FTELLO=1
+ fi
+ if test $gl_cv_var_stdin_large_offset = no; then
+ REPLACE_FTELLO=1
+ fi
+ if test $REPLACE_FTELLO = 0; then
+ dnl Detect bug on Solaris.
+ dnl ftell and ftello produce incorrect results after putc that followed a
+ dnl getc call that reached EOF on Solaris. This is because the _IOREAD
+ dnl flag does not get cleared in this case, even though _IOWRT gets set,
+ dnl and ftell and ftello look whether the _IOREAD flag is set.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether ftello works],
+ [gl_cv_func_ftello_works],
+ [
+ dnl Initial guess, used when cross-compiling or when /dev/tty cannot
+ dnl be opened.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris.
+ solaris*) gl_cv_func_ftello_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_ftello_works="guessing yes" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_ftello_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define TESTFILE "conftest.tmp"
+int
+main (void)
+{
+ FILE *fp;
+
+ /* Create a file with some contents. */
+ fp = fopen (TESTFILE, "w");
+ if (fp == NULL)
+ return 70;
+ if (fwrite ("foogarsh", 1, 8, fp) < 8)
+ { fclose (fp); return 71; }
+ if (fclose (fp))
+ return 72;
+
+ /* The file's contents is now "foogarsh". */
+
+ /* Try writing after reading to EOF. */
+ fp = fopen (TESTFILE, "r+");
+ if (fp == NULL)
+ return 73;
+ if (fseek (fp, -1, SEEK_END))
+ { fclose (fp); return 74; }
+ if (!(getc (fp) == 'h'))
+ { fclose (fp); return 1; }
+ if (!(getc (fp) == EOF))
+ { fclose (fp); return 2; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 3; }
+ if (!(ftell (fp) == 8))
+ { fclose (fp); return 4; }
+ if (!(putc ('!', fp) == '!'))
+ { fclose (fp); return 5; }
+ if (!(ftell (fp) == 9))
+ { fclose (fp); return 6; }
+ if (!(fclose (fp) == 0))
+ return 7;
+ fp = fopen (TESTFILE, "r");
+ if (fp == NULL)
+ return 75;
+ {
+ char buf[10];
+ if (!(fread (buf, 1, 10, fp) == 9))
+ { fclose (fp); return 10; }
+ if (!(memcmp (buf, "foogarsh!", 9) == 0))
+ { fclose (fp); return 11; }
+ }
+ if (!(fclose (fp) == 0))
+ return 12;
+
+ /* The file's contents is now "foogarsh!". */
+
+ return 0;
+}]])],
+ [gl_cv_func_ftello_works=yes],
+ [gl_cv_func_ftello_works=no], [:])
+ ])
+ case "$gl_cv_func_ftello_works" in
+ *yes) ;;
+ *)
+ REPLACE_FTELLO=1
+ AC_DEFINE([FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE], [1],
+ [Define to 1 if the system's ftello function has the Solaris bug.])
+ ;;
+ esac
+ fi
+ fi
+])
+
+# Prerequisites of lib/ftello.c.
+AC_DEFUN([gl_PREREQ_FTELLO],
+[
+ dnl Native Windows has the function _ftelli64. mingw hides it, but mingw64
+ dnl makes it usable again.
+ AC_CHECK_FUNCS([_ftelli64])
+])
diff --git a/m4/futimens.m4 b/m4/futimens.m4
new file mode 100644
index 0000000..145b8ff
--- /dev/null
+++ b/m4/futimens.m4
@@ -0,0 +1,66 @@
+# serial 9
+# See if we need to provide futimens replacement.
+
+dnl Copyright (C) 2009-2020 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.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_FUTIMENS],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([futimens])
+ if test $ac_cv_func_futimens = no; then
+ HAVE_FUTIMENS=0
+ else
+ AC_CACHE_CHECK([whether futimens works],
+ [gl_cv_func_futimens_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+]GL_MDA_DEFINES],
+ [[struct timespec ts[2];
+ int fd = creat ("conftest.file", 0600);
+ struct stat st;
+ if (fd < 0) return 1;
+ ts[0].tv_sec = 1;
+ ts[0].tv_nsec = UTIME_OMIT;
+ ts[1].tv_sec = 1;
+ ts[1].tv_nsec = UTIME_NOW;
+ errno = 0;
+ if (futimens (AT_FDCWD, NULL) == 0) return 2;
+ if (errno != EBADF) return 3;
+ if (futimens (fd, ts)) return 4;
+ sleep (1);
+ ts[0].tv_nsec = UTIME_NOW;
+ ts[1].tv_nsec = UTIME_OMIT;
+ if (futimens (fd, ts)) return 5;
+ if (fstat (fd, &st)) return 6;
+ if (st.st_ctime < st.st_atime) return 7;
+ ]])],
+ [gl_cv_func_futimens_works=yes],
+ [gl_cv_func_futimens_works=no],
+ [case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_futimens_works="guessing no" ;;
+ # Guess no on musl systems.
+ *-musl*) gl_cv_func_futimens_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_futimens_works="guessing yes" ;;
+ esac
+ ])
+ rm -f conftest.file])
+ case "$gl_cv_func_futimens_works" in
+ *yes) ;;
+ *)
+ REPLACE_FUTIMENS=1
+ ;;
+ esac
+ fi
+])
diff --git a/m4/getaddrinfo.m4 b/m4/getaddrinfo.m4
new file mode 100644
index 0000000..b932f73
--- /dev/null
+++ b/m4/getaddrinfo.m4
@@ -0,0 +1,238 @@
+# getaddrinfo.m4 serial 33
+dnl Copyright (C) 2004-2020 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.
+
+AC_DEFUN([gl_GETADDRINFO],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ AC_REQUIRE([gl_HEADER_NETDB])dnl for HAVE_NETDB_H
+ GETADDRINFO_LIB=
+ gai_saved_LIBS="$LIBS"
+
+ dnl Where is getaddrinfo()?
+ dnl - On Solaris, it is in libsocket.
+ dnl - On Haiku, it is in libnetwork.
+ dnl - On BeOS, it is in libnet.
+ dnl - On native Windows, it is in ws2_32.dll.
+ dnl - Otherwise it is in libc.
+ AC_SEARCH_LIBS([getaddrinfo], [socket network net],
+ [if test "$ac_cv_search_getaddrinfo" != "none required"; then
+ GETADDRINFO_LIB="$ac_cv_search_getaddrinfo"
+ fi])
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+
+ HAVE_GETADDRINFO=1
+ AC_CACHE_CHECK([for getaddrinfo], [gl_cv_func_getaddrinfo], [
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#include <stddef.h>
+]], [[getaddrinfo("", "", NULL, NULL);]])],
+ [gl_cv_func_getaddrinfo=yes],
+ [gl_cv_func_getaddrinfo=no])])
+ if test $gl_cv_func_getaddrinfo = no; then
+ AC_CACHE_CHECK([for getaddrinfo in ws2tcpip.h and -lws2_32],
+ gl_cv_w32_getaddrinfo, [
+ gl_cv_w32_getaddrinfo=no
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+]], [[getaddrinfo(NULL, NULL, NULL, NULL);]])], [gl_cv_w32_getaddrinfo=yes])
+ LIBS="$am_save_LIBS"
+ ])
+ if test "$gl_cv_w32_getaddrinfo" = "yes"; then
+ GETADDRINFO_LIB="-lws2_32"
+ LIBS="$gai_saved_LIBS $GETADDRINFO_LIB"
+ dnl Check for correct signature, in particular for a cdecl-compatible
+ dnl calling convention.
+ AC_CACHE_CHECK([for getaddrinfo with POSIX signature],
+ [gl_cv_func_getaddrinfo_posix_signature],
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+int getaddrinfo (const char *, const char *, const struct addrinfo *, struct addrinfo **);
+]])],
+ [gl_cv_func_getaddrinfo_posix_signature=yes],
+ [gl_cv_func_getaddrinfo_posix_signature=no])
+ ])
+ if test $gl_cv_func_getaddrinfo_posix_signature = no; then
+ REPLACE_GETADDRINFO=1
+ fi
+ else
+ HAVE_GETADDRINFO=0
+ fi
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_GETADDRINFO], [$HAVE_GETADDRINFO],
+ [Define to 1 if getaddrinfo exists, or to 0 otherwise.])
+
+ # We can't use AC_REPLACE_FUNCS here because gai_strerror may be an
+ # inline function declared in ws2tcpip.h, so we need to get that
+ # header included somehow.
+ AC_CHECK_DECLS([gai_strerror], [], [], [[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+]])
+ if test $ac_cv_have_decl_gai_strerror = yes; then
+ AC_CHECK_DECLS([gai_strerrorA], [], [], [[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+]])
+ dnl check for correct signature
+ AC_CACHE_CHECK([for gai_strerror with POSIX signature],
+ [gl_cv_func_gai_strerror_posix_signature], [
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#include <stddef.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *gai_strerror(int);]])],
+ [gl_cv_func_gai_strerror_posix_signature=yes],
+ [gl_cv_func_gai_strerror_posix_signature=no])])
+ if test $gl_cv_func_gai_strerror_posix_signature = no; then
+ REPLACE_GAI_STRERROR=1
+ fi
+ fi
+
+ LIBS="$gai_saved_LIBS"
+
+ gl_PREREQ_GETADDRINFO
+
+ AC_SUBST([GETADDRINFO_LIB])
+])
+
+# Prerequisites of lib/netdb.in.h and lib/getaddrinfo.c.
+AC_DEFUN([gl_PREREQ_GETADDRINFO], [
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ AC_REQUIRE([gl_HOSTENT]) dnl for HOSTENT_LIB
+ AC_REQUIRE([gl_SERVENT]) dnl for SERVENT_LIB
+ AC_REQUIRE([gl_FUNC_INET_NTOP]) dnl for INET_NTOP_LIB
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_SOCKET_FAMILIES])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl Including sys/socket.h is wrong for Windows, but Windows does not
+ dnl have sa_len so the result is correct anyway.
+ AC_CHECK_MEMBERS([struct sockaddr.sa_len], , , [
+#include <sys/types.h>
+#include <sys/socket.h>
+])
+
+ AC_CHECK_HEADERS_ONCE([netinet/in.h])
+
+ AC_CHECK_DECLS([getaddrinfo, freeaddrinfo, getnameinfo],,,[[
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+]])
+ if test $ac_cv_have_decl_getaddrinfo = no; then
+ HAVE_DECL_GETADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_freeaddrinfo = no; then
+ HAVE_DECL_FREEADDRINFO=0
+ fi
+ if test $ac_cv_have_decl_gai_strerror = no; then
+ HAVE_DECL_GAI_STRERROR=0
+ fi
+ if test $ac_cv_have_decl_getnameinfo = no; then
+ HAVE_DECL_GETNAMEINFO=0
+ fi
+
+ AC_CHECK_TYPES([struct addrinfo],,,[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+ if test $ac_cv_type_struct_addrinfo = no; then
+ HAVE_STRUCT_ADDRINFO=0
+ fi
+
+ dnl Append $HOSTENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $HOSTENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $HOSTENT_LIB" ;;
+ esac
+
+ dnl Append $SERVENT_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $SERVENT_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $SERVENT_LIB" ;;
+ esac
+
+ dnl Append $INET_NTOP_LIB to GETADDRINFO_LIB, avoiding gratuitous duplicates.
+ case " $GETADDRINFO_LIB " in
+ *" $INET_NTOP_LIB "*) ;;
+ *) GETADDRINFO_LIB="$GETADDRINFO_LIB $INET_NTOP_LIB" ;;
+ esac
+])
diff --git a/m4/getcwd-abort-bug.m4 b/m4/getcwd-abort-bug.m4
new file mode 100644
index 0000000..b5cf86e
--- /dev/null
+++ b/m4/getcwd-abort-bug.m4
@@ -0,0 +1,159 @@
+# serial 15
+# Determine whether getcwd aborts when the length of the working directory
+# name is unusually large. Any length between 4k and 16k trigger the bug
+# when using glibc-2.4.90-9 or older.
+
+# Copyright (C) 2006, 2009-2020 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.
+
+# From Jim Meyering
+
+# gl_FUNC_GETCWD_ABORT_BUG([ACTION-IF-BUGGY[, ACTION-IF-WORKS]])
+AC_DEFUN([gl_FUNC_GETCWD_ABORT_BUG],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_DECLS_ONCE([getcwd])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+
+ gl_CHECK_FUNC_GETPAGESIZE
+ if test $gl_cv_func_getpagesize = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_GETPAGESIZE], [1],
+ [Define to 1 if the system has the 'getpagesize' function.])
+ fi
+
+ AC_CACHE_CHECK([whether getcwd succeeds when 4k < cwd_length < 16k],
+ [gl_cv_func_getcwd_succeeds_beyond_4k],
+ [# Remove any remnants of a previous test.
+ rm -rf confdir-14B---
+ # Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir-14B---"
+ dnl Please keep this in sync with tests/test-getcwd.c.
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <direct.h>
+#endif
+#include <string.h>
+#include <sys/stat.h>
+
+]gl_PATHMAX_SNIPPET[
+]GL_MDA_DEFINES[
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* FIXME: skip the run-test altogether on systems without getpagesize. */
+#if ! HAVE_GETPAGESIZE
+# define getpagesize() 0
+#endif
+
+/* This size is chosen to be larger than PATH_MAX (4k), yet smaller than
+ the 16kB pagesize on ia64 linux. Those conditions make the code below
+ trigger a bug in glibc's getcwd implementation before 2.4.90-10. */
+#define TARGET_LEN (5 * 1024)
+
+int
+main ()
+{
+ char *cwd;
+ size_t initial_cwd_len;
+ int fail = 0;
+
+ /* The bug is triggered when PATH_MAX < getpagesize (), so skip
+ this relatively expensive and invasive test if that's not true. */
+#ifdef PATH_MAX
+ int bug_possible = PATH_MAX < getpagesize ();
+#else
+ int bug_possible = 0;
+#endif
+ if (! bug_possible)
+ return 0;
+
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ return 2;
+
+ initial_cwd_len = strlen (cwd);
+ free (cwd);
+
+ if (1)
+ {
+ static char const dir_name[] = "confdir-14B---";
+ size_t desired_depth = ((TARGET_LEN - 1 - initial_cwd_len)
+ / sizeof dir_name);
+ size_t d;
+ for (d = 0; d < desired_depth; d++)
+ {
+ if (mkdir (dir_name, S_IRWXU) < 0 || chdir (dir_name) < 0)
+ {
+ if (! (errno == ERANGE || errno == ENAMETOOLONG
+ || errno == ENOENT))
+ fail = 3; /* Unable to construct deep hierarchy. */
+ break;
+ }
+ }
+
+ /* If libc has the bug in question, this invocation of getcwd
+ results in a failed assertion. */
+ cwd = getcwd (NULL, 0);
+ if (cwd == NULL)
+ fail = 4; /* getcwd didn't assert, but it failed for a long name
+ where the answer could have been learned. */
+ free (cwd);
+
+ /* Call rmdir first, in case the above chdir failed. */
+ rmdir (dir_name);
+ while (0 < d--)
+ {
+ if (chdir ("..") < 0)
+ {
+ fail = 5;
+ break;
+ }
+ rmdir (dir_name);
+ }
+ }
+
+ return fail;
+}
+ ]])],
+ [gl_cv_func_getcwd_succeeds_beyond_4k=yes],
+ [dnl An abort will provoke an exit code of something like 134 (128 + 6).
+ dnl An exit code of 4 can also occur (in OpenBSD 6.7, NetBSD 5.1 for
+ dnl example): getcwd (NULL, 0) fails rather than returning a string
+ dnl longer than PATH_MAX. This may be POSIX compliant (in some
+ dnl interpretations of POSIX). But gnulib's getcwd module wants to
+ dnl provide a non-NULL value in this case.
+ ret=$?
+ if test $ret -ge 128 || test $ret = 4; then
+ gl_cv_func_getcwd_succeeds_beyond_4k=no
+ else
+ gl_cv_func_getcwd_succeeds_beyond_4k=yes
+ fi
+ ],
+ [case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getcwd_succeeds_beyond_4k="guessing yes" ;;
+ # Guess no otherwise, even on glibc systems.
+ *) gl_cv_func_getcwd_succeeds_beyond_4k="guessing no"
+ esac
+ ])
+ ])
+ case "$gl_cv_func_getcwd_succeeds_beyond_4k" in
+ *no)
+ $1
+ ;;
+ *)
+ $2
+ ;;
+ esac
+])
diff --git a/m4/getcwd-path-max.m4 b/m4/getcwd-path-max.m4
new file mode 100644
index 0000000..859c7de
--- /dev/null
+++ b/m4/getcwd-path-max.m4
@@ -0,0 +1,236 @@
+# serial 25
+# Check for several getcwd bugs with long file names.
+# If so, arrange to compile the wrapper function.
+
+# This is necessary for at least GNU libc on linux-2.4.19 and 2.4.20.
+# I've heard that this is due to a Linux kernel bug, and that it has
+# been fixed between 2.4.21-pre3 and 2.4.21-pre4.
+
+# Copyright (C) 2003-2007, 2009-2020 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.
+
+# From Jim Meyering
+
+AC_DEFUN([gl_FUNC_GETCWD_PATH_MAX],
+[
+ AC_CHECK_DECLS_ONCE([getcwd])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_REQUIRE([gl_PATHMAX_SNIPPET_PREREQ])
+ AC_CACHE_CHECK([whether getcwd handles long file names properly],
+ [gl_cv_func_getcwd_path_max],
+ [# Arrange for deletion of the temporary directory this test creates.
+ ac_clean_files="$ac_clean_files confdir3"
+ dnl Please keep this in sync with tests/test-getcwd.c.
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+ [[
+#include <errno.h>
+#include <stdlib.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else
+# include <direct.h>
+#endif
+#include <string.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+]gl_PATHMAX_SNIPPET[
+
+#ifndef AT_FDCWD
+# define AT_FDCWD 0
+#endif
+#ifdef ENAMETOOLONG
+# define is_ENAMETOOLONG(x) ((x) == ENAMETOOLONG)
+#else
+# define is_ENAMETOOLONG(x) 0
+#endif
+
+/* Use the getcwd function, not any macro. */
+#undef getcwd
+
+]GL_MDA_DEFINES[
+
+#ifndef S_IRWXU
+# define S_IRWXU 0700
+#endif
+
+/* The length of this name must be 8. */
+#define DIR_NAME "confdir3"
+#define DIR_NAME_LEN 8
+#define DIR_NAME_SIZE (DIR_NAME_LEN + 1)
+
+/* The length of "../". */
+#define DOTDOTSLASH_LEN 3
+
+/* Leftover bytes in the buffer, to work around library or OS bugs. */
+#define BUF_SLOP 20
+
+int
+main ()
+{
+#ifndef PATH_MAX
+ /* The Hurd doesn't define this, so getcwd can't exhibit the bug --
+ at least not on a local file system. And if we were to start worrying
+ about remote file systems, we'd have to enable the wrapper function
+ all of the time, just to be safe. That's not worth the cost. */
+ exit (0);
+#elif ((INT_MAX / (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1) \
+ - DIR_NAME_SIZE - BUF_SLOP) \
+ <= PATH_MAX)
+ /* FIXME: Assuming there's a system for which this is true,
+ this should be done in a compile test. */
+ exit (0);
+#else
+ char buf[PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN + 1)
+ + DIR_NAME_SIZE + BUF_SLOP];
+ char *cwd = getcwd (buf, PATH_MAX);
+ size_t initial_cwd_len;
+ size_t cwd_len;
+ int fail = 0;
+ size_t n_chdirs = 0;
+
+ if (cwd == NULL)
+ exit (10);
+
+ cwd_len = initial_cwd_len = strlen (cwd);
+
+ while (1)
+ {
+ size_t dotdot_max = PATH_MAX * (DIR_NAME_SIZE / DOTDOTSLASH_LEN);
+ char *c = NULL;
+
+ cwd_len += DIR_NAME_SIZE;
+ /* If mkdir or chdir fails, it could be that this system cannot create
+ any file with an absolute name longer than PATH_MAX, such as cygwin.
+ If so, leave fail as 0, because the current working directory can't
+ be too long for getcwd if it can't even be created. On Linux with
+ the 9p file system, mkdir fails with error EINVAL when cwd_len gets
+ too long; ignore this failure because the getcwd() system call
+ produces good results whereas the gnulib substitute calls getdents64
+ which fails with error EPROTO.
+ For other errors, be pessimistic and consider that as a failure,
+ too. */
+ if (mkdir (DIR_NAME, S_IRWXU) < 0 || chdir (DIR_NAME) < 0)
+ {
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ #ifdef __linux__
+ if (! (errno == EINVAL))
+ #endif
+ fail = 20;
+ break;
+ }
+
+ if (PATH_MAX <= cwd_len && cwd_len < PATH_MAX + DIR_NAME_SIZE)
+ {
+ struct stat sb;
+
+ c = getcwd (buf, PATH_MAX);
+ if (!c && errno == ENOENT)
+ {
+ fail = 11;
+ break;
+ }
+ if (c)
+ {
+ fail = 31;
+ break;
+ }
+ if (! (errno == ERANGE || is_ENAMETOOLONG (errno)))
+ {
+ fail = 21;
+ break;
+ }
+
+ /* Our replacement needs to be able to stat() long ../../paths,
+ so generate a path larger than PATH_MAX to check,
+ avoiding the replacement if we can't stat(). */
+ c = getcwd (buf, cwd_len + 1);
+ if (c && !AT_FDCWD && stat (c, &sb) != 0 && is_ENAMETOOLONG (errno))
+ {
+ fail = 32;
+ break;
+ }
+ }
+
+ if (dotdot_max <= cwd_len - initial_cwd_len)
+ {
+ if (dotdot_max + DIR_NAME_SIZE < cwd_len - initial_cwd_len)
+ break;
+ c = getcwd (buf, cwd_len + 1);
+ if (!c)
+ {
+ if (! (errno == ERANGE || errno == ENOENT
+ || is_ENAMETOOLONG (errno)))
+ {
+ fail = 22;
+ break;
+ }
+ if (AT_FDCWD || errno == ERANGE || errno == ENOENT)
+ {
+ fail = 12;
+ break;
+ }
+ }
+ }
+
+ if (c && strlen (c) != cwd_len)
+ {
+ fail = 23;
+ break;
+ }
+ ++n_chdirs;
+ }
+
+ /* Leaving behind such a deep directory is not polite.
+ So clean up here, right away, even though the driving
+ shell script would also clean up. */
+ {
+ size_t i;
+
+ /* Try rmdir first, in case the chdir failed. */
+ rmdir (DIR_NAME);
+ for (i = 0; i <= n_chdirs; i++)
+ {
+ if (chdir ("..") < 0)
+ break;
+ if (rmdir (DIR_NAME) != 0)
+ break;
+ }
+ }
+
+ exit (fail);
+#endif
+}
+ ]])],
+ [gl_cv_func_getcwd_path_max=yes],
+ [case $? in
+ 10|11|12) gl_cv_func_getcwd_path_max='no, but it is partly working';;
+ 31) gl_cv_func_getcwd_path_max='no, it has the AIX bug';;
+ 32) gl_cv_func_getcwd_path_max='yes, but with shorter paths';;
+ *) gl_cv_func_getcwd_path_max=no;;
+ esac],
+ [# Cross-compilation guesses:
+ case "$host_os" in
+ aix*) # On AIX, it has the AIX bug.
+ gl_cv_func_getcwd_path_max='guessing no, it has the AIX bug' ;;
+ gnu*) # On Hurd, it is 'yes'.
+ gl_cv_func_getcwd_path_max='guessing yes' ;;
+ linux* | kfreebsd*)
+ # On older Linux+glibc it's 'no, but it is partly working',
+ # on newer Linux+glibc it's 'yes'.
+ # On Linux+musl libc, it's 'no, but it is partly working'.
+ # On kFreeBSD+glibc, it's 'no, but it is partly working'.
+ gl_cv_func_getcwd_path_max='guessing no, but it is partly working' ;;
+ *) # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_getcwd_path_max="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+])
diff --git a/m4/getcwd.m4 b/m4/getcwd.m4
new file mode 100644
index 0000000..a646b90
--- /dev/null
+++ b/m4/getcwd.m4
@@ -0,0 +1,166 @@
+# getcwd.m4 - check for working getcwd that is compatible with glibc
+
+# Copyright (C) 2001, 2003-2007, 2009-2020 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.
+
+# Written by Paul Eggert.
+# serial 19
+
+AC_DEFUN([gl_FUNC_GETCWD_NULL],
+ [
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
+ [gl_cv_func_getcwd_null],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+# include <stdlib.h>
+# if HAVE_UNISTD_H
+# include <unistd.h>
+# else /* on Windows with MSVC */
+# include <direct.h>
+# endif
+ ]GL_MDA_DEFINES[
+# ifndef getcwd
+ char *getcwd ();
+# endif
+]], [[
+#if defined _WIN32 && ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but _getcwd does allocate.
+ However, mingw fails to honor non-zero size. */
+#else
+ if (chdir ("/") != 0)
+ return 1;
+ else
+ {
+ char *f = getcwd (NULL, 0);
+ if (! f)
+ return 2;
+ if (f[0] != '/')
+ { free (f); return 3; }
+ if (f[1] != '\0')
+ { free (f); return 4; }
+ free (f);
+ return 0;
+ }
+#endif
+ ]])],
+ [gl_cv_func_getcwd_null=yes],
+ [gl_cv_func_getcwd_null=no],
+ [[case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getcwd_null="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_getcwd_null="guessing yes";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_getcwd_null="$gl_cross_guess_normal";;
+ esac
+ ]])])
+])
+
+AC_DEFUN([gl_FUNC_GETCWD_SIGNATURE],
+[
+ AC_CACHE_CHECK([for getcwd with POSIX signature],
+ [gl_cv_func_getcwd_posix_signature],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ ]GL_MDA_DEFINES],
+ [[extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ char *getcwd (char *, size_t);
+ ]])
+ ],
+ [gl_cv_func_getcwd_posix_signature=yes],
+ [gl_cv_func_getcwd_posix_signature=no])
+ ])
+])
+
+dnl Guarantee that getcwd will malloc with a NULL first argument. Assumes
+dnl that either the system getcwd is robust, or that calling code is okay
+dnl with spurious failures when run from a directory with an absolute name
+dnl larger than 4k bytes.
+dnl
+dnl Assumes that getcwd exists; if you are worried about obsolete
+dnl platforms that lacked getcwd(), then you need to use the GPL module.
+AC_DEFUN([gl_FUNC_GETCWD_LGPL],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+ AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
+
+ case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_posix_signature in
+ *yes,yes) ;;
+ *)
+ dnl Minimal replacement lib/getcwd-lgpl.c.
+ REPLACE_GETCWD=1
+ ;;
+ esac
+])
+
+dnl Check for all known getcwd bugs; useful for a program likely to be
+dnl executed from an arbitrary location.
+AC_DEFUN([gl_FUNC_GETCWD],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+ AC_REQUIRE([gl_FUNC_GETCWD_SIGNATURE])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ gl_abort_bug=no
+ case "$host_os" in
+ mingw*)
+ gl_cv_func_getcwd_path_max=yes
+ ;;
+ *)
+ gl_FUNC_GETCWD_PATH_MAX
+ case "$gl_cv_func_getcwd_null" in
+ *yes)
+ gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes])
+ ;;
+ esac
+ ;;
+ esac
+ dnl Define HAVE_MINIMALLY_WORKING_GETCWD and HAVE_PARTLY_WORKING_GETCWD
+ dnl if appropriate.
+ case "$gl_cv_func_getcwd_path_max" in
+ *"no" | *"no, it has the AIX bug") ;;
+ *)
+ AC_DEFINE([HAVE_MINIMALLY_WORKING_GETCWD], [1],
+ [Define to 1 if getcwd minimally works, that is, its result can be
+ trusted when it succeeds.])
+ ;;
+ esac
+ case "$gl_cv_func_getcwd_path_max" in
+ *"no, but it is partly working")
+ AC_DEFINE([HAVE_PARTLY_WORKING_GETCWD], [1],
+ [Define to 1 if getcwd works, except it sometimes fails when it
+ shouldn't, setting errno to ERANGE, ENAMETOOLONG, or ENOENT.])
+ ;;
+ *"yes, but with shorter paths")
+ AC_DEFINE([HAVE_GETCWD_SHORTER], [1],
+ [Define to 1 if getcwd works, but with shorter paths
+ than is generally tested with the replacement.])
+ ;;
+ esac
+
+ if { case "$gl_cv_func_getcwd_null" in *yes) false;; *) true;; esac; } \
+ || test $gl_cv_func_getcwd_posix_signature != yes \
+ || { case "$gl_cv_func_getcwd_path_max" in *yes*) false;; *) true;; esac; } \
+ || test $gl_abort_bug = yes; then
+ REPLACE_GETCWD=1
+ fi
+])
+
+# Prerequisites of lib/getcwd.c, when full replacement is in effect.
+AC_DEFUN([gl_PREREQ_GETCWD],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_DIRENT_D_INO])
+ :
+])
diff --git a/m4/getdelim.m4 b/m4/getdelim.m4
new file mode 100644
index 0000000..ac3917b
--- /dev/null
+++ b/m4/getdelim.m4
@@ -0,0 +1,99 @@
+# getdelim.m4 serial 15
+
+dnl Copyright (C) 2005-2007, 2009-2020 Free Software Foundation, Inc.
+dnl
+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.
+
+AC_PREREQ([2.59])
+
+AC_DEFUN([gl_FUNC_GETDELIM],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <stdio.h> to declare getdelim().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([getdelim])
+
+ AC_CHECK_FUNCS_ONCE([getdelim])
+ if test $ac_cv_func_getdelim = yes; then
+ HAVE_GETDELIM=1
+ dnl Found it in some library. Verify that it works.
+ AC_CACHE_CHECK([for working getdelim function],
+ [gl_cv_func_working_getdelim],
+ [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getdelim (&line, &siz, '\n', in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ { free (line); fclose (in); return 2; }
+ free (line);
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getdelim (&line, &siz, '\n', in) == -1)
+ { fclose (in); return 3; }
+ free (line);
+ }
+ fclose (in);
+ return 0;
+ }
+ ]])],
+ [gl_cv_func_working_getdelim=yes],
+ [gl_cv_func_working_getdelim=no],
+ [dnl We're cross compiling.
+ dnl Guess it works on glibc2 systems and musl systems.
+ AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [gl_cv_func_working_getdelim="guessing yes"],
+ [case "$host_os" in
+ *-musl*) gl_cv_func_working_getdelim="guessing yes" ;;
+ *) gl_cv_func_working_getdelim="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ ])
+ case "$gl_cv_func_working_getdelim" in
+ *yes) ;;
+ *) REPLACE_GETDELIM=1 ;;
+ esac
+ else
+ HAVE_GETDELIM=0
+ fi
+
+ if test $ac_cv_have_decl_getdelim = no; then
+ HAVE_DECL_GETDELIM=0
+ fi
+])
+
+# Prerequisites of lib/getdelim.c.
+AC_DEFUN([gl_PREREQ_GETDELIM],
+[
+ AC_CHECK_FUNCS([flockfile funlockfile])
+ AC_CHECK_DECLS([getc_unlocked])
+])
diff --git a/m4/getdtablesize.m4 b/m4/getdtablesize.m4
new file mode 100644
index 0000000..af32864
--- /dev/null
+++ b/m4/getdtablesize.m4
@@ -0,0 +1,63 @@
+# getdtablesize.m4 serial 8
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_GETDTABLESIZE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([getdtablesize])
+ AC_CHECK_DECLS_ONCE([getdtablesize])
+ if test $ac_cv_func_getdtablesize = yes &&
+ test $ac_cv_have_decl_getdtablesize = yes; then
+ AC_CACHE_CHECK([whether getdtablesize works],
+ [gl_cv_func_getdtablesize_works],
+ [dnl There are two concepts: the "maximum possible file descriptor value + 1"
+ dnl and the "maximum number of open file descriptors in a process".
+ dnl Per SUSv2 and POSIX, getdtablesize() should return the first one.
+ dnl On most platforms, the first and the second concept are the same.
+ dnl On OpenVMS, however, they are different and getdtablesize() returns
+ dnl the second one; thus the test below fails. But we don't care
+ dnl because there's no good way to write a replacement getdtablesize().
+ case "$host_os" in
+ vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
+ *)
+ dnl Cygwin 1.7.25 automatically increases the RLIMIT_NOFILE soft
+ dnl limit up to an unchangeable hard limit; all other platforms
+ dnl correctly require setrlimit before getdtablesize() can report
+ dnl a larger value.
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM(
+ [[#include <unistd.h>]
+ GL_MDA_DEFINES
+ ],
+ [[int size = getdtablesize();
+ if (dup2 (0, getdtablesize()) != -1)
+ return 1;
+ if (size != getdtablesize())
+ return 2;
+ ]])],
+ [gl_cv_func_getdtablesize_works=yes],
+ [gl_cv_func_getdtablesize_works=no],
+ [case "$host_os" in
+ cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
+ gl_cv_func_getdtablesize_works="guessing no" ;;
+ *) gl_cv_func_getdtablesize_works="guessing yes" ;;
+ esac
+ ])
+ ;;
+ esac
+ ])
+ case "$gl_cv_func_getdtablesize_works" in
+ *yes | "no (limitation)") ;;
+ *) REPLACE_GETDTABLESIZE=1 ;;
+ esac
+ else
+ HAVE_GETDTABLESIZE=0
+ fi
+])
+
+# Prerequisites of lib/getdtablesize.c.
+AC_DEFUN([gl_PREREQ_GETDTABLESIZE], [:])
diff --git a/m4/getgroups.m4 b/m4/getgroups.m4
new file mode 100644
index 0000000..e344162
--- /dev/null
+++ b/m4/getgroups.m4
@@ -0,0 +1,110 @@
+# serial 24
+
+dnl From Jim Meyering.
+dnl A wrapper around AC_FUNC_GETGROUPS.
+
+# Copyright (C) 1996-1997, 1999-2004, 2008-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This is taken from the following Autoconf patch:
+# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=7fbb553727ed7e0e689a17594b58559ecf3ea6e9
+AC_DEFUN([AC_FUNC_GETGROUPS],
+[
+ AC_REQUIRE([AC_TYPE_GETGROUPS])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+ AC_CHECK_FUNC([getgroups])
+
+ # If we don't yet have getgroups, see if it's in -lbsd.
+ # This is reported to be necessary on an ITOS 3000WS running SEIUX 3.1.
+ ac_save_LIBS=$LIBS
+ if test $ac_cv_func_getgroups = no; then
+ AC_CHECK_LIB(bsd, getgroups, [GETGROUPS_LIB=-lbsd])
+ fi
+
+ # Run the program to test the functionality of the system-supplied
+ # getgroups function only if there is such a function.
+ if test $ac_cv_func_getgroups = yes; then
+ AC_CACHE_CHECK([for working getgroups], [ac_cv_func_getgroups_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT],
+ [[/* On NeXTstep 3.2, getgroups (0, 0) always fails. */
+ return getgroups (0, 0) == -1;]])
+ ],
+ [ac_cv_func_getgroups_works=yes],
+ [ac_cv_func_getgroups_works=no],
+ [case "$host_os" in # ((
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) ac_cv_func_getgroups_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) ac_cv_func_getgroups_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) ac_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ else
+ ac_cv_func_getgroups_works=no
+ fi
+ case "$ac_cv_func_getgroups_works" in
+ *yes)
+ AC_DEFINE([HAVE_GETGROUPS], [1],
+ [Define to 1 if your system has a working `getgroups' function.])
+ ;;
+ esac
+ LIBS=$ac_save_LIBS
+])# AC_FUNC_GETGROUPS
+
+AC_DEFUN([gl_FUNC_GETGROUPS],
+[
+ AC_REQUIRE([AC_TYPE_GETGROUPS])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_FUNC_GETGROUPS
+ if test $ac_cv_func_getgroups != yes; then
+ HAVE_GETGROUPS=0
+ else
+ if test "$ac_cv_type_getgroups" != gid_t \
+ || { case "$ac_cv_func_getgroups_works" in
+ *yes) false;;
+ *) true;;
+ esac
+ }; then
+ REPLACE_GETGROUPS=1
+ AC_DEFINE([GETGROUPS_ZERO_BUG], [1], [Define this to 1 if
+ getgroups(0,NULL) does not return the number of groups.])
+ else
+ dnl Detect Mac OS X and FreeBSD bug; POSIX requires getgroups(-1,ptr)
+ dnl to fail.
+ AC_CACHE_CHECK([whether getgroups handles negative values],
+ [gl_cv_func_getgroups_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT],
+ [[int size = getgroups (0, 0);
+ gid_t *list = malloc (size * sizeof *list);
+ int result = getgroups (-1, list) != -1;
+ free (list);
+ return result;]])],
+ [gl_cv_func_getgroups_works=yes],
+ [gl_cv_func_getgroups_works=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_getgroups_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_getgroups_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_getgroups_works="$gl_cross_guess_normal" ;;
+ esac
+ ])])
+ case "$gl_cv_func_getgroups_works" in
+ *yes) ;;
+ *) REPLACE_GETGROUPS=1 ;;
+ esac
+ fi
+ fi
+ test -n "$GETGROUPS_LIB" && LIBS="$GETGROUPS_LIB $LIBS"
+])
diff --git a/m4/getline.m4 b/m4/getline.m4
new file mode 100644
index 0000000..0609f1d
--- /dev/null
+++ b/m4/getline.m4
@@ -0,0 +1,109 @@
+# getline.m4 serial 30
+
+dnl Copyright (C) 1998-2003, 2005-2007, 2009-2020 Free Software Foundation,
+dnl Inc.
+dnl
+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.
+
+AC_PREREQ([2.59])
+
+dnl See if there's a working, system-supplied version of the getline function.
+dnl We can't just do AC_REPLACE_FUNCS([getline]) because some systems
+dnl have a function by that name in -linet that doesn't have anything
+dnl to do with the function we need.
+AC_DEFUN([gl_FUNC_GETLINE],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <stdio.h> to declare getline().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([getline])
+
+ gl_getline_needs_run_time_check=no
+ AC_CHECK_FUNC([getline],
+ [dnl Found it in some library. Verify that it works.
+ gl_getline_needs_run_time_check=yes],
+ [am_cv_func_working_getline=no])
+ if test $gl_getline_needs_run_time_check = yes; then
+ AC_CACHE_CHECK([for working getline function],
+ [am_cv_func_working_getline],
+ [echo fooNbarN | tr -d '\012' | tr N '\012' > conftest.data
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+ int main ()
+ {
+ FILE *in = fopen ("./conftest.data", "r");
+ if (!in)
+ return 1;
+ {
+ /* Test result for a NULL buffer and a zero size.
+ Based on a test program from Karl Heuer. */
+ char *line = NULL;
+ size_t siz = 0;
+ int len = getline (&line, &siz, in);
+ if (!(len == 4 && line && strcmp (line, "foo\n") == 0))
+ { free (line); fclose (in); return 2; }
+ free (line);
+ }
+ {
+ /* Test result for a NULL buffer and a non-zero size.
+ This crashes on FreeBSD 8.0. */
+ char *line = NULL;
+ size_t siz = (size_t)(~0) / 4;
+ if (getline (&line, &siz, in) == -1)
+ { fclose (in); return 3; }
+ free (line);
+ }
+ fclose (in);
+ return 0;
+ }
+ ]])],
+ [am_cv_func_working_getline=yes],
+ [am_cv_func_working_getline=no],
+ [dnl We're cross compiling.
+ dnl Guess it works on glibc2 systems and musl systems.
+ AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [am_cv_func_working_getline="guessing yes"],
+ [case "$host_os" in
+ *-musl*) am_cv_func_working_getline="guessing yes" ;;
+ *) am_cv_func_working_getline="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ ])
+ fi
+
+ if test $ac_cv_have_decl_getline = no; then
+ HAVE_DECL_GETLINE=0
+ fi
+
+ case "$am_cv_func_working_getline" in
+ *yes) ;;
+ *)
+ dnl Set REPLACE_GETLINE always: Even if we have not found the broken
+ dnl getline function among $LIBS, it may exist in libinet and the
+ dnl executable may be linked with -linet.
+ REPLACE_GETLINE=1
+ ;;
+ esac
+])
+
+# Prerequisites of lib/getline.c.
+AC_DEFUN([gl_PREREQ_GETLINE],
+[
+ :
+])
diff --git a/m4/getopt.m4 b/m4/getopt.m4
new file mode 100644
index 0000000..595483d
--- /dev/null
+++ b/m4/getopt.m4
@@ -0,0 +1,381 @@
+# getopt.m4 serial 47
+dnl Copyright (C) 2002-2006, 2008-2020 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.
+
+# Request a POSIX compliant getopt function.
+AC_DEFUN([gl_FUNC_GETOPT_POSIX],
+[
+ m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX])
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
+ dnl Other modules can request the gnulib implementation of the getopt
+ dnl functions unconditionally, by defining gl_REPLACE_GETOPT_ALWAYS.
+ dnl argp.m4 does this.
+ m4_ifdef([gl_REPLACE_GETOPT_ALWAYS], [
+ REPLACE_GETOPT=1
+ ], [
+ REPLACE_GETOPT=0
+ if test -n "$gl_replace_getopt"; then
+ REPLACE_GETOPT=1
+ fi
+ ])
+ if test $REPLACE_GETOPT = 1; then
+ dnl Arrange for getopt.h to be created.
+ gl_GETOPT_SUBSTITUTE_HEADER
+ fi
+])
+
+# Request a POSIX compliant getopt function with GNU extensions (such as
+# options with optional arguments) and the functions getopt_long,
+# getopt_long_only.
+AC_DEFUN([gl_FUNC_GETOPT_GNU],
+[
+ dnl Set the variable gl_getopt_required, so that all invocations of
+ dnl gl_GETOPT_CHECK_HEADERS in the scope of the current configure file
+ dnl will check for getopt with GNU extensions.
+ dnl This means that if one gnulib-tool invocation requests getopt-posix
+ dnl and another gnulib-tool invocation requests getopt-gnu, it is as if
+ dnl both had requested getopt-gnu.
+ m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU])
+
+ dnl No need to invoke gl_FUNC_GETOPT_POSIX here; this is automatically
+ dnl done through the module dependency getopt-gnu -> getopt-posix.
+])
+
+# Determine whether to replace the entire getopt facility.
+AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([AC_PROG_AWK]) dnl for awk that supports ENVIRON
+
+ dnl Persuade Solaris <unistd.h> to declare optarg, optind, opterr, optopt.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ gl_CHECK_NEXT_HEADERS([getopt.h])
+ if test $ac_cv_header_getopt_h = yes; then
+ HAVE_GETOPT_H=1
+ else
+ HAVE_GETOPT_H=0
+ fi
+ AC_SUBST([HAVE_GETOPT_H])
+
+ gl_replace_getopt=
+
+ dnl Test whether <getopt.h> is available.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes])
+ fi
+
+ dnl Test whether the function getopt_long is available.
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
+ fi
+
+ dnl POSIX 2008 does not specify leading '+' behavior, but see
+ dnl http://austingroupbugs.net/view.php?id=191 for a recommendation on
+ dnl the next version of POSIX. For now, we only guarantee leading '+'
+ dnl behavior with getopt-gnu.
+ if test -z "$gl_replace_getopt"; then
+ AC_CACHE_CHECK([whether getopt is POSIX compatible],
+ [gl_cv_func_getopt_posix],
+ [
+ dnl Merging these three different test programs into a single one
+ dnl would require a reset mechanism. On BSD systems, it can be done
+ dnl through 'optreset'; on some others (glibc), it can be done by
+ dnl setting 'optind' to 0; on others again (HP-UX, IRIX, OSF/1,
+ dnl Solaris 9, musl libc), there is no such mechanism.
+ if test $cross_compiling = no; then
+ dnl Sanity check. Succeeds everywhere (except on MSVC,
+ dnl which lacks <unistd.h> and getopt() entirely).
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char a[] = "-a";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, a, foo, bar, NULL };
+ int c;
+
+ c = getopt (4, argv, "ab");
+ if (!(c == 'a'))
+ return 1;
+ c = getopt (4, argv, "ab");
+ if (!(c == -1))
+ return 2;
+ if (!(optind == 2))
+ return 3;
+ return 0;
+}
+]])],
+ [gl_cv_func_getopt_posix=maybe],
+ [gl_cv_func_getopt_posix=no])
+ if test $gl_cv_func_getopt_posix = maybe; then
+ dnl Sanity check with '+'. Succeeds everywhere (except on MSVC,
+ dnl which lacks <unistd.h> and getopt() entirely).
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char donald[] = "donald";
+ static char p[] = "-p";
+ static char billy[] = "billy";
+ static char duck[] = "duck";
+ static char a[] = "-a";
+ static char bar[] = "bar";
+ char *argv[] = { program, donald, p, billy, duck, a, bar, NULL };
+ int c;
+
+ c = getopt (7, argv, "+abp:q:");
+ if (!(c == -1))
+ return 4;
+ if (!(strcmp (argv[0], "program") == 0))
+ return 5;
+ if (!(strcmp (argv[1], "donald") == 0))
+ return 6;
+ if (!(strcmp (argv[2], "-p") == 0))
+ return 7;
+ if (!(strcmp (argv[3], "billy") == 0))
+ return 8;
+ if (!(strcmp (argv[4], "duck") == 0))
+ return 9;
+ if (!(strcmp (argv[5], "-a") == 0))
+ return 10;
+ if (!(strcmp (argv[6], "bar") == 0))
+ return 11;
+ if (!(optind == 1))
+ return 12;
+ return 0;
+}
+]])],
+ [gl_cv_func_getopt_posix=maybe],
+ [gl_cv_func_getopt_posix=no])
+ fi
+ if test $gl_cv_func_getopt_posix = maybe; then
+ dnl Detect Mac OS X 10.5, AIX 7.1, mingw bug.
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main ()
+{
+ static char program[] = "program";
+ static char ab[] = "-ab";
+ char *argv[3] = { program, ab, NULL };
+ if (getopt (2, argv, "ab:") != 'a')
+ return 13;
+ if (getopt (2, argv, "ab:") != '?')
+ return 14;
+ if (optopt != 'b')
+ return 15;
+ if (optind != 2)
+ return 16;
+ return 0;
+}
+]])],
+ [gl_cv_func_getopt_posix=yes],
+ [gl_cv_func_getopt_posix=no])
+ fi
+ else
+ case "$host_os" in
+ darwin* | aix* | mingw*) gl_cv_func_getopt_posix="guessing no";;
+ *) gl_cv_func_getopt_posix="guessing yes";;
+ esac
+ fi
+ ])
+ case "$gl_cv_func_getopt_posix" in
+ *no) gl_replace_getopt=yes ;;
+ esac
+ fi
+
+ if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
+ AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
+ [# Even with POSIXLY_CORRECT, the GNU extension of leading '-' in the
+ # optstring is necessary for programs like m4 that have POSIX-mandated
+ # semantics for supporting options interspersed with files.
+ # Also, since getopt_long is a GNU extension, we require optind=0.
+ # Bash ties 'set -o posix' to a non-exported POSIXLY_CORRECT;
+ # so take care to revert to the correct (non-)export state.
+dnl GNU Coding Standards currently allow awk but not env; besides, env
+dnl is ambiguous with environment values that contain newlines.
+ gl_awk_probe='BEGIN { if ("POSIXLY_CORRECT" in ENVIRON) print "x" }'
+ case ${POSIXLY_CORRECT+x}`$AWK "$gl_awk_probe" </dev/null` in
+ xx) gl_had_POSIXLY_CORRECT=exported ;;
+ x) gl_had_POSIXLY_CORRECT=yes ;;
+ *) gl_had_POSIXLY_CORRECT= ;;
+ esac
+ POSIXLY_CORRECT=1
+ export POSIXLY_CORRECT
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+ ]GL_NOCRASH[
+ ]], [[
+ int result = 0;
+
+ nocrash_init();
+
+ /* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
+ and fails on Mac OS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
+ OSF/1 5.1, Solaris 10. */
+ {
+ static char conftest[] = "conftest";
+ static char plus[] = "-+";
+ char *argv[3] = { conftest, plus, NULL };
+ opterr = 0;
+ if (getopt (2, argv, "+a") != '?')
+ result |= 1;
+ }
+ /* This code succeeds on glibc 2.8, mingw,
+ and fails on Mac OS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
+ IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x. */
+ {
+ static char program[] = "program";
+ static char p[] = "-p";
+ static char foo[] = "foo";
+ static char bar[] = "bar";
+ char *argv[] = { program, p, foo, bar, NULL };
+
+ optind = 1;
+ if (getopt (4, argv, "p::") != 'p')
+ result |= 2;
+ else if (optarg != NULL)
+ result |= 4;
+ else if (getopt (4, argv, "p::") != -1)
+ result |= 6;
+ else if (optind != 2)
+ result |= 8;
+ }
+ /* This code succeeds on glibc 2.8 and fails on Cygwin 1.7.0. */
+ {
+ static char program[] = "program";
+ static char foo[] = "foo";
+ static char p[] = "-p";
+ char *argv[] = { program, foo, p, NULL };
+ optind = 0;
+ if (getopt (3, argv, "-p") != 1)
+ result |= 16;
+ else if (getopt (3, argv, "-p") != 'p')
+ result |= 16;
+ }
+ /* This code fails on glibc 2.11. */
+ {
+ static char program[] = "program";
+ static char b[] = "-b";
+ static char a[] = "-a";
+ char *argv[] = { program, b, a, NULL };
+ optind = opterr = 0;
+ if (getopt (3, argv, "+:a:b") != 'b')
+ result |= 32;
+ else if (getopt (3, argv, "+:a:b") != ':')
+ result |= 32;
+ }
+ /* This code dumps core on glibc 2.14. */
+ {
+ static char program[] = "program";
+ static char w[] = "-W";
+ static char dummy[] = "dummy";
+ char *argv[] = { program, w, dummy, NULL };
+ optind = opterr = 1;
+ if (getopt (3, argv, "W;") != 'W')
+ result |= 64;
+ }
+ return result;
+ ]])],
+ [gl_cv_func_getopt_gnu=yes],
+ [gl_cv_func_getopt_gnu=no],
+ [dnl Cross compiling.
+ dnl Assume the worst, even on glibc platforms.
+ dnl But obey --enable-cross-guesses.
+ gl_cv_func_getopt_gnu="$gl_cross_guess_normal"
+ ])
+ case $gl_had_POSIXLY_CORRECT in
+ exported) ;;
+ yes) AS_UNSET([POSIXLY_CORRECT]); POSIXLY_CORRECT=1 ;;
+ *) AS_UNSET([POSIXLY_CORRECT]) ;;
+ esac
+ ])
+ if test "$gl_cv_func_getopt_gnu" != yes; then
+ gl_replace_getopt=yes
+ else
+ AC_CACHE_CHECK([for working GNU getopt_long function],
+ [gl_cv_func_getopt_long_gnu],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <getopt.h>
+ #include <stddef.h>
+ #include <string.h>
+ ]],
+ [[static const struct option long_options[] =
+ {
+ { "xtremely-",no_argument, NULL, 1003 },
+ { "xtra", no_argument, NULL, 1001 },
+ { "xtreme", no_argument, NULL, 1002 },
+ { "xtremely", no_argument, NULL, 1003 },
+ { NULL, 0, NULL, 0 }
+ };
+ /* This code fails on OpenBSD 5.0. */
+ {
+ static char program[] = "program";
+ static char xtremel[] = "--xtremel";
+ char *argv[] = { program, xtremel, NULL };
+ int option_index;
+ optind = 1; opterr = 0;
+ if (getopt_long (2, argv, "", long_options, &option_index) != 1003)
+ return 1;
+ }
+ return 0;
+ ]])],
+ [gl_cv_func_getopt_long_gnu=yes],
+ [gl_cv_func_getopt_long_gnu=no],
+ [dnl Cross compiling. Guess no on OpenBSD, yes otherwise.
+ case "$host_os" in
+ openbsd*) gl_cv_func_getopt_long_gnu="guessing no";;
+ *) gl_cv_func_getopt_long_gnu="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_getopt_long_gnu" in
+ *yes) ;;
+ *) gl_replace_getopt=yes ;;
+ esac
+ fi
+ fi
+])
+
+AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
+[
+ AC_CHECK_HEADERS_ONCE([sys/cdefs.h])
+ if test $ac_cv_header_sys_cdefs_h = yes; then
+ HAVE_SYS_CDEFS_H=1
+ else
+ HAVE_SYS_CDEFS_H=0
+ fi
+ AC_SUBST([HAVE_SYS_CDEFS_H])
+
+ AC_DEFINE([__GETOPT_PREFIX], [[rpl_]],
+ [Define to rpl_ if the getopt replacement functions and variables
+ should be used.])
+ GETOPT_H=getopt.h
+ GETOPT_CDEFS_H=getopt-cdefs.h
+ AC_SUBST([GETOPT_H])
+ AC_SUBST([GETOPT_CDEFS_H])
+])
diff --git a/m4/getpagesize.m4 b/m4/getpagesize.m4
new file mode 100644
index 0000000..8f0f046
--- /dev/null
+++ b/m4/getpagesize.m4
@@ -0,0 +1,49 @@
+# getpagesize.m4 serial 10
+dnl Copyright (C) 2002, 2004-2005, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_GETPAGESIZE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ gl_CHECK_FUNC_GETPAGESIZE
+ if test $gl_cv_func_getpagesize = no; then
+ HAVE_GETPAGESIZE=0
+ AC_CHECK_HEADERS([OS.h])
+ if test $ac_cv_header_OS_h = yes; then
+ HAVE_OS_H=1
+ fi
+ AC_CHECK_HEADERS([sys/param.h])
+ if test $ac_cv_header_sys_param_h = yes; then
+ HAVE_SYS_PARAM_H=1
+ fi
+ fi
+ case "$host_os" in
+ mingw*)
+ REPLACE_GETPAGESIZE=1
+ ;;
+ esac
+ dnl Also check whether it's declared.
+ dnl mingw has getpagesize() in libgcc.a but doesn't declare it.
+ AC_CHECK_DECL([getpagesize], , [HAVE_DECL_GETPAGESIZE=0])
+])
+
+dnl Tests whether the function getpagesize() exists.
+dnl Sets gl_cv_func_getpagesize.
+AC_DEFUN([gl_CHECK_FUNC_GETPAGESIZE],
+[
+ dnl We can't use AC_CHECK_FUNC here, because getpagesize() is defined as a
+ dnl static inline function when compiling for Android 4.4 or older.
+ AC_CACHE_CHECK([for getpagesize], [gl_cv_func_getpagesize],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>]],
+ [[return getpagesize();]])
+ ],
+ [gl_cv_func_getpagesize=yes],
+ [gl_cv_func_getpagesize=no])
+ ])
+])
diff --git a/m4/getpass.m4 b/m4/getpass.m4
new file mode 100644
index 0000000..a2262c4
--- /dev/null
+++ b/m4/getpass.m4
@@ -0,0 +1,106 @@
+# getpass.m4 serial 16
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 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.
+
+# Provide a getpass() function if the system doesn't have it.
+AC_DEFUN_ONCE([gl_FUNC_GETPASS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade Solaris <unistd.h> and <stdlib.h> to declare getpass().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([getpass])
+ if test $ac_cv_func_getpass = no; then
+ HAVE_GETPASS=0
+ fi
+])
+
+# Provide the GNU getpass() implementation. It supports passwords of
+# arbitrary length (not just 8 bytes as on HP-UX).
+AC_DEFUN([gl_FUNC_GETPASS_GNU],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_GETPASS])
+
+ if test $ac_cv_func_getpass = yes; then
+ AC_CACHE_CHECK([for getpass without length limitations],
+ [gl_cv_func_getpass_good],
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ [gl_cv_func_getpass_good=yes],
+ [gl_cv_func_getpass_good=no])
+ ])
+ if test $gl_cv_func_getpass_good != yes; then
+ REPLACE_GETPASS=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/getpass.c.
+AC_DEFUN([gl_PREREQ_GETPASS], [
+ AC_CHECK_HEADERS_ONCE([stdio_ext.h termios.h])
+ AC_CHECK_FUNCS_ONCE([__fsetlocking])
+ AC_CHECK_DECLS([__fsetlocking],,,
+ [[#include <stdio.h>
+ #if HAVE_STDIO_EXT_H
+ #include <stdio_ext.h>
+ #endif]])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([flockfile])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([funlockfile])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+
+ dnl We can't use AC_CHECK_FUNC here, because tcgetattr() is defined as a
+ dnl static inline function when compiling for Android 4.4 or older.
+ AC_CACHE_CHECK([for tcgetattr], [gl_cv_func_tcgetattr],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <termios.h>
+ struct termios x;
+ ]],
+ [[return tcgetattr(0,&x);]])
+ ],
+ [gl_cv_func_tcgetattr=yes],
+ [gl_cv_func_tcgetattr=no])
+ ])
+ if test $gl_cv_func_tcgetattr = yes; then
+ HAVE_TCGETATTR=1
+ else
+ HAVE_TCGETATTR=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_TCGETATTR], [$HAVE_TCGETATTR],
+ [Define to 1 if the system has the 'tcgetattr' function.])
+
+ dnl We can't use AC_CHECK_FUNC here, because tcsetattr() is defined as a
+ dnl static inline function when compiling for Android 4.4 or older.
+ AC_CACHE_CHECK([for tcsetattr], [gl_cv_func_tcsetattr],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <termios.h>
+ struct termios x;
+ ]],
+ [[return tcsetattr(0,0,&x);]])
+ ],
+ [gl_cv_func_tcsetattr=yes],
+ [gl_cv_func_tcsetattr=no])
+ ])
+ if test $gl_cv_func_tcsetattr = yes; then
+ HAVE_TCSETATTR=1
+ else
+ HAVE_TCSETATTR=0
+ fi
+ AC_DEFINE_UNQUOTED([HAVE_TCSETATTR], [$HAVE_TCSETATTR],
+ [Define to 1 if the system has the 'tcsetattr' function.])
+])
diff --git a/m4/getprogname.m4 b/m4/getprogname.m4
new file mode 100644
index 0000000..6baefc9
--- /dev/null
+++ b/m4/getprogname.m4
@@ -0,0 +1,43 @@
+# getprogname.m4 - check for getprogname or replacements for it
+
+# Copyright (C) 2016-2020 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
+
+AC_DEFUN([gl_FUNC_GETPROGNAME],
+[
+ AC_CHECK_FUNCS_ONCE([getprogname getexecname])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ ac_found=0
+ AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [],
+ [#include <errno.h>])
+ AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [],
+ [#include <errno.h>])
+ AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include <stdlib.h>])
+
+ # Incur the cost of this test only if none of the above worked.
+ if test $ac_found = 0; then
+ # On OpenBSD 5.1, using the global __progname variable appears to be
+ # the only way to implement getprogname.
+ AC_CACHE_CHECK([whether __progname is defined in default libraries],
+ [gl_cv_var___progname],
+ [
+ gl_cv_var___progname=
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[extern char *__progname;]],
+ [[return *__progname;]]
+ )],
+ [gl_cv_var___progname=yes]
+ )
+ ]
+ )
+ if test "$gl_cv_var___progname" = yes; then
+ AC_DEFINE([HAVE_VAR___PROGNAME], 1,
+ [Define if you have a global __progname variable])
+ fi
+ fi
+])
diff --git a/m4/getrandom.m4 b/m4/getrandom.m4
new file mode 100644
index 0000000..d6da71a
--- /dev/null
+++ b/m4/getrandom.m4
@@ -0,0 +1,68 @@
+# getrandom.m4 serial 8
+dnl Copyright 2020 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 Written by Paul Eggert.
+
+AC_DEFUN([gl_FUNC_GETRANDOM],
+[
+ AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([getrandom])
+ if test "$ac_cv_func_getrandom" != yes; then
+ HAVE_GETRANDOM=0
+ else
+ dnl On Solaris 11.4 the return type is 'int', not 'ssize_t'.
+ AC_CACHE_CHECK([whether getrandom is compatible with its GNU+BSD signature],
+ [gl_cv_func_getrandom_ok],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* Additional includes are needed before <sys/random.h> on uClibc
+ and Mac OS X. */
+ #include <sys/types.h>
+ #include <stdlib.h>
+ #include <sys/random.h>
+ ssize_t getrandom (void *, size_t, unsigned int);
+ ]],
+ [[]])
+ ],
+ [gl_cv_func_getrandom_ok=yes],
+ [gl_cv_func_getrandom_ok=no])
+ ])
+ if test $gl_cv_func_getrandom_ok = no; then
+ REPLACE_GETRANDOM=1
+ fi
+ fi
+
+ case "$host_os" in
+ mingw*)
+ AC_CHECK_HEADERS([bcrypt.h], [], [],
+ [[#include <windows.h>
+ ]])
+ AC_CACHE_CHECK([whether the bcrypt library is guaranteed to be present],
+ [gl_cv_lib_assume_bcrypt],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <windows.h>]],
+ [[#if !(_WIN32_WINNT >= _WIN32_WINNT_WIN7)
+ cannot assume it
+ #endif
+ ]])
+ ],
+ [gl_cv_lib_assume_bcrypt=yes],
+ [gl_cv_lib_assume_bcrypt=no])
+ ])
+ if test $gl_cv_lib_assume_bcrypt = yes; then
+ AC_DEFINE([HAVE_LIB_BCRYPT], [1],
+ [Define to 1 if the bcrypt library is guaranteed to be present.])
+ LIB_GETRANDOM='-lbcrypt'
+ else
+ LIB_GETRANDOM='-ladvapi32'
+ fi
+ ;;
+ *)
+ LIB_GETRANDOM= ;;
+ esac
+ AC_SUBST([LIB_GETRANDOM])
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644
index 0000000..be247bf
--- /dev/null
+++ b/m4/gettext.m4
@@ -0,0 +1,401 @@
+# 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.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl 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, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+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
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ 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
+])])])])
+ define([gt_included_intl],
+ ifelse([$1], [external],
+ ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+ [yes]))
+ define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+ gt_NEEDS_INIT
+ AM_GNU_GETTEXT_NEED([$2])
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ dnl Ideally we would do this search only after the
+ dnl if test "$USE_NLS" = "yes"; then
+ dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+ dnl the configure script would need to contain the same shell code
+ dnl again, outside any 'if'. There are two solutions:
+ dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+ dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+ dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+ dnl documented, we avoid it.
+ ifelse(gt_included_intl, yes, , [
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+ ])
+
+ dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+ gt_INTL_MACOSX
+
+ dnl Set USE_NLS.
+ AC_REQUIRE([AM_NLS])
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl Add a version number to the cache macros.
+ case " $gt_needs " in
+ *" need-formatstring-macros "*) gt_api_version=3 ;;
+ *" need-ngettext "*) gt_api_version=2 ;;
+ *) gt_api_version=1 ;;
+ esac
+ gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+ gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ 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])
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ if test $gt_api_version -ge 3; then
+ gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+ else
+ gt_revision_test_code=
+ fi
+ if test $gt_api_version -ge 2; then
+ gt_expression_test_code=' + * ngettext ("", "", 0)'
+ else
+ gt_expression_test_code=
+ fi
+
+ AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+ [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
+ ]])],
+ [eval "$gt_func_gnugettext_libc=yes"],
+ [eval "$gt_func_gnugettext_libc=no"])])
+
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ [$gt_func_gnugettext_libintl],
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ 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 ("")
+ ]])],
+ [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_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"
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+ && test "$PACKAGE" != gettext-runtime \
+ && test "$PACKAGE" != gettext-tools; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ CATOBJEXT=
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test -n "$INTL_MACOSX_LIBS"; then
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Some extra flags are needed during linking.
+ LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+ LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+ fi
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE([ENABLE_NLS], [1],
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ AC_MSG_CHECKING([whether to use NLS])
+ AC_MSG_RESULT([$USE_NLS])
+ if test "$USE_NLS" = "yes"; then
+ AC_MSG_CHECKING([where the gettext function comes from])
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ gt_source="external libintl"
+ else
+ gt_source="libc"
+ fi
+ else
+ gt_source="included intl directory"
+ fi
+ AC_MSG_RESULT([$gt_source])
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE([HAVE_GETTEXT], [1],
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE([HAVE_DCGETTEXT], [1],
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ 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=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST([DATADIRNAME])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST([INSTOBJEXT])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=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])
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST([INTLLIBS])
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+ m4_divert_text([DEFAULTS], [gt_needs=])
+ m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/m4/gettime.m4 b/m4/gettime.m4
new file mode 100644
index 0000000..e65455a
--- /dev/null
+++ b/m4/gettime.m4
@@ -0,0 +1,13 @@
+# gettime.m4 serial 9
+dnl Copyright (C) 2002, 2004-2006, 2009-2020 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.
+
+AC_DEFUN([gl_GETTIME],
+[
+ dnl Prerequisites of lib/gettime.c.
+ AC_REQUIRE([gl_CLOCK_TIME])
+ AC_REQUIRE([gl_TIMESPEC])
+ AC_CHECK_FUNCS_ONCE([gettimeofday])
+])
diff --git a/m4/gettimeofday.m4 b/m4/gettimeofday.m4
new file mode 100644
index 0000000..578ed49
--- /dev/null
+++ b/m4/gettimeofday.m4
@@ -0,0 +1,69 @@
+# serial 28
+
+# Copyright (C) 2001-2003, 2005, 2007, 2009-2020 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.
+
+dnl From Jim Meyering.
+
+AC_DEFUN([gl_FUNC_GETTIMEOFDAY],
+[
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H])
+ AC_CHECK_FUNCS_ONCE([gettimeofday])
+
+ gl_gettimeofday_timezone=void
+ if test $ac_cv_func_gettimeofday != yes; then
+ HAVE_GETTIMEOFDAY=0
+ else
+ AC_CACHE_CHECK([for gettimeofday with POSIX signature],
+ [gl_cv_func_gettimeofday_posix_signature],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+ struct timeval c;
+ int gettimeofday (struct timeval *restrict, void *restrict);
+ ]],
+ [[/* glibc uses struct timezone * rather than the POSIX void *
+ if _GNU_SOURCE is defined. However, since the only portable
+ use of gettimeofday uses NULL as the second parameter, and
+ since the glibc definition is actually more typesafe, it is
+ not worth wrapping this to get a compliant signature. */
+ int (*f) (struct timeval *restrict, void *restrict)
+ = gettimeofday;
+ int x = f (&c, 0);
+ return !(x | c.tv_sec | c.tv_usec);
+ ]])],
+ [gl_cv_func_gettimeofday_posix_signature=yes],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+int gettimeofday (struct timeval *restrict, struct timezone *restrict);
+ ]])],
+ [gl_cv_func_gettimeofday_posix_signature=almost],
+ [gl_cv_func_gettimeofday_posix_signature=no])])])
+ if test $gl_cv_func_gettimeofday_posix_signature = almost; then
+ gl_gettimeofday_timezone='struct timezone'
+ elif test $gl_cv_func_gettimeofday_posix_signature != yes; then
+ REPLACE_GETTIMEOFDAY=1
+ fi
+ dnl If we override 'struct timeval', we also have to override gettimeofday.
+ if test $REPLACE_STRUCT_TIMEVAL = 1; then
+ REPLACE_GETTIMEOFDAY=1
+ fi
+ dnl On mingw, the original gettimeofday has only a precision of 15.6
+ dnl milliseconds. So override it.
+ case "$host_os" in
+ mingw*) REPLACE_GETTIMEOFDAY=1 ;;
+ esac
+ fi
+ AC_DEFINE_UNQUOTED([GETTIMEOFDAY_TIMEZONE], [$gl_gettimeofday_timezone],
+ [Define this to 'void' or 'struct timezone' to match the system's
+ declaration of the second argument to gettimeofday.])
+])
+
+# Prerequisites of lib/gettimeofday.c.
+AC_DEFUN([gl_PREREQ_GETTIMEOFDAY], [:])
diff --git a/m4/gl-openssl.m4 b/m4/gl-openssl.m4
new file mode 100644
index 0000000..e950904
--- /dev/null
+++ b/m4/gl-openssl.m4
@@ -0,0 +1,66 @@
+# gl-openssl.m4 serial 5
+dnl Copyright (C) 2013-2020 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.
+
+AC_DEFUN([gl_SET_CRYPTO_CHECK_DEFAULT],
+[
+ m4_define([gl_CRYPTO_CHECK_DEFAULT], [$1])
+])
+gl_SET_CRYPTO_CHECK_DEFAULT([no])
+
+AC_DEFUN([gl_CRYPTO_CHECK],
+[
+ dnl gnulib users set this before gl_INIT with gl_SET_CRYPTO_CHECK_DEFAULT()
+ m4_divert_once([DEFAULTS], [with_openssl_default='gl_CRYPTO_CHECK_DEFAULT'])
+
+ dnl Only clear once, so crypto routines can be checked for individually
+ m4_divert_once([DEFAULTS], [LIB_CRYPTO=])
+
+ AC_ARG_WITH([openssl],
+ [AS_HELP_STRING([--with-openssl],
+ [use libcrypto hash routines. Valid ARGs are:
+ 'yes', 'no',
+ 'auto' => use if any version available,
+ 'auto-gpl-compat' => use if gpl compatible version available,
+ 'optional' => use if available and warn if not available;
+ default is ']gl_CRYPTO_CHECK_DEFAULT['.
+ Note also --with-linux-crypto, which will enable
+ use of kernel crypto routines, which have precedence])],
+ [],
+ [with_openssl=$with_openssl_default])
+
+ AC_SUBST([LIB_CRYPTO])
+ if test "x$with_openssl" != xno; then
+ if test "x$with_openssl" = xauto-gpl-compat; then
+ AC_CACHE_CHECK([whether openssl is GPL compatible],
+ [gl_cv_openssl_gpl_compat],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <openssl/opensslv.h>
+ #if OPENSSL_VERSION_MAJOR < 3
+ #error "openssl >= version 3 not found"
+ #endif
+ ]])],
+ [gl_cv_openssl_gpl_compat=yes],
+ [gl_cv_openssl_gpl_compat=no])])
+ fi
+ if test "x$with_openssl" != xauto-gpl-compat ||
+ test "x$gl_cv_openssl_gpl_compat" = xyes; then
+ AC_CHECK_LIB([crypto], [$1],
+ [AC_CHECK_HEADERS(
+ m4_if([$1], [MD5], [openssl/md5.h], [openssl/sha.h]),
+ [LIB_CRYPTO=-lcrypto
+ AC_DEFINE([HAVE_OPENSSL_$1], [1],
+ [Define to 1 if libcrypto is used for $1.])])])
+ fi
+ if test "x$LIB_CRYPTO" = x; then
+ if test "x$with_openssl" = xyes; then
+ AC_MSG_ERROR([openssl development library not found for $1])
+ elif test "x$with_openssl" = xoptional; then
+ AC_MSG_WARN([openssl development library not found for $1])
+ fi
+ fi
+ fi
+])
diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
new file mode 100644
index 0000000..2c0ae9b
--- /dev/null
+++ b/m4/gnulib-common.m4
@@ -0,0 +1,724 @@
+# gnulib-common.m4 serial 63
+dnl Copyright (C) 2007-2020 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.
+
+AC_PREREQ([2.62])
+
+# gl_COMMON
+# is expanded unconditionally through gnulib-tool magic.
+AC_DEFUN([gl_COMMON], [
+ dnl Use AC_REQUIRE here, so that the code is expanded once only.
+ AC_REQUIRE([gl_00GNULIB])
+ AC_REQUIRE([gl_COMMON_BODY])
+ AC_REQUIRE([gl_ZZGNULIB])
+])
+AC_DEFUN([gl_COMMON_BODY], [
+ AH_VERBATIM([_GL_GNUC_PREREQ],
+[/* True if the compiler says it groks GNU C version MAJOR.MINOR. */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+])
+ AH_VERBATIM([_Noreturn],
+[/* The _Noreturn keyword of C11. */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || _GL_GNUC_PREREQ (4, 7) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))
+ /* _Noreturn works as-is. */
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
+])
+ AH_VERBATIM([isoc99_inline],
+[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+ the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+ earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+ __APPLE__ && __MACH__ test for Mac OS X.
+ __APPLE_CC__ tests for the Apple compiler and its version.
+ __STDC_VERSION__ tests for the C99 mode. */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif])
+ AH_VERBATIM([attribute],
+[/* Attributes. */
+#ifdef __has_attribute
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# ifdef _ICC
+# define _GL_ATTR_may_alias 0
+# else
+# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead.
+[
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+ <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+ Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+# define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* FALLTHROUGH is special, because it always expands to something. */
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#elif _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED
+#endif
+/* Earlier spellings of this macro. */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */
+
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead.
+[
+/* To support C++ as well as C, use _GL_UNUSED_LABEL with trailing ';'. */
+#if !defined __cplusplus || _GL_GNUC_PREREQ (4, 5)
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_MAYBE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+])
+ AH_VERBATIM([async_safe],
+[/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+ signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+ invoked from such signal handlers. Such functions have some restrictions:
+ * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+ or should be listed as async-signal-safe in POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+ section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in
+ particular, are NOT async-signal-safe.
+ * All memory locations (variables and struct fields) that these functions
+ access must be marked 'volatile'. This holds for both read and write
+ accesses. Otherwise the compiler might optimize away stores to and
+ reads from such locations that occur in the program, depending on its
+ data flow analysis. For example, when the program contains a loop
+ that is intended to inspect a variable set from within a signal handler
+ while (!signal_occurred)
+ ;
+ the compiler is allowed to transform this into an endless loop if the
+ variable 'signal_occurred' is not declared 'volatile'.
+ Additionally, recall that:
+ * A signal handler should not modify errno (except if it is a handler
+ for a fatal signal and ends by raising the same signal again, thus
+ provoking the termination of the process). If it invokes a function
+ that may clobber errno, it needs to save and restore the value of
+ errno. */
+#define _GL_ASYNC_SAFE
+])
+ AH_VERBATIM([micro_optimizations],
+[/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+ n1 and n2 are expressions without side effects, that evaluate to real
+ numbers (excluding NaN).
+ It returns
+ 1 if n1 > n2
+ 0 if n1 == n2
+ -1 if n1 < n2
+ The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional
+ jump with nearly all GCC versions up to GCC 10.
+ This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many
+ GCC versions up to GCC 9.
+ The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9
+ avoids conditional jumps in all GCC versions >= 3.4. */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+])
+ dnl Hint which direction to take regarding cross-compilation guesses:
+ dnl When a user installs a program on a platform they are not intimately
+ dnl familiar with, --enable-cross-guesses=conservative is the appropriate
+ dnl choice. It implements the "If we don't know, assume the worst" principle.
+ dnl However, when an operating system developer (on a platform which is not
+ dnl yet known to gnulib) builds packages for their platform, they want to
+ dnl expose, not hide, possible platform bugs; in this case,
+ dnl --enable-cross-guesses=risky is the appropriate choice.
+ dnl Sets the variables
+ dnl gl_cross_guess_normal (to be used when 'yes' is good and 'no' is bad),
+ dnl gl_cross_guess_inverted (to be used when 'no' is good and 'yes' is bad).
+ AC_ARG_ENABLE([cross-guesses],
+ [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}],
+ [specify policy for cross-compilation guesses])],
+ [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+ AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses])
+ enableval=conservative
+ fi
+ gl_cross_guesses="$enableval"],
+ [gl_cross_guesses=conservative])
+ if test $gl_cross_guesses = risky; then
+ gl_cross_guess_normal="guessing yes"
+ gl_cross_guess_inverted="guessing no"
+ else
+ gl_cross_guess_normal="guessing no"
+ gl_cross_guess_inverted="guessing yes"
+ fi
+ dnl Preparation for running test programs:
+ dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
+ dnl to /dev/tty, so they can be redirected to log files. Such diagnostics
+ dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
+ LIBC_FATAL_STDERR_=1
+ export LIBC_FATAL_STDERR_
+])
+
+# gl_MODULE_INDICATOR_CONDITION
+# expands to a C preprocessor expression that evaluates to 1 or 0, depending
+# whether a gnulib module that has been requested shall be considered present
+# or not.
+m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
+# sets the shell variable that indicates the presence of the given module to
+# a C preprocessor expression that will evaluate to 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
+[
+ gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
+ [GNULIB_[]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
+ [gl_MODULE_INDICATOR_CONDITION])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
+# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
+# The shell variable's value is a C preprocessor expression that evaluates
+# to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
+[
+ m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
+ [
+ dnl Simplify the expression VALUE || 1 to 1.
+ $1=1
+ ],
+ [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
+ [gl_MODULE_INDICATOR_CONDITION])])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
+# modifies the shell variable to include the given condition. The shell
+# variable's value is a C preprocessor expression that evaluates to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
+[
+ dnl Simplify the expression 1 || CONDITION to 1.
+ if test "$[]$1" != 1; then
+ dnl Simplify the expression 0 || CONDITION to CONDITION.
+ if test "$[]$1" = 0; then
+ $1=$2
+ else
+ $1="($[]$1 || $2)"
+ fi
+ fi
+])
+
+# gl_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module
+# in a location where it can be used.
+# | Value | Value |
+# | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: | 0 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module not present at all: | 0 | 0 |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+ AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
+ [gl_MODULE_INDICATOR_CONDITION],
+ [Define to a C preprocessor expression that evaluates to 1 or 0,
+ depending whether the gnulib module $1 shall be considered present.])
+])
+
+# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
+# defines a C macro indicating the presence of the given module
+# in lib or tests. This is useful to determine whether the module
+# should be tested.
+# | Value | Value |
+# | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: | 1 | 1 |
+# --------------------------------------------+---------+-----------+
+# Module not present at all: | 0 | 0 |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
+[
+ AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
+ [abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+ [Define to 1 when the gnulib module $1 should be tested.])
+])
+
+# gl_ASSERT_NO_GNULIB_POSIXCHECK
+# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
+# and thereby enables an optimization of configure and config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
+[
+ dnl Override gl_WARN_ON_USE_PREPARE.
+ dnl But hide this definition from 'aclocal'.
+ AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
+])
+
+# gl_ASSERT_NO_GNULIB_TESTS
+# asserts that there will be no gnulib tests in the scope of the configure.ac
+# and thereby enables an optimization of config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
+[
+ dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
+ AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
+])
+
+# Test whether <features.h> exists.
+# Set HAVE_FEATURES_H.
+AC_DEFUN([gl_FEATURES_H],
+[
+ AC_CHECK_HEADERS_ONCE([features.h])
+ if test $ac_cv_header_features_h = yes; then
+ HAVE_FEATURES_H=1
+ else
+ HAVE_FEATURES_H=0
+ fi
+ AC_SUBST([HAVE_FEATURES_H])
+])
+
+# gl_PROG_CC_C99
+# Modifies the value of the shell variable CC in an attempt to make $CC
+# understand ISO C99 source code.
+AC_DEFUN([gl_PROG_CC_C99],
+[
+ dnl Just use AC_PROG_CC_C99.
+ dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
+ dnl value of CC will contain the C99 enabling options twice. But this is only
+ dnl a cosmetic problem.
+ dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
+ dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
+ m4_version_prereq([2.70],
+ [AC_REQUIRE([AC_PROG_CC])],
+ [AC_REQUIRE([AC_PROG_CC_C99])])
+])
+
+# gl_PROG_AR_RANLIB
+# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
+# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
+# the values.
+AC_DEFUN([gl_PROG_AR_RANLIB],
+[
+ dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
+ dnl as "cc", and GCC as "gcc". They have different object file formats and
+ dnl library formats. In particular, the GNU binutils programs ar and ranlib
+ dnl produce libraries that work only with gcc, not with cc.
+ AC_REQUIRE([AC_PROG_CC])
+ dnl The '][' hides this use from 'aclocal'.
+ AC_BEFORE([$0], [A][M_PROG_AR])
+ AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
+ [
+ AC_EGREP_CPP([Amsterdam],
+ [
+#ifdef __ACK__
+Amsterdam
+#endif
+ ],
+ [gl_cv_c_amsterdam_compiler=yes],
+ [gl_cv_c_amsterdam_compiler=no])
+ ])
+
+ dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
+ dnl building with __ACK__.
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ if test -z "$AR"; then
+ AR='cc -c.a'
+ fi
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='-o'
+ fi
+ else
+ dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST
+ dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
+ dnl script on-demand, if not specified by ./configure of course).
+ dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
+ dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block
+ dnl because AM_PROG_AR is written so it could re-set AR variable even for
+ dnl __ACK__. It may seem like its easier to avoid calling the macro here,
+ dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
+ dnl default value and automake should usually know them).
+ dnl
+ dnl The '][' hides this use from 'aclocal'.
+ m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
+ fi
+
+ dnl In case the code above has not helped with setting AR/ARFLAGS, use
+ dnl Automake-documented default values for AR and ARFLAGS, but prefer
+ dnl ${host}-ar over ar (useful for cross-compiling).
+ AC_CHECK_TOOL([AR], [ar], [ar])
+ if test -z "$ARFLAGS"; then
+ ARFLAGS='cr'
+ fi
+
+ AC_SUBST([AR])
+ AC_SUBST([ARFLAGS])
+ if test -z "$RANLIB"; then
+ if test $gl_cv_c_amsterdam_compiler = yes; then
+ RANLIB=':'
+ else
+ dnl Use the ranlib program if it is available.
+ AC_PROG_RANLIB
+ fi
+ fi
+ AC_SUBST([RANLIB])
+])
+
+# AC_C_RESTRICT
+# This definition is copied from post-2.70 Autoconf and overrides the
+# AC_C_RESTRICT macro from autoconf 2.60..2.70.
+m4_version_prereq([2.70.1], [], [
+AC_DEFUN([AC_C_RESTRICT],
+[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
+ [ac_cv_c_restrict=no
+ # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
+ # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
+ # Put 'restrict' last, because C++ lacks it.
+ for ac_kw in __restrict__ __restrict _Restrict restrict; do
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[typedef int *int_ptr;
+ int foo (int_ptr $ac_kw ip) { return ip[0]; }
+ int bar (int [$ac_kw]); /* Catch GCC bug 14050. */
+ int bar (int ip[$ac_kw]) { return ip[0]; }
+ ]],
+ [[int s[1];
+ int *$ac_kw t = s;
+ t[0] = 0;
+ return foo (t) + bar (t);
+ ]])],
+ [ac_cv_c_restrict=$ac_kw])
+ test "$ac_cv_c_restrict" != no && break
+ done
+ ])
+ AH_VERBATIM([restrict],
+[/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported only directly. */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+ #define __restrict__ or support _Restrict or __restrict__
+ even though the corresponding Sun C compiler ended up with
+ "#define restrict _Restrict" or "#define restrict __restrict__"
+ in the previous line. This workaround can be removed once
+ we assume Oracle Developer Studio 12.5 (2016) or later. */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif])
+ case $ac_cv_c_restrict in
+ restrict) ;;
+ no) AC_DEFINE([restrict], []) ;;
+ *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
+ esac
+])# AC_C_RESTRICT
+])
+
+# gl_BIGENDIAN
+# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
+# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
+# macros invoke AC_C_BIGENDIAN with arguments.
+AC_DEFUN([gl_BIGENDIAN],
+[
+ AC_C_BIGENDIAN
+])
+
+# A temporary file descriptor.
+# Must be less than 10, because dash 0.5.8 does not support redirections
+# with multi-digit file descriptors.
+m4_define([GL_TMP_FD], 9)
+
+# gl_SILENT(command)
+# executes command, but without the normal configure output.
+# This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
+# inside another AC_CACHE_CHECK.
+AC_DEFUN([gl_SILENT],
+[
+ exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
+ $1
+ exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
+])
+
+# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
+# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
+# output a spurious "(cached)" mark in the midst of other configure output.
+# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
+# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
+AC_DEFUN([gl_CACHE_VAL_SILENT],
+[
+ gl_SILENT([
+ AC_CACHE_VAL([$1], [$2])
+ ])
+])
+
+dnl Expands to some code for use in .c programs that, on native Windows, defines
+dnl the Microsoft deprecated alias function names to the underscore-prefixed
+dnl actual function names. With this macro, these function names are available
+dnl without linking with '-loldnames' and without generating warnings.
+dnl Usage: Use it after all system header files are included.
+dnl #include <...>
+dnl #include <...>
+dnl ]GL_MDA_DEFINES[
+dnl ...
+AC_DEFUN([GL_MDA_DEFINES],[
+AC_REQUIRE([_GL_MDA_DEFINES])
+[$gl_mda_defines]
+])
+AC_DEFUN([_GL_MDA_DEFINES],
+[gl_mda_defines='
+#if defined _WIN32 && !defined __CYGWIN__
+#define access _access
+#define chdir _chdir
+#define chmod _chmod
+#define close _close
+#define creat _creat
+#define dup _dup
+#define dup2 _dup2
+#define ecvt _ecvt
+#define execl _execl
+#define execle _execle
+#define execlp _execlp
+#define execv _execv
+#define execve _execve
+#define execvp _execvp
+#define execvpe _execvpe
+#define fcloseall _fcloseall
+#define fcvt _fcvt
+#define fdopen _fdopen
+#define fileno _fileno
+#define gcvt _gcvt
+#define getcwd _getcwd
+#define getpid _getpid
+#define getw _getw
+#define isatty _isatty
+#define j0 _j0
+#define j1 _j1
+#define jn _jn
+#define lfind _lfind
+#define lsearch _lsearch
+#define lseek _lseek
+#define memccpy _memccpy
+#define mkdir _mkdir
+#define mktemp _mktemp
+#define open _open
+#define putenv _putenv
+#define putw _putw
+#define read _read
+#define rmdir _rmdir
+#define strdup _strdup
+#define swab _swab
+#define tempnam _tempnam
+#define tzset _tzset
+#define umask _umask
+#define unlink _unlink
+#define utime _utime
+#define wcsdup _wcsdup
+#define write _write
+#define y0 _y0
+#define y1 _y1
+#define yn _yn
+#endif
+'
+])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
new file mode 100644
index 0000000..6032dcd
--- /dev/null
+++ b/m4/gnulib-comp.m4
@@ -0,0 +1,2320 @@
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This 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 file. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the compiled summary of the specification in
+# gnulib-cache.m4. It lists the computed macro invocations that need
+# to be invoked from configure.ac.
+# In projects that use version control, this file can be treated like
+# other built files.
+
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Checks for programs", right after AC_PROG_CC, and certainly before
+# any checks for libraries, header files, types and library functions.
+AC_DEFUN([gl_EARLY],
+[
+ m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace
+ m4_pattern_allow([^gl_ES$])dnl a valid locale name
+ m4_pattern_allow([^gl_LIBOBJS$])dnl a variable
+ m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable
+
+ # Pre-early section.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([gl_PROG_AR_RANLIB])
+
+ AC_REQUIRE([AM_PROG_CC_C_O])
+ # Code from module absolute-header:
+ # Code from module accept:
+ # Code from module access:
+ # Code from module alloca:
+ # Code from module alloca-opt:
+ # Code from module announce-gen:
+ # Code from module arpa_inet:
+ # Code from module array-mergesort:
+ # Code from module assure:
+ # Code from module at-internal:
+ # Code from module attribute:
+ # Code from module base32:
+ # Code from module basename-lgpl:
+ # Code from module binary-io:
+ # Code from module bind:
+ # Code from module bitrotate:
+ # Code from module btowc:
+ # Code from module builtin-expect:
+ # Code from module byteswap:
+ # Code from module c-ctype:
+ # Code from module c-strcase:
+ # Code from module c-strcaseeq:
+ # Code from module c-strcasestr:
+ # Code from module c99:
+ # Code from module canonicalize:
+ # Code from module chdir:
+ # Code from module chdir-long:
+ # Code from module clock-time:
+ # Code from module cloexec:
+ # Code from module close:
+ # Code from module closedir:
+ # Code from module concat-filename:
+ # Code from module connect:
+ # Code from module crypto/af_alg:
+ # Code from module crypto/md2:
+ # Code from module crypto/md4:
+ # Code from module crypto/md5:
+ # Code from module crypto/md5-buffer:
+ # Code from module crypto/sha1:
+ # Code from module crypto/sha1-buffer:
+ # Code from module crypto/sha256:
+ # Code from module crypto/sha256-buffer:
+ # Code from module crypto/sha512:
+ # Code from module crypto/sha512-buffer:
+ # Code from module ctype:
+ # Code from module d-ino:
+ # Code from module dirent:
+ # Code from module dirfd:
+ # Code from module dirname:
+ # Code from module dirname-lgpl:
+ # Code from module double-slash-root:
+ # Code from module dup:
+ # Code from module dup2:
+ # Code from module environ:
+ # Code from module errno:
+ # Code from module error:
+ # Code from module exitfail:
+ # Code from module extensions:
+ # Code from module extern-inline:
+ # Code from module fatal-signal:
+ # Code from module fchdir:
+ # Code from module fcntl:
+ # Code from module fcntl-h:
+ # Code from module fd-hook:
+ # Code from module fd-safer-flag:
+ # Code from module fdopendir:
+ # Code from module fflush:
+ AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
+ # Code from module file-set:
+ # Code from module filename:
+ # Code from module filenamecat-lgpl:
+ # Code from module findprog-in:
+ # Code from module flexmember:
+ # Code from module float:
+ # Code from module flock:
+ # Code from module fnmatch:
+ # Code from module fnmatch-gnu:
+ # Code from module fnmatch-h:
+ # Code from module fopen:
+ # Code from module fopen-gnu:
+ # Code from module fpurge:
+ # Code from module freading:
+ # Code from module free-posix:
+ # Code from module fseek:
+ # Code from module fseeko:
+ AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
+ # Code from module fstat:
+ # Code from module fstatat:
+ # Code from module ftell:
+ # Code from module ftello:
+ AC_REQUIRE([gl_SET_LARGEFILE_SOURCE])
+ # Code from module futimens:
+ # Code from module getaddrinfo:
+ # Code from module getcwd:
+ # Code from module getcwd-lgpl:
+ # Code from module getdelim:
+ # Code from module getdtablesize:
+ # Code from module getgroups:
+ # Code from module getline:
+ # Code from module getopt-gnu:
+ # Code from module getopt-posix:
+ # Code from module getpass:
+ # Code from module getpass-gnu:
+ # Code from module getpeername:
+ # Code from module getprogname:
+ # Code from module getrandom:
+ # Code from module getsockname:
+ # Code from module gettext-h:
+ # Code from module gettime:
+ # Code from module gettimeofday:
+ # Code from module git-version-gen:
+ # Code from module gitlog-to-changelog:
+ # Code from module gnumakefile:
+ # Code from module gnupload:
+ # Code from module gperf:
+ # Code from module group-member:
+ # Code from module hard-locale:
+ # Code from module hash:
+ # Code from module hash-pjw:
+ # Code from module hash-triple-simple:
+ # Code from module havelib:
+ # Code from module hostent:
+ # Code from module iconv:
+ # Code from module iconv-h:
+ # Code from module idx:
+ # Code from module include_next:
+ # Code from module inet_ntop:
+ # Code from module inline:
+ # Code from module intprops:
+ # Code from module inttypes:
+ # Code from module inttypes-incomplete:
+ # Code from module ioctl:
+ # Code from module isblank:
+ # Code from module iswblank:
+ # Code from module iswdigit:
+ # Code from module iswxdigit:
+ # Code from module langinfo:
+ # Code from module largefile:
+ AC_REQUIRE([AC_SYS_LARGEFILE])
+ # Code from module libc-config:
+ # Code from module libunistring-optional:
+ # Code from module limits-h:
+ # Code from module link:
+ # Code from module listen:
+ # Code from module localcharset:
+ # Code from module locale:
+ # Code from module localeconv:
+ # Code from module lock:
+ # Code from module lseek:
+ # Code from module lstat:
+ # Code from module maintainer-makefile:
+ # Code from module malloc-posix:
+ # Code from module malloca:
+ # Code from module mbchar:
+ # Code from module mbiter:
+ # Code from module mbrtowc:
+ # Code from module mbsinit:
+ # Code from module mbsrtowcs:
+ # Code from module mbtowc:
+ # Code from module memchr:
+ # Code from module mempcpy:
+ # Code from module memrchr:
+ # Code from module minmax:
+ # Code from module mkdir:
+ # Code from module mkostemp:
+ # Code from module mkstemp:
+ # Code from module mktime:
+ # Code from module mktime-internal:
+ # Code from module msvc-inval:
+ # Code from module msvc-nothrow:
+ # Code from module multiarch:
+ # Code from module nanosleep:
+ # Code from module netdb:
+ # Code from module netinet_in:
+ # Code from module nl_langinfo:
+ # Code from module nocrash:
+ # Code from module open:
+ # Code from module openat:
+ # Code from module openat-die:
+ # Code from module openat-h:
+ # Code from module opendir:
+ # Code from module pathmax:
+ # Code from module pipe-posix:
+ # Code from module pipe2:
+ # Code from module pipe2-safer:
+ # Code from module posix_spawn:
+ # Code from module posix_spawn-internal:
+ # Code from module posix_spawn_file_actions_addchdir:
+ # Code from module posix_spawn_file_actions_addclose:
+ # Code from module posix_spawn_file_actions_adddup2:
+ # Code from module posix_spawn_file_actions_addopen:
+ # Code from module posix_spawn_file_actions_destroy:
+ # Code from module posix_spawn_file_actions_init:
+ # Code from module posix_spawnattr_destroy:
+ # Code from module posix_spawnattr_init:
+ # Code from module posix_spawnattr_setflags:
+ # Code from module posix_spawnattr_setpgroup:
+ # Code from module posix_spawnattr_setsigmask:
+ # Code from module posix_spawnp:
+ # Code from module quote:
+ # Code from module quotearg:
+ # Code from module quotearg-simple:
+ # Code from module raise:
+ # Code from module rawmemchr:
+ # Code from module readdir:
+ # Code from module readlink:
+ # Code from module realloc-posix:
+ # Code from module recv:
+ # Code from module regex:
+ # Code from module rewinddir:
+ # Code from module same-inode:
+ # Code from module save-cwd:
+ # Code from module sched:
+ # Code from module scratch_buffer:
+ # Code from module secure_getenv:
+ # Code from module select:
+ # Code from module send:
+ # Code from module servent:
+ # Code from module setlocale-null:
+ # Code from module setsockopt:
+ # Code from module sh-filename:
+ # Code from module sigaction:
+ # Code from module signal-h:
+ # Code from module sigpipe:
+ # Code from module sigprocmask:
+ # Code from module size_max:
+ # Code from module snippet/_Noreturn:
+ # Code from module snippet/arg-nonnull:
+ # Code from module snippet/c++defs:
+ # Code from module snippet/unused-parameter:
+ # Code from module snippet/warn-on-use:
+ # Code from module snprintf:
+ # Code from module socket:
+ # Code from module socketlib:
+ # Code from module sockets:
+ # Code from module socklen:
+ # Code from module spawn:
+ # Code from module spawn-pipe:
+ # Code from module ssize_t:
+ # Code from module stat:
+ # Code from module stat-time:
+ # Code from module std-gnu11:
+ # Code from module stdalign:
+ # Code from module stdbool:
+ # Code from module stddef:
+ # Code from module stdint:
+ # Code from module stdio:
+ # Code from module stdlib:
+ # Code from module stpcpy:
+ # Code from module strcase:
+ # Code from module strchrnul:
+ # Code from module strdup-posix:
+ # Code from module streq:
+ # Code from module strerror:
+ # Code from module strerror-override:
+ # Code from module strerror_r-posix:
+ # Code from module string:
+ # Code from module strings:
+ # Code from module strndup:
+ # Code from module strnlen:
+ # Code from module strnlen1:
+ # Code from module strpbrk:
+ # Code from module strptime:
+ # Code from module strtok_r:
+ # Code from module strtol:
+ # Code from module strtoll:
+ # Code from module symlink:
+ # Code from module sys_file:
+ # Code from module sys_ioctl:
+ # Code from module sys_random:
+ # Code from module sys_select:
+ # Code from module sys_socket:
+ # Code from module sys_stat:
+ # Code from module sys_time:
+ # Code from module sys_types:
+ # Code from module sys_uio:
+ # Code from module sys_wait:
+ # Code from module tempname:
+ # Code from module thread-optim:
+ # Code from module threadlib:
+ gl_THREADLIB_EARLY
+ # Code from module time:
+ # Code from module time_r:
+ # Code from module timegm:
+ # Code from module timespec:
+ # Code from module tmpdir:
+ # Code from module u64:
+ # Code from module unicase/base:
+ # Code from module unicase/cased:
+ # Code from module unicase/empty-prefix-context:
+ # Code from module unicase/empty-suffix-context:
+ # Code from module unicase/ignorable:
+ # Code from module unicase/special-casing:
+ # Code from module unicase/tolower:
+ # Code from module unicase/u8-casemap:
+ # Code from module unicase/u8-tolower:
+ # Code from module unictype/base:
+ # Code from module unictype/combining-class:
+ # Code from module unictype/property-soft-dotted:
+ # Code from module uninorm/base:
+ # Code from module uninorm/decompose-internal:
+ # Code from module uninorm/u8-normalize:
+ # Code from module unistd:
+ # Code from module unistd-safer:
+ # Code from module unistr/base:
+ # Code from module unistr/u8-cpy:
+ # Code from module unistr/u8-mbtouc-unsafe:
+ # Code from module unistr/u8-strlen:
+ # Code from module unistr/u8-uctomb:
+ # Code from module unitypes:
+ # Code from module uniwidth/base:
+ # Code from module uniwidth/width:
+ # Code from module unlink:
+ # Code from module unlocked-io:
+ # Code from module update-copyright:
+ # Code from module useless-if-before-free:
+ # Code from module utime:
+ # Code from module utime-h:
+ # Code from module utimens:
+ # Code from module vasnprintf:
+ # Code from module vasprintf:
+ # Code from module vc-list-files:
+ # Code from module verify:
+ # Code from module vsnprintf:
+ # Code from module wait-process:
+ # Code from module waitpid:
+ # Code from module warnings:
+ # Code from module wchar:
+ # Code from module wcrtomb:
+ # Code from module wctype-h:
+ # Code from module wcwidth:
+ # Code from module windows-mutex:
+ # Code from module windows-once:
+ # Code from module windows-recmutex:
+ # Code from module windows-rwlock:
+ # Code from module windows-spawn:
+ # Code from module wmemchr:
+ # Code from module wmempcpy:
+ # Code from module write:
+ # Code from module xalloc:
+ # Code from module xalloc-die:
+ # Code from module xalloc-oversized:
+ # Code from module xmemdup0:
+ # Code from module xsize:
+ # Code from module xstrndup:
+])
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Check for header files, types and library functions".
+AC_DEFUN([gl_INIT],
+[
+ AM_CONDITIONAL([GL_COND_LIBTOOL], [false])
+ gl_cond_libtool=false
+ gl_libdeps=
+ gl_ltlibdeps=
+ gl_m4_base='m4'
+ m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ]))
+ m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS]))
+ m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
+ m4_pushdef([gl_LIBSOURCES_LIST], [])
+ m4_pushdef([gl_LIBSOURCES_DIR], [])
+ gl_COMMON
+ gl_source_base='lib'
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([accept])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([accept])
+ gl_FUNC_ACCESS
+ if test $REPLACE_ACCESS = 1; then
+ AC_LIBOBJ([access])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([access])
+ gl_FUNC_ALLOCA
+ gl_HEADER_ARPA_INET
+ AC_PROG_MKDIR_P
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ gl_FUNC_BASE32
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([bind])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([bind])
+ gl_FUNC_BTOWC
+ if test $HAVE_BTOWC = 0 || test $REPLACE_BTOWC = 1; then
+ AC_LIBOBJ([btowc])
+ gl_PREREQ_BTOWC
+ fi
+ gl_WCHAR_MODULE_INDICATOR([btowc])
+ gl___BUILTIN_EXPECT
+ gl_BYTESWAP
+ gl_FUNC_CANONICALIZE_FILENAME_MODE
+ gl_MODULE_INDICATOR([canonicalize])
+ gl_MODULE_INDICATOR_FOR_TESTS([canonicalize])
+ gl_STDLIB_MODULE_INDICATOR([canonicalize_file_name])
+ gl_UNISTD_MODULE_INDICATOR([chdir])
+ gl_FUNC_CHDIR_LONG
+ if test $gl_cv_have_unlimited_file_name_length = no; then
+ AC_LIBOBJ([chdir-long])
+ gl_PREREQ_CHDIR_LONG
+ fi
+ gl_CLOCK_TIME
+ gl_MODULE_INDICATOR_FOR_TESTS([cloexec])
+ gl_FUNC_CLOSE
+ if test $REPLACE_CLOSE = 1; then
+ AC_LIBOBJ([close])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([close])
+ gl_FUNC_CLOSEDIR
+ if test $HAVE_CLOSEDIR = 0 || test $REPLACE_CLOSEDIR = 1; then
+ AC_LIBOBJ([closedir])
+ fi
+ gl_DIRENT_MODULE_INDICATOR([closedir])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([connect])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([connect])
+ gl_AF_ALG
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_MD4
+ AC_DEFINE([GL_COMPILE_CRYPTO_STREAM], 1, [Compile Gnulib crypto stream ops.])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_MD5
+ AC_DEFINE([GL_COMPILE_CRYPTO_STREAM], 1, [Compile Gnulib crypto stream ops.])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_SHA1
+ AC_DEFINE([GL_COMPILE_CRYPTO_STREAM], 1, [Compile Gnulib crypto stream ops.])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_SHA256
+ AC_DEFINE([GL_COMPILE_CRYPTO_STREAM], 1, [Compile Gnulib crypto stream ops.])
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_SHA512
+ gl_CTYPE_H
+ gl_CHECK_TYPE_STRUCT_DIRENT_D_INO
+ gl_DIRENT_H
+ gl_FUNC_DIRFD
+ if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no \
+ || test $REPLACE_DIRFD = 1; then
+ AC_LIBOBJ([dirfd])
+ gl_PREREQ_DIRFD
+ fi
+ gl_DIRENT_MODULE_INDICATOR([dirfd])
+ gl_MODULE_INDICATOR([dirname])
+ gl_DOUBLE_SLASH_ROOT
+ gl_FUNC_DUP
+ if test $REPLACE_DUP = 1; then
+ AC_LIBOBJ([dup])
+ gl_PREREQ_DUP
+ fi
+ gl_UNISTD_MODULE_INDICATOR([dup])
+ gl_FUNC_DUP2
+ if test $REPLACE_DUP2 = 1; then
+ AC_LIBOBJ([dup2])
+ gl_PREREQ_DUP2
+ fi
+ gl_UNISTD_MODULE_INDICATOR([dup2])
+ gl_ENVIRON
+ gl_UNISTD_MODULE_INDICATOR([environ])
+ gl_HEADER_ERRNO_H
+ gl_ERROR
+ if test $ac_cv_lib_error_at_line = no; then
+ AC_LIBOBJ([error])
+ gl_PREREQ_ERROR
+ fi
+ m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=error:3:c-format])
+ AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
+ AC_REQUIRE([gl_EXTERN_INLINE])
+ gl_FATAL_SIGNAL
+ gl_FUNC_FCHDIR
+ gl_UNISTD_MODULE_INDICATOR([fchdir])
+ gl_FUNC_FCNTL
+ if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+ AC_LIBOBJ([fcntl])
+ fi
+ gl_FCNTL_MODULE_INDICATOR([fcntl])
+ gl_FCNTL_H
+ gl_MODULE_INDICATOR([fd-safer-flag])
+ gl_FUNC_FDOPENDIR
+ if test $HAVE_FDOPENDIR = 0 || test $REPLACE_FDOPENDIR = 1; then
+ AC_LIBOBJ([fdopendir])
+ fi
+ gl_DIRENT_MODULE_INDICATOR([fdopendir])
+ gl_MODULE_INDICATOR([fdopendir])
+ gl_FUNC_FFLUSH
+ if test $REPLACE_FFLUSH = 1; then
+ AC_LIBOBJ([fflush])
+ gl_PREREQ_FFLUSH
+ fi
+ gl_MODULE_INDICATOR([fflush])
+ gl_STDIO_MODULE_INDICATOR([fflush])
+ gl_FILE_NAME_CONCAT_LGPL
+ gl_FINDPROG_IN
+ AC_C_FLEXIBLE_ARRAY_MEMBER
+ gl_FLOAT_H
+ if test $REPLACE_FLOAT_LDBL = 1; then
+ AC_LIBOBJ([float])
+ fi
+ if test $REPLACE_ITOLD = 1; then
+ AC_LIBOBJ([itold])
+ fi
+ gl_FUNC_FLOCK
+ if test $HAVE_FLOCK = 0; then
+ AC_LIBOBJ([flock])
+ gl_PREREQ_FLOCK
+ fi
+ gl_HEADER_SYS_FILE_MODULE_INDICATOR([flock])
+ gl_FUNC_FNMATCH_POSIX
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+ AC_LIBOBJ([fnmatch])
+ gl_PREREQ_FNMATCH
+ fi
+ gl_FNMATCH_MODULE_INDICATOR([fnmatch])
+ gl_FUNC_FNMATCH_GNU
+ if test $HAVE_FNMATCH = 0 || test $REPLACE_FNMATCH = 1; then
+ AC_LIBOBJ([fnmatch])
+ gl_PREREQ_FNMATCH
+ fi
+ gl_MODULE_INDICATOR([fnmatch-gnu])
+ gl_FNMATCH_H
+ gl_FUNC_FOPEN
+ if test $REPLACE_FOPEN = 1; then
+ AC_LIBOBJ([fopen])
+ gl_PREREQ_FOPEN
+ fi
+ gl_STDIO_MODULE_INDICATOR([fopen])
+ gl_FUNC_FOPEN_GNU
+ if test $REPLACE_FOPEN = 1; then
+ AC_LIBOBJ([fopen])
+ gl_PREREQ_FOPEN
+ fi
+ gl_MODULE_INDICATOR([fopen-gnu])
+ gl_FUNC_FPURGE
+ if test $HAVE_FPURGE = 0 || test $REPLACE_FPURGE = 1; then
+ AC_LIBOBJ([fpurge])
+ fi
+ gl_STDIO_MODULE_INDICATOR([fpurge])
+ gl_FUNC_FREADING
+ gl_FUNC_FREE
+ if test $REPLACE_FREE = 1; then
+ AC_LIBOBJ([free])
+ gl_PREREQ_FREE
+ fi
+ gl_STDLIB_MODULE_INDICATOR([free-posix])
+ gl_FUNC_FSEEK
+ if test $REPLACE_FSEEK = 1; then
+ AC_LIBOBJ([fseek])
+ fi
+ gl_STDIO_MODULE_INDICATOR([fseek])
+ gl_FUNC_FSEEKO
+ if test $HAVE_FSEEKO = 0 || test $REPLACE_FSEEKO = 1; then
+ AC_LIBOBJ([fseeko])
+ gl_PREREQ_FSEEKO
+ fi
+ gl_STDIO_MODULE_INDICATOR([fseeko])
+ gl_FUNC_FSTAT
+ if test $REPLACE_FSTAT = 1; then
+ AC_LIBOBJ([fstat])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([stat-w32])
+ ;;
+ esac
+ gl_PREREQ_FSTAT
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([fstat])
+ gl_FUNC_FSTATAT
+ if test $HAVE_FSTATAT = 0 || test $REPLACE_FSTATAT = 1; then
+ AC_LIBOBJ([fstatat])
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([fstatat])
+ gl_FUNC_FTELL
+ if test $REPLACE_FTELL = 1; then
+ AC_LIBOBJ([ftell])
+ fi
+ gl_STDIO_MODULE_INDICATOR([ftell])
+ gl_FUNC_FTELLO
+ if test $HAVE_FTELLO = 0 || test $REPLACE_FTELLO = 1; then
+ AC_LIBOBJ([ftello])
+ gl_PREREQ_FTELLO
+ fi
+ gl_STDIO_MODULE_INDICATOR([ftello])
+ gl_FUNC_FUTIMENS
+ if test $HAVE_FUTIMENS = 0 || test $REPLACE_FUTIMENS = 1; then
+ AC_LIBOBJ([futimens])
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([futimens])
+ gl_GETADDRINFO
+ if test $HAVE_GETADDRINFO = 0 || test $REPLACE_GETADDRINFO = 1; then
+ AC_LIBOBJ([getaddrinfo])
+ fi
+ if test $HAVE_DECL_GAI_STRERROR = 0 || test $REPLACE_GAI_STRERROR = 1; then
+ AC_LIBOBJ([gai_strerror])
+ fi
+ gl_NETDB_MODULE_INDICATOR([getaddrinfo])
+ gl_FUNC_GETCWD
+ if test $REPLACE_GETCWD = 1; then
+ AC_LIBOBJ([getcwd])
+ gl_PREREQ_GETCWD
+ fi
+ gl_MODULE_INDICATOR([getcwd])
+ gl_UNISTD_MODULE_INDICATOR([getcwd])
+ gl_FUNC_GETCWD_LGPL
+ if test $REPLACE_GETCWD = 1; then
+ AC_LIBOBJ([getcwd-lgpl])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([getcwd])
+ gl_FUNC_GETDELIM
+ if test $HAVE_GETDELIM = 0 || test $REPLACE_GETDELIM = 1; then
+ AC_LIBOBJ([getdelim])
+ gl_PREREQ_GETDELIM
+ fi
+ gl_STDIO_MODULE_INDICATOR([getdelim])
+ gl_FUNC_GETDTABLESIZE
+ if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
+ AC_LIBOBJ([getdtablesize])
+ gl_PREREQ_GETDTABLESIZE
+ fi
+ gl_UNISTD_MODULE_INDICATOR([getdtablesize])
+ gl_FUNC_GETGROUPS
+ if test $HAVE_GETGROUPS = 0 || test $REPLACE_GETGROUPS = 1; then
+ AC_LIBOBJ([getgroups])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([getgroups])
+ gl_FUNC_GETLINE
+ if test $REPLACE_GETLINE = 1; then
+ AC_LIBOBJ([getline])
+ gl_PREREQ_GETLINE
+ fi
+ gl_STDIO_MODULE_INDICATOR([getline])
+ gl_FUNC_GETOPT_GNU
+ dnl Because of the way gl_FUNC_GETOPT_GNU is implemented (the gl_getopt_required
+ dnl mechanism), there is no need to do any AC_LIBOBJ or AC_SUBST here; they are
+ dnl done in the getopt-posix module.
+ gl_FUNC_GETOPT_POSIX
+ if test $REPLACE_GETOPT = 1; then
+ AC_LIBOBJ([getopt])
+ AC_LIBOBJ([getopt1])
+ dnl Arrange for unistd.h to include getopt.h.
+ GNULIB_GL_UNISTD_H_GETOPT=1
+ fi
+ AC_SUBST([GNULIB_GL_UNISTD_H_GETOPT])
+ gl_UNISTD_MODULE_INDICATOR([getopt-posix])
+ gl_FUNC_GETPASS
+ if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then
+ AC_LIBOBJ([getpass])
+ gl_PREREQ_GETPASS
+ fi
+ gl_UNISTD_MODULE_INDICATOR([getpass])
+ gl_FUNC_GETPASS_GNU
+ if test $HAVE_GETPASS = 0 || test $REPLACE_GETPASS = 1; then
+ AC_LIBOBJ([getpass])
+ gl_PREREQ_GETPASS
+ fi
+ gl_UNISTD_MODULE_INDICATOR([getpass])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([getpeername])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([getpeername])
+ gl_FUNC_GETPROGNAME
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ gl_FUNC_GETRANDOM
+ if test $HAVE_GETRANDOM = 0 || test $REPLACE_GETRANDOM = 1; then
+ AC_LIBOBJ([getrandom])
+ fi
+ gl_SYS_RANDOM_MODULE_INDICATOR([getrandom])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([getsockname])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([getsockname])
+ AC_SUBST([LIBINTL])
+ AC_SUBST([LTLIBINTL])
+ gl_GETTIME
+ gl_FUNC_GETTIMEOFDAY
+ if test $HAVE_GETTIMEOFDAY = 0 || test $REPLACE_GETTIMEOFDAY = 1; then
+ AC_LIBOBJ([gettimeofday])
+ gl_PREREQ_GETTIMEOFDAY
+ fi
+ gl_SYS_TIME_MODULE_INDICATOR([gettimeofday])
+ # Autoconf 2.61a.99 and earlier don't support linking a file only
+ # in VPATH builds. But since GNUmakefile is for maintainer use
+ # only, it does not matter if we skip the link with older autoconf.
+ # Automake 1.10.1 and earlier try to remove GNUmakefile in non-VPATH
+ # builds, so use a shell variable to bypass this.
+ GNUmakefile=GNUmakefile
+ m4_if(m4_version_compare([2.61a.100],
+ m4_defn([m4_PACKAGE_VERSION])), [1], [],
+ [AC_CONFIG_LINKS([$GNUmakefile:$GNUmakefile], [],
+ [GNUmakefile=$GNUmakefile])])
+ gl_FUNC_GROUP_MEMBER
+ if test $HAVE_GROUP_MEMBER = 0; then
+ AC_LIBOBJ([group-member])
+ gl_PREREQ_GROUP_MEMBER
+ fi
+ gl_UNISTD_MODULE_INDICATOR([group-member])
+ AC_REQUIRE([gl_FUNC_SETLOCALE_NULL])
+ LIB_HARD_LOCALE="$LIB_SETLOCALE_NULL"
+ AC_SUBST([LIB_HARD_LOCALE])
+ AC_DEFUN([gl_HAVE_MODULE_HAVELIB])
+ gl_HOSTENT
+ AM_ICONV
+ m4_ifdef([gl_ICONV_MODULE_INDICATOR],
+ [gl_ICONV_MODULE_INDICATOR([iconv])])
+ gl_ICONV_H
+ gl_FUNC_INET_NTOP
+ if test $HAVE_INET_NTOP = 0 || test $REPLACE_INET_NTOP = 1; then
+ AC_LIBOBJ([inet_ntop])
+ gl_PREREQ_INET_NTOP
+ fi
+ gl_ARPA_INET_MODULE_INDICATOR([inet_ntop])
+ gl_INLINE
+ gl_INTTYPES_H
+ gl_INTTYPES_INCOMPLETE
+ gl_FUNC_IOCTL
+ if test $HAVE_IOCTL = 0 || test $REPLACE_IOCTL = 1; then
+ AC_LIBOBJ([ioctl])
+ fi
+ gl_SYS_IOCTL_MODULE_INDICATOR([ioctl])
+ gl_FUNC_ISBLANK
+ if test $HAVE_ISBLANK = 0; then
+ AC_LIBOBJ([isblank])
+ fi
+ gl_MODULE_INDICATOR([isblank])
+ gl_CTYPE_MODULE_INDICATOR([isblank])
+ gl_FUNC_ISWBLANK
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+ AC_LIBOBJ([iswblank])
+ fi
+ fi
+ gl_WCTYPE_MODULE_INDICATOR([iswblank])
+ gl_FUNC_ISWDIGIT
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $REPLACE_ISWDIGIT = 1; then
+ AC_LIBOBJ([iswdigit])
+ fi
+ fi
+ gl_WCTYPE_MODULE_INDICATOR([iswdigit])
+ gl_FUNC_ISWXDIGIT
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ :
+ else
+ if test $REPLACE_ISWXDIGIT = 1; then
+ AC_LIBOBJ([iswxdigit])
+ fi
+ fi
+ gl_WCTYPE_MODULE_INDICATOR([iswxdigit])
+ gl_LANGINFO_H
+ AC_REQUIRE([gl_LARGEFILE])
+ gl___INLINE
+ gl_LIBUNISTRING_OPTIONAL
+ gl_LIMITS_H
+ gl_FUNC_LINK
+ if test $HAVE_LINK = 0 || test $REPLACE_LINK = 1; then
+ AC_LIBOBJ([link])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([link])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([listen])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([listen])
+ gl_LOCALCHARSET
+ dnl For backward compatibility. Some packages still use this.
+ LOCALCHARSET_TESTS_ENVIRONMENT=
+ AC_SUBST([LOCALCHARSET_TESTS_ENVIRONMENT])
+ gl_LOCALE_H
+ gl_FUNC_LOCALECONV
+ if test $REPLACE_LOCALECONV = 1; then
+ AC_LIBOBJ([localeconv])
+ gl_PREREQ_LOCALECONV
+ fi
+ gl_LOCALE_MODULE_INDICATOR([localeconv])
+ gl_LOCK
+ gl_MODULE_INDICATOR([lock])
+ gl_FUNC_LSEEK
+ if test $REPLACE_LSEEK = 1; then
+ AC_LIBOBJ([lseek])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([lseek])
+ gl_FUNC_LSTAT
+ if test $REPLACE_LSTAT = 1; then
+ AC_LIBOBJ([lstat])
+ gl_PREREQ_LSTAT
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([lstat])
+ AC_CONFIG_COMMANDS_PRE([m4_ifdef([AH_HEADER],
+ [AC_SUBST([CONFIG_INCLUDE], m4_defn([AH_HEADER]))])])
+ AC_REQUIRE([AC_PROG_SED])
+ AC_REQUIRE([AC_PROG_GREP])
+ gl_FUNC_MALLOC_POSIX
+ if test $REPLACE_MALLOC = 1; then
+ AC_LIBOBJ([malloc])
+ fi
+ gl_STDLIB_MODULE_INDICATOR([malloc-posix])
+ gl_MALLOCA
+ gl_MBCHAR
+ gl_MBITER
+ gl_FUNC_MBRTOWC
+ if test $HAVE_MBRTOWC = 0 || test $REPLACE_MBRTOWC = 1; then
+ AC_LIBOBJ([mbrtowc])
+ if test $REPLACE_MBSTATE_T = 1; then
+ AC_LIBOBJ([lc-charset-dispatch])
+ AC_LIBOBJ([mbtowc-lock])
+ gl_PREREQ_MBTOWC_LOCK
+ fi
+ gl_PREREQ_MBRTOWC
+ fi
+ gl_WCHAR_MODULE_INDICATOR([mbrtowc])
+ gl_FUNC_MBSINIT
+ if test $HAVE_MBSINIT = 0 || test $REPLACE_MBSINIT = 1; then
+ AC_LIBOBJ([mbsinit])
+ gl_PREREQ_MBSINIT
+ fi
+ gl_WCHAR_MODULE_INDICATOR([mbsinit])
+ gl_FUNC_MBSRTOWCS
+ if test $HAVE_MBSRTOWCS = 0 || test $REPLACE_MBSRTOWCS = 1; then
+ AC_LIBOBJ([mbsrtowcs])
+ AC_LIBOBJ([mbsrtowcs-state])
+ gl_PREREQ_MBSRTOWCS
+ fi
+ gl_WCHAR_MODULE_INDICATOR([mbsrtowcs])
+ gl_FUNC_MBTOWC
+ if test $HAVE_MBTOWC = 0 || test $REPLACE_MBTOWC = 1; then
+ AC_LIBOBJ([mbtowc])
+ gl_PREREQ_MBTOWC
+ fi
+ gl_STDLIB_MODULE_INDICATOR([mbtowc])
+ gl_FUNC_MEMCHR
+ if test $REPLACE_MEMCHR = 1; then
+ AC_LIBOBJ([memchr])
+ gl_PREREQ_MEMCHR
+ fi
+ gl_STRING_MODULE_INDICATOR([memchr])
+ gl_FUNC_MEMPCPY
+ if test $HAVE_MEMPCPY = 0; then
+ AC_LIBOBJ([mempcpy])
+ gl_PREREQ_MEMPCPY
+ fi
+ gl_STRING_MODULE_INDICATOR([mempcpy])
+ gl_FUNC_MEMRCHR
+ if test $ac_cv_func_memrchr = no; then
+ AC_LIBOBJ([memrchr])
+ gl_PREREQ_MEMRCHR
+ fi
+ gl_STRING_MODULE_INDICATOR([memrchr])
+ gl_MINMAX
+ gl_FUNC_MKDIR
+ if test $REPLACE_MKDIR = 1; then
+ AC_LIBOBJ([mkdir])
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([mkdir])
+ gl_FUNC_MKOSTEMP
+ if test $HAVE_MKOSTEMP = 0; then
+ AC_LIBOBJ([mkostemp])
+ gl_PREREQ_MKOSTEMP
+ fi
+ gl_MODULE_INDICATOR([mkostemp])
+ gl_STDLIB_MODULE_INDICATOR([mkostemp])
+ gl_FUNC_MKSTEMP
+ if test $HAVE_MKSTEMP = 0 || test $REPLACE_MKSTEMP = 1; then
+ AC_LIBOBJ([mkstemp])
+ gl_PREREQ_MKSTEMP
+ fi
+ gl_STDLIB_MODULE_INDICATOR([mkstemp])
+ gl_FUNC_MKTIME
+ if test $REPLACE_MKTIME = 1; then
+ AC_LIBOBJ([mktime])
+ gl_PREREQ_MKTIME
+ fi
+ gl_TIME_MODULE_INDICATOR([mktime])
+ gl_FUNC_MKTIME_INTERNAL
+ if test $WANT_MKTIME_INTERNAL = 1; then
+ AC_LIBOBJ([mktime])
+ gl_PREREQ_MKTIME
+ fi
+ AC_REQUIRE([gl_MSVC_INVAL])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ AC_LIBOBJ([msvc-inval])
+ fi
+ AC_REQUIRE([gl_MSVC_NOTHROW])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ AC_LIBOBJ([msvc-nothrow])
+ fi
+ gl_MODULE_INDICATOR([msvc-nothrow])
+ gl_MULTIARCH
+ gl_FUNC_NANOSLEEP
+ if test $HAVE_NANOSLEEP = 0 || test $REPLACE_NANOSLEEP = 1; then
+ AC_LIBOBJ([nanosleep])
+ gl_PREREQ_NANOSLEEP
+ fi
+ gl_TIME_MODULE_INDICATOR([nanosleep])
+ gl_HEADER_NETDB
+ gl_HEADER_NETINET_IN
+ AC_PROG_MKDIR_P
+ gl_FUNC_NL_LANGINFO
+ if test $HAVE_NL_LANGINFO = 0 || test $REPLACE_NL_LANGINFO = 1; then
+ AC_LIBOBJ([nl_langinfo])
+ fi
+ if test $REPLACE_NL_LANGINFO = 1 && test $NL_LANGINFO_MTSAFE = 0; then
+ AC_LIBOBJ([nl_langinfo-lock])
+ gl_PREREQ_NL_LANGINFO_LOCK
+ fi
+ gl_LANGINFO_MODULE_INDICATOR([nl_langinfo])
+ gl_FUNC_OPEN
+ if test $REPLACE_OPEN = 1; then
+ AC_LIBOBJ([open])
+ gl_PREREQ_OPEN
+ fi
+ gl_FCNTL_MODULE_INDICATOR([open])
+ gl_FUNC_OPENAT
+ if test $HAVE_OPENAT = 0 || test $REPLACE_OPENAT = 1; then
+ AC_LIBOBJ([openat])
+ gl_PREREQ_OPENAT
+ fi
+ gl_MODULE_INDICATOR([openat]) dnl for lib/getcwd.c
+ gl_FCNTL_MODULE_INDICATOR([openat])
+ gl_FUNC_OPENDIR
+ if test $HAVE_OPENDIR = 0 || test $REPLACE_OPENDIR = 1; then
+ AC_LIBOBJ([opendir])
+ fi
+ gl_DIRENT_MODULE_INDICATOR([opendir])
+ gl_PATHMAX
+ gl_FUNC_PIPE
+ if test $HAVE_PIPE = 0; then
+ AC_LIBOBJ([pipe])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([pipe])
+ gl_FUNC_PIPE2
+ gl_UNISTD_MODULE_INDICATOR([pipe2])
+ gl_MODULE_INDICATOR([pipe2-safer])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawn])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawni])
+ gl_PREREQ_POSIX_SPAWN_INTERNAL
+ fi
+ gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 0 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = 1; then
+ AC_LIBOBJ([spawn_faction_addchdir])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addchdir])
+ gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = 1; then
+ AC_LIBOBJ([spawn_faction_addclose])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addclose])
+ gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = 1; then
+ AC_LIBOBJ([spawn_faction_adddup2])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_adddup2])
+ gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1 || test $REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = 1; then
+ AC_LIBOBJ([spawn_faction_addopen])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_addopen])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawn_faction_destroy])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_destroy])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawn_faction_init])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawn_file_actions_init])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnattr_destroy])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_destroy])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnattr_init])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_init])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnattr_setflags])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setflags])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnattr_setpgroup])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setpgroup])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnattr_setsigmask])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnattr_setsigmask])
+ gl_POSIX_SPAWN
+ if test $HAVE_POSIX_SPAWN = 0 || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_LIBOBJ([spawnp])
+ fi
+ gl_SPAWN_MODULE_INDICATOR([posix_spawnp])
+ gl_QUOTE
+ gl_QUOTEARG
+ gl_FUNC_RAISE
+ if test $HAVE_RAISE = 0 || test $REPLACE_RAISE = 1; then
+ AC_LIBOBJ([raise])
+ gl_PREREQ_RAISE
+ fi
+ gl_SIGNAL_MODULE_INDICATOR([raise])
+ gl_FUNC_RAWMEMCHR
+ if test $HAVE_RAWMEMCHR = 0; then
+ AC_LIBOBJ([rawmemchr])
+ gl_PREREQ_RAWMEMCHR
+ fi
+ gl_STRING_MODULE_INDICATOR([rawmemchr])
+ gl_FUNC_READDIR
+ if test $HAVE_READDIR = 0; then
+ AC_LIBOBJ([readdir])
+ fi
+ gl_DIRENT_MODULE_INDICATOR([readdir])
+ gl_FUNC_READLINK
+ if test $HAVE_READLINK = 0 || test $REPLACE_READLINK = 1; then
+ AC_LIBOBJ([readlink])
+ gl_PREREQ_READLINK
+ fi
+ gl_UNISTD_MODULE_INDICATOR([readlink])
+ gl_FUNC_REALLOC_POSIX
+ if test $REPLACE_REALLOC = 1; then
+ AC_LIBOBJ([realloc])
+ fi
+ gl_STDLIB_MODULE_INDICATOR([realloc-posix])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([recv])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([recv])
+ gl_REGEX
+ if test $ac_use_included_regex = yes; then
+ AC_LIBOBJ([regex])
+ gl_PREREQ_REGEX
+ fi
+ gl_FUNC_REWINDDIR
+ if test $HAVE_REWINDDIR = 0; then
+ AC_LIBOBJ([rewinddir])
+ fi
+ gl_DIRENT_MODULE_INDICATOR([rewinddir])
+ gl_SAVE_CWD
+ gl_SCHED_H
+ gl_FUNC_SECURE_GETENV
+ if test $HAVE_SECURE_GETENV = 0; then
+ AC_LIBOBJ([secure_getenv])
+ gl_PREREQ_SECURE_GETENV
+ fi
+ gl_STDLIB_MODULE_INDICATOR([secure_getenv])
+ gl_FUNC_SELECT
+ if test $REPLACE_SELECT = 1; then
+ AC_LIBOBJ([select])
+ fi
+ gl_SYS_SELECT_MODULE_INDICATOR([select])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([send])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([send])
+ gl_SERVENT
+ gl_FUNC_SETLOCALE_NULL
+ if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+ AC_LIBOBJ([setlocale-lock])
+ gl_PREREQ_SETLOCALE_LOCK
+ fi
+ gl_LOCALE_MODULE_INDICATOR([setlocale_null])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([setsockopt])
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([setsockopt])
+ gl_SH_FILENAME
+ gl_SIGACTION
+ if test $HAVE_SIGACTION = 0; then
+ AC_LIBOBJ([sigaction])
+ gl_PREREQ_SIGACTION
+ fi
+ gl_SIGNAL_MODULE_INDICATOR([sigaction])
+ gl_SIGNAL_H
+ gl_SIGNAL_SIGPIPE
+ dnl Define the C macro GNULIB_SIGPIPE to 1.
+ gl_MODULE_INDICATOR([sigpipe])
+ dnl Define the substituted variable GNULIB_SIGNAL_H_SIGPIPE to 1.
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ GNULIB_SIGNAL_H_SIGPIPE=1
+ dnl Define the substituted variable GNULIB_STDIO_H_SIGPIPE to 1.
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_REQUIRE([gl_ASM_SYMBOL_PREFIX])
+ GNULIB_STDIO_H_SIGPIPE=1
+ dnl Define the substituted variable GNULIB_UNISTD_H_SIGPIPE to 1.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ GNULIB_UNISTD_H_SIGPIPE=1
+ gl_SIGNALBLOCKING
+ if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+ AC_LIBOBJ([sigprocmask])
+ gl_PREREQ_SIGPROCMASK
+ fi
+ gl_SIGNAL_MODULE_INDICATOR([sigprocmask])
+ gl_SIZE_MAX
+ gl_FUNC_SNPRINTF
+ gl_STDIO_MODULE_INDICATOR([snprintf])
+ gl_MODULE_INDICATOR([snprintf])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ AC_LIBOBJ([socket])
+ fi
+ # When this module is used, sockets may actually occur as file descriptors,
+ # hence it is worth warning if the modules 'close' and 'ioctl' are not used.
+ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+ m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])])
+ AC_REQUIRE([gl_PREREQ_SYS_H_WINSOCK2])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=1
+ fi
+ gl_SYS_SOCKET_MODULE_INDICATOR([socket])
+ AC_REQUIRE([gl_SOCKETLIB])
+ AC_REQUIRE([gl_SOCKETS])
+ gl_TYPE_SOCKLEN_T
+ gl_SPAWN_H
+ gl_SPAWN_PIPE
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ os2*)
+ AC_LIBOBJ([os2-spawn])
+ ;;
+ esac
+ gt_TYPE_SSIZE_T
+ gl_FUNC_STAT
+ if test $REPLACE_STAT = 1; then
+ AC_LIBOBJ([stat])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([stat-w32])
+ ;;
+ esac
+ gl_PREREQ_STAT
+ fi
+ gl_SYS_STAT_MODULE_INDICATOR([stat])
+ gl_STAT_TIME
+ gl_STAT_BIRTHTIME
+ gl_STDALIGN_H
+ AM_STDBOOL_H
+ gl_STDDEF_H
+ gl_STDINT_H
+ gl_STDIO_H
+ gl_STDLIB_H
+ gl_FUNC_STPCPY
+ if test $HAVE_STPCPY = 0; then
+ AC_LIBOBJ([stpcpy])
+ gl_PREREQ_STPCPY
+ fi
+ gl_STRING_MODULE_INDICATOR([stpcpy])
+ gl_STRCASE
+ if test $HAVE_STRCASECMP = 0; then
+ AC_LIBOBJ([strcasecmp])
+ gl_PREREQ_STRCASECMP
+ fi
+ if test $HAVE_STRNCASECMP = 0; then
+ AC_LIBOBJ([strncasecmp])
+ gl_PREREQ_STRNCASECMP
+ fi
+ gl_FUNC_STRCHRNUL
+ if test $HAVE_STRCHRNUL = 0 || test $REPLACE_STRCHRNUL = 1; then
+ AC_LIBOBJ([strchrnul])
+ gl_PREREQ_STRCHRNUL
+ fi
+ gl_STRING_MODULE_INDICATOR([strchrnul])
+ gl_FUNC_STRDUP_POSIX
+ if test $REPLACE_STRDUP = 1; then
+ AC_LIBOBJ([strdup])
+ gl_PREREQ_STRDUP
+ fi
+ gl_STRING_MODULE_INDICATOR([strdup])
+ gl_FUNC_STRERROR
+ if test $REPLACE_STRERROR = 1; then
+ AC_LIBOBJ([strerror])
+ fi
+ gl_MODULE_INDICATOR([strerror])
+ gl_STRING_MODULE_INDICATOR([strerror])
+ AC_REQUIRE([gl_HEADER_ERRNO_H])
+ AC_REQUIRE([gl_FUNC_STRERROR_0])
+ if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
+ AC_LIBOBJ([strerror-override])
+ gl_PREREQ_SYS_H_WINSOCK2
+ fi
+ gl_FUNC_STRERROR_R
+ if test $HAVE_DECL_STRERROR_R = 0 || test $REPLACE_STRERROR_R = 1; then
+ AC_LIBOBJ([strerror_r])
+ gl_PREREQ_STRERROR_R
+ fi
+ gl_STRING_MODULE_INDICATOR([strerror_r])
+ dnl For the modules argp, error.
+ gl_MODULE_INDICATOR([strerror_r-posix])
+ gl_HEADER_STRING_H
+ gl_HEADER_STRINGS_H
+ gl_FUNC_STRNDUP
+ if test $HAVE_STRNDUP = 0 || test $REPLACE_STRNDUP = 1; then
+ AC_LIBOBJ([strndup])
+ fi
+ gl_STRING_MODULE_INDICATOR([strndup])
+ gl_FUNC_STRNLEN
+ if test $HAVE_DECL_STRNLEN = 0 || test $REPLACE_STRNLEN = 1; then
+ AC_LIBOBJ([strnlen])
+ gl_PREREQ_STRNLEN
+ fi
+ gl_STRING_MODULE_INDICATOR([strnlen])
+ gl_FUNC_STRPBRK
+ if test $HAVE_STRPBRK = 0; then
+ AC_LIBOBJ([strpbrk])
+ gl_PREREQ_STRPBRK
+ fi
+ gl_STRING_MODULE_INDICATOR([strpbrk])
+ gl_FUNC_STRPTIME
+ if test $HAVE_STRPTIME = 0; then
+ AC_LIBOBJ([strptime])
+ gl_PREREQ_STRPTIME
+ fi
+ gl_TIME_MODULE_INDICATOR([strptime])
+ gl_FUNC_STRTOK_R
+ if test $HAVE_STRTOK_R = 0 || test $REPLACE_STRTOK_R = 1; then
+ AC_LIBOBJ([strtok_r])
+ gl_PREREQ_STRTOK_R
+ fi
+ gl_STRING_MODULE_INDICATOR([strtok_r])
+ gl_FUNC_STRTOL
+ if test $ac_cv_func_strtol = no; then
+ AC_LIBOBJ([strtol])
+ fi
+ gl_FUNC_STRTOLL
+ if test $HAVE_STRTOLL = 0; then
+ AC_LIBOBJ([strtoll])
+ gl_PREREQ_STRTOLL
+ fi
+ gl_STDLIB_MODULE_INDICATOR([strtoll])
+ gl_FUNC_SYMLINK
+ if test $HAVE_SYMLINK = 0 || test $REPLACE_SYMLINK = 1; then
+ AC_LIBOBJ([symlink])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([symlink])
+ gl_HEADER_SYS_FILE_H
+ AC_PROG_MKDIR_P
+ gl_SYS_IOCTL_H
+ AC_PROG_MKDIR_P
+ gl_HEADER_SYS_RANDOM
+ AC_PROG_MKDIR_P
+ AC_REQUIRE([gl_HEADER_SYS_SELECT])
+ AC_PROG_MKDIR_P
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_PROG_MKDIR_P
+ gl_HEADER_SYS_STAT_H
+ AC_PROG_MKDIR_P
+ gl_HEADER_SYS_TIME_H
+ AC_PROG_MKDIR_P
+ gl_SYS_TYPES_H
+ AC_PROG_MKDIR_P
+ gl_HEADER_SYS_UIO
+ AC_PROG_MKDIR_P
+ gl_SYS_WAIT_H
+ AC_PROG_MKDIR_P
+ gl_FUNC_GEN_TEMPNAME
+ gl_MODULE_INDICATOR([tempname])
+ AC_CHECK_HEADERS([sys/single_threaded.h])
+ AC_REQUIRE([gl_THREADLIB])
+ gl_HEADER_TIME_H
+ gl_TIME_R
+ if test $HAVE_LOCALTIME_R = 0 || test $REPLACE_LOCALTIME_R = 1; then
+ AC_LIBOBJ([time_r])
+ gl_PREREQ_TIME_R
+ fi
+ gl_TIME_MODULE_INDICATOR([time_r])
+ gl_FUNC_TIMEGM
+ if test $HAVE_TIMEGM = 0 || test $REPLACE_TIMEGM = 1; then
+ AC_LIBOBJ([timegm])
+ gl_PREREQ_TIMEGM
+ fi
+ gl_TIME_MODULE_INDICATOR([timegm])
+ gl_TIMESPEC
+ gt_TMPDIR
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [unicase.h])
+ AC_REQUIRE([AC_C_INLINE])
+ gl_LIBUNISTRING_MODULE([0.9.1], [unicase/empty-prefix-context])
+ gl_LIBUNISTRING_MODULE([0.9.1], [unicase/empty-suffix-context])
+ AC_REQUIRE([AC_C_INLINE])
+ gl_LIBUNISTRING_MODULE([0.9.8], [unicase/tolower])
+ gl_LIBUNISTRING_MODULE([0.9.8], [unicase/u8-tolower])
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [unictype.h])
+ gl_LIBUNISTRING_MODULE([0.9.8], [unictype/combining-class])
+ AC_REQUIRE([AC_C_INLINE])
+ gl_LIBUNISTRING_MODULE([0.9.8], [unictype/property-soft-dotted])
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [uninorm.h])
+ gl_MODULE_INDICATOR_FOR_TESTS([uninorm/u8-normalize])
+ gl_LIBUNISTRING_MODULE([0.9.8], [uninorm/u8-normalize])
+ gl_UNISTD_H
+ gl_UNISTD_SAFER
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [unistr.h])
+ gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-cpy])
+ gl_MODULE_INDICATOR([unistr/u8-mbtouc-unsafe])
+ gl_LIBUNISTRING_MODULE([0.9.4], [unistr/u8-mbtouc-unsafe])
+ gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-strlen])
+ gl_MODULE_INDICATOR([unistr/u8-uctomb])
+ gl_LIBUNISTRING_MODULE([0.9], [unistr/u8-uctomb])
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [unitypes.h])
+ gl_LIBUNISTRING_LIBHEADER([0.9.4], [uniwidth.h])
+ gl_LIBUNISTRING_MODULE([0.9.8], [uniwidth/width])
+ gl_FUNC_UNLINK
+ if test $REPLACE_UNLINK = 1; then
+ AC_LIBOBJ([unlink])
+ fi
+ gl_UNISTD_MODULE_INDICATOR([unlink])
+ gl_FUNC_GLIBC_UNLOCKED_IO
+ gl_FUNC_UTIME
+ if test $HAVE_UTIME = 0 || test $REPLACE_UTIME = 1; then
+ AC_LIBOBJ([utime])
+ gl_PREREQ_UTIME
+ fi
+ gl_UTIME_MODULE_INDICATOR([utime])
+ gl_UTIME_H
+ gl_UTIMENS
+ AC_REQUIRE([AC_C_RESTRICT])
+ gl_FUNC_VASNPRINTF
+ gl_FUNC_VASPRINTF
+ gl_STDIO_MODULE_INDICATOR([vasprintf])
+ m4_ifdef([AM_XGETTEXT_OPTION],
+ [AM_][XGETTEXT_OPTION([--flag=asprintf:2:c-format])
+ AM_][XGETTEXT_OPTION([--flag=vasprintf:2:c-format])])
+ gl_FUNC_VSNPRINTF
+ gl_STDIO_MODULE_INDICATOR([vsnprintf])
+ gl_WAIT_PROCESS
+ gl_FUNC_WAITPID
+ if test $HAVE_WAITPID = 0; then
+ AC_LIBOBJ([waitpid])
+ fi
+ gl_SYS_WAIT_MODULE_INDICATOR([waitpid])
+ gl_WCHAR_H
+ gl_FUNC_WCRTOMB
+ if test $HAVE_WCRTOMB = 0 || test $REPLACE_WCRTOMB = 1; then
+ AC_LIBOBJ([wcrtomb])
+ gl_PREREQ_WCRTOMB
+ fi
+ gl_WCHAR_MODULE_INDICATOR([wcrtomb])
+ gl_WCTYPE_H
+ gl_FUNC_WCWIDTH
+ if test $HAVE_WCWIDTH = 0 || test $REPLACE_WCWIDTH = 1; then
+ AC_LIBOBJ([wcwidth])
+ gl_PREREQ_WCWIDTH
+ fi
+ gl_WCHAR_MODULE_INDICATOR([wcwidth])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([windows-mutex])
+ ;;
+ esac
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([windows-once])
+ ;;
+ esac
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([windows-recmutex])
+ ;;
+ esac
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([windows-rwlock])
+ ;;
+ esac
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_LIBOBJ([windows-spawn])
+ ;;
+ esac
+ gl_FUNC_WMEMCHR
+ if test $HAVE_WMEMCHR = 0; then
+ AC_LIBOBJ([wmemchr])
+ fi
+ gl_WCHAR_MODULE_INDICATOR([wmemchr])
+ gl_FUNC_WMEMPCPY
+ if test $HAVE_WMEMPCPY = 0; then
+ AC_LIBOBJ([wmempcpy])
+ fi
+ gl_WCHAR_MODULE_INDICATOR([wmempcpy])
+ gl_FUNC_WRITE
+ if test $REPLACE_WRITE = 1; then
+ AC_LIBOBJ([write])
+ gl_PREREQ_WRITE
+ fi
+ gl_UNISTD_MODULE_INDICATOR([write])
+ gl_XALLOC
+ gl_MODULE_INDICATOR([xalloc])
+ gl_MODULE_INDICATOR([xalloc-die])
+ gl_XSIZE
+ gl_XSTRNDUP
+ # End of code from modules
+ m4_ifval(gl_LIBSOURCES_LIST, [
+ m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
+ for gl_file in ]gl_LIBSOURCES_LIST[ ; do
+ if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then
+ echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2
+ exit 1
+ fi
+ done])dnl
+ m4_if(m4_sysval, [0], [],
+ [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+ ])
+ m4_popdef([gl_LIBSOURCES_DIR])
+ m4_popdef([gl_LIBSOURCES_LIST])
+ m4_popdef([AC_LIBSOURCES])
+ m4_popdef([AC_REPLACE_FUNCS])
+ m4_popdef([AC_LIBOBJ])
+ AC_CONFIG_COMMANDS_PRE([
+ gl_libobjs=
+ gl_ltlibobjs=
+ if test -n "$gl_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gl_libobjs="$gl_libobjs $i.$ac_objext"
+ gl_ltlibobjs="$gl_ltlibobjs $i.lo"
+ done
+ fi
+ AC_SUBST([gl_LIBOBJS], [$gl_libobjs])
+ AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs])
+ ])
+ gltests_libdeps=
+ gltests_ltlibdeps=
+ m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ]))
+ m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS]))
+ m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
+ m4_pushdef([gltests_LIBSOURCES_LIST], [])
+ m4_pushdef([gltests_LIBSOURCES_DIR], [])
+ gl_COMMON
+ gl_source_base='lib/tests'
+changequote(,)dnl
+ gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+changequote([, ])dnl
+ AC_SUBST([gltests_WITNESS])
+ gl_module_indicator_condition=$gltests_WITNESS
+ m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition])
+ m4_popdef([gl_MODULE_INDICATOR_CONDITION])
+ m4_ifval(gltests_LIBSOURCES_LIST, [
+ m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ ||
+ for gl_file in ]gltests_LIBSOURCES_LIST[ ; do
+ if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then
+ echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2
+ exit 1
+ fi
+ done])dnl
+ m4_if(m4_sysval, [0], [],
+ [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+ ])
+ m4_popdef([gltests_LIBSOURCES_DIR])
+ m4_popdef([gltests_LIBSOURCES_LIST])
+ m4_popdef([AC_LIBSOURCES])
+ m4_popdef([AC_REPLACE_FUNCS])
+ m4_popdef([AC_LIBOBJ])
+ AC_CONFIG_COMMANDS_PRE([
+ gltests_libobjs=
+ gltests_ltlibobjs=
+ if test -n "$gltests_LIBOBJS"; then
+ # Remove the extension.
+ sed_drop_objext='s/\.o$//;s/\.obj$//'
+ for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+ gltests_libobjs="$gltests_libobjs $i.$ac_objext"
+ gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
+ done
+ fi
+ AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs])
+ AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs])
+ ])
+ LIBGNU_LIBDEPS="$gl_libdeps"
+ AC_SUBST([LIBGNU_LIBDEPS])
+ LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+ AC_SUBST([LIBGNU_LTLIBDEPS])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_LIBOBJ], [
+ AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl
+ gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_REPLACE_FUNCS], [
+ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+ AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gl_LIBSOURCES], [
+ m4_foreach([_gl_NAME], [$1], [
+ m4_if(_gl_NAME, [alloca.c], [], [
+ m4_define([gl_LIBSOURCES_DIR], [lib])
+ m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ])
+ ])
+ ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_LIBOBJ], [
+ AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl
+ gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_REPLACE_FUNCS], [
+ m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+ AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gltests_LIBSOURCES], [
+ m4_foreach([_gl_NAME], [$1], [
+ m4_if(_gl_NAME, [alloca.c], [], [
+ m4_define([gltests_LIBSOURCES_DIR], [lib/tests])
+ m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ])
+ ])
+ ])
+])
+
+# This macro records the list of files which have been installed by
+# gnulib-tool and may be removed by future gnulib-tool invocations.
+AC_DEFUN([gl_FILE_LIST], [
+ build-aux/announce-gen
+ build-aux/config.rpath
+ build-aux/git-version-gen
+ build-aux/gitlog-to-changelog
+ build-aux/gnupload
+ build-aux/update-copyright
+ build-aux/useless-if-before-free
+ build-aux/vc-list-files
+ lib/_Noreturn.h
+ lib/accept.c
+ lib/access.c
+ lib/af_alg.c
+ lib/af_alg.h
+ lib/alloca.c
+ lib/alloca.in.h
+ lib/arg-nonnull.h
+ lib/arpa_inet.in.h
+ lib/array-mergesort.h
+ lib/asnprintf.c
+ lib/asprintf.c
+ lib/assure.h
+ lib/at-func.c
+ lib/attribute.h
+ lib/base32.c
+ lib/base32.h
+ lib/basename-lgpl.c
+ lib/basename-lgpl.h
+ lib/basename.c
+ lib/binary-io.c
+ lib/binary-io.h
+ lib/bind.c
+ lib/bitrotate.c
+ lib/bitrotate.h
+ lib/btowc.c
+ lib/byteswap.in.h
+ lib/c++defs.h
+ lib/c-ctype.c
+ lib/c-ctype.h
+ lib/c-strcase.h
+ lib/c-strcasecmp.c
+ lib/c-strcaseeq.h
+ lib/c-strcasestr.c
+ lib/c-strcasestr.h
+ lib/c-strncasecmp.c
+ lib/canonicalize.c
+ lib/canonicalize.h
+ lib/cdefs.h
+ lib/chdir-long.c
+ lib/chdir-long.h
+ lib/cloexec.c
+ lib/cloexec.h
+ lib/close.c
+ lib/closedir.c
+ lib/concat-filename.c
+ lib/concat-filename.h
+ lib/connect.c
+ lib/ctype.in.h
+ lib/dirent-private.h
+ lib/dirent.in.h
+ lib/dirfd.c
+ lib/dirname-lgpl.c
+ lib/dirname.c
+ lib/dirname.h
+ lib/dup-safer-flag.c
+ lib/dup-safer.c
+ lib/dup.c
+ lib/dup2.c
+ lib/errno.in.h
+ lib/error.c
+ lib/error.h
+ lib/exitfail.c
+ lib/exitfail.h
+ lib/fatal-signal.c
+ lib/fatal-signal.h
+ lib/fchdir.c
+ lib/fcntl.c
+ lib/fcntl.in.h
+ lib/fd-hook.c
+ lib/fd-hook.h
+ lib/fd-safer-flag.c
+ lib/fd-safer.c
+ lib/fdopendir.c
+ lib/fflush.c
+ lib/file-set.c
+ lib/file-set.h
+ lib/filename.h
+ lib/filenamecat-lgpl.c
+ lib/filenamecat.h
+ lib/findprog-in.c
+ lib/findprog.h
+ lib/flexmember.h
+ lib/float+.h
+ lib/float.c
+ lib/float.in.h
+ lib/flock.c
+ lib/fnmatch.c
+ lib/fnmatch.in.h
+ lib/fnmatch_loop.c
+ lib/fopen.c
+ lib/fpurge.c
+ lib/freading.c
+ lib/freading.h
+ lib/free.c
+ lib/fseek.c
+ lib/fseeko.c
+ lib/fstat.c
+ lib/fstatat.c
+ lib/ftell.c
+ lib/ftello.c
+ lib/futimens.c
+ lib/gai_strerror.c
+ lib/getaddrinfo.c
+ lib/getcwd-lgpl.c
+ lib/getcwd.c
+ lib/getdelim.c
+ lib/getdtablesize.c
+ lib/getgroups.c
+ lib/getline.c
+ lib/getopt-cdefs.in.h
+ lib/getopt-core.h
+ lib/getopt-ext.h
+ lib/getopt-pfx-core.h
+ lib/getopt-pfx-ext.h
+ lib/getopt.c
+ lib/getopt.in.h
+ lib/getopt1.c
+ lib/getopt_int.h
+ lib/getpass.c
+ lib/getpass.h
+ lib/getpeername.c
+ lib/getprogname.c
+ lib/getprogname.h
+ lib/getrandom.c
+ lib/getsockname.c
+ lib/gettext.h
+ lib/gettime.c
+ lib/gettimeofday.c
+ lib/gl_openssl.h
+ lib/glthread/lock.c
+ lib/glthread/lock.h
+ lib/glthread/threadlib.c
+ lib/group-member.c
+ lib/hard-locale.c
+ lib/hard-locale.h
+ lib/hash-pjw.c
+ lib/hash-pjw.h
+ lib/hash-triple-simple.c
+ lib/hash-triple.h
+ lib/hash.c
+ lib/hash.h
+ lib/iconv.in.h
+ lib/idx.h
+ lib/inet_ntop.c
+ lib/intprops.h
+ lib/inttypes.in.h
+ lib/ioctl.c
+ lib/isblank.c
+ lib/iswblank.c
+ lib/iswdigit.c
+ lib/iswxdigit.c
+ lib/itold.c
+ lib/langinfo.in.h
+ lib/lc-charset-dispatch.c
+ lib/lc-charset-dispatch.h
+ lib/libc-config.h
+ lib/libunistring.valgrind
+ lib/limits.in.h
+ lib/link.c
+ lib/listen.c
+ lib/localcharset.c
+ lib/localcharset.h
+ lib/locale.in.h
+ lib/localeconv.c
+ lib/lseek.c
+ lib/lstat.c
+ lib/malloc.c
+ lib/malloc/scratch_buffer.h
+ lib/malloc/scratch_buffer_dupfree.c
+ lib/malloc/scratch_buffer_grow.c
+ lib/malloc/scratch_buffer_grow_preserve.c
+ lib/malloc/scratch_buffer_set_array_size.c
+ lib/malloca.c
+ lib/malloca.h
+ lib/mbchar.c
+ lib/mbchar.h
+ lib/mbiter.c
+ lib/mbiter.h
+ lib/mbrtowc-impl-utf8.h
+ lib/mbrtowc-impl.h
+ lib/mbrtowc.c
+ lib/mbsinit.c
+ lib/mbsrtowcs-impl.h
+ lib/mbsrtowcs-state.c
+ lib/mbsrtowcs.c
+ lib/mbtowc-impl.h
+ lib/mbtowc-lock.c
+ lib/mbtowc-lock.h
+ lib/mbtowc.c
+ lib/md2.c
+ lib/md2.h
+ lib/md4.c
+ lib/md4.h
+ lib/md5.c
+ lib/md5.h
+ lib/memchr.c
+ lib/memchr.valgrind
+ lib/mempcpy.c
+ lib/memrchr.c
+ lib/minmax.h
+ lib/mkdir.c
+ lib/mkostemp.c
+ lib/mkstemp.c
+ lib/mktime-internal.h
+ lib/mktime.c
+ lib/msvc-inval.c
+ lib/msvc-inval.h
+ lib/msvc-nothrow.c
+ lib/msvc-nothrow.h
+ lib/nanosleep.c
+ lib/netdb.in.h
+ lib/netinet_in.in.h
+ lib/nl_langinfo-lock.c
+ lib/nl_langinfo.c
+ lib/open.c
+ lib/openat-die.c
+ lib/openat-priv.h
+ lib/openat-proc.c
+ lib/openat.c
+ lib/openat.h
+ lib/opendir.c
+ lib/os2-spawn.c
+ lib/os2-spawn.h
+ lib/pathmax.h
+ lib/pipe-safer.c
+ lib/pipe.c
+ lib/pipe2-safer.c
+ lib/pipe2.c
+ lib/printf-args.c
+ lib/printf-args.h
+ lib/printf-parse.c
+ lib/printf-parse.h
+ lib/quote.h
+ lib/quotearg.c
+ lib/quotearg.h
+ lib/raise.c
+ lib/rawmemchr.c
+ lib/rawmemchr.valgrind
+ lib/readdir.c
+ lib/readlink.c
+ lib/realloc.c
+ lib/recv.c
+ lib/regcomp.c
+ lib/regex.c
+ lib/regex.h
+ lib/regex_internal.c
+ lib/regex_internal.h
+ lib/regexec.c
+ lib/rewinddir.c
+ lib/same-inode.h
+ lib/save-cwd.c
+ lib/save-cwd.h
+ lib/sched.in.h
+ lib/scratch_buffer.h
+ lib/secure_getenv.c
+ lib/select.c
+ lib/send.c
+ lib/setlocale-lock.c
+ lib/setlocale_null.c
+ lib/setlocale_null.h
+ lib/setsockopt.c
+ lib/sha1.c
+ lib/sha1.h
+ lib/sha256.c
+ lib/sha256.h
+ lib/sha512.c
+ lib/sha512.h
+ lib/sig-handler.c
+ lib/sig-handler.h
+ lib/sigaction.c
+ lib/signal.in.h
+ lib/sigprocmask.c
+ lib/size_max.h
+ lib/snprintf.c
+ lib/socket.c
+ lib/sockets.c
+ lib/sockets.h
+ lib/spawn-pipe.c
+ lib/spawn-pipe.h
+ lib/spawn.c
+ lib/spawn.in.h
+ lib/spawn_faction_addchdir.c
+ lib/spawn_faction_addclose.c
+ lib/spawn_faction_adddup2.c
+ lib/spawn_faction_addopen.c
+ lib/spawn_faction_destroy.c
+ lib/spawn_faction_init.c
+ lib/spawn_int.h
+ lib/spawnattr_destroy.c
+ lib/spawnattr_init.c
+ lib/spawnattr_setflags.c
+ lib/spawnattr_setpgroup.c
+ lib/spawnattr_setsigmask.c
+ lib/spawni.c
+ lib/spawnp.c
+ lib/stat-time.c
+ lib/stat-time.h
+ lib/stat-w32.c
+ lib/stat-w32.h
+ lib/stat.c
+ lib/stdalign.in.h
+ lib/stdbool.in.h
+ lib/stddef.in.h
+ lib/stdint.in.h
+ lib/stdio-impl.h
+ lib/stdio-write.c
+ lib/stdio.in.h
+ lib/stdlib.in.h
+ lib/stpcpy.c
+ lib/str-two-way.h
+ lib/strcasecmp.c
+ lib/strchrnul.c
+ lib/strchrnul.valgrind
+ lib/strdup.c
+ lib/streq.h
+ lib/strerror-override.c
+ lib/strerror-override.h
+ lib/strerror.c
+ lib/strerror_r.c
+ lib/string.in.h
+ lib/strings.in.h
+ lib/stripslash.c
+ lib/strncasecmp.c
+ lib/strndup.c
+ lib/strnlen.c
+ lib/strnlen1.c
+ lib/strnlen1.h
+ lib/strpbrk.c
+ lib/strptime.c
+ lib/strtok_r.c
+ lib/strtol.c
+ lib/strtoll.c
+ lib/symlink.c
+ lib/sys-limits.h
+ lib/sys_file.in.h
+ lib/sys_ioctl.in.h
+ lib/sys_random.in.h
+ lib/sys_select.in.h
+ lib/sys_socket.c
+ lib/sys_socket.in.h
+ lib/sys_stat.in.h
+ lib/sys_time.in.h
+ lib/sys_types.in.h
+ lib/sys_uio.in.h
+ lib/sys_wait.in.h
+ lib/tempname.c
+ lib/tempname.h
+ lib/thread-optim.h
+ lib/time.in.h
+ lib/time_r.c
+ lib/timegm.c
+ lib/timespec.c
+ lib/timespec.h
+ lib/tmpdir.c
+ lib/tmpdir.h
+ lib/u64.c
+ lib/u64.h
+ lib/unicase.in.h
+ lib/unicase/cased.c
+ lib/unicase/cased.h
+ lib/unicase/caseprop.h
+ lib/unicase/context.h
+ lib/unicase/empty-prefix-context.c
+ lib/unicase/empty-suffix-context.c
+ lib/unicase/ignorable.c
+ lib/unicase/ignorable.h
+ lib/unicase/simple-mapping.h
+ lib/unicase/special-casing-table.gperf
+ lib/unicase/special-casing.c
+ lib/unicase/special-casing.in.h
+ lib/unicase/tolower.c
+ lib/unicase/tolower.h
+ lib/unicase/u-casemap.h
+ lib/unicase/u8-casemap.c
+ lib/unicase/u8-tolower.c
+ lib/unicase/unicasemap.h
+ lib/unictype.in.h
+ lib/unictype/bitmap.h
+ lib/unictype/combiningclass.c
+ lib/unictype/combiningclass.h
+ lib/unictype/pr_soft_dotted.c
+ lib/unictype/pr_soft_dotted.h
+ lib/uninorm.in.h
+ lib/uninorm/decompose-internal.c
+ lib/uninorm/decompose-internal.h
+ lib/uninorm/normalize-internal.h
+ lib/uninorm/u-normalize-internal.h
+ lib/uninorm/u8-normalize.c
+ lib/unistd--.h
+ lib/unistd-safer.h
+ lib/unistd.c
+ lib/unistd.in.h
+ lib/unistr.in.h
+ lib/unistr/u-cpy.h
+ lib/unistr/u8-cpy.c
+ lib/unistr/u8-mbtouc-unsafe-aux.c
+ lib/unistr/u8-mbtouc-unsafe.c
+ lib/unistr/u8-strlen.c
+ lib/unistr/u8-uctomb-aux.c
+ lib/unistr/u8-uctomb.c
+ lib/unitypes.in.h
+ lib/uniwidth.in.h
+ lib/uniwidth/cjk.h
+ lib/uniwidth/width.c
+ lib/unlink.c
+ lib/unlocked-io.h
+ lib/unused-parameter.h
+ lib/utime.c
+ lib/utime.in.h
+ lib/utimens.c
+ lib/utimens.h
+ lib/vasnprintf.c
+ lib/vasnprintf.h
+ lib/vasprintf.c
+ lib/verify.h
+ lib/vsnprintf.c
+ lib/w32sock.h
+ lib/wait-process.c
+ lib/wait-process.h
+ lib/waitpid.c
+ lib/warn-on-use.h
+ lib/wchar.in.h
+ lib/wcrtomb.c
+ lib/wctype-h.c
+ lib/wctype.in.h
+ lib/wcwidth.c
+ lib/windows-initguard.h
+ lib/windows-mutex.c
+ lib/windows-mutex.h
+ lib/windows-once.c
+ lib/windows-once.h
+ lib/windows-recmutex.c
+ lib/windows-recmutex.h
+ lib/windows-rwlock.c
+ lib/windows-rwlock.h
+ lib/windows-spawn.c
+ lib/windows-spawn.h
+ lib/wmemchr-impl.h
+ lib/wmemchr.c
+ lib/wmempcpy.c
+ lib/write.c
+ lib/xalloc-die.c
+ lib/xalloc-oversized.h
+ lib/xalloc.h
+ lib/xmalloc.c
+ lib/xmemdup0.c
+ lib/xmemdup0.h
+ lib/xsize.c
+ lib/xsize.h
+ lib/xstrndup.c
+ lib/xstrndup.h
+ m4/00gnulib.m4
+ m4/__inline.m4
+ m4/absolute-header.m4
+ m4/access.m4
+ m4/af_alg.m4
+ m4/alloca.m4
+ m4/arpa_inet_h.m4
+ m4/asm-underscore.m4
+ m4/base32.m4
+ m4/btowc.m4
+ m4/builtin-expect.m4
+ m4/byteswap.m4
+ m4/canonicalize.m4
+ m4/chdir-long.m4
+ m4/clock_time.m4
+ m4/close.m4
+ m4/closedir.m4
+ m4/codeset.m4
+ m4/ctype.m4
+ m4/d-ino.m4
+ m4/dirent_h.m4
+ m4/dirfd.m4
+ m4/double-slash-root.m4
+ m4/dup.m4
+ m4/dup2.m4
+ m4/eaccess.m4
+ m4/eealloc.m4
+ m4/environ.m4
+ m4/errno_h.m4
+ m4/error.m4
+ m4/exponentd.m4
+ m4/extensions.m4
+ m4/extern-inline.m4
+ m4/fatal-signal.m4
+ m4/fchdir.m4
+ m4/fcntl-o.m4
+ m4/fcntl.m4
+ m4/fcntl_h.m4
+ m4/fdopendir.m4
+ m4/fflush.m4
+ m4/filenamecat.m4
+ m4/findprog-in.m4
+ m4/flexmember.m4
+ m4/float_h.m4
+ m4/flock.m4
+ m4/fnmatch.m4
+ m4/fnmatch_h.m4
+ m4/fopen.m4
+ m4/fpurge.m4
+ m4/freading.m4
+ m4/free.m4
+ m4/fseek.m4
+ m4/fseeko.m4
+ m4/fstat.m4
+ m4/fstatat.m4
+ m4/ftell.m4
+ m4/ftello.m4
+ m4/futimens.m4
+ m4/getaddrinfo.m4
+ m4/getcwd-abort-bug.m4
+ m4/getcwd-path-max.m4
+ m4/getcwd.m4
+ m4/getdelim.m4
+ m4/getdtablesize.m4
+ m4/getgroups.m4
+ m4/getline.m4
+ m4/getopt.m4
+ m4/getpagesize.m4
+ m4/getpass.m4
+ m4/getprogname.m4
+ m4/getrandom.m4
+ m4/gettime.m4
+ m4/gettimeofday.m4
+ m4/gl-openssl.m4
+ m4/gnulib-common.m4
+ m4/group-member.m4
+ m4/host-cpu-c-abi.m4
+ m4/hostent.m4
+ m4/iconv.m4
+ m4/iconv_h.m4
+ m4/include_next.m4
+ m4/inet_ntop.m4
+ m4/inline.m4
+ m4/intmax_t.m4
+ m4/inttypes.m4
+ m4/inttypes_h.m4
+ m4/ioctl.m4
+ m4/isblank.m4
+ m4/iswblank.m4
+ m4/iswdigit.m4
+ m4/iswxdigit.m4
+ m4/langinfo_h.m4
+ m4/largefile.m4
+ m4/lib-ld.m4
+ m4/lib-link.m4
+ m4/lib-prefix.m4
+ m4/libunistring-base.m4
+ m4/libunistring-optional.m4
+ m4/libunistring.m4
+ m4/limits-h.m4
+ m4/link.m4
+ m4/localcharset.m4
+ m4/locale-fr.m4
+ m4/locale-ja.m4
+ m4/locale-zh.m4
+ m4/locale_h.m4
+ m4/localeconv.m4
+ m4/lock.m4
+ m4/lseek.m4
+ m4/lstat.m4
+ m4/malloc.m4
+ m4/malloca.m4
+ m4/math_h.m4
+ m4/mbchar.m4
+ m4/mbiter.m4
+ m4/mbrtowc.m4
+ m4/mbsinit.m4
+ m4/mbsrtowcs.m4
+ m4/mbstate_t.m4
+ m4/mbtowc.m4
+ m4/md4.m4
+ m4/md5.m4
+ m4/memchr.m4
+ m4/mempcpy.m4
+ m4/memrchr.m4
+ m4/minmax.m4
+ m4/mkdir.m4
+ m4/mkostemp.m4
+ m4/mkstemp.m4
+ m4/mktime.m4
+ m4/mmap-anon.m4
+ m4/mode_t.m4
+ m4/msvc-inval.m4
+ m4/msvc-nothrow.m4
+ m4/multiarch.m4
+ m4/nanosleep.m4
+ m4/netdb_h.m4
+ m4/netinet_in_h.m4
+ m4/nl_langinfo.m4
+ m4/nocrash.m4
+ m4/off_t.m4
+ m4/open-cloexec.m4
+ m4/open-slash.m4
+ m4/open.m4
+ m4/openat.m4
+ m4/opendir.m4
+ m4/pathmax.m4
+ m4/pid_t.m4
+ m4/pipe.m4
+ m4/pipe2.m4
+ m4/posix_spawn.m4
+ m4/posix_spawn_faction_addchdir.m4
+ m4/printf.m4
+ m4/pthread_rwlock_rdlock.m4
+ m4/quote.m4
+ m4/quotearg.m4
+ m4/raise.m4
+ m4/rawmemchr.m4
+ m4/readdir.m4
+ m4/readlink.m4
+ m4/realloc.m4
+ m4/regex.m4
+ m4/rewinddir.m4
+ m4/save-cwd.m4
+ m4/sched_h.m4
+ m4/secure_getenv.m4
+ m4/select.m4
+ m4/servent.m4
+ m4/setlocale_null.m4
+ m4/sh-filename.m4
+ m4/sha1.m4
+ m4/sha256.m4
+ m4/sha512.m4
+ m4/sig_atomic_t.m4
+ m4/sigaction.m4
+ m4/signal_h.m4
+ m4/signalblocking.m4
+ m4/sigpipe.m4
+ m4/size_max.m4
+ m4/snprintf.m4
+ m4/socketlib.m4
+ m4/sockets.m4
+ m4/socklen.m4
+ m4/sockpfaf.m4
+ m4/spawn-pipe.m4
+ m4/spawn_h.m4
+ m4/ssize_t.m4
+ m4/stat-time.m4
+ m4/stat.m4
+ m4/std-gnu11.m4
+ m4/stdalign.m4
+ m4/stdbool.m4
+ m4/stddef_h.m4
+ m4/stdint.m4
+ m4/stdint_h.m4
+ m4/stdio_h.m4
+ m4/stdlib_h.m4
+ m4/stpcpy.m4
+ m4/strcase.m4
+ m4/strchrnul.m4
+ m4/strdup.m4
+ m4/strerror.m4
+ m4/strerror_r.m4
+ m4/string_h.m4
+ m4/strings_h.m4
+ m4/strndup.m4
+ m4/strnlen.m4
+ m4/strpbrk.m4
+ m4/strptime.m4
+ m4/strtok_r.m4
+ m4/strtol.m4
+ m4/strtoll.m4
+ m4/symlink.m4
+ m4/sys_file_h.m4
+ m4/sys_ioctl_h.m4
+ m4/sys_random_h.m4
+ m4/sys_select_h.m4
+ m4/sys_socket_h.m4
+ m4/sys_stat_h.m4
+ m4/sys_time_h.m4
+ m4/sys_types_h.m4
+ m4/sys_uio_h.m4
+ m4/sys_wait_h.m4
+ m4/tempname.m4
+ m4/threadlib.m4
+ m4/time_h.m4
+ m4/time_r.m4
+ m4/timegm.m4
+ m4/timespec.m4
+ m4/tm_gmtoff.m4
+ m4/tmpdir.m4
+ m4/unistd-safer.m4
+ m4/unistd_h.m4
+ m4/unlink.m4
+ m4/unlocked-io.m4
+ m4/utime.m4
+ m4/utime_h.m4
+ m4/utimens.m4
+ m4/utimes.m4
+ m4/vasnprintf.m4
+ m4/vasprintf.m4
+ m4/visibility.m4
+ m4/vsnprintf.m4
+ m4/wait-process.m4
+ m4/waitpid.m4
+ m4/warn-on-use.m4
+ m4/warnings.m4
+ m4/wchar_h.m4
+ m4/wchar_t.m4
+ m4/wcrtomb.m4
+ m4/wctype_h.m4
+ m4/wcwidth.m4
+ m4/wint_t.m4
+ m4/wmemchr.m4
+ m4/wmempcpy.m4
+ m4/write.m4
+ m4/xalloc.m4
+ m4/xsize.m4
+ m4/xstrndup.m4
+ m4/zzgnulib.m4
+ top/GNUmakefile
+ top/maint.mk
+])
diff --git a/m4/group-member.m4 b/m4/group-member.m4
new file mode 100644
index 0000000..ad7368c
--- /dev/null
+++ b/m4/group-member.m4
@@ -0,0 +1,29 @@
+# serial 14
+
+# Copyright (C) 1999-2001, 2003-2007, 2009-2020 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.
+
+dnl Written by Jim Meyering
+
+AC_DEFUN([gl_FUNC_GROUP_MEMBER],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare group_member().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl Do this replacement check manually because I want the hyphen
+ dnl (not the underscore) in the filename.
+ AC_CHECK_FUNC([group_member], , [
+ HAVE_GROUP_MEMBER=0
+ ])
+])
+
+# Prerequisites of lib/group-member.c.
+AC_DEFUN([gl_PREREQ_GROUP_MEMBER],
+[
+ AC_REQUIRE([AC_FUNC_GETGROUPS])
+])
diff --git a/m4/host-cpu-c-abi.m4 b/m4/host-cpu-c-abi.m4
new file mode 100644
index 0000000..6db2aa2
--- /dev/null
+++ b/m4/host-cpu-c-abi.m4
@@ -0,0 +1,675 @@
+# host-cpu-c-abi.m4 serial 13
+dnl Copyright (C) 2002-2020 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 and Sam Steingold.
+
+dnl Sets the HOST_CPU variable to the canonical name of the CPU.
+dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its
+dnl C language ABI (application binary interface).
+dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in
+dnl config.h.
+dnl
+dnl This canonical name can be used to select a particular assembly language
+dnl source file that will interoperate with C code on the given host.
+dnl
+dnl For example:
+dnl * 'i386' and 'sparc' are different canonical names, because code for i386
+dnl will not run on SPARC CPUs and vice versa. They have different
+dnl instruction sets.
+dnl * 'sparc' and 'sparc64' are different canonical names, because code for
+dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code
+dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit
+dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit
+dnl mode, but not both.
+dnl * 'mips' and 'mipsn32' are different canonical names, because they use
+dnl different argument passing and return conventions for C functions, and
+dnl although the instruction set of 'mips' is a large subset of the
+dnl instruction set of 'mipsn32'.
+dnl * 'mipsn32' and 'mips64' are different canonical names, because they use
+dnl different sizes for the C types like 'int' and 'void *', and although
+dnl the instruction sets of 'mipsn32' and 'mips64' are the same.
+dnl * The same canonical name is used for different endiannesses. You can
+dnl determine the endianness through preprocessor symbols:
+dnl - 'arm': test __ARMEL__.
+dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL.
+dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN.
+dnl * The same name 'i386' is used for CPUs of type i386, i486, i586
+dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because
+dnl - Instructions that do not exist on all of these CPUs (cmpxchg,
+dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your
+dnl assembly language source files use such instructions, you will
+dnl need to make the distinction.
+dnl - Speed of execution of the common instruction set is reasonable across
+dnl the entire family of CPUs. If you have assembly language source files
+dnl that are optimized for particular CPU types (like GNU gmp has), you
+dnl will need to make the distinction.
+dnl See <https://en.wikipedia.org/wiki/X86_instruction_listings>.
+AC_DEFUN([gl_HOST_CPU_C_ABI],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_C_ASM])
+ AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi],
+ [case "$host_cpu" in
+
+changequote(,)dnl
+ i[34567]86 )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi=i386
+ ;;
+
+ x86_64 )
+ # On x86_64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+ # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+ # with native Windows (mingw, MSVC).
+ # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if (defined __x86_64__ || defined __amd64__ \
+ || defined _M_X64 || defined _M_AMD64)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __ILP32__ || defined _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=x86_64-x32],
+ [gl_cv_host_cpu_c_abi=x86_64])],
+ [gl_cv_host_cpu_c_abi=i386])
+ ;;
+
+changequote(,)dnl
+ alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi=alpha
+ ;;
+
+ arm* | aarch64 )
+ # Assume arm with EABI.
+ # On arm64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+ # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef __aarch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __ILP32__ || defined _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=arm64-ilp32],
+ [gl_cv_host_cpu_c_abi=arm64])],
+ [# Don't distinguish little-endian and big-endian arm, since they
+ # don't require different machine code for simple operations and
+ # since the user can distinguish them through the preprocessor
+ # defines __ARMEL__ vs. __ARMEB__.
+ # But distinguish arm which passes floating-point arguments and
+ # return values in integer registers (r0, r1, ...) - this is
+ # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which
+ # passes them in float registers (s0, s1, ...) and double registers
+ # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer
+ # sets the preprocessor defines __ARM_PCS (for the first case) and
+ # __ARM_PCS_VFP (for the second case), but older GCC does not.
+ echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c
+ # Look for a reference to the register d0 in the .s file.
+ AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
+ if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then
+ gl_cv_host_cpu_c_abi=armhf
+ else
+ gl_cv_host_cpu_c_abi=arm
+ fi
+ rm -f conftest*
+ ])
+ ;;
+
+ hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+ # On hppa, the C compiler may be generating 32-bit code or 64-bit
+ # code. In the latter case, it defines _LP64 and __LP64__.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=hppa64],
+ [gl_cv_host_cpu_c_abi=hppa])
+ ;;
+
+ ia64* )
+ # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+ # 32-bit code. In the latter case, it defines _ILP32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=ia64-ilp32],
+ [gl_cv_host_cpu_c_abi=ia64])
+ ;;
+
+ mips* )
+ # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+ # at 32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=mips64],
+ [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but
+ # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32.
+ # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but
+ # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if (_MIPS_SIM == _ABIN32)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=mipsn32],
+ [gl_cv_host_cpu_c_abi=mips])])
+ ;;
+
+ powerpc* )
+ # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+ # No need to distinguish them here; the caller may distinguish
+ # them based on the OS.
+ # On powerpc64 systems, the C compiler may still be generating
+ # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+ # be generating 64-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __powerpc64__ || defined _ARCH_PPC64
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [# On powerpc64, there are two ABIs on Linux: The AIX compatible
+ # one and the ELFv2 one. The latter defines _CALL_ELF=2.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined _CALL_ELF && _CALL_ELF == 2
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=powerpc64-elfv2],
+ [gl_cv_host_cpu_c_abi=powerpc64])
+ ],
+ [gl_cv_host_cpu_c_abi=powerpc])
+ ;;
+
+ rs6000 )
+ gl_cv_host_cpu_c_abi=powerpc
+ ;;
+
+ riscv32 | riscv64 )
+ # There are 2 architectures (with variants): rv32* and rv64*.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if __riscv_xlen == 64
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [cpu=riscv64],
+ [cpu=riscv32])
+ # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+ # Size of 'long' and 'void *':
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [main_abi=lp64],
+ [main_abi=ilp32])
+ # Float ABIs:
+ # __riscv_float_abi_double:
+ # 'float' and 'double' are passed in floating-point registers.
+ # __riscv_float_abi_single:
+ # 'float' are passed in floating-point registers.
+ # __riscv_float_abi_soft:
+ # No values are passed in floating-point registers.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __riscv_float_abi_double
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [float_abi=d],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __riscv_float_abi_single
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [float_abi=f],
+ [float_abi=''])
+ ])
+ gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
+ ;;
+
+ s390* )
+ # On s390x, the C compiler may be generating 64-bit (= s390x) code
+ # or 31-bit (= s390) code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __s390x__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=s390x],
+ [gl_cv_host_cpu_c_abi=s390])
+ ;;
+
+ sparc | sparc64 )
+ # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+ # C compiler still generates 32-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi=sparc64],
+ [gl_cv_host_cpu_c_abi=sparc])
+ ;;
+
+ *)
+ gl_cv_host_cpu_c_abi="$host_cpu"
+ ;;
+ esac
+ ])
+
+ dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same.
+ HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'`
+ HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi"
+ AC_SUBST([HOST_CPU])
+ AC_SUBST([HOST_CPU_C_ABI])
+
+ # This was
+ # AC_DEFINE_UNQUOTED([__${HOST_CPU}__])
+ # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__])
+ # earlier, but KAI C++ 3.2d doesn't like this.
+ sed -e 's/-/_/g' >> confdefs.h <<EOF
+#ifndef __${HOST_CPU}__
+#define __${HOST_CPU}__ 1
+#endif
+#ifndef __${HOST_CPU_C_ABI}__
+#define __${HOST_CPU_C_ABI}__ 1
+#endif
+EOF
+ AH_TOP([/* CPU and C ABI indicator */
+#ifndef __i386__
+#undef __i386__
+#endif
+#ifndef __x86_64_x32__
+#undef __x86_64_x32__
+#endif
+#ifndef __x86_64__
+#undef __x86_64__
+#endif
+#ifndef __alpha__
+#undef __alpha__
+#endif
+#ifndef __arm__
+#undef __arm__
+#endif
+#ifndef __armhf__
+#undef __armhf__
+#endif
+#ifndef __arm64_ilp32__
+#undef __arm64_ilp32__
+#endif
+#ifndef __arm64__
+#undef __arm64__
+#endif
+#ifndef __hppa__
+#undef __hppa__
+#endif
+#ifndef __hppa64__
+#undef __hppa64__
+#endif
+#ifndef __ia64_ilp32__
+#undef __ia64_ilp32__
+#endif
+#ifndef __ia64__
+#undef __ia64__
+#endif
+#ifndef __m68k__
+#undef __m68k__
+#endif
+#ifndef __mips__
+#undef __mips__
+#endif
+#ifndef __mipsn32__
+#undef __mipsn32__
+#endif
+#ifndef __mips64__
+#undef __mips64__
+#endif
+#ifndef __powerpc__
+#undef __powerpc__
+#endif
+#ifndef __powerpc64__
+#undef __powerpc64__
+#endif
+#ifndef __powerpc64_elfv2__
+#undef __powerpc64_elfv2__
+#endif
+#ifndef __riscv32__
+#undef __riscv32__
+#endif
+#ifndef __riscv64__
+#undef __riscv64__
+#endif
+#ifndef __riscv32_ilp32__
+#undef __riscv32_ilp32__
+#endif
+#ifndef __riscv32_ilp32f__
+#undef __riscv32_ilp32f__
+#endif
+#ifndef __riscv32_ilp32d__
+#undef __riscv32_ilp32d__
+#endif
+#ifndef __riscv64_ilp32__
+#undef __riscv64_ilp32__
+#endif
+#ifndef __riscv64_ilp32f__
+#undef __riscv64_ilp32f__
+#endif
+#ifndef __riscv64_ilp32d__
+#undef __riscv64_ilp32d__
+#endif
+#ifndef __riscv64_lp64__
+#undef __riscv64_lp64__
+#endif
+#ifndef __riscv64_lp64f__
+#undef __riscv64_lp64f__
+#endif
+#ifndef __riscv64_lp64d__
+#undef __riscv64_lp64d__
+#endif
+#ifndef __s390__
+#undef __s390__
+#endif
+#ifndef __s390x__
+#undef __s390x__
+#endif
+#ifndef __sh__
+#undef __sh__
+#endif
+#ifndef __sparc__
+#undef __sparc__
+#endif
+#ifndef __sparc64__
+#undef __sparc64__
+#endif
+])
+
+])
+
+
+dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI
+dnl (application binary interface) is a 32-bit one, to 'no' if it is a 64-bit
+dnl one, or to 'unknown' if unknown.
+dnl This is a simplified variant of gl_HOST_CPU_C_ABI.
+AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit],
+ [if test -n "$gl_cv_host_cpu_c_abi"; then
+ case "$gl_cv_host_cpu_c_abi" in
+ i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
+ gl_cv_host_cpu_c_abi_32bit=yes ;;
+ x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
+ gl_cv_host_cpu_c_abi_32bit=no ;;
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown ;;
+ esac
+ else
+ case "$host_cpu" in
+
+ # CPUs that only support a 32-bit ABI.
+ arc \
+ | bfin \
+ | cris* \
+ | csky \
+ | epiphany \
+ | ft32 \
+ | h8300 \
+ | m68k \
+ | microblaze | microblazeel \
+ | nds32 | nds32le | nds32be \
+ | nios2 | nios2eb | nios2el \
+ | or1k* \
+ | or32 \
+ | sh | sh[1234] | sh[1234]e[lb] \
+ | tic6x \
+ | xtensa* )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ # CPUs that only support a 64-bit ABI.
+changequote(,)dnl
+ alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
+ | mmix )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi_32bit=no
+ ;;
+
+changequote(,)dnl
+ i[34567]86 )
+changequote([,])dnl
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ x86_64 )
+ # On x86_64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+ # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+ # with native Windows (mingw, MSVC).
+ # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if (defined __x86_64__ || defined __amd64__ \
+ || defined _M_X64 || defined _M_AMD64) \
+ && !(defined __ILP32__ || defined _ILP32)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ arm* | aarch64 )
+ # Assume arm with EABI.
+ # On arm64 systems, the C compiler may be generating code in one of
+ # these ABIs:
+ # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+ # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+ # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+ # On hppa, the C compiler may be generating 32-bit code or 64-bit
+ # code. In the latter case, it defines _LP64 and __LP64__.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ ia64* )
+ # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+ # 32-bit code. In the latter case, it defines _ILP32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifdef _ILP32
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=yes],
+ [gl_cv_host_cpu_c_abi_32bit=no])
+ ;;
+
+ mips* )
+ # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+ # at 32.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ powerpc* )
+ # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+ # No need to distinguish them here; the caller may distinguish
+ # them based on the OS.
+ # On powerpc64 systems, the C compiler may still be generating
+ # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+ # be generating 64-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __powerpc64__ || defined _ARCH_PPC64
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ rs6000 )
+ gl_cv_host_cpu_c_abi_32bit=yes
+ ;;
+
+ riscv32 | riscv64 )
+ # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+ # Size of 'long' and 'void *':
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ s390* )
+ # On s390x, the C compiler may be generating 64-bit (= s390x) code
+ # or 31-bit (= s390) code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __LP64__ || defined __s390x__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ sparc | sparc64 )
+ # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+ # C compiler still generates 32-bit code.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [gl_cv_host_cpu_c_abi_32bit=no],
+ [gl_cv_host_cpu_c_abi_32bit=yes])
+ ;;
+
+ *)
+ gl_cv_host_cpu_c_abi_32bit=unknown
+ ;;
+ esac
+ fi
+ ])
+
+ HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
+])
diff --git a/m4/hostent.m4 b/m4/hostent.m4
new file mode 100644
index 0000000..2860452
--- /dev/null
+++ b/m4/hostent.m4
@@ -0,0 +1,49 @@
+# hostent.m4 serial 3
+dnl Copyright (C) 2008, 2010-2020 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.
+
+AC_DEFUN([gl_HOSTENT],
+[
+ dnl Where are gethostent(), sethostent(), endhostent(), gethostbyname(),
+ dnl gethostbyaddr() defined?
+ dnl - On Solaris < 11.4, they are in libnsl. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ HOSTENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([gethostbyname], [nsl network net],
+ [if test "$ac_cv_search_gethostbyname" != "none required"; then
+ HOSTENT_LIB="$ac_cv_search_gethostbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$HOSTENT_LIB"; then
+ AC_CHECK_FUNCS([gethostbyname], , [
+ AC_CACHE_CHECK([for gethostbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_gethostbyname],
+ [gl_cv_w32_gethostbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+ ]],
+ [[gethostbyname(NULL);]])],
+ [gl_cv_w32_gethostbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_gethostbyname" = "yes"; then
+ HOSTENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([HOSTENT_LIB])
+])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644
index 0000000..f8a536b
--- /dev/null
+++ b/m4/iconv.m4
@@ -0,0 +1,282 @@
+# iconv.m4 serial 23
+dnl Copyright (C) 2000-2002, 2007-2014, 2016-2020 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.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.64])
+
+dnl Note: AM_ICONV is documented in the GNU gettext manual
+dnl <https://www.gnu.org/software/gettext/manual/html_node/AM_005fICONV.html>.
+dnl Don't make changes that are incompatible with that documentation!
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+ 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_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], [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ 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_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, 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
+ am_cv_func_iconv_works=no
+ for ac_iconv_const in '' 'const'; do
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+ ]],
+ [[int result = 0;
+ /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+ returns. */
+ {
+ iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+ if (cd_utf8_to_88591 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+ char buf[10];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_utf8_to_88591,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if (res == 0)
+ 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 ICONV_CONST char input[] = "\263";
+ char buf[10];
+ ICONV_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,
+ &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 ICONV_CONST char input[] = "\304";
+ static char buf[2] = { (char)0xDE, (char)0xAD };
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = 1;
+ char *outptr = buf;
+ size_t outbytesleft = 1;
+ size_t res = iconv (cd_88591_to_utf8,
+ &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. */
+ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
+ {
+ iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+ if (cd_88591_to_utf8 != (iconv_t)(-1))
+ {
+ static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+ char buf[50];
+ ICONV_CONST char *inptr = input;
+ size_t inbytesleft = strlen (input);
+ char *outptr = buf;
+ size_t outbytesleft = sizeof (buf);
+ size_t res = iconv (cd_88591_to_utf8,
+ &inptr, &inbytesleft,
+ &outptr, &outbytesleft);
+ if ((int)res > 0)
+ result |= 8;
+ iconv_close (cd_88591_to_utf8);
+ }
+ }
+#endif
+ /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+ provided. */
+ {
+ /* Try standardized names. */
+ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
+ /* Try IRIX, OSF/1 names. */
+ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
+ /* Try AIX names. */
+ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
+ /* Try HP-UX names. */
+ iconv_t cd4 = iconv_open ("utf8", "eucJP");
+ if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
+ && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
+ result |= 16;
+ if (cd1 != (iconv_t)(-1))
+ iconv_close (cd1);
+ if (cd2 != (iconv_t)(-1))
+ iconv_close (cd2);
+ if (cd3 != (iconv_t)(-1))
+ iconv_close (cd3);
+ if (cd4 != (iconv_t)(-1))
+ iconv_close (cd4);
+ }
+ return result;
+]])],
+ [am_cv_func_iconv_works=yes], ,
+ [case "$host_os" in
+ aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+ *) am_cv_func_iconv_works="guessing yes" ;;
+ esac])
+ test "$am_cv_func_iconv_works" = no || break
+ done
+ LIBS="$am_save_LIBS"
+ ])
+ case "$am_cv_func_iconv_works" in
+ *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+ *) am_func_iconv=yes ;;
+ esac
+ else
+ am_func_iconv=no am_cv_lib_iconv=no
+ fi
+ if test "$am_func_iconv" = yes; then
+ AC_DEFINE([HAVE_ICONV], [1],
+ [Define if you have the iconv() function and it works.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST([LIBICONV])
+ AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to 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.
+AC_DEFUN_ONCE([AM_ICONV],
+[
+ AM_ICONV_LINK
+ if test "$am_cv_func_iconv" = yes; then
+ AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature],
+ [gl_cv_iconv_nonconst],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+ ]],
+ [[]])],
+ [gl_cv_iconv_nonconst=yes],
+ [gl_cv_iconv_nonconst=no])
+ ])
+ else
+ dnl When compiling GNU libiconv on a system that does not have iconv yet,
+ dnl pick the POSIX compliant declaration without 'const'.
+ gl_cv_iconv_nonconst=yes
+ fi
+ if test $gl_cv_iconv_nonconst = yes; then
+ iconv_arg1=""
+ else
+ iconv_arg1="const"
+ fi
+ AC_DEFINE_UNQUOTED([ICONV_CONST], [$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 $gl_cv_iconv_nonconst != yes; then
+ ICONV_CONST="const"
+ fi
+ ])
+])
diff --git a/m4/iconv_h.m4 b/m4/iconv_h.m4
new file mode 100644
index 0000000..23d41c9
--- /dev/null
+++ b/m4/iconv_h.m4
@@ -0,0 +1,57 @@
+# iconv_h.m4 serial 12
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_ICONV_H],
+[
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+
+ dnl Execute this unconditionally, because ICONV_H may be set by other
+ dnl modules, after this code is executed.
+ gl_CHECK_NEXT_HEADERS([iconv.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <iconv.h>
+ ]], [iconv iconv_open])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+dnl Unconditionally enables the replacement of <iconv.h>.
+AC_DEFUN([gl_REPLACE_ICONV_H],
+[
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ ICONV_H='iconv.h'
+ AM_CONDITIONAL([GL_GENERATE_ICONV_H], [test -n "$ICONV_H"])
+])
+
+AC_DEFUN([gl_ICONV_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_ICONV_H_DEFAULTS],
+[
+ m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])])
+ GNULIB_ICONV=0; AC_SUBST([GNULIB_ICONV])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ ICONV_CONST=; AC_SUBST([ICONV_CONST])
+ REPLACE_ICONV=0; AC_SUBST([REPLACE_ICONV])
+ REPLACE_ICONV_OPEN=0; AC_SUBST([REPLACE_ICONV_OPEN])
+ REPLACE_ICONV_UTF=0; AC_SUBST([REPLACE_ICONV_UTF])
+ ICONV_H=''; AC_SUBST([ICONV_H])
+ m4_ifdef([gl_POSIXCHECK],
+ [ICONV_H='iconv.h'],
+ [if m4_ifdef([gl_ANSI_CXX], [test "$CXX" != no], [false]); then
+ dnl Override <fnmatch.h> always, to support the C++ GNULIB_NAMESPACE.
+ ICONV_H='iconv.h'
+ fi
+ ])
+ AM_CONDITIONAL([GL_GENERATE_ICONV_H], [test -n "$ICONV_H"])
+])
diff --git a/m4/include_next.m4 b/m4/include_next.m4
new file mode 100644
index 0000000..9221d9f
--- /dev/null
+++ b/m4/include_next.m4
@@ -0,0 +1,224 @@
+# include_next.m4 serial 26
+dnl Copyright (C) 2006-2020 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 and Derek Price.
+
+dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER,
+dnl and PRAGMA_COLUMNS.
+dnl
+dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
+dnl 'include' otherwise.
+dnl
+dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
+dnl supports it in the special case that it is the first include directive in
+dnl the given file, or to 'include' otherwise.
+dnl
+dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
+dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
+dnl '#pragma GCC system_header' has the same effect as if the file was found
+dnl through the include search path specified with '-isystem' options (as
+dnl opposed to the search path specified with '-I' options). Namely, gcc
+dnl does not warn about some things, and on some systems (Solaris and Interix)
+dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
+dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
+dnl of plain '__STDC__'.
+dnl
+dnl PRAGMA_COLUMNS can be used in files that override system header files, so
+dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
+dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
+dnl has the effect of truncating the lines of that file and all files that it
+dnl includes to 80 columns) and the gnulib file has lines longer than 80
+dnl columns.
+
+AC_DEFUN([gl_INCLUDE_NEXT],
+[
+ AC_LANG_PREPROC_REQUIRE()
+ AC_CACHE_CHECK([whether the preprocessor supports include_next],
+ [gl_cv_have_include_next],
+ [rm -rf conftestd1a conftestd1b conftestd2
+ mkdir conftestd1a conftestd1b conftestd2
+ dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
+ dnl AIX 6.1 support include_next when used as first preprocessor directive
+ dnl in a file, but not when preceded by another include directive. Check
+ dnl for this bug by including <stdio.h>.
+ dnl Additionally, with this same compiler, include_next is a no-op when
+ dnl used in a header file that was included by specifying its absolute
+ dnl file name. Despite these two bugs, include_next is used in the
+ dnl compiler's <math.h>. By virtue of the second bug, we need to use
+ dnl include_next as well in this case.
+ cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+ cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+ gl_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+dnl We intentionally avoid using AC_LANG_SOURCE here.
+ AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+ [gl_cv_have_include_next=yes],
+ [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+ AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+ [gl_cv_have_include_next=buggy],
+ [gl_cv_have_include_next=no])
+ ])
+ CPPFLAGS="$gl_save_CPPFLAGS"
+ rm -rf conftestd1a conftestd1b conftestd2
+ ])
+ PRAGMA_SYSTEM_HEADER=
+ if test $gl_cv_have_include_next = yes; then
+ INCLUDE_NEXT=include_next
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ if test -n "$GCC"; then
+ PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+ fi
+ else
+ if test $gl_cv_have_include_next = buggy; then
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+ else
+ INCLUDE_NEXT=include
+ INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+ fi
+ fi
+ AC_SUBST([INCLUDE_NEXT])
+ AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
+ AC_SUBST([PRAGMA_SYSTEM_HEADER])
+
+ dnl HP NonStop systems, which define __TANDEM, limit the line length
+ dnl after including some system header files.
+ AC_CACHE_CHECK([whether source code line length is unlimited],
+ [gl_cv_source_line_length_unlimited],
+ [AC_EGREP_CPP([choke me],
+ [
+#ifdef __TANDEM
+choke me
+#endif
+ ],
+ [gl_cv_source_line_length_unlimited=no],
+ [gl_cv_source_line_length_unlimited=yes])
+ ])
+ if test $gl_cv_source_line_length_unlimited = no; then
+ PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+ else
+ PRAGMA_COLUMNS=
+ fi
+ AC_SUBST([PRAGMA_COLUMNS])
+])
+
+# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------------
+# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
+# '<foo.h>'; otherwise define it to be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# Also, if #include_next works as first preprocessing directive in a file,
+# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
+# be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# That way, a header file with the following line:
+# #@INCLUDE_NEXT@ @NEXT_FOO_H@
+# or
+# #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
+# behaves (after sed substitution) as if it contained
+# #include_next <foo.h>
+# even if the compiler does not support include_next.
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+#
+# This macro also checks whether each header exists, by invoking
+# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
+AC_DEFUN([gl_CHECK_NEXT_HEADERS],
+[
+ gl_NEXT_HEADERS_INTERNAL([$1], [check])
+])
+
+# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------
+# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
+# This is suitable for headers like <stddef.h> that are standardized by C89
+# and therefore can be assumed to exist.
+AC_DEFUN([gl_NEXT_HEADERS],
+[
+ gl_NEXT_HEADERS_INTERNAL([$1], [assume])
+])
+
+# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
+AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
+[
+ AC_REQUIRE([gl_INCLUDE_NEXT])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ m4_if([$2], [check],
+ [AC_CHECK_HEADERS_ONCE([$1])
+ ])
+
+ m4_foreach_w([gl_HEADER_NAME], [$1],
+ [AS_VAR_PUSHDEF([gl_next_header],
+ [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
+ if test $gl_cv_have_include_next = yes; then
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ else
+ AC_CACHE_CHECK(
+ [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+ [gl_next_header],
+ [m4_if([$2], [check],
+ [AS_VAR_PUSHDEF([gl_header_exists],
+ [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
+ if test AS_VAR_GET([gl_header_exists]) = yes; then
+ AS_VAR_POPDEF([gl_header_exists])
+ ])
+ gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
+ AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
+ AS_VAR_SET([gl_next_header], ['"'$gl_header'"'])
+ m4_if([$2], [check],
+ [else
+ AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
+ fi
+ ])
+ ])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
+ [AS_VAR_GET([gl_next_header])])
+ if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+ gl_next_as_first_directive='<'gl_HEADER_NAME'>'
+ else
+ # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+ gl_next_as_first_directive=AS_VAR_GET([gl_next_header])
+ fi
+ AC_SUBST(
+ AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
+ [$gl_next_as_first_directive])
+ AS_VAR_POPDEF([gl_next_header])])
+])
+
+# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
+# this fallback is safe for all earlier autoconf versions.
+m4_define_default([AC_LANG_DEFINES_PROVIDED])
diff --git a/m4/inet_ntop.m4 b/m4/inet_ntop.m4
new file mode 100644
index 0000000..39a6a9b
--- /dev/null
+++ b/m4/inet_ntop.m4
@@ -0,0 +1,70 @@
+# inet_ntop.m4 serial 21
+dnl Copyright (C) 2005-2006, 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_INET_NTOP],
+[
+ AC_REQUIRE([gl_ARPA_INET_H_DEFAULTS])
+
+ dnl Persuade Solaris <arpa/inet.h> to declare inet_ntop.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ dnl Most platforms that provide inet_ntop define it in libc.
+ dnl Solaris 8..10 provide inet_ntop in libnsl instead.
+ dnl Solaris 2.6..7 provide inet_ntop in libresolv instead.
+ dnl Haiku provides it in -lnetwork.
+ dnl Native Windows provides it in -lws2_32 instead, with a declaration in
+ dnl <ws2tcpip.h>, and it uses stdcall calling convention, not cdecl
+ dnl (hence we cannot use AC_CHECK_FUNCS, AC_SEARCH_LIBS to find it).
+ HAVE_INET_NTOP=1
+ INET_NTOP_LIB=
+ gl_PREREQ_SYS_H_WINSOCK2
+ if test $HAVE_WINSOCK2_H = 1; then
+ dnl It needs to be overridden, because the stdcall calling convention
+ dnl is not compliant with POSIX. Set REPLACE_INET_NTOP in order to avoid
+ dnl a name conflict at the linker level, even though the header file
+ dnl <ws2tcpip.h> declares inet_ntop only if _WIN32_WINNT >= 0x0600.
+ REPLACE_INET_NTOP=1
+ AC_CHECK_DECLS([inet_ntop],,, [[#include <ws2tcpip.h>]])
+ if test $ac_cv_have_decl_inet_ntop = yes; then
+ INET_NTOP_LIB="-lws2_32"
+ else
+ HAVE_DECL_INET_NTOP=0
+ fi
+ else
+ gl_save_LIBS=$LIBS
+ AC_SEARCH_LIBS([inet_ntop], [nsl resolv network], [],
+ [AC_CHECK_FUNCS([inet_ntop])
+ if test $ac_cv_func_inet_ntop = no; then
+ HAVE_INET_NTOP=0
+ fi
+ ])
+ LIBS=$gl_save_LIBS
+
+ if test "$ac_cv_search_inet_ntop" != "no" \
+ && test "$ac_cv_search_inet_ntop" != "none required"; then
+ INET_NTOP_LIB="$ac_cv_search_inet_ntop"
+ fi
+
+ AC_CHECK_HEADERS_ONCE([netdb.h])
+ AC_CHECK_DECLS([inet_ntop],,,
+ [[#include <arpa/inet.h>
+ #if HAVE_NETDB_H
+ # include <netdb.h>
+ #endif
+ ]])
+ if test $ac_cv_have_decl_inet_ntop = no; then
+ HAVE_DECL_INET_NTOP=0
+ fi
+ fi
+ AC_SUBST([INET_NTOP_LIB])
+])
+
+# Prerequisites of lib/inet_ntop.c.
+AC_DEFUN([gl_PREREQ_INET_NTOP], [
+ AC_REQUIRE([gl_SOCKET_FAMILIES])
+])
diff --git a/m4/inline.m4 b/m4/inline.m4
new file mode 100644
index 0000000..0a7cd8b
--- /dev/null
+++ b/m4/inline.m4
@@ -0,0 +1,40 @@
+# inline.m4 serial 4
+dnl Copyright (C) 2006, 2009-2020 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 Test for the 'inline' keyword or equivalent.
+dnl Define 'inline' to a supported equivalent, or to nothing if not supported,
+dnl like AC_C_INLINE does. Also, define HAVE_INLINE if 'inline' or an
+dnl equivalent is effectively supported, i.e. if the compiler is likely to
+dnl drop unused 'static inline' functions.
+AC_DEFUN([gl_INLINE],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_CACHE_CHECK([whether the compiler generally respects inline],
+ [gl_cv_c_inline_effective],
+ [if test $ac_cv_c_inline = no; then
+ gl_cv_c_inline_effective=no
+ else
+ dnl GCC defines __NO_INLINE__ if not optimizing or if -fno-inline is
+ dnl specified.
+ dnl Use AC_COMPILE_IFELSE here, not AC_EGREP_CPP, because the result
+ dnl depends on optimization flags, which can be in CFLAGS.
+ dnl (AC_EGREP_CPP looks only at the CPPFLAGS.)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]],
+ [[#ifdef __NO_INLINE__
+ #error "inline is not effective"
+ #endif]])],
+ [gl_cv_c_inline_effective=yes],
+ [gl_cv_c_inline_effective=no])
+ fi
+ ])
+ if test $gl_cv_c_inline_effective = yes; then
+ AC_DEFINE([HAVE_INLINE], [1],
+ [Define to 1 if the compiler supports one of the keywords
+ 'inline', '__inline__', '__inline' and effectively inlines
+ functions marked as such.])
+ fi
+])
diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4
new file mode 100644
index 0000000..8a045f6
--- /dev/null
+++ b/m4/intlmacosx.m4
@@ -0,0 +1,56 @@
+# 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.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+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 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_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 Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+ fi
+ 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_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 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
+ INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+ fi
+ AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/m4/intmax_t.m4 b/m4/intmax_t.m4
new file mode 100644
index 0000000..72fc8a9
--- /dev/null
+++ b/m4/intmax_t.m4
@@ -0,0 +1,59 @@
+# intmax_t.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006-2007, 2009-2020 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.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.53])
+
+# Define intmax_t to 'long' or 'long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_INTMAX_T],
+[
+ dnl For simplicity, we assume that a header file defines 'intmax_t' if and
+ dnl only if it defines 'uintmax_t'.
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+ AC_DEFINE_UNQUOTED([intmax_t], [long long],
+ [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
+ else
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ fi
+])
+
+dnl An alternative would be to explicitly test for 'intmax_t'.
+
+AC_DEFUN([gt_AC_TYPE_INTMAX_T],
+[
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+ ]],
+ [[intmax_t x = -1; return !x;]])],
+ [gt_cv_c_intmax_t=yes],
+ [gt_cv_c_intmax_t=no])])
+ if test $gt_cv_c_intmax_t = yes; then
+ AC_DEFINE([HAVE_INTMAX_T], [1],
+ [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+ else
+ AC_DEFINE_UNQUOTED([intmax_t], [long long],
+ [Define to long or long long if <stdint.h> and <inttypes.h> don't define.])
+ fi
+])
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
new file mode 100644
index 0000000..84b1654
--- /dev/null
+++ b/m4/inttypes.m4
@@ -0,0 +1,165 @@
+# inttypes.m4 serial 32
+dnl Copyright (C) 2006-2020 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 Derek Price, Bruno Haible.
+dnl Test whether <inttypes.h> is supported or must be substituted.
+
+AC_DEFUN([gl_INTTYPES_H],
+[
+ AC_REQUIRE([gl_INTTYPES_INCOMPLETE])
+ gl_INTTYPES_PRI_SCN
+])
+
+AC_DEFUN_ONCE([gl_INTTYPES_INCOMPLETE],
+[
+ AC_REQUIRE([gl_STDINT_H])
+ AC_CHECK_HEADERS_ONCE([inttypes.h])
+
+ dnl Override <inttypes.h> always, so that the portability warnings work.
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([inttypes.h])
+
+ AC_REQUIRE([gl_MULTIARCH])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <inttypes.h>
+ ]], [imaxabs imaxdiv strtoimax strtoumax])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+# Ensure that the PRI* and SCN* macros are defined appropriately.
+AC_DEFUN([gl_INTTYPES_PRI_SCN],
+[
+ PRIPTR_PREFIX=
+ if test -n "$STDINT_H"; then
+ dnl Using the gnulib <stdint.h>. It defines intptr_t to 'long' or
+ dnl 'long long', depending on _WIN64.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifdef _WIN64
+ LLP64
+ #endif
+ ]])
+ ],
+ [PRIPTR_PREFIX='"l"'],
+ [PRIPTR_PREFIX='"ll"'])
+ else
+ dnl Using the system's <stdint.h>.
+ for glpfx in '' l ll I64; do
+ case $glpfx in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ I64) gltype1='__int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdint.h>
+ extern intptr_t foo;
+ extern $gltype1 foo;]])],
+ [PRIPTR_PREFIX='"'$glpfx'"'])
+ test -n "$PRIPTR_PREFIX" && break
+ done
+ fi
+ AC_SUBST([PRIPTR_PREFIX])
+
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT32_MAX_LT_INTMAX_MAX],
+ [defined INT32_MAX && defined INTMAX_MAX],
+ [INT32_MAX < INTMAX_MAX],
+ [sizeof (int) < sizeof (long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [INT64_MAX_EQ_LONG_MAX],
+ [defined INT64_MAX],
+ [INT64_MAX == LONG_MAX],
+ [sizeof (long long int) == sizeof (long int)])
+ else
+ INT64_MAX_EQ_LONG_MAX=-1
+ fi
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT32_MAX_LT_UINTMAX_MAX],
+ [defined UINT32_MAX && defined UINTMAX_MAX],
+ [UINT32_MAX < UINTMAX_MAX],
+ [sizeof (unsigned int) < sizeof (unsigned long long int)])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION(
+ [UINT64_MAX_EQ_ULONG_MAX],
+ [defined UINT64_MAX],
+ [UINT64_MAX == ULONG_MAX],
+ [sizeof (unsigned long long int) == sizeof (unsigned long int)])
+ else
+ UINT64_MAX_EQ_ULONG_MAX=-1
+ fi
+])
+
+# Define the symbol $1 to be 1 if the condition is true, 0 otherwise.
+# If $2 is true, the condition is $3; otherwise if long long int is supported
+# approximate the condition with $4; otherwise, assume the condition is false.
+# The condition should work on all C99 platforms; the approximations should be
+# good enough to work on all practical pre-C99 platforms.
+# $2 is evaluated by the C preprocessor, $3 and $4 as compile-time constants.
+AC_DEFUN([gl_INTTYPES_CHECK_LONG_LONG_INT_CONDITION],
+[
+ AC_CACHE_CHECK([whether $3],
+ [gl_cv_test_$1],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* Work also in C++ mode. */
+ #define __STDC_LIMIT_MACROS 1
+
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+
+ #include <limits.h>
+ #if HAVE_STDINT_H
+ #include <stdint.h>
+ #endif
+
+ #if $2
+ #define CONDITION ($3)
+ #else
+ #define CONDITION ($4)
+ #endif
+ int test[CONDITION ? 1 : -1];]])],
+ [gl_cv_test_$1=yes],
+ [gl_cv_test_$1=no])])
+ if test $gl_cv_test_$1 = yes; then
+ $1=1;
+ else
+ $1=0;
+ fi
+ AC_SUBST([$1])
+])
+
+AC_DEFUN([gl_INTTYPES_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_INTTYPES_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_INTTYPES_H_DEFAULTS],
+[
+ GNULIB_IMAXABS=0; AC_SUBST([GNULIB_IMAXABS])
+ GNULIB_IMAXDIV=0; AC_SUBST([GNULIB_IMAXDIV])
+ GNULIB_STRTOIMAX=0; AC_SUBST([GNULIB_STRTOIMAX])
+ GNULIB_STRTOUMAX=0; AC_SUBST([GNULIB_STRTOUMAX])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_IMAXABS=1; AC_SUBST([HAVE_DECL_IMAXABS])
+ HAVE_DECL_IMAXDIV=1; AC_SUBST([HAVE_DECL_IMAXDIV])
+ HAVE_DECL_STRTOIMAX=1; AC_SUBST([HAVE_DECL_STRTOIMAX])
+ HAVE_DECL_STRTOUMAX=1; AC_SUBST([HAVE_DECL_STRTOUMAX])
+ HAVE_IMAXDIV_T=1; AC_SUBST([HAVE_IMAXDIV_T])
+ REPLACE_STRTOIMAX=0; AC_SUBST([REPLACE_STRTOIMAX])
+ REPLACE_STRTOUMAX=0; AC_SUBST([REPLACE_STRTOUMAX])
+ INT32_MAX_LT_INTMAX_MAX=1; AC_SUBST([INT32_MAX_LT_INTMAX_MAX])
+ INT64_MAX_EQ_LONG_MAX='defined _LP64'; AC_SUBST([INT64_MAX_EQ_LONG_MAX])
+ PRIPTR_PREFIX=__PRIPTR_PREFIX; AC_SUBST([PRIPTR_PREFIX])
+ UINT32_MAX_LT_UINTMAX_MAX=1; AC_SUBST([UINT32_MAX_LT_UINTMAX_MAX])
+ UINT64_MAX_EQ_ULONG_MAX='defined _LP64'; AC_SUBST([UINT64_MAX_EQ_ULONG_MAX])
+])
diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4
new file mode 100644
index 0000000..ebb5320
--- /dev/null
+++ b/m4/inttypes_h.m4
@@ -0,0 +1,29 @@
+# inttypes_h.m4 serial 10
+dnl Copyright (C) 1997-2004, 2006, 2008-2020 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_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+ AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#include <sys/types.h>
+#include <inttypes.h>
+ ]],
+ [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+ [gl_cv_header_inttypes_h=yes],
+ [gl_cv_header_inttypes_h=no])])
+ if test $gl_cv_header_inttypes_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
+ [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/m4/ioctl.m4 b/m4/ioctl.m4
new file mode 100644
index 0000000..263aaae
--- /dev/null
+++ b/m4/ioctl.m4
@@ -0,0 +1,44 @@
+# ioctl.m4 serial 5
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_IOCTL],
+[
+ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ HAVE_IOCTL=1
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ dnl Even if the 'socket' module is not used here, another part of the
+ dnl application may use it and pass file descriptors that refer to
+ dnl sockets to the ioctl() function. So enable the support for sockets.
+ HAVE_IOCTL=0
+ else
+ AC_CHECK_FUNCS([ioctl])
+ dnl On glibc systems, the second parameter is 'unsigned long int request',
+ dnl not 'int request'. We cannot simply cast the function pointer, but
+ dnl instead need a wrapper.
+ AC_CACHE_CHECK([for ioctl with POSIX signature],
+ [gl_cv_func_ioctl_posix_signature],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/ioctl.h>
+ /* On some platforms, ioctl() is declared in <unistd.h>. */
+ #include <unistd.h>
+ ]],
+ [[extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ int ioctl (int, int, ...);
+ ]])
+ ],
+ [gl_cv_func_ioctl_posix_signature=yes],
+ [gl_cv_func_ioctl_posix_signature=no])
+ ])
+ if test $gl_cv_func_ioctl_posix_signature != yes; then
+ REPLACE_IOCTL=1
+ fi
+ fi
+])
diff --git a/m4/isblank.m4 b/m4/isblank.m4
new file mode 100644
index 0000000..5e1b783
--- /dev/null
+++ b/m4/isblank.m4
@@ -0,0 +1,17 @@
+# isblank.m4 serial 3
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_ISBLANK],
+[
+ dnl Persuade glibc <ctype.h> to declare isblank().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_CTYPE_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([isblank])
+ if test $ac_cv_func_isblank = no; then
+ HAVE_ISBLANK=0
+ fi
+])
diff --git a/m4/iswblank.m4 b/m4/iswblank.m4
new file mode 100644
index 0000000..dd6ed94
--- /dev/null
+++ b/m4/iswblank.m4
@@ -0,0 +1,34 @@
+# iswblank.m4 serial 5
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_ISWBLANK],
+[
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ AC_REQUIRE([gl_WCTYPE_H])
+ dnl Persuade glibc <wctype.h> to declare iswblank().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([iswblank])
+ AC_CHECK_DECLS([iswblank], , , [[
+ #include <wchar.h>
+ #include <wctype.h>
+ ]])
+ if test $ac_cv_func_iswblank = no; then
+ HAVE_ISWBLANK=0
+ if test $ac_cv_have_decl_iswblank = yes; then
+ REPLACE_ISWBLANK=1
+ fi
+ fi
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ dnl Redefine all of iswcntrl, ..., towupper in <wctype.h>.
+ :
+ else
+ if test $HAVE_ISWBLANK = 0 || test $REPLACE_ISWBLANK = 1; then
+ dnl Redefine only iswblank.
+ :
+ fi
+ fi
+
+])
diff --git a/m4/iswdigit.m4 b/m4/iswdigit.m4
new file mode 100644
index 0000000..4ad6a42
--- /dev/null
+++ b/m4/iswdigit.m4
@@ -0,0 +1,115 @@
+# iswdigit.m4 serial 2
+dnl Copyright (C) 2020 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.
+
+AC_DEFUN([gl_FUNC_ISWDIGIT],
+[
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ AC_REQUIRE([gl_WCTYPE_H])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ dnl <wctype.h> redefines iswdigit already.
+ REPLACE_ISWDIGIT="$REPLACE_ISWCNTRL"
+ else
+ AC_CACHE_CHECK([whether iswdigit is ISO C compliant],
+ [gl_cv_func_iswdigit_works],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+ freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+ gl_cv_func_iswdigit_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_iswdigit_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none || test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswdigit for the multibyte character s[0..n-1]. */
+static int
+for_character (const char *s, size_t n)
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, s, n, &state);
+ if (ret != n)
+ abort ();
+
+ return iswdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int is;
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ /* This fails on mingw, MSVC 14. */
+ /* U+00B2 SUPERSCRIPT TWO */
+ is = for_character ("\262", 1);
+ if (!(is == 0))
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ /* This fails on NetBSD 8.0. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 2;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */
+ /* U+0663 ARABIC-INDIC DIGIT THREE */
+ is = for_character ("\331\243", 2);
+ if (!(is == 0))
+ result |= 4;
+ /* This fails on FreeBSD 12, NetBSD 8.0, MSVC 14. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\357\274\221", 3);
+ if (!(is == 0))
+ result |= 8;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ /* This fails on NetBSD 8.0, Solaris 10, Solaris 11.4. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 16;
+ }
+ return result;
+}]])],
+ [gl_cv_func_iswdigit_works=yes],
+ [gl_cv_func_iswdigit_works=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_iswdigit_works" in
+ *yes) ;;
+ *) REPLACE_ISWDIGIT=1 ;;
+ esac
+ fi
+])
diff --git a/m4/iswxdigit.m4 b/m4/iswxdigit.m4
new file mode 100644
index 0000000..c63e81e
--- /dev/null
+++ b/m4/iswxdigit.m4
@@ -0,0 +1,106 @@
+# iswxdigit.m4 serial 2
+dnl Copyright (C) 2020 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.
+
+AC_DEFUN([gl_FUNC_ISWXDIGIT],
+[
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ AC_REQUIRE([gl_WCTYPE_H])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ dnl <wctype.h> redefines iswxdigit already.
+ REPLACE_ISWXDIGIT="$REPLACE_ISWCNTRL"
+ else
+ AC_CACHE_CHECK([whether iswxdigit is ISO C compliant],
+ [gl_cv_func_iswxdigit_works],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on FreeBSD, NetBSD, Solaris, native Windows.
+ freebsd* | dragonfly* | netbsd* | solaris* | mingw*)
+ gl_cv_func_iswxdigit_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_iswxdigit_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_JA != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <wctype.h>
+
+/* Returns the value of iswxdigit for the multibyte character s[0..n-1]. */
+static int
+for_character (const char *s, size_t n)
+{
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, s, n, &state);
+ if (ret != n)
+ abort ();
+
+ return iswxdigit (wc);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int is;
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ /* This fails on NetBSD 8.0. */
+ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+ is = for_character ("\243\301", 2);
+ if (!(is == 0))
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ /* This fails on FreeBSD 12. */
+ /* U+0663 ARABIC-INDIC DIGIT THREE */
+ is = for_character ("\331\243", 2);
+ if (!(is == 0))
+ result |= 2;
+ /* This fails on MSVC 14. */
+ /* U+FF21 FULLWIDTH LATIN CAPITAL LETTER A */
+ is = for_character ("\357\274\241", 3);
+ if (!(is == 0))
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ /* This fails on Solaris 10, Solaris 11.4. */
+ /* U+FF11 FULLWIDTH DIGIT ONE */
+ is = for_character ("\243\261", 2);
+ if (!(is == 0))
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_iswxdigit_works=yes],
+ [gl_cv_func_iswxdigit_works=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_iswxdigit_works" in
+ *yes) ;;
+ *) REPLACE_ISWXDIGIT=1 ;;
+ esac
+ fi
+])
diff --git a/m4/langinfo_h.m4 b/m4/langinfo_h.m4
new file mode 100644
index 0000000..9d5e16e
--- /dev/null
+++ b/m4/langinfo_h.m4
@@ -0,0 +1,122 @@
+# langinfo_h.m4 serial 9
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_LANGINFO_H],
+[
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+
+ dnl Persuade glibc-2.0.6 <langinfo.h> to define CODESET.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl <langinfo.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([langinfo.h])
+
+ dnl Determine whether <langinfo.h> exists. It is missing on mingw and BeOS.
+ HAVE_LANGINFO_CODESET=0
+ HAVE_LANGINFO_T_FMT_AMPM=0
+ HAVE_LANGINFO_ALTMON=0
+ HAVE_LANGINFO_ERA=0
+ HAVE_LANGINFO_YESEXPR=0
+ AC_CHECK_HEADERS_ONCE([langinfo.h])
+ if test $ac_cv_header_langinfo_h = yes; then
+ HAVE_LANGINFO_H=1
+ dnl Determine what <langinfo.h> defines.
+ dnl CODESET is missing on OpenBSD 3.8.
+ dnl ERA etc. are missing on OpenBSD 6.7.
+ dnl T_FMT_AMPM and YESEXPR, NOEXPR are missing on IRIX 5.3.
+ dnl ALTMON_* are missing on glibc 2.26 and many other systems.
+ AC_CACHE_CHECK([whether langinfo.h defines CODESET],
+ [gl_cv_header_langinfo_codeset],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = CODESET;
+]])],
+ [gl_cv_header_langinfo_codeset=yes],
+ [gl_cv_header_langinfo_codeset=no])
+ ])
+ if test $gl_cv_header_langinfo_codeset = yes; then
+ HAVE_LANGINFO_CODESET=1
+ fi
+ AC_CACHE_CHECK([whether langinfo.h defines T_FMT_AMPM],
+ [gl_cv_header_langinfo_t_fmt_ampm],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = T_FMT_AMPM;
+]])],
+ [gl_cv_header_langinfo_t_fmt_ampm=yes],
+ [gl_cv_header_langinfo_t_fmt_ampm=no])
+ ])
+ if test $gl_cv_header_langinfo_t_fmt_ampm = yes; then
+ HAVE_LANGINFO_T_FMT_AMPM=1
+ fi
+ AC_CACHE_CHECK([whether langinfo.h defines ALTMON_1],
+ [gl_cv_header_langinfo_altmon],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = ALTMON_1;
+]])],
+ [gl_cv_header_langinfo_altmon=yes],
+ [gl_cv_header_langinfo_altmon=no])
+ ])
+ if test $gl_cv_header_langinfo_altmon = yes; then
+ HAVE_LANGINFO_ALTMON=1
+ fi
+ AC_CACHE_CHECK([whether langinfo.h defines ERA],
+ [gl_cv_header_langinfo_era],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = ERA;
+]])],
+ [gl_cv_header_langinfo_era=yes],
+ [gl_cv_header_langinfo_era=no])
+ ])
+ if test $gl_cv_header_langinfo_era = yes; then
+ HAVE_LANGINFO_ERA=1
+ fi
+ AC_CACHE_CHECK([whether langinfo.h defines YESEXPR],
+ [gl_cv_header_langinfo_yesexpr],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+int a = YESEXPR;
+]])],
+ [gl_cv_header_langinfo_yesexpr=yes],
+ [gl_cv_header_langinfo_yesexpr=no])
+ ])
+ if test $gl_cv_header_langinfo_yesexpr = yes; then
+ HAVE_LANGINFO_YESEXPR=1
+ fi
+ else
+ HAVE_LANGINFO_H=0
+ fi
+ AC_SUBST([HAVE_LANGINFO_H])
+ AC_SUBST([HAVE_LANGINFO_CODESET])
+ AC_SUBST([HAVE_LANGINFO_T_FMT_AMPM])
+ AC_SUBST([HAVE_LANGINFO_ALTMON])
+ AC_SUBST([HAVE_LANGINFO_ERA])
+ AC_SUBST([HAVE_LANGINFO_YESEXPR])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <langinfo.h>
+ ]], [nl_langinfo])
+])
+
+AC_DEFUN([gl_LANGINFO_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_LANGINFO_H_DEFAULTS],
+[
+ GNULIB_NL_LANGINFO=0; AC_SUBST([GNULIB_NL_LANGINFO])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_NL_LANGINFO=1; AC_SUBST([HAVE_NL_LANGINFO])
+ REPLACE_NL_LANGINFO=0; AC_SUBST([REPLACE_NL_LANGINFO])
+])
diff --git a/m4/largefile.m4 b/m4/largefile.m4
new file mode 100644
index 0000000..c4cc835
--- /dev/null
+++ b/m4/largefile.m4
@@ -0,0 +1,178 @@
+# Enable large files on systems where this is not the default.
+# Enable support for files on Linux file systems with 64-bit inode numbers.
+
+# Copyright 1992-1996, 1998-2020 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.
+
+# The following macro works around a problem in Autoconf's AC_FUNC_FSEEKO:
+# It does not set _LARGEFILE_SOURCE=1 on HP-UX/ia64 32-bit, although this
+# setting of _LARGEFILE_SOURCE is needed so that <stdio.h> declares fseeko
+# and ftello in C++ mode as well.
+AC_DEFUN([gl_SET_LARGEFILE_SOURCE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_FUNC_FSEEKO
+ case "$host_os" in
+ hpux*)
+ AC_DEFINE([_LARGEFILE_SOURCE], [1],
+ [Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2).])
+ ;;
+ esac
+])
+
+# The following implementation works around a problem in autoconf <= 2.69;
+# AC_SYS_LARGEFILE does not configure for large inodes on Mac OS X 10.5,
+# or configures them incorrectly in some cases.
+m4_version_prereq([2.70], [], [
+
+# _AC_SYS_LARGEFILE_TEST_INCLUDES
+# -------------------------------
+m4_define([_AC_SYS_LARGEFILE_TEST_INCLUDES],
+[#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]];[]dnl
+])
+
+
+# _AC_SYS_LARGEFILE_MACRO_VALUE(C-MACRO, VALUE,
+# CACHE-VAR,
+# DESCRIPTION,
+# PROLOGUE, [FUNCTION-BODY])
+# --------------------------------------------------------
+m4_define([_AC_SYS_LARGEFILE_MACRO_VALUE],
+[AC_CACHE_CHECK([for $1 value needed for large files], [$3],
+[while :; do
+ m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])(
+ [AC_LANG_PROGRAM([$5], [$6])],
+ [$3=no; break])
+ m4_ifval([$6], [AC_LINK_IFELSE], [AC_COMPILE_IFELSE])(
+ [AC_LANG_PROGRAM([#define $1 $2
+$5], [$6])],
+ [$3=$2; break])
+ $3=unknown
+ break
+done])
+case $$3 in #(
+ no | unknown) ;;
+ *) AC_DEFINE_UNQUOTED([$1], [$$3], [$4]);;
+esac
+rm -rf conftest*[]dnl
+])# _AC_SYS_LARGEFILE_MACRO_VALUE
+
+
+# AC_SYS_LARGEFILE
+# ----------------
+# By default, many hosts won't let programs access large files;
+# one must use special compiler options to get large-file access to work.
+# For more details about this brain damage please see:
+# http://www.unix.org/version2/whatsnew/lfs20mar.html
+# Additionally, on Linux file systems with 64-bit inodes a file that happens
+# to have a 64-bit inode number cannot be accessed by 32-bit applications on
+# Linux x86/x86_64. This can occur with file systems such as XFS and NFS.
+AC_DEFUN([AC_SYS_LARGEFILE],
+[AC_ARG_ENABLE(largefile,
+ [ --disable-largefile omit support for large files])
+if test "$enable_largefile" != no; then
+
+ AC_CACHE_CHECK([for special C compiler options needed for large files],
+ ac_cv_sys_largefile_CC,
+ [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.
+ AC_LANG_CONFTEST([AC_LANG_PROGRAM([_AC_SYS_LARGEFILE_TEST_INCLUDES])])
+ AC_COMPILE_IFELSE([], [break])
+ CC="$CC -n32"
+ AC_COMPILE_IFELSE([], [ac_cv_sys_largefile_CC=' -n32'; break])
+ break
+ done
+ CC=$ac_save_CC
+ rm -f conftest.$ac_ext
+ fi])
+ if test "$ac_cv_sys_largefile_CC" != no; then
+ CC=$CC$ac_cv_sys_largefile_CC
+ fi
+
+ _AC_SYS_LARGEFILE_MACRO_VALUE(_FILE_OFFSET_BITS, 64,
+ ac_cv_sys_file_offset_bits,
+ [Number of bits in a file offset, on hosts where this is settable.],
+ [_AC_SYS_LARGEFILE_TEST_INCLUDES])
+ if test $ac_cv_sys_file_offset_bits = unknown; then
+ _AC_SYS_LARGEFILE_MACRO_VALUE(_LARGE_FILES, 1,
+ ac_cv_sys_large_files,
+ [Define for large files, on AIX-style hosts.],
+ [_AC_SYS_LARGEFILE_TEST_INCLUDES])
+ fi
+fi
+])# AC_SYS_LARGEFILE
+])# m4_version_prereq 2.70
+
+# Enable large files on systems where this is implemented by Gnulib, not by the
+# system headers.
+# Set the variables WINDOWS_64_BIT_OFF_T, WINDOWS_64_BIT_ST_SIZE if Gnulib
+# overrides ensure that off_t or 'struct size.st_size' are 64-bit, respectively.
+AC_DEFUN([gl_LARGEFILE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ dnl Native Windows.
+ dnl mingw64 defines off_t to a 64-bit type already, if
+ dnl _FILE_OFFSET_BITS=64, which is ensured by AC_SYS_LARGEFILE.
+ AC_CACHE_CHECK([for 64-bit off_t], [gl_cv_type_off_t_64],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ int verify_off_t_size[sizeof (off_t) >= 8 ? 1 : -1];
+ ]],
+ [[]])],
+ [gl_cv_type_off_t_64=yes], [gl_cv_type_off_t_64=no])
+ ])
+ if test $gl_cv_type_off_t_64 = no; then
+ WINDOWS_64_BIT_OFF_T=1
+ else
+ WINDOWS_64_BIT_OFF_T=0
+ fi
+ dnl Some mingw versions define, if _FILE_OFFSET_BITS=64, 'struct stat'
+ dnl to 'struct _stat32i64' or 'struct _stat64' (depending on
+ dnl _USE_32BIT_TIME_T), which has a 32-bit st_size member.
+ AC_CACHE_CHECK([for 64-bit st_size], [gl_cv_member_st_size_64],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ struct stat buf;
+ int verify_st_size_size[sizeof (buf.st_size) >= 8 ? 1 : -1];
+ ]],
+ [[]])],
+ [gl_cv_member_st_size_64=yes], [gl_cv_member_st_size_64=no])
+ ])
+ if test $gl_cv_member_st_size_64 = no; then
+ WINDOWS_64_BIT_ST_SIZE=1
+ else
+ WINDOWS_64_BIT_ST_SIZE=0
+ fi
+ ;;
+ *)
+ dnl Nothing to do on gnulib's side.
+ dnl A 64-bit off_t is
+ dnl - already the default on Mac OS X, FreeBSD, NetBSD, OpenBSD, IRIX,
+ dnl OSF/1, Cygwin,
+ dnl - enabled by _FILE_OFFSET_BITS=64 (ensured by AC_SYS_LARGEFILE) on
+ dnl glibc, HP-UX, Solaris,
+ dnl - enabled by _LARGE_FILES=1 (ensured by AC_SYS_LARGEFILE) on AIX,
+ dnl - impossible to achieve on Minix 3.1.8.
+ WINDOWS_64_BIT_OFF_T=0
+ WINDOWS_64_BIT_ST_SIZE=0
+ ;;
+ esac
+])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..98c348f
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,168 @@
+# lib-ld.m4 serial 9
+dnl Copyright (C) 1996-2003, 2009-2020 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/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+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 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=no
+ ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[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
+ # 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
+
+if test -n "$LD"; then
+ AC_MSG_CHECKING([for ld])
+elif test "$GCC" = yes; then
+ AC_MSG_CHECKING([for ld used by $CC])
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+if test -n "$LD"; then
+ # Let the user override the test with a path.
+ :
+else
+ AC_CACHE_VAL([acl_cv_path_LD],
+ [
+ acl_cv_path_LD= # Final result of this test
+ ac_prog=ld # Program to search in $PATH
+ if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ acl_output=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $acl_output in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'`
+ while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do
+ acl_output=`echo $acl_output | sed "s%$re_direlt%/%"`
+ done
+ # Got the pathname. No search in PATH is needed.
+ acl_cv_path_LD="$acl_output"
+ ac_prog=
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ fi
+ if test -n "$ac_prog"; then
+ # Search for $ac_prog in $PATH.
+ 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 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
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_ifs"
+ fi
+ case $host in
+ *-*-aix*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __powerpc64__ || defined _ARCH_PPC64
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [# The compiler produces 64-bit code. Add option '-b64' so that the
+ # linker groks 64-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -b64 "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;;
+ esac
+ ], [])
+ ;;
+ sparc64-*-netbsd*)
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if defined __sparcv9 || defined __arch64__
+ int ok;
+ #else
+ error fail
+ #endif
+ ]])],
+ [],
+ [# The compiler produces 32-bit code. Add option '-m elf32_sparc'
+ # so that the linker groks 32-bit object files.
+ case "$acl_cv_path_LD " in
+ *" -m elf32_sparc "*) ;;
+ *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;;
+ esac
+ ])
+ ;;
+ esac
+ ])
+ LD="$acl_cv_path_LD"
+fi
+if test -n "$LD"; then
+ AC_MSG_RESULT([$LD])
+else
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([no acceptable ld found in \$PATH])
+fi
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..5ce1aa2
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,813 @@
+# lib-link.m4 serial 32
+dnl Copyright (C) 2001-2020 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.61])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ 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"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ 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
+ popdef([NAME])
+ popdef([Name])
+])
+
+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. 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
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ 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.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ 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 lib][$1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ LIB[]NAME[]_PREFIX=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ AC_SUBST([LIB]NAME[_PREFIX])
+ 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,
+dnl acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Complain if config.rpath is missing.
+ AC_REQUIRE_AUX_FILE([config.rpath])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ 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], [
+ 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
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ acl_libext="$acl_cv_libext"
+ acl_shlibext="$acl_cv_shlibext"
+ acl_libname_spec="$acl_cv_libname_spec"
+ acl_library_names_spec="$acl_cv_library_names_spec"
+ acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ 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],
+ [ --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.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ 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 By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+ ])
+ AC_ARG_WITH(PACK[-prefix],
+[[ --with-]]PACK[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
+ --without-]]PACK[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
+ eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ additional_libdir2="$withval/$acl_libdirstem2"
+ additional_libdir3="$withval/$acl_libdirstem3"
+ fi
+ fi
+])
+ if test "X$additional_libdir2" = "X$additional_libdir"; then
+ additional_libdir2=
+ fi
+ if test "X$additional_libdir3" = "X$additional_libdir"; then
+ additional_libdir3=
+ fi
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ 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=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ 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____|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
+ if test -n "$acl_shlibext"; then
+ shrext=".$acl_shlibext" # typically: shrext=.so
+ else
+ shrext=
+ fi
+ if test $use_additional = yes; then
+ for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
+ if test "X$found_dir" = "X"; then
+ eval dir=\$$additional_libdir_variable
+ if test -n "$dir"; then
+ dnl The same code as in the loop below:
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ fi
+ fi
+ done
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ dnl First look for a shared library.
+ if test -n "$acl_shlibext"; then
+ if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext"
+ else
+ if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+ ver=`(cd "$dir" && \
+ for f in "$libname$shrext".*; do echo "$f"; done \
+ | sed -e "s,^$libname$shrext\\\\.,," \
+ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+ | sed 1q ) 2>/dev/null`
+ if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
+ found_dir="$dir"
+ found_so="$dir/$libname$shrext.$ver"
+ fi
+ else
+ eval library_names=\"$acl_library_names_spec\"
+ for f in $library_names; do
+ if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
+ found_dir="$dir"
+ found_so="$dir/$f"
+ break
+ fi
+ done
+ fi
+ fi
+ fi
+ dnl Then look for a static library.
+ if test "X$found_dir" = "X"; then
+ if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
+ found_dir="$dir"
+ found_a="$dir/$libname.$acl_libext"
+ fi
+ fi
+ if test "X$found_dir" != "X"; then
+ if test -f "$dir/$libname.la"; then
+ found_la="$dir/$libname.la"
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ 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" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
+ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$acl_hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$acl_hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */$acl_libdirstem | */$acl_libdirstem/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+ 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"
+ ;;
+ */$acl_libdirstem3 | */$acl_libdirstem3/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
+ if test "$name" = '$1'; then
+ LIB[]NAME[]_PREFIX="$basedir"
+ fi
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $dependency_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ 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$dependency_libdir" != "X/usr/$acl_libdirstem" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
+ haveit=
+ if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
+ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ dnl Really add $dependency_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$dependency_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$dependency_libdir"; then
+ dnl Really add $dependency_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ dnl But on GNU systems, ignore -lc options, because
+ dnl - linking with libc is the default anyway,
+ dnl - linking with libc.a may produce an error
+ dnl "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie"
+ dnl or may produce an executable that always crashes, see
+ dnl <https://lists.gnu.org/archive/html/grep-devel/2020-09/msg00052.html>.
+ dep=`echo "X$dep" | sed -e 's/^X-l//'`
+ if test "X$dep" != Xc \
+ || case $host_os in
+ linux* | gnu* | k*bsd*-gnu) false ;;
+ *) true ;;
+ esac; then
+ names_next_round="$names_next_round $dep"
+ fi
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+ popdef([PACKLIBS])
+ popdef([PACKUP])
+ popdef([PACK])
+ popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+ AC_REQUIRE([AC_LIB_RPATH])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ $1=
+ if test "$enable_rpath" != no; then
+ if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode directories into the resulting
+ dnl binary.
+ rpathdirs=
+ next=
+ for opt in $2; do
+ if test -n "$next"; then
+ dir="$next"
+ dnl No need to hardcode the standard /usr/lib.
+ if test "X$dir" != "X/usr/$acl_libdirstem" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dir" != "X/usr/$acl_libdirstem3"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next=
+ else
+ case $opt in
+ -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" \
+ && test "X$dir" != "X/usr/$acl_libdirstem2" \
+ && test "X$dir" != "X/usr/$acl_libdirstem3"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ next= ;;
+ *) next= ;;
+ esac
+ fi
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n ""$3""; then
+ dnl libtool is used for linking. Use -R options.
+ for dir in $rpathdirs; do
+ $1="${$1}${$1:+ }-R$dir"
+ done
+ else
+ dnl The linker is used for linking directly.
+ if test -n "$acl_hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user
+ dnl must pass all path elements in one option.
+ alldirs=
+ for dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$dir"
+ eval flag=\"$acl_hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ $1="${$1}${$1:+ }$flag"
+ done
+ fi
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([$1])
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644
index 0000000..2bcdfdf
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,323 @@
+# lib-prefix.m4 serial 19
+dnl Copyright (C) 2001-2005, 2008-2020 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.
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ 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_ARG_WITH([lib-prefix],
+[[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir]],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/$acl_libdirstem"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a function acl_is_expected_elfclass, that tests whether standard input
+dn; has a 32-bit or 64-bit ELF header, depending on the host CPU ABI,
+dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing
+dnl the basename of the libdir to try in turn, either "lib" or "lib64" or
+dnl "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar.
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+ dnl There is no formal standard regarding lib, lib32, and lib64.
+ dnl On most 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. However, on
+ dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go
+ dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib.
+ dnl We determine the compiler's default mode by looking at the compiler's
+ dnl library search path. If at least one of its elements ends in /lib64 or
+ dnl points to a directory whose absolute pathname ends in /lib64, we use that
+ dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default,
+ dnl 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])
+ AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT])
+
+ AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf],
+ [AC_EGREP_CPP([Extensible Linking Format],
+ [#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+ ],
+ [gl_cv_elf=yes],
+ [gl_cv_elf=no])
+ ])
+ if test $gl_cv_elf = yes; then
+ # Extract the ELF class of a file (5th byte) in decimal.
+ # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+ if od -A x < /dev/null >/dev/null 2>/dev/null; then
+ # Use POSIX od.
+ func_elfclass ()
+ {
+ od -A n -t d1 -j 4 -N 1
+ }
+ else
+ # Use BSD hexdump.
+ func_elfclass ()
+ {
+ dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
+ echo
+ }
+ fi
+ # Use 'expr', not 'test', to compare the values of func_elfclass, because on
+ # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
+ # not 1 or 2.
+changequote(,)dnl
+ case $HOST_CPU_C_ABI_32BIT in
+ yes)
+ # 32-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 1 > /dev/null
+ }
+ ;;
+ no)
+ # 64-bit ABI.
+ acl_is_expected_elfclass ()
+ {
+ expr "`func_elfclass | sed -e 's/[ ]//g'`" = 2 > /dev/null
+ }
+ ;;
+ *)
+ # Unknown.
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ ;;
+ esac
+changequote([,])dnl
+ else
+ acl_is_expected_elfclass ()
+ {
+ :
+ }
+ fi
+
+ dnl Allow the user to override the result by setting acl_cv_libdirstems.
+ AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
+ [acl_cv_libdirstems],
+ [dnl Try 'lib' first, because that's the default for libdir in GNU, see
+ dnl <https://www.gnu.org/prep/standards/html_node/Directory-Variables.html>.
+ acl_libdirstem=lib
+ acl_libdirstem2=
+ acl_libdirstem3=
+ case "$host_os" in
+ solaris*)
+ dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+ dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
+ 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.
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ acl_libdirstem2=lib/64
+ case "$host_cpu" in
+ sparc*) acl_libdirstem3=lib/sparcv9 ;;
+ i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
+ esac
+ fi
+ ;;
+ *)
+ dnl If $CC generates code for a 32-bit ABI, the libraries are
+ dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64.
+ dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries
+ dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32.
+ dnl Find the compiler's search path. However, non-system compilers
+ dnl sometimes have odd library search paths. But we can't simply invoke
+ dnl '/usr/bin/gcc -print-search-dirs' because that would not take into
+ dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS.
+ searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
+ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+ if test $HOST_CPU_C_ABI_32BIT != no; then
+ # 32-bit or unknown ABI.
+ if test -d /usr/lib32; then
+ acl_libdirstem2=lib32
+ fi
+ fi
+ if test $HOST_CPU_C_ABI_32BIT != yes; then
+ # 64-bit or unknown ABI.
+ if test -d /usr/lib64; then
+ acl_libdirstem3=lib64
+ fi
+ fi
+ if test -n "$searchpath"; then
+ acl_save_IFS="${IFS= }"; IFS=":"
+ for searchdir in $searchpath; do
+ if test -d "$searchdir"; then
+ case "$searchdir" in
+ */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
+ */../ | */.. )
+ # Better ignore directories of this form. They are misleading.
+ ;;
+ *) searchdir=`cd "$searchdir" && pwd`
+ case "$searchdir" in
+ */lib32 ) acl_libdirstem2=lib32 ;;
+ */lib64 ) acl_libdirstem3=lib64 ;;
+ esac ;;
+ esac
+ fi
+ done
+ IFS="$acl_save_IFS"
+ if test $HOST_CPU_C_ABI_32BIT = yes; then
+ # 32-bit ABI.
+ acl_libdirstem3=
+ fi
+ if test $HOST_CPU_C_ABI_32BIT = no; then
+ # 64-bit ABI.
+ acl_libdirstem2=
+ fi
+ fi
+ ;;
+ esac
+ test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+ test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
+ acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
+ ])
+ dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and
+ dnl acl_libdirstem3.
+changequote(,)dnl
+ acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
+ acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
+ acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
+changequote([,])dnl
+])
diff --git a/m4/libunistring-base.m4 b/m4/libunistring-base.m4
new file mode 100644
index 0000000..268ec5f
--- /dev/null
+++ b/m4/libunistring-base.m4
@@ -0,0 +1,141 @@
+# libunistring-base.m4 serial 5
+dnl Copyright (C) 2010-2020 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 Paolo Bonzini and Bruno Haible.
+
+dnl gl_LIBUNISTRING_MODULE([VERSION], [Module])
+dnl Declares that the source files of Module should be compiled, unless we
+dnl are linking with libunistring and its version is >= the given VERSION.
+dnl Defines an automake conditional LIBUNISTRING_COMPILE_$MODULE that is
+dnl true if the source files of Module should be compiled.
+dnl This macro is to be used for public libunistring API, not for
+dnl undocumented API.
+dnl
+dnl You have to bump the VERSION argument to the next projected version
+dnl number each time you make a change that affects the behaviour of the
+dnl functions defined in Module (even if the sources of Module itself do not
+dnl change).
+
+AC_DEFUN([gl_LIBUNISTRING_MODULE],
+[
+ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
+ dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
+ dnl gl_LIBUNISTRING_CORE if that macro has been run.
+ AM_CONDITIONAL(AS_TR_CPP([LIBUNISTRING_COMPILE_$2]),
+ [gl_LIBUNISTRING_VERSION_CMP([$1])])
+])
+
+dnl gl_LIBUNISTRING_LIBHEADER([VERSION], [HeaderFile])
+dnl Declares that HeaderFile should be created, unless we are linking
+dnl with libunistring and its version is >= the given VERSION.
+dnl HeaderFile should be relative to the lib directory and end in '.h'.
+dnl Prepares for substituting LIBUNISTRING_HEADERFILE (to HeaderFile or empty).
+dnl
+dnl When we are linking with the already installed libunistring and its version
+dnl is < VERSION, we create HeaderFile here, because we may compile functions
+dnl (via gl_LIBUNISTRING_MODULE above) that are not contained in the installed
+dnl version.
+dnl When we are linking with the already installed libunistring and its version
+dnl is > VERSION, we don't create HeaderFile here: it could cause compilation
+dnl errors in other libunistring header files if some types are missing.
+dnl
+dnl You have to bump the VERSION argument to the next projected version
+dnl number each time you make a non-comment change to the HeaderFile.
+
+AC_DEFUN([gl_LIBUNISTRING_LIBHEADER],
+[
+ AC_REQUIRE([gl_LIBUNISTRING_LIB_PREPARE])
+ dnl Use the variables HAVE_LIBUNISTRING, LIBUNISTRING_VERSION from
+ dnl gl_LIBUNISTRING_CORE if that macro has been run.
+ if gl_LIBUNISTRING_VERSION_CMP([$1]); then
+ LIBUNISTRING_[]AS_TR_CPP([$2])='$2'
+ else
+ LIBUNISTRING_[]AS_TR_CPP([$2])=
+ fi
+ AC_SUBST([LIBUNISTRING_]AS_TR_CPP([$2]))
+])
+
+dnl Miscellaneous preparations/initializations.
+
+AC_DEFUN([gl_LIBUNISTRING_LIB_PREPARE],
+[
+ dnl Ensure that HAVE_LIBUNISTRING is fully determined at this point.
+ m4_ifdef([gl_LIBUNISTRING], [AC_REQUIRE([gl_LIBUNISTRING])])
+
+ AC_REQUIRE([AC_PROG_AWK])
+
+dnl Sed expressions to extract the parts of a version number.
+changequote(,)
+gl_libunistring_sed_extract_major='/^[0-9]/{s/^\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{s/^[0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+gl_libunistring_sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p;q;}
+i\
+0
+q
+'
+changequote([,])
+
+ if test "$HAVE_LIBUNISTRING" = yes; then
+ LIBUNISTRING_VERSION_MAJOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_major"`
+ LIBUNISTRING_VERSION_MINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ LIBUNISTRING_VERSION_SUBMINOR=`echo "$LIBUNISTRING_VERSION" | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ fi
+])
+
+dnl gl_LIBUNISTRING_VERSION_CMP([VERSION])
+dnl Expands to a shell statement that evaluates to true if LIBUNISTRING_VERSION
+dnl is less than the VERSION argument.
+AC_DEFUN([gl_LIBUNISTRING_VERSION_CMP],
+[ { test "$HAVE_LIBUNISTRING" != yes \
+ || {
+ dnl AS_LITERAL_IF exists and works fine since autoconf-2.59 at least.
+ AS_LITERAL_IF([$1],
+ [dnl This is the optimized variant, that assumes the argument is a literal:
+ m4_pushdef([requested_version_major],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^\([0-9]*\).*], [\1]), [])])
+ m4_pushdef([requested_version_minor],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
+ m4_pushdef([requested_version_subminor],
+ [gl_LIBUNISTRING_ARG_OR_ZERO(m4_bpatsubst([$1], [^[0-9]*[.][0-9]*[.]\([0-9]*\).*], [\1]), [$1])])
+ test $LIBUNISTRING_VERSION_MAJOR -lt requested_version_major \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq requested_version_major \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt requested_version_minor \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq requested_version_minor \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt requested_version_subminor
+ }
+ }
+ }
+ m4_popdef([requested_version_subminor])
+ m4_popdef([requested_version_minor])
+ m4_popdef([requested_version_major])
+ ],
+ [dnl This is the unoptimized variant:
+ requested_version_major=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_major"`
+ requested_version_minor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_minor"`
+ requested_version_subminor=`echo '$1' | sed -n -e "$gl_libunistring_sed_extract_subminor"`
+ test $LIBUNISTRING_VERSION_MAJOR -lt $requested_version_major \
+ || { test $LIBUNISTRING_VERSION_MAJOR -eq $requested_version_major \
+ && { test $LIBUNISTRING_VERSION_MINOR -lt $requested_version_minor \
+ || { test $LIBUNISTRING_VERSION_MINOR -eq $requested_version_minor \
+ && test $LIBUNISTRING_VERSION_SUBMINOR -lt $requested_version_subminor
+ }
+ }
+ }
+ ])
+ }
+ }])
+
+dnl gl_LIBUNISTRING_ARG_OR_ZERO([ARG], [ORIG]) expands to ARG if it is not the
+dnl same as ORIG, otherwise to 0.
+m4_define([gl_LIBUNISTRING_ARG_OR_ZERO], [m4_if([$1], [$2], [0], [$1])])
diff --git a/m4/libunistring-optional.m4 b/m4/libunistring-optional.m4
new file mode 100644
index 0000000..f1a24c0
--- /dev/null
+++ b/m4/libunistring-optional.m4
@@ -0,0 +1,22 @@
+# libunistring-optional.m4 serial 1
+dnl Copyright (C) 2010-2020 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 gl_LIBUNISTRING_OPTIONAL
+dnl Searches for an installed libunistring or uses the included source code
+dnl parts.
+dnl If found, it sets and AC_SUBSTs HAVE_LIBUNISTRING=yes and the LIBUNISTRING
+dnl and LTLIBUNISTRING variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIBUNISTRING to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIBUNISTRING=no and LIBUNISTRING and LTLIBUNISTRING to empty.
+
+AC_DEFUN([gl_LIBUNISTRING_OPTIONAL],
+[
+ dnl gl_LIBUNISTRING does a couple of extra things if this macro is used.
+ AC_REQUIRE([gl_LIBUNISTRING])
+
+ AC_MSG_CHECKING([whether to use the included libunistring])
+ AC_MSG_RESULT([$gl_libunistring_use_included])
+])
diff --git a/m4/libunistring.m4 b/m4/libunistring.m4
new file mode 100644
index 0000000..a0c36e3
--- /dev/null
+++ b/m4/libunistring.m4
@@ -0,0 +1,143 @@
+# libunistring.m4 serial 12
+dnl Copyright (C) 2009-2020 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.
+
+AC_PREREQ([2.64])
+
+dnl gl_LIBUNISTRING
+dnl Searches for an installed libunistring.
+dnl If found, it sets and AC_SUBSTs HAVE_LIBUNISTRING=yes and the LIBUNISTRING
+dnl and LTLIBUNISTRING variables, sets the LIBUNISTRING_VERSION variable, and
+dnl augments the CPPFLAGS variable, and #defines HAVE_LIBUNISTRING to 1.
+dnl Otherwise, it sets and AC_SUBSTs HAVE_LIBUNISTRING=no and LIBUNISTRING and
+dnl LTLIBUNISTRING to empty.
+
+dnl Define gl_LIBUNISTRING using AC_DEFUN_ONCE, in order dnl to avoid warnings
+dnl like
+dnl "warning: AC_REQUIRE: `gl_LIBUNISTRING' 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.
+AC_DEFUN_ONCE([gl_LIBUNISTRING],
+[
+ AC_BEFORE([$0], [gl_LIBUNISTRING_MODULE])
+ AC_BEFORE([$0], [gl_LIBUNISTRING_LIBHEADER])
+ AC_BEFORE([$0], [gl_LIBUNISTRING_LIB_PREPARE])
+
+ m4_ifdef([gl_LIBUNISTRING_OPTIONAL],
+ [
+ AC_MSG_CHECKING([whether included libunistring is requested])
+ AC_ARG_WITH([included-libunistring],
+ [ --with-included-libunistring use the libunistring parts included here],
+ [gl_libunistring_force_included=$withval],
+ [gl_libunistring_force_included=no])
+ AC_MSG_RESULT([$gl_libunistring_force_included])
+ gl_libunistring_use_included="$gl_libunistring_force_included"
+ if test "$gl_libunistring_use_included" = yes; then
+ dnl Assume that libunistring is not installed until some other macro
+ dnl explicitly invokes gl_LIBUNISTRING_CORE.
+ if test -z "$HAVE_LIBUNISTRING"; then
+ HAVE_LIBUNISTRING=no
+ fi
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ else
+ gl_LIBUNISTRING_CORE
+ if test $HAVE_LIBUNISTRING = no; then
+ gl_libunistring_use_included=yes
+ LIBUNISTRING=
+ LTLIBUNISTRING=
+ fi
+ fi
+ ],
+ [gl_LIBUNISTRING_CORE])
+])
+
+AC_DEFUN([gl_LIBUNISTRING_CORE],
+[
+ AC_REQUIRE([AM_ICONV])
+ if test -n "$LIBICONV"; then
+ dnl First, try to link without -liconv. libunistring often depends on
+ dnl libiconv, but we don't know (and often don't need to know) where
+ dnl libiconv is installed.
+ AC_LIB_HAVE_LINKFLAGS([unistring], [],
+ [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
+ [no, trying again together with libiconv])
+ if test "$ac_cv_libunistring" != yes; then
+ dnl Second try, with -liconv.
+ dnl We have to erase the cached result of the first AC_LIB_HAVE_LINKFLAGS
+ dnl invocation, otherwise the second one will not be run.
+ unset ac_cv_libunistring
+ glus_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_LIB_HAVE_LINKFLAGS([unistring], [],
+ [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
+ [no, consider installing GNU libunistring])
+ if test -n "$LIBUNISTRING"; then
+ LIBUNISTRING="$LIBUNISTRING $LIBICONV"
+ LTLIBUNISTRING="$LTLIBUNISTRING $LTLIBICONV"
+ fi
+ LIBS="$glus_save_LIBS"
+ fi
+ else
+ AC_LIB_HAVE_LINKFLAGS([unistring], [],
+ [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
+ [no, consider installing GNU libunistring])
+ fi
+ if test $HAVE_LIBUNISTRING = yes; then
+ dnl Determine the installed version.
+ AC_CACHE_CHECK([for libunistring version], [gl_cv_libunistring_version],
+ [AC_COMPUTE_INT([gl_libunistring_hexversion],
+ [_LIBUNISTRING_VERSION],
+ [#include <unistring/version.h>])
+ dnl Versions <= 0.9.3 had a hexversion of 0x0009.
+ dnl Use other tests to distinguish them.
+ if test $gl_libunistring_hexversion = 9; then
+ dnl Version 0.9.2 introduced the header <unistring/cdefs.h>.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <unistring/cdefs.h>]], [[]])],
+ [gl_cv_libunistring_version092=true],
+ [gl_cv_libunistring_version092=false])
+ if $gl_cv_libunistring_version092; then
+ dnl Version 0.9.3 changed a comment in <unistr.h>.
+ gl_ABSOLUTE_HEADER_ONE([unistr.h])
+ if test -n "$gl_cv_absolute_unistr_h" \
+ && grep 'Copy no more than N units of SRC to DEST. Return a pointer' $gl_cv_absolute_unistr_h > /dev/null; then
+ dnl Detected version 0.9.3.
+ gl_libunistring_hexversion=2307
+ else
+ dnl Detected version 0.9.2.
+ gl_libunistring_hexversion=2306
+ fi
+ else
+ dnl Version 0.9.1 introduced the type casing_suffix_context_t.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unicase.h>
+ casing_suffix_context_t ct;]],
+ [[]])],
+ [gl_cv_libunistring_version091=true],
+ [gl_cv_libunistring_version091=false])
+ if $gl_cv_libunistring_version091; then
+ dnl Detected version 0.9.1.
+ gl_libunistring_hexversion=2305
+ else
+ dnl Detected version 0.9.
+ gl_libunistring_hexversion=2304
+ fi
+ fi
+ fi
+ dnl Transform into the usual major.minor.subminor notation.
+ gl_libunistring_major=`expr $gl_libunistring_hexversion / 65536`
+ gl_libunistring_minor=`expr $gl_libunistring_hexversion / 256 % 256`
+ gl_libunistring_subminor=`expr $gl_libunistring_hexversion % 256`
+ gl_cv_libunistring_version="$gl_libunistring_major.$gl_libunistring_minor.$gl_libunistring_subminor"
+ ])
+ LIBUNISTRING_VERSION="$gl_cv_libunistring_version"
+ fi
+])
diff --git a/m4/limits-h.m4 b/m4/limits-h.m4
new file mode 100644
index 0000000..0b4f092
--- /dev/null
+++ b/m4/limits-h.m4
@@ -0,0 +1,43 @@
+dnl Check whether limits.h has needed features.
+
+dnl Copyright 2016-2020 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.
+
+AC_DEFUN_ONCE([gl_LIMITS_H],
+[
+ gl_CHECK_NEXT_HEADERS([limits.h])
+
+ AC_CACHE_CHECK([whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.],
+ [gl_cv_header_limits_width],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <limits.h>
+ long long llm = LLONG_MAX;
+ int wb = WORD_BIT;
+ int ullw = ULLONG_WIDTH;
+ ]])],
+ [gl_cv_header_limits_width=yes],
+ [gl_cv_header_limits_width=no])])
+ if test "$gl_cv_header_limits_width" = yes; then
+ LIMITS_H=
+ else
+ LIMITS_H=limits.h
+ fi
+ AC_SUBST([LIMITS_H])
+ AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+])
+
+dnl Unconditionally enables the replacement of <limits.h>.
+AC_DEFUN([gl_REPLACE_LIMITS_H],
+[
+ AC_REQUIRE([gl_LIMITS_H])
+ LIMITS_H='limits.h'
+ AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+])
diff --git a/m4/link.m4 b/m4/link.m4
new file mode 100644
index 0000000..0d1de80
--- /dev/null
+++ b/m4/link.m4
@@ -0,0 +1,58 @@
+# link.m4 serial 11
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_LINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS_ONCE([link])
+ if test $ac_cv_func_link = no; then
+ HAVE_LINK=0
+ else
+ AC_CACHE_CHECK([whether link obeys POSIX],
+ [gl_cv_func_link_works],
+ [touch conftest.a
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.a conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ #include <stdio.h>
+ ]],
+ [[int result = 0;
+ if (!link ("conftest.a", "conftest.b/"))
+ result |= 1;
+#if HAVE_LSTAT
+ if (!link ("conftest.lnk/", "conftest.b"))
+ result |= 2;
+ if (rename ("conftest.a", "conftest.b"))
+ result |= 4;
+ if (!link ("conftest.b", "conftest.lnk"))
+ result |= 8;
+#endif
+ return result;
+ ]])],
+ [gl_cv_func_link_works=yes], [gl_cv_func_link_works=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_link_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_link_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_link_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.a conftest.b conftest.lnk])
+ case "$gl_cv_func_link_works" in
+ *yes) ;;
+ *)
+ REPLACE_LINK=1
+ ;;
+ esac
+ fi
+])
diff --git a/m4/localcharset.m4 b/m4/localcharset.m4
new file mode 100644
index 0000000..9d21c4f
--- /dev/null
+++ b/m4/localcharset.m4
@@ -0,0 +1,11 @@
+# localcharset.m4 serial 8
+dnl Copyright (C) 2002, 2004, 2006, 2009-2020 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.
+
+AC_DEFUN([gl_LOCALCHARSET],
+[
+ dnl Prerequisites of lib/localcharset.c.
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+])
diff --git a/m4/locale-fr.m4 b/m4/locale-fr.m4
new file mode 100644
index 0000000..406951f
--- /dev/null
+++ b/m4/locale-fr.m4
@@ -0,0 +1,253 @@
+# locale-fr.m4 serial 20
+dnl Copyright (C) 2003, 2005-2020 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.
+
+dnl Determine the name of a french locale with traditional encoding.
+AC_DEFUN([gt_LOCALE_FR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a traditional french locale], [gt_cv_locale_fr], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is only
+ one byte long. This excludes the UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 3 || buf[2] != 'v') return 1;
+# if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+# endif
+ return 0;
+#endif
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the native Windows locale name.
+ if (LC_ALL=French_France.1252 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=French_France.1252
+ else
+ # None found.
+ gt_cv_locale_fr=none
+ fi
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.ISO-8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO-8859-1
+ else
+ # Test for the AIX, OSF/1, FreeBSD, NetBSD, OpenBSD locale name.
+ if (LC_ALL=fr_FR.ISO8859-1 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.ISO8859-1
+ else
+ # Test for the HP-UX locale name.
+ if (LC_ALL=fr_FR.iso88591 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr_FR.iso88591
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr=fr
+ else
+ # None found.
+ gt_cv_locale_fr=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_FR=$gt_cv_locale_fr
+ AC_SUBST([LOCALE_FR])
+])
+
+dnl Determine the name of a french locale with UTF-8 encoding.
+AC_DEFUN([gt_LOCALE_FR_UTF8],
+[
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a french Unicode locale], [gt_cv_locale_fr_utf8], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main () {
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if !(defined __BEOS__ || defined __HAIKU__)
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail. */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in the abbreviation of the second month, the second
+ character (should be U+00E9: LATIN SMALL LETTER E WITH ACUTE) is
+ two bytes long, with UTF-8 encoding. */
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%b", &t) < 4
+ || buf[1] != (char) 0xc3 || buf[2] != (char) 0xa9 || buf[3] != 'v')
+ return 1;
+#endif
+#if !defined __BIONIC__ /* Bionic libc's 'struct lconv' is just a dummy. */
+ /* Check whether the decimal separator is a comma.
+ On NetBSD 3.0 in the fr_FR.ISO8859-1 locale, localeconv()->decimal_point
+ are nl_langinfo(RADIXCHAR) are both ".". */
+ if (localeconv () ->decimal_point[0] != ',') return 1;
+#endif
+ return 0;
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the hypothetical native Windows locale name.
+ if (LC_ALL=French_France.65001 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=French_France.65001
+ else
+ # None found.
+ gt_cv_locale_fr_utf8=none
+ fi
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the usual locale name.
+ if (LC_ALL=fr_FR LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=fr_FR.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr_FR.UTF-8
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=fr.UTF-8 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_fr_utf8=fr.UTF-8
+ else
+ # None found.
+ gt_cv_locale_fr_utf8=none
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_FR_UTF8=$gt_cv_locale_fr_utf8
+ AC_SUBST([LOCALE_FR_UTF8])
+])
diff --git a/m4/locale-ja.m4 b/m4/locale-ja.m4
new file mode 100644
index 0000000..31e95b8
--- /dev/null
+++ b/m4/locale-ja.m4
@@ -0,0 +1,143 @@
+# locale-ja.m4 serial 15
+dnl Copyright (C) 2003, 2005-2020 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.
+
+dnl Determine the name of a japanese locale with EUC-JP encoding.
+AC_DEFUN([gt_LOCALE_JA],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a traditional japanese locale], [gt_cv_locale_ja], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+#include <locale.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether MB_CUR_MAX is > 1. This excludes the dysfunctional locales
+ on Cygwin 1.5.x. */
+ if (MB_CUR_MAX == 1)
+ return 1;
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding (except on MirBSD). */
+ {
+ const char *p;
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ }
+ return 0;
+#endif
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Note that on native Windows, the Japanese locale is
+ # Japanese_Japan.932, and CP932 is very different from EUC-JP, so we
+ # cannot use it here.
+ gt_cv_locale_ja=none
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the AIX locale name.
+ if (LC_ALL=ja_JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=ja_JP.EUC-JP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC-JP
+ else
+ # Test for the HP-UX, OSF/1, NetBSD locale name.
+ if (LC_ALL=ja_JP.eucJP LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # Test for the IRIX, FreeBSD locale name.
+ if (LC_ALL=ja_JP.EUC LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja_JP.EUC
+ else
+ # Test for the Solaris 7 locale name.
+ if (LC_ALL=ja LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_ja=ja
+ else
+ # Special test for NetBSD 1.6.
+ if test -f /usr/share/locale/ja_JP.eucJP/LC_CTYPE; then
+ gt_cv_locale_ja=ja_JP.eucJP
+ else
+ # None found.
+ gt_cv_locale_ja=none
+ fi
+ fi
+ fi
+ fi
+ fi
+ fi
+ ;;
+ esac
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_JA=$gt_cv_locale_ja
+ AC_SUBST([LOCALE_JA])
+])
diff --git a/m4/locale-zh.m4 b/m4/locale-zh.m4
new file mode 100644
index 0000000..c60883c
--- /dev/null
+++ b/m4/locale-zh.m4
@@ -0,0 +1,137 @@
+# locale-zh.m4 serial 15
+dnl Copyright (C) 2003, 2005-2020 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.
+
+dnl Determine the name of a chinese locale with GB18030 encoding.
+AC_DEFUN([gt_LOCALE_ZH_CN],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AM_LANGINFO_CODESET])
+ AC_CACHE_CHECK([for a transitional chinese locale], [gt_cv_locale_zh_CN], [
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+#if HAVE_LANGINFO_CODESET
+# include <langinfo.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+struct tm t;
+char buf[16];
+int main ()
+{
+ /* On BeOS and Haiku, locales are not implemented in libc. Rather, libintl
+ imitates locale dependent behaviour by looking at the environment
+ variables, and all locales use the UTF-8 encoding. */
+#if defined __BEOS__ || defined __HAIKU__
+ return 1;
+#else
+ /* Check whether the given locale name is recognized by the system. */
+# if defined _WIN32 && !defined __CYGWIN__
+ /* On native Windows, setlocale(category, "") looks at the system settings,
+ not at the environment variables. Also, when an encoding suffix such
+ as ".65001" or ".54936" is specified, it succeeds but sets the LC_CTYPE
+ category of the locale to "C". */
+ if (setlocale (LC_ALL, getenv ("LC_ALL")) == NULL
+ || strcmp (setlocale (LC_CTYPE, NULL), "C") == 0)
+ return 1;
+# else
+ if (setlocale (LC_ALL, "") == NULL) return 1;
+# endif
+ /* Check whether nl_langinfo(CODESET) is nonempty and not "ASCII" or "646".
+ On Mac OS X 10.3.5 (Darwin 7.5) in the fr_FR locale, nl_langinfo(CODESET)
+ is empty, and the behaviour of Tcl 8.4 in this locale is not useful.
+ On OpenBSD 4.0, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "646". In this situation,
+ some unit tests fail.
+ On MirBSD 10, when an unsupported locale is specified, setlocale()
+ succeeds but then nl_langinfo(CODESET) is "UTF-8". */
+# if HAVE_LANGINFO_CODESET
+ {
+ const char *cs = nl_langinfo (CODESET);
+ if (cs[0] == '\0' || strcmp (cs, "ASCII") == 0 || strcmp (cs, "646") == 0
+ || strcmp (cs, "UTF-8") == 0)
+ return 1;
+ }
+# endif
+# ifdef __CYGWIN__
+ /* On Cygwin, avoid locale names without encoding suffix, because the
+ locale_charset() function relies on the encoding suffix. Note that
+ LC_ALL is set on the command line. */
+ if (strchr (getenv ("LC_ALL"), '.') == NULL) return 1;
+# endif
+ /* Check whether in a month name, no byte in the range 0x80..0x9F occurs.
+ This excludes the UTF-8 encoding (except on MirBSD). */
+ {
+ const char *p;
+ t.tm_year = 1975 - 1900; t.tm_mon = 2 - 1; t.tm_mday = 4;
+ if (strftime (buf, sizeof (buf), "%B", &t) < 2) return 1;
+ for (p = buf; *p != '\0'; p++)
+ if ((unsigned char) *p >= 0x80 && (unsigned char) *p < 0xa0)
+ return 1;
+ }
+ /* Check whether a typical GB18030 multibyte sequence is recognized as a
+ single wide character. This excludes the GB2312 and GBK encodings. */
+ if (mblen ("\203\062\332\066", 5) != 4)
+ return 1;
+ return 0;
+#endif
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ case "$host_os" in
+ # Handle native Windows specially, because there setlocale() interprets
+ # "ar" as "Arabic" or "Arabic_Saudi Arabia.1256",
+ # "fr" or "fra" as "French" or "French_France.1252",
+ # "ge"(!) or "deu"(!) as "German" or "German_Germany.1252",
+ # "ja" as "Japanese" or "Japanese_Japan.932",
+ # and similar.
+ mingw*)
+ # Test for the hypothetical native Windows locale name.
+ if (LC_ALL=Chinese_China.54936 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=Chinese_China.54936
+ else
+ # None found.
+ gt_cv_locale_zh_CN=none
+ fi
+ ;;
+ solaris2.8)
+ # On Solaris 8, the locales zh_CN.GB18030, zh_CN.GBK, zh.GBK are
+ # broken. One witness is the test case in gl_MBRTOWC_SANITYCHECK.
+ # Another witness is that "LC_ALL=zh_CN.GB18030 bash -c true" dumps core.
+ gt_cv_locale_zh_CN=none
+ ;;
+ *)
+ # Setting LC_ALL is not enough. Need to set LC_TIME to empty, because
+ # otherwise on Mac OS X 10.3.5 the LC_TIME=C from the beginning of the
+ # configure script would override the LC_ALL setting. Likewise for
+ # LC_CTYPE, which is also set at the beginning of the configure script.
+ # Test for the locale name without encoding suffix.
+ if (LC_ALL=zh_CN LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN
+ else
+ # Test for the locale name with explicit encoding suffix.
+ if (LC_ALL=zh_CN.GB18030 LC_TIME= LC_CTYPE= ./conftest; exit) 2>/dev/null; then
+ gt_cv_locale_zh_CN=zh_CN.GB18030
+ else
+ # None found.
+ gt_cv_locale_zh_CN=none
+ fi
+ fi
+ ;;
+ esac
+ else
+ # If there was a link error, due to mblen(), the system is so old that
+ # it certainly doesn't have a chinese locale.
+ gt_cv_locale_zh_CN=none
+ fi
+ rm -fr conftest*
+ ])
+ LOCALE_ZH_CN=$gt_cv_locale_zh_CN
+ AC_SUBST([LOCALE_ZH_CN])
+])
diff --git a/m4/locale_h.m4 b/m4/locale_h.m4
new file mode 100644
index 0000000..32494cf
--- /dev/null
+++ b/m4/locale_h.m4
@@ -0,0 +1,158 @@
+# locale_h.m4 serial 24
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_LOCALE_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+
+ dnl Persuade glibc <locale.h> to define locale_t and the int_p_*, int_n_*
+ dnl members of 'struct lconv'.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
+ AC_REQUIRE([gl_STDDEF_H])
+
+ AC_REQUIRE([gl_LOCALE_T])
+
+ dnl Solaris 11.0 defines the int_p_*, int_n_* members of 'struct lconv'
+ dnl only if _LCONV_C99 is defined.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ solaris*)
+ AC_DEFINE([_LCONV_C99], [1], [Define to 1 on Solaris.])
+ ;;
+ esac
+
+ AC_CACHE_CHECK([whether locale.h conforms to POSIX:2001],
+ [gl_cv_header_locale_h_posix2001],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <locale.h>
+ int x = LC_MESSAGES;
+ int y = sizeof (((struct lconv *) 0)->decimal_point);]],
+ [[]])],
+ [gl_cv_header_locale_h_posix2001=yes],
+ [gl_cv_header_locale_h_posix2001=no])])
+
+ dnl Check whether 'struct lconv' is complete.
+ dnl Bionic libc's 'struct lconv' is just a dummy.
+ dnl On OpenBSD 4.9, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 1.5.x,
+ dnl mingw, MSVC 9, it lacks the int_p_* and int_n_* members.
+ AC_CACHE_CHECK([whether struct lconv is properly defined],
+ [gl_cv_sys_struct_lconv_ok],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <locale.h>
+ struct lconv l;
+ int x = sizeof (l.decimal_point);
+ int y = sizeof (l.int_p_cs_precedes);]],
+ [[]])],
+ [gl_cv_sys_struct_lconv_ok=yes],
+ [gl_cv_sys_struct_lconv_ok=no])
+ ])
+ if test $gl_cv_sys_struct_lconv_ok = no; then
+ dnl On native Windows with MSVC, merely define these member names as macros.
+ dnl This avoids trouble in C++ mode.
+ case "$host_os" in
+ mingw*)
+ AC_EGREP_CPP([Special], [
+#ifdef _MSC_VER
+ Special
+#endif
+ ],
+ [],
+ [REPLACE_STRUCT_LCONV=1])
+ ;;
+ *) REPLACE_STRUCT_LCONV=1 ;;
+ esac
+ fi
+
+ dnl <locale.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_NEXT_HEADERS([locale.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <locale.h>
+/* Some systems provide declarations in a non-standard header. */
+#if HAVE_XLOCALE_H
+# include <xlocale.h>
+#endif
+ ]],
+ [setlocale newlocale duplocale freelocale])
+])
+
+dnl Checks to determine whether the system has the locale_t type,
+dnl and how to obtain it.
+AC_DEFUN([gl_LOCALE_T],
+[
+ dnl Persuade glibc and Solaris <locale.h> to define locale_t.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl Check whether use of locale_t requires inclusion of <xlocale.h>,
+ dnl e.g. on Mac OS X 10.5. If <locale.h> does not define locale_t by
+ dnl itself, we assume that <xlocale.h> will do so.
+ AC_CACHE_CHECK([whether locale.h defines locale_t],
+ [gl_cv_header_locale_has_locale_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <locale.h>
+ locale_t x;]],
+ [[]])],
+ [gl_cv_header_locale_has_locale_t=yes],
+ [gl_cv_header_locale_has_locale_t=no])
+ ])
+
+ dnl Check for <xlocale.h>.
+ AC_CHECK_HEADERS_ONCE([xlocale.h])
+ if test $ac_cv_header_xlocale_h = yes; then
+ HAVE_XLOCALE_H=1
+ if test $gl_cv_header_locale_has_locale_t = yes; then
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ else
+ gl_cv_header_locale_h_needs_xlocale_h=yes
+ fi
+ HAVE_LOCALE_T=1
+ else
+ HAVE_XLOCALE_H=0
+ gl_cv_header_locale_h_needs_xlocale_h=no
+ if test $gl_cv_header_locale_has_locale_t = yes; then
+ HAVE_LOCALE_T=1
+ else
+ HAVE_LOCALE_T=0
+ fi
+ fi
+ AC_SUBST([HAVE_XLOCALE_H])
+])
+
+AC_DEFUN([gl_LOCALE_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_LOCALE_H_DEFAULTS],
+[
+ GNULIB_LOCALECONV=0; AC_SUBST([GNULIB_LOCALECONV])
+ GNULIB_SETLOCALE=0; AC_SUBST([GNULIB_SETLOCALE])
+ GNULIB_SETLOCALE_NULL=0; AC_SUBST([GNULIB_SETLOCALE_NULL])
+ GNULIB_DUPLOCALE=0; AC_SUBST([GNULIB_DUPLOCALE])
+ GNULIB_LOCALENAME=0; AC_SUBST([GNULIB_LOCALENAME])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_NEWLOCALE=1; AC_SUBST([HAVE_NEWLOCALE])
+ HAVE_DUPLOCALE=1; AC_SUBST([HAVE_DUPLOCALE])
+ HAVE_FREELOCALE=1; AC_SUBST([HAVE_FREELOCALE])
+ REPLACE_LOCALECONV=0; AC_SUBST([REPLACE_LOCALECONV])
+ REPLACE_SETLOCALE=0; AC_SUBST([REPLACE_SETLOCALE])
+ REPLACE_NEWLOCALE=0; AC_SUBST([REPLACE_NEWLOCALE])
+ REPLACE_DUPLOCALE=0; AC_SUBST([REPLACE_DUPLOCALE])
+ REPLACE_FREELOCALE=0; AC_SUBST([REPLACE_FREELOCALE])
+ REPLACE_STRUCT_LCONV=0; AC_SUBST([REPLACE_STRUCT_LCONV])
+])
diff --git a/m4/localeconv.m4 b/m4/localeconv.m4
new file mode 100644
index 0000000..a926224
--- /dev/null
+++ b/m4/localeconv.m4
@@ -0,0 +1,22 @@
+# localeconv.m4 serial 1
+dnl Copyright (C) 2012-2020 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.
+
+AC_DEFUN([gl_FUNC_LOCALECONV],
+[
+ AC_REQUIRE([gl_LOCALE_H_DEFAULTS])
+ AC_REQUIRE([gl_LOCALE_H])
+
+ if test $REPLACE_STRUCT_LCONV = 1; then
+ REPLACE_LOCALECONV=1
+ fi
+])
+
+# Prerequisites of lib/localeconv.c.
+AC_DEFUN([gl_PREREQ_LOCALECONV],
+[
+ AC_CHECK_MEMBERS([struct lconv.decimal_point], [], [],
+ [[#include <locale.h>]])
+])
diff --git a/m4/lock.m4 b/m4/lock.m4
new file mode 100644
index 0000000..1c39591
--- /dev/null
+++ b/m4/lock.m4
@@ -0,0 +1,47 @@
+# lock.m4 serial 14
+dnl Copyright (C) 2005-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_LOCK],
+[
+ AC_REQUIRE([gl_THREADLIB])
+ if test "$gl_threads_api" = posix; then
+ # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
+ # pthread_rwlock_* functions.
+ has_rwlock=false
+ AC_CHECK_TYPE([pthread_rwlock_t],
+ [has_rwlock=true
+ AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1],
+ [Define if the POSIX multithreading library has read/write locks.])],
+ [],
+ [#include <pthread.h>])
+ if $has_rwlock; then
+ gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
+ fi
+ # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM(
+ [[#include <pthread.h>]],
+ [[
+#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
+ && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif
+ ]])],
+ [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1],
+ [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+ fi
+ gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/glthread/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [:])
diff --git a/m4/lseek.m4 b/m4/lseek.m4
new file mode 100644
index 0000000..472a1cb
--- /dev/null
+++ b/m4/lseek.m4
@@ -0,0 +1,72 @@
+# lseek.m4 serial 11
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_LSEEK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([whether lseek detects pipes], [gl_cv_func_lseek_pipe],
+ [case "$host_os" in
+ mingw*)
+ dnl Native Windows.
+ dnl The result of lseek (fd, (off_t)0, SEEK_CUR) or
+ dnl SetFilePointer(handle, 0, NULL, FILE_CURRENT)
+ dnl for a pipe depends on the environment: In a Cygwin 1.5
+ dnl environment it succeeds (wrong); in a Cygwin 1.7 environment
+ dnl it fails with a wrong errno value.
+ gl_cv_func_lseek_pipe=no
+ ;;
+ *)
+ if test $cross_compiling = no; then
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h> /* for off_t */
+#include <stdio.h> /* for SEEK_CUR */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#else /* on Windows with MSVC */
+# include <io.h>
+#endif
+]GL_MDA_DEFINES],
+[[
+ /* Exit with success only if stdin is seekable. */
+ return lseek (0, (off_t)0, SEEK_CUR) < 0;
+]])],
+ [if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext < conftest.$ac_ext \
+ && test 1 = "`echo hi \
+ | { ./conftest$ac_exeext; echo $?; cat >/dev/null; }`"; then
+ gl_cv_func_lseek_pipe=yes
+ else
+ gl_cv_func_lseek_pipe=no
+ fi
+ ],
+ [gl_cv_func_lseek_pipe=no])
+ else
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE([[
+#if defined __BEOS__
+/* BeOS mistakenly return 0 when trying to seek on pipes. */
+ Choke me.
+#endif]])],
+ [gl_cv_func_lseek_pipe=yes], [gl_cv_func_lseek_pipe=no])
+ fi
+ ;;
+ esac
+ ])
+ if test $gl_cv_func_lseek_pipe = no; then
+ REPLACE_LSEEK=1
+ AC_DEFINE([LSEEK_PIPE_BROKEN], [1],
+ [Define to 1 if lseek does not detect pipes.])
+ fi
+
+ AC_REQUIRE([gl_SYS_TYPES_H])
+ if test $WINDOWS_64_BIT_OFF_T = 1; then
+ REPLACE_LSEEK=1
+ fi
+])
diff --git a/m4/lstat.m4 b/m4/lstat.m4
new file mode 100644
index 0000000..3c2b214
--- /dev/null
+++ b/m4/lstat.m4
@@ -0,0 +1,79 @@
+# serial 33
+
+# Copyright (C) 1997-2001, 2003-2020 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.
+
+dnl From Jim Meyering.
+
+AC_DEFUN([gl_FUNC_LSTAT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ dnl If lstat does not exist, the replacement <sys/stat.h> does
+ dnl "#define lstat stat", and lstat.c is a no-op.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ if test $ac_cv_func_lstat = yes; then
+ AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ case $host_os,$gl_cv_func_lstat_dereferences_slashed_symlink in
+ solaris* | *no)
+ REPLACE_LSTAT=1
+ ;;
+ esac
+ else
+ HAVE_LSTAT=0
+ fi
+])
+
+# Prerequisites of lib/lstat.c.
+AC_DEFUN([gl_PREREQ_LSTAT], [:])
+
+AC_DEFUN([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK],
+[
+ dnl We don't use AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK any more, because it
+ dnl is no longer maintained in Autoconf and because it invokes AC_LIBOBJ.
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether lstat correctly handles trailing slash],
+ [gl_cv_func_lstat_dereferences_slashed_symlink],
+ [rm -f conftest.sym conftest.file
+ echo >conftest.file
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT],
+ [[struct stat sbuf;
+ if (symlink ("conftest.file", "conftest.sym") != 0)
+ return 1;
+ /* Linux will dereference the symlink and fail, as required by
+ POSIX. That is better in the sense that it means we will not
+ have to compile and use the lstat wrapper. */
+ return lstat ("conftest.sym/", &sbuf) == 0;
+ ]])],
+ [gl_cv_func_lstat_dereferences_slashed_symlink=yes],
+ [gl_cv_func_lstat_dereferences_slashed_symlink=no],
+ [case "$host_os" in
+ linux-* | linux)
+ # Guess yes on Linux systems.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+ *-gnu* | gnu*)
+ # Guess yes on glibc systems.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing yes" ;;
+ mingw*)
+ # Guess no on native Windows.
+ gl_cv_func_lstat_dereferences_slashed_symlink="guessing no" ;;
+ *)
+ # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_lstat_dereferences_slashed_symlink="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.sym conftest.file
+ ])
+ case "$gl_cv_func_lstat_dereferences_slashed_symlink" in
+ *yes)
+ AC_DEFINE_UNQUOTED([LSTAT_FOLLOWS_SLASHED_SYMLINK], [1],
+ [Define to 1 if 'lstat' dereferences a symlink specified
+ with a trailing slash.])
+ ;;
+ esac
+])
diff --git a/m4/malloc.m4 b/m4/malloc.m4
new file mode 100644
index 0000000..3823566
--- /dev/null
+++ b/m4/malloc.m4
@@ -0,0 +1,98 @@
+# malloc.m4 serial 21
+dnl Copyright (C) 2007, 2009-2020 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.
+
+# This is adapted with modifications from upstream Autoconf here:
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+AC_DEFUN([_AC_FUNC_MALLOC_IF],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+ AC_CACHE_CHECK([for GNU libc compatible malloc],
+ [ac_cv_func_malloc_0_nonnull],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ ]],
+ [[char *p = malloc (0);
+ int result = !p;
+ free (p);
+ return result;]])
+ ],
+ [ac_cv_func_malloc_0_nonnull=yes],
+ [ac_cv_func_malloc_0_nonnull=no],
+ [case "$host_os" in
+ # Guess yes on platforms where we know the result.
+ *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
+ | hpux* | solaris* | cygwin* | mingw*)
+ ac_cv_func_malloc_0_nonnull="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$ac_cv_func_malloc_0_nonnull" in
+ *yes)
+ $1
+ ;;
+ *)
+ $2
+ ;;
+ esac
+])# _AC_FUNC_MALLOC_IF
+
+# gl_FUNC_MALLOC_GNU
+# ------------------
+# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
+# it is not.
+AC_DEFUN([gl_FUNC_MALLOC_GNU],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
+ _AC_FUNC_MALLOC_IF(
+ [AC_DEFINE([HAVE_MALLOC_GNU], [1],
+ [Define to 1 if your system has a GNU libc compatible 'malloc'
+ function, and to 0 otherwise.])],
+ [AC_DEFINE([HAVE_MALLOC_GNU], [0])
+ REPLACE_MALLOC=1
+ ])
+])
+
+# gl_FUNC_MALLOC_POSIX
+# --------------------
+# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace malloc if it is not.
+AC_DEFUN([gl_FUNC_MALLOC_POSIX],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix = yes; then
+ AC_DEFINE([HAVE_MALLOC_POSIX], [1],
+ [Define if the 'malloc' function is POSIX compliant.])
+ else
+ REPLACE_MALLOC=1
+ fi
+])
+
+# Test whether malloc, realloc, calloc are POSIX compliant,
+# Set gl_cv_func_malloc_posix to yes or no accordingly.
+AC_DEFUN([gl_CHECK_MALLOC_POSIX],
+[
+ AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
+ [gl_cv_func_malloc_posix],
+ [
+ dnl It is too dangerous to try to allocate a large amount of memory:
+ dnl some systems go to their knees when you do that. So assume that
+ dnl all Unix implementations of the function are POSIX compliant.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[]],
+ [[#if defined _WIN32 && ! defined __CYGWIN__
+ choke me
+ #endif
+ ]])],
+ [gl_cv_func_malloc_posix=yes],
+ [gl_cv_func_malloc_posix=no])
+ ])
+])
diff --git a/m4/malloca.m4 b/m4/malloca.m4
new file mode 100644
index 0000000..930199d
--- /dev/null
+++ b/m4/malloca.m4
@@ -0,0 +1,14 @@
+# malloca.m4 serial 2
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_MALLOCA],
+[
+ dnl Use the autoconf tests for alloca(), but not the AC_SUBSTed variables
+ dnl @ALLOCA@ and @LTALLOCA@.
+ dnl gl_FUNC_ALLOCA dnl Already brought in by the module dependencies.
+ AC_REQUIRE([gl_EEMALLOC])
+])
diff --git a/m4/mbchar.m4 b/m4/mbchar.m4
new file mode 100644
index 0000000..5e3efa6
--- /dev/null
+++ b/m4/mbchar.m4
@@ -0,0 +1,13 @@
+# mbchar.m4 serial 9
+dnl Copyright (C) 2005-2007, 2009-2020 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 autoconf tests required for use of mbchar.m4
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBCHAR],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
diff --git a/m4/mbiter.m4 b/m4/mbiter.m4
new file mode 100644
index 0000000..e6b49a9
--- /dev/null
+++ b/m4/mbiter.m4
@@ -0,0 +1,14 @@
+# mbiter.m4 serial 7
+dnl Copyright (C) 2005, 2008-2020 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 autoconf tests required for use of mbiter.h
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_MBITER],
+[
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ :
+])
diff --git a/m4/mbrtowc.m4 b/m4/mbrtowc.m4
new file mode 100644
index 0000000..ad31a7b
--- /dev/null
+++ b/m4/mbrtowc.m4
@@ -0,0 +1,790 @@
+# mbrtowc.m4 serial 38 -*- coding: utf-8 -*-
+dnl Copyright (C) 2001-2002, 2004-2005, 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_MBRTOWC],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([gl_PTHREADLIB])
+ AC_CHECK_HEADERS_ONCE([threads.h])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+
+ AC_CHECK_FUNCS_ONCE([mbrtowc])
+ if test $ac_cv_func_mbrtowc = no; then
+ HAVE_MBRTOWC=0
+ AC_CHECK_DECLS([mbrtowc],,, [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_mbrtowc = yes; then
+ dnl On Minix 3.1.8, the system's <wchar.h> declares mbrtowc() although
+ dnl it does not have the function. Avoid a collision with gnulib's
+ dnl replacement.
+ REPLACE_MBRTOWC=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBRTOWC=1
+ else
+ gl_MBRTOWC_NULL_ARG1
+ gl_MBRTOWC_NULL_ARG2
+ gl_MBRTOWC_RETVAL
+ gl_MBRTOWC_NUL_RETVAL
+ gl_MBRTOWC_STORES_INCOMPLETE
+ gl_MBRTOWC_EMPTY_INPUT
+ gl_MBRTOWC_C_LOCALE
+ case "$gl_cv_func_mbrtowc_null_arg1" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_NULL_ARG1_BUG], [1],
+ [Define if the mbrtowc function has the NULL pwc argument bug.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_null_arg2" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_NULL_ARG2_BUG], [1],
+ [Define if the mbrtowc function has the NULL string argument bug.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_retval" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_RETVAL_BUG], [1],
+ [Define if the mbrtowc function returns a wrong return value.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_nul_retval" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_NUL_RETVAL_BUG], [1],
+ [Define if the mbrtowc function does not return 0 for a NUL character.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_stores_incomplete" in
+ *no) ;;
+ *) AC_DEFINE([MBRTOWC_STORES_INCOMPLETE_BUG], [1],
+ [Define if the mbrtowc function stores a wide character when reporting incomplete input.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_empty_input" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_EMPTY_INPUT_BUG], [1],
+ [Define if the mbrtowc function does not return (size_t) -2
+ for empty input.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ case "$gl_cv_func_mbrtowc_C_locale_sans_EILSEQ" in
+ *yes) ;;
+ *) AC_DEFINE([MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ], [1],
+ [Define if the mbrtowc function may signal encoding errors in the C locale.])
+ REPLACE_MBRTOWC=1
+ ;;
+ esac
+ fi
+ fi
+ if test $REPLACE_MBSTATE_T = 1; then
+ case "$host_os" in
+ mingw*) LIB_MBRTOWC= ;;
+ *)
+ gl_WEAK_SYMBOLS
+ case "$gl_cv_have_weak" in
+ *yes) LIB_MBRTOWC= ;;
+ *) LIB_MBRTOWC="$LIBPTHREAD" ;;
+ esac
+ ;;
+ esac
+ else
+ LIB_MBRTOWC=
+ fi
+ dnl LIB_MBRTOWC is expected to be '-pthread' or '-lpthread' on AIX
+ dnl with gcc or xlc, and empty otherwise.
+ AC_SUBST([LIB_MBRTOWC])
+])
+
+dnl Test whether mbsinit() and mbrtowc() need to be overridden in a way that
+dnl redefines the semantics of the given mbstate_t type.
+dnl Result is REPLACE_MBSTATE_T.
+dnl When this is set to 1, we replace both mbsinit() and mbrtowc(), in order to
+dnl avoid inconsistencies.
+
+AC_DEFUN([gl_MBSTATE_T_BROKEN],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_CHECK_FUNCS_ONCE([mbsinit])
+ AC_CHECK_FUNCS_ONCE([mbrtowc])
+ dnl On native Windows, we know exactly how mbsinit() behaves and don't need
+ dnl to override it, even if - like on MSVC - mbsinit() is only defined as
+ dnl an inline function, not as a global function.
+ if case "$host_os" in
+ mingw*) true ;;
+ *) test $ac_cv_func_mbsinit = yes ;;
+ esac \
+ && test $ac_cv_func_mbrtowc = yes; then
+ gl_MBRTOWC_INCOMPLETE_STATE
+ gl_MBRTOWC_SANITYCHECK
+ REPLACE_MBSTATE_T=0
+ case "$gl_cv_func_mbrtowc_incomplete_state" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ case "$gl_cv_func_mbrtowc_sanitycheck" in
+ *yes) ;;
+ *) REPLACE_MBSTATE_T=1 ;;
+ esac
+ else
+ REPLACE_MBSTATE_T=1
+ fi
+])
+
+dnl Test whether mbrtowc puts the state into non-initial state when parsing an
+dnl incomplete multibyte character.
+dnl Result is gl_cv_func_mbrtowc_incomplete_state.
+
+AC_DEFUN([gl_MBRTOWC_INCOMPLETE_STATE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc handles incomplete characters],
+ [gl_cv_func_mbrtowc_incomplete_state],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX and OSF/1.
+ aix* | osf*) gl_cv_func_mbrtowc_incomplete_state="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_incomplete_state="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_JA != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_incomplete_state=yes],
+ [gl_cv_func_mbrtowc_incomplete_state=no],
+ [:])
+ else
+ if test $LOCALE_FR_UTF8 != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ if (mbsinit (&state))
+ return 2;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_incomplete_state=yes],
+ [gl_cv_func_mbrtowc_incomplete_state=no],
+ [:])
+ fi
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc works not worse than mbtowc.
+dnl Result is gl_cv_func_mbrtowc_sanitycheck.
+
+AC_DEFUN([gl_MBRTOWC_SANITYCHECK],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc works as well as mbtowc],
+ [gl_cv_func_mbrtowc_sanitycheck],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris 8.
+ solaris2.8) gl_cv_func_mbrtowc_sanitycheck="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_sanitycheck="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8:
+ mbrtowc returns 2, and sets wc to 0x00F0.
+ mbtowc returns 4 (correct) and sets wc to 0x5EDC. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ char input[] = "B\250\271\201\060\211\070er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 6, &state) != 4
+ && mbtowc (&wc, input + 3, 6) == 4)
+ return 2;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_sanitycheck=yes],
+ [gl_cv_func_mbrtowc_sanitycheck=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc supports a NULL pwc argument correctly.
+dnl Result is gl_cv_func_mbrtowc_null_arg1.
+
+AC_DEFUN([gl_MBRTOWC_NULL_ARG1],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc handles a NULL pwc argument],
+ [gl_cv_func_mbrtowc_null_arg1],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris.
+ solaris*) gl_cv_func_mbrtowc_null_arg1="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_null_arg1="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "\303\237er";
+ mbstate_t state;
+ wchar_t wc;
+ size_t ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ ret = mbrtowc (&wc, input, 5, &state);
+ if (ret != 2)
+ result |= 1;
+ if (!mbsinit (&state))
+ result |= 2;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ ret = mbrtowc (NULL, input, 5, &state);
+ if (ret != 2) /* Solaris 7 fails here: ret is -1. */
+ result |= 4;
+ if (!mbsinit (&state))
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_mbrtowc_null_arg1=yes],
+ [gl_cv_func_mbrtowc_null_arg1=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc supports a NULL string argument correctly.
+dnl Result is gl_cv_func_mbrtowc_null_arg2.
+
+AC_DEFUN([gl_MBRTOWC_NULL_ARG2],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc handles a NULL string argument],
+ [gl_cv_func_mbrtowc_null_arg2],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on OSF/1.
+ osf*) gl_cv_func_mbrtowc_null_arg2="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_null_arg2="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+ int ret;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ wc = (wchar_t) 0xBADFACE;
+ mbrtowc (&wc, NULL, 5, &state);
+ /* Check that wc was not modified. */
+ if (wc != (wchar_t) 0xBADFACE)
+ return 2;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_null_arg2=yes],
+ [gl_cv_func_mbrtowc_null_arg2=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc, when parsing the end of a multibyte character,
+dnl correctly returns the number of bytes that were needed to complete the
+dnl character (not the total number of bytes of the multibyte character).
+dnl Result is gl_cv_func_mbrtowc_retval.
+
+AC_DEFUN([gl_MBRTOWC_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether mbrtowc has a correct return value],
+ [gl_cv_func_mbrtowc_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX, Solaris, native Windows.
+ hpux* | solaris* | mingw*) gl_cv_func_mbrtowc_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none \
+ || { case "$host_os" in mingw*) true;; *) false;; esac; }; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ int found_some_locale = 0;
+ /* This fails on Solaris. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ char input[] = "B\303\274\303\237er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 1)
+ result |= 1;
+ }
+ found_some_locale = 1;
+ }
+ /* This fails on HP-UX 11.11. */
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ char input[] = "B\217\253\344\217\251\316er"; /* "Büßer" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 1, 1, &state) == (size_t)(-2))
+ {
+ input[1] = '\0';
+ if (mbrtowc (&wc, input + 2, 5, &state) != 2)
+ result |= 2;
+ }
+ found_some_locale = 1;
+ }
+ /* This fails on native Windows. */
+ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+ {
+ char input[] = "<\223\372\226\173\214\352>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 4;
+ }
+ found_some_locale = 1;
+ }
+ if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+ {
+ char input[] = "<\244\351\245\273\273\171>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 8;
+ }
+ found_some_locale = 1;
+ }
+ if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+ {
+ char input[] = "<\310\325\261\276\325\132>"; /* "<日本語>" */
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, input + 3, 1, &state) == (size_t)(-2))
+ {
+ input[3] = '\0';
+ if (mbrtowc (&wc, input + 4, 4, &state) != 1)
+ result |= 16;
+ }
+ found_some_locale = 1;
+ }
+ return (found_some_locale ? result : 77);
+}]])],
+ [gl_cv_func_mbrtowc_retval=yes],
+ [if test $? != 77; then
+ gl_cv_func_mbrtowc_retval=no
+ fi
+ ],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc, when parsing a NUL character, correctly returns 0.
+dnl Result is gl_cv_func_mbrtowc_nul_retval.
+
+AC_DEFUN([gl_MBRTOWC_NUL_RETVAL],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc returns 0 when parsing a NUL character],
+ [gl_cv_func_mbrtowc_nul_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Solaris 8 and 9.
+ solaris2.[89]) gl_cv_func_mbrtowc_nul_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbrtowc_nul_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ /* This fails on Solaris 8 and 9. */
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ mbstate_t state;
+ wchar_t wc;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "", 1, &state) != 0)
+ return 2;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_nul_retval=yes],
+ [gl_cv_func_mbrtowc_nul_retval=no],
+ [:])
+ fi
+ ])
+])
+
+dnl Test whether mbrtowc stores a wide character when reporting incomplete
+dnl input.
+
+AC_DEFUN([gl_MBRTOWC_STORES_INCOMPLETE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc stores incomplete characters],
+ [gl_cv_func_mbrtowc_stores_incomplete],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_stores_incomplete="guessing yes" ;;
+ *) gl_cv_func_mbrtowc_stores_incomplete="guessing no" ;;
+ esac
+changequote([,])dnl
+ case "$host_os" in
+ mingw*)
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "French_France.65001") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "Japanese_Japan.932") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\226", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 2;
+ }
+ if (setlocale (LC_ALL, "Chinese_Taiwan.950") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\245", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "Chinese_China.936") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\261", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_mbrtowc_stores_incomplete=no],
+ [gl_cv_func_mbrtowc_stores_incomplete=yes],
+ [:])
+ ;;
+ *)
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ if test $LOCALE_FR_UTF8 != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (&wc, "\303", 1, &state) == (size_t)(-2)
+ && wc != (wchar_t) 0xBADFACE)
+ return 1;
+ }
+ return 0;
+}]])],
+ [gl_cv_func_mbrtowc_stores_incomplete=no],
+ [gl_cv_func_mbrtowc_stores_incomplete=yes],
+ [:])
+ fi
+ ;;
+ esac
+ ])
+])
+
+dnl Test whether mbrtowc returns the correct value on empty input.
+
+AC_DEFUN([gl_MBRTOWC_EMPTY_INPUT],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbrtowc works on empty input],
+ [gl_cv_func_mbrtowc_empty_input],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX and glibc systems.
+ aix* | *-gnu* | gnu*) gl_cv_func_mbrtowc_empty_input="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+ *) gl_cv_func_mbrtowc_empty_input="guessing yes" ;;
+ esac
+changequote([,])dnl
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <wchar.h>
+ static wchar_t wc;
+ static mbstate_t mbs;
+ int
+ main (void)
+ {
+ return mbrtowc (&wc, "", 0, &mbs) != (size_t) -2;
+ }]])],
+ [gl_cv_func_mbrtowc_empty_input=yes],
+ [gl_cv_func_mbrtowc_empty_input=no],
+ [:])
+ ])
+])
+
+dnl Test whether mbrtowc reports encoding errors in the C locale.
+dnl Although POSIX was never intended to allow this, the GNU C Library
+dnl and other implementations do it. See:
+dnl https://sourceware.org/bugzilla/show_bug.cgi?id=19932
+
+AC_DEFUN([gl_MBRTOWC_C_LOCALE],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether the C locale is free of encoding errors],
+ [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+ gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="$gl_cross_guess_normal"
+
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <limits.h>
+ #include <locale.h>
+ #include <wchar.h>
+ ]], [[
+ int i;
+ char *locale = setlocale (LC_ALL, "C");
+ if (! locale)
+ return 2;
+ for (i = CHAR_MIN; i <= CHAR_MAX; i++)
+ {
+ char c = i;
+ wchar_t wc;
+ mbstate_t mbs = { 0, };
+ size_t ss = mbrtowc (&wc, &c, 1, &mbs);
+ if (1 < ss)
+ return 3;
+ }
+ return 0;
+ ]])],
+ [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=yes],
+ [gl_cv_func_mbrtowc_C_locale_sans_EILSEQ=no],
+ [case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_mbrtowc_C_locale_sans_EILSEQ="guessing yes" ;;
+ esac
+ ])
+ ])
+])
+
+# Prerequisites of lib/mbrtowc.c and lib/lc-charset-dispatch.c.
+AC_DEFUN([gl_PREREQ_MBRTOWC], [
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
+
+# Prerequisites of lib/mbtowc-lock.c.
+AC_DEFUN([gl_PREREQ_MBTOWC_LOCK],
+[
+ gl_VISIBILITY
+])
+
+
+dnl From Paul Eggert
+
+dnl This is an override of an autoconf macro.
+
+AC_DEFUN([AC_FUNC_MBRTOWC],
+[
+ dnl Same as AC_FUNC_MBRTOWC in autoconf-2.60.
+ AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
+ [gl_cv_func_mbrtowc],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>]],
+ [[wchar_t wc;
+ char const s[] = "";
+ size_t n = 1;
+ mbstate_t state;
+ return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));]])],
+ [gl_cv_func_mbrtowc=yes],
+ [gl_cv_func_mbrtowc=no])])
+ if test $gl_cv_func_mbrtowc = yes; then
+ AC_DEFINE([HAVE_MBRTOWC], [1],
+ [Define to 1 if mbrtowc and mbstate_t are properly declared.])
+ fi
+])
diff --git a/m4/mbsinit.m4 b/m4/mbsinit.m4
new file mode 100644
index 0000000..f446659
--- /dev/null
+++ b/m4/mbsinit.m4
@@ -0,0 +1,44 @@
+# mbsinit.m4 serial 9
+dnl Copyright (C) 2008, 2010-2020 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.
+
+AC_DEFUN([gl_FUNC_MBSINIT],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+
+ AC_CHECK_FUNCS_ONCE([mbsinit])
+ if test $ac_cv_func_mbsinit = no; then
+ HAVE_MBSINIT=0
+ AC_CHECK_DECLS([mbsinit],,, [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_mbsinit = yes; then
+ dnl On Minix 3.1.8, the system's <wchar.h> declares mbsinit() although
+ dnl it does not have the function. Avoid a collision with gnulib's
+ dnl replacement.
+ REPLACE_MBSINIT=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSINIT=1
+ else
+ dnl On mingw, mbsinit() always returns 1, which is inappropriate for
+ dnl states produced by mbrtowc() for an incomplete multibyte character
+ dnl in multibyte locales.
+ case "$host_os" in
+ mingw*) REPLACE_MBSINIT=1 ;;
+ esac
+ fi
+ fi
+])
+
+# Prerequisites of lib/mbsinit.c.
+AC_DEFUN([gl_PREREQ_MBSINIT], [
+ :
+])
diff --git a/m4/mbsrtowcs.m4 b/m4/mbsrtowcs.m4
new file mode 100644
index 0000000..5a558c3
--- /dev/null
+++ b/m4/mbsrtowcs.m4
@@ -0,0 +1,141 @@
+# mbsrtowcs.m4 serial 14
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_MBSRTOWCS],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+
+ AC_CHECK_FUNCS_ONCE([mbsrtowcs])
+ if test $ac_cv_func_mbsrtowcs = no; then
+ HAVE_MBSRTOWCS=0
+ AC_CHECK_DECLS([mbsrtowcs],,, [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_mbsrtowcs = yes; then
+ dnl On Minix 3.1.8, the system's <wchar.h> declares mbsrtowcs() although
+ dnl it does not have the function. Avoid a collision with gnulib's
+ dnl replacement.
+ REPLACE_MBSRTOWCS=1
+ fi
+ else
+ if test $REPLACE_MBSTATE_T = 1; then
+ REPLACE_MBSRTOWCS=1
+ else
+ gl_MBSRTOWCS_WORKS
+ case "$gl_cv_func_mbsrtowcs_works" in
+ *yes) ;;
+ *) REPLACE_MBSRTOWCS=1 ;;
+ esac
+ fi
+ fi
+])
+
+dnl Test whether mbsrtowcs works.
+dnl Result is gl_cv_func_mbsrtowcs_works.
+
+AC_DEFUN([gl_MBSRTOWCS_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether mbsrtowcs works],
+ [gl_cv_func_mbsrtowcs_works],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on HP-UX, Solaris, mingw.
+ hpux* | solaris* | mingw*) gl_cv_func_mbsrtowcs_works="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_mbsrtowcs_works="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+int main ()
+{
+ int result = 0;
+ /* Test whether the function supports a NULL destination argument.
+ This fails on native Windows. */
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ const char input[] = "\337er";
+ const char *src = input;
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbsrtowcs (NULL, &src, 1, &state) != 3
+ || src != input)
+ result |= 1;
+ }
+ /* Test whether the function works when started with a conversion state
+ in non-initial state. This fails on HP-UX 11.11 and Solaris 10. */
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ const char input[] = "B\303\274\303\237er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ result |= 2;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ const char input[] = "<\306\374\313\334\270\354>";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 3, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 4;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 3)
+ result |= 4;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ const char input[] = "B\250\271\201\060\211\070er";
+ mbstate_t state;
+
+ memset (&state, '\0', sizeof (mbstate_t));
+ if (mbrtowc (NULL, input + 1, 1, &state) == (size_t)(-2))
+ if (!mbsinit (&state))
+ {
+ const char *src = input + 2;
+ if (mbsrtowcs (NULL, &src, 10, &state) != 4)
+ result |= 8;
+ }
+ }
+ return result;
+}]])],
+ [gl_cv_func_mbsrtowcs_works=yes],
+ [gl_cv_func_mbsrtowcs_works=no],
+ [:])
+ fi
+ ])
+])
+
+# Prerequisites of lib/mbsrtowcs.c.
+AC_DEFUN([gl_PREREQ_MBSRTOWCS], [
+ :
+])
diff --git a/m4/mbstate_t.m4 b/m4/mbstate_t.m4
new file mode 100644
index 0000000..226f122
--- /dev/null
+++ b/m4/mbstate_t.m4
@@ -0,0 +1,34 @@
+# mbstate_t.m4 serial 14
+dnl Copyright (C) 2000-2002, 2008-2020 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.
+
+# From Paul Eggert.
+
+# BeOS 5 has <wchar.h> but does not define mbstate_t,
+# so you can't declare an object of that type.
+# Check for this incompatibility with Standard C.
+
+# AC_TYPE_MBSTATE_T
+# -----------------
+AC_DEFUN([AC_TYPE_MBSTATE_T],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) dnl for HP-UX 11.11
+
+ AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT[
+ #include <wchar.h>]],
+ [[mbstate_t x; return sizeof x;]])],
+ [ac_cv_type_mbstate_t=yes],
+ [ac_cv_type_mbstate_t=no])])
+ if test $ac_cv_type_mbstate_t = yes; then
+ AC_DEFINE([HAVE_MBSTATE_T], [1],
+ [Define to 1 if <wchar.h> declares mbstate_t.])
+ else
+ AC_DEFINE([mbstate_t], [int],
+ [Define to a type if <wchar.h> does not define.])
+ fi
+])
diff --git a/m4/mbtowc.m4 b/m4/mbtowc.m4
new file mode 100644
index 0000000..befcffa
--- /dev/null
+++ b/m4/mbtowc.m4
@@ -0,0 +1,24 @@
+# mbtowc.m4 serial 3
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_MBTOWC],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ AC_CHECK_FUNCS([mbtowc])
+ if test $ac_cv_func_mbtowc = no; then
+ HAVE_MBTOWC=0
+ else
+ if false; then
+ REPLACE_MBTOWC=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/mbtowc.c.
+AC_DEFUN([gl_PREREQ_MBTOWC], [
+ :
+])
diff --git a/m4/md4.m4 b/m4/md4.m4
new file mode 100644
index 0000000..519095c
--- /dev/null
+++ b/m4/md4.m4
@@ -0,0 +1,12 @@
+# md4.m4 serial 7
+dnl Copyright (C) 2002-2006, 2008-2020 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 Prerequisites of lib/md4.c.
+AC_DEFUN([gl_MD4],
+[
+ AC_REQUIRE([gl_BIGENDIAN])
+ :
+])
diff --git a/m4/md5.m4 b/m4/md5.m4
new file mode 100644
index 0000000..ca213ed
--- /dev/null
+++ b/m4/md5.m4
@@ -0,0 +1,14 @@
+# md5.m4 serial 14
+dnl Copyright (C) 2002-2006, 2008-2020 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.
+
+AC_DEFUN([gl_MD5],
+[
+ dnl Prerequisites of lib/md5.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+
+ dnl Determine HAVE_OPENSSL_MD5 and LIB_CRYPTO
+ gl_CRYPTO_CHECK([MD5])
+])
diff --git a/m4/memchr.m4 b/m4/memchr.m4
new file mode 100644
index 0000000..888d2b2
--- /dev/null
+++ b/m4/memchr.m4
@@ -0,0 +1,106 @@
+# memchr.m4 serial 17
+dnl Copyright (C) 2002-2004, 2009-2020 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.
+
+AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Check for prerequisites for memory fence checks.
+ gl_FUNC_MMAP_ANON
+ AC_CHECK_HEADERS_ONCE([sys/mman.h])
+ AC_CHECK_FUNCS_ONCE([mprotect])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ # Detect platform-specific bugs in some versions of glibc:
+ # memchr should not dereference anything with length 0
+ # https://bugzilla.redhat.com/show_bug.cgi?id=499689
+ # memchr should not dereference overestimated length after a match
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=10162
+ # memchr should cast the second argument to 'unsigned char'.
+ # This bug exists in Android 4.3.
+ # Assume that memchr works on platforms that lack mprotect.
+ AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <string.h>
+#if HAVE_SYS_MMAN_H
+# include <fcntl.h>
+# include <unistd.h>
+# include <sys/types.h>
+# include <sys/mman.h>
+# ifndef MAP_FILE
+# define MAP_FILE 0
+# endif
+#endif
+]], [[
+ int result = 0;
+ char *fence = NULL;
+#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
+# if HAVE_MAP_ANONYMOUS
+ const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
+ const int fd = -1;
+# else /* !HAVE_MAP_ANONYMOUS */
+ const int flags = MAP_FILE | MAP_PRIVATE;
+ int fd = open ("/dev/zero", O_RDONLY, 0666);
+ if (fd >= 0)
+# endif
+ {
+ int pagesize = getpagesize ();
+ char *two_pages =
+ (char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
+ flags, fd, 0);
+ if (two_pages != (char *)(-1)
+ && mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
+ fence = two_pages + pagesize;
+ }
+#endif
+ if (fence)
+ {
+ /* Test against bugs on glibc systems. */
+ if (memchr (fence, 0, 0))
+ result |= 1;
+ strcpy (fence - 9, "12345678");
+ if (memchr (fence - 9, 0, 79) != fence - 1)
+ result |= 2;
+ if (memchr (fence - 1, 0, 3) != fence - 1)
+ result |= 4;
+ /* Test against bug on AIX 7.2. */
+ if (memchr (fence - 4, '6', 16) != fence - 4)
+ result |= 8;
+ }
+ /* Test against bug on Android 4.3. */
+ {
+ char input[3];
+ input[0] = 'a';
+ input[1] = 'b';
+ input[2] = 'c';
+ if (memchr (input, 0x789abc00 | 'b', 3) != input + 1)
+ result |= 16;
+ }
+ return result;
+]])],
+ [gl_cv_func_memchr_works=yes],
+ [gl_cv_func_memchr_works=no],
+ [case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_memchr_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_memchr_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_memchr_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_memchr_works" in
+ *yes) ;;
+ *) REPLACE_MEMCHR=1 ;;
+ esac
+])
+
+# Prerequisites of lib/memchr.c.
+AC_DEFUN([gl_PREREQ_MEMCHR], [
+ AC_CHECK_HEADERS([bp-sym.h])
+])
diff --git a/m4/mempcpy.m4 b/m4/mempcpy.m4
new file mode 100644
index 0000000..899f12a
--- /dev/null
+++ b/m4/mempcpy.m4
@@ -0,0 +1,26 @@
+# mempcpy.m4 serial 11
+dnl Copyright (C) 2003-2004, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_MEMPCPY],
+[
+ dnl Persuade glibc <string.h> to declare mempcpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The mempcpy() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([mempcpy])
+ if test $ac_cv_func_mempcpy = no; then
+ HAVE_MEMPCPY=0
+ fi
+])
+
+# Prerequisites of lib/mempcpy.c.
+AC_DEFUN([gl_PREREQ_MEMPCPY], [
+ :
+])
diff --git a/m4/memrchr.m4 b/m4/memrchr.m4
new file mode 100644
index 0000000..95990ed
--- /dev/null
+++ b/m4/memrchr.m4
@@ -0,0 +1,23 @@
+# memrchr.m4 serial 10
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_MEMRCHR],
+[
+ dnl Persuade glibc <string.h> to declare memrchr().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([memrchr])
+ if test $ac_cv_have_decl_memrchr = no; then
+ HAVE_DECL_MEMRCHR=0
+ fi
+
+ AC_CHECK_FUNCS([memrchr])
+])
+
+# Prerequisites of lib/memrchr.c.
+AC_DEFUN([gl_PREREQ_MEMRCHR], [:])
diff --git a/m4/minmax.m4 b/m4/minmax.m4
new file mode 100644
index 0000000..e5b28b0
--- /dev/null
+++ b/m4/minmax.m4
@@ -0,0 +1,44 @@
+# minmax.m4 serial 4
+dnl Copyright (C) 2005, 2009-2020 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.
+
+AC_PREREQ([2.53])
+
+AC_DEFUN([gl_MINMAX],
+[
+ AC_REQUIRE([gl_PREREQ_MINMAX])
+])
+
+# Prerequisites of lib/minmax.h.
+AC_DEFUN([gl_PREREQ_MINMAX],
+[
+ gl_MINMAX_IN_HEADER([limits.h])
+ gl_MINMAX_IN_HEADER([sys/param.h])
+])
+
+dnl gl_MINMAX_IN_HEADER(HEADER)
+dnl The parameter has to be a literal header name; it cannot be macro,
+dnl nor a shell variable. (Because autoheader collects only AC_DEFINE
+dnl invocations with a literal macro name.)
+AC_DEFUN([gl_MINMAX_IN_HEADER],
+[
+ m4_pushdef([header], AS_TR_SH([$1]))
+ m4_pushdef([HEADER], AS_TR_CPP([$1]))
+ AC_CACHE_CHECK([whether <$1> defines MIN and MAX],
+ [gl_cv_minmax_in_]header,
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <$1>
+ int x = MIN (42, 17);]],
+ [[]])],
+ [gl_cv_minmax_in_]header[=yes],
+ [gl_cv_minmax_in_]header[=no])])
+ if test $gl_cv_minmax_in_[]header = yes; then
+ AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1,
+ [Define to 1 if <$1> defines the MIN and MAX macros.])
+ fi
+ m4_popdef([HEADER])
+ m4_popdef([header])
+])
diff --git a/m4/mkdir.m4 b/m4/mkdir.m4
new file mode 100644
index 0000000..bd9e088
--- /dev/null
+++ b/m4/mkdir.m4
@@ -0,0 +1,87 @@
+# serial 17
+
+# Copyright (C) 2001, 2003-2004, 2006, 2008-2020 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.
+
+# On some systems, mkdir ("foo/", 0700) fails because of the trailing slash.
+# On others, mkdir ("foo/./", 0700) mistakenly succeeds.
+# On such systems, arrange to use a wrapper function.
+AC_DEFUN([gl_FUNC_MKDIR],
+[dnl
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CACHE_CHECK([whether mkdir handles trailing slash],
+ [gl_cv_func_mkdir_trailing_slash_works],
+ [rm -rf conftest.dir
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ ]GL_MDA_DEFINES],
+ [[return mkdir ("conftest.dir/", 0700);]])],
+ [gl_cv_func_mkdir_trailing_slash_works=yes],
+ [gl_cv_func_mkdir_trailing_slash_works=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_mkdir_trailing_slash_works="guessing yes" ;;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_mkdir_trailing_slash_works="guessing yes"],
+ [gl_cv_func_mkdir_trailing_slash_works="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_mkdir_trailing_slash_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -rf conftest.dir
+ ])
+ case "$gl_cv_func_mkdir_trailing_slash_works" in
+ *yes) ;;
+ *)
+ REPLACE_MKDIR=1
+ ;;
+ esac
+
+ AC_CACHE_CHECK([whether mkdir handles trailing dot],
+ [gl_cv_func_mkdir_trailing_dot_works],
+ [rm -rf conftest.dir
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ ]GL_MDA_DEFINES],
+ [[return !mkdir ("conftest.dir/./", 0700);]])],
+ [gl_cv_func_mkdir_trailing_dot_works=yes],
+ [gl_cv_func_mkdir_trailing_dot_works=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_mkdir_trailing_dot_works="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_mkdir_trailing_dot_works="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_mkdir_trailing_dot_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -rf conftest.dir
+ ]
+ )
+ case "$gl_cv_func_mkdir_trailing_dot_works" in
+ *yes) ;;
+ *)
+ REPLACE_MKDIR=1
+ AC_DEFINE([FUNC_MKDIR_DOT_BUG], [1], [Define to 1 if mkdir mistakenly
+ creates a directory given with a trailing dot component.])
+ ;;
+ esac
+])
diff --git a/m4/mkostemp.m4 b/m4/mkostemp.m4
new file mode 100644
index 0000000..3e5b555
--- /dev/null
+++ b/m4/mkostemp.m4
@@ -0,0 +1,23 @@
+# mkostemp.m4 serial 2
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_MKOSTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+ dnl Persuade glibc <stdlib.h> to declare mkostemp().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([mkostemp])
+ if test $ac_cv_func_mkostemp != yes; then
+ HAVE_MKOSTEMP=0
+ fi
+])
+
+# Prerequisites of lib/mkostemp.c.
+AC_DEFUN([gl_PREREQ_MKOSTEMP],
+[
+])
diff --git a/m4/mkstemp.m4 b/m4/mkstemp.m4
new file mode 100644
index 0000000..392f97c
--- /dev/null
+++ b/m4/mkstemp.m4
@@ -0,0 +1,87 @@
+#serial 28
+
+# Copyright (C) 2001, 2003-2007, 2009-2020 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.
+
+# On some hosts (e.g., HP-UX 10.20, SunOS 4.1.4, Solaris 2.5.1), mkstemp has a
+# silly limit that it can create no more than 26 files from a given template.
+# Other systems lack mkstemp altogether.
+# On OSF1/Tru64 V4.0F, the system-provided mkstemp function can create
+# only 32 files per process.
+# On some hosts, mkstemp creates files with mode 0666, which is a security
+# problem and a violation of POSIX 2008.
+# On systems like the above, arrange to use the replacement function.
+AC_DEFUN([gl_FUNC_MKSTEMP],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_CHECK_FUNCS_ONCE([mkstemp])
+ if test $ac_cv_func_mkstemp = yes; then
+ AC_CACHE_CHECK([for working mkstemp],
+ [gl_cv_func_working_mkstemp],
+ [
+ mkdir conftest.mkstemp
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [AC_INCLUDES_DEFAULT
+ GL_MDA_DEFINES],
+ [[int result = 0;
+ int i;
+ off_t large = (off_t) 4294967295u;
+ if (large < 0)
+ large = 2147483647;
+ umask (0);
+ for (i = 0; i < 70; i++)
+ {
+ char templ[] = "conftest.mkstemp/coXXXXXX";
+ int (*mkstemp_function) (char *) = mkstemp;
+ int fd = mkstemp_function (templ);
+ if (fd < 0)
+ result |= 1;
+ else
+ {
+ struct stat st;
+ if (lseek (fd, large, SEEK_SET) != large)
+ result |= 2;
+ if (fstat (fd, &st) < 0)
+ result |= 4;
+ else if (st.st_mode & 0077)
+ result |= 8;
+ if (close (fd))
+ result |= 16;
+ }
+ }
+ return result;]])],
+ [gl_cv_func_working_mkstemp=yes],
+ [gl_cv_func_working_mkstemp=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_working_mkstemp="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_mkstemp="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_mkstemp="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_working_mkstemp="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -rf conftest.mkstemp
+ ])
+ case "$gl_cv_func_working_mkstemp" in
+ *yes) ;;
+ *)
+ REPLACE_MKSTEMP=1
+ ;;
+ esac
+ else
+ HAVE_MKSTEMP=0
+ fi
+])
+
+# Prerequisites of lib/mkstemp.c.
+AC_DEFUN([gl_PREREQ_MKSTEMP],
+[
+])
diff --git a/m4/mktime.m4 b/m4/mktime.m4
new file mode 100644
index 0000000..4e7e423
--- /dev/null
+++ b/m4/mktime.m4
@@ -0,0 +1,298 @@
+# serial 35
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 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.
+
+dnl From Jim Meyering.
+
+AC_DEFUN([gl_TIME_T_IS_SIGNED],
+[
+ AC_CACHE_CHECK([whether time_t is signed],
+ [gl_cv_time_t_is_signed],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <time.h>
+ char time_t_signed[(time_t) -1 < 0 ? 1 : -1];]])],
+ [gl_cv_time_t_is_signed=yes],
+ [gl_cv_time_t_is_signed=no])])
+ if test $gl_cv_time_t_is_signed = yes; then
+ AC_DEFINE([TIME_T_IS_SIGNED], [1], [Define to 1 if time_t is signed.])
+ fi
+])
+
+dnl Test whether mktime works. Set gl_cv_func_working_mktime.
+AC_DEFUN([gl_FUNC_MKTIME_WORKS],
+[
+ AC_REQUIRE([gl_TIME_T_IS_SIGNED])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl We don't use AC_FUNC_MKTIME any more, because it is no longer maintained
+ dnl in Autoconf and because it invokes AC_LIBOBJ.
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+ AC_CHECK_DECLS_ONCE([alarm])
+ AC_REQUIRE([gl_MULTIARCH])
+ AC_CACHE_CHECK([for working mktime], [gl_cv_func_working_mktime],
+ [if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple Mac OS X platforms.
+ # The test result would be 'yes' in 32-bit mode and 'no' in 64-bit mode.
+ # But we need a configuration result that is valid in both modes.
+ gl_cv_func_working_mktime="guessing no"
+ else
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE(
+[[/* Test program from Paul Eggert and Tony Leneis. */
+#include <limits.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_DECL_ALARM
+# include <signal.h>
+#endif
+
+]GL_MDA_DEFINES[
+
+#ifndef TIME_T_IS_SIGNED
+# define TIME_T_IS_SIGNED 0
+#endif
+
+static time_t time_t_max;
+static time_t time_t_min;
+
+/* Values we'll use to set the TZ environment variable. */
+static char *tz_strings[] = {
+ (char *) 0, "TZ=GMT0", "TZ=JST-9",
+ "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
+};
+#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
+
+/* Return 0 if mktime fails to convert a date in the spring-forward gap.
+ Based on a problem report from Andreas Jaeger. */
+static int
+spring_forward_gap ()
+{
+ /* glibc (up to about 1998-10-07) failed this test. */
+ struct tm tm;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ tm.tm_year = 98;
+ tm.tm_mon = 3;
+ tm.tm_mday = 5;
+ tm.tm_hour = 2;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ return mktime (&tm) != (time_t) -1;
+}
+
+static int
+mktime_test1 (time_t now)
+{
+ struct tm *lt;
+ return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (time_t now)
+{
+ return (mktime_test1 (now)
+ && mktime_test1 ((time_t) (time_t_max - now))
+ && mktime_test1 ((time_t) (time_t_min + now)));
+}
+
+static int
+irix_6_4_bug ()
+{
+ /* Based on code from Ariel Faigon. */
+ struct tm tm;
+ tm.tm_year = 96;
+ tm.tm_mon = 3;
+ tm.tm_mday = 0;
+ tm.tm_hour = 0;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+ mktime (&tm);
+ return tm.tm_mon == 2 && tm.tm_mday == 31;
+}
+
+static int
+bigtime_test (int j)
+{
+ struct tm tm;
+ time_t now;
+ tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
+ now = mktime (&tm);
+ if (now != (time_t) -1)
+ {
+ struct tm *lt = localtime (&now);
+ if (! (lt
+ && lt->tm_year == tm.tm_year
+ && lt->tm_mon == tm.tm_mon
+ && lt->tm_mday == tm.tm_mday
+ && lt->tm_hour == tm.tm_hour
+ && lt->tm_min == tm.tm_min
+ && lt->tm_sec == tm.tm_sec
+ && lt->tm_yday == tm.tm_yday
+ && lt->tm_wday == tm.tm_wday
+ && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
+ == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
+ return 0;
+ }
+ return 1;
+}
+
+static int
+year_2050_test ()
+{
+ /* The correct answer for 2050-02-01 00:00:00 in Pacific time,
+ ignoring leap seconds. */
+ unsigned long int answer = 2527315200UL;
+
+ struct tm tm;
+ time_t t;
+ tm.tm_year = 2050 - 1900;
+ tm.tm_mon = 2 - 1;
+ tm.tm_mday = 1;
+ tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+ tm.tm_isdst = -1;
+
+ /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+ instead of "TZ=America/Vancouver" in order to detect the bug even
+ on systems that don't support the Olson extension, or don't have the
+ full zoneinfo tables installed. */
+ putenv ("TZ=PST8PDT,M4.1.0,M10.5.0");
+
+ t = mktime (&tm);
+
+ /* Check that the result is either a failure, or close enough
+ to the correct answer that we can assume the discrepancy is
+ due to leap seconds. */
+ return (t == (time_t) -1
+ || (0 < t && answer - 120 <= t && t <= answer + 120));
+}
+
+int
+main ()
+{
+ int result = 0;
+ time_t t, delta;
+ int i, j;
+ int time_t_signed_magnitude = (time_t) ~ (time_t) 0 < (time_t) -1;
+
+#if HAVE_DECL_ALARM
+ /* This test makes some buggy mktime implementations loop.
+ Give up after 60 seconds; a mktime slower than that
+ isn't worth using anyway. */
+ signal (SIGALRM, SIG_DFL);
+ alarm (60);
+#endif
+
+ time_t_max = (! TIME_T_IS_SIGNED
+ ? (time_t) -1
+ : ((((time_t) 1 << (sizeof (time_t) * CHAR_BIT - 2)) - 1)
+ * 2 + 1));
+ time_t_min = (! TIME_T_IS_SIGNED
+ ? (time_t) 0
+ : time_t_signed_magnitude
+ ? ~ (time_t) 0
+ : ~ time_t_max);
+
+ delta = time_t_max / 997; /* a suitable prime number */
+ for (i = 0; i < N_STRINGS; i++)
+ {
+ if (tz_strings[i])
+ putenv (tz_strings[i]);
+
+ for (t = 0; t <= time_t_max - delta && (result & 1) == 0; t += delta)
+ if (! mktime_test (t))
+ result |= 1;
+ if ((result & 2) == 0
+ && ! (mktime_test ((time_t) 1)
+ && mktime_test ((time_t) (60 * 60))
+ && mktime_test ((time_t) (60 * 60 * 24))))
+ result |= 2;
+
+ for (j = 1; (result & 4) == 0; j <<= 1)
+ {
+ if (! bigtime_test (j))
+ result |= 4;
+ if (INT_MAX / 2 < j)
+ break;
+ }
+ if ((result & 8) == 0 && ! bigtime_test (INT_MAX))
+ result |= 8;
+ }
+ if (! irix_6_4_bug ())
+ result |= 16;
+ if (! spring_forward_gap ())
+ result |= 32;
+ if (! year_2050_test ())
+ result |= 64;
+ return result;
+}]])],
+ [gl_cv_func_working_mktime=yes],
+ [gl_cv_func_working_mktime=no],
+ [case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_mktime="guessing no" ;;
+ *) gl_cv_func_working_mktime="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ fi
+ ])
+])
+
+dnl Main macro of module 'mktime'.
+AC_DEFUN([gl_FUNC_MKTIME],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_FUNC_MKTIME_WORKS])
+
+ REPLACE_MKTIME=0
+ if test "$gl_cv_func_working_mktime" != yes; then
+ REPLACE_MKTIME=1
+ AC_DEFINE([NEED_MKTIME_WORKING], [1],
+ [Define if the compilation of mktime.c should define 'mktime'
+ with the algorithmic workarounds.])
+ fi
+ case "$host_os" in
+ mingw*)
+ REPLACE_MKTIME=1
+ AC_DEFINE([NEED_MKTIME_WINDOWS], [1],
+ [Define if the compilation of mktime.c should define 'mktime'
+ with the native Windows TZ workaround.])
+ ;;
+ esac
+])
+
+dnl Main macro of module 'mktime-internal'.
+AC_DEFUN([gl_FUNC_MKTIME_INTERNAL], [
+ AC_REQUIRE([gl_FUNC_MKTIME_WORKS])
+
+ WANT_MKTIME_INTERNAL=0
+ dnl BeOS has __mktime_internal in libc, but other platforms don't.
+ AC_CHECK_FUNC([__mktime_internal],
+ [AC_DEFINE([mktime_internal], [__mktime_internal],
+ [Define to the real name of the mktime_internal function.])
+ ],
+ [dnl mktime works but it doesn't export __mktime_internal,
+ dnl so we need to substitute our own mktime implementation.
+ WANT_MKTIME_INTERNAL=1
+ AC_DEFINE([NEED_MKTIME_INTERNAL], [1],
+ [Define if the compilation of mktime.c should define 'mktime_internal'.])
+ ])
+])
+
+# Prerequisites of lib/mktime.c.
+AC_DEFUN([gl_PREREQ_MKTIME], [:])
diff --git a/m4/mmap-anon.m4 b/m4/mmap-anon.m4
new file mode 100644
index 0000000..2995ad5
--- /dev/null
+++ b/m4/mmap-anon.m4
@@ -0,0 +1,55 @@
+# mmap-anon.m4 serial 11
+dnl Copyright (C) 2005, 2007, 2009-2020 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.
+
+# Detect how mmap can be used to create anonymous (not file-backed) memory
+# mappings.
+# - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
+# and MAP_ANON exist and have the same value.
+# - On HP-UX, only MAP_ANONYMOUS exists.
+# - On Mac OS X, FreeBSD, NetBSD, OpenBSD, Minix, only MAP_ANON exists.
+# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
+# used.
+
+AC_DEFUN([gl_FUNC_MMAP_ANON],
+[
+ dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ # Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
+ # fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
+ # irrelevant for anonymous mappings.
+ AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no])
+
+ # Try to allow MAP_ANONYMOUS.
+ gl_have_mmap_anonymous=no
+ if test $gl_have_mmap = yes; then
+ AC_MSG_CHECKING([for MAP_ANONYMOUS])
+ AC_EGREP_CPP([I cannot identify this map], [
+#include <sys/mman.h>
+#ifdef MAP_ANONYMOUS
+ I cannot identify this map
+#endif
+],
+ [gl_have_mmap_anonymous=yes])
+ if test $gl_have_mmap_anonymous != yes; then
+ AC_EGREP_CPP([I cannot identify this map], [
+#include <sys/mman.h>
+#ifdef MAP_ANON
+ I cannot identify this map
+#endif
+],
+ [AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON],
+ [Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.])
+ gl_have_mmap_anonymous=yes])
+ fi
+ AC_MSG_RESULT([$gl_have_mmap_anonymous])
+ if test $gl_have_mmap_anonymous = yes; then
+ AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
+ [Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
+ config.h and <sys/mman.h>.])
+ fi
+ fi
+])
diff --git a/m4/mode_t.m4 b/m4/mode_t.m4
new file mode 100644
index 0000000..f190951
--- /dev/null
+++ b/m4/mode_t.m4
@@ -0,0 +1,26 @@
+# mode_t.m4 serial 2
+dnl Copyright (C) 2009-2020 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.
+
+# For using mode_t, it's sufficient to use AC_TYPE_MODE_T and
+# include <sys/types.h>.
+
+# Define PROMOTED_MODE_T to the type that is the result of "default argument
+# promotion" (ISO C 6.5.2.2.(6)) of the type mode_t.
+AC_DEFUN([gl_PROMOTED_TYPE_MODE_T],
+[
+ AC_REQUIRE([AC_TYPE_MODE_T])
+ AC_CACHE_CHECK([for promoted mode_t type], [gl_cv_promoted_mode_t], [
+ dnl Assume mode_t promotes to 'int' if and only if it is smaller than 'int',
+ dnl and to itself otherwise. This assumption is not guaranteed by the ISO C
+ dnl standard, but we don't know of any real-world counterexamples.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>]],
+ [[typedef int array[2 * (sizeof (mode_t) < sizeof (int)) - 1];]])],
+ [gl_cv_promoted_mode_t='int'],
+ [gl_cv_promoted_mode_t='mode_t'])
+ ])
+ AC_DEFINE_UNQUOTED([PROMOTED_MODE_T], [$gl_cv_promoted_mode_t],
+ [Define to the type that is the result of default argument promotions of type mode_t.])
+])
diff --git a/m4/msvc-inval.m4 b/m4/msvc-inval.m4
new file mode 100644
index 0000000..dcf398d
--- /dev/null
+++ b/m4/msvc-inval.m4
@@ -0,0 +1,19 @@
+# msvc-inval.m4 serial 1
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_MSVC_INVAL],
+[
+ AC_CHECK_FUNCS_ONCE([_set_invalid_parameter_handler])
+ if test $ac_cv_func__set_invalid_parameter_handler = yes; then
+ HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
+ AC_DEFINE([HAVE_MSVC_INVALID_PARAMETER_HANDLER], [1],
+ [Define to 1 on MSVC platforms that have the "invalid parameter handler"
+ concept.])
+ else
+ HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
+ fi
+ AC_SUBST([HAVE_MSVC_INVALID_PARAMETER_HANDLER])
+])
diff --git a/m4/msvc-nothrow.m4 b/m4/msvc-nothrow.m4
new file mode 100644
index 0000000..13198d8
--- /dev/null
+++ b/m4/msvc-nothrow.m4
@@ -0,0 +1,10 @@
+# msvc-nothrow.m4 serial 1
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_MSVC_NOTHROW],
+[
+ AC_REQUIRE([gl_MSVC_INVAL])
+])
diff --git a/m4/multiarch.m4 b/m4/multiarch.m4
new file mode 100644
index 0000000..2c61afb
--- /dev/null
+++ b/m4/multiarch.m4
@@ -0,0 +1,65 @@
+# multiarch.m4 serial 9
+dnl Copyright (C) 2008-2020 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.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On Mac OS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor. Like
+# this:
+#
+# ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+# CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN_ONCE([gl_MULTIARCH],
+[
+ dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+ AC_CACHE_CHECK([whether the compiler produces multi-arch binaries],
+ [gl_cv_c_multiarch],
+ [gl_cv_c_multiarch=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#ifndef __APPLE_CC__
+ not a universal capable compiler
+ #endif
+ typedef int dummy;
+ ]])],
+ [
+ dnl Check for potential -arch flags. It is not universal unless
+ dnl there are at least two -arch flags with different values.
+ arch=
+ prev=
+ for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+ if test -n "$prev"; then
+ case $word in
+ i?86 | x86_64 | ppc | ppc64 | arm | arm64)
+ if test -z "$arch" || test "$arch" = "$word"; then
+ arch="$word"
+ else
+ gl_cv_c_multiarch=yes
+ fi
+ ;;
+ esac
+ prev=
+ else
+ if test "x$word" = "x-arch"; then
+ prev=arch
+ fi
+ fi
+ done
+ ])
+ ])
+ if test $gl_cv_c_multiarch = yes; then
+ APPLE_UNIVERSAL_BUILD=1
+ else
+ APPLE_UNIVERSAL_BUILD=0
+ fi
+ AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/m4/nanosleep.m4 b/m4/nanosleep.m4
new file mode 100644
index 0000000..1fb13ed
--- /dev/null
+++ b/m4/nanosleep.m4
@@ -0,0 +1,161 @@
+# serial 39
+
+dnl From Jim Meyering.
+dnl Check for the nanosleep function.
+dnl If not found, use the supplied replacement.
+dnl
+
+# Copyright (C) 1999-2001, 2003-2020 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.
+
+AC_DEFUN([gl_FUNC_NANOSLEEP],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc and Solaris <time.h> to declare nanosleep.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_REQUIRE([gl_FUNC_SELECT])
+
+ AC_CHECK_DECLS_ONCE([alarm])
+
+ nanosleep_save_libs=$LIBS
+
+ # Solaris 2.5.1 needs -lposix4 to get the nanosleep function.
+ # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+ LIB_NANOSLEEP=
+ AC_SUBST([LIB_NANOSLEEP])
+ AC_SEARCH_LIBS([nanosleep], [rt posix4],
+ [test "$ac_cv_search_nanosleep" = "none required" ||
+ LIB_NANOSLEEP=$ac_cv_search_nanosleep])
+ if test "x$ac_cv_search_nanosleep" != xno; then
+ dnl The system has a nanosleep function.
+
+ AC_REQUIRE([gl_MULTIARCH])
+ if test $APPLE_UNIVERSAL_BUILD = 1; then
+ # A universal build on Apple Mac OS X platforms.
+ # The test result would be 'no (mishandles large arguments)' in 64-bit
+ # mode but 'yes' in 32-bit mode. But we need a configuration result that
+ # is valid in both modes.
+ gl_cv_func_nanosleep='no (mishandles large arguments)'
+ fi
+
+ AC_CACHE_CHECK([for working nanosleep],
+ [gl_cv_func_nanosleep],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <errno.h>
+ #include <limits.h>
+ #include <signal.h>
+ #if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #include <unistd.h>
+ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+ #define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+
+ #if HAVE_DECL_ALARM
+ static void
+ check_for_SIGALRM (int sig)
+ {
+ if (sig != SIGALRM)
+ _exit (1);
+ }
+ #endif
+
+ int
+ main ()
+ {
+ static struct timespec ts_sleep;
+ static struct timespec ts_remaining;
+ /* Test for major problems first. */
+ if (! nanosleep)
+ return 2;
+ ts_sleep.tv_sec = 0;
+ ts_sleep.tv_nsec = 1;
+ #if HAVE_DECL_ALARM
+ {
+ static struct sigaction act;
+ act.sa_handler = check_for_SIGALRM;
+ sigemptyset (&act.sa_mask);
+ sigaction (SIGALRM, &act, NULL);
+ alarm (1);
+ if (nanosleep (&ts_sleep, NULL) != 0)
+ return 3;
+ /* Test for a minor problem: the handling of large arguments. */
+ ts_sleep.tv_sec = TYPE_MAXIMUM (time_t);
+ ts_sleep.tv_nsec = 999999999;
+ alarm (1);
+ if (nanosleep (&ts_sleep, &ts_remaining) != -1)
+ return 4;
+ if (errno != EINTR)
+ return 5;
+ if (ts_remaining.tv_sec <= TYPE_MAXIMUM (time_t) - 10)
+ return 6;
+ }
+ #else /* A simpler test for native Windows. */
+ if (nanosleep (&ts_sleep, &ts_remaining) < 0)
+ return 3;
+ #endif
+ return 0;
+ }]])],
+ [gl_cv_func_nanosleep=yes],
+ [case $? in dnl (
+ 4|5|6) gl_cv_func_nanosleep='no (mishandles large arguments)';; dnl (
+ *) gl_cv_func_nanosleep=no;;
+ esac],
+ [case "$host_os" in dnl ((
+ linux*) # Guess it halfway works when the kernel is Linux.
+ gl_cv_func_nanosleep='guessing no (mishandles large arguments)' ;;
+ mingw*) # Guess no on native Windows.
+ gl_cv_func_nanosleep='guessing no' ;;
+ *) # If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_nanosleep="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_nanosleep" in
+ *yes)
+ REPLACE_NANOSLEEP=0
+ ;;
+ *)
+ REPLACE_NANOSLEEP=1
+ case "$gl_cv_func_nanosleep" in
+ *"mishandles large arguments"*)
+ AC_DEFINE([HAVE_BUG_BIG_NANOSLEEP], [1],
+ [Define to 1 if nanosleep mishandles large arguments.])
+ ;;
+ *)
+ # The replacement uses select(). Add $LIBSOCKET to $LIB_NANOSLEEP.
+ for ac_lib in $LIBSOCKET; do
+ case " $LIB_NANOSLEEP " in
+ *" $ac_lib "*) ;;
+ *) LIB_NANOSLEEP="$LIB_NANOSLEEP $ac_lib";;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ esac
+ else
+ HAVE_NANOSLEEP=0
+ fi
+ LIBS=$nanosleep_save_libs
+])
+
+# Prerequisites of lib/nanosleep.c.
+AC_DEFUN([gl_PREREQ_NANOSLEEP],
+[
+ AC_CHECK_HEADERS_ONCE([sys/select.h])
+ gl_PREREQ_SIG_HANDLER_H
+])
diff --git a/m4/netdb_h.m4 b/m4/netdb_h.m4
new file mode 100644
index 0000000..143a2c8
--- /dev/null
+++ b/m4/netdb_h.m4
@@ -0,0 +1,44 @@
+# netdb_h.m4 serial 12
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_HEADER_NETDB],
+[
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ gl_CHECK_NEXT_HEADERS([netdb.h])
+ if test $ac_cv_header_netdb_h = yes; then
+ HAVE_NETDB_H=1
+ else
+ HAVE_NETDB_H=0
+ fi
+ AC_SUBST([HAVE_NETDB_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <netdb.h>]],
+ [getaddrinfo freeaddrinfo gai_strerror getnameinfo])
+])
+
+AC_DEFUN([gl_NETDB_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_NETDB_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_NETDB_H_DEFAULTS],
+[
+ GNULIB_GETADDRINFO=0; AC_SUBST([GNULIB_GETADDRINFO])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_STRUCT_ADDRINFO=1; AC_SUBST([HAVE_STRUCT_ADDRINFO])
+ HAVE_DECL_FREEADDRINFO=1; AC_SUBST([HAVE_DECL_FREEADDRINFO])
+ HAVE_DECL_GAI_STRERROR=1; AC_SUBST([HAVE_DECL_GAI_STRERROR])
+ HAVE_DECL_GETADDRINFO=1; AC_SUBST([HAVE_DECL_GETADDRINFO])
+ HAVE_DECL_GETNAMEINFO=1; AC_SUBST([HAVE_DECL_GETNAMEINFO])
+ REPLACE_GAI_STRERROR=0; AC_SUBST([REPLACE_GAI_STRERROR])
+ REPLACE_GETADDRINFO=0; AC_SUBST([REPLACE_GETADDRINFO])
+])
diff --git a/m4/netinet_in_h.m4 b/m4/netinet_in_h.m4
new file mode 100644
index 0000000..df9f383
--- /dev/null
+++ b/m4/netinet_in_h.m4
@@ -0,0 +1,31 @@
+# netinet_in_h.m4 serial 5
+dnl Copyright (C) 2006-2020 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.
+
+AC_DEFUN([gl_HEADER_NETINET_IN],
+[
+ AC_CACHE_CHECK([whether <netinet/in.h> is self-contained],
+ [gl_cv_header_netinet_in_h_selfcontained],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netinet/in.h>]], [[]])],
+ [gl_cv_header_netinet_in_h_selfcontained=yes],
+ [gl_cv_header_netinet_in_h_selfcontained=no])
+ ])
+ if test $gl_cv_header_netinet_in_h_selfcontained = yes; then
+ NETINET_IN_H=''
+ else
+ NETINET_IN_H='netinet/in.h'
+ AC_CHECK_HEADERS([netinet/in.h])
+ gl_CHECK_NEXT_HEADERS([netinet/in.h])
+ if test $ac_cv_header_netinet_in_h = yes; then
+ HAVE_NETINET_IN_H=1
+ else
+ HAVE_NETINET_IN_H=0
+ fi
+ AC_SUBST([HAVE_NETINET_IN_H])
+ fi
+ AC_SUBST([NETINET_IN_H])
+ AM_CONDITIONAL([GL_GENERATE_NETINET_IN_H], [test -n "$NETINET_IN_H"])
+])
diff --git a/m4/nl_langinfo.m4 b/m4/nl_langinfo.m4
new file mode 100644
index 0000000..342afd2
--- /dev/null
+++ b/m4/nl_langinfo.m4
@@ -0,0 +1,77 @@
+# nl_langinfo.m4 serial 8
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_NL_LANGINFO],
+[
+ AC_REQUIRE([gl_LANGINFO_H_DEFAULTS])
+ AC_REQUIRE([gl_LANGINFO_H])
+ AC_CHECK_FUNCS_ONCE([nl_langinfo])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_FUNC_SETLOCALE_NULL])
+ AC_REQUIRE([gl_PTHREADLIB])
+ AC_CHECK_HEADERS_ONCE([threads.h])
+ if test $ac_cv_func_nl_langinfo = yes; then
+ # On Irix 6.5, YESEXPR is defined, but nl_langinfo(YESEXPR) is broken.
+ AC_CACHE_CHECK([whether YESEXPR works],
+ [gl_cv_func_nl_langinfo_yesexpr_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[#include <langinfo.h>
+]], [[return !*nl_langinfo(YESEXPR);
+]])],
+ [gl_cv_func_nl_langinfo_yesexpr_works=yes],
+ [gl_cv_func_nl_langinfo_yesexpr_works=no],
+ [
+ case "$host_os" in
+ # Guess no on irix systems.
+ irix*) gl_cv_func_nl_langinfo_yesexpr_works="guessing no";;
+ # Guess yes elsewhere.
+ *) gl_cv_func_nl_langinfo_yesexpr_works="guessing yes";;
+ esac
+ ])
+ ])
+ case $gl_cv_func_nl_langinfo_yesexpr_works in
+ *yes) FUNC_NL_LANGINFO_YESEXPR_WORKS=1 ;;
+ *) FUNC_NL_LANGINFO_YESEXPR_WORKS=0 ;;
+ esac
+ AC_DEFINE_UNQUOTED([FUNC_NL_LANGINFO_YESEXPR_WORKS],
+ [$FUNC_NL_LANGINFO_YESEXPR_WORKS],
+ [Define to 1 if nl_langinfo (YESEXPR) returns a non-empty string.])
+ # On Solaris 10 and Solaris 11.3, nl_langinfo is not multithread-safe.
+ case "$host_os" in
+ solaris*) NL_LANGINFO_MTSAFE=0 ;;
+ *) NL_LANGINFO_MTSAFE=1 ;;
+ esac
+ AC_DEFINE_UNQUOTED([NL_LANGINFO_MTSAFE], [$NL_LANGINFO_MTSAFE],
+ [Define to 1 if nl_langinfo is multithread-safe.])
+ if test $HAVE_LANGINFO_CODESET = 1 \
+ && test $HAVE_LANGINFO_T_FMT_AMPM = 1 \
+ && test $HAVE_LANGINFO_ALTMON = 1 \
+ && test $HAVE_LANGINFO_ERA = 1 \
+ && test $FUNC_NL_LANGINFO_YESEXPR_WORKS = 1 \
+ && test $NL_LANGINFO_MTSAFE = 1; then
+ :
+ else
+ REPLACE_NL_LANGINFO=1
+ AC_DEFINE([REPLACE_NL_LANGINFO], [1],
+ [Define if nl_langinfo exists but is overridden by gnulib.])
+ fi
+ else
+ HAVE_NL_LANGINFO=0
+ fi
+ if test $HAVE_NL_LANGINFO = 0 || test $HAVE_LANGINFO_CODESET = 0; then
+ LIB_NL_LANGINFO="$LIB_SETLOCALE_NULL"
+ else
+ LIB_NL_LANGINFO=
+ fi
+ dnl LIB_NL_LANGINFO is expected to be empty everywhere.
+ AC_SUBST([LIB_NL_LANGINFO])
+])
+
+# Prerequisites of lib/nl_langinfo-lock.c.
+AC_DEFUN([gl_PREREQ_NL_LANGINFO_LOCK],
+[
+ gl_VISIBILITY
+])
diff --git a/m4/nls.m4 b/m4/nls.m4
new file mode 100644
index 0000000..53cdc8b
--- /dev/null
+++ b/m4/nls.m4
@@ -0,0 +1,32 @@
+# 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.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl 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-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled 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])
+])
diff --git a/m4/nocrash.m4 b/m4/nocrash.m4
new file mode 100644
index 0000000..637a0ea
--- /dev/null
+++ b/m4/nocrash.m4
@@ -0,0 +1,131 @@
+# nocrash.m4 serial 5
+dnl Copyright (C) 2005, 2009-2020 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 Based on libsigsegv, from Bruno Haible and Paolo Bonzini.
+
+AC_PREREQ([2.13])
+
+dnl Expands to some code for use in .c programs that will cause the configure
+dnl test to exit instead of crashing. This is useful to avoid triggering
+dnl action from a background debugger and to avoid core dumps.
+dnl Usage: ...
+dnl ]GL_NOCRASH[
+dnl ...
+dnl int main() { nocrash_init(); ... }
+AC_DEFUN([GL_NOCRASH],[[
+#include <stdlib.h>
+#if defined __MACH__ && defined __APPLE__
+/* Avoid a crash on Mac OS X. */
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <mach/thread_status.h>
+#include <mach/exception.h>
+#include <mach/task.h>
+#include <pthread.h>
+/* The exception port on which our thread listens. */
+static mach_port_t our_exception_port;
+/* The main function of the thread listening for exceptions of type
+ EXC_BAD_ACCESS. */
+static void *
+mach_exception_thread (void *arg)
+{
+ /* Buffer for a message to be received. */
+ struct {
+ mach_msg_header_t head;
+ mach_msg_body_t msgh_body;
+ char data[1024];
+ } msg;
+ mach_msg_return_t retval;
+ /* Wait for a message on the exception port. */
+ retval = mach_msg (&msg.head, MACH_RCV_MSG | MACH_RCV_LARGE, 0, sizeof (msg),
+ our_exception_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
+ if (retval != MACH_MSG_SUCCESS)
+ abort ();
+ exit (1);
+}
+static void
+nocrash_init (void)
+{
+ mach_port_t self = mach_task_self ();
+ /* Allocate a port on which the thread shall listen for exceptions. */
+ if (mach_port_allocate (self, MACH_PORT_RIGHT_RECEIVE, &our_exception_port)
+ == KERN_SUCCESS) {
+ /* See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/mach_port_insert_right.html. */
+ if (mach_port_insert_right (self, our_exception_port, our_exception_port,
+ MACH_MSG_TYPE_MAKE_SEND)
+ == KERN_SUCCESS) {
+ /* The exceptions we want to catch. Only EXC_BAD_ACCESS is interesting
+ for us. */
+ exception_mask_t mask = EXC_MASK_BAD_ACCESS;
+ /* Create the thread listening on the exception port. */
+ pthread_attr_t attr;
+ pthread_t thread;
+ if (pthread_attr_init (&attr) == 0
+ && pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED) == 0
+ && pthread_create (&thread, &attr, mach_exception_thread, NULL) == 0) {
+ pthread_attr_destroy (&attr);
+ /* Replace the exception port info for these exceptions with our own.
+ Note that we replace the exception port for the entire task, not only
+ for a particular thread. This has the effect that when our exception
+ port gets the message, the thread specific exception port has already
+ been asked, and we don't need to bother about it.
+ See https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_set_exception_ports.html. */
+ task_set_exception_ports (self, mask, our_exception_port,
+ EXCEPTION_DEFAULT, MACHINE_THREAD_STATE);
+ }
+ }
+ }
+}
+#elif defined _WIN32 && ! defined __CYGWIN__
+/* Avoid a crash on native Windows. */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <winerror.h>
+static LONG WINAPI
+exception_filter (EXCEPTION_POINTERS *ExceptionInfo)
+{
+ switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
+ {
+ case EXCEPTION_ACCESS_VIOLATION:
+ case EXCEPTION_IN_PAGE_ERROR:
+ case EXCEPTION_STACK_OVERFLOW:
+ case EXCEPTION_GUARD_PAGE:
+ case EXCEPTION_PRIV_INSTRUCTION:
+ case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_DATATYPE_MISALIGNMENT:
+ case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
+ case EXCEPTION_NONCONTINUABLE_EXCEPTION:
+ exit (1);
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+}
+static void
+nocrash_init (void)
+{
+ SetUnhandledExceptionFilter ((LPTOP_LEVEL_EXCEPTION_FILTER) exception_filter);
+}
+#else
+/* Avoid a crash on POSIX systems. */
+#include <signal.h>
+#include <unistd.h>
+/* A POSIX signal handler. */
+static void
+exception_handler (int sig)
+{
+ _exit (1);
+}
+static void
+nocrash_init (void)
+{
+#ifdef SIGSEGV
+ signal (SIGSEGV, exception_handler);
+#endif
+#ifdef SIGBUS
+ signal (SIGBUS, exception_handler);
+#endif
+}
+#endif
+]])
diff --git a/m4/off_t.m4 b/m4/off_t.m4
new file mode 100644
index 0000000..6e19af8
--- /dev/null
+++ b/m4/off_t.m4
@@ -0,0 +1,18 @@
+# off_t.m4 serial 1
+dnl Copyright (C) 2012-2020 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 Check whether to override the 'off_t' type.
+dnl Set WINDOWS_64_BIT_OFF_T.
+
+AC_DEFUN([gl_TYPE_OFF_T],
+[
+ m4_ifdef([gl_LARGEFILE], [
+ AC_REQUIRE([gl_LARGEFILE])
+ ], [
+ WINDOWS_64_BIT_OFF_T=0
+ ])
+ AC_SUBST([WINDOWS_64_BIT_OFF_T])
+])
diff --git a/m4/open-cloexec.m4 b/m4/open-cloexec.m4
new file mode 100644
index 0000000..11652d5
--- /dev/null
+++ b/m4/open-cloexec.m4
@@ -0,0 +1,21 @@
+# Test whether O_CLOEXEC is defined.
+
+dnl Copyright 2017-2020 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.
+
+AC_DEFUN([gl_PREPROC_O_CLOEXEC],
+[
+ AC_CACHE_CHECK([for O_CLOEXEC],
+ [gl_cv_macro_O_CLOEXEC],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <fcntl.h>
+ #ifndef O_CLOEXEC
+ choke me;
+ #endif
+ ]],
+ [[return O_CLOEXEC;]])],
+ [gl_cv_macro_O_CLOEXEC=yes],
+ [gl_cv_macro_O_CLOEXEC=no])])
+])
diff --git a/m4/open-slash.m4 b/m4/open-slash.m4
new file mode 100644
index 0000000..5d84f2b
--- /dev/null
+++ b/m4/open-slash.m4
@@ -0,0 +1,60 @@
+# open-slash.m4 serial 2
+dnl Copyright (C) 2007-2020 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 Tests whether open() and creat() recognize a trailing slash.
+dnl Sets gl_cv_func_open_slash.
+AC_DEFUN([gl_OPEN_TRAILING_SLASH_BUG],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl open("foo/") should not create a file when the file name has a
+ dnl trailing slash. FreeBSD only has the problem on symlinks.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ AC_CACHE_CHECK([whether open recognizes a trailing slash],
+ [gl_cv_func_open_slash],
+ [# Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ touch conftest.tmp
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <fcntl.h>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+]GL_MDA_DEFINES[
+int main ()
+{
+ int result = 0;
+#if HAVE_LSTAT
+ if (open ("conftest.lnk/", O_RDONLY) != -1)
+ result |= 1;
+#endif
+ if (open ("conftest.sl/", O_CREAT, 0600) >= 0)
+ result |= 2;
+ return result;
+}]])],
+ [gl_cv_func_open_slash=yes],
+ [gl_cv_func_open_slash=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ freebsd* | aix* | hpux* | solaris2.[0-9] | solaris2.[0-9].*)
+ gl_cv_func_open_slash="guessing no" ;;
+ *)
+ gl_cv_func_open_slash="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ rm -f conftest.sl conftest.tmp conftest.lnk
+ ])
+ case "$gl_cv_func_open_slash" in
+ *no)
+ AC_DEFINE([OPEN_TRAILING_SLASH_BUG], [1],
+ [Define to 1 if open() fails to recognize a trailing slash.])
+ ;;
+ esac
+])
diff --git a/m4/open.m4 b/m4/open.m4
new file mode 100644
index 0000000..552eedf
--- /dev/null
+++ b/m4/open.m4
@@ -0,0 +1,56 @@
+# open.m4 serial 15
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_OPEN],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_PREPROC_O_CLOEXEC])
+ case "$host_os" in
+ mingw* | pw*)
+ REPLACE_OPEN=1
+ ;;
+ *)
+ dnl open("foo/") should not create a file when the file name has a
+ dnl trailing slash. FreeBSD only has the problem on symlinks.
+ AC_CHECK_FUNCS_ONCE([lstat])
+ if test "$gl_cv_macro_O_CLOEXEC" != yes; then
+ REPLACE_OPEN=1
+ fi
+ gl_OPEN_TRAILING_SLASH_BUG
+ case "$gl_cv_func_open_slash" in
+ *no)
+ REPLACE_OPEN=1
+ ;;
+ esac
+ ;;
+ esac
+ dnl Replace open() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ if test $REPLACE_OPEN = 0; then
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ REPLACE_OPEN=1
+ fi
+ fi
+ ])
+ dnl Replace open() for supporting the gnulib-defined O_NONBLOCK flag.
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ if test $REPLACE_OPEN = 0; then
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_open_O_NONBLOCK != yes; then
+ REPLACE_OPEN=1
+ fi
+ fi
+ ])
+])
+
+# Prerequisites of lib/open.c.
+AC_DEFUN([gl_PREREQ_OPEN],
+[
+ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+ :
+])
diff --git a/m4/openat.m4 b/m4/openat.m4
new file mode 100644
index 0000000..cf9f717
--- /dev/null
+++ b/m4/openat.m4
@@ -0,0 +1,38 @@
+# serial 46
+# See if we need to use our replacement for Solaris' openat et al functions.
+
+dnl Copyright (C) 2004-2020 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.
+
+# Written by Jim Meyering.
+
+AC_DEFUN([gl_FUNC_OPENAT],
+[
+ AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_FUNCS_ONCE([openat])
+ AC_REQUIRE([gl_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK])
+ AC_REQUIRE([gl_PREPROC_O_CLOEXEC])
+ case $ac_cv_func_openat+$gl_cv_func_lstat_dereferences_slashed_symlink+$gl_cv_macro_O_CLOEXEC in
+ yes+*yes+yes)
+ ;;
+ yes+*)
+ # Solaris 10 lacks O_CLOEXEC.
+ # Solaris 9 has *at functions, but uniformly mishandles trailing
+ # slash in all of them.
+ REPLACE_OPENAT=1
+ ;;
+ *)
+ HAVE_OPENAT=0
+ ;;
+ esac
+])
+
+# Prerequisites of lib/openat.c.
+AC_DEFUN([gl_PREREQ_OPENAT],
+[
+ AC_REQUIRE([gl_PROMOTED_TYPE_MODE_T])
+ :
+])
diff --git a/m4/opendir.m4 b/m4/opendir.m4
new file mode 100644
index 0000000..fd3c1ec
--- /dev/null
+++ b/m4/opendir.m4
@@ -0,0 +1,32 @@
+# opendir.m4 serial 5
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_OPENDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_CHECK_FUNCS([opendir])
+ if test $ac_cv_func_opendir = no; then
+ HAVE_OPENDIR=0
+ fi
+ dnl Replace opendir() for supporting the gnulib-defined fchdir() function,
+ dnl to keep fchdir's bookkeeping up-to-date.
+ m4_ifdef([gl_FUNC_FCHDIR], [
+ gl_TEST_FCHDIR
+ if test $HAVE_FCHDIR = 0; then
+ if test $HAVE_OPENDIR = 1; then
+ REPLACE_OPENDIR=1
+ fi
+ fi
+ ])
+ dnl Replace opendir() on OS/2 kLIBC to support dirfd() function replaced
+ dnl by gnulib.
+ case $host_os,$HAVE_OPENDIR in
+ os2*,1)
+ REPLACE_OPENDIR=1;;
+ esac
+])
diff --git a/m4/pathmax.m4 b/m4/pathmax.m4
new file mode 100644
index 0000000..bb4fdeb
--- /dev/null
+++ b/m4/pathmax.m4
@@ -0,0 +1,42 @@
+# pathmax.m4 serial 11
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 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.
+
+AC_DEFUN([gl_PATHMAX],
+[
+ dnl Prerequisites of lib/pathmax.h.
+ AC_CHECK_HEADERS_ONCE([sys/param.h])
+])
+
+# Expands to a piece of C program that defines PATH_MAX in the same way as
+# "pathmax.h" will do.
+AC_DEFUN([gl_PATHMAX_SNIPPET], [[
+/* Arrange to define PATH_MAX, like "pathmax.h" does. */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <limits.h>
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+#ifdef __hpux
+# undef PATH_MAX
+# define PATH_MAX 1024
+#endif
+#if defined _WIN32 && ! defined __CYGWIN__
+# undef PATH_MAX
+# define PATH_MAX 260
+#endif
+]])
+
+# Prerequisites of gl_PATHMAX_SNIPPET.
+AC_DEFUN([gl_PATHMAX_SNIPPET_PREREQ],
+[
+ AC_CHECK_HEADERS_ONCE([unistd.h sys/param.h])
+])
diff --git a/m4/pipe.m4 b/m4/pipe.m4
new file mode 100644
index 0000000..6b1fa2f
--- /dev/null
+++ b/m4/pipe.m4
@@ -0,0 +1,15 @@
+# pipe.m4 serial 2
+dnl Copyright (C) 2010-2020 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.
+
+AC_DEFUN([gl_FUNC_PIPE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ AC_CHECK_FUNCS_ONCE([pipe])
+ if test $ac_cv_func_pipe != yes; then
+ HAVE_PIPE=0
+ fi
+])
diff --git a/m4/pipe2.m4 b/m4/pipe2.m4
new file mode 100644
index 0000000..d36821e
--- /dev/null
+++ b/m4/pipe2.m4
@@ -0,0 +1,18 @@
+# pipe2.m4 serial 2
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_PIPE2],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ dnl Persuade glibc <unistd.h> to declare pipe2().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_FUNCS_ONCE([pipe2])
+ if test $ac_cv_func_pipe2 != yes; then
+ HAVE_PIPE2=0
+ fi
+])
diff --git a/m4/po.m4 b/m4/po.m4
new file mode 100644
index 0000000..84659ea
--- /dev/null
+++ b/m4/po.m4
@@ -0,0 +1,453 @@
+# 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.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl 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-2003.
+
+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([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.19])
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$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])
+
+ dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+ case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+ *) MSGFMT_015=$MSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+ case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+ *) GMSGFMT_015=$GMSGFMT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([GMSGFMT_015])
+
+ dnl Search for GNU xgettext 0.12 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+ case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+ *) XGETTEXT_015=$XGETTEXT ;;
+ esac
+changequote([,])dnl
+ AC_SUBST([XGETTEXT_015])
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+ dnl Installation directories.
+ dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+ dnl have to define it here, so that it can be used in po/Makefile.
+ test -n "$localedir" || localedir='${datadir}/locale'
+ AC_SUBST([localedir])
+
+ dnl Support for AM_XGETTEXT_OPTION.
+ test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+ AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+ AC_CONFIG_COMMANDS([po-directories], [[
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ 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_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.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ # Treat a directory as a PO directory if and only if it has a
+ # POTFILES.in file. This allows packages to have multiple PO
+ # directories under different names or in different locations.
+ 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"
+ 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
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ 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 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 assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+ fi
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done]],
+ [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+ # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+ # from automake < 1.5.
+ eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+ # When this code is run, in config.status, two variables have already been
+ # set:
+ # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+ # - LINGUAS is the value of the environment variable LINGUAS at configure
+ # time.
+
+changequote(,)dnl
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|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.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ # Find a way to echo strings without interpreting backslash.
+ if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='echo'
+ else
+ if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+ gt_echo='printf %s\n'
+ else
+ echo_func () {
+ cat <<EOT
+$*
+EOT
+ }
+ gt_echo='echo_func'
+ fi
+ 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
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+ # Seen the first line of the variable definition.
+ s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+ ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+ # Set POTFILES to the value of the Makefile variable POTFILES.
+ sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+ POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+ # Compute POTFILES_DEPS as
+ # $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+ POTFILES_DEPS=
+ for file in $POTFILES; do
+ POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+ done
+ POMAKEFILEDEPS=""
+
+ if test -n "$OBSOLETE_ALL_LINGUAS"; then
+ 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
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+ else
+ # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+ 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 assignment from automake < 1.5.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ # Compute POFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+ # Compute UPDATEPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+ # Compute DUMMYPOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+ # Compute GMOFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+ # Compute PROPERTIESFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+ # Compute CLASSFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+ # Compute QMFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+ # Compute MSGFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+ # Compute RESOURCESDLLFILES
+ # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ GMOFILES=
+ PROPERTIESFILES=
+ CLASSFILES=
+ QMFILES=
+ MSGFILES=
+ RESOURCESDLLFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+ CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+ QMFILES="$QMFILES $srcdirpre$lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+ 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/'`
+ RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ JAVACATALOGS=
+ QTCATALOGS=
+ TCLCATALOGS=
+ CSHARPCATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+ QTCATALOGS="$QTCATALOGS $lang.qm"
+ frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+ TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+ 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/'`
+ CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+ done
+ 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
+${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
+ if grep -l '@CSHARPCATALOGS@' "$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/_/-/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
+${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
+ if test -n "$POMAKEFILEDEPS"; then
+ cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+ fi
+ mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+ XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+ AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+ XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/m4/posix_spawn.m4 b/m4/posix_spawn.m4
new file mode 100644
index 0000000..59e56fc
--- /dev/null
+++ b/m4/posix_spawn.m4
@@ -0,0 +1,678 @@
+# posix_spawn.m4 serial 19
+dnl Copyright (C) 2008-2020 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 Tests whether the entire posix_spawn facility is available.
+AC_DEFUN([gl_POSIX_SPAWN],
+[
+ AC_REQUIRE([gl_POSIX_SPAWN_BODY])
+])
+
+AC_DEFUN([gl_POSIX_SPAWN_BODY],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_REQUIRE([gl_HAVE_POSIX_SPAWN])
+ dnl Assume that when the main function exists, all the others,
+ dnl except posix_spawnattr_{get,set}sched*, are available as well.
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnp])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_init])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addclose])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_adddup2])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addopen])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_destroy])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_init])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getflags])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setflags])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getpgroup])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setpgroup])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getsigdefault])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setsigdefault])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getsigmask])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setsigmask])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_destroy])
+ if test $ac_cv_func_posix_spawn = yes; then
+ m4_ifdef([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR],
+ [dnl Module 'posix_spawn_file_actions_addchdir' is present.
+ AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addchdir_np])
+ if test $ac_cv_func_posix_spawn_file_actions_addchdir_np = no; then
+ dnl In order to implement the posix_spawn_file_actions_addchdir
+ dnl function, we need to replace the entire posix_spawn facility.
+ REPLACE_POSIX_SPAWN=1
+ fi
+ ])
+ m4_ifdef([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR],
+ [dnl Module 'posix_spawn_file_actions_addfchdir' is present.
+ AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addfchdir_np])
+ if test $ac_cv_func_posix_spawn_file_actions_addfchdir_np = no; then
+ dnl In order to implement the posix_spawn_file_actions_addfchdir
+ dnl function, we need to replace the entire posix_spawn facility.
+ REPLACE_POSIX_SPAWN=1
+ fi
+ ])
+ if test $REPLACE_POSIX_SPAWN = 0; then
+ gl_POSIX_SPAWN_WORKS
+ case "$gl_cv_func_posix_spawn_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ fi
+ if test $REPLACE_POSIX_SPAWN = 0; then
+ gl_POSIX_SPAWN_SECURE
+ case "$gl_cv_func_posix_spawn_secure_exec" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ case "$gl_cv_func_posix_spawnp_secure_exec" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN=1 ;;
+ esac
+ fi
+ if test $REPLACE_POSIX_SPAWN = 0; then
+ dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDULER
+ dnl evaluates to nonzero.
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedpolicy])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedpolicy])
+ AC_CACHE_CHECK([whether posix_spawnattr_setschedpolicy is supported],
+ [gl_cv_func_spawnattr_setschedpolicy],
+ [AC_EGREP_CPP([POSIX scheduling supported], [
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDULER
+ POSIX scheduling supported
+#endif
+],
+ [gl_cv_func_spawnattr_setschedpolicy=yes],
+ [gl_cv_func_spawnattr_setschedpolicy=no])
+ ])
+ dnl Assume that these functions are available if POSIX_SPAWN_SETSCHEDPARAM
+ dnl evaluates to nonzero.
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_getschedparam])
+ dnl AC_CHECK_FUNCS_ONCE([posix_spawnattr_setschedparam])
+ AC_CACHE_CHECK([whether posix_spawnattr_setschedparam is supported],
+ [gl_cv_func_spawnattr_setschedparam],
+ [AC_EGREP_CPP([POSIX scheduling supported], [
+#include <spawn.h>
+#if POSIX_SPAWN_SETSCHEDPARAM
+ POSIX scheduling supported
+#endif
+],
+ [gl_cv_func_spawnattr_setschedparam=yes],
+ [gl_cv_func_spawnattr_setschedparam=no])
+ ])
+ fi
+ fi
+ if test $ac_cv_func_posix_spawn != yes || test $REPLACE_POSIX_SPAWN = 1; then
+ AC_DEFINE([REPLACE_POSIX_SPAWN], [1],
+ [Define if gnulib uses its own posix_spawn and posix_spawnp functions.])
+ fi
+])
+
+dnl Test whether posix_spawn actually works.
+dnl posix_spawn on AIX 5.3..6.1 has two bugs:
+dnl 1) When it fails to execute the program, the child process exits with
+dnl exit() rather than _exit(), which causes the stdio buffers to be
+dnl flushed. Reported by Rainer Tammer.
+dnl 2) The posix_spawn_file_actions_addopen function does not support file
+dnl names that contain a '*'.
+dnl posix_spawn on AIX 5.3..6.1 has also a third bug: It does not work
+dnl when POSIX threads are used. But we don't test against this bug here.
+AC_DEFUN([gl_POSIX_SPAWN_WORKS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether posix_spawn works], [gl_cv_func_posix_spawn_works],
+ [if test $cross_compiling = no; then
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+]GL_MDA_DEFINES[
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "/non/exist/ent"
+
+static int
+fd_safer (int fd)
+{
+ if (0 <= fd && fd <= 2)
+ {
+ int f = fd_safer (dup (fd));
+ int e = errno;
+ close (fd);
+ errno = e;
+ fd = f;
+ }
+
+ return fd;
+}
+
+int
+main ()
+{
+ char *argv[2] = { CHILD_PROGRAM_FILENAME, NULL };
+ int ofd[2];
+ sigset_t blocked_signals;
+ sigset_t fatal_signal_set;
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ posix_spawnattr_t attrs;
+ bool attrs_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ setvbuf (stdout, NULL, _IOFBF, 0);
+ puts ("This should be seen only once.");
+ if (pipe (ofd) < 0 || (ofd[1] = fd_safer (ofd[1])) < 0)
+ {
+ perror ("cannot create pipe");
+ exit (1);
+ }
+ sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+ sigemptyset (&fatal_signal_set);
+ sigaddset (&fatal_signal_set, SIGINT);
+ sigaddset (&fatal_signal_set, SIGTERM);
+ sigaddset (&fatal_signal_set, SIGHUP);
+ sigaddset (&fatal_signal_set, SIGPIPE);
+ sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+ actions_allocated = false;
+ attrs_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_adddup2 (&actions, ofd[0], STDIN_FILENO)) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[0])) != 0
+ || (err = posix_spawn_file_actions_addclose (&actions, ofd[1])) != 0
+ || (err = posix_spawnattr_init (&attrs)) != 0
+ || (attrs_allocated = true,
+ (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+ || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+ || (err = posix_spawnp (&child, CHILD_PROGRAM_FILENAME, &actions, &attrs, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ if (attrs_allocated)
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ if (err == ENOENT)
+ return 0;
+ else
+ {
+ errno = err;
+ perror ("subprocess failed");
+ exit (1);
+ }
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ posix_spawnattr_destroy (&attrs);
+ sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+ close (ofd[0]);
+ close (ofd[1]);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ exit (1);
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 127)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ exit (1);
+ }
+ return 0;
+}
+]])],
+ [if test -s conftest$ac_exeext \
+ && ./conftest$ac_exeext > conftest.out \
+ && echo 'This should be seen only once.' > conftest.ok \
+ && cmp conftest.out conftest.ok >/dev/null 2>&1; then
+ gl_cv_func_posix_spawn_works=yes
+ else
+ gl_cv_func_posix_spawn_works=no
+ fi],
+ [gl_cv_func_posix_spawn_works=no])
+ if test $gl_cv_func_posix_spawn_works = yes; then
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+/* Test whether posix_spawn_file_actions_addopen supports filename arguments
+ that contain special characters such as '*'. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <spawn.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+]GL_MDA_DEFINES[
+
+extern char **environ;
+
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+#ifndef WTERMSIG
+# define WTERMSIG(x) ((x) & 0x7f)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(x) (WTERMSIG (x) == 0)
+#endif
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+#endif
+
+#define CHILD_PROGRAM_FILENAME "conftest"
+#define DATA_FILENAME "conftest%=*#?"
+
+static int
+parent_main (void)
+{
+ FILE *fp;
+ char *argv[3] = { CHILD_PROGRAM_FILENAME, "-child", NULL };
+ posix_spawn_file_actions_t actions;
+ bool actions_allocated;
+ int err;
+ pid_t child;
+ int status;
+ int exitstatus;
+
+ /* Create a data file with specific contents. */
+ fp = fopen (DATA_FILENAME, "wb");
+ if (fp == NULL)
+ {
+ perror ("cannot create data file");
+ return 1;
+ }
+ fwrite ("Halle Potta", 1, 11, fp);
+ if (fflush (fp) || fclose (fp))
+ {
+ perror ("cannot prepare data file");
+ return 2;
+ }
+
+ /* Avoid reading from our stdin, as it could block. */
+ freopen ("/dev/null", "rb", stdin);
+
+ /* Test whether posix_spawn_file_actions_addopen with this file name
+ actually works, but spawning a child that reads from this file. */
+ actions_allocated = false;
+ if ((err = posix_spawn_file_actions_init (&actions)) != 0
+ || (actions_allocated = true,
+ (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, DATA_FILENAME, O_RDONLY, 0600)) != 0
+ || (err = posix_spawn (&child, CHILD_PROGRAM_FILENAME, &actions, NULL, argv, environ)) != 0))
+ {
+ if (actions_allocated)
+ posix_spawn_file_actions_destroy (&actions);
+ errno = err;
+ perror ("subprocess failed");
+ return 3;
+ }
+ posix_spawn_file_actions_destroy (&actions);
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ {
+ fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+ return 4;
+ }
+ exitstatus = WEXITSTATUS (status);
+ if (exitstatus != 0)
+ {
+ fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+ return 5;
+ }
+ return 0;
+}
+
+static int
+child_main (void)
+{
+ char buf[1024];
+
+ /* See if reading from STDIN_FILENO yields the expected contents. */
+ if (fread (buf, 1, sizeof (buf), stdin) == 11
+ && memcmp (buf, "Halle Potta", 11) == 0)
+ return 0;
+ else
+ return 8;
+}
+
+static void
+cleanup_then_die (int sig)
+{
+ /* Clean up data file. */
+ unlink (DATA_FILENAME);
+
+ /* Re-raise the signal and die from it. */
+ signal (sig, SIG_DFL);
+ raise (sig);
+}
+
+int
+main (int argc, char *argv[])
+{
+ int exitstatus;
+
+ if (!(argc > 1 && strcmp (argv[1], "-child") == 0))
+ {
+ /* This is the parent process. */
+ signal (SIGINT, cleanup_then_die);
+ signal (SIGTERM, cleanup_then_die);
+ #ifdef SIGHUP
+ signal (SIGHUP, cleanup_then_die);
+ #endif
+
+ exitstatus = parent_main ();
+ }
+ else
+ {
+ /* This is the child process. */
+
+ exitstatus = child_main ();
+ }
+ unlink (DATA_FILENAME);
+ return exitstatus;
+}
+]])],
+ [],
+ [gl_cv_func_posix_spawn_works=no])
+ fi
+ else
+ case "$host_os" in
+ aix*) gl_cv_func_posix_spawn_works="guessing no";;
+ *) gl_cv_func_posix_spawn_works="guessing yes";;
+ esac
+ fi
+ ])
+])
+
+dnl Test whether posix_spawn and posix_spawnp are secure.
+AC_DEFUN([gl_POSIX_SPAWN_SECURE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl On many platforms, posix_spawn or posix_spawnp allow executing a
+ dnl script without a '#!' marker as a shell script. This is unsecure.
+ AC_CACHE_CHECK([whether posix_spawn rejects scripts without shebang],
+ [gl_cv_func_posix_spawn_secure_exec],
+ [echo ':' > conftest.scr
+ chmod a+x conftest.scr
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <errno.h>
+ #include <spawn.h>
+ #include <stddef.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ int
+ main ()
+ {
+ const char *prog_path = "./conftest.scr";
+ const char *prog_argv[2] = { prog_path, NULL };
+ const char *environment[2] = { "PATH=.", NULL };
+ pid_t child;
+ int status;
+ int err = posix_spawn (&child, prog_path, NULL, NULL,
+ (char **) prog_argv, (char **) environment);
+ if (err == ENOEXEC)
+ return 0;
+ if (err != 0)
+ return 1;
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ return 2;
+ if (WEXITSTATUS (status) != 127)
+ return 3;
+ return 0;
+ }
+ ]])],
+ [gl_cv_func_posix_spawn_secure_exec=yes],
+ [gl_cv_func_posix_spawn_secure_exec=no],
+ [case "$host_os" in
+ # Guess no on GNU/Hurd.
+ gnu*)
+ gl_cv_func_posix_spawn_secure_exec="guessing no" ;;
+ # Guess yes on all other platforms.
+ *)
+ gl_cv_func_posix_spawn_secure_exec="guessing yes" ;;
+ esac
+ ])
+ rm -f conftest.scr
+ ])
+ AC_CACHE_CHECK([whether posix_spawnp rejects scripts without shebang],
+ [gl_cv_func_posix_spawnp_secure_exec],
+ [echo ':' > conftest.scr
+ chmod a+x conftest.scr
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+ #include <errno.h>
+ #include <spawn.h>
+ #include <stddef.h>
+ #include <sys/types.h>
+ #include <sys/wait.h>
+ int
+ main ()
+ {
+ const char *prog_path = "./conftest.scr";
+ const char *prog_argv[2] = { prog_path, NULL };
+ const char *environment[2] = { "PATH=.", NULL };
+ pid_t child;
+ int status;
+ int err = posix_spawnp (&child, prog_path, NULL, NULL,
+ (char **) prog_argv, (char **) environment);
+ if (err == ENOEXEC)
+ return 0;
+ if (err != 0)
+ return 1;
+ status = 0;
+ while (waitpid (child, &status, 0) != child)
+ ;
+ if (!WIFEXITED (status))
+ return 2;
+ if (WEXITSTATUS (status) != 127)
+ return 3;
+ return 0;
+ }
+ ]])],
+ [gl_cv_func_posix_spawnp_secure_exec=yes],
+ [gl_cv_func_posix_spawnp_secure_exec=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems (glibc >= 2.15 actually) except GNU/Hurd,
+ # musl libc, NetBSD.
+ *-gnu* | *-musl* | netbsd*)
+ gl_cv_func_posix_spawnp_secure_exec="guessing yes" ;;
+ # Guess no on GNU/Hurd, macOS, FreeBSD, OpenBSD, AIX, Solaris, Cygwin.
+ gnu* | darwin* | freebsd* | dragonfly* | openbsd* | aix* | solaris* | cygwin*)
+ gl_cv_func_posix_spawnp_secure_exec="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_posix_spawnp_secure_exec="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.scr
+ ])
+])
+
+# Prerequisites of lib/spawni.c.
+AC_DEFUN([gl_PREREQ_POSIX_SPAWN_INTERNAL],
+[
+ AC_CHECK_HEADERS([paths.h])
+ AC_CHECK_FUNCS([confstr sched_setparam sched_setscheduler setegid seteuid vfork])
+])
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ gl_POSIX_SPAWN
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1
+ else
+ dnl On musl libc and Solaris 11.0, posix_spawn_file_actions_addclose
+ dnl succeeds even if the fd argument is out of range.
+ AC_CACHE_CHECK([whether posix_spawn_file_actions_addclose works],
+ [gl_cv_func_posix_spawn_file_actions_addclose_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <spawn.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_addclose (&actions, 10000000) == 0)
+ return 2;
+ return 0;
+}]])],
+ [gl_cv_func_posix_spawn_file_actions_addclose_works=yes],
+ [gl_cv_func_posix_spawn_file_actions_addclose_works=no],
+ [# Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ solaris*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_addclose_works="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_posix_spawn_file_actions_addclose_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=1 ;;
+ esac
+ fi
+])
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ gl_POSIX_SPAWN
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1
+ else
+ dnl On musl libc and Solaris 11.0, posix_spawn_file_actions_adddup2
+ dnl succeeds even if the fd argument is out of range.
+ AC_CACHE_CHECK([whether posix_spawn_file_actions_adddup2 works],
+ [gl_cv_func_posix_spawn_file_actions_adddup2_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <spawn.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_adddup2 (&actions, 10000000, 2) == 0)
+ return 2;
+ return 0;
+}]])],
+ [gl_cv_func_posix_spawn_file_actions_adddup2_works=yes],
+ [gl_cv_func_posix_spawn_file_actions_adddup2_works=no],
+ [# Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+ solaris*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_adddup2_works="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_posix_spawn_file_actions_adddup2_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=1 ;;
+ esac
+ fi
+])
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ gl_POSIX_SPAWN
+ if test $REPLACE_POSIX_SPAWN = 1; then
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1
+ else
+ dnl On musl libc and Solaris 11.0, posix_spawn_file_actions_addopen
+ dnl succeeds even if the fd argument is out of range.
+ AC_CACHE_CHECK([whether posix_spawn_file_actions_addopen works],
+ [gl_cv_func_posix_spawn_file_actions_addopen_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <spawn.h>
+#include <fcntl.h>
+int main ()
+{
+ posix_spawn_file_actions_t actions;
+ if (posix_spawn_file_actions_init (&actions) != 0)
+ return 1;
+ if (posix_spawn_file_actions_addopen (&actions, 10000000, "foo", 0, O_RDONLY)
+ == 0)
+ return 2;
+ return 0;
+}]])],
+ [gl_cv_func_posix_spawn_file_actions_addopen_works=yes],
+ [gl_cv_func_posix_spawn_file_actions_addopen_works=no],
+ [# Guess no on musl libc and Solaris, yes otherwise.
+ case "$host_os" in
+ *-musl*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+ solaris*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing no" ;;
+ *) gl_cv_func_posix_spawn_file_actions_addopen_works="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_posix_spawn_file_actions_addopen_works" in
+ *yes) ;;
+ *) REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=1 ;;
+ esac
+ fi
+])
diff --git a/m4/posix_spawn_faction_addchdir.m4 b/m4/posix_spawn_faction_addchdir.m4
new file mode 100644
index 0000000..1ce7153
--- /dev/null
+++ b/m4/posix_spawn_faction_addchdir.m4
@@ -0,0 +1,20 @@
+# posix_spawn_faction_addchdir.m4 serial 1
+dnl Copyright (C) 2018-2020 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.
+
+AC_DEFUN([gl_FUNC_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR],
+[
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ gl_POSIX_SPAWN
+ AC_CHECK_FUNCS_ONCE([posix_spawn_file_actions_addchdir posix_spawn_file_actions_addchdir_np])
+ if test $ac_cv_func_posix_spawn_file_actions_addchdir = yes; then
+ dnl This function is not yet standardized. Therefore override the
+ dnl system's implementation always.
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1
+ else
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0
+ fi
+])
diff --git a/m4/printf.m4 b/m4/printf.m4
new file mode 100644
index 0000000..95f7d9f
--- /dev/null
+++ b/m4/printf.m4
@@ -0,0 +1,1719 @@
+# printf.m4 serial 71
+dnl Copyright (C) 2003, 2007-2020 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 Test whether the *printf family of functions supports the 'j', 'z', 't',
+dnl 'L' size specifiers. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_sizes_c99.
+
+AC_DEFUN([gl_PRINTF_SIZES_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+ AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
+ [gl_cv_func_printf_sizes_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+static char buf[100];
+int main ()
+{
+ int result = 0;
+#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
+ buf[0] = '\0';
+ if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
+ || strcmp (buf, "12345671 33") != 0)
+ result |= 1;
+#else
+ result |= 1;
+#endif
+ buf[0] = '\0';
+ if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
+ || strcmp (buf, "12345672 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
+ || strcmp (buf, "12345673 33") != 0)
+ result |= 4;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
+ || strcmp (buf, "1.5 33") != 0)
+ result |= 8;
+ return result;
+}]])],
+ [gl_cv_func_printf_sizes_c99=yes],
+ [gl_cv_func_printf_sizes_c99=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_sizes_c99="guessing no";;
+ darwin*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ openbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_sizes_c99="guessing no";;
+ netbsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_sizes_c99="guessing yes";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_sizes_c99="guessing yes"],
+ [gl_cv_func_printf_sizes_c99="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_sizes_c99="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports 'long double'
+dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_long_double.
+
+AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports 'long double' arguments],
+ [gl_cv_func_printf_long_double],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[10000];
+int main ()
+{
+ int result = 0;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000 33") != 0)
+ result |= 1;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.750000e+00 33") != 0)
+ result |= 2;
+ buf[0] = '\0';
+ if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
+ || strcmp (buf, "1.75 33") != 0)
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_long_double=yes],
+ [gl_cv_func_printf_long_double=no],
+ [case "$host_os" in
+ # Guess no on BeOS.
+ beos*) gl_cv_func_printf_long_double="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_long_double="guessing yes";;
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_long_double="guessing yes"],
+ [gl_cv_func_printf_long_double="guessing no"])
+ ;;
+ *) gl_cv_func_printf_long_double="guessing yes";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'double' arguments and negative zero arguments in the %f, %e, %g
+dnl directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite.
+
+AC_DEFUN([gl_PRINTF_INFINITE],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
+ [gl_cv_func_printf_infinite],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static int
+have_minus_zero ()
+{
+ static double plus_zero = 0.0;
+ double minus_zero = - plus_zero;
+ return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
+}
+static char buf[10000];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%f", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%f", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%e", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 4;
+ if (sprintf (buf, "%e", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 8;
+ if (sprintf (buf, "%g", 1.0 / zero) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", -1.0 / zero) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 16;
+ if (sprintf (buf, "%g", zero / zero) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 32;
+ /* This test fails on HP-UX 10.20. */
+ if (have_minus_zero ())
+ if (sprintf (buf, "%g", - zero) < 0
+ || strcmp (buf, "-0") != 0)
+ result |= 64;
+ return result;
+}]])],
+ [gl_cv_func_printf_infinite=yes],
+ [gl_cv_func_printf_infinite=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_infinite="guessing no";;
+ darwin*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
+ hpux*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_printf_infinite="guessing no";;
+ netbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_infinite="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_infinite="guessing yes"],
+ [gl_cv_func_printf_infinite="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports infinite and NaN
+dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_infinite_long_double.
+
+AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_BIGENDIAN])
+ AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ dnl The user can set or unset the variable gl_printf_safe to indicate
+ dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
+ if test -n "$gl_printf_safe"; then
+ AC_DEFINE([CHECK_PRINTF_SAFE], [1],
+ [Define if you wish *printf() functions that have a safe handling of
+ non-IEEE-754 'long double' values.])
+ fi
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
+ [gl_cv_func_printf_infinite_long_double],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+]GL_NOCRASH[
+#include <float.h>
+#include <stdio.h>
+#include <string.h>
+static int
+strisnan (const char *string, size_t start_index, size_t end_index)
+{
+ if (start_index < end_index)
+ {
+ if (string[start_index] == '-')
+ start_index++;
+ if (start_index + 3 <= end_index
+ && memcmp (string + start_index, "nan", 3) == 0)
+ {
+ start_index += 3;
+ if (start_index == end_index
+ || (string[start_index] == '(' && string[end_index - 1] == ')'))
+ return 1;
+ }
+ }
+ return 0;
+}
+static char buf[10000];
+static long double zeroL = 0.0L;
+int main ()
+{
+ int result = 0;
+ nocrash_init();
+ if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Le", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+ if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
+ || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
+ || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
+ result |= 1;
+ if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 1;
+#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
+/* Representation of an 80-bit 'long double' as an initializer for a sequence
+ of 'unsigned int' words. */
+# ifdef WORDS_BIGENDIAN
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
+ ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
+ (unsigned int) (mantlo) << 16 \
+ }
+# else
+# define LDBL80_WORDS(exponent,manthi,mantlo) \
+ { mantlo, manthi, exponent }
+# endif
+ { /* Quiet NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ {
+ /* Signalling NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Le", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ if (sprintf (buf, "%Lg", x.value) < 0
+ || !strisnan (buf, 0, strlen (buf)))
+ result |= 2;
+ }
+ { /* Pseudo-NaN. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 4;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 4;
+ }
+ { /* Pseudo-Infinity. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 8;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 8;
+ }
+ { /* Pseudo-Zero. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 16;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 16;
+ }
+ { /* Unnormalized number. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 32;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 32;
+ }
+ { /* Pseudo-Denormal. */
+ static union { unsigned int word[4]; long double value; } x =
+ { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
+ if (sprintf (buf, "%Lf", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Le", x.value) <= 0)
+ result |= 64;
+ if (sprintf (buf, "%Lg", x.value) <= 0)
+ result |= 64;
+ }
+#endif
+ return result;
+}]])],
+ [gl_cv_func_printf_infinite_long_double=yes],
+ [gl_cv_func_printf_infinite_long_double=no],
+ [case "$host_cpu" in
+ # Guess no on ia64, x86_64, i386.
+ ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
+ *)
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ hpux*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_infinite_long_double="guessing no";;
+ openbsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_infinite_long_double="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_infinite_long_double="guessing yes"],
+ [gl_cv_func_printf_infinite_long_double="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_infinite_long_double="$gl_cross_guess_normal";;
+ esac
+ ;;
+ esac
+ ])
+ ])
+ ;;
+ *)
+ gl_cv_func_printf_infinite_long_double="irrelevant"
+ ;;
+ esac
+])
+
+dnl Test whether the *printf family of functions supports the 'a' and 'A'
+dnl conversion specifier for hexadecimal output of floating-point numbers.
+dnl (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_a.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
+ [gl_cv_func_printf_directive_a],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.922p+1 33") != 0
+ && strcmp (buf, "0x3.244p+0 33") != 0
+ && strcmp (buf, "0x6.488p-1 33") != 0
+ && strcmp (buf, "0xc.91p-2 33") != 0))
+ result |= 1;
+ if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
+ || (strcmp (buf, "-0X1.922P+1 33") != 0
+ && strcmp (buf, "-0X3.244P+0 33") != 0
+ && strcmp (buf, "-0X6.488P-1 33") != 0
+ && strcmp (buf, "-0XC.91P-2 33") != 0))
+ result |= 2;
+ /* This catches a FreeBSD 6.1 bug: it doesn't round. */
+ if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x1.83p+0 33") != 0
+ && strcmp (buf, "0x3.05p-1 33") != 0
+ && strcmp (buf, "0x6.0ap-2 33") != 0
+ && strcmp (buf, "0xc.14p-3 33") != 0))
+ result |= 4;
+ /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */
+ if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0
+ || (strcmp (buf, "0x2p+0 33") != 0
+ && strcmp (buf, "0x3p-1 33") != 0
+ && strcmp (buf, "0x6p-2 33") != 0
+ && strcmp (buf, "0xcp-3 33") != 0))
+ result |= 4;
+ /* This catches a FreeBSD 6.1 bug. See
+ <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html> */
+ if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
+ || buf[0] == '0')
+ result |= 8;
+ /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */
+ if (sprintf (buf, "%.1a", 1.999) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 16;
+ /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
+ glibc 2.4 bug <https://sourceware.org/bugzilla/show_bug.cgi?id=2908>. */
+ if (sprintf (buf, "%.1La", 1.999L) < 0
+ || (strcmp (buf, "0x1.0p+1") != 0
+ && strcmp (buf, "0x2.0p+0") != 0
+ && strcmp (buf, "0x4.0p-1") != 0
+ && strcmp (buf, "0x8.0p-2") != 0))
+ result |= 32;
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_a=yes],
+ [gl_cv_func_printf_directive_a=no],
+ [
+ case "$host_os" in
+ # Guess yes on glibc >= 2.5 systems.
+ *-gnu* | gnu*)
+ AC_EGREP_CPP([BZ2908], [
+ #include <features.h>
+ #ifdef __GNU_LIBRARY__
+ #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
+ BZ2908
+ #endif
+ #endif
+ ],
+ [gl_cv_func_printf_directive_a="guessing yes"],
+ [gl_cv_func_printf_directive_a="guessing no"])
+ ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_a="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_a="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_a="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_a="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %F format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_f.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'F' directive],
+ [gl_cv_func_printf_directive_f],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ int result = 0;
+ if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
+ || strcmp (buf, "1234567.000000 33") != 0)
+ result |= 1;
+ if (sprintf (buf, "%F", 1.0 / zero) < 0
+ || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
+ result |= 2;
+ /* This catches a Cygwin 1.5.x bug. */
+ if (sprintf (buf, "%.F", 1234.0) < 0
+ || strcmp (buf, "1234") != 0)
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_f=yes],
+ [gl_cv_func_printf_directive_f=no],
+ [
+ case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on FreeBSD >= 6.
+ freebsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_printf_directive_f="guessing no";;
+ darwin*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_f="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_f="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_directive_f="guessing yes";;
+ solaris*) gl_cv_func_printf_directive_f="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_f="guessing no";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_printf_directive_f="guessing yes"],
+ [gl_cv_func_printf_directive_f="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_directive_f="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %n format
+dnl directive. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_printf_directive_n.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'n' directive],
+ [gl_cv_func_printf_directive_n],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _MSC_VER
+#include <inttypes.h>
+/* See page about "Parameter Validation" on msdn.microsoft.com.
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/parameter-validation>
+ <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/set-invalid-parameter-handler-set-thread-local-invalid-parameter-handler> */
+static void cdecl
+invalid_parameter_handler (const wchar_t *expression,
+ const wchar_t *function,
+ const wchar_t *file, unsigned int line,
+ uintptr_t dummy)
+{
+ exit (1);
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+#ifdef _MSC_VER
+ _set_invalid_parameter_handler (invalid_parameter_handler);
+#endif
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
+ || strcmp (buf, "123 ") != 0
+ || count != 4)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_directive_n=yes],
+ [gl_cv_func_printf_directive_n=no],
+ [case "$host_os" in
+ # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+ *-gnu* | gnu*) AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if _FORTIFY_SOURCE >= 2
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_printf_directive_n="guessing yes"],
+ [gl_cv_func_printf_directive_n="guessing no"])
+ ;;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_n="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_directive_n="guessing no";;
+ *) gl_cv_func_printf_directive_n="guessing yes";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the %ls format
+dnl directive and in particular, when a precision is specified, whether
+dnl the functions stop converting the wide string argument when the number
+dnl of bytes that have been produced by this conversion equals or exceeds
+dnl the precision.
+dnl Result is gl_cv_func_printf_directive_ls.
+
+AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the 'ls' directive],
+ [gl_cv_func_printf_directive_ls],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <wchar.h>
+#include <string.h>
+int main ()
+{
+ int result = 0;
+ char buf[100];
+ /* Test whether %ls works at all.
+ This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
+ Cygwin 1.5. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "abc") != 0)
+ result |= 1;
+ }
+ /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
+ assertion failure inside libc), but not on OpenBSD 4.0. */
+ {
+ static const wchar_t wstring[] = { 'a', 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%ls", wstring) < 0
+ || strcmp (buf, "a") != 0)
+ result |= 2;
+ }
+ /* Test whether precisions in %ls are supported as specified in ISO C 99
+ section 7.19.6.1:
+ "If a precision is specified, no more than that many bytes are written
+ (including shift sequences, if any), and the array shall contain a
+ null wide character if, to equal the multibyte character sequence
+ length given by the precision, the function would need to access a
+ wide character one past the end of the array."
+ This test fails on Solaris 10. */
+ {
+ static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
+ buf[0] = '\0';
+ if (sprintf (buf, "%.2ls", wstring) < 0
+ || strcmp (buf, "ab") != 0)
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_printf_directive_ls=yes],
+ [gl_cv_func_printf_directive_ls=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on OpenBSD >= 6.0.
+ openbsd[1-5].*) gl_cv_func_printf_directive_ls="guessing no";;
+ openbsd*) gl_cv_func_printf_directive_ls="guessing yes";;
+ irix*) gl_cv_func_printf_directive_ls="guessing no";;
+ solaris*) gl_cv_func_printf_directive_ls="guessing no";;
+ cygwin*) gl_cv_func_printf_directive_ls="guessing no";;
+ beos* | haiku*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_directive_ls="guessing no";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_directive_ls="guessing yes";;
+ *) gl_cv_func_printf_directive_ls="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with positions. (POSIX:2001)
+dnl Result is gl_cv_func_printf_positions.
+
+AC_DEFUN([gl_PRINTF_POSITIONS],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
+ [gl_cv_func_printf_positions],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+ dollar expansion (possibly an autoconf bug). */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+ sprintf (buf, format, 33, 55);
+ return (strcmp (buf, "55 33") != 0);
+}]])],
+ [gl_cv_func_printf_positions=yes],
+ [gl_cv_func_printf_positions=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
+ gl_cv_func_printf_positions="guessing no";;
+ beos*) gl_cv_func_printf_positions="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_positions="guessing yes";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
+ *) gl_cv_func_printf_positions="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports POSIX/XSI format
+dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
+dnl Result is gl_cv_func_printf_flag_grouping.
+
+AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the grouping flag],
+ [gl_cv_func_printf_flag_grouping],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ if (sprintf (buf, "%'d %d", 1234567, 99) < 0
+ || buf[strlen (buf) - 1] != '9')
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_grouping=yes],
+ [gl_cv_func_printf_flag_grouping=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ cygwin*) gl_cv_func_printf_flag_grouping="guessing no";;
+ netbsd*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_grouping="guessing no";;
+ # Guess no on native Windows.
+ mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
+ *) gl_cv_func_printf_flag_grouping="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports the - flag correctly.
+dnl (ISO C99.) See
+dnl <https://lists.gnu.org/r/bug-coreutils/2008-02/msg00035.html>
+dnl Result is gl_cv_func_printf_flag_leftadjust.
+
+AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
+ [gl_cv_func_printf_flag_leftadjust],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+int main ()
+{
+ /* Check that a '-' flag is not annihilated by a negative width. */
+ if (sprintf (buf, "a%-*sc", -3, "b") < 0
+ || strcmp (buf, "ab c") != 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_leftadjust=yes],
+ [gl_cv_func_printf_flag_leftadjust=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on HP-UX 11.
+ hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess no on HP-UX 10 and older.
+ hpux*) gl_cv_func_printf_flag_leftadjust="guessing no";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ # Guess yes otherwise.
+ *) gl_cv_func_printf_flag_leftadjust="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports padding of non-finite
+dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
+dnl <https://lists.gnu.org/r/bug-gnulib/2007-04/msg00107.html>
+dnl Result is gl_cv_func_printf_flag_zero.
+
+AC_DEFUN([gl_PRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports the zero flag correctly],
+ [gl_cv_func_printf_flag_zero],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[100];
+static double zero = 0.0;
+int main ()
+{
+ if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
+ || (strcmp (buf, " inf") != 0
+ && strcmp (buf, " infinity") != 0))
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_printf_flag_zero=yes],
+ [gl_cv_func_printf_flag_zero=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_flag_zero="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_flag_zero="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_printf_flag_zero="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_flag_zero="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions supports large precisions.
+dnl On mingw, precisions larger than 512 are treated like 512, in integer,
+dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
+dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
+dnl precisions larger than 510 in floating-point output yield wrong results.
+dnl On AIX 7.1, precisions larger than 998 in floating-point output yield
+dnl wrong results. On BeOS, precisions larger than 1044 crash the program.
+dnl Result is gl_cv_func_printf_precision.
+
+AC_DEFUN([gl_PRINTF_PRECISION],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf supports large precisions],
+ [gl_cv_func_printf_precision],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+static char buf[5000];
+int main ()
+{
+ int result = 0;
+#ifdef __BEOS__
+ /* On BeOS, this would crash and show a dialog box. Avoid the crash. */
+ return 1;
+#endif
+ if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
+ result |= 1;
+ if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
+ result |= 2;
+ if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
+ || buf[0] != '1')
+ result |= 4;
+ if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
+ || buf[0] != '1')
+ result |= 4;
+ return result;
+}]])],
+ [gl_cv_func_printf_precision=yes],
+ [gl_cv_func_printf_precision=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no only on Solaris, native Windows, and BeOS systems.
+ solaris*) gl_cv_func_printf_precision="guessing no" ;;
+ mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
+ beos*) gl_cv_func_printf_precision="guessing no" ;;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_printf_precision="guessing yes" ;;
+ *) gl_cv_func_printf_precision="guessing yes" ;;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the *printf family of functions recovers gracefully in case
+dnl of an out-of-memory condition, or whether it crashes the entire program.
+dnl Result is gl_cv_func_printf_enomem.
+
+AC_DEFUN([gl_PRINTF_ENOMEM],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gl_MULTIARCH])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
+ [gl_cv_func_printf_enomem],
+ [
+ gl_cv_func_printf_enomem="guessing no"
+ if test "$cross_compiling" = no; then
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ AC_LANG_CONFTEST([AC_LANG_SOURCE([[
+]GL_NOCRASH[
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <errno.h>
+int main()
+{
+ struct rlimit limit;
+ int ret;
+ nocrash_init ();
+ /* Some printf implementations allocate temporary space with malloc. */
+ /* On BSD systems, malloc() is limited by RLIMIT_DATA. */
+#ifdef RLIMIT_DATA
+ if (getrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_DATA, &limit) < 0)
+ return 77;
+#endif
+ /* On Linux systems, malloc() is limited by RLIMIT_AS. */
+#ifdef RLIMIT_AS
+ if (getrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_AS, &limit) < 0)
+ return 77;
+#endif
+ /* Some printf implementations allocate temporary space on the stack. */
+#ifdef RLIMIT_STACK
+ if (getrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+ if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
+ limit.rlim_max = 5000000;
+ limit.rlim_cur = limit.rlim_max;
+ if (setrlimit (RLIMIT_STACK, &limit) < 0)
+ return 77;
+#endif
+ ret = printf ("%.5000000f", 1.0);
+ return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
+}
+ ]])])
+ if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
+ (./conftest 2>&AS_MESSAGE_LOG_FD
+ result=$?
+ _AS_ECHO_LOG([\$? = $result])
+ if test $result != 0 && test $result != 77; then result=1; fi
+ exit $result
+ ) >/dev/null 2>/dev/null
+ case $? in
+ 0) gl_cv_func_printf_enomem="yes" ;;
+ 77) gl_cv_func_printf_enomem="guessing no" ;;
+ *) gl_cv_func_printf_enomem="no" ;;
+ esac
+ else
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ rm -fr conftest*
+ else
+ dnl A universal build on Apple Mac OS X platforms.
+ dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
+ dnl But we need a configuration result that is valid in both modes.
+ gl_cv_func_printf_enomem="guessing no"
+ fi
+ fi
+ if test "$gl_cv_func_printf_enomem" = "guessing no"; then
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Solaris.
+ solaris*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on AIX.
+ aix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on HP-UX/hppa.
+ hpux*) case "$host_cpu" in
+ hppa*) gl_cv_func_printf_enomem="guessing yes";;
+ *) gl_cv_func_printf_enomem="guessing no";;
+ esac
+ ;;
+ # Guess yes on IRIX.
+ irix*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on OSF/1.
+ osf*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess yes on Haiku.
+ haiku*) gl_cv_func_printf_enomem="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_printf_enomem="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_printf_enomem="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ fi
+ ])
+])
+
+dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
+dnl Result is ac_cv_func_snprintf.
+
+AC_DEFUN([gl_SNPRINTF_PRESENCE],
+[
+ AC_CHECK_FUNCS_ONCE([snprintf])
+])
+
+dnl Test whether the string produced by the snprintf function is always NUL
+dnl terminated. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_truncation_c99.
+
+AC_DEFUN_ONCE([gl_SNPRINTF_TRUNCATION_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
+ [gl_cv_func_snprintf_truncation_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ my_snprintf (buf, 3, "%d %d", 4567, 89);
+ if (memcmp (buf, "45\0DEF", 6) != 0)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_truncation_c99=yes],
+ [gl_cv_func_snprintf_truncation_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ solaris*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on HP-UX >= 11.
+ hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ hpux*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ osf*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_truncation_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_truncation_c99="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_truncation_c99="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl Test whether the return value of the snprintf function is the number
+dnl of bytes (excluding the terminating NUL) that would have been produced
+dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
+dnl For example, this test program fails on IRIX 6.5:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8];
+dnl int retval = snprintf (buf, 3, "%d", 12345);
+dnl return retval >= 0 && retval < 3;
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_snprintf_retval_c99.
+
+AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
+ [gl_cv_func_snprintf_retval_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char buf[100];
+int main ()
+{
+ strcpy (buf, "ABCDEF");
+ if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
+ return 1;
+ if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
+ return 2;
+ if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
+ return 3;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_retval_c99=yes],
+ [gl_cv_func_snprintf_retval_c99=no],
+ [case "$host_os" in
+changequote(,)dnl
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ darwin*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on OpenBSD >= 3.9.
+ openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ openbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.10.
+ solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
+ solaris*) gl_cv_func_printf_sizes_c99="guessing no";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_retval_c99="guessing no";;
+ aix*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_retval_c99="guessing no";;
+ netbsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_retval_c99="guessing yes";;
+changequote([,])dnl
+ # Guess yes on MSVC, no on mingw.
+ mingw*) AC_EGREP_CPP([Known], [
+#ifdef _MSC_VER
+ Known
+#endif
+ ],
+ [gl_cv_func_snprintf_retval_c99="guessing yes"],
+ [gl_cv_func_snprintf_retval_c99="guessing no"])
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_retval_c99="$gl_cross_guess_normal";;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function supports the %n format directive
+dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
+dnl Result is gl_cv_func_snprintf_directive_n.
+
+AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
+ [gl_cv_func_snprintf_directive_n],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+static char fmtstring[10];
+static char buf[100];
+int main ()
+{
+ int count = -1;
+ /* Copy the format string. Some systems (glibc with _FORTIFY_SOURCE=2)
+ support %n in format strings in read-only memory but not in writable
+ memory. */
+ strcpy (fmtstring, "%d %n");
+ my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
+ if (count != 6)
+ return 1;
+ return 0;
+}]])],
+ [gl_cv_func_snprintf_directive_n=yes],
+ [gl_cv_func_snprintf_directive_n=no],
+ [
+ case "$host_os" in
+ # Guess no on glibc when _FORTIFY_SOURCE >= 2.
+ *-gnu* | gnu*) AC_COMPILE_IFELSE(
+ [AC_LANG_SOURCE(
+ [[#if _FORTIFY_SOURCE >= 2
+ error fail
+ #endif
+ ]])],
+ [gl_cv_func_snprintf_directive_n="guessing yes"],
+ [gl_cv_func_snprintf_directive_n="guessing no"])
+ ;;
+changequote(,)dnl
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_snprintf_directive_n="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_snprintf_directive_n="guessing no";;
+ darwin*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_snprintf_directive_n="guessing no";;
+ solaris*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ aix*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on OSF/1 >= 5.
+ osf[3-4]*) gl_cv_func_snprintf_directive_n="guessing no";;
+ osf*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_snprintf_directive_n="guessing no";;
+ netbsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_snprintf_directive_n="guessing yes";;
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_snprintf_directive_n="guessing no";;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_snprintf_directive_n="guessing no";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_snprintf_directive_n="$gl_cross_guess_normal";;
+changequote([,])dnl
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the snprintf function, when passed a size = 1, writes any
+dnl output without bounds in this case, behaving like sprintf. This is the
+dnl case on Linux libc5.
+dnl Result is gl_cv_func_snprintf_size1.
+
+AC_DEFUN([gl_SNPRINTF_SIZE1],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SNPRINTF_PRESENCE])
+ AC_CACHE_CHECK([whether snprintf respects a size of 1],
+ [gl_cv_func_snprintf_size1],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#if HAVE_SNPRINTF
+# define my_snprintf snprintf
+#else
+# include <stdarg.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+#endif
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 1, "%d", 12345);
+ return buf[1] != 'E';
+}]])],
+ [gl_cv_func_snprintf_size1=yes],
+ [gl_cv_func_snprintf_size1=no],
+ [case "$host_os" in
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_snprintf_size1="guessing yes" ;;
+ *) gl_cv_func_snprintf_size1="guessing yes" ;;
+ esac
+ ])
+ ])
+])
+
+dnl Test whether the vsnprintf function, when passed a zero size, produces no
+dnl output. (ISO C99, POSIX:2001)
+dnl For example, snprintf nevertheless writes a NUL byte in this case
+dnl on OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdio.h>
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl And vsnprintf writes any output without bounds in this case, behaving like
+dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
+dnl ---------------------------------------------------------------------
+dnl #include <stdarg.h>
+dnl #include <stdio.h>
+dnl static int my_snprintf (char *buf, int size, const char *format, ...)
+dnl {
+dnl va_list args;
+dnl int ret;
+dnl va_start (args, format);
+dnl ret = vsnprintf (buf, size, format, args);
+dnl va_end (args);
+dnl return ret;
+dnl }
+dnl int main()
+dnl {
+dnl static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+dnl my_snprintf (buf, 0, "%d", 12345);
+dnl return buf[0] != 'D';
+dnl }
+dnl ---------------------------------------------------------------------
+dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
+
+AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
+ [gl_cv_func_vsnprintf_zerosize_c99],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdarg.h>
+#include <stdio.h>
+static int my_snprintf (char *buf, int size, const char *format, ...)
+{
+ va_list args;
+ int ret;
+ va_start (args, format);
+ ret = vsnprintf (buf, size, format, args);
+ va_end (args);
+ return ret;
+}
+int main()
+{
+ static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
+ my_snprintf (buf, 0, "%d", 12345);
+ return buf[0] != 'D';
+}]])],
+ [gl_cv_func_vsnprintf_zerosize_c99=yes],
+ [gl_cv_func_vsnprintf_zerosize_c99=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on FreeBSD >= 5.
+ freebsd[1-4].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Mac OS X >= 10.3.
+ darwin[1-6].*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ darwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Cygwin.
+ cygwin*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Solaris >= 2.6.
+ solaris2.[0-5] | solaris2.[0-5].*)
+ gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ solaris*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on AIX >= 4.
+ aix[1-3]*) gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ aix*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on IRIX >= 6.5.
+ irix6.5) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on NetBSD >= 3.
+ netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
+ gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
+ netbsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on BeOS.
+ beos*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on Android.
+ linux*-android*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # Guess yes on native Windows.
+ mingw* | pw*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_vsnprintf_zerosize_c99="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+])
+
+dnl The results of these tests on various platforms are:
+dnl
+dnl 1 = gl_PRINTF_SIZES_C99
+dnl 2 = gl_PRINTF_LONG_DOUBLE
+dnl 3 = gl_PRINTF_INFINITE
+dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
+dnl 5 = gl_PRINTF_DIRECTIVE_A
+dnl 6 = gl_PRINTF_DIRECTIVE_F
+dnl 7 = gl_PRINTF_DIRECTIVE_N
+dnl 8 = gl_PRINTF_DIRECTIVE_LS
+dnl 9 = gl_PRINTF_POSITIONS
+dnl 10 = gl_PRINTF_FLAG_GROUPING
+dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
+dnl 12 = gl_PRINTF_FLAG_ZERO
+dnl 13 = gl_PRINTF_PRECISION
+dnl 14 = gl_PRINTF_ENOMEM
+dnl 15 = gl_SNPRINTF_PRESENCE
+dnl 16 = gl_SNPRINTF_TRUNCATION_C99
+dnl 17 = gl_SNPRINTF_RETVAL_C99
+dnl 18 = gl_SNPRINTF_DIRECTIVE_N
+dnl 19 = gl_SNPRINTF_SIZE1
+dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
+dnl
+dnl 1 = checking whether printf supports size specifiers as in C99...
+dnl 2 = checking whether printf supports 'long double' arguments...
+dnl 3 = checking whether printf supports infinite 'double' arguments...
+dnl 4 = checking whether printf supports infinite 'long double' arguments...
+dnl 5 = checking whether printf supports the 'a' and 'A' directives...
+dnl 6 = checking whether printf supports the 'F' directive...
+dnl 7 = checking whether printf supports the 'n' directive...
+dnl 8 = checking whether printf supports the 'ls' directive...
+dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
+dnl 10 = checking whether printf supports the grouping flag...
+dnl 11 = checking whether printf supports the left-adjust flag correctly...
+dnl 12 = checking whether printf supports the zero flag correctly...
+dnl 13 = checking whether printf supports large precisions...
+dnl 14 = checking whether printf survives out-of-memory conditions...
+dnl 15 = checking for snprintf...
+dnl 16 = checking whether snprintf truncates the result as in C99...
+dnl 17 = checking whether snprintf returns a byte count as in C99...
+dnl 18 = checking whether snprintf fully supports the 'n' directive...
+dnl 19 = checking whether snprintf respects a size of 1...
+dnl 20 = checking whether vsnprintf respects a zero size as in C99...
+dnl
+dnl . = yes, # = no.
+dnl
+dnl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+dnl glibc 2.5 . . . . . . . . . . . . . . . . . . . .
+dnl glibc 2.3.6 . . . . # . . . . . . . . . . . . . . .
+dnl FreeBSD 5.4, 6.1 . . . . # . . . . . . # . # . . . . . .
+dnl Mac OS X 10.13.5 . . . # # . # . . . . . . . . . . # . .
+dnl Mac OS X 10.5.8 . . . # # . . . . . . # . . . . . . . .
+dnl Mac OS X 10.3.9 . . . . # . . . . . . # . # . . . . . .
+dnl OpenBSD 6.0, 6.7 . . . . # . . . . . . . . # . . . . . .
+dnl OpenBSD 3.9, 4.0 . . # # # # . # . # . # . # . . . . . .
+dnl Cygwin 1.7.0 (2009) . . . # . . . ? . . . . . ? . . . . . .
+dnl Cygwin 1.5.25 (2008) . . . # # . . # . . . . . # . . . . . .
+dnl Cygwin 1.5.19 (2006) # . . # # # . # . # . # # # . . . . . .
+dnl Solaris 11.4 . . # # # . . # . . . # . . . . . . . .
+dnl Solaris 11.3 . . . . # . . # . . . . . . . . . . . .
+dnl Solaris 11.0 . . # # # . . # . . . # . . . . . . . .
+dnl Solaris 10 . . # # # . . # . . . # # . . . . . . .
+dnl Solaris 2.6 ... 9 # . # # # # . # . . . # # . . . # . . .
+dnl Solaris 2.5.1 # . # # # # . # . . . # . . # # # # # #
+dnl AIX 7.1 . . # # # . . . . . . # # . . . . . . .
+dnl AIX 5.2 . . # # # . . . . . . # . . . . . . . .
+dnl AIX 4.3.2, 5.1 # . # # # # . . . . . # . . . . # . . .
+dnl HP-UX 11.31 . . . . # . . . . . . # . . . . # # . .
+dnl HP-UX 11.{00,11,23} # . . . # # . . . . . # . . . . # # . #
+dnl HP-UX 10.20 # . # . # # . ? . . # # . . . . # # ? #
+dnl IRIX 6.5 # . # # # # . # . . . # . . . . # . . .
+dnl OSF/1 5.1 # . # # # # . . . . . # . . . . # . . #
+dnl OSF/1 4.0d # . # # # # . . . . . # . . # # # # # #
+dnl NetBSD 9.0 . . . . # . . . . . . . . . . . . . . .
+dnl NetBSD 5.0 . . . # # . . . . . . # . # . . . . . .
+dnl NetBSD 4.0 . ? ? ? ? ? . ? . ? ? ? ? ? . . . ? ? ?
+dnl NetBSD 3.0 . . . . # # . ? # # ? # . # . . . . . .
+dnl Haiku . . . # # # . # . . . . . ? . . ? . . .
+dnl BeOS # # . # # # . ? # . ? . # ? . . ? . . .
+dnl Android 4.3 . . # # # # # # . # . # . # . . . # . .
+dnl old mingw / msvcrt # # # # # # . . # # . # # ? . # # # . .
+dnl MSVC 9 # # # # # # # . # # . # # ? # # # # . .
+dnl mingw 2009-2011 . # . # . . . . # # . . . ? . . . . . .
+dnl mingw-w64 2011 # # # # # # . . # # . # # ? . # # # . .
diff --git a/m4/pthread_rwlock_rdlock.m4 b/m4/pthread_rwlock_rdlock.m4
new file mode 100644
index 0000000..049af50
--- /dev/null
+++ b/m4/pthread_rwlock_rdlock.m4
@@ -0,0 +1,185 @@
+# pthread_rwlock_rdlock.m4 serial 4
+dnl Copyright (C) 2017-2020 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.
+dnl Inspired by
+dnl https://github.com/linux-test-project/ltp/blob/master/testcases/open_posix_testsuite/conformance/interfaces/pthread_rwlock_rdlock/2-2.c
+dnl by Intel Corporation.
+
+dnl Test whether in a situation where
+dnl - an rwlock is taken by a reader and has a writer waiting,
+dnl - an additional reader requests the lock,
+dnl - the waiting writer and the requesting reader threads have the same
+dnl priority,
+dnl the requesting reader thread gets blocked, so that at some point the
+dnl waiting writer can acquire the lock.
+dnl Without such a guarantee, when there a N readers and each of the readers
+dnl spends more than 1/Nth of the time with the lock held, there is a high
+dnl probability that the waiting writer will not get the lock in a given finite
+dnl time, a phenomenon called "writer starvation".
+dnl Without such a guarantee, applications have a hard time avoiding writer
+dnl starvation.
+dnl
+dnl POSIX:2017 makes this requirement only for implementations that support TPS
+dnl (Thread Priority Scheduling) and only for the scheduling policies SCHED_FIFO
+dnl and SCHED_RR, see
+dnl https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_rdlock.html
+dnl but this test verifies the guarantee regardless of TPS and regardless of
+dnl scheduling policy.
+dnl Glibc does not provide this guarantee (and never will on Linux), see
+dnl https://sourceware.org/bugzilla/show_bug.cgi?id=13701
+dnl https://bugzilla.redhat.com/show_bug.cgi?id=1410052
+AC_DEFUN([gl_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether pthread_rwlock_rdlock prefers a writer to a reader],
+ [gl_cv_pthread_rwlock_rdlock_prefer_writer],
+ [save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBMULTITHREAD"
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <errno.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define SUCCEED() exit (0)
+#define FAILURE() exit (1)
+#define UNEXPECTED(n) (exit (10 + (n)))
+
+/* The main thread creates the waiting writer and the requesting reader threads
+ in the default way; this guarantees that they have the same priority.
+ We can reuse the main thread as first reader thread. */
+
+static pthread_rwlock_t lock;
+static pthread_t reader1;
+static pthread_t writer;
+static pthread_t reader2;
+static pthread_t timer;
+/* Used to pass control from writer to reader2 and from reader2 to timer,
+ as in a relay race.
+ Passing control from one running thread to another running thread
+ is most likely faster than to create the second thread. */
+static pthread_mutex_t baton;
+
+static void *
+timer_func (void *ignored)
+{
+ /* Step 13 (can be before or after step 12):
+ The timer thread takes the baton, then waits a moment to make sure
+ it can tell whether the second reader thread is blocked at step 12. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (13);
+ usleep (100000);
+ /* By the time we get here, it's clear that the second reader thread is
+ blocked at step 12. This is the desired behaviour. */
+ SUCCEED ();
+}
+
+static void *
+reader2_func (void *ignored)
+{
+ int err;
+
+ /* Step 8 (can be before or after step 7):
+ The second reader thread takes the baton, then waits a moment to make sure
+ the writer thread has reached step 7. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (8);
+ usleep (100000);
+ /* Step 9: The second reader thread requests the lock. */
+ err = pthread_rwlock_tryrdlock (&lock);
+ if (err == 0)
+ FAILURE ();
+ else if (err != EBUSY)
+ UNEXPECTED (9);
+ /* Step 10: Launch a timer, to test whether the next call blocks. */
+ if (pthread_create (&timer, NULL, timer_func, NULL))
+ UNEXPECTED (10);
+ /* Step 11: Release the baton. */
+ if (pthread_mutex_unlock (&baton))
+ UNEXPECTED (11);
+ /* Step 12: The second reader thread requests the lock. */
+ err = pthread_rwlock_rdlock (&lock);
+ if (err == 0)
+ FAILURE ();
+ else
+ UNEXPECTED (12);
+}
+
+static void *
+writer_func (void *ignored)
+{
+ /* Step 4: Take the baton, so that the second reader thread does not go ahead
+ too early. */
+ if (pthread_mutex_lock (&baton))
+ UNEXPECTED (4);
+ /* Step 5: Create the second reader thread. */
+ if (pthread_create (&reader2, NULL, reader2_func, NULL))
+ UNEXPECTED (5);
+ /* Step 6: Release the baton. */
+ if (pthread_mutex_unlock (&baton))
+ UNEXPECTED (6);
+ /* Step 7: The writer thread requests the lock. */
+ if (pthread_rwlock_wrlock (&lock))
+ UNEXPECTED (7);
+ return NULL;
+}
+
+int
+main ()
+{
+ reader1 = pthread_self ();
+
+ /* Step 1: The main thread initializes the lock and the baton. */
+ if (pthread_rwlock_init (&lock, NULL))
+ UNEXPECTED (1);
+ if (pthread_mutex_init (&baton, NULL))
+ UNEXPECTED (1);
+ /* Step 2: The main thread acquires the lock as a reader. */
+ if (pthread_rwlock_rdlock (&lock))
+ UNEXPECTED (2);
+ /* Step 3: Create the writer thread. */
+ if (pthread_create (&writer, NULL, writer_func, NULL))
+ UNEXPECTED (3);
+ /* Job done. Go to sleep. */
+ for (;;)
+ {
+ sleep (1);
+ }
+}
+]])],
+ [gl_cv_pthread_rwlock_rdlock_prefer_writer=yes],
+ [gl_cv_pthread_rwlock_rdlock_prefer_writer=no],
+ [case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess no on musl systems.
+ *-musl*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess no on bionic systems.
+ *-android*) gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no" ;;
+ # Guess yes on native Windows with the mingw-w64 winpthreads library.
+ # Guess no on native Windows with the gnulib windows-rwlock module.
+ mingw*) if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+ gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing yes"
+ else
+ gl_cv_pthread_rwlock_rdlock_prefer_writer="guessing no"
+ fi
+ ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_pthread_rwlock_rdlock_prefer_writer="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ LIBS="$save_LIBS"
+ ])
+ case "$gl_cv_pthread_rwlock_rdlock_prefer_writer" in
+ *yes)
+ AC_DEFINE([HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER], [1],
+ [Define if the 'pthread_rwlock_rdlock' function prefers a writer to a reader.])
+ ;;
+ esac
+])
diff --git a/m4/quote.m4 b/m4/quote.m4
new file mode 100644
index 0000000..9efab95
--- /dev/null
+++ b/m4/quote.m4
@@ -0,0 +1,13 @@
+# quote.m4 serial 6
+dnl Copyright (C) 2002-2003, 2005-2006, 2009-2020 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.
+
+AC_DEFUN([gl_QUOTE],
+[
+ dnl Prerequisites of lib/quote.c.
+ dnl (none)
+ :
+])
diff --git a/m4/quotearg.m4 b/m4/quotearg.m4
new file mode 100644
index 0000000..4038711
--- /dev/null
+++ b/m4/quotearg.m4
@@ -0,0 +1,11 @@
+# quotearg.m4 serial 10
+dnl Copyright (C) 2002, 2004-2020 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.
+
+AC_DEFUN([gl_QUOTEARG],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ :
+])
diff --git a/m4/raise.m4 b/m4/raise.m4
new file mode 100644
index 0000000..5b61b65
--- /dev/null
+++ b/m4/raise.m4
@@ -0,0 +1,36 @@
+# raise.m4 serial 4
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_RAISE],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS([raise])
+ if test $ac_cv_func_raise = no; then
+ HAVE_RAISE=0
+ else
+ m4_ifdef([gl_MSVC_INVAL], [
+ AC_REQUIRE([gl_MSVC_INVAL])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_RAISE=1
+ fi
+ ])
+ m4_ifdef([gl_SIGNALBLOCKING], [
+ gl_SIGNALBLOCKING
+ if test $HAVE_POSIX_SIGNALBLOCKING = 0; then
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_RAISE=1
+ fi
+ ], [:])
+ fi
+ ])
+ fi
+])
+
+# Prerequisites of lib/raise.c.
+AC_DEFUN([gl_PREREQ_RAISE], [:])
diff --git a/m4/rawmemchr.m4 b/m4/rawmemchr.m4
new file mode 100644
index 0000000..c5bf041
--- /dev/null
+++ b/m4/rawmemchr.m4
@@ -0,0 +1,20 @@
+# rawmemchr.m4 serial 2
+dnl Copyright (C) 2003, 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_RAWMEMCHR],
+[
+ dnl Persuade glibc <string.h> to declare rawmemchr().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([rawmemchr])
+ if test $ac_cv_func_rawmemchr = no; then
+ HAVE_RAWMEMCHR=0
+ fi
+])
+
+# Prerequisites of lib/strchrnul.c.
+AC_DEFUN([gl_PREREQ_RAWMEMCHR], [:])
diff --git a/m4/readdir.m4 b/m4/readdir.m4
new file mode 100644
index 0000000..ca4e741
--- /dev/null
+++ b/m4/readdir.m4
@@ -0,0 +1,15 @@
+# readdir.m4 serial 1
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_READDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ AC_CHECK_FUNCS([readdir])
+ if test $ac_cv_func_readdir = no; then
+ HAVE_READDIR=0
+ fi
+])
diff --git a/m4/readlink.m4 b/m4/readlink.m4
new file mode 100644
index 0000000..c7f436a
--- /dev/null
+++ b/m4/readlink.m4
@@ -0,0 +1,114 @@
+# readlink.m4 serial 16
+dnl Copyright (C) 2003, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_READLINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS_ONCE([readlink])
+ if test $ac_cv_func_readlink = no; then
+ HAVE_READLINK=0
+ else
+ AC_CACHE_CHECK([whether readlink signature is correct],
+ [gl_cv_decl_readlink_works],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ /* Cause compilation failure if original declaration has wrong type. */
+ ssize_t readlink (const char *, char *, size_t);]])],
+ [gl_cv_decl_readlink_works=yes], [gl_cv_decl_readlink_works=no])])
+ dnl Solaris 9 ignores trailing slash.
+ dnl FreeBSD 7.2 dereferences only one level of links with trailing slash.
+ AC_CACHE_CHECK([whether readlink handles trailing slash correctly],
+ [gl_cv_func_readlink_trailing_slash],
+ [# We have readlink, so assume ln -s works.
+ ln -s conftest.no-such conftest.link
+ ln -s conftest.link conftest.lnk2
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+]], [[char buf[20];
+ return readlink ("conftest.lnk2/", buf, sizeof buf) != -1;]])],
+ [gl_cv_func_readlink_trailing_slash=yes],
+ [gl_cv_func_readlink_trailing_slash=no],
+ [case "$host_os" in
+ # Guess yes on Linux or glibc systems.
+ linux-* | linux | *-gnu* | gnu*)
+ gl_cv_func_readlink_trailing_slash="guessing yes" ;;
+ # Guess no on AIX or HP-UX.
+ aix* | hpux*)
+ gl_cv_func_readlink_trailing_slash="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_readlink_trailing_slash="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.link conftest.lnk2])
+ case "$gl_cv_func_readlink_trailing_slash" in
+ *yes)
+ if test "$gl_cv_decl_readlink_works" != yes; then
+ REPLACE_READLINK=1
+ fi
+ ;;
+ *)
+ AC_DEFINE([READLINK_TRAILING_SLASH_BUG], [1], [Define to 1 if readlink
+ fails to recognize a trailing slash.])
+ REPLACE_READLINK=1
+ ;;
+ esac
+
+ AC_CACHE_CHECK([whether readlink truncates results correctly],
+ [gl_cv_func_readlink_truncate],
+ [# We have readlink, so assume ln -s works.
+ ln -s ab conftest.link
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+]], [[char c;
+ return readlink ("conftest.link", &c, 1) != 1;]])],
+ [gl_cv_func_readlink_truncate=yes],
+ [gl_cv_func_readlink_truncate=no],
+ [case "$host_os" in
+ # Guess yes on Linux or glibc systems.
+ linux-* | linux | *-gnu* | gnu*)
+ gl_cv_func_readlink_truncate="guessing yes" ;;
+ # Guess no on AIX or HP-UX.
+ aix* | hpux*)
+ gl_cv_func_readlink_truncate="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_readlink_truncate="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.link conftest.lnk2])
+ case $gl_cv_func_readlink_truncate in
+ *yes)
+ if test "$gl_cv_decl_readlink_works" != yes; then
+ REPLACE_READLINK=1
+ fi
+ ;;
+ *)
+ AC_DEFINE([READLINK_TRUNCATE_BUG], [1], [Define to 1 if readlink
+ sets errno instead of truncating a too-long link.])
+ REPLACE_READLINK=1
+ ;;
+ esac
+ fi
+])
+
+# Like gl_FUNC_READLINK, except prepare for separate compilation
+# (no REPLACE_READLINK, no AC_LIBOBJ).
+AC_DEFUN([gl_FUNC_READLINK_SEPARATE],
+[
+ AC_CHECK_FUNCS_ONCE([readlink])
+ gl_PREREQ_READLINK
+])
+
+# Prerequisites of lib/readlink.c.
+AC_DEFUN([gl_PREREQ_READLINK],
+[
+ :
+])
diff --git a/m4/realloc.m4 b/m4/realloc.m4
new file mode 100644
index 0000000..53967f4
--- /dev/null
+++ b/m4/realloc.m4
@@ -0,0 +1,76 @@
+# realloc.m4 serial 19
+dnl Copyright (C) 2007, 2009-2020 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.
+
+# This is adapted with modifications from upstream Autoconf here:
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+AC_DEFUN([_AC_FUNC_REALLOC_IF],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+ AC_CACHE_CHECK([for GNU libc compatible realloc],
+ [ac_cv_func_realloc_0_nonnull],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdlib.h>
+ ]],
+ [[char *p = realloc (0, 0);
+ int result = !p;
+ free (p);
+ return result;]])
+ ],
+ [ac_cv_func_realloc_0_nonnull=yes],
+ [ac_cv_func_realloc_0_nonnull=no],
+ [case "$host_os" in
+ # Guess yes on platforms where we know the result.
+ *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
+ | hpux* | solaris* | cygwin* | mingw*)
+ ac_cv_func_realloc_0_nonnull="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) ac_cv_func_realloc_0_nonnull="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$ac_cv_func_realloc_0_nonnull" in
+ *yes)
+ $1
+ ;;
+ *)
+ $2
+ ;;
+ esac
+])# AC_FUNC_REALLOC
+
+# gl_FUNC_REALLOC_GNU
+# -------------------
+# Test whether 'realloc (0, 0)' is handled like in GNU libc, and replace
+# realloc if it is not.
+AC_DEFUN([gl_FUNC_REALLOC_GNU],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ dnl _AC_FUNC_REALLOC_IF is defined in Autoconf.
+ _AC_FUNC_REALLOC_IF(
+ [AC_DEFINE([HAVE_REALLOC_GNU], [1],
+ [Define to 1 if your system has a GNU libc compatible 'realloc'
+ function, and to 0 otherwise.])],
+ [AC_DEFINE([HAVE_REALLOC_GNU], [0])
+ REPLACE_REALLOC=1
+ ])
+])# gl_FUNC_REALLOC_GNU
+
+# gl_FUNC_REALLOC_POSIX
+# ---------------------
+# Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace realloc if it is not.
+AC_DEFUN([gl_FUNC_REALLOC_POSIX],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix = yes; then
+ AC_DEFINE([HAVE_REALLOC_POSIX], [1],
+ [Define if the 'realloc' function is POSIX compliant.])
+ else
+ REPLACE_REALLOC=1
+ fi
+])
diff --git a/m4/regex.m4 b/m4/regex.m4
new file mode 100644
index 0000000..effe100
--- /dev/null
+++ b/m4/regex.m4
@@ -0,0 +1,360 @@
+# serial 71
+
+# Copyright (C) 1996-2001, 2003-2020 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.
+
+dnl Initially derived from code in GNU grep.
+dnl Mostly written by Jim Meyering.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([gl_REGEX],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_ARG_WITH([included-regex],
+ [AS_HELP_STRING([--without-included-regex],
+ [don't compile regex; this is the default on systems
+ with recent-enough versions of the GNU C Library
+ (use with caution on other systems).])])
+
+ case $with_included_regex in #(
+ yes|no) ac_use_included_regex=$with_included_regex
+ ;;
+ '')
+ # If the system regex support is good enough that it passes the
+ # following run test, then default to *not* using the included regex.c.
+ # If cross compiling, assume the test would fail and use the included
+ # regex.c.
+ AC_CHECK_DECLS_ONCE([alarm])
+ AC_CHECK_HEADERS_ONCE([malloc.h])
+ AC_CACHE_CHECK([for working re_compile_pattern],
+ [gl_cv_func_re_compile_pattern_working],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <regex.h>
+
+ #include <locale.h>
+ #include <limits.h>
+ #include <string.h>
+
+ #if defined M_CHECK_ACTION || HAVE_DECL_ALARM
+ # include <signal.h>
+ # include <unistd.h>
+ #endif
+
+ #if HAVE_MALLOC_H
+ # include <malloc.h>
+ #endif
+
+ #ifdef M_CHECK_ACTION
+ /* Exit with distinguishable exit code. */
+ static void sigabrt_no_core (int sig) { raise (SIGTERM); }
+ #endif
+ ]],
+ [[int result = 0;
+ static struct re_pattern_buffer regex;
+ unsigned char folded_chars[UCHAR_MAX + 1];
+ int i;
+ const char *s;
+ struct re_registers regs;
+
+ /* Some builds of glibc go into an infinite loop on this
+ test. Use alarm to force death, and mallopt to avoid
+ malloc recursion in diagnosing the corrupted heap. */
+#if HAVE_DECL_ALARM
+ signal (SIGALRM, SIG_DFL);
+ alarm (2);
+#endif
+#ifdef M_CHECK_ACTION
+ signal (SIGABRT, sigabrt_no_core);
+ mallopt (M_CHECK_ACTION, 2);
+#endif
+
+ if (setlocale (LC_ALL, "en_US.UTF-8"))
+ {
+ {
+ /* https://sourceware.org/ml/libc-hacker/2006-09/msg00008.html
+ This test needs valgrind to catch the bug on Debian
+ GNU/Linux 3.1 x86, but it might catch the bug better
+ on other platforms and it shouldn't hurt to try the
+ test here. */
+ static char const pat[] = "insert into";
+ static char const data[] =
+ "\xFF\0\x12\xA2\xAA\xC4\xB1,K\x12\xC4\xB1*\xACK";
+ re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE
+ | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern (pat, sizeof pat - 1, &regex);
+ if (s)
+ result |= 1;
+ else
+ {
+ if (re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, &regs)
+ != -1)
+ result |= 1;
+ regfree (&regex);
+ }
+ }
+
+ {
+ /* This test is from glibc bug 15078.
+ The test case is from Andreas Schwab in
+ <https://sourceware.org/ml/libc-alpha/2013-01/msg00967.html>.
+ */
+ static char const pat[] = "[^x]x";
+ static char const data[] =
+ /* <U1000><U103B><U103D><U1014><U103A><U102F><U1015><U103A> */
+ "\xe1\x80\x80"
+ "\xe1\x80\xbb"
+ "\xe1\x80\xbd"
+ "\xe1\x80\x94"
+ "\xe1\x80\xba"
+ "\xe1\x80\xaf"
+ "\xe1\x80\x95"
+ "\xe1\x80\xba"
+ "x";
+ re_set_syntax (0);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern (pat, sizeof pat - 1, &regex);
+ if (s)
+ result |= 1;
+ else
+ {
+ i = re_search (&regex, data, sizeof data - 1,
+ 0, sizeof data - 1, 0);
+ if (i != 0 && i != 21)
+ result |= 1;
+ regfree (&regex);
+ }
+ }
+
+ if (! setlocale (LC_ALL, "C"))
+ return 1;
+ }
+
+ /* This test is from glibc bug 3957, reported by Andrew Mackey. */
+ re_set_syntax (RE_SYNTAX_EGREP | RE_HAT_LISTS_NOT_NEWLINE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[^x]b", 6, &regex);
+ if (s)
+ result |= 2;
+ else
+ {
+ /* This should fail, but succeeds for glibc-2.5. */
+ if (re_search (&regex, "a\nb", 3, 0, 3, &regs) != -1)
+ result |= 2;
+ regfree (&regex);
+ }
+
+ /* This regular expression is from Spencer ere test number 75
+ in grep-2.3. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ for (i = 0; i <= UCHAR_MAX; i++)
+ folded_chars[i] = i;
+ regex.translate = folded_chars;
+ s = re_compile_pattern ("a[[:@:>@:]]b\n", 11, &regex);
+ /* This should fail with _Invalid character class name_ error. */
+ if (!s)
+ {
+ result |= 4;
+ regfree (&regex);
+ }
+
+ /* Ensure that [b-a] is diagnosed as invalid, when
+ using RE_NO_EMPTY_RANGES. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP | RE_NO_EMPTY_RANGES);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("a[b-a]", 6, &regex);
+ if (s == 0)
+ {
+ result |= 8;
+ regfree (&regex);
+ }
+
+ /* This should succeed, but does not for glibc-2.1.3. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("{1", 2, &regex);
+ if (s)
+ result |= 8;
+ else
+ regfree (&regex);
+
+ /* The following example is derived from a problem report
+ against gawk from Jorge Stolfi <stolfi@ic.unicamp.br>. */
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[an\371]*n", 7, &regex);
+ if (s)
+ result |= 8;
+ else
+ {
+ /* This should match, but does not for glibc-2.2.1. */
+ if (re_match (&regex, "an", 2, 0, &regs) != 2)
+ result |= 8;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ result |= 8;
+ else
+ {
+ /* glibc-2.2.93 does not work with a negative RANGE argument. */
+ if (re_search (&regex, "wxy", 3, 2, -2, &regs) != 1)
+ result |= 8;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ /* The version of regex.c in older versions of gnulib
+ ignored RE_ICASE. Detect that problem too. */
+ re_set_syntax (RE_SYNTAX_EMACS | RE_ICASE);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("x", 1, &regex);
+ if (s)
+ result |= 16;
+ else
+ {
+ if (re_search (&regex, "WXY", 3, 0, 3, &regs) < 0)
+ result |= 16;
+ else
+ {
+ free (regs.start);
+ free (regs.end);
+ }
+ regfree (&regex);
+ }
+
+ /* Catch a bug reported by Vin Shelton in
+ https://lists.gnu.org/r/bug-coreutils/2007-06/msg00089.html
+ */
+ re_set_syntax (RE_SYNTAX_POSIX_BASIC
+ & ~RE_CONTEXT_INVALID_DUP
+ & ~RE_NO_EMPTY_RANGES);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("[[:alnum:]_-]\\\\+$", 16, &regex);
+ if (s)
+ result |= 32;
+ else
+ regfree (&regex);
+
+ /* REG_STARTEND was added to glibc on 2004-01-15.
+ Reject older versions. */
+ if (! REG_STARTEND)
+ result |= 64;
+
+ /* Matching with the compiled form of this regexp would provoke
+ an assertion failure prior to glibc-2.28:
+ regexec.c:1375: pop_fail_stack: Assertion 'num >= 0' failed
+ With glibc-2.28, compilation fails and reports the invalid
+ back reference. */
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&regex, 0, sizeof regex);
+ s = re_compile_pattern ("0|()0|\\1|0", 10, &regex);
+ if (!s)
+ result |= 64;
+ else
+ {
+ if (strcmp (s, "Invalid back reference"))
+ result |= 64;
+ regfree (&regex);
+ }
+
+#if 0
+ /* It would be nice to reject hosts whose regoff_t values are too
+ narrow (including glibc on hosts with 64-bit ptrdiff_t and
+ 32-bit int), but we should wait until glibc implements this
+ feature. Otherwise, support for equivalence classes and
+ multibyte collation symbols would always be broken except
+ when compiling --without-included-regex. */
+ if (sizeof (regoff_t) < sizeof (ptrdiff_t)
+ || sizeof (regoff_t) < sizeof (ssize_t))
+ result |= 64;
+#endif
+
+ return result;
+ ]])],
+ [gl_cv_func_re_compile_pattern_working=yes],
+ [gl_cv_func_re_compile_pattern_working=no],
+ [case "$host_os" in
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_re_compile_pattern_working="guessing no" ;;
+ # Otherwise obey --enable-cross-guesses.
+ *) gl_cv_func_re_compile_pattern_working="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_re_compile_pattern_working" in #(
+ *yes) ac_use_included_regex=no;; #(
+ *no) ac_use_included_regex=yes;;
+ esac
+ ;;
+ *) AC_MSG_ERROR([Invalid value for --with-included-regex: $with_included_regex])
+ ;;
+ esac
+
+ if test $ac_use_included_regex = yes; then
+ AC_DEFINE([_REGEX_INCLUDE_LIMITS_H], [1],
+ [Define if you want <regex.h> to include <limits.h>, so that it
+ consistently overrides <limits.h>'s RE_DUP_MAX.])
+ AC_DEFINE([_REGEX_LARGE_OFFSETS], [1],
+ [Define if you want regoff_t to be at least as wide POSIX requires.])
+ AC_DEFINE([re_syntax_options], [rpl_re_syntax_options],
+ [Define to rpl_re_syntax_options if the replacement should be used.])
+ AC_DEFINE([re_set_syntax], [rpl_re_set_syntax],
+ [Define to rpl_re_set_syntax if the replacement should be used.])
+ AC_DEFINE([re_compile_pattern], [rpl_re_compile_pattern],
+ [Define to rpl_re_compile_pattern if the replacement should be used.])
+ AC_DEFINE([re_compile_fastmap], [rpl_re_compile_fastmap],
+ [Define to rpl_re_compile_fastmap if the replacement should be used.])
+ AC_DEFINE([re_search], [rpl_re_search],
+ [Define to rpl_re_search if the replacement should be used.])
+ AC_DEFINE([re_search_2], [rpl_re_search_2],
+ [Define to rpl_re_search_2 if the replacement should be used.])
+ AC_DEFINE([re_match], [rpl_re_match],
+ [Define to rpl_re_match if the replacement should be used.])
+ AC_DEFINE([re_match_2], [rpl_re_match_2],
+ [Define to rpl_re_match_2 if the replacement should be used.])
+ AC_DEFINE([re_set_registers], [rpl_re_set_registers],
+ [Define to rpl_re_set_registers if the replacement should be used.])
+ AC_DEFINE([re_comp], [rpl_re_comp],
+ [Define to rpl_re_comp if the replacement should be used.])
+ AC_DEFINE([re_exec], [rpl_re_exec],
+ [Define to rpl_re_exec if the replacement should be used.])
+ AC_DEFINE([regcomp], [rpl_regcomp],
+ [Define to rpl_regcomp if the replacement should be used.])
+ AC_DEFINE([regexec], [rpl_regexec],
+ [Define to rpl_regexec if the replacement should be used.])
+ AC_DEFINE([regerror], [rpl_regerror],
+ [Define to rpl_regerror if the replacement should be used.])
+ AC_DEFINE([regfree], [rpl_regfree],
+ [Define to rpl_regfree if the replacement should be used.])
+ fi
+])
+
+# Prerequisites of lib/regex.c and lib/regex_internal.c.
+AC_DEFUN([gl_PREREQ_REGEX],
+[
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ AC_REQUIRE([gl_EEMALLOC])
+ AC_CHECK_HEADERS([libintl.h])
+ AC_CHECK_FUNCS_ONCE([isblank iswctype])
+ AC_CHECK_DECLS([isblank], [], [], [[#include <ctype.h>]])
+])
diff --git a/m4/rewinddir.m4 b/m4/rewinddir.m4
new file mode 100644
index 0000000..51f476b
--- /dev/null
+++ b/m4/rewinddir.m4
@@ -0,0 +1,15 @@
+# rewinddir.m4 serial 1
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_REWINDDIR],
+[
+ AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+ AC_CHECK_FUNCS([rewinddir])
+ if test $ac_cv_func_rewinddir = no; then
+ HAVE_REWINDDIR=0
+ fi
+])
diff --git a/m4/save-cwd.m4 b/m4/save-cwd.m4
new file mode 100644
index 0000000..a401b1f
--- /dev/null
+++ b/m4/save-cwd.m4
@@ -0,0 +1,11 @@
+# serial 10
+dnl Copyright (C) 2002-2006, 2009-2020 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 Prerequisites for lib/save-cwd.c.
+AC_DEFUN([gl_SAVE_CWD],
+[
+ AC_CHECK_FUNCS_ONCE([fchdir])
+])
diff --git a/m4/sched_h.m4 b/m4/sched_h.m4
new file mode 100644
index 0000000..af0c43d
--- /dev/null
+++ b/m4/sched_h.m4
@@ -0,0 +1,91 @@
+# sched_h.m4 serial 12
+dnl Copyright (C) 2008-2020 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 Written by Bruno Haible.
+
+AC_DEFUN([gl_SCHED_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SCHED_H_DEFAULTS])
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ AC_CHECK_HEADERS_ONCE([sys/cdefs.h])
+ AC_CHECK_HEADERS([sched.h], [], [],
+ [[#if HAVE_SYS_CDEFS_H
+ #include <sys/cdefs.h>
+ #endif
+ ]])
+ gl_NEXT_HEADERS([sched.h])
+
+ if test "$ac_cv_header_sched_h" = yes; then
+ HAVE_SCHED_H=1
+ else
+ HAVE_SCHED_H=0
+ fi
+ AC_SUBST([HAVE_SCHED_H])
+
+ if test "$HAVE_SCHED_H" = 1; then
+ AC_CHECK_TYPE([struct sched_param],
+ [HAVE_STRUCT_SCHED_PARAM=1], [HAVE_STRUCT_SCHED_PARAM=0],
+ [[#if HAVE_SYS_CDEFS_H
+ #include <sys/cdefs.h>
+ #endif
+ #include <sched.h>
+ ]])
+ else
+ HAVE_STRUCT_SCHED_PARAM=0
+ case "$host_os" in
+ os2*)
+ dnl On OS/2 kLIBC, struct sched_param is in spawn.h.
+ AC_CHECK_TYPE([struct sched_param],
+ [HAVE_STRUCT_SCHED_PARAM=1], [],
+ [#include <spawn.h>])
+ ;;
+ vms)
+ dnl On OpenVMS 7.2 or newer, struct sched_param is in pthread.h.
+ AC_CHECK_TYPE([struct sched_param],
+ [HAVE_STRUCT_SCHED_PARAM=1], [],
+ [#include <pthread.h>])
+ ;;
+ esac
+ fi
+ AC_SUBST([HAVE_STRUCT_SCHED_PARAM])
+
+ if test "$ac_cv_header_sys_cdefs_h" = yes; then
+ HAVE_SYS_CDEFS_H=1
+ else
+ HAVE_SYS_CDEFS_H=0
+ fi
+ AC_SUBST([HAVE_SYS_CDEFS_H])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, if it is not common
+ dnl enough to be declared everywhere.
+ gl_WARN_ON_USE_PREPARE([[#include <sched.h>
+ ]], [sched_yield])
+])
+
+AC_DEFUN([gl_SCHED_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SCHED_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SCHED_H_DEFAULTS],
+[
+ GNULIB_SCHED_YIELD=0; AC_SUBST([GNULIB_SCHED_YIELD])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_SCHED_YIELD=1; AC_SUBST([HAVE_SCHED_YIELD])
+ REPLACE_SCHED_YIELD=0; AC_SUBST([REPLACE_SCHED_YIELD])
+])
diff --git a/m4/secure_getenv.m4 b/m4/secure_getenv.m4
new file mode 100644
index 0000000..29e2f53
--- /dev/null
+++ b/m4/secure_getenv.m4
@@ -0,0 +1,26 @@
+# Look up an environment variable more securely.
+dnl Copyright 2013-2020 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.
+
+AC_DEFUN([gl_FUNC_SECURE_GETENV],
+[
+ dnl Persuade glibc <stdlib.h> to declare secure_getenv().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([secure_getenv])
+ if test $ac_cv_func_secure_getenv = no; then
+ HAVE_SECURE_GETENV=0
+ fi
+])
+
+# Prerequisites of lib/secure_getenv.c.
+AC_DEFUN([gl_PREREQ_SECURE_GETENV], [
+ AC_CHECK_FUNCS([__secure_getenv])
+ if test $ac_cv_func___secure_getenv = no; then
+ AC_CHECK_FUNCS([issetugid])
+ fi
+ AC_CHECK_FUNCS_ONCE([getuid geteuid getgid getegid])
+])
diff --git a/m4/select.m4 b/m4/select.m4
new file mode 100644
index 0000000..90d2bb9
--- /dev/null
+++ b/m4/select.m4
@@ -0,0 +1,117 @@
+# select.m4 serial 12
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_SELECT],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SELECT])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_SOCKETS])
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ REPLACE_SELECT=1
+ else
+ dnl On Interix 3.5, select(0, NULL, NULL, NULL, timeout) fails with error
+ dnl EFAULT.
+ AC_CHECK_HEADERS_ONCE([sys/select.h])
+ AC_CACHE_CHECK([whether select supports a 0 argument],
+ [gl_cv_func_select_supports0],
+ [
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+int main ()
+{
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &timeout) < 0;
+}]])], [gl_cv_func_select_supports0=yes], [gl_cv_func_select_supports0=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on Interix.
+ interix*) gl_cv_func_select_supports0="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_select_supports0="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_select_supports0" in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+
+ dnl On FreeBSD 8.2, select() doesn't always reject bad fds.
+ AC_CACHE_CHECK([whether select detects invalid fds],
+ [gl_cv_func_select_detects_ebadf],
+ [
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/time.h>
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+#include <unistd.h>
+#include <errno.h>
+]GL_MDA_DEFINES],
+[[
+ fd_set set;
+ dup2(0, 16);
+ FD_ZERO(&set);
+ FD_SET(16, &set);
+ close(16);
+ struct timeval timeout;
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 5;
+ return select (17, &set, NULL, NULL, &timeout) != -1 || errno != EBADF;
+]])], [gl_cv_func_select_detects_ebadf=yes],
+ [gl_cv_func_select_detects_ebadf=no],
+ [
+ case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_select_detects_ebadf="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_select_detects_ebadf="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case $gl_cv_func_select_detects_ebadf in
+ *yes) ;;
+ *) REPLACE_SELECT=1 ;;
+ esac
+ fi
+
+ dnl Determine the needed libraries.
+ LIB_SELECT="$LIBSOCKET"
+ if test $REPLACE_SELECT = 1; then
+ case "$host_os" in
+ mingw*)
+ dnl On the MSVC platform, the function MsgWaitForMultipleObjects
+ dnl (used in lib/select.c) requires linking with -luser32. On mingw,
+ dnl it is implicit.
+ AC_LINK_IFELSE(
+ [AC_LANG_SOURCE([[
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+int
+main ()
+{
+ MsgWaitForMultipleObjects (0, NULL, 0, 0, 0);
+ return 0;
+}]])],
+ [],
+ [LIB_SELECT="$LIB_SELECT -luser32"])
+ ;;
+ esac
+ fi
+ AC_SUBST([LIB_SELECT])
+])
diff --git a/m4/servent.m4 b/m4/servent.m4
new file mode 100644
index 0000000..2041c7e
--- /dev/null
+++ b/m4/servent.m4
@@ -0,0 +1,51 @@
+# servent.m4 serial 3
+dnl Copyright (C) 2008, 2010-2020 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.
+
+AC_DEFUN([gl_SERVENT],
+[
+ dnl Where are getservent(), setservent(), endservent(), getservbyname(),
+ dnl getservbyport() defined?
+ dnl Where are getprotoent(), setprotoent(), endprotoent(), getprotobyname(),
+ dnl getprotobynumber() defined?
+ dnl - On Solaris < 11.4, they are in libsocket. Ignore libxnet.
+ dnl - On Haiku, they are in libnetwork.
+ dnl - On BeOS, they are in libnet.
+ dnl - On native Windows, they are in ws2_32.dll.
+ dnl - Otherwise they are in libc.
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])dnl for HAVE_SYS_SOCKET_H, HAVE_WINSOCK2_H
+ SERVENT_LIB=
+ gl_saved_libs="$LIBS"
+ AC_SEARCH_LIBS([getservbyname], [socket network net],
+ [if test "$ac_cv_search_getservbyname" != "none required"; then
+ SERVENT_LIB="$ac_cv_search_getservbyname"
+ fi])
+ LIBS="$gl_saved_libs"
+ if test -z "$SERVENT_LIB"; then
+ AC_CHECK_FUNCS([getservbyname], , [
+ AC_CACHE_CHECK([for getservbyname in winsock2.h and -lws2_32],
+ [gl_cv_w32_getservbyname],
+ [gl_cv_w32_getservbyname=no
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#include <stddef.h>
+ ]],
+ [[getservbyname(NULL,NULL);]])],
+ [gl_cv_w32_getservbyname=yes])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_w32_getservbyname" = "yes"; then
+ SERVENT_LIB="-lws2_32"
+ fi
+ ])
+ fi
+ AC_SUBST([SERVENT_LIB])
+])
diff --git a/m4/setlocale_null.m4 b/m4/setlocale_null.m4
new file mode 100644
index 0000000..fc1e3e1
--- /dev/null
+++ b/m4/setlocale_null.m4
@@ -0,0 +1,98 @@
+# setlocale_null.m4 serial 4
+dnl Copyright (C) 2019-2020 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.
+
+AC_DEFUN([gl_FUNC_SETLOCALE_NULL],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_PTHREADLIB])
+ AC_CHECK_HEADERS_ONCE([threads.h])
+
+ AC_CACHE_CHECK([whether setlocale (LC_ALL, NULL) is multithread-safe],
+ [gl_cv_func_setlocale_null_all_mtsafe],
+ [case "$host_os" in
+ # Guess no on musl libc, macOS, FreeBSD, NetBSD, OpenBSD, AIX, Haiku, Cygwin.
+ *-musl* | darwin* | freebsd* | netbsd* | openbsd* | aix* | haiku* | cygwin*)
+ gl_cv_func_setlocale_null_all_mtsafe=no ;;
+ # Guess yes on glibc, HP-UX, IRIX, Solaris, native Windows.
+ *-gnu* | gnu* | hpux* | irix* | solaris* | mingw*)
+ gl_cv_func_setlocale_null_all_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_all_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ dnl On platforms without multithreading, there is no issue.
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_all_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_all_mtsafe" in
+ *yes) SETLOCALE_NULL_ALL_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ALL_MTSAFE=0 ;;
+ esac
+ AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ALL_MTSAFE], [$SETLOCALE_NULL_ALL_MTSAFE],
+ [Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe.])
+
+ dnl This is about a single category (not LC_ALL).
+ AC_CACHE_CHECK([whether setlocale (category, NULL) is multithread-safe],
+ [gl_cv_func_setlocale_null_one_mtsafe],
+ [case "$host_os" in
+ # Guess no on OpenBSD, AIX.
+ openbsd* | aix*)
+ gl_cv_func_setlocale_null_one_mtsafe=no ;;
+ # Guess yes on glibc, musl libc, macOS, FreeBSD, NetBSD, HP-UX, IRIX, Solaris, Haiku, Cygwin, native Windows.
+ *-gnu* | gnu* | *-musl* | darwin* | freebsd* | netbsd* | hpux* | irix* | solaris* | haiku* | cygwin* | mingw*)
+ gl_cv_func_setlocale_null_one_mtsafe=yes ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *)
+ gl_cv_func_setlocale_null_one_mtsafe="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ dnl On platforms without multithreading, there is no issue.
+ case "$host_os" in
+ mingw*) ;;
+ *)
+ if test $gl_pthread_api = no && test $ac_cv_header_threads_h = no; then
+ gl_cv_func_setlocale_null_one_mtsafe="trivially yes"
+ fi
+ ;;
+ esac
+ case "$gl_cv_func_setlocale_null_one_mtsafe" in
+ *yes) SETLOCALE_NULL_ONE_MTSAFE=1 ;;
+ *) SETLOCALE_NULL_ONE_MTSAFE=0 ;;
+ esac
+ AC_DEFINE_UNQUOTED([SETLOCALE_NULL_ONE_MTSAFE], [$SETLOCALE_NULL_ONE_MTSAFE],
+ [Define to 1 if setlocale (category, NULL) is multithread-safe.])
+
+ dnl Determine link dependencies of lib/setlocale_null.c and lib/setlocale-lock.c.
+ if test $SETLOCALE_NULL_ALL_MTSAFE = 0 || test $SETLOCALE_NULL_ONE_MTSAFE = 0; then
+ case "$host_os" in
+ mingw*) LIB_SETLOCALE_NULL= ;;
+ *)
+ gl_WEAK_SYMBOLS
+ case "$gl_cv_have_weak" in
+ *yes) LIB_SETLOCALE_NULL= ;;
+ *) LIB_SETLOCALE_NULL="$LIBPTHREAD" ;;
+ esac
+ ;;
+ esac
+ else
+ LIB_SETLOCALE_NULL=
+ fi
+ dnl LIB_SETLOCALE_NULL is expected to be '-pthread' or '-lpthread' on AIX
+ dnl with gcc or xlc, and empty otherwise.
+ AC_SUBST([LIB_SETLOCALE_NULL])
+])
+
+# Prerequisites of lib/setlocale-lock.c.
+AC_DEFUN([gl_PREREQ_SETLOCALE_LOCK],
+[
+ gl_VISIBILITY
+])
diff --git a/m4/sh-filename.m4 b/m4/sh-filename.m4
new file mode 100644
index 0000000..63bbd67
--- /dev/null
+++ b/m4/sh-filename.m4
@@ -0,0 +1,24 @@
+# sh-filename.m4 serial 3
+dnl Copyright (C) 2018-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SH_FILENAME],
+[
+ AH_VERBATIM([SH_FILENAME],
+[/* File name of the Bourne shell. */
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
+/* Omit the directory part because
+ - For native Windows programs in a Cygwin environment, the Cygwin mounts
+ are not visible.
+ - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
+ mounts are not visible.
+ - On Android, /bin/sh does not exist. It's /system/bin/sh instead. */
+# define BOURNE_SHELL "sh"
+#else
+# define BOURNE_SHELL "/bin/sh"
+#endif])
+])
diff --git a/m4/sha1.m4 b/m4/sha1.m4
new file mode 100644
index 0000000..35e3f75
--- /dev/null
+++ b/m4/sha1.m4
@@ -0,0 +1,14 @@
+# sha1.m4 serial 12
+dnl Copyright (C) 2002-2006, 2008-2020 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.
+
+AC_DEFUN([gl_SHA1],
+[
+ dnl Prerequisites of lib/sha1.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+
+ dnl Determine HAVE_OPENSSL_SHA1 and LIB_CRYPTO
+ gl_CRYPTO_CHECK([SHA1])
+])
diff --git a/m4/sha256.m4 b/m4/sha256.m4
new file mode 100644
index 0000000..85ff1d5
--- /dev/null
+++ b/m4/sha256.m4
@@ -0,0 +1,14 @@
+# sha256.m4 serial 8
+dnl Copyright (C) 2005, 2008-2020 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.
+
+AC_DEFUN([gl_SHA256],
+[
+ dnl Prerequisites of lib/sha256.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+
+ dnl Determine HAVE_OPENSSL_SHA256 and LIB_CRYPTO
+ gl_CRYPTO_CHECK([SHA256])
+])
diff --git a/m4/sha512.m4 b/m4/sha512.m4
new file mode 100644
index 0000000..fe1592a
--- /dev/null
+++ b/m4/sha512.m4
@@ -0,0 +1,14 @@
+# sha512.m4 serial 9
+dnl Copyright (C) 2005-2006, 2008-2020 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.
+
+AC_DEFUN([gl_SHA512],
+[
+ dnl Prerequisites of lib/sha512.c.
+ AC_REQUIRE([gl_BIGENDIAN])
+
+ dnl Determine HAVE_OPENSSL_SHA512 and LIB_CRYPTO
+ gl_CRYPTO_CHECK([SHA512])
+])
diff --git a/m4/sig_atomic_t.m4 b/m4/sig_atomic_t.m4
new file mode 100644
index 0000000..d695caa
--- /dev/null
+++ b/m4/sig_atomic_t.m4
@@ -0,0 +1,14 @@
+# sig_atomic_t.m4 serial 3
+dnl Copyright (C) 2003, 2009-2020 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.
+
+AC_DEFUN([gt_TYPE_SIG_ATOMIC_T],
+[
+ AC_CHECK_TYPES([sig_atomic_t], ,
+ [AC_DEFINE([sig_atomic_t], [int],
+ [Define as an integer type suitable for memory locations that can be
+ accessed atomically even in the presence of asynchronous signals.])],
+ [#include <signal.h>])
+])
diff --git a/m4/sigaction.m4 b/m4/sigaction.m4
new file mode 100644
index 0000000..9a2d201
--- /dev/null
+++ b/m4/sigaction.m4
@@ -0,0 +1,40 @@
+# sigaction.m4 serial 7
+dnl Copyright (C) 2008-2020 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.
+
+# Determine if sigaction interface is present.
+AC_DEFUN([gl_SIGACTION],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([sigaction])
+ if test $ac_cv_func_sigaction = yes; then
+ AC_CHECK_MEMBERS([struct sigaction.sa_sigaction], , ,
+ [[#include <signal.h>]])
+ if test $ac_cv_member_struct_sigaction_sa_sigaction = no; then
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=0
+ fi
+ else
+ HAVE_SIGACTION=0
+ fi
+])
+
+# Prerequisites of the part of lib/signal.in.h and of lib/sigaction.c.
+AC_DEFUN([gl_PREREQ_SIGACTION],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([AC_TYPE_UID_T])
+ AC_REQUIRE([gl_PREREQ_SIG_HANDLER_H])
+ AC_CHECK_FUNCS_ONCE([sigaltstack siginterrupt])
+ AC_CHECK_TYPES([siginfo_t], [], [], [[
+#include <signal.h>
+ ]])
+ if test $ac_cv_type_siginfo_t = no; then
+ HAVE_SIGINFO_T=0
+ fi
+])
+
+# Prerequisites of lib/sig-handler.h.
+AC_DEFUN([gl_PREREQ_SIG_HANDLER_H], [:])
diff --git a/m4/signal_h.m4 b/m4/signal_h.m4
new file mode 100644
index 0000000..b262980
--- /dev/null
+++ b/m4/signal_h.m4
@@ -0,0 +1,85 @@
+# signal_h.m4 serial 19
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_SIGNAL_H],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
+ gl_NEXT_HEADERS([signal.h])
+
+# AIX declares sig_atomic_t to already include volatile, and C89 compilers
+# then choke on 'volatile sig_atomic_t'. C99 requires that it compile.
+ AC_CHECK_TYPE([volatile sig_atomic_t], [],
+ [HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=0], [[
+#include <signal.h>
+ ]])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ AC_REQUIRE([AC_TYPE_UID_T])
+
+ dnl Persuade glibc <signal.h> to define sighandler_t.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_TYPE([sighandler_t], [], [HAVE_SIGHANDLER_T=0], [[
+#include <signal.h>
+ ]])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <signal.h>
+ ]], [pthread_sigmask sigaction
+ sigaddset sigdelset sigemptyset sigfillset sigismember
+ sigpending sigprocmask])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+AC_DEFUN([gl_CHECK_TYPE_SIGSET_T],
+[
+ AC_CHECK_TYPES([sigset_t],
+ [gl_cv_type_sigset_t=yes], [gl_cv_type_sigset_t=no],
+ [[
+ #include <signal.h>
+ /* Mingw defines sigset_t not in <signal.h>, but in <sys/types.h>. */
+ #include <sys/types.h>
+ ]])
+ if test $gl_cv_type_sigset_t != yes; then
+ HAVE_SIGSET_T=0
+ fi
+])
+
+AC_DEFUN([gl_SIGNAL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SIGNAL_H_DEFAULTS],
+[
+ GNULIB_PTHREAD_SIGMASK=0; AC_SUBST([GNULIB_PTHREAD_SIGMASK])
+ GNULIB_RAISE=0; AC_SUBST([GNULIB_RAISE])
+ GNULIB_SIGNAL_H_SIGPIPE=0; AC_SUBST([GNULIB_SIGNAL_H_SIGPIPE])
+ GNULIB_SIGPROCMASK=0; AC_SUBST([GNULIB_SIGPROCMASK])
+ GNULIB_SIGACTION=0; AC_SUBST([GNULIB_SIGACTION])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_POSIX_SIGNALBLOCKING=1; AC_SUBST([HAVE_POSIX_SIGNALBLOCKING])
+ HAVE_PTHREAD_SIGMASK=1; AC_SUBST([HAVE_PTHREAD_SIGMASK])
+ HAVE_RAISE=1; AC_SUBST([HAVE_RAISE])
+ HAVE_SIGSET_T=1; AC_SUBST([HAVE_SIGSET_T])
+ HAVE_SIGINFO_T=1; AC_SUBST([HAVE_SIGINFO_T])
+ HAVE_SIGACTION=1; AC_SUBST([HAVE_SIGACTION])
+ HAVE_STRUCT_SIGACTION_SA_SIGACTION=1;
+ AC_SUBST([HAVE_STRUCT_SIGACTION_SA_SIGACTION])
+ HAVE_TYPE_VOLATILE_SIG_ATOMIC_T=1;
+ AC_SUBST([HAVE_TYPE_VOLATILE_SIG_ATOMIC_T])
+ HAVE_SIGHANDLER_T=1; AC_SUBST([HAVE_SIGHANDLER_T])
+ REPLACE_PTHREAD_SIGMASK=0; AC_SUBST([REPLACE_PTHREAD_SIGMASK])
+ REPLACE_RAISE=0; AC_SUBST([REPLACE_RAISE])
+])
diff --git a/m4/signalblocking.m4 b/m4/signalblocking.m4
new file mode 100644
index 0000000..b7cff8d
--- /dev/null
+++ b/m4/signalblocking.m4
@@ -0,0 +1,23 @@
+# signalblocking.m4 serial 17
+dnl Copyright (C) 2001-2002, 2006-2020 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.
+
+# Determine available signal blocking primitives. Three different APIs exist:
+# 1) POSIX: sigemptyset, sigaddset, sigprocmask
+# 2) SYSV: sighold, sigrelse
+# 3) BSD: sigblock, sigsetmask
+# For simplicity, here we check only for the POSIX signal blocking.
+AC_DEFUN([gl_SIGNALBLOCKING],
+[
+ AC_REQUIRE([gl_SIGNAL_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_TYPE_SIGSET_T])
+ HAVE_POSIX_SIGNALBLOCKING=0
+ if test "$gl_cv_type_sigset_t" = yes; then
+ AC_CHECK_FUNC([sigprocmask], [HAVE_POSIX_SIGNALBLOCKING=1])
+ fi
+])
+
+# Prerequisites of lib/sigprocmask.c.
+AC_DEFUN([gl_PREREQ_SIGPROCMASK], [:])
diff --git a/m4/sigpipe.m4 b/m4/sigpipe.m4
new file mode 100644
index 0000000..dfbf4e0
--- /dev/null
+++ b/m4/sigpipe.m4
@@ -0,0 +1,29 @@
+# sigpipe.m4 serial 2
+dnl Copyright (C) 2008-2020 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 Tests whether SIGPIPE is provided by <signal.h>.
+dnl Sets gl_cv_header_signal_h_SIGPIPE.
+AC_DEFUN([gl_SIGNAL_SIGPIPE],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SIGNAL_SIGPIPE_BODY])
+])
+
+AC_DEFUN([gl_SIGNAL_SIGPIPE_BODY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ AC_CACHE_CHECK([for SIGPIPE], [gl_cv_header_signal_h_SIGPIPE], [
+ AC_EGREP_CPP([booboo],[
+#include <signal.h>
+#if !defined SIGPIPE
+booboo
+#endif
+ ],
+ [gl_cv_header_signal_h_SIGPIPE=no],
+ [gl_cv_header_signal_h_SIGPIPE=yes])
+ ])
+])
diff --git a/m4/size_max.m4 b/m4/size_max.m4
new file mode 100644
index 0000000..6ebb93f
--- /dev/null
+++ b/m4/size_max.m4
@@ -0,0 +1,75 @@
+# size_max.m4 serial 12
+dnl Copyright (C) 2003, 2005-2006, 2008-2020 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.61])
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+ AC_CHECK_HEADERS([stdint.h])
+ dnl First test whether the system already has SIZE_MAX.
+ AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
+ gl_cv_size_max=no
+ AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], [gl_cv_size_max=yes])
+ if test $gl_cv_size_max != yes; then
+ dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+ dnl than the type 'unsigned long'. Try hard to find a definition that can
+ dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+ AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+ [#include <stddef.h>
+#include <limits.h>], [size_t_bits_minus_1=])
+ AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+ [#include <stddef.h>], [fits_in_uint=])
+ if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+ if test $fits_in_uint = 1; then
+ dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+ dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ extern size_t foo;
+ extern unsigned long foo;
+ ]],
+ [[]])],
+ [fits_in_uint=0])
+ fi
+ dnl We cannot use 'expr' to simplify this expression, because 'expr'
+ dnl works only with 'long' integers in the host environment, while we
+ dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+ if test $fits_in_uint = 1; then
+ gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ else
+ gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+ fi
+ else
+ dnl Shouldn't happen, but who knows...
+ gl_cv_size_max='((size_t)~(size_t)0)'
+ fi
+ fi
+ ])
+ if test "$gl_cv_size_max" != yes; then
+ AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+ [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+ fi
+ dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
+ dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
+ dnl #define by AC_DEFINE_UNQUOTED.
+ AH_VERBATIM([SIZE_MAX],
+[/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif])
+])
diff --git a/m4/snprintf.m4 b/m4/snprintf.m4
new file mode 100644
index 0000000..126039d
--- /dev/null
+++ b/m4/snprintf.m4
@@ -0,0 +1,62 @@
+# snprintf.m4 serial 7
+dnl Copyright (C) 2002-2004, 2007-2020 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 Libintl 0.17 will replace snprintf only if it does not support %1$s,
+dnl but defers to any gnulib snprintf replacements. Therefore, gnulib
+dnl must guarantee that the decision for replacing snprintf is a superset
+dnl of the reasons checked by libintl.
+AC_DEFUN([gl_FUNC_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_snprintf_usable=no
+ AC_CHECK_FUNCS([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_SNPRINTF_RETVAL_C99
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ gl_PRINTF_POSITIONS
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_snprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_snprintf_usable = no; then
+ gl_REPLACE_SNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([snprintf])
+ if test $ac_cv_have_decl_snprintf = no; then
+ HAVE_DECL_SNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_SNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([snprintf])
+ if test $ac_cv_func_snprintf = yes; then
+ REPLACE_SNPRINTF=1
+ else
+ AC_CHECK_DECLS_ONCE([snprintf])
+ if test $ac_cv_have_decl_snprintf = yes; then
+ dnl If the function is declared but does not appear to exist, it may be
+ dnl defined as an inline function. In order to avoid a conflict, we have
+ dnl to define rpl_snprintf, not snprintf.
+ REPLACE_SNPRINTF=1
+ fi
+ fi
+ gl_PREREQ_SNPRINTF
+])
+
+# Prerequisites of lib/snprintf.c.
+AC_DEFUN([gl_PREREQ_SNPRINTF], [:])
diff --git a/m4/socketlib.m4 b/m4/socketlib.m4
new file mode 100644
index 0000000..48dd7d6
--- /dev/null
+++ b/m4/socketlib.m4
@@ -0,0 +1,96 @@
+# socketlib.m4 serial 3
+dnl Copyright (C) 2008-2020 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 gl_SOCKETLIB
+dnl Determines the library to use for socket functions.
+dnl Sets and AC_SUBSTs LIBSOCKET.
+
+AC_DEFUN([gl_SOCKETLIB],
+[
+ gl_PREREQ_SYS_H_WINSOCK2 dnl for HAVE_WINSOCK2_H
+ LIBSOCKET=
+ if test $HAVE_WINSOCK2_H = 1; then
+ dnl Native Windows API (not Cygwin).
+ dnl If the function WSAStartup exists (declared in <winsock2.h> and
+ dnl defined through -lws2_32), we need to call it.
+ AC_CACHE_CHECK([for WSAStartup],
+ [gl_cv_func_wsastartup], [
+ gl_save_LIBS="$LIBS"
+ LIBS="$LIBS -lws2_32"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[
+#ifdef HAVE_WINSOCK2_H
+# include <winsock2.h>
+#endif]], [[
+ WORD wVersionRequested = MAKEWORD(1, 1);
+ WSADATA wsaData;
+ int err = WSAStartup(wVersionRequested, &wsaData);
+ WSACleanup ();
+ ]])
+ ],
+ [gl_cv_func_wsastartup=yes],
+ [gl_cv_func_wsastartup=no])
+ LIBS="$gl_save_LIBS"
+ ])
+ if test "$gl_cv_func_wsastartup" = "yes"; then
+ AC_DEFINE([WINDOWS_SOCKETS], [1], [Define if WSAStartup is needed.])
+ LIBSOCKET='-lws2_32'
+ fi
+ else
+ dnl Unix API.
+ dnl Solaris has most socket functions in libsocket.
+ dnl Haiku has most socket functions in libnetwork.
+ dnl BeOS has most socket functions in libnet.
+ dnl On HP-UX, do NOT link with libxnet, because in 64-bit mode this would
+ dnl break code (e.g. in libraries) that invokes accept(), getpeername(),
+ dnl getsockname(), getsockopt(), or recvfrom() with a 32-bit addrlen. See
+ dnl "man xopen_networking" for details.
+ AC_CACHE_CHECK([for library containing setsockopt], [gl_cv_lib_socket], [
+ gl_cv_lib_socket=
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [],
+ [gl_save_LIBS="$LIBS"
+ LIBS="$gl_save_LIBS -lsocket"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lsocket"])
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnetwork"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lnetwork"])
+ if test -z "$gl_cv_lib_socket"; then
+ LIBS="$gl_save_LIBS -lnet"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern
+#ifdef __cplusplus
+"C"
+#endif
+char setsockopt();]], [[setsockopt();]])],
+ [gl_cv_lib_socket="-lnet"])
+ fi
+ fi
+ LIBS="$gl_save_LIBS"
+ ])
+ if test -z "$gl_cv_lib_socket"; then
+ gl_cv_lib_socket="none needed"
+ fi
+ ])
+ if test "$gl_cv_lib_socket" != "none needed"; then
+ LIBSOCKET="$gl_cv_lib_socket"
+ fi
+ fi
+ AC_SUBST([LIBSOCKET])
+])
diff --git a/m4/sockets.m4 b/m4/sockets.m4
new file mode 100644
index 0000000..7e53ef2
--- /dev/null
+++ b/m4/sockets.m4
@@ -0,0 +1,17 @@
+# sockets.m4 serial 7
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_SOCKETS],
+[
+ AC_REQUIRE([AC_C_INLINE])
+ AC_REQUIRE([gl_SOCKETLIB])
+ gl_PREREQ_SOCKETS
+])
+
+# Prerequisites of lib/sockets.c.
+AC_DEFUN([gl_PREREQ_SOCKETS], [
+ :
+])
diff --git a/m4/socklen.m4 b/m4/socklen.m4
new file mode 100644
index 0000000..251960b
--- /dev/null
+++ b/m4/socklen.m4
@@ -0,0 +1,76 @@
+# socklen.m4 serial 11
+dnl Copyright (C) 2005-2007, 2009-2020 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 Albert Chin, Windows fixes from Simon Josefsson.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc.:
+dnl HP-UX 10.20, IRIX 6.5, OSF/1 4.0, Interix 3.5, BeOS.
+dnl So we have to test to find something that will work.
+
+AC_DEFUN([gl_TYPE_SOCKLEN_T],
+ [AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])dnl
+ AC_CHECK_TYPE([socklen_t], ,
+ [AC_CACHE_CHECK([for socklen_t equivalent],
+ [gl_cv_socklen_t_equiv],
+ [# Systems have either "struct sockaddr *" or
+ # "void *" as the second argument to getpeername
+ gl_cv_socklen_t_equiv=
+ for arg2 in "struct sockaddr" void; do
+ for t in int size_t "unsigned int" "long int" "unsigned long int"; do
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/socket.h>
+
+ int getpeername (int, $arg2 *, $t *);]],
+ [[$t len;
+ getpeername (0, 0, &len);]])],
+ [gl_cv_socklen_t_equiv="$t"])
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ test "$gl_cv_socklen_t_equiv" != "" && break
+ done
+ if test "$gl_cv_socklen_t_equiv" = ""; then
+ AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
+ fi
+ ])
+ AC_DEFINE_UNQUOTED([socklen_t], [$gl_cv_socklen_t_equiv],
+ [type to use in place of socklen_t if not defined])],
+ [gl_SOCKET_HEADERS])])
+
+dnl On mingw32, socklen_t is in ws2tcpip.h ('int'), so we try to find
+dnl it there too. But on Cygwin, wc2tcpip.h must not be included. Users
+dnl of this module should use the same include pattern as gl_SOCKET_HEADERS.
+dnl When you change this macro, keep also in sync:
+dnl - gl_CHECK_SOCKET_HEADERS,
+dnl - the Include section of modules/socklen.
+AC_DEFUN([gl_SOCKET_HEADERS],
+[
+/* <sys/types.h> is not needed according to POSIX, but the
+ <sys/socket.h> in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#elif HAVE_WS2TCPIP_H
+# include <ws2tcpip.h>
+#endif
+])
+
+dnl Tests for the existence of the header for socket facilities.
+dnl Defines the C macros HAVE_SYS_SOCKET_H, HAVE_WS2TCPIP_H.
+dnl This macro must match gl_SOCKET_HEADERS.
+AC_DEFUN([gl_CHECK_SOCKET_HEADERS],
+ [AC_CHECK_HEADERS_ONCE([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h = no; then
+ dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+ dnl the check for those headers unconditional; yet cygwin reports
+ dnl that the headers are present but cannot be compiled (since on
+ dnl cygwin, all socket information should come from sys/socket.h).
+ AC_CHECK_HEADERS([ws2tcpip.h])
+ fi
+ ])
diff --git a/m4/sockpfaf.m4 b/m4/sockpfaf.m4
new file mode 100644
index 0000000..495a355
--- /dev/null
+++ b/m4/sockpfaf.m4
@@ -0,0 +1,84 @@
+# sockpfaf.m4 serial 9
+dnl Copyright (C) 2004, 2006, 2009-2020 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 Test for some common socket protocol families (PF_INET, PF_INET6, ...)
+dnl and some common address families (AF_INET, AF_INET6, ...).
+dnl This test assumes that a system supports an address family if and only if
+dnl it supports the corresponding protocol family.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SOCKET_FAMILIES],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_CHECK_HEADERS_ONCE([netinet/in.h])
+
+ AC_CACHE_CHECK([for IPv4 sockets],
+ [gl_cv_socket_ipv4],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif]],
+[[int x = AF_INET; struct in_addr y; struct sockaddr_in z;
+ if (&x && &y && &z) return 0;]])],
+ gl_cv_socket_ipv4=yes, gl_cv_socket_ipv4=no)])
+ if test $gl_cv_socket_ipv4 = yes; then
+ AC_DEFINE([HAVE_IPV4], [1], [Define to 1 if <sys/socket.h> defines AF_INET.])
+ fi
+
+ AC_CACHE_CHECK([for IPv6 sockets],
+ [gl_cv_socket_ipv6],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif]],
+[[int x = AF_INET6; struct in6_addr y; struct sockaddr_in6 z;
+ if (&x && &y && &z) return 0;]])],
+ gl_cv_socket_ipv6=yes, gl_cv_socket_ipv6=no)])
+ if test $gl_cv_socket_ipv6 = yes; then
+ AC_DEFINE([HAVE_IPV6], [1], [Define to 1 if <sys/socket.h> defines AF_INET6.])
+ fi
+])
+
+AC_DEFUN([gl_SOCKET_FAMILY_UNIX],
+[
+ AC_REQUIRE([gl_HEADER_SYS_SOCKET])
+ AC_CHECK_HEADERS_ONCE([sys/un.h])
+
+ AC_CACHE_CHECK([for UNIX domain sockets],
+ [gl_cv_socket_unix],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_SYS_UN_H
+#include <sys/un.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif]],
+[[int x = AF_UNIX; struct sockaddr_un y;
+ if (&x && &y) return 0;]])],
+ gl_cv_socket_unix=yes, gl_cv_socket_unix=no)])
+ if test $gl_cv_socket_unix = yes; then
+ AC_DEFINE([HAVE_UNIXSOCKET], [1], [Define to 1 if <sys/socket.h> defines AF_UNIX.])
+ fi
+])
diff --git a/m4/spawn-pipe.m4 b/m4/spawn-pipe.m4
new file mode 100644
index 0000000..471f91d
--- /dev/null
+++ b/m4/spawn-pipe.m4
@@ -0,0 +1,11 @@
+# spawn-pipe.m4 serial 2
+dnl Copyright (C) 2004, 2008-2020 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.
+
+AC_DEFUN([gl_SPAWN_PIPE],
+[
+ dnl Prerequisites of lib/spawn-pipe.c.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+])
diff --git a/m4/spawn_h.m4 b/m4/spawn_h.m4
new file mode 100644
index 0000000..781f9f4
--- /dev/null
+++ b/m4/spawn_h.m4
@@ -0,0 +1,136 @@
+# spawn_h.m4 serial 18
+dnl Copyright (C) 2008-2020 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 Written by Bruno Haible.
+
+AC_DEFUN([gl_SPAWN_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+
+ dnl <spawn.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([spawn.h])
+
+ if test $ac_cv_header_spawn_h = yes; then
+ HAVE_SPAWN_H=1
+ AC_CHECK_TYPES([posix_spawnattr_t], [], [HAVE_POSIX_SPAWNATTR_T=0], [[
+#include <spawn.h>
+ ]])
+ AC_CHECK_TYPES([posix_spawn_file_actions_t], [],
+ [HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0], [[
+#include <spawn.h>
+ ]])
+ else
+ HAVE_SPAWN_H=0
+ HAVE_POSIX_SPAWNATTR_T=0
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=0
+ fi
+ AC_SUBST([HAVE_SPAWN_H])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Ensure the type mode_t gets defined.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+
+ AC_REQUIRE([gl_HAVE_POSIX_SPAWN])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <spawn.h>
+ ]], [posix_spawn posix_spawnp posix_spawnattr_init posix_spawnattr_destroy
+ posix_spawnattr_getsigdefault posix_spawnattr_setsigdefault
+ posix_spawnattr_getsigmask posix_spawnattr_setsigmask
+ posix_spawnattr_getflags posix_spawnattr_setflags
+ posix_spawnattr_getpgroup posix_spawnattr_setpgroup
+ posix_spawnattr_getschedpolicy posix_spawnattr_setschedpolicy
+ posix_spawnattr_getschedparam posix_spawnattr_setschedparam
+ posix_spawn_file_actions_init posix_spawn_file_actions_destroy
+ posix_spawn_file_actions_addopen posix_spawn_file_actions_addclose
+ posix_spawn_file_actions_adddup2 posix_spawn_file_actions_addchdir
+ posix_spawn_file_actions_addfchdir])
+])
+
+dnl Checks whether the system has the functions posix_spawn.
+dnl Sets ac_cv_func_posix_spawn and HAVE_POSIX_SPAWN.
+AC_DEFUN([gl_HAVE_POSIX_SPAWN],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+
+ LIB_POSIX_SPAWN=
+ AC_SUBST([LIB_POSIX_SPAWN])
+ gl_saved_libs=$LIBS
+ AC_SEARCH_LIBS([posix_spawn], [rt],
+ [test "$ac_cv_search_posix_spawn" = "none required" ||
+ LIB_POSIX_SPAWN=$ac_cv_search_posix_spawn])
+ AC_CHECK_FUNCS([posix_spawn])
+ LIBS=$gl_saved_libs
+
+ if test $ac_cv_func_posix_spawn != yes; then
+ HAVE_POSIX_SPAWN=0
+ fi
+])
+
+AC_DEFUN([gl_SPAWN_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SPAWN_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SPAWN_H_DEFAULTS],
+[
+ GNULIB_POSIX_SPAWN=0; AC_SUBST([GNULIB_POSIX_SPAWN])
+ GNULIB_POSIX_SPAWNP=0; AC_SUBST([GNULIB_POSIX_SPAWNP])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
+ GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY=0; AC_SUBST([GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY])
+ GNULIB_POSIX_SPAWNATTR_INIT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_INIT])
+ GNULIB_POSIX_SPAWNATTR_GETFLAGS=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETFLAGS])
+ GNULIB_POSIX_SPAWNATTR_SETFLAGS=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETFLAGS])
+ GNULIB_POSIX_SPAWNATTR_GETPGROUP=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETPGROUP])
+ GNULIB_POSIX_SPAWNATTR_SETPGROUP=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETPGROUP])
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM])
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM])
+ GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY])
+ GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY])
+ GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT])
+ GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT])
+ GNULIB_POSIX_SPAWNATTR_GETSIGMASK=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_GETSIGMASK])
+ GNULIB_POSIX_SPAWNATTR_SETSIGMASK=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_SETSIGMASK])
+ GNULIB_POSIX_SPAWNATTR_DESTROY=0; AC_SUBST([GNULIB_POSIX_SPAWNATTR_DESTROY])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_POSIX_SPAWN=1; AC_SUBST([HAVE_POSIX_SPAWN])
+ HAVE_POSIX_SPAWNATTR_T=1; AC_SUBST([HAVE_POSIX_SPAWNATTR_T])
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_T=1;
+ AC_SUBST([HAVE_POSIX_SPAWN_FILE_ACTIONS_T])
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=1;
+ AC_SUBST([HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR])
+ HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=1;
+ AC_SUBST([HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR])
+ REPLACE_POSIX_SPAWN=0; AC_SUBST([REPLACE_POSIX_SPAWN])
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR=0;
+ AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR])
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE=0;
+ AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE])
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2=0;
+ AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2])
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR=0;
+ AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR])
+ REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN=0;
+ AC_SUBST([REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN])
+])
diff --git a/m4/ssize_t.m4 b/m4/ssize_t.m4
new file mode 100644
index 0000000..6c0a588
--- /dev/null
+++ b/m4/ssize_t.m4
@@ -0,0 +1,23 @@
+# ssize_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2001-2003, 2006, 2010-2020 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.
+dnl Test whether ssize_t is defined.
+
+AC_DEFUN([gt_TYPE_SSIZE_T],
+[
+ AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>]],
+ [[int x = sizeof (ssize_t *) + sizeof (ssize_t);
+ return !x;]])],
+ [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])])
+ if test $gt_cv_ssize_t = no; then
+ AC_DEFINE([ssize_t], [int],
+ [Define as a signed type of the same size as size_t.])
+ fi
+])
diff --git a/m4/stat-time.m4 b/m4/stat-time.m4
new file mode 100644
index 0000000..0ac3f72
--- /dev/null
+++ b/m4/stat-time.m4
@@ -0,0 +1,83 @@
+# Checks for stat-related time functions.
+
+# Copyright (C) 1998-1999, 2001, 2003, 2005-2007, 2009-2020 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.
+
+dnl From Paul Eggert.
+
+# st_atim.tv_nsec - Linux, Solaris, Cygwin
+# st_atimespec.tv_nsec - FreeBSD, NetBSD, if ! defined _POSIX_SOURCE
+# st_atimensec - FreeBSD, NetBSD, if defined _POSIX_SOURCE
+# st_atim.st__tim.tv_nsec - UnixWare (at least 2.1.2 through 7.1)
+
+# st_birthtimespec - FreeBSD, NetBSD (hidden on OpenBSD 3.9, anyway)
+# st_birthtim - Cygwin 1.7.0+
+
+AC_DEFUN([gl_STAT_TIME],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+
+ AC_CHECK_MEMBERS([struct stat.st_atim.tv_nsec],
+ [AC_CACHE_CHECK([whether struct stat.st_atim is of type struct timespec],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #if HAVE_SYS_TIME_H
+ # include <sys/time.h>
+ #endif
+ #include <time.h>
+ struct timespec ts;
+ struct stat st;
+ ]],
+ [[
+ st.st_atim = ts;
+ ]])],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=yes],
+ [ac_cv_typeof_struct_stat_st_atim_is_struct_timespec=no])])
+ if test $ac_cv_typeof_struct_stat_st_atim_is_struct_timespec = yes; then
+ AC_DEFINE([TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC], [1],
+ [Define to 1 if the type of the st_atim member of a struct stat is
+ struct timespec.])
+ fi],
+ [AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_atimensec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_atim.st__tim.tv_nsec], [], [],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+])
+
+# Check for st_birthtime, a feature from UFS2 (FreeBSD, NetBSD, OpenBSD, etc.)
+# and NTFS (Cygwin).
+# There was a time when this field was named st_createtime (21 June
+# 2002 to 16 July 2002) But that window is very small and applied only
+# to development code, so systems still using that configuration are
+# not supported. See revisions 1.10 and 1.11 of FreeBSD's
+# src/sys/ufs/ufs/dinode.h.
+#
+AC_DEFUN([gl_STAT_BIRTHTIME],
+[
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_CHECK_MEMBERS([struct stat.st_birthtimespec.tv_nsec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_birthtimensec], [],
+ [AC_CHECK_MEMBERS([struct stat.st_birthtim.tv_nsec], [], [],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+])
diff --git a/m4/stat.m4 b/m4/stat.m4
new file mode 100644
index 0000000..db2038f
--- /dev/null
+++ b/m4/stat.m4
@@ -0,0 +1,85 @@
+# serial 17
+
+# Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STAT],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ AC_CHECK_FUNCS_ONCE([lstat])
+ case "$host_os" in
+ mingw*)
+ dnl On this platform, the original stat() returns st_atime, st_mtime,
+ dnl st_ctime values that are affected by the time zone.
+ REPLACE_STAT=1
+ ;;
+ *)
+ dnl AIX 7.1, Solaris 9, mingw64 mistakenly succeed on stat("file/").
+ dnl (For mingw, this is due to a broken stat() override in libmingwex.a.)
+ dnl FreeBSD 7.2 mistakenly succeeds on stat("link-to-file/").
+ AC_CACHE_CHECK([whether stat handles trailing slashes on files],
+ [gl_cv_func_stat_file_slash],
+ [touch conftest.tmp
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/stat.h>
+]], [[int result = 0;
+ struct stat st;
+ if (!stat ("conftest.tmp/", &st))
+ result |= 1;
+#if HAVE_LSTAT
+ if (!stat ("conftest.lnk/", &st))
+ result |= 2;
+#endif
+ return result;
+ ]])],
+ [gl_cv_func_stat_file_slash=yes], [gl_cv_func_stat_file_slash=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_stat_file_slash="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_stat_file_slash="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_stat_file_slash="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.tmp conftest.lnk])
+ case $gl_cv_func_stat_file_slash in
+ *no)
+ REPLACE_STAT=1
+ AC_DEFINE([REPLACE_FUNC_STAT_FILE], [1], [Define to 1 if stat needs
+ help when passed a file name with a trailing slash]);;
+ esac
+ case $host_os in
+ dnl Solaris stat can return a negative tv_nsec.
+ solaris*)
+ REPLACE_FSTAT=1 ;;
+ esac
+ ;;
+ esac
+])
+
+# Prerequisites of lib/stat.c and lib/stat-w32.c.
+AC_DEFUN([gl_PREREQ_STAT], [
+ AC_REQUIRE([gl_HEADER_SYS_STAT_H])
+ AC_REQUIRE([gl_PREREQ_STAT_W32])
+ :
+])
+
+# Prerequisites of lib/stat-w32.c.
+AC_DEFUN([gl_PREREQ_STAT_W32], [
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ case "$host_os" in
+ mingw*)
+ AC_CHECK_HEADERS([sdkddkver.h])
+ ;;
+ esac
+])
diff --git a/m4/stdalign.m4 b/m4/stdalign.m4
new file mode 100644
index 0000000..dcf778e
--- /dev/null
+++ b/m4/stdalign.m4
@@ -0,0 +1,57 @@
+# Check for stdalign.h that conforms to C11.
+
+dnl Copyright 2011-2020 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.
+
+# Prepare for substituting <stdalign.h> if it is not supported.
+
+AC_DEFUN([gl_STDALIGN_H],
+[
+ AC_CACHE_CHECK([for working stdalign.h],
+ [gl_cv_header_working_stdalign_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stdalign.h>
+ #include <stddef.h>
+
+ /* Test that alignof yields a result consistent with offsetof.
+ This catches GCC bug 52023
+ <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023>. */
+ #ifdef __cplusplus
+ template <class t> struct alignof_helper { char a; t b; };
+ # define ao(type) offsetof (alignof_helper<type>, b)
+ #else
+ # define ao(type) offsetof (struct { char a; type b; }, b)
+ #endif
+ char test_double[ao (double) % _Alignof (double) == 0 ? 1 : -1];
+ char test_long[ao (long int) % _Alignof (long int) == 0 ? 1 : -1];
+ char test_alignof[alignof (double) == _Alignof (double) ? 1 : -1];
+
+ /* Test _Alignas only on platforms where gnulib can help. */
+ #if \
+ ((defined __cplusplus && 201103 <= __cplusplus) \
+ || (defined __APPLE__ && defined __MACH__ \
+ ? 4 < __GNUC__ + (1 <= __GNUC_MINOR__) \
+ : __GNUC__) \
+ || (__ia64 && (61200 <= __HP_cc || 61200 <= __HP_aCC)) \
+ || __ICC || 0x590 <= __SUNPRO_C || 0x0600 <= __xlC__ \
+ || 1300 <= _MSC_VER)
+ struct alignas_test { char c; char alignas (8) alignas_8; };
+ char test_alignas[offsetof (struct alignas_test, alignas_8) == 8
+ ? 1 : -1];
+ #endif
+ ]])],
+ [gl_cv_header_working_stdalign_h=yes],
+ [gl_cv_header_working_stdalign_h=no])])
+
+ if test $gl_cv_header_working_stdalign_h = yes; then
+ STDALIGN_H=''
+ else
+ STDALIGN_H='stdalign.h'
+ fi
+
+ AC_SUBST([STDALIGN_H])
+ AM_CONDITIONAL([GL_GENERATE_STDALIGN_H], [test -n "$STDALIGN_H"])
+])
diff --git a/m4/stdbool.m4 b/m4/stdbool.m4
new file mode 100644
index 0000000..6bb087e
--- /dev/null
+++ b/m4/stdbool.m4
@@ -0,0 +1,122 @@
+# Check for stdbool.h that conforms to C99.
+
+dnl Copyright (C) 2002-2006, 2009-2020 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.
+
+#serial 8
+
+# Prepare for substituting <stdbool.h> if it is not supported.
+
+AC_DEFUN([AM_STDBOOL_H],
+[
+ AC_REQUIRE([AC_CHECK_HEADER_STDBOOL])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ dnl On some platforms, <stdbool.h> does not exist or does not conform to C99.
+ dnl On Solaris 10 with CC=cc CXX=CC, <stdbool.h> exists but is not usable
+ dnl in C++ mode (and no <cstdbool> exists). In this case, we use our
+ dnl replacement, also in C mode (for binary compatibility between C and C++).
+ if test "$ac_cv_header_stdbool_h" = yes; then
+ case "$host_os" in
+ solaris*)
+ if test -z "$GCC"; then
+ STDBOOL_H='stdbool.h'
+ else
+ STDBOOL_H=''
+ fi
+ ;;
+ *)
+ STDBOOL_H=''
+ ;;
+ esac
+ else
+ STDBOOL_H='stdbool.h'
+ fi
+ AC_SUBST([STDBOOL_H])
+ AM_CONDITIONAL([GL_GENERATE_STDBOOL_H], [test -n "$STDBOOL_H"])
+
+ if test "$ac_cv_type__Bool" = yes; then
+ HAVE__BOOL=1
+ else
+ HAVE__BOOL=0
+ fi
+ AC_SUBST([HAVE__BOOL])
+])
+
+# AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future.
+AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H])
+
+# This version of the macro is needed in autoconf <= 2.68.
+
+AC_DEFUN([AC_CHECK_HEADER_STDBOOL],
+ [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
+ [ac_cv_header_stdbool_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+ #include <stdbool.h>
+
+ #ifdef __cplusplus
+ typedef bool Bool;
+ #else
+ typedef _Bool Bool;
+ #ifndef bool
+ "error: bool is not defined"
+ #endif
+ #ifndef false
+ "error: false is not defined"
+ #endif
+ #if false
+ "error: false is not 0"
+ #endif
+ #ifndef true
+ "error: true is not defined"
+ #endif
+ #if true != 1
+ "error: true is not 1"
+ #endif
+ #endif
+
+ #ifndef __bool_true_false_are_defined
+ "error: __bool_true_false_are_defined is not defined"
+ #endif
+
+ struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
+
+ char a[true == 1 ? 1 : -1];
+ char b[false == 0 ? 1 : -1];
+ char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+ char d[(bool) 0.5 == true ? 1 : -1];
+ /* See body of main program for 'e'. */
+ char f[(Bool) 0.0 == false ? 1 : -1];
+ char g[true];
+ char h[sizeof (Bool)];
+ char i[sizeof s.t];
+ enum { j = false, k = true, l = false * true, m = true * 256 };
+ /* The following fails for
+ HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+ Bool n[m];
+ char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+ char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+ /* Catch a bug in an HP-UX C compiler. See
+ https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+ https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+ */
+ Bool q = true;
+ Bool *pq = &q;
+ bool *qq = &q;
+ ]],
+ [[
+ bool e = &s;
+ *pq |= q; *pq |= ! q;
+ *qq |= q; *qq |= ! q;
+ /* Refer to every declared value, to avoid compiler optimizations. */
+ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+ + !m + !n + !o + !p + !q + !pq + !qq);
+ ]])],
+ [ac_cv_header_stdbool_h=yes],
+ [ac_cv_header_stdbool_h=no])])
+ AC_CHECK_TYPES([_Bool])
+])
diff --git a/m4/stddef_h.m4 b/m4/stddef_h.m4
new file mode 100644
index 0000000..d8bc8ff
--- /dev/null
+++ b/m4/stddef_h.m4
@@ -0,0 +1,72 @@
+dnl A placeholder for <stddef.h>, for platforms that have issues.
+# stddef_h.m4 serial 7
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_STDDEF_H],
+[
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ STDDEF_H=
+
+ dnl Test whether the type max_align_t exists and whether its alignment
+ dnl "is as great as is supported by the implementation in all contexts".
+ AC_CACHE_CHECK([for good max_align_t],
+ [gl_cv_type_max_align_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ unsigned int s = sizeof (max_align_t);
+ #if defined __GNUC__ || defined __clang__ || defined __IBM__ALIGNOF__
+ int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+ int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+ #endif
+ ]])],
+ [gl_cv_type_max_align_t=yes],
+ [gl_cv_type_max_align_t=no])
+ ])
+ if test $gl_cv_type_max_align_t = no; then
+ HAVE_MAX_ALIGN_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ if test $gt_cv_c_wchar_t = no; then
+ HAVE_WCHAR_T=0
+ STDDEF_H=stddef.h
+ fi
+
+ AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
+ [gl_cv_decl_null_works],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
+ int test[2 * (sizeof NULL == sizeof (void *)) -1];
+]])],
+ [gl_cv_decl_null_works=yes],
+ [gl_cv_decl_null_works=no])])
+ if test $gl_cv_decl_null_works = no; then
+ REPLACE_NULL=1
+ STDDEF_H=stddef.h
+ fi
+
+ AC_SUBST([STDDEF_H])
+ AM_CONDITIONAL([GL_GENERATE_STDDEF_H], [test -n "$STDDEF_H"])
+ if test -n "$STDDEF_H"; then
+ gl_NEXT_HEADERS([stddef.h])
+ fi
+])
+
+AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_STDDEF_H_DEFAULTS],
+[
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ REPLACE_NULL=0; AC_SUBST([REPLACE_NULL])
+ HAVE_MAX_ALIGN_T=1; AC_SUBST([HAVE_MAX_ALIGN_T])
+ HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T])
+])
diff --git a/m4/stdint.m4 b/m4/stdint.m4
new file mode 100644
index 0000000..adaea3e
--- /dev/null
+++ b/m4/stdint.m4
@@ -0,0 +1,533 @@
+# stdint.m4 serial 58
+dnl Copyright (C) 2001-2020 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 and Bruno Haible.
+dnl Test whether <stdint.h> is supported or must be substituted.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_STDINT_H],
+[
+ AC_PREREQ([2.59])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ AC_REQUIRE([gl_LIMITS_H])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+
+ dnl For backward compatibility. Some packages may still be testing these
+ dnl macros.
+ AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'long long int'.])
+ AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+ [Define to 1 if the system has the type 'unsigned long long int'.])
+
+ dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+ AC_SUBST([HAVE_WCHAR_H])
+
+ dnl Check for <inttypes.h>.
+ AC_CHECK_HEADERS_ONCE([inttypes.h])
+ if test $ac_cv_header_inttypes_h = yes; then
+ HAVE_INTTYPES_H=1
+ else
+ HAVE_INTTYPES_H=0
+ fi
+ AC_SUBST([HAVE_INTTYPES_H])
+
+ dnl Check for <sys/types.h>.
+ AC_CHECK_HEADERS_ONCE([sys/types.h])
+ if test $ac_cv_header_sys_types_h = yes; then
+ HAVE_SYS_TYPES_H=1
+ else
+ HAVE_SYS_TYPES_H=0
+ fi
+ AC_SUBST([HAVE_SYS_TYPES_H])
+
+ gl_CHECK_NEXT_HEADERS([stdint.h])
+ if test $ac_cv_header_stdint_h = yes; then
+ HAVE_STDINT_H=1
+ else
+ HAVE_STDINT_H=0
+ fi
+ AC_SUBST([HAVE_STDINT_H])
+
+ dnl Now see whether we need a substitute <stdint.h>.
+ if test $ac_cv_header_stdint_h = yes; then
+ AC_CACHE_CHECK([whether stdint.h conforms to C99],
+ [gl_cv_header_working_stdint_h],
+ [gl_cv_header_working_stdint_h=no
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>. */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+]
+gl_STDINT_INCLUDES
+[
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible. */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || 4 <= __clang_major__ || defined __IBM__TYPEOF__ \
+ || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+ ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+ ((t) ((t) 0 < (t) -1 \
+ ? (t) -1 \
+ : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+ int check_PTRDIFF:
+ PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+ && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+ ? 1 : -1;
+ /* Detect bug in FreeBSD 6.0 / ia64. */
+ int check_SIG_ATOMIC:
+ SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+ && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+ ? 1 : -1;
+ int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+ int check_WCHAR:
+ WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+ && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+ ? 1 : -1;
+ /* Detect bug in mingw. */
+ int check_WINT:
+ WINT_MIN == TYPE_MINIMUM (wint_t)
+ && WINT_MAX == TYPE_MAXIMUM (wint_t)
+ ? 1 : -1;
+
+ /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others. */
+ int check_UINT8_C:
+ (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+ int check_UINT16_C:
+ (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+ /* Detect bugs in OpenBSD 3.9 stdint.h. */
+#ifdef UINT8_MAX
+ int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+ int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+ int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+ int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+ int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+ int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+ int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+ int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+ int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+ int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+ int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+ int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+ int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+ int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+ int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+ ]])],
+ [dnl Determine whether the various *_MIN, *_MAX macros are usable
+ dnl in preprocessor expression. We could do it by compiling a test
+ dnl program for each of these macros. It is faster to run a program
+ dnl that inspects the macro expansion.
+ dnl This detects a bug on HP-UX 11.23/ia64.
+ AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+ {
+#ifdef INT8_MAX
+ MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+ MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+ MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+ MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+ MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+ MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+ MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+ MVAL (UINT64_MAX),
+#endif
+ NULL
+ };
+]], [[
+ const char **mv;
+ for (mv = macro_values; *mv != NULL; mv++)
+ {
+ const char *value = *mv;
+ /* Test whether it looks like a cast expression. */
+ if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+ || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+ || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+ || strncmp (value, "((int)"/*)*/, 6) == 0
+ || strncmp (value, "((signed short)"/*)*/, 15) == 0
+ || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+ return mv - macro_values + 1;
+ }
+ return 0;
+]])],
+ [gl_cv_header_working_stdint_h=yes],
+ [],
+ [case "$host_os" in
+ # Guess yes on native Windows.
+ mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+ # In general, assume it works.
+ *) gl_cv_header_working_stdint_h="guessing yes" ;;
+ esac
+ ])
+ ])
+ ])
+ fi
+
+ HAVE_C99_STDINT_H=0
+ HAVE_SYS_BITYPES_H=0
+ HAVE_SYS_INTTYPES_H=0
+ STDINT_H=stdint.h
+ case "$gl_cv_header_working_stdint_h" in
+ *yes)
+ HAVE_C99_STDINT_H=1
+ dnl Now see whether the system <stdint.h> works without
+ dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
+ dnl If not, there would be problems when stdint.h is included from C++.
+ AC_CACHE_CHECK([whether stdint.h works without ISO C predefines],
+ [gl_cv_header_stdint_without_STDC_macros],
+ [gl_cv_header_stdint_without_STDC_macros=no
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+ ]])],
+ [gl_cv_header_stdint_without_STDC_macros=yes])
+ ])
+
+ if test $gl_cv_header_stdint_without_STDC_macros = no; then
+ AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
+ [Define to 1 if the system <stdint.h> predates C++11.])
+ AC_DEFINE([__STDC_LIMIT_MACROS], [1],
+ [Define to 1 if the system <stdint.h> predates C++11.])
+ fi
+ AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
+ [gl_cv_header_stdint_width],
+ [gl_cv_header_stdint_width=no
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[
+ /* Work if build is not clean. */
+ #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+ #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+ #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+ #endif
+ #include <stdint.h>
+ ]gl_STDINT_INCLUDES[
+ int iw = UINTMAX_WIDTH;
+ ]])],
+ [gl_cv_header_stdint_width=yes])])
+ if test "$gl_cv_header_stdint_width" = yes; then
+ STDINT_H=
+ fi
+ ;;
+ *)
+ dnl Check for <sys/inttypes.h>, and for
+ dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
+ AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
+ if test $ac_cv_header_sys_inttypes_h = yes; then
+ HAVE_SYS_INTTYPES_H=1
+ fi
+ if test $ac_cv_header_sys_bitypes_h = yes; then
+ HAVE_SYS_BITYPES_H=1
+ fi
+ gl_STDINT_TYPE_PROPERTIES
+ ;;
+ esac
+
+ dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH.
+ gl_REPLACE_LIMITS_H
+
+ AC_SUBST([HAVE_C99_STDINT_H])
+ AC_SUBST([HAVE_SYS_BITYPES_H])
+ AC_SUBST([HAVE_SYS_INTTYPES_H])
+ AC_SUBST([STDINT_H])
+ AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"])
+])
+
+dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
+dnl Determine the size of each of the given types in bits.
+AC_DEFUN([gl_STDINT_BITSIZEOF],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to the number of bits in type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
+ [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
+ [$2
+#include <limits.h>], [result=unknown])
+ eval gl_cv_bitsizeof_${gltype}=\$result
+ ])
+ eval result=\$gl_cv_bitsizeof_${gltype}
+ if test $result = unknown; then
+ dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
+ dnl do a syntax check even on unused #if conditions and give an error
+ dnl on valid C code like this:
+ dnl #if 0
+ dnl # if > 32
+ dnl # endif
+ dnl #endif
+ result=0
+ fi
+ GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
+ eval BITSIZEOF_${GLTYPE}=\$result
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
+dnl Determine the signedness of each of the given types.
+dnl Define HAVE_SIGNED_TYPE if type is signed.
+AC_DEFUN([gl_CHECK_TYPES_SIGNED],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+ [Define to 1 if ']gltype[' is a signed integer type.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
+ result=yes, result=no)
+ eval gl_cv_type_${gltype}_signed=\$result
+ ])
+ eval result=\$gl_cv_type_${gltype}_signed
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ if test "$result" = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
+ eval HAVE_SIGNED_${GLTYPE}=1
+ else
+ eval HAVE_SIGNED_${GLTYPE}=0
+ fi
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
+dnl Determine the suffix to use for integer constants of the given types.
+dnl Define t_SUFFIX for each such type.
+AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
+[
+ dnl Use a shell loop, to avoid bloating configure, and
+ dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+ dnl config.h.in,
+ dnl - extra AC_SUBST calls, so that the right substitutions are made.
+ m4_foreach_w([gltype], [$1],
+ [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
+ [Define to l, ll, u, ul, ull, etc., as suitable for
+ constants of type ']gltype['.])])
+ for gltype in $1 ; do
+ AC_CACHE_CHECK([for $gltype integer literal suffix],
+ [gl_cv_type_${gltype}_suffix],
+ [eval gl_cv_type_${gltype}_suffix=no
+ eval result=\$gl_cv_type_${gltype}_signed
+ if test "$result" = yes; then
+ glsufu=
+ else
+ glsufu=u
+ fi
+ for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+ case $glsuf in
+ '') gltype1='int';;
+ l) gltype1='long int';;
+ ll) gltype1='long long int';;
+ i64) gltype1='__int64';;
+ u) gltype1='unsigned int';;
+ ul) gltype1='unsigned long int';;
+ ull) gltype1='unsigned long long int';;
+ ui64)gltype1='unsigned __int64';;
+ esac
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([$2[
+ extern $gltype foo;
+ extern $gltype1 foo;]])],
+ [eval gl_cv_type_${gltype}_suffix=\$glsuf])
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" != no && break
+ done])
+ GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+ eval result=\$gl_cv_type_${gltype}_suffix
+ test "$result" = no && result=
+ eval ${GLTYPE}_SUFFIX=\$result
+ AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
+ done
+ m4_foreach_w([gltype], [$1],
+ [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+ #include <stddef.h>
+ #include <signal.h>
+ #if HAVE_WCHAR_H
+ # include <wchar.h>
+ #endif
+]])
+
+dnl gl_STDINT_TYPE_PROPERTIES
+dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
+dnl of interest to stdint.in.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+ AC_REQUIRE([gl_MULTIARCH])
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+ gl_cv_type_ptrdiff_t_signed=yes
+ gl_cv_type_size_t_signed=no
+ if test $APPLE_UNIVERSAL_BUILD = 0; then
+ gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
+ [gl_STDINT_INCLUDES])
+ fi
+ gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
+ [gl_STDINT_INCLUDES])
+
+ dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99
+ dnl requirement that wint_t is "unchanged by default argument promotions".
+ dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
+ dnl Set the variable BITSIZEOF_WINT_T accordingly.
+ if test $GNULIB_OVERRIDES_WINT_T = 1; then
+ BITSIZEOF_WINT_T=32
+ fi
+])
diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4
new file mode 100644
index 0000000..9df9e04
--- /dev/null
+++ b/m4/stdint_h.m4
@@ -0,0 +1,27 @@
+# stdint_h.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006, 2008-2020 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_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+ AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <stdint.h>]],
+ [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+ [gl_cv_header_stdint_h=yes],
+ [gl_cv_header_stdint_h=no])])
+ if test $gl_cv_header_stdint_h = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
+ [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+ and declares uintmax_t. ])
+ fi
+])
diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4
new file mode 100644
index 0000000..54026c3
--- /dev/null
+++ b/m4/stdio_h.m4
@@ -0,0 +1,240 @@
+# stdio_h.m4 serial 52
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_STDIO_H],
+[
+ AH_VERBATIM([MINGW_ANSI_STDIO],
+[/* Use GNU style printf and scanf. */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+])
+ AC_DEFINE([__USE_MINGW_ANSI_STDIO])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_NEXT_HEADERS([stdio.h])
+
+ dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
+ dnl inttypes.h behave like gnu instead of system; we must give our
+ dnl printf wrapper the right attribute to match.
+ AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros],
+ [gl_cv_func_printf_attribute_flavor],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #define __STDC_FORMAT_MACROS 1
+ #include <stdio.h>
+ #include <inttypes.h>
+ /* For non-mingw systems, compilation will trivially succeed.
+ For mingw, compilation will succeed for older mingw (system
+ printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+ #if (defined _WIN32 && ! defined __CYGWIN__) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+ extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+ #endif
+ ]])], [gl_cv_func_printf_attribute_flavor=system],
+ [gl_cv_func_printf_attribute_flavor=gnu])])
+ if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+ AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1],
+ [Define to 1 if printf and friends should be labeled with
+ attribute "__gnu_printf__" instead of "__printf__"])
+ fi
+
+ dnl No need to create extra modules for these functions. Everyone who uses
+ dnl <stdio.h> likely needs them.
+ GNULIB_FSCANF=1
+ gl_MODULE_INDICATOR([fscanf])
+ GNULIB_SCANF=1
+ gl_MODULE_INDICATOR([scanf])
+ GNULIB_FGETC=1
+ GNULIB_GETC=1
+ GNULIB_GETCHAR=1
+ GNULIB_FGETS=1
+ GNULIB_FREAD=1
+ dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c"
+ dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+ dnl also an optimization, to avoid performing a configure check whose result
+ dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
+ dnl or GNULIB_NONBLOCKING redundant.
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_nonblocking != yes; then
+ REPLACE_STDIO_READ_FUNCS=1
+ AC_LIBOBJ([stdio-read])
+ fi
+ ])
+
+ dnl No need to create extra modules for these functions. Everyone who uses
+ dnl <stdio.h> likely needs them.
+ GNULIB_FPRINTF=1
+ GNULIB_PRINTF=1
+ GNULIB_VFPRINTF=1
+ GNULIB_VPRINTF=1
+ GNULIB_FPUTC=1
+ GNULIB_PUTC=1
+ GNULIB_PUTCHAR=1
+ GNULIB_FPUTS=1
+ GNULIB_PUTS=1
+ GNULIB_FWRITE=1
+ dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
+ dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+ dnl also an optimization, to avoid performing a configure check whose result
+ dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or
+ dnl GNULIB_SIGPIPE redundant.
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+ AC_LIBOBJ([stdio-write])
+ fi
+ ])
+ dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
+ dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+ dnl also an optimization, to avoid performing a configure check whose result
+ dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
+ dnl or GNULIB_NONBLOCKING redundant.
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_nonblocking != yes; then
+ REPLACE_STDIO_WRITE_FUNCS=1
+ AC_LIBOBJ([stdio-write])
+ fi
+ ])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by both C89 and C11.
+ gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
+ ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
+ renameat snprintf tmpfile vdprintf vsnprintf])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([fcloseall])
+ if test $ac_cv_have_decl_fcloseall = no; then
+ HAVE_DECL_FCLOSEALL=0
+ fi
+])
+
+AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_STDIO_H_DEFAULTS],
+[
+ GNULIB_DPRINTF=0; AC_SUBST([GNULIB_DPRINTF])
+ GNULIB_FCLOSE=0; AC_SUBST([GNULIB_FCLOSE])
+ GNULIB_FDOPEN=0; AC_SUBST([GNULIB_FDOPEN])
+ GNULIB_FFLUSH=0; AC_SUBST([GNULIB_FFLUSH])
+ GNULIB_FGETC=0; AC_SUBST([GNULIB_FGETC])
+ GNULIB_FGETS=0; AC_SUBST([GNULIB_FGETS])
+ GNULIB_FOPEN=0; AC_SUBST([GNULIB_FOPEN])
+ GNULIB_FPRINTF=0; AC_SUBST([GNULIB_FPRINTF])
+ GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX])
+ GNULIB_FPURGE=0; AC_SUBST([GNULIB_FPURGE])
+ GNULIB_FPUTC=0; AC_SUBST([GNULIB_FPUTC])
+ GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS])
+ GNULIB_FREAD=0; AC_SUBST([GNULIB_FREAD])
+ GNULIB_FREOPEN=0; AC_SUBST([GNULIB_FREOPEN])
+ GNULIB_FSCANF=0; AC_SUBST([GNULIB_FSCANF])
+ GNULIB_FSEEK=0; AC_SUBST([GNULIB_FSEEK])
+ GNULIB_FSEEKO=0; AC_SUBST([GNULIB_FSEEKO])
+ GNULIB_FTELL=0; AC_SUBST([GNULIB_FTELL])
+ GNULIB_FTELLO=0; AC_SUBST([GNULIB_FTELLO])
+ GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE])
+ GNULIB_GETC=0; AC_SUBST([GNULIB_GETC])
+ GNULIB_GETCHAR=0; AC_SUBST([GNULIB_GETCHAR])
+ GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM])
+ GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE])
+ GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF])
+ GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX])
+ GNULIB_PCLOSE=0; AC_SUBST([GNULIB_PCLOSE])
+ GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR])
+ GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN])
+ GNULIB_PRINTF=0; AC_SUBST([GNULIB_PRINTF])
+ GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX])
+ GNULIB_PUTC=0; AC_SUBST([GNULIB_PUTC])
+ GNULIB_PUTCHAR=0; AC_SUBST([GNULIB_PUTCHAR])
+ GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS])
+ GNULIB_REMOVE=0; AC_SUBST([GNULIB_REMOVE])
+ GNULIB_RENAME=0; AC_SUBST([GNULIB_RENAME])
+ GNULIB_RENAMEAT=0; AC_SUBST([GNULIB_RENAMEAT])
+ GNULIB_SCANF=0; AC_SUBST([GNULIB_SCANF])
+ GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF])
+ GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX])
+ GNULIB_STDIO_H_NONBLOCKING=0; AC_SUBST([GNULIB_STDIO_H_NONBLOCKING])
+ GNULIB_STDIO_H_SIGPIPE=0; AC_SUBST([GNULIB_STDIO_H_SIGPIPE])
+ GNULIB_TMPFILE=0; AC_SUBST([GNULIB_TMPFILE])
+ GNULIB_VASPRINTF=0; AC_SUBST([GNULIB_VASPRINTF])
+ GNULIB_VFSCANF=0; AC_SUBST([GNULIB_VFSCANF])
+ GNULIB_VSCANF=0; AC_SUBST([GNULIB_VSCANF])
+ GNULIB_VDPRINTF=0; AC_SUBST([GNULIB_VDPRINTF])
+ GNULIB_VFPRINTF=0; AC_SUBST([GNULIB_VFPRINTF])
+ GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX])
+ GNULIB_VPRINTF=0; AC_SUBST([GNULIB_VPRINTF])
+ GNULIB_VPRINTF_POSIX=0; AC_SUBST([GNULIB_VPRINTF_POSIX])
+ GNULIB_VSNPRINTF=0; AC_SUBST([GNULIB_VSNPRINTF])
+ GNULIB_VSPRINTF_POSIX=0; AC_SUBST([GNULIB_VSPRINTF_POSIX])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_FCLOSEALL=1; AC_SUBST([GNULIB_MDA_FCLOSEALL])
+ GNULIB_MDA_FDOPEN=1; AC_SUBST([GNULIB_MDA_FDOPEN])
+ GNULIB_MDA_FILENO=1; AC_SUBST([GNULIB_MDA_FILENO])
+ GNULIB_MDA_GETW=1; AC_SUBST([GNULIB_MDA_GETW])
+ GNULIB_MDA_PUTW=1; AC_SUBST([GNULIB_MDA_PUTW])
+ GNULIB_MDA_TEMPNAM=1; AC_SUBST([GNULIB_MDA_TEMPNAM])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_FCLOSEALL=1; AC_SUBST([HAVE_DECL_FCLOSEALL])
+ HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE])
+ HAVE_DECL_FSEEKO=1; AC_SUBST([HAVE_DECL_FSEEKO])
+ HAVE_DECL_FTELLO=1; AC_SUBST([HAVE_DECL_FTELLO])
+ HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
+ HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
+ HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
+ HAVE_DECL_SNPRINTF=1; AC_SUBST([HAVE_DECL_SNPRINTF])
+ HAVE_DECL_VSNPRINTF=1; AC_SUBST([HAVE_DECL_VSNPRINTF])
+ HAVE_DPRINTF=1; AC_SUBST([HAVE_DPRINTF])
+ HAVE_FSEEKO=1; AC_SUBST([HAVE_FSEEKO])
+ HAVE_FTELLO=1; AC_SUBST([HAVE_FTELLO])
+ HAVE_PCLOSE=1; AC_SUBST([HAVE_PCLOSE])
+ HAVE_POPEN=1; AC_SUBST([HAVE_POPEN])
+ HAVE_RENAMEAT=1; AC_SUBST([HAVE_RENAMEAT])
+ HAVE_VASPRINTF=1; AC_SUBST([HAVE_VASPRINTF])
+ HAVE_VDPRINTF=1; AC_SUBST([HAVE_VDPRINTF])
+ REPLACE_DPRINTF=0; AC_SUBST([REPLACE_DPRINTF])
+ REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE])
+ REPLACE_FDOPEN=0; AC_SUBST([REPLACE_FDOPEN])
+ REPLACE_FFLUSH=0; AC_SUBST([REPLACE_FFLUSH])
+ REPLACE_FOPEN=0; AC_SUBST([REPLACE_FOPEN])
+ REPLACE_FPRINTF=0; AC_SUBST([REPLACE_FPRINTF])
+ REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE])
+ REPLACE_FREOPEN=0; AC_SUBST([REPLACE_FREOPEN])
+ REPLACE_FSEEK=0; AC_SUBST([REPLACE_FSEEK])
+ REPLACE_FSEEKO=0; AC_SUBST([REPLACE_FSEEKO])
+ REPLACE_FTELL=0; AC_SUBST([REPLACE_FTELL])
+ REPLACE_FTELLO=0; AC_SUBST([REPLACE_FTELLO])
+ REPLACE_GETDELIM=0; AC_SUBST([REPLACE_GETDELIM])
+ REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE])
+ REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF])
+ REPLACE_PERROR=0; AC_SUBST([REPLACE_PERROR])
+ REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN])
+ REPLACE_PRINTF=0; AC_SUBST([REPLACE_PRINTF])
+ REPLACE_REMOVE=0; AC_SUBST([REPLACE_REMOVE])
+ REPLACE_RENAME=0; AC_SUBST([REPLACE_RENAME])
+ REPLACE_RENAMEAT=0; AC_SUBST([REPLACE_RENAMEAT])
+ REPLACE_SNPRINTF=0; AC_SUBST([REPLACE_SNPRINTF])
+ REPLACE_SPRINTF=0; AC_SUBST([REPLACE_SPRINTF])
+ REPLACE_STDIO_READ_FUNCS=0; AC_SUBST([REPLACE_STDIO_READ_FUNCS])
+ REPLACE_STDIO_WRITE_FUNCS=0; AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
+ REPLACE_TMPFILE=0; AC_SUBST([REPLACE_TMPFILE])
+ REPLACE_VASPRINTF=0; AC_SUBST([REPLACE_VASPRINTF])
+ REPLACE_VDPRINTF=0; AC_SUBST([REPLACE_VDPRINTF])
+ REPLACE_VFPRINTF=0; AC_SUBST([REPLACE_VFPRINTF])
+ REPLACE_VPRINTF=0; AC_SUBST([REPLACE_VPRINTF])
+ REPLACE_VSNPRINTF=0; AC_SUBST([REPLACE_VSNPRINTF])
+ REPLACE_VSPRINTF=0; AC_SUBST([REPLACE_VSPRINTF])
+])
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
new file mode 100644
index 0000000..49d4eba
--- /dev/null
+++ b/m4/stdlib_h.m4
@@ -0,0 +1,170 @@
+# stdlib_h.m4 serial 55
+dnl Copyright (C) 2007-2020 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.
+
+AC_DEFUN([gl_STDLIB_H],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ gl_NEXT_HEADERS([stdlib.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <stdlib.h>
+#if HAVE_SYS_LOADAVG_H
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+ <sys/loadavg.h>. */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+#if HAVE_RANDOM_H
+# include <random.h>
+#endif
+ ]], [_Exit aligned_alloc atoll canonicalize_file_name free
+ getloadavg getsubopt grantpt
+ initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
+ posix_memalign posix_openpt ptsname ptsname_r qsort_r
+ random random_r reallocarray realpath rpmatch secure_getenv setenv
+ setstate setstate_r srandom srandom_r
+ strtod strtold strtoll strtoull unlockpt unsetenv])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([ecvt])
+ if test $ac_cv_have_decl_ecvt = no; then
+ HAVE_DECL_ECVT=0
+ fi
+ AC_CHECK_DECLS_ONCE([fcvt])
+ if test $ac_cv_have_decl_fcvt = no; then
+ HAVE_DECL_FCVT=0
+ fi
+ AC_CHECK_DECLS_ONCE([gcvt])
+ if test $ac_cv_have_decl_gcvt = no; then
+ HAVE_DECL_GCVT=0
+ fi
+])
+
+AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+ GNULIB__EXIT=0; AC_SUBST([GNULIB__EXIT])
+ GNULIB_ALIGNED_ALLOC=0; AC_SUBST([GNULIB_ALIGNED_ALLOC])
+ GNULIB_ATOLL=0; AC_SUBST([GNULIB_ATOLL])
+ GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX])
+ GNULIB_CANONICALIZE_FILE_NAME=0; AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
+ GNULIB_FREE_POSIX=0; AC_SUBST([GNULIB_FREE_POSIX])
+ GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG])
+ GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT])
+ GNULIB_GRANTPT=0; AC_SUBST([GNULIB_GRANTPT])
+ GNULIB_MALLOC_POSIX=0; AC_SUBST([GNULIB_MALLOC_POSIX])
+ GNULIB_MBTOWC=0; AC_SUBST([GNULIB_MBTOWC])
+ GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP])
+ GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP])
+ GNULIB_MKOSTEMPS=0; AC_SUBST([GNULIB_MKOSTEMPS])
+ GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP])
+ GNULIB_MKSTEMPS=0; AC_SUBST([GNULIB_MKSTEMPS])
+ GNULIB_POSIX_MEMALIGN=0;AC_SUBST([GNULIB_POSIX_MEMALIGN])
+ GNULIB_POSIX_OPENPT=0; AC_SUBST([GNULIB_POSIX_OPENPT])
+ GNULIB_PTSNAME=0; AC_SUBST([GNULIB_PTSNAME])
+ GNULIB_PTSNAME_R=0; AC_SUBST([GNULIB_PTSNAME_R])
+ GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV])
+ GNULIB_QSORT_R=0; AC_SUBST([GNULIB_QSORT_R])
+ GNULIB_RANDOM=0; AC_SUBST([GNULIB_RANDOM])
+ GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R])
+ GNULIB_REALLOCARRAY=0; AC_SUBST([GNULIB_REALLOCARRAY])
+ GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX])
+ GNULIB_REALPATH=0; AC_SUBST([GNULIB_REALPATH])
+ GNULIB_RPMATCH=0; AC_SUBST([GNULIB_RPMATCH])
+ GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV])
+ GNULIB_SETENV=0; AC_SUBST([GNULIB_SETENV])
+ GNULIB_STRTOD=0; AC_SUBST([GNULIB_STRTOD])
+ GNULIB_STRTOLD=0; AC_SUBST([GNULIB_STRTOLD])
+ GNULIB_STRTOLL=0; AC_SUBST([GNULIB_STRTOLL])
+ GNULIB_STRTOULL=0; AC_SUBST([GNULIB_STRTOULL])
+ GNULIB_SYSTEM_POSIX=0; AC_SUBST([GNULIB_SYSTEM_POSIX])
+ GNULIB_UNLOCKPT=0; AC_SUBST([GNULIB_UNLOCKPT])
+ GNULIB_UNSETENV=0; AC_SUBST([GNULIB_UNSETENV])
+ GNULIB_WCTOMB=0; AC_SUBST([GNULIB_WCTOMB])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_ECVT=1; AC_SUBST([GNULIB_MDA_ECVT])
+ GNULIB_MDA_FCVT=1; AC_SUBST([GNULIB_MDA_FCVT])
+ GNULIB_MDA_GCVT=1; AC_SUBST([GNULIB_MDA_GCVT])
+ GNULIB_MDA_MKTEMP=1; AC_SUBST([GNULIB_MDA_MKTEMP])
+ GNULIB_MDA_PUTENV=1; AC_SUBST([GNULIB_MDA_PUTENV])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE__EXIT=1; AC_SUBST([HAVE__EXIT])
+ HAVE_ALIGNED_ALLOC=1; AC_SUBST([HAVE_ALIGNED_ALLOC])
+ HAVE_ATOLL=1; AC_SUBST([HAVE_ATOLL])
+ HAVE_CANONICALIZE_FILE_NAME=1; AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+ HAVE_DECL_ECVT=1; AC_SUBST([HAVE_DECL_ECVT])
+ HAVE_DECL_FCVT=1; AC_SUBST([HAVE_DECL_FCVT])
+ HAVE_DECL_GCVT=1; AC_SUBST([HAVE_DECL_GCVT])
+ HAVE_DECL_GETLOADAVG=1; AC_SUBST([HAVE_DECL_GETLOADAVG])
+ HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
+ HAVE_GRANTPT=1; AC_SUBST([HAVE_GRANTPT])
+ HAVE_INITSTATE=1; AC_SUBST([HAVE_INITSTATE])
+ HAVE_DECL_INITSTATE=1; AC_SUBST([HAVE_DECL_INITSTATE])
+ HAVE_MBTOWC=1; AC_SUBST([HAVE_MBTOWC])
+ HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
+ HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP])
+ HAVE_MKOSTEMPS=1; AC_SUBST([HAVE_MKOSTEMPS])
+ HAVE_MKSTEMP=1; AC_SUBST([HAVE_MKSTEMP])
+ HAVE_MKSTEMPS=1; AC_SUBST([HAVE_MKSTEMPS])
+ HAVE_POSIX_MEMALIGN=1; AC_SUBST([HAVE_POSIX_MEMALIGN])
+ HAVE_POSIX_OPENPT=1; AC_SUBST([HAVE_POSIX_OPENPT])
+ HAVE_PTSNAME=1; AC_SUBST([HAVE_PTSNAME])
+ HAVE_PTSNAME_R=1; AC_SUBST([HAVE_PTSNAME_R])
+ HAVE_QSORT_R=1; AC_SUBST([HAVE_QSORT_R])
+ HAVE_RANDOM=1; AC_SUBST([HAVE_RANDOM])
+ HAVE_RANDOM_H=1; AC_SUBST([HAVE_RANDOM_H])
+ HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R])
+ HAVE_REALLOCARRAY=1; AC_SUBST([HAVE_REALLOCARRAY])
+ HAVE_REALPATH=1; AC_SUBST([HAVE_REALPATH])
+ HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH])
+ HAVE_SECURE_GETENV=1; AC_SUBST([HAVE_SECURE_GETENV])
+ HAVE_SETENV=1; AC_SUBST([HAVE_SETENV])
+ HAVE_DECL_SETENV=1; AC_SUBST([HAVE_DECL_SETENV])
+ HAVE_SETSTATE=1; AC_SUBST([HAVE_SETSTATE])
+ HAVE_DECL_SETSTATE=1; AC_SUBST([HAVE_DECL_SETSTATE])
+ HAVE_STRTOD=1; AC_SUBST([HAVE_STRTOD])
+ HAVE_STRTOLD=1; AC_SUBST([HAVE_STRTOLD])
+ HAVE_STRTOLL=1; AC_SUBST([HAVE_STRTOLL])
+ HAVE_STRTOULL=1; AC_SUBST([HAVE_STRTOULL])
+ HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
+ HAVE_SYS_LOADAVG_H=0; AC_SUBST([HAVE_SYS_LOADAVG_H])
+ HAVE_UNLOCKPT=1; AC_SUBST([HAVE_UNLOCKPT])
+ HAVE_DECL_UNSETENV=1; AC_SUBST([HAVE_DECL_UNSETENV])
+ REPLACE_ALIGNED_ALLOC=0; AC_SUBST([REPLACE_ALIGNED_ALLOC])
+ REPLACE_CALLOC=0; AC_SUBST([REPLACE_CALLOC])
+ REPLACE_CANONICALIZE_FILE_NAME=0; AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+ REPLACE_FREE=0; AC_SUBST([REPLACE_FREE])
+ REPLACE_INITSTATE=0; AC_SUBST([REPLACE_INITSTATE])
+ REPLACE_MALLOC=0; AC_SUBST([REPLACE_MALLOC])
+ REPLACE_MBTOWC=0; AC_SUBST([REPLACE_MBTOWC])
+ REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP])
+ REPLACE_POSIX_MEMALIGN=0; AC_SUBST([REPLACE_POSIX_MEMALIGN])
+ REPLACE_PTSNAME=0; AC_SUBST([REPLACE_PTSNAME])
+ REPLACE_PTSNAME_R=0; AC_SUBST([REPLACE_PTSNAME_R])
+ REPLACE_PUTENV=0; AC_SUBST([REPLACE_PUTENV])
+ REPLACE_QSORT_R=0; AC_SUBST([REPLACE_QSORT_R])
+ REPLACE_RANDOM=0; AC_SUBST([REPLACE_RANDOM])
+ REPLACE_RANDOM_R=0; AC_SUBST([REPLACE_RANDOM_R])
+ REPLACE_REALLOC=0; AC_SUBST([REPLACE_REALLOC])
+ REPLACE_REALPATH=0; AC_SUBST([REPLACE_REALPATH])
+ REPLACE_SETENV=0; AC_SUBST([REPLACE_SETENV])
+ REPLACE_SETSTATE=0; AC_SUBST([REPLACE_SETSTATE])
+ REPLACE_STRTOD=0; AC_SUBST([REPLACE_STRTOD])
+ REPLACE_STRTOLD=0; AC_SUBST([REPLACE_STRTOLD])
+ REPLACE_UNSETENV=0; AC_SUBST([REPLACE_UNSETENV])
+ REPLACE_WCTOMB=0; AC_SUBST([REPLACE_WCTOMB])
+])
diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4
new file mode 100644
index 0000000..0f0fa9e
--- /dev/null
+++ b/m4/stpcpy.m4
@@ -0,0 +1,25 @@
+# stpcpy.m4 serial 8
+dnl Copyright (C) 2002, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STPCPY],
+[
+ dnl Persuade glibc <string.h> to declare stpcpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([stpcpy])
+ if test $ac_cv_func_stpcpy = no; then
+ HAVE_STPCPY=0
+ fi
+])
+
+# Prerequisites of lib/stpcpy.c.
+AC_DEFUN([gl_PREREQ_STPCPY], [
+ :
+])
diff --git a/m4/strcase.m4 b/m4/strcase.m4
new file mode 100644
index 0000000..21d80c8
--- /dev/null
+++ b/m4/strcase.m4
@@ -0,0 +1,45 @@
+# strcase.m4 serial 11
+dnl Copyright (C) 2002, 2005-2020 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.
+
+AC_DEFUN([gl_STRCASE],
+[
+ gl_FUNC_STRCASECMP
+ gl_FUNC_STRNCASECMP
+])
+
+AC_DEFUN([gl_FUNC_STRCASECMP],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ AC_CHECK_FUNCS([strcasecmp])
+ if test $ac_cv_func_strcasecmp = no; then
+ HAVE_STRCASECMP=0
+ fi
+])
+
+AC_DEFUN([gl_FUNC_STRNCASECMP],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ AC_CHECK_FUNCS([strncasecmp])
+ if test $ac_cv_func_strncasecmp = yes; then
+ HAVE_STRNCASECMP=1
+ else
+ HAVE_STRNCASECMP=0
+ fi
+ AC_CHECK_DECLS([strncasecmp])
+ if test $ac_cv_have_decl_strncasecmp = no; then
+ HAVE_DECL_STRNCASECMP=0
+ fi
+])
+
+# Prerequisites of lib/strcasecmp.c.
+AC_DEFUN([gl_PREREQ_STRCASECMP], [
+ :
+])
+
+# Prerequisites of lib/strncasecmp.c.
+AC_DEFUN([gl_PREREQ_STRNCASECMP], [
+ :
+])
diff --git a/m4/strchrnul.m4 b/m4/strchrnul.m4
new file mode 100644
index 0000000..a18f093
--- /dev/null
+++ b/m4/strchrnul.m4
@@ -0,0 +1,50 @@
+# strchrnul.m4 serial 9
+dnl Copyright (C) 2003, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRCHRNUL],
+[
+ dnl Persuade glibc <string.h> to declare strchrnul().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([strchrnul])
+ if test $ac_cv_func_strchrnul = no; then
+ HAVE_STRCHRNUL=0
+ else
+ AC_CACHE_CHECK([whether strchrnul works],
+ [gl_cv_func_strchrnul_works],
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <string.h> /* for strchrnul */
+]], [[const char *buf = "a";
+ return strchrnul (buf, 'b') != buf + 1;
+ ]])],
+ [gl_cv_func_strchrnul_works=yes],
+ [gl_cv_func_strchrnul_works=no],
+ [dnl Cygwin 1.7.9 introduced strchrnul, but it was broken until 1.7.10
+ AC_EGREP_CPP([Lucky user],
+ [
+#if defined __CYGWIN__
+ #include <cygwin/version.h>
+ #if CYGWIN_VERSION_DLL_COMBINED > CYGWIN_VERSION_DLL_MAKE_COMBINED (1007, 9)
+ Lucky user
+ #endif
+#else
+ Lucky user
+#endif
+ ],
+ [gl_cv_func_strchrnul_works="guessing yes"],
+ [gl_cv_func_strchrnul_works="guessing no"])
+ ])
+ ])
+ case "$gl_cv_func_strchrnul_works" in
+ *yes) ;;
+ *) REPLACE_STRCHRNUL=1 ;;
+ esac
+ fi
+])
+
+# Prerequisites of lib/strchrnul.c.
+AC_DEFUN([gl_PREREQ_STRCHRNUL], [:])
diff --git a/m4/strdup.m4 b/m4/strdup.m4
new file mode 100644
index 0000000..6340209
--- /dev/null
+++ b/m4/strdup.m4
@@ -0,0 +1,32 @@
+# strdup.m4 serial 14
+
+dnl Copyright (C) 2002-2020 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.
+
+AC_DEFUN([gl_FUNC_STRDUP],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strdup])
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+])
+
+AC_DEFUN([gl_FUNC_STRDUP_POSIX],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+ if test $gl_cv_func_malloc_posix != yes; then
+ REPLACE_STRDUP=1
+ fi
+ AC_CHECK_DECLS_ONCE([strdup])
+ if test $ac_cv_have_decl_strdup = no; then
+ HAVE_DECL_STRDUP=0
+ fi
+])
+
+# Prerequisites of lib/strdup.c.
+AC_DEFUN([gl_PREREQ_STRDUP], [:])
diff --git a/m4/strerror.m4 b/m4/strerror.m4
new file mode 100644
index 0000000..fd84ce8
--- /dev/null
+++ b/m4/strerror.m4
@@ -0,0 +1,102 @@
+# strerror.m4 serial 21
+dnl Copyright (C) 2002, 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_STRERROR],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_HEADER_ERRNO_H])
+ AC_REQUIRE([gl_FUNC_STRERROR_0])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
+ AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
+ ])
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ AC_CACHE_CHECK([for working strerror function],
+ [gl_cv_func_working_strerror],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ ]],
+ [[if (!*strerror (-2)) return 1;]])],
+ [gl_cv_func_working_strerror=yes],
+ [gl_cv_func_working_strerror=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_strerror="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_working_strerror" in
+ *yes) ;;
+ *)
+ dnl The system's strerror() fails to return a string for out-of-range
+ dnl integers. Replace it.
+ REPLACE_STRERROR=1
+ ;;
+ esac
+ m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
+ dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's
+ dnl buffer, we must replace strerror.
+ case "$gl_cv_func_strerror_r_works" in
+ *no) REPLACE_STRERROR=1 ;;
+ esac
+ ])
+ else
+ dnl The system's strerror() cannot know about the new errno values we add
+ dnl to <errno.h>, or any fix for strerror(0). Replace it.
+ REPLACE_STRERROR=1
+ fi
+])
+
+dnl Detect if strerror(0) passes (that is, does not set errno, and does not
+dnl return a string that matches strerror(-1)).
+AC_DEFUN([gl_FUNC_STRERROR_0],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ REPLACE_STRERROR_0=0
+ AC_CACHE_CHECK([whether strerror(0) succeeds],
+ [gl_cv_func_strerror_0_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ #include <errno.h>
+ ]],
+ [[int result = 0;
+ char *str;
+ errno = 0;
+ str = strerror (0);
+ if (!*str) result |= 1;
+ if (errno) result |= 2;
+ if (strstr (str, "nknown") || strstr (str, "ndefined"))
+ result |= 4;
+ return result;]])],
+ [gl_cv_func_strerror_0_works=yes],
+ [gl_cv_func_strerror_0_works=no],
+ [case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_strerror_0_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_strerror_0_works" in
+ *yes) ;;
+ *)
+ REPLACE_STRERROR_0=1
+ AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0)
+ does not return a message implying success.])
+ ;;
+ esac
+])
diff --git a/m4/strerror_r.m4 b/m4/strerror_r.m4
new file mode 100644
index 0000000..d431f23
--- /dev/null
+++ b/m4/strerror_r.m4
@@ -0,0 +1,173 @@
+# strerror_r.m4 serial 20
+dnl Copyright (C) 2002, 2007-2020 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.
+
+AC_DEFUN([gl_FUNC_STRERROR_R],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
+
+ dnl Persuade Solaris <string.h> to declare strerror_r().
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ dnl Some systems don't declare strerror_r() if _THREAD_SAFE and _REENTRANT
+ dnl are not defined.
+ AC_CHECK_DECLS_ONCE([strerror_r])
+ if test $ac_cv_have_decl_strerror_r = no; then
+ HAVE_DECL_STRERROR_R=0
+ fi
+
+ if test $ac_cv_func_strerror_r = yes; then
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ if test $gl_cv_func_strerror_r_posix_signature = yes; then
+ case "$gl_cv_func_strerror_r_works" in
+ dnl The system's strerror_r has bugs. Replace it.
+ *no) REPLACE_STRERROR_R=1 ;;
+ esac
+ else
+ dnl The system's strerror_r() has a wrong signature. Replace it.
+ REPLACE_STRERROR_R=1
+ fi
+ else
+ dnl The system's strerror_r() cannot know about the new errno values we
+ dnl add to <errno.h>, or any fix for strerror(0). Replace it.
+ REPLACE_STRERROR_R=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/strerror_r.c.
+AC_DEFUN([gl_PREREQ_STRERROR_R], [
+ dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
+ AC_CHECK_FUNCS_ONCE([__xpg_strerror_r])
+ AC_CHECK_FUNCS_ONCE([catgets])
+ AC_CHECK_FUNCS_ONCE([snprintf])
+])
+
+# Detect if strerror_r works, but without affecting whether a replacement
+# strerror_r will be used.
+AC_DEFUN([gl_FUNC_STRERROR_R_WORKS],
+[
+ AC_REQUIRE([gl_HEADER_ERRNO_H])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_FUNC_STRERROR_0])
+
+ AC_CHECK_FUNCS_ONCE([strerror_r])
+ if test $ac_cv_func_strerror_r = yes; then
+ if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+ dnl The POSIX prototype is: int strerror_r (int, char *, size_t);
+ dnl glibc, Cygwin: char *strerror_r (int, char *, size_t);
+ dnl AIX 5.1, OSF/1 5.1: int strerror_r (int, char *, int);
+ AC_CACHE_CHECK([for strerror_r with POSIX signature],
+ [gl_cv_func_strerror_r_posix_signature],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <string.h>
+ int strerror_r (int, char *, size_t);
+ ]],
+ [])],
+ [gl_cv_func_strerror_r_posix_signature=yes],
+ [gl_cv_func_strerror_r_posix_signature=no])
+ ])
+ if test $gl_cv_func_strerror_r_posix_signature = yes; then
+ dnl AIX 6.1 strerror_r fails by returning -1, not an error number.
+ dnl HP-UX 11.31 strerror_r always fails when the buffer length argument
+ dnl is less than 80.
+ dnl FreeBSD 8.s strerror_r claims failure on 0
+ dnl Mac OS X 10.5 strerror_r treats 0 like -1
+ dnl Solaris 10 strerror_r corrupts errno on failure
+ AC_CACHE_CHECK([whether strerror_r works],
+ [gl_cv_func_strerror_r_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <errno.h>
+ #include <string.h>
+ ]],
+ [[int result = 0;
+ char buf[79];
+ if (strerror_r (EACCES, buf, 0) < 0)
+ result |= 1;
+ errno = 0;
+ if (strerror_r (EACCES, buf, sizeof buf) != 0)
+ result |= 2;
+ strcpy (buf, "Unknown");
+ if (strerror_r (0, buf, sizeof buf) != 0)
+ result |= 4;
+ if (errno)
+ result |= 8;
+ if (strstr (buf, "nknown") || strstr (buf, "ndefined"))
+ result |= 0x10;
+ errno = 0;
+ *buf = 0;
+ if (strerror_r (-3, buf, sizeof buf) < 0)
+ result |= 0x20;
+ if (errno)
+ result |= 0x40;
+ if (!*buf)
+ result |= 0x80;
+ return result;
+ ]])],
+ [gl_cv_func_strerror_r_works=yes],
+ [gl_cv_func_strerror_r_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX.
+ aix*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess no on HP-UX.
+ hpux*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess no on BSD variants.
+ *bsd*) gl_cv_func_strerror_r_works="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_strerror_r_works="guessing yes";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ else
+ dnl The system's strerror() has a wrong signature.
+ dnl glibc >= 2.3.4 and cygwin 1.7.9 have a function __xpg_strerror_r.
+ AC_CHECK_FUNCS_ONCE([__xpg_strerror_r])
+ dnl In glibc < 2.14, __xpg_strerror_r does not populate buf on failure.
+ dnl In cygwin < 1.7.10, __xpg_strerror_r clobbers strerror's buffer.
+ if test $ac_cv_func___xpg_strerror_r = yes; then
+ AC_CACHE_CHECK([whether __xpg_strerror_r works],
+ [gl_cv_func_strerror_r_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <errno.h>
+ #include <string.h>
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ int __xpg_strerror_r(int, char *, size_t);
+ ]],
+ [[int result = 0;
+ char buf[256] = "^";
+ char copy[256];
+ char *str = strerror (-1);
+ strcpy (copy, str);
+ if (__xpg_strerror_r (-2, buf, 1) == 0)
+ result |= 1;
+ if (*buf)
+ result |= 2;
+ __xpg_strerror_r (-2, buf, 256);
+ if (strcmp (str, copy))
+ result |= 4;
+ return result;
+ ]])],
+ [gl_cv_func_strerror_r_works=yes],
+ [gl_cv_func_strerror_r_works=no],
+ [dnl Guess no on all platforms that have __xpg_strerror_r,
+ dnl at least until fixed glibc and cygwin are more common.
+ gl_cv_func_strerror_r_works="$gl_cross_guess_normal"
+ ])
+ ])
+ fi
+ fi
+ fi
+ fi
+])
diff --git a/m4/string_h.m4 b/m4/string_h.m4
new file mode 100644
index 0000000..3d41c63
--- /dev/null
+++ b/m4/string_h.m4
@@ -0,0 +1,132 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007-2020 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 28
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_HEADER_STRING_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_STRING_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_BODY],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ gl_NEXT_HEADERS([string.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use, and which is not
+ dnl guaranteed by C89.
+ gl_WARN_ON_USE_PREPARE([[#include <string.h>
+ ]],
+ [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul
+ strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
+ strerror_r strerrorname_np sigabbrev_np sigdescr_np strsignal strverscmp])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+AC_DEFUN([gl_STRING_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+[
+ GNULIB_EXPLICIT_BZERO=0; AC_SUBST([GNULIB_EXPLICIT_BZERO])
+ GNULIB_FFSL=0; AC_SUBST([GNULIB_FFSL])
+ GNULIB_FFSLL=0; AC_SUBST([GNULIB_FFSLL])
+ GNULIB_MEMCHR=0; AC_SUBST([GNULIB_MEMCHR])
+ GNULIB_MEMMEM=0; AC_SUBST([GNULIB_MEMMEM])
+ GNULIB_MEMPCPY=0; AC_SUBST([GNULIB_MEMPCPY])
+ GNULIB_MEMRCHR=0; AC_SUBST([GNULIB_MEMRCHR])
+ GNULIB_RAWMEMCHR=0; AC_SUBST([GNULIB_RAWMEMCHR])
+ GNULIB_STPCPY=0; AC_SUBST([GNULIB_STPCPY])
+ GNULIB_STPNCPY=0; AC_SUBST([GNULIB_STPNCPY])
+ GNULIB_STRCHRNUL=0; AC_SUBST([GNULIB_STRCHRNUL])
+ GNULIB_STRDUP=0; AC_SUBST([GNULIB_STRDUP])
+ GNULIB_STRNCAT=0; AC_SUBST([GNULIB_STRNCAT])
+ GNULIB_STRNDUP=0; AC_SUBST([GNULIB_STRNDUP])
+ GNULIB_STRNLEN=0; AC_SUBST([GNULIB_STRNLEN])
+ GNULIB_STRPBRK=0; AC_SUBST([GNULIB_STRPBRK])
+ GNULIB_STRSEP=0; AC_SUBST([GNULIB_STRSEP])
+ GNULIB_STRSTR=0; AC_SUBST([GNULIB_STRSTR])
+ GNULIB_STRCASESTR=0; AC_SUBST([GNULIB_STRCASESTR])
+ GNULIB_STRTOK_R=0; AC_SUBST([GNULIB_STRTOK_R])
+ GNULIB_MBSLEN=0; AC_SUBST([GNULIB_MBSLEN])
+ GNULIB_MBSNLEN=0; AC_SUBST([GNULIB_MBSNLEN])
+ GNULIB_MBSCHR=0; AC_SUBST([GNULIB_MBSCHR])
+ GNULIB_MBSRCHR=0; AC_SUBST([GNULIB_MBSRCHR])
+ GNULIB_MBSSTR=0; AC_SUBST([GNULIB_MBSSTR])
+ GNULIB_MBSCASECMP=0; AC_SUBST([GNULIB_MBSCASECMP])
+ GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP])
+ GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP])
+ GNULIB_MBSCASESTR=0; AC_SUBST([GNULIB_MBSCASESTR])
+ GNULIB_MBSCSPN=0; AC_SUBST([GNULIB_MBSCSPN])
+ GNULIB_MBSPBRK=0; AC_SUBST([GNULIB_MBSPBRK])
+ GNULIB_MBSSPN=0; AC_SUBST([GNULIB_MBSSPN])
+ GNULIB_MBSSEP=0; AC_SUBST([GNULIB_MBSSEP])
+ GNULIB_MBSTOK_R=0; AC_SUBST([GNULIB_MBSTOK_R])
+ GNULIB_STRERROR=0; AC_SUBST([GNULIB_STRERROR])
+ GNULIB_STRERROR_R=0; AC_SUBST([GNULIB_STRERROR_R])
+ GNULIB_STRERRORNAME_NP=0; AC_SUBST([GNULIB_STRERRORNAME_NP])
+ GNULIB_SIGABBREV_NP=0; AC_SUBST([GNULIB_SIGABBREV_NP])
+ GNULIB_SIGDESCR_NP=0; AC_SUBST([GNULIB_SIGDESCR_NP])
+ GNULIB_STRSIGNAL=0; AC_SUBST([GNULIB_STRSIGNAL])
+ GNULIB_STRVERSCMP=0; AC_SUBST([GNULIB_STRVERSCMP])
+ HAVE_MBSLEN=0; AC_SUBST([HAVE_MBSLEN])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_MEMCCPY=1; AC_SUBST([GNULIB_MDA_MEMCCPY])
+ GNULIB_MDA_STRDUP=1; AC_SUBST([GNULIB_MDA_STRDUP])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_EXPLICIT_BZERO=1; AC_SUBST([HAVE_EXPLICIT_BZERO])
+ HAVE_FFSL=1; AC_SUBST([HAVE_FFSL])
+ HAVE_FFSLL=1; AC_SUBST([HAVE_FFSLL])
+ HAVE_DECL_MEMMEM=1; AC_SUBST([HAVE_DECL_MEMMEM])
+ HAVE_MEMPCPY=1; AC_SUBST([HAVE_MEMPCPY])
+ HAVE_DECL_MEMRCHR=1; AC_SUBST([HAVE_DECL_MEMRCHR])
+ HAVE_RAWMEMCHR=1; AC_SUBST([HAVE_RAWMEMCHR])
+ HAVE_STPCPY=1; AC_SUBST([HAVE_STPCPY])
+ HAVE_STPNCPY=1; AC_SUBST([HAVE_STPNCPY])
+ HAVE_STRCHRNUL=1; AC_SUBST([HAVE_STRCHRNUL])
+ HAVE_DECL_STRDUP=1; AC_SUBST([HAVE_DECL_STRDUP])
+ HAVE_DECL_STRNDUP=1; AC_SUBST([HAVE_DECL_STRNDUP])
+ HAVE_DECL_STRNLEN=1; AC_SUBST([HAVE_DECL_STRNLEN])
+ HAVE_STRPBRK=1; AC_SUBST([HAVE_STRPBRK])
+ HAVE_STRSEP=1; AC_SUBST([HAVE_STRSEP])
+ HAVE_STRCASESTR=1; AC_SUBST([HAVE_STRCASESTR])
+ HAVE_DECL_STRTOK_R=1; AC_SUBST([HAVE_DECL_STRTOK_R])
+ HAVE_DECL_STRERROR_R=1; AC_SUBST([HAVE_DECL_STRERROR_R])
+ HAVE_STRERRORNAME_NP=1; AC_SUBST([HAVE_STRERRORNAME_NP])
+ HAVE_SIGABBREV_NP=1; AC_SUBST([HAVE_SIGABBREV_NP])
+ HAVE_SIGDESCR_NP=1; AC_SUBST([HAVE_SIGDESCR_NP])
+ HAVE_DECL_STRSIGNAL=1; AC_SUBST([HAVE_DECL_STRSIGNAL])
+ HAVE_STRVERSCMP=1; AC_SUBST([HAVE_STRVERSCMP])
+ REPLACE_MEMCHR=0; AC_SUBST([REPLACE_MEMCHR])
+ REPLACE_MEMMEM=0; AC_SUBST([REPLACE_MEMMEM])
+ REPLACE_STPNCPY=0; AC_SUBST([REPLACE_STPNCPY])
+ REPLACE_STRCHRNUL=0; AC_SUBST([REPLACE_STRCHRNUL])
+ REPLACE_STRDUP=0; AC_SUBST([REPLACE_STRDUP])
+ REPLACE_STRNCAT=0; AC_SUBST([REPLACE_STRNCAT])
+ REPLACE_STRNDUP=0; AC_SUBST([REPLACE_STRNDUP])
+ REPLACE_STRNLEN=0; AC_SUBST([REPLACE_STRNLEN])
+ REPLACE_STRSTR=0; AC_SUBST([REPLACE_STRSTR])
+ REPLACE_STRCASESTR=0; AC_SUBST([REPLACE_STRCASESTR])
+ REPLACE_STRTOK_R=0; AC_SUBST([REPLACE_STRTOK_R])
+ REPLACE_STRERROR=0; AC_SUBST([REPLACE_STRERROR])
+ REPLACE_STRERROR_R=0; AC_SUBST([REPLACE_STRERROR_R])
+ REPLACE_STRERRORNAME_NP=0; AC_SUBST([REPLACE_STRERRORNAME_NP])
+ REPLACE_STRSIGNAL=0; AC_SUBST([REPLACE_STRSIGNAL])
+ UNDEFINE_STRTOK_R=0; AC_SUBST([UNDEFINE_STRTOK_R])
+])
diff --git a/m4/strings_h.m4 b/m4/strings_h.m4
new file mode 100644
index 0000000..4aadca0
--- /dev/null
+++ b/m4/strings_h.m4
@@ -0,0 +1,52 @@
+# Configure a replacement for <strings.h>.
+# serial 6
+
+# Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_HEADER_STRINGS_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_STRINGS_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRINGS_H_BODY],
+[
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([strings.h])
+ if test $ac_cv_header_strings_h = yes; then
+ HAVE_STRINGS_H=1
+ else
+ HAVE_STRINGS_H=0
+ fi
+ AC_SUBST([HAVE_STRINGS_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+ /* Minix 3.1.8 has a bug: <sys/types.h> must be included before
+ <strings.h>. */
+ #include <sys/types.h>
+ #include <strings.h>
+ ]], [ffs strcasecmp strncasecmp])
+])
+
+AC_DEFUN([gl_STRINGS_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS],
+[
+ GNULIB_FFS=0; AC_SUBST([GNULIB_FFS])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_FFS=1; AC_SUBST([HAVE_FFS])
+ HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP])
+ HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP])
+])
diff --git a/m4/strndup.m4 b/m4/strndup.m4
new file mode 100644
index 0000000..006a31a
--- /dev/null
+++ b/m4/strndup.m4
@@ -0,0 +1,58 @@
+# strndup.m4 serial 22
+dnl Copyright (C) 2002-2003, 2005-2020 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.
+
+AC_DEFUN([gl_FUNC_STRNDUP],
+[
+ dnl Persuade glibc <string.h> to declare strndup().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_DECLS_ONCE([strndup])
+ AC_CHECK_FUNCS_ONCE([strndup])
+ if test $ac_cv_have_decl_strndup = no; then
+ HAVE_DECL_STRNDUP=0
+ fi
+
+ if test $ac_cv_func_strndup = yes; then
+ HAVE_STRNDUP=1
+ # AIX 4.3.3, AIX 5.1 have a function that fails to add the terminating '\0'.
+ AC_CACHE_CHECK([for working strndup], [gl_cv_func_strndup_works],
+ [AC_RUN_IFELSE([
+ AC_LANG_PROGRAM([[#include <string.h>
+ #include <stdlib.h>]], [[
+#if !HAVE_DECL_STRNDUP
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ char *strndup (const char *, size_t);
+#endif
+ int result;
+ char *s;
+ s = strndup ("some longer string", 15);
+ free (s);
+ s = strndup ("shorter string", 13);
+ result = s[13] != '\0';
+ free (s);
+ return result;]])],
+ [gl_cv_func_strndup_works=yes],
+ [gl_cv_func_strndup_works=no],
+ [
+changequote(,)dnl
+ case $host_os in
+ aix | aix[3-6]*) gl_cv_func_strndup_works="guessing no";;
+ *) gl_cv_func_strndup_works="guessing yes";;
+ esac
+changequote([,])dnl
+ ])])
+ case $gl_cv_func_strndup_works in
+ *no) REPLACE_STRNDUP=1 ;;
+ esac
+ else
+ HAVE_STRNDUP=0
+ fi
+])
diff --git a/m4/strnlen.m4 b/m4/strnlen.m4
new file mode 100644
index 0000000..71b8e1b
--- /dev/null
+++ b/m4/strnlen.m4
@@ -0,0 +1,30 @@
+# strnlen.m4 serial 13
+dnl Copyright (C) 2002-2003, 2005-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRNLEN],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+
+ dnl Persuade glibc <string.h> to declare strnlen().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([strnlen])
+ if test $ac_cv_have_decl_strnlen = no; then
+ HAVE_DECL_STRNLEN=0
+ else
+ m4_pushdef([AC_LIBOBJ], [:])
+ dnl Note: AC_FUNC_STRNLEN does AC_LIBOBJ([strnlen]).
+ AC_FUNC_STRNLEN
+ m4_popdef([AC_LIBOBJ])
+ if test $ac_cv_func_strnlen_working = no; then
+ REPLACE_STRNLEN=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/strnlen.c.
+AC_DEFUN([gl_PREREQ_STRNLEN], [:])
diff --git a/m4/strpbrk.m4 b/m4/strpbrk.m4
new file mode 100644
index 0000000..7e74337
--- /dev/null
+++ b/m4/strpbrk.m4
@@ -0,0 +1,17 @@
+# strpbrk.m4 serial 6
+dnl Copyright (C) 2002-2003, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRPBRK],
+[
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_CHECK_FUNCS([strpbrk])
+ if test $ac_cv_func_strpbrk = no; then
+ HAVE_STRPBRK=0
+ fi
+])
+
+# Prerequisites of lib/strpbrk.c.
+AC_DEFUN([gl_PREREQ_STRPBRK], [:])
diff --git a/m4/strptime.m4 b/m4/strptime.m4
new file mode 100644
index 0000000..d4b9290
--- /dev/null
+++ b/m4/strptime.m4
@@ -0,0 +1,22 @@
+# strptime.m4 serial 7
+dnl Copyright (C) 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRPTIME],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_CHECK_FUNCS_ONCE([strptime])
+ if test $ac_cv_func_strptime != yes; then
+ HAVE_STRPTIME=0
+ fi
+])
+
+# Prerequisites of lib/strptime.c.
+AC_DEFUN([gl_PREREQ_STRPTIME],
+[
+ AC_REQUIRE([gl_TM_GMTOFF])
+ :
+])
diff --git a/m4/strtok_r.m4 b/m4/strtok_r.m4
new file mode 100644
index 0000000..2da132c
--- /dev/null
+++ b/m4/strtok_r.m4
@@ -0,0 +1,73 @@
+# strtok_r.m4 serial 15
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRTOK_R],
+[
+ dnl The strtok_r() declaration in lib/string.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS([strtok_r])
+ if test $ac_cv_func_strtok_r = yes; then
+ HAVE_STRTOK_R=1
+ dnl glibc 2.7 has a bug in strtok_r that causes a segmentation fault
+ dnl when the second argument to strtok_r is a constant string that has
+ dnl exactly one byte and compiling with optimization. This bug is, for
+ dnl example, present in the glibc 2.7-18 package in Debian "lenny".
+ dnl See <https://sourceware.org/bugzilla/show_bug.cgi?id=5614>.
+ AC_CACHE_CHECK([whether strtok_r works], [gl_cv_func_strtok_r_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #ifndef __OPTIMIZE__
+ # define __OPTIMIZE__ 1
+ #endif
+ #undef __OPTIMIZE_SIZE__
+ #undef __NO_INLINE__
+ #include <stdlib.h>
+ #include <string.h>
+ ]],
+ [[static const char dummy[] = "\177\01a";
+ char delimiters[] = "xxxxxxxx";
+ char *save_ptr = (char *) dummy;
+ strtok_r (delimiters, "x", &save_ptr);
+ strtok_r (NULL, "x", &save_ptr);
+ return 0;
+ ]])
+ ],
+ [gl_cv_func_strtok_r_works=yes],
+ [gl_cv_func_strtok_r_works=no],
+ [case "$host_os" in
+ # Guess no on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_strtok_r_works="guessing no" ;;
+ # Guess yes on native Windows.
+ mingw*) gl_cv_func_strtok_r_works="guessing yes" ;;
+ *) gl_cv_func_strtok_r_works="guessing yes" ;;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_strtok_r_works" in
+ *no)
+ dnl We could set REPLACE_STRTOK_R=1 here, but it's only the macro
+ dnl version in <bits/string2.h> which is wrong. The code compiled
+ dnl into libc is fine.
+ UNDEFINE_STRTOK_R=1
+ ;;
+ esac
+ else
+ HAVE_STRTOK_R=0
+ fi
+ AC_CHECK_DECLS_ONCE([strtok_r])
+ if test $ac_cv_have_decl_strtok_r = no; then
+ HAVE_DECL_STRTOK_R=0
+ fi
+])
+
+# Prerequisites of lib/strtok_r.c.
+AC_DEFUN([gl_PREREQ_STRTOK_R], [
+ :
+])
diff --git a/m4/strtol.m4 b/m4/strtol.m4
new file mode 100644
index 0000000..eb19ffe
--- /dev/null
+++ b/m4/strtol.m4
@@ -0,0 +1,10 @@
+# strtol.m4 serial 6
+dnl Copyright (C) 2002-2003, 2006, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_STRTOL],
+[
+ AC_CHECK_FUNCS([strtol])
+])
diff --git a/m4/strtoll.m4 b/m4/strtoll.m4
new file mode 100644
index 0000000..edcde3b
--- /dev/null
+++ b/m4/strtoll.m4
@@ -0,0 +1,19 @@
+# strtoll.m4 serial 8
+dnl Copyright (C) 2002, 2004, 2006, 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_STRTOLL],
+[
+ AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+ AC_CHECK_FUNCS([strtoll])
+ if test $ac_cv_func_strtoll = no; then
+ HAVE_STRTOLL=0
+ fi
+])
+
+# Prerequisites of lib/strtoll.c.
+AC_DEFUN([gl_PREREQ_STRTOLL], [
+ :
+])
diff --git a/m4/symlink.m4 b/m4/symlink.m4
new file mode 100644
index 0000000..9cfdf93
--- /dev/null
+++ b/m4/symlink.m4
@@ -0,0 +1,55 @@
+# serial 9
+# See if we need to provide symlink replacement.
+
+dnl Copyright (C) 2009-2020 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.
+
+# Written by Eric Blake.
+
+AC_DEFUN([gl_FUNC_SYMLINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS_ONCE([symlink])
+ dnl The best we can do on mingw is provide a dummy that always fails, so
+ dnl that compilation can proceed with fewer ifdefs. On FreeBSD 7.2, AIX 7.1,
+ dnl and Solaris 9, we want to fix a bug with trailing slash handling.
+ if test $ac_cv_func_symlink = no; then
+ HAVE_SYMLINK=0
+ else
+ AC_CACHE_CHECK([whether symlink handles trailing slash correctly],
+ [gl_cv_func_symlink_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ ]],
+ [[int result = 0;
+ if (!symlink ("a", "conftest.link/"))
+ result |= 1;
+ if (symlink ("conftest.f", "conftest.lnk2"))
+ result |= 2;
+ else if (!symlink ("a", "conftest.lnk2/"))
+ result |= 4;
+ return result;
+ ]])],
+ [gl_cv_func_symlink_works=yes], [gl_cv_func_symlink_works=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_symlink_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_symlink_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_symlink_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.f conftest.link conftest.lnk2])
+ case "$gl_cv_func_symlink_works" in
+ *yes) ;;
+ *)
+ REPLACE_SYMLINK=1
+ ;;
+ esac
+ fi
+])
diff --git a/m4/sys_file_h.m4 b/m4/sys_file_h.m4
new file mode 100644
index 0000000..045e01b
--- /dev/null
+++ b/m4/sys_file_h.m4
@@ -0,0 +1,41 @@
+# Configure a replacement for <sys/file.h>.
+# serial 6
+
+# Copyright (C) 2008-2020 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.
+
+# Written by Richard W.M. Jones.
+
+AC_DEFUN([gl_HEADER_SYS_FILE_H],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+
+ dnl <sys/file.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/file.h])
+
+ if test $ac_cv_header_sys_file_h = yes; then
+ HAVE_SYS_FILE_H=1
+ else
+ HAVE_SYS_FILE_H=0
+ fi
+ AC_SUBST([HAVE_SYS_FILE_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/file.h>
+ ]], [flock])
+])
+
+AC_DEFUN([gl_HEADER_SYS_FILE_MODULE_INDICATOR],
+[
+ AC_REQUIRE([gl_HEADER_SYS_FILE_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_HEADER_SYS_FILE_H_DEFAULTS],
+[
+ GNULIB_FLOCK=0; AC_SUBST([GNULIB_FLOCK])
+ HAVE_FLOCK=1; AC_SUBST([HAVE_FLOCK])
+])
diff --git a/m4/sys_ioctl_h.m4 b/m4/sys_ioctl_h.m4
new file mode 100644
index 0000000..98d24e8
--- /dev/null
+++ b/m4/sys_ioctl_h.m4
@@ -0,0 +1,64 @@
+# sys_ioctl_h.m4 serial 12
+dnl Copyright (C) 2008-2020 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 Written by Bruno Haible.
+
+AC_DEFUN([gl_SYS_IOCTL_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+
+ AC_CHECK_HEADERS_ONCE([sys/ioctl.h])
+ if test $ac_cv_header_sys_ioctl_h = yes; then
+ HAVE_SYS_IOCTL_H=1
+ dnl Test whether <sys/ioctl.h> declares ioctl(), or whether some other
+ dnl header file, such as <unistd.h> or <stropts.h>, is needed for that.
+ AC_CACHE_CHECK([whether <sys/ioctl.h> declares ioctl],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h],
+ [dnl We cannot use AC_CHECK_DECL because it produces its own messages.
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/ioctl.h>]],
+ [[(void) ioctl;]])],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h=yes],
+ [gl_cv_decl_ioctl_in_sys_ioctl_h=no])
+ ])
+ else
+ HAVE_SYS_IOCTL_H=0
+ fi
+ AC_SUBST([HAVE_SYS_IOCTL_H])
+ dnl <sys/ioctl.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/ioctl.h])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/ioctl.h>
+/* Some platforms declare ioctl in the wrong header. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <unistd.h>
+#endif
+ ]], [ioctl])
+])
+
+AC_DEFUN([gl_SYS_IOCTL_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_IOCTL_H_DEFAULTS],
+[
+ GNULIB_IOCTL=0; AC_SUBST([GNULIB_IOCTL])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=0; AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H])
+ SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+ AC_SUBST([SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+ REPLACE_IOCTL=0; AC_SUBST([REPLACE_IOCTL])
+])
diff --git a/m4/sys_random_h.m4 b/m4/sys_random_h.m4
new file mode 100644
index 0000000..8c5d537
--- /dev/null
+++ b/m4/sys_random_h.m4
@@ -0,0 +1,53 @@
+# sys_random_h.m4 serial 5
+dnl Copyright (C) 2020 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.
+
+AC_DEFUN([gl_HEADER_SYS_RANDOM],
+[
+ AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS])
+ dnl <sys/random.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/random.h])
+ if test $ac_cv_header_sys_random_h = yes; then
+ HAVE_SYS_RANDOM_H=1
+ else
+ HAVE_SYS_RANDOM_H=0
+ fi
+ AC_SUBST([HAVE_SYS_RANDOM_H])
+
+ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+ if test $ac_cv_header_sys_random_h = yes; then
+ UNISTD_H_HAVE_SYS_RANDOM_H=1
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if HAVE_SYS_RANDOM_H
+/* Additional includes are needed before <sys/random.h> on uClibc
+ and Mac OS X. */
+# include <sys/types.h>
+# include <stdlib.h>
+# include <sys/random.h>
+#endif
+ ]],
+ [getrandom])
+])
+
+AC_DEFUN([gl_SYS_RANDOM_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_RANDOM_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_RANDOM_H_DEFAULTS],
+[
+ GNULIB_GETRANDOM=0; AC_SUBST([GNULIB_GETRANDOM])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_GETRANDOM=1; AC_SUBST([HAVE_GETRANDOM])
+ REPLACE_GETRANDOM=0; AC_SUBST([REPLACE_GETRANDOM])
+])
diff --git a/m4/sys_select_h.m4 b/m4/sys_select_h.m4
new file mode 100644
index 0000000..fa19bb6
--- /dev/null
+++ b/m4/sys_select_h.m4
@@ -0,0 +1,95 @@
+# sys_select_h.m4 serial 20
+dnl Copyright (C) 2006-2020 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.
+
+AC_DEFUN([gl_HEADER_SYS_SELECT],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS])
+ AC_CACHE_CHECK([whether <sys/select.h> is self-contained],
+ [gl_cv_header_sys_select_h_selfcontained],
+ [
+ dnl Test against two bugs:
+ dnl 1. On many platforms, <sys/select.h> assumes prior inclusion of
+ dnl <sys/types.h>.
+ dnl 2. On OSF/1 4.0, <sys/select.h> provides only a forward declaration
+ dnl of 'struct timeval', and no definition of this type.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/select.h>]],
+ [[struct timeval b;]])],
+ [gl_cv_header_sys_select_h_selfcontained=yes],
+ [gl_cv_header_sys_select_h_selfcontained=no])
+ dnl Test against another bug:
+ dnl 3. On Solaris 10, <sys/select.h> provides an FD_ZERO implementation
+ dnl that relies on memset(), but without including <string.h>.
+ if test $gl_cv_header_sys_select_h_selfcontained = yes; then
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/select.h>]],
+ [[int memset; int bzero;]])
+ ],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/select.h>]], [[
+ #undef memset
+ #define memset nonexistent_memset
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ void *memset (void *, int, unsigned long);
+ #undef bzero
+ #define bzero nonexistent_bzero
+ extern
+ #ifdef __cplusplus
+ "C"
+ #endif
+ void bzero (void *, unsigned long);
+ fd_set fds;
+ FD_ZERO (&fds);
+ ]])
+ ],
+ [],
+ [gl_cv_header_sys_select_h_selfcontained=no])
+ ])
+ fi
+ ])
+ dnl <sys/select.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/select.h])
+ if test $ac_cv_header_sys_select_h = yes; then
+ HAVE_SYS_SELECT_H=1
+ else
+ HAVE_SYS_SELECT_H=0
+ fi
+ AC_SUBST([HAVE_SYS_SELECT_H])
+ gl_PREREQ_SYS_H_WINSOCK2
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems require prerequisite headers. */
+#include <sys/types.h>
+#if !(defined __GLIBC__ && !defined __UCLIBC__) && HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <sys/select.h>
+ ]], [pselect select])
+])
+
+AC_DEFUN([gl_SYS_SELECT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_SELECT_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_SELECT_H_DEFAULTS],
+[
+ GNULIB_PSELECT=0; AC_SUBST([GNULIB_PSELECT])
+ GNULIB_SELECT=0; AC_SUBST([GNULIB_SELECT])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_PSELECT=1; AC_SUBST([HAVE_PSELECT])
+ REPLACE_PSELECT=0; AC_SUBST([REPLACE_PSELECT])
+ REPLACE_SELECT=0; AC_SUBST([REPLACE_SELECT])
+])
diff --git a/m4/sys_socket_h.m4 b/m4/sys_socket_h.m4
new file mode 100644
index 0000000..bf902f0
--- /dev/null
+++ b/m4/sys_socket_h.m4
@@ -0,0 +1,190 @@
+# sys_socket_h.m4 serial 25
+dnl Copyright (C) 2005-2020 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 Simon Josefsson.
+
+AC_DEFUN([gl_HEADER_SYS_SOCKET],
+[
+ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+
+ dnl On OSF/1, the functions recv(), send(), recvfrom(), sendto() have
+ dnl old-style declarations (with return type 'int' instead of 'ssize_t')
+ dnl unless _POSIX_PII_SOCKET is defined.
+ case "$host_os" in
+ osf*)
+ AC_DEFINE([_POSIX_PII_SOCKET], [1],
+ [Define to 1 in order to get the POSIX compatible declarations
+ of socket functions.])
+ ;;
+ esac
+
+ AC_CACHE_CHECK([whether <sys/socket.h> is self-contained],
+ [gl_cv_header_sys_socket_h_selfcontained],
+ [
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[]])],
+ [gl_cv_header_sys_socket_h_selfcontained=yes],
+ [gl_cv_header_sys_socket_h_selfcontained=no])
+ ])
+ if test $gl_cv_header_sys_socket_h_selfcontained = yes; then
+ dnl If the shutdown function exists, <sys/socket.h> should define
+ dnl SHUT_RD, SHUT_WR, SHUT_RDWR.
+ AC_CHECK_FUNCS([shutdown])
+ if test $ac_cv_func_shutdown = yes; then
+ AC_CACHE_CHECK([whether <sys/socket.h> defines the SHUT_* macros],
+ [gl_cv_header_sys_socket_h_shut],
+ [
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/socket.h>]],
+ [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])],
+ [gl_cv_header_sys_socket_h_shut=yes],
+ [gl_cv_header_sys_socket_h_shut=no])
+ ])
+ if test $gl_cv_header_sys_socket_h_shut = no; then
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ fi
+ fi
+ # We need to check for ws2tcpip.h now.
+ gl_PREREQ_SYS_H_SOCKET
+ AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[
+ /* sys/types.h is not needed according to POSIX, but the
+ sys/socket.h in i386-unknown-freebsd4.10 and
+ powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+ if test $ac_cv_type_struct_sockaddr_storage = no; then
+ HAVE_STRUCT_SOCKADDR_STORAGE=0
+ fi
+ if test $ac_cv_type_sa_family_t = no; then
+ HAVE_SA_FAMILY_T=0
+ fi
+ if test $ac_cv_type_struct_sockaddr_storage != no; then
+ AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family],
+ [],
+ [HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0],
+ [#include <sys/types.h>
+ #ifdef HAVE_SYS_SOCKET_H
+ #include <sys/socket.h>
+ #endif
+ #ifdef HAVE_WS2TCPIP_H
+ #include <ws2tcpip.h>
+ #endif
+ ])
+ fi
+ if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \
+ || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then
+ SYS_SOCKET_H='sys/socket.h'
+ fi
+ gl_PREREQ_SYS_H_WINSOCK2
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+/* Some systems require prerequisite headers. */
+#include <sys/types.h>
+#include <sys/socket.h>
+ ]], [socket connect accept bind getpeername getsockname getsockopt
+ listen recv send recvfrom sendto setsockopt shutdown accept4])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+AC_DEFUN([gl_PREREQ_SYS_H_SOCKET],
+[
+ dnl Check prerequisites of the <sys/socket.h> replacement.
+ AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])
+ gl_CHECK_NEXT_HEADERS([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_SYS_SOCKET_H=1
+ else
+ HAVE_SYS_SOCKET_H=0
+ fi
+ AC_SUBST([HAVE_SYS_SOCKET_H])
+ gl_PREREQ_SYS_H_WS2TCPIP
+])
+
+# Common prerequisites of the <sys/socket.h> replacement and of the
+# <sys/select.h> replacement.
+# Sets and substitutes HAVE_WINSOCK2_H.
+AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2],
+[
+ m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+ m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])])
+ AC_CHECK_HEADERS_ONCE([sys/socket.h])
+ if test $ac_cv_header_sys_socket_h != yes; then
+ dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+ dnl the check for those headers unconditional; yet cygwin reports
+ dnl that the headers are present but cannot be compiled (since on
+ dnl cygwin, all socket information should come from sys/socket.h).
+ AC_CHECK_HEADERS([winsock2.h])
+ fi
+ if test "$ac_cv_header_winsock2_h" = yes; then
+ HAVE_WINSOCK2_H=1
+ UNISTD_H_HAVE_WINSOCK2_H=1
+ SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+ else
+ HAVE_WINSOCK2_H=0
+ fi
+ AC_SUBST([HAVE_WINSOCK2_H])
+])
+
+# Common prerequisites of the <sys/socket.h> replacement and of the
+# <arpa/inet.h> replacement.
+# Sets and substitutes HAVE_WS2TCPIP_H.
+AC_DEFUN([gl_PREREQ_SYS_H_WS2TCPIP],
+[
+ AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])
+ if test $ac_cv_header_sys_socket_h = yes; then
+ HAVE_WS2TCPIP_H=0
+ else
+ if test $ac_cv_header_ws2tcpip_h = yes; then
+ HAVE_WS2TCPIP_H=1
+ else
+ HAVE_WS2TCPIP_H=0
+ fi
+ fi
+ AC_SUBST([HAVE_WS2TCPIP_H])
+])
+
+AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS],
+[
+ GNULIB_SOCKET=0; AC_SUBST([GNULIB_SOCKET])
+ GNULIB_CONNECT=0; AC_SUBST([GNULIB_CONNECT])
+ GNULIB_ACCEPT=0; AC_SUBST([GNULIB_ACCEPT])
+ GNULIB_BIND=0; AC_SUBST([GNULIB_BIND])
+ GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME])
+ GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME])
+ GNULIB_GETSOCKOPT=0; AC_SUBST([GNULIB_GETSOCKOPT])
+ GNULIB_LISTEN=0; AC_SUBST([GNULIB_LISTEN])
+ GNULIB_RECV=0; AC_SUBST([GNULIB_RECV])
+ GNULIB_SEND=0; AC_SUBST([GNULIB_SEND])
+ GNULIB_RECVFROM=0; AC_SUBST([GNULIB_RECVFROM])
+ GNULIB_SENDTO=0; AC_SUBST([GNULIB_SENDTO])
+ GNULIB_SETSOCKOPT=0; AC_SUBST([GNULIB_SETSOCKOPT])
+ GNULIB_SHUTDOWN=0; AC_SUBST([GNULIB_SHUTDOWN])
+ GNULIB_ACCEPT4=0; AC_SUBST([GNULIB_ACCEPT4])
+ HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE])
+ HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1;
+ AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY])
+ HAVE_SA_FAMILY_T=1; AC_SUBST([HAVE_SA_FAMILY_T])
+ HAVE_ACCEPT4=1; AC_SUBST([HAVE_ACCEPT4])
+])
diff --git a/m4/sys_stat_h.m4 b/m4/sys_stat_h.m4
new file mode 100644
index 0000000..14b72db
--- /dev/null
+++ b/m4/sys_stat_h.m4
@@ -0,0 +1,110 @@
+# sys_stat_h.m4 serial 36 -*- Autoconf -*-
+dnl Copyright (C) 2006-2020 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 Eric Blake.
+dnl Provide a GNU-like <sys/stat.h>.
+
+AC_DEFUN([gl_HEADER_SYS_STAT_H],
+[
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+
+ dnl Check for broken stat macros.
+ AC_REQUIRE([AC_HEADER_STAT])
+
+ gl_CHECK_NEXT_HEADERS([sys/stat.h])
+
+ dnl Ensure the type mode_t gets defined.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+
+ dnl Whether to enable precise timestamps in 'struct stat'.
+ m4_ifdef([gl_WINDOWS_STAT_TIMESPEC], [
+ AC_REQUIRE([gl_WINDOWS_STAT_TIMESPEC])
+ ], [
+ WINDOWS_STAT_TIMESPEC=0
+ ])
+ AC_SUBST([WINDOWS_STAT_TIMESPEC])
+
+ dnl Whether to ensure that struct stat.st_size is 64-bit wide.
+ m4_ifdef([gl_LARGEFILE], [
+ AC_REQUIRE([gl_LARGEFILE])
+ ], [
+ WINDOWS_64_BIT_ST_SIZE=0
+ ])
+ AC_SUBST([WINDOWS_64_BIT_ST_SIZE])
+
+ dnl Define types that are supposed to be defined in <sys/types.h> or
+ dnl <sys/stat.h>.
+ AC_CHECK_TYPE([nlink_t], [],
+ [AC_DEFINE([nlink_t], [int],
+ [Define to the type of st_nlink in struct stat, or a supertype.])],
+ [#include <sys/types.h>
+ #include <sys/stat.h>])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/stat.h>
+ ]], [fchmodat fstat fstatat futimens getumask lchmod lstat
+ mkdirat mkfifo mkfifoat mknod mknodat stat utimensat])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+AC_DEFUN([gl_SYS_STAT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_STAT_H_DEFAULTS],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS]) dnl for REPLACE_FCHDIR
+ GNULIB_FCHMODAT=0; AC_SUBST([GNULIB_FCHMODAT])
+ GNULIB_FSTAT=0; AC_SUBST([GNULIB_FSTAT])
+ GNULIB_FSTATAT=0; AC_SUBST([GNULIB_FSTATAT])
+ GNULIB_FUTIMENS=0; AC_SUBST([GNULIB_FUTIMENS])
+ GNULIB_GETUMASK=0; AC_SUBST([GNULIB_GETUMASK])
+ GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD])
+ GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT])
+ GNULIB_MKDIR=0; AC_SUBST([GNULIB_MKDIR])
+ GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT])
+ GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO])
+ GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT])
+ GNULIB_MKNOD=0; AC_SUBST([GNULIB_MKNOD])
+ GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT])
+ GNULIB_STAT=0; AC_SUBST([GNULIB_STAT])
+ GNULIB_UTIMENSAT=0; AC_SUBST([GNULIB_UTIMENSAT])
+ GNULIB_OVERRIDES_STRUCT_STAT=0; AC_SUBST([GNULIB_OVERRIDES_STRUCT_STAT])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_CHMOD=1; AC_SUBST([GNULIB_MDA_CHMOD])
+ GNULIB_MDA_MKDIR=1; AC_SUBST([GNULIB_MDA_MKDIR])
+ GNULIB_MDA_UMASK=1; AC_SUBST([GNULIB_MDA_UMASK])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_FCHMODAT=1; AC_SUBST([HAVE_FCHMODAT])
+ HAVE_FSTATAT=1; AC_SUBST([HAVE_FSTATAT])
+ HAVE_FUTIMENS=1; AC_SUBST([HAVE_FUTIMENS])
+ HAVE_GETUMASK=1; AC_SUBST([HAVE_GETUMASK])
+ HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD])
+ HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT])
+ HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT])
+ HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO])
+ HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT])
+ HAVE_MKNOD=1; AC_SUBST([HAVE_MKNOD])
+ HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT])
+ HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT])
+ REPLACE_FCHMODAT=0; AC_SUBST([REPLACE_FCHMODAT])
+ REPLACE_FSTAT=0; AC_SUBST([REPLACE_FSTAT])
+ REPLACE_FSTATAT=0; AC_SUBST([REPLACE_FSTATAT])
+ REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS])
+ REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT])
+ REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR])
+ REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO])
+ REPLACE_MKNOD=0; AC_SUBST([REPLACE_MKNOD])
+ REPLACE_STAT=0; AC_SUBST([REPLACE_STAT])
+ REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT])
+])
diff --git a/m4/sys_time_h.m4 b/m4/sys_time_h.m4
new file mode 100644
index 0000000..8fc8599
--- /dev/null
+++ b/m4/sys_time_h.m4
@@ -0,0 +1,110 @@
+# Configure a replacement for <sys/time.h>.
+# serial 9
+
+# Copyright (C) 2007, 2009-2020 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.
+
+# Written by Paul Eggert and Martin Lambers.
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H],
+[
+ dnl Use AC_REQUIRE here, so that the REPLACE_GETTIMEOFDAY=0 statement
+ dnl below is expanded once only, before all REPLACE_GETTIMEOFDAY=1
+ dnl statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H_BODY],
+[
+ AC_REQUIRE([AC_C_RESTRICT])
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ gl_CHECK_NEXT_HEADERS([sys/time.h])
+
+ if test $ac_cv_header_sys_time_h != yes; then
+ HAVE_SYS_TIME_H=0
+ fi
+
+ dnl On native Windows with MSVC, 'struct timeval' is defined in <winsock2.h>
+ dnl only. So include that header in the list.
+ gl_PREREQ_SYS_H_WINSOCK2
+ AC_CACHE_CHECK([for struct timeval], [gl_cv_sys_struct_timeval],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #if HAVE_WINSOCK2_H
+ # include <winsock2.h>
+ #endif
+ ]],
+ [[static struct timeval x; x.tv_sec = x.tv_usec;]])],
+ [gl_cv_sys_struct_timeval=yes],
+ [gl_cv_sys_struct_timeval=no])
+ ])
+ if test $gl_cv_sys_struct_timeval != yes; then
+ HAVE_STRUCT_TIMEVAL=0
+ else
+ dnl On native Windows with a 64-bit 'time_t', 'struct timeval' is defined
+ dnl (in <sys/time.h> and <winsock2.h> for mingw64, in <winsock2.h> only
+ dnl for MSVC) with a tv_sec field of type 'long' (32-bit!), which is
+ dnl smaller than the 'time_t' type mandated by POSIX.
+ dnl On OpenBSD 5.1 amd64, tv_sec is 64 bits and time_t 32 bits, but
+ dnl that is good enough.
+ AC_CACHE_CHECK([for wide-enough struct timeval.tv_sec member],
+ [gl_cv_sys_struct_timeval_tv_sec],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_SYS_TIME_H
+ #include <sys/time.h>
+ #endif
+ #include <time.h>
+ #if HAVE_WINSOCK2_H
+ # include <winsock2.h>
+ #endif
+ ]],
+ [[static struct timeval x;
+ typedef int verify_tv_sec_type[
+ sizeof (time_t) <= sizeof x.tv_sec ? 1 : -1
+ ];
+ ]])],
+ [gl_cv_sys_struct_timeval_tv_sec=yes],
+ [gl_cv_sys_struct_timeval_tv_sec=no])
+ ])
+ if test $gl_cv_sys_struct_timeval_tv_sec != yes; then
+ REPLACE_STRUCT_TIMEVAL=1
+ fi
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+#include <time.h>
+ ]], [gettimeofday])
+])
+
+AC_DEFUN([gl_SYS_TIME_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_SYS_TIME_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_HEADER_SYS_TIME_H_DEFAULTS],
+[
+ GNULIB_GETTIMEOFDAY=0; AC_SUBST([GNULIB_GETTIMEOFDAY])
+ dnl Assume POSIX behavior unless another module says otherwise.
+ HAVE_GETTIMEOFDAY=1; AC_SUBST([HAVE_GETTIMEOFDAY])
+ HAVE_STRUCT_TIMEVAL=1; AC_SUBST([HAVE_STRUCT_TIMEVAL])
+ HAVE_SYS_TIME_H=1; AC_SUBST([HAVE_SYS_TIME_H])
+ REPLACE_GETTIMEOFDAY=0; AC_SUBST([REPLACE_GETTIMEOFDAY])
+ REPLACE_STRUCT_TIMEVAL=0; AC_SUBST([REPLACE_STRUCT_TIMEVAL])
+])
diff --git a/m4/sys_types_h.m4 b/m4/sys_types_h.m4
new file mode 100644
index 0000000..c3a691b
--- /dev/null
+++ b/m4/sys_types_h.m4
@@ -0,0 +1,58 @@
+# sys_types_h.m4 serial 11
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN_ONCE([gl_SYS_TYPES_H],
+[
+ dnl Use sane struct stat types in OpenVMS 8.2 and later.
+ AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.])
+
+ AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+ gl_NEXT_HEADERS([sys/types.h])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Ensure the type mode_t gets defined.
+ AC_REQUIRE([AC_TYPE_MODE_T])
+
+ dnl Whether to override the 'off_t' type.
+ AC_REQUIRE([gl_TYPE_OFF_T])
+
+ dnl Whether to override the 'dev_t' and 'ino_t' types.
+ m4_ifdef([gl_WINDOWS_STAT_INODES], [
+ AC_REQUIRE([gl_WINDOWS_STAT_INODES])
+ ], [
+ WINDOWS_STAT_INODES=0
+ ])
+ AC_SUBST([WINDOWS_STAT_INODES])
+])
+
+AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS],
+[
+])
+
+# This works around a buggy version in autoconf <= 2.69.
+# See <https://lists.gnu.org/r/autoconf/2016-08/msg00014.html>
+# The 2.70 version isn't quoted properly, so override it too.
+
+m4_version_prereq([2.70.1], [], [
+
+m4_undefine([AC_HEADER_MAJOR])
+AC_DEFUN([AC_HEADER_MAJOR],
+[AC_CHECK_HEADERS_ONCE([sys/types.h])
+AC_CHECK_HEADER([sys/mkdev.h],
+ [AC_DEFINE([MAJOR_IN_MKDEV], [1],
+ [Define to 1 if `major', `minor', and `makedev' are
+ declared in <mkdev.h>.])])
+if test $ac_cv_header_sys_mkdev_h = no; then
+ AC_CHECK_HEADER([sys/sysmacros.h],
+ [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
+ [Define to 1 if `major', `minor', and `makedev'
+ are declared in <sysmacros.h>.])])
+fi
+])# AC_HEADER_MAJOR
+
+])
diff --git a/m4/sys_uio_h.m4 b/m4/sys_uio_h.m4
new file mode 100644
index 0000000..a255dea
--- /dev/null
+++ b/m4/sys_uio_h.m4
@@ -0,0 +1,31 @@
+# sys_uio_h.m4 serial 1
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_HEADER_SYS_UIO],
+[
+ AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS])
+ dnl <sys/uio.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/uio.h])
+ if test $ac_cv_header_sys_uio_h = yes; then
+ HAVE_SYS_UIO_H=1
+ else
+ HAVE_SYS_UIO_H=0
+ fi
+ AC_SUBST([HAVE_SYS_UIO_H])
+])
+
+AC_DEFUN([gl_SYS_UIO_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_UIO_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_UIO_H_DEFAULTS],
+[
+])
diff --git a/m4/sys_wait_h.m4 b/m4/sys_wait_h.m4
new file mode 100644
index 0000000..8596d13
--- /dev/null
+++ b/m4/sys_wait_h.m4
@@ -0,0 +1,36 @@
+# sys_wait_h.m4 serial 6
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_SYS_WAIT_H],
+[
+ AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+
+ dnl <sys/wait.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([sys/wait.h])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <sys/wait.h>]],
+ [waitpid])
+])
+
+AC_DEFUN([gl_SYS_WAIT_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_SYS_WAIT_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_WAIT_H_DEFAULTS],
+[
+ GNULIB_WAITPID=0; AC_SUBST([GNULIB_WAITPID])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+])
diff --git a/m4/tempname.m4 b/m4/tempname.m4
new file mode 100644
index 0000000..da439f0
--- /dev/null
+++ b/m4/tempname.m4
@@ -0,0 +1,19 @@
+#serial 5
+
+# Copyright (C) 2006-2007, 2009-2020 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.
+
+# glibc provides __gen_tempname as a wrapper for mk[ds]temp. Expose
+# it as a public API, and provide it on systems that are lacking.
+AC_DEFUN([gl_FUNC_GEN_TEMPNAME],
+[
+ gl_PREREQ_TEMPNAME
+])
+
+# Prerequisites of lib/tempname.c.
+AC_DEFUN([gl_PREREQ_TEMPNAME],
+[
+ :
+])
diff --git a/m4/threadlib.m4 b/m4/threadlib.m4
new file mode 100644
index 0000000..e03c34f
--- /dev/null
+++ b/m4/threadlib.m4
@@ -0,0 +1,622 @@
+# threadlib.m4 serial 29
+dnl Copyright (C) 2005-2020 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.60])
+
+dnl The general structure of the multithreading modules in gnulib is that we
+dnl have three set of modules:
+dnl
+dnl * POSIX API:
+dnl pthread, which combines
+dnl pthread-h
+dnl pthread-thread
+dnl pthread-once
+dnl pthread-mutex
+dnl pthread-rwlock
+dnl pthread-cond
+dnl pthread-tss
+dnl pthread-spin
+dnl sched_yield
+dnl
+dnl * ISO C API:
+dnl threads, which combines
+dnl threads-h
+dnl thrd
+dnl mtx
+dnl cnd
+dnl tss
+dnl
+dnl * Gnulib API, with an implementation that can be chosen at configure
+dnl time through the option --enable-threads=...
+dnl thread
+dnl lock
+dnl cond
+dnl tls
+dnl yield
+dnl
+dnl They are independent, except for the fact that
+dnl - the implementation of the ISO C API may use the POSIX (or some other
+dnl platform dependent) API,
+dnl - the implementation of the Gnulib API may use the POSIX or ISO C or
+dnl some other platform dependent API, depending on the --enable-threads
+dnl option.
+dnl
+dnl This file contains macros for all of these APIs!
+
+dnl ============================================================================
+dnl Macros for all thread APIs
+
+AC_DEFUN([gl_ANYTHREADLIB_EARLY],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ if test -z "$gl_anythreadlib_early_done"; then
+ case "$host_os" in
+ osf*)
+ # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+ # groks <pthread.h>. cc also understands the flag -pthread, but
+ # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+ # 2. putting a flag into CPPFLAGS that has an effect on the linker
+ # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
+ # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ ;;
+ esac
+ # Some systems optimize for single-threaded programs by default, and
+ # need special flags to disable these optimizations. For example, the
+ # definition of 'errno' in <errno.h>.
+ case "$host_os" in
+ aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+ solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+ esac
+ gl_anythreadlib_early_done=done
+ fi
+])
+
+dnl Checks whether the compiler and linker support weak declarations of symbols.
+
+AC_DEFUN([gl_WEAK_SYMBOLS],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether imported symbols can be declared weak],
+ [gl_cv_have_weak],
+ [gl_cv_have_weak=no
+ dnl First, test whether the compiler accepts it syntactically.
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[extern void xyzzy ();
+#pragma weak xyzzy]],
+ [[xyzzy();]])],
+ [gl_cv_have_weak=maybe])
+ if test $gl_cv_have_weak = maybe; then
+ dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+ dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+ return (fputs == NULL);
+}]])],
+ [gl_cv_have_weak=yes],
+ [gl_cv_have_weak=no],
+ [dnl When cross-compiling, assume that only ELF platforms support
+ dnl weak symbols.
+ AC_EGREP_CPP([Extensible Linking Format],
+ [#ifdef __ELF__
+ Extensible Linking Format
+ #endif
+ ],
+ [gl_cv_have_weak="guessing yes"],
+ [gl_cv_have_weak="guessing no"])
+ ])
+ fi
+ dnl But when linking statically, weak symbols don't work.
+ case " $LDFLAGS " in
+ *" -static "*) gl_cv_have_weak=no ;;
+ esac
+ dnl Test for a bug in FreeBSD 11: A link error occurs when using a weak
+ dnl symbol and linking against a shared library that has a dependency on
+ dnl the shared library that defines the symbol.
+ case "$gl_cv_have_weak" in
+ *yes)
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ : > conftest1.c
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -fPIC -shared -o libempty.so conftest1.c -lpthread >&AS_MESSAGE_LOG_FD 2>&1
+ cat <<EOF > conftest2.c
+#include <pthread.h>
+#pragma weak pthread_mutexattr_gettype
+int main ()
+{
+ return (pthread_mutexattr_gettype != NULL);
+}
+EOF
+ $CC $CPPFLAGS $CFLAGS $LDFLAGS -o conftest conftest2.c libempty.so >&AS_MESSAGE_LOG_FD 2>&1 \
+ || gl_cv_have_weak=no
+ rm -f conftest1.c libempty.so conftest2.c conftest
+ ;;
+ esac
+ ;;
+ esac
+ ])
+ case "$gl_cv_have_weak" in
+ *yes)
+ AC_DEFINE([HAVE_WEAK_SYMBOLS], [1],
+ [Define to 1 if the compiler and linker support weak declarations of symbols.])
+ ;;
+ esac
+])
+
+dnl ============================================================================
+dnl Macros for the POSIX API
+
+dnl gl_PTHREADLIB
+dnl -------------
+dnl Tests for the libraries needs for using the POSIX threads API.
+dnl Sets the variable LIBPTHREAD to the linker options for use in a Makefile.
+dnl Sets the variable LIBPMULTITHREAD, for programs that really need
+dnl multithread functionality. The difference between LIBPTHREAD and
+dnl LIBPMULTITHREAD is that on platforms supporting weak symbols, typically
+dnl LIBPTHREAD is empty whereas LIBPMULTITHREAD is not.
+dnl Sets the variable LIB_SCHED_YIELD to the linker options needed to use the
+dnl sched_yield() function.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+dnl Defines the C macro HAVE_PTHREAD_API if (at least parts of) the POSIX
+dnl threads API is available.
+
+dnl The guts of gl_PTHREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_PTHREADLIB_BODY],
+[
+ AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+ if test -z "$gl_pthreadlib_body_done"; then
+ gl_pthread_api=no
+ LIBPTHREAD=
+ LIBPMULTITHREAD=
+ # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+ # it groks <pthread.h>. It's added above, in gl_ANYTHREADLIB_EARLY.
+ AC_CHECK_HEADER([pthread.h],
+ [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
+ if test "$gl_have_pthread_h" = yes; then
+ # Other possible tests:
+ # -lpthreads (FSU threads, PCthreads)
+ # -lgthreads
+ # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+ # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+ # the second one only in libpthread, and lock.c needs it.
+ #
+ # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+ # needs -pthread for some reason. See:
+ # https://lists.gnu.org/r/bug-gnulib/2014-09/msg00023.html
+ save_LIBS=$LIBS
+ for gl_pthread in '' '-pthread'; do
+ LIBS="$LIBS $gl_pthread"
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>
+ pthread_mutex_t m;
+ pthread_mutexattr_t ma;
+ ]],
+ [[pthread_mutex_lock (&m);
+ pthread_mutexattr_init (&ma);]])],
+ [gl_pthread_api=yes
+ LIBPTHREAD=$gl_pthread
+ LIBPMULTITHREAD=$gl_pthread])
+ LIBS=$save_LIBS
+ test $gl_pthread_api = yes && break
+ done
+
+ # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+ # since it is defined as a macro on OSF/1.)
+ if test $gl_pthread_api = yes && test -z "$LIBPTHREAD"; then
+ # The program links fine without libpthread. But it may actually
+ # need to link with libpthread in order to create multiple threads.
+ AC_CHECK_LIB([pthread], [pthread_kill],
+ [LIBPMULTITHREAD=-lpthread
+ # On Solaris and HP-UX, most pthread functions exist also in libc.
+ # Therefore pthread_in_use() needs to actually try to create a
+ # thread: pthread_create from libc will fail, whereas
+ # pthread_create will actually create a thread.
+ # On Solaris 10 or newer, this test is no longer needed, because
+ # libc contains the fully functional pthread functions.
+ case "$host_os" in
+ solaris | solaris2.[1-9] | solaris2.[1-9].* | hpux*)
+ AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+ [Define if the pthread_in_use() detection is hard.])
+ esac
+ ])
+ elif test $gl_pthread_api != yes; then
+ # Some library is needed. Try libpthread and libc_r.
+ AC_CHECK_LIB([pthread], [pthread_kill],
+ [gl_pthread_api=yes
+ LIBPTHREAD=-lpthread
+ LIBPMULTITHREAD=-lpthread])
+ if test $gl_pthread_api != yes; then
+ # For FreeBSD 4.
+ AC_CHECK_LIB([c_r], [pthread_kill],
+ [gl_pthread_api=yes
+ LIBPTHREAD=-lc_r
+ LIBPMULTITHREAD=-lc_r])
+ fi
+ fi
+ fi
+ AC_MSG_CHECKING([whether POSIX threads API is available])
+ AC_MSG_RESULT([$gl_pthread_api])
+ AC_SUBST([LIBPTHREAD])
+ AC_SUBST([LIBPMULTITHREAD])
+ if test $gl_pthread_api = yes; then
+ AC_DEFINE([HAVE_PTHREAD_API], [1],
+ [Define if you have the <pthread.h> header and the POSIX threads API.])
+ fi
+
+ dnl On some systems, sched_yield is in librt, rather than in libpthread.
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sched.h>]],
+ [[sched_yield ();]])],
+ [LIB_SCHED_YIELD=
+ ],
+ [dnl Solaris 7...10 has sched_yield in librt, not in libpthread or libc.
+ AC_CHECK_LIB([rt], [sched_yield], [LIB_SCHED_YIELD=-lrt],
+ [dnl Solaris 2.5.1, 2.6 has sched_yield in libposix4, not librt.
+ AC_CHECK_LIB([posix4], [sched_yield], [LIB_SCHED_YIELD=-lposix4])])
+ ])
+ AC_SUBST([LIB_SCHED_YIELD])
+
+ gl_pthreadlib_body_done=done
+ fi
+])
+
+AC_DEFUN([gl_PTHREADLIB],
+[
+ AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+ gl_PTHREADLIB_BODY
+])
+
+dnl ============================================================================
+dnl Macros for the ISO C API
+
+dnl gl_STDTHREADLIB
+dnl ---------------
+dnl Tests for the libraries needs for using the ISO C threads API.
+dnl Sets the variable LIBSTDTHREAD to the linker options for use in a Makefile.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+dnl Defines the C macro HAVE_THREADS_H if (at least parts of) the ISO C threads
+dnl API is available.
+
+dnl The guts of gl_STDTHREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_STDTHREADLIB_BODY],
+[
+ AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ if test -z "$gl_stdthreadlib_body_done"; then
+ AC_CHECK_HEADERS_ONCE([threads.h])
+
+ case "$host_os" in
+ mingw*)
+ LIBSTDTHREAD=
+ ;;
+ *)
+ gl_PTHREADLIB_BODY
+ if test $ac_cv_header_threads_h = yes; then
+ dnl glibc >= 2.29 has thrd_create in libpthread.
+ dnl FreeBSD >= 10 has thrd_create in libstdthreads; this library depends
+ dnl on libpthread (for the symbol 'pthread_mutexattr_gettype').
+ dnl AIX >= 7.1 and Solaris >= 11.4 have thrd_create in libc.
+ AC_CHECK_FUNCS([thrd_create])
+ if test $ac_cv_func_thrd_create = yes; then
+ LIBSTDTHREAD=
+ else
+ AC_CHECK_LIB([stdthreads], [thrd_create], [
+ LIBSTDTHREAD='-lstdthreads -lpthread'
+ ], [
+ dnl Guess that thrd_create is in libpthread.
+ LIBSTDTHREAD="$LIBPMULTITHREAD"
+ ])
+ fi
+ else
+ dnl Libraries needed by thrd.c, mtx.c, cnd.c, tss.c.
+ LIBSTDTHREAD="$LIBPMULTITHREAD $LIB_SCHED_YIELD"
+ fi
+ ;;
+ esac
+ AC_SUBST([LIBSTDTHREAD])
+
+ AC_MSG_CHECKING([whether ISO C threads API is available])
+ AC_MSG_RESULT([$ac_cv_header_threads_h])
+ gl_stdthreadlib_body_done=done
+ fi
+])
+
+AC_DEFUN([gl_STDTHREADLIB],
+[
+ AC_REQUIRE([gl_ANYTHREADLIB_EARLY])
+ gl_STDTHREADLIB_BODY
+])
+
+dnl ============================================================================
+dnl Macros for the Gnulib API
+
+dnl gl_THREADLIB
+dnl ------------
+dnl Tests for a multithreading library to be used.
+dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
+dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
+dnl default is 'no', otherwise it is system dependent. In both cases, the user
+dnl can change the choice through the options --enable-threads=choice or
+dnl --disable-threads.
+dnl Defines at most one of the macros USE_ISOC_THREADS, USE_POSIX_THREADS,
+dnl USE_ISOC_AND_POSIX_THREADS, USE_WINDOWS_THREADS.
+dnl The choice --enable-threads=isoc+posix is available only on platforms that
+dnl have both the ISO C and the POSIX threads APIs. It has the effect of using
+dnl the ISO C API for most things and the POSIX API only for creating and
+dnl controlling threads (because there is no equivalent to pthread_atfork in
+dnl the ISO C API).
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+dnl Since support for GNU pth was removed, $LTLIBTHREAD and $LIBTHREAD have the
+dnl same value, and similarly $LTLIBMULTITHREAD and $LIBMULTITHREAD have the
+dnl same value. Only system libraries are needed.
+
+AC_DEFUN([gl_THREADLIB_EARLY],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+])
+
+dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_EARLY_BODY],
+[
+ dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+ dnl influences the result of the autoconf tests that test for *_unlocked
+ dnl declarations, on AIX 5 at least. Therefore it must come early.
+ AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+ AC_BEFORE([$0], [gl_ARGP])dnl
+
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+ dnl Check for multithreading.
+ m4_ifdef([gl_THREADLIB_DEFAULT_NO],
+ [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
+ [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
+ m4_divert_text([DEFAULTS], [gl_use_winpthreads_default=])
+ AC_ARG_ENABLE([threads],
+AS_HELP_STRING([--enable-threads={isoc|posix|isoc+posix|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
+AS_HELP_STRING([--disable-threads], [build without multithread safety])]),
+ [gl_use_threads=$enableval],
+ [if test -n "$gl_use_threads_default"; then
+ gl_use_threads="$gl_use_threads_default"
+ else
+changequote(,)dnl
+ case "$host_os" in
+ dnl Disable multithreading by default on OSF/1, because it interferes
+ dnl with fork()/exec(): When msgexec is linked with -lpthread, its
+ dnl child process gets an endless segmentation fault inside execvp().
+ osf*) gl_use_threads=no ;;
+ dnl Disable multithreading by default on Cygwin 1.5.x, because it has
+ dnl bugs that lead to endless loops or crashes. See
+ dnl <https://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
+ cygwin*)
+ case `uname -r` in
+ 1.[0-5].*) gl_use_threads=no ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ;;
+ dnl Obey gl_AVOID_WINPTHREAD on mingw.
+ mingw*)
+ case "$gl_use_winpthreads_default" in
+ yes) gl_use_threads=posix ;;
+ no) gl_use_threads=windows ;;
+ *) gl_use_threads=yes ;;
+ esac
+ ;;
+ *) gl_use_threads=yes ;;
+ esac
+changequote([,])dnl
+ fi
+ ])
+ if test "$gl_use_threads" = yes \
+ || test "$gl_use_threads" = isoc \
+ || test "$gl_use_threads" = posix \
+ || test "$gl_use_threads" = isoc+posix; then
+ # For using <threads.h> or <pthread.h>:
+ gl_ANYTHREADLIB_EARLY
+ fi
+])
+
+dnl The guts of gl_THREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_BODY],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+ gl_threads_api=none
+ LIBTHREAD=
+ LTLIBTHREAD=
+ LIBMULTITHREAD=
+ LTLIBMULTITHREAD=
+ if test "$gl_use_threads" != no; then
+ dnl Check whether the compiler and linker support weak declarations.
+ gl_WEAK_SYMBOLS
+ if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+ dnl If we use weak symbols to implement pthread_in_use / pth_in_use /
+ dnl thread_in_use, we also need to test whether the ISO C 11 thrd_create
+ dnl facility is in use.
+ AC_CHECK_HEADERS_ONCE([threads.h])
+ :
+ fi
+ if test "$gl_use_threads" = isoc || test "$gl_use_threads" = isoc+posix; then
+ AC_CHECK_HEADERS_ONCE([threads.h])
+ gl_have_isoc_threads="$ac_cv_header_threads_h"
+ fi
+ if test "$gl_use_threads" = yes \
+ || test "$gl_use_threads" = posix \
+ || test "$gl_use_threads" = isoc+posix; then
+ gl_PTHREADLIB_BODY
+ LIBTHREAD=$LIBPTHREAD LTLIBTHREAD=$LIBPTHREAD
+ LIBMULTITHREAD=$LIBPMULTITHREAD LTLIBMULTITHREAD=$LIBPMULTITHREAD
+ if test $gl_pthread_api = yes; then
+ if test "$gl_use_threads" = isoc+posix && test "$gl_have_isoc_threads" = yes; then
+ gl_threads_api='isoc+posix'
+ AC_DEFINE([USE_ISOC_AND_POSIX_THREADS], [1],
+ [Define if the combination of the ISO C and POSIX multithreading APIs can be used.])
+ LIBTHREAD= LTLIBTHREAD=
+ else
+ gl_threads_api=posix
+ AC_DEFINE([USE_POSIX_THREADS], [1],
+ [Define if the POSIX multithreading library can be used.])
+ if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+ if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+ AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
+ [Define if references to the POSIX multithreading library should be made weak.])
+ LIBTHREAD= LTLIBTHREAD=
+ else
+ case "$host_os" in
+ freebsd* | dragonfly*)
+ if test "x$LIBTHREAD" != "x$LIBMULTITHREAD"; then
+ dnl If weak symbols can't tell whether pthread_create(), pthread_key_create()
+ dnl etc. will succeed, we need a runtime test.
+ AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+ [Define if the pthread_in_use() detection is hard.])
+ fi
+ ;;
+ esac
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test $gl_threads_api = none; then
+ if test "$gl_use_threads" = isoc && test "$gl_have_isoc_threads" = yes; then
+ gl_STDTHREADLIB_BODY
+ LIBTHREAD=$LIBSTDTHREAD LTLIBTHREAD=$LIBSTDTHREAD
+ LIBMULTITHREAD=$LIBSTDTHREAD LTLIBMULTITHREAD=$LIBSTDTHREAD
+ gl_threads_api=isoc
+ AC_DEFINE([USE_ISOC_THREADS], [1],
+ [Define if the ISO C multithreading library can be used.])
+ fi
+ fi
+ if test $gl_threads_api = none; then
+ case "$gl_use_threads" in
+ yes | windows | win32) # The 'win32' is for backward compatibility.
+ if { case "$host_os" in
+ mingw*) true;;
+ *) false;;
+ esac
+ }; then
+ gl_threads_api=windows
+ AC_DEFINE([USE_WINDOWS_THREADS], [1],
+ [Define if the native Windows multithreading API can be used.])
+ fi
+ ;;
+ esac
+ fi
+ fi
+ AC_MSG_CHECKING([for multithread API to use])
+ AC_MSG_RESULT([$gl_threads_api])
+ AC_SUBST([LIBTHREAD])
+ AC_SUBST([LTLIBTHREAD])
+ AC_SUBST([LIBMULTITHREAD])
+ AC_SUBST([LTLIBMULTITHREAD])
+])
+
+AC_DEFUN([gl_THREADLIB],
+[
+ AC_REQUIRE([gl_THREADLIB_EARLY])
+ AC_REQUIRE([gl_THREADLIB_BODY])
+])
+
+
+dnl gl_DISABLE_THREADS
+dnl ------------------
+dnl Sets the gl_THREADLIB default so that threads are not used by default.
+dnl The user can still override it at installation time, by using the
+dnl configure option '--enable-threads'.
+
+AC_DEFUN([gl_DISABLE_THREADS], [
+ m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
+])
+
+
+dnl gl_AVOID_WINPTHREAD
+dnl -------------------
+dnl Sets the gl_THREADLIB default so that on mingw, a dependency to the
+dnl libwinpthread DLL (mingw-w64 winpthreads library) is avoided.
+dnl The user can still override it at installation time, by using the
+dnl configure option '--enable-threads'.
+
+AC_DEFUN([gl_AVOID_WINPTHREAD], [
+ m4_divert_text([INIT_PREPARE], [gl_use_winpthreads_default=no])
+])
+
+
+dnl ============================================================================
+
+
+dnl Survey of platforms:
+dnl
+dnl Platform Available Compiler Supports test-lock
+dnl flavours option weak result
+dnl --------------- --------- --------- -------- ---------
+dnl Linux 2.4/glibc posix -lpthread Y OK
+dnl
+dnl GNU Hurd/glibc posix
+dnl
+dnl Ubuntu 14.04 posix -pthread Y OK
+dnl
+dnl FreeBSD 5.3 posix -lc_r Y
+dnl posix -lkse ? Y
+dnl posix -lpthread ? Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 5.2 posix -lc_r Y
+dnl posix -lkse Y
+dnl posix -lthr Y
+dnl
+dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
+dnl
+dnl NetBSD 1.6 --
+dnl
+dnl OpenBSD 3.4 posix -lpthread Y OK
+dnl
+dnl Mac OS X 10.[123] posix -lpthread Y OK
+dnl
+dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11 posix -lpthread N (cc) OK
+dnl Y (gcc)
+dnl
+dnl IRIX 6.5 posix -lpthread Y 0.5
+dnl
+dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
+dnl -lpthread (gcc) Y
+dnl
+dnl Cygwin posix -lpthread Y OK
+dnl
+dnl Mingw windows N OK
+dnl
+dnl BeOS 5 --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl OK if all three tests terminate OK,
+dnl 0.5 if the first test terminates OK but the second one loops endlessly,
+dnl 0.0 if the first test already loops endlessly.
diff --git a/m4/time_h.m4 b/m4/time_h.m4
new file mode 100644
index 0000000..0c38ac8
--- /dev/null
+++ b/m4/time_h.m4
@@ -0,0 +1,147 @@
+# Configure a more-standard replacement for <time.h>.
+
+# Copyright (C) 2000-2001, 2003-2007, 2009-2020 Free Software Foundation, Inc.
+
+# serial 13
+
+# 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.
+
+# Written by Paul Eggert and Jim Meyering.
+
+AC_DEFUN([gl_HEADER_TIME_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_HEADER_TIME_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_TIME_H_BODY],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+
+ gl_NEXT_HEADERS([time.h])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+])
+
+dnl Check whether 'struct timespec' is declared
+dnl in time.h, sys/time.h, pthread.h, or unistd.h.
+
+AC_DEFUN([gl_CHECK_TYPE_STRUCT_TIMESPEC],
+[
+ AC_CHECK_HEADERS_ONCE([sys/time.h])
+ AC_CACHE_CHECK([for struct timespec in <time.h>],
+ [gl_cv_sys_struct_timespec_in_time_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <time.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_time_h=yes],
+ [gl_cv_sys_struct_timespec_in_time_h=no])])
+
+ TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=0
+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=0
+ UNISTD_H_DEFINES_STRUCT_TIMESPEC=0
+ if test $gl_cv_sys_struct_timespec_in_time_h = yes; then
+ TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ AC_CACHE_CHECK([for struct timespec in <sys/time.h>],
+ [gl_cv_sys_struct_timespec_in_sys_time_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/time.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_sys_time_h=yes],
+ [gl_cv_sys_struct_timespec_in_sys_time_h=no])])
+ if test $gl_cv_sys_struct_timespec_in_sys_time_h = yes; then
+ SYS_TIME_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ AC_CACHE_CHECK([for struct timespec in <pthread.h>],
+ [gl_cv_sys_struct_timespec_in_pthread_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_pthread_h=yes],
+ [gl_cv_sys_struct_timespec_in_pthread_h=no])])
+ if test $gl_cv_sys_struct_timespec_in_pthread_h = yes; then
+ PTHREAD_H_DEFINES_STRUCT_TIMESPEC=1
+ else
+ AC_CACHE_CHECK([for struct timespec in <unistd.h>],
+ [gl_cv_sys_struct_timespec_in_unistd_h],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <unistd.h>
+ ]],
+ [[static struct timespec x; x.tv_sec = x.tv_nsec;]])],
+ [gl_cv_sys_struct_timespec_in_unistd_h=yes],
+ [gl_cv_sys_struct_timespec_in_unistd_h=no])])
+ if test $gl_cv_sys_struct_timespec_in_unistd_h = yes; then
+ UNISTD_H_DEFINES_STRUCT_TIMESPEC=1
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST([TIME_H_DEFINES_STRUCT_TIMESPEC])
+ AC_SUBST([SYS_TIME_H_DEFINES_STRUCT_TIMESPEC])
+ AC_SUBST([PTHREAD_H_DEFINES_STRUCT_TIMESPEC])
+ AC_SUBST([UNISTD_H_DEFINES_STRUCT_TIMESPEC])
+])
+
+AC_DEFUN([gl_TIME_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_HEADER_TIME_H_DEFAULTS],
+[
+ GNULIB_CTIME=0; AC_SUBST([GNULIB_CTIME])
+ GNULIB_MKTIME=0; AC_SUBST([GNULIB_MKTIME])
+ GNULIB_LOCALTIME=0; AC_SUBST([GNULIB_LOCALTIME])
+ GNULIB_NANOSLEEP=0; AC_SUBST([GNULIB_NANOSLEEP])
+ GNULIB_STRFTIME=0; AC_SUBST([GNULIB_STRFTIME])
+ GNULIB_STRPTIME=0; AC_SUBST([GNULIB_STRPTIME])
+ GNULIB_TIMEGM=0; AC_SUBST([GNULIB_TIMEGM])
+ GNULIB_TIME_R=0; AC_SUBST([GNULIB_TIME_R])
+ GNULIB_TIME_RZ=0; AC_SUBST([GNULIB_TIME_RZ])
+ GNULIB_TZSET=0; AC_SUBST([GNULIB_TZSET])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_TZSET=1; AC_SUBST([GNULIB_MDA_TZSET])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_DECL_LOCALTIME_R=1; AC_SUBST([HAVE_DECL_LOCALTIME_R])
+ HAVE_NANOSLEEP=1; AC_SUBST([HAVE_NANOSLEEP])
+ HAVE_STRPTIME=1; AC_SUBST([HAVE_STRPTIME])
+ HAVE_TIMEGM=1; AC_SUBST([HAVE_TIMEGM])
+ dnl Even GNU libc does not have timezone_t yet.
+ HAVE_TIMEZONE_T=0; AC_SUBST([HAVE_TIMEZONE_T])
+ dnl If another module says to replace or to not replace, do that.
+ dnl Otherwise, replace only if someone compiles with -DGNULIB_PORTCHECK;
+ dnl this lets maintainers check for portability.
+ REPLACE_CTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_CTIME])
+ REPLACE_LOCALTIME_R=GNULIB_PORTCHECK; AC_SUBST([REPLACE_LOCALTIME_R])
+ REPLACE_MKTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_MKTIME])
+ REPLACE_NANOSLEEP=GNULIB_PORTCHECK; AC_SUBST([REPLACE_NANOSLEEP])
+ REPLACE_STRFTIME=GNULIB_PORTCHECK; AC_SUBST([REPLACE_STRFTIME])
+ REPLACE_TIMEGM=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TIMEGM])
+ REPLACE_TZSET=GNULIB_PORTCHECK; AC_SUBST([REPLACE_TZSET])
+
+ dnl Hack so that the time module doesn't depend on the sys_time module.
+ dnl First, default GNULIB_GETTIMEOFDAY to 0 if sys_time is absent.
+ : ${GNULIB_GETTIMEOFDAY=0}; AC_SUBST([GNULIB_GETTIMEOFDAY])
+ dnl Second, it's OK to not use GNULIB_PORTCHECK for REPLACE_GMTIME
+ dnl and REPLACE_LOCALTIME, as portability to Solaris 2.6 and earlier
+ dnl is no longer a big deal.
+ REPLACE_GMTIME=0; AC_SUBST([REPLACE_GMTIME])
+ REPLACE_LOCALTIME=0; AC_SUBST([REPLACE_LOCALTIME])
+])
diff --git a/m4/time_r.m4 b/m4/time_r.m4
new file mode 100644
index 0000000..0e86d44
--- /dev/null
+++ b/m4/time_r.m4
@@ -0,0 +1,99 @@
+dnl Reentrant time functions: localtime_r, gmtime_r.
+
+dnl Copyright (C) 2003, 2006-2020 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 Written by Paul Eggert.
+
+AC_DEFUN([gl_TIME_R],
+[
+ dnl Persuade glibc and Solaris <time.h> to declare localtime_r.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ dnl Some systems don't declare localtime_r() and gmtime_r() if _REENTRANT is
+ dnl not defined.
+ AC_CHECK_DECLS([localtime_r], [], [],
+ [[/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+ ]])
+ if test $ac_cv_have_decl_localtime_r = no; then
+ HAVE_DECL_LOCALTIME_R=0
+ fi
+
+ AC_CHECK_FUNCS_ONCE([localtime_r])
+ if test $ac_cv_func_localtime_r = yes; then
+ HAVE_LOCALTIME_R=1
+ AC_CACHE_CHECK([whether localtime_r is compatible with its POSIX signature],
+ [gl_cv_time_r_posix],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+ ]],
+ [[/* We don't need to append 'restrict's to the argument types,
+ even though the POSIX signature has the 'restrict's,
+ since C99 says they can't affect type compatibility. */
+ struct tm * (*ptr) (time_t const *, struct tm *) = localtime_r;
+ if (ptr) return 0;
+ /* Check the return type is a pointer.
+ On HP-UX 10 it is 'int'. */
+ *localtime_r (0, 0);]])
+ ],
+ [gl_cv_time_r_posix=yes],
+ [gl_cv_time_r_posix=no])
+ ])
+ if test $gl_cv_time_r_posix = yes; then
+ REPLACE_LOCALTIME_R=0
+ else
+ REPLACE_LOCALTIME_R=1
+ fi
+ else
+ HAVE_LOCALTIME_R=0
+ dnl On mingw, localtime_r() is defined as an inline function; use through a
+ dnl direct function call works but the use as a function pointer leads to a
+ dnl link error.
+ AC_CACHE_CHECK([whether localtime_r exists as an inline function],
+ [gl_cv_func_localtime_r_inline],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[/* mingw's <time.h> provides the functions asctime_r, ctime_r,
+ gmtime_r, localtime_r only if <unistd.h> or <pthread.h> has
+ been included before. */
+ #if defined __MINGW32__
+ # include <unistd.h>
+ #endif
+ #include <time.h>
+ ]],
+ [[time_t a;
+ struct tm r;
+ localtime_r (&a, &r);
+ ]])
+ ],
+ [gl_cv_func_localtime_r_inline=yes],
+ [gl_cv_func_localtime_r_inline=no])
+ ])
+ if test $gl_cv_func_localtime_r_inline = yes; then
+ REPLACE_LOCALTIME_R=1
+ fi
+ fi
+])
+
+# Prerequisites of lib/time_r.c.
+AC_DEFUN([gl_PREREQ_TIME_R], [
+ :
+])
diff --git a/m4/timegm.m4 b/m4/timegm.m4
new file mode 100644
index 0000000..67c0c3b
--- /dev/null
+++ b/m4/timegm.m4
@@ -0,0 +1,26 @@
+# timegm.m4 serial 12
+dnl Copyright (C) 2003, 2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_TIMEGM],
+[
+ AC_REQUIRE([gl_HEADER_TIME_H_DEFAULTS])
+ AC_REQUIRE([gl_FUNC_MKTIME_WORKS])
+ REPLACE_TIMEGM=0
+ AC_CHECK_FUNCS_ONCE([timegm])
+ if test $ac_cv_func_timegm = yes; then
+ if test "$gl_cv_func_working_mktime" != yes; then
+ # Assume that timegm is buggy if mktime is.
+ REPLACE_TIMEGM=1
+ fi
+ else
+ HAVE_TIMEGM=0
+ fi
+])
+
+# Prerequisites of lib/timegm.c.
+AC_DEFUN([gl_PREREQ_TIMEGM], [
+ :
+])
diff --git a/m4/timespec.m4 b/m4/timespec.m4
new file mode 100644
index 0000000..e71628d
--- /dev/null
+++ b/m4/timespec.m4
@@ -0,0 +1,11 @@
+#serial 15
+
+# Copyright (C) 2000-2001, 2003-2007, 2009-2020 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.
+
+dnl From Jim Meyering
+
+AC_DEFUN([gl_TIMESPEC], [:])
diff --git a/m4/tm_gmtoff.m4 b/m4/tm_gmtoff.m4
new file mode 100644
index 0000000..41517d8
--- /dev/null
+++ b/m4/tm_gmtoff.m4
@@ -0,0 +1,14 @@
+# tm_gmtoff.m4 serial 3
+dnl Copyright (C) 2002, 2009-2020 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.
+
+AC_DEFUN([gl_TM_GMTOFF],
+[
+ AC_CHECK_MEMBER([struct tm.tm_gmtoff],
+ [AC_DEFINE([HAVE_TM_GMTOFF], [1],
+ [Define if struct tm has the tm_gmtoff member.])],
+ ,
+ [#include <time.h>])
+])
diff --git a/m4/tmpdir.m4 b/m4/tmpdir.m4
new file mode 100644
index 0000000..ad15a03
--- /dev/null
+++ b/m4/tmpdir.m4
@@ -0,0 +1,9 @@
+# tmpdir.m4 serial 4
+dnl Copyright (C) 2001-2002, 2006, 2009-2020 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.
+
+# Prerequisites for lib/tmpdir.c
+
+AC_DEFUN([gt_TMPDIR], [:])
diff --git a/m4/unistd-safer.m4 b/m4/unistd-safer.m4
new file mode 100644
index 0000000..65dfdf2
--- /dev/null
+++ b/m4/unistd-safer.m4
@@ -0,0 +1,10 @@
+#serial 9
+dnl Copyright (C) 2002, 2005-2006, 2009-2020 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.
+
+AC_DEFUN([gl_UNISTD_SAFER],
+[
+ AC_CHECK_FUNCS_ONCE([pipe])
+])
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
new file mode 100644
index 0000000..f0db575
--- /dev/null
+++ b/m4/unistd_h.m4
@@ -0,0 +1,251 @@
+# unistd_h.m4 serial 85
+dnl Copyright (C) 2006-2020 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 Written by Simon Josefsson, Bruno Haible.
+
+AC_DEFUN([gl_UNISTD_H],
+[
+ dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+ dnl once only, before all statements that occur in other macros.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+ gl_CHECK_NEXT_HEADERS([unistd.h])
+ if test $ac_cv_header_unistd_h = yes; then
+ HAVE_UNISTD_H=1
+ else
+ HAVE_UNISTD_H=0
+ fi
+ AC_SUBST([HAVE_UNISTD_H])
+
+ dnl Ensure the type pid_t gets defined.
+ AC_REQUIRE([AC_TYPE_PID_T])
+
+ dnl Determine WINDOWS_64_BIT_OFF_T.
+ AC_REQUIRE([gl_TYPE_OFF_T])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+/* Some systems declare various items in the wrong headers. */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <fcntl.h>
+# include <stdio.h>
+# include <stdlib.h>
+# if defined _WIN32 && ! defined __CYGWIN__
+# include <io.h>
+# endif
+#endif
+ ]], [access chdir chown copy_file_range dup dup2 dup3 environ euidaccess
+ execl execle execlp execv execve execvp execvpe
+ faccessat fchdir
+ fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize
+ getentropy getgroups gethostname getlogin getlogin_r getpagesize getpass
+ getusershell setusershell endusershell
+ group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite
+ readlink readlinkat rmdir sethostname sleep symlink symlinkat
+ truncate ttyname_r unlink unlinkat usleep])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS_ONCE([execvpe])
+ if test $ac_cv_have_decl_execvpe = no; then
+ HAVE_DECL_EXECVPE=0
+ fi
+])
+
+AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+ GNULIB_ACCESS=0; AC_SUBST([GNULIB_ACCESS])
+ GNULIB_CHDIR=0; AC_SUBST([GNULIB_CHDIR])
+ GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN])
+ GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE])
+ GNULIB_COPY_FILE_RANGE=0; AC_SUBST([GNULIB_COPY_FILE_RANGE])
+ GNULIB_DUP=0; AC_SUBST([GNULIB_DUP])
+ GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2])
+ GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3])
+ GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON])
+ GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS])
+ GNULIB_EXECL=0; AC_SUBST([GNULIB_EXECL])
+ GNULIB_EXECLE=0; AC_SUBST([GNULIB_EXECLE])
+ GNULIB_EXECLP=0; AC_SUBST([GNULIB_EXECLP])
+ GNULIB_EXECV=0; AC_SUBST([GNULIB_EXECV])
+ GNULIB_EXECVE=0; AC_SUBST([GNULIB_EXECVE])
+ GNULIB_EXECVP=0; AC_SUBST([GNULIB_EXECVP])
+ GNULIB_EXECVPE=0; AC_SUBST([GNULIB_EXECVPE])
+ GNULIB_FACCESSAT=0; AC_SUBST([GNULIB_FACCESSAT])
+ GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR])
+ GNULIB_FCHOWNAT=0; AC_SUBST([GNULIB_FCHOWNAT])
+ GNULIB_FDATASYNC=0; AC_SUBST([GNULIB_FDATASYNC])
+ GNULIB_FSYNC=0; AC_SUBST([GNULIB_FSYNC])
+ GNULIB_FTRUNCATE=0; AC_SUBST([GNULIB_FTRUNCATE])
+ GNULIB_GETCWD=0; AC_SUBST([GNULIB_GETCWD])
+ GNULIB_GETDOMAINNAME=0; AC_SUBST([GNULIB_GETDOMAINNAME])
+ GNULIB_GETDTABLESIZE=0; AC_SUBST([GNULIB_GETDTABLESIZE])
+ GNULIB_GETENTROPY=0; AC_SUBST([GNULIB_GETENTROPY])
+ GNULIB_GETGROUPS=0; AC_SUBST([GNULIB_GETGROUPS])
+ GNULIB_GETHOSTNAME=0; AC_SUBST([GNULIB_GETHOSTNAME])
+ GNULIB_GETLOGIN=0; AC_SUBST([GNULIB_GETLOGIN])
+ GNULIB_GETLOGIN_R=0; AC_SUBST([GNULIB_GETLOGIN_R])
+ GNULIB_GETOPT_POSIX=0; AC_SUBST([GNULIB_GETOPT_POSIX])
+ GNULIB_GETPAGESIZE=0; AC_SUBST([GNULIB_GETPAGESIZE])
+ GNULIB_GETPASS=0; AC_SUBST([GNULIB_GETPASS])
+ GNULIB_GETUSERSHELL=0; AC_SUBST([GNULIB_GETUSERSHELL])
+ GNULIB_GROUP_MEMBER=0; AC_SUBST([GNULIB_GROUP_MEMBER])
+ GNULIB_ISATTY=0; AC_SUBST([GNULIB_ISATTY])
+ GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN])
+ GNULIB_LINK=0; AC_SUBST([GNULIB_LINK])
+ GNULIB_LINKAT=0; AC_SUBST([GNULIB_LINKAT])
+ GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK])
+ GNULIB_PIPE=0; AC_SUBST([GNULIB_PIPE])
+ GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2])
+ GNULIB_PREAD=0; AC_SUBST([GNULIB_PREAD])
+ GNULIB_PWRITE=0; AC_SUBST([GNULIB_PWRITE])
+ GNULIB_READ=0; AC_SUBST([GNULIB_READ])
+ GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK])
+ GNULIB_READLINKAT=0; AC_SUBST([GNULIB_READLINKAT])
+ GNULIB_RMDIR=0; AC_SUBST([GNULIB_RMDIR])
+ GNULIB_SETHOSTNAME=0; AC_SUBST([GNULIB_SETHOSTNAME])
+ GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP])
+ GNULIB_SYMLINK=0; AC_SUBST([GNULIB_SYMLINK])
+ GNULIB_SYMLINKAT=0; AC_SUBST([GNULIB_SYMLINKAT])
+ GNULIB_TRUNCATE=0; AC_SUBST([GNULIB_TRUNCATE])
+ GNULIB_TTYNAME_R=0; AC_SUBST([GNULIB_TTYNAME_R])
+ GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING])
+ GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
+ GNULIB_UNLINK=0; AC_SUBST([GNULIB_UNLINK])
+ GNULIB_UNLINKAT=0; AC_SUBST([GNULIB_UNLINKAT])
+ GNULIB_USLEEP=0; AC_SUBST([GNULIB_USLEEP])
+ GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_ACCESS=1; AC_SUBST([GNULIB_MDA_ACCESS])
+ GNULIB_MDA_CHDIR=1; AC_SUBST([GNULIB_MDA_CHDIR])
+ GNULIB_MDA_CLOSE=1; AC_SUBST([GNULIB_MDA_CLOSE])
+ GNULIB_MDA_DUP=1; AC_SUBST([GNULIB_MDA_DUP])
+ GNULIB_MDA_DUP2=1; AC_SUBST([GNULIB_MDA_DUP2])
+ GNULIB_MDA_EXECL=1; AC_SUBST([GNULIB_MDA_EXECL])
+ GNULIB_MDA_EXECLE=1; AC_SUBST([GNULIB_MDA_EXECLE])
+ GNULIB_MDA_EXECLP=1; AC_SUBST([GNULIB_MDA_EXECLP])
+ GNULIB_MDA_EXECV=1; AC_SUBST([GNULIB_MDA_EXECV])
+ GNULIB_MDA_EXECVE=1; AC_SUBST([GNULIB_MDA_EXECVE])
+ GNULIB_MDA_EXECVP=1; AC_SUBST([GNULIB_MDA_EXECVP])
+ GNULIB_MDA_EXECVPE=1; AC_SUBST([GNULIB_MDA_EXECVPE])
+ GNULIB_MDA_GETCWD=1; AC_SUBST([GNULIB_MDA_GETCWD])
+ GNULIB_MDA_GETPID=1; AC_SUBST([GNULIB_MDA_GETPID])
+ GNULIB_MDA_ISATTY=1; AC_SUBST([GNULIB_MDA_ISATTY])
+ GNULIB_MDA_LSEEK=1; AC_SUBST([GNULIB_MDA_LSEEK])
+ GNULIB_MDA_READ=1; AC_SUBST([GNULIB_MDA_READ])
+ GNULIB_MDA_RMDIR=1; AC_SUBST([GNULIB_MDA_RMDIR])
+ GNULIB_MDA_SWAB=1; AC_SUBST([GNULIB_MDA_SWAB])
+ GNULIB_MDA_UNLINK=1; AC_SUBST([GNULIB_MDA_UNLINK])
+ GNULIB_MDA_WRITE=1; AC_SUBST([GNULIB_MDA_WRITE])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_CHOWN=1; AC_SUBST([HAVE_CHOWN])
+ HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE])
+ HAVE_DUP3=1; AC_SUBST([HAVE_DUP3])
+ HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS])
+ HAVE_EXECVPE=1; AC_SUBST([HAVE_EXECVPE])
+ HAVE_FACCESSAT=1; AC_SUBST([HAVE_FACCESSAT])
+ HAVE_FCHDIR=1; AC_SUBST([HAVE_FCHDIR])
+ HAVE_FCHOWNAT=1; AC_SUBST([HAVE_FCHOWNAT])
+ HAVE_FDATASYNC=1; AC_SUBST([HAVE_FDATASYNC])
+ HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC])
+ HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE])
+ HAVE_GETDTABLESIZE=1; AC_SUBST([HAVE_GETDTABLESIZE])
+ HAVE_GETENTROPY=1; AC_SUBST([HAVE_GETENTROPY])
+ HAVE_GETGROUPS=1; AC_SUBST([HAVE_GETGROUPS])
+ HAVE_GETHOSTNAME=1; AC_SUBST([HAVE_GETHOSTNAME])
+ HAVE_GETLOGIN=1; AC_SUBST([HAVE_GETLOGIN])
+ HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE])
+ HAVE_GETPASS=1; AC_SUBST([HAVE_GETPASS])
+ HAVE_GROUP_MEMBER=1; AC_SUBST([HAVE_GROUP_MEMBER])
+ HAVE_LCHOWN=1; AC_SUBST([HAVE_LCHOWN])
+ HAVE_LINK=1; AC_SUBST([HAVE_LINK])
+ HAVE_LINKAT=1; AC_SUBST([HAVE_LINKAT])
+ HAVE_PIPE=1; AC_SUBST([HAVE_PIPE])
+ HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2])
+ HAVE_PREAD=1; AC_SUBST([HAVE_PREAD])
+ HAVE_PWRITE=1; AC_SUBST([HAVE_PWRITE])
+ HAVE_READLINK=1; AC_SUBST([HAVE_READLINK])
+ HAVE_READLINKAT=1; AC_SUBST([HAVE_READLINKAT])
+ HAVE_SETHOSTNAME=1; AC_SUBST([HAVE_SETHOSTNAME])
+ HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP])
+ HAVE_SYMLINK=1; AC_SUBST([HAVE_SYMLINK])
+ HAVE_SYMLINKAT=1; AC_SUBST([HAVE_SYMLINKAT])
+ HAVE_UNLINKAT=1; AC_SUBST([HAVE_UNLINKAT])
+ HAVE_USLEEP=1; AC_SUBST([HAVE_USLEEP])
+ HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON])
+ HAVE_DECL_EXECVPE=1; AC_SUBST([HAVE_DECL_EXECVPE])
+ HAVE_DECL_FCHDIR=1; AC_SUBST([HAVE_DECL_FCHDIR])
+ HAVE_DECL_FDATASYNC=1; AC_SUBST([HAVE_DECL_FDATASYNC])
+ HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME])
+ HAVE_DECL_GETLOGIN=1; AC_SUBST([HAVE_DECL_GETLOGIN])
+ HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+ HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE])
+ HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL])
+ HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME])
+ HAVE_DECL_TRUNCATE=1; AC_SUBST([HAVE_DECL_TRUNCATE])
+ HAVE_DECL_TTYNAME_R=1; AC_SUBST([HAVE_DECL_TTYNAME_R])
+ HAVE_OS_H=0; AC_SUBST([HAVE_OS_H])
+ HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H])
+ REPLACE_ACCESS=0; AC_SUBST([REPLACE_ACCESS])
+ REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
+ REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE])
+ REPLACE_DUP=0; AC_SUBST([REPLACE_DUP])
+ REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2])
+ REPLACE_EXECL=0; AC_SUBST([REPLACE_EXECL])
+ REPLACE_EXECLE=0; AC_SUBST([REPLACE_EXECLE])
+ REPLACE_EXECLP=0; AC_SUBST([REPLACE_EXECLP])
+ REPLACE_EXECV=0; AC_SUBST([REPLACE_EXECV])
+ REPLACE_EXECVE=0; AC_SUBST([REPLACE_EXECVE])
+ REPLACE_EXECVP=0; AC_SUBST([REPLACE_EXECVP])
+ REPLACE_EXECVPE=0; AC_SUBST([REPLACE_EXECVPE])
+ REPLACE_FACCESSAT=0; AC_SUBST([REPLACE_FACCESSAT])
+ REPLACE_FCHOWNAT=0; AC_SUBST([REPLACE_FCHOWNAT])
+ REPLACE_FTRUNCATE=0; AC_SUBST([REPLACE_FTRUNCATE])
+ REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
+ REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME])
+ REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE])
+ REPLACE_GETLOGIN_R=0; AC_SUBST([REPLACE_GETLOGIN_R])
+ REPLACE_GETGROUPS=0; AC_SUBST([REPLACE_GETGROUPS])
+ REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE])
+ REPLACE_GETPASS=0; AC_SUBST([REPLACE_GETPASS])
+ REPLACE_ISATTY=0; AC_SUBST([REPLACE_ISATTY])
+ REPLACE_LCHOWN=0; AC_SUBST([REPLACE_LCHOWN])
+ REPLACE_LINK=0; AC_SUBST([REPLACE_LINK])
+ REPLACE_LINKAT=0; AC_SUBST([REPLACE_LINKAT])
+ REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
+ REPLACE_PREAD=0; AC_SUBST([REPLACE_PREAD])
+ REPLACE_PWRITE=0; AC_SUBST([REPLACE_PWRITE])
+ REPLACE_READ=0; AC_SUBST([REPLACE_READ])
+ REPLACE_READLINK=0; AC_SUBST([REPLACE_READLINK])
+ REPLACE_READLINKAT=0; AC_SUBST([REPLACE_READLINKAT])
+ REPLACE_RMDIR=0; AC_SUBST([REPLACE_RMDIR])
+ REPLACE_SLEEP=0; AC_SUBST([REPLACE_SLEEP])
+ REPLACE_SYMLINK=0; AC_SUBST([REPLACE_SYMLINK])
+ REPLACE_SYMLINKAT=0; AC_SUBST([REPLACE_SYMLINKAT])
+ REPLACE_TRUNCATE=0; AC_SUBST([REPLACE_TRUNCATE])
+ REPLACE_TTYNAME_R=0; AC_SUBST([REPLACE_TTYNAME_R])
+ REPLACE_UNLINK=0; AC_SUBST([REPLACE_UNLINK])
+ REPLACE_UNLINKAT=0; AC_SUBST([REPLACE_UNLINKAT])
+ REPLACE_USLEEP=0; AC_SUBST([REPLACE_USLEEP])
+ REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE])
+ UNISTD_H_HAVE_SYS_RANDOM_H=0; AC_SUBST([UNISTD_H_HAVE_SYS_RANDOM_H])
+ UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
+ UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+ AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/m4/unlink.m4 b/m4/unlink.m4
new file mode 100644
index 0000000..69d8ba5
--- /dev/null
+++ b/m4/unlink.m4
@@ -0,0 +1,135 @@
+# unlink.m4 serial 15
+dnl Copyright (C) 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_UNLINK],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_HEADERS_ONCE([unistd.h])
+
+ dnl Detect FreeBSD 7.2, AIX 7.1, Solaris 9 bug.
+ AC_CACHE_CHECK([whether unlink honors trailing slashes],
+ [gl_cv_func_unlink_honors_slashes],
+ [touch conftest.file
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.file conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <io.h>
+ #endif
+ #include <errno.h>
+ ]GL_MDA_DEFINES],
+ [[int result = 0;
+ if (!unlink ("conftest.file/"))
+ result |= 1;
+ else if (errno != ENOTDIR)
+ result |= 2;
+#if HAVE_LSTAT
+ if (!unlink ("conftest.lnk/"))
+ result |= 4;
+ else if (errno != ENOTDIR)
+ result |= 8;
+#endif
+ return result;
+ ]])],
+ [gl_cv_func_unlink_honors_slashes=yes],
+ [gl_cv_func_unlink_honors_slashes=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_unlink_honors_slashes="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_unlink_honors_slashes="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_unlink_honors_slashes="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.file conftest.lnk])
+ case "$gl_cv_func_unlink_honors_slashes" in
+ *no)
+ REPLACE_UNLINK=1
+ ;;
+ esac
+
+ dnl Detect Mac OS X 10.5.6 bug: On read-write HFS mounts, unlink("..") or
+ dnl unlink("../..") succeeds without doing anything.
+ AC_CACHE_CHECK([whether unlink of a parent directory fails as it should],
+ [gl_cv_func_unlink_parent_fails],
+ [case "$host_os" in
+ darwin*)
+ dnl Try to unlink a subdirectory of /tmp, because /tmp is usually on a
+ dnl HFS mount on Mac OS X. Use a subdirectory, owned by the current
+ dnl user, because otherwise unlink() may fail due to permissions
+ dnl reasons, and because when running as root we don't want to risk
+ dnl destroying the entire /tmp.
+ if {
+ # Use the mktemp program if available. If not available, hide the error
+ # message.
+ tmp=`(umask 077 && mktemp -d /tmp/gtXXXXXX) 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+ } ||
+ {
+ # Use a simple mkdir command. It is guaranteed to fail if the directory
+ # already exists. $RANDOM is bash specific and expands to empty in shells
+ # other than bash, ksh and zsh. Its use does not increase security;
+ # rather, it minimizes the probability of failure in a very cluttered /tmp
+ # directory.
+ tmp=/tmp/gt$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+ }; then
+ mkdir "$tmp/subdir"
+ GL_SUBDIR_FOR_UNLINK="$tmp/subdir"
+ export GL_SUBDIR_FOR_UNLINK
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <stdlib.h>
+ #if HAVE_UNISTD_H
+ # include <unistd.h>
+ #else /* on Windows with MSVC */
+ # include <direct.h>
+ # include <io.h>
+ #endif
+ ]GL_MDA_DEFINES[
+ int main ()
+ {
+ int result = 0;
+ if (chdir (getenv ("GL_SUBDIR_FOR_UNLINK")) != 0)
+ result |= 1;
+ else if (unlink ("..") == 0)
+ result |= 2;
+ return result;
+ }
+ ]])],
+ [gl_cv_func_unlink_parent_fails=yes],
+ [gl_cv_func_unlink_parent_fails=no],
+ [# If we don't know, obey --enable-cross-guesses.
+ gl_cv_func_unlink_parent_fails="$gl_cross_guess_normal"
+ ])
+ unset GL_SUBDIR_FOR_UNLINK
+ rm -rf "$tmp"
+ else
+ gl_cv_func_unlink_parent_fails="guessing no"
+ fi
+ ;;
+ *)
+ gl_cv_func_unlink_parent_fails="guessing yes"
+ ;;
+ esac
+ ])
+ case "$gl_cv_func_unlink_parent_fails" in
+ *no)
+ REPLACE_UNLINK=1
+ AC_DEFINE([UNLINK_PARENT_BUG], [1],
+ [Define to 1 if unlink() on a parent directory may succeed])
+ ;;
+ esac
+])
diff --git a/m4/unlocked-io.m4 b/m4/unlocked-io.m4
new file mode 100644
index 0000000..38658e6
--- /dev/null
+++ b/m4/unlocked-io.m4
@@ -0,0 +1,41 @@
+# unlocked-io.m4 serial 15
+
+# Copyright (C) 1998-2006, 2009-2020 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.
+
+dnl From Jim Meyering.
+dnl
+dnl See if the glibc *_unlocked I/O macros or functions are available.
+dnl Use only those *_unlocked macros or functions that are declared
+dnl (because some of them were declared in Solaris 2.5.1 but were removed
+dnl in Solaris 2.6, whereas we want binaries built on Solaris 2.5.1 to run
+dnl on Solaris 2.6).
+
+AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO],
+[
+ AC_DEFINE([USE_UNLOCKED_IO], [1],
+ [Define to 1 if you want getc etc. to use unlocked I/O if available.
+ Unlocked I/O can improve performance in unithreaded apps,
+ but it is not safe for multithreaded apps.])
+
+ dnl Persuade glibc and Solaris <stdio.h> to declare
+ dnl fgets_unlocked(), fputs_unlocked() etc.
+ AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+
+ AC_CHECK_DECLS_ONCE([clearerr_unlocked])
+ AC_CHECK_DECLS_ONCE([feof_unlocked])
+ AC_CHECK_DECLS_ONCE([ferror_unlocked])
+ AC_CHECK_DECLS_ONCE([fflush_unlocked])
+ AC_CHECK_DECLS_ONCE([fgets_unlocked])
+ AC_CHECK_DECLS_ONCE([fputc_unlocked])
+ AC_CHECK_DECLS_ONCE([fputs_unlocked])
+ AC_CHECK_DECLS_ONCE([fread_unlocked])
+ AC_CHECK_DECLS_ONCE([fwrite_unlocked])
+ AC_CHECK_DECLS_ONCE([getc_unlocked])
+ AC_CHECK_DECLS_ONCE([getchar_unlocked])
+ AC_CHECK_DECLS_ONCE([putc_unlocked])
+ AC_CHECK_DECLS_ONCE([putchar_unlocked])
+])
diff --git a/m4/utime.m4 b/m4/utime.m4
new file mode 100644
index 0000000..3d2e13c
--- /dev/null
+++ b/m4/utime.m4
@@ -0,0 +1,76 @@
+# utime.m4 serial 3
+dnl Copyright (C) 2017-2020 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.
+
+AC_DEFUN([gl_FUNC_UTIME],
+[
+ AC_REQUIRE([gl_UTIME_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([lstat])
+ case "$host_os" in
+ mingw*)
+ dnl On this platform, the original utime() or _utime() produces
+ dnl timestamps that are affected by the time zone.
+ dnl Use the function name 'rpl_utime' always, in order to avoid a
+ dnl possible conflict with the function name 'utime' from oldnames.lib
+ dnl (MSVC) or liboldnames.a (mingw).
+ REPLACE_UTIME=1
+ ;;
+ *)
+ AC_CHECK_FUNCS([utime])
+ if test $ac_cv_func_utime = no; then
+ HAVE_UTIME=0
+ else
+ dnl On macOS 10.13, utime("link-to-file/", NULL) mistakenly succeeds.
+ AC_CACHE_CHECK([whether utime handles trailing slashes on files],
+ [gl_cv_func_utime_file_slash],
+ [touch conftest.tmp
+ # Assume that if we have lstat, we can also check symlinks.
+ if test $ac_cv_func_lstat = yes; then
+ ln -s conftest.tmp conftest.lnk
+ fi
+ AC_RUN_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ #include <time.h>
+ ]],
+ [[int result = 0;
+ if (!utime ("conftest.tmp/", NULL))
+ result |= 1;
+ #if HAVE_LSTAT
+ if (!utime ("conftest.lnk/", NULL))
+ result |= 2;
+ #endif
+ return result;
+ ]])],
+ [gl_cv_func_utime_file_slash=yes],
+ [gl_cv_func_utime_file_slash=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_utime_file_slash="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_utime_file_slash="guessing yes" ;;
+ # Guess no on macOS.
+ darwin*) gl_cv_func_utime_file_slash="guessing no" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_utime_file_slash="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.tmp conftest.lnk
+ ])
+ case $gl_cv_func_stat_file_slash in
+ *no)
+ REPLACE_UTIME=1
+ AC_DEFINE([REPLACE_FUNC_UTIME_FILE], [1],
+ [Define to 1 if utime needs help when passed a file name with a trailing slash])
+ ;;
+ esac
+ fi
+ ;;
+ esac
+])
+
+# Prerequisites of lib/utime.c.
+AC_DEFUN([gl_PREREQ_UTIME], [:])
diff --git a/m4/utime_h.m4 b/m4/utime_h.m4
new file mode 100644
index 0000000..b715a53
--- /dev/null
+++ b/m4/utime_h.m4
@@ -0,0 +1,48 @@
+# utime_h.m4 serial 5
+dnl Copyright (C) 2017-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_UTIME_H],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([gl_UTIME_H_DEFAULTS])
+ m4_ifdef([gl_ANSI_CXX], [AC_REQUIRE([gl_ANSI_CXX])])
+ AC_CHECK_HEADERS_ONCE([utime.h])
+ gl_CHECK_NEXT_HEADERS([utime.h])
+
+ if test $ac_cv_header_utime_h = yes; then
+ HAVE_UTIME_H=1
+ else
+ HAVE_UTIME_H=0
+ fi
+ AC_SUBST([HAVE_UTIME_H])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[#include <utime.h>
+ ]],
+ [utime])
+])
+
+AC_DEFUN([gl_UTIME_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_UTIME_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_UTIME_H_DEFAULTS],
+[
+ GNULIB_UTIME=0; AC_SUBST([GNULIB_UTIME])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_UTIME=1; AC_SUBST([GNULIB_MDA_UTIME])
+ dnl Assume POSIX behavior unless another module says otherwise.
+ HAVE_UTIME=1; AC_SUBST([HAVE_UTIME])
+ REPLACE_UTIME=0; AC_SUBST([REPLACE_UTIME])
+])
diff --git a/m4/utimens.m4 b/m4/utimens.m4
new file mode 100644
index 0000000..3d31085
--- /dev/null
+++ b/m4/utimens.m4
@@ -0,0 +1,52 @@
+dnl Copyright (C) 2003-2020 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 serial 11
+
+AC_DEFUN([gl_UTIMENS],
+[
+ dnl Prerequisites of lib/utimens.c.
+ AC_REQUIRE([gl_FUNC_UTIMES])
+ AC_REQUIRE([gl_CHECK_TYPE_STRUCT_TIMESPEC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CHECK_FUNCS_ONCE([futimes futimesat futimens utimensat lutimes])
+
+ if test $ac_cv_func_futimens = no && test $ac_cv_func_futimesat = yes; then
+ dnl FreeBSD 8.0-rc2 mishandles futimesat(fd,NULL,time). It is not
+ dnl standardized, but Solaris implemented it first and uses it as
+ dnl its only means to set fd time.
+ AC_CACHE_CHECK([whether futimesat handles NULL file],
+ [gl_cv_func_futimesat_works],
+ [touch conftest.file
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
+#include <stddef.h>
+#include <sys/times.h>
+#include <fcntl.h>
+]GL_MDA_DEFINES],
+ [[int fd = open ("conftest.file", O_RDWR);
+ if (fd < 0) return 1;
+ if (futimesat (fd, NULL, NULL)) return 2;
+ ]])],
+ [gl_cv_func_futimesat_works=yes],
+ [gl_cv_func_futimesat_works=no],
+ [case "$host_os" in
+ # Guess yes on Linux systems.
+ linux-* | linux) gl_cv_func_futimesat_works="guessing yes" ;;
+ # Guess yes on glibc systems.
+ *-gnu*) gl_cv_func_futimesat_works="guessing yes" ;;
+ # If we don't know, obey --enable-cross-guesses.
+ *) gl_cv_func_futimesat_works="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ rm -f conftest.file])
+ case "$gl_cv_func_futimesat_works" in
+ *yes) ;;
+ *)
+ AC_DEFINE([FUTIMESAT_NULL_BUG], [1],
+ [Define to 1 if futimesat mishandles a NULL file name.])
+ ;;
+ esac
+ fi
+])
diff --git a/m4/utimes.m4 b/m4/utimes.m4
new file mode 100644
index 0000000..877bfd2
--- /dev/null
+++ b/m4/utimes.m4
@@ -0,0 +1,161 @@
+# Detect some bugs in glibc's implementation of utimes.
+# serial 8
+
+dnl Copyright (C) 2003-2005, 2009-2020 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.
+
+# See if we need to work around bugs in glibc's implementation of
+# utimes from 2003-07-12 to 2003-09-17.
+# First, there was a bug that would make utimes set mtime
+# and atime to zero (1970-01-01) unconditionally.
+# Then, there was code to round rather than truncate.
+# Then, there was an implementation (sparc64, Linux-2.4.28, glibc-2.3.3)
+# that didn't honor the NULL-means-set-to-current-time semantics.
+# Finally, there was also a version of utimes that failed on read-only
+# files, while utime worked fine (linux-2.2.20, glibc-2.2.5).
+#
+# From Jim Meyering, with suggestions from Paul Eggert.
+
+AC_DEFUN([gl_FUNC_UTIMES],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether the utimes function works],
+ [gl_cv_func_working_utimes],
+ [AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <utime.h>
+#include <errno.h>
+]GL_MDA_DEFINES[
+
+static int
+inorder (time_t a, time_t b, time_t c)
+{
+ return a <= b && b <= c;
+}
+
+int
+main ()
+{
+ int result = 0;
+ char const *file = "conftest.utimes";
+ /* On OS/2, file timestamps must be on or after 1980 in local time,
+ with an even number of seconds. */
+ static struct timeval timeval[2] = {{315620000 + 10, 10},
+ {315620000 + 1000000, 999998}};
+
+ /* Test whether utimes() essentially works. */
+ {
+ struct stat sbuf;
+ FILE *f = fopen (file, "w");
+ if (f == NULL)
+ result |= 1;
+ else if (fclose (f) != 0)
+ result |= 1;
+ else if (utimes (file, timeval) != 0)
+ result |= 2;
+ else if (lstat (file, &sbuf) != 0)
+ result |= 1;
+ else if (!(sbuf.st_atime == timeval[0].tv_sec
+ && sbuf.st_mtime == timeval[1].tv_sec))
+ result |= 4;
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ /* Test whether utimes() with a NULL argument sets the file's timestamp
+ to the current time. Use 'fstat' as well as 'time' to
+ determine the "current" time, to accommodate NFS file systems
+ if there is a time skew between the host and the NFS server. */
+ {
+ int fd = open (file, O_WRONLY|O_CREAT, 0644);
+ if (fd < 0)
+ result |= 1;
+ else
+ {
+ time_t t0, t2;
+ struct stat st0, st1, st2;
+ if (time (&t0) == (time_t) -1)
+ result |= 1;
+ else if (fstat (fd, &st0) != 0)
+ result |= 1;
+ else if (utimes (file, timeval) != 0
+ && (errno != EACCES
+ /* OS/2 kLIBC utimes fails on opened files. */
+ || close (fd) != 0
+ || utimes (file, timeval) != 0
+ || (fd = open (file, O_WRONLY)) < 0))
+ result |= 2;
+ else if (utimes (file, NULL) != 0
+ && (errno != EACCES
+ /* OS/2 kLIBC utimes fails on opened files. */
+ || close (fd) != 0
+ || utimes (file, NULL) != 0
+ || (fd = open (file, O_WRONLY)) < 0))
+ result |= 8;
+ else if (fstat (fd, &st1) != 0)
+ result |= 1;
+ else if (write (fd, "\n", 1) != 1)
+ result |= 1;
+ else if (fstat (fd, &st2) != 0)
+ result |= 1;
+ else if (time (&t2) == (time_t) -1)
+ result |= 1;
+ else
+ {
+ int m_ok_POSIX = inorder (t0, st1.st_mtime, t2);
+ int m_ok_NFS = inorder (st0.st_mtime, st1.st_mtime, st2.st_mtime);
+ if (! (st1.st_atime == st1.st_mtime))
+ result |= 16;
+ if (! (m_ok_POSIX || m_ok_NFS))
+ result |= 32;
+ }
+ if (close (fd) != 0)
+ result |= 1;
+ }
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ /* Test whether utimes() with a NULL argument works on read-only files. */
+ {
+ int fd = open (file, O_WRONLY|O_CREAT, 0444);
+ if (fd < 0)
+ result |= 1;
+ else if (close (fd) != 0)
+ result |= 1;
+ else if (utimes (file, NULL) != 0)
+ result |= 64;
+ if (unlink (file) != 0)
+ result |= 1;
+ }
+
+ return result;
+}
+ ]])],
+ [gl_cv_func_working_utimes=yes],
+ [gl_cv_func_working_utimes=no],
+ [case "$host_os" in
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_working_utimes="guessing yes" ;;
+ # Guess no on native Windows.
+ mingw*) gl_cv_func_working_utimes="guessing no" ;;
+ *) gl_cv_func_working_utimes="$gl_cross_guess_normal" ;;
+ esac
+ ])
+ ])
+
+ case "$gl_cv_func_working_utimes" in
+ *yes)
+ AC_DEFINE([HAVE_WORKING_UTIMES], [1], [Define if utimes works properly.])
+ ;;
+ esac
+])
diff --git a/m4/vasnprintf.m4 b/m4/vasnprintf.m4
new file mode 100644
index 0000000..43f070e
--- /dev/null
+++ b/m4/vasnprintf.m4
@@ -0,0 +1,298 @@
+# vasnprintf.m4 serial 38
+dnl Copyright (C) 2002-2004, 2006-2020 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.
+
+AC_DEFUN([gl_FUNC_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ if test $ac_cv_func_vasnprintf = no; then
+ gl_REPLACE_VASNPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VASNPRINTF],
+[
+ AC_CHECK_FUNCS_ONCE([vasnprintf])
+ AC_LIBOBJ([vasnprintf])
+ AC_LIBOBJ([printf-args])
+ AC_LIBOBJ([printf-parse])
+ AC_LIBOBJ([asnprintf])
+ if test $ac_cv_func_vasnprintf = yes; then
+ AC_DEFINE([REPLACE_VASNPRINTF], [1],
+ [Define if vasnprintf exists but is overridden by gnulib.])
+ fi
+ gl_PREREQ_PRINTF_ARGS
+ gl_PREREQ_PRINTF_PARSE
+ gl_PREREQ_VASNPRINTF
+ gl_PREREQ_ASNPRINTF
+])
+
+# Prerequisites of lib/printf-args.h, lib/printf-args.c.
+AC_DEFUN([gl_PREREQ_PRINTF_ARGS],
+[
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+])
+
+# Prerequisites of lib/printf-parse.h, lib/printf-parse.c.
+AC_DEFUN([gl_PREREQ_PRINTF_PARSE],
+[
+ AC_REQUIRE([gl_FEATURES_H])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_REQUIRE([AC_TYPE_SIZE_T])
+ AC_CHECK_TYPE([ptrdiff_t], ,
+ [AC_DEFINE([ptrdiff_t], [long],
+ [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+ ])
+ AC_REQUIRE([gt_AC_TYPE_INTMAX_T])
+])
+
+# Prerequisites of lib/vasnprintf.c.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF],
+[
+ AC_REQUIRE([AC_FUNC_ALLOCA])
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ AC_CHECK_FUNCS([snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
+ dnl Use the _snprintf function only if it is declared (because on NetBSD it
+ dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+ AC_CHECK_DECLS([_snprintf], , , [[#include <stdio.h>]])
+ dnl Knowing DBL_EXPBIT0_WORD and DBL_EXPBIT0_BIT enables an optimization
+ dnl in the code for NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE.
+ AC_REQUIRE([gl_DOUBLE_EXPONENT_LOCATION])
+ dnl We can avoid a lot of code by assuming that snprintf's return value
+ dnl conforms to ISO C99. So check that.
+ AC_REQUIRE([gl_SNPRINTF_RETVAL_C99])
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ AC_DEFINE([HAVE_SNPRINTF_RETVAL_C99], [1],
+ [Define if the return value of the snprintf function is the number of
+ of bytes (excluding the terminating NUL) that would have been produced
+ if the buffer had been large enough.])
+ ;;
+ esac
+ dnl Additionally, the use of %n can be eliminated by assuming that snprintf
+ dnl always produces NUL-terminated strings (no truncation).
+ AC_REQUIRE([gl_SNPRINTF_TRUNCATION_C99])
+ case "$gl_cv_func_snprintf_truncation_c99" in
+ *yes)
+ AC_DEFINE([HAVE_SNPRINTF_TRUNCATION_C99], [1],
+ [Define if the string produced by the snprintf function is always NUL
+ terminated.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting 'long double'
+# arguments.
+AC_DEFUN_ONCE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE])
+ case "$gl_cv_func_printf_infinite" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting infinite 'long double'
+# arguments.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE],
+[
+ AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE])
+ dnl There is no need to set NEED_PRINTF_INFINITE_LONG_DOUBLE if
+ dnl NEED_PRINTF_LONG_DOUBLE is already set.
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF_LONG_DOUBLE])
+ case "$gl_cv_func_printf_long_double" in
+ *yes)
+ case "$gl_cv_func_printf_infinite_long_double" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_INFINITE_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ infinite 'long double' arguments.])
+ ;;
+ esac
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'a' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_A],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_A])
+ case "$gl_cv_func_printf_directive_a" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_A], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'a' and 'A' directives.])
+ AC_CHECK_FUNCS([nl_langinfo])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'F' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_F],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_F])
+ case "$gl_cv_func_printf_directive_f" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_F], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'F' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 'ls' directive.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_DIRECTIVE_LS],
+[
+ AC_REQUIRE([gl_PRINTF_DIRECTIVE_LS])
+ case "$gl_cv_func_printf_directive_ls" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_DIRECTIVE_LS], [1],
+ [Define if the vasnprintf implementation needs special code for
+ the 'ls' directive.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the ' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_GROUPING],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_GROUPING])
+ case "$gl_cv_func_printf_flag_grouping" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_GROUPING], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ ' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the '-' flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST])
+ case "$gl_cv_func_printf_flag_leftadjust" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_LEFTADJUST], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ '-' flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting the 0 flag.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_FLAG_ZERO],
+[
+ AC_REQUIRE([gl_PRINTF_FLAG_ZERO])
+ case "$gl_cv_func_printf_flag_zero" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_FLAG_ZERO], [1],
+ [Define if the vasnprintf implementation needs special code for the
+ 0 flag.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for supporting large precisions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_PRECISION],
+[
+ AC_REQUIRE([gl_PRINTF_PRECISION])
+ case "$gl_cv_func_printf_precision" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_UNBOUNDED_PRECISION], [1],
+ [Define if the vasnprintf implementation needs special code for
+ supporting large precisions without arbitrary bounds.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Extra prerequisites of lib/vasnprintf.c for surviving out-of-memory
+# conditions.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_ENOMEM],
+[
+ AC_REQUIRE([gl_PRINTF_ENOMEM])
+ case "$gl_cv_func_printf_enomem" in
+ *yes)
+ ;;
+ *)
+ AC_DEFINE([NEED_PRINTF_ENOMEM], [1],
+ [Define if the vasnprintf implementation needs special code for
+ surviving out-of-memory conditions.])
+ AC_DEFINE([NEED_PRINTF_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'double' arguments.])
+ AC_DEFINE([NEED_PRINTF_LONG_DOUBLE], [1],
+ [Define if the vasnprintf implementation needs special code for
+ 'long double' arguments.])
+ ;;
+ esac
+])
+
+# Prerequisites of lib/vasnprintf.c including all extras for POSIX compliance.
+AC_DEFUN([gl_PREREQ_VASNPRINTF_WITH_EXTRAS],
+[
+ AC_REQUIRE([gl_PREREQ_VASNPRINTF])
+ gl_PREREQ_VASNPRINTF_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE
+ gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_A
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_F
+ gl_PREREQ_VASNPRINTF_DIRECTIVE_LS
+ gl_PREREQ_VASNPRINTF_FLAG_GROUPING
+ gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST
+ gl_PREREQ_VASNPRINTF_FLAG_ZERO
+ gl_PREREQ_VASNPRINTF_PRECISION
+ gl_PREREQ_VASNPRINTF_ENOMEM
+])
+
+# Prerequisites of lib/asnprintf.c.
+AC_DEFUN([gl_PREREQ_ASNPRINTF],
+[
+])
diff --git a/m4/vasprintf.m4 b/m4/vasprintf.m4
new file mode 100644
index 0000000..299f46d
--- /dev/null
+++ b/m4/vasprintf.m4
@@ -0,0 +1,46 @@
+# vasprintf.m4 serial 6
+dnl Copyright (C) 2002-2003, 2006-2007, 2009-2020 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.
+
+AC_DEFUN([gl_FUNC_VASPRINTF],
+[
+ AC_CHECK_FUNCS([vasprintf])
+ if test $ac_cv_func_vasprintf = no; then
+ gl_REPLACE_VASPRINTF
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VASPRINTF],
+[
+ AC_LIBOBJ([vasprintf])
+ AC_LIBOBJ([asprintf])
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ if test $ac_cv_func_vasprintf = yes; then
+ REPLACE_VASPRINTF=1
+ else
+ HAVE_VASPRINTF=0
+ fi
+ gl_PREREQ_VASPRINTF_H
+ gl_PREREQ_VASPRINTF
+ gl_PREREQ_ASPRINTF
+])
+
+# Prerequisites of the vasprintf portion of lib/stdio.h.
+AC_DEFUN([gl_PREREQ_VASPRINTF_H],
+[
+ dnl Persuade glibc <stdio.h> to declare asprintf() and vasprintf().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
+
+# Prerequisites of lib/vasprintf.c.
+AC_DEFUN([gl_PREREQ_VASPRINTF],
+[
+])
+
+# Prerequisites of lib/asprintf.c.
+AC_DEFUN([gl_PREREQ_ASPRINTF],
+[
+])
diff --git a/m4/visibility.m4 b/m4/visibility.m4
new file mode 100644
index 0000000..9f493ba
--- /dev/null
+++ b/m4/visibility.m4
@@ -0,0 +1,77 @@
+# visibility.m4 serial 6
+dnl Copyright (C) 2005, 2008, 2010-2020 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.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl Mac OS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+ CFLAG_VISIBILITY=
+ HAVE_VISIBILITY=0
+ if test -n "$GCC"; then
+ dnl First, check whether -Werror can be added to the command line, or
+ dnl whether it leads to an error because of some other option that the
+ dnl user has put into $CC $CFLAGS $CPPFLAGS.
+ AC_CACHE_CHECK([whether the -Werror option is usable],
+ [gl_cv_cc_vis_werror],
+ [gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Werror"
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([[]], [[]])],
+ [gl_cv_cc_vis_werror=yes],
+ [gl_cv_cc_vis_werror=no])
+ CFLAGS="$gl_save_CFLAGS"
+ ])
+ dnl Now check whether visibility declarations are supported.
+ AC_CACHE_CHECK([for simple visibility declarations],
+ [gl_cv_cc_visibility],
+ [gl_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ dnl We use the option -Werror and a function dummyfunc, because on some
+ dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+ dnl "visibility attribute not supported in this configuration; ignored"
+ dnl at the first function definition in every compilation unit, and we
+ dnl don't want to use the option in this case.
+ if test $gl_cv_cc_vis_werror = yes; then
+ CFLAGS="$CFLAGS -Werror"
+ fi
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+ extern __attribute__((__visibility__("default"))) int exportedvar;
+ extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+ extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ void dummyfunc (void) {}
+ ]],
+ [[]])],
+ [gl_cv_cc_visibility=yes],
+ [gl_cv_cc_visibility=no])
+ CFLAGS="$gl_save_CFLAGS"
+ ])
+ if test $gl_cv_cc_visibility = yes; then
+ CFLAG_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ fi
+ fi
+ AC_SUBST([CFLAG_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/m4/vsnprintf.m4 b/m4/vsnprintf.m4
new file mode 100644
index 0000000..065d234
--- /dev/null
+++ b/m4/vsnprintf.m4
@@ -0,0 +1,62 @@
+# vsnprintf.m4 serial 7
+dnl Copyright (C) 2002-2004, 2007-2020 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 Libintl 0.17 will replace vsnprintf only if it does not support %1$s,
+dnl but defers to any gnulib vsnprintf replacements. Therefore, gnulib
+dnl must guarantee that the decision for replacing vsnprintf is a superset
+dnl of the reasons checked by libintl.
+AC_DEFUN([gl_FUNC_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ gl_cv_func_vsnprintf_usable=no
+ AC_CHECK_FUNCS([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ gl_SNPRINTF_SIZE1
+ case "$gl_cv_func_snprintf_size1" in
+ *yes)
+ gl_SNPRINTF_RETVAL_C99
+ case "$gl_cv_func_snprintf_retval_c99" in
+ *yes)
+ gl_PRINTF_POSITIONS
+ case "$gl_cv_func_printf_positions" in
+ *yes)
+ gl_cv_func_vsnprintf_usable=yes
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ if test $gl_cv_func_vsnprintf_usable = no; then
+ gl_REPLACE_VSNPRINTF
+ fi
+ AC_CHECK_DECLS_ONCE([vsnprintf])
+ if test $ac_cv_have_decl_vsnprintf = no; then
+ HAVE_DECL_VSNPRINTF=0
+ fi
+])
+
+AC_DEFUN([gl_REPLACE_VSNPRINTF],
+[
+ AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+ AC_LIBOBJ([vsnprintf])
+ if test $ac_cv_func_vsnprintf = yes; then
+ REPLACE_VSNPRINTF=1
+ else
+ AC_CHECK_DECLS_ONCE([vsnprintf])
+ if test $ac_cv_have_decl_vsnprintf = yes; then
+ dnl If the function is declared but does not appear to exist, it may be
+ dnl defined as an inline function. In order to avoid a conflict, we have
+ dnl to define rpl_vsnprintf, not vsnprintf.
+ REPLACE_VSNPRINTF=1
+ fi
+ fi
+ gl_PREREQ_VSNPRINTF
+])
+
+# Prerequisites of lib/vsnprintf.c.
+AC_DEFUN([gl_PREREQ_VSNPRINTF], [:])
diff --git a/m4/wait-process.m4 b/m4/wait-process.m4
new file mode 100644
index 0000000..44108a4
--- /dev/null
+++ b/m4/wait-process.m4
@@ -0,0 +1,12 @@
+# wait-process.m4 serial 6
+dnl Copyright (C) 2003, 2008-2020 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.
+
+AC_DEFUN([gl_WAIT_PROCESS],
+[
+ dnl Prerequisites of lib/wait-process.c.
+ AC_REQUIRE([gt_TYPE_SIG_ATOMIC_T])
+ AC_CHECK_FUNCS([waitid])
+])
diff --git a/m4/waitpid.m4 b/m4/waitpid.m4
new file mode 100644
index 0000000..e1d6bed
--- /dev/null
+++ b/m4/waitpid.m4
@@ -0,0 +1,14 @@
+# waitpid.m4 serial 2
+dnl Copyright (C) 2010-2020 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.
+
+AC_DEFUN([gl_FUNC_WAITPID],
+[
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ HAVE_WAITPID=1
+ case $host_os in
+ mingw*) HAVE_WAITPID=0 ;;
+ esac
+])
diff --git a/m4/warn-on-use.m4 b/m4/warn-on-use.m4
new file mode 100644
index 0000000..1d2bcdf
--- /dev/null
+++ b/m4/warn-on-use.m4
@@ -0,0 +1,49 @@
+# warn-on-use.m4 serial 9
+dnl Copyright (C) 2010-2020 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.
+
+# gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES)
+# ---------------------------------------
+# If the module 'posixcheck' is in use:
+#
+# For each whitespace-separated element in the list of NAMES, define
+# HAVE_RAW_DECL_name if the function has a declaration among INCLUDES
+# even after being undefined as a macro.
+#
+# See warn-on-use.h for some hints on how to poison function names, as
+# well as ideas on poisoning global variables and macros. NAMES may
+# include global variables, but remember that only functions work with
+# _GL_WARN_ON_USE. Typically, INCLUDES only needs to list a single
+# header, but if the replacement header pulls in other headers because
+# some systems declare functions in the wrong header, then INCLUDES
+# should do likewise.
+#
+# It is generally safe to assume declarations for functions declared
+# in the intersection of C89 and C11 (such as printf) without
+# needing gl_WARN_ON_USE_PREPARE.
+AC_DEFUN([gl_WARN_ON_USE_PREPARE],
+[
+ m4_ifdef([gl_POSIXCHECK],
+ [m4_foreach_w([gl_decl], [$2],
+ [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
+ [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
+ undefining macros.])])dnl
+ for gl_func in m4_flatten([$2]); do
+ AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
+ AC_CACHE_CHECK([whether $gl_func is declared without a macro],
+ [gl_Symbol],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
+[[#undef $gl_func
+ (void) $gl_func;]])],
+ [AS_VAR_SET([gl_Symbol], [yes])], [AS_VAR_SET([gl_Symbol], [no])])])
+ AS_VAR_IF([gl_Symbol], [yes],
+ [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
+ dnl shortcut - if the raw declaration exists, then set a cache
+ dnl variable to allow skipping any later AC_CHECK_DECL efforts
+ eval ac_cv_have_decl_$gl_func=yes])
+ AS_VAR_POPDEF([gl_Symbol])dnl
+ done
+ ])
+])
diff --git a/m4/warnings.m4 b/m4/warnings.m4
new file mode 100644
index 0000000..d4e4b07
--- /dev/null
+++ b/m4/warnings.m4
@@ -0,0 +1,110 @@
+# warnings.m4 serial 16
+dnl Copyright (C) 2008-2020 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 Simon Josefsson
+
+# gl_AS_VAR_APPEND(VAR, VALUE)
+# ----------------------------
+# Provide the functionality of AS_VAR_APPEND if Autoconf does not have it.
+m4_ifdef([AS_VAR_APPEND],
+[m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])],
+[m4_define([gl_AS_VAR_APPEND],
+[AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])])
+
+
+# gl_COMPILER_OPTION_IF(OPTION, [IF-SUPPORTED], [IF-NOT-SUPPORTED],
+# [PROGRAM = AC_LANG_PROGRAM()])
+# -----------------------------------------------------------------
+# Check if the compiler supports OPTION when compiling PROGRAM.
+#
+# The effects of this macro depend on the current language (_AC_LANG).
+AC_DEFUN([gl_COMPILER_OPTION_IF],
+[
+AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_[]_AC_LANG_ABBREV[]_$1])dnl
+AS_VAR_PUSHDEF([gl_Flags], [_AC_LANG_PREFIX[]FLAGS])dnl
+AS_LITERAL_IF([$1],
+ [m4_pushdef([gl_Positive], m4_bpatsubst([$1], [^-Wno-], [-W]))],
+ [gl_positive="$1"
+case $gl_positive in
+ -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;;
+esac
+m4_pushdef([gl_Positive], [$gl_positive])])dnl
+AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], [gl_Warn], [
+ gl_save_compiler_FLAGS="$gl_Flags"
+ gl_AS_VAR_APPEND(m4_defn([gl_Flags]),
+ [" $gl_unknown_warnings_are_errors ]m4_defn([gl_Positive])["])
+ AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([[]])])],
+ [AS_VAR_SET([gl_Warn], [yes])],
+ [AS_VAR_SET([gl_Warn], [no])])
+ gl_Flags="$gl_save_compiler_FLAGS"
+])
+AS_VAR_IF(gl_Warn, [yes], [$2], [$3])
+m4_popdef([gl_Positive])dnl
+AS_VAR_POPDEF([gl_Flags])dnl
+AS_VAR_POPDEF([gl_Warn])dnl
+])
+
+# gl_UNKNOWN_WARNINGS_ARE_ERRORS
+# ------------------------------
+# Clang doesn't complain about unknown warning options unless one also
+# specifies -Wunknown-warning-option -Werror. Detect this.
+#
+# The effects of this macro depend on the current language (_AC_LANG).
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS],
+[_AC_LANG_DISPATCH([$0], _AC_LANG, $@)])
+
+# Specialization for _AC_LANG = C. This macro can be AC_REQUIREd.
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C)],
+[
+ AC_LANG_PUSH([C])
+ gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
+ AC_LANG_POP([C])
+])
+
+# Specialization for _AC_LANG = C++. This macro can be AC_REQUIREd.
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(C++)],
+[
+ AC_LANG_PUSH([C++])
+ gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
+ AC_LANG_POP([C++])
+])
+
+# Specialization for _AC_LANG = Objective C. This macro can be AC_REQUIREd.
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS(Objective C)],
+[
+ AC_LANG_PUSH([Objective C])
+ gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL
+ AC_LANG_POP([Objective C])
+])
+
+AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS_IMPL],
+[gl_COMPILER_OPTION_IF([-Werror -Wunknown-warning-option],
+ [gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'],
+ [gl_unknown_warnings_are_errors=])])
+
+# gl_WARN_ADD(OPTION, [VARIABLE = WARN_CFLAGS/WARN_CXXFLAGS],
+# [PROGRAM = AC_LANG_PROGRAM()])
+# -----------------------------------------------------------
+# Adds parameter to WARN_CFLAGS/WARN_CXXFLAGS if the compiler supports it
+# when compiling PROGRAM. For example, gl_WARN_ADD([-Wparentheses]).
+#
+# If VARIABLE is a variable name, AC_SUBST it.
+#
+# The effects of this macro depend on the current language (_AC_LANG).
+AC_DEFUN([gl_WARN_ADD],
+[AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS(]_AC_LANG[)])
+gl_COMPILER_OPTION_IF([$1],
+ [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_]_AC_LANG_PREFIX[FLAGS]], [[$2]]), [" $1"])],
+ [],
+ [$3])
+m4_ifval([$2],
+ [AS_LITERAL_IF([$2], [AC_SUBST([$2])])],
+ [AC_SUBST([WARN_]_AC_LANG_PREFIX[FLAGS])])dnl
+])
+
+# Local Variables:
+# mode: autoconf
+# End:
diff --git a/m4/wchar_h.m4 b/m4/wchar_h.m4
new file mode 100644
index 0000000..68441d2
--- /dev/null
+++ b/m4/wchar_h.m4
@@ -0,0 +1,240 @@
+dnl A placeholder for ISO C99 <wchar.h>, for platforms that have issues.
+
+dnl Copyright (C) 2007-2020 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 Written by Eric Blake.
+
+# wchar_h.m4 serial 50
+
+AC_DEFUN([gl_WCHAR_H],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([gl_WCHAR_H_INLINE_OK])
+ dnl Prepare for creating substitute <wchar.h>.
+ dnl Check for <wchar.h> (missing in Linux uClibc when built without wide
+ dnl character support).
+ dnl <wchar.h> is always overridden, because of GNULIB_POSIXCHECK.
+ gl_CHECK_NEXT_HEADERS([wchar.h])
+ if test $ac_cv_header_wchar_h = yes; then
+ HAVE_WCHAR_H=1
+ else
+ HAVE_WCHAR_H=0
+ fi
+ AC_SUBST([HAVE_WCHAR_H])
+
+ AC_REQUIRE([gl_FEATURES_H])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+ #include <wchar.h>
+ ]],
+ [btowc wctob mbsinit mbrtowc mbrlen mbsrtowcs mbsnrtowcs wcrtomb
+ wcsrtombs wcsnrtombs wcwidth
+ wmemchr wmemcmp wmemcpy wmemmove wmempcpy wmemset
+ wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat wcscmp
+ wcsncmp wcscasecmp wcsncasecmp wcscoll wcsxfrm wcsdup wcschr wcsrchr
+ wcscspn wcsspn wcspbrk wcsstr wcstok wcswidth wcsftime
+ ])
+
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_DECLS([wcsdup], [], [], [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_wcsdup = no; then
+ HAVE_DECL_WCSDUP=0
+ fi
+])
+
+dnl Check whether <wchar.h> is usable at all.
+AC_DEFUN([gl_WCHAR_H_INLINE_OK],
+[
+ dnl Test whether <wchar.h> suffers due to the transition from '__inline' to
+ dnl 'gnu_inline'. See <https://sourceware.org/bugzilla/show_bug.cgi?id=4022>
+ dnl and <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42440>. In summary,
+ dnl glibc version 2.5 or older, together with gcc version 4.3 or newer and
+ dnl the option -std=c99 or -std=gnu99, leads to a broken <wchar.h>.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether <wchar.h> uses 'inline' correctly],
+ [gl_cv_header_wchar_h_correct_inline],
+ [gl_cv_header_wchar_h_correct_inline=yes
+ case "$host_os" in
+ *-gnu* | gnu*)
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ extern int zero (void);
+ int main () { return zero(); }
+ ]])])
+ dnl Do not rename the object file from conftest.$ac_objext to
+ dnl conftest1.$ac_objext, as this will cause the link to fail on
+ dnl z/OS when using the XPLINK object format (due to duplicate
+ dnl CSECT names). Instead, temporarily redefine $ac_compile so
+ dnl that the object file has the latter name from the start.
+ save_ac_compile="$ac_compile"
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest1/`
+ if echo '#include "conftest.c"' >conftest1.c \
+ && AC_TRY_EVAL([ac_compile]); then
+ AC_LANG_CONFTEST([
+ AC_LANG_SOURCE([[
+ #define wcstod renamed_wcstod
+ #include <wchar.h>
+ int zero (void) { return 0; }
+ ]])])
+ dnl See note above about renaming object files.
+ ac_compile=`echo "$save_ac_compile" | sed s/conftest/conftest2/`
+ if echo '#include "conftest.c"' >conftest2.c \
+ && AC_TRY_EVAL([ac_compile]); then
+ if $CC -o conftest$ac_exeext $CFLAGS $LDFLAGS conftest1.$ac_objext conftest2.$ac_objext $LIBS >&AS_MESSAGE_LOG_FD 2>&1; then
+ :
+ else
+ gl_cv_header_wchar_h_correct_inline=no
+ fi
+ fi
+ fi
+ ac_compile="$save_ac_compile"
+ rm -f conftest[12].c conftest[12].$ac_objext conftest$ac_exeext
+ ;;
+ esac
+ ])
+ if test $gl_cv_header_wchar_h_correct_inline = no; then
+ AC_MSG_ERROR([<wchar.h> cannot be used with this compiler ($CC $CFLAGS $CPPFLAGS).
+This is a known interoperability problem of glibc <= 2.5 with gcc >= 4.3 in
+C99 mode. You have four options:
+ - Add the flag -fgnu89-inline to CC and reconfigure, or
+ - Fix your include files, using parts of
+ <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b037a293a48718af30d706c2e18c929d0e69a621>, or
+ - Use a gcc version older than 4.3, or
+ - Don't use the flags -std=c99 or -std=gnu99.
+Configuration aborted.])
+ fi
+])
+
+AC_DEFUN([gl_WCHAR_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_WCHAR_H_DEFAULTS],
+[
+ GNULIB_BTOWC=0; AC_SUBST([GNULIB_BTOWC])
+ GNULIB_WCTOB=0; AC_SUBST([GNULIB_WCTOB])
+ GNULIB_MBSINIT=0; AC_SUBST([GNULIB_MBSINIT])
+ GNULIB_MBRTOWC=0; AC_SUBST([GNULIB_MBRTOWC])
+ GNULIB_MBRLEN=0; AC_SUBST([GNULIB_MBRLEN])
+ GNULIB_MBSRTOWCS=0; AC_SUBST([GNULIB_MBSRTOWCS])
+ GNULIB_MBSNRTOWCS=0; AC_SUBST([GNULIB_MBSNRTOWCS])
+ GNULIB_WCRTOMB=0; AC_SUBST([GNULIB_WCRTOMB])
+ GNULIB_WCSRTOMBS=0; AC_SUBST([GNULIB_WCSRTOMBS])
+ GNULIB_WCSNRTOMBS=0; AC_SUBST([GNULIB_WCSNRTOMBS])
+ GNULIB_WCWIDTH=0; AC_SUBST([GNULIB_WCWIDTH])
+ GNULIB_WMEMCHR=0; AC_SUBST([GNULIB_WMEMCHR])
+ GNULIB_WMEMCMP=0; AC_SUBST([GNULIB_WMEMCMP])
+ GNULIB_WMEMCPY=0; AC_SUBST([GNULIB_WMEMCPY])
+ GNULIB_WMEMMOVE=0; AC_SUBST([GNULIB_WMEMMOVE])
+ GNULIB_WMEMPCPY=0; AC_SUBST([GNULIB_WMEMPCPY])
+ GNULIB_WMEMSET=0; AC_SUBST([GNULIB_WMEMSET])
+ GNULIB_WCSLEN=0; AC_SUBST([GNULIB_WCSLEN])
+ GNULIB_WCSNLEN=0; AC_SUBST([GNULIB_WCSNLEN])
+ GNULIB_WCSCPY=0; AC_SUBST([GNULIB_WCSCPY])
+ GNULIB_WCPCPY=0; AC_SUBST([GNULIB_WCPCPY])
+ GNULIB_WCSNCPY=0; AC_SUBST([GNULIB_WCSNCPY])
+ GNULIB_WCPNCPY=0; AC_SUBST([GNULIB_WCPNCPY])
+ GNULIB_WCSCAT=0; AC_SUBST([GNULIB_WCSCAT])
+ GNULIB_WCSNCAT=0; AC_SUBST([GNULIB_WCSNCAT])
+ GNULIB_WCSCMP=0; AC_SUBST([GNULIB_WCSCMP])
+ GNULIB_WCSNCMP=0; AC_SUBST([GNULIB_WCSNCMP])
+ GNULIB_WCSCASECMP=0; AC_SUBST([GNULIB_WCSCASECMP])
+ GNULIB_WCSNCASECMP=0; AC_SUBST([GNULIB_WCSNCASECMP])
+ GNULIB_WCSCOLL=0; AC_SUBST([GNULIB_WCSCOLL])
+ GNULIB_WCSXFRM=0; AC_SUBST([GNULIB_WCSXFRM])
+ GNULIB_WCSDUP=0; AC_SUBST([GNULIB_WCSDUP])
+ GNULIB_WCSCHR=0; AC_SUBST([GNULIB_WCSCHR])
+ GNULIB_WCSRCHR=0; AC_SUBST([GNULIB_WCSRCHR])
+ GNULIB_WCSCSPN=0; AC_SUBST([GNULIB_WCSCSPN])
+ GNULIB_WCSSPN=0; AC_SUBST([GNULIB_WCSSPN])
+ GNULIB_WCSPBRK=0; AC_SUBST([GNULIB_WCSPBRK])
+ GNULIB_WCSSTR=0; AC_SUBST([GNULIB_WCSSTR])
+ GNULIB_WCSTOK=0; AC_SUBST([GNULIB_WCSTOK])
+ GNULIB_WCSWIDTH=0; AC_SUBST([GNULIB_WCSWIDTH])
+ GNULIB_WCSFTIME=0; AC_SUBST([GNULIB_WCSFTIME])
+ dnl Support Microsoft deprecated alias function names by default.
+ GNULIB_MDA_WCSDUP=1; AC_SUBST([GNULIB_MDA_WCSDUP])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_BTOWC=1; AC_SUBST([HAVE_BTOWC])
+ HAVE_MBSINIT=1; AC_SUBST([HAVE_MBSINIT])
+ HAVE_MBRTOWC=1; AC_SUBST([HAVE_MBRTOWC])
+ HAVE_MBRLEN=1; AC_SUBST([HAVE_MBRLEN])
+ HAVE_MBSRTOWCS=1; AC_SUBST([HAVE_MBSRTOWCS])
+ HAVE_MBSNRTOWCS=1; AC_SUBST([HAVE_MBSNRTOWCS])
+ HAVE_WCRTOMB=1; AC_SUBST([HAVE_WCRTOMB])
+ HAVE_WCSRTOMBS=1; AC_SUBST([HAVE_WCSRTOMBS])
+ HAVE_WCSNRTOMBS=1; AC_SUBST([HAVE_WCSNRTOMBS])
+ HAVE_WMEMCHR=1; AC_SUBST([HAVE_WMEMCHR])
+ HAVE_WMEMCMP=1; AC_SUBST([HAVE_WMEMCMP])
+ HAVE_WMEMCPY=1; AC_SUBST([HAVE_WMEMCPY])
+ HAVE_WMEMMOVE=1; AC_SUBST([HAVE_WMEMMOVE])
+ HAVE_WMEMPCPY=1; AC_SUBST([HAVE_WMEMPCPY])
+ HAVE_WMEMSET=1; AC_SUBST([HAVE_WMEMSET])
+ HAVE_WCSLEN=1; AC_SUBST([HAVE_WCSLEN])
+ HAVE_WCSNLEN=1; AC_SUBST([HAVE_WCSNLEN])
+ HAVE_WCSCPY=1; AC_SUBST([HAVE_WCSCPY])
+ HAVE_WCPCPY=1; AC_SUBST([HAVE_WCPCPY])
+ HAVE_WCSNCPY=1; AC_SUBST([HAVE_WCSNCPY])
+ HAVE_WCPNCPY=1; AC_SUBST([HAVE_WCPNCPY])
+ HAVE_WCSCAT=1; AC_SUBST([HAVE_WCSCAT])
+ HAVE_WCSNCAT=1; AC_SUBST([HAVE_WCSNCAT])
+ HAVE_WCSCMP=1; AC_SUBST([HAVE_WCSCMP])
+ HAVE_WCSNCMP=1; AC_SUBST([HAVE_WCSNCMP])
+ HAVE_WCSCASECMP=1; AC_SUBST([HAVE_WCSCASECMP])
+ HAVE_WCSNCASECMP=1; AC_SUBST([HAVE_WCSNCASECMP])
+ HAVE_WCSCOLL=1; AC_SUBST([HAVE_WCSCOLL])
+ HAVE_WCSXFRM=1; AC_SUBST([HAVE_WCSXFRM])
+ HAVE_WCSDUP=1; AC_SUBST([HAVE_WCSDUP])
+ HAVE_WCSCHR=1; AC_SUBST([HAVE_WCSCHR])
+ HAVE_WCSRCHR=1; AC_SUBST([HAVE_WCSRCHR])
+ HAVE_WCSCSPN=1; AC_SUBST([HAVE_WCSCSPN])
+ HAVE_WCSSPN=1; AC_SUBST([HAVE_WCSSPN])
+ HAVE_WCSPBRK=1; AC_SUBST([HAVE_WCSPBRK])
+ HAVE_WCSSTR=1; AC_SUBST([HAVE_WCSSTR])
+ HAVE_WCSTOK=1; AC_SUBST([HAVE_WCSTOK])
+ HAVE_WCSWIDTH=1; AC_SUBST([HAVE_WCSWIDTH])
+ HAVE_WCSFTIME=1; AC_SUBST([HAVE_WCSFTIME])
+ HAVE_DECL_WCTOB=1; AC_SUBST([HAVE_DECL_WCTOB])
+ HAVE_DECL_WCSDUP=1; AC_SUBST([HAVE_DECL_WCSDUP])
+ HAVE_DECL_WCWIDTH=1; AC_SUBST([HAVE_DECL_WCWIDTH])
+ REPLACE_MBSTATE_T=0; AC_SUBST([REPLACE_MBSTATE_T])
+ REPLACE_BTOWC=0; AC_SUBST([REPLACE_BTOWC])
+ REPLACE_WCTOB=0; AC_SUBST([REPLACE_WCTOB])
+ REPLACE_MBSINIT=0; AC_SUBST([REPLACE_MBSINIT])
+ REPLACE_MBRTOWC=0; AC_SUBST([REPLACE_MBRTOWC])
+ REPLACE_MBRLEN=0; AC_SUBST([REPLACE_MBRLEN])
+ REPLACE_MBSRTOWCS=0; AC_SUBST([REPLACE_MBSRTOWCS])
+ REPLACE_MBSNRTOWCS=0; AC_SUBST([REPLACE_MBSNRTOWCS])
+ REPLACE_WCRTOMB=0; AC_SUBST([REPLACE_WCRTOMB])
+ REPLACE_WCSRTOMBS=0; AC_SUBST([REPLACE_WCSRTOMBS])
+ REPLACE_WCSNRTOMBS=0; AC_SUBST([REPLACE_WCSNRTOMBS])
+ REPLACE_WCWIDTH=0; AC_SUBST([REPLACE_WCWIDTH])
+ REPLACE_WCSWIDTH=0; AC_SUBST([REPLACE_WCSWIDTH])
+ REPLACE_WCSFTIME=0; AC_SUBST([REPLACE_WCSFTIME])
+ REPLACE_WCSTOK=0; AC_SUBST([REPLACE_WCSTOK])
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644
index 0000000..e48d464
--- /dev/null
+++ b/m4/wchar_t.m4
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2020 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.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+ AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <stddef.h>
+ wchar_t foo = (wchar_t)'\0';]],
+ [[]])],
+ [gt_cv_c_wchar_t=yes],
+ [gt_cv_c_wchar_t=no])])
+ if test $gt_cv_c_wchar_t = yes; then
+ AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+ fi
+])
diff --git a/m4/wcrtomb.m4 b/m4/wcrtomb.m4
new file mode 100644
index 0000000..71c48f1
--- /dev/null
+++ b/m4/wcrtomb.m4
@@ -0,0 +1,146 @@
+# wcrtomb.m4 serial 17
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_WCRTOMB],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
+ gl_MBSTATE_T_BROKEN
+
+ AC_CHECK_FUNCS_ONCE([wcrtomb])
+ if test $ac_cv_func_wcrtomb = no; then
+ HAVE_WCRTOMB=0
+ AC_CHECK_DECLS([wcrtomb],,, [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_wcrtomb = yes; then
+ dnl On Minix 3.1.8, the system's <wchar.h> declares wcrtomb() although
+ dnl it does not have the function. Avoid a collision with gnulib's
+ dnl replacement.
+ REPLACE_WCRTOMB=1
+ fi
+ else
+ dnl We don't actually need to override wcrtomb when redefining the semantics
+ dnl of the mbstate_t type. Tested on 32-bit AIX.
+ dnl if test $REPLACE_MBSTATE_T = 1; then
+ dnl REPLACE_WCRTOMB=1
+ dnl fi
+ if test $REPLACE_WCRTOMB = 0; then
+ dnl On Android 4.3, wcrtomb produces wrong characters in the C locale.
+ dnl On AIX 4.3, OSF/1 5.1 and Solaris <= 11.3, wcrtomb (NULL, 0, NULL)
+ dnl sometimes returns 0 instead of 1.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([gt_LOCALE_FR])
+ AC_REQUIRE([gt_LOCALE_FR_UTF8])
+ AC_REQUIRE([gt_LOCALE_JA])
+ AC_REQUIRE([gt_LOCALE_ZH_CN])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether wcrtomb works in the C locale],
+ [gl_cv_func_wcrtomb_works],
+ [AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <string.h>
+#include <stdlib.h>
+#include <wchar.h>
+int main ()
+{
+ mbstate_t state;
+ char out[64];
+ int count;
+ memset (&state, 0, sizeof (state));
+ out[0] = 'x';
+ count = wcrtomb (out, L'a', &state);
+ return !(count == 1 && out[0] == 'a');
+}]])],
+ [gl_cv_func_wcrtomb_works=yes],
+ [gl_cv_func_wcrtomb_works=no],
+ [case "$host_os" in
+ # Guess no on Android.
+ linux*-android*) gl_cv_func_wcrtomb_works="guessing no";;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcrtomb_works="guessing yes";;
+ esac
+ ])
+ ])
+ case "$gl_cv_func_wcrtomb_works" in
+ *yes) ;;
+ *) AC_DEFINE([WCRTOMB_C_LOCALE_BUG], [1],
+ [Define if the wcrtomb function does not work in the C locale.])
+ REPLACE_WCRTOMB=1 ;;
+ esac
+ fi
+ if test $REPLACE_WCRTOMB = 0; then
+ AC_CACHE_CHECK([whether wcrtomb return value is correct],
+ [gl_cv_func_wcrtomb_retval],
+ [
+ dnl Initial guess, used when cross-compiling or when no suitable locale
+ dnl is present.
+changequote(,)dnl
+ case "$host_os" in
+ # Guess no on AIX 4, OSF/1, Solaris, native Windows.
+ aix4* | osf* | solaris* | mingw*) gl_cv_func_wcrtomb_retval="guessing no" ;;
+ # Guess yes otherwise.
+ *) gl_cv_func_wcrtomb_retval="guessing yes" ;;
+ esac
+changequote([,])dnl
+ if test $LOCALE_FR != none || test $LOCALE_FR_UTF8 != none || test $LOCALE_JA != none || test $LOCALE_ZH_CN != none; then
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <string.h>
+#include <wchar.h>
+#include <stdlib.h>
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "$LOCALE_FR") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 1;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_FR_UTF8") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 2;
+ {
+ wchar_t wc = (wchar_t) 0xBADFACE;
+ if (mbtowc (&wc, "\303\274", 2) == 2)
+ if (wcrtomb (NULL, wc, NULL) != 1)
+ result |= 2;
+ }
+ }
+ if (setlocale (LC_ALL, "$LOCALE_JA") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 4;
+ }
+ if (setlocale (LC_ALL, "$LOCALE_ZH_CN") != NULL)
+ {
+ if (wcrtomb (NULL, 0, NULL) != 1)
+ result |= 8;
+ }
+ return result;
+}]])],
+ [gl_cv_func_wcrtomb_retval=yes],
+ [gl_cv_func_wcrtomb_retval=no],
+ [:])
+ fi
+ ])
+ case "$gl_cv_func_wcrtomb_retval" in
+ *yes) ;;
+ *) AC_DEFINE([WCRTOMB_RETVAL_BUG], [1],
+ [Define if the wcrtomb function has an incorrect return value.])
+ REPLACE_WCRTOMB=1 ;;
+ esac
+ fi
+ fi
+])
+
+# Prerequisites of lib/wcrtomb.c.
+AC_DEFUN([gl_PREREQ_WCRTOMB], [
+ :
+])
diff --git a/m4/wctype_h.m4 b/m4/wctype_h.m4
new file mode 100644
index 0000000..5f18978
--- /dev/null
+++ b/m4/wctype_h.m4
@@ -0,0 +1,185 @@
+# wctype_h.m4 serial 26
+
+dnl A placeholder for ISO C99 <wctype.h>, for platforms that lack it.
+
+dnl Copyright (C) 2006-2020 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 Written by Paul Eggert.
+
+AC_DEFUN([gl_WCTYPE_H],
+[
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CHECK_FUNCS_ONCE([iswcntrl])
+ if test $ac_cv_func_iswcntrl = yes; then
+ HAVE_ISWCNTRL=1
+ else
+ HAVE_ISWCNTRL=0
+ fi
+ AC_SUBST([HAVE_ISWCNTRL])
+
+ AC_REQUIRE([gt_TYPE_WINT_T])
+ if test $gt_cv_c_wint_t = yes; then
+ HAVE_WINT_T=1
+ else
+ HAVE_WINT_T=0
+ fi
+ AC_SUBST([HAVE_WINT_T])
+
+ AC_REQUIRE([gl_TYPE_WINT_T_PREREQ])
+
+ gl_CHECK_NEXT_HEADERS([wctype.h])
+ if test $ac_cv_header_wctype_h = yes; then
+ if test $ac_cv_func_iswcntrl = yes; then
+ dnl Linux libc5 has an iswprint function that returns 0 for all arguments.
+ dnl The other functions are likely broken in the same way.
+ AC_CACHE_CHECK([whether iswcntrl works], [gl_cv_func_iswcntrl_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+ #include <wchar.h>
+ #include <wctype.h>
+ int main () { return iswprint ('x') == 0; }
+ ]])],
+ [gl_cv_func_iswcntrl_works=yes], [gl_cv_func_iswcntrl_works=no],
+ [dnl Guess no on Linux libc5, yes otherwise.
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdlib.h>
+ #if __GNU_LIBRARY__ == 1
+ Linux libc5 i18n is broken.
+ #endif]], [[]])],
+ [gl_cv_func_iswcntrl_works="guessing yes"],
+ [gl_cv_func_iswcntrl_works="guessing no"])
+ ])
+ ])
+ fi
+ HAVE_WCTYPE_H=1
+ else
+ HAVE_WCTYPE_H=0
+ fi
+ AC_SUBST([HAVE_WCTYPE_H])
+
+ if test $GNULIB_OVERRIDES_WINT_T = 1; then
+ REPLACE_ISWCNTRL=1
+ else
+ case "$gl_cv_func_iswcntrl_works" in
+ *yes) REPLACE_ISWCNTRL=0 ;;
+ *) REPLACE_ISWCNTRL=1 ;;
+ esac
+ fi
+ AC_SUBST([REPLACE_ISWCNTRL])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_ISWCNTRL = 1; then
+ dnl Redefine all of iswcntrl, ..., iswxdigit in <wctype.h>.
+ :
+ fi
+
+ if test $REPLACE_ISWCNTRL = 1; then
+ REPLACE_TOWLOWER=1
+ else
+ AC_CHECK_FUNCS([towlower])
+ if test $ac_cv_func_towlower = yes; then
+ REPLACE_TOWLOWER=0
+ else
+ AC_CHECK_DECLS([towlower],,,
+ [[#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ ]])
+ if test $ac_cv_have_decl_towlower = yes; then
+ dnl On Minix 3.1.8, the system's <wctype.h> declares towlower() and
+ dnl towupper() although it does not have the functions. Avoid a
+ dnl collision with gnulib's replacement.
+ REPLACE_TOWLOWER=1
+ else
+ REPLACE_TOWLOWER=0
+ fi
+ fi
+ fi
+ AC_SUBST([REPLACE_TOWLOWER])
+
+ if test $HAVE_ISWCNTRL = 0 || test $REPLACE_TOWLOWER = 1; then
+ dnl Redefine towlower, towupper in <wctype.h>.
+ :
+ fi
+
+ dnl We assume that the wctype() and iswctype() functions exist if and only
+ dnl if the type wctype_t is defined in <wchar.h> or in <wctype.h> if that
+ dnl exists.
+ dnl HP-UX 11.00 declares all these in <wchar.h> and lacks <wctype.h>.
+ AC_CACHE_CHECK([for wctype_t], [gl_cv_type_wctype_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ #if HAVE_WCTYPE_H
+ # include <wctype.h>
+ #endif
+ wctype_t a;
+ ]],
+ [[]])],
+ [gl_cv_type_wctype_t=yes],
+ [gl_cv_type_wctype_t=no])
+ ])
+ if test $gl_cv_type_wctype_t = no; then
+ HAVE_WCTYPE_T=0
+ fi
+
+ dnl We assume that the wctrans() and towctrans() functions exist if and only
+ dnl if the type wctrans_t is defined in <wctype.h>.
+ AC_CACHE_CHECK([for wctrans_t], [gl_cv_type_wctrans_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ #include <wctype.h>
+ wctrans_t a;
+ ]],
+ [[]])],
+ [gl_cv_type_wctrans_t=yes],
+ [gl_cv_type_wctrans_t=no])
+ ])
+ if test $gl_cv_type_wctrans_t = no; then
+ HAVE_WCTRANS_T=0
+ fi
+
+ dnl Check for declarations of anything we want to poison if the
+ dnl corresponding gnulib module is not in use.
+ gl_WARN_ON_USE_PREPARE([[
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <wchar.h>
+#endif
+#include <wctype.h>
+ ]],
+ [wctype iswctype wctrans towctrans
+ ])
+])
+
+AC_DEFUN([gl_WCTYPE_MODULE_INDICATOR],
+[
+ dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+ AC_REQUIRE([gl_WCTYPE_H_DEFAULTS])
+ gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+ dnl Define it also as a C macro, for the benefit of the unit tests.
+ gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_WCTYPE_H_DEFAULTS],
+[
+ GNULIB_ISWBLANK=0; AC_SUBST([GNULIB_ISWBLANK])
+ GNULIB_ISWDIGIT=0; AC_SUBST([GNULIB_ISWDIGIT])
+ GNULIB_ISWXDIGIT=0; AC_SUBST([GNULIB_ISWXDIGIT])
+ GNULIB_WCTYPE=0; AC_SUBST([GNULIB_WCTYPE])
+ GNULIB_ISWCTYPE=0; AC_SUBST([GNULIB_ISWCTYPE])
+ GNULIB_WCTRANS=0; AC_SUBST([GNULIB_WCTRANS])
+ GNULIB_TOWCTRANS=0; AC_SUBST([GNULIB_TOWCTRANS])
+ dnl Assume proper GNU behavior unless another module says otherwise.
+ HAVE_ISWBLANK=1; AC_SUBST([HAVE_ISWBLANK])
+ HAVE_WCTYPE_T=1; AC_SUBST([HAVE_WCTYPE_T])
+ HAVE_WCTRANS_T=1; AC_SUBST([HAVE_WCTRANS_T])
+ REPLACE_ISWBLANK=0; AC_SUBST([REPLACE_ISWBLANK])
+ REPLACE_ISWDIGIT=0; AC_SUBST([REPLACE_ISWDIGIT])
+ REPLACE_ISWXDIGIT=0; AC_SUBST([REPLACE_ISWXDIGIT])
+])
diff --git a/m4/wcwidth.m4 b/m4/wcwidth.m4
new file mode 100644
index 0000000..4c28519
--- /dev/null
+++ b/m4/wcwidth.m4
@@ -0,0 +1,113 @@
+# wcwidth.m4 serial 33
+dnl Copyright (C) 2006-2020 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.
+
+AC_DEFUN([gl_FUNC_WCWIDTH],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+ dnl Persuade glibc <wchar.h> to declare wcwidth().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ AC_REQUIRE([gt_TYPE_WCHAR_T])
+ AC_REQUIRE([gt_TYPE_WINT_T])
+
+ AC_CHECK_HEADERS_ONCE([wchar.h])
+ AC_CHECK_FUNCS_ONCE([wcwidth])
+
+ AC_CHECK_DECLS([wcwidth], [], [], [[
+ #include <wchar.h>
+ ]])
+ if test $ac_cv_have_decl_wcwidth != yes; then
+ HAVE_DECL_WCWIDTH=0
+ fi
+
+ if test $ac_cv_func_wcwidth != yes; then
+ AC_CACHE_CHECK([whether wcwidth is a macro],
+ [gl_cv_func_wcwidth_macro],
+ [AC_EGREP_CPP([wchar_header_defines_wcwidth], [
+#include <wchar.h>
+#ifdef wcwidth
+ wchar_header_defines_wcwidth
+#endif],
+ [gl_cv_func_wcwidth_macro=yes],
+ [gl_cv_func_wcwidth_macro=no])
+ ])
+ fi
+
+ if test $ac_cv_func_wcwidth = yes || test $gl_cv_func_wcwidth_macro = yes; then
+ HAVE_WCWIDTH=1
+ dnl On Mac OS X 10.3, wcwidth(0x0301) (COMBINING ACUTE ACCENT) returns 1.
+ dnl On NetBSD 9.0, OpenBSD 5.0, wcwidth(0x05B0) (HEBREW POINT SHEVA) returns 1.
+ dnl On NetBSD 9.0, OSF/1 5.1, wcwidth(0x200B) (ZERO WIDTH SPACE) returns 1.
+ dnl On OpenBSD 5.8, wcwidth(0xFF1A) (FULLWIDTH COLON) returns 0.
+ dnl This leads to bugs in 'ls' (coreutils).
+ dnl On Solaris 11.4, wcwidth(0x2202) (PARTIAL DIFFERENTIAL) returns 2,
+ dnl even in Western locales.
+ AC_CACHE_CHECK([whether wcwidth works reasonably in UTF-8 locales],
+ [gl_cv_func_wcwidth_works],
+ [
+ AC_RUN_IFELSE(
+ [AC_LANG_SOURCE([[
+#include <locale.h>
+#include <wchar.h>
+#if !HAVE_DECL_WCWIDTH
+extern
+# ifdef __cplusplus
+"C"
+# endif
+int wcwidth (int);
+#endif
+int main ()
+{
+ int result = 0;
+ if (setlocale (LC_ALL, "en_US.UTF-8") != NULL)
+ {
+ if (wcwidth (0x0301) > 0)
+ result |= 1;
+ if (wcwidth (0x05B0) > 0)
+ result |= 2;
+ if (wcwidth (0x200B) > 0)
+ result |= 4;
+ if (wcwidth (0xFF1A) == 0)
+ result |= 8;
+ if (wcwidth (0x2202) > 1)
+ result |= 16;
+ }
+ return result;
+}]])],
+ [gl_cv_func_wcwidth_works=yes],
+ [gl_cv_func_wcwidth_works=no],
+ [
+changequote(,)dnl
+ case "$host_os" in
+ # Guess yes on glibc systems.
+ *-gnu* | gnu*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on musl systems.
+ *-musl*) gl_cv_func_wcwidth_works="guessing yes";;
+ # Guess yes on AIX 7 systems.
+ aix[7-9]*) gl_cv_func_wcwidth_works="guessing yes";;
+ *) gl_cv_func_wcwidth_works="$gl_cross_guess_normal";;
+ esac
+changequote([,])dnl
+ ])
+ ])
+ case "$gl_cv_func_wcwidth_works" in
+ *yes) ;;
+ *no) REPLACE_WCWIDTH=1 ;;
+ esac
+ else
+ HAVE_WCWIDTH=0
+ fi
+ dnl We don't substitute HAVE_WCWIDTH. We assume that if the system does not
+ dnl have the wcwidth function, then it does not declare it.
+])
+
+# Prerequisites of lib/wcwidth.c.
+AC_DEFUN([gl_PREREQ_WCWIDTH], [
+ AC_REQUIRE([AC_C_INLINE])
+ :
+])
diff --git a/m4/wget.m4 b/m4/wget.m4
new file mode 100644
index 0000000..5605bc5
--- /dev/null
+++ b/m4/wget.m4
@@ -0,0 +1,188 @@
+dnl Wget-specific Autoconf macros.
+dnl Copyright (C) 1995-2011, 2018-2020 Free Software Foundation, Inc.
+
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+dnl GNU General Public License for more details.
+
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+dnl Additional permission under GNU GPL version 3 section 7
+
+dnl If you modify this program, or any covered work, by linking or
+dnl combining it with the OpenSSL project's OpenSSL library (or a
+dnl modified version of that library), containing parts covered by the
+dnl terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+dnl grants you additional permission to convey the resulting work.
+dnl Corresponding Source for a non-source form of such a combination
+dnl shall include the source code for the parts of OpenSSL used as well
+dnl as that of the covered work.
+
+dnl ************************************************************
+dnl START OF IPv6 AUTOCONFIGURATION SUPPORT MACROS
+dnl ************************************************************
+
+AC_DEFUN([TYPE_STRUCT_SOCKADDR_IN6],[
+ wget_have_sockaddr_in6=
+ AC_CHECK_TYPES([struct sockaddr_in6],[
+ wget_have_sockaddr_in6=yes
+ ],[
+ wget_have_sockaddr_in6=no
+ ],[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+ ])
+
+ if test "X$wget_have_sockaddr_in6" = "Xyes"; then :
+ $1
+ else :
+ $2
+ fi
+])
+
+
+AC_DEFUN([MEMBER_SIN6_SCOPE_ID],[
+ AC_REQUIRE([TYPE_STRUCT_SOCKADDR_IN6])
+
+ wget_member_sin6_scope_id=
+ if test "X$wget_have_sockaddr_in6" = "Xyes"; then
+ AC_CHECK_MEMBER([struct sockaddr_in6.sin6_scope_id],[
+ wget_member_sin6_scope_id=yes
+ ],[
+ wget_member_sin6_scope_id=no
+ ],[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+ ])
+ fi
+
+ if test "X$wget_member_sin6_scope_id" = "Xyes"; then
+ AC_DEFINE([HAVE_SOCKADDR_IN6_SCOPE_ID], 1,
+ [Define if struct sockaddr_in6 has the sin6_scope_id member])
+ $1
+ else :
+ $2
+ fi
+])
+
+
+AC_DEFUN([PROTO_INET6],[
+ AC_CACHE_CHECK([for INET6 protocol support], [wget_cv_proto_inet6],[
+ AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+#ifndef PF_INET6
+#error Missing PF_INET6
+#endif
+#ifndef AF_INET6
+#error Missing AF_INET6
+#endif
+ ]])],[
+ wget_cv_proto_inet6=yes
+ ],[
+ wget_cv_proto_inet6=no
+ ])
+ ])
+
+ if test "X$wget_cv_proto_inet6" = "Xyes"; then :
+ $1
+ else :
+ $2
+ fi
+])
+
+
+AC_DEFUN([WGET_STRUCT_SOCKADDR_STORAGE],[
+ AC_CHECK_TYPES([struct sockaddr_storage],[], [], [
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+])
+])
+
+dnl ************************************************************
+dnl END OF IPv6 AUTOCONFIGURATION SUPPORT MACROS
+dnl ************************************************************
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test -n "[$]$1"; then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
diff --git a/m4/wget_manywarnings.m4 b/m4/wget_manywarnings.m4
new file mode 100644
index 0000000..9bc5ee5
--- /dev/null
+++ b/m4/wget_manywarnings.m4
@@ -0,0 +1,92 @@
+# wget_manywarnings.m4 serial 1
+dnl Copyright (C) 2016-2020 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 Tim Ruehsen
+
+# wget_WORD_SET(RESULT, SET, WORDS)
+# --------------------------------------------------
+# Add each word in WORDS to SET if not already there and store in RESULT.
+# Words separated by whitespace.
+AC_DEFUN([wget_WORD_SET], [
+ ret=$2
+ words=" $2 "
+ for word in $3; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ $1=$ret
+])
+
+# wget_WORD_REMOVE(RESULT, SET, WORDS)
+# --------------------------------------------------
+# Remove each word in WORDS from SET and store in RESULT.
+# Words separated by whitespace.
+AC_DEFUN([wget_WORD_REMOVE], [
+ ret=
+ words=" $3 "
+ for word in $2; do
+ if test "${words#*" $word "}" = "$words"; then ret="$ret $word"; fi
+ done
+ $1=$ret
+])
+
+# wget_MANYWARNINGS(VARIABLE, LANGUAGE)
+# -----------------------------
+# Add LANGUAGE related GCC warnings to VARIABLE.
+# This only works for gcc >= 4.3.
+AC_DEFUN([wget_MANYWARNINGS], [
+ #
+ # check if manywarnings is requested
+ #
+ AC_ARG_ENABLE([manywarnings],
+ [AS_HELP_STRING([--enable-manywarnings], [Turn on extra compiler warnings (for developers)])],
+ [case $enableval in
+ yes|no) ;;
+ *) AC_MSG_ERROR([Bad value $enableval for --enable-manywarnings option]) ;;
+ esac
+ wget_manywarnings=$enableval
+ ], [
+ test -f .manywarnings && wget_manywarnings=yes || wget_manywarnings=no
+ ]
+ )
+
+ $1=""
+
+ if test "$wget_manywarnings" = yes; then
+ # AC_PROG_CC sets $GCC to 'yes' if compiler is gcc
+ # AC_REQUIRE([AC_PROG_CC])
+
+ case $CC in
+ *gcc*) CCNAME="gcc";;
+ *clang*) CCNAME="clang";;
+ esac
+
+ if test "$CCNAME" = "gcc"; then
+ test -n "$2" && wget_LANGUAGE=$2 || wget_LANGUAGE=C
+
+ # add -Wall -Wextra to reduce number of warn flags
+ wget_WORD_SET([wget_WARN_CFLAGS], [$CFLAGS], ["-Wall -Wextra -Wformat=2"])
+
+ # collect all disabled warn flags in $WARN_CFLAGS
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" "$($CC $wget_WARN_CFLAGS -Q --help=warning,$wget_LANGUAGE|\
+ awk '{ if (([$]2 == "[[disabled]]" || [$]2 == "")\
+ && [$]1!~/=/ && [$]1~/^-W/ && [$]1!~/</ && [$]1!="-Wall") print [$]1 }')
+
+ GCC_VERSION=$($CC -dumpversion | cut -f1 -d.)
+ if test $GCC_VERSION -ge 6; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Warray-bounds=2 -Wnormalized=nfc -Wshift-overflow=2 -Wunused-const-variable=2"
+ fi
+ if test $GCC_VERSION -ge 7; then
+ wget_WARN_CFLAGS=$wget_WARN_CFLAGS" -Wformat-overflow=2 -Wformat-truncation=1 -Wstringop-overflow=2"
+ fi
+
+ elif test "$CCNAME" = "clang"; then
+ # set all warn flags on
+ wget_WORD_SET([wget_WARN_CFLAGS], [$CFLAGS], ["-Weverything"])
+ fi
+
+ $1=$wget_WARN_CFLAGS
+ fi
+])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644
index 0000000..16618e8
--- /dev/null
+++ b/m4/wint_t.m4
@@ -0,0 +1,57 @@
+# wint_t.m4 serial 10
+dnl Copyright (C) 2003, 2007-2020 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.
+dnl Test whether <wchar.h> has the 'wint_t' type and whether gnulib's
+dnl <wchar.h> or <wctype.h> would, if present, override 'wint_t'.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+ AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ wint_t foo = (wchar_t)'\0';]],
+ [[]])],
+ [gt_cv_c_wint_t=yes],
+ [gt_cv_c_wint_t=no])])
+ if test $gt_cv_c_wint_t = yes; then
+ AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+
+ dnl Determine whether gnulib's <wchar.h> or <wctype.h> would, if present,
+ dnl override 'wint_t'.
+ AC_CACHE_CHECK([whether wint_t is large enough],
+ [gl_cv_type_wint_t_large_enough],
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+ ]])],
+ [gl_cv_type_wint_t_large_enough=yes],
+ [gl_cv_type_wint_t_large_enough=no])])
+ if test $gl_cv_type_wint_t_large_enough = no; then
+ GNULIB_OVERRIDES_WINT_T=1
+ else
+ GNULIB_OVERRIDES_WINT_T=0
+ fi
+ else
+ GNULIB_OVERRIDES_WINT_T=0
+ fi
+ AC_SUBST([GNULIB_OVERRIDES_WINT_T])
+])
+
+dnl Prerequisites of the 'wint_t' override.
+AC_DEFUN([gl_TYPE_WINT_T_PREREQ],
+[
+ AC_CHECK_HEADERS_ONCE([crtdefs.h])
+ if test $ac_cv_header_crtdefs_h = yes; then
+ HAVE_CRTDEFS_H=1
+ else
+ HAVE_CRTDEFS_H=0
+ fi
+ AC_SUBST([HAVE_CRTDEFS_H])
+])
diff --git a/m4/wmemchr.m4 b/m4/wmemchr.m4
new file mode 100644
index 0000000..79dc6ab
--- /dev/null
+++ b/m4/wmemchr.m4
@@ -0,0 +1,25 @@
+# wmemchr.m4 serial 5
+dnl Copyright (C) 2011-2020 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.
+
+AC_DEFUN([gl_FUNC_WMEMCHR],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+ dnl We cannot use AC_CHECK_FUNCS here, because the MSVC 9 header files
+ dnl provide this function as an inline function definition.
+ AC_CACHE_CHECK([for wmemchr], [gl_cv_func_wmemchr],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <wchar.h>
+ ]],
+ [[return ! wmemchr ((const wchar_t *) 0, (wchar_t) ' ', 0);]])
+ ],
+ [gl_cv_func_wmemchr=yes],
+ [gl_cv_func_wmemchr=no])
+ ])
+ if test $gl_cv_func_wmemchr = no; then
+ HAVE_WMEMCHR=0
+ fi
+])
diff --git a/m4/wmempcpy.m4 b/m4/wmempcpy.m4
new file mode 100644
index 0000000..1795fc8
--- /dev/null
+++ b/m4/wmempcpy.m4
@@ -0,0 +1,21 @@
+# wmempcpy.m4 serial 1
+dnl Copyright (C) 2020 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.
+
+AC_DEFUN([gl_FUNC_WMEMPCPY],
+[
+ AC_REQUIRE([gl_WCHAR_H_DEFAULTS])
+
+ dnl Persuade glibc <wchar.h> to declare wmempcpy().
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+ dnl The wmempcpy() declaration in lib/wchar.in.h uses 'restrict'.
+ AC_REQUIRE([AC_C_RESTRICT])
+
+ AC_CHECK_FUNCS_ONCE([wmempcpy])
+ if test $ac_cv_func_wmempcpy = no; then
+ HAVE_WMEMPCPY=0
+ fi
+])
diff --git a/m4/write.m4 b/m4/write.m4
new file mode 100644
index 0000000..2727baf
--- /dev/null
+++ b/m4/write.m4
@@ -0,0 +1,34 @@
+# write.m4 serial 6
+dnl Copyright (C) 2008-2020 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.
+
+AC_DEFUN([gl_FUNC_WRITE],
+[
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+ m4_ifdef([gl_MSVC_INVAL], [
+ AC_REQUIRE([gl_MSVC_INVAL])
+ if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+ REPLACE_WRITE=1
+ fi
+ ])
+ dnl This ifdef is just an optimization, to avoid performing a configure
+ dnl check whose result is not used. It does not make the test of
+ dnl GNULIB_UNISTD_H_SIGPIPE or GNULIB_SIGPIPE redundant.
+ m4_ifdef([gl_SIGNAL_SIGPIPE], [
+ gl_SIGNAL_SIGPIPE
+ if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+ REPLACE_WRITE=1
+ fi
+ ])
+ m4_ifdef([gl_NONBLOCKING_IO], [
+ gl_NONBLOCKING_IO
+ if test $gl_cv_have_nonblocking != yes; then
+ REPLACE_WRITE=1
+ fi
+ ])
+])
+
+# Prerequisites of lib/write.c.
+AC_DEFUN([gl_PREREQ_WRITE], [:])
diff --git a/m4/xalloc.m4 b/m4/xalloc.m4
new file mode 100644
index 0000000..a556870
--- /dev/null
+++ b/m4/xalloc.m4
@@ -0,0 +1,7 @@
+# xalloc.m4 serial 18
+dnl Copyright (C) 2002-2006, 2009-2020 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.
+
+AC_DEFUN([gl_XALLOC], [:])
diff --git a/m4/xsize.m4 b/m4/xsize.m4
new file mode 100644
index 0000000..978f99a
--- /dev/null
+++ b/m4/xsize.m4
@@ -0,0 +1,12 @@
+# xsize.m4 serial 5
+dnl Copyright (C) 2003-2004, 2008-2020 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.
+
+AC_DEFUN([gl_XSIZE],
+[
+ dnl Prerequisites of lib/xsize.h.
+ AC_REQUIRE([gl_SIZE_MAX])
+ AC_CHECK_HEADERS([stdint.h])
+])
diff --git a/m4/xstrndup.m4 b/m4/xstrndup.m4
new file mode 100644
index 0000000..3846f91
--- /dev/null
+++ b/m4/xstrndup.m4
@@ -0,0 +1,15 @@
+# xstrndup.m4 serial 2
+dnl Copyright (C) 2003, 2009-2020 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.
+
+AC_DEFUN([gl_XSTRNDUP],
+[
+ gl_PREREQ_XSTRNDUP
+])
+
+# Prerequisites of lib/xstrndup.c.
+AC_DEFUN([gl_PREREQ_XSTRNDUP], [
+ :
+])
diff --git a/m4/zzgnulib.m4 b/m4/zzgnulib.m4
new file mode 100644
index 0000000..98fa68f
--- /dev/null
+++ b/m4/zzgnulib.m4
@@ -0,0 +1,23 @@
+# zzgnulib.m4 serial 1
+dnl Copyright (C) 2020 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 This file must be named something that sorts after all other
+dnl package- or gnulib-provided .m4 files - at least for those packages
+dnl that redefine AC_PROG_CC.
+
+dnl Redefine AC_PROG_CC so that it ends with invocations of gl_COMPILER_CLANG
+dnl and gl_COMPILER_PREPARE_CHECK_DECL.
+m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[
+gl_COMPILER_CLANG
+gl_COMPILER_PREPARE_CHECK_DECL
+])
+
+# gl_ZZGNULIB
+# -----------
+# Witness macro that this file has been included. Needed to force
+# Automake to include this file after all other gnulib .m4 files.
+AC_DEFUN([gl_ZZGNULIB])
diff --git a/maint.mk b/maint.mk
new file mode 100644
index 0000000..2a0d2b4
--- /dev/null
+++ b/maint.mk
@@ -0,0 +1,1756 @@
+# -*-Makefile-*-
+# This Makefile fragment tries to be general-purpose enough to be
+# used by many projects via the gnulib maintainer-makefile module.
+
+## Copyright (C) 2001-2020 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 reported not to work with make-3.79.1
+# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+ME := maint.mk
+
+# These variables ought to be defined through the configure.ac section
+# of the module description. But some packages import this file directly,
+# ignoring the module description.
+AWK ?= awk
+GREP ?= grep
+SED ?= sed
+
+# Helper variables.
+_empty =
+_sp = $(_empty) $(_empty)
+
+# _equal,S1,S2
+# ------------
+# If S1 == S2, return S1, otherwise the empty string.
+_equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
+
+# member-check,VARIABLE,VALID-VALUES
+# ----------------------------------
+# Check that $(VARIABLE) is in the space-separated list of VALID-VALUES, and
+# return it. Die otherwise.
+member-check = \
+ $(strip \
+ $(if $($(1)), \
+ $(if $(findstring $(_sp),$($(1))), \
+ $(error invalid $(1): '$($(1))', expected $(2)), \
+ $(or $(findstring $(_sp)$($(1))$(_sp),$(_sp)$(2)$(_sp)), \
+ $(error invalid $(1): '$($(1))', expected $(2)))), \
+ $(error $(1) undefined)))
+
+# Do not save the original name or timestamp in the .tar.gz file.
+# Use --rsyncable if available.
+gzip_rsyncable := \
+ $(shell gzip --help 2>/dev/null|$(GREP) rsyncable >/dev/null \
+ && printf %s --rsyncable)
+GZIP_ENV = '--no-name --best $(gzip_rsyncable)'
+
+GIT = git
+VC = $(GIT)
+
+VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir)
+
+# You can override this variable in cfg.mk if your gnulib submodule lives
+# in a different location.
+gnulib_dir ?= $(srcdir)/gnulib
+
+# You can override this variable in cfg.mk to set your own regexp
+# matching files to ignore.
+VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
+
+# This is to preprocess robustly the output of $(VC_LIST), so that even
+# when $(srcdir) is a pathological name like "....", the leading sed command
+# removes only the intended prefix.
+_dot_escaped_srcdir = $(subst .,\.,$(srcdir))
+
+# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
+# when $(srcdir) is not ".".
+ifeq ($(srcdir),.)
+ _prepend_srcdir_prefix =
+else
+ _prepend_srcdir_prefix = | $(SED) 's|^|$(srcdir)/|'
+endif
+
+# In order to be able to consistently filter "."-relative names,
+# (i.e., with no $(srcdir) prefix), this definition is careful to
+# remove any $(srcdir) prefix, and to restore what it removes.
+_sc_excl = \
+ $(or $(exclude_file_name_regexp--$@),^$$)
+VC_LIST_EXCEPT = \
+ $(VC_LIST) | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
+ | if test -f $(srcdir)/.x-$@; then $(GREP) -vEf $(srcdir)/.x-$@; \
+ else $(GREP) -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
+ | $(GREP) -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
+ $(_prepend_srcdir_prefix)
+
+ifeq ($(origin prev_version_file), undefined)
+ prev_version_file = $(srcdir)/.prev-version
+endif
+
+PREV_VERSION := $(shell cat $(prev_version_file) 2>/dev/null)
+VERSION_REGEXP = $(subst .,\.,$(VERSION))
+PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION))
+
+ifeq ($(VC),$(GIT))
+ this-vc-tag = v$(VERSION)
+ this-vc-tag-regexp = v$(VERSION_REGEXP)
+else
+ tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]')
+ tag-this-version = $(subst .,_,$(VERSION))
+ this-vc-tag = $(tag-package)-$(tag-this-version)
+ this-vc-tag-regexp = $(this-vc-tag)
+endif
+my_distdir = $(PACKAGE)-$(VERSION)
+
+# Old releases are stored here.
+release_archive_dir ?= ../release
+
+# If RELEASE_TYPE is undefined, but RELEASE is, use its second word.
+# But overwrite VERSION.
+ifdef RELEASE
+ VERSION := $(word 1, $(RELEASE))
+ RELEASE_TYPE ?= $(word 2, $(RELEASE))
+endif
+
+# Validate and return $(RELEASE_TYPE), or die.
+RELEASE_TYPES = alpha beta stable
+release-type = $(call member-check,RELEASE_TYPE,$(RELEASE_TYPES))
+
+# Override gnu_rel_host and url_dir_list in cfg.mk if these are not right.
+# Use alpha.gnu.org for alpha and beta releases.
+# Use ftp.gnu.org for stable releases.
+gnu_ftp_host-alpha = alpha.gnu.org
+gnu_ftp_host-beta = alpha.gnu.org
+gnu_ftp_host-stable = ftp.gnu.org
+gnu_rel_host ?= $(gnu_ftp_host-$(release-type))
+
+url_dir_list ?= $(if $(call _equal,$(gnu_rel_host),ftp.gnu.org), \
+ https://ftpmirror.gnu.org/$(PACKAGE), \
+ https://$(gnu_rel_host)/gnu/$(PACKAGE))
+
+# Override this in cfg.mk if you are using a different format in your
+# NEWS file.
+today = $(shell date +%Y-%m-%d)
+
+# Select which lines of NEWS are searched for $(news-check-regexp).
+# This is a sed line number spec. The default says that we search
+# lines 1..10 of NEWS for $(news-check-regexp).
+# If you want to search only line 3 or only lines 20-22, use "3" or "20,22".
+news-check-lines-spec ?= 1,10
+news-check-regexp ?= '^\*.* $(VERSION_REGEXP) \($(today)\)'
+
+# Prevent programs like 'sort' from considering distinct strings to be equal.
+# Doing it here saves us from having to set LC_ALL elsewhere in this file.
+export LC_ALL = C
+
+## --------------- ##
+## Sanity checks. ##
+## --------------- ##
+
+ifneq ($(_gl-Makefile),)
+_cfg_mk := $(wildcard $(srcdir)/cfg.mk)
+
+# Collect the names of rules starting with 'sc_'.
+syntax-check-rules := $(sort $(shell $(SED) -n \
+ 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
+.PHONY: $(syntax-check-rules)
+
+ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0)
+ local-checks-available += $(syntax-check-rules)
+else
+ local-checks-available += no-vc-detected
+no-vc-detected:
+ @echo "No version control files detected; skipping syntax check"
+endif
+.PHONY: $(local-checks-available)
+
+# Arrange to print the name of each syntax-checking rule just before running it.
+$(syntax-check-rules): %: %.m
+sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules))
+.PHONY: $(sc_m_rules_)
+$(sc_m_rules_):
+ @echo $(patsubst sc_%.m, %, $@)
+ @date +%s.%N > .sc-start-$(basename $@)
+
+# Compute and print the elapsed time for each syntax-check rule.
+sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules))
+.PHONY: $(sc_z_rules_)
+$(sc_z_rules_): %.z: %
+ @end=$$(date +%s.%N); \
+ start=$$(cat .sc-start-$*); \
+ rm -f .sc-start-$*; \
+ $(AWK) -v s=$$start -v e=$$end \
+ 'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null
+
+# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper
+# that computes and prints elapsed time.
+local-check := \
+ $(patsubst sc_%, sc_%.z, \
+ $(filter-out $(local-checks-to-skip), $(local-checks-available)))
+
+syntax-check: $(local-check)
+endif
+
+# _sc_search_regexp
+#
+# This macro searches for a given construct in the selected files and
+# then takes some action.
+#
+# Parameters (shell variables):
+#
+# prohibit | require
+#
+# Regular expression (ERE) denoting either a forbidden construct
+# or a required construct. Those arguments are exclusive.
+#
+# exclude
+#
+# Regular expression (ERE) denoting lines to ignore that matched
+# a prohibit construct. For example, this can be used to exclude
+# comments that mention why the nearby code uses an alternative
+# construct instead of the simpler prohibited construct.
+#
+# in_vc_files | in_files
+#
+# grep-E-style regexp selecting the files to check. For in_vc_files,
+# the regexp is used to select matching files from the list of all
+# version-controlled files; for in_files, it's from the names printed
+# by "find $(srcdir)". When neither is specified, use all files that
+# are under version control.
+#
+# containing | non_containing
+#
+# Select the files (non) containing strings matching this regexp.
+# If both arguments are specified then CONTAINING takes
+# precedence.
+#
+# with_grep_options
+#
+# Extra options for grep.
+#
+# ignore_case
+#
+# Ignore case.
+#
+# halt
+#
+# Message to display before to halting execution.
+#
+# Finally, you may exempt files based on an ERE matching file names.
+# For example, to exempt from the sc_space_tab check all files with the
+# .diff suffix, set this Make variable:
+#
+# exclude_file_name_regexp--sc_space_tab = \.diff$
+#
+# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT,
+# when filtering by name via in_files, we explicitly filter out matching
+# names here as well.
+
+# Initialize each, so that envvar settings cannot interfere.
+export require =
+export prohibit =
+export exclude =
+export in_vc_files =
+export in_files =
+export containing =
+export non_containing =
+export halt =
+export with_grep_options =
+
+# By default, _sc_search_regexp does not ignore case.
+export ignore_case =
+_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
+
+define _sc_say_and_exit
+ dummy=; : so we do not need a semicolon before each use; \
+ { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; };
+endef
+
+define _sc_search_regexp
+ dummy=; : so we do not need a semicolon before each use; \
+ \
+ : Check arguments; \
+ test -n "$$prohibit" && test -n "$$require" \
+ && { msg='Cannot specify both prohibit and require' \
+ $(_sc_say_and_exit) } || :; \
+ test -z "$$prohibit" && test -z "$$require" \
+ && { msg='Should specify either prohibit or require' \
+ $(_sc_say_and_exit) } || :; \
+ test -z "$$prohibit" && test -n "$$exclude" \
+ && { msg='Use of exclude requires a prohibit pattern' \
+ $(_sc_say_and_exit) } || :; \
+ test -n "$$in_vc_files" && test -n "$$in_files" \
+ && { msg='Cannot specify both in_vc_files and in_files' \
+ $(_sc_say_and_exit) } || :; \
+ test "x$$halt" != x \
+ || { msg='halt not defined' $(_sc_say_and_exit) }; \
+ \
+ : Filter by file name; \
+ if test -n "$$in_files"; then \
+ files=$$(find $(srcdir) | $(GREP) -E "$$in_files" \
+ | $(GREP) -Ev '$(_sc_excl)'); \
+ else \
+ files=$$($(VC_LIST_EXCEPT)); \
+ if test -n "$$in_vc_files"; then \
+ files=$$(echo "$$files" | $(GREP) -E "$$in_vc_files"); \
+ fi; \
+ fi; \
+ \
+ : Filter by content; \
+ test -n "$$files" \
+ && test -n "$$containing" \
+ && { files=$$(echo "$$files" | xargs $(GREP) -l "$$containing"); } \
+ || :; \
+ test -n "$$files" \
+ && test -n "$$non_containing" \
+ && { files=$$(echo "$$files" | xargs $(GREP) -vl "$$non_containing"); } \
+ || :; \
+ \
+ : Check for the construct; \
+ if test -n "$$files"; then \
+ if test -n "$$prohibit"; then \
+ echo "$$files" \
+ | xargs $(GREP) $$with_grep_options $(_ignore_case) -nE \
+ "$$prohibit" /dev/null \
+ | $(GREP) -vE "$${exclude:-^$$}" \
+ && { msg="$$halt" $(_sc_say_and_exit) } \
+ || :; \
+ else \
+ echo "$$files" \
+ | xargs \
+ $(GREP) $$with_grep_options $(_ignore_case) -LE "$$require" \
+ | $(GREP) . \
+ && { msg="$$halt" $(_sc_say_and_exit) } \
+ || :; \
+ fi \
+ else :; \
+ fi || :;
+endef
+
+sc_avoid_if_before_free:
+ @$(VC_LIST_EXCEPT) \
+ | $(GREP) -v useless-if-before-free \
+ | xargs \
+ $(srcdir)/$(_build-aux)/useless-if-before-free \
+ $(useless_free_options) \
+ && { printf '$(ME): found useless "if"' \
+ ' before "free" above\n' 1>&2; \
+ exit 1; } \
+ || :
+
+sc_cast_of_argument_to_free:
+ @prohibit='\<free *\( *\(' halt="don't cast free argument" \
+ $(_sc_search_regexp)
+
+sc_cast_of_x_alloc_return_value:
+ @prohibit='\*\) *x(m|c|re)alloc\>' \
+ halt="don't cast x*alloc return value" \
+ $(_sc_search_regexp)
+
+sc_cast_of_alloca_return_value:
+ @prohibit='\*\) *alloca\>' \
+ halt="don't cast alloca return value" \
+ $(_sc_search_regexp)
+
+sc_space_tab:
+ @prohibit='[ ] ' \
+ halt='found SPACE-TAB sequence; remove the SPACE' \
+ $(_sc_search_regexp)
+
+# Don't use *scanf or the old ato* functions in "real" code.
+# They provide no error checking mechanism.
+# Instead, use strto* functions.
+sc_prohibit_atoi_atof:
+ @prohibit='\<([fs]?scanf|ato([filq]|ll)) *\(' \
+ halt='do not use *scan''f, ato''f, ato''i, ato''l, ato''ll or ato''q' \
+ $(_sc_search_regexp)
+
+# Use STREQ rather than comparing strcmp == 0, or != 0.
+sp_ = strcmp *\(.+\)
+sc_prohibit_strcmp:
+ @prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)' \
+ exclude='# *define STRN?EQ\(' \
+ halt='replace strcmp calls above with STREQ/STRNEQ' \
+ $(_sc_search_regexp)
+
+# Really. You don't want to use this function.
+# It may fail to NUL-terminate the destination,
+# and always NUL-pads out to the specified length.
+sc_prohibit_strncpy:
+ @prohibit='\<strncpy *\(' \
+ halt='do not use strncpy, period' \
+ $(_sc_search_regexp)
+
+# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
+# Convert all uses automatically, via these two commands:
+# git grep -l '\<exit *(1)' \
+# | grep -vEf .x-sc_prohibit_magic_number_exit \
+# | xargs --no-run-if-empty \
+# perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
+# git grep -l '\<exit *(0)' \
+# | grep -vEf .x-sc_prohibit_magic_number_exit \
+# | xargs --no-run-if-empty \
+# perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
+sc_prohibit_magic_number_exit:
+ @prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]' \
+ exclude='exit \(77\)|error ?\(((0|77),|[^,]*)' \
+ halt='use EXIT_* values rather than magic number' \
+ $(_sc_search_regexp)
+
+# Check that we don't use $< in non-implicit Makefile rules.
+#
+# To find the Makefiles, trace AC_CONFIG_FILES. Using VC_LIST would
+# miss the Makefiles that are not under VC control (e.g., symlinks
+# installed for gettext). "Parsing" (recursive) uses of SUBDIRS seems
+# too delicate.
+#
+# Use GNU Make's --print-data-base to normalize the rules into some
+# easy to parse format: they are separated by two \n. Look for the
+# "section" about non-pattern rules (marked with "# Files") inside
+# which there are still the POSIX Make like implicit rules (".c.o").
+sc_prohibit_gnu_make_extensions_awk_ = \
+ BEGIN { \
+ RS = "\n\n"; \
+ in_rules = 0; \
+ } \
+ /^\# Files/ { \
+ in_rules = 1; \
+ } \
+ /\$$</ && in_rules && $$0 !~ /^(.*\n)*\.\w+(\.\w+)?:/ { \
+ print "Error: " file ": $$< in a non implicit rule\n" $$0; \
+ status = 1; \
+ } \
+ END { \
+ exit status; \
+ }
+sc_prohibit_gnu_make_extensions:
+ @if $(AWK) --version | grep GNU >/dev/null 2>&1; then \
+ (cd $(srcdir) && autoconf --trace AC_CONFIG_FILES:'$$1') | \
+ tr ' ' '\n' | \
+ $(SED) -ne '/Makefile/{s/\.in$$//;p;}' | \
+ while read m; do \
+ $(MAKE) -qp -f $$m .DUMMY-TARGET 2>/dev/null | \
+ $(AWK) -v file=$$m -e '$($@_awk_)' || exit 1; \
+ done; \
+ fi
+
+# Using EXIT_SUCCESS as the first argument to error is misleading,
+# since when that parameter is 0, error does not exit. Use '0' instead.
+sc_error_exit_success:
+ @prohibit='error *\(EXIT_SUCCESS,' \
+ in_vc_files='\.[chly]$$' \
+ halt='found error (EXIT_SUCCESS' \
+ $(_sc_search_regexp)
+
+# "FATAL:" should be fully upper-cased in error messages
+# "WARNING:" should be fully upper-cased, or fully lower-cased
+sc_error_message_warn_fatal:
+ @$(VC_LIST_EXCEPT) \
+ | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
+ | $(GREP) -E '"Warning|"Fatal|"fatal' \
+ && { echo '$(ME): use FATAL, WARNING or warning' 1>&2; \
+ exit 1; } \
+ || :
+
+# Error messages should not start with a capital letter
+sc_error_message_uppercase:
+ @$(VC_LIST_EXCEPT) \
+ | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
+ | $(GREP) -E '"[A-Z]' \
+ | $(GREP) -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' \
+ && { echo '$(ME): found capitalized error message' 1>&2; \
+ exit 1; } \
+ || :
+
+# Error messages should not end with a period
+sc_error_message_period:
+ @$(VC_LIST_EXCEPT) \
+ | xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
+ | $(GREP) -E '[^."]\."' \
+ && { echo '$(ME): found error message ending in period' 1>&2; \
+ exit 1; } \
+ || :
+
+sc_file_system:
+ @prohibit=file''system \
+ exclude='/proc/filesystems' \
+ ignore_case=1 \
+ halt='found use of "file''system"; spell it "file system"' \
+ $(_sc_search_regexp)
+
+# Don't use cpp tests of this symbol. All code assumes config.h is included.
+sc_prohibit_have_config_h:
+ @prohibit='^# *if.*HAVE''_CONFIG_H' \
+ halt='found use of HAVE''_CONFIG_H; remove' \
+ $(_sc_search_regexp)
+
+# Nearly all .c files must include <config.h>. However, we also permit this
+# via inclusion of a package-specific header, if cfg.mk specified one.
+# config_h_header must be suitable for grep -E.
+config_h_header ?= <config\.h>
+sc_require_config_h:
+ @require='^# *include $(config_h_header)' \
+ in_vc_files='\.c$$' \
+ halt='the above files do not include <config.h>' \
+ $(_sc_search_regexp)
+
+# Print each file name for which the first #include does not match
+# $(config_h_header). Like grep -m 1, this only looks at the first match.
+perl_config_h_first_ = \
+ -e 'BEGIN {$$ret = 0}' \
+ -e 'if (/^\# *include\b/) {' \
+ -e ' if (not m{^\# *include $(config_h_header)}) {' \
+ -e ' print "$$ARGV\n";' \
+ -e ' $$ret = 1;' \
+ -e ' }' \
+ -e ' \# Move on to next file after first include' \
+ -e ' close ARGV;' \
+ -e '}' \
+ -e 'END {exit $$ret}'
+
+# You must include <config.h> before including any other header file.
+# This can possibly be via a package-specific header, if given by cfg.mk.
+sc_require_config_h_first:
+ @if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
+ files=$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$') && \
+ perl -n $(perl_config_h_first_) $$files || \
+ { echo '$(ME): the above files include some other header' \
+ 'before <config.h>' 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+
+sc_prohibit_HAVE_MBRTOWC:
+ @prohibit='\bHAVE_MBRTOWC\b' \
+ halt="do not use $$prohibit; it is always defined" \
+ $(_sc_search_regexp)
+
+# To use this "command" macro, you must first define two shell variables:
+# h: the header name, with no enclosing <> or ""
+# re: a regular expression that matches IFF something provided by $h is used.
+define _sc_header_without_use
+ dummy=; : so we do not need a semicolon before each use; \
+ h_esc=`echo '[<"]'"$$h"'[">]'|$(SED) 's/\./\\\\./g'`; \
+ if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
+ files=$$($(GREP) -l '^# *include '"$$h_esc" \
+ $$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$')) && \
+ $(GREP) -LE "$$re" $$files | $(GREP) . && \
+ { echo "$(ME): the above files include $$h but don't use it" \
+ 1>&2; exit 1; } || :; \
+ else :; \
+ fi
+endef
+
+# Prohibit the inclusion of assert.h without an actual use of assert.
+sc_prohibit_assert_without_use:
+ @h='assert.h' re='\<assert *\(' $(_sc_header_without_use)
+
+# Prohibit the inclusion of close-stream.h without an actual use.
+sc_prohibit_close_stream_without_use:
+ @h='close-stream.h' re='\<close_stream *\(' $(_sc_header_without_use)
+
+# Prohibit the inclusion of getopt.h without an actual use.
+sc_prohibit_getopt_without_use:
+ @h='getopt.h' re='\<getopt(_long)? *\(' $(_sc_header_without_use)
+
+# Don't include quotearg.h unless you use one of its functions.
+sc_prohibit_quotearg_without_use:
+ @h='quotearg.h' re='\<quotearg(_[^ ]+)? *\(' $(_sc_header_without_use)
+
+# Don't include quote.h unless you use one of its functions.
+sc_prohibit_quote_without_use:
+ @h='quote.h' re='\<quote((_n)? *\(|_quoting_options\>)' \
+ $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_long_options_without_use:
+ @h='long-options.h' re='\<parse_(long_options|gnu_standard_options_only) *\(' \
+ $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_inttostr_without_use:
+ @h='inttostr.h' re='\<(off|[iu]max|uint)tostr *\(' \
+ $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_ignore_value_without_use:
+ @h='ignore-value.h' re='\<ignore_(value|ptr) *\(' \
+ $(_sc_header_without_use)
+
+# Don't include this header unless you use one of its functions.
+sc_prohibit_error_without_use:
+ @h='error.h' \
+ re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
+ $(_sc_header_without_use)
+
+# Don't include xalloc.h unless you use one of its functions.
+# Consider these symbols:
+# perl -lne '/^# *define (\w+)\(/ and print $1' lib/xalloc.h|grep -v '^__';
+# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/xalloc.h
+# Divide into two sets on case, and filter each through this:
+# | sort | perl -MRegexp::Assemble -le \
+# 'print Regexp::Assemble->new(file => "/dev/stdin")->as_string'|sed 's/\?://g'
+# Note this was produced by the above:
+# _xa1 = \
+#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup)
+# But we can do better, in at least two ways:
+# 1) take advantage of two "dup"-suffixed strings:
+# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup)
+# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable
+# "char|[cmz]"
+# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
+_xa2 = X([CZ]|N?M)ALLOC
+sc_prohibit_xalloc_without_use:
+ @h='xalloc.h' \
+ re='\<($(_xa1)|$(_xa2)) *\('\
+ $(_sc_header_without_use)
+
+# Extract function names:
+# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/hash.h
+_hash_re = \
+clear|delete|free|get_(first|next)|insert|lookup|print_statistics|reset_tuning
+_hash_fn = \<($(_hash_re)) *\(
+_hash_struct = (struct )?\<[Hh]ash_(table|tuning)\>
+sc_prohibit_hash_without_use:
+ @h='hash.h' \
+ re='$(_hash_fn)|$(_hash_struct)'\
+ $(_sc_header_without_use)
+
+sc_prohibit_cloexec_without_use:
+ @h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \
+ $(_sc_header_without_use)
+
+sc_prohibit_posixver_without_use:
+ @h='posixver.h' re='\<posix2_version *\(' $(_sc_header_without_use)
+
+sc_prohibit_same_without_use:
+ @h='same.h' re='\<same_name(at)? *\(' $(_sc_header_without_use)
+
+sc_prohibit_hash_pjw_without_use:
+ @h='hash-pjw.h' \
+ re='\<hash_pjw\>' \
+ $(_sc_header_without_use)
+
+sc_prohibit_safe_read_without_use:
+ @h='safe-read.h' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
+ $(_sc_header_without_use)
+
+sc_prohibit_argmatch_without_use:
+ @h='argmatch.h' \
+ re='(\<(ARGMATCH_DEFINE_GROUP|ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<(invalid_arg|argmatch(_exit_fn|_(in)?valid)?) *\()' \
+ $(_sc_header_without_use)
+
+sc_prohibit_canonicalize_without_use:
+ @h='canonicalize.h' \
+ re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode|file_name)' \
+ $(_sc_header_without_use)
+
+sc_prohibit_root_dev_ino_without_use:
+ @h='root-dev-ino.h' \
+ re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
+ $(_sc_header_without_use)
+
+sc_prohibit_openat_without_use:
+ @h='openat.h' \
+ re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat|(FCHMOD|FCHOWN|STAT)AT_INLINE)\>' \
+ $(_sc_header_without_use)
+
+# Prohibit the inclusion of c-ctype.h without an actual use.
+ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
+|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
+sc_prohibit_c_ctype_without_use:
+ @h='c-ctype.h' re='\<c_($(ctype_re)) *\(' \
+ $(_sc_header_without_use)
+
+# The following list was generated by running:
+# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
+# | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
+_sig_functions = \
+ bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
+ sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
+ siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
+ sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
+_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
+# The following were extracted from "man signal.h" manually.
+_sig_types_and_consts = \
+ MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK \
+ SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL \
+ SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE \
+ SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t \
+ sigstack sigval stack_t ucontext_t
+# generated via this:
+# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
+_sig_names = \
+ SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT \
+ SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL \
+ SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP \
+ SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR \
+ SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS \
+ SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1 \
+ SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW \
+ SIGXCPU SIGXFSZ
+_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
+
+# Prohibit the inclusion of signal.h without an actual use.
+sc_prohibit_signal_without_use:
+ @h='signal.h' \
+ re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>' \
+ $(_sc_header_without_use)
+
+# Don't include stdio--.h unless you use one of its functions.
+sc_prohibit_stdio--_without_use:
+ @h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *\(' \
+ $(_sc_header_without_use)
+
+# Don't include stdio-safer.h unless you use one of its functions.
+sc_prohibit_stdio-safer_without_use:
+ @h='stdio-safer.h' re='\<((f(re)?|p)open|tmpfile)_safer *\(' \
+ $(_sc_header_without_use)
+
+# Prohibit the inclusion of strings.h without a sensible use.
+# Using the likes of bcmp, bcopy, bzero, index or rindex is not sensible.
+sc_prohibit_strings_without_use:
+ @h='strings.h' \
+ re='\<(strn?casecmp|ffs(ll)?)\>' \
+ $(_sc_header_without_use)
+
+# Extract the raw list of symbol names with this:
+gl_extract_define_simple = \
+ /^\# *define ([A-Z]\w+)\(/ and print $$1
+# Filter out duplicates and convert to a space-separated list:
+_intprops_names = \
+ $(shell f=$(gnulib_dir)/lib/intprops.h; \
+ perl -lne '$(gl_extract_define_simple)' $$f | sort -u | tr '\n' ' ')
+# Remove trailing space and convert to a regular expression:
+_intprops_syms_re = $(subst $(_sp),|,$(strip $(_intprops_names)))
+# Prohibit the inclusion of intprops.h without an actual use.
+sc_prohibit_intprops_without_use:
+ @h='intprops.h' \
+ re='\<($(_intprops_syms_re)) *\(' \
+ $(_sc_header_without_use)
+
+_stddef_syms_re = NULL|offsetof|ptrdiff_t|size_t|wchar_t
+# Prohibit the inclusion of stddef.h without an actual use.
+sc_prohibit_stddef_without_use:
+ @h='stddef.h' \
+ re='\<($(_stddef_syms_re))\>' \
+ $(_sc_header_without_use)
+
+_de1 = dirfd|(close|(fd)?open|read|rewind|seek|tell)dir(64)?(_r)?
+_de2 = (versionsort|struct dirent|getdirentries|alphasort|scandir(at)?)(64)?
+_de3 = MAXNAMLEN|DIR|ino_t|d_ino|d_fileno|d_namlen
+_dirent_syms_re = $(_de1)|$(_de2)|$(_de3)
+# Prohibit the inclusion of dirent.h without an actual use.
+sc_prohibit_dirent_without_use:
+ @h='dirent.h' \
+ re='\<($(_dirent_syms_re))\>' \
+ $(_sc_header_without_use)
+
+# Prohibit the inclusion of verify.h without an actual use.
+sc_prohibit_verify_without_use:
+ @h='verify.h' \
+ re='\<(verify(true|expr)?|assume|static_assert) *\(' \
+ $(_sc_header_without_use)
+
+# Don't include xfreopen.h unless you use one of its functions.
+sc_prohibit_xfreopen_without_use:
+ @h='xfreopen.h' re='\<xfreopen *\(' $(_sc_header_without_use)
+
+sc_obsolete_symbols:
+ @prohibit='\<(HAVE''_FCNTL_H|O''_NDELAY)\>' \
+ halt='do not use HAVE''_FCNTL_H or O'_NDELAY \
+ $(_sc_search_regexp)
+
+# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ
+
+# Each nonempty ChangeLog line must start with a year number, or a TAB.
+sc_changelog:
+ @prohibit='^[^12 ]' \
+ in_vc_files='^ChangeLog$$' \
+ halt='found unexpected prefix in a ChangeLog' \
+ $(_sc_search_regexp)
+
+# Ensure that each .c file containing a "main" function also
+# calls bindtextdomain.
+sc_bindtextdomain:
+ @require='bindtextdomain *\(' \
+ in_vc_files='\.c$$' \
+ containing='\<main *(' \
+ halt='the above files do not call bindtextdomain' \
+ $(_sc_search_regexp)
+
+# Require that the final line of each test-lib.sh-using test be this one:
+# Exit $fail
+# Note: this test requires GNU grep's --label= option.
+Exit_witness_file ?= tests/test-lib.sh
+Exit_base := $(notdir $(Exit_witness_file))
+sc_require_test_exit_idiom:
+ @if test -f $(srcdir)/$(Exit_witness_file); then \
+ die=0; \
+ for i in $$($(GREP) -l -F 'srcdir/$(Exit_base)' \
+ $$($(VC_LIST) tests)); do \
+ tail -n1 $$i | $(GREP) '^Exit .' > /dev/null \
+ && : || { die=1; echo $$i; } \
+ done; \
+ test $$die = 1 && \
+ { echo 1>&2 '$(ME): the final line in each of the above is not:'; \
+ echo 1>&2 'Exit something'; \
+ exit 1; } || :; \
+ fi
+
+sc_trailing_blank:
+ @prohibit='[ ]$$' \
+ halt='found trailing blank(s)' \
+ exclude='^Binary file .* matches$$' \
+ $(_sc_search_regexp)
+
+# Match lines like the following, but where there is only one space
+# between the options and the description:
+# -D, --all-repeated[=delimit-method] print all duplicate lines\n
+longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)?
+sc_two_space_separator_in_usage:
+ @prohibit='^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \
+ halt='help2man requires at least two spaces between an option and its description'\
+ $(_sc_search_regexp)
+
+# A regexp matching function names like "error" that may be used
+# to emit translatable messages.
+_gl_translatable_diag_func_re ?= error
+
+# Look for diagnostics that aren't marked for translation.
+# This won't find any for which error's format string is on a separate line.
+sc_unmarked_diagnostics:
+ @prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
+ exclude='(_|ngettext ?)\(' \
+ halt='found unmarked diagnostic(s)' \
+ $(_sc_search_regexp)
+
+# Avoid useless parentheses like those in this example:
+# #if defined (SYMBOL) || defined (SYM2)
+sc_useless_cpp_parens:
+ @prohibit='^# *if .*defined *\(' \
+ halt='found useless parentheses in cpp directive' \
+ $(_sc_search_regexp)
+
+# List headers for which HAVE_HEADER_H is always true, assuming you are
+# using the appropriate gnulib module. CAUTION: for each "unnecessary"
+# #if HAVE_HEADER_H that you remove, be sure that your project explicitly
+# requires the gnulib module that guarantees the usability of that header.
+gl_assured_headers_ = \
+ cd $(gnulib_dir)/lib && echo *.in.h|$(SED) 's/\.in\.h//g'
+
+# Convert the list of names to upper case, and replace each space with "|".
+az_ = abcdefghijklmnopqrstuvwxyz
+AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ
+gl_header_upper_case_or_ = \
+ $$($(gl_assured_headers_) \
+ | tr $(az_)/.- $(AZ_)___ \
+ | tr -s ' ' '|' \
+ )
+sc_prohibit_always_true_header_tests:
+ @or=$(gl_header_upper_case_or_); \
+ re="HAVE_($$or)_H"; \
+ prohibit='\<'"$$re"'\>' \
+ halt=$$(printf '%s\n' \
+ 'do not test the above HAVE_<header>_H symbol(s);' \
+ ' with the corresponding gnulib module, they are always true') \
+ $(_sc_search_regexp)
+
+sc_prohibit_defined_have_decl_tests:
+ @prohibit='(#[ ]*ifn?def|\<defined)\>[ (]+HAVE_DECL_' \
+ halt='HAVE_DECL macros are always defined' \
+ $(_sc_search_regexp)
+
+# ==================================================================
+gl_other_headers_ ?= \
+ intprops.h \
+ openat.h \
+ stat-macros.h
+
+# Perl -lne code to extract "significant" cpp-defined symbols from a
+# gnulib header file, eliminating a few common false-positives.
+# The exempted names below are defined only conditionally in gnulib,
+# and hence sometimes must/may be defined in application code.
+gl_extract_significant_defines_ = \
+ /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\
+ && $$2 !~ /(?:rpl_|_used_without_)/\
+ && $$1 !~ /^(?:NSIG|ENODATA)$$/\
+ && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\
+ and print $$1
+
+# Create a list of regular expressions matching the names
+# of macros that are guaranteed to be defined by parts of gnulib.
+define def_sym_regex
+ gen_h=$(gl_generated_headers_); \
+ (cd $(gnulib_dir)/lib; \
+ for f in *.in.h $(gl_other_headers_); do \
+ test -f $$f \
+ && perl -lne '$(gl_extract_significant_defines_)' $$f; \
+ done; \
+ ) | sort -u \
+ | $(SED) 's/^/^ *# *(define|undef) */;s/$$/\\>/'
+endef
+
+# Don't define macros that we already get from gnulib header files.
+sc_prohibit_always-defined_macros:
+ @if test -d $(gnulib_dir); then \
+ case $$(echo all: | $(GREP) -l -f - Makefile) in Makefile);; *) \
+ echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \
+ esac; \
+ regex=$$($(def_sym_regex)); export regex; \
+ $(VC_LIST_EXCEPT) \
+ | xargs sh -c 'echo $$regex | $(GREP) -E -f - "$$@"' \
+ dummy /dev/null \
+ && { printf '$(ME): define the above' \
+ ' via some gnulib .h file\n' 1>&2; \
+ exit 1; } \
+ || :; \
+ fi
+# ==================================================================
+
+# Prohibit checked in backup files.
+sc_prohibit_backup_files:
+ @$(VC_LIST) | $(GREP) '~$$' && \
+ { echo '$(ME): found version controlled backup file' 1>&2; \
+ exit 1; } || :
+
+# Require the latest GPL.
+sc_GPL_version:
+ @prohibit='either ''version [^3]' \
+ halt='GPL vN, N!=3' \
+ $(_sc_search_regexp)
+
+# Require the latest GFDL. Two regexp, since some .texi files end up
+# line wrapping between 'Free Documentation License,' and 'Version'.
+_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any)
+sc_GFDL_version:
+ @prohibit='$(_GFDL_regexp)' \
+ halt='GFDL vN, N!=3' \
+ $(_sc_search_regexp)
+
+# Don't use Texinfo's @acronym{}.
+# https://lists.gnu.org/r/bug-gnulib/2010-03/msg00321.html
+texinfo_suffix_re_ ?= \.(txi|texi(nfo)?)$$
+sc_texinfo_acronym:
+ @prohibit='@acronym\{' \
+ in_vc_files='$(texinfo_suffix_re_)' \
+ halt='found use of Texinfo @acronym{}' \
+ $(_sc_search_regexp)
+
+cvs_keywords = \
+ Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State
+
+sc_prohibit_cvs_keyword:
+ @prohibit='\$$($(cvs_keywords))\$$' \
+ halt='do not use CVS keyword expansion' \
+ $(_sc_search_regexp)
+
+# This Perl code is slightly obfuscated. Not only is each "$" doubled
+# because it's in a Makefile, but the $$c's are comments; we cannot
+# use "#" due to the way the script ends up concatenated onto one line.
+# It would be much more concise, and would produce better output (including
+# counts) if written as:
+# perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
+# but that would be far less efficient, reading the entire contents
+# of each file, rather than just the last two bytes of each.
+# In addition, while the code below detects both blank lines and a missing
+# newline at EOF, the above detects only the former.
+#
+# This is a perl script that is expected to be the single-quoted argument
+# to a command-line "-le". The remaining arguments are file names.
+# Print the name of each file that does not end in exactly one newline byte.
+# I.e., warn if there are blank lines (2 or more newlines), or if the
+# last byte is not a newline. However, currently we don't complain
+# about any file that contains exactly one byte.
+# Exit nonzero if at least one such file is found, otherwise, exit 0.
+# Warn about, but otherwise ignore open failure. Ignore seek/read failure.
+#
+# Use this if you want to remove trailing empty lines from selected files:
+# perl -pi -0777 -e 's/\n\n+$/\n/' files...
+#
+require_exactly_one_NL_at_EOF_ = \
+ foreach my $$f (@ARGV) \
+ { \
+ open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \
+ my $$p = sysseek (F, -2, 2); \
+ my $$c = "seek failure probably means file has < 2 bytes; ignore"; \
+ my $$last_two_bytes; \
+ defined $$p and $$p = sysread F, $$last_two_bytes, 2; \
+ close F; \
+ $$c = "ignore read failure"; \
+ $$p && ($$last_two_bytes eq "\n\n" \
+ || substr ($$last_two_bytes,1) ne "\n") \
+ and (print $$f), $$fail=1; \
+ } \
+ END { exit defined $$fail }
+sc_prohibit_empty_lines_at_EOF:
+ @$(VC_LIST_EXCEPT) \
+ | xargs perl -le '$(require_exactly_one_NL_at_EOF_)' \
+ || { echo '$(ME): empty line(s) or no newline at EOF' 1>&2; \
+ exit 1; } \
+ || :
+
+# Make sure we don't use st_blocks. Use ST_NBLOCKS instead.
+# This is a bit of a kludge, since it prevents use of the string
+# even in comments, but for now it does the job with no false positives.
+sc_prohibit_stat_st_blocks:
+ @prohibit='[.>]st_blocks' \
+ halt='do not use st_blocks; use ST_NBLOCKS' \
+ $(_sc_search_regexp)
+
+# Make sure we don't define any S_IS* macros in src/*.c files.
+# They're already defined via gnulib's sys/stat.h replacement.
+sc_prohibit_S_IS_definition:
+ @prohibit='^ *# *define *S_IS' \
+ halt='do not define S_IS* macros; include <sys/stat.h>' \
+ $(_sc_search_regexp)
+
+# Perl block to convert a match to FILE_NAME:LINENO:TEST,
+# that is shared by two definitions below.
+perl_filename_lineno_text_ = \
+ -e ' {' \
+ -e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \
+ -e ' ($$v = $$&) =~ s/\n/\\n/g;' \
+ -e ' print "$$ARGV:$$n:$$v\n";' \
+ -e ' }'
+
+prohibit_doubled_words_ = \
+ the then in an on if is it but for or at and do to
+# expand the regex before running the check to avoid using expensive captures
+prohibit_doubled_word_expanded_ = \
+ $(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
+prohibit_doubled_word_RE_ ?= \
+ /\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
+prohibit_doubled_word_ = \
+ -e 'while ($(prohibit_doubled_word_RE_))' \
+ $(perl_filename_lineno_text_)
+
+# Define this to a regular expression that matches
+# any filename:dd:match lines you want to ignore.
+# The default is to ignore no matches.
+ignore_doubled_word_match_RE_ ?= ^$$
+
+sc_prohibit_doubled_word:
+ @$(VC_LIST_EXCEPT) \
+ | xargs perl -n -0777 $(prohibit_doubled_word_) \
+ | $(GREP) -vE '$(ignore_doubled_word_match_RE_)' \
+ | $(GREP) . \
+ && { echo '$(ME): doubled words' 1>&2; exit 1; } \
+ || :
+
+# A regular expression matching undesirable combinations of words like
+# "can not"; this matches them even when the two words appear on different
+# lines, but not when there is an intervening delimiter like "#" or "*".
+# Similarly undesirable, "See @xref{...}", since an @xref should start
+# a sentence. Explicitly prohibit any prefix of "see" or "also".
+# Also prohibit a prefix matching "\w+ +".
+# @pxref gets the same see/also treatment and should be parenthesized;
+# presume it must *not* start a sentence.
+# POSIX spells it "timestamp" rather than "time\s+stamp", so we do, too.
+bad_xref_re_ ?= (?:[\w,:;] +|(?:see|also)\s+)\@xref\{
+bad_pxref_re_ ?= (?:[.!?]|(?:see|also))\s+\@pxref\{
+prohibit_undesirable_word_seq_RE_ ?= \
+ /(?:\bcan\s+not\b|\btime\s+stamps?\b|$(bad_xref_re_)|$(bad_pxref_re_))/gims
+prohibit_undesirable_word_seq_ = \
+ -e 'while ($(prohibit_undesirable_word_seq_RE_))' \
+ $(perl_filename_lineno_text_)
+# Define this to a regular expression that matches
+# any filename:dd:match lines you want to ignore.
+# The default is to ignore no matches.
+ignore_undesirable_word_sequence_RE_ ?= ^$$
+
+sc_prohibit_undesirable_word_seq:
+ @$(VC_LIST_EXCEPT) \
+ | xargs perl -n -0777 $(prohibit_undesirable_word_seq_) \
+ | $(GREP) -vE '$(ignore_undesirable_word_sequence_RE_)' \
+ | $(GREP) . \
+ && { echo '$(ME): undesirable word sequence' >&2; exit 1; } \
+ || :
+
+# Except for shell files and for loops, double semicolon is probably a mistake
+sc_prohibit_double_semicolon:
+ @prohibit='; *;[ {} \]*(/[/*]|$$)' \
+ in_vc_files='\.[chly]$$' \
+ exclude='\bfor *\(.*\)' \
+ halt="Double semicolon detected" \
+ $(_sc_search_regexp)
+
+_ptm1 = use "test C1 && test C2", not "test C1 -''a C2"
+_ptm2 = use "test C1 || test C2", not "test C1 -''o C2"
+# Using test's -a and -o operators is not portable.
+# We prefer test over [, since the latter is spelled [[ in configure.ac.
+sc_prohibit_test_minus_ao:
+ @prohibit='(\<test| \[+) .+ -[ao] ' \
+ halt='$(_ptm1); $(_ptm2)' \
+ $(_sc_search_regexp)
+
+# Avoid a test bashism.
+sc_prohibit_test_double_equal:
+ @prohibit='(\<test| \[+) .+ == ' \
+ containing='#! */bin/[a-z]*sh' \
+ halt='use "test x = x", not "test x =''= x"' \
+ $(_sc_search_regexp)
+
+# Each program that uses proper_name_utf8 must link with one of the
+# ICONV libraries. Otherwise, some ICONV library must appear in LDADD.
+# The perl -0777 invocation below extracts the possibly-multi-line
+# definition of LDADD from the appropriate Makefile.am and exits 0
+# when it contains "ICONV".
+sc_proper_name_utf8_requires_ICONV:
+ @progs=$$($(VC_LIST_EXCEPT) \
+ | xargs $(GREP) -l 'proper_name_utf8 ''("'); \
+ if test "x$$progs" != x; then \
+ fail=0; \
+ for p in $$progs; do \
+ dir=$$(dirname "$$p"); \
+ perl -0777 \
+ -ne 'exit !(/^LDADD =(.+?[^\\]\n)/ms && $$1 =~ /ICONV/)' \
+ $$dir/Makefile.am && continue; \
+ base=$$(basename "$$p" .c); \
+ $(GREP) "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null \
+ || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
+ done; \
+ test $$fail = 1 && \
+ { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
+ exit 1; } || :; \
+ fi
+
+# Warn about "c0nst struct Foo const foo[]",
+# but not about "char const *const foo" or "#define const const".
+sc_redundant_const:
+ @prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \
+ halt='redundant "const" in declarations' \
+ $(_sc_search_regexp)
+
+sc_const_long_option:
+ @prohibit='^ *static.*struct option ' \
+ exclude='const struct option|struct option const' \
+ halt='add "const" to the above declarations' \
+ $(_sc_search_regexp)
+
+NEWS_hash = \
+ $$($(SED) -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
+ $(srcdir)/NEWS \
+ | perl -0777 -pe \
+ 's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \
+ | md5sum - \
+ | $(SED) 's/ .*//')
+
+# Ensure that we don't accidentally insert an entry into an old NEWS block.
+sc_immutable_NEWS:
+ @if test -f $(srcdir)/NEWS; then \
+ test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \
+ { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \
+ fi
+
+# Update the hash stored above. Do this after each release and
+# for any corrections to old entries.
+update-NEWS-hash: NEWS
+ perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
+ $(srcdir)/cfg.mk
+
+# Ensure that we use only the standard $(VAR) notation,
+# not @...@ in Makefile.am, now that we can rely on automake
+# to emit a definition for each substituted variable.
+# However, there is still one case in which @VAR@ use is not just
+# legitimate, but actually required: when augmenting an automake-defined
+# variable with a prefix. For example, gettext uses this:
+# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
+# otherwise, makeinfo would put German or French (current locale)
+# navigation hints in the otherwise-English documentation.
+#
+# Allow the package to add exceptions via a hook in cfg.mk;
+# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by
+# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
+_makefile_at_at_check_exceptions ?=
+sc_makefile_at_at_check:
+ @perl -ne '/\@\w+\@/' \
+ -e ' && !/(\w+)\s+=.*\@\1\@$$/' \
+ -e ''$(_makefile_at_at_check_exceptions) \
+ -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \
+ $$($(VC_LIST_EXCEPT) | $(GREP) -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \
+ && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
+
+news-check: NEWS
+ $(AM_V_GEN)if $(SED) -n $(news-check-lines-spec)p $< \
+ | $(GREP) -E $(news-check-regexp) >/dev/null; then \
+ :; \
+ else \
+ echo 'NEWS: $$(news-check-regexp) failed to match' 1>&2; \
+ exit 1; \
+ fi
+
+sc_makefile_TAB_only_indentation:
+ @prohibit='^ [ ]{8}' \
+ in_vc_files='akefile|\.mk$$' \
+ halt='found TAB-8-space indentation' \
+ $(_sc_search_regexp)
+
+sc_m4_quote_check:
+ @prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \
+ in_vc_files='(^configure\.ac|\.m4)$$' \
+ halt='quote the first arg to AC_DEF*' \
+ $(_sc_search_regexp)
+
+fix_po_file_diag = \
+'you have changed the set of files with translatable diagnostics;\n\
+apply the above patch\n'
+
+# Generate a list of files in which to search for translatable strings.
+perl_translatable_files_list_ = \
+ -e 'foreach $$file (@ARGV) {' \
+ -e ' \# Consider only file extensions with one or two letters' \
+ -e ' $$file =~ /\...?$$/ or next;' \
+ -e ' \# Ignore m4 and mk files' \
+ -e ' $$file =~ /\.m[4k]$$/ and next;' \
+ -e ' \# Ignore a .c or .h file with a corresponding .l or .y file' \
+ -e ' $$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")' \
+ -e ' and next;' \
+ -e ' \# Skip unreadable files' \
+ -e ' -r $$file or next;' \
+ -e ' print "$$file ";' \
+ -e '}'
+
+# Verify that all source files using _() (more specifically, files that
+# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in.
+po_file ?= $(srcdir)/po/POTFILES.in
+generated_files ?= $(srcdir)/lib/*.[ch]
+_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
+sc_po_check:
+ @if test -f $(po_file); then \
+ $(GREP) -E -v '^(#|$$)' $(po_file) \
+ | $(GREP) -v '^src/false\.c$$' | sort > $@-1; \
+ { $(VC_LIST_EXCEPT); echo $(generated_files); } \
+ | xargs perl $(perl_translatable_files_list_) \
+ | xargs $(GREP) -E -l '$(_gl_translatable_string_re)' \
+ | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
+ | sort -u > $@-2; \
+ diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \
+ || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \
+ rm -f $@-1 $@-2; \
+ fi
+
+# Sometimes it is useful to change the PATH environment variable
+# in Makefiles. When doing so, it's better not to use the Unix-centric
+# path separator of ':', but rather the automake-provided '$(PATH_SEPARATOR)'.
+msg = 'Do not use ":" above; use $$(PATH_SEPARATOR) instead'
+sc_makefile_path_separator_check:
+ @prohibit='PATH[=].*:' \
+ in_vc_files='akefile|\.mk$$' \
+ halt=$(msg) \
+ $(_sc_search_regexp)
+
+# Check that 'make alpha' will not fail at the end of the process,
+# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release)
+# and is read-only.
+writable-files:
+ $(AM_V_GEN)if test -d $(release_archive_dir); then \
+ for file in $(DIST_ARCHIVES); do \
+ for p in ./ $(release_archive_dir)/; do \
+ test -e $$p$$file || continue; \
+ test -w $$p$$file \
+ || { echo ERROR: $$p$$file is not writable; fail=1; }; \
+ done; \
+ done; \
+ test "$$fail" && exit 1 || : ; \
+ else :; \
+ fi
+
+v_etc_file = $(gnulib_dir)/lib/version-etc.c
+sample-test = tests/sample-test
+texi = doc/$(PACKAGE).texi
+# Make sure that the copyright date in $(v_etc_file) is up to date.
+# Do the same for the $(sample-test) and the main doc/.texi file.
+sc_copyright_check:
+ @require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' \
+ in_files=$(v_etc_file) \
+ halt='out of date copyright in $(v_etc_file); update it' \
+ $(_sc_search_regexp)
+ @require='# Copyright \(C\) '$$(date +%Y)' Free' \
+ in_vc_files=$(sample-test) \
+ halt='out of date copyright in $(sample-test); update it' \
+ $(_sc_search_regexp)
+ @require='Copyright @copyright\{\} .*'$$(date +%Y) \
+ in_vc_files=$(texi) \
+ halt='out of date copyright in $(texi); update it' \
+ $(_sc_search_regexp)
+
+# If tests/help-version exists and seems to be new enough, assume that its
+# use of init.sh and path_prepend_ is correct, and ensure that every other
+# use of init.sh is identical.
+# This is useful because help-version cross-checks prog --version
+# with $(VERSION), which verifies that its path_prepend_ invocation
+# sets PATH correctly. This is an inexpensive way to ensure that
+# the other init.sh-using tests also get it right.
+_hv_file ?= $(srcdir)/tests/help-version
+_hv_regex_weak ?= ^ *\. .*/init\.sh"
+# Fix syntax-highlighters "
+_hv_regex_strong ?= ^ *\. "\$${srcdir=\.}/init\.sh"
+sc_cross_check_PATH_usage_in_tests:
+ @if test -f $(_hv_file); then \
+ $(GREP) -l 'VERSION mismatch' $(_hv_file) >/dev/null \
+ || { echo "$@: skipped: no such file: $(_hv_file)" 1>&2; \
+ exit 0; }; \
+ $(GREP) -lE '$(_hv_regex_strong)' $(_hv_file) >/dev/null \
+ || { echo "$@: $(_hv_file) lacks conforming use of init.sh" 1>&2; \
+ exit 1; }; \
+ good=$$($(GREP) -E '$(_hv_regex_strong)' $(_hv_file)); \
+ $(VC_LIST_EXCEPT) \
+ | xargs $(GREP) -lE '$(_hv_regex_weak)' \
+ | xargs $(GREP) -LFx "$$good" \
+ | $(GREP) . \
+ && { printf "$(ME): the above files use" \
+ " path_prepend_ inconsistently\n" 1>&2; \
+ exit 1; } \
+ || :; \
+ fi
+
+# BRE regex of file contents to identify a test script.
+_test_script_regex ?= \<init\.sh\>
+
+# In tests, use "compare expected actual", not the reverse.
+sc_prohibit_reversed_compare_failure:
+ @prohibit='\<compare [^ ]+ ([^ ]*exp|/dev/null)' \
+ containing='$(_test_script_regex)' \
+ halt='reversed compare arguments' \
+ $(_sc_search_regexp)
+
+# #if HAVE_... will evaluate to false for any non numeric string.
+# That would be flagged by using -Wundef, however gnulib currently
+# tests many undefined macros, and so we can't enable that option.
+# So at least preclude common boolean strings as macro values.
+sc_Wundef_boolean:
+ @prohibit='^#define.*(yes|no|true|false)$$' \
+ in_files='$(CONFIG_INCLUDE)' \
+ halt='Use 0 or 1 for macro values' \
+ $(_sc_search_regexp)
+
+# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might
+# not be constant, or might overflow a stack. In general, use PATH_MAX as
+# a limit, not an array or alloca size.
+sc_prohibit_path_max_allocation:
+ @prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX' \
+ halt='Avoid stack allocations of size PATH_MAX' \
+ $(_sc_search_regexp)
+
+sc_vulnerable_makefile_CVE-2009-4029:
+ @prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
+ in_files='(^|/)Makefile\.in$$' \
+ halt=$$(printf '%s\n' \
+ 'the above files are vulnerable; beware of running' \
+ ' "make dist*" rules, and upgrade to fixed automake' \
+ ' see https://bugzilla.redhat.com/show_bug.cgi?id=542609 for details') \
+ $(_sc_search_regexp)
+
+sc_vulnerable_makefile_CVE-2012-3386:
+ @prohibit='chmod a\+w \$$\(distdir\)' \
+ in_files='(^|/)Makefile\.in$$' \
+ halt=$$(printf '%s\n' \
+ 'the above files are vulnerable; beware of running' \
+ ' "make distcheck", and upgrade to fixed automake' \
+ ' see https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3386 for details') \
+ $(_sc_search_regexp)
+
+vc-diff-check:
+ $(AM_V_GEN)(unset CDPATH; cd $(srcdir) && $(VC) diff) > vc-diffs || :
+ $(AM_V_at)if test -s vc-diffs; then \
+ cat vc-diffs; \
+ echo "Some files are locally modified:" 1>&2; \
+ exit 1; \
+ else \
+ rm vc-diffs; \
+ fi
+
+rel-files = $(DIST_ARCHIVES)
+
+gnulib-version = $$(cd $(gnulib_dir) \
+ && { git describe || git rev-parse --short=10 HEAD; } )
+bootstrap-tools ?= autoconf,automake,gnulib
+
+gpgv = $$(gpgv2 --version >/dev/null && echo gpgv2 || echo gpgv)
+# If it's not already specified, derive the GPG key ID from
+# the signed tag we've just applied to mark this release.
+gpg_key_ID ?= \
+ $$(cd $(srcdir) \
+ && git cat-file tag v$(VERSION) \
+ | $(gpgv) --status-fd 1 --keyring /dev/null - - 2>/dev/null \
+ | $(AWK) '/^\[GNUPG:\] ERRSIG / {print $$3; exit}')
+
+translation_project_ ?= coordinator@translationproject.org
+
+# Make info-gnu the default only for a stable release.
+announcement_Cc_stable = $(translation_project_), $(PACKAGE_BUGREPORT)
+announcement_mail_headers_stable = \
+ To: info-gnu@gnu.org \
+ Cc: $(announcement_Cc_) \
+ Mail-Followup-To: $(PACKAGE_BUGREPORT)
+
+announcement_Cc_alpha = $(translation_project_)
+announcement_mail_headers_alpha = \
+ To: $(PACKAGE_BUGREPORT) \
+ Cc: $(announcement_Cc_)
+
+announcement_mail_Cc_beta = $(announcement_mail_Cc_alpha)
+announcement_mail_headers_beta = $(announcement_mail_headers_alpha)
+
+announcement_mail_Cc_ ?= $(announcement_mail_Cc_$(release-type))
+announcement_mail_headers_ ?= $(announcement_mail_headers_$(release-type))
+announcement: NEWS ChangeLog $(rel-files)
+# Not $(AM_V_GEN) since the output of this command serves as
+# announcement message: it would start with " GEN announcement".
+ $(AM_V_at)$(srcdir)/$(_build-aux)/announce-gen \
+ --mail-headers='$(announcement_mail_headers_)' \
+ --release-type=$(release-type) \
+ --package=$(PACKAGE) \
+ --prev=$(PREV_VERSION) \
+ --curr=$(VERSION) \
+ --gpg-key-id=$(gpg_key_ID) \
+ --srcdir=$(srcdir) \
+ --news=$(srcdir)/NEWS \
+ --bootstrap-tools=$(bootstrap-tools) \
+ $$(case ,$(bootstrap-tools), in (*,gnulib,*) \
+ echo --gnulib-version=$(gnulib-version);; esac) \
+ --no-print-checksums \
+ $(addprefix --url-dir=, $(url_dir_list))
+
+.PHONY: release-commit
+release-commit:
+ $(AM_V_GEN)cd $(srcdir) \
+ && $(_build-aux)/do-release-commit-and-tag \
+ -C $(abs_builddir) $(RELEASE)
+
+## ---------------- ##
+## Updating files. ##
+## ---------------- ##
+
+ftp-gnu = https://ftp.gnu.org/gnu
+www-gnu = https://www.gnu.org
+
+upload_dest_dir_ ?= $(PACKAGE)
+upload_command = \
+ $(srcdir)/$(_build-aux)/gnupload $(GNUPLOADFLAGS) \
+ --to $(gnu_rel_host):$(upload_dest_dir_) \
+ $(rel-files)
+emit_upload_commands:
+ @echo =====================================
+ @echo =====================================
+ @echo '$(upload_command)'
+ @echo '# send the ~/announce-$(my_distdir) e-mail'
+ @echo =====================================
+ @echo =====================================
+
+.PHONY: upload
+upload:
+ $(AM_V_GEN)$(upload_command)
+
+define emit-commit-log
+ printf '%s\n' 'maint: post-release administrivia' '' \
+ '* NEWS: Add header line for next release.' \
+ '* .prev-version: Record previous version.' \
+ '* cfg.mk (old_NEWS_hash): Auto-update.'
+endef
+
+.PHONY: no-submodule-changes
+no-submodule-changes:
+ $(AM_V_GEN)if test -d $(srcdir)/.git \
+ && git --version >/dev/null 2>&1; then \
+ diff=$$(cd $(srcdir) && git submodule -q foreach \
+ git diff-index --name-only HEAD) \
+ || exit 1; \
+ case $$diff in '') ;; \
+ *) echo '$(ME): submodule files are locally modified:'; \
+ echo "$$diff"; exit 1;; esac; \
+ else \
+ : ; \
+ fi
+
+submodule-checks ?= no-submodule-changes public-submodule-commit
+
+# Ensure that each sub-module commit we're using is public.
+# Without this, it is too easy to tag and release code that
+# cannot be built from a fresh clone.
+.PHONY: public-submodule-commit
+public-submodule-commit:
+ $(AM_V_GEN)if test -d $(srcdir)/.git \
+ && git --version >/dev/null 2>&1; then \
+ cd $(srcdir) && \
+ git submodule --quiet foreach \
+ 'test "$$(git rev-parse "$$sha1")" \
+ = "$$(git merge-base origin "$$sha1")"' \
+ || { echo '$(ME): found non-public submodule commit' >&2; \
+ exit 1; }; \
+ else \
+ : ; \
+ fi
+# This rule has a high enough utility/cost ratio that it should be a
+# dependent of "check" by default. However, some of us do occasionally
+# commit a temporary change that deliberately points to a non-public
+# submodule commit, and want to be able to use rules like "make check".
+# In that case, run e.g., "make check gl_public_submodule_commit="
+# to disable this test.
+gl_public_submodule_commit ?= public-submodule-commit
+check: $(gl_public_submodule_commit)
+
+.PHONY: alpha beta stable release
+ALL_RECURSIVE_TARGETS += alpha beta stable
+alpha beta stable: $(local-check) writable-files $(submodule-checks)
+ $(AM_V_GEN)test $@ = stable \
+ && { echo $(VERSION) | $(GREP) -E '^[0-9]+(\.[0-9]+)+$$' \
+ || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
+ || :
+ $(AM_V_at)$(MAKE) vc-diff-check
+ $(AM_V_at)$(MAKE) news-check
+ $(AM_V_at)$(MAKE) distcheck
+ $(AM_V_at)$(MAKE) dist
+ $(AM_V_at)$(MAKE) $(release-prep-hook) RELEASE_TYPE=$@
+ $(AM_V_at)$(MAKE) -s emit_upload_commands RELEASE_TYPE=$@
+
+release:
+ $(AM_V_GEN)$(MAKE) _version
+ $(AM_V_GEN)$(MAKE) $(release-type)
+
+# Override this in cfg.mk if you follow different procedures.
+release-prep-hook ?= release-prep
+
+gl_noteworthy_news_ = * Noteworthy changes in release ?.? (????-??-??) [?]
+.PHONY: release-prep
+release-prep:
+ $(AM_V_GEN)$(MAKE) --no-print-directory -s announcement \
+ > ~/announce-$(my_distdir)
+ $(AM_V_at)if test -d $(release_archive_dir); then \
+ ln $(rel-files) $(release_archive_dir); \
+ chmod a-w $(rel-files); \
+ fi
+ $(AM_V_at)echo $(VERSION) > $(prev_version_file)
+ $(AM_V_at)$(MAKE) update-NEWS-hash
+ $(AM_V_at)perl -pi \
+ -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' \
+ $(srcdir)/NEWS
+ $(AM_V_at)msg=$$($(emit-commit-log)) || exit 1; \
+ cd $(srcdir) && $(VC) commit -m "$$msg" -a
+
+# Override this with e.g., -s $(srcdir)/some_other_name.texi
+# if the default $(PACKAGE)-derived name doesn't apply.
+gendocs_options_ ?=
+
+.PHONY: web-manual
+web-manual:
+ $(AM_V_GEN)test -z "$(manual_title)" \
+ && { echo define manual_title in cfg.mk 1>&2; exit 1; } || :
+ $(AM_V_at)cd '$(srcdir)/doc'; \
+ $(SHELL) ../$(_build-aux)/gendocs.sh $(gendocs_options_) \
+ -o '$(abs_builddir)/doc/manual' \
+ --email $(PACKAGE_BUGREPORT) $(PACKAGE) \
+ "$(PACKAGE_NAME) - $(manual_title)"
+ $(AM_V_at)echo " *** Upload the doc/manual directory to web-cvs."
+
+.PHONY: web-manual-update
+web-manual-update:
+ $(AM_V_GEN)cd $(srcdir) \
+ && $(_build-aux)/gnu-web-doc-update -C $(abs_builddir)
+
+
+# Code Coverage
+
+init-coverage:
+ $(MAKE) $(AM_MAKEFLAGS) clean
+ lcov --directory . --zerocounters
+
+COVERAGE_CCOPTS ?= "-g --coverage"
+COVERAGE_OUT ?= doc/coverage
+
+build-coverage:
+ $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS)
+ $(MAKE) $(AM_MAKEFLAGS) CFLAGS=$(COVERAGE_CCOPTS) CXXFLAGS=$(COVERAGE_CCOPTS) check
+ mkdir -p $(COVERAGE_OUT)
+ lcov --directory . --output-file $(COVERAGE_OUT)/$(PACKAGE).info \
+ --capture
+
+gen-coverage:
+ genhtml --output-directory $(COVERAGE_OUT) \
+ $(COVERAGE_OUT)/$(PACKAGE).info \
+ --highlight --frames --legend \
+ --title "$(PACKAGE_NAME)"
+
+coverage:
+ $(MAKE) init-coverage
+ $(MAKE) build-coverage
+ $(MAKE) gen-coverage
+
+# Some projects carry local adjustments for gnulib modules via patches in
+# a gnulib patch directory whose default name is gl/ (defined in bootstrap
+# via local_gl_dir=gl). Those patches become stale as the originals evolve
+# in gnulib. Use this rule to refresh any stale patches. It applies each
+# patch to the original in $(gnulib_dir) and uses the temporary result to
+# generate a fuzz-free .diff file. If you customize the name of your local
+# gnulib patch directory via bootstrap.conf, this rule detects that name.
+# Run this from a non-VPATH (i.e., srcdir) build directory.
+.PHONY: refresh-gnulib-patches
+refresh-gnulib-patches:
+ gl=gl; \
+ if test -f bootstrap.conf; then \
+ t=$$(perl -lne '/^\s*local_gl_dir=(\S+)/ and $$d=$$1;' \
+ -e 'END{defined $$d and print $$d}' bootstrap.conf); \
+ test -n "$$t" && gl=$$t; \
+ fi; \
+ for diff in $$(cd $$gl; git ls-files | $(GREP) '\.diff$$'); do \
+ b=$$(printf %s "$$diff"|$(SED) 's/\.diff$$//'); \
+ VERSION_CONTROL=none \
+ patch "$(gnulib_dir)/$$b" "$$gl/$$diff" || exit 1; \
+ ( cd $(gnulib_dir) || exit 1; \
+ git diff "$$b" > "../$$gl/$$diff"; \
+ git checkout $$b ) || exit 1; \
+ done
+
+# Update gettext files.
+PACKAGE ?= $(shell basename $(PWD))
+PO_DOMAIN ?= $(PACKAGE)
+POURL = https://translationproject.org/latest/$(PO_DOMAIN)/
+PODIR ?= po
+refresh-po:
+ rm -f $(PODIR)/*.po && \
+ echo "$(ME): getting translations into po (please ignore the robots.txt ERROR 404)..." && \
+ wget --no-verbose --directory-prefix $(PODIR) --no-directories --recursive --level 1 --accept .po --accept .po.1 $(POURL) && \
+ echo 'en@boldquot' > $(PODIR)/LINGUAS && \
+ echo 'en@quot' >> $(PODIR)/LINGUAS && \
+ ls $(PODIR)/*.po | $(SED) 's/\.po//;s,$(PODIR)/,,' | \
+ sort >> $(PODIR)/LINGUAS
+
+ # Running indent once is not idempotent, but running it twice is.
+INDENT_SOURCES ?= $(C_SOURCES)
+.PHONY: indent
+indent:
+ indent $(INDENT_SOURCES)
+ indent $(INDENT_SOURCES)
+
+# If you want to set UPDATE_COPYRIGHT_* environment variables,
+# put the assignments in this variable.
+update-copyright-env ?=
+
+# Run this rule once per year (usually early in January)
+# to update all FSF copyright year lists in your project.
+# If you have an additional project-specific rule,
+# add it in cfg.mk along with a line 'update-copyright: prereq'.
+# By default, exclude all variants of COPYING; you can also
+# add exemptions (such as ChangeLog..* for rotated change logs)
+# in the file .x-update-copyright.
+.PHONY: update-copyright
+update-copyright:
+ $(AM_V_GEN)$(GREP) -l -w Copyright \
+ $$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \
+ | $(update-copyright-env) xargs $(srcdir)/$(_build-aux)/$@
+
+# This tight_scope test is skipped with a warning if $(_gl_TS_headers) is not
+# overridden and $(_gl_TS_dir)/Makefile.am does not mention noinst_HEADERS.
+
+# NOTE: to override any _gl_TS_* default value, you must
+# define the variable(s) using "export" in cfg.mk.
+_gl_TS_dir ?= src
+
+ALL_RECURSIVE_TARGETS += sc_tight_scope
+sc_tight_scope: tight-scope.mk
+ @fail=0; \
+ if ! $(GREP) '^ *export _gl_TS_headers *=' $(srcdir)/cfg.mk \
+ > /dev/null \
+ && ! $(GREP) -w noinst_HEADERS $(srcdir)/$(_gl_TS_dir)/Makefile.am \
+ > /dev/null 2>&1; then \
+ echo '$(ME): skipping $@'; \
+ else \
+ $(MAKE) -s -C $(_gl_TS_dir) \
+ -f Makefile \
+ -f $(abs_top_srcdir)/cfg.mk \
+ -f $(abs_top_builddir)/$< \
+ _gl_tight_scope \
+ || fail=1; \
+ fi; \
+ rm -f $<; \
+ exit $$fail
+
+tight-scope.mk: $(ME)
+ @rm -f $@ $@-t
+ @perl -ne '/^# TS-start/.../^# TS-end/ and print' $(srcdir)/$(ME) > $@-t
+ @chmod a=r $@-t && mv $@-t $@
+
+ifeq (a,b)
+# TS-start
+
+# Most functions should have static scope.
+# Any that don't must be marked with 'extern', but 'main'
+# and 'usage' are exceptions: they're always extern, but
+# do not need to be marked. Symbols matching '__.*' are
+# reserved by the compiler, so are automatically excluded below.
+_gl_TS_unmarked_extern_functions ?= main usage
+_gl_TS_function_match ?= /^(?:$(_gl_TS_extern)) +.*?(\w+) *\(/
+
+# If your project uses a macro like "XTERN", then put
+# the following in cfg.mk to override this default:
+# export _gl_TS_extern = extern|XTERN
+_gl_TS_extern ?= extern
+
+# The second nm|grep checks for file-scope variables with 'extern' scope.
+# Without gnulib's progname module, you might put program_name here.
+# Symbols matching '__.*' are reserved by the compiler,
+# so are automatically excluded below.
+_gl_TS_unmarked_extern_vars ?=
+
+# NOTE: the _match variables are perl expressions -- not mere regular
+# expressions -- so that you can extend them to match other patterns
+# and easily extract matched variable names.
+# For example, if your project declares some global variables via
+# a macro like this: GLOBAL(type, var_name, initializer), then you
+# can override this definition to automatically extract those names:
+# export _gl_TS_var_match = \
+# /^(?:$(_gl_TS_extern)) .*?\**(\w+)(\[.*?\])?;/ || /\bGLOBAL\(.*?,\s*(.*?),/
+_gl_TS_var_match ?= /^(?:$(_gl_TS_extern)) .*?(\w+)(\[.*?\])?;/
+
+# The names of object files in (or relative to) $(_gl_TS_dir).
+_gl_TS_obj_files ?= *.$(OBJEXT)
+
+# Files in which to search for the one-line style extern declarations.
+# $(_gl_TS_dir)-relative.
+_gl_TS_headers ?= $(noinst_HEADERS)
+_gl_TS_other_headers ?= *.h
+
+.PHONY: _gl_tight_scope
+_gl_tight_scope: $(bin_PROGRAMS)
+ sed_wrap='s/^/^_?/;s/$$/$$/'; \
+ t=exceptions-$$$$; \
+ trap 's=$$?; rm -f $$t; exit $$s' 0; \
+ for sig in 1 2 3 13 15; do \
+ eval "trap 'v=`expr $$sig + 128`; (exit $$v); exit $$v' $$sig"; \
+ done; \
+ src=`for f in $(SOURCES); do \
+ test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \
+ hdr=`for f in $(_gl_TS_headers); do \
+ test -f $$f && d= || d=$(srcdir)/; echo $$d$$f; done`; \
+ ( printf '%s\n' '__.*' $(_gl_TS_unmarked_extern_functions); \
+ $(GREP) -h -A1 '^extern .*[^;]$$' $$src \
+ | $(GREP) -vE '^(extern |--|#)' | $(SED) 's/ .*//; /^$$/d'; \
+ perl -lne \
+ '$(_gl_TS_function_match) and print $$1' $$hdr; \
+ ) | sort -u | $(SED) "$$sed_wrap" > $$t; \
+ nm -g $(_gl_TS_obj_files)|$(SED) -n 's/.* T //p'|$(GREP) -Ev -f $$t \
+ && { echo the above functions should have static scope >&2; \
+ exit 1; } || : ; \
+ ( printf '%s\n' '__.*' main $(_gl_TS_unmarked_extern_vars); \
+ perl -lne '$(_gl_TS_var_match) and print $$1' \
+ $$hdr $(_gl_TS_other_headers) \
+ ) | sort -u | $(SED) "$$sed_wrap" > $$t; \
+ nm -g $(_gl_TS_obj_files) | $(SED) -n 's/.* [BCDGRS] //p' \
+ | sort -u | $(GREP) -Ev -f $$t \
+ && { echo the above variables should have static scope >&2; \
+ exit 1; } || :
+# TS-end
+endif
diff --git a/msdos/Makefile.DJ b/msdos/Makefile.DJ
new file mode 100644
index 0000000..5ae5fec
--- /dev/null
+++ b/msdos/Makefile.DJ
@@ -0,0 +1,89 @@
+#
+# GNU Makefile for wget / djgpp / MSDOS.
+# By Gisle Vanem <gvanem@broadpark.no> 2009.
+#
+# `cd' to `./src' and issue the command:
+# make -f ../msdos/Makefile.dj depend
+# followed by:
+# make -f ../msdos/Makefile.dj
+#
+VERSION = 1.12 (djgpp/DOS)
+
+.SUFFIXES: .exe
+
+VPATH = ../lib ../md5 ../msdos
+
+USE_OPENSSL = 0
+USE_IPV6 = 1
+
+#
+# Change to suite.
+#
+OPENSSL_ROOT = e:/net/OpenSSL.099
+ZLIB_ROOT = e:/djgpp/contrib/zlib
+
+OBJ_DIR = djgpp.obj
+CC = gcc
+CFLAGS = -O2 -g -Wall -Wcast-align -I. -I../msdos -I../lib -I../md5 \
+ -I/dev/env/WATT_ROOT/inc -DHAVE_CONFIG_H -DENABLE_DEBUG \
+ -DUSE_WATT32
+
+# LDFLAGS = -s
+
+ifeq ($(USE_OPENSSL),1)
+ CFLAGS += -DHAVE_OPENSSL -DHAVE_SSL -DOPENSSL_NO_KRB5 -I$(OPENSSL_ROOT)
+ EX_LIBS += $(OPENSSL_ROOT)/lib/libssl.a $(OPENSSL_ROOT)/lib/libcrypt.a \
+ $(ZLIB_ROOT)/libz.a
+ SOURCES += openssl.c http-ntlm.c
+endif
+
+ifeq ($(USE_IPV6),1)
+ CFLAGS += -DENABLE_IPV6
+endif
+
+EX_LIBS += /dev/env/WATT_ROOT/lib/libwatt.a
+
+SOURCES += cmpt.c connect.c cookies.c exits.c ftp.c ftp-basic.c ftp-ls.c \
+ ftp-opie.c hash.c host.c html-parse.c html-url.c http.c \
+ init.c log.c main.c gen-md5.c netrc.c progress.c recur.c \
+ res.c retr.c snprintf.c url.c utils.c version.c convert.c \
+ ptimer.c spider.c css.c css-url.c build_info.c ../md5/md5.c \
+ ../msdos/msdos.c \
+ $(addprefix ../lib/, error.c exitfail.c quote.c \
+ quotearg.c getopt.c getopt1.c xalloc-die.c xmalloc.c)
+
+OBJECTS = $(addprefix $(OBJ_DIR)/, $(notdir $(SOURCES:.c=.o)))
+
+all: $(OBJ_DIR) wget.exe
+ @echo 'Welcome to Wget'
+
+$(OBJ_DIR):
+ mkdir $(OBJ_DIR)
+
+wget.exe: $(OBJECTS)
+ $(CC) $(LDFLAGS) -o $@ $^ $(EX_LIBS)
+
+css.c: css.l
+ flex -8 -o$@ $^
+
+clean:
+ rm -f $(OBJ_DIR)/*.o $(MAPFILE)
+
+vclean realclean: clean
+ rm -f wget.exe depend.dj version.c
+ - rmdir $(OBJ_DIR)
+
+$(OBJ_DIR)/%.o: %.c
+ $(CC) $(CFLAGS) -o $@ -c $<
+ @echo
+
+version.c: ../msdos/Makefile.DJ
+ @echo 'char *version_string = "$(VERSION)";' > $@
+ @echo 'char *compilation_string = "$(CC) $(CFLAGS)";' >> $@
+ @echo 'char *link_string = "$(CC) $(LDFLAGS) -o wget.exe $$(OBJECTS) $(EX_LIBS)";' >> $@
+
+depend: version.c
+ $(CC) -MM $(CFLAGS) $(SOURCES) | \
+ sed -e 's/^\([a-zA-Z0-9_-]*\.o:\)/$$(OBJ_DIR)\/\1/' > depend.dj
+
+-include depend.dj
diff --git a/msdos/Makefile.WC b/msdos/Makefile.WC
new file mode 100644
index 0000000..d93f068
--- /dev/null
+++ b/msdos/Makefile.WC
@@ -0,0 +1,67 @@
+#
+# Makefile for Wget / DOS32A / OpenWatcom
+# by G. Vanem <gvanem@broadpark.no> 2009
+#
+
+VERSION = 1.12 (Watcom/DOS)
+
+COMPILE = *wcc386 -mf -3r -w3 -d2 -zq -zm -of -I. -I$(%watt_root)\inc &
+ -I..\msdos -I..\lib -I..\md5 -fr=nul -bt=dos -s -dHAVE_CONFIG_H &
+ -dENABLE_DEBUG -dSIZEOF_INT=4 -dUSE_WATT32
+
+LINK = *wlink option quiet, map, verbose, eliminate, caseexact, stack=100k &
+ debug all system dos32a
+
+.c: ..\lib
+.c: ..\md5
+.c: ..\msdos
+
+
+OBJ_DIR = WC_DOS.obj
+
+OBJECTS = $(OBJ_DIR)\cmpt.obj $(OBJ_DIR)\build_info.obj &
+ $(OBJ_DIR)\c-ctype.obj $(OBJ_DIR)\cookies.obj &
+ $(OBJ_DIR)\connect.obj $(OBJ_DIR)\convert.obj &
+ $(OBJ_DIR)\css.obj $(OBJ_DIR)\css-url.obj &
+ $(OBJ_DIR)\error.obj $(OBJ_DIR)\exits.obj &
+ $(OBJ_DIR)\exitfail.obj $(OBJ_DIR)\ftp-basic.obj &
+ $(OBJ_DIR)\ftp-ls.obj $(OBJ_DIR)\ftp-opie.obj &
+ $(OBJ_DIR)\ftp.obj $(OBJ_DIR)\gen-md5.obj &
+ $(OBJ_DIR)\getopt.obj $(OBJ_DIR)\getopt1.obj &
+ $(OBJ_DIR)\hash.obj $(OBJ_DIR)\msdos.obj &
+ $(OBJ_DIR)\host.obj $(OBJ_DIR)\html-parse.obj &
+ $(OBJ_DIR)\html-url.obj $(OBJ_DIR)\http.obj &
+ $(OBJ_DIR)\init.obj $(OBJ_DIR)\log.obj &
+ $(OBJ_DIR)\main.obj $(OBJ_DIR)\md5.obj &
+ $(OBJ_DIR)\netrc.obj $(OBJ_DIR)\progress.obj &
+ $(OBJ_DIR)\ptimer.obj $(OBJ_DIR)\recur.obj &
+ $(OBJ_DIR)\res.obj $(OBJ_DIR)\retr.obj &
+ $(OBJ_DIR)\spider.obj $(OBJ_DIR)\url.obj &
+ $(OBJ_DIR)\utils.obj $(OBJ_DIR)\version.obj &
+ $(OBJ_DIR)\xalloc-die.obj $(OBJ_DIR)\xmalloc.obj &
+ $(OBJ_DIR)\quote.obj $(OBJ_DIR)\quotearg.obj
+
+all: $(OBJ_DIR) wget.exe .SYMBOLIC
+ @echo 'Welcome to Wget / Watcom'
+
+$(OBJ_DIR):
+ - mkdir $^@
+
+.ERASE
+.c{$(OBJ_DIR)}.obj: .AUTODEPEND
+ *$(COMPILE) -fo=$@ $[@
+
+css.c: css.l
+ flex -8 -o$@ $[@
+
+wget.exe: $(OBJECTS)
+ $(LINK) name $@ file { $(OBJECTS) } library $(%watt_root)\lib\wattcpwf.lib
+
+version.c: ..\msdos\Makefile.WC
+ @echo char *version_string = "$(VERSION)"; > $@
+ @echo char *compilation_string = "$(COMPILE)"; >> $@
+ @echo char *link_string = "$(LINK) name wget.exe file { $$(OBJECTS) }"; >> $@
+
+clean: .SYMBOLIC
+ - rm $(OBJ_DIR)\*.obj wget.exe wget.map version.c css.c
+ - rmdir $(OBJ_DIR)
diff --git a/msdos/config.h b/msdos/config.h
new file mode 100644
index 0000000..35fb72a
--- /dev/null
+++ b/msdos/config.h
@@ -0,0 +1,141 @@
+/* Configuration header file for MS-DOS/Watt-32
+ Copyright (C) 2007, 2008, 2009, 2010, 2011, 2015 Free Software
+ Foundation, Inc.
+
+ This file is part of GNU Wget.
+
+ GNU Wget 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.
+
+ GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+ Additional permission under GNU GPL version 3 section 7
+
+ If you modify this program, or any covered work, by linking or
+ combining it with the OpenSSL project's OpenSSL library (or a
+ modified version of that library), containing parts covered by the
+ terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+ grants you additional permission to convey the resulting work.
+ Corresponding Source for a non-source form of such a combination
+ shall include the source code for the parts of OpenSSL used as well
+ as that of the covered work. */
+
+
+#ifndef CONFIG_DOS_H
+#define CONFIG_DOS_H
+
+#include <stdlib.h>
+#include <limits.h>
+#include <tcp.h>
+#include <malloc.h>
+
+#ifdef __DJGPP__
+#include <sys/config.h>
+#endif
+
+#include <sys/errno.h>
+
+#if defined(__WATCOMC__)
+ #if (__WATCOMC__ >= 1250) /* OW 1.5+ */
+ #define OPENWATCOM_15
+ #endif
+ #if (__WATCOMC__ >= 1270) /* OW 1.7+ */
+ #define OPENWATCOM_17
+ #endif
+#endif
+
+#if defined(__HIGHC__)
+ #define HAVE_UNISTD_H 1
+ #define HAVE_UTIME_H 1
+#endif
+
+#if defined(__WATCOMC__) || defined(__BORLANDC__) || defined(__HIGHC__)
+ #define inline
+#endif
+
+#define USE_OPIE 1
+#define USE_DIGEST 1
+#define DEBUG
+
+#ifdef __DJGPP__
+ #define HAVE__BOOL 1
+ #define HAVE_STRCASECMP 1
+ #define HAVE_STRNCASECMP 1
+ #define HAVE_SIGSETJMP 1
+ #define HAVE_SIGBLOCK 1
+ #define HAVE_STRUCT_UTIMBUF 1
+ #define HAVE_SYS_SELECT_H 1
+ #define HAVE_USLEEP 1
+ #define HAVE_UTIME_H 1
+ #define HAVE_INT64_T 1
+
+ #if (DJGPP_MINOR >= 4)
+ #define HAVE_STDBOOL_H 1
+ #define HAVE_STDINT_H 1
+ #define HAVE_SNPRINTF 1
+ #define HAVE_VSNPRINTF 1
+ #define HAVE_UINT32_T 1
+ #endif
+#endif
+
+#ifdef __HIGHC__
+ #define HAVE_STRUCT_UTIMBUF 1
+ #define HAVE_UTIME_H 1
+#endif
+
+#ifdef OPENWATCOM_15
+ #define HAVE_ALLOCA_H 1
+ #define HAVE_INT64_T 1
+ #define HAVE_SNPRINTF 1
+ #define HAVE_STRCASECMP 1
+ #define HAVE_STRNCASECMP 1
+ #define HAVE_STDINT_H 1
+ #define HAVE_UTIME_H 1
+#endif
+
+#ifdef OPENWATCOM_17
+ #define HAVE__BOOL 1
+ #define HAVE_STDBOOL_H 1
+#endif
+
+#define HAVE_PROCESS_H 1
+#define HAVE_STRDUP 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STRING_H 1
+#define HAVE_BUILTIN_MD5 1
+#define HAVE_ISATTY 1
+
+#define lookup_host wget_lookuphost
+#define select select_s
+#define socklen_t int
+
+#define sock_read wget_sock_read
+#define sock_write wget_sock_write
+#define sock_close wget_sock_close
+
+#if !defined(__DJGPP__)
+ #include <direct.h>
+ #define mkdir(p,a) (mkdir)(p)
+ #define strcasecmp stricmp
+#endif
+
+#if !defined(MSDOS)
+ #define MSDOS
+#endif
+
+#if !defined(USE_WATT32)
+ #define USE_WATT32
+#endif
+
+#define LOCALEDIR ""
+#define OS_TYPE "DOS"
+
+#endif /* CONFIG_DOS_H */
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644
index 0000000..229349f
--- /dev/null
+++ b/po/LINGUAS
@@ -0,0 +1,39 @@
+be
+bg
+ca
+cs
+da
+de
+el
+en_GB
+eo
+es
+et
+eu
+fi
+fr
+ga
+gl
+he
+hr
+hu
+id
+it
+ja
+lt
+nb
+nl
+pl
+pt
+pt_BR
+ro
+ru
+sk
+sl
+sr
+sv
+tr
+uk
+vi
+zh_CN
+zh_TW
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..65184f6
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,475 @@
+# Makefile for PO directory in any package using GNU gettext.
+# 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
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# 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.19
+GETTEXT_MACRO_VERSION = 0.19
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SED = @SED@
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+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:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+ @echo "$(MSGFMT) -c -o $@ $<"; \
+ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+ @lang=`echo $* | sed -e 's,.*/,,'`; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ 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: 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@" \
+ || { 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; \
+ }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(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 || { \
+ echo "touch stamp-po" && \
+ echo timestamp > stamp-poT && \
+ mv stamp-poT stamp-po; \
+ }
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# 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
+ 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_prefix=''; \
+ fi; \
+ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+ else \
+ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+ fi; \
+ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ *) \
+ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+ --files-from=$(srcdir)/POTFILES.in \
+ --copyright-holder='$(COPYRIGHT_HOLDER)' \
+ --package-name="$${package_prefix}@PACKAGE@" \
+ --package-version='@VERSION@' \
+ --msgid-bugs-address="$$msgid_bugs_address" \
+ ;; \
+ esac
+ test ! -f $(DOMAIN).po || { \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+ else \
+ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ else \
+ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+ fi; \
+ }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+ $(MAKE) $(DOMAIN).pot-update
+
+# 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): $(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) $(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
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ $(INSTALL_DATA) $(srcdir)/$$file \
+ $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ for file in Makevars; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+install-data-no: all
+install-data-yes: all
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+ fi; \
+ done; \
+ done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+ else \
+ : ; \
+ fi
+installdirs-data-no:
+installdirs-data-yes:
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ dir=$(localedir)/$$lang/LC_MESSAGES; \
+ $(mkdir_p) $(DESTDIR)$$dir; \
+ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+ if test -n "$$lc"; then \
+ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+ for file in *; do \
+ if test -f $$file; then \
+ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+ fi; \
+ done); \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+ else \
+ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+ :; \
+ else \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+ fi; \
+ fi; \
+ fi; \
+ done; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ for file in $(DISTFILES.common) Makevars.template; do \
+ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+uninstall-data-no:
+uninstall-data-yes:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+ done; \
+ done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+ rm -f remove-potcdate.sed
+ rm -f stamp-poT
+ rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+ test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
+ @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ if test "$(PACKAGE)" = "gettext-tools"; then \
+ dists="$$dists Makevars.template"; \
+ fi; \
+ if test -f $(srcdir)/$(DOMAIN).pot; then \
+ dists="$$dists $(DOMAIN).pot stamp-po"; \
+ fi; \
+ if test -f $(srcdir)/ChangeLog; then \
+ dists="$$dists ChangeLog"; \
+ fi; \
+ for i in 0 1 2 3 4 5 6 7 8 9; do \
+ if test -f $(srcdir)/ChangeLog.$$i; then \
+ dists="$$dists ChangeLog.$$i"; \
+ fi; \
+ done; \
+ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+ for file in $$dists; do \
+ if test -f $$file; then \
+ cp -p $$file $(distdir) || exit 1; \
+ else \
+ cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+ fi; \
+ done
+
+update-po: Makefile
+ $(MAKE) $(DOMAIN).pot-update
+ test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+ $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+ @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+ exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+ @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+ tmpdir=`pwd`; \
+ echo "$$lang:"; \
+ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+ cd $(srcdir); \
+ 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 \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "msgmerge for $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+$(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
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644
index 0000000..b6393c6
--- /dev/null
+++ b/po/Makevars
@@ -0,0 +1,84 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ \
+ \
+ --flag=_:1:pass-c-format\
+ --flag=N_:1:pass-c-format\
+ --flag=error:3:c-format --flag=error_at_line:5:c-format\
+ $${end_of_xgettext_options+}
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding
+# package. (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.) Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright. The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# 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 =
+
+# 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
+# in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+# understood.
+# - Strings which make invalid assumptions about notation of date, time or
+# money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-wget@gnu.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 =
+
+# 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
+PACKAGE_GNU = yes
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..e522dc4
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,30 @@
+# List of files which containing translatable strings.
+# Copyright (C) 1995-2011, 2018-2020 Free Software Foundation, Inc.
+
+# Package source files
+src/connect.c
+src/convert.c
+src/cookies.c
+src/ftp-ls.c
+src/ftp.c
+src/gnutls.c
+src/host.c
+src/html-url.c
+src/http.c
+src/init.c
+src/iri.c
+src/log.c
+src/main.c
+src/metalink.c
+src/mswindows.c
+src/netrc.c
+src/openssl.c
+src/progress.c
+src/ptimer.c
+src/recur.c
+src/res.c
+src/retr.c
+src/spider.c
+src/url.c
+src/utils.c
+src/warc.c
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644
index 0000000..9dc9630
--- /dev/null
+++ b/po/Rules-quot
@@ -0,0 +1,58 @@
+# 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
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+ $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+ $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+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-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) $(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 \
+ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+ :; \
+ else \
+ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ echo "creation of $$lang.po failed!" 1>&2; \
+ rm -f $$tmpdir/$$lang.new.po; \
+ fi
+
+en@quot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+ sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+ rm -f *.insert-header
diff --git a/po/be.gmo b/po/be.gmo
new file mode 100644
index 0000000..5ca0689
--- /dev/null
+++ b/po/be.gmo
Binary files differ
diff --git a/po/be.po b/po/be.po
new file mode 100644
index 0000000..beb9224
--- /dev/null
+++ b/po/be.po
@@ -0,0 +1,3385 @@
+# БеларуÑкі пераклад wget.
+# This file is distributed under the same license as the wget package.
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# Hleb Valoska <el_globus@tut.by>, 2003.
+# Alexander Nyakhaychyk <nyakhaychyk@gmail.com>, 2003, 2004, 2007, 2008, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.12-pre6\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2010-04-13 02:23+0300\n"
+"Last-Translator: Alexander Nyakhaychyk <nyakhaychyk@gmail.com>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"Language: be\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: немагчыма вызначыць bind-Ð°Ð´Ñ€Ð°Ñ %s; bind адключаны.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "ДалучÑньне да %s[%s]:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "ДалучÑньне да %s:%d... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "ДалучÑньне да %s:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "далучÑньне ÑžÑталÑвана.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "збой: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: немагчыма вызначыць назву вузла %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Пераўтворана %d файлаў за %s ÑÑк.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "ПераўтварÑнне %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "нÑма чаго рабіць.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ðемагчыма пераўтварыць ÑпаÑылкі Ñž %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ðемагчыма выдаліць %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ðемагчыма зрабіць запаÑную копію %s Ñк %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ðемагчыма выдаліць %s: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "СінтакÑÑ–Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž Set-Cookie: %s на пазіцыі %d.\n"
+
+#: src/cookies.c:777
+#, fuzzy, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie з %s Ñпрабуе выÑтавіць дамÑн у %s\n"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ðемагчыма адкрыць файл з cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Памылка запіÑу Ñž %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Памылка Ð·Ð°ÐºÑ€Ñ‹Ñ†Ñ†Ñ %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"ГÑÑ‚Ñ‹ від ÑьпіÑа файлаў не падтрымліваецца, Ñпроба ўжыць разбор Unix-"
+"ÑьпіÑаў.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "ЗьмеÑÑ‚ /%s на %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Ñ‡Ð°Ñ Ð½ÐµÐ²Ñдомы "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Файл "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "ДырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Лучыва "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "ÐÑ Ð¿Ñўны "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s байтаў)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "ДаўжынÑ: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) заÑталоÑÑ"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s заÑталоÑÑ"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (неаўтарытÑтны)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Уваходжу Ñк %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Памылка Ñž адказе паÑлужніка; кантрольнае далучÑньне зачынена.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Памылка Ñž вітаньні ÑÑрвÑра.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Памылка запіÑу, закрыю кіроўнае злучÑньне.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "СÑрвÑÑ€ адмаўлÑе ва ўваходзе.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Уваход не карÑктны.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Увайшоў!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Памылка ÑÑрвÑра, немагчыма вызначыць тып ÑÑ‹ÑÑ‚Ñмы.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "зроблена."
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "зроблена.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "ÐевÑдомы тып `%c', закрыю кіроўнае злучÑньне.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "зроблена."
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD непатрÑбнае.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"ÐдÑутнічае дырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD непатрÑбны.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "Файл %s ужо тут; абмінаем.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ðемагчыма ініцыÑлізаваць PASV-перадачу.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ðемагчыма зрабіць разбор PASV адказу.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "немагчыма далучыцца да %s, порт %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Памылка bind (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "КепÑкі загад PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Збой загаду REST; пачынаем уÑÑ‘ нанова.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Файл %s Ñ–Ñнуе.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "ÐдÑутнічае файл %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"ÐдÑутнічае файл %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"ÐдÑутнічае файл ці дырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s; закрыццё кіруючага далучÑннÑ.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - далучÑнне Ð´Ð»Ñ Ð´Ð°Ð½Ñ‹Ñ…: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Кантрольнае далучÑньне зачынена.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "ÐÐ±Ð°Ñ€Ð²Ð°Ð½Ð°Ñ Ð¿ÐµÑ€Ð°Ð´Ð°Ñ‡Ð° даньнÑÑž.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Файл %s ужо тут; абмінаем.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(Ñпроба: %2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - запіÑаны Ñž stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s захаваны [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Выдаленьне %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "ВыкарыÑтанне %s у ÑкаÑьці ліÑтынгу tmp-файла\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Выдалены %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr ""
+"ЗначÑньне Ñ€ÑкурÑыўнае глыбіні %d большае за найбольшую дазволеную глыбіню "
+"%d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Ðддалены файл не навейшы за мÑÑцовы файл %s -- абмінаем.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr "Ðддалены файл навейшы за мÑÑцовы файл %s -- выцÑгваем.\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Памеры не Ñупадаюць (мÑÑцовы %s) -- выцÑгваецца.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "ÐерÑчаіÑÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° ÑпаÑылкі; мінаецца.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Ужо маецца Ð¿Ñ€Ð°Ð²Ñ–Ð»ÑŒÐ½Ð°Ñ ÑпаÑылка %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "СтварÑньне ÑпаÑылкі %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Ð¡Ñ–Ð¼Ð²Ð°Ð»Ñ–Ñ‡Ð½Ñ‹Ñ ÑпаÑылкі не падтрымліваюцца; абмінаем symlink %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ðбмінаем дырÑкторыю %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: тып файла не падтрымліваецца або невÑдомы.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Ðемагчыма атрымаць ключ паÑÑŒÐ²ÐµÐ´Ñ‡Ð°Ð½ÑŒÐ½Ñ Ð· %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: пашкоджаны адбітак чаÑу.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "ÐдхілÑем %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "ÐдхілÑем %s.\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Памылка ÑÑƒÐ¿Ð°Ð´Ð·ÐµÐ½ÑŒÐ½Ñ %s Ñупраць %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "ÐдÑутнічаюць Ñупадзенні з узорам %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Ð—Ð°Ð¿Ñ–Ñ HTML-ізаваны індÑÐºÑ Ñƒ %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Ð—Ð°Ð¿Ñ–Ñ HTML-ізаваны індÑÐºÑ Ñƒ %s.\n"
+
+#: src/gnutls.c:132
+#, fuzzy, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+"ÐдÑутнічае дырÑÐºÑ‚Ð¾Ñ€Ñ‹Ñ %s.\n"
+"\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "ЛіÑтуйце Ñправаздачы аб памылках Ñ– пытанні на <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ПÐМЫЛКÐ"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "УВÐГÐ"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "ПаÑведчанне Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Памылка разбору паÑведчаннÑ: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "ÐевÑдомы вузел"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "ЧаÑÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž разьвÑзваньні назвы"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Пошук %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "збой: адÑутнічае IPv4/IPv6 Ð°Ð´Ñ€Ð°Ñ Ð´Ð»Ñ Ð²ÑƒÐ·Ð»Ð°.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "збой: ÑкончыўÑÑ Ñ‡Ð°Ñ.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: немагчыма разьвÑзаць незавершаную ÑпаÑылку %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: нерÑчаіÑны URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Памылка запіÑу HTTP зварота: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "ÐдÑутнічаюць загалоўкі; верагодна, HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Файл %s ужо тут; абмінаем.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, fuzzy, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "ÐдÑутнічае файл %s з POST-данымі: %s\n"
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Паўторнае выкарыÑтаньне Ñ–Ñнуючага далучÑÐ½ÑŒÐ½Ñ Ð´Ð° %s:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Паўторнае выкарыÑтаньне Ñ–Ñнуючага далучÑÐ½ÑŒÐ½Ñ Ð´Ð° %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ Ð°Ð´ÐºÐ°Ð·Ñƒ прокÑÑ–: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ПÐМЫЛКР%d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ДрÑннаÑкладзены радок Ñтану"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Збой прокÑÑ–-тунÑлю: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ñхема аўтарызаваньнÑ.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ Ñхема аўтарызаваньнÑ.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Ð—Ð°Ð¿Ñ–Ñ Ñƒ %s.\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "SSL адключаны з-за пералічаных памылак.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s зварот даÑланы, чакаецца адказ... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ð”Ð°Ð½Ñ‹Ñ Ð½Ðµ атрыманы.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ (%s) у загалоўках.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(апіÑаньне адÑутнічае)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Знаходжаньне: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "невÑдома"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [крочым]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Файл ужо цалкам атрыманы; рабіць нічога Ð½Ñ Ñ‚Ñ€Ñба.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "ДаўжынÑ: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "праігнаравана"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Увага! Узоры не падтрымліваюцца ў HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Уключаны Ñ€Ñжым павука. Праверка наÑўнаÑьці аддаленага файла.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ðемагчыма запіÑаць у %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Ðемагчыма запіÑаць у %s (%s).\n"
+
+#: src/http.c:4484
+#, fuzzy
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ðемагчыма запіÑаць у %s (%s).\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ðемагчыма ÑžÑталÑваць SSL злучÑньне.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ðемагчыма запіÑаць у %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ПÐМЫЛКÐ: перанакіраваньне (%d) без знаходжаньнÑ.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Ðддалены файл не Ñ–Ñнуе -- Ð·Ð»Ð°Ð¼Ð°Ð½Ð°Ñ ÑпаÑылка!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Загаловак Last-Modified адÑутнічае -- адбіткі чаÑу адключаны.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Загаловак Last-Modified нерÑчаіÑны -- адбітак чаÑу будзе ігнаравацца.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Ðддалены файл не навейшы за мÑÑцовы %s -- абмінаем.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Памеры не Ñупадаюць (мÑÑцовы %s) -- выцÑгваем.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Ðддалены файл навейшы, загружаю.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Ðддалены файл Ñ–Ñнуе.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - запіÑаны Ñž stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s захаваны [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - злучÑньне закрыта на байце %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ Ð½Ð° байце %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - памылка Ñ‡Ñ‹Ñ‚Ð°Ð½ÑŒÐ½Ñ Ð½Ð° байце %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Схема %s не падтрымліваецца"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC ÑпаÑылаецца на %s, але ён(Ñна) адÑутнічае.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ðемагчыма прачытаць %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Памылка ў %s, радок %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: СінтакÑÑ–Ñ‡Ð°Ð½Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž %s, радок %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: невÑдомы загад %s у %s; радок %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: УВÐГÐ! СіÑÑ‚Ñмны Ñ– карыÑтальніцкі wgetrc ÑпаÑылаюцца на %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: ÐÑдзейÑны загад --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: ÐÑдзейÑнае булева значÑнне %s; выкарыÑтоўвайце «on» ці «off».\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: ÐÑдзейÑнае булева значÑнне %s; выкарыÑтоўвайце «on» ці «off».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: ÐÑдзейÑны нумар %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: ÐÑдзейÑнае значÑнне байта %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: ÐÑдзейÑны адрÑзак чаÑу %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: ÐÑдзейÑны адрÑзак чаÑу %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: ÐÑдзейÑнае значÑнне %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: ÐÑдзейÑны загаловак %s.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: ÐÑдзейÑны загаловак %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: ÐÑдзейÑны тып прагрÑÑбару %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Кадоўка %s не з'ÑўлÑецца дзейÑнай\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "КанверÑÑ–Ñ Ð· %s у %s непадтрымліваецца\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Ðеапрацаваны код памылкі %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: лакаль не вызначанаÑ\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "збой idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "немагчыма далучыцца да %s, порт %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s атрымана; перанакірванне вываду ў %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; Ð·Ð°Ð¿Ñ–Ñ Ñ…Ñ€Ð°Ð½Ð°Ð»Ð¾Ð³Ñ–Ñ– адключаны.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "ВыкарыÑтанне: %s [OPTION]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"ÐргумÑнты, абавÑÐ·ÐºÐ¾ÑžÐ²Ñ‹Ñ Ð´Ð»Ñ Ð´Ð¾ÑžÐ³Ñ–Ñ… опцыÑÑž, абавÑÐ·ÐºÐ¾Ð²Ñ‹Ñ Ð¹ Ð´Ð»Ñ ÐºÐ°Ñ€Ð¾Ñ‚ÐºÑ–Ñ….\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "ЗапуÑк:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version адлюÑтроўвае верÑÑ–ÑŽ Wget.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help друкую гÑтую даведку.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background Ñ„Ð¾Ð½Ð°Ð²Ð°Ñ Ð¿Ñ€Ð°Ñ†Ð° паÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=COMMAND выконвае загад у Ñтылі \".wgetrc\".\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Ð¥Ñ€Ð°Ð½Ð°Ð»Ð¾Ð³Ñ–Ñ Ñ– ÑžÐ²Ð°Ñ…Ð¾Ð´Ð½Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FILE запіÑваць паведамленні Ñž FILE.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FILE дадаць паведамленні ў FILE.\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose быць шматÑлоўным (прадвызначана).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -v, --verbose быць шматÑлоўным (прадвызначана).\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html лічыць уваходны файл за HTML.\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr " --certificate=FILE файл кліенцкага паÑведчаннÑ.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Запампоўка:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMBER задае колькаÑць Ñпроб NUMBER (0 - "
+"неабмежавана).\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FILE запіÑвае дакумент у FILE.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber абмінаць запампоўкі Ñ–Ñнуючых файлаў.\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" -np, --no-parent не ўваходзіць у бацькоўÑкую дырÑкторыю.\n"
+
+#: src/main.c:660
+#, fuzzy
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue працÑг запампоўкі чаÑткова-атрыманага "
+"файла.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+#, fuzzy
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYPE выбар выглÑду дыÑграмы прагрÑÑу.\n"
+
+#: src/main.c:666
+#, fuzzy
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=TYPE выбар выглÑду дыÑграмы прагрÑÑу.\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response друкаваць адказ ÑÑрвера.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr " --no-dns-cache адключыць кÑш вынікаў DNS пошуку.\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -t, --tries=NUMBER задае колькаÑць Ñпроб NUMBER (0 - "
+"неабмежавана).\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RATE абмежаваць хуткаÑць запампоўкі ўзроўнем "
+"RATE.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache адключыць кÑш вынікаў DNS пошуку.\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ігнараваць Ñ€ÑгіÑтар у назвах файлаў/"
+"дырÑкторыÑÑž.\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only далучацца толькі да IPv4 адраÑоў.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only далучацца толькі да IPv6 адраÑоў.\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "ДырÑкторыі:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories не Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories прымуÑіць Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nd, --no-directories не Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " -x, --force-directories прымуÑіць Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Опцыі HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-dns-cache адключыць кÑш вынікаў DNS пошуку.\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ігнараваць загаловак «Content-Length».\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --progress=TYPE выбар выглÑду дыÑграмы прагрÑÑу.\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " -nd, --no-directories не Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Опцыі HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --certificate=FILE файл кліенцкага паÑведчаннÑ.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FILE файл кліенцкага паÑведчаннÑ.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr " --certificate=FILE файл кліенцкага паÑведчаннÑ.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FILE файл ÑакрÑтнага ключа.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key=FILE файл ÑакрÑтнага ключа.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --certificate=FILE файл кліенцкага паÑведчаннÑ.\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "Опцыі HTTP:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Опцыі FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " -nd, --no-directories не Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-iri адключыць падтрымку IRI.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-dns-cache адключыць кÑш вынікаў DNS пошуку.\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " -S, --server-response друкаваць адказ ÑÑрвера.\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "Опцыі FTP:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+#, fuzzy
+msgid "WARC options:\n"
+msgstr "Опцыі FTP:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" -t, --tries=NUMBER задае колькаÑць Ñпроб NUMBER (0 - "
+"неабмежавана).\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " -nd, --no-directories не Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --ignore-case ігнараваць Ñ€ÑгіÑтар у назвах файлаў/"
+"дырÑкторыÑÑž.\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "РÑкурÑÑ–ÑžÐ½Ð°Ñ Ð·Ð°Ð¿Ð°Ð¼Ð¿Ð¾ÑžÐºÐ°:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -t, --tries=NUMBER задае колькаÑць Ñпроб NUMBER (0 - "
+"неабмежавана).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --spider не запампоўваць уÑÑ‘.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -nc, --no-clobber абмінаць запампоўкі Ñ–Ñнуючых файлаў.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "РÑкурÑÑ–ÑžÐ½Ñ‹Ñ Ð´Ð°Ð·Ð²Ð¾Ð»Ñ‹/забароны:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --progress=TYPE выбар выглÑду дыÑграмы прагрÑÑу.\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --progress=TYPE выбар выглÑду дыÑграмы прагрÑÑу.\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -np, --no-parent не ўваходзіць у бацькоўÑкую дырÑкторыю.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr " -h, --help друкую гÑтую даведку.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -x, --force-directories прымуÑіць Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -x, --force-directories прымуÑіць Ñтвараць дырÑкторыі.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent не ўваходзіць у бацькоўÑкую дырÑкторыю.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "ÐеінтÑрактыўны Ñеткавы запампоўнік GNU Wget %s.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль карыÑтальіка %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Пароль:"
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Пароль карыÑтальіка %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Лакаль: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "КампілÑтар: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "СпаÑылка: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s ÑкампілÑваны на %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (user)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2009 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"ПершаÑтваральнік - Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "ЛіÑтуйце Ñправаздачы аб памылках Ñ– пытанні на <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "ПаÑпрабуйце \"%s --help\", каб пабачыць больш опцыÑÑž.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: Ð½ÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ -- \"-n%c\"\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ðемагчыма адначаÑова быць шматÑлоўным Ñ– маўклівым.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ðельга адначаÑова выбіраць --ask-password Ñ– --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: прапушчаны URL\n"
+
+#: src/main.c:1836
+#, fuzzy, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Ðельга адначаÑова выбіраць --ask-password Ñ– --password.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, fuzzy, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Ðельга адначаÑова выбіраць --ask-password Ñ– --password.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "ГÑÑ‚Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ Ð½Ñ Ð¼Ð°Ðµ падтрымкі IRIs\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Ðемагчыма выдаліць ÑпаÑылку %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: немагчыма вызначыць назву вузла %s\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "ÐÑ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹ URL у %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ðемагчыма выдаліць %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ЗÐВЕРШÐÐÐ --%s--\n"
+"Запампавана: %d файлаў, %s у %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Квота запампоўкі (%s) перавышана!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Збой прокÑÑ–-тунÑлю: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ðемагчыма выдаліць %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "ÐдÑутнічае файл %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "ПаÑведчанне Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ð°\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Выдаленьне %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Праца працÑгнецца Ñž фоне.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Праца працÑгнецца Ñž фоне, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Вывад будзе запіÑаны Ñž %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr ""
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: невÑдомы токен \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "ВыкарыÑтаньне: %s NETRC [ÐÐЗВÐ_ВУЗЛÐ]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: немагчыма выканаць stat %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: нерÑчаіÑны URL %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Ðапаткана ÑамападпіÑанае паÑведчанне.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ абмінаем %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " ~ %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " у "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr ""
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ðемагчыма адкрыць %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Загружаецца robots.txt; калі лаÑка, не зьвÑртайце ўвагі на памылкі.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Памылка разбору URL паўнамоцнага паÑлужніка %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Памылка Ñž URL паўнамоцнага паÑлужніка %s: муÑіць быць HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "перавышÑньне колькаÑьці перанакіраваньнÑÑž (%d).\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"ЗдаемÑÑ.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Паўтараем Ñпробу.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Ð—Ð»Ð°Ð¼Ð°Ð½Ñ‹Ñ ÑпаÑылкі Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½Ñ‹.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Знойдзена %d Ð·Ð»Ð°Ð¼Ð°Ð½Ð°Ñ ÑпÑылка.\n"
+"\n"
+msgstr[1] ""
+"Знойдзены %d Ð·Ð»Ð°Ð¼Ð°Ð½Ñ‹Ñ ÑпÑылкі.\n"
+"\n"
+msgstr[2] ""
+"Знойдзена %d зламаных ÑпÑылак.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "ÐÑма памылак"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Схема %s не падтрымліваецца"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "ÐдÑутнічае Ñхема"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "ÐÑдзейÑÐ½Ð°Ñ Ð½Ð°Ð·Ð²Ð° вузла"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "КепÑкі нумар порта"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "ÐÑдзейÑнае ўліковае імÑ"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Ðезавершаны Ð°Ð´Ñ€Ð°Ñ IPv6"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "ÐдраÑÑ‹ IPv6 не падтрымліваюцца"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "КепÑкі Ð°Ð´Ñ€Ð°Ñ IPv6"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Падтрымка HTTPS не ўбудаванаÑ"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: немагчыма размеркаваць даÑтаткова памÑці; памÑць вычÑрпанаÑ.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: немагчыма размеркаваць %ld байтаў; памÑць вычÑрпанаÑ.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: Ñ‚ÑкÑтавы буфер завÑлікі (%ld байтаў); аварыйнае завÑршÑнне.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Праца працÑгваецца Ñž тле, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ðемагчыма выдаліць ÑпаÑылку %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Ðемагчыма атрымаць ключ паÑÑŒÐ²ÐµÐ´Ñ‡Ð°Ð½ÑŒÐ½Ñ Ð· %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Ðемагчыма загрузіць паÑьведчаньні з %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Памылка запіÑу Ñž %s: %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Памылка разбору паÑведчаннÑ: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr "Ðемагчыма адшукаць вузел паўнамоцнага паÑлужніка.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#~ msgid "Unknown system error"
+#~ msgstr "ÐевÑÐ´Ð¾Ð¼Ð°Ñ ÑÑ–ÑÑ‚ÑÐ¼Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ°"
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"%s\" зьÑўлÑецца неадназначнай\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"--%s\" не дазвалÑе довады\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"%c%s\" не дазвалÑе довады\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"%s\" патрабуе довад\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: нераÑÐ¿Ð°Ð·Ð½Ð°Ð½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ \"--%s\"\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s: нераÑÐ¿Ð°Ð·Ð½Ð°Ð½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ \"%c%s\"\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: Ð½ÐµÐ´Ð°Ð¿ÑƒÑˆÑ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ -- %c\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- %c\n"
+#~ msgstr "%s: нерÑчаіÑÐ½Ð°Ñ Ð¾Ð¿Ñ†Ñ‹Ñ -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ Ð¿Ð°Ñ‚Ñ€Ð°Ð±ÑƒÐµ аргумÑнт -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"-W %s\" зьÑўлÑецца неадназначнай\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð¾Ð¿Ñ†Ñ‹Ñ \"-W %s\" не дазвалÑе аргумÑнты\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "memory exhausted"
+#~ msgstr "памÑць вычÑрпанаÑ"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Збой аўтарызаваньнÑ.\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "збой idn_decode (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s атрымана.\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgstr ""
+#~ "ЛіÑтуйце Ñправаздачы аб памылках Ñ– пажаданні на <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s ÑкампілÑваны на VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "БÑгучы раÑпрацоўнік - Micah Cowan <micah@cowan.name>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Файл \"%s\" ужо тут; абмінаем.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "УВÐГÐ! Ðемагчыма адкрыць Ñтандартны вывад у бінарным Ñ€Ñжыме;\n"
+#~ " запампаваны файл можа ўтрымліваць Ð½ÐµÐ´Ð°ÐºÐ»Ð°Ð´Ð½Ñ‹Ñ ÐºÐ°Ð½Ñ†Ñ‹ радкоў.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Памылка ў Set-Cookie, поле \"%s\""
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "СынтакÑÑ‹Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¼Ñ‹Ð»ÐºÐ° Ñž Set-Cookie на знаку \"%c\".\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s заÑталоÑÑ]"
+
+#~ msgid "Host not found"
+#~ msgstr "Вузел Ð½Ñ Ð·Ð½Ð¾Ð¹Ð´Ð·ÐµÐ½"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Ðемагчыма наладзіць кантÑкÑÑ‚ SSL\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Спроба без заданага паÑьведчаньнÑ\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "EOF (канец файла) пад Ñ‡Ð°Ñ Ñ€Ð°Ð·Ð±Ð¾Ñ€Ñƒ загалоўкаў.\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (%s заÑталоÑÑ)"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Файл \"%s\" ужо тутака й Ð½Ñ Ð±ÑƒÐ´Ð·Ðµ выцÑгвацца.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' захавана [%ld/%ld])\n"
+#~ "\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - ЗлучÑньне закрыта на байце %ld/%ld. "
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Ðемагчыма пераўтварыць `%s' у Ð°Ð´Ñ€Ð°Ñ IP.\n"
+
+#~ msgid "%s: %s: Please specify always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s: Вызначы, калі лаÑка, заўжды (always), уключана (on), выключана "
+#~ "(off) ці ніколі (never).\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ЗапуÑк:\n"
+#~ " -V, --version адлюÑтраваць вÑÑ€ÑÑ‹ÑŽ Wget Ñ– выйÑьці.\n"
+#~ " -h, --help надрукаваць гÑтую даведку.\n"
+#~ " -b, --background перайÑьці Ñž тло паÑÑŒÐ»Ñ Ð·Ð°Ð¿ÑƒÑку.\n"
+#~ " -e, --execute=ЗÐГÐД выканаць загад у Ñтылі \".wgetrc\".\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "ГÑÑ‚Ð°Ñ Ð¿Ñ€Ð°Ð³Ñ€Ð°Ð¼Ð° разпаўÑюджваецца з надзеÑй, што Ñна будзе карыÑнай,\n"
+#~ "але БЕЗЬ ÐІЯКÐЕ ГÐРÐÐТЫІ; нават без гарантыі КÐШТОЎÐÐСЬЦІ ці\n"
+#~ "ПРЫДÐТÐÐСЬЦІ ДЛЯ КÐÐКРЭТÐÐЕ МЭТЫ. ГлÑдзі падрабÑзнаÑьці Ñž ÐÑнонай\n"
+#~ "Публічнай ЛцÑнзіі GNU (GNU GPL).\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: знойдзены цыкал перанакіроўваньнÑ.\n"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: неÑтае памÑці.\n"
diff --git a/po/bg.gmo b/po/bg.gmo
new file mode 100644
index 0000000..31faed5
--- /dev/null
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..bd0983e
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,3489 @@
+# Bulgarian messages for GNU Wget.
+# Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Vesselin Markov <vemarkov@yahoo.com>, 2002
+# ЧаÑти от преводите на Павел Михайлов и ЯÑен РуÑев Ñъщо Ñа използувани.
+# Ðко имате идеи за подобрÑване на превода, ни пратете поща на
+# bg-team@bash.info
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.8.1\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2002-03-18 03:11\n"
+"Last-Translator: Yassen Roussev <slona@bulgaria.com>\n"
+"Language-Team: Bulgarian <bg@bulgaria.com>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, fuzzy, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "УÑтановÑване на контакт Ñ %s[%s]:%hu... "
+
+#: src/connect.c:290
+#, fuzzy, c-format
+msgid "Connecting to %s:%d... "
+msgstr "УÑтановÑване на контакт Ñ %s:%hu... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "УÑтановÑване на контакт Ñ %s[%s]:%hu... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "уÑпешно Ñвързване.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "неуÑпÑ: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Преобразувах %d файла за %.2f Ñекунди.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Преобразувам %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "нÑма друга задача.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ðемога да преобразувам линковете в %s: %s\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ðемога да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ `%s': %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ðемога да подÑÐ¸Ð³ÑƒÑ€Ñ %s като %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ðемога да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ `%s': %s\n"
+
+#: src/cookies.c:464
+#, fuzzy, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Синтактична грешка при Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Set-Cookie: неправилен низ.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr ""
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ðе мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ cookies файла \"cookies\", `%s': %s\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° `%s': %s\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Грешка при затварÑне на `%s': %s\n"
+
+# ^ msgstr "Грешка при затварÑне на `%s': %s\n"
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Ðеподдържан вид лиÑтинг, пробвам Ñ Ð´Ñ€ÑƒÐ³ Unix лиÑтинг превождач.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ð¾Ñ‚ /%s върху %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "неизвеÑтно време "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Файл "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Линк "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Ðе Ñъм Ñигурен "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s байта)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Дължина: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (недоÑтоверно)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Логвам Ñе като %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Сървърът праща Ñъобщение за грешка, Ñпирам управлÑващата връзка.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Грешка при ръкуването ÑÑŠÑ Ñървъра.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "ПиÑането Ñе провали, прекъÑвам управлÑващата връзка.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Сървърът не приема логин.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Ðеправилен логин.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "УÑпешно логване!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Грешка при Ñървъра, не мога да Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²Ð¸Ð´Ð° ÑиÑтема .\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "готово. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "готово.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Ðепознат тип `%c', Ñпирам управлÑващата връзка.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "готово. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD не е необходимо.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"ÐÑма такава Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ `%s'.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD не е необходимо.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "Файлът `%s' е вече тук, нÑма да го теглÑ.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ðе мога да започна паÑивен транÑфер.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ðе мога да разбера PASV отговора.\n"
+
+#: src/ftp.c:1101
+#, fuzzy, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "немога да Ñе Ñвържа към %s:%hu: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Грешка при Ñвързване (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ðевалиден порт.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Грешка при REST, започвам отначало.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"ÐÑма такъв файл `%s'.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"ÐÑма такъв файл `%s'.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"ÐÑма такъв файл или Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ `%s'.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, Ñпирам управлÑващата връзка.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Връзка за данни: %s: "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "ОÑновната връзка бе затворена.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "ТранÑферът бе прекъÑнат.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Файлът `%s' е вече тук, нÑма да го теглÑ.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(опит:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2051 src/http.c:4793
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' запиÑан [%ld]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Премахвам %s.\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Ползвам `%s' като временен ÑпиÑък файл.\n"
+
+#: src/ftp.c:2185
+#, fuzzy, c-format
+msgid "Removed %s.\n"
+msgstr "Премахвам `%s'.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Дълбочина на рекурÑиÑта %d надвишава макÑ. дълбочина %d.\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Файлът от Ñървъра не е по-нов от меÑÑ‚Ð½Ð¸Ñ `%s' -- не продължавам.\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr "Файлът на Ñървъра е по-нов от меÑÑ‚Ð½Ð¸Ñ `%s' -- започвам да Ñ‚eглÑ.\n"
+
+#: src/ftp.c:2309
+#, fuzzy, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr "Големината не Ñъвпада (меÑтен %ld) -- започвам да Ñ‚eглÑ.\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ðевалидно име на Ñимволична връзка, пропуÑкам.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Символичната връзка е вече поправена %s -> %s.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Създавам Ñимволична връзка %s -> %s\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Символичните връзки не Ñа поддържат, пропуÑкам `%s'.\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ПропуÑкам Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ `%s'.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: неизвеÑтен/неподдържан вид файл.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "ÐеуÑпех при взимане на ключа към Ñертификата от %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: недоÑтоверен времеви печат.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "ÐÑма да Ñ‚ÐµÐ³Ð»Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ð¸, защото дълбочината е %d (макÑимум %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ðе влизам в `%s', тъй като Ñ‚Ñ Ðµ изключенa/не е включенa.\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr "Отказвам `%s'.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Отказвам `%s'.\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° `%s': %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "ÐÑма ÑÑŠÐ²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð·Ð° пример `%s'.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "ЗапиÑах HTML-изиран Ð¸Ð½Ð´ÐµÐºÑ Ð² `%s' [%ld].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "ЗапиÑах HTML-изиран Ð¸Ð½Ð´ÐµÐºÑ Ð² `%s'.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Изпращайте ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° грешки и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Грешка при транÑлирането на прокÑи УРЛ %s: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+#, fuzzy
+msgid "Unknown host"
+msgstr "Ðепозната грешка"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ðепозната грешка"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Преобразувам %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+#, fuzzy
+msgid "failed: timed out.\n"
+msgstr "неуÑпÑ: %s.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ðе мога да изаÑÐ½Ñ Ð½ÐµÑÑŠÐ²ÑŠÑ€ÑˆÐµÐ½Ð½Ð¸Ñ Ð»Ð¸Ð½Ðº %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, fuzzy, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "ÐеуÑпех при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° HTTP иÑкане: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr "Файлът `%s' е вече тук, нÑма да го теглÑ.\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Използване на вече уÑтановена връзка към %s:%hu.\n"
+
+#: src/http.c:2098
+#, fuzzy, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Използване на вече уÑтановена връзка към %s:%hu.\n"
+
+#: src/http.c:2164
+#, fuzzy, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "ÐеуÑпех при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° HTTP иÑкане: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ГРЕШКÐ: %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Деформиран ÑтатуÑ"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ðепознат начин на удоÑтоверение.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Ðепознат начин на удоÑтоверение.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr ""
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s изпратено иÑкане, чакам отговор... "
+
+#: src/http.c:3441
+#, fuzzy
+msgid "No data received.\n"
+msgstr "Ðе Ñе получават данни"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Грешка при четене (%s) в заглавките.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(без опиÑание)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "ÐдреÑ: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "неопределен"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [Ñледва]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Файлът е вече изтеглен; нÑма друга задача.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Дължина: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "игнориран"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Внимание: ÑƒÐ°Ð¹Ð»Ð´ÐºÐ°Ñ€Ð´Ñ Ð½Ðµ Ñе поддържат в HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ðемога да запиша върху `%s' (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Ðемога да запиша върху `%s' (%s).\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ðемога да уÑÑ‚Ð°Ð½Ð¾Ð²Ñ SSL връзка.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ðемога да запиша върху `%s' (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ГРЕШКÐ: Пре-адреÑÐ°Ñ†Ð¸Ñ (%d) без уÑтановен адреÑ.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Заглавката Ñъдържаща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно поÑледна промÑна липÑва -- полето за "
+"дата Ñе изключва.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Заглавката Ñъдържаща Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно поÑледна промÑна е невалиднa -- "
+"полето за дата Ñе игнорира.\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr "Файлът на Ñървъра не е по-нов от този на диÑка `%s' -- Ñпирам.\n"
+
+#: src/http.c:4651
+#, fuzzy, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Големините не Ñъвпадат (меÑтен %ld) -- продължавам.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Файлът на Ñървъра е по-нов, продължавам.\n"
+
+#: src/http.c:4678
+#, fuzzy
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr "Файлът на Ñървъра е по-нов от меÑÑ‚Ð½Ð¸Ñ `%s' -- започвам да Ñ‚eглÑ.\n"
+
+#: src/http.c:4684
+#, fuzzy
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr "Файлът от Ñървъра не е по-нов от меÑÑ‚Ð½Ð¸Ñ `%s' -- не продължавам.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+#, fuzzy
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "Файлът на Ñървъра е по-нов, продължавам.\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s ГРЕШКÐ: %d: %s.\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' запиÑан [%ld/%ld]\n"
+"\n"
+
+#: src/http.c:4818
+#, fuzzy, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Връзката бе преуÑтановена при байт %ld. "
+
+#: src/http.c:4841
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Грешка при четене, байт %ld (%s)."
+
+#: src/http.c:4850
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Грешка при четене, байт %ld/%ld (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr ""
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ðемога да прочета %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Грешка при %s в ред %d.\n"
+
+#: src/init.c:718
+#, fuzzy, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Грешка при %s в ред %d.\n"
+
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: БЪГ: непозната команда `%s', ÑтойноÑÑ‚ `%s'.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Внимание: СиÑтемниÑÑ‚ wgetrc и личниÑÑ‚ Ñочат към `%s'.\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: %s: невалидна команда\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: ÐœÐ¾Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÑ‚Ðµ on или off.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ðевалиден вид напредък `%s'.\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'.\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr ""
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'.\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ðевалидна ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'.\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ðевалиден вид напредък `%s'.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "немога да Ñе Ñвържа към %s:%hu: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s получени, пре-адреÑиране на резултата към `%%s'.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; Ñпирам запиÑването.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Употреба: %s [ОПЦИЯ]... [УРЛ]...\n"
+
+#: src/main.c:590
+#, fuzzy
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"\n"
+"Задължителните аргументи за опции в дълъг вид, Ñа задължителни и за тези в "
+"опроÑтен вид.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+#, fuzzy
+msgid "Directories:\n"
+msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ "
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, не-интерактивен мрежов Ñофтуеър за транÑфер.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Запазени авторÑки права (C) 1995-2001 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+#, fuzzy
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"ПървонапиÑана от Hrvoje Niksic <hniksic@arsdigita.com>.\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Изпращайте ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð° грешки и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Опитайте `%s --help' за повече опции.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: невалидна Ð¾Ð¿Ñ†Ð¸Ñ -- `-n%c'\n"
+
+#: src/main.c:1593
+#, fuzzy, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "%s: поддръжката на \"debug\" не е компилирана.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ðе може да бъде \"многоÑловен\" и \"тих\" едновременно.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Ðе мога да Ñложа дата, но и да не презапиша едновременно\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: УРЛ не е указан\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "УРЛ не е открит в %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ðемога да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ `%s': %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"\n"
+"ГОТОВО --%s--\n"
+"Изтеглени: %s байта в %d файла\n"
+
+#: src/main.c:2284
+#, fuzzy, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Квотата от (%s байта) бе ПРЕВИШЕÐÐ!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ðемога да Ð¸Ð·Ñ‚Ñ€Ð¸Ñ `%s': %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Премахвам %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Продължавам на заден план.\n"
+
+#: src/mswindows.c:289
+#, fuzzy, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Продължавам на заден план, pid %d.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Резултатът ще бъде запиÑван в `%s'.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ðемога да Ð½Ð°Ð¼ÐµÑ€Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщ TCP/IP драйвер.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: внимание: \"%s\" има Ñимвол преди името на машината\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: непознат Ñимвол \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Употреба: %s NETRC [ИМЕ ÐРХОСТ]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: непълен формат %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+#, fuzzy
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Ðе мога да Ð½Ð°Ð¼ÐµÑ€Ñ OpenSSL PRNG; продължавам без SSL.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, fuzzy, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ пропуÑкам %dK ]"
+
+#: src/progress.c:545
+#, fuzzy, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Ðевалидна точкова ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ `%s'; оÑтавам непроменено.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Премахване на %s, Ñлед като той би Ñ‚Ñ€Ñбвало да бъде отхвърлен.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ðемога да преобразувам линковете в %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Зареждам robots.txt; Ð¼Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð°Ð¹Ñ‚Ðµ грешките.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Грешка при транÑлирането на прокÑи УРЛ %s: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Грешка при прокÑи УРЛ %s: ТрÑбва да е HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d пре-адреÑациите бÑха твърде много.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Отказвам Ñе.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Продължавам.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+#, fuzzy
+msgid "No error"
+msgstr "Ðепозната грешка"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr ""
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr ""
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr ""
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr ""
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr ""
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:1007
+#, fuzzy
+msgid "HTTPS support not compiled in"
+msgstr "%s: поддръжката на \"debug\" не е компилирана.\n"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Продължавам на заден план, pid %d.\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Грешка при изтриване на Ñимволична връзка `%s': %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "ÐеуÑпех при взимане на ключа към Ñертификата от %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "ÐеуÑпех при зареждане на Ñертификати от %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Грешка при Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° `%s': %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Грешка при транÑлирането на прокÑи УРЛ %s: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr "Ðемога да Ð½Ð°Ð¼ÐµÑ€Ñ Ð¿Ñ€Ð¾ÐºÑи хоÑта.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, c-format
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Грешка в Set-Cookie, поле `%s'"
+
+#, c-format
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Синтактична грешка при Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Set-Cookie, при `%c'.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Грешка при REST; нÑма да прекъÑна `%s'.\n"
+
+#, c-format
+#~ msgid " [%s to go]"
+#~ msgstr " [ОÑтават %s]"
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s: опциÑта `%s' е многозначна\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: опциÑта `--%s' не позволÑва аргумент\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: опциÑта `%c%s' не позволÑва аргумент\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s: опциÑта `%s' изиÑква аргумент\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: неразпозната Ð¾Ð¿Ñ†Ð¸Ñ `--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s: неразпозната Ð¾Ð¿Ñ†Ð¸Ñ `%c%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: невалидна Ð¾Ð¿Ñ†Ð¸Ñ -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: опциÑта изиÑква аргумент -- %c\n"
+
+#~ msgid "Host not found"
+#~ msgstr "ХоÑÑ‚ÑŠÑ‚ не бе открит"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "ÐеуÑпех при уÑтановÑване на SSL контекÑÑ‚\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Опитвам без указаниÑÑ‚ Ñертификат\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Край на файла (EOF), докато превеждах заглавките.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Грешка при удоÑтоверÑване.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "ПродължениÑÑ‚ транÑфер на този файл неуÑпÑ, конфликт Ñ `-c'.\n"
+#~ "Отказвам да презапиша ÑъщеÑтвуващиÑÑ‚ файл `%s'.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid " (%s to go)"
+#~ msgstr " (оÑтават %s)"
+
+#, c-format
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Файлът `%s' вече ÑъщеÑтвува, нÑма нов запиÑ.\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' запиÑан [%ld/%ld])\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Връзката бе преуÑтановена при байт %ld/%ld. "
+
+#, c-format
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Ðе мога да преобразувам `%s' в IP адреÑ.\n"
+
+#, c-format
+#~ msgid "%s: %s: Please specify always, on, off, or never.\n"
+#~ msgstr "%s: %s: ÐœÐ¾Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÑ‚Ðµ always, on, off или never.\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ПуÑкане:\n"
+#~ " -V, --version показва верÑиÑта на Wget и излиза.\n"
+#~ " -h, --help показва тeзи помощни редове.\n"
+#~ " -b, --background преминава в заден план.\n"
+#~ " -e, --execute=КОМÐÐДРизпълнÑва `.wgetrc'-тип команда.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ЗапиÑване и входови файл:\n"
+#~ " -o, --output-file=ФÐЙЛ запиÑва ÑъобщениÑта във ФÐЙЛ.\n"
+#~ " -a, --append-output=ФÐЙЛ Ð´Ð¾Ð±Ð°Ð²Ñ ÑъобщениÑта във ФÐЙЛ.\n"
+#~ " -d, --debug показва debug резултат.\n"
+#~ " -q, --quiet \"тих\" режим (без output).\n"
+#~ " -v, --verbose многоÑловно (поначало).\n"
+#~ " -nv, --non-verbose без многоÑловноÑÑ‚ (не \"тих\" режим).\n"
+#~ " -i, --input-file=ФÐЙЛ Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° УРЛ във ФÐЙЛ.\n"
+#~ " -F, --force-html разглежда Ð²Ñ…Ð¾Ð´Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» като HTML.\n"
+#~ " -B, --base=УРЛ Ð´Ð¾Ð±Ð°Ð²Ñ URL към отнаÑÑщи Ñе линкове (-F -i "
+#~ "файл).\n"
+#~ " --sslcertfile=ФÐЙЛ незадължителен клиентÑки Ñертификат -F -i.\n"
+#~ " --sslcertkey=КЛЮЧ незадължителен ключ към този Ñертификат.\n"
+#~ " --egd-file=ФÐЙЛ име на файла от EGD Ñокет.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set the read timeout to SECONDS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ЗапиÑ:\n"
+#~ " --bind-address=ÐДРЕС закачване към ÐДРЕС (име на хоÑÑ‚ или IP) "
+#~ "на меÑтна машина.\n"
+#~ " -t, --tries=ÐОМЕР Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð±Ñ€Ð¾Ñ Ð¾Ð¿Ð¸Ñ‚Ð¸ (0 -- безкарайно).\n"
+#~ " -O --output-document=ФÐЙЛ запиÑва документите във ФÐЙЛ.\n"
+#~ " -nc, --no-clobber не презапиÑва вече изтеглени файлове.\n"
+#~ " -c, --continue продължава тегленето на файл (при "
+#~ "прекъÑнало ÑÑŠÑтоÑние).\n"
+#~ " --progress=ВИД Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð²Ð¸Ð´Ð° напредване.\n"
+#~ " -N, --timestamping не тегли файлове ако Ñа по-Ñтари от вече "
+#~ "ÑъщеÑтвуващите.\n"
+#~ " -S, --server-response показва ÑъобщениÑта от Ñървъра.\n"
+#~ " --spider не тегли нищо.\n"
+#~ " -T, --timeout=СЕКУÐДИ ограничава времето за теглене (в "
+#~ "Ñекунди).\n"
+#~ " -w, --wait=СЕКУÐДИ време за изчакване между файлове (в "
+#~ "Ñекунди).\n"
+#~ " --waitretry=СЕКУÐДИ време за изчакване между нови опити за "
+#~ "теглене (в Ñекунди).\n"
+#~ " --random-wait изчакване от 0...2 -- ИЗЧÐКВÐÐЕ в Ñекунди "
+#~ "между теглениÑ.\n"
+#~ " -Y, --proxy=on/off включва/изключва прокÑи.\n"
+#~ " -Q, --quota=ÐОМЕР ограничава ÑÐ±Ð¾Ñ€Ð½Ð¸Ñ Ð¾Ð±ÐµÐ¼ за автоматично "
+#~ "теглене.\n"
+#~ " --limit-rate=СКОРОСТ ограничава ÑкороÑтта на теглене.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Директории:\n"
+#~ " -nd --no-directories не Ñъздава директории.\n"
+#~ " -x, --force-directories задължава Ñъздаването на директории.\n"
+#~ " -nH, --no-host-directories не Ñъздава директории Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на "
+#~ "хоÑта.\n"
+#~ " -P, --directory-prefix=ПРЕФИКС запиÑва файловете в ПРЕФИКС/...\n"
+#~ " --cut-dirs=ÐОМЕР игнорира ÐОМЕР на компоненти от Ñтрана "
+#~ "на Ñървъра.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTP опции:\n"
+#~ " --http-user=ИМЕ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ http ИМЕ.\n"
+#~ " --http-passwd=ПÐÐ ÐžÐ›Ð Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð¿Ð°Ñ€Ð¾Ð»Ð° http ПÐРОЛÐ.\n"
+#~ " -C, --cache=on/off не/позволÑва използване на вече кеширана "
+#~ "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ Ñървъра.\n"
+#~ " -E, --html-extension запиÑва вÑички текÑтови файлове Ñ .html "
+#~ "наÑтавка .\n"
+#~ " --ignore-length игнорира заглавката `Content-Length'.\n"
+#~ " --header=ÐИЗ Ñлага ÐИЗ в заглавките.\n"
+#~ " --proxy-user=ИМЕ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ Ð˜ÐœÐ• за прокÑи Ñървър.\n"
+#~ " --proxy-passwd=ПÐÐ ÐžÐ›Ð Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ ÐŸÐРОЛРза прокÑи Ñървър.\n"
+#~ " --referer=УРЛ включва `Referer: URL' заглавка в HTTP "
+#~ "иÑкането.\n"
+#~ " -s, --save-headers запиÑва HTTP заглавките във ФÐЙЛ.\n"
+#~ " -U, --user-agent=ÐГЕÐТ идентифицира Ñе като ÐГЕÐТ вмеÑто Wget/"
+#~ "ВерÑиÑ.\n"
+#~ " --no-http-keep-alive Ñпира HTTP keep-alive.\n"
+#~ " --cookies=off не използва биÑквитки.\n"
+#~ " --load-cookies=ФÐЙЛ зарежда биÑквитките от ФÐЙЛ (преди ÑеÑиÑ).\n"
+#~ " --save-cookies=ФÐЙЛ запиÑва биÑквитките във ФÐЙЛ (Ñлед ÑеÑиÑ).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "FTP опции:\n"
+#~ " -nr, --dont-remove-listing не премахва `.listing' файлове.\n"
+#~ " -g, --glob=on/off включва/изключва Ñ‚ÑŠÑ€Ñенето за Ñхема (от "
+#~ "файл).\n"
+#~ " --passive-ftp използва паÑивен модел на транÑфер.\n"
+#~ " --retr-symlinks при рекурÑивноÑÑ‚, използва Ñамите линкнати "
+#~ "файлове (не директории).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive web-suck -- use with care!\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "РекурÑивен транÑфер:\n"
+#~ " -r, --recursive рекурÑивен \"web-suck\" -- използвайте "
+#~ "внимателно! .\n"
+#~ " -l, --level=ÐОМЕР макÑимална \"дълбочина\" при \"web-suck"
+#~ "\" (inf/0 за безкрайна).\n"
+#~ " --delete-after изтриване на файлове Ñлед като Ñа "
+#~ "изтеглени (меÑтно).\n"
+#~ " -k, --convert-links преобразува неÑвързани линкове в "
+#~ "Ñвързани.\n"
+#~ " -K, --backup-converted преди да преобразува файл, оÑигурÑва (файл."
+#~ "orig).\n"
+#~ " -m, --mirror опциÑта е по-ÐºÑŠÑ ÐµÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñ‚ на -r -N -l "
+#~ "inf -nr.\n"
+#~ " -p, --page-requisites Ð¸Ð·Ñ‚ÐµÐ³Ð»Ñ Ð²Ñички графични файлове (и Ñ‚.н.), "
+#~ "за пълна HTML Ñтаница.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "РекурÑивно приемане/отхвърлÑне:\n"
+#~ " -A, --accept=СПИСЪК ÑпиÑък на разрешени окончаниÑ.\n"
+#~ " -R, --reject=СПИСЪК ÑпиÑък на забранени окончаниÑ.\n"
+#~ " -D, --domains=СПИСЪК ÑпиÑък на разрешени домейни.\n"
+#~ " --exclude-domains=СПИСЪК ÑпиÑък на забранени домейни.\n"
+#~ " --follow-ftp Ñледва FTP линкове от HTML "
+#~ "документи.\n"
+#~ " --follow-tags=СПИСЪК ÑпиÑък на HTML тагове които Ñледвам.\n"
+#~ " -G, --ignore-tags=СПИСЪК ÑпиÑък на HTML тагове които "
+#~ "игнорирам..\n"
+#~ " -H, --span-hosts използва други хоÑтове при рекурÑиÑ.\n"
+#~ " -L, --relative \tизползва Ñамо Ñвързани линкове.\n"
+#~ " -I, --include-directories=СПИСЪК \tÑпиÑък на вÑички позволени "
+#~ "директории.\n"
+#~ " -X, --exclude-directories=СПИСЪК \tÑпиÑък на вÑички забранени "
+#~ "директории.\n"
+#~ " -np, --no-parent \tне Ñе изкачва към родителÑката "
+#~ "директориÑ.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Тази програма Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð° че ще бъде полезна,\n"
+#~ "но БЕЗ КÐКВÐТО И ДРЕ БИЛРГÐРÐÐЦИЯ; дори за ТЪРГОВСКРСТОЙÐОСТ\n"
+#~ "или ГОДÐОСТ ЗРДÐДЕÐРЦЕЛ. ОтнеÑете Ñе към GNU General Public License\n"
+#~ "за повече информациÑ.\n"
+
+#, c-format
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Стартиране на WinHelp %s\n"
+
+#, c-format
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: УÑтановено зациклÑне при пре-адреÑациÑ.\n"
+
+#, c-format
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: ÐедоÑтиг на памет.\n"
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644
index 0000000..4b937aa
--- /dev/null
+++ b/po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
+s/“/“/g
+s/â€/â€/g
+s/‘/‘/g
+s/’/’/g
diff --git a/po/ca.gmo b/po/ca.gmo
new file mode 100644
index 0000000..4b2d75c
--- /dev/null
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..ca022ea
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,3857 @@
+# Catalan translation of wget.
+# Copyright © 2002, 2003, 2005, 2007, 2008, 2010, 2013, 2015 Free Software Foundation, Inc.
+# This file is distributed under the same licence as the wget package.
+# Jordi Valverde Sivilla <jordi@eclipsi.net>, 2002.
+# Ernest Adrogué Calveras <eadrogue@gmx.net>, 2003.
+# Jordi Mallach <jordi@gnu.org>, 2003, 2005, 2007, 2008, 2010, 2013, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.16.1.46\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2015-08-04 09:23+0200\n"
+"Last-Translator: Jordi Mallach <jordi@gnu.org>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=n!=1;\n"
+
+# Bind? jm
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: no s'ha pogut resoldre l'adreça de vinculació %s; s'està inhabilitant la "
+"connexió.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "S'està connectant a %s|%s|:%d… "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "S'està connectant a %s:%d… "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "S'està connectant a [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "connectat.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "error: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: no s'ha pogut resoldre l'adreça del servidor «%s»\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "S'han convertit %d fitxers en %s segons.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "S'està convertint %s… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "res a fer.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "No s'han pogut convertir els enllaços de «%s»: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "No s'ha pogut suprimir %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "No es pot fer una còpia de %s com a %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "No s'ha pogut obtenir la galeta per a %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr ""
+"S'ha produït un error de sintaxi a la capçalera Set-Cookie: %s a la posició "
+"%d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "La galeta provinent de %s ha intentat establir el domini a "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "No es pot obrir el fitxer de cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "S'ha produït un error en escriure a %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "S'ha produït un error en tancar %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"El tipus de llista no és suportat, es prova amb l'analitzador de Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ãndex de /%s a %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "data desconeguda "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fitxer "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Directori "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Enllaç "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "No és segur "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s octets)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Mida: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) restant"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s restant"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (no autoritatiu)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "S'està entrant com a «%s» … "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ""
+"S'ha produït un error en la resposta del servidor, es tanca la connexió de "
+"control.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "S'ha produït un error en el missatge de benvinguda del servidor.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr ""
+"S'ha produït un error d'escriptura, s'està tancant la connexió de control.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "El servidor rebutja les peticions d'entrada.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Entrada incorrecta.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "S'ha entrat amb èxit!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr ""
+"S'ha produït un error del servidor, no es pot determinar el tipus de "
+"sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "fet. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "fet.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "El tipus «%c» és desconegut , es tanca la connexió de control.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "fet. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD innecessari.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "S'ha arribat a una secció lògicament impossible a getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"El directori %s no existeix.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD no requerit.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "El fitxer ja s'ha obtingut.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "No s'ha pogut iniciar la transferència PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "No s'ha pogut analitzar la resposta PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "no s'ha pogut connectar a %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "S'ha produït un error en vincular (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT incorrecte.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST ha fallat, s'està començant des del principi.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "El fitxer %s existeix.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "El fitxer %s no existeix.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"El fitxer %s no existeix.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"El fitxer o directori %s no existeix.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s ha començat a existir.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, es tanca la connexió de control.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Connexió de dades: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Connexió de control tancada.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "S'ha avortat la transferència de dades.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "El fitxer %s ja existeix, no es baixa.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(intent:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - imprimit per la sortida estàndard %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - s'ha desat %s [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "S'està suprimint %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "S'utilitza %s com a fitxer de llistat temporal.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "S'ha suprimit %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "La profunditat de recursió %d excedeix el màxim permès %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "El fitxer remot no és més nou que el local %s -- no es baixa.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer remot és més nou que el local %s -- s'està baixant.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Els fitxers no tenen la mateixa mida (local %s) -- s'està baixant.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "El nom de l'enllaç simbòlic no és correcte; s'omet.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Ja hi ha un enllaç simbòlic correcte %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "S'està creant l'enllaç simbòlic %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "No es suporten enllaços simbòlics; s'omet l'enllaç %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "S'està ometent el directori %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tipus de fitxer desconegut o no suportat.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "No s'ha pogut obtenir la galeta per a %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: la marca de temps és corrupta..\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "No es baixaran els directoris ja que la profunditat és %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "No es descendeix a %s ja que està exclòs, o no inclòs.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "S'està rebutjant %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "S'està rebutjant %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "No es descendeix a %s ja que està exclòs, o no inclòs.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "S'ha produït un error en comparar %s amb %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Cap coincidència amb el patró %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "S'ha escrit un índex HTMLitzat a %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "S'ha escrit un índex HTMLitzat a %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERROR: No es pot obrir el directori %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERROR: No s'ha pogut obrir el certificat %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "S'ha produït un error en analitzar el certificat: %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERROR: No s'ha pogut carregar el fitxer CRL «%s»: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "S'ha carregat el fitxer CRL «%s»\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ERROR: GnuTLS requereix que la clau i certificat siguen del mateix tipus.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "La vostra versió d'OpenSSL és massa antiga per suportar TLSv1.1\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+"GnuTLS: el valor %d per l'opció «secure-protocol» no està implementat\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Informeu d'aquest problema a bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"GnuTLS: el valor %d per l'opció «secure-protocol» no està implementat\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERROR"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVÃS"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s no ha presentat cap certificat.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: No es confia en el certificat de %s.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: El certificat de %s no té un emissor conegut.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: El certificat de %s s'ha revocat.\n"
+
+#: src/gnutls.c:1041
+#, fuzzy, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: No es confia en el certificat de %s.\n"
+
+#: src/gnutls.c:1042
+#, fuzzy, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: El certificat de %s no té un emissor conegut.\n"
+
+#: src/gnutls.c:1043
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: No es confia en el certificat de %s.\n"
+
+#: src/gnutls.c:1044
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: El certificat de %s s'ha revocat.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "S'ha produït un error en inicialitzar el certificat X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "No s'ha trobat cap certificat\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "S'ha produït un error en analitzar el certificat: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "El certificat encara no s'ha activat\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "El certificat ha caducat\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "El propietari del certificat no concorda amb el nom del servidor %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "El certificat ha de ser X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "S'ha produït un error en gestionar la llista d'adreces.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Servidor desconegut"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "S'ha produït un error temporal en la resolució de noms"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "S'ha produït un error desconegut"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "S'està resolent %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "error: No hi ha adreces IPv4/IPv6 per al servidor.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "error: s'ha exhaurit el temps.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: No s'ha pogut resoldre l'enllaç incomplet %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: L'URL %s no és vàlid: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "S'ha produït un error en escriure la petició HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "No hi ha capçaleres, s'assumeix HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer %s ja existeix, no es baixa.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, fuzzy, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Manca el fitxer de dades POST %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "S'està reutilitzant la connexió a [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "S'està reutilitzant la connexió a %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr ""
+"S'ha produït un error en llegir la resposta del servidor intermediari: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROR: %d %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "La línia d'estat és malformada"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Ha fallat la tunelització del servidor intermediari: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "L'esquema d'autenticació és desconegut.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "L'esquema d'autenticació és desconegut.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "S'està desant a: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "S'està inhabilitant SSL a causa dels errors trobats.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s: s'ha enviat la petició, s'està esperant una resposta… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "No s'ha rebut cap dada\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "S'ha produït un error de lectura (%s) a les capçaleres.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sense descripció)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Ubicació: %s%s\n"
+
+# és femení: ubicació/mida. eac
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "no especificada"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [es segueix]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" El fitxer ja s'ha baixat totalment; res a fer.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Mida: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "s'ignora"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Avís: En HTTP no es suporten patrons.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Mode aranya habilitat. Comprova si el fitxer remot existeix.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "No s'ha pogut escriure a %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "S'ha rebut l'atribut requerit que mancava a Header.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "L'autenticació amb nom d'usuari/contrasenya ha fallat.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "No s'ha pogut escriure al fitxer WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "No s'ha pogut escriure al fitxer temporal WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "No s'ha pogut establir la connexió SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "No s'ha pogut desenllaçar %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROR: Redirecció (%d) sense ubicació.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "El fitxer remot no existeix -- enllaç trencat!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Falta la capçalera Last-modified -- s'han inhabilitat les marques de temps.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Capçalera Last-modified no vàlida -- s'omet la marca de temps.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer remot no és més nou que el local %s -- no es baixa.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Les mides dels fitxers no coincideixen (local %s) -- s'està baixant.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "El fitxer remot és més nou, s'està baixant.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer remot existeix i pot contenir enllaços a altres recursos -- s'està "
+"obtenint.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer remot existeix però no conté cap enllaç -- no s'obté.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fitxer remot existeix i podria contenir més enllaços,\n"
+"però la recursió és inhabilitada -- no es baixa.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"El fitxer remot existeix.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "URL %s: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrit a la sortida estàndard %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - s'ha desat %s [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - S'ha tancat la connexió a l'octet %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - S'ha produït un error de lectura a l'octet %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - S'ha produït un error de lectura a l'octet %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "La qualitat de la protecció «%s» no és implementada.\n"
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "La qualitat de la protecció «%s» no és implementada.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: La variable WGETRC apunta a %s, que no existeix.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: No s'ha pogut llegir %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: S'ha produït un error a %s, línia %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: S'ha produït un error de sintaxi a %s, línia %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: L'ordre %s és desconeguda a %s, línia %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"L'anàlisi del fitxer wgetrc del sistema (env SYSTEM_WGETRC) ha fallat. "
+"Comproveu\n"
+"«%s»,\n"
+"o especifiqueu un fitxer diferent emprant --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"L'anàlisi del fitxer wgetrc del sistema ha fallat. Comproveu\n"
+"«%s»,\n"
+"o especifiqueu un fitxer diferent emprant --config.\n"
+
+# es refereix a variables d'entorn o què? eac
+# es refereix als dotfiles .wgetrc, etc. jm
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Avís: El wgetrc del sistema i de l'usuari apunten a %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: L'ordre --execute %s no és vàlida.\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: El booleà %s no és vàlid; useu «on» o «off».\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: El booleà %s no és vàlid; useu «on» o «off».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: El número %s no és vàlid.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s només es pot emprar una vegada\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: El valor %s de l'octet no és vàlid.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: El període de temps %s no és vàlid.\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: El període de temps %s no és vàlid.\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: El valor %s no és vàlid.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: La capçalera %s no és vàlida.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: La capçalera WARC %s no és vàlida.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: El tipus d'indicador de progrés %s no és vàlid.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: La restricció «%s» no és vàlida,\n"
+" empreu [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "La codificació %s no és vàlida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, fuzzy, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "La conversió de %s a %s no és implementada\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "S'ha trobat una seqüència multioctet incompleta o invàlida\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Número d'error no gestionat %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: el locale no és establert\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "Ha fallat «idn_encode» (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "no s'ha pogut connectar a %s port %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s rebut, la sortida es redirigeix a %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; s'està inhabilitant el registre.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Forma d'ús: %s [OPCIÓ]… [URL]…\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Els arguments obligatoris per les opcions llargues també ho són per les "
+"curtes.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Inici:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version mostra la versió del Wget i surt.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help mostra aquesta ajuda.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background vés a segon terme després de l'inici.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=ORDRE executa una ordre d'estil «.wgetrc».\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Registres i fitxer d'entrada:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=FITXER desa els missatges del programa a FITXER.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FITXER afegeix els missatges a FITXER.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug mostra molta informació de depuració.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug mostra informació de depuració de Watt-32.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet mode silenciós (cap sortida).\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose mode detallat (per defecte).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose mode no detallat, però tampoc del tot "
+"silenciós.\n"
+
+#: src/main.c:624
+#, fuzzy
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIPUS Mostra l'ample de banda com a TIPUS.\n"
+" TIPUS pot ser bits.\n"
+
+#: src/main.c:626
+#, fuzzy
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FITXER baixa les URL que es troben al FITXER local\n"
+" o extern.\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FITXER baixa les URL que es troben al FITXER local\n"
+" o extern.\n"
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html tracta el fitxer d'entrada com a HTML.\n"
+
+#: src/main.c:634
+#, fuzzy
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL resol els enllaços de fitxers d'entrada HTML\n"
+" (-i -F) relatius a URL.\n"
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FITXER Especifica el fitxer de configuració a emprar.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies no utilitzes galetes.\n"
+
+#: src/main.c:641
+#, fuzzy
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" -o, --output-file=FITXER desa els missatges del programa a FITXER.\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Baixada:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NOMBRE estableix el nombre de reintents (0=sense "
+"limit).\n"
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused reintenta encara que es rebutje la "
+"connexió.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" -G, --ignore-tags=LLISTA llista separada per comes d'etiquetes "
+"HTML\n"
+" ignorades.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FITXER escriu els documents a FITXER.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber omet baixades de fitxers ja existents\n"
+" (sobreescrivint-los).\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-cookies no utilitzes galetes.\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, -­continue continua obtenint un fitxer baixat "
+"parcialment\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=ÒFSET comença a baixar des de la posició basada "
+"en zero Ã’FSET\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TIPUS selecciona el tipus d'indicador de "
+"progrés\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress mostra la barra de progrés en qualsevol "
+"mode de detall\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping no baixes fitxers si no són més nous que "
+"els\n"
+" locals\n"
+
+#: src/main.c:671
+#, fuzzy
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-use-server-timestamps no establisques la marca de temps "
+"del\n"
+" fitxer local basada en la del "
+"servidor.\n"
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps no establisques la marca de temps "
+"del\n"
+" fitxer local basada en la del "
+"servidor.\n"
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response mostra les respostes del servidor.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider no baixes res.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEGONS estableix tots els temps d'espera a "
+"SEGONS.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADREÇA vincula't a l'ADREÇA (nom del servidor o IP) "
+"a\n"
+" localhost.\n"
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEGONS estableix el temps d'espera de DNS a "
+"SEGONS.\n"
+
+#: src/main.c:691
+#, fuzzy
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEGONS estableix el temps d'espera de connexió a\n"
+" SEGONS.\n"
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEGONS estableix el temps d'espera de lectura en\n"
+" SEGONS.\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SEGONS fes una pausa de SEGONS entre baixades.\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEGONS fes una pausa entre intents de baixada de\n"
+" 1…SEGONS.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait fes una pausa de 0.5*PAUSA…1.5*PAUSA "
+"segons\n"
+" entre baixades.\n"
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy inhabilita explícitament l'ús del servidor\n"
+" intermediari.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NOMBRE estableix la quota de baixada a NOMBRE.\n"
+
+#: src/main.c:708
+#, fuzzy
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADREÇA vincula't a l'ADREÇA (nom del servidor o IP) "
+"a\n"
+" localhost.\n"
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=NOMBRE estableix el límit d'octets per segon.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache no uses memòria cau en la resolució de "
+"noms\n"
+" de domini.\n"
+
+#: src/main.c:714
+#, fuzzy
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=SO restringeix determinats caràcters dels noms\n"
+" dels fitxers als que el SO (sistema "
+"operatiu)\n"
+" permeta.\n"
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case descarta les diferències de capitalització "
+"quan\n"
+" es busquen fitxers/directoris coincidents.\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only connecta només a adreces IPv4.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only connecta només a adreces IPv6.\n"
+
+#: src/main.c:723
+#, fuzzy
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIA connecta primer a les adreces de la família "
+"especificada,\n"
+" IPv6, IPv4 o cap.\n"
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=USUARI estableix els usuaris de ftp i http a "
+"USUARI.\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=CONTRASENYA estableix la contrasenya de ftp i http a\n"
+" CONTRASENYA.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password demana la contrasenya.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri inhabilita el suport per a IRI.\n"
+
+#: src/main.c:742
+#, fuzzy
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=COD empra COD com a codificació local pels "
+"IRI.\n"
+
+#: src/main.c:744
+#, fuzzy
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=COD empra COD com a codificació remota per "
+"defecte.\n"
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink suprimeix el fitxer abans de sobreescriure'l\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --warc-cdx escriu fitxers d'índex CDX.\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Directoris:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories no crees directoris.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories força la creació de directoris.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories no crees els directoris del servidor.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories usa el nom del protocol als directoris.\n"
+
+#: src/main.c:774
+#, fuzzy
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX desa els fitxers a PREFIX/…\n"
+
+#: src/main.c:776
+#, fuzzy
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NOMBRE omet NOMBRE components de l'estructura de\n"
+" directoris remota.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opcions d'HTTP:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USUARI estableix l'usuari http en USUARI.\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-passwd=PASS estableix la contrasenya http en PASS.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache no admetes dades de la memòria cau del "
+"servidor.\n"
+
+#: src/main.c:788
+#, fuzzy
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NOM Canvia el nom per defecte de la pàgina\n"
+" (normalment aquest és «index.html».).\n"
+
+#: src/main.c:791
+#, fuzzy
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension desa els documents HTML/S amb extensions\n"
+" correctes.\n"
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length descarta la capçalera «Content-Length».\n"
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=CADENA insereix CADENA entre les capçaleres.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+#, fuzzy
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect redireccions màximes permeses per pàgina.\n"
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=USUARI estableix l'usuari pel proxy a USUARI.\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-passwd=PASS estableix la contrasenya pel proxy a PASS.\n"
+
+#: src/main.c:807
+#, fuzzy
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inclou una capçalera «Referer» a la petició "
+"HTTP.\n"
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers desa les capçaleres HTTP en un fitxer.\n"
+
+#: src/main.c:811
+#, fuzzy
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifica't com a AGENT en lloc de Wget/"
+"VERSIÓ.\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive inhabilita el «keep-alive» d'HTTP\n"
+" (connexions persistents)\n"
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies no utilitzes galetes.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FITXER carrega les galetes de FITXER abans de\n"
+" la sessió.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FITXER desa les cookies a FITXER després de la "
+"sessió.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies carrega i desa les galetes de la sessió\n"
+" (no permanents)\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=CADENA usa el mètode POST, envia CADENA com a "
+"dades.\n"
+
+#: src/main.c:825
+#, fuzzy
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FITXER usa el mètode POST, envia els continguts de\n"
+" FITXER.\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=MètodeHTTP empra el mètode «MètodeHTTP» a la "
+"petició\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=CADENA envia CADENA com a dades. --method HA "
+"D'ESTAR establert.\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FITXER envia el contingut de FITXER.\n"
+" --method HA D'ESTAR establert\n"
+
+#: src/main.c:833
+#, fuzzy
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition respecta la capçalera Content-Disposition "
+"quan\n"
+" es seleccionen noms de fitxers locals\n"
+" (EXPERIMENTAL)\n"
+
+#: src/main.c:836
+#, fuzzy
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error mostra el contingut rebut als errors del\n"
+" servidor.\n"
+
+#: src/main.c:838
+#, fuzzy
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge envia informació d'autenticació HTTP bàsica\n"
+" sense primer esperar la negociació del\n"
+" servidor.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opcions d'HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR selecciona el protocol segur, d'entre auto,\n"
+" SSLv2, SSLv3, TLSv1.\n"
+
+#: src/main.c:850
+#, fuzzy
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " -L, --relative només segueix enllaços relatius.\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate no valides el certificat del servidor.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificat=FITXER fitxer del certificat del client.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIPUS tipus de certificat del client, PEM o DER.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FITXER fitxer de clau privada.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIPUS tipus de clau privada, PEM o DER.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FITXER fitxer amb el conjunt de CA.\n"
+
+#: src/main.c:864
+#, fuzzy
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR directori on s'emmagatzema una llista de\n"
+" dispersió de CA.\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=FITXER fitxer amb el conjunt de CA.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+#, fuzzy
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FITXER fitxer amb dades aleatòries per a fer de\n"
+" llavor per al SSL PRNG.\n"
+
+#: src/main.c:878
+#, fuzzy
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FITXER fitxer que anomena el sòcol EGD amb dades "
+"aleatòries.\n"
+"\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "Opcions d'HTTP:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+" --no-cache no admetes dades de la memòria cau del "
+"servidor.\n"
+
+#: src/main.c:893
+#, fuzzy
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr " -v, --verbose mode detallat (per defecte).\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opcions d'FTP:\n"
+
+#: src/main.c:901
+#, fuzzy
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Empra el format Stream_LF per a tots els "
+"fitxers\n"
+" d'FTP binaris.\n"
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=USUARI estableix l'usuari de ftp a USUARI.\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=PASS estableix la contrasenya de ftp a PASS.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing no suprimeixes els fitxers «.listing».\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob inhabilita l'ús de comodins de fitxers per a "
+"FTP.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp inhabilita el mode de transferència "
+"«passiu».\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions preserva els permisos dels fitxers remots.\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks en mode de recursió, baixa els fitxers\n"
+" apuntats per enllaços simbòlics que no "
+"siguen\n"
+" directoris\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "Opcions d'FTP:\n"
+
+#: src/main.c:923
+#, fuzzy
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftp-stmlf Empra el format Stream_LF per a tots els "
+"fitxers\n"
+" d'FTP binaris.\n"
+
+#: src/main.c:925
+#, fuzzy
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --trust-server-names empra el nom especificat per l'últim\n"
+" component de l'URL de la redirecció.\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opcions de WARC:\n"
+
+#: src/main.c:936
+#, fuzzy
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FITXER desa les dades de petició/resposta a un "
+"fitxer\n"
+" .warc.gz.\n"
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=CADENA insereix CADENA al registre warcinfo.\n"
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NÚMERO estableix la mida màxima dels fitxers WARC\n"
+" a NÚMERO.\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx escriu fitxers d'índex CDX.\n"
+
+#: src/main.c:944
+#, fuzzy
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FITXER no emmagatzemes registres llistats en "
+"aquest\n"
+" fitxer CDX.\n"
+
+#: src/main.c:947
+#, fuzzy
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression no comprimeixes els fitxers WARC amb GZIP.\n"
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests no calcules els resums SHA1.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log no emmagatzemes el fitxer de registre en un "
+"registre WARC.\n"
+
+#: src/main.c:954
+#, fuzzy
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTORI ubicació per als fitxers temporals creats\n"
+" per l'escriptor WARC.\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Baixada recursiva:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive baixa de forma recursiva.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NOMBRE nivell màxim de recursió (inf o 0 per infinit).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after suprimeix els fitxers locals un cop baixats.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links fes que els enllaços a l'HTML o CSS baixat "
+"apunten\n"
+" als fitxers locals.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+#, fuzzy
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr " --warc-cdx escriu fitxers d'índex CDX.\n"
+
+#: src/main.c:976
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted fes una còpia dels fitxers com a X_orig abans\n"
+" de convertir-los.\n"
+
+#: src/main.c:979
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted fes una còpia dels fitxers com a X.orig abans\n"
+" de convertir-los.\n"
+
+#: src/main.c:982
+#, fuzzy
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror opció equivalent -N -r -l inf -no-remove-"
+"listings.\n"
+
+#: src/main.c:984
+#, fuzzy
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites baixa totes les imatges, etc. necessàries per\n"
+" veure el document HTML.\n"
+
+#: src/main.c:986
+#, fuzzy
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments activa la gestió estricta (SGML) de comentaris "
+"HTML.\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Inclusió/exclusió en mode recursiu:\n"
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LLISTA llista separada per comes d'extensions\n"
+" acceptades.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LLISTA llista separada per comes d'extensions\n"
+" rebutjades.\n"
+
+#: src/main.c:996
+#, fuzzy
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=EXPREG expressió regular que coincideix amb URL\n"
+" acceptades.\n"
+
+#: src/main.c:998
+#, fuzzy
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=EXPREG expressió regular que coincideix amb URL\n"
+" rebutjades.\n"
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TIPUS tipus d'expressió regular (posix|pcre).\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYPE regex type (posix).\n"
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LLISTA llista separada per comes de dominis\n"
+" acceptats.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LLISTA llista separada per comes de dominis\n"
+" rebutjats.\n"
+
+#: src/main.c:1011
+#, fuzzy
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp segueix enllaços FTP en documents HTML.\n"
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LLISTA llista separada per comes d'etiquetes "
+"HTML\n"
+" que es segueixen.\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" -G, --ignore-tags=LLISTA llista separada per comes d'etiquetes "
+"HTML\n"
+" ignorades.\n"
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts segueix enllaços a altres llocs en mode\n"
+" de recursió.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative només segueix enllaços relatius.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LLISTA llista de directoris acceptats.\n"
+
+#: src/main.c:1023
+#, fuzzy
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names empra el nom especificat per l'últim\n"
+" component de l'URL de la redirecció.\n"
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LLISTA llista de directoris rebutjats.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent no ascendeixes al directori pare.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, un baixador de xarxa no interactiu.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Contrasenya per a l'usuari %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Contrasenya: "
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "no es pot crear una canonada"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Contrasenya per a l'usuari %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Construcció: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Enllaç: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s construït el %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (entorn)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (usuari)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © 2011 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Llicència GPLv3+: GNU GPL versió 3 o posterior\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Aquest és programari lliure: podeu modificarâ€lo i redistribuirâ€lo si voleu.\n"
+"No hi ha CAP GARANTIA, en la mesura que ho permeta la llei.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Escrit originàriament per Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Envieu informes d'error i preguntes a <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "S'ha produït un problema d'assignació de memòria\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "S'està eixint degut a un error en %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Proveu «%s --help» per a veure més opcions.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: l'opció «-n%c» és il·legal\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"El suport per a depuració no està compilat. S'està descartant el senyalador "
+"--debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"S'ha especificat --no-clober i --convert-links, només s'emprarà --convert-"
+"links.\n"
+
+#: src/main.c:1608
+#, fuzzy, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"S'ha especificat --no-clober i --convert-links, només s'emprarà --convert-"
+"links.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "No es pot donar informació i ser silenciós al mateix temps.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"No té sentit no sobreescriure fitxers i fer marques de temps al mateix "
+"temps.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "No es pot especificar --inet4-only i --inet6-only a l'hora.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"No es pot especificar -k i -O a l'hora si es donen múltiples URL, o en\n"
+"combinació amb -p o -r. Vegeu el manual per a més detalls.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVÃS: combinar -O amb -r o -p voldrà dir que tot el contingut baixat es\n"
+"posarà a l'únic fitxer que especifiqueu.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVÃS: les marques de temps no fan res en combinació amb -O. Vegeu el manual\n"
+"per a més detalls.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"L'eixida WARC no funciona amb --no-clobber, s'inhabilitarà --no-clobber.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"L'eixida WARC no funciona amb marques de temps, s'inhabilitarà la impressió "
+"de marques de temps.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "L'eixida WARC no funciona amb --spider.\n"
+
+#: src/main.c:1721
+#, fuzzy, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"L'eixida WARC no funciona amb --continue o --start-pos, s'inhabilitaran."
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Els resums són inhabilitats; la deduplicació WARC no trobarà registres "
+"duplicats.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"L'eixida WARC no funciona amb --continue o --start-pos, s'inhabilitaran."
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "No es pot especificar --ask-password i --password a l'hora.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"No és recomanat emprar tant --start-pos i --continue; s'inhabilitarà --"
+"continue.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: falta l'URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "No es pot especificar --post-data i --post-file a l'hora.\n"
+
+#: src/main.c:1841
+#, fuzzy, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"No podeu emprar --post-data o --post-file amb --method. --method espera les "
+"dades a través de les opcions --body-data i --body-file"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Heu d'especificar un mètode a través de --method=MètodeHTTP per emprar amb --"
+"body-data o --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "No es pot especificar --body-data i --body-file a l'hora.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Aquesta versió no implementa IRI\n"
+
+#: src/main.c:2003
+#, fuzzy, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k només es pot emprar amb -O si es desa la sortida a un fitxer normal.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"-k només es pot emprar amb -O si es desa la sortida a un fitxer normal.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "No s'ha pogut suprimir l'enllaç simbòlic %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: no s'ha pogut resoldre l'adreça del servidor «%s»\n"
+
+#: src/main.c:2060
+#, fuzzy, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "ERROR: No s'ha pogut obrir el certificat %s: (%d).\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "No s'ha trobat cap URL a %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "No s'ha pogut suprimir %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FINALITZAT --%s--\n"
+"Temps total real: %s\n"
+"Baixat: %d fitxers, %s en %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "S'ha EXCEDIT la quota de baixada de %s.\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Ha fallat la tunelització del servidor intermediari: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "No s'ha pogut suprimir %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, fuzzy, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "L'ai_socktype no està implementat"
+
+#: src/metalink.c:509
+#, fuzzy
+msgid "Could not open downloaded file.\n"
+msgstr "No s'ha pogut escriure al fitxer WARC.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "El fitxer %s no existeix.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+#, fuzzy
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "No s'ha pogut obrir el fitxer CDX per escriure l'eixida.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "No s'ha trobat cap certificat\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "S'està suprimint %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "S'esta continuant en segon terme.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "S'està continuant en segon terme, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "La sortida s'escriurà a %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "Ha fallat fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "Ha fallat fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: No s'ha trobat cap controlador de sòcol usable.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "Ha fallat ioctl(). No s'ha pogut establir el sòcol com a blocant.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: avís: el testimoni %s apareix abans que cap nom de màquina.\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: component desconegut \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Forma d'ús: %s NETRC [HOST]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: no s'ha pogut determinar l'estat de %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVÃS: s'està utilitzant una llavor aleatòria febla.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"No s'ha pogut donar una llavor al PRNG; considereu emprar --random-file.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "La vostra versió d'OpenSSL és massa antiga per suportar TLSv1.1\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "La vostra versió d'OpenSSL és massa antiga per suportar TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "La vostra versió d'OpenSSL és massa antiga per suportar TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"OpenSSL: el valor %d per l'opció «secure-protocol» no està implementat\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: L'URL %s no és vàlid: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"No s'ha pogut donar una llavor al PRNG; considereu emprar --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: no es pot verificar el certificat de %s, emès per %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " No s'ha pogut verificar localment l'autoritat de l'emetent.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " S'ha trobat un certificat autosignat.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " El certificat encara no és vàlid.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " El certificat ha caducat.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: cap nom comú alternatiu del certificat concorda\n"
+"\tamb el nom del servidor demanat %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+"%s: el nom comú «%s» del certificat no concorda amb el nom del servidor "
+"demanat %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: el nom comú del certificat és invàlid (conté un caràcter NUL).\n"
+" Això pot ser un indicador de que el servidor no és qui diu que és\n"
+" (és a dir, no és el %s real).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Per a connectar a %s de manera insegura, useu «--no-check-certificate».\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ s'està ometent %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "L'especificació de l'estil de progrés %s no és vàlida; no es canvia.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " en "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "No es pot obtenir la frequència del rellotge en TEMPS REAL: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "S'està suprimint %s ja que no s'hauria de baixar.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "No es pot obrir %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "S'està llegint el robots.txt; si us plau, ignoreu els errors.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr ""
+"S'ha produït un error en analitzar la URL del servidor intermediari %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr ""
+"Hi ha un error a la URL del servidor intermediari %s: Ha de ser HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "S'ha excedit el màxim de redireccions (%d).\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"S'està abandonant.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"S'està reintentant.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"No s'ha trobat cap enllaç trencat.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"S'ha trobat %d enllaç trencat.\n"
+"\n"
+msgstr[1] ""
+"S'han trobat %d enllaços trencats.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Cap error"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "L'esquema %s no està implementat"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Manca l'esquema"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "El nom del servidor és invàlid"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "El número de port és incorrecte"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nom d'usuari no vàlid"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "L'adreça numèrica IPv6 no està terminada"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Les adreces IPv6 no estan implementades"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "L'adreça numèrica IPv6 no és vàlida"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "La implementació d'HTTPS no s'ha inclòs a la construcció"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "S'ha trobat una seqüència multioctet incompleta o invàlida\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: No s'ha pogut la memòria suficient; s'ha exhaurit la memòria.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: No s'ha pogut assignar %ld octets; s'ha exhaurit la memòria.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: la memòria intermèdia de text és massa gran (%ld octets), "
+"s'està avortant.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Es continua en segon terme, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "No s'ha pogut suprimir l'enllaç simbòlic %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "ERROR: No s'ha pogut obrir el certificat %s: (%d).\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "No s'ha pogut obtenir la galeta per a %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "ERROR: No s'ha pogut obrir el certificat %s: (%d).\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "No s'ha pogut suprimir l'enllaç simbòlic %s: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "L'expressió regular %s no és vàlida, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "L'expressió regular %s no és vàlida, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "S'ha produït un error en la coincidència de %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "S'ha produït un error en obrir el fitxer WARC %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "S'ha produït un error en obrir el fitxer WARC %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "S'ha produït un error en obrir el fitxer WARC %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "S'ha produït un error en obrir el flux GZIP al fitxer WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "No s'ha pogut escriure el registre warcinfo al fitxer WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"S'està obrint el fitxer WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "S'ha produït un error en obrir el fitxer WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "El fitxer CDX no llista les url originals. (Manca la columna «a».)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+"El fitxer CDX no llista les sumes de comprovació. (Manca la columna «k».)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"El fitxer CDX no llista les id dels registres. (Manca la columna «u».)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] "S'ha carregat %d registre de CDX.\n"
+msgstr[1] "S'han carregat %d registres de CDX.\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "No s'ha pogut llegir el fitxer CDX %s per a deduplicar.\n"
+
+#: src/warc.c:1181
+#, fuzzy
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "No s'ha pogut escriure al fitxer temporal WARC.\n"
+
+#: src/warc.c:1191
+#, fuzzy
+msgid "Could not open temporary WARC log file.\n"
+msgstr "No s'ha pogut escriure al fitxer temporal WARC.\n"
+
+#: src/warc.c:1200
+#, fuzzy
+msgid "Could not open WARC file.\n"
+msgstr "No s'ha pogut escriure al fitxer WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "No s'ha pogut obrir el fitxer CDX per escriure l'eixida.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "No s'ha pogut obrir el fitxer temporal WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"S'ha trobat la coincidència exacta al fitxer CDX. S'està desant el registre "
+"de revisita al WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "S'ha produït un error del sistema desconegut"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "La família d'adreces per al nom del servidor no està implementada"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "El valor per a ai_flags és erroni"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "S'ha produït un error no recuperable en la resolució de noms"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "L'ai_family no està implementat"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "S'ha produït una fallada d'assignació de memòria"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "No hi ha cap adreça associada al nom del servidor"
+
+#~ msgid "Name or service not known"
+#~ msgstr "El nom o servei no és conegut"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "El servname no està implementat per a ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "S'ha produït un error del sistema"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "El búfer de l'argument és massa xicotet"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "S'està processant la petició en progrés"
+
+#~ msgid "Request canceled"
+#~ msgstr "S'ha cancel·lat la petició"
+
+#~ msgid "Request not canceled"
+#~ msgstr "No s'ha cancel·lat la petició"
+
+#~ msgid "All requests done"
+#~ msgstr "S'han processat totes les peticions"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Ha estat interromput per un senyal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "La cadena del paràmetre no està codificada correctament"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: l'opció «%s» és ambigua; possibilitats:"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opció «--%s» no admet arguments\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opció «%c%s» no admet arguments\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: l'opció «--%s» necessita un argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: l'opció «--%s» no és reconeguda\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: l'opció «%c%s» no és reconeguda\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: l'opció «%c» no és vàlida\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s l'opció «%c» necessita un argument\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: l'opció «-W %s» és ambigua\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opció «-W %s» no admet arguments\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: l'opció «-W %s» necessita un argument\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "Success"
+#~ msgstr "Èxit"
+
+#~ msgid "No match"
+#~ msgstr "Cap coincidència"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "L'expressió regular no és vàlida"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "El caràcter de col·lació no és vàlid"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "El nom de la classe de caràcter és invàlid"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Barra invertida final"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "La referència inversa és invàlida"
+
+#~ msgid "Unmatched [ or [^"
+#~ msgstr "[ o [^ desaparellat"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( o \\( desaparellat"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ desaparellat"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "El contingut de \\{\\} és invàlid"
+
+#~ msgid "Invalid range end"
+#~ msgstr "El final del rang és invàlid"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "La memòria s'ha exhaurit"
+
+#, fuzzy
+#~| msgid "Invalid regular expression %s, %s\n"
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "L'expressió regular %s no és vàlida, %s\n"
+
+#, fuzzy
+#~| msgid "Invalid regular expression %s, %s\n"
+#~ msgid "Premature end of regular expression"
+#~ msgstr "L'expressió regular %s no és vàlida, %s\n"
+
+#, fuzzy
+#~| msgid "Invalid regular expression %s, %s\n"
+#~ msgid "Regular expression too big"
+#~ msgstr "L'expressió regular %s no és vàlida, %s\n"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") o \\) desaparellat"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "No hi ha una expressió regular %s prèvia"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "El subprocés %s ha fallat"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle ha fallat"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "no es pot restaurar el fd %d: dup2 ha fallat"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "subprocés %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "El subprocés %s ha obtingut el senyal fatal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "la memòria s'ha exhaurit"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "Ha fallat «idn_decode» (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "S'ha rebut %s.\n"
+
+#, fuzzy
+#~| msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr "Envieu informes d'error i suggeriments a <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "El fitxer «%s» ja existeix, no es baixa.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Ha fallat l'autorització.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "AVÃS: No es pot tornar a obrir la sortida estàndard al mode binari.\n"
+#~ " El fitxer baixat pot contindre finals de línia erronis.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: l'opció és il·legal -- %c\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL afegeix el prefix URL a tots els enllaços "
+#~ "relatius en -F -i fitxer.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Actualment mantingut per Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid "Cannot specify -r, -p or -N if -O is given.\n"
+#~ msgstr "No es pot especificar -r, -p o -N si es dóna -O.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "S'ha produït un error a la capçalera Set-Cookie, camp «%s»"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - S'ha tancat la connexió a l'octet %s/%s. "
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: El booleà estès «%s» no és vàlid; useu «always», «on», «off» o "
+#~ "«never».\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr ""
+#~ " -Y, --proxy habilita explícitament l'ús del "
+#~ "servidor\n"
+#~ " intermediari.\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Aquest programa es distribueix amb l'esperança que sigui útil, però\n"
+#~ "SENSE CAP MENA DE GARANTIA; ni tan sols amb la garantia implícita de\n"
+#~ "COMERCIABILITAT o IDONEÃTAT PER A UN PROPÃ’SIT PARTICULAR. Vegeu la\n"
+#~ "llicència GNU General Public License per a més informació.\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr ""
+#~ "%s: S'ha produït un error en la verificació del certificat per a %s: %s\n"
+
+#~ msgid "Failed writing to proxy: %s.\n"
+#~ msgstr "S'ha produït un error en escriure al servidor intermediari: %s.\n"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "El fitxer «%s» ja existeix, no es baixa.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%s/%s])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - s'ha desat «%s» [%s/%s])\n"
+#~ "\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Servidor no especificat"
diff --git a/po/cs.gmo b/po/cs.gmo
new file mode 100644
index 0000000..27f06a7
--- /dev/null
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..1af49dc
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,3979 @@
+# Czech translations for GNU wget
+# Copyright (C) 1998, 2000, 2001 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Jan Prikryl <prikryl@acm.org>, 1998, 2000, 2001
+# Petr Pisar <petr.pisar@atlas.cz>, 2007, 2008, 2009, 2010, 2012, 2013, 2015.
+# Petr Pisar <petr.pisar@atlas.cz>, 2016, 2017, 2018, 2020.
+#
+# Translations from bundled gnulib:
+#
+# This file is distributed under the same license as the gnulib package.
+# Copyright (C) 1996 Free Software Foundation, Inc.
+# Vladimir Michl <Vladimir.Michl@seznam.cz>, 1996.
+# Marek Černocký <marek@manet.cz>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 17:19+02:00\n"
+"Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n"
+"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: adresu pro přilepení %s nelze přeložit, vypínám přilepování (bind(2)).\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Navazuje se spojení s %s|%s|:%d… "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Navazuje se spojení s %s:%d… "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Navazuje se spojení s [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "volání setsockopt(SO_RCVBUF) selhalo: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "spojeno.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "nezdařilo se: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: adresu poÄítaÄe %s nelze pÅ™eložit\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "volání setsockopt(SO_REUSEADDR) selhalo: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Příliš mnoho otevřených souborů. Volání select() nelze použít pro deskriptor "
+">= %d\n"
+
+# TODO: Pluralize
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Odkazy převedeny v %d souborech převedeno za %s sekund.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Převádí se odkazy v %s… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nic není potřeba převádět.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nelze převést odkazy v %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "%s nebylo možné smazat: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Nelze zálohovat %s jako %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Pro %s nelze získat cookie\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaktická chyba v hlaviÄce Set-Cookie: %s na pozici %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie přišedši z %s se pokusila nastavit doménu na "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Soubor s cookie %s nelze otevřít: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Při zápisu do %s nastala chyba: %s.\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Při uzavírání %s nastala chyba: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Nepodporovaný typ výpisu, použije se Unixový parser.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Obsah /%s na %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Äas neznámý "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Soubor "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Adresář "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Sym. odkaz "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Neznámý typ "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtů)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Délka: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) zbývá"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s zbývá"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (není směrodatné)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL nelze inicializovat. Bude zakázáno.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Probíhá přihlašování jako %s… "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ""
+"Řídicí spojení bude ukonÄeno, protože server odpovÄ›dÄ›l chybovým hlášením.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Úvodní odpovÄ›Ä serveru je chybná.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Řídicí spojení bude ukonÄeno, protože nelze zapsat data.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Server odmítá přihlášení.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Chyba při přihlášení.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Přihlášeno!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Server nepřijal příkaz „PBSZ 0“.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Server nepřijal příkaz „PROT %c“.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr ""
+"Nelze zjistit typ vzdáleného operaÄního systému, protože server odpovÄ›dÄ›l "
+"chybovým hlášením.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "hotovo. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "hotovo.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr ""
+"Řídicí spojení bude ukonÄeno, protože je požadován neznámý typ pÅ™enosu "
+"„%c“.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "hotovo."
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD není potřeba.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Dosažena logicky nemožná sekce v getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Adresář %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD není potřeba.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Soubor již byl přenesen.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nelze spustit pasivní přenos dat.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "OdpovÄ›Ä na PASV není pochopitelná.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "s %s na portu %d se nelze spojit: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Chyba při přilepování (bind) (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Neplatný PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Příkaz REST selhal, pÅ™enos zaÄne od zaÄátku souboru.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Soubor %s existuje.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Soubor %s neexistuje.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Soubor %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Soubor Äi adresář %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s se objevil.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, řídicí spojení bude ukonÄeno.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) – Datové spojení: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Řídicí spojení bylo ukonÄeno.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "PÅ™enos dat byl pÅ™edÄasnÄ› ukonÄen.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Soubor %s je již přítomen, nebude přenášen.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(pokus:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) – zapsáno na standardní výstup %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) – %s uložen [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Maže se %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Seznam souborů bude doÄasnÄ› uložen v %s.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Soubor %s byl odstraněn.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Hloubka rekurze %d pÅ™ekroÄila maximální hloubku %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Vzdálený soubor není novější než lokální soubor %s, a není jej třeba "
+"stahovat.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Vzdálený soubor je novější než lokální soubor %s, a je jej třeba stáhnout.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Velikosti se neshodují (lokální %s), stahuji.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Přeskakuje se symbolický odkaz, neboť název odkazu není platný.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Korektní symbolický odkaz %s -> %s již existuje.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Vytváří se symbolický odkaz %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Symbolické odkazy nejsou podporovány, symbolický odkaz %s bude vynechán.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Adresář %s bude vynechán.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: neznámý/nepodporovaný typ souboru.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Nastavení práv k souboru „%s“ selhalo.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: Äasové razítko souboru je poruÅ¡ené.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Podadresáře se nebudou přenášet, protože již bylo dosaženo hloubky %d "
+"(maximum je %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+"Do adresáře %s se nesestoupí, protože tento adresář se buÄ má vynechat, nebo "
+"nebyl zadán k procházení.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s se zamítá.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s se zamítá (neplatný záznam).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s je vynechán/nezahrnut kvůli regulárnímu výrazu.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Při porovnávání %s s %s došlo k chybě: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Vzorku %s nic neodpovídá.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Výpis adresáře v HTML formátu byl zapsán do %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Výpis adresáře v HTML formátu byl zapsán do %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "CHYBA: Adresář %s nelze otevřít.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "CHYBA: Certifikát %s nelze otevřít: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Certifikát certifikaÄní autority „%s“ zaveden\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "CHYBA: Soubor s CRL „%s“ nelze zavést: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Soubor s CRL „%s“ byl zaveden\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "CHYBA: GnuTLS vyžaduje, aby formát souboru a certifikátu byl stejný.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Vaše verze GnuTLS je příliš stará, aby podporovala TLSv1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: neimplementovaná hodnota %u volby „secure-protocol“\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr ""
+"Prosím, tento problém nahlaste (anglicky) na adresu <bug-wget@gnu.org>\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: neimplementovaná hodnota %d volby „secure-protocol“\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Řetězec s prioritami nelze přímo nastavit. Návrat k výchozí "
+"prioritÄ›.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "CHYBA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "VAROVÃNÃ"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s nepředložil žádný certifikát.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Certifikát %s není důvěryhodný.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certifikát %s nemá známého vydavatele.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Certifikát %s byl odvolán.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Podepisovatel certifikátu %s nebyl certifikaÄní autorita.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Certifikát pro %s byl podepsán pomocí nebezpeÄného algoritmu.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certifikát pro %s ještě nevstoupil v platnost.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certifikátu pro %s vypršela platnost.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Chyba při inicializaci X509 certifikátu: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Žádný certifikát nenalezen\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Chyba při rozebírání certifikátu: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certifikát ještě nenabyl platnosti.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certifikátu uplynula doba platnosti\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Jméno vlastníka certifikátu se neshoduje se jménem poÄítaÄe %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "VeÅ™ejný klÃ­Ä se neshoduje s uloženým veÅ™ejným klíÄem!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certifikát musí být typu X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Chyba při zpracování seznamu adres.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Neznámé jméno poÄítaÄe"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "DoÄasná chyba pÅ™i pÅ™ekladu jména"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Neznámá chyba"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Překládám %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "selhal: Pro dané jméno neexistuje žádná IPv4/IPv6 adresa.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "selhal: vyprÅ¡el Äasový limit.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Neúplný odkaz %s nelze vyhodnotit.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"V %s nalezen atribut no-follow. Na této stránce nebudou následovány žádné "
+"odkazy\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Neplatné URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Nebylo možné odeslat HTTP požadavek: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Chybí hlaviÄky, pÅ™edpokládám HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Soubor %s je již přítomen, nebude přenášen.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "Funkce gmtime() selhala. Jedná se asi o chybu.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"ÄŒasový údaj nelze pÅ™evést na formát HTTP. Jako Äas poslední úpravy se požije "
+"0.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Soubor %s s daty pro BODY chybí: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Využije se existující spojení s [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Využije se existující spojení s %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Chyba pÅ™i Ätení odpovÄ›di od proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s CHYBA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "OdpovÄ›Ä serveru má zkomolený stavový řádek"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunelování skrz proxy se nezdařilo: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Server požaduje neznámý způsob autentizace.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Vybraná autentizace: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Ukládám do: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Při stahování podpisu:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Z doÄasného souboru se nepodaÅ™ilo naÄíst podpis. PÅ™eskakuje se.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "DoÄasný soubor nebylo možné vytvoÅ™it. Stažení podpisu se pÅ™eskakuje.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Neplatná hodnota pri. Předpokládá se %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Nebylo možné nalézt algoritmus otisku přijatelný pro metalinkové zdroje.\n"
+"Ignorují se.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Vypínám SSL kvůli chybám, které se vyskytly.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s požadavek odeslán, program Äeká na odpověą "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nepřišla žádná data.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Chyba (%s) pÅ™i Ätení hlaviÄek.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(žádný popis)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Přesměrováno na: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "neudáno"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [následuji]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Soubor %s nebyl na serveru změněn. Stažení se vynechává.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Server ignoroval hlaviÄku If-Modified-Since u souboru %s.\n"
+"Možná byste chtÄ›li pÅ™idat pÅ™epínaÄ --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Soubor je již plně přenesen, nebude se nic dělat.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Délka: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "je ignorována"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Varování: HTTP nepodporuje žolíkové znaky.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Aktivován režim pavouka. Kontroluje, zda vzdálený soubor existuje.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nelze zapsat do %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "V pÅ™ijaté hlaviÄce chybí požadovaný atribut.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autentizace jménem a heslem se nezdařila.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Nelze zapsat do souboru WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Nelze zapsat do doÄasného souboru WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nebylo možné navázat SSL spojení.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "%s nelze smazat (%s).\n"
+
+# , c-format
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "CHYBA: Přesměrování (%d) bez udané nové adresy.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"V odpovědi HTTP nebylo možné najít metalinková data. Soubor se stahuje\n"
+"pomocí HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Nalezeny hlaviÄky metalinku. PÅ™epíná se do režimu metalinku.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Vzdálený soubor neexistuje – slepý odkaz!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Nelze použít Äasová razítka, protože v odpovÄ›di serveru \n"
+"schází hlaviÄka „Last-modified“.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"ÄŒasové razítko souboru bude ignorováno, protože hlaviÄka \n"
+"„Last-modified“ obsahuje neplatné údaje.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Soubor na serveru není novější než lokální soubor %s – nebude přenášen.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Velikosti se neshodují (lokální %s), stahuji.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Lokální soubor je starší a vzdálený soubor se proto bude přenášet.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Vzdálený soubor existuje a mohl by obsahovat odkazy na další zdroje – "
+"stahuji.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Vzdálený soubor existuje, ale neobsahuje žádné odkazy – nestahuji.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Vzdálený soubor existuje a možná obsahuje další odkazy,\n"
+"avšak rekurze je vypnuta – nestahuji.\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Vzdálený soubor existuje.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) – zapsáno na standardní výstup %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) – %s uloženo [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) – Spojení ukonÄeno na bajtu %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) – Chyba pÅ™i Ätení dat na bajtu %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) – Chyba pÅ™i Ätení dat na bajtu %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nepodporovaná kvalita ochrany „%s“.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nepodporovaný algoritmus „%s“.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC ukazuje na %s, kam nebylo možné přistoupit kvůli chybě: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Nelze pÅ™eÄíst %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Chyba v %s na řádku %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaktická chyba v %s na řádku %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Neznámý příkaz %s v %s na řádku %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Rozbor systémového souboru wgetrc (proměnná prostředí SYSTEM_WGETRC) "
+"selhalo.\n"
+"Prosím, prověřte „%s“\n"
+"nebo urÄete jiný soubor pomocí --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Rozbor systémového souboru wgetrc selhal. Prosím, prověřte\n"
+"„%s“\n"
+"nebo urÄete jiný soubor pomocí --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Varování: Globální i uživatelský wgetrc jsou shodně uloženy v %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Neplatný příkaz --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: Neplatná pravdivostní hodnota %s, použijte „on“ (zapnuto) nebo "
+"„off“ (vypnuto).\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: Neplatná hodnota %s, použijte „on“ (zapnuto), „off“ (vypnuto) nebo "
+"„quiet“ (potichu).\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Neplatné Äíslo %s\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s lze použít jen jednou\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Neplatná hodnota bajtu %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Neplatná Äasová perioda %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Záporná Äasová perioda %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass vyžaduje Å™etÄ›zec nebo buÄ nastavenou promÄ›nnou prostÅ™edí\n"
+"WGET_ASKPASS, nebo SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Neplatná hodnota %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Neplatná hlaviÄka %s\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Neplatná hlaviÄka WARC %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Neplatný druh indikace postupu %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Neplatná hodnota omezení %s,\n"
+" použijte [unix|vms|windows],[lowercase|uppercase],[nocontrol][ascii]\n"
+" (význam Äesky: [malá|velká písmena], [neřídicí][ASCII].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kódování %s není platné\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Převod z %s do %s není podporován\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Zaznamenána neúplná nebo neplatná vícebajtová posloupnost\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Neobsloužená chyba Ä. %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: národní prostředí není nastaveno\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode selhala (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Nebylo možné převést na malá písmena: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Výstup se přesměrovává do %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s: vypínám protokolování\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Použití: %s [PŘEPÃNAÄŒ]… [URL]…\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumenty povinné u dlouhých pÅ™epínaÄů jsou povinné i pro jejich krátké "
+"verze.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Rozjezd:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version zobrazí verzi Wgetu a skonÄí\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help vytiskne tuto nápovědu\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background po spuštění přejde do pozadí\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=PŘÃKAZ provede příkaz jako z „.wgetrc“\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Protokolový a vstupní soubor:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=SOUBOR protokol zapisuje do SOUBORU\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=SOUBOR zprávy připojuje k SOUBORU\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug tiskne mnoho ladicích informací\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug tiskne ladicí informace z Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tichý režim (žádný výstup)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose bude upovídaný (výchozí chování)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose vypne upovídanost, aniž by byl zcela "
+"zticha\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=ZPŮSOB datový tok vypisuje daným ZPŮSOBEM,\n"
+" ZPŮSOB může být „bits“ (bity)\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=SOUBOR stáhne URL uvedená v místním nebo\n"
+" vnějším SOUBORU\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=SOUBOR stáhne soubory uvedená v místním\n"
+" metalinkovém SOUBORU.\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html vstupní soubor považuje za HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL vyhodnocuje odkazy ve vstupním HTML (-i -"
+"F)\n"
+" relativně vzhledem k URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=SOUBOR urÄuje konfiguraÄní soubor\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config nenaÄte žádný konfiguraÄní soubor\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=SOUBOR důvody zamítnutí URL zapisuje do SOUBORU\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Stahování:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=POČET nastaví POČET opakování (0 znamená "
+"neomezeno)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused opakuje, i když spojení je odmítnuto\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=CHYBY     Äárkou oddÄ›lený seznam chyb HTTP,\n"
+" po kterých se má stažení zkusit "
+"znovu\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=SOUBOR dokumenty zapisuje do SOUBORU\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber vynechá stahování, která by přepsala již\n"
+" existující soubory\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc nezkusí získat jména a hesla z .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue obnoví stahování ÄásteÄnÄ› staženého "
+"souboru\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POZICE zaÄne stahovat od POZICE (poÄítá se od "
+"0)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=DRUH vybere druh indikátoru postupu\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress zobrazí indikátoru postupu ve všech\n"
+" úrovních upovídanosti\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nesnaží se znovu získat soubory, jež "
+"mají\n"
+" mladší místní kopii\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since nepoužívá GET požadavky podmíněné "
+"hlaviÄkou\n"
+" If-Modified-Since pÅ™i porovnání Äasu "
+"souborů\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps nenastaví Äas místního souboru podle\n"
+" souboru na serveru\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response tiskne odpovÄ›Ä serveru\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider nestahuje nic\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDY nastaví vÅ¡echny Äasové limity na SEKUNDY\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESY seznam serverů DNS na dotazy (oddělené\n"
+" Äárkou)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESA pÅ™ilepí (bind) pÅ™ekladaÄ DNS na ADRESU "
+"(jméno nebo IP)\n"
+" na tomto stroji\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNDY nastaví limit pro hledání v DNS na "
+"SEKUND\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEKUNDY nastaví limit pro navázání spojení na "
+"SEKUND\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SEKUNDY nastaví limit pro Ätení na SEKUND\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNDY Äeká SEKUND mezi každým stažením\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDY Äeká 1 až SEKUND mezi opakováním stažení\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait Äeká od 0,5*WAIT do 1,5*WAIT sekund mezi\n"
+" staženími\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy explicitnÄ› vypne proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=POČET nastaví kvótu na POČET stažení\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESA přilepí se (bind) na ADRESU (jméno nebo "
+"IP)\n"
+" na tomto stroji\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RYCHLOST omezí rychlost stahování na RYCHLOST\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache zakáže kešování DNS odpovědí\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS omezí znaky ve jménech souborů na ty,\n"
+" které dovoluje operaÄní systém OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case při porovnávání jmen souborů/adresářů\n"
+" nebere zřetel na velikost písmen\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only připojuje se jen na IPv4 adresy\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only připojuje se jen na IPv6 adresy\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=RODINA připojuje se nejprve na adresu zadané\n"
+" RODINY („IPv6“, „IPv4“ nebo "
+"„none“ (žádná))\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UŽIVATEL nastaví přihlašovací jméno uživatele\n"
+" pro FTP i pro HTTP na UŽIVATELE\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=HESLO nastaví heslo pro FTP i pro HTTP na "
+"HESLO\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password ptá se na hesla\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=PŘÃKAZ urÄuje program pro dotaz na uživatelské\n"
+" jméno a heslo. Není-li zadán žádný "
+"PŘÃKAZ,\n"
+" použijí se proměnné prostředí "
+"WGET_ASKPASS\n"
+" a SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri vypne podporu IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KÓDOVÃNà jako místní kódování IRI použije "
+"KÓDOVÃNÃ\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KÓDOVÃNà jako implicitní vzdálené kódování se\n"
+" použije KÓDOVÃNÃ\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink odstraní soubor před jeho přepisem\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash ponechá soubory se špatným kontrolním\n"
+" souÄtem (pÅ™ipojí .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=ÄŒÃSLO poÅ™adové Äíslo v metaURL metalinku\n"
+" application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http použije metalinková metadata z hlaviÄek\n"
+" odpovědi HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location preferované umístění metalinkových "
+"zdrojů\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr ukládá metadata do rozšířených atributů\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Adresáře:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories nevytváří adresáře\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories vynutí vytváření adresářů\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories nevytváří adresáře se jmény poÄítaÄů\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories použije jméno protokolu v adresářích\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=CESTA uloží soubory do CESTA/…\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=POČET ignoruje POČET vzdálených adresářových\n"
+" komponent\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "PÅ™epínaÄe pro HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=UŽIVATEL nastaví přihlašovací jméno uživatele\n"
+" pro HTTP na UŽIVATELE\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=HESLO nastaví heslo pro HTTP na HESLO\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache zakáže kešování na straně serveru\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NÃZEV zmÄ›ní výchozí název stránky (běžnÄ›\n"
+" to je „index.html“)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension HTML/CSS dokumenty ukládá s patÅ™iÄnou\n"
+" příponou\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignoruje hlaviÄku „Content-Length“\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=ŘETÄšZEC ke hlaviÄkám pÅ™idá ŘETÄšZEC\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=DRUH vybere kompresi, jedna z auto, gzip a\n"
+" none [žádná]. (výchozí: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximum přesměrování povolených na "
+"stránku\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UŽIVATEL nastaví UŽIVATELE jako přihlašovací "
+"jméno\n"
+" k proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=HESLO nastaví HESLO k proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL zahrne hlaviÄku „Referer: URL“ do HTTP\n"
+" požadavku\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers hlaviÄky HTTP uloží do souboru\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifikuje se jako AGENT místo Wget/"
+"VERZE\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive zakáže HTTP keep-alive (trvalá spojení)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies nepoužije cookies\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=SOUBOR pÅ™ed relací naÄte cookies ze SOUBORU\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=SOUBOR po relaci uloží cookies do SOUBORU\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies naÄte a uloží cookies relace (netrvalé)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ŘETĚZEC použije metodu POST, jako data pošle "
+"ŘETĚZEC\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=SOUBOR použije metodu POST, pošle obsah SOUBORU\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=METODA_HTTP v požadavku použije HTTP_METODOU\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ŘETĚZEC jako data pošle ŘETĚZEC, --method JE "
+"nutný\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=SOUBOR pošle obsah SOUBORU, --method JE nutný\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition při volbě jmen místních souborů bere "
+"v úvahu\n"
+" hlaviÄku Content-Disposition (POKUSNÉ)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error po chybě serveru vypíše přijatý obsah\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge posílá údaje Basic HTTP autentizace, aniž "
+"by\n"
+" nejprve poÄkal na výzvu od serveru\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "PÅ™epínaÄe HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PROTOKOL vybere bezpeÄnostní protokol, jeden z "
+"auto,\n"
+" SSLv2, SSLv3, TLSv1, TLSv1_1, TLSv1_2 a "
+"PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only následuje pouze bezpeÄné HTTPS odkazy\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate neověřuje certifikát serveru\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=SOUBOR soubor s certifikátem klienta\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=DRUH druh certifikátu klienta: PEM nebo DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=SOUBOR soubor se soukromým klíÄem\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=DRUH druh soukromého klíÄe: PEM nebo DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=SOUBOR soubor se sbírkou certifikaÄních autorit\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=ADRESÃŘ adresář obsahující hashe jmen\n"
+" certifikaÄních autorit\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=SOUBOR soubor se sbírkou seznamů odvolaných\n"
+" certifikátů\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=SOUBOR/OTISKY\n"
+" Soubor s veÅ™ejným klíÄem (PEM/DER) nebo\n"
+" jakýkoliv poÄet SHA-256 otisků zapsaných\n"
+" v Base64, kterým předchází „sha256//“\n"
+" a které jsou odděleny znakem „;“, proti\n"
+" kterým se ověřuje protistrana\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=SOUBOR soubor s náhodnými daty pro zdroj "
+"SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=SOUBOR soubor jmenující socket EGD s náhodnými "
+"daty\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=ŘETĚZEC Přímo nastaví řetězec s prioritami (GnuTLS)\n"
+" nebo se seznamem Å¡ifer (OpenSSL). "
+"Používejte\n"
+" s obezÅ™etností. Tento pÅ™epínaÄ pÅ™ebije\n"
+" --secure-protocol. Podoba a skladba tohoto\n"
+" řetězce závisí konkrétní implementaci SSL/"
+"TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "PÅ™epínaÄe pro HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts zakáže HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file cesta k databázi HSTS (přebije výchozí\n"
+" chování)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "PÅ™epínaÄe FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf použije formát Stream_LF pro všechny "
+"binární\n"
+" FTP soubory\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=UŽIVATEL nastaví přihlašovací jméno pro FTP na\n"
+" UŽIVATELE\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=HESLO nastaví heslo pro FTP na HESLO\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing neodstraňuje soubory „.listing“\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob neexpanduje jména FTP souborů\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp zakáže pasivní režim přenosu\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions zachová přístupová práva ze serveru\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks při rekurzi stáhne soubory (adresáře "
+"ne),\n"
+" na které odkazuje symbolický odkaz\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "PÅ™epínaÄe pro FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit použije implicitní FTPS (výchozí "
+"port\n"
+" je 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl při otevírání datového spojení "
+"obnoví\n"
+" relaci SSL/TLS, která pochází ze "
+"spojení\n"
+" řídicího.\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection šifruje pouze řídicí spojení,\n"
+" data šifrována nebudou\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp není-li FTPS podporováno cílovým\n"
+" serverem, přejde se na FTP\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "PÅ™epínaÄe WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=SOUBOR uloží požadavek/odpovÄ›Ä do souboru .warc."
+"gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=ŘETĚZEC do záznamu WARC přidá ŘETĚZEC\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ÄŒÃSLO nastaví maximální velikost souborů WARC "
+"na\n"
+" ÄŒÃSLO\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx zapíše indexové soubory CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=SOUBOR neukládá záznamy uvedené v tomto souboru "
+"CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression nekomprimuje soubory WARC gzipem\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests nepoÄítá kontrolní souÄty SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr " --no-warc-keep-log neuloží protokol do záznamu WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=ADRESÃŘ umístÄ›ní doÄasných souborů vytvářených\n"
+" zapisovatelem WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekurzivní stahování:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive zapne rekurzivní stahování\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=POČET maximální hloubka rekurze\n"
+" („inf“ nebo „0“ pro nekoneÄno)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after smaže soubory lokálnÄ› po té, co dokonÄí\n"
+" jejich stahování\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links uÄiní odkazy v HTML nebo CSS odkazující "
+"na\n"
+" místní soubory\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only pÅ™evede pouze Äást URL se souborem "
+"(basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N před zápisem souboru X odrotuje až N\n"
+" záložních souborů\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted před konverzí souboru X jej zazálohuje\n"
+" jako X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted před konverzí souboru X jej zazálohuje\n"
+" jako X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror zkratka pro -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites získá všechny obrázky apod. potřebné pro\n"
+" zobrazení HTML stránky\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments zapne přísné zacházení s HTML komentáři\n"
+" podle SGML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekurzivní povolení/zakázání:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=SEZNAM Äárkou oddÄ›lený seznam povolených přípon\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=SEZNAM Äárkou oddÄ›lený seznam zakázaných přípon\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGULÃRNÃ_VÃRAZ\n"
+" regulární výraz přijímající URL\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGULÃRNÃ_VÃRAZ\n"
+" regulární výraz zamítající URL\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=DRUH druh regulárních výrazů (posix, pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=DRUH druh regulárních výrazů (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=SEZNAM Äárkou oddÄ›lený seznam povolených domén\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=SEZNAM Äárkou oddÄ›lený seznam zakázaných domén\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp následuje FTP odkazy z HTML dokumentů\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=SEZNAM Äárkou oddÄ›lený seznam HTML znaÄek "
+"urÄených\n"
+" k následování\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=SEZNAM        Äárkou oddÄ›lený seznam ignorovaných HTML\n"
+" znaÄek\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts pÅ™i rekurzi pÅ™echází i na jiné poÄítaÄe\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative následuje jen relativní odkazy\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=SEZNAM\n"
+" seznam povolených adresářů\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names použije se jméno z poslední Äásti\n"
+" přesměrovávajícího URL\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=SEZNAM\n"
+" seznam zakázaných adresářů\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent nestoupá do nadřazeného adresáře\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Chybová hlášení, otázky a diskuze zasílejte e-mailem na <bug-wget@gnu.org>\n"
+"nebo otevřete požadavek na webové adrese\n"
+"<https://savannah.gnu.org/bugs/?func=additem&group=wget> (pouze anglicky).\n"
+"Komentáře k Äeskému pÅ™ekladu zasílejte (Äesky) na adresu\n"
+"<translation-team-cs@lists.sourceforge.net>.\n"
+
+# , c-format
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, program pro neinteraktivní stahování souborů.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Heslo uživatele %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Heslo: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nelze vytvořit rouru\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Chyba při inicializaci akcí souboru s příkazy pro use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Chyba při nastavování akcí souboru s příkazy pro use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Chyba pÅ™i Ätení odpovÄ›di z příkazu „%s %s“: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Uživatelské jméno pro „%s%s“: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Heslo pro „%s%s@%s“: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc:"
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Národní prostředí: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Přeloženo: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Slinkováno: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s sestaven na systému %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (prostředí)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (uživatelský)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (globální)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licence GPLv3+: GNU GPL verze 3 nebo vyšší\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Toto je volné programové vybavení: máte právo jej měnit a dále šířit.\n"
+"Není poskytována ŽÃDNà ZÃRUKA, jak jen zákon dovoluje.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Původním autorem tohoto programu je Hrvoje Nikšić <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Chybová hlášení a dotazy zasílejte na adresu <bug-wget@gnu.org> (pouze\n"
+"anglicky). Komentáře k Äeskému pÅ™ekladu zasílejte na adresu\n"
+"<translation-team-cs@lists.sourceforge.net>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problém s alokací paměti\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "KonÄí se kvůli chybÄ› v %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Příkaz „%s --help“ vypíše další pÅ™epínaÄe.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: nepřípustný pÅ™epínaÄ – „-n%c“\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Podpora pro ladÄ›ní nebyla pÅ™i pÅ™ekladu zahrnuta. PÅ™epínaÄ --debug se "
+"ignoruje.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Jak --no-clobber, tak --convert-links byly zadány. Použije se jen\n"
+"pÅ™epínaÄ --convert-links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Jak --no-clobber, tak --convert-file-only byly zadány. Použije se jen\n"
+"pÅ™epínaÄ --convert-file-only.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Program nemůže být upovídaný a zticha zároveň.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Nelze používat Äasová razítka a nemazat pÅ™itom staré soubory.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "--inet4-only a --inet6-only nelze zadat najednou.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"PÅ™epínaÄe -k nebo --convert-file-only a -O nelze spolu použít, je-li zadáno\n"
+"více URL nebo je-li zadán pÅ™epínaÄ -p nebo -r. VysvÄ›tlení naleznete "
+"v manuálu.\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"VAROVÃNÃ: kombinace -O s -r nebo -p způsobí, že veÅ¡kerý stažený obsah bude\n"
+"uložen do jediného souboru, který jste urÄili.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"VAROVÃNÃ: porovnávání Äasu spolu s -O nic nedÄ›lá. VysvÄ›tlení naleznete\n"
+"v manuálu.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Výstup do WARC nefunguje spolu s --no-clobber. PÅ™epínaÄ --no-clobber bude\n"
+"vypnut.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Výstup do WARC nefunguje spolu s porovnáváním Äasů. Porovnávání Äasů bude\n"
+"vypnuto.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Výstup do WARC nefunguje spolu s pÅ™epínaÄem --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Výstup do WARC nefunguje spolu s --continue nebo --start-pos. PÅ™epínaÄe\n"
+"budou vypnuty.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Kontrolní souÄty jsou vypnuty. Deduplikace WARC nebude moci nalézt "
+"opakující\n"
+"se záznamy.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Komprese nefunguje spolu s --continue nebo --start-pos. PÅ™epínaÄe budou "
+"vypnuty.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "--ask-password a --password nelze zadat najednou.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"NedoporuÄuje se uvádÄ›t jak --start-pos, tak --continue. PÅ™epínaÄ --continue\n"
+"bude vypnut.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: chybí URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "PÅ™epínaÄe --post-data a --post-file nelze zadat najednou.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"PÅ™epínaÄe --post-data nebo --post-file nelze použít spolu s pÅ™epínaÄem --"
+"method. PÅ™epínaÄ --method oÄekává data skrze pÅ™epínaÄe --body-data a --body-"
+"file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Abyste mohli použít pÅ™epínaÄe --body-data nebo --body-file, je tÅ™eba zvolit "
+"metody skrze --method=METODA_HTTP.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "PÅ™epínaÄe --body-data a --body-file nelze zadat najednou.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Tato verze neobsahuje podporu pro IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"PÅ™epínaÄ -k nebo -r lze použít spolu s -O pouze tehdy, je-li výstupem\n"
+"obyÄejný soubor.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"PÅ™epínaÄe --convert-links nebo --convert-file-only lze použít spolu pouze\n"
+"tehdy, je-li výstupem obyÄejný soubor.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Nebylo možné inicializovat knihovnu libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Nebylo možné inicializovat kanál knihovny c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "IP adresu „%s“ nebylo možné rozebrat\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Nebylo možné nastavit DNS server(y) „%s“ (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "V souboru „%s“ nebyla nalezena žádná URL.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Metalinkový soubor %s nebylo možné rozebrat.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ne všechny zdroje bylo možné stáhnout z %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"KONEC --%s--\n"
+"Celkový skuteÄný Äas: %s\n"
+"Staženo: %d souborů, %s za %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Kvóta %s na stahování PŘEKROČENA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "PÅ™epínaÄ -O není podporován pÅ™i stahování z metalinku. Ignoruje se.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Plánovaný metalinkový soubor: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "ZabezpeÄený metalinkový soubor: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Metalinkový soubor se zamítá. NebezpeÄný název.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Zpracovává se metaURL %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "MetaURL soubor %s se zamítá. NebezpeÄný název.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Stažení %s selhalo. MetaURL se přeskakuje.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "MetaURL soubor %s nebylo možné rozebrat.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Zpracování metaURL adres vrátilo chybu.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Typ zdroje %s není podporován, ignoruje se…\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Stažený soubor nebylo možné otevřít.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "PoÄítá se velikost %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Velikost souboru nebyla udána. Kontrola se přeskakuje.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nebylo možné zjistit velikost staženého souboru.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Velikost souboru %s nesouhlasí.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Velikost souhlasí.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "PoÄítá se kontrolní souÄet %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrolní souÄty souhlasí.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Kontrolní souÄet souboru %s nesouhlasí.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Stažený soubor nebylo možné otevřít za úÄelem ověření podpisu.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Ověření podpisu uspělo.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Neplatný podpis. Zdroj se zamítá.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Data odpovídají podpisu, ale podpis není důvěryhodný.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Žádný kontrolní souÄet nenalezen.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Stažení %s selhalo. Zdroj se přeskakuje.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Soubor %s byl získán, ale velikost nesouhlasí.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Soubor %s byl získán, ale kontrolní souÄet nesouhlasí.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Soubor %s byl získán, ale podpis nesouhlasí.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Přejmenovává se %s na %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Program pokraÄuje v bÄ›hu na pozadí.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Program pokraÄuje v bÄ›hu na pozadí, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Výstup bude zapsán do %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "volání fake_fork_child() selhalo\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "volání fake_fork() selhalo\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Nelze najít použitelný ovladaÄ soketů.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"Volání ioctl() selhalo. Socket nebylo možné přepnout do neblokujícího "
+"režimu.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: varování: token %s se nachází ještě před jakýmkoliv názvem "
+"poÄítaÄe\n"
+
+# TODO: msgid bug: explicit quotation
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: neznámý token „%s“\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Použití: %s NETRC [NÃZEV POÄŒÃTAÄŒE]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: volání „stat %s“ skonÄilo chybou: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "VAROVÃNÃ: používám slabý zdroj náhodných Äísel.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "PRNG nelze zinicializovat, zvažte použití pÅ™epínaÄe --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Vaše verze OpenSSL je příliš stará, aby podporovala TLSv1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Vaše verze OpenSSL je příliš stará, aby podporovala TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Vaše verze OpenSSL je příliš stará, aby podporovala TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: neimplementovaná hodnota %d volby „secure-protocol“\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Neplatný seznam šifer: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+"OpenSSL: Nastavení ověřování důvÄ›ryhodnosti na ÄásteÄný Å™etÄ›zec selhalo\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Alokace ověřovacího parametru selhala\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"POZOR: PRNG nebylo možné zinicializovat. Zvažte použití pÅ™epínaÄe --random-"
+"file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: certifikát pro %s vydaný %s nelze ověřit:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Autoritu vydavatele nelze lokálně ověřit.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Nalezen certifikát podepsaný sám sebou.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Vydaný certifikát ještě nenabyl platnosti.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Vydanému certifikátu uplynula doba platnosti.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: žádné alternativní jméno z certifikátu se neshoduje\n"
+"\ts požadovaným jménem poÄítaÄe %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: obecné jméno (CN) certifikátu %s se neshoduje s požadovaným jménem "
+"poÄítaÄe %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: obecné jméno (CN) certifikátu není platné (obsahuje znak NUL).\n"
+" To může ukazovat na to, že stroj není tím, za koho se vydává (to jest,\n"
+" ve skuteÄnosti to není %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Pro nezabezpeÄené spojení s %s použijte „--no-check-certificate“.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ přeskakuje se %s K ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "%s není platné urÄení způsobu indikace, ponecháno nezmÄ›nÄ›no.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " zbývá %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " za "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Frekvenci hodin REÃLNÉHO ÄŒASU nelze urÄit: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Maže se %s, protože tento soubor není požadován.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "%s nelze otevřít: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "NaÄítá se „robots.txt“. Chybová hlášení ignorujte, prosím.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Chyba rozebírání URL proxy serveru %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Chyba v URL Proxy %s: Musí být HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "PÅ™ekroÄeno %d pÅ™esmÄ›rování.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Ani poslední pokus nebyl úspěšný.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Zkusí se to znovu.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Nenalezeny žádné slepé odkazy.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Nalezen %d slepý odkaz.\n"
+"\n"
+msgstr[1] ""
+"Nalezeny %d slepé odkazy.\n"
+"\n"
+msgstr[2] ""
+"Nalezeno %d slepých odkazů.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Bez chyby"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nepodporované schéma %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Chybí schéma"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Neplatné jméno stroje"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Chybné Äíslo portu"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Neplatné jméno uživatele"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "NeukonÄená Äíselní IPv6 adresa"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adresy nejsou podporovány"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Chybná Äíselná IPv6 adresa"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Podpora HTTPS nebyla zakompilována do programu"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Zaznamenána nepřevoditelná vícebajtová posloupnost\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: NezdaÅ™ilo se alokovat dostatek pamÄ›ti, paměť vyÄerpána.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: alokace %ld bajtů selhala, paměť vyÄerpána.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: vyrovnávací paměť pro text je příliš velká (%d bajtů), "
+"přerušeno.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Program pokraÄuje v bÄ›hu na pozadí. pid %d\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nebylo možné odstranit symbolický odkaz %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Otevření souboru %s selhalo\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Získání deskriptoru souboru „%s“ selhalo\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Zjištění přístupových práv k souboru „%s“ selhalo\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Soubor %s se od poslední kontroly zmÄ›nil. BezpeÄnostní kontrola selhala.\n"
+
+# TODO: a space before a colon
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Otevření souboru %s selhalo: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Získání údajů o souboru „%s“ selhalo, chyba: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Pokus otevřít soubor %s, který se od poslední kontroly zmÄ›nil. BezpeÄností "
+"kontrola selhala.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Neplatný regulární výraz %s, chyba PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Neplatný regulární výraz %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Při porovnávání %s nastala chyba: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "PÅ™eskakuje se klÃ­Ä se Å¡patnou velikostí (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Chyba při přesunu pozice v souboru WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Chyba při zapisování souboru WARC na disk.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Chyba při duplikaci deskriptoru souboru WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Chyba při otevírání gzipového proudu do souboru WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Chyba při zápisu záznamu warcinfo do souboru WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Otevírání souboru WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Chyba při otevírání souboru WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Soubor CDX neuvádí původní URL. (Chybí sloupec „a“.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Soubor CDX neuvádí kontrolní souÄet. (Chybí sloupec „k“.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Soubor CDX neuvádí identifikátory záznamů. (Chybí sloupec „u“.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"NaÄten %d záznam z CDX.\n"
+"\n"
+msgstr[1] ""
+"NaÄteny %d záznamy z CDX.\n"
+"\n"
+msgstr[2] ""
+"NaÄteno %d záznamů z CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Nebylo možné pÅ™eÄíst soubor CDX %s za úÄelem odstranÄ›ní duplikátů.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Nebylo možné otevřít doÄasný soubor manifestu WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Nebylo možné otevřít doÄasný soubor protokolu WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Nebylo možné otevřít soubor WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Nebylo možné otevřít soubor CDX pro výstup.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Nebylo možné otevřít doÄasný soubor WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Nalezena přesná shoda v souboru CDX. Ukládá se záznam o opakované návštěvě "
+"do WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Neznámá chyba systému"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adresní rodina není u názvu stroje podporována"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Chybná hodnota ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Zásadní chyba při překladu jména"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family není podporováno"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Problém s alokací paměti"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "K názvu stroje není přidružená žádná adresa"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Neznámý název nebo služba"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Název služby není u ai_socktype podporován"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype není podporován"
+
+#~ msgid "System error"
+#~ msgstr "Chyba systému"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Buffer argumentu je příliš malý"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Požadavek se zpracovává"
+
+#~ msgid "Request canceled"
+#~ msgstr "Požadavek zrušen"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Požadavek nezrušen"
+
+#~ msgid "All requests done"
+#~ msgstr "VÅ¡echny požadavky dokonÄeny"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Přerušeno signálem"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Řetězec parametru není správně kódován"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž%s%s“ není jednoznaÄný\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: pÅ™epínaÄ â€ž%s%s“ není jednoznaÄný, možnosti:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: nerozpoznaný pÅ™epínaÄ â€ž%s%s“\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž%s%s“ nepÅ™ipouÅ¡tí argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž%s%s“ vyžaduje argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: chybný pÅ™epínaÄ – „%c“\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: pÅ™epínaÄ vyžaduje argument – „%c“\n"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "“"
+
+#~ msgid "Success"
+#~ msgstr "Úspěch"
+
+#~ msgid "No match"
+#~ msgstr "Žádná shoda"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "neplatný regulární výraz"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "neplatný znak pro porovnávání"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "neplatný název třídy znaku"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Zpětné lomítko na konci"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Neplatný zpětný odkaz"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Chybí odpovídající závorka k [, [^, [:, [. nebo [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Chybí odpovídající závorka k ( nebo \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Chybí odpovídající závorka k \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Neplatný obsah \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Neplatný konec rozsahu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Paměť byla vyÄerpána"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Neplatný předchozí regulární výraz"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "PÅ™edÄasný konec regulárního výrazu"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regulární výraz je příliš velký"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Chybí odpovídající závorka k ) nebo \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Žádný předchozí regulární výraz"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nelze vytvořit rouru"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "podproces %s selhal"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "voláni _open_osfhandle selhalo"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "nelze obnovit deskriptor %d: volání dup2 selhalo"
+
+# The argument is a program name
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "podproces %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "podproces %s obdržel nepřekonatelný signál %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "paměť vyÄerpána"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Zprávy o chybách, dotazy a diskuze zasílejte e-mailem na adresu\n"
+#~ "<bug-wget@gnu.org> (pouze anglicky). Komentáře k Äeskému pÅ™ekladu\n"
+#~ "zasílejte na adresu <translation-team-cs@lists.sourceforge.net>.\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž--%s“ nedovoluje argument\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: neznámý pÅ™epínaÄ â€ž--%s“\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž-W %s“ není jednoznaÄný\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž-W %s“ nedovoluje argument\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: pÅ™epínaÄ â€ž-W %s“ vyžaduje argument\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Soubor „%s“ je již zde, nebudu jej přenášet.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Neplatná posloupnost UTF-8: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode selhala (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "obdržen signál %s.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorizace selhala.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries urÄuje poÄet pokusů pro soubor.\n"
+#~ " (je třeba použít spolu s --metalink-"
+#~ "file)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --jobs urÄuje poÄet vláken.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Uživatelské jméno a heslo není třeba zadávat při stahování pomocí "
+#~ "metalinku.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s: nelze použít spolu s pÅ™epínaÄem --metalink.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Formát výstupu:\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "POZOR: Standardní výstup nelze znovu otevřít v binárním režimu.\n"
+#~ " stažené soubory mohou obsahovat nevhodné konce řádků.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: nepřípustný pÅ™epínaÄ – %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s sestaven na systému VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Nyní jej spravuje Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL předřadí URL relativním odkazům z -F -i "
+#~ "souboru.\n"
+
+#~ msgid ""
+#~ "Cannot specify -N if -O is given. See the manual for details.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Je-li zadáno -O, nelze souÄasnÄ› použít -N. VysvÄ›tlení naleznete "
+#~ "v manuálu\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy explicitnÄ› zapne proxy.\n"
+
+#~ msgid ""
+#~ " --no-content-disposition don't honor Content-Disposition header.\n"
+#~ msgstr ""
+#~ " --no-content-disposition nebere v úvahu hlaviÄku Content-"
+#~ "Disposition.\n"
+
+#~ msgid "%s referred by:\n"
+#~ msgstr "%s odkázán z:\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Chyba v hlaviÄce Set-Cookie v poli „%s“"
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: Chybná rozšířená pravdivostní hodnota „%s“;\n"
+#~ "zadejte jeden z: „on“ (zapnuto), „off“ (vypnuto), „always“ (vždy) nebo\n"
+#~ "„never“ (nikdy).\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Tento program je šířen v nadÄ›ji, že bude užiteÄný, avÅ¡ak\n"
+#~ "BEZ JAKÉKOLI ZÃRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI \n"
+#~ "anebo VHODNOSTI PRO URČITà ÚČEL. Další podrobnosti hledejte \n"
+#~ "v Obecné veřejné licenci GNU (GNU General Public License).\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s: Chyba ověřování certifikátu pro %s: %s\n"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Syntaktická chyba v hlaviÄce Set-Cookie na znaku „%c“.\n"
+
+# , c-format
+#~ msgid "Connection to %s:%hu refused.\n"
+#~ msgstr "Spojení s %s:%hu odmítnuto.\n"
+
+# , c-format
+#~ msgid "Will try connecting to %s:%hu.\n"
+#~ msgstr "Program se pokusí spojit s %s:%hu.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Příkaz REST selhal, „%s“ nebude zkráceno.\n"
+
+# , c-format
+#~ msgid " [%s to go]"
+#~ msgstr " [%s zbývá]"
+
+#~ msgid "Host not found"
+#~ msgstr "PoÄítaÄ nebyl nalezen"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Nebylo možné nastavit SSL kontext\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Program se pokusí pokraÄovat bez zadaného certifikátu.\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "HlaviÄka není úplná.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Na přerušené stahování tohoto souboru nelze navázat. Bylo ovšem zadáno `-"
+#~ "c'.\n"
+#~ "Existující soubor „%s“ tedy raději nebude zkrácen.\n"
+#~ "\n"
+
+# , c-format
+#~ msgid " (%s to go)"
+#~ msgstr " (%s zbývá)"
+
+# , c-format
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Soubor „%s“ je již zde a nebude se znovu přenášet.\n"
+
+# , c-format
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - „%s“ uloženo [%ld/%ld])\n"
+#~ "\n"
+
+# , c-format
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Spojení ukonÄeno na bajtu %ld/%ld. "
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: „%s“ nelze převést na IP adresu.\n"
+
+# , c-format
+#~ msgid "%s: %s: Please specify always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s: Zadejte prosím „always“ (vždy), „on“ (zapnuto), „off“ (vypnuto), "
+#~ "nebo „never“ (nikdy).\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ZaÄátek:\n"
+#~ " -V, --version vypíše informaci o verzi programu Wget a "
+#~ "skonÄí\n"
+#~ " -h, --help vypíše tuto nápovědu\n"
+#~ " -b, --background po spuÅ¡tÄ›ní pokraÄuje program v bÄ›hu na "
+#~ "pozadí\n"
+#~ " -e, --execute=PŘÃKAZ provede příkaz zadaný ve stylu „.wgetrc“\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive web-suck -- use with care!\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Rekurzivní stahování:\n"
+#~ " -r, --recursive rekurzivní stahování -- buÄte opatrní!\n"
+#~ " -l, --level=ÄŒÃSLO maximální hloubka rekurze (0 bez limitu)\n"
+#~ " --delete-after po přenosu smaže stažené soubory\n"
+#~ " -k, --convert-links absolutní URL převede na relativní\n"
+#~ " -K, --backup-converted před konverzí uloží „X“ jako „X.orig“\n"
+#~ " -m, --mirror zapne pÅ™epínaÄe vhodné pro zrcadlení dat \n"
+#~ " -p, --page-requisites stáhne vše nutné pro zobrazení HTML "
+#~ "stránky\n"
+
+# , c-format
+#~ msgid "%s: %s: invalid command\n"
+#~ msgstr "%s: %s: neplatný příkaz\n"
+
+# , c-format
+#~ msgid ""
+#~ "\n"
+#~ "CTRL+Break received, redirecting output to `%s'.\n"
+#~ "Execution continued in background.\n"
+#~ "You may stop Wget by pressing CTRL+ALT+DELETE.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Stiskli jste CTRL+Break, výstup byl proto přesměrován do „%s“.\n"
+#~ "Program pokraÄuje v bÄ›hu na pozadí.\n"
+#~ "Wget lze zastavit stiskem CTRL+ALT+DELETE.\n"
+
+# , c-format
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Spouští se WinHelp %s\n"
+
+# , c-format
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Není dost paměti.\n"
+
+#~ msgid "Unknown/unsupported protocol"
+#~ msgstr "Neznámý/nepodporovaný protokol"
+
+#~ msgid "Invalid port specification"
+#~ msgstr "Neplatná specifikace portu"
+
+#~ msgid "%s: Cannot determine user-id.\n"
+#~ msgstr "%s: Nelze zjistit ID uživatele.\n"
+
+# , c-format
+#~ msgid "%s: Warning: uname failed: %s\n"
+#~ msgstr "%s: Varování: Volání funkce \"uname\" skonÄilo chybou %s\n"
+
+#~ msgid "%s: Warning: gethostname failed\n"
+#~ msgstr "%s: Varování: Volání funkce \"gethostname\" skonÄilo chybou\n"
+
+#~ msgid "%s: Warning: cannot determine local IP address.\n"
+#~ msgstr "%s: Varování: Nelze zjistit lokální IP adresu.\n"
+
+#~ msgid "%s: Warning: cannot reverse-lookup local IP address.\n"
+#~ msgstr "%s: Varování: Lokální IP adresa nemá reverzní DNS záznam.\n"
+
+#~ msgid "%s: Warning: reverse-lookup of local address did not yield FQDN!\n"
+#~ msgstr ""
+#~ "%s: Varování: Zpětné vyhledání lokální adresy nenavrátilo plně \n"
+#~ "kvalifikované jméno domény!\n"
+
+# , c-format
+#~ msgid "%s: Redirection to itself.\n"
+#~ msgstr "%s: Přesměrování na sebe sama.\n"
+
+# , c-format
+#~ msgid "Error (%s): Link %s without a base provided.\n"
+#~ msgstr "Chyba (%s): K relativnímu odkazu %s nelze najít bázový odkaz.\n"
+
+# , c-format
+#~ msgid "Error (%s): Base %s relative, without referer URL.\n"
+#~ msgstr "Chyba (%s): Bázový odkaz %s nesmí být relativní.\n"
+
+# , c-format
+#~ msgid ""
+#~ "Local file `%s' is more recent, not retrieving.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Soubor „%s“ nebudu přenášet, protože lokální verze je novější.\n"
+#~ "\n"
diff --git a/po/da.gmo b/po/da.gmo
new file mode 100644
index 0000000..515f2be
--- /dev/null
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..71fec7c
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,3876 @@
+# Danish messages for GNU wget
+# This file is distributed under the same license as the wget package.
+# Copyright (C) 1998 Free Software Foundation, Inc.
+#
+# Keld Jørn Simonsen <keld@dkuug.dk>, 2000-2002,2011.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010.
+#
+# Reviewed: 2001-10-20 Thorbjoern Ravn Andersen <ravn@unixsnedkeren.dk>
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.12-pre7\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2011-01-09 07:03+0100\n"
+"Last-Translator: Keld Simonsen <keld@keldix.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: kan ikke evaluere bindingsadressen %s; deaktiverer binding.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Tilslutter %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Tilslutter %s:%d... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Tilslutter %s:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "forbundet.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "mislykkedes: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: kan ikke evaluere værtsadresse %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Konverterede %d filer på %s sekunder.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Konverterer %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ingenting at gøre.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Kan ikke konvertere lænker i %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Kan ikke slette %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Kan ikke sikkerhedskopiere %s som %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Kan ikke slette %s: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaksfejl i Set-Cookie: %s på position %d.\n"
+
+#: src/cookies.c:777
+#, fuzzy, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie, der kommer fra %s, forsøgte at sætte domæne til %s\n"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Kan ikke åbne cookiefil %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Fejl ved skrivning til %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Fejl ved lukning af %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Ikke-understøttet listningstype, prøver Unix-listningsfortolker.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indeks for /%s på %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "ukendt tid "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fil "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Katalog "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Usikker "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Længde: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) resterende"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s resterende"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (ikke endegyldigt)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Logger ind som %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Fejl i svar fra server, lukker kontrolforbindelsen.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Fejl i velkomsthilsen fra server.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Fejl ved skrivning, lukker kontrolforbindelsen.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Serveren tillader ikke indlogning.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Fejl ved indlogning.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Logget ind!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Serverfejl, kan ikke bestemme systemtype.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "færdig. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "O.k.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Ukendt type '%c', lukker kontrolforbindelsen.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "O.k. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD ikke nødvendig.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Intet katalog ved navn %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ikke nødvendig.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fil er allerede blevet hentet.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Kan ikke opsætte PASV-overførsel.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Kan ikke tolke PASV-tilbagemelding.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "kunne ikke forbinde til %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind-fejl (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ugyldig PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Fejl ved REST, starter forfra.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Filen %s findes.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Ingen fil ved navn %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ingen fil ved navn %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ingen fil eller katalog ved navn %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s er opstået.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, lukker kontrolforbindelsen.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - dataforbindelse: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Forbindelsen lukket.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Dataoverførsel afbrudt.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Filen %s findes allerede, hentes ikke.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(forsøg:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevet til standard-udata %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gemt [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Fjerner %s.\n"
+
+# listing??
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Bruger %s som midlertidig listefil.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Slettede %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Rekursionsdybde %d overskred maksimal dybde %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Fjernfil ikke nyere end lokal fil %s -- hentes ikke.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Fjernfil er nyere end lokal fil %s -- hentes.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr "Størrelserne er forskellige (lokal %s) -- hentes.\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ugyldigt navn for symbolsk lænke, ignoreres.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Har allerede gyldig symbolsk lænke %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Laver symbolsk lænke %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Symbolske lænker understøttes ikke, ignorerer den symbolske lænke %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ignorerer katalog %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: filtypen er ukendt/ikke understøttet.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Kunne ikke få certifikatnøgle fra %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: ugyldigt tidsstempel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Henter ikke kataloger, da dybde er %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Behandler ikke %s, da det er ekskluderet/ikke inkluderet.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Afviser %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Afviser %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Behandler ikke %s, da det er ekskluderet/ikke inkluderet.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Fejl ved sammenligning af %s med %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ingen træffere med mønsteret %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Skrev HTML-formateret indeks til %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Skrev HTML-formateret indeks til %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "FEJL: Kan ikke åbne katalog %s.\n"
+
+#: src/gnutls.c:178
+#, fuzzy, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "FEJL: Kan ikke åbne katalog %s.\n"
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Rapportér venligst fejl og send spørgsmål til <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "FEJL"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "ADVARSEL"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Intet certifikat præsenteret af %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Certifikatet for %s er ikke betroet.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certifikatet for %s har ingen kendt udsteder.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Certifikatet for %s er blevet tilbagekaldt.\n"
+
+#: src/gnutls.c:1041
+#, fuzzy, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Certifikatet for %s er ikke betroet.\n"
+
+#: src/gnutls.c:1042
+#, fuzzy, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Certifikatet for %s har ingen kendt udsteder.\n"
+
+#: src/gnutls.c:1043
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certifikatet for %s er ikke betroet.\n"
+
+#: src/gnutls.c:1044
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certifikatet for %s er blevet tilbagekaldt.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Fejl ved initialisering af X509-certifikat: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Intet certifikat fundet\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Fejl ved fortolkning af certifikat: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certifikatet er endnu ikke blevet aktiveret\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certifikatet er udløbet\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Certifikatets ejer svarer ikke til værtsnavnet %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ukendt vært"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Midlertidig fejl i navneevaluering"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ukendt fejl"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Løser %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "mislykkedes: Ingen IPv4/IPv6-adresser for vært.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "mislykkedes: tiden udløb.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: kan ikke løse ukomplet lænke %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ugyldig URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Fejl ved skrivning af HTTP-forespørgsel: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Ingen toptekster, antager HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr "Filen %s findes allerede, hentes ikke.\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, fuzzy, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "POST-datafil %s mangler: %s\n"
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Genbruger eksisterende forbindelse til %s:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Genbruger eksisterende forbindelse til %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Fejl ved læsning af svar fra proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s FEJL %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Forkert udformet statuslinje"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Proxytunnel slog fejl: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ukendt autorisations-protokol.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Ukendt autorisations-protokol.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Gemmer til: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Deaktiverer SSL, da der opstod fejl.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s forespørgsel sendt, afventer svar... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ingen data modtaget\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Læsefejl (%s) i toptekster.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(ingen beskrivelse)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Sted: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "uspecificeret"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [omdirigeret]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Filen er allerede fuldt overført; ingen handling nødvendig.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Længde: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignoreret"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Advarsel: jokertegn ikke understøttet i HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Edderkoptilstand aktiveret. Kontrollér om fjernfilen findes.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Kan ikke skrive til %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Kan ikke skrive til %s (%s).\n"
+
+#: src/http.c:4484
+#, fuzzy
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Kan ikke skrive til %s (%s).\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Kunne ikke etablere SSL-forbindelse.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Kan ikke skrive til %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "FEJL: Omdirigering (%d) uden nyt sted.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Fjernfilen findes ikke -- ødelagt henvisning!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Last-modified toptekst mangler -- tidsstempling slås fra.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Last-modified toptekst ugyldig -- tidsstempel ignoreret.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Serverfil ikke nyere end lokal fil %s -- hentes ikke.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Størrelserne er forskellige (lokal %s) -- hentes.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Fil på server er nyere - hentes.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Fjernfil findes og kan indeholde henvisninger til andre ressourcer -- "
+"henter.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fjernfil findes, men indeholder ingen henvisninger -- henter ikke.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fjernfilen findes og indeholder måske yderligere henvisninger,\n"
+"men rekursion er deaktiveret - henter ikke.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Fjernfilen findes.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevet til standard-uddata %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gemt [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Forbindelse lukket ved byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Læsefejl ved byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Læsefejl ved byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+# scheme?
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Ikke-understøttet skema %s"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC peger på %s, som ikke findes.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Kan ikke læse %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Fejl i %s på linje %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaksfejl i %s på linje %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Ukendt kommando %s i %s på linje %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Advarsel: Både systemets og brugerens wgetrc peger på %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Ugyldig kommando %s til --execute\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Ugyldig boolesk variabel %s; brug 'on' eller 'off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Ugyldig boolesk variabel %s; brug 'on' eller 'off'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ugyldigt tal %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ugyldig byteværdi %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ugyldig tidsperiode %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Ugyldig tidsperiode %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ugyldig værdi %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ugyldig toptekst %s.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ugyldig toptekst %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ugyldig fremskridtstype %s\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Ugyldig restriktion %s,\n"
+" brug [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodningen %s er ikke gyldig\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konvertering fra %s til %s understøttes ikke\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Ufuldstændig eller ugyldig flerbytesekvens fundet\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Ubehandlet fejlnr %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: regionsinformation (locale) er ikke angivet\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode mislykkedes (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "kunne ikke forbinde til %s port %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s modtaget, omdirigerer udskrift til %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; deaktiverer logning.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Brug: %s [FLAG]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Obligatoriske argumenter til lange flag er obligatoriske også for korte.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Opstart:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version vis versionen af Wget og afslut.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help udskriv denne hjælp.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background gå i baggrunden efter opstart.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=KOMMANDO kør en kommando i stil med '.wgetrc'.\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Logning og inddatafil:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FIL log meddelelser til FIL.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FIL tilføj meddelelser til FIL.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug udskriv masser af fejlsøgningsinformation.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug udskriv Watt-32-fejlsøgningsinformation.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet stilhed (ingen udskrift).\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose uddybende udskrift (dette er standardvalget).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose være mindre uddybende, men ikke helt stille.\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+#, fuzzy
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FILE hent URL'er fra den lokale eller eksterne FIL.\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FILE hent URL'er fra den lokale eller eksterne FIL.\n"
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html behandl inddatafilen som HTML.\n"
+
+#: src/main.c:634
+#, fuzzy
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL evaluerer henvisninger i HTML-inddatafil (-i -"
+"F)\n"
+" relativt til URL.\n"
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr " --no-cookies brug ikke cookies.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies brug ikke cookies.\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Download:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ANTAL sæt antal forsøg til ANTAL (0 for "
+"ubegrænset)\n"
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused forsøg igen selv hvis forbindelse nægtes.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LISTE kommaadskilt liste af HTML-mærker, der\n"
+" ignoreres.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FIL skriv dokumenter til FIL.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber hent ikke filer, der ville blive lagret på\n"
+" eksisterende filer.\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " -np, --no-parent gå ikke op til ophavskataloget.\n"
+
+#: src/main.c:660
+#, fuzzy
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue genoptag hentning af en delvis hentet fil.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+#, fuzzy
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYPE vælg angivelsesmåde af fremgang.\n"
+
+#: src/main.c:666
+#, fuzzy
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=TYPE vælg angivelsesmåde af fremgang.\n"
+
+#: src/main.c:668
+#, fuzzy
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping hent ikke filer igen, med mindre de er "
+"nyere\n"
+" end den lokale.\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps sæt ikke den lokale fils tidsstempel til\n"
+" den på serveren.\n"
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response udskriv svar fra server.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider hent intet.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDER sæt alle værdier for tidsudløb til "
+"SEKUNDER.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADRESSE bind til ADRESSE (værtsnavn eller IP) på "
+"lokal\n"
+" vært.\n"
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNDER sæt tidsudløb for DNS-opslag til SEKUNDER\n"
+
+#: src/main.c:691
+#, fuzzy
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEKUNDER sæt tidsudløb for forbindelse til "
+"SEKUNDER.\n"
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEKUNDER sæt tidsudløb for læsning til SEKUNDER.\n"
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDER vent 1..SEKUNDER mellem gentagelsesforsøg "
+"på\n"
+" at hente.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait vent fra 0,5*VENT til 1,5*VENT sekunder "
+"mellem hentninger.\n"
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy slå proxy fra eksplicit.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=ANTAL sæt hentningskvote til ANTAL.\n"
+
+#: src/main.c:708
+#, fuzzy
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESSE bind til ADRESSE (værtsnavn eller IP) på "
+"lokal\n"
+" vært.\n"
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=HASTIGHED begræns downloadhastighed til HASTIGHED.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache deaktivér cache for DNS-opslag.\n"
+
+#: src/main.c:714
+#, fuzzy
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS begrænser tegn i filnavne til de, som "
+"tillades\n"
+" af operativsystemet.\n"
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ingen forskel på store/små bogstaver ved\n"
+" matching af filer/kataloger\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only forbind kun til IPv4-adresser.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only forbind kun til IPv6-adresser.\n"
+
+#: src/main.c:723
+#, fuzzy
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIE forbind først til adresser i den angivne\n"
+" familie, enten IPv6, IPv4, eller none.\n"
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=BRUGER angiv både ftp- og http-bruger til BRUGER.\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=KODE angiv både ftp- og http-adgangskode til "
+"KODE.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password bed om adgangskoder.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri slå understøttelse af IRI fra.\n"
+
+#: src/main.c:742
+#, fuzzy
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KODNING brug KODNING som lokal kodning for IRI'er\n"
+
+#: src/main.c:744
+#, fuzzy
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KODNING brug KODNING som standardfjernkodning.\n"
+
+# glob er f.eks. når man skriver *.txt, og skallen svarer med fil1.txt, fil2.txt, ...
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr " --no-glob slå globning af FTP-filnavne fra.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Kataloger:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories opret ikke kataloger.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories tving oprettelse af kataloger.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories opret ikke værtskataloger.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories brug protokolnavn i kataloger.\n"
+
+#: src/main.c:774
+#, fuzzy
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PRÆFIKS gem filer til PRÆFIKS/...\n"
+
+#: src/main.c:776
+#, fuzzy
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ANTAL ignorér ANTAL komponenter for "
+"fjernkataloger\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-flag:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=BRUGER sæt http-brugeren til BRUGER.\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=KODE sæt http-adgangskoden til KODE.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache tillad ikke serverlagring af data.\n"
+
+#: src/main.c:788
+#, fuzzy
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAVN Ændr standardsidenavnet (normalt er dette\n"
+" 'index.html'.).\n"
+
+#: src/main.c:791
+#, fuzzy
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension gem HTML/CSS-dokumenter med passende "
+"filendelser\n"
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignorér `Content-Length' toptekstfeltet.\n"
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=STRENG indsæt STRENG blandt topteksterne.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+#, fuzzy
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksimalt tilladt antal omdirigeringer pr. "
+"side.\n"
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=BRUGER sæt BRUGER som proxybrugernavn.\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=KODE brug KODE som proxyadgangskode.\n"
+
+#: src/main.c:807
+#, fuzzy
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inkludér `Referer: URL'-toptekst i \n"
+" HTTP-forespørgsel\n"
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers gem HTTP-topteksterne til en fil.\n"
+
+#: src/main.c:811
+#, fuzzy
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identificér som AGENT frem for Wget/VERSION.\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive deaktivér HTTP-keep-alive (vedvarende \n"
+" forbindelser).\n"
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies brug ikke cookies.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --load-cookies=FIL indlæs cookies fra FIL før session.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=FIL gem cookies til FIL efter session.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies indlæs og gem (ikke-permanente) "
+"sessionscookies\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRENG brug POST-metoden; send STRENG som data.\n"
+
+#: src/main.c:825
+#, fuzzy
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FIL brug POST-metoden; send indhold af FIL.\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+#, fuzzy
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --post-data=STRENG brug POST-metoden; send STRENG som data.\n"
+
+#: src/main.c:831
+#, fuzzy
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --post-file=FIL brug POST-metoden; send indhold af FIL.\n"
+
+#: src/main.c:833
+#, fuzzy
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition respektér topteksten Content-Disposition ved\n"
+" valg af lokale filnavne (EKSPERIMENTEL).\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+#, fuzzy
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge send basal HTTP-autentifikationsinformation\n"
+" uden først at vente på serverens udfordring.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS-tilvalg (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR vælg sikker protokol: en af auto, SSLv2,\n"
+" SSLv3 og TLSv1.\n"
+
+#: src/main.c:850
+#, fuzzy
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " -L, --relative følg kun relative henvisninger.\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate bekræft ikke serverens certifikat.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FIL klientcertifikatfil.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE type af klientcertifikat: PEM eller DER.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FIL privat nøglefil.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TYPE type af privat nøgle: PEM eller DER.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FIL fil med samlingen af CA'er.\n"
+
+#: src/main.c:864
+#, fuzzy
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=KAT katalog hvor hashlisten af CA'er lagres.\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=FIL fil med samlingen af CA'er.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+#, fuzzy
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FIL fil med tilfældige data til at seede \n"
+" SSL-talgeneratoren.\n"
+
+#: src/main.c:878
+#, fuzzy
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FIL fil, der angiver navnet på EGD-soklen med\n"
+" tilfældige data\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "HTTP-flag:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-cache tillad ikke serverlagring af data.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-flag:\n"
+
+#: src/main.c:901
+#, fuzzy
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Brug Stream_LF-format til alle binære FTP-"
+"filer.\n"
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=BRUGER sæt ftp-brugeren til BRUGER.\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=KODE sæt ftp-adgangskoden til KODE.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing fjern ikke '.listing'-filer.\n"
+
+# glob er f.eks. når man skriver *.txt, og skallen svarer med fil1.txt, fil2.txt, ...
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob slå globning af FTP-filnavne fra.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp deaktivér den \"passive\" "
+"overførselstilstand.\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " -S, --server-response udskriv svar fra server.\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks hent filer der henvises til (ikke kataloger) "
+"ved\n"
+" rekursion\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "FTP-flag:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+#, fuzzy
+msgid "WARC options:\n"
+msgstr "FTP-flag:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --header=STRENG indsæt STRENG blandt topteksterne.\n"
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" -t, --tries=ANTAL sæt antal forsøg til ANTAL (0 for "
+"ubegrænset)\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --spider hent intet.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-cookies brug ikke cookies.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --ignore-case ingen forskel på store/små bogstaver ved\n"
+" matching af filer/kataloger\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursiv download:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive angiv rekursiv download.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=ANTAL maksimal rekursionsdybde (inf eller 0 for\n"
+" uendelig).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after slet filer lokalt efter de er hentet.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links få henvisninger i hentet HTML eller CSS til at "
+"pege\n"
+" på lokale filer.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted før konvertering af fil X, så opret\n"
+" sikkerhedskopien X_orig.\n"
+
+#: src/main.c:979
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted før konvertering af fil X, så opret\n"
+" sikkerhedskopien X.orig.\n"
+
+#: src/main.c:982
+#, fuzzy
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror forkortelse for -N -r -l inf --no-remove-"
+"listing.\n"
+
+#: src/main.c:984
+#, fuzzy
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites hent alle billeder osv., der kræves for at vise "
+"en\n"
+" HTML-side.\n"
+
+#: src/main.c:986
+#, fuzzy
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments brug strikt (SGML) håndtering af HTML-"
+"kommentarer.\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursiv accept/afslag:\n"
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTE kommaadskilt liste af accepterede "
+"endelser.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTE kommaadskilt liste af afslåede endelser.\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --progress=TYPE vælg angivelsesmåde af fremgang.\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --progress=TYPE vælg angivelsesmåde af fremgang.\n"
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTE kommaadskilt liste af accepterede "
+"domæner.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTE kommaadskilt liste af afslåede domæner.\n"
+
+#: src/main.c:1011
+#, fuzzy
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp følg FTP-henvisninger fra HTML-"
+"dokumenter.\n"
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTE kommaadskilt liste af HTML-mærker, der\n"
+" følges.\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTE kommaadskilt liste af HTML-mærker, der\n"
+" ignoreres.\n"
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts hop til fremmede værter når rekursiv.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative følg kun relative henvisninger.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTE liste af tillate kataloger.\n"
+
+#: src/main.c:1023
+#, fuzzy
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names brug navnet angivet ved den sidste komponent på "
+"redirektion url'en.\n"
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTE liste af ekskluderede kataloger.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent gå ikke op til ophavskataloget.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, en ikke-interaktiv informationsagent.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Adgangskode for brugeren %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Adgangskode: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Adgangskode for brugeren %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Regionsindstilling (locale): "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilering: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Link: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s kompileret %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (miljø)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (bruger)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Ophavsret © 2009 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licens GPLv3+: GNU GPL version 3 eller nyere\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Dette er frit programmel: du kan frit ændre og videredistribuere det.\n"
+"Der gives INGEN GARANTI, i den grad som dette tillades af loven.\n"
+
+# kan ikke finde nogen en_US.po
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Oprindeligt skrevet af Hrvoje Niksic <hniksic@xemacs.com>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Rapportér venligst fejl og send spørgsmål til <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Prøv '%s --help' for flere flag.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: ugyldigt flag -- '-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Kan ikke være udførlig og stille på samme tid.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Kan ikke tidsstemple og lade være at berøre eksisterende filer på samme "
+"tid.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Kan ikke angive både --inet4-only og --inet6-only.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Kan ikke angive både -k og -O, hvis der er givet flere URL'er, eller sammen\n"
+"med -p eller -r. Flere detaljer kan findes i manualen.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ADVARSEL: kombinationen af -O med -r eller -p betyder, at alt hvad der "
+"hentes,\n"
+"vil blive lagt i den enkelte fil, du angav.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ADVARSEL: tidsstempling gør intet sammen med -O. Detaljer kan findes i\n"
+"manualen.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Kan ikke angive både --ask-password og --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL mangler.\n"
+
+#: src/main.c:1836
+#, fuzzy, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Kan ikke angive både --ask-password og --password.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, fuzzy, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Kan ikke angive både --inet4-only og --inet6-only.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Denne version understøtter ikke IRI'er.\n"
+
+#: src/main.c:2003
+#, fuzzy, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k kan kun bruges sammen med -O hvis udskrivning er til en almindelig fil.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"-k kan kun bruges sammen med -O hvis udskrivning er til en almindelig fil.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Kan ikke aflænke den symbolske lænke %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: kan ikke evaluere værtsadresse %s\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Fandt ingen URLer i %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Kan ikke slette %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FÆRDIG --%s--\n"
+"Hentede %d filer, %s på %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Hente-kvote på %s OVERSKREDET!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Proxytunnel slog fejl: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Kan ikke slette %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Ingen fil ved navn %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "Intet certifikat fundet\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Fjerner %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Fortsætter i baggrunden.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Fortsætter i baggrunden, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Uddata vil blive skrevet til %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Fandt ingen brugbar sokkel-driver.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: advarsel: Symbolet %s fundet før noget maskinenavn\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: ukendt symbol '%s'\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Brug: %s NETRC [VÆRTSNAVN]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: 'stat' fejlede for %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "ADVARSEL: bruger en svag tilfældig seed.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Kunne ikke seede pseudotilfældig talgenerator; prøv at bruge --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Ugyldig URL %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"Kunne ikke seede pseudotilfældig talgenerator; prøv at bruge --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: kan ikke verificere certifikat for %s, udstedt af %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Kan ikke lokalt verificere udstederens autoritet.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Der blev fundet et selvunderskrevet certifikat.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " De udstedte certifikat er endnu ikke gyldigt.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Det udstedte certifikat er udløbet.\n"
+
+# 'common name' kan f.eks. være et personnavn. Eksempel findes på
+# http://tools.ietf.org/html/rfc5280
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: intet certifikatsubjekts alternative navn svarer til det forspurgte "
+"værtsnavn %s.\n"
+
+# 'common name' kan f.eks. være et personnavn. Eksempel findes på
+# http://tools.ietf.org/html/rfc5280
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: certifikatets trivialnavn %s svarer ikke til det forespurgte "
+"værtsnavn %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: certifikatets trivialnavn er ugyldigt (indeholder et NUL-tegn).\n"
+" Dette kan være et tegn på at værten ikke er den, den udgiver sig for\n"
+" (altså at det ikke er den rigtige %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Brug '--no-check-certificate' for at forbinde til %s på usikker vis.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ springer over %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Ugyldig punkt-stilangivelse %s; forbliver uændret.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " tid %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " om "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Kan ikke finde frekvens af REALTIME-ur: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Fjerner %s fordi den skal forkastes.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan ikke åbne %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Henter robots.txt; ignorer eventuelle fejlmeldinger.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Fejl ved fortolkning af proxy-URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Fejl i proxy URL %s: Skal være HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d omdirigeringer overskredet.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Giver op.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Prøver igen.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Fandt ingen ødelagte henvisninger.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Fandt %d ødelagt henvisning.\n"
+"\n"
+msgstr[1] ""
+"Fandt %d ødelagte henvisninger.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ingen fejl"
+
+# scheme?
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Ikke-understøttet skema %s"
+
+# scheme?
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Skema mangler"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Værtsnavnet er ugyldigt"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ugyldigt portnummer"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ugyldigt brugernavn"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Uafsluttet numerisk IPv6-adresse"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-adresser understøttes ikke"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ugyldig numerisk IPv6-adresse"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Understøttelse af HTTPS er ikke kompileret med"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Ufuldstændig eller ugyldig flerbytesekvens fundet\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Kunne ikke allokere nok hukommelse; hukommelsen opbrugt.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Kunne ikke allokere %ld byte; hukommelsen opbrugt.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: tekstbuffer er for stor (%ld byte), afbryder.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Fortsætter i baggrunden, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Kan ikke aflænke den symbolske lænke %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Kunne ikke få certifikatnøgle fra %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Kunne ikke indlæse certifikater fra %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Fejl ved skrivning til %s: %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Fejl ved fortolkning af certifikat: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr "Fandt ikke proxy-server.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#~ msgid "Unknown system error"
+#~ msgstr "Ukendt systemfejl"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: flaget '%s' er flertydig\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: flaget '--%s' tillader ikke et argument\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: flaget '%c%s' tillader ikke et argument\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: flaget '--%s' kræver et argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: ukendt flag '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: ukendt flag '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: ugyldigt flag -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: flaget kræver et argument -- %c\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: flaget '-W %s' er flertydigt\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: flaget '-W %s' tillader ikke et argument\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: flaget '%s' kræver et argument\n"
+
+#~ msgid "`"
+#~ msgstr "'"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "memory exhausted"
+#~ msgstr "hukommelse opbrugt"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorisation mislykkedes\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode mislykkedes (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s modtaget.\n"
+
+#~ msgid " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ msgstr " -w, --wait=SEKUNDER vent SEKUNDER mellem hentninger.\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgstr "Rapportér fejl og send forslag til <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Filen '%s' findes allerede, hentes ikke.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "ADVARSEL: Kan ikke genåbne standard-uddata i binær tilstand;\n"
+#~ " den hentede fil kan indeholde forkerte linjeafslutninger.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: ugyldigt flag -- %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s bygget på VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Vedligeholdes i øjeblikket af Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "fejl ved Set-Cookie, felt '%s'"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Syntaksfejl i Set-Cookie ved tegnet '%c'.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST mislykkedes; vil ikke afkorte '%s'.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s tilbage]"
+
+#~ msgid "Host not found"
+#~ msgstr "Vært ikke fundet"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Kunne ikke opsætte et SSL-miljø\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Prøver uden det angivne certifikat\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Filafslutning fundet ved læsning af toptekster.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Fortsat hentning mislykkedes for denne fil, hvilket er i modsætning til '-"
+#~ "c'.\n"
+#~ "Nægter at afkorte eksisterende fil '%s'.\n"
+#~ "\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (%s tilbage)"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Filen '%s' hentes ikke, fordi den allerede eksisterer.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - '%s' gemt [%ld/%ld]\n"
+#~ "\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Forbindelse lukket ved byte %ld/%ld. "
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Kan ikke omforme '%s' til en IP-adresse.\n"
+
+#~ msgid "%s: %s: Please specify always, on, off, or never.\n"
+#~ msgstr "%s: %s: Venligst angiv 'always', 'on' 'off', eller 'never'.\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opstart:\n"
+#~ " -V, --version vis Wget's versionsnummer og afslut.\n"
+#~ " -h, --help udskriv denne hjælpetekst.\n"
+#~ " -b, --background kør i baggrunden efter opstart.\n"
+#~ " -e, --execute=KOMMANDO udfør en '.wgetrc'-kommando.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logning og indlæsning:\n"
+#~ " -o, --output-file=FIL log beskeder til FIL.\n"
+#~ " -a, --append-output=FIL tilføj beskeder til slutningen af FIL.\n"
+#~ " -d, --debug skriv fejlsøgningsinformation.\n"
+#~ " -q, --quiet stille (ingen udskrifter).\n"
+#~ " -v, --verbose vær udførlig (standard).\n"
+#~ " -nv, --non-verbose mindre udførlig, men ikke stille.\n"
+#~ " -i, --input-file=FIL hent URLer fundet i FIL.\n"
+#~ " -F, --force-html behandl inddatafil som HTML.\n"
+#~ " -B, --base=URL foranstiller URL til relative lænker i -F -"
+#~ "i fil.\n"
+#~ " --sslcertfile=FIL valgbart klient-certifikat.\n"
+#~ " --sslcertkey=NØGLEFIL valgbar nøglefil for dette certifikat.\n"
+#~ " --egd-file=FIL filnavn for EGD-soklen.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set the read timeout to SECONDS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Hentning:\n"
+#~ " --bind-address=ADRESSE bind til ADRESSE (værtsnavn eller IP) på "
+#~ "lokal vært.\n"
+#~ " -t, --tries=ANTAL maksimalt antal forsøg (0 for uendelig).\n"
+#~ " -O --output-document=FIL skriv dokumenter til FIL.\n"
+#~ " -nc, --no-clobber berør ikke eksisterende filer, eller "
+#~ "brug .#-endelser.\n"
+#~ " -c, --continue fortsæt hentning af en eksisterende fil.\n"
+#~ " --progress=TYPE vælg type af fremskridtsvisning.\n"
+#~ " -N, --timestamping hent ikke filer igen som er ældre end "
+#~ "eksisterende.\n"
+#~ " -S, --server-response vis svar fra serveren.\n"
+#~ " --spider hent ikke filer.\n"
+#~ " -T, --timeout=SEKUNDER sæt ventetid ved læsning til SEKUNDER.\n"
+#~ " -w, --wait=SEKUNDER sæt ventetid mellem filer til SEKUNDER.\n"
+#~ " --waitretry=SEKUNDER\twait 1...SEKUNDER mellem forsøg på "
+#~ "gentagelse af en hentning.\n"
+#~ " --random-wait vent fra 0...2*WAIT sekunder mellem "
+#~ "modtagelse.\n"
+#~ " -Y, --proxy=on/off slå brug af proxy til eller fra.\n"
+#~ " -Q, --quota=ANTAL sæt hente-kvote til ANTAL.\n"
+#~ " --limit-rate=RATE begræns hentingshastighed til RATE.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Kataloger:\n"
+#~ " -nd --no-directories lav ikke kataloger.\n"
+#~ " -x, --force-directories lav kataloger.\n"
+#~ " -nH, --no-host-directories lav ikke ovenstående kataloger.\n"
+#~ " -P, --directory-prefix=PRÆFIKS skriv filer til PRÆFIKS/...\n"
+#~ " --cut-dirs=ANTAL ignorér ANTAL komponenter af "
+#~ "serverens\n"
+#~ " katalognavn.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTP-flag:\n"
+#~ " --http-user=BRUGER sæt HTTP-bruger til BRUGER.\n"
+#~ " --http-passwd=PASSORD sæt HTTP-adgangskode til PASSORD.\n"
+#~ " -C, --cache=on/off tillad (ikke) brug af mellemlager på "
+#~ "server.\n"
+#~ " -E, --html-extension gem alle tekst/html dokumenter med .html "
+#~ "filkode.\n"
+#~ " --ignore-length ignorer 'Content-Length' felt i toptekst.\n"
+#~ " --header=TEKST sæt TEKST ind som en toptekst.\n"
+#~ " --proxy-user=BRUGER sæt proxy-bruger til BRUGER.\n"
+#~ " --proxy-passwd=PASSORD sæt proxy-adgangskode til PASSORD.\n"
+#~ " --referer=URL brug `Referer: URL' kommando i HTTP-"
+#~ "forespørgsel.\n"
+#~ " -s, --save-headers skriv HTTP-toptekster til fil.\n"
+#~ " -U, --user-agent=AGENT identificer som AGENT i stedet for \n"
+#~ " 'Wget/VERSION'.\n"
+#~ " --no-http-keep-alive deaktivér HTTP keep-alive (overlevende "
+#~ "forbindelser).\n"
+#~ " --cookies=off brug ikke infokager.\n"
+#~ " --load-cookies=FILE indlæs infokager fra FIL før session.\n"
+#~ " --save-cookies=FILE gem infokager i FIL efter session.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "FTP-flag:\n"
+#~ " -nr, --dont-remove-listing fjern ikke `.listing'-filer.\n"
+#~ " -g, --glob=on/off tolk (ikke) brug af jokertegn i filnavn.\n"
+#~ " --passive-ftp brug passiv overførselsmetode.\n"
+#~ " --retr-symlinks hent filer (ikke kataloger) der er lænket "
+#~ "til, ved rekursiv brug.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive web-suck -- use with care!\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Rekursiv nedlasting:\n"
+#~ " -r, --recursive tillad rekursiv nedlasting -- brug med "
+#~ "omtanke!\n"
+#~ " -l, --level=ANTAL maksimalt antal rekursionsniveauer "
+#~ "(0=uendelig).\n"
+#~ " --delete-after slet hentede filer.\n"
+#~ " -k, --convert-links konverter absolutte lænker til relative.\n"
+#~ " -K, --backup-converted før fil X konverteres, sikkerhedskopiér "
+#~ "som X.orig.\n"
+#~ " -m, --mirror sæt passende flag for spejling af "
+#~ "servere.\n"
+#~ " -p, --page-requisites hent alle billeder osv. der er nødvendige "
+#~ "for at vise HTML siden.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Hvad er tilladt ved rekursion:\n"
+#~ " -A, --accept=LISTE liste med tilladte filtyper.\n"
+#~ " -R, --reject=LISTE liste med ikke-tilladte filtyper.\n"
+#~ " -D, --domains=LISTE liste med tilladte domæner.\n"
+#~ " --exclude-domains=LISTE liste med ikke-tilladte domæner.\n"
+#~ " --follow-ftp følg FTP-lænker fra HTML-dokumenter.\n"
+#~ " --follow-tags=LIST komma-separeret liste af fulgte HTML-"
+#~ "mærker.\n"
+#~ " -G, --ignore-tags=LIST komma-separeret liste af ignorerede "
+#~ "HTML-mærker.\n"
+#~ " -H, --span-hosts følg lænker til andre værter.\n"
+#~ " -L, --relative følg kun relative lænker.\n"
+#~ " -I, --include-directories=LISTE liste med tilladte katalognavne.\n"
+#~ " -X, --exclude-directories=LISTE liste med ikke-tilladte "
+#~ "katalognavne.\n"
+#~ " -np, --no-parent følg ikke lænke til ovenliggende "
+#~ "katalog.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Dette program distribueres i håb om at det bliver fundet nyttigt,\n"
+#~ "men UDEN NOGEN GARANTIER; ikke engang for SALGBARHED eller\n"
+#~ "EGNETHED TIL NOGEN SPECIEL OPGAVE.\n"
+#~ "Se 'GNU General Public License' for detaljer.\n"
+
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Starter WinHelp %s\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: Omdirigering løber i ring.\n"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Ikke nok hukommelse.\n"
+
+#~ msgid "Connection to %s:%hu refused.\n"
+#~ msgstr "Kontakt med %s:%hu nægtet.\n"
+
+#~ msgid "Will try connecting to %s:%hu.\n"
+#~ msgstr "Vil prøve at kontakte %s:%hu.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "CTRL+Break received, redirecting output to `%s'.\n"
+#~ "Execution continued in background.\n"
+#~ "You may stop Wget by pressing CTRL+ALT+DELETE.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "CTRL+Break modtaget, omdirigerer udskrifter til `%s'.\n"
+#~ "Kørsel fortsætter i baggrunden.\n"
+#~ "Du kan stoppe Wget ved at trykke CTRL+ALT+DELETE.\n"
+#~ "\n"
+
+#~ msgid "Unknown/unsupported protocol"
+#~ msgstr "Protokollen er ukendt/ikke understøttet"
+
+#~ msgid "Invalid port specification"
+#~ msgstr "Port-specifikationen er ugyldig"
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644
index 0000000..67eff10
--- /dev/null
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..a482069
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,3774 @@
+# German messages for GNU Wget.
+# Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Karl Eichwalder <ke@suse.de>, 1998-1999, 2000.
+# Karl Eichwalder <ke@ke.Central.DE>, 1997-1998.
+# Jochen Hein <jochen@jochen.org>, 2001-2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-07 20:07+0200\n"
+"Last-Translator: Jochen Hein <jochen@jochen.org>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+# XXX
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: Bind-Adresse %s kann nicht aufgelöst werden; Bind wird nicht verwendet.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Verbindungsaufbau zu %s|%s|:%d … "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Verbindungsaufbau zu %s:%d … "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Verbindungsaufbau zu [%s]:%d … "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF fehlgeschlagen: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "verbunden.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "fehlgeschlagen: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: Host-Adresse %s kann nicht aufgelöst werden\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR fehlgeschlagen: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Zu viele geöffnete Dateideskriptoren. Select kann nicht für "
+"Dateidesktiptoren >= %d verwendet werden\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Links in %d Dateien in %s Sekunden umgewandelt.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Umwandlung von Links in »%s«… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "Nichts zu tun.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Verweise nicht umwandelbar in »%s«: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Es ist nicht möglich, %s zu löschen: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Anlegen einer Sicherung von »%s« als »%s« nicht möglich: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Es ist nicht möglich, den Cookie für %s zu holen\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaxfehler bei Set-Cookie, %s an der Stelle %d.\n"
+
+# XXX
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie von %s versuchte die Domain zu ändern auf "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Cookie-Datei %s kann nicht geöffnet werden: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Fehler beim Schreiben in die Datei %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Fehler beim Schließen der Datei %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Nicht unterstützte Art der Auflistung; Versuch Unix-Auflistung zu "
+"verwenden.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index von /%s auf %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Zeit unbekannt "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Datei "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Verzeichnis "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Verweis "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Nicht sicher"
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s Bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Länge: %s"
+
+# XXX
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) sind noch übrig"
+
+# XXX
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s übrig"
+
+# wohl "unmaßgeblich", nicht "ohne Berechtigung"
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (unmaßgeblich)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL kann nicht initialisiert werden. Es wird kein SSL verwendet.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Anmelden als %s … "
+
+# Ist das gemeint?
+# Das finde ich nicht gut. Ich denke, Programme sollten nie in der
+# 1. Person von sich sprechen. Im Deutschen könnte man sagen:
+# ... Kontroll-Verbindung wird geschlossen
+# oder
+# ... Schließen der Kontroll-Verbindung
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ""
+"Fehler in der Antwort des Servers; Kontroll-Verbindung wird geschlossen.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Fehler bei der Begrüßung des Servers.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Schreiben schlug fehl; Kontroll-Verbindung wird geschlossen.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Der Server verweigert die Anmeldung.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Fehler bei der Anmeldung.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Angemeldet!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Der Server hat das Kommando »PBSZ 0« nicht akzeptiert.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Der Server hat das Kommando »PROT %c« nicht akzeptiert.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr ""
+"Fehler beim Server; es ist nicht möglich, die Art des Systems "
+"festzustellen.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "fertig. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "fertig.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Unbekannte Art »%c«, Kontroll-Verbindung wird geschlossen.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "fertig. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nicht notwendig.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Logisch unmöglicher Abschnitt in »getftp()« wurde erreicht"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Das Verzeichnis %s existiert nicht.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nicht erforderlich.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Die Datei ist bereits geholt worden.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "PASV-Ãœbertragung kann nicht begonnen werden.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "PASV-Antwort kann nicht ausgewertet werden.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "Verbindung zu »%s« auf Port »%d« konnte nicht hergestellt werden: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Verbindungsfehler (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ungültiger PORT.\n"
+
+# Wieder das mit der 1. Person :)
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST schlug fehl; es wird wieder von vorn begonnen.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Die Datei %s existiert.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"Die Datei %s existiert nicht.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Die Datei %s existiert nicht.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Die Datei oder das Verzeichnis %s existiert nicht.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "»%s« ist plötzlich entstanden.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s; Kontroll-Verbindung wird geschlossen.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Daten-Verbindung: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Kontroll-Verbindung wurde geschlossen.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Daten-Ãœbertragung abgebrochen.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Die Datei %s ist schon vorhanden; kein erneuter Download.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(Versuch:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - auf die Standardausgabe geschrieben [%s/%s]\n"
+"\n"
+
+# oder "gesichert"?
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gespeichert [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "»%s« wird entfernt.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "%s wird als temporäre Auflistungsdatei benutzt.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s gelöscht.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Die Rekursionstiefe %d übersteigt die maximal erlaubte Tiefe %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Datei auf dem Server ist nicht neuer als die lokale Datei %s -- kein "
+"Download.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server ist neuer als die lokale Datei %s, -- Download "
+"erfolgt.\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Größen stimmen nicht überein (lokal %s) -- erneuter Download.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ungültiger Name für einen symbolischen Verweis; übersprungen.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr "Der richtige symbolische Verweis %s -> %s ist schon vorhanden.\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr ""
+"Symbolischer Verweis %s -> %s wird angelegt.\n"
+"\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Symbolische Verweise werden nicht unterstützt; symbolischer Verweis %s "
+"übersprungen.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Verzeichnis %s übersprungen.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: unbekannter bzw. nicht unterstützter Dateityp.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Fehler beim Setzen der Rechte für »%s«.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: beschädigter Zeitstempel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Verzeichnisse werden nicht erneut geholt; da die Tiefe bereits %d ist (max. "
+"erlaubt %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+"Nicht zu %s hinabsteigen, da es ausgeschlossen bzw. nicht eingeschlossen "
+"ist.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s zurückgewiesen.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s zurückgewiesen (Ungültiger Eintrag).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+"%s ist ausgeschlossen bzw. nicht eingeschlossen aufgrund eines Regulären "
+"Ausdrucks.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Fehler beim Vergleichen von »%s« mit %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Keine Treffer bei dem Muster %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "HTML-artiger Index wurde nach %s [%s] geschrieben.\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "HTML-artiger Index wurde nach %s geschrieben.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+"ERROR: Verzeichnis »%s« kann nicht geöffnet werden.\n"
+"\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERROR: Zertifikat »%s« kann nicht geöffnet werden: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "CA-Zertifikat »%s« wurde geladen\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERROR: CRL-Datei »%s« kann nicht geladen werden: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "CRL-Datei »%s« wurde geladen\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ERROR: GnuTLS verlangt, dass der Schlüssel und das Zertifikat vom gleichen "
+"Typ sind.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Ihre GnuTLS-Version ist zu alt, um TLSv1.3 zu unterstützen\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: Option %u zu »secure-protocol« ist nicht implementiert\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Bitte dieses Problem an <bug-wget@gnu.org> melden\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: Option %d zu »secure-protocol« ist nicht implementiert\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Priorität kann nicht direkt angegeben werden. Verwende die Standard-"
+"Priorität als Ersatz.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "FEHLER"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "WARNUNG"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Kein Zertifikat angegeben von %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Dem Zertifikat von %s wird nicht vertraut.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Das Zertifikat von »%s« hat keinen bekannten Austeller.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Das Zertifikat von %s wurde für ungültig erklärt.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Der Unterzeichner des Zertifikats von %s ist keine CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: Das Zertifikat von »%s« wurde mit einem unsicheren Algorithmus "
+"signiert.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Dem Zertifikat von %s ist noch nicht aktiviert.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Das Zertifikat von %s ist abgelaufen.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Fehler beim Initialisieren des X509-Zertifikates: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Kein Zertifikat gefunden.\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Fehler beim Auswerten des Zertifikates: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Das ausgestellte Zertifikat ist noch nicht aktiviert.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Das ausgestellte Zertifikat ist nicht mehr gültig.\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Der Zertifikat-Eigentümer passt nicht zum Hostname %s.\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+"Der öffentliche Schlüssel ist nicht mehr der gespeicherte öffentliche "
+"Schlüssel!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Es muss ein X.509-Zertifikat verwendet werden\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Fehler in der Verarbeitung der Adressliste.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Unbekannter Rechner"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Temporärer Fehler bei der Namensauflösung"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Unbekannter Fehler"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Auflösen des Hostnamens %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "Fehler: Keine IPv4/IPv6-Adresse für den Host.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "fehlgeschlagen: Wartezeit abgelaufen.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Der unvollständige Verweis »%s« kann nicht aufgelöst werden.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"»no-follow» Attribut in »%s« gefunden. Links auf dieser Seite werden nicht "
+"verfolgt\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ungültige URL »%s«: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Fehler beim Schreiben der HTTP-Anforderung: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Keine Header, vermutlich ist es HTTP/0.9."
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Die Datei %s ist schon vorhanden; kein erneuter Download.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime hat nicht funktioniert. Das ist vermutlich ein Fehler.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Kann den Zeitstempel nicht in das http-Format umwandeln. Benutze stattdessen "
+"die Zeit 0 als Zeitpunkt der letzten Änderung.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY-Datendatei %s fehlt: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Wiederverwendung der bestehenden Verbindung zu [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Wiederverwendung der bestehenden Verbindung zu %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Fehler beim Lesen der Proxy-Antwort: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s FEHLER %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Statuszeile ist nicht korrekt"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Proxy-Tunneling fehlgeschlagen: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Unbekanntes Authentifizierungsschema.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Authentifizierung ausgewählt: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Wird in %s gespeichert.\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Beim Herunterladen der Signatur:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Kann den Signatur-Inhalt nicht aus der temporären Datei lesen. "
+"Ãœberspringe...\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Kann die temporäre Datei nicht erstellen. Überspringe das Herunterladen der "
+"Signatur.\n"
+
+# XXX Source?
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "ungültiger pri Wert. Verwende %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Kann keinen akzeptablen Digest für die Metalink Ressource finden.\n"
+"Diese werden ignoriert.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "SSL wird ausgeschaltet, nachdem Fehler aufgetreten sind.\n"
+
+# Wieder das mit der 1. Person :)
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-Anforderung gesendet, auf Antwort wird gewartet … "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Keine Daten empfangen.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Lesefehler (%s) beim Vorspann (header).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(keine Beschreibung)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Platz: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nicht spezifiziert"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [folgend]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr "Datei %s auf dem Server unverändert. Wird nicht heruntergeladen.\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Der Server ignorierte den If-Modified-Since header für Datei %s.\n"
+"Sie möchten vielleicht die Option »--no-if-modified-since« verwenden.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Download der Datei schon vollständig; kein Download notwendig.\n"
+"\n"
+
+# Header
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Länge: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "übergangen"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Warnung: Joker-Zeichen werden bei HTTP nicht unterstützt.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"Spider-Modus eingeschaltet. Es wird geprüft, ob die Datei auf dem Server "
+"existiert.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Schreiben nach %s nicht möglich (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Ein notwendiges Attribut im empfangenen Header fehlt.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Authentifizierung mit Benutzername/Passwort fehlgeschlagen.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "In die WARC-Datei kann nicht geschrieben werden.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "In die temporäre WARC-Datei kann nicht geschrieben werden.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Es ist nicht möglich, eine SSL-Verbindung herzustellen.\n"
+
+# XXX
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Verweis auf %s kann nicht entfernt werden (%s).\n"
+
+# Was meint hier location?
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "FEHLER: Umleitung (%d) ohne Ziel.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Keine Metalink-Daten in der HTTP-Antwort. Datei wird mittel HTTP GET "
+"heruntergeladen.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Metalink Header gefunden. Metalink Modus wird verwendet.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+"Die Datei auf dem Server existiert nicht -- Verweis ist nicht gültig!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "»Last-modified«-Kopfzeile fehlt -- Zeitstempel abgeschaltet.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "»Last-modified«-Kopfzeile ungültig -- Zeitstempel übergangen.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server nicht neuer als die lokale Datei %s -- kein Download.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Größen stimmen nicht überein (lokal %s) -- erneuter Download.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Datei der Gegenseite ist neuer, erneuter Download.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server existiert und enhält Verweise -- Download erfolgt.\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server existiert, aber enhält keine Verweise -- kein "
+"Download.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server existiert und könnte weitere Verweise enthalten,\n"
+"aber Rekursion ist abgeschaltet -- kein Download.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Datei auf dem Server existiert.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - auf die Standardausgabe geschrieben %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gespeichert [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Verbindung bei Byte %s geschlossen. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Lesefehler bei Byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Lesefehler bei Byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Qualität des Schutzes »%s« wird nicht unterstützt.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nicht unterstützter Algorithmus »%s«.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC zeigt auf die Datei »%s«, auf die nicht zugegriffen werden kann: "
+"%s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: »%s« nicht lesbar (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Fehler in der Datei »%s« bei Zeile %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Fehler in der Datei »%s« in Zeile %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Unbekannter Befehl %s in der Datei »%s« in Zeile %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Auswerten der systemweiten wgetrc-Datei (env SYSTEM_WGETRC) fehlgeschlagen.\n"
+"Bitte »%s« prüfen,\n"
+"oder eine andere Datei mittels »--config« angeben.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Auswerten der System wgetrc-Datei fehlgeschlagen.\n"
+"Bitte »%s« prüfen,\n"
+"oder eine andere Datei mittels »--config« angeben.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Warnung: »wgetrc« des Systems und des Benutzers zeigen beide auf %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Ungültiger »--execute«-Befehl %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Ungültiger Schalter %s, bitte »on« oder »off« angeben.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: %s ist ungültig, bitte »on«, »off« oder »quiet« angeben.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ungültige Nummer %s\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s darf nur einmal verwendet werden\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ungültiger Byte-Wert %s.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ungültige Zeitperiode %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Negative Zeitperiode %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"für use-askpass muss eine Zeichenkette angegeben werden oder entweder die "
+"Umgebungsvariable WGET_ASKPASS oder SSH_ASKPASS gesetzt sein.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ungültiger Wert %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ungültige Kopfzeile %s\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ungültige WARC Kopfzeile %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ungültiger Fortschrittstyp %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Ungültige Einschränkung %s,\n"
+" verwenden Sie [unix|vms|windows],[lowercase|uppercase],[nocontrol],"
+"[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Die Kodierung %s ist nicht korrekt\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konvertierung von %s nach %s wird nicht unterstützt\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Unvollständige oder ungültige Multi-Byte-Sequenz\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Fehlernummer %d nicht behandelt\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: Lokale ist nicht gesetzt\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode fehlgeschlagen (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Fehler beim Konvertieren zu Kleinbuchstaben: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Ausgabe wird nach %s umgeleitet.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; Protokollierung wird ausgeschaltet.\n"
+
+# usage → »Aufruf« ist einige der wenigen Regeln, die wir beim TP
+# überhaupt haben ;)
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Aufruf: %s [OPTION]... [URL] …\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Erforderliche Argumente zu langen Optionen sind auch bei kurzen Optionen "
+"erforderlich.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Beim Start:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version Programmversion von Wget anzeigen und "
+"beenden\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help diese Hilfe anzeigen\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background nach dem Starten in den Hintergrund "
+"gehen\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=BEFEHL einen ».wgetrc«-artigen Befehl ausführen\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Log-Datei schreiben und Eingabe-Datei:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=DATEI Protokoll-Meldungen in DATEI schreiben\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=DATEI Meldungen an DATEI anhängen\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug Debug-Ausgabe anzeigen\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug Watt-32 Debug-Ausgabe anzeigen\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet keine Ausgabe von Meldungen\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose ausführliche Meldungen (Vorgabe)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose weniger Meldungen, aber nicht stumm\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYP Bandbreite als TYP ausgeben.\n"
+" TYP kann »bits« sein.\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DATEI in lokaler oder externer DATEI\n"
+" gelistete URLs holen\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=DATEI in lokaler Metalink DATEI gelistete\n"
+" URLs holen\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html Eingabe-Datei als HTML behandeln\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL Verweise in der HTML Eingabedatei (-i -"
+"F)\n"
+" relativ zur URL auflösen\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=DATEI Datei mit der Konfiguration\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config keine Konfigrationsdatei verwenden\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=DATEI Grund der URL-Ablehnung in DATEI "
+"schreiben\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Download:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ZAHL Anzahl der Wiederholversuche auf ZAHL "
+"setzen\n"
+" (0 steht für unbegrenzt)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused Wiederholen, auch wenn der Partner die\n"
+" Verbindung abgelehnt hat\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=FEHLER komma-unterteilte Liste von HTTP-"
+"Fehlern\n"
+" bei denen erneut versucht wird\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=DATEI Dokumente in DATEI schreiben\n"
+
+# Werden solche Zeilen umgebrochen, sollten die folgenden Zeilen
+# um zwei Zeichen eingerückt werden
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber Downloads überspringen, die bestehende\n"
+" Dateien überschreiben würden\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc Keine Credentials aus ».netrc« lesen\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue Fortführung des Downloads einer bereits "
+"zum\n"
+" Teil geholten Datei\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=OFFSET Start Download ab OFFSET (Null-basiert)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=STYLE Fortschrittsanzeige mit STYLE darstellen\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress Immer eine Fortschrittsanzeige "
+"darstellen\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping Nur Dateien holen, die neuer als die "
+"lokalen\n"
+" Dateien sind\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since Die Bedingung if-modified-since bei\n"
+" GET-Requests im Zeitstempel-Modus\n"
+" nicht verwenden\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps setze den Zeitstempel der lokalen Datei\n"
+" nicht auf den Zeitstempel der Datei "
+"auf\n"
+" dem Server.\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response Antwort des Servers anzeigen\n"
+
+# XXX
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+" --spider kein Download (nichts herunterladen)\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=SEKUNDEN alle Timeouts auf SEKUNDEN setzen\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESSEN Liste der zu befragenden DNS-Server "
+"(Komma-separiert)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADRESSE DNS-Resolver an die ADRESSE (Hostname\n"
+" oder IP) des lokalen Rechners\n"
+" binden\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNDEN den Timeout der DNS-Abfrage auf\n"
+" SEKUNDEN setzen\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEKUNDEN den Verbindungs-Timeout auf SEKUNDEN "
+"setzen\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEKUNDEN den Lese-Timeout auf SEKUNDEN setzen\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SEKUNDEN SEKUNDEN zwischen den Downloads warten\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDEN 1..SEKUNDEN zwischen den erneuten "
+"Versuchen\n"
+" warten\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait Zwischen 0,5*WAIT und 1,5*WAIT Sekunden\n"
+" zwischen den Abfragen warten\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy Keinen Proxy verwenden\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ZAHL Kontingent für den Download auf ZAHL "
+"setzen\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESSE An die ADRESSE (Hostname oder IP) des\n"
+" lokalen Rechners binden\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RATE Datenrate beim Download auf RATE "
+"begrenzen\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache Zwischenspeichern von DNS-Abfragen\n"
+" ausschalten\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS Verwendbare Zeichen in Dateinamen auf\n"
+" diejenigen einschränken, die das\n"
+" Betriebssystem erlaubt\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case Groß-/Kleinschreibung bei Datei- und\n"
+" Verzeichnisnamen ignorieren\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only Nur zu IPv4-Adressen verbinden\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only Nur zu IPv6-Adressen verbinden\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIE Zunächst eine Verbindung zur angegebenen\n"
+" Familie aufbauen, eins von »IPv6«,\n"
+" »IPv4« oder »none«\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=BENUTZER BENUTZER als ftp- und http-Benutzer\n"
+" verwenden\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PASSWORT PASSWORT als ftp- und http-Passwort\n"
+" verwenden\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password Nach Passworten fragen\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMMAND gibt ein Kommando zur Eingabe von "
+"Benutzername\n"
+" und Passwort an. Wenn kein Kommando "
+"angegeben\n"
+" wird, dann wird die Umgebungsvariable\n"
+" WGET_ASKPASS oder SSH_ASKPASS "
+"verwendet.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri Unterstützung für IRI abschalten\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC ENC als die lokale Kodierung\n"
+" für IRIs verwenden\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC ENC als die externe Standardkodierung\n"
+" verwenden\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink Datei löschen vor dem Überschreiben\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash behalte Dateien mit Prüfsummenfehler (es "
+"wird ».badhash« angehängt)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMMER Metalink Applikation bzw. metalink4+xml "
+"metaurl Ordnungszahl NUMMER\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http verwende Metalink Metadaten aus dem\n"
+" HTTP Response Header\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location bevorzugter Ort für Metalink Ressourcen\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr Metadaten in erweiterten Dateiattributen "
+"speichern\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Verzeichnisse:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories keine Verzeichnisse anlegen\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+" -x, --force-directories Anlegen von Verzeichnissen erzwingen\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories keine Host-Verzeichnisse anlegen\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories Den Protokollnamen in Verzeichnissen\n"
+" verwenden\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=PRÄFIX Dateien unter dem Verzeichnis PRÄFIX/..\n"
+" speichern\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ZAHL ZAHL der Verzeichnisebenen der "
+"Gegenseite\n"
+" überspringen\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-Optionen:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=BENUTZER http-Benutzer auf BENUTZER setzen\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-passwd=PASSWORT http-Passwort auf PASSWORT setzen\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache Serverseitige Zwischenspeicherung der "
+"Daten\n"
+" verbieten\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME Den Namen der Standard-Seite ändern\n"
+" (normalerweise »index.html«)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension alle text/html-Dokumente mit der "
+"richtigen\n"
+" Namenserweiterung speichern\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length das »Content-Length«-Kopffeld ignorieren\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=ZEICHENKETTE ZEICHENKETTE in die Kopfzeilen einfügen\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYP Komprimierung: »auto«, »gzip« oder "
+"»none«. (Standard: »none«)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximale Anzahl erlaubter »Redirects«\n"
+" (Umleitungen) pro Seite\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=BENUTZER BENUTZER als Proxy-Benutzername "
+"verwenden\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-passwd=PASS PASS als Proxy-Passwort verwenden\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL die Kopfzeile »Referer: URL« der HTTP-\n"
+" Anforderung hinzufügen\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers den HTTP-Vorspann (header lines) in "
+"einer\n"
+" Datei sichern\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT als AGENT anstelle von Wget/VERSION\n"
+" identifizieren\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive »HTTP keep-alive« (persistente "
+"Verbindungen)\n"
+" deaktivieren\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies Cookies nicht verwenden\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=DATEI Cookies vor der Sitzung aus der DATEI "
+"laden\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=DATEI Cookies nach der Sitzung in der DATEI\n"
+" speichern\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies (nicht-permanente) Session-Cookies\n"
+" laden und speichern\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ZEICHENKETTE Die POST-Methode verwenden, dabei die\n"
+" ZEICHENKETTE als Daten senden\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=DATEI Die POST-Methode verwenden, dabei den "
+"Inhalt\n"
+" aus DATEI verwenden\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod die Methode »HTTPMethod« im Header "
+"verwenden\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ZEICHENKETTE ZEICHENKETTE als Daten verwenden.\n"
+" »--method« muss angegeben werden\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=DATEI Den Inhalt der Datei als Daten senden.\n"
+" »--method« muss angegeben werden.\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition Den Content-Disposition-Header bei der\n"
+" Auswahl lokaler Dateinamen beachten\n"
+" (EXPERIMENTELL).\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error Den empfangenen Inhalt ausgeben, wenn\n"
+" der Server einen Fehler meldet.\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge »Basic HTTP authentication«-"
+"Informationen\n"
+" senden, ohne zuerst auf die "
+"Aufforderung des\n"
+" Serverszu warten\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) Optionen:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR Als sicheres Protokoll eines aus »auto«,\n"
+" »SSLv2«, »SSLv3«, »TLSv1«, »TLSv1_1«,\n"
+" »TLSv1_2« oder »PFS« verwenden.\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only Nur sicheren HTTPS-Verweisen folgen\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate Das Server-Zertifikat nicht prüfen\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=DATEI Datei mit dem Client-Zertifikat\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYP Typ des Client-Zertifikates, entweder\n"
+" »PEM« oder »DER«\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=DATEI Datei mit dem geheimen Schlüssel\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYP Typ des geheimen Schlüssels, entweder\n"
+" »PEM« oder »DER«\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=DATEI Datei mit der CA-Sammlung\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=VERZEICHNIS Verzeichnis mit der Hash-Liste der CAs\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=DATEI Datei mit der CRL-Sammlung\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=DATEI/HASHES Öffentliche Schlüsseldatei (PEM/DER) "
+"oder\n"
+" eine beliebige Anzahl von in base64\n"
+" kodierten sha256-Hashes mit "
+"vorangestelltem\n"
+" »sha256//« und getrennt durch »;«\n"
+" um den Kommunikationspartner zu\n"
+" verifizieren\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=DATEI Datei mit Zufallsdaten zur "
+"Initialisierung\n"
+" des SSL Pseudo-Zufallszahlen-"
+"Generators\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=DATEI Dateiname des EGD-Sockets mit "
+"Zufallszahlen\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Setze den Prioritäts-String (GnuTLS) oder den "
+"Cipher-Listen-String (openSSL) direkt.\n"
+" Bitte mit Vorsicht nutzen. Diese Option "
+"überschreibt »--secure-protocol«.\n"
+" Das Forman und die Syntax dieser "
+"Zeichenkette ist von der verwendeten\n"
+" SSL/TLS Bibliothek abhängig.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS-Optionen:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts HSTS nicht verwenden\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file Pfad der HSTS Datenbank\n"
+" (überschreibt den Standardwert)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-Optionen:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Stream_LF Format für alle binären\n"
+" FTP-Dateien verwenden\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=BENUTZER BENUTZER als ftp-Benutzername verwenden\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=PASSWORT PASSWORT als ftp-Passwort verwenden\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing ».listing«-Dateien nicht entfernen\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob FTP-Dateinamens-Globbing ausschalten\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp Nur »aktiven« Übertragungsmodus "
+"verwenden\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions Die Rechte der fernen Datei erhalten\n"
+
+# Check --retr-symlinks
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks falls auftretend, verlinkte Dateien holen "
+"(keine\n"
+" Verzeichnisse)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS-Optionen:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit Verwende implizit FTPS\n"
+" (Standardport ist 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl Beim Öffnen der Daten-Verbidung die SSL/"
+"TLS-Sitzung der\n"
+" Steuer-Verbindung fortsetzen\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection nur den Steuerkanal verschlüsseln; "
+"alle Daten bleiben im Klartext\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp verwende FTP falls FTPS vom "
+"Zielserver nicht unterstützt wird\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC-Optionen:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=DATEINAME Die Anfrage- und Antwortdaten in einer\n"
+" .warc.gz-Datei speichern\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=ZEICHENKETTE ZEICHENKETTE in den warcinfo-Satz "
+"einfügen\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ZAHL Die Maximalgröße der WARC-Dateien auf\n"
+" ZAHL setzen\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx CDX-Index-Dateien schreiben\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=DATEINAME Datensätze nicht speichern, die in "
+"dieser\n"
+" CDX-Datei enthalten sind\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression WARC-Dateien nicht mit GZIP komprimieren\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests keine SHA1-Prüfsummen berechnen\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log Die Protokolldatei nicht in einem WARC-"
+"Datensatz\n"
+" speichern\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=VERZEICHNIS Verzeichnis für temporäre Dateien, die "
+"durch\n"
+" den WARC-Schreiber erzeugt werden\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursiver Download:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive rekursiver Download\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=Zahl maximale Rekursionstiefe (»inf« oder »0«\n"
+" steht für ohne Begrenzung)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after geholte Dateien nach dem Download "
+"löschen\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links Verweise in HTML- oder CSS-Downloads\n"
+" in lokale Verknüpfungen umwandeln\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only Konvertiere nur den Dateiname der URL "
+"(auch als »Basename« bekannt)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backup=N vor dem Speichern der Datei X, bis zu N\n"
+" Sicherungsdateien behalten.\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted vor dem Umwandeln der Datei X, eine\n"
+" Sicherung als X_orig anlagen.\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted vor dem Umwandeln der Datei X, eine\n"
+" Sicherung als X.orig anlegen.\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror Kurzform, die\n"
+" »-N -r -l inf --no-remove-listing«\n"
+" entspricht.\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites alle Bilder usw. holen, die für die "
+"Anzeige\n"
+" der HTML-Seite notwendig sind\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments Strikte Handhabung (SGML) von\n"
+" HTML-Kommentaren\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursiv erlauben/zurückweisen:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTE komma-unterteilte Liste der erlaubten\n"
+" Dateiendungen\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTE komma-unterteilte Liste der\n"
+" zurückzuweisenden Erweiterungen\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX regulärer Ausdruck, zu dem die "
+"akzeptierten\n"
+" URLs passen\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX regulärer Ausdruck, zu dem die "
+"abgewiesenen\n"
+" URLs passen\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYPE Typ des regulären Ausdrucks (posix|"
+"pcre).\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TYPE Typ des regulären Ausdrucks (posix).\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTE komma-unterteilte Liste der erlaubten\n"
+" Domains\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTE komma-unterteilte Liste der\n"
+" zurückzuweisenden Domains\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp FTP-Verweisen von HTML-Dokumenten aus\n"
+" folgen\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTE komma-unterteilte Liste der zu folgenden\n"
+" HTML-Tags\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTE komma-unterteilte Liste der zu\n"
+" missachtenden HTML-Tags\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts wenn »--recursive«, auch zu fremden "
+"Hosts\n"
+" gehen\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative nur relativen Verweisen folgen\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LISTE Liste der erlaubten Verzeichnisse\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names Den durch die letzte Komponente der\n"
+" Weiterleitungs-URL spezifizierten "
+"Namen\n"
+" verwenden.\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LISTE Liste der auszuschließenden "
+"Verzeichnisse\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent nicht in das übergeordnete Verzeichnis\n"
+" wechseln\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Fehlerberichte, Fragen und Diskussionen bitte an <bug-wget@gnu.org>\n"
+"schicken und/oder Fehlerberichte unter\n"
+"https://savannah.gnu.org/bugs/?func=additem&group=wget melden.\n"
+"\n"
+"Für die deutsche Übersetzung ist die Mailingliste\n"
+"<translation-team-de@lists.sourceforge.net> zuständig.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+"GNU Wget %s, ein nicht-interaktives Netz-Werkzeug zum Download von Dateien.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Passwort für Benutzer %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Passwort: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Pipe kann nicht erstellt werden\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Fehler bei der Intialisierung der Aktion für use-askpass: %d\n"
+
+# XXX
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Fehler bei Datei-Aktionen für use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Fehler beim Lesen der Antwort zum Kommando »%s %s«: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Benutzername für »%s%s«: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Passwort für Benutzer »%s%s@%s«: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Ãœbersetzt: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Gebunden: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s übersetzt unter %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (Umgebung)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (Benutzer)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (System)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Dies ist Freie Software; Sie dürfen diese ändern und weitergeben.\n"
+"Es wird keine Garantie gegeben, soweit das Gesetz es zulässt.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Ursprünglich geschrieben von Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Fehlerberichte und Verbesserungsvorschläge bitte an <bug-wget@gnu.org>\n"
+"schicken.\n"
+"\n"
+"Für die deutsche Übersetzung ist die Mailingliste <de@li.org> zuständig.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problem bei der Speicheranforderung\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Aufgrund eines Fehlers in %s wird beendet\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "»%s --help« gibt weitere Informationen.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: ungültige Option -- »-n%c«\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Debugging-Unterstützung ist nicht einkompiliert, »--debug« wird ignoriert.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Sowohl »--no-clobber« als auch »--convert-links« angegeben, nur\n"
+"»--convert-links« wird verwendet.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Sowohl »--no-clobber« als auch »--convert-file-only« angegeben, nur\n"
+"»--convert-file-only« wird verwendet.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "»Ausführliche« und »keine Meldungen« ist gleichzeitig unmöglich.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"»Zeitstempel« und »Überschreibung alter Dateien« ist gleichzeitig "
+"unmöglich.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+"Die Optionen »--inet4-only« und »--inet6-only« sind gemeinsam nicht erlaubt\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Die Optionen »-k« oder »--convert-file-only« und »-O« sind gemeinsam\n"
+"nicht erlaubt, wenn mehrere URLs oder die Optionen »-p« oder »-r«\n"
+"angegeben sind. Weitere Informationen finden Sie im Handbuch.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"WARNUNG: Die Option -O zusammen mit einer der Optionen -r oder -p\n"
+"bedeutet, dass jeglicher Download in genau der angegebenen Datei\n"
+"gespeichert wird.\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"WARNUNG: Zeitstempel funktionieren nicht in Kombination mit der Option\n"
+"»-O«. Genauere Erläuterungen finden Sie im Handbuch.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC-Ausgabe funktioniert nicht mit »--no-clobber«, »--no-clobber« wird "
+"deaktiviert.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC-Ausgabe funktioniert nicht mit Zeitstempeln, Zeitstempel werden "
+"deaktiviert.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC-Ausgabe funktioniert nicht mit »--spider«.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-Ausgabe funktioniert nicht mit »--continue« oder »--start-pos«,\n"
+"die Option wird deaktiviert.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"WARC-Digests sind deaktiviert; WARC-Deduplication wird keine doppelten\n"
+"Datensätze finden.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Komprimierung funktioniert nicht mit »--continue« oder »--start-pos«,\n"
+"die Option wird deaktiviert.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+"Die Optionen »--ask-password« und »--password« sind gemeinsam nicht "
+"erlaubt.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Sowohl »--start-pos« als auch »--continue« anzugeben ist nicht empfohlen;\n"
+"»--continue« wird nicht verwendet.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL fehlt\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+"Die Optionen »--ask-password« und »--password« sind gemeinsam nicht "
+"erlaubt.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Die Optionen »--post-data« oder »--post-file« können nicht zusammen mit\n"
+"»--method« verwendet werden. Bei der Option »--method« werden die Daten\n"
+"mit den Optionen »--body-data« oder »--body-file« angegeben.\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Für »--body-data« oder »--body-file« muss eine Methode mittels\n"
+"»--method=HTTPMethod« angegeben werden.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+"Die Optionen »--body-data« und »--body-file« sind gemeinsam nicht erlaubt.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Diese Version unterstützt keine IRIs.\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"»-k« oder »-r« kann nur zusammen mit -O verwendet werden, wenn die Ausgabe "
+"eine\n"
+"normale Datei ist.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"»--covert-links« oder »--convert-files-only« kann nur zusammen\n"
+"verwendet werden, wenn die Ausgabe eine normale Datei ist.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Fehler beim Initialisieren der Bibliothek »libares«\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Initialisieren der »c-ares« Kommunikation\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Fehler beim Parsen der IP-Adresse »%s«\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Fehler beim Setzen der/s DNS-Server(s) »%s« (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Keine URLs in %s gefunden.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Kann die Metalink Datei %s nicht parsen.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Konnte nicht alle Ressourcen von %s herunterladen.\n"
+
+# XXX
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"BEENDET --%s--\n"
+"Verstrichene Zeit: %s\n"
+"Geholt: %d Dateien, %s in %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Download-Kontingent von %s ERSCHÖPFT!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+"-O ist für Metalink Downloads nicht unterstützt. Option wird Ignoriert.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+# XXX
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Geplante Metalink Datei: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Gesicherte Metalink Datei: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Metalink-Datei wird nicht verwendet, weil der Name gefährlich ist.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Verarbeite Metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Metaurl-Datei %s wird nicht verwendet, weil der Name gefährlich ist.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Herunterladen von %s fehlgeschlagen. Metaurl wird übersprungen.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Kann die Metaurl Datei %s nicht parsen.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Verarbeitung der Metaurls processing mit Fehler beendet.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Ressourcetyp %s wird nicht unterstützt, wird ignoriert...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Die heruntergeladene Datei kann nicht geöffnet werden.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Berechne Größe für %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Dateigröße nicht angegeben. Prüfung wird übersprungen.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Die Größe der heruntergeladenen Datei kann nicht bestimmt werden.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Größe passt nicht für Datei %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Größe passt.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Berechne Prüfsumme für %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Prüfsumme passt.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Prüfsumme passt nicht für Datei %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Die heruntergeladene Datei kann nicht zur Überprüfung der Signatur geöffnet "
+"werden.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Signatur wurde erfolgreich geprüft.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Ungültige Signatur. Ressource wird zurückgewiesen.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Daten passen zur Signatur, aber der Signatur wird nicht vertraut.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Kein Prüfsumme gefunden.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Herunterladen von %s fehlgeschlagen. Ressource wird übersprungen.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Datei %s wurde abgerufen, aber die Größe passt nicht.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Datei %s wurde abgerufen, aber die Prüfsumme passt nicht.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Datei %s wurde abgerufen, aber die Signatur passt nicht.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Benenne %s in %s um.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Im Hintergrund geht es weiter.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Im Hintergrund geht es weiter, die Prozessnummer ist %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Ausgabe wird nach %s geschrieben.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() fehlgeschlagen\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() fehlgeschlagen\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Kein benutzbarer Socket-Treiber auffindbar.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() fehlgeschlagen.\n"
+"Der Socket kann nicht auf Blockieren eingestellt werden.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: Warnung: %s-Wortteil erscheint vor jeglichem Maschinennamen\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: unbekannter Wortteil »%s«\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Aufruf: %s NETRC [HOSTNAME]\n"
+
+# stat
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: Aufruf von »stat« für %s nicht möglich: %s\n"
+
+# XXX
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+"WARNUNG: Der Zufallszahlengenerator wird mit einem schwachen Wert "
+"initialisiert.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Der Zufallszahlengenerator konnte nicht initialisiert werden,\n"
+"denken Sie über --random-file nach.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Ihre OpenSSL-Version ist zu alt, um TLSv1.3 zu unterstützen\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Ihre OpenSSL-Version ist zu alt, um TLSv1.1 zu unterstützen\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Ihre OpenSSL-Version ist zu alt, um TLSv1.2 zu unterstützen\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: Option %d zu »secure-protocol« ist nicht implementiert\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Ungültige Cipher-Liste: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+"OpenSSL: Failed set trust to partial chain\n"
+"OpenSSL: Kann einer partiellen Trust Chain nicht vertrauen\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Kann den Verifizierungsparameter nicht allozieren\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"WARNUNG: Der Zufallszahlengenerator konnte nicht initialisiert werden,\n"
+"denken Sie über »--random-file« nach.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+"%s: Das Zertifikat von %s kann nicht geprüft werden, ausgestellt von %s:.\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+" Die Autorität des Ausstellers des Zertifikates kann lokal nicht geprüft "
+"werden.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Ein selbst-signiertes Zertifikat wurde gefunden.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Das ausgestellte Zertifikat ist noch nicht gültig.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Das ausgestellte Zertifikat ist nicht mehr gültig.\n"
+
+# XXX
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: Keiner der alternativen Namen des Zertifikats stimmt mit dem angefragten "
+"Maschinennamen %s überein.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: Der Common Name %s des Zertifikates entspricht nicht dem "
+"angeforderten Hostnamen %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: Der »common name« des Zertifikates ist ungültig\n"
+" (enthält ein NUL-Zeichen). Das könnte ein Zeichen dafür sein, dass der "
+"Host\n"
+" nicht derjenige ist, der er zu sein vorgibt\n"
+" (also nicht der echte %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Verwenden Sie »--no-check-certificate«, um zu dem Server %s eine nicht "
+"gesicherte Verbindung aufzubauen.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ %sK wird übersprungen ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Ungültiger Stil für den »dot«-Fortschrittsindikator %s; keine Änderung.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " ETA %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " in "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Der Takt der Echtzeit-Uhr kann nicht bestimmt werden: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "»%s« wird entfernt, da dies zurückgewiesen werden soll.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "»%s« kann nicht geöffnet werden: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "»robots.txt« wird geladen; bitte Fehler ignorieren.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Fehler beim Auswerten der Proxy-URL »%s«: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Fehler in der Proxy-URL »%s«: Es muss eine HTTP-URL sein.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d: Die Anzahl der Verweise ist zu groß.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Aufgegeben.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Erneuter Versuch.\n"
+"\n"
+
+# Besser als: Alle Verweise ok?
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Keine ungültigen Verweise gefunden.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d ungültiger Verweis gefunden.\n"
+"\n"
+msgstr[1] ""
+"%d ungültige Verweise gefunden.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Kein Fehler"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nicht unterstütztes Schema %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schema fehlt"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Ungültiger Hostname"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ungültige Port-Nummer"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ungültiger Benutzername"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Unvollständige numerische IPv6-Adresse"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-Adressen werden nicht unterstützt"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ungültige numerische IPv6-Adresse"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Keine HTTPS-Unterstützung einkompiliert"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Nicht konvertierbare Multi-Byte-Sequenz gefunden\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Fehler beim Zuweisen von ausreichend Speicher; Speicher erschöpft.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Fehler beim Zuweisen von %ld Bytes; Speicher erschöpft.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: Textpuffer ist zu groß (%d Bytes), Abbruch.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Im Hintergrund geht es weiter, die Prozessnummer ist %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Entfernen des symbolischen Verweises %s fehlgeschlagen: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Fehler beim »fopen()« der Datei »%s«\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Fehler den Dateideskriptor für die Datei »%s« zu bekommen.\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Fehler beim »stat()« der Datei »%s« (Dateirechte prüfen).\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Datei »%s« wurde seit dem letzten Check geändert. Sicherheitsprüfung "
+"fehlgeschlagen.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Fehler beim Öffnen der Datei »%s«, Ursache: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Fehler beim »stat()« der Datei »%s«. Fehler: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Versuche Datei »%s« zu öffnen, aber die Datei wurde seit der letzten Prüfung "
+"geändert. Sicherheitsprüfung fehlgeschlagen.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Ungültiger Regulärer Ausdruck %s, PCRE2-Fehler %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Ungültiger Regulärer Ausdruck %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Fehler beim Matchen %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Überspringe Schlüssen mit der falschen Länge (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Fehler beim Setzen der WARC-Datei Position\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Fehler beim Flushen der WARC-Datei.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Fehler beim Duplizieren des Deskriptors zur WARC-Datei.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Fehler beim Öffnen des GZIP-Datenstroms zur WARC-Datei.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Warcinfo-Satz kann nicht in die WARC-Datei geschrieben werden.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"WARC-Datei %s wird geöffnet.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Fehler beim Öffnen der WARC-Datei %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Die CDX-Datei enthält keine Original-URLs (Spalte »a« fehlt).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Die CDX-Datei enthält keine Prüfsummen (Spalte »k« fehlt).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Die CDX-Datei enthält keine Datensatz-IDs (Spalte »u« fehlt).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"%d Satz vom CDX geladen.\n"
+"\n"
+msgstr[1] ""
+"%d Sätze vom CDX geladen.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Die CDX-Datei %s zur Deduplikation kann nicht gelesen werden.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Die temporäre WARC-Manifest-Datei kann nicht geöffnet werden.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Die temporäre WARC-Protokoll-Datei kann nicht geöffnet werden.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Die WARC-Datei kann nicht geöffnet werden.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Die CDX-Datei kann nicht zur Ausgabe geöffnet werden.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Die temporäre WARC-Datei kann nicht geöffnet werden.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Exakter Treffer in der CDX-Datei gefunden.\n"
+"Revisit-Datensatz wird in WARC gespeichert.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Unbekannter Fehler"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adressfamilie wird für Hostnamen nicht unterstützt"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Ungültiger Wert für ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Nicht-behebbarer Fehler bei der Namensauflösung"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family wird nicht unterstützt"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Fehler bei der Speicheranforderung"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Mit dem Hostnamen ist keine Adresse verknüpft"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Name oder Dienst ist nicht bekannt"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Dienstame wird für ai_socktype nicht unterstützt"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype wird nicht unterstützt"
+
+#~ msgid "System error"
+#~ msgstr "System-Fehler"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Der Argument-Puffer ist zu klein"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Verarbeitungsanforderung wird bearbeitet"
+
+#~ msgid "Request canceled"
+#~ msgstr "Anforderung wurde abgebrochen"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Anforderung wurde nicht abgebrochen"
+
+#~ msgid "All requests done"
+#~ msgstr "Alle Anforderungen wurden abgearbeitet"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Durch ein Signal unterbrochen"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Der Parameter ist nicht korrekt kodiert"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: Option »%s%s« ist mehrdeutig\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: Option »%s%s« ist mehrdeutig; mögliche Optionen:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: nicht erkannte Option »%s%s«\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: Option »%s%s« erlaubt kein Argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: Option »%s%s« benötigt ein Argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: ungültige Option -- »%c«\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: Option verlangt ein Argument -- »%c«\n"
+
+# Möglicherweise sollten wir irgendwann „...“ verwenden
+#~ msgid "`"
+#~ msgstr "»"
+
+#~ msgid "'"
+#~ msgstr "«"
+
+#~ msgid "Success"
+#~ msgstr "Erfolgreich"
+
+#~ msgid "No match"
+#~ msgstr "Kein Teffer"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Ungültiger Regulärer Ausdruck"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ungültiges Vergleichszeichen"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ungültiger Name der Zeichenklasse"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Backslash »\\« am Ende"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Ungültige Rückwärtsreferenz"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr ""
+#~ "Öffnende Klammer »[«, »[^«, »[:«, »[.« oder »[=« ohne passende "
+#~ "schließende Klammer"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Öffnende Klammer »(« oder »\\(« ohne passende schließende Klammer"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Öffnende Klammer »\\{« ohne passende schließende Klammer"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Ungültiger Inhalt in »\\{\\}«"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Ungültiges Ende des Bereichs"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Speicher erschöpft"
+
+# XXX
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Ungültiger vorhergehender Regulärer Ausdruck"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Vorzeitiges Ende des Regulären Ausdrucks"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Der Reguläre Ausdruck ist zu groß"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Schließende Klammer »)« oder »\\)« ohne passende öffnende Klammer"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Kein vorhergehender Regulärer Ausdruck"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "Pipe kann nicht erstellt werden"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s Unterprozess fehlgeschlagen"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle fehlgeschlagen"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr ""
+#~ "Dateideskriptor %d kann nicht wiederhergestellt werden: dup2 "
+#~ "fehlgeschlagen"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s Unterprozess"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s Unterprozess erhielt das fatale Signal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "Speicher erschöpft"
diff --git a/po/el.gmo b/po/el.gmo
new file mode 100644
index 0000000..10aafeb
--- /dev/null
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..7a5fe5d
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,3633 @@
+# Greek messages for GNU wget.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+# Simos Xenitellis <simos@hellug.gr>, 1999, 2000, 2001, 2002, 2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.9.1\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2004-12-15 19:46+0000\n"
+"Last-Translator: Simos Xenitellis <simos74@gmx.net>\n"
+"Language-Team: Greek <nls@tux.hellug.gr>\n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, fuzzy, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "ΣÏνδεση με %s[%s]:%hu... "
+
+#: src/connect.c:290
+#, fuzzy, c-format
+msgid "Connecting to %s:%d... "
+msgstr "ΣÏνδεση με %s:%hu... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "ΣÏνδεση με %s[%s]:%hu... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "συνδέθηκε.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "απέτυχε: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "ΜετατÏάπηκαν %d αÏχεία σε %.2f δευτεÏόλεπτα.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "ΜετατÏοπή του %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "τίποτα να κάνω.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Αδυναμία μετατÏοπής συνδέσμων στο %s: %s\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Αποτυχία διαγÏαφής του `%s': %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "ΑδÏνατη η λήψη αντιγÏάγου ασφαλείας του %s ως %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Αποτυχία διαγÏαφής του `%s': %s\n"
+
+#: src/cookies.c:464
+#, fuzzy, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Συντακτικό σφάλμα στο Set-Cookie: Ï€ÏόωÏο τέλος αλφαÏιθμητικοÏ.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr ""
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "ΑδÏνατο το άνοιγμα του αÏχείου cookies `%s': %s\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Σφάλμα στην εγγÏαφή στο `%s': %s\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Σφάλμα στο κλείσιμο του `%s': %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Μη υποστηÏιζόμενος Ï„Ïπος καταλόγου, δοκιμάζω να τον διαβάσω σαν Unix "
+"κατάλογο.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Κατάλογος του /%s στο %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "ÏŽÏα άγνωστη "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "ΑÏχείο "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Κατάλογος "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "ΣÏνδεση "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Όχι απόλυτα σίγουÏος "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Μήκος: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (ανεπίσημο)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Αυθεντικοποίηση ως %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Σφάλμα στην απάντηση του διακομιστή, κλείνει η σÏνδεση ελέγχου.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Σφάλμα στο μήνυμα αποδοχής του διακομιστή.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Αποτυχία στην εγγÏαφή δεδομένων, κλείνει η σÏνδεση ελέγχου.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Ο διακομιστής απαγοÏεÏει τη σÏνδεση.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Σφάλμα στην αυθεντικοποίηση.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Επιτυχής σÏνδεση!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Σφάλμα διακομιστή, δεν μποÏÏŽ να συμπεÏάνω τον Ï„Ïπο του συστήματος.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "έγινε. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "έγινε.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Άγνωστος Ï„Ïπος `%c', διακοπή της σÏνδεσης.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "έγινε. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD δεν απαιτήται.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr "Δεν υπάÏχει τέτοιος κατάλογος `%s'.\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD δεν απαιτείται.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "Το αÏχείο `%s' υπάÏχει ήδη, δεν επανακτάται.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Δεν είναι δυνατή να ξεκινήσει μεταφοÏά Ï„Ïπου PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Δεν είναι δυνατή η μετάφÏαση της απάντησης PASV.\n"
+
+#: src/ftp.c:1101
+#, fuzzy, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "αδÏνατη η σÏνδεση στο %s:%hu: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Σφάλμα στη σÏνδεση (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Μη έγκυÏη ΘΥΡΑ.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Αποτυχία στην εντολή REST, εκκίνηση από την αÏχή.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"Δεν υπάÏχει αÏχείο `%s'.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Δεν υπάÏχει αÏχείο `%s'.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Δεν υπάÏχει αÏχείο ή κατάλογος `%s'.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, κλείσιμο σÏνδεσης ελέγχου.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - ΣÏνδεση δεδομένων: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Η σÏνδεση ελέγχου έκλεισε.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Η μεταφοÏά δεδομένων διακόπηκε ανώμαλα.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Το αÏχείο `%s' υπάÏχει ήδη, δεν επανακτάται.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(Ï€Ïοσπάθεια:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2051 src/http.c:4793
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' αποθηκεÏτηκε [%ld]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "ΔιαγÏαφή του %s.\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "ΧÏήση του `%s' για Ï€ÏοσωÏινό αÏχείο πεÏιεχομένων καταλόγου.\n"
+
+#: src/ftp.c:2185
+#, fuzzy, c-format
+msgid "Removed %s.\n"
+msgstr "ΔιαγÏαφή του `%s'.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Το επίπεδο αναδÏομής %d ξεπέÏασε το μέγιστο επίπεδο αναδÏομής %d.\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Το αÏχείο στο διακομιστή δεν είναι νεώτεÏο του Ï„Î¿Ï€Î¹ÎºÎ¿Ï `%s' -- δε γίνεται "
+"ανάκτηση.\n"
+"\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Το αÏχείο στο διακομιστή είναι νεώτεÏο του Ï„Î¿Ï€Î¹ÎºÎ¿Ï `%s' -- γίνεται "
+"ανάκτηση.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, fuzzy, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr "Τα μεγέθη δεν είναι ίσα (τοπικό %ld) -- γίνεται ανάκτηση.\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Μη έγκυÏο όνομα ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï…, παÏακάμπτεται.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"ΥπάÏχει ήδη ο οÏθός σÏνδεσμος %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "ΔημιουÏγία συνδέσμου %s -> %s\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Δεν υποστηÏίζονται σÏνδεσμοι, παÏάκαμψη συνδέσμου `%s'.\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ΠαÏάκαμψη καταλόγου `%s'.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: άγνωστο/μη υποστηÏιζόμενο είδος αÏχείου.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Αποτυχία λήψης ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Ï€ÏŒ %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: εσφαλμένη ημεÏομηνία αÏχείου.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Δεν θα ανακτηθοÏν κατάλογοι διότι το βάθος είναι %d (μέγιστο %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+"Δεν επεκτεινόμαστε στο `%s' διότι είναι εξαιÏοÏμενο/μη-συμπεÏιλαμβανόμενο\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr "ΑπόÏÏιψη του `%s'.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "ΑπόÏÏιψη του `%s'.\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Σφάλμα στην εγγÏαφή στο `%s': %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Δεν βÏέθηκαν ταιÏιάσματα στη μοÏφή `%s'.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "ΓÏάφτηκε αÏχείο καταλόγου σε HTML στο `%s' [%ld].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "ΓÏάφτηκε αÏχείο καταλόγου σε HTML στο `%s'.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Στείλτε αναφοÏές σφαλμάτων και Ï€Ïοτάσεις στο <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Σφάλμα στην ανάλυση του URL του διαμεσολαβητή %s: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+#, fuzzy
+msgid "Unknown host"
+msgstr "Άγνωστο σφάλμα"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Άγνωστο σφάλμα"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "ΕÏÏεση του %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+#, fuzzy
+msgid "failed: timed out.\n"
+msgstr "απέτυχε: %s.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: ΑδÏνατη η ανάλυση μη ολοκληÏωμένου συνδέσμου %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, fuzzy, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Σφάλμα στην εγγÏαφή της αίτησης HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr "Το αÏχείο `%s' υπάÏχει ήδη, δεν επανακτάται.\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "ΧÏήση ξανά της σÏνδεσης στο %s:%hu.\n"
+
+#: src/http.c:2098
+#, fuzzy, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "ΧÏήση ξανά της σÏνδεσης στο %s:%hu.\n"
+
+#: src/http.c:2164
+#, fuzzy, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Σφάλμα στην εγγÏαφή της αίτησης HTTP: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ΣΦΑΛΜΑ %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Εσφαλμένη γÏαμμή κατάστασης"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Άγνωστο σχήμα αυθεντικοποίησης.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Άγνωστο σχήμα αυθεντικοποίησης.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr ""
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Η αίτηση για %s στάλθηκε, αναμονή απάντησης... "
+
+#: src/http.c:3441
+#, fuzzy
+msgid "No data received.\n"
+msgstr "Δεν ελήφθησαν δεδομένα"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Σφάλμα ανάγνωσης (%s) στις κεφαλίδες.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(χωÏίς πεÏιγÏαφή)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Τοποθεσία: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "μη οÏισμένο"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [ακολουθεί]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Το αÏχείο έχει ήδη ανακτηθεί πλήÏως· τίποτα να κάνω.\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Μήκος: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "αγνοείται"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr ""
+"ΠÏοειδοποίηση: μεταχαÏακτήÏες (wildcards) δεν υποστηÏίζονται στο HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Αδυναμία στην εγγÏαφή στο `%s' (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Αδυναμία στην εγγÏαφή στο `%s' (%s).\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "ΑδÏνατη η σÏσταση σÏνδεσης SSL.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Αδυναμία στην εγγÏαφή στο `%s' (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ΣΦΑΛΜΑ: Μετάσταση (%d) χωÏίς τοποθεσία.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Κεφαλίδα Last-modified δεν υπάÏχει -- χÏονικές αναφοÏές απενεÏγοποιήθηκαν.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Κεφαλίδα Last-modified δεν είναι έγκυÏη -- χÏονικές αναφοÏές αγνοοÏνται.\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Το αÏχείο του διακομιστή δεν είναι νεώτεÏο από το τοπικό αÏχείο `%s' -- δε "
+"γίνεται ανάκτηση.\n"
+"\n"
+
+#: src/http.c:4651
+#, fuzzy, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Τα μεγέθη δεν είναι ίσα (τοπικό %ld) -- γίνεται ανάκτηση ξανά.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "ΑπομακÏυσμένο αÏχείο είναι νεότεÏο, έναÏξη ανάκτησης.\n"
+
+#: src/http.c:4678
+#, fuzzy
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Το αÏχείο στο διακομιστή είναι νεώτεÏο του Ï„Î¿Ï€Î¹ÎºÎ¿Ï `%s' -- γίνεται "
+"ανάκτηση.\n"
+"\n"
+
+#: src/http.c:4684
+#, fuzzy
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Το αÏχείο στο διακομιστή δεν είναι νεώτεÏο του Ï„Î¿Ï€Î¹ÎºÎ¿Ï `%s' -- δε γίνεται "
+"ανάκτηση.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+#, fuzzy
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "ΑπομακÏυσμένο αÏχείο είναι νεότεÏο, έναÏξη ανάκτησης.\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s ΣΦΑΛΜΑ %d: %s.\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' αποθηκεÏτηκε [%ld/%ld]\n"
+"\n"
+
+#: src/http.c:4818
+#, fuzzy, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Η σÏνδεση διακόπηκε στο byte %ld. "
+
+#: src/http.c:4841
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Σφάλμα ανάγνωσης στο byte %ld (%s)."
+
+#: src/http.c:4850
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Σφάλμα ανάγνωσης στο byte %ld/%ld (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr ""
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Αδυναμία ανάγνωσης %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Σφάλμα στο %s στη γÏαμμή %d.\n"
+
+#: src/init.c:718
+#, fuzzy, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Σφάλμα στο %s στη γÏαμμή %d.\n"
+
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: ΣΦΑΛΜΑ: Άγνωστη εντολή `%s', τιμή `%s'.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: ΠÏοειδοποίηση: Το wgetrc του συστήματος και του χÏήστη δείχνουν στο ίδιο "
+"αÏχείο `%s'.\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: ΠαÏακαλώ οÏίστε on ή off.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: ΠαÏακαλώ οÏίστε on ή off.\n"
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Μη έγκυÏος Ï„Ïπος Ï€Ïοόδου `%s'.\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Μη έγκυÏος Ï„Ïπος Ï€Ïοόδου `%s'.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr "%s: %s: Μη έγκυÏη ÏÏθμιση `%s'.\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "αδÏνατη η σÏνδεση στο %s:%hu: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s λήφθηκε, ανακατεÏθυνση εξόδου στο `%s'.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; απενεÏγοποίηση λήψης καταγÏαφών.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "ΧÏήση: %s [ΕΠΙΛΟΓΗ]... [URL]...\n"
+
+#: src/main.c:590
+#, fuzzy
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"\n"
+"Οι υποχÏεωτικοί παÏάμετÏοι στα λεκτικά οÏίσματα είναι υποχÏεωτικοί και για "
+"τα σÏντομα οÏίσματα.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+#, fuzzy
+msgid "Directories:\n"
+msgstr "Κατάλογος "
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, ένα μη-διαλογικό δικτυακό Ï€ÏόγÏαμμα ανάκτησης αÏχείων.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr ""
+"Πνευματικά Δικαιώματα (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software "
+"Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+#, fuzzy
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"ΓÏάφτηκε αÏχικά από τον Hrvoje Niksic <hniksic@arsdigita.com>.\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Στείλτε αναφοÏές σφαλμάτων και Ï€Ïοτάσεις στο <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Δοκιμάστε `%s --help' για πεÏισσότεÏες επιλογές Ïυθμίσεων.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: μη αποδεκτή επιλογή -- `-n%c'\n"
+
+#: src/main.c:1593
+#, fuzzy, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"%s: η υποστήÏιξη εκσφαλμάτωσης δεν έχει συμπεÏιληφθεί στη μεταγλώττιση.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Δεν μποÏÏŽ να είμαι επεξηγηματικός και ταυτόχÏονα σιωπηλός.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Δεν μποÏÏŽ να χÏησιμοποιώ χÏονικές αναφοÏές και ταυτόχÏονα να μην υποκαθιστώ "
+"τα αÏχεία βάση των αναφοÏών.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: παÏαλείφθηκε το URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Δεν βÏέθηκαν URL στο %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Αποτυχία διαγÏαφής του `%s': %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"\n"
+"ΤΕΡΜΑΤΙΣΜΟΣ --%s--\n"
+"ΜεταφοÏτώθηκαν: %s byte σε %d αÏχεία\n"
+
+#: src/main.c:2284
+#, fuzzy, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr ""
+"Το ÏŒÏιο χώÏου στο δίσκο για αÏχεία από μεταφοÏτώσεις (%s bytes) έχει "
+"ΞΕΠΕΡΑΣΤΕΪ!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Αποτυχία διαγÏαφής του `%s': %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "ΔιαγÏαφή του %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Εκτέλεση στο παÏασκήνιο.\n"
+
+#: src/mswindows.c:289
+#, fuzzy, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr ""
+"Συνέχιση στο παÏασκήνιο, ταυτότητα διεÏγασίας (pid) %d.\n"
+"\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Η έξοδος θα γÏαφτεί στο `%s'.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Αδυναμία εÏÏεσης έγκυÏου Î¿Î´Î·Î³Î¿Ï Î´Î¹ÎºÏ„Ïου.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: Ï€Ïοειδοποίηση: το τμήμα \"%s\" εμφανίζεται Ï€Ïιν από τα ονόματα "
+"των μηχανημάτων\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: άγνωστος τελεσταίος \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "ΧÏήση: %s NETRC [ΟÎΟΜΑ ΜΗΧΑÎΗΜΑΤΟΣ]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: αδυναμία Ï€Ïόσβασης στο %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+#, fuzzy
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "ΑδÏνατη η αÏχικοποίηση της PRNG της OpenSSL· απενεÏγοποίηση του SSL.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, fuzzy, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ παÏάκαμψη %dK ]"
+
+#: src/progress.c:545
+#, fuzzy, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Μη έγκυÏη ÏÏθμιση στυλ τελείας `%s'· παÏαμένει χωÏίς αλλαγή.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "ΔιαγÏαφή του %s Î±Ï†Î¿Ï Î¸Î± έπÏεπε να αποÏÏιφθεί.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Αδυναμία μετατÏοπής συνδέσμων στο %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr ""
+"Ανάγνωση του robots.txt; παÏακαλώ αγνοείστε τυχόν μηνÏματα σφαλμάτων.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Σφάλμα στην ανάλυση του URL του διαμεσολαβητή %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Σφάλμα στο URL διαμεσολαβητή %s: ΠÏέπει να είναι HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "ΥπέÏβαση %d επανακατευθÏνσεων.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Εγκαταλείπω.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"ΠÏοσπάθεια ξανά.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+#, fuzzy
+msgid "No error"
+msgstr "Άγνωστο σφάλμα"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr ""
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+#, fuzzy
+msgid "Invalid host name"
+msgstr "Μη έγκυÏο όνομα εξυπηÏετητή"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr ""
+
+#: src/url.c:685
+#, fuzzy
+msgid "Invalid user name"
+msgstr "Μη έγκυÏο όνομα εξυπηÏετητή"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr ""
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:1007
+#, fuzzy
+msgid "HTTPS support not compiled in"
+msgstr ""
+"%s: η υποστήÏιξη εκσφαλμάτωσης δεν έχει συμπεÏιληφθεί στη μεταγλώττιση.\n"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr ""
+"Συνέχιση στο παÏασκήνιο, ταυτότητα διεÏγασίας (pid) %d.\n"
+"\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Αποτυχία διαγÏαφής ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… `%s': %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Αποτυχία λήψης ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Ï€ÏŒ %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Αποτυχία φόÏτωσης πιστοποιητικών από %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Σφάλμα στην εγγÏαφή στο `%s': %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Σφάλμα στην ανάλυση του URL του διαμεσολαβητή %s: %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr "Αδυναμία εÏÏεσης διαμεσολαβητή.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, c-format
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Σφάλμα στο Set-Cookie, πεδίο `%s'"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Αποτυχία της REST· δε θα επανακτηθεί το `%s'.\n"
+
+#, c-format
+#~ msgid " [%s to go]"
+#~ msgstr " [%s για πέÏας]"
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s: η επιλογή `%s' είναι αόÏιστη\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: η επιλογή `--%s' δεν επιδέχεται ÏŒÏισμα\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: η επιλογή `%c%s' δεν επιδέχεται ÏŒÏισμα\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s: η επιλογή `%s' απαιτεί ÏŒÏισμα\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: μη αναγνωÏίσημη επιλογή `--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s: μη αναγνωÏίσιμη επιλογή `%c%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: μη αποδεκτή επιλογή -- %c\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: invalid option -- %c\n"
+#~ msgstr "%s: μη αποδεκτή επιλογή -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: η επιλογή απαιτεί μια παÏάμετÏο -- %c\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: η επιλογή `%s' είναι αόÏιστη\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: η επιλογή `--%s' δεν επιδέχεται ÏŒÏισμα\n"
+
+#~ msgid "Host not found"
+#~ msgstr "Ο διακομιστής δε βÏέθηκε"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Αποτυχία δημιουÏγίας πεÏιβάλλοντος SSL\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "ΠÏοσπάθεια χωÏίς το καθοÏισμένο πιστοποιητικό\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Τέλος αÏχείου ενώ γινόταν επεξεÏγασία των κεφαλίδων.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Η αυθεντικοποίηση απέτυχε.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Η συνέχιση της ανάκτησης απέτυχε για αυτό το αÏχείο, που συγκÏοÏεται με "
+#~ "το `-c'.\n"
+#~ "ΆÏνηση εγγÏαφής πάνω στο υπάÏχο αÏχείο `%s'.\n"
+
+#, c-format
+#~ msgid " (%s to go)"
+#~ msgstr " (%s μέχÏι πέÏας)"
+
+#, c-format
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Το αÏχείο `%s' είναι ήδη εδώ, δε θα ανακτηθεί.\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' αποθηκεÏτηκε [%ld/%ld])\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Η σÏνδεση διακόπηκε στο byte %ld/%ld. "
+
+#, fuzzy, c-format
+#~ msgid "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s: ΠαÏακαλώ καθοÏίστε πάντα(always), ενεÏγό(on), ανενεÏγό(off) ή "
+#~ "ποτέ(never).\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ΈναÏξη:\n"
+#~ " -V, --version εμφάνιση της έκδοσης του Wget και έξοδος.\n"
+#~ " -h, --help εμφάνιση της βοήθειας αυτής.\n"
+#~ " -b, --background αποστολή στο παÏασκήνιο μετά την έναÏξη.\n"
+#~ " -e, --execute=ΕÎΤΟΛΗ εκτέλεση μιας εντολής μοÏφής `.wgetrc'.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ΚαταγÏαφή·και·αÏχείο·εισόδου:\n"
+#~ " -o, --output-file=ΑΡΧΕΙΟ καταγÏαφή·μηνυμάτων·στο·ΑΡΧΕΙΟ.\n"
+#~ " -a, --append-output=ΑΡΧΕΙΟ Ï€Ïοσθήκη·μηνυμάτων·στο·ΑΡΧΕΙΟ.\n"
+#~ " -d, --debug εμφάνιση·πληÏοφοÏιών·εκσφαλμάτωσης.\n"
+#~ " -q, --quiet σιωπηλά·(χωÏίς·έξοδο).\n"
+#~ " -v, --verbose πεÏιφÏαστικά·(εξ'·οÏισμοÏ·ÏÏθμιση).\n"
+#~ " -nv, --non-verbose απενεÏγοποίηση·πεÏιφÏαστικότητας,"
+#~ "·χωÏίς·να·είναι·και·σιωπηλό.\n"
+#~ " -i, --input-file=ΑΡΧΕΙΟ ανάγνωση·URL·από·το·ΑΡΧΕΙΟ.\n"
+#~ " -F, --force-html "
+#~ "μεταχείÏιση·αÏχείου·εισόδου·ως·αÏχείο·HTML.\n"
+#~ " -B, --base=URL "
+#~ "Ï€Ïοσθέτει·το·URL·στους·σχετικοÏς·συνδέσμους·στο·-F·-i·αÏχείο.\n"
+#~ " --sslcertfile=ΑΡΧΕΙΟ Ï€ÏοαιÏετικό·πιστοποιητικό·πελάτη.\n"
+#~ " --sslcertkey=ΑΡΧΕΙΟ Ï€ÏοαιÏετικό αÏχείο ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î³Î¹Î± αυτό το "
+#~ "πιστοποιητικό.\n"
+#~ " --egd-file=ΑΡΧΕΙΟ όνομα αÏχείου για τον υποδοχέα EGD.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ΜεταφόÏτωση:\n"
+#~ " --bind-address=ΔΙΕΥΘΥÎΣΗ σÏνδεση στη ΔΙΕΥΘΥÎΣΗ (όνομα συστήματος ή "
+#~ "IP) στο τοπικό σÏστημα.\n"
+#~ " -t, --tries=ΑΡΙΘΜΟΣ οÏισμός του αÏÎ¹Î¸Î¼Î¿Ï Ï„Ï‰Î½ Ï€Ïοσπαθειών σε "
+#~ "ΑΡΙΘΜΟΣ (0 για χωÏίς ÏŒÏιο).\n"
+#~ " -O --output-document=ΑΡΧΕΙΟ εγγÏαφή εγγÏάφων στο ΑΡΧΕΙΟ.\n"
+#~ " -nc, --no-clobber να μην αλλαχτοÏν τα ονόματα υπαÏχόντων "
+#~ "αÏχείων ή να δοθοÏν καταλήξεις .#.\n"
+#~ " -c, --continue συνέχιση ανάκτησης υπάÏχοντος αÏχείου.\n"
+#~ " --progress=ΜΟΡΦΗ επιλογή της μοÏφής εμφάνισης της Ï€Ïοόδου "
+#~ "ανάκτησης.\n"
+#~ " -N, --timestamping αποφυγή ανάκτησης αÏχείων παλαιότεÏων των "
+#~ "τοπικών.\n"
+#~ " -S, --server-response εμφάνιση αποκÏίσεων του διακομιστή.\n"
+#~ " --spider αποφυγή ανάκτησης οποιουδήποτε αÏχείου.\n"
+#~ " -T, --timeout=ΔΕΥΤΕΡΟΛΕΠΤΑ οÏισμός χÏÎ¿Î½Î¹ÎºÎ¿Ï Î¿Ïίου ανάκτησης σε "
+#~ "ΔΕΥΤΕΡΟΛΕΠΤΑ.\n"
+#~ " -w, --wait=ΔΕΥΤΕΡΟΛΕΠΤΑ αναμονή ΔΕΥΤΕΡΟΛΕΠΤΑ Î¼ÎµÏ„Î±Î¾Ï Î±Î½Î±ÎºÏ„Î®ÏƒÎµÏ‰Î½.\n"
+#~ " --waitretry=ΔΕΥΤΕΡΟΛΕΠΤΑ αναμονή 1...ΔΕΥΤΕΡΟΛΕΠΤΑ Î¼ÎµÏ„Î±Î¾Ï "
+#~ "Ï€Ïοσπαθειών ανάκτησης.\n"
+#~ " --random-wait αναμονή από 0...2*ΚΑΘΥΣΤΕΡΗΣΗ "
+#~ "δευτεÏόλεπτα Î¼ÎµÏ„Î±Î¾Ï Î±Î½Î±ÎºÏ„Î®ÏƒÎµÏ‰Î½.\n"
+#~ " -Y, --proxy=on/off ÏÏθμιση χÏήσης διαμεσολαβητή σε ενεÏγό "
+#~ "(on) ή ανενεÏγό (off).\n"
+#~ " -Q, --quota=ΑΡΙΘΜΟΣ οÏισμός οÏίου ÏƒÏ…Î½Î¿Î»Î¹ÎºÎ¿Ï Î¼ÎµÎ³Î­Î¸Î¿Ï…Ï‚ αÏχείων "
+#~ "Ï€Ïος ανάκτηση σε ΑΡΙΘΜΟ.\n"
+#~ " --limit-rate=ΡΥΘΜΟΣ πεÏιοÏισμός του ÏÏ…Î¸Î¼Î¿Ï Î±Î½Î¬ÎºÏ„Î·ÏƒÎ·Ï‚ σε "
+#~ "ΡΥΘΜΟΣ.\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Κατάλογοι:\n"
+#~ " -nd --no-directories αποφυγή δημιουÏγίας καταλόγων.\n"
+#~ " -x, --force-directories υποχÏεωτική δημιουÏγία καταλόγων.\n"
+#~ " -nH, --no-host-directories αποφυγή δημιουÏγίας host directories.\n"
+#~ " -P, --directory-prefix=ΠΡΟΘΕΜΑ αποθήκευση αÏχείων στο ΠΡΟΘΕΜΑ/...\n"
+#~ " --cut-dirs=ΑΡΙΘΜΟΣ αγνόηση ΑΡΙΘΜΟΣ στοιχείων "
+#~ "απομακÏυσμένων καταλόγων\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Επιλογές HTTP:\n"
+#~ " --http-user=ΧΡΗΣΤΗΣ οÏισμός χÏήστη http σε ΧΡΗΣΤΗ.\n"
+#~ " --http-passwd=ΚΩΔΙΚΟΣ οÏισμός ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï‡Ïήστη http σε ΚΩΔΙΚΟΣ.\n"
+#~ " -C, --cache=on/off αποτÏοπή/χÏήση δεδομένων του διαμεσολαβητή "
+#~ "(κανονικά επιτÏέπεται).\n"
+#~ " -E, --html-extension αποθήκευση όλων των εγγÏάφων text/html με "
+#~ "κατάληξη .html.\n"
+#~ " --ignore-length αγνόηση του πεδίου `Content-Length' της "
+#~ "κεφαλίδας.\n"
+#~ " --header=ΑΛΦΑΡΙΘΜΗΤΙΚΟ εισαγωγή του ΑΛΦΑΡΙΘΜΗΤΙΚΟ στην κεφαλίδα.\n"
+#~ " --proxy-user=ΧΡΗΣΤΗΣ οÏισμός του ΧΡΗΣΤΗΣ για χÏήστη του "
+#~ "διαμεσολαβητή.\n"
+#~ " --proxy-passwd=ΚΩΔΙΚΟΣ οÏισμός του ΚΩΔΙΚΟΣ για κωδικός στο "
+#~ "διαμεσολαβητή.\n"
+#~ " --referer=URL χÏήση κεφαλίδας `Referer: URL' στην αίτηση "
+#~ "HTTP.\n"
+#~ " -s, --save-headers αποθήκευση των HTTP κεφαλίδων σε αÏχείο.\n"
+#~ " -U, --user-agent=ΠΡΑΚΤΟΡΑΣ χÏήση του ΠΡΑΚΤΟΡΑΣ αντί του Wget/ΕΚΔΟΣΗ.\n"
+#~ " --no-http-keep-alive απενεÏγοποίηση του HTTP keep-alive "
+#~ "(συνδέσεις διαÏκείας).\n"
+#~ " --cookies=off να μη γίνει χÏήση των cookies.\n"
+#~ " --load-cookies=ΑΡΧΕΙΟ φόÏτωση cookies από το ΑΡΧΕΙΟ Ï€Ïιν τη "
+#~ "συνεδÏία.\n"
+#~ " --save-cookies=ΑΡΧΕΙΟ αποθήκευση των cookies στο ΑΡΧΕΙΟ μετά τη "
+#~ "συνεδÏία.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Επιλογές FTP:\n"
+#~ " -nr, --dont-remove-listing να μη διαγÏαφοÏν τα αÏχεία `.listing'.\n"
+#~ " -g, --glob=on/off (απ)ενεÏγοποίηση ταιÏιάσματος ονομάτων "
+#~ "αÏχείων.\n"
+#~ " --passive-ftp χÏήση κατάστασης μεταφοÏάς \"passive\" για "
+#~ "το FTP.\n"
+#~ " --retr-symlinks κατά την αναδÏομική ανάκτηση, λήψη "
+#~ "αναφεÏόμενων αÏχείων (όχι κατάλογοι).\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ΑναδÏομική ανάκτηση:\n"
+#~ " -r, --recursive αναδÏομική ανάκτηση -- χÏήση με σÏνεση!\n"
+#~ " -l, --level=ΑΡΙΘΜΟΣ μέγιστο βάθος αναδÏομής (`inf' ή 0 για "
+#~ "απεÏιόÏιστο).\n"
+#~ " --delete-after διαγÏαφή αÏχείων τοπικά μετά τη "
+#~ "μεταφόÏτωσή τους.\n"
+#~ " -k, --convert-links μετατÏοπή μη-σχετικών συνδέσμων σε "
+#~ "σχετικοÏÏ‚.\n"
+#~ " -K, --backup-converted Ï€Ïιν τη μετατÏοπή του αÏχείου Χ, διατήÏηση "
+#~ "αντιγÏάφου ασφαλείας X.orig.\n"
+#~ " -m, --mirror σÏντομη επιλογή, ισοδÏναμη με -r -N -l inf "
+#~ "-nr.\n"
+#~ " -p, --page-requisites λήψη όλων των εικόνων, κλπ. που "
+#~ "απαιτοÏνται για την εμφάνιση σελίδας HTML.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ΑναδÏομική αποδοχή/απόÏÏιψη:\n"
+#~ " -A, --accept=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα από "
+#~ "αποδεκτές καταλήξεις.\n"
+#~ " -R, --reject=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα από μη-"
+#~ "αποδεκτές καταλήξεις.\n"
+#~ " -D, --domains=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα από "
+#~ "αποδεκτά επιθήματα.\n"
+#~ " --exclude-domains=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα από μη-"
+#~ "αποδεκτά επιθήματα.\n"
+#~ " --follow-ftp ακολοÏθηση συνδέσμων FTP από έγγÏαφα "
+#~ "HTML.\n"
+#~ " --follow-tags=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα με "
+#~ "συνδέσμους που έχουν ακολουθηθεί.\n"
+#~ " -G, --ignore-tags=ΛΙΣΤΑ λίστα διαχωÏιζόμενη με κόμμα με "
+#~ "συνδέσμους που έχουν αγνοηθεί.\n"
+#~ " -H, --span-hosts επίσκεψη και ξένων διακομιστών κατά "
+#~ "την αναδÏομή.\n"
+#~ " -L, --relative ακολοÏθηση μόνο σχετικών URL.\n"
+#~ " -I, --include-directories=ΛΙΣΤΑ λίστα επιτÏεπτών καταλόγων.\n"
+#~ " -X, --exclude-directories=ΛΙΣΤΑ λίστα μη-επιτÏεπτών καταλόγων.\n"
+#~ " -np, --no-parent απενεÏγοποίηση Ï€Ïόσβασης και στο "
+#~ "γονικό κατάλογο.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Αυτό το Ï€ÏόγÏαμμα διανέμεται με την ελπίδα ότι θα είναι χÏήσιμο,\n"
+#~ "αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΫΗΣΗ· χωÏίς οÏτε έμμεση εγγÏηση\n"
+#~ "ΛΕΙΤΟΥΡΓΙΚΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕÎΑ ΣΥΓΚΕΚΡΙΜΕÎΟ ΣΚΟΠΟ.\n"
+#~ "ΑναφεÏθείτε στη Γενική Δημόσια Άδεια GNU για πεÏισσότεÏες λεπτομέÏειες.\n"
+
+#, c-format
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Εκκίνηση του WinHelp %s\n"
+
+#, c-format
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Δεν υπάÏχει αÏκετή μνήμη.\n"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Συνακτικό σφάλμα στο Set-Cookie στο χαÏακτήÏα `%c'.\n"
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Δεν είναι δυνατή η μετατÏοπή του `%s' σε διεÏθυνση IP.\n"
+
+#~ msgid "%s: %s: invalid command\n"
+#~ msgstr "%s: %s: μη έγκυÏη εντολή\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: ΑνιχνεÏτηκε κυκλική επανακατεÏθυνση.\n"
+
+#~ msgid "Connection to %s:%hu refused.\n"
+#~ msgstr "ΣÏνδεση με %s:%hu δεν επετÏάπει.\n"
+
+#~ msgid "%s: Cannot determine user-id.\n"
+#~ msgstr "%s: Δεν είναι δυνατή η αναγνώÏιση της ταυτότητας χÏήστη.\n"
+
+#~ msgid "%s: Warning: uname failed: %s\n"
+#~ msgstr "%s: ΠÏοειδοποίηση: η uname απέτυχε: %s\n"
+
+#~ msgid "%s: Warning: gethostname failed\n"
+#~ msgstr "%s: ΠÏοειδοποίηση: η gethostname απέτυχε\n"
+
+#~ msgid "%s: Warning: cannot determine local IP address.\n"
+#~ msgstr ""
+#~ "%s: ΠÏοειδοποίηση: δεν είναι δυνατή η ανάγνωση της τοπικής διεÏθυνσης "
+#~ "IP.\n"
+
+#~ msgid "%s: Warning: cannot reverse-lookup local IP address.\n"
+#~ msgstr ""
+#~ "%s: ΠÏοειδοποίηση: δεν είναι δυνατή η ανάγνωση της τοπικής διεÏθυνσης "
+#~ "IP.\n"
+
+#~ msgid "%s: Warning: reverse-lookup of local address did not yield FQDN!\n"
+#~ msgstr ""
+#~ "%s: ΠÏοειδοποίηση: η ανάστÏοφη αναζήτηση της τοπικής διεÏθυνσης δεν "
+#~ "παÏήγαγε το FDQN!\n"
+
+#~ msgid "%s: Out of memory.\n"
+#~ msgstr "%s: Η μνήμη εξαντλήθηκε.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "CTRL+Break received, redirecting output to `%s'.\n"
+#~ "Execution continued in background.\n"
+#~ "You may stop Wget by pressing CTRL+ALT+DELETE.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "CTRL+Break πατήθηκε, ανακατεÏθυνση εξόδου στο `%s'.\n"
+#~ "Η εκτέλεση συνεχίζεται στο παÏασκήνιο.\n"
+#~ "ΜποÏείτε να διακόψετε το Wget πατώντας CTRL+ALT+DELETE.\n"
+
+#~ msgid "%s: Redirection to itself.\n"
+#~ msgstr "%s: ΑνακατεÏθυνση στον εαυτό του.\n"
+
+#~ msgid "Error (%s): Link %s without a base provided.\n"
+#~ msgstr "Σφάλμα (%s): Δόθηκε τοποθεσία %s χωÏίς βάση.\n"
+
+#~ msgid "Error (%s): Base %s relative, without referer URL.\n"
+#~ msgstr "Σφάλμα (%s): Η βάση %s είναι σχετική, χωÏίς URL αναφοÏάς.\n"
+
+#~ msgid "Unknown/unsupported protocol"
+#~ msgstr "Άγνωστο/μη υποστηÏιζόμενο Ï€Ïωτόκολλο"
+
+#~ msgid "Invalid port specification"
+#~ msgstr "Μη έγκυÏη ÏÏθμιση θÏÏας (port)"
+
+#~ msgid ""
+#~ "Local file `%s' is more recent, not retrieving.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Το τοπικό αÏχείο `%s' είναι πιο Ï€Ïόσφατο, αποφεÏγεται η ανάκτηση.\n"
+#~ "\n"
+
+#~ msgid "%s: unrecognized option, character code 0%o\n"
+#~ msgstr "%s: μη αναγνωÏίσιμη επιλογή, κωδικός χαÏακτήÏα 0%o\n"
+
+#~ msgid "%s: unrecognized option `-%c'\n"
+#~ msgstr "%s: μη αναγνωÏίσημη επιλογή `-%c'\n"
+
+#~ msgid "%s: option `-%c' requires an argument\n"
+#~ msgstr "%s: η επιλογή `-%c' απαιτεί ένα ÏŒÏισμα\n"
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644
index 0000000..fedb6a0
--- /dev/null
+++ b/po/en@boldquot.header
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# 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
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644
index 0000000..a9647fc
--- /dev/null
+++ b/po/en@quot.header
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# 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
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
new file mode 100644
index 0000000..d0f1e6c
--- /dev/null
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
new file mode 100644
index 0000000..3a0db51
--- /dev/null
+++ b/po/en_GB.po
@@ -0,0 +1,3534 @@
+# English (British) translation.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Gareth Owen <gowen72@yahoo.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.9.1\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2004-05-27 21:46-0400\n"
+"Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
+"Language-Team: English (British) <en_gb@li.org>\n"
+"Language: en_GB\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, fuzzy, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Connecting to %s[%s]:%hu... "
+
+#: src/connect.c:290
+#, fuzzy, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Connecting to %s:%hu... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Connecting to %s[%s]:%hu... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "connected.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "failed: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Converted %d files in %.2f seconds.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Converting %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nothing to do.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Cannot convert links in %s: %s\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Unable to delete `%s': %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Cannot back up %s as %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Unable to delete `%s': %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntax error in Set-Cookie: %s at position %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr ""
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Cannot open cookies file `%s': %s\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Error writing to `%s': %s\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Error closing `%s': %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Unsupported listing type, trying Unix listing parser.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index of /%s on %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "time unknown "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "File "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Directory "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Not sure "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Length: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (unauthoritative)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Logging in as %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Error in server response, closing control connection.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Error in server greeting.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Write failed, closing control connection.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "The server refuses login.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Login incorrect.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Logged in!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Server error, can't determine system type.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "done. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "done.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Unknown type `%c', closing control connection.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "done. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD not needed.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"No such directory `%s'.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD not required.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "File `%s' already there, not retrieving.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Cannot initiate PASV transfer.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Cannot parse PASV response.\n"
+
+#: src/ftp.c:1101
+#, fuzzy, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "couldn't connect to %s:%hu: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind error (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Invalid PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST failed, starting from scratch.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"No such file `%s'.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"No such file `%s'.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"No such file or directory `%s'.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, closing control connection.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Data connection: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Control connection closed.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Data transfer aborted.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "File `%s' already there, not retrieving.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(try:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2051 src/http.c:4793
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' saved [%ld]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Removing %s.\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Using `%s' as listing tmp file.\n"
+
+#: src/ftp.c:2185
+#, fuzzy, c-format
+msgid "Removed %s.\n"
+msgstr "Removed `%s'.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Recursion depth %d exceeded max. depth %d.\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Remote file no newer than local file `%s' -- not retrieving.\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Remote file is newer than local file `%s' -- retrieving.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, fuzzy, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"The sizes do not match (local %ld) -- retrieving.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Invalid name of the symlink, skipping.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Creating symlink %s -> %s\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Symlinks not supported, skipping symlink `%s'.\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Skipping directory `%s'.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: unknown/unsupported file type.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Failed to get certificate key from %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: corrupt time-stamp.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Will not retrieve dirs since depth is %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Not descending to `%s' as it is excluded/not-included.\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr "Rejecting `%s'.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Rejecting `%s'.\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Error writing to `%s': %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "No matches on pattern `%s'.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Wrote HTML-ised index to `%s' [%ld].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Wrote HTML-ised index to `%s'.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Error parsing proxy URL %s: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+#, fuzzy
+msgid "Unknown host"
+msgstr "Unknown error"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Unknown error"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Resolving %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "failed: timed out.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Cannot resolve incomplete link %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, fuzzy, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: %s: Invalid value `%s'.\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Failed writing HTTP request: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr "File `%s' already there, not retrieving.\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Reusing connection to %s:%hu.\n"
+
+#: src/http.c:2098
+#, fuzzy, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Reusing connection to %s:%hu.\n"
+
+#: src/http.c:2164
+#, fuzzy, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Failed writing HTTP request: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROR %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Malformed status line"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Unknown authentication scheme.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Unknown authentication scheme.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr ""
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s request sent, awaiting response... "
+
+#: src/http.c:3441
+#, fuzzy
+msgid "No data received.\n"
+msgstr "No data received"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Read error (%s) in headers.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(no description)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Location: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "unspecified"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [following]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Length: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignored"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Warning: wildcards not supported in HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Cannot write to `%s' (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Cannot write to `%s' (%s).\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Unable to establish SSL connection.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Cannot write to `%s' (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROR: Redirection (%d) without location.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Last-modified header missing -- time-stamps turned off.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Last-modified header invalid -- time-stamp ignored.\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Server file no newer than local file `%s' -- not retrieving.\n"
+"\n"
+
+#: src/http.c:4651
+#, fuzzy, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "The sizes do not match (local %ld) -- retrieving.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Remote file is newer, retrieving.\n"
+
+#: src/http.c:4678
+#, fuzzy
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Remote file is newer than local file `%s' -- retrieving.\n"
+"\n"
+
+#: src/http.c:4684
+#, fuzzy
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr "Remote file no newer than local file `%s' -- not retrieving.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+#, fuzzy
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "Remote file is newer, retrieving.\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s ERROR %d: %s.\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' saved [%ld/%ld]\n"
+"\n"
+
+#: src/http.c:4818
+#, fuzzy, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Connection closed at byte %ld. "
+
+#: src/http.c:4841
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Read error at byte %ld (%s)."
+
+#: src/http.c:4850
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Read error at byte %ld/%ld (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Unsupported scheme"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC points to %s, which doesn't exist.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Cannot read %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Error in %s at line %d.\n"
+
+#: src/init.c:718
+#, fuzzy, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Error in %s at line %d.\n"
+
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Error in %s at line %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Warning: Both system and user wgetrc point to `%s'.\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Invalid --execute command `%s'\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Invalid boolean `%s', use `on' or `off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Invalid boolean `%s', use `on' or `off'.\n"
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Invalid number `%s'.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Invalid byte value `%s'\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Invalid time period `%s'\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Invalid time period `%s'\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Invalid value `%s'.\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Invalid header `%s'.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Invalid header `%s'.\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Invalid progress type `%s'.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr "%s: %s: Invalid restriction `%s', use `unix' or `windows'.\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "couldn't connect to %s:%hu: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s received, redirecting output to `%s'.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; disabling logging.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Usage: %s [OPTION]... [URL]...\n"
+
+#: src/main.c:590
+#, fuzzy
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"\n"
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+#, fuzzy
+msgid "Directories:\n"
+msgstr "Directory "
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, a non-interactive network retriever.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2003 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Try `%s --help' for more options.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: illegal option -- `-n%c'\n"
+
+#: src/main.c:1593
+#, fuzzy, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "%s: debug support not compiled in.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Can't be verbose and quiet at the same time.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Can't timestamp and not clobber old files at the same time.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: missing URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "No URLs found in %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Unable to delete `%s': %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"\n"
+"FINISHED --%s--\n"
+"Downloaded: %s bytes in %d files\n"
+
+#: src/main.c:2284
+#, fuzzy, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Download quota (%s bytes) EXCEEDED!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Unable to delete `%s': %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Removing %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Continuing in background.\n"
+
+#: src/mswindows.c:289
+#, fuzzy, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Continuing in background, pid %d.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Output will be written to `%s'.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Couldn't find usable socket driver.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: warning: \"%s\" token appears before any machine name\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: unknown token \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Usage: %s NETRC [HOSTNAME]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: cannot stat %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+#, fuzzy
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Could not seed OpenSSL PRNG; disabling SSL.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, fuzzy, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ skipping %dK ]"
+
+#: src/progress.c:545
+#, fuzzy, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Invalid dot style specification `%s'; leaving unchanged.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Removing %s since it should be rejected.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Cannot convert links in %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Loading robots.txt; please ignore errors.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Error parsing proxy URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Error in proxy URL %s: Must be HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d redirections exceeded.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Giving up.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Retrying.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+msgid "No error"
+msgstr "No error"
+
+#: src/url.c:677
+#, fuzzy, c-format
+msgid "Unsupported scheme %s"
+msgstr "Unsupported scheme"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+#, fuzzy
+msgid "Invalid host name"
+msgstr "Invalid user name"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Bad port number"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Invalid user name"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Unterminated IPv6 numeric address"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 addresses not supported"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Invalid IPv6 numeric address"
+
+#: src/url.c:1007
+#, fuzzy
+msgid "HTTPS support not compiled in"
+msgstr "%s: debug support not compiled in.\n"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Continuing in background, pid %d.\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Failed to unlink symlink `%s': %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Failed to get certificate key from %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Failed to load certificates from %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Error writing to `%s': %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Error parsing proxy URL %s: %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr ""
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, c-format
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+
+#, c-format
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Error in Set-Cookie, field `%s'"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+
+#, c-format
+#~ msgid " [%s to go]"
+#~ msgstr " [%s to go]"
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s: option `%s' is ambiguous\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: option `--%s' doesn't allow an argument\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: option `%c%s' doesn't allow an argument\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s: option `%s' requires an argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: unrecognised option `--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s: unrecognised option `%c%s'\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: illegal option -- %c\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- %c\n"
+#~ msgstr "%s: invalid option -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: option requires an argument -- %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: option `-W %s' is ambiguous\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: option `-W %s' doesn't allow an argument\n"
+
+#~ msgid "Host not found"
+#~ msgstr "Host not found"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Failed to set up an SSL context\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Trying without the specified certificate\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "End of file while parsing headers.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Authorization failed.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid " (%s to go)"
+#~ msgstr " (%s to go)"
+
+#, c-format
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "File `%s' already there, will not retrieve.\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Connection closed at byte %ld/%ld. "
+
+#, c-format
+#~ msgid "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+#~ msgstr "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public Licence for more details.\n"
+
+#, c-format
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Starting WinHelp %s\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Empty host"
+
+#, c-format
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Not enough memory.\n"
diff --git a/po/eo.gmo b/po/eo.gmo
new file mode 100644
index 0000000..2258d68
--- /dev/null
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
new file mode 100644
index 0000000..1cc0d39
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,3697 @@
+# Translation of wget messages to Esperanto.
+# Copyright (C) 2015, 2016, 2018, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Luiz Portella <lfpor@lujz.org>, 2005.
+# Felipe Castro <fefcas@gmail.com>, 2013, 2015, 2016, 2018, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.20\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-01-27 16:43+0100\n"
+"Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
+"Language: eo\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.7\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: ne eblas solvi bind-adreson %s; ni malebligas bindon.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Konektado al %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Konektado al %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Konektado al [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF fiaskis: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "konektita.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "malsukceso: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: ne eblas trovi gastigantan adreson %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR fiaskis: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Tro multaj fds malfermitaj. Ne eblas uzi elekton en fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Ni konvertis ligojn en %d dosieroj en %s sekundoj.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Ni konvertas ligojn en %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nenio por fari.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ne eblas konverti ligilojn al %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ne eblas forviÅi %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ne eblas kopii %s kiel %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ne eblas preni kuketon por %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Sintaksa eraro en Set-Cookie: %s ĉe pozicio %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Kuketo venanta el %s provis difini retadreson al "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ne eblas malfermi kuketan dosieron %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Eraro dum skribo al %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Eraro dum fermo de %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Ne subtenata listiga tipo, ni provas Uniksan listigan analizilon.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indekso de /%s en %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "horaro nekonata "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Dosiero "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Dosierujo "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Ligilo "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Sen certeco "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtoj)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Grando: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) restanta"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s restanta"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (sen permeso)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Ne eblis lanĉi SSL. Ĝi estos malaktiva."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Salutanta kiel %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Eraro en la servila respondo, ni fermas la stirkonekton.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Eraro en la saluto de servilo.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Skrib-fiasko, ni fermas la stirkonekton.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "La servilo rifuzis la ensaluton.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "MalÄusta ensaluto.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Ensalutita!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "La servilo ne akceptis la komandon 'PBSZ 0'.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "La servilo ne akceptis la komandon 'PROT %c'.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Eraro de la servilo, ne eblas difini la sistem-tipon.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "farita. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "farita.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo '%c' nekonatas, ni fermas la stirkonekton.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "farita. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD ne necesas.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Logike malebla sekcio estis atingita de getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Netrovita dosierujo %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ne estas postulata.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "La dosiero jam estas havigita.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ne eblas komenci transporton PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ne eblas analizi respondon PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "ne eblis konekti al %s pordo %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind-eraro (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Malvalida pordo.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST fiaskis, ni rekomencas de la bazo.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "La dosiero %s ekzistas.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Neniu tia dosiero %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Neniu tia dosiero %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Neniu tia dosiero aÅ­ dosierujo %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s ekfloris naskiÄe.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, ni fermas stirkonekton.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Konekto de datumaro: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Stirkonekto estas fermita.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Transporto de datumoj estas ĉesigita.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "La dosiero %s jam estas ĉi tie; Äi ne estos elÅutita.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(provo:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skribita al ĉefeligo %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s konservita [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Ni forviÅas %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Ni uzas %s kiel provizoran listig-dosieron.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Ni forigis %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Nivelo de rekursio %d superas maksimuman nivelon %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Fora dosiero ne estas pli nova ol loka %s -- ni ne elÅutas.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Fora dosiero estas pli nova ol loka %s -- ni elÅutas.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"La grandoj ne egalas (loka %s) -- ni elÅutas.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Malvalida nomo de simbola ligilo, ni pretersaltas.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Simbola ligilo jam estis Äusta %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Ni kreas simbolan ligilon %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Simbolaj ligiloj ne estas subtenataj, ni pretersaltas %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ni pretersaltas dosierujon %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: nekonata/nesubtenata dosier-tipo.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Ni fiaskis difini permesojn por %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: fuÅita tempindiko.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Dosierujoj ne estos elÅutitaj dum nivelo de rekursio estas %d (maksimuma "
+"%d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ni ne iras suben al %s ĉar Äi estas forigita/ne-inkluzivita.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Ni rifuzas %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Ni rifuzas %s (malvalida enigo).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s estas forigita/ne-inkluzivita de regex.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Eraro dum kongruo de %s kontraŭ %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Neniu kongruo ĉe la Åablono %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Ni skribis HTML-igitan indekson al %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Ni skribis HTML-igitan indekson al %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERARO: ne eblas malfermi la dosierujon %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERARO: ni fiaskis malfermi atestilon %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Ni Åargis la CA-atestilon '%s'\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERARO: fiasko dum Åargo de la CRL-dosieroatestilon '%s': (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Ni Åargis la CRL-dosieron '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ERARO: GnuTLS postulas ke la Ålosilo kaj la atestilo estu samtipaj.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Via versio de GnuTLS tro malnovas por subteni TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: nerealigita 'sekurec-protokola' modifil-valoro %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Bonvolu raporti tiun ĉi problemon al bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: nerealigita 'sekurec-protokola' modifil-valoro %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: ne eblas rekte difini la ĉenon prio. Ni reprenas la aprioran "
+"prioritaton.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERARO"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVERTO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: neniu atestilo estis prezentata de %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: la atestilo de %s ne estas fidinda.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: la atestilo de %s ne havas konatan eldonanton.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: la atestilo de %s estas senvalidigita.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: la atestila signanto de %s ne estis CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: la atestilo de %s estis signata uzante nesekuran algoritmon.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: la atestilo de %s ankoraÅ­ ne estas aktiva.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: la atestilo de %s senvalidiÄis.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Eraro dum ekigo de atestilo X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Neniu atestilo estis trovata\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Eraro dum analizo de atestilo: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "La atestilo ankoraÅ­ ne estas aktivigita\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "La atestilo eksvalidiÄis\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "La atestila posedanto ne kongruas al la gastigant-nomo %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "La publika Ålosilo ne kongruas al PIN-igita publika Ålosilo!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Atestilo devas esti X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Eraro dum traktado de adres-listo.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Nekonata retnodo"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Dumtempa malsukceso dum nom-eltrovo"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Nekonata eraro"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Ni solvigas %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "fiasko: ne estas IPv4/IPv6 adreso por la retnodo.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "fiasko: limtempo finiÄis.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: ne eblis solvigi nekompletan ligilon %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: malvalida URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Fiasko dum skribo de HTTP-peton: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Sen ĉapoj, ni supozas HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"La dosiero %s jam estas tie; Äi ne estos elÅutata.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime fiaskis. Probable tio estas programeraro.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ne eblas konverti tempindikon al formo http. Ni retropaÅas al tempo 0 kiel "
+"lasta modif-tempo.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY-datumar-dosiero %s mankas: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Ni reuzas ekzistantan konekton al [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Ni reuzas ekzistantan konekton al %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Fiasko dum lego de prokurila respondo: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERARO %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "FuÅa stat-linio"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Prokura tuneligo fiaskis: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Nekonata aÅ­tentikiga Åablono.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Elektita aÅ­tentikiÄo: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Ni konservas al: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Dum elÅuto de subskribo:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Ne eblas legi subskriba enhavo el provizora dosiero. Ni saltas.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Ne eblis krei provizoran dosieron. Ni saltas elÅuton de subskribo.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Malvalida valoro pri. Ni konsideras %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Ne eblis trovi akceptebla resumo por rimedoj Metalink.\n"
+"Ni preteratentas ilin.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Ni malebligas SSL pro aperintaj eraroj.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s peto sendita, ni atendas respondon... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Neniu datumaro estas ricevita.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Leg-eraro (%s) en kapoj.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sen priskribo)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Loko: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nespecifita"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [sekvanta]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"La dosiero %s ne estas modifita en servilo. Ni preterpasas la elÅuton.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"La servilo preteratentis kapon If-Modified-Since por la dosiero %s.\n"
+"Vi eble volas aldoni la modifilon --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" La dosiero estas fakte tute elÅutita; nenio farendas.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Grando: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "preteratentita"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Averto: ĵokeroj ne estas subtenataj en HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Arenea reÄimo ebligita. Kontrolu ĉu fora dosiero ekzistas.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ne eblas skribi al %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Mankas postulata atributo el Kaplinio 'received'.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "AÅ­tentikigo de uzantnomo/pasvorto fiaskis.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ne eblas skribi al dosiero WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ne eblas skribi al provizora dosiero WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ne eblas starigi SSL-konekton.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ne eblas forigi %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERARO: redirektigo (%d) sen loko.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Ne eblis trovi datumaron Metalink en respondo HTTP. Ni elÅutas la dosieron "
+"uzante HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Kapoj Metalink estis trovataj. Ni Åaltas la reÄimon Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Fora dosiero ne ekzistas -- fuÅa ligo!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Mankas ĉapo 'last-modified' -- temp-indikoj estas malaktivitaj.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Malvalida ĉapo 'last-modified' -- temp-indikoj estas preteratentitaj.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Servila dosiero ne estas pli nova ol loka %s -- ni ne elÅutas.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "La grandoj ne interkongruas (loka %s) -- ni elÅutas.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Fora dosiero estas pli nova, ni elÅutas.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Fora dosiero ekzistas kaj povos enhavi ligojn al aliaj rimedoj -- ni "
+"elÅutas.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fora dosiero ekzistas sed enhavas neniun ligon -- ni ne elÅutas.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fora dosiero ekzistas kaj povos enhavi pliajn ligojn,\n"
+"sed rikuro estas malaktivita -- ni ne elÅutas.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Fora dosiero ekzistas.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "URL %s: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skribita al ĉefeligujo %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s konservita [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Konekto fermita ĉe la bajto %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Leg-eraro ĉe la bajto %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Leg-eraro ĉe la bajto %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nesubtenata eco de protekto '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nesubtenata algoritmo '%s'.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC indikas %s, kiu ne povas esti prenita pro la eraro: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ne eblas legi %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Eraro en %s ĉe linio %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Sintaksa eraro en %s ĉe linio %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: nekonata komando %s en %s ĉe linio %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analizo de sistema dosiero wgetrc (env SYSTEM_WGETRC) fiaskis. Bonvole\n"
+"kontrolu '%s',\n"
+"aÅ­ indiku malsaman dosieron uzante --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analizo de sistema dosiero wgetrc fiaskis. Bonvole\n"
+"kontrolu '%s',\n"
+"aÅ­ indiku malsaman dosieron uzante --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Averto: la wgetrc, kaj de la sistemo kaj de la uzanto, indikas %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: malvalida komando --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: malvalida buleo %s; uzu 'on' aÅ­ 'off'.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: malvalida %s; uzu 'on', 'off' aÅ­ 'quiet'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: malvalida numero %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s devas esti uzata nur unufoje\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: malvalida bajt-valoro %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: malvalida tempo-periodo %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: malvalida tempo-periodo %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass postulas ĉenon aŭ alian medi-variablon WGET_ASKPASS aŭ "
+"SSH_ASKPASS por esti difinata.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: malvalida valoro %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: malvalida ĉapo %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: malvalida ĉapo WARC %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: malvalida progres-tipo %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: malvalida limigo %s,\n"
+" uzu [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Enkodigo %s ne validas\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konverto de %s al %s ne estas subtenata\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Malkompleta aÅ­ malvalida plurbajta sekvo estis trovata\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Netraktita errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: lokaĵaro ne estas difinita\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode fiaskis (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Ni fiaskis konverti minusklen: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Redirekto de eligo al %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; ni malebligas protokoladon.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uzmaniero: %s [MODIFILO]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Nepraj argumentoj por longaj modifiloj ankaÅ­ nepras por la mallongaj.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Ekigo:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version montri la version de Wget kaj eliri\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help montri tiun ĉi helpilon\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background iri al fona reÄimo post ekigo\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=KOMANDO lanĉi komandon laŭ stilo '.wgetrc'\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Saluta kaj enig-dosiero:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=DOSIERO log mesaÄoj al DOSIERO\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=DOSIERO postmeti mesaÄojn al DOSIERO\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug montri multe da rafiniga informaro\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug montri rafinigan eligon Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet kviete (neniu eligo)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose fariÄi detalema (tio ĉi aprioras)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose malÅalti detalemon, sen esti kvieta\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIPO eligi bendlarÄo kiel TIPO. TIPO povas "
+"esti 'bits'\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DOSIERO elÅuti URL-ojn trovitajn en loka aÅ­ "
+"ekstera DOSIERO\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=DORSIERO elÅuti dosierojn traktatajn en loka meta-"
+"liga DOSIERO\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html trakti enig-dosieron kiel HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL adrestrovi HTML-enig-dosierajn ligojn (-i "
+"-F)\n"
+" relativajn al URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=DOSIERO indiki uzotan agord-dosieron\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies ne uzi kuketojn\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=DOSIERO protokoli kialojn de malakcepto al "
+"DOSIERO\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "ElÅuti:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NOMBRO agordi nombron de reprovoj je NOMBRO (0 "
+"senlimigas)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused provi reen eĉ se la konekto estas "
+"rifuzita\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERAROJ kom-apartita listo de eraroj HTTP por "
+"esti\n"
+"repruvotaj\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=DOSIERO skribi dokumentojn al DOSIERO\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber preterpasi elÅutojn kiuj anstataÅ­igus\n"
+" ekzistantajn dosierojn\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc ne provi preni legitimaĵon el .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue daÅ­rigi uzi dosieron parte elÅutita\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=DEÅœOVO komenci elÅuton el nul-bazita pozicio "
+"DEÅœOVO\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TIPO elekti progres-montrilan tipon\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress montri la progres-breton en iu ajn "
+"detaliga reÄimo\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ne re-elpreni dosierojn krom se pli nova "
+"ol\n"
+" la loka\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ne uzi kondiĉon 'if-modified-since', "
+"preni\n"
+" petojn laÅ­ reÄimo de tempindiko\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ne difini la lokan dosieran tempindikon "
+"per\n"
+" tiu de la servilo\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response montri respondon de la servilo\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ne elÅuti ion ajn\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDOJ agordi ĉiujn temp-limojn je SEKUNDOJ\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESOJ listo da DNS-serviloj por alpeti "
+"(apartitaj de komoj)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESO ligi DNS-solvilon al ADRESO (gastigant-"
+"nomo aÅ­ IP) en la loka gastiganto\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEK agordi la temp-limon por serĉo de DNS je "
+"SEK\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEK agordi la temp-limon por konekto je SEK\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEK agordi la temp-limon por lego je SEK\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNDOJ atendi SEKUNDOJn inter elÅutoj\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDOJ atendi 1..SEKUNDOJn inter reprovoj de "
+"elÅutoj\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait atendi de 0.5*WAIT...1.5*WAIT sekundoj "
+"inter elÅutoj\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy nepre malÅalti prokur-servilon\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=NUMERO difini elÅuta limo al NUMERO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESO ligi al ADRESO (gastigant-nomo aÅ­ IP) en "
+"la loka gastiganto\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=RAPIDO limigi elÅut-rapido al RAPIDO\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache malebligi kaÅmemorajn DNS-serĉojn\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS limigi signojn en dosiernomoj al tiuj "
+"permesataj de la OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case preteratenti usklecon dum kongruo al "
+"dosieroj/dosierujoj\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only konekti nur al adresoj IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only konekti nur al adresoj IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIO konekti unue al adresoj el indikita "
+"familio,\n"
+" unu el IPv6, IPv4, aÅ­ neniu\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UZANTO difini uzanton kaj de FTP kaj HTTP kiel "
+"UZANTO\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PASV difini pasvorton kaj de FTP kaj de HTTP "
+"kiel PASV\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password peti pasvortojn\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=KOMANDO indiki legitimaĵan manipulilon por peti\n"
+" uzantnomon kaj pasvorton. Se neniu "
+"KOMANDO estis\n"
+" indikata, la medi-variablo WGET_ASKPASS "
+"aÅ­\n"
+" SSH_ASKPASS estos uzata.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri malÅalti subteno al IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENK uzi ENK kiel lokan enkodigon por IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENK uzi ENK kiel la aprioran deforan "
+"enkodigon\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink forigi la dosieron antaÅ­ ol pereigo\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash teni dosierojn kun malakorda kontrolsumo "
+"(sufiksi per .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMERO 'Metalink' application/metalink4+xml "
+"'metaurl' ordiga NUMERO\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http uzi metadatumaron Metalink el kapoj de "
+"respondo HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location preferata loko por rimedoj Metalink\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr malebligi konservon de metadatumaro en "
+"kromaj dosieratributoj\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Dosierujoj:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ne krei dosierujojn\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories devigi kreon de dosierujoj\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ne krei gastigantajn dosierujojn\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories uzi protokolan nomon en dosierujoj\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIKSO konservi dosierojn al PREFIKSO/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NOMBRO preteratenti NOMBROn da dosierujaj "
+"komponantoj\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Modifiloj de HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=UZANTO difini http-uzanton kiel UZANTOn\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --password=PASV difini pasvorton de http kiel PASV\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache malebligi servil-enmemorigitan datumaron\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NOMO ÅanÄi la aprioran paÄnomon (ordinare\n"
+" Äi estas 'index.html'.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension konservi dokumentojn HTML/CSS kun taÅ­gaj "
+"sufiksoj\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length preteratenti la kap-kampon 'Content-"
+"Length'\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=ĈENO enmeti ĈENO inter la kaplinioj\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TIPO elekti densigon, unu el auto, gzip kaj "
+"none. (apriore: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximumo da redirektigoj permesataj por "
+"paÄo\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UZANTO difini UZANTO kiel prokuran uzantnomon\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PASV difini PASV kiel prokuran pasvorton\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inkluzivigi la kapon 'Referer: URL' en "
+"peto HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers konservi la kapliniojn HTTP en dosieron\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTO identigi kiel AGENTOn anstataÅ­ Wget/"
+"VERSIO\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive malebligi HTTP-an 'keep-alive' (persistaj "
+"konektoj)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ne uzi kuketojn\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=DOSIERO Åargi kuketojn el DOSIERO antaÅ­ la "
+"seanco\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=DOSIERO konservi kuketojn al DOSIERO post la "
+"seanco\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies Åargi kaj konservi seancajn (ne-ĉiamajn) "
+"kuketojn\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ĈENO uzi metodon POST; sendi ĈENOn kiel la "
+"datumaron\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=DOSIERO uzi metodon POST; sendi enhavojn de "
+"DOSIERO\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMetodo uzi metodon \"HTTPMetodo\" en la peto\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ĈENO sendi ĈENOn kiel datumaron. --method "
+"DEVAS esti difinita\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=DOSIERO sendi enhavojn de DOSIERO. --method DEVAS "
+"esti difinita\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition honorigi la kaplinion Content-Disposition "
+"dum\n"
+" elekto de lokaj dosiernomoj "
+"(EKSPERIMENTA)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error montri la ricevitan enhavon je servilaj "
+"eraroj\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge sendi aÅ­tentikigan informon Baza HTTP\n"
+" sen unue atendi por testo de la "
+"servilo\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Modifiloj HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR elekti sekuran protokolon, unu el: auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 aÅ­ PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only nur sekvi sekurajn ligojn HTTPS\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ne validigi la atestilon de la servilo\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=DOSIERO klienta atestila dosiero\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr " --certificate-type=TIPO klienta atestilo-tipo, PEM aÅ­ DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=DOSIERO privata Ålosila dosiero\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIPO privata Ålosilo-tipo, PEM aÅ­ DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=DOSIERO dosiero sen aro da CA-oj\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=UJO dosierujo kie haketa listo da CA-oj estas "
+"konservataj\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=DOSIERO dosiero kun aro da CRL-oj\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=DOSIERO/HAKETOJ Dosiero de publika Ålosilo (PEM/DER), "
+"aÅ­ \n"
+" iu ajn nombro da haketoj sha256 "
+"enkoditaj \n"
+" per base64, antaÅ­sekvitaj de "
+"'sha256//' kaj \n"
+" apartitaj de ';', por kontroli "
+"samtavolanon\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=DOSIERO dosiero kun hazarda datumaro por semigi "
+"la SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=DOSIERO dosiero nomigantan la ingo EGD kun "
+"hazarda datumaro\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=ĈENO Difini la prioritatan ĉenon (GnuTLS) aŭ ĉifro-"
+"listan ĉenon (OpenSSL) rekte.\n"
+" Uzu atenteme. Tiu ĉi modifilo "
+"anstataÅ­igas --secure-protocol.\n"
+" La formo kaj sintakso de ĉi tiu ĉeno "
+"dependas de la specifa maÅino SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Modifiloj de HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts malebligi HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file vojo de datumbazo HSTS (anstataÅ­igos la "
+"originalon)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Modifiloj FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf uzi la formon Stream_LF por ĉiuj "
+"ciferecaj dosieroj FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=UZANTO difini uzanton de FTP kiel UZANTOn\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASV difini pasvorton de FTP kiel PASV\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ne forigi dosierojn '.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob malebligi Åablonojn por dosiernomoj de "
+"FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp malebligi \"pasivan\" Åutan reÄimon\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions konservi deforajn dosier-permesojn\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks dum rikuro, preni dosierojn 'linked-"
+"to' (ne ujo)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Modifiloj FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit uzi implican FTPS (apriora pordo "
+"estas 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl daÅ­rigi la seancon SSL/TLS komencita "
+"en la kontrola konekto kiam\n"
+" oni malfermas datumaran konekton\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection ĉifri nur la kontrolan kanalon; la "
+"tuta datumaro estos laŭ simpla teksto\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp retropaÅi al FTP se FTPS ne estas "
+"subtenata en la celita servilo\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Modifiloj WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=DOSIERNOMO konservi petan/respondan datumaron al "
+"dosiero .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=ĈENO enmeti ĈENOn en rikordon de warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMERO difini maksimuman kvanton da dosieroj "
+"WARC kiel NUMEROn\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx skribi indeks-dosierojn CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=DOSIERNOMO ne konservi rikordojn listigitajn en tiu "
+"ĉi dosiero CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ne densigi dosierojn WARC per GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ne kalkuli totalojn SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ne konservi protokol-dosiero en rikordo "
+"WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DOSIERUJO loko por provizoraj dosieroj kreitaj de\n"
+" la skribanto WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rikura elÅuto:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive indiki rikuran elÅuton\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMERO maksimuma rikura profundo (inf aÅ­ 0 por "
+"senlima)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after forigi dosierojn loke post elÅuti ilin\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links igi ke simbolaj ligoj por elÅutitaj HTML "
+"aÅ­ CSS indiku\n"
+" lokajn dosierojn\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only nur konverti la dosieran parton de la URL-"
+"oj (baznomo)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N antaÅ­ ol skribi dosieron X, rotacii Äis N "
+"savkopiajn dosierojn\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted antaÅ­ ol konverti dosieron X, savkopii "
+"kiel X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted antaÅ­ ol konverti dosieron X, savkopii "
+"kiel X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror mallongigo por -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites preni ĉiujn bildojn, ktp, bezonataj por "
+"montri paÄon HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments Åalti severan (SGML) traktadon de "
+"komentoj HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rikura akcepto/malakcepto:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTO kom-apartita listo de akcepteblaj "
+"sufiksoj\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTO kom-apartita listo de malakcepteblaj "
+"sufiksoj\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGESP regesp kongruanta al akcepteblaj URL-oj\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGESP regesp kongruanta al malakcepteblaj URL-"
+"oj\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TIPO tipo de regesp (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TIPO tipo de regesp (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTO kom-apartita listo de akcepteblaj "
+"retregionoj\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTO kom-apartita listo de malakcepteblaj "
+"retregionoj\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp sekvi ligojn FTP el dokumentoj HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTO kom-apartita listo de sekvataj markoj "
+"HTML\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTO kom-apartita listo de preteratentataj "
+"markoj HTML\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts iri al fremdaj gastigantoj kiam rikura\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative sekvi nur relativajn ligojn\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTO listo de permesataj dosierujoj\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names uzi nomon indikitan de la lasta elemento\n"
+" de la redirektiga URL\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTO listo de forigitaj dosierujoj\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent ne iri supren al la supera dosierujo\n"
+
+#: src/main.c:1031
+#, fuzzy
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"kaj/aŭ indiku program-erarojn ĉe https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, ne-interaga reta elÅutilo.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Pasvorto por uzanto %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Pasvorto: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ne eblas krei dukton\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Eraro dum ekigo de generigaj dosier-agoj por use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Eraro dum difino de generigaj dosier-agoj por use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Eraro dum lego de respondo el komando \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Uzantnomo por '%s%s': "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Pasvorto por '%s%s@%s': "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokaĵaro: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompili: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Ligo: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s konstruita en %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (med)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (uzanto)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistemo)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Kopirajto © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Permeso GPLv3+: GNU GPL versio 3 aÅ­ posta\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Tio ĉi estas libera programaro: vi estas libera por ÅanÄi kaj redisdoni "
+"Äin.\n"
+"Estas neniu GARANTIO, laŭ plej amplekse permesata de leÄoj.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Originale skribita de Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Bonvolu sendi raportojn pri program-misoj kaj demandojn al <bug-wget@gnu."
+"org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problemo pri memor-rezervo\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Ni ĉesas pro eraro en %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Provu '%s --help' por pliaj modifiloj.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: malvalida modifilo -- '-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Rafiniga subteno ne estas kompilita. Ni preteratentas flagon --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Kaj --no-clobber kaj --convert-links estis indikataj, nur --convert-links "
+"estos uzata.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Kaj --no-clobber kaj --convert-file-only estis indikataj, nur --convert-file-"
+"only estos uzata.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ne eblas esti detalema kaj silenta samtempe.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Ne eblas temp-marki kaj ne frapi malnovajn dosierojn samtempe.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ne eblas difini kaj --inet4-only kaj --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Ne eblas uzi kaj -k aÅ­ --convert-file-only kaj -O se pluraj URL estas "
+"indikitaj, aÅ­ kombinite\n"
+"kun -p aŭ -r. Konsultu la gvidlibron por pli da detaloj.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVERTO: kombino de -O kun -r aŭ -p signifos ke ĉiu elÅutita enhavo\n"
+"estos metita en ununura dosiero indikita de vi.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVERTO: tempindiko igas nenion kombinite kun -O. Konsultu la gvidlibron\n"
+"por pli da detaloj.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Eligo de WARC ne funkcias kun --no-clobber, --no-clobber estos malebligata.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Eligo de WARC ne funkcias kun tempindiko, tempindiko estos malebligata.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Eligo de WARC ne funkcias kun --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Eligo de WARC ne funkcias kun --continue aÅ­ --start-pos, ili estos "
+"malebligataj.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Resumoj estas malebligataj; Multobligo de WARK ne trovos duobligitajn "
+"rikordojn.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Densigo ne funkcias kun --continue aÅ­ --start-pos, ili estos malebligataj.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ne eblas difini kaj --ask-password kaj --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Indiki samtempe --start-pos kaj --continue ne estas rekomendinde; --continue "
+"estos malebligata.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: mankanta URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Vi ne povas difini kaj --post-data kaj --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Vi ne povas uzi --post-data aÅ­ --post-file kune kun --method. --method "
+"postulas datumaron per la modifiloj --body-data kaj --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Vi devas indiki metodon per --method=HTTPMetodo por uzi kun --body-data aÅ­ --"
+"body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Vi ne povas difini kaj --body-data kaj --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Tiu ĉi versio ne subtenas IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k aÅ­ -r povas esti uzataj kune kun -O nur se eliganta al ordinara dosiero.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links aÅ­ --convert-file-only povas esti uzataj kune nur se "
+"eliganta al ordinara dosiero.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Ni fiaskis lanĉi 'libcares'\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Ni fiaskis lanĉi kanalon c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Ni fiaskis analizi IP-adreson '%s'\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Ni fiaskis difini DNS-servilo(j)n '%s' (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "URL-oj ne trovitaj en %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ne eblas analizi meta-ligan dosieron %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ne eblis elÅuti ĉiujn rimedojn el %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FINIGITA --%s--\n"
+"Totala mur-horloÄa tempo: %s\n"
+"ElÅutite: %d dosieroj, %s en %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "ElÅuta limo de %s TROIGIS!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O ne estas subtenata por meta-liga elÅuto. Ni preteratentas.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planita meta-liga dosiero: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Sekurigita meta-liga dosiero: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Rifuzo de 'metalink'-dosiero. Malsekura nomo.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Procezado de 'metaurl' %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Rifuzo de 'metaurl'-dosiero %s. Malsekura nomo.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Ni fiaskis elÅuti %s. Ni preterpasas la meta-URL.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ne eblas analizi meta-URL-an dosieron %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Procezado de 'metaurl'-oj finis liveranta eraron.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tipo de rimedo %s ne estas subtenata, ni preterpasas...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Ne eblis malfermi elÅutitan dosieron.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Konputado de grando por %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Dosier-grando ne estas deklarita. Ni preterpasas kontrolon.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Ne eblis scii la grandon de la elÅutita dosiero.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Malkongruo de grando por la dosiero%s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Grando kongruas.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Konputado de kontrolsumo por %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrolsumo kongruas.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Malkongruo de kontrolsumo por dosiero%s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Ne eblis malfermi elÅutitan dosieron por kontroli subskribon.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Validigo de subskribo sukcesis.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Malvalida subskribo. Ni malakceptas la rimedon.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Datumaro kongruas al subskribo, sed subskribo ne estas fidebla.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Neniu kontrolsumo estis trovata.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Ni fiaskis elÅuti %s. Ni saltas la rimedon.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "La dosiero %s estas elÅutita sed grando ne kongruas. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "La dosiero %s estas elÅutita sed la kontrolsumo ne kongruas. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "La dosiero %s estas elÅutita sed la subskribo ne kongruas. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Renomigo de %s al %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Ni daÅ­rigas fone.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Ni daÅ­rigas fone, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Eligo estos skribita al %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() fiaskis\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() fiaskis\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: ne eblis trovi uzeblan ing-pelilon.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() fiaskis. La ingo ne povis esti difinata kiel blokantan.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: averto: la ĵetono %s aperas antaÅ­ iu ajn maÅina nomo\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: nekonata ĵetono \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uzmaniero: :%s NETRC [GASTIGANT-NOMO]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: ne eblas apliki stat al %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVERTO: ni uzas malfortan hazardan semon.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Ne ebli semi PRNG; konsideru uzi --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Via versio de OpenSSL tro malnovas por subteni TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Via versio de OpenSSL tro malnovas por subteni TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Via versio de OpenSSL tro malnovas por subteni TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: nerealigita modifil-valoro de 'secure-protocol' %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: malvalida ĉifro-listo: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "AVERTO: Ne eblis semi PRNG. Konsideru uzi --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: ne eblas kontroli atestilon de %s, eldonita de %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Ne eblas loke kontroli la aÅ­toritato de la eldonanto.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Mem-signita atestilo estis trovata.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Eldonita atestilo ne validas ankoraÅ­.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Eldonita atestilo malvalidiÄis.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: neniu atestila alternativa nomo de temo kongruas al\n"
+"\tla petita gastigant-nomo %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: atestila komuna nomo %s ne kongruas al la petita gastigant-nomo %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: atestila komuna nomo malvalidas (Äi enhavas signon NUL).\n"
+" Tio ĉi povas esti indiko ke la gastiganto ne estas kiu Äi diras esti\n"
+" (tio estas, Äi ne estas la vera %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Por konekti al %s sensekure, uzu '--no-check-certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ ni preterpasas %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Malvidala indiko de punkto-stilo %s; ni lasas nemodifita.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " en "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ne eblas scii la frekvencon de horloÄo REALTIME: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Ni forigas %s, ĉar Äi devos esti malakceptata.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ne eblas malfermi %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Ni Åargas je robots.txt; bonvolu preteratenti erarojn.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Eraro dum analizado de prokurila URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Eraro en prokurila URL %s: devas esti HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d rediktegij troigi.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Ni rezignas.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Ni reprovas.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Ni ne trovis fuÅajn ligojn.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Ni trovis %d fuÅan ligon.\n"
+"\n"
+msgstr[1] ""
+"Ni trovis %d fuÅajn ligojn.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Sen eraro"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nesubtenata Åablono %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Mankas skemo"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Malvalida retnoda nomo"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "MalÄusta pordnumero"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Malvalida uzantnomo"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Nedifinita IPv6 numera adreso"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adreso ne eltenebla"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Malvalida IPv6 numera adreso"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Subteno al HTTPS ne estas enkompilita"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Nekonvertebla plurbajta sekvo estis trovata\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: malsukceso rezervi sufiĉe da memoro; memoro estas elĉerpita.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: malsukceso rezervi %ld bajtojn; memoro estas elĉerpita.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: teksta bufro tro grandas (%d bajtoj), ni ĉesas.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Ni daÅ­rigas en fona reÄimo, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ni fiaskis forigi la simbol-ligon %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Ni fiaskis Fopen la dosieron %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Ni fiaskis preni FD por la dosieron %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Ni fiaskis stat la dosieron %s, (kontrolu permesojn)\n"
+
+#: src/utils.c:902
+#, fuzzy, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"La dosieron %s ÅanÄis ekde la lasta kontrolo. Sekureca kontrolo fiaskis."
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Ni fiaskis malfermi la dosieron %s, motivo :%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Ni fiaskis stat la dosieron %s, eraro: %s\n"
+
+#: src/utils.c:953
+#, fuzzy, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Ni provas malfermi la dosieron %s sed Äi ÅanÄis ekde la lasta kontrolo. "
+"Sekureca kontrolo fiaskis."
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Malvalida regul-esprimo %s, eraro PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Malvalida regul-esprimo %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Eraro dum kongruo al %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Ni preterpasas Ålosilon kun malÄusta grando (%d/%d): %s\n"
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Eraro dum malfermo de la dosieros WARK %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Eraro dum malfermo de la dosieros WARK %s.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Eraro dum duobligo de dosier-identigilo de WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Eraro dum malfermo de fluo GZIP al dosiero WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Eraro dum skribo de rikordo warcinfo al dosiero WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Malfermo de la dosiero WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Eraro dum malfermo de la dosieros WARK %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Dosiero CDX ne listigas originalajr URL-ojn. (Mankas kolumno 'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Dosiero CDX ne listigas kontrolsumojn. (Mankas kolumno 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Dosiero CDX ne listigas id de rikordoj. (Mankas kolumno 'k'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Ni Åargis je %d rikordo el CDX.\n"
+"\n"
+msgstr[1] ""
+"Ni Åargis je %d rikordoj el CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Ne eblis legi dosieron CDX %s por multobligo.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Ne eblis malfermi provizoran dosieron WARC de manifesto.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Ne eblis malfermi provizoran dosieron WARC de protokolo.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Ne eblis malfermi dosieron WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Ne eblis malfermi dosieron CDX por eligo.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Ne eblis provizoran dosieron WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Estis trovata Äusta kongruo en dosiero CDX. Ni konservas revizitan rikordon "
+"al WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Nekonata sistemeraro"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adres-familio por gastig-nomo ne estas subtenata"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "MalÄusta valoro por ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Neriparebla malsukceso dum nom-eltrovo"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family ne estas subtenata"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Malsukceso dum rezervo de memoro"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Neniu adresso estas asociita kun gastig-nomo"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nomo aÅ­ servo ne estas konata"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servnomo ne estas subtenata por ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype ne estas subtenata"
+
+#~ msgid "System error"
+#~ msgstr "Sistem-eraro"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumenta bufro tro malgrandas"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Procezada peto rulas"
+
+#~ msgid "Request canceled"
+#~ msgstr "Peto estis ĉesigata"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Peto ne estis ĉesigata"
+
+#~ msgid "All requests done"
+#~ msgstr "Ĉiuj petoj estas plenumitaj"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrompita de signalo"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametra ĉeno ne estas Äuste enkodigita"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: modifilo '%s%s' estas plursenca\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: modifilo '%s%s' estas plursenca; ebloj:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: nerekonata modifilo '%s%s'\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: modifilo '%s%s' ne permesas argumenton\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: modifilo '%s%s' postulas argumenton\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: malvalida modifilo -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: modifilo postulas argumenton -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "'"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Sukceso"
+
+#~ msgid "No match"
+#~ msgstr "Neniu kongruo"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Malvalida regulesprimo"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Malvalida ordkompara signo"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Malvalida signoklasnomo"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Sekvanta retroklino"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Malvalida retroreferenco"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Senpara [, [^, [:, [., aÅ­ [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Senpara ( aÅ­ \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Senpara \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Malvalida enhavo de \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Malvalida intervalofino"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memoro estas plenigita"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Malvalida antaÅ­a regulesprimo"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Tro frua fino de regulesprimo"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regulesprimo tro grandas"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Senpara ) aÅ­ \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Mankas antaÅ­a regulesprimo"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "ne eblas krei dukton"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "subprocezo %s fiaskis"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle fiaskis"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "ne eblas restarigi fd %d: dup2 fiaskis"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "Subprocezo %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "Subprocezo %s ricevis fatalan signalon %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "memoro estas plenigita"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Bonvolu sendi raportojn, demandojn, diskutojn al <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: modifilo '--%s' ne permesas argumenton\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: nerekonata modifilo '--%s'\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: modifilo '-W %s' estas plursenca\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: modifilo '-W %s' ne permesas argumenton\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: modifilo 'W %s' postulas argumenton\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "La dosiero `%s' jam estas ĉi tie; Äi ne estos elÅutita.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Malvalida ĉeno UTF-8: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode fiaskis (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s estis ricevata.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Permeso fiaskis.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries indiki la nombro da reprovoj por "
+#~ "dosiero.\n"
+#~ " (bezonas esti uzata kun --metalink-"
+#~ "file)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --jobs indiki kiom da fadenoj.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Informo de uzantnomo kaj pasvorto ne necesas esti "
+#~ "indikata dum elÅuto el meta-ligo.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s ne povas esti uzata kun --metalink.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Eraro en Set-Cookie, kampo `%s'"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: neleÄa modifilo -- %c\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - Konekto fermita ĉe la bajto %s/%s. "
+
+#~ msgid "Failed writing to proxy: %s.\n"
+#~ msgstr "Eraro dum registrado al proxy: %s.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%s/%s]\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' ricevite [%s/%s]\n"
+#~ "\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Malplena retnodo"
+
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr "Ne eblis konverti `%s' al adreso. Ni ÅanÄas al ANY.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST fuÅis; `%s' ne estos stumpigita.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s por fini]"
+
+#~ msgid "Host not found"
+#~ msgstr "Retnodo netrovita"
diff --git a/po/es.gmo b/po/es.gmo
new file mode 100644
index 0000000..2239ae3
--- /dev/null
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..bffccd8
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,3951 @@
+# translation of wget-1.18.es.po to Spanish
+# Mensajes en español para GNU wget.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+#
+# Traducido con la ayuda de:
+# Juan José Rodríguez <jcnsoft@jal1.telmex.net.mx>
+#
+# Revisado por:
+# Carlos Linares López <clinares@delicias.dia.fi.upm.es; carlosl@acm.org>
+# Santiago Vila <sanvila@unex.es>
+# Nicolás Lichtmaier <nick@feedback.net.ar>
+#
+# Notas:
+#
+# 1. Los comentarios que empiezan por "Duda:" se refieren a mensajes que
+# debieran ser revisados.
+#
+#
+# 2010·11·29 Traducido nuevamente por Carlos E. R. M. <carlos.e.r@opensuse.org>
+#
+# Salvador Gimeno Zanón <salgiza@jazzfree.com>, 2001.
+# Carlos E. Robinson <carlos.e.r@opensuse.org>, 2012, 2013, 2015, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.18\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2016-06-28 22:09+0200\n"
+"Last-Translator: Carlos E. Robinson <carlos.e.r@opensuse.org>\n"
+"Language-Team: Spanish <es@tp.org.es>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 1.5\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+# CER, 20101031: No traduzco "bind", porque creo que se refiere al programa "bind".
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: no se pudo resolver la dirección \"bind\" %s; desactivando bind.\n"
+
+# Me temo que nadie se "conecta a" sino que se "conecta con", ... ¿no te
+# suena mejor? - cll
+# sip - Salva
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Conectando con %s[%s]:%d... "
+
+# Me temo que nadie se "conecta a" sino que se "conecta con", ... ¿no te
+# suena mejor? - cll
+# sip - Salva
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Conectando con %s:%d... "
+
+# Me temo que nadie se "conecta a" sino que se "conecta con", ... ¿no te
+# suena mejor? - cll
+# sip - Salva
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Conectando con [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "conectado.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "falló: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: no se pudo resolver la dirección del equipo %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Enlaces convertidos en %d ficheros en %s segundos.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Convirtiendo enlaces en %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "no hay nada que hacer.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "No se han podido convertir los enlaces en %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "No se pudo borrar %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "No se pudo hacer una copia de seguridad de %s como %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "No se pudo obtener cookie para %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Error de sintaxis en Set-Cookie: %s en posición %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "El cookie procedente de %s trató de poner el dominio a "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "No se pudo abrir el fichero de cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Error escribiendo a %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Error cerrando %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Tipo de listado no soportado, se intentará con el analizador de listados de "
+"Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ãndice de /%s en %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "hora desconocida "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fichero "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Directorio "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Enlace "
+
+# creo que se refiere al tipo (fichero/directorio/enlace)
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Inseguro "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Longitud: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", quedan %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", quedan %s"
+
+# nota jjrs: Se agrega este mensaje cuando el wget no ha obtenido
+# directamente el tamaño del archivo a transferir y esta usando la
+# longitud que reporta el inicio de la transferencia.
+#
+# ¡Dabuti! Si no lo llegas a decir, ... ¡Lo estaba flipando! :) Pero
+# vamos, siendo como dices, a mí me suena perfectísimamente - cll
+#
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (probablemente)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "No se pudo iniciar SSL, se desactivará."
+
+# mmmm... no estoy seguro de esto...
+# ¿Así no es mejor? (nl)
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Identificándose como %s ... "
+
+# Me parece más `humanoide' añadir el artículo a las cosas, ... Los
+# angloparlantes suelen evitarlo (¿será porque no son humanos? :) pero
+# eso no significa que nosotros nos lo ahorremos, pues eso es contrario
+# a nuestra costumbre - cll
+# einch! que tengo familiares güiris ;-) , pero tienes razón -Salva
+#
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Error en la respuesta del servidor, cerrando la conexión de control.\n"
+
+# `greeting' también puede traducirse como `recepción' que, en este
+# caso, me parece más apropiado. -cll
+# bien - Salva
+# No está bien, es confuso. Recepción suena a recibir... (nl)
+#
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Error en el saludo del servidor.\n"
+
+# En inglés suele resultar muy adecuada la utilización de participios,
+# puesto que esa es una forma de adjetivación muy común. Sin embargo, en
+# español crea un efecto "computadora" muy desagradable, ...
+#
+# Por ejemplo, "Fallo de escritura" me parece muchísimo más apropiado
+# que "Escritura fallida"
+#
+# Además, he añadido el artículo a `conexión' - cll
+#
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Fallo de escritura, cerrando la conexión de control.\n"
+
+# Es una regla de oro intentar evitar las expresiones en inglés tanto
+# como sea posible. Esta ha sido una cuestión harto discutida en
+# es@li.org y, al final, se decidió, por consenso adoptar siempre la
+# siguiente norma:
+#
+# "Siempre que sea posible debe sustituirse el término en inglés por
+# otro equivalente en español. Solo si el término español no resulta
+# suficientemente descriptivo puede acompañarse entre paréntesis del
+# término en inglés. Por ejemplo: `pipe' se debe traducir por `tubería',
+# pero como este término puede resultar extraño para muchos
+# programadores, se admite: `tuberia (pipe)'.
+#
+# A propósito de esta norma, `login' puede parecer un término muy
+# extendido que todo el mundo conoce y entiende, ¡pero no es
+# español!.
+#
+# Me he permitido sustituirte `login' por `acceso', o una expresión
+# equivalente, en todos los mensajes del fichero. Espero que te parezca
+# oportuno - cll
+#
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "El servidor ha rechazado el acceso.\n"
+
+# Duda: en este caso, sospecho que el `login' se refiere al nombre de
+# usuario, ¿verdad? - cll
+# sí -Salva
+#
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Nombre de usuario incorrecto.\n"
+
+# ¡Una excelente traducción! :) - cll
+# gracias! :) -Salva
+#
+# Preferiría algo como "Conectado" o algo así. sv
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "¡Dentro!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "El servidor no aceptó la orden 'PBSZ 0'.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "El servidor no aceptó la orden 'PROT %c'.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Error del servidor, no se pudo determinar el tipo de sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "hecho. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "hecho.\n"
+
+# He añadido el artículo a `conexión' - cll
+#
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo desconocido `%c', cerrando la conexión de control.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "hecho. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> no se necesita CWD.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Sección lógicamente imposible alcanzada en getftp()"
+
+# CER: Pendiente de traducir, si se puede. Creo que no se debe, pueden ser tokens.
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"No existe el directorio %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> no se requiere CWD.\n"
+
+# `no recuperando' no me suena muy español, te propongo la alternativa
+# más "humanizada", `no se recupera' - cll
+# CER, 20101031: no sé cual era el texto inglés original de ese comentario (ahora está en fuzzy), en la actualidad parece demasiado largo. -> Ah, es que es una traducción automática de otro msgid con comentario y todo:
+# File %s already there; not retrieving.\n
+# El fichero `%s' ya está ahí, no se recupera.\n
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "El fichero ya fué recuperado.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "No se pudo iniciar la trasferencia PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "No se pudo analizar la respuesta PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "no se pudo conectar con %s puerto %d:%s\n"
+
+# Duda: no estoy muy seguro, pero ... ¿y `error de enlace' o algo
+# parecido? Probablemente, este sea uno de los casos en los que debas
+# incluir entre paréntesis la palabra `bind'.
+#
+# Mientras tanto, te sugiero `error de enlace (bind)' - cll
+# la verdad es que no tengo ni idea de qué es esto :( - Salva
+#
+# Es la función bind(2), que asigna una dirección a un socket.
+# Me parece que decir lo de la función es mejor. (nl)
+#
+# CER, 20101031: si es una llamada a función, entonces falta una "a"
+#
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Error en la llamada a “bind†(%s).\n"
+
+# Ya no está "prohibido" usar esta palabra. sv
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PUERTO inválido.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"El comando REST no funcionó, se empezará desde el principio\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "El fichero %s existe.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "No existe tal fichero %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"No existe tal fichero %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"No existe tal fichero o directorio %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s de repente existe.\n"
+
+# He añadido el artículo a `conexión' - cll
+#
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, cerrando la conexión de control.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Conexión de datos: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Conexión de control cerrada.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Trasferencia de datos abortada.\n"
+
+# `no recuperando' no me suena muy español, te propongo la alternativa
+# más "humanizada", `no se recupera' - cll
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "El fichero %s ya está ahí, no se recupera.\n"
+
+# nota jjrs: no sería mejor intento?
+# pues sí - Salva
+# decididamente si - cll
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(intento:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escritos a stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s guardado [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Eliminando %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Usando %s como fichero temporal de listado.\n"
+
+# Aquí volvemos un poco a lo de siempre: en inglés, los participios se
+# emplean con frecuencia para adjetivar un sustantivo, sin embargo, en
+# español sirven para hacer referencia a una acción. Esto es, deben ir
+# después del sustantivo - cll
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s eliminado.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "La profundidad de recursión %d excedió la máxima de %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"El fichero remoto no es más moderno que el fichero local %s -- no se "
+"descargará.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"El fichero remoto es más moderno que el fichero local %s -- descargando.\n"
+"\n"
+
+# CER, 20101031: cambio recuperando por descargando por consistencia con otros. Tiene pinta de ser una copia de otro msg de otra linea.
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Los tamaños no concuerdan (%s local) -- descargando.\n"
+"\n"
+
+# Simplemente me suena mejor `omitir' que `saltar'. Ademàs, las acciones
+# expresadas en gerundio, ..., prefiero una forma impersonal como `se
+# omite' - cll
+#
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "El nombre del enlace simbólico no es válido, se omite.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Ya se tiene el enlace simbólico correcto %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Creando enlace simbólico %s -> %s\n"
+
+# Lo dicho de los gerundios por formas impersonales - cll
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "No se admiten enlaces simbólicos, se omite el enlace simbólico %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Omitiendo el directorio %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tipo de fichero desconocido/no soportado.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "No se pudo obtener cookie para %s\n"
+
+# sigo las indicaciones del texto "pifias" para time-stamp.
+# CER: 20101118: No se a que se refiere, en gugle sólo sale este .po con esa frase.
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: marca-de-tiempo corrupta.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"No se recuperarán directorios puesto que la profundidad es %d (máx %d).\n"
+
+# Los gerundios me parecen poco apropiados para construir predicados
+# normales y corrientes como intentas en este mensaje. En su lugar, te
+# propongo la forma alternativa `se desciende' - cll
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "No se desciende hasta %s por estar excluido/no-incluido.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Rechazando %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Rechazando %s.\n"
+
+# Los gerundios me parecen poco apropiados para construir predicados
+# normales y corrientes como intentas en este mensaje. En su lugar, te
+# propongo la forma alternativa `se desciende' - cll
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "No se desciende hasta %s por estar excluido/no-incluido.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Error ajustando %s a %s: %s\n"
+
+# alguna idea mejor?
+# nota jjrs: En el PO para el grep 2.1 pattern está traducido como
+# patrón por <melero@iprolink.ch> y <sanvila@unex.es>
+# De hecho, `pattern' debiera traducirse como `patrón' y casi siempre os
+# saldrán las traducciones perfectas con este término. A mí, de hecho el
+# mensaje que habeis puesto me parece una traducción excelente - cll#
+# Algo no es *parecido* a un patrón. Algo *cumple* con un patrón. (nl)
+# Bien, pero aceptaré la matización cd C.S. Suarez de 'se ajusta a...' -Salva#
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "No hay nada que se ajuste al patrón %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Se escribió un índice en HTML a %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Se escribió un índice en HTML a %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERROR: No se puede abrir el directorio %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERROR: No se pudo abrir certificado %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Cargado certificado CA '%s'\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERROR: Fallo al abrir fichero de CRL '%s': (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Cargado fichero CRL '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ERROR: GnuTLS requiere que la llave y el certificado sean del mismo tipo.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Su versión de OpenSSL es demasiado antigua para soportar TLSv1.1\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: valor de opción %d de 'secure-protocol' no implementada\n"
+
+# CER, 201011117: Yo traduzco bugs por gazapo, en vez de "bichos" :-)
+# (acepcion 2.2 de <http://lema.rae.es/drae/?val=gazapo>)
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Por favor, reporte éste problema a bug-wget@gnu.org.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: valor de opción %d de 'secure-protocol' no implementada\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERROR"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVISO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s no ha presentado certificado.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: El certificado de %s no es confiable.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: El certificado de %s no tiene un emisor conocido.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: El certificado de %s ha sido revocado.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: El signatario del certificado de %s no es una AC.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: El certificado de %s fue firmado usando un algoritmo inseguro.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: El certificado de %s no está aún activado.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: El certificado de %s ha expirado.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Error inicializando el certificado X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "No se encontró certificado\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Error analizando el certificado: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "El certificado no ha sido aún activado\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Ha expirado el certificado\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "El propietario del certificado no se ajusta al nombre de equipo %s\n"
+
+# CER, 2016-06-28 No se como traducir correctamente "pinned". Ningún idioma lo ha traducido todavía. Es cogido o clavado con un alfiler. Enchavetar. Clavar. Enclavijar.
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "¡La clave pública no encaja con la clave enchavetada!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "El certificado debe ser X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Error en el manejo de la lista de direcciones.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Equipo desconocido"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Fallo temporal en la resolución del nombre"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Error desconocido"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Resolviendo %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "falló: No se encontraron las direcciones Ipv4/IPv6 del equipo.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "falló: temporizó.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: no se pudo resolver el enlace incompleto %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL inválida %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Fallo escribiendo petición HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Sin cabeceras, supondremos HTTP/0.9"
+
+# `no recuperando' no me suena muy español, te propongo la alternativa
+# más "humanizada", `no se recupera' - cll
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"El fichero %s ya está ahí, no se recupera.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "Falló gmtime. Probablemente sea un gazapo.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"No se puede convertir la marca de tiempo a formato http. Retrayendo a tiempo "
+"0 como el momento de la última modificación.\n"
+
+# CER, 20101031: no se si el sentido de missing aquí es perdido o que falta.
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "El fichero de datos BODY %s falta: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Reutilizando la conexión existente a [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Reutilizando la conexión con %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Fallo leyendo la respuesta del proxy: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROR %d: %s.\n"
+
+# Piiiiii: escuchemos a los super-tacañones :)
+#
+# Como no existe el verbo "malformar" en español, el participio
+# `malformado' es incorrecto. El único término parecido a éste que
+# existe en español es `malformación'. - cll
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Línea de estado mal formada"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Falló la tunelización proxy: %s"
+
+# CER: 20101118 ¿Método o esquema?
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Esquema de autentificación desconocido.\n"
+
+# CER: 20101118 ¿Método o esquema?
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autenticación seleccionada: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Grabando a: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Mientras se descargaba la firma:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"No se puede leer la el contenido de la firma desde el fichero temporal. "
+"Omitiendo.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "No se pudo crear fichero temporal. Omitiendo descarga de la firma.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valor pri inválido. Asumiendo %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"No se pudo encontrar resumen aceptable para los recursos Metalink.\n"
+"Ignorándolos.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Desactivando SSL debido a los errores encontrados.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Petición %s enviada, esperando respuesta... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "No se han recibido datos.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Error de lectura (%s) en las cabeceras.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sin descripción)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Localización: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "no especificado"
+
+# Duda: Hmmm, ... ¿`siguiendo' o `siguiente'? - cll
+# siguiendo - Salva
+#
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [siguiendo]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Fichero %s no modificado en el servidor. Omitiendo la descarga.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"El servidor ignoró la cabecera If-Modified-Since para el fichero %s.\n"
+"Podría úd intentar añadir la opción --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" El fichero ya ha sido totalmente recuperado, no hay nada que hacer.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Longitud: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "descartado"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Aviso: no se admiten comodines en HTTP.\n"
+
+# CER, 20101031: ¿Admitimos humor? ?Modo arácnido? ;-)
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Modo arácnido activado. Comprobar si el fichero remoto existe.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "No se puede escribir a %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Recibido el atributo requerido que faltaba de la cabecera.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "La autentificación usuario/contraseña falló.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "No se puede escribir en fichero WARC..\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "No se puede escribir en fichero WARC temporal.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "No se pudo establecer la conexión SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "No se puede des-enlazar %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROR: redirección (%d) sin localización.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"No se pudo encontrar los datos Metalink en la respuesta HTTP. Descargando el "
+"fichero usando HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Se han encontrado cabeceras Metalink. Cambiando a modo Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "No existe el fichero remoto -- ¡¡¡enlace roto!!!\n"
+
+# así se entiende mejor -Salva
+# CER, 20101031: Mejor así: Falta la fecha de -> Falta la cabecera de fecha de ; y apagadas -> desactivadas
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Falta la cabecera de fecha de la última modificación -- marcas de tiempo "
+"desactivadas.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"La cabecera de fecha de última modificación es inválida -- marca de tiempo "
+"descartada.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fichero del servidor no es más moderno que el fichero local %s -- no se "
+"descargará.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Los tamaños no concuerdan (%s local) -- recuperando.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "El fichero remoto es más nuevo, recuperando.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"El fichero remoto existe y podría contener enlaces a otros recursos -- "
+"descargando.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fichero remoto existe pero no contiene ningún enlace -- no se "
+"descargará.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"El fichero remoto existe y podría contener todavía más enlaces,\n"
+"pero la recursión está desactivada -- no se recupera.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"El fichero remoto existe.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escritos a stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s guardado [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Conexión cerrada en el byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Error de lectura en el byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Error de lectura en el byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Calidad de protección no soportada '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritmo no soportado '%s'.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC apunta a %s, el cual no existe.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: No se pudo leer %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Error en %s en la línea %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Error de sintaxis en %s en la línea %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: orden desconocida %s en %s en línea %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Falló el analizado del fichero de sistema wgetrc (env SYSTEM_WGETRC). Por "
+"favor compruebe\n"
+"'%s',\n"
+"o especifique un fichero diferente usando --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Falló el analizado del fichero de sistema wgetrc. Por favor compruebe\n"
+"'%s',\n"
+"o especifique un fichero diferente usando --config.\n"
+
+# CER, 20101031: cambio atención por aviso (warning), por consistencia.
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Aviso: tanto el fichero wgetrc de usuario como el del sistema apuntan a "
+"%s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Inválido --ejecute orden %s\n"
+
+# Te cambio la `o' antes de `off' por `u' - cll
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: booleano inválido %s; use `on' u `off'.\n"
+
+# Te cambio la `o' antes de `off' por `u' - cll
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: el %s es inválido; usa `on', `off' o `quiet'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: número inválido %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s sólo debe usarse una vez\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: valor byte inválido %s.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: periodo de tiempo inválido %s.\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: periodo de tiempo inválido %s.\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: valor %s inválido.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: cabecera %s inválida.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: cabecera WARC inválida %s.\n"
+
+# CER, 20101031: No estoy seguro si estas cadenas debo poner la ultima %s en el centro o al final, porque no se si es una palabra o valor o una frase.
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: tipo de progreso %s inválido.\n"
+
+# CER, 20101031: creo que son tokens, no traducibles.
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: restricción %s inválida,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "La codificación %s no es válida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "La conversión de %s a %s no está soportada\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Secuencia multibyte incompleta o inválida\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "error %d no manejado\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: locale está desactivado\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "falló idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "no se pudo conectar con %s puerto %d:%s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s recibido, redirigiendo la salida a %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; deshabilitando el registro.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Modo de empleo: %s [OPCIÓN]... [URL]...\n"
+
+# Duda: ¿por qué has insertado manualmente un `\n'? ¿es realmente
+# necesario? Probablemente sí, pero yo normalmente traduzco todo en la
+# misma línea, ... - cll
+# Hombre, así debería quedar bastante mejor (además creo que no es la única vez
+# que lo he hecho), espero que no de problemas. - Salva
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Los argumentos obligatorios para las opciones largas son también\n"
+"obligatorios para las opciones cortas.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Inicio:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version muestra la versión de Wget y sale\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help muestra esta ayuda\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background se va a segundo plano después de empezar\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMMAND ejecuta una orden estilo `.wgetrc'\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Ficheros de registro y de entrada:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FICHERO registra mensajes en FICHERO\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FILE anexa mensajes a FILE\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug saca montones de información para "
+"depuración\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug saca salida de depuración Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet silencioso (sin texto de salida)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose sé verboso (es el método por defecto)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose desactiva modo verboso, sin ser "
+"silencioso\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE Ancho de banda de salida como TYPE. \n"
+" TYPE puede ser bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FILE descarga URLs encontradas en fichero "
+"(FILE)\n"
+" local o externo\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --metalink-file descarga URLs encontradas en fichero "
+"(FILE) local\n"
+" o externo de metalinks\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html trata el fichero de entrada como HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL resuelve enlaces HTML del fichero-de-"
+"entrada\n"
+" (-i -F) relativos a la URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FILE Especifica el fichero de configuración a "
+"usar\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config no lee ningún fichero de configuración\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FICHERO Registra las razones para rechazo de URL "
+"en FICHERO\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Descarga:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NÚMERO define número de intentos a NÚMERO\n"
+" (0 es sin limite)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused reintenta incluso si la conexión es "
+"rechazada\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LIST lista separada por comas de etiquetas "
+"HTML a ignorar\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+" -O, --output-document=FILE escribe documentos al fichero FILE\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber omite descargas que lo harían a\n"
+" ficheros existentes "
+"(sobrescribiéndolos)\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-config no lee ningún fichero de configuración\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue continua una descarga parcial de un "
+"fichero\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=OFFSET inicia la descarga desde la posición de\n"
+" base-cero OFFSET\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYPE selecciona tipo de indicador de progreso\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress muestra la barra de progreso en "
+"cualquier\n"
+" modo de verbosidad\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping no re-recupera ficheros a menos que sean\n"
+" más nuevos que la versión local\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since no usa peticiones condicionales if-"
+"modified-since\n"
+" en modo de sellado de tiempo\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps no pone la hora/fecha del fichero local\n"
+" a la que tenga el servidor\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response muestra la respuesta del servidor\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider (araña) no descarga nada\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEGUNDOS pone todos los valores de temporización\n"
+" a SEGUNDOS\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADDRESSES lista de servidores DNS a los que "
+"preguntar\n"
+" (separados por comas)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=DIRECCN enlazar resolvedor DNS resolver a DIRECCN "
+"(nombredeequipo o IP) en equipo local\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEGS define la temporización de la búsqueda\n"
+" DNS a SEGS\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEGS define la temporización de conexión a "
+"SEGS\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEGS define la temporización de lectura a "
+"SEGS\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SEGUNDOS espera tantos SEGUNDOS entre reintentos\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEGUNDOS espera 1..SEGUNDOS entre reintentos\n"
+" de una descarga\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait espera entre 0.5*WAIT...1.5*WAIT segs.\n"
+" entre descargas\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy explícitamente desconecta el proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NÚMERO define la cuota de descarga a NÚMERO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=DIRECCIÓN bind a DIRECCIÓN (nombredeequipo o IP) en "
+"equipo local\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=VELOCIDAD limita velocidad de descarga a VELOCIDAD\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache desactiva búsquedas en tampón DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS restringe caracteres en nombres de "
+"ficheros\n"
+" a los que el SO permita\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignora mayús/minúsculas al encajar "
+"ficheros/directorios\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only conecta sólo a direcciones IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only conecta sólo a direcciones IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILY conecta primero a direcciones de la "
+"familia\n"
+" especificada, bien IPv6, IPv4, o "
+"ninguna\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=USUARIO pone el usuario de ambos ftp y http a "
+"USUARIO\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=CONTRASEÑA pone la contraseña de ambos ftp y http a "
+"CONTRASEÑA\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password pide las contraseñas\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri desactiva soporte IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC usa codificación ENC como la "
+"codificación\n"
+" local para IRIs\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC usa ENC como la codificación remota por "
+"defecto\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink borra fichero antes de machacar\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http usa metadatos Metalink de las cabeceras "
+"de la respuesta HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location localización preferida para los recursos "
+"Metalink\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --warc-cdx escribe ficheros indice CDX\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Directorios:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories no crea directorios\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories fuerza la creación de directorios\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories no crea directorios del anfitrión\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories usa nombre de protocolo en los "
+"directorios\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIJO graba los ficheros en PREFIJO/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NÚMERO ignora NÚMERO de componentes de\n"
+" directorio remoto\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opciones HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USUARIO pone el usuario http a USUARIO\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=PASS pone la contraseña http a PASS\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache no permite los datos en tampón del "
+"servidor\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME Cambia el nombre de página por defecto\n"
+" (suele ser `index.html'.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension graba documentos HTML/CSS con las "
+"extensiones correctas\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignora campo `Content-Length' en "
+"cabeceras\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=STRING inserta STRING entre las cabeceras\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect máximo de redirecciones permitidas por "
+"página\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=USUARIO pone USUARIO como nombre de usuario del "
+"proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PASS pone PASS como contraseña del proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL incluye cabecera `Referer: URL' en "
+"petición HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers graba las cabeceras HTTP a fichero\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTE se identifica como AGENTE en vez de Wget/"
+"VERSIÓN\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive desactiva HTTP keep-alive (conexiones "
+"persistentes)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies no usa \"cookies\"\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FICHERO carga las \"cookies\" desde FICHERO antes "
+"de la sesión\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FICHERO graba las \"cookies\" a FICHERO después "
+"de la sesión\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies carga y graba las \"cookies\" de sesión "
+"(no-permanentes)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRING usa el método POST; envía STRING como los "
+"datos\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FICHERO usa el método POST; envía el contenido de "
+"FICHERO\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod usa método \"HTTPMethod\" en la cabecera\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRING Envía STRING como datos. Debe usarse --"
+"method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FICHERO Envía el contenido de FICHERO. Debe "
+"usarse --method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition cumple con la cabecera Content-"
+"Disposition\n"
+" cuando se elige nombre de ficheros "
+"locales (EXPERIMENTAL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error imprime el contenido recibido si hay "
+"errores del servidor\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge envía información de autenticicación "
+"básica HTTP\n"
+" sin antes esperar al desafío del "
+"servidor\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opciones HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR elige protocolo seguro entre auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1 y PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only sigue sólo enlaces HTTPS seguros\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate no valida el certificado del servidor\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=FILE fichero de certificado del cliente\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE tipo de certificado de cliente, PEM o "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FILE fichero de llave privada\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TYPE tipo de llave privada, PEM o DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FILE fichero con la agrupación de CAs\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR directorio donde se guarda la lista \"hash"
+"\" de CAs\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FICHERO fichero con la agrupación de CRLs\n"
+
+#: src/main.c:868
+#, fuzzy
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASHES Fichero de clave pública (PEM/DER), o "
+"cualquier\n"
+" número de \"hashes\" sha256 codificados "
+"como\n"
+" base64 precedidos por 'sha256//' y "
+"separados\n"
+" por ';', para verificar contra el par\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FILE fichero con datos aleatorios como semilla "
+"de SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FICHERO fichero que denomina el conector EGD con "
+"datos aleatorios\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opciones HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+" --no-cache no permite los datos en tampón del "
+"servidor.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file camino de la base de tados HSTS "
+"(invalidará las opciones por omisión)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opciones FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Usa formato Stream_LF para todos los "
+"ficheros binarios FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=USUARIO pone USUARIO como el usuario de ftp\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASS pone PASS como contraseña ftp\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing no elimina los ficheros `.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob desactiva generación de nombres de\n"
+" fichero del FTP (globbing)\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp desactiva el modo \"pasivo\" de "
+"transferencia\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions preserva permisos de ficheros remotos\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks en modo recursivo, descarga los ficheros\n"
+" enlazados (no los directorios)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opciones FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit use FTPS implícito (el puerto por "
+"omisión es el990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl reanuda la sesión SSL/TLS iniciada en "
+"la\n"
+" conexión de control al abrir una "
+"conexión de datos\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection cifra sólo el canal de control; todos "
+"los datos irán en texto claro\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp retrae a FTP si FTPS no es soportado "
+"por el servidor objetivo\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opciones WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILENAME guarda datos de la petición/respuesta en "
+"un fichero .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=STRING inserta STRING en registro warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMBER define tamaño máximo de ficheros WARC a "
+"NUMBER\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx escribe ficheros indice CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FILENAME no guarda registros que estén listados "
+"en\n"
+" este fichero CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression no comprime ficheros WARC con GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests no calcula resúmenes SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log no guarda el fichero de registro en un "
+"campo WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTORY localización para ficheros temporales\n"
+" creada por el grabador de WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Descarga recursiva:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive especifica descarga recursiva\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMBER máxima profundidad de recursión (inf o 0 "
+"para infinita)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after borra los ficheros localmente después de "
+"descargarlos\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links hace que los enlaces en el HTML o CSS\n"
+" descargado apunte a ficheros locales\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only convertir sólo la parte del fichero de "
+"las URLs (normalmente conocido como el basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N antes de escribir el fichero X, rota "
+"hasta un\n"
+" máximo de N ficheros de respaldo\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted antes de convertir el fichero X, "
+"salvaguardarlo\n"
+" como X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted antes de convertir el fichero X, "
+"salvaguardarlo\n"
+" como X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror atajo para -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites descarga todas las imágenes, etc. que se\n"
+" necesitan para mostrar la página HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments activa manejo estricto (SGML) de los "
+"comentarios en HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Acepta/rechaza recursivamente:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LIST lista separada por comas de extensiones "
+"aceptadas\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LIST lista separada por comas de extensiones "
+"rechazadas\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX regex que encaja en las URLS aceptadas\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX regex que encaja las URLs rechazadas\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TYPE tipo de regex (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYPE tipo de regex (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIST lista separada por comas de dominios "
+"aceptados\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIST lista separada por comas de dominios "
+"rechazados\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp sigue los enlaces a FTP de los documentos "
+"HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LIST lista separada por comas de etiquetas "
+"HTML a seguir\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST lista separada por comas de etiquetas "
+"HTML a ignorar\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts va a equipos extraños en el recorrido "
+"recursivo\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative sólo sigue enlaces relativos\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LIST lista de directorios permitidos\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names use el nombre especificado por la "
+"redirección \n"
+" del último componente de la url\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LIST lista de directorios excluidos\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent no asciende al directorio padre\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, un recuperador por red no interactivo.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Contraseña para el usuario %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Contraseña: "
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "no se puede crear tubería"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Contraseña para el usuario %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compila: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Enlaza: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s hecho en %s.\n"
+"\n"
+
+# CER: No estoy seguro si debo poner "entrno" y no "entorno" porque parece que quieren abreviaturas (usan env y no environment)
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (entorno)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (usuario)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (©) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licencia GPLv3+: GPL de GNU versión 3 o posterior\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Esto es software libre: es usted libre de cambiarlo y redistribuirlo.\n"
+"NO hay GARANTÃA, hasta donde permita la ley.\n"
+
+# CER, 201011117: No veo tal cosa, ni existe en_US.po
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Escrito originalmente por Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+# CER, 201011117: Yo traduzco bugs por gazapo, en vez de "bichos" :-)
+# (acepcion 2.2 de <http://lema.rae.es/drae/?val=gazapo>)
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Envíe informes de gazapos y preguntas a <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problema de ubicación de memoria\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Saliendo debido a error en %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Pruebe `%s --help' para ver más opciones.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: opción ilegal -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"El soporte de compilación no ha sido compilado. Ignorando la bandera --"
+"debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Ambos --no-clobber y --convert-links fueron especificados, sólo se usará --"
+"convert-links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Ambos --no-clobber y --convert-file-only fueron especificados, sólo se usará "
+"--convert-file-only.\n"
+
+# Como otras veces, te propongo que sustituyas `sacar' por `ofrecer' -
+# cll
+#
+# CER, 201011117: Era: No se puede ser verboso ofrecer información y estar silencioso al mismo tiempo.
+# CER, 201011117: cambio: No se puede ser verboso y silencioso al mismo tiempo
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "No se puede ser verboso y silencioso al mismo tiempo.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"No se pueden usar marcas de tiempo y no sobreescribir ficheros viejos al "
+"mismo tiempo.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+"No se puede especificar al mismo tiempo ambos --inet4-only e --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"No se puede especificar ambos -k o --convert-file-only y -O si se dan URLs "
+"múltiples o\n"
+"en combinación con -p o -r. Vea el manual para los detalles.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVISO: combinando -O con -r o -p significará que todo el contenido "
+"descargado\n"
+"se situará en el único fichero que ha especificado.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVISO: las marcas de tiempo no hacen nada en combinación con -O. Vea el "
+"manual\n"
+"para los detalles.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"La salida WARC no funciona con --no-clobber, --no-clobber será desactivada.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"La salida WARC no funciona con marcas de tiempo, las marcas de tiempo serán "
+"desactivadas.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "La salida WARC no funciona con --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"La salida WARC no funciona con --continue, --continue será desactivado.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Los resúmenes están desactivados; deduplicación WARC no encontrará\n"
+"registros duplicados.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"La salida WARC no funciona con --continue, --continue será desactivado.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "No se puede especificar ambos --ask-password y --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"No se recomienda especificar al mismo tiempo --start-pos y --continue; --"
+"continue será desactivada.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: falta la URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "No se puede especificar ambos --post-data and --post-file.\n"
+
+#: src/main.c:1841
+#, fuzzy, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"No puede usar --post-data o --post-file al mismo tiempo que --method. --"
+"method espera datos a través de las opciones --body-data y --body-file"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Debe especificar un método a través de --method=HTTPMethod para usarse con --"
+"body-data o --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+"No se puede especificar al mismo tiempo ambos --body-data y --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Esta versión no tiene soporte para IRIs\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k o -r puede ser usado junto con -O sólo si la salida va a un fichero "
+"regular.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links o --convert-file-only pueden ser usados juntos sólo si la "
+"salida va a un fichero regular.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "No se pudo inicializar libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "No se pudo inicializar el canal c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "No se pudo analizar dirección IP '%s'\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "No se pudo poner el(los) servidor(es) DNS '%s' (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "No se han encontrado URLs en %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "No se pudo analizar el fichero metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "No se pudo descargar todos los recursos desde %s\n"
+
+# `Bajados' es una traducción demasiado literal. Como en uno de los
+# mensajes de ayuda que hay más arriba, y para ser coherente, con lo que
+# allí te sugiero, te propongo ahora también `descargados' - cll
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ACABADO --%s--\n"
+"Tiempo total de reloj: %s\n"
+"Descargados: %d ficheros, %s en %s (%s)\n"
+
+# ¡Efectivamente! Ahora lo has puesto tu, ... `download'=`descarga' -
+# cll
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "¡Cuota de descarga de %s EXCEDIDA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O no es soportado para descarga de metalinks. Ignorándolo.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "No se pudo analizar el fichero metalink %s.\n"
+
+#: src/metalink.c:179
+#, fuzzy, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "No se pudo analizar el fichero metalink %s.\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, fuzzy, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "No se pudo descargar %s. Omitiendo el recurso.\n"
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "No se pudo analizar el fichero metalink %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tipo de recurso %s no soportado, ignorando...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "No se pudo abrir el fichero descargado.\n"
+
+#: src/metalink.c:514
+#, fuzzy, c-format
+msgid "Computing size for %s\n"
+msgstr "Calculando checksum para %s\n"
+
+#: src/metalink.c:519
+#, fuzzy
+msgid "File size not declared. Skipping check.\n"
+msgstr "No se pudo descargar %s. Omitiendo el recurso.\n"
+
+#: src/metalink.c:527
+#, fuzzy
+msgid "Could not get downloaded file's size.\n"
+msgstr "No se pudo abrir el fichero descargado.\n"
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "El checksum para el fichero %s no encaja.\n"
+
+#: src/metalink.c:547
+#, fuzzy
+msgid "Size matches.\n"
+msgstr "El checksum encaja.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Calculando checksum para %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "El checksum encaja.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "El checksum para el fichero %s no encaja.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "No se pudo abrir el fichero descargado para verificación de firma.\n"
+
+# CER 20151017: creo que son tokens; intraducible.
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+# CER 20151017: creo que son tokens; intraducible.
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+# CER 20151017: creo que son tokens; intraducible.
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+#, fuzzy
+msgid "Signature validation succeeded.\n"
+msgstr "La validación de firma tuvo éxito.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Firma inválida. Rechazando el recurso.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Los datos encajan con la firma, pero la firma no es fiable.\n"
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "No se encontró certificado\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "No se pudo descargar %s. Omitiendo el recurso.\n"
+
+#: src/metalink.c:878
+#, fuzzy, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Se descargó el fichero %s pero el checksum no encaja. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Se descargó el fichero %s pero la firma no encaja. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Se descargó el fichero %s pero el checksum no encaja. \n"
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Eliminando %s.\n"
+
+# Lo mismo que antes, ... `background' es `segundo plano' - cll
+#
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Continuando en segundo plano.\n"
+
+# Lo mismo que antes, ... `background' es `segundo plano' - cll
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Continuando en segundo plano, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "La salida será escrita a %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() falló\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() falló\n"
+
+# he imitado a Iñaki Gonzalez en el error.es.po, donde no traduce socket.
+# Si, este es uno de esos casos que se dan por imposibles ya, ... Todo
+# el mundo utilizamos `socket' "asinque" nada, ... - cll#
+# CER, 201011117: Yo estaba traduciendo socket por conector.
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: No se ha podido encontrar un controlador de conector utilizable\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() falló. El conector no pudo ponerse como bloqueante..\n"
+
+# Simplemente, te cambio un par de palabras de sitio, a ver si así te
+# gusta más, ... - cll
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: aviso: el símbolo %s aparece antes del nombre de cualquier nombre "
+"de equipo\n"
+
+# la traducción de token es de diccionario, pero me parece correcta.
+# nota jjrs: Aquí se usa en el contexto de un analizador léxico (parser)
+#
+# Asi es, jjrs tiene razón, ... por eso, `token' es habitualmente
+# traducido en informática como `símbolo'. La traducción, por lo tanto,
+# es correcta - cll
+#
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: símbolo desconocido \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Modo de empleo: %s NETRC [NOMBREDEMÃQUINA]\n"
+
+# no tengo ni idea de a que se refiere stat en este caso :-/
+# nota jjrs: stat es una función de C que obtiene datos de un archivo
+# y en esta parte solamente lo usa para checar si existe el archivo
+# pero el wget no utiliza esta función.
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: no se pudo ejecutar “stat†sobre %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVISO: usando una semilla aleatoria débil.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "No se pudo sembrar el PRNG; considere usar --random-file.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Su versión de OpenSSL es demasiado antigua para soportar TLSv1.1\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Su versión de OpenSSL es demasiado antigua para soportar TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Su versión de OpenSSL es demasiado antigua para soportar TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: valor de opción %d de 'secure-protocol' no implementada\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL inválida %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "No se pudo sembrar el PRNG; considere usar --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: no se puede verificar el certificado de %s, emitido por %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Imposible verificar localmente la autoridad emisora.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Certificado auto-firmado encontrado.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " El certificado emitido no es aún válido.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " El certificado emitido ha expirado.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: ningún nombre de sujeto alternativo del certificado encaja con\n"
+"\tel nombre de equipo %s solicitado.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: el nombre común %s del certificado no encaja con el nombre de equipo "
+"%s solicitado.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: el nombre común del certificado es inválido (contiene un carácter "
+"NUL).\n"
+" Ésto puede ser una indicación de que el equipo no es quien dice ser\n"
+" (o sea, que no es el verdadero %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Para conectar inseguramente a %s, use `--no-check-certificate'.\n"
+
+# Como en otros mensajes anteriores te recomiendo que emplees el término
+# `omitir' en vez de `saltar' para `skip' - clldigits in the skipped amount in K.
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ omitiendo %sK ] "
+
+# CER, 201011117: explicación de lo que es "dot" en el código fuente.
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Especificación de estilo de punto inválida %s; se deja sin modificar.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " en "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "No se puede obtener frecuencia de reloj REALTIME: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Eliminando %s puesto que debería ser rechazado.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "No se puede abrir %s: %s "
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Cargando robots.txt; por favor ignore los errores.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Error analizando la URL del proxy %s: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Error en la URL del proxy %s: Debe ser HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Sobrepasadas las %d redirecciones.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Abandonando.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Reintentando.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"No se encontraron enlaces rotos.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Encontrado %d enlace roto\n"
+"\n"
+msgstr[1] ""
+"Encontrados %d enlaces rotos.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "No hay error"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Esquema %s no soportado"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Falta esquema"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nombre de equipo inválido"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Mal número de puerto"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nombre de usuario inválido"
+
+# CER 20101118 - pone unterminated, y el token del código fuente igual. Debe ser correcto.
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Dirección numérica IPv6 sin terminar"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Direcciones IPv6 no soportadas"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Dirección numérica IPv6 inválida"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "El soporte HTTPS no ha sido compilado"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Secuencia multibyte incompleta o inválida\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Fallo al adjudicar suficiente memoria; memoria agotada.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Fallo al adjudicar %ld bytes; memoria agotada.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: tampón de texto es demasiado grande (%d bytes), abortando.\n"
+
+# Lo mismo que antes, ... `background' es `segundo plano' - cll
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Continuando en segundo plano, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Fallo al desligar el enlace simbólico %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "No se pudo inicializar libcares\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "No se pudo obtener cookie para %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "No se pudo analizar dirección IP '%s'\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "No se pudo poner el(los) servidor(es) DNS '%s' (%d)\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expresión regular inválida %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expresión regular inválida %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Error mientras encajando %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Error al abrir fichero WARC %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Error al abrir fichero WARC %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Error al abrir fichero WARC %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Error al abrir flujo GZIP a fichero WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Error al escribir registro warcinfo a fichero WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Abriendo fichero WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Error al abrir fichero WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Fichero CDX no lista las urls originales. (Falta la columna 'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Fichero CDX no lista los checksums. (Falta la columna 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Fichero CDX no lista los ids de registro. (Falta la columna 'u'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Cargado registro %d desde CDX.\n"
+"\n"
+msgstr[1] ""
+"Cargados registros %d desde CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "No se pudo leer fichero CDX %s para deduplicación.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "No se pudo abrir el fichero WARC temporal de manifiesto.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "No se pudo abrir el fichero WARC temporal de registro.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "No se pudo abrir el fichero WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "No se pudo abrir el fichero CDX para salida.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "No se pudo abrir el fichero WARC temporal.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Dato exacto encontrado en el fichero CDX. Grabando registro de revisitas a "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Error de sistema desconocido"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Familia de direcciones para nombredemaquina no soportada"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Valor incorrecto para ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Fallo no recuperable en la resolución de nombres"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family no soportado"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Problema de ubicación de memoria"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "No hay dirección asociada con el nombre de máquina"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nombre o servicio desconocido"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname no soportado para ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype no soportado"
+
+#~ msgid "System error"
+#~ msgstr "Error de sistema"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Tampón de argumentos demasiado pequeño"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Procesado de petición en progreso"
+
+#~ msgid "Request canceled"
+#~ msgstr "Petición cancelada"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Petición no cancelada"
+
+#~ msgid "All requests done"
+#~ msgstr "Todas las peticiones hechas"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrumpido por una señal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Cadena de parámetros no codificada correctamente"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: la opción '%s' es ambigua; posibilidades:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: la opción '%s' es ambigua\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: la opción '--%s' no admite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: la opción '%c%s' no admite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: la opción '--%s' requiere un argumento\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: no se reconoce la opción '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: no se reconoce la opción '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opción inválida -- '%c'\n"
+
+# nota jjrs: argumento o parametro?
+# mmm... argumento? ;-P -Salva
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: la opción requiere un argumento -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: la opción '-W %s' es ambigua\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: la opción '-W %s' no admite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: la opción '-W %s' requiere un argumento\n"
+
+#
+# CER, 20101031: según la wikipedia, el primario es «?» y el secundario ???.
+# He dejado las segundas,, me parecieron más frecuentes.
+# CER, 20101118: Al cambiar de ISO a UTF-8 me ha cambiado las comillas por interrogantes, tanto en el comentario como en la traducción. Ya no recuerdo lo que decidí. Usaré las alternativas, primario.
+# Standard 1 «…» 2 “…†Alternativo 1 “…†2‘…’
+#~ msgid "`"
+#~ msgstr "“"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "Éxito"
+
+#~ msgid "No match"
+#~ msgstr "No hay resultados"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expresión regular inválida"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Carácter de intercalación inválido"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nombre de clase de carácter inválido"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Barra diagonal inversa al final"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Referencia hacia atrás inválida"
+
+#~ msgid "Unmatched [ or [^"
+#~ msgstr "[ o [^ desparejado"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( or \\( desparejado"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ desparejado"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Contenido inválido de \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Fin de rango inválido"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memoria agotada"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Expresión regular previa inválida"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Final prematuro de expression regular"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expresión regular demasiado grande"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") or \\) desparejado"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "No hay expresión regular previa"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "falló el subproceso %s"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "falló _open_osfhandle"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "no se puede restaurar fd %d: dup2 falló"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "subproceso %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "subproceso %s obtuvo señal fatal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "memoria agotada"
+
+#, c-format
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Secuencia UTF-8 inválida %s\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "falló idn_decode (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s recibido.\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Envíe información sobre gazapos y sugerencias a <bug-wget@gnu.org>\n"
+
+# `no recuperando' no me suena muy español, te propongo la alternativa
+# más "humanizada", `no se recupera' - cll
+# CER, 201011117: Me parece más apropiado "descargar", ¿no?
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "El fichero `%s' ya está ahí; no se descarga.\n"
+
+# En vez de `falló la autorización' me parece más apropiado
+# `Autorización denegada' - cll
+#
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorización denegada.\n"
+
+# CER ----------- revisando por aqui -------------------------
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "AVISO: No se puede reabrir la salida estándard en modo binario;\n"
+#~ " el fichero descargado puede contener finales de linea "
+#~ "inapropiados.\n"
+
+#~| msgid ""
+#~| " --trust-server-names use the name specified by the "
+#~| "redirection\n"
+#~| " url last component.\n"
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries especificar el número de reintentos para "
+#~ "un fichero.\n"
+#~ " (necesita ser usado con --metalink-"
+#~ "file)\n"
+
+#~| msgid " --spider don't download anything.\n"
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr ""
+#~ " --jobs especificar cuantos hilos a usar.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Información de usuario y contraseña no necesitan ser "
+#~ "especificadas cuando se descargan de un metalink.\n"
+
+#~| msgid "%s: Cannot resolve incomplete link %s.\n"
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s no puede usarse con --metalink.\n"
diff --git a/po/et.gmo b/po/et.gmo
new file mode 100644
index 0000000..b7b5ab6
--- /dev/null
+++ b/po/et.gmo
Binary files differ
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..1322a3c
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,3498 @@
+# This file is distributed under the same license as the wget package.
+# Estonian translations for GNU wget.
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# Toomas Soome <tsoome@me.com>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-07 19:56+0300\n"
+"Last-Translator: Toomas Soome <tsoome@me.com>\n"
+"Language-Team: Estonian <linux-ee@lists.eenet.ee>\n"
+"Language: et\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: bind aadressi %s ei õnnestu lahendada; blokeerin bindi.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Loon ühendust serveriga %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Loon ühendust serveriga %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Loon ühendust serveriga [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF ebaõnnestus: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "ühendus loodud.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "ebaõnnestus: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: hosti aadressi %s ei õnnestu lahendada\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR ebaõnnestus: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Liiga palju avatud faile. select ei saa kasutada kui fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Viited teisendatud %d failis %s sekundiga.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Teisendan %s viiteid... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "midagi ei ole teha.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ei suuda teisendada linke %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ei õnnestu kustutada %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ei suuda luua %s varukoopiat %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "%s küpsist ei õnnestu saada\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Set-Cookie süntaksi viga: %s kohal %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Präänik serverist %s üritas seada doomeniks "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Präänikute faili %s ei saa avada: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Ei saa kirjutada faili %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Viga %s sulgemisel: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Mittetoetatud listingu tüüp, proovin Unix listingu parserit.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s indeks serveris %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "tundmatu aeg "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fail "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Kataloog "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Viide "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Pole kindel "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s baiti)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Pikkus: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) veel"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s veel"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (autoriseerimata)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL seadistamine ei õnnestunud, SSL on blokeeritud.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Meldin serverisse kasutajana %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Vigane serveri vastus, sulgen juhtühenduse.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Vigane serveri tervitus.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Kirjutamine ebaõnnestus, sulgen juhtühenduse.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Server ei luba meldida.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Vigane meldimine.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Melditud!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Server ei aktsepteeri 'PBSZ 0' käsku.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Server ei aktsepteeri 'PROT %c' käsku.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Viga serveris, ei suuda tuvastada süsteemi tüüpi.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "tehtud. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "tehtud.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tundmatu tüüp `%c', sulgen juhtühenduse.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "tehtud. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD pole vajalik.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Loogiliselt võimatu sektsioon getftp() funktsioonis"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Kataloogi %s pole.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ei ole kohustuslik.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fail on juba olemas, ei tõmba.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ei saa algatada PASV ülekannet.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ei suuda analüüsida PASV vastust.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "ei õnnestu luua ühendust serveriga %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind operatsiooni viga (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Vale PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST ebaõnnestus, alustan algusest.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Fail %s on olemas.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Faili %s pole.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Faili %s pole.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Faili või kataloogi %s pole.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s ilmus.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, sulgen juhtühenduse.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - andme ühendus: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Juhtühendus suletud.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Andmete ülekanne katkestatud.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Fail %s on juba olemas, ei tõmba.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(katse:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - kirjutatud standardväljundissse %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvestatud [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Kustutan %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Kasutan %s ajutise listingu failina.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Kustutatud %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Rekursiooni sügavus %d ületab maksimum sügavust %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Kauge fail ei ole uuem, kui lokaalne fail %s -- ei lae.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Kauge fail on uuem kui lokaalne fail %s -- laen uuesti.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Suurused ei klapi (lokaalne %s) -- laen uuesti.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Vigane nimeviide, jätan vahele.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Korrektne nimeviide on juba olemas %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Loon nimeviite %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Ei toeta nimeviiteid, jätan nimeviite %s vahele.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Jätan kataloogi %s vahele.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tundmatu faili tüüp.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "%s õiguseid ei õnnestu seada.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: vigane ajatempel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Ei tõmba katalooge, kuna sügavus on %d (maks. %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Jätame %s vahele, ta on välistatud või pole kaasatud.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Keelame %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Keelame %s (Vigane kirje).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s on välistatud või pole kaasatud tänu regulaaravaldisele.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Viga %s otsimisel %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Jokker %s ei anna midagi.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Kirjutasin HTML-iseeritud indeksi faili %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Kirjutasin HTML-iseeritud indeksi faili %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "VIGA: Kataloogi %s ei saa avada.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "VIGA: Ei õnnestu avada sertifikaati %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Laetud CA sertifikaat '%s'\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "VIGA: Ei õnnestu laadida CRL faili '%s': (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Laetud CRL fail '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "VIGA: GnuTLS nõuab et võti ja sertifikaat oleks sama tüüpi.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Teie OpenSSL versioon on TLS 1.3 jaoks liiga vana\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: realiseerimata 'secure-protocol' parameetri väärtus %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Palun saatke see viga aadressile bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: realiseerimata 'secure-protocol' parameetri väärtus %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr "GnuTLS: prio seadmine ebaõnnestus. Kasutan vaikimisi prioriteeti.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "VIGA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "HOIATUS"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s ei esitanud sertifikaati.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Sertifikaat %s ei ole usaldatav.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: %s sertifikaat ei oma tuntud väljastajat.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Sertifikaat %s on kuulutatud kehtetuks.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Sertifikaadi %s allkirjastaja ei ole CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: %s sertifikaat on allkirjastatud ebaturvalise algoritmiga.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: %s sertifikaat ei ole veel aktiivne.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: %s sertifikaat on aegunud.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Viga X509 sertifikaadi initsialiseerimisel: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Sertifikaati pole.\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Viga sertifikaadi parsimisel: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Sertifikaat pole veel kehtiv\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Sertifikaat on aegunud\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Sertifikaadi omanik ja hosti nimi %s on erinevad\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Avalik võti pole sama kui kinnitatud avalik võti!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Sertifikaat peab olema X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Viga aadresside loendi käsitlemisel.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Tundmatu host"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Nime lahendamisel tekkis ajutine viga"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Tundmatu viga"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Lahendan %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "ebaõnnestus: Masinal pole IPv4/IPv6 aadresse.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "ebaõnnestus: aegus.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ei õnnestu lahendada poolikut viidet %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"%s sisaldab mitte-järgimise atribuuti. Sellel lehel ei järgita ühtegi "
+"viidet.\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Vigane URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "HTTP päringu kirjutamine ebaõnnestus: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Päiseid pole, eeldan HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Fail %s on juba olemas, ei tõmba.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime ebaõnnestus. See on tõenäoliselt viga.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ajatemplit ei õnnestu http vormingusse teisendada. Kasutan viimase muutmise "
+"ajana 0.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY andmete failis %s puudub: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Kasutan ühendust serveriga [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Kasutan ühendust serveriga %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Proksi vastuse lugemine ebaõnnestus: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s VIGA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Katkine staatuse rida"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Proksi tunneldamine ebaõnnestus: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Tundmatu autentimis skeem.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Valitud autentimine: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Salvestan: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Laadides allkirja:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Allkirja ei õnnestu ajutisest failist lugeda. Jätan vahele.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Ajutise faili loomine ebaõnnestus. Ei lae allkirja.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Vigane pri väärtus. Eeldan %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr "Ei leia sobivat Metalink ressursside räsi. Ignoreerin neid.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Kuna tekkis vigu, siis blokeerin SSLi.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s päring saadetud, ootan vastust... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Andmeid ei saanudki.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Päiste lugemise viga (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(kirjeldus puudub)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Asukoht: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "määramata"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [järgnev]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Fail %s ei ole serveril muutunud. Ei lae.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Server ignoreerib If-Modified-Since päist failil %s.\n"
+"Võib olla mõistlik kasutada võtit --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Fail on juba täielikult kohal; rohkem ei saa midagi teha.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Pikkus: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignoreerin"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Hoiatus: HTTP ei toeta jokkereid.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"Ämbliku režiim on sisse lülitatud. Kontrollige et mittelokaalne fail on "
+"olemas.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ei saa kirjutada faili %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Laekunud päises puudub nõutud atribuut.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Kasutajanimi/Parool autentimine ebaõnnestus.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ei saa kirjutada WARC faili.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ei saa kirjutada ajutisse WARC faili.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "SSL ühenduse loomine ei õnnestu.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ei saa kustutada %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "VIGA: Ãœmbersuunamine (%d) ilma asukohata.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Ei leia HTTP vastuses Metalink andmeid. Laen faili kasutades HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Leidsin metalink päised. Lülitan metalink moodi.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Mittelokaalset faili pole -- katkine viide!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Last-modified päist pole -- ei kasuta ajatempleid.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Last-modified päis on vigane -- ignoreerin ajatemplit.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fail serveril ei ole uuem lokaalsest failist %s -- ei lae.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Suurused ei klapi (lokaalne %s) -- laen uuesti.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Kauge fail on uuem, laen alla.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Kauge fail on olemas ja võib sisldada viiteid muudele ressurssidele -- "
+"laen.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr "Kauge fail on olemas, aga ei sisalda viiteid -- ei lae.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Mittelokaalne fail on olemas ja võib sisaldada järgnevaid viiteid,\n"
+"aga rekursioon pole lubatud -- ei lae.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Kauge fail on olemas.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvestatud [%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvestatud [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Ãœhendus suletud baidil %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Lugemise viga baidil %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Lugemise viga baidil %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Mittetoetatud kaitse kvaliteet '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Mittetoetatud algoritm '%s'.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC viitab failile %s, mille kasutamisel on viga: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: %s ei saa lugeda (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Viga %s's real %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Süntaksi viga %s's real %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Tundmatu käsklus %s, failis %s real %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Süsteemse wgetrc faili (env SYSTEM_WGETRC) parsimine ebaõnnestus. Palun\n"
+"kontrollige '%s', või määrake võtmega --config teine fail.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Süsteemse wgetrc faili parsimine ebaõnnestus. Palun\\n\"\n"
+"\"kontrollige '%s', või määrake võtmega --config teine fail.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Hoiatus: Nii süsteemne kui kasutaja wgetrc viitab %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Vigane --execute käsklus %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Vigane tõeväärtus %s; kasutage `on' või `off'.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Vigane %s; kasutage `on', `off' või `quiet'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s %s: Vigane number %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s tohib kasutada ainult korra\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Vigane baidi väärtus %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Vigane aja periood %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Negatiivne aja periood %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass nõuab sõne või keskkonnamuutujat WGET_ASKPASS või SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Vigane väärtus %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Vigane päis %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Vigane WARC päis %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Vigane edenemise tüüp %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Vigane piirang %s,\n"
+" kasutage [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodeering %s ei ole lubatud\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Teisendamist %s -> %s ei toetata\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Leiti mittetäielik või vigane mitmebaidi järjestus\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Käsitlemata errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: lokaat ei ole määratud\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode ebaõnnestus (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Väiketähtedeks teisendamine ebaõnnestus: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Suunan väljundi faili %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; blokeerin logimise.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Kasuta: %s [VÕTI]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Kohustuslikud argumendid pikkadele võtmetele on kohustuslikud ka "
+"lühikestele.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Start:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version näita Wget versioon ja lõpeta töö\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help näita abiinfot\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background tööta taustal\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=KÄSKLUS täida `.wgetrc'-stiilis käsklus\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Logimine ja sisendfail:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FAIL logi teated faili FAIL\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FAIL lisa teated faili FAIL\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug väljasta silumise teated\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug väljasta Watt-32 silumise teated\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tööta vaikselt\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose lobise (see on vaikimisi)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --non-verbose keela lobisemine, luba asjalikud teated\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TÜÜP läbilaske väljundi tüüp. TÜÜP võib olla "
+"bitid\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FAIL loe URLid [mitte]lokaalsest failist FAIL\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FAIL lae lokaalses Metalink failis näidatud "
+"failid\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html käsitle sisendfaili HTMLina\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL lahendab URL suhtelised HTML sisend-"
+"faili\n"
+" viited (-i -F)\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FAIL määra seadistuste fail\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config ära kasuta seadete faile\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " --rejected-log=FAIL URLide blokeerimise teadete logi\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Allalaadimine:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMBER katsete arvuks NUMBER (0 piiramata)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused korda isegi kui ühendusest keeldutakse\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=VEAD komaga-eraldatud loend HTTP vigadest "
+"mille korral korrata\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=FAIL kirjuta dokumendid faili FAIL\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber ära lae faile, miks kirjutaks "
+"olemasolevad\n"
+" failid üle\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-netrc ära loe krediite failist .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue jätka olemasoleva faili allalaadimist\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=INDEKS alsuta alla laadimist antud indeksilt\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TÜÜP vali progressi indikaatori tüüp\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=TÜÜP vali progressi indikaatori tüüp\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ära tõmba vanemaid faile kui lokaalsed\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ära kasuta tingimust if-modified-since,\n"
+" kasuta päringutel ajatembeldamist\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ära sea lokaalsele failile serveris\n"
+" oleva faili aega\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response trüki serveri vastused\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ara tõmba midagi\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=SEK kõik taimoutid on SEKUNDEID\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr " --dns-servers=AADRESSID komadega eraldatud DNS serverid\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr " --bind-dns-address=AADRESS kasuta kohaliku masina nime või IP\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr " --dns-timeout=SEK nime lahenduse aegumine on SEK\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=SEK ühenduse loomise aegumine on SEK\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SEK lugemise aegumine on SEK\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNDEID oota SEKUNDEID päringute vahel\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDEID oota 1..SEKUNDIT laadimise katsete vahel\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait oota korduste vahel "
+"0.5*SEKUNDIT..1.5*SEKUNDIT\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy proksit ei kasuta\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=NUMBER kasuta kvooti NUMBER\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=AADRESS kasuta kohaliku masina nime või IP\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=KIIRUS piira allalaadimise kiirust\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache blokeeri nimeserveri puhver\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS luba failinimedes ainult OS poolt lubatud "
+"sümboleid\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case failide/kataloogide otsimine on "
+"tõstutundetu\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only kasuta ainult IPv4 aadresse\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only kasuta ainult IPv6 aadresse\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=PEREK loo ühendus esmalt antud aadressiga,\n"
+" väärtus on IPv6, IPv4 või none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr " --user=USER sea nii ftp, kui http kasutaja\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=PASS sea nii ftp, kui http parool\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password küsi paroole\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=KÄSKLUS sea kasutaja ja parooli küsimise "
+"programm.\n"
+" Kui KÄSKLUS ei ole määratud, "
+"kasutatakse\n"
+" WGET_ASKPASS või SSH_ASKPASS keskkonna\n"
+" muutujat.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri lülita IRI tugi välja\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr " --local-encoding=KOOD määra kohalik kodeering IRI jaoks\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOOD määra mittelokaalne kodeering IRI jaoks\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink eemalda fail\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash säilita kontrollsumma vigadega failid "
+"(lisa .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl järjekorra NUMBER\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http kasuta HTTP päistest Metalink "
+"metaandmeid\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location Metalink ressursside eelistatud asukoht\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr kasuta metainfo jaoks laiendatud "
+"atribuute\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Kataloogid:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories ära loo katalooge\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+" -x, --force-directories kohustuslik kataloogide tekitamine\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ära loo hosti kataloogi\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories kasuta kataloogides protokolli nime\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=PREFIX salvesta failid kataloogi PREFIX/...\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NUMBER ignoreeri NUMBER kataloogi komponente\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP võtmed:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USER kasuta http kasutajat USER\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=PASS kasuta http parooli PASS\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache keela puhverdamise kasutamine\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NIMI muuda vaikimisi lehe nime (tavaliselt\n"
+" on selleks `index.html'.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension salvesta HTML/CSS dokumendid korrektse "
+"lõpuga\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length inoreeri `Content-Length' päise välja\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=SÕNE lisa SÕNE päisesse\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TÜÜP vali tihendamine, auto, gzip ja none. "
+"(vaikimisi: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksimaalne ümbersuunamiste arv lehel\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=USER USER proxy kasutajanimeks\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-passwd=PASS PASS proxy parooliks\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL lisa HTTP päringu päisesse `Referer: "
+"URL'\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers salvesta HTTP päised\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifitseeri kui AGENT, mitte kui\n"
+" Wget/VERSIOON\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive blokeeri HTTP keep-alive (püsivad "
+"ühendused)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ära kasuta präänikuid\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FAIL lae enne sessiooni präänikud failist "
+"FAIL\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FAIL salvesta sessiooni lõpus präänikud\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies lae ja salvesta sessiooni (ühekordsed)\n"
+" präänikud\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr " --post-data=SÕNE kasuta POST meetodit; saada SÕNE\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FAIL kasuta POST meetodit; saada FAILi sisu\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=HTTPMeetod kasuta päises \"HTTPMeetod\"\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=SÕNE saada sõne. --method PEAB olema seatud\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FAIL saada faili sisu. --method PEAB olema "
+"seatud\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition luba Content-Disposition päist lokaalse\n"
+" faili nime valikul (EKSPERIMENTAALNE)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error väljasta laetud sisu serveri vigadena\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge saada Basic HTTP autentimise info ilma, "
+"et\n"
+" ootaks serverilt päringut\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) võtmed:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR vali turvaprotokoll, võimalikud auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 ja PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only järgi ainult turvalisi HTTPS viiteid\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ära valideeri serveri sertifikaati\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FAIL kliendi sertifikaat\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr " --certificate-type=TÜÜP kliendi sert. tüüp, PEM või DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --privare-key=FAIL privaatvõti\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TÜÜP privaatvõtme tüüp, PEM või DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FAIL CA nimekirja fail\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr " --ca-directory=KAT CA nimekirja kataloog\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FAIL CRL fail\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FAIL/RÄSID Avaliku võtme (PEM/DER) fail, või base64\n"
+" kodeeringus sha256 räsid, prefiksiga\n"
+" 'sha256//' ja eraldajaga ';', millega\n"
+" konrtollida partnerit\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FAIL fail juhuarvudega SSL PRNG laadimiseks\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr " --egd-file=FAIL EGD pistiku faili nimi\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Sea prioriteedi sõne (GnuTLS) või šihvri "
+"loendi sõne (OpenSSL) otse.\n"
+" Kasutada ettevaatlikult. See võti muudab "
+"võtit --secure-protocol.\n"
+" Vorming ja süntaks sõltub konkreetsest "
+"SSL/TLS mootorist.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS võtmed:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts keela HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file HSTS andmebaas (vaikeväärtuse asemel)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP võtmed:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf kasuta binaar moodis FTP failide jaoks\n"
+" Stream_LF vormingut\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=USER sea ftp kasutaja\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASS sea ftp parool\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ära eemalda `.listing' faile\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob lülita faili nime täiendamine välja\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp ei kasuta \"passive\" ülekande moodi\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions säilita kauge faili õigused\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks lae ka failide nimeviited\n"
+" (mitte kataloogidele)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS võtmed:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit kasuta FTPS protokolli (port 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl kasuta andmeühendusel kontroll "
+"ühendusel\n"
+" loodud SSL/TLS sessiooni\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection Å¡ifreeri ainult kontroll kanal; "
+"andmed on avatekstis\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp kui FTPS pole toetatud, kasuta FTP\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC võtmed:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FAILINIMI salvesta päring/vastus info .warc.gz "
+"faili\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=SÕNE lisa SÕNE warcinfo kirjesse\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=NUMBER sea maksimaalne WARC faili suurus\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx kirjuta CDX indeks failid\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FAILINIMI ära salvesta selles CDX failis olevaid\n"
+" kirjeid\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ära tihenda WARC faile GZIP programmiga\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ära arvuta SHA1 räsi\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr " --no-warc-keep-log ära säilita WARC kirje logi\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=KATALOOG WARC kirjutaja ajutiste failide asukoht\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursiivne allalaadimine:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive rekursiivne allalaadimine\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMBER maksimaalne rekursiooni sügavus\n"
+" (inf või 0 lõpmatu)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after kustuta allalaetud failid\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links sea alla laetud HTML või CSS failide "
+"viited\n"
+" viitama lokaalsetele failidele\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only teisenda ainult faili osa URL'is (tuntud "
+"kui baasnimi)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N enne faili X kirjutamist, roteeri kuni\n"
+" N varukoopiat\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted enne faili X teisendamist salvesta\n"
+" failiks X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted enne faili X teisendamist salvesta\n"
+" failiks X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror lühend võtmetele\n"
+" -N -r -l inf --no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites lae kõik HTML lehe vaatamiseks vajalik "
+"info\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments lülita sisse range (SGML) HTML\n"
+" kommentaaride käsitlemine\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursiivne accept/reject:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr " -A, --accept=LIST lubatud laienduste nimistu\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr " -R, --reject=LIST keelatud laienduste nimistu\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGAV aktsepteeritavate URLide regulaaravaldis\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGAV keelatud URLide regulaaravaldis\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TÜÜP regulaaravaldise tüüp (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TÜÜP regulaaravaldise tüüp (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIST komadega eraldatud lubatud doomenite "
+"loend\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIST komadega eraldatud keelatud doomenite "
+"loend\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp järgne HTML dokumentides FTP viidetele\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LIST komadega eraldatud loend järgitavaid\n"
+" HTML lipikuid\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST komadega eraldatud loend ignoreeritavaid\n"
+" HTML lipikuid\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr " -H, --span-hosts mine ka teistesse serveritesse\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative järgne ainult suhtelisi viiteid\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LIST lubatud kataloogide nimistu\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names kasuta ümbersuunamisel määratud nime\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LIST välistatud kataloogide nimistu\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ära tõuse vanem kataloogini\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Email vearaportid, küsimused jms aadressil <bug-wget@gnu.org> ja/või\n"
+"avatud probleemid https://savannah.gnu.org/bugs/?func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, mitte-interaktiivne võrgust laadija.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Parool kasutajale %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Parool: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Toru ei õnnestu luua\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Viga use-askpass tegevuste faili initsialiseerimisel: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Viga use-askpass tegevuste faili seadmisel: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Viga käsu vastuse lugemisel \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Kasutajanimi '%s%s': "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Parool kasutajale '%s%s@%s': "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokaat: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompileeritud:"
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Lingitud:"
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s ehitatud süsteemil %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (keskkond)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (kasutaja)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (süsteem)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Autoriõigus © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Litsents GPLv3+: GNU GPL versioon 3 või uuem\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"See on vaba tarkvara: teil on lubatud seda muut ja levitada.\n"
+"GARANTII PUUDUB, vastavalt seadusega lubatud piiridele.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Selle programmi kirjutas Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Palun saatke vigade kirjeldused ja küsimused aadressil <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Mälu ei jätku\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Lõpetan %s vea tõttu\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Täiendava info saamiseks proovige `%s --help'.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: illegaalne võti -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Silumise tugi pole kompileeritud. Ignoreerin --debug võtit.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Kasutati korraga --no-clobber ja --convert-links, kasutan ainult --convert-"
+"links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Kasutati korraga --no-clobber ja --convert-file-only, kasutan ainult --"
+"convert-file-only.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ei saa korraga lobiseda ja vait olla.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Ei saa samaaegselt muuta failide aegu ja mitte puutuda vanu faile.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ei saa korraga kasutada --inet4-only ja --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Kui on antud mitu URLi või kombinatsioonis võtmetega -p või -r, ei saa "
+"võtmeid\n"
+"-k või --convert-file-only ja -O korraga kasutada. Detailid leiate "
+"manualist.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"HOIATUS: kombinatsioon -O ja -r või -p tähendab et kogu alla laetud info\n"
+"salvestatakse teie poolt määratud ühte faili.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"HOIATUS: ajatembeldamine võtmega -O ei tee midagi. Detailid leiate "
+"manualist.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC väljund ei tööta võtmega --no-clobber, --no-clobber blokeeritakse.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "WARC väljund ei tööta ajatemplitega, ajatembeldamine blokeeritakse.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC väljund ei tööta võtmega --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC väljund ei tööta võtmetega --continue, --start-pos, need "
+"blokeeritakse.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Räsi on blokeeritud; WARC deduplitseerimine ei leia duplikaat kirjeid.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Tihendamine ei tööta võtmetega --continue või --start-pos, need "
+"blokeeritakse.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Võtmeid --ask-password ja --password ei saa korraga kasutada.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Korraga --start-pos ja --continue kasutamine pole soovitatav; --continue "
+"blokeeritakse.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: puudub URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Võtmeid --post-data ja --post-file ei saa korraga kasutada.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Võtmeid --post-data või --post-file ei saa kasutada koos võtmega --method. --"
+"method eeldab andmeid võtmetega --body-data ja --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"--body-data või --body-file korral tuleb määrata meetod võtmega --"
+"method=HTTPMeetod.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Võtmeid --body-data ja --body-file ei saa korraga kasutada.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "See versioon ei toeta IRIsid\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k või -r saab kasutada koos võtmega -O ainult juhul, kui väljund on "
+"suunatud\n"
+"tavalisse faili.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links või --convert-file-only saab koos kasutada ainult juhul, kui "
+"väljund on suunatud tavalisse faili.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "libcares initsialiseerimine ebaõnnestus\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Ei õnnestu seadistada c-ares kanalit\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "IP aadressi '%s' ei õnnestu parsida\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Ei õnnestu seada DNS serverit '%s' (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "%s ei sisalda URLe.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Metalink faili %s parsimine ei õnnestu.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Kõiki ressursse ei õnnestunud %s pealt laadida.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"LÕPETATUD --%s--\n"
+"Täielik aeg: %s\n"
+"Alla laetud: %d faili, %s aeg %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Allalaadimise kvoot %s ON ÃœLETATUD!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O ei ole metalinkide laadimiseks toetatud. Ignoreerin.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planeeritud metalingi fail: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Turvatud metalingi fail: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Ei kasuta metalinki faili. Ebaturvaline nimi.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Töötlen metaurli %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Ei kasuta metaurli faili %s. Ebaturvaline nimi.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "%s alla laadimine ebaõnnestus. Jätan metaurli vahele.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Metaurl faili %s parsimine ei õnnestu.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Metaurlide töötlemine sai vea.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Resursi tüüp %s ei ole toetatud, ignoreerin...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Alla laetud faili avamine ebaõnnestus.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Arvutan %s suuruse\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Faili suurus ei ole deklareeritud. Ei kontrolli.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Alla laetud faili suurust ei õnnestu tuvastada.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Faili %s suurus ei klapi.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Suurus klapib.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Arvutan %s kontrollsumma\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrollsumma klapib.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Faili %s kontrollsumma ei klapi.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Alla laetud faili ei õnnestu allkirja kontrollimiseks avada.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Allkirja kontroll õnnestus.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Vigane allkiri. Ei kasuta seda ressurssi.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Andmed klapivad allkirjaga, aga allkiri ei ole usaldatav.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Kontrollsummad puuduvad.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "%s alla laadimine ebaõnnestus. Jätan vahele.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Fail %s on laetud, aga suurus ei klapi.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Fail %s on laetud, aga kontrollsumma ei klapi.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Fail %s on laetud, aga allkiri ei klapi.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s uus nimi on %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Jätkan taustas.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Jätkan taustal, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Väljund kirjutatakse faili %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() sai vea\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() sai vea\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ei leia kasutuskõlblikku pistiku programmi.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() sai vea. Pistikut ei õnnestunud seada blokeerivaks.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: hoiatus: %s lekseem on enne masina nime\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: tundmatu lekseem \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Kasuta: %s NETRC [HOSTINIMI]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: stat operatsioon ebaõnnestus %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "HOIATUS: vilets juhuarvude alginfo.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Ei õnnestu laadida PRNGd; kasutage --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Teie OpenSSL versioon on TLSv1.3 jaoks liiga vana\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Teie OpenSSL versioon on TLSv1.1 jaoks liiga vana\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Teie OpenSSL versioon on TLSv1.2 jaoks liiga vana\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: realiseerimata 'secure-protocol' parameetri väärtus %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Vigane Å¡ifri loend: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Ei õnnestunud seada usaldust osalisele ahelale\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Kontroll parameetrite eraldamine ebaõnnestus\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "HOIATUS: Ei õnnestu laadida PRNGd; kasutage --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: %s sertifikaati ei õnnestu kontrollida, väljastaja %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Väljastaja autoriteeti ei saa kontrollida.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Leiti ise-allkirjastatud sertifikaat.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Välja antud sertifikaat pole veel kehtiv.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Välja antud sertifikaat on aegunud.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: sertifikaadi subjekti alternatiivne nimi ei klapi\n"
+"\tküsitud hosti nimega %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: sertifikaadi üldine nimi %s ei klapi küsitud hosti nimega %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: sertifikaadi üldine nimi on vigane (sisaldab sümbolit NUL).\n"
+" See võib viidata et server pole see, millena ta üritab ennast näidata\n"
+" (see tähendab,see pole reaalne %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Kontrollimata ühenduse loomiseks servieriga %s kasutage `--no-check-"
+"certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ hüppan üle %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Vigane punkt stiili spetsifikatsioon %s; jätan muutmata.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " aeg "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ei õnnestu lugeda REAALAJA kella sagedust: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Kustutan %s, kuna see peaks olema tagasi lükatud.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ei saa avada %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Laen robots.txti faili; palun ignoreerige võimalikk vigu.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Viga proxy urli parsimisel %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Viga proxy urlis %s: Peab olema HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d ümbersuunamist ületatud.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr "Annan alla.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Proovin uuesti.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Vigaseid viiteid ei leitud.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] "Leidsin %d vigase viite.\n"
+msgstr[1] "Leidsin %d vigast viidet.\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Vigu pole"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Mittetoetatud skeem %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Skeem puudub"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Vigane serveri nimi"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Vigane pordi number"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Vigane kasutaja nimi"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Lõpetamata numbriline IPv6 aadress"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 aadresse ei toetata"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Vigane numbriline IPv6 aadress"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS tuge pole sisse kompileeritud"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Leiti mitteteisendatav mitmebaidi järjestus\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Mälu küsimine ebaõnnestus; mälu on otsas.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: %ld baidi küsimine ebaõnnestus; mälu on otsas.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: teksti puhver on liiga suur (%d baiti), katkestan.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Jätkan taustal, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ei õnnestu kustutada nimeviidet %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Faili %s fopen sai vea\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Faili %s deskriptorit ei õnnestu saada\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Faili %s atribuute ei õnnestu lugeda (kontrollige õiguseid)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Fail %s on peale viimast kontrolli muutunud. Turvakontroll ebaõnnestus.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Faili %s ei õnnestu avada: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Faili %s atribuute ei õnnestu lugeda, viga: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Proovin avada faili %s aga see on peale viimast kontrolli muutunud. "
+"Turvakontroll ebaõnnestus.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Vigane regulaaravaldis %s, PCRE2 viga %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Vigane regulaaravaldis %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Viga %s leidmisel: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Jätan vale suurusega võtme vahele (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Viga WARC faili %s positsioneerimisel.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Viga WARC faili %s kettale kirjutamisel.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Viga WARC faili pideme dubleerimisel.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Viga GZIP voo WARC faili avamisel.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Viga warcinfo kirje WARC faili kirjutamisel.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Avan WARC faili %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Viga WARC faili %s avamisel.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX failis pole algseid URLe. (Puudub veerg 'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX failis pole kontrollsummasid. (Puudub veerg 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX failis pole kirjete infot. (Puudub veerg 'u'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Laetud %d kirje CDX failist.\n"
+"\n"
+msgstr[1] ""
+"Laetud %d kirjet CDX failist.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "deduplitseerimisel CDX faili %s lugemine ebaõnnestus.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Ajutise WARC manifesti faili avamine ebaõnnestus.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Ajutise WARC logi faili avamine ebaõnnestus.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "WARC faili avamine ebaõnnestus.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "CDX faili ei õnnestu kirjutamiseks avada.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Ajutise WARC faili avamine ebaõnnestus.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Leidsin täpse vaste CDX failist. Salvestan uuesti külastamise kirje WARC "
+"faili.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Tundmatu süsteemne viga"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Seda aadresside perekonda ei toetata"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ai_flags vigane väärtus"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Nime lahendamisel tekkis parandamatu viga"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family ei ole toetatud"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Mälu ei jätku"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Serveri nimele ei leidu aadressi"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nimi või teenus on tundmatu"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname ei ole ai_socktype korral toetatud"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype ei toetata"
+
+#~ msgid "System error"
+#~ msgstr "Süsteemne viga"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumentide puhver on liiga väike"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Päringu töötlemine alles käib"
+
+#~ msgid "Request canceled"
+#~ msgstr "Päring katkestati"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Päringut ei katkestatud"
+
+#~ msgid "All requests done"
+#~ msgstr "Kõik päringud on töödeldud"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Katkestatud signaali poolt"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parameetri sõne ei ole korrektselt kodeeritud"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: võti '%s%s' on segane\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: võti '%s%s' on arusaamatu; variandid:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: tundmatu võti '%s%s'\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: võti '%s%s' ei luba argumenti\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: võti '%s%s' nõuab argumenti\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: vigane võti -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: võti nõuab argumenti -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Leitud"
+
+#~ msgid "No match"
+#~ msgstr "Ei leitud"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Vigane regulaaravaldis"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Vigane järjestamise sümbol"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Vigane sümbolite klassi nimi"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Langkriips lõpus"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Vigane tagasi viide"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [. või [= paariline puudub"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( või \\( paariline puudub"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Sulgemata \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Vigane \\{\\} sisu"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Vigane vahemiku lõpp"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Mälu on otsas"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Vigane eelnev regulaaravaldis"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Enneaegne regulaaravaldise lõpp"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regulaaravaldis on liiga suur"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") või \\) paariline puudub"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Eelmist regulaaravaldist pole"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "toru ei õnnestu luua"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s alamprotsess sai vea"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle sai vea"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "ei õnnestu taastada fd %d: dup2 sai vea"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s alamprotsess"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s alamprotsess sai fataalse signaali %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "mälu on otsas"
diff --git a/po/eu.gmo b/po/eu.gmo
new file mode 100644
index 0000000..fe9e958
--- /dev/null
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 0000000..fa1a5ad
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,3590 @@
+# translation of wget-1.9.1.po to Euskara
+# Basque translation of wget.
+# Copyright (C) 2003, 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Mikel Olasagasti <hey_neken@euskal.org>, 2003-2004.
+# Mikel Olasagasti Uranga <mikel@olasagasti.info>, 2013.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.14.128\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2013-06-14 00:35+0100\n"
+"Last-Translator: Mikel Olasagasti Uranga <mikel@olasagasti.info>\n"
+"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Konektatzen: %s|%s|:%d..."
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Konektatzen %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Konektatzen [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "konektatua.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "huts egin da: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "%d fitxategi %.2f segundutan bihurtuak.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "%s bihurtzen... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ezer ez egiteko.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ezin dira %s-ko linkak bihurtu: %s\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ezin da `%s' ezabatu: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ezin da %s gordetzeko kopia egin %s bezala: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ezin da `%s' ezabatu: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Kookie-a ezartzean sintaxi errorea: %s %d posizioan.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ezin da `%s' cookie fitxategia ireki: %s\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Errorea `%s' idazterakoan: %s\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "`%s' itxitzerakoan errorea: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Zerredatze mota sostengurik gabe, Unix zerrendatze sintaxi-"
+"analizatzailearekin saiatzen.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s-ren indexa %s:%d-en"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "denbora ezezaguna "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fitxategia "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Direktorioa "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Zihurtasunik gabe "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Luzeera: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (autorizaziorik gabea)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "%s bezala saioa hasten... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Zerbitzariaren erantzunean errorea, konexio kontrol panela itxitzen.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Errorea zerbitzarikin agurtzerakoan.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Idaztean huts egin da, kontrol konexioa itxitzen.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Zerbitzariak saio hasiera ukatzen du.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Saio sartze okerra.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Saiora sartua!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Zerbitzari errorea, ezin da sistema moeta determinatu.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "eginda. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "eginda.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Mota ezezaguna `%c', kontrol konexioa itxitzen.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "eginda. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWDa ez da behar.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Ez dago `%s' direktoriorik.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ez da beharrezkoa.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "`%s' fitxategia dagoeneko badago, ez da jasoko.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ezin da PASV transferentzia hasi.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ezin da PASV erantzuan parseatu.\n"
+
+#: src/ftp.c:1101
+#, fuzzy, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "ezin izan da %s-ra konektatu:%hu:%s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Lotze errorea (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORTU desegokia.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST komanduak huts egin du, hutsetik hasten.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"Ez dago `%s' fitxategirik.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ez dago `%s' fitxategirik.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ez dago `%s' fitxategi edo direktoriorik.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, konexio kontrola itxitzen.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Datu konexioa: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Kontrol konexioa itxia.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Datu transferentzia abortatua.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "`%s' fitxategia dagoeneko badago, ez da jasoko.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(saiatu:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gordeta [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "%s ezabatzen.\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "`%s' erabiltzen zerrenda tmp fitxategi bezala.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s ezabatua.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Inkurtsio sakonera %dk maximoa gainditzen du. Sakonera %d.\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"`%s' fitxategi erremotoa ez da bertakoa baina berriagoa -- ez da jasoko.\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr "`%s' fitxategi erremotoa bertakoa baina berriagoa da -- jasotzen.\n"
+
+#: src/ftp.c:2309
+#, fuzzy, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Tamainuak ez dute ezkontzen (lokalak %ld) -- jasotzen.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Baliogabeko symlink izena, saltatzen.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Dagoeneko baduka link simboliko zuzena %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Link sinbolikoa sortzen %s -> %s\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Link sinbolikoak ez daude onartuak, `%s' link sinbolikoa baztetzen.\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Direktorioa utzitzen `%s'.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: ezagun/euskarririk gabeko fitxategi mota.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Huts egin da zertifikazio gakoa hartzerakoan %s-tik\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: ordu zigilu okerra.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Ez dira direktorio gehiago jasoko, sakonera %d-koa delako (mas %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ez jaisten `%s'ra, ez baitago sartua edo exkluditua dago.\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr "`%s' ez onartzen.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "`%s' ez onartzen.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Ez jaisten `%s'ra, ez baitago sartua edo exkluditua dago.\n"
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Errorea `%s' idazterakoan: %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "`%s' ereduarekin ez du lotzen.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Idatzia HTMLizatutako index-a `%s'-en [%ld].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Idatzia HTMLzatutako index-a '%s'-en.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Bidali bug-ak eta iradokizunak <bug-wget@gnu.org>-era.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERROREA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ostalari ezezaguna"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Errore ezezaguna"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "%s ebazten... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "huts·egin·da: denboraz kanpo.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ezin da osatu gabeko linka ebatzi %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Baliogabeko URLa %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Huts egin da HTTP eskaera idazterakoan: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr "`%s' fitxategia dagoeneko badago, ez da jasoko.\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Konexioa berrerabiltzen %srentzat: %hu.\n"
+
+#: src/http.c:2098
+#, fuzzy, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Konexioa berrerabiltzen %srentzat: %hu.\n"
+
+#: src/http.c:2164
+#, fuzzy, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Huts egin da HTTP eskaera idazterakoan: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROREA %d %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Gaizki eratutako egoera lerroa"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Autentifikazio eskema ezezaguna.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autentifikazio eskema ezezaguna.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Hemen gordetzen: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s eskaera bidalia, erantzunaren zain... "
+
+#: src/http.c:3441
+#, fuzzy
+msgid "No data received.\n"
+msgstr "Ez da daturik jaso"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Irakurketa errorea (%s) goiburukoetan.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(deskripziorik gabe)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Kokapena: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "zehaztugabea"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [hurrengoa]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Fitxategi hau iada guztiz jasoa dago; ezer ez egiteko.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Luzera: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "baztertua"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Oharra: komodinak ez daude onartuak HTTPean.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ezin da `%s' idatzi (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Ezin da `%s' idatzi (%s).\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ezinezkoa SSL konexioa sortzea.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ezin da `%s' idatzi (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROREA: (%d) helbideraketa kokapenik gabe.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Azken·burugoiko·modifikazitua falta da·-·ordu·zigilua·itzalia.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Azken burugoiko modifikazioa baliogabekoa - ordu zigilua ignoratua.\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Zerbitzariko fitxategia ez da bertakoa %s fitxategia baina berriagoa -- ez "
+"da jasoko.\n"
+"\n"
+
+#: src/http.c:4651
+#, fuzzy, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Tamainuak·ez·dute·ezkontzen·(lokalak·%ld)·--·jasotzen.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Fitxategi erremotoa berriagoa da, jasotzen.\n"
+
+#: src/http.c:4678
+#, fuzzy
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr "`%s' fitxategi erremotoa bertakoa baina berriagoa da -- jasotzen.\n"
+
+#: src/http.c:4684
+#, fuzzy
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"`%s' fitxategi erremotoa ez da bertakoa baina berriagoa -- ez da jasoko.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+#, fuzzy
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "Fitxategi erremotoa berriagoa da, jasotzen.\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s ERROREA %d %s.\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' gordeta [%ld/%ld]\n"
+"\n"
+
+#: src/http.c:4818
+#, fuzzy, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Konexioa itxia ondorengo bytean %ld. "
+
+#: src/http.c:4841
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Irakurtze errorea %ld bytean (%s)."
+
+#: src/http.c:4850
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Irakurtze errorea %ld/%ld bytean (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Sostengu gabeko eskema"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC %sra apuntatzen du, ez dena existitzen.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ezin irakurri %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: %s-n errorea %d lerroan.\n"
+
+#: src/init.c:718
+#, fuzzy, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: %s-n errorea %d lerroan.\n"
+
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: %s-n errorea %d lerroan.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Kontuz: Bai sistema bai wgetrc `%s'ra apuntatzen dute.\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Baliogaeko --exekutatu`%s' komandoa\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Baliogabeko booleanoa `%s', erabili `on' edo `off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Baliogabeko booleanoa `%s', erabili `on' edo `off'.\n"
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Baliogabeko zenbakia `%s'.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Baliogabeko byte balioa `%s'\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Baliogabeko denbora tartea `%s'\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Baliogabeko denbora tartea `%s'\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Baliogabeko balioa `%s'.\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Baliogabeko goiburukoa `%s'.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Baliogabeko goiburukoa `%s'.\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Baliogabeko aurreratze mota `%s'.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr "%s: %s: Baliogabeko mugaketa `%s', erabili `unix' edo `windows'.\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "ezin izan da %s-ra konektatu:%hu:%s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s jasota, irteera `%s'ra bideratzen.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; saio hasiera desgaitzen.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Erabili: %s [AUKERA]... [URL]...\n"
+
+#: src/main.c:590
+#, fuzzy
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"\n"
+"Aginduzko argumentu luzeegiak aukera txikientzako agindu ere badira.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Direktorioak:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, sare informazio jaitsitzaile ez interaktiboa.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Pasahitza:"
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ezin da `%s' idatzi (%s).\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale-a:"
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Konpilazioa:"
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Esteka:"
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2003 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Originalki Hrvoje Niksic-k idatzia <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Bidali bug-ak eta iradokizunak <bug-wget@gnu.org>-era.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Saiatu `%s --help` aukera gehiagorako.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: legez kanpoko aukera -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ezin da berritsu eta ixil moduan egon une berean.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Ezin dira ez-gainidatzi fitxategiak eta denbora markak erabili une berean.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL falta\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Huts egin da `%s' link sinbolikoa askatzerakoan: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Ez da URLrik aurkitu %s-n.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ezin da `%s' ezabatu: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"\n"
+"AMAITUTA --%s--\n"
+"Jatsitakoa: %s byte %d fitxategietan\n"
+
+#: src/main.c:2284
+#, fuzzy, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Jaitsiera kuota (%s byte) GAINDITUA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ezin da `%s' ezabatu: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, fuzzy, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "IPV6 motako helbideak ez daude erabilgarri"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+"Ez dago `%s' fitxategirik.\n"
+"\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s ezabatzen.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Atzeko planoan jarraitzen.\n"
+
+#: src/mswindows.c:289
+#, fuzzy, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Atzeko planoan jarraitzen, pid %d.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Irteera `%s'-n idatziko da.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ezin aurkitu socket kontrolatzaile erabilgarririk.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: abisua: \"%s\" tokena makina izenanen aurretik dago\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: token ezezaguna \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Erabilera: %s NETRC [HOST-IZENA]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: ezin da identifikatu %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+#, fuzzy
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Ezin da OpenSSL PRNG hasi, SSL ezintzen.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Baliogabeko URLa %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Ezin da OpenSSL PRNG hasi, SSL ezintzen.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, fuzzy, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ saltatzen %dK ]"
+
+#: src/progress.c:545
+#, fuzzy, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Baliogabeko puntuazio estilo espezifikazioa '%s'; aldatu gabe utzitzen.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "%s ezabatzen ezestua izan behar zuelako.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ezin dira %s-ko linkak bihurtu: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Robots.txt kargatzen; mesedez ignoratu erroreak.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Errorea proxy URLan %s: HTTP izan behar du.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d erredirekzio kopurua gainditua.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Utzitzen.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Berriz saiatzen.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Errorerik ez"
+
+#: src/url.c:677
+#, fuzzy, c-format
+msgid "Unsupported scheme %s"
+msgstr "Sostengu gabeko eskema"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+#, fuzzy
+msgid "Invalid host name"
+msgstr "Baliogabeko erabiltzaile izena"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Portu zenbaki akastuna"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Baliogabeko erabiltzaile izena"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "IPv6 zenbaki helbide amaitugabea"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPV6 motako helbideak ez daude erabilgarri"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Baliogabeko IPv6 zenbaki helbidea"
+
+#: src/url.c:1007
+#, fuzzy
+msgid "HTTPS support not compiled in"
+msgstr "%s: ez dago debug euskarriarekin konpilatua.\n"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Atzeko planoan jarraitzen, pid %d.\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Huts egin da `%s' link sinbolikoa askatzerakoan: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Huts egin da zertifikazio gakoa hartzerakoan %s-tik\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "%s-tik zertifikazioak kargatzerakoan huts egin da\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Errorea `%s' idazterakoan: %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Proxy URLa parseatzen errorea %s: %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr ""
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Unknown system error"
+#~ msgstr "Errore ezezaguna"
+
+#, fuzzy
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "IPV6 motako helbideak ez daude erabilgarri"
+
+#, fuzzy
+#~ msgid "System error"
+#~ msgstr "Errorerik ez"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: `%s' aukera anbiguoa da\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: `--%s'k ez du argudiorik onartzen\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: `%c%s' aukerak ez du argudiorik onartzen\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: `%s' aukerak argudio bat behar du\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: aukera·ezezaguna `--%s'\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: aukera ezezaguna `%c%s'\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: legez kanpoko aukera -- %c\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: aukerak argumentu bat behar du -- %c\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: `-W %s' aukera anbiguoa da\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: `-W %s' aukerak ez du argudiorik onartzen\n"
+
+#, fuzzy, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: `%s' aukerak argudio bat behar du\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorizazitzen huts egin da.\n"
+
+#, fuzzy, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr "Ez da daturik jaso"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgstr "Bidali bug-ak eta iradokizunak <bug-wget@gnu.org>-era.\n"
+
+#, fuzzy, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "`%s' fitxategia dagoeneko badago, ez da jasoko.\n"
+
+#, fuzzy, c-format
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s: Ezin da osatu gabeko linka ebatzi %s.\n"
+
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr ""
+#~ "Ezin da `%s' lotura helbide batetara bihurtu. BESTE batera bihurtzen.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Okerra Set-Cookie egiten, `%s' eremuan"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST komanduak huts egin du, ez da`%s' moztuko.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s amaitzeko]"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: legez kanpoko aukera -- %c\n"
+
+#~ msgid "Host not found"
+#~ msgstr "Host-a ez da aurkitu"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Huts egin da SSL kontextua eratzen\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Zehaztutako zertifikaziorik gabe saiatzen\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Fitxategiaren amaiera goi-buruak parseatzen ziren bitartean.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Deskargaren jarrapienak huts egin du fitxategi hontan, eta `-c'-rekin "
+#~ "gatazka sortzen du.\n"
+#~ "Existitzen den `%s' fitxategia moztea ukatzen da.\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (%s amaitzeko)"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "`%s'·fitxategia·dagoeneko·badago,·ez·da·jasoko.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' gordeta [%ld/%ld])\n"
+#~ "\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Konexioa itxia ondorengo bytean %ld/%ld. "
+
+#~ msgid "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s: Baliogabeko booleanoa `%s', erabili beti, on, off, edo never.\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Hasteko:\n"
+#~ " -V, --version Wget-en bertsioa erakutsi eta irten.\n"
+#~ " -h, --help laguntza hau erakutsi.\n"
+#~ " -b, --background asterakoan atzealdean ipini.\n"
+#~ " -e, --execute=KOMANDUA `.wgetrc'-motako komandua ejekutatzen du.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logeatze eta irteera fitxategia:\n"
+#~ " -o, --output-file=FITXATEGIA log mezuak FITXATEGIAN idatzi.\n"
+#~ " -a, --append-output=FITXATEGIA erantsi mezuak FITXATEGIARI.\n"
+#~ " -d, --debug erakutsi debug-aren irteera.\n"
+#~ " -q, --quiet ixilik (irteerarik gabe).\n"
+#~ " -v, --verbose irteera luzea (lehenetsia).\n"
+#~ " -nv, --non-verbose irteera luzerik gabe, baina ixilik egon "
+#~ "gabe.\n"
+#~ " -i, --input-file=FITXATEGIA emandako FITXATEGIAN dauden URLak "
+#~ "jaitsi.\n"
+#~ " -F, --force-html sarrera fitxategia HTML bezala tratatu.\n"
+#~ " -B, --base=URL URLa geitu hasieran -F -i fitxategien link "
+#~ "erlatiboetan.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Jaitsi:\n"
+#~ " -t, --tries=ZENBAKIA jaisteko egingo diren saiakera kopurua "
+#~ "(0 limiterik gabe).\n"
+#~ " --retry-connrefused konexioa ukatzen bada ere berriz saiatu.\n"
+#~ " -O --output-document=FITXATEGIA idatzi dokumentuak FITXATEGIAN.\n"
+#~ " -nc, --no-clobber ez jaitsi dagoeneko exisitzen bada edo "
+#~ "erabili .# luzapen bezala.\n"
+#~ " -c, --continue jarraitu jaisten partzialki jatsirik "
+#~ "dagoen fitxategia.\n"
+#~ " --progress=MOTA progresu mota aukeratu.\n"
+#~ " -N, --timestamping ez jaitsi fitxategiak bertakoak baina "
+#~ "berriagoak ez badira.\n"
+#~ " -S, --server-response erakutsi zerbitzariaren erantzuna.\n"
+#~ " --spider ez jaitsi ezer.\n"
+#~ " -T, --timeout=SEGUNDUAK ezarri denboraz kanpo balio guztiak "
+#~ "emandako SEGUNDUTAN.\n"
+#~ " --dns-timeout=SEGUNDUAK ezarri DNS ikustatze limitea "
+#~ "emandako SEGUNDUTAN.\n"
+#~ " --connect-timeout=SEGUNDUAK ezarri konexioa denboraz kanpo "
+#~ "egotea emandako SEGUNDUTAN.\n"
+#~ " --read-timeout=SEGUNDUAK ezarri irakurtzea denboraz kanpo "
+#~ "egotea emandako SEGUNDUTAN.\n"
+#~ " -w, --wait=SEGUNDUAK itxaron emandako SEGUNDUAK jaitsieren "
+#~ "artean.\n"
+#~ " --waitretry=SEGUNDUAK itxaron emandako SEGUNDUAK huts "
+#~ "egindako jaitsiera bat jarraitzeko.\n"
+#~ " --random-wait itxaron 0 tik 2*ra saiatzeen artean.\n"
+#~ " -Y, --proxy=on/off gaitu ala ez gaitu proxya.\n"
+#~ " -Q, --quota=ZENBAKIA ezarri saiatze kuota ZENBAKIRA.\n"
+#~ " --bind-address=HELBIDEA itsutu HELBIEARA (host izena edo IPa) "
+#~ "host lokalean.\n"
+#~ " --limit-rate=TASA ezarri jaitsiera limitea TASARA.\n"
+#~ " --dns-cache=off ezgaitu katxeaturiko DNSak ikustatzea.\n"
+#~ " --restrict-file-names=SE SE (Sistema Eragile)ak onartzen dituen "
+#~ "karaktereak soilik erabili.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Direktorioak:\n"
+#~ " -nd, --no-directories ez sortu direkoriorik.\n"
+#~ " -x, --force-directories behartu direktorioak sortzera.\n"
+#~ " -nH, --no-host-directories ez sortu host direktoriorik.\n"
+#~ " -P, --directory-prefix=AURREZKI gorde fitxategiak AURREZKI/-an...\n"
+#~ " --cut-dirs=KOPURUA ez egin jaramonik urruneko direktorio "
+#~ "KOPURUAri.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTP aukerak:\n"
+#~ " --http-user=ERABILTZAILEA ezarri http erabiltzaile bezala "
+#~ "ERABILTZAILEA.\n"
+#~ " --http-passwd=PASAHITZA ezarri http pasahitz bezala PASAHITZA.\n"
+#~ " -C, --cache=on/off zerbitzari katxea gaitu ala ezgaitu "
+#~ "(normalean onartua).\n"
+#~ " -E, --html-extension gorde text/html dokumentuak .html "
+#~ "luzapenarekin.\n"
+#~ " --ignore-length ignoratu `Content-Length' goiburua.\n"
+#~ " --header=KATEA gehitu KATEA goiburua beste goiburuekin.\n"
+#~ " --proxy-user=ERABILTZAILEA ezarri proxy erabiltzaile bezela "
+#~ "ERABILTZAILEA.\n"
+#~ " --proxy-passwd=PASAHITZA ezarri proxy pasahitz bezela "
+#~ "PASAHITZA.\n"
+#~ " --referer=URL sartu `Referer: URL' goiburua HTTP "
+#~ "eskaeran.\n"
+#~ " -s, --save-headers gorde HTTP goiburuak fitxategi batean.\n"
+#~ " -U, --user-agent=AGENTEA identifikatu AGENTE bezala Wget/BERTSIOA-"
+#~ "ren ordez.\n"
+#~ " --no-http-keep-alive ezgaitu HTTP keep alive (konexio "
+#~ "iraunkorrak).\n"
+#~ " --cookies=off ez erabili cookieak.\n"
+#~ " --load-cookies=FITXATEGIA kargatu cookieak FITXATEGITIK saioa "
+#~ "hasi aurretik.\n"
+#~ " --save-cookies=FITXATEGIA gorde cookieak FITXATEGIAN saioa "
+#~ "amaitzean.\n"
+#~ " --post-data=KATEA erabili POST metodoa; bidali KATEA datu "
+#~ "bezala.\n"
+#~ " --post-file=FITXATEGIA erabili POST metodoa; bidali "
+#~ "FITXATEGIAREN edukia datu bezala.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTPS (SSL) aukerak:\n"
+#~ " --sslcertfile=FITXATEGIA aukerazko bezero zertifikatua.\n"
+#~ " --sslcertkey=GILTZA-FITXATEGIA zertifikatu honentzat aukerazko "
+#~ "giltza-fitxategia.\n"
+#~ " --egd-file=FITXATEGIA EGD socket-aren fitxategi izena.\n"
+#~ " --sslcadir=DIR CA hash zerrendak gordetzen diren "
+#~ "direktorioa.\n"
+#~ " --sslcafile=FITXATEGIA CA zertifikatudun fitxategiak\n"
+#~ " --sslcerttype=0/1 Bezeroaren zertifikazio mota 0=PEM "
+#~ "(lehenetsia) / 1=ASN1 (DER)\n"
+#~ " --sslcheckcert=0/1 Egiaztatu zerbitzariaren zertifikatua "
+#~ "emandako CArekin\n"
+#~ " --sslprotocol=0-3 aukeratu SSL protokoloa; 0=automatikoa,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "FTP aukerak:\n"
+#~ " -nr, --dont-remove-listing ez ezabatu `.listing' fitxategiak.\n"
+#~ " -g, --glob=on/off fitxategi izen komodinak gaitu ala ez.\n"
+#~ " --passive-ftp transferentzia modu \"pasiboa\" erabili.\n"
+#~ " --retr-symlinks errekurtsibitatean, linkaturiko "
+#~ "fitxategiak hartu (direktorioak ez).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Eskuratze errekurtsiboa:\n"
+#~ " -r, --recursive jaitsiera errekurtsiboa.\n"
+#~ " -l, --level=ZENBAKIA errekurtsibitate sakonera maximoa(inf edo 0 "
+#~ "infiturentzat).\n"
+#~ " --delete-after ezabatu fitxategiak lokalki jaitsi ondoren.\n"
+#~ " -k, --convert-links link erlatiboak ez erlatiboetan bihurtu.\n"
+#~ " -K, --backup-converted X fitxategia bihurtu aurretik segurtasun "
+#~ "kopia egin X.orig bezala.\n"
+#~ " -m, --mirror laster-bide bat -r -N -l inf -nr egiteko.\n"
+#~ " -p, --page-requisites irudiak eta besteak hartu, HTML orriak "
+#~ "erakusteko beharrezkoak.\n"
+#~ " --strict-comments HTML komentarioak SGML bidez maneiatu.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Errekurtsibitatean onartu/ezetsi:\n"
+#~ " -A, --accept=ZERRENDA onartutako luzapenen zerrenda "
+#~ "komaz bereiztua.\n"
+#~ " -R, --reject=ZERRENDA ezetsitako luzapen zerrenda komaz "
+#~ "bereiztua.\n"
+#~ " -D, --domains=ZERRENDA onartutako dominioen zerrenda "
+#~ "komaz bereiztua.\n"
+#~ " --exclude-domains=ZERRENDA ezetsitako dominio zerrenda komaz "
+#~ "bereiztua.\n"
+#~ " --follow-ftp jarraitu FTP linkak HTML dokumentu "
+#~ "batean.\n"
+#~ " --follow-tags=ZERRENDA jarraituko diren HTML tag "
+#~ "zerrenda komaz bereiztua.\n"
+#~ " -G, --ignore-tags=ZERRENDA ignoratuak izango diren HTML tag "
+#~ "zerrenda komaz bereiztua.\n"
+#~ " -H, --span-hosts joan kanpo-hostalarietara "
+#~ "errekurtsibitatean.\n"
+#~ " -L, --relative jarraitu link erlatiboak soilik.\n"
+#~ " -I, --include-directories=ZERRENDA onartutako direktorio zerrenda.\n"
+#~ " -X, --exclude-directories=ZERRENDA egotzitako direktorio zerrenda.\n"
+#~ " -np, --no-parent ez igo direktorio gurasora.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Programa hau erabilgarria izango zaizulakoan distribuitzen da,\n"
+#~ "baina INOLAKO GARANTIARIK GABE; ezta MERKATURAKO edo\n"
+#~ "NORBERAREN ERABILPENERAKO garantiarik. Ikusi GNUren Lizentzia\n"
+#~ "Publiko Generala detaile gehiagorako.\n"
+
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "WinHelp %s hasten\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Ostalaria hutsa"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Behar adina memoriarik gabe.\n"
diff --git a/po/fi.gmo b/po/fi.gmo
new file mode 100644
index 0000000..b50ec79
--- /dev/null
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..09163bf
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,3676 @@
+# Finnish messages for wget.
+# Copyright © 2005, 2008, 2009, 2010, 2012, 2013, 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Proofreading by Tero Jänkä and others.
+# Petri T. Koistinen <petri.koistinen@iki.fi>, 2005.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2008-2010, 2012-2013, 2015.
+# Lauri Nurmi <lanurmi@iki.fi>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.20\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2019-12-26 03:45+0200\n"
+"Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.2.4\n"
+"X-Poedit-Bookmarks: 150,377,385,503,-1,-1,-1,-1,-1,-1\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: sidontaosoitetta %s ei voida selvittää; poistetaan sitominen käytöstä.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Yhdistetään palvelimeen %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Yhdistetään palvelimeen %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Yhdistetään palvelimeen [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "yhdistetty.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "epäonnistui: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: koneen osoitteen %s selvittäminen epäonnistui\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Liikaa tiedostokahvoja auki. Selectiä ei voi käyttää kahvalle ≥ %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Muunnettu %d tiedoston linkit %s sekunnissa.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Muunnetaan linkkejä %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ei ole tehtävää.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Linkkien muuntaminen tiedostossa %s epäonnistui: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Tiedoston %s poistaminen epäonnistui: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Tiedoston %s varmuuskopiointi nimelle %s epäonnistui: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Evästeen hakeminen kohteelle %s epäonnistui\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaksivirhe Set-Cookiessa: %s kohdassa %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Eväste osoitteesta %s yritti asettaa verkkotunnukseksi "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Evästetiedoston %s avaaminen epäonnistui: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Virhe kirjoitettaessa tiedostoon %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Virhe suljettaessa tiedostoa %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Listaustyyppiä ei tueta, yritetään jäsentää Unix-listauksena.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Kansion /%s sisältö kohteessa %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "tuntematon aika "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Tiedosto "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Hakemisto "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Linkki "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Epävarma "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s tavua)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Pituus: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) jäljellä"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s jäljellä"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (vahvistamaton)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL-salausta ei voitu alustaa. Se poistetaan käytöstä."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Kirjaudutaan nimellä %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Virhe palvelimen vastauksessa. Hallintayhteys suljetaan.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Virhe palvelimen tervehdyksessä.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Kirjoitus epäonnistui. Hallintayhteys suljetaan.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Palvelin hylkäsi kirjautumisen.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Kirjautuminen epäonnistui.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Kirjauduttu!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Palvelinvirhe, järjestelmän tyypin päätteleminen epäonnistui.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "valmis. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "valmis.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tuntematon tyyppi â€%câ€. Hallintayhteys suljetaan.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "valmis. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD:tä ei tarvita.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Loogisesti mahdoton lohko kohdattiin funktiossa getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Hakemistoa %s ei ole.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD:tä ei vaadita.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Tiedosto on jo noudettu.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "PASV-siirron alustus epäonnistui.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "PASV-vastauksen jäsentäminen epäonnistui.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "yhdistäminen kohteen %s porttiin %d epäonnistui: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Sidontavirhe (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Virheellinen PORTTI.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST epäonnistui, aloitetaan alusta.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Etätiedosto %s on olemassa.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Tiedostoa %s ei ole.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Tiedostoa %s ei ole.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Tiedostoa tai hakemistoa %s ei ole.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s on ilmaantunut olemaan.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, suljetaan hallintayhteys.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - tiedonsiirtoyhteys: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Hallintayhteys suljettu.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Tiedonsiirto keskeytetty.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Tiedostoa %s ei noudeta, koska se on jo olemassa.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(yritys:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - kirjoitettu vakiotulosteeseen %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s tallennettu [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Poistetaan %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Listaus tallennetaan väliaikaistiedostoon %s.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Poistettiin %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Rekursiosyvyys %d ylitti sallitun syvyyden %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Etätiedosto ei ole uudempi kuin paikallinen %s – ei noudeta.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Etätiedosto on uudempi kuin paikallinen %s – noudetaan.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Koot eivät täsmää (paikallinen %s) – noudetaan.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Symbolisen linkin nimi on virheellinen, ohitetaan.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Oikea symbolinen linkki %s -> %s on jo olemassa.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Luodaan symbolinen linkki %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Ei tukea symbolisille linkeille, ohitetaan %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ohitetaan hakemisto %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tuntematon/tukematon tiedostotyyppi.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Evästeiden hakeminen kohteelle %s epäonnistui\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: vääristynyt aikaleima.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Hakemistoja ei noudeta, koska syvyys on %d (raja %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Hakemiston %s sisältöä ei noudeta, koska se on hylätty.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Hylätään %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Hylätään %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Hakemiston %s sisältöä ei noudeta, koska se on hylätty.\n"
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Virhe kohteessa %s; se on erilainen kuin %s: %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Hakulause %s ei löytänyt mitään.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "HTML-muotoiltu indeksi on kirjoitettu tiedostoon %s [%s].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "HTML-muotoiltu indeksi on kirjoitettu tiedostoon %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "VIRHE: Hakemiston %s avaaminen epäonnistui.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "VIRHE: Varmenteen %s: avaaminen epäonnistui (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Ladattiin CA-varmenne â€%sâ€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "VIRHE: CRL-tiedoston â€%s†lataus epäonnistui: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Ladattiin CRL-tiedosto â€%sâ€\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "VIRHE: GnuTLS vaatii avaimen ja varmenteen olevan samaa tyyppiä.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "GnuTLS-versiosi on liian vanha tukeakseen TLSv1.3-yhteyskäytäntöä\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: toteuttamaton â€secure-protocol†-asetusarvo %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Lähetä vikailmoitus tästä ongelmasta osoitteeseen bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: toteuttamaton â€secure-protocolâ€-asetusarvo %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Prio-merkki jonoa ei voi asettaa suoraan. Palataan "
+"oletusprioriteettiin.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "VIRHE"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "VAROITUS"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s ei esittänyt varmennetta.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Varmenne %s ei ole luotettu.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Varmenteella %s ei ole tunnettua myöntäjää.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Varmenne %s on kumottu.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Varmenteen %s allekirjoittaja ei ollut CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Varmenne %s on allekirjoitettu turvattomalla algoritmilla.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Varmennetta %s ei ole vielä aktivoitu.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Varmenne %s on vanhentunut.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Virhe alustettaessa X509-varmennetta: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Varmennetta ei löytynyt\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Virhe jäsennettäessä varmennetta: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Varmenne ei ole vielä voimassa\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Varmenne on vanhentunut\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Varmenteen omistaja ei täsmää konenimeen %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Varmenteen on oltava X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Virhe käsiteltäessä osoiteluetteloa.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Tuntematon konenimi"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Väliaikainen häiriö nimenselvityksessä"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Tuntematon virhe"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Selvitetään osoitetta %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "epäonnistui: Konenimelle ei ole IPv4/IPv6-osoitteita.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "epäonnistui: aikakatkaistu.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Epätäydellisen linkin %s selvittäminen epäonnistui.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: virheellinen URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "HTTP-pyynnön kirjoitus epäonnistui: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Ei otsakkeita, oletetaan HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Tiedostoa %s ei noudeta, koska se on jo olemassa.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime epäonnistui. Tämä on luultavasti ohjelmistovika.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Aikaleimaa ei voi muuntaa http-muotoon. Palataan aikaan 0 viimeisen "
+"muutoksen ajankohtana.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY-data-tiedosto %s puuttuu: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Uudelleenkäytetään yhteyttä osoitteeseen [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Uudelleenkäytetään yhteyttä osoitteeseen %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Välityspalvelimen vastauksen vastaanotto epäonnistui: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s VIRHE %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Väärin muotoiltu Status-otsake"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Välityspalvelintunnelointi epäonnistui: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Tuntematon todennusmalli.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Todennus valittu: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Tallennetaan kohteeseen: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Allekirjoitusta noudettaessa:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Virheellinen pri-arvo. Oletetaan %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Poistetaan SSL käytöstä tapahtuneiden virheiden johdosta.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-pyyntö lähetetty, odotetaan vastausta... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Yhtään dataa ei vastaanotettu.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Lukuvirhe (%s) otsakkeissa.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(ei kuvausta)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Sijainti: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "määrittelemätön"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [seurataan]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Tiedostoa %s ei ole muokattu palvelimella. Ohitetaan nouto.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Tiedosto on jo kokonaan noudettu. Ei mitään tehtävää.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Pituus: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "jätetty huomiotta"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Varoitus: HTTP ei tue jokerimerkkejä.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Hakurobottitila aktivoitu. Tarkista, onko etätiedosto olemassa.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Kirjoittaminen tiedostoon %s epäonnistui (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Vastaanotetusta otsakkeesta puuttuu vaadittu attribuutti.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Käyttäjätunnus-salasanatodennus epäonnistui.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "WARC-tiedostoon kirjoittaminen epäonnistui.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Tilapäiseen WARC-tiedostoon kirjoittaminen epäonnistui.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "SSL-yhteyden muodostaminen ei onnistunut.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Linkin %s (%s) purkaminen epäonnistui.\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "VIRHE: Uudelleenohjaus (%d) ilman sijaintia.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Etätiedostoa ei ole olemassa – rikkinäinen linkki!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "â€Last-modifiedâ€-otsake puuttuu – aikaleimat poistettu käytöstä.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"â€Last-modifiedâ€-otsake on virheellinen – aikaleima jätetty huomiotta.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Palvelimen tiedosto %s ei ole paikallista uudempi – ei noudeta.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Koot eivät täsmää (paikallinen %s) – noudetaan.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Etätiedosto on uudempi, noudetaan.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Etätiedosto on olemassa ja saattaa sisältää linkkejä muihin resursseihin – "
+"noudetaan.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Etätiedosto on olemassa, mutta ei sisällä yhtään linkkiä – ei noudeta.\n"
+"\n"
+
+# Tämä kuten useat aiemmat yllä ovat lokitiedostorivejä, joilla kommentoidaan hakurobotin tekemisiä ja tekemättä jättämisiä.
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Etätiedosto on olemassa ja saattaa sisältää lisää linkkejä.\n"
+"Rekursio ei kuitenkaan ole käytössä, joten linkkejä ei seurata.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Etätiedosto on olemassa.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - kirjoitettu vakiotulosteeseen %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s tallennettu [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Yhteys suljettu tavun %s kohdalla. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Lukuvirhe tavun %s kohdalla (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Lukuvirhe tavun %s/%s kohdalla (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Tukematon suojauksen laatu â€%sâ€.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Tukematon algoritmi â€%sâ€.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC osoittaa kohteeseen %s, jota ei pystytty käyttämään virheen "
+"vuoksi: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Tiedoston %s lukeminen epäonnistui (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Virhe kohdassa %s rivillä %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaksivirhe kohdassa %s rivillä %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Tuntematon komento %s kohdassa %s rivillä %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Järjestelmän wgetrc-tiedoston jäsentäminen (env SYSTEM_WGETRC) epäonnistui. "
+"Tarkista\n"
+"â€%sâ€,\n"
+"tai määritele muu tiedosto valitsimella --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Järjestelmän wgetrc-tiedoston jäsentäminen epäonnistui. Tarkista\n"
+"â€%sâ€,\n"
+"tai määrittele muu tiedosto valitsimella --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Varoitus: Sekä järjestelmän että käyttäjän wgetrc osoittavat tiedostoon "
+"%s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Virheellinen komento %s valitsimelle --execute\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Virheellinen totuusarvo %s, käytä â€on†tai â€offâ€.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Virheellinen boolean %s, valitse â€on†tai â€offâ€.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Lukuarvo %s on virheellinen.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s on käytettävissä vain kerran\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Tavun arvo %s on virheellinen.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Aikaväli %s on virheellinen\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Aikaväli %s on virheellinen\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Arvo %s on virheellinen.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Otsake %s on virheellinen.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Virheellinen WARC-otsake %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Edistymistyyppi %s on virheellinen.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Virheellinen rajoite %s,\n"
+" valitse [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Koodaus %s on virheellinen\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Muunnosta muodosta %s muotoon %s ei tueta\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Kohdattu puutteellinen tai virheellinen monitavusekvenssi\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Käsittelemätön errno-virhenumero %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: maa-asetusto on asettamatta\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode epäonnistui (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "yhdistäminen %s-porttiin %d epäonnistui: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Ohjataan tulostus tiedostoon %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; loki poistettu käytöstä.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Käyttö: %s [VALITSIN]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Pitkien valitsinten pakolliset argumentit ovat pakollisia myös lyhyille.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Käynnistys:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version näytä Wget-versio ja lopeta\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help näytä tämä ohje\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background siirry taustalle käynnistyksen jälkeen\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=KOMENTO suorita â€.wgetrcâ€-tyylinen komento\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Loki- ja syötetiedostot:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=TIEDOSTO kirjaa viestit TIEDOSTOon\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=TIEDOSTO lisää viestit TIEDOSTOon\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug näytä paljon vianetsintätietoja\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug näytä â€Watt-32â€-vianjäljitystuloste\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet ole hiljaa (ei tulostusta)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose näytä yksityiskohtia (oletus)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose ei yksityiskohtia, muttei hiljainen\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYYPPI tulosta kaistanleveys TYYPPInä. TYYPPI "
+"voi olla â€bitsâ€\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=TIEDOSTO lataa paikalliset tai ulkoisesta\n"
+" TIEDOSTOsta löydetyt URLit\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --metalink-file lataa paikalliset tai ulkoisesta metalink-"
+"TIEDOSTOsta löydetyt verkko-osoitteet.\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html käsittele syötetiedosto HTML:nä\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL ratkaisee HTML-syötetiedostolinkit (-i -"
+"F)\n"
+" URL-osoitteen suhteen\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=TIEDOSTO määrittele käytettävä asetustiedosto\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies älä lue mitään asetustiedostoa\n"
+
+#: src/main.c:641
+#, fuzzy
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " -o, --output-file=TIEDOSTO kirjaa viestit TIEDOSTOon\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Noutaminen:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=MÄÄRÄ yrityskertojen MÄÄRÄ (0 on rajaton)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused yritä uudelleen vaikka yhteys "
+"torjuttaisiin\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr " --ignore-tags=LISTA lista ohitettavista HTML-tageista\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=TIEDOSTO kirjoita dokumentit TIEDOSTOon\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber ohita noudot, jotka korvaisivat jo\n"
+" olemassaolevia tiedostoja\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-cookies älä lue mitään config-tiedostoa\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue jatka osittain noudetun tiedoston "
+"lataamista\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=KOHTA aloita noutaminen nollakantaisesta "
+"KOHDAsta\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYYPPI valitse edistymismittarin tyyppi\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress näytä edistymispalkki kaikissa "
+"yksityiskohtatiloissa\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nouda vain paikallista uudemmat "
+"tiedostot\n"
+
+#: src/main.c:671
+#, fuzzy
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-use-server-timestamps älä aseta paikallisen tiedoston "
+"aikaleimaa\n"
+" palvelimen aikaleimalla\n"
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps älä aseta paikallisen tiedoston "
+"aikaleimaa\n"
+" palvelimen aikaleimalla\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response näytä palvelimen vastaus\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider älä nouda mitään\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=SEKUNNIT kaikkien aikakatkaisujen pituus\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNNIT nimipalveluhaun aikakatkaisun pituus\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=SEKUNNIT yhdistämisen aikakatkaisun pituus\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SEKUNNIT vastaanoton aikakatkaisun pituus\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNNIT odota SEKUNNIT noutojen välillä\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNNIT odota 1...SEKUNNIT noutojen "
+"uudelleenyritysten välillä\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait odota 0,5*ODOTUS...1,5*ODOTUS sekuntia "
+"noutojen välillä\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy älä käytä välityspalvelinta\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=KOKO aseta noutokiintiön KOKO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=OSOITE sido OSOITTEeseen (konenimi tai IP) "
+"paikallisesti\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=NOPEUS rajoita noutoNOPEUS\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache älä säilytä nimipalvelutietoja "
+"välimuistissa\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=KÄYT käytä vain KÄYTtöjärjestelmän\n"
+" sallimia tiedostonimiä\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case älä huomioi merkkikokoa verratessa\n"
+" tiedostoja/hakemistoja\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+" -4, --inet4-only ota yhteyttä vain IPv4-osoitteisiin\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+" -6, --inet6-only ota yhteyttä vain IPv6-osoitteisiin\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=PERHE ota yhteyttä ensin PERHEen määrittemään "
+"osoitteeseen,\n"
+" vaihtoehdot: IPv6, IPv4 tai none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=KÄYTTÄJÄ aseta FTP- ja HTTP-käyttäjänimeksi "
+"KÄYTTÄJÄ\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=SALASANA aseta FTP- ja HTTP-salasanaksi SALASANA\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --password=SALASANA kysele salasanoja\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri poista IRI-tuki käytöstä\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KOOD käytä KOODia paikallisena koodauksena IRI:"
+"eille\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOOD käytä KOODia etäkoodauksen oletuksena\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink poista tiedosto ennen päällekirjoitusta\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --no-glob älä täydennä tiedostonimiä\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Hakemistot:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories älä luo hakemistoja\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories pakotettu hakemistojen luonti\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories älä luo konenimihakemistoja\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories käytä yhteyskäytännön nimeä "
+"hakemistoissa\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=ETULIITE tallenna tiedostot hakemistoon "
+"ETULIITE/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr " --cut-dirs=LUKU ohita ensimmäiset LUKU hakemistoa\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-valitsimet:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=KÄYTTÄJÄ aseta HTTP-käyttäjänimeksi KÄYTTÄJÄ\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-passwd=SALA aseta HTTP-salasanaksi SALA\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache älä salli palvelimelle välivarastoitua "
+"dataa\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NIMI Vaihda oletussivun nimi (normaalisti\n"
+" â€index.htmlâ€.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension tallenna HTML/CSS-dokumentit oikeilla "
+"tiedostopäätteillä\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length älä huomioi â€Content-Length†-"
+"otsakekenttää\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=MERKKIJONO lisää MERKKIJONO otsakkeiden sekaan\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect uudelleenohjausten sallittu enimmäismäärä "
+"sivua kohden\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=KÄYTTÄJÄ aseta välityspalvelimen KÄYTTÄJÄnimi\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-passwd=SALASANA aseta välityspalvelimen SALASANA\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL liitä â€Referer: URL†-otsake HTTP-"
+"pyyntöön\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers tallenna HTTP-otsakkeet tiedostoon\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTTI esittäydy Wget/VERSIOn sijaan AGENTTIna\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive ota pois käytöstä jatkuvat yhteydet\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies älä käytä evästeitä\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=TIEDOSTO lataa evästeet ennen istuntoa "
+"TIEDOSTOsta\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=TIEDOSTO tallenna evästeet istunnon jälkeen "
+"TIEDOSTOon\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies hae ja tallenna (ei-pysyvät) "
+"istuntoevästeet\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=MERKKIJONO käytä POST-metodia; lähetä MERKKIJONO "
+"datana\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=TIEDOSTO käytä POST-metodia; lähetä TIEDOSTOn "
+"sisältö\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=METODI käytä metodia â€METODI†pyynnössä\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=MERKKIJONO Lähetä MERKKIJONO datana. --method ON "
+"annettava\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=TIEDOSTO Lähetä TIEDOSTOn sisältö. --method ON "
+"annettava\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition noudata Content-Disposition-otsakettan\n"
+" paikallisten tiedostonimien valinnassa "
+"(KOKEELLINEN)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error tulosta vastaanotettu sisältö "
+"palvelinvirheistä\n"
+
+# Challenge viittaa tässä ilmeisesti challenge-response method eli haastemenetelmään
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Lähetä Basic HTTP -todennustiedot\n"
+" odottamatta ensin palvelimen\n"
+" haastetta\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) -valitsimet:\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR valitse turvayhteyskäytäntö, vaihtoehdot:\n"
+" auto, SSLv2, SSLv3, TLSv1 ja PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only seuraa vain turvallisia HTTPS-linkkejä\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate älä tarkista palvelimen varmennetta\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=TIEDOSTO asiakasvarmennetiedosto\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYYPPI asiakasvarmenteen tyyppi: PEM tai DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=TIEDOSTO yksityisen avaimen tiedosto\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYYPPI yksityisen avaimen tyyppi: PEM tai DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=TIEDOSTO CA-varmennenippu\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=HAKEMISTO CA-varmenteiden tiivistelistan tiedosto\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=TIEDOSTO juurivarmennekokoelma\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=TIEDOSTO satunnaista dataa SSL PRNG:n siemeneksi\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=TIEDOSTO EGD-soketin nimeävä tiedosto, josta saa "
+"satunnaista dataa\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS-valitsimet:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+" --no-cache älä käytä palvelimelle välivarastoitua "
+"dataa\n"
+
+#: src/main.c:893
+#, fuzzy
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr " -v, --verbose näytä yksityiskohtia (oletus)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-valitsimet:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Käytä Stream_LF-muotoa kaikille "
+"binäärisille FTP-tiedostoille\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=KÄYTTÄJÄ aseta FTP-käyttäjänimi\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=SALASANA aseta FTP-salasana\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing älä poista â€.listingâ€-tiedostoja\n"
+
+# semi-fuzzy
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob älä täydennä tiedostonimiä\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp älä käytä â€passiveâ€-siirtotapaa\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions säilytä etätiedoston oikeudet\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks rekursiossa: hae linkitetyt tiedostot\n"
+" (ei hakemistoja)\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "FTP-valitsimet:\n"
+
+#: src/main.c:923
+#, fuzzy
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftp-stmlf Käytä â€Stream_LFâ€-muotoa kaikille "
+"binäärisille FTP-tiedostoille\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC-valitsimet:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=TIEDOSTO tallenna pyyntö-/vastaustiedot .warc.gz-"
+"tiedostoon\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=MERKKIJONO lisää MERKKIJONO warcinto-tietueeseen\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=KOKO aseta WARC-tiedostojen enimmäisKOKO\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx kirjoita CDX-indeksitiedostot\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=TIEDOSTO älä tallenna tässä CDX-tiedostossa "
+"lueteltuja tietueita\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression älä tiivistä WARC-tiedostoja GZIPillä\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests älä laske SHA1-tiivisteitä\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log älä tallenna lokitiedostoa WARC-"
+"tietueeseen\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=HAKEMISTO WARC-kirjoittimen luomien "
+"tilapäistiedostojen\n"
+" sijainti\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursiivinen nouto:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive nouda rekursiivisesti\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=LUKU rekursion enimmäissyvyys (inf ja 0 on "
+"ääretön)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after poista paikalliset tiedostot noudon "
+"jälkeen\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links muuta noudettujen HTML- ja CSS-"
+"tiedostojen linkit\n"
+" osoittamaan paikallisiin tiedostoihin\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N kierrätä enintään N varmuuskopiotiedostoa "
+"ennen\n"
+" tiedoston X kirjoittamista\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted varmuuskopioi nimellä â€X_orig†ennen\n"
+" tiedoston X muuntamista\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted varmuuskopioi nimellä â€X.orig†ennen\n"
+" tiedoston X muuntamista\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror oikovalitsin, sama kuin -r -N -l inf --no-"
+"remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites nouda kaikki kuvat yms. HTML-sivun\n"
+" näyttämiseen tarvittava\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments ota käyttöön HTML-kommenttien tiukka\n"
+" käsittely (SGML)\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursiivinen hyväksyntä/hylkäys:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA pilkuin eroteltu lista hyväksyttävistä "
+"päätteistä\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA pilkuin eroteltu lista lista hylättävistä "
+"päätteistä\n"
+
+#: src/main.c:996
+#, fuzzy
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX säännöllisten lauseiden täsmäys "
+"hyväksyttyihin verkko-osoitteisiin\n"
+
+#: src/main.c:998
+#, fuzzy
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX säännöllisten lauseiden täsmäys "
+"torjuttuihin verkko-osoitteisiin\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYYPPI säännöllisen lausekkeen tyyppi (posix|"
+"pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TYYPPI säännöllisen lausekkeen tyyppi (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA pilkuin eroteltu lista hyväksyttävistä "
+"verkkotunnuksista\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA pilkuin eroteltu lista hylättävistä "
+"verkkotunnuksista\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp seuraa HTML-dokumenttien FTP-linkkejä\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA pilkuin eroteltu lista lista "
+"seurattavista\n"
+" HTML-tunnisteista\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA pilkuin eroteltu lista ohitettavista\n"
+" HTML-tunnisteista\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative seuraa vain suhteellisia linkkejä\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTA lista sallituista hakemistoista\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names käytä uudelleenohjaus-URLin viimeisen\n"
+" komponentin määrittelemää nimeä\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LISTA lista poissuljetuista hakemistoista\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent älä nouse hakemistorakenteessa\n"
+
+#: src/main.c:1031
+#, fuzzy
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Ilmoita virheistä ja ehdotuksista (englanniksi) osoitteeseen <bug-wget@gnu."
+"org>.\n"
+"Ilmoita käännösvirheistä osoitteeseen <translation-team-fi@lists.sourceforge."
+"net>\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, ei-vuorovaikutteinen verkkonoudin.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Salasana käyttäjälle %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Salasana: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Putken luominen epäonnistui\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Salasana käyttäjälle %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Maa-asetusto: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Käännöskomento: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Linkityskomento: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s käännetty %s-järjestelmällä.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (ympäristö)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (käyttäjä)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (järjestelmä)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Lisenssi GPLv3+: GNU GPL versio 3 tai myöhempi\n"
+"<https://gnu.org/licenses/gpl.html>.\n"
+"Tämä on vapaa ohjelmisto; sitä saa vapaasti muuttaa ja levittää edelleen.\n"
+"Siinä määrin kuin laki sallii, TAKUUTA EI OLE.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Alun perin kirjoittanut Hrvoje Nikšić <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Lähetä vikailmoitukset ja kysymykset (englanniksi) osoitteeseen <bug-"
+"wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Muistinvarausongelma\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Poistutaan virheen vuoksi kohteessa %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Lisää valitsimia komennolla â€%s --helpâ€.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: virheellinen valitsin – â€-n%câ€\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Vianjäljitystukea ei ole käännetty mukaan. Ohitetaan --debug-lippu.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Sekä valitsin --no-clobber että --convert-links annettiin, vain --convert-"
+"links tulee käyttöön.\n"
+
+#: src/main.c:1608
+#, fuzzy, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"On määritelty sekä --no-clobber että --convert-links -valitsimet, vain "
+"valitsinta --convert-links käytetään.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ei voi näyttää yksityiskohtia ja olla hiljaa yhtä aikaa.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Vanhoja tiedostoja ei voi aikaleimata ja jättää koskematta yhtä aikaa.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Valitsimia --inet4-only ja --inet6-only ei voi käyttää yhdessä.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Argumentteja â€-k†ja â€-O†ei voi määritellä, jos on annettu useita verkko-"
+"osoitteita, tai\n"
+"yhdessä argumenttien â€-p†tai â€-r†kanssa. Lisätietoja käsikirjasta.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"VAROITUS: valitsin -O yhdessä -r:n tai -p:n kanssa tarkoittaa, että kaikki\n"
+"noudettu sisältö kirjoitetaan yhteen antamaasi tiedostoon.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"VAROITUS: aikaleimausta ei tapahdu käytettäessä valitsinta -O. Lisätietoja\n"
+"käsikirjassa.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC-tuloste ei toimi valitsimen --no-clobber kanssa, --no-clobber otetaan "
+"pois käytöstä.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC-tuloste ei toimi aikaleimauksen kanssa, aikaleimaus otetaan pois "
+"käytöstä.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC-tuloste ei toimi valitsimen --spider kanssa.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-tuloste ei toimi valitsimen --continue tai --start-pos kanssa, ne "
+"otetaan pois käytöstä.\n"
+
+#: src/main.c:1729
+#, fuzzy, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Tiivisteen on otettu pois käytöstä; WARC-uudelleenkahdentuma ei löydä "
+"tietueiden kaksoiskappaleita.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-tuloste ei toimi valitsimen --continue tai --start-pos kanssa, ne "
+"otetaan pois käytöstä.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Valitsimia --ask-password ja --password ei voi käyttää yhdessä.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Valitsimien --start-pos ja --continue käyttöä yhdessä ei suositella; --"
+"continue poistetaan käytöstä.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: puuttuva URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Valitsimia --post-data ja --post-file ei voi käyttää yhdessä.\n"
+
+#: src/main.c:1841
+#, fuzzy, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Valitsinta --post-data tai --post-file ei voi käyttää valitsimen --method "
+"kanssa. Valitsin --method odottaa dataa valitsimien --body-data ja --body-"
+"file kautta"
+
+#: src/main.c:1850
+#, fuzzy, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Metodi on määriteltävä valitsimen --method=HTTPMethod kautta käytettäväksi "
+"valitsimella --body-data tai --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Valitsimia --body-data ja --body-file ei voi käyttää yhdessä.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Tässä versiossa ei tueta IRI:jä\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"valitsinta -k tai -r voidaan käyttää -O:n kanssa vain jos tulostetaan "
+"tavalliseen tiedostoon.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"valitsinta --convert-links ja --convert-file-only voidaan käyttää "
+"yhdessävain jos tulostetaan tavalliseen tiedostoon.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Symbolisen linkin %s poistaminen epäonnistui: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "IP-osoitteen â€%s†jäsentäminen epäonnistui\n"
+
+#: src/main.c:2060
+#, fuzzy, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "VIRHE: Varmenteen %s: (%d) avaaminen epäonnistui.\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Tiedostosta %s ei löytynyt URLeja.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Tiedoston %s poistaminen epäonnistui: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"VALMIS --%s--\n"
+"Seinäkelloaika yhteensä: %s\n"
+"Noudettu: %d tiedostoa, %s ajassa %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Noudon %s tavun kiintiö YLITETTY!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Välityspalvelintunnelointi epäonnistui: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Suojattu metalink-tiedosto: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Hylätään metalink-tiedosto. Vaarallinen nimi.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Hylätään metaurl-tiedosto %s. Vaarallinen nimi.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Tiedoston %s poistaminen epäonnistui: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Resurssityyppi %s ei ole tuettu, ohitetaan...\n"
+
+#: src/metalink.c:509
+#, fuzzy
+msgid "Could not open downloaded file.\n"
+msgstr "WARC-tiedoston avaaminen epäonnistui.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Lasketaan koko tiedostolle %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Noudettavan tiedoston kokoa ei voitu selvittää.\n"
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Tiedostoa %s ei ole.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Koko täsmää.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Tarkistussumma täsmää.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Noudettua tiedostoa ei voitu avata allekirjoituksen tarkistamista varten.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Allekirjoituksen oikeellisuustarkistus onnistui.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Allekirjoitus ei kelpaa. Hylätään resurssi.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Data vastaa allekirjoitusta, mutta allekirjoitus ei ole luotettu.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Tarkistussummia ei löytynyt.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Tiedosto %s haettu, mutta koko ei täsmää. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Tiedosto %s haettu, mutta tarkistussumma ei täsmää.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Tiedosto %s haettu, mutta allekirjoitus ei täsmää. \n"
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Poistetaan %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Suoritus jatkuu taustalla.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Suoritus jatkuu taustalla, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Tuloste kirjoitetaan tiedostoon %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() epäonnistui\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() epäonnistui\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Käyttökelpoista sokettiajuria ei löytynyt.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() epäonnistui. Soketin asettaminen estäväksi epäonnistui.\n"
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: varoitus: %s-merkintä esiintyy kaikkien koneiden nimien edessä\n"
+
+#: src/netrc.c:414
+#, fuzzy, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: tuntematon merkki â€%sâ€\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Käyttö: %s NETRC [KONENIMI]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: tiedoston %s tilan lukeminen epäonnistui: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "VAROITUS: käytetään heikkoa satunnaissiementä.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"PRNG:n alustaminen epäonnistui; harkitse --random-file -valitsimen käyttöä.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "OpenSSL-versiosi on liian vanha tukeakseen TLSv1.3-yhteyskäytäntöä\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "OpenSSL-versiosi on liian vanha tukeakseen TLSv1.1-yhteyskäytäntöä\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "OpenSSL-versiosi on liian vanha tukeakseen TLSv1.2-yhteyskäytäntöä\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: toteuttamaton ’secure-protocol’-valitsinarvo %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"PRNG:n alustaminen epäonnistui; harkitse â€--random-fileâ€-valitsimen "
+"käyttöä.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: kohteen %s varmenteen todentaminen epäonnistui, myöntäjä: %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Myöntäjän valtuutuksen todentaminen paikallisesti epäonnistui.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Itse allekirjoitettu varmenne kohdattu.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Myönnetty varmenne ei ole vielä voimassa.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Myönnetty varmenne on vanhentunut.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: varmenteen aiheen vaihtoehtoinen nimi ei täsmää\n"
+"\tpyydetyn konenimen %s kanssa.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: varmenteen yleinen nimi %s ei täsmää pyydettyyn konenimeen %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: varmenteen yleinen nimi on virheellinen (sisältää NUL-merkin).\n"
+" Tämä saattaa olla merkki siitä, että kone ei ole se, joka väittää\n"
+" olevansa (toisin sanoen se ei ole aito %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Ottaaksesi yhteyden kohteeseen %s:n turvattomasti, käytä â€--no-check-"
+"certificateâ€-valitsinta.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ ohitetaan %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Pistetyylin määrittely %s on virheellinen; jätetään muuttamatta.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " arvio %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " kului "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "REAALIAIKAkellon taajuutta ei saatu: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Poistetaan %s, koska sen pitäisi olla hylätty.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Tiedoston %s avaaminen epäonnistui: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Ladataan robots.txt, älä välitä virheistä.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Virhe tulkittaessa välityspalvelimen URLia %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Virhe välityspalvelimen URLissa %s: Oltava HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d uudelleenohjausta ylitetty.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Luovutetaan.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Yritetään uudelleen.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Ei löydetty rikkinäisiä linkkejä.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Löydettiin %d rikkinäinen linkki.\n"
+"\n"
+msgstr[1] ""
+"Löydettiin %d rikkinäistä linkkiä.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ei virhettä"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Kaavaa %s ei tueta"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Kaava puuttuu"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Virheellinen konenimi"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Portin numero on virheellinen"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Käyttäjätunnus on virheellinen"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Päättämätön numeerinen IPv6-osoite"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-osoitteita ei tueta"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Virheellinen numeerinen IPv6-osoite"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS-tukea ei ole käännetty koodiin"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Kohdattu muuntumaton monitavusekvenssi\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Riittävän muistin varaaminen epäonnistui, muisti loppui.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Muisti loppui, %ld tavun varaaminen epäonnistui.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: tekstipuskuri on liian iso (%ld tavua), keskeytetään.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Ohjelman suoritus jatkuu taustalla, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Symbolisen linkin %s poistaminen epäonnistui: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "VIRHE: Varmenteen %s: (%d) avaaminen epäonnistui.\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Evästeiden hakeminen kohteelle %s epäonnistui\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, fuzzy, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Tiedosto %s muuttui edellisen tarkastuksen jälkeen. Turvatarkastus "
+"epäonnistui."
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "VIRHE: Varmenteen %s: (%d) avaaminen epäonnistui.\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Symbolisen linkin %s poistaminen epäonnistui: %s\n"
+
+#: src/utils.c:953
+#, fuzzy, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Tiedosto %s muuttui edellisen tarkastuksen jälkeen. Turvatarkastus "
+"epäonnistui."
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Virheellinen säännöllinen lauseke %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Virheellinen säännöllinen lauseke %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Virhe täsmättäessä tiedostoon %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Virhe avattaessa WARC-tiedostoa %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Virhe avattaessa WARC-tiedostoa %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Virhe avattaessa WARC-tiedostoa %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Virhe avattaessa GZIP-vuota WARC-tiedostoon.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "WARC-tiedostoon kirjoittaminen epäonnistui.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Avataan WARC-tiedosto %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Virhe avattaessa WARC-tiedostoa %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"CDX-tiedosto ei luettele alkuperäisiä verkko-osoitteita. (Puuttuva sarake "
+"'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX-tiedosto ei luettele tarkistussummia. (Puuttuva sarake 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX-tiedosto ei luettele tietuetunnisteita. (Puuttuva sarake 'u'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Ladattu %d tietue CDX-tiedostosta.\n"
+"\n"
+msgstr[1] ""
+"Ladattu %d tietuetta CDX-tiedostosta.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+"Kaksoiskappaledatan eliminointi CDX-tiedostoa %s lukemalla epäonnistui.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Tilapäisen WARC-manifest-tiedoston avaaminen epäonnistui.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Tilapäisen WARC-lokitiedoston avaaminen epäonnistui.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "WARC-tiedoston avaaminen epäonnistui.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "CDX-tiedoston avaus tulostamista varten epäonnistui.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Tilapäisen WARC-tiedoston avaaminen epäonnistui.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Tarkka vastaavuus löytyi CDX-tiedostossa. Tallennetaan revisit-tietue WARC-"
+"tiedostoon.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Tuntematon järjestelmävirhe"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Konenimen osoiteperhe ei ole tuettu"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Virheellinen arvo ai_flags-kentälle"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Korjautumaton häiriö nimenselvityksessä"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family ei ole tuettu"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Muistinvarausvirhe"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Konenimeen ei liity osoitetta"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nimi tai palvelu on tuntematon"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "â€Servname†ei ole tuettu â€ai_socktypeâ€:lle"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype ei ole tuettu"
+
+#~ msgid "System error"
+#~ msgstr "Järjestelmävirhe"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumenttipuskuri on liian pieni"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Pyynnön käsittely käynnissä"
+
+#~ msgid "Request canceled"
+#~ msgstr "Pyyntö peruttu"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Pyyntöä ei peruttu"
+
+#~ msgid "All requests done"
+#~ msgstr "Kaikki pyynnöt suoritettu"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Signaalin keskeyttämä"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametrimerkkijono on väärin koodattu"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: valitsin â€%s%s†on moniselitteinen\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: valitsin â€%s%s†on moniselitteinen; vaihtoehdot:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: tunnistamaton valitsin â€%s%sâ€\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: valitsin â€%s%s†ei salli argumenttia\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: valitsin â€%s%s†vaatii argumentin\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: virheellinen valitsin -- ’%c’\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: valitsin vaatii argumentin -- ’%c’\n"
+
+#~ msgid "`"
+#~ msgstr "â€"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "Onnistui"
+
+#~ msgid "No match"
+#~ msgstr "Ei vastaavuutta"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Virheellinen säännöllinen lauseke"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Virheellinen vertailumerkki"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Virheellinen merkkiluokan nimi"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Kenoviiva lopussa"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Virheellinen takaisinviittaus"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Pariton [, [^, [:, [. tai [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Pariton ( tai \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Pariton \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Virheellinen \\{\\}:n sisältö"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Virheellinen välin loppu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Muisti loppu"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Virheellinen edeltävä säännöllinen lauseke"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Ennenaikainen säännöllisen lausekkeen loppu"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Liian suuri säännöllinen lauseke"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Pariton ) tai \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ei aiempaa säännöllistä lauseketta"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "putken luominen epäonnistui"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s-aliprosessi epäonnistui"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle epäonnistui"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "epäonnistunut tiedostotunnisteen %d palautus: dup2 epäonnistui"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s-aliprosessi"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s-aliprosessi vastaanotti fataalin signaalin %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "muisti loppui"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: valitsin ’--%s’ ei salli argumenttia\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: tunnistamaton valitsin ’--%s’\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: valitsin ’-W %s’ ei salli argumenttia\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: valitsin ’-W %s’ vaatii argumentin\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode ei onnistunut (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s vastaanotettu.\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Tiedostoa â€%s†ei noudeta, koska se on jo paikalla.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Todentaminen epäonnistui.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries määritä uudelleenyritysten lukumäärä "
+#~ "tiedostolle.\n"
+#~ " (on käytettävä valitsimen --metalink-"
+#~ "file kanssa)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr ""
+#~ " --jobs määritä, kuinka monta säiettä "
+#~ "käytetään.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Käyttäjänimeä ja salasanaa ei tarvitse määritellä, kun ne ladataan "
+#~ "kohteesta metalink.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s ei voida käyttää valitsimen --metalink kautta.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Tulostusmuoto:\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "VAROITUS: Vakiotulosteen avaus uudelleen binääritilassa epäonnistui;\n"
+#~ " haettu tiedosto saattaa sisältää sopimattomia rivipäätteitä.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: valitsin ei kelpaa – %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s käännetty käyttöjärjestelmälle VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Nykyinen ylläpitäjä Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=VERKKO-OSOITE lisää VERKKO-OSOITE suhteellisten "
+#~ "linkkien alkuun\n"
+#~ " â€-F -iâ€-valintojen määrittelemään "
+#~ "tiedostoon.\n"
+
+#~ msgid "Cannot specify -r, -p or -N if -O is given.\n"
+#~ msgstr ""
+#~ "Ei voida määritellä argumentteja â€-râ€, â€-p†tai â€-N†jos â€-O†on "
+#~ "annettu.\n"
+
+#~ msgid "Copyright (C) 2012 Free Software Foundation, Inc.\n"
+#~ msgstr "Copyright © 2012 Free Software Foundation, Inc.\n"
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644
index 0000000..623423c
--- /dev/null
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..2f99229
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,3767 @@
+# traduction française de wget
+# Copyright © 2010, 2012, 2013, 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-.
+# Nicolas Provost <nprovost@quadriv.com>, 2010.
+# David Prévot <david@tilapin.org>, 2012, 2013, 2015.
+# Stéphane Aulery <lkppo@free.fr>, 2016, 2017, 2019, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-12-16 02:43+0100\n"
+"Last-Translator: Stéphane Aulery <lkppo@free.fr>\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-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s : impossible de résoudre l’adresse liée %s ; désactivation de liaison "
+"(« bind »).\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Connexion à %s|%s|:%d… "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Connexion à %s:%d… "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Connexion à [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF échouée : %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "connecté.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "échec : %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s : impossible de résoudre l’adresse de l’hôte %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR échouée : %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Trop de descripteurs de fichier ouverts. Impossible d’utiliser « select » "
+"avec un descripteur >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Liens convertis dans %d fichiers en %s secondes.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Conversion des liens de %s… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "rien à faire.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Impossible de convertir les liens dans %s : %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Impossible de supprimer %s : %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Impossible d’archiver %s en %s : %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Impossible d’obtenir le cookie pour %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Erreur de syntaxe dans Set-Cookie: %s à la position %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Un cookie provenant de %s a tenté de changer le domaine en "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Impossible d’ouvrir le fichier des cookies %s : %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Erreur d’écriture dans %s : %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Erreur de fermeture pour %s : %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Type d’affichage non pris en charge, essai avec l’analyseur d’affichage de "
+"type UNIX.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index de /%s sur %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "heure inconnue "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fichier "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Répertoire "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Lien "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Incertain "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s octets)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Taille : %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) restant"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s restant"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (non certifiée)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Imposisble d’initialiser SSL. Il sera désactivé.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Ouverture de session en tant que %s… "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Erreur de réponse du serveur, fermeture de la connexion de contrôle.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Erreur de message de salutation du serveur.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Échec d’écriture, fermeture de la connexion de contrôle.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Le serveur refuse l’établissement de session.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Erreur d’établissement de session.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Session établie.\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Le serveur n’a pas accepté la commande « PBSZ 0 »\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Le serveur n’a pas accepté la commande « PROT %c »\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Erreur du serveur, impossible de déterminer le type de système.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "terminé. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "terminé.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Type « %c » inconnu, fermeture de la connexion de contrôle.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "terminé. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD n’est pas nécessaire.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Section logiquement impossible atteinte par getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"décompte_cwd : %d\n"
+" début_cwd : %d\n"
+" fin_cwd : %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Répertoire %s inexistant.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD n’est pas nécessaire.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fichier déjà récupéré.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Impossible d’initier le transfert PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Impossible d’analyser la réponse PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "impossible d’établir la connexion à %s sur le port %d : %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Erreur de liaison (« bind ») (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Port incorrect.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"ÉCHEC de REST, reprise depuis le début.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Le fichier %s existe.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Fichier %s inexistant.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Fichier %s inexistant.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Fichier ou répertoire %s inexistants.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s vient de s’annoncer comme existante.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s : %s, fermeture de la connexion de contrôle.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) — Connexion de transfert de données : %s ; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Connexion de contrôle fermée.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Abandon du transfert des données.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Fichier %s déjà présent ; pas de récupération.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(essai : %2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — envoi sur la sortie standard %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s sauvegardé [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Destruction de %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Utilisation de %s comme fichier temporaire d’affichage.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s supprimé.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Le niveau %d de récursivité dépasse le niveau maximal %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Le fichier distant n’est pas plus récent que le fichier local %s — pas de "
+"récupération.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Le fichier distant est plus récent que le fichier local %s — récupération.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Les tailles ne concordent pas (%s localement) — récupération.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nom de lien symbolique incorrect, ignoré.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Lien symbolique %s → %s déjà correct\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Création du lien symbolique %s → %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Liens symboliques non pris en charge, lien %s ignoré.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Répertoire %s ignoré.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s : type de fichier inconnu ou non pris en charge.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Impossible de définir les permissions pour %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s : horodatage corrompu.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Les répertoires ne seront pas récupérés, le niveau %d dépasse le maximum "
+"%d.\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "%s non parcouru puisqu’il est exclu ou non inclus.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Rejet de %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Rejet de %s (entrée invalide).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s non inclus ou exclus par regex.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Erreur — %s ne correspond pas à %s : %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Pas de concordance pour le motif %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Index écrit sous forme HTML dans %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Index écrit sous forme HTML dans %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "Erreur : impossible d’ouvrir le répertoire %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "Erreur : échec d’ouverture du certificat %s : (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Certificat de l’autorité de certification « %s » chargé\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+"Erreur : échec de chargement du fichier de liste de révocations de "
+"certificat « %s » : (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Fichier de liste de révocations de certificat « %s » chargé\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"Erreur : GnuTLS nécessite que la clef et le certificat soient de même type.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+"Votre version de GnuTLS est trop ancienne pour prendre en charge TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+"GnuTLS : valeur %u pour l’option « secure-protocol » non prise en charge\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Veuillez signaler cette anomalie à <bug-wget@gnu.org>\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"GnuTLS : valeur %d pour l’option « secure-protocol » non prise en charge\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS : impossible de définir directement la chaine de priorité. La "
+"priorité par défaut sera utilisée.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "Erreur"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "Avertissement"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s : pas de certificat présenté par %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s : le certificat de %s n’est pas de confiance.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s : le certificat de %s n’est pas d’un émetteur connu.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s : le certificat de %s a été révoqué.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s : le signataire de certificat de %s n’était pas une autorité.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s : le certificat de %s a été signé avec un algorithme non sécurisé.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s : le certificat de %s n’est pas encore activé.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s : le certificat de %s a expiré.\n"
+
+# FIXME: s/X509/X.509/
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Erreur d’initialisation du certificat X.509 : %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Aucun certificat trouvé\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Erreur d’analyse du certificat : %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Le certificat n’est pas encore activé\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Le certificat a expiré\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Le propriétaire du certificat ne correspond pas au nom d’hôte %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "La clef publique ne correspond pas à la clef publique fixe !\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Le certificat doit être X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Erreur dans le traitement de la liste d’adresses.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Hôte inconnu"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Échec temporaire de résolution de noms"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Erreur inconnue"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Résolution de %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "échec : pas d’adresse IPv4 ou IPv6 pour l’hôte.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "échec : délai d’attente expiré.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s : impossible de résoudre le lien incomplet %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"attribut no-follow rencontré dans %s. Les liens de la page seront ignorés.\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s : URL %s incorrecte : %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Échec d’écriture de la requête HTTP : %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Pas d’en-tête, HTTP/0.9 supposé"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Fichier %s déjà présent ; pas de récupération.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime() échouée. C’est probablement un bogue.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Impossible de convertir de timestamp au format HTTP. Utilisera l’heure 0 "
+"comme da te de dernière modification.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Fichier de données BODY %s manquant : %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Réutilisation de la connexion existante à [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Réutilisation de la connexion existante à %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr ""
+"Échec de lecture de la réponse du serveur mandataire (« proxy ») : %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s erreur %d : %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Ligne d’état mal formée"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Échec de tunnel du serveur mandataire (« proxy ») : %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Schéma d’authentification inconnu.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Authentification sélectionnée : %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Sauvegarde en : %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Pendant du téléchargement de signature:\n"
+"%s : %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Impossible de lire le contenu de la signature depuis le fichier temporaire. "
+"Ignoré.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Imposisble de créer le fichier temporaire. Sauter le téléchargement de la "
+"signature.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valeur pri invalide. Suppose %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Impossible de trouver un digest acceptable pour les ressources Metalink.\n"
+"Les ignorer.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Désactivation SSL à cause des erreurs rencontrées.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "requête %s transmise, en attente de la réponse… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Aucune donnée reçue.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Erreur de lecture (%s) dans les en-têtes.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(pas de description)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Emplacement : %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "non indiqué"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [suivant]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Le fichier %s n’a pas été modifié sur le serveur. Téléchargement sauté.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Le srveur à ignoré l’entête If-Modified-Since du fichier %s.\n"
+"Vous pourriez vouloir ajouter l’option --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Le fichier a déjà été complètement récupéré ; rien à faire.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Taille : "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignoré"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Avertissement : les jokers ne sont pas permis en HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"Mode « spider » activé. Vérification de l’existence d’un fichier distant.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Impossible d’écrire dans %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Attribut nécessaire manquant dans l’en-tête reçu.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Échec d’authentification par identifiant et mot de passe.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Impossible d’écrire dans le fichier WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Impossible d’écrire dans le fichier WARC temporaire.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Incapable d’établir une connexion SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Impossible de supprimer le lien %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "Erreur : redirection (%d) sans destination.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Impossible de trouver les données Metalink dans la réponse HTTP. "
+"Téléchargement du fichier via HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Entêtes Metalink trouvées. Passage en mode Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Le fichier distant n’existe pas — lien mort.\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "En-tête de dernière modification manquant — horodatage arrêté.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "En-tête de dernière modification incorrect — horodatage ignoré.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Le fichier du serveur n’est pas plus récent que le fichier local %s — pas de "
+"récupération.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Les tailles ne correspondent pas (%s localement) — récupération.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Le fichier distant est plus récent, récupération.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Le fichier distant existe et pourrait contenir des liens vers d’autres "
+"ressources — récupération en cours.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Le fichier distant existe mais ne contient aucun lien — pas de "
+"récupération.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Le fichier distant existe et pourrait contenir plusieurs liens,\n"
+"mais le mode récursif est désactivée — pas de récupération.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Le fichier distant existe.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "URL %s : %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — envoi vers sortie standard %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — %s sauvegardé [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) — Fermeture de la connexion à l’octet %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) — Erreur de lecture à l’octet %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) — Erreur de lecture à l’octet %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Qualité de protection « %s » non prise en charge.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algorithme « %s » non pris en charge.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s : WGETRC pointe vers %s qui n'est pas accessible à cause de l'erreur : "
+"%s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s : impossible de lire %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s : erreur dans %s à la ligne %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s : erreur de syntaxe dans %s à la ligne %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s : commande inconnue %s dans %s à la ligne %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Échec d’analyse du fichier système wgetrc (variable d’environnement "
+"SYSTEM_WGETRC). Veuillez vérifier\n"
+"« %s »,\n"
+"ou indiquer un autre fichier avec --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Échec d’analyse du fichier système wgetrc. Veuillez vérifier\n"
+"« %s »,\n"
+"ou indiquer un autre fichier avec --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s : avertissement : le wgetrc du système et celui de l’utilisateur pointent "
+"vers %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s : commande --execute %s incorrecte\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s : %s : valeur logique %s incorrecte ; utilisez « on » ou « off ».\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s : %s : %s incorrecte ; utilisez « on » ou « off ».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s : %s : nombre %s incorrect.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s : %s ne peut être utilisée qu’une fois\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s : %s : valeur d’octet %s incorrecte\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s : %s : période de temps %s incorrecte\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s : %s : période de temps négative %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass nécessite une chaîne ou l’activation de l’une des deux variables "
+"WGET_ASKPASS ou SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s : %s : valeur %s incorrecte.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s : %s : en-tête %s incorrect.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s : %s : en-tête WARC %s incorrect.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s : %s : type de progression %s incorrect.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s : %s : restriction %s incorrecte,\n"
+" utilisez [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "L’encodage %s est incorrect\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "La conversion de %s vers %s n’est pas prise en charge\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Séquence multioctet incomplète ou incorrecte rencontrée\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Erreur %d (errno) non gérée\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8 : les paramètres régionaux ne sont pas définis\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode (%d) échouée : %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Impossible de convertir en minuscules : %d : %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Redirection de la sortie vers %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s : %s ; désactivation de la journalisation.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Utilisation : %s [OPTION]… [URL]…\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Les arguments obligatoires pour les options au format long le sont\n"
+"aussi pour les options au format court.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Démarrage :\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version afficher la version de Wget et quitter\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help afficher l’aide-mémoire\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background passer en arrière plan après le "
+"démarrage\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMMANDE exécuter une commande de type « ."
+"wgetrc »\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Journalisation et fichier d’entrée :\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=FICHIER journaliser les messages dans le FICHIER\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FICHIER accoler les messages au FICHIER\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug afficher beaucoup d’informations de "
+"débogage\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug afficher la sortie de débogage Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+" -q, --quiet exécuter en mode silencieux (sans "
+"sortie)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose exécuter en mode bavard (mode par "
+"défaut)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose arrêter le mode bavard, sans être "
+"silencieux\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE afficher la bande passante en TYPE.\n"
+" TYPE peut être « bits » par "
+"exemple\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FICHIER télécharger les URL du FICHIER local ou "
+"dist\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FICHIER télécharger les files couverts dans le "
+"FICHIER Metalink local\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html traiter le fichier d’entrée comme du "
+"HTML\n"
+
+# s/resolves/resolve/
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL résoudre les liens HTML du fichier "
+"d’entrée\n"
+" (-i -F) en relatif par rapport à URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FICHIER FICHIER de configuration à utiliser\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config ne lire aucun fichier de configuration\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FICHIER journaliser les rejets d’URL dans le "
+"FICHIER\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Téléchargement :\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NOMBRE définir le NOMBRE de tentatives\n"
+" (0 indique l’absence de limite)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused réessayer même si la connexion est "
+"refusée\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERRORS liste de code d'erreur HTTP à "
+"réessayer, séparés par\n"
+" des virgules\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+" -O, --output-document=FICHIER écrire les documents dans le FICHIER\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber sauter les téléchargements de fichiers\n"
+" déjà existants (qui auraient été "
+"écrasés)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc ne pas utiliser les identifiants de "
+"connexion de .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue poursuivre le téléchargement d’un\n"
+" fichier incomplet\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POSITION commencer le téléchargement à partir de "
+"la\n"
+" POSITION commençant à zéro\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYPE sélectionner le TYPE de jauge de "
+"progression\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress montrer la barre de progression quelque "
+"soit\n"
+" le mode\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ne pas retélécharger les fichiers sauf "
+"s’ils\n"
+" sont plus récents que localement\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ne pas utiliser la condition la requête "
+"conditionnelle if-modified-since\n"
+" en mode timestamping\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ne pas définir la date du fichier local "
+"à\n"
+" celle du serveur\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response afficher la réponse du serveur\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ne rien télécharger\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDE définir toutes les valeurs de délai "
+"d’attente\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADDRESSES liste des serveurs DNS à contacter "
+"(séparée par des virgules)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESSE lier le solveur DNS à l’ADRESSE (nom "
+"d’hôte ou adresse IP) de l’hôte local\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECONDE définir le délai d’attente de résolution "
+"DNS\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECONDE définir le délai d’attente de connexion\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECONDE définir le délai d’attente de lecture\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SECONDE temps d’attente entre les essais\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECONDE temps d’attente maximal entre les essais\n"
+
+# NOTE: Long line
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait temps d’attente aléatoire : avec un "
+"coefficient\n"
+" compris entre 0,5 et 1,5 du temps "
+"d’attente\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy désactiver le serveur mandataire "
+"(« proxy »)\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NOMBRE définir le quota de récupération à "
+"NOMBRE\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESSE lier localement (nom d’hôte ou adresse "
+"IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=TAUX limiter le TAUX de téléchargement\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache désactiver la mise en cache de recherches "
+"DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=SE limiter caractères du système "
+"d’exploitation\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignorer la casse pour la correspondance "
+"des\n"
+" fichiers ou répertoires\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+" -4, --inet4-only ne se connecter qu’aux adresses IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+" -6, --inet6-only ne se connecter qu’aux adresses IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILLE se connecter de préférence aux adresses "
+"de la\n"
+" FAMILLE : IPv6, IPv4 ou "
+"« none » (aucune)\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=IDENTIFIANT définir l’IDENTIFIANT pour FTP et HTTP\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=MOT_DE_PASSE définir le MOT_DE_PASSE pour FTP et HTTP\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password demander les mots de passe\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMMAND spécifie l’accréditation pour les "
+"requêtes \n"
+" le login et le mot de passe. If aucure "
+"COMMAND n’est \n"
+" spécifiée, la variable d’environnement "
+"WGET_ASKPASS \n"
+" ou the SSH_ASKPASS est used.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+" --no-iri désactiver la prise en charge des IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC utiliser l’encodage local ENC pour les "
+"IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC utiliser l’encodage distant ENC par "
+"défaut\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink supprimer le fichier avant de l’écraser\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash conserve les fichiers de somme de "
+"contrôle qui ne correspondent pas (ajoute .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NOMBRE Metalink application/metalink4+xml "
+"metaurl NOMBRE\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http utiliser les métadonnées Metalink des "
+"entêtes de réoonse HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location localisation préférée des resources "
+"Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr activer le stockage des métadonnées dans les "
+"attributs de fichier étendus\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Répertoires :\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ne pas créer de répertoires\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories forcer la création de répertoires\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories ne pas créer de répertoires sur l’hôte\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories utiliser des répertoires au nom du "
+"protocole\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=PRÉFIXE sauvegarder les fichiers dans PRÉFIXE/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NOMBRE ignorer NOMBRE composants de répertoire\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Options HTTP :\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=IDENTIFIANT définir l’IDENTIFIANT HTTP\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=MDP définir le mot de passe HTTP\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache interdire données mises en cache du "
+"serveur\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NOM modifier le nom de la page par défaut\n"
+" (normalement « index.html »)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension sauvegarder les documents HTML et CSS "
+"avec\n"
+" leur extension\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignorer le champ d’en-tête « Content-"
+"Length »\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=CHAÎNE insérer la CHAÎNE dans les en-têtes\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYPE choix de la compression parmi : auto, "
+"gzip, none (défaut : none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect nbre maxi de redirections autorisées par "
+"page\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=IDENTIFIANT définir l’IDENTIFIANT du serveur "
+"mandataire\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=MDP définir le mot de passe du serveur "
+"mandataire\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inclure l’en-tête « Referer: URL » en "
+"requête\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers sauvegarder les en-têtes HTTP dans le "
+"fichier\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT s’identifier comme AGENT et non Wget/"
+"VERSION\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive désactiver les connexions persistantes\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ne pas utiliser les cookies\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FICHIER charger les cookies du FICHIER avant "
+"session\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FICHIER sauvegarder cookies en FICHIER après "
+"session\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies charger et sauvegarder les cookies de "
+"session\n"
+" (non permanents)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=CHAÎNE utiliser la méthode POST pour envoyer "
+"CHAÃŽNE\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FICHIER utiliser POST ; envoyer le contenu du "
+"FICHIER\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=MéthodeHTTP utiliser la « MéthodeHTTP » dans l’en-"
+"tête\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=CHAÎNE envoyer la CHAÎNE comme données.\n"
+" --method doit être définie\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FICHIER envoyer le contenu du FICHIER.\n"
+" --method doit être définie\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition respecter l’en-tête « Content-"
+"Disposition »\n"
+" pour les noms de fichiers locaux "
+"(expérim.)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error afficher le contenu reçu après erreurs "
+"serveur\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge envoyer les informations "
+"d’authentification\n"
+" HTTP de base sans attendre d’abord la\n"
+" question du serveur\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Options HTTPS (SSL/TLS) :\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR choisir un protocole sécurisé PR parmi "
+"auto,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 et PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only ne suivre que les liens HTTPS sécurisé\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ne pas valider le certificat du serveur\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FICHIER fichier de certificat client\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE type du certificat client, PEM ou DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FICHIER fichier de clef privée\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TYPE type de clef privée, PEM ou DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=FICHIER fichier des certificats d’autorités\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=RÉP répertoire contenant liste de hachages "
+"des\n"
+" certificats d’autorités de "
+"certification\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=FICHIER fichier de liste de révocations de "
+"certificat\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASHES fichier de clef publique (PEM/DER), ou "
+"tout nombre\n"
+" de hash sha256 encodé en base64 précédé "
+"de \n"
+" 'sha256//' et séparé par ';', pour "
+"vérification\n"
+" les paires\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FICHIER fichier de données aléatoires pour "
+"initier la\n"
+" génération de nombres pseudoaléatoires "
+"SSL\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FICHIER fichier de socket EGD avec données "
+"aléatoires\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Défini la priorité STR (GnuTLS) ou la list de "
+"cipher STR (OpenSSL) diretement.\n"
+" Uiliser avec précaution. Cette option "
+"écrase --secure-protocol.\n"
+" Le format et la syntaxe de STR dépend du "
+"moteur SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Options HSTS :\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts désactiver HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file chemin de la base de données HSTS "
+"(écrasera l’existant)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Options FTP :\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf utiliser le format Stream_LF pour tous "
+"les\n"
+" fichiers binaires FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=IDENTIFIANT définir l’IDENTIFIANT FTP\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=MDP définir le mot de passe FTP\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing ne pas enlever les fichiers « .listing »\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob désactiver développement de noms de "
+"fichiers\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp désactiver le mode de transfert passif\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions préserver les droits des fichiers "
+"distants\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks en mode récursif, prendre les fichiers\n"
+" attachés aux liens (pas les "
+"répertoires)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Options FTPS :\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit utiliser implicitement FTPS (port par "
+"défaut 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl termine la session SSL/TLS démarrée "
+"dans la connexion de contrôle\n"
+" lorsque la connexion de données est "
+"ouverte\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection chiffrer le canal de contrôle "
+"uniquement ; Toutes les données seront en clair\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp revenir en FTP si FTPS n’est pas pris "
+"en charge dans le serveur cible\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Options WARC :\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FICHER sauver les données de requête et de "
+"réponse\n"
+" dans un fichier .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=CHAÎNE insérer CHAÎNE dans l’enregistrement "
+"warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NOMBRE définir la taille maximal de fichiers "
+"WARC\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx écrire les fichiers d’index CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FICHIER ne pas garder enregistrements du fichier "
+"CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ne pas compresser les fichiers WARC avec "
+"gzip\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ne pas calculer les hachages SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ne pas garder journal en enregistrement "
+"WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=RÉPERTOIRE emplacement pour fichiers temporaires "
+"créés\n"
+" par l’écriture WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Téléchargement récursif :\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive activer les téléchargements récursifs\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NOMBRE niveau de récursion maximal\n"
+" (inf ou 0 pour infini)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after détruire fichiers locaux après "
+"téléchargement\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links transformer les liens en local dans les\n"
+" fichiers HTML et CSS téléchargés\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only convertie seulement la partie fichier de "
+"l’URL (courant appelé basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N avant d’écrire le fichier X, en sauver "
+"un\n"
+" exemplaire, et en garder au plus N\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted sauver fichier X en X_orig avant "
+"conversion\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted sauver fichier X en X.orig avant "
+"conversion\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror raccourci de -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites obtenir toutes les images, etc. "
+"nécessaires\n"
+" pour afficher la page HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments activer le traitement strict (SGML) des\n"
+" commentaires HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Acceptation ou rejet récursif :\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTE liste d’extensions acceptées, séparées "
+"par\n"
+" des virgules\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTE liste d’extensions rejetées, séparées "
+"par\n"
+" des virgules\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=EXPR_R expression rationnelle correspondant aux\n"
+" URL acceptées\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=EXPR_R expression rationnelle correspondant aux\n"
+" URL rejetées\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYPE type d’expression rationnelle (posix|"
+"pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TYPE type d’expression rationnelle (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTE domaines acceptés, séparés par des "
+"virgules\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTE domaines rejetés, séparés par des "
+"virgules\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp suivre les liens FTP des documents HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTE liste des balises HTML à suivre, séparées "
+"par\n"
+" des virgules\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTE liste des balises HTML ignorées, séparées "
+"par\n"
+" des virgules\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts suivre les liens externes en mode "
+"récursif\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative ne suivre que les liens relatifs\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTE liste des répertoires permis\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names utiliser le nom indiqué par le suffixe "
+"de\n"
+" l’URL de redirection\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTE liste des répertoires exclus\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent ne pas remonter dans le répertoire "
+"parent\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Envoyez vos rapports de bogues, questions et discussions à <bug-wget@gnu."
+"org>\n"
+" et / ou ouvrez un ticket sur https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, un récupérateur réseau non interactif.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Mot de passe pour l’utilisateur %s : "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Mot de passe : "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Impossible de créer le tube\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Erreur lors de l’initialisation des actions de fichier spawn pour use-"
+"askpass : %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Erreur lors de la configuration des actions de fichier pour use-askpass : "
+"%d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Erreur de lecture de la réponse pour la commande « %s %s » : %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Login pour « %s%s » : "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Mot de passe pour l’utilisateur « %s%s@%s » : "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc : "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Paramètres régionaux : "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compilation : "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Lien : "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s compilé sur %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (environnement)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (utilisateur)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (système)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licence GPLv3+ : GNU GPL version 3 ou ultérieure\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Logiciel libre : vous êtes libre de le modifier ou de le redistribuer.\n"
+"Il n’y a AUCUNE GARANTIE, dans les limites permises par la loi.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Écrit initialement par Hrvoje Nikšić <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Veuillez signaler toutes anomalies ou demandes à <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problème d’allocation de mémoire\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Une erreur dans %s force à quitter\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Utilisez « %s --help » pour obtenir plus de renseignements.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s : option incorrecte — « -n%c »\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Débogage non activé lors de la compilation. Attribut --debug ignoré.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"--no-clobber et --convert-links ont toutes deux été indiquées, seule --"
+"convert-links sera utilisée.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"--no-clobber et --convert-file-only ont toutes deux été indiquées, seule --"
+"convert-links-only sera utilisée.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Impossible d’être en mode bavard et silencieux en même temps.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Impossible d’utiliser les dates sans écraser les vieux fichiers en même "
+"temps.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Impossible d’indiquer --inet4-only et --inet6-only ensemble.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Impossible d’indiquer -k ou --convert-file-only et -O ensemble si plusieurs "
+"URL sont données, ou en\n"
+"combinaison avec -p ou -r. Consultez le manuel pour plus de précisions.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"Attention : combiner -O avec -r ou -p signifie que tout le contenu "
+"téléchargé\n"
+"sera placé dans le fichier unique indiqué.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"Attention : l’horodatage est inactif si combiné avec -O. Consultez le "
+"manuel\n"
+"pour plus de précisions.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"La sortie WARC ne fonctionne pas avec --no-clobber, qui sera donc "
+"désactivée.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"La sortie WARC ne fonctionne pas avec l’horodatage, qui sera donc "
+"désactivé.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "La sortie WARC ne fonctionne pas avec --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"La sortie WARC ne fonctionne pas avec --continue ou --start-pos, qui seront "
+"donc désactivées.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Les hachages sont désactivés ; la déduplication WARC ne trouvera pas les "
+"enregistrements en double.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"La compression ne fonctionne pas avec --continue ou --start-pos, qui seront "
+"donc désactivées.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Impossible d’indiquer --ask-password et --password ensemble.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Indiquer à la fois --start-pos et --continue est déconseillé ; --continue "
+"sera désactivée.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s : URL manquante\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Vous ne pouvez pas indiquer --post-data et --post-file ensemble.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Vous ne pouvez pas utiliser --post-data ou --post-file avec --method. --"
+"method attend des données avec les options --body-data et --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Une méthode doit être indiquée à l’aide de --method=MéthodeHTTP pour "
+"utiliser avec --body-data ou --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Vous ne pouvez pas indiquer --body-data et --body-file ensemble.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Cette version ne prend pas en charge les IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k ou -r ne peuvent être utilisées avec -O qu’en cas de sortie dans un "
+"fichier ordinaire.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links ou --convert-file-only ne peuvent être utilisées ensemble "
+"qu’en cas de sortie dans un fichier ordinaire.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Impossible d’initialiser libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Échec de l’initialisation du canal c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Lecture de l’adresse IP « %s » échouée\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Échec de l’affectation du serveur DNS « %s » : (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Aucune URL repérée dans %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Impossible de parser le fichier metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Impossible de télécharger toutes les resources depuis %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"Terminé — %s —\n"
+"Temps total effectif : %s\n"
+"Téléchargés : %d fichiers, %s en %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Quota de téléchargement %s dépassé.\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O ’est pas pris en charge le téléchargementmetalink. Ignoré.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Fichier metalink plannifié : %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Fichier metalink sécurisé : %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Rejet du fichier metalink. Nom non sécurisé.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Analyse metaurl %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Rejet du fichier metaurl %s. Nom non sécurisé.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Échec du téléchargement %s. Metaurl ignorerée.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Impossible de parser le fichier metaurl : %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Traitement de Metaurls en erreur.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Ressource de type %s non prise en charge, ignorer…\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Impossible d’ouvrir le fichier téléchargé.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Calcule de la taille de %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Taille de fichier non déclaré. Ignorer la vérification.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Impossible d’obtenir la taille du fichier téléchargé.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Fichier %s de taille incohérente.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Taille cohérente.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Calcul de la somme de contrôle de %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Somme de contrôle valide.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Somme de contrôle invalide pour le fichier %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Impossible d’ouvrir le fichier téléchargé pour la vérification de "
+"signature.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem : %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify : %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result : NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Validation de la signature réussie.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Signature invalide. Rejet de la ressource.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+"Les données correspondent à la signature, mais la signature n’est pas "
+"fiable.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Aucun somme de contrôle disponible.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Échec du téléchargenent de %s. Resource ignorée.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Fichier %s récupéré mais sa taille ne correspond pas.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Fichier %s récupéré mais sa somme de contrôle ne correspnod pas.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Fichier %s récupéré mais sa signature ne correspnod pas.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Renommage de %s en %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Poursuite en arrière plan.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Poursuite en arrière plan, PID %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "La sortie sera écrite vers %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() a échoué\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() a échoué \n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s : aucune socket de pilote utilisable.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() a échoué. Le socket n’a pas pu être défini en mode bloquant.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s : %s:%d : avertissement : le jeton %s apparaît devant le nom de machine\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s : %s:%d : jeton « %s » inconnu\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Utilisation : %s NETRC [HÔTE]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s : impossible d’obtenir l’état de %s : %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "Attention : utilisation d’une initialisation aléatoire faible.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Impossible d’initialiser la génération de nombres pseudoaléatoires ; "
+"considérer l’utilisation de --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+"La version d’OpenSSL est trop ancienne pour prendre en charge TLSv1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+"La version d’OpenSSL est trop ancienne pour prendre en charge TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+"La version d’OpenSSL est trop ancienne pour prendre en charge TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"OpenSSL : valeur %d pour l’option « secure-protocol » non prise en charge\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL : list de cipher invalide : %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+"OpenSSL : échec de configuration du niveau de confiance à \"chaîne partielle"
+"\"\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL : échec d'allocation du paramètre de vérification\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"AVERTISSEMENT : impossible d’initialiser la génération de nombres "
+"pseudoaléatoires ; considérer l’utilisation de --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+"%s : impossible de vérifier l’attribut %s du certificat, émis par %s :\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Impossible de vérifier localement l’autorité de l’émetteur.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Récupération d’un certificat autosigné.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Le certificat émis n’est pas encore valable.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Le certificat émis a expiré.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s : le nom de sujet alternatif du certificat ne correspond pas au\n"
+"\tnom d’hôte %s demandé.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s : le nom commun du certificat %s ne correspond pas au nom d’hôte %s "
+"demandé.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s : le nom commun du certificat est incorrect (contient un caractère\n"
+" NULL). Cela peut indiquer une usurpation d’hôte (c’est-à-dire qu’il ne\n"
+" s’agit pas du véritable %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Pour établir une connexion non sécurisée à %s, utilisez « --no-check-"
+"certificate ».\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ %sK ignoré ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Indication de style « point » %s incorrect ; laissé sans modification.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " tps %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " ds "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+"Impossible d’obtenir la fréquence de l’horloge en temps réel (REALTIME) : "
+"%s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Suppression de %s puisqu’il devrait être rejeté.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossible d’ouvrir %s : %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Chargement de robots.txt ; veuillez ignorer les erreurs.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Erreur d’analyse de l’URL du serveur mandataire (« proxy ») %s : %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr ""
+"Erreur d’URL de serveur mandataire (« proxy ») %s : doit être de type HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d redirections dépassant la limite permise.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Abandon.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Nouvel essai.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Aucun lien mort trouvé.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d lien mort trouvé.\n"
+"\n"
+msgstr[1] ""
+"%d liens morts trouvés.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Aucune erreur"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Schéma %s non pris en charge"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schéma manquant"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nom d’hôte incorrect"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Mauvais numéro de port"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Identifiant incorrect"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Adresse numérique IPv6 non terminée"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Adresses IPv6 non prises en charge"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Adresse numérique IPv6 incorrecte"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS non activé lors de la compilation"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Séquence multioctet inconvertible rencontrée\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s : %s : échec d’allocation de mémoire ; mémoire épuisée.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s : %s : échec d’allocation de %ld octets ; mémoire épuisée.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s : aprintf : tampon de texte trop grand (%d octets), abandon.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Poursuite en arrière plan, PID %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Impossible de supprimer le lien symbolique %s : %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Echec de l'ouverture du fichier %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Echec de l'acquisition d'un descripteur pour le fichier %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Echec de stat sur le fichier %s, (vérification des permissions)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Le fichier %s a changé depuis la dernière lecture. Contrôle de sécurité "
+"échoué.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Echec de la lecture du fichier %s, en raison de : %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Echec de stat sur le fichier %s, erreur : %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Tentative d'ouverture du fichier %s qui a changé depuis la dernière lecture. "
+"Contrôle de sécurité échoué.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expression rationnelle %s, erreur PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expression rationnelle %s incorrecte, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Erreur de correspondance de %s : %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Ignore la clef de longueur fausse (%d/%d) : %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Erreur de mouvement dans le WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Erreur de synchronisation sur disque du fichier WARC.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Erreur de duplication du descripteur de fichier WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Erreur d’ouverture du flux GZIP vers le fichier WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Erreur d’écriture de l’enregistrement warcinfo vers le fichier WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Ouverture du fichier WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Erreur d’ouverture du fichier WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"Le fichier CDX ne contient pas les URL d’origine (colonne « a » manquante).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+"Le fichier CDX ne contient pas les sommes de contrôle (colonne « k » "
+"manquante).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"Le fichier CDX ne contient pas les identifiants d’enregistrement (colonne "
+"« u » manquante).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"%d enregistrement chargé du CDX.\n"
+"\n"
+msgstr[1] ""
+"%d enregistrements chargés du CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Impossible de lire le fichier CDX %s pour la déduplication.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Impossible d’ouvrir le fichier de manifeste WARC temporaire.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Impossible d’ouvrir le fichier de journalisation WARC temporaire.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Impossible d’ouvrir le fichier WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Impossible d’ouvrir le fichier CDX pour la sortie.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Impossible d’ouvrir le fichier WARC temporaire.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Correspondance exacte trouvée dans le fichier CDX. Sauvegarde de "
+"l’enregistrement revisité dans WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Erreur système inconnue"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Famille d’adresses non prise en charge pour le nom d’hôte"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Mauvaise valeur pour ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Échec non récupérable de résolution de noms"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family non prise en charge"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Échec d’allocation de mémoire"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Aucune adresse associée au nom d’hôte"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nom ou service inconnu"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname non pris en charge pour ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype non pris en charge"
+
+#~ msgid "System error"
+#~ msgstr "Erreur système"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Tampon d’arguments trop petit"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Traitement de requête en cours"
+
+#~ msgid "Request canceled"
+#~ msgstr "Requête annulée"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Requête non annulée"
+
+#~ msgid "All requests done"
+#~ msgstr "Toutes les requêtes sont terminées"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrompu par un signal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Chaîne de paramètres non encodée correctement"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s : l’option « %s%s » est ambiguë\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s : l’option « %s%s » est ambiguë ; possibilités :"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s : l’option « %s%s » n’est pas reconnue\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s : l’option « %s%s » n’accepte pas d’argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s : l’option « %s%s » nécessite un argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s : option incorrecte — « %c »\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s : l’option nécessite un argument — « %c »\n"
+
+#~ msgid "`"
+#~ msgstr "« "
+
+#~ msgid "'"
+#~ msgstr " »"
+
+#~ msgid "Success"
+#~ msgstr "Réussite"
+
+#~ msgid "No match"
+#~ msgstr "Pas de correspondance"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expression rationnelle incorrecte"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Caractère de collation incorrect"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nom de classe de caractères incorrect"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Barre oblique inverse finale"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Référence arrière incorrecte"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [. ou [= sans correspondance"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( ou \\( sans correspondance"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ sans correspondance"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Contenu de \\{\\} incorrect"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Fin d’intervalle incorrecte"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Mémoire épuisée"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Expression rationnelle précédente incorrecte"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Fin prématurée d’expression rationnelle"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expression rationnelle trop grande"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") ou \\) sans correspondance"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Pas d’expression rationnelle précédente"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "impossible de créer le tube"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "échec du sous-processus %s"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "échec de _open_osfhandle"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr ""
+#~ "impossible de restaurer le descripteur de fichier %d : échec de dup2"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "sous-processus %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "le sous-processus %s a reçu le signal %d fatal"
+
+#~ msgid "memory exhausted"
+#~ msgstr "mémoire épuisée"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Veuillez signaler toutes anomalies, questions ou demandes à <bug-wget@gnu."
+#~ "org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s : l’option « --%s » n’accepte pas d’argument\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s : l’option « --%s » n’est pas reconnue\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s : l’option « -W %s » est ambiguë\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s : l’option « -W %s » n’accepte pas d’argument\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s : l’option « -W %s » nécessite un argument\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Fichier « %s » déjà présent ; pas de récupération.\n"
diff --git a/po/ga.gmo b/po/ga.gmo
new file mode 100644
index 0000000..0d60b3e
--- /dev/null
+++ b/po/ga.gmo
Binary files differ
diff --git a/po/ga.po b/po/ga.po
new file mode 100644
index 0000000..df36ee2
--- /dev/null
+++ b/po/ga.po
@@ -0,0 +1,3699 @@
+# Irish translations for wget.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Kevin Patrick Scannell <scannell@SLU.EDU>, 2004, 2007, 2008, 2017.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.18.109\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2017-01-17 11:59-0500\n"
+"Last-Translator: Kevin Scannell <kscanne@gmail.com>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
+"Language: ga\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : (n>2 && n<7) ? 2 :"
+"(n>6 && n<11) ? 3 : 4;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: ní féidir seoladh ceangail %s a réiteach; ceangal á dhíchumasú.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Ag dul i dteagmháil le %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Ag dul i dteagmháil le %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Ag dul i dteagmháil le [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "theip ar setsockopt SO_RCVBUF: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "ceangailte.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "teipthe: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: ní féidir seoladh an óstríomhaire %s a réiteach\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "theip ar setsockopt SO_REUSEADDR: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "An iomarca fd-anna oscailte. Ní féidir select a úsáid ar fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Tiontaíodh nascanna i %d comhad i %s soicind.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Nascanna i %s á dtiontú..."
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "faic le déanamh.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ní féidir nascanna a thiontú i %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ní féidir %s a scriosadh: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ní féidir cúltaca a dhéanamh ar %s mar %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ní féidir fianán a fháil le haghaidh %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Earráid chomhréire i Set-Cookie: %s ag %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Rinne fianán ó %s iarracht ar an bhfearann a athrú go "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ní féidir comhad na bhfianán %s a oscailt: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Earráid le linn scríofa i gcomhad %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Earráid agus %s á dhúnadh: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Modh liostála gan tacaíocht, ag baint triail as parsálaí liostála Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Innéacs de /%s ar %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "am anaithnid "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Comhad "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Comhadlann "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Nasc "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Éiginnte "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s beart)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Fad: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) fágtha"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s fágtha"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (neamhúdarásach)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Níorbh fhéidir SSL a thúsú. Díchumasófar é."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Logáil isteach mar %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Earráid sa fhreagra ón fhreastalaí, ceangal rialaithe á dhúnadh.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Earráid i mbeannacht ón fhreastalaí.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Theip ar scríobh, ceangal rialaithe á dhúnadh.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Ní cheadaíonn an freastalaí do logáil isteach.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Logáil mhícheart.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Logáilte isteach!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Níor ghlac an freastalaí leis an ordú 'PBSZ 0'.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Níor ghlac an freastalaí leis an ordú 'PROT %c'.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Earráid fhreastalaí, ní féidir an cineál córais a dhéanamh amach.\n"
+
+# used in the stats page table
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "críochnaithe. "
+
+# used in the stats page table
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "críochnaithe.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Cineál anaithnid `%c', ceangal rialaithe á dhúnadh.\n"
+
+# used in the stats page table
+#: src/ftp.c:749
+msgid "done. "
+msgstr "críochnaithe."
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> Níl gá le CWD.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Sroicheadh rannán doshroichte in getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Níl comhadlann %s ann.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> Níl CWD de dhíth.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fuarthas an comhad cheana.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ní féidir tús a chur leis an aistriú PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ní féidir an freagra PASV a pharsáil.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "níorbh fhéidir dul i dteagmháil le %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Earráid cheangail (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT neamhbhailí.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Theip ar REST, ag atosú ó thosach.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Tá comhad %s ann.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Níl comhad %s ann.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Níl comhad %s ann.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Níl a leithéid de chomhad ná de chomhadlann ann: %s\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "Tá %s ann anois.\n"
+
+# CRL next update.
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, ceangal rialaithe á dhúnadh.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Ceangal sonraí: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Ceangal rialaithe dúnta.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Tobscoireadh an t-aistriú sonraí.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Tá comhad %s ann cheana; ní aisghabhfar é.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(iarracht:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scríofa ar stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s sábháilte [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "%s á bhaint.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "%s á úsáid mar chomhad sealadach le haghaidh liostála.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Baineadh %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Doimhneacht athchúrsála %d níos mó ná an t-uasmhéid %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Níl an comhad i gcéin níos nuaí ná an comhad áitiúil %s -- ní aisghabhfar "
+"é.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Tá an comhad i gcéin níos nuaí ná an comhad áitiúil %s -- á aisghabháil.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Níl an méid céanna ar na comhaid (áitiúil %s) -- á aisghabh.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ainm neamhbhailí ar an nasc siombalach, ag dul thart.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Tá nasc ceart siombalach ann cheana %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Nasc siombalach %s -> %s á chruthú\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Ní thacaítear le nascanna siombalacha, ag dul thar %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ag dul thar comhadlann %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: comhad de chineál anaithnid/gan tacaíocht.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Níorbh fhéidir ceadanna le haghaidh %s a shocrú.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: stampa ama truaillithe.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Ní aisghabhfar comhadlanna toisc gurb é %d an doimhneacht (uasmhéid %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ní rachfar isteach i %s toisc go bhfuil eisiata/as an áireamh.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s á dhiúltú.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s á dhiúltú.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Ní rachfar isteach i %s toisc go bhfuil eisiata/as an áireamh.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Earráid agus %s á chur i gcomhoiriúnacht do %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Níl aon rud comhoiriúnach leis an bpatrún %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Scríobhadh innéacs i bhformáid HTML i %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Scríobhadh innéacs i bhformáid HTML i %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "EARRÃID: Ní féidir comhadlann %s a oscailt.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "EARRÃID: Níorbh fhéidir teastas %s a oscailt: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Teastas CA '%s' lódáilte\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "EARRÃID: Níorbh fhéidir comhad CRL '%s' a lódáil: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Lódáladh comhad CRL '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"EARRÃID: Éilíonn GnuTLS gur den chineál céanna iad an eochair agus an "
+"teastas.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Tá an leagan de OpenSSL atá agat róshean le tacú le TLSv1.1\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: níl an luach %d ar fáil le 'secure-protocal'\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Seol tuairisc faoin fhabht seo chuig bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: níl an luach %d ar fáil le 'secure-protocal'\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "EARRÃID"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "RABHADH"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Níor thaispeáin %s teastas ar bith.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Níl an teastas ag %s iontaofa.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Níl eisitheoir aitheanta ag teastas %s.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Aisghaireadh an teastas ag %s.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Ní CA é sínitheoir an teastais ag %s.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Síníodh teastas %s le halgartam neamhshlán.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Níl an teastas ag %s bailí fós.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Chuaigh an teastas ag %s as feidhm.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Earráid agus teastas X509 á thúsú: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Níor aimsíodh aon teastas\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Earráid agus an teastas á pharsáil: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Níl an teastas bailí fós.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Chuaigh an teastas as feidhm\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Ní ionann úinéir an teastais agus an t-óstainm %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Ní ionann an eochair phoiblí agus an eochair a bhfuil PIN aici!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Caithfear teastas X.509 a úsáid\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Earráid agus an liosta seoltaí á láimhseáil.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Óstríomhaire anaithnid"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Teip shealadach ar réiteach na n-ainmneacha"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Earráid anaithnid"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "%s á réiteach... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "teipthe: Gan seoladh IPv4/IPv6 don óstríomhaire.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "teipthe: thar am.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ní féidir nasc %s neamhiomlán a réiteach.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL neamhbhailí %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Theip ar scríobh iarratais HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Gan cheanntásca, glac le HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Tá an comhad %s ann cheana; ní aisghabhfar é.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "theip ar gmtime. Is dócha gur fabht é seo.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ní féidir an stampa ama a thiontú go HTTP. Úsáidfear am athraithe = 0 mar "
+"chúltaca.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Comhad sonraí BODY %s ar iarraidh: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Ag baint athúsáid as an gceangal le [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Ag baint athúsáid as an gceangal le %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Theip ar léamh freagra ón seachfhreastalaí: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s EARRÃID %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Líne stádais míchumtha"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Theip ar thollánú seachfhreastalaí: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Scéim anaithnid fhíordheimhnithe.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Scéim fhíordheimhnithe: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "à shábháil i: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Agus síniú á íoslódáil:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Ní féidir ábhar an tsínithe a léamh ó chomhad sealadach. Ag dul thart.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Níorbh fhéidir comhad sealadach a chruthú. Ní íoslódálfar an síniú.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Luach neamhbhailí pri. Glacfar le %d ina ionad.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Níor aimsíodh achoimre inghlactha le haghaidh acmhainní Metalink.\n"
+"Déanfar neamhshuim orthu.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "SSL á dhíchumasú de bharr earráidí.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Iarratas %s seolta, ag fanacht le freagra... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Níor glacadh aon sonra.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Earráid (%s) ag léamh na gceanntásc.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(gan cur síos)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Suíomh: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "gan sonrú"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [á leanúint]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Níor athraigh comhad %s ar an bhfreastalaí. Ní íoslódálfar é.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Rinne an freastalaí neamhaird den cheanntásc If-Modified-Since le haghaidh "
+"%s.\n"
+"Seans gur mhaith leat an rogha --no-if-modified-since a shonrú.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Bhí an comhad aisghafa ina iomláine cheana; níl faic le déanamh.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Fad: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "rinneadh neamhaird"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Rabhadh: níl saoróga ar fáil i HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Cumasaíodh an mód crúbadáin. Seiceáil an bhfuil an cianchomhad ann.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ní féidir scríobh i gcomhad %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Fuarthas aitreabúid riachtanach a bhí ar iarraidh ón Cheanntásc.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Theip ar fhíordheimhniú Ainm Úsáideora/Focal Faire.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ní féidir scríobh sa chomhad WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ní féidir scríobh i gcomhad sealadach WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ní féidir ceangal SSL a dhéanamh.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ní féidir %s a dhínascadh (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "EARRÃID: Atreorú (%d) gan suíomh.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Níor aimsíodh na sonraí Metalink sa fhreagra HTTP. Comhad á íoslódáil trí "
+"HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Aimsíodh na ceanntásca Metalink. Bainfear úsáid as an mód Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Níl an cianchomhad ann -- nasc briste!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Ceanntásc `Last-modified' ar iarraidh -- ní úsáidfear stampaí ama.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Ceanntásc neamhbhailí `Last-modified' -- tugadh neamhaird ar an stampa ama.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Níl an comhad ar an bhfreastalaí níos nuaí ná an comhad áitiúil %s -- ní "
+"aisghabhfar é.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Níl an méid céanna ar na comhaid (áitiúil %s) -- á aisghabh.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Tá an cianchomhad níos nuaí, á aisghabháil.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Tá an cianchomhad ann agus is féidir go bhfuil naisc le hacmhainní eile ann "
+"-- á aisghabháil.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tá an cianchomhad ann ach níl aon nasc ann -- ní aisghabhfar é.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tá an cianchomhad ann agus seans go bhfuil nascanna breise ann,\n"
+"ach díchumasaíodh athchúrsáil -- ní aisghabhfar é.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Tá an cianchomhad ann.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "URL %s: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scríofa ar stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s sábháilte [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Ceangal dúnta ag beart %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Earráid léimh ag beart %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Earráid léimh ag beart %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Cáilíocht cosanta nach dtacaítear léi '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algartam gan tacaíocht '%s'.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: Tá WGETRC dírithe ar %s, agus níl sé seo ann ar chor ar bith.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ní féidir %s a léamh (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Earráid i %s, líne %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Earráid chomhréire i %s ag líne %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Ordú anaithnid %s i %s ag líne %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Níorbh fhéidir comhad wgetrc an chórais a pharsáil (cf athróg\n"
+"SYSTEM_WGETRC). Féach '%s', nó roghnaigh comhad eile le --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Níorbh fhéidir comhad wgetrc an chórais a pharsáil Féach '%s',\n"
+"nó roghnaigh comhad eile le --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Rabhadh: Tá na comhaid wgetrc ag an úsáideoir agus ag an gcóras nasctha "
+"le %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Ordú neamhbhailí --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Slonn neamhbhailí Boole %s; úsáid `on' nó `off'.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: %s neamhbhailí; úsáid `on', `off', nó `quiet'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Uimhir neamhbhailí %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: Ní féidir %s a úsáid níos mó ná uair amháin\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Luach neamhbhailí birt %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Tréimhse neamhbhailí %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Tréimhse neamhbhailí %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"ní mór duit teaghrán a thabhairt do use-askpass, nó athróg timpeallachta "
+"WGET_ASKPASS nó SSH_ASKPASS a shocrú.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Luach neamhbhailí %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ceanntásc neamhbhailí %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ceanntásc WARC neamhbhailí %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Cineál neamhbhailí dul chun cinn %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Teorannú neamhbhailí %s,\n"
+" úsáid [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Níl an t-ionchódú %s bailí\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Ní thacaítear le tiontú ó %s go %s\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Chonacthas seicheamh ilbheart neamhiomlán nó neamhbhailí\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Earráid %d gan láimhseáil\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: níl logchaighdeán sonraithe\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "theip ar idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Níorbh fhéidir tiontú go cás íochtair: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Aschur á athsheoladh go %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; logáil á díchumasú.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Úsáid: %s [ROGHA]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Is riachtanach le rogha ghearr aon argóint atá riachtanach leis an rogha "
+"fhada.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Tosú:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version taispeáin an leagan de Wget agus scoir\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help taispeáin an chabhair seo\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background rith sa chúlra tar éis tosaithe\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=ORDÚ rith ordú de nós `.wgetrc'\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Logáil agus an t-inchomhad:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=COMHAD logáil teachtaireachtaí i gCOMHAD\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+" -a, --append-output=COMHAD iarcheangail teachtaireachtaí le COMHAD\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug taispeáin go leor eolas dhífhabhtaithe\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug taispeáin eolas dhífhabhtaithe Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tostach (gan aschur)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose foclach (seo é an réamhshocrú)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -nv, --no-verbose idir foclach agus tostach\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=MODH taispeáin bandaleithead mar MODH, mar shampla "
+"'bots'\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=COMHAD íoslódáil URLanna ón CHOMHAD áitiúil nó "
+"seachtrach\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=COMHAD íoslódáil comhaid clúdaithe sa CHOMHAD "
+"áitiúil Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html caith leis an inchomhad mar HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL réitigh nascanna HTML ó inchomhaid (-i -"
+"F)\n"
+" i gcoibhneas le URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=COMHAD sonraigh comhad cumraíochta\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config ná léigh aon chomhad cumraíochta\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=COMHAD logchomhad i gcomhair URLanna diúltaithe\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Ãoslódáil:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=UIMHIR líon na n-atrialacha (0=gan teorainn)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused atriail fiú má tá an ceangal diúltaithe\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LIOSTA clibeanna HTML nach mbactar leo, scartha "
+"le camóga\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=COMHAD scríobh cáipéisí i gCOMHAD\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber ná híoslódáil comhad a d'fhorscríobhfadh\n"
+" comhad atá ann cheana\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-config ná léigh aon chomhad cumraíochta\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr " -c, --continue atosaigh íoslódáil comhad\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=UIMHIR tosaigh ag íoslódáil ó fhritháireamh "
+"UIMHIR\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=CINEÃL cineál rianaire dul chun cinn\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress taispeáin barra dul chun cinn, mód "
+"foclachais ar bith\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ná híoslódáil comhad mura bhfuil sé níos\n"
+" nuaí ná an leagan áitiúil\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ná húsáid iarratais choinníollacha if-"
+"modified-since\n"
+" i mód na stampaí ama\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ná úsáid an stampa ama ar an "
+"bhfreastalaí\n"
+" chun an stampa ama áitiúil a shocrú\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response taispeáin an freagra ón fhreastalaí\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ná híoslódáil rud ar bith\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SOICINDà socraigh gach tréimhse feithimh = SOICINDÃ\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=SEOLTAà liosta freastalaithe DNS le húsáid (camóga "
+"eatarthu)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=SEOLADH ceangail réiteoir DNS le SEOLADH "
+"(óstainm/IP) ar an óstríomhaire áitiúil\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr " --dns-timeout=SOIC seal fanachta DNS = SOIC\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=SOIC seal fanachta ceangailte = SOIC\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SOIC seal fanachta léimh = SOIC\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SOICINDà fan SOICINDà idir íoslódálacha\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " --waitretry=SOICINDÃ fan 1...SOICINDÃ idir atrialacha\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait fan ó 0.5*WAIT...1.5*WAIT soicind idir "
+"íoslódálacha\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy ná húsáid seachfhreastalaí\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=UIMHIR socraigh cuóta íoslódála\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=SEOLADH ceangail le SEOLADH (óstainm/IP) ar an "
+"óstach áitiúil\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=RÃTA socraigh uasráta íoslódála\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache ná cuir cuardaigh DNS i dtaisce\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS ná húsáid carachtair nach dtacaítear leo ar "
+"an OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ná bac le cás agus comhaid/comhadlanna á "
+"meaitseáil\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only ceangail le seoltaí IPv4 amháin\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only ceangail le seoltaí IPv6 amháin\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=CLANN ceangail ar dtús le seoltaí ón CHLANN,\n"
+" IPv6, IPv4, nó \"none\".\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=ÚSÃIDEOIR socraigh an tÚSÃIDEOIR ftp agus http\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=FF socraigh an focal faire ftp agus http\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password faigh focail fhaire ón úsáideoir\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=ORDÚ sonraigh láimhseálaí dintiúr nuair a iarrtar\n"
+" ainm úsáideora agus focal faire. Gan "
+"ORDÚ,\n"
+" úsáidtear athróga timpeallachta "
+"WGET_ASKPASS\n"
+" nó SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri múch tacaíocht do IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=IONCHÓDÚ sonraigh IONCHÓDÚ áitiúil i gcomhair "
+"IRIanna\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=IONCHÓDÚ IONCHÓDÚ réamhshocraithe ar chomhaid i "
+"gcéin\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink scrios comhaid sula bhforscríobhfar iad\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash coinnigh comhaid fiú mura meaitseálann an "
+"tsuim sheiceála (agus cuir .badhash leis an ainm)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=UIMHIR Orduimhir Metalink application/"
+"metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http úsáid meiteashonraí Metalink ó "
+"cheanntásca an fhreagra HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location do rogha áite le haghaidh acmhainní "
+"Metalink\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr ná stóráil meiteashonraí in aitreabúidí "
+"breisithe\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Comhadlanna:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ná cruthaigh comhadlanna\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories cruthaigh comhadlanna i gcónaí\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ná cruthaigh comhadlanna óstacha\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories úsáid ainm an phrótacail i gcomhadlanna\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=RÉIMÃR sábháil comhaid i RÉIMÃR/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=UIMHIR déan neamhshuim ar UIMHIR comhpháirt den "
+"chomhadlann i gcéin\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Roghanna HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=ÚSÃIDEOIR socraigh an tÚSÃIDEOIR http\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=FF socraigh an focal faire http\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache ná ceadaigh sonraí curtha i dtaisce ag an "
+"bhfreastalaí\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=AINM athraigh an t-ainm leathanaigh "
+"réamhshocraithe\n"
+" ('index.html' de ghnáth.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension sábháil cáipéisí HTML/CSS le hiarmhíreanna "
+"cuí\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length déan neamhaird den réimse 'Content-Length'\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=TEAGHRÃN cuir TEAGHRÃN sna ceanntásca\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect uasmhéid atreoraithe do gach leathanach\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=ÚSÃIDEOIR socraigh ÚSÃIDEOIR an tseachfhreastalaí\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=FF socraigh focal faire don seachfhreastalaí\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL cuir ceanntásc 'Referer: URL' san iarracht "
+"HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers sábháil na ceanntásca HTTP i gcomhad\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AINM tú féin a chur in aithne mar AINM vs. Wget/"
+"LEAGAN\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive díchumasaigh keep-alive HTTP (ceangail "
+"sheasmhacha)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ná húsáid fianáin\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=COMHAD lódáil fianáin ó CHOMHAD roimh an seisiún\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=COMHAD sábháil fianáin i gCOMHAD tar éis an "
+"tseisiúin\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies lódáil agus sábháil fianáin (sealadacha) an "
+"tseisiúin\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=TEAGHRÃN úsáid an modh POST; seol TEAGHRÃN mar na "
+"sonraí\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=COMHAD úsáid an modh POST; seol na sonraí as COMHAD\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod úsáid modh \"HTTPMethod\" san iarratas\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=TEAGHRÃN seol TEAGHRÃN mar na sonraí; ní mór --method "
+"a shonrú\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=COMHAD seol ábhar an CHOMHAID; ní mór --method a "
+"shonrú\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition géill do cheanntásc Content-Disposition agus\n"
+" ainmneacha áitiúla á roghnú (TURGNAMH)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error taispeáin an t-aschur a fuarthas i gcás "
+"earráide\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Seol bunfhaisnéis fhíordheimhnithe HTTP\n"
+" gan fanacht le dúshlán ón fhreastalaí\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Roghanna HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR roghnaigh prótacal slán: auto, SSLv2,\n"
+" SSLv3, TLSv1 nó PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only ná lean ach nascanna HTTPS\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ná bailíochtaigh teastas an fhreastalaí\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=COMHAD comhad teastais an chliaint\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=CINL cineál teastais an chliaint: PEM nó DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=COMHAD comhad don eochair phríobháideach\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=CINL cineál na heochrach príobháidí, PEM nó DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=COMHAD comhad ina bhfuil an burla CAnna\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=COMHADLN comhadlann ina gcoinnítear an liosta "
+"haiseáilte de CAnna\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=COMHAD comhad ina bhfuil burla CRLanna\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=COMHAD/HAIS Comhad ina bhfuil eochair phoiblí (PEM/"
+"DER),\n"
+" nó haiseanna sha256, base64-ionchódaithe, "
+"le\n"
+" 'sha256//' rompu agus ';' eatarthu, chun "
+"an\n"
+" acmhainn i gcéin a dheimhniú\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=COMHAD comhad ina bhfuil sonraí randamacha chun an "
+"SSL PRNG a shíolrú\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=COMHAD comhad a ainmníonn an soicéad EGD le sonraí "
+"randamacha\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Roghanna HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts díchumasaigh HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file cosán go dtí an bunachar sonraí HSTS "
+"(sáraíonn seo an réamhshocrú)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Roghanna FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf úsáid formáid Stream_LF le haghaidh gach "
+"comhaid dhénártha FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=ÚSÃIDEOIR socraigh an tÚSÃIDEOIR ftp\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=FF socraigh an focal faire ftp\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ná bain comhaid '.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob ná déan globáil le hainmneacha comhaid FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp díchumasaigh an mód aistrithe \"passive\"\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions caomhnaigh ceadanna an chomhaid i gcéin\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks faigh na comhaid a nasctar leo, agus á "
+"athchúrsáil\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Roghanna FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit úsáid FTPS intuigthe (port "
+"réamhshocraithe 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl atosaigh an seisiún SSL/TLS a "
+"tosaíodh sa cheangal rialaithe nuair\n"
+" a osclófar ceangal nua sonraí\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection rúnscríobh an cainéal rialaithe "
+"amháin; beidh na sonraí go léir i nglantéacs\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp úsáid FTP mar thacachumas mura "
+"dtacaíonn an freastalaí le FTPS\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Roghanna WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=COMHAD sábháil sonraí an iarratais/fhreagra i "
+"gcomhad .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=TEAGHRÃN cuir TEAGHRÃN sa taifead warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=UIMHIR socraigh uasmhéid na gcomhad WARC\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx scríobh comhad innéacsaithe CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=COMHAD ná stóráil taifid atá sa chomhad CDX seo\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ná comhbhrúigh comhaid WARC le GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ná ríomh haiseanna SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ná stóráil an logchomhad i dtaifead WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=COMHADLANN áit ina gcruthóidh an scríbhneoir WARC "
+"comhaid shealadacha\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Ãoslódáil athchúrsach:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive íoslódáil go hathchúrsach\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=UIMHIR doimhneacht athchúrsála is mó (inf nó 0 = gan "
+"teorainn)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after scrios comhaid go háitiúil i ndiaidh íoslódála\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links nasc le comhaid áitiúla i HTML/CSS íoslódáilte\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only ná tiontaigh ach an chuid den URL a "
+"shonraíonn an comhad féín (a dtugtar 'an bunainm' air)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N sula scríobhtar comhad, rothlaigh suas le "
+"N comhad cúltaca\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted déan cúltaca mar X_orig sula dtiontaítear comhad "
+"X\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted déan cúltaca mar X.orig sula dtiontaítear comhad "
+"X\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror ar comhbhrí le -N -r -l inf --no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites faigh gach íomhá, srl. ag teastáil chun "
+"leathanach HTML a thaispeáint\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments láimhseáil dhocht de nótaí tráchta HTML (.i. mar "
+"SGML)\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Glacadh/diúltú athchúrsach:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LIOSTA iarmhíreanna inghlactha, scartha le "
+"camóga\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LIOSTA iarmhíreanna diúltaithe, scartha le "
+"camóga\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=SLONN slonn ionadaíochta a mheaitseálann "
+"URLanna a nglacfar leo\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=SLONN slonn ionadaíochta a mheaitseálann "
+"URLanna nach nglacfar leo\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=CINEÃL cineál an tsloinn ionadaíochta (posix|"
+"pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=CINEÃL cineál an tsloinn ionadaíochta (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIOSTA fearainn inghlactha, scartha le camóga\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIOSTA fearainn diúltaithe, scartha le camóga\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr " --follow-ftp lean naisc FTP i gcáipéisí HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LIOSTA clibeanna HTML le leanúint, scartha le "
+"camóga\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIOSTA clibeanna HTML nach mbactar leo, scartha "
+"le camóga\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts oscail óstaigh i gcéin más athchúrsach é\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative ná lean ach naisc choibhneasta\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LIOSTA comhadlanna ceadaithe\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names úsáid an t-ainm sa chomhpháirt "
+"dheireanach\n"
+"den URL atreoraithe\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LIOSTA comhadlanna neamhcheadaithe\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent ná téigh suas go comhadlanna níos airde.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget, leagan %s, íoslódálaí neamh-idirghníomhach.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Focal faire le haghaidh %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Focal faire: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ní féidir píopa a chruthú\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Earráid agus sceitheadh comhad á thúsú le haghaidh use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Earráid agus sceitheadh comhad á shocrú le haghaidh use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Earráid agus an freagra ó ordú \"%s %s\" á léamh: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Ainm úsáideora le haghaidh '%s%s': "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Focal faire le haghaidh '%s%s@%s': "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc"
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Logchaighdeán: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Tiomsú: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Nasc: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s tógtha ar %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (úsáideoir)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (córas)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Ceadúnas GPLv3+: GNU GPL, leagan 3 nó níos nuaí\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Is saorbhogearra é seo: ceadaítear duit é a athrú agus a athdháileadh.\n"
+"Níl baránta AR BITH ann, an oiread atá ceadaithe de réir dlí.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Scríofa ar dtús ag Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Seol tuairiscí ar fhabhtanna agus ceisteanna chuig <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Fadhb agus cuimhne á leithdháileadh\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "à scor mar gheall ar earráid i %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Bain triail as `%s --help' chun tuilleadh roghanna a fheiceáil.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: rogha neamhcheadaithe -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Níor tiomsaíódh an clár seo le tacaíocht dífhabhtaithe. Déanfar neamhaird "
+"den bhratach --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Sonraíodh --no-clobber agus --convert-links. Úsáidfear --convert-links "
+"amháin.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Sonraíodh --no-clobber agus --convert-file-only. Úsáidfear --convert-file-"
+"only amháin.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ní féidir a bheith foclach agus tostach san am céanna.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Ní féidir stampaí ama a dhéanamh gan forscríobh ar do chuid sheanchomhaid.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ní féidir --inet4-only agus --inet6-only a shonrú araon.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Ní féidir -k nó --convert-file-only a shonrú chomh maith le -O má tá níos mó "
+"ná URL amháin ann, nó\n"
+"in éineacht le -p nó -r. Féach ar an lámhleabhar chun tuilleadh eolais a "
+"fháil.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"RABHADH: Má shonraíonn tú -O in éineacht le -r nó -p, cuirfear an t-ábhar "
+"íoslódáilte go léir sa chomhad a roghnaigh tú.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"RABHADH: ní dhéanann stampáil ama faic in éineacht le -O. Féach ar an\n"
+"lámhleabhar chun tuilleadh eolais a fháil.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Ní fheidhmíonn aschur WARC leis an rogha --no-clobber; díchumasófar --no-"
+"clobber.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Ní fheidhmíonn aschur WARC le stampaí ama; díchumasófar na stampaí ama.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Ní fheidhmíonn aschur WARC in éineacht le --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Ní fheidhmíonn aschur WARC in éineacht le --continue nó --start-pos; "
+"díchumasófar iad.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Díchumasaíodh achoimrí; ní bheidh WARC in ann taifeadtaí dúbailte a aimsiú.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Ní fheidhmíonn aschur WARC in éineacht le --continue nó --start-pos; "
+"díchumasófar iad.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ní féidir --ask-password agus --password a thabhairt le chéile.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Ní mholtar duit --start-pos agus --continue a úsáid le chéile; díchumasófar "
+"--continue.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL ar iarraidh\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Ní féidir --post-data agus --post-file a thabhairt le chéile.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Ní féidir --post-data nó --post-file a úsáid in éineacht le --method, rogha "
+"atá ag súil le sonraí trí na roghanna --body-data nó --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Caithfidh tú modh a roghnú le --method=HTTPMethod a úsáidfar in éineacht le "
+"--body-data nó --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Ní féidir --body-data agus --body-file a thabhairt le chéile.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ní thacaíonn an leagan seo le IRIanna\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"Is féidir -k nó -r a úsáid in éineacht le -O ach amháin má tá tú ag scríobh "
+"i ngnáthchomhad.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"Is féidir --convert-links nó --convert-file-only a úsáid le chéile ach "
+"amháin má tá tú ag scríobh i ngnáthchomhad.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Níorbh fhéidir libcares a thúsú\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Níorbh fhéidir cainéal c-ares a thúsú\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Níorbh fhéidir an seoladh IP '%s' a pharsáil\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Níorbh fhéidir freastalaí nó freastalaithe DNS '%s' a shocrú (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Níor aimsíodh aon URL i %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Níorbh fhéidir an comhad meiteanaisc %s a pharsáil.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Níorbh fhéidir na hacmhainní go léir a íoslódáil ó %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"CRÃOCHNAITHE --%s--\n"
+"Am iomlán (clog balla): %s\n"
+"Ãoslódáilte: %d comhad, %s i %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Sáraíodh cuóta íoslódála %s!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "Ní thacaítear le -O agus íoslódáil Metalink. Déanfar neamhaird de.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Comhad meiteanaisc pleanáilte: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Comhad daingnithe Metalink: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Comhad Metalink á dhiúltú. Ainm neamhshlán.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Metaurl %s á phróiseáil...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Comhad metaurl %s á dhiúltú. Ainm neamhshlán.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Níorbh fhéidir %s a íoslódáil. Ní úsáidfear metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ní féidir comhad metaurl %s a pharsáil.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Tharla earráid agus metaurl-anna á bpróiseáil.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Ní thacaítear le cineál acmhainne %s; déanfar neamhaird de...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Níorbh fhéidir an comhad íoslódáilte a oscailt.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Méid %s á áireamh\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Níor fógraíodh méid an chomhaid. Ní dhéanfar an deimhniú.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Níorbh fhéidir méid an chomhaid íoslódáilte a fháil.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Ní ionann na méideanna le haghaidh %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Is ionann na méideanna.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Suim sheiceála %s á háireamh\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Is ionann na suimeanna seiceála.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Ní ionann na suimeanna seiceála le haghaidh %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Níorbh fhéidir an comhad íoslódáilte a oscailt chun an síniú a dheimhniú.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "D'éirigh le deimhniú an tsínithe.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Síniú neamhbhailí. Acmhainn á diúltú.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Meaitseálann na sonraí an síniú, ach níl an síniú iontaofa.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Níor aimsíodh aon suimeanna seiceála.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Níorbh fhéidir %s a íoslódáil. Déanfar neamhaird den acmhainn seo.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Fuarthas comhad %s ach ní mheaitseálann an méid. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Fuarthas comhad %s ach ní mheaitseálann an tsuim sheiceála. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Fuarthas comhad %s ach ní mheaitseálann an síniú. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Ainm á athrú ó %s go %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "à leanúint sa chúlra.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "à leanúint sa chúlra, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Scríobhfar an t-aschur i %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "Theip ar fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "Theip ar fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Níorbh fhéidir tiománaí inúsáidte soicéid a aimsiú.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "Theip ar ioctl(). Níorbh fhéidir an soicéad a shocrú mar bhlocáil.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: rabhadh: tagann an teaghrán %s roimh aon ainm meaisín\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: teaghrán anaithnid comharthach \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Úsáid: %s NETRC [ÓSTAINM]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: ní féidir %s a stat: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "RABHADH: síol lag randamach in úsáid.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Níorbh fhéidir PRNG a shíolú; b'fhéidir --random-file a úsáid.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Tá an leagan de OpenSSL atá agat róshean le tacú le TLSv1.1\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Tá an leagan de OpenSSL atá agat róshean le tacú le TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Tá an leagan de OpenSSL atá agat róshean le tacú le TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: níl luach %d ar fáil le rogha 'secure-protocol'\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL neamhbhailí %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Níorbh fhéidir PRNG a shíolú; b'fhéidir --random-file a úsáid.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: ní féidir teastas %s a fhíorú, eisithe ag %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Ní féidir údarás an eisitheora a fhíorú go háitiúil.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Teastas féinsínithe.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Níl an teastas eisithe bailí fós.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Tá an teastas imithe as feidhm.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: níl aon ainm malartach ar ábhar an teastais ann a mheaitseálann\n"
+"\tan t-óstainm iarrtha %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: níl ainm coitianta an teastais %s comhoiriúnach leis an óstainm "
+"iarrtha %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: tá gnáthainm an teastais neamhbhailí (tá carachtar NUL ann).\n"
+" Seans ann go ciallaíonn seo nach é an t-óstríomhaire an fíor %s.\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Chun ceangal neamhshlán a dhéanamh le %s, úsáid `--no-check-certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ ag dul thar %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Sonrú neamhbhailí ar stíl phonc %s; á fágáil gan athrú.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " i "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ní féidir minicíocht an chloig REALTIME a fháil: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Ag baint %s toisc gur ceart é a dhiúltú.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ní féidir %s a oscailt: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "robots.txt á lódáil; déan neamhaird d'earráidí le do thoil.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Earráid agus URL an seachfhreastalaí %s á pharsáil: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Earráid i URL seachfhreastalaí %s: Ní foláir a bheith HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "níos mó ná %d atreorú.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"à éirí as.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"à triail arís.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Níor aimsíodh aon nasc briste.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Aimsíodh %d nasc briste.\n"
+"\n"
+msgstr[1] ""
+"Aimsíodh %d nasc briste.\n"
+"\n"
+msgstr[2] ""
+"Aimsíodh %d nasc briste.\n"
+"\n"
+msgstr[3] ""
+"Aimsíodh %d nasc briste.\n"
+"\n"
+msgstr[4] ""
+"Aimsíodh %d nasc briste.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ní raibh aon earráid"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Scéim gan tacaíocht %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Scéim ar iarraidh"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Óstainm neamhbhailí"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Drochuimhir phoirt"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ainm neamhbhailí úsáideora"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Seoladh uimhriúil IPv6 gan chríochnú"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Níl seoltaí IPv6 ar fáil"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Seoladh uimhriúil IPv6 neamhbhailí"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Níor tógadh an clár seo le tacaíocht HTTPS"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Chonacthas seicheamh ilbheart neamhiomlán nó neamhbhailí\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Níorbh fhéidir cuimhne a leithdháileadh; cuimhne ídithe.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Níorbh fhéidir %ld beart a leithdháileadh; cuimhne ídithe.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: maolán téacs rómhór (%d beart), á thobscor.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "à leanúint sa chúlra, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Níorbh fhéidir nasc siombalach %s a dhínascadh: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Níorbh fhéidir libcares a thúsú\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Níorbh fhéidir ceadanna le haghaidh %s a shocrú.\n"
+
+#: src/utils.c:892
+#, fuzzy, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Níorbh fhéidir ceadanna le haghaidh %s a shocrú.\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Níorbh fhéidir an seoladh IP '%s' a pharsáil\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Níorbh fhéidir ceadanna le haghaidh %s a shocrú.\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Slonn ionadaíochta neamhbhailí %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Slonn ionadaíochta neamhbhailí %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Earráid agus %s á mheaitseáil: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Earráid agus comhad WARC %s á oscailt.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Earráid agus comhad WARC %s á oscailt.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Earráid agus comhad WARC %s á oscailt.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Earráid agus sruth GZIP á oscailt go comhad WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Earráid agus taifead warcinfo á scríobh i gcomhad WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Comhad WARC %s á oscailt.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Earráid agus comhad WARC %s á oscailt.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Níl na bunURLanna sa chomhad CDX. (Colún 'a' ar iarraidh.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Níl na suimeanna seiceála sa chomhad CDX. (Colún 'k' ar iarraidh.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Níl aitheantais na dtaifead sa chomhad CDX. (Colún 'u' ar iarraidh.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Lódáladh %d taifead ó CDX.\n"
+"\n"
+msgstr[1] ""
+"Lódáladh %d thaifead ó CDX.\n"
+"\n"
+msgstr[2] ""
+"Lódáladh %d thaifead ó CDX.\n"
+"\n"
+msgstr[3] ""
+"Lódáladh %d dtaifead ó CDX.\n"
+"\n"
+msgstr[4] ""
+"Lódáladh %d taifead ó CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Níorbh fhéidir comhad CDX %s a léamh chun taifid dúbailte a bhaint.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Níorbh fhéidir comhad sealadach don lastliosta WARC a oscailt.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Níorbh fhéidir logchomhad sealadach WARC a oscailt.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Níorbh fhéidir comhad WARC a oscailt.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Níorbh fhéidir comhad CDX a oscailt le scríobh ann.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Níorbh fhéidir comhad sealadach WARC a oscailt.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Aimsíodh toradh beacht sa chomhad CDX. Taifead athchuairte á shábháil le "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Earráid chórais anaithnid"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Ní thacaítear leis an bhfine seoltaí"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Drochluach ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Teip ar réiteach na n-ainmneacha nárbh fhéidir teacht slán as"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "Ní thacaítear le ai_family"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Níorbh fhéidir cuimhne a leithdháileadh"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Níl aon seoladh ceangailte leis an óstainm"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Ainm nó seirbhís anaithnid"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Ní thacaítear le Servname le haghaidh ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "Ní thacaítear le ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "Earráid chórais"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Maolán argóintí róbheag"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Iarratas á phróiseáil"
+
+#~ msgid "Request canceled"
+#~ msgstr "Cealaíodh an t-iarratas"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Níor cealaíodh an t-iarratas"
+
+#~ msgid "All requests done"
+#~ msgstr "Gach iarratas curtha i gcrích"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Briseadh comhartha isteach air"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Ní raibh an teaghrán paraiméadar ionchódaithe mar is ceart"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: Tá an rogha '%s' débhríoch; féidearthachtaí:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: Tá an rogha '%s' débhríoch\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '--%s'\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: tá argóint de dhíth i ndiaidh na rogha '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: rogha anaithnid '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: rogha anaithnid '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: rogha neamhbhailí -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: Tá an rogha '-W %s' débhríoch\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '-W %s'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: tá argóint de dhíth i ndiaidh na rogha '-W %s'\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "D'éirigh leis"
+
+#~ msgid "No match"
+#~ msgstr "Gan torthaí"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Slonn ionadaíochta neamhbhailí"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Carachtar sórtála neamhbhailí"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ainm neamhbhailí ar aicme charachtair"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Cúlslais ag an deireadh"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Cúltagairt neamhbhailí"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [., nó [= corr"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( nó \\( corr"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ corr"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Ãbhar neamhbhailí idir \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Deireadh neamhbhailí ar raon"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Cuimhne ídithe"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Slonn ionadaíochta neamhbhailí roimhe seo"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Deireadh an tsloinn ionadaíochta gan súil leis"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Slonn ionadaíochta rómhór"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") nó \\) corr"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ní raibh slonn ionadaíochta ann roimhe seo"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "ní féidir píopa a chruthú"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "theip ar fhophróiseas %s"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "theip ar _open_osfhandle"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "ní féidir fd %d a athchóiriú: theip ar dup2"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "fophróiseas %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "Fuair fophróiseas %s comhartha marfach %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "cuimhne ídithe"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr "Seol tuairiscí ar fhabhtanna agus moltaí chuig <bug-wget@gnu.org>\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Tá an comhad `%s' ann cheana; ní aisghabhfar é.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: rogha neamhcheadaithe -- %c\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Theip ar údarú.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "fuarthas %s.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL cuir URL roimh naisc choibhneasta i gcomhad -"
+#~ "F -i.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Cothaitheoir reatha: Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ "Cannot specify -N if -O is given. See the manual for details.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ní féidir -N a shonrú má tá -O ann. Féach ar an lámhleabhar chun "
+#~ "tuilleadh eolais a fháil.\n"
+#~ "\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy úsáid seachfhreastalaí.\n"
+
+#~ msgid ""
+#~ " --no-content-disposition don't honor Content-Disposition header.\n"
+#~ msgstr ""
+#~ " --no-content-disposition ná géill do cheanntásc Content-"
+#~ "Disposition.\n"
+
+#~ msgid "%s referred by:\n"
+#~ msgstr "%s tagartha ag:\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Earráid i Set-Cookie, réimse `%s'"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - Ceangal dúnta ag beart %s/%s. "
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: Slonn neamhbhailí Boole sínithe `%s';\n"
+#~ "úsáid ceann de `on', `off', `always', nó `never'.\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Scaiptear an ríomhchlár seo le súil go mbeidh sé áisiúil,\n"
+#~ "ach GAN AON BARÃNTA; go fiú gan an barántas intuigthe\n"
+#~ "d'INDÃOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH. Féach ar an\n"
+#~ "GNU General Public License chun níos mó sonraí a fháil.\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s: Earráid agus teastas á bhailíochtú le haghaidh %s: %s\n"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Tá an comhad `%s' ann cheana, ní aisghabhfar é.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%s/%s])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' sábháilte [%s/%s])\n"
+#~ "\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Óstríomhaire folamh"
diff --git a/po/gl.gmo b/po/gl.gmo
new file mode 100644
index 0000000..425959e
--- /dev/null
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
new file mode 100644
index 0000000..7c6ea8e
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,3820 @@
+# Galician translation of wget
+# This file is distributed under the same license as the wget package.
+# Copyright (C) 2000, 2003 Free Software Foundation, Inc.
+# Copyright (C) 2012 Leandro Regueiro.
+#
+# Jacobo Tarrío Barreiro <jtarrio@trasno.net>, 2000, 2003.
+# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
+#
+# Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas
+# colaborar connosco, podes atopar máis información en http://www.trasno.net
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.14\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2012-11-11 23:30+0100\n"
+"Last-Translator: Leandro Regueiro <leandro.regueiro@gmail.com>\n"
+"Language-Team: Galician <proxecto@trasno.net>\n"
+"Language: gl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Conectando con %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Conectando con %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Conectando con [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "conectado.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "fallou: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Convertéronse %d ficheiros en %s segundos.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Convertendo %s..."
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "non hai nada que facer.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Non é posíbel converter as ligazóns en %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Non é posíbel eliminar %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Non é posíbel crear unha copia de seguridade de %s como %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Non é posíbel eliminar %s: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Erro de sintaxe en Set-Cookie: %s na posición %d.\n"
+
+#: src/cookies.c:777
+#, fuzzy, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Unha cookie procedente de %s intentou definir o dominio como %s\n"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Non é posíbel abrir o ficheiro de cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Produciuse un erro ao escribir en %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Produciuse un erro ao pechar %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Tipo de lista non compatíbel, probando o analizador de listas de Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ãndice de /%s en %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "tempo descoñecido "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Ficheiro "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Directorio "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Ligazón "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Non seguro "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Lonxitude: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", quedan %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", quedan %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (dato non fidedigno)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Identificándome como %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Erro na resposta do servidor, pechando a conexión de control.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Erro no saúdo do servidor.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Erro ao escribir, pechando a conexión de control.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "O servidor rexeita o login.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Login incorrecto.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Conectado!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Erro no servidor, non é posíbel determinar o tipo do sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "feito.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo «%c» descoñecido, pechando a conexión de control.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> non foi necesario CWD.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Non existe tal directorio %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> non se require CWD.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "O ficheiro xa se descargou.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Non foi posíbel comezar a transferencia PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Non foi posíbel analizar a resposta PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "non foi posíbel conectar a %s porto %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Erro facendo bind (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT incorrecto.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST fallou, comezando desde o principio.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "O ficheiro %s existe.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Non hai tal ficheiro %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Non hai tal ficheiro %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Non hai tal ficheiro ou directorio %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, pechando a conexión de control.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Conexión de datos: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Conexión de control pechada.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Transferencia de datos interrompida.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "O ficheiro %s xa está aí, non se ha descargar.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(intento:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito en stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - gardouse %s [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Retirando %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Usando %s como un ficheiro temporal de lista.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Retirouse %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "A profundidade de recursión %d excedeu a máxima %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"O ficheiro remoto non é máis novo que o ficheiro local %s -- non se "
+"descarga.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto é máis novo que o ficheiro local %s -- descargando.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Os tamaños non coinciden (local %s) -- descargando.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "O nome da ligazón simbólica é incorrecto, omitindo.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Xa ten unha ligazón simbólica correcta %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Creando a ligazón simbólica %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Non se admiten ligazóns simbólicas, omitindo a ligazón simbólica %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Omitindo o directorio %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tipo de ficheiro descoñecido ou non compatíbel.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Non se puido obte-la clave do certificado de %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: marca de tempo danada.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Non se han descargar directorios, porque a profundidade chegou a %d (máximo "
+"%d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Non se ha descender a %s porque está excluído ou non incluído.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Rexeitando %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Rexeitando %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Non se ha descender a %s porque está excluído ou non incluído.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Produciuse un erro ao comparar %s contra %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Non coincide co patron %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Escrito un índice en HTML en %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Escrito un índice en HTML en %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERRO: non é posíbel abrir o directorio %s.\n"
+
+#: src/gnutls.c:178
+#, fuzzy, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERRO: non é posíbel abrir o directorio %s.\n"
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ERRO: GnuTLS require que a clave e o certificado sexan do mesmo tipo.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Envíe informes de fallo e preguntas a <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERRO"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVISO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Revogouse o certificado de %s.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Revogouse o certificado de %s.\n"
+
+#: src/gnutls.c:1041
+#, fuzzy, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Revogouse o certificado de %s.\n"
+
+#: src/gnutls.c:1042
+#, fuzzy, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Revogouse o certificado de %s.\n"
+
+#: src/gnutls.c:1043
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "O certificado aínda non está activado\n"
+
+#: src/gnutls.c:1044
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Revogouse o certificado de %s.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Produciuse un erro ao inicializar o certificado X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Non se atopou ningún certificado\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Produciuse un erro ao analizar o certificado: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "O certificado aínda non está activado\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "O certificado caducou\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "O propietario do certificado non coincide co nome de servidor %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Servidor descoñecido"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Erro descoñecido"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Resolvendo %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "fallou: tempo esgotado.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Non foi posíbel resolver a ligazón incompleta %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL %s non válido: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Produciuse un erro ao escribir unha petición HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Non hai cabeceiras, asúmese HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro %s xa está aí, non se ha descargar.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Reutilizando a conexión existente con [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Reutilizando a conexión existente con %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Produciuse un erro ao ler a resposta do proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERRO %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Liña de estado mal formada"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Sistema de autenticación descoñecido.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Sistema de autenticación descoñecido.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Gardando en: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Desactivando SSL debido aos erros encontrados.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Petición %s enviada, agardando unha resposta... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Non se recibiron datos.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Erro ao ler (%s) nas cabeceiras.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sen descrición)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Localización: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "non especificado"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [seguíndoo]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" O ficheiro xa está completo; non hai nada que facer.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Lonxitude: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorado"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Aviso: comodíns non compatíbeis en HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Non é posíbel escribir en %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC temporal.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Non foi posíbel establecer a conexión SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Non é posíbel desligar %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROR: Redirección (%d) sen destino.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "O ficheiro remoto non exite -- ligazón rota!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Falta a cabeceira Last-modified -- marcas de tempo desactivadas.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Cabeceira Last-modified incorrecta -- ignorouse a marca de tempo.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro do servidor non é máis novo que o ficheiro local %s -- non se "
+"descarga.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Os tamaños non coinciden (local %s) -- descargando.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "O ficheiro remoto é máis novo, descargando.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe e pode conter ligazóns a outros recursos -- "
+"descargando.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe pero non contén ningunha ligazón -- non se "
+"descarga.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito en stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - gardouse %s [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Conexión pechada no byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Erro de lectura no byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Erro de lectura no byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Esquema %s non compatíbel"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC apunta a %s, que non existe.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Non é posíbel ler %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Erro en %s na liña %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Erro de sintaxe en %s na liña %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Orde descoñecida %s en %s na liña %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Aviso: Os ficheiros wgetrc do sistema e do usuario apuntan a %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Orde --execute non válida %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Booleano %s non válido, empregue «on» ou «off».\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Booleano %s non válido, empregue «on» ou «off».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Número %s non válido.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Valor de byte %s non válido\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Período de tempo %s non válido\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Período de tempo %s non válido\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Valor %s non válido.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Cabeceira %s non válida.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Cabeceira WARC %s non válida.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Tipo de progreso %s non válido.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Restricción %s non válida,\n"
+" empregue [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "A codificación %s non é válida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode fallou (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "non foi posíbel conectar a %s porto %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Recibiuse %s, redireccionando a saída a %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; desactivando o rexistro.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uso: %s [OPCIÓN]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Os argumentos obrigatorios nas opcións longas tamén o son nas curtas.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Inicio:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version mostra a versión de Wget e sae.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help mostra esta axuda.\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=ORDE executa unha orde de estilo «.wgetrc».\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Ficheiros de rexistro e de entrada:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FICHEIRO rexistra as mensaxes en FICHEIRO.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -o, --output-file=FICHEIRO rexistra as mensaxes en FICHEIRO.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug mostra unha chea de información de depuración.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" -d, --debug mostra unha chea de información de depuración.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -h, --help mostra esta axuda.\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html tratar o ficheiro de entrada como HTML.\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FICHEIRO Especificar o ficheiro de configuración a "
+"usar.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Descarga:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused reintentar incluso se se rexeita a "
+"conexión.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -o, --output-file=FICHEIRO rexistra as mensaxes en FICHEIRO.\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --spider non descargar nada.\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response mostrar a resposta do servidor.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider non descargar nada.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -w, --wait=SEGUNDOS agarda SEGUNDOS entre descargas.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr " -x, --force-directories forzar a creación de directorios.\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only conectar só a enderezos IPv4.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only conectar só a enderezos IPv6.\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --ask-password solicitar os contrasinais.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password solicitar os contrasinais.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Directorios:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories non crear directorios.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories forzar a creación de directorios.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nd, --no-directories non crear directorios.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " -x, --force-directories forzar a creación de directorios.\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opcións de HTTP:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=USUARIO definir o usuario de HTTP como USUARIO.\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-user=USUARIO definir o usuario de HTTP como USUARIO.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --spider non descargar nada.\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=CADEA inserir CADEA entre as cabeceiras.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --ask-password solicitar os contrasinais.\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers gardar as cabeceiras de HTTP no ficheiro.\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr " --header=CADEA inserir CADEA entre as cabeceiras.\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+#, fuzzy
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr " --header=CADEA inserir CADEA entre as cabeceiras.\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opcións de HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --config=FICHEIRO Especificar o ficheiro de configuración a "
+"usar.\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+" --config=FICHEIRO Especificar o ficheiro de configuración a "
+"usar.\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --config=FICHEIRO Especificar o ficheiro de configuración a "
+"usar.\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --config=FICHEIRO Especificar o ficheiro de configuración a "
+"usar.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "Opcións de HTTP:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opcións de FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-user=USUARIO definir o usuario de FTP como USUARIO.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing non retirar os ficheiros «.listing».\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-iri desactivar a compatibilidade IRI.\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " -S, --server-response mostrar a resposta do servidor.\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "Opcións de FTP:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opcións WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --header=CADEA inserir CADEA entre as cabeceiras.\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --spider non descargar nada.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-cookies non usar cookies.\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Descarga recursiva:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive especificar a descarga recursiva.\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --spider non descargar nada.\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por comas de etiquetas "
+"HTML ignoradas.\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr " -h, --help mostra esta axuda.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -x, --force-directories forzar a creación de directorios.\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -x, --force-directories forzar a creación de directorios.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -nd, --no-directories non crear directorios.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, un descargador de ficheiros de rede non interactivo.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Contrasinal do usuario %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Contrasinal: "
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "Non é posíbel escribir no ficheiro WARC.\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Contrasinal do usuario %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Ligazón: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s compilouse en %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (usuario)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2011 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licenza GPLv3+: GNU GPL versión 3 ou posterior\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Isto é software libre: pode modificalo e redistribuílo.\n"
+"Non hai NINGUNHA GARANTÃA, ata onde o permita a lei.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Escrito orixinalmente por Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Envíe informes de fallo e preguntas a <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Execute «%s --help» para obter máis información.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: opción inaceptábel -- «-n%c»\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Non é posíbel ser moi falador e estar en silencio ao mesmo tempo.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Non é posíbel poñer unha marca de tempo e non machacar os ficheiros antigos "
+"ao mesmo tempo.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+"Non é posíbel especificar á vez tanto --ask-password como --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: falta o URL\n"
+
+#: src/main.c:1836
+#, fuzzy, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+"Non é posíbel especificar á vez tanto --ask-password como --password.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, fuzzy, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+"Non é posíbel especificar á vez tanto --ask-password como --password.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Esta versión non é compatíbel con IRIs\n"
+
+#: src/main.c:2003
+#, fuzzy, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr "-k pode usarse xunto con -O só se a saída é un ficheiro normal.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr "-k pode usarse xunto con -O só se a saída é un ficheiro normal.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Produciuse un erro ao desligar a ligazón simbólica %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Non se atoparon URLs en %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Non é posíbel eliminar %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "SUPEROUSE a cota de descarga de %s!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Non é posíbel eliminar %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Non hai tal ficheiro %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "Non se atopou ningún certificado\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Retirando %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Continuando en segundo plano.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Continuando en segundo plano, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Vaise escribir a saída en %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Non foi posíbel atopar un controlador de sockets utilizábel.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: aviso: o elemento %s aparece antes dos nomes de máquina\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: elemento «%s» descoñecido\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uso: %s NETRC [SERVIDOR]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: non é posíbel obter información de %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Non foi posíbel sementar PRNG; considere empregar --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL %s non válido: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Non foi posíbel sementar PRNG; considere empregar --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Encontrouse un certificado autoasinado.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Para conectar de forma non segura con %s, use «--no-check-certificate».\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ omitindo %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Especificación de estilo de puntos %s non válida; queda sen cambiar.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " en "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Retirando %s porque debería ser rexeitado.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Non é posíbel abrir %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Cargando robots.txt; ignore os erros.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Produciuse un erro ao analizar o URL do proxy %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Erro no URL do proxy %s: Debe ser HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Superáronse %d redireccións.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Abandonando.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Intentándoo de novo.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Non se atoparon ligazóns rotas.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Atopouse %d ligazón rota.\n"
+"\n"
+msgstr[1] ""
+"Atopáronse %d ligazóns rotas.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ningún erro"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Esquema %s non compatíbel"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Falta o esquema"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "O nome do servidor non é válido"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Número de porto erróneo"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "O nome do usuario non é válido"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Enderezo IPv6 numérico sen rematar"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Non se admiten os enderezos IPv6"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Enderezo IPv6 numérico non válido"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Non se compilou con compatibilidade para HTTPS"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Produciuse un erro ao asignar memoria dabondo; esgotouse a memoria.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+"%s: %s: Produciuse un erro ao asignar %ld bytes; esgotouse a memoria.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: o búfer de texto é grande de máis (%ld bytes), interrompendo.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Continuando en segundo plano, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Produciuse un erro ao desligar a ligazón simbólica %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Non se puido obte-la clave do certificado de %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Non se puideron carga-los certificados de %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expresión regular non válida %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expresión regular non válida %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Produciuse un erro ao comparar %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+#, fuzzy
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Produciuse un erro ao analizar o certificado: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+#, fuzzy
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC temporal.\n"
+
+#: src/warc.c:1191
+#, fuzzy
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC temporal.\n"
+
+#: src/warc.c:1200
+#, fuzzy
+msgid "Could not open WARC file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC.\n"
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr "Non se puido atopar un servidor proxy.\n"
+
+#: src/warc.c:1239
+#, fuzzy
+msgid "Could not open temporary WARC file.\n"
+msgstr "Non é posíbel escribir no ficheiro WARC temporal.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#~ msgid "Unknown system error"
+#~ msgstr "Erro de sistema descoñecido"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: a opción «%s» é ambigua; as posibilidades son:"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opción «--%s» non permite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opción «%c%s» non permite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: a opción «--%s» require un argumento\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: opción «--%s» non recoñecida\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: opción «%c%s» non recoñecida\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opción incorrecta -- «%c»\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: a opción require un argumento -- «%c»\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: a opción «-W %s» é ambigua\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a opción «-W %s» non permite ningún argumento\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a opción «-W %s» require un argumento\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "memory exhausted"
+#~ msgstr "esgotouse a memoria"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Fallo na autorización.\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode fallou (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Recibiuse %s.\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgstr "Envíe informes de fallo e suxestións a <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "O ficheiro «%s» xa está aí, non se ha descargar.\n"
+
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr ""
+#~ "Non se puido converter `%s' a un enderezo de asignación. Cambiando a "
+#~ "CALQUERA.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Erro en Set-Cookie, campo `%s'"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST fallou; non se ha truncar `%s'.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [quedan %s por descargar]"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opción incorrecta -- %c\n"
+
+#~ msgid "Host not found"
+#~ msgstr "Non se atopou o servidor"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Non se puido estabrecer un contexto SSL\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Probando sen o certificado especificado\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Fin de ficheiro mentres se analizaban as cabeceiras.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Non se puido continua-la descarga do ficheiro, o que é incompatible con `-"
+#~ "c'.\n"
+#~ "Non se ha trunca-lo ficheiro existente `%s'.\n"
+#~ "\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (quedan %s por descargar)"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "O ficheiro `%s' xa está aí, non se ha descargar.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' gardado [%ld/%ld])\n"
+#~ "\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Conexión pechada no byte %ld/%ld. "
+
+#~ msgid "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s: Booleano '%s' non válido, empregue always (sempre), on, off ou "
+#~ "never (nunca).\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Comezo:\n"
+#~ " -V, --version amosa a versión de Wget e sae.\n"
+#~ " -h, --help amosa esta axuda.\n"
+#~ " -b, --background deixa o proceso en segundo plano.\n"
+#~ " -e, --execute=COMANDO executa un comando estoñp `.wgetrc'.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Rexistro e ficheiro de entrada:\n"
+#~ " -o, --output-file=FICHEIRO rexistra-las mensaxes no FICHEIRO.\n"
+#~ " -a, --append-output=FICHEIRO engadir mensaxes ao FICHEIRO.\n"
+#~ " -d, --debug amosar información de depuración.\n"
+#~ " -q, --quiet en silencio (sen mensaxes).\n"
+#~ " -v, --verbose moi falador (esta é a opción por "
+#~ "defecto).\n"
+#~ " -nv, --non-verbose non moi falador, sen estar en silencio.\n"
+#~ " -i, --input-file=FICHEIRO descarga-las URLs indicadas no FICHEIRO.\n"
+#~ " -F, --force-html trata-lo ficheiro de entrada coma HTML.\n"
+#~ " -B, --base=URL precede-la URL nas ligazóns relativas\n"
+#~ " en -F -i ficheiro.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Descarga de ficheiros:\n"
+#~ " -t, --tries=NÚMERO facer NÚMERO tentativas (0 é sen "
+#~ "límite).\n"
+#~ " --retry-connrefused volver tentar se se rexeita a "
+#~ "conexión.\n"
+#~ " -O --output-document=FICHEIRO escribi-los documentos ao FICHEIRO.\n"
+#~ " -nc, --no-clobber non esmaga-los ficheiros que xa "
+#~ "existan\n"
+#~ " ou empregar sufixos .nº\n"
+#~ " -c, --continue seguir descargando un ficheiro que xa "
+#~ "exista.\n"
+#~ " --progress=TIPO escolle-lo tipo de indicador de "
+#~ "progreso.\n"
+#~ " -N, --timestamping non descarga-los ficheiros se son máis\n"
+#~ " vellos que os locais.\n"
+#~ " -S, --server-response amosa-las respostas do servidor.\n"
+#~ " --spider non descargar nada.\n"
+#~ " -T, --timeout=SEGUNDOS estabrecer tódolos tempos de "
+#~ "vencemento\n"
+#~ " en SEGUNDOS.\n"
+#~ " --dns-timeout=SEGUNDOS estabrece-lo tempo de vencemento de "
+#~ "busca\n"
+#~ " en DNS en SEGUNDOS.\n"
+#~ " --connect-timeout=SEGUNDOS estabrece-lo tempo de vencemento de "
+#~ "conexión\n"
+#~ " en SEGUNDOS.\n"
+#~ " --read-timeout=SEGUNDOS estabrece-lo tempo de vencemento de "
+#~ "lectura\n"
+#~ " en SEGUNDOS.\n"
+#~ " -w, --wait=SEGUNDOS agardar SEGUNDOS entre descargas.\n"
+#~ " --waitretry=SEGUNDOS agardar 1...SEGUNDOS entre intentos.\n"
+#~ " --random-wait agardar de 0 a 2*ESPERA seg. entre "
+#~ "intentos.\n"
+#~ " -Y, --proxy=on/off activar ou desactiva-lo proxy.\n"
+#~ " -Q, --quota=NÚMERO establece-lo límite de descarga a "
+#~ "NÚMERO.\n"
+#~ " --bind-address=ENDEREZO emprega-lo ENDEREZO (nome/IP) desta "
+#~ "máquina.\n"
+#~ " --limit-rate=RAZON limita-la velocidade de descarga a "
+#~ "RAZÓN.\n"
+#~ " --dns-cache=off desactiva-la caché de buscas DNS.\n"
+#~ " --restric-file-names=SO restrinxi-los caracteres dos nomes dos\n"
+#~ " ficheiros aos que admite o SO.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Directorios:\n"
+#~ " -nd, --no-directories non crear directorios.\n"
+#~ " -x, --force-directories forza-la creación de directorios.\n"
+#~ " -nH, --no-host-directories non crea-los directorios do servidor.\n"
+#~ " -P, --directory-prefix=PREFIXO garda-los ficheiros a PREFIXO/...\n"
+#~ " --cut-dirs=NÚMERO ignorar NUMERO compoñentes dos "
+#~ "directorios\n"
+#~ " remotos.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opcións HTTP:\n"
+#~ " --http-user=USUARIO establece-lo USUARIO coma o usuario de "
+#~ "http.\n"
+#~ " --http-passwd=CLAVE establece-la CLAVE coma a clave de http.\n"
+#~ " -C, --cache=on/off (non) admitir datos da caché do servidor\n"
+#~ " (normalmente admítense).\n"
+#~ " -E, --html-extension gravar tódolos documentos text/html con\n"
+#~ " extensión .html\n"
+#~ " --ignore-length ignora-lo campo da cabeceira `Content-"
+#~ "Length'.\n"
+#~ " --header=CADEA inserta-la CADEA entre as cabeceiras.\n"
+#~ " --proxy-user=USUARIO establece-lo USUARIO coma o usuario do "
+#~ "proxy.\n"
+#~ " --proxy-passwd=CLAVE establece-la CLAVE coma a clave do proxy.\n"
+#~ " --referer=URL incluir `Referer: URL' na petición HTTP\n"
+#~ " -s, --save-headers garda-las cabeceiras HTTP ao ficheiro.\n"
+#~ " -U, --user-agent=AXENTE identificar coma AXENTE no canto de Wget/"
+#~ "VERSION.\n"
+#~ " --no-http-keep-alive desactiva-las conexións persistentes de "
+#~ "HTTP.\n"
+#~ " --cookies=off non empregar cookies.\n"
+#~ " --load-cookies=FICH carga-las cookies do FICHeiro antes da "
+#~ "sesión\n"
+#~ " --save-cookies=FICH grava-las cookies no FICHeiro trala sesión\n"
+#~ " --post-data=CADEA emprega-lo método POST; envia-la CADEA coma "
+#~ "datos.\n"
+#~ " --post-file=FICH emprega-lo método POST; envia-lo FICHeiro.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opcións de HTTPS (SSL):\n"
+#~ " --sslcertfile=FICHEIRO certificado opcional do cliente.\n"
+#~ " --sslcertkey=FICHCLAVE ficheiro de clave opcional para o "
+#~ "certificado.\n"
+#~ " --egd-file=FICHEIRO nome de ficheiro do socket EGD.\n"
+#~ " --sslcadir=DIR directorio no que se armacena a lista de "
+#~ "CAs.\n"
+#~ " --sslcafile=FICHEIRO ficheiro cun lote de CAs\n"
+#~ " --sslcerttype=0/1 tipo de certificado de cliente\n"
+#~ " 0=PEM (valor por defecto) / 1=ASN1 (DER)\n"
+#~ " --sslcheckcert=0/1 compara-lo certificado do servidor coa CA "
+#~ "dada\n"
+#~ " --sslprotocol=0-3 escolle-lo protocolo SSL; 0=automático,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opcións FTP:\n"
+#~ " -nr, --dont-remove-listing non elimina-los ficheiros `.listing'.\n"
+#~ " -g, --glob=on/off usar ou non comparación de nomes de "
+#~ "ficheiros\n"
+#~ " con patróns.\n"
+#~ " --passive-ftp usa-lo modo de transferencia \"passive\".\n"
+#~ " --retr-symlinks ao descargar recursivamente, descarga-los\n"
+#~ " ficheiros ligados (non os "
+#~ "directorios).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Descarga recursiva:\n"
+#~ " -r, --recursive descarga recursiva.\n"
+#~ " -l, --level=NUMERO máximo nivel de recursión (empregue inf ou "
+#~ "0\n"
+#~ " para infinito).\n"
+#~ " --delete-after borra-los ficheiros despois de "
+#~ "descargalos.\n"
+#~ " -k, --convert-links converti-las ligazóns non relativas a "
+#~ "relativas.\n"
+#~ " -K, --backup-converted antes de converti-lo ficheiro X, facer "
+#~ "unha\n"
+#~ " copia chamada X.orig\n"
+#~ " -m, --mirror opción atallo equivalente a -r -N -l inf -"
+#~ "nr.\n"
+#~ " -nr, --dont-remove-listing non borra-los ficheiros `.listing'.\n"
+#~ " -p, --page-requisites obter tódalas imaxes, etc. necesarias "
+#~ "para\n"
+#~ " amosa-la páxina HTML.\n"
+#~ " --strict-comments activa-lo manexo estricto (SGML) dos\n"
+#~ " comentarios HTML.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Aceptar/rexeitar en descargas recursivas:\n"
+#~ " -A, --accept=LISTA lista de extensións aceptadas,\n"
+#~ " separadas por comas.\n"
+#~ " -R, --reject=LISTA lista de extensións rexeitadas,\n"
+#~ " separadas por comas.\n"
+#~ " -D, --domains=LISTA lista de dominios aceptados,\n"
+#~ " separadas por comas.\n"
+#~ " --exclude-domains=LISTA lista de dominios rexeitados,\n"
+#~ " separadas por comas.\n"
+#~ " --follow-ftp segui-las ligazóns a FTP dende "
+#~ "documentos\n"
+#~ " en HTML.\n"
+#~ " --follow-tags=LISTA lista de etiquetas HTML que se "
+#~ "siguen,\n"
+#~ " separadas por comas.\n"
+#~ " -G, --ignore-tags=LISTA lista de etiquetas HTML que se "
+#~ "ignoran,\n"
+#~ " separadas por comas.\n"
+#~ " -H, --span-hosts ir a servidores de fóra durante a\n"
+#~ " recursión.\n"
+#~ " -L, --relative seguir só as ligazóns relativas.\n"
+#~ " -I, --include-directories=LISTA lista de directorios admitidos.\n"
+#~ " -X, --exclude-directories=LISTA lista de directorios excluídos.\n"
+#~ " -np, --no-parent non ascender ao directorio pai.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Este programa distribúese coa intención de que sexa útil, pero SEN\n"
+#~ "NINGUNHA GARANTIA; nin sequera a garantía implícita de MERCABILIDADE\n"
+#~ "ou APTITUDE PARA UN FIN PARTICULAR. Vexa a Licencia Pública Xeral de\n"
+#~ "GNU para obter máis detalles.\n"
+
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Comezando WinHelp %s\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Nome baleiro"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Non hai memoria dabondo.\n"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Erro de sintaxe en Set-Cookie no carácter `%c'.\n"
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Non se pode convertir `%s' a un enderezo IP.\n"
+
+#~ msgid "%s: %s: invalid command\n"
+#~ msgstr "%s: %s: comando non válido\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: Detectouse un ciclo de redireccións.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "CTRL+Break received, redirecting output to `%s'.\n"
+#~ "Execution continued in background.\n"
+#~ "You may stop Wget by pressing CTRL+ALT+DELETE.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Recibiuse un CTRL+Break, redireccionando a saida a `%s'.\n"
+#~ "A execución segue en segundo plano.\n"
+#~ "Pode deter Wget premendo CTRL+ALT+DELETE.\n"
+
+#~ msgid "Connection to %s:%hu refused.\n"
+#~ msgstr "A conexión a %s:%hu foi rexeitada.\n"
+
+#~ msgid "Will try connecting to %s:%hu.\n"
+#~ msgstr "Tentarase conectar con %s:%hu.\n"
+
+#~ msgid "Unknown/unsupported protocol"
+#~ msgstr "Protocolo descoñecido ou non soportado"
+
+#~ msgid "Invalid port specification"
+#~ msgstr "Especificación de porto incorrecta"
+
+#~ msgid "%s: Cannot determine user-id.\n"
+#~ msgstr "%s: Non se pode determina-lo identificador de usuario.\n"
+
+#~ msgid "%s: Warning: uname failed: %s\n"
+#~ msgstr "%s: Advertencia: a chamada a uname fallou: %s\n"
+
+#~ msgid "%s: Warning: gethostname failed\n"
+#~ msgstr "%s: Advertencia: a chamada a gethostname fallou\n"
+
+#~ msgid "%s: Warning: cannot determine local IP address.\n"
+#~ msgstr "%s: Advertencia: non se pode determina-lo enderezo IP local.\n"
+
+#~ msgid "%s: Warning: cannot reverse-lookup local IP address.\n"
+#~ msgstr "%s: Aviso: non se pode facer unha resolución inversa da IP local.\n"
+
+#~ msgid "%s: Warning: reverse-lookup of local address did not yield FQDN!\n"
+#~ msgstr ""
+#~ "%s: Aviso: a resolución inversa do enderezo local non devolveu un FQDN\n"
+
+#~ msgid "%s: Out of memory.\n"
+#~ msgstr "%s: Memoria esgotada.\n"
+
+#~ msgid "%s: Redirection to itself.\n"
+#~ msgstr "%s: Redirección a si mesmo.\n"
+
+#~ msgid "Error (%s): Link %s without a base provided.\n"
+#~ msgstr "Error (%s): Proporcionouse a ligazón %s sen unha base.\n"
+
+#~ msgid "Error (%s): Base %s relative, without referer URL.\n"
+#~ msgstr "Error (%s): A base %s é relativa, sen unha URL á que se referir.\n"
+
+#~ msgid ""
+#~ "Local file `%s' is more recent, not retrieving.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "O ficheiro local `%s' é máis recente, non se ha descargar.\n"
+#~ "\n"
diff --git a/po/he.gmo b/po/he.gmo
new file mode 100644
index 0000000..0867cee
--- /dev/null
+++ b/po/he.gmo
Binary files differ
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..0388393
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,3522 @@
+# Hebrew messages for GNU Wget -*- coding: hebrew-iso-8bit -*-
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Eli Zaretskii <eliz@is.elta.co.il>, 2001, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.8.1\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2002-02-03 20:08+0200\n"
+"Last-Translator: Eli Zaretskii <eliz@gnu.org>\n"
+"Language-Team: Hebrew <eliz@gnu.org>\n"
+"Language: he\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+# FIXME: this is lame! The method of printing "Frobbing...done" etc.
+# does not lend itself to good translations into languages where
+# such sentences have a different structure, and should be rethought.
+#: src/connect.c:282
+#, fuzzy, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "%s:%hu-ì úåøù÷úä ïåéñð"
+
+# FIXME: this is lame! The method of printing "Frobbing...done" etc.
+# does not lend itself to good translations into languages where
+# such sentences have a different structure, and should be rethought.
+#: src/connect.c:290
+#, fuzzy, c-format
+msgid "Connecting to %s:%d... "
+msgstr "%s:%hu-ì úåøù÷úä ïåéñð"
+
+# FIXME: this is lame! The method of printing "Frobbing...done" etc.
+# does not lend itself to good translations into languages where
+# such sentences have a different structure, and should be rethought.
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "%s:%hu-ì úåøù÷úä ïåéñð"
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+# Pay attention: this is written to the RIGHT of "Connecting.." !!
+#: src/connect.c:357
+#, fuzzy
+msgid "connected.\n"
+msgstr "á äçìöä\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr ""
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "á (%s: %s) íéøåùé÷ úøîä úì÷ú\n"
+
+# Note: the following 5 messages are all written on the same line!
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "%s úøîä"
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "á êøåö ïéà\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "á (%s: %s) íéøåùé÷ úøîä úì÷ú\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "`%s' ÷åçîì ïåéñðá (%s) äì÷ú\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "%s-ì éåáéâë %s úáéúëá (%s) äì÷ú\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "`%s' ÷åçîì ïåéñðá (%s) äì÷ú\n"
+
+#: src/cookies.c:464
+#, fuzzy, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr ".éãî íã÷åî úîééúñî úæåøçîä :Set-Cookie úøúåë ìù éåâù øéáçú\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr ""
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "`%s' úåéâåò õáå÷ úçéúô úòá (%s) äì÷ú äòøéà\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "`%s'-ì äáéúëá (%s) äì÷ú\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "`%s' úøéâñá (%s) äì÷ú\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ".Unix èîøåô åîë ùøôì äñðî ,øëåî-éúìá âåñî íéöá÷ úîéùø\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s äé÷éúá %s:%d-á íéöá÷ úîéùø"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr " òåãé àì ïåëãò ïîæ"
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr " õáå÷"
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr " äé÷éú"
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr " øåùé÷"
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr " òåãé àì âåñ"
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (íéúá %s)"
+
+# FIXME: This 3-part message will look totally messed up in a
+# right-to-left language such as Hebrew! The maintainers
+# should _really_ fix the code!
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "%s :êøåà"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (äëøòä)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "%s-ë äñéðë ïåéñð"
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ".øâñð äø÷áä ÷éôà ,úøù ìù éåâù äðòî\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr ".éåâù úøùä ìù äçéúô øñî\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr ".øâñð äø÷áä ÷éôà ,äáéúëá äì÷ú\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr ".äñéðë äùøî åðéà úøùä\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr ".äéåâù äñéðë\n"
+
+# Note: this is written to the right of "Logging in as", with no newline!
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "á äçìöä\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr ".úëøòî âåñ òåá÷ì úåøùôà ïéà ,úøù ìù éåâù äðòî\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr " <== äçìöäá òöåá"
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr " <== äçìöäá òöåá\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr ".øâñð äø÷áä ÷éôà ,øëåî åðéà `%c' äøáòä âåñ\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr " <== äçìöäá òöåá"
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> .úùøãð äðéà CWD úãå÷ô\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+".úîéé÷ äðéà `%s' äé÷éú\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> .CWD úãå÷ôá êøåö ïéà\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr ".åúåà êåùîì êøåö ïéà ,ïàë øáë `%s' õáå÷\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr ".PASV úèéùá äøáòä òéðúäì ïúéð àì\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr ".PASV úãå÷ôì äðòî ùøôì ïúéð àì\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr ""
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr ".(%s) úåøù÷úä úì÷ú\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr ".PORT úì÷ú\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+".äìçúäî ìéçúî ;äìùëð REST úãå÷ô\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+".íéé÷ åðéà `%s' õáå÷\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+".íéé÷ åðéà `%s' õáå÷\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+".íéîéé÷ äé÷éú åà õáå÷ åðéà `%s'\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr ".øâñð äø÷áä ÷éôà ,%s-á (%s) äì÷ú\n"
+
+# Note: the rightmost colon is for the message that will be printed
+# later.
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "(%s :äòù %s :áö÷) íéðåúðä ÷éôàá (%s) äì÷ú :"
+
+# Note: this and the next one don't have the period because they get
+# printed to the right of the previous message.
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "øâñð äø÷áä ÷éôà\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "ä÷ñôåä íéðåúð úøáòä\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr ".åúåà êåùîì êøåö ïéà ,ïàë øáë `%s' õáå÷\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(%2d 'ñî ïåéñð)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+# I give up!
+#: src/ftp.c:2051 src/http.c:4793
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' saved [%ld]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr ".%s ÷çåî\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr ".íéöá÷ úîéùø úìá÷ì éðîæ õáå÷ë `%s'-á ùîúùî\n"
+
+#: src/ftp.c:2185
+#, fuzzy, c-format
+msgid "Removed %s.\n"
+msgstr ".÷çîð `%s' õáå÷\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr ".åéìò äìåò %d ìòåôá ÷îåò êà ,%d àåä éáøéî äéñøå÷ø ÷îåò\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ".êùîéé àì õáå÷ä -- `%s' éîå÷î õáå÷î øúåé éðëãò åðéà ÷çåøî õáå÷\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ".êùîéé õáå÷ä -- `%s' éîå÷î õáå÷î øúåé éðëãò ÷çåøî õáå÷\n"
+
+#: src/ftp.c:2309
+#, fuzzy, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ".êùîéé õáå÷ä -- (%ld :éîå÷î õáå÷) ääæ åðéà ìãåâ\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr ".èîùåé õáå÷ä ,øëåî åðéà éìåáîéñ øåùé÷ õáå÷ ìù åîù\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ".íéé÷ øáë %s -> %s éìåáîéñ øåùé÷\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr ".%s -> %s éìåáîéñ øåùé÷ øöåé\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ".`%s' õáå÷ èéîùî ,íéëîúð íðéà éìåáîéñ øåùé÷ éöá÷\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr ".`%s' äé÷éú èéîùî\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr ".êîúð åðéà åà øëåî-éúìá âåñî åðéä `%s' õáå÷\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "%s-î øåùéà çúôî úìá÷á äì÷ú\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr ".äéåâù ïîæ úîéúç ìòá àåä `%s' õáå÷\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ".øúåé áø %d ï÷îåò ïëù åëùîéé àì úåé÷éú ;%d éáøéî ÷îåò\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ".äîéùøäî äàöåä åà äììëð àìù íåùî `%s'-ì ñðëéäìî òðîð\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr ".äçãð `%s'\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr ".äçãð `%s'\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, fuzzy, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "`%s'-ì äáéúëá (%s) äì÷ú\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr ".`%s' úéðáúì úåîàúä ïéà\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "`%s'-ì äáúëð íéúá %ld ìãåâáå HTML èîøåôá íéöá÷ úîéùø\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "`%s'-ì äáúëð HTML èîøåôá íéöá÷ úîéùø\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr " .<bug-wget@gnu.org> úáåúëì øåôéùì úåòöäå (bugs) äì÷ú éçååéã åçìù\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "`%s'-ì äáéúëá (%s) äì÷ú\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+#, fuzzy
+msgid "Unknown host"
+msgstr "ääåæî-éúìá äì÷ú"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "ääåæî-éúìá äì÷ú"
+
+#: src/host.c:850
+#, fuzzy, c-format
+msgid "Resolving %s... "
+msgstr ".%s ÷çåî\n"
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr ""
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr ""
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, fuzzy, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr ".%s äàøåäá `%s' éåâù êøò\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr ".HTTP úééðô ìù äçéìùá (%s) äì÷ú\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ".åúåà êåùîì êøåö ïéà ,ïàë øáë `%s' õáå÷\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr ".%s:%hu-ì øåáéçá ùîúùäì êéùîî\n"
+
+#: src/http.c:2098
+#, fuzzy, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr ".%s:%hu-ì øåáéçá ùîúùäì êéùîî\n"
+
+#: src/http.c:2164
+#, fuzzy, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr ".HTTP úééðô ìù äçéìùá (%s) äì÷ú\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROR %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "áöîä úøåù ìù éåâù äðáî"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr ".úøëåî-éúìá úåîéà úèéù\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr ".úøëåî-éúìá úåîéà úèéù\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr ""
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+# FIXME: This message can be followed by "%d %s", which prints
+# the operation status code and error message. I don't see how
+# can I make this look right in Hebrew...
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "...äáåùú úìá÷ì ïéúîî ,äçìùð %s úééðô "
+
+#: src/http.c:3441
+#, fuzzy
+msgid "No data received.\n"
+msgstr "èì÷ éðåúð åìá÷úä àì"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr ".úåøúåë úàéø÷ úòá (%s) úì÷ú\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(äòåãé-éúìá äáéñ)"
+
+# Pay attention: the translation of "unspecified" goes to the
+# left of this, the translation of "[following]" goes to the right.
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "%s :øúàì áåúéð éåðéù%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "unspecified"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " øçà á÷åò"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" .éäùìë äìåòôá êøö ïéà ;êùîð æàî äðúùä àì õáå÷ä ìù åìãåâ\n"
+"\n"
+
+# The next 3 messages are printed in order on the same line, and
+# this one is followed by a number! I give up!!
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Length: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignored"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr ".HTTP-á íéëîúð íðéà (wildcards) äììëä éåú :äøäæà\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr ".`%s' úáéúëá (%s) äì÷ú\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr ".`%s' úáéúëá (%s) äì÷ú\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr ".(SSL) çèáåàî øù÷ õåøò íé÷äì ïúéð àì\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr ".`%s' úáéúëá (%s) äì÷ú\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr ".øúà íù àìì áåúéð (%d) éåðéù :äì÷ú\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ".úåðéîæ åéäé àì ïîæ úåîéúç -- äàöîð àì ïåøçà éåðéù ïîæ úøúåë\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ".ïîæä úîéúçî íìòúî -- äéåâù ïåøçà éåðéù ïîæ úøúåë\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+".êùîéé àì õáå÷ä -- `%s' éîå÷î õáå÷î øúåé éðëãò åðéà úøùá õáå÷\n"
+"\n"
+
+#: src/http.c:4651
+#, fuzzy, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr ".êùîéé õáå÷ä -- (%ld :éîå÷î õáå÷) ääæ åðéà ìãåâ\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr ".êùîéé õáå÷ä ,øúåé éðëãò ÷çåøî õáå÷\n"
+
+#: src/http.c:4678
+#, fuzzy
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ".êùîéé õáå÷ä -- `%s' éîå÷î õáå÷î øúåé éðëãò ÷çåøî õáå÷\n"
+
+#: src/http.c:4684
+#, fuzzy
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ".êùîéé àì õáå÷ä -- `%s' éîå÷î õáå÷î øúåé éðëãò åðéà ÷çåøî õáå÷\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+#, fuzzy
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ".êùîéé õáå÷ä ,øúåé éðëãò ÷çåøî õáå÷\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s ERROR %d: %s.\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+# Come on, are they serious??
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - `%s' saved [%ld/%ld]\n"
+"\n"
+
+#: src/http.c:4818
+#, fuzzy, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr ".øâñð øåáéçä ,%s-á (%s) íéúá %ld éøçà äì÷ú "
+
+#: src/http.c:4841
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr ".%s-á %s áö÷á åìá÷úðù íéúá %ld éøçà (%s) äàéø÷ úì÷ú"
+
+#: src/http.c:4850
+#, fuzzy, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr ".%s-á %s áö÷á åìá÷úðù íéúá %ld/%ld éøçà (%s) äàéø÷ úì÷ú "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr ""
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr ".%s úéðëú é\"ò %s õáå÷ úçéúôá (%s) äì÷ú\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr ".%s úéðëú øåáò äéåâù %s õáå÷á %d äøåù\n"
+
+#: src/init.c:718
+#, fuzzy, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr ".%s úéðëú øåáò äéåâù %s õáå÷á %d äøåù\n"
+
+# This message is under "ifdef DEBUG", so no need to translate it.
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: BUG: unknown command `%s', value `%s'.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: ùîúùîä ìù ïäå úëøòîä ìù ïä wgetrc õáå÷ë ùîùî `%s' :äøäæà\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: %s äéåâù äãå÷ô\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: ãáìá off åà on íéëøò úìá÷î %s äàøåä\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr ""
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s äàøåäá `%s' éåâù êøò\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "%s-î øåùéà çúôî úìá÷á äì÷ú\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr "%s åìá÷úä ,`%%s'-ì èìô úééðôä\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr ""
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "%s [ïééôàî]... [URL]... :ùåîéù ïôåà\n"
+
+#: src/main.c:590
+#, fuzzy
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"\n"
+".íéøö÷ íéðééôàîì íâ íééçøëä ,íéëåøà íéðééôàîì íééçøëää íéèðîåâøà\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+#, fuzzy
+msgid "Directories:\n"
+msgstr " äé÷éú"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ".ìéòôî úåôúúùä àìì úùøäî íéöá÷ úëéùî ,%s àñøéâ GNU Wget úéðëú\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr ""
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+#, fuzzy
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+".Hrvoje Niksic <hniksic@arsdigita.com> é\"ò øå÷îá äáúëð åæ úéðëú\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr " .<bug-wget@gnu.org> úáåúëì øåôéùì úåòöäå (bugs) äì÷ú éçååéã åçìù\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr ".øúåé áø òãéî úâöäì `%s --help' ùé÷äì äñð\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: `-n%c' éåâù ïééôàî\n"
+
+#: src/main.c:1593
+#, fuzzy, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ".`--debug' ïééôàîá äëéîú íò äúðáð àì %s úéðëúä\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr ".äæ úà äæ íéøúåñ quiet-å verbose\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ".äæ úà äæ íéøúåñ ïåøçà ïåëãò ïîæ íåùéøå íéîéé÷ íéöá÷ ìò äøéîù\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: øñç URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr ".%s-á URL óà àöîð àì\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "`%s' ÷åçîì ïåéñðá (%s) äì÷ú\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, fuzzy, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"\n"
+"--%s-- äòùá íééúñä\n"
+"íéúá %s ,íéöá÷ %d åëùîð\n"
+
+#: src/main.c:2284
+#, fuzzy, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "!(íéúá %s) äëéùî úìáâîî äâéøç\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "`%s' ÷åçîì ïåéñðá (%s) äì÷ú\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr ".%s ÷çåî\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr ".ò÷øá êéùîî\n"
+
+#: src/mswindows.c:289
+#, fuzzy, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr ".ò÷øá êéùîî\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr ".`%s'-ì áúëéé èìô\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Couldn't find usable socket driver.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: áùçîä íù øãâåäù éðôì äòéôåî \"%s\" çúôî úìéî :äøäæà\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: \"%s\" úøëåî-éúìá çúôî úìéî\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "%s NETRC [çøàî-áùçî íù] :ùåîéùä ïôåà\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s úéðëúá %s õáå÷ì äùéâá (%s) äì÷ú\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+#, fuzzy
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, fuzzy, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+" [ %dK ìò âìãî ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr ".÷çîéé ïë-ìòå äçãð %s\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "á (%s: %s) íéøåùé÷ úøîä úì÷ú\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr ".äàéâù úåòãåäî íìòúäì àð ;robots.txt õáå÷ ïòåè\n"
+
+#: src/retr.c:934
+#, fuzzy, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "`%s'-ì äáéúëá (%s) äì÷ú\n"
+
+#: src/retr.c:948
+#, fuzzy, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr ".HTTP úåéäì áééç :%s äùøåî úøù\n"
+
+#: src/retr.c:1079
+#, fuzzy, c-format
+msgid "%d redirections exceeded.\n"
+msgstr ".%s úéðëúá úéìâòî äééðôä äúìâúä\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"!òðëð éðà\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+".óñåð ïåéñð\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+#, fuzzy
+msgid "No error"
+msgstr "ääåæî-éúìá äì÷ú"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr ""
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "çøàî-áùçî ìù éåâù íù"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr ""
+
+#: src/url.c:685
+#, fuzzy
+msgid "Invalid user name"
+msgstr "çøàî-áùçî ìù éåâù íù"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr ""
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:1007
+#, fuzzy
+msgid "HTTPS support not compiled in"
+msgstr ".`--debug' ïééôàîá äëéîú íò äúðáð àì %s úéðëúä\n"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, fuzzy, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr ".ò÷øá êéùîî\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "`%s' éìåáîéñ øåùé÷ ú÷éçîá (%s) äì÷ú\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "%s-î øåùéà çúôî úìá÷á äì÷ú\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "%s-î (certificates) øåùéà úåéåú úðéòèá äì÷ú\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "`%s'-ì äáéúëá (%s) äì÷ú\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr ""
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+#, fuzzy
+msgid "Could not open CDX file for output.\n"
+msgstr ".äùøåî úøù àöîð àì\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, c-format
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "éåâù Set-Cookie úøúåë ìù `%s' äãù"
+
+#, c-format
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr ".`%c' åú úáø÷á Set-Cookie úøúåë ìù éåâù øéáçú\n"
+
+#, c-format
+#~ msgid "Connection to %s:%hu refused.\n"
+#~ msgstr ".äçãð %s:%hu-ì úåøù÷úä ïåéñð\n"
+
+#, c-format
+#~ msgid "Will try connecting to %s:%hu.\n"
+#~ msgstr ".%s:%hu-ì øù÷úäì äñðî\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ ".`%s' ìù íãå÷ ïëåú ÷åçîì éàùø éððéà ;äìùëð REST úãå÷ô\n"
+
+#, c-format
+#~ msgid " [%s to go]"
+#~ msgstr " [%s ãåò øàùð]"
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `--%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `%c%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s úéðëú øåáò èðîåâøà áééçî `%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s úéðëú é\"ò øëåî åðéà `--%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s úéðëú é\"ò øëåî åðéà `%c%s' ïééôàî\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: é÷åç-éúìá ïééôàî -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: èðîåâøà áééçî ïééôàî -- %c\n"
+
+#~ msgid "Host not found"
+#~ msgstr "àöîð àì çøàî áùçî"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "(SSL) çèáåàî øåãéù úáéáñ úøéöéá äì÷ú\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "úùøãð øåùéà úéåú àìì êéùîäì ïåéñð\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr ".úåøúåëä çåúéð éãë êåú èì÷ øîâ\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr ".úåîéàä áìùá ïåìùë\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ ",ó÷åúá `-c' ïééôàîå úåéä .äìùëð äæ õáå÷ ìù êùîä-úëéùî\n"
+#~ ".`%s' íéé÷ õáå÷ áúëùì éúåøùôàá ïéà\n"
+#~ "\n"
+
+#, c-format
+#~ msgid " (%s to go)"
+#~ msgstr " (%s to go)"
+
+#, c-format
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr ".êùîéé àì ïë-ìòå ,íéé÷ øáë `%s' õáå÷\n"
+
+#, c-format
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' saved [%ld/%ld]\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr ".øâñð øåáéçä ,%s-á (%s) íéúá %ld/%ld éøçà äì÷ú "
+
+#, c-format
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: IP úáåúëì äøîäì úðúéð äððéà %s úàøåäá `%s'\n"
+
+#, c-format
+#~ msgid "%s: %s: Please specify always, on, off, or never.\n"
+#~ msgstr "%s: never åà off ,on ,always íéëøò ÷ø úìá÷î %s äàøåä\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :"
+#~ "ìåçéú\n"
+#~ " úéðëúä úñøéâ úà âöä -V, --version\n"
+#~ " äæ äøæò êñî âöä --help\n"
+#~ " ìåçéú øîâá ò÷øá äãåáòì øåáò -b, --background\n"
+#~ " wgetrc ïåðâñá äãå÷ô òöá -e, --execute=COMMAND\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :ïîåéå èì÷ "
+#~ "éöá÷\n"
+#~ " FILE õáå÷ì úåòãåä çìù -o, --output-file=FILE\n"
+#~ " FILE õáå÷ì úåòãåä óñåä -a, --append-"
+#~ "output=FILE\n"
+#~ " úåàéâù éåôéðá äøæòì úåòãåä ñôãä -d, --debug\n"
+#~ " (úåòãåä àìì) äè÷ù äìåòô -q, --quiet\n"
+#~ " (ìãçîä úøéøá éäåæ) øéáëîì úåòãåä ñôãä -v, --verbose\n"
+#~ " äè÷ù äìåòôì øåáòú ìà êà ,úåòãåä éåáéø ìèá -nv, --non-verbose\n"
+#~ " FILE õáå÷ êåúî äëéùîì íé-URL ç÷ -i, --input-file=FILE\n"
+#~ " HTML èîøåôá åðéä -i-á èì÷ õáå÷ éë çðä -F, --force-html\n"
+#~ " URL-ì íééñçé íðéä -i-ì èðîåâøàá íéîåùøä íéöá÷ -B, --base=URL\n"
+#~ " çå÷ì áùçîì øåùéà õáå÷ ïåéö úåøùôà --sslcertfile=FILE\n"
+#~ " äæ øåùéà øåáò çúôî õáå÷ ïåéö úåøùôà --"
+#~ "sslcertkey=KEYFILE\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --dot-style=STYLE set retrieval display style.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set the read timeout to SECONDS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :íéöá÷ "
+#~ "úëéùî\n"
+#~ " éîå÷î áùçîá (IP åà áùçî íù) ADDR úáåúëì øù÷úä --bind-address=ADDR\n"
+#~ " (äìáâî ïéà åòîùî 0) úåøù÷úä úåðåéñð øôñî òá÷ -t, --tries=NUMBER\n"
+#~ " FILE-ì èìô çìù -O --output-"
+#~ "document=FILE\n"
+#~ "íäî úåàñøâ äîë øåîùú ìàå íéîéé÷ íéöá÷ ñåøäú ìà -nc, --no-clobber\n"
+#~ " ú÷ñôä äá äãå÷ðäî õáå÷ ãéøåäì êùîä -c, --continue\n"
+#~ " äëéùîä úåîã÷úä úâåöú ïåðâñ òá÷ --dot-style=STYLE\n"
+#~ " íééîå÷î íéöá÷î íéðëãåòî íðéàù íéöá÷ êåùîú ìà -N, --timestamping\n"
+#~ " úøùäî íéòéâîä íéøñî âöä -S, --server-response\n"
+#~ " øáã êåùîú ìà --spider\n"
+#~ " èì÷ì äðúîäì éáøéî ïîæ òá÷ -T, --timeout=SECONDS\n"
+#~ " úåëéùî ïéá äééäùä òá÷ -w, --wait=SECONDS\n"
+#~ " úåðåéñð ïéá úåéðù N ãò ïúîä --waitretry=N\n"
+#~ " äùøåî úøùá ùîúùú ìà\\ùîúùä -Y, --proxy=on/off\n"
+#~ "(äìáâî ïéà åòîùî 0) äëéùîì íéúá úåîë úìáâî òá÷ -Q, --quota=NUMBER\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :"
+#~ "úé÷éåú\n"
+#~ " úåùãç úåé÷éú øåöéú ìà -nd --no-directories\n"
+#~ " úåùãç úåé÷éú øåöéú ãéîú -x, --force-directories\n"
+#~ " íéöá÷ä åãøåä åðîî øúàä íùá úåé÷éú øåöéú ìà -nH, --no-host-"
+#~ "directories\n"
+#~ " PFX/... äé÷éú úçú íéöá÷ä ìë úà øåîù -P, --directory-"
+#~ "prefix=PFX\n"
+#~ " úåé÷éúä úåîùî íéðåùàø íé÷ìç N èîùä --cut-dirs=N\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :HTTP "
+#~ "éðééôàî\n"
+#~ " HTTP ùîúùî ìù åîù USER éäé --http-user=USER\n"
+#~ " HTTP ùîúùî ìù åúîñéñ PASS éäé --http-passwd=PASS\n"
+#~ " úøùá ïåîèîá åøîùðù íéðåúð äùøú ìà\\äùøä -C, --cache=on/off\n"
+#~ " .html úîåéñ íéöá÷ä ìëì ïú -E, --html-extension\n"
+#~ " `Content-Length' úøúåëî íìòúä --ignore-length\n"
+#~ " úåøúåëä êåúá STRING úæåøçî ìåúù --header=STRING\n"
+#~ " äùøåî úøùá ùîúùîä ìù åîù USER éäé --proxy-user=USER\n"
+#~ " äùøåî úøùá ùîúùîä ìù åúîñéñ PASS éäé --proxy-passwd=PASS\n"
+#~ " HTTP úééðôì `Referer: URL' úøúåë óñåä --referer=URL\n"
+#~ " èìô éöá÷á HTTP úåøúåë øåîù -s, --save-headers\n"
+#~ " ìéâøë Wget/VERSION íå÷îá AGENT úéðëúë ääãæä -U, --user-agent=AGENT\n"
+#~ " (ãéîúî HTTP øåáéç) keep-alive-á ùåîéù ìèá --no-http-keep-"
+#~ "alive\n"
+#~ " (cookies) úåéâåòá ùîúùú ìà --cookies=off\n"
+#~ " äãåáòä úìéçú éðôì FILE õáå÷î úåéâåò ïòè --load-cookies=FILE\n"
+#~ " äãåáòä øîâá FILE õáå÷á úåéâåò øåîù --save-cookies=FILE\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :FTP "
+#~ "éðééôàî\n"
+#~ " listing éöá÷ ÷çîú ìà -nr, --dont-remove-"
+#~ "listing\n"
+#~ " íéöá÷ úåîùá äáçøä éåúá äëéîú ìéòôú ìà\\ìòôä -g, --glob=on/off\n"
+#~ " (\"PASV\") úéáéñô äøáòä úèéùá ùîúùä --passive-ftp\n"
+#~ " íéøåùé÷ ìù äøèî éöá÷ êåùî ,úéáéñøå÷ø äëéùîá --retr-symlinks\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive web-suck -- use with care!\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :úéáéñøå÷ø "
+#~ "äëéùî\n"
+#~ " (!úøäæåä äàø !ïëåñî) -- úéáéñøå÷ø äëéùî øùôà -r, --recursive\n"
+#~ "ìáâåî-éúìá ÷îåòì åà 0 ,äéñøå÷øì éáøéî ÷îåò òá÷ -l, --level=NUMBER\n"
+#~ " äëéùî øîâá úéîå÷î íéöá÷ä ìë úà ÷çî --delete-after\n"
+#~ " íééñçéì íéøåùé÷ êåôä -k, --convert-links\n"
+#~ " äëéôä éðôì éåáéâë õáå÷ ìë øåîù -K, --backup-converted\n"
+#~ " -r -N -l inf -nr íéðééôàîä óåøéöì øåöé÷ -m, --mirror\n"
+#~ " HTML úâåöúì íéùøãðä íéöá÷ä ìë úà êåùî -p, --page-requisites\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -nh, --no-host-lookup don't DNS-lookup hosts.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ " :úéáéñøå÷ø äëéùî úòá äééçã åà "
+#~ "äìá÷\n"
+#~ " íé÷éñô é\"ò úåãøôåî úåøúåî úåîåéñ úîéùø -A, --accept=LIST\n"
+#~ " íé÷éñô é\"ò úåãøôåî úåøåñà úåîåéñ úîéùø -R, --reject=LIST\n"
+#~ " íé÷éñô é\"ò íéãøôåî íéøúåî íéîåçú úåîù úîéùø -D, --domains=LIST\n"
+#~ " íé÷éñô é\"ò íéãøôåî íéøåñà íéîåçú úåîù úîéùø --exclude-"
+#~ "domains=LIS\n"
+#~ " HTML éôãá FTP éøåùé÷ øçà áå÷ò --follow-ftp\n"
+#~ " íé÷éñô é\"ò íéãøôåî áå÷òì ùé íäéøçà HTML úîéùø --follow-tags=LIST\n"
+#~ " íìòúäì ùé íäî HTML úîéùø -G, --ignore-tags=LIST\n"
+#~ " íéøçà íéáùçîì úùâì ïúéð úéáéñøå÷ø äëéùî úòá -H, --span-hosts\n"
+#~ " éñçé íù éìòá íéøåùé÷ éøçà ÷ø áå÷ò -L, --relative\n"
+#~ " úåøúåî úåé÷éú úîéùø -I, --include-"
+#~ "directories=L\n"
+#~ " úåøåñà úåé÷éú úîéùø -X, --exclude-"
+#~ "directories=L\n"
+#~ " úùøá íéáùçî ùåôéçì DNS-á ùîúùú ìà -nh, --no-host-lookup\n"
+#~ " áà úéé÷éúì äìòú ìà -np, --no-parent\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software "
+#~ "Foundation, Inc.\n"
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Copyright (C) 1995, 1996, 1997, 1998, 2000, 2001 Free Software "
+#~ "Foundation, Inc.\n"
+#~ " ,úìòåú àéáú àéäù äåå÷ú êåúî úöôåî åæ "
+#~ "úéðëú\n"
+#~ " òîúùîá-úåéøçà àì åìéôà ;úåéøçà áúë ìë àìì "
+#~ "íìåà\n"
+#~ " ,íéèøôì .úîéåñî úéìëú åæéàì äîàúä åà úåøéçñ "
+#~ "ìù\n"
+#~ " .GNU General Public License-á åðééò "
+#~ "àðà\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "CTRL+Break received, redirecting output to `%s'.\n"
+#~ "Execution continued in background.\n"
+#~ "You may stop Wget by pressing CTRL+ALT+DELETE.\n"
+#~ msgstr ""
+#~ "\n"
+#~ " .`%s'-ì èìô úééðôä ,CTRL+Break õçìð\n"
+#~ " .ò÷øá êùîéé òåöéáä\n"
+#~ ".CTRL+ALT+DELETE úù÷ä é\"ò Wget øåöòì ïúéð\n"
+
+#, c-format
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr ".\"WinHelp %s\" ìéòôî\n"
+
+#, c-format
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr ".%s úéðëú ìù %s äøâùá ïåøëæ ÷éôñî ïéà\n"
+
+#~ msgid "Unknown/unsupported protocol"
+#~ msgstr "êîúð åðéà åà øëåî-éúìá ìå÷åèåøô"
+
+#~ msgid "Invalid port specification"
+#~ msgstr "éåâù äàéöé ïåéö"
diff --git a/po/hr.gmo b/po/hr.gmo
new file mode 100644
index 0000000..7df4f80
--- /dev/null
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
new file mode 100644
index 0000000..559df88
--- /dev/null
+++ b/po/hr.po
@@ -0,0 +1,3760 @@
+# Translation of wget to Croatian.
+# Copyright (C) 2018 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+#
+# Hrvoje Niksic <hniksic@xemacs.org>, 2005.
+# Marko Karešin <ex.gdog@gmail.com>, 2010-2011.
+# David Dubrović <gimzo.0@gmail.com>, 2010-2011.
+# Domagoj Margan <sartrum@gmail.com>, 2010-2011.
+# Vedran Miletić <rivanvx@gmail.com>, 2010-2011.
+# Tomislav Krznar <tomislav.krznar@gmail.com>, 2012.
+# Božidar Putanec <bozidarp@yahoo.com>, 2016, 2017, 2018, 2019, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget-1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 15:34+0200\n"
+"Last-Translator: Božidar Putanec <bozidarp@yahoo.com>\n"
+"Language-Team: Croatian <lokalizacija@linux.hr>\n"
+"Language: hr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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"
+"X-Generator: Poedit 2.4\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: bind adresa %s ne može se razrijeÅ¡iti; bind se iskljuÄuje\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Spajanje na %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Spajanje na %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Spajanje na [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "neuspješni setsockopt SO_RCVBUF: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "spajanje je uspostavljeno\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "neuspjeh: %s\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: adresa hosta %s ne može se razriješiti\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "neuspješni setsockopt SO_REUSEADDR: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Otvoreno je previÅ¡e datoteÄnih deskriptora (fd)\n"
+"Nije moguće rabiti select ako je fd >=%d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Pretvorene su poveznice u %d datoteka u %s sekundi\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Pretvaranje poveznica u %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nema ništa za raditi\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nije moguće pretvoriti poveznice u %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Nije moguće ukloniti %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "%s nije moguće pohraniti kao %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nije moguće dobiti kolaÄić za %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Greška u sintaksi Set-Cookie“: %s na poziciji %d\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "KolaÄić iz %s pokuÅ¡ao je postaviti domenu na "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nije moguće otvoriti datoteku s kolaÄićima %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Greška pisanja u %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Greška zatvaranja %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Ova vrsta ftp listinga nije podržana -- pokuÅ¡ava se raÅ¡Älamba s Unix alatom\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indeks /%s na %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "nepoznato vrijeme "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Datoteka "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Direktorij "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Poveznica "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Neizvjesno "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtova)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Duljina: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) preostaje"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s preostaje"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (nije mjerodavan)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Nije bilo moguće inicijalizirati SSL -- bit će onemogućen.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Prijavite se kao %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Greška u odgovoru servera -- kontrolna poveznica se zatvara\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Greška u pozdravu servera\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Pisanje nije uspjelo -- kontrolna veza se zatvara\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Server odbija prijavu\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "NetoÄna prijava\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Prijava je uspjela!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Server nije prihvatio „PBSZ 0“ naredbu\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Server nije prihvatio „PROT %c“ naredbu\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Greška na serveru -- nije moguće otkriti vrstu sustava\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "gotovo. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "gotovo.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Nepoznata vrsta „%c“ -- kontrolna veza se zatvara\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "gotovo. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nije potreban\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "**Interna greÅ¡ka**: dohvaćena je logiÄki nemoguća sekcija u getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Direktorij %s ne postoji\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nije potreban\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Datoteka je već preuzeta\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nije moguće inicijalizirati PASV prijenos\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Nije moguće raÅ¡Älaniti PASV odgovor\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nije moguće spajanje na %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Greška povezivanja (%s)\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Nevaljani PORT\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST naredba nije uspjela; zapoÄinje ispoÄetka\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Datoteka %s postoji\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Nema takve datoteke %s\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Nema takve datoteke %s\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Nema takve datoteke ili direktorija %s\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s se nenadano pojavio\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s -- kontrolna veza se zatvara\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Podatkovna veza: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Kontrolna veza je prekinuta\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Prijenos podataka je prekinut\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Datoteka %s već postoji -- ne preuzima se\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(pokušaj:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano na standardni izlaz %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s spremljeno [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Uklanja se %s\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "%s se koristi kao privremeni popis datoteka (listing)\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Uklonjen je %s\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Dubina rekurzije %d prekoraÄila je maksimalnu dubinu %d\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Lokalna datoteka %s novija je od one udaljene -- ne nepreuzima se\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka na serveru je novija od lokalne datoteke %s -- preuzima se\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"VeliÄine se ne slažu (lokalno %s) -- preuzima se\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nevaljano ime simboliÄke poveznice -- preskaÄe\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Već postoji ispravna simboliÄka poveznica %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Kreira se simboliÄka poveznica %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "SimboliÄke poveznice nisu podržane -- preskaÄe se simveza %s\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "PreskaÄe se direktorij %s\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: nepoznata ili nepodržana vrsta datoteke\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Nije uspjelo postaviti prava pristupa za %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: oštećena vremenska oznaka\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Direktoriji neće biti preueti jer je dubina %d (maksimum je %d)\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ne silazi se u %s jer nije ukljuÄen ili je iskljuÄen\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Odbija se %s\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Odbija se %s (nevaljani unos)\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s je iskljuÄen ili nije ukljuÄen u regularnom izrazu\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Greška pri uspoređivanju %s sa %s: %s.\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Nema podudaranja s uzorkom %s\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Indeks u HTML formatu zapisan je u %s [%s]\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Indeks u HTML formatu zapisan je u %s\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "GREŠKA: direktorij %s ne može se otvoriti.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "GREÅ KA: nije uspjelo otvaranje certifikata %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "UÄitani je CA certifikat „%s“\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "GREÅ KA: nije uspjelo uÄitati CRL datoteke „%s“: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "UÄitana je CRL datoteka „%s“\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "GREÅ KA: GnuTLS zahtijeva da su kljuÄ i certifikat iste vrste.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "VaÅ¡a GnuTLS inaÄica je prestara i ne podržava TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: vrijednost %u opcije „secure-protocol“ nije implementirana\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Izvijestite o ovom problemu (na engleskom) na <bug-wget@gnu.org>\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: vrijednost %d opcije „secure-protocol“ nije implementirana\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: nije moguće direktno postaviti prio string; postavlja se zadani "
+"prioritet\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "GREÅ KA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "UPOZORENJE"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s nije predoÄio certifikat\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: certifikat %s nije pouzdan\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: certifikat od %s nije izdan od poznatoga izdavatelja\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: certifikat od %s je opozvan\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: potpisnik certifikata od %s nije bio CA\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: certifikat %s je potpisan s nesigurnim algoritmom\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: certifikat %s još nije aktiviran\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: certifikat %s više ne vrijedi (istekao je)\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Greška pri inicijalizaciji X509 certifikata: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nijedan certifikat nije pronađen\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "GreÅ¡ka pri raÅ¡Älambi certifikata: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certifikat još nije aktiviran\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certifikat više ne vrijedi (istekao je)\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Vlasnik certifikata ne podudara se s imenom hosta „%s“\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Javni kljuÄ se ne podudara s pohranjenim javnim kljuÄem!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certifikat mora biti X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Greška pri obradi popisa adresa\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Nepoznati host"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Privremeni neuspjeh u razrješenju imena"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Nepoznata greška"
+
+# resolving u ovom sluÄaju > traži hostname (host)
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Traži se %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "neuspjeh: Nema ni IPv4 ni IPv6 adresa za hosta\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "neuspjeh: vrijeme je isteklo\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: nepotpuni hyperlink %s nije moguće razriješiti\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"Nađen je no-follow atribut u %s. Poveznice na ovoj stranici neće se "
+"slijediti\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: nevaljani URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Greška pri pisanju HTTP zahtjeva: %s\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Nema zaglavlja -- pretpostavlja se HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka %s već postoji -- ne preuzima \n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+"gmtime() završila je neuspješno -- to je vjerojatno greška u programu\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Nije moguće pretvoriti vremenski žig u http format. Vrijeme 0 će se upisati\n"
+" kao zadnja izmjena\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Nema datoteke s BODY podacima %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Nova uporaba postojeće poveznice prema [%s]:%d\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Nova uporaba postojeće poveznice prema %s:%d\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr ""
+"Nije uspjelo proÄitati odgovor proxy-a: %s.\n"
+" \n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s GREÅ KA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Deformirana status-vrpca"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Nije uspjelo tuneliranje kroz proxy server: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Nepoznata metoda autentifikacije\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Odabrana autentifikacija: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Spremanje u: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Pri preuzimanju potpisa:\n"
+"%s: %s\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Nemoguće je proÄitati potpise iz privremene datoteke -- preskaÄe se.\n"
+" \n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Nemoguće je napraviti privremenu datoteku -- preskaÄe se preuzimanje "
+"potpisa\n"
+
+# Valid ranges for the "pri" attribute are from
+# 1 to 999999. Mirror servers with a lower value of the "pri" attribute have a higher priority
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Nevaljana „pri“ vrijednost -- uzima se da je %d\n"
+
+# digest > hash
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Nije moguće pronaći prihvatljivu kontrolnu sumu za Metalink resurse.\n"
+"Ignoriraju se.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Onemogućuje se SSL zbog nastalih grešaka\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s zahtjev je poslan, Äeka se odgovor... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nikakvi podaci nisu primljeni\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "GreÅ¡ka Äitanja (%s) u zaglavljima\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(bez opisa)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Lokacija: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nespecificirano"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [prati se]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Datoteka %s nije izmijenjena na serveru -- preuzimanje se propušta\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Server je zanemario If-Modified-Since zaglavlje za datoteku %s.\n"
+"Pokušajte dodati opciju --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Datoteka je već u potpunosti preuzeta -- nema ništa za raditi\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Duljina: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorirano"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Upozorenje: HTTP ne podržava viÅ¡eznaÄnike (wildcards)\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Spider je omogućen. Provjerite postoji li datoteka na serveru.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nije moguće pisati u %s (%s)\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Obvezni atribut nedostaje u preuzetom zaglavlju\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autentifikacija korisnik/lozinka nije uspjela\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "U WARC datoteku nije moguće pisati\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "U privremenu WARC datoteku nije moguće pisati\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nije moguće uspostaviti SSL poveznicu\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Poveznicu %s (%s) nije moguće ukloniti\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "GREÅ KA: Preusmjeravanje (%d) bez cilja (adrese).\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Nema Metalink podataka u HTTP odgovoru. Datoteka se preuzima pomoću HTTP "
+"GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "NaÄ‘eno je Metalink zaglavlje. Prelazi se na Metalink naÄin rada.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Datoteka ne postoji na serveru -- nevaljani hyperlink!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Nedostaje Last-modified zaglavlje -- vremenske oznake se iskljuÄuju\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Nevaljano Last-modified zaglavlje -- vremenska oznaka se ignorira\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Lokalna datoteka %s je novija od one na serveru -- ne preuzima se\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "VeliÄine se ne slažu (lokalno %s) -- ponovno se preuzima\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Datoteka na serveru je novija -- preuzima se\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Udaljena datoteka postoji; možda sadrži poveznice na ostale resurse -- "
+"preuzima se\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka na serveru postoji, ali nema nikakvih poveznica -- ne preuzima se\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka na serveru postoji i može sadržavati daljnje poveznice,\n"
+"ali rekurzija je onemogućena -- ne preuzima se\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Datoteka na serveru postoji\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano na standardni izlaz %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s spremljeno [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Veza zatvorena na bajtu %s "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - GreÅ¡ka Äitanja na bajtu %s (%s)"
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - GreÅ¡ka Äitanja na bajtu %s/%s (%s) "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nepodržana kvaliteta zaštite „%s“\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nepodržani algoritam „%s“\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC pokazuje na %s a kojem nije moguće pristupiti zbog greške: %s\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: nije moguće proÄitati %s (%s)\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: greška u %s u retku %d\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: sintaktiÄka greÅ¡ka u %s u retku %d\n"
+
+# c-format
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: nepoznata naredba %s u %s u retku %d\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Nije uspjelo raÅ¡Älaniti datoteku sustava wgetrc (SYSTEM_WGETRC). Provjerite\n"
+"„%s“\n"
+"ili navedite neku drugu datoteku s --config opcijom.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Nije uspjelo raÅ¡Älaniti datoteku sustava wgetrc (SYSTEM_WGETRC). Provjerite\n"
+"„%s“\n"
+"ili navedite neku drugu datoteku s --config opcijom.\n"
+
+# c-format
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Upozorenje: wgetrc sustava i korisnika (oba) ukazuju na %s\n"
+
+# c-format
+# %s: Pogrešna naredba '%s' u '--execute'.\n
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: nevaljana naredba --execute %s\n"
+
+# c-format
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: nevaljana logiÄka varijabla %s -- koristite „on“ ili „off“\n"
+
+# c-format
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: nevaljani %s -- koristite „on“ , „off“ ili „quiet“\n"
+
+# c-format
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: nevaljani broj %s\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s smije se samo jedanput upotrijebiti\n"
+
+# c-format
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: nevaljana vrijednost bajta %s\n"
+
+# c-format
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: nevaljani vremenski period %s\n"
+
+# c-format
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: negativni vremenski period %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass zahtijeva string ili postavljenu varijablu okoline\n"
+"WGET_ASKPASS ili SSH_ASKPASS\n"
+
+# c-format
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: nevaljana vrijednost %s\n"
+
+# c-format
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: nevaljano zaglavlje %s\n"
+
+# c-format
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: nevaljano WARC zaglavlje %s\n"
+
+# c-format
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: nevaljana vrsta progresa %s\n"
+
+# c-format
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: nevaljano ograniÄenje %s;\n"
+" koristite [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii]\n"
+"\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodiranje %s nije valjano\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konverzija iz %s u %s nije podržana\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Pronađena je nepotpuna ili nevaljana višebajtna sekvencija\n"
+
+# Weird, we got an unspecified error
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Neobrađena greška %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8(): locale nije instaliran\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode() je završila neuspješno (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr ""
+"Nije uspjela konverzija u mala slova: %d: %s\n"
+"\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Izlaz je preusmjeruje na %s\n"
+
+# log > bilježiti u dnevnik > dnevniÄiti
+# logging > dnevniÄenje
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; dnevniÄenje (bilježenje u dnevnik) se onemogućuje\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uporaba: %s [OPCIJA]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Obvezni argumenti dugaÄkih opcija obvezni su takoÄ‘er i za kratke opcije.\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Pokretanje:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version informacije o inaÄici ovog programa\n"
+"\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help ova prikazana pomoć\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background nakon pokretanja nastavlja rad u "
+"pozadini\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=NAREDBA izvrši naredbu (NAREDBA je u „.wgetrc“ "
+"stilu)\n"
+
+# Logging and Input File Options
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "DnevniÄka (dnevnik) i ulazna datoteka:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=DNEVNIK poruke bilježi u DNEVNIK\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=DNEVNIK poruke dopisuje na kraj DNEVNIKA\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug ispiše puno podataka za debugiranje\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug ispiše Watt-32 poruke za debugiranje\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tihi rad (bez ispisa)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose opširniji ispis (zadano)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -nv, --no-verbose neopširan ispis, ali ne i tiho\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=VRSTA VRSTA je širina pojasa; VRSTA može biti "
+"bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DATOTEKA preuzme URL-ove navedene u DATOTECI\n"
+" (lokalna ili vanjska DATOTEKA)\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=DATOTEKA preuzme datoteke sadržane u\n"
+" lokalnoj Metalink DATOTECI\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html tretira ulaznu datoteku kao HTML\n"
+
+# Resolves relative links using URL as the point of reference, when reading links from an HTML file specified via the ‘-i’/‘--input-file’ option (together with ‘--force-html’)
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL razriješi poveznice u HTML ulaznoj "
+"datoteci\n"
+" (-i -F) koristeći URL kao referenciju\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=DATOTEKA za konfiguraciju rabi DATOTEKU\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config ignorira sve konfiguracijske datoteke\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=DATOTEKA razloge za URL odbijenicu bilježi u "
+"DATOTEKU\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Preuzimanje:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=BROJ maksimalni BROJ pokušaja preuzimanja\n"
+" (0 = nema ograniÄenja)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused ponovo pokuša ako je spajanje odbijeno\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=POPIS zarezom odvojeni POPIS HTTP greški\n"
+" za ponovni pokušaj\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=DATOTEKA dokumente sprema u DATOTEKU\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber preskoÄi preuzimanja koja bi mogla\n"
+" prebrisati postojeće datoteke\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc ne pokušava dobiti verifikaciju iz ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue nastavi s preuzimanjem djelomiÄno\n"
+" preuzete datoteke\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POZICIJA zapoÄne preuzimati od POZICIJE (0 = "
+"poÄetak)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=VRSTA indikator progresa preuzimanja je VRSTA\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress traka progresa je uvijek vidljiva\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping preuzima samo datoteke novije od "
+"lokalnih\n"
+
+# ‘--no-if-modified-since’
+# Do not send If-Modified-Since header in ‘-N’ mode. Send preliminary HEAD request instead. This has only effect in ‘-N’ mode.
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ne koristi uvjet if-modified-since\n"
+" zajedno s --timestamping opcijom\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ne kopira vremenski žig datoteke iz\n"
+" one na serveru na lokalnu datoteku\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response ispiše odgovor servera\n"
+
+# Wget will behave as a Web spider, which means that it will not download the pages, just check that they are there
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ništa ne preuzima\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDS sva tajmaut vremena postavlja\n"
+" na SECONDS sekundi\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESE popis DNS servera za propitati\n"
+" (zarezima odvojenih)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADRESA poveži DNS tražitelj na ADRESU\n"
+" (hostname ili IP) lokalnog raÄunala\n"
+
+# timeout > vremensko ograniÄenje
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECS ograniÄi odgovor DNS-a na SECS sekundi\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECS ograniÄi tajmaut za spajanje na SECS "
+"sekundi\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECS ograniÄi tajmaut za Äitanje na SECS "
+"sekundi\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=VRIJEME priÄekaj VRIJEME sekunda izmeÄ‘u "
+"preuzimanja\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=VRIJEME pauza 1..VRIJEME sekundi između\n"
+" pokušaja preuzimanja\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait pauza 0.5*ÄŒEKAJ...1.5*ÄŒEKAJ sekundi\n"
+" između pokušaja preuzimanja\n"
+
+# Don’t use proxies, even if the appropriate *_proxy environment variable is defined.
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy eksplicitno ne koristi proxy\n"
+
+# The value can be specified in bytes (default), kilobytes (with ‘k’ suffix), or megabytes (with ‘m’ suffix).
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=BROJ kvota preuzimanja ograniÄena na BROJ\n"
+" (bajta, k Kilobajta, m Megabajta)\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESA poveži na ADRESU (hostname ili IP)\n"
+" lokalnog raÄunala\n"
+
+# Limit the download speed to no more than rate bytes per second.
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=BRZINA brzina preuzimanja je ograniÄena\n"
+" na BRZINU bajta po sekundi\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache ne sprema rezultate upita DNS-u\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS znakove u nazivima datoteka ograniÄi\n"
+" na one koje dopušta navedeni OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignorira veliÄinu slova pri traženju\n"
+" datoteka ili direktorija\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only spaja se samo na IPv4 adrese\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only spaja se samo na IPv6 adrese\n"
+
+# ‘--prefer-family=none/IPv4/IPv6’
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=VRSTA prednost imaju adrese specificirane "
+"VRSTE;\n"
+" VRSTA je jedna od IPv6, IPv4 ili none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=KORISNIK postavlja korisnika za http i za ftp\n"
+" na KORISNIK\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=LOZINKA postavlja lozinku za http i za ftp\n"
+" na LOZINKA\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password pita za lozinku\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=NAREDBA specificira ovjerenog rukovatelja za\n"
+" prijavu korisnika i lozinku; ako "
+"NAREDBA\n"
+" nije specificirana, WGET_ASKPASS ili\n"
+" SSH_ASKPASS rabi okolišnu varijablu\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri iskljuÄuje IRI podrÅ¡ku\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KÔD koristi KÔD kao lokalno kodiranje za IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KÔD koristi KÔD kao zadano udaljeno "
+"kodiranje\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink ukloni datoteku prije prepisivanja\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash zadrži datoteke Äije se kontrolne sume\n"
+" ne podudaraju (pridoda .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=BROJ Metalink aplikacija/metalink4+xml "
+"metaurl\n"
+" redni BROJ\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http koristi meta podatke Metalinka iz "
+"zaglavlja\n"
+" HTTP-ovog odgovora\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location željena lokacija za Metalink resurse\n"
+
+# Globbing refers to the use of shell-like special characters (wildcards), like ‘*’, ‘?’, ‘[’ and ‘]’ to retrieve more than one file from the same directory at once.
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr ukljuÄi pohranu meta podataka\n"
+" u proširenim atributima datoteke\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Direktoriji:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ne kreira direktorije\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories prisiljava kreiranje direktorija\n"
+
+# Disable generation of host-prefixed directories
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories ne duplicira (lokalno) direktorije hosta\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories koristi ime protokola u direktorijima\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=PREFIKS spremi datoteke u PREFIKS/..\n"
+" zadano je „.“ tj. radni direktorij\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=BROJ ignorira BROJ komponenti direktorija\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP opcije:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=KORISNIK http korisnik je KORISNIK\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=LOZINKA http lozinka je LOZINKA\n"
+
+# Disable server-side cache. In this case, Wget will send the remote server an appropriate directive (‘Pragma: no-cache’) to get the file from the remote service, rather than returning the cached version. This is especially useful for retrieving and flushing out-of-date documents on proxy servers.
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache sprijeÄava preuzimanje podataka\n"
+" iz predmemorije servera\n"
+
+# Use name as the default file name when it isn’t known (i.e., for URLs that end in a slash), instead of index.html.
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=IME mijenja zadano ime stranice na IME\n"
+" (to je obiÄno „index.html“)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension sprema HTML/CSS dokumente s\n"
+" ispravnim sufiksima\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length zanemari polje „Content-Length“ "
+"zaglavlja\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=STRING umetne znakovni STRING među zaglavlja\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=VRSTA odaberite auto ili gzip ili none "
+"(zadano)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksimalni broj preusmjeravanja\n"
+" dopuštenih po stranici\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=KORISNIK postavlja KORISNIKA za proxy korisnika\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=LOZINKA postavlja LOZINKU za proxy lozinku\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL ukljuÄi „Referer: URL“ zaglavlje\n"
+" u HTTP zahtjev\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers sprema HTTP zaglavlja u datoteku\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identificira se kao AGENT umjesto\n"
+" kao Wget/INAÄŒICA\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive onemogući HTTP keep-alive (postojanu "
+"vezu)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ne koristi kolaÄiće\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=DATOTEKA prije sesije uÄita kolaÄiće iz DATOTEKE\n"
+
+# ali ne i „session cookies“
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=DATOTEKA nakon sesije sprema kolaÄiće u DATOTEKU\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies uÄita i spremi (ne trajne) kolaÄiće "
+"sesije\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRING POST metodom pošalje STRING kao podatke\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=DATOTEKA POST metodom pošalje sadržaj iz DATOTEKE\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod u zahtjevu koristi metodu „HTTPMethod“\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=TEKST pošalje TEKST kao podatke;\n"
+" opciju --method morate nužno "
+"primijeniti\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=DATOTEKA pošalje sadržaj DATOTEKE;\n"
+" opciju --method morate nužno "
+"primijeniti\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition poštuje zaglavlje Content-Disposition za\n"
+" odabir lokalnih naziva datoteka\n"
+" (opcija je zasad EKSPERIMENTALNA)\n"
+
+# If this is set to on, wget will not skip the content when the server responds with a http status code that indicates error.
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error prihvaća primljeni sadržaj iako\n"
+" server javlja grešku\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge pošalje Basic HTTP authentication "
+"podatke\n"
+" bez Äekanja na izazov/upit servera\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) opcije:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR odaberite jedan sigurnosni PR protokol:\n"
+" auto, SSLv2, SSLv3, TLSv1,\n"
+" TLSv1_1, TLSv1_2 ili PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only prati samo sigurne HTTPS poveznice\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate ne provjerava certifikat servera\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=DATOTEKA DATOTEKA sa certifikatom klijenta\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=VRSTA VRSTA certifikata klijenta -- PEM ili "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=DATOTEKA DATOTEKA s privatnim kljuÄem\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=VRSTA VRSTA privatnog kljuÄa -- PEM ili DER\n"
+
+# CA > certificate authorities
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=DATOTEKA DATOTEKA koja sadrži svežanj CA-ova\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR direktorij DIR s hash listom CA-ova\n"
+
+# CRL > Certificate Revocation List
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=DATOTEKA DATOTEKA koja sadrži svežanj CRL-ova\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASHES datoteka FILE s javnim kljuÄen (PEM/DER)\n"
+" ili bilo koji broj sha256 na base64\n"
+" Å¡ifriranih HASHES kojima prethodi\n"
+" „sha256//“ odvojenih s „;“ za\n"
+" verifikaciju sugovornika (peer)\n"
+
+# Pseudo-Random Number Generator > PRNG
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=DATOTEKA DATOTEKA s nasumiÄnim podacima za\n"
+" inicijalizaciju SSL PRNG (generatora "
+"pseudo\n"
+" sluÄajnih brojeva)\n"
+
+# EGD: the Entropy Gathering Daemon
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=DATOTEKA DATOTEKA koja naznaÄuje EGD utiÄnicu\n"
+" s nasumiÄnim podacima\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STRING Izravno postavlja prioritet-string ili "
+"cypher\n"
+" list string (OpenSSL) -- pripazite, jer ta\n"
+" opcija poništava --secure-procol; format i\n"
+" sintaksa stringa zavisi od SSL/TLS metode\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS opcije:\n"
+
+# HSTS (HTTP Strict Transport Security, RFC 6797)
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+" --no-hsts iskljuÄuje HSTS (ignorira\n"
+" Strict-Transport-Security zaglavlja)\n"
+
+# ‘--hsts-file=file’
+# By default, Wget stores its HSTS database in ~/.wget-hsts. You can use ‘--hsts-file’ to override this. Wget will use the supplied file as the HSTS database.
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file=DATOTEKA HSTS baza podataka je DATOTEKA\n"
+" (ukida zadanu ~/.wget-hsts)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP opcije:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf koristi Stream_LF format za\n"
+" sve binarne FTP datoteke\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=KORISNIK ftp korisnik je KORISNIK\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=LOZINKA postavlja ftp lozinku na LOZINKA\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ne uklanja „.listing“ datoteke\n"
+
+# Globbing refers to the use of shell-like special characters (wildcards), like ‘*’, ‘?’, ‘[’ and ‘]’ to retrieve more than one file from the same directory at once.
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob iskljuÄuje upotrebu viÅ¡eznaÄnika\n"
+" u nazivima FTP datoteka\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp iskljuÄuje „pasivni“ naÄin prijenosa\n"
+" (tj. koristi se samo „aktivni“ naÄin)\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions saÄuva prava pristupa udaljene datoteke\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks pri rekurziji preuzima datoteke na koje\n"
+" pokazuju poveznice (ali ne "
+"direktorije)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS opcije:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit koristi implicitni FTPS (zadani port je "
+"990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl obnovi SSL/TLS sesiju zapoÄetu u "
+"kontrolnom\n"
+" kanalu pri otvaranju podatkovne veze\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection Å¡ifrira samo je kontrolni kanal;\n"
+" podaci se ne Å¡ifriraju\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp ako ciljani server ne podržava FTPS,\n"
+" koristi se FTP\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC opcije:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=DATOTEKA sprema podatke o zahtjevima i odgovorima\n"
+" u WARC DATOTEKU .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=STRING umetni STRING u warcinfo zapis\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=BROJ postavlja maksimalnu veliÄinu\n"
+" WARC datoteka na BROJ\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx zapisuje indeksne datoteke CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=DATOTEKA ne sprema zapise na popisu\n"
+" u ovoj CDX DATOTECI\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression ne sažima WARC datoteke s GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ne izraÄunava SHA1 kontrolne sume\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ne sprema dnevniÄku datoteku u WARC "
+"zapis\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIREKTORIJ DIREKTORIJ je lokacija za privremene\n"
+" datoteke koje stvara WARC pisar\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekurzivno preuzimanje:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive specificira rekurzivno preuzimanje\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=BROJ najveća dubina rekurzije = BROJ\n"
+" (inf ili 0 za neograniÄenu dubinu)\n"
+
+# Note that ‘--delete-after’ deletes files on the local machine.
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after nakon preuzimanja izbriše lokalne "
+"datoteke\n"
+
+# After the download is complete, convert the links in the document to make them suitable for local viewing
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links promijeni poveznice u preuzetom HTML-u "
+"ili\n"
+" CCS-u da ukazuju na lokalne datoteke\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only pretvori samo datoteÄni dio URL-a\n"
+" (inaÄe poznat kao basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N prije zapisivanja datoteke X zadrži do N\n"
+" sigurnosnih kopija (osiguranja)\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted prije konverzije datoteke X\n"
+" spremi njenu kopiju kao X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted prije konverzije datoteke X\n"
+" spremi njenu kopiju kao X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror --mirror je ekvivalentno nizu opcija:\n"
+" -N -r -l inf --no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites preuzmi sve slike i sve Å¡to je potrebno\n"
+" za prikaz HTML stranice\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments striktna obrada HTML komentara\n"
+" u skladu sa SGML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekurzivno prihvaćanje/odbijanje:\n"
+
+# Specify comma-separated lists of file name suffixes or patterns to
+# accept or reject {Types of Files}).
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=POPIS zarezom odvojeni POPIS prihvaćenih "
+"sufiksa\n"
+" (vrste datoteka)\n"
+
+# Specify comma-separated lists of file name suffixes or patterns to
+# accept or reject {Types of Files}).
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=POPIS zarezom odvojeni POPIS odbijenih sufiksa\n"
+
+# REGIZR, zašto ne REGIZ, kraće i lakše izgovoriti; ili jednostavno prihvatiti regex!
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGIZ regularni izraz REGIZ poduraran s\n"
+" prihvaćenim URL-ovima\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGIZ regularni izraz REGIZ podudaran s\n"
+" odbijenim URL-ovima\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=VRSTA VRSTA regularnog izraza (posix ili pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=VRSTA VRSTA regularnog izraza (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=POPIS zarezom odvojen POPIS prihvaćenih domena\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=POPIS zarezom odvojen POPIS odbijenih domena\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp prati FTP poveznice iz HTML dokumenata\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=POPIS zarezom odvojen POPIS praćenih HTML "
+"tagova\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=POPIS zarezom odvojen POPIS\n"
+" ignoriranih HTML tagova\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts tijekom rekurzije posjeti i strane "
+"servere\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative prati samo relativne poveznice\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=POPIS POPIS dopuštenih direktorija\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names pri preusmjeravanju, za lokalno ime "
+"datoteke\n"
+" rabi se posljedna komponenta URL-ovog\n"
+" preusmjerenja\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=POPIS POPIS iskljuÄenih direktorija\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent ne penje se u viši (parent) direktorij\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Izvješća o greškama, pitanja i rasprave pošaljite na <bug-wget@gnu.org>\n"
+"a probleme otvorite na https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget\n"
+"Pogreške u prijevodu i vaše prijedloge javite na <lokalizacija@linux.hr>\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, program za neinteraktivno preuzimanje s mreže.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Lozinka za korisnika %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Lozinka: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nije moguće napraviti cijev\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Greška pri inicijalizaciji potprocesa za use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Pogrešne postavke potprocesa za use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "GreÅ¡ka pri Äitanju odgovora naredbe „%s %s“: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Korisnik (ime) za „%s%s“: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Lozinka za „%s%s@%s“: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compile: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Link: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s izgrađen na %s\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (okolina)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (korisnik)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sustav)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licenca GPLv3+: GNU GPL inaÄica 3 ili kasnija\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Ovo je slobodan softver: slobodno ga mijenjajte i distribuirajte.\n"
+"NEMA JAMSTVA, do granica dopuštenih zakonom.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Izvorno napisao Hrvoje Nikšić <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Greške u programu i vaša pitanja (na engleskom) javite na <bug-wget@gnu."
+"org>.\n"
+"Pogreške u prijevodu i vaše prijedloge javite na <lokalizacija@linux.hr>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Nije uspjelo dodijeliti memoriju\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Prekid rada zbog greške u %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Pokušajte s „%s --help“ za pomoć i dodatne opcije\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: nevrijedeća opcija -- „-n%c“\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Podrška za debugiranje nije ugrađena (kompilirana)\n"
+"parametar --debug se ignorira\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Navedene su istovremeno opcije --no-clobber i --convert-links;\n"
+"--no-clobber se ignorira\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Navedene su istovremeno opcije --no-clobber i --convert-file-only;\n"
+"--no-clobber se ignorira\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Istovremeno nije moguće biti opširan i neopširan\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Istovremeno nije moguće žigosati vrijeme a pritom ne brisati stare datoteke\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Opcije --inet4-only i --inet6-only ne mogu se zajedno koristiti\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Opcije -k ili --convert-file-only i -O ne mogu se zajedno koristiti ako je\n"
+"navedeno više URL-ova, ili u kombinaciji sa -p ili -r.\n"
+"Pogledajte upute za više pojedinosti.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"UPOZORENJE: kombiniranjem -O s -r ili -p sav preuzeti sadržaj će biti\n"
+"spremljen u jednu datoteku koju ste naveli.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"UPOZORENJE: vremensko oznaÄavanje ne radi niÅ¡ta u kombinaciji sa -O.\n"
+"Pogledajte upute za više pojedinosti.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr "WARC izlaz ne radi uz --no-clobber; no-clobber će se onemogućiti\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC izlaz ne radi s vremenskim oznakama; vremenske oznake će se "
+"onemogućiti\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC izlaz ne radi uz --spider opciju\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC izlaz ne radi uz --continue ili --start-pos; obje opcije će se "
+"onemogućiti\n"
+
+# In computing, data deduplication is a specialized data compression technique for eliminating duplicate copies of repeating data. Related and somewhat synonymous terms are intelligent (data) compression and single-instance (data) storage.
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"WARC-kontrolne sume su onemogućene;\n"
+"WARC deduplikacija neće pronaći duplikate zapisa\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Kompresija ne radi uz opcije --continue ili --start-pos, te se ignoriraju\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Istovremeno se ne smije upotrijebiti --ask-password i --password\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Istovremena upotreba --start-pos i --continue se ne preporuÄuje;\n"
+"opcija --continue će se onemogućiti\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: nedostaje URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Ne možete upotrijebiti --post-data i --post-file istovremeno\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Ne možete upotrijebiti --post-data ili --post-file zajedno s --method;\n"
+"--method oÄekuje opcije --body-data i --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Metodu morate navesti s --method=HTTPMethod za upotrebu s --body-data\n"
+"ili --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Istovremeno ne možete navesti --body-data i --body-file\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ova inaÄica ne podržava IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k ili -r može se koristiti sa -O samo kod ispisa u regularnu datoteku\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links or --convert-file-only mogu se koristiti samo za ispis u\n"
+"regularnu datoteku\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Nije uspjelo inicijalizirati libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Nije uspjelo inicijalizirati c-ares kanal\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Nije uspjelo raÅ¡Älaniti IP adresu „%s“\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Nije uspjelo postaviti DNS server(e) „%s“ (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nijedan URL nije pronađen u %s\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Nije moguće raÅ¡Älaniti metalink datoteku %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Nije moguće preuzeti sve resurse iz %s\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ZAVRÅ ENO --%s--\n"
+"Ukupno vrijeme od poÄetka: %s\n"
+"Preuzeto: %d datoteka, %s u %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "PREKORAÄŒENA je kvota od %s preuzimanja!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O nije podržan za metalink prezimanje -- ignorira se\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planirana metalink datoteka: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Pouzdana metalink datoteka: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Odbija se metalink datoteka -- nepouzdano ime\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Obrađuje se metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Odbija se metaurl datoteka %s -- nepouzdano ime\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Nije uspjelo preuzimanje %s -- preskaÄe se metaurl\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Metaurl datoteka %s ne može se raÅ¡Älaniti\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Obrada metaurl-ova je završila s pogreškom\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Resurs tipa %s nije podržan -- ignorira se...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Nije moguće otvoriti preuzetu datoteku\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "RaÄuna se veliÄina za %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "VeliÄina datoteke nije objavljena -- provjera se preskaÄe\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nije moguće dobiti veliÄinu preuzete datoteke\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Ne podudaranje veliÄine za datoteku %s\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Podudaranje veliÄina\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "IzaÄunava se kontrolne suma za %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrolne sume se podudaraju\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Kontrolna suma se ne podudara za datoteku %s\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Nije moguće otvoriti preuzetu datoteku za provjeru potpisa\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Potpis je uspješno ovjeren\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Nevaljani potpis -- resurs se odbija\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Podaci se podudaraju s potpisom, ali potpis nije vjerodostojan\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Kontrolna suma nije pronađena\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Nije uspjelo preuzimanje %s -- resurs se preskaÄe\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Datoteka %s je preuzeta, ali veliÄina se ne podudara. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Datoteka %s je uÄitana, ali kontrolna suma se ne podudara. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Datoteka %s je uÄitana, ali potpis se ne podudara. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s se preimenuje u %s\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Rad se nastavlja u pozadini\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Rad se nastavlja u pozadini, PID %lu\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Izlazni podaci bit će spremljeni u %s\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() je završila neuspješno\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() je završila neuspješno\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: nije moguće pronaći upotrebljivi driver utiÄnice\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() je zavrÅ¡ila neuspjeÅ¡no -- utiÄnicu nije moguće postaviti da "
+"blokira\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: upozorenje: simbol %s se pojavljuje prije bilo kojeg imena "
+"raÄunala\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: nepoznati simbol „%s“\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uporaba: %s NETRC [HOSTNAME]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: ne može se dobiti status od %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "UPOZORENJE: generator sluÄajnih brojeva koristi slabo sjeme\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"PRNG (generator pseudo sluÄajnih brojeva nije inicijaliziran;\n"
+"razmislite o korištenju opcije --random-file\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "VaÅ¡a OpenSSL inaÄica je prestara i ne podržava TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "VaÅ¡a OpenSSL inaÄica je prestara i ne podržava TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "VaÅ¡a OpenSSL inaÄica je prestara i ne podržava TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: vrijednost opcije %d „secure-protocol“ nije implementirana\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: nevaljana cipher lista: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+"OpenSSL: OpenSSL: Nije uspjelo uspostaviti povjerenje na djelomiÄni lanac\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Nije uspjelo dodijeliti parametre za provjeru\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"UPOZORENJE: PRNG (generator pseudo sluÄajnih brojeva) nije bilo moguće\n"
+"inicijalizirati; pokušajte upotrijebiti opciju --random-file\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: nije moguće provjeriti certifikat od %s koji je izdao %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Nema mogućnosti lokalno provjeriti autoritet izdavatelja\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Pronađen je samopotpisan certifikat\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Izdani certifikat još nije važeći\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Izdani certifikat više ne vrijedi (istekao je)\n"
+
+# nitko od alternativnih naziva navedenih u certifikatu
+# odgovara traženom ime domaćina abc
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: nijedan od alternativnih naziva navedenih u certifikatu ne odgovara\n"
+" traženom imenu raÄunala %s\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: common name certifikata %s ne odgovara traženom imenu hosta %s\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: common name certifikata nije valjan (sadrži znak NUL).\n"
+" To može biti znak da host nije onaj za koga se predstavlja\n"
+" (to jest, da nije stvarni %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Za nesigurno povezivanje na %s koristite „--no-check-certificate“\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ preskaÄe se %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Nevaljano specificirani dot-stil indikatora progresa %s; ostaje neizmjenjen\n"
+
+# # FIXME: this is not "ETA" but simply "still %s" or "%s remaining"
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " ETA %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " u "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Frekvenciju REALTIME clock nije moguće odrediti: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "%s bit će uklonjen, jer je trebao biti odbijen\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nije moguće otvoriti %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "UÄitava se robots.txt; molimo ignorirajte greÅ¡ke\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Greška pri obradi proxy URL-a %s: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Greška u proxy URL adresi %s: mora biti HTTP\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d: prekoraÄen je broj preusmjerenja\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Završeno.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Pokušava se ponovno.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Nijedna nevažeća poveznica nije pronađena\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Pronađena je %d nevažeća poveznica.\n"
+"\n"
+msgstr[1] ""
+"Pronađene su %d nevažeće poveznice.\n"
+"\n"
+msgstr[2] ""
+"Pronađeno je %d nevažećih poveznica.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Nema greške"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nepodržana shema %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Nedostaje shema"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nevaljano ime hosta"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Nevaljani broj porta"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nevaljano korisniÄko ime"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Nepotpuna IPv6 numeriÄka adresa"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adrese nisu podržane"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Nevaljana IPv6 numeriÄka adresa"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS podrÅ¡ka nije ukljuÄena pri kompiliranju"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Pronađena je višebajtna sekvencija koju nije moguće konvertirati\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: nije uspjelo dodijeliti dosta memorije; nema dovoljno memorije\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: nije uspjelo dodijeliti %ld bajtova; nema dovoljno memorije\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf(): međuspremnik teksta je prevelik (%d bajtova) -- rad prekida "
+"se\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Rad se nastavlja u pozadini, PID %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nije uspjelo ukloniti simboliÄku poveznicu %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Otvoriti datoteku %s s Fopen() nije uspjelo\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Nije uspjelo dobiti prava pristupa za datoteku %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Dobiti prava pristupa za datoteku %s sa stat() nije uspjelo\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Datoteka %s promijenila se od zadnje provjere. Sigurnosna provjera nije "
+"uspjela.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Datoteku %s nije uspjelo otvoriti zbog: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Dobiti prava pristupa za datoteku %s nije uspjelo zbog greške: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Pokušavamo otvoriti datoteku %s koja se promijenila od zadnje provjere.\n"
+"Sigurnosna provjera nije uspjela.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Nevaljani regularni izraz %s, PCRE greška %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Nevaljani regularni izraz %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Greška pri usporedbi %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "PreskaÄe se kljuÄ pogreÅ¡ne veliÄine (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Greška pri postavljanju pozicije WARC datoteke.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Greška pri pražnjenju WARC datoteke na disk.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Greška pri dupliciranju deskriptora WARC datoteke\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Greška otvaranja GZIP stream u WARC datoteci\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Greška u pisanju warcinfo zapisa u WARC datoteku\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Otvara se WARC datoteka %s\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Greška pri otvaranju WARC datoteke %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"U CDX datoteci nema popisa originalnih URL-ova. (Nedostaje stupac „a“)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "U CDX datoteci nema popisa kontrolnih suma. (Nedostaje stupac „k“)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "U CDX datoteci nema popisa identifikatora. (Nedostaje stupac „u“)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] "UÄitan je %d zapis iz CDX\n"
+msgstr[1] "UÄitana su %d zapisa iz CDX\n"
+msgstr[2] "UÄitano je %d zapisa iz CDX\n"
+
+# deduplication > eliminira duplikate, pametno dupliciranje
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "CDX datoteku %s nije moguće proÄitati za deduplikaciju\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Privremenu WARC manifest datoteku nije moguće otvoriti\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Privremenu WARC dnevniÄku datoteku (dnevnik) nije moguće otvoriti\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "WARC datoteku nije moguće otvoriti\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "CDX datoteku nije moguće otvoriti za ispis\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Privremenu WARC datoteku nije moguće otvoriti\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"PronaÄ‘eno toÄno podudaranje u CDX datoteci; pronaÄ‘eni zapis sprema se u "
+"WARC\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Nepoznata greška sustava"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Familija adresa za hostname nije podržana"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Loša vrijednost za ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Nepopravljivi neuspjeh u razluÄivanju imena"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family nije podržana"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Nije uspjelo dodijeliti memoriju"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Nema adrese povezane s hostname"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Ime ili usluga nisu poznati"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname nije podržano za ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype nije podržan"
+
+#~ msgid "System error"
+#~ msgstr "Greška sustava"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Međuspremnik argumenata je premalen"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Obrada zahtjeva je u tijeku"
+
+#~ msgid "Request canceled"
+#~ msgstr "Zahtjev je otkazan"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Zahtjev nije otkazan"
+
+#~ msgid "All requests done"
+#~ msgstr "Svi zahtjevi su obrađeni"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Prekinuto signalom"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "String parametra nije ispravno kodiran"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: opcija „%s%s“ je dvosmislena\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: opcija „%s%s“ je dvosmislena; mogućnosti:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: neprepoznata opcija „%s%s“\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: opcija „%s%s“ ne dopušta argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: opcija „%s%s“ zahtijeva argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: nevaljana opcija -- „%c“\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: opcija zahtijeva argument -- „%c“\n"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "“"
+
+#~ msgid "Success"
+#~ msgstr "Uspjeh"
+
+#~ msgid "No match"
+#~ msgstr "Nema podudaranja"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Nevaljani regularni izraz"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Nevaljani znak razvrstavanja"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nevaljano ime klase znakova"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Zaostala obratna kosa crta („\\“)"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Nevaljana povratna referencija"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Nesparena [, [^, [:, [., ili [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Nesparena ( ili \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Nesparena \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Nevaljani sadržaj u \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Nevaljani kraj raspona"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Nema dovoljno memorije"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Nevaljani prethodni regularni izraz"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Preuranjeni kraj regularnog izraza"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regularni izraz je prevelik"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Nesparena ) ili \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Nema prethodnog regularnog izraza"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nije moguće napraviti cijev"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s potproces je završio s neuspjehom"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle() završila je s neuspjehom"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "nije moguće vratiti fd %d: dup2() je završila s neuspjehom"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s potproces"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s potproces je primio fatalni signal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "nema dovoljno memorije"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Greške u programu i prijedloge (na engleskom) javite na <bug-wget@gnu."
+#~ "org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opcija „--%s“ ne dopušta argument\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: nepoznata opcija „--%s“\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: opcija „-W %s“ je dvosmislena\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: opcija „-W %s“ ne dopušta argument\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: opcija „-W %s“ zahtijeva argument\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Datoteka „%s“ već postoji -- ne preuzima se\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Nevaljana UTF-8 sekvencija: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "‘idn_encode’ nije uspio (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "primljen %s.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorizacija nije uspjela.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Izlazni oblik:\n"
+
+#~ msgid " --bits Output bandwidth in bits.\n"
+#~ msgstr ""
+#~ " --bits Ispiši širinu pojasa u bitovima.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "UPOZORENJE: ponovno otvaranje standardnog izlaza u binarnom naÄinu rada "
+#~ "nije moguće;\n"
+#~ " preuzeta datoteka može sadržavati neprikladne završetke "
+#~ "redaka.\n"
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644
index 0000000..fff5b5c
--- /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..fd35003
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,3723 @@
+# Hungarian translation of wget.
+# Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2012, 2014, 2015, 2016, 2018 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Pal Szasz <szpal@Maria.UTCluj.Ro>, 2001-2003.
+# Laszlo Dvornik <dvornik@gnome.hu>, 2004.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2006, 2007, 2008, 2009, 2012, 2014, 2015, 2016.
+# Balázs Úr <urbalazs@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.18.109\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2018-01-21 15:13+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-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 1.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: a bind cím (%s) nem oldható fel; a bind le lesz tiltva.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Csatlakozás a következőhöz: %s[%s]:%d… "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Csatlakozás a következőhöz: %s:%d… "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Csatlakozás a következőhöz: [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "a setsockopt SO_RCVBUF sikertelen: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "kapcsolódva.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "sikertelen: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: a gépcím (%s) nem oldható fel\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "a setsockopt SO_REUSEADDR sikertelen: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Túl sok fájlleíró van nyitva. Nem használható kiválasztás egy olyan "
+"fájlleírón, amely >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "%d fájl hivatkozásai átalakítva %s másodperc alatt.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "%s hivatkozásainak átalakítása… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nincs teendő.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "A hivatkozások nem alakíthatók át a következőben: %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "%s nem törölhető: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "%s nem menthető mint %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nem kérhető le süti ehhez: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Szintaktikai hiba a Set-Cookie-ban: %s a(z) %d pozíciónál.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+"A(z) %s helyről érkező süti megkísérelte a tartományt a következőre "
+"állítani: "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nem lehet megnyitni a sütifájlt (%s): %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Hiba %s írása közben: %s.\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Hiba %s bezárásakor: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Nem támogatott listatípus, a Unix listaértelmező megpróbálása.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s tartalma %s:%d-n"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "idő ismeretlen "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fájl "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Könyvtár "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Nem biztos "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bájt)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Hossz: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) van hátra"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s van hátra"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (nem hiteles)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Az SSL előkészítése nem sikerült. Le lesz tiltva."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Belépés mint %s … "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Hiba a kiszolgáló válaszában, vezérlőkapcsolat lezárása.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Hiba a kiszolgáló üdvözlésében.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Ãrás sikertelen, vezérlÅ‘kapcsolat lezárása.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "A kiszolgáló visszautasítja a belépést.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "A belépés helytelen.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Belépve!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "A kiszolgáló nem fogadta el a „PBSZ 0†parancsot.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "A kiszolgáló nem fogadta el a „PROT %c†parancsot.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Kiszolgálóhiba, a rendszer típusa nem határozható meg.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "kész. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "kész.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Ismeretlen típus: „%câ€, a vezérlÅ‘kapcsolat lezárása.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "kész. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nem szükséges.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Logikailag lehetetlen szakasz elérve a getftp()-ben"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Nincs ilyen könyvtár: %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nem szükséges.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "A fájl már le van töltve.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nem kezdeményezhető PASV átvitel.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "A PASV válasz nem dolgozható fel.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nem lehet csatlakozni %s %d. portjához: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Hozzárendelési hiba (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Érvénytelen PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST sikertelen, kezdés elölről.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+"A fájl (%s) létezik.\n"
+"\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Nincs ilyen fájl: %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Nincs ilyen fájl: %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Nincs ilyen fájl vagy könyvtár: %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s létrejött.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, vezérlőkapcsolat lezárása.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) -- Adatkapcsolat: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Vezérlőkapcsolat lezárva.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Adatátvitel megszakítva.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "A fájl (%s) már megvan, nem kerül letöltésre.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(próba:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) -- szabványos kimenetre írva %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) -- %s mentve [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "%s eltávolítása.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "%s kerül felhasználásra felsorolási átmeneti fájlként.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s eltávolítva.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "A(z) %d rekurziós mélység túllépte a maximális %d mélységet.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "A távoli fájl nem újabb a helyi %s fájlnál -- nem kerül letöltésre.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"A távoli fájl újabb a helyi %s fájlnál -- letöltésre kerül.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"A méretek nem egyeznek (a helyi: %s) -- letöltésre kerül.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "A szimbolikus link neve érvénytelen, kihagyás.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Már létezik a helyes %s → %s szimbolikus link\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "A(z) %s → %s szimbolikus link létrehozása\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"A szimbolikus linkek nem támogatottak, a(z) %s szimbolikus link kihagyása.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "A könyvtár (%s) kihagyása.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: ismeretlen/nem támogatott fájltípus.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "A(z) %s jogosultságainak beállítása sikertelen.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: sérült időbélyeg.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "A könyvtárak letöltése kihagyva, mivel a mélység %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+"A következőbe belépés kihagyva: %s, mert ki van zárva/nincs kijelölve.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s visszautasítása.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s visszautasítása.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+"A következőbe belépés kihagyva: %s, mert ki van zárva/nincs kijelölve.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Hiba %s és %s illesztésekor: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Nincs találat a mintához (%s).\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "A HTML-esített index kiírva a(z) %s[%s] fájlba.\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "A HTML-esített index kiírva a(z) %s fájlba.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "HIBA: Nem lehet megnyitni a(z) %s könyvtárat.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "HIBA: a tanúsítvány (%s) megnyitása sikertelen: %d.\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "A hitelesítésszolgáltatói tanúsítvány („%sâ€) betöltve\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+"HIBA: a tanúsítvány-visszavonási fájl („%sâ€) betöltése sikertelen: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "A(z) „%s†tanúsítvány-visszavonási fájl betöltve\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "HIBA: A GnuTLS azonos típusú kulcsot és tanúsítványt igényel.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Az OpenSSL verzió túl régi a TLSv1.1 támogatásához\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: megvalósítatlan „secure-protocol†beállításérték: %d\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Jelentse ezt a problémát a bug-wget@gnu.org címen\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: megvalósítatlan „secure-protocol†beállításérték: %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "HIBA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "FIGYELMEZTETÉS"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s nem mutatott be tanúsítványt.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: %s tanúsítványa nem megbízható.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: %s tanúsítványának nincs ismert kibocsátója.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: %s tanúsítványát visszavonták.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: %s tanúsítványát nem egy hitelesítésszolgáltató írta alá.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: %s tanúsítványát nem biztonságos algoritmussal írták alá.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: %s tanúsítványa még nincs aktiválva.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: %s tanúsítványa lejárt.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Hiba az X509 tanúsítvány előkészítésekor: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nem található tanúsítvány\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Hiba a tanúsítvány feldolgozása közben: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "A tanúsítványt még nem aktiválták.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "A tanúsítvány lejárt.\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "A tanúsítvány tulajdonosa nem felel meg a gépnévnek (%s).\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "A nyilvános kulcs nem felel meg a rögzített nyilvános kulcsnak!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "A tanúsítványnak X.509-nek kell lennie\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Hiba a címlista kezelésekor.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ismeretlen kiszolgáló"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Ãtmeneti névfeloldási hiba"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ismeretlen hiba"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "%s feloldása… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "meghiúsult: nincs IPv4/IPv6 cím a géphez.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "meghiúsult: időtúllépés.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: nem oldható fel a hiányos %s hivatkozás.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Érvénytelen URL: %s: %s.\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "A HTTP kérés írása meghiúsult: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Nincsenek fejlécek, HTTP/0.9 feltételezése"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"A fájl (%s) már létezik, nem kerül letöltésre.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "A gmtime hívás meghiúsult. Ez valószínűleg programhiba.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Az időbélyeg nem alakítható http formátumúra. Visszaváltás 0-ra utolsó "
+"módosítási időként.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "A BODY adatfájl (%s) hiányzik: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Meglévő kapcsolat újrafelhasználása a következőhöz: [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Meglévő kapcsolat újrafelhasználása a következőhöz: %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "A proxy válasz olvasása meghiúsult: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s HIBA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Rosszul formázott állapotsor"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "A proxy alagutazás meghiúsult: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ismeretlen hitelesítési séma.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Hitelesítés kijelölve: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Mentés ide: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Az aláírás letöltése közben:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Nem olvasható az aláírás tartalma az átmeneti fájlból. Kihagyás.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Nem sikerült létrehozni átmeneti fájlt. Az aláírás letöltésének kihagyása.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Érvénytelen pri érték. %d feltételezése.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Nem található elfogadható összesítés a Metalink erőforrásokhoz.\n"
+"Figyelmen kívül maradnak.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "A tapasztalt hibák miatt az SSL letiltásra kerül.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s kérés elküldve, várakozás válaszra… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nem érkezett adat.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Olvasási hiba (%s) a fejlécekben.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(nincs leírás)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Hely: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nincs megadva"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [következik]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"A fájl (%s) nem módosult a kiszolgálón. A letöltés elmarad.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"A kiszolgáló figyelmen kívül hagyta az If-Modified-Since fejlécet ehhez\n"
+"a fájlhoz: %s.\n"
+"Érdemes lehet megadni a --no-if-modified-since kapcsolót.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" A fájl már teljesen le van töltve; nincs teendő.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Hossz: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "figyelmen kívül hagyva"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Figyelmeztetés: a helyettesítő karaktereket a HTTP nem támogatja.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "A „spider†mód bekapcsolva. A távoli fájl létezésének ellenőrzése.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "%s nem írható (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "A kapott fejlécből hiányzik egy kötelező attribútum.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "A felhasználónév/jelszó hitelesítés meghiúsult.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Nem írható a WARC fájl.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Nem írható az átmeneti WARC fájl.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nem lehet létrehozni SSL-kapcsolatot.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "%s nem törölhető (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "HIBA: Ãtirányítás (%d) hely nélkül.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Nem találhatók Metalink adatok a HTTP válaszban. A fájl letöltése HTTP GET "
+"használatával.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Metalink fejlécek megtalálva. Váltás Metalink módba.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "A távoli fájl nem létezik -- hibás hivatkozás!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Az utolsó módosítás fejléc hiányzik -- az időbélyegek kikapcsolva.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Az utolsó módosítás fejléc érvénytelen -- az időbélyeg figyelmen kívül "
+"hagyva.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"A kiszolgálón lévő fájl nem újabb a helyi %s fájlnál -- nem kerül "
+"letöltésre.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "A méretek nem egyeznek (a helyi: %s) -- letöltésre kerül.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "A távoli fájl újabb, letöltésre kerül.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"A távoli fájl létezik és hivatkozásokat tartalmazhat más erőforrásokra -- "
+"letöltésre kerül.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"A távoli fájl létezik, de nem tartalmaz hivatkozásokat -- nem kerül "
+"letöltésre.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"A távoli fájl létezik és tartalmazhat további hivatkozásokat,\n"
+"de a rekurzió le van tiltva -- nem kerül letöltésre.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"A távoli fájl létezik.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) -- %s kiírva a szabványos kimenetre [%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) -- %s mentve [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) -- A kapcsolat lezárva a(z) %s. bájtnál. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) -- Olvasási hiba a(z) %s. bájtnál (%s). "
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) -- Olvasási hiba a(z) %s/%s. bájtnál (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nem támogatott védelmi minÅ‘ség: „%sâ€.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nem támogatott algoritmus: „%sâ€.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: A WGETRC a nem létező %s elemre mutat.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: %s nem olvasható (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Hiba a következőben: %s, a(z) %d. sornál.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Szintaktikai hiba a következőben: %s, a(z) %d. sornál.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Ismeretlen parancs (%s) a következőben: %s, a(z) %d. sornál.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"A rendszer wgetrc fájljának (env SYSTEM_WGETRC) feldolgozása meghiúsult.\n"
+"EllenÅ‘rizze a következÅ‘t: „%sâ€,\n"
+"vagy adjon meg másik fájlt a --config kapcsolóval.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"A rendszer wgetrc fájljának feldolgozása meghiúsult.\n"
+"EllenÅ‘rizze a következÅ‘t: „%sâ€,\n"
+"vagy adjon meg másik fájlt a --config kapcsolóval.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Figyelmeztetés: Mind a rendszer, mind a felhasználói wgetrc a(z) %s "
+"elemre mutat.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Érvénytelen --execute parancs: %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: Érvénytelen logikai érték: %s, használja az „on†vagy „off†"
+"szavakat.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: Érvénytelen %s, használja az „onâ€, „off†vagy „quiet†egyikét.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Érvénytelen szám: %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: a(z) %s csak egyszer használható\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Érvénytelen bájtérték: %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Érvénytelen időintervallum: %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Érvénytelen időintervallum: %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"A use-askpass egy karakterláncot, vagy a WGET_ASKPASS vagy SSH_ASKPASS "
+"környezeti változó egyikének beállítását igényli.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Érvénytelen érték: %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Érvénytelen fejléc: %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Érvénytelen WARC fejléc: %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Érvénytelen folyamattípus: %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Érvénytelen korlátozás: %s\n"
+" használja a [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii] "
+"egyikét.\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "A kódolás (%s) nem érvényes\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Az átalakítás (%s → %s) nem támogatott\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Nem teljes vagy érvénytelen több bájtos sorozat található\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Kezeletlen hibaszám: %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: a területi beállítás nincs megadva\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "az idn_encode meghiúsult (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Nem sikerült kisbetűssé alakítani: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Kimenet átirányítása ide: %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; naplózás letiltása.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Használat: %s [KAPCSOLÓ]… [URL]…\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"A hosszú kapcsolók kötelező argumentumai a rövid kapcsolóknál is "
+"kötelezőek.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Indítás:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version a Wget verziójának kiírása és kilépés\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help ezen súgó megjelenítése\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background indítás után folytatás a háttérben\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=PARANCS egy „.wgetrc†stílusú parancs "
+"végrehajtása\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Naplózás és bemeneti fájl:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FÃJL üzenetek naplózása a FÃJLBA\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FÃJL üzenetek hozzáfűzése a FÃJLHOZ\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug rengeteg hibakeresési információ kiírása\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug Watt-32 hibakeresési információk kiírása\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet csendes (nincs kimenet)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose legyen részletes (ez az alapértelmezés)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose részletesség kikapcsolása csendesség "
+"nélkül\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TÃPUS sávszélesség kiírása TÃPUSKÉNT. A TÃPUS\n"
+" lehet bitek\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FÃJL a helyi vagy külsÅ‘ FÃJLBAN található URL-"
+"ek\n"
+" letöltése\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FÃJL a helyi Metalink FÃJLBAN lefedett fájlok\n"
+" letöltése\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html a bemeneti fájl HTML-ként kezelése\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL a HTML bemeneti fájl hivatkozások (-i -"
+"F)\n"
+" feloldása az URL-hez képest relatívan\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FÃJL használandó beállítófájl megadása\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config ne olvasson semmilyen beállítófájlt\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FÃJL az URL-visszautasítás okainak naplózása\n"
+" a FÃJLBA\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Letöltés:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=SZÃM újrapróbálkozások számának beállítása a\n"
+" SZÃMRA (0 = végtelen)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused újrapróbálkozás akkor is, ha a kapcsolat\n"
+" visszautasításra kerül\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LISTA a figyelmen kívül hagyott HTML címkék\n"
+" vesszőkkel elválasztott listája\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FÃJL dokumentumok írása a FÃJLBA\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber azon letöltések kihagyása, amelyek "
+"létező\n"
+" fájlokra töltenének le (azokat "
+"felülírva)\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-config ne olvasson semmilyen beállítófájlt\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue részben letöltött fájl letöltés "
+"folytatása\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=ELTOLÃS letöltés kezdése nullától kezdÅ‘dÅ‘ "
+"ELTOLÃSTÓL\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TÃPUS elÅ‘rehaladás mérése típusának "
+"kiválasztása\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress a folyamatsáv megjelenítése bármely\n"
+" részletességi módban\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ne töltse le újra a fájlokat, hacsak nem\n"
+" újabbak a helyinél\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ne használjon feltételes if-modified-"
+"since\n"
+" get kéréseket időbélyegzés módban\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ne állítsa be a helyi fájl időbélyegét\n"
+" a kiszolgálón lévőére\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response a kiszolgáló válaszának kiírása\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ne töltsön le semmit\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=MÃSODPERC minden idÅ‘korlát értékének beállítása "
+"ennyi\n"
+" MÃSODPERCRE\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=CÃMEK lekérdezendÅ‘ DNS kiszolgálók (vesszÅ‘vel\n"
+" elválasztott) listája\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=CÃM DNS feloldó rákapcsolása a CÃMRE (gépnév\n"
+" vagy IP-cím) a helyi gépen\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=MP a DNS keresés időkorlátjának beállítása\n"
+" MP másodpercre\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=MP a kapcsolódás időkorlátjának beállítása\n"
+" MP másodpercre\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=MP az olvasási időkorlát beállítása MP\n"
+" másodpercre\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=MÃSODPERC MÃSODPERC várakozás a letöltések között\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=MÃSODPERC 1..MÃSODPERC várakozás egy letöltés\n"
+" újrapróbálásai között\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait várakozás 0,5*WAIT … 1,5*WAIT "
+"másodpercig\n"
+" a letöltések között\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy proxy határozott kikapcsolása\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=SZÃM a letöltési kvóta beállítása a SZÃMRA\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=CÃM hozzákötés a CÃMHEZ (gépnév vagy IP-cím)\n"
+" a helyi gépen\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=SEBESSÉG letöltési sebesség korlátozása "
+"SEBESSÉGRE\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache DNS keresések gyorsítótárazásnak "
+"letiltása\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS karakterek korlátozása a fájlnevekben "
+"arra,\n"
+" amit az OS operációs rendszer "
+"engedélyez\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case kis- és nagybetűk figyelmen kívül "
+"hagyása\n"
+" fájlok/könyvtárak egyeztetésekor\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only kapcsolódás csak IPv4 címekhez\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only kapcsolódás csak IPv6 címekhez\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=CSALÃD kapcsolódás elÅ‘ször a megadott család\n"
+" címeihez: „IPv6â€, „IPv4†vagy „noneâ€\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=FELHASZNÃLÓ mind az ftp, mind a http felhasználó\n"
+" beállítása a FELHASZNÃLÓRA\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=JELSZÓ mind az ftp, mind a http jelszó "
+"beállítása\n"
+" a JELSZÓRA\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password jelszavak bekérése\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=PARANCS hitelesítési adatok kezelőjének megadása\n"
+" a felhasználónév és a jelszó "
+"kéréséhez.\n"
+" Ha nincs PARANCS megadva, akkor a\n"
+" WGET_ASKPASS vagy az SSH_ASKPASS\n"
+" környezeti változó lesz használva.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri IRI támogatás kikapcsolása\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KÓD KÓD használata az IRI-k helyi "
+"kódolásaként\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KÓD KÓD használata alapértelmezett távoli\n"
+" kódolásként\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink fájl eltávolítása felülírás előtt\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash eltérő ellenőrzőösszegű fájlok "
+"megtartása\n"
+" (.badhash hozzáfűzése)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=SZÃM Metalink application/metalink4+xml "
+"metaurl\n"
+" sorrendi SZÃM\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http Metalink metaadatok használata HTTP\n"
+" válaszfejlécekből\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location Metalink erőforrások előnyben "
+"részesített\n"
+" helye\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr metaadatok tárolásának kikapcsolása a\n"
+" kiterjesztett fájlattribútumokban\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Könyvtárak:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ne hozzon létre könyvtárakat\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+" -x, --force-directories könyvtárak létrehozásának kényszerítése\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories ne hozzon létre kiszolgálókönyvtárakat\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories protokollnév használata a könyvtárakban\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=ELÅTAG fájlok mentése az ELÅTAG/… könyvtárba\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=SZÃM SZÃM db távoli könyvtárösszetevÅ‘ "
+"kihagyása\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP kapcsolók:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=FELHASZNÃLÓ http felhasználó beállítása "
+"FELHASZNÃLÓRA\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=JELSZÓ http jelszó beállítása JELSZÓRA\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache a kiszolgáló által gyorsítótárazott "
+"adatok\n"
+" tiltása\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NÉV az alapértelmezett oldalnév "
+"megváltoztatása\n"
+" (ez általában az „index.htmlâ€)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension HTML/CSS dokumentumok mentése a "
+"megfelelő\n"
+" kiterjesztésekkel\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length a „Content-Length†fejlécmező mellőzése\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=KARAKTERLÃNC KARAKTERLÃNC beszúrása a fejlécek közé\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect oldalanként engedélyezett átirányítások\n"
+" legnagyobb száma\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=FELHASZNÃLÓ FELHASZNÃLÓ beállítása proxy felhasználó\n"
+" névként\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=JELSZÓ JELSZÓ beállítása proxy jelszóként\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL a „Referer: URL†fejléc felvétele a HTTP\n"
+" kérésbe\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers a HTTP fejlécek mentése fájlba\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ÜGYNÖK azonosítás ÜGYNÖKKÉNT a Wget/VERZIÓ "
+"helyett\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive a HTTP keep-alive (tartós kapcsolatok)\n"
+" letiltása\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ne használjon sütiket\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FÃJL sütik betöltése FÃJLBÓL a munkamenet "
+"előtt\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FÃJL sütik mentése FÃJLBA a munkamenet után\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies munkamenet (nem állandó) sütik betöltése "
+"és\n"
+" mentése\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=KARAKTERLÃNC a POST metódus használata, a "
+"KARAKTERLÃNC\n"
+" küldése adatként\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FÃJL a POST metódus használata, a FÃJL\n"
+" tartalmának küldése\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMetódus „HTTPMetódus†metódus használata a "
+"kérésben\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=KARAKTERLÃNC a KARAKTERLÃNC küldése adatként,\n"
+" a --method beállítása kötelező\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FÃJL a FÃJL tartalmának küldése, a\n"
+" --method beállítása kötelező\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition a „Content-Disposition†fejléc "
+"tiszteletben\n"
+" tartása helyi fájlnevek "
+"kiválasztásakor\n"
+" (KÃSÉRLETI)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error a kapott tartalom kiírása "
+"kiszolgálóhibák\n"
+" esetén\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge alapvető HTTP hitelesítési információk\n"
+" küldése anélkül, hogy először megvárná\n"
+" a kiszolgáló kihívási kérését\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) kapcsolók:\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR biztonságos protokoll kiválasztása, az\n"
+" „autoâ€, „SSLv2â€, „SSLv3â€, „TLSv1†és\n"
+" „PFS†egyike\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only csak biztonságos HTTPS hivatkozások "
+"követése\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ne ellenőrizze a kiszolgáló "
+"tanúsítványát\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FÃJL ügyfél tanúsítványfájlja\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TÃPUS ügyfél tanúsítványának típusa, PEM vagy "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FÃJL személyes kulcs fájlja\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TÃPUS személyes kulcs típusa, PEM vagy DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=FÃJL a hitelesítésszolgáltatók csoportját\n"
+" tartalmazó fájl\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=KÖNYVTÃR a hitelesítésszolgáltatók hash listáját\n"
+" tartalmazó könyvtár\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=FÃJL a tanúsítvány-visszavonási fájlok\n"
+" csoportját tartalmazó fájl\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FÃJL/HASH-EK nyilvános kulcs (PEM/DER) fájl, vagy\n"
+" tetszőleges számú base64 kódolású "
+"sha256\n"
+" hash „sha256//†elÅ‘taggal, és „;â€\n"
+" elválasztóval; a partner "
+"ellenőrzéséhez\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FÃJL véletlen adatokat tartalmazó fájl az SSL\n"
+" PRNG előkészítéséhez\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FÃJL véletlen adatokat tartalmazó, az EGD\n"
+" foglalatot megnevező fájl\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS kapcsolók:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts HSTS tiltása\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file a HSTS adatbázis útvonala (felülbírálja "
+"az\n"
+" alapértelmezést)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP kapcsolók:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Stream_LF formátum használata az összes\n"
+" bináris FTP fájlhoz\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=FELHASZNÃLÓ az ftp felhasználó beállítása "
+"FELHASZNÃLÓRA\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=JELSZÓ az ftp jelszó beállítása a JELSZÓRA\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing ne távolítsa el a „.listing†fájlokat\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob helyettesítő karakterek használatának\n"
+" kikapcsolása FTP fájlnevekben\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp a „passzív†átviteli mód letiltása\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions távoli fájljogosultságok megőrzése\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks rekurzív letöltéskor a szimbolikus "
+"linkek\n"
+" által hivatkozott fájlok (nem "
+"könyvtárak)\n"
+" letöltése\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS kapcsolók:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit implicit FTPS használata\n"
+" (az alapértelmezett port a 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl a vezérlőkapcsolatban indított SSL/"
+"TLS\n"
+" munkamenet folytatása "
+"adatkapcsolat\n"
+" nyitásakor\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection csak a vezérlőkapcsolat titkosítása;\n"
+" minden adat egyszerű szöveg lesz\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp visszaváltás FTP-re, ha az FTPS nem\n"
+" támogatott a cél kiszolgálón\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC kapcsolók:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FÃJLNÉV kérés/válasz adatok mentése .warc.gz "
+"fájlba\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=KARAKTERLÃNC KARAKTERLÃNC beszúrása a warcinfo "
+"rekordba\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=SZÃM a WARC fájlok legnagyobb méretének\n"
+" beállítása SZÃMRA\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx CDX indexfájlok kiírása\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FÃJLNÉV ne tárolja az ezen CDX fájlban felsorolt\n"
+" rekordokat\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ne tömörítse a WARC fájlokat GZIP-pel\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+" --no-warc-digests ne számítson SHA1 ellenőrzőösszegeket\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ne tárolja a naplófájlt WARC rekordban\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=KÖNYVTÃR a WARC író által létrehozott átmeneti\n"
+" fájlok helye\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekurzív letöltés:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive rekurzív letöltés megadása\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=SZÃM legnagyobb rekurziós mélység (inf vagy\n"
+" 0 = végtelen)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after helyi fájlok törlése letöltés után\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links hivatkozások átalakítása a letöltött "
+"HTML\n"
+" vagy CSS fájlban, hogy helyi fájlokra\n"
+" mutassanak\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only csak az URL-ek fájl részének átalakítása\n"
+" (általában basename néven is ismert)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N az X fájl írása előtt legfeljebb N "
+"mentési\n"
+" fájl forgatása\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted az X fájl átalakítása előtt készüljön "
+"róla\n"
+" X_orig néven mentés\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted az X fájl átalakítása előtt készüljön "
+"róla\n"
+" X.orig néven mentés\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror azonos a -N -r -l inf --no-remove-"
+"listing\n"
+" kapcsolók használatával\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites a HTML oldal megjelenítéséhez szükséges\n"
+" összes kép stb. letöltése\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments a HTML megjegyzések szigorú (SGML)\n"
+" kezelésének bekapcsolása\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekurzív elfogadás/visszautasítás:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA az elfogadott kiterjesztések vesszőkkel\n"
+" elválasztott listája\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA a visszautasított kiterjesztések "
+"vesszőkkel\n"
+" elválasztott listája\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX a regex illesztés által elfogadott URL-"
+"ek\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX a regex illesztés által elutasított URL-"
+"ek\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TÃPUS reguláris kifejezés típusa (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TÃPUS reguláris kifejezés típusa (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA az elfogadott tartományok vesszőkkel\n"
+" elválasztott listája\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA a visszautasított tartományok vesszőkkel\n"
+" elválasztott listája\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp FTP hivatkozások követése HTML\n"
+" dokumentumokból\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA a követett HTML címkék vesszőkkel\n"
+" elválasztott listája\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA a figyelmen kívül hagyott HTML címkék\n"
+" vesszőkkel elválasztott listája\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts rekurzív módban menjen idegen gépekre is\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative csak a relatív hivatkozások követése\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LISTA az engedélyezett könyvtárak listája\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names az átirányítási URL utolsó összetevője "
+"által\n"
+" megadott név használata\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTA a kihagyott könyvtárak listája\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ne lépjen be a szülőkönyvtárba\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, egy nem-interaktív hálózati letöltő.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "%s felhasználó jelszava: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Jelszó: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nem lehet létrehozni adatcsatornát\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Hiba az indítási fájlműveletek előkészítésekor a use-askpass kapcsolónál: "
+"%d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Hiba az indítási fájlműveletek beállításakor a use-askpass kapcsolónál: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Hiba a(z) „%s %s†parancstól érkező válasz olvasásakor: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "„%s%s†felhasználóneve: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "„%s%s@%s†jelszava: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Területi beállítás: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Fordítás: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Összeállítás: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s, összeállítva %s rendszeren.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (user)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licenc: GPLv3+: GNU GPL v3 vagy újabb\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Ez egy szabad szoftver, szabadon módosíthatja és terjesztheti.\n"
+"NINCS GARANCIA, a jog által engedélyezett mértékig.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Eredetileg Hrvoje Niksic <hniksic@xemacs.org> írta.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Hibajelentések és kérdések a <bug-wget@gnu.org> címre küldhetők.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Memóriafoglalási probléma\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Kilépés hiba miatt itt: %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "További kapcsolókért adja ki a „%s --help†parancsot.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: szabálytalan kapcsoló -- „-n%câ€\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"A hibakeresés támogatása nincs befordítva. A --debug figyelmen kívül marad.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"A --no-clobber és a --convert-links is meg lett adva, csak a --convert-"
+"links\n"
+"kerül felhasználásra.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"A --no-clobber és a --convert-file-only is meg lett adva, csak a\n"
+"--convert-file-only kerül felhasználásra.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Nem lehet részletes és csendes egyszerre.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Nem lehet időbélyeget is tenni a régi fájlokra és ugyanakkor békén is "
+"hagyni.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Nem adható meg egyszerre mind a --inet4-only, mind az --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Nem adható meg egyszerre a -k vagy a --convert-file-only és a -O több URL\n"
+"megadásakor, illetve a -p vagy -r kapcsolókkal együtt. Részletekért lásd a\n"
+"kézikönyvet.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"FIGYELMEZTETÉS: a -O és a -r vagy -p együttes használata azt jelenti, hogy\n"
+"minden letöltött tartalom a megadott fájlba kerül.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"FIGYELMEZTETÉS: az időbélyegek hatástalanok a -O kapcsolóval együtt.\n"
+"A részletekért lásd a kézikönyvoldalt.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"A WARC kimenet nem működik a --no-clobber kapcsolóval, így ez le lesz "
+"tiltva.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "A WARC kimenet nem működik az időbélyegekkel, így ez le lesz tiltva.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "A WARC kimenet nem működik a --spider kapcsolóval.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"A WARC kimenet nem működik a --continue vagy --start-pos kapcsolóval, ezek\n"
+"le lesznek tiltva.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Az ellenőrzőösszegek letiltva, a WARC deduplikáció nem fogja megtalálni a\n"
+"többszörös rekordokat.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"A WARC kimenet nem működik a --continue vagy --start-pos kapcsolóval, ezek\n"
+"le lesznek tiltva.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Nem adható meg egyszerre az --ask-password és a --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"A --start-pos és a --continue együttes megadása nem javasolt, a --continue "
+"le\n"
+"lesz tiltva.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: hiányzó URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Nem adható meg egyszerre a --post-data és a --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Nem használható a --post-data vagy --post-file a --method kapcsolóval "
+"együtt.\n"
+"A --method az adatokat --body-data és --body-file kapcsolókon keresztül "
+"várja.\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Meg kell adnia egy metódust a --method=HTTPMetódus kapcsolón keresztül a\n"
+"--body-data vagy --body-file kapcsolókkal való használathoz.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Nem adható meg egyszerre a --body-data és a --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ez a verzió nem tartalmazza az IRI-k támogatását\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"A -k vagy -r csak akkor használható a -O kapcsolóval, ha normál fájl a "
+"kimenet.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"A --convert-links vagy --convert-file-only csak akkor használható együtt, "
+"ha\n"
+"normál fájl a kimenet.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Nem sikerült a libcares előkészítése\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Nem sikerült a c-ares csatorna előkészítése\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Nem sikerült az IP-cím („%sâ€) feldolgozása\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Nem sikerült a DNS kiszolgálók („%sâ€) beállítása (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nem található URL a következőben: %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "%s metalink fájl feldolgozása sikertelen.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Nem sikerült letölteni minden erőforrást innen: %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"BEFEJEZVE --%s--\n"
+"Valóságban eltelt teljes idő: %s\n"
+"Letöltve: %d fájl, %s %s alatt (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "A letöltési korlát (%s) TÚLLÉPVE!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "a -O nem támogatott Metalink letöltés esetén. Figyelmen kívül marad.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Tervezett metalink fájl: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Biztonságos metalink fájl: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Metalink fájl visszautasítása. Nem biztonságos név.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Metaurl (%s) feldolgozása…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Metaurl fájl (%s) visszautasítása. Nem biztonságos név.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "%s letöltése sikertelen. Metaurl kihagyása.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "A metaurl fájl (%s) feldolgozása sikertelen.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "A metaurl-ek feldolgozása hibával tért vissza.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Az erőforrás típusa (%s) nem támogatott, mellőzés…\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Nem sikerült megnyitni a letöltött fájlt.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "%s méretének kiszámítása\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "A fájlméret nincs meghatározva. Ellenőrzés kihagyása.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nem sikerült lekérni a letöltött fájl méretét.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "A méret eltér ennél a fájlnál: %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "A méret megegyezik.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "%s ellenőrzőösszegének kiszámítása\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Az ellenőrzőösszeg megegyezik.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Az ellenőrzőösszeg eltér ennél a fájlnál: %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Nem sikerült megnyitni a letöltött fájlt az aláírás ellenőrzéséhez.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Az aláírás ellenőrzése sikerült.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Érvénytelen aláírás. Erőforrás elutasítása.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Az adat megfelel az aláírásnak, de az aláírás nem megbízható.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Nem találhatók ellenőrzőösszegek.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "%s letöltése sikertelen. Erőforrás kihagyása.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "A fájl (%s) letöltve, de a méret nem egyezik. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "A fájl (%s) letöltve, de az ellenőrzőösszeg nem egyezik. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "A fájl (%s) letöltve, de az aláírás nem egyezik. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s átnevezése erre: %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Folytatás a háttérben.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Folytatás a háttérben, a pid: %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "A kimenet a következő fájlba lesz kiírva: %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "a fake_fork_child() meghiúsult\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "a fake_fork() meghiúsult\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Nem található használható foglalat-illesztőprogram.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "az ioctl() meghiúsult. A foglalat nem állítható be blokkolóként.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: figyelmeztetés: %s token található a gépnév előtt\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: ismeretlen token „%sâ€\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Használat: %s NETRC [GÉPNÉV]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: %s nem érhető el: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "FIGYELMEZTETÉS: gyenge véletlenmag kerül felhasználásra.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "A PRNG nem készíthető elő; fontolja meg a --random-file használatát.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Az OpenSSL verzió túl régi a TLSv1.1 támogatásához\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Az OpenSSL verzió túl régi a TLSv1.1 támogatásához\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Az OpenSSL verzió túl régi a TLSv1.2 támogatásához\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: megvalósítatlan „secure-protocol†kapcsolóérték: %d\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Érvénytelen URL: %s: %s.\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "A PRNG nem készíthető elő; fontolja meg a --random-file használatát.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: %s %s által kiadott tanúsítványa nem ellenőrizhető:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " A kibocsátó hitelessége nem ellenőrizhető helyileg.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Saját aláírású tanúsítvány.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " A kibocsátott tanúsítvány még nem érvényes.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " A kibocsátott tanúsítvány lejárt.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: a tanúsítvány alanyának alternatív neve nem egyezik\n"
+"\ta kért %s gépnévvel.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: a tanúsítvány %s általános neve nem egyezik a kért %s gépnévvel.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: a tanúsítvány általános neve érvénytelen (NULL karaktert "
+"tartalmaz).\n"
+" Ez azt jelezheti, hogy a gép nem az, akinek mondja magát\n"
+" (azaz nem a valódi %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"A(z) %s géphez történő nem biztonságos kapcsolódáshoz használja a\n"
+"„--no-check-certificate†kapcsolót.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ kihagyva %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Érvénytelen pontstílus meghatározás: %s; változatlanul hagyva.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " kész: %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " idő "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "A valós idejű óra frekvenciája nem kérhető le: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "%s eltávolítása, mivel vissza kellene utasítani.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "%s nem nyitható meg: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "robots.txt betöltése; hagyja figyelmen kívül a hibákat.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Hiba a proxy URL feldolgozása közben: %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Hiba a(z) %s proxy URL-ben: HTTP kell legyen.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d átirányítás túllépve.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Feladás.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Újrapróbálkozás.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Nem található hibás hivatkozás.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d hibás hivatkozás található.\n"
+"\n"
+msgstr[1] ""
+"%d hibás hivatkozás található.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Nincs hiba"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nem támogatott séma (%s) "
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "A séma hiányzik"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Érvénytelen gépnév"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Rossz portszám"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Érvénytelen felhasználónév"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Befejezetlen IPv6 numerikus cím"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Az IPv6 címek nem támogatottak"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Érvénytelen IPv6 numerikus cím"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "A HTTPS támogatás nincs befordítva"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Nem teljes vagy érvénytelen több bájtos sorozat található\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: A szükséges memória lefoglalása meghiúsult; elfogyott a memória.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: %ld bájt lefoglalása meghiúsult; elfogyott a memória.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: a szöveges puffer túl nagy (%d bájt), megszakítás.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Folytatás a háttérben, a pid: %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "A szimbolikus link (%s) törlése meghiúsult: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Nem sikerült a libcares előkészítése\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "A(z) %s jogosultságainak beállítása sikertelen.\n"
+
+#: src/utils.c:892
+#, fuzzy, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "A(z) %s jogosultságainak beállítása sikertelen.\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Nem sikerült az IP-cím („%sâ€) feldolgozása\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "A(z) %s jogosultságainak beállítása sikertelen.\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Érvénytelen reguláris kifejezés: %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Érvénytelen reguláris kifejezés: %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Hiba %s illesztése közben: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Hiba a WARC fájl megnyitásakor: %s\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Hiba a WARC fájl megnyitásakor: %s\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Hiba a WARC fájl megnyitásakor: %s\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Hiba a GZIP adatfolyam megnyitásakor a WARC fájlhoz.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Hiba a warcinfo rekord írásakor a WARC fájlba.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"%s WARC fájl megnyitása.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Hiba a WARC fájl megnyitásakor: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"A CDX fájl nem sorolja fel az eredeti URL-eket. (Hiányzó „a†oszlop.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+"A CDX fájl nem sorolja fel az ellenőrzőösszegeket. (Hiányzó „k†oszlop.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"A CDX fájl nem sorolja fel a rekordazonosítókat. (Hiányzó „u†oszlop.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"%d rekord betöltve a CDX-ből.\n"
+"\n"
+msgstr[1] ""
+"%d rekord betöltve a CDX-ből.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Nem sikerült beolvasni a(z) %s CDX fájlt a deduplikációhoz.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Nem sikerült megnyitni az átmeneti WARC manifest fájlt.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Nem sikerült megnyitni az átmeneti WARC naplófájlt.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Nem sikerült megnyitni a WARC fájlt.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Nem sikerült megnyitni a CDX fájlt a kimenethez.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Nem sikerült megnyitni az átmeneti WARC fájlt.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Pontos egyezés található a CDX fájlban. A revizit rekord mentése a WARC-ba.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Ismeretlen rendszerhiba"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "A gépnév címcsaládja nem támogatott"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Az ai_flags értéke hibás"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Helyrehozhatatlan névfeloldási hiba"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "Az ai_family nem támogatott"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Memóriafoglalási hiba"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Nincs cím társítva a gépnévhez"
+
+#~ msgid "Name or service not known"
+#~ msgstr "A név vagy a szolgáltatás nem ismert"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "A kiszolgálónév nem támogatott az ai_socktype-hoz"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "Az ai_socktype nem támogatott"
+
+#~ msgid "System error"
+#~ msgstr "Rendszerhiba"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "A paraméterpuffer túl kicsi"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Kérés feldolgozása folyamatban"
+
+#~ msgid "Request canceled"
+#~ msgstr "Kérés megszakítva"
+
+#~ msgid "Request not canceled"
+#~ msgstr "A kérés nem lett megszakítva"
+
+#~ msgid "All requests done"
+#~ msgstr "Minden kérés kész"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Egy szignál megszakította"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "A paraméter-karakterlánc kódolása nem megfelelő"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: a(z) „%s†kapcsoló nem egyértelmű; a lehetőségek:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: a(z) „%s†kapcsoló nem egyértelmű\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a(z) „--%s†kapcsoló nem enged meg argumentumot\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: a(z) „%c%s†kapcsoló nem enged meg argumentumot\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: a(z) „--%s†kapcsolóhoz argumentum szükséges\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: a(z) „--%s†kapcsoló ismeretlen\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: a(z) „%c%s†kapcsoló ismeretlen\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: érvénytelen kapcsoló -- „%câ€\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: a kapcsoló egy argumentumot igényel -- „%câ€\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: a „-W %s†kapcsoló nem egyértelmű\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a „-W %s†kapcsoló nem enged meg argumentumot\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a „-W %s†kapcsolóhoz argumentum szükséges\n"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "Sikerült"
+
+#~ msgid "No match"
+#~ msgstr "Nincs találat"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Érvénytelen reguláris kifejezés"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Érvénytelen leválogatási karakter"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Érvénytelen karakterosztálynév"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Lezáró fordított perjel"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Érvénytelen visszahivatkozás"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Pár nélküli [, [^, [:, [. vagy [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Pár nélküli ( vagy \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Pár nélküli \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "A \\{\\} tartalma érvénytelen"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Érvénytelen tartományvég"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Elfogyott a memória"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Érvénytelen megelőző reguláris kifejezés"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "A reguláris kifejezés túl korán véget ért"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "A reguláris kifejezés túl nagy"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Pár nélküli ) vagy \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Nincs előző reguláris kifejezés"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nem hozható létre adatcsatorna"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s alfolyamat sikertelen"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "az _open_osfhandle meghiúsult"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "a(z) %d fájlleíró nem állítható vissza: a dup2 sikertelen"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s alfolyamat"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s alfolyamat végzetes szignált (%d) kapott"
+
+#~ msgid "memory exhausted"
+#~ msgstr "elfogyott a memória"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Hibajelentéseket és javaslatokat a <bug-wget@gnu.org> címre küldhet\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "A fájl („%sâ€) már létezik, nem kerül letöltésre.\n"
diff --git a/po/id.gmo b/po/id.gmo
new file mode 100644
index 0000000..ae47dde
--- /dev/null
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
new file mode 100644
index 0000000..240b7c0
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,3746 @@
+# Pesan Bahasa Indonesia untuk GNU wget
+# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Permission is granted to freely copy and distribute
+# this file and modified versions, provided that this
+# header is not removed and modified versions are marked
+# as such.
+# Arif E. Nugroho <arif_endro@yahoo.com>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.16.1.46\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2015-06-01 10:00+0700\n"
+"Last-Translator: Arif E. Nugroho <arif_endro@yahoo.com>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: tidak dapat menemukan alamat bind %s; menonaktifkan bind.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Menghubungi %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Menghubungi %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Menghubungi [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "terhubung.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "gagal: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: tidak dapat menemukan alamat dari %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Mengubah %d files dalam %s detik.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Mengubah %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "tidak ada yang bisa dilakukan.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Tidak dapat mengubah links dalam %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Tidak dapat menghapus %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Tidak dapat membackup %s sebagai %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Tidak dapat memperoleh cookie untuk %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntax error dalam Set-Cookie: %s pada posisi %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie datang dari %s mencoba untuk menset domain menjadi "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Tidak dapat membuka berkas cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Error menulis ke %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Error menutup %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Tipe listing tidak disupport, mencoba listing Unix parser.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index dari/%s pada %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "waktu tidak diketahui "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "File "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Direktori "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "LInk "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Tidak yakin "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Besar: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) tersisa"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s tersisa"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (unauthoritative)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Masuk sebagai %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Error dalam balasan server, menutup kontrol koneksi.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Error dalam salam server.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Gagal menulis, menutup kontrol koneksi.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Server menolak untuk login.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Login tidak benar.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Logged in!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Server error, tidak dapat menentukan tipe sistem.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "selesai. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "selesai.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipe `%c' tidak diketahui, menutup kontrol koneksi.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "selesai. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD tidak dibutuhkan.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Secara logika bagian tidak mungkin dicapai dalam getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Tidak ada direktori %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD tidak diperlukan.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Berkas sudah diambil.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Tidak dapat menginitialisasi transfer PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Tidak dapat parse PASV balasan.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "tidak dapat menghubungi %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind error (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT tidak valid.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST gagal, memulai dari awal.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Berkas %s ada.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Tidak ada berkas seperti itu %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Tidak ada berkas %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Tidak ada berkas atau direktori %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s memiliki sprung kedalam eksistensi.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, menutup kontrol koneksi.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Data koneksi: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Koneksi kontrol ditutup.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Data transfer dibatalkan.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Berkas %s sudah ada disana; tidak diambil.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(coba:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - ditulis ke stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s disimpan [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Menghapus %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Menggunakan %s sebagai berkas listing sementara.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Menghapus %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Kedalaman recursion %d melebihi maksimum kedalaman %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Berkas remote tidak ada yang lebih baru dari berkas lokal %s -- tidak "
+"diambil.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Berkas remote lebih baru dari berkas lokal %s -- diambil.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Besar tidak cocok dengan (local %s) -- diambil.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nama symlink tidak valid, dilewati.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Sudah memiliki symlink %s -> %s yang benar\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Membuat symlink %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Symlink tidak didukung, melewatkan symlink %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Melewati direktori %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tidak diketahui/tidak disupport tipe file.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Tidak dapat memperoleh cookie untuk %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: time-stamp corrupt/rusak.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Tidak akan mengambil dir karena kedalamannya %d (maksimal %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Tidak turun ke %s karena ini di excluded/tidak termasuk.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Menolak %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Menolak %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Tidak turun ke %s karena ini di excluded/tidak termasuk.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Gagal mencocokan %s dengan %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Tidak ada pola %s yang cocok.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Menulis HTML-ized indeks ke %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Menulis HTML-ized indeks ke %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERROR: Tidak ada direktori %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERROR: Failed to open cert %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Error dalam membaca sertifikat: %s.\n"
+
+#: src/gnutls.c:191
+#, fuzzy, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERROR: Failed to open cert %s: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Dimuat berkas CRL '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: tidak diimplementasikan 'secure-protocol' nilai pilihan %d\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr ""
+"Mohon kirimkan laporan kesalahan dan pertanyaan ke <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: tidak diimplementasikan 'secure-protocol' nilai pilihan %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERROR"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "PERINGATAN"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Tidak ada certificate yang di berikan oleh %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Sertifikat dari %s tidak dipercaya.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Sertifikat dari %s belum memperoleh penerbit yang dikenal.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Sertifikat dari %s telah dicabut.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Sertifikat dari %s tidak dipercaya CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Sertifikat dari %s belum memperoleh penerbit yang dikenal.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Sertifikat dari %s tidak dipercaya.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Sertifikat dari %s telah dicabut.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Error menginisialisasi sertifikat X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Tidak ada sertifikat yang ditemukan\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Error dalam membaca sertifikat: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Sertifikat belum diaktifkan.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Sertifikat telah habis masa berlakunya.\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Pemilik sertifikat tidak cocok dengan nama host %s.\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certificate must bu X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Kesalahan dalam penanganan daftar alamat.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Host tidak diketahui"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Resolusi nama untuk sementara gagal"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Kesalahan tidak diketahui"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Resolving %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "gagal: Tidak ada alamat IPv4/IPv6 untuk host.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "gagal: waktu habis.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Tidak dapat menresolve link yang tidak komplit %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL tidak valid %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Gagal menulis permintaan HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Tidak ada headers, mengasumsikan HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Berkas %s sudah ada; tidak diambil.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY data berkas %s hilang: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Menggunakan koneksi yang sudah ada ke [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Menggunakan koneksi yang sudah ada ke %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Gagal membaca balasan proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERROR %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Status line salah format"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Proxy tunneling gagal: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Skema authentifikasi tidak diketahui.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Skema authentifikasi tidak diketahui.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Simpan ke: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Menonaktifkan SSL karena adanya errors.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Permintaan %s dikirimkan, menunggu balasan... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Tidak ada data yang diterima.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Read error (%s) dalam headers.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(tidak ada deskripsi)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Lokasi: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "tidak dispesifikasikan"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [mengikuti]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" File sudah secara penuh diterima; tidak ada yang harus dilakukan lagi.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Besar: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "diabaikan"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Peringatan: wildcards tidak disupport dalam HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Mode laba-laba diaktifkan. Check jika berkas tujuan ada.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Tidak dapat menulis ke %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Required attribute missing from Header received.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Username/Password Authentication Failed.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Tidak dapat membuat koneksi SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Tidak dapat menulis ke %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERROR: Redireksi (%d) tanpa lokasi.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Berkas tidak ada -- link rusak!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Header yang paling akhir dimodifikasi hilang -- time-stamps dimatikan.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"header yang paling akhir dimodifikasi tidak valid -- time-stamp diabaikan.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Berkas server tidak ada yang lebih baru dari lokal berkas %s -- tidak "
+"diambil.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Besar tidak cocok (local %s) -- diambil.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "File remote lebih baru, diambil.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Berkas tujuan telah ada dan mungkin bisa berisi link ke sumber lain -- "
+"mengambil.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Berkas tujuan ada tapi tidak berisi sumber lain -- tidak diambil.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Berkas tujuan ada dan dapat berisi link, tetap\n"
+"recursion dinonaktifkan -- tidak mencoba.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Berkas tujuan ada.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s: URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - disimpan ke stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s disimpan [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Hubungan ditutup pada byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Read error pada byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Read error pada byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Unsupported quality of protection '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Skema tidak didukung '%s'.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC menunjuk ke %s, dimana itu tidak ada.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Tidak dapat membaca %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Error dalam %s pada baris %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntax error dalam %s pada baris %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Perintah tidak diketahui %s dalam %s pada baris %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Peringatan: Kedua sistem dan pengguna wgetrc menunjuk ke %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Tidak valid --execute perintah %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Boolean tidak valid %s; gunakan `on' atau `off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Boolean tidak valid %s; gunakan `on' atau `off'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Nomor tidak valid %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Nilai byte tidak valid %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Perioda waktu tidak valid %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Perioda waktu tidak valid %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Nilai tidak valid %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Header tidak valid %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Header WARC tidak valid %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Tipe progress tidak valid %s.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Pembatasan tidak benar %s, \n"
+" gunakan [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Pengkodean %s tidak valid\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, fuzzy, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konversi dari %s ke %s belum didukung\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Tidak lengkap atau tidak valid urutan multibyte ditemui\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Errno tidak tertangani %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "local_to_utf8: lokal tidak diset\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode gagal (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "tidak dapat menghubungi %s port %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s diterima, meneruskan output ke %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; mematikan logging.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Penggunaan: %s [PILIHAN]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumen yang wajib untuk pilihan panjang juga wajib untuk pilihan yang "
+"pendek.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Memulai:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version menampilkan versi dari Wget dan keluar.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help menampilkan bantuan ini.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background pergi ke background setelah memulai.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMMAND menjalankan sebuah perintah `.wgetrc'-style.\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Mencatat dan memasukan berkas:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FILE pesan log pada FILE.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FILE tambahkan pesan pada FILE.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug tampilkan banyak informasi debugging.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug tampilkan keluaran Watt-32 debug.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet diam (tidak ada output).\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose jadi verbose (ini yang default).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose matikan verboseness, tanpa menjadi quiet.\n"
+
+#: src/main.c:624
+#, fuzzy
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE Output bandwidth as TYPE. TYPE can be bits.\n"
+
+#: src/main.c:626
+#, fuzzy
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=BERKAS download URLs ditemukan dalam lokal atau "
+"BERKAS eksternal.\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" -i, --input-file=BERKAS download URLs ditemukan dalam lokal atau "
+"BERKAS eksternal.\n"
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html perlakukan input file sebagai HTML.\n"
+
+#: src/main.c:634
+#, fuzzy
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL telusuri berkas masukan HTML (-i -F)\n"
+" relatif ke URL.\n"
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FILE Specify config file to use.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies jangan menggunakan cookies.\n"
+
+#: src/main.c:641
+#, fuzzy
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " -o, --output-file=FILE pesan log pada FILE.\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Download:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMBER set nomor mencoba ke NUMBER (0 untuk tidak "
+"terbatas).\n"
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr " --retry-connrefused coba lagi walaupun koneksi ditolak.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LIST list yang dipisahkan oleh koma yang "
+"berisitag HTML yang diabaikan.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FILE tulis document pada FILE.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber skip downloads yang akan mendownload ke\n"
+" file yang sudah ada.\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-cookies jangan menggunakan cookies.\n"
+
+#: src/main.c:660
+#, fuzzy
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue lanjutkan mengambil file yang terdownload "
+"sebagian.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+#, fuzzy
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYPE pilih tipe gauge progress.\n"
+
+#: src/main.c:666
+#, fuzzy
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=TYPE pilih tipe gauge progress.\n"
+
+#: src/main.c:668
+#, fuzzy
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping jangan mengambil kembali file kecuali file\n"
+" lebih baru dari file local.\n"
+
+#: src/main.c:671
+#, fuzzy
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" -N, --timestamping jangan mengambil kembali file kecuali file\n"
+" lebih baru dari file local.\n"
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" -N, --timestamping jangan mengambil kembali file kecuali file\n"
+" lebih baru dari file local.\n"
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response tampilkan balasan server.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider jangan mendownload apapun.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDS set semua nilai timeout pada SECONDS.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADDRESS bind ke ADDRESS (hostname atau IP) pada "
+"local host.\n"
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECS set the DNS lookup timeout pada SECS.\n"
+
+#: src/main.c:691
+#, fuzzy
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=SECS set the connect timeout pada SECS.\n"
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SECS set the read timeout pada SECS.\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SECONDS tunggu SECONDS diantara pengambilan.\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECONDS tunggu 1..SECONDS diantara pencobaan dari "
+"sebuah pengambilan.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait tunggu dari 0.5*WAIT...1.5*WAIT secs "
+"diantara pengambilan.\n"
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy secara eksplisit mematikan proxy.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=NUMBER set pengambilan quota pada NUMBER.\n"
+
+#: src/main.c:708
+#, fuzzy
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADDRESS bind ke ADDRESS (hostname atau IP) pada "
+"local host.\n"
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=RATE batasi kecepatan download ke RATE.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache matikan caching dari DNS lookups.\n"
+
+#: src/main.c:714
+#, fuzzy
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS restrict karakter dalam nama file ke salah "
+"satu dari yang dibolehkan oleh OS.\n"
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case abaikan besar/kecil huruf ketika mencocokan "
+"files/direktori..\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+" -4, --inet4-only hanya menghubungi ke alamat IPv4 saja.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+" -6, --inet6-only hanya menghubungi ke alamat IPv6 saja.\n"
+
+#: src/main.c:723
+#, fuzzy
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILY hubungi terlebih dahulu alamat dari family "
+"yang dispesifikasikan,\n"
+" salah satu dari IPv6, IPv4 atau none.\n"
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=USER set kedua ftp dan http user pada USER.\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PASS set kedua ftp dan http password pada PASS.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password tanya untuk kata sandi.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri non-aktifkan dukungan IRI.\n"
+
+#: src/main.c:742
+#, fuzzy
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC gunakan ENC sebagai pengkodean lokal untuk "
+"IRI.\n"
+
+#: src/main.c:744
+#, fuzzy
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC gunakan ENC sebagai pengkodean baku "
+"remote.\n"
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink remove file before clobber.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --warc-cdx write CDX index files.\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Direktori:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories jangan membuat direktori.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories paksa pembuatan direktori.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories jangan buat host directories.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories gunakan nama protocol dalam direktori.\n"
+
+#: src/main.c:774
+#, fuzzy
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX simpan file pada PREFIX/...\n"
+
+#: src/main.c:776
+#, fuzzy
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NUMBER abaikan NUMBER remote komponen "
+"direktori.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Pilihan HTTP:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USER set http user pada USER.\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=PASS set http password pada PASS.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --nocache dissallow server-cached data.\n"
+
+#: src/main.c:788
+#, fuzzy
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAMA Ubah nama halaman baku (biasanya\n"
+" ini `index.html'.).\n"
+
+#: src/main.c:791
+#, fuzzy
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension simpan HTML/CSS dokumen dengan ekstensi yang "
+"sesuai.\n"
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length abaikan `Content-Length' bagian header.\n"
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=STRING masukkan STRING dalam headers.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+#, fuzzy
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect batas maksimal yang diperbolehkan untuk "
+"redirection setiap halaman.\n"
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=USER set USER sebagai username proxy.\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=PASS set PASS sebagai password proxy.\n"
+
+#: src/main.c:807
+#, fuzzy
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL masukkan `Referer: URL' header dalam HTTP "
+"request.\n"
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers simpan HTTP headers pada file.\n"
+
+#: src/main.c:811
+#, fuzzy
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifikasi sebagai AGEN daripada sebagai "
+"Wget/VERSION.\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"koneksi).\n"
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies jangan menggunakan cookies.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FILE load cookies dari FILE sebelum session.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FILE simpan cookies pada FILE sesudah session.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies load dan simpan session (non-permanen) "
+"cookies.\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRING gunakan metoda POST; kirim STRING sebagai "
+"data.\n"
+
+#: src/main.c:825
+#, fuzzy
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FILE gunakan metoda POST; kirim isi dari FILE.\n"
+
+#: src/main.c:827
+#, fuzzy
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the header.\n"
+
+#: src/main.c:829
+#, fuzzy
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRING Send STRING as data. --method MUST be set.\n"
+
+#: src/main.c:831
+#, fuzzy
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FILE Send contents of FILE. --method MUST be set.\n"
+
+#: src/main.c:833
+#, fuzzy
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition Lihat header Content-Disposition ketika "
+"memilih\n"
+" berkas lokal (EKSPERIMEN).\n"
+
+#: src/main.c:836
+#, fuzzy
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error output the received content on server "
+"errors.\n"
+
+#: src/main.c:838
+#, fuzzy
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Kirim informasi otentifikasi standar HTTP "
+"tanpa\n"
+" harus menunggu untuk ditanyai oleh server.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Pilihan HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR pilih secure protocolm salah satu dari "
+"auto,\n"
+" SSLv2, SSLv3, dan TLSv1.\n"
+
+#: src/main.c:850
+#, fuzzy
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only ikuti link HTTPS only secure\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate jangan memvalidasi server certificate.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FILE client certificate file.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE tipe sertifikate client, PEM atau DER.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FILE private key file.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TYPE tipe private key, PEM atau DER.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FILE file yang berisi CA's.\n"
+
+#: src/main.c:864
+#, fuzzy
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR direktori dimana hash list dari CA's "
+"disimpan\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=FILE file yang berisi CA's.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+#, fuzzy
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FILE file dengan data acak untuk seeding SSL "
+"PRNG.\n"
+
+#: src/main.c:878
+#, fuzzy
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FILE penamaan file EGD socket dengan data "
+"random.\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "Pilihan HTTP:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --nocache dissallow server-cached data.\n"
+
+#: src/main.c:893
+#, fuzzy
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr " -v, --verbose jadi verbose (ini yang default).\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Pilihan FTP:\n"
+
+#: src/main.c:901
+#, fuzzy
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Gunakan format Stream_LF untuk seluruh berkas "
+"binari FTP.\n"
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=USER set ftp user pada USER.\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASS set ftp password pada PASS.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing jangan hapus file `.listing'.\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob matikan FTP nama file globbing.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp disable the \"passive\" mode trasfer.\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions preserver remote file permissions.\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks ketika berekursif, ambil linked-to files "
+"(bukan dir).\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "Pilihan FTP:\n"
+
+#: src/main.c:923
+#, fuzzy
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftp-stmlf Gunakan format Stream_LF untuk seluruh berkas "
+"binari FTP.\n"
+
+#: src/main.c:925
+#, fuzzy
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --trust-server-names jangan mengambil kembali file kecuali "
+"file\n"
+" lebih baru dari file local.\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Pilihan WARC:\n"
+
+#: src/main.c:936
+#, fuzzy
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file.\n"
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=STRING masukkan STRING dalam warcinfo record.\n"
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER.\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx write CDX index files.\n"
+
+#: src/main.c:944
+#, fuzzy
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file.\n"
+
+#: src/main.c:947
+#, fuzzy
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression do not compress WARC files with GZIP.\n"
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests do not calculate SHA1 digests.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record.\n"
+
+#: src/main.c:954
+#, fuzzy
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer.\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Recursive download:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive spesifikasikan untuk mendownload rekursif.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMBER maksimum kedalaman rekursi (inf atau 0 untuk tak "
+"terhingga).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after delete files locally sesudah mendownloadnya.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links buat links dalam HTML yang didownload atau CSS "
+"yang\n"
+" menunjuk ke berkas lokal.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+#, fuzzy
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr " --backups=N sebelum mengubah berkas X, backup sebagai X.orig.\n"
+
+#: src/main.c:976
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted sebelum mengubah berkas X, backup sebagai X."
+"orig.\n"
+
+#: src/main.c:979
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted sebelum mengubah file X, backup sebagai X.orig.\n"
+
+#: src/main.c:982
+#, fuzzy
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror shortcut untuk -N -r -l inf --no-remove-"
+"listing.\n"
+
+#: src/main.c:984
+#, fuzzy
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites ambil semua gambar, dll. yang diperlukan untuk "
+"menampilkan file HTML.\n"
+
+#: src/main.c:986
+#, fuzzy
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments hidupkan strick (SGML) handling dari komentar "
+"HTML.\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Recursive diterima/ditolak:\n"
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LIST list yang dipisahkan oleh koma yang "
+"berisiekstensi yang diterima.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LIST list yang dipisahkan oleh koma yang "
+"berisiekstensi yang ditolak.\n"
+
+#: src/main.c:996
+#, fuzzy
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr " --accept-regex=REGEX regex matching accepted URLs.\n"
+
+#: src/main.c:998
+#, fuzzy
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGEX regex matching rejected URLs.\n"
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TYPE pilih tipe regex (posix|pcre).\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYPE pilih tipe regex (posix).\n"
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIST list yang dipisahkan oleh koma yang "
+"berisidomains yang dibolehkan.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIST list yang dipisahkan oleh koma yang "
+"berisidomains yang direject/tolak.\n"
+
+#: src/main.c:1011
+#, fuzzy
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr " --follow-ftp ikuti link FTP dari dokumen HTML.\n"
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LIST list yang dipisahkan oleh koma yang "
+"berisitag HTML yang diikuti\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST list yang dipisahkan oleh koma yang "
+"berisitag HTML yang diabaikan.\n"
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts pergi ke host asing ketika recursive.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative hanya mengikuti links relative saja.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LIST list dari direktori yang dibolehkan.\n"
+
+#: src/main.c:1023
+#, fuzzy
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names jangan mengambil kembali file kecuali "
+"file\n"
+" lebih baru dari file local.\n"
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LIST list dari direktori yang diabaikan.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent jangan merambah direktori atasnya.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, adalah sebuah non-interaktif network retriever.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Kata sandi untuk pengguna %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Kata sandi: "
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "cannot create pipe"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Kata sandi untuk pengguna %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokal: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilasi: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Sambungkan: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s dibuat di %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (lingkungan)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (pengguna)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistem)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Hak Cipta (C) 2011 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Lisensi GPLv3+: GNU GPL versi 3 atau lebih\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Ini adalah free software; Anda bebas untuk mengubah dan "
+"mendistribusikannya.\n"
+"Tidak ada GARANSI, selama masih diijinkan oleh hukum yang berlaku.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Originalnya ditulis oleh Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Mohon kirimkan laporan kesalahan dan pertanyaan ke <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Memory allocation problem\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Exiting due to error in %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Coba `%s --help' untuk informasi lebih lanjut.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: illegal pilihan -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+
+#: src/main.c:1608
+#, fuzzy, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Tidak dapat verbose dan quiet pada waktu bersamaan.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Tidak dapat timestamp dan tidak menclobber file lama pada waktu bersamaan.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Tidak dapat menspesifikasikan berdua --inet4-only dan --inet6-only.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Tidak dapat menspesifikasikan kedua duanya -k dan -O jika multiple URL "
+"diberikan, atau dalam kombinasi\n"
+"dengan -p atau -r. Lihat manual untuk informasi lebih details.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"PERINGATAN: mengkombinasikan -O dengan -r atau -p berarti bahwa semua yang\n"
+"akan diambil akan diletakan dalam sebuah berkas yang anda spesifikasikan.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"PERINGATAN: penandawaktu tidak berfungsi dengan pilihan -O. Lihat manual\n"
+"untuk informasi lebih lengkap.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC output does not work with --spider.\n"
+
+#: src/main.c:1721
+#, fuzzy, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC output does not work with --continue, --continue will be disabled.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC output does not work with --continue, --continue will be disabled.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Tidak dapat menspesifikasikan baik --ask-password dan --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: hilang URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Tidak dapat menspesifikasikan baik --post-data dan --post-file.\n"
+
+#: src/main.c:1841
+#, fuzzy, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Tidak dapat menspesifikasikan berdua --body-data dan --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Versi ini tidak mendukung untuk IRI\n"
+
+#: src/main.c:2003
+#, fuzzy, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k can be used together with -O only if outputting to a regular file.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"-k can be used together with -O only if outputting to a regular file.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Gagal untuk meng-unlink symlink %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: tidak dapat menemukan alamat dari %s\n"
+
+#: src/main.c:2060
+#, fuzzy, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "ERROR: Failed to open cert %s: (%d).\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Tidak ada URLs yang ditemukan dalam %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Tidak dapat menghapus %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"SELESAI --%s--\n"
+"Total wall clock time: %s\n"
+"Terambil: %d berkas, %s dalam %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Download quota dari %s TERLEWATI!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Proxy tunneling gagal: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Tidak dapat menghapus %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, fuzzy, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "ai_socktype tidak disupport"
+
+#: src/metalink.c:509
+#, fuzzy
+msgid "Could not open downloaded file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Tidak ada berkas seperti itu %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+#, fuzzy
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Could not open CDX file for output.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "Tidak ada sertifikat yang ditemukan\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Menghapus %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Melanjutkan di background.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Melanjutkan di background, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Keluaran akan ditulis ke %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() failed\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() failed\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Tidak dapat mencari driver socket yang berguna.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() failed. The socket could not be set as blocking.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: peringatan: %s token terlihat sebelum nama mesin lainnya\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: token tidak diketahui \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Penggunaan: %s NETRC [HOSTNAME]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: tidak dapat melihat statistik %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "PERINGATAN: menggunakan nilai random yang lemah.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Tidak dapat seed PRNG; pertimbangkan menggunakan --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL tidak valid %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Tidak dapat seed PRNG; pertimbangkan menggunakan --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+"%s: Tidak dapat memverifikasi sertifikat %s, yang diterbitkan oleh %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Tidak dapat untuk memverifikasi atoritas penerbit secara lokal.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Selft-signed sertifikat ditemukan.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Sertifikat yang diterbitkan tidak sah.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Sertifikat yang diterbikan telah expired.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: nama pengguna sertifikat\n"
+"\ttidak cocok dengan yang diberikan oleh hostname %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: nama pengguna sertifikat %s tidak cocok dengan yang diberikan oleh "
+"hostname %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: nama umum sertifikat tidak valid (berisi sebuah karakter KOSONG).\n"
+" Ini mungkin merupakan indikasi bahwa host bukan yang dimaksud\n"
+" (mungkin ini bukan %s sesungguhnya).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Untuk menghubungi %s secara tidak secure, gunakan `--no-check-certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ melewatkan %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Spesifikasi dot style %s tidak valid; membiarkan untuk tidak mengubahnya.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " %s lagi"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " dalam "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Tidak dapat memperoleh REALTIME clock frequency: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Menghapus %s karena ini seharusnya direject.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Tidak dapat membuka %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Menload file robot.txt; tolong hiraukan kesalahan.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Salah dalam parsing proxy URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Salah dalam proxy URL %s: Harus berupa HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d redirections exceeded.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Menyerah.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Mencoba lagi.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Tidak ditemukan link yang rusak.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Ditemukan %d link rusak.\n"
+"\n"
+msgstr[1] ""
+"Ditemukan %d link rusak.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Tidak ada kesalahan"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Skema tidak didukung %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Skema hilang"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Host name tidak valid"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Nomor port tidak baik"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "User name tidak valid"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Alamat numerik IPv6 tidak diselesaikan"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Pengalamatan IPv6 tidak disupport"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Alamat numerik IPv6 tidak valid"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "dukungan HTTPS tidak dikompilasi dalam versi ini"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Tidak lengkap atau tidak valid urutan multibyte ditemui\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Gagal untuk mengalokasikan memori yang mencukupi; kehabisan memori.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Gagal untuk mengalokasikan %ld bytes; kehabisan memori.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: penyangga teks terlalu besar (%ld bytes), membatalkan.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Melanjutkan di background, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Gagal untuk meng-unlink symlink %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "ERROR: Failed to open cert %s: (%d).\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Tidak dapat memperoleh cookie untuk %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "ERROR: Failed to open cert %s: (%d).\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Gagal untuk meng-unlink symlink %s: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Invalid regular expression %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Invalid regular expression %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Error menulis ke %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Error opening WARC file %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Error opening WARC file %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Error opening WARC file %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Error opening GZIP stream to WARC file.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Opening WARC file %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Error opening WARC file %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX file does not list original urls. (Missing column 'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX file does not list checksums. (Missing column 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX file does not list record ids. (Missing column 'u'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgstr[1] ""
+"Loaded %d records from CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Could not read CDX file %s for deduplication.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Could not open CDX file for output.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Tidak dapat menulis ke WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr "Found exact match in CDX file. Saving revisit record to WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Error sistem tidak diketahui"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Pengalamatan IPv6 tidak disupport"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Bad value for ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Resolusi nama untuk sementara gagal"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family not supported"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Memory allocation failure"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "No address associated with hostname"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Name or service not known"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname not supported for ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "Error sistem tidak diketahui"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argument buffer too small"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Processing request in progress"
+
+#~ msgid "Request canceled"
+#~ msgstr "Request canceled"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Request not canceled"
+
+#~ msgid "All requests done"
+#~ msgstr "All requests done"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrupted by a signal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parameter string not correctly encoded"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: pilihan '%s' adalah pilihan yang ambigu:"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: pilihan '--%s' tidak memperbolehkan sebuah argumen\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: pilihan '%c%s' tidak memperbolehkan sebuah argumen\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: pilihan '%s' membutuhkan sebuah argumen\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: pilihan '--%s' tidak diketahui\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: pilihan '%c%s' tidak diketahui\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: pilihan -- '%c' tidak valid\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: pilihan membutuhkan sebuah argumen -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: pilihan '-W %s' adalah sebuah ambigu\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: pilihan '-W %s' tidak memperbolehkan sebuah argumen\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: pilihan '%s' membutuhkan sebuah argumen\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Sukses"
+
+#~ msgid "No match"
+#~ msgstr "Tidak cocok"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Invalid regular expression"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Karakter collation tidak valid"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nama kelas karakter tidak valid"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Tambahan backslash"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Referensi balik tidak valid"
+
+#~ msgid "Unmatched [ or [^"
+#~ msgstr "Tidak cocok [ atau [^"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Tidak cocok ( atau \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Tidak cocok \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Isi dari \\{\\} tidak valid"
+
+#~ msgid "Invalid range end"
+#~ msgstr "batas akhir tidak valid"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Kehabisan memori"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Awal ekspresi regular tidak valid"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Gagal di akhir dari ekspresi regular"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Ekspresi regular terlalu besar"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Tidak cocok ) atau \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Tidak ada ekspresi regular sebelumnya"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s subprocess failed"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle failed"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "cannot restore fd %d: dup2 failed"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s subprocess"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s subprocess got fatal signal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "kehabisan memori"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode gagal (%d):%s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s diterima.\n"
+
+#, fuzzy
+#~| msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr "Laporkan bug dan saran kepada <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "File `%s' sudah ada disana; tidak diambil.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Authorisasi gagal.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: pilihan illegal -- %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s dibuat di VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Saat ini dipelihara oleh Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "PERINGATAN: Tidak dapat membuka keluaran standar dalam mode binari;\n"
+#~ " berkas yang diunduh mungkin berisi akhir baris yang tidak "
+#~ "sesuai.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL prepends URL pada link relatif dalam file -F "
+#~ "-i.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Error dalam Set-Cookie, bagian `%s'"
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: Tidak valid extended boolean `%s';\n"
+#~ "gunakan salah satu dari `on', `off', `always', atau `newer'.\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr ""
+#~ " -Y, --proxy secara eksplisit menggunakan proxy.\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Program ini didistribusikan dengan harapan akan berguna,\n"
+#~ "TIDAK TERDAPAT GARANSI; bahkan untuk PENJUALAN atau \n"
+#~ "KESESUIAN UNTUK TUJUAN TERTENTU. Lihat GNU General Public Licence\n"
+#~ "untuk informasi selengkapnya.\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s: Verifikasi Certificate salah untuk %s: %s\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - Hubungan ditutup pada byte %s/%s. "
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644
index 0000000..b26de01
--- /dev/null
+++ b/po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/it.gmo b/po/it.gmo
new file mode 100644
index 0000000..d7e2722
--- /dev/null
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..181647c
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,3746 @@
+# Italian messages for wget.
+# Copyright (C) 1998, 2004, 2005, 2007, 2008, 2009, 2010, 2013, 2015, 2016, 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Marco Colombo <m.colombo@ed.ac.uk>, 2004, 2005, 2007, 2008, 2009, 2010, 2012.
+# Giovanni Bortolozzo <borto@dei.unipd.it>, 1998.
+# Milo Casagrande <milo@milo.name>, 2013, 2015, 2016, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-13 14:38+0200\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"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: impossibile risolvere l'indirizzo di bind %s; bind disabilitato.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Connessione a %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Connessione a %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Connessione a [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+"Chiamata setsockopt SO_RCVBUF non riuscita: %s\n"
+"\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "connesso.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "non riuscito: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: impossibile risolvere l'indirizzo dell'host %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+"Chiamata setsockopt SO_REUSEADDR non riuscita: %s\n"
+"\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Troppi descrittori di file aperti. Impossibile utilizzare select su un fd >= "
+"%d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Convertiti collegamenti in %d file in %s secondi.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Conversione collegamenti in %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "niente da fare.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Impossibile convertire i collegamenti in %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Impossibile rimuovere %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Impossibile fare il backup di %s in %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Impossibile ottenere il cookie per %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Errore di sintassi in Set-Cookie: %s alla posizione %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie proveniente da %s ha tentato di impostare il dominio a "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Impossibile aprire il file dei cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Errore scrivendo in %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Errore chiudendo %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Tipo di elencazione non gestito, si prova un parser di elencazioni Unix.\n"
+
+# FIXME: su o presso?
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indice della directory /%s su %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "data sconosciuta "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "File "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Directory "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Collegam. "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Incerto "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Lunghezza: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) rimanenti"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s rimanenti"
+
+# FIXME
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (non autorevole)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Impossibile inizializzare SSL, verrà disabilitato.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Accesso come utente %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ""
+"Errore nella risposta del server, chiusura della connessione di controllo.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Errore nel codice di benvenuto del server.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Scrittura non riuscita, chiusura della connessione di controllo.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Il server rifiuta l'accesso.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Accesso non corretto.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Accesso eseguito.\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Il server non ha accettato il comando \"PBSZ 0\".\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Il server non ha accettato il comando \"PROT %c\".\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Errore del server, impossibile determinare il tipo di sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "fatto. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "fatto.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo \"%c\" sconosciuto, chiusura della connessione di controllo.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "fatto. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD non necessario.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Raggiunta sezione logicamente impossibile in getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"La directory %s non esiste.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD non necessario.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Il file è già stato scaricato.\n"
+
+# GB: initiate = inizializzare
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Impossibile iniziare il trasferimento PASV.\n"
+
+# GB: parse = comprendere
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Impossibile analizzare la risposta PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "impossibile connettersi a %s porta %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Errore di bind (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT non valido.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST non riuscito, riavvio da capo.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Il file %s esiste.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Il file %s non esiste.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Il file %s non esiste.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Il file o la directory %s non esiste.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s è venuto in esistenza.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, chiusura della connessione di controllo.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Connessione dati: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Connessione di controllo chiusa.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Trasferimento dati interrotto.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Il file %s è già presente, non viene scaricato.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(tentativo:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scritto su stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvato [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Rimozione di %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Usato %s come file di elenco temporaneo.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s rimosso.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "La profondità di ricorsione %d eccede il massimo (%d).\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Il file remoto è più vecchio del file locale %s -- non viene scaricato.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Il file remoto è più recente del file locale %s -- scaricamento in corso.\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Le dimensioni non coincidono (locale %s) -- scaricamento in corso.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Il nome del collegamento simbolico non è valido, saltato.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Collegamento simbolico già esistente %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Creazione del collegamento simbolico %s → %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Collegamenti simbolici non gestiti, collegamento %s saltato.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Directory %s saltata.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tipo di file sconosciuto/non gestito.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr ""
+"Impossibile impostare i permessi per %s.\n"
+"\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: time-stamp danneggiato.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Le directory non verranno scaricate perché la loro profondità è %d (max "
+"%d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Non si discende nella directory %s perché è esclusa/non inclusa.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s rifiutato.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s rifiutato (voce non valida).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s è escluso/non incluso tramite regex.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Errore nella corrispondenza di %s con %s: %s.\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Nessun corrispondenza con il modello %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Indice in formato HTML scritto in %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Indice in formato HTML scritto in %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERRORE: Impossibile aprire la directory %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERRORE: Impossibile aprire il certificato %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr ""
+"Caricato certificato CA \"%s\"\n"
+"\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERRORE: Impossibile caricare il file CRL \"%s\": (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Caricato il file CRL \"%s\"\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ERRORE: GnuTLS richiede che la chiave e la certificazione siano dello stesso "
+"tipo.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+"La versione installata di GnuTLS è troppo vecchia per supportare TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: valore %u dell'opzione \"secure-protocol\" non implementata\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Segnalare questo problema a bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: valore %d dell'opzione \"secure-protocol\" non implementata\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: impossibile impostare la priorità direttamente. Viene usata la "
+"priorità predefinita.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERRORE"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVVERTIMENTO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: nessun certificato presentato da %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: il certificato di %s non è fidato.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: il certificato di %s non ha un emittente conosciuto.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Il certificato di %s è stato revocato.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: il firmatario del certificato %s non è una CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: il certificato di %s non è stato firmato con un algoritmo sicuro.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: il certificato di %s non è stato ancora attivato.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Il certificato di %s è scaduto.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Errore durante l'inizializzazione del certificato X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nessun certificato trovato\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Errore analizzando il certificato: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Il certificato non è ancora stato attivato\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Il certificato è scaduto\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+"Il proprietario del certificato non corrisponde al nome dell'host %s.\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "La chiave pubblica non corrisponde a quella selezionata.\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Il certificato deve essere X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Errore nel gestire l'elenco indirizzi.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Host sconosciuto"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Risoluzione del nome temporaneamente non riuscita"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Errore sconosciuto"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Risoluzione di %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "non riuscito: nessun indirizzo IPv4/IPv6 per l'host.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "non riuscito: tempo scaduto.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: impossibile risolvere il collegamento incompleto %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"Attributo no-follow trovato in %s: nessun collegamento in questa pagina "
+"verrà seguito\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL non valido %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Scrittura della richiesta HTTP non riuscita: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Nessuna intestazione, si assume HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Il file %s è già presente, non viene scaricato.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime non riuscita, potrebbe essere un bug.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Impossibile convertire la marcatura temporale nel formato http. Viene usato "
+"il tempo 0 come ultima data di modifica.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "File dati %s del BODY mancante: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Riutilizzo della connessione esistente a [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Riutilizzo della connessione esistente a %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Lettura della risposta del proxy non riuscita: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERRORE %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Riga di stato malformata"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunnel proxy non riuscito: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Schema di autenticazione sconosciuto.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autenticazione selezionata: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Salvataggio in: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Nello scaricare la firma:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Impossibile leggere il contenuto della firma dal file temporaneo, saltato.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Impossibile creare un file temporaneo: scaricamento firma saltato.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valore pri non valido, viene ipotizzato %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Impossibile trovare un digest valido per le risorse Metalink.\n"
+"Verranno ignorate.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "SSL disabilitato a causa di errori.\n"
+
+# NdT: %s qui può essere HTTP
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Richiesta %s inviata, in attesa di risposta... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nessun dato ricevuto.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Errore di lettura nelle intestazioni (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(nessuna descrizione)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Posizione: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "non specificato"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [segue]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"File %s non modificato sul server, non viene scaricato.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Il server ha ignorato l'intestazione If-Modified-Since per il file %s.\n"
+"Aggiungere l'opzione --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Il file è già interamente scaricato; niente da fare.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Lunghezza: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorato"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Attenzione: i metacaratteri non sono supportati in HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Modalità spider abilitata. Controllare se il file remoto esiste.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Impossibile scrivere in %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Manca un attributo richiesto nello header ricevuto.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autenticazione nome utente/password non riuscita.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Impossibile scrivere nel file WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Impossibile scrivere nel file WARC temporaneo.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Impossibile stabilire una connessione SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Impossibile rimuovere %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERRORE: ridirezione (%d) senza posizione di destinazione.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Impossibile trovare dati Metalink nella risposta HTTP. Il file viene "
+"scaricato con HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Trovata intestazione Metalink: attivata la modalità Metalink.\n"
+
+# FIXME
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Il file remoto non esiste -- collegamento rotto!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Intestazione Last-modified mancante -- time-stamp disattivati.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Intestazione Last-modified non valido -- time-stamp ignorato.\n"
+
+# Perché "server file" e non "remote file"? C'è differenza?
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Il file del server è più vecchio del file locale %s -- non viene scaricato.\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Le dimensioni non coincidono (locale %s) -- scaricamento in corso.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Il file remoto è più recente, scaricamento in corso.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Il file remoto esiste e potrebbe contenere collegamenti ad altre risorse -- "
+"scaricamento in corso.\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Il file remoto esiste ma non contiene collegamenti -- non viene scaricato.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Il file remoto esiste e potrebbe contenere ulteriori collegamenti,\n"
+"ma la ricorsione è disabilitata -- non viene scaricato.\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "Il file remoto esiste.\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scritto su stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvato [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Connessione chiusa al byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Errore di lettura al byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Errore di lettura al byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Qualità di protezione \"%s\" non gestita.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritmo \"%s\" non supportato.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC punta a %s, a cui non è possibile accedere per via dell'errore: "
+"%s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: impossibile leggere %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: errore in %s alla riga %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: errore di sintassi in %s alla riga %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: comando sconosciuto %s in %s alla riga %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analisi del file wgetrc di sistema (env SYSTEM_WGETRC) non riuscita. "
+"Controllare\n"
+"\"%s\"\n"
+"o specificare un altro file utilizzando --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analisi del file wgetrc di sistema non riuscita. Controllare\n"
+"\"%s\"\n"
+"o specificare un altro file utilizzando --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Attenzione: il file wgetrc di sistema e quello personale puntano "
+"entrambi a %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: comando %s passato a --execute non valido\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: valore booleano %s non valido, usare \"on\" oppure \"off\".\n"
+
+# FIXME: boolean: booleano? logico?
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: %s non valido, usare \"on\", \"off\" oppure \"quiet\".\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: numero %s non valido.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s può essere usata solo una volta\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: valore di byte %s non valido\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: periodo di tempo %s non valido\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: periodo di tempo %s negativo\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass richiede una stringa o l'impostazione di una variabile d'ambiate "
+"come WGET_ASKPASS o SSH_ASKPASS.\n"
+"\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: valore %s non valido.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: intestazione %s non valida.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: intestazione WARC %s non valida.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: tipo di avanzamento %s non valido.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: restrizione %s non valida,\n"
+" usare [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Codifica %s non valida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Conversione da %s a %s non supportata\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Incontrata sequenza multibyte incompleta o non valida\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Codice di errore %d non gestito\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: locale non impostata\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode non riuscita (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Conversione in minuscolo non riuscita: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"L'output viene inviato su %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; registrazione disabilitata.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uso: %s [OPZIONI]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Gli argomenti obbligatori per le opzioni lunghe lo sono anche per quelle "
+"corte.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Avvio:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version Visualizza la versione ed esce\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help Stampa questo aiuto\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background Va in background dopo l'avvio\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMANDO Esegue COMANDO come se fosse scritto "
+"in\n"
+" \".wgetrc\"\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "File di registro e di input:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FILE Registra i messaggi su FILE\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FILE Accoda i messaggi su FILE\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug Stampa le informazioni di debug\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug Stampa le informazioni di debug "
+"Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet Silenzioso (nessun output)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose Prolisso (predefinito)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose Meno prolisso, ma non silenzioso\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIPO Banda in uscita definita come TIPO\n"
+" (può essere \"bits\")\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FILE Scarica gli URL trovati nel FILE locale "
+"o\n"
+" esterno\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --metalink-file Scarica gli URL trovati nel FILE "
+"metalink\n"
+" locale o esterno\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html Tratta il file di input come HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL Risolve i collegamenti nel file HTML "
+"di\n"
+" input (-i -F) come relativi all'URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FILE Specifica il file di configurazione da\n"
+" usare\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config Non legge alcun file di configurazione\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FILE Registra i motivi per cui gli URL sono\n"
+" stati rifiutati su FILE\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Scaricamento:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMERO Imposta il NUMERO di tentativi\n"
+" (0 = illimitati)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused Riprova anche se la connessione è\n"
+" rifiutata\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERR Elenco separato da virgole di errori "
+"HTTP da\n"
+" riprovare\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=FILE Scrive i documenti su FILE\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber Non avvia lo scaricamento di file già\n"
+" esistenti (soprascrivendoli)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc Non ottiene le credenziali dal file ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue Riprende a scaricare un file "
+"parzialmente\n"
+" scaricato\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=OFFSET Avvia lo scaricamento alla posizione a\n"
+" base zero OFFSET\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TIPO Sceglie il TIPO di misurazione\n"
+" dell'avanzamento\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress Visualizza la barra di avanzamento in\n"
+" qualsiasi modo prolisso\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping Non scarica file più vecchi di quelli\n"
+" locali\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since Non usa richieste if-modified-since "
+"nella\n"
+" modalità timestamping\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps Non imposta l'orario del file locale "
+"con\n"
+" quello del server\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response Stampa la risposta del server\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider Non scarica niente\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDI Imposta tutti i timeout a SECONDI\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=INDIRIZZI Elenco di server DNS da interrogare\n"
+" (separati da virgole)\n"
+"\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=INDIRIZZO Lega il risolutore DNS a INDIRIZZO\n"
+" (nome host o IP) all'host locale\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECONDI Imposta il timeout per la risoluzione "
+"del\n"
+" DNS a SECONDI\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECONDI Imposta il timeout di connessione a\n"
+" SECONDI\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECONDI Imposta il timeout di lettura a "
+"SECONDI\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SECONDI Aspetta SECONDI tra i vari "
+"scaricamenti\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECONDI Aspetta 1...SECONDI tra i tentativi di\n"
+" scaricamento\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait Aspetta 0.5*ATTESA...1.5*ATTESA "
+"secondi\n"
+" tra gli scaricamenti\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy Disattiva esplicitamente l'uso del "
+"proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NUMERO Imposta la quota di scaricamento a "
+"NUMERO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=INDIRIZZO Lega INDIRIZZO (nome host o IP) "
+"all'host\n"
+" locale\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=VELOCITÀ Limita la velocità di scaricamento a\n"
+" VELOCITÀ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache Disattiva la cache di risoluzione del "
+"DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=SO Limita i caratteri nei nomi dei file a\n"
+" quelli permessi dal sistema operativo "
+"SO\n"
+" indicato\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case Ignora maiuscole/minuscole in file e\n"
+" directory\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+" -4, --inet4-only Si connette solo a indirizzi IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+" -6, --inet6-only Si connette solo a indirizzi IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMIGLIA Si connette prima agli indirizzi della\n"
+" FAMIGLIA specificata (IPv6, IPv4 o "
+"none)\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UTENTE Imposta il nome utente ftp e http a "
+"UTENTE\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PASSWORD Imposta la password ftp e http a "
+"PASSWORD\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password Chiede la password\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMANDO Definisce il gestore delle credenziali "
+"per\n"
+" la richiesta di nome utente e "
+"password;\n"
+" se non viene specificato COMANDO, "
+"viene\n"
+" usata la variabile d'ambiente "
+"WGET_ASKPASS\n"
+" o SSH_ASKPASS\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri Disattiva la gestione di IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=COD Usa COD come codifica locale per gli "
+"IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=COD Usa COD come codifica remota "
+"predefinita\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink Rimuove il file prima di sovrascrivere\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash Mantiene i file anche se il codice di\n"
+" controllo non corrisponde\n"
+" (appende .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMERO NUMERO ordinale per i meta-url "
+"Metalink\n"
+" application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http Usa meta-dati Metalink dalle "
+"intestazioni\n"
+" nella risposta HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location Posizione preferita per le risorse\n"
+" Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr Abilita l'archiviazione dei metadati\n"
+" negli attributi estesi del file\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Directory:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories Non crea directory\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories Forza la creazione di directory\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories Non crea le directory host\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories Usa il nome del protocollo nelle "
+"directory\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFISSO Salva i file in PREFISSO/...\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NUMERO Ignora NUMERO componenti delle "
+"directory\n"
+" remote\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opzioni HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=UTENTE Imposta l'utente http a UTENTE\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-passwd=PASSWORD Imposta la password http a PASSWORD\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache Non permette la cache dei dati lato\n"
+" server\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NOME Modifica il nome della pagina "
+"predefinita\n"
+" (solitamente \"index.html\")\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension Salva i documenti HTML/CSS con\n"
+" l'estensione corretta\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length Ignora il campo Content-Length nelle\n"
+" intestazioni\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=STRINGA Inserisce STRINGA tra le intestazioni\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TIPO Sceglie la compressione, uno tra auto, "
+"gzip\n"
+" e none (predefinito: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect Numero massimo di ridirezioni per "
+"pagina\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UTENTE Imposta il nome utente per il proxy a\n"
+" UTENTE\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-passwd=PASSWORD Imposta la password per il proxy a\n"
+" PASSWORD\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL Include l'intestazione \"Referer: URL"
+"\"\n"
+" nella richiesta HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers Salva le intestazioni HTTP su file\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTE Si identifica come AGENTE invece che "
+"come\n"
+" Wget/VERSIONE\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive Disabilita l'HTTP keep-alive "
+"(connessioni\n"
+" persistenti)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies Non usa i cookie\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FILE Carica i cookie da FILE prima della\n"
+" sessione\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FILE Salva i cookie su FILE dopo la "
+"sessione\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies Carica e salva i cookie per la "
+"sessione\n"
+" (non permanenti)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRINGA Usa il metodo POST e spedisce STRINGA "
+"come\n"
+" dati\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FILE Usa il metodo POST e invia i contenuti "
+"del\n"
+" FILE\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=METODOHTTP Usa METODOHTTP nell'intestazione\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRINGA Invia STRINGA come dati, --method deve\n"
+" essere impostato\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FILE Invia i contenuti del FILE, --method "
+"deve\n"
+" essere impostato\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition Onora l'intestazione Content-"
+"Disposition\n"
+" quando vengono scelti nomi di file "
+"locali\n"
+" (SPERIMENTALE)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error Mostra i contenuti ricevuti quando si\n"
+" verificano errori lato server\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Invia informazioni di autenticazione "
+"Basic\n"
+" HTTP senza prima aspettare la "
+"richiesta\n"
+" dal server\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opzioni HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PROT Sceglie il protocollo sicuro; uno tra\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 e PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only Segue solo i collegamenti HTTPS sicuri\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate Non verifica il certificato del server\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FILE File certificato del client\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIPO Tipo di certificato del client, PEM o "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FILE File della chiave privata\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TIPO Tipo di chiave privata, PEM o DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FILE File con il bundle dei CA\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR Directory dov'è memorizzato l'elenco "
+"delle\n"
+" Autorità di Certificazione (CA)\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FILE File con il bundle dei CRL\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASH File di chiave pubblica (PEM/DER) o un\n"
+" qualsiasi numero di hash sha256 "
+"codificati\n"
+" in base64 preceduti da \"sha256//\" e\n"
+" separati da \";\" per verificare i "
+"nodi\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FILE File con dati casuali per "
+"inizializzare\n"
+" SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FILE File col nome del socket EGD con dati\n"
+" casuali\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Imposta la stringa di priorità (GnuTLS) "
+"o\n"
+" l'elenco di cifrari (OpenSSL). "
+"Utilizzare\n"
+" con attenzione: questa opzione scavala\n"
+" l'opzione --secure-protocol.\n"
+" Il formato e la sintassi della stringa\n"
+" dipendono dal motore SSL/TLS "
+"utilizzato.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opzioni HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts Disabilita HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file Percorso al database HSTS\n"
+" (soprascrive quello predefinito)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opzioni FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Usa il formato Stream_LF per i file "
+"FTP\n"
+" binari\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=UTENTE Imposta l'utente ftp a UTENTE\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASS Imposta la password ftp a PASS\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing Non elimina i file \".listing\"\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob Disabilita il \"globbing\" FTP sui nomi "
+"dei\n"
+" file\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp Disabilita la modalità di "
+"trasferimento\n"
+" passiva\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions Preserva i permessi remoti dei file\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks Scarica i file (non le directory) "
+"puntati\n"
+" dai collegamenti simbolici quando in\n"
+" modalità ricorsiva\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opzioni FTP:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit Usa FTPS implicito\n"
+" (porta predefinita a 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl Ripristina la sessione SSL/TLS avviata\n"
+" nella connessione di controllo quando\n"
+" viene aperta una connessione dati\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection Cifra solamente il canale di "
+"controllo,\n"
+" tutti i dati saranno in chiaro\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp Usa FTP se FTPS non è supportato dal\n"
+" server\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opzioni WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILENAME Salva i dati richiesta/risposta in un "
+"file\n"
+" .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=STRINGA Inserisce STRINGA nel record warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMERO Imposta la dimensione massima dei file\n"
+" WARC a NUMERO\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx Scrive file indice CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=NOMEFILE Non archivia i record elencati nel "
+"file\n"
+" CDX specificato\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression Non comprime i file WARC con GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests Non calcola i digest SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log Non archivia il file di registro in un\n"
+" record WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTORY Posizione per il file temporanei "
+"creati\n"
+" dal processo di scrittura WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Scaricamento ricorsivo:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive Scaricamento ricorsivo\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMERO Profondità massima di ricorsione\n"
+" (inf o 0 = illimitata)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after Elimina localmente i file dopo averli\n"
+" scaricati\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links Punta i collegamenti nei file HTML o "
+"CSS a\n"
+" file locali\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only Converte solo la parte del file degli\n"
+" URL (nota anche come basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N Prima di salvare il file X, torna a N\n"
+" backup precedenti\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted Salva il file X come X_orig prima di\n"
+" convertirlo\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted Salva il file X come X.orig prima di\n"
+" convertirlo\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror Scorciatoia per:\n"
+" -N -r -l inf --no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites Scarica tutte le immagini, ecc...\n"
+" necessarie per visualizzare la pagina "
+"HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments Tratta i commenti HTML in modalità "
+"strict\n"
+" (SGML)\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Accetto/Rifiuto ricorsivo:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=ELENCO Elenco separato da virgole di "
+"estensioni\n"
+" accettate\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=ELENCO Elenco separato da virgole di "
+"estensioni\n"
+" rifiutate\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX Espressione regolare per gli URL da\n"
+" accettare\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX Espressione regolare per gli URL da\n"
+" rifiutare\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TIPO Tipo di espressione regolare\n"
+" (posix o pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TIPO Tipo di espressione regolare (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=ELENCO Elenco separato da virgole di domini\n"
+" accettati\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=ELENCO Elenco separato da virgole di domini\n"
+" rifiutati\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp Segue i collegamenti FTP dai documenti\n"
+" HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=ELENCO Elenco separato da virgole di tag HTML "
+"che\n"
+" vengono seguiti\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=ELENCO Elenco separato da virgole di tag HTML "
+"che\n"
+" vengono ignorati\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts Visita anche altri host quando in "
+"modalità\n"
+" ricorsiva\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative Segue solo i collegamenti relativi\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=ELENCO Elenco di directory consentite\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names Usa il nome indicato dall'ultimo\n"
+" componente dell'URL di re-direzione\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=ELENCO Elenco di directory non consentite\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent Non risale alla directory superiore\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Inviare segnalazioni di errori, domande o discussioni a <bug-wget@gnu.org>\n"
+"oppure aprire una segnalazioni di errore presso https://savannah.gnu.org/"
+"bugs/?func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+"GNU Wget %s, un programma non interattivo per scaricare file dalla rete.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Password per l'utente %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Password: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Impossibile creare la pipe\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Errore nell'inizializzare le azioni di spawn del file per use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Errore nell'impostare le azioni di spawn del file per use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Errore nel leggere la risposta dal comando \"%s %s\": %s\\\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Nome utente per \"%s%s\": "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Password per \"%s%s@%s\": "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compilazione: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Collegamento: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s compilato su %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (utente)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licenza GPLv3+: GNU GPL versione 3 o successiva\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Questo è software libero: siete liberi di modificarlo e redistribuirlo.\n"
+"Non c'è ALCUNA GARANZIA, negli estremi permessi dalla legge.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Scritto da Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Inviare segnalazioni di bug e suggerimenti a <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problema di allocazione di memoria\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Uscita causata dall'errore in %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Usare \"%s --help\" per ulteriori opzioni.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: opzione illecita -- \"-n%c\"\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Supporto al debug non attivato, --debug verrà ignorato.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Specificati sia --no-clobber che --convert-links, solo --convert-links verrà "
+"usato.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Specificati sia --no-clobber che --convert-links, solo --convert-file-only "
+"verrà usato.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Impossibile essere prolisso e silenzioso allo stesso tempo.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Impossibile registrare le date senza allo stesso tempo modificare i file.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Impossibile specificare --inet4-only e --inet6-only simultaneamente.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Impossibile specificare -k o --convert-file-only e -O simultaneamente se "
+"sono\n"
+"forniti URL multipli o in combinazione con -p o -r. Consultare il manuale "
+"per\n"
+"maggiori dettagli.\n"
+"\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ATTENZIONE: l'uso di -O con -r o -p fa sì che tutto ciò che viene scaricato\n"
+"verrà messo nel singolo file specificato.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ATTENZIONE: non è possibile registrare la data dei file in combinazione con -"
+"O.\n"
+"Consultare il manuale per maggiori dettagli.\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"L'output WARC non funziona con --no-clobber: --no-clobber verrà "
+"disabilitata.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"L'output WARC non funziona con la registrazione delle date: verrà "
+"disabilitata.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "L'output WARC non funziona con --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"L'output WARC non funziona con --continue o --start-pos: verranno "
+"disabilitati.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"I digest sono disabilitati: la de-duplicazione WARC non rileverà record "
+"duplicati.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"La compressione non funziona con --continue o --start-pos: verranno "
+"disabilitati.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Impossibile specificare --ask-password e --password simultaneamente.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Specificare sia --start-pos che --continue non è consigliato: --continue "
+"verrà disabilitato.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL mancante\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Impossibile specificare --post-data e --post-file simultaneamente.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Impossibile usare --post-data o --post-file assieme a --method. --method "
+"richiede i dati tramite le opzioni --body-data e --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"È necessario specificare attraverso --method=HTTPMethod un metodo da "
+"utilizzare con --body-data o --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Impossibile specificare --body-data e --body-file simultaneamente.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Questa versione non gestisce gli IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k o -r può essere usato con -O solo in scrittura su un file regolare.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links o --convert-file-only possono essere usati assieme solo in "
+"scrittura su un file regolare.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+"Inizializzazione di libcares non riuscita\n"
+"\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Inizializzazione del canale c-ares non riuscita\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+"Analisi dell'indirizzo IP \"%s\" non riuscita\n"
+"\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+"Impostazione non riuscita del server DNS \"%s\" (%d)\n"
+"\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nessun URL trovato in %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Impossibile analizzare il file metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Impossibile scaricare tutte le risorse da %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"TERMINATO --%s--\n"
+"Tempo totale: %s\n"
+"Scaricati: %d file, %s in %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Quota di scaricamento di %s SUPERATA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O non supportato per scaricare metalink, verrà ignorato.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "File Metalink pianificato: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "File Metalink sicuro: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "File Metalink rifiutato: nome utente non sicuro.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Elaborazione metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "File metaurl %s rifiutato: nome utente non sicuro.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+"Scaricamento di %s non riuscito: metaurl ignorato.\n"
+"\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Impossibile analizzare il file metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Elaborazione metaurl terminata con un errore.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Risorsa di tipo %s non supportata, verrà ignorata...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Impossibile aprire il file scaricato.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+"Calcolo dimensione per %s\n"
+"\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+"Dimensione file non dichiarata: controllo ignorato.\n"
+"\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+"Impossibile ottenere la dimensione del file scaricato.\n"
+"\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+"La dimensione del file %s non corrisponde.\n"
+"\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "La dimensione corrisponde.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Calcolo checksum per %s in corso\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Il checksum corrisponde.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Il checksum del file %s non corrisponde.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Impossibile aprire il file scaricato per la verifica della firma.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mm: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Verifica della firma effettuata con successo.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Firma non valida: risorsa rifiutata.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "I dati corrispondono alla firma, ma la firma non è affidabile.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Nessun codice di controllo trovato.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Scaricamento di %s non riuscito, la risorsa verrà ignorata.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Recuperato il file %s, ma la dimensione non corrisponde.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Recuperato il file %s, ma il checksum non corrisponde.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Recuperato il file %s, ma la firma non corrisponde.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s viene rinominato in %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Prosecuzione in background.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Prosecuzione in background, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "L'output sarà scritto su %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() non riuscita\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() non riuscita\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: impossibile trovare un driver per i socket utilizzabile.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() non riuscita. Il socket non può essere impostato come bloccante.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: attenzione: %s appare prima di un nome di macchina\n"
+
+# token: termine?
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: termine \"%s\" sconosciuto\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uso: %s NETRC [HOSTNAME]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: stat di %s non riuscita: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "ATTENZIONE: si sta usando un seme casuale debole.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Impossibile inizializzare PRNG; considerare l'utilizzo di --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+"La versione installata di OpenSSL è troppo vecchia per supportare TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+"La versione installata di OpenSSL è troppo vecchia per supportare TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+"La versione installata di OpenSSL è troppo vecchia per supportare TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: valore %d dell'opzione \"secure-protocol\" non implementata\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: elenco cifrari non valido: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: impostazione confidenza a catena parziale non riuscita\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: allocazione parametro di verifica non riuscita\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"Attenzione: impossibile inizializzare PRNG; considerare l'utilizzo di --"
+"random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: impossibile verificare il certificato di %s, rilasciato da %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Impossibile verificare localmente l'autorità dell'emittente.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Trovato certificato auto-firmato.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Il certificato rilasciato non è ancora valido.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Il certificato rilasciato è scaduto.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: nessuno dei nomi alternativi indicati nel certificato corresponde al\n"
+" nome dell'host richiesto %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: il nome comune di certificato %s non corrisponde al nome dell'host\n"
+" richiesto %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: il nome comune di certificato non è valido (contiene un carattere "
+"NUL).\n"
+" Questo può indicare che l'host non è chi si dichiara di essere\n"
+" (cioè non è il vero %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Per connettersi a %s in modo non sicuro, usare \"--no-check-certificate\".\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ %sK ignorato ]"
+
+# Da man wget:
+# Use --progress=dot to switch to the ``dot'' display. It traces the
+# retrieval by printing dots on the screen, each dot representing a
+# fixed amount of downloaded data.
+#
+# When using the dotted retrieval, you may also set the style by
+# specifying the type as dot:style.
+#
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Stile di progresso %s non valido; lasciato invariato.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " prev %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " in "
+
+# FIXME
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Impossibile ottenere la frequenza di clock REALTIME: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Rimozione di %s poiché deve essere rifiutato.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossibile aprire %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Caricamento di robots.txt; ignorare eventuali errori.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Errore analizzando l'URL del proxy %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Errore nell'URL del proxy %s: deve essere HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "superate %d ridirezioni.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Rinuncio.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Altro tentativo in corso.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Nessun collegamento rotto trovato.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] "Trovato %d collegamento rotto.\n"
+msgstr[1] "Trovati %d collegamenti rotti.\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Nessun errore"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Schema %s non gestito"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schema mancante"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nome dell'host non valido"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Numero di porta non valido"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nome utente non valido"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Indirizzo numerico IPv6 non terminato"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Indirizzo IPv6 non supportato"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Indirizzo numerico IPv6 non valido"
+
+# FIXME
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Gestione di HTTPS non compilata"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Incontrata sequenza multibyte non convertibile\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: allocazione di memoria non riuscita; memoria esaurita.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: allocazione di %ld byte non riuscita; memoria esaurita.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: buffer di testo troppo grande (%d byte), interruzione.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Prosecuzione in background, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Rimozione del collegamento simbolico %s non riuscita: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Esecuzione di Fopen su %s non riuscita\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Recupero FD del file %s non riuscito\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Esecuzione di stat sul file %s non riuscita, controllare i permessi\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Il file %s è stato modificato dall'ultimo controllo. Controllo di sicurezza "
+"non riuscito.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Apertura del file %s non riuscita, motivo: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Esecuzione di stat sul file %s non riuscita, errore: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Tentativo di apertura del file %s, ma è stato modificato dall'ultimo "
+"controllo. Controllo di sicurezza non riuscito.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Espressione regolare %s non valida, errore PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Espressione regolare %s non valida, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Errore cercando la corrispondenza %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Chiave con dimensione errata saltata (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Errore nell'impostare la posizione del file WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Errore nell'eseguire il flush del file WARC su disco.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Errore nel duplicare il descrittore file del file WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Errore nell'aprire lo stream GZIP verso il file WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Errore nello scrivere il record warcinfo sul file WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Apertura file WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Errore nell'aprire il file WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Il file CDX non riporta gli URL originali (colonna \"a\" mancante).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Il file CDX non riporta i checksum (colonna \"k\" mancante).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Il file CDX non riporta gli ID dei record (colonna \"u\" mancante).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] "Caricato %d record da CDX.\n"
+msgstr[1] "Caricati %d record da CDX.\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Impossibile leggere il file CDX %s per de-duplicazione.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Impossibile aprire il file manifest WARC temporaneo.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Impossibile aprire il file di registro WARC temporaneo.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Impossibile aprire il file WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Impossibile aprire il file CDX per l'output.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Impossibile aprire il file WARC temporaneo.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Trovata corrispondenza esatta nel file CDX. Salvataggio record su WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Errore di sistema sconosciuto"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Famiglia indirizzo del nome host non supportata"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Valore errato per ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Errore irreversibile nella risoluzione del nome"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family non supportata"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Errore di allocazione di memoria"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Nessun indirizzo associato col nome host"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nome o servizio sconosciuto"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Nome server non supportato per ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype non supportato"
+
+#~ msgid "System error"
+#~ msgstr "Errore di sistema"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Parametro buffer troppo piccolo"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Elaborazione richiesta in corso"
+
+#~ msgid "Request canceled"
+#~ msgstr "Richiesta annullata"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Richiesta non annullata"
+
+#~ msgid "All requests done"
+#~ msgstr "Tutte le richieste eseguite"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrotto da un segnale"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Stringa del parametro non codificata correttamente"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: l'opzione \"%s%s\" è ambigua\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: l'opzione \"%s%s\" è ambigua; possibilità:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: opzione \"%s%s\" non riconosciuta\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: l'opzione \"%s%s\" non accetta argomenti\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: l'opzione \"%s%s\" richiede un argomento\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opzione non valida -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: l'opzione richiede un argomento -- %c\n"
+
+#~ msgid "`"
+#~ msgstr "\""
+
+#~ msgid "'"
+#~ msgstr "\""
+
+#~ msgid "Success"
+#~ msgstr "Successo"
+
+#~ msgid "No match"
+#~ msgstr "Nessuna corrispondenza"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Espressione regolare non valida"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Carattere di collazione non valido"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nome classe del carattere non valido"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Backslash finale"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Riferimento all'indietro non valido"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^. [:, [. o [= senza corrispondenza"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( o \\( senza corrispondenza"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ senza corrispondenza"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Contenuto di \\{\\} non valido"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Limite massimo non valido"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memoria esaurita"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Espressione regolare precedente non valida"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Fine prematura dell'espressione regolare"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Espressione regolare troppo grande"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") o \\) senza corrispondenza"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Nessuna espressione regolare precedente"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "impossibile creare la pipe"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "sotto-processo %s non riuscito"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle non riuscita"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "impossibile ripristinare fd %d: dup2 non riuscita"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "sotto-processo %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "il sotto-processo %s ha ricevuto il segnale %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "memoria esaurita"
diff --git a/po/ja.gmo b/po/ja.gmo
new file mode 100644
index 0000000..b17354c
--- /dev/null
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..09c33c3
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,3571 @@
+# Japanese messages for GNU Wget.
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Originally translated by Penguin Kun <penguin-kun@geocities.com>, 1998
+# Hiroshi Takekawa <sian@big.or.jp>, <sian.ht@gmail.com>, 2000, 2019, 2020
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 18:43+0900\n"
+"Last-Translator: Hiroshi Takekawa <sian@big.or.jp>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=0;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: ãƒã‚¤ãƒ³ãƒ‰ã—よã†ã¨ã—ãŸã‚¢ãƒ‰ãƒ¬ã‚¹ %s を解決ã§ãã¾ã›ã‚“ã§ã—ãŸ; ãƒã‚¤ãƒ³ãƒ‰ã‚’ç¦æ­¢ã—"
+"ã¾ã™ã€‚\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "%s|%s|:%d ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "%s:%d ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "[%s]:%d ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "接続ã—ã¾ã—ãŸã€‚\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "失敗ã—ã¾ã—ãŸ: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: ホストアドレス %s を解決ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"オープンã—ã¦ã„るファイルディスクリプタãŒå¤šéŽãŽã¾ã™ã€‚%d 個以上㮠fd ã« "
+"select() ãŒä½¿ãˆã¾ã›ã‚“。\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒªãƒ³ã‚¯ã‚’ %s 秒ã§å¤‰æ›ã—ã¾ã—ãŸã€‚\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "%s ã®ãƒªãƒ³ã‚¯ã‚’変æ›ã—ã¦ã„ã¾ã™... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ãªã«ã‚‚ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "%s 中ã®ãƒªãƒ³ã‚¯ã‚’変æ›ã§ãã¾ã›ã‚“: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "%s ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "%s ã‚’ %s ã¨ã—ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ãã¾ã›ã‚“: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "%s ã®ã‚¯ãƒƒã‚­ãƒ¼ãŒå–å¾—ã§ãã¾ã›ã‚“\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Set-Cookie: %s ã®ä½ç½® %d ã«ã¯æ–‡æ³•ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "%s ã‹ã‚‰ã®ã‚¯ãƒƒã‚­ãƒ¼ãŒãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’次ã®ã‚ˆã†ã«è¨­å®šã—よã†ã¨ã—ã¾ã—ãŸã€‚"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "クッキーファイル %s ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "%s ã¸æ›¸ãè¾¼ã‚ã¾ã›ã‚“: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "%s ã‚’é–‰ã˜ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„リスト形å¼ã§ã™ã€UNIXå½¢å¼ã¨è¦‹ã¦è§£é‡ˆã—ã¦ã¿ã¾ã™ã€‚\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s (%s:%d 上)ã®è¦‹å‡ºã—(index)ã§ã™"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "時間ãŒä¸æ˜Žã§ã™ "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "ファイル "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "ディレクトリ "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "リンク "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "ä¸ç¢ºå®Ÿ "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s ãƒã‚¤ãƒˆ)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "é•·ã•: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) 残ã£ã¦ã„ã¾ã™"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s 残ã£ã¦ã„ã¾ã™"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (確証ã¯ã‚ã‚Šã¾ã›ã‚“)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚SSL を無効ã«ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "%s ã¨ã—ã¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã™... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "サーãƒã®å¿œç­”ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹ã®ã§ã€æŽ¥ç¶šã‚’終了ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "サーãƒã®åˆæœŸå¿œç­”ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "書ãè¾¼ã¿ã«å¤±æ•—ã—ãŸã®ã§ã€æŽ¥ç¶šã‚’終了ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "サーãƒãŒãƒ­ã‚°ã‚¤ãƒ³ã‚’æ‹’å¦ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "ログインã—ã¾ã—ãŸ!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "サーãƒãŒ 'PBSZ 0' コマンドをå—ã‘ã„ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "サーãƒãŒ 'PROT %c' コマンドをå—ã‘ã„ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "サーãƒã‚¨ãƒ©ãƒ¼ã§ã€ã‚·ã‚¹ãƒ†ãƒ ãŒãªã«ã‹åˆ¤åˆ¥ã§ãã¾ã›ã‚“。\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "完了ã—ã¾ã—ãŸã€‚ "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "完了ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "`%c' ã¯ä¸æ˜Žãªç¨®é¡žãªã®ã§ã€æŽ¥ç¶šã‚’終了ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "完了ã—ã¾ã—ãŸã€‚ "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "getftp() ã§è«–ç†çš„ã«åˆ°é”ã—ãªã„ã¯ãšã®ã¨ã“ã‚ã«åˆ°é”ã—ã¾ã—ãŸ"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"%s ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "ファイルã¯ã™ã§ã«å–得済ã§ã™ã€‚\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "PASV転é€ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“。\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "PASVã®å¿œç­”を解æžã§ãã¾ã›ã‚“。\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "%s:%d ã¸æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "ãƒã‚¤ãƒ³ãƒ‰ã‚¨ãƒ©ãƒ¼ã§ã™ (%s)。\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "無効ãªãƒãƒ¼ãƒˆç•ªå·ã§ã™ã€‚\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"RESTã«å¤±æ•—ã—ã¾ã—ãŸã€æœ€åˆã‹ã‚‰å§‹ã‚ã¾ã™ã€‚\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "%s ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "%s ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"%s ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"%s ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s ãŒå­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %sã€æŽ¥ç¶šã‚’終了ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - データ接続: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "制御用ã®æŽ¥ç¶šã‚’切断ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "データ転é€ã‚’中断ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "ファイル %s ã¯ã™ã§ã«å­˜åœ¨ã™ã‚‹ã®ã§ã€å–å¾—ã—ã¾ã›ã‚“。\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(試行:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - stdout ã¸å‡ºåŠ›ã—ã¾ã—㟠%s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s ã¸ä¿å­˜çµ‚了 [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "%s を削除ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "リスト一時ファイル㫠%s を使用ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s を削除ã—ã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "å†å¸°ã™ã‚‹æ·±ã• %d ãŒæœ€å¤§å€¤ã‚’超éŽã—ã¦ã„ã¾ã™ã€‚æ·±ã•ã¯ %d ã§ã™ã€‚\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"サーãƒå´ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚ˆã‚Šãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ« %s ã®æ–¹ãŒæ–°ã—ã„ã‹åŒã˜ãªã®ã§å–å¾—ã—ã¾"
+"ã›ã‚“。\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"サーãƒå´ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–¹ãŒãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ« %s より新ã—ã„ã®ã§å–å¾—ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"サイズãŒåˆã‚ãªã„ã®ã§(ローカル㯠%s)ã€å–å¾—ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "ä¸æ­£ãªã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯åãªã®ã§ã€ã¨ã°ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"ã™ã§ã« %s -> %s ã¨ã„ã†æ­£ã—ã„シンボリックリンクãŒã‚ã‚Šã¾ã™\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "%s -> %s ã¨ã„ã†ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã—ã¦ã„ã¾ã™\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"シンボリックリンクã«å¯¾å¿œã—ã¦ã„ãªã„ã®ã§ã€ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ %s ã‚’ã¨ã°ã—ã¾"
+"ã™ã€‚\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ディレクトリ %s ã‚’ã¨ã°ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: ä¸æ˜Žãªã¾ãŸã¯å¯¾å¿œã—ã¦ã„ãªã„ファイルã®ç¨®é¡žã§ã™ã€‚\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "%s ã®ãƒ‘ーミッションãŒè¨­å®šã§ãã¾ã›ã‚“。\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: 日付ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "æ·±ã•ãŒ %d (最大 %d)ãªã®ã§ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’転é€ã—ã¾ã›ã‚“。\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "除外ã•ã‚Œã¦ã„ã‚‹ã‹å«ã¾ã‚Œã¦ã„ãªã„ã®ã§ %s ã«ç§»å‹•ã—ã¾ã›ã‚“。\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s を除外ã—ã¾ã™ã€‚\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s を除外ã—ã¾ã™ (ä¸æ­£ãªã‚¨ãƒ³ãƒˆãƒª)。\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s ã¯æ­£è¦è¡¨ç¾ã«ã‚ˆã‚Šé™¤å¤–ã•ã‚Œã¦ã„ã‚‹ã‹å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "%s 㯠%s ã«å¯¾ã—ã¦ãƒžãƒƒãƒã—ã¾ã›ã‚“ã§ã—ãŸ: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "パターン %s ã«é©åˆã™ã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "%s [%s]ã«HTML化ã•ã‚ŒãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’書ãã¾ã—ãŸã€‚\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "%s ã«HTML化ã•ã‚ŒãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’書ãã¾ã—ãŸã€‚\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "エラー:%s ã¨ã„ã†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ã‘ã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "エラー:%s ã¨ã„ã†è¨¼æ˜Žæ›¸ã‚’é–‹ã‘ã¾ã›ã‚“: (%d)\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "CA証明書 '%s' をロードã—ã¾ã—ãŸ\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "エラー:%s ã¨ã„ã†CRLファイルを開ã‘ã¾ã›ã‚“: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "CRL ファイル '%s' をロードã—ã¾ã—ãŸ\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "エラー: GnuTLS ã¯éµã¨è¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ãŒåŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "GnuTLS ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¦ TLSv1.3 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: 実装ã•ã‚Œã¦ã„ãªã„ 'secure-protocol' オプション値 %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "ã“ã®å•é¡Œã‚’ bug-wget@gnu.org ã«å ±å‘Šã—ã¦ãã ã•ã„\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: 実装ã•ã‚Œã¦ã„ãªã„ 'secure-protocol' オプション値 %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr "GnuTLS: 優先度を設定ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚デフォルトã®å„ªå…ˆåº¦ã«ã—ã¾ã™ã€‚\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "エラー"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "警告"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s ã‹ã‚‰è¨¼æ˜Žæ›¸ã®æ示ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã¯ä¿¡ç”¨ã•ã‚Œã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã®ç™ºè¡Œè€…ãŒä¸æ˜Žã§ã™ã€‚\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã¯å¤±åŠ¹ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã«ç½²åã—ã¦ã„ã‚‹ã®ãŒ CA ã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: %s ã®è¨¼æ˜Žæ›¸ã®ç½²åã«ä½¿ã‚ã‚Œã¦ã„るアルゴリズムãŒå®‰å…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã¯ã¾ã æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸ã¯å¤±åŠ¹ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "X509 証明書ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "証明書ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "証明書を解釈中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "証明書ã¯ã¾ã æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "証明書ã¯å¤±åŠ¹ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "証明書ã®æ‰€æœ‰è€…ã®åå‰ã¨ãƒ›ã‚¹ãƒˆå %s ãŒä¸€è‡´ã—ã¾ã›ã‚“\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "公開éµãŒå›ºå®šã—ãŸå…¬é–‹éµã¨ä¸€è‡´ã—ã¾ã›ã‚“!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "証明書㯠X.509 å½¢å¼ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "アドレスリストを処ç†ä¸­ã«ã‚¨ãƒ©ãƒ¼\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "ä¸æ˜Žãªãƒ›ã‚¹ãƒˆã§ã™"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "åå‰è§£æ±ºä¸­ã«ä¸€æ™‚çš„ãªå¤±æ•—ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "%s ã‚’DNSã«å•ã„ã‚ã‚ã›ã¦ã„ã¾ã™... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "失敗: ホスト㫠IPv4/IPv6 アドレスãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "失敗ã—ã¾ã—ãŸ: タイムアウト.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: ä¸å®Œå…¨ãªãƒªãƒ³ã‚¯ %s を解決ã§ãã¾ã›ã‚“。\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"no-follow 属性㌠%s ã«è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒªãƒ³ã‚¯ã¯ã‚‚ã†ãŸã©ã‚Šã¾ã›"
+"ん。\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: %s ã¯ç„¡åŠ¹ãª URL ã§ã™(%s)。\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "HTTP ã«ã‚ˆã‚‹æŽ¥ç¶šè¦æ±‚ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "ヘッダãŒãªã„ã®ã§ã€HTTP/0.9 ã ã¨ä»®å®šã—ã¾ã™"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"ファイル %s ã¯ã™ã§ã«å­˜åœ¨ã™ã‚‹ã®ã§ã€å–å¾—ã—ã¾ã›ã‚“。\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚ãŠãらããƒã‚°ã§ã™ã€‚\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"タイムスタンプを http å½¢å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“。0 を最終変更時間ã¨ã—ã¦ä½¿ã„ã¾"
+"ã™ã€‚\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY データファイル %s ãŒã‚ã‚Šã¾ã›ã‚“: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "[%s]:%d ã¸ã®æŽ¥ç¶šã‚’å†åˆ©ç”¨ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "%s:%d ã¸ã®æŽ¥ç¶šã‚’å†åˆ©ç”¨ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "プロクシã‹ã‚‰ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s エラー %d: %s。\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "奇妙ãªã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡Œã§ã™"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "プロクシã®ãƒˆãƒ³ãƒãƒªãƒ³ã‚°ã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "ä¸æ˜Žãªèªè¨¼å½¢å¼ã§ã™ã€‚\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "é¸æŠžã•ã‚ŒãŸèªè¨¼å½¢å¼: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "%s ã«ä¿å­˜ä¸­\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"ç½²åをダウンロード中ã«:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "一時ファイルã‹ã‚‰ç½²å情報ãŒèª­ã‚ã¾ã›ã‚“。飛ã°ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "一時ファイルãŒä½œã‚Œã¾ã›ã‚“。署åã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’飛ã°ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "無効㪠pri 値ã§ã™ã€‚%d を用ã„ã¾ã™ã€‚\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"メタリンクリソースã«å¯¾ã—ã¦è¨±å®¹ã§ãるダイジェストãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+"無視ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "エラーãŒç™ºç”Ÿã—ãŸã®ã§ SSL を無効ã«ã—ã¾ã™\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s ã«ã‚ˆã‚‹æŽ¥ç¶šè¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸã€å¿œç­”ã‚’å¾…ã£ã¦ã„ã¾ã™... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "データãŒå—ä¿¡ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "ヘッダ内ã§èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼(%s)ã§ã™\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(説明ãªã—)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "場所: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "特定ã§ãã¾ã›ã‚“"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [続ã]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"ファイル %s ã¯ã‚µãƒ¼ãƒå´ã§å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚ダウンロードをçœç•¥ã—ã¾"
+"ã™ã€‚\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"サーãƒãŒãƒ•ã‚¡ã‚¤ãƒ« %s ã«å¯¾ã™ã‚‹ If-Modified-Since ヘッダを無視ã—ã¾ã—ãŸã€‚\n"
+"--no-if-modified-since オプションを付ã‘ã‚‹ã¨ã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«å…¨éƒ¨å–å¾—ã—ãŠã‚ã£ã¦ã„ã¾ã™ã€‚何もã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "é•·ã•: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "無視ã—ã¾ã—ãŸ"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "警告: HTTPã¯ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰ã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"スパイダーモードãŒæœ‰åŠ¹ã§ã™ã€‚リモートファイルãŒå­˜åœ¨ã—ã¦ã‚‹ã‹ç¢ºèªã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "%s ã¸æ›¸ãè¾¼ã‚ã¾ã›ã‚“(%s)。\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "å¿…è¦ãªã‚¢ãƒˆãƒªãƒ“ュートãŒå—ã‘ã¨ã£ãŸãƒ˜ãƒƒãƒ€ã«ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Username/Password ã«ã‚ˆã‚‹èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "WARC ファイルã¸æ›¸ãè¾¼ã‚ã¾ã›ã‚“。\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "一時 WARC ファイルã¸æ›¸ãè¾¼ã‚ã¾ã›ã‚“。\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "SSL ã«ã‚ˆã‚‹æŽ¥ç¶šãŒç¢ºç«‹ã§ãã¾ã›ã‚“。\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "%s を削除ã§ãã¾ã›ã‚“(%s)。\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "エラー: 場所ãŒå­˜åœ¨ã—ãªã„リダイレクション(%d)ã§ã™ã€‚\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"HTTP 応答ã«ãƒ¡ã‚¿ãƒªãƒ³ã‚¯æƒ…å ±ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚HTTP GET ã§ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾"
+"ã™ã€‚\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "メタリンクヘッダãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚メタリンクモードã«å¤‰æ›´ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "リモートファイルãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“ -- リンクãŒå£Šã‚Œã¦ã„ã¾ã™!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Last-modified ヘッダãŒã‚ã‚Šã¾ã›ã‚“ -- 日付を無効ã«ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Last-modified ヘッダãŒç„¡åŠ¹ã§ã™ -- 日付を無視ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"サーãƒå´ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚ˆã‚Šãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ« %s ã®æ–¹ãŒæ–°ã—ã„ã®ã§å–å¾—ã—ã¾ã›ã‚“。\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "大ãã•ãŒåˆã‚ãªã„ã®ã§(ローカル㯠%s)ã€è»¢é€ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "リモートファイルã®ã»ã†ãŒæ–°ã—ã„ã®ã§ã€è»¢é€ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"リモートファイルãŒå­˜åœ¨ã—ã€ä»–ã®ãƒªã‚½ãƒ¼ã‚¹ã¸ã®ãƒªãƒ³ã‚¯ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ -- å–å¾—"
+"中。\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"リモートファイルã¯å­˜åœ¨ã—ã¦ã„ã¾ã™ãŒã€ãƒªãƒ³ã‚¯ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“ -- å–å¾—ã—ã¾ã›"
+"ん。\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"リモートファイルãŒå­˜åœ¨ã—ã€ã•ã‚‰ãªã‚‹ãƒªãƒ³ã‚¯ã‚‚ã‚ã‚Šå¾—ã¾ã™ãŒã€å†å¸°ãŒç¦æ­¢ã•ã‚Œã¦ã„ã¾"
+"ã™ -- å–å¾—ã—ã¾ã›ã‚“。\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr "リモートファイルãŒå­˜åœ¨ã—ã¾ã™ã€‚\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - stdout ã¸å‡ºåŠ›å®Œäº† %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s ã¸ä¿å­˜å®Œäº† [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - %s ãƒã‚¤ãƒˆã§æŽ¥ç¶šãŒçµ‚了ã—ã¾ã—ãŸã€‚ "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - %s ãƒã‚¤ãƒˆã§èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠(%s)。"
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - %s/%s ãƒã‚¤ãƒˆã§èª­ã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠(%s)。 "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "'%s' ã¨ã„ã†ä¿è­·æ–¹å¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "'%s' ã¨ã„ã†ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC ㌠%s を指ã—ã¦ã„ã¾ã™ãŒ, 存在ã—ã¾ã›ã‚“: %s\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: %s (%s)を読ã¿è¾¼ã‚ã¾ã›ã‚“。\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: %s 内㮠%d è¡Œã§ã‚¨ãƒ©ãƒ¼ã§ã™\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: %s 内㮠%d è¡Œã§æ–‡æ³•ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: コマンド %s (%s ã® %d行目) ã¯ä¸æ˜Žã§ã™\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"システム㮠wgetrc ファイル(環境変数㯠SYSTEM_WGETRC)ã®è§£é‡ˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+"'%s'\n"
+"ã®å†…容を確èªã™ã‚‹ã‹ --config ã§åˆ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã—ã¦ãã ã•ã„。\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"システム㮠wgetrc ファイルã®è§£é‡ˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+"'%s'\n"
+"ã®å†…容を確èªã™ã‚‹ã‹ --config ã§åˆ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã—ã¦ãã ã•ã„。\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: 警告: システムã¨ãƒ¦ãƒ¼ã‚¶ã® wgetrc ã®ä¸¡æ–¹ãŒ %s を指定ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: 無効㪠--execute 指定 %s ã§ã™ã€‚\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: %s ã¯ãƒ–ール値ã¨ã—ã¦ç„¡åŠ¹ã§ã™ã€‚`on' ã‹ `off' を指定ã—ã¦ãã ã•ã„。\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: %s ã¯ç„¡åŠ¹ã§ã™ã€‚`on'ã€`off'ã€`quiet' ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„。\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªæ•°ã§ã™ã€‚\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s ã¯ä¸€åº¦ã ã‘使ã‚れるã¹ãã‚‚ã®ã§ã™\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªãƒã‚¤ãƒˆå€¤ã§ã™ã€‚\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªæ™‚é–“é–“éš”ã§ã™ã€‚\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: %s ã¯è² ã®æ™‚é–“é–“éš”ã§ã™ã€‚\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass ã¯æ–‡å­—列ãŒæ¸¡ã•ã‚Œã‚‹ã‹ã€ç’°å¢ƒå¤‰æ•° WGET_ASKPASS ã‹ SSH_ASKPASS ãŒè¨­å®š"
+"ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªå€¤ã§ã™ã€‚\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªãƒ˜ãƒƒãƒ€ã§ã™ã€‚\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãª WARC ヘッダã§ã™ã€‚\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: %s ã¯ç„¡åŠ¹ãªçµŒéŽè¡¨ç¤ºå½¢å¼ã§ã™ã€‚\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: %s ã¯ç„¡åŠ¹ãªåˆ¶ç´„ã§ã™ã€‚\n"
+" unix ã‹ vms ã‹ windowsã€lowercase ã‹ uppercaseã€nocontrol ã‚„ ascii を指定"
+"ã—ã¦ãã ã•ã„。\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "エンコード %s ã¯ç„¡åŠ¹ã§ã™\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "%s ã‹ã‚‰ %s ã¸ã®å¤‰æ›ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "ä¸å®Œå…¨ã‹ä¸æ­£ãªãƒžãƒ«ãƒãƒã‚¤ãƒˆæ–‡å­—列ã§ã™\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "処ç†ã•ã‚Œãªã„エラー (errno %d)\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: ロケールãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode ã«å¤±æ•—ã—ã¾ã—㟠(%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "å°æ–‡å­—ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s ã«å‡ºåŠ›ã‚’リダイレクトã—ã¾ã™ã€‚\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; ログå–ã‚Šã‚’ç¦æ­¢ã—ã¾ã™ã€‚\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "使ã„æ–¹: %s [オプション]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"é•·ã„オプションã§ä¸å¯æ¬ ãªå¼•æ•°ã¯çŸ­ã„オプションã§ã‚‚ä¸å¯æ¬ ã§ã™ã€‚\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "スタートアップ:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了ã™ã‚‹\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã™ã‚‹\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background スタート後ã«ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã«ç§»è¡Œã™ã‚‹\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=COMMAND `.wgetrc'å½¢å¼ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "ログã¨å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FILE ログを FILE ã«å‡ºåŠ›ã™ã‚‹\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FILE メッセージを FILE ã«è¿½è¨˜ã™ã‚‹\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug デãƒãƒƒã‚°æƒ…報を表示ã™ã‚‹\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug Watt-32デãƒãƒƒã‚°æƒ…報を表示ã™ã‚‹\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet 何も出力ã—ãªã„\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose 冗長ãªå‡ºåŠ›ã‚’ã™ã‚‹ (デフォルト)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -nv, --no-verbose 冗長ã§ã¯ãªãã™ã‚‹\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE 帯域幅を TYPE ã§å‡ºåŠ›ã—ã¾ã™ã€‚TYPE 㯠"
+"'bits' ãŒæŒ‡å®šã§ãã¾ã™ã€‚\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FILE FILE ã®ä¸­ã«æŒ‡å®šã•ã‚ŒãŸ URL をダウンロードã™"
+"ã‚‹\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FILE Metalink FILE ã«æ›¸ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダウン"
+"ロードã™ã‚‹\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html 入力ファイルを HTML ã¨ã—ã¦æ‰±ã†\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL HTML ã§å…¥åŠ›ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«(-i -F)ã®ãƒªãƒ³ã‚¯"
+"ã‚’\n"
+" 指定ã—㟠URL ã®ç›¸å¯¾ URL ã¨ã—ã¦æ‰±ã†\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FILE 設定ファイルを指定ã™ã‚‹\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config 設定ファイルを読ã¿ã“ã¾ãªã„\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FILE æ‹’å¦ã•ã‚ŒãŸç†ç”±ã‚’ログ FILE ã«ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "ダウンロード:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMBER リトライ回数ã®ä¸Šé™ã‚’指定 (0 ã¯ç„¡åˆ¶é™).\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr " --retry-connrefused 接続を拒å¦ã•ã‚Œã¦ã‚‚リトライã™ã‚‹\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERRORS コンマ区切りã§æŒ‡å®šã—ãŸHTTPã®ã‚¨ãƒ©ãƒ¼ã®å ´"
+"åˆãƒªãƒˆãƒ©ã‚¤ã™ã‚‹\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FILE FILE ã«æ–‡æ›¸ã‚’書ãã“ã‚€\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber 存在ã—ã¦ã„るファイルをダウンロードã§ä¸Šæ›¸ã"
+"ã—ãªã„\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-netrc .netrc ã‹ã‚‰èªè¨¼æƒ…報をå–å¾—ã—ãªã„\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue 部分的ã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ç¶šãã‹ã‚‰"
+"始ã‚ã‚‹\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr " --start-pos=OFFSET OFFSET ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’開始ã™ã‚‹\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYPE 進行表示ゲージã®ç¨®é¡žã‚’ TYPE ã«æŒ‡å®šã™ã‚‹\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress ã©ã®ãƒ¢ãƒ¼ãƒ‰ã§ã‚‚進æ—ãƒãƒ¼ã‚’表示ã™ã‚‹\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ローカルã«ã‚るファイルよりも新ã—ã„ファイル"
+"ã ã‘å–å¾—ã™ã‚‹\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since タイムスタンプモードã®æ™‚ã«ã€\n"
+" if-modified-since get リクエストを使ã‚ãª"
+"ã„\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ローカルå´ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã«\n"
+" サーãƒã®ã‚‚ã®ã‚’使ã‚ãªã„\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response サーãƒã®å¿œç­”を表示ã™ã‚‹\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider 何もダウンロードã—ãªã„\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDS å…¨ã¦ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’ SECONDS 秒ã«è¨­å®šã™"
+"ã‚‹\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADDRESSES åå‰ã®è§£æ±ºã«ä½¿ã†DNSサーãƒã®ãƒªã‚¹ãƒˆ (カンマ"
+"区切り)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADDRESS ローカルホストã®DNS resolverアドレスã¨ã—"
+"㦠ADDRESS (ホストåã‹ IP) を使ã†\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECS DNS å•ã„åˆã‚ã›ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’ SECS 秒ã«è¨­"
+"定ã™ã‚‹\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECS 接続タイムアウトを SECS 秒ã«è¨­å®šã™ã‚‹\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECS 読ã¿è¾¼ã¿ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’ SECS 秒ã«è¨­å®šã™ã‚‹\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SECONDS ダウンロード毎㫠SECONDS 秒待ã¤\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " --waitretry=SECONDS リトライ毎㫠1〜SECONDS 秒待ã¤\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait ダウンロード毎㫠0.5*WAIT〜1.5*WAIT 秒待"
+"ã¤\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy プロクシを使ã‚ãªã„\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NUMBER ダウンロードã™ã‚‹ãƒã‚¤ãƒˆæ•°ã®ä¸Šé™ã‚’指定ã™ã‚‹\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADDRESS ローカルアドレスã¨ã—㦠ADDRESS (ホストå"
+"ã‹ IP) を使ã†\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RATE ダウンロード速度を RATE ã«åˆ¶é™ã™ã‚‹\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache DNS ã®å•ã„åˆã‚ã›çµæžœã‚’キャッシュã—ãªã„\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS OS ãŒè¨±ã—ã¦ã„るファイルåã«åˆ¶é™ã™ã‚‹\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ファイルå/ディレクトリåã®æ¯”較ã§å¤§æ–‡å­—å°"
+"文字を無視ã™ã‚‹\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only IPv4 ã ã‘を使ã†\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only IPv6 ã ã‘を使ã†\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILY 指定ã—ãŸãƒ•ã‚¡ãƒŸãƒª(IPv6, IPv4, none)ã§æœ€åˆã«"
+"接続ã™ã‚‹\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr " --user=USER ftp, http ã®ãƒ¦ãƒ¼ã‚¶åを指定ã™ã‚‹\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=PASS ftp, http ã®ãƒ‘スワードを指定ã™ã‚‹\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password パスワードを別途入力ã™ã‚‹\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMMAND èªè¨¼æƒ…å ±(ユーザåã¨ãƒ‘スワード)ã‚’å–å¾—ã™ã‚‹ãƒ"
+"ンドラを指定ã—ã¾ã™ã€‚\n"
+" COMMAND ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã¯ã€\n"
+" 環境変数 WGET_ASKPASS ㋠SSH_ASKPASS "
+"ãŒ\n"
+" 使ã‚ã‚Œã¾ã™ã€‚\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri IRI サãƒãƒ¼ãƒˆã‚’使ã‚ãªã„\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC 指定ã—㟠ENC ã‚’ IRI ã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£"
+"ングã«ã™ã‚‹\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC 指定ã—㟠ENC をデフォルトã®ãƒªãƒ¢ãƒ¼ãƒˆã‚¨ãƒ³"
+"コーディングã«ã™ã‚‹\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink 上書ãã™ã‚‹å‰ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã™ã‚‹\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚‚"
+"(ファイルåã« .badhash を追加ã—ãŸä¸Šã§)ä¿æŒã—ã¾ã™ã€‚\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml ã® "
+"metaurl 番å·ã‚’ NUMBER ã«æŒ‡å®šã™ã‚‹\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http メタリンク情報を HTTP 応答ヘッダã‹ã‚‰å–å¾—ã™"
+"ã‚‹\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location メタリンクリソースã«å¯¾ã—ã¦è‰¯ã„場所をé¸æŠžã™"
+"ã‚‹\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr 拡張ファイル属性ã¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ä¿å­˜ã‚’有効ã«"
+"ã™ã‚‹\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "ディレクトリ:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ディレクトリを作らãªã„\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories ディレクトリを強制的ã«ä½œã‚‹\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ホストåã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作らãªã„\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories プロトコルåã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作る\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX ファイルを PREFIX/ 以下ã«ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NUMBER リモートディレクトリåã® NUMBER 階層分を無"
+"視ã™ã‚‹\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP オプション:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USER http ユーザåã¨ã—㦠USER を使ã†\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=PASS http パスワードã¨ã—㦠PASS を使ã†\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache サーãƒãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’許å¯ã—ãªã„\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME デフォルトã®ãƒšãƒ¼ã‚¸åã‚’ NAME ã«å¤‰æ›´ã—ã¾ã™\n"
+" 通常㯠`index.html' ã§ã™\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension HTML/CSS 文書ã¯é©åˆ‡ãªæ‹¡å¼µå­ã§ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length `Content-Length' ヘッダを無視ã™ã‚‹\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=STRING é€ä¿¡ã™ã‚‹ãƒ˜ãƒƒãƒ€ã« STRING を追加ã™ã‚‹\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYPE 圧縮アルゴリズムã®æŒ‡å®š: autoã‹gzipã‹"
+"none(デフォルトã¯none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr " --max-redirect ページã§è¨±å¯ã™ã‚‹æœ€å¤§è»¢é€å›žæ•°\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=USER プロクシユーザåã¨ã—㦠USER を使ã†\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PASS プロクシパスワードã¨ã—㦠PASS を使ã†\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr " --referer=URL Referer ã‚’ URL ã«è¨­å®šã™ã‚‹\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers HTTP ã®ãƒ˜ãƒƒãƒ€ã‚’ファイルã«ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT User-Agent ã¨ã—㦠Wget/VERSION ã§ã¯ãªã "
+"AGENT を使ã†\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive HTTP ã® keep-alive (æŒç¶šçš„接続) 機能を使ã‚"
+"ãªã„\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies クッキーを使ã‚ãªã„\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --load-cookies=FILE クッキーを FILE ã‹ã‚‰èª­ã¿ã“ã‚€\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=FILE クッキーを FILE ã«ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies セッションã ã‘ã§ç”¨ã„るクッキーをä¿æŒã™ã‚‹\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRING POST メソッドを用ã„㦠STRING ã‚’é€ä¿¡ã™ã‚‹\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FILE POST メソッドを用ã„㦠FILE ã®ä¸­å‘³ã‚’é€ä¿¡ã™"
+"ã‚‹\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod \"HTTPMethod\" をヘッダã®ãƒ¡ã‚½ãƒƒãƒ‰ã¨ã—ã¦ä½¿"
+"ã„ã¾ã™\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRING STRING をデータã¨ã—ã¦é€ã‚‹ã€‚--method を指定"
+"ã—ã¦ãã ã•ã„。\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FILE ファイルã®ä¸­å‘³ã‚’é€ã‚‹ã€‚--method を指定ã—ã¦"
+"ãã ã•ã„。\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition Content-Disposition ヘッダãŒã‚ã‚Œã°\n"
+" ローカルã®ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦ç”¨ã„ã‚‹ (実験"
+"çš„)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error サーãƒã‚¨ãƒ©ãƒ¼æ™‚ã«å—ä¿¡ã—ãŸå†…容を出力ã™ã‚‹\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge サーãƒã‹ã‚‰ã®ãƒãƒ£ãƒ¬ãƒ³ã‚¸ã‚’å¾…ãŸãšã«ã€\n"
+" Basicèªè¨¼ã®æƒ…報をé€ä¿¡ã—ã¾ã™ã€‚\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) オプション:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR セキュアプロトコルをé¸æŠžã™ã‚‹ (auto, "
+"SSLv2, SSLv3, TLSv1, TLSv1_1, TLSv1_2, PFS)\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only 安全㪠HTTPS ã®ãƒªãƒ³ã‚¯ã ã‘ãŸã©ã‚‹\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate サーãƒè¨¼æ˜Žæ›¸ã‚’検証ã—ãªã„\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=FILE クライアント証明書ã¨ã—㦠FILE を使ã†\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE クライアント証明書ã®ç¨®é¡žã‚’ TYPE (PEM, "
+"DER) ã«è¨­å®šã™ã‚‹\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FILE 秘密éµã¨ã—㦠FILE を使ã†\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYPE 秘密éµã®ç¨®é¡žã‚’ TYPE (PEM, DER) ã«è¨­å®šã™"
+"ã‚‹\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FILE CA 証明書ã¨ã—㦠FILE を使ã†\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR CA ã®ãƒãƒƒã‚·ãƒ¥ãƒªã‚¹ãƒˆãŒä¿æŒã•ã‚Œã¦ã„るディレ"
+"クトリを指定ã™ã‚‹\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FILE CRL ファイルを指定ã™ã‚‹\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASHES å…¬é–‹éµ (PEM/DER) ファイルã€ã‚‚ã—ãã¯ã€"
+"base64ã§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã—ãŸ\n"
+" sha256ãƒãƒƒã‚·ãƒ¥å€¤(sha256//ã§å§‹ã¾ã‚Šã‚»ãƒŸã‚³ãƒ­"
+"ン区切り)を指定ã—ã¦ã€\n"
+" 相手をèªè¨¼ã—ã¾ã™ã€‚\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FILE SSL PRNG ã®åˆæœŸåŒ–データã«ä½¿ã†ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指"
+"定ã™ã‚‹\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr " --egd-file=FILE EGD ソケットã¨ã—㦠FILE を使ã†\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR GnuTLSã®å„ªå…ˆåº¦ã‹OpenSSLã®æš—å·ãƒªã‚¹ãƒˆã‚’直接指定"
+"ã™ã‚‹\n"
+" 注æ„ã—ã¦ä½¿ã£ã¦ãã ã•ã„。--secure-protocol "
+"を上書ãã—ã¾ã™ã€‚\n"
+" フォーマットや文法㯠SSL/TLS 実装ã«ä¾å­˜ã—"
+"ã¾ã™ã€‚\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS オプション:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts HSTS を使ã‚ãªã„\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file HSTS データベースã®ãƒ‘ス (デフォルトを上書"
+"ã)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP オプション:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf ftp ã®å…¨ã¦ã®ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã§ Stream_LF "
+"フォーマットを用ã„ã¾ã™ã€‚\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=USER ftp ユーザã¨ã—㦠USER を使ã†\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PASS ftp パスワードã¨ã—㦠PASS を使ã†\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing `.listing' ファイルを削除ã—ãªã„\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob FTP ファイルåã®ã‚°ãƒ­ãƒ–を無効ã«ã™ã‚‹\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp \"passive\" 転é€ãƒ¢ãƒ¼ãƒ‰ã‚’使ã‚ãªã„\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions リモートã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ーミッションをä¿å­˜ã™"
+"ã‚‹\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks å†å¸°å–得中ã«ã€ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ãƒªãƒ³ã‚¯ã•"
+"ã‚ŒãŸå…ˆã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–å¾—ã™ã‚‹\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS オプション:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit implicit FTPS を使ㆠ(デフォルトãƒãƒ¼ãƒˆ"
+"㯠990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl 制御接続ã§é–‹å§‹ã—㟠SSL/TLS セッション"
+"ã‚’\n"
+" データ接続ã§å†é–‹ã™ã‚‹\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection 制御ãƒãƒ£ãƒãƒ«ã ã‘æš—å·åŒ–ã™ã‚‹(データã¯å¹³"
+"æ–‡ã«ãªã‚‹)\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp サーãƒãŒ FTPS ã«å¯¾å¿œã—ã¦ã„ãªã„å ´åˆã¯ "
+"FTP ã«ã™ã‚‹\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC オプション:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILENAME リクエスト/レスãƒãƒ³ã‚¹ãƒ‡ãƒ¼ã‚¿ã‚’ .warc.gz "
+"ファイルã«ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=STRING warcinfo record ã« STRING を追加ã™ã‚‹\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMBER WARC ファイルã®ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤ã‚’ NUMBER ã«"
+"設定ã™ã‚‹\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx CDX インデックスファイルを書ã\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FILENAME 指定ã—㟠CDX ファイルã«è¼‰ã£ã¦ã„ã‚‹ record "
+"ã¯ä¿å­˜ã—ãªã„\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression WARC ファイルを GZIP ã§åœ§ç¸®ã—ãªã„\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests SHA1 ダイジェストを計算ã—ãªã„\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log WARC record ã«ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿å­˜ã—ãªã„\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTORY WARC 書込時ã®ä¸€æ™‚ファイルを置ãディレクト"
+"リを指定ã™ã‚‹\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "å†å¸°ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive å†å¸°ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚’è¡Œã†\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMBER å†å¸°æ™‚ã®éšŽå±¤ã®æœ€å¤§ã®æ·±ã•ã‚’ NUMBER ã«è¨­å®šã™"
+"ã‚‹ (0 ã§ç„¡åˆ¶é™)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after ダウンロード終了後ã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ã‚¡ã‚¤"
+"ルを削除ã™ã‚‹\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links HTML ã‚„ CSS 中ã®ãƒªãƒ³ã‚¯ã‚’ローカルを指ã™ã‚ˆã†"
+"ã«å¤‰æ›´ã™ã‚‹\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only URLã®ãƒ•ã‚¡ã‚¤ãƒ«å部分ã ã‘変æ›ã™ã‚‹ (ã„ã‚ゆる"
+"basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N ファイルã«æ›¸ãã“む時㫠N ファイルã®ãƒãƒƒã‚¯"
+"アップをローテーションã•ã›ã‚‹\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted リンク変æ›å‰ã®ãƒ•ã‚¡ã‚¤ãƒ« X ã‚’ X_orig ã¨ã—ã¦"
+"ä¿å­˜ã™ã‚‹\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted リンク変æ›å‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ .orig ã¨ã—ã¦ä¿å­˜"
+"ã™ã‚‹\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror -N -r -l 0 --no-remove-listing ã®çœç•¥å½¢\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites HTML を表示ã™ã‚‹ã®ã«å¿…è¦ãªå…¨ã¦ã®ç”»åƒç­‰ã‚‚å–"
+"å¾—ã™ã‚‹\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments HTML 中ã®ã‚³ãƒ¡ãƒ³ãƒˆã®å‡¦ç†ã‚’厳密ã«ã™ã‚‹\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "å†å¸°ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰æ™‚ã®ãƒ•ã‚£ãƒ«ã‚¿:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LIST ダウンロードã™ã‚‹æ‹¡å¼µå­ã‚’コンマ区切りã§æŒ‡å®š"
+"ã™ã‚‹\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LIST ダウンロードã—ãªã„æ‹¡å¼µå­ã‚’コンマ区切りã§æŒ‡"
+"定ã™ã‚‹\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr " --accept-regex=REGEX 許容ã™ã‚‹ URL ã®æ­£è¦è¡¨ç¾ã‚’指定ã™ã‚‹\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGEX æ‹’å¦ã™ã‚‹ URL ã®æ­£è¦è¡¨ç¾ã‚’指定ã™ã‚‹\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TYPE æ­£è¦è¡¨ç¾ã®ã‚¿ã‚¤ãƒ— (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYPE æ­£è¦è¡¨ç¾ã®ã‚¿ã‚¤ãƒ— (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIST ダウンロードã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’コンマ区切りã§æŒ‡"
+"定ã™ã‚‹\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIST ダウンロードã—ãªã„ドメインをコンマ区切りã§"
+"指定ã™ã‚‹\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp HTML 文書中㮠FTP リンクもå–得対象ã«ã™ã‚‹\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LIST å–得対象ã«ã™ã‚‹ã‚¿ã‚°åをコンマ区切りã§æŒ‡å®šã™"
+"ã‚‹\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST å–得対象ã«ã—ãªã„ã‚¿ã‚°åをコンマ区切りã§æŒ‡å®š"
+"ã™ã‚‹\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts å†å¸°ä¸­ã«åˆ¥ã®ãƒ›ã‚¹ãƒˆã‚‚ダウンロード対象ã«ã™"
+"ã‚‹\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative 相対リンクã ã‘å–得対象ã«ã™ã‚‹\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LIST å–得対象ã«ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã™ã‚‹\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names ファイルåã¨ã—ã¦ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆå…ˆã®URLã®æœ€å¾Œ"
+"ã®éƒ¨åˆ†ã‚’使ã†\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LIST å–得対象ã«ã—ãªã„ディレクトリを指定ã™ã‚‹\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent 親ディレクトリをå–得対象ã«ã—ãªã„\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã‚„質å•ã€è­°è«–ãªã©ã¯ <bug-wget@gnu.org> ã«é€ã‚‹ã‹ã€\n"
+"https://savannah.gnu.org/bugs/?func=additem&group=wget ã« issue をオープンã—"
+"ã¦ãã ã•ã„。\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, éžå¯¾è©±çš„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è»¢é€ã‚½ãƒ•ãƒˆ\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "ユーザ %s ã®ãƒ‘スワード: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "パスワード: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "パイプãŒä½œæˆã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"èªè¨¼æƒ…å ±å–得用ã®ãƒ—ログラム(use-askpass)ã‚’èµ·å‹•ã™ã‚‹ãŸã‚ã®åˆæœŸåŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—"
+"ã¾ã—ãŸ: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"èªè¨¼æƒ…å ±å–得用ã®ãƒ—ログラム(use-askpass)ã‚’èµ·å‹•ã™ã‚‹ãŸã‚ã®è¨­å®šã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾"
+"ã—ãŸ: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "コマンド \"%s %s\" ã®å¿œç­”ã®èª­ã¿è¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "'%s%s' ã®ãƒ¦ãƒ¼ã‚¶å: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "%s%s@%s ã®ãƒ‘スワード: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "ロケール: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "コンパイル: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "リンク: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s built on %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (user)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"ライセンス GPLv3+: GNU GPL ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 3 ã‚ã‚‹ã„ã¯ãれ以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚自由ã«å¤‰æ›´ã€å†é…布ãŒã§ãã¾ã™ã€‚\n"
+"法律ãŒè¨±ã™ã‹ãŽã‚Šã€å…¨ãã®ç„¡ä¿è¨¼ã§ã™ã€‚\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Hrvoje Niksic <hniksic@xemacs.org> ã«ã‚ˆã£ã¦æ›¸ã‹ã‚Œã¾ã—ãŸã€‚\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "ãƒã‚°å ±å‘Šã‚„質å•ã¯<bug-wget@gnu.org>ã¸\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "メモリ確ä¿ã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "エラーã®ãŸã‚終了ã—ã¾ã™ï¼š%s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "詳ã—ã„オプション㯠`%s --help' を実行ã—ã¦ãã ã•ã„。\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: `-n%c' ã¯ä¸æ­£ãªã‚ªãƒ—ション指定ã§ã™\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"デãƒãƒƒã‚°ã‚µãƒãƒ¼ãƒˆãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã›ã‚“。--debug フラグを無視ã—"
+"ã¾ã™ã€‚\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"--no-clobber 㨠--convert-links ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€--convert-links ã ã‘ãŒæœ‰"
+"効ã«ãªã‚Šã¾ã™ã€‚\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"--no-clobber 㨠--convert-file-only ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸãŒã€--convert-file-only "
+"ã ã‘ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr ""
+"出力を詳細ã«ã™ã‚‹ã‚ªãƒ—ションã¨å‡ºåŠ›ã‚’抑制ã™ã‚‹ã‚ªãƒ—ションをåŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›"
+"ã‚“\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "-Nã¨-ncã¨ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“。\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "--inet4-only 㨠--inet6-only を両方指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"複数㮠URL を指定ã™ã‚‹å ´åˆã€ã‚ã‚‹ã„㯠-p ã‚„ -r ã¨ä½¿ã†å ´åˆã€\n"
+"-k ã‚„ --convert-file-only 㨠-O を両方指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。詳ã—ãã¯ãƒž"
+"ニュアルをå‚ç…§ã—ã¦ãã ã•ã„。\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"警告: -r ã‚„ -p 㨠-O を一緒ã«ä½¿ã†ã¨ã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸå†…容ã¯ã€\n"
+"å…¨ã¦æŒ‡å®šã•ã‚ŒãŸä¸€ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å…¥ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"警告: タイムスタンプã®æ¯”較㯠-O ã§ã¯ç„¡åŠ¹ã§ã™ã€‚\n"
+"詳ã—ãã¯ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC ã§å‡ºåŠ›ã™ã‚‹å ´åˆã¯ --no-clobber ã¯ä½¿ãˆãªã„ã®ã§ã€--no-clobber を無効ã«ã—ã¾"
+"ã™ã€‚\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC ã§å‡ºåŠ›ã™ã‚‹å ´åˆã¯ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ãŒä½¿ãˆãªã„ã®ã§ã€ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—を無効ã«ã—ã¾"
+"ã™ã€‚\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC ã§å‡ºåŠ›ã™ã‚‹å ´åˆã¯ --spider ã¯ä½¿ãˆã¾ã›ã‚“。\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC ã§å‡ºåŠ›ã™ã‚‹å ´åˆã¯ --continue ã‚„ --start-pos ã¯ä½¿ãˆãªã„ã®ã§ã€ãれらを無効"
+"ã«ã—ã¾ã™ã€‚\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"ダイジェストãŒç„¡åŠ¹ã§ã™ã€‚WARC ã®é‡è¤‡æŽ’除機能ã§é‡è¤‡ record を見ã¤ã‘られã¾ã›"
+"ん。\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"圧縮㯠--continue ã‚„ --start-pos ã¨ã¯åŒæ™‚ã«ä½¿ãˆã¾ã›ã‚“。圧縮ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾"
+"ã™ã€‚\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "--ask-password 㨠--password を両方指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"--start-pos 㨠--continue ã®ä¸¡æ–¹ã‚’指定ã™ã‚‹ã“ã¨ã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“。--continue ã¯"
+"無効ã«ãªã‚Šã¾ã™ã€‚\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URLãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "--post-data 㨠--post-file を両方指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"--post-data 㨠--post-file 㯠--method ã¨ä¸€ç·’ã«ã¯ä½¿ãˆã¾ã›ã‚“。--method を使ã†"
+"å ´åˆã¯ã€ãƒ‡ãƒ¼ã‚¿ã‚’ --body-data ã‹ --body-file ã‹ã‚‰ä¸Žãˆã¦ãã ã•ã„\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"--body-data ã‚„ --body-file を使ã†å ´åˆã¯ã€--method ã§ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã—ã¦ãã ã•"
+"ã„。\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "--body-data 㨠--body-file を両方指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ IRI をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr "-k ã‚„ -r ã¯æ™®é€šã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å‡ºåŠ›ã™ã‚‹æ™‚ã ã‘ -O ã¨ä¸€ç·’ã«ä½¿ãˆã¾ã™ã€‚\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links ã‚„ --convert-file-only ã¯æ™®é€šã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å‡ºåŠ›ã™ã‚‹æ™‚ã ã‘使ãˆã¾"
+"ã™ã€‚\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "libcares ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "c-ares ãƒãƒ£ãƒãƒ«ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "IP アドレス '%s' ã‚’ç†è§£ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "'%s' ã¨ã„ã†DNSサーãƒã‚’設定ã§ãã¾ã›ã‚“: (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "%s ã«ã¯URLãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "メタリンクファイル %s ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "%s ã‹ã‚‰å…¨ã¦ã«ãƒªã‚½ãƒ¼ã‚¹ã¯ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"終了ã—ã¾ã—㟠--%s--\n"
+"経éŽæ™‚é–“: %s\n"
+"ダウンロード完了: %d ファイルã€%s ãƒã‚¤ãƒˆã‚’ %s ã§å–å¾— (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "容é‡åˆ¶é™(%s ãƒã‚¤ãƒˆ)を超éŽã—ã¾ã™!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O ã¯ãƒ¡ã‚¿ãƒªãƒ³ã‚¯ã§ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§ã¯ä½¿ãˆã¾ã›ã‚“。無視ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "計画ã—ãŸãƒ¡ã‚¿ãƒªãƒ³ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "安全ãªãƒ¡ã‚¿ãƒªãƒ³ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "安全ãªåå‰ã§ãªã„ metalink ファイルを拒å¦ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "metaurl %s を処ç†ã—ã¦ã„ã¾ã™â€¦\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "安全ãªåå‰ã§ãªã„ metaurl ファイル %s ã‚’æ‹’å¦ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "%s ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚metaurl を飛ã°ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "metaurl ファイル %s ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "metaurl ã®å‡¦ç†ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "リソースタイプ %s ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ã®ã§ã€ç„¡è¦–ã—ã¾ã™â€¦\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "ダウンロードファイルをオープンã§ãã¾ã›ã‚“。\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "%s ã®ã‚µã‚¤ã‚ºã‚’計算ã—ã¦ã„ã¾ã™\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "ファイルサイズãŒå®£è¨€ã•ã‚Œã¦ã„ã¾ã›ã‚“。ãƒã‚§ãƒƒã‚¯ã‚’飛ã°ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "ダウンロードファイルã®ã‚µã‚¤ã‚ºã‚’å–å¾—ã§ãã¾ã›ã‚“。\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "ファイル %s ã®ã‚µã‚¤ã‚ºãŒä¸€è‡´ã—ã¾ã›ã‚“。\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "サイズãŒä¸€è‡´ã—ã¾ã—ãŸã€‚\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "%s ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’計算ã—ã¦ã„ã¾ã™\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã—ãŸã€‚\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "ファイル %s ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“。\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "ç½²å検証時ã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’オープンã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "ç½²å検証ã«æˆåŠŸã—ã¾ã—ãŸã€‚\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "無効ãªç½²åã§ã™ã€‚リソースを拒å¦ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "データã¯ç½²åã«ä¸€è‡´ã—ã¾ã—ãŸãŒã€ç½²åãŒä¿¡ç”¨ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "%s ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸã€‚リソースを飛ã°ã—ã¾ã™ã€‚\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "ファイル %s ã‚’å–å¾—ã—ã¾ã—ãŸãŒã€ã‚µã‚¤ã‚ºãŒä¸€è‡´ã—ã¾ã›ã‚“。\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "ファイル %s ã‚’å–å¾—ã—ã¾ã—ãŸãŒã€ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“。\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "ファイル %s ã‚’å–å¾—ã—ã¾ã—ãŸãŒã€ç½²åãŒç„¡åŠ¹ã§ã™ã€‚\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s ã‚’ %s ã«ãƒªãƒãƒ¼ãƒ ã—ã¾ã™ã€‚\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ç¶™ç¶šã—ã¾ã™ã€‚\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ç¶™ç¶šã—ã¾ã™ã€pid㯠%lu。\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "出力を %s ã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() ãŒå¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() ãŒå¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: 使用å¯èƒ½ãªã‚½ã‚±ãƒƒãƒˆãƒ‰ãƒ©ã‚¤ãƒã‚’見ã¤ã‘られã¾ã›ã‚“。\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚ソケットãŒãƒ–ロッキングã™ã‚‹ã‚ˆã†ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—"
+"ãŸã€‚\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: 警告: 区切り記å·(token) %s ã¯ã™ã¹ã¦ã®ãƒžã‚·ãƒ³åã®å‰ã«ç¾ã‚ã‚Œã¾ã™\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: \"%s\" ã¯ä¸æ˜ŽãªåŒºåˆ‡ã‚Šè¨˜å·(token)ã§ã™\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "使ã„æ–¹: %s NETRC [ホストå]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: %sã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "警告: å¼±ã„乱数ã®ç¨®ã‚’使用ã—ã¦ã„ã¾ã™\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "PRNGã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚--random-file ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "OpenSSL ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¦ TLSv1.3 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "OpenSSL ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¦ TLSv1.1 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "OpenSSL ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¦ TLSv1.2 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: 実装ã•ã‚Œã¦ã„ãªã„ 'secure-protocol' オプション値 %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: 無効ãªæš—å·ãƒªã‚¹ãƒˆã§ã™: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: ä¿¡é ¼ã®éƒ¨åˆ†ãƒã‚§ã‚¤ãƒ³ã‚’ä¿¡é ¼ã§ãã‚‹ã¨ãƒžãƒ¼ã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: 検証ã®ãƒ‘ラメータã®ãŸã‚ã®é ˜åŸŸãŒç¢ºä¿ã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "PRNGã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚--random-file ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: %s ã®è¨¼æ˜Žæ›¸(発行者: %s)ã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " 発行者ã®æ¨©é™ã‚’検証ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " 自己署å証明書ã§ã™ã€‚\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " 発行ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯ã¾ã æœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " 発行ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯å¤±åŠ¹ã—ã¦ã„ã¾ã™ã€‚\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr "%s: 証明書ã«è¨˜è¼‰ã•ã‚Œã¦ã„る別åã¨ãƒ›ã‚¹ãƒˆå %s ãŒä¸€è‡´ã—ã¾ã›ã‚“\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr " %s: 証明書ã«è¨˜è¼‰ã•ã‚Œã¦ã„ã‚‹åå‰ %s ã¨ãƒ›ã‚¹ãƒˆå %s ãŒä¸€è‡´ã—ã¾ã›ã‚“\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: 証明書ã®åå‰ãŒä¸æ­£ã§ã™(NUL文字をå«ã‚“ã§ã„ã¾ã™)。\n"
+" 接続先ã®ã‚µãƒ¼ãƒãŒãªã‚Šã™ã¾ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" ã¤ã¾ã‚Šã€æœ¬ç‰©ã® %s ã§ã¯ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"%s ã«å®‰å…¨ã®ç¢ºèªã‚’ã—ãªã„ã§æŽ¥ç¶šã™ã‚‹ã«ã¯ã€`--no-check-certificate' を使ã£ã¦ãã "
+"ã•ã„。\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ %sK ã¨ã°ã—ã¾ã™ ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "%s ã¯ç„¡åŠ¹ãªãƒ‰ãƒƒãƒˆè¡¨ç¤ºå½¢å¼ãªã®ã§å¤‰æ›´ã—ã¾ã›ã‚“。\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " 残り%s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " 時間 "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "リアルタイムクロックã®å‘¨æ³¢æ•°ã‚’å–å¾—ã§ãã¾ã›ã‚“: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "æ‹’å¦ã™ã¹ããªã®ã§ã€%s を削除ã—ã¾ã—ãŸã€‚\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "%s ã‚’é–‹ã‘ã¾ã›ã‚“: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "robots.txtを読ã¿è¾¼ã‚“ã§ã„ã¾ã™ã€ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã—ã¦ãã ã•ã„。\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "proxy URL %s を解釈中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "proxy URL %s ã«é–“é•ã„ãŒã‚ã‚Šã¾ã™: HTTPã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "リダイレクション回数㌠%d を越ãˆã¾ã—ãŸã€‚\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"中止ã—ã¾ã—ãŸã€‚\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"å†è©¦è¡Œã—ã¦ã„ã¾ã™ã€‚\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"壊れã¦ã„るリンクã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d 個ã®ãƒªãƒ³ã‚¯ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚\n"
+"\n"
+msgstr[1] ""
+"%d 個ã®ãƒªãƒ³ã‚¯ãŒå£Šã‚Œã¦ã„ã¾ã™ã€‚\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "エラーãªã—"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "%s ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„スキームã§ã™"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "スキームãŒã‚ã‚Šã¾ã›ã‚“"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "ホストåãŒä¸æ­£ã§ã™"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "ãƒãƒ¼ãƒˆç•ªå·ãŒä¸æ­£ã§ã™"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "ユーザåãŒä¸æ­£ã§ã™"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "IPv6 アドレスã®è¨˜è¿°ãŒçµ‚了ã—ã¦ã„ã¾ã›ã‚“"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 アドレスã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "IPv6 アドレスãŒä¸æ­£ã§ã™"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã‚‹ã‚ˆã†ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "変æ›ã§ããªã„マルãƒãƒã‚¤ãƒˆæ–‡å­—列ã§ã™\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: メモリã®ç¢ºä¿ã«å¤±æ•—ã—ã¾ã—ãŸ; メモリãŒã„ã£ã±ã„ã§ã™\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: %ld ãƒã‚¤ãƒˆã®ç¢ºä¿ã«å¤±æ•—ã—ã¾ã—ãŸ; メモリãŒã„ã£ã±ã„ã§ã™\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: テキストãƒãƒƒãƒ•ã‚¡ (%d bytes) ã¯å¤§ãã™ãŽã‚‹ã®ã§ã€ä¸­æ­¢ã—ã¾ã™ã€‚\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ç¶™ç¶šã—ã¾ã™ã€pid㯠%d。\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "シンボリックリンク %s ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "ファイル %s ã® fopen() 失敗ã—ã¾ã—ãŸ\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "ファイル %s ã® FD(ファイルディスクリプタ) ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+"ファイル %s ã® stat() ã«å¤±æ•—ã—ã¾ã—㟠(パーミッションを確èªã—ã¦ãã ã•ã„)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"ファイル %s ã¯æœ€å¾Œã«ç¢ºèªã—ãŸæ™‚ã‹ã‚‰å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ã€‚セキュリティãƒã‚§ãƒƒã‚¯ã«å¤±"
+"æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "ファイル %s ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "ファイル %s ã® stat() ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"ファイル %s をオープンã—よã†ã¨ã—ãŸã¨ã“ã‚最後ã«ç¢ºèªã—ãŸæ™‚ã‹ã‚‰å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã—"
+"ãŸã€‚セキュリティãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "%s ã¯ç„¡åŠ¹ãªæ­£è¦è¡¨ç¾ã§ã™, PCRE2 エラー %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "%s ã¯ç„¡åŠ¹ãªæ­£è¦è¡¨ç¾ã§ã™, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "%s をマッãƒä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "é–“é•ã£ãŸã‚µã‚¤ã‚ºã®ã‚­ãƒ¼ã‚’スキップã—ã¾ã™ (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "WARC ファイル %s ã®ä½ç½®æŒ‡å®šã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+"WARC ファイルã®å†…容をディスクã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã—よã†ã¨ã—ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "WARC ファイルディスクリプタを複製中ã«ã‚¨ãƒ©ãƒ¼ã€‚\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "GZIP ストリームを WARC ファイルå‘ã‘ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "WARC ファイル㸠warcinfo レコードを書ãè¾¼ã‚ã¾ã›ã‚“。\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"WARC ファイル %s をオープンã—ã¦ã„ã¾ã™ã€‚\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "WARC ファイル %s をオープンã§ãã¾ã›ã‚“。\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX ファイルã«å…ƒã®URLã®åˆ—'a'ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX ファイルã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆ—'k'ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX ファイルã«ãƒ¬ã‚³ãƒ¼ãƒ‰IDã®åˆ—'u'ãŒã‚ã‚Šã¾ã›ã‚“。\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"CDX ファイルã‹ã‚‰ %d レコードを読ã¿ã“ã¿ã¾ã—ãŸã€‚\n"
+"\n"
+msgstr[1] ""
+"CDX ファイルã‹ã‚‰ %d レコードを読ã¿ã“ã¿ã¾ã—ãŸã€‚\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "CDX ファイル %s ã‚’é‡è¤‡é™¤åŽ»ã®ãŸã‚ã«èª­ã¿ã“ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "一時 WARC マニフェストファイルãŒã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“。\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "一時 WARC ログファイルをオープンã§ãã¾ã›ã‚“。\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "WARC ファイルをオープンã§ãã¾ã›ã‚“。\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "CDX ファイルを出力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "一時 WARC ファイルをオープンã§ãã¾ã›ã‚“。\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"CDX ファイルã«ä¸€è‡´ã‚’発見ã—ã¾ã—ãŸã€‚revisit レコードを WARC ã«è¨˜éŒ²ã—ã¾ã™ã€‚\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "ä¸æ˜Žãªã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼ã§ã™"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "ホストåã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒ•ã‚¡ãƒŸãƒªãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ai_flags ã«ã¯ä¸æ­£ãªå€¤ã§ã™"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "åå‰è§£æ±ºä¸­ã«å›žå¾©ä¸å¯èƒ½ãªå¤±æ•—ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "メモリ確ä¿ã§ãã¾ã›ã‚“"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "ホストåã«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "Name or service not known"
+#~ msgstr "åå‰ã‹ã‚µãƒ¼ãƒ“スãŒä¸æ˜Žã§ã™"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "ãã® ai_socktype ã§ã¯ã€Servname ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ãã® ai_socktype ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "System error"
+#~ msgstr "システムエラーã§ã™"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "引数ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "リクエストを処ç†ä¸­ã§ã™"
+
+#~ msgid "Request canceled"
+#~ msgstr "リクエストã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
+
+#~ msgid "Request not canceled"
+#~ msgstr "リクエストã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#~ msgid "All requests done"
+#~ msgstr "å…¨ã¦ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "シグナルã«ã‚ˆã£ã¦ä¸­æ–­ã•ã‚Œã¾ã—ãŸ"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "パラメータ文字列ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: オプション '%s%s' ã¯æ›–昧ã§ã™\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: オプション '%s%s' ã¯æ›–昧ã§ã™ã€‚é¸æŠžè‚¢ã¯æ¬¡ã®é€šã‚Šã§ã™:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: '%s%s' ã¯èªè­˜ã§ããªã„オプションã§ã™\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: オプション '%s%s' ã¯å¼•æ•°ã‚’å¿…è¦ã¨ã—ã¾ã›ã‚“\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: オプション '%s%s' ã¯å¼•æ•°ã‚’å¿…è¦ã¨ã—ã¾ã™\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: ä¸æ­£ãªã‚ªãƒ—ションã§ã™ -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: オプションã¯å¼•æ•°ã‚’å¿…è¦ã¨ã—ã¾ã™ -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "æˆåŠŸ"
+
+#~ msgid "No match"
+#~ msgstr "マッãƒãªã—"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "ä¸æ­£ãªæ­£è¦è¡¨ç¾ã§ã™"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "ä¸æ­£ãª collation 文字ã§ã™"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "ä¸æ­£ãªæ–‡å­—クラスåã§ã™"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "最後ã«ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ãŒã‚ã‚Šã¾ã™"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "ä¸æ­£ãªå¾Œæ–¹å‚ç…§ã§ã™"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "マッãƒã—ãªã„ [, [^ [:, [. ã‚„ [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "マッãƒã—ãªã„ ( ã‚„ \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "マッãƒã—ãªã„ \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "\\{\\} ã®ä¸­å‘³ãŒä¸æ­£ã§ã™"
+
+#~ msgid "Invalid range end"
+#~ msgstr "範囲ã®çµ‚了ãŒä¸æ­£ã§ã™"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "メモリä¸è¶³"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "先行ã™ã‚‹æ­£è¦è¡¨ç¾ãŒä¸æ­£ã§ã™"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "æ­£è¦è¡¨ç¾ãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã§çµ‚ã‚ã£ã¦ã„ã¾ã™"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "æ­£è¦è¡¨ç¾ãŒå¤§ãã™ãŽã¾ã™"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "マッãƒã—ãªã„ ) ã‚„ \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "ã“れよりå‰ã«æ­£è¦è¡¨ç¾ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "パイプãŒä½œæˆã§ãã¾ã›ã‚“"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s サブプロセスãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle ãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "fd %d をリストアã§ãã¾ã›ã‚“: dup2 ãŒå¤±æ•—ã—ã¾ã—ãŸ"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s サブプロセス"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s サブプロセスãŒè‡´å‘½çš„ãªã‚·ã‚°ãƒŠãƒ« %d ã‚’å—ä¿¡ã—ã¾ã—ãŸ"
+
+#~ msgid "memory exhausted"
+#~ msgstr "メモリä¸è¶³"
diff --git a/po/lt.gmo b/po/lt.gmo
new file mode 100644
index 0000000..921d093
--- /dev/null
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000..b6a889d
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,3451 @@
+# translation of wget-1.11.3 to Lithuanian
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Gintautas Miliauskas <gintas@akl.lt>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget-1.11.3\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2009-01-29 00:21+0200\n"
+"Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
+"Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
+"Language: lt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
+"%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/connect.c:201
+#, fuzzy, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: nepavyko rasti bind adreso „%s“; išjungiamas bind.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Jungiamasi prie %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Jungiamasi prie %s:%d... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Jungiamasi prie %s:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "prisijungta.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "nepavyko: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, fuzzy, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: nepavyko rasti adreso „%s“\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Pakeista %d failų per %s sekundžių.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "KeiÄiamas %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "neliko užduoÄių.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nepavyko pakeisti nuorodų %s: %s\n"
+
+#: src/convert.c:267
+#, fuzzy, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Nepavyko pašalinti „%s“: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Nepavyko padaryti atsarginÄ—s %s kopijos %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nepavyko pašalinti „%s“: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "SintaksÄ—s klaida Set-Cookie: %s pozicijoje %d.\n"
+
+#: src/cookies.c:777
+#, fuzzy, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Slapukas iš %s pabandė nustatyti domeną į %s\n"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, fuzzy, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nepavyko atverti slapukų failo „%s“: %s\n"
+
+#: src/cookies.c:1417
+#, fuzzy, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Klaida rašant į „%s“: %s\n"
+
+#: src/cookies.c:1420
+#, fuzzy, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Klaida uždarant „%s“: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Nesuderinamas sąrašo tipas, bandomas Unix tipo sąrašų doroklis.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s turinys adresu %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "laikas nežinomas "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Failas "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Aplankas "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Saitas "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Neaišku "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s baitų)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Dydis: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", liko %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", liko %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (neautoritatyvus)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Prisijungiama kaip %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Klaida paslaugų stotyje, uždaromas valdymo prisijungimas.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Klaida paslaugų stoties pasisveikinime.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Įrašymas nepavyko, uždaromas valdymo prisijungimas.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Paslaugų stotis atsisako priimti prisijungimą.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Nekorektiškas prisijungimas.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Prisijungta!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Paslaugų stoties klaida, nepavyksta nustatyti sistemos tipo.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "atlikta. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "atlikta.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Nežinomas tipas „%c“, uždaromas valdymo prisijungimas.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "atlikta. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nereikalingas.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, fuzzy, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Nerastas aplankas „%s“.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nereikalingas.\n"
+
+#: src/ftp.c:1044
+#, fuzzy
+msgid "File has already been retrieved.\n"
+msgstr "Failas „%s“ jau egzistuoja; nesiunÄiama.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nepavyksta paleisti PASV persiuntimo.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Nesuprantamas PASV atsakas.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nepavyko prisijungti prie %s prievado %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Susiejimo klaida (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Nekorektiškas PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Nepavyko REST, pradedama iš naujo.\n"
+
+#: src/ftp.c:1250
+#, fuzzy, c-format
+msgid "File %s exists.\n"
+msgstr ""
+"Nutolęs failas egzistuoja.\n"
+"\n"
+
+#: src/ftp.c:1256
+#, fuzzy, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"Nerastas failas „%s“.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, fuzzy, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Nerastas failas „%s“.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, fuzzy, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Nėra tokio failo ar aplanko „%s“.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s staiga susikūrė.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, uždaromas valdymo prisijungimas.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Duomenų prisijungimas: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Valdymo prisijungimas uždarytas.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Duomenų siuntimas nutrauktas.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, fuzzy, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Failas „%s“ jau egzistuoja; nesiunÄiama.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(bandymas:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - „%s“ įrašyta [%s/%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - „%s“ įrašytas [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Å alinamas %s.\n"
+
+#: src/ftp.c:2168
+#, fuzzy, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Naudojamas „%s“ kaip laikinas sąrašo failas.\n"
+
+#: src/ftp.c:2185
+#, fuzzy, c-format
+msgid "Removed %s.\n"
+msgstr "Pašalintas „%s“.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Apdorojimo gylis %d viršijo didžiausią gylį %d.\n"
+
+#: src/ftp.c:2294
+#, fuzzy, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "NutolÄ™s failas nÄ—ra naujesnis už vietinį „%s“ – nesiunÄiama.\n"
+
+#: src/ftp.c:2302
+#, fuzzy, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"NutolÄ™s failas yra naujesnis už vietinį „%s“ – siunÄiama.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Failų dydžiai nesutampa (vietinis %s) – siunÄiama.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nekorektiškas saito vardas, praleidžiamas.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Saitas %s -> %s jau yra\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Kuriama simbolinÄ— nuoroda %s -> %s\n"
+
+#: src/ftp.c:2375
+#, fuzzy, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Simbolinės nuorodos nepalaikomos, praleidžiama nuoroda „%s“.\n"
+
+#: src/ftp.c:2390
+#, fuzzy, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Praleidžiamas aplankas „%s“.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: nežinomas/nesuderinamas failo tipas.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr ""
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: pažeista laiko žymė.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Aplankai nebus siunÄiami, nes gylis nurodytas %d (maksimalus %d).\n"
+
+#: src/ftp.c:2531
+#, fuzzy, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Nesileidžiama į „%s“, nes jis nufiltruotas/neįtrauktas.\n"
+
+#: src/ftp.c:2647
+#, fuzzy, c-format
+msgid "Rejecting %s.\n"
+msgstr "Atmetamas „%s“.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Atmetamas „%s“.\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Klaida taikant %s su %s: %s\n"
+
+#: src/ftp.c:2738
+#, fuzzy, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Nėra „%s“ atitikmenų.\n"
+
+#: src/ftp.c:2810
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "HTML formato turinys įrašytas į „%s“ [%s].\n"
+
+#: src/ftp.c:2815
+#, fuzzy, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "HTML formato turinys įrašytas į „%s“.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr ""
+"Siųskite pranešimus apie klaidas ir pasiūlymus adresu <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "KLAIDA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "ĮSPĖJIMAS"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s nepateikÄ— sertifikato.\n"
+
+#: src/gnutls.c:1038
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: %s nepateikÄ— sertifikato.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr " IÅ¡duoto sertifikato galiojimo laikas baigÄ—si.\n"
+
+#: src/gnutls.c:1041
+#, fuzzy, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: %s nepateikÄ— sertifikato.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr " IÅ¡duotas sertifikatas dar nevalidus.\n"
+
+#: src/gnutls.c:1044
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr " IÅ¡duoto sertifikato galiojimo laikas baigÄ—si.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+#, fuzzy
+msgid "No certificate found\n"
+msgstr "%s: %s nepateikÄ— sertifikato.\n"
+
+#: src/gnutls.c:1072
+#, fuzzy, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Klaida apdorojant tarpinÄ—s stoties URL %s: %s.\n"
+
+#: src/gnutls.c:1079
+#, fuzzy
+msgid "The certificate has not yet been activated\n"
+msgstr " IÅ¡duotas sertifikatas dar nevalidus.\n"
+
+#: src/gnutls.c:1084
+#, fuzzy
+msgid "The certificate has expired\n"
+msgstr " IÅ¡duoto sertifikato galiojimo laikas baigÄ—si.\n"
+
+#: src/gnutls.c:1091
+#, fuzzy, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "%s: sertifikato vardas „%s“ neatitinka kompiuterio vardo „%s“.\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Neatpažintas kompiuterio vardas"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Laikinas vardų paieškos sutrikimas"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Nežinoma klaida"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Ieškoma %s..."
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "nepavyko: Nėra IPv4/IPv6 adresų kompiuteriui.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "nepavyko: per ilgai neatsako.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: nepavyksta atsekti saito %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Nekorektiškas URL adresas %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Klaida rašant HTTP užklausą: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "NÄ—ra antraÅ¡Äių, bandoma kaip HTTP/0.9"
+
+#: src/http.c:1637
+#, fuzzy, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Failas „%s“ jau egzistuoja; nesiunÄiama.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, fuzzy, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Nėra POST duomenų failo „%s“: %s\n"
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Naudojamas esamas prisijungimas prie %s:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Naudojamas esamas prisijungimas prie %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Klaida skaitant tarpinÄ—s stoties atsakÄ…: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s KLAIDA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Netinkama būsenos eilutė"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "TarpinÄ—s stoties tuneliavimas nesÄ—kmingas: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Nesuprantamas autentifikavimo būdas.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Nesuprantamas autentifikavimo būdas.\n"
+
+#: src/http.c:2612
+#, fuzzy, c-format
+msgid "Saving to: %s\n"
+msgstr "Rašoma į: „%s“\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Dėl įvykusių klaidų išjungiamas SSL.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s užklausa išsiųsta, laukiama atsakymo..."
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Negauta duomenų.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "AntraÅ¡Äių skaitymo klaida (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(be aprašymo)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Vieta: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nenurodyta"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [sekama]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Failas jau atsiųstas iki galo; užduoÄių nebeliko.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Dydis: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignoruojamas"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "PerspÄ—jimas: Å¡ablonai nesuderinami su HTTP protokolu.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Paieškos veiksena įjungta. Tikrinama, ar nutolęs failas egzistuoja.\n"
+
+#: src/http.c:4445
+#, fuzzy, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nepavyksta rašyti į „%s“ (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "Nepavyksta rašyti į „%s“ (%s).\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nepavyko užmegzti SSL prisijungimo.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Nepavyksta rašyti į „%s“ (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "KLAIDA: Nukreipimas (%d) niekur neveda.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Nutolęs failas neegzistuoja – klaidinga nuoroda!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Trūksta paskutinio keitimo antraštės – laiko žymės išjungtos.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Paskutinio keitimo antraštė netaisyklinga – laiko žymės išjungtos.\n"
+
+#: src/http.c:4643
+#, fuzzy, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Serverio filas ne naujesnis negu vietinis failas „%s“ – nesiunÄiama.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Nesutampa failų dydžiai (vietinis failas %s) – siunÄiama.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "NutolÄ™s failas yra naujesnis, siunÄiama.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Nutolęs failas egzistuoja ir gali turėti nuorodų į kitus resursus – "
+"siunÄiama.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"NutolÄ™s failas egzistuoja, bet jame nÄ—ra nuorodų – nesiunÄiama.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Nutolęs failas egzistuoja ir gali turėti daugiau nuorodų,\n"
+"bet rekursija iÅ¡junga – nesiunÄiama.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Nutolęs failas egzistuoja.\n"
+"\n"
+
+#: src/http.c:4708
+#, fuzzy, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s: Nekorektiškas URL adresas %s: %s\n"
+
+#: src/http.c:4756
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - „%s“ įrašyta [%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, fuzzy, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - „%s“ įrašyta [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Prisijungimas užvertas ties %s baitu. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Skaitymo klaida ties %s (%s) baitu."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Skaitymo klaida ties %s/%s (%s) baitu. "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nepalaikoma schema"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC veda į %s, kuri neegzistuoja.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Nepavyksta nuskaityti %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Klaida %s eilutÄ—je %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: SintaksÄ—s klaida %s eilutÄ—je %d.\n"
+
+#: src/init.c:723
+#, fuzzy, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Faile %s nežinoma komanda „%s“ eilutėje %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, fuzzy, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Perspėjimas: Tiek naudotojo, tiek sistemos wgetrc failas rodo į „%s“.\n"
+
+#: src/init.c:1006
+#, fuzzy, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Nekorektiška --execute komanda „%s“\n"
+
+#: src/init.c:1066
+#, fuzzy, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Nekorektiška loginė reikšmė „%s“; naudokite „on“ arba „off“.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Nekorektiška loginė reikšmė „%s“; naudokite „on“ arba „off“.\n"
+
+#: src/init.c:1119
+#, fuzzy, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Nekorektiškas skaitmuo „%s“.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, fuzzy, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Nekorektiška baito reikšmė „%s“\n"
+
+#: src/init.c:1402
+#, fuzzy, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Nekorektiškas laiko periodas „%s“\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Nekorektiškas laiko periodas „%s“\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, fuzzy, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Nekorektiška reikšmė „%s“.\n"
+
+#: src/init.c:1545
+#, fuzzy, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Nekorektiška antraštė „%s“.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Nekorektiška antraštė „%s“.\n"
+
+#: src/init.c:1632
+#, fuzzy, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Nekorektiškas pažangos tipas „%s“.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Netaisyklingas apribojimas „%s“, naudokite [unix|windows],[lowercase|"
+"uppercase],[nocontrol].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "nepavyko prisijungti prie %s prievado %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"gauta %s, išvedimas nukreipiamas į „%s“.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; žurnalas išjungiamas.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Naudojimas: %s [PARINKTIS]... [ADRESAS]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Būtini parametrai ilgiems argumentams taip pat būtini ir trumpiems "
+"argumentams.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Pradžia:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version parodyti Wget versiją ir išeiti.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help išspausdinti šią informaciją.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background veikti fone.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=COMMAND įvykdyti „.wgetrc“ tipo komandą.\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Žurnalai ir įvedimo failas:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FAILAS išvesti pranešimus į FAILĄ.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FAILAS pridėti pranešimus FAILO pabaigoje.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug išvesti daug derinimo informacijos.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug išspausdinti Watt-32 derinimo informaciją.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tyli veiksena (be išvesties).\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose informuoti išsamiai (numatytoji reikšmė).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose sumažinti informatyvumą (bet neišjungti "
+"pranešimų).\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+#, fuzzy
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr " -i, --input-file=FAILAS parsiųsti URL adresus, rastus FAILE.\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr " -i, --input-file=FAILAS parsiųsti URL adresus, rastus FAILE.\n"
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html suprasti skaityti nurodytÄ… failÄ… kaip HTML tipo failÄ….\n"
+
+#: src/main.c:634
+#, fuzzy
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -N, --timestamping nesiųsti failų, nebent naujesni už "
+"vietinius.\n"
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr " --no-cookies nenaudoti slapukų.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies nenaudoti slapukų.\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Parsiuntimas:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=SKAIČIUS nustatyti bandymų parsiųsti SKAIČIŲ (0 – "
+"neriboti).\n"
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused bandyti iš naujo net jei prisijungimas "
+"atmetamas.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=SĄRAŠAS kableliais atskirtas ignoruojamų\n"
+" HTML žymių sąrašas.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FAILAS rašyti dokumentus į FAILĄ.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber praleisti parsiuntimus, kurie turėtų "
+"perrašyti\n"
+" esamus failus.\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " -np, --no-parent neiti aukštyn į tėvinį aplanką.\n"
+
+#: src/main.c:660
+#, fuzzy
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr " -c, --continue tęsti dalinai parsiųstą failą.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+#, fuzzy
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYPE nurodyti progreso indikatoriaus tipÄ….\n"
+
+#: src/main.c:666
+#, fuzzy
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --progress=TYPE nurodyti progreso indikatoriaus tipÄ….\n"
+
+#: src/main.c:668
+#, fuzzy
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nesiųsti failų, nebent naujesni už "
+"vietinius.\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response išvesti serverio atsakymą.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider nieko nesiųsti.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEK nustatyti visus laukimo laikus į SEK.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADRESAS susieti su ADRESU (kompiuterio vardu ar\n"
+" IP adresu) vietiniame kompiuteryje.\n"
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEK nustatyti DNS paieškos laukimo laiką į "
+"SEK.\n"
+
+#: src/main.c:691
+#, fuzzy
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEK nustatyti bandymo prisijungti laiką į SEK.\n"
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEK nustatyti bandymo skaityti laiką į SEK.\n"
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEK laukti 1..SEK tarp bandymų atsiusti iš "
+"naujo.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait laukti tarp 0...2*WAIT sekundžių tarp "
+"atsiuntimų.\n"
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy būtinai išjungti tarpinę stotį.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=SKAIČIUS nustatyti parsiuntimo į SKAIČIŲ.\n"
+
+#: src/main.c:708
+#, fuzzy
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESAS susieti su ADRESU (kompiuterio vardu ar\n"
+" IP adresu) vietiniame kompiuteryje.\n"
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=GREITIS riboti atsiuntimo greitį iki GREIČIO.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache išjungti DNS paieškų spartinimą.\n"
+
+#: src/main.c:714
+#, fuzzy
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS apriboti simbolius failų varduose į "
+"palaikomus OS.\n"
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignoruoti registrÄ… filtruojant failus/"
+"aplankus.\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only jungtis tik prie IPv4 adresų.\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only jungtis tik prie IPv6 adresų.\n"
+
+#: src/main.c:723
+#, fuzzy
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=Å EIMA pirma jungtis prie nurodytos Å¡eimos "
+"adresų:\n"
+" „IPv6“, „IPv4“ arba „none“.\n"
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr " --user=NAUDOTOJAS nustatyti FTP ir HTTP naudotojÄ….\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=SLAPTAŽODIS nustatyti FTP ir HTTP slaptažodį.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --password=SLAPTAŽODIS nustatyti FTP ir HTTP slaptažodį.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-proxy būtinai išjungti tarpinę stotį.\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr " --no-glob išjungti FTP failų vardų „globbing“.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Aplankai:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories nekurti aplankų.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories priverstinai kurti aplankus.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories nekurti aplankų pagal kompiuterį.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories aplankuose naudoti protokolo vardÄ….\n"
+
+#: src/main.c:774
+#, fuzzy
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+" -P, --directory-prefix=PREFIKSAS rašyti failus aplanke PREFIKSAS/...\n"
+
+#: src/main.c:776
+#, fuzzy
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=SKAIČIUS ignoruoti SKAIČIŲ nutolusio aplanko "
+"komponentų.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP parametrai:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=NAUDOTOJAS nustatyti HTTP naudotojÄ….\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=SLAPTAŽODIS nustatyti HTTP slaptažodį.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache neleisti duomenų serverio kaupe.\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+#, fuzzy
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --html-extension įrašyti HTML dokumentus su „.html“ priesaga.\n"
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length ignoruoti „Content-Length“ antraštę.\n"
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=TEKSTAS įterpti TEKSTÄ„ tarp antraÅ¡Äių.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+#, fuzzy
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksimalus peradresavimų skaiÄius puslapiui.\n"
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=NAUDOTOJAS nustatyti tarpinÄ—s stoties naudotojÄ….\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=SLAPTAŽODIS nustatyti tarpinės stoties slaptažodį.\n"
+
+#: src/main.c:807
+#, fuzzy
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL įtraukti „Referer: URL“ antraštę HTTP "
+"užklausoje.\n"
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers įrašyti HTTP antraštes į failą.\n"
+
+#: src/main.c:811
+#, fuzzy
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTAS prisistatyti AGENTU vietoje „Wget/VERSIJA“.\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive išjungti HTTP keep-alive (ilgalaikiai "
+"prisijungimai).\n"
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies nenaudoti slapukų.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FAILAS įkrauti slapukus iš FAILO prieš sesiją.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=FAILAS įrašyti slapukus į FAILĄ po sesijos.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr " --keep-session-cookies įkrauti ir įrašyti sesijos slapukus.\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=TEKSTAS naudoti POST metodą; siųsti TEKSTĄ kaip "
+"duomenis.\n"
+
+#: src/main.c:825
+#, fuzzy
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FAILAS naudoti POST metodą; siųsti FAILO turinį.\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+#, fuzzy
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --post-data=TEKSTAS naudoti POST metodą; siųsti TEKSTĄ kaip "
+"duomenis.\n"
+
+#: src/main.c:831
+#, fuzzy
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --post-file=FAILAS naudoti POST metodą; siųsti FAILO turinį.\n"
+
+#: src/main.c:833
+#, fuzzy
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition atsižvelgti į Content-Disposition antraštę\n"
+" parenkant vietinių failų vardus "
+"(EKSPERIMENTINIS).\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+#, fuzzy
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Siųsti „Basic“ HTTP autentikacijos "
+"informacijÄ…\n"
+" nelaukiant serverio užklausimo.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) parametrai:\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR rinktis saugų protokolą: „auto“, „SSLv2“,\n"
+" „SSLv3“ arba „TLSv1“.\n"
+
+#: src/main.c:850
+#, fuzzy
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " -L, --relative sekti tik reliatyvias nuorodas.\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate nevaliduoti serverio sertifikato.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FAILAS kliento sertifikato failas.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIPAS kliento sertifikato tipas: PEM arba DER.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FAILAS privataus rakto failas.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIPAS privataus rakto tipas: PEM arba DER.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FAILAS failas su CA rinkiniu.\n"
+
+#: src/main.c:864
+#, fuzzy
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR aplankas, kuriame saugomas CA maišų "
+"sąrašas.\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=FAILAS failas su CA rinkiniu.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+#, fuzzy
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FAILAS failas su atsitiktiniais duomenimis SSL\n"
+" PRNG inicializacijai.\n"
+
+#: src/main.c:878
+#, fuzzy
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FILE EGD lizdo failas su atsitiktiniais "
+"duomenimis.\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "HTTP parametrai:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-cache neleisti duomenų serverio kaupe.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP parametrai:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=NAUDOTOJAS nustatyti FTP naudotojÄ….\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=SLAPTAŽODIS nustatyti FTP slaptažodį.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing nešalinti „.listing“ failų.\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob išjungti FTP failų vardų „globbing“.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp išjungti „pasyvią“ persiuntimo veikseną.\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions išsaugoti nutolusio failo leidimus.\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks siunÄiant rekursyviai, siųsti simbolinių\n"
+" nuorodų rodomus failus (ne aplankus).\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "FTP parametrai:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+#, fuzzy
+msgid "WARC options:\n"
+msgstr "FTP parametrai:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --header=TEKSTAS įterpti TEKSTÄ„ tarp antraÅ¡Äių.\n"
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" -t, --tries=SKAIČIUS nustatyti bandymų parsiųsti SKAIČIŲ (0 – "
+"neriboti).\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --spider nieko nesiųsti.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-cookies nenaudoti slapukų.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --ignore-case ignoruoti registrÄ… filtruojant failus/"
+"aplankus.\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursyvus siuntimas:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive siųsti failus rekursyviai.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=SKAIÄŒIUS maksimalus rekursijos gylis (inf arba 0 "
+"begalybei).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after ištrinti failus juos parsiuntus.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links pakeisti nuorodas parsiųstame HTML, kad rodytų\n"
+" į vietinius failus.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted prieš konvertuojant failą „X“, sukurti "
+"atsarginÄ™\n"
+" kopiją „X.orig“.\n"
+
+#: src/main.c:979
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted prieš konvertuojant failą „X“, sukurti "
+"atsarginÄ™\n"
+" kopiją „X.orig“.\n"
+
+#: src/main.c:982
+#, fuzzy
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror „-N -r -l inf --no-remove-listing“ santrumpa.\n"
+
+#: src/main.c:984
+#, fuzzy
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites parsiųsti visus paveikslėlius ir kt. failus,\n"
+" reikalingus HTML puslapiui parodyti.\n"
+
+#: src/main.c:986
+#, fuzzy
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments įjungti griežtą (SGML) HTML komentarų "
+"apdorojimÄ….\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursyvus priÄ—mimas/atmetimas:\n"
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=SĄRAŠAS kableliais atskirtas imamų plėtinių "
+"sąrašas.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=SĄRAŠAS kableliais atskirtas atmetamų plėtinių "
+"sąrašas.\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --progress=TYPE nurodyti progreso indikatoriaus tipÄ….\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --progress=TYPE nurodyti progreso indikatoriaus tipÄ….\n"
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=SĄRAŠAS kableliais atskirtas imamų domenų "
+"sąrašas.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=SĄRAŠAS kableliais atskirtas atmetamų domenų "
+"sąrašas.\n"
+
+#: src/main.c:1011
+#, fuzzy
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp siųsti FTP nuorodas iš HTML dokumentų.\n"
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=SĄRAŠAS kableliais atskirtas sekamų HTML žymių "
+"sąrašas.\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=SĄRAŠAS kableliais atskirtas ignoruojamų\n"
+" HTML žymių sąrašas.\n"
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts eiti į kitus domenus siunÄiant "
+"rekursyviai.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative sekti tik reliatyvias nuorodas.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=SĄRAŠAS leistinų aplankų sąrašas.\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=SĄRAŠAS atmetamų aplankų sąrašas.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent neiti aukštyn į tėvinį aplanką.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, neinteraktyvus parsiuntiklis.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2008 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licencija GPLv3+: GNU GPL versija 3 arba vÄ—lesnÄ—\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Å i programa laisva: galite jÄ… keisti ir platinti.\n"
+"Nėra JOKIOS GARANTIJOS, kiek tai leidžia įstatymai.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Parašė Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+#, fuzzy
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Siųskite pranešimus apie klaidas ir pasiūlymus adresu <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Pabandykite „%s --help“, jei norite daugiau informacijos.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: netaisyklingas parametras – „-n%c“\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Negalima tuo paÄiu metu bÅ«ti informatyviam ir tyliam.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Negalima tuo paÄiu metu dÄ—ti laiko žymes ir nekeisti senų failų.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Negalima kartu nurodyti --inet4-only ir --inet6-only.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Negalima kartu nurodyti -k ir -O jei duoti keli URL, arba derinant su\n"
+"-p arba -r. Daugiau informacijos žinyne..\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ĮSPĖJIMAS: -O su -r arba -p reiškia, kad visas parsiųstas turinys bus\n"
+"įrašytas į vienintelį nurodytą failą.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ĮSPĖJIMAS: laiko žymių dėjimas nieko nedaro, jei derinamas su -O. Daugiau\n"
+"informacijos žinyne.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, fuzzy, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Negalima kartu nurodyti --inet4-only ir --inet6-only.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: trūksta URL\n"
+
+#: src/main.c:1836
+#, fuzzy, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Negalima kartu nurodyti --inet4-only ir --inet6-only.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, fuzzy, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Negalima kartu nurodyti --inet4-only ir --inet6-only.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: nepavyko rasti adreso „%s“\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "%s nerasta URL adresų.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Nepavyko pašalinti „%s“: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"BAIGTA --%s--\n"
+"Parsiųsta: %d failų, %s per %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Parsiuntimo kvota (%s) VIRÅ YTA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "TarpinÄ—s stoties tuneliavimas nesÄ—kmingas: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Nepavyko pašalinti „%s“: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Å alinamas %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Tęsiama fone.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Tęsiama fone, proceso numeris %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, fuzzy, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Išvestis bus įrašyta į „%s“.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Nepavyko rasti tinkamos lizdo valdyklÄ—s.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, fuzzy, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: įspėjimas: „%s“ yra prieš kompiuterio vardą\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: nežinomas elementas „%s“\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Naudojimas: %s NETRC [HOSTNAME]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: nepavyko patikrinti %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "DĖMESIO: naudojamas silpnas „random seed“.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Nepavyko inicializuoti PRNG; naudokite --random-file parametrÄ….\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Nekorektiškas URL adresas %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Nepavyko inicializuoti PRNG; naudokite --random-file parametrÄ….\n"
+
+#: src/openssl.c:1064
+#, fuzzy, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: nepavyko verifikuoti %s sertifikato, išduoto „%s“:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Nepavyko lokaliai verifikuoti išdavėjo autoriteto.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Rastas savo-pasirašytas sertifikatas.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " IÅ¡duotas sertifikatas dar nevalidus.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " IÅ¡duoto sertifikato galiojimo laikas baigÄ—si.\n"
+
+#: src/openssl.c:1174
+#, fuzzy, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr "%s: sertifikato vardas „%s“ neatitinka kompiuterio vardo „%s“.\n"
+
+#: src/openssl.c:1193
+#, fuzzy, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr "%s: sertifikato vardas „%s“ neatitinka kompiuterio vardo „%s“.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Jei norite jungtis prie %s nesaugiai, naudokite „--no-check-certificate“.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ praleidžiama %sK ]"
+
+#: src/progress.c:545
+#, fuzzy, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Netaisyklinga .wgetrc specifikacija „%s“: paliekama nepakeista.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " per "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Nepavyko gauti realaus laiko laikrodžio dažnio: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Šalinamas %s, nes jis turėtų būti atmestas.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nepavyko atverti %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Įkeliamas robots.txt; nekreipkite dėmesio į klaidas.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Klaida apdorojant tarpinÄ—s stoties URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Klaida tarpinės stoties URL %s: Turi būti HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "viršyta %d peradresavimų.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Pasiduodama.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Bandoma iš naujo.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Pasenusių nuorodų nerasta.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Rasta %d pasenusi nuoroda.\n"
+"\n"
+msgstr[1] ""
+"Rasta %d pasenusios nuorodos.\n"
+"\n"
+msgstr[2] ""
+"Rasta %d pasenusių nuorodų.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Jokios klaidos"
+
+#: src/url.c:677
+#, fuzzy, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nepalaikoma schema"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Netaisyklingas kompiuterio vardas"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Netaisyklingas prievado numeris"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Netaisyklingas naudotojo vardas"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Nebaigtas IPv6 skaitinis adresas"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adresai nepalaikomi"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Netaisyklingas IPv6 skaitinis adresas"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr ""
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, fuzzy, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Nepavyko išskirti %ld baitų; baigėsi atmintis.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Nepavyko išskirti %ld baitų; baigėsi atmintis.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Tęsiama fone, pid %d.\n"
+
+#: src/utils.c:558
+#, fuzzy, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nepavyko ištrinti simbolinės nuorodos „%s“: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr ""
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr ""
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr ""
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr ""
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Klaida rašant į „%s“: %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Klaida apdorojant tarpinÄ—s stoties URL %s: %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr ""
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#, c-format
+#~ msgid "%s: option `%s' is ambiguous\n"
+#~ msgstr "%s: pasirinkimas „%s“ dviprasmiškas\n"
+
+#, c-format
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: parametras „--%s“ neleidžia argumento\n"
+
+#, c-format
+#~ msgid "%s: option `%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: parametras „%c%s“ neleidžia argumento\n"
+
+#, c-format
+#~ msgid "%s: option `%s' requires an argument\n"
+#~ msgstr "%s: parametrui „%s“ reikia argumento\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: neatpažintas parametras „--%s“\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option `%c%s'\n"
+#~ msgstr "%s: neatpažintas parametras „%c%s“\n"
+
+#, c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: neleistinas pasirinkimas – %c\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- %c\n"
+#~ msgstr "%s: negalimas parametras – %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- %c\n"
+#~ msgstr "%s: parinkÄiai bÅ«tinas argumentas – %c\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: parametras „-W %s“ dviprasmis\n"
+
+#, c-format
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: parametras „-W %s“ neleidžia argumento\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorizavimas nepavyko.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s parsiųsta.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL prideda URL prie nuorodų, esanÄių -F -i "
+#~ "faile.\n"
+
+#~ msgid " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ msgstr " -w, --wait=SEKUNDĖS laukti SEKUNDES tarp siuntimų.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Šiuo metu prižiūri Micah Cowan <micah@cowan.name>.\n"
diff --git a/po/nb.gmo b/po/nb.gmo
new file mode 100644
index 0000000..6c6b4fc
--- /dev/null
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..342ae02
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,3651 @@
+# Norwegian (bokmål) translation of GNU wget
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Robert Schmidt <rsc@vingmed.no>, 1998.
+# Ã…ka Sikrom <a4@hush.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget-1.20\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2018-11-18 22:33+0100\n"
+"Last-Translator: Ã…ka Sikrom <a4@hush.com>\n"
+"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
+"Language: nb\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: klarte ikke å slå opp tildelt adresse %s. Slår av tildeling.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Kobler til %s|%s|:%d …"
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Kobler til %s:%d …"
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Kobler til [%s]:%d …"
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF mislyktes: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "tilkoblet.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "mislyktes: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: klarte ikke å slå opp vertsnavn %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR mislyktes: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"For mange åpne fds-er. Du kan ikke bruke «select» på fd som er større enn "
+"%d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Konverterte lenker i %d filer på %s sekund(er).\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Konverterer lenker i %s …"
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "intet å gjøre.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Klarte ikke å konvertere lenker i %s. %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Klarte ikke å slette %s. %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Klarte ikke å sikkerhetskopiere %s som %s. %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Klarte ikke å hente informasjonskapsel for %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaksfeil i Set-Cookie: %s ved posisjon %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "En informasjonskapsel fra %s prøvde å sette domene til"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Klarte ikke å åpne informasjonskapsel-fila %s. %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Feil ved skriving til %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Feil ved lukking av %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Visningstypen støttes ikke. Prøver Unix-visningstolk.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indeks av /%s på %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "ukjent tidspunkt "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fil"
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Mappe"
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Lenke"
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Usikkert"
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Lengde: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) gjenstår"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s gjenstår"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (ikke-autorativ)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Klarte ikke å starte SSL. SSL blir derfor slått av."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Logger inn som %s … "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Feil i tjenerresponsen. Lukker kontrolltilkobling.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Feil i hilsemelding fra tjener.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Skriving mislyktes. Lukker kontrolltilkobling.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Tjeneren nekter innlogging.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Feil brukernavn/passord.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Du er nå logget inn.\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Tjeneren godtok ikke kommandoen «PBSZ 0».\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Tjeneren godtok ikke kommandoen «PROT %c».\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Tjenerfeil. Klarte ikke å finne systemtype.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "ferdig. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "ferdig.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "«%c» er en ukjent type. Lukker kontrolltilkobling.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "ferdig. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD er unødvendig.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Logisk ugyldig seksjon er nådd i getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Mappa %s finnes ikke.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD kreves ikke.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fila er allerede hentet.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Klarte ikke å starte PASV-overføring.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Klarte ikke å tolke PASV-respons.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "klarte ikke å koble til %s, port %d. %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Blindfeil (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ugyldig PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST mislyktes. Begynner på nytt.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Fila %s finnes.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Fila %s finnes ikke.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Fila %s finnes ikke.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Fila eller mappa %s finnes ikke.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s har begynt å eksistere.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s. Lukker kontrolltilkobling.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - datatilkobling: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Kontrolltilkobling er lukket.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Dataoverføring avbrutt.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Fila %s ligger allerede der, og blir ikke hentet på nytt.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(prøv:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevet til standard utkanal %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s lagret [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Fjerner %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Bruker %s som midlertidig listefil.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Fjernet %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Hierarkidybde %d overskredet maksimumsdybden %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Ekstern fil er ikke nyere enn den lokale fila %s, og blir derfor lastet "
+"ned.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr "Ekstern fil er nyere enn den lokale fila %s, og blir lastet ned.\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Filene har ulik størrelse (%s lokalt), og den eksterne kopien lastes ned.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ugyldig navn på symbolsk lenke. Hopper over.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Korrekt symbolsk lenke %s -> %s finnes allerede\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Lager symbolsk lenke %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Symbolske lenker støttes ikke. Hopper over %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Hopper over mappa %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: filtypen er ukjent eller støttes ikke.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Klarte ikke å endre tillatelser til %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: ødelagt tidsstempel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Mapper blir ikke lastet ned, fordi hierarkidybden er %d (maksgrense er %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Tar ikke med innholdet i %s, fordi den er valgt utelukket.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Avviser %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Avviser %s (ugyldig oppføring).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s er utelatt/ekskludert med reg.uttrykk.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Feil ved utlikning av %s mot %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ingen treff på mønsteret %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Lagret indeks i HTML-format til %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Lagret indeks i HTML-format til %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "Feil: Klarte ikke å åpne mappa %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "FEIL: Klarte ikke å åpne sertifikatet s%s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Lastet inn CA-sertifikat «%s»\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "FEIL: Klarte ikke å laste inn CRL-fil «%s»: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Latet inn CRL-fil «%s»\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"FEIL: GnuTLS krever at nøkler og sertifikater skal være av samme type.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Installert GnuTLS-versjon er for gammel til å støtte TLSv1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: verdi %u er ikke implementert for valget «secure-protocol»\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Du bør rapportere dette problemet til bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: verdi %d er ikke implementert for valget «secure-protocol»\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Klarte ikke å endre prioritetsstreng skikkelig. Faller tilbake på "
+"forvalgt prioritet.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "FEIL"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "ADVARSEL"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s la ikke frem et sertifikat.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Sertifikatet på %s regnes ikke som pålitelig.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Sertifikatet på %s kommer ikke fra en kjent utgiver.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Sertifikatet på %s er tilbakekalt.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+"%s: Attestanten for sertifikatet %s er ikke en CA "
+"(sertifiseringsmyndighet).\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Sertifikatet på %s er signert med en usikker algoritme.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Sertifikatet på %s er ikke aktivt ennå.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Sertifikatet på %s er utgått.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Feil ved innlasting av X509-sertifikat: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Fant ingen sertifikat\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Feil ved lesing av sertifikat: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Sertifikatet er ikke aktivt ennå\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Sertifikatet er utgått\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Sertifikatets eier samsvarer ikke med vertsnavnet %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Offentlig nøkkel samsvarer ikke med tilknyttet offentlig nøkkel.\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Sertifikatet må være av typen X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Feil ved behandling av adresseliste.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ukjent vert"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Midlertidig feil i navnoppbygging"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ukjent feil"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Slår opp vertsnavn %s … "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "mislyktes: Ingen IPv4-/IPv6-adresser for vertsnavnet.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "mislyktes: tidsavbrudd.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Klarte ikke å gjøre oppslag på ufullstendig lenke %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: %s er en ugyldig nettadresse. %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Feil ved skriving av HTTP-forespørsel: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Ingen linjer. Antar at HTTP/0.9 er gjeldende"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Fila %s ligger allerede der, og blir ikke lastet ned på nytt.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime mislyktes. Dette er sannsynligvis en programfeil.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Klarte ikke å konvertere tidsstempel til http-format. Bruker «time 0» som "
+"tidspunkt for endring.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY-datafila %s mangler: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Bruker etablert tilkobling til [%s]:%d på nytt.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Bruker etablert tilkobling til %s:%d på nytt.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Lesing av respons fra mellomtjener mislyktes: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s PROGRAMFEIL %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Feilutformet statuslinje"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunnelsending via mellomtjener mislyktes: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ukjent autentiseringsmetode.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autentisering valgt: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Lagrer til: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Ved nedlasting av signatur:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Klarte ikke å lese signaturinnhold i midlertidig fil. Hopper over.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Klarte ikke å lage midlertidig fil. Hopper over nedlasting av signatur.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Ugyldig pri-verdi. Bruker %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Fant ingen akseptabel behandlingsmetode for Metalink-ressurser.\n"
+"De blir derfor ignorert.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Slår av SSL på grunn av oppståtte programfeil.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-forespørsel sendt. Venter på svar … "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ingen data mottatt.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Lesefeil (%s) i hodelinjer.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(ingen beskrivelse)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Plassering: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "ikke angitt"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [følgende]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Fila %s er ikke endret på tjener. Lar være å laste ned.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Tjeneren ignorerte hodet «If-Modified-Since» for fila %s.\n"
+"Du bør vurdere å bruke valget «--no-if-modified-since».\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Fila er allerede lastet ned i sin helhet.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Lengde: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorert"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Advarsel: jokertegn støttes ikke i HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Edderkoppmodus er slått på. Kontroller om ekstern fil finnes.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Klarte ikke å skrive til %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Obligatorisk attributt mangler på mottatt linje.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autentisering med brukernavn og passord mislyktes.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Klarte ikke å skrive til WARC-fil.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Klarte ikke å skrive til midlertidig WARC-fil.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Klarte ikke å sette opp SSL-tilkobling.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Klarte ikke å fjerne lenke til %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "PROGRAMFEIL: Videresending (%d) uten plassering.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Fant ingen Metalink-data i HTTP-svar. Bruker HTTP GET til å laste ned.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Fant Metalink-hoder. GÃ¥r i Metalink-modus.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Ekstern fil finnes ikke. Død lenke!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Linja «Last-modified» mangler. Tidsstempler er slått av.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Linja «Last-modified» er ugyldig. Tidsstempler ignoreres.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tjenerens fil er ikke nyere enn den lokale fila %s, og blir derfor ikke "
+"lastet ned.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Filene er av ulik størrelse (lokal: %s). Laster ned.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Ekstern versjon av fila er nyest, og blir lastet ned.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Ekstern fil finnes, og kan inneholde lenker til andre ressurser. Laster "
+"ned.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Ekstern fil finnes, men inneholder ingen lenke. Laster ikke ned.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Ekstern fil finnes, og kan inneholde flere lenker,\n"
+"men jobbing i undermapper er slått av. Laster ikke ned.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Ekstern fil finnes.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s nettadresse: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevet til standard utkanal %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s lagret [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Tilkobling lukket ved byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Lesefeil ved byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Lesefeil ved byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Beskyttelseskvalitet «%s» støttes ikke.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritmen «%s» støttes ikke.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC peker på %s, som ble avvist på grunn av feil: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Klarte ikke å lese %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Feil i %s på linje %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaksfeil i %s på linje %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: %s er en ukjent kommando i %s på linje %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Tolkning av systemets wgetrc-fil (miljøvar. «SYSTEM_WGETRC») mislyktes. "
+"Kontroller\n"
+"«%s»,\n"
+"eller velg en annen fil med «--config».\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Tolkning av systemets wgetrc-fil mislyktes. Kontroller\n"
+"«%s»,\n"
+"eller velg en annen fil med «--config».\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Advarsel: Både systemet og wgetrc peker på %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: %s er en ugyldig «--execute»-kommando\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: %s er en ugyldig boolsk verdi. Bruk «on» (på) eller «off» (av).\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: Ugyldig %s. Bruk «on» (på), «off» (av) eller «quiet» (stille).\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: %s er et ugyldig tall.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s kan bare brukes én gang\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: %s er en ugyldig byte-verdi\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: %s er en ugyldig tidsperiode\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: %s er en ugyldig tidsperiode\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass krever at miljøvariabel WGET_ASKPASS eller SSH_ASKPASS har en "
+"verdi.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: %s er en ugyldig verdi.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: %s er en ugyldig linje.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: %s er en ugyldig WARC-linje.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: %s er en ugyldig framdriftstype.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: %s er en ugyldig restriksjon.\n"
+" Bruk [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodinga %s er ugyldig\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konvertering fra %s til %s støttes ikke\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Fant ufullstendig eller ugyldig multibyte-sekvens\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Uhåndtert feilnummer %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: region er ikke valgt\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode mislyktes (%d). %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Klarte ikke å konvertere til små bokstaver: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Videresender utdata til %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s. Slår av loggføring.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Bruk: %s [VALG] … [NETTADRESSE] …\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumenter som er obligatoriske for lange valg, er også obligatoriske for "
+"korte valg.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Oppstart:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version vis versjonsinformasjon og avslutt.\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help vis denne hjelpeteksten\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background kjør i bakgrunnen etter oppstart\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=KOMMANDO kjør en kommando i «.wgetrc»-stil\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Loggføring og inndatafil:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FIL loggfør meldinger i valgt FIL\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FIL legg til meldinger i valgt FIL\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug skriv ut en haug av "
+"feilsøkingsinformasjon\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug skriv ut Watt-32-feilsøkingsinformasjon\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet stillemodus (ingen utdata)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose skriv ut detaljert info (dette er "
+"standard)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose ikke skriv ut detaljer, men ikke vær helt "
+"stille\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr " --report-speed=TYPE vis båndbredde som valgt TYPE bit\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FIL last ned nettadresser som finnes i valgt "
+"FIL\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FIL last ned filer som står oppført i lokal "
+"Metalink-FIL\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html behandle inndatafil som HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=ADR slår opp lenker i HTML-inndatafil («-i -"
+"F»)\n"
+" relativt til valgt nettADResse\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FIL velg oppsettsfil som skal brukes\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config ikke les oppsettsfil(er)\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FIL loggfør URL-avvisninger i valgt FIL\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Last ned:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ANT velg ANTall nye forsøk (0 betyr ubegrenset)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused prøv på nytt selv om tilkobling nektes\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=FEIL kommaseparert liste over HTML-tagger "
+"som skal prøves på nytt\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FIL lagre dokumenter i valgt FIL\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber hopp over nedlastinger som ville ha\n"
+" overskrevet eksisterende filer\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc ikke prøv å hente akkreditiver fra ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue fortsett nedlasting av en delvis "
+"nedlastet fil\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POS start nedlasting fra valgt POSisjon, talt fra "
+"null\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYPE velg en TYPE framdriftsviser\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress vis framdriftsviser uansett grad av "
+"detaljer som skrives ut\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ikke hent filer på nytt med mindre de er\n"
+" nyere enn de lokale\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ikke bruk betinget «if-modified-since»\n"
+" forespørsler i tidsstempel-modus\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ikke gi lokale filer samme tidsstempel\n"
+" som tjenerens filer\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response skriv ut svarmelding fra tjener\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ikke last ned noe\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDER bruk valgt antall SEKUNDER som generelt "
+"tidsavbrudd\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESSER liste over DNS-tjenere som skal spørres "
+"(adskilt med komma)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESSE knytt DNS-oppslagsverktøy til valgt "
+"ADRESSE (vertsnavn eller IP) på lokal vert\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEK bruk valgt antall SEKunder som DNS-"
+"tidsavbrudd\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEK bruk valgt antall SEKunder som "
+"tidsavbrudd for tilkobling\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEK bruk valgt antall SEKunder som "
+"tidsavbrudd for lesing\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SEK ta en pause i valgt antall SEKunder før "
+"neste fil hentes\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDER vent 1…SEKunder mellom gjentatte forsøk "
+"på nedlasting\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait vent fra 0.5*WAIT … 1.5*WAIT sekunder "
+"mellom nedlastinger\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy la aktivt være å bruke mellomtjener\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ANTALL bruk valgt ANTALL nedlastinger som kvote\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESSE tildel lokal vert valgt ADRESSE "
+"(vertsnavn eller IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=FART begrens nedlasting til valgt FART\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache slå av hurtiglagring av DNS-oppslag\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS bare la filnavn inneholde tegn som "
+"operativsystemet tillater\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ikke skill mellom store og små bokstaver "
+"ved sammenlikning av filer og mapper\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only bare koble til IPv4-adresser\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only bare koble til IPv6-adresser\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIE prøv først å koble til adreser innenfor "
+"valgt familie\n"
+" (enten «IPv6», «IPv4», eller «none»)\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=BRUKER bruk valgt BRUKER som både ftp- og http-"
+"bruker\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PASS bruk valgt PASSord som både ftp- og http-"
+"passord\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password be om passord\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=KOMMANDO velg akkreditiv-behandler som skal be "
+"om\n"
+" brukernavn og passord. Hvis ingen "
+"KOMMANDO er\n"
+" valgt, brukes miljøvariabel "
+"WGET_ASKPASS eller\n"
+" SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri slå av IRI-støtte\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr " --local-encoding=KOD bruk valgt lokal KODing av IRI-er\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOD bruk valgt KODing som standard ekstern "
+"koding\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink fjern fil før ting blir rotete\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash behold filer som ikke samsvarer med "
+"kontrollsum (legg til «.badhash»)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=TALL Metalenke application/metalink4+xml meta-"
+"adresse ordinær TALL\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http bruk Metalink-metadata fra HTTP-"
+"svarhoder\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location foretrukket plassering av Metalink-"
+"ressurser\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr slå av lagring av metadata i utvidede "
+"filattributter\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Mapper:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ikke lag nye mapper\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories tving opprettelse av mapper\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ikke lag vertsmapper\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories bruk protokollnavn på mapper\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIKS lagre filer i PREFIKS/…\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ANTALL ignorer valgt ANTALL eksterne "
+"mappekomponenter\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-valg:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=BRUKER bruk valgt BRUKER som http-bruker\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=PASS bruk valgt PASSord som http-passord\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache ikke tillat mellomlagring av data på "
+"tjener\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAVN Endre standard sidenavn (vanligvis «index."
+"html»)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension lagre HTML-/CSS-dokumenter med korrekt "
+"filetternavn\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length ignorer «Content-Length»-linja\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=STRENG sett inn STRENG blant hodelinjene\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYPE velg komprimering («auto», «gzip» eller "
+"«none»). (forvalgt: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksimalt antall videresendinger per side\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=BRUKER bruk valgt BRUKER som mellomtjener-"
+"brukernavn\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PASS bruk valgt PASSord som mellomtjener-"
+"passord\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=ADR ta med «Referer: ADR» i HTTP-forespørsel\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers lagre HTTP-hodelinjer i en fil\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT oppgi valgt AGENTnavn, i stedet for «Wget/"
+"VERSJON»\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive slå av «HTTP keep-alive» (bevaring av "
+"forbindelser)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ikke bruk informasjonskapsler\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FIL last inn infokapsler fra valgt FIL før en "
+"økt startes\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FIL lagre infokapsler i valgt FIL når økta er "
+"ferdig\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies last inn og lagre (ikke-permanente) "
+"infokapsler for økter\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRENG bruk POST-metoden og send valgt STRENG\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FIL bruk POST-metoden og send innholdet i "
+"valgt FIL\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTP-metode bruk metoden «HTTP-metode» i HTTP-hodet\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRENG send valgt STRENG som data (NB: «--"
+"method» MÅ være valgt)\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FIL send innhold i valgt FIL (NB: «--method» "
+"MÅ være valgt)\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition ta hensyn til «Content-Disposition»-linja "
+"ved\n"
+" valg av filnavn (USTABILT)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error skriv ut mottatt innhold i feilmeldinger "
+"fra tjener\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge send elementær HTTP-autentiseringsinfo\n"
+" uten å vente på etterspørsel fra\n"
+" tjeneren.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS(SSL-/TLS-)-valg :\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR velg sikkerhetsprotokoll. Enten «auto», "
+"«SSLv2»,\n"
+" «SSLv3», «TLSv1», «TLSv1_1, «TLSv1_2» "
+"eller «PFS».\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only bare følg HTTPS-lenker\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate ikke kontroller tjenerens sertifikat\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FIL klientens sertifikatFIL\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE klientens sertifikatTYPE («PEM» eller "
+"«DER»)\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FIL privatnøkkel-FIL\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYPE type privatnøkkel («PEM» eller «DER»)\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=FIL fil med liste over CA-er "
+"(sertifikatutstedere)\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=MAPPE hvilken MAPPE nøkkellista over CA-er "
+"ligger i\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FIL fil med liste over CRL-er\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FIL/KONTR.SUM Offentlig (PEM-/DER-) nøkkelfil, eller\n"
+" «sha256//» etterfulgt av én eller flere "
+"base64-kodede\n"
+" sha256-kontrollsummer adskilt med «;»,\n"
+" til bekreftelse av motpart\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FIL fil med vilkårlighetsdata for SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FIL fil med vilkårlighetsdata for navngivning "
+"av EGD-sokkel\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Velg prioritetsstreng (GnuTLS) eller "
+"algoritmeliste-streng (OpenSSL) direkte.\n"
+" Bruk med varsomhet. Dette valget "
+"overstyrer «--secure-protocol».\n"
+" Format og syntaks for denne strengen "
+"avhenger av hvilken SSL-/TLS-motor som i er i bruk.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS-valg:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts slå av HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file sti til HSTS-database (overstyrer "
+"standardsti)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-valg:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf bruk formatet Stream_LF på alle binære "
+"FTP-filer\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=BRUKER bruk valgt BRUKER som ftp-bruker\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=PASS bruk valgt PASSord som ftp-passord\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ikke fjern «.listing»-filer\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob skru av bruk av jokertegn i FTP-filnavn\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp slå av «passiv» overføringsmodus\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions behold tjenerens oppsett av "
+"filtillatelser\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks hent lenkemål (unntatt mapper) ved arbeid "
+"i mappehierarkier\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS-valg:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit bruk implisitt FTPS (standardport er "
+"990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl gjenoppta SSL-/TLS-økt fra "
+"kontrolltilkobling ved åpning av\n"
+" datatilkobling\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection bare krypter kontroll-kanalen (alle "
+"data sendes i form av ren tekst)\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp bruk FTP hvis FTPS ikke støttes av "
+"tjeneren\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC-valg:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILNAVN lagre foresp.-/svardata i en «.warc.gz»-"
+"fil\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=STRENG sett inn valgt STRENG i warcinfo-"
+"oppføringa\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=TALL bruk valgt TALL som maksimal størrelse på "
+"WARC-filer\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx skriv CDX-indeksfiler\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FILNAVN ikke lagre oppføringer som er oppført i "
+"denne CDX-fila\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression ikke komprimer WARC-filer med GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ikke beregn SHA1-kontrollsummer\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log ikke lagre loggfil i en WARC-oppføring\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=MAPPE plassering av midlertidige WARC-filer\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Nedlasting av underliggende hierarki:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive last ned underliggende filer og/eller "
+"mapper\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=TALL maksimal hierarkidybde (bruk «inf» eller 0 "
+"for ubegrenset)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after slett filer lokalt nå de er ferdig lastet "
+"ned\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links gjør om lenker i nedlastede HTML- og/"
+"eller CSS-filer,\n"
+" slik at de peker på lokale filer\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only bare konverter fil-del av adresser "
+"(vanligvis kjent som basenavn eller «basename»)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N rullér på N antall sikkerhetskopier før "
+"fil X lagres\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted sikkerhetskopier fil X som X_orig før den "
+"konverteres\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted sikkerhetskopier fil X som X_orig før den "
+"konverteres\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror tilsvarer «-N -r -l inf --no-remove-"
+"listing»\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites hent alle bilder osv. som behøves for å "
+"vise aktuelle HTML-sider\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments slå på streng håndtering av HTML-"
+"kommentarer (SGML)\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Godkjenning/avvisning i hierarkier:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTE kommaseparert liste over filetternavn som "
+"skal godtas\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTE kommaseparert liste over filetternavn som "
+"skal avvises\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REG.UTTR. uttrykk for nettadresser som skal godtas\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REG.UTTR. uttrykk for nettadresser som skal "
+"avvises\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TYPE uttrykkstype (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYPE uttrykkstype (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTE kommaseparert liste over domener som skal "
+"godtas\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTE kommaseparert liste over domener som skal "
+"avvises\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr " --follow-ftp følg FTP-lenker i HTML-dokumenter\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTE kommaseparert liste over HTML-tagger som "
+"skal følges\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTE kommaseparert liste over HTML-tagger som "
+"skal ignoreres\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts følg hierarkiske stier som leder til "
+"tredjepartsvert\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative bare følg relative lenker\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTE liste over mapper som skal godtas\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names bruk navn fra siste del av "
+"videresendingsadressen\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LISTE liste over mapper som skal utelukkes\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ikke gå opp til foreldermappa\n"
+
+#: src/main.c:1031
+#, fuzzy
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"og/eller send inn problemrapporter på https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, et ikke-interaktivt nedlastingsverktøy.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Passord for %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Passord: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Klarte ikke å lage datarør\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Feil under oppstart av filhandlinger for use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Feil under oppsett av filhandlinger for use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Feil under lesing av kommandosvar «%s %s»: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Brukernavn for «%s%s»: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Passord «%s%s@%s»: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Region: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilering: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Lenke: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s bygget %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (miljø)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (bruker)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Opphavsrett (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Lisens GPLv3+: GNU GPL versjon 3 eller senere\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Dette er fri programvare. Du står fritt til å endre og/eller dele den "
+"videre.\n"
+"Det stilles INGEN GARANTI, i den grad aktuelt lovverk tillater det.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Opprinnelig skrevet av Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Send feilrapporter og spørsmål til<bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Minnetidelingsfeil\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Avslutter på grunn av problemer med %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Prøv «%s --help» for flere valg.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: «-n%c» er et ugyldig valg\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Feilsøkingsstøtte er ikke innebygd. Valget «--debug» ignoreres.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Du har valgt både «--no-clobber» og «--convert-links». Det er bare «--"
+"convert-links» som blir brukt.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Du har valgt både «--no-clobber» og «--convert-file-only». Kun sistnevnt "
+"blir brukt.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Du kan ikke velge både stille- og detaljert modus samtidig.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Du kan ikke velge både tidsstempling og ryddighold av gamle filer samtidig.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Du kan ikke velge både «--inet4-only» og «--inet6-only» samtidig.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Du kan ikke kombinere «-k» og «--convert-file-only» med «-O» hvis flere "
+"adresser og/eller\n"
+"«-p» eller «-r» er valgt. Se bruksanvisning for mer info.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ADVARSEL: kombinasjonen «-O» og enten «-r» eller «-p» betyr at alt nedlastet "
+"innhold\n"
+"legges i den ene fila du valgte.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ADVARSEL: tidsstempling fungerer ikke i kombinasjon med «-O».\n"
+"Les bruksanvisninga for ytterligere info.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC-utdata fungerer ikke i kombinasjon med «--no-clobber». «--no-clobber» "
+"blir derfor slått av.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC-utdata fungerer ikke i kombinasjon med tidsstempling. Tidsstempling "
+"blir derfor slått av.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC-utdata fungerer ikke i kombinasjon med «--spider».\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-utdata fungerer ikke i kombinasjon med «--continue». Begge deler blir "
+"derfor slått av.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Kontrollsummering er slått av. WARCs anti-duplikatverktøy er ute av stand "
+"til å finne duplikater.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Komprimering fungerer ikke med «--continue» eller «--start-pos». Begge deler "
+"blir derfor slått av.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Du kan ikke bruke både «--ask-password» og «--password» samtidig.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Bruk av «--start-pos» og «--continue» samtidig anbefales ikke. «--continue» "
+"blir derofr slått av.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: nettadresse mangler\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Du kan ikke bruke både «--post-data» og «--post-file» samtidig.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"«--post-data» og «--post-file» kan ikke brukes i kombinasjon med «--method». "
+"Sistnevnte forventer data via valgene «--body-data» og «--body-file»\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Valgene «--body-data» eller «--body-file» krever at du velger «--method=HTTP-"
+"METODE» .\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Du kan ikke bruke både «--body-data» og «--body-file».\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Denne versjonen støtter ikke IRI-er\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"Valgene «-k» og «-r» kan bare brukes samtidig med «-O» hvis utdata er en "
+"vanlig fil.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"valgene «--convert-links» og «--convert-file-only» kan bare brukes samtidig "
+"hvis utdata er en vanlig fil.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Klarte ikke å starte libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Klarte ikke å starte «c-ares»-kanal\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Klarte ikke å tolke IP-adresse «%s»\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Klarte ikke å endre DNS-tjener(e) «%s» (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Fant ingen nettadresser i %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Klarte ikke å lese metalink-fila %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Klarte ikke å laste ned alle ressurser fra %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FERDIG --%s--\n"
+"Totalt medgått tid: %s\n"
+"Lastet ned: %d filer, %s på %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Nedlastingsgrense på %s OVERSKREDET!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "valget «-O» støttes ikke ved bruk av metalink, og blir ignorert.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planlagt metalenke-fil: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Sikret metalenke-fil: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Avviser metalenke-fil. Utrygt navn.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Behandler metaadresse %s …\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Avviser metaadresse-fil %s. Utrygt navn.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Klarte ikke å laste ned %s. Hopper over metaadresse.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Klarte ikke å tolke metaadresse-fil %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Metaadresse-behandling svarte med feilmelding.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Ressurstype %s støttes ikke, og blir ignorert …\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Klarte ikke å åpne nedlastet fil.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Beregner størrelse på %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Filstørrelse ikke klarert. Hopper over sjekk.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Klarte ikke å hente størrelse på nedlastet fil.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Størrelsen på %s stemmer ikke.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Størrelse stemmer.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Beregner kontrollsum for %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrollsum stemmer.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Kontrollsum for fila %s stemmer ikke.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Klarte ikke å åpne nedlastet fil for signatur-bekreftelse.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Signaturbekreftelse vellykket.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Ugyldig signatur. Avviser ressurs.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Data stemmer med signatur, med signaturen er ubekreftet.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Fant ingen kontrollsummer.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Klarte ikke å laste ned %s. Hopper over ressurs.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Fila %s ble hentet, men størrelsen stemmer ikke. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Fila %s ble hentet, men kontrollsummen stemmer ikke. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Fila %s ble hentet, men signaturen stemmer ikke. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Endrer navn på %s til %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Fortsetter i bakgrunnen.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Fortsetter i bakgrunnen med PID %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Utdata blir skrevet til %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() mislyktes\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() mislyktes\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Fant ingen brukbar sokkeldriver.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() mislyktes. Klarte ikke å sette opp sokkelen som blokkering.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: advarsel: symbolet %s dukker opp før maskinnavn\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: «%s» er et ukjent symbol\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Bruk: %s NETRC [VERTSNAVN]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: klarte ikke å lage statistikk av %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "ADVARSEL: du bruker en svak kilde for vilkårlighetsdata.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Klarte ikke å bruke tilfeldighetsdata med PRNG. Du bør vurdere å bruke "
+"valget «--random-file».\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Installert OpenSSL-versjon er for gammel til å støtte TLSv1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Installert OpenSSL-versjon er for gammel til å støtte TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Installert OpenSSL-versjon er for gammel til å støtte TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: verdi %d er ikke implementert for valget «secure-protocol»\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Ugyldig algoritmeliste: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"Klarte ikke å bruke hente data fra PRNG. Du bør vurdere å bruke valget «--"
+"random-file».\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: sertifikat for %s (utgitt av %s) kunne ikke bekreftes.\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Klarte ikke å bekrefte utgiverens autoritet lokalt.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Mottok selvgenerert sertifikat.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Mottatt sertifikat er ikke gyldig ennå.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Mottatt sertifikat er utgått.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: ingen alternative navn på sertifikatsubjektet\n"
+"\tsamsvarer med vertsnavn %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: sertifikatnavnet %s samsvarer ikke med forespurt vertsnavn %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: sertifikatnavnet er ugyldig (inneholder NUL-tegn).\n"
+" Dette kan bety at verten ikke er den den utgir seg for å være\n"
+" (tjeneren er altså ikke den egentlige %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Bruk «--no-check-certificate» for å koble til %s uten sikkerhet.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ hopper over %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "%s er en ugyldig punktstil-spesifikasjon. Lar den stå uendret.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " på "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Klarte ikke å hente klokkefrekvensen for REALTIME. %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Fjerner %s, fordi den skal avvises.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Klarte ikke å åpne %s. %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Laster inn «robots.txt». Ignorer feilmeldinger.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Feil ved tolkning av nettadressen %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Feil i mellomtjeneradressen %s. Denne må være HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d videresendinger overskredet.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Gir opp.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Prøver på nytt.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Fant ingen ødelagte lenker.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Fant %d ødelagt lenke.\n"
+"\n"
+msgstr[1] ""
+"Fant %d ødelagte lenker.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ingen feilmelding"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Skjemaet %s støttes ikke"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Skjema mangler"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Ugyldig vertsnavn"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ugyldig portnummer"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ugyldig brukernavn"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Ufullstendig IPv6-adresse"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-adresser støttes ikke"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ugyldig IPv6-adresse"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS-støtte er ikke innebygget i denne versjonen"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Fant multibyte-sekvens som ikke lar seg konvertere\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Klarte ikke å tildele nok minne. Minnet er fullt.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Klarte ikke å tildele %ld byte. Minnet er fullt.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: mellomlager for tekst er for stort (%d byte). Avbryter.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Fortsetter i bakgrunnen med PID %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Klarte ikke å fjerne lenke fra den symbolsk lenka %s. %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Klarte ikke å utføre Fopen på fil %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Klarte ikke å hente FD for fil %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Klarte ikke å hente info om fil %s, (kontroller tillatelser)\n"
+
+#: src/utils.c:902
+#, fuzzy, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Fila %s er blitt changed siden forrige sjekk. Sikkerhetskontroll mislyktes."
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Klarte ikke å åpne fil %s. Årsak :%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Klarte ikke å hente info om fil %s. Feil: %s\n"
+
+#: src/utils.c:953
+#, fuzzy, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Prøver å åpne fila %s, men den er blitt endret siden forrige sjekk. "
+"Sikkerhetskontroll mislyktes."
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Regulært uttrykk %s er ugyldig. PCRE2-feil %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "%s er et ugyldig regulært uttrykk. %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Feil ved bruk av %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Hopper over nøkkel med feil størrelse (%d/%d): %s\n"
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Feil ved åpning av WARC-fil %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Feil ved åpning av WARC-fil %s.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Klarte ikke å duplisere fildeskriptor for WARC-fil.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Feil ved åpning av GZIP-strøm til WARC-fil.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Feil ved skriving av warcinfo-oppføring til WARC-file.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Ã…pner WARC-fil %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Feil ved åpning av WARC-fil %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"CDX-fil inneholder ikke originale nettadresser (kolonne «a» mangler).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX-fil inneholder ikke kontrollsummer (kolonne «k» mangler).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"CDX-fil- inneholder ikke ID-er for oppføringer (kolonne «u» mangler).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Lastet inn %d oppføring fra CDX.\n"
+"\n"
+msgstr[1] ""
+"Lastet inn %d oppføringer fra CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Klarte ikke å lese CDX-fila %s for å se etter duplikater.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Klarte ikke å åpne midlertidig WARC-manifestfil.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Klarte ikke å åpne midlertidig WARC-loggfil.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Klarte ikke å åpne WARC-fil.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Klarte ikke å åpne CDX-fil for skriving av utdata.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Klarte ikke å åpne midlertidig WARC-fil.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Fant identisk oppføring i CDX-fil. Lagrer oppføring for tilbakesporing i "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Ukjent systemfeil"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adressefamilie for vertsnavn støttes ikke"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ai_flags har ugyldig verdi"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Ikke-gjenopprettbar feil i navnoppbygging"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family støttes ikke"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Feil ved minnetildeling"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Ingen adresse forbindes med vertsnavnet"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Navnet eller tjenesten er ukjent"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Tjenernavnet støttes ikke for ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype støttes ikke"
+
+#~ msgid "System error"
+#~ msgstr "Systemfeil"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argument-mellomlageret er for lite"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Behandler forespørsel"
+
+#~ msgid "Request canceled"
+#~ msgstr "Forespørselen ble avbrutt"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Forespørselen er ikke avbrutt"
+
+#~ msgid "All requests done"
+#~ msgstr "Alle forespørsler er utført"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Brutt av et signal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parameter-strengen er ikke kodet korrekt"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: valget «%s%s» er flertydig\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: valget «%s%s» er flertydig, og kan bety følgende:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: «%s%s» er et ukjent valg\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: valget «%s%s» tillater ikke bruk av argumenter\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: valget «%s%s» krever et argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: «%c» er et ugyldig valg\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: «%c» krever et argument\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "Success"
+#~ msgstr "Vellykket"
+
+#~ msgid "No match"
+#~ msgstr "Ingen treff"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Ugyldig regulært uttrykk"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ugyldig sorteringstegn"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ugyldig tegnklassenavn"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Etterfølgende omvendt skråstrek"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Ugyldig tilbakereferanse"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Ingen treff på «[», «[^», «[:», «[.» eller «[=»"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Ingen treff på «(» eller «\\(»"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Ingen treff på «\\{»"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Ugyldig innhold i «\\{\\}»"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Ugyldig ende på rekkevidde"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Minnet er oppbrukt"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Ugyldig foregående regulært uttrykk"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "For tidlig slutt på regulært uttrykk"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regulært uttrykk er for stort"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Ingen treff på «)» eller «\\)»"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Intet tidligere regulært uttrykk"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "klarte ikke å lage datarør"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "underprosess av %s mislyktes"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle mislyktes"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "klarte ikke å gjenopprette fd %d. dup2 mislyktes"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "underprosess av %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "underprosess av %s fikk kritisk feilsignal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "minnet er oppbrukt"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Send feilrapporter, spørsmål og diskusjoner til <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: valget «--%s» tillater ikke bruk av argumenter\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: «--%s» er et ukjent valg\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: valget «-W %s» er flertydig\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: valget «-W %s» tillater ikke bruk av argumenter\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: valget «-W %s» krever et argument\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Fila «%s» ligger der allerede, og blir ikke lastet ned igjen.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "%s er en ugyldig UTF-8-sekvens\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode mislyktes (%d). %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s mottatt.\n"
diff --git a/po/nl.gmo b/po/nl.gmo
new file mode 100644
index 0000000..ac2cf4f
--- /dev/null
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..08f9c86
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,3670 @@
+# Dutch translations for GNU wget.
+# Copyright (C) 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# '''Oh, all the things you could see she had no need of!'''
+#
+# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2006, 2007, 2008, 2010, 2012, 2013, 2015.
+# Erwin Poeze <erwin.poeze@gmail.com>, 2009.
+# Elros Cyriatan <cyriatan@fastmail.fm>, 2004.
+# André van Dijk <ady@unseen.demon.nl>, 1998.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.16.3.124\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2015-09-23 11:42+0200\n"
+"Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\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-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: kan bindingsadres '%s' niet herleiden; binding wordt uitgeschakeld.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Verbinding maken met %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Verbinding maken met %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Verbinding maken met [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "verbonden.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "mislukt: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: kan host-adres '%s' niet herleiden\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Er zijn %d bestanden geconverteerd in %s seconden.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Converteren van koppelingen in %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "er is niets te doen.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Kan hyperlinks in %s niet converteren: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Kan '%s' niet verwijderen: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Kan geen reservekopie %2$s van %1$s maken: %3$s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Kan geen cookie verkrijgen voor %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaxfout in 'Set-Cookie'-kopregel: %s op positie %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Een cookie afkomstig van %s probeerde het domein in te stellen als "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Kan cookiesbestand '%s' niet openen: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Fout bij schrijven naar '%s': %s.\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Fout bij sluiten van '%s': %s.\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Niet-ondersteunde lijstsoort; Unix-lijstontleder wordt geprobeerd.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index van /%s op %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "tijd onbekend "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Bestand "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Map "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Koppeling "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Onzeker "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Lengte: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) resterend"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s resterend"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (onzeker)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Kan SSL niet initialiseren. Het wordt uitgeschakeld."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Inloggen als %s... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Fout in server-antwoord -- de besturingsverbinding wordt gesloten.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Fout in server-groet.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Schrijffout -- de besturingsverbinding wordt gesloten.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "De server weigert de login.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Login onjuist.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Ingelogd!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Server accepteerde de opdracht 'PBSZ 0' niet.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Server accepteerde de opdracht 'PROT %c' niet.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Serverfout -- kan systeemsoort niet bepalen.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "gereed. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "gereed.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Onbekend soort '%c' -- de besturingsverbinding wordt gesloten.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "gereed. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD is niet nodig.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "**Interne programmafout**: onmogelijk punt bereikt in getftp()."
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count = %d\n"
+"cwd_start = %d\n"
+"cwd_end = %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Map '%s' bestaat niet.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD is niet vereist.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Bestand is reeds opgehaald.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Kan geen PASV-transport starten.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Kan PASV-antwoord niet verwerken.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "Kan geen verbinding maken met %s op poort %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bindingsfout (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ongeldige PORT-opdracht.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST-opdracht is mislukt; van voren af aan begonnen.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Bestand '%s' bestaat.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Bestand '%s' bestaat niet.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Bestand '%s' bestaat niet.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Bestand of map '%s' bestaat niet.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s is zojuist ontstaan.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s -- de besturingsverbinding wordt gesloten.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Gegevensverbinding: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Besturingsverbinding is gesloten.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Gegevensoverdracht is afgebroken.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Bestand '%s' is reeds aanwezig -- wordt niet opgehaald.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(poging %2d) "
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - weggeschreven naar standaarduitvoer %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - '%s' opgeslagen [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Verwijderen van %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "'%s' wordt gebruikt als tijdelijk lijstbestand.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "'%s' is verwijderd.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Recursiediepte %d heeft maximum diepte %d overschreden.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Bestand op server is niet nieuwer dan lokaal bestand '%s' -- wordt niet "
+"opgehaald.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Bestand op server is nieuwer dan lokaal bestand '%s' -- ophalen.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"De groottes komen niet overeen (is lokaal %s) -- ophalen.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ongeldige naam voor een symbolische koppeling, wordt overgeslagen.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Correcte symbolische koppeling bestaat al: %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Maken van symbolische koppeling: %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Symbolische koppelingen worden niet ondersteund; '%s' wordt overgeslagen.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Map '%s' wordt overgeslagen.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: onbekende of niet-ondersteunde bestandssoort.\n"
+
+#: src/ftp.c:2427
+#, fuzzy, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Kan geen cookie verkrijgen voor %s\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: beschadigd tijdsstempel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Mappen worden niet opgehaald, want de diepte is %d (maximaal %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+"Er wordt niet afgedaald naar '%s', want deze is uitgesloten of niet "
+"ingesloten.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "'%s' wordt verworpen.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "'%s' wordt verworpen.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+"Er wordt niet afgedaald naar '%s', want deze is uitgesloten of niet "
+"ingesloten.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Fout bij vergelijken van '%s' met '%s': %s.\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Geen overeenkomsten met patroon '%s'.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Index is in HTML-vorm naar '%s' [%s] geschreven.\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Index is in HTML-vorm naar '%s' geschreven.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "FOUT: Kan map %s niet openen.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "FOUT: Kan certificaat %s niet openen: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "CA-certificaat '%s' is geladen\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "FOUT: Kan CRL-bestand '%s' niet laden: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "CRL-bestand '%s' is geladen\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"FOUT: GnuTLS eist dat sleutel en certificaat van hetzelfde type zijn.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Uw OpenSSL-versie is te oud om TLSv1.1 te ondersteunen.\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: niet-geïmplementeerde 'secure-protocol'-optiewaarde %d\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Rapporteer dit gebrek aan <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: niet-geïmplementeerde 'secure-protocol'-optiewaarde %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "FOUT"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "WAARSCHUWING"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Geen certificaat aangeboden door %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Het certificaat van '%s' wordt niet vertrouwd.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Het certificaat van '%s' heeft een onbekende uitgever.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Het certificaat van '%s' is herroepen.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: De certificaatondertekenaar van '%s' was geen CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: Het certificaat van '%s' werd ondertekend met een onveilig algoritme.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Het certificaat van '%s' is nog niet geactiveerd.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Het certificaat van '%s' is verlopen.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Fout tijdens initialiseren van X509-certificaat: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Geen certificaat gevonden\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Fout tijdens ontleden van certificaat: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Het certificaat is nog niet geactiveerd\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Het certificaat is verlopen\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "De certificaateigenaar komt niet overeen met hostnaam '%s'\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Het certificaat moet een X.509 zijn.\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Fout bij verwerken van adressenlijst.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Onbekende host"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Tijdelijk probleem in naamsherleiding"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Onbekende fout"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Herleiden van %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "mislukt: geen IPv4/IPv6-adressen gevonden voor de host.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "mislukt: wachttijd is verstreken.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Kan doel van onvolledige hyperlink %s niet bepalen.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ongeldige URL '%s': %s.\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Schrijven van HTTP-verzoek is mislukt: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Geen kopregels aanwezig; HTTP/0.9 aangenomen."
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Bestand '%s' is reeds aanwezig -- wordt niet opgehaald.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+"Functie gmtime() is mislukt. Dit is waarschijnlijk een programmafout.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY-gegevensbestand '%s' ontbreekt: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Verbinding met [%s]:%d wordt hergebruikt.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Verbinding met %s:%d wordt hergebruikt.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Lezen van proxy-antwoord is mislukt: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s Fout %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Onjuiste statusregel"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Het tunnelen door een proxy is mislukt: %s."
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Onbekend aanmeldingsschema.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Geselecteerde authenticatie: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Wordt opgeslagen als: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Bij downloaden van ondertekening:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Kan inhoud van ondertekening niet lezen uit tijdelijk bestand. "
+"Overgeslagen.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Kan geen tijdelijk bestand aanmaken. Downloaden van ondertekening wordt "
+"overgeslagen.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Wegens fouten wordt SSL uitgeschakeld.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-verzoek is verzonden; wachten op antwoord... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Geen gegevens ontvangen.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Leesfout (%s) in kopregels.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(geen omschrijving)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Locatie: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "niet-opgegeven"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [volgen...]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Het bestand is reeds volledig opgehaald; er is niets te doen.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Lengte: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "genegeerd"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Waarschuwing: jokertekens zijn bij HTTP niet mogelijk.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Spider-modus: controleren of bestand bestaat op server.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Kan niet naar '%s' schrijven (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Vereiste eigenschap ontbreekt in ontvangen kopregels.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Authenticatie met gebruikersnaam/wachtwoord is mislukt.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Kan niet naar WARC-bestand schrijven.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Kan niet naar tijdelijk WARC-bestand schrijven.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Kan geen SSL-verbinding maken.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Kan %s niet verwijderen (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "Fout: doorverwijzing (%d) zonder locatie.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Bestand bestaat niet op server -- verbroken hyperlink!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"'Last-modified'-kopregel ontbreekt -- tijdsstempels worden uitgeschakeld.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"'Last-modified'-kopregel is ongeldig -- tijdsstempel wordt genegeerd.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Bestand op server is niet nieuwer dan lokaal bestand '%s' -- wordt niet "
+"opgehaald.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "De groottes komen niet overeen (is lokaal %s) -- ophalen.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Bestand op server is nieuwer -- ophalen.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Bestand bestaat op server en zou hyperlinks kunnen bevatten -- ophalen.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Bestand bestaat op server maar bevat geen hyperlinks -- wordt niet "
+"opgehaald.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Bestand bestaat op server en zou verdere hyperlinks kunnen bevatten,\n"
+"maar recursie is uitgeschakeld -- wordt niet opgehaald.\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Bestand bestaat op server.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - geschreven naar standaarduitvoer %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - '%s' opgeslagen [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Verbinding werd verbroken bij byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Leesfout bij byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Leesfout bij byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Niet-ondersteunde beschermingskwaliteit '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Niet-ondersteund algoritme '%s'.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: De variabele WGETRC wijst naar %s, maar deze bestaat niet.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Kan '%s' niet lezen (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Fout in %s op regel %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaxfout in %s op regel %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Onbekende opdracht '%s' in %s op regel %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Ontleden van globaal wgetrc-bestand (env SYSTEM_WGETRC) is mislukt.\n"
+"Controleer de inhoud van '%s',\n"
+"of geef een ander bestand op met '--config'.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Ontleden van globaal wgetrc-bestand is mislukt.\n"
+"Controleer de inhoud van '%s',\n"
+"of geef een ander bestand op met '--config'.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Waarschuwing: zowel de systeem- als gebruikers-wgetrc wijzen naar '%s'.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Ongeldige opdracht '%s' bij '--execute'.\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Ongeldige booleaan '%s' -- gebruik 'on' of 'off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Ongeldige booleaan '%s' -- gebruik 'on' of 'off'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ongeldig aantal '%s'.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s mag slechts één keer gebruikt worden\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ongeldige byte-waarde '%s'\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ongeldig tijdsinterval '%s'\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Ongeldig tijdsinterval '%s'\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ongeldige waarde '%s'\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ongeldige kopregel '%s'\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ongeldige WARC-kopregel '%s'\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ongeldig voortgangstype '%s'.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Ongeldige beperking '%s';\n"
+" gebruik [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Codering %s is niet geldig\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, fuzzy, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Omzetting van %s naar UTF-8 wordt niet ondersteund\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Incomplete of ongeldige multibyte-volgorde aangetroffen\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Onafgehandeld foutnummer %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8(): locale is niet ingesteld\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode() is mislukt (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Kan geen verbinding maken met %s op poort %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s ontvangen; uitvoer wordt omgeleid naar '%s'.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; bijhouden van logboek wordt uitgeschakeld.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Gebruik: %s [OPTIE]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"(De argumenten bij lange opties gelden ook voor de korte vormen.)\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Opstarten:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version programmaversie tonen en stoppen\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help deze hulptekst tonen en stoppen\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background na opstarten naar de achtergrond gaan\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=OPDRACHT deze OPDRACHT (in '.wgetrc'-stijl) uitvoeren\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Logboek en invoerbestand:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=BESTAND meldingen opslaan in BESTAND\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=BESTAND meldingen toevoegen aan BESTAND\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug uitgebreide debuguitvoer tonen\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug 'Watt-32'-debuguitvoer tonen\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet stil zijn (geen uitvoer produceren)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose gedetailleerde uitvoer produceren "
+"(standaard)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose beknopte uitvoer (maar niet geheel stil)\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE bandbreedte tonen als TYPE; TYPE kan 'bits' "
+"zijn\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr " -i, --input-file=BESTAND URL's uit dit BESTAND lezen\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --metalink-file URL's uit lokaal of extern metalink bestand "
+"lezen\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html invoerbestand als HTML behandelen\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL koppelingen in HTML-invoerbestanden (-i -F)\n"
+" herleiden relatief tot URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=BESTAND te gebruiken configuratiebestand\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config geen configuratiebestand lezen\n"
+
+#: src/main.c:641
+#, fuzzy
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " -o, --output-file=BESTAND meldingen opslaan in BESTAND\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Downloaden:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=AANTAL maximaal dit AANTAL herhalingspogingen doen\n"
+" ('0' voor onbegrensd)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused ook bij geweigerde verbinding opnieuw "
+"proberen\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr " --ignore-tags=LIJST deze HTML-tags negeren\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+" -O, --output-document=BSTND alle documenten naar dit ene BSTND "
+"schrijven\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber downloads overslaan die bestaande bestanden\n"
+" zouden overschrijven\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-config geen configuratiebestand lezen\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue voortzetten van gedeeltelijk opgehaald "
+"bestand\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POSITIE downloaden starten vanaf deze POSITIE "
+"(0=begin)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYPE dit TYPE voortgangsmeter gebruiken\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress de voortgangsbalk tonen\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping bestanden niet opnieuw ophalen tenzij ze "
+"nieuwer\n"
+" zijn dan lokale bestanden\n"
+
+#: src/main.c:671
+#, fuzzy
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-use-server-timestamps tijdsstempel van lokale bestanden niet "
+"kopiëren\n"
+" van die op de server\n"
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps tijdsstempel van lokale bestanden niet "
+"kopiëren\n"
+" van die op de server\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response antwoord van server tonen\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider niets ophalen, alleen kijken\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECONDEN alle wachttijden instellen op SECONDEN\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=ADRES binden aan ADRES (hostnaam of IP) op "
+"localhost\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECONDEN DNS-opzoekwachttijd instellen op SECONDEN\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SCNDN verbindingswachttijd instellen op SCNDN\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SECONDEN leeswachttijd instellen op SECONDEN\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SECONDEN tussen bestanden dit aantal SECONDEN "
+"wachten\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECONDEN 1..SECONDEN wachten tussen herhaalde "
+"pogingen\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait tussen bestanden 0,5..1,5 keer gewone tijd "
+"wachten\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy geen proxy gebruiken\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=AANTAL downloadquotum is AANTAL (Kilo- of "
+"Megabytes)\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRES binden aan ADRES (hostnaam of IP) op "
+"localhost\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=SNELHEID downloaden tot deze SNELHEID (bytes/s) "
+"begrenzen\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache bufferen van DNS-zoekacties uitschakelen\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS tekens in bestandsnamen beperken tot die\n"
+" welke besturingssysteem OS toestaat\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case verschil tussen kleine en hoofdletters "
+"negeren\n"
+" bij vergelijken van bestands- en mapnamen\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only alleen met IPv4-adressen verbinden\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only alleen met IPv6-adressen verbinden\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=SOORT eerst met deze SOORT adressen verbinden\n"
+" ('IPv6', 'IPv4', of 'none')\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr " --user=GEBRUIKER de GEBRUIKER voor FTP en HTTP\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=WACHTWOORD het WACHTWOORD voor FTP en HTTP\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password vragen om wachtwoorden\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri IRI-ondersteuning uitschakelen\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=SET deze tekenset gebruiken voor lokale IRI's\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=SET standaard deze gindse tekenset gebruiken\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink bestand verwijderen alvorens te "
+"overschrijven\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --warc-cdx CDX-indexbestanden aanmaken\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Mappen:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories geen mappen aanmaken\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories aanmaken van mappen afdwingen\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories geen host-mappen maken\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories in mappen het gegeven protocol gebruiken\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PAD bestanden opslaan in de map PAD/...\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=AANTAL dit AANTAL padcomponenten op server negeren\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-opties:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=GEBRUIKER de GEBRUIKER voor HTTP\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-passwd=WACHTWRD het WACHTWRD voor HTTP\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache server-gebufferde data niet toestaan\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAAM de standaardpaginanaam aanpassen\n"
+" (normaliter is dit 'index.html')\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension HTML- en CSS-documenten opslaan met "
+"passende\n"
+" extensies\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length de 'Content-Length'-kopregel negeren\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=TEKENREEKS deze TEKENREEKS tussen kopregels invoegen\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximum aantal doorverwijzingen per pagina\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=GEBRUIKER de GEBRUIKER voor de proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-passwd=WACHTWRD het WACHTWRD voor de proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL een 'Referer'-kopregel met deze URL "
+"gebruiken\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers HTTP-kopregels in bestand opslaan\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT als AGENT identificeren, niet als Wget/"
+"VERSIE\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr " --no-http-keep-alive geen HTTP-'keep-alive' gebruiken\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies geen cookies gebruiken\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=BESTAND cookies voor de sessie uit dit BESTAND "
+"laden\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=BESTAND cookies na de sessie in dit BESTAND opslaan\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies de (tijdelijke) sessiecookies laden en "
+"opslaan\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=TEKENREEKS deze TEKENREEKS met POST-methode verzenden\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=BESTAND dit BESTAND met POST-methode verzenden\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTP-METHODE deze HTTP-METHODE in de kopregels gebruiken\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=TEKST deze TEKST als gegevens verzenden;\n"
+" optie '--method' moet gegeven zijn\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=BESTAND inhoud van dit BESTAND verzenden;\n"
+" optie '--method' moet gegeven zijn\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition 'Content-Disposition'-kopregel respecteren "
+"bij\n"
+" keuze van lokale bestandsnamen "
+"[EXPERIMENTEEL]\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error bij serverfouten de ontvangen berichten "
+"tonen\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge basale HTTP-authenticatie-informatie "
+"verzenden\n"
+" zonder te wachten op de vraag van de "
+"server\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS-opties (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PRTCL beveiligingsprotocol PRTCL gebruiken\n"
+" ('auto', 'SSLv2', 'SSLv3', 'TLSv1', of "
+"'PFS')\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only alleen veilige (HTTPS) hyperlinks volgen\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate servercertificaat niet controleren\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=BESTAND BESTAND dat cliëntcertificaat bevat\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE TYPE van cliëntcertificaat ('PEM' of 'DER')\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=BESTAND BESTAND dat de privésleutels bevat\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYPE TYPE van privésleutel ('PEM' of 'DER')\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=BESTND BESTND dat een bundel van CA's bevat\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=MAP MAP waar hash-lijst van CA's opgeslagen is\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=BESTAND BESTAND dat een bundel van CRL's bevat\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=BESTAND BESTAND met ruis om de SSL-PRNG te 'seeden'\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr " --egd-file=BESTAND BESTAND met naam van de EGD-socket\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS-opties:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-cache server-gebufferde data niet toestaan\n"
+
+#: src/main.c:893
+#, fuzzy
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" -v, --verbose gedetailleerde uitvoer produceren "
+"(standaard)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-opties:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Stream_LF gebruiken voor alle binaire\n"
+" FTP-bestanden\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=GEBRUIKER de GEBRUIKER voor FTP\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=WACHTWRD het WACHTWRD voor FTP\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing '.listing'-bestanden niet verwijderen\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob bestandsnaam-'globbing' uitschakelen\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp niet de \"passieve\" overdrachtsmodus "
+"gebruiken\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions toegangsrechten overnemen van ginds bestand\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks symbolisch-gekoppelde bestanden ook ophalen\n"
+" (bij recursie), maar geen mappen\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS-opties:\n"
+
+#: src/main.c:923
+#, fuzzy
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftp-stmlf Stream_LF gebruiken voor alle binaire\n"
+" FTP-bestanden\n"
+
+#: src/main.c:925
+#, fuzzy
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --trust-server-names de naam uit de doorverwijzings-URL "
+"gebruiken\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC-opties:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=BESTANDSNAAM verzoeks- en responsgegevens hierin "
+"opslaan\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=TEKENREEKS deze TEKENREEKS invoegen in warcinfo-"
+"record\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=GROOTTE maximum grootte van WARC-bestanden\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx CDX-indexbestanden aanmaken\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=BESTANDSNAAM records in dit indexbestand niet opslaan\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression WARC-bestanden niet comprimeren met "
+"'gzip'\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests geen SHA1-controlesommen berekenen\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log logbestand niet opslaan in een WARC-"
+"record\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=MAP plaats voor tijdelijke WARC-bestanden\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Recursief downloaden:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive recursief downloaden\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=AANTAL maximale recursiediepte ('0' voor onbegrensd)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after bestanden na downloaden lokaal wissen\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links de hyperlinks in opgehaalde HTML-of CSS-"
+"bestanden\n"
+" naar lokale bestanden laten wijzen\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=AANTAL alvorens een bestand te schrijven, maximaal dit\n"
+" aantal reservekopie-bestanden roteren\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted een reservekopie XX_orig maken alvorens bestand "
+"XX\n"
+" te converteren\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted een reservekopie XX.orig maken alvorens bestand "
+"XX\n"
+" te converteren\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror gelijk aan '-r -N -l inf --no-remove-listing' "
+"samen\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites alle plaatjes enzovoort voor HTML-weergave "
+"ophalen\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments HTML-commentaar strikt volgens SGML afhandelen\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+"Recursief accepteren/weigeren (de LIJSTen zijn kommagescheiden "
+"opsommingen):\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr " -A, --accept=LIJST geaccepteerde achtervoegsels\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr " -R, --reject=LIJST geweigerde achtervoegsels\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEXP reguliere expressie voor te accepteren "
+"URL's\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEXP reguliere expressie voor te negeren URL's\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYPE het type van de reguliere expressie (posix|"
+"pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=TYPE het type van de reguliere expressie (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr " -D, --domains=LIJST geaccepteerde domeinen\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr " --exclude-domains=LIJST geweigerde domeinen\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp FTP-hyperlinks in HTML-documenten "
+"volgen\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr " --follow-tags=LIJST deze HTML-tags volgen\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr " --ignore-tags=LIJST deze HTML-tags negeren\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts ook naar andere servers gaan (bij "
+"recursie)\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative alleen relatieve hyperlinks volgen\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LIJST geaccepteerde mappen\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names de naam uit de doorverwijzings-URL "
+"gebruiken\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LIJST uitgesloten mappen\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent hogergelegen mappen negeren\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+"GNU Wget %s\n"
+"\n"
+"Een niet-interactief programma voor het ophalen van bestanden over een "
+"netwerk.\n"
+"\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Wachtwoord voor gebruiker %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Wachtwoord: "
+
+#: src/main.c:1106
+#, fuzzy, c-format
+msgid "Cannot create pipe\n"
+msgstr "kan geen pijp aanmaken"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Wachtwoord voor gebruiker %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Locale: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Gecompileerd: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Gelinkt: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s gecompileerd op %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (user)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licentie GPLv3+: GNU GPL versie 3 of nieuwer <http://gnu.org/licenses/gpl."
+"html>.\n"
+"Dit is vrije software: u mag het vrijelijk wijzigen en verder verspreiden.\n"
+"Er is GEEN GARANTIE, voor zover de wet dit toestaat.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Oorspronkelijk geschreven door Hrvoje Nikšić <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Rapporteer gebreken in het programma (of suggesties) aan <bug-wget@gnu."
+"org>;\n"
+"meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Onvoldoende geheugen beschikbaar\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Gestopt wegens fout in %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Typ '%s --help' voor meer opties.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: ongeldige optie -- '-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Ondersteuning voor debuggen is niet meegecompileerd. Optie '--debug' wordt "
+"genegeerd.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Zowel '--no-clobber' als '--convert-links' werden opgegeven; alleen '--"
+"convert-links' wordt gebruikt.\n"
+
+#: src/main.c:1608
+#, fuzzy, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Zowel '--no-clobber' als '--convert-links' werden opgegeven; alleen '--"
+"convert-links' wordt gebruikt.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Kan niet gelijktijdig 'details geven' en 'stil zijn'.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Tijdsstempels en het niet-overschrijven van oude bestanden gaan niet samen.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Opties '--inet4-only' en '--inet6-only' gaan niet samen.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Opties '-k' en '-O' gaan niet samen als er meerdere URL's gegeven zijn,\n"
+"of als ook '-p' of '-r' gegeven is. Zie de handleiding voor details.\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"WAARSCHUWING: optie '-O' samen met '-r' of '-p' betekent dat alles\n"
+"wat opgehaald wordt in het ene opgegeven bestand geplaatst wordt.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"WAARSCHUWING: optie '-N' of '--timestamping' heeft geen effect samen met '-"
+"O'.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC-uitvoer werkt niet met '--no-clobber'; '--no-clobber' wordt "
+"uitgeschakeld.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC-uitvoer werkt niet met tijdsstempels; tijdsstempels worden "
+"uitgeschakeld.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC-uitvoer werkt niet met '--spider'.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-uitvoer werkt niet met '--continue' of '--start-pos'; deze worden "
+"uitgeschakeld.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Controlesommen zijn uitgeschakeld; WARC-ontdubbeling zal geen dubbele "
+"records vinden.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-uitvoer werkt niet met '--continue' of '--start-pos'; deze worden "
+"uitgeschakeld.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Opties '--ask-password' en '--password' gaan niet samen.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Opties '--start-pos' en '--continue' samen wordt ontraden; '--continue' "
+"wordt uitgeschakeld.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: ontbrekende URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Opties '--post-data' en '--post-file' gaan niet samen.\n"
+
+#: src/main.c:1841
+#, fuzzy, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Opties '--post-data' en '--post-file' gaan niet samen met '--method'; de "
+"optie '--method' verwacht gegevens via de opties '--body-data' of '--body-"
+"file'."
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"U dient via '--method=HTTP-METHODE' een methode op te geven om te gebruiken "
+"met '--body-data' of '--body-file'.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Opties '--body-data' en '--body-file' gaan niet samen.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Deze versie heeft geen ondersteuning voor IRI's.\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"Optie '-k' of '-r' gaat alleen samen met '-O' bij uitvoer naar een normaal "
+"bestand.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"Optie '-k' of '-r' gaat alleen samen met '-O' bij uitvoer naar een normaal "
+"bestand.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Verwijderen van symbolische koppeling '%s' is mislukt: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: kan host-adres '%s' niet herleiden\n"
+
+#: src/main.c:2060
+#, fuzzy, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "FOUT: Kan certificaat %s niet openen: (%d).\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Geen URL's gevonden in %s.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Kan '%s' niet verwijderen: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Kan niet alle hulpbronnen van %s downloaden.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"KLAAR --%s--\n"
+"Totaal verlopen tijd: %s\n"
+"Opgehaald: %d bestanden, %s in %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Downloadquotum van %s bytes is overschreden!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Kan '%s' niet verwijderen: %s\n"
+
+#: src/metalink.c:179
+#, fuzzy, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Kan '%s' niet verwijderen: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, fuzzy, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Downloaden van %s is mislukt. Hulpbron wordt overgeslagen.\n"
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Kan '%s' niet verwijderen: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Hulpbrontype %s wordt niet ondersteund; genegeerd...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Kan gedownload bestand niet openen.\n"
+
+#: src/metalink.c:514
+#, fuzzy, c-format
+msgid "Computing size for %s\n"
+msgstr "Berekenen van controlesom voor %s\n"
+
+#: src/metalink.c:519
+#, fuzzy
+msgid "File size not declared. Skipping check.\n"
+msgstr "Downloaden van %s is mislukt. Hulpbron wordt overgeslagen.\n"
+
+#: src/metalink.c:527
+#, fuzzy
+msgid "Could not get downloaded file's size.\n"
+msgstr "Kan gedownload bestand niet openen.\n"
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Controlesom komt niet overeen voor bestand %s.\n"
+
+#: src/metalink.c:547
+#, fuzzy
+msgid "Size matches.\n"
+msgstr "Controlesom komt overeen.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Berekenen van controlesom voor %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Controlesom komt overeen.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Controlesom komt niet overeen voor bestand %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Kan gedownload bestand niet openen voor controle van ondertekening.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+#, fuzzy
+msgid "Signature validation succeeded.\n"
+msgstr "Controle van ondertekening is geslaagd.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Ongeldige ondertekening. Hulpbron wordt verworpen.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+"Gegevens komen overeen met ondertekening, maar ondertekening wordt niet "
+"vertrouwd.\n"
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "Geen certificaat gevonden\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Downloaden van %s is mislukt. Hulpbron wordt overgeslagen.\n"
+
+#: src/metalink.c:878
+#, fuzzy, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Bestand %s is opgehaald maar ondertekening komt niet overeen. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Bestand %s is opgehaald maar controlesom komt niet overeen. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Bestand %s is opgehaald maar ondertekening komt niet overeen. \n"
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Verwijderen van %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Voortzetting in de achtergrond.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Voortzetting in de achtergrond, proces-ID %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Uitvoer wordt naar '%s' geschreven.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() is mislukt\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() is mislukt\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Kan geen bruikbaar socket-stuurprogramma vinden.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() is mislukt -- de socket kon niet op 'blokkerend' gezet worden\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: waarschuwing: '%s'-sleutelwoord aangetroffen vóór een "
+"machinenaam\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: onbekend sleutelwoord '%s'\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Gebruik: %s NETRC [HOSTNAAM]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: kan status van %s niet opvragen: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+"WAARSCHUWING: er wordt een zwakke 'seed' voor de toevalsgenerator gebruikt.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Kan geen 'seed' voor PRNG vinden; gebruik eventueel '--random-file'.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Uw OpenSSL-versie is te oud om TLSv1.1 te ondersteunen.\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Uw OpenSSL-versie is te oud om TLSv1.1 te ondersteunen.\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Uw OpenSSL-versie is te oud om TLSv1.2 te ondersteunen.\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: niet-geïmplementeerde 'secure-protocol'-optiewaarde %d\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Ongeldige URL '%s': %s.\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"Kan geen 'seed' voor PRNG vinden; gebruik eventueel '--random-file'.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: kan certificaat van %s (uitgegeven door %s) niet controleren:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Kan de autoriteit van de uitgever niet lokaal verifiëren.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Zelf-ondertekend certificaat gevonden.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Certificaat is nog niet geldig.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Certificaat is verlopen.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: geen van de alternatieve namen in het certificaat komt\n"
+" overeen met de gevraagde hostnaam '%s'.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: naam '%s' in certificaat komt niet overeen met gevraagde hostnaam "
+"'%s'.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: gewone naam in certificaat is ongeldig (bevat een NUL-teken).\n"
+" Dit zou erop kunnen wijzen dat de host niet is wie die zegt te zijn\n"
+" (oftewel dat het niet de echte '%s' is).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Gebruik '--no-check-certificate' om een onbeveiligde verbinding met %s te "
+"maken.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ %sK wordt overgeslagen ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Ongeldige puntjesstijl '%s' opgegeven; blijft onveranderd.\n"
+
+# FIXME: this is not "ETA" but simply "still %s" or "%s remaining"
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " nog %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " in "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Kan frequentie van de klok niet bepalen: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "'%s' wordt verwijderd omdat het verworpen dient te worden.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan %s niet openen: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Laden van 'robots.txt'; fouten kunnen worden genegeerd.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Fout tijdens ontleden van proxy-URL '%s': %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Fout in proxy-URL '%s': moet HTTP zijn.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Maximum van %d doorverwijzingen is overschreden.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Pogingen worden gestaakt.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Nieuwe poging.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Geen verbroken hyperlinks gevonden.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d verbroken hyperlink gevonden.\n"
+"\n"
+msgstr[1] ""
+"%d verbroken hyperlinks gevonden.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Geen fout"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Niet-ondersteund schema '%s'"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schema ontbreekt"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Ongeldige hostnaam"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ongeldig poortnummer"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ongeldige gebruikersnaam"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Onafgesloten numeriek IPv6-adres"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-adressen worden niet ondersteund"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ongeldig numeriek IPv6-adres"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Ondersteuning voor HTTPS is niet meegecompileerd"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Incomplete of ongeldige multibyte-volgorde aangetroffen\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Kan niet genoeg geheugen reserveren; onvoldoende beschikbaar.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+"%s: %s: Kan geen %ld bytes reserveren; onvoldoende geheugen beschikbaar.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf(): tekstbuffer is te groot (%d bytes) -- proces is afgebroken.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Voortzetting in de achtergrond, proces-ID %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Verwijderen van symbolische koppeling '%s' is mislukt: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "FOUT: Kan certificaat %s niet openen: (%d).\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Kan geen cookie verkrijgen voor %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "FOUT: Kan certificaat %s niet openen: (%d).\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Verwijderen van symbolische koppeling '%s' is mislukt: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Ongeldige reguliere expressie %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Ongeldige reguliere expressie %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Fout tijdens zoeken naar %s: %d.\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Fout bij openen van WARC-bestand %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Fout bij openen van WARC-bestand %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Fout bij openen van WARC-bestand %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Fout bij openen van GZIP-stream naar WARC-bestand.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Fout bij schrijven van 'warcinfo'-record naar WARC-bestand.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Openen van WARC-bestand %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Fout bij openen van WARC-bestand %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX-bestand bevat geen originele URL's. (Kolom 'a' ontbreekt.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX-bestand bevat geen controlesommen. (Kolom 'k' ontbreekt.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX-bestand bevat geen record-ID's. (Kolom 'u' ontbreekt.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Er is %d record geladen uit CDX.\n"
+"\n"
+msgstr[1] ""
+"Er zijn %d records geladen uit CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Kan CDX-bestand %s niet lezen voor ontdubbeling.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Kan tijdelijk WARC-manifestbestand niet openen.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Kan tijdelijk WARC-log-bestand niet openen.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Kan WARC-bestand niet openen.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Kan CDX-bestand niet openen voor uitvoer.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Kan tijdelijk WARC-bestand niet openen.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Exacte overeenkomst gevonden in CDX-bestand. Opslaan van herbezoek-record in "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Onbekende systeemfout"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adresfamilie voor hostnaam wordt niet ondersteund"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Ongeldige waarde voor 'ai_flags'"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Onherstelbaar probleem in naamsherleiding"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "'ai_family' wordt niet ondersteund"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Onvoldoende geheugen beschikbaar"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Aan hostnaam is geen adres verbonden"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Naam of dienst is onbekend"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servicenaam wordt niet ondersteund voor 'ai_socktype'"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "'ai_socktype' wordt niet ondersteund"
+
+#~ msgid "System error"
+#~ msgstr "Systeemfout"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumentenbuffer is te klein"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Bezig met verwerken van verzoek"
+
+#~ msgid "Request canceled"
+#~ msgstr "Verzoek is geannuleerd"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Verzoek is niet geannuleerd"
+
+#~ msgid "All requests done"
+#~ msgstr "Alle verzoeken zijn gedaan"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Onderbroken door een signaal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametertekst is niet juist gecodeerd"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: optie '%s' is niet eenduidig; mogelijkheden zijn:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: optie '%s' is niet eenduidig\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: optie '--%s' staat geen argument toe\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: optie '%c%s' staat geen argument toe\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: optie '--%s' vereist een argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: onbekende optie '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: onbekende optie '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: ongeldige optie -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: optie vereist een argument -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: optie '-W %s' is niet eenduidig\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: optie '-W %s' staat geen argument toe\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: optie '-W %s' vereist een argument\n"
+
+#~ msgid "`"
+#~ msgstr "‘"
+
+#~ msgid "'"
+#~ msgstr "’"
+
+#~ msgid "Success"
+#~ msgstr "Gelukt"
+
+#~ msgid "No match"
+#~ msgstr "Geen overeenkomsten"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Ongeldige reguliere expressie"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ongeldig samengesteld teken"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ongeldige tekenklassenaam"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Backslash aan het eind"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Ongeldige terugverwijzing"
+
+#~ msgid "Unmatched [ or [^"
+#~ msgstr "Ongepaarde [ of [^"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Ongepaarde ( of \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Ongepaarde \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Ongeldige inhoud van \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Ongeldig bereikeinde"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Onvoldoende geheugen beschikbaar"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Ongeldige voorafgaande reguliere expressie"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Voortijdig einde van reguliere expressie"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Reguliere expressie is te groot"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Ongepaarde ) of \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Geen eerdere reguliere expressie"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "subproces %s is mislukt"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle() is mislukt"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "kan bestandsdescriptor %d niet herstellen: dup2() is mislukt"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "subproces %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "subproces %s ontving het fatale signaal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "onvoldoende geheugen beschikbaar"
+
+#, c-format
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Ongeldige UTF-8-reeks: %s\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode() is mislukt (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s ontvangen.\n"
+
+# FIXME: add period
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Rapporteer gebreken in het programma (of suggesties) aan <bug-wget@gnu."
+#~ "org>;\n"
+#~ "meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Bestand '%s' is reeds aanwezig -- wordt niet opgehaald.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Aanmelding is mislukt.\n"
+
+#, fuzzy
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries dit AANTAL pogingen doen voor een "
+#~ "bestand\n"
+#~ " (optie is vereist bij '--metalink-"
+#~ "file')\n"
+
+#, fuzzy
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --jobs dit AANTAL draden gebruiken\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Gebruikersnaam en wachtwoord hoeven niet gegeven te worden bij het "
+#~ "downloaden via een metalink.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "Optie '%s' kan niet gebruikt worden samen met '--metalink'.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Uitvoeropmaak:\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "WAARSCHUWING: Kan standaarduitvoer niet heropenen in binaire modus -- \n"
+#~ " gedownload bestand kan ongepaste regeleinden bevatten.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: ongeldige optie -- %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s gecompileerd op VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Tegenwoordig onderhouden door Micah Cowan <micah@cowan.name>.\n"
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644
index 0000000..5ca7254
--- /dev/null
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..3a5d920
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,3656 @@
+# Polish translations of wget messages
+# Copyright (C) 2002, 2008, 2009 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Wojciech Kotwica <wkotwica@post.pl>, 2002
+# Jakub Bogusz <qboosh@pld-linux.org>, 2005-2020
+# based on unofficial translation of wget-1.6 by
+# Arkadiusz Miśkiewicz <misiek@pld.ORG.PL>, 1998-2000.
+# Wojciech Kotwica <wkotwica@post.pl> 2002-03-20 11:12+01:00
+# v. 1.9-b5 by Emil Nowak <emil5@go2.pl> 2003-10-15 00:28+02:00
+# Thanks for some updates to Adam Gołębiowski <adamg@pld-linux.org>, 2008
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-07 20: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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: nie można rozwiązać adresu bind `%s': wyłączenie bind.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "ÅÄ…czenie siÄ™ z %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "ÅÄ…czenie siÄ™ z %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "ÅÄ…czenie siÄ™ z [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF nie powiodło się: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "połączono.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "nieudane: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: nie udało się rozwiązać adresu hosta %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR nie powiodło się: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Za dużo otwartych deskryptorów. Nie można użyć funkcji select na fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Przekonwertowano odnośniki w %d plikach w %s sekund.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Konwertowanie odnośników w %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nic do roboty.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nie można przekonwertować odnośników w %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Nie udało się usunąć %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Nie można stworzyć kopii zapasowej %s jako %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nie udało się uzyskać ciasteczka dla %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Błąd składni w Set-Cookie: %s na pozycji %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Ciasteczko pochodzące z %s próbowało ustawić domenę na "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nie można otworzyć pliku ciasteczek %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "BÅ‚Ä…d podczas zapisu do %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "BÅ‚Ä…d podczas zamykania %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Nieobsługiwany typ listy plików, próbowanie analizatora list Uniksowych.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Indeks /%s na %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "czas nieznany "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Plik "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Katalog "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Odnośnik "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Nie pewny "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtów)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Długość: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) pozostało"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s pozostało"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (nie autorytatywne)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Nie udało się zainicjować SSL. Zostanie wyłączony.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Logowanie siÄ™ jako %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Błąd w odpowiedzi serwera, zamykanie połączenia sterującego.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "BÅ‚Ä…d w powitaniu serwera.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Niepowodzenie podczas zapisu, zamykanie połączenia sterującego.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Serwer nie pozwala na zalogowanie siÄ™.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Nieprawidłowy login lub hasło.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Zalogowano siÄ™!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Serwer nie przyjÄ…Å‚ polecenia 'PBSZ 0'.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Serwer nie przyjÄ…Å‚ polecenia 'PROT %c'.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Błąd serwera, nie można ustalić typu systemu.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "zrobiono. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "zrobiono.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Nieznany typ `%c', zamykanie połączenia sterującego.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "zrobiono. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nie jest potrzebne.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Osiągnięto logicznie niemożliwy warunek w getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Nie ma katalogu %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nie wymagane.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Plik został już pobrany.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nie można zainicjować przesyłania typu PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Nie można przeanalizować składni odpowiedzi PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nie udało się połączyć z %s:%d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "BÅ‚Ä…d Bind (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Nieprawidłowe PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST nieudane, rozpoczynanie od poczÄ…tku.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Plik %s istnieje.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Brak pliku %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Nie ma pliku %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Nie ma pliku ani katalogu %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s zaczął istnieć.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, zamykanie połączenia sterującego.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Połączenie danych: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Zamknięto połączenie sterujące.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Przerwano przesyłanie danych.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Plik %s już istnieje, bez pobierania.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(próba:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano na standardowe wyjście %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano %s [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Usuwanie %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Użycie %s jako tymczasowego pliku dla listy.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Usunięto %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Głębokość rekurencji %d przekroczyła maksymalną głębokość %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Plik po stronie serwera nie jest nowszy niż lokalny %s -- bez pobierania.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Plik po stronie serwera jest nowszy niż lokalny %s -- pobieranie.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Rozmiary się różnią (lokalny %s) -- pobieranie.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nieprawidłowa nazwa dowiązania symbolicznego, pomijanie.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Już istnieje poprawne dowiązanie symboliczne %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Tworzenie dowiÄ…zania symbolicznego %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Dowiązania symboliczne nie są obsługiwane, pomijanie dowiązania %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Pomijanie katalogu %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: nieznany/nieobsługiwany typ pliku.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Nie udało się ustawić uprawnień %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: znacznik czasowy uszkodzony.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Nie będą pobierane katalogi, gdyż głębokość wynosi %d (maks. %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Bez wchodzenia do %s, ponieważ jest on wyłączony/nie-włączony.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Odrzucanie %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Odrzucanie %s (błędny wpis).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s jest wykluczony/nie włączony poprzez wyrażenie regularne.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Błąd podczas dopasowywania %s względem %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Brak pasujÄ…cych do wzorca %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Zapisano indeks w postaci HTML-a w %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Zapisano indeks w postaci HTML-a w %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "BÅÄ„D: Nie można otworzyć katalogu %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "BÅÄ„D: Nie udaÅ‚o siÄ™ otworzyć certyfikatu %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Załadowano certyfikat CA '%s'\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "BÅÄ„D: Nie udaÅ‚o siÄ™ zaÅ‚adować pliku CRL '%s': (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Załadowano plik CRL '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "BÅÄ„D: GnuTLS wymaga, aby klucz i certyfikat byÅ‚y tego samego typu.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Użyta wersja GnuTLS jest zbyt stara, aby obsłużyć TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: nie zaimplementowana wartość opcji 'secure-protocol' %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Prosimy o zgłoszenie tego błędu na adres bug-wget@gnu.org.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: nie zaimplementowana wartość opcji 'secure-protocol' %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Nie można ustawić bezpośrednio łańcucha prio. Awaryjne przejście do "
+"domyślnego priorytetu.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "BÅÄ„D"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "UWAGA"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Żaden certyfikat nie został przedstawiony przez %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Żaden certyfikat nie został przedstawiony przez %s.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certyfikat %s nie ma znanego wystawcy.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Certyfikat %s został unieważniony.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Podpisujący certyfikat %s nie był CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: Certyfikat %s został podpisany algorytmem, który nie jest bezpieczny.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certyfikat %s nie jest jeszcze aktywny.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certyfikat %s wygasł.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "BÅ‚Ä…d inicjalizacji certyfikatu X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nie znaleziono certyfikatu\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "BÅ‚Ä…d podczas analizy certyfikatu: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certyfikat nie został jeszcze aktywowany.\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certyfikat wygasł.\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Właściciel certyfikatu nie pasuje do nazwy hosta %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Klucz publiczny nie pasuje do przypiętego klucza publicznego!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certyfikat musi być w formacie X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Błąd w obsłudze listy adresów.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Nieznany host"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Tymczasowy błąd rozwiązywania nazw"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Nieznany błąd"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Translacja %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "błąd: brak adresu IPv4/IPv6 dla hosta.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "błąd: przekroczono limit czasu oczekiwania.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Nie udało się przeanalizować niedokończonego łącza %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"W %s znaleziono atrybut no-follow. Nie będzie podążania za łączami na tej "
+"stronie\n"
+
+# c-format
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Nieprawidłowy URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Nie powiodło się wysyłanie żądania HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Brak nagłówków, przyjęto HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Plik %s już istnieje, bez pobierania.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime nie powiodło się. To prawdopodobnie błąd.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Nie można przekształcić znacznika czasu na format http. Degradacja do czasu "
+"0 jako czasu ostatniej modyfikacji.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Brak pliku danych BODY %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Ponowne użycie połączenia do [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Ponowne użycie połączenia do %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Nie powiodło się odczytanie odpowiedzi proxy: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s BÅÄ„D %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Źle sformułowana linia statusu"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunelowanie proxy nie powiodło się: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Nieznana metoda uwierzytelniania.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Wybrano uwierzytelnienie: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Zapis do: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Podczas pobierania podpisu:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Nie udało się odczytać treści podpisu z pliku tymczasowego. Pominięto.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Nie udało się utworzyć pliku tymczasowego. Pominięto pobieranie podpisu.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Nieprawidłowa wartość pri. Domniemano %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Nie udało się odnaleźć akceptowalnego skrótu dla zasobów Metalink.\n"
+"Zignorowano je.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Wyłączenie SSL ze względu na napotkane błędy\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Żądanie %s wysłano, oczekiwanie na odpowiedź... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Brak danych w odpowiedzi.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Błąd odczytu (%s) w nagłówkach.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(brak opisu)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Lokalizacja: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nieznana"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [podążanie]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Plik %s nie został zmodyfikowany na serwerze. Pominięto pobranie.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Serwer zignorował nagłówek If-Modified-Since dla pliku %s.\n"
+"Może warto dodać opcję --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Plik już został w pełni pobrany; nic do roboty.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Długość: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "zignorowano"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Ostrzeżenie: znaki globalne nie są obsługiwane w HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Tryb spider włączony. Sprawdź czy zdalny plik istnieje.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nie można zapisać do %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "W odebranym nagłówku brak wymaganego atrybutu.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Uwierzytelnienie użytkownik/hasło nie powiodło się.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Nie można zapisać do pliku WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Nie można zapisać do tymczasowego pliku WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Niemożliwe utworzenie połączenia SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Nie można usunąć %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "BÅÄ„D: Przekierowanie (%d) bez lokalizacji.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Nie udało się odnaleźć danych Metalink w odpowiedzi HTTP. Pobieranie pliku "
+"przy użyciu HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Napotkano nagłówek Metalink. Przełączanie w tryb Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Zdalny plik nie istnieje -- zepsuty odnośnik!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Brak nagłówka Last-modified -- znaczniki czasu wyłączone.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Błędny nagłówek Last-modified -- znacznik czasu zignorowany.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Plik po stronie serwera nie nowszy niż plik lokalny %s -- bez pobierania.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Rozmiary się różnią (lokalny %s) -- pobieranie.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Plik na zdalnym serwerze jest nowszy, pobieranie.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Plik po stronie serwera istnieje i zawiera odnośniki do innych źródeł -- "
+"pobieranie.\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Plik po stronie serwera istnieje, ale nie posiada odnośników -- nie "
+"pobieram.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Zdalny plik istnieje i może zawierać dalsze odnośniki,\n"
+"jednak rekurencja jest wyłączona -- nie pobieram.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Plik na zdalnym serwerze istnieje.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano na standardowe wyjście %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano %s [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Połączenie zamknięte przy %s bajcie. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - BÅ‚Ä…d podczas odczytu przy bajcie %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - BÅ‚Ä…d podczas odczytu przy bajcie %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nieobsługiwana jakość zabezpieczenia '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nieobsługiwany algorytm '%s'.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC wskazuje na %s, do którego nie ma dostępu z powodu błędu: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Nie można odczytać %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: BÅ‚Ä…d w %s w linii %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Błąd składni w %s w linii %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Nieznane polecenie %s w %s w linii %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analiza systemowego pliku wgetrc (zmienna SYSTEM_WGETRC) nie powiodła się.\n"
+"Proszę sprawdzić '%s',\n"
+"lub wskazać inny plik przy użyciu --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analiza systemowego pliku wgetrc nie powiodła się. Proszę sprawdzić\n"
+"'%s',\n"
+"lub wskazać inny plik przy użyciu --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Ostrzeżenie: Zarówno wgetrc systemowy jak i użytkownika wskazują na %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Nieprawidłowe polecenie --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Nieprawidłowa wartość logiczna %s; proszę podać on lub off.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Nieprawidłowa wartość %s; proszę podać on, off lub quiet.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Niewłaściwa liczba %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s musi być użyte tylko raz\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Nieprawidłowa wartość bajtu %s.\n"
+
+# c-format
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Nieprawidłowa wartość okresu czasu %s.\n"
+
+# c-format
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Ujemny okres czasu %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass wymaga łańcucha znaków albo ustawienia zmiennej środowiskowej "
+"WGET_ASKPASS lub SSH_ASKPASS.\n"
+
+# c-format
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Nieprawidłowa wartość %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Nieprawidłowy nagłówek %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Nieprawidłowy nagłówek WARC %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Nieprawidłowy typ wskaźnika postępu %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Nieprawidłowe ograniczenie %s,\n"
+" należy użyć [unix|vms|windows],[lowercase|uppercase],[nocontrol],"
+"[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodowanie %s nie jest prawidłowe\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konwersja z %s do %s nie jest obsługiwana\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Napotkano niekompletną lub nieprawidłową sekwencję wielobajtową\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Nieobsługiwane errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: nie ustawiono lokalizacji\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode nie powiodło się (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Nie udało się zamienić na małe litery: %d: %s\n"
+
+# c-format
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Przekierowanie wyjścia do %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; logowanie zostało wyłączone.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Składnia: %s [OPCJE]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Obowiązkowe argumenty długich opcji są też obowiązkowe dla opcji krótkich.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Uruchamianie:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version wyświetla wersję Wgeta i kończy "
+"działanie\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help wypisuje tÄ™ pomoc\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background przejście w tło po uruchomieniu\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=KOMENDA wykonuje polecenie jak z `.wgetrc'\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Rejestracja pracy i plik wejściowy:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=PLIK rejestruje komunikaty w PLIKu\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=PLIK dołącza komunikaty do PLIKu\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug wypisuje informacje diagnostyczne\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug wypisuje informacje diagnostyczne z "
+"Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet cisza (żadnych komunikatów)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose szczegółowe komunikaty (zachowanie "
+"domyślne)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose bez szczegółowych komunikatów, ale nie "
+"cisza\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=JAK wypisuje szybkość w podany sposób; może "
+"być \"bits\"\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=PLIK wczytuje URL-e z lokalnego lub "
+"zewnętrznego PLIKu\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=PLIK wczytuje pliki obecne w lokalnym PLIKu "
+"Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html traktuje plik wejściowy jako HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL rozwiązuje odnośniki pliku wejściowego "
+"HTML\n"
+" (-i -F) względem URL-a\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=PLIK określa plik konfiguracyjny do użycia\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config pomija odczyt pliku konfiguracyjnego\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=PLIK rejestruje przyczyny odrzucenia URL-i w "
+"PLIKu\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Pobieranie:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=LICZBA ustawia LICZBĘ ponownych prób (0 bez "
+"limitu)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused ponawia pobieranie nawet po odrzuceniu\n"
+" połączenia\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=BÅĘDY rozdzielona przecinkami lista bÅ‚Ä™dów\n"
+" HTTP do wznowienia\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=PLIK zapisuje dokumenty do PLIKu\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber zakazuje nadpisywania istniejÄ…cych "
+"plików\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc bez próby odczytu danych użytkownika ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue wznawia ściąganie częściowo pobranego "
+"pliku\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=OFFSET rozpoczyna pobieranie od podanego "
+"OFFSETu\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYP ustawia tryb wizualizacji postępów\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress pasek postępu niezależnie od trybu "
+"komunikatów\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nie pobiera ponownie plików, chyba że są\n"
+" nowsze niż lokalne.\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since bez używania żądań pobrań warunkowych\n"
+" if-modified-since w trybie ze zn. "
+"czasu\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps bez ustawiania czasu pliku lokalnego na\n"
+" czas taki, jak na serwerze\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response wyświetla odpowiedzi serwera\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider nie pobiera niczego\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUND ustawia wszystkie limity czasu na zadanÄ…\n"
+" liczbÄ™ SEKUND\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESY lista serwerów DNS do odpytania (z "
+"przecinkami)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRES dowiÄ…zanie klienta DNS do lokalnego "
+"ADRESu (nazwy lub IP)\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUND ustawia limit czasu odpytywania DNS-a na\n"
+" zadanÄ… liczbÄ™ SEKUND\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEKUND ustawia limit czasu Å‚Ä…czenia na zadanÄ…\n"
+" liczbÄ™ SEKUND\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEKUND ustawia limit czasu odczytu na zadanÄ…\n"
+" liczbÄ™ SEKUND\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUND czeka SEKUND pomiędzy pobraniami\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUND czeka 1...SEKUND pomiędzy ponowną próbą\n"
+" wznowienia pobrania\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait czeka 0.5*WAIT...1.5*WAIT sekund między "
+"pobraniami\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy jawnie wyłącza proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ROZMIAR ustawia ograniczenie pobieranych danych\n"
+" na ROZMIAR\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRES użycie lokalnego ADRESu (nazwy lub IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=SZYBKOŚĆ ogranicza szybkość pobierania do "
+"SZYBKOŚĆ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache wyłącza zapisywanie podręcznych "
+"informacji\n"
+" o wyszukanych adresach DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS ogranicza znaki w nazwach pliku do\n"
+" obsługiwanych przez system operacyjny "
+"OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignorowanie wielkości liter podczas\n"
+" dopasowywania plików/katalogów.\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only łączenie wyłącznie na adresy IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only łączenie wyłącznie na adresy IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=RODZINA Å‚Ä…czenie najpierw z adresami z podanej\n"
+" rodziny: IPv6, IPv4, none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UŻYTKOWNIK ustawia UŻYTKOWNIKA dla ftp i http\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=HASÅO ustawia HASÅO dla ftp i http\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password prosi o podanie haseł\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=POLECENIE określa program do żądania nazwy "
+"użytkownika i hasła.\n"
+" Jeśli nie podano POLECENIA, używana "
+"jest zmienna\n"
+" środowiskowa WGET_ASKPASS lub "
+"SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri wyłącza obsługę IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KOD użycie podanego lokalnego kodowania IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOD użycie podanego domyślnego zdalnego "
+"kodowania\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink usuwanie plików przed nadpisaniem\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash zachowanie plików z niezgodną sumą "
+"(dołącza .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=LICZBA LICZBA porzÄ…dkowa metaurla metalink "
+"application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http użycie metadanych Metalink z nagłówków "
+"odpowiedzi HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location preferowana lokalizacja zasobów Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr zapisywanie metadanych w rozszerzonych "
+"atrybutach plików\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Katalogi:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories zakazuje tworzenia katalogów\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories wymusza tworzenie katalogów\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories zakazuje tworzenia katalogu o nazwie "
+"hosta\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories użycie nazwy protokołu w katalogach\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PRZEDR zapis plików w PRZEDR/...\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=LICZBA ignoruje określoną LICZBĘ zdalnych "
+"katalogów\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opcje HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=UŻYTKOWNIK ustawia UŻYTKOWNIKA dla http\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=HASÅO ustawia HASÅO dla http\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache zakazuje korzystania z buforowania\n"
+" danych przez serwer.\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAZWA zmiana domyślnej nazwy strony (zwykle "
+"jest\n"
+" to index.html).\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension zapis dokumentów HTML/CSS z właściwymi\n"
+" rozszerzeniami.\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignorowanie pola `Content-Length' "
+"nagłówka\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=ÅAŃCUCH wstawienie ÅAŃCUCHa w nagłówki\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=RODZAJ wybór kompresji: auto, gzip, none "
+"(domyślnie: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maksymalna dozwolona liczba przekierowań "
+"na stronie.\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UŻYTKOWNIK ustawia nazwę UŻYTKOWNIKA dla proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-passwd=HASÅO ustawia HASÅO dla proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL dołącza nagłówek `Referer: URL' do "
+"żądania HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers zapis nagłówków HTTP w pliku\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identyfikacja jako AGENT zamiast Wget/"
+"WERSJA\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive wyłącza HTTP keep-alive (trwałe "
+"połączenia)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies bez używania ciasteczek\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=PLIK wczytuje ciasteczka z PLIKu przed sesjÄ…\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=PLIK zapis ciasteczek do PLIKu po sesji\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies wczytuje i zapisuje ciasteczka sesji "
+"(nietrwałe)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ÅAŃCUCH użycie metody POST z ÅAŃCUCHem jako "
+"danymi\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=PLIK użycie metody POST z wysłaniem zawartości "
+"PLIKu\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=MetodaHTTP użycie podanej metody w żądaniu\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ÅAŃCUCH wysÅ‚anie ÅAŃCUCHA jako danych; wymagane --"
+"method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=PLIK wysłanie zawartości PLIKu; wymagane --"
+"method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition uwzględnienie nagłówka Content-"
+"Disposition\n"
+" podczas określania lokalnej nazwy "
+"pliku\n"
+" (EKSPERYMENTALNE).\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error wypisanie otrzymanej treści po błędzie "
+"serwera\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge wysłanie danych prostego "
+"uwierzytelnienia\n"
+" HTTP bez oczekiwania na wywołanie ze\n"
+" strony serwera\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opcje HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR wybór bezpiecznego protokołu: auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2, PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only podążanie tylko za bezpiecznymi "
+"odnośnikami HTTPS\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate bez sprawdzania certyfikatu serwera\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=PLIK plik z certyfikatem klienta\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYP typ certyfikatu klienta: PEM lub DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=PLIK plik klucza prywatnego\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYP typ klucza prywatnego: PEM lub DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=PLIK plik z zestawem CA\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr " --ca-directory=KATALOG katalog z listą skrótów CA\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=PLIK plik z zestawem CRL\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=PLIK/SKRÓTY Plik klucza publicznego (PEM/DER) lub\n"
+" dowolna liczba skrótów sha256 w "
+"kodowaniu\n"
+" base64 poprzedzonych 'sha256//',\n"
+" rozdzielonych ';' do sprawdzenia drugiej\n"
+" strony połączenia\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=PLIK plik z danymi losowymi do karmienia PRNG "
+"SSL\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=PLIK nazwa pliku gniazda EGD z danymi "
+"losowymi\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=ÅAŃCUCH BezpoÅ›rednie ustawienie Å‚aÅ„cucha priorytetów "
+"(GnuTLS) lub listy szyfrów (OpenSSL).\n"
+" Używać z rozwagą. Opcja ta nadpisuje --"
+"secure-protocol.\n"
+" Format i składnia tego łańcucha zależy od "
+"konkretnego silnika SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opcje HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts wyłącza HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file ścieżka bazy danych HSTS (przykrywa "
+"domyślną)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opcje FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf użycie formatu Stream_LF dla wszystkich\n"
+" binarnych plików FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=UŻYTKOWNIK ustawia UŻYTKOWNIKA dla ftp\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=HASÅO ustawia HASÅO dla ftp\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing bez usuwania plików '.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob wyłącza używanie znaków globalnych dla "
+"FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp wyłącza \"pasywny\" tryb przesyłania\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions zachowanie uprawnień plików zdalnych\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks przy pracy rekurencyjnej pobieranie "
+"plików,\n"
+" (nie katalogów), do których są "
+"dowiÄ…zania\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opcje FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit użycie domniemanego FTPS (port "
+"domyślny 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl wznowienie sesji SSL/TLS rozpoczętej "
+"w połączeniu\n"
+" sterujÄ…cym przy otwieraniu "
+"połączenia danych\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection szyfrowanie tylko kanału sterującego; "
+"wszystkie dane nieszyfrowane\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp degradowanie do FTP jeśli FTPS nie "
+"jest obsługiwane przez serwer\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opcje WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=PLIK zapis danych żądanie/odpowiedź do pliku ."
+"warc.gz.\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=ÅAŃCUCH wstawienie ÅAŃCUCHa do rekordu warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ROZMIAR ustawia maksymalny ROZMIAR plików WARC\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx zapis plików indeksowych CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=PLIK bez zapisu rekordów wymienionych w PLIKu "
+"CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression bez kompresji plików WARC gzipem\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests bez obliczania skrótów SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log bez zapisu pliku logu w rekordzie WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=KATALOG położenie plików tymczasowych tworzonych "
+"przy\n"
+" zapisie WARC.\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Pobieranie rekurencyjne:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive praca rekurencyjna\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMER maksymalny poziom zagłębienia przy "
+"rekurencji\n"
+" (inf lub 0 oznacza brak ograniczeń)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after usunięcie plików lokalnie po ich "
+"pobraniu\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links zmiana odnośników w ściąganych plikach "
+"HTML\n"
+" i CSS, aby wskazywały na pliki lokalne\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only przekształcenie tylko plikowej części URL-"
+"i (nazw bazowych)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N przed zapisem pliku X rotacja do N kopii "
+"zapasowych\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted przed konwersjÄ… pliku X zapis jego kopii\n"
+" jako X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted przed konwersjÄ… pliku X zapis jego kopii\n"
+" jako X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror skrót dla -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites pobranie wszystkich obrazków itp.\n"
+" potrzebnych by wyświetlić stronę HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments włącza ścisłą (SGML) interpretację "
+"komentarzy HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Akceptowanie/odrzucanie przy pracy rekurencyjnej:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA lista oddzielonych przecinkami "
+"akceptowanych\n"
+" rozszerzeń\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA lista oddzielonych przecinkami "
+"odrzucanych\n"
+" rozszerzeń\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=WYRAŻENIE wyr. regularne określające akceptowane "
+"URL-e\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=WYRAŻENIE wyr. regularne określające odrzucane URL-"
+"e\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=RODZAJ rodzaj wyrażeń regularnych (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=RODZAJ rodzaj wyrażeń regularnych (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA lista oddzielonych przecinkami "
+"akceptowanych\n"
+" domen\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA lista oddzielonych przecinkami "
+"odrzucanych\n"
+" domen\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp podążanie za odnośnikami FTP ze stron "
+"HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA lista oddzielonych przecinkami "
+"znaczników\n"
+" HTML, za którymi program ma podążać\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA lista oddzielonych przecinkami "
+"znaczników\n"
+" HTML, które mają być ignorowane\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts przechodzenie na obce maszyny podczas\n"
+" pracy rekurencyjnej\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative podążanie tylko za odnośnikami "
+"względnymi\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTA lista dozwolonych katalogów\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names użycie nazw podanych jako ostatnich\n"
+" elementów URL-i przekierowań\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTA lista odrzucanych katalogów\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent bez wychodzenia poza katalog nadrzędny\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Prosimy o wysyłanie zgłoszeń błędów, pytań i dyskusji na adres <bug-wget@gnu."
+"org>\n"
+"i/lub otwieranie zgłoszeń pod https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, nie-interaktywny pobieracz sieciowy.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Hasło dla użytkownika %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Hasło: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nie można utworzyć potoku\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "BÅ‚Ä…d inicjowania akcji plikowych posix_spawn dla use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "BÅ‚Ä…d ustawiania akcji plikowych posix_spawn dla use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "BÅ‚Ä…d odczytu odpowiedzi od polecenia \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Nazwa użytkownika dla '%s%s': "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Hasło dla '%s%s@%s': "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokalizacja: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilacja: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Odnośnik: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s zbudowany na systemie %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (środowisko)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (użytkownik)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licencja GPLv3+: GNU GPL w wersji 3 lub późniejszej\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Niniejszy program jest oprogramowaniem wolnodostępnym: można go\n"
+"modyfikować i rozpowszechniać.\n"
+"Nie ma ŻADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Autor oryginału Hrvoje Niksic <hniksic@arsdigita.com>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Prosimy o zgłaszanie błędów i propozycji na adres <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problem z przydzieleniem pamięci\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Zakończenie z powodu błędu w %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Polecenie `%s --help' wyświetli więcej opcji.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: nieprawidłowa opcja -- `n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Obsługa diagnostyki nie jest wkompilowana. Zigorowano flagę --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Podano jednocześnie --no-clobber i --convert-links, zostanie użyte tylko --"
+"convert-links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Podano jednocześnie --no-clobber i --convert-file-only, zostanie użyte tylko "
+"--convert-file-only.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr ""
+"Nie można jednocześnie wyświetlać więcej informacji i w ogóle nic nie "
+"wyświetlać.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Nie można jednocześnie używać znaczników czasu i zakazać nadpisywania "
+"starych plików.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Nie można podać jednocześnie --inet4-only i --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Nie można podać jednocześnie -k lub --convert-file-only oraz -O, jeśli "
+"podano kilka URL-i,\n"
+"lub w połączeniu z -p lub -r. Więcej informacji w podręczniku.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"UWAGA: łączenie -O z -r lub -p spowoduje umieszczenie całej pobranej treści\n"
+"we wskazanym pliku.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"UWAGA: korzystanie ze znaczników czasu nie działa w połączeniu z -O.\n"
+"Szczegóły w podręczniku.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Wyjście WARC nie działa z --no-clobber, --no-clobber zostanie wyłączone.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "Wyjście WARC nie działa ze znacznikami czasu, zostaną one wyłączone.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Wyjście WARC nie działa z --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Wyjście WARC nie działa z --continue ani --start-pos, opcje te zostaną "
+"wyłączone.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Skróty są wyłączone; deduplikacja WARC nie znajdzie powtórzonych rekordów.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Kompresja nie działa z --continue ani --start-pos, opcje te zostaną "
+"wyłączone.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Nie można podać jednocześnie --ask-password i --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Określenie jednocześnie --start-pos oraz --continue nie jest zalecane; --"
+"continue zostanie wyłączone.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: brakujÄ…cy URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Nie można podać jednocześnie --post-data i --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Nie można użyć --post-data ani --post-file wraz z --method. --method "
+"oczekuje przekazania danych opcjÄ… --body-data lub --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Żeby użyć parametru --body-data lub --mody-file, trzeba określić metodę "
+"przez --method=MetodaHTTP.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Nie można podać jednocześnie --body-data i --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ta wersja nie obsługuje IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k lub -r może być użyte wraz z -O tylko jeśli wyjściem jest zwykły plik.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links lub --convert-file-only można użyć razem tylko jeśli "
+"wyjściem jest zwykły plik.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Nie udało się zainicjować biblioteki libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Nie udało się zainicjować kanału c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Nie udało się odczytać adresu IP '%s'\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Nie udało się ustawić serwera(ów) DNS '%s' (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nie znaleziono URL-i w %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Nie udało się przeanalizować pliku metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Nie udało się pobrać wszystkich zasobów z %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ZAKOŃCZONO --%s--\n"
+"Całkowity czas zegarowy: %s\n"
+"Pobrano: %d plików, %s w %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Ograniczenie na ilość pobieranych danych (%s bajtów) PRZEKROCZONE!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O nie jest obsługiwany dla pobrań metalink. Zignorowano.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planowy plik metalink: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Zabezpieczony plik metalink: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Odrzucenie pliku metalink. Nazwa nie jest bezpieczna.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Przetwarzanie metaurla %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Odrzucenie pliku metaurl %s. Nazwa nie jest bezpieczna.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Nie udało się pobrać %s. Pominięto metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Nie udało się przeanalizować pliku metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Przetwarzanie metaurli zakończyło się błędem.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Typ zasobu %s nie jest obsługiwany, zignorowano...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Nie udało się otworzyć pobranego pliku.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Obliczanie rozmiaru %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Nie określono rozmiaru pliku. Pominięto sprawdzenie.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nie udało się pobrać rozmiaru pliku.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Niezgodność rozmiaru dla pliku %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Rozmiar siÄ™ zgadza.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Obliczanie sumy kontrolnej %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Suma kontrolna jest zgodna.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Niezgodność sumy kontrolnej dla pliku %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Nie udało się otworzyć pobranego pliku w celu sprawdzenia podpisu.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Sprawdzenie podpisu powiodło się.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Błędny podpis. Odrzucono zasób.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Dane pasujÄ… do podpisu, ale podpis nie jest zaufany.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Nie znaleziono sum kontrolnych.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Nie udało się pobrać %s. Pominięto zasób.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Plik %s został pobrany, ale rozmiar się nie zgadza.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Plik %s został pobrany, ale suma kontrolna się nie zgadza.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Plik %s został pobrany, ale podpis się nie zgadza.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Zmiana nazwy %s na %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Kontynuacja w tle.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Kontynuacja w tle, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Wyjście zostanie zapisane do %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() nie powiodło się\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() nie powiodło się\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr ""
+"%s: Nie można znaleźć dającego się użyć sterownika do gniazd (socket).\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"ioctl() nie powiodło się. Nie udało się ustawić gniazda w tryb blokujący.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: uwaga: element %s pojawia się przed każdą nazwą komputera\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: nieznany element (token) \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Składnia: %s NETRC [NAZWA_HOSTA]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: nie można pobrać informacji o %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "UWAGA: użycie słabego zarodka liczb losowych.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Nie udało się nakarmić PRNG; proszę rozważyć użycie --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Użyta wersja OpenSSL jest zbyt stara, aby obsłużyć TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Użyta wersja OpenSSL jest zbyt stara, aby obsłużyć TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Użyta wersja OpenSSL jest zbyt stara, aby obsłużyć TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: nie zaimplementowana wartość opcji 'secure-protocol' %d\n"
+
+# c-format
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Błędna lista szyfrów: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Nie udało się ustawić zaufania na częściowy łancuch\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Nie udało się przydzielić parametru weryfikacji\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"UWAGA: Nie udało się nakarmić PRNG; proszę rozważyć użycie --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: błąd kontroli certyfikatu dla %s, wystawionego przez %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " BÅ‚Ä…d lokalnej kontroli centrum certyfikacji.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Napotkano samodzielnie podpisany certyfikat.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Wydany certyfikat nie jest jeszcze ważny.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Wydany certyfikat wygasł.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: żadna z alternatywnych nazw w certyfikacie nie pasuje\n"
+"\tdo żądanej nazwy hosta %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: nazwa w certyfikacie %s nie pasuje do żądanej nazwy hosta %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: nazwa w certyfikacie jest nieprawidłowa (zawiera znak NUL).\n"
+" Może to oznaczać, że host nie jest tym, za który się podaje\n"
+" (tzn. nie jest prawdziwym %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Aby połączyć się z %s w sposób niebezpieczny, można użyć `--no-check-"
+"certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ pomijanie %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Nieprawidłowa specyfikacja stylu wizualizacji %s; pozostawiono bez zmian.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " w "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Nie można pobrać częstotliwości zegara czasu rzeczywistego: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Usuwanie %s ponieważ powinien być odrzucony.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nie można otworzyć %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Wczytywanie robots.txt; proszę zignorować błędy.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Błąd podczas analizy składni URL-a proxy %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Błąd w URL-u proxy %s: Musi być HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "przekroczono %d przekierowań.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Program nie może sobie poradzić.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Ponawianie próby.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Nie znaleziono błędnych odnośników.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Znaleziono %d błędny odnośnik.\n"
+"\n"
+msgstr[1] ""
+"Znaleziono %d błędne odnośniki.\n"
+"\n"
+msgstr[2] ""
+"Znaleziono %d błędnych odnośników.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Brak błędu"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nieobsługiwany schemat %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Brak schematu"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Niewłaściwa nazwa hosta"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Niewłaściwy numer portu"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Niewłaściwa nazwa użytkownika"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Niedokończony adres numeryczny IPv6"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Adresy IPv6 nie są obsługiwane"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Niewłaściwy adres numeryczny IPv6"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Obsługa HTTPS nie została wkompilowana"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Napotkano niemożliwą do przekształcenia sekwencję wielobajtową\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Nie udało się przydzielić wystarczającej ilości pamięci; pamięć "
+"wyczerpana.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Nie udało się przydzielić %ld bajtów; pamięć wyczerpana.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: bufor tekstu zbyt duży (%d bajtów), przerwano.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Kontynuacja w tle, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nie udało się usunąć dowiązania symbolicznego %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Nie udało otworzyć przez Fopen pliku %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Nie udało się uzyskać FD dla pliku %s.\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+"Nie udało się wykonać stat na pliku %s (proszę sprawdzić uprawnienia).\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Plik %s zmienił się od ostatniego sprawdzenia. Kontrola bezpieczeństwa nie "
+"powiodła się.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Nie udało się otworzyć pliku %s, powód: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Nie udało się wykonać stat na %s, błąd: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Próba otwarcia pliku %s, ale zmienił się od ostatniego sprawdzenia. Kontrola "
+"bezpieczeństwa nie powiodła się.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Błędne wyrażenie regularne %s, błąd PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Błędne wyrażenie regularne %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "BÅ‚Ä…d podczas dopasowywania %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Pominięto klucz o niewłaściwym rozmiarze (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "BÅ‚Ä…d ustawiania pozycji w pliku WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Błąd zapisywania buforów pliku WARC na dysk.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "BÅ‚Ä…d przy powielaniu deskryptora pliku WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "BÅ‚Ä…d otwierania strumienia GZIP do pliku WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "BÅ‚Ä…d zapisu rekordu warcinfo do pliku WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Otwieranie pliku WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "BÅ‚Ä…d otwierania pliku WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Plik CDX nie zawiera oryginalnych URL-i (brak kolumny 'a').\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Plik CDX nie zawiera sum kontrolnych (brak kolumny 'k').\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Plik CDX nie zawiera id rekordów (brak kolumny 'u').\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Wczytano %d rekord z pliku CDX.\n"
+"\n"
+msgstr[1] ""
+"Wczytano %d rekordy z pliku CDX.\n"
+"\n"
+msgstr[2] ""
+"Wczytano %d rekordów z pliku CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Nie udało się odczytać pliku CDX %s do deduplikacji.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Nie udało się otworzyć pliku tymczasowego manifestu WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Nie udało się otworzyć pliku tymczasowego logu WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Nie udało się otworzyć pliku WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Nie udało się otworzyć pliku CDX do zapisu.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Nie udało się otworzyć pliku tymczasowego WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Znaleziono dokładne dopasowanie w pliku CDX. Zapis rekordu revisit do WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Nieznany błąd systemowy"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Rodzina adresów dla podanej nazwy hosta nie jest obsługiwana"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Błędna wartość ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Nienaprawialny błąd w rozwiązywaniu nazw"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family zawiera nie obsługiwaną rodzinę protokołów"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Błąd przydzielania pamięci"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Brak adresu zwiÄ…zanego z nazwÄ… hosta"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nieznana nazwa lub usługa"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Usługa nie obsługiwana dla danego ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype zawiera nie obsługiwany typ gniazda"
+
+#~ msgid "System error"
+#~ msgstr "BÅ‚Ä…d systemowy"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Bufor argumentu zbyt mały"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Przetwarzanie żądania jest w toku"
+
+#~ msgid "Request canceled"
+#~ msgstr "Żądanie anulowane"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Żądanie nie anulowane"
+
+#~ msgid "All requests done"
+#~ msgstr "Wszystkie żądania wykonane"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Przerwane przez sygnał"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "ÅaÅ„cuch parametru niepoprawnie zakodowany"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: opcja '%s%s' jest niejednoznaczna\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: opcja '%s%s' jest niejednoznaczna; możliwości:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: nieznana opcja '%s%s'\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: opcja '%s%s' nie może mieć argumentów\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: opcja '%s%s' musi mieć argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: błędna opcja -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: opcja musi mieć argument -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Sukces"
+
+#~ msgid "No match"
+#~ msgstr "Nic nie pasuje"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Błędne wyrażenie regularne"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Błędny znak sortowany"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Błędna nazwa klasy znaków"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Kończący znak `\\'"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Błędne odniesienie wstecz"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Niesparowane [, [^, [:, [. lub [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Niesparowane ( lub \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Niesparowane \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Błędna zawartość \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Błędny koniec zakresu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Pamięć wyczerpana"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Błędne poprzedzające wyrażenie regularne"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Przedwczesny koniec wyrażenia regularnego"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Wyrażenie regularne zbyt duże"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Niesparowane ) lub \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Brak poprzedniego wyrażenia regularnego"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nie można utworzyć potoku"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "podproces %s zawiódł"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle nie powiodło się"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "nie można odtworzyć fd %d: dup2 nie powiodło się"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "podproces %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "podproces %s dostał krytyczny sygnał %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "pamięć wyczerpana"
diff --git a/po/pt.gmo b/po/pt.gmo
new file mode 100644
index 0000000..c5023b7
--- /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..146c336
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,3677 @@
+# Portuguese translation of the "wget" messages
+# Copyright (C) 2018 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Helder Correia <helder.pereira.correia@gmail.com>, 2005-2008.
+# Pedro Albuquerque <pmra@protonmail.com>, 2018, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 07:24+0100\n"
+"Last-Translator: Pedro Albuquerque <pmra@protonmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Geany / PoHelper 1.36\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: impossível resolver o endereço de associação \"%s\"; a desactivar a "
+"associação.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "A ligar a %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "A ligar a %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "A ligar a [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF falhou: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "ligado.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "falhou: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: impossível resolver o endereço do servidor %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR falhou: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Demasiados fds abertos. Impossível usar selecção num fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Ligações convertidas em %d ficheiros em %s segundos.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "A converter ligações em %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nada a fazer.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Impossível converter ligações em %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Impossível eliminar %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Impossível fazer segurança de %s como %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Impossível obter cookie para %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Erro de sintaxe em Set-Cookie: %s na posição %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "O \"cookie\" vindo de %s tentou definir o domínio como "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Impossível abrir o ficheiro de cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Erro ao escrever em %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Erro ao fechar %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Tipo de listagem não suportado, a tentar o analisador de listagem Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ãndice de /%s em %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "tempo desconhecido "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Ficheiro "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Pasta "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Ligação "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Incerto "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Tamanho: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) restante"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s restante"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (não autoritário)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Impossível inicializar SSL. Será desactivado.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "A iniciar sessão como %s... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Erro na resposta do servidor, a fechar a ligação de controlo.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Erro na saudação do servidor.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "A escrita falhou, a fechar a ligação de controlo.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "O servidor recusa a sessão.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Início incorrecto.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Sessão iniciada!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "O servidor não aceitou o comando \"PBSZ 0\".\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "O servidor não aceitou o comando \"PROT %c\".\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Erro do servidor, impossível determinar o tipo de sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "feito.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo \"%c\" desconhecido, a fechar a ligação de controlo.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD desnecessário.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Secção logicamente impossível atingida em getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Pasta %s inexistente.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD não requerido.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "O ficheiro já foi obtido.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Impossível iniciar a transferência PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Impossível analisar a resposta PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "impossível ligar a %s porta %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Erro de associação (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORTA inválida.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST falhou, a reiniciar.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+"Ficheiro %s existe.\n"
+"\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"Ficheiro %s não existe.\n"
+"\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ficheiro %s não existe.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ficheiro ou pasta %s inexistente.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s formou-se de repente.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, a fechar a ligação de controlo.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - ligação de dados: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Ligação de controlo fechada.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Transferência de dados abortada.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "O ficheiro %s já existe; a não obter.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(tentativa:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito em stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gravado [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "A remover %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "A usar %s como ficheiro de listagem temporário.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s removido.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Profundidade de recursividade %d excedeu a profundidade máxima %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Ficheiro remoto mais antigo que o ficheiro local %s -- a não obter.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Ficheiro remoto mais recente que o ficheiro local %s -- a obter.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Os tamanhos não coincidem (local %s) -- a obter.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nome da ligação simbólica inválido, a ignorar.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr "Já tem a ligação simbólica correcta %s -> %s\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "A criar a ligação simbólica %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Ligações simbólicas não suportadas, a ignorar ligação simbólica %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "A ignorar a pasta %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tipo de ficheiro desconhecido ou não suportado.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Falha ao definir permissões para %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: carimbo corrompido.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"As pastas não serão transferidas, uma vez que a profundidade é %d (máx. "
+"%d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "A não descer até %s, uma vez que está excluída/não incluída.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "A rejeitar %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "A rejeitar %s (entrada inválida).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s está excluída/não incluída através de regexp.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Erro ao comparar %s com %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Não há correspondências com o padrão %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Ãndice HTMLescrito em %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Ãndice HTML escrito em %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERRO: impossível abrir pasta %s\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERRO: falha ao abrir cert %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Carregado certificado CA \"%s\"\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERRO: falha ao carregar ficheiro CRL \"%s\": (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Carregado ficheiro CRL \"%s\"\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ERRO: GnuTLS requer que a chave e o certificado sejam do mesmo tipo.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "A sua versão GnuTLS é demasiado antiga para suportar TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: valor da opção \"secure-protocol\" %u não implementado\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Por favor, reporte este erro a <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: valor da opção \"secure-protocol\" %d não implementado\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: impossível definir a cadeia prio directamente. A recuar para a "
+"prioridade predefinida.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERRO"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVISO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: sem certificado apresentado por %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: o certificado de %s não é de confiança.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: o certificada de %s não tem um utilizador conhecido.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: o certificado de %s foi revogado.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: o signatário do certificado %s não é um CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: o certificado de %s foi assinado usando um algoritmo inseguro.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: o certificado de %s ainda não foi activado.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: o certificado de %s expirou.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Erro ao initializar o certificado X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Sem certificados\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Erro ao analisar o certificado: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "O certificado ainda não foi activado\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "O certificado expirou\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "O dono do certificado não corresponde ao nome do servidor %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "A chave pública não corresponde à chave pública afixada!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "O certificado tem de ser X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Erro ao gerir a lista de endereços.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Servidor desconhecido"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Falha temporária na resolução de nome"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Erro desconhecido"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "A resolver %s..."
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "falhou: sem endereços IPv4/IPv6 para o servidor.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "falhou: terminou o tempo.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: impossível resolver a ligação incompleta %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"atributo no-follow encontrado em %s. Não serão seguidas ligações nesta "
+"página\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL inválido %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Falha ao escrever o pedido HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Sem cabeçalhos, a assumir HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro %s já existe, a não obter.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime falhou. Isto é provavelmente um erro.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Impossível converter a datação para formato http. A recuar para hora 0 como "
+"última modificação.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Ficheiro de dados BODY %s em falta: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "A reutilizar ligação existente a [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "A reutilizar ligação existente a %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Falha ao ler a resposta do proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERRO %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Linha de estado mal formada"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Túnel proxy falhou: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Esquema de autenticação desconhecido.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autenticação seleccionada: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "A gravar em: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Ao transferir assinatura:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Impossível ler conteúdo da assinatura do ficheiro temporário. A saltar.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Impossível criar ficheiro temporário. A saltar a transferência da "
+"assinatura.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valor pri inválido. A assumir %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Impossível encontrar informação aceitável para recursos Metalink.\n"
+"A ignorá-los.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "A desactivar SSL devido a erros encontrados.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Pedido %s enviado, a aguardar resposta..."
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nenhuns dados recebidos.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Erro de leitura (%s) nos cabeçalhos.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sem descrição)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Localização: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "não especificado"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [a seguir]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Ficheiro %s não modificado no servidor. A omitir transferência.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Servidor ignorado Cabeçalho If-Modified-Since para o ficheiro %s.\n"
+"Poderá querer adicionar a opção --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" O ficheiro já foi obtido; nada a fazer.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Tamanho: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorado"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Aviso: caracteres universais não são suportados em HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Modo de aranha activado. Verificar se o ficheiro remoto existe.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Impossível escrever em %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Atributo requerido em falta no cabeçalho recebido.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autenticação Utilizador/Senha falhou.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Impossível escrever no ficheiro WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Impossível escrever no ficheiro temporário WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Impossível estabelecer ligação SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Impossível desligar %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERRO: redireccionamento (%d) sem localização.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Impossível encontrar dados Metalink na resposta HTTP. A transferir ficheiro "
+"com HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Encontrados cabeçalhos Metalink. A mudar para modo Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "O ficheiro remoto não existe -- ligação quebrada!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Último cabeçalho modificado em falta -- carimbos desactivados.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Último cabeçalho modificado inválido -- carimbo ignorado.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro do servidor não é mais recente que o ficheiro local %s -- a não "
+"obter.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Os tamanhos não coincidem (local %s) -- a obter.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "O ficheiro remoto é mais recente, a obter.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe e pode conter ligações a outros recursos -- a "
+"obter.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe mas não contém ligações -- a não obter.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe e pode conter mais ligações,\n"
+"mas a recursividade está desactivada -- a não obter.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"O ficheiro remoto existe.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito em stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s gravado [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - ligação fechada no byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - erro de leitura no byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - erro de leitura no byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Qualidade de protecção \"%s\" não suportada.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritmo \"%s\" não suportado.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC aponta para %s, o qual não pôde ser acedido devido a erro: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: impossível ler %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: erro em %s na linha %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: erro de sintaxe em %s na linha %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: comando desconhecido %s em %s na linha %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Análise do ficheiro de sistema wgetrc (env SYSTEM_WGETRC) falhou. Por favor, "
+"verifique\n"
+"\"%s\",\n"
+"ou especifique um ficheiro diferente , usando --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Análise do ficheiro de sistema wgetrc falhou. Por favor, verifique\n"
+"\"%s\",\n"
+"ou especifique um ficheiro diferente, usando --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: aviso: o ficheiro de sistema e o de utilizador wgetrc apontam para %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Comando %s --execute inválido\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: valor lógico %s inválido; use \"on\" ou \"off\".\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: valor lógico %s inválido; use \"on\" ou \"off\".\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Número %s inválido.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s só deve ser usado uma vez\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: valor de byte %s inválido\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s período de tempo %s inválido\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s período de tempo %s negativo\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass requer uma cadeia ou que esteja definida uma das variáveis de "
+"ambiente WGET_ASKPASS ou SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: valor %s inválido.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: cabeçalho %s inválido.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: cabeçalho WARC %s inválido.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: tipo de progresso %s inválido.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: restrição %s inválida,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol], [ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Codificação %s inválida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Conversão de %s para %s não suportada\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Encontrada sequência multi-byte incompleta ou inválida\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Erro %d não gerido\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: idioma não definido\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode falhou (%d): %s\n"
+
+# lower pode ser "minúsculas"
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Falha ao converter para menor: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"a redireccionar saída para %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; a desactivar diário.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uso: %s [OPÇÃO]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumentos obrigatórios para opções longas são também obrigatórios para "
+"opções curtas.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Arranque:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version mostra a versão do Wget e sai\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help mostra esta mensagem\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background vai para 2º plano após o arranque\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMANDO executa um comando estilo \".wgetrc\"\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Diário e ficheiro de entrada:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FICHEIRO regista as mensagens em FICHEIRO\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FICHEIRO anexa mensagens a FICHEIRO\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug mostra bastante informação de depuração\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug mostra saída de depuração Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet silencioso (sem saída)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose verboso (predefinição)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose desactiva a verbosidade, sem ser "
+"silencioso\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIPO mostra largura de banda como TIPO. TIPO "
+"pode ser bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FICHEIRO transferir URLs encontrados em FICHEIRO "
+"local ou externo\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FICHEIRO transferir ficheiros em FICHEIRO local "
+"Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html trata o ficheiro de entrada como HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL resolve ligações HTML do ficheiro de "
+"entrada (-i -F)\n"
+" relativas ao URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FICHEIRO especifica o ficheiro config a usar\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config não lê nenhum ficheiro config\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FILE regista motivos para rejeição de FICHEIRO "
+"pelo URL\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Transferência:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NÚMERO define NÚMERO de tentativas (0 para "
+"ilimitado).\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused repete, mesmo se a ligação for recusada\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERROS lista separada por vírgulas de erros "
+"HTTP para tentar de novo\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FICHEIRO escreve os documentos em FICHEIRO\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber salta transferências que iriam "
+"sobrescrever\n"
+" ficheiros existentes\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc não tenta obter credenciais de .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue retoma a obtenção de um ficheiro "
+"parcialmente transferido\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=DESVIO começa a transferência da posição baseada "
+"em zero DESVIO\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TYPE selecciona o tipo de manómetro do "
+"progresso\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress mostra o progresso em qualquer modo de "
+"verbosidade\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping não re-obtém ficheiros, a não ser os mais "
+"recentes que o\n"
+" local\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since não usa a condicional if-modified-since\n"
+" obtém pedidos em modo de datação\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps não define a datação do ficheiro local "
+"pelo\n"
+" do que está no servidor\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response mostra a resposta do servidor\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider não transfere nada\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEGUNDOS define todos os tempos de expiração para "
+"SEGUNDOS\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ENDEREÇOS lista de servidores DNS a questionar "
+"(separada por vírgulas)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ENDEREÇO associa o solucionador DNS a ENDEREÇO "
+"(nome ou IP) na máquina local\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEGUNDOS define a expiração da procura DNS para "
+"SEGUNDOS\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEGUNDOS define a expiração da ligação para "
+"SEGUNDOS\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEGUNDOS define a expiração de leitura para "
+"SEGUNDOS\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEGUNDOS espera SEGUNDOS entre obtenções\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEGUNDOS espera de 1..SEGUNDOS entre tentativas de "
+"obtenção\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait espera de 0.5*ESPERA...1.5*ESPERA segs "
+"entre obtenções\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy desactivar proxy explicitamente\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NÚMERO define a quota de obtenção como NÚMERO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ENDEREÇO associar a ENDEREÇO (nome ou IP) na "
+"máquina local\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=TAXA limita a taxa de transferência a TAXA\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache desactiva a cache de procuras DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS restringe caracteres nos nomes de "
+"ficheiro aos permitdos por OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignora maiúsculas ao comparar ficheiros/"
+"pastas\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only ligar só a endereços IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only ligar só a endereços IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMÃLIA ligar 1º a endereços de FAMÃLIA,\n"
+" uma de IPv6, IPv4 ou nenhuma\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UTILIZADOR define os utilizadores ftp e http como "
+"UTILIZADOR\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=SENHA define as senhas ftp e http como SENHA\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password pede as senhas\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMANDO especifica o gestor de credenciais para "
+"pedir\n"
+" utilizador e senha. Se não especificar "
+"COMANDO\n"
+" será usada uma das variáveis de "
+"ambiente\n"
+" WGET_ASKPASS ou SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri desactiva o suporte a IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=COD usa COD como codificação local para IRIs\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=COD usa COD como codificação remota "
+"predefinida\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink remove o ficheiro antes de sobrescrever\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash mantém ficheiros com checksum trocada "
+"(anexa .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NÚMERO NÚMERO ordinal de metaurl de aplicação/"
+"metalink4+xml Metalink\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http usa meta-dados Metalink dos cabeçalhos de "
+"resposta HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location localização preferida para recursos "
+"Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr activar armazenagem de meta-dados em "
+"atributos de ficheiro estendidos\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Pastas:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directoriess não criar pastas.\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories forçar a criação de pastas.\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories não criar pastas do servidor.\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories usar o nome do protocolo nas pastas.\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIXO gravar ficheiros em PREFIXO/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NÚMERO ignorar NÚMERO componentes de pasta "
+"remotos.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opções HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=UTILIZADOR define o utilizador HTTP como UTILIZADOR\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=SENHA define a senha HTTP como SENHA\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache proibir dados em cache no servidor\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME altera o nome predefinido da página "
+"(normalmente\n"
+" é \"index.html\".)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension grava documentos HTML/CSS com as "
+"extensões apropriadas\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignora o campo de cabeçalho \"Content-"
+"Length\"\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=CADEIA insere CADEIA entre os cabeçalhos\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TIPO escolhe a compressão entre auto, gzip e "
+"none (predefinição: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect máximo de redireccionamentos permitidos "
+"por página\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UTILIZADOR define UTILIZADOR como utilizador do "
+"proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=SENHA define SENHA como senha do proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inclui o cabeçalho 'Referer: URL' no "
+"pedido HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers grava os cabeçalhos HTTP num ficheiro\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTE identifica como AGENTE em vez de Wget/"
+"VERSÃO\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive desactiva HTTP keep-alive (ligações "
+"persistentes)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies não usa cookies\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FICHEIRO carrega cookies de FICHEIRO antes da "
+"sessão\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FICHEIRO grava cookies em FICHEIRO após a sessão\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies carrega e grava cookies (não-permanente) "
+"da sessão\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=CADEIA usa o método POST; envia CADEIA como "
+"dados\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FICHEIRO usa o método POST; envia o conteúdo do "
+"FICHEIRO\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod usa o método \"HTTPMethod\" no pedido\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=CADEIA envia CADEIA como dados. --method TEM de "
+"estar definido\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FICHEIRO envia o conteúdo de FICHEIRO. --method "
+"TEM de estar definido\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition honrar o cabeçalho Content-Disposition ao "
+"escolher\n"
+" nomes de ficheiro locais "
+"(EXPERIMENTAL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error põe na saída o conteúdo recebido nos "
+"erros do servidor\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge envia informação de autenticação básica "
+"HTTP\n"
+" sem primeiro esperar pelo desafio do\n"
+" servidor\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opções HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR escolhe o protocolo de segurança, um de "
+"auto, SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 e PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only seguir só ligações HTTPS seguras\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate não validar o certificado do servidor\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=FICHEIRO ficheiro de certificado do cliente\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIPO tipo de certificado do cliente, PEM ou "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FICHEIRO ficheiro de chave privada\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIPO tipo de chave privada, PEM ou DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FILE ficheiro com o conjunto de CAs\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR pasta onde está armazenada a lista de "
+"hash dos CAs\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FICHEIRO ficheiro com o conjunto de CRLs\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FICH/HASHES Ficheiro de chave pública (PEM/DER), ou "
+"qualquer\n"
+" nº de hashes sha256 de base64 precedido "
+"de\n"
+" 'sha256//' e separado por ';', para "
+"verificar\n"
+" contra o par\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FICHEIRO ficheiro com dados aleatórios para semear "
+"o SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FICHEIRO ficheiro a nomear a socket EGD com dados "
+"aleatórios\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=CADEIA define a cadeia de prioridade (GnuTLS) ou a "
+"cadeia de lista de cifra (OpenSSL) directamente.\n"
+" Use com cuidado. Esta opção sobrepõe-se a "
+"--secure-protocol.\n"
+" O formato e sintaxe desta cadeia depende "
+"do motor SSL/TLS específico.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opções HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts desactiva HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file caminho da base de dados HSTS "
+"(sobrescreve a predefinição)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opções FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf usa formato Stream_LF para todos os "
+"ficheiros binários FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=UTILIZADOR define o utilizador FTP como UTILIZADOR\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=SENHA define a senha FTP como SENHA\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing não remove ficheiros '.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob desactiva FTP globbing dos nomes de "
+"ficheiro\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp desactiva o modo de transferência "
+"\"passive\"\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions preserva as permissões do ficheiro "
+"remoto\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks em recursividade, obter ficheiros ligados-"
+"a (não pastas)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opções FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit usa FTPS implícito (porta predefinida "
+"é 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl retoma a sessão SSL/TLS iniciada na "
+"ligação de controlo ao\n"
+" abrir uma ligação de dados\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection encripta só o canal de controlo; os "
+"dados ficam em texto simples\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp recuar para FTP se FTPS não for "
+"suportado pelo servidor alvo\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opções WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=NOMEFICH gravar dados de pedido/resposta num "
+"ficheiro .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=CADEIA insere CADEIA no registo warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NÚMERO define o tamanho máximo de ficheiros WARC "
+"como NÚMERO\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx escreve ficheiros de índice CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=NOMEFICH não armazena registos listados neste "
+"ficheiro CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression não comprime ficheiros WARC com GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests não calcula resumos SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log não armazena o diário num registo WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=PASTA localização para ficheiros temporários "
+"criados pelo\n"
+" escritor WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Transferência recursiva:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive especifica a transferência recursiva\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NÚMERO profundidade máxima de recursividade (inf "
+"ou 0 para infinita)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after elimina ficheiros locais após transferi-"
+"los\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links aponta ligações nos ficheiros HTML ou "
+"CSS\n"
+" transferidos para ficheiros locais\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only converte só a secção de ficheiro dos URLs "
+"(conhecida como nome-base)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N antes de escrever o ficheiro X, roda até "
+"N cópias de segurança\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted antes de converter o ficheiro X, faz uma "
+"segurança X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted antes de converter o ficheiro X, faz uma "
+"segurança X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror atalho para -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites obtém tudo o necessário para mostrar a "
+"página HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments activa a gestão estrita (SGML) de "
+"comentários HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Aceitação/Rejeição recursiva:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA lista separada por vírgulas das extensões "
+"aceites\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA lista separada por vírgulas das extensões "
+"rejeitadas\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX REGEXg correspondente aos URLs aceites\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX REGEX correspondente aos URLs rejeitados\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TIPO TIPO de regex (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TIPO TIPO de regex (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA lista separada por vírgulas dos domínios "
+"aceites\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA lista separada por vírgulas dos domínios "
+"rejeitados\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp segue ligações FTP de documentos HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA lista separada por vírgulas das etiquetas "
+"HTML seguidas\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST lista separada por vírgulas das etiquetas "
+"HTML ignoradas\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts vai para servidores estrangeiros quando "
+"recursivo\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative segue só ligações relativas\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTA LISTA de pastas permitidas\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names usa o nome especificado pelo último\n"
+" componente do URL de redireccionamento\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTA LISTA de pastas excluídas\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent não sobe à pasta-mãe\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Envie relarórios de erro, questões ou discussões para <bug-wget@gnu.org>\n"
+"e/ou abra tópicos em https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, um transferidor de rede não interactivo.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Senha do utilizador %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Senha: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Impossível criar túnel\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Erro ao inicializar acções de geração de ficheiro para use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Erro ao definir acções de geração de ficheiro para use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Erro ao ler resposta do comando \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Utilizador para \"%s%s\": "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Senha para \"%s%s@%s\": "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Idioma: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compilação: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Ligação: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s compilado a %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (ambiente)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (utilizador)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (©) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licença GPLv3+: GNU GPL versão 3 ou posterior\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Este software é grátis: é livre de o alterar e redistribuir.\n"
+"Não há QUALQUER GARANTIA, até ao limite permitido por Lei.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Originalmente escrito por Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Por favor, envie erros e questões para <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problema de alocação de memória\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "A sair devido a erro em %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Tente \"%s --help\" para mais opções.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: opção ilegal -- \"-n%c\"\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Suporte a depuração não compilado. A ignorar --debug-flag.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Tanto --no-clobber como --convert-links foram especificadas, só --convert-"
+"links será usada.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Tanto --no-clobber como --convert-file-only foram especificadas, só --"
+"convert-file-only será usada.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Impossível ser simultaneamente verboso e silencioso.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Impossível datar e não sobrepor ficheiros antigos, simultaneamente.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Impossível especificar simultaneamente --inet4-only e --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Impossível especificar -k ou --convert-file-only e -O simultaneamente se "
+"forem dados múltiplos URLs ou em combinação\n"
+"com -p ou -r. Veja o manual para detalhes.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVISO: combinar -0 com -r ou -p significa que todos os dados transferidos\n"
+"serão colocados no ficheiro único que especificou.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVISO: a datação não tem acção quando combinada com -O. Veja o\n"
+"manual para detalhes.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"A saída WARC não funciona com --no-clobber, --no-clobber será desactivada.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "A saída WARC não funciona com datação, a datação será desactivada.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "A saída WARC não funciona com --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"A saída WARC não funciona com --continue ou --start-pos, serão "
+"desactivadas.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Os resumos estão desactivados; O WARC não encontrará registos duplicados.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"A compressão não funciona com --continue ou --start-pos, serão "
+"desactivadas.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Impossível especificar simultaneamente --ask-password e --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Especificar --start-pos e --continue não é recomendável; --continue será "
+"desactivada.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL em falta\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Impossível especificar simultaneamente --post-data e --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Não pode usar --post-data ou --post-file com --method. --method espera dados "
+"através das opções --body-data e --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Tem de espcificar um método através de --method=HTTPMethod para usar com --"
+"body-data ou --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Impossível especificar simultaneamente --body-data e --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Esta versão não tem suporte para IRIs\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k ou -r só podem ser usadas em conjunto com -O se a saída for um ficheiro "
+"normal.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links ou --convert-file-only só podem ser usadas em conjunto se a "
+"saída for um ficheiro normal.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Falha ao iniciar libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Falha ao iniciar canal c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Falha ao analisar o enderço IP \"%s\"\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Falha ao definir servidor(es) DNS \"%s\" (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Sem URLs em %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Impossível analisar ficheiro Metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Impossível transferir todos os recursos de %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"CONCLUÃDO --%s--\n"
+"Tempo total: %s\n"
+"Transferidos: %d ficheiros, %s em %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Quota de transferência de %s EXCEDIDA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O não suportada para transferência Metalink. A ignorar.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Ficheiro Metalink planeado: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Ficheiro Metalink assegurado: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "A rejeitar ficheiro Metalink. Nome inseguro.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "A processar metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "A rejeitar ficheiro metaurl %s. Nome inseguro.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Falha ao transferir %s. A saltar metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Impossível analisar ficheiro metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Processamento de metaurls devolveu um erro.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tipo de recurso %s não suportado, a ignorar...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Impossível abrir o ficheiro transferido.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "A calcular tamanho para %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Tamamnho de ficheiro não declarado. A saltar verificação.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Impossível obter tamanho do ficheiro transferido\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Tamanho trocado para %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Tamanho coincide.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "A calcular checksum para %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Checksum coincide.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Checksum trocada para %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Impossível abrir ficheiro transferido para verificar assinatura.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Assinatura validada com sucesso.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Assinatura inválida. A rejeitar a fonte.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+"Os dados coincidem com a assinatura, mas a assinatura não é de confiança.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Sem checksums.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Falha ao transferir %s. A saltar recurso.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Ficheiro %s obtido mas o tamanho não coincide.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Ficheiro %s obtido mas a checksum não coincide.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Ficheiro %s obtido mas a assinatura não coincide.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "A renomear %s para %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "A continuar em 2º plano.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "A continuar em 2º plano, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "A saída será escrita em %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() falhou\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() falhou\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: impossível encontrar um controlador de socket utilizável\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() falhou. A socket não pôde ser definida como bloqueando.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: aviso: a expressão %s aparece antes de um nome de máquina\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: expressão desconhecida \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uso: %s NETRC [NOME-DA-MÃQUINA]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: impossível analisar %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVISO: a usar uma semente aleatória fraca.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Impossível semear PRNG; considere usar --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "A sua versão OpenSSL é demasiado antiga para suportar TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "A sua versão OpenSSL é demasiado antiga para suportar TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "A sua versão OpenSSL é demasiado antiga para suportar TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: valor de opção \"secure-protocol\" %d não implementado\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: lista de cifra inválida: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: falha ao definir confiança na cadeia parcial\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: falha ao alocar parâmetro de verificação\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "AVISO: impossível semear PRNG. Considere usar --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: impossível verificar o certificado de %s, emitido por \"%s\":\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Impossível verificar localmente a autoridade do emissor.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Encontrado certificado auto-assinado.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Certificado emitido ainda não é válido.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Certificado emitido expirado.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: nenhuma alternativa ao assunto do certificado corresponde\n"
+"\tao nome de servidor %s pedido.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: o nome comum do certificado %s não corresponde ao nome de servidor "
+"%s pedido.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: nome comum do certificado inválido (contém um carácter NULO).\n"
+" Pode ser indicativo de que o servidor não é quem afirma ser\n"
+" (ou seja, não é o real %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Para ligar a %s de forma insegura, use \"--no-check-certificate\".\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ a saltar %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Especificação de estilo de ponto \"%s\" inválida; a não alterar.\n"
+
+# tre = "tempo restante estimado"
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " tre %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " em "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Impossível obter a frequência de relógio em tempo real: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "A remover %s, uma vez que deve ser rejeitado.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Impossível abrir %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "A carregar robots.txt; por favor, ignore erros.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Erro ao analisar URL do proxy %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Erro no URL do proxy %s: tem de ser HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d redireccionamentos excedidos.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"A desistir.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"A tentar novamente.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Sem ligações quebradas.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] "Encontrada %d ligação quebrada.\n"
+msgstr[1] "Encontradas %d ligações quebradas.\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Sem erros"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Esquema %s não suportado"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Esquema em falta"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nome de máquina inválido"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Mau número de porta"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nome de utilizador inválido"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Endereço numérico IPv6 indeterminado"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Endereços IPv6 não suportados"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Endereço numérico IPv6 inválido"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Suporte a HTTPS não compilado"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Encontrada sequência multi-byte inconvertível\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: falha ao alocar memória suficiente; memória esgotada.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: falha ao alocar %ld bytes; memória esgotada.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: buffer de texto muito grande (%d bytes), a abortar.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "A continuar em 2º plano, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Erro ao remover ligação simbólica %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Falha de Fopen ficheiro %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Falha ao obter FD para o ficheiro %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Falha ao analisar o ficheiro %s, (verifique as permissões)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Ficheiro %s alterado desde a última verificação. Falha no teste de "
+"segurança.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Falha ao abrir o ficheiro %s, motivo :%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Falha ao analisar o ficheiro %s, erro: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"A tentar abrir o ficheiro %s mas foi alterado desde a última verificação. "
+"Falha no teste de segurança.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expressão regular inválida %s, erro PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expressão regular inválida %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Erro ao comparar %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "A saltar chave com tamanho errado (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Erro ao definir posição do ficheiro WARC %s.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Erro ao despejar ficheiro WARC para o disco.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Erro ao duplicar o descritor do ficheiro WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Erro ao abrir fluxo GZIP para ficheiro WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Erro ao escrever o registo warcinfo no ficheiro WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"A abrir ficheiro WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Erro ao abrir ficheiro WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "O ficheiro CDX não lista os URLs originais (coluna \"a\" em falta).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "O ficheiro CDX não lista as checksums (coluna \"k\" em falta).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "O ficheiro CDX não lista IDs de registo (coluna \"u\" em falta).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Carregado %d registo do CDX.\n"
+"\n"
+msgstr[1] ""
+"Carregados %d registos do CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Impossível ler o ficheiro CDX %s para remover duplicados.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Impossível abrir o ficheiro manifest temporário do WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Impossível abrir o ficheiro de diário temporário do WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Impossível abrir o ficheiro WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Impossível abrir o ficheiro CDX para saída.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Impossível abrir o ficheiro WARC temporário.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Encontrada correspondência exacta no ficheiro CDX. A gravar registo de "
+"visita no WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Erro de sistema desconhecido"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Família de endereço para nome de servidor não suportado"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Valor errado para ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Falha irrecuperável na resolução de nome"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family não suportado"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Falha na alocação de memória"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Sem endereço associado ao nome de servidor"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nome ou serviço desconhecidos"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Nome de servidor não suportado para ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype não suportado"
+
+#~ msgid "System error"
+#~ msgstr "Erro de sistema"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Buffer de argumentos muito pequeno"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "A processar pedido em curso"
+
+#~ msgid "Request canceled"
+#~ msgstr "Pedido cancelado"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Pedido não cancelado"
+
+#~ msgid "All requests done"
+#~ msgstr "Todos os pedidos feitos"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrompido por um sinal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Cadeia parâmetro incorrectamente codificada"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: a opção \"%s%s\" é ambígua\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: a opção \"%s%s\" é ambígua; possibilidades:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: opção \"%s%s\" desconhecida\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"%s%s\" não permite um argumento\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "\"%s: a opção \"%s%s\" requer um argumento\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opção inválida -- \"%c\"\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: a opção requer um argumento -- \"%c\"\n"
+
+#~ msgid "`"
+#~ msgstr "\""
+
+#~ msgid "'"
+#~ msgstr "\""
+
+#~ msgid "Success"
+#~ msgstr "Sucesso"
+
+#~ msgid "No match"
+#~ msgstr "Sem correspondência"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expressão regular inválida"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Carácter de agrupamento inválido"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nome de classe de carácter inválido"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Barra invertida final"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Referência de retorno inválida"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [., ou [= sem par"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( ou \\( não correspondido"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ não correspondido"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Conteúdo de \\{\\} inválido"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Final de intervalo inválido"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memória esgotada"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Expressão regular precedente inválida"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Fim prematuro de expressão regular"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expressão regular muito grande"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") ou \\) sem par"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Sem expressão regular prévia"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "impossível criar túnel"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "sub-processo %s falhou"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle falhou"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "impossível restaurar fd %d: dup2 falhou"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "sub-processo %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "sub-processo %s obteve sinal fatal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "Memória esgotada"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr "Envie erros, questões e discussões para <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opção \"--%s\" não permite argumentos\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: opção não reconhecida \"--%s\"\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: a opção \"-W %s\" é ambígua\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" não permite argumentos\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" requer um argumento\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "O ficheiro \"%s\" já existe; a não obter.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "A autorização falhou.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s recebido.\n"
+
+#, fuzzy
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --spider não transferir os ficheiros.\n"
+
+#, fuzzy
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s: Não é possível resolver a ligação incompleta %s.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opção ilegal -- %c\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL acrescenta URL a ligações relativas no "
+#~ "ficheiro -F -i.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Actualmente mantido por Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ "Cannot specify -N if -O is given. See the manual for details.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Não é possível especificar -N se -O for usado. Veja detalhes no manual.\n"
+#~ "\n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644
index 0000000..996ebce
--- /dev/null
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..694f9af
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,3891 @@
+# Brazilian Portuguese translations for wget package
+# Traduções em português brasileiro para o pacote wget
+# Copyright (C) 2017 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Wanderlei Antonio Cavassin <cavassin@conectiva.com.br>, 1998.
+# Marcus Moreira de Souza <marcus@frb.br>, 2004.
+# Rodolfo Ribeiro Gomes <rodolforg@gmail.com>, 2008-2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget-1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-09 12:03-0300\n"
+"Last-Translator: Rodolfo Ribeiro Gomes <rodolforg@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
+"net>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Gtranslator 3.36.0\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: não foi possível resolver endereço de associação %s; desabilitando a "
+"associação.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Conectando-se a %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Conectando-se a %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Conectando-se a [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF falhou: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "conectado.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "falha: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: não foi possível resolver endereço de máquina %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR falhou: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Muitos descritores de arquivos em aberto. Não é selecionável um fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Links convertidos em %d arquivos em %s segundos.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Convertendo links em %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nada a ser feito.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+# , c-format
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Não foi possível converter links em %s: %s\n"
+
+# , c-format
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Não foi possível excluir %s: %s\n"
+
+# , c-format
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Não foi possível fazer uma cópia de segurança de %s como %s: %s\n"
+
+# , c-format
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Incapaz de obter o cookie para %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Erro de sintaxe em Set-Cookie: %s na posição %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie vindo de %s tentou designar domínio como"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Não foi possível abrir o arquivo de cookies %s: %s\n"
+
+# , c-format
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Erro ao gravar em %s: %s.\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Erro ao fechar %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Não há suporte para o tipo de listagem. Tentando usar interpretador de "
+"listagem UNIX.\n"
+
+# , c-format
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ãndice de /%s em %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "horário desconhecido "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Arquivo "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Diretório "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Incerto "
+
+# , c-format
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bytes)"
+
+# , c-format
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Tamanho: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) restantes"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s restantes"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (sem autoridade)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Não foi possível iniciar o SSL. Ele será desabilitado.\n"
+
+# , c-format
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Acessando como %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Erro na resposta do servidor, fechando a conexão de controle.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Erro na saudação do servidor.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Falha de escrita, fechando a conexão de controle.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "O servidor recusou o acesso.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Identificação incorreta.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Acesso autorizado!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "O servidor não aceitou o comando \"PBSZ 0\".\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "O servidor não aceitou o comando \"PROT %c\".\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Erro do servidor, não foi possível determinar tipo de sistema.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "feito.\n"
+
+# , c-format
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tipo \"%c\" é desconhecido, fechando a conexão de controle.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "feito. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD não é necessário.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Seção logicamente impossível foi alcançada em getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+# , c-format
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"O diretório %s não foi encontrado.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD não exigido.\n"
+
+# , c-format
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "O arquivo já foi obtido.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Não é possível iniciar transferência PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Não foi possível entender resposta do comando PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "não foi possível se conectar a %s porta %d: %s\n"
+
+# , c-format
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Erro na associação (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT é inválido.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST falhou, recomeçando do zero.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "O arquivo %s existe.\n"
+
+# , c-format
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr ""
+"O arquivo %s não foi encontrado.\n"
+"\n"
+
+# , c-format
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"O arquivo %s não foi encontrado.\n"
+"\n"
+
+# , c-format
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"O arquivo ou diretório %s não foi encontrado.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s surgiu do nada.\n"
+
+# , c-format
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, fechando conexão de controle.\n"
+
+# , c-format
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Conexão de dados: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "A conexão de controle está fechada.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "A transferência dos dados foi abortada.\n"
+
+# , c-format
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "O arquivo %s já existe, não será baixado.\n"
+
+# , c-format
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(tentativa:%2d)"
+
+# , c-format
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito para a saída padrão %s[%s]\n"
+"\n"
+
+# , c-format
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvo [%s]\n"
+"\n"
+
+# , c-format
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Removendo %s.\n"
+
+# , c-format
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Usando %s como arquivo temporário de listagem.\n"
+
+# , c-format
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Removeu %s.\n"
+
+# , c-format
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Nível de recursão %d excedeu o nível máximo %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "O arquivo remoto não é mais novo que o local %s -- ignorando.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo remoto é mais novo que o local %s -- baixando.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Os tamanhos não coincidem (local %s) -- baixando.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nome inválido da ligação simbólica, ignorando.\n"
+
+# , c-format
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Ligação simbólica já está correta %s -> %s\n"
+"\n"
+
+# , c-format
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Criando ligação simbólica %s -> %s\n"
+
+# , c-format
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Não há suporte para ligações simbólicas, ignorando a ligação %s.\n"
+
+# , c-format
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Ignorando o diretório %s.\n"
+
+# , c-format
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: o tipo de arquivo é desconhecido ou não possui suporte.\n"
+
+# , c-format
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Falhou em obter permissões para %s.\n"
+
+# , c-format
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: horário (timestamp) corrompido.\n"
+
+# , c-format
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Não serão baixados os diretórios, pois o nível de recursão é %d (máx. %d).\n"
+
+# , c-format
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Não descendo para %s, pois está excluído/não incluído.\n"
+
+# , c-format
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Rejeitando %s.\n"
+
+# , c-format
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Rejeitando %s (entrada inválida).\n"
+
+# , c-format
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s está excluído/não-incluído pela expressão regular.\n"
+
+# , c-format
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Erro ao comparar %s com %s: %s.\n"
+
+# , c-format
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Não há ocorrências para o padrão %s.\n"
+
+# , c-format
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Escrito índice em formato HTML em %s [%s].\n"
+
+# , c-format
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Escrito índice em formato HTML em %s.\n"
+
+# , c-format
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ERRO: Não conseguiu abrir o diretório %s.\n"
+
+# , c-format
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ERRO: Não conseguiu abrir o certificado %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Carregou certificado CA \"%s\"\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ERRO: Falha em carregar arquivo LCR \"%s\": (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Carregou arquivo LCR \"%s\"\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ERRO: GnuTLS exige que a chave e o certificado sejam do mesmo tipo.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Sua versão do GnuTLS é muito antiga para suportar TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: valor %u para opção \"secure-protocol\" não implementado\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Por favor, relate este problema para bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: valor %d para opção \"secure-protocol\" não implementado\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Não é possível definir texto prio diretamente. Retrocedendo para "
+"prioridade padrão.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ERRO"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVISO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Nenhum certificado apresentado por %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: O certificado de %s não é confiável.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: O certificado de %s não tem um emissor conhecido.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: O certificado de %s foi revogado.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: O signatário do certificado de %s não era uma AC.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: O certificado de %s foi assinado usando um algoritmo inseguro.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: O certificado de %s ainda não está ativo.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: O certificado de %s expirou.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Erro ao iniciar o certificado X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nenhum certificado foi encontrado\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Erro ao analisar o certificado: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "O certificado não foi ativado ainda\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "O certificado expirou\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "O dono do certificado não coincide com o nome de máquina %s.\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "A chave pública não coincide com a chave pública memorizada!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "O certificado precisa ser X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Erro ao manipular a lista de endereços.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "A máquina é desconhecida"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Falha temporária na resolução de nome"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Erro desconhecido"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Resolvendo %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "falha: Não há endereços IPv4/IPv6 para a máquina.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "falha: o tempo esgostou.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Não foi possível resolver o link incompleto %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"atributo \"no-follow\" encontrado em %s. Não seguirá quaisquer links na "
+"página\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: O URL %s é inválido: %s.\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Falhou em enviar requisição HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Não foram recebidos cabeçalhos, assumindo HTTP/0.9"
+
+# , c-format
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo %s já existe, não será baixado.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime falhou. Isso provavelmente é um bug.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Não foi possível converter o horário para o formato HTTP. Assumindo a hora 0 "
+"como horário da última modificação.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "O arquivo %s de dados BODY está faltando: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Reaproveitando a conexão existente para [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Reaproveitando a conexão existente para %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Falhou em ler a resposta do proxy: %s\n"
+
+# , c-format
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ERRO %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "A linha de status é inválida"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "O tunelamento pelo proxy falhou: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "O esquema de autenticação é desconhecido.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autenticação selecionada: %s\n"
+
+# , c-format
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Salvando em: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Ao baixar a assinatura:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Incapaz de ler o conteúdo da assinatura em arquivo temporário. Ignorando.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Não foi possível criar um arquivo temporário. Ignorando o download da "
+"assinatura.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valor PRI inválido. Assumindo %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Não foi possível encontrar resenha aceitável para recursos Metalink.\n"
+"Ignorando-os.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Desabilitando SSL devido aos erros encontrados.\n"
+
+# , c-format
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "A requisição %s foi enviada, aguardando resposta... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nenhum dado foi recebido.\n"
+
+# , c-format
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Erro de leitura (%s) nos cabeçalhos.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(sem descrição)"
+
+# , c-format
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Localização: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "não especificada"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [redirecionando]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Arquivo %s não foi modificado no servidor. Não será baixado.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Servidor ignorou o cabeçalho If-Modified-Since para o arquivo %s.\n"
+"Você talvez queira adicionar a opção --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" O arquivo já foi completamente obtido; não há nada a ser feito.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Tamanho: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorado"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Aviso: Não há suporte para caracteres coringa no HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "O modo aranha está habilitado. Verifique se o arquivo remoto existe.\n"
+
+# , c-format
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Não foi possível escrever em %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Ausência de atributo obrigatório no cabeçalho recebido.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autenticação de nome/senha falhou.\n"
+
+# , c-format
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Não foi possível escrever em arquivo WARC.\n"
+
+# , c-format
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Não foi possível escrever em arquivo WARC temporário.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Não foi possível estabelecer conexão segura (SSL).\n"
+
+# , c-format
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Não foi possível remover %s (%s).\n"
+
+# , c-format
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ERRO: Redirecionamento (%d) sem Location.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Não foi possível localizar os dados de Metalink na resposta HTTP. Baixando "
+"arquivo usando HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Cabeçalhos de Metalink encontrados. Alternando para modo Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "O arquivo remoto não existe -- link quebrado!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Está faltando o cabeçalho Last-modified -- horários desligados.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "O cabeçalho Last-modified é inválido -- horário ignorado.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo no servidor não é mais novo que o local %s -- ignorando.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Os tamanhos não coincidem (local %s) -- baixando.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "O arquivo remoto é mais novo, baixando.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo remoto existe e pode conter links para outras fontes -- baixando.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo remoto existe mas não contém link algum -- ignorando.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"O arquivo remoto existe e poderia conter mais links,\n"
+"mas a recursão está desabilitada -- ignorando.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"O arquivo remoto existe.\n"
+"\n"
+
+# , c-format
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+# , c-format
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - escrito para a saída padrão %s [%s/%s]\n"
+"\n"
+
+# , c-format
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvo [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Conexão fechada no byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Erro de leitura no byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Erro de leitura no byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Não há suporte para a qualidade de proteção \"%s\".\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Não há suporte para o algoritmo \"%s\".\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC aponta para %s, que não pôde ser acessado devido a erro: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Não foi possível ler %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Erro em %s na linha %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Erro de sintaxe em %s na linha %d.\n"
+
+# , c-format
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Comando desconhecido %s em %s na linha %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Falhou a análise do arquivo wgetrc do sistema (váriavel SYSTEM_WGETRC).\n"
+"Favor conferir \"%s\" ou\n"
+"especifique um arquivo diferente usando --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Falhou a análise do arquivo wgetrc do sistema. Favor\n"
+"conferir \"%s\" ou\n"
+"especifique um arquivo diferente usando --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Aviso: os arquivos wgetrc tanto do sistema como do usuário apontam para "
+"%s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: O comando --execute %s é inválido\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: o valor booleano %s é inválido; use \"on\" ou \"off\".\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: O valor %s é inválido; use \"on\", \"off\" ou \"quiet\".\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: O número %s é inválido.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s deve ser usado apenas uma vez\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: O valor de byte %s é inválido\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: O período de tempo %s é inválido\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Período de tempo negativo %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass exige um texto ou uma variável de ambiente, seja ou WGET_ASKPASS "
+"ou SSH_ASKPASS, estar configurada.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: O valor %s é inválido.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: O cabeçalho %s é inválido.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: O cabeçalho WARC de %s é inválido.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: O tipo de progresso %s é inválido.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: A restrição %s é inválida;\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "A codificação %s não é válida\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Não há suporte para a conversão de %s para %s\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Encontrou-se uma sequência multibyte inválida ou incompleta\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Erro não tratado: errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: localidade não definida\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode falhou (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Falhou em converter para minúsculas: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Redirecionando saída para %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; desabilitando registro.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uso: %s [OPÇÃO]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumentos obrigatórios para opções longas também o são para as opções "
+"curtas.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Inicialização:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version mostra a versão do Wget e sai\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help emite esta ajuda\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background vai para o plano de fundo depois de "
+"iniciar\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMANDO executa um comando no estilo \".wgetrc\"\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Arquivo de entrada e de registro:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=ARQUIVO envia as mensagens de log para ARQUIVO\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=ARQUIVO anexa mensagens ao ARQUIVO\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug emite muitas informações de depuração\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug emite a saída de depuração Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet silencioso (não emite nada)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose detalhista (isto é o padrão)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose desativa o detalhamento, sem ser "
+"silencioso\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIPO emite a largura de banda como TIPO. TIPO "
+"pode\n"
+" ser bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=ARQUIVO baixa os URLs encontrados no ARQUIVO "
+"local ou\n"
+" externo\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=ARQUIVO baixa os arquivos cobertos no ARQUIVO "
+"Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html trata o arquivo de entrada como HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL resolve os links do arquivo HTML de "
+"entrada\n"
+" (-i -F) relativos a URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=ARQUIVO Especifica o arquivo de configuração a "
+"usar\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config não lê nenhum arquivo de configuração\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=ARQUIVO anota as razões de rejeição de URL em "
+"ARQUIVO\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Download:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NÚMERO define o número de tentativas como "
+"NÚMERO\n"
+" (0 significa ilimitadas)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused tenta novamente mesmo se a conexão for\n"
+" recusada\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERROS lista separada por vírgula de erros "
+"HTTP para\n"
+" tentar de novo\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=ARQUIVO escreve os documentos no ARQUIVO\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber ignora os downloads que seriam baixados\n"
+" em arquivos existentes "
+"(sobrescrevendo)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc não tenta obter credenciais a partir de ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue retoma o download de um arquivo baixado\n"
+" parcialmente\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=DESLOCAMENTO baixa a partir da posição DESLOCAMENTO "
+"(começa do 0)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TIPO seleciona o tipo de indicador de "
+"progresso\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress mostra a barra de progresso\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping não tenta refazer o download de um "
+"arquivo,\n"
+" a menos que ele seja mais novo que o "
+"local\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since não usa a condição if-modified-since em\n"
+" requisições GET no modo --timestamp\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps não ajusta a data/hora do arquivo local "
+"pela\n"
+" do arquivo no servidor\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response exibe a resposta do servidor\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider não baixa nada\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEGUNDOS define todos os valores de tempo de "
+"espera\n"
+" como SEGUNDOS\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ENDEREÇOS lista dos servidores DNS para consulta\n"
+" (separados por vírgula)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ENDEREÇO associa o resolvedor DNS ao ENDEREÇO "
+"(nome\n"
+" de máquina ou número IP) na máquina "
+"local\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEGUNDOS define o tempo de espera de busca de DNS\n"
+" como SEGUNDOS\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEGS define o tempo de espera da conexão como "
+"SEGS\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEGUNDOS define o tempo de espera de leitura como\n"
+" SEGUNDOS\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEGUNDOS espera SEGUNDOS entre downloads\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEGUNDOS espera de 1 a SEGUNDOS entre as "
+"tentativas de\n"
+" baixar\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait espera de 0,5*ESPERA a 2*ESPERA segundos\n"
+" entre downloads\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy desativa explicitamente o proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=QUANTIDADE define a cota de download como "
+"QUANTIDADE\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ENDEREÇO associa à máquina local o ENDEREÇO (nome "
+"de\n"
+" máquina ou número IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=TAXA limita a taxa de download a TAXA\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache desabilita o cache da busca de DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=SO restringe os caracteres nos nomes de "
+"arquivos\n"
+" aos que o SO (sistema operacional) "
+"permite\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignora a maiusculização ao comparar "
+"arquivos/\n"
+" diretórios\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only conecta apenas a endereços IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only conecta apenas a endereços IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMÃLIA conecta primeiro a endereços da família\n"
+" especificada: IPv6, IPv4 ou \"none"
+"\" (nenhum)\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr " --user=USUÃRIO define o usuário para HTTP e FTP\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=SENHA define a senha a ser usada para HTTP e "
+"FTP\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password pergunta as senhas\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMANDO especifica manipulador de credenciais "
+"para\n"
+" requisição de nome de usuário e senha. "
+"Se\n"
+" COMANDO não for fornecido, usa-se a "
+"variável\n"
+" de ambiente WGET_ASKPASS ou "
+"SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri desativa o suporte para IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=COD usa COD como a codificação local para "
+"IRIs\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=COD usa COD como a codificação remota padrão\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink remove o arquivo antes de se "
+"sobrescrever\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash mantém arquivos com soma de verificação "
+"incorreta\n"
+" (anexa .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NÚMERO Usa o NÚMERO-ésimo metalink do tipo\n"
+" application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http usa metadados Metalink dos cabeçalhos de\n"
+" respostas HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location local preferido para recursos Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr ativa armazenamento de metadados em "
+"atributos de\n"
+" arquivo estendidos\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Diretórios:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories não cria diretórios\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories força a criação de diretórios\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories não cria diretórios do servidor\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories usa o nome do protocolo nos diretórios\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIXO salva os arquivos em PREFIXO/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=QTD ignora QTD componentes do diretório "
+"remoto\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opções HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=USUÃRIO define o usuário do HTTP\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=SENHA define a senha a usar para HTTP\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache desautoriza dados em cache do servidor\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NOME Altera o nome da página padrão "
+"(normalmente,\n"
+" ela é \"index.html\")\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension salva os documentos HTML/CSS com as "
+"extensões\n"
+" apropriadas\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignora o campo \"Content-Length\" do "
+"cabeçalho\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=TEXTO insere TEXTO em meio aos cabeçalhos\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TIPO escolhe compressão dentre auto, gzip e "
+"none(=nenhum) (padrão: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect quantidade máxima de redirecionamentos\n"
+" permitidos por página\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=USUÃRIO define o nome de usuário do proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=SENHA define a senha para o proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inclui o cabeçalho \"Referer: URL\" na "
+"requisi-\n"
+" ção HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers salva os cabeçalhos HTTP no arquivo\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENTE identifica-se como AGENTE em vez de Wget/"
+"VERSÃO\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive desabilita o \"HTTP keep-alive\" (para "
+"conexões\n"
+" persistentes)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies não usa cookies\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=ARQUIVO carrega os cookies do ARQUIVO antes da "
+"sessão\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=ARQUIVO salva os cookies no ARQUIVO depois da "
+"sessão\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies carrega e salva os cookies (não "
+"permanentes) da\n"
+" sessão\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=TEXTO usa o método POST; envia o TEXTO como "
+"dados\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=ARQUIVO usa o método POST; envia conteúdo de "
+"ARQUIVO\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod usa o método \"HTTPMethod\" na "
+"requisição\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=TEXTO envia TEXTO como dados. DEVE usar --"
+"method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=ARQUIVO envia o conteúdo de ARQUIVO. DEVE usar --"
+"method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition honra o cabeçalho Content-Disposition ao\n"
+" escolher os nomes do arquivo local\n"
+" (EXPERIMENTAL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error emite o conteúdo recebido em caso de "
+"erros no\n"
+" servidor\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge envia informações de autenticação HTTP "
+"básica\n"
+" sem antes aguardar pelo desafio do "
+"servidor\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opções HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR escolhe um protocolo de segurança entre: "
+"auto\n"
+" (automático), SSLv2, SSLv3, TLSv1, "
+"TLSv1_1,\n"
+" TLSv1_2 e PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only segue apenas links HTTPS seguros\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate não valida o certificado do servidor\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=ARQUIVO o arquivo de certificado do cliente\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIPO tipo de certificado do client: PEM ou "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=ARQUIVO arquivo de chave privada\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIPO tipo de chave privada: PEM ou DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=ARQUIVO arquivo com o conjunto de ACs\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR diretório onde está a lista de hash das "
+"ACs\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=ARQUIVO arquivo com o conjunto de CRLs\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=ARQ/HASHES Arquivo de Chave Pública(PEM/DER) ou "
+"qualquer\n"
+" quantidade de hashes SHA256 codificados "
+"na\n"
+" base64 precedidos por \"sha256//\" e "
+"separados\n"
+" por \";\" para conferir os pares\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=ARQUIVO arquivo com dados aleatórios para semear "
+"o\n"
+" GNPA do SSL\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=ARQUIVO arquivo nomeando o soquete EGD com dados\n"
+" aleatórios\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Define diretamente o texto de "
+"prioridade(GnuTLS) ou de lista de cifra(OpenSSL).\n"
+" Use com cuidado. Esta opção sobrescreve --"
+"secure-protocol.\n"
+" O formato e a sintaxe deste texto depende "
+"do motor específico de SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opções HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts desabilita HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file caminho da base de dados HSTS\n"
+" (sobrescreve a padrão)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opções FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf usa o formato Stream_LF com todos os "
+"arquivos\n"
+" binários do FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=USUÃRIO define o usuário de FTP\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=SENHA define a senha para FTP\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+" --no-remove-listing não exclui os arquivos \".listing\"\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob desativa a pesquisa aproximada de nomes "
+"de\n"
+" arquivo no FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp desabilita o modo de transferência "
+"\"passivo\"\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions preserva as permissões do arquivo remoto\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks em uma recursão, obtém arquivos apontados "
+"por\n"
+" ligação (não vale para diretórios)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opções FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit usa FTPS implícito (porta padrão: "
+"990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl retoma a sessão SSL/TLS iniciada na\n"
+" conexão de controle ao abrir a de "
+"dados\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection encripta apenas o canal de controle;\n"
+" todos os dados estarão em texto "
+"simples\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp recai para FTP se FTPS não é "
+"suportado no\n"
+" servidor alvo\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opções para WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=NOMEARQUIVO salva dados de requisição/resposta em "
+"arquivo\n"
+" .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=TEXTO insere TEXTO no registro warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NÚMERO define o tamanho máximo de arquivos WARC\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx escreve arquivos de índice CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=ARQUIVO não armazena registros listados neste "
+"arquivo CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression não comprime arquivos WARC files com "
+"GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests não calcula as resenhas SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log não armazena arquivo de log em registro "
+"WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRETÓRIO local para os arquivos temporários "
+"criados\n"
+" pelo gravador WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Download recursivo:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive especifica como download recursivo\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NÚMERO nível máximo da recursão; inf ou 0 = "
+"infinito\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after exclui os arquivos localmente após baixá-"
+"los\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links força os links no HTML ou CSS baixado\n"
+" apontarem para os arquivos locais\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only converte apenas a parte de arquivo dos "
+"URLs\n"
+" (normalmente conhecida como o nome-"
+"base)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N antes de converte arquivo X, gera cópia "
+"de\n"
+" segurança (até N cópias)\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted antes de converter o arquivo X, faz uma "
+"cópia\n"
+" de segurança como X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted antes de converter o arquivo X, faz uma "
+"cópia\n"
+" de segurança como X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror atalho para -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites obtém todas as imagens, etc. necessárias "
+"para\n"
+" exibir a página HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments ativa a manipulação (SGML) estrita dos "
+"comen-\n"
+" tários HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Aceitação/Recusa de recursão:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA lista separada por vírgulas das "
+"extensões\n"
+" aceitas\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA lista separada por vírgulas das "
+"extensões\n"
+" rejeitadas\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGEX expressão regular para URLs aceitáveis\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGEX expressão regular para URLs a rejeitar\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TIPO tipo de expressão regular (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TIPO tipo de expressão regular (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA lista separada por vírgulas dos domínios\n"
+" aceitos\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA lista separada por vírgulas dos domínios\n"
+" rejeitados\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp segue os links FTP dos documentos HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA lista separada por vírgulas das tags "
+"HTML\n"
+" permitidas\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA lista separada por vírgulas das tags "
+"HTML\n"
+" a ignorar\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts na recursão, vai para máquinas "
+"estrangeiras\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative segue apenas links relativos\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTA lista dos diretórios permitidos\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names usa o nome especificado pelo último\n"
+" componente do URL de redirecionamento\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTA lista dos diretórios excluídos\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent não subir ao diretório-pai\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Mande e-mail com questões, discussões e relatos de erros para <bug-wget@gnu."
+"org>\n"
+"e/ou abra chamados de incidentes em https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+"GNU Wget %s, um programa não interativo para baixar arquivos da rede.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Senha para o usuário %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Senha: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Não foi possível criar redirecionamento\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Erro ao inicializar ações de arquivo para posix_spawn para use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Erro ao configurar ações de arquivo para posix_spawn para use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Erro ao ler resposta ao comando \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Nome de usuário para \"%s%s\": "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Senha para \"%s%s@%s\": "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Localidade: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compilação: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Link: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s construído em %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (ambiente)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (usuário)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistema)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl."
+"html>\n"
+"Este é um software livre: você é livre para alterá-lo e redistribuí-lo.\n"
+"NÃO Hà QUALQUER GARANTIA, na máxima extensão permitida em lei.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Escrito originalmente por Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Por favor, envie relatos de problemas e sugestões para <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problema de alocação de memória\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Saindo devido a erro em %s\n"
+
+# , c-format
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Tente \"%s --help\" para mais opções.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: a opção é ilegal -- \"-n%c\"\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"O suporte a depuração não foi compilado. Ignorando sinalizador --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Tanto --no-clobber como --convert-links foram especificadas; somente --"
+"convert-links será usada.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Tanto --no-clobber como --convert-file-only foram especificadas; somente --"
+"convert-file-only será usada.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Não pode ser \"detalhista\" e \"silencioso\" ao mesmo tempo.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Não é possível usar as opções \"timestamp\" e \"no clobber\" ao mesmo "
+"tempo.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+"Não é possível especificar ao mesmo tempo --inet4-only e --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Não é possível especificar -k ou --convert-file-only e -O se são fornecidos\n"
+"múltiplos URLs, ou em combinação com -p ou -r. Veja o manual para mais "
+"detalhes.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVISO: combinar -O com -r ou -p significa que todo o conteúdo baixado será\n"
+"colocado em um único arquivo que você especificou.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVISO: a opção --timestamp não faz nada se combinada com -O. Veja o manual\n"
+"para detalhes.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"A saída WARC não funciona com --no-clobber; --no-clobber será desabilitada.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"A saída WARC não funciona com marcação de data/hora; a marcação será "
+"desabilitada.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "A saída WARC não funciona com --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"A saída WARC não funciona com --continue ou --start-pos; elas serão "
+"desabilitadas.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"As resenhas (digests) estão desabilitadas; não se encontrará registros "
+"duplicados para serem removidos.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Compressão não funciona com --continue ou --start-pos; elas serão "
+"desabilitadas.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+"Não é possível especificar ao mesmo tempo --ask-password e --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Não é recomendado especificar --start-pos e --continue ao mesmo tempo; --"
+"continue será desabilitado.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: falta o URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Não se pode especificar ao mesmo tempo --post-data e --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Você não pode usar --post-data ou --post-file juntamente com --method. --"
+"method espera dados através das opções --body-data e --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Você deve especificar um método através de --method=HTTPMethod para usar com "
+"--body-data ou --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Não se pode especificar ao mesmo tempo --body-data e --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Esta versão não oferece suporte para IRIs\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k ou -r pode ser usada juntamente com -O somente se a saída for um arquivo "
+"comum.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links ou --convert-file somente podem ser usadas juntas se a saída "
+"for um arquivo comum.\n"
+
+# , c-format
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Falhou em iniciar libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Falhou em iniciar o canal c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Falhou em interpretar o endereço IP \"%s\"\n"
+
+# , c-format
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Falhou em definir o(s) servidor(es) DNS \"%s\" (%d)\n"
+
+# , c-format
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nenhum URL foi encontrado em %s.\n"
+
+# , c-format
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Não foi possível interpretar o arquivo metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Não foi possível baixar todos os recursos de %s.\n"
+
+# , c-format
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FINALIZADO --%s--\n"
+"Tempo total decorrido: %s\n"
+"Baixados: %d arquivos, %s em %s (%s)\n"
+
+# , c-format
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "EXCEDIDA a cota de download de %s!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O não é suportada para baixar metalink. Ignorando.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+# , c-format
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Arquivo metalink planejado: %s.\n"
+
+# , c-format
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Arquivo metalink seguro: %s.\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Rejeitando arquivo metalink. Nome inseguro.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Processando metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Rejeitando arquivo de metaurl %s. Nome inseguro.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Falhou em baixar %s. Pulando metaurl.\n"
+
+# , c-format
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Não foi possível interpretar o arquivo de metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Processamento de metaurls resultou em erro.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tipo de recurso %s não é suportado; ignorando...\n"
+
+# , c-format
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Não foi possível abrir arquivo baixado.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Calculando tamanho de %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Tamanho de arquivo não declarado. Pulando verificação.\n"
+
+# , c-format
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Não foi possível obter tamanho do arquivo baixado.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Tamanho diverge para o arquivo %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Tamanho coincide.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Calculando soma de verificação para %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Soma de verificação coincide.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Soma de verificação diverge para o arquivo %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Não foi possível abrir o arquivo baixado para verificação de assinatura.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Validação de assinatura bem sucedida.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Assinatura inválida. Rejeitando recurso.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Os dados coincidem com a assinatura, mas ela não é confiável.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Nenhuma soma de verificação foi encontrada.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Falhou em baixar %s. Pulando recurso.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "O arquivo %s foi obtido, mas o tamanho não coincide.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "O arquivo %s foi obtido, mas a soma de verificação não coincide.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "O arquivo %s foi obtido, mas a assinatura não coincide.\n"
+
+# , c-format
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Renomeando %s para %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Continuando em plano de fundo.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Continuando em plano de fundo, pid %lu.\n"
+
+# , c-format
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "A saída será escrita em %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "falha em fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "falha em fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Não foi possível encontrar um driver de soquete usável.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"falha em ioctl(). O soquete não poderia estar configurado como bloqueante.\n"
+
+# , c-format
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: aviso: o termo %s aparece antes de qualquer nome de máquina\n"
+
+# , c-format
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: o termo \"%s\" é desconhecido\n"
+
+# , c-format
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uso: %s NETRC [NOME DA MÃQUINA]\n"
+
+# , c-format
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: não foi possível acessar %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVISO: usando uma semente fraca de aleatoriedade.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Não foi possível gerar semente para PRNG; considere o uso de --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Sua versão do OpenSSL é muito antiga para suportar TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Sua versão do OpenSSL é muito antiga para suportar TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Sua versão do OpenSSL é muito antiga para suportar TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"OpenSSL: não há implementação para o valor da opção \"secure-protocol\" %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Lista inválida de cifra: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Falhou em definir confiança para cadeia parcial\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Falha ao alocar parâmetro de verificação\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"AVISO: Não foi possível gerar semente para PRNG; considere o uso de --random-"
+"file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: não foi possível verificar o certificado de %s, emitido por %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Não foi possível verificar localmente a autoridade do emissor.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Foi encontrado um certificado auto-assinado.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Certificado emitido ainda não é válido.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Certificado emitido expirou.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: o nome alternativo do sujeito do certificado não coincide\n"
+"\tcom o nome de máquina solicitado %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: o nome comum no certificado %s não coincide com o nome de máquina "
+"solicitado %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: o nome comum no certificado é inválido (contém um caractere nulo).\n"
+" Isso pode ser um indício que a máquina não é quem afirma ser, isto é,\n"
+" que ela não é o verdadeiro %s.\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Para se conectar a %s de forma insegura, use \"--no-check-certificate\".\n"
+
+# , c-format
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ ignorando %sK ]"
+
+# , c-format
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+"Especificação inválida de estilo da ordem de grandeza (dot) %s;\n"
+" mantendo inalterado.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " TED %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " em "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Não foi possível obter a freqüência do relógio de TEMPO REAL: %s\n"
+
+# , c-format
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Removendo %s já que ele deveria ser rejeitado.\n"
+
+# , c-format
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Não é possível abrir %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Carregando robots.txt; por favor ignore qualquer erro.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Erro ao analisar URL do proxy %s: %s\n"
+
+# , c-format
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Erro no URL do proxy %s: Tem que ser HTTP.\n"
+
+# , c-format
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Excedeu os %d redirecionamentos.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Desistindo.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Tentando novamente.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Não encontrou links quebrados.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Encontrou %d link quebrado.\n"
+"\n"
+msgstr[1] ""
+"Encontrou %d links quebrados.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Nenhum erro"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Não há suporte para o esquema %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "O esquema está faltando"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "O nome de máquina é inválido"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "O número de porta é inválido"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "O nome de usuário é inválido"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "O endereço IPv6 está incompleto"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Não há suporte para endereços IPv6"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "O endereço IPv6 é inválido"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Compilado sem suporte a HTTPS"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Encontrou-se uma sequência multibyte que não dá para converter\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Falhou em alocar memória suficiente; memória esgotada.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Falhou em alocar %ld bytes; memória esgotada.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: a memória para texto é muito grande (%d bytes); abortando.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Continuando em plano de fundo, pid %d.\n"
+
+# , c-format
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Falhou em remover ligação simbólica %s: %s\n"
+
+# , c-format
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Falhou no Fopen do arquivo %s\n"
+
+# , c-format
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Falhou em obter FD para arquivo %s\n"
+
+# , c-format
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Falhou no stat de arquivo %s, (verifique permissões)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"O arquivo %s mudou desde a última verificação. Verificação de segurança "
+"falhou.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Falhou em abrir arquivo %s, motivo: %s\n"
+
+# , c-format
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Falhou no stat de arquivo %s, erro: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Tentando abrir arquivo %s, mas ele mudou desde a última verificação. "
+"Verificação de segurança falhou.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expressão regular inválida %s, erro PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expressão regular inválida %s, %s\n"
+
+# , c-format
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Erro ao comparar %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Ignorando chave com tamanho errado (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Erro ao definir posição no arquivo WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Erro ao descarregar o arquivo WARC para o disco.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Erro ao abrir o descritor de arquivo WARC duplicado.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Erro ao abrir fluxo GZIP para arquivo WARC.\n"
+
+# , c-format
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Erro ao escrever registro warcinfo em arquivo WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Abrindo arquivo WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Erro ao abrir o arquivo WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Arquivo CDX não lista os URLs originais (falta a coluna \"a\").\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+"Arquivo CDX não lista as somas de verificação (falta a coluna \"k\").\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"Arquivo CDX não lista os identificadores de registro (falta a coluna \"u"
+"\").\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"%d registro carregado de CDX.\n"
+"\n"
+msgstr[1] ""
+"%d registros carregados de CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Não foi possível ler o arquivo CDX %s para remover duplicatas.\n"
+
+# , c-format
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Não foi possível abrir arquivo de manifesto WARC.\n"
+
+# , c-format
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Não foi possível abrir arquivo de registro WARC temporário.\n"
+
+# , c-format
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Não foi possível abrir arquivo WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Não foi possível abrir o arquivo CDX para saída.\n"
+
+# , c-format
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Não foi possível abrir arquivo WARC temporário.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Encontrou entrada exata no arquivo CDX. Salvando registro revisitado em "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Erro desconhecido de sistema"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Não há suporte para família de endereços para nome de máquina"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Valor inválido para ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Falha irrecuperável na resolução de nome"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "Não há suporte a ai_family"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Falha na alocação de memória"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Nenhum endereço associado ao nome de máquina"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nome ou serviço desconhecido"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Sem suporte ao nome de serviço pelo ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "Não há suporte a ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "Erro de sistema"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Buffer de argumentos é pequeno demais"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Processamento de requisição em andamento"
+
+#~ msgid "Request canceled"
+#~ msgstr "Requisição cancelada"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Requisição não cancelada"
+
+#~ msgid "All requests done"
+#~ msgstr "Todas as requisições foram atendidas"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Interrompido por um sinal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Texto do parâmetro codificado incorretamente"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: a opção \"%s%s\" é ambígua\n"
+
+# , c-format
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: a opção \"%s%s\" é ambígua; possibilidades:"
+
+# , c-format
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: opção desconhecida \"%s%s\"\n"
+
+# , c-format
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"%s%s\" não permite um argumento\n"
+
+# , c-format
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: a opção \"%s%s\" exige um argumento\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opção invaÌlida -- \"%c\"\n"
+
+# , c-format
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: a opção exige um argumento -- \"%c\"\n"
+
+#~ msgid "`"
+#~ msgstr "“"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "Sucesso"
+
+#~ msgid "No match"
+#~ msgstr "Nenhuma ocorrência do padrão"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expressão regular inválida"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Caractere de combinação inválido"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nome inválido de categoria de caracteres"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Barra invertida no final"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Retrorreferência inválida"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [. ou [= sem correspondente"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( ou \\( sem correspondente"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ sem correspondente"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Conteúdo inválido de \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Fim de intervalo inválido"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memória esgotada"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "A expressão regular precedente é inválida"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Fim prematuro da expressão regular"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expressão regular grande demais"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") ou \\) sem correspondente"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Nenhuma expressão regular anterior"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "não foi possível criar redirecionamento"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "subprocesso %s falhou"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle falhou"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "não foi possível restaurar descritor de arquivo %d: dup2 falhou"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "subprocesso %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "o subprocesso %s recebeu sinal fatal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "memória esgotada"
+
+# , c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"--%s\" não permite um argumento\n"
+
+# , c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: opção desconhecida \"--%s\"\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: a opção \"-W %s\" eÌ ambiÌgua\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" não permite um argumento\n"
+
+# , c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: a opção \"-W %s\" exige um argumento\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr "Envie relatos de problemas e sugestões para <bug-wget@gnu.org>\n"
+
+# , c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "O arquivo \"%s\" já existe, não será baixado.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "A sequência UTF-8 é inválida: %s.\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode falhou (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s recebido.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "A autorização falhou.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries especifica a quantidade de tentativas "
+#~ "para\n"
+#~ " um arquivo.\n"
+#~ " (precisa ser usado com --metalink-"
+#~ "file)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --jobs especifica quantas threads usar.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "As informações de nome de usuário e senha não precisam ser especificados "
+#~ "ao baixar de um metalink.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s não pode ser usado com --metalink.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "AVISO: Não reabra a saída padrão em modo binário;\n"
+#~ " o arquivo baixado pode conter fins-de-linha inapropriados.\n"
+
+# , c-format
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: a opção é ilegal -- %c\n"
+
+#~ msgid ""
+#~ "GNU Wget %s built on VMS %s %s.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "GNU Wget %s construído em VMS %s %s.\n"
+#~ "\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Atualmente mantido por Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL prefixa com URL os links relativos no "
+#~ "arquivo\n"
+#~ " quando usadas as opções -F -i.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Formatação de saída:\n"
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644
index 0000000..0122c46
--- /dev/null
+++ b/po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1â€/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“â€/""/g
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
new file mode 100644
index 0000000..2436c49
--- /dev/null
+++ b/po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/ro.gmo b/po/ro.gmo
new file mode 100644
index 0000000..3315a1f
--- /dev/null
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
new file mode 100644
index 0000000..3b41f7d
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,4098 @@
+# Mesajele în limba română pentru pachetul wget.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Eugen Hoanca <eugenh@urban-grafx.ro>, 2003.
+# Florentina Mușat <florentina.musat.28@gmail.com>, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.20\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-06-23 15:24+0300\n"
+"Last-Translator: Florentina Mușat <florentina.musat.28@gmail.com>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n==0 || (n!=1 && n%100>=1 && n"
+"%100<=19) ? 1 : 2);\n"
+"X-Generator: Poedit 2.3.1\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: nu se poate rezolva adresa de legătură %s; se dezactivează legătura.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Se conectează la %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Se conectează la %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Se conectează la [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF a eșuat: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "conectat.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "eÅŸuare: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: nu se poate rezolva adresa de gazdă %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR a eșuat: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Prea multe fds-uri deschise. Nu se poate utiliza selectarea pe un fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Legăturile convertite în fișiere %d în %s secunde.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Se convertesc legăturile în %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "nimic de făcut.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nu pot converti linkurile în %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Nu se poate șterge %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Nu pot face backup la %s ca %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nu se poate obține cookie-ul pentru %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Eroare de sintaxă în Set-Cookie: %s la poziţia %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie venind de la %s a încercat să stabilească domeniul la "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nu se poate deschide fișierul de cookie-uri %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Eroare la scrierea la %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Eroare la închiderea a %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Tip de listare nesuportat, se încearcă trecere la listare Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Index al /%s pe %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "durată necunoscută "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "FiÅŸier "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Director "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Link "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Nesigur "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s octeţi)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Dimensiune: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) rămas"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s rămas"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (neobligatoriu)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Nu s-a putut inițializa SSL. Va fi dezactivat."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Login ca %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Eroare în răspunsul serverului, închid conexiunea.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Eroare în salutul serverului.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Scriere eşuată, închid conexiunea.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Serverul refuză loginul.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Login incorect.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Admis!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Serverul nu a acceptat comanda „PBSZ 0â€.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Serverul nu a acceptat comanda „PROT %câ€.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Eroare server, nu se poate determina tipul sistemului.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "terminat. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "terminat.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tip `%c' necunoscut, conexiune închisă.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "terminat. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nenecesar.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "A fost ajunsă o secțiune imposibilă logic în getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Nu există directorul %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nu este necesar.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Fișierul a fost recuperat deja.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nu s-a putut iniţia transferul PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Nu s-a putut analiza răspunsul PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nu s-a putut conecta la %s portul %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Eroare de legătură(bind) (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT invalid.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST eşuat, start de la început.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Fișierul %s există.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Nu există fișierul %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Nu există fișierul %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Nu există fișierul sau directorul %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s a apărut în existență.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, închid controlul conexiunii.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Conexiune de date: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Controlul conexiunii închis.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Transfer de date întrerupt.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Fișierul %s există deja; nu se recuperează.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(încercare:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scris la stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvat [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Åžterg %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Se utilizează %s ca un fișier de listare tmp.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "S-a eliminat %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Adăncimea de recurenţă %d a depaşit max. de adăncime %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Fișierul de la distanță nu este mai nou decât fișierul local %s -- nu se "
+"recuperează.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul de la distanță este mai nou decât fișierul local %s -- se "
+"recuperează.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Dimensiunile nu se potrivesc (local %s) -- se recuperează.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Nume symlink invalid, se omite.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Deja există symlinkul corect %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Creare symlink %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Legăturile simbolice nu sunt suportate, se omite legătura simbolică %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Se omite directorul %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: tip fiÅŸier necunoscut/nesuportat.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Nu s-au putut stabili permisiunile pentru %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: identificator-timp(time-stamp) corupt.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Nu vor fi aduse directoare pentru adăncime setată la %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Nu se coboară la %s pentru că este exclus/nu este inclus.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Se refuză %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Se refuză %s (Intrare nevalidă).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s este exclus/nu este inclus prin expresia regulară.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Eroare la potrivirea %s împotriva %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Nu sunt potriviri pe modelul %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "S-a scris indexul HTML-izat la %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "S-a scris indexul HTML-izat la %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "EROARE: Nu se poate deschide directorul %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "EROARE: Nu s-a putut deschide certificatul %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "S-a încărcat certificatul CA „%sâ€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "EROARE: Nu s-a putut încărca fiÈ™ierul CRL „%sâ€: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "S-a încărcat fiÈ™ierul CRL „%sâ€\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "EROARE: GnuTLS necesită cheia și certificatul să fie de același tip.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Versiunea GnuTLS este prea veche pentru a suporta TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: valoare de opțiune „secure-protocol†neimplementată %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Raportați această problemă la bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: valoare de opțiune „secure-protocol†neimplementată %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Nu se poate stabili șirul de prioritate direct. Se revine la "
+"prioritatea implicită.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "EROARE"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "AVERTISMENT"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Nu există niciun certificat prezentat de %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Certificatul lui %s nu este de încredere.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certificatul lui %s nu are un emitent cunoscut.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+"%s: Certificatul lui %s a fost revocat.\n"
+"\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Semnatarul certificatului lui %s nu a fost un CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Certificatul lui %s a fost semnat utilizând un algoritm nesigur.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certificatul lui %s nu este încă activat.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certificatul lui %s a expirat.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Eroare la inițializarea certificatului X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Nu s-a găsit niciun certificat\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Eroare la parsarea certificatului: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certificatul nu a fost încă activat\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certificatul a expirat\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Deținătorul certificatului nu se potrivește cu numele de gazdă %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Cheia publică nu se potrivește cu cheia publică fixată!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certificatul trebuie să fie X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Eroare la gestionarea listei de adrese.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Gazdă necunoscută"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Eșec temporar în rezolvarea numelui"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Eroare necunoscută"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Rezolvare %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "a eșuat: Nu există adrese IPv4/IPv6 pentru gazdă.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "eşuare: .expirat(ă)\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Nu s-a rezolvat linkul incomplet %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL nevalid %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Scriere cerere HTTP eşuată: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Nu există antete, se presupune HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul %s este deja acolo; nu se recuperează.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime a eșuat. Acesta este probabil o defecțiune.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Nu se poate converti datarea în format http. Se revine la timpul 0 ca timpul "
+"ultimei modificări.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Fișierul de date CORP %s lipsește: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Se reutilizează conexiunea existentă la [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Se reutilizează conexiunea existentă la %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Nu s-a putut citi răspunsul proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "EROARE %s %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Linie de stare malformată"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunelarea proxy-ului a eșuat: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Schemă autentificare necunoscută.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Autentificare selectată: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Se salvează la: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Când se descarcă semnătura:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Nu se poate citi conținutul semnăturii de la fișierul temporar. Se omite.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Nu s-a putut crea fișierul temporar. Se omite descărcarea semnăturii.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Valoare privată nevalidă. Se presupune %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Nu s-a putut găsi digestul acceptabil pentru resursele Metalink.\n"
+"Acestea se ignoră.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Se dezactivează SSL din cauza unor erori întâlnite.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Cerere %s trimisă, se aşteaptă răspuns... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Nu s-au primit date.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Eroare de citire (%s) în headere.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(fără descriere)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Locaţie: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nespecificat(ă)"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [urmează]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Fișierul %s nu a fost modificat pe server. Se omite descărcarea.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Serverul a ignorat antetul If-Modified-Since pentru fișierul %s.\n"
+"Poate doriți să adăugați opțiunea --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Fişierul este deja complet; nu mai e nimic de făcut.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Dimensiune: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorat"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Avertisment: selecţiile globale(wildcards) nu sunt permise în HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"Modul păianjen activat. Verifică dacă fișierul de la distanță există.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nu se poate scrie la %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Atributul necesar care lipsește de la Antet a fost primit.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Autentificarea nume de utilizator/parolă a eșuat.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Nu se poate scrie la fișierul WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Nu se poate scrie la fișierul temporar WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nu s-a putut stabili o conexiune SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Nu se poate dezlega %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "EROARE: Redirectare (%d) fără locaţie.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Nu s-au putut găsi datele Metalink în răspunsul HTTP. Se descarcă fișierul "
+"utilizând HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Antetele Metalink au fost găsite. Se comută la modul Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Fișierul de la distanță nu există -- legătură deteriorată!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Lipseşte headerul Last-modified -- identificatori de timp opriţi.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Headerul Last-modified invalid -- identificator de timp ignorat.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul server nu este mai nou decât fișierul local %s -- nu se "
+"recuperează.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Dimensiunile nu se potrivesc (local %s) -- se recuperează.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "FiÅŸierul remote este mai nou, se aduce.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul de la distanță există și poate să conțină legături către alte "
+"resurse -- se recuperează.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul de la distanță există dar nu conține nicio legătură -- nu se "
+"recuperează.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fișierul de la distanță există și ar putea conține și mai multe legături,\n"
+"dar recursivitatea este dezactivată -- nu se obține.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Fișierul de la distanță există.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - scris la stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s salvat [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Conexiune închisă la octetul %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Eroare de citire la octetul %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Eroare de citire la octetul %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Calitate nesuportată a protecÈ›iei „%sâ€.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritm nesuportat „%sâ€.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC arată către %s, care nu a putut fi accesat din cauza erorii: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Nu s-a putut citi %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Eroare în %s la linia %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Eroare de sintaxă în %s la linia %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Comandă necunoscută %s în %s la linia %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Parsarea fișierului de sistem wgetrc (env SYSTEM_WGETRC) a eșuat. "
+"Verificați\n"
+"„%sâ€,\n"
+"sau specificați un fișier diferit utilizând --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Parsarea fișierului de sistem wgetrc a eșuat. Verificați\n"
+"„%sâ€,\n"
+"sau specificați un fișier diferit utilizând --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Avertisment: Amândouă wgetrc-urile de sistem și de utilizator arată "
+"către %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Comandă --execute nevalidă %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Logic nevalid %s; utilizaÈ›i „on†sau „offâ€.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: %s nevalid; utilizaÈ›i „onâ€, „off†sau „quietâ€.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Număr nevalid %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s trebuie să fie utilizat doar o dată\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Valoare de octet nevalidă %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Perioadă de timp nevalidă %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Perioadă de timp nevalidă %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass necesită un șir sau fie variabila de mediu WGET_ASKPASS fie "
+"SSH_ASKPASS să fie stabilite.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Valoare nevalidă %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Antet nevalid %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Antet WARC nevalid %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Tip de progres nevalid %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Restricție nevalidă %s,\n"
+" utilizați [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Codarea %s nu este validă\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Conversia de la %s la %s nu este suportată\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Secvență de multiocteți nevalidă sau incompletă întâlnită\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Errno %d nemanipulabilă\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: localizarea nu este stabilită\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode a eșuat (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Nu s-a putut converti la minuscule: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Se redirecționează ieșirea la %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; logging dezactivat.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Folosire: %s [OPÅ¢IUNE]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Argumentele obligatorii la opțiunile lungi sunt obligatorii și pentru "
+"opțiunile scurte.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "La pornire:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version afișează versiunea lui Wget și ieși\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help tipărește acest ajutor\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background mergi la fundal după pornire\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMANDÄ‚ execută o comandă în stil „.wgetrcâ€\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Fișier de jurnalizare și de intrare:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=FIȘIER înregistrează mesajele la FIȘIER\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FIȘIER adaugă mesajele la FIȘIER\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug tipărește multe informații de depanare\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug tipărește ieșirea de depanare Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet silențios (fără ieșire)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose fii detaliat (aceasta este implicit)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose oprește afișarea detaliată, fără să fie "
+"silențioasă\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TIP produce lungimea de bandă ca TIP. TIP "
+"poate fi biți\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FIȘIER descarcă URL-urile găsite în FIȘIERUL "
+"local sau extern\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FIȘIER descarcă fișierele acoperite în "
+"FIȘIERUL Metalink local\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html tratează fișierul de intrare ca HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL rezolvă legăturile de fișier de intrare "
+"HTML (-i -F)\n"
+" relativ la URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FIȘIER specifică fișierul de configurare de "
+"utilizat\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config nu citi niciun fișier de configurare\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FIȘIER înregistrează motivele pentru "
+"respingerea URL-ului la FIȘIER\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Descarcă:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=NUMĂR stabilește numărul de încercări la NUMĂR "
+"(0 nelimitat)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused încearcă din nou chiar dacă conexiunea "
+"este refuzată\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERORI listă separată prin virgule a erorilor "
+"HTTP de încercat din nou\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FIȘIER scrie documente la FIȘIER\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber omite descărcări care s-ar descărca la\n"
+" fișiere existente (suprascriindu-le)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc nu încerca să obții certificări de la ."
+"netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue revino la obținerea unui fișier descărcat "
+"parțial\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=DECALAJ începe descărcarea de la DECALAJUL "
+"poziției bazată pe zero\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=TIP selectați tipul gabaritului de progress\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress afișează bara de progres în orice mod de "
+"verbozitate\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nu recupera fișierele decât dacă sunt mai "
+"noi decât\n"
+" cele locale\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since nu utiliza cererile de obținere "
+"condiționale if-modified-since\n"
+" în modul de datare\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps nu stabili datarea fișierului local după\n"
+" cel de pe server\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response tipărește răspunsul serverului\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider nu descărca nimic\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SECUNDE stabilește toate valorile limitei de timp "
+"la SECUNDE\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESE listă de servere DNS de interogat (separate "
+"prin virgule)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESĂ leagă rezolvatorul DNS la ADRESĂ (nume de "
+"gazdă sau IP) pe gazda locală\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SECUNDE stabilește limita de timp a căutării "
+"DNS la SECUNDE\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECUNDE stabilește limita de timp a conexiunii "
+"la SECUNDE\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECUNDE stabilește limita de timp de citire la "
+"SECUNDE\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SECUNDE așteaptă SECUNDE între recuperări\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECUNDE așteaptă 1..SECUNDE între încercările "
+"unei recuperări\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait așteaptă de la "
+"0.5*AȘTEAPTĂ...1.5*AȘTEAPTĂ secunde între recuperări\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy dezactivează proxy-ul explicit\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=NUMĂR stabilește cota de recuperare la NUMĂR\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESĂ leagă la ADRESĂ (nume de gazdă sau IP) pe "
+"gazda locală\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RATĂ limitează rata de descărcare la RATĂ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache dezactivează caching-ul căutărilor DNS\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS restricționează caracterele în numele de "
+"fișiere la cele permise de OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignoră majusculele când se potrivesc "
+"fișierele/directoarele\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only conectează doar la adrese IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only conectează doar la adrese IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILIE conectează prima dată la adresele "
+"familiei specificate,\n"
+" una din IPv6, IPv4, sau nimic\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UTILIZATOR stabilește amândoi utilizatorii ftp "
+"și http la UTILIZATOR\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PAROLĂ stabilește amândouă parolele ftp și "
+"http la PAROLÄ‚\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password solicită pentru parole\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMANDĂ specifică operatorul certificărilor "
+"pentru cererea de \n"
+" nume de utilizator și parolă. Dacă "
+"nicio COMANDÄ‚ nu este \n"
+" specificată, variabilele de mediu "
+"WGET_ASKPASS \n"
+" sau SSH_ASKPASS sunt utilizate..\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri oprește suportul IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC utilizează ENC ca și codarea locală "
+"pentru IRI-uri\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC utilizează ENC ca și codarea de la "
+"distanță implicită\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --unlink elimină fișierul înainte de a bloca\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash păstrează fișierele cu nepotrivirea de "
+"sumă de control (adaugă .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMĂR Aplicație Metalink/metalink4+xml metaurl "
+"NUMÄ‚R ordinal\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http utilizează datele meta Metalink de la "
+"antetele de răspuns HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location locație preferată pentru resursele "
+"Metalink\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr oprește stocarea de date meta în atribute "
+"de fișier extinse\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Directoare:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories nu crea directoare\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories forțează crearea de directoare\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories nu crea directoare de gazdă\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories utilizează numele de protocol în "
+"directoare\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX salvează fișierele la PREFIX/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=NUMĂR ignoră NUMĂR de componente de director de "
+"la distanță\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Opțiuni HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=UTILIZATOR stabilește utilizatorul http la "
+"UTILIZATOR\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=PAROLĂ stabilește parola http la PAROLĂ\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache nu permite datele din serverul cache\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NUME modifică numele de pagină implicit "
+"(normal\n"
+" acesta este „index.htmlâ€.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension salvează documente HTML/CSS cu extensiile "
+"potrivite\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignoră câmpul de antet „Lungime-"
+"ConÈ›inutâ€\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=ȘIR inserează ȘIR printre antete\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TIP alege comprimarea, una dintre automată, "
+"gzip, sau nimic. (implicit: nimic)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect numărul maxim de redirecționări permise "
+"pe o pagină\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UTILIZATOR stabilește UTILIZATOR ca nume de "
+"utilizator proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PAROLĂ stabilește PAROLĂ ca parola proxy-ului\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL include antetul „Menționat de: URL†la "
+"cererea HTTP\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers salvează antetele HTTP la fișier\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifică ca AGENT în loc de Wget/"
+"VERSIUNE\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive dezactivează păstrează-viu HTTP "
+"(conexiuni persistente)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies nu utiliza cookie-uri\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FIȘIER încarcă cookie-urile de la FIȘIER "
+"înainte de sesiune\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FIȘIER salvează cookie-urile la FIȘIER după "
+"sesiune\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies încarcă și salvează cookie-urile sesiunii "
+"(nepermanente)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ȘIR utilizează metoda POST; stabilește ȘIR ca "
+"date\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FIȘIER utilizează metoda POST; trimite "
+"conținutul FIȘIERULUI\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod utilizează metoda „HTTPMethod†în cerere\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ȘIR trimite ȘIRUL ca date. --method TREBUIE să "
+"fie stabilit\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FIȘIER trimite conținutul FIȘIERULUI. --method "
+"TREBUIE să fie stabilit\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition onorează antetul de Dispoziție a "
+"Conținutului când\n"
+" se aleg nume de fișiere locale "
+"(EXPERIMENTAL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error produce conținutul primit pe erorile de "
+"server\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge trimite informații de autentificare HTTP "
+"de bază\n"
+" fără a aștepta mai întâi pentru "
+"provocarea\n"
+" serverului\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Opțiuni HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR alege un protocol sigur, unul dintre "
+"auto, SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 și PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only urmărește doar legături HTTPS sigure\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate nu valida certificatul serverului\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=FIȘIER fișierul de certificat al clientului\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TIP tipul certificatului clientului, PEM sau "
+"DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FIȘIER fișier de cheie privată\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TIP tip de cheie privată, PEM sau DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FIȘIER fișier cu pachetul de CA-uri\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR directorul în care lista de valoare de "
+"dispersie a CA-urilor este stocată\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FIȘIER fișier cu pachet de CRL-uri\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FIȘIER/VALORI DE DISPERSIE Fișier de cheie "
+"publică(PEM/DER), sau orice număr\n"
+" de base64 codat în valori de dispersie "
+"sha256 precedat de\n"
+" „sha256/â€' È™i separat de „;â€, pentru a "
+"verifica\n"
+" împotriva partenerului\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FIȘIER fișier cu date aleatorii pentru "
+"contribuirea la SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FIȘIER denumirea fișierului cu soclul EGD cu "
+"date aleatorii\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=ȘIR Stabilește șirul de prioritate (GnuTLS) sau "
+"șirul de listă de cifru (OpenSSL) direct.\n"
+" Utilizați cu grijă. Această opțiune "
+"suprascrie --secure-protocol.\n"
+" Formatul și sintaxa acestui șir depind de "
+"motorul specific SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Opțiuni HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts dezactivează HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file calea bazei de date HSTS (va suprascrie "
+"implicitul)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Opțiuni FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf utilizează formatul Stream_LF pentru "
+"toate fișierele FTP binare\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=UTILIZATOR stabilește utilizatorul ftp la "
+"UTILIZATOR\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=PAROLĂ stabilește parola ftp la PAROLĂ\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing nu elimina fiÈ™ierele „.listingâ€\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob oprește expandarea numelui de fișier FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp dezactivează modul de transfer „pasivâ€\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions păstrează permisiunile de fișier de la "
+"distanță\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks când se face recursivitate, obține "
+"fișierele care sunt legate (nu dir)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Opțiuni FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit utilizează FTPS implicit (portul "
+"implicit este 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl reia sesiunea SSL/TLS începută în "
+"conexiunea de control la\n"
+" deschiderea unei conexiuni de date\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection cifrează doar canalul de control; "
+"toate datele vor fi în text simplu\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp revino la FTP dacă FTPS nu este "
+"suportat în serverul țintă\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Opțiuni WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=NUME DE FIȘIER salvează datele de cerere/răspuns "
+"la un fișier .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=ȘIR inserează ȘIRUL într-o înregistrare "
+"warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=NUMĂR stabilește dimensiunea maximă a fișierelor "
+"WARC la NUMÄ‚R\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx scrie fișierele index CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=NUME DE FIȘIER nu stoca înregistrările listate în "
+"acest fișier CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression nu comprima fișierele WARC cu GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests nu calcula digest-urile SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log nu stoca fișierul de jurnalizare într-o "
+"înregistrare WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DIRECTOR locația pentru fișierele temporare create "
+"de\n"
+" scriitorul WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Descărcare recursivă:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive specifică descărcarea recursivă\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=NUMĂR adâncime de recursivitate maximă (inf sau "
+"0 pentru infinit)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after șterge fișierele local după descărcarea "
+"acestora\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links face ca legăturile din HTML sau CSS "
+"descărcate să arate către\n"
+" fișiere locale\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only convertește doar partea de fișier din URL-"
+"uri (de obicei cunoscut ca numele de bază)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N înaintea scrierii fișierului X, rotește "
+"până la N fișiere de copie de rezervă\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted înaintea convertirii fișierulu X, faceți "
+"o copie de rezervă ca X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted înaintea convertirii fișierului X, faceți "
+"o copie de rezervă ca X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror scurtătură pentru -N -r -l inf --no-"
+"remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites obține toate imaginile, etc. necesare "
+"pentru a afișa pagina HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments pornește manipularea strictă (SGML) a "
+"comentariilor HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Acceptare/Respingere recursivă:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTĂ listă separată prin virgule de extensii "
+"acceptate\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTĂ listă separată prin virgule de extensii "
+"respinse\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=EXPRESIE REGULARĂ expresie regulară care se "
+"potrivește cu URL-urile acceptate\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=EXPRESIE REGULARĂ expresie regulară care se "
+"potrivește cu URL-urile respinse\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TIP tip de expresie regulară (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TIP tip de expresie regulară (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTĂ listă separată prin virgule de domenii "
+"acceptate\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTĂ listă separată prin virgule de domenii "
+"respinse\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp urmărește legăturile FTP de la documente "
+"HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTĂ listă separată prin virgule de etichete "
+"HTML urmărite\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTĂ listă separată prin virgule de etichete "
+"HTML ignorate\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts mergi la gazde străine când se află în "
+"recursivitate\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative urmărește doar legăturile relative\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LISTĂ listează toate directoarele permise\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names utilizează numele specificat de ultima "
+"componentă\n"
+" a URL-ului de redirecționare\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LISTĂ listează toate directoarele excluse\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent nu urca la directorul părinte\n"
+
+#: src/main.c:1031
+#, fuzzy
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"probleme deschise și/sau la https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, un manager de descărcare non-interactiv.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Parola pentru utilizatorul %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Parola: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nu se poate crea conexiunea\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Eroare la inițializarea acțiunilor de fișier de creare pentru use-askpass: "
+"%d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Eroare la stabilirea acțiunilor de fișier de creare pentru use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Eroare la citirea răspunsului de la comanda „%s %sâ€: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Numele de utilizator pentru „%s %sâ€: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Parola pentru „%s%s@%sâ€: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Localizare: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compilează: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Legătură: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s generat pe %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (mediu)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (utilizator)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistem)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Drepturi de autor (C) %s Fundația de Software Liber, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licența GPLv3+: GNU GPL versiunea 3 sau mai mare\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Acesta este software liber: sunteți liber să îl modificați și să îl "
+"redistribuiți.\n"
+"NU există NICIO GARANȚIE, în măsura permisă de lege.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Original scris de Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Trimiteți rapoartele de defecțiuni și întrebările la <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problemă de alocare a memoriei\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Se iese din cauza erorii din %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Încercaţi `%s --help' pentru mai multe opţiuni.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: opţiune ilegală -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Suportul de depanare nu este compilat. Se ignoră fanionul --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Amândouă --no-clobber și --convert-links au fost specificate, doar --convert-"
+"links va fi utilizată.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Amândouă --no-clobber și --convert-file-only au fost specificate, doar --"
+"convert-file-only va fi utilizată.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Nu pot fi şi detaliat şi silenţios în acelaşi timp.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Nu pot şi identifica pentru timp (timestamp) şi lăsa fişierele nesecţionate "
+"în acelaşi timp.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Nu se pot specifica amândouă --inet4-only și --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Nu se pot specifica amândouă -k sau --convert-file-only și -O dacă sunt date "
+"URL-uri multiple, sau în combinație\n"
+"cu -p or -r. Consultați manualul pentru detalii.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"AVERTISMENT: combinarea -O cu -r sau -p va însemna că tot conținutul "
+"descărcat\n"
+"va fi plasat în fișierul solo pe care l-ați specificat.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"AVERTISMENT: datarea nu face nimic în combinație cu -O. Consultați manualul\n"
+"pentru detalii.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Ieșirea WARC nu funcționează cu --no-clobber, --no-clobber va fi "
+"dezactivat.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "Ieșirea WARC nu funcționează cu datare, datarea va fi dezactivată.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Ieșirea WARC nu funcționează cu --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Ieșirea WARC nu funcționează cu --continue sau --start-pos, acestea vor fi "
+"dezactivate.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Digest-urile sunt dezactivate; deduplicarea WARC nu va găsi înregistrări "
+"duplicate.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Comprimarea nu funcționează cu --continue sau --start-pos, acestea vor fi "
+"dezactivate.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Nu se pot specifica ambele --ask-password și --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Specificarea a amândouă --start-pos și --continue nu este recomandată; --"
+"continue va fi dezactivată.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL lipsă\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Nu puteți specifica ambele --post-data și --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Nu puteți utiliza --post-data sau --post-file pe lângă --method. --method "
+"așteaptă date prin opțiunile --body-data și --body-file.\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Trebuie să specificați o metodă prin --method=HTTPMethod pentru a utiliza cu "
+"--body-data sau --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Nu puteți specifica amândouă --body-date și --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Această versiune nu are suport pentru IRI-uri\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k sau -r pot fi utilizate împreună cu -O doar dacă se iese la un fișier "
+"obișnuit.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links sau --convert-file-only pot fi utilizate împreună doar dacă "
+"se iese la un fișier obișnuit.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Nu s-a putut inițializa libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Nu s-a putut inițializa canalul c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Nu s-a putut parsa adresa IP „%sâ€\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Nu s-a(u) putut stabili server(ele) DNS „%s†(%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Nici un URL găsit în %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Nu se poate parsa fișierul metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Nu s-au putut descărca toate resursele de la %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"TERMINAT --%s--\n"
+"Ora totală a ceasului de perete: %s\n"
+"Descărcat: %d fișiere, %s în %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Cota de descărcare din %s este DEPĂȘITĂ!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O nu este suportat pentru descărcarea metalink. Se ignoră.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Fișier metalink planificat: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Fișier metalink securizat: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Se respinge fișierul metalink. Nume nesigur.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Se procesează metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Se respinge fișierul metaurl %s. Nume nesigur.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Nu s-a putut descărca %s. Se omite metaurl-ul.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Nu se poate parsa fișierul metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Procesarea metaurl-urilor s-a întors cu eroare.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tipul de resursă %s nu este suportat, se ignoră...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Nu s-a putut deschide fișierul descărcat.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Se calculează dimensiunea pentru %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Dimensiunea fișierului nu este declarată. Se omite verificarea.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nu s-a putut obține dimensiunea fișierului descărcat.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Nepotrivire a dimensiunii pentru fișierul %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Dimensiunea se potrivește.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Se calculează suma de control pentru %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Suma de control se potrivește.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Nepotrivire a sumei de control pentru fișierul %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+"Nu s-a putut deschide fișierul descărcat pentru verificarea semnăturii.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Validarea semnăturii a reușit.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Semnătură nevalidă. Se respinge resursa.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+"Datele se potrivesc cu semnătura, dar semnătura nu este de încredere.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Nu s-au găsit sume de control.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Nu s-a putut descărca %s. Se omite resursa.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Fișierul %s a fost recuperat dar dimensiunea nu se potrivește.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Fișierul %s a fost recuperat dar suma de control nu se potrivește.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Fișierul %s a fost recuperat dar semnătura nu se potrivește.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Se redenumește %s la %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Continui în fundal.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Se continuă în fundal, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Ieșirea va fi scrisă la %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() a eșuat\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() a eșuat\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Nu am putut găsi un driver de socket folosibil.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() a eșuat. Soclul nu a putut fi stabilit ca blocare.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: avertisment: %s jetonul apare înainte de oricare nume de mașină\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: simbol necunoscut \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Folosire: %s NETRC [NUME_HOST]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: n-am putut stabili %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "AVERTISMENT: se utilizează o contribuție slabă aleatorie.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Nu s-a putut contribui la PRNG; considerați utilizarea a --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Versiunea OpenSSL este prea veche pentru a suporta TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Versiunea OpenSSL este prea veche pentru a suporta TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Versiunea OpenSSL este prea veche pentru a suporta TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: valoare de opțiune neimplementată „secure-protocol†%d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Listă de cifru nevalidă: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"AVERTISMENT: Nu s-a putut contribui la PRNG. Considerați utilizarea a --"
+"random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: nu se poate verifica certificatul pentru %s, emis de %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Nu se poate verifica local autoritatea emitentului.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " S-a întâlnit un certificat semnat de sine.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Certificatul emis nu este încă valid.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Certificatul emis a expirat.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: niciun nume alternativ de subiect de certificat se potrivește\n"
+"\tcu numele de gazdă cerut %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: numele comun al certificatului %s nu se potrivește cu numele de "
+"gazdă cerut %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: numele comun al certificatului nu este valid (conține un caracter "
+"NUL).\n"
+" Acesta poate fi un indicator cum că gazda nu este cine pretinde să fie\n"
+" (adică, nu este realul %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Pentru a vă conecta nesigur la %s, utilizaÈ›i „--no-check-certificateâ€.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ se omite %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Specificație de stil de punct nevalidă %s; se lasă nemodificat.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " eta %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " în "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Nu se poate obține frecvența de ceas ÎN TIMP REAL: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Ştergere %s pentru că oricum ar fi trebuit refuzat.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nu se poate deschide %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Se încarcă robots.txt; ignoraţi erorile.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Eroare în analiza URL proxy: %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Eroare în URL proxy %s: Trebuie să fie HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d redirectări depăşite.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Renunţ.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Reîncerc.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"S-au găsit legături deteriorate.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"S-a găsit %d legătură deteriorată.\n"
+"\n"
+msgstr[1] ""
+"S-au găsit %d legături deteriorate.\n"
+"\n"
+msgstr[2] ""
+"S-au găsit %d de legături deteriorate.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Eroare necunoscută"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Schemă nesuportată %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schema lipsește"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Nume de gazdă nevalid"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Număr de port invalid"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Nume utilizator invalid"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Adresă numerică IPv6 neterminată"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Adresele IPv6 nu sunt suportate"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Adresă numerică IPv6 invalidă"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Suportul HTTPS nu este compilat"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "A apărut o ecvență de multiocteți care nu se poate converti\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Nu s-a putut aloca destulă memorie; memorie epuizată.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Nu s-au putut aloca %ld octeți; memorie epuizată.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: preîncărcarea textului este prea mare (%d octeți), se renunță.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Continui în fundal, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nu s-a putut dezlega legătura simbolică %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Nu s-a putut aplica Fopen la fișierul %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Nu s-a putut obține FD pentru fișierul %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Nu s-a putut da stat fișierului %s, (verificați permisiunile)\n"
+
+#: src/utils.c:902
+#, fuzzy, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Fișierul %s s-a modificat de la ultima verificare. Verificarea de securitate "
+"a eșuat."
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Nu s-a putut deschide fișierul %s, motiv: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Nu s-a putut da stat la fișierul %s, eroare: %s\n"
+
+#: src/utils.c:953
+#, fuzzy, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Se încearcă deschiderea fișierului %s dar s-a modificat de la ultima "
+"verificare. Verificarea de securitate a eșuat."
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Expresie regulată nevalidă %s, eroare PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Expresie regulată nevalidă %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Eroare în timpul potrivirii %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Se omite cheia cu dimensiunea greșită (%d/%d): %s\n"
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Eroare la deschiderea fișierului WARC %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Eroare la deschiderea fișierului WARC %s.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Eroare la duplicarea descriptorului de fișier al fișierului WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Eroare la deschiderea fluxului GZIP către fișierul WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Eroare la scrierea înregistrării warcinfo la fișierul WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Se deschide fișierul WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Eroare la deschiderea fișierului WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"FiÈ™ierul CDX nu listează url-urile originale. (LipseÈ™te coloana „aâ€.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "FiÈ™ierul CDX nu listează sumele de control. (LipseÈ™te coloana „kâ€.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"FiÈ™ierul CDX nu listează id-urile de înregistrare. (LipseÈ™te coloana „uâ€.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"S-a încărcat %d înregistrare de la CDX.\n"
+"\n"
+msgstr[1] ""
+"S-au încărcat %d înregistrări de la CDX.\n"
+"\n"
+msgstr[2] ""
+"S-au încărcat %d de înregistrări de la CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Nu s-a putut citi fișierul CDX %s pentru deduplicare.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Nu s-a putut deschide fișierul manifest temporar WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Nu s-a putut deschide fișierul de înregistrare temporar WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Nu s-a putut deschide fișierul WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Nu s-a putut deschide fișierul CDX pentru ieșire.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Nu s-a putut deschide fișierul temporar WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"S-a găsit potrivirea exactă în fișierul CDX. Se salvează înregistrarea de "
+"revizitare la WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Eroare de sistem necunoscută"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Familia de adrese pentru numele de gazdă nu este suportată"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Valoare greșită pentru ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Eșec nerecuperabil în rezolvarea numelui"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family nu este suportat"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Eșec la alocarea memoriei"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Nu este nicio adresă asociată cu numele de gazdă"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Nume sau serviciu necunoscut"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Numele serverului nu este suportat pentru ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype nu este suportată"
+
+#~ msgid "System error"
+#~ msgstr "Eroare de sistem"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Preîncărcarea argumentului este prea mică"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Cerere de procesare în progres"
+
+#~ msgid "Request canceled"
+#~ msgstr "Cererea este anulată"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Cererea nu este anulată"
+
+#~ msgid "All requests done"
+#~ msgstr "Toate cererile terminate"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "ÃŽntrerupt de un semnal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Șirul parametru nu este codat corect"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: opțiunea „%s%s†este ambiguă\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: opțiunea „%s%s†este ambiguă; posibilități:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: opÈ›iune nerecunoscută „%s%sâ€\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: opțiunea „%s%s†nu permite un argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: opțiunea „%s%s†necesită un argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: opÈ›iune nevalidă -- „%câ€\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: opÈ›iunea necesită un argument -- „%câ€\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Succes"
+
+#~ msgid "No match"
+#~ msgstr "Nicio potrivire"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Expresie regulată nevalidă"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Caracter în ordine alfabetică nevalid"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Nume de clasă de caracter nevalid"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Linie oblică inversă de urmărire"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Referință de înapoi nevalidă"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "[, [^, [:, [., sau [= fără pereche"
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "( sau \\( fără pereche"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "\\{ fără potrivire"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Conținut nevalid al \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Sfârșit de interval nevalid"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Memorie epuizată"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Expresie regulată precedentă nevalidă"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Sfârșit prematur al expresiei regulate"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Expresia regulată este prea mare"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr ") sau \\) fără pereche"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Nu există expresie regulată precedentă"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nu se poate crea conexiunea"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "subprocesul %s a eșuat"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle a eșuat"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "nu se poate restaura fd %d: dup2 a eșuat"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "subproces %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "subprocesul %s a primit un semnal fatal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "memorie epuizată"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Trimiteți email cu rapoartele de defecțiuni, întrebări, discuții la <bug-"
+#~ "wget@gnu.org>\n"
+
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr ""
+#~ "Nu am putut converti `%s' într-o adresă bind. Readucere(reverting) la "
+#~ "ANY.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Eroare în Set-Cookie, câmpul `%s'"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST eÅŸuat; nu se va trunchia `%s'.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s rămaşi]"
+
+#~ msgid "%s: option `--%s' doesn't allow an argument\n"
+#~ msgstr "%s: opţiunea `--%s' nu permite un parametru\n"
+
+#~ msgid "%s: unrecognized option `--%s'\n"
+#~ msgstr "%s: opţiune nerecunoscută `--%s'\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opţiune ilegală -- %c\n"
+
+#~ msgid "%s: option `-W %s' is ambiguous\n"
+#~ msgstr "%s: opţiunea `W %s' este ambiguă\n"
+
+#~ msgid "%s: option `-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: opţiunea `-W %s' nu permite parametri\n"
+
+#~ msgid "Host not found"
+#~ msgstr "Host negăsit"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "S-a eşuat în setarea contextului SSL\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Se încearcă fără certificatele specificate\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Sfârşit fişier la analiza headerelor.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Autorizare eşuată.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Continuarea downloadului a eşuat la acest fişier, ceea ce intră în \n"
+#~ "conflict cu `-c'.\n"
+#~ "Se refuză trunchierea fişierului `%s' existent. \n"
+#~ "\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (%s rămaşi)"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "Fişierul `%s' există deja, nu se mai aduce.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%ld/%ld])\n"
+#~ "\n"
+#~ msgstr "%s (%s) - `%s' salvat [%ld%ld])\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %ld/%ld. "
+#~ msgstr "%s (%s) - Conexiune închisă la octetul %ld/%ld. "
+
+#~ msgid "%s: %s: Invalid boolean `%s', use always, on, off, or never.\n"
+#~ msgstr ""
+#~ "%s: %s:Boolean invalid `%s', specificaţi always, on, off sau never.\n"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "De start:\n"
+#~ " -V, --version\t\t afişează versiunea Wget şi iese.\n"
+#~ " -h, --help\t\t\t tipăreşte acest help.\n"
+#~ " -b, --background\t\trulare în fundal dupa startare.\n"
+#~ " -e, --execute=COMANDĂ\texecută o comandă în stilul `.wgetrc'.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Logări şi fişiere de intrare:\n"
+#~ " -o, --output-file=FIŞIER\tlogare mesaje în FIŞIER.\n"
+#~ " -a, --append-output=FIŞIER\tadăugare mesaje în FIŞIER.\n"
+#~ " -d, --debug\t\t\t tipărire output debug.\n"
+#~ " -q, --quiet\t\t\t silenţios (fără output).\n"
+#~ " -v, --verbose\t\t detaliat (este implicit).\n"
+#~ " -nv, --non-verbose\t\t nedetaliat, fără a fi silenţios.\n"
+#~ " -i, --input-file=FIŞIER\t download de URL-uri găsite în FIŞIER.\n"
+#~ " -F, --force-html\t\t consideră fişierul de intrare ca HTML.\n"
+#~ " -B, --base=URL\t prefixare URL la linkuri relative în -F -i "
+#~ "fiÅŸier.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Download:\n"
+#~ " -t,\t--tries=NUMĂR\t\tsetează numărul de încercări ca NUMĂR (0 este "
+#~ "nelimitat\n"
+#~ " --retry-connrefused reîncearcă şi în cazul în care conexiunea "
+#~ "este refuzată.\n"
+#~ " -O,\t--output-document=FIşIER \tscrie documentele în FIŞIER.\n"
+#~ " -nc, --no-clobber\t\tnu secţiona fişierele existente sau utilizează "
+#~ "sufixe .#\n"
+#~ " -c, --continue\t\t continuă să iei un fişier downloadat parţial.\n"
+#~ "\t--progress=TIP\t\t selectează mod măsurare desfaşurare download.\n"
+#~ " -N, --timestamping\t\tnu aduce fişierele dacă nu sunt mai noi decât "
+#~ "cele locale.\n"
+#~ " -S, --server-response\ttipăreşte răspunsul serverului.\n"
+#~ " --spider\t\t nu descărca nimic.\n"
+#~ " -T, --timeout=SECUNDE\taşteaptă 1...SECUNDE între reîncercările de "
+#~ "aducere.\n"
+#~ " --dns-timeout=SECUNDE setare expirare căutare DNS la "
+#~ "SECUNDE.\n"
+#~ " --connect-timeout=SECUNDE setare expirare conectare la.SECUNDE\n"
+#~ " --read-timeout=SECUNDE setare expirare citire la SECUNDE.\n"
+#~ " -w, --wait=SECUNDE aşteaptă SECUNDE între aduceri.\n"
+#~ " --waitretry=SECUNDE aşteaptă 1...SECUNDE între încercările de "
+#~ "aducere.\n"
+#~ " --random-wait aşteaptă între 0...2*WAIT secunde între "
+#~ "aduceri.\n"
+#~ " -Y, --proxy=on/off\t\tactivează (on) sau dezactivează(off) proxy.\n"
+#~ " -Q, --quota=NUMĂR\t\tsetează cotă de descărcare la NUMĂR.\n"
+#~ "\t--limit-rate=RATĂ\t limitează rată descărcare la RATă.\n"
+#~ " --dns-cache=off dezactivează cachingul de căutări DNS.\n"
+#~ " --restrict-file-names=OS restricţionează caracterele din numele "
+#~ "fiÅŸierul la cele pe care le permite sistemul de operare.n\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Directoare:\n"
+#~ " -nd --no-directories nu crea directoare.\n"
+#~ " -x, --force-directories forţează crearea directoarelor.\n"
+#~ " -nH, --no-host-directories nu crea directoare gazdă.\n"
+#~ " -P, --directory-prefix=PREFIX salvează fişierele în PREFIX/...\n"
+#~ " --cut-dirs=NUMĂR Ignoră NUMĂR componente director "
+#~ "remote.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opţiuni HTTP:\n"
+#~ " --http-user=USER setează userul http ca USER.\n"
+#~ " --http-passwd=PASS setează parola http ca PASS.\n"
+#~ " -C, --cache=on/off (nu)permite date server-cached (în mod "
+#~ "normal permis).\n"
+#~ " -E, --html-extension salvează toate documentele text/html cu "
+#~ "extensie .html.\n"
+#~ " --ignore-length ignoră câmpul header `Content-Length'.\n"
+#~ " --header=ŞIR inserează ŞIR în headere.\n"
+#~ " --proxy-user=USER setează USER drept nume utilizator proxy.\n"
+#~ " --proxy-passwd=PASS setează PASS drept parolă proxy.\n"
+#~ " --referer=URL include headerul `Referer: URL' în cererea "
+#~ "HTTP.\n"
+#~ " -s, --save-headers salvează headerele HTTP în fişier.\n"
+#~ " -U, --user-agent=AGENT identificare ca AGENT în loc de Wget/"
+#~ "VERSIUNE.\n"
+#~ " --no-http-keep-alive dezactivează HTTP keep-alive (conexiuni "
+#~ "persistente).\n"
+#~ " --cookies=off nu utiliza cookies.\n"
+#~ " --load-cookies=FIŞIER încărcă cookies din FIŞIER înainte de "
+#~ "sesiune.\n"
+#~ " --save-cookies=FIŞIER salvează cookies în FIŞIER după sesiune.\n"
+#~ " --post-data=ÅžIR foloseÅŸte metoda POST; trimite ÅžIR ca ÅŸi date.\n"
+#~ " --post-file=FIŞIER foloseşte metoda POST; trimite conţinutul "
+#~ "FIÅžIERului\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opţiuni HTTPS (SSL):\n"
+#~ " --sslcertfile=FIŞIER certificat client opţional.\n"
+#~ " --sslcertkey=FIŞIER_CHEIE fişier_cheie opţional pentru acest "
+#~ "certificat.\n"
+#~ " --egd-file=FIÅžIER nume fiÅŸier al socketului EGD.\n"
+#~ " --sslcadir=DIR directorul unde este stocată lista de CA-"
+#~ "uri.\n"
+#~ " --sslcafile=FIŞIER fişierul cu grămada(bundle) de CA-uri\n"
+#~ " --sslcerttype=0/1 Tip Cert-Client=PEM (implicit) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Verificarea serverului pentru CA-urile "
+#~ "furnizate\n"
+#~ " --sslprotocol=0-3 verificare protocol SSL; 0=automat,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Opţiuni FTP:\n"
+#~ " -nr, --dont-remove-listing nu ÅŸterge fiÅŸierele `.listing'.\n"
+#~ " -g, --glob=on/off activare/dezactivare nume globale.\n"
+#~ " --passive-ftp utilizează modul de transfer \"pasiv\".\n"
+#~ " --retr-symlinks în recursiune, adu fişierele linkuite (nu "
+#~ "directoarele).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Aducere recursivă:\n"
+#~ " -r, --recursive absorbire web recursivă -- folosiţi cu "
+#~ "atenţie!\n"
+#~ " -l, --level=NUMĂR adâncime recursiune maximă (inf sau 0 pentru "
+#~ "infinită).\n"
+#~ " --delete-after şterge fişierele locale dupa descărcare.\n"
+#~ " -k, --convert-links converteşte linkuri non-relative în "
+#~ "relative.\n"
+#~ " -K, --backup-converted înainte de a converti fişierul X, back-up ca "
+#~ "X.orig.\n"
+#~ " -m, --mirror opţiune scurtă echivalentă cu -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites aducere toate imaginile, etc. necesare pentru "
+#~ "afiÅŸarea paginii HTML.\n"
+#~ " --strict-comments activează manipularea strictă (SGML) a "
+#~ "comentariilorHTML.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Acceptare/refuz recursive:\n"
+#~ " -A, --accept=LISTĂ listă separată prin virgule a "
+#~ "extensiilor acceptate.\n"
+#~ " -R, --reject=LISTĂ listă separată prin virgule a "
+#~ "extensiilor refuzate.\n"
+#~ " -D, --domains=LISTĂ listă separată prin virgule a "
+#~ "domeniilor acceptate.\n"
+#~ " --exclude-domains=LISTĂ listă separată prin virgule a "
+#~ "domeniilor refuzate.\n"
+#~ " --follow-ftp urmează legăturile FTP din documente "
+#~ "HTML.\n"
+#~ " --follow-tags=LISTĂ listă separată prin virgule a tagurilor "
+#~ "HTML urmate.\n"
+#~ " -G, --ignore-tags=LISTĂ listă separată prin virgule a tagurilor "
+#~ "HTML ignorate.\n"
+#~ " -H, --span-hosts vizitează şi site-uri străine în "
+#~ "recursiune.\n"
+#~ " -L, --relative urmează doar linkurile relative.\n"
+#~ " -I, --include-directories=LISTĂ listă directoare permise.\n"
+#~ " -X, --exclude-directories=LISTĂ listă directoare excluse.\n"
+#~ " -np, --no-parent nu urca la directorul părinte.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Acest program este distribuit în speranţa că va fi folositor,\n"
+#~ "dar FĂRĂ NICI O GARANŢIE; chiar fără garanţia presupusă a\n"
+#~ "VANDABILITĂŢII sau POTRIVIRII PENT UN SCOP ANUME. Citiţi\n"
+#~ "Licenţa Publică Generală GNU pentru mai multe detalii.\n"
+
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "Startare WinHelp %s\n"
+
+#~ msgid "Empty host"
+#~ msgstr "Host vid"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Memorie plină.\n"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Eroare de sintaxă în Set-Cookie la caracterul `%c'.\n"
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: Nu se poate converti `%s' în adresă IP.\n"
+
+#~ msgid "%s: %s: invalid command\n"
+#~ msgstr "%s: %s: comandă invalidă\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: Ciclu de redirectare detectat.\n"
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644
index 0000000..81e776e
--- /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..c16fb7e
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,3704 @@
+# Translation of wget messages to Russian
+# Copyright (C) 1998, 1999, 2000, 2001, 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Const Kaplinsky <const@ce.cctpu.edu.ru>, 1998, 1999, 2000, 2001.
+# Pavel Maryanov <acid_jack@ukr.net>, 2004, 2005, 2006, 2008, 2009.
+# Pavel Maryanov <acid@jack.kiev.ua>, 2010, 2011, 2012.
+# Yuri Kozlov <yuray@komyakino.ru>, 2012, 2013, 2015, 2016, 2017, 2018, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-09 07:23+0300\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <gnu@d07.ru>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\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"
+"X-Generator: Lokalize 20.04.3\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: не удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ bind %s; bind отключаетÑÑ.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Подключение к %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Подключение к %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Подключение к [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "ошибка при setsockopt SO_RCVBUF: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "Ñоединение уÑтановлено.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "ошибка: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: не удаётÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "ошибка при setsockopt SO_REUSEADDR: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Слишком много открытых fds. Ðевозможно иÑпользовать select Ð´Ð»Ñ fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "СÑылки преобразованы в файлы (%d) за %s Ñекунд.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Преобразование ÑÑылок в %s… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "нечего выполнÑÑ‚ÑŒ.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ðе удаётÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ ÑÑылки в %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ðе удаётÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ðе удаётÑÑ Ñохранить %s под именем %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ðевозможно получить кукиÑÑ‹ Ð´Ð»Ñ %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "СинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в Set-Cookie: %s в позиции %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "КукиÑÑ‹, полученные из %s, попыталиÑÑŒ изменить домен на "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "не удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл cookies %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Ошибка запиÑи в «%s»: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Ðеподдерживаемый формат лиÑтинга, пробуетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€ лиÑтинга Ð´Ð»Ñ Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ /%s на %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтно "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Файл "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Каталог "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "СÑылка "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "ÐеизвеÑтно "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s байт)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Размер (байт): %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) оÑталоÑÑŒ"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s оÑталоÑÑŒ"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (не доÑтоверно)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Ðевозможно инициализировать SSL. Будет отключено.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "ВыполнÑетÑÑ Ð²Ñ…Ð¾Ð´ под именем %s … "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Ошибка в ответе Ñервера, управлÑющее Ñоединение закрываетÑÑ.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Ошибка в приветÑтвии Ñервера.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Ошибка запиÑи, управлÑющее Ñоединение закрываетÑÑ.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Сервер отклонил логин.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Ðеверный логин.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Выполнен вход в ÑиÑтему!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Сервер не принÑл команду «PBSZ 0».\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Сервер не принÑл команду «PROT %c».\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Ошибка Ñервера, невозможно определить тип ÑиÑтемы.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "готово. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "готово.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "ÐеизвеÑтный тип «%c», управлÑющее Ñоединение закрываетÑÑ.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "готово. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD не нужен.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Ð’ getftp() доÑтигнута логичеÑки невозможный раздел"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Ðет такого каталога: %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD не требуетÑÑ.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Файл уже был загружен.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ðевозможно начать PASV-передачу.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ошибка разбора ответа PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "невозможно было подключитьÑÑ Ðº %s порт %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Ошибка bind (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "ÐедопуÑтимый PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Сбой REST, запуÑк Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Файл %s ÑущеÑтвует.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Ðет такого файла: %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ðет такого файла: %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ðет такого файла или каталога: %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s вырвалÑÑ Ð² дейÑтвительноÑÑ‚ÑŒ.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, управлÑющее Ñоединение закрываетÑÑ.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Соединение: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "УправлÑющее Ñоединение закрыто.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Передача данных прервана.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Файл %s уже ÑущеÑтвует; не загружаетÑÑ.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(попытка:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - запиÑан в stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s Ñохранён [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "УдалÑетÑÑ %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Ð’ качеÑтве временного файла Ð´Ð»Ñ Ð»Ð¸Ñтинга иÑпользуетÑÑ %s.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Удалён %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Глубина рекурÑии %d превыÑила макÑимальную глубину %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Удалённый файл не новее локального файла %s — не загружаетÑÑ.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Удалённый файл новее локального файла %s — загружаетÑÑ.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Размеры не Ñовпадают (локальный размер %s) — загружаетÑÑ.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÑимволичеÑкой ÑÑылки, пропуÑкаетÑÑ.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"ÐšÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÑимволичеÑÐºÐ°Ñ ÑÑылка %s -> %s уже ÑущеÑтвует.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "СоздаётÑÑ ÑимволичеÑÐºÐ°Ñ ÑÑылка %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "СимволичеÑкие ÑÑылки не поддерживаютÑÑ, ÑÑылка %s пропуÑкаетÑÑ.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ПропуÑкаетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: неизвеÑтный/неподдерживаемый тип файла.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Ðе удалоÑÑŒ назначить права Ð´Ð»Ñ %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: повреждена метка даты/времени.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+"Каталоги не будут загружены, Ñ‚.к. глубина ÑоÑтавлÑет %d (макÑимум %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Вход в каталог «%s» не выполнÑетÑÑ, Ñ‚.к. он иÑключён/не включён.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "ОтклонÑетÑÑ %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "ОтклонÑетÑÑ %s (некорректный Ñлемент).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "«%s» иÑключён/не включён в ÑоответÑтвии Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрным выражением.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Ошибка ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %s Ñ %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ðет Ñовпадений Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼ %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ð² формате HTML запиÑан в файл «%s» [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ð² формате HTML запиÑан в файл «%s».\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ОШИБКÐ: Ðе удалоÑÑŒ открыть каталог %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ОШИБКÐ: Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñертификата %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Загружен Ñертификат CA «%s»\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ОШИБКÐ: Ðе удалоÑÑŒ загрузить CRL-файл «%s»: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Загружен CRL-файл «%s»\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ОШИБКÐ: Ð”Ð»Ñ GnuTLS требуетÑÑ ÐºÐ»ÑŽÑ‡ и Ñертификат одного типа.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Слишком ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ GnuTLS, чтобы поддерживать TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: значение %u параметра «secure-protocol» не реализовано\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Сообщите об Ñтой ошибке по адреÑу bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: значение %d параметра «secure-protocol» не реализовано\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: невозможно задать Ñтроку приоритета напрÑмую. ВозвращаемÑÑ Ðº "
+"приоритету по умолчанию.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ОШИБКÐ"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "ПРЕДУПРЕЖДЕÐИЕ"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Ðет Ñертификата, предÑтавленного %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Ðет Ð´Ð¾Ð²ÐµÑ€Ð¸Ñ Ñертификату Ð´Ð»Ñ %s.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: ÐеизвеÑтный издатель Ñертификата %s.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Сертификат Ð´Ð»Ñ %s отозван.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: ПодпиÑавший Ñертификат %s отÑутÑтвует в УЦ.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Ð”Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñертификата %s иÑпользован небезопаÑный алгоритм.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Сертификат %s ещё не активирован.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата %s иÑтёк.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Ошибка инициализации Ñертификата X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Сертификат не найден\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Ошибка разбора Ñертификата: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Сертификат ещё не активирован\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата иÑтек\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Владелец Ñертификата не Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ узла %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Открытый ключ не ÑоответÑтвует прикреплённому открытому ключу!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Сертификат должен ÑоответÑтвовать X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Ошибка при обработке ÑпиÑка адреÑов.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "ÐеизвеÑтный узел"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Временный Ñбой при разрешении имени"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "РаÑпознаётÑÑ %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "ошибка: Ð´Ð»Ñ Ñервера нет адреÑа IPv4/IPv6.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "ошибка: Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ñтекло.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: не удаётÑÑ Ñ€Ð°Ñпознать неполную ÑÑылку %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"Ð’ %s найден атрибут no-follow. По ÑÑылкам из Ñтой Ñтраницы переходов "
+"выполнÑÑ‚ÑŒÑÑ Ð½Ðµ будет\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: недопуÑтимый URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Ошибка запиÑи HTTP-запроÑа: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Заголовки отÑутÑтвуют, подразумеваетÑÑ HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Файл %s уже ÑущеÑтвует — не загружаетÑÑ.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "Ошибка gmtime. ВероÑтно, из-за дефекта.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ðевозможно преобразовать отметку времени в формат http. ОткатываемÑÑ ÐºÐ¾ "
+"времени 0 как времени поÑледнего изменениÑ.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "ОтÑутÑтвует файл BODY-данных %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Повторное иÑпользование ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Повторное иÑпользование ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Сбой Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° прокÑи: %s.\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ОШИБКР%d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ÐÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтрока ÑтатуÑа"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Сбой Ñ‚ÑƒÐ½Ð½ÐµÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾ÐºÑи: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ñхема аутентификации.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Сохранение в: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"При Ñкачивании подпиÑи:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Ðевозможно прочитать Ñодержимое подпиÑи из временного файла. ПропуÑкаетÑÑ.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Ðе удалоÑÑŒ Ñоздать временный файл. Скачивание подпиÑи пропуÑкаетÑÑ.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "ÐедопуÑтимое значение pri. Предполагаем %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Ðевозможно найти подходÑщую Ñ…Ñш-Ñумму (digest) Ð´Ð»Ñ Ñ€ÐµÑурÑов Metalink.\n"
+"Игнорируем.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "SSL отключаетÑÑ Ð¸Ð·-за обнаруженных ошибок.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½. Ожидание ответа… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ðе получено никаких данных.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ (%s) в заголовках.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(нет опиÑаниÑ)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "ÐдреÑ: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "нет данных"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [переход]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Файл %s на Ñервере не изменилÑÑ. Скачивание пропуÑкаетÑÑ.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Сервер проигнорировал заголовок If-Modified-Since Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s.\n"
+"Попробуйте добавить параметр --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Файл уже полноÑтью загружен; нечего выполнÑÑ‚ÑŒ.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Длина: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "игнорируетÑÑ"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Предупреждение: в HTTP маÑки не поддерживаютÑÑ.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Включен режим робота. Проверка ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ файла.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ðевозможно запиÑать в %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "ОбÑзательный атрибут отÑутÑтвует в принÑтом Заголовке.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Ошибка аутентификации пользователÑ/паролÑ.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ðевозможно запиÑать в файл WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ðевозможно запиÑать во временный файл WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ðе удаётÑÑ ÑƒÑтановить SSL-Ñоединение.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ðевозможно удалить %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ОШИБКÐ: перенаправление (%d) без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Ðевозможно найти данные Metalink в ответе HTTP. Файл ÑкачиваетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "
+"HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Ðайдены заголовки Metalink. Переходим в режим Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Удалённый файл не ÑущеÑтвует — Ð±Ð¸Ñ‚Ð°Ñ ÑÑылка!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "ОтÑутÑтвует заголовок last-modified — временные отметки выключены.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"ÐедопуÑтимый заголовок last-modified — временные отметки проигнорированы.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Файл на Ñервере не новее локального файла %s — не загружаетÑÑ.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Размеры файлов не Ñовпадают (локальный размер %s) — загружаетÑÑ.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Удалённый файл более новый, загружаетÑÑ.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Удалённый файл ÑущеÑтвует и может Ñодержать ÑÑылки на другие реÑурÑÑ‹ — "
+"загружаетÑÑ.\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr "Удалённый файл ÑущеÑтвует, но не Ñодержит ÑÑылок — не загружаетÑÑ.\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Удалённый файл ÑущеÑтвует и может Ñодержать дополнительные\n"
+"ÑÑылки, но рекурÑÐ¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° — не загружаетÑÑ.\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Удалённый файл ÑущеÑтвует.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"/%s (%s) - запиÑан в stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s Ñохранён [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Соединение закрыто, Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Ошибка чтениÑ, Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Ошибка чтениÑ, Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Ðеподдерживаемый атрибут защиты «%s».\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Ðеподдерживаемый алгоритм «%s».\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC указывает на %s, доÑтуп к которому вызывает ошибку: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ðевозможно прочитать %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Ошибка в %s в Ñтроке %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Ошибка ÑинтакÑиÑа в %s в Ñтроке %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° %s в %s Ñтроке %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Ошибка обработки ÑиÑтемного файла wgetrc (env SYSTEM_WGETRC). Проверьте\n"
+"«%s»,\n"
+"или укажите другой файл Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Ошибка обработки ÑиÑтемного файла wgetrc. Проверьте\n"
+"«%s»,\n"
+"или укажите другой файл Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Предупреждение: ÑиÑтемный и пользовательÑкий wgetrc указывают на %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s: %s: Ðеверное логичеÑкое выражение %s; иÑпользуйте «on» или «off».\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Ðеверное %s; иÑпользуйте «on», «off» или «quiet».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ðеверное чиÑло %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s должно иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ один раз\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ðеверное значение байта %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ðеверный диапазон времени %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Отрицательный диапазон времени %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"Ð”Ð»Ñ use-askpass требуетÑÑ Ñтрока или уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ "
+"WGET_ASKPASS или SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ðеверное значение %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ðеверный заголовок %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ðеверный заголовок WARC %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ðеверный тип прогреÑÑа %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: ÐедопуÑтимое ограничение %s,\n"
+" иÑпользуйте [unix|vms|windows],[lowercase|uppercase],[nocontrol],"
+"[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° %s\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Преобразование из %s в %s не поддерживаетÑÑ\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Ð’Ñтречена Ð½ÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ð¸Ð»Ð¸ недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð±Ð°Ð¹Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Код необработанной ошибки %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: локаль не уÑтановлена\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "ошибка idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Ошибка при преобразовании в нижний региÑÑ‚Ñ€: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Вывод перенаправлÑетÑÑ Ð² %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; журналирование отключаетÑÑ.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "ИÑпользование: %s [ПÐРÐМЕТР]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"ОбÑзательные аргументы Ð´Ð»Ñ Ð´Ð»Ð¸Ð½Ð½Ñ‹Ñ… параметров ÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ñзательными и Ð´Ð»Ñ "
+"коротких параметров.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "ЗапуÑк:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version показать верÑию Wget и завершить работу\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help показать Ñту Ñправку\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background поÑле запуÑка перейти в фоновый режим\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=КОМÐÐДРвыполнить команду в Ñтиле «.wgetrc»\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Журналирование и входной файл:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=ФÐЙЛ запиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ФÐЙЛ\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=ФÐЙЛ допиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² конец ФÐЙЛÐ\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug показать много отладочной информации\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug показать отладочную информацию Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet ничего не выводить\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose показывать подробные ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ (по умолчанию)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose отключить вывод подробных Ñведений (не "
+"полноÑтью)\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=ТИП единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкной ÑпоÑобноÑти\n"
+" определить ТИПОМ. ТИП может быть равно bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=ФÐЙЛ загрузить URL-Ñ‹ ÑоглаÑно локальному\n"
+" или внешнему ФÐЙЛУ\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=ФÐЙЛ Ñкачать файлы, перечиÑленные в локальном\n"
+" ФÐЙЛЕ Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html Ñчитать, что входной файл — HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL Ñчитать, что ÑÑылки из входного файла (-i -F)\n"
+" указаны отноÑительно URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=ФÐЙЛ задать файл наÑтроек\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config не читать файлы наÑтроек\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=ФÐЙЛ протоколировать причины отброÑа URL в ФÐЙЛ\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Загрузка:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ЧИСЛО уÑтановить ЧИСЛО повторных попыток\n"
+" (0 без ограничениÑ)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused повторÑÑ‚ÑŒ, даже еÑли в подключении "
+"отказано\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ОШИБКИ\n"
+" ÑпиÑок (через запÑтую) ошибок HTTP,\n"
+" вызывающих повтор\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=ФÐЙЛ запиÑывать документы в ФÐЙЛ\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber пропуÑкать загрузки, которые приведут к\n"
+" загрузке уже ÑущеÑтвующих файлов\n"
+" (и их перезапиÑи)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc не пытатьÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ данные из .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue возобновить загрузку чаÑтично загруженного\n"
+" файла\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=СМЕЩЕÐИЕ начинать загрузку Ñо СМЕЩЕÐИЯ (ÑчитаетÑÑ Ñ "
+"0)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=ТИП выбрать тип индикатора выполнениÑ\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress показывать индикатор Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² любом\n"
+" режиме подробноÑти\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping не загружать повторно файлы, только еÑли "
+"они\n"
+" не новее, чем локальные\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-use-server-timestamps не иÑпользовать проверку\n"
+" if-modified-since Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов в режиме "
+"учёта\n"
+" меток времени\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps не уÑтанавливать метку времени локальному\n"
+" файлу, полученную Ñ Ñервера\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response вывод ответа Ñервера\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ничего не загружать\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=СЕКУÐДЫ уÑтановка значений вÑех тайм-аутов равными\n"
+" чиÑлу СЕКУÐД\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ÐДРЕСРÑпиÑок запрашиваемых Ñерверов DNS\n"
+" (через запÑтую)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ÐДРЕС привÑзать определитель DNS к ÐДРЕСУ\n"
+" (Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP) локального "
+"компьютера\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=СЕК уÑтановка тайм-аута поиÑка в DNS в СЕК\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=СЕК уÑтановка тайм-аута Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² СЕК\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=СЕК уÑтановка тайм-аута Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð² СЕК\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=СЕКУÐДЫ пауза в СЕКУÐДÐÐ¥ между загрузками\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=СЕКУÐДЫ пауза в 1..СЕКУÐДЫ между повторными\n"
+" попытками загрузки\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait пауза в 0.5*WAIT...1.5*WAIT Ñекунд\n"
+" между загрузками\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy Ñвно выключить прокÑи\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ЧИСЛО уÑтановить величину квоты загрузки в ЧИСЛО\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ÐДРЕС привÑзать ÐДРЕС (Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP)\n"
+" локального компьютера\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=СКОРОСТЬ ограничить СКОРОСТЬ загрузки\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache отключить кÑширование DNS-запроÑов\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=ОС иÑпользовать в именах файлов Ñимволы,\n"
+" допуÑтимые в ОС\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case игнорировать региÑÑ‚Ñ€ при ÑопоÑтавлении\n"
+" файлов и/или каталогов\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only подключатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к адреÑам IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only подключатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к адреÑам IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=СЕМЕЙСТВО подключатьÑÑ Ñначала к адреÑам указанного\n"
+" ÑемейÑтва (может быть IPv6, IPv4 или "
+"ничего)\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=ПОЛЬЗОВÐТЕЛЬ уÑтановить и ftp- и http-Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²\n"
+" ПОЛЬЗОВÐТЕЛЬ\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=ПÐРОЛЬ уÑтановить ftp- и http-пароль в ПÐРОЛЬ\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password запрашивать пароли\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=КОМÐÐДРуказать обработчик мандатов Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа \n"
+" имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ. ЕÑли \n"
+" КОМÐÐДРне указана, то иÑпользуетÑÑ \n"
+" Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ WGET_ASKPASS \n"
+" или SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri выключить поддержку IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=КДР иÑпользовать КДР как локальную кодировку\n"
+" Ð´Ð»Ñ IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=КДР иÑпользовать КДР как удалённую кодировку\n"
+" по умолчанию\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink удалить файл перед затиранием\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash оÑтавлÑÑ‚ÑŒ файлы Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼Ð¸\n"
+" контрольными Ñуммами (добавлÑÑ .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=ÐОМЕР порÑдковый ÐОМЕР metaurl\n"
+" Metalink application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http иÑпользовать метаданные Metalink из\n"
+" заголовка ответов HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location предпочитаемое раÑположение реÑурÑов "
+"Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr включить хранилище метаданных в\n"
+" раÑширенных файловых атрибутах\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Каталоги:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories не Ñоздавать каталоги\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories принудительно Ñоздавать каталоги\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories не Ñоздавать каталоги как на узле\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories иÑпользовать Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð° в каталогах\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=ПРЕФИКС ÑохранÑÑ‚ÑŒ файлы в ПРЕФИКС/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ЧИСЛО игнорировать ЧИСЛО компонентов удалённого\n"
+" каталога\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Параметры HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=ПОЛЬЗОВ. уÑтановить http-Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² ПОЛЬЗОВÐТЕЛЬ\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=ПÐРОЛЬ уÑтановить http-пароль в ПÐРОЛЬ\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache отвергать кÑшированные Ñервером данные\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=ИМЯ изменить Ð¸Ð¼Ñ Ñтраницы по умолчанию (обычно\n"
+" Ñто «index.html»)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension ÑохранÑÑ‚ÑŒ документы HTML/CSS Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰Ð¸Ð¼Ð¸\n"
+" раÑширениÑми\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length игнорировать поле заголовка «Content-Length»\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=СТРОКРвÑтавить СТРОКУ между заголовками\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=ТИП тип ÑжатиÑ: auto, gzip или none\n"
+" (по умолчанию: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect макÑимально допуÑтимое чиÑло перенаправлений\n"
+" на Ñтраницу\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=ПОЛЬЗОВ. уÑтановить ПОЛЬЗОВÐТЕЛЯ в качеÑтве имени\n"
+" Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑи\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=ПÐРОЛЬ уÑтановить ПÐРОЛЬ в качеÑтве Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ\n"
+" прокÑи\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL включить в HTTP-Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº «Referer: "
+"URL»\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers ÑохранÑÑ‚ÑŒ HTTP-заголовки в файл\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ÐГЕÐТ идентифицировать ÑÐµÐ±Ñ ÐºÐ°Ðº ÐГЕÐТ вмеÑто\n"
+" Wget/ВЕРСИЯ\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive отключить поддержание активноÑти HTTP\n"
+" (поÑтоÑнные подключениÑ)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies не иÑпользовать кукиÑÑ‹\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=ФÐЙЛ загрузить кукиÑÑ‹ из ФÐЙЛРперед ÑеанÑом\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=ФÐЙЛ Ñохранить кукиÑÑ‹ в ФÐЙЛ поÑле ÑеанÑа\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies загрузить и Ñохранить кукиÑÑ‹ ÑеанÑа\n"
+" (непоÑтоÑнные)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=СТРОКРиÑпользовать метод POST; отправка СТРОКИ в\n"
+" качеÑтве данных\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=ФÐЙЛ иÑпользовать метод POST; отправка "
+"Ñодержимого\n"
+" ФÐЙЛÐ\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod иÑпользовать метод «HTTPMethod» в заголовке\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=СТРОКРотправка СТРОКИ в качеÑтве данных;\n"
+" ДОЛЖЕРбыть указан параметр --method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=ФÐЙЛ отправка Ñодержимого ФÐЙЛÐ;\n"
+" ДОЛЖЕРбыть указан параметр --method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition учитывать заголовок Content-Disposition\n"
+" при выборе имён Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… файлов\n"
+" (ЭКСПЕРИМЕÐТÐЛЬÐЫЙ)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error выводить принÑтые данные при ошибках Ñервера\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge отправлÑÑ‚ÑŒ информацию об аутентификации\n"
+" Basic HTTP не дожидаÑÑÑŒ первого ответа\n"
+" Ñервера\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Параметры HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=ПР выбор протокола безопаÑноÑти: auto, SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 или PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only переходить только по безопаÑным ÑÑылкам "
+"HTTPS\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate не проверÑÑ‚ÑŒ Ñертификат Ñервера\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FILE файл Ñертификата пользователÑ\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=ТИП тип Ñертификата пользователÑ: PEM или DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=ФÐЙЛ файл Ñекретного ключа\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=ТИП тип Ñекретного ключа: PEM или DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=ФÐЙЛ файл Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ CA\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=КÐТ каталог, в котором хранитÑÑ ÑпиÑок CA\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=ФÐЙЛ файл Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ CRL\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=ФÐЙЛ/ХЭШИ Файл Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ ключом (PEM/DER) или любое\n"
+" количеÑтво Ñ…Ñшей sha256 в виде base64,\n"
+" начинающихÑÑ Ñ Â«sha256//» и разделённых "
+"«;»,\n"
+" по которым проверÑетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð½Ñ‹Ð¹ узел\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=ФÐЙЛ файл Ñо Ñлучайными данными Ð´Ð»Ñ SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=ФÐЙЛ файл, определÑющий Ñокет EGD Ñо Ñлучайными "
+"данными\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=СТРОКРназначить Ñтроку приоритета (GnuTLS) или\n"
+" ÑпиÑок шифров (OpenSSL) непоÑредÑтвенным\n"
+" образом. ИÑпользовать оÑторожно. Данный\n"
+" параметр заменÑет значение --secure-"
+"protocol.\n"
+" Формат и ÑинтакÑÐ¸Ñ Ñтроки завиÑит от\n"
+" иÑпользуемой библиотеки SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Параметры HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts отключить HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file путь к базе данных HSTS (заменит значение\n"
+" по умолчанию)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Параметры FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf иÑпользовать формат Stream_LF Ð´Ð»Ñ Ð²Ñех\n"
+" двоичных файлов FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=ПОЛЬЗОВÐТЕЛЬ уÑтановить ftp-Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² ПОЛЬЗОВÐТЕЛЬ\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=ПÐРОЛЬ уÑтановить ftp-пароль в ПÐРОЛЬ\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing не удалÑÑ‚ÑŒ файлы «.listing»\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob выключить маÑки Ð´Ð»Ñ Ð¸Ð¼Ñ‘Ð½ файлов FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp отключить «паÑÑивный» режим передачи\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions ÑохранÑÑ‚ÑŒ права доÑтупа удалённых файлов\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks при рекурÑии загружать файлы по ÑÑылкам\n"
+" (не каталоги)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Параметры FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit безуÑловно иÑпользовать FTPS (порт\n"
+" по умолчанию — 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl возобновлÑÑ‚ÑŒ ÑÐµÐ°Ð½Ñ SSL/TLS, начатый\n"
+" в канале управлениÑ, при открытии\n"
+" канала данных\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection шифровать только канал управлениÑ;\n"
+" данные не шифруютÑÑ\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp вернутьÑÑ Ðº FTP, еÑли FTPS не\n"
+" поддерживаетÑÑ Ñервером\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Параметры WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=ФÐЙЛ запиÑать данные запроÑа/ответа в файл .warc."
+"gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=СТРОКРвÑтавить СТРОКУ в запиÑÑŒ warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ЧИСЛО макÑимальный размер файлов WARC равен "
+"ЧИСЛУ\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx запиÑать индекÑные файлы CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=ФÐЙЛ не ÑохранÑÑ‚ÑŒ запиÑи, перечиÑленные в файле "
+"CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression не Ñжимать файлы WARC Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests не вычиÑлÑÑ‚ÑŒ дайджеÑÑ‚Ñ‹ SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log не ÑохранÑÑ‚ÑŒ файл журнала в запиÑи WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=КÐТÐЛОГ раÑположение Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… файлов,\n"
+" Ñоздаваемых процедурой запиÑи WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "РекурÑÐ¸Ð²Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive включение рекурÑивной загрузки\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=ЧИСЛО глубина рекурÑии (inf и 0 — беÑконечноÑÑ‚ÑŒ)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after удалÑÑ‚ÑŒ локальные файлы поÑле загрузки\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links делать ÑÑылки локальными в загруженном\n"
+" HTML или CSS\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only преобразовывать только файловую чаÑÑ‚ÑŒ URL\n"
+" (базовую чаÑÑ‚ÑŒ имени)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N перед запиÑью файла X, ротировать до N\n"
+" резервных файлов\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted перед преобразованием файла X делать резервную\n"
+" копию в виде X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted перед преобразованием файла X делать резервную\n"
+" копию в виде X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror короткий параметр, Ñквивалентный\n"
+" -N -r -l inf --no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites загрузить вÑе Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ проч., необходимые\n"
+" Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ HTML-Ñтраницы\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments включить Ñтрогую (SGML) обработку комментариев\n"
+" HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "РазрешениÑ/запреты при рекурÑии:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=СПИСОК ÑпиÑок разрешённых раÑширений\n"
+" через запÑтую\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=СПИСОК ÑпиÑок запрещённых раÑширений,\n"
+" разделённых запÑтыми.\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=РЕГВЫР регулÑрное выражение Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÑ‘Ð½Ð½Ñ‹Ñ… URL\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=РЕГВЫР регулÑрное выражение Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰Ñ‘Ð½Ð½Ñ‹Ñ… URL\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=ТИП тип регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=ТИП тип регулÑрного Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=СПИСОК ÑпиÑок разрешённых доменов,\n"
+" через запÑтую\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=СПИСОК ÑпиÑок запрещённых доменов,\n"
+" через запÑтую\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp Ñледовать по ÑÑылкам FTP в HTML-"
+"документах\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=СПИСОК ÑпиÑок иÑпользуемых тегов HTML,\n"
+" через запÑтую\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=СПИСОК ÑпиÑок игнорируемых тегов HTML,\n"
+" через запÑтую\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts заходить на чужие узлы при рекурÑии\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative Ñледовать только по отноÑительным "
+"ÑÑылкам\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=СПИСОК ÑпиÑок разрешённых каталогов\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names иÑпользовать имÑ, указанное в перенаправлÑющем URL,\n"
+" в качеÑтве поÑледнего компонента.\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=СПИСОК ÑпиÑок иÑключаемых каталогов\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent не подниматьÑÑ Ð² родительÑкий каталог\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках, вопроÑÑ‹ и Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»Ñйте на <bug-wget@gnu.org>\n"
+"и/или откройте проблему на https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+"GNU Wget %s, программа Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ файлов из Ñети в автономном режиме.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Пароль: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ðе удалоÑÑŒ Ñоздать канал\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Ошибка инициализации объекта файловых дейÑтвий при spawn Ð´Ð»Ñ use-askpass: "
+"%d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Ошибка Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ñƒ файловых дейÑтвий при spawn Ð´Ð»Ñ use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° команды «%s %s»: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Â«%s%s»: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Пароль Ð´Ð»Ñ Â«%s%s@%s»: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Локаль: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "КомпилÑциÑ: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "СÑылка: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s Ð´Ð»Ñ %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (Ñреда)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (пользователь)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (ÑиÑтема)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ GPLv3+: GNU GPL верÑии 3 или Ñтарше\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Это Ñвободное программное обеÑпечение: его можно Ñвободно изменÑÑ‚ÑŒ\n"
+"и раÑпроÑтранÑÑ‚ÑŒ дальше.\n"
+"Ðичего ÐЕ ГÐРÐÐТИРУЕТСЯ, в пределах, ограниченных законом.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Ðвтор оригинальной верÑии: Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках и вопроÑÑ‹ отправлÑйте на <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Проблема Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Завершение работы из-за ошибки в %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Дополнительные параметры выводÑÑ‚ÑÑ Ð¿Ð¾ команде «%s --help».\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: недопуÑтимый параметр — «-n%c»\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Собрано без поддержки отладки. Флаг --debug игнорируетÑÑ.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Указаны Ñразу --no-clobber и --convert-links, будет иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ --"
+"convert-links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Указаны Ñразу --no-clobber и --convert-file-only, будет иÑпользоватьÑÑ "
+"только --convert-file-only.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ðевозможно одновременно иÑпользовать режимы verbose и quiet.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Ðевозможно одновременно иÑпользовать временные метки и не затирать Ñтарые "
+"файлы.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ðевозможно указать и --inet4-only, и --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ одновременно -k или --convert-file-only и -O, еÑли указано\n"
+"неÑколько URL, или в комбинации Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ -p или -r.\n"
+"ПодробноÑти Ñм. в документации.\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: комбинирование параметра -O Ñ -r или -p означает, что веÑÑŒ\n"
+"загруженные данные будут помещены в один файл.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: работа Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ времени не выполнÑетÑÑ, еÑли указан\n"
+"параметр -O. ПодробноÑти Ñмотрите в руководÑтве.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Вывод WARC не работает Ñ --no-clobber, параметр --no-clobber будет "
+"отключён.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Вывод WARC не работает Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ времени, метки времени будут отключены.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Вывод WARC не работает Ñ --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Вывод WARC не работает Ñ --continue или --start-pos; они будут отключены.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"ДайджеÑÑ‚ отключён; Ð´ÐµÐ´ÑƒÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ WARC не будет находить повторÑющиеÑÑ "
+"запиÑи.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Сжатие не работает Ñ --continue или --start-pos; они будут отключены.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ðевозможно указать Ñразу --ask-password и --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Ðе рекомендуетÑÑ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --start-pos и --continue одновременно; --continue "
+"будет отключён.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: отÑутÑтвует URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --post-data и --post-file одновременно.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --post-data или --post-file вмеÑте Ñ --method. Параметр "
+"--method предполагает данные в параметрах --body-data и --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Чтобы иÑпользовать --body-data или --body-file вы должны указать "
+"иÑпользуемый метод через параметр --method=HTTPMethod.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --body-data и --body-file одновременно.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Эта верÑÐ¸Ñ Ð½Ðµ поддерживает IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"Параметр -k или -r может иÑпользовать только вмеÑте Ñ -O, еÑли вывод "
+"производитÑÑ Ð² обычный файл.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"Параметр --convert-links или --convert-file-only может иÑпользовать вмеÑте "
+"только, еÑли вывод производитÑÑ Ð² обычный файл.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Сбой при инициализации libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Сбой при инициализации канала c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Ðе удалоÑÑŒ разобрать IP-Ð°Ð´Ñ€ÐµÑ Â«%s»\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Ðе удалоÑÑŒ назначить DNS-Ñервер(Ñ‹) «%s» (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Ðе найдены URL-Ñ‹ в файле %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ðе удалоÑÑŒ обработать файл metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ðевозможно Ñкачать вÑе реÑурÑÑ‹ Ñ %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ЗÐВЕРШЕÐО --%s--\n"
+"Общее времÑ: %s\n"
+"Загружено: %d файлов, %s за %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "ПРЕВЫШЕÐО ограничение на загрузку (%s)!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "Параметр -O не поддерживаетÑÑ Ð¿Ñ€Ð¸ Ñкачивании metalink. ИгнорируетÑÑ.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Планируемый файл metalink: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "БезопаÑный файл metalink: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Отбраковываем файл metalink. ÐебезопаÑное имÑ.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Обработка metaurl %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Отбраковываем файл metaurl %s. ÐебезопаÑное имÑ.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Ошибка ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ %s. ПропуÑкаем metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ðе удалоÑÑŒ обработать файл metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Обработка мetaurl-лов вернула ошибку.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Тип реÑурÑа %s не поддерживаетÑÑ, игнорируетÑÑ…\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Ðевозможно открыть Ñкачанный файл.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "ВычиÑлÑетÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€ %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Ðе объÑвлен размер файла. Проверка пропуÑкаетÑÑ.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Ðевозможно получить размер Ñкачанного файла.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Размер файла %s не Ñовпадает.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Размер Ñовпадает.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "ВычиÑлÑетÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма Ñовпадает.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма файла %s не Ñовпадает.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Ðевозможно открыть Ñкачанный файл Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подпиÑи.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "ПодпиÑÑŒ верна.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "ПодпиÑÑŒ недейÑтвительна. ОтбраÑываем иÑточник.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Данные подпиÑаны корректно, но к подпиÑи нет довериÑ.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Контрольные Ñуммы не найдены.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Ошибка ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ %s. РеÑÑƒÑ€Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкаетÑÑ.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Получен файл %s, но размер не Ñовпадает. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Файл %s получен, но ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма не Ñовпадает. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Файл %s получен, но подпиÑÑŒ не Ñовпадает. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Переименование %s в %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Работа продолжаетÑÑ Ð² фоновом режиме.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Работа продолжаетÑÑ Ð² фоновом режиме, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Выходные данные будут запиÑаны в %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "ошибка в fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "ошибка в fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ðевозможно найти подходÑщий драйвер Ñокета.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "Ошибка в ioctl(). Ðе удалоÑÑŒ уÑтановить блокировку на Ñокет.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: предупреждение: перед именем каждой машины вÑтречаетÑÑ Ð¼Ð°Ñ€ÐºÐµÑ€ %s\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: неизвеÑтный маркер «%s»\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "ИÑпользование: %s NETRC [ИМЯ_УЗЛÐ]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: невозможно выполнить stat Ð´Ð»Ñ %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "ПРЕДУПРЕЖДЕÐИЕ: иÑпользуетÑÑ Ñлабый иÑточник Ñлучайных данных.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Ðевозможно породить PRNG; подразумеваетÑÑ Ð¸Ñпользование параметра --random-"
+"file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+"ВерÑÐ¸Ñ Ð²Ð°ÑˆÐµÐ¹ библиотеки OpenSSL Ñлишком ÑтараÑ, чтобы поддерживать TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "ВерÑÐ¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ OpenSSL Ñлишком ÑÑ‚Ð°Ñ€Ð°Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "ВерÑÐ¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ OpenSSL Ñлишком ÑÑ‚Ð°Ñ€Ð°Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: значение %d параметра «secure-protocol» не реализовано\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: некорректный ÑпиÑок шифров: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Ðе удалоÑÑŒ уÑтановить доверие к чаÑти цепочки\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Ðе удалоÑÑŒ выделить параметр проверки\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: невозможно заÑеить PRNG; раÑÑматриваетÑÑ Ð¸Ñпользование "
+"параметра --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: невозможно проверить Ñертификат %s, выпущенный %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Ðевозможно локально проверить подлинноÑÑ‚ÑŒ запрашивающего.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Обнаружен ÑамоÑтоÑтельно подпиÑанный Ñертификат.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Запрошенный Ñертификат ещё недейÑтвителен.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Ð”Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð¾Ð³Ð¾ Ñертификата иÑтёк Ñрок дейÑтвиÑ.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: альтернативное Ð¸Ð¼Ñ Ñубъекта Ñертификата не Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+"запрошенного узла %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: Общее название Ñертификата %s не Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ запрошенного "
+"узла %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: общее название Ñертификата некорректно (Ñодержит Ñимвол NUL).\n"
+" Это может указывать на то, что узел не тот, за кого ÑÐµÐ±Ñ Ð²Ñ‹Ð´Ð°Ñ‘Ñ‚\n"
+" (то еÑÑ‚ÑŒ не наÑтоÑщий %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Ð”Ð»Ñ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñного Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº %s иÑпользуйте параметр «--no-check-"
+"certificate».\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ пропуÑкаетÑÑ %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ dot-ÑÑ‚Ð¸Ð»Ñ Â«%s»; оÑтавлен без изменениÑ.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " оÑÑ‚ %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " за "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ðе удаётÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ REALTIME-чаÑтоту чаÑов: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "УдалÑетÑÑ %s, Ñ‚. к. он должен быть иÑключён.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ðе удалоÑÑŒ открыть %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "ЗагружаетÑÑ robots.txt; не обращайте внимание на ошибки.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Ошибка разбора URL прокÑи %s: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Ошибка в URL прокÑи %s: Должен быть HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Превышено чиÑло перенаправлений %d.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Завершение.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Повтор.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Битые ÑÑылки не найдены.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Ðайдена %d Ð±Ð¸Ñ‚Ð°Ñ ÑÑылка.\n"
+"\n"
+msgstr[1] ""
+"Ðайдено %d битых ÑÑылки.\n"
+"\n"
+msgstr[2] ""
+"Ðайдено %d битых ÑÑылок.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ðет ошибок"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "ОтÑутÑтвует Ñхема"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ñервера"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ðеверный номер порта"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Ðезавершённые чиÑловые адреÑа IPv6"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "ÐдреÑа IPv6 не поддерживаютÑÑ"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "ÐедопуÑтимый чиÑловой Ð°Ð´Ñ€ÐµÑ IPv6"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Программа Ñкомпилирована без поддержки HTTPS"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Обнаружена Ð½ÐµÐ¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·ÑƒÐµÐ¼Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð±Ð°Ð¹Ñ‚Ð¾Ð²Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Ðе удалоÑÑŒ выделить доÑтаточно памÑти; нехватка памÑти.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: не удалоÑÑŒ выделить %ld байт; недоÑтаточно памÑти.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: текÑтовый буфер Ñлишком велик (%d байт), оÑтанов.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Работа продолжаетÑÑ Ð² фоновом режиме, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ðе удалоÑÑŒ разорвать Ñимвольную ÑÑылку %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Ошибка при выполнении Fopen Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Ошибка при получении FD Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Ошибка при выполнении stat Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s (проверьте права доÑтупа)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"С момента поÑледней проверки файл %s изменилÑÑ. Ошибка при проверке "
+"безопаÑноÑти.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Ошибка при открытии файла %s, причина: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Ошибка при выполнении stat Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s, ошибка: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"ВыполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %s, так как он изменилÑÑ Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° "
+"поÑледней проверки. Ошибка при проверке безопаÑноÑти.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "ÐедопуÑтимое регулÑрное выражение %s, ошибка PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "ÐедопуÑтимое регулÑрное выражение %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Ошибка при Ñравнении %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "ПропуÑкаетÑÑ ÐºÐ»ÑŽÑ‡ Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ размером (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Ошибка при Ñмещении в файле WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Ошибка при запиÑи файла WARC на диÑк.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð° файлового деÑкриптора файла WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ° GZIP в файл WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Ошибка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи warcinfo в файл WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"ОткрываетÑÑ Ñ„Ð°Ð¹Ð» WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Файл CDX не Ñодержит оригинальных url (отÑутÑтвует Ñтолбец «a»).\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Файл CDX не Ñодержит контрольных Ñумм (отÑутÑтвует Ñтолбец «k»).\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"Файл CDX не Ñодержит идентификаторов запиÑей (отÑутÑтвует Ñтолбец «u»).\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Загружена %d запиÑÑŒ из CDX.\n"
+"\n"
+msgstr[1] ""
+"Загружено %d запиÑи из CDX.\n"
+"\n"
+msgstr[2] ""
+"Загружено %d запиÑей из CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Ðевозможно прочитать файл CDX %s Ð´Ð»Ñ Ð´ÐµÐ´ÑƒÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Ðевозможно открыть временный файл манифеÑта WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Ðевозможно открыть временный файл журнала WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Ðевозможно открыть файл WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Ðевозможно открыть файл CDX Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи результата.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Ðевозможно открыть временный файл WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Ðайдено единÑтвенное Ñовпадение в файле CDX. СохранÑем переÑмотренную запиÑÑŒ "
+"в WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "СемейÑтво адреÑов не поддерживаетÑÑ Ð´Ð»Ñ Ñтого имени узла"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Ðеверное значение Ð´Ð»Ñ ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "ÐевоÑÑтановимый Ñбой Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family не поддерживаетÑÑ"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "С данным именем узла не аÑÑоциирован адреÑ"
+
+#~ msgid "Name or service not known"
+#~ msgstr "ÐеизвеÑтное Ð¸Ð¼Ñ Ð¸Ð»Ð¸ ÑервиÑ"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname не поддерживаетÑÑ Ð´Ð»Ñ ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype не поддерживаетÑÑ"
+
+#~ msgid "System error"
+#~ msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Буфер аргументов Ñлишком мал"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Идёт обработка запроÑа"
+
+#~ msgid "Request canceled"
+#~ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‘Ð½"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ отменён"
+
+#~ msgid "All requests done"
+#~ msgstr "Ð’Ñе запроÑÑ‹ завершены"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Прервано по Ñигналу"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Ðеправильно закодирована Ñтрока параметров"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: двуÑмыÑленный параметр «%s%s»\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: двуÑмыÑленный параметр «%s%s»; возможные варианты:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: нераÑпознанный параметр «%s%s»\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s%s» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать аргумент\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s%s» требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: недопуÑтимый параметр — «%c»\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ — «%c»\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "Success"
+#~ msgstr "Выполнено уÑпешно"
+
+#~ msgid "No match"
+#~ msgstr "Ðет ÑоответÑтвиÑ"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Ðеправильное регулÑрное выражение"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ðеправильный Ñимвол ÑравнениÑ"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ðеправильное Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа Ñимволов"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "ÐžÐ±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÐºÐ¾ÑÐ°Ñ Ñ‡ÐµÑ€Ñ‚Ð° в конце"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑÑылка"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ [, [^, [:, [. или [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ ( или \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "ÐедопуÑтимое Ñодержимое в \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "ÐедопуÑтимое окончание диапазона"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "ЗакончилаÑÑŒ памÑÑ‚ÑŒ"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "ÐедопуÑтимое предшеÑтвующее регулÑрное выражение"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Преждевременное завершение регулÑрного выражениÑ"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "РегулÑрное выражение Ñлишком велико"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "ÐÐµÐ¿Ð°Ñ€Ð½Ð°Ñ ) или \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ðет предшеÑтвующего регулÑрного выражениÑ"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "не удалоÑÑŒ Ñоздать канал"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "подпроцеÑÑ %s завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle завершилаÑÑŒ неудачно"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "не удалоÑÑŒ воÑÑтановить fd %d: dup2 завершилаÑÑŒ неудачно"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "подпроцеÑÑ %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "подпроцеÑÑ %s получил Ñигнал Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "недоÑтаточно памÑти"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках, вопроÑÑ‹ и Ð¿Ð¾Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»Ñйте на <bug-wget@gnu."
+#~ "org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «--%s» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать аргумент\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: нераÑпознанный параметр «--%s»\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: параметр «-W %s» неоднозначен\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «-W %s» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать аргумент\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «%s» требуетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Файл «%s» уже ÑущеÑтвует; не загружаетÑÑ.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ UTF-8: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "ошибка idn_decode (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Получен Ñигнал %s.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Сбой авторизации.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "ПРЕДУПРЕЖДЕÐИЕ: Ðевозможно переоткрыть Ñтандартный вывод в двоичном "
+#~ "режиме;\n"
+#~ " загружаемый файл может Ñодержать некорректные концы Ñтрок.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: недопуÑтимый параметр -- %c\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL добавление URL в начало отноÑительных ÑÑылок "
+#~ "в файле -F -i.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Текущий Ñопровождающий: Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid ""
+#~ "Cannot specify -N if -O is given. See the manual for details.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "ÐÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ параметр -N, еÑли указан -O.\n"
+#~ "ПодробноÑти Ñм. в документации.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Ошибка в Set-Cookie, поле `%s'"
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: Ðеверное раÑширенное логичеÑкое выражение `%s';\n"
+#~ "иÑпользуйте `on', `off', `always' или `never'.\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy Ñвно включить прокÑи.\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Эта программа раÑпроÑтранÑетÑÑ Ð² надежде, что она будет полезна,\n"
+#~ "но БЕЗ ВСЯКОЙ ГÐРÐÐТИИ; даже без подразумеваемой гарантии\n"
+#~ "РÐБОТОСПОСОБÐОСТИ или ПРИГОДÐОСТИ ДЛЯ КÐКОЙ-ЛИБО ЦЕЛИ. За более\n"
+#~ "подробной информацией обращайтеÑÑŒ к GNU General Public License.\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s: Ошибка проверки Ñертификата Ð´Ð»Ñ %s: %s\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - Соединение закрыто, Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %s/%s. "
diff --git a/po/sk.gmo b/po/sk.gmo
new file mode 100644
index 0000000..fd1a7de
--- /dev/null
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..a484582
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,3660 @@
+# Slovak translations for GNU wget
+# Copyright (C) 1999, 2002, 2003, 2005, 2007, 2008, 2009, 2010, 2012, 2013, 2015, 2016, 2017, 2018, 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Miroslav Vasko <vasko@debian.cz>, 1999.
+# Marcel Telka <marcel@telka.sk>, 2002, 2003, 2005, 2007, 2008, 2009, 2010, 2012, 2013, 2015, 2016, 2017, 2018, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 09:43+0200\n"
+"Last-Translator: Marcel Telka <marcel@telka.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"Language: sk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural= (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: nepodarilo sa previesť adresu zviazania %s; deaktivujem zviazanie.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Pripájanie k %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Pripájanie k %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Pripájanie k [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "zlyhalo setsockopt SO_RCVBUF: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "pripojené.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "zlyhalo: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: nepodarilo sa previesť adresu hostiteľa %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "zlyhalo setsockopt SO_REUSEADDR: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Príliš veľa otvorených fd. Nie je možné použiť select na fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Skonvertované odkazy v %d súboroch za %s sekúnd.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Konvertovanie odkazov v %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "niet Äo robiÅ¥.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Nie je možné previesť odkazy v %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Nepodarilo sa zmazať %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Nie je možné zálohovať %s ako %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Nepodarilo sa získaÅ¥ koláÄik pre %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Chyba syntaxe v Set-Cookie: %s na pozícii %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "KoláÄiky prichádzajúce z %s sa pokúsili nastaviÅ¥ doménu na "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Nie je možné otvoriÅ¥ súbor s koláÄikmi %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Chyba pri zápise do %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Chyba pri zatváraní %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Nepodporovaný typ výpisu, skúša sa unixový parser.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Obsah /%s na %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Äas neznámy "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Súbor "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Adresár "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Sym. odkaz "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Nie je isté"
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtov)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Dĺžka: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", ostáva %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", ostáva %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (nie je smerodajné)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Nepodarilo sa inicializovať SSL. Bude deaktivované.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Prihlasovanie ako %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Server odpovedal chybne, riadiace spojenie sa uzatvára.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Úvodná odpoveÄ servera je chybná.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Zápis dát zlyhal, riadiace spojenie sa uzatvára.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Server odmieta prihlásenie.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Chyba pri prihlásení.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Prihlásený!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Server neakceptoval príkaz 'PBSZ 0'.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Server neakceptoval príkaz 'PROT %c'.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Chyba servera, nie je možné zistiť typ systému.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "hotovo. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "hotovo.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Neznámy typ `%c', riadiace spojenie sa uzatvára.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "hotovo."
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD nie je potrebné.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Dosiahnutá logicky nemožná ÄasÅ¥ v getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Adresár %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD nie je potrebné.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Súbor už bol prenesený.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Nie je možné iniciovať prenos príkazom PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Nie je možné analyzovaÅ¥ odpoveÄ na PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "nepodarilo sa pripojiť k %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Chyba pri operácii \"bind\" (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Neplatný PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST zlyhal, zaÄína sa odznova.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Súbor %s existuje.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Súbor %s neexistuje.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Súbor %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Súbor alebo adresár %s neexistuje.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s bol odpružený do existencie.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, riadiace spojenie sa uzatvára.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Dátové spojenie: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Riadiace spojenie uzatvorené.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Prenos dát bol predÄasne ukonÄený.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Súbor %s je už tam, nebude sa prenášať.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(pokus:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapísané na štandardný výstup %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s uložený [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Odstraňuje sa %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "PoužiÅ¥ %s ako doÄasný súbor zoznamu.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Odstránené %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Hĺbka rekurzie %d prekroÄila maximálnu hĺbku %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Vzdialený súbor nie je novší ako miestny súbor %s -- neprenáša sa.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Vzdialený súbor je novší ako miestny súbor %s -- prenáša sa.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Veľkosti se nezhodujú (miestny %s) -- prenáša sa.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Neplatný názov symoblického odkazu, preskakuje sa.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Korektný symbolický odkaz %s -> %s už existuje.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Vytvára sa symbolický odkaz %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Symbolické odkazy nie sú podporované, preskakuje sa symbolický odkaz %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Preskakuje sa adresár %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: neznámy/nepodporovaný typ súboru.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Nastavenie prístupových práv pre %s zlyhalo.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: Äasové znaÄka súboru je poruÅ¡ená.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Nebudú sa prenášať adresáre, pretože hĺbka je %d (maximum je %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Nezostupuje sa do %s, pretože je vylúÄený/nezaÄlenený.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Odmieta sa %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Odmieta sa %s (neplatná položka).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s je vylúÄený/nezaÄlenený pomocou regulárneho výrazu.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Chyba pri hľadaní zhody %s s %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Vzoru %s niÄ nezodpovedá.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Výpis adresára v HTML formáte bol zapísaný do %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Výpis adresára v HTML formáte bol zapísaný do %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "CHYBA: Nie je možné otvoriť adresár %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "CHYBA: Otvorenie certifikátu %s zlyhalo: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "NaÄítaný CA certifikát '%s'\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "CHYBA: NaÄítanie CRL súboru '%s' zlyhalo: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "NaÄítaný CRL súbor '%s'\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "CHYBA: GnuTLS vyžaduje, aby kÄ¾ÃºÄ a certifikát boli rovnakého typu.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Vaša verzia GnuTLS je príliš stará, aby podporovala TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: neimplementovaná hodnota %u voľby 'secure-protocol'\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Oznámte, prosím, tento problém na bug-wget@gnu.org (iba anglicky)\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: neimplementovaná hodnota %d voľby 'secure-protocol'\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: Nie je možné priamo nastaviť reťazec prio. Použije sa predvolená "
+"priorita.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "CHYBA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "UPOZORNENIE"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s neprezentoval certifikát.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Certifikát %s nie je dôveryhodný.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certifikát %s nemá známeho vydavateľa.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Certifikát %s bol zrušený.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Ten, kto podpísal certifikát %s, nebol CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: Certifikát %s bol podpísaný pomocou algoritmu, ktorý nie je bezpeÄný.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certifikát %s ešte nie je aktivovaný.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certifikátu %s vypršala platnosť.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Chyba pri inicializácii certifikátu X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Certifikát nenájdený\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Chyba pri analýze certifikátu: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certifikát ešte nebol aktivovaný\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certifikátu vypršala platnosť\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Majiteľ certifikátu sa nezhoduje s názvom hostiteľa %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Verejný kÄ¾ÃºÄ sa nezhoduje so zadaným verejným kľúÄom!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certifikát musí byť X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Chyba pri spracovaní zoznamu adries.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Neznámy hostiteľ"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "DoÄasné zlyhanie pri prevode názvu"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Neznáma chyba"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Prevádza sa %s na IP adresu... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "zlyhalo: Hostiteľ nemá IPv4/IPv6 adresy.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "zlyhalo: Äasový limit vyprÅ¡al.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Nie je možné rozložiť neúplný odkaz %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"Bol nájdený príznak no-follow v %s. Nebudú nasledované žiadne odkazy na "
+"tejto stránke\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Neplatné URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Požiadavku HTTP nebolo možné odoslať: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Bez hlaviÄiek, predpokladá sa HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Súbor %s je už tam, nebude sa prenášať.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime zlyhalo. Toto je pravdepodobne programátorská chyba.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Nemožno previesÅ¥ Äasovú znaÄku do formátu http. Použije sa Äas 0 ako Äas "
+"poslednej zmeny.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Chýba BODY dátový súbor %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Použije sa existujúce spojenie s [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Použije sa existujúce spojenie s %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Zlyhalo Äítanie odpovede z proxy: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s CHYBA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "OdpoveÄ servera má skomolený stavový riadok"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tunelovanie proxy zlyhalo: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Neznámy spôsob autentifikácie.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Vybraná autentifikácia: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Ukladá sa do: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Pri sťahovaní podpisu:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Nie je možné preÄítaÅ¥ obsah podpisu z doÄasného súboru. Preskakuje sa.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Nepodarilo sa vytvoriÅ¥ doÄasný súbor. Preskakuje sa sÅ¥ahovanie podpisu.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Neplatná hodnota pri. Predpoklá sa %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr "Nepodarilo sa nájsÅ¥ prijateľný kontrolný súÄet pre zdroje Metalink.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Deaktivuje sa SSL z dôvodu výskytu chýb.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s požiadavka odoslaná, Äakám na odpoveÄ... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Neboli prijaté žiadne dáta.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Chyba (%s) pri Äítaní hlaviÄiek.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(bez popisu)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Presmerované na: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "neudané"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [nasledované]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Súbor %s nezmenený na serveri. Sťahovanie vynechané.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Server ignoroval hlaviÄku If-Modified-Since pre súbor %s.\n"
+"Mohli by ste chcieť pridať voľbu --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Tento súbor je už kompletne prenesený; netreba niÄ robiÅ¥.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Dĺžka: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorované"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Upozornenie: HTTP nepodporuje žolíkové znaky.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Povolený režim pavúka. Skontrolujte, Äi vzdialený súbor existuje.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Nie je možné zapísať do %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Prijatá hlaviÄka neobsahuje povinný príznak.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Zlyhalo overenie používateľa/hesla.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Nie je možné zapísať do súboru WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Nie je možné zapísaÅ¥ do doÄasného súboru WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Nepodarilo sa nadviazať SSL spojenie.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Nie je možné odstrániť %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "CHYBA: Presmerovanie (%d) bez udanej novej adresy.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Nepodarilo sa v HTTP odpovedi nájsť dáta Metalink. Súbor sa sťahuje pomocou "
+"HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Nájdené hlaviÄky Metalink. Prepnutie do režimu Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Vzdialený súbor neexistuje -- poškodený odkaz!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "HlaviÄka Last-modified chýba -- nebudú sa používaÅ¥ Äasové znaÄky.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "HlaviÄka Last-modified je neplatná -- Äasové znaÄky ignorované.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Súbor na serveri nie je novší ako miestny súbor %s -- neprenáša sa.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Veľkosti se nezhodujú (miestny %s) -- prenáša sa.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Vzdialený súbor je novší, prenáša sa.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Vzdialený súbor existuje a mohol by obsahovať odkazy na iné zdroje -- "
+"prenáša sa.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Vzdialený súbor, ale neobsahuje žiadne odkazy -- neprenáša sa.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Vzdialený súbor existuje a mohol by obsahovaÅ¥ ÄalÅ¡ie odkazy,\n"
+"ale rekurzia nie je povolená -- neprenáša sa.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Vzdialený súbor existuje.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapísané na štandardný výstup %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s uložené [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Spojenie uzatvorené na bajte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Chyba pri Äítaní na bajte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Chyba pri Äítaní na bajte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Nepodporovaná kvalita ochrany '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nepodporovaný algoritmus '%s'.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC ukazuje na %s, ktorý je nedostupný kvôli chybe: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Nie je možné preÄítaÅ¥ %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Chyba v %s na riadku %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Chyba syntaxe v %s na riadku %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Neznámy príkaz %s v %s na riadku %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analýza systémového wgetrc súboru (premenná SYSTEM_WGETRC) zlyhala.\n"
+"Prosím, skontrolujte '%s',\n"
+"alebo zadajte iný súbor pomocou --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Analýza systémového wgetrc súboru zlyhala. Prosím, skontrolujte\n"
+"'%s',\n"
+"alebo zadajte iný súbor pomocou --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Upozornenie: Systémový aj používateľov súbor wgetrc úkazujú na %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Neplatný príkaz --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Neplatná logická hodnota %s; použite `on' alebo `off'.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Neplatné %s; použite `on', `off' alebo `quiet'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Neplatné Äíslo %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s musí byť použité len raz\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Neplatná hodnota bajtu %s.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Neplatný Äasový interval %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Záporný Äasový interval %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass vyžaduje reťazec alebo nastavenú premennú prostredia "
+"WGET_ASKPASS alebo SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Neplatná hodnota %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Neplatná hlaviÄka %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Neplatná WARC hlaviÄka %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Neplatný typ postupu %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Neplatné obmedzenie %s,\n"
+" použite [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kódovanie %s nie je platné\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konverzia z %s na %s nie je podporovaná\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Vyskytla sa nekompletná alebo neplatná viacbajtová postupnosť\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Nespracované errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: národné prostredie je nenastavené\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode zlyhalo (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Zlyhala konverzia na malé: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Výstup sa presmerováva do %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; protokolovaniei sa vypína.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Použitie: %s [VOĽBA]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Parametre povinné pri dlhých voľbách sú povinné aj pre skrátené voľby.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Spustenie:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version zobraziÅ¥ verziu programu Wget a skonÄiÅ¥\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help vytlaÄiÅ¥ túto pomoc\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background prejsť do pozadia po spustení\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=PRÃKAZ vykonaÅ¥ príkaz Å¡týlu .wgetrc\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Zaznamenávanie a vstupný súbor:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=SÚBOR zaznamenať správy do SÚBORu\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=SÚBOR pridať správy do SÚBORu\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug vytlaÄiÅ¥ množstvo ladiacich informácií\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug vytlaÄiÅ¥ ladiaci výstup Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet potichu (bez výstupu)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose byÅ¥ rozvláÄny (toto je Å¡tandard)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose vypnúť rozvláÄnosÅ¥ bez toho, aby bolo "
+"ticho\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYP vypisovať šírku pásma ako TYP. TYP môže "
+"byť `bits'\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=SÚBOR stiahnuť URL, ktoré sa nachádzajú v "
+"miestnom\n"
+" alebo externom SÚBORe\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=SÚBOR stiahnuť súbory zahrnuté v miestnom "
+"Metalink SÚBORe\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html spracovať vstupný súbor ako HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL prevedie HTML odkazy vstupného súboru (-i "
+"-F)\n"
+" relatívne k URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=SÚBOR urÄiÅ¥, ktorý konfiguraÄný súbor použiÅ¥\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config nenaÄítaÅ¥ žiaden konfiguraÄný súbor\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=SÚBOR zaznamenať dôvody pre odmietnutie URL do "
+"SÚBORu\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "SÅ¥ahovanie:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ÄŒÃSLO nastaviÅ¥ poÄet opakovaní na ÄŒÃSLO (0 "
+"neobmedzene)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused pokúsiÅ¥ sa znova, aj keÄ bolo spojenie "
+"odmietnuté\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=CHYBY Äiarkou oddelený zoznam HTTP chýb, "
+"pri ktorých\n"
+" skúsiť znova\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=SÚBOR zapísať dokumenty do SÚBORu\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber preskoÄiÅ¥ sÅ¥ahovania, ktoré by sÅ¥ahovali\n"
+" do existujúcich súborov (prepísali "
+"ich)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc nepokúšať sa získať prihlasovacie údaje "
+"z .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue obnoviÅ¥ získavanie ÄiastoÄne stiahnutého "
+"súboru\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=POSUV zaÄaÅ¥ sÅ¥ahovanie od pozície POSUV (zaÄína "
+"nulou)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYP zvoliť typ zobrazenia postupu\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress zobraziť lištu postupu v každom režime "
+"rozvláÄnosti\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping nesťahovať opäť súbory, pokiaľ nie sú "
+"novšie\n"
+" ako miestne\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since nepoužívať požiadavky sťahovania s "
+"podmienkou\n"
+" if-modified-since v režime oznaÄovania\n"
+" Äasovými znaÄkami\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps nenastavovaÅ¥ Äasové znaÄky miestnych "
+"súborov\n"
+" podľa toho ako sú na serveri\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response vytlaÄiÅ¥ odpoveÄ servera\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider nesÅ¥ahovaÅ¥ niÄ\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDY nastaviÅ¥ vÅ¡etky hodnoty Äasových limitov "
+"na SEKUNDY\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESY zoznam DNS serverov, na ktoré posielať "
+"požiadavky (oddelené Äiarkou)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESA zviazať DNS resolver s ADRESOU (názov "
+"hostiteľa alebo IP) na miestnom hostiteľovi\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNDY nastaviÅ¥ Äasový limit DNS vyhľadávania na "
+"SEKUNDY\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEKUNDY nastaviÅ¥ Äasový limit spojenia na "
+"SEKUNDY\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SEKUNDY nastaviÅ¥ Äasový limit Äítania na SEKUNDY\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNDY poÄkaÅ¥ SEKUNDY medzi sÅ¥ahovaniami\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKÚND poÄkaÅ¥ 1..SEKÚND medzi pokusmi o "
+"sťahovanie\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait poÄkaÅ¥ od 0,5 × POÄŒKAŤ ... 1,5 × POÄŒKAŤ "
+"sekúnd medzi\n"
+" sťahovaniami\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy explicitne vypnúť proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ÄŒÃSLO nastaviÅ¥ limit sÅ¥ahovania na ÄŒÃSLO\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESA zviazať s ADRESOU (názov hostiteľa alebo "
+"IP) na miestnom hostiteľovi\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=RÃCHLOSŤ obmedziÅ¥ rýchlosÅ¥ sÅ¥ahovania na RÃCHLOSŤ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache zakázaÅ¥ doÄasné ukladanie DNS "
+"vyhľadávania\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS obmedziť znaky v názvoch súborov na tie, "
+"ktoré povoľuje OS\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignorovať veľkosť písmen pri porovnávaní "
+"súborov/adresárov\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only pripájať sa len na adresy IPv4\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only pripájať sa len na adresy IPv6\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=RODINA pripájať sa najskôr k adresám zadanej "
+"rodiny,\n"
+" jedno z IPv6, IPv4 alebo none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=POUŽÃVATEĽ nastaviÅ¥ ftp a http používateľov na "
+"POUŽÃVATEĽ\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=HESLO nastaviť ftp a http heslo na HESLO\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password pýtať sa na heslá\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=PRÃKAZ urÄuje poverujúci obslužný program na "
+"vyžiadanie \n"
+" mena používateľa a hesla. Ak nie je "
+"PRÃKAZ \n"
+" uvedený, použije sa premenná "
+"prostredia \n"
+" WGET_ASKPASS alebo SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri vypnúť podporu IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KÓD použiť KÓD ako miestne kódovanie pre IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KÓD použiť KÓD ako predvolené vzdialené "
+"kódovanie\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink odstrániÅ¥ súbor pred Äistením\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash ponechať súbory s nesúhlasiacim "
+"kontrolným súÄtom (pridaÅ¥ .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=ÄŒÃSLO Poradové ÄŒÃSLO metaurl Metalink "
+"application/metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http použiÅ¥ metadáta Metalink z hlaviÄiek "
+"odpovede HTTP\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location uprednostňované umiestnenie pre zdroje "
+"Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr zapnúť ukladanie metaúdajov v rozšírených "
+"príznakoch súborov\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Adresáre:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories nevytvárať adresáre\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories vynútiť vytváranie adresárov\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories nevytvárať adresáre hostiteľa\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories použiť názov protokolu v adresároch\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREDP uložiť súbory do PREDP/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cur-dirs=POÄŒET ignorovaÅ¥ POÄŒET vzdialených Äastí názvu "
+"adresára\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP voľby:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=POUŽÃVATEĽ nastaviÅ¥ http používateľa na POUŽÃVATEĽ\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=HESLO nastaviť http heslo na HESLO\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache nepovoliÅ¥ doÄasne uložené dáta na "
+"serveri\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NÃZOV zmeniÅ¥ názov predvolenej stránky "
+"(Å¡tandardne\n"
+" je to `index.html'.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --html-extension uložiť HTML/CSS dokumenty so správnou "
+"príponou\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignorovať pole 'Content-Length' v "
+"hlaviÄke\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=REŤAZEC vložiÅ¥ REŤAZEC do hlaviÄky\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYP vybrať kompresiu spomedzi auto, gzip "
+"alebo none. (predvolené: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximum povolených presmerovaní na "
+"stránku\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=POUŽÃVATEĽ nastaviÅ¥ POUŽÃVATEĽa ako používateľa "
+"proxy\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=HESLO nastaviť HESLO ako heslo proxy\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL zahrnúť hlaviÄku 'Referer: URL' do HTTP "
+"požiadavky\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers uložiÅ¥ HTTP hlaviÄky do súboru\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifikovať sa ako AGENT namiesto Wget/"
+"VERZIA\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive zakázať HTTP keep-alive (trvalé "
+"spojenia)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies nepoužívaÅ¥ koláÄiky\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=SÚBOR pre sedením naÄítaÅ¥ koláÄiky zo SÚBORu\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=SÚBOR po sedení uložiÅ¥ koláÄiky do SÚBORu\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies naÄítaÅ¥ a uložiÅ¥ koláÄiky sedenia (nie "
+"trvalé)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=REŤAZEC použiť POST metódu; poslať REŤAZEC ako "
+"dáta\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=SÚBOR použiť POST metódu; poslať obsah SÚBORu\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPmetóda použiť metódu \"HTTPmetóda\" v "
+"požiadavke\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=REŤAZEC poslať REŤAZEC ako dáta. --method MUSà "
+"byť nastavené\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=SÚBOR poslať obsah SÚBORu. --method MUSà byť "
+"nastavené\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition dodržaÅ¥ hlaviÄku Content-Disposition pri\n"
+" voľbe miestnych názvov súborov\n"
+" (EXPERIMENTÃLNE)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error vypisovať prijatý obsah pri chybách "
+"servera\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge poslať informáciu o základnom overení "
+"totožnosti\n"
+" HTTP bez poÄiatoÄného Äakania na výzvu "
+"servera\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Voľby HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR vybraÅ¥ bezpeÄný protokol, jeden z auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 alebo "
+"PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --htttps-only nasledovaÅ¥ len bezpeÄné HTTPS odkazy\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate neoverovať certifikát servera\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=SÚBOR súbor certifikátu klienta\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYP typ certifikátu klienta, PEM alebo DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=SÚBOR súbor súkromného kľúÄa\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYP typ súkromného kľúÄa, PEM alebo DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=SÚBOR súbor s balíkom CA\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=ADR adresár, kde je uložený hašovaný zoznam "
+"CA\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=SÚBOR súbor s balíkom CRL\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=SÚBOR/HAÅ E Súbor verejného kľúÄa (PEM/DER), alebo "
+"ľubovoľný poÄet\n"
+" sha256 hašov, zakódovaných v base64 a "
+"uvedených reťazcom\n"
+" 'sha256//', oddelených ';', pomocou "
+"ktorých sa bude\n"
+" overovať protistrana\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=SÚBOR súbor s náhodnými dátami, pre spustenie "
+"SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=SÚBOR súbor s pomenovaním EGD soketu s "
+"náhodnými dátami\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=REŤ Priamo nastaviť reťazec priority (GnuTLS) "
+"alebo zoznamu Å¡ifier (OpenSSL).\n"
+" Používajte opatrne. Táto voľba prekrýva --"
+"secure-protocol.\n"
+" Formát a syntax tohto reťazca závisí od "
+"príslušnej SSL/TLS implementácie.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS voľby:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts zakázať HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file cesta k databáze HSTS (nahradí "
+"predvolenú)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP voľby:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf použiť formát Stream_LF pre všetky "
+"binárne súbory FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=POUŽÃVATEĽ nastaviÅ¥ ftp používateľa na POUŽÃVATEĽ\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=HESLO nastaviť ftp heslo na HESLO\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing neodstraňovať súbory '.listing'\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob pri FTP vypnúť používanie divokých znakov "
+"v názvoch súborov\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp zakázať \"pasívny\" režim prenosu\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions zachovať vzdialené prístupové práva "
+"súborov\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks pri rekurzii získať odkazované súbory "
+"(nie adresáre)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS voľby:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit použiť implicitné FTPS (štandardný "
+"port je 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl pri otváraní dátového spojenia "
+"pokraÄovaÅ¥ v SSL/TLS sedení zaÄatom\n"
+" riadiacim spojením\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection šifrovať len riadiace spojenie; "
+"všetky dáta budú nešifrované\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp vrátiť sa k FTP ak FTPS nie je "
+"podporované na cieľovom serveri\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC voľby:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=NÃZOVSÚBORU uložiÅ¥ údaje o požiadavkách/odpovediach "
+"do súboru .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+" --warc-header=REŤAZEC vložiť REŤAZEC do záznamu warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ÄŒÃSLO nastaviÅ¥ maximálnu veľkosÅ¥ WARC súborov "
+"na ÄŒÃSLO\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx zapísať indexové súbory CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=NÃZOVSÚBORU neukladaÅ¥ záznamy uvedené v tomto CDX "
+"súbore\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression nekomprimovať súbory WARC pomocou GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests nepoÄítaÅ¥ kontrolné súÄty SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log neukladať súbor so záznamom do WARC "
+"záznamu\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=ADRESÃR umiestnenie doÄasných súborov "
+"vytvorených\n"
+" WARC zapisovaÄom\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekurzívne sťahovanie:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive nastaviť rekurzívne sťahovanie\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=ÄŒÃSLO maximálna hĺbka rekurzie (inf alebo 0 pre "
+"nekoneÄno)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after odstrániť miestne súbory po ich "
+"stiahnutí\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links zmeniť odkazy v stiahnutých HTML a CSS "
+"tak,\n"
+" aby ukazovaly na miestne súbory\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only previesÅ¥ len súborovú ÄasÅ¥ URL (väÄÅ¡inou "
+"nazývané aj basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N pred zapísaním súboru X, zachovať až N "
+"záložných súborov\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted pred konverziou súboru X ho zazálohovať "
+"ako X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted pred konverziou súboru X ho zazálohovať "
+"ako X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror skratka pre -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites získaÅ¥ vÅ¡etky obrázky, atÄ. potrebné pre "
+"zobrazenie HTML stránky\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments zapnúť striktné (SGML) spracovávanie HTML "
+"komentárov\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekurzívne akceptovanie/odmietnutie:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=ZOZNAM Äiarkou oddelený zoznam akceptovaných "
+"prípon\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=ZOZNAM Äiarkou oddelený zoznam odmietnutých "
+"prípon\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGVÃRAZ regulárny výraz pre akceptované URL\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGVÃRAZ regulárny výraz je odmietnuté URL\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYP typ regulárneho výrazu (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYP typ regulárneho výrazu (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=ZOZNAM Äiarkou oddelený zoznam akceptovaných "
+"domén\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=ZOZNAM Äiarkou oddelený zoznam odmietnutých "
+"domén\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp nasledovať FTP odkazy z HTML dokumentov\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=ZOZNAM Äiarkou oddelený zoznam nasledovaných "
+"HTML znaÄiek\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=ZOZNAM Äiarkou oddelený zoznam ignorovaných HTML "
+"znaÄiek\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts prejsť na cudzích hostiteľov pri "
+"rekurzii\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative nasledovať len relatívne odkazy\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=ZOZNAM zoznam povolených adresárov\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names použiÅ¥ názov urÄený posledným "
+"komponentom\n"
+" URL presmerovania\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=ZOZNAM zoznam vynechaných adresárov\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent nevystupovaÅ¥ do rodiÄovského adresára\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Správy o chybách, otázky a diskusiu môžete zasielať na adresu\n"
+"<bug-wget@gnu.org> (iba anglicky) alebo môžete problém nahlásiť na\n"
+"https://savannah.gnu.org/bugs/?func=additem&group=wget.\n"
+"Komentáre k slovenskému prekladu zasielajte na adresu <sk-i18n@lists.linux."
+"sk>\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, program pre neinteraktívne sťahovanie súborov.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Heslo pre používateľa %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Heslo: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Nepodarilo sa vytvoriť dátovod\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Chyba pri inicializácii spúšťacích súborových akcií pre use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Chyba pri nastavovaní spúšťacích súborových akcií pre use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Chyba pri Äítaní odpovede príkazu \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Meno používateľa pre '%s%s: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Heslo pre '%s%s@%s': "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Národné prostredie: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilácia: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Odkaz: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s zostavený na %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (prostredie)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (používateľ)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (systém)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licencia GPLv3+: GNU GPL verzia 3 alebo novšia\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Toto je slobodný softvér: môžete ho ľubovoľne meniť a distribuovať.\n"
+"BEZ ZÃRUKY v rozsahu povolenom zákonom.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Pôvodným autorom tohoto programu je Hrvoje Nikšić <hniksic@xemacs.com>\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Hlásenia o chybách a otázky zasielajte, prosím, na adresu\n"
+"<bug-wget@gnu.org> (iba anglicky).\n"
+"Komentáre k slovenskému prekladu zasielajte na adresu <sk-i18n@lists.linux."
+"sk>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Problém s alokovaním pamäte\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Koniec z dôvodu chyby v %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Príkaz `%s --help' vypíše viac volieb.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: neprípustná voľba -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Podpora ladenia nebola zahrnutá pri zostavovaní. Príznak --debug sa "
+"ignoruje.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Oboje --no-clobber a --convert-links bolo zadané. Použije sa len --convert-"
+"links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Oboje --no-clobber a --convert-file-only bolo zadané. Použije sa len --"
+"convert-links.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Nie je možné byÅ¥ zároveň rozvláÄny aj byÅ¥ ticho.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Nie je možné používaÅ¥ Äasové znaÄky a nemazaÅ¥ pritom staré súbory.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Nie je možné zadať naraz --inet4-only aj --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Nie je možné zadať -k alebo --convert-file-only spolu s -O ak sú zadané "
+"viaceré URL, alebo v kombinácii\n"
+"s -p alebo -r. Podrobnosti nájdete v návode.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"UPOZORNENIE: kombinácia -O s -r alebo -p bude znamenať, že celý stiahnutý\n"
+"obsah bude umiestnený do jedného vami zadaného súboru.\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"UPOZORNENIE: oznaÄovanie Äasovými znaÄkami nerobí niÄ, ak je kombinované s -"
+"O.\n"
+"Podrobnosti nájdete v návode.\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC výstup nefunguje s --no-clobber, --no-clobber bude deaktivované.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC výstup nefunguje s oznaÄovaním Äasovými znaÄkami, oznaÄovanie Äasovými "
+"znaÄkame\n"
+"bude deaktivované.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC výstup nefunguje so --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC výstup nefunguje s --continue alebo --start-pos, tieto budú "
+"deaktivované.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Kontrolné súÄty nie sú povolené; WARC deduplikácia nenájde duplikátne "
+"záznamy.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Komprimovanie nefunguje s --continue alebo --start-pos, tieto budú "
+"deaktivované.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Nie je možné zadať naraz --ask-password aj --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Zadanie --start-pos aj --continue je neodporúÄané; --continue bude "
+"deaktivované.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: chýba URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Nemôžete zadať naraz --post-data aj --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Nemôžete použiť --post-data alebo --post-file spolu s --method. --method "
+"oÄakáva dáta pomocou voľby --body-data a --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Metódu, ktorá sa má použiť s --body-data alebo --body-file, musíte zadať "
+"pomocou --method=HTTPmetóda.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Nemôžete zadať naraz --body-data aj --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Táto verzia nemá podporu pre IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k alebo -r môže byť použité spolu s -O, len ak je výstup do bežného "
+"súboru.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links alebo --convert-file-only môžu byť použité spolu, len ak je "
+"výstup do bežného súboru.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Zlyhala inicializácia libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Zlyhala inicializácia kanála c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Zlyhala analýza IP adresy '%s'\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Zlyhalo nastavenie DNS server(ov) '%s' (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "V %s neboli nájdené URL.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Nepodarilo sa analyzovať metalink súbor %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Nepodarilo sa stiahnuť všetky zdroje z %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"UKONČENÉ --%s--\n"
+"Celkový Äas: %s\n"
+"Stiahnutých: %d súborov, %s za %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Limit objemu stiahnutych dát %s PREKROÄŒENÃ!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O nie je podporované pre sťahovanie metalink. Ignoruje sa.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Plánovaný metalink súbor: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "ZabezpeÄený metalink súbor: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Odmietnutý metalink súbor. Meno nie je bezpeÄné.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Spracováva sa metaurl %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Odmietnutý metaurl súbor %s. Meno nie je bezpeÄné.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "SÅ¥ahovanie %s zlyhalo. PreskoÄené metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Nepodarilo sa analyzovať metaurl súbor %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Spracovanie metaurl skonÄilo s chybou.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Typ zdroja %s nepodporovaný, ignoruje sa...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Nepodarilo sa otvoriť stiahnutý súbor.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "PoÄítanie veľkosti pre %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Neuvedená veľkosÅ¥ súboru. Kontrola preskoÄená.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Nepodarilo sa získať veľkost stiahnutého súboru.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Veľkosť súboru %s nesúhlasí.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Veľkosť súhlasí.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "PoÄítanie kontrolného súÄtu pre %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrolný súÄet súhlasí.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Kontrolný súÄet súboru %s nesúhlasí.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Nepodarilo sa otvoriť stiahnutý súbor na overenie podpisu.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Overenie podpisu úspešné.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Neplatný podpis. Zdroj odmietnutý.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Údaje zodpovedajú podpisu, ale podpis nie je dôveryhodný.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Kontrolné súÄty nenájdené.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "SÅ¥ahovanie %s zlyhalo. Zdroj preskoÄený.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Súbor %s bol získaný, ale veľkosť nesúhlasí. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Súbor %s bol získaný, ale kontrolný súÄet nesúhlasí. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Súbor %s bol získaný, ale podpis nesúhlasí. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Premenováva sa %s na %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "PokraÄovanie v behu na pozadí.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "PokraÄovanie v behu na pozadí, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Výstup bude zapísaný do %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "zlyhalo fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "zlyhalo fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Nepodarilo sa nájsÅ¥ použiteľný ovládaÄ soketov.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "Zlyhalo ioctl(). Soket nemohol byť nastavený ako blokujúci.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: upozornenie: token %s je uvedený pred akýmkoľvek názvom poÄítaÄa\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: neznámy token \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Použitie: %s NETRC [NÃZOV_POÄŒÃTAÄŒA]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: volanie `stat %s' skonÄilo s chybou: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "UPOZORNENIE: používané slabé spúšťacie zrnko pre náhodné Äísla.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Nepodarilo sa inicializovať PRNG; zvážte použitie --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Vaša verzia OpenSSL je príliš stará, aby podporovala TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Vaša verzia OpenSSL je príliš stará, aby podporovala TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Vaša verzia OpenSSL je príliš stará, aby podporovala TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: neimplementovaná hodnota %d voľby 'secure-protocol'\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Neplatný zoznam šifier: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Zlyhalo nastavenie dôveryhodnosti pre neúplný reťazec\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Zlyhalo vytvorenie overovacieho parametra\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"UPOZORNENIE: Nepodarilo sa inicializovať PRNG. Zvážte použitie --random-"
+"file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: nie je možné overiť certifikát pre %s, vydaný %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Nie je možné miestne overiť autoritu vydavateľa.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Vyskytol sa certifikát podpísaný samým sebou.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Vydaný certifikát je ešte neplatný.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Vydanému certifikátu vypršala platnosť.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: žiadny alternatívny názov predmetu v certifikáte\n"
+"\tsa nezhoduje s požadovaným názvom hostiteľa %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: bežný názov %s v certifikáte sa nezhoduje s požadovaným názvom "
+"hostiteľa %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: bežný názov v certifikáte je neplatný (obsahuje znak NUL).\n"
+" To môže byť znamením toho, že hostiteľ nie je tým, za koho sa vydáva\n"
+" (to znamená, nie je to reálne %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Na nie bezpeÄné pripojenie k %s použite `--no-check-certificate'.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ preskakuje sa %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Neplatná bodková špecifikácia %s; ponecháva sa nezmenené.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " odh %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " za "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Nie je možné získaÅ¥ frekvenciu hodín reálneho Äasu: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Odstraňuje sa %s, pretože by mal byť odmietnutý.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Nie je možné otvoriť %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "NaÄítava sa robots.txt. Chybové hlásenia ignorujte, prosím.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Chyba pri analýze proxy URL %s: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Chyba v proxy URL %s: Musí byť HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "PrekroÄený limit %d presmerovaní.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Nemá to zmysel.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Skúša sa znova.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Neboli nájdené poškodené odkazy.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Nájdených %d poškodených odkazov.\n"
+"\n"
+msgstr[1] ""
+"Nájdený %d poškodený odkaz.\n"
+"\n"
+msgstr[2] ""
+"Nájdené %d poškodené odkazy.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Bez chyby"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nepodporovaná schéma %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schéma chýba"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Neplatný názov hostiteľa"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Zlé Äíslo portu"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Neplatné meno používateľa"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "NeukonÄená Äíselná adresa pre IPv6"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adresy nie sú podporované"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Neplatná Äíselná adresa IPv6"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Podpora pre HTTPS nie je zakompilovaná"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Vyskytla sa neprevoditeľná viacbajtová postupnosť\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Zlyhalo vyžiadanie dostatoÄnej pamäte; pamäť je vyÄerpaná.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Zlyhalo vyžiadanie %ld bajtov; pamäť je vyÄerpaná.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: pamäť na text je príliÅ¡ veľká (%d bajtov), predÄasne "
+"ukonÄujem.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "PokraÄovanie v behu na pozadí, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Nebolo možné odstrániť symbolický odkaz %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Zlyhalo otvorenie súboru %s pomocou Fopen\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Zlyhalo získanie FD súboru %s.\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+"Zlyhalo získanie informácií o súbore %s pomocou stat, (kontrola oprávnenia)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Súbor %s sa zmenil od poslednej kontroly. Kontrola bezpeÄnosti zlyhala.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Zlyhalo otvorenie súboru %s z dôvodu: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Zlyhalo získanie informácií o súbore %s pomocou stat s chybou: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Skúša sa otvoriÅ¥ súbor %s, ale sa zmenil od poslednej kontroly. BezpeÄnostná "
+"kontrola zlyhala.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Neplatný regulárny výraz %s, chyba PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Neplatný regulárny výraz %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Chyba pri hľadaní zhody %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Preskakuje sa kÄ¾ÃºÄ s nesprávnou veľkosÅ¥ou (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Chyba pri nastavovaní polohy v súbore WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Chyba pri zápise súboru WARC na disk.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Chyba pri duplikovaní súborového popisovaÄa súboru WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Chyba pri otváraní prúdu GZIP do súboru WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Chyba pri zápise warcinfo záznamu do súboru WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Otváranie súboru WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Chyba pri otváraní súboru WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Súbor CDX neobsahuje pôvodné url. (Chýba stlpec 'a'.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Súbor CDX neobsahuje kontrolné súÄty. (Chýba stlpec 'k'.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Súbor CDX neobsahuje identifikátory záznamov. (Chýba stlpec 'u'.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] "NaÄítaných %d záznamov z CDX.\n"
+msgstr[1] "NaÄítaný %d záznam z CDX.\n"
+msgstr[2] "NaÄítané %d záznamy z CDX.\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Nepodarilo sa preÄítaÅ¥ súbor CDX %s na vylúÄenie duplicít.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Nepodarilo sa otvoriÅ¥ doÄasný súbor manifestu WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Nepodarilo sa otvoriÅ¥ doÄasný súbor so záznamom WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Nepodarilo sa otvoriť súbor WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Nepodarilo sa otvoriť súbor CDX ako výstup.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Nepodarilo sa otvoriÅ¥ doÄasný súbor WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Našla sa presná zhoda v súbore CDX. Ukladá sa záznam opätovného navštívenia "
+"do WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Neznáma systémová chyba"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Rodina adries pre hostiteľa nie je podporovaná"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Zlá hodnota pre ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Nezotaviteľné zlyhanie pri prevode názvu"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "nepodporované ai_family"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Zlyhanie pri alokovaní pamäte"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Žiadna adresa nie je priradená k hostiteľovi"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Názov alebo služba neznáme"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Názov servera nie je podporovaný pre ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "nepodporované ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "Systémová chyba"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Pamäť pre parameter je príliš malá"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Prebieha spracovanie požiadavky"
+
+#~ msgid "Request canceled"
+#~ msgstr "Požiadavka zrušená"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Požiadavka nie je zrušená"
+
+#~ msgid "All requests done"
+#~ msgstr "Všetky požiadavky hotové"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Prerušenie signálom"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Reťazec parametra nie je správne zakódovaný"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: voľba '%s%s' je nejednoznaÄná\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: voľba '%s%s' je nejednoznaÄná, možnosti:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: neznáma voľba '%s%s'\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: voľba '%s%s' nepodporuje parameter\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: voľba '%s%s' vyžaduje parameter\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: neplatná voľba -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: voľba vyžaduje parameter -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "“"
+
+#~ msgid "Success"
+#~ msgstr "Úspech"
+
+#~ msgid "No match"
+#~ msgstr "Bez zhody"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Neplatný regulárny výraz"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Neplatný znak radenia"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Neplatný názov triedy znaku"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Koncová spätná lomka"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Neplatný spätný odkaz"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Nepárové [, [^, [:, [. alebo [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Nepárové ( alebo \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Nepárové \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Neplatný obsah \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Neplatný koniec rozsahu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Pamäť vyÄerpaná"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Neplatný predošlý regulárny výraz"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "PredÄasný koniec regulárneho výrazu"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Regulárny výraz príliš veľký"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Nepárové ) alebo \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Bez predchádzajúceho regulárneho výraz"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "nepodarilo sa vytvoriť dátovod"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "podproces %s zlyhal"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle zlyhalo"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "nie je možné obnoviť fd %d: dup2 zlyhalo"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "podproces %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "podproces %s dostal závažný signál %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "pamäť vyÄerpaná"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: voľba '--%s' nepodporuje parameter\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: neznáma voľba '--%s'\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: voľba '-W %s' je nejednoznaÄná\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: voľba '-W %s' nepodporuje parameter\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: voľba '-W %s' vyžaduje parameter\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Súbor `%s' je už tam, nebudem ho prenášať.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Neplatná UTF-8 sekvencia: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode zlyhalo (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s prijatý.\n"
diff --git a/po/sl.gmo b/po/sl.gmo
new file mode 100644
index 0000000..df0db96
--- /dev/null
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
new file mode 100644
index 0000000..ac4deb2
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,3567 @@
+# Slovenian translation for wget.
+# Copyright (C) 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Roman Maurer <roman.maurer@amis.net>, 2008.
+# Andrej ®nidar¹iè <andrej.znidarsic@gmail.com>, 2010.
+#
+# Spremembe:
+#
+# LLLL-MM-DD avtor sprememba
+# -------------------------------------------------------------------
+# 2010-11-17 Andrej spremembe&doponitve za 1.12pre7
+# 2008-05-14 Roman dopolnitve za wget 1.11.3
+# 2008-04-20 Roman spremembe in dopolnitve za wget 1.11.1
+# 2003-10-13 Roman spremembe in dopolnitve za wget 1.9
+# 2002-04-09 Roman spremembe in dopolnitve za wget 1.8.1
+# 2001-11-01 Roman spremembe in dopolnitve za wget 1.7.1
+# 2001-05-10 Primo¾ spremembe in dopolnitve za wget 1.6
+# 1999-10-04 Roman sprememba e-naslova
+# 1999-07-09 Roman razlièica, ki jo je TP-robot sprejel
+# 1999-05-06 Roman kot je bila poslana na lugos-slo@lugos.si
+# 1999-03-11 Roman prva razlièica
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.12-pre7\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2010-11-17 20:05+0100\n"
+"Last-Translator: Andrej ®nidar¹iè <andrej.znidarsic@gmail.com>\n"
+"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
+"Language: sl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+"%s: ni bilo mogoèe razre¹iti naslova za vezanje %s; onemogoèanje vezanja.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Povezovanje na %s|%s|:%d ... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Povezovanje na %s:%d ... "
+
+#: src/connect.c:293
+#, fuzzy, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Povezovanje na %s:%d ... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "povezano.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "spodletelo: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: ni bilo mogoèe razre¹iti naslova gostitelja %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, fuzzy, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Pretvorjenih %d datotek v %s sekundah.\n"
+
+#: src/convert.c:230
+#, fuzzy, c-format
+msgid "Converting links in %s... "
+msgstr "Pretvarjanje %s ... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "niè za storiti.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ni mogoèe pretvoriti povezav v %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ni bilo mogoèe izbrisati %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ni mogoèe ustvariti varnostne kopije %s kot %s: %s\n"
+
+#: src/cookies.c:311
+#, fuzzy, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ni bilo mogoèe izbrisati %s: %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Skladenjska napaka v Set-Cookie: %s na mestu %d.\n"
+
+#: src/cookies.c:777
+#, fuzzy, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Pi¹kot iz %s je sku¹al nastaviti domeno na %s\n"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ni bilo mogoèe odpreti datoteke s pi¹kotki %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Napaka med zapisovanjem v %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Napaka med zapiranjem %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Nepodprta vrsta seznama, posku¹am z razèlenjevalnikom seznama za Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Kazalo mape /%s na %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "neznan èas "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Datoteka "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "mapa "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Povezava "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Neznano "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bajtov)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Dol¾ina: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) preostalo"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s preostalo"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (neavtorizirana)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Prijavljanje kot %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Napaka v odzivu stre¾nika, zapiranje nadzorne povezave.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Napaka v pozdravu stre¾nika.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Pisanje je spodletelo, zapiram nadzorno povezavo.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Stre¾nik zavraèa prijavo.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Napaèna prijava.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Prijavljen!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Napaka stre¾nika, vrste sistema ni moè ugotoviti.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "konèano. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "konèano.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Neznana vrsta `%c', zapiranje nadzorne povezave.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "konèano."
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD ni potreben.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Ni take mape %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD ni zahtevan.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Datoteka je bila ¾e prejeta.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ni mogoèe zaèeti prenosa PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ni mogoèe razèleniti odgovora PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "ni se bilo moè povezati z %s na vratih %d: %s.\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Napaka med povezovanjem (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Neveljaven PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST neuspe¹en, zaèenjanje znova.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Datoteka %s obstaja.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Ni take datoteke %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ni take datoteke %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ni take datoteke ali mape %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s je zaèela obstajati.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, zapiranje nadzorne povezave.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Podatkovna zveza: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Nadzorna povezava prekinjena.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Prenos podatkov prekinjen.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Datoteka %s je ¾e tam; prejem preskoèen.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(posk:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisan v stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s shranjeno [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Odstranjevanje %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Uporabljanje %s kot zaèasno datoteko seznama.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Odstranjen %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Globina rekurzije %d presega najveèjo dovoljeno %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Oddaljena datoteka ni novej¹a od krajevne datoteke %s -- prejemanje "
+"preskoèeno.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Oddaljena datoteka je novej¹a kot krajevna datoteka %s -- prejemanje.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Velikosti se ne ujemata (krajevna %s) -- prena¹am.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Neveljavno ime simbolne povezave, preskakujem.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Pravilna simbolna povezava ¾e obstaja: %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Ustvarjanje simbolne povezave %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Simbolne povezave niso podprte. Simbolna povezava %s bo preskoèena.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Mapa %s bo preskoèena.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: neznana/nepodprta vrsta datoteke.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr ""
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: okvarjen èasovni ¾ig.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Mape ne bodo pridobljene, ker je globina %d (najveè %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ni padanja k %s, ker je izvzeto/ni vkljuèeno.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Zavraèanje %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Zavraèanje %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Ni padanja k %s, ker je izvzeto/ni vkljuèeno.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Napaka med ujemanjem %s z %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ni ujemanj za vzorec %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Zapisan indeks kot HTML v %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Zapisan indeks kot HTML v %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "NAPAKA: Ni bilo mogoèe odpreti mape %s.\n"
+
+#: src/gnutls.c:178
+#, fuzzy, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "NAPAKA: Ni bilo mogoèe odpreti mape %s.\n"
+
+#: src/gnutls.c:183
+#, fuzzy, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Napaka med razèlenjevanjem potrdila: %s\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+#, fuzzy
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Po¹ljite poroèila o hro¹èih in vpra¹anja na <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "NAPAKA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "OPOZORILO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s ni podal potrdila.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Potrdilo od %s ni zaupanja vredno.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Potrdilo %s nima znanega izdajatelja.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Potrdilo od %s je bilo preklicano.\n"
+
+#: src/gnutls.c:1041
+#, fuzzy, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Potrdilo od %s ni zaupanja vredno.\n"
+
+#: src/gnutls.c:1042
+#, fuzzy, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Potrdilo %s nima znanega izdajatelja.\n"
+
+#: src/gnutls.c:1043
+#, fuzzy, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Potrdilo od %s ni zaupanja vredno.\n"
+
+#: src/gnutls.c:1044
+#, fuzzy, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Potrdilo od %s je bilo preklicano.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Napaka med nastavljanjem zaèetnih vrednosti potrdila X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Ni bilo najdenih potrdil\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Napaka med razèlenjevanjem potrdila: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Potrdilo ¹e ni bilo omogoèeno\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Potrdilo je poteklo\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Lastnik potrdila se ne ujema z imenom gostitelja %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Neznan gostitelj"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Zaèasna napaka med razre¹evanjem imena"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Neznana napaka"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Razre¹evanje %s ..."
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "spodletelo: Ni naslova IPv4/IPv6 za gostitelja.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "spodletelo: zakasnitev.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ni moè razre¹iti nepopolne povezave %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Neveljaven URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Napaka med pisanjem zahteve HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Ni glav, privzema se HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka %s je ¾e tam; prejemanje preskoèeno.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, fuzzy, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Datoteka s podatki POST, %s, manjka: %s\n"
+
+#: src/http.c:2093
+#, fuzzy, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Ponovna uporaba povezave z %s:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Ponovna uporaba povezave z %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Napaka med branjem odgovora posredni¹kega stre¾nika: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s NAPAKA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Izmalièena vrstica stanja"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Tuneliranje posredni¹kega stre¾nika je spodletelo: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Neznata metoda overitve.\n"
+
+#: src/http.c:2478
+#, fuzzy, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Neznata metoda overitve.\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Shranjevanje v: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Onemogoèanje SSL zaradi opa¾enih napak.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s zahteva poslana, èakanje na odgovor ... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Brez sprejetih podatkov.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Napaka med branjem glav (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(brez opisa)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Polo¾aj: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "nedoloèeno"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [spremljanje]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Datoteka je ¾e popolnoma prene¹ena; niè ni za storiti.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Dol¾ina: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "prezrto"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Opozorilo: HTTP ne podpira nadomestnih znakov.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Omogoèen naèin pajka. Preverite, èe obstaja oddaljena datoteka.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "V %s ni mogoèe zapisovati (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+#, fuzzy
+msgid "Cannot write to WARC file.\n"
+msgstr "V %s ni mogoèe zapisovati (%s).\n"
+
+#: src/http.c:4484
+#, fuzzy
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "V %s ni mogoèe zapisovati (%s).\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Povezave SSL ni bilo moè vzpostaviti.\n"
+
+#: src/http.c:4495
+#, fuzzy, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "V %s ni mogoèe zapisovati (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "NAPAKA: Preusmeritev (%d) brez nove lokacije.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Oddaljena datoteka ne obstaja -- pokvarjena povezava!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Glava ,Last-Modified` manjka - izklapljanje èasovnega ¾iga.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Neveljavna glava `Last-Modified' -- prezrtje èasovnega ¾iga.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Datoteka na stre¾niku ni novej¹a kot krajevna datoteka %s -- prejemanje "
+"preskoèeno.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Velikosti se ne ujemata (krajevna %s) -- prena¹anje.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Oddaljena datoteka je novej¹a, pridobivanje.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Oddaljena datoteka obstaja in lahko vsebuje povezave na druge vire -- "
+"pridobivanje.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Oddaljena datoteka obstaja, vendar ne vsebuje nobenih povezav -- prejemanje "
+"preskoèeno.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Oddaljena datoteka obstaja, in morda vsebuje nadaljnje\n"
+"povezave, vendar je rekurzija onemogoèena -- prejemanje preskoèeno.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Oddaljena datoteka obstaja.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - zapisano v stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s shranjeno [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Povezava zaprta na bajtu %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Napaka med branjem na bajtu %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Napaka med branjem na bajtu %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, fuzzy, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Nepodprta shema %s"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC ka¾e na %s, ki ne obstaja.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ni mogoèe prebrati %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Napaka v %s v vrstici %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Napaka skladnje v %s v vrstici %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Neznan ukaz %s v %s v vrstici %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Opozorilo: tako sistemska kot uporabnikova datoteka wgetrc ka¾eta na "
+"%s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Neveljaven --execute command %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Neveljaven logièni operator %s; uporabite `on' ali `off'.\n"
+
+#: src/init.c:1099
+#, fuzzy, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Neveljaven logièni operator %s; uporabite `on' ali `off'.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Neveljavno ¹tevilo %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Neveljavna vrednost bajta %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Neveljavni èasovni razpon %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Neveljavni èasovni razpon %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Neveljavna vrednost %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Neveljavne glave %s.\n"
+
+#: src/init.c:1566
+#, fuzzy, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Neveljavne glave %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Neveljavna vrsta stanja napredka %s.\n"
+
+#: src/init.c:1714
+#, fuzzy, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Neveljavna omejitev %s,\n"
+" uporabite [unix|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodiranje %s ni veljavno\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Pretvorba iz %s v %s ni podprta\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Zaznana je bila nepopolna ali neveljavna veèbajtna sekvenca\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Neobravnavana errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: jezikovna oznaka ni nastavljena\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "Spodletel idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, fuzzy, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "ni se bilo moè povezati z %s na vratih %d: %s.\n"
+
+#: src/log.c:937 src/log.c:956
+#, fuzzy, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"%s prejeto, preusmerjanje izhoda na %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; onemogoèanje bele¾enja.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Uporaba: %s [IZBIRA]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Obvezni argumenti za dolge izbire so obvezni tudi za kratke izbire.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Zagon:\n"
+
+#: src/main.c:594
+#, fuzzy
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version prika¾i razlièico Wgeta in se vrni.\n"
+
+#: src/main.c:596
+#, fuzzy
+msgid " -h, --help print this help\n"
+msgstr " -h, --help izpi¹i pomoè.\n"
+
+#: src/main.c:598
+#, fuzzy
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background po zagonu pojdi v ozadje.\n"
+
+#: src/main.c:600
+#, fuzzy
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=UKAZ izvedi ukaz v slogu ,.wgetrc`.\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Bele¾enje in vhodna datoteka:\n"
+
+#: src/main.c:606
+#, fuzzy
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=DAT. shranjuj sporoèila v DATOTEKO.\n"
+
+#: src/main.c:608
+#, fuzzy
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=DAT. pripni sporoèila v DATOTEKO.\n"
+
+#: src/main.c:611
+#, fuzzy
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug izpi¹i veliko razhro¹èevalnih podrobnosti.\n"
+
+#: src/main.c:615
+#, fuzzy
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug izpi¹i razhro¹èevalni izhod za Watt-32.\n"
+
+#: src/main.c:618
+#, fuzzy
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet ti¹ina (brez izpisa).\n"
+
+#: src/main.c:620
+#, fuzzy
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose vkljuèi polni izpis (privzeto).\n"
+
+#: src/main.c:622
+#, fuzzy
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -nv, --no-verbose izkljuèi veèino izpisa, a brez ti¹ine.\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+#, fuzzy
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DAT. prejmi povezave najdene v krajevni ali zunanji "
+"DATOTEKI.\n"
+
+#: src/main.c:629
+#, fuzzy
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DAT. prejmi povezave najdene v krajevni ali zunanji "
+"DATOTEKI.\n"
+
+#: src/main.c:632
+#, fuzzy
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html privzemi, da je vhodna datoteka HTML.\n"
+
+#: src/main.c:634
+#, fuzzy
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL Razre¹i povezave HTML input-file (-i -F)\n"
+" relativno na URL-je.\n"
+
+#: src/main.c:637
+#, fuzzy
+msgid " --config=FILE specify config file to use\n"
+msgstr " --no-cookies ne uporabljaj pi¹kotkov.\n"
+
+#: src/main.c:639
+#, fuzzy
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies ne uporabljaj pi¹kotkov.\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Prejemanje:\n"
+
+#: src/main.c:647
+#, fuzzy
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=©TEVILO nastavi ©TEVILO poskusov (0 za neskonèno).\n"
+
+#: src/main.c:649
+#, fuzzy
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused znova poskusi, tudi èe je povezava "
+"zavrnjena.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=SEZNAM z vejico loèen seznam prezrtih znaèk "
+"HTML.\n"
+
+#: src/main.c:653
+#, fuzzy
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=DAT. zapisuj dokumente v DATOTEKO.\n"
+
+#: src/main.c:655
+#, fuzzy
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber preskoèi prejemanja, ki bi se prepisala\n"
+" obstojeèe datoteke.\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " -np, --no-parent ne pojdi v nadrejeno mapo.\n"
+
+#: src/main.c:660
+#, fuzzy
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue nadaljuj z prejemanjem delno prejete "
+"datoteke.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+#, fuzzy
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=VRSTA doloèi slog prikaza prejemanja.\n"
+
+#: src/main.c:666
+#, fuzzy
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=VRSTA doloèi slog prikaza prejemanja.\n"
+
+#: src/main.c:668
+#, fuzzy
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping ne prejmi znova datotek , ki so\n"
+" starej¹e od krajevnih.\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+#, fuzzy
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ne nastavljaj èasovne ¾ige krajevnih "
+"datotek\n"
+" glede na èasovne ¾ige na stre¾niku.\n"
+
+#: src/main.c:677
+#, fuzzy
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response izpi¹i odziv stre¾nika.\n"
+
+#: src/main.c:679
+#, fuzzy
+msgid " --spider don't download anything\n"
+msgstr " --spider ne prejmi nièesar.\n"
+
+#: src/main.c:681
+#, fuzzy
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SEKUNDE nastavi vse zakasnitve na SEKUNDE.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+#, fuzzy
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-address=NASLOV pove¾i se z NASLOVOM (ime ali IP) na \n"
+" krajevnem gostitelju.\n"
+
+#: src/main.c:689
+#, fuzzy
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEKUNDE nastavi zakasnitev poizvedbe DNS na "
+"SEKUNDE.\n"
+
+#: src/main.c:691
+#, fuzzy
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SECS nastavi zakasnitev povezovanja na "
+"SEKUNDE.\n"
+
+#: src/main.c:693
+#, fuzzy
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SECS nastavi zakasnitev branja na SEKUNDE.\n"
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDE poèakaj 1 ... SEKUNDE med ponovnimi "
+"poskusi\n"
+" prejemanja.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait èakaj od 0.5*ÈAKAJ...1.5*ÈAKAJ sekund med "
+"prejemi.\n"
+
+#: src/main.c:704
+#, fuzzy
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+" --no-proxy posebej izkljuèi posredni¹ki stre¾nik.\n"
+
+#: src/main.c:706
+#, fuzzy
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=©TEVILO doloèi omejitev prejemanja na ©TEVILO.\n"
+
+#: src/main.c:708
+#, fuzzy
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=NASLOV pove¾i se z NASLOVOM (ime ali IP) na \n"
+" krajevnem gostitelju.\n"
+
+#: src/main.c:710
+#, fuzzy
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=HITROST omeji hitrost prejemanja na HITROST.\n"
+
+#: src/main.c:712
+#, fuzzy
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache onemogoèi predpomnjenje poizvedb DNS.\n"
+
+#: src/main.c:714
+#, fuzzy
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS omeji znake v imenih datotek na tiste, "
+"ki\n"
+" so dovoljeni v OS.\n"
+"\n"
+
+#: src/main.c:716
+#, fuzzy
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ne upo¹tevaj velikosti èrk med\n"
+" ujemanjem datotek/map\n"
+
+#: src/main.c:719
+#, fuzzy
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only pove¾i se zgolj na naslove IPv4\n"
+
+#: src/main.c:721
+#, fuzzy
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only pove¾i se zgolj na naslove IPv6\n"
+
+#: src/main.c:723
+#, fuzzy
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=DRU®INA najprej se povezuj na naslove iz doloèene "
+"dru¾ine,\n"
+" lahko je IPv6, IPv4, ali none.\n"
+
+#: src/main.c:727
+#, fuzzy
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=UPORABNIK nastavi uporabnika za FTP in HTTP na "
+"UPORABNIK.\n"
+
+#: src/main.c:729
+#, fuzzy
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --passwd=GESLO nastavi geslo za FTP in HTTP na GESLO.\n"
+
+#: src/main.c:731
+#, fuzzy
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password vpra¹aj za gesla.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+#, fuzzy
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri izklopi podpor IRI.\n"
+
+#: src/main.c:742
+#, fuzzy
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KOD. uporabi KODIRANJE kot krajevno kodiranje "
+"za IRIs.\n"
+
+#: src/main.c:744
+#, fuzzy
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOD. uporabi KODIRANJE kot privzeto oddaljeno "
+"kodiranje.\n"
+
+#: src/main.c:746
+#, fuzzy
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+" --no-glob izkljuèi `globbing' imen datotek pri FTP.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Mape:\n"
+
+#: src/main.c:766
+#, fuzzy
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd --no-directories ne ustvari map.\n"
+
+#: src/main.c:768
+#, fuzzy
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories vedno ustvari mape.\n"
+
+#: src/main.c:770
+#, fuzzy
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ne ustvarjaj map gostiteljev.\n"
+
+#: src/main.c:772
+#, fuzzy
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories v mapah uporabi ime protokola.\n"
+
+#: src/main.c:774
+#, fuzzy
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREDPONA shranij datoteke v PREDPONA/...\n"
+
+#: src/main.c:776
+#, fuzzy
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=©TEVILO prezri ©TEVILO sestavnih delov oddaljenih "
+"map.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Mo¾nosti HTTP:\n"
+
+#: src/main.c:782
+#, fuzzy
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=UPORABNIK nastavi uporabnika HTTP na UPORABNIK.\n"
+
+#: src/main.c:784
+#, fuzzy
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-passwd=GESLO nastavi geslo za HTTP na GESLO.\n"
+
+#: src/main.c:786
+#, fuzzy
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache onemogoèi predpomnjene podatke s stre¾nika.\n"
+
+#: src/main.c:788
+#, fuzzy
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME Spremeni privzeto ime strani (obièajno\n"
+" je to `index.html'.).\n"
+
+#: src/main.c:791
+#, fuzzy
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension shrani dokumente HTML/CSS s pravilnimi "
+"priponami.\n"
+
+#: src/main.c:793
+#, fuzzy
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length Prezri glavo `Content-Length'.\n"
+
+#: src/main.c:795
+#, fuzzy
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=NIZ vstavi NIZ med glave.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+#, fuzzy
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect najveè dovoljenih preusmeritev na stran.\n"
+
+#: src/main.c:803
+#, fuzzy
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=UPORABNIK nastavi UPORABNIKA kot uporabni¹ko ime za "
+"posredni¹ki stre¾nik.\n"
+
+#: src/main.c:805
+#, fuzzy
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-passwd=GESLO nastavi GESLO za geslo posredni¹kega "
+"stre¾nika.\n"
+
+#: src/main.c:807
+#, fuzzy
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL vkljuèi ,Referer: URL` v zahtevek HTTP.\n"
+
+#: src/main.c:809
+#, fuzzy
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers shranjuj glave HTTP v datoteko.\n"
+
+#: src/main.c:811
+#, fuzzy
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ODJEMNIK predstavi se kot ODJEMNIK namesto Wget/"
+"RAZLIÈICA.\n"
+
+#: src/main.c:813
+#, fuzzy
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive onemogoèi stalne povezave HTTP (keep-alive).\n"
+
+#: src/main.c:815
+#, fuzzy
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ne uporabljaj pi¹kotkov.\n"
+
+#: src/main.c:817
+#, fuzzy
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --load-cookies=DATOT. pred sejo nalo¾i pi¹kote iz DATOTEKE.\n"
+
+#: src/main.c:819
+#, fuzzy
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=DATOT. po seji shrani pi¹kote v DATOTEKO.\n"
+
+#: src/main.c:821
+#, fuzzy
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies nalo¾i in shrani (zaèasne) pi¹kote seje.\n"
+
+#: src/main.c:823
+#, fuzzy
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=NIZ uporabi metodo POST; po¹lji NIZ kot podatke.\n"
+
+#: src/main.c:825
+#, fuzzy
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=DATOTEKA uporabi metodo POST; po¹lji vsebino "
+"DATOTEKE.\n"
+"\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+#, fuzzy
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --post-data=NIZ uporabi metodo POST; po¹lji NIZ kot podatke.\n"
+
+#: src/main.c:831
+#, fuzzy
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --post-file=DATOTEKA uporabi metodo POST; po¹lji vsebino "
+"DATOTEKE.\n"
+"\n"
+
+#: src/main.c:833
+#, fuzzy
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition upo¹tevaj glavo Content-Disposition, ko\n"
+" izbira¹ lokalna imena datotek (POSKUSNO).\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+#, fuzzy
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge po¹lji osnovne podrobnosti overitve HTTP\n"
+" brez èakanja na stre¾nikov\n"
+" poziv.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Mo¾nosti HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol izberi varni protokol SSL; lahko je auto,\n"
+" SSLv2, SSLv3 ali TLSv1\n"
+
+#: src/main.c:850
+#, fuzzy
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" -L, --relative spremljaj samo relativne povezave.\n"
+
+#: src/main.c:852
+#, fuzzy
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate ne preveri potrdila stre¾nika.\n"
+
+#: src/main.c:854
+#, fuzzy
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=DAT. DATOTEKA s potrdilom.\n"
+
+#: src/main.c:856
+#, fuzzy
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=VRSTA VRSTA potrdila odjemalca, PEM ali DER.\n"
+
+#: src/main.c:858
+#, fuzzy
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=DAT. DATOTEKA z zasebnim kljuèem.\n"
+
+#: src/main.c:860
+#, fuzzy
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=VRSTA vrsta zasebnega kljuèa, PEM ali DER.\n"
+
+#: src/main.c:862
+#, fuzzy
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=DAT. datoteka z zbirko CA-jev.\n"
+
+#: src/main.c:864
+#, fuzzy
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr " --ca-directory=MAPA MAPA s seznamom hash CA-jev.\n"
+
+#: src/main.c:866
+#, fuzzy
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=DAT. datoteka z zbirko CA-jev.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+#, fuzzy
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=DAT. DATOTEKA z nakljuènim semenom za SSL PRNG.\n"
+
+#: src/main.c:878
+#, fuzzy
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=DAT. ime datoteke vtièa EGD z nakljuènimi podatki.\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+#, fuzzy
+msgid "HSTS options:\n"
+msgstr "Mo¾nosti HTTP:\n"
+
+#: src/main.c:891
+#, fuzzy
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+" --no-cache onemogoèi predpomnjene podatke s stre¾nika.\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Mo¾nosti FTP:\n"
+
+#: src/main.c:901
+#, fuzzy
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf Uporabi obliko Stream_LF za vse binarne "
+"datoteke FTP.\n"
+
+#: src/main.c:904
+#, fuzzy
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=UPORABNIK nastavi uporabni¹ko ime FTP na UPORABNIK.\n"
+
+#: src/main.c:906
+#, fuzzy
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-passwd=GESLO nastavi geslo za FTP kot GESLO.\n"
+
+#: src/main.c:908
+#, fuzzy
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ne odstrani datotek ,.listing`.\n"
+
+#: src/main.c:910
+#, fuzzy
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob izkljuèi `globbing' imen datotek pri FTP.\n"
+
+#: src/main.c:912
+#, fuzzy
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp ne uporabljaj \"pasivnega\" naèina "
+"prenosa.\n"
+
+#: src/main.c:914
+#, fuzzy
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions ohrani oddaljena dovoljenja datotek.\n"
+
+#: src/main.c:916
+#, fuzzy
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks pri rekurziji prejmi ciljne datoteke (ne "
+"map).\n"
+
+#: src/main.c:921
+#, fuzzy
+msgid "FTPS options:\n"
+msgstr "Mo¾nosti FTP:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+#, fuzzy
+msgid "WARC options:\n"
+msgstr "Mo¾nosti FTP:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+#, fuzzy
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --header=NIZ vstavi NIZ med glave.\n"
+
+#: src/main.c:940
+#, fuzzy
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" -t, --tries=©TEVILO nastavi ©TEVILO poskusov (0 za neskonèno).\n"
+
+#: src/main.c:942
+#, fuzzy
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --spider ne prejmi nièesar.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+#, fuzzy
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-cookies ne uporabljaj pi¹kotkov.\n"
+
+#: src/main.c:952
+#, fuzzy
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --ignore-case ne upo¹tevaj velikosti èrk med\n"
+" ujemanjem datotek/map\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekurzivno prejemanje:\n"
+
+#: src/main.c:961
+#, fuzzy
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive nastavi rekurzivno prejemanje.\n"
+
+#: src/main.c:963
+#, fuzzy
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=©TEVILO najveèja dovoljena globina rekurzije (inf ali 0\n"
+" za neskonèno).\n"
+
+#: src/main.c:965
+#, fuzzy
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after izbri¹i krajevne datoteke, ko so prejete.\n"
+
+#: src/main.c:967
+#, fuzzy
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links povezave v prejetih datotekah HTML ali CSS naj\n"
+" ka¾ejo na krajevne datoteke.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted pred pretvorbo datoteke X, napravi varnostno "
+"kopijo kot X_orig.\n"
+
+#: src/main.c:979
+#, fuzzy
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted pred pretvorbo datoteke X ustvari varnostno \n"
+" kopijo kot X.orig.\n"
+
+#: src/main.c:982
+#, fuzzy
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror bli¾njica za -N -r -l inf --no-remove-listing.\n"
+
+#: src/main.c:984
+#, fuzzy
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites prejmi vse slike itd., potrebne za prikaz "
+"spletne\n"
+" strani HTML.\n"
+
+#: src/main.c:986
+#, fuzzy
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments vkljuèi strogo (SGML) rokovanje komentarjev "
+"HTML.\n"
+"\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekurzivno sprejemanje/zavraèanje:\n"
+
+#: src/main.c:992
+#, fuzzy
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=SEZNAM z vejico loèen seznam sprejemljivih "
+"pripon.\n"
+
+#: src/main.c:994
+#, fuzzy
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=SEZNAM z vejico loèen seznam zavrnjenih "
+"pripon.\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --progress=VRSTA doloèi slog prikaza prejemanja.\n"
+
+#: src/main.c:1004
+#, fuzzy
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --progress=VRSTA doloèi slog prikaza prejemanja.\n"
+
+#: src/main.c:1007
+#, fuzzy
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=SEZNAM z vejico loèen seznam sprejemljivih "
+"domen.\n"
+
+#: src/main.c:1009
+#, fuzzy
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=SEZNAM z vejico loèen seznam zavrnjenih domen.\n"
+
+#: src/main.c:1011
+#, fuzzy
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp sledi povezavam FTP iz dokumentov HTML.\n"
+
+#: src/main.c:1013
+#, fuzzy
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=SEZNAM z vejico loèen seznam sledenim znaèkam "
+"HTML.\n"
+
+#: src/main.c:1015
+#, fuzzy
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=SEZNAM z vejico loèen seznam prezrtih znaèk "
+"HTML.\n"
+
+#: src/main.c:1017
+#, fuzzy
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts pri rekurziji pojdi tudi na druge "
+"gostitelje.\n"
+
+#: src/main.c:1019
+#, fuzzy
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative spremljaj samo relativne povezave.\n"
+
+#: src/main.c:1021
+#, fuzzy
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=SEZNAM seznam dovoljenih map.\n"
+
+#: src/main.c:1023
+#, fuzzy
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names uporabi ime doloèeno z zadnjo komponento "
+"preusmerjevalne povezavet.\n"
+
+#: src/main.c:1026
+#, fuzzy
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=SEZNAM seznam nedovoljenih map.\n"
+
+#: src/main.c:1028
+#, fuzzy
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ne pojdi v nadrejeno mapo.\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, neinteraktivno orodje za prejemanje preko mre¾e.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Geslo za uporabnika %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Geslo: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, fuzzy, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Geslo za uporabnika %s: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Jazikovno doloèilo: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Compile: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Povezava: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s grajen na %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (uporabnik)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistem)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, fuzzy, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Avtorske pravice (C) 2009 Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licenca GPLv3+: GNU GPL razlièice 3 ali poznej¹a\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"To je prosta programska oprema: lahko ga spreminjate in raz¹irjate.\n"
+"Programska oprema je BREZ VSAKEGA JAMSTVA, kolikor to dopu¹èa zakon.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Izvorni avtor: Hrvoje Nik¹iæ <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Po¹ljite poroèila o hro¹èih in vpra¹anja na <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Poskusite `%s --help' za veè mo¾nosti.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: nedovoljena mo¾nost -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Tihi in izèrpni naèin nista mogoèa istoèasno.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Istoèasno ni mogoèe dodajati èasovnih ¾igov in ne nenamerno prepisovati "
+"starih datotek.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ni mogoèe hkrati podati --inet4-only in --inet6-only.\n"
+
+#: src/main.c:1666
+#, fuzzy
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Ni mogoèe hkrati podati -k in -O, èe je podanih veè URL-jev, ali\n"
+"v kombinaciji s -p ali -r. Za podrobnosti si oglejte priroènik.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"OPOZORILO: zdru¾itev -O z -r ali -p bo pomenila, da se bo vsa prejeta "
+"vsebina\n"
+"vpisovala v eno samo datoteko, ki ste jo podali.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"OPOZORILO: èasovno ¾igosanje v kombinaciji z -O ne dela niè. Za podrobnosti "
+"si\n"
+"oglejte priroènik.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ni mogoèe doloèiti obeh --ask-password in --password hkrati.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: manjka URL\n"
+
+#: src/main.c:1836
+#, fuzzy, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Ni mogoèe doloèiti obeh --ask-password in --password hkrati.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, fuzzy, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Ni mogoèe hkrati podati --inet4-only in --inet6-only.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ta razlièica nima podpore za IRIs\n"
+
+#: src/main.c:2003
+#, fuzzy, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr "-k se lahko uporabi skupaj z -O samo, èe je izhod obièajna datoteka.\n"
+
+#: src/main.c:2009
+#, fuzzy, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr "-k se lahko uporabi skupaj z -O samo, èe je izhod obièajna datoteka.\n"
+
+#: src/main.c:2020
+#, fuzzy, c-format
+msgid "Failed to init libcares\n"
+msgstr "Ni bilo mogoèe odstraniti simbolne povezave %s: %s\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, fuzzy, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "%s: ni bilo mogoèe razre¹iti naslova gostitelja %s\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "V %s ni najdenega nobenega URL.\n"
+
+#: src/main.c:2213
+#, fuzzy, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ni bilo mogoèe izbrisati %s: %s\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, fuzzy, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"KONÈANO --%s--\n"
+"Prejeto: %d datotek, %s v %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Omejitev prejemanja %s je PREKORAÈENA!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, fuzzy, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Tuneliranje posredni¹kega stre¾nika je spodletelo: %s"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, fuzzy, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ni bilo mogoèe izbrisati %s: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, fuzzy, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Ni take datoteke %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+#, fuzzy
+msgid "No checksums found.\n"
+msgstr "Ni bilo najdenih potrdil\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, fuzzy, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Odstranjevanje %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Nadaljevanje v ozadju.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Nadaljevanje v ozadju, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Izhod bo zapisan v %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ni bilo mogoèe najti uporabnega gonilnika vtièa.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: opozorilo: ¾eton %s se pojavi pred vsakim imenom raèunalnika\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: neznan ¾eton \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Uporaba: %s NETRC [IME GOSTITELJA]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: ni mogoèe napraviti stat na %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "OPOZORILO: uporabljate ¹ibko seme za nakljuèna ¹tevila.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Ni bilo mogoèe ustvariti semena PRNG; razmislite o rabi --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: Neveljaven URL %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"Ni bilo mogoèe ustvariti semena PRNG; razmislite o rabi --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: ni bilo mogoèe preveriti potrdila %s, ki ga je izdal %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Istovetnosti izdajatelja krajevno ni bilo mogoèe preveriti.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Zaznano je bilo samopodpisano potrdilo.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Izdano potrdilo ¹e ni veljavno.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Izdano potrdilo je ¾e poteklo.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: ni ujemanj alternativnega imena potrdila\n"
+"\tzahtevano ime gostitelja %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: obièajno ime potrdila %s se ne ujema z zahtevanim imenom gostitelja "
+"%s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: Obièajno ime potrdila je neveljavno (vsebuje znak NUL).\n"
+" To je morda znamenje, da se gostitelj izdaja za drugega\n"
+" (to pomeni, da ni pravi %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Èe se ¾elite povezati z %s brez varnosti, uporabite --no-check-"
+"certificate`.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ preskakovanje %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Neveljavno doloèilo sloga pik %s; ostaja nespremenjeno.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, fuzzy, c-format
+msgid " eta %s"
+msgstr " pèp %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+#, fuzzy
+msgid " in "
+msgstr " v "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ni bilo mogoèe dobiti frekvence ure realnega èasa: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Odstranjevanje %s, saj bi moral biti zavrnjen.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ni bilo mogoèe odpreti %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Nalaganje robots.txt; prosim, prezrite napake.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Napaka med razèlenjevanjem URL posredni¹kega stre¾nika %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Napaka v URL posredni¹kega stre¾nika %s: Mora biti HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d preusmeritev je bilo prekoraèenih.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Opu¹èanje.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Ponovni poskus.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Ni najdenih pokvarjenih povezav.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Najdenih je bilo %d pokvarjenih povezav.\n"
+"\n"
+msgstr[1] ""
+"Najdena je bila %d pokvarjena povezava.\n"
+"\n"
+msgstr[2] ""
+"Najdeni sta bili %d pokvarjeni povezavi.\n"
+"\n"
+msgstr[3] ""
+"Najdene so bile %d pokvarjene povezave.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Brez napake"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Nepodprta shema %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Shema manjka"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Neveljavno ime gostitelja"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Slaba ¹tevilka vrat"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Neveljavno uporabni¹ko ime"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Neprekinjen ¹tevilski naslov IPv6"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Naslovi IPv6 niso podprti"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Neveljaven ¹tevilski naslov IPv6"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Podpora HTTPS ni vgrajena"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Zaznana je bila nepopolna ali neveljavna veèbajtna sekvenca\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Ni bilo mogoèe dodeliti dovolj pomnilnika; pomnilnik izèrpan.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Ni bilo mogoèe dodeliti %ld bajtov; zmanjkalo je pomnilnika.\n"
+
+#: src/utils.c:355
+#, fuzzy, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: medpomnilnik besedila je prevelik (%ld bajtov), prekinjanje.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Nadaljevanje v ozadju, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ni bilo mogoèe odstraniti simbolne povezave %s: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Ni bilo mogoèe odstraniti simbolne povezave %s: %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr ""
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr ""
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Ni bilo mogoèe odstraniti simbolne povezave %s: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, fuzzy, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Napaka med zapisovanjem v %s: %s\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, fuzzy, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Napaka med razèlenjevanjem potrdila: %s\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr ""
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+
+#~ msgid "Unknown system error"
+#~ msgstr "Neznana napaka sistema"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: mo¾nost '%s' je dvoumna\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: mo¾nost '--%s' ne dovoljuje argumenta\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: mo¾nost '%c%s' ne dovoljuje argumenta\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: mo¾nost '--%s' zahteva argument\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: neprepoznana mo¾nost '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: neprepoznana mo¾nost '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: neveljavna mo¾nost -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: mo¾nost zahteva argument -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: mo¾nost '-W %s' je dvoumna\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: mo¾nost '-W %s' ne dovoljuje argumenta\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: mo¾nost '-W %s' zahteva argument\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "memory exhausted"
+#~ msgstr "pomnilnik izèrpan"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Pooblastitev je spodletela.\n"
+
+#, c-format
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "Spodletel idn_decode (%d): %s\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s prejetih.\n"
+
+#~ msgid " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ msgstr " -w, --wait=SEKUNDE poèakaj SEKUND med prejemi.\n"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>.\n"
+#~ msgstr "Po¹iljajte poroèila o hro¹èih in predloge na <bug-wget@gnu.org>.\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Datoteka `%s' ¾e obstaja; prejemanje je preskoèeno.\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "OPOZORILO: Ni bilo mogoèe ponovno odpreti standardnega izhoda v binarnem "
+#~ "naèinu;\n"
+#~ " prejeta datoteka morda vsebuje neprimerne konce vrstic.\n"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: nedovoljena izbira -- %c\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL pripni URL pred relativne povezave v -F -i "
+#~ "datoteka.\n"
+
+#~ msgid "Currently maintained by Micah Cowan <micah@cowan.name>.\n"
+#~ msgstr "Trenutno vzdr¾uje: Micah Cowan <micah@cowan.name>.\n"
+
+#~ msgid "Cannot specify -r, -p or -N if -O is given.\n"
+#~ msgstr "Ni mogoèe doloèiti -r, -p ali -N hkrati z -O.\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy posebej vkljuèi posrednika.\n"
+
+#~ msgid ""
+#~ " --no-content-disposition don't honor Content-Disposition header.\n"
+#~ msgstr ""
+#~ " --no-content-disposition ne upo¹tevaj glave Content-Disposition.\n"
+
+#~ msgid "%s referred by:\n"
+#~ msgstr "na %s povezuje:\n"
diff --git a/po/sr.gmo b/po/sr.gmo
new file mode 100644
index 0000000..a3c3399
--- /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..50cb909
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,3706 @@
+# Serbian translation for wget.
+# Copyright © 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Filip Miletić <f.miletic@ewi.tudelft.nl>, 2003.
+# МироÑлав Ðиколић <miroslavnikolic@rocketmail.com>, 2012—2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget-1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-11-06 09:16+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"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: не могу да решим адреÑу везе „%s“; иÑкључујем везе.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Повезујем Ñе на %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Повезујем Ñе на %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Повезујем Ñе на [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "„setsockopt SO_RCVBUF“ није уÑпело: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "повезан Ñам.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "неуÑпех: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: не могу да разрешим адреÑу домаћина „%s“\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "„setsockopt SO_REUSEADDR“ није уÑпело: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Превише отворених опиÑника датотека. Ðе могу да кориÑтим бирање над "
+"опиÑником датотеке >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Претворене Ñу везе у %d датотеке за %s Ñекунде.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Претварам везе у „%s“... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ништа за рад.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ðе могу да претворим везе у „%s“: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ðе могу да обришем „%s“: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ðе могу да направим резерву за „%s“ као %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ðе могу да добавим колачиће за „%s“\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Садржајна грешка у подешавању колачића: %s на меÑту %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Колачић Ñа „%s“ је покушао да поÑтави домен на "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ðе могу да отворим датотеку колачића „%s“: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Грешка пиÑања у „%s“: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Грешка затварања „%s“: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+"Ð’Ñ€Ñта иÑпиÑа није подржана, покушавам Ñа обрађивачем ÑпиÑкова ЈуникÑа.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "СпиÑак за /%s на %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "непознато време "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Датотека "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Директоријум "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Веза "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Ðије Ñигурно "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s бајт(ов)(а))"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Дужина: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) је проÑтало"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s је проÑтало"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (није поуздано)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Ðе могу да покренем ССЛ. Биће иÑкључено.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Пријављујем Ñе као %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Грешка у одговору Ñа Ñервера, затварам контролну везу.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Грешка у поздравној поруци Ñа Ñервера.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Ð£Ð¿Ð¸Ñ Ð½Ð¸Ñ˜Ðµ уÑпео, затварам контролну везу.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Сервер не дозвољава пријаву.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Пријава није иÑправна.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Пријављен Ñам!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Сервер не прихвата наредбу „PBSZ 0“.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Сервер не прихвата наредбу „PROT %c“.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Грешка Ñервера, не може утврдити врÑту ÑиÑтема.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "обављено. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "готово.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Ðепозната врÑта „%c“, затварам контролну везу.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "обављено. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> ЦВД није потребан.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Стигох до логички немогућег одељка у „getftp()“"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"прд_број: %d\n"
+"прд_почетак: %d\n"
+"прд_крај: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Ðе поÑтоји директоријум „%s“.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> „CWD“ није потребан.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Датотека је већ преузета.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ðе могу да покренем ПÐСВ преноÑ.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Ðе могу да обрадим ПÐСВ одговор.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "не могу да Ñе повежем на „%s“ прикључак %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Грешка повезивања (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "ÐеиÑправан ПРИКЉУЧÐК.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"„REST“ није уÑпео, почињем из почетка.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Датотека „%s“ поÑтоји.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Ðема такве датотеке „%s“.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Ðема такве датотеке „%s“.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Ðе поÑтоји таква датотека или директоријум „%s“.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "„%s“ је изникло у поÑтојање.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, затварам контролну везу.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) — Веза података: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Затворена је контролна веза.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "ÐŸÑ€ÐµÐ½Ð¾Ñ Ð¿Ð¾Ð´Ð°Ñ‚Ð°ÐºÐ° је прекинут.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Датотека „%s“ већ поÑтоји; нећу је преузети.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(пробајте:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — запиÑано у Ñтандардни излаз %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — %s је Ñачувано [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Уклањам „%s“.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "КориÑтим „%s“ као привремену датотеку за ÑпиÑак.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Уклонио Ñам „%s“.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Дубина рекурзије %d је премашила највећу дубину од %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Удаљена датотека није новија од локалане „%s“ -- нећу преузети.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Удаљена датотека је новија од локалане „%s“ -- преузећу.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Величине Ñе не поклапају (локална %s) -- преузимам.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "ÐеиÑправан назив Ñимболичке везе, преÑкачем.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Већ имам иÑправну Ñимболичку везу %s —> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Правим Ñимболичку везу %s —> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Симболичке везе ниÑу подржане, преÑкачем Ñимболичку везу „%s“.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ПреÑкачем директоријум „%s“.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: непозната/неподржана врÑта датотеке.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "ÐиÑам уÑпео да подеÑим овлашћења за „%s“.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: оштећена временÑка ознака.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Ðећу преузети директоријуме пошто је дубина %d (највише %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ðе Ñпуштам Ñе у „%s“ пошто је иÑкључен/занемарен.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Одбијам „%s“.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Одбијам „%s“ (ÐеиÑправан уноÑ).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "„%s“ је иÑкључен/није-укључен кроз регизраз.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Грешка упоређивања „%s“ Ñа „%s“: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ðема подударања Ñа шаблоном „%s“.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "ЗапиÑах ХТМЛ-изован Ð¸Ð½Ð´ÐµÐºÑ Ñƒ „%s“ [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "ЗапиÑах ХТМЛ-изован Ð¸Ð½Ð´ÐµÐºÑ Ñƒ „%s“.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ГРЕШКÐ: Ðе могу да отворим директоријум „%s“.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ГРЕШКÐ: ÐиÑам уÑпео да отворим уверење „%s“: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Учитао Ñам ЦРуверење „%s“\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ГРЕШКÐ: ÐиÑам уÑпео да учитам ЦРЛ датотеку „%s“: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Учитао Ñам ЦРЛ датотеку „%s“\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "ГРЕШКÐ: ГнуТЛС захтева кључ и уверење да би био иÑте врÑте.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Ваше издање ГнуТЛС-а је превише Ñтаро да подржи ТЛС 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "ГнуТЛС: непримењена вредноÑÑ‚ %u опције „secure-protocol“\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "ИзвеÑтите о овом проблему на „bug-wget@gnu.org“\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "ГнуТЛС: непримењена вредноÑÑ‚ %d опције „secure-protocol“\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"ГнуТЛС: Ðе могу непоÑредно да подеÑим ниÑку приоритета. Враћам Ñе на "
+"подразумевани приоритет.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ГРЕШКÐ"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "УПОЗОРЕЊЕ"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s није приказао уверење.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Уверење од „%s“ није поуздано.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Уверење „%s“ нема познатог издавача.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Уверење од „%s“ је опозвано.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: ПотпиÑник уверења за „%s“ није издавач уверења.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Уверење „%s“ је потпиÑано неÑигурним алгоритмом.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Уверење „%s“ још није покренуто.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Уверење „%s“ је иÑтекло.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Грешка покретања уверења X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "ÐиÑам пронашао уверење\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Грешка анализирања уверења: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Уверење још увек није активирано\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Уверење је иÑтекло\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "ВлаÑник уверења не одговара називу домаћина „%s“\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Јавни кључ не одговара прикаченом јавном кључу!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Уверење мора бити X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Грешка руковања ÑпиÑком адреÑа.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ðепознат домаћин"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Привремени неуÑпех одређивања имена"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ðепозната грешка"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Тражим „%s“... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "неуÑпех: Ðема ИПв4/ИПв6 адреÑа за домаћина.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "неуÑпех: време је иÑтекло.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Ðе могу да одредим непотпуну везу „%s“.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"нађох атрибут не-праћења у „%s“. Ðећу пратити ниједну везу на овој Ñтраници\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: ÐеиÑправна адреÑа „%s“: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "ÐиÑам уÑпео да запишем ХТТП захтев: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Ðема заглавља, подразумевам ХТТП/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Датотека „%s“ већ поÑтоји; нећу је преузети.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "„gmtime“ није уÑпео. Ово је вероватно грешка.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ðе могу да претворим ознаку времена у хттп запиÑ. Пребацујем Ñе на време 0 "
+"као време поÑледње измене.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Датотека података „BODY“ „%s“ недоÑтаје: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Поново кориÑтим поÑтојећу везу Ñа [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Поново кориÑтим поÑтојећу везу Ñа %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "ÐиÑам уÑпео да прочитам одговор поÑредника: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ГРЕШКР%d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ÐеиÑправна трака Ñтања"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "ÐеуÑпело тунелиÑање поÑредника: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ðачин потврђивања идентитета није познат.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Изабрано је потврђивање идентитета: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Чувам у: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Приликом преузимања потпиÑа:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Ðе могу да прочитам Ñадржај потпиÑа из привремене датотеке. ПреÑкачем.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+"Ðе могу да направим привремену датотеку. ПреÑкачем преузимање потпиÑа.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "ÐеиÑправна вредноÑÑ‚ при. Подразумевам „%d“.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Ðе могу да нађем прихватљиви одабир за изворишта мета везе.\n"
+"Занемарујем их.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "ИÑкључујем ССЛ због грешака.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "„%s“ захтев је поÑлат, чекам одговор... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "ÐиÑу примљени никакви подаци.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Грешка читања (%s) у заглављима.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(нема опиÑа)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "МеÑто: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "није наведено"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [пратим]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Датотека „%s“ није измењена на Ñерверу. ИзоÑтављам преузимање.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Сервер је занемарио заглавље „Ðко-је-измењен-од“ за датотеку „%s“.\n"
+"Можда ћете желети да додате опцију „--no-if-modified-since“.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Датотека је већ преузета у целини; неће бити поново преузета.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Дужина: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "занемарено"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Упозорење: џокер знаци Ñе не кориÑте за ХТТП.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Укључен је режим паука. Проверавам да ли поÑтоји удаљена датотека.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Ðе могу пиÑати у „%s“ (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Ðеопходан атрибут недоÑтаје у примљеном заглављу.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Ðије уÑпело потврђивање идентитета кориÑничког имена/лозинке.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ðе могу да пишем у Ð’ÐРЦ датотеку.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ðе могу да пишем у привремену Ð’ÐРЦ датотеку.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ðе могу да уÑпоÑтавим ССЛ везу.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Ðе могу да поништим везу „%s“ (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ГРЕШКÐ: ПреуÑмерење (%d) нема одредиште.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Ðе могу да пронађем податке мета везе у ХТТП одговору. Преузимам датотеку "
+"кориÑтећи „HTTP GET“.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Ðађох заглавља мета везе. Пребацујем на режим мета везе.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Удаљена датотека не поÑтоји -- оштећена веза!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+"Заглавље датума поÑледње измене недоÑтаје -- бележење времена је иÑкључено.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+"Заглавље датума поÑледње измене је неиÑправно -- бележење времена је "
+"занемарено.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Датотека на Ñерверу није новија од локалне датотеке „%s“ -- не преузимам.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Величине Ñе не поклапају (локална %s) -- преузимам.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Удаљена датотека је новија, преузимам.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Удаљена датотека поÑтоји и можда Ñадржи везе до других извора -- преузимам.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Удаљена датотека поÑтоји али не Ñадржи ниједну везу -- не преузимам.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Удаљена датотека поÑтоји и можда Ñадржи додатне везе,\n"
+"али дубачење је иÑкључено -- не преузимам.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Удаљена датотека поÑтоји.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s адреÑа: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — запиÑано у Ñтандардни излаз %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — %s је Ñачувано [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) — Веза је затворена при бајту %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) — Грешка читања при бајту %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) — Грешка читања при бајту %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Ðеподржан квалитет заштите „%s“.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Ðеподржан алгоритам „%s“.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: ВГЕТРЦ указује на „%s“, коме Ñе не може приÑтупити због грешке: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ðе могу да прочитам %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Грешка у „%s“ у реду %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Садржајна грешка у „%s“ у реду %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Ðепозната наредба „%s“ у „%s“ у реду %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Обрада ÑиÑтемÑке вгетрц датотеке није уÑпела (енв СИСТЕМ_ВГЕТРЦ). Молим "
+"проверите\n"
+"„%s“,\n"
+"или наведите другачију датотеку кориÑтећи „--config“.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Обрада ÑиÑтемÑке вгетрц датотеке није уÑпела. Молим проверите\n"
+"„%s“,\n"
+"или наведите другачију датотеку кориÑтећи „--config“.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Упозорење: И ÑиÑтемÑки и кориÑников вгетрц указују на „%s“.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: ÐеиÑправна наредба „--execute“ „%s“\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: ÐеиÑправна Булова вредноÑÑ‚ „%s“, кориÑтите „on“ или „off“.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: ÐеиÑправно „%s“, кориÑтите „on“, „off“ или „quiet“.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: ÐеиÑправан број „%s“.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: „%s“ мора бити коришћено Ñамо једном\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: ÐеиÑправна вредноÑÑ‚ бајта „%s“\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: ÐеиÑправно временÑко раздобље „%s“\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Ðегативно временÑко раздобље „%s“\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"„use-askpass“ захтева да ниÑка или променљива окружења „WGET_ASKPASS“ или "
+"„SSH_ASKPASS“ буде подешена.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: ÐеиÑправна вредноÑÑ‚ „%s“.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: ÐеиÑправно заглавље „%s“.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: ÐеиÑправно Ð’ÐРЦ заглавље „%s“.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: ÐеиÑправна врÑта напредовања „%s“.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: ÐеиÑправно ограничење „%s“,\n"
+" кориÑтите [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "„%s“ кодирање није иÑправно\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Претварање из „%s“ у „%s“ није подржано\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Ðепотпун или неиÑправан вишебајтни низ\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Ðемогућа грешка бр. %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "„locale_to_utf8“: локале је неподешено\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "„idn_encode“ није уÑпело (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "ÐиÑам уÑпео да претворим у ниже: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"ПреуÑмеравам излаз на „%s“.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; иÑкључујем дневник.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Употреба: %s [ОПЦИЈÐ]... [ÐДРЕСÐ]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Обавезни аргументи за дуге опције Ñу обавезни и за кратке опције такође.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Покретање:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version приказује издање програма и излази\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help приказује ову помоћ\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background одлази у позадину након покретања\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=ÐÐРЕДБРизвршава наредбу „.wgetrc“-Ñтила\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Пријављивање и улазна датотека:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+" -o, --output-file=ДÐТОТЕКРзапиÑује поруке дневника у ДÐТОТЕКУ\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=ДÐТОТЕКРкачи поруке у ДÐТОТЕКу\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d --debug иÑпиÑује доÑта података за уклањање "
+"грешака\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug иÑпиÑује „Watt-32“ излаз за уклањање "
+"грешака\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet нечујно (без излаза)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose опширан Ñа излазом (ово је оÑновно "
+"понашање)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose иÑкључује опширноÑÑ‚, а да није нечујан\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=ВРСТРиÑпиÑује пропуÑни опÑег као ВРСТУ. "
+"ВРСТРмогу бити битови\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=ДÐТОТЕКРпреузима адреÑе пронађене у меÑној или "
+"Ñпољној ДÐТОТЕЦИ\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=ДÐТОТЕКРпреузима датотеке покривене у меÑној "
+"ДÐТОТЕЦИ мета везе\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html Ñматра улазну датотеку као ХТМЛ\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=ÐДРЕСРрешава ХТМЛ везе улазне датотеке (-i -"
+"F)\n"
+" које Ñе одноÑе на ÐДРЕСУ\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=ДÐТОТЕКРнаводи датотеку подешавања за "
+"коришћење\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config не чита ниједну датотеку подешавања\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=ДÐТОТЕКРбележи разлоге одбијања адреÑе у "
+"ДÐТОТЕКУ\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Преузимање:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=БРОЈ поÑтавља број покушаја на БРОЈ (0 за "
+"неограничено)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused покушаће поново чак и када је веза "
+"одбијена\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ГРЕШКЕ зарезом раздвојен ÑпиÑак ХТТП грешака "
+"за поновно покушавање\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=ДÐТОТЕКРзапиÑује документе у ДÐТОТЕКУ\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber преÑкаче преузимања која би преузео у\n"
+" поÑтојеће датотеке (препиÑујући их)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc не покушава да добије уверења од „."
+"netrc“\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue наÑтавља Ñа добављањем делимично "
+"преузете датотеке\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=ПОМЕРÐЈ почиње преузимање од положаја ПОМЕРÐЈР"
+"нулте оÑнове\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=ВРСТРбира врÑту опÑега напредовања\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress приказује траку напредовања у било ком "
+"режиму опширноÑти\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping не преузима поново датотеке оÑим ако "
+"ниÑу новије\n"
+" од меÑних\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since не кориÑти уÑловноÑÑ‚ „ако-је-измењено-"
+"од“\n"
+" добавља захтеве у режиму временÑког "
+"означавања\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps не подешава временÑку ознаку меÑне "
+"датотеке\n"
+" оном на Ñерверу\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response иÑпиÑује одговор Ñервера\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider не преузима ништа\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=СЕКУÐДИ подешава Ñве вредноÑти временÑког "
+"иÑтека на СЕКУÐДЕ\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ÐДРЕСЕ ÑпиÑак ДÐС Ñервера за пропитивање "
+"(раздвојених зарезом)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ÐДРЕСРповезује ДÐС решавача Ñа ÐДРЕСОМ (назив "
+"домаћина или ИП) на локалном рачунару\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=СЕКУÐДИ подешава временÑки иÑтек ДÐС понављања "
+"на СЕКУÐДЕ\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=СЕКУÐДИ подешава временÑки иÑтек повезивања на "
+"СЕКУÐДЕ\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=СЕКУÐДИ подешава временÑки иÑтек читања на "
+"СЕКУÐДЕ\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=СЕКУÐДИ чека СЕКУÐДЕ између довлачења\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=СЕКУÐДЕ чека 1..СЕКУÐДЕ између покушаја "
+"довлачења\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait чека од 0.5*ЧЕКÐЈ...1.5*ЧЕКÐЈ Ñекунде "
+"између довлачења\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy изричито иÑкључује поÑредника\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=БРОЈ поÑтавља квоту довлачења на БРОЈ\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ÐДРЕСРповезује Ñе на ÐДРЕСУ (назив домаћина "
+"или ИП) на локалном рачунару\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=БРЗИÐРограничава проток преузимања на БРЗИÐУ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache иÑкључује привремени Ñмештај ДÐС "
+"понављања\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=ОС ограничава знаке у називима датотека на "
+"допуштене ОС-ом\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case занемарује величину Ñлова приликом "
+"упоређивања датотека/директоријума\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only повезује Ñе Ñамо на ИПв4 адреÑе\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only повезује Ñе Ñамо на ИПв6 адреÑе\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=ПОРОДИЦРповезује Ñе прво на адреÑе наведене "
+"породице,\n"
+" на ИПв6, ИПв4, или ништа\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=КОРИСÐИК поÑтавља и фтп и хттп кориÑника на "
+"КОРИСÐИКÐ\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=ЛОЗИÐКРпоÑтавља и фтп и хттп лозинку на "
+"ЛОЗИÐКУ\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password пита за лозинке\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=ÐÐРЕДБРнаводи руковаоца акредитивима да би "
+"тражио \n"
+" кориÑничко име и лозинку. Ðко ниједна "
+"ÐÐРЕДБРније \n"
+" наведена кориÑти Ñе променљива "
+"окружења \n"
+" „WGET_ASKPASS“ или „SSH_ASKPASS“.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri иÑкључује ИРИ подршку\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=КОДИРÐЊЕ кориÑти КОДИРÐЊЕ као локално кодирање "
+"за ИРИ-је\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=КОДИРÐЊЕ кориÑти КОДИРÐЊЕ као оÑновно удаљено "
+"кодирање\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink уклања датотеку пре препиÑивања\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash задржава датотеке Ñа неодговарајућом "
+"Ñумом провере (придодаје „.badhash“)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=БРОЈ Метавеза програм/метавеза4+икÑмл "
+"метаурл редни број БРОЈ\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http кориÑти метаподатке мета везе из "
+"заглавља ХТТП одговора\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location жељено меÑто за изворишта мета везе\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr укључује Ñмештање метаподатака у "
+"проширеним атрибутима датотеке\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Директоријуми:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories не Ñтвара директоријуме\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+" -x, --force-directories приморава Ñтварање директоријума\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories не Ñтвара директоријуме домаћина\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories кориÑти назив протокола у "
+"директоријумима\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=ПРЕФИКС чува датотеке у ПРЕФИКС/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=БРОЈ занемарује БРОЈ делова удаљеног "
+"директоријума\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "ХТТП опције:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=КОРИСÐИК поÑтавља хттп кориÑника на КОРИСÐИКÐ\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=ЛОЗИÐКРпоÑтавља хттп лозинку на ЛОЗИÐКУ\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache онемогућава податке причуване Ñервером\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=ÐÐЗИВ мења оÑновни назив Ñтранице (обично\n"
+" је то „index.html“.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension чува ХТМЛ/ЦСС документа Ñа ÑопÑтвеним "
+"проширењима\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length занемарује поље заглавља „Content-"
+"Length“ (величина-Ñадржаја)\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=ÐИСКРумеће ÐИСКУ у заглавља\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=ВРСТРбира Ñажимање, ауто, „gzip“ или ништа. "
+"(оÑновно: ништа)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect највише преуÑмеравања допуштених по "
+"Ñтраници\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=КОРИСÐИК поÑтавља КОРИСÐИКРза кориÑничко име "
+"поÑредника\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=ЛОЗИÐКРпоÑтавља ЛОЗИÐКУ за лозинку поÑредника\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=ÐДРЕСРукључује заглавље „Referer: ÐДРЕСГ у "
+"ХТТП захтев\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers чува ХТТП заглавља у датотеку\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ÐГЕÐТ претÑтавља Ñе као ÐГЕÐТ умеÑто Вгет/"
+"ИЗДÐЊЕ\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive иÑкључује ХТТП одржи-живим (трајне "
+"везе)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies не кориÑти колачиће\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=ДÐТОТЕКРучитава колачиће из ДÐТОТЕКЕ пре "
+"ÑеÑије\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=ДÐТОТЕКРчува колачиће у ДÐТОТЕКУ након ÑеÑије\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies учитава и чува (не-поÑтојане) колачиће "
+"ÑеÑије\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=ÐИСКРкориÑти ПОСТ начин; шаље ÐИСКУ као "
+"податке\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=ДÐТОТЕКРкориÑти ПОСТ начин; шаље Ñадржај "
+"ДÐТОТЕКЕ\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=ХТТПÐачин кориÑти начин „ХТТПÐачин“ у захтеву\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=ÐИСКРшаље ÐИСКУ као податке. „--method“ МОРР"
+"бити подешен\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=ДÐТОТЕКРшаље Ñадржаје ДÐТОТЕКЕ. „--method“ МОРР"
+"бити подешен\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition поштује „Content-Disposition“ заглавље "
+"када\n"
+" бира називе меÑних датотека (ПРОБÐО)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error иÑпиÑује примљени Ñадржај на грешкама "
+"Ñервера\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge шаље оÑновне податке ХТТП потврде "
+"идентитета\n"
+" а да прво не чека за изазовом\n"
+" Ñервера\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "ХТТПС (ССЛ/ТЛС) опције:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=ПР бира безбедни протокол, ÑамоÑтално, "
+"ССЛи2,\n"
+" ССЛи3, ТЛСи1, ТЛСи1_1, ТЛСи1_2 и ПФС\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only прати Ñамо безбедне ХТТПС везе\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate не оверава уверење Ñервера\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=ДÐТОТЕКРдатотека уверења клијента\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=ВРСТРврÑта уверења клијента, ПЕМ или ДЕР\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=ДÐТОТЕКРдатотека личног кључа\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=ВРСТРврÑта личног кључа, ПЕМ или ДЕР\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=ДÐТОТЕКРдатотека Ñа Ñвежњом издавача уверења\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=ДИР директоријум у коме Ñе чува ÑпиÑак "
+"издавача уверења\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=ДÐТОТЕКРдатотека Ñа Ñвежњом издавача уверења\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=ДТТКÐ/ХЕШОВИ Датотека јавног кључа (ПЕМ/ДЕР), или "
+"било који број\n"
+" „sha256“ хешева кодираних у оÑнови-64 "
+"иÑпред којих иде\n"
+" „sha256//“ раздвојених „;“, за проверу\n"
+" парњака\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=ДÐТОТЕКРдатотека Ñа наÑумичним подацима за "
+"Ñејање ССЛ ПРÐГ-а\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=ДÐТОТЕКРдатотека која именује ЕГД прикључницу "
+"наÑумичним подацима\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=ÐИСКРПоÑтавља ниÑку приоритета (ГнуТЛС) или "
+"ниÑку ÑпиÑка шифрера (ОпенССЛ) непоÑредно.\n"
+" КориÑтите уз опрез. Ова опција "
+"препиÑује „--secure-protocol“.\n"
+" Ð—Ð°Ð¿Ð¸Ñ Ð¸ ÑинтакÑа ове Ñтринге завиÑи од "
+"Ñпецифичног ССЛ/ТЛС погона.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "ХСТС опције:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts иÑкључује ХСТС\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file путања ХСТС базе података (препиÑаће "
+"оÑновно)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "ФТП опције:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf КориÑти „Stream_LF“ формат за Ñве "
+"бинарне ФТП датотеке\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=КОРИСÐИК поÑтавља фтп кориÑника на КОРИСÐИКÐ\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=ЛОЗИÐКРпоÑтавља фтп лозинку на ЛОЗИÐКУ\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing не уклања „.listing“ датотеке\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob иÑкључије угрушавање назива ФТП "
+"датотека\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp иÑкључује „неактиван“ режим преноÑа\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions задржава овлашћења удаљене датотеке\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks приликом дубачења, добавља везане-на "
+"датотеке (не директоријуме)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "ФТПС опције:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit кориÑти изричито ФТПС (оÑновни "
+"прикључник је 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl наÑтавља Ñа ССЛ/ТЛС ÑеÑијом започетом у "
+"управљачкој вези приликом\n"
+" отварања везе података\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection шифрује Ñамо канал управљања; Ñви "
+"подаци биће обичан текÑÑ‚\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp враћање на ФТП ако је ФТПС није "
+"подржано на циљном Ñерверу\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Ð’ÐРЦ опције:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=ÐÐЗИВ ДÐТОТЕКЕ чува податке захтева/одговора у „.warc."
+"gz“ датотеку\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=ÐИСКРумеће ÐИСКУ у варцинфо запиÑ\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=БРОЈ поÑтавља највећу величину Ð’ÐРЦ датотека "
+"на БРОЈ\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+" --warc-cdx запиÑује датотеке Ð¦Ð”Ð˜ÐºÑ Ñ€ÐµÐ³Ð¸Ñтра\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=ÐÐЗИВ ДÐТОТЕКЕ не Ñкладишти запиÑе наведене у овој "
+"Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÑ†Ð¸\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression не Ñажима Ð’ÐРЦ датотеке ГЗИП-ом\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests не прорачунава СХÐ1 збирке\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log не Ñкладишти датотеку дневника у Ð’ÐРЦ "
+"запиÑ\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=ДИРЕКТОРИЈУМ меÑто за привремене датотеке које "
+"направи\n"
+" пиÑац Ð’ÐРЦ\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "ДубинÑко преузимање:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive наводи дубинÑко преузимање\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=БРОЈ највећа дубина дубачења („inf“ или 0 за "
+"неограничено)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after брише датотеке локално након њиховог "
+"преузимања\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links прави везе у преузетом ХТМЛ-у или ЦСС-у "
+"које указују\n"
+" на меÑне датотеке\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only претвара Ñамо део датотеке адреÑа "
+"(обично познато као назив оÑнове)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N пре запиÑивања датотеке „X“, окреће Ñе "
+"на N датотека резерве\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted пре претварања датотеке „X“, прави "
+"резерву „X_orig“\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted пре претварања датотеке „X“, прави "
+"резерву „X.orig“\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror Ñкраћеница за „-N -r -l inf --no-remove-"
+"listing“\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites добавља Ñве Ñлике, итд. неопходне за "
+"приказ ХТМЛ Ñтранице\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments укључује изрично (СГМЛ) руковање ХТМЛ "
+"напоменама\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "ДубинÑко прихвати/одбиј:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=СПИСÐК зарезом одвојени ÑпиÑак прихваћених "
+"проширења\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=СПИСÐК зарезом одвојени ÑпиÑак одбијених "
+"проширења\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=РЕГИЗРÐЗ регуларан израз који одговара "
+"прихваћеним адреÑама\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=РЕГИЗРÐЗ регуларан израз који одговара одбијеним "
+"адреÑама\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=ВРСТРврÑта регуларног израза (поÑикÑ|пцре)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+" --regex-type=ВРСТРврÑта регуларног израза (поÑикÑ)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=СПИСÐК зарезом одвојени ÑпиÑак прихваћених "
+"домена\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=СПИСÐК зарезом одвојени ÑпиÑак одбијених "
+"домена\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp прати ФТП везе из ХТМЛ докумената\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=СПИСÐК зарезом одвојени ÑпиÑак праћених ХТМЛ "
+"ознака\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=СПИСÐК зарезом одвојени ÑпиÑак занемарених "
+"ХТМЛ ознака\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts иде на Ñтране домаћине приликом "
+"дубачења\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative прати релативне везе Ñамо\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=СПИСÐК ÑпиÑак допуштених директоријума\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names кориÑти назив наведен поÑледњом "
+"компонентом\n"
+" адреÑе преуÑмеравања\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=СПИСÐК ÑпиÑак иÑкључених директоријума\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent не допире до родитељÑког директоријума\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Извештаје о грешкама, питања, раÑправу пошаљите на <bug-wget@gnu.org>\n"
+"и/или отворите тему на „https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget“.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "ГÐУ Вгет %s, програм за не-узајамно преузимање датотека.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Лозинка за кориÑника „%s“: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Лозинка: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ðе могу да направим Ñпојку\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Грешка покретања радњи израђања датотеке за „use-askpass“: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Грешка подешавања радњи израђања датотеке за „use-askpass“: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Грешка читања одговора из наредбе „%s %s“: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "КориÑничко име за „%s%s“: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Лозинка за „%s%s@%s“: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Вгетрц: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Локалитет: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "СаÑтављен: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Веза: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"ГÐУ Вгет %s изграђен %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (окруж)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (кориÑник)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (ÑиÑтем)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "ÐуторÑка права © %s Задужбина Ñлободног Ñофтвера, Доо.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Дозвола ОЈЛв3+: ГÐУ ОЈЛ издање 3 или новије\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Ово је Ñлободан Ñофтвер: Ñлободни Ñте да га мењате и раÑподељујете.\n"
+"Ðе поÑтоји ÐИКÐКВРГÐРÐÐЦИЈÐ, у оквирима дозвољеним законом.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Првобитни аутор је Хрвоје Ðикшић <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "Питања и извештаје о грешкама шаљите на <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Проблем раÑподеле меморије\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Излазим због грешке у „%s“\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Покушајте „%s --help“ за више могућноÑти.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: неиÑправна опција -- „-n%c“\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Подршка прочишћавања није преведена. Занемарујем опцију „--debug“.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"И „--no-clobber“ и „--convert-links“ Ñу наведени, Ñамо „--convert-links“ ће "
+"бити коришћено.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"И „--no-clobber“ и „--convert-file-only“ Ñу наведени, Ñамо „--convert-file-"
+"only“ ће бити коришћено.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Ðије могуће бити нечујан и опширан у иÑто време.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Ðије могуће променити временÑке ознаке без промене Ñтарих датотека у иÑто "
+"време.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ðије могуће навеÑти и „--inet4-only“ и „--inet6-only“.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Ðије могуће навеÑти и „-k“ или „--convert-file-only“ и „-O“ ако је дато више "
+"адреÑа, или у комбинацији\n"
+"Ñа „-p“ или „-r“. Погледајте упутÑтво за детаље.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"УПОЗОРЕЊЕ: комбиновање „-O“ Ñа „-r“ или „-p“ ће значити да ће Ñав преузети "
+"Ñадржај\n"
+"бити Ñмештен у једну датотеку коју Ñте навели.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"УПОЗОРЕЊЕ: временÑко означавање не ради ништа у комбинацији Ñа „-O“. "
+"Погледајте\n"
+"упутÑтво за појединоÑти.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Ð’ÐРЦ излаз не ради Ñа опцијом „--no-clobber“, „--no-clobber“ ће бити "
+"иÑкључено.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Ð’ÐРЦ излаз не ради Ñа временÑким означавањем, иÑто ће бити иÑкључено.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Ð’ÐРЦ излаз не ради Ñа опцијом „--spider“.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Ð’ÐРЦ излаз не ради Ñа опцијом „--continue“, „--start-pos“ ће бити "
+"иÑкључено.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Збирке Ñу иÑкључене; Ð’ÐРЦ-ове поништавање удвоÑтрученÑоти неће наћи "
+"удвоÑтручене запиÑе.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Сажимање не ради Ñа опцијама „--continue“ или „--start-pos“, биће "
+"иÑкључене.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Ðије могуће навеÑти и „--ask-password“ и „--password“.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Ðавођење и „--start-pos“ и „--continue“ Ñе не препоручује; „--continue“ биће "
+"иÑкључено.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: недоÑтаје адреÑа\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Ðе можете навеÑти и „--post-data“ и „--post-file“.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Ðе можете да кориÑтите „--post-data“ или „--post-file“ уз „--method“. „--"
+"method“ очекује податке кроз „--body-data“ и „--body-file“\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Морате да наведете начин кроз „--method=ХТТПÐачин“ да кориÑтите Ñа „--body-"
+"data“ или „--body-file“.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Ðе можете навеÑти и „--body-data“ и „--body-file“.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Ово издање нема подршку за ИРИ-је\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"„-k“ или „-r“ може бити коришћено Ñа „-O“ Ñамо ако даје резултат у регуларну "
+"датотеку.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"„--convert-links“ или „--convert-file-only“ Ñе могу кориÑтити заједно Ñамо "
+"ако резултат иде у регуларну датотеку.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "ÐиÑам уÑпео да покренем „libcares“\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "ÐиÑам уÑпео да покренем „c-ares“ канал\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "ÐиÑам уÑпео да обрадим ИП адреÑу „%s“\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "ÐиÑам уÑпео да поÑтавим ДÐС Ñервер(е) „%s“ (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "ÐиÑам пронашао адреÑе у „%s“.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ðе могу да обрадим датотеку мета везе „%s“.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ðе могу да преузмем Ñва изворишта Ñа „%s“.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ЗÐВРШЕÐО --%s--\n"
+"Укупно време: %s\n"
+"Преузетих датотека: %d, %s за %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "ПРЕМÐШЕРје лимит преузимања од %s!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "„-O“ није подржано за преузимање мета везе. Занемарујем.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Планирана датотека метавезе: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Обезбеђена датотека метавезе: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Одбијам датотеку метавезе. ÐеÑигуран назив.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Обрађујем мета адреÑу „%s“...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Одбијам датотеку мета адреÑе „%s“. ÐеÑигуран назив.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "ÐиÑам уÑпео да преузмем „%s“. ПреÑкачем мета адреÑу.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ðе могу да обрадим датотеку мета адреÑе „%s“.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Обрада мета адреÑа је дала грешке.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Ð’Ñ€Ñта изворишта „%s“ није подржана, занемарујем...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Ðе могу да отворим преузету датотеку.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Израчунавам величину за „%s“\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Величина датотеке није пријављена. ПреÑкачем проверу.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Ðе могу да добавим величину преузете датотеке.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Величин не одговара за датотеку „%s“.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Величина не одговара.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Израчунавам Ñуму провере за „%s“\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Сума провере одговара.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Сума провере не одговара за датотеку „%s“.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Ðе могу да отворим преузету датотеку да бих проверио потпиÑ.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "ГПГМЕ „data_new_from_mem“: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "ГПГМЕ „op_verify“: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "ГПГМЕ „op_verify_result“: ÐИШТÐ\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Провера потпиÑа је уÑпела.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "ÐеиÑправан потпиÑ. Одбацујем извориште.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Подаци одговарају потпиÑу, али Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð½Ð¸Ñ˜Ðµ од поверења.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "ÐиÑам пронашао Ñуме провере.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "ÐиÑам уÑпео да преузмем „%s“. ПреÑкачем извориште.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Датотека „%s“ је преузета али величина не одговара. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Датотека „%s“ је преузета али Ñума провере не одговара. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Датотека „%s“ је преузета али Ð¿Ð¾Ñ‚Ð¿Ð¸Ñ Ð½Ðµ одговара. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Преименујем „%s“ у „%s“.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "ÐаÑтављам у позадини.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "ÐаÑтављам рад у позадини, пид %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Резултат ће бити запиÑан у „%s“.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "није уÑпело „fake_fork_child()“\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "није уÑпело „fake_fork()“\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Ðе могу да пронађем пригодан уређај за утичницу.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+"није уÑпело „ioctl()“. Прикључница не може бити подешена као блокирајућа.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: упозорење: текÑÑ‚ „%s“ Ñе појављује пре било ког назива машине\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: непознат Ñимбол „%s“\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Употреба: %s NETRC [РÐЧУÐÐР]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: не могу да добавим податке за %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "УПОЗОРЕЊЕ: кориÑтим Ñлабо наÑумично Ñеме.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Ðе могу да Ñејем ПРÐГ; размотрите употребу „--random-file“.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Ваше издање ОпенССЛ-а је превише Ñтаро да подржи ТЛС 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Ваше издање ОпенССЛ-а је превише Ñтаро да подржи ТЛСи1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Ваше издање ОпенССЛ-а је превише Ñтаро да подржи ТЛСи1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "ОпенССЛ: непримењена вредноÑÑ‚ %d опције „secure-protocol“\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "ОпенССЛ: ÐеиÑправан ÑпиÑак шифрера: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "ОпенССЛ: ÐиÑам уÑпео да поÑтавим поверење на делимични ланац\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "Опен ССЛ: ÐиÑам уÑпео да доделим параметар потврђивања\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"УПОЗОРЕЊЕ: Ðе могу да Ñејем ПРÐГ. Размотрите употребу опције „--random-"
+"file“.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: не могу да проверим %s уверење, које је издао „%s“:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Ðе могу у локалу да проверим надлештво издавача.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Пронађох ÑамопотпиÑано уверење.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Издато уверење још није важеће.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Издато уверење је иÑтекло.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: ниједан други назив предмета уверења не одговара\n"
+" затраженом називу домаћина „%s“.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: општи назив уверења „%s“ не одговара затраженом називу домаћина "
+"„%s“.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: општи назив уверења је неиÑправан (Ñадржи ÐИШТÐÐ’ÐРзнак).\n"
+" Ово може бити указ да домаћин није онај за кога Ñе претÑтавља\n"
+" (тако је, није Ñтварни „%s“).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Да Ñе неÑигурно повежете на „%s“, употребите „--no-check-certificate“.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ преÑкачем %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "ÐеиÑправна наводница Ñтила тачке „%s“; оÑтављам непромењено.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " ета %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " у "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ðе могу да добавим учетаноÑÑ‚ такта СТВÐРÐОГВРЕМЕÐÐ: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Уклањам „%s“ јер ће бити одбачен.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ðе могу да отворим „%s“: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Учитавам „robots.txt“; молим занемарите грешке.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Грешка обраде адреÑе поÑредника „%s“: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Грешка у адреÑи поÑредника „%s“: мора бити ХТТП.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d премашених преуÑмеравања.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"ОдуÑтајем.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Пробам поново.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Пронађох неоштећене везе.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Пронађох %d оштећену везу.\n"
+"\n"
+msgstr[1] ""
+"Пронађох %d оштећене везе.\n"
+"\n"
+msgstr[2] ""
+"Пронађох %d оштећених веза.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Ðема грешке"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Ðеподржана шема „%s“"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "ÐедоÑтаје шема"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "ÐеиÑправан назив домаћина"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "ÐеиÑправан број порта"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "ÐеиÑправно кориÑничко име"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Ðеокончана ИПв6 бројевна адреÑа"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "ИПв6 адреÑе ниÑу подржане"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "ÐеиÑправна ИПв6 бројевна адреÑа"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "ХТТПС подршка није уграђена"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Ðепретворив вишебајтни низ\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: ÐиÑам уÑпео да доделим довољно меморије; меморија је потрошена.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: ÐиÑам уÑпео да доделим %ld бајта; меморија је потрошена.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: текÑтуална међумеморија је превелика (%d бајта), прекидам.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "ÐаÑтављам рад у позадини, пид %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "ÐиÑам уÑпео да развежем Ñимболичку везу „%s“: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "ÐиÑам уÑпео да отворим датотеку „%s“\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Ðије уÑпео да добавим ФД за датотеку „%s“\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "ÐиÑам уÑпео добавим Ñтање датотеке „%s“ (проверите овлашћења)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Датотека „%s“ је измењена након поÑледње провере. Провера безбедноÑти није "
+"уÑпела.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "ÐиÑам уÑпео да отворим датотеку „%s“, разлог: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "ÐиÑам уÑпео да добавим Ñтање датотеке „%s“, грешка: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Покушавам да отворим датотеку „%s“ али је она измењена након поÑледње "
+"провере. Провера безбедноÑти није уÑпела.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Ðеправилан регуларан израз „%s“, ПЦРЕ2 грешка %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Ðеправилан регуларан израз: %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Грешка приликом упаривања %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "ПреÑкачем кључ Ñа погрешном величином (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Грешка поÑтављања положаја Ð’ÐРЦ датотеке.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Грешка иÑипања Ð’ÐРЦ датотеке на диÑк.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Грешка удвоÑтручавања опиÑника датотеке Ð’ÐРЦ датотеке.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Грешка отварања ГЗИП тока у Ð’ÐРЦ датотеци.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Грешка пиÑања варцинфо запиÑа у Ð’ÐРЦ датотеку.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Отварам Ð’ÐРЦ датотеку „%s“.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Грешка отварања Ð’ÐРЦ датотеке „%s“.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° не наводи изворне адреÑе. (ÐедоÑтаје Ñтубац „a“.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° не наводи Ñуме провере. (ÐедоÑтаје Ñтубац „k“.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÐ° не наводи ибове запиÑа. (ÐедоÑтаје Ñтубац „u“.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Учитах %d Ð·Ð°Ð¿Ð¸Ñ Ð¸Ð· ЦДИкÑ-а.\n"
+"\n"
+msgstr[1] ""
+"Учитах %d запиÑа из ЦДИкÑ-а.\n"
+"\n"
+msgstr[2] ""
+"Учитах %d запиÑа из ЦДИкÑ-а.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Ðе могу да прочитам Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÑƒ „%s“ за иклањањем дупликата.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Ðе могу да отворим привремену датотеку Ð’ÐРЦ проглаÑа.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Ðе могу да отворим привремену датотеку Ð’ÐРЦ дневника.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Ðе могу да отворим Ð’ÐРЦ датотеку.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Ðе могу да отворим Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÐºÑƒ за излаз.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Ðе могу да отворим привремену Ð’ÐРЦ датотеку.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Ðађох тачно поклапање у Ð¦Ð”Ð˜ÐºÑ Ð´Ð°Ñ‚Ð¾Ñ‚ÐµÑ†Ð¸. Чувам Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð½Ð¾Ð²Ð½Ðµ поÑете у Ð’ÐРЦ.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Ðепозната грешка ÑиÑтема"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Породица адреÑа за назив домаћина није подржана"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ÐеиÑправна вредноÑÑ‚ за аи_опције"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Ðепоправљива грешка при одређивању назива"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "аи_породица није подржана"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "РаÑподела меморије није уÑпела"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Ðиједна адреÑа није придружена називу домаћина"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Ðије познат назив или Ñервер"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Ðазив Ñервера није подржан за аи_врÑтуприкључнице"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "аи_врÑтаприкључнице није подржана"
+
+#~ msgid "System error"
+#~ msgstr "Грешка ÑиÑтема"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Међумеморија аргумента је премала"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Захтев обрађивања је у току"
+
+#~ msgid "Request canceled"
+#~ msgstr "Захтев је отказан"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Захтев није отказан"
+
+#~ msgid "All requests done"
+#~ msgstr "Сви захтеви Ñу готови"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Прекинуто Ñигналом"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "ÐиÑка параметра није иÑправно кодирана"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: опција „%s%s“ је нејаÑна\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: опција „%s%s“ је нејаÑна; могућноÑти:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: непозната опција „%s%s“\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „%s%s“ не дозвољава аргумент\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: опција „%s%s“ захтева аргумент\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: неиÑправна опција -- „%c“\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: опција захтева аргумент -- „%c“\n"
+
+#~ msgid "`"
+#~ msgstr "„"
+
+#~ msgid "'"
+#~ msgstr "“"
+
+#~ msgid "Success"
+#~ msgstr "УÑпело је"
+
+#~ msgid "No match"
+#~ msgstr "Ðема подударања"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "ÐеиÑправан регуларни израз"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "ÐеиÑправан знак поретка"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "ÐеиÑправан назив разреда знака"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Пратећа контра коÑа црта"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "ÐеиÑправна повратна упута"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Ðе одговара [, [^, [:, [., или [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Ðе одговара ( или \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Ðе одговара \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "ÐеиÑправан Ñадржај \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "ÐеиÑправан крај опÑега"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Меморија је потрошена"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Ðеправилан претходећи регуларан израз"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Прерани крај регуларног израза"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Регуларан израз је превелик"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Ðе одговара ) или \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ðема претходног регуларног израза"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "не могу да направим Ñпојку"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð¸Ñ˜Ðµ уÑпео"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "„_open_osfhandle“ није уÑпело"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "не могу да повратим фд %d: „dup2“ није уÑпело"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s потпроцеÑ"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s Ð¿Ð¾Ñ‚Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ˜Ðµ добио кобни Ñигнал %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "меморија је потрошена"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Извештаје о грешкама, питања и раÑправе шаљите на <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: непозната опција „--%s“\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: опција „-W %s“ је нејаÑна\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: опција „-W %s“ захтева аргумент\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Датотека „%s“ већ поÑтоји, не преузимам поново.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "ÐеиÑправан УТФ-8 низ: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "„idn_decode“ није уÑпело (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "„%s“ је примљено.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Пријављивање није уÑпело.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries наводи број поновних покушаја за "
+#~ "датотеку.\n"
+#~ " (мора бити коришћен уз „--metalink-"
+#~ "file“)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr " --jobs наводи колико нити кориÑти.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Обавештења о кориÑничком имену и лозинки ниÑу требали "
+#~ "бити наведени приликом преузимања Ñа метавезе.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "„%s“ не може бити коришћено Ñа „--metalink“.\n"
diff --git a/po/stamp-po b/po/stamp-po
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/po/sv.gmo b/po/sv.gmo
new file mode 100644
index 0000000..6870eb2
--- /dev/null
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..1c3e5ab
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,3606 @@
+# Swedish messages for wget.
+# Copyright (C) 2008, 2009, 2010, 2016, 2017, 2018, 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Christian Rose <menthos@menthos.com>, 1999, 2000, 2001, 2002, 2003.
+# Daniel Nylander <po@danielnylander.se>, 2006, 2007, 2008, 2009, 2010.
+# Göran Uddeborg <goeran@uddeborg.se>, 2016, 2017, 2018, 2020.
+#
+# $Revision: 1.13 $
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-08 20:55+0200\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
+# bind? binda? FIXME.
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: kunde inte slå upp bindningsadressen %s; inaktiverar bindning.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Ansluter till %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Ansluter till %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Ansluter till [%s]:%d … "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF misslyckades: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "ansluten.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "misslyckades: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: kunde inte slå upp värdadressen %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR misslyckades: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "För många fb öppna. Kan inte använda select på en fb ≥ %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Konverterade länkar i %d filer på %s sekunder.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Konverterar länkar i %s … "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "inget att göra.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Kan inte konvertera länkar i %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Kunde inte ta bort %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Kan inte säkerhetskopiera %s som %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Kan inte hämta kaka för %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Syntaxfel i \"Set-Cookie\": %s vid position %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Kaka som kommer från %s försökte ställa in domän till "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Kan inte öppna kakfilen %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Fel vid skrivning till %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Fel vid stängning av %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Listningstypen stöds inte, försöker med Unix-listtolkare.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Innehåll i /%s på %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "okänd tid "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Fil "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Katalog "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Länk "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Osäker "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte) "
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Längd: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) återstår"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s återstår"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (inte auktoritativt)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Kunde inte initiera SSL. Det kommer avaktiveras.\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Loggar in som %s... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Fel i serversvar, stänger styranslutning.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Fel i serverhälsning.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Skrivning misslyckades, stänger styranslutning.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Inloggning nekas av servern.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Felaktig inloggning.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Inloggad!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Servern accepterade inte kommandot â€PBSZ 0â€.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Servern accepterade inte kommandot â€PROT %câ€.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Serverfel, kan inte avgöra systemtyp.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "färdig. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "färdig.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Typen \"%c\" är okänd, stänger styranslutning.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "färdig. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD behövs inte.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Logiskt omöjlig sektion nådd i getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Katalogen %s finns inte.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD behövs inte.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Filen har redan hämtats.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Kan inte initiera PASV-överföring.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Kan inte tolka PASV-svar.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "kunde inte ansluta till %s port %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bindningsfel (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Felaktig PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST misslyckades, startar om från början.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Filen %s finns redan.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Filen %s finns inte.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Filen %s finns inte.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Filen eller katalogen %s finns inte.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s har uppstått.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, stänger styranslutning.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Dataanslutning: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Styranslutning stängd.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Dataöverföring avbruten.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Filen %s finns redan där; hämtar den inte.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(försök:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevs till standard ut %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s sparades [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Tar bort %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Använder %s som temporär listningsfil.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Tog bort %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Rekursionsdjupet %d överskred det maximala djupet %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Fjärrfilen är inte nyare än lokala filen %s -- hämtar den inte.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Fjärrfilen är nyare än lokala filen %s -- hämtar den.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Storlekarna stämmer inte överens (lokal %s) -- hämtar.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ogiltig symbolisk länk, hoppar över.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"En korrekt symbolisk länk %s -> %s finns redan.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Skapar symbolisk länk %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Symboliska länkar stöds inte, hoppar över symboliska länken %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "Hoppar över katalogen %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: okänd filtyp/filtypen stöds inte.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Misslyckades att sätta rättigheter på %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: felaktig tidsstämpel.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Hämtar inte kataloger eftersom djupet är %d (max %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Går inte ner till %s eftersom det är undantaget/inte-inkluderat.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Nekar %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Nekar %s (felaktig post)..\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s är undantaget/inte-inkluderat via reguljäruttryck.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Fel vid matchning av %s mot %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Inga träffar med mönstret %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Skrev HTML-iserat index till %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Skrev HTML-iserat index till %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "FEL: Kan inte öppna katalogen %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "FEL: Kan inte öppna certifikatet %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Läste in CA-certifikatet â€%sâ€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "FEL: Misslyckades att läsa in CRL-filen â€%sâ€: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Läste in CRL-filen â€%sâ€\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "FEL: GnuTLS förutsätter att nyckeln och certifikatet har samma typ.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Din GnuTLS-version är för gammal för att stödja TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: oimplementerat värde %u pÃ¥ alternativet â€secure-protocolâ€\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Rapportera gärna detta problem till bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: oimplementerat värde %d pÃ¥ alternativet â€secure-protocolâ€\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: kan inte sätta prioritetssträngen direkt. Faller tillbaka på "
+"standardprioriteten.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "FEL"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "VARNING"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Inget certifikat presenterades av %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Certifikatet för %s är inte betrott.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Certifikatet för %s har inte en känd utfärdare.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Certifikatet för %s har spärrats.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: Certifikatsigneraren av %s är inte en CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Certifikatet för %s signerades med en osäker algoritm.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Certifikatet för %s är inte aktiverat ännu.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Certifikatet för %s har gått ut.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Fel vid initiering av X509-certifikat: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Inget certifikat hittades\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Fel vid tolkning av certifikat: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Certifikatet har ännu inte aktiverats\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Certifikatet har gått ut\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Certifikatets ägare matchar inte värdnamnet %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Den publika nyckeln stämmer inte med fäst publik nyckel!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Certifikatet måste vara X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Fel i hantering av adresslistan.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Okänd värd"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Temporärt fel i namnuppslagning"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Okänt fel"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Slår upp %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "misslyckades: Inga IPv4/IPv6-adresser för värd.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "misslyckades: tidsgräns uppnåddes.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Kan inte slå upp den ofullständiga länken %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"attributet no-follow funnet i %s. Kommer inte att följa några länkar på "
+"denna sida\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ogiltig URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Misslyckades med att skriva HTTP-begäran: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Inga rubriker, antar HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Filen %s finns redan där; hämtar den inte.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime misslyckades. Detta är förmodligen ett programfel.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Kan inte konvertera tidsstämpel till http-format. Faller tillbaka till tid "
+"0 som senaste modifieringstid.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Datafil för BODY %s saknas: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Återanvänder befintlig anslutning till [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Återanvänder befintlig anslutning till %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Misslyckades med att läsa proxysvar: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s FEL %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Felaktig statusrad"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Proxytunnel misslyckades: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Okänd autentiseringsmetod.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Vald autentisering: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Sparar till: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"När signaturen hämtades:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Kan inte läsa signaturinnehållet från temporärfilen. Hoppar över.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Kunde inte skapa temporärfilen. Hoppar över att hämta signaturen.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Felaktigt pri-värde. Antar %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Kunde inte hitta en acceptabel kontrollsumma för Metalink-resurser.\n"
+"Hoppar över dem.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Inaktiverar SSL på grund av påträffade fel.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-begäran skickad, väntar på svar... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ingen data mottagen.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Läsfel (%s) i rubriker.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(ingen beskrivning)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Adress: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "ospecificerat"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [följer]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Filen %s är inte modifierad på servern. Låter bli att hämta.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Servern ignorerade If-Modified-Since-huvudet för filen %s.\n"
+"Du kanske vill lägga till flaggan --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Filen är redan fullständigt hämtad, inget att göra.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Längd: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ignorerad"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Varning: jokertecken stöds inte i HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Spindelläget aktiverat. Kontrollera om fjärrfilen finns.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Kan inte skriva till %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Det begärda attributet saknas i det mottagna huvudet.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Användarnamn-/lösenordsautentisering misslyckades.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Kan inte skriva till WARC-filen.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Kan inte skriva till en temporär WARC-fil.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Kan inte etablera en SSL-anslutning.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Kan inte ta bort %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "FEL: Omdirigering (%d) utan adress.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Hittade inte Metalink-data i HTTP-svaret. Hämtar filen med HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Metalink-huvuden hittade. Byter till Metalink-läge.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Fjärrfilen finns inte -- trasig länk!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "\"Last-modified\"-rubrik saknas -- tidsstämplar avstängda.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "\"Last-modified\"-rubriken är ogiltig -- tidsstämpel ignorerad.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Filen på servern är inte nyare än lokala filen %s -- hämtar den inte.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Storlekarna stämmer inte överens (lokal %s) -- hämtar.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Fjärrfilen är nyare, hämtar den.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Fjärrfilen finns och kan innehålla länkar till andra resurser -- hämtar "
+"den.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fjärrfilen finns men innehåller ingen länk -- hämtar den inte.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Fjärrfilen finns och kan innehålla ytterligare länkar,\n"
+"men rekursion är inaktiverat -- hämtar den inte.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Fjärrfilen finns.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - skrevs till standard ut %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s sparades [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Anslutningen stängd vid byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Läsfel vid byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Läsfel vid byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Ej stödd skyddskvalitet â€%sâ€.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Algoritmen â€%s†stödjs inte.\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC pekar på %s som inte gick att komma åt på grund av ett fel: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Kan inte läsa %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Fel i %s vid rad %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Syntaxfel i %s på rad %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Okänt kommando %s i %s på rad %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Att tolka systemets wgetrc-fil (env SYSTEM_WGETRC) misslyckades. "
+"Kontrollera\n"
+"â€%sâ€,\n"
+"eller ange en annan fil med --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Att tolka systemets wgetrc-fil misslyckades. Kontrollera\n"
+"â€%sâ€,\n"
+"eller ange en annan fil med --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Varning: Både systemets och användarens wgetrc pekar till %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Kommando med argumentet --execute är ogiltigt %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Ogiltigt booleskt värde %s; använd \"on\" eller \"off\".\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Ogiltigt %s; använd â€onâ€, â€off†eller â€quietâ€.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ogiltigt tal %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s får bara användas en gång\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ogiltigt bytevärde %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ogiltig tidsperiod %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Negativ tidsperiod %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass behöver en sträng eller att antingen miljövariabeln WGET_ASKPASS "
+"eller SSH_ASKPASS är satt.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ogiltigt värde %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ogiltig rubrik %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Ogiltigt WARC-huvud %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Förloppstypen %s är ogiltig.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Ogiltig begränsning %s,\n"
+" använd [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Kodningen %s är inte giltig\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Konvertering från %s till %s stöds inte\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Ofullständig eller ogiltig multibyte-sekvens påträffades\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Ohanterat felnummer %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: lokalen är inte inställd\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode misslyckades (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Misslyckades att konvertera till gemen: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Omdirigerar utdata till %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; deaktiverar loggning.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Användning: %s [FLAGGA]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Obligatoriska argument till långa flaggor är obligatoriska även för de "
+"korta.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Uppstart:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version visa Wgets version och avsluta\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help skriv ut denna hjälp.\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background gå till bakgrunden efter uppstart\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=KOMMANDO kör ett kommando i â€.wgetrcâ€-stil\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Loggning och inmatningsfil:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=FIL logga meddelanden till FIL\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=FIL lägg till meddelanden till FIL\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug skriv ut massor av "
+"felsökningsinformation\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug skriv ut Watt-32-felsökningsinformation\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet tyst (ingen utdata)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose var informativ (detta är standard)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose stäng av information, utan att vara tyst\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYP skriv ut bandvidd som TYP. TYP kan vara "
+"bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=FIL hämta URL:ar som finns i lokal eller "
+"extern\n"
+" FIL\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=FIL hämta URL:ar som täcks av lokal Metalink-"
+"FIL\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html behandla inmatningsfil som HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL slår upp HTML-länkar från indatafil\n"
+" (-i -F) relativa till URL\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=FIL ange konfigurationsfil att använda\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config läs ingen konfigurationsfil\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=FIL logga anledningar till URL-avvisanden "
+"till FIL\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Hämta:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ANTAL sätt antal försök till ANTAL (0 "
+"obegränsar)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused försök igen även om anslutningen nekas\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=FEL kommaseparerad lista över HTTP-fel "
+"att försöka igen vid\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=FIL skriv dokument till FIL\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber hoppa över hämtningar som skulle hämta "
+"till\n"
+" redan befintliga filer (skriva över "
+"dem)\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc försök inte hämta kreditiv från .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue återuppta hämtning av delvis hämtad fil\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=AVSTÅND börja hämta från nollbaserad position "
+"AVSTÃ…ND\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TYP välj typ av förloppsindikator\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress visa förloppsmätare i alla "
+"informationslägen\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping hämta inte om filer om de inte är nyare "
+"än\n"
+" lokala\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since använd inte villkorliga if-modified-since "
+"get-\n"
+" begäranden i tidsstämpelläge\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps sätt inte den lokala filens tidsstämpel\n"
+" efter den på servern\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response skriv ut serversvar\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider hämta ingenting\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=SEKUNDER sätt tidsgränser till SEKUNDER\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESSER lista över DNS-servrar att fråga\n"
+" (kommaseparerade)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRESS bind till ADRESS (värdnamn eller IP) på "
+"den\n"
+" lokala värden\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SEK sätt tidsgränsen för DNS-uppslagningar "
+"till\n"
+" SEK\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SEK sätt anslutningstidsgränsen till SEK\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SEK sätt lästidsgränsen till SEK\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SEKUNDER vänta SEKUNDER mellan hämtningar\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SEKUNDER vänta 1..SEKUNDER mellan hämtningsförsök\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait vänta från 0.5*VÄNTA...1.5*VÄNTA "
+"sekunder\n"
+" mellan hämtningar\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy stäng uttryckligen av proxy\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ANTAL ställ in mottagningskvot till ANTAL\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRESS bind till ADRESS (värdnamn eller IP) på\n"
+" lokal värd\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=FART begränsa hämtningshastighet till FART\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache inaktivera mellanlagring av DNS-uppslag\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS begränsa tecken i filnamn till vad OS\n"
+" tillåter\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ignorera skiftläge när filer/kataloger\n"
+" matchas\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only anslut endast till IPv4-adresser\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only anslut endast till IPv6-adresser\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILJ anslut först till adresser av angiven "
+"familj,\n"
+" en av IPv6, IPv4 eller none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=ANVÄNDARE ställ in både ftp- och http-användare "
+"till\n"
+" ANVÄNDARE\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=LÖSEN ställ in både ftp- och http-lösenord "
+"till\n"
+" LÖSEN\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password fråga efter lösenord\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=KOMMANDO ange kreditivhanterare för att begära\n"
+" användarnamn och lösenord. Om inget\n"
+" KOMMANDO anges används miljövariabeln\n"
+" WGET_ASKPASS eller SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri stäng av IRI-stöd\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=KOD använd KOD som lokal kodning för IRI:er\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=KOD använd KOD som standard fjärrkodning\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink ta bort filer före de skrivs över\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash behåll filer med kontrollsummefel (lägg "
+"till .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=TAL Metalink application/metalink4+xml "
+"metaurl ordningsTAL\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http använd Metalink-metadata från HTTP-\n"
+" svarshuvuden\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location önskad plats för Metalink-resurser\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr slå på lagring av metadata i utökade "
+"filattribut\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Kataloger:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories skapa inte kataloger\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories tvinga skapandet av kataloger\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories skapa inte värdkataloger\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories använd protokollnamn i kataloger\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX spara filer till PREFIX/…\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ANTAL ignorera ANTAL fjärrkatalogkomponenter\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP-flaggor:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=ANVÄNDARE ställ in http-användare till ANVÄNDARE\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=LÖSEN ställ in http-lösenord till LÖSEN\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache tillåt inte mellanlagrad data på servern\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAMN ändra namnet för standardsidan "
+"(vanligtvis\n"
+" är detta â€index.htmlâ€.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension spara HTML/CSS-dokument med korrekta "
+"ändelser\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ignorera â€Content-Lengthâ€-rubrikfält\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=STRÄNG infoga STRÄNG i huvudet\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYP välj komprimering, en av auto, gzip och "
+"none. (standard: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect maximalt tillåtna omdirigeringar per "
+"sida\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=ANVÄNDARE ställ in ANVÄNDARE som proxy-"
+"användarnamn\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=LÖSEN ställ in LÖSEN som proxy-lösenord\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL inkludera â€Referer: URLâ€-rubrik i\n"
+" HTTP-begäran.\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers spara HTTP-rubrikerna till fil\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=AGENT identifiera som AGENT istället för\n"
+" Wget/VERSION\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive inaktivera HTTP keep-alive (varaktiga\n"
+" anslutningar)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies använd inte kakor\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=FIL läs in kakor från FIL före sessionen\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=FIL spara kakor till FIL efter sessionen\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies läs in och spara sessionskakor\n"
+" (icke-permanenta)\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=STRÄNG använd POST-metoden; skicka STRÄNG som "
+"data\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=FIL använd POST-metoden; skicka innehållet i "
+"FIL\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMetod använd metoden â€HTTPMetod†i begäran\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=STRÄNG skicka STRÄNG som data. --method MÅSTE "
+"anges\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=FIL innehållet i FIL. --method MÅSTE anges\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition ta hänsyn till huvudet Content-"
+"Disposition\n"
+" när lokala filnamn väljs "
+"(EXPERIMENTELL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error skriv ut det mottagna innehållet vid "
+"serverfel\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge skicka Basic HTTP-"
+"autentiseringsinformation\n"
+" utan att först vänta på serverns\n"
+" kontrollfråga\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS-flaggor (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR välj säkert protokoll, ett av auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 och PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only följ endast säkra HTTPS-länkar\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate validera inte serverns certifikat\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=FIL klientcertifikatfil\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYP klientcertifikattyp, PEM eller DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=FIL fil med privat nyckel\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=TYP typ av privat nyckel, PEM eller DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=FIL fil med paketerade CA:er\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=KAT katalog där hash-lista av CA:er lagras\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=FIL fil med paketerade CRL:er\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FIL/SUMMOR Publik nyckel-fil (PEM/DER), eller\n"
+" godtyckligt antal base64-kodade sha256-\n"
+" kontrollsummor föregÃ¥ngna av â€sha256//†"
+"och\n"
+" separerade av â€;â€, att verifiera "
+"motparten\n"
+" mot.\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=FIL fil med slumpfrö för att så SSL PRNG\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FIL fil med namnet för EGD-uttag med "
+"slumpdata\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR Sätt prioritetssträngen (GnuTLS) eller "
+"chifferliststrängen (OpenSSL) direkt.\n"
+" Använd med försiktighet. Denna flagga "
+"åsidosätter --secure-protocol.\n"
+" Formatet och syntaxen på denna sträng "
+"beror på den specifika SSL/TLS-motorn.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS-flaggor:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts avaktivera HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file sökväg till HSTS-databas (kommer "
+"åsidosätta standard)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP-flaggor:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf använd formatet Stream_LF för alla "
+"binära\n"
+" FTP-filer\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=ANVÄNDARE ställ in ftp-användare till ANVÄNDARE\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=LÖSEN ställ in ftp-lösenord till LÖSEN\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ta inte bort â€.listingâ€-filer\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob stäng av FTP-filnamnsmatchning\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp avaktivera â€passivt†överföringsläge\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions behåll fjärrfilens rättigheter\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks när rekursiv, hämta länkade-till filer "
+"(inte\n"
+" kat)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS-flaggor:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit använd implicit FTPS (standardport "
+"är\n"
+" 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl återuppta SSL/TLS-sessionen som "
+"startades\n"
+" i styrförbindelsen när en\n"
+" dataförbindelse öppnas\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection chiffrera bara styrkanalen; all data\n"
+" kommer skickas som klartext\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp fall tillbaka till FTP om FTPS inte\n"
+" stödjs av målservern\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC-flaggor:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILNAMN spara begäran-/svardata i en .warc.gz-"
+"fil\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=STRÄNG infoga STRÄNG i warcinfo-posten\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ANTAL sätt maximal storlek på WARC-filer till "
+"ANTAL\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx skriv CDX-indexfiler\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=FILNAMN spara inte poster listade i denna CDX-"
+"fil\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression komprimera inte WARC-filer med GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests beräkna inte SHA1-kontrollsummor\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log lagra inte loggfilen i en WARC-post\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=KATALOG plats för temporärfiler som skapas av\n"
+" WARC-skrivaren\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Rekursiv hämtning:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive ange rekursiv hämtning\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=ANTAL maximalt rekursionsdjup (inf eller 0 för\n"
+" oändligt)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after ta bort lokala filer efter att de "
+"hämtats\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links gör så att länkar i hämtad HTML eller "
+"CSS\n"
+" pekar på lokala filer\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only konvertera endast fildelen av URL:en\n"
+" (vanligen känt som basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N före fil X skrivs, rotera upp till N "
+"säkerhetskopiefiler\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted före filen X konverteras, "
+"säkerhetskopiera\n"
+" den som X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted före filen X konverteras, "
+"säkerhetskopiera\n"
+" den som X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror genväg för -N -r -l inf --no-remove-"
+"listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites hämta alla bilder, etc. som behövs för "
+"att\n"
+" visa HTML-sidor\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments slå på strikt (SGML) hantering av\n"
+" HTML-kommentarer\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Rekursiv acceptans/vägran:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTA kommaseparerad lista av accepterade "
+"ändelser\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTA kommaseparerad lista av vägrade ändelser\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=REGUTTR reguljäruttryck som matchar godkända URL:"
+"ar\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=REGUTTR reguljäruttryck som matchar avvisade URL:"
+"ar\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=TYP typ av reguljäruttryck (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TYP typ av reguljäruttryck (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LISTA kommaseparerad lista av accepterade "
+"domäner\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LISTA kommaseparerad lista av vägrade domäner\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp följ FTP-länkar från HTML-dokument\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTA kommaseparerad lista av HTML-taggar att "
+"följa\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTA kommaseparerad lista av HTML-taggar att\n"
+" ignorera\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts gå till främmande värdar när rekursiv\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative följ endast relativa länkar\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTA lista av tillåtna kataloger\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names använd namnet angivet av omdirigerings-url:"
+"ens\n"
+" sista komponent\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LISTA lista av exkluderade kataloger\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent gå inte upp till föräldrakatalogen\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"Skicka felrapporter, frågor, diskussioner till <bug-wget@gnu.org>\n"
+"och/eller öppna ärenden på https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, en icke-interaktiv nätverkshämtare.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Lösenord för användaren %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Lösenord: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Kan inte skapa ett rör\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "Fel vid initiering av skapad filåtgärd för use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Fel när skapad filåtgärd sattes för use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Fel när svaret lästes frÃ¥n kommandot â€%s %sâ€: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Användarnamn för â€%s%sâ€: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Lösenord för â€%s%s@%sâ€: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Lokalanpassning: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Kompilering: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Länkning: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s byggd på %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (miljö)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (användare)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (system)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Licens GPLv3+: GNU GPL version 3 eller senare\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Det här är fri programvara: du får fritt ändra och distribuera den.\n"
+"Det finns INGEN GARANTI så långt som lagen tillåter.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Ursprungligen skrivet av Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Skicka felrapporter och frågor till <bug-wget@gnu.org>.\n"
+"Skicka synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Minnesallokeringsproblem\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Avslutar på grund av fel i %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Prova \"%s --help\" för fler flaggor.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: ogiltig flagga -- \"-n%c\"\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Stöd för felsökning är inte inkompilerat. Ignorerar flaggan --debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"BÃ¥de --no-clobber och --convert-links angavs, endast --convert-links kommer "
+"användas.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"BÃ¥de --no-clobber och --convert-file-only angavs, endast --convert-file-only "
+"kommer användas.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Kan inte vara utförlig och tyst på samma gång.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Kan inte tidsstämpla och inte skriva över gamla filer på samma gång.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Kan inte ange både --inet4-only och --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Det går inte att ange både -k eller --convert-file-only och -O om flera URL:"
+"er\n"
+"anges, eller i kombination med -p eller -r. Se manualen för information.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"VARNING: kombinera -O med -r eller -p betyder att allt hämtat innehåll\n"
+"kommer att placeras i en enstaka fil som du har angivit.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"VARNING: tidsstämpling gör ingenting i kombination med -O. Se manualen\n"
+"för information.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC-utdata fungerar inte med --no-clobber, --no-clobber kommer "
+"avaktiveras.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC-utdata fungerar inte med tidsstämplar, tidsstämplar kommer "
+"avaktiveras.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC-utdata fungerar inte med --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC-utdata fungerar inte med --continue eller --start-pos, de kommer "
+"avaktiveras.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Kontrollsummor är avaktiverade; WARC-avduplicering kommer inte hitta "
+"dubblettposter.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Komprimering fungerar inte med --continue eller --start-pos, den kommer "
+"avaktiveras.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "Det går inte att ange både --ask-password och --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Att ange både --start-pos och --continue rekommenderas inte; --continue "
+"kommer att avaktiveras.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL saknas\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "Det går inte att ange både --post-data och --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Man kan inte använda --post-data eller --post-file tillsammans med --"
+"method. --method förväntar sig data via flaggorna --body-data och --body-"
+"file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Man måste ange en metod med --method=HTTPMetod att använda med --body-data "
+"eller --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Det går inte att ange både --body-data och --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Denna version saknar stöd för IRI:er\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k eller -r kan endast användas tillsammans med -O vid skrivning till en "
+"vanlig\n"
+"fil.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links eller --convert-file-only kan endast användas tillsammans "
+"med\n"
+"-O vid skrivning till en vanlig fil.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Misslyckades med att initiera libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Misslyckades med att initiera c-ares-kanalen\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Misslyckades att tolka IP-adressen â€%sâ€\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Misslyckades att sätta DNS-servrar â€%s†(%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Inga URL:er hittade i %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Kunde inte tolka metalink-filen %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Kunde inte hämta alla resurser från %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"FÄRDIG --%s--\n"
+"Total väggklocktid: %s\n"
+"Hämtade: %d filer, %s på %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Hämtningskvot för %s ÖVERSKRIDEN!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O stödjs inte för metalink-hämtningar. Ignorerar.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planerad metalink-fil: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Säkrad metalink-fil: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Avvisar metalink-fil. Osäkert namn.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Bearbetar metaurl %s …\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Avvisar metaurl-fil %s. Osäkert namn.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Misslyckades att hämta %s. Hoppar över metaurl:en.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Kunde inte tolka metaurl-filen %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Metaurl-bearbetningen returnerade fel.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Resurstypen %s stödjs inte, ignorerar …\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Kunde inte öppna hämtningsfilen.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Beräknar storlek för %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Filstorleken är inte deklarerad. Hoppar över kontrollen.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Kunde inte avgöra den hämtade filens storlek.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Storleken stämmer inte för filen %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Storleken stämmer.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Beräknar kontrollsumma för %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Kontrollsumman stämmer.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Kontrollsumman stämmer inte för filen %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Kunde inte öppna hämtningsfilen för verifikation av signatur.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Signaturvalideringen lyckades.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Felaktig signatur. Avvisar resursen.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Data stämmer med signaturen, men signaturen är inte betrodd.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Ingen kontrollsumma hittades.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Misslyckades att hämta %s. Hoppar över resursen.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Filen %s hämtad men storleken stämmer inte.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Filen %s hämtad men kontrollsumman stämmer inte.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Filen %s hämtad men signaturen stämmer inte.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Byter namn på %s till %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Fortsätter i bakgrunden.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Fortsätter i bakgrunden, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Utdata kommer att skrivas till %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() misslyckades\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() misslyckades\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Kunde inte hitta användbar uttagsdrivrutin (socket driver).\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() misslyckades. Uttaget kunde inte sättas till blockerande.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: varning: %s-märke förekommer framför alla maskinnamn\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: okänt märke \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Användning: %s NETRC [VÄRDDATORNAMN]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: kan inte ta status på %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "VARNING: använder ett svagt slumpfrö.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Kunde inte så PRNG; överväg att använda --random-file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Din OpenSSL-version är för gammal för att stödja TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Din OpenSSL-version är för gammal för att stödja TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Din OpenSSL-version är för gammal för att stödja TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: oimplementerat värde %d pÃ¥ alternativet â€secure-protocolâ€\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: Ogiltig chifferlista: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: Misslyckades att sätta förtroendet till partiell kedja\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: Misslyckades att allokera verifikationsparametrar\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "VARNING: kunde inte så PRNG. Överväg att använda --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: kan inte validera certifikatet för %s, utfärdat av %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Kunde inte lokalt verifiera utfärdarens auktoritet.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Självsignerat certifikat påträffades.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Utfärdat certifikat är ännu inte giltigt.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Utfärdat certifikat har gått ut.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: inget alternativt namn för certifikatnamnet matchar\n"
+"\tdet begärda värdnamnet %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: certifikatets namn %s matchar inte det begärda värdnamnet %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: certifikatets namn är ogiltigt (innehåller ett NUL-tecken).\n"
+" Detta kan indikera att värddatorn inte är den som den utger sig\n"
+" för att vara (den är alltså inte den riktiga %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"För att ansluta till %s på osäkert sätt, använd \"--no-check-certificate\".\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ hoppar över %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Punktstilsspecifikationen %s är ogiltig; lämnar oförändrad.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " klar %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " om "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Kan inte hämta REALTIME-klockfrekvens: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Tar bort %s eftersom den skulle ha avvisats.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Kan inte öppna %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Läser in robots.txt; ignorera fel.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Fel vid tolkning av proxy-URL %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Fel i proxy-URL %s: MÃ¥ste vara HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d omdirigeringar överskreds.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Ger upp.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Försöker igen.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Hittade inga trasiga länkar.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Hittade %d trasig länk.\n"
+"\n"
+msgstr[1] ""
+"Hittade %d trasiga länkar.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Inget fel"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Schemat %s stöds inte"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Schema saknas"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Ogiltigt värdnamn"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Felaktigt portnummer"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ogiltigt användarnamn"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Oavslutad numerisk IPv6-adress"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6-adresser stöds inte"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ogiltig numerisk IPv6-adress"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS-stöd är inte inkompilerat"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Ej konvertibel multibytesekvens påträffades\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+"%s: %s: Misslyckades med att allokera tillräckligt mycket minne; slut på "
+"minne.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Misslyckades att allokera %ld byte; minne fullt.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: textbufferten är för stor (%d byte), avbryter.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Fortsätter i bakgrunden, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Misslyckades med att ta bort symboliska länken %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Misslyckades med att göra Fopen av en fil %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Misslyckades att hämta en FB för filen %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Misslyckades att ta status på filen %s, (kontrollera rättigheterna).\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Filen %s har ändrats sedan senaste kontrollen. Säkerhetskontrollen "
+"misslyckades.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Misslyckades att öppna filen %s, orsak :%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Misslyckades att ta status på filen %s, fel: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Försöker öppna filen %s men den har ändrats sedan senaste kontrollen. "
+"Säkerhetskontrollen misslyckades.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Felaktigt reguljärt uttryck %s, PCRE2-fel %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Felaktigt reguljärt uttryck %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Fel vid matchning av %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "Hoppar över nyckel med fel storlek (%d/%d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Fel när WARC-filpositionen sattes.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Fel när WARC-filen spolades ut till disk.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Fel vid duplicering av WARC-filbeskrivare.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Fel när GZIP-strömmen till WARC-filen öppnades.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Fel när warcinfo-posten till WARC-filen skrevs.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Öppnar WARC-filen %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Fel när WARC-fil öppnades %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX-filen listar inte original-url:er. (Kolumn â€a†saknas.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX-filen listar inte original-url:er. (Kolumn â€k†saknas.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX-filen listar inte original-url:er. (Kolumn â€u†saknas.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Läste %d post från CDX.\n"
+"\n"
+msgstr[1] ""
+"Läste %d poster från CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Kunde inte läsa CDX-filen %s för att avduplicera.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Kunde inte öppna temporär WARC-förteckningsfil.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+"Kunde inte läsa temporär WARC-loggfil.\n"
+"\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Kunde inte öppna WARC-fil.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Kunde inte öppna CDX-filen för utmatning.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Kunde inte öppna temporär WARC-fil.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Hittade exakt matchning i CDX-filen. Sparar en återbesökspost i WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Okänt systemfel"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Adressfamiljen för värdnamnet stödjs inte"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Felaktigt värde för ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Ej reparabelt fel i namnuppslagning"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family stödjs inte"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Minnesallokeringsfel"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Ingen adress associerad med värdnamnet"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Namn eller tjänst okänd"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname stödjs inte för ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype stödjs inte"
+
+#~ msgid "System error"
+#~ msgstr "Systemfel"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argumentbufferten är för liten"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Bearbetar pågående begäran"
+
+#~ msgid "Request canceled"
+#~ msgstr "Begäran annullerad"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Begäran inte annullerad"
+
+#~ msgid "All requests done"
+#~ msgstr "Alla begäran utförda"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Avbruten av en signal"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametersträng inte korrekt kodad"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: flaggan â€%s%s†är tvetydig\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: flaggan â€%s%s†är tvetydig; möjligheter:"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: okänd flagga â€%s%sâ€\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: flaggan â€%s%s†tar inget argument\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: flaggan â€%s%s†behöver ett argument\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: ogiltig flagga -- \"%c\"\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: flaggan behöver ett argument -- \"%c\"\n"
+
+#~ msgid "`"
+#~ msgstr "\""
+
+#~ msgid "'"
+#~ msgstr "\""
+
+#~ msgid "Success"
+#~ msgstr "Lyckas"
+
+#~ msgid "No match"
+#~ msgstr "Ingen matchning"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Felaktigt reguljärt uttryck"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ogiltigt sorteringstecken"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ogiltigt teckenklassnamn"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Avslutande bakstreck"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Ogiltig bakåtreferens"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Ensam [, [^, [:, [. eller [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Ensam ( eller \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Ensam \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Felaktigt innehåll i \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Ogiltigt intervallslut"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Slut på minne"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Felaktigt föregående reguljärt uttryck"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Förtida filslut i reguljärt uttryck"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Reguljärt uttryck är för stort"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Ensam ) eller \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Inget tidigare reguljärt uttryck"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "kan inte skapa ett rör"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s-underprocess misslyckades"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle misslyckades"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "kan inte återställa fb %d: dup2 misslyckades"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s-underprocess"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s-underprocess fick en ödesdiger signal %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "slut på minne"
diff --git a/po/tr.gmo b/po/tr.gmo
new file mode 100644
index 0000000..3baa2a6
--- /dev/null
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..897bd93
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,4092 @@
+# Turkish translations for wget messages.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Nilgün Belma Bugüner <nilgun@superonline.com>, 2001,..., 2005.
+# Volkan Gezer <vlkngzr@gmail.com>, 2013.
+# Alper Tekinalp <alper.tekinalp@gmail.com>, 2017.
+# Mesutcan Kurt <mesutcank@gmail.com>, 2017.
+# Muhammet Kara <muhammetk@gmail.com>, 2016, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.18.109\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2017-06-27 09:52+0300\n"
+"Last-Translator: Muhammet Kara <muhammetk@gmail.com>\n"
+"Language-Team: Turkish <gnome-turk@gnome.org>\n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.7\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-POOTLE-MTIME: 1494368779.000000\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: %s bağ adresi çözümlenemedi; bağ devre dışı bırakılıyor.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "%s[%s]:%d bağlanılıyor... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "%s:%d bağlanılıyor..."
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Bağlanılıyor [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF başarısız: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "bağlantı kuruldu.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "olmadı: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: %s makine adresi çözümlenemedi\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR başarısız: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Çok fazla fd açık. %d'ye eşit ya da daha büyük bir fd üzerinde seçim "
+"yapılamaz\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Bağlantılar %d dosyada, %s saniyede dönüştürüldü.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "%s içindeki bağlar dönüştürülüyor..."
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "birşey yapılmadı.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "%s deki bağlar dönüştürülemiyor: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "%s silinemedi: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "%s, %s olarak yedeklenemiyor: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "%s için çerez alınamadı\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Set-Cookie'de sözdizimi hatası: %2$d. konumda %1$s.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "%s adresinden gelen çerez alan adını şu yapmaya çalıştı: "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Çerez dosyası %s açılamadı: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "%s üzerine yazmada hata: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "%s'i kapatmada hata: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Desteklenmeyen listeleme türü, Unix liste çözümleyici deneniyor.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "%2$s:%3$d üstünde /%1$s indeksi"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "zaman bilinmiyor "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Dosya "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Dizin "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "BaÄŸ "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Kesin deÄŸil "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s bayt)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Uzunluk: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) kalan"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s kalan"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (yetkin deÄŸil)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "SSL ilklendirilemedi. Devre dışı bırakılacak."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "%s olarak oturuma giriliyor ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Sunucu yanıtında hata, kontrol bağlantısı kapatılıyor.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Sunucu karşılama iletisinde hata.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Yazma başarısız, kontrol bağlantısı kapatılıyor.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Sunucu oturum açmayı reddetti.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Oturum açma başarısız.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Oturum açıldı!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Sunucu 'PBSZ 0' komutunu kabul etmedi.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Sunucu 'PROT %c' komutunu kabul etmedi.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Sunucu hatası, sistem türü saptanamadı.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "tamam. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "tamam.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Tür `%c' bilinmiyor, kontrol bağlantısı kapatılıyor.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "tamam. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD gereksiz.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "getftp()'de mantıksal olarak imkansız bir bölüme ulaşıldı"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"%s diye bir dizin yok.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD gerekli deÄŸil.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Dosya zaten indirilmiÅŸ.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "PASV aktarımı başlatılamadı.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "PASV yanıtı çözümlenemedi.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "bağlanılamadı: %s:%d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bağlanma hatası (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT geçersiz.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST başarısız, baştan başlanıyor.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "%s dosyası mevcut.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "%s diye bir dosya yok.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"%s diye bir dosya yok.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"%s diye bir dosya veya dizin yok.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s birden ortaya çıktı.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, kontrol bağlantısı kapatılıyor.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Veri bağlantısı: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Kontrol bağlantısı kapatıldı.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Veri aktarımı kesildi.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "%s dosyası zaten orada; indirilmiyor.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(deneme: %2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - şuraya yazıldı stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s kaydedildi [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "%s kaldırılıyor.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Geçici dosya listelenirken %s kullanılıyor.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s kaldırıldı.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Yineleme derinliği %d aşıldı. En fazla derinlik %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Uzak dosya %s yerel dosyasından daha yeni değil -- indirilmiyor.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Uzak dosya %s yerel dosyasından daha yeni -- indiriliyor.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Uzunlukları aynı değil (bizdeki %s), -- alınıyor.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Sembolik bağın ismi geçersiz, atlanıyor.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Zaten doÄŸru sembolik baÄŸ var: %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Sembolik baÄŸ oluÅŸturuluyor: %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+"Sembolik bağlantılar desteklenmiyor, %s sembolik bağlantısı atlanıyor.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "%s dizini atlanıyor.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: bilinmeyen/desteklenmeyen dosya türü.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "%s için izinler ayarlanamadı.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: zaman damgası bozuk.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "%d derinliğindeki dizinler alınamayacak (en çok %d)\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "%s dışlandığı/dahil edilmediği için alçalmıyor.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "%s iptal ediliyor.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "%s iptal ediliyor.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s dışlandığı/dahil edilmediği için alçalmıyor.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "%s - %s eÅŸleÅŸtirmesinde hata: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Arama kriterine uygun sonuç bulunamadı %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "HTML'leştirilen dizin %s [%s] içine yazıldı.\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "HTML'leştirilen dizin %s içine yazıldı.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "HATA: %s dizini açılamıyor.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "HATA: %s sertifikası açılamıyor: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "CA sertifikası '%s' yüklendi\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "HATA: CRL dosyası '%s' yüklenemedi: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "CRL dosyası '%s' yüklendi\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"HATA: GnuTLS, anahtar ve sertifikanın aynı türde olmasını gerektirir.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "OpenSSL versiyonunuz TLSv1.1'i destemek için çok eski.\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: uygulanmamış 'secure-protocol' seçeneği değeri %d\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Lütfen bu sorunu bug-wget@gnu.org adresine bildirin.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: uygulanmamış 'secure-protocol' seçeneği değeri %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "HATA"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "DÄ°KKAT"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s tarafından sunulun böyle bir sertifika yok.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: %s sertifikası güvenilir değil.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: %s sertifikası bilinen bir yayımcıya ait değil.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: %s sertifikası iptal edilmiş.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: %s sertifikası imzalayanı bir CA değil.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: %s sertifikası güvensiz bir algoritma kullanılarak imzalanmış.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: %s sertifikası henüz etkin değil.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: %s sertifikasının geçerlilik süresi dolmuş.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "X509 sertifikası başlatmada hata: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Hiçbir sertifika bulunamadı\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Sertifika çözümlenmesinde hata: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Sertifika henüz etkinleştirilmedi\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Sertifikanın kullanım süresi dolmuş\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Sertifika sahibi host adı ile uyuşmuyor %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Açık anahtar sabitlenen açık anahtarla eşleşmiyor!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Sertifika X.509 olmalıdır\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Adres listesi düzenlemesinde hata.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Bilinmeyen makine"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "İsim çözümlemesinde geçici bir hata oluştu"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Bilinmeyen hata"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "%s çözümleniyor... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "olmadı: Makinenin bir IPv4/IPv6 adresi yok.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "olmadı: zamanaşımı.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: İçi boş %s bağı çözümlenemez.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL `%s' geçersiz: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "HTTP isteğini yazma başarısız: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Başlıklar eksik, HTTP/0.9 olduğu varsayılıyor"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"%s dosyası mevcut; tekrar indirilmiyor.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime başarısız. Bu muhtemelen bir hata(bug).\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"zaman damgası http biçimine dönüştürülemedi. Son değişiklik zamanı olarak 0 "
+"a geri dönülüyor.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY veri dosyası %s kayıp: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "[%s] için mevcut bağlantı yeniden kullanılıyor:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Bağlantı tekrar kullanılıyor: %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Vekilin yanıtı okunamadı: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s HATA %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Durum satırı bozuk"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Vekil tünellenemedi: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Kimlik tanımlama şeması bilinmiyor.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Kimlik doğrulama seçildi: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Kayıt yeri: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Ä°mza indirilirken:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "İmza içeriği geçici dosyadan okunamadı. Atlanıyor.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Geçici dosya oluşturulamadı. İmza indirme işlemi atlanıyor.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Geçersiz pri değeri. %d varsayılıyor.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Üst bağlantı kaynakları için kabul edilebilir özet bulunamadı.\n"
+"Bunlar gözardı ediliyor.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Ne olduğu belirsiz hatalardan dolayı SSL iptal ediliyor.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s isteği gönderildi, yanıt bekleniyor... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Hiçbir veri alınmadı.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Başlıklar okunurken hata (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(açıklama yok)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Yer: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "belirtilmeyen"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [izleyen]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Dosya %s sunucuda değişmedi. İndirme atlanıyor.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Sunucu If-Modified-Since başlığını %s dosyası için yoksaydı.\n"
+"--no-if-modified-since seçeneğini eklemek isteyebilirsiniz.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Dosya zaten alınmıştı; birşey yapılmadı.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Uzunluk: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "yoksayıldı"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Uyarı: HTTP ile genel arama karakterleri kullanılamaz.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Örümcek kipi etkin. Uzak dosyanın mevcut olup olmadığını denetleyin.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "%s (%s) konumuna yazılamıyor.\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Alınan Başlıktan gerekli nitelik eksik.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Kullanıcı Adı/Parola Kimlik Doğrulaması Başarısız.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "WARC dosyasına yazılamıyor.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Geçici WARC dosyasına yazılamıyor.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "SSL bağlantısı kurulamıyor.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "%s (%s) bağlantısı kesilemiyor.\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "HATA: Yönlendirmede (%d) yer belirtilmemiş.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Metalink verisi HTTP yanıtında bulunamadı. Dosya HTTP GET ile indiriliyor.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Metalink başlıkları bulundu. Metalink moduna geçiliyor.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Uzak dosya bulunamıyor -- kırık adres!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Last-modified başlığı kayıp -- zaman damgası kapatıldı.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Last-modified başlığı geçersiz -- zaman damgası yoksayıldı.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Sunucudaki dosya yerel dosya %s ile aynı -- tekrar indirilmiyor.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Uzunlukları aynı değil (bizdeki %s), -- alınıyor.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Uzak dosya daha yeni, alınıyor.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Uzak dosya mevcut ve diğer kaynaklara bağlantılar içeriyor olabilir - "
+"getiriliyor.\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Uzak dosya buluntu fakat herhangi bir bağlantı içermiyor -- alınamıyor.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Uzak dosya bulundu ve ek bağlantılar içerebilir, \n"
+"fakat önyineleme devredışı -- alınamıyor.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Uzak dosya mevcut.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - stdout %s[%s/%s] içine yazıldı\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s kaydedildi [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - %s baytta bağlantı kesildi. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - %s. baytta okuma hatası (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - %s/%s baytta okuma hatası (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Desteklenmeyen koruma kalitesi '%s'.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Desteklenmeyen algoritma '%s'.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC olmayan %s dosyasını gösteriyor.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: %s okunamadı (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: %s dosyasının %d. satırında hata.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: %s dosyasının %d. satırında sözdizimi hatası.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Bilinmeyen komut %s. %s içinde, satır %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"wgetrc dosyasını (env SYSTEM_WGETRC) ayıklama başarısız. Lütfen\n"
+"'%s' dosyasını denetleyin,\n"
+"veya --config ile farklı bir dosya belirtin.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"wgetrc dosyasını ayıklama başarısız. Lütfen\n"
+"'%s' dosyasını denetleyin,\n"
+"veya --config ile farklı bir dosya belirtin.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Uyarı: Sistem ve kullanıcı wgetrc'si %s konumunu işaret ediyor.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Geçersiz --execute komutu %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: %s geçersiz değer; `on' veya `off değeri kullanın.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: Geçersiz %s; `on', `off' ya da `quiet' kullanın.\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Geçersiz sayı %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s sadece bir defa kullanılmalı\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Geçersiz bayt değeri %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: %s geçersiz bir zaman aralığı\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: %s geçersiz bir zaman aralığı\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass bir karakter dizisi ya da WGET_ASKPASS veya SSH_ASKPASS ortam "
+"değişkenlerinden birinin ayarlanmasını gerektirir.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Geçersiz değer %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Geçersiz başlık bilgisi %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Geçersiz WARC başlığı %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Geçersiz süreç türü %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Geçersiz kısıtlama %s,\n"
+" [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii] kullan.\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "%s kodlaması geçerli değil\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "%s 'ten %s 'e dönüştürme desteklenmiyor\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Tamamlanmamış veya geçersiz çoklu bayt dizisi ile karşılaşıldı\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Bilinmeyen hata kodu %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: yerel ayarlı değil\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode başarısız (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Küçük harfe dönüştürme başarısız:%d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Çıktı şuraya yönlendiriliyor: %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; giriÅŸ iptalediliyor.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Kullanımı: %s [SEÇENEK]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Uzun seçeneklerdeki zorunlu argümanlar kısa seçeneklerde de zorunludur.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Başlangıç:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version Wget sürümünü gösterir ve çıkar\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help bu yardım metnini göster\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background arkaplanda başlatılır\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=COMMAND `.wgetrc'-tarzı bir komut çalıştır\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Günlük kaydı ve girdi dosyası:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=DOSYA günlük kayıtlarını DOSYA'ya yaz\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=DOSYA iletileri DOSYAya ekle\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug çokça hata ayıklama bilgisi göster\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug Watt-32 hata ayıklama çıktısını yazdır\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet sessiz (çıktı yok)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose ayrıntılı bilgi ver (bu parametre "
+"öntanımlıdır)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose ayrıntılı bilgi vermeyi kapat, sessiz olmadan\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TÜR bant genişliğini TÜR olarak çık. TÜR bit "
+"olabilir\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=DOSYA yerelde ya da dışarıda bulunan DOSYA "
+"içerisindeki adresleri indir\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --metalink-file=DOSYA yerel Metalink DOSYAsında belirtilen "
+"dosyaları indir\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html girdi dosyasının HTML olduğu varsay\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL HTML girdi-dosya bağlantılarını dönüştür (-i -"
+"F)\n"
+" URL'ye bağlı olarak\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=DOSYA kullanılacak yapılandırma dosyasını "
+"belirt\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config herhangi bir yapılandırma dosyası okuma\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=DOSYA reddedilen URLlerin sebeplerini DOSYAya "
+"yaz\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Ä°ndirme:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=SAYI yeniden deneme sayısını SAYI olarak ayarla "
+"(0 sınırsız)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused bağlantı reddedilse bile yeniden dene\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --ignore-tags=LISTE gözardı edilen HTML etiketlerinin "
+"virgülle-ayrılmış listesi\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=DOSYA belgeleri DOSYAya yaz\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber varolan dostaların üzerine yazacak\n"
+" indirmeleri atla (dosyaları ezecek)\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-config herhangi bir yapılandırma dosyası okuma\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue parçalı-indirilen dosyayı indirmeye devam et\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=UZAKLIK indirmeyi sıfır-tabanlı pozisyon "
+"UZAKLIK'ından başlat\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=TÜR süreç ölçekleme TÜRünü seç\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --show-progress işlem çubuğunu herhangi ayrıntı seviyesi "
+"modunda göster\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping yerelden daha yeni olmayan dosyaları "
+"yeniden\n"
+" indirme\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since timestamping modundaki get isteklerinde "
+"durumsal\n"
+" if-modified-since parametresini "
+"kullanma\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps yerel dosyanın zaman damgasını sunucu\n"
+" üzerindekine ayarlama\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response sunucunun yanıtını göster\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider hiçbir şey indirme\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=SANİYE bütün zaman aşımı değerlerini SANİYE "
+"olarak ayarla\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADRESLER sorgulanacak DNS sucunuları listesi "
+"(virgülle ayrılmış)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ADRES yerel makinede DNS çözücüyü ADRES (makine "
+"adı ya da IP) e bağla\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=SANİYE DNS sorgulama zaman aşımı süzesini "
+"SANÄ°YE olarak ayarla\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=SANIYE bağlantı zaman aşımı süresini SANIYE "
+"olarak ayarla\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=SANİYE okuma zaman aşımı süresini SANİYE "
+"olarak ayarla\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=SANİYE bilgi çekmeler arasında SANİYE kadar "
+"bekle\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SANİYE bilgi çekme yeniden denemeleri arasında "
+"1 ..SANÄ°YE bekle\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait bilgi çekmeler arasında "
+"0.5*WAIT...1.5*WAIT sn bekle\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy vekil sunucuyu kapat\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=SAYI alım kotasını SAYIya ayarla\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADRES yerel makinede ADRES (makine ismi ya da IP) e "
+"baÄŸlan\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=ORAN indirme oranını ORAN olarak sınırla\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache DNS ön belleklemesini kapat\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=Ä°S dosya isimlerini Ä°ÅŸletim Sistemi'nin izin "
+"verdiği karakterlerle sınırla\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case dosya/dizin eşleştirmesinde büyük/küçük "
+"harf ayrımını gözardı et\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only sadece IPv4 adreslere baÄŸlan\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only sadece IPv6 adreslere baÄŸlan\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=AİLE önce belirtilen ailedeki adreslere bağlan,\n"
+" Pv6, IPv4, ya da none arasından biri\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=KULLANICI hem ftp hem de http kullanıcısını "
+"KULLANICI olarak ayarla\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=PAROLA hem ftp hem de http kullanıcı "
+"parolasını PAROLA olarak ayarla\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password parola sor\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=KOMUT kullanıcı adı ve parolası istemek için "
+"kullanıcı \n"
+" bilgileri iÅŸleyicisini belirtin. EÄŸer "
+"herhangi bir KOMUT \n"
+" belirtilmezse WGET_ASKPASS ya da "
+"SSH_ASKPASS \n"
+" ortam değişkenleri kullanılacaktır.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri IRI desteÄŸini kapat\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC IRI'ler için yerel kodlama olarak ENC "
+"kullan\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=ENC varsayılan uzak kodlama olarak ENC "
+"kullan\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink dosyayı bozmadan önce kaldır\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash checksum değerleri eşleşmeyen dosyaları "
+"koru (.badhash ekle)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=SAYI Üst bağlantı uygulaması/metalink4+xml üst "
+"url sıra SAYISI\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http HTTP yanıtı başlıklarından gelen Üst "
+"bağlantı (Metalink) üst verilerini kullan\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location Üst bağlantı (Metalink) kaynakları için "
+"tercih edilen konum\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr genişletilmiş dosya özelliklerinde "
+"üstveri depolamasını kapat\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Dizinler:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories dizin oluÅŸturma\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories dizin oluşturulmasını zorla\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories istemci dizinleri oluÅŸturma\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories dizinlerde protokol ismi kullan\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=ÖNEK dosyaları ÖNEKe kaydet/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=SAYI SAYI kadar uzak dizin bileÅŸenini yoksay\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP seçenekleri:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=KULLANICI http kullanıcısını KULLANICI olarak "
+"ayarla\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=PAROLA http kullanıcı parolasını PAROLA olarak "
+"ayarla\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache sunucu veri önbelleklemesine izin verme\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=İSİM varsayılan ana sayfayı değiştir(normalde\n"
+" bu sayfa 'index.html'dir.)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension HTML/CSS belgelerini uygun uzantılarla "
+"kaydet\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length 'Content-Length' başlık alanını yoksay\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+" --header=KARAKTERDİZİSİ başlıklar boyunca KARAKTERDİZİSİ "
+"ekle\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect sayfa başına izin verilen en fazla "
+"yönlendirme sayısı\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=İSİM vekil sunucu kullanıcı ismini İSMİ olarak "
+"ayarla\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=PAROLA vekil sunucu kullanıcı parolasını "
+"PAROLA olarak ayarla\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL HTTP isteğine 'Referer: URL' başlığını da "
+"ekle\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers HTTP başlıklarını dosyaya kaydet\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr " -U, --user-agent=AJAN Wget/SÜRÜM yerine AJAN olarak tanımla\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive HTTP keep-alive (sürekli bağlantı) özelliğini "
+"kapat\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies çerezler kullanma.\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=DOSYA çerezleri oturumdan önce DOSYAdan yükle\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=DOSYA oturum sonrası çerezleri DOSYAya kaydet\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies oturum (kalıcı-olmayan) çerezlerini yükle "
+"ve kaydet\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=KARAKTERDÄ°ZÄ°SÄ° POST metodunu kullan; veri olarak "
+"KARAKTERDİZİSİni gönder\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=DOSYA POST metodunu kullan; veri olarak DOSYA "
+"içeriğini gönder\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMetod istekteki \"HTTPMetod\" metodunu kullan\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=KARAKTERDIZISI veri olarak KARAKTERDÄ°ZÄ°SÄ°ni "
+"gönder. --method ayalanmış OLMALIDIR\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=DOSYA DOSYAnın içeriklerini gönder. --method "
+"AYARLANMALIDIR\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition Content-Disposition başlığını yerel\n"
+" dosya adları seçerken kabul et (DENEYSEL)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error sunucu hatalarında alınan içeriği göster\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge Temel HTTP yetkilendirme bilgisini önce\n"
+" sunucu meydan okumasını beklemeden\n"
+" gönder\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) seçenekleri:\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR güvenlik protokolünü seç, auto, SSLv2,\n"
+" SSLv3, TLSv1 ve PFS'ten biri\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only sadece güvenli HTTPS bağlantılarını izle\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate sunucu sertifikasını doğrulama\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=DOSYA istemci sertifika dosyası\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TÜR istemci sertifika türü, PEM ya da DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=DOSYA gizli anahtar dosyası\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=TÜR gizli anahtar türü, PEM ya da DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=DOSYA CA paketini içeren dosya\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DİZİN CA'ların hash listelerinin depolandığı "
+"dizin\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=DOSYA CRL paketlerini içeren dosya\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=DOSYA/KARMALAR Eşi doğrulamak için genel anahtar (PEM/"
+"DER)\n"
+" dosyası ya da önüne 'sha256//' konmuş "
+"ve ';'\n"
+" ile birbirinden ayrılmış herhangi bir "
+"sayıda,\n"
+" base64 ile şifrelenmiş sha256 karması\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=DOSYA SSL PRNG'i beslemek için rastgele veri "
+"içeren dosya\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=FILE EGD soketini isimlendirmek için rastgele "
+"veri içeren dosya\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS seçenekleri:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts HSTS'i kapat\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file HSTS veritabanı yolu (varsayılanı ezer)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP seçenekleri:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf bütün ikili FTP dosyaları için Stream_LF "
+"biçimini kullan\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=KULLANICI ftp kullanıcısını KULLANICI olarak "
+"ayarla\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=PAROLA ftp kullanıcı parolasını PAROLA olarak "
+"ayarla\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing '.listing' dosyalarını silme\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob FTP dosya ismi arama kalıplarını kapat\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp \"passive\" aktarma modunu kapat\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions uzak dosya izinlerini koru\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks yineleme sırasında, bağlantılanan "
+"dosyaları getir (dizinler değil)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTP seçenekleri:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit dahili FTPS'i kullan (varsayılan port "
+"990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl bir veri bağlantısı açılışı sırasında "
+"kontrol bağlantısında başlatılan\n"
+" SSL/TLS oturumunu devam ettir\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection sadece kontrol kanalını şifrele; "
+"bütün veri düz metin olacak\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp hedef sunucuda FTPS desteklenmiyorsa "
+"FTP kullan\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC seçenekleri:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=DOSYAADI istek/yanıt verisini bir .warc.gz "
+"dosyasına kaydet\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=DİZGE DİZGEyi warcinfo kaydına ekle\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=SAYI WARC dosyaların azami boyutunu SAYI "
+"olarak ayarla\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx CDX dizin dosyalarını yaz\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=DOSYAISMI bu CDX dosyasında listeli kayıtları "
+"kaydetme\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression WARC dosyalarını GZIP ile sıkıştırma\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests SHA1 özetlerini hesaplama\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log günlük dosyasını bir WARC kaydında "
+"depolama\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=DİZİN lWARC yazıcı tarafından oluşturulan geçici "
+"dosyalar\n"
+" için konum\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Yinelemeli indirme:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive yinelemeli indirmeyi etkinleÅŸtir\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=SAYI en fazla yineleme derinliği (sonsuz için "
+"inf ya da 0)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after indirdikten sonra dosyaları yerel olarak "
+"sil\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links indirilen HTML ya da CSS dosyalarındaki "
+"bağlantıları yerel\n"
+" dosyaları gösterecek şekilde değiştir\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only URLlerde sadece dosya kısımlarını "
+"dönüştür (genellikle basename olarak bilinir)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N X dosyasını yazmadan önce, N kadar yedek "
+"dosyası çevir\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted X dosyasını dönüştürmeden önce, X_orig "
+"olarak yedekle\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted X dosyasını dönüştürmeden önce, X.orig "
+"olarak yedekle\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror -N -r -l inf--no-remove-listing için "
+"kısayol\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites HTML sayfada gösterilmesi gerekenleri, "
+"bütün resimler vs. indir\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments HTTP yorumlarının sıkı şekilde ele "
+"alınmasını (SGML) aç\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Yinelemeli kabul/red seçenekleri:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=LISTE kabul edilen uzantıların virgülle-"
+"ayrılmış listesi\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=LISTE reddedilen uzantıların virgülle-ayrılmış "
+"listesi\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=DÜZENLİİFADE kabul edilen URLler için düzenli "
+"ifade\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=DÜZENLİİFADE reddedilen URLler için düzenli "
+"ifade\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TÜR düzenli ifade türü (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=TÜR düzenli ifade türü (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=LIST kabul edilen alan adlarının virgülle-"
+"ayrılmış listesi\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=LIST reddedilen alan adlarının virgülle-"
+"ayrılmış listesi\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp HTML belgelerindeki FTP bağlantılarını "
+"takip et\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=LISTE takip edilen HTML etiketlerini virgülle-"
+"ayrılmış listesi\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LISTE gözardı edilen HTML etiketlerinin "
+"virgülle-ayrılmış listesi\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts yinelemeli modda yabancı istemcilere git\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative sadece göreli bağlantıları takip et\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=LISTE izin verilen dizinlerin listesi\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names yönlendirme URLinin son bileşeni ile "
+"belirtilen\n"
+" ismi kullan\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=LIST dışlanan dizinlerin listesi\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent bir üst dizine çıkma\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, bir etkileşimsiz dosya/dizin indirme aracı.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "%s kullanıcısının parolası: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Parola: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "veriyolu oluşturulamıyor\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "use-askpass için oluşturma dosyası eylemlerini başlatma hatası: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "use-askpass için oluşturma dosyası eylemlerini ayarlama hatası: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "\"%s %s\" komutundan yanıt okuma hatası: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "'%s%s' için kullanıcı adı: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "'%s%s@%s' için kullanıcı parolası: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Yerel: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Derle: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Bağlantı: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s, %s üzerinde inşa edildi.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (env)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (kullanıcı)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (sistem)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Telif Hakkı (C) %s Özgür Yazılım Vakfı, AŞ.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Lisans GPLv3+: GNU GPL sürüm 3 veya sonrası\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"Bu, özgür bir yazılımdır: değiştirmek ve tekrar dağıtmakta özgürsünüz.\n"
+"İzin verilen yasalar kapsamı dahilinde GARANTİSİ YOKTUR.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Özgün olarak Hrvoje Niksic <hniksic@xemacs.org> tarafından yazıldı.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Lütfen hata raporlarını ve sorularınızı <bug-wget@gnu.org> adresine "
+"gönderin.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Bellek tahsis sorunu\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "%s içindeki hata nedeniyle çıkılıyor\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Daha fazla seçenek için `%s --help' yazın.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: seçenek uygun değil -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Hata yıklama desteği derlemeye dahil edilmedi. --debug bayrağı "
+"yoksayılıyor.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"--no-clobber ve --convert-links aynı anda belirtildi, sadece --convert-links "
+"kullanılacak.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"--no-clobber ve --convert-file-only aynı anda belirtildi, sadece -convert-"
+"file-only kullanılacak.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Hem çok detaylı hem de sessiz olmaz.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Eski dosyaları hem zaman damgalamak hem de dokunmamak olmaz.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Hem --inet4-only hem de --inet6-only olmaz.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Birden fazla bağlantı girilmişse -k ve -O aynı anda veya\n"
+"-p veya -r ile birlikte belirtilemez. Ayrıntılar için kılavuza bakın.\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"UYARI: -O seçeneğini -r ya da -p ile birlikte kullanmak indirilen tüm "
+"içeriğin\n"
+"belirteceÄŸiniz tek dosyaya kaydedilmesini saÄŸlar.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"UYARI: zaman damgası, -O ile bileşik kullanılırsa hiçbir şey yapmaz. "
+"Ayrıntılar için\n"
+"kılavuza bakın.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"WARC çıktısı --no-clobber ile çalışamayacağından, --no-clobber devre dışı "
+"bırakılacak.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"WARC çıktısı zaman damgası ile çalışamayacağından, zaman damgası devre dışı "
+"bırakılacak.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC çıktısı --spider ile çalışmaz.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC çıktısı --continue ya da --start-pos ile çalışamayacağından, bunlar "
+"devre dışı bırakılacak.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Özetler devre dışı; WARC kopya kaldırıcı kopya kayıtlarını bulmayacak.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"WARC çıktısı --continue ya da --start-pos ile çalışamayacağından, bunlar "
+"devre dışı bırakılacak.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "--ask-password ve --password seçenekleri birlikte kullanılamaz.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Hem --start-pos hem de --continue belirtmek önerilmez; --continue devre dışı "
+"bırakılacak.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: URL kayıp\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "--post-data ve --post-file aynı anda kullanılamaz.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"--post-data veya --post-file seçeneklerini --method ile birlikte "
+"kullanamazsınız. --method, --body-data ve --body-file seçenekleri ile veri "
+"bekler\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"--body-data veya --body-file ile kullanılabilmesi için --method=HTTPMethod "
+"ile bir yöntem belirtmelisiniz.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "--body-data ve --body-file aynı anda kullanılamaz.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Bu sürüm IRI'ler için destek sunmuyor\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k ya da -r, -O seçeneği ile sadece düzenli bir dosyaya çıktı alınıyorsa "
+"birlikte\n"
+"kullanılabilir.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links ya da --convert-file-only seçenekleri, sadece düzenli bir "
+"dosyaya çıktı alınıyorsa birlikte\n"
+"kullanılabilir.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "libcares ilklendirilemedi\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "c-ares kanalı ilklendirilemedi\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "'%s' IP adresi çözümlenemedi\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "DNS sunucu(ları) '%s' (%d) ayarlanamadı\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "%s de URL yok.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Üst bağlantı dosyası %s çözümlenemedi.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "%s'den bütün kaynaklar indirilemedi\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"TAMAMLANDI --%s--\n"
+"Toplam duvar saati zamanı: %s\n"
+"İndirilen: %d dosya, %s, %s (%s) içerisinde\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "Dosya indirme kotası %s AŞILDI!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O, üst bağlantı indirmesi için desteklenmiyor. Gözardı edilecek.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Planlanan üst bağlantı dosyası: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Güvenli üst bağlantı dosyası: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Üst bağlantı dosyası reddediliyor. Güvensiz ad.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Üstbağlantı işleniyor %s...\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Üstbağlantı dosyası %s reddediliyor. Güvensiz isim.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "%s'in indirilmesi başarısız oldu. Üst url atlanıyor.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Üst url dosyası %s çözümlenemedi.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Üst url (metaurl) işleme, hata döndürdü.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "%s kaynak türü desteklenmiyor, gözardı edilecek...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "İndirilen dosya açılamadı.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "%s için boyut hesaplanıyor\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Dosya boyutu bildirilmedi. Denetim atlanıyor.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "İndirilen dosyanın boyutu alınamadı.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "%s dosyası için boyut eşleşmiyor.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Boyut eÅŸleÅŸiyor.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "%s için sağlama toplamı hesaplanıyor\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Sağlama toplamı eşleşiyor.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "%s için sağlama toplamı eşleşmiyor.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "İmza doğrulaması için indirilen dosya açılamadı.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "İmza doğrulama başarıyla tamamlandı.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Geçersiz imza. Kaynak reddediliyor.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Veriler imzayla eşleşiyor fakat imzaya güvenilmiyor.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Hiçbir sağlama bulunamadı.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "%s'in indirilmesi başarısız oldu. Kaynak atlanıyor.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "%s dosyası alındı ancak boyut eşleşmiyor.\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "%s dosyası alındı ancak sağlama toplamı eşleşmiyor.\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "%s dosyası alındı ancak imza eşleşmiyor.\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "%s, %s olarak yeniden adlandırılıyor.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Ardalanda sürüyor.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "İşlem PID %lu ile artalanda sürüyor.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Çıktı şuraya yazılacak: %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() başarısız\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() başarısız\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Kullanılabilir soket sürücü bulunamadı.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() başarısız. Yuva, engelleyici olarak ayarlanamadı.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+"%s: %s:%d: uyarı: %s andacı herhangi bir makine adından önce görünüyor\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: bilinmeyen dizgecik \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Kullanım: %s NETRC [MAKİNA-ADI]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: %s durumlanamadı: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "DİKKAT: rasgele sayı üreteci yeterli değil.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Rasgele sayı üreteci tohumlanamadı; --random-file kullanılabilir.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "OpenSSL versiyonunuz TLSv1.1'i destemek için çok eski.\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "OpenSSL versiyonunuz TLSv1.1'i destemek için çok eski.\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "OpenSSL versiyonunuz TLSv1.2'i destemek için çok eski.\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: uygulanmayan 'secure-protocol' seçenek değeri %d\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL `%s' geçersiz: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Rasgele sayı üreteci tohumlanamadı; --random-file kullanılabilir.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: %s sertifikası doğrulanamıyor. %s tarafından sağlanmış:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Yerel olarak sağlayıcının kimliği doğrulanamıyor.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Kendinden imzalı sertifika tespit edildi.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Verilen sertifika henüz geçerli değil.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Verilen sertifikanın süresi dolmuş.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: sertifika konu alternatif ismi istenen\n"
+"\tmakine adı %s ile eşleşmiyor.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: ortak sertifika adı %s, istenen makine adı %s ile eşleşmiyor.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: ortak sertifika ismi geçersiz (NUL karakteri içeriyor).\n"
+" Bu, olduğunu iddia ettiği sunucu olmama göstergesi olabilir\n"
+" (gerçek %s değil demektir).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"%s adresine güvenliği gözardı ederek bağlanmak için `--no-check-certificate' "
+"seçeneğini kullanın.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ atlanıyor %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Geçersiz nokta biçem niteliği %s; değiştirilmeden bırakılıyor.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " kalan %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " içinde "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "RTC saptanamadı: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Reddedileceğinden %s kaldırılıyor.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "%s açılamıyor: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "robots.txt yükleniyor; lütfen hataları yoksayın.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Vekil URLsi %s çözümlenirken hata: %s\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Vekil URLsi %s: HTTP olmalı.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d yönlendirme geçildi.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Vazgeçiliyor.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Tekrarlanıyor.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Hatalı adres bulunamadı.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"%d adet hatalı adres bulundu.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Hata yok"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Desteklenmeyen ÅŸema %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Åžema eksik"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Makine ismi geçersiz"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Port numarası hatalı"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Kullanıcı ismi geçersiz"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "IPv6 sayısal adresi sonlandırılmamış"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 adresler desteklenmiyor"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "IPv6 sayısal adresi geçersiz"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "HTTPS desteÄŸi derlenirken eklenmemiÅŸ"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Tamamlanmamış veya geçersiz çoklu bayt dizisi ile karşılaşıldı\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Yeterince bellek ayırma başarısız; bellek yoruldu.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: %ld baytı ayırmak mümkün olmadı; bellek tükenmiş olabilir.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: metin tamponu çok büyük (%d bytes), iptal ediliyor.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Ardalanda sürüyor, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Symlink %s bağlantısı kaldırılamıyor: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "libcares ilklendirilemedi\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "%s için izinler ayarlanamadı.\n"
+
+#: src/utils.c:892
+#, fuzzy, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "%s için izinler ayarlanamadı.\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "'%s' IP adresi çözümlenemedi\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "%s için izinler ayarlanamadı.\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Geçersiz düzenli ifade %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Geçersiz düzenli ifade %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "%s eÅŸleÅŸtirilirken hata: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "%s WARC dosyası açılırken hata.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "%s WARC dosyası açılırken hata.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "%s WARC dosyası açılırken hata.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "WARC dosyasına GZIP akışı açılırken hata.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "WARC dosyasına warcinfo kaydı yazılırken hata.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"%s WARC dosyası açılıyor.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "%s WARC dosyası açılırken hata.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX dosyası özgün adresleri listelemiyor. ('a' sütunu eksik.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX dosyası sağlama toplamını listelemiyor. ('k' sütunu eksik.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX dosyası kayıt kimliklerini listelemiyor ('u' sütunu eksik)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"CDX dosyasından %d kayıt yüklendi.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Yineleme kaldırması için %s CDX dosyası okunamadı.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Geçici WARC bildirim dosyası açılamadı.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Geçici WARC günlük dosyası açılamadı.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "WARC dosyası açılamadı.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "CDX dosyası çıktı için açılamadı.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Geçici WARC dosyası açılamadı.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"CDX dosyasında tam eşleşme bulundu. Tekrar ziyaret kaydı WARC'a "
+"kaydediliyor.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Bilinmeyen sistem hatası"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Sunucu adı için adres ailesi desteklenmiyor"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ai_flags için bozuk değer"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "İsim çözümlemesinde kurtarılamaz bir hata oluştu"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family desteklenmiyor"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Bellek ayırma başarısız"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Sunucu adı ile bir adres ilişkilendirilmemiş"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Ä°sim veya hizmet bilinmiyor"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "ai_socktype için servname desteklenmiyor"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype desteklenmiyor"
+
+#~ msgid "System error"
+#~ msgstr "Sistem hatası"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Argüman tamponu çok küçük"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "İşleme talebi ele alınıyor"
+
+#~ msgid "Request canceled"
+#~ msgstr "Ä°stek iptal edildi"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Ä°stek iptal edilmedi"
+
+#~ msgid "All requests done"
+#~ msgstr "Tüm istekler tamamlandı"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Bir sinyal tarafından iptal edildi"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Parametre dizgesi doğru bir şekilde kodlanmamış"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: '%s' seçeneği belirsiz; olasılıklar:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: '%s' seçeneği belirsiz\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: '--%s' seçeneği bağımsız değişkene izin vermiyor\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: '%c%s' seçeneği bağımsız değişkene izin vermiyor\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: '--%s' seçeneği bağımsız bir değişken gerektiriyor\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: tanınmayan seçenek '--%s'\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: tanınmayan seçenek '%c%s'\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: geçersiz seçenek -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: seçenek bir bağımsız değişken gerektiriyor -- '%c'\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: '-W %s' seçeneği belirsiz\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: '-W %s' seçeneği bağımsız bir değişkene izin vermiyor\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: '-W %s' seçeneği bağımsız bir değişken gerektiriyor\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "Başarılı"
+
+#~ msgid "No match"
+#~ msgstr "EÅŸleÅŸme yok"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Geçersiz düzenli ifade"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Geçersiz katıştırma karakteri"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Geçersiz karakter sınıfı adı"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Satır sonunda ters bölü"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Geçersiz geri referans"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "EÅŸleÅŸmeyen [, [^, [:, [., ya da [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "EÅŸleÅŸmeyen ( ya da \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "EÅŸleÅŸmeyen \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Geçersiz \\{\\} içeriği"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Geçersiz aralık sonu"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Bellek tükendi"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Geçersiz önce gelen düzenli ifade"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Düzenli ifadenin erken sonu"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Düzenli ifade çok büyük"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "EÅŸleÅŸmeyen ) ya da \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Önceki düzenli ifade yok"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "veriyolu oluşturulamıyor"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s alt süreç başarısız"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle başarısız"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "fd geri yüklenemiyor %d: dup2 başarısız"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s alt süreç"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s alt süreci %d ölümcül sinyalini aldı"
+
+#~ msgid "memory exhausted"
+#~ msgstr "bellek tükendi"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Yazılım hatalarını ve önerilerinizi <bug-wget@gnu.org> adresine bildirin\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "`%s' dosyası zaten var; alınmayacak.\n"
+
+#, fuzzy
+#~| msgid "%s: Invalid URL %s: %s\n"
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "%s: URL `%s' geçersiz: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode başarısız (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "%s alındı.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Yetkilendirme başarısız.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries bir dosya için yeniden deneme sayısını "
+#~ "belirtin.\n"
+#~ " (--metalink-file ile kullanılması "
+#~ "gerekli)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr ""
+#~ " --jobs kaç iş parçacığının kullanılacağını "
+#~ "belirt.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Bir üst bağlantıdan indirme işlemi yapılırken "
+#~ "kullanıcı adı ve parola bilgileri gerekli değildir.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s, --metalink ile kullanılamaz.\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Set-Cookie, `%s' alanında hata"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: kuraldışı seçenek -- %c\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - %s/%s baytta bağlantı kesildi. "
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: `%s' mantıken geçersiz;\n"
+#~ "`always', `on', `off' veya `never' kullanın.\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=ADRES -F -i DOSYA kullanımındaki göreli "
+#~ "bağların\n"
+#~ " önüne konacak ADRES\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy vekili etkinleÅŸtirir.\n"
+
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "Bu program faydalı olacağı umularak dağıtılmaktadır. Hiçbir\n"
+#~ "GARANTİSİ YOKTUR; SATILABİLİRLİĞİ hatta HERHANGİ BİR AMACA\n"
+#~ "UYGUNLUĞU için bile garanti verilmez. Ayrıntılar için GNU\n"
+#~ "Genel Kamu Lisansına bakınız.\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s: %s için sertifika doğrulama hatası: %s\n"
+
+#~ msgid "Failed writing to proxy: %s.\n"
+#~ msgstr "Vekile yazılamadı: %s.\n"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "`%s' zaten var, alınmayacak.\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%s/%s])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - `%s' kaydedildi [%s/%s])\n"
+#~ "\n"
+
+#~ msgid "Empty host"
+#~ msgstr "BoÅŸ konak"
+
+#~ msgid "Unable to convert `%s' to a bind address. Reverting to ANY.\n"
+#~ msgstr "`%s' bir bağlantı adresine dönüştürülemedi. ANY'ye dönülüyor.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "REST failed; will not truncate `%s'.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "REST başarısız; `%s' devam etmeyecek.\n"
+
+#~ msgid " [%s to go]"
+#~ msgstr " [%s gider]"
+
+#~ msgid "Host not found"
+#~ msgstr "Makina bulunamadı"
+
+#~ msgid "Failed to set up an SSL context\n"
+#~ msgstr "Bir SSL bağlamı belirlenemedi\n"
+
+#~ msgid "Trying without the specified certificate\n"
+#~ msgstr "Belirtilen sertifikasız deneniyor\n"
+
+#~ msgid "End of file while parsing headers.\n"
+#~ msgstr "Başlıklar çözümlenirken dosya sonuyla karşılaşıldı.\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Continued download failed on this file, which conflicts with `-c'.\n"
+#~ "Refusing to truncate existing file `%s'.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Sunucu kesilen indirme iÅŸlemine devam etmeyi desteklemiyor,\n"
+#~ "bu da `-c' ile çelişiyor. `%s' dosyası alınamıyor.\n"
+#~ "\n"
+
+#~ msgid " (%s to go)"
+#~ msgstr " (%s gider)"
+
+#~ msgid ""
+#~ "Startup:\n"
+#~ " -V, --version display the version of Wget and exit.\n"
+#~ " -h, --help print this help.\n"
+#~ " -b, --background go to background after startup.\n"
+#~ " -e, --execute=COMMAND execute a `.wgetrc'-style command.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "BaÅŸlatma:\n"
+#~ " -V, --version Wget sürümünü gösterir ve çıkar.\n"
+#~ " -h, --help bu iletiyi gösterir.\n"
+#~ " -b, --background başlatıldıktan sonra ardalana gider.\n"
+#~ " -e, --execute=KOMUT bir `.wgetrc' KOMUTunu çalıştırır.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Logging and input file:\n"
+#~ " -o, --output-file=FILE log messages to FILE.\n"
+#~ " -a, --append-output=FILE append messages to FILE.\n"
+#~ " -d, --debug print debug output.\n"
+#~ " -q, --quiet quiet (no output).\n"
+#~ " -v, --verbose be verbose (this is the default).\n"
+#~ " -nv, --non-verbose turn off verboseness, without being quiet.\n"
+#~ " -i, --input-file=FILE download URLs found in FILE.\n"
+#~ " -F, --force-html treat input file as HTML.\n"
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Oturum açma ve girdi dosyası:\n"
+#~ " -o, --output-file=DOSYA günlüğü DOSYA ya yazar.\n"
+#~ " -a, --append-output=DOSYA iletileri DOSYAya ekler.\n"
+#~ " -d, --debug hata ayıklama iletileri gösterir.\n"
+#~ " -q, --quiet sessiz (çıktı verilmez).\n"
+#~ " -v, --verbose çıktı daha ayrıntılı olur (öntanımlı).\n"
+#~ " -nv, --non-verbose çıktı ayrıntılı olmaz.\n"
+#~ " -i, --input-file=DOSYA DOSYAda bulunan URLleri indirir.\n"
+#~ " -F, --force-html girdi dosyası HTML olarak işlenir.\n"
+#~ " -B, --base=URL -F -i DOSYA içindeki göreceli bağlara\n"
+#~ " önhazırlık olarak URL atar.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Download:\n"
+#~ " -t, --tries=NUMBER set number of retries to NUMBER (0 "
+#~ "unlimits).\n"
+#~ " --retry-connrefused retry even if connection is refused.\n"
+#~ " -O --output-document=FILE write documents to FILE.\n"
+#~ " -nc, --no-clobber don't clobber existing files or use .# "
+#~ "suffixes.\n"
+#~ " -c, --continue resume getting a partially-downloaded "
+#~ "file.\n"
+#~ " --progress=TYPE select progress gauge type.\n"
+#~ " -N, --timestamping don't re-retrieve files unless newer than "
+#~ "local.\n"
+#~ " -S, --server-response print server response.\n"
+#~ " --spider don't download anything.\n"
+#~ " -T, --timeout=SECONDS set all timeout values to SECONDS.\n"
+#~ " --dns-timeout=SECS set the DNS lookup timeout to SECS.\n"
+#~ " --connect-timeout=SECS set the connect timeout to SECS.\n"
+#~ " --read-timeout=SECS set the read timeout to SECS.\n"
+#~ " -w, --wait=SECONDS wait SECONDS between retrievals.\n"
+#~ " --waitretry=SECONDS wait 1...SECONDS between retries of a "
+#~ "retrieval.\n"
+#~ " --random-wait wait from 0...2*WAIT secs between "
+#~ "retrievals.\n"
+#~ " -Y, --proxy=on/off turn proxy on or off.\n"
+#~ " -Q, --quota=NUMBER set retrieval quota to NUMBER.\n"
+#~ " --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+#~ "host.\n"
+#~ " --limit-rate=RATE limit download rate to RATE.\n"
+#~ " --dns-cache=off disable caching DNS lookups.\n"
+#~ " --restrict-file-names=OS restrict chars in file names to ones OS "
+#~ "allows.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ä°ndirme:\n"
+#~ " -t, --tries=SAYI tekrar SAYIsı (0 sınırsız).\n"
+#~ " --retry-connrefused bağlantı reddedilse bile dener.\n"
+#~ " -O --output-document=DOSYA belgeleri DOSYAya yazar.\n"
+#~ " -nc, --no-clobber mevcut dosyaların üstüne yazılmaz ve .# "
+#~ "öneki\n"
+#~ " kullanılır.\n"
+#~ " -c, --continue yarım kalan bir dosyaya devam edilir.\n"
+#~ " --progress=TÜRÜ işlemin gösterge türü belirtilir.\n"
+#~ " -N, --timestamping yerel dosyadan daha eskiyse iÅŸleme "
+#~ "baÅŸlamaz.\n"
+#~ " -S, --server-response sunucu cevabını gösterir.\n"
+#~ " --spider hiçbir şey indirilmez.\n"
+#~ " -T, --timeout=SANİYE okuma SANİYE sonra zamanaşımına uğrar.\n"
+#~ " --dns-timeout=SANİYE DNS araması SANİYE sonra zamanaşımına "
+#~ "uÄŸrar.\n"
+#~ " --connect-timeout=SANİYE bağlantı SANİYE sonra zamanaşımına "
+#~ "uÄŸrar.\n"
+#~ " --read-timeout=SANİYE okuma SANİYE sonra zamanaşımına uğrar.\n"
+#~ " -w, --wait=SANİYE işlemler arasında 1...SANİYE kadar "
+#~ "bekler.\n"
+#~ " --waitretry=SANİYE işlem tekrarları arasında SANİYE bekler\n"
+#~ " --random-wait işlemler arasında 0...2*WAIT saniye "
+#~ "bekler.\n"
+#~ " -Y, --proxy=on/off vekil bağlantısını açar ya da kapatır.\n"
+#~ " -Q, --quota=SAYI işlem kotasını SAYIya ayarlar.\n"
+#~ " --bind-address=ADRES ADRESe (makina adı ya da IP) bağlanır.\n"
+#~ " --limit-rate=HIZ indirme HIZını sınırlar.\n"
+#~ " --dns-cache=off önbellekleyen DNS aramaları kapatılır.\n"
+#~ " --restrict-file-names=unix|windows\n"
+#~ " dosya isimleri iÅŸletim sistemine uygun "
+#~ "alınır\n"
+#~ " (unix dosya isimlerinde tüm karakterler\n"
+#~ " kullanılabilir).\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Directories:\n"
+#~ " -nd, --no-directories don't create directories.\n"
+#~ " -x, --force-directories force creation of directories.\n"
+#~ " -nH, --no-host-directories don't create host directories.\n"
+#~ " -P, --directory-prefix=PREFIX save files to PREFIX/...\n"
+#~ " --cut-dirs=NUMBER ignore NUMBER remote directory "
+#~ "components.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Dizinler:\n"
+#~ " -nd --no-directories dizinleri oluÅŸturmaz.\n"
+#~ " -x, --force-directories dizin oluÅŸturmaya zorlar.\n"
+#~ " -nH, --no-host-directories konak dizinlerini oluÅŸturmaz.\n"
+#~ " -P, --directory-prefix=DiZiN dosyalar DiZiN/...e kaydedilir.\n"
+#~ " --cut-dirs=ADET ADET karşı dizini yoksayar.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTP options:\n"
+#~ " --http-user=USER set http user to USER.\n"
+#~ " --http-passwd=PASS set http password to PASS.\n"
+#~ " -C, --cache=on/off (dis)allow server-cached data (normally "
+#~ "allowed).\n"
+#~ " -E, --html-extension save all text/html documents with .html "
+#~ "extension.\n"
+#~ " --ignore-length ignore `Content-Length' header field.\n"
+#~ " --header=STRING insert STRING among the headers.\n"
+#~ " --proxy-user=USER set USER as proxy username.\n"
+#~ " --proxy-passwd=PASS set PASS as proxy password.\n"
+#~ " --referer=URL include `Referer: URL' header in HTTP "
+#~ "request.\n"
+#~ " -s, --save-headers save the HTTP headers to file.\n"
+#~ " -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION.\n"
+#~ " --no-http-keep-alive disable HTTP keep-alive (persistent "
+#~ "connections).\n"
+#~ " --cookies=off don't use cookies.\n"
+#~ " --load-cookies=FILE load cookies from FILE before session.\n"
+#~ " --save-cookies=FILE save cookies to FILE after session.\n"
+#~ " --post-data=STRING use the POST method; send STRING as the "
+#~ "data.\n"
+#~ " --post-file=FILE use the POST method; send contents of FILE.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTP seçenekleri:\n"
+#~ " --http-user=KULLANICI http ile KULLANICI belirtir.\n"
+#~ " --http-passwd=PAROLA http ile PAROLA belirtir.\n"
+#~ " -C, --cache=on/off sunucu-önbellekli veriyi engel-ler/lemez.\n"
+#~ " --ignore-length `Content-Length' başlık alanını yoksayar.\n"
+#~ " --header=DiZGE başlıkların arasına DiZGEyi yerleştirir.\n"
+#~ " --proxy-user=KULLANICI Vekil makina için KULLANICI.\n"
+#~ " --proxy-passwd=PAROLA Vekil makina için PAROLA.\n"
+#~ " --referer=URL http isteğinde `Referer: URL' başlığını "
+#~ "içerir.\n"
+#~ " -s, --save-headers HTTP başlıklarını dosyaya kaydeder.\n"
+#~ " -U, --user-agent=Ä°STEMCÄ° Wget/SÃœRÃœM yerine Ä°STEMCÄ° olarak "
+#~ "tanıtılır.\n"
+#~ " --no-http-keep-alive HTTP sürekli bağlantısı etkisizleştirilir.\n"
+#~ " --cookies=off çerezler kabul edilmez.\n"
+#~ " --load-cookies=DOSYA çerezler oturum öncesi DOSYAdan yüklenir.\n"
+#~ " --save-cookies=DOSYA çerezler oturum sonrası DOSYAya yazılır.\n"
+#~ " --post-data=DİZGE POST yöntemi ile veri olarak DIZGE "
+#~ "gönderilir.\n"
+#~ " --post-file=DOSYA POST yöntemi ile içerik DOSYAya "
+#~ "gönderilir.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "HTTPS (SSL) options:\n"
+#~ " --sslcertfile=FILE optional client certificate.\n"
+#~ " --sslcertkey=KEYFILE optional keyfile for this certificate.\n"
+#~ " --egd-file=FILE file name of the EGD socket.\n"
+#~ " --sslcadir=DIR dir where hash list of CA's are stored.\n"
+#~ " --sslcafile=FILE file with bundle of CA's\n"
+#~ " --sslcerttype=0/1 Client-Cert type 0=PEM (default) / 1=ASN1 "
+#~ "(DER)\n"
+#~ " --sslcheckcert=0/1 Check the server cert agenst given CA\n"
+#~ " --sslprotocol=0-3 choose SSL protocol; 0=automatic,\n"
+#~ " 1=SSLv2 2=SSLv3 3=TLSv1\n"
+#~ "\n"
+#~ msgstr ""
+#~ "HTTPS (SSL) seçenekleri:\n"
+#~ " --sslcertfile=DOSYA isteğe bağlı istemci sertifikası.\n"
+#~ " --sslcertkey=ANHDSY bu sertifikanın alınacağı dosya.\n"
+#~ " --egd-file=DOSYA EGD soketi için dosya ismi.\n"
+#~ " --sslcadir=DİZİN sertifikaların bulunduğu dizin.\n"
+#~ " --sslcafile=DOSYA sertifikaların bulunduğu dosya\n"
+#~ " --sslcerttype=0/1 İstemci Sertifikası türü:\n"
+#~ " 0=PEM (öntanımlı) / 1=ASN1 (DER)\n"
+#~ " --sslcheckcert=0/1 sunucu setifikasını kontrol etme/et\n"
+#~ " --sslprotocol=0-3 SSL protokolü seçilir; 0=otomatik,\n"
+#~ " 1=SSLv2, 2=SSLv3, 3=TLSv1\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "FTP options:\n"
+#~ " -nr, --dont-remove-listing don't remove `.listing' files.\n"
+#~ " -g, --glob=on/off turn file name globbing on or off.\n"
+#~ " --passive-ftp use the \"passive\" transfer mode.\n"
+#~ " --retr-symlinks when recursing, get linked-to files (not "
+#~ "dirs).\n"
+#~ "\n"
+#~ msgstr ""
+#~ "FTP seçenekleri:\n"
+#~ " -nr, --dont-remove-listing `.listing' dosyaları silinmez.\n"
+#~ " -g, --glob=on/off dosya ismi genellemelerini açar ya da "
+#~ "kapar.\n"
+#~ " --passive-ftp \"pasif\" aktarım kipi kullanılır.\n"
+#~ " --retr-symlinks özyineleme sırasında, dizinlere değil,\n"
+#~ " dosyalara bağı olanlar alınır.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive retrieval:\n"
+#~ " -r, --recursive recursive download.\n"
+#~ " -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+#~ "infinite).\n"
+#~ " --delete-after delete files locally after downloading them.\n"
+#~ " -k, --convert-links convert non-relative links to relative.\n"
+#~ " -K, --backup-converted before converting file X, back up as X.orig.\n"
+#~ " -m, --mirror shortcut option equivalent to -r -N -l inf -"
+#~ "nr.\n"
+#~ " -p, --page-requisites get all images, etc. needed to display HTML "
+#~ "page.\n"
+#~ " --strict-comments turn on strict (SGML) handling of HTML "
+#~ "comments.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Özyinelemeli işlemler:\n"
+#~ " -r, --recursive özyinelemeli web-emme -- dikkatli "
+#~ "kullanın!.\n"
+#~ " -l, --level=SAYI en çok özyineleme derinliği (0 veya inf:"
+#~ "sınırsız).\n"
+#~ " --delete-after indirdikten sonra yerel dosyaları siler.\n"
+#~ " -k, --convert-links göreceli olmayan bağları göreceli yapar.\n"
+#~ " -K, --backup-converted X dosyasını çevirmeden önce X.orig olarak\n"
+#~ " kopyalar\n"
+#~ " -m, --mirror -r -N -l inf -nr seçenekleri için "
+#~ "kısaltma.\n"
+#~ " -p, --page-requisites HTML sayfasının gösterilebilmesi için "
+#~ "gerekli\n"
+#~ " tüm resim dosyalarını alır.\n"
+#~ " --strict-comments HTML açıklamalarını SGML uyumlu yapar.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "Recursive accept/reject:\n"
+#~ " -A, --accept=LIST comma-separated list of accepted "
+#~ "extensions.\n"
+#~ " -R, --reject=LIST comma-separated list of rejected "
+#~ "extensions.\n"
+#~ " -D, --domains=LIST comma-separated list of accepted "
+#~ "domains.\n"
+#~ " --exclude-domains=LIST comma-separated list of rejected "
+#~ "domains.\n"
+#~ " --follow-ftp follow FTP links from HTML "
+#~ "documents.\n"
+#~ " --follow-tags=LIST comma-separated list of followed HTML "
+#~ "tags.\n"
+#~ " -G, --ignore-tags=LIST comma-separated list of ignored HTML "
+#~ "tags.\n"
+#~ " -H, --span-hosts go to foreign hosts when recursive.\n"
+#~ " -L, --relative follow relative links only.\n"
+#~ " -I, --include-directories=LIST list of allowed directories.\n"
+#~ " -X, --exclude-directories=LIST list of excluded directories.\n"
+#~ " -np, --no-parent don't ascend to the parent "
+#~ "directory.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Özyinelemeli kabul/red:\n"
+#~ " -A, --accept=LİSTE kabul edilen uzantıların virgüllü "
+#~ "LÄ°STEsi\n"
+#~ " -R, --reject=LİSTE reddedilen uzantıların virgüllü "
+#~ "LÄ°STEsi.\n"
+#~ " -D, --domains=LİSTE kabul edilen alanların virgüllü "
+#~ "LÄ°STEsi.\n"
+#~ " --exclude-domains=LİSTE reddedilen alanların virgüllü "
+#~ "LÄ°STEsi.\n"
+#~ " --follow-ftp HTML belgelerdeki FTP bağları izler.\n"
+#~ " --follow-tags=LİSTE izlenecek HTML adreslerinin virgüllü\n"
+#~ " LÄ°STEsi\n"
+#~ " -G, --ignore-tags=LÄ°STE izlenmeyecek HTML adreslerinin "
+#~ "virgüllü\n"
+#~ " LÄ°STEsi\n"
+#~ " -H, --span-hosts özyinelerken diğer makinalara da "
+#~ "gider.\n"
+#~ " -L, --relative sadece göreceli bağları izler.\n"
+#~ " -i, --include-directories=LÄ°STE izin verilen dizinlerin LÄ°STEsi.\n"
+#~ " -X, --exclude-directories=LİSTE dışlanan dizinlerin LİSTEsi.\n"
+#~ " -np, --no-parent Üst dizine çıkmaz.\n"
+#~ "\n"
+
+#~ msgid "Starting WinHelp %s\n"
+#~ msgstr "WinHelp %s Başlatılıyor\n"
+
+#~ msgid "%s: %s: Not enough memory.\n"
+#~ msgstr "%s: %s: Bellek yetersiz.\n"
+
+#~ msgid "Syntax error in Set-Cookie at character `%c'.\n"
+#~ msgstr "Set-Cookie `%c' karakterinde sözdizimi hatası.\n"
+
+#~ msgid "%s: %s: Cannot convert `%s' to an IP address.\n"
+#~ msgstr "%s: %s: `%s' bir IP adresine dönüştürülemez.\n"
+
+#~ msgid "%s: %s: invalid command\n"
+#~ msgstr "%s: %s: komut geçersiz\n"
+
+#~ msgid "%s: Redirection cycle detected.\n"
+#~ msgstr "%s: Yönlendirme çevrimi saptandı.\n"
diff --git a/po/uk.gmo b/po/uk.gmo
new file mode 100644
index 0000000..26f85c5
--- /dev/null
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..fc6a10e
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,3707 @@
+# Ukrainian messages for GNU Wget.
+# Copyright (C) 1999 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+#
+# Olexander Kunytsa <xakep@snark.ukma.kiev.ua>, 2004.
+# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2013, 2015, 2016, 2017, 2018, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-07 20:06+0300\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
+"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Lokalize 20.11.70\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: неможливо визначити адреÑу bind %s; вимикаємо bind.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "помилка SO_RCVBUF setsockopt: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "з’єднано.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "невдача: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: неможливо розв'Ñзати адреÑу вузла %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "помилка SO_REUSEADDR setsockopt: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+"Відкрито надто багато файлових деÑкрипторів. Ðе можна викориÑтовувати вибір "
+"Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ð³Ð¾ деÑкриптора >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Перетворено поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ %d файлах за %s Ñекунд.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ñилань у форматі %s... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "нема чого робити.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ копію %s із назвою %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ кукі Ð´Ð»Ñ %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "СинтакÑична помилка в куках: %s в позиції %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Кука, що надійшла з %s, визначає домен "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл з куками %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Помилка запиÑу в %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Помилка Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Тип ліÑтингу невідомий, Ñпроба розібрати в Ñтилі ліÑтингу Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Покажчик каталогу /%s на %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "Ñ‡Ð°Ñ Ð½ÐµÐ²Ñ–Ð´Ð¾Ð¼Ð¸Ð¹ "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Файл "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Каталог "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Ðеточно "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s байт)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Довжина: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", %s (%s) залишилоÑÑŒ"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", %s залишилоÑÑŒ"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (не точно)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ SSL. Протокол буде вимкнено.\n"
+
+# Second: Login with proper USER/PASS sequence.
+# Second: Login with proper USER/PASS sequence.
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Входимо Ñк %s ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Помилка в реакції Ñервера, Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐµÑ€Ñ–Ð²Ð½Ð¾Ð³Ð¾ з'єднаннÑ.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Помилка в привітанні Ñервера.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Помилка запиÑу, Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐµÑ€Ñ–Ð²Ð½Ð¾Ð³Ð¾ з'єднаннÑ.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Сервер відмовив у реєÑтрації.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Ðекоректне Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "РеєÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ð²Ð´Ð°Ð»Ð°ÑÑŒ!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Сервер не прийнÑв команду «PBSZ 0».\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Сервер не прийнÑв команду «PROT %c».\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Помилка Ñервера, не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип ÑиÑтеми.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "зроблено. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "зроблено.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Ðевідомий тип `%c', Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐµÑ€Ñ–Ð²Ð½Ð¾Ð³Ð¾ з'єднаннÑ.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "зроблено. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> CWD не потрібно.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "У getftp() виÑвлено логічно неможливий розділ"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Каталог %s відÑутній.\n"
+"\n"
+
+# do not CWD
+# do not CWD
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> CWD не вимагаєтьÑÑ.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Файл вже отримано.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ PASV-передачу.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Помилка ÑинтакÑичного аналізу відповіді PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "не вдалоÑÑ Ð¿Ñ–Ð´'єднатиÑÑ Ð´Ð¾ %s:%d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Помилка зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ (%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Ðекоректний PORT.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"Команда REST не вдалаÑÑŒ, починаємо з нулÑ.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Файл %s Ñ–Ñнує.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Файл %s відÑутній.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Файл %s відÑутній.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Файл чи каталог %s відÑутній.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s почав Ñвоє Ñ–ÑнуваннÑ.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÐµÑ€Ñ–Ð²Ð½Ð¾Ð³Ð¾ з'єднаннÑ.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - З'єднаннÑ: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Керівне з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¾.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Передачу даних перервано.\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Файл %s вже є тут, не завантажуємо.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(Ñпроба:%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - запиÑаний до stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s збережено [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "СпиÑок буде збережено до тимчаÑового файла %s.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "%s вилучено.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Глибина рекурÑÑ–Ñ— %d перевищила макÑимальну глибину %d.\n"
+
+# Remote file is older, file sizes can be compared and
+# are both equal.
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "Локальний файл %s новіший -- не завантажуємо його.\n"
+
+# Remote file is newer or sizes cannot be matched
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Файл %s на Ñервері новіший -- завантажуємо.\n"
+"\n"
+
+# Sizes do not match
+# Sizes do not match
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Розмір файлів не збігаєтьÑÑ (локальний: %s) -- завантажуємо.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Ðекоректна назва Ñимвольного поÑиланнÑ, пропуÑкаємо.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Символьне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %s -> %s вже Ñ–Ñнує.\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Створюємо Ñимвольне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Символьні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ, пропуÑкаємо Ñ—Ñ… %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "ПропуÑкаємо каталог %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: невідомий тип файлу (або не підтримуєтьÑÑ).\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñтановити права доÑтупу Ð´Ð»Ñ %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: пошкоджена мітка чаÑу.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Ðе завантажуємо каталоги оÑкільки глибина вже %d (макÑимум %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Ðе виконуємо вхід до %s, оÑкільки його виключено або не включено.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "ПропуÑкаємо %s.\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Відкидаємо %s (некоректний запиÑ).\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s виключено або не включено на оÑнові формального виразу.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– %s %s: %s\n"
+
+# No luck.
+# #### This message SUCKS. We should see what was the
+# reason that nothing was retrieved.
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Ðемає збігів з шаблоном %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Покажчик у форматі HTML запиÑано до файла %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Покажчик у форматі HTML запиÑано до файла %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "ПОМИЛКÐ: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "ПОМИЛКÐ: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñертифікат %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Завантажено Ñертифікат CA «%s»\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "ПОМИЛКÐ: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл CRL «%s»: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Завантажено файл CRL «%s»\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+"ПОМИЛКÐ: GnuTLS вимагає, щоб ключ Ñ– Ñертифікат належали до одного типу.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+"Ваша верÑÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ GnuTLS Ñ” надто Ñтарою, підтримку TLS 1.3 у ній не "
+"реалізовано\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+"GnuTLS: нереалізоване у програмі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «secure-protocol», %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Будь лаÑка, повідомте про цю ваду за адреÑою bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+"GnuTLS: нереалізоване у програмі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «secure-protocol», %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+"GnuTLS: не вдалоÑÑ Ð²Ñтановити Ñ€Ñдок prio безпоÑередньо. ПовертаємоÑÑ Ð´Ð¾ "
+"типового Ñ€Ñ–Ð²Ð½Ñ Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð½Ð¾ÑÑ‚Ñ–.\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "ПОМИЛКÐ"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "УВÐГÐ"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s не надано жодних Ñертифікатів.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Сертифікат %s не довірений.\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Ñертифікат %s не міÑтить даних щодо відомого програмі видавцÑ.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Ñертифікат %s було відкликано.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: підпиÑувачем Ñертифіката %s не Ñ” Ñлужба Ñертифікації.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+"%s: Ñертифікат %s було підпиÑано за допомогою незахищеного алгоритму.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Ñертифікат %s ще не активовано.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Ñтрок дії Ñертифіката %s вичерпано.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Помилка ініціалізації Ñертифікату X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Сертифікат не знайдено\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Помилка розбору Ñертифікату: %s.\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Сертифікат ще не було активовано\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Сертифікат проÑтрочений\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð²Ð»Ð°Ñника Ñертифіката не відповідає назві вузла %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Відкритий ключ не збігаєтьÑÑ Ñ–Ð· приєднаним відкритим ключем!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Сертифікат має належати до типу X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ ÑпиÑку адреÑ.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Ðевідомий вузол"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "ТимчаÑова помилка розв'ÑÐ·Ð°Ð½Ð½Ñ Ð½Ð°Ð·Ð²"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Ðевідома помилка"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð²Ð¸ %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "невдача: Ð”Ð»Ñ Ð²ÑƒÐ·Ð»Ð° відÑÑƒÑ‚Ð½Ñ IPv4/IPv6 адреÑа.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "невдача: тайм-аут.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ неповне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+"У %s виÑвлено атрибут no-follow. Перехід за поÑиланнÑми на цій Ñторінці не "
+"здійÑнюватиметьÑÑ\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: Ðекоректний URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Помилка запиÑу HTTP-запиту: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "ВідÑутні заголовки, припуÑкаєтьÑÑ, що це HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Файл '%s' вже є тут, не завантажуємо.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "Помилка gmtime. Ймовірно, маємо Ñправу із вадою у програмі.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ чаÑову позначку у формат http. ВикориÑтовуємо Ñ‡Ð°Ñ 0, "
+"Ñк Ñ‡Ð°Ñ Ð²Ð½ÐµÑÐµÐ½Ð½Ñ Ð¾Ñтанніх змін.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Ðе виÑтачає файла даних BODY %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Повторне викориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð²'Ñзку з [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Повторне викориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð²'Ñзку з %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Ðе вдалоÑÑŒ прочитати відповідь від прокÑÑ–: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s ПОМИЛКР%d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ÐеÑформований Ñ€Ñдок Ñтану"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Помилка Ñ‚ÑƒÐ½ÐµÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–-Ñервера: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Ðевідома Ñхема аутентифікації.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Вибраний ÑпоÑіб розпізнаваннÑ: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Зберігаємо до %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+"Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ вміÑÑ‚ підпиÑу до тимчаÑового файла. ПропуÑкаємо.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Ðе вдалоÑÑ Ñтворити тимчаÑовий файл. ПропуÑкаємо Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñу.\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Ðекоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pri. ПрипуÑкаємо Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ прийнÑтну контрольну Ñуму Ð´Ð»Ñ Ñ€ÐµÑурÑів Metalink.\n"
+"Ігноруємо їх.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Вимикаємо SSL через помилки.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "%s-запит надіÑлано, очікуємо на відповідь… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Ðе отримано даних.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð² заголовках (%s).\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(без опиÑу)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "РозміщеннÑ: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "не вказано"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [перехід]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"Файл %s не змінено на Ñервері. ПропуÑкаємо процедуру отриманнÑ.\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Сервер ігнорує заголовок If-Modified-Since Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s.\n"
+"Ймовірно, Ñлід додати до команди параметр --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Файл вже повніÑÑ‚ÑŽ завантажено; нема чого робити.\n"
+"\n"
+
+# No need to print this output if the body won't be
+# downloaded at all, or if the original server response is
+# printed.
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Довжина: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "ігноруєтьÑÑ"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Увага: в HTTP не підтримуютьÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¸.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+"Увімкнено режим «павука». Перевірка, чи Ñ–Ñнує файл на віддаленому "
+"комп'ютері.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Помилка запиÑу в %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "У отриманому заголовку не виÑтачає потрібного Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ атрибута.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+"Спроба пройти Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð° іменем кориÑтувача Ñ– паролем зазнала "
+"невдачі.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати дані до файла WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ тимчаÑового файла WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñтановити SSL-з'єднаннÑ.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "неможливо видалити %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "ПОМИЛКÐ: ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (%d) без Ð²ÐºÐ°Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð´Ñ€ÐµÑи.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ дані Metalink у HTTP-відповіді. Отримуємо файл за "
+"допомогою GET HTTP.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "ВиÑвлено заголовки Metalink. ПеремикаємоÑÑ Ñƒ режим Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Віддалений файл не Ñ–Ñнує -- пошкоджене поÑиланнÑ!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "ВідÑутній заголовок last-modified -- мітки чаÑу вимкнено.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Ðекоректний заголовок last-modified -- ігноруємо мітки чаÑу.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Локальний файл %s новіший -- не завантажуємо його.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Довжини файлів не збігаютьÑÑ (локальний %s) -- завантажуємо.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Файл новіший, ніж локальний, завантажуємо.\n"
+
+# Remote file is newer or sizes cannot be matched
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Віддалений файл Ñ–Ñнує Ñ– може міÑтити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° інші реÑурÑи -- "
+"отриманнÑ.\n"
+"\n"
+
+# Remote file is older, file sizes can be compared and
+# are both equal.
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Віддалений файл Ñ–Ñнує, але не міÑтить поÑилань -- не завантажуємо.\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Віддалений файл Ñ–Ñнує Ñ– може міÑтити подальші поÑиланнÑ,\n"
+"але рекурÑÑ–ÑŽ вимкнено -- не завантажуємо.\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Віддалений файл Ñ–Ñнує.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾ stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s збережено [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¾ в позиції %s байт. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð² позиції %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð² позиції %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Ðепідтримувана ÑкіÑÑ‚ÑŒ захиÑту «%s».\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Ðепідтримуваний алгоритм «%s».\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+"%s: WGETRC вказує на %s, доÑтуп до Ñкого неможливий через таку помилку: %s.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Ðеможливо прочитати %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Помилка в %s (Ñ€Ñдок %d).\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: помилка ÑинтакÑиÑу у %s (Ñ€Ñдок %d).\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Ðевідома команда %s в %s (Ñ€Ñдок %d).\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Спроба обробки файла ÑиÑтеми wgetrc (змінна SYSTEM_WGETRC) зазнала невдачі. "
+"Перевірте\n"
+"«%s»,\n"
+"або вкажіть інший файл за допомогою --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Спроба обробки файла ÑиÑтеми wgetrc зазнала невдачі. Перевірте\n"
+"«%s»,\n"
+"або вкажіть інший файл за допомогою --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+"%s: Увага: Як ÑиÑтемний wgetrc так Ñ– wgetrc кориÑтувача вказують на %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: некоректна команда в --execute %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Ðекоректне булеве %s, вкажіть `on' чи `off'.\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s: %s: некоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s; мало бути «on», «off» або «quiet».\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Ðекоректне чиÑло %s.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s має бути викориÑтано лише один раз\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Ðекоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð°Ð¹Ñ‚Ð° %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Ðекоректний період чаÑу %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: від'ємний період чаÑу %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass потребує Ñ€Ñдка або вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— Ñередовища WGET_ASKPASS "
+"або SSH_ASKPASS.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Ðекоректне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Ðекоректний заголовок %s.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: некоректний заголовок WARC, %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Ðекоректний тип ÑÑ‚Ð¸Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ поÑтупу %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Ðекоректне Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s,\n"
+" вкажіть [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %s Ñ” некоректним\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Підтримки Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· %s на %s не передбачено\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "ВиÑвлено неповну або некоректну багатобайтову поÑлідовніÑÑ‚ÑŒ\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Ðеопрацьована помилка (errno %d)\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: локаль не вÑтановлено\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "Помилка у idn_encode (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ на нижній регіÑÑ‚Ñ€: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"ПеренаправлÑємо Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; вимикаємо протоколюваннÑ.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "ВикориÑтаннÑ: %s [ПÐРÐМЕТР]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Ðргументи, що обов'Ñзкові Ð´Ð»Ñ Ð´Ð¾Ð²Ð³Ð¸Ñ… ключів, Ñ” обов'Ñзковими та Ð´Ð»Ñ "
+"коротких.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "ЗапуÑк:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version показати дані щодо верÑÑ–Ñ— Wget Ñ– вийти\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help вивеÑти цю підказку\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background перейти в фоновий режим піÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=КОМÐÐДРвиконати команду типу .wgetrc\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "ÐŸÑ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° вхідний файл:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=ФÐЙЛ запиÑувати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñƒ ФÐЙЛ\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=ФÐЙЛ додавати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ ФÐЙЛа.\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug виводити багато діагноÑтичної "
+"інформації.\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug вивеÑти діагноÑтичні дані у форматі "
+"Watt-32\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+" -q, --quiet працювати без Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose докладне Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ (типове)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose вимкнути докладні повідомленнÑ, але не "
+"вимикати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð·Ð°Ð³Ð°Ð»Ñ–.\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=ТИП вивеÑти ширину каналу у форматі ТИП. "
+"ТИПом може бути «bits».\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=ФÐЙЛ читати URL з локального або зовнішнього "
+"файла\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=ФÐЙЛ файли Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñƒ локальному файлі "
+"Metalink\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+" -F, --force-html вважати файл вхідних даних файлом HTML\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=ÐДРЕСРвизначає поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ HTML на вхідні файли "
+"(-i -F)\n"
+" відноÑно адреÑи ÐДРЕСÐ.\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=FILE вказати файл налаштувань.\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config не читати дані з файла налаштувань\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=ФÐЙЛ запиÑувати до журналу причини відмови в "
+"адреÑÑ– у ФÐЙЛі\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "ЗавантаженнÑ:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=ЧИСЛО обмежити кількіÑÑ‚ÑŒ повторних Ñпроб (0 — "
+"не обмежувати)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+" --retry-connrefused повторювати, навіть Ñкщо у з'єднанні "
+"відмовлено\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ПОМИЛКИ ÑпиÑок відокремлених комами помилок "
+"HTTP, Ñкі призводитимуть до повторних Ñпроб\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=ФÐЙЛ запиÑувати документи до ФÐЙЛа\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber пропуÑкати файли, Ñкі вже Ñ–Ñнують\n"
+" (не перезапиÑувати).\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-netrc не намагатиÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ реєÑтраційні дані "
+"з .netrc\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue продовжити Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð°Ñтково "
+"завантаженого\n"
+" файлу\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=ЗСУВ почати Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð· позиції ЗСУВ (відлік "
+"від нулÑ)\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+" --progress=ТИП задати ТИП індикатора візуалізації\n"
+" процеÑу роботи\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+" --progress=ТИП задати ТИП індикатора візуалізації\n"
+" процеÑу роботи\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping не завантажувати файли, Ñкі Ñтарші, ніж\n"
+" локальні\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since не викориÑтовували умовні запити Ñкщо-"
+"змінено-з\n"
+" у режимі чаÑових позначок\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps не вÑтановлювати чаÑову позначку "
+"локального\n"
+" файла за даними з Ñервера\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response виводити відповідь Ñервера\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider нічого не завантажувати\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=СЕКУÐДИ вÑтановити Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ–\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ÐДРЕСИ ÑпиÑок Ñерверів DNS Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ "
+"запитів (відокремлених комами)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ÐДРЕСРпов’Ñзати заÑіб Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð² DNS із "
+"адреÑою (назва вузла або IP)\n"
+" локального вузла\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=СЕКУÐДИ вÑтановити Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
+"DNS\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=СЕКУÐДИ вÑтановити Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° з’єднаннÑ\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+" --read-timeout=СЕКУÐДИ вÑтановити Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° читаннÑ\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=СЕКУÐДИ вÑтановити затримку між завантаженнÑми\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=СЕКУÐД зачекати 1...СЕКУÐД між Ñпробами "
+"отриманнÑ\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait зачекати 0.5*WAIT...1.5*WAIT cек. між "
+"Ñпробами\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy вимкнути прокÑÑ– Ñвним чином\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=ЧИСЛО вÑтановити квоту Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñƒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ "
+"ЧИСЛО\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ÐДРЕСРприв'Ñзка до адреÑи (назва вузла або IP)\n"
+" локального вузла\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=ШВИДКІСТЬ обмежити швидкіÑÑ‚ÑŒ завантаженнÑ\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache вимкнути ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ DNS запитів\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS обмежити Ñимволи у назвах файлів "
+"дозволеними\n"
+" у відповідній ОС\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case ігнорувати регіÑÑ‚Ñ€ при переглÑді\n"
+" файлів/каталогів\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only з'єднуватиÑÑŒ лише з IPv4 адреÑами\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only з'єднуватиÑÑŒ лише з IPv6 адреÑами\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILY Ñпершу підключатиÑÑ Ð´Ð¾ вказаного "
+"ÑімейÑтва\n"
+" адреÑ: IPv6, IPv4, або none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=ІМ'Я вÑтановити ІМ'Я кориÑтувача Ð´Ð»Ñ ftp та "
+"http\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=ПÐРОЛЬ вÑтановити ПÐРОЛЬ кориÑтувача Ð´Ð»Ñ ftp та "
+"http\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password запитувати пароль\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=КОМÐÐДРвказати обробник реєÑтраційних даних Ð´Ð»Ñ "
+"запитів \n"
+" щодо імені кориÑтувача Ñ– паролÑ. Якщо "
+"КОМÐÐДУ \n"
+" не вказано, буде викориÑтано змінну "
+"Ñередовища \n"
+" WGET_ASKPASS або SSH_ASKPASS.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri вимкнути підтримку IRI\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=КДРвикориÑтовувати локальне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐšÐ”Ð "
+"Ð´Ð»Ñ IRI\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=КДРвикориÑтовувати КДРÑк типове віддалене "
+"кодуваннÑ\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink вилучати файл до перезапиÑу\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash не вилучати файли із невідповідними "
+"контрольними Ñумами (Ð´Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=ЧИСЛО вказати порÑдковий номер метаадреÑи "
+"програми metalink або metalink4+xml\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http викориÑтовувати метадані Metalink із "
+"заголовків HTTP-відповіді\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+" --preferred-location бажане міÑце Ð´Ð»Ñ Ñ€ÐµÑурÑів Metalink\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --xattr увімкнути Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð¸Ñ… у "
+"розширених атрибутах файла\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Каталоги:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories не Ñтворювати каталоги\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories примуÑове ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð²\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+" -nH, --no-host-directories не Ñтворювати каталоги з назвами вузлів\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+" --protocol-directories викориÑтовувати назву протоколу у назвах "
+"каталогів\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=PREFIX зберігати файли в PREFIX/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+" --cut-dirs=ЧИСЛО ігнорувати певне ЧИСЛО компонентів "
+"каталогу\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Параметри HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=ІМ'Я вÑтановити ІМ'Я http-кориÑтувача\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=ПÐРОЛЬ вÑтановити ПÐРОЛЬ Ð´Ð»Ñ http-запитів\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache заборонити ÐºÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… на боці "
+"Ñервера\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=ÐÐЗВРзмінити типову назву Ñторінки (зазвичай,\n"
+" назвою є «index.html».)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension зберігати HTML/CSS документи із "
+"відповідним\n"
+" розширеннÑм\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length ігнорувати поле заголовку `Content-"
+"Length'\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=РЯДОК вÑтавлÑти РЯДОК в HTTP-заголовки\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=ТИП вибрати ÑтиÑканнÑ; можливі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ â€” "
+"auto, gzip або none (типове: none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect макÑимальна кількіÑÑ‚ÑŒ переÑпрÑмувань на "
+"Ñторінку\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=ІМ'Я вÑтановити ІМ'Я кориÑтувача Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑÑ–-"
+"Ñервера\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=ПÐРОЛЬ вÑтановити ПÐРОЛЬ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑÑ–-Ñервера\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL включити заголовок «Referer: URL» "
+"заголовок до HTTP-запиту\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+" --save-headers запиÑувати HTTP-заголовки до файла\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ÐГЕÐТ задати ім'Ñ ÐГЕÐТа заміÑÑ‚ÑŒ Wget/ВЕРСІЯ\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive заборонити HTTP keep-alive (поÑтійні "
+"з'єднаннÑ)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies не викориÑтовувати куки\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --load-cookies=ФÐЙЛ перед ÑеÑією брати куки з ФÐЙЛа\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=ФÐЙЛ в кінці ÑеÑÑ–Ñ— запиÑати куки у ФÐЙЛ\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies завантажувати Ñ– зберігати (тимчаÑово) "
+"куки ÑеанÑів\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=РЯДОК викориÑтовувати метод POST; надіÑлати "
+"РЯДОК Ñк дані\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=ФÐЙЛ викориÑтовувати метод POST; надіÑлати "
+"вміÑÑ‚ ФÐЙЛа\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=МетодHTTP викориÑтовувати у запиті ÑпоÑіб «МетодHTTP»\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=РЯДОК надіÑлати РЯДОК Ñк дані. ÐœÐЄ бути "
+"вÑтановлено --method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=ФÐЙЛ надіÑлати вміÑÑ‚ файла ФÐЙЛ. СЛІД "
+"вÑтановити параметр --method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition зважати на заголовок Content-Disposition "
+"під\n"
+" Ñ‡Ð°Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ назв локальних файлів "
+"(ТЕСТОВРМОЖЛИВІСТЬ)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error виводити отримані дані у разі помилок з "
+"Ñервером\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge надіÑлати оÑновні дані щодо Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ "
+"HTTP,\n"
+" не чекаючи на запит з Ñервера\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Параметри HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR вибрати один із протоколів безпеки auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 та PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only переходити лише за безпечними поÑиланнÑми "
+"HTTPS\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate не перевірÑти Ñерверний Ñертифікат\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=ФÐЙЛ файл Ñертифіката клієнта\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=TYPE тип Ñертифіката клієнта, PEM або DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=ФÐЙЛ файл закритого ключа\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=ТИП тип закритого ключа, PEM або DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=ФÐЙЛ файл з комплектом CA\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=КÐТÐЛОГ каталог, у Ñкому зберігаєтьÑÑ ÑпиÑок "
+"хешів Ñлужб Ñертифікації (CA)\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --crl-file=ФÐЙЛ файл з комлектом CRL.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=ФÐЙЛ/ХЕШІ Файл відкритого ключа (PEM/DER) або "
+"довільна\n"
+" кількіÑÑ‚ÑŒ закодованих у base64 хешів "
+"sha256,\n"
+" перед Ñкими вказано «sha256//», Ñкі "
+"відокремлено\n"
+" «;», Ñ– Ñкі Ñлід викориÑтовувати Ð´Ð»Ñ "
+"перевірки\n"
+" вузла\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=ФÐЙЛ файл з пÑевдовипадковими даними Ð´Ð»Ñ "
+"Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ PRNG SSL\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=ФÐЙЛ назва файла Ñокета EGD з "
+"пÑевдовипадковими даними\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=РЯДОК Ð’Ñтановити Ñ€Ñдок пріоритетноÑÑ‚Ñ– (GnuTLS) або "
+"Ñ€Ñдок ÑпиÑку шифрів (OpenSSL) безпоÑередньо.\n"
+" Будьте обережні: цей параметр має "
+"пріоритет над --secure-protocol.\n"
+" Формат та ÑинтакÑÐ¸Ñ Ñ€Ñдка залежать від "
+"викориÑтаного Ñ€ÑƒÑˆÑ–Ñ SSL/TLS.\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Параметри HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts вимкнути HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file шлÑÑ… до бази даних HSTS (перевизначає "
+"типовий)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Параметри FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf викориÑтовувати формат Stream_LF Ð´Ð»Ñ Ð²ÑÑ–Ñ… "
+"бінарних файлів FTP\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=ІМ'Я вÑтановити ІМ'Я кориÑтувача Ð´Ð»Ñ ftp.\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=ПÐРОЛЬ вÑтановити ПÐРОЛЬ кориÑтувача Ð´Ð»Ñ ftp\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing не вилучати файли .listing\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob вимкнути універÑалізацію назв файлів FTP\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp вимкнути \"паÑивний\" тип передаваннÑ\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions зберігати права доÑтупу до файла\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks при рекурÑÑ–Ñ—, отримувати пов’Ñзані "
+"Ñимволічними\n"
+" поÑиланнÑми файли (не каталоги)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Параметри FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit викориÑтовувати неÑвний FTPS (типовий "
+"порт -- 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl відновити ÑÐµÐ°Ð½Ñ SSL/TLS, розпочати у "
+"керівному з’єднанні під чаÑ\n"
+" Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ "
+"даними\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection шифрувати лише канал керуваннÑ; уÑÑ– "
+"дані передаватимутьÑÑ Ñƒ режимі проÑтого текÑту\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp викориÑтовувати FTP, Ñкщо на Ñервері "
+"не передбачено підтримки FTPS\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Параметри, пов'Ñзані з WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=ÐÐЗВÐ_ФÐЙЛРзберегти дані запиту Ñ– відповіді до "
+"файла .warc.gz\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=РЯДОК вÑтавити РЯДОК до запиÑу warcinfo\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=ЧИСЛО вÑтановити макÑимальний розмір файлів "
+"WARC у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð§Ð˜Ð¡Ð›Ðž\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx запиÑувати файли покажчика CDX\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=ÐÐЗВÐ_ФÐЙЛРне зберігати запиÑи зі ÑпиÑку, "
+"визначеному у цьому файлі CDX\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression не ÑтиÑкати файли WARC за допомогою GZIP\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+" --no-warc-digests не обчиÑлювати контрольні Ñуми SHA1\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log не зберігати назви файла журналу у запиÑÑ– "
+"WARC\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=КÐТÐЛОГ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових файлів, "
+"Ñтворених\n"
+" заÑобом запиÑу WARC\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "РекурÑивне завантаженнÑ:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+" -r, --recursive вÑтановити рекурÑивний режим "
+"завантаженнÑ\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=ЧИСЛО макÑимальна глибина рекурÑÑ–Ñ— (0 - без "
+"обмеженнÑ).\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after локально вилучити отримані файли.\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links перетворити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² отриманих файлах "
+"HTML Ñ– CSS\n"
+" так, щоб вони вказували на локальні "
+"файли\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only перетворювати лише чаÑтину адреÑи, Ñка "
+"ÑтоÑуєтьÑÑ Ñ„Ð°Ð¹Ð»Ð° (зазвичай, Ñ—Ñ— називають «базовою назвою»)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N до запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° X, поÑлідовно "
+"Ñтворити N файлів резервних копій\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted до Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° X Ñтворити резервну "
+"копію X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted до Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° X Ñтворити резервну "
+"копію X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror Ñкорочена форма Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ -N -r -l inf --"
+"no-remove-listing\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites отримати вÑÑ– зображеннÑ, Ñ– Ñ‚.п. Ð´Ð»Ñ "
+"показу HTML\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments увімкнути жорÑтку (SGML) обробку "
+"коментарів HTML\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "РекурÑивне включеннÑ/Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr " -A, --accept=СПИСОК ÑпиÑок розширень на включеннÑ\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr " -R, --reject=СПИСОК ÑпиÑок розширень на виключеннÑ\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr " --accept-regex=ВИРÐЗ формальний вираз прийнÑтних адреÑ\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=ВИРÐЗ формальний вираз відкинутих адреÑ\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=ТИП тип формального виразу (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=ТИП тип формального виразу (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr " -D, --domains=СПИСОК ÑпиÑок дозволених доменів\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=СПИСОК ÑпиÑок виключених доменів відокремлених "
+"комами\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp переходити за поÑиланнÑми на реÑурÑи FTP "
+"з документів HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=СПИСОК розділений комами ÑпиÑок теґів HTML, за "
+"Ñким Ñлід здійÑнювати перехід\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=СПИСОК розділений комами ÑпиÑок теґів HTML, Ñкі "
+"Ñлід ігнорувати\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+" -H, --span-hosts переходити до інших вузлів під Ñ‡Ð°Ñ "
+"рекурÑивної обробки\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+" -L, --relative переходити лише за відноÑними "
+"поÑиланнÑми\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+" -I, --include-directories=LIST вказати ÑпиÑок дозволених каталогів\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names викориÑтовувати назву, вказану адреÑою\n"
+" переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñтаннього компонента\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+" -X, --exclude-directories=LIST вказати ÑпиÑок виключених каталогів\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+" -np, --no-parent не підніматиÑÑ Ð´Ð¾ батьківÑького каталогу\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"ПовідомлÑєте електронною поштою про проблеми, питаннÑ, диÑкутуйте у <bug-"
+"wget@gnu.org>\n"
+"і/або повідомте про вади тут: https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, Ðвтоматичний завантажувач файлів з мережі.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Пароль Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача %s:"
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Пароль:"
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Ðе вдалоÑÑ Ñтворити канал\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Помилка під Ñ‡Ð°Ñ Ñпроби ініціалізувати дії з Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ð´Ð»Ñ use-"
+"askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Помилка під Ñ‡Ð°Ñ Ñпроби вÑтановити дії з Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ð´Ð»Ñ use-askpass: "
+"%d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– від команди «%s %s»: %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача «%s%s»: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Пароль до «%s%s@%s»: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Локаль: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Збірка: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "ПоÑиланнÑ: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s, зібрано %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (Ñередовище)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (кориÑтувач)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (ÑиÑтема)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "© Free Software Foundation, Inc., %s\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Умови Ð»Ñ–Ñ†ÐµÐ½Ð·ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð°Ð´ÐµÐ½Ð¾ у GPLv2+: GNU GPL верÑÑ–Ñ— 2 або новішій, <http://"
+"www.gnu.org/licenses/gpl.html>\n"
+"Це вільне програмне забезпеченнÑ: ви можете вільно змінювати Ñ– поширювати "
+"його.\n"
+"Вам не надаєтьÑÑ Ð–ÐžÐ”ÐИХ ГÐРÐÐТІЙ, окрім гарантій передбачених "
+"законодавÑтвом.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Ðвтор: Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилки та пропозиції надÑилайте до <bug-wget@gnu.org>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Проблема з розподілом пам’ÑÑ‚Ñ–\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Завершуємо роботу через помилку у %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Спробуйте `%s --help' Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ñ— інформації.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: невірний параметр -- `-n%c'\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+"Підтримку діагноÑтики не реалізовано під Ñ‡Ð°Ñ Ð·Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ. Ігноруємо прапорець --"
+"debug.\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"ОдночаÑно вказано --no-clobber Ñ– --convert-links, буде викориÑтано лише --"
+"convert-links.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"ОдночаÑно вказано --no-clobber Ñ– -convert-file-only, буде викориÑтано лише -"
+"convert-file-only.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Режими verbose та quiet не можна викориÑтовувати одночаÑно.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "Режими підтримки міток чаÑу та Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñтарих файлів неÑуміÑні.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "Ðе можливо вказати одночаÑно --inet4-only та --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Ðе можна задавати одразу -k або -convert-file-only Ñ– -O, Ñкщо вказано "
+"декілька адреÑ, або у поєднанні\n"
+"з -p або -r. Докладніші відомоÑÑ‚Ñ– можна знайти на Ñторінці підручника "
+"(man).\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"ПОПЕРЕДЖЕÐÐЯ: Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ -O з -r або -p означає, що вÑÑ– отримані дані\n"
+"буде розташовано у вказаному вами єдиному файлі.\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"ПОПЕРЕДЖЕÐÐЯ: викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‡Ð°Ñових позначок не працює з -O. Докладніші\n"
+"відомоÑÑ‚Ñ– можна знайти на Ñторінці підручника (man).\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Ð’Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ WARC не працює з --no-clobber, --no-clobber буде вимкнено.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Ð’Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ WARC не працює з викориÑтаннÑм чаÑових позначок, чаÑові "
+"позначки буде вимкнено.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Ð’Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ WARC не працює з параметром --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Ð’Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾ WARC не працює з параметром --continue або --start-pos. Їх буде "
+"вимкнено.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Контрольні Ñуми вимкнено; заÑоби ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ WARC не зможуть знайти "
+"запиÑи-дублікати.\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"СтиÑÐºÐ°Ð½Ð½Ñ Ð½Ðµ працює з параметрами --continue Ñ– --start-pos. Їх буде "
+"вимкнено.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+"Ðе можна одночаÑно викориÑтовувати параметри --ask-password Ñ– --password.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Ðе рекомендуємо викориÑтовувати одночаÑно --start-pos Ñ– --continue; --"
+"continue буде вимкнено.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: не вказано URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+"Ðе можна одночаÑно викориÑтовувати параметри --post-data Ñ– --post-file.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Ðе можна викориÑтовувати --post-data або --post-file без --method. Параметру "
+"--method потрібні дані, передані за допомогою параметрів --body-data і --"
+"body-file.\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Вам Ñлід вказати метод за допомогою параметра --method=МетодHTTP, щоб "
+"ÑкориÑтатиÑÑ --body-data або --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "Ðе можна одночаÑно визначати --body-data Ñ– --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Поточна верÑÑ–Ñ Ð½Ðµ має підтримки IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"-k або -r можна викориÑтовувати разом з -O, лише Ñкщо дані запиÑуютьÑÑ Ð´Ð¾ "
+"звичайного файла.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links Ñ– --convert-file-only можна викориÑтовувати разом, лише Ñкщо "
+"дані запиÑуютьÑÑ Ð´Ð¾ звичайного файла.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ канал c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ IP-адреÑу «%s»\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñтановити Ñервери DNS «%s» (%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Ð’ %s не знайдено поÑилань.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ файл метапоÑилань %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ уÑÑ– реÑурÑи з %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"ЗÐКІÐЧЕÐО --%s--\n"
+"Загальний чаÑ: %s\n"
+"Завантажено: %d файлів, %s за %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "ВИЧЕРПÐÐО Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (%s)!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+"Підтримки -O Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з метапоÑиланнÑм не передбачено. Ігноруємо "
+"цей параметр.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Запланований файл метапоÑилань: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Безпечний файл metalink: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Відкидаємо файл metalink. Ðазва не Ñ” безпечною.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "ОброблÑємо метаадреÑу %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Відкидаємо файл метаадреÑи %s. Ðазва не Ñ” безпечною.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ %s. ПропуÑкаємо метаадреÑу.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ файл метаадреÑи: %s\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Спроба обробити метаадреÑи завершилаÑÑ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñм про помилку.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Підтримки реÑурÑів типу %s не передбачено, ігноруємо...\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ отриманий файл.\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "ОбчиÑлюємо розмір %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Розмір файла не оголошено. ПропуÑкаємо перевірку.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані щодо розміру отримуваного файла.\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "ÐевідповідніÑÑ‚ÑŒ розмірів Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Розміри збігаютьÑÑ.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "ОбчиÑлюємо контрольну Ñуму Ð´Ð»Ñ %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Контрольні Ñуми збігаютьÑÑ.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "ÐевідповідніÑÑ‚ÑŒ контрольних Ñум Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ отриманий файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ підпиÑу.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Перевірку підпиÑів пройдено.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Ðекоректний підпиÑ. ВідмовлÑємо реÑурÑу.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Дані відповідають підпиÑу, але Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ Ñ” надійним.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Контрольних Ñум не знайдено.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ %s. ПропуÑкаємо реÑурÑ.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Файл %s отримано, але його розмір не збігаєтьÑÑ Ñ–Ð· еталонним. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+"Файл %s отримано, але його контрольна Ñума не збігаєтьÑÑ Ñ–Ð· еталонною. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Файл %s отримано, але його Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð½Ðµ збігаєтьÑÑ Ñ–Ð· еталонним. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Перейменовуємо %s на %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Продовжуємо у фоновому режимі.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Продовжуємо у фоновому режимі, номер процеÑу %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Ð’Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ запиÑано до %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "помилка fake_fork_child()\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "помилка fake_fork()\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ потрібний драйвер.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "Помилка ioctl(). Ðе вдалоÑÑ Ð²Ñтановити Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° Ñокетом.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: попередженнÑ: лекÑема %s перед назвою машини\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: невідома лекÑема \"%s\"\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "ВикориÑтаннÑ: %s NETRC [ÐÐЗВРВУЗЛÐ]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ stat %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+"ПОПЕРЕДЖЕÐÐЯ: викориÑтовуєтьÑÑ Ñлабкий заÑіб ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñевдовипадкових "
+"чиÑел.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"Ðе вдалоÑÑ Ñтворити початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ PRNG. Вам варто ÑкориÑтатиÑÑ --random-"
+"file.\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+"Ваша верÑÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ OpenSSL Ñ” надто Ñтарою, підтримку TLSv1.3 у ній не "
+"реалізовано\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+"Ваша верÑÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ OpenSSL Ñ” надто Ñтарою, підтримку TLSv1.1 у ній не "
+"реалізовано\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+"Ваша верÑÑ–Ñ Ð±Ñ–Ð±Ð»Ñ–Ð¾Ñ‚ÐµÐºÐ¸ OpenSSL Ñ” надто Ñтарою, підтримку TLSv1.2 у ній не "
+"реалізовано\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: не реалізоване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° «secure-protocol», %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL: некоректний ÑпиÑок шифрів: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL: не вдалоÑÑ Ð²Ñтановити довіру до чаÑткового ланцюжка\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL: не вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити у пам'ÑÑ‚Ñ– параметр верифікації\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+"УВÐГÐ: не вдалоÑÑ Ñтворити початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ PRNG. Вам варто ÑкориÑтатиÑÑ --"
+"random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ Ñертифікат %s, випущений %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Ðеможливо локально перевірити чинніÑÑ‚ÑŒ запиÑу видавцÑ.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " ВиÑвлено ÑамопідпиÑаний Ñертифікат.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Виданий Ñертифікат ще не дійÑний.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Виданий Ñертифікат проÑтрочений.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: жоден з варіантів Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñертифіката не\n"
+"\tвідповідає потрібній назві вузла, %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: загальна назва об’єкта Ñертифікації, %s, не відповідає потрібній "
+"назві вузла %s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: загальна назва Ñертифіката Ñ” некоректною (міÑтить Ñимвол NUL).\n"
+" Це може означати, що автентичніÑÑ‚ÑŒ вузла викликає Ñумніви\n"
+" (тобто це наÑправді не %s).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+"Ð”Ð»Ñ Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s без захиÑту, ÑкориÑтайтеÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ «--no-check-"
+"certificate».\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ пропуÑк %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Ðекоректне Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ñтилю %s; лишаємо без зміни.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " Ñ‡Ð°Ñ %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " за "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Ðе вдаєтьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ñƒ реального чаÑy: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ %s, оÑкільки його треба пропуÑтити.\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Завантажуємо файл robots.txt; не зважайте на помилки.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Помилка розбору адреÑи прокÑÑ– %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Помилка в адреÑÑ– прокÑÑ–-Ñервера %s: має бути HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "%d зациклень - більше, ніж допуÑтимо.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Ðварійне завершеннÑ.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñпроб.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Жодного пошкодженого поÑиланнÑ.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Знайдено %d помилкове поÑиланнÑ.\n"
+"\n"
+msgstr[1] ""
+"Знайдено %d помилкових поÑиланнÑ.\n"
+"\n"
+msgstr[2] ""
+"Знайдено %d помилкових поÑилань.\n"
+"\n"
+msgstr[3] ""
+"Знайдено %d помилкове поÑиланнÑ.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Без помилок"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Схема %s не підтримуєтьÑÑ"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Схема відÑутнÑ"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Ðекоректна назва вузла"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Ðевірний номер порту"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Ðекоректне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Ðезакінчена чиÑлова IPv6 адреÑа"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "IPv6 не підтримуєтьÑÑ"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Ðекоректна чиÑлова IPv6 адреÑа"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Підтримку HTTPS не Ñкомпільовано"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "ВиÑвлено непридатну до Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð±Ð°Ð¹Ñ‚Ð¾Ð²Ñƒ поÑлідовніÑÑ‚ÑŒ\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Ðе вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ доÑтатньо пам'ÑÑ‚Ñ–; недоÑтатньо пам'ÑÑ‚Ñ–.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Ðе вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ %ld байт; недоÑтатньо пам'ÑÑ‚Ñ–.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+"%s: aprintf: текÑтовий буфер завеликий (%d байт), перериваємо обробку.\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Продовжуємо у фоновому режимі, номер процеÑу %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñимвольне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Fopen Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ FD файла %s\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+"Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑтатиÑтичні дані файла %s, (перевірте права доÑтупу)\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+"Файл %s було змінено з чаÑу оÑтанньої перевірки. Перевірку безпеки не "
+"пройдено.\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл %s, причина: %s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Ðе вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑтатиÑтичні дані щодо файла %s, помилка: %s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+"Було виконано Ñпробу відкрити файл %s, але його було змінено з моменту "
+"оÑтанньої перевірки. Перевірку безпеки не пройдено.\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Ðекоректний формальний вираз %s, помилка PCRE2 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Ðекоректний формальний вираз %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾ÑÑ‚Ñ– %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "ПропуÑкаємо ключ із помилковим розміром (%d з %d): %s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "Помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ— у файлі WARC.\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ð²Ð¸Ñ‚Ð¸Ñ€Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° WARC на диÑку.\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑкриптора файла WARC.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби відкрити потік даних GZIP до файла WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запиÑу warcinfo до файла WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Відкриваємо файл WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби відкрити файл WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+"У файлі CDX немає ÑпиÑку початкових адреÑ. (Ðе вказано Ñтовпчик «a».)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "У файлі CDX немає ÑпиÑку контрольних Ñум. (Ðе вказано Ñтовпчик «k».)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+"У файлі CDX немає ÑпиÑку ідентифікаторів запиÑів. (Ðе вказано Ñтовпчик "
+"«u».)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"З CDX завантажено %d запиÑ.\n"
+"\n"
+msgstr[1] ""
+"З CDX завантажено %d запиÑи.\n"
+"\n"
+msgstr[2] ""
+"З CDX завантажено %d запиÑів.\n"
+"\n"
+msgstr[3] ""
+"З CDX завантажено %d запиÑ.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл CDX %s Ð´Ð»Ñ ÑƒÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл маніфеÑту WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл журналу WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл CDX Ð´Ð»Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ….\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"У файлі CDX виÑвлено точний відповідник. Зберігаємо Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ "
+"Ð²Ñ–Ð´Ð²Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Ðевідома ÑиÑтемна помилка"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "Підтримки ÑімейÑтва назв вузлів не передбачено"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Помилкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ ai_flags"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Критична помилка під Ñ‡Ð°Ñ Ñпроби Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ð°Ð·Ð²"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ai_family не підтримуєтьÑÑ"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "З цією назвою вузла не пов'Ñзано жодної адреÑи"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Ðазва або Ñлужба невідома"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Servname не підтримуєтьÑÑ Ð´Ð»Ñ ai_socktype"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ai_socktype не підтримуєтьÑÑ"
+
+#~ msgid "System error"
+#~ msgstr "Помилка ÑиÑтеми"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Буфер аргументів є занадто малим"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "ВиконуєтьÑÑ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ° запиту"
+
+#~ msgid "Request canceled"
+#~ msgstr "Запит ÑкаÑовано"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Запит не ÑкаÑовано"
+
+#~ msgid "All requests done"
+#~ msgstr "Ð’ÑÑ– запити виконано"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Перервано за Ñигналом"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Помилкове ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñдка параметрів"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s: параметр «%s%s» не є однозначним\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s: неоднозначний параметр «%s%s»; можливі варіанти:"
+
+# +option or -option
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s: нерозпізнаний параметр «%s%s»\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s: Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² до параметра «%s%s» не передбачено\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s: до параметра «%s%s» Ñлід додати аргумент\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: некоректний параметр -- '%c'\n"
+
+# 1003.2 specifies the format of this message.
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: до параметра Ñлід додати аргумент -- '%c'\n"
+
+#~ msgid "`"
+#~ msgstr "«"
+
+#~ msgid "'"
+#~ msgstr "»"
+
+#~ msgid "Success"
+#~ msgstr "Виконано"
+
+#~ msgid "No match"
+#~ msgstr "Ðемає відповідників"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Помилка у формальному виразі"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ðекоректний Ñимвол об’єднаннÑ"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Ðекоректна назва клаÑу Ñимволів"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Зворотна похила риÑка наприкінці"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Ðекоректне зворотне поÑиланнÑ"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Вираз без парних [, [^, [:, [. або [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "Ðеврівноважена дужка ( або \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "Ðеврівноважена дужка \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Ðекоректний вміÑÑ‚ \\{\\}"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Ðекоректне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Пам’ÑÑ‚ÑŒ вичерпано"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Помилка у попередньому формальному виразі"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Ðеочікуване Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ виразу"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Занадто об’ємний формальний вираз"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "Ðеврівноважена дужка ) або \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Ðе виÑвлено попереднього формального виразу"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "не вдалоÑÑ Ñтворити канал"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "Помилка підпроцеÑу %s"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "Помилка _open_osfhandle"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файловий деÑкриптор %d: помилка dup2"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "ÐŸÑ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "ПідпроцеÑом %s отримано Ñигнал щодо аварійного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "недоÑтатньо пам'ÑÑ‚Ñ–"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилки, Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð° пропозиції надÑилайте до <bug-"
+#~ "wget@gnu.org>\n"
diff --git a/po/vi.gmo b/po/vi.gmo
new file mode 100644
index 0000000..7d8a2e9
--- /dev/null
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
new file mode 100644
index 0000000..76a98f5
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,3675 @@
+# Vietnamese translation for WGet.
+# Bản dịch tiếng Việt dành cho wget.
+# Copyright © 2016 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Phan Vinh Thinh <teppi82@gmail.com>, 2005.
+# Clytie Siddall <clytie@riverland.net.au>, 2007-2010.
+# Nguyá»…n Thái Ngá»c Duy <pclouds@gmail.com>, 2012.
+# Trần Ngá»c Quân <vnwildman@gmail.com>, 2012-2013, 2015, 2016, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.18.109\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2017-01-24 08:49+0700\n"
+"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Team-Website: <http://translationproject.org/team/vi.html>\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.7\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: không tìm thấy được địa chỉ bind “%sâ€; tắt bá» bind.\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "Kết nối tới %s[%s]:%d… "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "Kết nối tới %s:%d… "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "Kết nối tới [%s]:%d… "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF gặp lỗi: %s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "đã kết nối.\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "gặp lỗi: %s.\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: không phân giải được địa chỉ của máy %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR gặp lỗi: %s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "Mở quá nhiá»u fd. Không thể dùng chá»n trên má»™t fd >= %d\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "Äã chuyển đổi các liên kết trong %d tập tin trong %s giây.\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "Chuyển đổi các liên kết trong %s… "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "không có gì cần làm.\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "Không thể chuyển đổi liên kết trong %s: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "Không xóa được %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "Không sao lưu được %s thành %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "Không thể lấy cookie cho %s\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Lỗi cú pháp trong Set-Cookie: %s tại vị trí %d.\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "Cookie đến từ %s đã cố đặt miá»n thành"
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "Không mở được tập tin cookie %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "Lỗi ghi vào %s: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "Lỗi đóng %s: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "Dạng danh sách không hỗ trợ, đang thử phân tích dạng danh sách Unix.\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "Chỉ mục của /%s trên %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "thá»i gian không xác định "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "Tập tin "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "Thư mục "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "Liên kết "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "Không chắc "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s byte)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "Kích thước: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ", còn lại %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ", còn %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (không đủ thẩm quyá»n)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "Không thể khởi tạo SSL. Nó sẽ bị tắt đi."
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "Äăng nhập vá»›i tên %s… "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "Lá»—i trong câu trả lá»i của máy phục vụ, đóng liên kết Ä‘iá»u khiển.\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "Lá»—i trong lá»i chào của máy phục vụ.\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "Gặp lá»—i khi ghi, đóng liên kết Ä‘iá»u khiển.\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "Máy phục vụ từ chối đăng nhập.\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "Äăng nhập không đúng.\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "Äã đăng nhập!\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "Máy chủ không chấp nhận lệnh “PBSZ 0â€.\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "Máy chủ không chấp nhận lệnh “PROT %câ€.\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "Lỗi máy phục vụ, không xác định được dạng hệ thống.\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "xong. "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "xong.\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "Không hiểu kiểu “%câ€, đóng kết nối Ä‘iá»u khiển.\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "xong. "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> không cần CWD.\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "Theo lô-gíc không thể với đến các phần trong getftp()"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"Không có thư mục %s.\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> không yêu cầu CWD.\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "Tập tin đã được lấy rồi.\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "Không khởi đầu được sá»± truyá»n tải PASV.\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "Không phân tích được câu trả lá»i PASV.\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "không kết nối được tới %s cổng %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Lỗi buộc “bind†(%s).\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "Lệnh PORT không đúng.\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"REST không thành công; làm lại từ đầu.\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "Tập tin %s đã sẵn có.\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "Không có tập tin %s.\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"Không có tập tin %s.\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"Không có tập tin hay thư mục tên %s.\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s xuất hiện bất thình lình.\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s, đóng kết nối Ä‘iá»u khiển.\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - Kết nối dữ liệu: %s; "
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "Äã đóng kết nối Ä‘iá»u khiển.\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "Truyá»n tải dữ liệu bị bãi bá».\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "Tập tin %s đã có ở đó nên không nhận nữa.\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(lần thử: %2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — ghi vào đầu ra tiêu chuẩn %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — đã lưu %s [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "Äang xóa %s.\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "Dùng %s làm tập tin danh sách tạm.\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "Äã xóa %s.\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "Äá»™ sâu đệ quy %d vượt quá ngưỡng tối Ä‘a %d.\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+"Tập tin trên máy chủ không mới hơn tập tin cục bộ %s -- không tải xuống.\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin %s trên máy chủ mới hơn tập tin cục bộ -- đang tải xuống.\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"Kích thước không bằng nhau (nội bộ %s) -- đang tải xuống.\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "Tên của liên kết má»m không hợp lệ, bá» qua.\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"Äã có liên kết má»m đúng %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "Tạo liên kết má»m %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "Không há»— trợ liên kết má»m, bá» qua liên kết má»m %s.\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "BỠqua thư mục %s.\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: Kiểu tập tin không biết hoặc không được hỗ trợ.\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "Gặp lá»—i khi phân quyá»n cho %s.\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: dấu vết thá»i gian bị há»ng.\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "Sẽ không nhận thư mục vì độ sâu là %d (tối đa %d).\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "Không vào %s vì nó bị loại ra hoặc không được thêm vào.\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "Từ chối %s.\n"
+
+#: src/ftp.c:2657
+#, fuzzy, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "Từ chối %s.\n"
+
+#: src/ftp.c:2678
+#, fuzzy, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "Không vào %s vì nó bị loại ra hoặc không được thêm vào.\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "Lá»—i khá»›p %s vá»›i %s: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "Không tìm thấy cái nào khớp với mẫu %s.\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "Äã viết chỉ mục ở dạng HTML vào %s [%s].\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "Äã viết chỉ mục ở dạng HTML vào %s.\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "LỖI: Không thể mở thư mục %s.\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "LỖI: Gặp lỗi khi mở giấy chứng nhận %s: (%d).\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "Chứng nhận CA đã tải “%sâ€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "Lá»–I: Gặp lá»—i khi tải tập tin CRL “%sâ€: (%d).\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "Tập tin CRL đã tải “%sâ€\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "LỖI: GnuTLS yêu cầu khóa và chứng nhận phải cùng một kiểu.\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+#, fuzzy
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "Phiên bản OpenSSL của bạn quá cũ để hỗ trợ TLSv1.1\n"
+
+#: src/gnutls.c:783
+#, fuzzy, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS: giá trị tùy chá»n “secure-protocol†chÆ°a được thá»±c hiện %d\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "Hãy gửi thông báo lỗi nảy sinh này cho <bug-wget@gnu.org>.\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS: giá trị tùy chá»n “secure-protocol†chÆ°a được thá»±c hiện %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "Lá»–I"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "CẢNH BÃO"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: Không có chứng thực từ %s.\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: Chứng nhận của %s không tin cậy.\n"
+
+#: src/gnutls.c:1039
+#, fuzzy, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: Chứng nhận của %s không có nhà cấp đã biết.\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: Chứng nhận của %s đã bị thu hồi.\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: NgÆ°á»i ký chứng nhận của %s không phải là má»™t CA.\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: Chứng nhận của %s đã được ký bằng thuật toán không an toàn.\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: Chứng nhận của %s vẫn chưa được kích hoạt.\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: Chứng nhận của %s đã bị hết hạn.\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "Lỗi khởi tạo chứng nhận X509: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "Không tìm thấy chứng nhận nào\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "Lỗi phân tích cú pháp của chứng nhận: %s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "Chứng nhận vẫn chưa được kích hoạt\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "Chứng nhận đã hết hạn dùng\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "Chủ chứng nhận không tương ứng với tên máy %s\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "Khóa công không khớp với khóa công được đóng cứng!\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "Giấy chứng nhận phải có định dạng X.509\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "Có lỗi trong xử lý danh sách địa chỉ.\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "Máy lạ"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "Thất bại tạm thá»i khi phân giải tên"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "Lỗi không rõ nguyên nhân"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "Äang phân giải %s… "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "gặp lỗi: Không có địa chỉ IPv4/IPv6 cho máy.\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "gặp lỗi: quá lâu không đáp ứng.\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: Không thể phân giải liên kết không hoàn chỉnh %s.\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL không hợp lệ %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "Lỗi ghi yêu cầu HTTP: %s.\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "Không có phần đầu, coi là HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin %s đã sẵn có nên không nhận nữa.\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime gặp lá»—i. Äây gần nhÆ° chắc chắn là má»™t lá»—i.\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+"Không thể chuyển đổi dấu vết thá»i gian sang định dạng http. Quay lại dùng 0 "
+"làm thá»i Ä‘iểm sá»­a lần cuối.\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "Thiếu tập tin dữ liệu BODY %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "Dùng lại kết nối đã có tới [%s]:%d.\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "Dùng lại kết nối đã có tới %s:%d.\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "Gặp lá»—i khi Ä‘á»c trả lá»i từ ủy nhiệm: %s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s Lá»–I %d: %s.\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "Dòng trạng thái sai dạng"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "Gặp lá»—i khi tạo Ä‘Æ°á»ng hầm ủy nhiệm: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "Không hiểu lược đồ xác thực.\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "Xác thá»±c đã chá»n: %s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "Äang ghi vào: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"Khi đang tải chữ ký:\n"
+"%s: %s.\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "Không thể Ä‘á»c ná»™i dung chữ ký từ tập tin tạm. Nên bá» qua.\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "Không thể tạo tập tin tạm. Äang bá» qua việc tải chữ ký vá».\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "Giá trị pri không hợp lệ. Nên coi là %d.\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"Không thể tìm thấy tóm lược được chấp thuận cho nguồn Metalink.\n"
+"Nên bỠqua chúng.\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "Tắt SSL vì gặp lỗi.\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "Äã gá»­i yêu cầu %s, Ä‘ang đợi câu trả lá»i… "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "Không nhận được dữ liệu.\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "Lá»—i Ä‘á»c (%s) trong phần đầu.\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(không mô tả)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "Äịa Ä‘iểm: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "không xác định"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [theo]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr "Tập tin %s chÆ°a bị sá»­a trên máy chủ. Nên bá» qua không tải vá».\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"Máy chủ bỠqua phần đầu If-Modified-Since header cho tập tin %s.\n"
+"Bạn có lẽ nên thêm tùy chá»n --no-if-modified-since.\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" Äã nhận tập tin đầy đủ; không cần làm gì nữa.\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "Kích thước: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "bá» qua"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "Cảnh báo: không hỗ trợ ký tự đại diện trong HTTP.\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "Äã bật chế Ä‘á»™ nhện. Hãy kiểm tra tập tin trên máy chủ tồn tại không.\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "Không thể ghi vào %s (%s).\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "Thiếu thuộc tính cần thiết từ Phần đầu nhận được.\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "Phương thức xác thực Tài-khoản/Mật_khẩu bị lỗi.\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "Không thể ghi vào tập tin WARC.\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "Không thể ghi vào tập tin tạm thá»i WARC.\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "Không thiết lập được kết nối SSL.\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "Không thể hủy liên kết %s (%s).\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "LỖI: Chuyển hướng (%d) mà không có vị trí.\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+"Không thể tìm thấy dữ liệu Metalink trong phần HTTP trả vá». Äang tải các tập "
+"tin dùng HTTP GET.\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "Tìm thấy phần đầu Metalink. Nên chuyển sang chế độ Metalink.\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "Tập tin trên máy chủ không tồn tại -- liên kết há»ng!!!\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "Thiếu phần đầu “Last-modified†-- time-stamp bị tắt.\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "Sai phần đầu “Last-modified†-- time-stamp bị bỠqua.\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin %s trên máy chủ không mới hơn tập tin cục bộ -- không nhận.\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "Kích thước tập tin không tương ứng (cục bộ %s) - đang nhận.\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "Tập tin trên máy chủ mới hơn, đang nhận.\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin trên máy chủ tồn tại và có thể chứa liên kết đến tài nguyên khác -- "
+"Ä‘ang lấy vá».\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin trên máy chủ tồn tại nhÆ°ng không chứa liên kết -- không lấy vá».\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"Tập tin trên máy chủ tồn tại và có thể chứa thêm liên kết,\n"
+"nhÆ°ng đệ quy bị tắt -- không lấy vá».\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"Tập tin trên máy chủ đã sẵn có.\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — ghi vào đầu ra chuẩn %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) — đã lưu %s [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - Äóng kết nối tại byte %s. "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - Lá»—i Ä‘á»c tại byte %s (%s)."
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - Lá»—i Ä‘á»c tại byte %s/%s (%s). "
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "Không há»— trợ chất lượng bảo vệ “%sâ€.\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "Không há»— trợ thuật toán “%sâ€.\n"
+
+#: src/init.c:583
+#, fuzzy, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC chỉ tới %s, mà nó lại không tồn tại.\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: Không Ä‘á»c được %s (%s).\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%s: Lỗi trong %s trên dòng %d.\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%s: Lỗi cú pháp trong %s trên dòng %d.\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%s: Lệnh không biết %s trong %s trên dòng %d.\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Việc phân tích tập tin hệ thống wgetrc (env SYSTEM_WGETRC) gặp lỗi.\n"
+"Xin hãy kiểm tra “%sâ€,\n"
+"hay chỉ định má»™t tập tin khác sá»­ dụng tùy chá»n --config.\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"Việc phân tích tập tin hệ thống wgetrc gặp lỗi. Xin hãy kiểm tra\n"
+"“%sâ€,\n"
+"hay chỉ định má»™t tập tin khác sá»­ dụng tùy chá»n --config.\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s: Cảnh báo: Cả wgetrc của hệ thống và ngÆ°á»i dùng Ä‘á»u chỉ tá»›i %s.\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s: Câu lệnh “--execute†không đúng %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s: %s: Giá trị %s không đúng; dùng “on†(bật) hay “off†(tắt)\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+"%s: %s: %s không hợp lệ; dùng “on†(bật), “off†(tắt) hay “quiet†(im "
+"lặng).\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s: %s: Số %s sai.\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s chỉ được dùng một lần\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s: %s: Giá trị byte %s sai.\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s: %s: Khoảng thá»i gian %s sai.\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s: %s: Khoảng thá»i gian %s sai.\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass yêu cầu má»™t chuá»—i hoặc là má»™t biến môi trÆ°á»ng WGET_ASKPASS hoặc "
+"là SSH_ASKPASS được đặt.\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s: %s: Giá trị %s sai.\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s: %s: Phần đầu %s sai.\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s: %s: Phần đầu WARC không hợp lệ %s.\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s: %s: Sai kiểu tiến độ %s.\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s: %s: Sai giới hạn %s,\n"
+" dùng: [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "Bảng mã %s không hợp lệ\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "Không hỗ trợ chức năng chuyển đổi từ %s sang %s\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "Gặp chuỗi byte không hoàn chỉnh hoặc không hợp lệ\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "Mã lỗi %d không được xử lý\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: chÆ°a đặt miá»n địa phÆ°Æ¡ng\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode bị lỗi (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "Gặp lá»—i khi chuyển sang chữ thÆ°á»ng: %d: %s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"Chuyển hướng kết xuất tới %s.\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s; không ghi nhật ký.\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "Cách dùng: %s [TÙY CHỌN]… [URL]…\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"Tùy chá»n dài bắt buá»™c phải có tham số Ä‘i kèm thì tùy chá»n ngắn cÅ©ng vậy.\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "Khởi động:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+" -V, --version hiển thị phiên bản của Wget rồi thoát.\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help hiển thị trợ giúp này.\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+" -b, --background chuyển chạy ná»n sau sau khi khởi Ä‘á»™ng.\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+" -e, --execute=LỆNH thá»±c hiện má»™t câu lệnh kiểu-“.wgetrcâ€.\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "Tập tin nhật ký và đầu vào:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=TẬP-TIN ghi nhật ký vào TẬP-TIN.\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+" -a, --append-output=TẬP-TIN nối thêm các lá»i nhắn vào TẬP-TIN.\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+" -d, --debug hiển thị nhiá»u thông tin để tìm và sá»­a "
+"lá»—i.\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+" --wdebug hiển thị kết xuất để gỡ lỗi bằng "
+"Watt-32.\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+" -q, --quiet im lặng (không kết xuất ra màn hình).\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+" -v, --verbose hiển thị chi tiết (đây là mặc định).\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose không chi tiết, cũng không im lặng.\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=KIỂU Hiển thị băng thông (bandwidth) cho "
+"KIỂU.\n"
+" KIỂU có thể là các bít.\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=TẬP-TIN tải các URL trong TẬP-TIN cục bộ hay bên "
+"ngoài.\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=TẬP-TIN tải các URL tìm thấy trong TẬP-TIN "
+"Metalink cục bộ.\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html coi tập tin đầu vào là HTML.\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL chuyển đổi liên kết tập tin nhập HTML (-i "
+"-F)\n"
+" tương đối so với URL này\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+" --config=TẬP-TIN chỉ định tập tin cấu hình sẽ sử dụng\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+" --no-config đừng Ä‘á»c bất kỳ tập tin cấu hình nào\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+" --rejected-log=TẬP-TIN ghi nhật ký các lý do URL bị từ chối vào "
+"TẬP-TIN\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "Tải vá»:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=SỠđặt số lần thử lại (0 = không giới hạn).\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr " --retry-connrefused cố tải dù kết nối bị từ chối.\n"
+
+#: src/main.c:651
+#, fuzzy
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr " --ignore-tags=DANH-SÃCH những thẻ HTML bị bá» qua\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=TẬP-TIN ghi dữ liệu vào TẬP-TIN này.\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber bỠqua những công việc sẽ tải tới tập "
+"tin\n"
+" đã có (ghi đè lên chúng).\n"
+
+#: src/main.c:658
+#, fuzzy
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+" --no-config đừng Ä‘á»c bất kỳ tập tin cấu hình nào\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+" -c, --continue tiếp tục tải phần còn tại của một tập "
+"tin.\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+" --start-pos=OFFSET bắt đầu tải vỠtừ vị trí bù này tính từ "
+"mốc không\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=KIỂU chá»n dạng mô tả tiến Ä‘á»™.\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --progress=KIỂU chá»n dạng mô tả tiến Ä‘á»™.\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping không nhận lại tập tin trừ khi mới hơn\n"
+" ná»™i bá»™.\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since đừng dùng Ä‘iá»u kiện if-modified-since\n"
+" trong chế Ä‘á»™ dấu vết thá»i gian\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps đừng đặt dấu vết thá»i gian của tập tin "
+"cục bộ\n"
+" tùy theo nhãn thá»i gian trên máy phục "
+"vụ.\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response in ra đáp ứng của máy chủ.\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider không tải xuống gì hết.\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+" -T, --timeout=GIÂY đặt má»i giá trị thá»i hạn là số GIÂY.\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ÄỊA_CHỈ liệt kê các máy phục vụ DNS muốn truy vấn "
+"(ngăn cách bằng dấu phẩy)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ÄỊA-CHỈ buá»™c vào ÄỊA_CHỈ này (tên máy hoặc IP)\n"
+" trên máy nội bộ.\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+" --dns-timeout=GIÂY đặt thá»i gian chá» tìm DNS thành GIÂY.\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+" --connect-timeout=GIÂY đặt thá»i gian chá» kết nối thành GIÂY.\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=GIÂY đặt thá»i gian chá» Ä‘á»c thành GIÂY.\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" -w, --wait=GIÂY chỠsố GIÂY này giữa các lần phục hồi.\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " --waitretry=GIÂY chỠ1..GIÂY giữa các lần thử lấy.\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait chỠ0.5*WAIT…1.5*WAIT giây giữa hai lần "
+"lấy.\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy không dùng máy chủ ủy nhiệm.\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+" -Q, --quota=SỠđặt giới hạn số phục hồi thành SỠnày.\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ÄỊA-CHỈ buá»™c vào ÄỊA_CHỈ này (tên máy hoặc IP)\n"
+" trên máy nội bộ.\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+" --limit-rate=Tá»C-ÄỘ giá»›i hạn tốc Ä‘á»™ tải xuống thành Tá»C_ÄỘ "
+"này.\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+" --no-dns-cache không dùng bộ nhớ đệm tìm kiếm DNS.\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=OS giới hạn ký tự trong tên tập tin thành\n"
+" những gì hệ Ä‘iá»u hành cho phép.\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+" --ignore-case không phân biệt chữ HOA/thÆ°á»ng khi khá»›p "
+"mẫu\n"
+" tin/thư mục.\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only chỉ kết nối tới các địa chỉ IPv4.\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only chỉ kết nối tới các địa chỉ IPv6.\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=NHÓM đầu tiên kết nối tới địa chỉ của nhóm chỉ "
+"ra,\n"
+" một trong IPv6, IPv4, hoặc none "
+"(không).\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=TÀI-KHOẢN đặt ngÆ°á»i dùng cho cả ftp và http.\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=MẬT-KHẨU đặt cả mật khẩu ftp và http thành MẬT-"
+"KHẨU.\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password nhắc nhập mật khẩu.\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=LỆNH chỉ định bộ xử lý ủy nhiệm cho tài khoản "
+"và\n"
+" mật khẩu yêu cầu. Nếu không đưa ra "
+"LỆNH\n"
+" thì biến môi trÆ°á»ng WGET_ASKPASS hoặc "
+"SSH_ASKPASS \n"
+" sẽ được dùng.\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri tắt hỗ trợ IRI.\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=BẢNG-MÃ dùng bảng mã này làm bảng mã cục bộ cho "
+"IRI.\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+" --remote-encoding=BẢNG-MÃ dùng bảng mã này làm bảng mã từ xa mặc "
+"định.\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink gỡ bỠtập tin trước khi ghi đè.\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash giữ lại các tập tin mà không khớp tổng "
+"kiểm (treo thêm .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=SỠSỠthứ tự Metalink application/"
+"metalink4+xml metaurl\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http dùng siêu dữ liệu Metalink từ phần đầu "
+"HTTP trả vá»\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr " --preferred-location vị trí ưu tiên cho nguồn Metalink\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr tắt kho chứa của siêu dữ liệu trong các "
+"thuộc tính tập tin mở rộng\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "Thư mục:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories không tạo thư mục.\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories ép buộc tạo thư mục.\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories không tạo thư mục máy.\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories dùng tên giao thức trong thư mục.\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=TIỀN-Tá» ghi tập tin vào TIỀN-Tá»/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr " --cut-dirs=Sá» lá»i Ä‘i Sá» thÆ° mục trên máy chủ.\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "Tùy chá»n HTTP:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+" --http-user=TÀI-KHOẢN đặt ngÆ°á»i dùng http thành TÀI-KHOẢN này.\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+" --http-password=MKHẨU đặt mật khẩu http thành MẬT-KHẨU này.\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+" --no-cache không cho phép dữ liệu cache trên "
+"server.\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=TÊN thay đổi TÊN trang mặc định\n"
+" (bình thÆ°á»ng là “index.htmlâ€.).\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension lưu tài liệu HTML/CSS với phần mở rộng "
+"phù hợp\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+" --ignore-length bá» qua trÆ°á»ng “Content-Length†của phần "
+"đầu.\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=CHUỖI chèn CHUỖI vào giữa các phần đầu.\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+" --max-redirect số chuyển hướng tối đa cho phép trên mỗi "
+"trang.\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=TÀIKHOẢN đặt TÀIKHOẢN làm tên ngÆ°á»i dùng ủy "
+"nhiệm.\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+" --proxy-password=MẬTKHẨU dùng MẬT KHẨU này để làm mật khẩu ủy "
+"nhiệm.\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL thêm phần đầu “Referer: URL†vào yêu cầu "
+"HTTP.\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers ghi phần đầu HTTP vào tập tin.\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=TÃC-NHÂN dùng đại diện này thay thế Wget/PHIÊN-"
+"BẢN.\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive không giữ HTTP sống (kết nối lâu dài).\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies không dùng cookies.\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=TẬP-TIN lấy cookie từ TẬP-TIN trước khi làm "
+"việc.\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+" --save-cookies=TẬP-TIN ghi cookie vào TẬP-TIN sau khi làm việc.\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies nạp và ghi cookie phiên làm việc (không\n"
+" thÆ°á»ng trá»±c).\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=CHUỖI dùng phương pháp POST; gửi CHUỖI làm dữ "
+"liệu.\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=TẬP-TIN dùng phương thức POST; gửi nội dung của "
+"TẬP-TIN.\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+" --method=HTTPMethod dùng phương thức \"HTTPMethod\" trong "
+"phần đầu.\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=CHUỖI gửi CHUỖI làm dữ liệu. --method phải được "
+"đặt.\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=TẬP-TIN gửi nội dung của TẬP-TIN. --method phải "
+"được đặt.\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition tùy theo dòng đầu “Content-Dispositionâ€\n"
+" (sắp đặt ná»™i dung) khi chá»n tên tập tin "
+"cục bộ\n"
+" (THỬ NGHIỆM)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+" --content-on-error kết xuất nội dung đã nhận với lỗi trên "
+"máy chủ.\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge gửi thông tin xác thực HTTP Cơ bản\n"
+" mà không đợi yêu cầu của máy phục vụ.\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "Tùy chá»n HTTPS (SSL/TLS):\n"
+
+#: src/main.c:847
+#, fuzzy
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR chá»n giao thức bảo mật, má»™t trong số:\n"
+" auto, SSLv2, SSLv3, và PFS.\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+" --https-only chỉ theo các liên kết HTTPS bảo mật\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+" --no-check-certificate không kiểm tra tính hợp lệ của chứng\n"
+" thực của máy chủ.\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+" --certificate=TẬP-TIN tập tin chứng nhận của ứng dụng khách\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=KIỂU dạng chứng nhận ứng dụng khách, PEM hoặc "
+"DER.\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=TẬP-TIN TẬP TIN chứa khóa riêng.\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+" --private-key-type=KIỂU kiểu chìa khóa riêng tư, PEM hoặc DER.\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=TẬP-TIN tập tin đóng gói các CA.\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+" --ca-directory=DIR thư mục chứa danh sách mã băm của CA.\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=TẬP-TIN tập tin đóng gói các CA.\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=TẬP_TIN/MÃ_BĂM Tập tin khóa công (PEM/DER), hay bất "
+"kỳ\n"
+" số của mã băm sha256 mã hóa bằng base64 "
+"treo\n"
+" trước bằng “sha256//†và ngăn cách bằng "
+"“;â€,\n"
+" để kiểm tra lại căn cứ vào mạng ngang "
+"hàng\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=TẬP-TIN tập tin với dữ liệu theo xác suất\n"
+" để tạo thành SSL PRNG.\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=TẬP-TIN đặt tên socket EGD với dữ liệu dữ liệu\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "Tùy chá»n HSTS:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts tắt HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+" --hsts-file Ä‘Æ°á»ng dẫn của cÆ¡ sở dữ liệu HSTS (sẽ ghi "
+"đè theo mặc định)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "Tùy chá»n FTP:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf dùng định dạng Stream_LF cho má»i tập tin "
+"FTP nhị phân.\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+" --ftp-user=TÀI-KHOẢN dùng TÀI-KHOẢN này để đăng nhập ftp.\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+" --ftp-password=MẬT-KHẨU dùng mật khẩu này để đăng nhập ftp.\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing không xóa bá» tập tin “.listingâ€.\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+" --no-glob không dùng globbing cho tên tập tin FTP.\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+" --no-passive-ftp tắt chế Ä‘á»™ truyá»n \"passive\" (thụ "
+"Ä‘á»™ng).\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+" --preserve-permissions duy trì quyá»n của tập tin từ máy chủ.\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks khi đệ quy, lấy tập tin được liên kết "
+"đến\n"
+" (không phải thư mục).\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "Tùy chá»n FTPS:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit dùng FTPS ngầm định (cổng mặc định là "
+"990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl coi rằng phiên SSL/TLS được bắt đầu "
+"trong kết nối Ä‘iá»u khiển\n"
+" khi mở kết nối dữ liệu\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection chỉ mã hóa kênh Ä‘iá»u khiển; má»i dữ "
+"liệu sẽ ở dạng thÆ°á»ng\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp quay lại dùng FTP nếu FTPS không được "
+"hỗ trợ ở máy đích\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "Tùy chá»n vá» WARC:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=TẬP-TIN ghi dữ liệu request/response (yêu cầu/trả "
+"lá»i)\n"
+" vào tập tin .warc.gz.\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=CHUỖI chèn CHUỖI vào bản ghi warcinfo.\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+" --warc-max-size=SỠđặt kích thước tối đa cho các tập tin "
+"WARC.\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx ghi tập tin chỉ mục CDX.\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+" --warc-dedup=TẬP-TIN không lưu các bản ghi được liệt kê\n"
+" trong tập tin CDX này.\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+" --no-warc-compression không nén các tập tin WARC bằng GZIP.\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests không tính giá trị băm SHA1.\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+" --no-warc-keep-log không lưu tập tin nhật ký trong bản ghi "
+"WARC.\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+" --warc-tempdir=THƯMỤC vị trí để lưu các tập tin tạm được tạo "
+"bởi\n"
+" bá»™ ghi WARC.\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "Tải đệ quy:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive dùng tải đệ quy.\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=SỠđộ sâu lớn nhất của đệ quy (inf hoặc 0 = "
+"vô hạn).\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+" --delete-after xóa tập tin nội bộ sau khi tải xong.\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links làm cho liên kết trong mã HTML hay CSS đã "
+"tải xuống\n"
+" chỉ tới tập tin cục bộ.\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only chỉ chuyển đổi bộ phận tập tin của URL "
+"(thÆ°á»ng được đến là tên cÆ¡ sở)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N trước khi ghi tập tin X, sao lưu thành N "
+"bản.\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted trước khi chuyển đổi tập tin X, sao lưu "
+"thành X_orig.\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted trước khi chuyển đổi tập tin X,\n"
+" sao lưu thành X.orig.\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror tùy chá»n rút gá»n tÆ°Æ¡ng Ä‘Æ°Æ¡ng vá»›i\n"
+" “-N -r -l inf --no-remove-listingâ€.\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites lấy má»i hình ảnh, v.v… cần thiết để\n"
+" hiển thị trang HTML.\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments bật xử lý chặt (SGML) cho chú thích "
+"HTML.\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "Chấp nhận/từ chối đệ quy:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+" -A, --accept=DANH-SÃCH danh sách phần Ä‘uôi mở rá»™ng được chấp "
+"nhận\n"
+" được ngăn cách bằng dấu phẩy\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+" -R, --reject=DANH-SÃCH danh sách phần Ä‘uôi mở rá»™ng bị loại trừ\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+" --accept-regex=BTCQ chấp nhận các URL khớp biểu thức chính "
+"qui\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+" --reject-regex=BTCQ từ chối các URL khớp biểu thức chính qui\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+" --regex-type=KIỂU kiểu biểu thức chính qui (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=KIỂU kiểu biểu thức chính qui (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+" -D, --domains=DANH-SÃCH miá»n chấp nhận cách nhau bằng dấu phẩy\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+" --exclude-domains=DANH-SÃCH miá»n loại trừ cách nhau bằng dấu phẩy\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+" --follow-ftp theo liên kết FTP từ tài liệu HTML\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr " --follow-tags=DANH-SÃCH những thẻ HTML có thể theo\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr " --ignore-tags=DANH-SÃCH những thẻ HTML bị bá» qua\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr " -H, --span-hosts đi tới máy khác khi đệ quy\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative chỉ đi theo liên kết tương đối\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=DANH-SÃCH những thÆ° mục cho phép\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names dùng tên được chỉ định bởi thành phần\n"
+" cuối cùng của địa chỉ URL chuyển hướng\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=DANH-SÃCH những thÆ° mục loại trừ\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent không đi ngược lên thư mục mẹ\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s, chương trình tải dữ liệu từ mạng không tương tác.\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "Mật khẩu cho tài khoản %s: "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "Mật khẩu: "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "Không thể tạo ống dẫn\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+"Gặp lỗi khi khởi tạo thao tác sản sinh tập tin dùng cho use-askpass: %d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "Lỗi cài đặt thao tác sản sinh tập tin để dùng cho use-askpass: %d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "Gặp lá»—i khi Ä‘á»c trả lá»i từ lệnh \"%s %s\": %s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "Tài khoản cho “%s%sâ€: "
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "Mật khẩu cho “%s%s@%sâ€: "
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "Miá»n địa phÆ°Æ¡ng: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "Biên dịch: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "Liên kết: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s được biên dịch dành cho %s.\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (môi trÆ°á»ng)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (ngÆ°á»i dùng)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (hệ thống)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Tác quyá»n © năm %s của Tổ chức Phần má»m Tá»± do, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"Giấy Phép Công Cộng GNU (GPL), phiên bản 3 hay mới hơn\n"
+"<http://gnu.org/licenses/gpl.html>\n"
+"Äây là phần má»m tá»± do: bạn có quyá»n thay đổi và phát hành lại nó.\n"
+"KHÔNG CÓ BẢO HÀNH GÃŒ CẢ, vá»›i Ä‘iá»u kiện được pháp luật cho phép.\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"Nguyên bản được viết bởi Hrvoje Niksic <hniksic@xemacs.org>.\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+"Hãy gá»­i thông báo lá»—i và các câu há»i cho <bug-wget@gnu.org>.\n"
+"Thông báo lỗi dịch cho: <http://translationproject.org/team/vi.html>.\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "Vấn đỠvỠcấp phát bộ nhớ\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "Thoát ra bởi vì lỗi trong %s\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "Thá»­ “%s --help†để biết thêm tùy chá»n.\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: tùy chá»n không hợp lệ -- “-n%câ€\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "Việc hỗ trợ gỡ lỗi không được biên dịch cùng. BỠqua cỠ--debug\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"Nếu cả hai tùy chá»n --no-clobber và --convert-links được chỉ ra, chỉ --"
+"convert-links được dùng.\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"Cả hai tùy chá»n --no-clobber và --convert-file-only được chỉ ra, chỉ --"
+"convert-file-only được dùng.\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "Không thể dùng --verbose và --quiet cùng lúc.\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+"Không thể cùng má»™t lúc đánh dấu thá»i gian và không ghi đè tập tin cÅ©.\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+"Không thể chỉ ra đồng thá»i cả hai tùy chá»n --inet4-only và --inet6-only.\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"Không chỉ Ä‘inh cả hai -k hay --convert-file-only và -O vá»›i nhiá»u địa chỉ "
+"URL, hoặc dùng kèm\n"
+"với -p hay -r. Xem sổ tay để biết chi tiết.\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"CẢNH BÃO: tổ hợp tùy chá»n “-O†vá»›i “-r†hay “-p†gây ra\n"
+"tất cả nội dung đã tải lên được đặt vào tập tin riêng lẻ bạn đã chỉ ra.\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"CẢNH BÃO: chức năng ghi giá» không làm gì khi dùng cùng vá»›i tùy chá»n “-Oâ€. "
+"Xem sổ tay để tìm chi tiết.\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+"Kết xuất WARC không làm việc vá»›i tùy chá»n --no-clobber, --no-clobber sẽ bị "
+"tắt đi.\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+"Kết xuất WARC không làm việc vá»›i tùy chá»n timestamping, timestamping sẽ bị "
+"tắt đi.\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "Kết xuất WARC không làm việc vá»›i tùy chá»n --spider.\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Kết xuất WARC không làm việc vá»›i tùy chá»n --continue hay --start-pos, chúng "
+"sẽ bị tắt đi.\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+"Tóm lược (mã băm) bị tắt đi; WARC sẽ không tìm những bản ghi trùng nhau.\n"
+
+#: src/main.c:1750
+#, fuzzy, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+"Kết xuất WARC không làm việc vá»›i tùy chá»n --continue hay --start-pos, chúng "
+"sẽ bị tắt đi.\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+"Không thể chỉ ra đồng thá»i cả hai tùy chá»n “--ask-password†và “--"
+"passwordâ€.\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"Chỉ ra cả --start-pos và --continue là không nên; --continue sẽ bị tắt.\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: thiếu URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+"Không thể chỉ ra đồng thá»i cả hai tùy chá»n “--post-data†và “--post-fileâ€.\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"Bạn không thể dùng tùy chá»n --post-data hay --post-file cùng vá»›i --method. --"
+"method cần dữ liệu thông qua các tùy chá»n --body-data và --body-file\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"Bạn phải chá»n phÆ°Æ¡ng thức thông qua --method=HTTPMethod hay dùng vá»›i --body-"
+"data hoặc --body-file.\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+"Không thể chỉ ra đồng thá»i cả hai tùy chá»n --body-data và --body-file.\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "Phiên bản này không hỗ trợ IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+"“-k†hay “-r†chỉ có thể được dùng cùng với “-O†chỉ khi xuất vào một tập "
+"tin thông thÆ°á»ng.\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links hay --convert-file-only chỉ có thể được dùng cùng với nhau "
+"chỉ khi xuất vào má»™t tập tin thông thÆ°á»ng.\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "Gặp lỗi khi khởi tạo libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "Gặp lỗi khi khởi tạo kênh c-ares\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "Gặp lỗi khi phân tích địa chỉ IP %s\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "Gặp lỗi khi đặt máy phục vụ DNS “%s†(%d).\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "Không tìm thấy địa chỉ URL trong %s.\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "Không thể phân tích cú pháp tập tin metalink %s.\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "Không thể tải vá» má»i nguồn tài nguyên từ %s.\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"XONG --%s--\n"
+"Tổng thá»i gian: %s\n"
+"Äã tải vá»: %d tập tin, %s trong %s (%s)\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "VƯỢT GIỚI HẠN tải vỠ%s!\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O không được hỗ trợ với tải vỠmetalink. Nên bỠqua.\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "Tập tin metalink đã lên kế hoạch: %s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "Tập tin metalink an ninh: %s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "Từ chối tập tin metalink. Tên không an toàn.\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "Äang xá»­ lý metaurl %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "Từ chối tập tin metalink %s. Tên không an toàn.\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "Gặp lỗi khi tải %s. Nên bỠqua metaurl.\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "Không thể phân tích cú pháp tập tin metaurl %s.\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Việc xử lý Metaurls trả vỠlỗi.\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "Tài nguyên kiểu %s không được hỗ trợ, nên bỠqua…\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "Không thể mở tập tin đã tải vá».\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "Äang tính kích cỡ của %s\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "Kích thước tập tin chưa được công bố. Nên bỠqua việc kiểm tra.\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "Không thể lẫy cỡ của tập tin đã tải vá».\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "Cỡ của tập tin không khớp với tập tin %s.\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "Kích cỡ khớp nhau.\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "Äang tính tổng kiểm của %s\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "Tổng kiểm khớp nhau.\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "Tổng kiểm không khớp với tập tin %s.\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "Không thể mở đã tải vỠđể xác thực chữ ký.\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "Việc xác nhận chữ ký đã thành công.\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "Chữ ký không hợp lệ. Từ chối tài nguyên.\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "Dữ liệu khớp với chữ ký, nhưng chữ ký lại không đáng tin.\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "Không tìm thấy tổng kiểm.\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "Gặp lỗi khi tải %s. Nên bỠqua tài nguyên.\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "Tập tin %s đã được tải vỠnhưng kích cỡ lại không khớp. \n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "Tập tin %s đã được tải vỠnhưng tổng kiểm lại không khớp. \n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "Tập tin %s đã được tải vỠnhưng chữ ký lại không khớp. \n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "Äang đổi %s thành %s.\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "Tiếp tục chạy ná»n.\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "Tiếp tục ở ná»n, pid %lu.\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "Kết quả sẽ được ghi vào %s.\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() (giả tạo tiến trình con?) gặp lỗi\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() gặp lỗi\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: Không tìm thấy trình Ä‘iá»u khiển ổ cắm dùng được.\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() gặp lỗi. Ổ cắm không thể được đặt như là kiểu khối.\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s: %s:%d: cảnh báo: hiệu bài %s xuất hiện trước bất kỳ tên máy nào\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: không rõ hiệu bài “%sâ€\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "Cách dùng: %s NETRC [TÊN MÃY]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s: không thể lấy thống kê (stat) %s: %s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "CẢNH BÃO: sá»­ dụng mầm số ngẫu nhiên yếu.\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "Không thể tạo mầm PRNG, coi như sử dụng --random-file.\n"
+
+#: src/openssl.c:271
+#, fuzzy
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "Phiên bản OpenSSL của bạn quá cũ để hỗ trợ TLSv1.1\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "Phiên bản OpenSSL của bạn quá cũ để hỗ trợ TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "Phiên bản OpenSSL của bạn quá cũ để hỗ trợ TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL: giá trị tùy chá»n “secure-protocol†chÆ°a được thá»±c hiện %d\n"
+
+#: src/openssl.c:333
+#, fuzzy, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "%s: URL không hợp lệ %s: %s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+#, fuzzy
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "Không thể tạo mầm PRNG, coi như sử dụng --random-file.\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: không thể thẩm tra chứng nhận của %s, cấp bởi %s:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " Không thể thẩm tra cục bá»™ quyá»n của nhà cấp.\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " Gặp chứng nhận tự ký.\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " Chứng nhận đã cấp nhưng chưa hợp lệ.\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " Chứng nhận đã cấp cũng đã hết hạn dùng.\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: không có tên thay thế của chủ thể chứng nhận mà\n"
+"\ttương ứng với tên máy yêu cầu %s.\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+" %s: tên thÆ°á»ng gá»i của chứng nhận %s không tÆ°Æ¡ng ứng tên máy yêu cầu "
+"%s.\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: tên chung chứng nhận không hợp lệ (chứa một ký tự null).\n"
+" TrÆ°á»ng hợp này có thể thấy rằng máy chủ không phải là cái mà được bảo "
+"vệ\n"
+" (do vậy, máy không phải là %s thật).\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "Äể kết nối không an toàn tá»›i %s, hãy dùng “-no-check-certificateâ€.\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ nhảy qua %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "Lỗi trong định dạng dấu chấm %s, để nguyên.\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " cần %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " trong "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "Không thể lấy tần số đồng hồ THỜI GIAN THỰC: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "Xóa %s vì nó sẽ bị từ chối.\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "Không thể mở %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "Äang tải robots.txt; xin hãy bá» qua các thông báo lá»—i.\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "Lỗi phân tích URL của proxy %s: %s.\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "Lỗi trong URL của proxy %s: Phải là HTTP.\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "Vượt quá mức giới hạn %d lần chuyển hướng.\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"Chịu thua.\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"Äang thá»­ lại.\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"Không tìm thấy liên kết há»ng.\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"Tìm thấy %d liên kết há»ng.\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "Không có lỗi"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "Lược đồ không được hỗ trợ %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "Thiếu lược đồ"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "Sai tên máy"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "Sai số hiệu cổng"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "Sai tên ngÆ°á»i dùng"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "Äịa chỉ số IPv6 không có giá»›i hạn"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "Không hỗ trợ địa chỉ IPv6"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "Sai địa chỉ IPv6 dạng số"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "Chưa biên dịch để hỗ trợ HTTPS"
+
+#: src/url.c:1620
+#, fuzzy
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "Gặp chuỗi byte không hoàn chỉnh hoặc không hợp lệ\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: Gặp lỗi khi cấp pháp đủ bộ nhớ; do hết bộ nhớ.\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: Gặp lỗi khi cấp phát %ld byte; do hết bộ nhớ.\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: vùng đệm văn bản quá lá»›n (%d byte), nên hủy bá».\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "Tiếp tục chạy ná»n, pid %d.\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "Bá» liên kết má»m %s không thành công: %s\n"
+
+#: src/utils.c:879
+#, fuzzy, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Gặp lỗi khi khởi tạo libcares\n"
+
+#: src/utils.c:885
+#, fuzzy, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "Gặp lá»—i khi phân quyá»n cho %s.\n"
+
+#: src/utils.c:892
+#, fuzzy, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "Gặp lá»—i khi phân quyá»n cho %s.\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, fuzzy, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "Gặp lỗi khi phân tích địa chỉ IP %s\n"
+
+#: src/utils.c:943
+#, fuzzy, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "Gặp lá»—i khi phân quyá»n cho %s.\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, fuzzy, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "Biểu thức chính qui không hợp lệ %s, %s\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "Biểu thức chính qui không hợp lệ %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "Gặp lỗi khi so khớp %s: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "Gặp lỗi trong khi mở tập tin WARC %s.\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "Gặp lỗi trong khi mở tập tin WARC %s.\n"
+
+#: src/warc.c:234
+#, fuzzy
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "Gặp lỗi trong khi mở tập tin WARC %s.\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "Lỗi mở dòng dữ liệu GZIP tới tập tin WARC.\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "Lỗi ghi bản ghi warcinfo vào tập tin WARC.\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"Äang mở tập tin WARC %s.\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "Gặp lỗi trong khi mở tập tin WARC %s.\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "Tập tin CDX không liệt kê url gốc. (Thiếu cá»™t “aâ€.)\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "Tập tin CDX không liệt kê mã băm tổng kiểm tra. (Thiếu cá»™t “kâ€.)\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "Tập tin CDX không liệt kê id bản ghi. (Thiếu cá»™t “uâ€.)\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"Äã tải %d bản ghi từ CDX.\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "Không thể Ä‘á»c tập tin CDX %s cho tái nhân bản.\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "Không thể mở tập tin kê khai tạm thá»i WARC.\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "Không thể ghi vào tập tin nhật ký tạm thá»i WARC.\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "Không thể mở tập tin WARC.\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "Không thể mở tệp tin CDX cho đầu ra.\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "Không thể mở tập tin tạm thá»i WARC.\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
+"Tìm thấy khá»›p hoàn toàn trong tập tin CDX. Äang ghi bản ghi truy cập lại vào "
+"WARC.\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "Lỗi hệ thống không rõ"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "HỠđịa chỉ cho tên máy không được hỗ trợ"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "Giá trị cho ai_flags sai"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "Phân giải tên bị lỗi đến mức không thể phục hồi"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "không há»— trợ “ai_familyâ€"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "Gặp lỗi khi cấp phát bộ nhớ"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "Không có địa chỉ được kiên kết với tên máy"
+
+#~ msgid "Name or service not known"
+#~ msgstr "Không rõ tên hay dịch vụ"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "Tên máy không được hỗ trợ đối với “ai_socktype†(kiểu ổ cắm)"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "“ai-socktype†(kiểu ổ cắm) không được hỗ trợ"
+
+#~ msgid "System error"
+#~ msgstr "Lỗi hệ thống"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "Äối số bá»™ đệm quá nhá»"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "Äang xá»­ lý yêu cầu trong tiến trình"
+
+#~ msgid "Request canceled"
+#~ msgstr "Yêu cầu bị hủy bá»"
+
+#~ msgid "Request not canceled"
+#~ msgstr "Yêu cầu không được hủy"
+
+#~ msgid "All requests done"
+#~ msgstr "Má»i yêu cầu đã được xá»­ lý xong"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "Bị ngắt bởi một tín hiệu"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "Chuỗi tham số không được mã hóa một cách đúng đắn"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous; possibilities:"
+#~ msgstr "%s: tùy chá»n “%s†chÆ°a rõ ràng; khả năng là:"
+
+#, c-format
+#~ msgid "%s: option '%s' is ambiguous\n"
+#~ msgstr "%s: tùy chá»n “%s†chÆ°a rõ ràng\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s: tùy chá»n “--%s†không cho phép đối số\n"
+
+#, c-format
+#~ msgid "%s: option '%c%s' doesn't allow an argument\n"
+#~ msgstr "%s: tùy chá»n “%c%s†không cho phép đối số\n"
+
+#, c-format
+#~ msgid "%s: option '--%s' requires an argument\n"
+#~ msgstr "%s: tùy chá»n “--%s†cần má»™t đối số\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s: không nhận ra tùy chá»n “--%sâ€\n"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%c%s'\n"
+#~ msgstr "%s: không nhận ra tùy chá»n “%c%sâ€\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s: tùy chá»n sai -- “%câ€\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s: tùy chá»n yêu cầu má»™t đối số -- “%câ€\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s: tùy chá»n “-W %s†chÆ°a rõ ràng\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s: tùy chá»n “-W %s†không cho phép đối số\n"
+
+#, c-format
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s: tùy chá»n “-W %s†cần má»™t đối số\n"
+
+#~ msgid "`"
+#~ msgstr "“"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "Thành công"
+
+#~ msgid "No match"
+#~ msgstr "Không tìm thấy"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "Biểu thức chính quy không hợp lệ"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "Ký tự đối chiếu không hợp lệ"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "Tên lớp ký tự không hợp lệ"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "Có dấu gạch ngược theo sau"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "Tham chiếu ngược không hợp lệ"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "Chưa khớp cặp ký tự [, [^, [:, [., hay [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "ChÆ°a khá»›p ký tá»± “(†hay “\\(â€"
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "ChÆ°a khá»›p cặp “\\{â€"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "Nội dung của “\\{\\}†không hợp lệ"
+
+#~ msgid "Invalid range end"
+#~ msgstr "Kết thúc phạm vi không hợp lệ"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "Hết bộ nhớ"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "Biểu thức chính quy đi trước không hợp lệ"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "Biểu thức chính quy kết thúc quá sớm"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "Biểu thức chính quy quá lớn"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "ChÆ°a khá»›p “)†hoặc “\\)â€"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "Không có biểu thức chính quy nằm trước"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "không thể tạo ống dẫn"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "tiến trình con %s gặp lỗi"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle gặp lỗi"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "không thể phục hồi bộ mô tả tập tin %d: dup2 gặp lỗi"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "tiến trình con %s"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "tiến trình con %s đã nhận tín hiệu báo lá»—i nghiêm trá»ng %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "hết bộ nhớ"
+
+#~ msgid "Mail bug reports and suggestions to <bug-wget@gnu.org>\n"
+#~ msgstr ""
+#~ "Gửi báo cáo lỗi và gợi ý tới <bug-wget@gnu.org>\n"
+#~ "Gửi thông báo vỠlỗi dịch cho <http://translationproject.org/team/vi."
+#~ "html>\n"
+
+#, c-format
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "Tập tin “%s†đã có ở đây nên không nhận lại nữa.\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "Chuỗi UTF-8 không hợp lệ: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode bị lỗi (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Äã nhận %s.\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "Xác thực không thành công.\n"
+
+#~ msgid ""
+#~ " --retries specify the number of retries for a "
+#~ "file.\n"
+#~ " (needs to be used with --metalink-file)\n"
+#~ msgstr ""
+#~ " --retries chỉ định số lần xử lý lại dành cho một "
+#~ "tập tin.\n"
+#~ " (cần được dùng cùng vá»›i tùy chá»n --"
+#~ "metalink-file)\n"
+
+#~ msgid " --jobs specify how many threads use.\n"
+#~ msgstr ""
+#~ " --jobs chỉ định sẽ dùng bao nhiêu tuyến.\n"
+
+#~ msgid ""
+#~ "Username and password information not needed to be "
+#~ "specified when downloading from a metalink.\n"
+#~ msgstr ""
+#~ "Thông tin vỠtài khoản và mật khẩu không cần được "
+#~ "chỉ định khi tải từ metalink.\n"
+
+#~ msgid "%s can not be used with --metalink.\n"
+#~ msgstr "%s không thể sử dụng cùng với --metalink.\n"
+
+#~ msgid "Output format:\n"
+#~ msgstr "Äịnh dạng kết xuất:\n"
+
+#~ msgid ""
+#~ "WARNING: Can't reopen standard output in binary mode;\n"
+#~ " downloaded file may contain inappropriate line endings.\n"
+#~ msgstr ""
+#~ "CẢNH BÃO: không thể mở lại đầu ra tiêu chuẩn trong chế Ä‘á»™ nhị phân;\n"
+#~ "\ttập tin tải xuống có thể chứa kết thúc dòng không thích hợp.\n"
diff --git a/po/wget.pot b/po/wget.pot
new file mode 100644
index 0000000..1b66181
--- /dev/null
+++ b/po/wget.pot
@@ -0,0 +1,3040 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the GNU wget package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr ""
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr ""
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr ""
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr ""
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr ""
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr ""
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr ""
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr ""
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr ""
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr ""
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr ""
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr ""
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr ""
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr ""
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr ""
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr ""
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr ""
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr ""
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr ""
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr ""
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr ""
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr ""
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr ""
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr ""
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr ""
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr ""
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr ""
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr ""
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr ""
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr ""
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr ""
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr ""
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ""
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ""
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr ""
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr ""
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr ""
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr ""
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr ""
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr ""
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr ""
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr ""
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr ""
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr ""
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr ""
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr ""
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr ""
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr ""
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr ""
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr ""
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr ""
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr ""
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr ""
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr ""
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr ""
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr ""
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr ""
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr ""
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr ""
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr ""
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr ""
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr ""
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr ""
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr ""
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr ""
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr ""
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr ""
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr ""
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr ""
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr ""
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr ""
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr ""
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr ""
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr ""
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr ""
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr ""
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr ""
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr ""
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr ""
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr ""
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr ""
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr ""
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr ""
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr ""
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr ""
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr ""
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr ""
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr ""
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr ""
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr ""
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr ""
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr ""
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr ""
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr ""
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr ""
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr ""
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr ""
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr ""
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr ""
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr ""
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr ""
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr ""
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr ""
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr ""
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr ""
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr ""
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr ""
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr ""
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr ""
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr ""
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr ""
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr ""
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr ""
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr ""
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr ""
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr ""
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr ""
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr ""
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr ""
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr ""
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr ""
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr ""
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr ""
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr ""
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr ""
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr ""
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr ""
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr ""
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr ""
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr ""
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr ""
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr ""
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr ""
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr ""
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr ""
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr ""
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr ""
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr ""
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr ""
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr ""
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr ""
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr ""
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr ""
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr ""
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr ""
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr ""
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr ""
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr ""
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr ""
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr ""
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr ""
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr ""
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr ""
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr ""
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr ""
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr ""
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr ""
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr ""
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr ""
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr ""
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr ""
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr ""
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr ""
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr ""
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr ""
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr ""
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr ""
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr ""
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr ""
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr ""
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr ""
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr ""
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr ""
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr ""
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr ""
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr ""
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr ""
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr ""
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr ""
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr ""
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr ""
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr ""
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr ""
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr ""
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr ""
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr ""
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr ""
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr ""
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr ""
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr ""
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr ""
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr ""
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr ""
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr ""
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr ""
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr ""
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr ""
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr ""
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr ""
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr ""
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr ""
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr ""
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr ""
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr ""
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr ""
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr ""
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr ""
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr ""
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr ""
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr ""
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr ""
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr ""
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr ""
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr ""
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr ""
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr ""
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr ""
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr ""
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr ""
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr ""
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr ""
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr ""
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr ""
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr ""
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr ""
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr ""
+
+#: src/main.c:695
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:698
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:701
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr ""
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr ""
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr ""
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr ""
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr ""
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr ""
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr ""
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr ""
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr ""
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr ""
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr ""
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr ""
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr ""
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr ""
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr ""
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr ""
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr ""
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr ""
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr ""
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr ""
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr ""
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr ""
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr ""
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr ""
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr ""
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr ""
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr ""
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr ""
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr ""
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr ""
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr ""
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr ""
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr ""
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr ""
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr ""
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr ""
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr ""
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr ""
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr ""
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr ""
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr ""
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr ""
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr ""
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr ""
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr ""
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr ""
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr ""
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr ""
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr ""
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr ""
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr ""
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr ""
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr ""
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr ""
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr ""
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr ""
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr ""
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr ""
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr ""
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr ""
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr ""
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr ""
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr ""
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr ""
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr ""
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr ""
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr ""
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr ""
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr ""
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr ""
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr ""
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr ""
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr ""
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr ""
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr ""
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr ""
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr ""
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr ""
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr ""
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr ""
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr ""
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr ""
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr ""
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr ""
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr ""
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr ""
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr ""
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr ""
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr ""
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr ""
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr ""
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr ""
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr ""
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr ""
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr ""
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr ""
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr ""
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr ""
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr ""
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr ""
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr ""
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr ""
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr ""
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr ""
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr ""
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr ""
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr ""
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr ""
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr ""
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr ""
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr ""
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr ""
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr ""
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr ""
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr ""
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr ""
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr ""
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr ""
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr ""
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr ""
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr ""
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr ""
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr ""
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr ""
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr ""
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr ""
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr ""
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr ""
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr ""
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr ""
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr ""
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr ""
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr ""
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr ""
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr ""
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr ""
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr ""
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr ""
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr ""
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr ""
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr ""
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr ""
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr ""
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr ""
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr ""
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr ""
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr ""
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr ""
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr ""
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr ""
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr ""
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr ""
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr ""
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr ""
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr ""
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr ""
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr ""
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr ""
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr ""
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr ""
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr ""
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr ""
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr ""
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr ""
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr ""
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr ""
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr ""
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr ""
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr ""
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr ""
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr ""
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr ""
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr ""
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr ""
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr ""
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr ""
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr ""
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr ""
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr ""
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr ""
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/url.c:675
+msgid "No error"
+msgstr ""
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr ""
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr ""
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr ""
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr ""
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr ""
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr ""
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr ""
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr ""
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr ""
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr ""
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr ""
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr ""
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr ""
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr ""
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr ""
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr ""
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr ""
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr ""
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr ""
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr ""
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr ""
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr ""
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr ""
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr ""
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr ""
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr ""
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr ""
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr ""
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr ""
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr ""
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr ""
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr ""
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr ""
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr ""
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr ""
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr ""
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr ""
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr ""
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
new file mode 100644
index 0000000..1f7c8a6
--- /dev/null
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..4dc140a
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,3452 @@
+# Simplified Chinese translation of GNU Wget
+# Copyright (C) 2003, 2009, 2010, 2011, 2015 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# Rongjun Mu <elanmu@sina.com>, 2003.
+# Liu Songhe <jackliu9999@263.net>, 2003.
+# Zong Yaotang <zong@cosix.com.cn>, 2003.
+# Ji ZhengYu <zhengyuji@gmail.com>, 2009, 2010.
+# Anthony Fok <foka@debian.org>, 2010, 2011.
+# Mingcong Bai <jeffbai@aosc.xyz>, 2015.
+# Mingye Wang <arthur200126@gmail.com>, 2015, 2017.
+# Boyuan Yang <073plan@gmail.com>, 2017, 2018, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.21\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2020-09-07 12:52-0400\n"
+"Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%s: æ— æ³•è§£æž bind åœ°å€ %sï¼›ç¦ç”¨ bind。\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "正在连接 %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "正在连接 %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "正在连接 [%s]:%d... "
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF 失败:%s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "已连接。\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "失败:%s。\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s: 无法解æžä¸»æœºåœ°å€ %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR 失败:%s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "打开太多文件æ述符了。select 最多åªèƒ½ç”¨äºŽ %d å·æ述符\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "已转æ¢äº† %d 个文件中的链接,用时 %s 秒。\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "æ­£åœ¨è½¬æ¢ %s 中的链接... "
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ä¸éœ€è¿›è¡Œä»»ä½•æ“作。\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr "%d.\n"
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "æ— æ³•è½¬æ¢ %s 中的链接:%s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "无法删除 %s: %s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "无法将 %s å¤‡ä»½æˆ %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "æ— æ³•èŽ·å– %s çš„ cookie\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "在 Set-Cookie 中出现语法错误:%s 在ä½ç½® %d 处。\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "æ¥è‡ª %s çš„ Cookie å°è¯•å°†åŸŸè®¾ç½®ä¸º "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "无法打开 cookie 文件 %s: %s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "写入 %s æ—¶å‘生错误: %s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "关闭 %s æ—¶å‘生错误: %s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "ä¸æ”¯æŒçš„文件列表类型,试用 Unix æ ¼å¼çš„列表æ¥åˆ†æžã€‚\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s 的索引,在 %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "未知的时间 "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "文件 "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "目录 "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "链接 "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "ä¸ç¡®å®š "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s 字节)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "长度:%s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ",剩余 %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ",剩余 %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (éžæ­£å¼æ•°æ®)\n"
+
+#: src/ftp.c:403
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "无法åˆå§‹åŒ– SSL,它将被ç¦ç”¨ã€‚\n"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "正在以 %s 登录 ... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "æœåŠ¡å™¨å“应时å‘生错误,正在关闭控制连接。\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "æœåŠ¡å™¨æ¶ˆæ¯å‡ºçŽ°é”™è¯¯ã€‚\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "写入失败,正在关闭控制连接。\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "æœåŠ¡å™¨æ‹’ç»ç™»å½•ã€‚\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "登录ä¸æ­£ç¡®ã€‚\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "登录æˆåŠŸï¼\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "æœåŠ¡å™¨ä¸æŽ¥å—‘PBSZ 0’命令。\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "æœåŠ¡å™¨ä¸æŽ¥å—‘PROT %c’命令。\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "æœåŠ¡å™¨é”™è¯¯ï¼Œæ— æ³•ç¡®å®šæ“作系统的类型。\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "完æˆã€‚ "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "完æˆã€‚\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "未知的类别“%câ€ï¼Œæ­£åœ¨å…³é—­æŽ§åˆ¶è¿žæŽ¥ã€‚\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "完æˆã€‚ "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> ä¸éœ€è¦ CWD。\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "进入了 getftp() 中逻辑上ä¸å¯èƒ½çš„段è½"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"目录 %s ä¸å­˜åœ¨ã€‚\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> ä¸éœ€è¦ CWD。\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "该文件已ç»è¢«èŽ·å–了。\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "无法å¯åŠ¨ PASV 传输。\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "æ— æ³•è§£æž PASV å“应内容。\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "无法连接到 %s 端å£å· %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind 错误 (%s)。\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT 命令无效。\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"断点续传 (REST) 失败,é‡å¤´å¼€å§‹ä¸‹è½½ã€‚\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "文件 %s 已存在。\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "文件 %s ä¸å­˜åœ¨ã€‚\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"文件 %s ä¸å­˜åœ¨ã€‚\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"文件或目录 %s ä¸å­˜åœ¨ã€‚\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s çªç„¶å‡ºçŽ°ã€‚\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s:%s,正在关闭控制连接。\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) - æ•°æ®è¿žæŽ¥ï¼š%sï¼›"
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "已关闭控制连接。\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "æ•°æ®ä¼ è¾“已被中止。\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "文件 %s 已存在;ä¸èŽ·å–。\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(å°è¯•æ¬¡æ•°ï¼š%2d)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 已写入标准输出 %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - %s å·²ä¿å­˜ [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "正在删除 %s。\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "使用 %s 作为列表临时文件。\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "已删除 %s。\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "链接递归深度 %d 超过最大值 %d。\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "远程文件比本地文件 %s æ›´è€ -- ä¸èŽ·å–。\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr "远程文件较本地文件 %s æ–° -- 获å–。\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"文件大å°ä¸ç¬¦ (本地文件 %s) -- 获å–。\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "无效的符å·è¿žæŽ¥å,跳过。\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"å·²ç»å­˜åœ¨æ­£ç¡®çš„符å·è¿žæŽ¥ %s -> %s\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "正在创建符å·é“¾æŽ¥ %s -> %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "ä¸æ”¯æŒç¬¦å·è¿žæŽ¥ï¼Œæ­£åœ¨è·³è¿‡ç¬¦å·è¿žæŽ¥ %s。\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "正在跳过目录 %s。\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s:未知的/ä¸æ”¯æŒçš„文件类型。\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "无法设定 %s çš„æƒé™\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s:错误的时间戳标记。\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "因为目录深度为 %d (最大值为 %d),所以ä¸èŽ·å–目录。\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "ä¸è¿›å…¥ %s 目录因为其已被排除或未被包å«è¿›æ¥ã€‚\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "æ‹’ç» %s。\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "æ‹’ç» %s(无效æ¡ç›®ï¼‰ã€‚\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s 因正则表达å¼è€Œè¢«æŽ’除/未被包å«ã€‚\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "%s å’Œ %s 匹é…错误: %s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "æ²¡æœ‰ä¸Žæ¨¡å¼ %s 相符åˆçš„。\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "å·²ç»å°† HTML æ ¼å¼çš„索引写入到 %s [%s]。\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "å·²ç»å°† HTML æ ¼å¼çš„索引写入到 %s。\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "错误:无法打开目录 %s。\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "错误:无法打开è¯ä¹¦ %s:(%d)。\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "已载入 CA è¯ä¹¦â€œ%sâ€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "错误:无法加载 CRL 文件‘%s’: (%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "已加载 CRL 文件‘%s’\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "错误:GnuTLS è¦æ±‚密钥和è¯ä¹¦å…·æœ‰ç›¸åŒçš„类型。\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "您的 OpenSSL 版本太旧,ä¸æ”¯æŒ TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS:未实现‘secure-protocol’选项值 %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "请将此问题报告到 bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS:未实现‘secure-protocol’选项值 %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr "GnuTLS:无法直接设置优先级字符串。回退到使用默认优先级。\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "错误"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "警告"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s: %s 未æ出è¯ä¹¦ã€‚\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s: %s çš„è¯ä¹¦ä¸å¯ä¿¡ã€‚\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s: %s çš„è¯ä¹¦é¢å‘者未知。\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s: %s çš„è¯ä¹¦å·²ç»è¿‡æœŸã€‚\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s: è¯ä¹¦ %s çš„ç­¾å‘者ä¸æ˜¯ä¸€ä¸ª CA。\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s: %s çš„è¯ä¹¦ä½¿ç”¨ä¸å®‰å…¨çš„算法签å。\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s: %s çš„è¯ä¹¦è¿˜æœªç”Ÿæ•ˆã€‚\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s: %s çš„è¯ä¹¦å·²ç»è¿‡æœŸã€‚\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "åˆå§‹åŒ– X509 è¯ä¹¦é”™è¯¯: %s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "未找到è¯ä¹¦\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "解æžè¯ä¹¦æ—¶å‘生错误: %s。\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "è¯ä¹¦è¿˜æœªæ¿€æ´»\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "è¯ä¹¦å·²ç»è¿‡æœŸ\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "è¯ä¹¦æ‰€æœ‰è€…与主机å %s ä¸ç¬¦\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "公钥与固定的公钥ä¸åŒ¹é…ï¼\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "è¯ä¹¦å¿…须是 X.509 æ ¼å¼\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "处ç†åœ°å€åˆ—表时出错。\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "未知的主机"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "å字解æžæ—¶æœ‰ä¸´æ—¶é”™è¯¯"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "未知错误"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "正在解æžä¸»æœº %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "失败:主机没有 IPv4/IPv6 地å€ã€‚\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "失败:超时。\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s:无法解æžä¸å®Œæ•´çš„链接 %s。\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr "没有在 %s 找到跟éšå±žæ€§ã€‚å°†ä¸ä¼šè·Ÿéšé¡µé¢ä¸Šçš„任何链接\n"
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s:无效的 URL %s: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "无法写入 HTTP 请求:%s。\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "没有 HTTP 头,å‡å®šä¸º HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"文件 %s å·²ç»å­˜åœ¨ï¼›ä¸èŽ·å–。\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime 失败。这å¯èƒ½æ˜¯ä¸€ä¸ª bug。\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr "ä¸èƒ½è½¬æ¢ä¸º http æ ¼å¼çš„时间戳。将最åŽä¿®æ”¹æ—¶é—´å›žè½åˆ° 0。\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "缺少 BODY æ•°æ®æ–‡ä»¶ %s: %s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "é‡ç”¨å·²æœ‰çš„的到 [%s]:%d 的连接\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "å†æ¬¡ä½¿ç”¨å­˜åœ¨çš„到 %s:%d 的连接。\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "无法读å–代ç†å“应:%s\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s 错误 %d:%s。\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ä¸æ­£å¸¸çš„状æ€è¡Œ"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "代ç†æ¸ é“错误: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "未知的验è¯æ–¹å¼ã€‚\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "选定的验è¯æ–¹å¼ï¼š%s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "正在ä¿å­˜è‡³: %s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"当下载签å:\n"
+"%s: %s 时。\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "无法从临时文件读å–ç­¾å内容。跳过。\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "无法创建临时文件。跳过签å下载。\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "pri 值无效。å‡å®šä¸º %d。\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"无法为 Metalink 资æºæ‰¾åˆ°ä»»ä½•å¯æŽ¥å—的摘è¦ã€‚\n"
+"将忽略这些资æºã€‚\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "由于é­é‡é”™è¯¯ï¼Œå°†ç¦ç”¨ SSL。\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "å·²å‘出 %s 请求,正在等待回应... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "没有接收到数æ®ã€‚\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "读å–文件头错误 (%s)。\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(没有æè¿°)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "ä½ç½®ï¼š%s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "未指定"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [è·Ÿéšè‡³æ–°çš„ URL]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"文件 %s 在æœåŠ¡å™¨ä¸Šæœªè¢«æ›´æ”¹ã€‚忽略此下载。\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"æœåŠ¡å™¨å¿½ç•¥äº†æ–‡ä»¶ %s çš„ If-Modified-Since 文件头。\n"
+"你也许应该附加 --no-if-modified-since 选项。\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" 文件已下载完æˆï¼›ä¸ä¼šè¿›è¡Œä»»ä½•æ“作。\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "长度:"
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "已忽略"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "警告:HTTP ä¸æ”¯æŒé€šé…符。\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "打开 Spider 模å¼ã€‚检查是å¦å­˜åœ¨è¿œç¨‹æ–‡ä»¶ã€‚\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "无法写入 %s (%s)。\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "接收的å“应头中缺少必è¦çš„属性。\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "用户å/密ç è®¤è¯å¤±è´¥ã€‚\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "无法写入 WARC 文件。\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "无法写入临时 WARC 文件。\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "无法建立 SSL 连接。\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "无法清除 %s 的链接 (%s)。\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "错误:é‡å®šå‘ (%d) 但没有指定ä½ç½®ã€‚\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr "无法从 HTTP å“应中找到 Metalink æ•°æ®ã€‚使用 HTTP GET 下载文件。\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "å‘现 Metalink å“应头。将切æ¢åˆ° Metalink 模å¼ã€‚\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "远程文件ä¸å­˜åœ¨ -- 链接失效ï¼ï¼ï¼\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "缺少“Last-modifiedâ€æ–‡ä»¶å¤´ -- 关闭时间戳标记。\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "无效的“Last-modifiedâ€æ–‡ä»¶å¤´ -- 忽略时间戳标记。\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"远程文件比本地文件 %s æ›´è€ -- ä¸èŽ·å–。\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "文件大å°ä¸ç¬¦ (本地文件 %s) -- 获å–。\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "远程文件较新,获å–。\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"存在远程文件且å¯èƒ½å«æœ‰åˆ°å…¶å®ƒèµ„æºçš„链接 -- 获å–。\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"存在远程文件但ä¸å«ä»»ä½•é“¾æŽ¥ -- 无法获å–。\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"存在远程文件且该文件å¯èƒ½å«æœ‰æ›´æ·±å±‚的链接,\n"
+"但ä¸èƒ½è¿›è¡Œé€’å½’æ“作 -- 无法获å–。\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"存在远程文件。\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL: %s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 已写入至标准输出 %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - å·²ä¿å­˜ %s [%s/%s])\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - 在 %s 字节处连接关闭。"
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - 在 %s 字节处å‘生读å–错误 (%s)。"
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - 在 %s/%s 字节处å‘生读å–错误 (%s)。"
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "ä¸æ”¯æŒçš„ä¿æŠ¤è´¨é‡ '%s'。\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "ä¸æ”¯æŒçš„算法‘%s’。\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC æŒ‡å‘ %s,但它因为错误而无法访问:%s。\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%sï¼šæ— æ³•è¯»å– %s (%s)。\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%1$s:错误å‘生于第 %3$d 行的 %2$s。\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%1$s: 第 %3$d 行的 %2$s 处å‘生语法错误。\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%1$s: 未知的命令 %2$s 在第 %4$d 行 %3$s 处。\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"解æžç³»ç»Ÿ wgetrc 文件(env SYSTEM_WGETRC)失败。请检查\n"
+"'%s',\n"
+"或使用 --config å‚数指定å¦ä¸€ä¸ªé…置文件。\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"解æžç³»ç»Ÿ wgetrc 文件失败。请检查\n"
+"'%s',\n"
+"或使用 --config å‚数指定å¦ä¸€ä¸ªé…置文件。\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s:警告:系统与用户的 wgetrc éƒ½æŒ‡å‘ %s。\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s:无效的 --execute 命令 %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr "%s:%s:无效的布尔值 %s;请使用“onâ€æˆ–“offâ€ã€‚\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s:%s:无效的 %s;请使用“onâ€ã€â€œoffâ€æˆ–“quietâ€ã€‚\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s:%s:无效数字 %s。\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s: %s åªèƒ½å•æ¬¡ä½¿ç”¨\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s:%s:无效的字节数值 %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s:%s:无效的时间周期 %s\n"
+
+#: src/init.c:1443
+#, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s:%s:负的时间周期 %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass 功能需è¦å¾—到一个字符串å‚数,或是è¦æ±‚环境å˜é‡ WGET_ASKPASS 或 "
+"SSH_ASKPASS 被设置。\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s:%s:无效的值 %s。\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s:%s:无效的文件头 %s。\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s:%s:无效的 WARC 头 %s。\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s:%sï¼šæ— æ•ˆçš„è¿›åº¦æŒ‡ç¤ºæ–¹å¼ %s。\n"
+
+# 对应å‚数是逗å·åˆ†éš”的一个列表,ä¸è¦å˜æˆé¡¿å·ã€‚
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s:%s:无效的é™å®šé¡¹ %s,\n"
+" 请使用 [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii]。\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "ç¼–ç  %s 无效\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "ä¸æ”¯æŒä»Ž %s 转æ¢ä¸º %s\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "出现ä¸å®Œæ•´æˆ–无效的多字节åºåˆ—\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "无法处ç†çš„错误 %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8: locale 未设定\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode 错误 (%d): %s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "无法转为å°å†™ï¼š%d:%s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"正在把输出é‡å®šå‘至 %s。\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s:%sï¼›ç¦ç”¨æ—¥å¿—记录。\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "用法: %s [选项]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"长选项所必须的å‚数在使用短选项时也是必须的。\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "å¯åŠ¨ï¼š\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version 显示 Wget 的版本信æ¯å¹¶é€€å‡º\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help 打å°æ­¤å¸®åŠ©\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background å¯åŠ¨åŽè½¬å…¥åŽå°\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=命令 è¿è¡Œä¸€ä¸ªâ€œ.wgetrcâ€é£Žæ ¼çš„命令\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "日志和输入文件:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=文件 将日志信æ¯å†™å…¥ FILE\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=文件 将信æ¯æ·»åŠ è‡³ FILE\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug 打å°å¤§é‡è°ƒè¯•ä¿¡æ¯\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug æ‰“å° Watt-32 调试信æ¯\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet 安é™æ¨¡å¼ (æ— ä¿¡æ¯è¾“出)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose 详尽的输出 (此为默认值)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr " -nv, --no-verbose 关闭详尽输出,但ä¸è¿›å…¥å®‰é™æ¨¡å¼\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=类型 以 <类型> 报告带宽。类型å¯ä»¥æ˜¯ bits\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr " -i, --input-file=文件 下载本地或外部 <文件> 中的 URL\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr " --input-metalink=文件 下载本地 Metalink <文件> 中的文件\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html æŠŠè¾“å…¥æ–‡ä»¶å½“æˆ HTML 文件\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL 解æžç›¸å¯¹äºŽ URL çš„ HTML 输入文件链接 (-i -"
+"F)\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=文件 指定è¦ä½¿ç”¨çš„é…置文件\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-cookies ä¸è¯»å–任何é…置文件\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " --rejected-log=文件 å°†æ‹’ç» URL 的原因写入 <文件>。\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "下载:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr ""
+" -t, --tries=æ•°å­— 设置é‡è¯•æ¬¡æ•°ä¸º <æ•°å­—> (0 代表无é™åˆ¶)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr " --retry-connrefused å³ä½¿æ‹’ç»è¿žæŽ¥ä¹Ÿæ˜¯é‡è¯•\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=ERRORS æ供以逗å·åˆ†éš”的列表,列出é‡åˆ°æ—¶è¿›è¡Œé‡"
+"试的 HTTP 错误\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O, --output-document=文件 将文档写入 FILE\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr " -nc, --no-clobber ä¸è¦ä¸‹è½½å·²å­˜åœ¨å°†è¢«è¦†ç›–的文件\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-netrc ä¸è¦å°è¯•ä»Ž .netrc 获å–凭æ®\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr " -c, --continue 断点续传下载文件\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr " --start-pos=åç§»é‡ ä»Žç”±é›¶è®¡æ•°çš„ <å移é‡> 开始下载\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=类型 选择进度æ¡ç±»åž‹\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress 在任æ„啰嗦状æ€ä¸‹éƒ½æ˜¾ç¤ºè¿›åº¦æ¡\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr " -N, --timestamping åªèŽ·å–比本地文件新的文件\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ä¸è¦åœ¨æ—¶é—´æˆ³ (timestamping) 模å¼ä¸‹ä½¿ç”¨\n"
+" if-modified-since get æ¡ä»¶è¯·æ±‚\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ä¸ç”¨æœåŠ¡å™¨ä¸Šçš„时间戳æ¥è®¾ç½®æœ¬åœ°æ–‡ä»¶\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response 打å°æœåŠ¡å™¨å“应\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ä¸ä¸‹è½½ä»»ä½•æ–‡ä»¶\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=SECONDS 将所有超时设为 SECONDS 秒\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=åœ°å€ æŒ‡å®šè¯·æ±‚çš„ DNS æœåŠ¡å™¨åˆ—表(逗å·åˆ†éš”)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=åœ°å€ å°† DNS 解æžå™¨ç»‘定至本地主机上的<地å€> (主"
+"机å或 IP)\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr " --dns-timeout=SECS 设置 DNS 查寻超时为 SECS 秒\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=SECS 设置连接超时为 SECS 秒\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=SECS 设置读å–超时为 SECS 秒\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=SECONDS 等待间隔为 SECONDS 秒\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --waitretry=SECONDS 在获å–文件的é‡è¯•æœŸé—´ç­‰å¾… 1..SECONDS 秒\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait 获å–多个文件时,æ¯æ¬¡éšæœºç­‰å¾…é—´éš” "
+"(0.5~1.5)*WAIT 秒\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy ç¦æ­¢ä½¿ç”¨ä»£ç†\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=æ•°å­— 设置获å–é…é¢ä¸º <æ•°å­—> 字节\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ADDRESS 绑定至本地主机上的 ADDRESS (主机å或是 "
+"IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=RATE é™åˆ¶ä¸‹è½½é€ŸçŽ‡ä¸º RATE\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache 关闭 DNS 查询缓存\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=系统 é™å®šæ–‡ä»¶å中的字符为 <系统> å…许的字符\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr " --ignore-case 匹é…文件/目录时忽略大å°å†™\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only 仅连接至 IPv4 地å€\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only 仅连接至 IPv6 地å€\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=地å€æ— 首先连接至指定家æ—(IPv6,IPv4 或 none)的"
+"地å€\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=用户 å°† ftp å’Œ http 的用户åå‡è®¾ç½®ä¸º <用户>\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr ""
+" --password=å¯†ç  å°† ftp å’Œ http 的密ç å‡è®¾ç½®ä¸º <密ç >\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password æ示输入密ç \n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=命令 指定用于请求用户å和密ç çš„凭æ®ç®¡ç†å™¨ã€‚\n"
+" 如果没有æ供指定命令,程åºå°†ä½¿ç”¨ "
+"WGET_ASKPASS 或\n"
+" SSH_ASKPASS 环境å˜é‡ã€‚\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri 关闭 IRI 支æŒ\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC 使用 ENC 作为 IRI (国际化资æºæ ‡è¯†ç¬¦) 的本"
+"地编ç \n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr " --remote-encoding=ENC 使用 ENC 作为默认远程编ç \n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink 覆盖å‰ç§»é™¤æ–‡ä»¶\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash ä¿ç•™æ ¡éªŒå’Œä¸æ­£ç¡®çš„文件(附加åŽç¼€ ."
+"badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ç¼–å· NUMBER\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http 使用æ¥è‡ª HTTP å“应头的 Metalink 元数æ®\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr " --preferred-location Metalink 资æºçš„首选ä½ç½®\n"
+
+#: src/main.c:759
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr " --xattr 在文件的拓展属性中储存元数æ®\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "目录:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ä¸åˆ›å»ºç›®å½•\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories 强制创建目录\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ä¸è¦åˆ›å»ºä¸» (host) 目录\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories 在目录中使用åè®®å称\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=å‰ç¼€ ä¿å­˜æ–‡ä»¶åˆ° <å‰ç¼€>/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr " --cut-dirs=数字 忽略远程目录中 <数字> 个目录层。\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP 选项:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=用户 设置 http 用户å为 <用户>\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=å¯†ç  è®¾ç½® http 密ç ä¸º <密ç >\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache ä¸ä½¿ç”¨æœåŠ¡å™¨ç¼“存的数æ®ã€‚\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr " --default-page=NAME 改å˜é»˜è®¤é¡µ (通常是“index.htmlâ€)。\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr " -E, --adjust-extension 以åˆé€‚的扩展åä¿å­˜ HTML/CSS 文档\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length 忽略头部的‘Content-Length’区域\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=字符串 在头部æ’å…¥ <字符串>\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=类型 选择压缩类型,值å¯ä»¥ä¸º autoã€gzip å’Œ "
+"none。(默认:none)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr " --max-redirect æ¯é¡µæ‰€å…许的最大é‡å®šå‘\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr " --proxy-user=用户 使用 <用户> 作为代ç†ç”¨æˆ·å\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=å¯†ç  ä½¿ç”¨ <密ç > 作为代ç†å¯†ç \n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr " --referer=URL 在 HTTP 请求头包å«â€˜Referer: URL’\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers å°† HTTP 头ä¿å­˜è‡³æ–‡ä»¶ã€‚\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr ""
+" -U, --user-agent=ä»£ç† æ ‡è¯†è‡ªå·±ä¸º <代ç†> 而ä¸æ˜¯ Wget/VERSION。\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr " --no-http-keep-alive ç¦ç”¨ HTTP keep-alive (æŒä¹…连接)。\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ä¸ä½¿ç”¨ cookies。\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr ""
+" --load-cookies=文件 会è¯å¼€å§‹å‰ä»Ž <文件> 中载入 cookies。\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=文件 会è¯ç»“æŸåŽä¿å­˜ cookies 至 FILE。\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr " --keep-session-cookies 载入并ä¿å­˜ä¼šè¯ (éžæ°¸ä¹…) cookies。\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr ""
+" --post-data=字符串 使用 POST æ–¹å¼ï¼›æŠŠ <字串>作为数æ®å‘é€ã€‚\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr ""
+" --post-file=文件 使用 POST æ–¹å¼ï¼›å‘é€ <文件> 内容。\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=HTTP方法 在请求中使用指定的 <HTTP 方法>。\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --post-data=字符串 把 <字串> 作为数æ®å‘é€ï¼Œå¿…须设置 --"
+"method\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --post-file=文件 å‘é€ <文件> 内容,必须设置 --method\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition 当选择本地文件åæ—¶å…许 Content-"
+"Disposition\n"
+" 头部 (实验中)。\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr " --content-on-error 在æœåŠ¡å™¨é”™è¯¯æ—¶è¾“出接收到的内容\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge ä¸å…ˆç­‰å¾…æœåŠ¡å™¨è¯¢é—®å°±å‘é€åŸºæœ¬ HTTP 验è¯ä¿¡"
+"æ¯ã€‚\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) 选项:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR 选择安全å议,值å¯ä»¥æ˜¯ autoã€SSLv2ã€\n"
+" SSLv3ã€TLSv1ã€TLSv1_1ã€TLSv1_2 或 PFS\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only åªè·Ÿéšå®‰å…¨çš„ HTTPS 链接\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate ä¸è¦éªŒè¯æœåŠ¡å™¨çš„è¯ä¹¦ã€‚\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=文件 客户端è¯ä¹¦æ–‡ä»¶ã€‚\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr " --certificate-type=类型 客户端è¯ä¹¦ç±»åž‹ï¼ŒPEM 或 DER。\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --private-key=文件 ç§é’¥æ–‡ä»¶ã€‚\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=类型 ç§é’¥æ–‡ä»¶ç±»åž‹ï¼ŒPEM 或 DER。\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr " --ca-certificate=文件 带有一组 CA è¯ä¹¦çš„文件。\n"
+
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr " --ca-directory=DIR ä¿å­˜ CA è¯ä¹¦çš„哈希列表的目录。\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr " --ca-certificate=文件 带有一组 CA è¯ä¹¦çš„文件。\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=文件/散列值 用于验è¯èŠ‚点的公钥(PEM/DER)文件或\n"
+" 任何数é‡çš„ sha256 散列值,以 base64 ç¼–"
+"ç ã€\n"
+" “sha256//†开头ã€ç”¨â€œ;â€é—´éš”\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=文件 用于åˆå§‹åŒ– SSL 伪éšæœºæ•°ç”Ÿæˆå™¨ï¼ˆPRNG)的文"
+"件,\n"
+" 应å«æœ‰éšæœºæ•°æ®\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=文件 用于命å带有éšæœºæ•°æ®çš„ EGD 套接字的文"
+"件。\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR 直接设置 priority string (GnuTLS) 或 cipher "
+"list string (OpenSSL)。\n"
+" 请å°å¿ƒä½¿ç”¨ã€‚该选项会覆盖 --secure-"
+"protocol。\n"
+" 其具体格å¼å’Œå­—符串语法å–决于对应的 SSL/"
+"TLS 引擎。\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS 选项:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts ç¦ç”¨ HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr " --hsts-file HSTS æ•°æ®åº“路径(将覆盖默认值)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP 选项:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf 对所有二进制 FTP 文件使用 Stream_LF æ ¼å¼\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=用户 设置 ftp 用户å为 <用户>。\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=å¯†ç  è®¾ç½® ftp 密ç ä¸º <密ç >\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ä¸è¦åˆ é™¤â€˜.listing’文件\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob ä¸åœ¨ FTP 文件å中使用通é…符展开\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp ç¦ç”¨â€œpassiveâ€ä¼ è¾“模å¼\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions ä¿ç•™è¿œç¨‹æ–‡ä»¶çš„æƒé™\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks 递归目录时,获å–链接的文件 (而éžç›®å½•)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS 选项:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr " --ftps-implicit 使用éšå¼ FTPSï¼ˆé»˜è®¤ç«¯å£ 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl 打开数æ®è¿žæŽ¥æ—¶ç»§ç»­æŽ§åˆ¶è¿žæŽ¥ä¸­çš„ SSL/"
+"TLS 会è¯\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection åªåŠ å¯†æŽ§åˆ¶ä¿¡é“;数æ®ä¼ è¾“使用明文\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp 回è½åˆ° FTP,如果目标æœåŠ¡å™¨ä¸æ”¯æŒ "
+"FTPS\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC 选项:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=文件å 在一个 .warc.gz 文件里ä¿æŒè¯·æ±‚/å“应数æ®\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=字符串 在头部æ’å…¥ <字符串>\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=数字 将 WARC 的最大尺寸设置为 <数字>\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx 写入 CDX 索引文件\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr " --warc-dedup=文件å ä¸è¦è®°å½•åˆ—在此 CDX 文件内的记录\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression ä¸è¦ GZIP 压缩 WARC 文件\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ä¸è¦è®¡ç®— SHA1 摘è¦\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr " --no-warc-keep-log ä¸è¦åœ¨ WARC 记录中存储日志文件\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr " --warc-tempdir=目录 WARC 写入器的临时文件目录\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "递归下载:\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive 指定递归下载\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr ""
+" -l, --level=æ•°å­— 最大递归深度 (inf 或 0 代表无é™åˆ¶ï¼Œå³å…¨éƒ¨"
+"下载)。\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after 下载完æˆåŽåˆ é™¤æœ¬åœ°æ–‡ä»¶\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links 让下载得到的 HTML 或 CSS 中的链接指å‘本地"
+"文件\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only åªè½¬æ¢ URL 的文件部分(一般å«åšâ€œåŸºç¡€åâ€/"
+"basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N 写入文件 X å‰ï¼Œè½®æ¢ç§»åŠ¨æœ€å¤š N 个备份文件\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr ""
+" -K, --backup-converted 在转æ¢æ–‡ä»¶ X å‰å…ˆå°†å®ƒå¤‡ä»½ä¸º X_orig。\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr ""
+" -K, --backup-converted 在转æ¢æ–‡ä»¶ X å‰å…ˆå°†å®ƒå¤‡ä»½ä¸º X.orig。\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror -N -r -l inf --no-remove-listing 的缩写形"
+"å¼ã€‚\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites 下载所有用于显示 HTML 页é¢çš„图片之类的元"
+"素。\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr ""
+" --strict-comments ç”¨ä¸¥æ ¼æ–¹å¼ (SGML) å¤„ç† HTML 注释。\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "递归接å—/æ‹’ç»ï¼š\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr " -A, --accept=列表 逗å·åˆ†éš”çš„å¯æŽ¥å—的扩展å列表\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr " -R, --reject=列表 逗å·åˆ†éš”çš„è¦æ‹’ç»çš„扩展å列表\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr " --accept-regex=REGEX 匹é…接å—çš„ URL 的正则表达å¼\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGEX 匹é…æ‹’ç»çš„ URL 的正则表达å¼\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=类型 正则类型 (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=类型 正则类型 (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr " -D, --domains=列表 逗å·åˆ†éš”çš„å¯æŽ¥å—的域å列表\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr " --exclude-domains=列表 逗å·åˆ†éš”çš„è¦æ‹’ç»çš„域å列表\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr " --follow-ftp 跟踪 HTML 文档中的 FTP 链接\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr " --follow-tags=列表 逗å·åˆ†éš”的跟踪的 HTML 标识列表\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr " --ignore-tags=列表 逗å·åˆ†éš”的忽略的 HTML 标识列表\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr " -H, --span-hosts 递归时转å‘外部主机\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative 仅跟踪相对链接\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=列表 å…许目录的列表\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr ""
+" --trust-server-names 使用é‡å®šå‘ URL 的最åŽä¸€æ®µä½œä¸ºæœ¬åœ°æ–‡ä»¶å\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=列表 排除目录的列表\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ä¸è¿½æº¯è‡³çˆ¶ç›®å½•\n"
+
+#: src/main.c:1031
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"请将问题报告和讨论内容电å­é‚®ä»¶å‘é€è‡³ <bug-wget@gnu.org>\n"
+"和/或在 https://savannah.gnu.org/bugs/?func=additem&group=wget 开 issue 进行"
+"讨论。\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s,éžäº¤äº’å¼çš„网络文件下载工具。\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "用户 %s 的密ç : "
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "密ç : "
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "无法创建管é“\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "为 use-askpass åˆå§‹åŒ–生æˆæ–‡ä»¶åŠ¨ä½œå‡ºé”™ï¼š%d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "为 use-askpass 设置生æˆæ–‡ä»¶åŠ¨ä½œå‡ºé”™ï¼š%d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "读å–命令“%s %sâ€çš„å“应时出错:%s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "“%s%sâ€çš„用户å:"
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "%s%s@%s 的密ç ï¼š"
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc: "
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "语区: "
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "编译: "
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "链接: "
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s 在 %s 上编译。\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (环境)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (用户)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (系统)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "Copyright © %s Free Software Foundation, Inc.\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"æŽˆæƒ GPLv3+: GNU GPL 第三版或更高版本\n"
+"<http://www.gnu.org/licenses/gpl.html>。\n"
+"这是自由软件:您å¯ä»¥è‡ªç”±åœ°æ›´æ”¹å¹¶é‡æ–°åˆ†å‘它。\n"
+"在法律所å…许的范围内,没有任何担ä¿ã€‚\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"最åˆç”± Hrvoje NikÅ¡ić <hniksic@xemacs.org> 编写。\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "请将错误报告或建议寄给 <bug-wget@gnu.org>。\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "内存分é…问题\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "由于 %s 出错退出\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "请å°è¯•ä½¿ç”¨â€œ%s --helpâ€æŸ¥çœ‹æ›´å¤šçš„选项。\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s:éžæ³•çš„选项 -- “-n%câ€\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "未编译调试支æŒï¼Œå¿½ç•¥ --debug。\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"åŒæ—¶æŒ‡å®šäº† --no-clobber åŠ --convert-links å‚数,将使用 --convert-links\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr "åŒæ—¶æŒ‡å®šäº† --no-clobber åŠ --convert-file-only å‚数,将åªä½¿ç”¨åŽè€…\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "无法åŒæ—¶ä½¿ç”¨è¯¦ç»†è¾“出模å¼å’Œå®‰é™æ¨¡å¼ã€‚\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "无法修改时间戳标记而ä¸æ›´æ”¹æœ¬åœ°æ–‡ä»¶ã€‚\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "无法åŒæ—¶æŒ‡å®š --inet4-only å’Œ --inet6-only。\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"如果给出了多个 URL 则无法åŒæ—¶æŒ‡å®š -k(或 --convert-file-only)和 -O 选项,也"
+"ä¸å¯ä»¥ä¸Ž -p 或 -r 选项\n"
+"结åˆä½¿ç”¨ã€‚å‚阅手册æ¥èŽ·å–详细信æ¯ã€‚\n"
+"\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"警告: å°† -O 与 -r 或 -p 选项结åˆä½¿ç”¨æ„味ç€æ‰€æœ‰ä¸‹è½½æ¥çš„内容\n"
+"会被放入您指定的那个å•ä¸€æ–‡ä»¶ã€‚\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"警告: 时间戳与 -O 结åˆä½¿ç”¨æ²¡æœ‰ä»»ä½•æ•ˆæžœã€‚\n"
+"å‚阅手册æ¥èŽ·å–详细信æ¯ã€‚\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr "WARC 输出ä¸èƒ½å’Œ --no-clobber åŒæ—¶å·¥ä½œï¼ŒåŽè€…将被ç¦ç”¨ã€‚\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "WARC 输出ä¸èƒ½å’Œæ—¶é—´æˆ³æ¨¡å¼ (timestamping) åŒæ—¶å·¥ä½œï¼ŒåŽè€…将被ç¦ç”¨ã€‚\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC 输出ä¸èƒ½å’Œ --spider åŒæ—¶å·¥ä½œã€‚\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr "WARC 输出ä¸èƒ½å’Œ --continue 或 --start-pos åŒæ—¶å·¥ä½œï¼ŒåŽè€…将被ç¦ç”¨ã€‚\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr "å·²ç¦ç”¨æ‘˜è¦ï¼›WARC 去é‡å°†ä¸æŸ¥æ‰¾é‡å¤è®°å½•ã€‚\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr "压缩ä¸èƒ½å’Œ --continue 或 --start-pos åŒæ—¶å·¥ä½œï¼ŒåŽè€…将被ç¦ç”¨ã€‚\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "无法åŒæ—¶æŒ‡å®š --ask-password å’Œ --password。\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr ""
+"ä¸æŽ¨èåŒæ—¶æŒ‡å®š --start-pos åŠ --continue å‚数;将ç¦ç”¨ --continue å‚数。\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s:未指定 URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "无法åŒæ—¶æŒ‡å®š --post-data å’Œ --post-file。\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"--post-data åŠ --post-file å‚æ•°ä¸èƒ½ä¸Ž --method 一起使用。--method 期望从 --"
+"body-data åŠ --body-file å‚数获å–æ•°æ®\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"使用 --body-data 或 --body-file å‚数时必须通过 --method=HTTPMethod 指定一个传"
+"输方å¼ã€‚\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "无法åŒæ—¶æŒ‡å®š --body-data å’Œ --body-file。\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "此版本ä¸æ”¯æŒ IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr "-k 或 -r åªæœ‰åœ¨è¾“出至普通文件的时候æ‰å¯ä»¥ä¸Ž -O 共用。\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"--convert-links 或 --convert-file-only åªæœ‰åœ¨è¾“出至普通文件时æ‰å¯å…±ç”¨ã€‚\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "未能åˆå§‹åŒ– libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "未能åˆå§‹åŒ– c-ares ä¿¡é“\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "æ— æ³•è§£æž IP 地å€â€œ%sâ€\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "错误:未能设置 DNS æœåŠ¡å™¨â€œ%sâ€ï¼ˆ%d)。\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "在 %s 中找ä¸åˆ° URL。\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "æ— æ³•è§£æž metalink 文件 %s。\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "无法从 %s 下载所有资æºã€‚\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"下载完毕 --%1$s--\n"
+"总用时:%2$s\n"
+"下载了:%3$d 个文件,%5$s (%6$s) 中的 %4$s\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "超过下载é™é¢ (%s 字节)ï¼\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "-O ä¸å¯ç”¨äºŽ metalink 下载。忽略此å‚数。\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "计划的 metalink 文件:%s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "安全的 metalink 文件:%s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "æ‹’ç» metalink 文件。ä¸å®‰å…¨çš„å称。\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "æ­£åœ¨å¤„ç† metaurl %s……\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr "æ‹’ç» metaurl 文件 %s。ä¸å®‰å…¨çš„å称。\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "下载 %s 失败。将跳过该 metaurl。\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "æ— æ³•è§£æž metaurl 文件 %s。\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Metaurl 处ç†è¿”回了错误。\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "ä¸æ”¯æŒèµ„æºç±»åž‹ %s,将忽略此项……\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "无法打开已下载的文件。\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "计算 %s 的大å°\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "未声明文件大å°ã€‚跳过检查。\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "无法得知已下载文件的大å°ã€‚\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "文件 %s 大å°ä¸åŒ¹é…。\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "大å°åŒ¹é…。\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "计算 %s 的校验和\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "校验和匹é…。\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "文件 %s 校验和ä¸åŒ¹é…。\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "无法打开下载完æˆçš„文件以进行签å校验。\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "ç­¾å验è¯æˆåŠŸã€‚\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "无效签å。将拒ç»æ­¤èµ„æºã€‚\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "æ•°æ®ä¸Žç­¾å相符,但签å未被信任。\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "未找到校验和。\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "下载 %s 失败。将跳过该资æºã€‚\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "已接收文件 %s,但大å°ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "已接收文件 %s,但校验值ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "已接收文件 %s,但签åä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "正在将 %s é‡å‘½å为 %s。\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "继续在åŽå°è¿è¡Œã€‚\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "继续在åŽå°è¿è¡Œï¼Œpid 为 %lu。\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "将把输出写入至 %s。\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() 失败\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() 失败\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s:找ä¸åˆ°å¯ç”¨çš„ socket 驱动程åºã€‚\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "调用 ioctl() 失败。套接字ä¸å¯è®¾ä¸ºé˜»å¡žï¼ˆblocking)状æ€ã€‚\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s:%s:%d:警告: %s 标记出现在机器å称å‰\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s:%s:%d:未知的标记“%sâ€\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "用法:%s NETRC [主机å]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s:无法 stat %s:%s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "警告: 正在使用一个弱å£ä»¤çš„éšæœºç§å­ã€‚\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr "无法 seed PRNG;考虑使用 --random-file。\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "您的 OpenSSL 版本太旧,ä¸æ”¯æŒ TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "您的 OpenSSL 版本太旧,ä¸æ”¯æŒ TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "您的 OpenSSL 版本太旧,ä¸æ”¯æŒ TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL:未实现‘secure-protocol’选项值 %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL:无效的 cipher 列表:%s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr "OpenSSL:设置部分链的信任失败\n"
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr "OpenSSL:分é…验è¯å‚数失败\n"
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "警告:无法 seed PRNG;考虑使用 --random-file。\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s: æ— æ³•éªŒè¯ %s çš„ç”± %s é¢å‘çš„è¯ä¹¦:\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " 无法本地校验é¢å‘者的æƒé™ã€‚\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " 出现了自己签åçš„è¯ä¹¦ã€‚\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " é¢å‘çš„è¯ä¹¦è¿˜æœªç”Ÿæ•ˆã€‚\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " é¢å‘çš„è¯ä¹¦å·²ç»è¿‡æœŸã€‚\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s: 没有匹é…çš„è¯ä¹¦ä¸»ä½“别å (Subject Alternative Name)。\n"
+"\t请求的主机å为 %s。\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr " %s: è¯ä¹¦é€šç”¨å %s 与所è¦æ±‚的主机å %s ä¸ç¬¦ã€‚\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s: è¯ä¹¦é€šç”¨å无效 (包å«ç©ºå­—符)。\n"
+" è¿™å¯èƒ½æ„味ç€è¯¥ä¸»æœºæ‰€å£°ç§°çš„身份与实际ä¸ç¬¦ã€‚\n"
+" (也就是说,它ä¸æ˜¯çœŸæ­£çš„ %s)。\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "è¦ä»¥ä¸å®‰å…¨çš„æ–¹å¼è¿žæŽ¥è‡³ %s,使用“--no-check-certificateâ€ã€‚\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ 跳过 %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "æ— æ•ˆçš„è¿›åº¦æŒ‡ç¤ºæ–¹å¼ %sï¼›ä¸ä¼šæ”¹å˜åŽŸæ¥çš„æ–¹å¼ã€‚\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " 剩余 %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " 用时 "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "æ— æ³•èŽ·å– REALTIME 时钟频率: %s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "正在删除 %s 因它应该被指定为拒ç»ä¸‹è½½ã€‚\n"
+
+#: src/res.c:394
+#, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "无法打开 %s: %s\n"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "正在载入 robots.txt;请忽略错误消æ¯ã€‚\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "解æžä»£ç†æœåŠ¡å™¨ URL %s æ—¶å‘生错误:%s。\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "代ç†æœåŠ¡å™¨ URL %s 错误:必须是 HTTP。\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "已超过 %d 次é‡å®šå‘。\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"放弃æ“作。\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"é‡è¯•ä¸­ã€‚\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"未找到死链接。\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"找到 %d 个死链接。\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "没有错误"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "ä¸æ”¯æŒçš„å议类型 %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "地å€ç¼ºå°‘å议类型"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "无效的主机å"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "端å£å·é”™è¯¯"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "无效的用户å"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "未结æŸçš„ IPv6 数字地å€"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "ä¸æ”¯æŒ IPv6 地å€"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "无效的 IPv6 数字地å€"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "未将 HTTPS 支æŒç¼–译到程åºä¸­"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "出现无法转æ¢çš„多字节åºåˆ—\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s: %s: 无法分é…足够内存;内存耗尽。\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s: %s: æ— æ³•åˆ†é… %ld 字节;内存耗尽。\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s: aprintf: 文本缓冲区太大 (%d 字节),退出。\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "继续在åŽå°è¿è¡Œï¼Œpid 为 %d。\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "无法删除符å·é“¾æŽ¥ %s: %s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "Fopen 打开文件 %s 失败\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "无法获å–文件 %s 的文件æ述符\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "无法对文件 %s 进行 stat,(请检查æƒé™ï¼‰\n"
+
+#: src/utils.c:902
+#, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr "文件 %s 自上次检查åŽå·²æ”¹å˜ã€‚安全检查失败。\n"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "打开文件 %s 失败,原因:%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "无法对文件 %s 进行 stat,错误:%s\n"
+
+#: src/utils.c:953
+#, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr "å°è¯•æ‰“开文件 %s 但它自上次检查åŽå·²æ”¹å˜ã€‚安全检查失败。\n"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "æ— æ•ˆçš„æ­£åˆ™è¡¨è¾¾å¼ %s, PCRE2 错误 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "æ— æ•ˆçš„æ­£åˆ™è¡¨è¾¾å¼ %s, %s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "åŒ¹é… %s 出错: %d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "跳过大å°é”™è¯¯çš„ key(%d/%d):%s\n"
+
+#: src/warc.c:217
+msgid "Error setting WARC file position.\n"
+msgstr "设置 WARC 文件ä½ç½®å‡ºé”™ã€‚\n"
+
+#: src/warc.c:224
+msgid "Error flushing WARC file to disk.\n"
+msgstr "刷洗 WARC 文件至ç£ç›˜å‡ºé”™ã€‚\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "å¤åˆ¶ WARC 文件æ述符时出错。\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "从 GZIP æµæ‰“å¼€ WARC 文件失败。\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "å‘ WARC 文件写入 warcinfo 记录时å‘生错误。\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"正打开 WARC 文件 %s。\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "打开 WARC 文件 %s 出错。\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX æ–‡ä»¶æœªåˆ—å‡ºæº URL。(缺少列 'a')\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX 文件未列出校验值。(缺少列 'k')\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX 文件未列出记录 ID。(缺少列 'u')\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"从 CDX 加载了 %d 个记录。\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "æ— æ³•è¯»å– CDX 文件 %s 以供去é‡ã€‚\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "无法打开临时 WARC 清å•æ–‡ä»¶ã€‚\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "无法打开临时 WARC 日志文件。\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "无法打开 WARC 文件。\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "无法打开 CDX 文件以供输出。\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "无法打开临时 WARC 文件。\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr "从 CDX 文件å‘现了精确匹é…。正将é‡è®¿é—®è®°å½•ä¿å­˜åˆ° WARC。\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "未知的系统错误"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "主机å的地å€å®¶æ—ä¸è¢«æ”¯æŒ"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "错误的 ai_flags 值"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "å称解æžæ—¶å‡ºçŽ°ä¸å¯æ¢å¤çš„错误"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ä¸æ”¯æŒçš„ ai_family"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "内存分é…失败"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "没有与主机åå…³è”的地å€"
+
+#~ msgid "Name or service not known"
+#~ msgstr "å称或æœåŠ¡æœªçŸ¥"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "ai_socktype ä¸æ”¯æŒ Servname"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ä¸æ”¯æŒçš„ ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "系统错误"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "å‚数缓冲区太å°"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "正在处ç†è¯·æ±‚"
+
+#~ msgid "Request canceled"
+#~ msgstr "请求已å–消"
+
+#~ msgid "Request not canceled"
+#~ msgstr "请求未å–消"
+
+#~ msgid "All requests done"
+#~ msgstr "全部请求已完æˆ"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "被信å·ä¸­æ–­"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "å‚数字符串未正确编ç "
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s:选项“%s%sâ€æœ‰æ­§ä¹‰\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s:选项“%s%sâ€æœ‰æ­§ä¹‰ï¼›å¯èƒ½æ€§æœ‰ï¼š"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s:无法识别的选项“%s%sâ€\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s:选项“%s%sâ€ä¸å…许有å‚æ•°\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s:选项“%s%sâ€éœ€è¦å‚æ•°\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s:无效选项 -- %c\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s:选项需è¦å‚æ•° -- %c\n"
+
+#~ msgid "`"
+#~ msgstr "“"
+
+#~ msgid "'"
+#~ msgstr "â€"
+
+#~ msgid "Success"
+#~ msgstr "æˆåŠŸ"
+
+#~ msgid "No match"
+#~ msgstr "无匹é…"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "无效的正则表达å¼"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "无效的校勘字符"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "无效的字符类型å"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "末尾的åæ–œæ "
+
+#~ msgid "Invalid back reference"
+#~ msgstr "无效的åŽå‘引用"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "未匹é…çš„ [ã€[^ã€[:ã€[. 或 [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "未匹é…çš„( 或\\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "未匹é…çš„\\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "\\{\\} 中内容无效"
+
+#~ msgid "Invalid range end"
+#~ msgstr "无效的范围结æŸç¬¦"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "内存耗尽"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "无效的å‰ç½®æ­£åˆ™è¡¨è¾¾å¼"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "正则表达å¼å¼‚常结æŸ"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "正则表达å¼è¿‡é•¿"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "未匹é…çš„ ) 或 \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "缺少之å‰çš„正则表达å¼"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "无法创建管é“"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s å­è¿›ç¨‹å¤±è´¥"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle 失败"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "无法还原 fd %d: dup2 失败"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s å­è¿›ç¨‹"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s å­è¿›ç¨‹æ”¶åˆ°è‡´å‘½ä¿¡å· %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "内存耗尽"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr "请将错误报告ã€é—®é¢˜å’Œè®¨è®ºå¯„信至 <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s:选项“--%sâ€ä¸å…许有å‚æ•°\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s:无法识别的选项“--%sâ€\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s:选项“-W %sâ€ä¸æ˜Žç¡®\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s:选项“-W %sâ€ä¸å…许有å‚æ•°\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s:选项“%sâ€éœ€è¦å‚æ•°\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "文件“%sâ€å·²ç»å­˜åœ¨ï¼›ä¸èŽ·å–。\n"
+
+#~ msgid "Invalid UTF-8 sequence: %s\n"
+#~ msgstr "无效的 UTF-8 åºåˆ—: %s\n"
+
+#~ msgid "idn_decode failed (%d): %s\n"
+#~ msgstr "idn_decode 错误 (%d): %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "接收了 %s。\n"
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
new file mode 100644
index 0000000..2bc22ea
--- /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..aaef814
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,3515 @@
+# Traditional Chinese translation of wget.
+# Copyright (C) 1998, 2000, 01, 02, 05 Free Software Foundation, Inc.
+# This file is distributed under the same license as the wget package.
+# CD Chen <cdchen@linux.ntcic.edu.tw>, 1998.
+# Pofeng Lee <pofeng.lee@ms7.url.com.tw>, 1998.
+# Jing-Jong Shyue <shyue@sonoma.com.tw>, 2000.
+# Abel Cheung <abelcheung@gmail.com>, 2001-2002, 2005.
+# pan93412 <pan93412@gmail.com>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: wget 1.20\n"
+"Report-Msgid-Bugs-To: bug-wget@gnu.org\n"
+"POT-Creation-Date: 2020-12-31 16:55+0100\n"
+"PO-Revision-Date: 2018-11-17 14:02+0800\n"
+"Last-Translator: pan93412 <pan93412@gmail.com>\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-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/connect.c:201
+#, c-format
+msgid "%s: unable to resolve bind address %s; disabling bind.\n"
+msgstr "%sï¼šç„¡æ³•è§£æž bind ä½å€ %sï¼›é¸æ“‡åœç”¨ bind。\n"
+
+#: src/connect.c:282
+#, c-format
+msgid "Connecting to %s|%s|:%d... "
+msgstr "正在連接 %s|%s|:%d... "
+
+#: src/connect.c:290
+#, c-format
+msgid "Connecting to %s:%d... "
+msgstr "正在連接 %s:%d... "
+
+#: src/connect.c:293
+#, c-format
+msgid "Connecting to [%s]:%d... "
+msgstr "正在連線到 [%s]:%d…"
+
+#: src/connect.c:329
+#, c-format
+msgid "setsockopt SO_RCVBUF failed: %s\n"
+msgstr "setsockopt SO_RCVBUF 失敗:%s\n"
+
+#: src/connect.c:357
+msgid "connected.\n"
+msgstr "連上了。\n"
+
+#: src/connect.c:376 src/host.c:915 src/host.c:953
+#, c-format
+msgid "failed: %s.\n"
+msgstr "失敗: %s。\n"
+
+#: src/connect.c:400 src/http.c:2111
+#, c-format
+msgid "%s: unable to resolve host address %s\n"
+msgstr "%s:無法解æžä¸»æ©Ÿä½å€ %s\n"
+
+#: src/connect.c:470
+#, c-format
+msgid "setsockopt SO_REUSEADDR failed: %s\n"
+msgstr "setsockopt SO_REUSEADDR 失敗:%s\n"
+
+#: src/connect.c:694 src/connect.c:756
+#, c-format
+msgid "Too many fds open. Cannot use select on a fd >= %d\n"
+msgstr "é–‹å•ŸéŽå¤š fd。無法在 fd >= %d 的環境下使用 select\n"
+
+#: src/convert.c:201
+#, c-format
+msgid "Converted links in %d files in %s seconds.\n"
+msgstr "已在 %2$s 秒轉æ›å¥½ %1$d 個檔案中的連çµã€‚\n"
+
+#: src/convert.c:230
+#, c-format
+msgid "Converting links in %s... "
+msgstr "æ­£åœ¨è½‰æ› %s 中連çµâ€¦"
+
+#: src/convert.c:243
+msgid "nothing to do.\n"
+msgstr "ä¸éœ€é€²è¡Œä»»ä½•æ“作。\n"
+
+#: src/convert.c:246
+#, c-format
+msgid "%d.\n"
+msgstr ""
+
+#: src/convert.c:252 src/convert.c:276
+#, c-format
+msgid "Cannot convert links in %s: %s\n"
+msgstr "ç„¡æ³•è½‰æ› %s 中的éˆçµ: %s\n"
+
+#: src/convert.c:267
+#, c-format
+msgid "Unable to delete %s: %s\n"
+msgstr "無法刪除 %s:%s\n"
+
+#: src/convert.c:586
+#, c-format
+msgid "Cannot back up %s as %s: %s\n"
+msgstr "無法將 %s å‚™ä»½æˆ %s: %s\n"
+
+#: src/cookies.c:311
+#, c-format
+msgid "Unable to get cookie for %s\n"
+msgstr "無法å–å¾— %s çš„ cookie\n"
+
+#: src/cookies.c:464
+#, c-format
+msgid "Syntax error in Set-Cookie: %s at position %d.\n"
+msgstr "Set-Cookie 出ç¾èªžæ³•éŒ¯èª¤: 在 %2$d ä½ç½®çš„ %1$s。\n"
+
+#: src/cookies.c:777
+#, c-format
+msgid "Cookie coming from %s attempted to set domain to "
+msgstr "來自 %s 的 cookie 嘗試將網域設定為 "
+
+#: src/cookies.c:780 src/spider.c:94
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: src/cookies.c:1259 src/cookies.c:1380
+#, c-format
+msgid "Cannot open cookies file %s: %s\n"
+msgstr "無法開啟 cookie 檔案 %s:%s\n"
+
+#: src/cookies.c:1417
+#, c-format
+msgid "Error writing to %s: %s\n"
+msgstr "儲存到「%sã€æ™‚出錯:%s\n"
+
+#: src/cookies.c:1420
+#, c-format
+msgid "Error closing %s: %s\n"
+msgstr "關閉「%sã€æ™‚出錯:%s\n"
+
+#: src/ftp-ls.c:1045
+msgid "Unsupported listing type, trying Unix listing parser.\n"
+msgstr "使用了ä¸æ”¯æ´çš„檔案清單類型,å‡è¨­æ˜¯ Unix æ ¼å¼çš„清單來分æžã€‚\n"
+
+#: src/ftp-ls.c:1096 src/ftp-ls.c:1098
+#, c-format
+msgid "Index of /%s on %s:%d"
+msgstr "/%s 的索引,在 %s:%d"
+
+#: src/ftp-ls.c:1123
+#, c-format
+msgid "time unknown "
+msgstr "時間ä¸è©³ "
+
+#: src/ftp-ls.c:1127
+#, c-format
+msgid "File "
+msgstr "檔案 "
+
+#: src/ftp-ls.c:1130
+#, c-format
+msgid "Directory "
+msgstr "目錄 "
+
+#: src/ftp-ls.c:1133
+#, c-format
+msgid "Link "
+msgstr "éˆçµ "
+
+#: src/ftp-ls.c:1136
+#, c-format
+msgid "Not sure "
+msgstr "無法確定 "
+
+#: src/ftp-ls.c:1159
+#, c-format
+msgid " (%s bytes)"
+msgstr " (%s ä½å…ƒçµ„)"
+
+#: src/ftp.c:225
+#, c-format
+msgid "Length: %s"
+msgstr "長度: %s"
+
+#: src/ftp.c:231 src/http.c:4092
+#, c-format
+msgid ", %s (%s) remaining"
+msgstr ",剩餘 %s (%s)"
+
+#: src/ftp.c:235 src/http.c:4096
+#, c-format
+msgid ", %s remaining"
+msgstr ",剩餘 %s"
+
+#: src/ftp.c:238
+msgid " (unauthoritative)\n"
+msgstr " (éžæ­£å¼è³‡æ–™)\n"
+
+#: src/ftp.c:403
+#, fuzzy
+msgid "Could not initialize SSL. It will be disabled.\n"
+msgstr "無法åˆå§‹åŒ– SSL。將åœç”¨ SSL。"
+
+#: src/ftp.c:485
+#, c-format
+msgid "Logging in as %s ... "
+msgstr "以 %s 的身分登入... "
+
+#: src/ftp.c:504 src/ftp.c:590 src/ftp.c:657 src/ftp.c:722 src/ftp.c:963
+#: src/ftp.c:1019 src/ftp.c:1066 src/ftp.c:1129 src/ftp.c:1190 src/ftp.c:1288
+#: src/ftp.c:1338
+msgid "Error in server response, closing control connection.\n"
+msgstr "伺æœå™¨å›žæ‡‰è¨Šæ¯ç™¼ç”ŸéŒ¯èª¤ï¼Œæœƒé—œé–‰æŽ§åˆ¶é€£ç·šã€‚\n"
+
+#: src/ftp.c:511
+msgid "Error in server greeting.\n"
+msgstr "伺æœå™¨è¨Šæ¯å‡ºç¾éŒ¯èª¤ã€‚\n"
+
+#: src/ftp.c:518 src/ftp.c:730 src/ftp.c:971 src/ftp.c:1074 src/ftp.c:1139
+#: src/ftp.c:1200 src/ftp.c:1298 src/ftp.c:1348
+msgid "Write failed, closing control connection.\n"
+msgstr "無法寫入,會關閉控制連線。\n"
+
+#: src/ftp.c:524
+msgid "The server refuses login.\n"
+msgstr "伺æœå™¨æ‹’絕登入。\n"
+
+#: src/ftp.c:530
+msgid "Login incorrect.\n"
+msgstr "登入錯誤。\n"
+
+#: src/ftp.c:536
+msgid "Logged in!\n"
+msgstr "登入完æˆï¼\n"
+
+#: src/ftp.c:556
+msgid "Server did not accept the 'PBSZ 0' command.\n"
+msgstr "伺æœå™¨ä¸æŽ¥å—「PBSZ 0ã€æŒ‡ä»¤ã€‚\n"
+
+#: src/ftp.c:566
+#, c-format
+msgid "Server did not accept the 'PROT %c' command.\n"
+msgstr "伺æœå™¨ä¸æŽ¥å—「PROT %cã€æŒ‡ä»¤ã€‚\n"
+
+#: src/ftp.c:598
+msgid "Server error, can't determine system type.\n"
+msgstr "伺æœå™¨éŒ¯èª¤ï¼Œç„¡æ³•æ±ºå®šä½œæ¥­ç³»çµ±çš„類型。\n"
+
+#: src/ftp.c:607 src/ftp.c:1109 src/ftp.c:1173 src/ftp.c:1216
+msgid "done. "
+msgstr "完æˆã€‚ "
+
+#: src/ftp.c:710 src/ftp.c:989 src/ftp.c:1036 src/ftp.c:1318 src/ftp.c:1367
+msgid "done.\n"
+msgstr "完æˆã€‚\n"
+
+#: src/ftp.c:737
+#, c-format
+msgid "Unknown type `%c', closing control connection.\n"
+msgstr "類別 ‘%c’ ä¸è©³ï¼Œæœƒé—œé–‰æŽ§åˆ¶é€£ç·šã€‚\n"
+
+#: src/ftp.c:749
+msgid "done. "
+msgstr "完æˆã€‚ "
+
+#: src/ftp.c:755
+msgid "==> CWD not needed.\n"
+msgstr "==> ä¸éœ€è¦ CWD (切æ›è·¯å¾‘)。\n"
+
+#: src/ftp.c:946
+msgid "Logically impossible section reached in getftp()"
+msgstr "在 getftp() 中é”到é‚輯上ä¸å¯èƒ½çš„å€åŸŸ"
+
+#: src/ftp.c:947
+#, c-format
+msgid ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+msgstr ""
+"cwd_count: %d\n"
+"cwd_start: %d\n"
+"cwd_end: %d\n"
+
+#: src/ftp.c:977
+#, c-format
+msgid ""
+"No such directory %s.\n"
+"\n"
+msgstr ""
+"ä¸å­˜åœ¨çš„目錄「%sã€ã€‚\n"
+"\n"
+
+#: src/ftp.c:1001
+msgid "==> CWD not required.\n"
+msgstr "==> ä¸éœ€è¦ CWD (切æ›è·¯å¾‘)。\n"
+
+#: src/ftp.c:1044
+msgid "File has already been retrieved.\n"
+msgstr "檔案已接收。\n"
+
+#: src/ftp.c:1080
+msgid "Cannot initiate PASV transfer.\n"
+msgstr "無法åˆå§‹åŒ– PASV 檔案傳é€æ–¹å¼ã€‚\n"
+
+#: src/ftp.c:1084
+msgid "Cannot parse PASV response.\n"
+msgstr "ç„¡æ³•åˆ†æž PASV 回應訊æ¯ã€‚\n"
+
+#: src/ftp.c:1101
+#, c-format
+msgid "couldn't connect to %s port %d: %s\n"
+msgstr "無法連上 %s 的埠號 %d: %s\n"
+
+#: src/ftp.c:1155
+#, c-format
+msgid "Bind error (%s).\n"
+msgstr "Bind 發生錯誤(%s)。\n"
+
+#: src/ftp.c:1161
+msgid "Invalid PORT.\n"
+msgstr "PORT 指令無效。\n"
+
+#: src/ftp.c:1207
+msgid ""
+"\n"
+"REST failed, starting from scratch.\n"
+msgstr ""
+"\n"
+"é‡è¨­ (REST) 失敗,需è¦é‡æ–°é–‹å§‹å‚³é€ã€‚\n"
+
+#: src/ftp.c:1250
+#, c-format
+msgid "File %s exists.\n"
+msgstr "已存在 %s 檔案。\n"
+
+#: src/ftp.c:1256
+#, c-format
+msgid "No such file %s.\n"
+msgstr "ä¸å­˜åœ¨æª”案 %s。\n"
+
+#: src/ftp.c:1306
+#, c-format
+msgid ""
+"No such file %s.\n"
+"\n"
+msgstr ""
+"ä¸å­˜åœ¨æª”案 %s。\n"
+"\n"
+
+#: src/ftp.c:1356
+#, c-format
+msgid ""
+"No such file or directory %s.\n"
+"\n"
+msgstr ""
+"ä¸å­˜åœ¨æª”案或目錄 %s。\n"
+"\n"
+
+#: src/ftp.c:1515 src/http.c:2597
+#, c-format
+msgid "%s has sprung into existence.\n"
+msgstr "%s çªç„¶å‡ºç¾ã€‚\n"
+
+#: src/ftp.c:1604
+#, c-format
+msgid "%s: %s, closing control connection.\n"
+msgstr "%s: %s,將會關閉控制連線。\n"
+
+#: src/ftp.c:1616
+#, c-format
+msgid "%s (%s) - Data connection: %s; "
+msgstr "%s (%s) ─ 數據連線: %s;"
+
+#: src/ftp.c:1631
+msgid "Control connection closed.\n"
+msgstr "已關閉控制連線。\n"
+
+#: src/ftp.c:1649
+msgid "Data transfer aborted.\n"
+msgstr "已中止傳é€è³‡æ–™ã€‚\n"
+
+#: src/ftp.c:1873 src/main.c:1690
+#, c-format
+msgid "File %s already there; not retrieving.\n"
+msgstr "已存在檔案「%sã€ï¼›é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+
+#: src/ftp.c:1958 src/http.c:4362
+#, c-format
+msgid "(try:%2d)"
+msgstr "(嘗試第 %2d 次)"
+
+#: src/ftp.c:2050 src/http.c:4792
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 寫入到 stdout %s[%s]\n"
+"\n"
+
+#: src/ftp.c:2051 src/http.c:4793
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 已儲存 %s [%s]\n"
+"\n"
+
+#: src/ftp.c:2111 src/main.c:2174 src/metalink.c:1135 src/recur.c:512
+#: src/recur.c:750 src/retr.c:1317
+#, c-format
+msgid "Removing %s.\n"
+msgstr "刪除 %s。\n"
+
+#: src/ftp.c:2168
+#, c-format
+msgid "Using %s as listing tmp file.\n"
+msgstr "將 %s 使用為列出暫存檔案用途。\n"
+
+#: src/ftp.c:2185
+#, c-format
+msgid "Removed %s.\n"
+msgstr "已移除 %s。\n"
+
+#: src/ftp.c:2224
+#, c-format
+msgid "Recursion depth %d exceeded max. depth %d.\n"
+msgstr "éˆçµæ·±åº¦ %d 超éŽæœ€å¤§å€¼ %d。\n"
+
+#: src/ftp.c:2294
+#, c-format
+msgid "Remote file no newer than local file %s -- not retrieving.\n"
+msgstr "é ç«¯æª”案沒比本機檔案 %s æ–° -- é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+
+#: src/ftp.c:2302
+#, c-format
+msgid ""
+"Remote file is newer than local file %s -- retrieving.\n"
+"\n"
+msgstr ""
+"é ç«¯æª”案比本機檔案 %s æ–° -- é¸æ“‡æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/ftp.c:2309
+#, c-format
+msgid ""
+"The sizes do not match (local %s) -- retrieving.\n"
+"\n"
+msgstr ""
+"檔案大å°ä¸ç¬¦ (本機檔案為 %s) -- 下載檔案。\n"
+"\n"
+
+#: src/ftp.c:2327
+msgid "Invalid name of the symlink, skipping.\n"
+msgstr "ç•¥éŽå稱有誤的符號éˆçµã€‚\n"
+
+#: src/ftp.c:2356
+#, c-format
+msgid ""
+"Already have correct symlink %s -> %s\n"
+"\n"
+msgstr ""
+"正確的符號éˆçµ %s → %s 已經存在\n"
+"\n"
+
+#: src/ftp.c:2365
+#, c-format
+msgid "Creating symlink %s -> %s\n"
+msgstr "建立符號éˆçµ %s → %s\n"
+
+#: src/ftp.c:2375
+#, c-format
+msgid "Symlinks not supported, skipping symlink %s.\n"
+msgstr "ä¸æ”¯æ´ç¬¦è™Ÿé€£çµï¼Œé¸æ“‡è·³éŽç¬¦è™Ÿé€£çµ %s。\n"
+
+#: src/ftp.c:2390
+#, c-format
+msgid "Skipping directory %s.\n"
+msgstr "é¸æ“‡è·³éŽç›®éŒ„ %s。\n"
+
+#: src/ftp.c:2403
+#, c-format
+msgid "%s: unknown/unsupported file type.\n"
+msgstr "%s: 檔案類別ä¸è©³æˆ–ä¸æ”¯æ´ã€‚\n"
+
+#: src/ftp.c:2427
+#, c-format
+msgid "Failed to set permissions for %s.\n"
+msgstr "無法設定 %s 的權é™ã€‚\n"
+
+#: src/ftp.c:2448
+#, c-format
+msgid "%s: corrupt time-stamp.\n"
+msgstr "%s: 時間標記錯誤。\n"
+
+#: src/ftp.c:2472
+#, c-format
+msgid "Will not retrieve dirs since depth is %d (max %d).\n"
+msgstr "因為深度為 %d (最大值為 %d),所以ä¸ä¸‹è¼‰ã€‚\n"
+
+#: src/ftp.c:2531
+#, c-format
+msgid "Not descending to %s as it is excluded/not-included.\n"
+msgstr "未進入到 %s å› å…¶ä¸åŒ…å«æˆ–被排除\n"
+
+#: src/ftp.c:2647
+#, c-format
+msgid "Rejecting %s.\n"
+msgstr "拒絕 %s。\n"
+
+#: src/ftp.c:2657
+#, c-format
+msgid "Rejecting %s (Invalid Entry).\n"
+msgstr "拒絕 %s (無效項目)。\n"
+
+#: src/ftp.c:2678
+#, c-format
+msgid "%s is excluded/not-included through regex.\n"
+msgstr "%s 被從正è¦è¡¨é”å¼æŽ’除或ä¸åŒ…å«ã€‚\n"
+
+#: src/ftp.c:2698
+#, c-format
+msgid "Error matching %s against %s: %s\n"
+msgstr "將 %s 與 %s 比較時發生錯誤:%s\n"
+
+#: src/ftp.c:2738
+#, c-format
+msgid "No matches on pattern %s.\n"
+msgstr "æ²’æœ‰ç¬¦åˆ %s 樣å¼çš„çµæžœã€‚\n"
+
+#: src/ftp.c:2810
+#, c-format
+msgid "Wrote HTML-ized index to %s [%s].\n"
+msgstr "將 HTML 化的索引寫入至 %s [%s]。\n"
+
+#: src/ftp.c:2815
+#, c-format
+msgid "Wrote HTML-ized index to %s.\n"
+msgstr "將 HTML 化的索引寫至 %s。\n"
+
+#: src/gnutls.c:132
+#, c-format
+msgid "ERROR: Cannot open directory %s.\n"
+msgstr "錯誤:無法開啟 %s 目錄。\n"
+
+#: src/gnutls.c:178
+#, c-format
+msgid "ERROR: Failed to open cert %s: (%d).\n"
+msgstr "錯誤:無法開啟 %s 憑證:(%d)。\n"
+
+#: src/gnutls.c:183
+#, c-format
+msgid "Loaded CA certificate '%s'\n"
+msgstr "已載入 CA 憑證「%sã€\n"
+
+#: src/gnutls.c:191
+#, c-format
+msgid "ERROR: Failed to load CRL file '%s': (%d)\n"
+msgstr "錯誤:無法載入 CRL 檔案「%sã€ï¼š(%d)\n"
+
+#: src/gnutls.c:195
+#, c-format
+msgid "Loaded CRL file '%s'\n"
+msgstr "已載入 CRL 檔案「%sã€\n"
+
+#: src/gnutls.c:219
+msgid "ERROR: GnuTLS requires the key and the cert to be of the same type.\n"
+msgstr "錯誤:GnuTLS è¦æ±‚金鑰與憑證必須為åŒä¸€æ ¼å¼ã€‚\n"
+
+#: src/gnutls.c:771 src/gnutls.c:835
+msgid "Your GnuTLS version is too old to support TLS 1.3\n"
+msgstr "您的 OpenSSL 版本舊到ä¸æ”¯æ´ TLS 1.3\n"
+
+#: src/gnutls.c:783
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %u\n"
+msgstr "GnuTLS:未實åšã€Œsecure-protocolã€é¸é …的值 %u\n"
+
+#: src/gnutls.c:785 src/gnutls.c:841 src/host.c:158 src/openssl.c:288
+msgid "Please report this issue to bug-wget@gnu.org\n"
+msgstr "請回報此å•é¡Œè‡³ bug-wget@gnu.org\n"
+
+#: src/gnutls.c:840
+#, c-format
+msgid "GnuTLS: unimplemented 'secure-protocol' option value %d\n"
+msgstr "GnuTLS:未實åšã€Œsecure-protocolã€é¸é …的值 %d\n"
+
+#: src/gnutls.c:893
+msgid ""
+"GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"
+msgstr "GnuTLS:無法直接設定優先級 (prio) 字串。é¸æ“‡é€€å›žåˆ°é è¨­çš„優先級。\n"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "ERROR"
+msgstr "錯誤"
+
+#: src/gnutls.c:1021 src/openssl.c:1029
+msgid "WARNING"
+msgstr "警告"
+
+#: src/gnutls.c:1032 src/openssl.c:1042
+#, c-format
+msgid "%s: No certificate presented by %s.\n"
+msgstr "%s:%s 沒有æ供憑證。\n"
+
+#: src/gnutls.c:1038
+#, c-format
+msgid "%s: The certificate of %s is not trusted.\n"
+msgstr "%s:%s 的憑證ä¸å—信任。\n"
+
+#: src/gnutls.c:1039
+#, c-format
+msgid "%s: The certificate of %s doesn't have a known issuer.\n"
+msgstr "%s:%s 的憑證沒有已知的發行者。\n"
+
+#: src/gnutls.c:1040
+#, c-format
+msgid "%s: The certificate of %s has been revoked.\n"
+msgstr "%s:%s 的憑證已被撤回。\n"
+
+#: src/gnutls.c:1041
+#, c-format
+msgid "%s: The certificate signer of %s was not a CA.\n"
+msgstr "%s:%s 的憑證簽發者ä¸æ˜¯å€‹æ†‘證頒發機構 (CA)。\n"
+
+#: src/gnutls.c:1042
+#, c-format
+msgid "%s: The certificate of %s was signed using an insecure algorithm.\n"
+msgstr "%s:%s 的憑證以ä¸å®‰å…¨çš„算法簽å。\n"
+
+#: src/gnutls.c:1043
+#, c-format
+msgid "%s: The certificate of %s is not yet activated.\n"
+msgstr "%s:%s 的憑證尚未啟用。\n"
+
+#: src/gnutls.c:1044
+#, c-format
+msgid "%s: The certificate of %s has expired.\n"
+msgstr "%s:%s 的憑證已經到期。\n"
+
+#: src/gnutls.c:1056
+#, c-format
+msgid "Error initializing X509 certificate: %s\n"
+msgstr "åˆå§‹åŒ– X509 憑證時出錯:%s\n"
+
+#: src/gnutls.c:1065
+msgid "No certificate found\n"
+msgstr "找ä¸åˆ°æ†‘è­‰\n"
+
+#: src/gnutls.c:1072
+#, c-format
+msgid "Error parsing certificate: %s\n"
+msgstr "解æžæ†‘證時出錯:%s\n"
+
+#: src/gnutls.c:1079
+msgid "The certificate has not yet been activated\n"
+msgstr "憑證尚未啟用\n"
+
+#: src/gnutls.c:1084
+msgid "The certificate has expired\n"
+msgstr "憑證已éŽæœŸ\n"
+
+#: src/gnutls.c:1091
+#, c-format
+msgid "The certificate's owner does not match hostname %s\n"
+msgstr "憑證所有者與主機å稱 %s ä¸ç›¸ç¬¦\n"
+
+#: src/gnutls.c:1100 src/openssl.c:1238
+msgid "The public key does not match pinned public key!\n"
+msgstr "公鑰與釘é¸å…¬é‘°ä¸ç¬¦ï¼\n"
+
+#: src/gnutls.c:1109
+msgid "Certificate must be X.509\n"
+msgstr "憑證必須為 X.509 æ ¼å¼\n"
+
+#: src/host.c:157
+msgid "Error in handling the address list.\n"
+msgstr "處ç†ä½å€åˆ—表時出錯。\n"
+
+#: src/host.c:368
+msgid "Unknown host"
+msgstr "ä¸æ˜Žä¸»æ©Ÿ"
+
+#: src/host.c:372
+msgid "Temporary failure in name resolution"
+msgstr "暫時無法檢索主機å稱"
+
+#: src/host.c:374
+msgid "Unknown error"
+msgstr "錯誤原因ä¸æ˜Ž"
+
+#: src/host.c:850
+#, c-format
+msgid "Resolving %s... "
+msgstr "正在查找主機 %s... "
+
+#: src/host.c:926
+msgid "failed: No IPv4/IPv6 addresses for host.\n"
+msgstr "失敗: 該主機沒有 IPv4/IPv6 地å€ã€‚\n"
+
+#: src/host.c:956
+msgid "failed: timed out.\n"
+msgstr "失敗: 連線逾時。\n"
+
+#: src/html-url.c:306
+#, c-format
+msgid "%s: Cannot resolve incomplete link %s.\n"
+msgstr "%s: 無法解æžä¸å®Œæ•´çš„符號éˆçµ %s。\n"
+
+#: src/html-url.c:841
+#, c-format
+msgid ""
+"no-follow attribute found in %s. Will not follow any links on this page\n"
+msgstr ""
+
+#: src/html-url.c:944
+#, c-format
+msgid "%s: Invalid URL %s: %s\n"
+msgstr "%s: URL ‘%s’ 無效: %s\n"
+
+#: src/http.c:380
+#, c-format
+msgid "Failed writing HTTP request: %s.\n"
+msgstr "無法寫入 HTTP è¦æ±‚: %s。\n"
+
+#: src/http.c:795
+msgid "No headers, assuming HTTP/0.9"
+msgstr "沒有任何標頭資料,å‡è¨­ç‚º HTTP/0.9"
+
+#: src/http.c:1637
+#, c-format
+msgid ""
+"File %s already there; not retrieving.\n"
+"\n"
+msgstr ""
+"檔案 %s 已經存在;é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/http.c:1836
+msgid "gmtime failed. This is probably a bug.\n"
+msgstr "gmtime 失敗,這å¯èƒ½æ˜¯å€‹ bug。\n"
+
+#: src/http.c:1897
+msgid ""
+"Cannot convert timestamp to http format. Falling back to time 0 as last "
+"modification time.\n"
+msgstr "無法轉æ›æ™‚間戳至 HTTP æ ¼å¼ã€‚將上次修改時間設定為回退到時間值 0。\n"
+
+#: src/http.c:2001
+#, c-format
+msgid "BODY data file %s missing: %s\n"
+msgstr "BODY 資料檔案 %s éºå¤±ï¼š%s\n"
+
+#: src/http.c:2093
+#, c-format
+msgid "Reusing existing connection to [%s]:%d.\n"
+msgstr "ç¹¼çºŒä½¿ç”¨å° [%s]:%d 的已存在連線。\n"
+
+#: src/http.c:2098
+#, c-format
+msgid "Reusing existing connection to %s:%d.\n"
+msgstr "繼續使用和 %s:%d 的連線。\n"
+
+#: src/http.c:2164
+#, c-format
+msgid "Failed reading proxy response: %s\n"
+msgstr "無法讀å–代ç†ä¼ºæœå™¨å›žæ‡‰: %s。\n"
+
+#: src/http.c:2183 src/http.c:3465 src/http.c:4588
+#, c-format
+msgid "%s ERROR %d: %s.\n"
+msgstr "%s 錯誤 %d: %s。\n"
+
+#: src/http.c:2185 src/http.c:3467 src/http.c:3668
+msgid "Malformed status line"
+msgstr "ä¸æ­£å¸¸çš„狀態行"
+
+#: src/http.c:2196
+#, c-format
+msgid "Proxy tunneling failed: %s"
+msgstr "無法é€éŽä»£ç†ä¼ºæœå™¨é€²è¡Œ tunneling: %s"
+
+#: src/http.c:2460
+msgid "Unknown authentication scheme.\n"
+msgstr "èªè­‰æ–¹å¼ä¸è©³ã€‚\n"
+
+#: src/http.c:2478
+#, c-format
+msgid "Authentication selected: %s\n"
+msgstr "å·²é¸å–çš„èªè­‰æ–¹å¼ï¼š%s\n"
+
+#: src/http.c:2612
+#, c-format
+msgid "Saving to: %s\n"
+msgstr "儲存到:%s\n"
+
+#: src/http.c:2831
+#, c-format
+msgid ""
+"When downloading signature:\n"
+"%s: %s.\n"
+msgstr ""
+"下載憑證時:\n"
+"%s:%s。\n"
+
+#: src/http.c:2867
+msgid "Unable to read signature content from temporary file. Skipping.\n"
+msgstr "無法從暫存檔案讀å–憑證內容。跳éŽã€‚\n"
+
+#: src/http.c:2890
+msgid "Could not create temporary file. Skipping signature download.\n"
+msgstr "無法建立暫存檔案。跳éŽæ†‘證下載。\n"
+
+#: src/http.c:2924 src/http.c:3006
+#, c-format
+msgid "Invalid pri value. Assuming %d.\n"
+msgstr "無效的 pri 值。å‡å®šå€¼ç‚º %d。\n"
+
+#: src/http.c:3120
+msgid ""
+"Could not find acceptable digest for Metalink resources.\n"
+"Ignoring them.\n"
+msgstr ""
+"無法找到 Metalink 資æºçš„å¯æŽ¥å—摘è¦ã€‚\n"
+"é¸æ“‡è·³éŽå®ƒå€‘。\n"
+
+#: src/http.c:3257
+msgid "Disabling SSL due to encountered errors.\n"
+msgstr "å› é‡åˆ°éŒ¯èª¤è€Œåœæ­¢ä½¿ç”¨ SSL。\n"
+
+#: src/http.c:3401
+#, c-format
+msgid "%s request sent, awaiting response... "
+msgstr "å·²é€å‡º %s è¦æ±‚,正在等候回應... "
+
+#: src/http.c:3441
+msgid "No data received.\n"
+msgstr "收ä¸åˆ°è³‡æ–™ã€‚\n"
+
+#: src/http.c:3447
+#, c-format
+msgid "Read error (%s) in headers.\n"
+msgstr "讀å–標頭時發生錯誤 (%s)。\n"
+
+#: src/http.c:3670
+msgid "(no description)"
+msgstr "(沒有任何說明)"
+
+#: src/http.c:3861
+#, c-format
+msgid "Location: %s%s\n"
+msgstr "ä½ç½®: %s%s\n"
+
+#: src/http.c:3862 src/http.c:4102
+msgid "unspecified"
+msgstr "未指定"
+
+#: src/http.c:3863
+msgid " [following]"
+msgstr " [跟隨至新的 URL]"
+
+#: src/http.c:3945
+#, c-format
+msgid ""
+"File %s not modified on server. Omitting download.\n"
+"\n"
+msgstr ""
+"檔案 %s 未在伺æœå™¨ä¸Šè®Šæ›´ã€‚忽略此下載任務。\n"
+"\n"
+
+#: src/http.c:4018
+#, c-format
+msgid ""
+"Server ignored If-Modified-Since header for file %s.\n"
+"You might want to add --no-if-modified-since option.\n"
+"\n"
+msgstr ""
+"伺æœå™¨å¿½ç•¥äº†æª”案 %s çš„ If-Modified-Since 標頭。\n"
+"ä½ å¯èƒ½æƒ³è¦åŠ ä¸Š --no-if-modified-since é¸é …。\n"
+"\n"
+
+#: src/http.c:4038
+msgid ""
+"\n"
+" The file is already fully retrieved; nothing to do.\n"
+"\n"
+msgstr ""
+"\n"
+" 檔案早已下載完æˆï¼›ä¸æœƒé€²è¡Œä»»ä½•æ“作。\n"
+"\n"
+
+#: src/http.c:4082
+msgid "Length: "
+msgstr "長度: "
+
+#: src/http.c:4102
+msgid "ignored"
+msgstr "忽略"
+
+#: src/http.c:4270
+msgid "Warning: wildcards not supported in HTTP.\n"
+msgstr "警告: HTTP ä¸æ”¯æ´è¬ç”¨å­—元。\n"
+
+#: src/http.c:4352
+msgid "Spider mode enabled. Check if remote file exists.\n"
+msgstr "已啟用蜘蛛模å¼ã€‚當é ç«¯æª”案存在時則檢查。\n"
+
+#: src/http.c:4445
+#, c-format
+msgid "Cannot write to %s (%s).\n"
+msgstr "無法寫到 %s (%s)。\n"
+
+#: src/http.c:4467
+msgid "Required attribute missing from Header received.\n"
+msgstr "接收的標頭缺少所需屬性。\n"
+
+#: src/http.c:4472
+msgid "Username/Password Authentication Failed.\n"
+msgstr "使用者或密碼核å°å¤±æ•—。\n"
+
+#: src/http.c:4478
+msgid "Cannot write to WARC file.\n"
+msgstr "無法寫到 WARC 檔案。\n"
+
+#: src/http.c:4484
+msgid "Cannot write to temporary WARC file.\n"
+msgstr "無法寫到暫存 WARC 檔案中。\n"
+
+#: src/http.c:4489
+msgid "Unable to establish SSL connection.\n"
+msgstr "無法建立 SSL 連線。\n"
+
+#: src/http.c:4495
+#, c-format
+msgid "Cannot unlink %s (%s).\n"
+msgstr "無法å–æ¶ˆé€£çµ %s (%s)。\n"
+
+#: src/http.c:4505
+#, c-format
+msgid "ERROR: Redirection (%d) without location.\n"
+msgstr "錯誤: é‡æ–°å°Žå‘ (%d) 但沒有指定ä½ç½®ã€‚\n"
+
+#: src/http.c:4527
+msgid ""
+"Could not find Metalink data in HTTP response. Downloading file using HTTP "
+"GET.\n"
+msgstr "HTTP 回應中找ä¸åˆ° Metalink 資料。é¸æ“‡é€éŽ HTTP GET 下載檔案。\n"
+
+#: src/http.c:4536
+msgid "Metalink headers found. Switching to Metalink mode.\n"
+msgstr "已找到 Metalink 標頭資料。é¸æ“‡åˆ‡æ›åˆ° Metalink 模å¼ã€‚\n"
+
+#: src/http.c:4577
+msgid "Remote file does not exist -- broken link!!!\n"
+msgstr "é ç«¯æª”案ä¸å­˜åœ¨ -- 連çµæ壞ï¼\n"
+
+#: src/http.c:4605
+msgid "Last-modified header missing -- time-stamps turned off.\n"
+msgstr "缺少了最後修改時間標頭 ─ 關閉時間標記。\n"
+
+#: src/http.c:4613
+msgid "Last-modified header invalid -- time-stamp ignored.\n"
+msgstr "無效的最後修改時間標頭 ─ 忽略時間標記。\n"
+
+#: src/http.c:4643
+#, c-format
+msgid ""
+"Server file no newer than local file %s -- not retrieving.\n"
+"\n"
+msgstr ""
+"伺æœå™¨æª”案沒比本機檔案 %s æ–° -- é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/http.c:4651
+#, c-format
+msgid "The sizes do not match (local %s) -- retrieving.\n"
+msgstr "檔案大å°ä¸ç¬¦ (本機檔案為 %s) -- 會下載檔案。\n"
+
+#: src/http.c:4660
+msgid "Remote file is newer, retrieving.\n"
+msgstr "é ç«¯æª”案較新,會下載檔案。\n"
+
+#: src/http.c:4678
+msgid ""
+"Remote file exists and could contain links to other resources -- "
+"retrieving.\n"
+"\n"
+msgstr ""
+"é ç«¯æª”案存在,且å¯èƒ½åŒ…å«å…¶ä»–資æºçš„é€£çµ -- é¸æ“‡æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/http.c:4684
+msgid ""
+"Remote file exists but does not contain any link -- not retrieving.\n"
+"\n"
+msgstr ""
+"é ç«¯æª”案存在,但ä¸åŒ…å«ä»»ä½•é€£çµ -- é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/http.c:4693
+msgid ""
+"Remote file exists and could contain further links,\n"
+"but recursion is disabled -- not retrieving.\n"
+"\n"
+msgstr ""
+"é ç«¯æª”案已經存在,且å¯èƒ½åŒ…å«æ›´å¤šçš„連çµè³‡è¨Šï¼Œ\n"
+"但éžè¿´ä¸‹è¼‰å·²ç¶“åœç”¨ -- é¸æ“‡ä¸æŽ¥æ”¶ã€‚\n"
+"\n"
+
+#: src/http.c:4699
+msgid ""
+"Remote file exists.\n"
+"\n"
+msgstr ""
+"é ç«¯æª”案存在。\n"
+"\n"
+
+#: src/http.c:4708
+#, c-format
+msgid "%s URL: %s %2d %s\n"
+msgstr "%s URL:%s %2d %s\n"
+
+#: src/http.c:4756
+#, c-format
+msgid ""
+"%s (%s) - written to stdout %s[%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 已輸出到 stdout %s[%s/%s]\n"
+"\n"
+
+#: src/http.c:4757
+#, c-format
+msgid ""
+"%s (%s) - %s saved [%s/%s]\n"
+"\n"
+msgstr ""
+"%s (%s) - 已儲存 %s [%s/%s]\n"
+"\n"
+
+#: src/http.c:4818
+#, c-format
+msgid "%s (%s) - Connection closed at byte %s. "
+msgstr "%s (%s) - 在 %s ä½å…ƒçµ„後連線çªç„¶ä¸­æ–·ã€‚ "
+
+#: src/http.c:4841
+#, c-format
+msgid "%s (%s) - Read error at byte %s (%s)."
+msgstr "%s (%s) - 讀å–至 %s ä½å…ƒçµ„時發生錯誤 (%s)。"
+
+#: src/http.c:4850
+#, c-format
+msgid "%s (%s) - Read error at byte %s/%s (%s). "
+msgstr "%s (%s) - 讀å–至 %s/%s ä½å…ƒçµ„時發生錯誤 (%s)。"
+
+#: src/http.c:5107
+#, c-format
+msgid "Unsupported quality of protection '%s'.\n"
+msgstr "ä¸æ”¯æ´çš„「%sã€ä¿è­·å“質。\n"
+
+#: src/http.c:5112
+#, c-format
+msgid "Unsupported algorithm '%s'.\n"
+msgstr "ä¸æ”¯æ´çš„演算法「%sã€ã€‚\n"
+
+#: src/init.c:583
+#, c-format
+msgid ""
+"%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"
+msgstr "%s: WGETRC å°æ‡‰åˆ° %s - 無法存å–,因為該錯誤:%s。\n"
+
+#: src/init.c:695 src/netrc.c:454
+#, c-format
+msgid "%s: Cannot read %s (%s).\n"
+msgstr "%s: ç„¡æ³•è®€å– %s (%s)。\n"
+
+#: src/init.c:712
+#, c-format
+msgid "%s: Error in %s at line %d.\n"
+msgstr "%1$s: 錯誤發生於第 %3$d 行的 %2$s。\n"
+
+#: src/init.c:718
+#, c-format
+msgid "%s: Syntax error in %s at line %d.\n"
+msgstr "%1$s: 錯誤發生於第 %3$d 行的 %2$s。\n"
+
+#: src/init.c:723
+#, c-format
+msgid "%s: Unknown command %s in %s at line %d.\n"
+msgstr "%1$s:第 %4$d 行中 %3$s 發ç¾æœªçŸ¥æŒ‡ä»¤ %2$s。\n"
+
+#: src/init.c:762
+#, c-format
+msgid ""
+"Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"解æžç³»çµ±çš„ wgetrc 檔案 (env SYSTEM_WGETRC) 失敗。請檢查\n"
+"「%sã€ï¼Œ\n"
+"或é€éŽ --config 指定ä¸åŒçš„檔案。\n"
+
+#: src/init.c:777
+#, c-format
+msgid ""
+"Parsing system wgetrc file failed. Please check\n"
+"'%s',\n"
+"or specify a different file using --config.\n"
+msgstr ""
+"解æžç³»çµ±çš„ wgetrc 檔案失敗。請檢查\n"
+"「%sã€ï¼Œ\n"
+"或é€éŽ --config 指定ä¸åŒçš„檔案。\n"
+
+#: src/init.c:793
+#, c-format
+msgid "%s: Warning: Both system and user wgetrc point to %s.\n"
+msgstr "%s:警告:系統與使用者的 wgetrc éƒ½æŒ‡å‘ %s。\n"
+
+#: src/init.c:1006
+#, c-format
+msgid "%s: Invalid --execute command %s\n"
+msgstr "%s:無效的 --execute 指令 %s\n"
+
+#: src/init.c:1066
+#, c-format
+msgid "%s: %s: Invalid boolean %s; use `on' or `off'.\n"
+msgstr ""
+"%s:%s:%s 布林值無效;請使用「onã€æˆ–「offã€ã€‚\n"
+"\n"
+
+#: src/init.c:1099
+#, c-format
+msgid "%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"
+msgstr "%s:%s:%s 無效;請使用「onã€ã€ã€Œoffã€æˆ–「quietã€ã€‚\n"
+
+#: src/init.c:1119
+#, c-format
+msgid "%s: %s: Invalid number %s.\n"
+msgstr "%s:%s:無效的數字 %s。\n"
+
+#: src/init.c:1201
+#, c-format
+msgid "%s: %s must only be used once\n"
+msgstr "%s:%s å¿…é ˆåªèƒ½ä½¿ç”¨ä¸€æ¬¡\n"
+
+#: src/init.c:1356 src/init.c:1377
+#, c-format
+msgid "%s: %s: Invalid byte value %s\n"
+msgstr "%s:%s:無效的ä½å…ƒå€¼ %s\n"
+
+#: src/init.c:1402
+#, c-format
+msgid "%s: %s: Invalid time period %s\n"
+msgstr "%s:%sï¼šç„¡æ•ˆçš„æ™‚é–“æœŸé™ %s\n"
+
+#: src/init.c:1443
+#, fuzzy, c-format
+msgid "%s: %s: Negative time period %s\n"
+msgstr "%s:%sï¼šç„¡æ•ˆçš„æ™‚é–“æœŸé™ %s\n"
+
+#: src/init.c:1471 src/main.c:1926
+#, c-format
+msgid ""
+"use-askpass requires a string or either environment variable WGET_ASKPASS or "
+"SSH_ASKPASS to be set.\n"
+msgstr ""
+"use-askpass 需è¦ä¸€å€‹å­—串,或是設定其中一個環境變數 WGET_ASKPASS 或 "
+"SSH_ASKPAS。\n"
+
+#: src/init.c:1489 src/init.c:1511 src/init.c:1619 src/init.c:1675
+#: src/init.c:1741 src/init.c:1761 src/init.c:1786
+#, c-format
+msgid "%s: %s: Invalid value %s.\n"
+msgstr "%s:%s:無效值 %s。\n"
+
+#: src/init.c:1545
+#, c-format
+msgid "%s: %s: Invalid header %s.\n"
+msgstr "%s:%s:無效的標頭資訊 %s。\n"
+
+#: src/init.c:1566
+#, c-format
+msgid "%s: %s: Invalid WARC header %s.\n"
+msgstr "%s:%s:無效的 WARC 標頭資訊 %s。\n"
+
+#: src/init.c:1632
+#, c-format
+msgid "%s: %s: Invalid progress type %s.\n"
+msgstr "%s:%s:無效的進度類型 %s。\n"
+
+#: src/init.c:1714
+#, c-format
+msgid ""
+"%s: %s: Invalid restriction %s,\n"
+" use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"
+msgstr ""
+"%s:%s:無效的é™åˆ¶æ–¹å¼ %s,\n"
+" 請使用 [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii]\n"
+
+#: src/iri.c:114
+#, c-format
+msgid "Encoding %s isn't valid\n"
+msgstr "ç·¨ç¢¼æ–¹å¼ %s 無效\n"
+
+#: src/iri.c:140 src/url.c:1587
+#, c-format
+msgid "Conversion from %s to %s isn't supported\n"
+msgstr "ä¸æ”¯æ´å¾ž %s 轉æ›åˆ° %s\n"
+
+#: src/iri.c:180 src/url.c:1617
+msgid "Incomplete or invalid multibyte sequence encountered\n"
+msgstr "é‡åˆ°ä¸å®Œæ•´æˆ–無效的多ä½å…ƒåºåˆ—\n"
+
+#: src/iri.c:200 src/url.c:1634
+#, c-format
+msgid "Unhandled errno %d\n"
+msgstr "未處ç†çš„ errno %d\n"
+
+#: src/iri.c:237
+msgid "locale_to_utf8: locale is unset\n"
+msgstr "locale_to_utf8:locale 未設定\n"
+
+#: src/iri.c:283 src/iri.c:298
+#, c-format
+msgid "idn_encode failed (%d): %s\n"
+msgstr "idn_encode 失敗 (%d):%s\n"
+
+#: src/iri.c:290
+#, c-format
+msgid "Failed to convert to lower: %d: %s\n"
+msgstr "無法轉æ›è‡³å°å¯«ï¼š%d:%s\n"
+
+#: src/log.c:937 src/log.c:956
+#, c-format
+msgid ""
+"\n"
+"Redirecting output to %s.\n"
+msgstr ""
+"\n"
+"æ­£é‡æ–°å°Žå‘輸出至「%sã€ã€‚\n"
+
+#: src/log.c:949
+#, c-format
+msgid "%s: %s; disabling logging.\n"
+msgstr "%s: %s;無法進行任何記錄。\n"
+
+#: src/main.c:574
+#, c-format
+msgid "Usage: %s [OPTION]... [URL]...\n"
+msgstr "用法: %s [é¸é …]... [URL]...\n"
+
+#: src/main.c:590
+msgid ""
+"Mandatory arguments to long options are mandatory for short options too.\n"
+"\n"
+msgstr ""
+"é•·é¸é …必須用的åƒæ•¸åœ¨ä½¿ç”¨çŸ­é¸é …時也是必須的。\n"
+"\n"
+
+#: src/main.c:592
+msgid "Startup:\n"
+msgstr "啟動:\n"
+
+#: src/main.c:594
+msgid ""
+" -V, --version display the version of Wget and exit\n"
+msgstr " -V, --version 顯示 Wget 版本並離開\n"
+
+#: src/main.c:596
+msgid " -h, --help print this help\n"
+msgstr " -h, --help å°å‡ºé€™æ®µèªªæ˜Žæ–‡å­—\n"
+
+#: src/main.c:598
+msgid " -b, --background go to background after startup\n"
+msgstr " -b, --background 啟動後進入背景作業\n"
+
+#: src/main.c:600
+msgid " -e, --execute=COMMAND execute a `.wgetrc'-style command\n"
+msgstr " -e, --execute=指令 執行 ‘.wgetrc’ å½¢å¼çš„指令\n"
+
+#: src/main.c:604
+msgid "Logging and input file:\n"
+msgstr "紀錄訊æ¯åŠè¼¸å…¥æª”案:\n"
+
+#: src/main.c:606
+msgid " -o, --output-file=FILE log messages to FILE\n"
+msgstr " -o, --output-file=檔案 將紀錄訊æ¯å¯«å…¥<檔案>中\n"
+
+#: src/main.c:608
+msgid " -a, --append-output=FILE append messages to FILE\n"
+msgstr " -a, --append-output=檔案 將紀錄訊æ¯åŠ å…¥<檔案>末端\n"
+
+#: src/main.c:611
+msgid ""
+" -d, --debug print lots of debugging information\n"
+msgstr " -d, --debug å°å‡ºå¤§é‡åµéŒ¯è¨Šæ¯\n"
+
+#: src/main.c:615
+msgid " --wdebug print Watt-32 debug output\n"
+msgstr " --wdebug å°å‡º Watt-32 åµéŒ¯è¼¸å‡ºè¨Šæ¯\n"
+
+#: src/main.c:618
+msgid " -q, --quiet quiet (no output)\n"
+msgstr " -q, --quiet 安éœæ¨¡å¼ (ä¸è¼¸å‡ºè¨Šæ¯)\n"
+
+#: src/main.c:620
+msgid " -v, --verbose be verbose (this is the default)\n"
+msgstr " -v, --verbose è©³ç´°è¼¸å‡ºæ¨¡å¼ (é è¨­ä½¿ç”¨é€™å€‹æ¨¡å¼)\n"
+
+#: src/main.c:622
+msgid ""
+" -nv, --no-verbose turn off verboseness, without being "
+"quiet\n"
+msgstr ""
+" -nv, --no-verbose 關閉詳細輸出模å¼ï¼Œä½†ä¸å•Ÿç”¨å®‰éœæ¨¡å¼\n"
+
+#: src/main.c:624
+msgid ""
+" --report-speed=TYPE output bandwidth as TYPE. TYPE can be "
+"bits\n"
+msgstr ""
+" --report-speed=TYPE 以 TYPE æ ¼å¼è¼¸å‡ºæµé‡ã€‚TYPE å¯ç‚º bits。\n"
+
+#: src/main.c:626
+msgid ""
+" -i, --input-file=FILE download URLs found in local or external "
+"FILE\n"
+msgstr ""
+" -i, --input-file=檔案 下載從本機或外部 <檔案> 中找到的 URL\n"
+
+#: src/main.c:629
+msgid ""
+" --input-metalink=FILE download files covered in local Metalink "
+"FILE\n"
+msgstr ""
+" --input-metalink=檔案 下載寫在本機 Metalink <檔案> 中的 URL\n"
+
+#: src/main.c:632
+msgid " -F, --force-html treat input file as HTML\n"
+msgstr " -F, --force-html 將輸入檔案看作 HTML 檔案\n"
+
+#: src/main.c:634
+msgid ""
+" -B, --base=URL resolves HTML input-file links (-i -F)\n"
+" relative to URL\n"
+msgstr ""
+" -B, --base=URL 解æžç›¸å°æ–¼ URL çš„ HTML\n"
+" è¼¸å…¥æª”æ¡ˆé€£çµ (-i -F)\n"
+
+#: src/main.c:637
+msgid " --config=FILE specify config file to use\n"
+msgstr " --config=檔案 指定è¦ä½¿ç”¨çš„組態檔\n"
+
+#: src/main.c:639
+msgid " --no-config do not read any config file\n"
+msgstr " --no-config ä¸è®€ä»»ä½•çµ„態檔案\n"
+
+#: src/main.c:641
+msgid ""
+" --rejected-log=FILE log reasons for URL rejection to FILE\n"
+msgstr " --rejected-log=FILE 記錄 URL 拒絕原因至 FILE\n"
+
+#: src/main.c:645
+msgid "Download:\n"
+msgstr "下載:\n"
+
+#: src/main.c:647
+msgid ""
+" -t, --tries=NUMBER set number of retries to NUMBER (0 "
+"unlimits)\n"
+msgstr " -t, --tries=次數 設定é‡è©¦æ¬¡æ•¸ (0 表示無é™)\n"
+
+#: src/main.c:649
+msgid ""
+" --retry-connrefused retry even if connection is refused\n"
+msgstr " --retry-connrefused å³ä½¿é€£ç·šè¢«æ‹’ä»æœƒä¸æ–·å˜—試\n"
+
+#: src/main.c:651
+msgid ""
+" --retry-on-http-error=ERRORS comma-separated list of HTTP errors "
+"to retry\n"
+msgstr ""
+" --retry-on-http-error=錯誤 è¦é‡è©¦çš„ HTTP 錯誤的逗號分割列表。\n"
+
+#: src/main.c:653
+msgid " -O, --output-document=FILE write documents to FILE\n"
+msgstr " -O --output-document=檔案 將資料寫入 <檔案> 中\n"
+
+#: src/main.c:655
+msgid ""
+" -nc, --no-clobber skip downloads that would download to\n"
+" existing files (overwriting them)\n"
+msgstr ""
+" -nc, --no-clobber è·³éŽè¦ä¸‹è¼‰åˆ°ç¾æœ‰æª”案\n"
+" (也就是覆蓋它們) 的下載\n"
+
+#: src/main.c:658
+msgid ""
+" --no-netrc don't try to obtain credentials from ."
+"netrc\n"
+msgstr " --no-netrc ä¸è¦å˜—試從 .netrc å–得憑證\n"
+
+#: src/main.c:660
+msgid ""
+" -c, --continue resume getting a partially-downloaded "
+"file\n"
+msgstr " -c, --continue 繼續下載已下載了一部份的檔案\n"
+
+#: src/main.c:662
+msgid ""
+" --start-pos=OFFSET start downloading from zero-based "
+"position OFFSET\n"
+msgstr " --start-pos=OFFSET 從 0 開始的ä½ç½® OFFSET 開始下載\n"
+
+#: src/main.c:664
+msgid " --progress=TYPE select progress gauge type\n"
+msgstr " --progress=æ–¹å¼ é¸æ“‡ä¸‹è¼‰é€²åº¦çš„表示方å¼\n"
+
+#: src/main.c:666
+msgid ""
+" --show-progress display the progress bar in any verbosity "
+"mode\n"
+msgstr " --show-progress 在任何詳細輸出模å¼ä¸­é¡¯ç¤ºé€²åº¦æ¬„\n"
+
+#: src/main.c:668
+msgid ""
+" -N, --timestamping don't re-retrieve files unless newer "
+"than\n"
+" local\n"
+msgstr ""
+" -N, --timestamping 除éžé ç«¯æª”案比較新,å¦å‰‡ä¸é‡æ–°\n"
+" 下載é ç«¯æª”案\n"
+
+#: src/main.c:671
+msgid ""
+" --no-if-modified-since don't use conditional if-modified-since "
+"get\n"
+" requests in timestamping mode\n"
+msgstr ""
+" --no-if-modified-since ä¸ä½¿ç”¨æœ‰æ¢ä»¶çš„ if-modified-since get\n"
+" 使用時間戳模å¼è«‹æ±‚\n"
+
+#: src/main.c:674
+msgid ""
+" --no-use-server-timestamps don't set the local file's timestamp by\n"
+" the one on the server\n"
+msgstr ""
+" --no-use-server-timestamps ä¸è¨­å®šæœ¬æ©Ÿæª”案的時間戳為\n"
+" 伺æœå™¨æª”案的值\n"
+
+#: src/main.c:677
+msgid " -S, --server-response print server response\n"
+msgstr " -S, --server-response 顯示伺æœå™¨å›žæ‡‰è¨Šæ¯\n"
+
+#: src/main.c:679
+msgid " --spider don't download anything\n"
+msgstr " --spider ä¸ä¸‹è¼‰ä»»ä½•è³‡æ–™\n"
+
+#: src/main.c:681
+msgid " -T, --timeout=SECONDS set all timeout values to SECONDS\n"
+msgstr " -T, --timeout=秒數 設定所有逾時時é™ç‚º <秒數>\n"
+
+#: src/main.c:684
+msgid ""
+" --dns-servers=ADDRESSES list of DNS servers to query (comma "
+"separated)\n"
+msgstr ""
+" --dns-servers=ADDRESSES è¦æŸ¥è©¢çš„ DNS 伺æœå™¨åˆ—表 (以逗號分割)\n"
+
+#: src/main.c:686
+msgid ""
+" --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or "
+"IP) on local host\n"
+msgstr ""
+" --bind-dns-address=ä½å€ ç¶å®š DNS 解æžå™¨åˆ°å€åŸŸä¸»æ©Ÿä¸Šçš„ <ä½å€> (主機å"
+"稱或 IP)\n"
+
+#: src/main.c:689
+msgid " --dns-timeout=SECS set the DNS lookup timeout to SECS\n"
+msgstr " --dns-timeout=秒數 設定 DNS 查詢主機的逾時為 <秒數>\n"
+
+#: src/main.c:691
+msgid " --connect-timeout=SECS set the connect timeout to SECS\n"
+msgstr " --connect-timeout=秒數 設定連線逾時為 <秒數>\n"
+
+#: src/main.c:693
+msgid " --read-timeout=SECS set the read timeout to SECS\n"
+msgstr " --read-timeout=秒數 設定讀å–逾時為 <秒數>\n"
+
+#: src/main.c:695
+#, fuzzy
+msgid ""
+" -w, --wait=SECONDS wait SECONDS between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " -w, --wait=秒數 æ¯æ¬¡ä¸‹è¼‰æª”案之å‰ç­‰å¾…指定秒數\n"
+
+#: src/main.c:698
+#, fuzzy
+msgid ""
+" --waitretry=SECONDS wait 1..SECONDS between retries of a "
+"retrieval\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr " --waitretry=秒數 在下次接收é‡è©¦å‰ç­‰ 1 到 <秒數> 秒\n"
+
+#: src/main.c:701
+#, fuzzy
+msgid ""
+" --random-wait wait from 0.5*WAIT...1.5*WAIT secs "
+"between retrievals\n"
+" (applies if more then 1 URL is to be "
+"retrieved)\n"
+msgstr ""
+" --random-wait æ¯æ¬¡ä¸‹è¼‰ä¹‹å‰ç­‰å¾… 0.5*WAIT...1.5*WAIT 秒\n"
+
+#: src/main.c:704
+msgid " --no-proxy explicitly turn off proxy\n"
+msgstr " --no-proxy ç¦æ­¢ä½¿ç”¨ä»£ç†ä¼ºæœå™¨\n"
+
+#: src/main.c:706
+msgid " -Q, --quota=NUMBER set retrieval quota to NUMBER\n"
+msgstr " -Q, --quota=å¤§å° è¨­å®šä¸‹è¼‰è³‡æ–™çš„é™é¡å¤§å°ç‚º <大å°>\n"
+
+#: src/main.c:708
+msgid ""
+" --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local "
+"host\n"
+msgstr ""
+" --bind-address=ä½å€ ç¶å®šåˆ°å€åŸŸä¸»æ©Ÿä¸Šçš„ <ä½å€> (主機å稱或 IP)\n"
+
+#: src/main.c:710
+msgid " --limit-rate=RATE limit download rate to RATE\n"
+msgstr " --limit-rate=速率 é™åˆ¶ä¸‹è¼‰é€ŸçŽ‡æœ€é«˜ç‚º <速率>\n"
+
+#: src/main.c:712
+msgid " --no-dns-cache disable caching DNS lookups\n"
+msgstr " --no-dns-cache åœç”¨å¿«å– DNS 查詢\n"
+
+#: src/main.c:714
+msgid ""
+" --restrict-file-names=OS restrict chars in file names to ones OS "
+"allows\n"
+msgstr ""
+" --restrict-file-names=作業系統 åªä½¿ç”¨ <作業系統> å…許的字元作為檔案"
+"å­—å…ƒ\n"
+
+#: src/main.c:716
+msgid ""
+" --ignore-case ignore case when matching files/"
+"directories\n"
+msgstr " --ignore-case 忽略尋找相é…檔案或目錄的大å°å¯«\n"
+
+#: src/main.c:719
+msgid " -4, --inet4-only connect only to IPv4 addresses\n"
+msgstr " -4, --inet4-only åªæœƒé€£åˆ° IPv4 ä½å€\n"
+
+#: src/main.c:721
+msgid " -6, --inet6-only connect only to IPv6 addresses\n"
+msgstr " -6, --inet6-only åªæœƒé€£åˆ° IPv6 ä½å€\n"
+
+#: src/main.c:723
+msgid ""
+" --prefer-family=FAMILY connect first to addresses of specified "
+"family,\n"
+" one of IPv6, IPv4, or none\n"
+msgstr ""
+" --prefer-family=FAMILY 優先連線到指定æ—çš„ä½å€ï¼Œå¯ä»¥æ˜¯ IPv6ã€"
+"IPv4\n"
+" 或者 none\n"
+
+#: src/main.c:727
+msgid " --user=USER set both ftp and http user to USER\n"
+msgstr ""
+" --user=使用者 指定 ftp å’Œ http 使用者å稱為 <使用者>\n"
+
+#: src/main.c:729
+msgid ""
+" --password=PASS set both ftp and http password to PASS\n"
+msgstr " --password=密碼 指定 ftp 和 http 的密碼為 <密碼>\n"
+
+#: src/main.c:731
+msgid " --ask-password prompt for passwords\n"
+msgstr " --ask-password è©¢å•å¯†ç¢¼\n"
+
+#: src/main.c:734
+msgid ""
+" --use-askpass=COMMAND specify credential handler for "
+"requesting \n"
+" username and password. If no COMMAND "
+"is \n"
+" specified the WGET_ASKPASS or the "
+"SSH_ASKPASS \n"
+" environment variable is used.\n"
+msgstr ""
+" --use-askpass=COMMAND 指定接收使用者帳號與密碼的憑據處ç†å™¨ã€‚\n"
+" 若 COMMAND 未指定,則使用\n"
+" WGET_ASKPASS 或 SSH_ASKPASS \n"
+" 的環境變數值。\n"
+
+#: src/main.c:740
+msgid " --no-iri turn off IRI support\n"
+msgstr " --no-iri 關閉 IRI 支æ´\n"
+
+#: src/main.c:742
+msgid ""
+" --local-encoding=ENC use ENC as the local encoding for IRIs\n"
+msgstr ""
+" --local-encoding=ENC å°‡ ENC 作為 IRI 的本機編碼方å¼ä½¿ç”¨ã€‚\n"
+
+#: src/main.c:744
+msgid ""
+" --remote-encoding=ENC use ENC as the default remote encoding\n"
+msgstr " --remote-encoding=ENC å°‡ ENC 作為é è¨­é ç«¯ç·¨ç¢¼æ–¹å¼ä½¿ç”¨\n"
+
+#: src/main.c:746
+msgid " --unlink remove file before clobber\n"
+msgstr " --unlink 在é‡å¯«å‰ç§»é™¤æª”案\n"
+
+#: src/main.c:749
+msgid ""
+" --keep-badhash keep files with checksum mismatch "
+"(append .badhash)\n"
+msgstr ""
+" --keep-badhash ä¿ç•™æ ¡é©—碼ä¸ç¬¦åˆçš„檔案 (附加到 .badhash)\n"
+
+#: src/main.c:751
+msgid ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml "
+"metaurl ordinal NUMBER\n"
+msgstr ""
+" --metalink-index=NUMBER Metalink application/metalink4+xml 中繼連"
+"çµçš„åºæ•¸ NUMBER\n"
+
+#: src/main.c:753
+msgid ""
+" --metalink-over-http use Metalink metadata from HTTP response "
+"headers\n"
+msgstr ""
+" --metalink-over-http 使用來自 HTTP 回應標頭的 Metalink 中繼資"
+"æ–™\n"
+
+#: src/main.c:755
+msgid ""
+" --preferred-location preferred location for Metalink "
+"resources\n"
+msgstr " --preferred-location Metalink 資æºçš„å好ä½ç½®\n"
+
+#: src/main.c:759
+#, fuzzy
+msgid ""
+" --xattr turn on storage of metadata in extended "
+"file attributes\n"
+msgstr ""
+" --no-xattr 在延伸檔案屬性中關閉中繼資料的儲存。\n"
+
+#: src/main.c:764
+msgid "Directories:\n"
+msgstr "目錄:\n"
+
+#: src/main.c:766
+msgid " -nd, --no-directories don't create directories\n"
+msgstr " -nd, --no-directories ä¸å»ºç«‹ç›®éŒ„\n"
+
+#: src/main.c:768
+msgid " -x, --force-directories force creation of directories\n"
+msgstr " -x, --force-directories 強制建立目錄\n"
+
+#: src/main.c:770
+msgid " -nH, --no-host-directories don't create host directories\n"
+msgstr " -nH, --no-host-directories ä¸å»ºç«‹é ç«¯ä¸»æ©Ÿç›®éŒ„\n"
+
+#: src/main.c:772
+msgid " --protocol-directories use protocol name in directories\n"
+msgstr " --protocol-directories 在目錄中加上通訊å”定å稱\n"
+
+#: src/main.c:774
+msgid " -P, --directory-prefix=PREFIX save files to PREFIX/..\n"
+msgstr " -P, --directory-prefix=後綴 將檔案儲存到 <後綴>/..\n"
+
+#: src/main.c:776
+msgid ""
+" --cut-dirs=NUMBER ignore NUMBER remote directory "
+"components\n"
+msgstr " --cut-dirs=數目 忽略 <數目> 個é ç«¯ç›®éŒ„元件\n"
+
+#: src/main.c:780
+msgid "HTTP options:\n"
+msgstr "HTTP é¸é …:\n"
+
+#: src/main.c:782
+msgid " --http-user=USER set http user to USER\n"
+msgstr " --http-user=使用者 指定 HTTP 使用者為 <使用者>\n"
+
+#: src/main.c:784
+msgid " --http-password=PASS set http password to PASS\n"
+msgstr " --http-password=密碼 指定 HTTP 密碼為 <密碼>\n"
+
+#: src/main.c:786
+msgid " --no-cache disallow server-cached data\n"
+msgstr " --no-cache ä¸ä½¿ç”¨ä¼ºæœå™¨ä¸­çš„å¿«å–資料\n"
+
+#: src/main.c:788
+msgid ""
+" --default-page=NAME change the default page name (normally\n"
+" this is 'index.html'.)\n"
+msgstr ""
+" --default-page=NAME 變更é è¨­é é¢çš„å稱 (一般情æ³ä¸‹\n"
+" 其為「index.htmlã€ã€‚)\n"
+
+#: src/main.c:791
+msgid ""
+" -E, --adjust-extension save HTML/CSS documents with proper "
+"extensions\n"
+msgstr ""
+" -E, --adjust-extension 以é©ç•¶çš„副檔å儲存 HTML 或 CSS 檔案\n"
+
+#: src/main.c:793
+msgid ""
+" --ignore-length ignore 'Content-Length' header field\n"
+msgstr " --ignore-length 忽略「Content-Lengthã€æ¨™é ­æ¬„ä½\n"
+
+#: src/main.c:795
+msgid " --header=STRING insert STRING among the headers\n"
+msgstr " --header=字串 在標頭資料中æ’å…¥ <字串>\n"
+
+#: src/main.c:798
+msgid ""
+" --compression=TYPE choose compression, one of auto, gzip and "
+"none. (default: none)\n"
+msgstr ""
+" --compression=TYPE é¸æ“‡ autoã€gzip 或 none 中任一壓縮方å¼ã€‚"
+"(é è¨­ï¼šnone)\n"
+
+#: src/main.c:801
+msgid ""
+" --max-redirect maximum redirections allowed per page\n"
+msgstr " --max-redirect æ¯å€‹é é¢å…許的最大跳轉次數\n"
+
+#: src/main.c:803
+msgid " --proxy-user=USER set USER as proxy username\n"
+msgstr ""
+" --proxy-user=使用者 設定代ç†ä¼ºæœå™¨ä½¿ç”¨è€…å稱為 <使用者>\n"
+
+#: src/main.c:805
+msgid " --proxy-password=PASS set PASS as proxy password\n"
+msgstr " --proxy-password=密碼 設定代ç†ä¼ºæœå™¨å¯†ç¢¼ç‚º <密碼>\n"
+
+#: src/main.c:807
+msgid ""
+" --referer=URL include 'Referer: URL' header in HTTP "
+"request\n"
+msgstr ""
+" --referer=URL 在 HTTP 請求中包括「Referer: URLã€æ¨™é ­\n"
+
+#: src/main.c:809
+msgid " --save-headers save the HTTP headers to file\n"
+msgstr " --save-headers 存檔 HTTP 標頭資料\n"
+
+#: src/main.c:811
+msgid ""
+" -U, --user-agent=AGENT identify as AGENT instead of Wget/"
+"VERSION\n"
+msgstr " -U, --user-agent=AGENT 宣稱為 AGENT 而ä¸æ˜¯ Wget/VERSION\n"
+
+#: src/main.c:813
+msgid ""
+" --no-http-keep-alive disable HTTP keep-alive (persistent "
+"connections)\n"
+msgstr ""
+" --no-http-keep-alive ä¸ä½¿ç”¨ HTTP keep-alive (æŒä¹…性連線)\n"
+
+#: src/main.c:815
+msgid " --no-cookies don't use cookies\n"
+msgstr " --no-cookies ä¸ä½¿ç”¨ cookie\n"
+
+#: src/main.c:817
+msgid ""
+" --load-cookies=FILE load cookies from FILE before session\n"
+msgstr " --load-cookies=檔案 開始階段å‰å¾ž <檔案> 載入 Cookie\n"
+
+#: src/main.c:819
+msgid " --save-cookies=FILE save cookies to FILE after session\n"
+msgstr " --save-cookies=檔案 階段çµæŸå¾Œå°‡ cookie 存至 <檔案>\n"
+
+#: src/main.c:821
+msgid ""
+" --keep-session-cookies load and save session (non-permanent) "
+"cookies\n"
+msgstr ""
+" --keep-session-cookies 載入和儲存階段性 (暫時性) 的 cookie\n"
+
+#: src/main.c:823
+msgid ""
+" --post-data=STRING use the POST method; send STRING as the "
+"data\n"
+msgstr " --post-data=字串 使用 POST æ–¹å¼å°‡å­—串以資料方å¼é€å‡º\n"
+
+#: src/main.c:825
+msgid ""
+" --post-file=FILE use the POST method; send contents of "
+"FILE\n"
+msgstr " --post-file=檔案 使用 POST æ–¹å¼é€å‡º <檔案> 的內容\n"
+
+#: src/main.c:827
+msgid ""
+" --method=HTTPMethod use method \"HTTPMethod\" in the request\n"
+msgstr " --method=HTTPMethod 在請求中使用「HTTPMethodã€æ–¹æ³•\n"
+
+#: src/main.c:829
+msgid ""
+" --body-data=STRING send STRING as data. --method MUST be "
+"set\n"
+msgstr ""
+" --body-data=字串 å°‡ <字串> 當作資料傳é€ã€‚--method 必須設"
+"定ï¼\n"
+
+#: src/main.c:831
+msgid ""
+" --body-file=FILE send contents of FILE. --method MUST be "
+"set\n"
+msgstr ""
+" --body-file=檔案 å°‡ <檔案> 當作內容傳é€ã€‚--method 必須設"
+"定ï¼\n"
+
+#: src/main.c:833
+msgid ""
+" --content-disposition honor the Content-Disposition header "
+"when\n"
+" choosing local file names "
+"(EXPERIMENTAL)\n"
+msgstr ""
+" --content-disposition å°Šé‡ Content-Disposition 標頭,當é¸æ“‡\n"
+" 本機檔案å稱時 (實驗性)\n"
+
+#: src/main.c:836
+msgid ""
+" --content-on-error output the received content on server "
+"errors\n"
+msgstr " --content-on-error 輸出伺æœå™¨éŒ¯èª¤æ™‚的接收到內容\n"
+
+#: src/main.c:838
+msgid ""
+" --auth-no-challenge send Basic HTTP authentication "
+"information\n"
+" without first waiting for the server's\n"
+" challenge\n"
+msgstr ""
+" --auth-no-challenge 傳é€åŸºæœ¬ HTTP æ ¸å°è³‡è¨Šï¼Œè€Œä¸\n"
+" 等待伺æœå™¨çš„請求。\n"
+
+#: src/main.c:845
+msgid "HTTPS (SSL/TLS) options:\n"
+msgstr "HTTPS (SSL/TLS) é¸é …:\n"
+
+#: src/main.c:847
+msgid ""
+" --secure-protocol=PR choose secure protocol, one of auto, "
+"SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"
+msgstr ""
+" --secure-protocol=PR é¸æ“‡å®‰å…¨é€šè¨Šå”定,å¯ä»¥ä½¿ç”¨ auto, SSLv2,\n"
+" SSLv3, TLSv1, TLSv1_1, TLSv1_2 和 PFS\n"
+"\n"
+
+#: src/main.c:850
+msgid " --https-only only follow secure HTTPS links\n"
+msgstr " --https-only 僅追蹤安全 HTTPS 連çµ\n"
+
+#: src/main.c:852
+msgid ""
+" --no-check-certificate don't validate the server's certificate\n"
+msgstr " --no-check-certificate ä¸é©—證伺æœå™¨æ†‘è­‰\n"
+
+#: src/main.c:854
+msgid " --certificate=FILE client certificate file\n"
+msgstr " --certificate=檔案 指定使用者端的憑證檔案\n"
+
+#: src/main.c:856
+msgid ""
+" --certificate-type=TYPE client certificate type, PEM or DER\n"
+msgstr ""
+" --certificate-type=é¡žåž‹ 使用者端憑證的類型,å¯ä»¥æ˜¯ PEM 或 DER\n"
+
+#: src/main.c:858
+msgid " --private-key=FILE private key file\n"
+msgstr " --certificate-type=é¡žåž‹ 指定ç§é‘°æª”案\n"
+
+#: src/main.c:860
+msgid " --private-key-type=TYPE private key type, PEM or DER\n"
+msgstr " --private-key-type=é¡žåž‹ ç§é‘°çš„類型,å¯ä»¥æ˜¯ PEM 或 DER\n"
+
+#: src/main.c:862
+msgid " --ca-certificate=FILE file with the bundle of CAs\n"
+msgstr ""
+" --ca-certificate=檔案 包å«æ­¤æ†‘證頒發機構 (CA) bundle 的檔案\n"
+
+# (Abel) 這裡 hashed filename å’Œé¸é …的用æ„無關,所以ä¸ç¿»è­¯
+#: src/main.c:864
+msgid ""
+" --ca-directory=DIR directory where hash list of CAs is "
+"stored\n"
+msgstr " --ca-directory=目錄 載有憑證頒發機構 (CA) 簽章的目錄\n"
+
+#: src/main.c:866
+msgid " --crl-file=FILE file with bundle of CRLs\n"
+msgstr ""
+" --crl-file=FILE 包å«æ†‘è­‰åŠéŠ·åˆ—表 (CRL) bundle 的檔案\n"
+
+#: src/main.c:868
+msgid ""
+" --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n"
+" of base64 encoded sha256 hashes preceded "
+"by\n"
+" 'sha256//' and separated by ';', to "
+"verify\n"
+" peer against\n"
+msgstr ""
+" --pinnedpubkey=FILE/HASHES 公鑰 (PEM/DER) 檔案,或任何以\n"
+" 「sha256//ã€é–‹é ­ä¸”以「;ã€åˆ†å‰²ä¸”以 base64 "
+"編碼\n"
+" 的 SHA256 雜湊值號碼以驗證 peer against\n"
+"\n"
+
+#: src/main.c:874
+msgid ""
+" --random-file=FILE file with random data for seeding the SSL "
+"PRNG\n"
+msgstr ""
+" --random-file=檔案 用於 SSL éš¨æ©Ÿæ•¸ç”¢ç”Ÿç¨‹åº (PRNG) 隨機資料的檔"
+"案\n"
+
+#: src/main.c:878
+msgid ""
+" --egd-file=FILE file naming the EGD socket with random "
+"data\n"
+msgstr ""
+" --egd-file=檔案 用包å«éš¨æ©Ÿè³‡æ–™çš„ EGD socket 命å的檔案\n"
+
+#: src/main.c:882
+msgid ""
+" --ciphers=STR Set the priority string (GnuTLS) or cipher "
+"list string (OpenSSL) directly.\n"
+" Use with care. This option overrides --"
+"secure-protocol.\n"
+" The format and syntax of this string "
+"depend on the specific SSL/TLS engine.\n"
+msgstr ""
+" --ciphers=STR 直接設定優先級字串 (GnuTLS) 或密文列表字串 "
+"(OpenSSL)。\n"
+" è«‹å°å¿ƒä½¿ç”¨ã€‚æ­¤é¸é …覆蓋 --secure-protocol "
+"的設定值。\n"
+" 此字串的格å¼å’Œèªžæ³•åŸºæ–¼æŒ‡å®šçš„ SSL/TLS 引"
+"擎。\n"
+
+#: src/main.c:889
+msgid "HSTS options:\n"
+msgstr "HSTS é¸é …:\n"
+
+#: src/main.c:891
+msgid " --no-hsts disable HSTS\n"
+msgstr " --no-hsts åœç”¨ HSTS\n"
+
+#: src/main.c:893
+msgid ""
+" --hsts-file path of HSTS database (will override "
+"default)\n"
+msgstr " --hsts-file HSTS 資料庫ä½ç½® (將會覆蓋é è¨­å€¼)\n"
+
+#: src/main.c:898
+msgid "FTP options:\n"
+msgstr "FTP é¸é …:\n"
+
+#: src/main.c:901
+msgid ""
+" --ftp-stmlf use Stream_LF format for all binary FTP "
+"files\n"
+msgstr ""
+" --ftp-stmlf å°æ‰€æœ‰äºŒé€²ä½ FTP 檔案使用 Stream_LF æ ¼å¼\n"
+
+#: src/main.c:904
+msgid " --ftp-user=USER set ftp user to USER\n"
+msgstr " --ftp-user=使用者 指定 FTP 使用者å稱\n"
+
+#: src/main.c:906
+msgid " --ftp-password=PASS set ftp password to PASS\n"
+msgstr " --ftp-password=密碼 設定 FTP 密碼\n"
+
+#: src/main.c:908
+msgid " --no-remove-listing don't remove '.listing' files\n"
+msgstr " --no-remove-listing ä¸ç§»é™¤ã€Œ.listingã€æª”案\n"
+
+#: src/main.c:910
+msgid " --no-glob turn off FTP file name globbing\n"
+msgstr " --no-glob 關閉 FTP 檔案å稱的 glob 功能\n"
+
+#: src/main.c:912
+msgid ""
+" --no-passive-ftp disable the \"passive\" transfer mode\n"
+msgstr " --no-passive-ftp åœç”¨ã€Œè¢«å‹•ã€å‚³è¼¸æ¨¡å¼\n"
+
+#: src/main.c:914
+msgid " --preserve-permissions preserve remote file permissions\n"
+msgstr " --preserve-permissions ä¿ç•™é ç«¯æª”案的權é™\n"
+
+#: src/main.c:916
+msgid ""
+" --retr-symlinks when recursing, get linked-to files (not "
+"dir)\n"
+msgstr ""
+" --retr-symlinks 在éžè¿´æ¨¡å¼ä¸­ï¼Œä¸‹è¼‰é€£çµåˆ°çš„檔案 (éžç›®éŒ„)\n"
+
+#: src/main.c:921
+msgid "FTPS options:\n"
+msgstr "FTPS é¸é …:\n"
+
+#: src/main.c:923
+msgid ""
+" --ftps-implicit use implicit FTPS (default port is "
+"990)\n"
+msgstr ""
+" --ftps-implicit ä½¿ç”¨éš±å« FTPS (é è¨­é€£ç·šåŸ ç‚º 990)\n"
+
+#: src/main.c:925
+msgid ""
+" --ftps-resume-ssl resume the SSL/TLS session started in "
+"the control connection when\n"
+" opening a data connection\n"
+msgstr ""
+" --ftps-resume-ssl 當開啟一資料連線時,回復在控制連線中\n"
+" 開始的 SSL/TLS 階段。\n"
+"\n"
+
+#: src/main.c:928
+msgid ""
+" --ftps-clear-data-connection cipher the control channel only; all "
+"the data will be in plaintext\n"
+msgstr ""
+" --ftps-clear-data-connection 僅加密控制頻é“;所有資料將會以純文字傳"
+"輸。\n"
+
+#: src/main.c:930
+msgid ""
+" --ftps-fallback-to-ftp fall back to FTP if FTPS is not "
+"supported in the target server\n"
+msgstr ""
+" --ftps-fallback-to-ftp 若目標伺æœå™¨ä¸æ”¯æ´ FTPS 則回退到 FTP\n"
+
+#: src/main.c:934
+msgid "WARC options:\n"
+msgstr "WARC é¸é …:\n"
+
+#: src/main.c:936
+msgid ""
+" --warc-file=FILENAME save request/response data to a .warc.gz "
+"file\n"
+msgstr ""
+" --warc-file=FILENAME 儲存請求與回應資料至 .warc.gz 檔案\n"
+
+#: src/main.c:938
+msgid ""
+" --warc-header=STRING insert STRING into the warcinfo record\n"
+msgstr " --warc-header=字串 在 warcinfo 記錄中æ’入指定字串\n"
+
+#: src/main.c:940
+msgid ""
+" --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"
+msgstr " --warc-max-size=å¤§å° æŒ‡å®š WARC 檔案的最大大å°\n"
+
+#: src/main.c:942
+msgid " --warc-cdx write CDX index files\n"
+msgstr " --warc-cdx 寫入 CDX 索引檔案\n"
+
+#: src/main.c:944
+msgid ""
+" --warc-dedup=FILENAME do not store records listed in this CDX "
+"file\n"
+msgstr " --warc-dedup=FILENAME ä¸å„²å­˜åˆ—在此 CDX 檔案的紀錄\n"
+
+#: src/main.c:947
+msgid ""
+" --no-warc-compression do not compress WARC files with GZIP\n"
+msgstr " --no-warc-compression ä¸ä»¥ GZIP 壓縮方å¼å£“縮 WARC 檔案\n"
+
+#: src/main.c:950
+msgid " --no-warc-digests do not calculate SHA1 digests\n"
+msgstr " --no-warc-digests ä¸è¨ˆç®— SHA1 摘è¦\n"
+
+#: src/main.c:952
+msgid ""
+" --no-warc-keep-log do not store the log file in a WARC "
+"record\n"
+msgstr " --no-warc-keep-log ä¸å„²å­˜ WARC 紀錄中的日誌檔案\n"
+
+#: src/main.c:954
+msgid ""
+" --warc-tempdir=DIRECTORY location for temporary files created by "
+"the\n"
+" WARC writer\n"
+msgstr " --warc-tempdir=DIRECTORY ç”± WARC 寫入器建立的暫存檔ä½ç½®\n"
+
+#: src/main.c:959
+msgid "Recursive download:\n"
+msgstr "éžè¿´ä¸‹è¼‰ï¼š\n"
+
+#: src/main.c:961
+msgid " -r, --recursive specify recursive download\n"
+msgstr " -r, --recursive 指定éžè¿´ä¸‹è¼‰\n"
+
+#: src/main.c:963
+msgid ""
+" -l, --level=NUMBER maximum recursion depth (inf or 0 for "
+"infinite)\n"
+msgstr " -l, --level=數字 最大éžè¿´æ·±åº¦ (inf 或 0 表示無é™)\n"
+
+#: src/main.c:965
+msgid ""
+" --delete-after delete files locally after downloading "
+"them\n"
+msgstr " --delete-after 下載檔案後於本機刪除檔案\n"
+
+#: src/main.c:967
+msgid ""
+" -k, --convert-links make links in downloaded HTML or CSS "
+"point to\n"
+" local files\n"
+msgstr ""
+" -k, --convert-links 將下載到的 HTML 或 CSS 連çµå°åˆ°æœ¬æ©Ÿæª”案\n"
+
+#: src/main.c:970
+msgid ""
+" --convert-file-only convert the file part of the URLs only "
+"(usually known as the basename)\n"
+msgstr ""
+" --convert-file-only åªè½‰æ› URL 的檔案部份 (通常為 basename)\n"
+
+#: src/main.c:972
+msgid ""
+" --backups=N before writing file X, rotate up to N "
+"backup files\n"
+msgstr ""
+" --backups=N 寫入檔案 X 之å‰ï¼Œæœ€å¤šä¿ç•™ N 個備份檔案\n"
+
+#: src/main.c:976
+msgid ""
+" -K, --backup-converted before converting file X, back up as "
+"X_orig\n"
+msgstr " -K, --backup-converted 將轉æ›æª”案 X å‰å°‡å…¶å‚™ä»½ç‚º X_orig\n"
+
+#: src/main.c:979
+msgid ""
+" -K, --backup-converted before converting file X, back up as X."
+"orig\n"
+msgstr " -K, --backup-converted 將轉æ›æª”案 X å‰å°‡å…¶å‚™ä»½ç‚º X.orig\n"
+
+#: src/main.c:982
+msgid ""
+" -m, --mirror shortcut for -N -r -l inf --no-remove-"
+"listing\n"
+msgstr ""
+" -m, --mirror -N -r -l inf --no-remove-listing 指令的æ·"
+"徑\n"
+
+#: src/main.c:984
+msgid ""
+" -p, --page-requisites get all images, etc. needed to display "
+"HTML page\n"
+msgstr ""
+" -p, --page-requisites 下載所有顯示網é æ‰€éœ€çš„檔案,例如圖片等\n"
+
+#: src/main.c:986
+msgid ""
+" --strict-comments turn on strict (SGML) handling of HTML "
+"comments\n"
+msgstr " --strict-comments ç”¨åš´æ ¼æ–¹å¼ (SGML) è™•ç† HTML 注釋\n"
+
+#: src/main.c:990
+msgid "Recursive accept/reject:\n"
+msgstr "éžè¿´ä¸‹è¼‰æ™‚有關接å—/拒絕的é¸é …:\n"
+
+#: src/main.c:992
+msgid ""
+" -A, --accept=LIST comma-separated list of accepted "
+"extensions\n"
+msgstr " -A, --accept=清單 接å—的副檔å列表,用逗號分隔\n"
+
+#: src/main.c:994
+msgid ""
+" -R, --reject=LIST comma-separated list of rejected "
+"extensions\n"
+msgstr " -R, --reject=清單 排除的副檔å列表,以逗號分隔\n"
+
+#: src/main.c:996
+msgid " --accept-regex=REGEX regex matching accepted URLs\n"
+msgstr " --accept-regex=REGEX 符åˆé€šéŽ URL çš„ Regex\n"
+
+#: src/main.c:998
+msgid " --reject-regex=REGEX regex matching rejected URLs\n"
+msgstr " --reject-regex=REGEX 符åˆæ‹’絕 URL çš„ Regex\n"
+
+#: src/main.c:1001
+msgid " --regex-type=TYPE regex type (posix|pcre)\n"
+msgstr " --regex-type=TYPE æ­£è¦è¡¨é”å¼é¡žåž‹ (posix|pcre)\n"
+
+#: src/main.c:1004
+msgid " --regex-type=TYPE regex type (posix)\n"
+msgstr " --regex-type=é¡žåž‹ æ­£è¦è¡¨é”å¼é¡žåž‹ (posix)\n"
+
+#: src/main.c:1007
+msgid ""
+" -D, --domains=LIST comma-separated list of accepted domains\n"
+msgstr " -D, --domains=列表 接å—的網域列表,以逗號分隔\n"
+
+#: src/main.c:1009
+msgid ""
+" --exclude-domains=LIST comma-separated list of rejected domains\n"
+msgstr " --exclude-domains=列表 拒絕的網域列表,以逗號分割\n"
+
+#: src/main.c:1011
+msgid ""
+" --follow-ftp follow FTP links from HTML documents\n"
+msgstr " --follow-ftp 追蹤 HTML 檔案中的 FTP 連çµ\n"
+
+#: src/main.c:1013
+msgid ""
+" --follow-tags=LIST comma-separated list of followed HTML "
+"tags\n"
+msgstr ""
+" --follow-tags=列表 會追蹤的 HTML 標籤列表,以逗號分隔\n"
+
+#: src/main.c:1015
+msgid ""
+" --ignore-tags=LIST comma-separated list of ignored HTML "
+"tags\n"
+msgstr ""
+" --ignore-tags=LIST 會忽略的 HTML 標籤列表,以逗號分隔\n"
+
+#: src/main.c:1017
+msgid " -H, --span-hosts go to foreign hosts when recursive\n"
+msgstr " -H, --span-hosts éžè¿´æ¨¡å¼ä¸­å¯é€²å…¥å¤–部主機\n"
+
+#: src/main.c:1019
+msgid " -L, --relative follow relative links only\n"
+msgstr " -L, --relative åªè¿½è¹¤ç›¸å°é€£çµ\n"
+
+#: src/main.c:1021
+msgid " -I, --include-directories=LIST list of allowed directories\n"
+msgstr " -I, --include-directories=列表 å…許下載的目錄列表\n"
+
+#: src/main.c:1023
+msgid ""
+" --trust-server-names use the name specified by the "
+"redirection\n"
+" URL's last component\n"
+msgstr " --trust-server-names 使用跳轉 URL 的最後部份指定的å稱\n"
+
+#: src/main.c:1026
+msgid " -X, --exclude-directories=LIST list of excluded directories\n"
+msgstr " -X, --exclude-directories=清單 è¦æŽ’除目錄的清單\n"
+
+#: src/main.c:1028
+msgid ""
+" -np, --no-parent don't ascend to the parent directory\n"
+msgstr " -np, --no-parent ä¸é€²å…¥ä¸Šå±¤ç›®éŒ„\n"
+
+#: src/main.c:1031
+#, fuzzy
+msgid ""
+"Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+"and/or open issues at https://savannah.gnu.org/bugs/?"
+"func=additem&group=wget.\n"
+msgstr ""
+"和/或在 https://savannah.gnu.org/bugs/?func=additem&group=wget 開啟議題。\n"
+
+#: src/main.c:1037
+#, c-format
+msgid "GNU Wget %s, a non-interactive network retriever.\n"
+msgstr "GNU Wget %s,éžäº’å‹•å¼æª”案下載工具。\n"
+
+#: src/main.c:1080
+#, c-format
+msgid "Password for user %s: "
+msgstr "使用者 %s 的密碼:"
+
+#: src/main.c:1082
+#, c-format
+msgid "Password: "
+msgstr "密碼:"
+
+#: src/main.c:1106
+#, c-format
+msgid "Cannot create pipe\n"
+msgstr "無法建立 pipe\n"
+
+#: src/main.c:1114
+#, c-format
+msgid "Error initializing spawn file actions for use-askpass: %d\n"
+msgstr "åˆå§‹åŒ– use-askpass 的生æˆæª”案動作時出錯:%d\n"
+
+#: src/main.c:1123
+#, c-format
+msgid "Error setting spawn file actions for use-askpass: %d\n"
+msgstr "設定 use-askpass 的生æˆæª”案動作時出錯:%d\n"
+
+#: src/main.c:1147
+#, c-format
+msgid "Error reading response from command \"%s %s\": %s\n"
+msgstr "從「%s %sã€æŒ‡ä»¤ä¸­è®€å–回應時出錯:%s\n"
+
+#: src/main.c:1170
+#, c-format
+msgid "Username for '%s%s': "
+msgstr "「%s%sã€çš„使用者帳號:"
+
+#: src/main.c:1180
+#, c-format
+msgid "Password for '%s%s@%s': "
+msgstr "「%s%s@%sã€çš„密碼:"
+
+#: src/main.c:1252
+msgid "Wgetrc: "
+msgstr "Wgetrc:"
+
+#: src/main.c:1253
+msgid "Locale: "
+msgstr "語系:"
+
+#: src/main.c:1254
+msgid "Compile: "
+msgstr "編譯:"
+
+#: src/main.c:1255
+msgid "Link: "
+msgstr "連çµï¼š"
+
+#: src/main.c:1259
+#, c-format
+msgid ""
+"GNU Wget %s built on %s.\n"
+"\n"
+msgstr ""
+"GNU Wget %s,於 %s 上編譯。\n"
+"\n"
+
+#: src/main.c:1292
+#, c-format
+msgid " %s (env)\n"
+msgstr " %s (環境變數)\n"
+
+#: src/main.c:1299
+#, c-format
+msgid " %s (user)\n"
+msgstr " %s (使用者)\n"
+
+#: src/main.c:1304
+#, c-format
+msgid " %s (system)\n"
+msgstr " %s (系統)\n"
+
+#. TRANSLATORS: When available, an actual copyright character
+#. (circle-c) should be used in preference to "(C)".
+#: src/main.c:1332
+#, c-format
+msgid "Copyright (C) %s Free Software Foundation, Inc.\n"
+msgstr "版權所有 (C) %s 自由軟體基金會\n"
+
+#: src/main.c:1335
+msgid ""
+"License GPLv3+: GNU GPL version 3 or later\n"
+"<http://www.gnu.org/licenses/gpl.html>.\n"
+"This is free software: you are free to change and redistribute it.\n"
+"There is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"GPLv3+ 授權:GNU GPL 第三版或更新版本\n"
+"<http://www.gnu.org/licenses/gpl.html>。\n"
+"此為自由軟體:您能自由修改與é‡æ•£å¸ƒå®ƒã€‚\n"
+"在法律å…許的範åœå…§æ²’有任何擔ä¿ã€‚\n"
+
+#. TRANSLATORS: When available, please use the proper diacritics for
+#. names such as this one. See en_US.po for reference.
+#: src/main.c:1343
+msgid ""
+"\n"
+"Originally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"
+msgstr ""
+"\n"
+"最åˆç”± Hrvoje Niksic <hniksic@xemacs.org> 編寫。\n"
+
+#: src/main.c:1346
+msgid "Please send bug reports and questions to <bug-wget@gnu.org>.\n"
+msgstr "è«‹å°‡æ¼æ´žå ±å‘Šå’Œå•é¡Œå¯„到 <bug-wget@gnu.org>。\n"
+
+#: src/main.c:1399
+#, c-format
+msgid "Memory allocation problem\n"
+msgstr "記憶體分é…å•é¡Œ\n"
+
+#: src/main.c:1450
+#, c-format
+msgid "Exiting due to error in %s\n"
+msgstr "因為 %s 中錯誤而退出\n"
+
+#: src/main.c:1480 src/main.c:1551 src/main.c:1793
+#, c-format
+msgid "Try `%s --help' for more options.\n"
+msgstr "請嘗試執行‘%s --help’查看更多é¸é …。\n"
+
+#: src/main.c:1547
+#, c-format
+msgid "%s: illegal option -- `-n%c'\n"
+msgstr "%s: é¸é …ä¸åˆæ³• -- ‘-n%c’\n"
+
+#: src/main.c:1593
+#, c-format
+msgid "Debugging support not compiled in. Ignoring --debug flag.\n"
+msgstr "未編譯進åµéŒ¯æ”¯æ´ã€‚é¸æ“‡å¿½ç•¥ --debug 旗標。\n"
+
+#: src/main.c:1606
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-links were specified, only --convert-links "
+"will be used.\n"
+msgstr ""
+"指定了 --no-clobber å’Œ --convert-links 兩者,將åªä½¿ç”¨ --convert-links。\n"
+
+#: src/main.c:1608
+#, c-format
+msgid ""
+"Both --no-clobber and --convert-file-only were specified, only --convert-"
+"file-only will be used.\n"
+msgstr ""
+"指定了 --no-clobber å’Œ --convert-file-only 兩者,將åªä½¿ç”¨ --convert-file-"
+"only。\n"
+
+#: src/main.c:1641
+#, c-format
+msgid "Can't be verbose and quiet at the same time.\n"
+msgstr "無法åŒæ™‚使用詳細輸出模å¼åŠå®‰éœæ¨¡å¼ã€‚\n"
+
+#: src/main.c:1647
+#, c-format
+msgid "Can't timestamp and not clobber old files at the same time.\n"
+msgstr "無法åŒæ™‚使用時間標記而ä¸æ›´æ”¹æœ¬æ©Ÿæª”案。\n"
+
+#: src/main.c:1656
+#, c-format
+msgid "Cannot specify both --inet4-only and --inet6-only.\n"
+msgstr "ä¸å¯ä»¥åŒæ™‚使用 --inet4-only å’Œ --inet6-only é¸é …。\n"
+
+#: src/main.c:1666
+msgid ""
+"Cannot specify both -k or --convert-file-only and -O if multiple URLs are "
+"given, or in combination\n"
+"with -p or -r. See the manual for details.\n"
+"\n"
+msgstr ""
+"當指定多個 URL 時ã€æˆ–與 -p 或 -r çµåˆä½¿ç”¨æ™‚,無法åŒæ™‚指定 -k 或 --convert-"
+"file-only 和 -O。\n"
+"閱讀文件以了解詳細資訊。\n"
+
+#: src/main.c:1675
+msgid ""
+"WARNING: combining -O with -r or -p will mean that all downloaded content\n"
+"will be placed in the single file you specified.\n"
+"\n"
+msgstr ""
+"警告:將 -O 與 -r 或 -p çµåˆä»£è¡¨è‘—所有的下載內容將會放置於您指定的單一檔"
+"案。\n"
+"\n"
+
+#: src/main.c:1681
+msgid ""
+"WARNING: timestamping does nothing in combination with -O. See the manual\n"
+"for details.\n"
+"\n"
+msgstr ""
+"警告:與 -O 一起使用時時間戳將沒用。閱讀文件了解更多資訊。\n"
+"\n"
+
+#: src/main.c:1701
+#, c-format
+msgid ""
+"WARC output does not work with --no-clobber, --no-clobber will be disabled.\n"
+msgstr "WARC 輸出用ä¸åˆ° --no-clobber åƒæ•¸ï¼Œ--no-clobber 將被åœç”¨ã€‚\n"
+
+#: src/main.c:1708
+#, c-format
+msgid ""
+"WARC output does not work with timestamping, timestamping will be disabled.\n"
+msgstr "WARC 輸出ä¸ä½¿ç”¨æ™‚間戳,時間戳將被åœç”¨ã€‚\n"
+
+#: src/main.c:1715
+#, c-format
+msgid "WARC output does not work with --spider.\n"
+msgstr "WARC 輸出用ä¸åˆ° --spider åƒæ•¸ã€‚\n"
+
+#: src/main.c:1721
+#, c-format
+msgid ""
+"WARC output does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr "WARC 輸出用ä¸åˆ° --continue 或 --start-pos 引數,它們將被åœç”¨ã€‚\n"
+
+#: src/main.c:1729
+#, c-format
+msgid ""
+"Digests are disabled; WARC deduplication will not find duplicate records.\n"
+msgstr "「摘è¦ã€ç‚ºåœç”¨ç‹€æ…‹ï¼›WARC 刪除é‡è¤‡è³‡æ–™åŠŸèƒ½å°‡ä¸å°‹æ‰¾é‡è¤‡è¨˜éŒ„。\n"
+
+#: src/main.c:1750
+#, c-format
+msgid ""
+"Compression does not work with --continue or --start-pos, they will be "
+"disabled.\n"
+msgstr "壓縮ä¸æ”¯æ´ --continue 或 --start-pos,將åœç”¨é€™äº›é¸é …。\n"
+
+#: src/main.c:1761
+#, c-format
+msgid "Cannot specify both --ask-password and --password.\n"
+msgstr "ä¸èƒ½åŒæ™‚指定 --ask-password å’Œ --password。\n"
+
+#: src/main.c:1769
+#, c-format
+msgid ""
+"WARNING: No username set with --ask-password. This is usually not what you "
+"want.\n"
+msgstr ""
+
+#: src/main.c:1775
+#, c-format
+msgid ""
+"Specifying both --start-pos and --continue is not recommended; --continue "
+"will be disabled.\n"
+msgstr "ä¸å»ºè­°åŒæ™‚指定 --start-pos å’Œ --continue;將åœç”¨ --continue。\n"
+
+#: src/main.c:1788
+#, c-format
+msgid "%s: missing URL\n"
+msgstr "%s: 未指定 URL\n"
+
+#: src/main.c:1836
+#, c-format
+msgid "You cannot specify both --post-data and --post-file.\n"
+msgstr "ä¸èƒ½åŒæ™‚指定 --post-data å’Œ --post-file é¸é …。\n"
+
+#: src/main.c:1841
+#, c-format
+msgid ""
+"You cannot use --post-data or --post-file along with --method. --method "
+"expects data through --body-data and --body-file options\n"
+msgstr ""
+"ä¸èƒ½èˆ‡ --method 一起使用 --post-data 或 --post-file。--method 期望資料é€éŽ --"
+"body-data å’Œ --body-file é¸é …輸入\n"
+
+#: src/main.c:1850
+#, c-format
+msgid ""
+"You must specify a method through --method=HTTPMethod to use with --body-"
+"data or --body-file.\n"
+msgstr ""
+"您必須指定é€éŽ --method=HTTPMethod 引數的方å¼ä»¥èˆ‡ --body-data 或 --body-file "
+"一起使用。\n"
+
+#: src/main.c:1856
+#, c-format
+msgid "You cannot specify both --body-data and --body-file.\n"
+msgstr "ä¸èƒ½åŒæ™‚指定 --body-data å’Œ --body-file é¸é …。\n"
+
+#: src/main.c:1908
+#, c-format
+msgid "This version does not have support for IRIs\n"
+msgstr "此版本ä¸æ”¯æ´ IRI\n"
+
+#: src/main.c:2003
+#, c-format
+msgid ""
+"-k or -r can be used together with -O only if outputting to a regular file.\n"
+msgstr "å‡è‹¥è¼¸å‡ºåˆ°ä¸€å€‹æ­£å¸¸æª”案,-k 或 -r åªèƒ½èˆ‡ -O 一起使用。\n"
+
+#: src/main.c:2009
+#, c-format
+msgid ""
+"--convert-links or --convert-file-only can be used together only if "
+"outputting to a regular file.\n"
+msgstr ""
+"å‡è‹¥è¼¸å‡ºåˆ°ä¸€å€‹æ­£å¸¸æª”案,--convert-links 或 --convert-file-only åªèƒ½ä¸€èµ·ä½¿"
+"用。\n"
+
+#: src/main.c:2020
+#, c-format
+msgid "Failed to init libcares\n"
+msgstr "無法åˆå§‹åŒ– libcares\n"
+
+#: src/main.c:2026
+#, c-format
+msgid "Failed to init c-ares channel\n"
+msgstr "無法åˆå§‹åŒ– c-ares é »é“\n"
+
+#: src/main.c:2049
+#, c-format
+msgid "Failed to parse IP address '%s'\n"
+msgstr "ç„¡æ³•è§£æž IP ä½å€ã€Œ%sã€\n"
+
+#: src/main.c:2060
+#, c-format
+msgid "Failed to set DNS server(s) '%s' (%d)\n"
+msgstr "無法設定 DNS 伺æœå™¨ã€Œ%sã€(%d)\n"
+
+#: src/main.c:2197
+#, c-format
+msgid "No URLs found in %s.\n"
+msgstr "在 %s 中找ä¸åˆ° URL。\n"
+
+#: src/main.c:2213
+#, c-format
+msgid "Unable to parse metalink file %s.\n"
+msgstr "ç„¡æ³•è§£æž metalink 檔案 %s。\n"
+
+#: src/main.c:2243 src/metalink.c:337
+#, c-format
+msgid "Could not download all resources from %s.\n"
+msgstr "無法從 %s 下載所有資æºã€‚\n"
+
+#: src/main.c:2270
+#, c-format
+msgid ""
+"FINISHED --%s--\n"
+"Total wall clock time: %s\n"
+"Downloaded: %d files, %s in %s (%s)\n"
+msgstr ""
+"å®Œæˆ --%s--\n"
+"總計 clock 時間:%s\n"
+"已下載:%d 個檔案,%s 在 %s (%s) 中\n"
+
+#: src/main.c:2284
+#, c-format
+msgid "Download quota of %s EXCEEDED!\n"
+msgstr "%s å·²é”下載é™é¡ï¼\n"
+
+#: src/metalink.c:93
+msgid "-O not supported for metalink download. Ignoring.\n"
+msgstr "Metalink 下載ä¸æ”¯æ´ -O。é¸æ“‡å¿½ç•¥ã€‚\n"
+
+#: src/metalink.c:172
+#, c-format
+msgid "[--trust-server-names %s, --directory-prefix=%s]\n"
+msgstr "[--trust-server-names %s, --directory-prefix=%s]\n"
+
+#: src/metalink.c:176
+#, c-format
+msgid "Planned metalink file: %s\n"
+msgstr "排定的 metalink 檔案:%s\n"
+
+#: src/metalink.c:179
+#, c-format
+msgid "Secured metalink file: %s\n"
+msgstr "å—ä¿è­·çš„ Metalink 檔案:%s\n"
+
+#: src/metalink.c:184
+msgid "Rejecting metalink file. Unsafe name.\n"
+msgstr "å› ä¸å®‰å…¨çš„å稱,é¸æ“‡æ‹’絕 metalink 檔案。\n"
+
+#: src/metalink.c:238
+#, c-format
+msgid "Processing metaurl %s...\n"
+msgstr "æ­£åœ¨è™•ç† metaurl %s…\n"
+
+#: src/metalink.c:251
+#, c-format
+msgid "Rejecting metaurl file %s. Unsafe name.\n"
+msgstr ""
+"因為ä¸å®‰å…¨çš„å稱,é¸æ“‡æ‹’絕 metaurl 檔案 %s。\n"
+"\n"
+
+#: src/metalink.c:268
+#, c-format
+msgid "Failed to download %s. Skipping metaurl.\n"
+msgstr "無法下載 %s。é¸æ“‡è·³éŽ metaurl。\n"
+
+#: src/metalink.c:285
+#, c-format
+msgid "Unable to parse metaurl file %s.\n"
+msgstr "ç„¡æ³•è§£æž metaurl 檔案 %s。\n"
+
+#: src/metalink.c:354
+msgid "Metaurls processing returned with error.\n"
+msgstr "Metaurl 處ç†éŽç¨‹å›žå‚³éŒ¯èª¤ã€‚\n"
+
+#: src/metalink.c:386
+#, c-format
+msgid "Resource type %s not supported, ignoring...\n"
+msgstr "ä¸æ”¯æ´è³‡æºé¡žåž‹ %s,é¸æ“‡å¿½ç•¥â€¦\n"
+
+#: src/metalink.c:509
+msgid "Could not open downloaded file.\n"
+msgstr "無法開啟下載的檔案。\n"
+
+#: src/metalink.c:514
+#, c-format
+msgid "Computing size for %s\n"
+msgstr "正在為 %s 計算大å°\n"
+
+#: src/metalink.c:519
+msgid "File size not declared. Skipping check.\n"
+msgstr "未è²æ˜Žæª”案大å°ï¼Œé¸æ“‡è·³éŽæª¢æŸ¥ã€‚\n"
+
+#: src/metalink.c:527
+msgid "Could not get downloaded file's size.\n"
+msgstr "無法å–得下載檔案的大å°ã€‚\n"
+
+#: src/metalink.c:539
+#, c-format
+msgid "Size mismatch for file %s.\n"
+msgstr "檔案 %s 的大å°ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:547
+msgid "Size matches.\n"
+msgstr "大å°ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:600
+#, c-format
+msgid "Computing checksum for %s\n"
+msgstr "正在計算 %s 的校驗碼\n"
+
+#: src/metalink.c:678
+msgid "Checksum matches.\n"
+msgstr "校驗碼相符。\n"
+
+#: src/metalink.c:683
+#, c-format
+msgid "Checksum mismatch for file %s.\n"
+msgstr "檔案 %s 的校驗碼ä¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:722
+msgid "Could not open downloaded file for signature verification.\n"
+msgstr "無法開啟用於簽å驗證的已下載檔案。\n"
+
+#: src/metalink.c:780
+#, c-format
+msgid "GPGME data_new_from_mem: %s\n"
+msgstr "GPGME data_new_from_mem: %s\n"
+
+#: src/metalink.c:792
+#, c-format
+msgid "GPGME op_verify: %s\n"
+msgstr "GPGME op_verify: %s\n"
+
+#: src/metalink.c:805
+msgid "GPGME op_verify_result: NULL\n"
+msgstr "GPGME op_verify_result: NULL\n"
+
+#: src/metalink.c:821
+msgid "Signature validation succeeded.\n"
+msgstr "ç°½åé©—è­‰æˆåŠŸã€‚\n"
+
+#: src/metalink.c:829
+msgid "Invalid signature. Rejecting resource.\n"
+msgstr "無效簽å。é¸æ“‡æ‹’絕資æºã€‚\n"
+
+#: src/metalink.c:838
+msgid "Data matches signature, but signature is not trusted.\n"
+msgstr "資料與簽å相符,但簽åä¸å—信任。\n"
+
+#: src/metalink.c:865
+msgid "No checksums found.\n"
+msgstr "找ä¸åˆ°æ ¡é©—碼。\n"
+
+#: src/metalink.c:871
+#, c-format
+msgid "Failed to download %s. Skipping resource.\n"
+msgstr "無法下載 %s。é¸æ“‡è·³éŽè³‡æºã€‚\n"
+
+#: src/metalink.c:878
+#, c-format
+msgid "File %s retrieved but size does not match. \n"
+msgstr "接收到 %s 檔案,但大å°å»ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:885
+#, c-format
+msgid "File %s retrieved but checksum does not match. \n"
+msgstr "接收到 %s 檔案,但校驗碼å»ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:894
+#, c-format
+msgid "File %s retrieved but signature does not match. \n"
+msgstr "接收到 %s 檔案,但簽åå»ä¸ç›¸ç¬¦ã€‚\n"
+
+#: src/metalink.c:1113
+#, c-format
+msgid "Renaming %s to %s.\n"
+msgstr "正在將 %s é‡æ–°å‘½å至 %s。\n"
+
+#: src/mswindows.c:96
+#, c-format
+msgid "Continuing in background.\n"
+msgstr "繼續在背景中執行。\n"
+
+#: src/mswindows.c:289
+#, c-format
+msgid "Continuing in background, pid %lu.\n"
+msgstr "繼續在背景中執行,pid 為 %lu。\n"
+
+#: src/mswindows.c:291 src/utils.c:509
+#, c-format
+msgid "Output will be written to %s.\n"
+msgstr "將會把輸出寫到 %s。\n"
+
+#: src/mswindows.c:323
+#, c-format
+msgid "fake_fork_child() failed\n"
+msgstr "fake_fork_child() 失敗\n"
+
+#: src/mswindows.c:331
+#, c-format
+msgid "fake_fork() failed\n"
+msgstr "fake_fork() 失敗\n"
+
+#: src/mswindows.c:460 src/mswindows.c:467
+#, c-format
+msgid "%s: Couldn't find usable socket driver.\n"
+msgstr "%s: 找ä¸åˆ°å¯ç”¨çš„ socket 驅動程å¼ã€‚\n"
+
+#: src/mswindows.c:647
+#, c-format
+msgid "ioctl() failed. The socket could not be set as blocking.\n"
+msgstr "ioctl() 失敗。Socket ä¸èƒ½è¨­å®šç‚ºå°éŽ–狀態 (blocking)。\n"
+
+#: src/netrc.c:373
+#, c-format
+msgid "%s: %s:%d: warning: %s token appears before any machine name\n"
+msgstr "%s:%s:%d:警告:%s 令牌在機器å稱å‰å‡ºç¾\n"
+
+#: src/netrc.c:414
+#, c-format
+msgid "%s: %s:%d: unknown token \"%s\"\n"
+msgstr "%s: %s:%d: ä¸æ˜Žçš„標記「%sã€\n"
+
+#: src/netrc.c:500
+#, c-format
+msgid "Usage: %s NETRC [HOSTNAME]\n"
+msgstr "用法: %s NETRC [主機å稱]\n"
+
+#: src/netrc.c:518
+#, c-format
+msgid "%s: cannot stat %s: %s\n"
+msgstr "%s:無法 stat() %s:%s\n"
+
+#: src/openssl.c:128
+msgid "WARNING: using a weak random seed.\n"
+msgstr "警告:隨機數å“質ä¸å¤ ã€‚\n"
+
+#: src/openssl.c:208
+msgid "Could not seed PRNG; consider using --random-file.\n"
+msgstr ""
+"無法產生 OpenSSL éš¨æ©Ÿæ•¸ç”¢ç”Ÿç¨‹åº (PRNG) 使用的種å­ï¼›è«‹è€ƒæ…®ä½¿ç”¨ --random-file "
+"é¸é …。\n"
+
+#: src/openssl.c:271
+msgid "Your OpenSSL version is too old to support TLS 1.3\n"
+msgstr "您的 OpenSSL 版本舊到ä¸æ”¯æ´ TLS 1.3\n"
+
+#: src/openssl.c:277
+msgid "Your OpenSSL version is too old to support TLSv1.1\n"
+msgstr "您的 OpenSSL 版本舊到ä¸æ”¯æ´ TLSv1.1\n"
+
+#: src/openssl.c:281
+msgid "Your OpenSSL version is too old to support TLSv1.2\n"
+msgstr "您的 OpenSSL 版本舊到ä¸æ”¯æ´ TLSv1.2\n"
+
+#: src/openssl.c:287
+#, c-format
+msgid "OpenSSL: unimplemented 'secure-protocol' option value %d\n"
+msgstr "OpenSSL:未實åšçš„「secure-protocolã€é¸é …值 %d\n"
+
+#: src/openssl.c:333
+#, c-format
+msgid "OpenSSL: Invalid cipher list: %s\n"
+msgstr "OpenSSL:無效的密文列表:%s\n"
+
+#: src/openssl.c:360
+msgid "OpenSSL: Failed set trust to partial chain\n"
+msgstr ""
+
+#: src/openssl.c:366
+msgid "OpenSSL: Failed to allocate verification param\n"
+msgstr ""
+
+#: src/openssl.c:844
+msgid "WARNING: Could not seed PRNG. Consider using --random-file.\n"
+msgstr "è­¦å‘Šï¼šç„¡æ³•ç”¢ç”Ÿç¨®å­ PRNG。請考慮使用 --random-file。\n"
+
+#: src/openssl.c:1064
+#, c-format
+msgid "%s: cannot verify %s's certificate, issued by %s:\n"
+msgstr "%s:無法驗證 %s 的憑證 (由 %s 簽發):\n"
+
+#: src/openssl.c:1075
+msgid " Unable to locally verify the issuer's authority.\n"
+msgstr " 無法本機驗證此發行者的身份。\n"
+
+#: src/openssl.c:1080
+msgid " Self-signed certificate encountered.\n"
+msgstr " é‡åˆ°è‡ªç°½æ†‘證。\n"
+
+#: src/openssl.c:1083
+msgid " Issued certificate not yet valid.\n"
+msgstr " 發行的憑證尚未有效。\n"
+
+#: src/openssl.c:1086
+msgid " Issued certificate has expired.\n"
+msgstr " 發行的憑證已éŽæœŸ\n"
+
+#: src/openssl.c:1174
+#, c-format
+msgid ""
+"%s: no certificate subject alternative name matches\n"
+"\trequested host name %s.\n"
+msgstr ""
+"%s:沒有憑證主旨替代å稱符åˆ\n"
+"\t請求的主機å稱 %s。\n"
+
+#: src/openssl.c:1193
+#, c-format
+msgid ""
+" %s: certificate common name %s doesn't match requested host name %s.\n"
+msgstr " %s:憑證的一般å稱「%sã€å’Œè«‹æ±‚的主機å稱「%sã€ä¸ç¬¦ã€‚\n"
+
+#: src/openssl.c:1225
+#, c-format
+msgid ""
+" %s: certificate common name is invalid (contains a NUL character).\n"
+" This may be an indication that the host is not who it claims to be\n"
+" (that is, it is not the real %s).\n"
+msgstr ""
+" %s:憑證的一般å稱無效 (包å«äº† NUL å­—å…ƒ)。\n"
+" 這å¯èƒ½æ˜¯ä¸»æ©Ÿéžç”±è²ç¨±è€…æ“有的跡象(也就是說,\n"
+" å…¶ä¸æ˜¯çœŸæ­£çš„ %s)。\n"
+
+#: src/openssl.c:1250
+#, c-format
+msgid "To connect to %s insecurely, use `--no-check-certificate'.\n"
+msgstr "如果ä¸æƒ³ç”¨å®‰å…¨æ¨¡å¼é€£æŽ¥ %s,請使用 ‘--no-check-certificate’ é¸é …\n"
+
+#: src/progress.c:260
+#, c-format
+msgid ""
+"\n"
+"%*s[ skipping %sK ]"
+msgstr ""
+"\n"
+"%*s[ ç•¥éŽ %sK ]"
+
+#: src/progress.c:545
+#, c-format
+msgid "Invalid dot style specification %s; leaving unchanged.\n"
+msgstr "無效的點樣å¼è¦ç¯„ %sï¼›é¸æ“‡ä¸è®Šæ›´ã€‚\n"
+
+#. TRANSLATORS: "ETA" is English-centric, but this must
+#. be short, ideally 3 chars. Abbreviate if necessary.
+#: src/progress.c:1006
+#, c-format
+msgid " eta %s"
+msgstr " 剩餘 %s"
+
+#. TRANSLATORS: The meaning is "elapsed time", and it is shown
+#. * next to the progress bar once the download is done.
+#. * This should not take up more room than
+#. * available here (6 columns). Abbreviate if necessary.
+#: src/progress.c:1312
+msgid " in "
+msgstr " æ–¼ "
+
+#: src/ptimer.c:158
+#, c-format
+msgid "Cannot get REALTIME clock frequency: %s\n"
+msgstr "無法讀å–實時時é˜çš„頻率:%s\n"
+
+#: src/recur.c:513
+#, c-format
+msgid "Removing %s since it should be rejected.\n"
+msgstr "刪除 %s,因為它應該被指定了拒絕下載。\n"
+
+#: src/res.c:394
+#, fuzzy, c-format
+msgid "Cannot open %s: %s\n"
+msgstr "無法開啟 %s: %s"
+
+#: src/res.c:556
+msgid "Loading robots.txt; please ignore errors.\n"
+msgstr "正在載入 robots.txt;請忽略錯誤訊æ¯ã€‚\n"
+
+#: src/retr.c:934
+#, c-format
+msgid "Error parsing proxy URL %s: %s.\n"
+msgstr "分æžä»£ç†ä¼ºæœå™¨ URL %s 時發生錯誤: %s。\n"
+
+#: src/retr.c:948
+#, c-format
+msgid "Error in proxy URL %s: Must be HTTP.\n"
+msgstr "代ç†ä¼ºæœå™¨ URL %s 錯誤: 必須是 HTTP。\n"
+
+#: src/retr.c:1079
+#, c-format
+msgid "%d redirections exceeded.\n"
+msgstr "å·²è¶…éŽ %d 次é‡æ–°å°Žå‘。\n"
+
+#: src/retr.c:1341
+msgid ""
+"Giving up.\n"
+"\n"
+msgstr ""
+"放棄。\n"
+"\n"
+
+#: src/retr.c:1341
+msgid ""
+"Retrying.\n"
+"\n"
+msgstr ""
+"準備é‡è©¦ã€‚\n"
+"\n"
+
+#: src/spider.c:77
+msgid ""
+"Found no broken links.\n"
+"\n"
+msgstr ""
+"未找到æ壞連çµã€‚\n"
+"\n"
+
+#: src/spider.c:84
+#, c-format
+msgid ""
+"Found %d broken link.\n"
+"\n"
+msgid_plural ""
+"Found %d broken links.\n"
+"\n"
+msgstr[0] ""
+"找到 %d 個æ壞連çµã€‚\n"
+"\n"
+
+#: src/url.c:675
+msgid "No error"
+msgstr "沒有錯誤"
+
+#: src/url.c:677
+#, c-format
+msgid "Unsupported scheme %s"
+msgstr "ä¸æ”¯æ´çš„æ¨£å¼ %s"
+
+#: src/url.c:679
+msgid "Scheme missing"
+msgstr "缺少基模"
+
+#: src/url.c:681
+msgid "Invalid host name"
+msgstr "主機å稱無效"
+
+#: src/url.c:683
+msgid "Bad port number"
+msgstr "通訊埠號錯誤"
+
+#: src/url.c:685
+msgid "Invalid user name"
+msgstr "使用者å稱無效"
+
+#: src/url.c:687
+msgid "Unterminated IPv6 numeric address"
+msgstr "未完æˆçš„ IPv6 ä½å€"
+
+#: src/url.c:689
+msgid "IPv6 addresses not supported"
+msgstr "ä¸æ”¯æ´ IPv6 ä½å€"
+
+#: src/url.c:691
+msgid "Invalid IPv6 numeric address"
+msgstr "IPv6 ä½å€ç„¡æ•ˆ"
+
+#: src/url.c:1007
+msgid "HTTPS support not compiled in"
+msgstr "未編譯進 HTTPS 支æ´"
+
+#: src/url.c:1620
+msgid "Unconvertable multibyte sequence encountered\n"
+msgstr "é‡åˆ°ç„¡æ³•æ•‘æ´çš„多ä½å…ƒé™£åˆ—\n"
+
+#: src/utils.c:129
+#, c-format
+msgid "%s: %s: Failed to allocate enough memory; memory exhausted.\n"
+msgstr "%s:%s:無法分é…足夠的記憶體;記憶體資æºå·²ç¶“耗盡。\n"
+
+#: src/utils.c:135
+#, c-format
+msgid "%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"
+msgstr "%s:%sï¼šç„¡æ³•åˆ†é… %ld ä½å…ƒçµ„,記憶體已耗盡。\n"
+
+#: src/utils.c:355
+#, c-format
+msgid "%s: aprintf: text buffer is too big (%d bytes), aborting.\n"
+msgstr "%s:aprintf:文字緩è¡å€éŽå¤§ (%d ä½å…ƒçµ„),é¸æ“‡å¿½ç•¥ã€‚\n"
+
+#: src/utils.c:507
+#, c-format
+msgid "Continuing in background, pid %d.\n"
+msgstr "繼續在背景中執行,pid 為 %d。\n"
+
+#: src/utils.c:558
+#, c-format
+msgid "Failed to unlink symlink %s: %s\n"
+msgstr "無法å–æ¶ˆç¬¦è™Ÿé€£çµ %s:%s\n"
+
+#: src/utils.c:879
+#, c-format
+msgid "Failed to Fopen file %s\n"
+msgstr "無法 Fopen 檔案 %s\n"
+
+#: src/utils.c:885
+#, c-format
+msgid "Failed to get FD for file %s\n"
+msgstr "無法å–得檔案 %s 的檔案æ述符 (FD)\n"
+
+#: src/utils.c:892
+#, c-format
+msgid "Failed to stat file %s, (check permissions)\n"
+msgstr "無法 stat 檔案 %s,(請檢查權é™ï¼‰\n"
+
+#: src/utils.c:902
+#, fuzzy, c-format
+msgid "File %s changed since the last check. Security check failed.\n"
+msgstr "ä¸Šæ¬¡æª¢æŸ¥ä»¥ä¾†ç™¼ç¾ %s 檔案已變更。安全檢查失敗。"
+
+#: src/utils.c:937
+#, c-format
+msgid "Failed to open file %s, reason :%s\n"
+msgstr "無法開啟檔案 %s,原因是:%s\n"
+
+#: src/utils.c:943
+#, c-format
+msgid "Failed to stat file %s, error: %s\n"
+msgstr "無法 stat 檔案 %s,錯誤為:%s\n"
+
+#: src/utils.c:953
+#, fuzzy, c-format
+msgid ""
+"Trying to open file %s but it changed since last check. Security check "
+"failed.\n"
+msgstr "嘗試打開檔案 %s 但其在上次檢查後被修改éŽã€‚安全檢查失敗。"
+
+#: src/utils.c:2442
+#, c-format
+msgid "Invalid regular expression %s, PCRE2 error %d\n"
+msgstr "無效的正è¦è¡¨é”å¼ %s,PCRE2 錯誤 %d\n"
+
+#: src/utils.c:2459 src/utils.c:2482
+#, c-format
+msgid "Invalid regular expression %s, %s\n"
+msgstr "無效的正è¦è¡¨é”å¼ %s,%s\n"
+
+#: src/utils.c:2512 src/utils.c:2534 src/utils.c:2558
+#, c-format
+msgid "Error while matching %s: %d\n"
+msgstr "尋找 %s 符åˆé …目時出錯:%d\n"
+
+#: src/utils.c:2851
+#, c-format
+msgid "Skipping key with wrong size (%d/%d): %s\n"
+msgstr "è·³éŽéŒ¯èª¤å¤§å°çš„金鑰 (%d/%d):%s\n"
+
+#: src/warc.c:217
+#, fuzzy
+msgid "Error setting WARC file position.\n"
+msgstr "開啟 WARC 檔案 %s 時出錯。\n"
+
+#: src/warc.c:224
+#, fuzzy
+msgid "Error flushing WARC file to disk.\n"
+msgstr "開啟 WARC 檔案 %s 時出錯。\n"
+
+#: src/warc.c:234
+msgid "Error duplicating WARC file file descriptor.\n"
+msgstr "複製 WARC 檔案的檔案æ述符時發生錯誤。\n"
+
+#: src/warc.c:245
+msgid "Error opening GZIP stream to WARC file.\n"
+msgstr "é–‹å•Ÿçš„ GZIP 串æµæ™‚出錯。\n"
+
+#: src/warc.c:830
+msgid "Error writing warcinfo record to WARC file.\n"
+msgstr "寫入 warcinfo 紀錄到 WARC 檔案時出錯。\n"
+
+#: src/warc.c:893
+#, c-format
+msgid ""
+"Opening WARC file %s.\n"
+"\n"
+msgstr ""
+"正在開啟 WARC 檔案 %s。\n"
+"\n"
+
+#: src/warc.c:899
+#, c-format
+msgid "Error opening WARC file %s.\n"
+msgstr "開啟 WARC 檔案 %s 時出錯。\n"
+
+#: src/warc.c:1095
+msgid "CDX file does not list original urls. (Missing column 'a'.)\n"
+msgstr "CDX 檔案未列出原始 URL。(缺少「aã€æ¬„ä½ï¼‰\n"
+
+#: src/warc.c:1098
+msgid "CDX file does not list checksums. (Missing column 'k'.)\n"
+msgstr "CDX 檔案未列出雜湊值。(缺少「kã€æ¬„ä½ï¼‰\n"
+
+#: src/warc.c:1101
+msgid "CDX file does not list record ids. (Missing column 'u'.)\n"
+msgstr "CDX 檔案未列出紀錄 ID。(缺少「uã€æ¬„ä½ï¼‰\n"
+
+#: src/warc.c:1125
+#, c-format
+msgid ""
+"Loaded %d record from CDX.\n"
+"\n"
+msgid_plural ""
+"Loaded %d records from CDX.\n"
+"\n"
+msgstr[0] ""
+"已從 CDX 載入 %d 個記錄。\n"
+"\n"
+
+#: src/warc.c:1171
+#, c-format
+msgid "Could not read CDX file %s for deduplication.\n"
+msgstr "無法讀å–用來刪除é‡è¤‡è³‡æ–™çš„ CDX 檔案 %s。\n"
+
+#: src/warc.c:1181
+msgid "Could not open temporary WARC manifest file.\n"
+msgstr "無法開啟暫時 WARC 清單檔案。\n"
+
+#: src/warc.c:1191
+msgid "Could not open temporary WARC log file.\n"
+msgstr "無法開啟暫時 WARC 紀錄檔案。\n"
+
+#: src/warc.c:1200
+msgid "Could not open WARC file.\n"
+msgstr "無法開啟 WARC 檔案。\n"
+
+#: src/warc.c:1209
+msgid "Could not open CDX file for output.\n"
+msgstr "無法開啟用於輸出的 CDX 檔案。\n"
+
+#: src/warc.c:1239
+msgid "Could not open temporary WARC file.\n"
+msgstr "無法開啟暫時 WARC 檔案。\n"
+
+#: src/warc.c:1515
+msgid "Found exact match in CDX file. Saving revisit record to WARC.\n"
+msgstr "在 CDX 檔案中找到精確符åˆé …目。é¸æ“‡å„²å­˜é‡æ–°ç€è¦½ç´€éŒ„到 WARC 中。\n"
+
+#~ msgid "Unknown system error"
+#~ msgstr "未知系統錯誤"
+
+#~ msgid "Address family for hostname not supported"
+#~ msgstr "ä¸æ”¯æ´ä¸»æ©Ÿå稱的ä½å€ç³»åˆ—"
+
+#~ msgid "Bad value for ai_flags"
+#~ msgstr "ai_flags 值無效"
+
+#~ msgid "Non-recoverable failure in name resolution"
+#~ msgstr "解æžå稱時發生無法挽救的錯誤"
+
+#~ msgid "ai_family not supported"
+#~ msgstr "ä¸æ”¯æ´ ai_family"
+
+#~ msgid "Memory allocation failure"
+#~ msgstr "記憶體分é…失敗"
+
+#~ msgid "No address associated with hostname"
+#~ msgstr "沒有å°æ‡‰åˆ°æ­¤ä¸»æ©Ÿå稱的ä½å€"
+
+#~ msgid "Name or service not known"
+#~ msgstr "未知的å稱或æœå‹™"
+
+#~ msgid "Servname not supported for ai_socktype"
+#~ msgstr "ai_socktype ä¸æ”¯æ´ä¼ºæœå™¨å稱"
+
+#~ msgid "ai_socktype not supported"
+#~ msgstr "ä¸æ”¯æ´ ai_socktype"
+
+#~ msgid "System error"
+#~ msgstr "系統錯誤"
+
+#~ msgid "Argument buffer too small"
+#~ msgstr "引數緩è¡å€éŽå°"
+
+#~ msgid "Processing request in progress"
+#~ msgstr "正在處ç†è«‹æ±‚"
+
+#~ msgid "Request canceled"
+#~ msgstr "å·²å–消請求"
+
+#~ msgid "Request not canceled"
+#~ msgstr "請求未å–消"
+
+#~ msgid "All requests done"
+#~ msgstr "已完æˆæ‰€æœ‰è«‹æ±‚"
+
+#~ msgid "Interrupted by a signal"
+#~ msgstr "被一個信號中止"
+
+#~ msgid "Parameter string not correctly encoded"
+#~ msgstr "引數字串以ä¸æ­£ç¢ºçš„æ–¹å¼ç·¨ç¢¼"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous\n"
+#~ msgstr "%s:「%s%sã€é¸é …ä¸æ˜Žç¢º\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' is ambiguous; possibilities:"
+#~ msgstr "%s:é¸é …「%s%sã€ä¸æ˜Žç¢ºï¼›å¯èƒ½å€¼ç‚ºï¼š"
+
+#, c-format
+#~ msgid "%s: unrecognized option '%s%s'\n"
+#~ msgstr "%s:無法識別的é¸é …「%s%sã€\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' doesn't allow an argument\n"
+#~ msgstr "%s:「%s%sã€é¸é …ä¸å…許引數\n"
+
+#, c-format
+#~ msgid "%s: option '%s%s' requires an argument\n"
+#~ msgstr "%s:「%s%sã€é¸é …需è¦å¼•æ•¸\n"
+
+#, c-format
+#~ msgid "%s: invalid option -- '%c'\n"
+#~ msgstr "%s:無效的é¸é … --「%cã€\n"
+
+#, c-format
+#~ msgid "%s: option requires an argument -- '%c'\n"
+#~ msgstr "%s:é¸é …需è¦å¼•æ•¸ --「%cã€\n"
+
+#~ msgid "`"
+#~ msgstr "`"
+
+#~ msgid "'"
+#~ msgstr "'"
+
+#~ msgid "Success"
+#~ msgstr "æˆåŠŸ"
+
+#~ msgid "No match"
+#~ msgstr "沒有符åˆé …ç›®"
+
+#~ msgid "Invalid regular expression"
+#~ msgstr "無效的正è¦è¡¨é”å¼"
+
+#~ msgid "Invalid collation character"
+#~ msgstr "無效的整ç†å­—å…ƒ"
+
+#~ msgid "Invalid character class name"
+#~ msgstr "無效的字元類別å稱"
+
+#~ msgid "Trailing backslash"
+#~ msgstr "尾隨倒斜線"
+
+#~ msgid "Invalid back reference"
+#~ msgstr "無效的後å‘引用"
+
+#~ msgid "Unmatched [, [^, [:, [., or [="
+#~ msgstr "沒有符åˆçš„ [ã€[^ã€[:ã€[. 或 [="
+
+#~ msgid "Unmatched ( or \\("
+#~ msgstr "沒有符åˆçš„ ( 或 \\("
+
+#~ msgid "Unmatched \\{"
+#~ msgstr "沒有符åˆçš„ \\{"
+
+#~ msgid "Invalid content of \\{\\}"
+#~ msgstr "無效的 \\{\\} 內容"
+
+#~ msgid "Invalid range end"
+#~ msgstr "無效的範åœçµå°¾"
+
+#~ msgid "Memory exhausted"
+#~ msgstr "記憶體用盡"
+
+#~ msgid "Invalid preceding regular expression"
+#~ msgstr "無效的å‰ç½®æ­£è¦è¡¨é”å¼"
+
+#~ msgid "Premature end of regular expression"
+#~ msgstr "æ­£è¦è¡¨é”å¼æå‰çµæŸ"
+
+#~ msgid "Regular expression too big"
+#~ msgstr "æ­£è¦è¡¨é”å¼éŽå¤§"
+
+#~ msgid "Unmatched ) or \\)"
+#~ msgstr "沒有符åˆçš„ ) 或 \\)"
+
+#~ msgid "No previous regular expression"
+#~ msgstr "沒有上一個正è¦è¡¨é”å¼"
+
+#, c-format
+#~ msgid "cannot create pipe"
+#~ msgstr "無法建立管線"
+
+#, c-format
+#~ msgid "%s subprocess failed"
+#~ msgstr "%s å­åŸ·è¡Œç¨‹åºå¤±æ•—"
+
+#, c-format
+#~ msgid "_open_osfhandle failed"
+#~ msgstr "_open_osfhandle 失敗"
+
+#, c-format
+#~ msgid "cannot restore fd %d: dup2 failed"
+#~ msgstr "無法還原第 %d 個 fd:dup2 失敗"
+
+#, c-format
+#~ msgid "%s subprocess"
+#~ msgstr "%s å­åŸ·è¡Œç¨‹åº"
+
+#, c-format
+#~ msgid "%s subprocess got fatal signal %d"
+#~ msgstr "%s å­åŸ·è¡Œç¨‹åºå–å¾—åš´é‡éŒ¯èª¤ä¿¡è™Ÿ %d"
+
+#~ msgid "memory exhausted"
+#~ msgstr "記憶體用盡"
+
+#~ msgid "Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+#~ msgstr "請將臭蟲報告ã€å•é¡Œèˆ‡è¨Žè«–寄到 <bug-wget@gnu.org>\n"
+
+#~ msgid "%s: option '--%s' doesn't allow an argument\n"
+#~ msgstr "%s:「--%sã€é¸é …ä¸å…許引數\n"
+
+#~ msgid "%s: unrecognized option '--%s'\n"
+#~ msgstr "%s:無法識別的é¸é …「--%sã€\n"
+
+#~ msgid "%s: option '-W %s' is ambiguous\n"
+#~ msgstr "%s:「-W %sã€é¸é …ä¸æ˜Žç¢º\n"
+
+#~ msgid "%s: option '-W %s' doesn't allow an argument\n"
+#~ msgstr "%s:「-W %sã€é¸é …ä¸å…許引數\n"
+
+#~ msgid "%s: option '-W %s' requires an argument\n"
+#~ msgstr "%s:「-W %sã€é¸é …需è¦å¼•æ•¸\n"
+
+#~ msgid "File `%s' already there; not retrieving.\n"
+#~ msgstr "檔案 ‘%s’ 已存在,ä¸æœƒä¸‹è¼‰ã€‚\n"
+
+#~ msgid "Error in Set-Cookie, field `%s'"
+#~ msgstr "Set-Cookie 的欄ä½â€˜%s’出ç¾éŒ¯èª¤"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: é¸é …ä¸åˆæ³• ─ %c\n"
+
+#~ msgid "Authorization failed.\n"
+#~ msgstr "èªè­‰å¤±æ•—ï¼\n"
+
+#~ msgid "%s (%s) - Connection closed at byte %s/%s. "
+#~ msgstr "%s (%s) - 在 %s/%s ä½å…ƒçµ„後連線çªç„¶ä¸­æ–·ã€‚ "
+
+#~ msgid ""
+#~ "%s: %s: Invalid extended boolean `%s';\n"
+#~ "use one of `on', `off', `always', or `never'.\n"
+#~ msgstr ""
+#~ "%s: %s: é‚輯值 ‘%s’ 無效,\n"
+#~ "請使用 ‘always’, ‘on’, ‘off’ 或 ‘never’。\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "%s received.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "下載 %s 完畢。\n"
+
+#~ msgid ""
+#~ " -B, --base=URL prepends URL to relative links in -F -i "
+#~ "file.\n"
+#~ msgstr ""
+#~ " -B, --base=URL 使用 -F -i file é¸é …時,在相å°éˆçµå‰åŠ å…¥ "
+#~ "URL\n"
+
+#~ msgid " -Y, --proxy explicitly turn on proxy.\n"
+#~ msgstr " -Y, --proxy 必定使用代ç†ä¼ºæœå™¨\n"
+
+# (Abel) åƒè€ƒ slat.org
+#~ msgid ""
+#~ "This program is distributed in the hope that it will be useful,\n"
+#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+#~ "GNU General Public License for more details.\n"
+#~ msgstr ""
+#~ "本程å¼ä¿‚基於使用目的而加以散布,然而ä¸è² ä»»ä½•æ“”ä¿è²¬ä»»ï¼›\n"
+#~ "亦無å°é©å”®æ€§æˆ–特定目的é©ç”¨æ€§æ‰€ç‚ºçš„默示性擔ä¿ã€‚\n"
+#~ "詳情請åƒç…§ GNU 通用公共授權。\n"
+
+#~ msgid "%s: Certificate verification error for %s: %s\n"
+#~ msgstr "%s:檢驗 %s 的憑證時發生錯誤:%s\n"
+
+#~ msgid "File `%s' already there, will not retrieve.\n"
+#~ msgstr "檔案‘%s’已存在,ä¸æœƒä¸‹è¼‰ã€‚\n"
+
+#~ msgid ""
+#~ "%s (%s) - `%s' saved [%s/%s])\n"
+#~ "\n"
+#~ msgstr ""
+#~ "%s (%s) - 已儲存 ‘%s’ [%s/%s])\n"
+#~ "\n"
+
+#~ msgid "Empty host"
+#~ msgstr "沒有主機å稱"
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..322a3db
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,110 @@
+# Makefile for `wget' utility
+# Copyright (C) 1995-2011, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+
+if IRI_IS_ENABLED
+IRI_OBJ = iri.c
+endif
+
+if METALINK_IS_ENABLED
+METALINK_OBJ = metalink.c
+endif
+
+if WITH_XATTR
+XATTR_OBJ = xattr.c
+endif
+
+# The following line is losing on some versions of make!
+DEFS = @DEFS@ -DSYSTEM_WGETRC=\"$(sysconfdir)/wgetrc\" -DLOCALEDIR=\"$(localedir)\"
+
+EXTRA_DIST = css.l css.c css_.c build_info.c.in build_info.c
+
+bin_PROGRAMS = wget
+wget_SOURCES = connect.c convert.c cookies.c ftp.c \
+ css_.c css-url.c \
+ ftp-basic.c ftp-ls.c hash.c host.c hsts.c html-parse.c html-url.c \
+ http.c init.c log.c main.c netrc.c progress.c ptimer.c \
+ recur.c res.c retr.c spider.c url.c warc.c $(XATTR_OBJ) \
+ utils.c exits.c build_info.c $(IRI_OBJ) $(METALINK_OBJ) \
+ css-url.h css-tokens.h connect.h convert.h cookies.h \
+ ftp.h hash.h host.h hsts.h html-parse.h html-url.h \
+ http.h http-ntlm.h init.h log.h mswindows.h netrc.h \
+ options.h progress.h ptimer.h recur.h res.h retr.h \
+ spider.h ssl.h sysdep.h url.h warc.h utils.h wget.h iri.h \
+ exits.h version.h metalink.h xattr.h
+nodist_wget_SOURCES = version.c
+EXTRA_wget_SOURCES = iri.c
+LDADD = $(CODE_COVERAGE_LIBS) $(LIBOBJS) ../lib/libgnu.a $(GETADDRINFO_LIB) $(HOSTENT_LIB)\
+ $(INET_NTOP_LIB) $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO)\
+ $(LIB_NANOSLEEP) $(LIB_POSIX_SPAWN) $(LIB_SELECT) $(LIBICONV) $(LIBINTL)\
+ $(LIBTHREAD) $(LIBUNISTRING) $(SERVENT_LIB)
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib $(CODE_COVERAGE_CPPFLAGS)
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+
+../lib/libgnu.a:
+ cd ../lib && $(MAKE) $(AM_MAKEFLAGS)
+
+build_info.c: $(srcdir)/Makefile.am $(srcdir)/build_info.c.in
+ if test -n "$(VPATH)"; then cp "$(srcdir)/build_info.c.in" .; fi
+ $(PERL) "$(top_srcdir)/build-aux/build_info.pl" \
+ "$(top_builddir)/src/build_info.c"
+ if test -n "$(VPATH)"; then rm -f build_info.c.in; fi
+
+ESCAPEQUOTE = sed -e 's/[\\"]/\\&/g' -e 's/\\"/"/' -e 's/\\";$$/";/'
+version.c: $(wget_SOURCES) ../lib/libgnu.a
+ echo '/* version.c */' > $@
+ echo '/* Autogenerated by Makefile - DO NOT EDIT */' >> $@
+ echo '' >> $@
+ echo '#include "version.h"' >> $@
+ echo 'const char *version_string = "@VERSION@";' >> $@
+ echo 'const char *compilation_string = "'$(COMPILE)'";' \
+ | $(ESCAPEQUOTE) >> $@
+ echo 'const char *link_string = "'$(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) $(LIBS) $(wget_LDADD)'";' \
+ | $(ESCAPEQUOTE) >> $@
+
+css.c: $(srcdir)/css.l
+ $(LEX) $(LFLAGS) -o$@ $^
+
+css_.c: css.c
+ echo '#include "wget.h"' > $@
+ cat css.c >> $@
+
+distclean-local:
+ rm -f css.c css_.c
+
+check_LIBRARIES = libunittest.a
+libunittest_a_SOURCES = $(wget_SOURCES) build_info.c
+nodist_libunittest_a_SOURCES = version.c
+libunittest_a_CPPFLAGS = -DTESTING "-I$(top_builddir)/lib" "-I$(top_srcdir)/lib" $(CODE_COVERAGE_CPPLAGS)
+libunittest_a_LIBADD = $(LIBOBJS)
+
+CLEANFILES = *~ *.bak core core.[0-9]* build_info.c version.c
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..3e7c745
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,2804 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `wget' utility
+# Copyright (C) 1995-2011, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = wget$(EXEEXT)
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS)
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libunittest_a_AR = $(AR) $(ARFLAGS)
+libunittest_a_DEPENDENCIES = $(LIBOBJS)
+am__libunittest_a_SOURCES_DIST = connect.c convert.c cookies.c ftp.c \
+ css_.c css-url.c ftp-basic.c ftp-ls.c hash.c host.c hsts.c \
+ html-parse.c html-url.c http.c init.c log.c main.c netrc.c \
+ progress.c ptimer.c recur.c res.c retr.c spider.c url.c warc.c \
+ xattr.c utils.c exits.c build_info.c iri.c metalink.c \
+ css-url.h css-tokens.h connect.h convert.h cookies.h ftp.h \
+ hash.h host.h hsts.h html-parse.h html-url.h http.h \
+ http-ntlm.h init.h log.h mswindows.h netrc.h options.h \
+ progress.h ptimer.h recur.h res.h retr.h spider.h ssl.h \
+ sysdep.h url.h warc.h utils.h wget.h iri.h exits.h version.h \
+ metalink.h xattr.h
+@WITH_XATTR_TRUE@am__objects_1 = libunittest_a-xattr.$(OBJEXT)
+@IRI_IS_ENABLED_TRUE@am__objects_2 = libunittest_a-iri.$(OBJEXT)
+@METALINK_IS_ENABLED_TRUE@am__objects_3 = \
+@METALINK_IS_ENABLED_TRUE@ libunittest_a-metalink.$(OBJEXT)
+am__objects_4 = libunittest_a-connect.$(OBJEXT) \
+ libunittest_a-convert.$(OBJEXT) \
+ libunittest_a-cookies.$(OBJEXT) libunittest_a-ftp.$(OBJEXT) \
+ libunittest_a-css_.$(OBJEXT) libunittest_a-css-url.$(OBJEXT) \
+ libunittest_a-ftp-basic.$(OBJEXT) \
+ libunittest_a-ftp-ls.$(OBJEXT) libunittest_a-hash.$(OBJEXT) \
+ libunittest_a-host.$(OBJEXT) libunittest_a-hsts.$(OBJEXT) \
+ libunittest_a-html-parse.$(OBJEXT) \
+ libunittest_a-html-url.$(OBJEXT) libunittest_a-http.$(OBJEXT) \
+ libunittest_a-init.$(OBJEXT) libunittest_a-log.$(OBJEXT) \
+ libunittest_a-main.$(OBJEXT) libunittest_a-netrc.$(OBJEXT) \
+ libunittest_a-progress.$(OBJEXT) \
+ libunittest_a-ptimer.$(OBJEXT) libunittest_a-recur.$(OBJEXT) \
+ libunittest_a-res.$(OBJEXT) libunittest_a-retr.$(OBJEXT) \
+ libunittest_a-spider.$(OBJEXT) libunittest_a-url.$(OBJEXT) \
+ libunittest_a-warc.$(OBJEXT) $(am__objects_1) \
+ libunittest_a-utils.$(OBJEXT) libunittest_a-exits.$(OBJEXT) \
+ libunittest_a-build_info.$(OBJEXT) $(am__objects_2) \
+ $(am__objects_3)
+am_libunittest_a_OBJECTS = $(am__objects_4) \
+ libunittest_a-build_info.$(OBJEXT)
+nodist_libunittest_a_OBJECTS = libunittest_a-version.$(OBJEXT)
+libunittest_a_OBJECTS = $(am_libunittest_a_OBJECTS) \
+ $(nodist_libunittest_a_OBJECTS)
+am__wget_SOURCES_DIST = connect.c convert.c cookies.c ftp.c css_.c \
+ css-url.c ftp-basic.c ftp-ls.c hash.c host.c hsts.c \
+ html-parse.c html-url.c http.c init.c log.c main.c netrc.c \
+ progress.c ptimer.c recur.c res.c retr.c spider.c url.c warc.c \
+ xattr.c utils.c exits.c build_info.c iri.c metalink.c \
+ css-url.h css-tokens.h connect.h convert.h cookies.h ftp.h \
+ hash.h host.h hsts.h html-parse.h html-url.h http.h \
+ http-ntlm.h init.h log.h mswindows.h netrc.h options.h \
+ progress.h ptimer.h recur.h res.h retr.h spider.h ssl.h \
+ sysdep.h url.h warc.h utils.h wget.h iri.h exits.h version.h \
+ metalink.h xattr.h
+@WITH_XATTR_TRUE@am__objects_5 = xattr.$(OBJEXT)
+@IRI_IS_ENABLED_TRUE@am__objects_6 = iri.$(OBJEXT)
+@METALINK_IS_ENABLED_TRUE@am__objects_7 = metalink.$(OBJEXT)
+am_wget_OBJECTS = connect.$(OBJEXT) convert.$(OBJEXT) \
+ cookies.$(OBJEXT) ftp.$(OBJEXT) css_.$(OBJEXT) \
+ css-url.$(OBJEXT) ftp-basic.$(OBJEXT) ftp-ls.$(OBJEXT) \
+ hash.$(OBJEXT) host.$(OBJEXT) hsts.$(OBJEXT) \
+ html-parse.$(OBJEXT) html-url.$(OBJEXT) http.$(OBJEXT) \
+ init.$(OBJEXT) log.$(OBJEXT) main.$(OBJEXT) netrc.$(OBJEXT) \
+ progress.$(OBJEXT) ptimer.$(OBJEXT) recur.$(OBJEXT) \
+ res.$(OBJEXT) retr.$(OBJEXT) spider.$(OBJEXT) url.$(OBJEXT) \
+ warc.$(OBJEXT) $(am__objects_5) utils.$(OBJEXT) \
+ exits.$(OBJEXT) build_info.$(OBJEXT) $(am__objects_6) \
+ $(am__objects_7)
+nodist_wget_OBJECTS = version.$(OBJEXT)
+wget_OBJECTS = $(am_wget_OBJECTS) $(nodist_wget_OBJECTS)
+wget_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+wget_DEPENDENCIES = $(LIBOBJS) ../lib/libgnu.a $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = $(DEPDIR)/ftp-opie.Po $(DEPDIR)/gnutls.Po \
+ $(DEPDIR)/http-ntlm.Po $(DEPDIR)/mswindows.Po \
+ $(DEPDIR)/openssl.Po ./$(DEPDIR)/build_info.Po \
+ ./$(DEPDIR)/connect.Po ./$(DEPDIR)/convert.Po \
+ ./$(DEPDIR)/cookies.Po ./$(DEPDIR)/css-url.Po \
+ ./$(DEPDIR)/css_.Po ./$(DEPDIR)/exits.Po \
+ ./$(DEPDIR)/ftp-basic.Po ./$(DEPDIR)/ftp-ls.Po \
+ ./$(DEPDIR)/ftp.Po ./$(DEPDIR)/hash.Po ./$(DEPDIR)/host.Po \
+ ./$(DEPDIR)/hsts.Po ./$(DEPDIR)/html-parse.Po \
+ ./$(DEPDIR)/html-url.Po ./$(DEPDIR)/http.Po \
+ ./$(DEPDIR)/init.Po ./$(DEPDIR)/iri.Po \
+ ./$(DEPDIR)/libunittest_a-build_info.Po \
+ ./$(DEPDIR)/libunittest_a-connect.Po \
+ ./$(DEPDIR)/libunittest_a-convert.Po \
+ ./$(DEPDIR)/libunittest_a-cookies.Po \
+ ./$(DEPDIR)/libunittest_a-css-url.Po \
+ ./$(DEPDIR)/libunittest_a-css_.Po \
+ ./$(DEPDIR)/libunittest_a-exits.Po \
+ ./$(DEPDIR)/libunittest_a-ftp-basic.Po \
+ ./$(DEPDIR)/libunittest_a-ftp-ls.Po \
+ ./$(DEPDIR)/libunittest_a-ftp.Po \
+ ./$(DEPDIR)/libunittest_a-hash.Po \
+ ./$(DEPDIR)/libunittest_a-host.Po \
+ ./$(DEPDIR)/libunittest_a-hsts.Po \
+ ./$(DEPDIR)/libunittest_a-html-parse.Po \
+ ./$(DEPDIR)/libunittest_a-html-url.Po \
+ ./$(DEPDIR)/libunittest_a-http.Po \
+ ./$(DEPDIR)/libunittest_a-init.Po \
+ ./$(DEPDIR)/libunittest_a-iri.Po \
+ ./$(DEPDIR)/libunittest_a-log.Po \
+ ./$(DEPDIR)/libunittest_a-main.Po \
+ ./$(DEPDIR)/libunittest_a-metalink.Po \
+ ./$(DEPDIR)/libunittest_a-netrc.Po \
+ ./$(DEPDIR)/libunittest_a-progress.Po \
+ ./$(DEPDIR)/libunittest_a-ptimer.Po \
+ ./$(DEPDIR)/libunittest_a-recur.Po \
+ ./$(DEPDIR)/libunittest_a-res.Po \
+ ./$(DEPDIR)/libunittest_a-retr.Po \
+ ./$(DEPDIR)/libunittest_a-spider.Po \
+ ./$(DEPDIR)/libunittest_a-url.Po \
+ ./$(DEPDIR)/libunittest_a-utils.Po \
+ ./$(DEPDIR)/libunittest_a-version.Po \
+ ./$(DEPDIR)/libunittest_a-warc.Po \
+ ./$(DEPDIR)/libunittest_a-xattr.Po ./$(DEPDIR)/log.Po \
+ ./$(DEPDIR)/main.Po ./$(DEPDIR)/metalink.Po \
+ ./$(DEPDIR)/netrc.Po ./$(DEPDIR)/progress.Po \
+ ./$(DEPDIR)/ptimer.Po ./$(DEPDIR)/recur.Po ./$(DEPDIR)/res.Po \
+ ./$(DEPDIR)/retr.Po ./$(DEPDIR)/spider.Po ./$(DEPDIR)/url.Po \
+ ./$(DEPDIR)/utils.Po ./$(DEPDIR)/version.Po \
+ ./$(DEPDIR)/warc.Po ./$(DEPDIR)/xattr.Po
+am__mv = mv -f
+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 =
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(libunittest_a_SOURCES) $(nodist_libunittest_a_SOURCES) \
+ $(wget_SOURCES) $(EXTRA_wget_SOURCES) $(nodist_wget_SOURCES)
+DIST_SOURCES = $(am__libunittest_a_SOURCES_DIST) \
+ $(am__wget_SOURCES_DIST) $(EXTRA_wget_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \
+ 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
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(top_srcdir)/build-aux/depcomp ftp-opie.c gnutls.c \
+ http-ntlm.c mswindows.c openssl.c
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+
+# The following line is losing on some versions of make!
+DEFS = @DEFS@ -DSYSTEM_WGETRC=\"$(sysconfdir)/wgetrc\" -DLOCALEDIR=\"$(localedir)\"
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+@IRI_IS_ENABLED_TRUE@IRI_OBJ = iri.c
+@METALINK_IS_ENABLED_TRUE@METALINK_OBJ = metalink.c
+@WITH_XATTR_TRUE@XATTR_OBJ = xattr.c
+EXTRA_DIST = css.l css.c css_.c build_info.c.in build_info.c
+wget_SOURCES = connect.c convert.c cookies.c ftp.c \
+ css_.c css-url.c \
+ ftp-basic.c ftp-ls.c hash.c host.c hsts.c html-parse.c html-url.c \
+ http.c init.c log.c main.c netrc.c progress.c ptimer.c \
+ recur.c res.c retr.c spider.c url.c warc.c $(XATTR_OBJ) \
+ utils.c exits.c build_info.c $(IRI_OBJ) $(METALINK_OBJ) \
+ css-url.h css-tokens.h connect.h convert.h cookies.h \
+ ftp.h hash.h host.h hsts.h html-parse.h html-url.h \
+ http.h http-ntlm.h init.h log.h mswindows.h netrc.h \
+ options.h progress.h ptimer.h recur.h res.h retr.h \
+ spider.h ssl.h sysdep.h url.h warc.h utils.h wget.h iri.h \
+ exits.h version.h metalink.h xattr.h
+
+nodist_wget_SOURCES = version.c
+EXTRA_wget_SOURCES = iri.c
+LDADD = $(CODE_COVERAGE_LIBS) $(LIBOBJS) ../lib/libgnu.a $(GETADDRINFO_LIB) $(HOSTENT_LIB)\
+ $(INET_NTOP_LIB) $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO)\
+ $(LIB_NANOSLEEP) $(LIB_POSIX_SPAWN) $(LIB_SELECT) $(LIBICONV) $(LIBINTL)\
+ $(LIBTHREAD) $(LIBUNISTRING) $(SERVENT_LIB)
+
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib $(CODE_COVERAGE_CPPFLAGS)
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) $(CODE_COVERAGE_CFLAGS)
+ESCAPEQUOTE = sed -e 's/[\\"]/\\&/g' -e 's/\\"/"/' -e 's/\\";$$/";/'
+check_LIBRARIES = libunittest.a
+libunittest_a_SOURCES = $(wget_SOURCES) build_info.c
+nodist_libunittest_a_SOURCES = version.c
+libunittest_a_CPPFLAGS = -DTESTING "-I$(top_builddir)/lib" "-I$(top_srcdir)/lib" $(CODE_COVERAGE_CPPLAGS)
+libunittest_a_LIBADD = $(LIBOBJS)
+CLEANFILES = *~ *.bak core core.[0-9]* build_info.c version.c
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu src/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+ @rm -f stamp-h1
+ cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(srcdir)/config.h.in: $(am__configure_deps)
+ ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+clean-checkLIBRARIES:
+ -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+
+libunittest.a: $(libunittest_a_OBJECTS) $(libunittest_a_DEPENDENCIES) $(EXTRA_libunittest_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libunittest.a
+ $(AM_V_AR)$(libunittest_a_AR) libunittest.a $(libunittest_a_OBJECTS) $(libunittest_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libunittest.a
+
+wget$(EXEEXT): $(wget_OBJECTS) $(wget_DEPENDENCIES) $(EXTRA_wget_DEPENDENCIES)
+ @rm -f wget$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(wget_OBJECTS) $(wget_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ftp-opie.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gnutls.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/http-ntlm.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mswindows.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/openssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build_info.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convert.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cookies.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css-url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/css_.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exits.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp-basic.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp-ls.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/host.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hsts.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/html-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/html-url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iri.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-build_info.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-connect.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-convert.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-cookies.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-css-url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-css_.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-exits.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-ftp-basic.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-ftp-ls.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-ftp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-hash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-host.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-hsts.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-html-parse.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-html-url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-http.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-init.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-iri.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-log.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-metalink.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-netrc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-progress.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-ptimer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-recur.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-res.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-retr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-spider.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-version.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-warc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunittest_a-xattr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metalink.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netrc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptimer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recur.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/res.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/retr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spider.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/url.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/warc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xattr.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+libunittest_a-connect.o: connect.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-connect.o -MD -MP -MF $(DEPDIR)/libunittest_a-connect.Tpo -c -o libunittest_a-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-connect.Tpo $(DEPDIR)/libunittest_a-connect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='connect.c' object='libunittest_a-connect.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c
+
+libunittest_a-connect.obj: connect.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-connect.obj -MD -MP -MF $(DEPDIR)/libunittest_a-connect.Tpo -c -o libunittest_a-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-connect.Tpo $(DEPDIR)/libunittest_a-connect.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='connect.c' object='libunittest_a-connect.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi`
+
+libunittest_a-convert.o: convert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-convert.o -MD -MP -MF $(DEPDIR)/libunittest_a-convert.Tpo -c -o libunittest_a-convert.o `test -f 'convert.c' || echo '$(srcdir)/'`convert.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-convert.Tpo $(DEPDIR)/libunittest_a-convert.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convert.c' object='libunittest_a-convert.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-convert.o `test -f 'convert.c' || echo '$(srcdir)/'`convert.c
+
+libunittest_a-convert.obj: convert.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-convert.obj -MD -MP -MF $(DEPDIR)/libunittest_a-convert.Tpo -c -o libunittest_a-convert.obj `if test -f 'convert.c'; then $(CYGPATH_W) 'convert.c'; else $(CYGPATH_W) '$(srcdir)/convert.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-convert.Tpo $(DEPDIR)/libunittest_a-convert.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convert.c' object='libunittest_a-convert.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-convert.obj `if test -f 'convert.c'; then $(CYGPATH_W) 'convert.c'; else $(CYGPATH_W) '$(srcdir)/convert.c'; fi`
+
+libunittest_a-cookies.o: cookies.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-cookies.o -MD -MP -MF $(DEPDIR)/libunittest_a-cookies.Tpo -c -o libunittest_a-cookies.o `test -f 'cookies.c' || echo '$(srcdir)/'`cookies.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-cookies.Tpo $(DEPDIR)/libunittest_a-cookies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cookies.c' object='libunittest_a-cookies.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-cookies.o `test -f 'cookies.c' || echo '$(srcdir)/'`cookies.c
+
+libunittest_a-cookies.obj: cookies.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-cookies.obj -MD -MP -MF $(DEPDIR)/libunittest_a-cookies.Tpo -c -o libunittest_a-cookies.obj `if test -f 'cookies.c'; then $(CYGPATH_W) 'cookies.c'; else $(CYGPATH_W) '$(srcdir)/cookies.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-cookies.Tpo $(DEPDIR)/libunittest_a-cookies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cookies.c' object='libunittest_a-cookies.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-cookies.obj `if test -f 'cookies.c'; then $(CYGPATH_W) 'cookies.c'; else $(CYGPATH_W) '$(srcdir)/cookies.c'; fi`
+
+libunittest_a-ftp.o: ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp.o -MD -MP -MF $(DEPDIR)/libunittest_a-ftp.Tpo -c -o libunittest_a-ftp.o `test -f 'ftp.c' || echo '$(srcdir)/'`ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp.Tpo $(DEPDIR)/libunittest_a-ftp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp.c' object='libunittest_a-ftp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp.o `test -f 'ftp.c' || echo '$(srcdir)/'`ftp.c
+
+libunittest_a-ftp.obj: ftp.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp.obj -MD -MP -MF $(DEPDIR)/libunittest_a-ftp.Tpo -c -o libunittest_a-ftp.obj `if test -f 'ftp.c'; then $(CYGPATH_W) 'ftp.c'; else $(CYGPATH_W) '$(srcdir)/ftp.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp.Tpo $(DEPDIR)/libunittest_a-ftp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp.c' object='libunittest_a-ftp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp.obj `if test -f 'ftp.c'; then $(CYGPATH_W) 'ftp.c'; else $(CYGPATH_W) '$(srcdir)/ftp.c'; fi`
+
+libunittest_a-css_.o: css_.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-css_.o -MD -MP -MF $(DEPDIR)/libunittest_a-css_.Tpo -c -o libunittest_a-css_.o `test -f 'css_.c' || echo '$(srcdir)/'`css_.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-css_.Tpo $(DEPDIR)/libunittest_a-css_.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='css_.c' object='libunittest_a-css_.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-css_.o `test -f 'css_.c' || echo '$(srcdir)/'`css_.c
+
+libunittest_a-css_.obj: css_.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-css_.obj -MD -MP -MF $(DEPDIR)/libunittest_a-css_.Tpo -c -o libunittest_a-css_.obj `if test -f 'css_.c'; then $(CYGPATH_W) 'css_.c'; else $(CYGPATH_W) '$(srcdir)/css_.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-css_.Tpo $(DEPDIR)/libunittest_a-css_.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='css_.c' object='libunittest_a-css_.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-css_.obj `if test -f 'css_.c'; then $(CYGPATH_W) 'css_.c'; else $(CYGPATH_W) '$(srcdir)/css_.c'; fi`
+
+libunittest_a-css-url.o: css-url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-css-url.o -MD -MP -MF $(DEPDIR)/libunittest_a-css-url.Tpo -c -o libunittest_a-css-url.o `test -f 'css-url.c' || echo '$(srcdir)/'`css-url.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-css-url.Tpo $(DEPDIR)/libunittest_a-css-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='css-url.c' object='libunittest_a-css-url.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-css-url.o `test -f 'css-url.c' || echo '$(srcdir)/'`css-url.c
+
+libunittest_a-css-url.obj: css-url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-css-url.obj -MD -MP -MF $(DEPDIR)/libunittest_a-css-url.Tpo -c -o libunittest_a-css-url.obj `if test -f 'css-url.c'; then $(CYGPATH_W) 'css-url.c'; else $(CYGPATH_W) '$(srcdir)/css-url.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-css-url.Tpo $(DEPDIR)/libunittest_a-css-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='css-url.c' object='libunittest_a-css-url.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-css-url.obj `if test -f 'css-url.c'; then $(CYGPATH_W) 'css-url.c'; else $(CYGPATH_W) '$(srcdir)/css-url.c'; fi`
+
+libunittest_a-ftp-basic.o: ftp-basic.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp-basic.o -MD -MP -MF $(DEPDIR)/libunittest_a-ftp-basic.Tpo -c -o libunittest_a-ftp-basic.o `test -f 'ftp-basic.c' || echo '$(srcdir)/'`ftp-basic.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp-basic.Tpo $(DEPDIR)/libunittest_a-ftp-basic.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp-basic.c' object='libunittest_a-ftp-basic.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp-basic.o `test -f 'ftp-basic.c' || echo '$(srcdir)/'`ftp-basic.c
+
+libunittest_a-ftp-basic.obj: ftp-basic.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp-basic.obj -MD -MP -MF $(DEPDIR)/libunittest_a-ftp-basic.Tpo -c -o libunittest_a-ftp-basic.obj `if test -f 'ftp-basic.c'; then $(CYGPATH_W) 'ftp-basic.c'; else $(CYGPATH_W) '$(srcdir)/ftp-basic.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp-basic.Tpo $(DEPDIR)/libunittest_a-ftp-basic.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp-basic.c' object='libunittest_a-ftp-basic.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp-basic.obj `if test -f 'ftp-basic.c'; then $(CYGPATH_W) 'ftp-basic.c'; else $(CYGPATH_W) '$(srcdir)/ftp-basic.c'; fi`
+
+libunittest_a-ftp-ls.o: ftp-ls.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp-ls.o -MD -MP -MF $(DEPDIR)/libunittest_a-ftp-ls.Tpo -c -o libunittest_a-ftp-ls.o `test -f 'ftp-ls.c' || echo '$(srcdir)/'`ftp-ls.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp-ls.Tpo $(DEPDIR)/libunittest_a-ftp-ls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp-ls.c' object='libunittest_a-ftp-ls.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp-ls.o `test -f 'ftp-ls.c' || echo '$(srcdir)/'`ftp-ls.c
+
+libunittest_a-ftp-ls.obj: ftp-ls.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ftp-ls.obj -MD -MP -MF $(DEPDIR)/libunittest_a-ftp-ls.Tpo -c -o libunittest_a-ftp-ls.obj `if test -f 'ftp-ls.c'; then $(CYGPATH_W) 'ftp-ls.c'; else $(CYGPATH_W) '$(srcdir)/ftp-ls.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ftp-ls.Tpo $(DEPDIR)/libunittest_a-ftp-ls.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp-ls.c' object='libunittest_a-ftp-ls.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ftp-ls.obj `if test -f 'ftp-ls.c'; then $(CYGPATH_W) 'ftp-ls.c'; else $(CYGPATH_W) '$(srcdir)/ftp-ls.c'; fi`
+
+libunittest_a-hash.o: hash.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-hash.o -MD -MP -MF $(DEPDIR)/libunittest_a-hash.Tpo -c -o libunittest_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-hash.Tpo $(DEPDIR)/libunittest_a-hash.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hash.c' object='libunittest_a-hash.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-hash.o `test -f 'hash.c' || echo '$(srcdir)/'`hash.c
+
+libunittest_a-hash.obj: hash.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-hash.obj -MD -MP -MF $(DEPDIR)/libunittest_a-hash.Tpo -c -o libunittest_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-hash.Tpo $(DEPDIR)/libunittest_a-hash.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hash.c' object='libunittest_a-hash.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-hash.obj `if test -f 'hash.c'; then $(CYGPATH_W) 'hash.c'; else $(CYGPATH_W) '$(srcdir)/hash.c'; fi`
+
+libunittest_a-host.o: host.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-host.o -MD -MP -MF $(DEPDIR)/libunittest_a-host.Tpo -c -o libunittest_a-host.o `test -f 'host.c' || echo '$(srcdir)/'`host.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-host.Tpo $(DEPDIR)/libunittest_a-host.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='host.c' object='libunittest_a-host.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-host.o `test -f 'host.c' || echo '$(srcdir)/'`host.c
+
+libunittest_a-host.obj: host.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-host.obj -MD -MP -MF $(DEPDIR)/libunittest_a-host.Tpo -c -o libunittest_a-host.obj `if test -f 'host.c'; then $(CYGPATH_W) 'host.c'; else $(CYGPATH_W) '$(srcdir)/host.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-host.Tpo $(DEPDIR)/libunittest_a-host.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='host.c' object='libunittest_a-host.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-host.obj `if test -f 'host.c'; then $(CYGPATH_W) 'host.c'; else $(CYGPATH_W) '$(srcdir)/host.c'; fi`
+
+libunittest_a-hsts.o: hsts.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-hsts.o -MD -MP -MF $(DEPDIR)/libunittest_a-hsts.Tpo -c -o libunittest_a-hsts.o `test -f 'hsts.c' || echo '$(srcdir)/'`hsts.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-hsts.Tpo $(DEPDIR)/libunittest_a-hsts.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hsts.c' object='libunittest_a-hsts.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-hsts.o `test -f 'hsts.c' || echo '$(srcdir)/'`hsts.c
+
+libunittest_a-hsts.obj: hsts.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-hsts.obj -MD -MP -MF $(DEPDIR)/libunittest_a-hsts.Tpo -c -o libunittest_a-hsts.obj `if test -f 'hsts.c'; then $(CYGPATH_W) 'hsts.c'; else $(CYGPATH_W) '$(srcdir)/hsts.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-hsts.Tpo $(DEPDIR)/libunittest_a-hsts.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hsts.c' object='libunittest_a-hsts.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-hsts.obj `if test -f 'hsts.c'; then $(CYGPATH_W) 'hsts.c'; else $(CYGPATH_W) '$(srcdir)/hsts.c'; fi`
+
+libunittest_a-html-parse.o: html-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-html-parse.o -MD -MP -MF $(DEPDIR)/libunittest_a-html-parse.Tpo -c -o libunittest_a-html-parse.o `test -f 'html-parse.c' || echo '$(srcdir)/'`html-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-html-parse.Tpo $(DEPDIR)/libunittest_a-html-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='html-parse.c' object='libunittest_a-html-parse.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-html-parse.o `test -f 'html-parse.c' || echo '$(srcdir)/'`html-parse.c
+
+libunittest_a-html-parse.obj: html-parse.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-html-parse.obj -MD -MP -MF $(DEPDIR)/libunittest_a-html-parse.Tpo -c -o libunittest_a-html-parse.obj `if test -f 'html-parse.c'; then $(CYGPATH_W) 'html-parse.c'; else $(CYGPATH_W) '$(srcdir)/html-parse.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-html-parse.Tpo $(DEPDIR)/libunittest_a-html-parse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='html-parse.c' object='libunittest_a-html-parse.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-html-parse.obj `if test -f 'html-parse.c'; then $(CYGPATH_W) 'html-parse.c'; else $(CYGPATH_W) '$(srcdir)/html-parse.c'; fi`
+
+libunittest_a-html-url.o: html-url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-html-url.o -MD -MP -MF $(DEPDIR)/libunittest_a-html-url.Tpo -c -o libunittest_a-html-url.o `test -f 'html-url.c' || echo '$(srcdir)/'`html-url.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-html-url.Tpo $(DEPDIR)/libunittest_a-html-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='html-url.c' object='libunittest_a-html-url.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-html-url.o `test -f 'html-url.c' || echo '$(srcdir)/'`html-url.c
+
+libunittest_a-html-url.obj: html-url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-html-url.obj -MD -MP -MF $(DEPDIR)/libunittest_a-html-url.Tpo -c -o libunittest_a-html-url.obj `if test -f 'html-url.c'; then $(CYGPATH_W) 'html-url.c'; else $(CYGPATH_W) '$(srcdir)/html-url.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-html-url.Tpo $(DEPDIR)/libunittest_a-html-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='html-url.c' object='libunittest_a-html-url.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-html-url.obj `if test -f 'html-url.c'; then $(CYGPATH_W) 'html-url.c'; else $(CYGPATH_W) '$(srcdir)/html-url.c'; fi`
+
+libunittest_a-http.o: http.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-http.o -MD -MP -MF $(DEPDIR)/libunittest_a-http.Tpo -c -o libunittest_a-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-http.Tpo $(DEPDIR)/libunittest_a-http.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='http.c' object='libunittest_a-http.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c
+
+libunittest_a-http.obj: http.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-http.obj -MD -MP -MF $(DEPDIR)/libunittest_a-http.Tpo -c -o libunittest_a-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-http.Tpo $(DEPDIR)/libunittest_a-http.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='http.c' object='libunittest_a-http.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`
+
+libunittest_a-init.o: init.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-init.o -MD -MP -MF $(DEPDIR)/libunittest_a-init.Tpo -c -o libunittest_a-init.o `test -f 'init.c' || echo '$(srcdir)/'`init.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-init.Tpo $(DEPDIR)/libunittest_a-init.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init.c' object='libunittest_a-init.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-init.o `test -f 'init.c' || echo '$(srcdir)/'`init.c
+
+libunittest_a-init.obj: init.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-init.obj -MD -MP -MF $(DEPDIR)/libunittest_a-init.Tpo -c -o libunittest_a-init.obj `if test -f 'init.c'; then $(CYGPATH_W) 'init.c'; else $(CYGPATH_W) '$(srcdir)/init.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-init.Tpo $(DEPDIR)/libunittest_a-init.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init.c' object='libunittest_a-init.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-init.obj `if test -f 'init.c'; then $(CYGPATH_W) 'init.c'; else $(CYGPATH_W) '$(srcdir)/init.c'; fi`
+
+libunittest_a-log.o: log.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-log.o -MD -MP -MF $(DEPDIR)/libunittest_a-log.Tpo -c -o libunittest_a-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-log.Tpo $(DEPDIR)/libunittest_a-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='libunittest_a-log.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c
+
+libunittest_a-log.obj: log.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-log.obj -MD -MP -MF $(DEPDIR)/libunittest_a-log.Tpo -c -o libunittest_a-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-log.Tpo $(DEPDIR)/libunittest_a-log.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='libunittest_a-log.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi`
+
+libunittest_a-main.o: main.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-main.o -MD -MP -MF $(DEPDIR)/libunittest_a-main.Tpo -c -o libunittest_a-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-main.Tpo $(DEPDIR)/libunittest_a-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='libunittest_a-main.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+
+libunittest_a-main.obj: main.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-main.obj -MD -MP -MF $(DEPDIR)/libunittest_a-main.Tpo -c -o libunittest_a-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-main.Tpo $(DEPDIR)/libunittest_a-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='libunittest_a-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+
+libunittest_a-netrc.o: netrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-netrc.o -MD -MP -MF $(DEPDIR)/libunittest_a-netrc.Tpo -c -o libunittest_a-netrc.o `test -f 'netrc.c' || echo '$(srcdir)/'`netrc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-netrc.Tpo $(DEPDIR)/libunittest_a-netrc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netrc.c' object='libunittest_a-netrc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-netrc.o `test -f 'netrc.c' || echo '$(srcdir)/'`netrc.c
+
+libunittest_a-netrc.obj: netrc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-netrc.obj -MD -MP -MF $(DEPDIR)/libunittest_a-netrc.Tpo -c -o libunittest_a-netrc.obj `if test -f 'netrc.c'; then $(CYGPATH_W) 'netrc.c'; else $(CYGPATH_W) '$(srcdir)/netrc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-netrc.Tpo $(DEPDIR)/libunittest_a-netrc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netrc.c' object='libunittest_a-netrc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-netrc.obj `if test -f 'netrc.c'; then $(CYGPATH_W) 'netrc.c'; else $(CYGPATH_W) '$(srcdir)/netrc.c'; fi`
+
+libunittest_a-progress.o: progress.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-progress.o -MD -MP -MF $(DEPDIR)/libunittest_a-progress.Tpo -c -o libunittest_a-progress.o `test -f 'progress.c' || echo '$(srcdir)/'`progress.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-progress.Tpo $(DEPDIR)/libunittest_a-progress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='progress.c' object='libunittest_a-progress.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-progress.o `test -f 'progress.c' || echo '$(srcdir)/'`progress.c
+
+libunittest_a-progress.obj: progress.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-progress.obj -MD -MP -MF $(DEPDIR)/libunittest_a-progress.Tpo -c -o libunittest_a-progress.obj `if test -f 'progress.c'; then $(CYGPATH_W) 'progress.c'; else $(CYGPATH_W) '$(srcdir)/progress.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-progress.Tpo $(DEPDIR)/libunittest_a-progress.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='progress.c' object='libunittest_a-progress.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-progress.obj `if test -f 'progress.c'; then $(CYGPATH_W) 'progress.c'; else $(CYGPATH_W) '$(srcdir)/progress.c'; fi`
+
+libunittest_a-ptimer.o: ptimer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ptimer.o -MD -MP -MF $(DEPDIR)/libunittest_a-ptimer.Tpo -c -o libunittest_a-ptimer.o `test -f 'ptimer.c' || echo '$(srcdir)/'`ptimer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ptimer.Tpo $(DEPDIR)/libunittest_a-ptimer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ptimer.c' object='libunittest_a-ptimer.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ptimer.o `test -f 'ptimer.c' || echo '$(srcdir)/'`ptimer.c
+
+libunittest_a-ptimer.obj: ptimer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-ptimer.obj -MD -MP -MF $(DEPDIR)/libunittest_a-ptimer.Tpo -c -o libunittest_a-ptimer.obj `if test -f 'ptimer.c'; then $(CYGPATH_W) 'ptimer.c'; else $(CYGPATH_W) '$(srcdir)/ptimer.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-ptimer.Tpo $(DEPDIR)/libunittest_a-ptimer.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ptimer.c' object='libunittest_a-ptimer.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-ptimer.obj `if test -f 'ptimer.c'; then $(CYGPATH_W) 'ptimer.c'; else $(CYGPATH_W) '$(srcdir)/ptimer.c'; fi`
+
+libunittest_a-recur.o: recur.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-recur.o -MD -MP -MF $(DEPDIR)/libunittest_a-recur.Tpo -c -o libunittest_a-recur.o `test -f 'recur.c' || echo '$(srcdir)/'`recur.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-recur.Tpo $(DEPDIR)/libunittest_a-recur.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recur.c' object='libunittest_a-recur.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-recur.o `test -f 'recur.c' || echo '$(srcdir)/'`recur.c
+
+libunittest_a-recur.obj: recur.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-recur.obj -MD -MP -MF $(DEPDIR)/libunittest_a-recur.Tpo -c -o libunittest_a-recur.obj `if test -f 'recur.c'; then $(CYGPATH_W) 'recur.c'; else $(CYGPATH_W) '$(srcdir)/recur.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-recur.Tpo $(DEPDIR)/libunittest_a-recur.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recur.c' object='libunittest_a-recur.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-recur.obj `if test -f 'recur.c'; then $(CYGPATH_W) 'recur.c'; else $(CYGPATH_W) '$(srcdir)/recur.c'; fi`
+
+libunittest_a-res.o: res.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-res.o -MD -MP -MF $(DEPDIR)/libunittest_a-res.Tpo -c -o libunittest_a-res.o `test -f 'res.c' || echo '$(srcdir)/'`res.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-res.Tpo $(DEPDIR)/libunittest_a-res.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='res.c' object='libunittest_a-res.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-res.o `test -f 'res.c' || echo '$(srcdir)/'`res.c
+
+libunittest_a-res.obj: res.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-res.obj -MD -MP -MF $(DEPDIR)/libunittest_a-res.Tpo -c -o libunittest_a-res.obj `if test -f 'res.c'; then $(CYGPATH_W) 'res.c'; else $(CYGPATH_W) '$(srcdir)/res.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-res.Tpo $(DEPDIR)/libunittest_a-res.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='res.c' object='libunittest_a-res.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-res.obj `if test -f 'res.c'; then $(CYGPATH_W) 'res.c'; else $(CYGPATH_W) '$(srcdir)/res.c'; fi`
+
+libunittest_a-retr.o: retr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-retr.o -MD -MP -MF $(DEPDIR)/libunittest_a-retr.Tpo -c -o libunittest_a-retr.o `test -f 'retr.c' || echo '$(srcdir)/'`retr.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-retr.Tpo $(DEPDIR)/libunittest_a-retr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='retr.c' object='libunittest_a-retr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-retr.o `test -f 'retr.c' || echo '$(srcdir)/'`retr.c
+
+libunittest_a-retr.obj: retr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-retr.obj -MD -MP -MF $(DEPDIR)/libunittest_a-retr.Tpo -c -o libunittest_a-retr.obj `if test -f 'retr.c'; then $(CYGPATH_W) 'retr.c'; else $(CYGPATH_W) '$(srcdir)/retr.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-retr.Tpo $(DEPDIR)/libunittest_a-retr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='retr.c' object='libunittest_a-retr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-retr.obj `if test -f 'retr.c'; then $(CYGPATH_W) 'retr.c'; else $(CYGPATH_W) '$(srcdir)/retr.c'; fi`
+
+libunittest_a-spider.o: spider.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-spider.o -MD -MP -MF $(DEPDIR)/libunittest_a-spider.Tpo -c -o libunittest_a-spider.o `test -f 'spider.c' || echo '$(srcdir)/'`spider.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-spider.Tpo $(DEPDIR)/libunittest_a-spider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spider.c' object='libunittest_a-spider.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-spider.o `test -f 'spider.c' || echo '$(srcdir)/'`spider.c
+
+libunittest_a-spider.obj: spider.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-spider.obj -MD -MP -MF $(DEPDIR)/libunittest_a-spider.Tpo -c -o libunittest_a-spider.obj `if test -f 'spider.c'; then $(CYGPATH_W) 'spider.c'; else $(CYGPATH_W) '$(srcdir)/spider.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-spider.Tpo $(DEPDIR)/libunittest_a-spider.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='spider.c' object='libunittest_a-spider.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-spider.obj `if test -f 'spider.c'; then $(CYGPATH_W) 'spider.c'; else $(CYGPATH_W) '$(srcdir)/spider.c'; fi`
+
+libunittest_a-url.o: url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-url.o -MD -MP -MF $(DEPDIR)/libunittest_a-url.Tpo -c -o libunittest_a-url.o `test -f 'url.c' || echo '$(srcdir)/'`url.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-url.Tpo $(DEPDIR)/libunittest_a-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='url.c' object='libunittest_a-url.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-url.o `test -f 'url.c' || echo '$(srcdir)/'`url.c
+
+libunittest_a-url.obj: url.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-url.obj -MD -MP -MF $(DEPDIR)/libunittest_a-url.Tpo -c -o libunittest_a-url.obj `if test -f 'url.c'; then $(CYGPATH_W) 'url.c'; else $(CYGPATH_W) '$(srcdir)/url.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-url.Tpo $(DEPDIR)/libunittest_a-url.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='url.c' object='libunittest_a-url.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-url.obj `if test -f 'url.c'; then $(CYGPATH_W) 'url.c'; else $(CYGPATH_W) '$(srcdir)/url.c'; fi`
+
+libunittest_a-warc.o: warc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-warc.o -MD -MP -MF $(DEPDIR)/libunittest_a-warc.Tpo -c -o libunittest_a-warc.o `test -f 'warc.c' || echo '$(srcdir)/'`warc.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-warc.Tpo $(DEPDIR)/libunittest_a-warc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='warc.c' object='libunittest_a-warc.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-warc.o `test -f 'warc.c' || echo '$(srcdir)/'`warc.c
+
+libunittest_a-warc.obj: warc.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-warc.obj -MD -MP -MF $(DEPDIR)/libunittest_a-warc.Tpo -c -o libunittest_a-warc.obj `if test -f 'warc.c'; then $(CYGPATH_W) 'warc.c'; else $(CYGPATH_W) '$(srcdir)/warc.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-warc.Tpo $(DEPDIR)/libunittest_a-warc.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='warc.c' object='libunittest_a-warc.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-warc.obj `if test -f 'warc.c'; then $(CYGPATH_W) 'warc.c'; else $(CYGPATH_W) '$(srcdir)/warc.c'; fi`
+
+libunittest_a-xattr.o: xattr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-xattr.o -MD -MP -MF $(DEPDIR)/libunittest_a-xattr.Tpo -c -o libunittest_a-xattr.o `test -f 'xattr.c' || echo '$(srcdir)/'`xattr.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-xattr.Tpo $(DEPDIR)/libunittest_a-xattr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xattr.c' object='libunittest_a-xattr.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-xattr.o `test -f 'xattr.c' || echo '$(srcdir)/'`xattr.c
+
+libunittest_a-xattr.obj: xattr.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-xattr.obj -MD -MP -MF $(DEPDIR)/libunittest_a-xattr.Tpo -c -o libunittest_a-xattr.obj `if test -f 'xattr.c'; then $(CYGPATH_W) 'xattr.c'; else $(CYGPATH_W) '$(srcdir)/xattr.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-xattr.Tpo $(DEPDIR)/libunittest_a-xattr.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xattr.c' object='libunittest_a-xattr.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-xattr.obj `if test -f 'xattr.c'; then $(CYGPATH_W) 'xattr.c'; else $(CYGPATH_W) '$(srcdir)/xattr.c'; fi`
+
+libunittest_a-utils.o: utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-utils.o -MD -MP -MF $(DEPDIR)/libunittest_a-utils.Tpo -c -o libunittest_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-utils.Tpo $(DEPDIR)/libunittest_a-utils.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libunittest_a-utils.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
+
+libunittest_a-utils.obj: utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-utils.obj -MD -MP -MF $(DEPDIR)/libunittest_a-utils.Tpo -c -o libunittest_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-utils.Tpo $(DEPDIR)/libunittest_a-utils.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libunittest_a-utils.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
+
+libunittest_a-exits.o: exits.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-exits.o -MD -MP -MF $(DEPDIR)/libunittest_a-exits.Tpo -c -o libunittest_a-exits.o `test -f 'exits.c' || echo '$(srcdir)/'`exits.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-exits.Tpo $(DEPDIR)/libunittest_a-exits.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='exits.c' object='libunittest_a-exits.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-exits.o `test -f 'exits.c' || echo '$(srcdir)/'`exits.c
+
+libunittest_a-exits.obj: exits.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-exits.obj -MD -MP -MF $(DEPDIR)/libunittest_a-exits.Tpo -c -o libunittest_a-exits.obj `if test -f 'exits.c'; then $(CYGPATH_W) 'exits.c'; else $(CYGPATH_W) '$(srcdir)/exits.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-exits.Tpo $(DEPDIR)/libunittest_a-exits.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='exits.c' object='libunittest_a-exits.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-exits.obj `if test -f 'exits.c'; then $(CYGPATH_W) 'exits.c'; else $(CYGPATH_W) '$(srcdir)/exits.c'; fi`
+
+libunittest_a-build_info.o: build_info.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-build_info.o -MD -MP -MF $(DEPDIR)/libunittest_a-build_info.Tpo -c -o libunittest_a-build_info.o `test -f 'build_info.c' || echo '$(srcdir)/'`build_info.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-build_info.Tpo $(DEPDIR)/libunittest_a-build_info.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='build_info.c' object='libunittest_a-build_info.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-build_info.o `test -f 'build_info.c' || echo '$(srcdir)/'`build_info.c
+
+libunittest_a-build_info.obj: build_info.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-build_info.obj -MD -MP -MF $(DEPDIR)/libunittest_a-build_info.Tpo -c -o libunittest_a-build_info.obj `if test -f 'build_info.c'; then $(CYGPATH_W) 'build_info.c'; else $(CYGPATH_W) '$(srcdir)/build_info.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-build_info.Tpo $(DEPDIR)/libunittest_a-build_info.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='build_info.c' object='libunittest_a-build_info.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-build_info.obj `if test -f 'build_info.c'; then $(CYGPATH_W) 'build_info.c'; else $(CYGPATH_W) '$(srcdir)/build_info.c'; fi`
+
+libunittest_a-iri.o: iri.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-iri.o -MD -MP -MF $(DEPDIR)/libunittest_a-iri.Tpo -c -o libunittest_a-iri.o `test -f 'iri.c' || echo '$(srcdir)/'`iri.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-iri.Tpo $(DEPDIR)/libunittest_a-iri.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iri.c' object='libunittest_a-iri.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-iri.o `test -f 'iri.c' || echo '$(srcdir)/'`iri.c
+
+libunittest_a-iri.obj: iri.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-iri.obj -MD -MP -MF $(DEPDIR)/libunittest_a-iri.Tpo -c -o libunittest_a-iri.obj `if test -f 'iri.c'; then $(CYGPATH_W) 'iri.c'; else $(CYGPATH_W) '$(srcdir)/iri.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-iri.Tpo $(DEPDIR)/libunittest_a-iri.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iri.c' object='libunittest_a-iri.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-iri.obj `if test -f 'iri.c'; then $(CYGPATH_W) 'iri.c'; else $(CYGPATH_W) '$(srcdir)/iri.c'; fi`
+
+libunittest_a-metalink.o: metalink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-metalink.o -MD -MP -MF $(DEPDIR)/libunittest_a-metalink.Tpo -c -o libunittest_a-metalink.o `test -f 'metalink.c' || echo '$(srcdir)/'`metalink.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-metalink.Tpo $(DEPDIR)/libunittest_a-metalink.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metalink.c' object='libunittest_a-metalink.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-metalink.o `test -f 'metalink.c' || echo '$(srcdir)/'`metalink.c
+
+libunittest_a-metalink.obj: metalink.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-metalink.obj -MD -MP -MF $(DEPDIR)/libunittest_a-metalink.Tpo -c -o libunittest_a-metalink.obj `if test -f 'metalink.c'; then $(CYGPATH_W) 'metalink.c'; else $(CYGPATH_W) '$(srcdir)/metalink.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-metalink.Tpo $(DEPDIR)/libunittest_a-metalink.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='metalink.c' object='libunittest_a-metalink.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-metalink.obj `if test -f 'metalink.c'; then $(CYGPATH_W) 'metalink.c'; else $(CYGPATH_W) '$(srcdir)/metalink.c'; fi`
+
+libunittest_a-version.o: version.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-version.o -MD -MP -MF $(DEPDIR)/libunittest_a-version.Tpo -c -o libunittest_a-version.o `test -f 'version.c' || echo '$(srcdir)/'`version.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-version.Tpo $(DEPDIR)/libunittest_a-version.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='version.c' object='libunittest_a-version.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-version.o `test -f 'version.c' || echo '$(srcdir)/'`version.c
+
+libunittest_a-version.obj: version.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libunittest_a-version.obj -MD -MP -MF $(DEPDIR)/libunittest_a-version.Tpo -c -o libunittest_a-version.obj `if test -f 'version.c'; then $(CYGPATH_W) 'version.c'; else $(CYGPATH_W) '$(srcdir)/version.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libunittest_a-version.Tpo $(DEPDIR)/libunittest_a-version.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='version.c' object='libunittest_a-version.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunittest_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libunittest_a-version.obj `if test -f 'version.c'; then $(CYGPATH_W) 'version.c'; else $(CYGPATH_W) '$(srcdir)/version.c'; fi`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_LIBRARIES)
+check: check-am
+all-am: Makefile $(PROGRAMS) config.h
+installdirs:
+ for dir in "$(DESTDIR)$(bindir)"; 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)
+
+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-binPROGRAMS clean-checkLIBRARIES clean-generic \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f $(DEPDIR)/ftp-opie.Po
+ -rm -f $(DEPDIR)/gnutls.Po
+ -rm -f $(DEPDIR)/http-ntlm.Po
+ -rm -f $(DEPDIR)/mswindows.Po
+ -rm -f $(DEPDIR)/openssl.Po
+ -rm -f ./$(DEPDIR)/build_info.Po
+ -rm -f ./$(DEPDIR)/connect.Po
+ -rm -f ./$(DEPDIR)/convert.Po
+ -rm -f ./$(DEPDIR)/cookies.Po
+ -rm -f ./$(DEPDIR)/css-url.Po
+ -rm -f ./$(DEPDIR)/css_.Po
+ -rm -f ./$(DEPDIR)/exits.Po
+ -rm -f ./$(DEPDIR)/ftp-basic.Po
+ -rm -f ./$(DEPDIR)/ftp-ls.Po
+ -rm -f ./$(DEPDIR)/ftp.Po
+ -rm -f ./$(DEPDIR)/hash.Po
+ -rm -f ./$(DEPDIR)/host.Po
+ -rm -f ./$(DEPDIR)/hsts.Po
+ -rm -f ./$(DEPDIR)/html-parse.Po
+ -rm -f ./$(DEPDIR)/html-url.Po
+ -rm -f ./$(DEPDIR)/http.Po
+ -rm -f ./$(DEPDIR)/init.Po
+ -rm -f ./$(DEPDIR)/iri.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-build_info.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-connect.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-convert.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-cookies.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-css-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-css_.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-exits.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp-basic.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp-ls.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-hash.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-host.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-hsts.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-html-parse.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-html-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-http.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-init.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-iri.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-log.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-main.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-metalink.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-netrc.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-progress.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ptimer.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-recur.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-res.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-retr.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-spider.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-utils.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-version.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-warc.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-xattr.Po
+ -rm -f ./$(DEPDIR)/log.Po
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/metalink.Po
+ -rm -f ./$(DEPDIR)/netrc.Po
+ -rm -f ./$(DEPDIR)/progress.Po
+ -rm -f ./$(DEPDIR)/ptimer.Po
+ -rm -f ./$(DEPDIR)/recur.Po
+ -rm -f ./$(DEPDIR)/res.Po
+ -rm -f ./$(DEPDIR)/retr.Po
+ -rm -f ./$(DEPDIR)/spider.Po
+ -rm -f ./$(DEPDIR)/url.Po
+ -rm -f ./$(DEPDIR)/utils.Po
+ -rm -f ./$(DEPDIR)/version.Po
+ -rm -f ./$(DEPDIR)/warc.Po
+ -rm -f ./$(DEPDIR)/xattr.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-hdr distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f $(DEPDIR)/ftp-opie.Po
+ -rm -f $(DEPDIR)/gnutls.Po
+ -rm -f $(DEPDIR)/http-ntlm.Po
+ -rm -f $(DEPDIR)/mswindows.Po
+ -rm -f $(DEPDIR)/openssl.Po
+ -rm -f ./$(DEPDIR)/build_info.Po
+ -rm -f ./$(DEPDIR)/connect.Po
+ -rm -f ./$(DEPDIR)/convert.Po
+ -rm -f ./$(DEPDIR)/cookies.Po
+ -rm -f ./$(DEPDIR)/css-url.Po
+ -rm -f ./$(DEPDIR)/css_.Po
+ -rm -f ./$(DEPDIR)/exits.Po
+ -rm -f ./$(DEPDIR)/ftp-basic.Po
+ -rm -f ./$(DEPDIR)/ftp-ls.Po
+ -rm -f ./$(DEPDIR)/ftp.Po
+ -rm -f ./$(DEPDIR)/hash.Po
+ -rm -f ./$(DEPDIR)/host.Po
+ -rm -f ./$(DEPDIR)/hsts.Po
+ -rm -f ./$(DEPDIR)/html-parse.Po
+ -rm -f ./$(DEPDIR)/html-url.Po
+ -rm -f ./$(DEPDIR)/http.Po
+ -rm -f ./$(DEPDIR)/init.Po
+ -rm -f ./$(DEPDIR)/iri.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-build_info.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-connect.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-convert.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-cookies.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-css-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-css_.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-exits.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp-basic.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp-ls.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ftp.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-hash.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-host.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-hsts.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-html-parse.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-html-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-http.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-init.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-iri.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-log.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-main.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-metalink.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-netrc.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-progress.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-ptimer.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-recur.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-res.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-retr.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-spider.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-url.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-utils.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-version.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-warc.Po
+ -rm -f ./$(DEPDIR)/libunittest_a-xattr.Po
+ -rm -f ./$(DEPDIR)/log.Po
+ -rm -f ./$(DEPDIR)/main.Po
+ -rm -f ./$(DEPDIR)/metalink.Po
+ -rm -f ./$(DEPDIR)/netrc.Po
+ -rm -f ./$(DEPDIR)/progress.Po
+ -rm -f ./$(DEPDIR)/ptimer.Po
+ -rm -f ./$(DEPDIR)/recur.Po
+ -rm -f ./$(DEPDIR)/res.Po
+ -rm -f ./$(DEPDIR)/retr.Po
+ -rm -f ./$(DEPDIR)/spider.Po
+ -rm -f ./$(DEPDIR)/url.Po
+ -rm -f ./$(DEPDIR)/utils.Po
+ -rm -f ./$(DEPDIR)/version.Po
+ -rm -f ./$(DEPDIR)/warc.Po
+ -rm -f ./$(DEPDIR)/xattr.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-binPROGRAMS clean-checkLIBRARIES clean-generic \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-hdr distclean-local distclean-tags \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am install-binPROGRAMS 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-compile mostlyclean-generic pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+../lib/libgnu.a:
+ cd ../lib && $(MAKE) $(AM_MAKEFLAGS)
+
+build_info.c: $(srcdir)/Makefile.am $(srcdir)/build_info.c.in
+ if test -n "$(VPATH)"; then cp "$(srcdir)/build_info.c.in" .; fi
+ $(PERL) "$(top_srcdir)/build-aux/build_info.pl" \
+ "$(top_builddir)/src/build_info.c"
+ if test -n "$(VPATH)"; then rm -f build_info.c.in; fi
+version.c: $(wget_SOURCES) ../lib/libgnu.a
+ echo '/* version.c */' > $@
+ echo '/* Autogenerated by Makefile - DO NOT EDIT */' >> $@
+ echo '' >> $@
+ echo '#include "version.h"' >> $@
+ echo 'const char *version_string = "@VERSION@";' >> $@
+ echo 'const char *compilation_string = "'$(COMPILE)'";' \
+ | $(ESCAPEQUOTE) >> $@
+ echo 'const char *link_string = "'$(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) $(LIBS) $(wget_LDADD)'";' \
+ | $(ESCAPEQUOTE) >> $@
+
+css.c: $(srcdir)/css.l
+ $(LEX) $(LFLAGS) -o$@ $^
+
+css_.c: css.c
+ echo '#include "wget.h"' > $@
+ cat css.c >> $@
+
+distclean-local:
+ rm -f css.c css_.c
+
+# 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/src/build_info.c b/src/build_info.c
new file mode 100644
index 0000000..bf6e6a9
--- /dev/null
+++ b/src/build_info.c
@@ -0,0 +1,101 @@
+/* Autogenerated by build_info.pl - DO NOT EDIT */
+
+/* This stores global variables that are initialized with
+ preprocessor declarations for output with the --version flag.
+
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+ 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. */
+
+#include "wget.h"
+#include <stdio.h>
+#include "version.h"
+
+const char *compiled_features[] =
+{
+
+#if defined HAVE_LIBCARES
+ "+cares",
+#else
+ "-cares",
+#endif
+
+#if defined ENABLE_DIGEST
+ "+digest",
+#else
+ "-digest",
+#endif
+
+#if defined HAVE_GPGME
+ "+gpgme",
+#else
+ "-gpgme",
+#endif
+
+#if defined HAVE_SSL
+ "+https",
+#else
+ "-https",
+#endif
+
+#if defined ENABLE_IPV6
+ "+ipv6",
+#else
+ "-ipv6",
+#endif
+
+#if defined ENABLE_IRI
+ "+iri",
+#else
+ "-iri",
+#endif
+
+#if SIZEOF_OFF_T >= 8 || defined WINDOWS
+ "+large-file",
+#else
+ "-large-file",
+#endif
+
+#if defined HAVE_METALINK
+ "+metalink",
+#else
+ "-metalink",
+#endif
+
+#if defined ENABLE_NLS
+ "+nls",
+#else
+ "-nls",
+#endif
+
+#if defined ENABLE_NTLM
+ "+ntlm",
+#else
+ "-ntlm",
+#endif
+
+#if defined ENABLE_OPIE
+ "+opie",
+#else
+ "-opie",
+#endif
+
+#if defined HAVE_LIBPSL
+ "+psl",
+#else
+ "-psl",
+#endif
+
+#if defined HAVE_LIBSSL || defined HAVE_LIBSSL32
+ "+ssl/openssl",
+#elif defined HAVE_LIBGNUTLS
+ "+ssl/gnutls",
+#else
+ "-ssl",
+#endif
+
+
+ /* sentinel value */
+ NULL
+};
+
+
diff --git a/src/build_info.c.in b/src/build_info.c.in
new file mode 100644
index 0000000..c7493e9
--- /dev/null
+++ b/src/build_info.c.in
@@ -0,0 +1,18 @@
+digest defined ENABLE_DIGEST
+https defined HAVE_SSL
+ipv6 defined ENABLE_IPV6
+iri defined ENABLE_IRI
+large-file SIZEOF_OFF_T >= 8 || defined WINDOWS
+
+nls defined ENABLE_NLS
+ntlm defined ENABLE_NTLM
+opie defined ENABLE_OPIE
+psl defined HAVE_LIBPSL
+cares defined HAVE_LIBCARES
+
+metalink defined HAVE_METALINK
+gpgme defined HAVE_GPGME
+
+ssl choice:
+ openssl defined HAVE_LIBSSL || defined HAVE_LIBSSL32
+ gnutls defined HAVE_LIBGNUTLS
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644
index 0000000..936d100
--- /dev/null
+++ b/src/config.h.in
@@ -0,0 +1,2685 @@
+/* src/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to the number of bits in type 'ptrdiff_t'. */
+#undef BITSIZEOF_PTRDIFF_T
+
+/* Define to the number of bits in type 'sig_atomic_t'. */
+#undef BITSIZEOF_SIG_ATOMIC_T
+
+/* Define to the number of bits in type 'size_t'. */
+#undef BITSIZEOF_SIZE_T
+
+/* Define to the number of bits in type 'wchar_t'. */
+#undef BITSIZEOF_WCHAR_T
+
+/* Define to the number of bits in type 'wint_t'. */
+#undef BITSIZEOF_WINT_T
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define as the bit index in the word where to find bit 0 of the exponent of
+ 'double'. */
+#undef DBL_EXPBIT0_BIT
+
+/* Define as the word index where to find the exponent of 'double'. */
+#undef DBL_EXPBIT0_WORD
+
+/* the name of the file descriptor member of DIR */
+#undef DIR_FD_MEMBER_NAME
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
+/* Define to 1 if // is a file system root distinct from /. */
+#undef DOUBLE_SLASH_IS_DISTINCT_ROOT
+
+/* Define if struct dirent has a member d_ino that actually works. */
+#undef D_INO_IN_DIRENT
+
+/* Define if you want the debug output support compiled in. */
+#undef ENABLE_DEBUG
+
+/* Define if you want the HTTP Digest Authorization compiled in. */
+#undef ENABLE_DIGEST
+
+/* Define if IPv6 support is enabled. */
+#undef ENABLE_IPV6
+
+/* Define if IRI support is enabled. */
+#undef ENABLE_IRI
+
+/* Define to 1 if translation of program messages to the user's native
+ language is requested. */
+#undef ENABLE_NLS
+
+/* Define if you want the NTLM authorization support compiled in. */
+#undef ENABLE_NTLM
+
+/* Define if you want Opie support for FTP compiled in. */
+#undef ENABLE_OPIE
+
+/* Define if you want file meta-data storing into POSIX Extended Attributes
+ compiled in. */
+#undef ENABLE_XATTR
+
+/* Define this to 1 if F_DUPFD behavior does not match POSIX */
+#undef FCNTL_DUPFD_BUGGY
+
+/* Define to nothing if C supports flexible array members, and to 1 if it does
+ not. That way, with a declaration like 'struct s { int n; short
+ d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99
+ compilers. Use 'FLEXSIZEOF (struct s, d, N * sizeof (short))' to calculate
+ the size in bytes of such a struct containing an N-element array. */
+#undef FLEXIBLE_ARRAY_MEMBER
+
+/* Define to 1 if fopen() fails to recognize a trailing slash. */
+#undef FOPEN_TRAILING_SLASH_BUG
+
+/* Define to 1 if the system's ftello function has the Solaris bug. */
+#undef FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE
+
+/* Define to 1 if fflush is known to work on stdin as per POSIX.1-2008, 0 if
+ fflush is known to not work, -1 if unknown. */
+#undef FUNC_FFLUSH_STDIN
+
+/* Define to 1 if mkdir mistakenly creates a directory given with a trailing
+ dot component. */
+#undef FUNC_MKDIR_DOT_BUG
+
+/* Define to 1 if nl_langinfo (YESEXPR) returns a non-empty string. */
+#undef FUNC_NL_LANGINFO_YESEXPR_WORKS
+
+/* Define to 1 if realpath() can malloc memory, always gives an absolute path,
+ and handles trailing slash correctly. */
+#undef FUNC_REALPATH_WORKS
+
+/* Define to 1 if futimesat mishandles a NULL file name. */
+#undef FUTIMESAT_NULL_BUG
+
+/* Define to 1 if this is a fuzzing build */
+#undef FUZZING
+
+/* Define to the type of elements in the array set by `getgroups'. Usually
+ this is either `int' or `gid_t'. */
+#undef GETGROUPS_T
+
+/* Define this to 1 if getgroups(0,NULL) does not return the number of groups.
+ */
+#undef GETGROUPS_ZERO_BUG
+
+/* Define this to 'void' or 'struct timezone' to match the system's
+ declaration of the second argument to gettimeofday. */
+#undef GETTIMEOFDAY_TIMEZONE
+
+/* Compile Gnulib crypto stream ops. */
+#undef GL_COMPILE_CRYPTO_STREAM
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module canonicalize shall be considered present. */
+#undef GNULIB_CANONICALIZE
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module dirname shall be considered present. */
+#undef GNULIB_DIRNAME
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fdopendir shall be considered present. */
+#undef GNULIB_FDOPENDIR
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fd-safer-flag shall be considered present. */
+#undef GNULIB_FD_SAFER_FLAG
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fflush shall be considered present. */
+#undef GNULIB_FFLUSH
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fnmatch-gnu shall be considered present. */
+#undef GNULIB_FNMATCH_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fopen-gnu shall be considered present. */
+#undef GNULIB_FOPEN_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module fscanf shall be considered present. */
+#undef GNULIB_FSCANF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module getcwd shall be considered present. */
+#undef GNULIB_GETCWD
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module isblank shall be considered present. */
+#undef GNULIB_ISBLANK
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module lock shall be considered present. */
+#undef GNULIB_LOCK
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module mkostemp shall be considered present. */
+#undef GNULIB_MKOSTEMP
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module msvc-nothrow shall be considered present. */
+#undef GNULIB_MSVC_NOTHROW
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module openat shall be considered present. */
+#undef GNULIB_OPENAT
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module pipe2-safer shall be considered present. */
+#undef GNULIB_PIPE2_SAFER
+
+/* Define to 1 if printf and friends should be labeled with attribute
+ "__gnu_printf__" instead of "__printf__" */
+#undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module scanf shall be considered present. */
+#undef GNULIB_SCANF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module sigpipe shall be considered present. */
+#undef GNULIB_SIGPIPE
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module snprintf shall be considered present. */
+#undef GNULIB_SNPRINTF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module strerror shall be considered present. */
+#undef GNULIB_STRERROR
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module strerror_r-posix shall be considered present. */
+#undef GNULIB_STRERROR_R_POSIX
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module tempname shall be considered present. */
+#undef GNULIB_TEMPNAME
+
+/* Define to 1 when the gnulib module accept should be tested. */
+#undef GNULIB_TEST_ACCEPT
+
+/* Define to 1 when the gnulib module access should be tested. */
+#undef GNULIB_TEST_ACCESS
+
+/* Define to 1 when the gnulib module bind should be tested. */
+#undef GNULIB_TEST_BIND
+
+/* Define to 1 when the gnulib module btowc should be tested. */
+#undef GNULIB_TEST_BTOWC
+
+/* Define to 1 when the gnulib module canonicalize should be tested. */
+#undef GNULIB_TEST_CANONICALIZE
+
+/* Define to 1 when the gnulib module canonicalize_file_name should be tested.
+ */
+#undef GNULIB_TEST_CANONICALIZE_FILE_NAME
+
+/* Define to 1 when the gnulib module chdir should be tested. */
+#undef GNULIB_TEST_CHDIR
+
+/* Define to 1 when the gnulib module cloexec should be tested. */
+#undef GNULIB_TEST_CLOEXEC
+
+/* Define to 1 when the gnulib module close should be tested. */
+#undef GNULIB_TEST_CLOSE
+
+/* Define to 1 when the gnulib module closedir should be tested. */
+#undef GNULIB_TEST_CLOSEDIR
+
+/* Define to 1 when the gnulib module connect should be tested. */
+#undef GNULIB_TEST_CONNECT
+
+/* Define to 1 when the gnulib module dirfd should be tested. */
+#undef GNULIB_TEST_DIRFD
+
+/* Define to 1 when the gnulib module dup should be tested. */
+#undef GNULIB_TEST_DUP
+
+/* Define to 1 when the gnulib module dup2 should be tested. */
+#undef GNULIB_TEST_DUP2
+
+/* Define to 1 when the gnulib module environ should be tested. */
+#undef GNULIB_TEST_ENVIRON
+
+/* Define to 1 when the gnulib module fchdir should be tested. */
+#undef GNULIB_TEST_FCHDIR
+
+/* Define to 1 when the gnulib module fcntl should be tested. */
+#undef GNULIB_TEST_FCNTL
+
+/* Define to 1 when the gnulib module fdopendir should be tested. */
+#undef GNULIB_TEST_FDOPENDIR
+
+/* Define to 1 when the gnulib module fflush should be tested. */
+#undef GNULIB_TEST_FFLUSH
+
+/* Define to 1 when the gnulib module fnmatch should be tested. */
+#undef GNULIB_TEST_FNMATCH
+
+/* Define to 1 when the gnulib module fopen should be tested. */
+#undef GNULIB_TEST_FOPEN
+
+/* Define to 1 when the gnulib module fpurge should be tested. */
+#undef GNULIB_TEST_FPURGE
+
+/* Define to 1 when the gnulib module free-posix should be tested. */
+#undef GNULIB_TEST_FREE_POSIX
+
+/* Define to 1 when the gnulib module fseek should be tested. */
+#undef GNULIB_TEST_FSEEK
+
+/* Define to 1 when the gnulib module fseeko should be tested. */
+#undef GNULIB_TEST_FSEEKO
+
+/* Define to 1 when the gnulib module fstat should be tested. */
+#undef GNULIB_TEST_FSTAT
+
+/* Define to 1 when the gnulib module fstatat should be tested. */
+#undef GNULIB_TEST_FSTATAT
+
+/* Define to 1 when the gnulib module ftell should be tested. */
+#undef GNULIB_TEST_FTELL
+
+/* Define to 1 when the gnulib module ftello should be tested. */
+#undef GNULIB_TEST_FTELLO
+
+/* Define to 1 when the gnulib module futimens should be tested. */
+#undef GNULIB_TEST_FUTIMENS
+
+/* Define to 1 when the gnulib module getaddrinfo should be tested. */
+#undef GNULIB_TEST_GETADDRINFO
+
+/* Define to 1 when the gnulib module getcwd should be tested. */
+#undef GNULIB_TEST_GETCWD
+
+/* Define to 1 when the gnulib module getdelim should be tested. */
+#undef GNULIB_TEST_GETDELIM
+
+/* Define to 1 when the gnulib module getdtablesize should be tested. */
+#undef GNULIB_TEST_GETDTABLESIZE
+
+/* Define to 1 when the gnulib module getgroups should be tested. */
+#undef GNULIB_TEST_GETGROUPS
+
+/* Define to 1 when the gnulib module getline should be tested. */
+#undef GNULIB_TEST_GETLINE
+
+/* Define to 1 when the gnulib module getopt-posix should be tested. */
+#undef GNULIB_TEST_GETOPT_POSIX
+
+/* Define to 1 when the gnulib module getpass should be tested. */
+#undef GNULIB_TEST_GETPASS
+
+/* Define to 1 when the gnulib module getpeername should be tested. */
+#undef GNULIB_TEST_GETPEERNAME
+
+/* Define to 1 when the gnulib module getrandom should be tested. */
+#undef GNULIB_TEST_GETRANDOM
+
+/* Define to 1 when the gnulib module getsockname should be tested. */
+#undef GNULIB_TEST_GETSOCKNAME
+
+/* Define to 1 when the gnulib module gettimeofday should be tested. */
+#undef GNULIB_TEST_GETTIMEOFDAY
+
+/* Define to 1 when the gnulib module group-member should be tested. */
+#undef GNULIB_TEST_GROUP_MEMBER
+
+/* Define to 1 when the gnulib module ioctl should be tested. */
+#undef GNULIB_TEST_IOCTL
+
+/* Define to 1 when the gnulib module iswblank should be tested. */
+#undef GNULIB_TEST_ISWBLANK
+
+/* Define to 1 when the gnulib module iswdigit should be tested. */
+#undef GNULIB_TEST_ISWDIGIT
+
+/* Define to 1 when the gnulib module iswxdigit should be tested. */
+#undef GNULIB_TEST_ISWXDIGIT
+
+/* Define to 1 when the gnulib module link should be tested. */
+#undef GNULIB_TEST_LINK
+
+/* Define to 1 when the gnulib module listen should be tested. */
+#undef GNULIB_TEST_LISTEN
+
+/* Define to 1 when the gnulib module localeconv should be tested. */
+#undef GNULIB_TEST_LOCALECONV
+
+/* Define to 1 when the gnulib module lseek should be tested. */
+#undef GNULIB_TEST_LSEEK
+
+/* Define to 1 when the gnulib module lstat should be tested. */
+#undef GNULIB_TEST_LSTAT
+
+/* Define to 1 when the gnulib module malloc-posix should be tested. */
+#undef GNULIB_TEST_MALLOC_POSIX
+
+/* Define to 1 when the gnulib module mbrtowc should be tested. */
+#undef GNULIB_TEST_MBRTOWC
+
+/* Define to 1 when the gnulib module mbsinit should be tested. */
+#undef GNULIB_TEST_MBSINIT
+
+/* Define to 1 when the gnulib module mbsrtowcs should be tested. */
+#undef GNULIB_TEST_MBSRTOWCS
+
+/* Define to 1 when the gnulib module mbtowc should be tested. */
+#undef GNULIB_TEST_MBTOWC
+
+/* Define to 1 when the gnulib module memchr should be tested. */
+#undef GNULIB_TEST_MEMCHR
+
+/* Define to 1 when the gnulib module mempcpy should be tested. */
+#undef GNULIB_TEST_MEMPCPY
+
+/* Define to 1 when the gnulib module memrchr should be tested. */
+#undef GNULIB_TEST_MEMRCHR
+
+/* Define to 1 when the gnulib module mkdir should be tested. */
+#undef GNULIB_TEST_MKDIR
+
+/* Define to 1 when the gnulib module mkostemp should be tested. */
+#undef GNULIB_TEST_MKOSTEMP
+
+/* Define to 1 when the gnulib module mkstemp should be tested. */
+#undef GNULIB_TEST_MKSTEMP
+
+/* Define to 1 when the gnulib module mktime should be tested. */
+#undef GNULIB_TEST_MKTIME
+
+/* Define to 1 when the gnulib module nanosleep should be tested. */
+#undef GNULIB_TEST_NANOSLEEP
+
+/* Define to 1 when the gnulib module nl_langinfo should be tested. */
+#undef GNULIB_TEST_NL_LANGINFO
+
+/* Define to 1 when the gnulib module open should be tested. */
+#undef GNULIB_TEST_OPEN
+
+/* Define to 1 when the gnulib module openat should be tested. */
+#undef GNULIB_TEST_OPENAT
+
+/* Define to 1 when the gnulib module opendir should be tested. */
+#undef GNULIB_TEST_OPENDIR
+
+/* Define to 1 when the gnulib module pipe should be tested. */
+#undef GNULIB_TEST_PIPE
+
+/* Define to 1 when the gnulib module pipe2 should be tested. */
+#undef GNULIB_TEST_PIPE2
+
+/* Define to 1 when the gnulib module posix_spawn should be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN
+
+/* Define to 1 when the gnulib module posix_spawnattr_destroy should be
+ tested. */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_DESTROY
+
+/* Define to 1 when the gnulib module posix_spawnattr_init should be tested.
+ */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_INIT
+
+/* Define to 1 when the gnulib module posix_spawnattr_setflags should be
+ tested. */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_SETFLAGS
+
+/* Define to 1 when the gnulib module posix_spawnattr_setpgroup should be
+ tested. */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_SETPGROUP
+
+/* Define to 1 when the gnulib module posix_spawnattr_setsigmask should be
+ tested. */
+#undef GNULIB_TEST_POSIX_SPAWNATTR_SETSIGMASK
+
+/* Define to 1 when the gnulib module posix_spawnp should be tested. */
+#undef GNULIB_TEST_POSIX_SPAWNP
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addchdir should
+ be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addclose should
+ be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_adddup2 should
+ be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_addopen should
+ be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_destroy should
+ be tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_DESTROY
+
+/* Define to 1 when the gnulib module posix_spawn_file_actions_init should be
+ tested. */
+#undef GNULIB_TEST_POSIX_SPAWN_FILE_ACTIONS_INIT
+
+/* Define to 1 when the gnulib module raise should be tested. */
+#undef GNULIB_TEST_RAISE
+
+/* Define to 1 when the gnulib module rawmemchr should be tested. */
+#undef GNULIB_TEST_RAWMEMCHR
+
+/* Define to 1 when the gnulib module readdir should be tested. */
+#undef GNULIB_TEST_READDIR
+
+/* Define to 1 when the gnulib module readlink should be tested. */
+#undef GNULIB_TEST_READLINK
+
+/* Define to 1 when the gnulib module realloc-posix should be tested. */
+#undef GNULIB_TEST_REALLOC_POSIX
+
+/* Define to 1 when the gnulib module recv should be tested. */
+#undef GNULIB_TEST_RECV
+
+/* Define to 1 when the gnulib module rewinddir should be tested. */
+#undef GNULIB_TEST_REWINDDIR
+
+/* Define to 1 when the gnulib module secure_getenv should be tested. */
+#undef GNULIB_TEST_SECURE_GETENV
+
+/* Define to 1 when the gnulib module select should be tested. */
+#undef GNULIB_TEST_SELECT
+
+/* Define to 1 when the gnulib module send should be tested. */
+#undef GNULIB_TEST_SEND
+
+/* Define to 1 when the gnulib module setlocale_null should be tested. */
+#undef GNULIB_TEST_SETLOCALE_NULL
+
+/* Define to 1 when the gnulib module setsockopt should be tested. */
+#undef GNULIB_TEST_SETSOCKOPT
+
+/* Define to 1 when the gnulib module sigaction should be tested. */
+#undef GNULIB_TEST_SIGACTION
+
+/* Define to 1 when the gnulib module sigprocmask should be tested. */
+#undef GNULIB_TEST_SIGPROCMASK
+
+/* Define to 1 when the gnulib module snprintf should be tested. */
+#undef GNULIB_TEST_SNPRINTF
+
+/* Define to 1 when the gnulib module socket should be tested. */
+#undef GNULIB_TEST_SOCKET
+
+/* Define to 1 when the gnulib module stat should be tested. */
+#undef GNULIB_TEST_STAT
+
+/* Define to 1 when the gnulib module stpcpy should be tested. */
+#undef GNULIB_TEST_STPCPY
+
+/* Define to 1 when the gnulib module strchrnul should be tested. */
+#undef GNULIB_TEST_STRCHRNUL
+
+/* Define to 1 when the gnulib module strdup should be tested. */
+#undef GNULIB_TEST_STRDUP
+
+/* Define to 1 when the gnulib module strerror should be tested. */
+#undef GNULIB_TEST_STRERROR
+
+/* Define to 1 when the gnulib module strerror_r should be tested. */
+#undef GNULIB_TEST_STRERROR_R
+
+/* Define to 1 when the gnulib module strndup should be tested. */
+#undef GNULIB_TEST_STRNDUP
+
+/* Define to 1 when the gnulib module strnlen should be tested. */
+#undef GNULIB_TEST_STRNLEN
+
+/* Define to 1 when the gnulib module strpbrk should be tested. */
+#undef GNULIB_TEST_STRPBRK
+
+/* Define to 1 when the gnulib module strptime should be tested. */
+#undef GNULIB_TEST_STRPTIME
+
+/* Define to 1 when the gnulib module strtok_r should be tested. */
+#undef GNULIB_TEST_STRTOK_R
+
+/* Define to 1 when the gnulib module strtoll should be tested. */
+#undef GNULIB_TEST_STRTOLL
+
+/* Define to 1 when the gnulib module symlink should be tested. */
+#undef GNULIB_TEST_SYMLINK
+
+/* Define to 1 when the gnulib module timegm should be tested. */
+#undef GNULIB_TEST_TIMEGM
+
+/* Define to 1 when the gnulib module time_r should be tested. */
+#undef GNULIB_TEST_TIME_R
+
+/* Define to 1 when the gnulib module uninorm/u8-normalize should be tested.
+ */
+#undef GNULIB_TEST_UNINORM_U8_NORMALIZE
+
+/* Define to 1 when the gnulib module unlink should be tested. */
+#undef GNULIB_TEST_UNLINK
+
+/* Define to 1 when the gnulib module utime should be tested. */
+#undef GNULIB_TEST_UTIME
+
+/* Define to 1 when the gnulib module vasprintf should be tested. */
+#undef GNULIB_TEST_VASPRINTF
+
+/* Define to 1 when the gnulib module vsnprintf should be tested. */
+#undef GNULIB_TEST_VSNPRINTF
+
+/* Define to 1 when the gnulib module waitpid should be tested. */
+#undef GNULIB_TEST_WAITPID
+
+/* Define to 1 when the gnulib module wcrtomb should be tested. */
+#undef GNULIB_TEST_WCRTOMB
+
+/* Define to 1 when the gnulib module wcwidth should be tested. */
+#undef GNULIB_TEST_WCWIDTH
+
+/* Define to 1 when the gnulib module wmemchr should be tested. */
+#undef GNULIB_TEST_WMEMCHR
+
+/* Define to 1 when the gnulib module wmempcpy should be tested. */
+#undef GNULIB_TEST_WMEMPCPY
+
+/* Define to 1 when the gnulib module write should be tested. */
+#undef GNULIB_TEST_WRITE
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module unistr/u8-mbtouc-unsafe shall be considered
+ present. */
+#undef GNULIB_UNISTR_U8_MBTOUC_UNSAFE
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module unistr/u8-uctomb shall be considered present. */
+#undef GNULIB_UNISTR_U8_UCTOMB
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module xalloc shall be considered present. */
+#undef GNULIB_XALLOC
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+ whether the gnulib module xalloc-die shall be considered present. */
+#undef GNULIB_XALLOC_DIE
+
+/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
+ may be supplied by this distribution. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if <alloca.h> works. */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the <bcrypt.h> header file. */
+#undef HAVE_BCRYPT_H
+
+/* Define to 1 if you have the <bp-sym.h> header file. */
+#undef HAVE_BP_SYM_H
+
+/* Define to 1 if you have the `btowc' function. */
+#undef HAVE_BTOWC
+
+/* Define to 1 if nanosleep mishandles large arguments. */
+#undef HAVE_BUG_BIG_NANOSLEEP
+
+/* Define to 1 if you have the <byteswap.h> header file. */
+#undef HAVE_BYTESWAP_H
+
+/* Define to 1 if you have the `canonicalize_file_name' function. */
+#undef HAVE_CANONICALIZE_FILE_NAME
+
+/* Define to 1 if you have the `catgets' function. */
+#undef HAVE_CATGETS
+
+/* 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 Mac OS X function CFPreferencesCopyAppValue in
+ the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define to 1 if you have the `clock_settime' function. */
+#undef HAVE_CLOCK_SETTIME
+
+/* Define to 1 if you have the `closedir' function. */
+#undef HAVE_CLOSEDIR
+
+/* Define to 1 if you have the `confstr' function. */
+#undef HAVE_CONFSTR
+
+/* Define to 1 if you have the <crtdefs.h> header file. */
+#undef HAVE_CRTDEFS_H
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+ */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `alarm', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ALARM
+
+/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_CLEARERR_UNLOCKED
+
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+ */
+#undef HAVE_DECL_DIRFD
+
+/* Define to 1 if you have the declaration of `ecvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_ECVT
+
+/* Define to 1 if you have the declaration of `execvpe', and to 0 if you
+ don't. */
+#undef HAVE_DECL_EXECVPE
+
+/* Define to 1 if you have the declaration of `fchdir', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FCHDIR
+
+/* Define to 1 if you have the declaration of `fcloseall', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FCLOSEALL
+
+/* Define to 1 if you have the declaration of `fcvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FCVT
+
+/* Define to 1 if you have the declaration of `fdopendir', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FDOPENDIR
+
+/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FEOF_UNLOCKED
+
+/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FERROR_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FFLUSH_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FGETS_UNLOCKED
+
+/* Define to 1 if you have the declaration of `flockfile', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FLOCKFILE
+
+/* Define to 1 if you have the declaration of `fpurge', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FPURGE
+
+/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FPUTC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FPUTS_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FREAD_UNLOCKED
+
+/* Define to 1 if you have the declaration of `freeaddrinfo', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FREEADDRINFO
+
+/* Define to 1 if you have the declaration of `fseeko', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FSEEKO
+
+/* Define to 1 if you have the declaration of `ftello', and to 0 if you don't.
+ */
+#undef HAVE_DECL_FTELLO
+
+/* Define to 1 if you have the declaration of `funlockfile', and to 0 if you
+ don't. */
+#undef HAVE_DECL_FUNLOCKFILE
+
+/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_FWRITE_UNLOCKED
+
+/* Define to 1 if you have the declaration of `gai_strerror', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GAI_STRERROR
+
+/* Define to 1 if you have the declaration of `gai_strerrorA', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GAI_STRERRORA
+
+/* Define to 1 if you have the declaration of `gcvt', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GCVT
+
+/* Define to 1 if you have the declaration of `getaddrinfo', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETADDRINFO
+
+/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_GETCHAR_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getcwd', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETCWD
+
+/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETDELIM
+
+/* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETDTABLESIZE
+
+/* Define to 1 if you have the declaration of `getline', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETLINE
+
+/* Define to 1 if you have the declaration of `getnameinfo', and to 0 if you
+ don't. */
+#undef HAVE_DECL_GETNAMEINFO
+
+/* Define to 1 if you have the declaration of `h_errno', and to 0 if you
+ don't. */
+#undef HAVE_DECL_H_ERRNO
+
+/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you
+ don't. */
+#undef HAVE_DECL_INET_NTOP
+
+/* Define to 1 if you have the declaration of `isblank', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISBLANK
+
+/* Define to 1 if you have the declaration of `iswblank', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ISWBLANK
+
+/* Define to 1 if you have the declaration of `localtime_r', and to 0 if you
+ don't. */
+#undef HAVE_DECL_LOCALTIME_R
+
+/* Define to 1 if you have the declaration of `mbrtowc', and to 0 if you
+ don't. */
+#undef HAVE_DECL_MBRTOWC
+
+/* Define to 1 if you have the declaration of `mbsinit', and to 0 if you
+ don't. */
+#undef HAVE_DECL_MBSINIT
+
+/* Define to 1 if you have the declaration of `mbsrtowcs', and to 0 if you
+ don't. */
+#undef HAVE_DECL_MBSRTOWCS
+
+/* Define to 1 if you have the declaration of `memrchr', and to 0 if you
+ don't. */
+#undef HAVE_DECL_MEMRCHR
+
+/* Define to 1 if you have the declaration of `program_invocation_name', and
+ to 0 if you don't. */
+#undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+
+/* Define to 1 if you have the declaration of `program_invocation_short_name',
+ and to 0 if you don't. */
+#undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+
+/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if
+ you don't. */
+#undef HAVE_DECL_PUTCHAR_UNLOCKED
+
+/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you
+ don't. */
+#undef HAVE_DECL_PUTC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SNPRINTF
+
+/* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
+ */
+#undef HAVE_DECL_STRDUP
+
+/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRERROR_R
+
+/* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNCASECMP
+
+/* Define to 1 if you have the declaration of `strndup', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNDUP
+
+/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRNLEN
+
+/* Define to 1 if you have the declaration of `strtok_r', and to 0 if you
+ don't. */
+#undef HAVE_DECL_STRTOK_R
+
+/* Define to 1 if you have the declaration of `towlower', and to 0 if you
+ don't. */
+#undef HAVE_DECL_TOWLOWER
+
+/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_VSNPRINTF
+
+/* Define to 1 if you have the declaration of `wcrtomb', and to 0 if you
+ don't. */
+#undef HAVE_DECL_WCRTOMB
+
+/* Define to 1 if you have the declaration of `wcsdup', and to 0 if you don't.
+ */
+#undef HAVE_DECL_WCSDUP
+
+/* Define to 1 if you have the declaration of `wcwidth', and to 0 if you
+ don't. */
+#undef HAVE_DECL_WCWIDTH
+
+/* Define to 1 if you have the declaration of `_fseeki64', and to 0 if you
+ don't. */
+#undef HAVE_DECL__FSEEKI64
+
+/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL__SNPRINTF
+
+/* Define to 1 if you have the declaration of `__argv', and to 0 if you don't.
+ */
+#undef HAVE_DECL___ARGV
+
+/* Define to 1 if you have the declaration of `__fsetlocking', and to 0 if you
+ don't. */
+#undef HAVE_DECL___FSETLOCKING
+
+/* Define to 1 if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the `dirfd' function. */
+#undef HAVE_DIRFD
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `drand48' function. */
+#undef HAVE_DRAND48
+
+/* Define if you have the declaration of environ. */
+#undef HAVE_ENVIRON_DECL
+
+/* Define to 1 if you have the `faccessat' function. */
+#undef HAVE_FACCESSAT
+
+/* Define to 1 if you have the `fchdir' function. */
+#undef HAVE_FCHDIR
+
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
+/* Define to 1 if you have the `fdopendir' function. */
+#undef HAVE_FDOPENDIR
+
+/* Define to 1 if you have the <features.h> header file. */
+#undef HAVE_FEATURES_H
+
+/* Define to 1 if you have the `flock' function. */
+#undef HAVE_FLOCK
+
+/* Define to 1 if you have the `flockfile' function. */
+#undef HAVE_FLOCKFILE
+
+/* Define to 1 if you have the `fmemopen' function. */
+#undef HAVE_FMEMOPEN
+
+/* Define to 1 if you have the `fnmatch' function. */
+#undef HAVE_FNMATCH
+
+/* Define to 1 if you have the <fnmatch.h> header file. */
+#undef HAVE_FNMATCH_H
+
+/* Define to 1 if you have the `fpurge' function. */
+#undef HAVE_FPURGE
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `fstatat' function. */
+#undef HAVE_FSTATAT
+
+/* Define to 1 if you have the `ftello' function. */
+#undef HAVE_FTELLO
+
+/* Define to 1 if you have the `funlockfile' function. */
+#undef HAVE_FUNLOCKFILE
+
+/* Define to 1 if you have the `futimens' function. */
+#undef HAVE_FUTIMENS
+
+/* Define to 1 if you have the `futimes' function. */
+#undef HAVE_FUTIMES
+
+/* Define to 1 if you have the `futimesat' function. */
+#undef HAVE_FUTIMESAT
+
+/* Define to 1 if getaddrinfo exists, or to 0 otherwise. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if getcwd works, but with shorter paths than is generally
+ tested with the replacement. */
+#undef HAVE_GETCWD_SHORTER
+
+/* Define to 1 if you have the `getdelim' function. */
+#undef HAVE_GETDELIM
+
+/* Define to 1 if you have the `getdtablesize' function. */
+#undef HAVE_GETDTABLESIZE
+
+/* Define to 1 if you have the `getegid' function. */
+#undef HAVE_GETEGID
+
+/* Define to 1 if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define to 1 if you have the `getexecname' function. */
+#undef HAVE_GETEXECNAME
+
+/* Define to 1 if you have the `getgid' function. */
+#undef HAVE_GETGID
+
+/* Define to 1 if your system has a working `getgroups' function. */
+#undef HAVE_GETGROUPS
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#undef HAVE_GETHOSTBYNAME
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the `getopt_long_only' function. */
+#undef HAVE_GETOPT_LONG_ONLY
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `getpass' function. */
+#undef HAVE_GETPASS
+
+/* Define to 1 if you have the `getprogname' function. */
+#undef HAVE_GETPROGNAME
+
+/* Define to 1 if you have the `getrandom' function. */
+#undef HAVE_GETRANDOM
+
+/* Define to 1 if you have the `getservbyname' function. */
+#undef HAVE_GETSERVBYNAME
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define to 1 if you have the `gnutls_priority_set_direct' function. */
+#undef HAVE_GNUTLS_PRIORITY_SET_DIRECT
+
+/* Define if GPGME is available. */
+#undef HAVE_GPGME
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <iconv.h> header file. */
+#undef HAVE_ICONV_H
+
+/* Define to 1 if you have the `inet_ntop' function. */
+#undef HAVE_INET_NTOP
+
+/* Define to 1 if the compiler supports one of the keywords 'inline',
+ '__inline__', '__inline' and effectively inlines functions marked as such.
+ */
+#undef HAVE_INLINE
+
+/* Define to 1 if the system has the type `int64_t'. */
+#undef HAVE_INT64_T
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_INTMAX_T
+
+/* Define to 1 if the system has the type `intptr_t'. */
+#undef HAVE_INTPTR_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
+ declares uintmax_t. */
+#undef HAVE_INTTYPES_H_WITH_UINTMAX
+
+/* Define to 1 if you have the `ioctl' function. */
+#undef HAVE_IOCTL
+
+/* Define to 1 if <sys/socket.h> defines AF_INET. */
+#undef HAVE_IPV4
+
+/* Define to 1 if <sys/socket.h> defines AF_INET6. */
+#undef HAVE_IPV6
+
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
+/* Define to 1 if you have the `isblank' function. */
+#undef HAVE_ISBLANK
+
+/* Define to 1 if you have the `issetugid' function. */
+#undef HAVE_ISSETUGID
+
+/* Define to 1 if you have the `iswblank' function. */
+#undef HAVE_ISWBLANK
+
+/* Define to 1 if you have the `iswcntrl' function. */
+#undef HAVE_ISWCNTRL
+
+/* Define to 1 if you have the `iswctype' function. */
+#undef HAVE_ISWCTYPE
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define if libcares is available. */
+#undef HAVE_LIBCARES
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+#undef HAVE_LIBDL
+
+/* Define to 1 if you have the `eay32' library (-leay32). */
+#undef HAVE_LIBEAY32
+
+/* Define if you have the libgnutls library. */
+#undef HAVE_LIBGNUTLS
+
+/* Define to 1 if you have the <libintl.h> header file. */
+#undef HAVE_LIBINTL_H
+
+/* Define if libpcre is available. */
+#undef HAVE_LIBPCRE
+
+/* Define if libpcre2 is available. */
+#undef HAVE_LIBPCRE2
+
+/* PSL support enabled */
+#undef HAVE_LIBPSL
+
+/* Define if you have the libssl library. */
+#undef HAVE_LIBSSL
+
+/* Define to 1 if you have the `ssl32' library (-lssl32). */
+#undef HAVE_LIBSSL32
+
+/* Define if you have the libunistring library. */
+#undef HAVE_LIBUNISTRING
+
+/* Define if using libuuid. */
+#undef HAVE_LIBUUID
+
+/* Define if using zlib. */
+#undef HAVE_LIBZ
+
+/* Define to 1 if the bcrypt library is guaranteed to be present. */
+#undef HAVE_LIB_BCRYPT
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the `link' function. */
+#undef HAVE_LINK
+
+/* Define to 1 if you have 'struct sockaddr_alg' defined. */
+#undef HAVE_LINUX_IF_ALG_H
+
+/* Define to 1 if you have the `localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if the system has the type 'long long int'. */
+#undef HAVE_LONG_LONG_INT
+
+/* Define to 1 if you have the `lstat' function. */
+#undef HAVE_LSTAT
+
+/* Define to 1 if you have the `lutimes' function. */
+#undef HAVE_LUTIMES
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define if the 'malloc' function is POSIX compliant. */
+#undef HAVE_MALLOC_POSIX
+
+/* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
+ config.h and <sys/mman.h>. */
+#undef HAVE_MAP_ANONYMOUS
+
+/* Define to 1 if you have the `mbrtowc' function. */
+#undef HAVE_MBRTOWC
+
+/* Define to 1 if you have the `mbsinit' function. */
+#undef HAVE_MBSINIT
+
+/* Define to 1 if you have the `mbsrtowcs' function. */
+#undef HAVE_MBSRTOWCS
+
+/* Define to 1 if <wchar.h> declares mbstate_t. */
+#undef HAVE_MBSTATE_T
+
+/* Define to 1 if you have the `mbtowc' function. */
+#undef HAVE_MBTOWC
+
+/* Define to 1 if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define to 1 if you have the `memrchr' function. */
+#undef HAVE_MEMRCHR
+
+/* Define if using metalink. */
+#undef HAVE_METALINK
+
+/* Define to 1 if getcwd minimally works, that is, its result can be trusted
+ when it succeeds. */
+#undef HAVE_MINIMALLY_WORKING_GETCWD
+
+/* Define to 1 if you have the <minix/config.h> header file. */
+#undef HAVE_MINIX_CONFIG_H
+
+/* Define to 1 if <limits.h> defines the MIN and MAX macros. */
+#undef HAVE_MINMAX_IN_LIMITS_H
+
+/* Define to 1 if <sys/param.h> defines the MIN and MAX macros. */
+#undef HAVE_MINMAX_IN_SYS_PARAM_H
+
+/* Define to 1 if you have the `mkostemp' function. */
+#undef HAVE_MKOSTEMP
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `mprotect' function. */
+#undef HAVE_MPROTECT
+
+/* Define to 1 on MSVC platforms that have the "invalid parameter handler"
+ concept. */
+#undef HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Use libnettle */
+#undef HAVE_NETTLE
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define to 1 if you have the `openat' function. */
+#undef HAVE_OPENAT
+
+/* Define to 1 if you have the `opendir' function. */
+#undef HAVE_OPENDIR
+
+/* Define to 1 if libcrypto is used for MD5. */
+#undef HAVE_OPENSSL_MD5
+
+/* Define to 1 if you have the <openssl/md5.h> header file. */
+#undef HAVE_OPENSSL_MD5_H
+
+/* Define to 1 if libcrypto is used for SHA1. */
+#undef HAVE_OPENSSL_SHA1
+
+/* Define to 1 if libcrypto is used for SHA256. */
+#undef HAVE_OPENSSL_SHA256
+
+/* Define to 1 if libcrypto is used for SHA512. */
+#undef HAVE_OPENSSL_SHA512
+
+/* Define to 1 if you have the <openssl/sha.h> header file. */
+#undef HAVE_OPENSSL_SHA_H
+
+/* Define to 1 if getcwd works, except it sometimes fails when it shouldn't,
+ setting errno to ERANGE, ENAMETOOLONG, or ENOENT. */
+#undef HAVE_PARTLY_WORKING_GETCWD
+
+/* Define to 1 if you have the `pathconf' function. */
+#undef HAVE_PATHCONF
+
+/* Define to 1 if you have the <paths.h> header file. */
+#undef HAVE_PATHS_H
+
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
+/* Define to 1 if you have the `pipe2' function. */
+#undef HAVE_PIPE2
+
+/* Define to 1 if you have the `posix_spawn' function. */
+#undef HAVE_POSIX_SPAWN
+
+/* Define to 1 if the system has the type `posix_spawnattr_t'. */
+#undef HAVE_POSIX_SPAWNATTR_T
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir' function.
+ */
+#undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR
+
+/* Define to 1 if you have the `posix_spawn_file_actions_addchdir_np'
+ function. */
+#undef HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP
+
+/* Define to 1 if the system has the type `posix_spawn_file_actions_t'. */
+#undef HAVE_POSIX_SPAWN_FILE_ACTIONS_T
+
+/* Define to 1 if you have the `psl_latest' function. */
+#undef HAVE_PSL_LATEST
+
+/* Define if you have the <pthread.h> header and the POSIX threads API. */
+#undef HAVE_PTHREAD_API
+
+/* 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 if the 'pthread_rwlock_rdlock' function prefers a writer to a
+ reader. */
+#undef HAVE_PTHREAD_RWLOCK_RDLOCK_PREFER_WRITER
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `raise' function. */
+#undef HAVE_RAISE
+
+/* Define to 1 if you have the `random' function. */
+#undef HAVE_RANDOM
+
+/* Define to 1 if you have the `RAND_egd' function. */
+#undef HAVE_RAND_EGD
+
+/* Define to 1 if you have the `rawmemchr' function. */
+#undef HAVE_RAWMEMCHR
+
+/* Define to 1 if you have the `readdir' function. */
+#undef HAVE_READDIR
+
+/* Define to 1 if you have the `readlink' function. */
+#undef HAVE_READLINK
+
+/* Define if the 'realloc' function is POSIX compliant. */
+#undef HAVE_REALLOC_POSIX
+
+/* Define to 1 if you have the `realpath' function. */
+#undef HAVE_REALPATH
+
+/* Define to 1 if you have the `rewinddir' function. */
+#undef HAVE_REWINDDIR
+
+/* Define to 1 if the system has the type `sa_family_t'. */
+#undef HAVE_SA_FAMILY_T
+
+/* Define to 1 if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
+/* Define to 1 if you have the `sched_setparam' function. */
+#undef HAVE_SCHED_SETPARAM
+
+/* Define to 1 if you have the `sched_setscheduler' function. */
+#undef HAVE_SCHED_SETSCHEDULER
+
+/* Define to 1 if you have the <sdkddkver.h> header file. */
+#undef HAVE_SDKDDKVER_H
+
+/* Define to 1 if you have the `secure_getenv' function. */
+#undef HAVE_SECURE_GETENV
+
+/* Define to 1 if you have the `setdtablesize' function. */
+#undef HAVE_SETDTABLESIZE
+
+/* Define to 1 if you have the `setegid' function. */
+#undef HAVE_SETEGID
+
+/* Define to 1 if you have the `seteuid' function. */
+#undef HAVE_SETEUID
+
+/* Define to 1 if you have the `shutdown' function. */
+#undef HAVE_SHUTDOWN
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `sigaltstack' function. */
+#undef HAVE_SIGALTSTACK
+
+/* Define to 1 if you have the `sigblock' function. */
+#undef HAVE_SIGBLOCK
+
+/* Define to 1 if the system has the type `siginfo_t'. */
+#undef HAVE_SIGINFO_T
+
+/* Define to 1 if you have the `siginterrupt' function. */
+#undef HAVE_SIGINTERRUPT
+
+/* Define to 1 if 'sig_atomic_t' is a signed integer type. */
+#undef HAVE_SIGNED_SIG_ATOMIC_T
+
+/* Define to 1 if 'wchar_t' is a signed integer type. */
+#undef HAVE_SIGNED_WCHAR_T
+
+/* Define to 1 if 'wint_t' is a signed integer type. */
+#undef HAVE_SIGNED_WINT_T
+
+/* Define to 1 if you have the `sigsetjmp' function. */
+#undef HAVE_SIGSETJMP
+
+/* Define to 1 if the system has the type `sigset_t'. */
+#undef HAVE_SIGSET_T
+
+/* Define to 1 if the system has the type `sig_atomic_t'. */
+#undef HAVE_SIG_ATOMIC_T
+
+/* Define to 1 if you have the `sleep' function. */
+#undef HAVE_SLEEP
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define if the return value of the snprintf function is the number of of
+ bytes (excluding the terminating NUL) that would have been produced if the
+ buffer had been large enough. */
+#undef HAVE_SNPRINTF_RETVAL_C99
+
+/* Define if the string produced by the snprintf function is always NUL
+ terminated. */
+#undef HAVE_SNPRINTF_TRUNCATION_C99
+
+/* Define if struct sockaddr_in6 has the sin6_scope_id member */
+#undef HAVE_SOCKADDR_IN6_SCOPE_ID
+
+/* Define to 1 if you have the <spawn.h> header file. */
+#undef HAVE_SPAWN_H
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
+ uintmax_t. */
+#undef HAVE_STDINT_H_WITH_UINTMAX
+
+/* Define to 1 if you have the <stdio_ext.h> header file. */
+#undef HAVE_STDIO_EXT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchrnul' function. */
+#undef HAVE_STRCHRNUL
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror_r' function. */
+#undef HAVE_STRERROR_R
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlcpy' function. */
+#undef HAVE_STRLCPY
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strndup' function. */
+#undef HAVE_STRNDUP
+
+/* Define to 1 if you have the `strnlen' function. */
+#undef HAVE_STRNLEN
+
+/* Define to 1 if you have the `strpbrk' function. */
+#undef HAVE_STRPBRK
+
+/* Define to 1 if you have the `strptime' function. */
+#undef HAVE_STRPTIME
+
+/* Define to 1 if you have the `strtok_r' function. */
+#undef HAVE_STRTOK_R
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define to 1 if you have the `strtoll' function. */
+#undef HAVE_STRTOLL
+
+/* Define to 1 if the system has the type `struct addrinfo'. */
+#undef HAVE_STRUCT_ADDRINFO
+
+/* Define to 1 if `l_type' is a member of `struct flock'. */
+#undef HAVE_STRUCT_FLOCK_L_TYPE
+
+/* Define to 1 if `decimal_point' is a member of `struct lconv'. */
+#undef HAVE_STRUCT_LCONV_DECIMAL_POINT
+
+/* Define to 1 if `sa_sigaction' is a member of `struct sigaction'. */
+#undef HAVE_STRUCT_SIGACTION_SA_SIGACTION
+
+/* Define to 1 if the system has the type `struct sockaddr_in6'. */
+#undef HAVE_STRUCT_SOCKADDR_IN6
+
+/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
+#undef HAVE_STRUCT_SOCKADDR_SA_LEN
+
+/* Define to 1 if the system has the type `struct sockaddr_storage'. */
+#undef HAVE_STRUCT_SOCKADDR_STORAGE
+
+/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */
+#undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
+
+/* Define to 1 if `st_atimensec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIMENSEC
+
+/* Define to 1 if `st_atimespec.tv_nsec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
+
+/* Define to 1 if `st_atim.st__tim.tv_nsec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIM_ST__TIM_TV_NSEC
+
+/* Define to 1 if `st_atim.tv_nsec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
+
+/* Define to 1 if `st_birthtimensec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC
+
+/* Define to 1 if `st_birthtimespec.tv_nsec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC
+
+/* Define to 1 if `st_birthtim.tv_nsec' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/cdefs.h> header file. */
+#undef HAVE_SYS_CDEFS_H
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define to 1 if you have the <sys/inttypes.h> header file. */
+#undef HAVE_SYS_INTTYPES_H
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/random.h> header file. */
+#undef HAVE_SYS_RANDOM_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/single_threaded.h> header file. */
+#undef HAVE_SYS_SINGLE_THREADED_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_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 you have the <sys/uio.h> header file. */
+#undef HAVE_SYS_UIO_H
+
+/* Define to 1 if you have the <sys/utime.h> header file. */
+#undef HAVE_SYS_UTIME_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if the system has the 'tcgetattr' function. */
+#undef HAVE_TCGETATTR
+
+/* Define to 1 if the system has the 'tcsetattr' function. */
+#undef HAVE_TCSETATTR
+
+/* Define to 1 if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the `thrd_create' function. */
+#undef HAVE_THRD_CREATE
+
+/* Define to 1 if you have the <threads.h> header file. */
+#undef HAVE_THREADS_H
+
+/* Define to 1 if you have the `timegm' function. */
+#undef HAVE_TIMEGM
+
+/* Define if struct tm has the tm_gmtoff member. */
+#undef HAVE_TM_GMTOFF
+
+/* Define to 1 if you have the `towlower' function. */
+#undef HAVE_TOWLOWER
+
+/* Define to 1 if the system has the type `uint32_t'. */
+#undef HAVE_UINT32_T
+
+/* Define to 1 if the system has the type `uintptr_t'. */
+#undef HAVE_UINTPTR_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 `usleep' function. */
+#undef HAVE_USLEEP
+
+/* Define to 1 if you have the `utime' function. */
+#undef HAVE_UTIME
+
+/* Define to 1 if you have the `utimensat' function. */
+#undef HAVE_UTIMENSAT
+
+/* Define to 1 if you have the <utime.h> header file. */
+#undef HAVE_UTIME_H
+
+/* Define if uuid_create is available. */
+#undef HAVE_UUID_CREATE
+
+/* Define if you have a global __progname variable */
+#undef HAVE_VAR___PROGNAME
+
+/* Define to 1 if you have the `vasnprintf' function. */
+#undef HAVE_VASNPRINTF
+
+/* Define to 1 if you have the `vasprintf' function. */
+#undef HAVE_VASPRINTF
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 or 0, depending whether the compiler supports simple visibility
+ declarations. */
+#undef HAVE_VISIBILITY
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the `waitid' function. */
+#undef HAVE_WAITID
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the 'wchar_t' type. */
+#undef HAVE_WCHAR_T
+
+/* Define to 1 if you have the `wcrtomb' function. */
+#undef HAVE_WCRTOMB
+
+/* Define to 1 if you have the `wcslen' function. */
+#undef HAVE_WCSLEN
+
+/* Define to 1 if you have the `wcsnlen' function. */
+#undef HAVE_WCSNLEN
+
+/* Define to 1 if you have the <wctype.h> header file. */
+#undef HAVE_WCTYPE_H
+
+/* Define to 1 if you have the `wcwidth' function. */
+#undef HAVE_WCWIDTH
+
+/* Define to 1 if the compiler and linker support weak declarations of
+ symbols. */
+#undef HAVE_WEAK_SYMBOLS
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if you have the `wmempcpy' function. */
+#undef HAVE_WMEMPCPY
+
+/* Define to 1 if fstatat (..., 0) works. For example, it does not work in AIX
+ 7.1. */
+#undef HAVE_WORKING_FSTATAT_ZERO_FLAG
+
+/* Define to 1 if O_NOATIME works. */
+#undef HAVE_WORKING_O_NOATIME
+
+/* Define to 1 if O_NOFOLLOW works. */
+#undef HAVE_WORKING_O_NOFOLLOW
+
+/* Define if utimes works properly. */
+#undef HAVE_WORKING_UTIMES
+
+/* Define to 1 if you have the <ws2tcpip.h> header file. */
+#undef HAVE_WS2TCPIP_H
+
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if you have the `_fseeki64' function. */
+#undef HAVE__FSEEKI64
+
+/* Define to 1 if you have the `_ftelli64' function. */
+#undef HAVE__FTELLI64
+
+/* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
+#undef HAVE__SET_INVALID_PARAMETER_HANDLER
+
+/* Define to 1 if the compiler supports __builtin_expect,
+ and to 2 if <builtins.h> does. */
+#undef HAVE___BUILTIN_EXPECT
+#ifndef HAVE___BUILTIN_EXPECT
+# define __builtin_expect(e, c) (e)
+#elif HAVE___BUILTIN_EXPECT == 2
+# include <builtins.h>
+#endif
+
+
+/* Define to 1 if you have the `__fpurge' function. */
+#undef HAVE___FPURGE
+
+/* Define to 1 if you have the `__freading' function. */
+#undef HAVE___FREADING
+
+/* Define to 1 if you have the `__fsetlocking' function. */
+#undef HAVE___FSETLOCKING
+
+/* Define to 1 if the compiler supports the keyword '__inline'. */
+#undef HAVE___INLINE
+
+/* Define to 1 if you have the `__secure_getenv' function. */
+#undef HAVE___SECURE_GETENV
+
+/* Define to 1 if you have the `__xpg_strerror_r' function. */
+#undef HAVE___XPG_STRERROR_R
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define to 1 if lseek does not detect pipes. */
+#undef LSEEK_PIPE_BROKEN
+
+/* Define to 1 if 'lstat' dereferences a symlink specified with a trailing
+ slash. */
+#undef LSTAT_FOLLOWS_SLASHED_SYMLINK
+
+/* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */
+#undef MALLOC_0_IS_NONNULL
+
+/* Define to a substitute value for mmap()'s MAP_ANONYMOUS flag. */
+#undef MAP_ANONYMOUS
+
+/* Define if the mbrtowc function does not return (size_t) -2 for empty input.
+ */
+#undef MBRTOWC_EMPTY_INPUT_BUG
+
+/* Define if the mbrtowc function may signal encoding errors in the C locale.
+ */
+#undef MBRTOWC_IN_C_LOCALE_MAYBE_EILSEQ
+
+/* Define if the mbrtowc function has the NULL pwc argument bug. */
+#undef MBRTOWC_NULL_ARG1_BUG
+
+/* Define if the mbrtowc function has the NULL string argument bug. */
+#undef MBRTOWC_NULL_ARG2_BUG
+
+/* Define if the mbrtowc function does not return 0 for a NUL character. */
+#undef MBRTOWC_NUL_RETVAL_BUG
+
+/* Define if the mbrtowc function returns a wrong return value. */
+#undef MBRTOWC_RETVAL_BUG
+
+/* Define if the mbrtowc function stores a wide character when reporting
+ incomplete input. */
+#undef MBRTOWC_STORES_INCOMPLETE_BUG
+
+/* Use GNU style printf and scanf. */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+
+
+/* Define if the compilation of mktime.c should define 'mktime_internal'. */
+#undef NEED_MKTIME_INTERNAL
+
+/* Define if the compilation of mktime.c should define 'mktime' with the
+ native Windows TZ workaround. */
+#undef NEED_MKTIME_WINDOWS
+
+/* Define if the compilation of mktime.c should define 'mktime' with the
+ algorithmic workarounds. */
+#undef NEED_MKTIME_WORKING
+
+/* Define to 1 if nl_langinfo is multithread-safe. */
+#undef NL_LANGINFO_MTSAFE
+
+/* Define to 1 if open() fails to recognize a trailing slash. */
+#undef OPEN_TRAILING_SLASH_BUG
+
+/* Define to be the name of the operating system. */
+#undef OS_TYPE
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to the type that is the result of default argument promotions of
+ type mode_t. */
+#undef PROMOTED_MODE_T
+
+/* Define if the pthread_in_use() detection is hard. */
+#undef PTHREAD_IN_USE_DETECTION_HARD
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'ptrdiff_t'. */
+#undef PTRDIFF_T_SUFFIX
+
+/* Define to 1 if readlink fails to recognize a trailing slash. */
+#undef READLINK_TRAILING_SLASH_BUG
+
+/* Define to 1 if readlink sets errno instead of truncating a too-long link.
+ */
+#undef READLINK_TRUNCATE_BUG
+
+/* Define to 1 if gnulib's dirfd() replacement is used. */
+#undef REPLACE_DIRFD
+
+/* Define to 1 if gnulib's fchdir() replacement is used. */
+#undef REPLACE_FCHDIR
+
+/* Define to 1 if stat needs help when passed a file name with a trailing
+ slash */
+#undef REPLACE_FUNC_STAT_FILE
+
+/* Define to 1 if utime needs help when passed a file name with a trailing
+ slash */
+#undef REPLACE_FUNC_UTIME_FILE
+
+/* Define if nl_langinfo exists but is overridden by gnulib. */
+#undef REPLACE_NL_LANGINFO
+
+/* Define to 1 if open() should work around the inability to open a directory.
+ */
+#undef REPLACE_OPEN_DIRECTORY
+
+/* Define if gnulib uses its own posix_spawn and posix_spawnp functions. */
+#undef REPLACE_POSIX_SPAWN
+
+/* Define to 1 if strerror(0) does not return a message implying success. */
+#undef REPLACE_STRERROR_0
+
+/* Define if vasnprintf exists but is overridden by gnulib. */
+#undef REPLACE_VASNPRINTF
+
+/* Define to 1 if setlocale (LC_ALL, NULL) is multithread-safe. */
+#undef SETLOCALE_NULL_ALL_MTSAFE
+
+/* Define to 1 if setlocale (category, NULL) is multithread-safe. */
+#undef SETLOCALE_NULL_ONE_MTSAFE
+
+/* File name of the Bourne shell. */
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __CYGWIN__ || defined __ANDROID__
+/* Omit the directory part because
+ - For native Windows programs in a Cygwin environment, the Cygwin mounts
+ are not visible.
+ - For 32-bit Cygwin programs in a 64-bit Cygwin environment, the Cygwin
+ mounts are not visible.
+ - On Android, /bin/sh does not exist. It's /system/bin/sh instead. */
+# define BOURNE_SHELL "sh"
+#else
+# define BOURNE_SHELL "/bin/sh"
+#endif
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'sig_atomic_t'. */
+#undef SIG_ATOMIC_T_SUFFIX
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `off_t', as computed by sizeof. */
+#undef SIZEOF_OFF_T
+
+/* Define as the maximum value of type 'size_t', if the system doesn't define
+ it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'size_t'. */
+#undef SIZE_T_SUFFIX
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at runtime.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#undef STDC_HEADERS
+
+/* Define to 1 if strerror_r returns char *. */
+#undef STRERROR_R_CHAR_P
+
+/* Define to 1 if time_t is signed. */
+#undef TIME_T_IS_SIGNED
+
+/* Define to 1 if the type of the st_atim member of a struct stat is struct
+ timespec. */
+#undef TYPEOF_STRUCT_STAT_ST_ATIM_IS_STRUCT_TIMESPEC
+
+/* Define to 1 if unlink() on a parent directory may succeed */
+#undef UNLINK_PARENT_BUG
+
+/* Define to the prefix of C symbols at the assembler and linker level, either
+ an underscore or empty. */
+#undef USER_LABEL_PREFIX
+
+/* Define if the combination of the ISO C and POSIX multithreading APIs can be
+ used. */
+#undef USE_ISOC_AND_POSIX_THREADS
+
+/* Define if the ISO C multithreading library can be used. */
+#undef USE_ISOC_THREADS
+
+/* Define to 1 if you want to use the Linux kernel cryptographic API. */
+#undef USE_LINUX_CRYPTO_API
+
+/* Define if the POSIX multithreading library can be used. */
+#undef USE_POSIX_THREADS
+
+/* Define if references to the POSIX multithreading library should be made
+ weak. */
+#undef USE_POSIX_THREADS_WEAK
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+
+
+/* Define to 1 if you want getc etc. to use unlocked I/O if available.
+ Unlocked I/O can improve performance in unithreaded apps, but it is not
+ safe for multithreaded apps. */
+#undef USE_UNLOCKED_IO
+
+/* Define if the native Windows multithreading API can be used. */
+#undef USE_WINDOWS_THREADS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wchar_t'. */
+#undef WCHAR_T_SUFFIX
+
+/* Define if the wcrtomb function does not work in the C locale. */
+#undef WCRTOMB_C_LOCALE_BUG
+
+/* Define if the wcrtomb function has an incorrect return value. */
+#undef WCRTOMB_RETVAL_BUG
+
+/* Define if WSAStartup is needed. */
+#undef WINDOWS_SOCKETS
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+ 'wint_t'. */
+#undef WINT_T_SUFFIX
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+# undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
+ `char[]'. */
+#undef YYTEXT_POINTER
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* True if the compiler says it groks GNU C version MAJOR.MINOR. */
+#if defined __GNUC__ && defined __GNUC_MINOR__
+# define _GL_GNUC_PREREQ(major, minor) \
+ ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
+#else
+# define _GL_GNUC_PREREQ(major, minor) 0
+#endif
+
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 on Solaris. */
+#undef _LCONV_C99
+
+/* The _Noreturn keyword of C11. */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+ && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+ || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+ && 0)
+ /* [[noreturn]] is not practically usable, because with it the syntax
+ extern _Noreturn void func (...);
+ would not be valid; such a declaration would only be valid with 'extern'
+ and '_Noreturn' swapped, or without the 'extern' keyword. However, some
+ AIX system header files and several gnulib header files use precisely
+ this syntax with 'extern'. */
+# define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__) \
+ && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
+ || _GL_GNUC_PREREQ (4, 7) \
+ || (defined __apple_build_version__ \
+ ? 6000000 <= __apple_build_version__ \
+ : 3 < __clang_major__ + (5 <= __clang_minor__))))
+ /* _Noreturn works as-is. */
+# elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
+# define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+# define _Noreturn __declspec (noreturn)
+# else
+# define _Noreturn
+# endif
+#endif
+
+
+/* Define to 1 in order to get the POSIX compatible declarations of socket
+ functions. */
+#undef _POSIX_PII_SOCKET
+
+/* Define if you want <regex.h> to include <limits.h>, so that it consistently
+ overrides <limits.h>'s RE_DUP_MAX. */
+#undef _REGEX_INCLUDE_LIMITS_H
+
+/* Define if you want regoff_t to be at least as wide POSIX requires. */
+#undef _REGEX_LARGE_OFFSETS
+
+/* For standard stat data types on VMS. */
+#undef _USE_STD_STAT
+
+/* Define to rpl_ if the getopt replacement functions and variables should be
+ used. */
+#undef __GETOPT_PREFIX
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_CONSTANT_MACROS
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_LIMIT_MACROS
+
+/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+ signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+ invoked from such signal handlers. Such functions have some restrictions:
+ * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+ or should be listed as async-signal-safe in POSIX
+ <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+ section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in
+ particular, are NOT async-signal-safe.
+ * All memory locations (variables and struct fields) that these functions
+ access must be marked 'volatile'. This holds for both read and write
+ accesses. Otherwise the compiler might optimize away stores to and
+ reads from such locations that occur in the program, depending on its
+ data flow analysis. For example, when the program contains a loop
+ that is intended to inspect a variable set from within a signal handler
+ while (!signal_occurred)
+ ;
+ the compiler is allowed to transform this into an endless loop if the
+ variable 'signal_occurred' is not declared 'volatile'.
+ Additionally, recall that:
+ * A signal handler should not modify errno (except if it is a handler
+ for a fatal signal and ends by raising the same signal again, thus
+ provoking the termination of the process). If it invokes a function
+ that may clobber errno, it needs to save and restore the value of
+ errno. */
+#define _GL_ASYNC_SAFE
+
+
+/* Attributes. */
+#ifdef __has_attribute
+# define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
+#else
+# define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
+# define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
+# define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
+# define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_diagnose_if 0
+# define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
+# define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
+# define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
+# define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
+# ifdef _ICC
+# define _GL_ATTR_may_alias 0
+# else
+# define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
+# endif
+# define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
+# define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
+# define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
+# define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
+# define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
+# define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
+# define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
+# define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
+# define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
+#endif
+
+
+#if _GL_HAS_ATTRIBUTE (alloc_size)
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (always_inline)
+# define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
+#else
+# define _GL_ATTRIBUTE_ALWAYS_INLINE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (artificial)
+# define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
+#else
+# define _GL_ATTRIBUTE_ARTIFICIAL
+#endif
+
+/* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
+ <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
+ Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */
+#if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
+# ifndef __SUNPRO_C
+# define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
+# else
+# define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
+# endif
+#else
+# define _GL_ATTRIBUTE_COLD
+#endif
+
+#if _GL_HAS_ATTRIBUTE (const)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
+#elif _GL_HAS_ATTRIBUTE (deprecated)
+# define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
+#else
+# define _GL_ATTRIBUTE_DEPRECATED
+#endif
+
+#if _GL_HAS_ATTRIBUTE (error)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
+#elif _GL_HAS_ATTRIBUTE (diagnose_if)
+# define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
+# define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
+#else
+# define _GL_ATTRIBUTE_ERROR(msg)
+# define _GL_ATTRIBUTE_WARNING(msg)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (externally_visible)
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
+#else
+# define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
+#endif
+
+/* FALLTHROUGH is special, because it always expands to something. */
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
+#elif _GL_HAS_ATTRIBUTE (fallthrough)
+# define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
+#else
+# define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (format)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (leaf)
+# define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
+#else
+# define _GL_ATTRIBUTE_LEAF
+#endif
+
+/* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */
+#if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
+# define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+# define _GL_ATTRIBUTE_MAY_ALIAS
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
+#elif _GL_HAS_ATTRIBUTE (unused)
+# define _GL_ATTRIBUTE_MAYBE_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_ATTRIBUTE_MAYBE_UNUSED
+#endif
+/* Earlier spellings of this macro. */
+#define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
+#define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
+
+#if _GL_HAS_ATTRIBUTE (malloc)
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC
+#endif
+
+#if 201710L < __STDC_VERSION__
+# define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
+#elif _GL_HAS_ATTRIBUTE (warn_unused_result)
+# define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
+#else
+# define _GL_ATTRIBUTE_NODISCARD
+#endif
+
+#if _GL_HAS_ATTRIBUTE (noinline)
+# define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
+#else
+# define _GL_ATTRIBUTE_NOINLINE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (nonnull)
+# define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
+#else
+# define _GL_ATTRIBUTE_NONNULL(args)
+#endif
+
+#if _GL_HAS_ATTRIBUTE (nonstring)
+# define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
+#else
+# define _GL_ATTRIBUTE_NONSTRING
+#endif
+
+/* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */
+
+#if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
+# define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
+#else
+# define _GL_ATTRIBUTE_NOTHROW
+#endif
+
+#if _GL_HAS_ATTRIBUTE (packed)
+# define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
+#else
+# define _GL_ATTRIBUTE_PACKED
+#endif
+
+#if _GL_HAS_ATTRIBUTE (pure)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE
+#endif
+
+#if _GL_HAS_ATTRIBUTE (returns_nonnull)
+# define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
+#else
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
+#endif
+
+#if _GL_HAS_ATTRIBUTE (sentinel)
+# define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
+#else
+# define _GL_ATTRIBUTE_SENTINEL(pos)
+#endif
+
+
+/* To support C++ as well as C, use _GL_UNUSED_LABEL with trailing ';'. */
+#if !defined __cplusplus || _GL_GNUC_PREREQ (4, 5)
+# define _GL_UNUSED_LABEL _GL_ATTRIBUTE_MAYBE_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define as 'access' if you don't have the eaccess() function. */
+#undef eaccess
+
+/* Please see the Gnulib manual for how to use these macros.
+
+ Suppress extern inline with HP-UX cc, as it appears to be broken; see
+ <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+ Suppress extern inline with Sun C in standards-conformance mode, as it
+ mishandles inline functions that call each other. E.g., for 'inline void f
+ (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+ 'reference to static identifier "f" in extern inline function'.
+ This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+ Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+ on configurations that mistakenly use 'static inline' to implement
+ functions or macros in standard C headers like <ctype.h>. For example,
+ if isdigit is mistakenly implemented via a static inline function,
+ a program containing an extern inline function that calls isdigit
+ may not work since the C standard prohibits extern inline functions
+ from calling static functions. This bug is known to occur on:
+
+ OS X 10.8 and earlier; see:
+ http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+ DragonFly; see
+ http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+ FreeBSD; see:
+ http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+ OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+ for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+ Assume DragonFly and FreeBSD will be similar. */
+#if (((defined __APPLE__ && defined __MACH__) \
+ || defined __DragonFly__ || defined __FreeBSD__) \
+ && (defined __header_inline \
+ ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+ && ! defined __clang__) \
+ : ((! defined _DONT_USE_CTYPE_INLINE_ \
+ && (defined __GNUC__ || defined __cplusplus)) \
+ || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+ && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+ ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+ : (199901L <= __STDC_VERSION__ \
+ && !defined __HP_cc \
+ && !(defined __SUNPRO_C && __STDC__))) \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+ && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+ /* __gnu_inline__ suppresses a GCC 4.2 diagnostic. */
+# define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+# define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+# define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+# define _GL_INLINE_HEADER_CONST_PRAGMA \
+ _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+ /* Suppress GCC's bogus "no previous prototype for 'FOO'"
+ and "no previous declaration for 'FOO'" diagnostics,
+ when FOO is an inline function in the header; see
+ <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113>. */
+# define _GL_INLINE_HEADER_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+ _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to long or long long if <stdint.h> and <inttypes.h> don't define. */
+#undef intmax_t
+
+/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+ the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+ earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+ __APPLE__ && __MACH__ test for Mac OS X.
+ __APPLE_CC__ tests for the Apple compiler and its version.
+ __STDC_VERSION__ tests for the C99 mode. */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif
+
+/* Define to a type if <wchar.h> does not define. */
+#undef mbstate_t
+
+/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
+ n1 and n2 are expressions without side effects, that evaluate to real
+ numbers (excluding NaN).
+ It returns
+ 1 if n1 > n2
+ 0 if n1 == n2
+ -1 if n1 < n2
+ The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional
+ jump with nearly all GCC versions up to GCC 10.
+ This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many
+ GCC versions up to GCC 9.
+ The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9
+ avoids conditional jumps in all GCC versions >= 3.4. */
+#define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
+
+
+/* Define to the real name of the mktime_internal function. */
+#undef mktime_internal
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to the type of st_nlink in struct stat, or a supertype. */
+#undef nlink_t
+
+/* Define as a signed integer type capable of holding a process identifier. */
+#undef pid_t
+
+/* Define as the type of the result of subtracting two pointers, if the system
+ doesn't define it. */
+#undef ptrdiff_t
+
+/* Define to rpl_re_comp if the replacement should be used. */
+#undef re_comp
+
+/* Define to rpl_re_compile_fastmap if the replacement should be used. */
+#undef re_compile_fastmap
+
+/* Define to rpl_re_compile_pattern if the replacement should be used. */
+#undef re_compile_pattern
+
+/* Define to rpl_re_exec if the replacement should be used. */
+#undef re_exec
+
+/* Define to rpl_re_match if the replacement should be used. */
+#undef re_match
+
+/* Define to rpl_re_match_2 if the replacement should be used. */
+#undef re_match_2
+
+/* Define to rpl_re_search if the replacement should be used. */
+#undef re_search
+
+/* Define to rpl_re_search_2 if the replacement should be used. */
+#undef re_search_2
+
+/* Define to rpl_re_set_registers if the replacement should be used. */
+#undef re_set_registers
+
+/* Define to rpl_re_set_syntax if the replacement should be used. */
+#undef re_set_syntax
+
+/* Define to rpl_re_syntax_options if the replacement should be used. */
+#undef re_syntax_options
+
+/* Define to rpl_regcomp if the replacement should be used. */
+#undef regcomp
+
+/* Define to rpl_regerror if the replacement should be used. */
+#undef regerror
+
+/* Define to rpl_regexec if the replacement should be used. */
+#undef regexec
+
+/* Define to rpl_regfree if the replacement should be used. */
+#undef regfree
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+ nothing if this is not supported. Do not define if restrict is
+ supported only directly. */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+ #define __restrict__ or support _Restrict or __restrict__
+ even though the corresponding Sun C compiler ended up with
+ "#define restrict _Restrict" or "#define restrict __restrict__"
+ in the previous line. This workaround can be removed once
+ we assume Oracle Developer Studio 12.5 (2016) or later. */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define as an integer type suitable for memory locations that can be
+ accessed atomically even in the presence of asynchronous signals. */
+#undef sig_atomic_t
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* type to use in place of socklen_t if not defined */
+#undef socklen_t
+
+/* Define as a signed type of the same size as size_t. */
+#undef ssize_t
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* Define to empty if the keyword `volatile' does not work. Warning: valid
+ code using `volatile' can become incorrect without. Disable with care. */
+#undef volatile
diff --git a/src/connect.c b/src/connect.c
new file mode 100644
index 0000000..ad7ba0b
--- /dev/null
+++ b/src/connect.c
@@ -0,0 +1,1084 @@
+/* Establishing and handling network connections.
+ Copyright (C) 1995-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include "exits.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <assert.h>
+
+#include <sys/socket.h>
+#include <sys/select.h>
+
+#ifndef WINDOWS
+# ifdef __VMS
+# include "vms_ip.h"
+# else /* def __VMS */
+# include <netdb.h>
+# endif /* def __VMS [else] */
+# include <netinet/in.h>
+# ifndef __BEOS__
+# include <arpa/inet.h>
+# endif
+#endif /* not WINDOWS */
+
+#include <errno.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include "utils.h"
+#include "host.h"
+#include "connect.h"
+#include "hash.h"
+
+#include <stdint.h>
+
+/* Define sockaddr_storage where unavailable (presumably on IPv4-only
+ hosts). */
+
+#ifndef ENABLE_IPV6
+# ifndef HAVE_STRUCT_SOCKADDR_STORAGE
+# define sockaddr_storage sockaddr_in
+# endif
+#endif /* ENABLE_IPV6 */
+
+/* Fill SA as per the data in IP and PORT. SA should point to struct
+ sockaddr_storage if ENABLE_IPV6 is defined, to struct sockaddr_in
+ otherwise. */
+
+static void
+sockaddr_set_data (struct sockaddr *sa, const ip_address *ip, int port)
+{
+ switch (ip->family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+ xzero (*sin);
+ sin->sin_family = AF_INET;
+ sin->sin_port = htons (port);
+ sin->sin_addr = ip->data.d4;
+ break;
+ }
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+ xzero (*sin6);
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_port = htons (port);
+ sin6->sin6_addr = ip->data.d6;
+#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
+ sin6->sin6_scope_id = ip->ipv6_scope;
+#endif
+ break;
+ }
+#endif /* ENABLE_IPV6 */
+ default:
+ abort ();
+ }
+}
+
+/* Get the data of SA, specifically the IP address and the port. If
+ you're not interested in one or the other information, pass NULL as
+ the pointer. */
+
+static void
+sockaddr_get_data (const struct sockaddr *sa, ip_address *ip, int *port)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ {
+ struct sockaddr_in *sin = (struct sockaddr_in *)sa;
+ if (ip)
+ {
+ ip->family = AF_INET;
+ ip->data.d4 = sin->sin_addr;
+ }
+ if (port)
+ *port = ntohs (sin->sin_port);
+ break;
+ }
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
+ if (ip)
+ {
+ ip->family = AF_INET6;
+ ip->data.d6 = sin6->sin6_addr;
+#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
+ ip->ipv6_scope = sin6->sin6_scope_id;
+#endif
+ }
+ if (port)
+ *port = ntohs (sin6->sin6_port);
+ break;
+ }
+#endif
+ default:
+ abort ();
+ }
+}
+
+/* Return the size of the sockaddr structure depending on its
+ family. */
+
+static socklen_t
+sockaddr_size (const struct sockaddr *sa)
+{
+ switch (sa->sa_family)
+ {
+ case AF_INET:
+ return sizeof (struct sockaddr_in);
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ return sizeof (struct sockaddr_in6);
+#endif
+ default:
+ abort ();
+ }
+}
+
+/* Resolve the bind address specified via --bind-address and store it
+ to SA. The resolved value is stored in a static variable and
+ reused after the first invocation of this function.
+
+ Returns true on success, false on failure. */
+
+static bool
+resolve_bind_address (struct sockaddr *sa)
+{
+ struct address_list *al;
+
+ /* Make sure this is called only once. opt.bind_address doesn't
+ change during a Wget run. */
+ static bool called, should_bind;
+ static ip_address ip;
+ if (called)
+ {
+ if (should_bind)
+ sockaddr_set_data (sa, &ip, 0);
+ return should_bind;
+ }
+ called = true;
+
+ al = lookup_host (opt.bind_address, LH_BIND | LH_SILENT);
+ if (!al)
+ {
+ /* #### We should be able to print the error message here. */
+ logprintf (LOG_NOTQUIET,
+ _("%s: unable to resolve bind address %s; disabling bind.\n"),
+ exec_name, quote (opt.bind_address));
+ should_bind = false;
+ return false;
+ }
+
+ /* Pick the first address in the list and use it as bind address.
+ Perhaps we should try multiple addresses in succession, but I
+ don't think that's necessary in practice. */
+ ip = *address_list_address_at (al, 0);
+ address_list_release (al);
+
+ sockaddr_set_data (sa, &ip, 0);
+ should_bind = true;
+ return true;
+}
+
+struct cwt_context {
+ int fd;
+ const struct sockaddr *addr;
+ socklen_t addrlen;
+ int result;
+};
+
+static void
+connect_with_timeout_callback (void *arg)
+{
+ struct cwt_context *ctx = (struct cwt_context *)arg;
+ ctx->result = connect (ctx->fd, ctx->addr, ctx->addrlen);
+}
+
+/* Like connect, but specifies a timeout. If connecting takes longer
+ than TIMEOUT seconds, -1 is returned and errno is set to
+ ETIMEDOUT. */
+
+static int
+connect_with_timeout (int fd, const struct sockaddr *addr, socklen_t addrlen,
+ double timeout)
+{
+ struct cwt_context ctx;
+ ctx.fd = fd;
+ ctx.addr = addr;
+ ctx.addrlen = addrlen;
+
+ if (run_with_timeout (timeout, connect_with_timeout_callback, &ctx))
+ {
+ errno = ETIMEDOUT;
+ return -1;
+ }
+ if (ctx.result == -1 && errno == EINTR)
+ errno = ETIMEDOUT;
+ return ctx.result;
+}
+
+/* Connect via TCP to the specified address and port.
+
+ If PRINT is non-NULL, it is the host name to print that we're
+ connecting to. */
+
+int
+connect_to_ip (const ip_address *ip, int port, const char *print)
+{
+ struct sockaddr_storage ss;
+ struct sockaddr *sa = (struct sockaddr *)&ss;
+ int sock;
+
+ /* If PRINT is non-NULL, print the "Connecting to..." line, with
+ PRINT being the host name we're connecting to. */
+ if (print)
+ {
+ const char *txt_addr = print_address (ip);
+ if (0 != strcmp (print, txt_addr))
+ {
+ char *str = NULL, *name;
+
+ if (opt.enable_iri && (name = idn_decode ((char *) print)) != NULL)
+ {
+ str = aprintf ("%s (%s)", name, print);
+ xfree (name);
+ }
+
+ logprintf (LOG_VERBOSE, _("Connecting to %s|%s|:%d... "),
+ str ? str : escnonprint_uri (print), txt_addr, port);
+
+ xfree (str);
+ }
+ else
+ {
+ if (ip->family == AF_INET)
+ logprintf (LOG_VERBOSE, _("Connecting to %s:%d... "), txt_addr, port);
+#ifdef ENABLE_IPV6
+ else if (ip->family == AF_INET6)
+ logprintf (LOG_VERBOSE, _("Connecting to [%s]:%d... "), txt_addr, port);
+#endif
+ }
+ }
+
+ /* Store the sockaddr info to SA. */
+ sockaddr_set_data (sa, ip, port);
+
+ /* Create the socket of the family appropriate for the address. */
+ sock = socket (sa->sa_family, SOCK_STREAM, 0);
+ if (sock < 0)
+ goto err;
+
+#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
+ if (opt.ipv6_only) {
+ int on = 1;
+ /* In case of error, we will go on anyway... */
+ int err = setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on));
+ IF_DEBUG
+ if (err < 0)
+ DEBUGP (("Failed setting IPV6_V6ONLY: %s", strerror (errno)));
+ }
+#endif
+
+ /* For very small rate limits, set the buffer size (and hence,
+ hopefully, the kernel's TCP window size) to the per-second limit.
+ That way we should never have to sleep for more than 1s between
+ network reads. */
+ if (opt.limit_rate && opt.limit_rate < 8192)
+ {
+ int bufsize = opt.limit_rate;
+ if (bufsize < 512)
+ bufsize = 512; /* avoid pathologically small values */
+#ifdef SO_RCVBUF
+ if (setsockopt (sock, SOL_SOCKET, SO_RCVBUF,
+ (void *) &bufsize, (socklen_t) sizeof (bufsize)))
+ logprintf (LOG_NOTQUIET, _("setsockopt SO_RCVBUF failed: %s\n"),
+ strerror (errno));
+#endif
+ /* When we add limit_rate support for writing, which is useful
+ for POST, we should also set SO_SNDBUF here. */
+ }
+
+ if (opt.bind_address)
+ {
+ /* Bind the client side of the socket to the requested
+ address. */
+ struct sockaddr_storage bind_ss;
+ struct sockaddr *bind_sa = (struct sockaddr *)&bind_ss;
+ if (resolve_bind_address (bind_sa))
+ {
+ if (bind (sock, bind_sa, sockaddr_size (bind_sa)) < 0)
+ goto err;
+ }
+ }
+
+ /* Connect the socket to the remote endpoint. */
+ if (connect_with_timeout (sock, sa, sockaddr_size (sa),
+ opt.connect_timeout) < 0)
+ goto err;
+
+ /* Success. */
+ assert (sock >= 0);
+ if (print)
+ logprintf (LOG_VERBOSE, _("connected.\n"));
+ DEBUGP (("Created socket %d.\n", sock));
+ return sock;
+
+ err:
+ {
+ /* Protect errno from possible modifications by close and
+ logprintf. */
+ int save_errno = errno;
+ if (sock >= 0)
+ {
+#ifdef WIN32
+ /* If the connection timed out, fd_close will hang in Gnulib's
+ close_fd_maybe_socket, inside the call to WSAEnumNetworkEvents. */
+ if (errno != ETIMEDOUT)
+#endif
+ fd_close (sock);
+ }
+ if (print)
+ logprintf (LOG_NOTQUIET, _("failed: %s.\n"), strerror (errno));
+ errno = save_errno;
+ return -1;
+ }
+}
+
+/* Connect via TCP to a remote host on the specified port.
+
+ HOST is resolved as an Internet host name. If HOST resolves to
+ more than one IP address, they are tried in the order returned by
+ DNS until connecting to one of them succeeds. */
+
+int
+connect_to_host (const char *host, int port)
+{
+ int i, start, end;
+ int sock;
+
+ struct address_list *al = lookup_host (host, 0);
+
+ retry:
+ if (!al)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("%s: unable to resolve host address %s\n"),
+ exec_name, quote (host));
+ return E_HOST;
+ }
+
+ address_list_get_bounds (al, &start, &end);
+ for (i = start; i < end; i++)
+ {
+ const ip_address *ip = address_list_address_at (al, i);
+ sock = connect_to_ip (ip, port, host);
+ if (sock >= 0)
+ {
+ /* Success. */
+ address_list_set_connected (al);
+ address_list_release (al);
+ return sock;
+ }
+
+ /* The attempt to connect has failed. Continue with the loop
+ and try next address. */
+
+ address_list_set_faulty (al, i);
+ }
+
+ /* Failed to connect to any of the addresses in AL. */
+
+ if (address_list_connected_p (al))
+ {
+ /* We connected to AL before, but cannot do so now. That might
+ indicate that our DNS cache entry for HOST has expired. */
+ address_list_release (al);
+ al = lookup_host (host, LH_REFRESH);
+ goto retry;
+ }
+ address_list_release (al);
+
+ return -1;
+}
+
+/* Create a socket, bind it to local interface BIND_ADDRESS on port
+ *PORT, set up a listen backlog, and return the resulting socket, or
+ -1 in case of error.
+
+ BIND_ADDRESS is the address of the interface to bind to. If it is
+ NULL, the socket is bound to the default address. PORT should
+ point to the port number that will be used for the binding. If
+ that number is 0, the system will choose a suitable port, and the
+ chosen value will be written to *PORT.
+
+ Calling accept() on such a socket waits for and accepts incoming
+ TCP connections. */
+
+int
+bind_local (const ip_address *bind_address, int *port)
+{
+ int sock;
+ struct sockaddr_storage ss;
+ struct sockaddr *sa = (struct sockaddr *)&ss;
+
+ /* For setting options with setsockopt. */
+ int setopt_val = 1;
+ void *setopt_ptr = (void *)&setopt_val;
+ socklen_t setopt_size = sizeof (setopt_val);
+
+ sock = socket (bind_address->family, SOCK_STREAM, 0);
+ if (sock < 0)
+ return -1;
+
+#ifdef SO_REUSEADDR
+ if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, setopt_ptr, setopt_size))
+ logprintf (LOG_NOTQUIET, _("setsockopt SO_REUSEADDR failed: %s\n"),
+ strerror (errno));
+#endif
+
+ xzero (ss);
+ sockaddr_set_data (sa, bind_address, *port);
+ if (bind (sock, sa, sockaddr_size (sa)) < 0)
+ {
+ fd_close (sock);
+ return -1;
+ }
+ DEBUGP (("Local socket fd %d bound.\n", sock));
+
+ /* If *PORT is 0, find out which port we've bound to. */
+ if (*port == 0)
+ {
+ socklen_t addrlen = sockaddr_size (sa);
+ if (getsockname (sock, sa, &addrlen) < 0)
+ {
+ /* If we can't find out the socket's local address ("name"),
+ something is seriously wrong with the socket, and it's
+ unusable for us anyway because we must know the chosen
+ port. */
+ fd_close (sock);
+ return -1;
+ }
+ sockaddr_get_data (sa, NULL, port);
+ DEBUGP (("binding to address %s using port %i.\n",
+ print_address (bind_address), *port));
+ }
+ if (listen (sock, 1) < 0)
+ {
+ fd_close (sock);
+ return -1;
+ }
+ return sock;
+}
+
+/* Like a call to accept(), but with the added check for timeout.
+
+ In other words, accept a client connection on LOCAL_SOCK, and
+ return the new socket used for communication with the client.
+ LOCAL_SOCK should have been bound, e.g. using bind_local().
+
+ The caller is blocked until a connection is established. If no
+ connection is established for opt.connect_timeout seconds, the
+ function exits with an error status. */
+
+int
+accept_connection (int local_sock)
+{
+ int sock;
+
+ /* We don't need the values provided by accept, but accept
+ apparently requires them to be present. */
+ struct sockaddr_storage ss;
+ struct sockaddr *sa = (struct sockaddr *)&ss;
+ socklen_t addrlen = sizeof (ss);
+
+ if (opt.connect_timeout)
+ {
+ int test = select_fd (local_sock, opt.connect_timeout, WAIT_FOR_READ);
+ if (test == 0)
+ errno = ETIMEDOUT;
+ if (test <= 0)
+ return -1;
+ }
+ sock = accept (local_sock, sa, &addrlen);
+ DEBUGP (("Accepted client at socket %d.\n", sock));
+ return sock;
+}
+
+/* Get the IP address associated with the connection on FD and store
+ it to IP. Return true on success, false otherwise.
+
+ If ENDPOINT is ENDPOINT_LOCAL, it returns the address of the local
+ (client) side of the socket. Else if ENDPOINT is ENDPOINT_PEER, it
+ returns the address of the remote (peer's) side of the socket. */
+
+bool
+socket_ip_address (int sock, ip_address *ip, int endpoint)
+{
+ struct sockaddr_storage storage;
+ struct sockaddr *sockaddr = (struct sockaddr *) &storage;
+ socklen_t addrlen = sizeof (storage);
+ int ret;
+
+ memset (sockaddr, 0, addrlen);
+ if (endpoint == ENDPOINT_LOCAL)
+ ret = getsockname (sock, sockaddr, &addrlen);
+ else if (endpoint == ENDPOINT_PEER)
+ ret = getpeername (sock, sockaddr, &addrlen);
+ else
+ abort ();
+ if (ret < 0)
+ return false;
+
+ memset(ip, 0, sizeof(ip_address));
+ ip->family = sockaddr->sa_family;
+ switch (sockaddr->sa_family)
+ {
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ {
+ struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)&storage;
+ ip->data.d6 = sa6->sin6_addr;
+#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
+ ip->ipv6_scope = sa6->sin6_scope_id;
+#endif
+ DEBUGP (("conaddr is: %s\n", print_address (ip)));
+ return true;
+ }
+#endif
+ case AF_INET:
+ {
+ struct sockaddr_in *sa = (struct sockaddr_in *)&storage;
+ ip->data.d4 = sa->sin_addr;
+ DEBUGP (("conaddr is: %s\n", print_address (ip)));
+ return true;
+ }
+ default:
+ abort ();
+ }
+}
+
+/* Get the socket family of connection on FD and store
+ Return family type on success, -1 otherwise.
+
+ If ENDPOINT is ENDPOINT_LOCAL, it returns the sock family of the local
+ (client) side of the socket. Else if ENDPOINT is ENDPOINT_PEER, it
+ returns the sock family of the remote (peer's) side of the socket. */
+
+int
+socket_family (int sock, int endpoint)
+{
+ struct sockaddr_storage storage;
+ struct sockaddr *sockaddr = (struct sockaddr *) &storage;
+ socklen_t addrlen = sizeof (storage);
+ int ret;
+
+ memset (sockaddr, 0, addrlen);
+
+ if (endpoint == ENDPOINT_LOCAL)
+ ret = getsockname (sock, sockaddr, &addrlen);
+ else if (endpoint == ENDPOINT_PEER)
+ ret = getpeername (sock, sockaddr, &addrlen);
+ else
+ abort ();
+
+ if (ret < 0)
+ return -1;
+
+ return sockaddr->sa_family;
+}
+
+/* Return true if the error from the connect code can be considered
+ retryable. Wget normally retries after errors, but the exception
+ are the "unsupported protocol" type errors (possible on IPv4/IPv6
+ dual family systems) and "connection refused". */
+
+bool
+retryable_socket_connect_error (int err)
+{
+ /* Have to guard against some of these values not being defined.
+ Cannot use a switch statement because some of the values might be
+ equal. */
+ if (false
+#ifdef EAFNOSUPPORT
+ || err == EAFNOSUPPORT
+#endif
+#ifdef EPFNOSUPPORT
+ || err == EPFNOSUPPORT
+#endif
+#ifdef ESOCKTNOSUPPORT /* no, "sockt" is not a typo! */
+ || err == ESOCKTNOSUPPORT
+#endif
+#ifdef EPROTONOSUPPORT
+ || err == EPROTONOSUPPORT
+#endif
+#ifdef ENOPROTOOPT
+ || err == ENOPROTOOPT
+#endif
+ /* Apparently, older versions of Linux and BSD used EINVAL
+ instead of EAFNOSUPPORT and such. */
+ || err == EINVAL
+ )
+ return false;
+
+ if (!opt.retry_connrefused)
+ if (err == ECONNREFUSED
+#ifdef ENETUNREACH
+ || err == ENETUNREACH /* network is unreachable */
+#endif
+#ifdef EHOSTUNREACH
+ || err == EHOSTUNREACH /* host is unreachable */
+#endif
+ )
+ return false;
+
+ return true;
+}
+
+/* Wait for a single descriptor to become available, timing out after
+ MAXTIME seconds. Returns 1 if FD is available, 0 for timeout and
+ -1 for error. The argument WAIT_FOR can be a combination of
+ WAIT_FOR_READ and WAIT_FOR_WRITE.
+
+ This is a mere convenience wrapper around the select call, and
+ should be taken as such (for example, it doesn't implement Wget's
+ 0-timeout-means-no-timeout semantics.) */
+
+static int
+select_fd_internal (int fd, double maxtime, int wait_for, bool convert_back _GL_UNUSED)
+{
+ fd_set fdset;
+ fd_set *rd = NULL, *wr = NULL;
+ struct timeval tmout;
+ int result;
+
+ if (fd < 0)
+ return -1;
+
+ if (fd >= FD_SETSIZE)
+ {
+ logprintf (LOG_NOTQUIET, _("Too many fds open. Cannot use select on a fd >= %d\n"), FD_SETSIZE);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ FD_ZERO (&fdset);
+ FD_SET (fd, &fdset);
+ if (wait_for & WAIT_FOR_READ)
+ rd = &fdset;
+ if (wait_for & WAIT_FOR_WRITE)
+ wr = &fdset;
+
+ tmout.tv_sec = (long) maxtime;
+ tmout.tv_usec = 1000000 * (maxtime - (long) maxtime);
+
+ do
+ {
+ result = select (fd + 1, rd, wr, NULL, &tmout);
+#ifdef WINDOWS
+ /* gnulib select() converts blocking sockets to nonblocking in windows.
+ wget uses blocking sockets so we must convert them back to blocking. */
+ if (convert_back)
+ set_windows_fd_as_blocking_socket (fd);
+#endif
+ }
+ while (result < 0 && errno == EINTR);
+
+ return result;
+}
+
+int
+select_fd (int fd, double maxtime, int wait_for)
+{
+ return select_fd_internal (fd, maxtime, wait_for, true);
+}
+
+#ifdef WINDOWS
+int
+select_fd_nb (int fd, double maxtime, int wait_for)
+{
+ return select_fd_internal (fd, maxtime, wait_for, false);
+}
+#endif
+
+/* Return true if the connection to the remote site established
+ through SOCK is still open.
+
+ Specifically, this function returns true if SOCK is not ready for
+ reading. This is because, when the connection closes, the socket
+ is ready for reading because EOF is about to be delivered. A side
+ effect of this method is that sockets that have pending data are
+ considered non-open. This is actually a good thing for callers of
+ this function, where such pending data can only be unwanted
+ leftover from a previous request. */
+
+bool
+test_socket_open (int sock)
+{
+ fd_set check_set;
+ struct timeval to;
+ int ret = 0;
+
+ if (sock >= FD_SETSIZE)
+ {
+ logprintf (LOG_NOTQUIET, _("Too many fds open. Cannot use select on a fd >= %d\n"), FD_SETSIZE);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ /* Check if we still have a valid (non-EOF) connection. From Andrew
+ * Maholski's code in the Unix Socket FAQ. */
+
+ FD_ZERO (&check_set);
+ FD_SET (sock, &check_set);
+
+ /* Wait one microsecond */
+ to.tv_sec = 0;
+ to.tv_usec = 1;
+
+ ret = select (sock + 1, &check_set, NULL, NULL, &to);
+#ifdef WINDOWS
+/* gnulib select() converts blocking sockets to nonblocking in windows.
+wget uses blocking sockets so we must convert them back to blocking
+*/
+ set_windows_fd_as_blocking_socket ( sock );
+#endif
+
+ if ( !ret )
+ /* We got a timeout, it means we're still connected. */
+ return true;
+ else
+ /* Read now would not wait, it means we have either pending data
+ or EOF/error. */
+ return false;
+}
+
+/* Basic socket operations, mostly EINTR wrappers. */
+
+static int
+sock_read (int fd, char *buf, int bufsize)
+{
+ int res;
+ do
+ res = read (fd, buf, bufsize);
+ while (res == -1 && errno == EINTR);
+ return res;
+}
+
+static int
+sock_write (int fd, char *buf, int bufsize)
+{
+ int res;
+ do
+ res = write (fd, buf, bufsize);
+ while (res == -1 && errno == EINTR);
+ return res;
+}
+
+static int
+sock_poll (int fd, double timeout, int wait_for)
+{
+ return select_fd (fd, timeout, wait_for);
+}
+
+static int
+sock_peek (int fd, char *buf, int bufsize)
+{
+ int res;
+ do
+ res = recv (fd, buf, bufsize, MSG_PEEK);
+ while (res == -1 && errno == EINTR);
+ return res;
+}
+
+static void
+sock_close (int fd)
+{
+ close (fd);
+ DEBUGP (("Closed fd %d\n", fd));
+}
+#undef read
+#undef write
+#undef close
+
+/* Reading and writing from the network. We build around the socket
+ (file descriptor) API, but support "extended" operations for things
+ that are not mere file descriptors under the hood, such as SSL
+ sockets.
+
+ That way the user code can call fd_read(fd, ...) and we'll run read
+ or SSL_read or whatever is necessary. */
+
+static struct hash_table *transport_map;
+static unsigned int transport_map_modified_tick;
+
+struct transport_info {
+ struct transport_implementation *imp;
+ void *ctx;
+};
+
+/* Register the transport layer operations that will be used when
+ reading, writing, and polling FD.
+
+ This should be used for transport layers like SSL that piggyback on
+ sockets. FD should otherwise be a real socket, on which you can
+ call getpeername, etc. */
+
+void
+fd_register_transport (int fd, struct transport_implementation *imp, void *ctx)
+{
+ struct transport_info *info;
+
+ /* The file descriptor must be non-negative to be registered.
+ Negative values are ignored by fd_close(), and -1 cannot be used as
+ hash key. */
+ assert (fd >= 0);
+
+ info = xnew (struct transport_info);
+ info->imp = imp;
+ info->ctx = ctx;
+ if (!transport_map)
+ transport_map = hash_table_new (0, NULL, NULL);
+ hash_table_put (transport_map, (void *)(intptr_t) fd, info);
+ ++transport_map_modified_tick;
+}
+
+/* Return context of the transport registered with
+ fd_register_transport. This assumes fd_register_transport was
+ previously called on FD. */
+
+void *
+fd_transport_context (int fd)
+{
+ struct transport_info *info = hash_table_get (transport_map, (void *)(intptr_t) fd);
+ return info ? info->ctx : NULL;
+}
+
+/* When fd_read/fd_write are called multiple times in a loop, they should
+ remember the INFO pointer instead of fetching it every time. It is
+ not enough to compare FD to LAST_FD because FD might have been
+ closed and reopened. modified_tick ensures that changes to
+ transport_map will not be unnoticed.
+
+ This is a macro because we want the static storage variables to be
+ per-function. */
+
+#define LAZY_RETRIEVE_INFO(info) do { \
+ static struct transport_info *last_info; \
+ static int last_fd = -1; \
+ static unsigned int last_tick; \
+ if (!transport_map) \
+ info = NULL; \
+ else if (last_fd == fd && last_tick == transport_map_modified_tick) \
+ info = last_info; \
+ else \
+ { \
+ info = hash_table_get (transport_map, (void *)(intptr_t) fd); \
+ last_fd = fd; \
+ last_info = info; \
+ last_tick = transport_map_modified_tick; \
+ } \
+} while (0)
+
+static bool
+poll_internal (int fd, struct transport_info *info, int wf, double timeout)
+{
+ if (timeout == -1)
+ timeout = opt.read_timeout;
+ if (timeout)
+ {
+ int test;
+ if (info && info->imp->poller)
+ test = info->imp->poller (fd, timeout, wf, info->ctx);
+ else
+ test = sock_poll (fd, timeout, wf);
+ if (test == 0)
+ errno = ETIMEDOUT;
+ if (test <= 0)
+ return false;
+ }
+ return true;
+}
+
+/* Read no more than BUFSIZE bytes of data from FD, storing them to
+ BUF. If TIMEOUT is non-zero, the operation aborts if no data is
+ received after that many seconds. If TIMEOUT is -1, the value of
+ opt.timeout is used for TIMEOUT. */
+
+int
+fd_read (int fd, char *buf, int bufsize, double timeout)
+{
+ struct transport_info *info;
+ LAZY_RETRIEVE_INFO (info);
+
+ /* let imp->reader take care about timeout.
+ (or in worst case timeout can be 2*timeout) */
+ if (info && info->imp->reader)
+ return info->imp->reader (fd, buf, bufsize, info->ctx, timeout);
+
+ if (!poll_internal (fd, info, WAIT_FOR_READ, timeout))
+ return -1;
+ return sock_read (fd, buf, bufsize);
+}
+
+/* Like fd_read, except it provides a "preview" of the data that will
+ be read by subsequent calls to fd_read. Specifically, it copies no
+ more than BUFSIZE bytes of the currently available data to BUF and
+ returns the number of bytes copied. Return values and timeout
+ semantics are the same as those of fd_read.
+
+ CAVEAT: Do not assume that the first subsequent call to fd_read
+ will retrieve the same amount of data. Reading can return more or
+ less data, depending on the TCP implementation and other
+ circumstances. However, barring an error, it can be expected that
+ all the peeked data will eventually be read by fd_read. */
+
+int
+fd_peek (int fd, char *buf, int bufsize, double timeout)
+{
+ struct transport_info *info;
+ LAZY_RETRIEVE_INFO (info);
+
+ if (info && info->imp->peeker)
+ return info->imp->peeker (fd, buf, bufsize, info->ctx, timeout);
+
+ if (!poll_internal (fd, info, WAIT_FOR_READ, timeout))
+ return -1;
+ return sock_peek (fd, buf, bufsize);
+}
+
+/* Write the entire contents of BUF to FD. If TIMEOUT is non-zero,
+ the operation aborts if no data is received after that many
+ seconds. If TIMEOUT is -1, the value of opt.timeout is used for
+ TIMEOUT. */
+
+int
+fd_write (int fd, char *buf, int bufsize, double timeout)
+{
+ int res;
+ struct transport_info *info;
+ LAZY_RETRIEVE_INFO (info);
+
+ /* `write' may write less than LEN bytes, thus the loop keeps trying
+ it until all was written, or an error occurred. */
+ res = 0;
+ while (bufsize > 0)
+ {
+ if (!poll_internal (fd, info, WAIT_FOR_WRITE, timeout))
+ return -1;
+ if (info && info->imp->writer)
+ res = info->imp->writer (fd, buf, bufsize, info->ctx);
+ else
+ res = sock_write (fd, buf, bufsize);
+ if (res <= 0)
+ break;
+ buf += res;
+ bufsize -= res;
+ }
+ return res;
+}
+
+/* Report the most recent error(s) on FD. This should only be called
+ after fd_* functions, such as fd_read and fd_write, and only if
+ they return a negative result. For errors coming from other calls
+ such as setsockopt or fopen, strerror should continue to be
+ used.
+
+ If the transport doesn't support error messages or doesn't supply
+ one, strerror(errno) is returned. The returned error message
+ should not be used after fd_close has been called. */
+
+const char *
+fd_errstr (int fd)
+{
+ /* Don't bother with LAZY_RETRIEVE_INFO, as this will only be called
+ in case of error, never in a tight loop. */
+ struct transport_info *info = NULL;
+
+ if (transport_map)
+ info = hash_table_get (transport_map, (void *)(intptr_t) fd);
+
+ if (info && info->imp->errstr)
+ {
+ const char *err = info->imp->errstr (fd, info->ctx);
+ if (err)
+ return err;
+ /* else, fall through and print the system error. */
+ }
+ return strerror (errno);
+}
+
+/* Close the file descriptor FD. */
+
+void
+fd_close (int fd)
+{
+ struct transport_info *info;
+ if (fd < 0)
+ return;
+
+ /* Don't use LAZY_RETRIEVE_INFO because fd_close() is only called once
+ per socket, so that particular optimization wouldn't work. */
+ info = NULL;
+ if (transport_map)
+ info = hash_table_get (transport_map, (void *)(intptr_t) fd);
+
+ if (info && info->imp->closer)
+ info->imp->closer (fd, info->ctx);
+ else
+ sock_close (fd);
+
+ if (info)
+ {
+ hash_table_remove (transport_map, (void *)(intptr_t) fd);
+ xfree (info);
+ ++transport_map_modified_tick;
+ }
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+connect_cleanup(void)
+{
+ if (transport_map)
+ {
+ hash_table_iterator iter;
+ for (hash_table_iterate (transport_map, &iter); hash_table_iter_next (&iter); )
+ {
+ xfree (iter.value);
+ }
+ hash_table_destroy (transport_map);
+ transport_map = NULL;
+ }
+}
+#endif
diff --git a/src/connect.h b/src/connect.h
new file mode 100644
index 0000000..8453559
--- /dev/null
+++ b/src/connect.h
@@ -0,0 +1,89 @@
+/* Declarations for connect.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef CONNECT_H
+#define CONNECT_H
+
+#include "host.h" /* for definition of ip_address */
+
+/* Function declarations */
+
+/* Returned by connect_to_host when host name cannot be resolved. */
+enum {
+ E_HOST = -100
+};
+int connect_to_host (const char *, int);
+int connect_to_ip (const ip_address *, int, const char *);
+
+int bind_local (const ip_address *, int *);
+int accept_connection (int);
+
+enum {
+ ENDPOINT_LOCAL,
+ ENDPOINT_PEER
+};
+bool socket_ip_address (int, ip_address *, int);
+int socket_family (int sock, int endpoint);
+
+bool retryable_socket_connect_error (int);
+
+/* Flags for select_fd's WAIT_FOR argument. */
+enum {
+ WAIT_FOR_READ = 1,
+ WAIT_FOR_WRITE = 2
+};
+int select_fd (int, double, int);
+bool test_socket_open (int);
+
+struct transport_implementation {
+ int (*reader) (int, char *, int, void *, double);
+ int (*writer) (int, char *, int, void *);
+ int (*poller) (int, double, int, void *);
+ int (*peeker) (int, char *, int, void *, double);
+ const char *(*errstr) (int, void *);
+ void (*closer) (int, void *);
+};
+
+void fd_register_transport (int, struct transport_implementation *, void *);
+void *fd_transport_context (int);
+int fd_read (int, char *, int, double);
+int fd_write (int, char *, int, double);
+int fd_peek (int, char *, int, double);
+const char *fd_errstr (int);
+void fd_close (int);
+void connect_cleanup (void);
+
+#ifdef WINDOWS
+int select_fd_nb (int, double, int);
+#else
+#define select_fd_nb select_fd
+#endif
+
+#endif /* CONNECT_H */
diff --git a/src/convert.c b/src/convert.c
new file mode 100644
index 0000000..f422178
--- /dev/null
+++ b/src/convert.c
@@ -0,0 +1,1230 @@
+/* Conversion of links to local files.
+ Copyright (C) 2003-2011, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <assert.h>
+#include "convert.h"
+#include "url.h"
+#include "recur.h"
+#include "utils.h"
+#include "hash.h"
+#include "ptimer.h"
+#include "res.h"
+#include "html-url.h"
+#include "css-url.h"
+#include "iri.h"
+#include "xstrndup.h"
+
+static struct hash_table *dl_file_url_map;
+struct hash_table *dl_url_file_map;
+
+/* Set of HTML/CSS files downloaded in this Wget run, used for link
+ conversion after Wget is done. */
+struct hash_table *downloaded_html_set;
+struct hash_table *downloaded_css_set;
+
+static void convert_links (const char *, struct urlpos *);
+
+
+static void
+convert_links_in_hashtable (struct hash_table *downloaded_set,
+ int is_css,
+ int *file_count)
+{
+ int i, cnt = 0;
+ char *arr[1024], **file_array;
+
+ if (!downloaded_set || (cnt = hash_table_count (downloaded_set)) == 0)
+ return;
+
+ if (cnt <= (int) countof (arr))
+ file_array = arr;
+ else
+ file_array = xmalloc (cnt * sizeof (arr[0]));
+
+ string_set_to_array (downloaded_set, file_array);
+
+ for (i = 0; i < cnt; i++)
+ {
+ struct urlpos *urls, *cur_url;
+ char *url;
+ char *file = file_array[i];
+
+ /* Determine the URL of the file. get_urls_{html,css} will need
+ it. */
+ url = hash_table_get (dl_file_url_map, file);
+ if (!url)
+ {
+ DEBUGP (("Apparently %s has been removed.\n", file));
+ continue;
+ }
+
+ DEBUGP (("Scanning %s (from %s)\n", file, url));
+
+ /* Parse the file... */
+ urls = is_css ? get_urls_css_file (file, url) :
+ get_urls_html (file, url, NULL, NULL);
+
+ /* We don't respect meta_disallow_follow here because, even if
+ the file is not followed, we might still want to convert the
+ links that have been followed from other files. */
+
+ for (cur_url = urls; cur_url; cur_url = cur_url->next)
+ {
+ char *local_name;
+ struct url *u;
+ struct iri *pi;
+
+ if (cur_url->link_base_p)
+ {
+ /* Base references have been resolved by our parser, so
+ we turn the base URL into an empty string. (Perhaps
+ we should remove the tag entirely?) */
+ cur_url->convert = CO_NULLIFY_BASE;
+ continue;
+ }
+
+ /* We decide the direction of conversion according to whether
+ a URL was downloaded. Downloaded URLs will be converted
+ ABS2REL, whereas non-downloaded will be converted REL2ABS. */
+
+ pi = iri_new ();
+ set_uri_encoding (pi, opt.locale, true);
+
+ u = url_parse (cur_url->url->url, NULL, pi, true);
+ if (!u)
+ continue;
+
+ local_name = hash_table_get (dl_url_file_map, u->url);
+
+ /* Decide on the conversion type. */
+ if (local_name)
+ {
+ /* We've downloaded this URL. Convert it to relative
+ form. We do this even if the URL already is in
+ relative form, because our directory structure may
+ not be identical to that on the server (think `-nd',
+ `--cut-dirs', etc.). If --convert-file-only was passed,
+ we only convert the basename portion of the URL. */
+ cur_url->convert = (opt.convert_file_only ? CO_CONVERT_BASENAME_ONLY : CO_CONVERT_TO_RELATIVE);
+ cur_url->local_name = xstrdup (local_name);
+ DEBUGP (("will convert url %s to local %s\n", u->url, local_name));
+ }
+ else
+ {
+ /* We haven't downloaded this URL. If it's not already
+ complete (including a full host name), convert it to
+ that form, so it can be reached while browsing this
+ HTML locally. */
+ if (!cur_url->link_complete_p)
+ cur_url->convert = CO_CONVERT_TO_COMPLETE;
+ cur_url->local_name = NULL;
+ DEBUGP (("will convert url %s to complete\n", u->url));
+ }
+
+ url_free (u);
+ iri_free (pi);
+ }
+
+ /* Convert the links in the file. */
+ convert_links (file, urls);
+ ++*file_count;
+
+ /* Free the data. */
+ free_urlpos (urls);
+ }
+
+ if (file_array != arr)
+ xfree (file_array);
+}
+
+/* This function is called when the retrieval is done to convert the
+ links that have been downloaded. It has to be called at the end of
+ the retrieval, because only then does Wget know conclusively which
+ URLs have been downloaded, and which not, so it can tell which
+ direction to convert to.
+
+ The "direction" means that the URLs to the files that have been
+ downloaded get converted to the relative URL which will point to
+ that file. And the other URLs get converted to the remote URL on
+ the server.
+
+ All the downloaded HTMLs are kept in downloaded_html_files, and
+ downloaded URLs in urls_downloaded. All the information is
+ extracted from these two lists. */
+
+void
+convert_all_links (void)
+{
+ double secs;
+ int file_count = 0;
+
+ struct ptimer *timer = ptimer_new ();
+
+ convert_links_in_hashtable (downloaded_html_set, 0, &file_count);
+ convert_links_in_hashtable (downloaded_css_set, 1, &file_count);
+
+ secs = ptimer_measure (timer);
+ logprintf (LOG_VERBOSE, _("Converted links in %d files in %s seconds.\n"),
+ file_count, print_decimal (secs));
+
+ ptimer_destroy (timer);
+}
+
+static void write_backup_file (const char *, downloaded_file_t);
+static const char *replace_plain (const char*, int, FILE*, const char *);
+static const char *replace_attr (const char *, int, FILE *, const char *);
+static const char *replace_attr_refresh_hack (const char *, int, FILE *,
+ const char *, int);
+static char *local_quote_string (const char *, bool);
+static char *construct_relative (const char *, const char *);
+static char *convert_basename (const char *, const struct urlpos *);
+
+/* Change the links in one file. LINKS is a list of links in the
+ document, along with their positions and the desired direction of
+ the conversion. */
+static void
+convert_links (const char *file, struct urlpos *links)
+{
+ struct file_memory *fm;
+ FILE *fp;
+ const char *p;
+ downloaded_file_t downloaded_file_return;
+
+ struct urlpos *link;
+ int to_url_count = 0, to_file_count = 0;
+
+ logprintf (LOG_VERBOSE, _("Converting links in %s... "), file);
+
+ {
+ /* First we do a "dry run": go through the list L and see whether
+ any URL needs to be converted in the first place. If not, just
+ leave the file alone. */
+ int dry_count = 0;
+ struct urlpos *dry;
+ for (dry = links; dry; dry = dry->next)
+ if (dry->convert != CO_NOCONVERT)
+ ++dry_count;
+ if (!dry_count)
+ {
+ logputs (LOG_VERBOSE, _("nothing to do.\n"));
+ return;
+ }
+ logprintf (LOG_VERBOSE, _("%d.\n"), dry_count);
+ }
+
+ fm = wget_read_file (file);
+ if (!fm)
+ {
+ logprintf (LOG_NOTQUIET, _("Cannot convert links in %s: %s\n"),
+ file, strerror (errno));
+ return;
+ }
+
+ downloaded_file_return = downloaded_file (CHECK_FOR_FILE, file);
+ if (opt.backup_converted && downloaded_file_return)
+ write_backup_file (file, downloaded_file_return);
+
+ /* Before opening the file for writing, unlink the file. This is
+ important if the data in FM is mapped. In such case, nulling the
+ file, which is what fopen() below does, would make us read all
+ zeroes from the mapped region. */
+ if (unlink (file) < 0 && errno != ENOENT)
+ {
+ logprintf (LOG_NOTQUIET, _("Unable to delete %s: %s\n"),
+ quote (file), strerror (errno));
+ wget_read_file_free (fm);
+ return;
+ }
+ /* Now open the file for writing. */
+ fp = fopen (file, "wb");
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, _("Cannot convert links in %s: %s\n"),
+ file, strerror (errno));
+ wget_read_file_free (fm);
+ return;
+ }
+
+ /* Here we loop through all the URLs in file, replacing those of
+ them that are downloaded with relative references. */
+ p = fm->content;
+ for (link = links; link; link = link->next)
+ {
+ char *url_start = fm->content + link->pos;
+
+ if (link->pos >= fm->length)
+ {
+ DEBUGP (("Something strange is going on. Please investigate."));
+ break;
+ }
+ /* If the URL is not to be converted, skip it. */
+ if (link->convert == CO_NOCONVERT)
+ {
+ DEBUGP (("Skipping %s at position %d.\n", link->url->url, link->pos));
+ continue;
+ }
+
+ /* Echo the file contents, up to the offending URL's opening
+ quote, to the outfile. */
+ fwrite (p, 1, url_start - p, fp);
+ p = url_start;
+
+ switch (link->convert)
+ {
+ case CO_CONVERT_TO_RELATIVE:
+ /* Convert absolute URL to relative. */
+ if (link->local_name) {
+ char *newname = construct_relative (file, link->local_name);
+ char *quoted_newname = local_quote_string (newname,
+ link->link_css_p);
+
+ if (link->link_css_p || link->link_noquote_html_p)
+ p = replace_plain (p, link->size, fp, quoted_newname);
+ else if (!link->link_refresh_p)
+ p = replace_attr (p, link->size, fp, quoted_newname);
+ else
+ p = replace_attr_refresh_hack (p, link->size, fp, quoted_newname,
+ link->refresh_timeout);
+
+ DEBUGP (("TO_RELATIVE: %s to %s at position %d in %s.\n",
+ link->url->url, newname, link->pos, file));
+
+ xfree (newname);
+ xfree (quoted_newname);
+ ++to_file_count;
+ }
+ break;
+ case CO_CONVERT_BASENAME_ONLY:
+ {
+ char *newname = convert_basename (p, link);
+ char *quoted_newname = local_quote_string (newname, link->link_css_p);
+
+ if (link->link_css_p || link->link_noquote_html_p)
+ p = replace_plain (p, link->size, fp, quoted_newname);
+ else if (!link->link_refresh_p)
+ p = replace_attr (p, link->size, fp, quoted_newname);
+ else
+ p = replace_attr_refresh_hack (p, link->size, fp, quoted_newname,
+ link->refresh_timeout);
+
+ DEBUGP (("Converted file part only: %s to %s at position %d in %s.\n",
+ link->url->url, newname, link->pos, file));
+
+ xfree (newname);
+ xfree (quoted_newname);
+ ++to_file_count;
+
+ break;
+ }
+ case CO_CONVERT_TO_COMPLETE:
+ /* Convert the link to absolute URL. */
+ {
+ char *newlink = link->url->url;
+ char *quoted_newlink = html_quote_string (newlink);
+
+ if (link->link_css_p || link->link_noquote_html_p)
+ p = replace_plain (p, link->size, fp, newlink);
+ else if (!link->link_refresh_p)
+ p = replace_attr (p, link->size, fp, quoted_newlink);
+ else
+ p = replace_attr_refresh_hack (p, link->size, fp, quoted_newlink,
+ link->refresh_timeout);
+
+ DEBUGP (("TO_COMPLETE: <something> to %s at position %d in %s.\n",
+ newlink, link->pos, file));
+
+ xfree (quoted_newlink);
+ ++to_url_count;
+ break;
+ }
+ case CO_NULLIFY_BASE:
+ /* Change the base href to "". */
+ p = replace_attr (p, link->size, fp, "");
+ break;
+ case CO_NOCONVERT:
+ abort ();
+ break;
+ }
+ }
+
+ /* Output the rest of the file. */
+ if (p - fm->content < fm->length)
+ fwrite (p, 1, fm->length - (p - fm->content), fp);
+ fclose (fp);
+ wget_read_file_free (fm);
+
+ logprintf (LOG_VERBOSE, "%d-%d\n", to_file_count, to_url_count);
+}
+
+/* Construct and return a link that points from BASEFILE to LINKFILE.
+ Both files should be local file names, BASEFILE of the referrering
+ file, and LINKFILE of the referred file.
+
+ Examples:
+
+ cr("foo", "bar") -> "bar"
+ cr("A/foo", "A/bar") -> "bar"
+ cr("A/foo", "A/B/bar") -> "B/bar"
+ cr("A/X/foo", "A/Y/bar") -> "../Y/bar"
+ cr("X/", "Y/bar") -> "../Y/bar" (trailing slash does matter in BASE)
+
+ Both files should be absolute or relative, otherwise strange
+ results might ensue. The function makes no special efforts to
+ handle "." and ".." in links, so make sure they're not there
+ (e.g. using path_simplify). */
+
+static char *
+construct_relative (const char *basefile, const char *linkfile)
+{
+ char *link;
+ int basedirs;
+ const char *b, *l;
+ int i, start;
+
+ /* First, skip the initial directory components common to both
+ files. */
+ start = 0;
+ for (b = basefile, l = linkfile; *b == *l && *b != '\0'; ++b, ++l)
+ {
+ if (*b == '/')
+ start = (b - basefile) + 1;
+ }
+ basefile += start;
+ linkfile += start;
+
+ /* With common directories out of the way, the situation we have is
+ as follows:
+ b - b1/b2/[...]/bfile
+ l - l1/l2/[...]/lfile
+
+ The link we're constructing needs to be:
+ lnk - ../../l1/l2/[...]/lfile
+
+ Where the number of ".."'s equals the number of bN directory
+ components in B. */
+
+ /* Count the directory components in B. */
+ basedirs = 0;
+ for (b = basefile; *b; b++)
+ {
+ if (*b == '/')
+ ++basedirs;
+ }
+
+ if (!basedirs && (b = strpbrk (linkfile, "/:")) && *b == ':')
+ {
+ link = xmalloc (2 + strlen (linkfile) + 1);
+ memcpy (link, "./", 2);
+ strcpy (link + 2, linkfile);
+ }
+ else
+ {
+ /* Construct LINK as explained above. */
+ link = xmalloc (3 * basedirs + strlen (linkfile) + 1);
+ for (i = 0; i < basedirs; i++)
+ memcpy (link + 3 * i, "../", 3);
+ strcpy (link + 3 * i, linkfile);
+ }
+
+ return link;
+}
+
+/* Construct and return a "transparent proxy" URL
+ reflecting changes made by --adjust-extension to the file component
+ (i.e., "basename") of the original URL, but leaving the "dirname"
+ of the URL (protocol://hostname... portion) untouched.
+
+ Think: populating a squid cache via a recursive wget scrape, where
+ changing URLs to work locally with "file://..." is NOT desirable.
+
+ Example:
+
+ if
+ p = "//foo.com/bar.cgi?xyz"
+ and
+ link->local_name = "docroot/foo.com/bar.cgi?xyz.css"
+ then
+
+ new_construct_func(p, link);
+ will return
+ "//foo.com/bar.cgi?xyz.css"
+
+ Essentially, we do s/$(basename orig_url)/$(basename link->local_name)/
+*/
+static char *
+convert_basename (const char *p, const struct urlpos *link)
+{
+ int len = link->size;
+ char *url = NULL;
+ char *org_basename = NULL, *local_basename;
+ char *result = NULL;
+
+ if (*p == '"' || *p == '\'')
+ {
+ len -= 2;
+ p++;
+ }
+
+ url = xstrndup (p, len);
+
+ org_basename = strrchr (url, '/');
+ if (org_basename)
+ org_basename++;
+ else
+ org_basename = url;
+
+ local_basename = link->local_name ? strrchr (link->local_name, '/') : NULL;
+ if (local_basename)
+ local_basename++;
+ else
+ local_basename = url;
+
+ /*
+ * If the basenames differ, graft the adjusted basename (local_basename)
+ * onto the original URL.
+ */
+ if (strcmp (org_basename, local_basename) == 0)
+ result = url;
+ else
+ {
+ result = uri_merge (url, local_basename);
+ xfree (url);
+ }
+
+ return result;
+}
+
+/* Used by write_backup_file to remember which files have been
+ written. */
+static struct hash_table *converted_files;
+
+static void
+write_backup_file (const char *file, downloaded_file_t downloaded_file_return)
+{
+ /* Rather than just writing over the original .html file with the
+ converted version, save the former to *.orig. Note we only do
+ this for files we've _successfully_ downloaded, so we don't
+ clobber .orig files sitting around from previous invocations.
+ On VMS, use "_orig" instead of ".orig". See "wget.h". */
+
+ if (!converted_files)
+ converted_files = make_string_hash_table (0);
+
+ /* We can get called twice on the same URL thanks to the
+ convert_all_links() call in main. If we write the .orig file
+ each time in such a case, it'll end up containing the first-pass
+ conversion, not the original file. So, see if we've already been
+ called on this file. */
+ if (!string_set_contains (converted_files, file))
+ {
+ /* Construct the backup filename as the original name plus ".orig". */
+ char buf[1024];
+ size_t filename_len = strlen (file);
+ char *filename_plus_orig_suffix;
+
+ if (filename_len < sizeof (buf) - 5)
+ filename_plus_orig_suffix = buf;
+ else
+ filename_plus_orig_suffix = xmalloc (filename_len + 5 + 1);
+
+ /* TODO: hack this to work with css files */
+ if (downloaded_file_return == FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED)
+ {
+ /* Just write "orig" over "html". We need to do it this way
+ because when we're checking to see if we've downloaded the
+ file before (to see if we can skip downloading it), we don't
+ know if it's a text/html file. Therefore we don't know yet
+ at that stage that -E is going to cause us to tack on
+ ".html", so we need to compare vs. the original URL plus
+ ".orig", not the original URL plus ".html.orig". */
+ memcpy (filename_plus_orig_suffix, file, filename_len - 4);
+ memcpy (filename_plus_orig_suffix + filename_len - 4, "orig", 5);
+ }
+ else /* downloaded_file_return == FILE_DOWNLOADED_NORMALLY */
+ {
+ /* Append ".orig" to the name. */
+ memcpy (filename_plus_orig_suffix, file, filename_len);
+ strcpy (filename_plus_orig_suffix + filename_len, ORIG_SFX);
+ }
+
+ /* Rename <file> to <file>.orig before former gets written over. */
+ if (rename (file, filename_plus_orig_suffix) != 0)
+ logprintf (LOG_NOTQUIET, _("Cannot back up %s as %s: %s\n"),
+ file, filename_plus_orig_suffix, strerror (errno));
+
+ if (filename_plus_orig_suffix != buf)
+ xfree (filename_plus_orig_suffix);
+
+ /* Remember that we've already written a .orig backup for this file.
+ Note that we never free this memory since we need it till the
+ convert_all_links() call, which is one of the last things the
+ program does before terminating. BTW, I'm not sure if it would be
+ safe to just set 'converted_file_ptr->string' to 'file' below,
+ rather than making a copy of the string... Another note is that I
+ thought I could just add a field to the urlpos structure saying
+ that we'd written a .orig file for this URL, but that didn't work,
+ so I had to make this separate list.
+ -- Dan Harkless <wget@harkless.org>
+
+ This [adding a field to the urlpos structure] didn't work
+ because convert_file() is called from convert_all_links at
+ the end of the retrieval with a freshly built new urlpos
+ list.
+ -- Hrvoje Niksic <hniksic@xemacs.org>
+ */
+ string_set_add (converted_files, file);
+ }
+}
+
+static bool find_fragment (const char *, int, const char **, const char **);
+
+/* Replace a string with NEW_TEXT. Ignore quoting. */
+static const char *
+replace_plain (const char *p, int size, FILE *fp, const char *new_text)
+{
+ fputs (new_text, fp);
+ p += size;
+ return p;
+}
+
+/* Replace an attribute's original text with NEW_TEXT. */
+
+static const char *
+replace_attr (const char *p, int size, FILE *fp, const char *new_text)
+{
+ bool quote_flag = false;
+ char quote_char = '\"'; /* use "..." for quoting, unless the
+ original value is quoted, in which
+ case reuse its quoting char. */
+ const char *frag_beg, *frag_end;
+
+ /* Structure of our string is:
+ "...old-contents..."
+ <--- size ---> (with quotes)
+ OR:
+ ...old-contents...
+ <--- size --> (no quotes) */
+
+ if (*p == '\"' || *p == '\'')
+ {
+ quote_char = *p;
+ quote_flag = true;
+ ++p;
+ size -= 2; /* disregard opening and closing quote */
+ }
+ putc (quote_char, fp);
+ fputs (new_text, fp);
+
+ /* Look for fragment identifier, if any. */
+ if (find_fragment (p, size, &frag_beg, &frag_end))
+ fwrite (frag_beg, 1, frag_end - frag_beg, fp);
+ p += size;
+ if (quote_flag)
+ ++p;
+ putc (quote_char, fp);
+
+ return p;
+}
+
+/* The same as REPLACE_ATTR, but used when replacing
+ <meta http-equiv=refresh content="new_text"> because we need to
+ append "timeout_value; URL=" before the next_text. */
+
+static const char *
+replace_attr_refresh_hack (const char *p, int size, FILE *fp,
+ const char *new_text, int timeout)
+{
+ /* "0; URL=..." */
+ char new_with_timeout[1024];
+
+ if (((unsigned) snprintf (
+ new_with_timeout, sizeof (new_with_timeout),
+ "%d; URL=%s", timeout, new_text)) >= sizeof (new_with_timeout))
+ {
+ // very unlikely fallback using heap memory
+ char *tmp = aprintf("%d; URL=%s", timeout, new_text);
+ const char *res = replace_attr (p, size, fp, tmp);
+ xfree (tmp);
+ return res;
+ }
+
+ return replace_attr (p, size, fp, new_with_timeout);
+}
+
+/* Find the first occurrence of '#' in [BEG, BEG+SIZE) that is not
+ preceded by '&'. If the character is not found, return zero. If
+ the character is found, return true and set BP and EP to point to
+ the beginning and end of the region.
+
+ This is used for finding the fragment indentifiers in URLs. */
+
+static bool
+find_fragment (const char *beg, int size, const char **bp, const char **ep)
+{
+ const char *end = beg + size;
+ bool saw_amp = false;
+ for (; beg < end; beg++)
+ {
+ switch (*beg)
+ {
+ case '&':
+ saw_amp = true;
+ break;
+ case '#':
+ if (!saw_amp)
+ {
+ *bp = beg;
+ *ep = end;
+ return true;
+ }
+ /* fallthrough */
+ default:
+ saw_amp = false;
+ }
+ }
+ return false;
+}
+
+/* Quote FILE for use as local reference to an HTML file.
+
+ We quote ? as %3F to avoid passing part of the file name as the
+ parameter when browsing the converted file through HTTP. However,
+ it is safe to do this only when `--adjust-extension' is turned on.
+ This is because converting "index.html?foo=bar" to
+ "index.html%3Ffoo=bar" would break local browsing, as the latter
+ isn't even recognized as an HTML file! However, converting
+ "index.html?foo=bar.html" to "index.html%3Ffoo=bar.html" should be
+ safe for both local and HTTP-served browsing.
+
+ We always quote "#" as "%23", "%" as "%25" and ";" as "%3B"
+ because those characters have special meanings in URLs. */
+
+static char *
+local_quote_string (const char *file, bool no_html_quote)
+{
+ const char *from;
+ char *newname, *to, *res;
+ char buf[1024];
+ size_t tolen;
+
+ char *any = strpbrk (file, "?#%;");
+ if (!any)
+ return no_html_quote ? strdup (file) : html_quote_string (file);
+
+ /* Allocate space assuming the worst-case scenario, each character
+ having to be quoted. */
+ tolen = 3 * strlen (file);
+ if (tolen < sizeof (buf))
+ to = newname = buf;
+ else
+ to = newname = xmalloc (tolen + 1);
+
+ for (from = file; *from; from++)
+ switch (*from)
+ {
+ case '%':
+ *to++ = '%';
+ *to++ = '2';
+ *to++ = '5';
+ break;
+ case '#':
+ *to++ = '%';
+ *to++ = '2';
+ *to++ = '3';
+ break;
+ case ';':
+ *to++ = '%';
+ *to++ = '3';
+ *to++ = 'B';
+ break;
+ case '?':
+ if (opt.adjust_extension)
+ {
+ *to++ = '%';
+ *to++ = '3';
+ *to++ = 'F';
+ break;
+ }
+ /* fallthrough */
+ default:
+ *to++ = *from;
+ }
+ *to = '\0';
+
+ if (newname == buf)
+ return no_html_quote ? strdup (newname) : html_quote_string (newname);
+
+ if (no_html_quote)
+ return newname;
+
+ res = html_quote_string (newname);
+ xfree (newname);
+ return res;
+}
+
+/* Book-keeping code for dl_file_url_map, dl_url_file_map,
+ downloaded_html_list, and downloaded_html_set. Other code calls
+ these functions to let us know that a file has been downloaded. */
+
+#define ENSURE_TABLES_EXIST do { \
+ if (!dl_file_url_map) \
+ dl_file_url_map = make_string_hash_table (0); \
+ if (!dl_url_file_map) \
+ dl_url_file_map = make_string_hash_table (0); \
+} while (0)
+
+/* Return true if S1 and S2 are the same, except for "/index.html".
+ The three cases in which it returns one are (substitute any
+ substring for "foo"):
+
+ m("foo/index.html", "foo/") ==> 1
+ m("foo/", "foo/index.html") ==> 1
+ m("foo", "foo/index.html") ==> 1
+ m("foo", "foo/" ==> 1
+ m("foo", "foo") ==> 1 */
+
+static bool
+match_except_index (const char *s1, const char *s2)
+{
+ int i;
+ const char *lng;
+
+ /* Skip common substring. */
+ for (i = 0; *s1 && *s2 && *s1 == *s2; s1++, s2++, i++)
+ ;
+ if (i == 0)
+ /* Strings differ at the very beginning -- bail out. We need to
+ check this explicitly to avoid `lng - 1' reading outside the
+ array. */
+ return false;
+
+ if (!*s1 && !*s2)
+ /* Both strings hit EOF -- strings are equal. */
+ return true;
+ else if (*s1 && *s2)
+ /* Strings are randomly different, e.g. "/foo/bar" and "/foo/qux". */
+ return false;
+ else if (*s1)
+ /* S1 is the longer one. */
+ lng = s1;
+ else
+ /* S2 is the longer one. */
+ lng = s2;
+
+ /* foo */ /* foo/ */
+ /* foo/index.html */ /* or */ /* foo/index.html */
+ /* ^ */ /* ^ */
+
+ if (*lng != '/')
+ /* The right-hand case. */
+ --lng;
+
+ if (*lng == '/' && *(lng + 1) == '\0')
+ /* foo */
+ /* foo/ */
+ return true;
+
+ return 0 == strcmp (lng, "/index.html");
+}
+
+static int
+dissociate_urls_from_file_mapper (void *key, void *value, void *arg)
+{
+ char *mapping_url = (char *)key;
+ char *mapping_file = (char *)value;
+ char *file = (char *)arg;
+
+ if (0 == strcmp (mapping_file, file))
+ {
+ hash_table_remove (dl_url_file_map, mapping_url);
+ xfree (mapping_url);
+ xfree (mapping_file);
+ }
+
+ /* Continue mapping. */
+ return 0;
+}
+
+/* Remove all associations from various URLs to FILE from dl_url_file_map. */
+
+static void
+dissociate_urls_from_file (const char *file)
+{
+ /* Can't use hash_table_iter_* because the table mutates while mapping. */
+ hash_table_for_each (dl_url_file_map, dissociate_urls_from_file_mapper,
+ (char *) file);
+}
+
+/* Register that URL has been successfully downloaded to FILE. This
+ is used by the link conversion code to convert references to URLs
+ to references to local files. It is also being used to check if a
+ URL has already been downloaded. */
+
+void
+register_download (const char *url, const char *file)
+{
+ char *old_file, *old_url;
+
+ ENSURE_TABLES_EXIST;
+
+ /* With some forms of retrieval, it is possible, although not likely
+ or particularly desirable. If both are downloaded, the second
+ download will override the first one. When that happens,
+ dissociate the old file name from the URL. */
+
+ if (hash_table_get_pair (dl_file_url_map, file, &old_file, &old_url))
+ {
+ if (0 == strcmp (url, old_url))
+ /* We have somehow managed to download the same URL twice.
+ Nothing to do. */
+ return;
+
+ if (match_except_index (url, old_url)
+ && !hash_table_contains (dl_url_file_map, url))
+ /* The two URLs differ only in the "index.html" ending. For
+ example, one is "http://www.server.com/", and the other is
+ "http://www.server.com/index.html". Don't remove the old
+ one, just add the new one as a non-canonical entry. */
+ goto url_only;
+
+ hash_table_remove (dl_file_url_map, file);
+ xfree (old_file);
+ xfree (old_url);
+
+ /* Remove all the URLs that point to this file. Yes, there can
+ be more than one such URL, because we store redirections as
+ multiple entries in dl_url_file_map. For example, if URL1
+ redirects to URL2 which gets downloaded to FILE, we map both
+ URL1 and URL2 to FILE in dl_url_file_map. (dl_file_url_map
+ only points to URL2.) When another URL gets loaded to FILE,
+ we want both URL1 and URL2 dissociated from it.
+
+ This is a relatively expensive operation because it performs
+ a linear search of the whole hash table, but it should be
+ called very rarely, only when two URLs resolve to the same
+ file name, *and* the "<file>.1" extensions are turned off.
+ In other words, almost never. */
+ dissociate_urls_from_file (file);
+ }
+
+ hash_table_put (dl_file_url_map, xstrdup (file), xstrdup (url));
+
+ url_only:
+ /* A URL->FILE mapping is not possible without a FILE->URL mapping.
+ If the latter were present, it should have been removed by the
+ above `if'. So we could write:
+
+ assert (!hash_table_contains (dl_url_file_map, url));
+
+ The above is correct when running in recursive mode where the
+ same URL always resolves to the same file. But if you do
+ something like:
+
+ wget URL URL
+
+ then the first URL will resolve to "FILE", and the other to
+ "FILE.1". In that case, FILE.1 will not be found in
+ dl_file_url_map, but URL will still point to FILE in
+ dl_url_file_map. */
+ if (hash_table_get_pair (dl_url_file_map, url, &old_url, &old_file))
+ {
+ hash_table_remove (dl_url_file_map, url);
+ xfree (old_url);
+ xfree (old_file);
+ }
+
+ hash_table_put (dl_url_file_map, xstrdup (url), xstrdup (file));
+}
+
+/* Register that FROM has been redirected to "TO". This assumes that TO
+ is successfully downloaded and already registered using
+ register_download() above. */
+
+void
+register_redirection (const char *from, const char *to)
+{
+ char *file;
+
+ ENSURE_TABLES_EXIST;
+
+ file = hash_table_get (dl_url_file_map, to);
+ assert (file != NULL);
+ if (!hash_table_contains (dl_url_file_map, from))
+ hash_table_put (dl_url_file_map, xstrdup (from), xstrdup (file));
+}
+
+/* Register that the file has been deleted. */
+
+void
+register_delete_file (const char *file)
+{
+ char *old_url, *old_file;
+
+ ENSURE_TABLES_EXIST;
+
+ if (!hash_table_get_pair (dl_file_url_map, file, &old_file, &old_url))
+ return;
+
+ hash_table_remove (dl_file_url_map, file);
+ xfree (old_file);
+ xfree (old_url);
+ dissociate_urls_from_file (file);
+}
+
+/* Register that FILE is an HTML file that has been downloaded. */
+
+void
+register_html (const char *file)
+{
+ if (!downloaded_html_set)
+ downloaded_html_set = make_string_hash_table (0);
+ string_set_add (downloaded_html_set, file);
+}
+
+/* Register that FILE is a CSS file that has been downloaded. */
+
+void
+register_css (const char *file)
+{
+ if (!downloaded_css_set)
+ downloaded_css_set = make_string_hash_table (0);
+ string_set_add (downloaded_css_set, file);
+}
+
+/* Cleanup the data structures associated with this file. */
+
+#if defined DEBUG_MALLOC || defined TESTING
+static void downloaded_files_free (void);
+
+void
+convert_cleanup (void)
+{
+ if (dl_file_url_map)
+ {
+ free_keys_and_values (dl_file_url_map);
+ hash_table_destroy (dl_file_url_map);
+ dl_file_url_map = NULL;
+ }
+ if (dl_url_file_map)
+ {
+ free_keys_and_values (dl_url_file_map);
+ hash_table_destroy (dl_url_file_map);
+ dl_url_file_map = NULL;
+ }
+ if (downloaded_html_set)
+ string_set_free (downloaded_html_set);
+ if (downloaded_css_set)
+ string_set_free (downloaded_css_set);
+ downloaded_files_free ();
+ if (converted_files)
+ string_set_free (converted_files);
+}
+#endif
+
+/* Book-keeping code for downloaded files that enables extension
+ hacks. */
+
+/* This table should really be merged with dl_file_url_map and
+ downloaded_html_files. This was originally a list, but I changed
+ it to a hash table because it was actually taking a lot of time to
+ find things in it. */
+
+static struct hash_table *downloaded_files_hash;
+
+/* We're storing "modes" of type downloaded_file_t in the hash table.
+ However, our hash tables only accept pointers for keys and values.
+ So when we need a pointer, we use the address of a
+ downloaded_file_t variable of static storage. */
+
+static downloaded_file_t *
+downloaded_mode_to_ptr (downloaded_file_t mode)
+{
+ static downloaded_file_t
+ v1 = FILE_NOT_ALREADY_DOWNLOADED,
+ v2 = FILE_DOWNLOADED_NORMALLY,
+ v3 = FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED,
+ v4 = CHECK_FOR_FILE;
+
+ switch (mode)
+ {
+ case FILE_NOT_ALREADY_DOWNLOADED:
+ return &v1;
+ case FILE_DOWNLOADED_NORMALLY:
+ return &v2;
+ case FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED:
+ return &v3;
+ case CHECK_FOR_FILE:
+ return &v4;
+ }
+ return NULL;
+}
+
+/* Remembers which files have been downloaded. In the standard case,
+ should be called with mode == FILE_DOWNLOADED_NORMALLY for each
+ file we actually download successfully (i.e. not for ones we have
+ failures on or that we skip due to -N).
+
+ When we've downloaded a file and tacked on a ".html" extension due
+ to -E, call this function with
+ FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED rather than
+ FILE_DOWNLOADED_NORMALLY.
+
+ If you just want to check if a file has been previously added
+ without adding it, call with mode == CHECK_FOR_FILE. Please be
+ sure to call this function with local filenames, not remote
+ URLs. */
+
+downloaded_file_t
+downloaded_file (downloaded_file_t mode, const char *file)
+{
+ downloaded_file_t *ptr;
+
+ if (mode == CHECK_FOR_FILE)
+ {
+ if (!downloaded_files_hash)
+ return FILE_NOT_ALREADY_DOWNLOADED;
+ ptr = hash_table_get (downloaded_files_hash, file);
+ if (!ptr)
+ return FILE_NOT_ALREADY_DOWNLOADED;
+ return *ptr;
+ }
+
+ if (!downloaded_files_hash)
+ downloaded_files_hash = make_string_hash_table (0);
+
+ ptr = hash_table_get (downloaded_files_hash, file);
+ if (ptr)
+ return *ptr;
+
+ ptr = downloaded_mode_to_ptr (mode);
+ hash_table_put (downloaded_files_hash, xstrdup (file), ptr);
+
+ return FILE_NOT_ALREADY_DOWNLOADED;
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+static void
+downloaded_files_free (void)
+{
+ if (downloaded_files_hash)
+ {
+ hash_table_iterator iter;
+ for (hash_table_iterate (downloaded_files_hash, &iter);
+ hash_table_iter_next (&iter);
+ )
+ xfree (iter.key);
+ hash_table_destroy (downloaded_files_hash);
+ downloaded_files_hash = NULL;
+ }
+}
+#endif
+
+/* The function returns the pointer to the malloc-ed quoted version of
+ string s. It will recognize and quote numeric and special graphic
+ entities, as per RFC1866:
+
+ `&' -> `&amp;'
+ `<' -> `&lt;'
+ `>' -> `&gt;'
+ `"' -> `&quot;'
+ SP -> `&#32;'
+
+ No other entities are recognized or replaced. */
+char *
+html_quote_string (const char *s)
+{
+ const char *b = s;
+ char *p, *res;
+ int i;
+
+ /* Pass through the string, and count the new size. */
+ for (i = 0; *s; s++, i++)
+ {
+ if (*s == '&')
+ i += 4; /* `amp;' */
+ else if (*s == '<' || *s == '>')
+ i += 3; /* `lt;' and `gt;' */
+ else if (*s == '\"')
+ i += 5; /* `quot;' */
+ else if (*s == ' ')
+ i += 4; /* #32; */
+ }
+ res = xmalloc (i + 1);
+ s = b;
+ for (p = res; *s; s++)
+ {
+ switch (*s)
+ {
+ case '&':
+ *p++ = '&';
+ *p++ = 'a';
+ *p++ = 'm';
+ *p++ = 'p';
+ *p++ = ';';
+ break;
+ case '<': case '>':
+ *p++ = '&';
+ *p++ = (*s == '<' ? 'l' : 'g');
+ *p++ = 't';
+ *p++ = ';';
+ break;
+ case '\"':
+ *p++ = '&';
+ *p++ = 'q';
+ *p++ = 'u';
+ *p++ = 'o';
+ *p++ = 't';
+ *p++ = ';';
+ break;
+ case ' ':
+ *p++ = '&';
+ *p++ = '#';
+ *p++ = '3';
+ *p++ = '2';
+ *p++ = ';';
+ break;
+ default:
+ *p++ = *s;
+ }
+ }
+ *p = '\0';
+ return res;
+}
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/src/convert.h b/src/convert.h
new file mode 100644
index 0000000..531afbd
--- /dev/null
+++ b/src/convert.h
@@ -0,0 +1,115 @@
+/* Declarations for convert.c
+ Copyright (C) 2003-2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef CONVERT_H
+#define CONVERT_H
+
+struct hash_table; /* forward decl */
+extern struct hash_table *dl_url_file_map;
+extern struct hash_table *downloaded_html_set;
+extern struct hash_table *downloaded_css_set;
+
+enum convert_options {
+ CO_NOCONVERT = 0, /* don't convert this URL */
+ CO_CONVERT_TO_RELATIVE, /* convert to relative, e.g. to
+ "../../otherdir/foo.gif" */
+ CO_CONVERT_BASENAME_ONLY, /* convert the file portion only (basename)
+ leaving the rest of the URL unchanged */
+ CO_CONVERT_TO_COMPLETE, /* convert to absolute, e.g. to
+ "http://orighost/somedir/bar.jpg". */
+ CO_NULLIFY_BASE /* change to empty string. */
+};
+
+struct url;
+
+/* A structure that defines the whereabouts of a URL, i.e. its
+ position in an HTML document, etc. */
+
+struct urlpos {
+ struct url *url; /* the URL of the link, after it has
+ been merged with the base */
+ char *local_name; /* local file to which it was saved
+ (used by convert_links) */
+
+ /* reserved for special links such as <base href="..."> which are
+ used when converting links, but ignored when downloading. */
+ unsigned int ignore_when_downloading :1;
+
+ /* Information about the original link: */
+
+ unsigned int link_relative_p :1; /* the link was relative */
+ unsigned int link_complete_p :1; /* the link was complete (had host name) */
+ unsigned int link_base_p :1; /* the url came from <base href=...> */
+ unsigned int link_inline_p :1; /* needed to render the page */
+ unsigned int link_css_p :1; /* the url came from CSS */
+ unsigned int link_noquote_html_p :1; /* from HTML, but doesn't need " */
+ unsigned int link_expect_html :1; /* expected to contain HTML */
+ unsigned int link_expect_css :1; /* expected to contain CSS */
+
+ unsigned int link_refresh_p :1; /* link was received from
+ <meta http-equiv=refresh content=...> */
+ int refresh_timeout; /* for reconstructing the refresh. */
+
+ /* Conversion requirements: */
+ enum convert_options convert; /* is conversion required? */
+
+ /* URL's position in the buffer. */
+ int pos, size;
+
+ struct urlpos *next; /* next list element */
+};
+
+/* downloaded_file() takes a parameter of this type and returns this type. */
+typedef enum
+{
+ /* Return enumerators: */
+ FILE_NOT_ALREADY_DOWNLOADED = 0,
+
+ /* Return / parameter enumerators: */
+ FILE_DOWNLOADED_NORMALLY,
+ FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED,
+
+ /* Parameter enumerators: */
+ CHECK_FOR_FILE
+} downloaded_file_t;
+
+downloaded_file_t downloaded_file (downloaded_file_t, const char *);
+
+void register_download (const char *, const char *);
+void register_redirection (const char *, const char *);
+void register_html (const char *);
+void register_css (const char *);
+void register_delete_file (const char *);
+void convert_all_links (void);
+void convert_cleanup (void);
+
+char *html_quote_string (const char *);
+
+#endif /* CONVERT_H */
diff --git a/src/cookies.c b/src/cookies.c
new file mode 100644
index 0000000..6ddb931
--- /dev/null
+++ b/src/cookies.c
@@ -0,0 +1,1539 @@
+/* Support for cookies.
+ Copyright (C) 2001-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* Written by Hrvoje Niksic. Parts are loosely inspired by the
+ cookie patch submitted by Tomasz Wegrzanowski.
+
+ This implements the client-side cookie support, as specified
+ (loosely) by Netscape's "preliminary specification", currently
+ available at:
+
+ http://wp.netscape.com/newsref/std/cookie_spec.html
+
+ rfc2109 is not supported because of its incompatibilities with the
+ above widely-used specification. rfc2965 is entirely ignored,
+ since popular client software doesn't implement it, and even the
+ sites that do send Set-Cookie2 also emit Set-Cookie for
+ compatibility. */
+
+#include "wget.h"
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <time.h>
+#ifdef HAVE_LIBPSL
+# include <libpsl.h>
+#endif
+#include "utils.h"
+#include "hash.h"
+#include "cookies.h"
+#include "http.h" /* for http_atotm */
+#include "c-strcase.h"
+
+
+/* Declarations of `struct cookie' and the most basic functions. */
+
+/* Cookie jar serves as cookie storage and a means of retrieving
+ cookies efficiently. All cookies with the same domain are stored
+ in a linked list called "chain". A cookie chain can be reached by
+ looking up the domain in the cookie jar's chains_by_domain table.
+
+ For example, to reach all the cookies under google.com, one must
+ execute hash_table_get(jar->chains_by_domain, "google.com"). Of
+ course, when sending a cookie to `www.google.com', one must search
+ for cookies that belong to either `www.google.com' or `google.com'
+ -- but the point is that the code doesn't need to go through *all*
+ the cookies. */
+
+struct cookie_jar {
+ /* Cookie chains indexed by domain. */
+ struct hash_table *chains;
+
+ int cookie_count; /* number of cookies in the jar. */
+};
+
+/* Value set by entry point functions, so that the low-level
+ routines don't need to call time() all the time. */
+static time_t cookies_now;
+
+struct cookie_jar *
+cookie_jar_new (void)
+{
+ struct cookie_jar *jar = xnew (struct cookie_jar);
+ jar->chains = make_nocase_string_hash_table (0);
+ jar->cookie_count = 0;
+ return jar;
+}
+
+struct cookie {
+ char *domain; /* domain of the cookie */
+ int port; /* port number */
+ char *path; /* path prefix of the cookie */
+
+ unsigned discard_requested :1;/* whether cookie was created to
+ request discarding another
+ cookie. */
+
+ unsigned secure :1; /* whether cookie should be
+ transmitted over non-https
+ connections. */
+ unsigned domain_exact :1; /* whether DOMAIN must match as a
+ whole. */
+
+ unsigned permanent :1; /* whether the cookie should outlive
+ the session. */
+ time_t expiry_time; /* time when the cookie expires, 0
+ means undetermined. */
+
+ char *attr; /* cookie attribute name */
+ char *value; /* cookie attribute value */
+
+ struct cookie *next; /* used for chaining of cookies in the
+ same domain. */
+};
+
+#define PORT_ANY (-1)
+
+/* Allocate and return a new, empty cookie structure. */
+
+static struct cookie *
+cookie_new (void)
+{
+ struct cookie *cookie = xnew0 (struct cookie);
+
+ /* Both cookie->permanent and cookie->expiry_time are now 0. This
+ means that the cookie doesn't expire, but is only valid for this
+ session (i.e. not written out to disk). */
+
+ cookie->port = PORT_ANY;
+ return cookie;
+}
+
+/* Non-zero if the cookie has expired. Assumes cookies_now has been
+ set by one of the entry point functions. */
+
+static bool
+cookie_expired_p (const struct cookie *c)
+{
+ return c->expiry_time != 0 && c->expiry_time < cookies_now;
+}
+
+/* Deallocate COOKIE and its components. */
+
+static void
+delete_cookie (struct cookie *cookie)
+{
+ xfree (cookie->domain);
+ xfree (cookie->path);
+ xfree (cookie->attr);
+ xfree (cookie->value);
+ xfree (cookie);
+}
+
+/* Functions for storing cookies.
+
+ All cookies can be reached beginning with jar->chains. The key in
+ that table is the domain name, and the value is a linked list of
+ all cookies from that domain. Every new cookie is placed on the
+ head of the list. */
+
+/* Find and return a cookie in JAR whose domain, path, and attribute
+ name correspond to COOKIE. If found, PREVPTR will point to the
+ location of the cookie previous in chain, or NULL if the found
+ cookie is the head of a chain.
+
+ If no matching cookie is found, return NULL. */
+
+static struct cookie *
+find_matching_cookie (struct cookie_jar *jar, struct cookie *cookie,
+ struct cookie **prevptr)
+{
+ struct cookie *chain, *prev;
+
+ chain = hash_table_get (jar->chains, cookie->domain);
+ if (!chain)
+ goto nomatch;
+
+ prev = NULL;
+ for (; chain; prev = chain, chain = chain->next)
+ if (0 == strcmp (cookie->path, chain->path)
+ && 0 == strcmp (cookie->attr, chain->attr)
+ && cookie->port == chain->port)
+ {
+ *prevptr = prev;
+ return chain;
+ }
+
+ nomatch:
+ *prevptr = NULL;
+ return NULL;
+}
+
+/* Store COOKIE to the jar.
+
+ This is done by placing COOKIE at the head of its chain. However,
+ if COOKIE matches a cookie already in memory, as determined by
+ find_matching_cookie, the old cookie is unlinked and destroyed.
+
+ The key of each chain's hash table entry is allocated only the
+ first time; next hash_table_put's reuse the same key. */
+
+static void
+store_cookie (struct cookie_jar *jar, struct cookie *cookie)
+{
+ struct cookie *chain_head;
+ char *chain_key;
+
+ if (hash_table_get_pair (jar->chains, cookie->domain,
+ &chain_key, &chain_head))
+ {
+ /* A chain of cookies in this domain already exists. Check for
+ duplicates -- if an extant cookie exactly matches our domain,
+ port, path, and name, replace it. */
+ struct cookie *prev;
+ struct cookie *victim = find_matching_cookie (jar, cookie, &prev);
+
+ if (victim)
+ {
+ /* Remove VICTIM from the chain. COOKIE will be placed at
+ the head. */
+ if (prev)
+ {
+ prev->next = victim->next;
+ cookie->next = chain_head;
+ }
+ else
+ {
+ /* prev is NULL; apparently VICTIM was at the head of
+ the chain. This place will be taken by COOKIE, so
+ all we need to do is: */
+ cookie->next = victim->next;
+ }
+ delete_cookie (victim);
+ --jar->cookie_count;
+ DEBUGP (("Deleted old cookie (to be replaced.)\n"));
+ }
+ else
+ cookie->next = chain_head;
+ }
+ else
+ {
+ /* We are now creating the chain. Use a copy of cookie->domain
+ as the key for the life-time of the chain. Using
+ cookie->domain would be unsafe because the life-time of the
+ chain may exceed the life-time of the cookie. (Cookies may
+ be deleted from the chain by this very function.) */
+ cookie->next = NULL;
+ chain_key = xstrdup (cookie->domain);
+ }
+
+ hash_table_put (jar->chains, chain_key, cookie);
+ ++jar->cookie_count;
+
+ IF_DEBUG
+ {
+ time_t exptime = cookie->expiry_time;
+ DEBUGP (("\nStored cookie %s %d%s %s <%s> <%s> [expiry %s] %s %s\n",
+ cookie->domain, cookie->port,
+ cookie->port == PORT_ANY ? " (ANY)" : "",
+ cookie->path,
+ cookie->permanent ? "permanent" : "session",
+ cookie->secure ? "secure" : "insecure",
+ cookie->expiry_time ? datetime_str (exptime) : "none",
+ cookie->attr, cookie->value));
+ }
+}
+
+/* Discard a cookie matching COOKIE's domain, port, path, and
+ attribute name. This gets called when we encounter a cookie whose
+ expiry date is in the past, or whose max-age is set to 0. The
+ former corresponds to netscape cookie spec, while the latter is
+ specified by rfc2109. */
+
+static void
+discard_matching_cookie (struct cookie_jar *jar, struct cookie *cookie)
+{
+ struct cookie *prev, *victim;
+
+ if (!hash_table_count (jar->chains))
+ /* No elements == nothing to discard. */
+ return;
+
+ victim = find_matching_cookie (jar, cookie, &prev);
+ if (victim)
+ {
+ if (prev)
+ /* Simply unchain the victim. */
+ prev->next = victim->next;
+ else
+ {
+ /* VICTIM was head of its chain. We need to place a new
+ cookie at the head. */
+ char *chain_key = NULL;
+ int res;
+
+ res = hash_table_get_pair (jar->chains, victim->domain,
+ &chain_key, NULL);
+
+ if (res == 0)
+ {
+ logprintf (LOG_VERBOSE, _("Unable to get cookie for %s\n"),
+ victim->domain);
+ }
+ if (!victim->next)
+ {
+ /* VICTIM was the only cookie in the chain. Destroy the
+ chain and deallocate the chain key. */
+ hash_table_remove (jar->chains, victim->domain);
+ xfree (chain_key);
+ }
+ else
+ hash_table_put (jar->chains, chain_key, victim->next);
+ }
+ delete_cookie (victim);
+ DEBUGP (("Discarded old cookie.\n"));
+ }
+}
+
+/* Functions for parsing the `Set-Cookie' header, and creating new
+ cookies from the wire. */
+
+#define TOKEN_IS(token, string_literal) \
+ BOUNDED_EQUAL_NO_CASE (token.b, token.e, string_literal)
+
+#define TOKEN_NON_EMPTY(token) (token.b != NULL && token.b != token.e)
+
+/* Parse the contents of the `Set-Cookie' header. The header looks
+ like this:
+
+ name1=value1; name2=value2; ...
+
+ Trailing semicolon is optional; spaces are allowed between all
+ tokens. Additionally, values may be quoted.
+
+ A new cookie is returned upon success, NULL otherwise.
+
+ The first name-value pair will be used to set the cookie's
+ attribute name and value. Subsequent parameters will be checked
+ against field names such as `domain', `path', etc. Recognized
+ fields will be parsed and the corresponding members of COOKIE
+ filled. */
+
+static struct cookie *
+parse_set_cookie (const char *set_cookie, bool silent)
+{
+ const char *ptr = set_cookie;
+ struct cookie *cookie = cookie_new ();
+ param_token name, value;
+
+ if (!extract_param (&ptr, &name, &value, ';', NULL))
+ goto error;
+ if (!value.b)
+ goto error;
+
+ /* If the value is quoted, do not modify it. */
+ if (*(value.b - 1) == '"')
+ value.b--;
+ if (*value.e == '"')
+ value.e++;
+
+ cookie->attr = strdupdelim (name.b, name.e);
+ cookie->value = strdupdelim (value.b, value.e);
+
+ while (extract_param (&ptr, &name, &value, ';', NULL))
+ {
+ if (TOKEN_IS (name, "domain"))
+ {
+ if (!TOKEN_NON_EMPTY (value))
+ goto error;
+ xfree (cookie->domain);
+ /* Strictly speaking, we should set cookie->domain_exact if the
+ domain doesn't begin with a dot. But many sites set the
+ domain to "foo.com" and expect "subhost.foo.com" to get the
+ cookie, and it apparently works in browsers. */
+ if (*value.b == '.')
+ ++value.b;
+ cookie->domain = strdupdelim (value.b, value.e);
+ }
+ else if (TOKEN_IS (name, "path"))
+ {
+ if (!TOKEN_NON_EMPTY (value))
+ goto error;
+ xfree (cookie->path);
+ cookie->path = strdupdelim (value.b, value.e);
+ }
+ else if (TOKEN_IS (name, "expires"))
+ {
+ char value_copy[128];
+ size_t value_len = value.e - value.b;
+ time_t expires;
+
+ if (!TOKEN_NON_EMPTY (value) || value_len >= sizeof (value_copy))
+ goto error;
+
+ memcpy (value_copy, value.b, value_len);
+ value_copy[value_len] = 0;
+
+ /* Check if expiration spec is valid.
+ If not, assume default (cookie doesn't expire, but valid only for
+ this session.) */
+ expires = http_atotm (value_copy);
+ if (expires != (time_t) -1)
+ {
+ cookie->permanent = 1;
+ cookie->expiry_time = expires;
+ /* According to netscape's specification, expiry time in
+ the past means that discarding of a matching cookie
+ is requested. */
+ if (cookie->expiry_time < cookies_now)
+ cookie->discard_requested = 1;
+ }
+ }
+ else if (TOKEN_IS (name, "max-age"))
+ {
+ double maxage = -1;
+ char value_copy[32];
+ size_t value_len = value.e - value.b;
+
+ if (!TOKEN_NON_EMPTY (value) || value_len >= sizeof (value_copy))
+ goto error;
+
+ memcpy (value_copy, value.b, value_len);
+ value_copy[value_len] = 0;
+
+ sscanf (value_copy, "%lf", &maxage);
+ if (maxage == -1)
+ /* something went wrong. */
+ goto error;
+ cookie->permanent = 1;
+ cookie->expiry_time = cookies_now + (time_t) maxage;
+
+ /* According to rfc2109, a cookie with max-age of 0 means that
+ discarding of a matching cookie is requested. */
+ if (maxage == 0)
+ cookie->discard_requested = 1;
+ }
+ else if (TOKEN_IS (name, "secure"))
+ {
+ /* ignore value completely */
+ cookie->secure = 1;
+ }
+ /* else: Ignore unrecognized attribute. */
+ }
+ if (*ptr)
+ /* extract_param has encountered a syntax error */
+ goto error;
+
+ /* The cookie has been successfully constructed; return it. */
+ return cookie;
+
+ error:
+ if (!silent)
+ logprintf (LOG_NOTQUIET,
+ _("Syntax error in Set-Cookie: %s at position %d.\n"),
+ quotearg_style (escape_quoting_style, set_cookie),
+ (int) (ptr - set_cookie));
+ delete_cookie (cookie);
+ return NULL;
+}
+
+#undef TOKEN_IS
+#undef TOKEN_NON_EMPTY
+
+/* Sanity checks. These are important, otherwise it is possible for
+ mailcious attackers to destroy important cookie information and/or
+ violate your privacy. */
+
+
+#define REQUIRE_DIGITS(p) do { \
+ if (!c_isdigit (*p)) \
+ return false; \
+ for (++p; c_isdigit (*p); p++) \
+ ; \
+} while (0)
+
+#define REQUIRE_DOT(p) do { \
+ if (*p++ != '.') \
+ return false; \
+} while (0)
+
+/* Check whether ADDR matches <digits>.<digits>.<digits>.<digits>.
+
+ We don't want to call network functions like inet_addr() because
+ all we need is a check, preferably one that is small, fast, and
+ well-defined. */
+
+static bool
+numeric_address_p (const char *addr)
+{
+ const char *p = addr;
+
+ REQUIRE_DIGITS (p); /* A */
+ REQUIRE_DOT (p); /* . */
+ REQUIRE_DIGITS (p); /* B */
+ REQUIRE_DOT (p); /* . */
+ REQUIRE_DIGITS (p); /* C */
+ REQUIRE_DOT (p); /* . */
+ REQUIRE_DIGITS (p); /* D */
+
+ if (*p != '\0')
+ return false;
+ return true;
+}
+
+/* Check whether COOKIE_DOMAIN is an appropriate domain for HOST.
+ Originally I tried to make the check compliant with rfc2109, but
+ the sites deviated too often, so I had to fall back to "tail
+ matching", as defined by the original Netscape's cookie spec.
+
+ Wget now uses libpsl to check domain names against a public suffix
+ list to see if they are valid. However, since we don't provide a
+ psl on our own, if libpsl is compiled without a public suffix list,
+ fall back to using the original "tail matching" heuristic. Also if
+ libpsl is unable to convert the domain to lowercase, which means that
+ it doesn't have any runtime conversion support, we again fall back to
+ "tail matching" since libpsl states the results are unpredictable with
+ upper case strings.
+ */
+
+#ifdef HAVE_LIBPSL
+static psl_ctx_t *psl;
+#endif
+
+static bool
+check_domain_match (const char *cookie_domain, const char *host)
+{
+#ifdef HAVE_LIBPSL
+ static int init_psl;
+ char *cookie_domain_lower = NULL;
+ char *host_lower = NULL;
+ int is_acceptable;
+
+ DEBUGP (("cdm: 1\n"));
+ if (!init_psl)
+ {
+ init_psl = 1;
+
+#ifdef HAVE_PSL_LATEST
+ if ((psl = psl_latest (NULL)))
+ goto have_psl;
+
+ DEBUGP (("\nPSL: Failed to load any PSL data. "
+ "Falling back to insecure heuristics.\n"));
+#else
+ if ((psl = psl_builtin ()) && !psl_builtin_outdated ())
+ goto have_psl;
+
+ DEBUGP (("\nPSL: built-in data outdated. "
+ "Trying to load data from %s.\n",
+ quote (psl_builtin_filename ())));
+
+ if ((psl = psl_load_file (psl_builtin_filename ())))
+ goto have_psl;
+
+ DEBUGP (("\nPSL: %s not found or not readable. "
+ "Falling back to built-in data.\n",
+ quote (psl_builtin_filename ())));
+
+ if (!(psl = psl_builtin ()))
+ {
+ DEBUGP (("\nPSL: libpsl not built with a public suffix list. "
+ "Falling back to insecure heuristics.\n"));
+ goto no_psl;
+ }
+#endif
+ }
+ else if (!psl)
+ goto no_psl;
+
+have_psl:
+ if (psl_str_to_utf8lower (cookie_domain, NULL, NULL, &cookie_domain_lower) == PSL_SUCCESS &&
+ psl_str_to_utf8lower (host, NULL, NULL, &host_lower) == PSL_SUCCESS)
+ {
+ is_acceptable = psl_is_cookie_domain_acceptable (psl, host_lower, cookie_domain_lower);
+ }
+ else
+ {
+ DEBUGP (("libpsl unable to parse domain name. "
+ "Falling back to simple heuristics.\n"));
+ goto no_psl;
+ }
+
+ xfree (cookie_domain_lower);
+ xfree (host_lower);
+
+ return is_acceptable == 1;
+
+no_psl:
+ /* Cleanup the PSL pointers first */
+ xfree (cookie_domain_lower);
+ xfree (host_lower);
+#endif
+
+ /* For efficiency make some elementary checks first */
+ DEBUGP (("cdm: 2\n"));
+
+ /* For the sake of efficiency, check for exact match first. */
+ if (0 == strcasecmp (cookie_domain, host))
+ return true;
+
+ DEBUGP (("cdm: 3\n"));
+
+ /* HOST must match the tail of cookie_domain. */
+ if (!match_tail (host, cookie_domain, true))
+ return false;
+
+ /* We know that COOKIE_DOMAIN is a subset of HOST; however, we must
+ make sure that somebody is not trying to set the cookie for a
+ subdomain shared by many entities. For example, "company.co.uk"
+ must not be allowed to set a cookie for ".co.uk". On the other
+ hand, "sso.redhat.de" should be able to set a cookie for
+ ".redhat.de".
+
+ The only marginally sane way to handle this I can think of is to
+ reject on the basis of the length of the second-level domain name
+ (but when the top-level domain is unknown), with the assumption
+ that those of three or less characters could be reserved. For
+ example:
+
+ .co.org -> works because the TLD is known
+ .co.uk -> doesn't work because "co" is only two chars long
+ .com.au -> doesn't work because "com" is only 3 chars long
+ .cnn.uk -> doesn't work because "cnn" is also only 3 chars long (ugh)
+ .cnn.de -> doesn't work for the same reason (ugh!!)
+ .abcd.de -> works because "abcd" is 4 chars long
+ .img.cnn.de -> works because it's not trying to set the 2nd level domain
+ .cnn.co.uk -> works for the same reason
+
+ That should prevent misuse, while allowing reasonable usage. If
+ someone knows of a better way to handle this, please let me
+ know. */
+ {
+ const char *p = cookie_domain;
+ int dccount = 1; /* number of domain components */
+ int ldcl = 0; /* last domain component length */
+ int nldcl = 0; /* next to last domain component length */
+ int out;
+ if (*p == '.')
+ /* Ignore leading period in this calculation. */
+ ++p;
+ DEBUGP (("cdm: 4\n"));
+ for (out = 0; !out; p++)
+ switch (*p)
+ {
+ case '\0':
+ out = 1;
+ break;
+ case '.':
+ if (ldcl == 0)
+ /* Empty domain component found -- the domain is invalid. */
+ return false;
+ if (*(p + 1) == '\0')
+ {
+ /* Tolerate trailing '.' by not treating the domain as
+ one ending with an empty domain component. */
+ out = 1;
+ break;
+ }
+ nldcl = ldcl;
+ ldcl = 0;
+ ++dccount;
+ break;
+ default:
+ ++ldcl;
+ }
+
+ DEBUGP (("cdm: 5\n"));
+
+ if (dccount < 2)
+ return false;
+
+ DEBUGP (("cdm: 6\n"));
+
+ if (dccount == 2)
+ {
+ size_t i;
+ int known_toplevel = false;
+ static const char *known_toplevel_domains[] = {
+ ".com", ".edu", ".net", ".org", ".gov", ".mil", ".int"
+ };
+ for (i = 0; i < countof (known_toplevel_domains); i++)
+ if (match_tail (cookie_domain, known_toplevel_domains[i], true))
+ {
+ known_toplevel = true;
+ break;
+ }
+ if (!known_toplevel && nldcl <= 3)
+ return false;
+ }
+ }
+
+ DEBUGP (("cdm: 7\n"));
+
+ /* Don't allow the host "foobar.com" to set a cookie for domain
+ "bar.com". */
+ if (*cookie_domain != '.')
+ {
+ int dlen = strlen (cookie_domain);
+ int hlen = strlen (host);
+ /* cookie host: hostname.foobar.com */
+ /* desired domain: bar.com */
+ /* '.' must be here in host-> ^ */
+ if (hlen > dlen && host[hlen - dlen - 1] != '.')
+ return false;
+ }
+
+ DEBUGP (("cdm: 8\n"));
+
+ return true;
+}
+
+static int path_matches (const char *, const char *);
+
+/* Check whether PATH begins with COOKIE_PATH. */
+
+static bool
+check_path_match (const char *cookie_path, const char *path)
+{
+ return path_matches (path, cookie_path) != 0;
+}
+
+/* Process the HTTP `Set-Cookie' header. This results in storing the
+ cookie or discarding a matching one, or ignoring it completely, all
+ depending on the contents. */
+
+void
+cookie_handle_set_cookie (struct cookie_jar *jar,
+ const char *host, int port,
+ const char *path, const char *set_cookie)
+{
+ struct cookie *cookie;
+ cookies_now = time (NULL);
+ char buf[1024], *tmp;
+ size_t pathlen = strlen(path);
+
+ /* Wget's paths don't begin with '/' (blame rfc1808), but cookie
+ usage assumes /-prefixed paths. Until the rest of Wget is fixed,
+ simply prepend slash to PATH. */
+ if (pathlen < sizeof (buf) - 1)
+ tmp = buf;
+ else
+ tmp = xmalloc (pathlen + 2);
+
+ *tmp = '/';
+ memcpy (tmp + 1, path, pathlen + 1);
+ path = tmp;
+
+ cookie = parse_set_cookie (set_cookie, false);
+ if (!cookie)
+ goto out;
+
+ /* Sanitize parts of cookie. */
+
+ if (!cookie->domain)
+ {
+ cookie->domain = xstrdup (host);
+ cookie->domain_exact = 1;
+ /* Set the port, but only if it's non-default. */
+ if (port != 80 && port != 443)
+ cookie->port = port;
+ }
+ else
+ {
+ if (!check_domain_match (cookie->domain, host))
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Cookie coming from %s attempted to set domain to "),
+ quotearg_style (escape_quoting_style, host));
+ logprintf (LOG_NOTQUIET,
+ _("%s\n"),
+ quotearg_style (escape_quoting_style, cookie->domain));
+ cookie->discard_requested = true;
+ }
+ }
+
+ if (!cookie->path)
+ {
+ /* The cookie doesn't set path: set it to the URL path, sans the
+ file part ("/dir/file" truncated to "/dir/"). */
+ char *trailing_slash = strrchr (path, '/');
+ if (trailing_slash)
+ cookie->path = strdupdelim (path, trailing_slash + 1);
+ else
+ /* no slash in the string -- can this even happen? */
+ cookie->path = xstrdup (path);
+ }
+ else
+ {
+ /* The cookie sets its own path; verify that it is legal. */
+ if (!check_path_match (cookie->path, path))
+ {
+ DEBUGP (("Attempt to fake the path: %s, %s\n",
+ cookie->path, path));
+ goto out;
+ }
+ }
+
+ /* Now store the cookie, or discard an existing cookie, if
+ discarding was requested. */
+
+ if (cookie->discard_requested)
+ {
+ discard_matching_cookie (jar, cookie);
+ goto out;
+ }
+
+ store_cookie (jar, cookie);
+ if (tmp != buf)
+ xfree (tmp);
+ return;
+
+ out:
+ if (cookie)
+ delete_cookie (cookie);
+ if (tmp != buf)
+ xfree (tmp);
+}
+
+/* Support for sending out cookies in HTTP requests, based on
+ previously stored cookies. Entry point is
+ `build_cookies_request'. */
+
+/* Return a count of how many times CHR occurs in STRING. */
+
+static int
+count_char (const char *string, char chr)
+{
+ const char *p;
+ int count = 0;
+ for (p = string; *p; p++)
+ if (*p == chr)
+ ++count;
+ return count;
+}
+
+/* Find the cookie chains whose domains match HOST and store them to
+ DEST.
+
+ A cookie chain is the head of a list of cookies that belong to a
+ host/domain. Given HOST "img.search.xemacs.org", this function
+ will return the chains for "img.search.xemacs.org",
+ "search.xemacs.org", and "xemacs.org" -- those of them that exist
+ (if any), that is.
+
+ DEST should be large enough to accept (in the worst case) as many
+ elements as there are domain components of HOST. */
+
+static int
+find_chains_of_host (struct cookie_jar *jar, const char *host,
+ struct cookie *dest[])
+{
+ int dest_count = 0;
+ int passes, passcnt;
+
+ /* Bail out quickly if there are no cookies in the jar. */
+ if (!hash_table_count (jar->chains))
+ return 0;
+
+ if (numeric_address_p (host))
+ /* If host is an IP address, only check for the exact match. */
+ passes = 1;
+ else
+ /* Otherwise, check all the subdomains except the top-level (last)
+ one. As a domain with N components has N-1 dots, the number of
+ passes equals the number of dots. */
+ passes = count_char (host, '.');
+
+ passcnt = 0;
+
+ /* Find chains that match HOST, starting with exact match and
+ progressing to less specific domains. For instance, given HOST
+ fly.srk.fer.hr, first look for fly.srk.fer.hr's chain, then
+ srk.fer.hr's, then fer.hr's. */
+ while (1)
+ {
+ struct cookie *chain = hash_table_get (jar->chains, host);
+ if (chain)
+ dest[dest_count++] = chain;
+ if (++passcnt >= passes)
+ break;
+ host = strchr (host, '.') + 1;
+ }
+
+ return dest_count;
+}
+
+/* If FULL_PATH begins with PREFIX, return the length of PREFIX, zero
+ otherwise. */
+
+static int
+path_matches (const char *full_path, const char *prefix)
+{
+ int len = strlen (prefix);
+
+ if (0 != strncmp (full_path, prefix, len))
+ /* FULL_PATH doesn't begin with PREFIX. */
+ return 0;
+
+ /* Length of PREFIX determines the quality of the match. */
+ return len + 1;
+}
+
+/* Return true if COOKIE matches the provided parameters of the URL
+ being downloaded: HOST, PORT, PATH, and SECFLAG.
+
+ If PATH_GOODNESS is non-NULL, store the "path goodness" value
+ there. That value is a measure of how closely COOKIE matches PATH,
+ used for ordering cookies. */
+
+static bool
+cookie_matches_url (const struct cookie *cookie,
+ const char *host, int port, const char *path,
+ bool secflag, int *path_goodness)
+{
+ int pg;
+
+ if (cookie_expired_p (cookie))
+ /* Ignore stale cookies. Don't bother unchaining the cookie at
+ this point -- Wget is a relatively short-lived application, and
+ stale cookies will not be saved by `save_cookies'. On the
+ other hand, this function should be as efficient as
+ possible. */
+ return false;
+
+ if (cookie->secure && !secflag)
+ /* Don't transmit secure cookies over insecure connections. */
+ return false;
+ if (cookie->port != PORT_ANY && cookie->port != port)
+ return false;
+
+ /* If exact domain match is required, verify that cookie's domain is
+ equal to HOST. If not, assume success on the grounds of the
+ cookie's chain having been found by find_chains_of_host. */
+ if (cookie->domain_exact
+ && 0 != strcasecmp (host, cookie->domain))
+ return false;
+
+ pg = path_matches (path, cookie->path);
+ if (pg == 0)
+ return false;
+
+ if (path_goodness)
+ /* If the caller requested path_goodness, we return it. This is
+ an optimization, so that the caller doesn't need to call
+ path_matches() again. */
+ *path_goodness = pg;
+ return true;
+}
+
+/* A structure that points to a cookie, along with the additional
+ information about the cookie's "goodness". This allows us to sort
+ the cookies when returning them to the server, as required by the
+ spec. */
+
+struct weighed_cookie {
+ struct cookie *cookie;
+ int domain_goodness;
+ int path_goodness;
+};
+
+/* Comparator used for uniquifying the list. */
+
+static int
+equality_comparator (const void *p1, const void *p2)
+{
+ struct weighed_cookie *wc1 = (struct weighed_cookie *)p1;
+ struct weighed_cookie *wc2 = (struct weighed_cookie *)p2;
+
+ int namecmp = strcmp (wc1->cookie->attr, wc2->cookie->attr);
+ int valuecmp = strcmp (wc1->cookie->value, wc2->cookie->value);
+
+ /* We only really care whether both name and value are equal. We
+ return them in this order only for consistency... */
+ return namecmp ? namecmp : valuecmp;
+}
+
+/* Eliminate duplicate cookies. "Duplicate cookies" are any two
+ cookies with the same attr name and value. Whenever a duplicate
+ pair is found, one of the cookies is removed. */
+
+static int
+eliminate_dups (struct weighed_cookie *outgoing, int count)
+{
+ struct weighed_cookie *h; /* hare */
+ struct weighed_cookie *t; /* tortoise */
+ struct weighed_cookie *end = outgoing + count;
+
+ /* We deploy a simple uniquify algorithm: first sort the array
+ according to our sort criteria, then copy it to itself, comparing
+ each cookie to its neighbor and ignoring the duplicates. */
+
+ qsort (outgoing, count, sizeof (struct weighed_cookie), equality_comparator);
+
+ /* "Hare" runs through all the entries in the array, followed by
+ "tortoise". If a duplicate is found, the hare skips it.
+ Non-duplicate entries are copied to the tortoise ptr. */
+
+ for (h = t = outgoing; h < end; h++)
+ {
+ if (h != end - 1)
+ {
+ struct cookie *c0 = h[0].cookie;
+ struct cookie *c1 = h[1].cookie;
+ if (!strcmp (c0->attr, c1->attr) && !strcmp (c0->value, c1->value))
+ continue; /* ignore the duplicate */
+ }
+
+ /* If the hare has advanced past the tortoise (because of
+ previous dups), make sure the values get copied. Otherwise,
+ no copying is necessary. */
+ if (h != t)
+ *t++ = *h;
+ else
+ t++;
+ }
+ return t - outgoing;
+}
+
+/* Comparator used for sorting by quality. */
+
+static int
+goodness_comparator (const void *p1, const void *p2)
+{
+ struct weighed_cookie *wc1 = (struct weighed_cookie *)p1;
+ struct weighed_cookie *wc2 = (struct weighed_cookie *)p2;
+
+ /* Subtractions take `wc2' as the first argument becauase we want a
+ sort in *decreasing* order of goodness. */
+ int dgdiff = wc2->domain_goodness - wc1->domain_goodness;
+ int pgdiff = wc2->path_goodness - wc1->path_goodness;
+
+ /* Sort by domain goodness; if these are the same, sort by path
+ goodness. (The sorting order isn't really specified; maybe it
+ should be the other way around.) */
+ return dgdiff ? dgdiff : pgdiff;
+}
+
+/* Generate a `Cookie' header for a request that goes to HOST:PORT and
+ requests PATH from the server. The resulting string is allocated
+ with `malloc', and the caller is responsible for freeing it. If no
+ cookies pertain to this request, i.e. no cookie header should be
+ generated, NULL is returned. */
+
+char *
+cookie_header (struct cookie_jar *jar, const char *host,
+ int port, const char *path, bool secflag)
+{
+ struct cookie *chains[32];
+ int chain_count;
+
+ struct cookie *cookie;
+ struct weighed_cookie *outgoing;
+ size_t count, i, ocnt;
+ char *result = NULL;
+ int result_size, pos;
+ char pathbuf[1024];
+
+ /* First, find the cookie chains whose domains match HOST. */
+
+ /* Allocate room for find_chains_of_host to write to. The number of
+ chains can at most equal the number of subdomains, hence
+ 1+<number of dots>. We ignore cookies with more than 32 labels. */
+ chain_count = 1 + count_char (host, '.');
+ if (chain_count > (int) countof (chains))
+ return NULL;
+ chain_count = find_chains_of_host (jar, host, chains);
+
+ /* No cookies for this host. */
+ if (chain_count <= 0)
+ return NULL;
+
+ /* Wget's paths don't begin with '/' (blame rfc1808), but cookie
+ usage assumes /-prefixed paths. Until the rest of Wget is fixed,
+ simply prepend slash to PATH. */
+ {
+ char *tmp;
+ size_t pathlen = strlen(path);
+
+ if (pathlen < sizeof (pathbuf) - 1)
+ tmp = pathbuf;
+ else
+ tmp = xmalloc (pathlen + 2);
+
+ *tmp = '/';
+ memcpy (tmp + 1, path, pathlen + 1);
+ path = tmp;
+ }
+
+ cookies_now = time (NULL);
+
+ /* Now extract from the chains those cookies that match our host
+ (for domain_exact cookies), port (for cookies with port other
+ than PORT_ANY), etc. See matching_cookie for details. */
+
+ /* Count the number of matching cookies. */
+ count = 0;
+ for (i = 0; i < (unsigned) chain_count; i++)
+ for (cookie = chains[i]; cookie; cookie = cookie->next)
+ if (cookie_matches_url (cookie, host, port, path, secflag, NULL))
+ ++count;
+ if (!count)
+ goto out; /* no cookies matched */
+
+ /* Allocate the array. */
+ if (count > SIZE_MAX / sizeof (struct weighed_cookie))
+ goto out; /* unable to process so many cookies */
+ outgoing = xmalloc (count * sizeof (struct weighed_cookie));
+
+ /* Fill the array with all the matching cookies from the chains that
+ match HOST. */
+ ocnt = 0;
+ for (i = 0; i < (unsigned) chain_count; i++)
+ for (cookie = chains[i]; cookie; cookie = cookie->next)
+ {
+ int pg;
+ if (!cookie_matches_url (cookie, host, port, path, secflag, &pg))
+ continue;
+ outgoing[ocnt].cookie = cookie;
+ outgoing[ocnt].domain_goodness = strlen (cookie->domain);
+ outgoing[ocnt].path_goodness = pg;
+ ++ocnt;
+ }
+ assert (ocnt == count);
+
+ /* Eliminate duplicate cookies; that is, those whose name and value
+ are the same. */
+ count = eliminate_dups (outgoing, count);
+
+ /* Sort the array so that best-matching domains come first, and
+ that, within one domain, best-matching paths come first. */
+ qsort (outgoing, count, sizeof (struct weighed_cookie), goodness_comparator);
+
+ /* Count the space the name=value pairs will take. */
+ result_size = 0;
+ for (i = 0; i < count; i++)
+ {
+ struct cookie *c = outgoing[i].cookie;
+ /* name=value */
+ result_size += strlen (c->attr) + 1 + strlen (c->value);
+ }
+
+ /* Allocate output buffer:
+ name=value pairs -- result_size
+ "; " separators -- (count - 1) * 2
+ \0 terminator -- 1 */
+ result_size = result_size + (count - 1) * 2 + 1;
+ result = xmalloc (result_size);
+ pos = 0;
+ for (i = 0; i < count; i++)
+ {
+ struct cookie *c = outgoing[i].cookie;
+ int namlen = strlen (c->attr);
+ int vallen = strlen (c->value);
+
+ memcpy (result + pos, c->attr, namlen);
+ pos += namlen;
+ result[pos++] = '=';
+ memcpy (result + pos, c->value, vallen);
+ pos += vallen;
+ if (i < count - 1)
+ {
+ result[pos++] = ';';
+ result[pos++] = ' ';
+ }
+ }
+ result[pos++] = '\0';
+ xfree (outgoing);
+ assert (pos == result_size);
+
+out:
+ if (path != pathbuf)
+ xfree (path);
+
+return result;
+}
+
+/* Support for loading and saving cookies. The format used for
+ loading and saving should be the format of the `cookies.txt' file
+ used by Netscape and Mozilla, at least the Unix versions.
+ (Apparently IE can export cookies in that format as well.) The
+ format goes like this:
+
+ DOMAIN DOMAIN-FLAG PATH SECURE-FLAG TIMESTAMP ATTR-NAME ATTR-VALUE
+
+ DOMAIN -- cookie domain, optionally followed by :PORT
+ DOMAIN-FLAG -- whether all hosts in the domain match
+ PATH -- cookie path
+ SECURE-FLAG -- whether cookie requires secure connection
+ TIMESTAMP -- expiry timestamp, number of seconds since epoch
+ ATTR-NAME -- name of the cookie attribute
+ ATTR-VALUE -- value of the cookie attribute (empty if absent)
+
+ The fields are separated by TABs. All fields are mandatory, except
+ for ATTR-VALUE. The `-FLAG' fields are boolean, their legal values
+ being "TRUE" and "FALSE'. Empty lines, lines consisting of
+ whitespace only, and comment lines (beginning with # optionally
+ preceded by whitespace) are ignored.
+
+ Example line from cookies.txt (split in two lines for readability):
+
+ .google.com TRUE / FALSE 2147368447 \
+ PREF ID=34bb47565bbcd47b:LD=en:NR=20:TM=985172580:LM=985739012
+
+*/
+
+/* If the region [B, E) ends with :<digits>, parse the number, return
+ it, and store new boundary (location of the `:') to DOMAIN_E_PTR.
+ If port is not specified, return 0. */
+
+static int
+domain_port (const char *domain_b, const char *domain_e,
+ const char **domain_e_ptr)
+{
+ int port = 0;
+ const char *p;
+ const char *colon = memchr (domain_b, ':', domain_e - domain_b);
+ if (!colon)
+ return 0;
+ for (p = colon + 1; p < domain_e && c_isdigit (*p); p++)
+ port = 10 * port + (*p - '0');
+ if (p < domain_e)
+ /* Garbage following port number. */
+ return 0;
+ *domain_e_ptr = colon;
+ return port;
+}
+
+#define GET_WORD(p, b, e) do { \
+ b = p; \
+ while (*p && *p != '\t') \
+ ++p; \
+ e = p; \
+ if (b == e || !*p) \
+ goto next; \
+ ++p; \
+} while (0)
+
+/* Load cookies from FILE. */
+
+void
+cookie_jar_load (struct cookie_jar *jar, const char *file)
+{
+ char *line = NULL;
+ size_t bufsize = 0;
+
+ FILE *fp = fopen (file, "r");
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, _("Cannot open cookies file %s: %s\n"),
+ quote (file), strerror (errno));
+ return;
+ }
+
+ cookies_now = time (NULL);
+
+ while (getline (&line, &bufsize, fp) > 0)
+ {
+ struct cookie *cookie;
+ char *p = line;
+
+ double expiry;
+ int port;
+
+ char *domain_b = NULL, *domain_e = NULL;
+ char *domflag_b = NULL, *domflag_e = NULL;
+ char *path_b = NULL, *path_e = NULL;
+ char *secure_b = NULL, *secure_e = NULL;
+ char *expires_b = NULL, *expires_e = NULL;
+ char *name_b = NULL, *name_e = NULL;
+ char *value_b = NULL, *value_e = NULL;
+
+ /* Skip leading white-space. */
+ while (*p && c_isspace (*p))
+ ++p;
+ /* Ignore empty lines. */
+ if (!*p || *p == '#')
+ continue;
+
+ GET_WORD (p, domain_b, domain_e);
+ GET_WORD (p, domflag_b, domflag_e);
+ GET_WORD (p, path_b, path_e);
+ GET_WORD (p, secure_b, secure_e);
+ GET_WORD (p, expires_b, expires_e);
+ GET_WORD (p, name_b, name_e);
+
+ /* Don't use GET_WORD for value because it ends with newline,
+ not TAB. */
+ value_b = p;
+ value_e = p + strlen (p);
+ if (value_e > value_b && value_e[-1] == '\n')
+ --value_e;
+ if (value_e > value_b && value_e[-1] == '\r')
+ --value_e;
+ /* Empty values are legal (I think), so don't bother checking. */
+
+ cookie = cookie_new ();
+
+ cookie->attr = strdupdelim (name_b, name_e);
+ cookie->value = strdupdelim (value_b, value_e);
+ cookie->path = strdupdelim (path_b, path_e);
+ cookie->secure = BOUNDED_EQUAL (secure_b, secure_e, "TRUE");
+
+ /* Curl source says, quoting Andre Garcia: "flag: A TRUE/FALSE
+ value indicating if all machines within a given domain can
+ access the variable. This value is set automatically by the
+ browser, depending on the value set for the domain." */
+ cookie->domain_exact = !BOUNDED_EQUAL (domflag_b, domflag_e, "TRUE");
+
+ /* DOMAIN needs special treatment because we might need to
+ extract the port. */
+ port = domain_port (domain_b, domain_e, (const char **)&domain_e);
+ if (port)
+ cookie->port = port;
+
+ if (*domain_b == '.')
+ ++domain_b; /* remove leading dot internally */
+ cookie->domain = strdupdelim (domain_b, domain_e);
+
+ /* safe default in case EXPIRES field is garbled. */
+ expiry = (double)cookies_now - 1;
+
+ /* I don't like changing the line, but it's safe here. (line is
+ malloced.) */
+ *expires_e = '\0';
+ sscanf (expires_b, "%lf", &expiry);
+
+ if (expiry == 0)
+ {
+ /* EXPIRY can be 0 for session cookies saved because the
+ user specified `--keep-session-cookies' in the past.
+ They remain session cookies, and will be saved only if
+ the user has specified `keep-session-cookies' again. */
+ }
+ else
+ {
+ if (expiry < cookies_now)
+ goto abort_cookie; /* ignore stale cookie. */
+ cookie->expiry_time = (time_t) expiry;
+ cookie->permanent = 1;
+ }
+
+ store_cookie (jar, cookie);
+
+ next:
+ continue;
+
+ abort_cookie:
+ delete_cookie (cookie);
+ }
+
+ xfree(line);
+ fclose (fp);
+}
+
+/* Save cookies, in format described above, to FILE. */
+
+void
+cookie_jar_save (struct cookie_jar *jar, const char *file)
+{
+ FILE *fp;
+ hash_table_iterator iter;
+
+ DEBUGP (("Saving cookies to %s.\n", file));
+
+ cookies_now = time (NULL);
+
+ fp = fopen (file, "w");
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, _("Cannot open cookies file %s: %s\n"),
+ quote (file), strerror (errno));
+ return;
+ }
+
+ fputs ("# HTTP Cookie File\n", fp);
+ fprintf (fp, "# Generated by Wget on %s.\n", datetime_str (cookies_now));
+ fputs ("# Edit at your own risk.\n\n", fp);
+
+ for (hash_table_iterate (jar->chains, &iter);
+ hash_table_iter_next (&iter);
+ )
+ {
+ const char *domain = iter.key;
+ struct cookie *cookie = iter.value;
+ for (; cookie; cookie = cookie->next)
+ {
+ if (!cookie->permanent && !opt.keep_session_cookies)
+ continue;
+ if (cookie_expired_p (cookie))
+ continue;
+ if (!cookie->domain_exact)
+ fputc ('.', fp);
+ fputs (domain, fp);
+ if (cookie->port != PORT_ANY)
+ fprintf (fp, ":%d", cookie->port);
+ fprintf (fp, "\t%s\t%s\t%s\t%.0f\t%s\t%s\n",
+ cookie->domain_exact ? "FALSE" : "TRUE",
+ cookie->path, cookie->secure ? "TRUE" : "FALSE",
+ (double)cookie->expiry_time,
+ cookie->attr, cookie->value);
+ if (ferror (fp))
+ goto out;
+ }
+ }
+ out:
+ if (ferror (fp))
+ logprintf (LOG_NOTQUIET, _("Error writing to %s: %s\n"),
+ quote (file), strerror (errno));
+ if (fclose (fp) < 0)
+ logprintf (LOG_NOTQUIET, _("Error closing %s: %s\n"),
+ quote (file), strerror (errno));
+
+ DEBUGP (("Done saving cookies.\n"));
+}
+
+/* Clean up cookie-related data. */
+
+void
+cookie_jar_delete (struct cookie_jar *jar)
+{
+ /* Iterate over chains (indexed by domain) and free them. */
+ hash_table_iterator iter;
+ for (hash_table_iterate (jar->chains, &iter); hash_table_iter_next (&iter); )
+ {
+ struct cookie *chain = iter.value;
+ xfree (iter.key);
+ /* Then all cookies in this chain. */
+ while (chain)
+ {
+ struct cookie *next = chain->next;
+ delete_cookie (chain);
+ chain = next;
+ }
+ }
+ hash_table_destroy (jar->chains);
+ xfree (jar);
+
+#ifdef HAVE_LIBPSL
+ psl_free (psl);
+ psl = NULL;
+#endif
+}
+
+/* Test cases. Currently this is only tests parse_set_cookies. To
+ use, recompile Wget with -DTEST_COOKIES and call test_cookies()
+ from main. */
+
+#ifdef TEST_COOKIES
+void
+test_cookies (void)
+{
+ /* Tests expected to succeed: */
+ static struct {
+ const char *data;
+ const char *results[10];
+ } tests_succ[] = {
+ { "arg=value", {"arg", "value", NULL} },
+ { "arg1=value1;arg2=value2", {"arg1", "value1", "arg2", "value2", NULL} },
+ { "arg1=value1; arg2=value2", {"arg1", "value1", "arg2", "value2", NULL} },
+ { "arg1=value1; arg2=value2;", {"arg1", "value1", "arg2", "value2", NULL} },
+ { "arg1=value1; arg2=value2; ", {"arg1", "value1", "arg2", "value2", NULL} },
+ { "arg1=\"value1\"; arg2=\"\"", {"arg1", "value1", "arg2", "", NULL} },
+ { "arg=", {"arg", "", NULL} },
+ { "arg1=; arg2=", {"arg1", "", "arg2", "", NULL} },
+ { "arg1 = ; arg2= ", {"arg1", "", "arg2", "", NULL} },
+ };
+
+ /* Tests expected to fail: */
+ static char *tests_fail[] = {
+ ";",
+ "arg=\"unterminated",
+ "=empty-name",
+ "arg1=;=another-empty-name",
+ };
+ int i;
+
+ for (i = 0; i < countof (tests_succ); i++)
+ {
+ int ind;
+ const char *data = tests_succ[i].data;
+ const char **expected = tests_succ[i].results;
+ struct cookie *c;
+
+ c = parse_set_cookie (data, true);
+ if (!c)
+ {
+ printf ("NULL cookie returned for valid data: %s\n", data);
+ continue;
+ }
+
+ /* Test whether extract_param handles these cases correctly. */
+ {
+ param_token name, value;
+ const char *ptr = data;
+ int j = 0;
+ while (extract_param (&ptr, &name, &value, ';', NULL))
+ {
+ char *n = strdupdelim (name.b, name.e);
+ char *v = strdupdelim (value.b, value.e);
+ if (!expected[j])
+ {
+ printf ("Too many parameters for '%s'\n", data);
+ break;
+ }
+ if (0 != strcmp (expected[j], n))
+ printf ("Invalid name %d for '%s' (expected '%s', got '%s')\n",
+ j / 2 + 1, data, expected[j], n);
+ if (0 != strcmp (expected[j + 1], v))
+ printf ("Invalid value %d for '%s' (expected '%s', got '%s')\n",
+ j / 2 + 1, data, expected[j + 1], v);
+ j += 2;
+ xfree (n);
+ xfree (v);
+ }
+ if (expected[j])
+ printf ("Too few parameters for '%s'\n", data);
+ }
+ }
+
+ for (i = 0; i < countof (tests_fail); i++)
+ {
+ struct cookie *c;
+ char *data = tests_fail[i];
+ c = parse_set_cookie (data, true);
+ if (c)
+ printf ("Failed to report error on invalid data: %s\n", data);
+ }
+}
+#endif /* TEST_COOKIES */
diff --git a/src/cookies.h b/src/cookies.h
new file mode 100644
index 0000000..903db32
--- /dev/null
+++ b/src/cookies.h
@@ -0,0 +1,47 @@
+/* Support for cookies.
+ Copyright (C) 2001-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef COOKIES_H
+#define COOKIES_H
+
+struct cookie_jar;
+
+struct cookie_jar *cookie_jar_new (void);
+void cookie_jar_delete (struct cookie_jar *);
+
+void cookie_handle_set_cookie (struct cookie_jar *, const char *, int,
+ const char *, const char *);
+char *cookie_header (struct cookie_jar *, const char *, int,
+ const char *, bool);
+
+void cookie_jar_load (struct cookie_jar *, const char *);
+void cookie_jar_save (struct cookie_jar *, const char *);
+
+#endif /* COOKIES_H */
diff --git a/src/css-tokens.h b/src/css-tokens.h
new file mode 100644
index 0000000..40307ff
--- /dev/null
+++ b/src/css-tokens.h
@@ -0,0 +1,65 @@
+/* Declarations for css.lex
+ Copyright (C) 2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef CSS_TOKENS_H
+#define CSS_TOKENS_H
+
+enum {
+ CSSEOF = 0,
+ S = 1,
+ CDO = 2,
+ CDC = 3,
+ INCLUDES = 4,
+ DASHMATCH = 5,
+ STRING = 6,
+ BAD_STRING = 7,
+ IDENT = 8,
+ HASH = 9,
+ IMPORT_SYM = 10,
+ PAGE_SYM = 11,
+ MEDIA_SYM = 12,
+ CHARSET_SYM = 13,
+ IMPORTANT_SYM = 14,
+ EMS = 15,
+ EXS = 16,
+ LENGTH = 17,
+ ANGLE = 18,
+ TIME = 19,
+ FREQ = 20,
+ DIMENSION = 21,
+ PERCENTAGE = 22,
+ NUMBER = 23,
+ URI = 24,
+ BAD_URI = 25,
+ FUNCTION = 26,
+ COMMENT = 27
+};
+
+#endif /* CSS_TOKENS_H */
diff --git a/src/css-url.c b/src/css-url.c
new file mode 100644
index 0000000..eacd926
--- /dev/null
+++ b/src/css-url.c
@@ -0,0 +1,236 @@
+/* Collect URLs from CSS source.
+ Copyright (C) 1998, 2000-2003, 2009-2011, 2014-2015, 2018-2020 Free
+ Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/*
+ Note that this is not an actual CSS parser, but just a lexical
+ scanner with a tiny bit more smarts bolted on top. A full parser
+ is somewhat overkill for this job. The only things we're interested
+ in are @import rules and url() tokens, so it's easy enough to
+ grab those without truly understanding the input. The only downside
+ to this is that we might be coerced into downloading files that
+ a browser would ignore. That might merit some more investigation.
+ */
+
+#include <wget.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <errno.h>
+
+#include "wget.h"
+#include "utils.h"
+#include "convert.h"
+#include "html-url.h"
+#include "css-tokens.h"
+#include "css-url.h"
+#include "xstrndup.h"
+
+/* from lex.yy.c */
+extern char *yytext;
+extern int yyleng;
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+extern YY_BUFFER_STATE yy_scan_bytes (const char *bytes,int len );
+extern void yy_delete_buffer (YY_BUFFER_STATE b);
+extern int yylex (void);
+extern void yylex_destroy(void);
+
+/*
+ Given a detected URI token, get only the URI specified within.
+ Also adjust the starting position and length of the string.
+
+ A URI can be specified with or without quotes, and the quotes
+ can be single or double quotes. In addition there can be
+ whitespace after the opening parenthesis and before the closing
+ parenthesis.
+*/
+static char *
+get_uri_string (const char *at, int *pos, int *length)
+{
+ if (*length < 4)
+ return NULL;
+
+ if (0 != strncasecmp (at + *pos, "url(", 4))
+ return NULL;
+
+ *pos += 4;
+ *length -= 5; /* url() */
+
+ /* skip leading space */
+ while (*length > 0 && isspace (at[*pos]))
+ {
+ (*pos)++;
+ if (--(*length) == 0)
+ return NULL;
+ }
+
+ /* skip trailing space */
+ while (*length > 0 && isspace (at[*pos + *length - 1]))
+ {
+ (*length)--;
+ }
+
+ /* trim off quotes */
+ if (*length >= 2 && (at[*pos] == '\'' || at[*pos] == '"'))
+ {
+ (*pos)++;
+ *length -= 2;
+ }
+
+ if (*length <= 0)
+ return NULL;
+
+ return xstrndup (at + *pos, *length);
+}
+
+void
+get_urls_css (struct map_context *ctx, int offset, int buf_length)
+{
+ int token;
+ /*char tmp[2048];*/
+ int buffer_pos = 0;
+ int pos, length;
+ char *uri;
+ YY_BUFFER_STATE b;
+
+ /* tell flex to scan from this buffer */
+ b = yy_scan_bytes (ctx->text + offset, buf_length);
+
+ while((token = yylex()) != CSSEOF)
+ {
+ /*DEBUGP (("%s ", token_names[token]));*/
+ /* @import "foo.css"
+ or @import url(foo.css)
+ */
+ if(token == IMPORT_SYM)
+ {
+ do {
+ buffer_pos += yyleng;
+ } while((token = yylex()) == S);
+
+ /*DEBUGP (("%s ", token_names[token]));*/
+
+ if (token == STRING || token == URI)
+ {
+ /*DEBUGP (("Got URI "));*/
+ pos = buffer_pos + offset;
+ length = yyleng;
+
+ if (token == URI)
+ {
+ uri = get_uri_string (ctx->text, &pos, &length);
+ }
+ else if (length >= 2)
+ {
+ /* cut out quote characters */
+ pos++;
+ length -= 2;
+ uri = xmalloc (length + 1);
+ memcpy (uri, yytext + 1, length);
+ uri[length] = '\0';
+ }
+ else
+ uri = NULL;
+
+ if (uri)
+ {
+ struct urlpos *up = append_url (uri, pos, length, ctx);
+ DEBUGP (("Found @import: [%s] at %d [%s]\n", yytext, buffer_pos, uri));
+
+ if (up)
+ {
+ up->link_inline_p = 1;
+ up->link_css_p = 1;
+ up->link_expect_css = 1;
+ }
+
+ xfree(uri);
+ }
+ }
+ }
+ /* background-image: url(foo.png)
+ note that we don't care what
+ property this is actually on.
+ */
+ else if(token == URI)
+ {
+ pos = buffer_pos + offset;
+ length = yyleng;
+ uri = get_uri_string (ctx->text, &pos, &length);
+
+ if (uri)
+ {
+ struct urlpos *up = append_url (uri, pos, length, ctx);
+ DEBUGP (("Found URI: [%s] at %d [%s]\n", yytext, buffer_pos, uri));
+ if (up)
+ {
+ up->link_inline_p = 1;
+ up->link_css_p = 1;
+ }
+
+ xfree (uri);
+ }
+ }
+ buffer_pos += yyleng;
+ }
+
+ yy_delete_buffer(b);
+ yylex_destroy();
+
+ DEBUGP (("\n"));
+}
+
+struct urlpos *
+get_urls_css_file (const char *file, const char *url)
+{
+ struct file_memory *fm;
+ struct map_context ctx;
+
+ /* Load the file. */
+ fm = wget_read_file (file);
+ if (!fm)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno));
+ return NULL;
+ }
+ DEBUGP (("Loaded %s (size %s).\n", file, number_to_static_string (fm->length)));
+
+ ctx.text = fm->content;
+ ctx.head = NULL;
+ ctx.base = NULL;
+ ctx.parent_base = url ? url : opt.base_href;
+ ctx.document_file = file;
+ ctx.nofollow = 0;
+
+ get_urls_css (&ctx, 0, fm->length);
+ wget_read_file_free (fm);
+ return ctx.head;
+}
diff --git a/src/css-url.h b/src/css-url.h
new file mode 100644
index 0000000..e8d7d1f
--- /dev/null
+++ b/src/css-url.h
@@ -0,0 +1,37 @@
+/* Declarations for css-url.c.
+ Copyright (C) 2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef CSS_URL_H
+#define CSS_URL_H
+
+void get_urls_css (struct map_context *, int, int);
+struct urlpos *get_urls_css_file (const char *, const char *);
+
+#endif /* CSS_URL_H */
diff --git a/src/css.c b/src/css.c
new file mode 100644
index 0000000..7f51801
--- /dev/null
+++ b/src/css.c
@@ -0,0 +1,3932 @@
+#line 1 "css.c"
+/* config.h must precede flex's inclusion of <stdio.h>
+ in order for its _GNU_SOURCE definition to take effect. */
+#include <config.h>
+
+#line 6 "css.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
+void yy_delete_buffer ( YY_BUFFER_STATE b );
+void yy_flush_buffer ( YY_BUFFER_STATE b );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
+
+void *yyalloc ( yy_size_t );
+void *yyrealloc ( void *, yy_size_t );
+void yyfree ( void * );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define yywrap() (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 41
+#define YY_END_OF_BUFFER 42
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[1103] =
+ { 0,
+ 0, 0, 42, 40, 1, 1, 40, 10, 40, 10,
+ 40, 40, 40, 35, 40, 40, 11, 11, 40, 40,
+ 40, 1, 0, 0, 0, 0, 10, 9, 10, 12,
+ 0, 0, 10, 10, 0, 11, 0, 35, 4, 34,
+ 0, 0, 35, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 30, 0, 0, 0, 0, 0,
+ 0, 0, 39, 11, 0, 11, 11, 11, 8, 7,
+ 0, 0, 0, 0, 0, 0, 0, 10, 10, 10,
+ 0, 12, 12, 10, 10, 10, 6, 4, 4, 0,
+ 33, 0, 21, 0, 33, 0, 18, 19, 0, 33,
+
+ 0, 31, 0, 23, 0, 33, 0, 22, 29, 0,
+ 25, 24, 20, 0, 33, 0, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 30, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 11, 11, 11,
+ 11, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10, 10, 10, 0, 0, 12, 12, 10,
+ 10, 10, 4, 2, 33, 33, 33, 33, 33, 21,
+ 26, 0, 33, 33, 33, 33, 33, 33, 33, 33,
+ 18, 19, 33, 0, 33, 33, 33, 33, 33, 33,
+
+ 33, 31, 33, 33, 33, 23, 32, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 22, 29, 33,
+ 33, 33, 33, 33, 24, 20, 27, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 30, 33,
+ 33, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 11, 11, 38, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10, 0, 3, 12, 10, 4, 4, 33,
+
+ 33, 33, 33, 33, 21, 21, 33, 33, 33, 26,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 18,
+ 19, 18, 28, 0, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 31, 31, 33, 33, 33, 23,
+ 23, 33, 33, 33, 32, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 22, 29, 22, 33, 33, 33,
+ 33, 33, 25, 24, 20, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 30, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 25, 33, 33, 33, 30, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 11, 38,
+ 38, 38, 38, 37, 0, 11, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 0, 0, 12, 10, 33, 33, 33, 33, 21,
+ 21, 21, 21, 33, 33, 33, 26, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 18, 19,
+
+ 18, 18, 18, 19, 19, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 31, 31, 31, 31, 33, 33, 33, 23,
+ 23, 23, 23, 33, 33, 33, 32, 32, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 22,
+ 29, 22, 22, 22, 29, 29, 33, 33, 33, 33,
+ 33, 25, 24, 20, 25, 25, 24, 24, 20, 20,
+ 33, 33, 33, 27, 33, 33, 33, 33, 33, 33,
+ 27, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 30, 33, 33,
+
+ 33, 25, 33, 27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 11, 38, 38, 38,
+ 38, 38, 38, 38, 38, 0, 38, 37, 38, 38,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 12, 10, 33, 33, 33,
+ 33, 21, 21, 33, 33, 33, 26, 26, 26, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 18, 19,
+ 18, 33, 33, 33, 28, 33, 33, 33, 33, 33,
+
+ 33, 28, 33, 33, 33, 33, 33, 28, 33, 33,
+ 33, 31, 31, 33, 33, 33, 23, 23, 33, 33,
+ 33, 32, 32, 32, 32, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 22, 29, 22, 33, 33, 33,
+ 33, 33, 25, 24, 20, 33, 33, 33, 27, 27,
+ 27, 33, 33, 33, 33, 27, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 30, 33, 33, 33, 25, 33, 27, 0, 13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 14, 0, 0, 0, 0, 11, 38, 36,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 0,
+ 38, 38, 37, 38, 0, 11, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 12,
+ 10, 33, 33, 33, 21, 21, 33, 33, 33, 26,
+ 33, 33, 33, 33, 33, 33, 33, 18, 19, 18,
+ 33, 33, 33, 28, 28, 28, 33, 33, 33, 33,
+ 33, 33, 33, 33, 28, 33, 33, 31, 31, 33,
+ 33, 23, 23, 33, 33, 33, 32, 32, 33, 33,
+ 33, 33, 33, 33, 33, 22, 29, 22, 33, 33,
+
+ 33, 33, 25, 24, 20, 33, 33, 33, 27, 33,
+ 33, 33, 27, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 30, 33, 33, 33, 25, 33,
+ 27, 0, 0, 0, 0, 13, 0, 0, 0, 0,
+ 0, 0, 0, 15, 0, 0, 0, 0, 0, 14,
+ 14, 0, 11, 38, 38, 38, 38, 38, 38, 38,
+ 0, 0, 38, 38, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 33, 21, 21, 33, 33,
+ 26, 33, 18, 19, 18, 33, 33, 33, 28, 33,
+ 33, 33, 33, 33, 28, 31, 31, 23, 23, 33,
+
+ 33, 32, 32, 33, 22, 29, 22, 25, 24, 20,
+ 33, 33, 27, 33, 27, 16, 0, 13, 0, 0,
+ 0, 0, 0, 15, 15, 0, 0, 38, 38, 38,
+ 0, 0, 0, 0, 38, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 26, 33, 33,
+ 28, 33, 32, 32, 27, 0, 13, 13, 0, 0,
+ 38, 38, 38, 0, 0, 38, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 0, 28, 0, 38,
+ 38, 38, 0, 38, 0, 17, 0, 0, 0, 0,
+ 38, 38, 0, 38, 0, 17, 17, 0, 0, 0,
+
+ 0, 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 4, 5, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 6, 7, 8, 9, 10, 11, 10, 12, 13,
+ 14, 15, 10, 10, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 10, 10, 29,
+ 30, 31, 10, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 42, 49, 50, 51, 52, 42, 42, 53, 42, 54,
+ 10, 55, 10, 10, 42, 10, 56, 57, 58, 59,
+
+ 60, 61, 62, 63, 64, 42, 65, 66, 67, 68,
+ 69, 70, 42, 71, 72, 73, 74, 42, 42, 75,
+ 42, 76, 10, 77, 10, 78, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79
+ } ;
+
+static const YY_CHAR yy_meta[80] =
+ { 0,
+ 1, 2, 3, 3, 3, 2, 2, 4, 2, 2,
+ 2, 4, 5, 2, 2, 6, 2, 7, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 2, 2,
+ 2, 2, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 2, 2, 9
+ } ;
+
+static const flex_int16_t yy_base[1137] =
+ { 0,
+ 0, 0, 4195, 7110, 78, 83, 88, 87, 78, 85,
+ 82, 88, 4161, 142, 4151, 90, 86, 206, 259, 4118,
+ 4083, 98, 234, 4083, 72, 109, 116, 7110, 318, 100,
+ 4082, 361, 208, 420, 4017, 92, 463, 205, 4024, 7110,
+ 3977, 222, 0, 3974, 209, 89, 257, 202, 180, 245,
+ 248, 259, 355, 272, 3955, 524, 3987, 83, 280, 311,
+ 274, 585, 7110, 117, 637, 348, 210, 697, 7110, 7110,
+ 3963, 302, 382, 243, 3940, 3933, 371, 251, 356, 757,
+ 3945, 101, 817, 246, 357, 877, 7110, 3938, 252, 920,
+ 3894, 974, 3886, 1017, 397, 447, 3861, 3860, 661, 376,
+
+ 904, 3850, 721, 3841, 448, 451, 1040, 3840, 3825, 1045,
+ 3813, 3796, 3787, 1063, 569, 600, 3784, 1137, 484, 1180,
+ 613, 1221, 748, 380, 566, 347, 591, 907, 654, 462,
+ 3767, 3789, 118, 559, 779, 633, 593, 588, 628, 782,
+ 654, 3776, 775, 3775, 802, 772, 682, 336, 1279, 345,
+ 447, 1322, 3754, 254, 695, 837, 658, 581, 632, 656,
+ 806, 1012, 456, 862, 1365, 3744, 256, 903, 1408, 278,
+ 964, 1451, 3730, 7110, 3689, 1511, 839, 751, 790, 3655,
+ 3633, 1086, 865, 3648, 3645, 868, 812, 3627, 850, 3599,
+ 3559, 3554, 895, 897, 344, 3587, 3580, 885, 900, 892,
+
+ 922, 3526, 1001, 929, 943, 3484, 3483, 1165, 1002, 3500,
+ 3499, 1037, 1074, 945, 3485, 969, 3476, 3439, 3424, 1096,
+ 3450, 410, 3442, 438, 3403, 3397, 3396, 1109, 1104, 3416,
+ 3396, 745, 1554, 1126, 1597, 1199, 1638, 1237, 1696, 1591,
+ 1451, 1224, 1636, 1495, 1673, 1680, 1762, 1836, 1318, 1740,
+ 1703, 7110, 573, 1049, 1161, 1158, 970, 987, 1131, 1017,
+ 1192, 1245, 3385, 3371, 1046, 1269, 1252, 3369, 3358, 1342,
+ 1600, 1403, 1552, 1788, 1263, 1891, 1796, 1934, 3362, 1868,
+ 1238, 1307, 1248, 3350, 3304, 1055, 1352, 1779, 1931, 1391,
+ 1392, 1393, 1983, 3284, 7110, 2026, 2069, 3253, 347, 892,
+
+ 2112, 1392, 1108, 1110, 1248, 1488, 1500, 3239, 3204, 3174,
+ 1541, 3194, 3177, 2112, 1624, 1119, 3145, 1176, 3142, 1861,
+ 1873, 1878, 3104, 1704, 1607, 3071, 2999, 1394, 2951, 2939,
+ 1979, 1503, 1180, 1209, 1896, 1901, 1669, 1259, 1273, 1936,
+ 1971, 1707, 1278, 1296, 2904, 1691, 2927, 2900, 2022, 1731,
+ 1336, 2867, 1403, 2856, 1994, 2027, 2063, 1753, 2851, 716,
+ 2848, 950, 2068, 2106, 2117, 1786, 2836, 2831, 1793, 2833,
+ 2795, 2150, 2191, 1807, 2234, 2138, 2275, 2156, 2333, 2228,
+ 2237, 2273, 2344, 2358, 2367, 2378, 2449, 2523, 2189, 2433,
+ 2413, 1498, 2121, 2020, 2269, 2451, 1769, 2278, 1797, 2271,
+
+ 1426, 1684, 1625, 2322, 1465, 2311, 2342, 2464, 2148, 2457,
+ 2261, 1528, 2388, 2423, 2759, 1179, 1347, 2149, 2296, 2245,
+ 2683, 2676, 1875, 1831, 2535, 2548, 1910, 2480, 2177, 2645,
+ 2637, 2383, 2555, 7110, 2446, 2468, 2600, 2595, 2508, 2546,
+ 2570, 2561, 2456, 2552, 2533, 2540, 1981, 2561, 2614, 2651,
+ 2674, 741, 457, 7110, 2729, 2807, 2597, 661, 2134, 2596,
+ 2579, 1548, 1591, 2330, 2405, 2814, 2604, 1589, 2641, 97,
+ 2882, 2584, 771, 2942, 3003, 3046, 2605, 1637, 1675, 2688,
+ 2695, 2537, 1235, 2639, 2556, 2555, 2710, 2662, 2543, 2538,
+ 2819, 1925, 2402, 2684, 1849, 2508, 1979, 2507, 2715, 2720,
+
+ 2844, 2463, 1448, 2462, 1598, 2832, 2475, 2463, 2837, 2420,
+ 2412, 2894, 2582, 2374, 2365, 3042, 2023, 2628, 2816, 2853,
+ 2025, 2109, 2889, 2919, 2312, 1614, 2857, 2229, 2270, 2929,
+ 3047, 2262, 1615, 2931, 2423, 2439, 3052, 3083, 3071, 2289,
+ 2269, 3106, 2300, 2407, 3094, 2461, 2233, 2530, 2232, 3119,
+ 3124, 3129, 2191, 1714, 2183, 1734, 3117, 2186, 1033, 2175,
+ 1110, 3142, 3147, 3152, 2135, 1803, 2132, 2181, 2103, 2338,
+ 3076, 2090, 2077, 3160, 3148, 2035, 2003, 3172, 3132, 3134,
+ 0, 3213, 1864, 3230, 3173, 3254, 3181, 3312, 3378, 3437,
+ 3511, 3581, 3656, 3723, 3785, 3859, 3933, 3219, 3988, 4050,
+
+ 3236, 2813, 3269, 2888, 2606, 2901, 3277, 3160, 2608, 2666,
+ 3251, 3162, 3338, 3190, 2881, 3264, 7110, 3191, 3285, 1994,
+ 1985, 2987, 3302, 3350, 3326, 3303, 3358, 3340, 1965, 1964,
+ 3341, 3369, 3367, 3038, 3373, 3009, 4107, 3394, 1039, 3416,
+ 4166, 696, 4225, 3442, 3463, 3481, 3497, 3517, 4285, 4346,
+ 4407, 3059, 3408, 3193, 1957, 1942, 3295, 3430, 3539, 3544,
+ 3283, 2258, 3485, 311, 4467, 4510, 4553, 4596, 590, 2669,
+ 3080, 3327, 3553, 3451, 1920, 1919, 3559, 1876, 2372, 805,
+ 1897, 1896, 3572, 3260, 3261, 1801, 3311, 1794, 3565, 3614,
+ 3619, 3505, 1764, 1751, 3626, 3572, 1712, 1704, 3635, 3537,
+
+ 3597, 0, 842, 1683, 1668, 3640, 3543, 0, 962, 3354,
+ 3355, 3645, 3661, 1143, 3420, 3436, 3672, 3681, 3673, 3477,
+ 3547, 3701, 3710, 1613, 2478, 1302, 1608, 1607, 3716, 3707,
+ 3553, 1605, 3554, 1537, 3732, 3737, 3748, 3732, 1529, 1796,
+ 1502, 1830, 3762, 3770, 3777, 3774, 1498, 1459, 3798, 1394,
+ 3135, 1339, 1384, 1374, 3811, 0, 4639, 3784, 1740, 3822,
+ 2122, 3822, 3869, 3895, 3916, 3941, 3970, 3978, 3995, 4699,
+ 4002, 3880, 4083, 4105, 3722, 0, 3634, 0, 1410, 7110,
+ 3904, 3810, 1349, 1342, 3782, 3868, 4066, 4635, 3883, 3654,
+ 3856, 1427, 3908, 1333, 1308, 3944, 4176, 3996, 3768, 3982,
+
+ 1575, 4001, 4071, 4011, 3853, 4024, 1763, 4756, 4088, 7110,
+ 1487, 3423, 4816, 896, 3208, 4876, 4262, 4444, 4919, 4504,
+ 4547, 4591, 4677, 4979, 5040, 5101, 3896, 4040, 4023, 1274,
+ 1266, 3798, 4080, 4509, 4041, 4065, 4639, 1821, 4709, 5144,
+ 5187, 5230, 3632, 3726, 4208, 4213, 2076, 1260, 1207, 4231,
+ 1176, 1123, 4793, 3760, 1108, 3762, 1099, 4236, 4322, 4327,
+ 4093, 1043, 1038, 4332, 994, 3434, 2212, 1028, 1002, 4913,
+ 992, 951, 4552, 3833, 0, 3946, 3953, 4474, 4479, 4041,
+ 4059, 4645, 4716, 2284, 4091, 4106, 4721, 4733, 929, 840,
+ 4919, 4115, 838, 4116, 837, 4738, 4743, 4756, 811, 2240,
+
+ 777, 3157, 4763, 4798, 4803, 2371, 745, 718, 4823, 658,
+ 646, 5138, 0, 4956, 5225, 5181, 5269, 5279, 5291, 5296,
+ 5303, 5315, 5386, 5143, 5350, 5369, 5375, 5394, 5408, 5448,
+ 5413, 642, 4130, 618, 583, 7110, 4253, 5467, 4134, 4243,
+ 5276, 2587, 4250, 4854, 4277, 4128, 4675, 2903, 4432, 7110,
+ 526, 2948, 4859, 1544, 4963, 5522, 1357, 3705, 5565, 5608,
+ 5472, 5669, 5477, 5730, 4466, 5171, 4581, 508, 493, 4435,
+ 5496, 4865, 4634, 5275, 3053, 5506, 5511, 5565, 478, 449,
+ 4864, 5767, 5602, 5607, 5772, 3203, 451, 445, 4924, 443,
+ 442, 5777, 5790, 5795, 5805, 5812, 5835, 5853, 5859, 4140,
+
+ 4164, 4984, 5017, 5866, 5871, 5876, 5881, 5889, 5894, 5899,
+ 411, 381, 5022, 5907, 5913, 7110, 4866, 5027, 5214, 4678,
+ 5521, 3400, 4944, 7110, 370, 3468, 3483, 5950, 5993, 6036,
+ 5987, 6030, 6096, 0, 6139, 7110, 5502, 5131, 4161, 4218,
+ 4832, 5304, 6035, 5313, 4441, 5307, 3527, 5992, 344, 285,
+ 5490, 6133, 6073, 6138, 6176, 5382, 7110, 296, 3629, 3675,
+ 6213, 6256, 6299, 6199, 6342, 6385, 5403, 237, 230, 7110,
+ 5415, 6212, 6255, 5439, 3976, 5380, 3852, 6293, 3928, 6428,
+ 6471, 6514, 6557, 6600, 5441, 5531, 5500, 5100, 5886, 4057,
+ 6643, 6686, 6729, 5612, 5628, 7110, 133, 4058, 6772, 4181,
+
+ 6336, 7110, 6833, 6837, 6846, 6850, 6855, 6864, 6873, 6882,
+ 6891, 6900, 112, 6904, 6913, 6922, 6931, 6940, 6949, 6958,
+ 6967, 6976, 6984, 6993, 7002, 7011, 7020, 7029, 7038, 7047,
+ 7056, 7065, 7074, 7083, 7092, 7100
+ } ;
+
+static const flex_int16_t yy_def[1137] =
+ { 0,
+ 1102, 1, 1102, 1102, 1102, 1102, 1102, 1103, 1104, 1105,
+ 1106, 1102, 1102, 1102, 1102, 1102, 1107, 1107, 1108, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1103, 1102, 1109, 1104,
+ 1102, 1110, 1105, 1111, 1102, 1107, 1108, 14, 1112, 1102,
+ 1113, 1102, 14, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1107, 1115, 1107, 1107, 1107, 1102, 1102,
+ 1116, 1102, 1102, 1102, 1102, 1102, 1102, 1103, 1103, 1103,
+ 1117, 1104, 1104, 1105, 1105, 1105, 1102, 1112, 1118, 56,
+ 1114, 1119, 1114, 1119, 1114, 94, 1114, 1114, 94, 1114,
+
+ 94, 1114, 94, 1114, 94, 1114, 94, 1114, 1114, 94,
+ 1114, 1114, 1114, 94, 1114, 94, 1114, 1114, 118, 118,
+ 118, 118, 118, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1107, 68, 1107,
+ 1107, 68, 1116, 1120, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1103, 1103, 80, 1117, 1121, 1104, 83, 1105,
+ 1105, 86, 1122, 1102, 1114, 118, 176, 176, 176, 1114,
+ 1114, 94, 176, 176, 176, 176, 176, 176, 176, 176,
+ 1114, 1114, 1114, 94, 176, 176, 176, 1114, 176, 176,
+
+ 176, 1114, 176, 176, 176, 1114, 1114, 94, 176, 176,
+ 176, 1114, 176, 176, 176, 176, 176, 1114, 1114, 176,
+ 176, 176, 176, 176, 1114, 1114, 1114, 94, 176, 176,
+ 176, 1114, 118, 233, 233, 233, 233, 233, 233, 239,
+ 239, 239, 239, 239, 239, 239, 239, 233, 248, 248,
+ 239, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1107, 68, 1123, 68, 1124, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 80, 1125, 1102, 83, 86, 1122, 1126, 1114,
+
+ 176, 301, 301, 301, 301, 301, 176, 176, 176, 1114,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 1114, 94, 176, 176, 176, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 176, 176, 176, 1114, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 176, 176, 176, 301, 301,
+ 301, 301, 233, 373, 373, 373, 373, 373, 373, 379,
+ 379, 379, 379, 379, 379, 379, 379, 373, 388, 388,
+ 379, 1114, 1114, 1114, 1114, 373, 1114, 1114, 1114, 1114,
+
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 373, 1114, 1114, 373, 1114, 1114, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 276, 1123,
+ 1123, 1127, 1128, 1102, 1102, 276, 1129, 1130, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1131, 1132, 1133, 1102, 86, 301, 476, 476, 476, 476,
+ 476, 1114, 1114, 301, 301, 301, 301, 476, 476, 476,
+ 476, 1114, 1114, 476, 476, 476, 476, 476, 476, 476,
+
+ 476, 1114, 1114, 1114, 1114, 176, 176, 176, 301, 301,
+ 301, 301, 476, 476, 476, 476, 1114, 1114, 476, 476,
+ 476, 476, 476, 476, 1114, 1114, 476, 476, 476, 476,
+ 476, 1114, 1114, 301, 301, 301, 301, 301, 476, 476,
+ 476, 476, 1114, 1114, 476, 476, 476, 476, 476, 476,
+ 476, 476, 1114, 1114, 1114, 1114, 476, 476, 476, 476,
+ 476, 476, 476, 476, 1114, 1114, 1114, 1114, 1114, 1114,
+ 301, 301, 301, 301, 476, 476, 476, 476, 1114, 1114,
+ 476, 373, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 590, 590, 582, 582, 582, 590,
+
+ 582, 582, 582, 582, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 276, 1102, 1127, 1102,
+ 1134, 1128, 1135, 1123, 1123, 1102, 1123, 1123, 1123, 1102,
+ 456, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1131, 474, 475, 476, 668, 668,
+ 668, 668, 668, 476, 476, 476, 476, 1114, 1114, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 301, 301, 301, 301, 476, 476, 476, 476, 1114,
+
+ 1114, 476, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 476, 476,
+ 476, 476, 476, 1114, 1114, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 476, 476, 476, 476, 1114,
+ 1114, 668, 668, 668, 668, 668, 582, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 276, 1102, 1102,
+ 1127, 1127, 1127, 1128, 1128, 1128, 1123, 1123, 649, 1136,
+ 1136, 1123, 1136, 649, 1102, 651, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1131, 474,
+ 475, 668, 842, 842, 842, 842, 668, 668, 668, 668,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+ 476, 476, 476, 476, 1114, 1114, 668, 668, 668, 668,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+ 842, 842, 842, 668, 668, 668, 668, 668, 842, 842,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+
+ 842, 842, 842, 842, 842, 668, 668, 668, 668, 842,
+ 842, 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 826, 1127, 1127, 813, 1128, 1128, 816, 649,
+ 1136, 1102, 1136, 824, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1114, 1114, 1114, 842, 842,
+ 842, 1114, 1114, 1114, 1114, 668, 668, 668, 668, 842,
+ 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 842,
+
+ 842, 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 842, 842, 842, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 813, 816, 649,
+ 1136, 1136, 1136, 962, 824, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1114, 842, 842,
+ 842, 1114, 1114, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 813, 816, 649, 1136, 1033, 824, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1114, 1102, 813,
+ 816, 649, 1033, 824, 1102, 1102, 1102, 1102, 1102, 1102,
+ 813, 816, 1033, 1082, 1102, 1102, 1102, 1102, 1033, 1102,
+
+ 1136, 0, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static const flex_int16_t yy_nxt[7190] =
+ { 0,
+ 4, 5, 6, 5, 5, 5, 7, 8, 9, 4,
+ 4, 10, 4, 4, 4, 11, 12, 13, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 15, 4,
+ 4, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 18, 17, 17, 19, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 18, 17, 17, 20, 21, 17, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
+ 23, 23, 23, 23, 28, 31, 28, 35, 63, 22,
+
+ 22, 22, 22, 22, 63, 24, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 72, 1102, 1102, 75,
+ 44, 76, 133, 28, 58, 95, 73, 74, 25, 63,
+ 59, 75, 32, 76, 60, 1096, 37, 61, 72, 34,
+ 65, 29, 26, 96, 62, 133, 65, 58, 95, 77,
+ 253, 25, 40, 59, 32, 32, 60, 41, 42, 61,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 29, 65, 77, 253, 44, 44, 45, 46, 47, 44,
+ 48, 49, 50, 44, 51, 44, 52, 44, 44, 53,
+ 54, 55, 44, 44, 44, 44, 56, 44, 44, 45,
+
+ 46, 47, 44, 48, 49, 50, 51, 44, 52, 44,
+ 44, 53, 54, 55, 44, 44, 44, 44, 63, 28,
+ 44, 1102, 63, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 102, 103, 23, 23, 23, 23, 23,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 100, 24, 1086, 93, 66, 102, 101, 28, 28, 1086,
+ 65, 161, 34, 94, 65, 75, 89, 76, 154, 174,
+ 167, 280, 100, 295, 25, 93, 66, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 106, 26, 28,
+ 104, 68, 68, 68, 68, 68, 68, 25, 1057, 105,
+
+ 34, 97, 107, 108, 115, 29, 138, 1078, 109, 98,
+ 106, 99, 104, 110, 68, 68, 68, 68, 68, 68,
+ 27, 27, 79, 97, 134, 108, 116, 115, 139, 138,
+ 109, 98, 34, 158, 135, 159, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 134, 136, 63, 155,
+ 80, 80, 80, 80, 80, 80, 156, 277, 27, 33,
+ 63, 299, 328, 28, 174, 137, 1078, 329, 28, 330,
+ 136, 155, 1024, 80, 80, 80, 80, 80, 80, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 111,
+ 65, 150, 104, 83, 83, 83, 83, 83, 83, 65,
+
+ 157, 105, 65, 1055, 158, 112, 159, 113, 193, 114,
+ 29, 34, 111, 150, 104, 72, 83, 83, 83, 83,
+ 83, 83, 33, 33, 85, 73, 160, 112, 100, 113,
+ 194, 193, 364, 1055, 101, 181, 365, 72, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 160, 67,
+ 100, 182, 86, 86, 86, 86, 86, 86, 181, 63,
+ 364, 1052, 1052, 28, 365, 183, 203, 1051, 640, 184,
+ 204, 185, 205, 1051, 1048, 86, 86, 86, 86, 86,
+ 86, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 175, 175, 206, 115, 68, 68, 68, 68, 68,
+
+ 68, 65, 234, 1048, 207, 208, 234, 234, 234, 234,
+ 29, 643, 1043, 175, 175, 206, 116, 115, 68, 68,
+ 68, 68, 68, 68, 117, 117, 207, 1043, 950, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 118, 119, 119, 119, 120, 121, 122, 123,
+ 119, 119, 117, 117, 117, 117, 119, 119, 119, 119,
+ 119, 119, 124, 125, 126, 117, 127, 117, 128, 117,
+ 117, 129, 130, 131, 117, 117, 117, 117, 117, 119,
+ 119, 119, 119, 119, 119, 124, 125, 126, 127, 117,
+ 128, 117, 117, 129, 130, 131, 117, 117, 117, 117,
+
+ 117, 117, 117, 140, 227, 1018, 254, 141, 142, 143,
+ 144, 262, 843, 255, 844, 263, 288, 264, 229, 102,
+ 103, 417, 230, 228, 231, 145, 265, 227, 254, 146,
+ 106, 247, 147, 248, 249, 234, 234, 234, 234, 288,
+ 1018, 102, 266, 417, 175, 107, 267, 1016, 145, 265,
+ 268, 146, 269, 106, 147, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 1014, 175, 289, 260, 149,
+ 149, 149, 149, 149, 149, 458, 287, 1014, 280, 186,
+ 158, 271, 159, 187, 188, 189, 190, 261, 111, 272,
+ 289, 260, 149, 149, 149, 149, 149, 149, 67, 67,
+
+ 67, 151, 67, 155, 112, 191, 113, 640, 114, 63,
+ 156, 111, 272, 192, 138, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 155, 112, 191, 113, 152,
+ 152, 152, 152, 152, 152, 192, 139, 138, 563, 199,
+ 1013, 281, 564, 176, 200, 176, 201, 117, 640, 282,
+ 643, 65, 152, 152, 152, 152, 152, 152, 163, 78,
+ 78, 164, 163, 281, 28, 175, 247, 1013, 248, 249,
+ 234, 234, 234, 234, 202, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 473, 305, 175, 295, 165,
+ 165, 165, 165, 165, 165, 641, 202, 256, 1008, 92,
+
+ 270, 257, 271, 258, 141, 142, 143, 144, 136, 305,
+ 274, 29, 165, 165, 165, 165, 165, 165, 82, 82,
+ 82, 168, 82, 259, 290, 306, 137, 851, 75, 852,
+ 76, 136, 1008, 274, 1102, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 259, 134, 320, 306, 169,
+ 169, 169, 169, 169, 169, 283, 135, 302, 1006, 1006,
+ 284, 303, 285, 304, 78, 871, 1004, 872, 134, 28,
+ 320, 32, 169, 169, 169, 169, 169, 169, 170, 84,
+ 84, 171, 170, 311, 286, 322, 315, 312, 28, 313,
+ 316, 317, 318, 319, 175, 172, 172, 172, 172, 172,
+
+ 172, 172, 172, 172, 172, 82, 286, 640, 322, 172,
+ 172, 172, 172, 172, 172, 325, 29, 193, 332, 326,
+ 1102, 327, 195, 333, 335, 334, 176, 196, 176, 197,
+ 323, 34, 172, 172, 172, 172, 172, 172, 119, 194,
+ 193, 175, 119, 119, 119, 119, 92, 335, 175, 324,
+ 643, 108, 198, 323, 336, 1004, 109, 32, 117, 117,
+ 117, 110, 117, 175, 117, 340, 84, 117, 117, 117,
+ 175, 993, 563, 108, 198, 28, 564, 336, 109, 341,
+ 355, 117, 117, 117, 117, 876, 117, 877, 340, 117,
+ 117, 117, 176, 176, 176, 176, 176, 176, 176, 176,
+
+ 176, 176, 341, 355, 357, 425, 176, 176, 176, 176,
+ 176, 176, 993, 291, 291, 291, 292, 291, 34, 337,
+ 346, 992, 426, 338, 347, 339, 348, 357, 425, 176,
+ 176, 176, 176, 176, 176, 177, 176, 176, 176, 178,
+ 176, 179, 176, 176, 176, 426, 640, 992, 92, 176,
+ 176, 176, 176, 176, 176, 744, 72, 427, 209, 745,
+ 989, 180, 210, 213, 211, 989, 73, 214, 215, 216,
+ 217, 428, 176, 176, 176, 176, 176, 176, 72, 212,
+ 427, 220, 434, 180, 175, 221, 222, 223, 224, 218,
+ 207, 208, 350, 641, 219, 418, 351, 352, 353, 354,
+
+ 435, 281, 212, 419, 307, 434, 175, 175, 308, 282,
+ 309, 218, 207, 225, 358, 226, 219, 418, 359, 360,
+ 361, 362, 369, 281, 310, 984, 370, 366, 371, 175,
+ 175, 367, 744, 368, 984, 225, 745, 226, 117, 117,
+ 117, 232, 117, 480, 374, 481, 982, 310, 374, 374,
+ 374, 374, 175, 175, 499, 233, 234, 234, 234, 235,
+ 236, 237, 238, 234, 234, 880, 480, 881, 481, 234,
+ 234, 234, 234, 234, 234, 175, 424, 499, 254, 420,
+ 257, 415, 258, 342, 421, 255, 422, 176, 343, 176,
+ 344, 92, 234, 234, 234, 234, 234, 234, 234, 982,
+
+ 254, 239, 240, 241, 234, 242, 243, 244, 423, 175,
+ 429, 501, 523, 245, 430, 246, 431, 387, 345, 388,
+ 389, 374, 374, 374, 374, 399, 399, 399, 400, 399,
+ 423, 175, 981, 92, 501, 523, 245, 482, 246, 234,
+ 345, 524, 239, 240, 241, 234, 242, 243, 244, 482,
+ 482, 482, 483, 482, 250, 387, 251, 388, 389, 374,
+ 374, 374, 374, 432, 524, 148, 465, 263, 91, 264,
+ 440, 284, 100, 285, 268, 63, 269, 250, 101, 251,
+ 148, 148, 148, 275, 148, 981, 459, 436, 971, 92,
+ 91, 437, 460, 438, 100, 530, 971, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 439, 459, 531,
+ 537, 276, 276, 276, 276, 276, 276, 65, 530, 415,
+ 415, 415, 416, 415, 889, 461, 890, 944, 538, 462,
+ 439, 463, 531, 537, 276, 276, 276, 276, 276, 276,
+ 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 374, 538, 944, 464, 278, 278, 278, 278, 278, 278,
+ 442, 910, 938, 911, 141, 142, 143, 144, 640, 938,
+ 467, 550, 92, 374, 158, 464, 159, 278, 278, 278,
+ 278, 278, 278, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 912, 550, 291, 605, 293, 293, 293,
+
+ 293, 293, 293, 912, 445, 445, 445, 446, 445, 470,
+ 477, 643, 513, 75, 478, 76, 479, 514, 605, 515,
+ 293, 293, 293, 293, 293, 293, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 72, 72, 552, 136,
+ 296, 296, 296, 296, 296, 296, 73, 73, 92, 257,
+ 502, 258, 397, 397, 397, 398, 397, 137, 72, 72,
+ 932, 552, 136, 296, 296, 296, 296, 296, 296, 297,
+ 297, 297, 297, 297, 297, 297, 297, 297, 297, 102,
+ 103, 909, 932, 297, 297, 297, 297, 297, 297, 482,
+ 482, 482, 483, 482, 640, 97, 403, 403, 403, 404,
+
+ 403, 102, 92, 98, 106, 99, 297, 297, 297, 297,
+ 297, 297, 175, 175, 175, 300, 175, 97, 484, 107,
+ 909, 520, 485, 903, 486, 98, 521, 106, 522, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 91,
+ 104, 641, 93, 301, 301, 301, 301, 301, 301, 105,
+ 903, 640, 94, 447, 447, 447, 448, 447, 897, 488,
+ 115, 91, 104, 489, 93, 490, 301, 301, 301, 301,
+ 301, 301, 373, 374, 374, 374, 375, 376, 377, 378,
+ 374, 374, 116, 115, 138, 659, 374, 374, 374, 374,
+ 374, 374, 394, 394, 394, 395, 394, 263, 641, 264,
+
+ 504, 443, 443, 443, 444, 443, 139, 138, 659, 374,
+ 374, 374, 374, 374, 374, 374, 525, 532, 379, 380,
+ 381, 374, 382, 383, 384, 509, 897, 396, 660, 510,
+ 385, 511, 386, 891, 891, 91, 155, 401, 401, 401,
+ 402, 401, 494, 156, 134, 96, 495, 496, 497, 498,
+ 396, 660, 92, 385, 135, 386, 374, 91, 155, 379,
+ 380, 381, 374, 382, 383, 384, 134, 92, 92, 92,
+ 104, 390, 672, 391, 405, 405, 405, 406, 405, 105,
+ 91, 407, 407, 407, 408, 407, 401, 527, 873, 102,
+ 103, 528, 104, 529, 390, 672, 391, 392, 392, 392,
+
+ 393, 392, 91, 873, 407, 407, 407, 408, 407, 539,
+ 673, 102, 106, 540, 374, 541, 553, 91, 374, 374,
+ 374, 374, 506, 870, 108, 534, 507, 107, 508, 109,
+ 535, 870, 536, 673, 110, 106, 555, 102, 103, 91,
+ 93, 405, 405, 405, 406, 405, 108, 108, 175, 545,
+ 94, 109, 109, 546, 547, 548, 549, 110, 923, 102,
+ 924, 925, 93, 409, 409, 409, 410, 409, 92, 108,
+ 175, 557, 374, 864, 109, 558, 559, 560, 561, 106,
+ 468, 468, 468, 469, 468, 268, 864, 269, 92, 445,
+ 445, 445, 446, 445, 107, 374, 411, 450, 450, 450,
+
+ 450, 450, 106, 452, 571, 565, 91, 453, 572, 454,
+ 573, 575, 112, 97, 113, 576, 114, 577, 904, 411,
+ 859, 98, 905, 99, 136, 583, 155, 859, 91, 583,
+ 583, 583, 583, 156, 112, 97, 113, 412, 412, 412,
+ 413, 412, 137, 98, 284, 100, 285, 136, 155, 614,
+ 455, 101, 904, 257, 374, 258, 905, 92, 374, 374,
+ 374, 374, 502, 502, 502, 503, 502, 100, 414, 23,
+ 23, 23, 23, 23, 504, 504, 504, 505, 504, 502,
+ 502, 502, 503, 502, 689, 24, 757, 757, 757, 757,
+ 116, 414, 148, 148, 148, 275, 148, 525, 525, 525,
+
+ 526, 525, 525, 525, 525, 526, 525, 689, 25, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449, 449, 853,
+ 853, 418, 26, 449, 449, 449, 449, 449, 449, 419,
+ 92, 25, 468, 468, 468, 469, 468, 532, 532, 532,
+ 533, 532, 617, 418, 850, 850, 449, 449, 449, 449,
+ 449, 449, 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 834, 181, 618, 617, 456, 456, 456, 456,
+ 456, 456, 532, 532, 532, 533, 532, 834, 155, 182,
+ 517, 517, 517, 518, 517, 156, 181, 803, 803, 456,
+ 456, 456, 456, 456, 456, 553, 553, 553, 554, 553,
+
+ 155, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 519, 797, 138, 691, 471, 471, 471, 471, 471,
+ 471, 797, 755, 543, 543, 543, 544, 543, 555, 555,
+ 555, 556, 555, 194, 519, 139, 138, 691, 471, 471,
+ 471, 471, 471, 471, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 755, 193, 95, 712, 474, 474,
+ 474, 474, 474, 474, 553, 553, 553, 554, 553, 565,
+ 565, 565, 566, 565, 96, 207, 208, 194, 193, 95,
+ 712, 474, 474, 474, 474, 474, 474, 475, 475, 475,
+ 475, 475, 475, 475, 475, 475, 475, 207, 979, 749,
+
+ 980, 475, 475, 475, 475, 475, 475, 567, 567, 567,
+ 568, 567, 749, 492, 492, 492, 493, 492, 569, 569,
+ 569, 570, 569, 392, 475, 475, 475, 475, 475, 475,
+ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476,
+ 923, 713, 924, 925, 476, 476, 476, 476, 476, 476,
+ 181, 579, 579, 579, 580, 579, 596, 92, 597, 598,
+ 583, 583, 583, 583, 713, 93, 182, 476, 476, 476,
+ 476, 476, 476, 181, 596, 94, 597, 598, 583, 583,
+ 583, 583, 111, 567, 652, 581, 92, 93, 653, 92,
+ 415, 415, 415, 416, 415, 623, 743, 606, 112, 430,
+
+ 113, 431, 114, 607, 228, 111, 652, 743, 581, 582,
+ 583, 583, 583, 584, 585, 586, 587, 583, 583, 606,
+ 112, 583, 113, 583, 583, 583, 583, 583, 583, 394,
+ 394, 394, 395, 394, 990, 92, 991, 92, 397, 397,
+ 397, 398, 397, 92, 583, 92, 583, 583, 583, 583,
+ 583, 583, 583, 736, 736, 588, 589, 590, 583, 591,
+ 592, 593, 1009, 612, 601, 717, 1010, 594, 421, 595,
+ 422, 394, 91, 399, 399, 399, 399, 400, 399, 583,
+ 397, 97, 96, 583, 583, 583, 583, 601, 717, 98,
+ 594, 99, 595, 583, 91, 729, 588, 589, 590, 583,
+
+ 591, 592, 593, 97, 281, 95, 718, 1000, 599, 1001,
+ 600, 98, 282, 405, 608, 729, 92, 91, 609, 100,
+ 610, 100, 97, 96, 403, 101, 281, 101, 95, 718,
+ 98, 599, 99, 600, 392, 392, 392, 393, 392, 91,
+ 569, 100, 611, 100, 97, 401, 401, 401, 402, 401,
+ 106, 583, 98, 207, 208, 583, 583, 583, 583, 403,
+ 403, 403, 404, 403, 611, 107, 92, 104, 405, 405,
+ 405, 406, 405, 106, 678, 207, 105, 93, 459, 407,
+ 407, 407, 408, 407, 460, 706, 108, 94, 91, 104,
+ 412, 109, 92, 1011, 706, 1012, 110, 102, 103, 93,
+
+ 459, 625, 91, 104, 492, 263, 106, 264, 108, 543,
+ 91, 91, 105, 109, 407, 407, 407, 408, 407, 102,
+ 115, 107, 108, 661, 91, 104, 92, 109, 284, 106,
+ 285, 699, 110, 91, 405, 405, 405, 406, 405, 699,
+ 181, 583, 116, 115, 108, 583, 583, 583, 583, 109,
+ 409, 409, 409, 410, 409, 722, 182, 108, 604, 409,
+ 207, 208, 109, 181, 628, 583, 407, 110, 629, 583,
+ 630, 723, 106, 583, 583, 583, 583, 228, 722, 108,
+ 724, 604, 207, 602, 109, 695, 631, 107, 583, 181,
+ 437, 111, 438, 91, 723, 106, 735, 695, 619, 112,
+
+ 134, 113, 620, 114, 621, 182, 602, 112, 108, 113,
+ 135, 114, 181, 109, 111, 91, 92, 92, 110, 735,
+ 622, 112, 134, 113, 412, 412, 412, 413, 412, 112,
+ 108, 113, 92, 690, 690, 109, 615, 615, 615, 616,
+ 615, 583, 445, 622, 434, 583, 583, 583, 583, 615,
+ 615, 615, 616, 615, 443, 603, 626, 626, 626, 627,
+ 626, 683, 435, 447, 633, 737, 683, 434, 268, 136,
+ 269, 634, 634, 634, 635, 634, 136, 116, 603, 636,
+ 677, 677, 254, 141, 142, 143, 144, 137, 737, 255,
+ 260, 92, 136, 138, 137, 254, 134, 658, 473, 136,
+
+ 703, 462, 255, 463, 254, 704, 135, 705, 265, 261,
+ 421, 458, 422, 260, 654, 139, 138, 254, 134, 655,
+ 632, 656, 664, 669, 266, 632, 158, 670, 159, 671,
+ 517, 265, 637, 637, 637, 637, 637, 637, 637, 637,
+ 637, 637, 779, 468, 657, 787, 637, 637, 637, 637,
+ 637, 637, 450, 450, 450, 450, 450, 674, 452, 624,
+ 193, 675, 453, 676, 454, 779, 657, 624, 787, 637,
+ 637, 637, 637, 637, 637, 638, 638, 638, 638, 638,
+ 680, 1102, 194, 193, 681, 1102, 682, 454, 155, 482,
+ 482, 482, 483, 482, 613, 156, 482, 482, 482, 483,
+
+ 482, 613, 684, 788, 845, 455, 685, 686, 687, 688,
+ 155, 678, 678, 678, 679, 678, 502, 502, 502, 503,
+ 502, 504, 504, 504, 505, 504, 788, 845, 455, 644,
+ 645, 646, 646, 646, 645, 647, 644, 647, 647, 647,
+ 644, 644, 648, 647, 647, 647, 647, 649, 649, 649,
+ 649, 649, 649, 649, 649, 649, 649, 647, 647, 647,
+ 647, 649, 649, 649, 649, 649, 649, 647, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 650, 649, 649, 649, 649, 649, 649,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+
+ 647, 647, 647, 647, 647, 647, 647, 647, 67, 67,
+ 67, 151, 67, 92, 578, 662, 662, 662, 663, 662,
+ 492, 492, 492, 493, 492, 651, 651, 651, 651, 651,
+ 651, 651, 651, 651, 651, 757, 757, 757, 757, 651,
+ 651, 651, 651, 651, 651, 502, 502, 502, 503, 502,
+ 692, 708, 578, 574, 693, 696, 694, 181, 574, 697,
+ 281, 698, 651, 651, 651, 651, 651, 651, 282, 562,
+ 324, 709, 562, 182, 708, 714, 710, 551, 711, 715,
+ 181, 716, 281, 163, 78, 78, 164, 163, 551, 28,
+ 525, 525, 525, 526, 525, 700, 700, 700, 701, 700,
+
+ 665, 665, 665, 665, 665, 665, 665, 665, 665, 665,
+ 757, 757, 757, 757, 665, 665, 665, 665, 665, 665,
+ 525, 525, 525, 526, 525, 430, 542, 431, 254, 702,
+ 532, 532, 532, 533, 532, 255, 29, 665, 665, 665,
+ 665, 665, 665, 82, 82, 82, 168, 82, 324, 719,
+ 254, 780, 702, 542, 720, 781, 721, 30, 92, 516,
+ 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
+ 437, 516, 438, 780, 666, 666, 666, 666, 666, 666,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 32, 666, 666, 666,
+
+ 666, 666, 666, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 512, 617,
+ 30, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+ 667, 141, 142, 143, 144, 667, 667, 667, 667, 667,
+ 667, 618, 617, 517, 517, 517, 518, 517, 532, 532,
+ 532, 533, 532, 724, 724, 724, 725, 724, 667, 667,
+ 667, 667, 667, 667, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 707, 462, 265, 463, 668, 668,
+ 668, 668, 668, 668, 724, 724, 724, 725, 724, 726,
+ 512, 827, 266, 727, 746, 728, 194, 707, 747, 265,
+
+ 748, 668, 668, 668, 668, 668, 668, 543, 543, 543,
+ 544, 543, 730, 828, 827, 846, 731, 732, 733, 734,
+ 553, 553, 553, 554, 553, 555, 555, 555, 556, 555,
+ 553, 553, 553, 554, 553, 738, 579, 750, 846, 739,
+ 740, 741, 742, 565, 565, 565, 566, 565, 567, 567,
+ 567, 568, 567, 569, 569, 569, 570, 569, 92, 207,
+ 208, 750, 750, 750, 751, 750, 752, 227, 500, 227,
+ 753, 500, 754, 579, 579, 579, 580, 579, 786, 1009,
+ 789, 207, 609, 1010, 610, 421, 228, 422, 228, 92,
+ 227, 770, 227, 771, 772, 757, 757, 757, 757, 770,
+
+ 491, 771, 772, 757, 757, 757, 757, 756, 792, 793,
+ 642, 833, 257, 794, 258, 795, 655, 491, 656, 640,
+ 415, 415, 415, 416, 415, 1049, 228, 1050, 92, 487,
+ 756, 757, 757, 757, 757, 758, 759, 760, 761, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 757, 757,
+ 757, 762, 763, 764, 757, 765, 766, 767, 757, 757,
+ 757, 757, 643, 768, 487, 769, 615, 299, 757, 757,
+ 757, 757, 757, 757, 181, 762, 763, 764, 757, 765,
+ 766, 767, 854, 855, 856, 857, 768, 773, 769, 774,
+ 182, 757, 757, 757, 757, 782, 858, 181, 473, 606,
+
+ 783, 838, 784, 796, 778, 607, 284, 620, 285, 621,
+ 773, 254, 774, 392, 392, 392, 393, 392, 255, 858,
+ 798, 606, 466, 228, 430, 785, 431, 778, 482, 482,
+ 482, 483, 482, 254, 757, 757, 757, 757, 260, 790,
+ 790, 790, 791, 790, 801, 652, 860, 785, 263, 653,
+ 264, 799, 799, 799, 800, 799, 93, 261, 802, 804,
+ 626, 260, 629, 437, 630, 438, 94, 652, 466, 860,
+ 805, 805, 805, 806, 805, 634, 458, 441, 93, 394,
+ 394, 394, 395, 394, 418, 807, 878, 879, 441, 268,
+ 427, 269, 419, 260, 433, 638, 638, 638, 638, 638,
+
+ 757, 757, 757, 757, 428, 434, 418, 454, 433, 878,
+ 879, 265, 261, 427, 775, 372, 260, 809, 809, 809,
+ 809, 809, 609, 435, 610, 639, 829, 266, 434, 810,
+ 640, 830, 96, 831, 265, 372, 865, 775, 397, 397,
+ 397, 398, 397, 638, 638, 638, 638, 638, 835, 1102,
+ 92, 92, 462, 1102, 463, 454, 882, 92, 832, 757,
+ 757, 757, 757, 363, 638, 638, 638, 638, 638, 847,
+ 1102, 363, 883, 848, 1102, 849, 454, 641, 92, 882,
+ 832, 97, 646, 646, 646, 646, 646, 662, 92, 98,
+ 620, 99, 621, 92, 454, 883, 455, 356, 638, 638,
+
+ 638, 638, 638, 97, 1102, 629, 356, 630, 1102, 887,
+ 454, 98, 399, 399, 399, 400, 399, 455, 638, 638,
+ 638, 638, 638, 861, 1102, 349, 349, 862, 1102, 863,
+ 454, 281, 887, 757, 757, 757, 757, 92, 92, 282,
+ 836, 836, 836, 837, 836, 836, 836, 836, 837, 836,
+ 655, 455, 656, 281, 482, 482, 482, 483, 482, 100,
+ 678, 678, 678, 679, 678, 101, 502, 502, 502, 503,
+ 502, 455, 323, 492, 492, 492, 493, 492, 875, 888,
+ 92, 100, 401, 401, 401, 402, 401, 459, 896, 898,
+ 867, 324, 459, 460, 868, 323, 869, 324, 460, 700,
+
+ 331, 875, 888, 757, 757, 757, 757, 331, 92, 459,
+ 181, 896, 898, 92, 459, 504, 504, 504, 505, 504,
+ 502, 502, 502, 503, 502, 321, 182, 865, 865, 865,
+ 866, 865, 323, 181, 102, 103, 700, 700, 700, 701,
+ 700, 517, 517, 517, 518, 517, 525, 525, 525, 526,
+ 525, 324, 783, 321, 784, 323, 102, 403, 403, 403,
+ 404, 403, 525, 525, 525, 526, 525, 977, 314, 931,
+ 708, 314, 874, 532, 532, 532, 533, 532, 757, 757,
+ 757, 757, 532, 532, 532, 533, 532, 92, 228, 324,
+ 977, 884, 931, 708, 194, 874, 885, 794, 886, 795,
+
+ 418, 104, 724, 724, 724, 725, 724, 814, 419, 92,
+ 105, 724, 724, 724, 725, 724, 640, 543, 543, 543,
+ 544, 543, 418, 104, 405, 405, 405, 406, 405, 892,
+ 893, 894, 895, 553, 553, 553, 554, 553, 555, 555,
+ 555, 556, 555, 92, 299, 757, 757, 757, 757, 553,
+ 553, 553, 554, 553, 899, 900, 901, 902, 167, 643,
+ 181, 978, 106, 565, 565, 565, 566, 565, 154, 207,
+ 208, 567, 567, 567, 568, 567, 182, 107, 569, 569,
+ 569, 570, 569, 181, 978, 106, 407, 407, 407, 408,
+ 407, 207, 906, 273, 273, 983, 907, 985, 908, 750,
+
+ 750, 750, 751, 750, 252, 915, 916, 917, 427, 918,
+ 919, 920, 579, 579, 579, 580, 579, 921, 983, 922,
+ 985, 92, 428, 392, 392, 392, 393, 392, 937, 108,
+ 827, 427, 780, 783, 109, 784, 781, 91, 92, 110,
+ 921, 92, 922, 915, 916, 917, 913, 918, 919, 920,
+ 92, 108, 828, 827, 780, 926, 109, 927, 790, 91,
+ 409, 409, 409, 410, 409, 228, 93, 92, 995, 913,
+ 394, 394, 394, 395, 394, 830, 94, 831, 926, 92,
+ 927, 415, 415, 415, 416, 415, 939, 324, 93, 434,
+ 609, 995, 610, 776, 92, 92, 397, 397, 397, 398,
+
+ 397, 942, 418, 91, 92, 928, 421, 435, 422, 112,
+ 419, 113, 434, 114, 92, 92, 776, 399, 399, 399,
+ 400, 399, 933, 96, 418, 91, 943, 934, 928, 935,
+ 794, 112, 795, 113, 412, 412, 412, 413, 412, 97,
+ 92, 965, 401, 401, 401, 402, 401, 98, 92, 99,
+ 966, 934, 89, 935, 936, 757, 757, 757, 757, 167,
+ 162, 97, 945, 965, 100, 777, 620, 162, 621, 98,
+ 101, 403, 403, 403, 404, 403, 936, 154, 996, 405,
+ 405, 405, 406, 405, 799, 997, 100, 116, 777, 405,
+ 405, 405, 406, 405, 102, 103, 407, 407, 407, 408,
+
+ 407, 996, 132, 412, 412, 412, 413, 412, 997, 92,
+ 757, 757, 757, 757, 948, 104, 102, 106, 430, 949,
+ 431, 965, 427, 629, 105, 630, 805, 106, 92, 952,
+ 966, 90, 107, 437, 930, 438, 428, 104, 89, 108,
+ 106, 970, 107, 965, 109, 427, 830, 87, 831, 110,
+ 106, 407, 407, 407, 408, 407, 116, 930, 967, 975,
+ 434, 108, 968, 462, 969, 463, 109, 940, 940, 940,
+ 941, 940, 950, 950, 950, 951, 950, 998, 435, 968,
+ 1039, 969, 1040, 434, 405, 405, 405, 406, 405, 809,
+ 809, 809, 809, 809, 108, 999, 81, 71, 972, 109,
+
+ 998, 810, 91, 655, 110, 656, 407, 407, 407, 408,
+ 407, 986, 70, 459, 606, 987, 108, 988, 999, 460,
+ 607, 109, 106, 1002, 91, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 459, 606, 107, 1003, 808,
+ 808, 808, 808, 808, 808, 106, 1002, 69, 1017, 108,
+ 1005, 1007, 1022, 934, 109, 935, 609, 57, 610, 110,
+ 617, 1003, 808, 808, 808, 808, 808, 808, 639, 639,
+ 812, 108, 1053, 1005, 1007, 39, 109, 946, 946, 946,
+ 947, 946, 618, 617, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 1102, 1053, 1054, 1072, 813, 813,
+
+ 813, 813, 813, 813, 1068, 1102, 1069, 1102, 617, 482,
+ 482, 482, 483, 482, 482, 482, 482, 483, 482, 1054,
+ 1072, 813, 813, 813, 813, 813, 813, 642, 642, 815,
+ 618, 617, 678, 678, 678, 679, 678, 502, 502, 502,
+ 503, 502, 1102, 816, 816, 816, 816, 816, 816, 816,
+ 816, 816, 816, 1102, 1073, 1102, 1102, 816, 816, 816,
+ 816, 816, 816, 638, 638, 638, 638, 638, 1023, 1102,
+ 1102, 1019, 794, 1102, 795, 454, 783, 1073, 784, 1102,
+ 816, 816, 816, 816, 816, 816, 817, 817, 817, 818,
+ 817, 606, 1102, 1102, 1102, 1026, 1102, 607, 454, 620,
+
+ 1102, 621, 1102, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 606, 1102, 1102, 455, 819, 819, 819,
+ 819, 819, 819, 504, 504, 504, 505, 504, 502, 502,
+ 502, 503, 502, 865, 865, 865, 866, 865, 1102, 455,
+ 819, 819, 819, 819, 819, 819, 820, 821, 638, 638,
+ 638, 821, 822, 820, 822, 822, 822, 820, 820, 823,
+ 822, 822, 822, 822, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 824, 822, 822, 822, 822, 824, 824,
+ 824, 824, 824, 824, 822, 822, 822, 822, 822, 822,
+ 822, 822, 822, 822, 822, 822, 822, 822, 822, 822,
+
+ 825, 824, 824, 824, 824, 824, 824, 822, 822, 822,
+ 822, 822, 822, 822, 822, 822, 822, 822, 822, 822,
+ 822, 822, 822, 822, 822, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 1102, 1102, 1102, 1102, 826,
+ 826, 826, 826, 826, 826, 638, 817, 638, 638, 638,
+ 1027, 1102, 1102, 1044, 629, 1102, 630, 454, 830, 1102,
+ 831, 1102, 826, 826, 826, 826, 826, 826, 163, 78,
+ 78, 164, 163, 827, 28, 525, 525, 525, 526, 525,
+ 525, 525, 525, 526, 525, 839, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 828, 827, 1102, 455, 839,
+
+ 839, 839, 839, 839, 839, 646, 646, 646, 646, 646,
+ 973, 973, 973, 974, 973, 1102, 1036, 454, 1102, 1102,
+ 1037, 29, 839, 839, 839, 839, 839, 839, 840, 840,
+ 840, 840, 840, 840, 840, 840, 840, 840, 1036, 1102,
+ 1102, 1102, 840, 840, 840, 840, 840, 840, 638, 638,
+ 638, 638, 638, 517, 517, 517, 518, 517, 962, 652,
+ 454, 1102, 1102, 653, 1102, 840, 840, 840, 840, 840,
+ 840, 841, 841, 841, 841, 841, 841, 841, 841, 841,
+ 841, 652, 1102, 1102, 994, 841, 841, 841, 841, 841,
+ 841, 1102, 638, 638, 638, 638, 638, 1102, 1102, 1042,
+
+ 1102, 962, 1102, 968, 454, 969, 194, 994, 841, 841,
+ 841, 841, 841, 841, 842, 842, 842, 842, 842, 842,
+ 842, 842, 842, 842, 1102, 1102, 1102, 1102, 842, 842,
+ 842, 842, 842, 842, 1102, 1102, 940, 940, 940, 941,
+ 940, 836, 1102, 1102, 1102, 455, 532, 532, 532, 533,
+ 532, 842, 842, 842, 842, 842, 842, 914, 914, 914,
+ 914, 914, 914, 914, 914, 914, 914, 1102, 1102, 1102,
+ 1102, 914, 914, 914, 914, 914, 914, 946, 646, 646,
+ 646, 646, 646, 606, 652, 1102, 1102, 459, 653, 607,
+ 454, 1102, 1102, 460, 914, 914, 914, 914, 914, 914,
+
+ 409, 409, 409, 410, 409, 606, 652, 617, 1102, 459,
+ 163, 78, 78, 164, 163, 1102, 28, 532, 532, 532,
+ 533, 532, 724, 724, 724, 725, 724, 1102, 780, 618,
+ 617, 962, 781, 929, 724, 724, 724, 725, 724, 553,
+ 553, 553, 554, 553, 555, 555, 555, 556, 555, 112,
+ 780, 113, 1102, 114, 1102, 1102, 929, 553, 553, 553,
+ 554, 553, 1102, 29, 565, 565, 565, 566, 565, 1102,
+ 1102, 112, 1102, 113, 953, 953, 953, 953, 953, 953,
+ 953, 953, 953, 953, 1102, 1102, 1102, 1102, 953, 953,
+ 953, 953, 953, 953, 492, 492, 492, 493, 492, 567,
+
+ 567, 567, 568, 567, 569, 569, 569, 570, 569, 1102,
+ 1102, 953, 953, 953, 953, 953, 953, 954, 811, 811,
+ 955, 954, 1102, 640, 750, 750, 750, 751, 750, 1102,
+ 1102, 181, 1102, 1102, 956, 956, 956, 956, 956, 956,
+ 956, 956, 956, 956, 1102, 1102, 1102, 182, 956, 956,
+ 956, 956, 956, 956, 181, 1024, 1024, 1024, 1025, 1024,
+ 148, 148, 148, 275, 148, 678, 678, 678, 679, 678,
+ 641, 956, 956, 956, 956, 956, 956, 957, 814, 814,
+ 958, 957, 1036, 1047, 1056, 1102, 1037, 640, 655, 934,
+ 656, 935, 1102, 1102, 959, 959, 959, 959, 959, 959,
+
+ 959, 959, 959, 959, 1036, 1102, 1102, 1102, 959, 959,
+ 959, 959, 959, 959, 700, 700, 700, 701, 700, 1102,
+ 543, 543, 543, 544, 543, 865, 865, 865, 866, 865,
+ 643, 959, 959, 959, 959, 959, 959, 960, 960, 960,
+ 960, 960, 960, 960, 960, 960, 960, 1102, 875, 1102,
+ 1102, 960, 960, 960, 960, 960, 960, 117, 117, 117,
+ 232, 117, 1060, 1102, 1102, 811, 794, 324, 795, 1102,
+ 640, 875, 207, 208, 960, 960, 960, 960, 960, 960,
+ 821, 821, 821, 963, 821, 724, 724, 724, 725, 724,
+ 1102, 1102, 1102, 1102, 207, 1102, 1102, 964, 964, 964,
+
+ 964, 964, 964, 964, 964, 964, 964, 1102, 1102, 1102,
+ 92, 964, 964, 964, 964, 964, 964, 641, 724, 724,
+ 724, 725, 724, 750, 750, 750, 751, 750, 1057, 1057,
+ 1057, 1058, 1057, 1102, 964, 964, 964, 964, 964, 964,
+ 644, 645, 646, 646, 646, 645, 647, 644, 647, 647,
+ 647, 644, 644, 648, 647, 647, 647, 647, 649, 649,
+ 649, 649, 649, 649, 649, 649, 649, 649, 647, 647,
+ 647, 647, 649, 649, 649, 649, 649, 649, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 647, 650, 649, 649, 649, 649, 649,
+
+ 649, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 1102,
+ 1102, 1102, 1102, 64, 64, 64, 64, 64, 64, 579,
+ 579, 579, 580, 579, 412, 412, 412, 413, 412, 1071,
+ 1036, 1102, 1102, 1039, 1037, 1040, 64, 64, 64, 64,
+ 64, 64, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 1036, 1015, 1102, 115, 30, 30, 30, 30,
+ 30, 30, 394, 394, 394, 395, 394, 1102, 1102, 1038,
+ 1102, 1102, 228, 1039, 1102, 1040, 1015, 116, 115, 30,
+
+ 30, 30, 30, 30, 30, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 1102, 1041, 95, 1102, 33,
+ 33, 33, 33, 33, 33, 1102, 392, 392, 392, 393,
+ 392, 1102, 1059, 1102, 1102, 96, 1102, 783, 1041, 784,
+ 95, 1102, 33, 33, 33, 33, 33, 33, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976, 1102, 1102,
+ 1102, 1102, 976, 976, 976, 976, 976, 976, 1102, 93,
+ 397, 397, 397, 398, 397, 1102, 1102, 973, 940, 94,
+ 399, 399, 399, 400, 399, 976, 976, 976, 976, 976,
+ 976, 93, 401, 401, 401, 402, 401, 403, 403, 403,
+
+ 404, 403, 1102, 1102, 405, 405, 405, 406, 405, 1045,
+ 1102, 1102, 1102, 97, 1102, 1102, 407, 407, 407, 408,
+ 407, 98, 1074, 99, 606, 652, 968, 100, 969, 653,
+ 607, 1077, 1102, 101, 1102, 97, 830, 1102, 831, 827,
+ 1102, 104, 106, 98, 102, 103, 606, 652, 1102, 100,
+ 105, 415, 415, 415, 416, 415, 1102, 107, 1102, 108,
+ 1102, 828, 827, 104, 109, 106, 102, 1102, 1102, 110,
+ 405, 405, 405, 406, 405, 1102, 407, 407, 407, 408,
+ 407, 108, 1075, 1102, 1102, 1102, 109, 409, 409, 409,
+ 410, 409, 1102, 1102, 1102, 117, 117, 117, 232, 117,
+
+ 1079, 1102, 1102, 1102, 92, 934, 1102, 935, 106, 117,
+ 117, 117, 232, 117, 117, 117, 117, 232, 117, 108,
+ 111, 1085, 1102, 107, 109, 965, 1068, 1102, 1069, 110,
+ 1102, 106, 181, 1087, 966, 1102, 112, 1039, 113, 1040,
+ 114, 108, 1102, 111, 1102, 1102, 109, 965, 182, 117,
+ 117, 117, 232, 117, 1102, 181, 1102, 1090, 112, 1095,
+ 113, 968, 92, 969, 1068, 1102, 1069, 92, 1020, 1020,
+ 1020, 1021, 1020, 646, 646, 646, 646, 646, 638, 821,
+ 638, 638, 638, 227, 1102, 454, 1102, 1102, 1102, 1102,
+ 454, 865, 865, 865, 866, 865, 1102, 1045, 1045, 1045,
+
+ 1046, 1045, 228, 1102, 1102, 1102, 227, 175, 175, 175,
+ 300, 175, 482, 482, 482, 483, 482, 780, 1098, 1102,
+ 1067, 781, 1039, 1020, 1040, 1068, 962, 1069, 827, 1102,
+ 1102, 962, 1096, 1096, 1096, 1097, 1096, 1102, 1102, 780,
+ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028,
+ 828, 827, 1070, 1102, 1028, 1028, 1028, 1028, 1028, 1028,
+ 92, 1102, 1102, 1102, 1102, 92, 482, 482, 482, 483,
+ 482, 780, 1102, 1102, 1070, 781, 1102, 1028, 1028, 1028,
+ 1028, 1028, 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029,
+ 1029, 1029, 1029, 780, 1102, 1102, 1102, 1029, 1029, 1029,
+
+ 1029, 1029, 1029, 502, 502, 502, 503, 502, 504, 504,
+ 504, 505, 504, 821, 821, 821, 963, 821, 1102, 92,
+ 1029, 1029, 1029, 1029, 1029, 1029, 1030, 1030, 1030, 1030,
+ 1030, 1030, 1030, 1030, 1030, 1030, 1102, 1102, 1102, 1102,
+ 1030, 1030, 1030, 1030, 1030, 1030, 1100, 1102, 1102, 1102,
+ 1102, 1068, 1102, 1069, 1102, 1102, 92, 1102, 1102, 1102,
+ 1102, 92, 1102, 1030, 1030, 1030, 1030, 1030, 1030, 820,
+ 1031, 646, 646, 646, 1031, 1032, 820, 1032, 1032, 1032,
+ 820, 820, 823, 1032, 1032, 1032, 1032, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1032, 1032, 1032,
+
+ 1032, 1033, 1033, 1033, 1033, 1033, 1033, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1034, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1035, 1035,
+ 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1102, 1102,
+ 1102, 1102, 1035, 1035, 1035, 1035, 1035, 1035, 492, 492,
+ 492, 493, 492, 502, 502, 502, 503, 502, 700, 700,
+ 700, 701, 700, 1102, 1102, 1035, 1035, 1035, 1035, 1035,
+ 1035, 517, 517, 517, 518, 517, 175, 175, 175, 300,
+
+ 175, 1102, 1102, 1102, 1102, 181, 175, 175, 175, 300,
+ 175, 1102, 995, 525, 525, 525, 526, 525, 1102, 1102,
+ 1102, 182, 193, 1102, 1102, 1102, 92, 1102, 181, 1102,
+ 323, 324, 1102, 1102, 1102, 995, 525, 525, 525, 526,
+ 525, 1102, 1102, 1102, 194, 193, 1102, 1102, 1102, 324,
+ 1102, 1102, 1102, 323, 532, 532, 532, 533, 532, 92,
+ 532, 532, 532, 533, 532, 1102, 92, 543, 543, 543,
+ 544, 543, 553, 553, 553, 554, 553, 555, 555, 555,
+ 556, 555, 553, 553, 553, 554, 553, 1102, 1088, 92,
+ 565, 565, 565, 566, 565, 567, 567, 567, 568, 567,
+
+ 569, 569, 569, 570, 569, 1102, 1102, 92, 579, 579,
+ 579, 580, 579, 92, 175, 175, 175, 300, 175, 207,
+ 208, 1102, 1102, 1102, 1102, 92, 1102, 1102, 1102, 1102,
+ 92, 1102, 1102, 1102, 1102, 92, 1036, 1102, 1102, 1102,
+ 1037, 207, 227, 92, 1102, 1102, 1102, 1102, 92, 1102,
+ 1102, 1102, 1102, 92, 1102, 1102, 1102, 1102, 1036, 1102,
+ 1102, 228, 1102, 1102, 1102, 227, 1102, 92, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1102, 1102,
+ 1102, 1102, 1061, 1061, 1061, 1061, 1061, 1061, 646, 646,
+ 646, 646, 646, 678, 678, 678, 679, 678, 1102, 1102,
+
+ 454, 1102, 1102, 1102, 1102, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1102, 1102, 1102, 1102, 1062, 1062, 1062, 1062, 1062,
+ 1062, 646, 646, 646, 646, 646, 1075, 1075, 1075, 1076,
+ 1075, 962, 1102, 454, 1102, 1102, 92, 1102, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1102, 1102, 1102, 1102, 1063, 1063,
+ 1063, 1063, 1063, 1063, 724, 724, 724, 725, 724, 1102,
+ 965, 1102, 1102, 1102, 962, 1102, 1102, 1102, 1102, 966,
+ 1102, 1063, 1063, 1063, 1063, 1063, 1063, 1031, 1031, 1031,
+
+ 1064, 1031, 965, 1102, 1102, 1102, 1102, 1102, 1102, 454,
+ 1102, 1102, 1102, 1102, 1065, 1065, 1065, 1065, 1065, 1065,
+ 1065, 1065, 1065, 1065, 1102, 1102, 1102, 92, 1065, 1065,
+ 1065, 1065, 1065, 1065, 700, 700, 700, 701, 700, 724,
+ 724, 724, 725, 724, 1102, 1102, 1102, 1102, 1102, 1102,
+ 962, 1065, 1065, 1065, 1065, 1065, 1065, 1066, 1066, 1066,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1102, 323, 1102,
+ 1102, 1066, 1066, 1066, 1066, 1066, 1066, 750, 750, 750,
+ 751, 750, 1102, 1102, 1102, 1102, 1102, 324, 1102, 1102,
+ 1102, 323, 92, 1102, 1066, 1066, 1066, 1066, 1066, 1066,
+
+ 646, 1031, 646, 646, 646, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 454, 1088, 1088, 1088, 1089, 1088, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 92, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080,
+ 1080, 1102, 1102, 1102, 1102, 1080, 1080, 1080, 1080, 1080,
+ 1080, 1102, 1102, 962, 1102, 1102, 1088, 1088, 1088, 1089,
+ 1088, 1102, 1036, 1102, 1102, 1102, 1037, 1102, 1080, 1080,
+ 1080, 1080, 1080, 1080, 1081, 1081, 1081, 1081, 1081, 1081,
+ 1081, 1081, 1081, 1081, 1036, 1102, 1102, 1102, 1081, 1081,
+ 1081, 1081, 1081, 1081, 865, 865, 865, 866, 865, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1036, 1102, 1102, 1102, 1037,
+ 1102, 1081, 1081, 1081, 1081, 1081, 1081, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1036, 1102, 1102,
+ 1102, 1082, 1082, 1082, 1082, 1082, 1082, 1031, 1031, 1031,
+ 1064, 1031, 1102, 1102, 1102, 1102, 1102, 92, 1102, 454,
+ 1102, 1102, 1102, 1102, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1102, 1102, 1102, 1102, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 962, 1102, 1102, 1102, 1102, 1102, 1102, 1083, 1083, 1083,
+
+ 1083, 1083, 1083, 1084, 1084, 1084, 1084, 1084, 1084, 1084,
+ 1084, 1084, 1084, 1102, 1102, 1102, 1102, 1084, 1084, 1084,
+ 1084, 1084, 1084, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1084, 1084, 1084, 1084, 1084, 1084, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1102, 1102, 1102, 1102,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1091, 1091, 1091, 1091, 1091, 1091, 1092,
+ 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1102,
+
+ 1102, 1102, 1102, 1092, 1092, 1092, 1092, 1092, 1092, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1092, 1092, 1092, 1092,
+ 1092, 1092, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 1102, 1102, 1102, 1102, 451, 451, 451, 451,
+ 451, 451, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 451,
+ 451, 451, 451, 451, 451, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1102, 1102, 1102, 1102, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1102, 1102, 1102, 1102, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1094,
+ 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1102, 1102,
+ 1102, 1102, 1094, 1094, 1094, 1094, 1094, 1094, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1094, 1094, 1094, 1094, 1094,
+ 1094, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 1102, 1102, 1102, 1102, 639, 639, 639, 639, 639,
+ 639, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 639, 639,
+
+ 639, 639, 639, 639, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 1102, 1102, 1102, 1102, 642, 642,
+ 642, 642, 642, 642, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 642, 642, 642, 642, 642, 642, 1099, 1099, 1099,
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1102, 1102, 1102,
+ 1102, 1099, 1099, 1099, 1099, 1099, 1099, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1099, 1099, 1099, 1099, 1099, 1099,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+
+ 1102, 1102, 1102, 1102, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1101, 1101, 1101,
+ 1101, 1101, 1101, 27, 27, 1102, 27, 27, 27, 27,
+ 27, 27, 30, 30, 30, 30, 33, 33, 1102, 33,
+ 33, 33, 33, 33, 33, 36, 1102, 1102, 36, 64,
+ 64, 1102, 64, 64, 67, 67, 1102, 67, 67, 67,
+ 67, 67, 67, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 82, 82, 1102, 82, 82, 82, 82, 82,
+ 82, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 91,
+ 1102, 91, 91, 148, 148, 1102, 148, 148, 148, 148,
+ 148, 148, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 175,
+ 175, 1102, 175, 175, 175, 175, 175, 175, 279, 279,
+ 279, 279, 279, 279, 279, 279, 279, 294, 294, 294,
+ 294, 294, 294, 294, 294, 294, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 451, 451, 451, 1102, 451,
+ 451, 451, 451, 457, 457, 457, 457, 457, 457, 457,
+
+ 457, 457, 472, 472, 472, 472, 472, 472, 472, 472,
+ 472, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 639, 639, 1102, 639, 639, 639, 639, 639, 639, 642,
+ 642, 1102, 642, 642, 642, 642, 642, 642, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 279, 279, 279,
+ 279, 279, 279, 279, 279, 279, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 472, 472, 472, 472, 472,
+ 472, 472, 472, 472, 294, 294, 294, 294, 294, 294,
+ 294, 294, 294, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 814, 814, 814, 814, 814, 814, 814, 814,
+
+ 814, 961, 961, 1102, 1102, 961, 961, 961, 961, 3,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static const flex_int16_t yy_chk[7190] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+ 5, 5, 5, 5, 6, 6, 6, 6, 6, 7,
+ 7, 7, 7, 7, 8, 9, 10, 11, 17, 22,
+
+ 22, 22, 22, 22, 36, 7, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 25, 30, 82, 470,
+ 1113, 470, 58, 27, 16, 46, 25, 26, 7, 64,
+ 16, 26, 9, 26, 16, 1097, 11, 16, 25, 10,
+ 17, 8, 7, 46, 16, 58, 36, 16, 46, 26,
+ 133, 7, 14, 16, 30, 82, 16, 14, 14, 16,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 27, 64, 26, 133, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 18, 33,
+ 14, 38, 67, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 49, 49, 23, 23, 23, 23, 23,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 48, 23, 1069, 45, 18, 49, 48, 84, 78, 1068,
+ 18, 74, 33, 45, 67, 74, 89, 74, 154, 89,
+ 167, 154, 48, 167, 23, 45, 18, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 51, 23, 170,
+ 50, 19, 19, 19, 19, 19, 19, 23, 1058, 50,
+
+ 84, 47, 51, 52, 54, 78, 61, 1050, 52, 47,
+ 51, 47, 50, 52, 19, 19, 19, 19, 19, 19,
+ 29, 29, 29, 47, 59, 52, 54, 54, 61, 61,
+ 52, 47, 170, 664, 59, 664, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 59, 60, 148, 72,
+ 29, 29, 29, 29, 29, 29, 72, 150, 79, 85,
+ 66, 299, 195, 79, 299, 60, 1049, 195, 85, 195,
+ 60, 72, 1025, 29, 29, 29, 29, 29, 29, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 53,
+ 148, 66, 126, 32, 32, 32, 32, 32, 32, 150,
+
+ 73, 126, 66, 1012, 73, 53, 73, 53, 100, 53,
+ 79, 85, 53, 66, 126, 77, 32, 32, 32, 32,
+ 32, 32, 34, 34, 34, 77, 73, 53, 124, 53,
+ 100, 100, 222, 1011, 124, 95, 222, 77, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 73, 151,
+ 124, 95, 34, 34, 34, 34, 34, 34, 95, 151,
+ 224, 991, 990, 163, 224, 96, 105, 988, 453, 96,
+ 105, 96, 105, 987, 980, 34, 34, 34, 34, 34,
+ 34, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 96, 105, 105, 130, 37, 37, 37, 37, 37,
+
+ 37, 151, 119, 979, 106, 106, 119, 119, 119, 119,
+ 163, 453, 969, 96, 105, 105, 130, 130, 37, 37,
+ 37, 37, 37, 37, 56, 56, 106, 968, 951, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+
+ 56, 56, 56, 62, 115, 935, 134, 62, 62, 62,
+ 62, 137, 669, 134, 669, 137, 158, 137, 116, 125,
+ 125, 253, 116, 115, 116, 62, 138, 115, 134, 62,
+ 127, 121, 62, 121, 121, 121, 121, 121, 121, 158,
+ 934, 125, 138, 253, 116, 127, 139, 932, 62, 138,
+ 139, 62, 139, 127, 62, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 911, 116, 159, 136, 65,
+ 65, 65, 65, 65, 65, 458, 157, 910, 458, 99,
+ 157, 141, 157, 99, 99, 99, 99, 136, 129, 141,
+ 159, 136, 65, 65, 65, 65, 65, 65, 68, 68,
+
+ 68, 68, 68, 160, 129, 99, 129, 642, 129, 68,
+ 160, 129, 141, 99, 147, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 160, 129, 99, 129, 68,
+ 68, 68, 68, 68, 68, 99, 147, 147, 360, 103,
+ 908, 155, 360, 103, 103, 103, 103, 232, 452, 155,
+ 642, 68, 68, 68, 68, 68, 68, 68, 80, 80,
+ 80, 80, 80, 155, 80, 103, 123, 907, 123, 123,
+ 123, 123, 123, 123, 103, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 473, 178, 103, 473, 80,
+ 80, 80, 80, 80, 80, 452, 103, 135, 901, 232,
+
+ 140, 135, 143, 135, 140, 140, 140, 140, 146, 178,
+ 143, 80, 80, 80, 80, 80, 80, 80, 83, 83,
+ 83, 83, 83, 135, 161, 179, 146, 680, 161, 680,
+ 161, 146, 899, 143, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 135, 145, 187, 179, 83,
+ 83, 83, 83, 83, 83, 156, 145, 177, 895, 893,
+ 156, 177, 156, 177, 164, 703, 890, 703, 145, 164,
+ 187, 83, 83, 83, 83, 83, 83, 83, 86, 86,
+ 86, 86, 86, 183, 156, 189, 186, 183, 86, 183,
+ 186, 186, 186, 186, 300, 86, 86, 86, 86, 86,
+
+ 86, 86, 86, 86, 86, 168, 156, 814, 189, 86,
+ 86, 86, 86, 86, 86, 194, 164, 198, 199, 194,
+ 168, 194, 101, 199, 200, 199, 101, 101, 101, 101,
+ 193, 86, 86, 86, 86, 86, 86, 86, 90, 198,
+ 198, 194, 90, 90, 90, 90, 300, 200, 101, 193,
+ 814, 128, 101, 193, 201, 889, 128, 168, 90, 90,
+ 90, 128, 90, 194, 90, 204, 171, 90, 90, 90,
+ 101, 872, 362, 128, 101, 171, 362, 201, 128, 205,
+ 214, 90, 90, 90, 90, 709, 90, 709, 204, 90,
+ 90, 90, 92, 92, 92, 92, 92, 92, 92, 92,
+
+ 92, 92, 205, 214, 216, 257, 92, 92, 92, 92,
+ 92, 92, 871, 162, 162, 162, 162, 162, 171, 203,
+ 209, 869, 258, 203, 209, 203, 209, 216, 257, 92,
+ 92, 92, 92, 92, 92, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 258, 639, 868, 865, 94,
+ 94, 94, 94, 94, 94, 559, 162, 260, 107, 559,
+ 863, 94, 107, 110, 107, 862, 162, 110, 110, 110,
+ 110, 260, 94, 94, 94, 94, 94, 94, 162, 107,
+ 260, 114, 265, 94, 107, 114, 114, 114, 114, 110,
+ 212, 212, 213, 639, 110, 254, 213, 213, 213, 213,
+
+ 265, 286, 107, 254, 182, 265, 107, 114, 182, 286,
+ 182, 110, 212, 114, 220, 114, 110, 254, 220, 220,
+ 220, 220, 229, 286, 182, 857, 229, 228, 229, 114,
+ 182, 228, 561, 228, 855, 114, 561, 114, 118, 118,
+ 118, 118, 118, 303, 234, 304, 852, 182, 234, 234,
+ 234, 234, 182, 228, 316, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 714, 303, 714, 304, 118,
+ 118, 118, 118, 118, 118, 228, 256, 316, 259, 255,
+ 256, 416, 256, 208, 255, 259, 255, 208, 208, 208,
+ 208, 118, 118, 118, 118, 118, 118, 118, 120, 851,
+
+ 259, 120, 120, 120, 120, 120, 120, 120, 255, 208,
+ 261, 318, 333, 120, 261, 120, 261, 236, 208, 236,
+ 236, 236, 236, 236, 236, 242, 242, 242, 242, 242,
+ 255, 208, 849, 416, 318, 333, 120, 483, 120, 122,
+ 208, 334, 122, 122, 122, 122, 122, 122, 122, 305,
+ 305, 305, 305, 305, 122, 238, 122, 238, 238, 238,
+ 238, 238, 238, 262, 334, 275, 283, 262, 242, 262,
+ 267, 283, 242, 283, 267, 275, 267, 122, 242, 122,
+ 149, 149, 149, 149, 149, 848, 281, 266, 831, 483,
+ 242, 266, 281, 266, 242, 338, 830, 149, 149, 149,
+
+ 149, 149, 149, 149, 149, 149, 149, 266, 281, 339,
+ 343, 149, 149, 149, 149, 149, 149, 275, 338, 249,
+ 249, 249, 249, 249, 726, 282, 726, 795, 344, 282,
+ 266, 282, 339, 343, 149, 149, 149, 149, 149, 149,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 249, 344, 794, 282, 152, 152, 152, 152, 152, 152,
+ 270, 752, 784, 752, 270, 270, 270, 270, 957, 783,
+ 287, 351, 249, 249, 287, 282, 287, 152, 152, 152,
+ 152, 152, 152, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 754, 351, 292, 417, 165, 165, 165,
+
+ 165, 165, 165, 753, 272, 272, 272, 272, 272, 290,
+ 302, 957, 328, 290, 302, 290, 302, 328, 417, 328,
+ 165, 165, 165, 165, 165, 165, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 291, 292, 353, 272,
+ 169, 169, 169, 169, 169, 169, 291, 292, 750, 792,
+ 503, 792, 241, 241, 241, 241, 241, 272, 291, 292,
+ 779, 353, 272, 169, 169, 169, 169, 169, 169, 172,
+ 172, 172, 172, 172, 172, 172, 172, 172, 172, 401,
+ 401, 748, 779, 172, 172, 172, 172, 172, 172, 306,
+ 306, 306, 306, 306, 811, 241, 244, 244, 244, 244,
+
+ 244, 401, 503, 241, 405, 241, 172, 172, 172, 172,
+ 172, 172, 176, 176, 176, 176, 176, 241, 307, 405,
+ 747, 332, 307, 741, 307, 241, 332, 405, 332, 176,
+ 176, 176, 176, 176, 176, 176, 176, 176, 176, 244,
+ 244, 811, 392, 176, 176, 176, 176, 176, 176, 244,
+ 739, 954, 392, 273, 273, 273, 273, 273, 734, 311,
+ 412, 244, 244, 311, 392, 311, 176, 176, 176, 176,
+ 176, 176, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 412, 412, 273, 462, 233, 233, 233, 233,
+ 233, 233, 240, 240, 240, 240, 240, 801, 954, 801,
+
+ 505, 271, 271, 271, 271, 271, 273, 273, 462, 233,
+ 233, 233, 233, 233, 233, 235, 526, 533, 235, 235,
+ 235, 235, 235, 235, 235, 325, 732, 240, 463, 325,
+ 235, 325, 235, 728, 727, 240, 468, 243, 243, 243,
+ 243, 243, 315, 468, 271, 240, 315, 315, 315, 315,
+ 240, 463, 505, 235, 271, 235, 237, 240, 468, 237,
+ 237, 237, 237, 237, 237, 237, 271, 724, 526, 533,
+ 403, 237, 478, 237, 245, 245, 245, 245, 245, 403,
+ 243, 246, 246, 246, 246, 246, 402, 337, 705, 243,
+ 243, 337, 403, 337, 237, 478, 237, 239, 239, 239,
+
+ 239, 239, 243, 704, 251, 251, 251, 251, 251, 346,
+ 479, 243, 245, 346, 239, 346, 554, 245, 239, 239,
+ 239, 239, 324, 698, 246, 342, 324, 245, 324, 246,
+ 342, 697, 342, 479, 246, 245, 556, 402, 402, 245,
+ 239, 250, 250, 250, 250, 250, 246, 251, 324, 350,
+ 239, 246, 251, 350, 350, 350, 350, 251, 759, 402,
+ 759, 759, 239, 247, 247, 247, 247, 247, 554, 251,
+ 324, 358, 250, 694, 251, 358, 358, 358, 358, 250,
+ 288, 288, 288, 288, 288, 807, 693, 807, 556, 274,
+ 274, 274, 274, 274, 250, 250, 247, 277, 277, 277,
+
+ 277, 277, 250, 277, 366, 566, 247, 277, 366, 277,
+ 366, 369, 247, 397, 247, 369, 247, 369, 740, 247,
+ 688, 397, 740, 397, 274, 374, 288, 686, 247, 374,
+ 374, 374, 374, 288, 247, 397, 247, 248, 248, 248,
+ 248, 248, 274, 397, 838, 399, 838, 274, 288, 424,
+ 277, 399, 742, 424, 248, 424, 742, 566, 248, 248,
+ 248, 248, 320, 320, 320, 320, 320, 399, 248, 280,
+ 280, 280, 280, 280, 321, 321, 321, 321, 321, 322,
+ 322, 322, 322, 322, 495, 280, 583, 583, 583, 583,
+ 248, 248, 276, 276, 276, 276, 276, 335, 335, 335,
+
+ 335, 335, 336, 336, 336, 336, 336, 495, 280, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 682,
+ 681, 423, 280, 276, 276, 276, 276, 276, 276, 423,
+ 678, 280, 289, 289, 289, 289, 289, 340, 340, 340,
+ 340, 340, 427, 423, 676, 675, 276, 276, 276, 276,
+ 276, 276, 278, 278, 278, 278, 278, 278, 278, 278,
+ 278, 278, 656, 492, 427, 427, 278, 278, 278, 278,
+ 278, 278, 341, 341, 341, 341, 341, 655, 289, 492,
+ 331, 331, 331, 331, 331, 289, 492, 630, 629, 278,
+ 278, 278, 278, 278, 278, 355, 355, 355, 355, 355,
+
+ 289, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 331, 621, 447, 497, 293, 293, 293, 293, 293,
+ 293, 620, 577, 349, 349, 349, 349, 349, 356, 356,
+ 356, 356, 356, 331, 331, 447, 447, 497, 293, 293,
+ 293, 293, 293, 293, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 576, 517, 394, 521, 296, 296,
+ 296, 296, 296, 296, 357, 357, 357, 357, 357, 363,
+ 363, 363, 363, 363, 394, 349, 349, 517, 517, 394,
+ 521, 296, 296, 296, 296, 296, 296, 297, 297, 297,
+ 297, 297, 297, 297, 297, 297, 297, 349, 847, 573,
+
+ 847, 297, 297, 297, 297, 297, 297, 364, 364, 364,
+ 364, 364, 572, 314, 314, 314, 314, 314, 365, 365,
+ 365, 365, 365, 393, 297, 297, 297, 297, 297, 297,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 761, 522, 761, 761, 301, 301, 301, 301, 301, 301,
+ 314, 372, 372, 372, 372, 372, 376, 569, 376, 376,
+ 376, 376, 376, 376, 522, 393, 314, 301, 301, 301,
+ 301, 301, 301, 314, 378, 393, 378, 378, 378, 378,
+ 378, 378, 409, 568, 459, 372, 567, 393, 459, 565,
+ 389, 389, 389, 389, 389, 429, 560, 418, 409, 429,
+
+ 409, 429, 409, 418, 372, 409, 459, 558, 372, 373,
+ 373, 373, 373, 373, 373, 373, 373, 373, 373, 418,
+ 409, 389, 409, 373, 373, 373, 373, 373, 373, 380,
+ 380, 380, 380, 380, 867, 568, 867, 555, 381, 381,
+ 381, 381, 381, 389, 389, 553, 373, 373, 373, 373,
+ 373, 373, 375, 549, 547, 375, 375, 375, 375, 375,
+ 375, 375, 900, 420, 380, 528, 900, 375, 420, 375,
+ 420, 395, 380, 400, 382, 382, 382, 382, 382, 411,
+ 398, 381, 380, 411, 411, 411, 411, 380, 528, 381,
+ 375, 381, 375, 377, 380, 541, 377, 377, 377, 377,
+
+ 377, 377, 377, 381, 662, 395, 529, 884, 377, 884,
+ 377, 381, 662, 406, 419, 540, 532, 382, 419, 400,
+ 419, 382, 398, 395, 404, 400, 662, 382, 395, 529,
+ 398, 377, 398, 377, 379, 379, 379, 379, 379, 382,
+ 570, 400, 419, 382, 398, 383, 383, 383, 383, 383,
+ 406, 379, 398, 543, 543, 379, 379, 379, 379, 384,
+ 384, 384, 384, 384, 419, 406, 525, 404, 385, 385,
+ 385, 385, 385, 406, 679, 543, 404, 379, 464, 386,
+ 386, 386, 386, 386, 464, 515, 407, 379, 383, 404,
+ 413, 407, 570, 906, 514, 906, 407, 383, 383, 379,
+
+ 464, 432, 384, 384, 493, 432, 385, 432, 407, 544,
+ 383, 385, 384, 407, 391, 391, 391, 391, 391, 383,
+ 413, 385, 386, 465, 384, 384, 679, 386, 465, 385,
+ 465, 511, 386, 385, 390, 390, 390, 390, 390, 510,
+ 493, 414, 413, 413, 386, 414, 414, 414, 414, 386,
+ 387, 387, 387, 387, 387, 535, 493, 391, 414, 410,
+ 544, 544, 391, 493, 435, 390, 408, 391, 435, 396,
+ 435, 536, 390, 396, 396, 396, 396, 414, 535, 391,
+ 725, 414, 544, 387, 391, 508, 436, 390, 390, 396,
+ 436, 410, 436, 387, 536, 390, 546, 507, 428, 387,
+
+ 443, 387, 428, 387, 428, 396, 387, 410, 408, 410,
+ 443, 410, 396, 408, 410, 387, 504, 502, 408, 546,
+ 428, 387, 443, 387, 388, 388, 388, 388, 388, 410,
+ 408, 410, 725, 498, 496, 408, 425, 425, 425, 425,
+ 425, 388, 446, 428, 439, 388, 388, 388, 388, 426,
+ 426, 426, 426, 426, 444, 388, 433, 433, 433, 433,
+ 433, 490, 439, 448, 440, 548, 489, 439, 440, 445,
+ 440, 441, 441, 441, 441, 441, 446, 388, 388, 442,
+ 486, 485, 425, 442, 442, 442, 442, 445, 548, 425,
+ 433, 482, 445, 448, 446, 426, 444, 461, 472, 446,
+
+ 513, 461, 426, 461, 425, 513, 444, 513, 441, 433,
+ 942, 457, 942, 433, 460, 448, 448, 426, 444, 460,
+ 438, 460, 467, 477, 441, 437, 467, 477, 467, 477,
+ 518, 441, 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 605, 469, 460, 609, 449, 449, 449, 449,
+ 449, 449, 450, 450, 450, 450, 450, 484, 450, 431,
+ 518, 484, 450, 484, 450, 605, 460, 430, 609, 449,
+ 449, 449, 449, 449, 449, 451, 451, 451, 451, 451,
+ 488, 451, 518, 518, 488, 451, 488, 451, 469, 480,
+ 480, 480, 480, 480, 422, 469, 481, 481, 481, 481,
+
+ 481, 421, 494, 610, 670, 450, 494, 494, 494, 494,
+ 469, 487, 487, 487, 487, 487, 499, 499, 499, 499,
+ 499, 500, 500, 500, 500, 500, 610, 670, 451, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+
+ 455, 455, 455, 455, 455, 455, 455, 455, 456, 456,
+ 456, 456, 456, 415, 371, 466, 466, 466, 466, 466,
+ 491, 491, 491, 491, 491, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 602, 602, 602, 602, 456,
+ 456, 456, 456, 456, 456, 501, 501, 501, 501, 501,
+ 506, 519, 370, 368, 506, 509, 506, 491, 367, 509,
+ 466, 509, 456, 456, 456, 456, 456, 456, 466, 361,
+ 519, 520, 359, 491, 519, 527, 520, 354, 520, 527,
+ 491, 527, 466, 471, 471, 471, 471, 471, 352, 471,
+ 523, 523, 523, 523, 523, 512, 512, 512, 512, 512,
+
+ 471, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 604, 604, 604, 604, 471, 471, 471, 471, 471, 471,
+ 524, 524, 524, 524, 524, 948, 348, 948, 615, 512,
+ 530, 530, 530, 530, 530, 615, 471, 471, 471, 471,
+ 471, 471, 471, 474, 474, 474, 474, 474, 512, 534,
+ 615, 606, 512, 347, 534, 606, 534, 474, 345, 330,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 952, 329, 952, 606, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 327, 622,
+ 474, 475, 475, 475, 475, 475, 475, 475, 475, 475,
+ 475, 636, 636, 636, 636, 475, 475, 475, 475, 475,
+ 475, 622, 622, 516, 516, 516, 516, 516, 531, 531,
+ 531, 531, 531, 537, 537, 537, 537, 537, 475, 475,
+ 475, 475, 475, 475, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 516, 975, 634, 975, 476, 476,
+ 476, 476, 476, 476, 538, 538, 538, 538, 538, 539,
+ 326, 652, 634, 539, 571, 539, 516, 516, 571, 634,
+
+ 571, 476, 476, 476, 476, 476, 476, 542, 542, 542,
+ 542, 542, 545, 652, 652, 671, 545, 545, 545, 545,
+ 550, 550, 550, 550, 550, 551, 551, 551, 551, 551,
+ 552, 552, 552, 552, 552, 557, 580, 751, 671, 557,
+ 557, 557, 557, 562, 562, 562, 562, 562, 563, 563,
+ 563, 563, 563, 564, 564, 564, 564, 564, 323, 542,
+ 542, 574, 574, 574, 574, 574, 575, 579, 319, 580,
+ 575, 317, 575, 578, 578, 578, 578, 578, 608, 902,
+ 612, 542, 608, 902, 608, 612, 579, 612, 580, 751,
+ 579, 585, 580, 585, 585, 585, 585, 585, 585, 587,
+
+ 313, 587, 587, 587, 587, 587, 587, 578, 614, 618,
+ 815, 654, 614, 618, 614, 618, 654, 312, 654, 815,
+ 598, 598, 598, 598, 598, 986, 578, 986, 310, 309,
+ 578, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 598, 598, 598, 598, 582, 582, 582, 582, 582,
+ 582, 584, 584, 584, 584, 584, 584, 584, 601, 601,
+ 601, 601, 815, 584, 308, 584, 616, 298, 582, 582,
+ 582, 582, 582, 582, 601, 586, 586, 586, 586, 586,
+ 586, 586, 684, 684, 684, 684, 584, 586, 584, 586,
+ 601, 603, 603, 603, 603, 607, 685, 601, 294, 611,
+
+ 607, 661, 607, 619, 603, 611, 661, 619, 661, 619,
+ 586, 616, 586, 588, 588, 588, 588, 588, 616, 685,
+ 623, 611, 285, 603, 623, 607, 623, 603, 672, 672,
+ 672, 672, 672, 616, 588, 588, 588, 588, 626, 613,
+ 613, 613, 613, 613, 625, 657, 687, 607, 625, 657,
+ 625, 624, 624, 624, 624, 624, 588, 626, 628, 631,
+ 627, 626, 628, 631, 628, 631, 588, 657, 284, 687,
+ 632, 632, 632, 632, 632, 635, 279, 269, 588, 589,
+ 589, 589, 589, 589, 613, 633, 710, 711, 268, 633,
+ 624, 633, 613, 627, 264, 638, 638, 638, 638, 638,
+
+ 589, 589, 589, 589, 624, 632, 613, 638, 263, 710,
+ 711, 635, 627, 624, 589, 231, 627, 640, 640, 640,
+ 640, 640, 1022, 632, 1022, 812, 653, 635, 632, 640,
+ 812, 653, 589, 653, 635, 230, 866, 589, 590, 590,
+ 590, 590, 590, 644, 644, 644, 644, 644, 658, 644,
+ 227, 226, 658, 644, 658, 644, 715, 225, 653, 590,
+ 590, 590, 590, 223, 645, 645, 645, 645, 645, 674,
+ 645, 221, 716, 674, 645, 674, 645, 812, 219, 715,
+ 653, 590, 646, 646, 646, 646, 646, 663, 866, 590,
+ 1026, 590, 1026, 218, 646, 716, 644, 217, 647, 647,
+
+ 647, 647, 647, 590, 647, 1027, 215, 1027, 647, 720,
+ 647, 590, 591, 591, 591, 591, 591, 645, 648, 648,
+ 648, 648, 648, 692, 648, 211, 210, 692, 648, 692,
+ 648, 663, 720, 591, 591, 591, 591, 207, 206, 663,
+ 659, 659, 659, 659, 659, 660, 660, 660, 660, 660,
+ 1047, 647, 1047, 663, 673, 673, 673, 673, 673, 591,
+ 677, 677, 677, 677, 677, 591, 689, 689, 689, 689,
+ 689, 648, 700, 683, 683, 683, 683, 683, 707, 721,
+ 202, 591, 592, 592, 592, 592, 592, 659, 731, 733,
+ 696, 700, 660, 659, 696, 700, 696, 707, 660, 701,
+
+ 197, 707, 721, 592, 592, 592, 592, 196, 192, 659,
+ 683, 731, 733, 191, 660, 690, 690, 690, 690, 690,
+ 691, 691, 691, 691, 691, 190, 683, 695, 695, 695,
+ 695, 695, 701, 683, 592, 592, 699, 699, 699, 699,
+ 699, 706, 706, 706, 706, 706, 712, 712, 712, 712,
+ 712, 701, 1059, 188, 1059, 701, 592, 593, 593, 593,
+ 593, 593, 713, 713, 713, 713, 713, 843, 185, 777,
+ 699, 184, 706, 717, 717, 717, 717, 717, 593, 593,
+ 593, 593, 718, 718, 718, 718, 718, 181, 777, 699,
+ 843, 719, 777, 699, 706, 706, 719, 1060, 719, 1060,
+
+ 790, 593, 722, 722, 722, 722, 722, 958, 790, 180,
+ 593, 723, 723, 723, 723, 723, 958, 729, 729, 729,
+ 729, 729, 790, 593, 594, 594, 594, 594, 594, 730,
+ 730, 730, 730, 735, 735, 735, 735, 735, 736, 736,
+ 736, 736, 736, 175, 173, 594, 594, 594, 594, 737,
+ 737, 737, 737, 737, 738, 738, 738, 738, 166, 958,
+ 775, 844, 594, 743, 743, 743, 743, 743, 153, 729,
+ 729, 744, 744, 744, 744, 744, 775, 594, 745, 745,
+ 745, 745, 745, 775, 844, 594, 595, 595, 595, 595,
+ 595, 729, 746, 144, 142, 854, 746, 856, 746, 749,
+
+ 749, 749, 749, 749, 132, 758, 758, 758, 799, 758,
+ 758, 758, 755, 755, 755, 755, 755, 758, 854, 758,
+ 856, 131, 799, 762, 762, 762, 762, 762, 782, 595,
+ 832, 799, 785, 782, 595, 782, 785, 595, 117, 595,
+ 758, 113, 758, 760, 760, 760, 755, 760, 760, 760,
+ 112, 595, 832, 832, 785, 760, 595, 760, 791, 595,
+ 596, 596, 596, 596, 596, 755, 762, 111, 874, 755,
+ 763, 763, 763, 763, 763, 1077, 762, 1077, 760, 109,
+ 760, 772, 772, 772, 772, 772, 786, 874, 762, 805,
+ 786, 874, 786, 596, 108, 104, 764, 764, 764, 764,
+
+ 764, 789, 791, 596, 102, 763, 789, 805, 789, 596,
+ 791, 596, 805, 596, 98, 97, 596, 765, 765, 765,
+ 765, 765, 781, 763, 791, 596, 793, 781, 763, 781,
+ 793, 596, 793, 596, 597, 597, 597, 597, 597, 764,
+ 93, 827, 766, 766, 766, 766, 766, 764, 91, 764,
+ 827, 1079, 88, 1079, 781, 597, 597, 597, 597, 81,
+ 76, 764, 796, 827, 765, 597, 796, 75, 796, 764,
+ 765, 767, 767, 767, 767, 767, 781, 71, 876, 768,
+ 768, 768, 768, 768, 800, 877, 765, 597, 597, 599,
+ 599, 599, 599, 599, 766, 766, 769, 769, 769, 769,
+
+ 769, 876, 57, 771, 771, 771, 771, 771, 877, 55,
+ 599, 599, 599, 599, 798, 767, 766, 768, 798, 802,
+ 798, 1075, 800, 802, 767, 802, 806, 599, 44, 804,
+ 1075, 41, 768, 804, 771, 804, 800, 767, 39, 769,
+ 768, 829, 599, 1075, 769, 800, 829, 35, 829, 769,
+ 599, 600, 600, 600, 600, 600, 771, 771, 828, 835,
+ 806, 769, 828, 835, 828, 835, 769, 787, 787, 787,
+ 787, 787, 803, 803, 803, 803, 803, 880, 806, 1090,
+ 1098, 1090, 1098, 806, 773, 773, 773, 773, 773, 809,
+ 809, 809, 809, 809, 600, 881, 31, 24, 833, 600,
+
+ 880, 809, 600, 833, 600, 833, 774, 774, 774, 774,
+ 774, 861, 21, 836, 787, 861, 600, 861, 881, 836,
+ 787, 600, 773, 885, 600, 637, 637, 637, 637, 637,
+ 637, 637, 637, 637, 637, 836, 787, 773, 886, 637,
+ 637, 637, 637, 637, 637, 773, 885, 20, 933, 774,
+ 892, 894, 939, 933, 774, 933, 939, 15, 939, 774,
+ 946, 886, 637, 637, 637, 637, 637, 637, 641, 641,
+ 641, 774, 1000, 892, 894, 13, 774, 797, 797, 797,
+ 797, 797, 946, 946, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 3, 1000, 1001, 1039, 641, 641,
+
+ 641, 641, 641, 641, 1100, 0, 1100, 0, 797, 845,
+ 845, 845, 845, 845, 846, 846, 846, 846, 846, 1001,
+ 1039, 641, 641, 641, 641, 641, 641, 643, 643, 643,
+ 797, 797, 850, 850, 850, 850, 850, 858, 858, 858,
+ 858, 858, 0, 643, 643, 643, 643, 643, 643, 643,
+ 643, 643, 643, 0, 1040, 0, 0, 643, 643, 643,
+ 643, 643, 643, 817, 817, 817, 817, 817, 943, 817,
+ 0, 937, 943, 817, 943, 817, 937, 1040, 937, 0,
+ 643, 643, 643, 643, 643, 643, 649, 649, 649, 649,
+ 649, 940, 649, 0, 0, 945, 649, 940, 649, 945,
+
+ 0, 945, 0, 649, 649, 649, 649, 649, 649, 649,
+ 649, 649, 649, 940, 0, 0, 817, 649, 649, 649,
+ 649, 649, 649, 859, 859, 859, 859, 859, 860, 860,
+ 860, 860, 860, 864, 864, 864, 864, 864, 0, 649,
+ 649, 649, 649, 649, 649, 649, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 651, 651, 651, 651, 651,
+ 651, 651, 651, 651, 651, 0, 0, 0, 0, 651,
+ 651, 651, 651, 651, 651, 818, 818, 818, 818, 818,
+ 949, 818, 0, 970, 949, 818, 949, 818, 970, 0,
+ 970, 0, 651, 651, 651, 651, 651, 651, 665, 665,
+ 665, 665, 665, 1045, 665, 878, 878, 878, 878, 878,
+ 879, 879, 879, 879, 879, 665, 665, 665, 665, 665,
+ 665, 665, 665, 665, 665, 1045, 1045, 0, 818, 665,
+
+ 665, 665, 665, 665, 665, 820, 820, 820, 820, 820,
+ 834, 834, 834, 834, 834, 0, 965, 820, 0, 0,
+ 965, 665, 665, 665, 665, 665, 665, 665, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666, 965, 0,
+ 0, 0, 666, 666, 666, 666, 666, 666, 821, 821,
+ 821, 821, 821, 873, 873, 873, 873, 873, 820, 834,
+ 821, 0, 0, 834, 0, 666, 666, 666, 666, 666,
+ 666, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+ 667, 834, 0, 0, 873, 667, 667, 667, 667, 667,
+ 667, 0, 822, 822, 822, 822, 822, 0, 822, 967,
+
+ 0, 821, 822, 967, 822, 967, 873, 873, 667, 667,
+ 667, 667, 667, 667, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 0, 0, 0, 0, 668, 668,
+ 668, 668, 668, 668, 0, 0, 788, 788, 788, 788,
+ 788, 837, 0, 0, 0, 822, 882, 882, 882, 882,
+ 882, 668, 668, 668, 668, 668, 668, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 0, 0, 0,
+ 0, 757, 757, 757, 757, 757, 757, 947, 823, 823,
+ 823, 823, 823, 788, 973, 0, 0, 837, 973, 788,
+ 823, 0, 0, 837, 757, 757, 757, 757, 757, 757,
+
+ 770, 770, 770, 770, 770, 788, 973, 947, 0, 837,
+ 839, 839, 839, 839, 839, 0, 839, 883, 883, 883,
+ 883, 883, 887, 887, 887, 887, 887, 0, 1020, 947,
+ 947, 823, 1020, 770, 888, 888, 888, 888, 888, 896,
+ 896, 896, 896, 896, 897, 897, 897, 897, 897, 770,
+ 1020, 770, 0, 770, 0, 0, 770, 898, 898, 898,
+ 898, 898, 0, 839, 903, 903, 903, 903, 903, 0,
+ 0, 770, 0, 770, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 0, 0, 0, 0, 808, 808,
+ 808, 808, 808, 808, 853, 853, 853, 853, 853, 904,
+
+ 904, 904, 904, 904, 905, 905, 905, 905, 905, 0,
+ 0, 808, 808, 808, 808, 808, 808, 813, 813, 813,
+ 813, 813, 0, 813, 909, 909, 909, 909, 909, 0,
+ 0, 853, 0, 0, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 0, 0, 0, 853, 813, 813,
+ 813, 813, 813, 813, 853, 944, 944, 944, 944, 944,
+ 953, 953, 953, 953, 953, 981, 981, 981, 981, 981,
+ 813, 813, 813, 813, 813, 813, 813, 816, 816, 816,
+ 816, 816, 1041, 972, 1017, 0, 1041, 816, 972, 1017,
+ 972, 1017, 0, 0, 816, 816, 816, 816, 816, 816,
+
+ 816, 816, 816, 816, 1041, 0, 0, 0, 816, 816,
+ 816, 816, 816, 816, 870, 870, 870, 870, 870, 0,
+ 891, 891, 891, 891, 891, 989, 989, 989, 989, 989,
+ 816, 816, 816, 816, 816, 816, 816, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 0, 870, 0,
+ 0, 819, 819, 819, 819, 819, 819, 914, 914, 914,
+ 914, 914, 1023, 0, 0, 955, 1023, 870, 1023, 0,
+ 955, 870, 891, 891, 819, 819, 819, 819, 819, 819,
+ 824, 824, 824, 824, 824, 1002, 1002, 1002, 1002, 1002,
+ 0, 0, 0, 0, 891, 0, 0, 824, 824, 824,
+
+ 824, 824, 824, 824, 824, 824, 824, 0, 0, 0,
+ 914, 824, 824, 824, 824, 824, 824, 955, 1003, 1003,
+ 1003, 1003, 1003, 1013, 1013, 1013, 1013, 1013, 1018, 1018,
+ 1018, 1018, 1018, 0, 824, 824, 824, 824, 824, 824,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 0,
+ 0, 0, 0, 826, 826, 826, 826, 826, 826, 912,
+ 912, 912, 912, 912, 924, 924, 924, 924, 924, 1038,
+ 1088, 0, 0, 1038, 1088, 1038, 826, 826, 826, 826,
+ 826, 826, 840, 840, 840, 840, 840, 840, 840, 840,
+ 840, 840, 1088, 912, 0, 924, 840, 840, 840, 840,
+ 840, 840, 916, 916, 916, 916, 916, 0, 0, 966,
+ 0, 0, 912, 966, 0, 966, 912, 924, 924, 840,
+
+ 840, 840, 840, 840, 840, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 0, 966, 916, 0, 841,
+ 841, 841, 841, 841, 841, 0, 915, 915, 915, 915,
+ 915, 0, 1019, 0, 0, 916, 0, 1019, 966, 1019,
+ 916, 0, 841, 841, 841, 841, 841, 841, 842, 842,
+ 842, 842, 842, 842, 842, 842, 842, 842, 0, 0,
+ 0, 0, 842, 842, 842, 842, 842, 842, 0, 915,
+ 917, 917, 917, 917, 917, 0, 0, 974, 941, 915,
+ 918, 918, 918, 918, 918, 842, 842, 842, 842, 842,
+ 842, 915, 919, 919, 919, 919, 919, 920, 920, 920,
+
+ 920, 920, 0, 0, 921, 921, 921, 921, 921, 1046,
+ 0, 0, 0, 917, 0, 0, 922, 922, 922, 922,
+ 922, 917, 1042, 917, 941, 974, 1042, 918, 1042, 974,
+ 941, 1044, 0, 918, 0, 917, 1044, 0, 1044, 1046,
+ 0, 920, 921, 917, 919, 919, 941, 974, 0, 918,
+ 920, 925, 925, 925, 925, 925, 0, 921, 0, 922,
+ 0, 1046, 1046, 920, 922, 921, 919, 0, 0, 922,
+ 926, 926, 926, 926, 926, 0, 927, 927, 927, 927,
+ 927, 922, 1076, 0, 0, 0, 922, 923, 923, 923,
+ 923, 923, 0, 0, 0, 928, 928, 928, 928, 928,
+
+ 1056, 0, 0, 0, 925, 1056, 0, 1056, 926, 929,
+ 929, 929, 929, 929, 931, 931, 931, 931, 931, 927,
+ 923, 1067, 0, 926, 927, 1076, 1067, 0, 1067, 927,
+ 0, 926, 928, 1071, 1076, 0, 923, 1071, 923, 1071,
+ 923, 927, 0, 923, 0, 0, 927, 1076, 928, 930,
+ 930, 930, 930, 930, 0, 928, 0, 1074, 923, 1085,
+ 923, 1074, 929, 1074, 1085, 0, 1085, 931, 938, 938,
+ 938, 938, 938, 961, 961, 961, 961, 961, 963, 963,
+ 963, 963, 963, 930, 0, 961, 0, 0, 0, 0,
+ 963, 1051, 1051, 1051, 1051, 1051, 0, 971, 971, 971,
+
+ 971, 971, 930, 0, 0, 0, 930, 976, 976, 976,
+ 976, 976, 977, 977, 977, 977, 977, 938, 1087, 0,
+ 1037, 938, 1087, 1021, 1087, 1037, 961, 1037, 971, 0,
+ 0, 963, 1086, 1086, 1086, 1086, 1086, 0, 0, 938,
+ 956, 956, 956, 956, 956, 956, 956, 956, 956, 956,
+ 971, 971, 1037, 0, 956, 956, 956, 956, 956, 956,
+ 976, 0, 0, 0, 0, 977, 978, 978, 978, 978,
+ 978, 1021, 0, 0, 1037, 1021, 0, 956, 956, 956,
+ 956, 956, 956, 959, 959, 959, 959, 959, 959, 959,
+ 959, 959, 959, 1021, 0, 0, 0, 959, 959, 959,
+
+ 959, 959, 959, 983, 983, 983, 983, 983, 984, 984,
+ 984, 984, 984, 1094, 1094, 1094, 1094, 1094, 0, 978,
+ 959, 959, 959, 959, 959, 959, 960, 960, 960, 960,
+ 960, 960, 960, 960, 960, 960, 0, 0, 0, 0,
+ 960, 960, 960, 960, 960, 960, 1095, 0, 0, 0,
+ 0, 1095, 0, 1095, 0, 0, 983, 0, 0, 0,
+ 0, 984, 0, 960, 960, 960, 960, 960, 960, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 964, 964,
+ 964, 964, 964, 964, 964, 964, 964, 964, 0, 0,
+ 0, 0, 964, 964, 964, 964, 964, 964, 982, 982,
+ 982, 982, 982, 985, 985, 985, 985, 985, 992, 992,
+ 992, 992, 992, 0, 0, 964, 964, 964, 964, 964,
+ 964, 993, 993, 993, 993, 993, 994, 994, 994, 994,
+
+ 994, 0, 0, 0, 0, 982, 995, 995, 995, 995,
+ 995, 0, 992, 996, 996, 996, 996, 996, 0, 0,
+ 0, 982, 993, 0, 0, 0, 985, 0, 982, 0,
+ 994, 992, 0, 0, 0, 992, 997, 997, 997, 997,
+ 997, 0, 0, 0, 993, 993, 0, 0, 0, 994,
+ 0, 0, 0, 994, 998, 998, 998, 998, 998, 995,
+ 999, 999, 999, 999, 999, 0, 996, 1004, 1004, 1004,
+ 1004, 1004, 1005, 1005, 1005, 1005, 1005, 1006, 1006, 1006,
+ 1006, 1006, 1007, 1007, 1007, 1007, 1007, 0, 1089, 997,
+ 1008, 1008, 1008, 1008, 1008, 1009, 1009, 1009, 1009, 1009,
+
+ 1010, 1010, 1010, 1010, 1010, 0, 0, 998, 1014, 1014,
+ 1014, 1014, 1014, 999, 1015, 1015, 1015, 1015, 1015, 1004,
+ 1004, 0, 0, 0, 0, 1005, 0, 0, 0, 0,
+ 1006, 0, 0, 0, 0, 1007, 1089, 0, 0, 0,
+ 1089, 1004, 1014, 1008, 0, 0, 0, 0, 1009, 0,
+ 0, 0, 0, 1010, 0, 0, 0, 0, 1089, 0,
+ 0, 1014, 0, 0, 0, 1014, 0, 1015, 1028, 1028,
+ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 0, 0,
+ 0, 0, 1028, 1028, 1028, 1028, 1028, 1028, 1031, 1031,
+ 1031, 1031, 1031, 1048, 1048, 1048, 1048, 1048, 0, 0,
+
+ 1031, 0, 0, 0, 0, 1028, 1028, 1028, 1028, 1028,
+ 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029,
+ 1029, 0, 0, 0, 0, 1029, 1029, 1029, 1029, 1029,
+ 1029, 1032, 1032, 1032, 1032, 1032, 1043, 1043, 1043, 1043,
+ 1043, 1031, 0, 1032, 0, 0, 1048, 0, 1029, 1029,
+ 1029, 1029, 1029, 1029, 1030, 1030, 1030, 1030, 1030, 1030,
+ 1030, 1030, 1030, 1030, 0, 0, 0, 0, 1030, 1030,
+ 1030, 1030, 1030, 1030, 1053, 1053, 1053, 1053, 1053, 0,
+ 1043, 0, 0, 0, 1032, 0, 0, 0, 0, 1043,
+ 0, 1030, 1030, 1030, 1030, 1030, 1030, 1033, 1033, 1033,
+
+ 1033, 1033, 1043, 0, 0, 0, 0, 0, 0, 1033,
+ 0, 0, 0, 0, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 0, 0, 0, 1053, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1052, 1052, 1052, 1052, 1052, 1054,
+ 1054, 1054, 1054, 1054, 0, 0, 0, 0, 0, 0,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1035, 1035, 1035,
+ 1035, 1035, 1035, 1035, 1035, 1035, 1035, 0, 1052, 0,
+ 0, 1035, 1035, 1035, 1035, 1035, 1035, 1055, 1055, 1055,
+ 1055, 1055, 0, 0, 0, 0, 0, 1052, 0, 0,
+ 0, 1052, 1054, 0, 1035, 1035, 1035, 1035, 1035, 1035,
+
+ 1064, 1064, 1064, 1064, 1064, 0, 0, 0, 0, 0,
+ 0, 0, 1064, 1072, 1072, 1072, 1072, 1072, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1055, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 0, 0, 0, 0, 1061, 1061, 1061, 1061, 1061,
+ 1061, 0, 0, 1064, 0, 0, 1073, 1073, 1073, 1073,
+ 1073, 0, 1072, 0, 0, 0, 1072, 0, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1072, 0, 0, 0, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1078, 1078, 1078, 1078, 1078, 0,
+
+ 0, 0, 0, 0, 0, 1073, 0, 0, 0, 1073,
+ 0, 1062, 1062, 1062, 1062, 1062, 1062, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1073, 0, 0,
+ 0, 1063, 1063, 1063, 1063, 1063, 1063, 1101, 1101, 1101,
+ 1101, 1101, 0, 0, 0, 0, 0, 1078, 0, 1101,
+ 0, 0, 0, 0, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
+ 0, 0, 0, 0, 1065, 1065, 1065, 1065, 1065, 1065,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1101, 0, 0, 0, 0, 0, 0, 1065, 1065, 1065,
+
+ 1065, 1065, 1065, 1066, 1066, 1066, 1066, 1066, 1066, 1066,
+ 1066, 1066, 1066, 0, 0, 0, 0, 1066, 1066, 1066,
+ 1066, 1066, 1066, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1080, 1080, 1080, 1080,
+ 1080, 1080, 1080, 1080, 1080, 1080, 0, 0, 0, 0,
+ 1080, 1080, 1080, 1080, 1080, 1080, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1080, 1080, 1080, 1080, 1080, 1080, 1081,
+ 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 0,
+
+ 0, 0, 0, 1081, 1081, 1081, 1081, 1081, 1081, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1081, 1081, 1081, 1081,
+ 1081, 1081, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 0, 0, 0, 0, 1082, 1082, 1082, 1082,
+ 1082, 1082, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 0, 0, 0, 0, 1083,
+ 1083, 1083, 1083, 1083, 1083, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 1084,
+ 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 0, 0,
+ 0, 0, 1084, 1084, 1084, 1084, 1084, 1084, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1084, 1084, 1084, 1084, 1084,
+ 1084, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1091, 0, 0, 0, 0, 1091, 1091, 1091, 1091, 1091,
+ 1091, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1091, 1091,
+
+ 1091, 1091, 1091, 1091, 1092, 1092, 1092, 1092, 1092, 1092,
+ 1092, 1092, 1092, 1092, 0, 0, 0, 0, 1092, 1092,
+ 1092, 1092, 1092, 1092, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1092, 1092, 1092, 1092, 1092, 1092, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 0, 0, 0,
+ 0, 1093, 1093, 1093, 1093, 1093, 1093, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099,
+
+ 0, 0, 0, 0, 1099, 1099, 1099, 1099, 1099, 1099,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1099, 1099, 1099,
+ 1099, 1099, 1099, 1103, 1103, 0, 1103, 1103, 1103, 1103,
+ 1103, 1103, 1104, 1104, 1104, 1104, 1105, 1105, 0, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1106, 0, 0, 1106, 1107,
+ 1107, 0, 1107, 1107, 1108, 1108, 0, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1109, 1109, 1109, 1109, 1109, 1109, 1109,
+ 1109, 1109, 1110, 1110, 0, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
+
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1114,
+ 0, 1114, 1114, 1115, 1115, 0, 1115, 1115, 1115, 1115,
+ 1115, 1115, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116,
+ 1116, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
+ 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1119,
+ 1119, 0, 1119, 1119, 1119, 1119, 1119, 1119, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1121, 1121, 1121,
+ 1121, 1121, 1121, 1121, 1121, 1121, 1122, 1122, 1122, 1122,
+ 1122, 1122, 1122, 1122, 1122, 1123, 1123, 1123, 0, 1123,
+ 1123, 1123, 1123, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+
+ 1124, 1124, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
+ 1127, 1127, 0, 1127, 1127, 1127, 1127, 1127, 1127, 1128,
+ 1128, 0, 1128, 1128, 1128, 1128, 1128, 1128, 1129, 1129,
+ 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1130, 1130, 1130,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1131, 1131, 1131, 1131,
+ 1131, 1131, 1131, 1131, 1131, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, 1133, 1133,
+ 1133, 1133, 1133, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+
+ 1135, 1136, 1136, 0, 0, 1136, 1136, 1136, 1136, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "css.l"
+
+#line 13 "css.l"
+/* Lex source for CSS tokenizing.
+ Taken from http://www.w3.org/TR/CSS21/grammar.html#q2
+ Copyright (C) 2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#define YY_NO_INPUT
+
+#include "css-tokens.h"
+
+#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+ #pragma GCC diagnostic ignored "-Wunknown-pragmas" // clang mourns about the next one
+ #pragma GCC diagnostic ignored "-Wunused-function"
+ #pragma GCC diagnostic ignored "-Wunused-macros"
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
+ #pragma GCC diagnostic ignored "-Wsign-compare"
+ #pragma GCC diagnostic ignored "-Wswitch-default"
+ #pragma GCC diagnostic ignored "-Wunreachable-code" // clang
+ #pragma clang diagnostic ignored "-Wshorten-64-to-32"
+ #ifndef __clang__
+ #pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+ #endif
+#endif
+
+#line 2452 "css.c"
+#line 2453 "css.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in ( void );
+
+void yyset_in ( FILE * _in_str );
+
+FILE *yyget_out ( void );
+
+void yyset_out ( FILE * _out_str );
+
+ int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ {
+#line 112 "css.l"
+
+
+#line 2671 "css.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 1102 );
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 114 "css.l"
+{return S;}
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 116 "css.l"
+{return COMMENT;}
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 117 "css.l"
+/* ignore comments */
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 118 "css.l"
+/* unclosed comment at EOF */
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 120 "css.l"
+{return CDO;}
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 121 "css.l"
+{return CDC;}
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 122 "css.l"
+{return INCLUDES;}
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 123 "css.l"
+{return DASHMATCH;}
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 125 "css.l"
+{return STRING;}
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 126 "css.l"
+{return BAD_STRING;}
+ YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+#line 128 "css.l"
+{return IDENT;}
+ YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+#line 130 "css.l"
+{return HASH;}
+ YY_BREAK
+case 13:
+/* rule 13 can match eol */
+YY_RULE_SETUP
+#line 132 "css.l"
+{return IMPORT_SYM;}
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 133 "css.l"
+{return PAGE_SYM;}
+ YY_BREAK
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+#line 134 "css.l"
+{return MEDIA_SYM;}
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 135 "css.l"
+{return CHARSET_SYM;}
+ YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+#line 137 "css.l"
+{return IMPORTANT_SYM;}
+ YY_BREAK
+case 18:
+/* rule 18 can match eol */
+YY_RULE_SETUP
+#line 139 "css.l"
+{return EMS;}
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 140 "css.l"
+{return EXS;}
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 141 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+#line 142 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 143 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 144 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 145 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 146 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+#line 147 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 27:
+/* rule 27 can match eol */
+YY_RULE_SETUP
+#line 148 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 149 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 150 "css.l"
+{return TIME;}
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 151 "css.l"
+{return TIME;}
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 152 "css.l"
+{return FREQ;}
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 153 "css.l"
+{return FREQ;}
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 154 "css.l"
+{return DIMENSION;}
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 156 "css.l"
+{return PERCENTAGE;}
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 157 "css.l"
+{return NUMBER;}
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 159 "css.l"
+{return URI;}
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 160 "css.l"
+{return URI;}
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 161 "css.l"
+{return BAD_URI;}
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 163 "css.l"
+{return FUNCTION;}
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 165 "css.l"
+{return *yytext;}
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 167 "css.l"
+ECHO;
+ YY_BREAK
+#line 2961 "css.c"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = (yytext_ptr);
+ int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ int yy_is_jam;
+ char *yy_cp = (yy_c_buf_p);
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 1102);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf );
+
+ yyfree( (void *) b );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ *
+ */
+void yyset_lineno (int _line_number )
+{
+
+ yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str )
+{
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str )
+{
+ yyout = _out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug )
+{
+ yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = NULL;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = NULL;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 167 "css.l"
+
+
diff --git a/src/css.l b/src/css.l
new file mode 100644
index 0000000..bae065d
--- /dev/null
+++ b/src/css.l
@@ -0,0 +1,167 @@
+%option case-insensitive
+%option noyywrap
+%option never-interactive
+%option nounput
+
+%top{
+/* config.h must precede flex's inclusion of <stdio.h>
+ in order for its _GNU_SOURCE definition to take effect. */
+#include <config.h>
+}
+
+%{
+/* Lex source for CSS tokenizing.
+ Taken from http://www.w3.org/TR/CSS21/grammar.html#q2
+ Copyright (C) 2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#define YY_NO_INPUT
+
+#include "css-tokens.h"
+
+#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+ #pragma GCC diagnostic ignored "-Wunknown-pragmas" // clang mourns about the next one
+ #pragma GCC diagnostic ignored "-Wunused-function"
+ #pragma GCC diagnostic ignored "-Wunused-macros"
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
+ #pragma GCC diagnostic ignored "-Wsign-compare"
+ #pragma GCC diagnostic ignored "-Wswitch-default"
+ #pragma GCC diagnostic ignored "-Wunreachable-code" // clang
+ #pragma clang diagnostic ignored "-Wshorten-64-to-32"
+ #ifndef __clang__
+ #pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+ #endif
+#endif
+
+%}
+
+h [0-9a-f]
+nonascii [\240-\377]
+unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
+escape {unicode}|\\[^\r\n\f0-9a-f]
+nmstart [_a-z]|{nonascii}|{escape}
+nmchar [_a-z0-9-]|{nonascii}|{escape}
+string1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\"
+string2 \'([^\n\r\f\\']|\\{nl}|{escape})*\'
+badstring1 \"([^\n\r\f\\"]|\\{nl}|{escape})*\\?
+badstring2 \'([^\n\r\f\\']|\\{nl}|{escape})*\\?
+badcomment1 \/\*[^*]*\*+([^/*][^*]*\*+)*
+badcomment2 \/\*[^*]*(\*+[^/*][^*]*)*
+baduri1 url\({w}([!#$%&*-\[\]-~]|{nonascii}|{escape})*{w}
+baduri2 url\({w}{string}{w}
+baduri3 url\({w}{badstring}
+comment \/\*[^*]*\*+([^/*][^*]*\*+)*\/
+ident -?{nmstart}{nmchar}*
+name {nmchar}+
+num [0-9]+|[0-9]*"."[0-9]+
+string {string1}|{string2}
+badstring {badstring1}|{badstring2}
+badcomment {badcomment1}|{badcomment2}
+baduri {baduri1}|{baduri2}|{baduri3}
+url ([!#$%&*-~]|{nonascii}|{escape})*
+s [ \t\r\n\f]+
+w {s}?
+nl \n|\r\n|\r|\f
+
+A a|\\0{0,4}(41|61)(\r\n|[ \t\r\n\f])?
+C c|\\0{0,4}(43|63)(\r\n|[ \t\r\n\f])?
+D d|\\0{0,4}(44|64)(\r\n|[ \t\r\n\f])?
+E e|\\0{0,4}(45|65)(\r\n|[ \t\r\n\f])?
+G g|\\0{0,4}(47|67)(\r\n|[ \t\r\n\f])?|\\g
+H h|\\0{0,4}(48|68)(\r\n|[ \t\r\n\f])?|\\h
+I i|\\0{0,4}(49|69)(\r\n|[ \t\r\n\f])?|\\i
+K k|\\0{0,4}(4b|6b)(\r\n|[ \t\r\n\f])?|\\k
+L l|\\0{0,4}(4c|6c)(\r\n|[ \t\r\n\f])?|\\l
+M m|\\0{0,4}(4d|6d)(\r\n|[ \t\r\n\f])?|\\m
+N n|\\0{0,4}(4e|6e)(\r\n|[ \t\r\n\f])?|\\n
+O o|\\0{0,4}(4f|6f)(\r\n|[ \t\r\n\f])?|\\o
+P p|\\0{0,4}(50|70)(\r\n|[ \t\r\n\f])?|\\p
+R r|\\0{0,4}(52|72)(\r\n|[ \t\r\n\f])?|\\r
+S s|\\0{0,4}(53|73)(\r\n|[ \t\r\n\f])?|\\s
+T t|\\0{0,4}(54|74)(\r\n|[ \t\r\n\f])?|\\t
+U u|\\0{0,4}(55|75)(\r\n|[ \t\r\n\f])?|\\u
+X x|\\0{0,4}(58|78)(\r\n|[ \t\r\n\f])?|\\x
+Z z|\\0{0,4}(5a|7a)(\r\n|[ \t\r\n\f])?|\\z
+
+%%
+
+{s} {return S;}
+
+{comment} {return COMMENT;}
+#\/\*[^*]*\*+([^/*][^*]*\*+)*\/ /* ignore comments */
+{badcomment} /* unclosed comment at EOF */
+
+"<!--" {return CDO;}
+"-->" {return CDC;}
+"~=" {return INCLUDES;}
+"|=" {return DASHMATCH;}
+
+{string} {return STRING;}
+{badstring} {return BAD_STRING;}
+
+{ident} {return IDENT;}
+
+"#"{name} {return HASH;}
+
+@{I}{M}{P}{O}{R}{T} {return IMPORT_SYM;}
+@{P}{A}{G}{E} {return PAGE_SYM;}
+@{M}{E}{D}{I}{A} {return MEDIA_SYM;}
+"@charset " {return CHARSET_SYM;}
+
+"!"({w}|{comment})*{I}{M}{P}{O}{R}{T}{A}{N}{T} {return IMPORTANT_SYM;}
+
+{num}{E}{M} {return EMS;}
+{num}{E}{X} {return EXS;}
+{num}{P}{X} {return LENGTH;}
+{num}{C}{M} {return LENGTH;}
+{num}{M}{M} {return LENGTH;}
+{num}{I}{N} {return LENGTH;}
+{num}{P}{T} {return LENGTH;}
+{num}{P}{C} {return LENGTH;}
+{num}{D}{E}{G} {return ANGLE;}
+{num}{R}{A}{D} {return ANGLE;}
+{num}{G}{R}{A}{D} {return ANGLE;}
+{num}{M}{S} {return TIME;}
+{num}{S} {return TIME;}
+{num}{H}{Z} {return FREQ;}
+{num}{K}{H}{Z} {return FREQ;}
+{num}{ident} {return DIMENSION;}
+
+{num}% {return PERCENTAGE;}
+{num} {return NUMBER;}
+
+"url("{w}{string}{w}")" {return URI;}
+"url("{w}{url}{w}")" {return URI;}
+{baduri} {return BAD_URI;}
+
+{ident}"(" {return FUNCTION;}
+
+. {return *yytext;}
+
+%%
diff --git a/src/css_.c b/src/css_.c
new file mode 100644
index 0000000..76e4bb9
--- /dev/null
+++ b/src/css_.c
@@ -0,0 +1,3933 @@
+#include "wget.h"
+#line 1 "css.c"
+/* config.h must precede flex's inclusion of <stdio.h>
+ in order for its _GNU_SOURCE definition to take effect. */
+#include <config.h>
+
+#line 6 "css.c"
+
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types.
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ * integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+ #define YY_LESS_LINENO(n)
+ #define YY_LINENO_REWIND_TO(ptr)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ *yy_cp = (yy_hold_char); \
+ YY_RESTORE_YY_MORE_OFFSET \
+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+ } \
+ while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr) )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *yy_input_file;
+
+ char *yy_ch_buf; /* input buffer */
+ char *yy_buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ int yy_buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int yy_n_chars;
+
+ /* Whether we "own" the buffer - i.e., we know we created it,
+ * and can realloc() it to grow it, and should free() it to
+ * delete it.
+ */
+ int yy_is_our_buffer;
+
+ /* Whether this is an "interactive" input source; if so, and
+ * if we're using stdio for input, then we want to use getc()
+ * instead of fread(), to make sure we stop fetching input after
+ * each newline.
+ */
+ int yy_is_interactive;
+
+ /* Whether we're considered to be at the beginning of a line.
+ * If so, '^' rules will be active on the next match, otherwise
+ * not.
+ */
+ int yy_at_bol;
+
+ int yy_bs_lineno; /**< The line count. */
+ int yy_bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int yy_fill_buffer;
+
+ int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+ /* When an EOF's been seen but there's still some text to process
+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+ * shouldn't try reading from the input source any more. We might
+ * still have a bunch of tokens to match, though, because of
+ * possible backing-up.
+ *
+ * When we actually see the EOF, we change the status to "new"
+ * (via yyrestart()), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+ : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars; /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0; /* whether we need to initialize */
+static int yy_start = 0; /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
+void yy_delete_buffer ( YY_BUFFER_STATE b );
+void yy_flush_buffer ( YY_BUFFER_STATE b );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
+
+void *yyalloc ( yy_size_t );
+void *yyrealloc ( void *, yy_size_t );
+void yyfree ( void * );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+ }
+#define yy_set_bol(at_bol) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){\
+ yyensure_buffer_stack (); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ yy_create_buffer( yyin, YY_BUF_SIZE ); \
+ } \
+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+ }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define yywrap() (/*CONSTCOND*/1)
+#define YY_SKIP_YYWRAP
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+ (yytext_ptr) = yy_bp; \
+ yyleng = (int) (yy_cp - yy_bp); \
+ (yy_hold_char) = *yy_cp; \
+ *yy_cp = '\0'; \
+ (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 41
+#define YY_END_OF_BUFFER 42
+/* This struct is not used in this scanner,
+ but its presence is necessary. */
+struct yy_trans_info
+ {
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+ };
+static const flex_int16_t yy_accept[1103] =
+ { 0,
+ 0, 0, 42, 40, 1, 1, 40, 10, 40, 10,
+ 40, 40, 40, 35, 40, 40, 11, 11, 40, 40,
+ 40, 1, 0, 0, 0, 0, 10, 9, 10, 12,
+ 0, 0, 10, 10, 0, 11, 0, 35, 4, 34,
+ 0, 0, 35, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 30, 0, 0, 0, 0, 0,
+ 0, 0, 39, 11, 0, 11, 11, 11, 8, 7,
+ 0, 0, 0, 0, 0, 0, 0, 10, 10, 10,
+ 0, 12, 12, 10, 10, 10, 6, 4, 4, 0,
+ 33, 0, 21, 0, 33, 0, 18, 19, 0, 33,
+
+ 0, 31, 0, 23, 0, 33, 0, 22, 29, 0,
+ 25, 24, 20, 0, 33, 0, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 30, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 11, 11, 11,
+ 11, 11, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10, 10, 10, 0, 0, 12, 12, 10,
+ 10, 10, 4, 2, 33, 33, 33, 33, 33, 21,
+ 26, 0, 33, 33, 33, 33, 33, 33, 33, 33,
+ 18, 19, 33, 0, 33, 33, 33, 33, 33, 33,
+
+ 33, 31, 33, 33, 33, 23, 32, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 22, 29, 33,
+ 33, 33, 33, 33, 24, 20, 27, 0, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 30, 33,
+ 33, 5, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 11, 11, 38, 11, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 10, 0, 3, 12, 10, 4, 4, 33,
+
+ 33, 33, 33, 33, 21, 21, 33, 33, 33, 26,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 18,
+ 19, 18, 28, 0, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 31, 31, 33, 33, 33, 23,
+ 23, 33, 33, 33, 32, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 22, 29, 22, 33, 33, 33,
+ 33, 33, 25, 24, 20, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 30, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 25, 33, 33, 33, 30, 30, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 14, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 11, 38,
+ 38, 38, 38, 37, 0, 11, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 10, 0, 0, 12, 10, 33, 33, 33, 33, 21,
+ 21, 21, 21, 33, 33, 33, 26, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 18, 19,
+
+ 18, 18, 18, 19, 19, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 31, 31, 31, 31, 33, 33, 33, 23,
+ 23, 23, 23, 33, 33, 33, 32, 32, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 22,
+ 29, 22, 22, 22, 29, 29, 33, 33, 33, 33,
+ 33, 25, 24, 20, 25, 25, 24, 24, 20, 20,
+ 33, 33, 33, 27, 33, 33, 33, 33, 33, 33,
+ 27, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 30, 33, 33,
+
+ 33, 25, 33, 27, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 11, 38, 38, 38,
+ 38, 38, 38, 38, 38, 0, 38, 37, 38, 38,
+ 11, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 12, 10, 33, 33, 33,
+ 33, 21, 21, 33, 33, 33, 26, 26, 26, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 18, 19,
+ 18, 33, 33, 33, 28, 33, 33, 33, 33, 33,
+
+ 33, 28, 33, 33, 33, 33, 33, 28, 33, 33,
+ 33, 31, 31, 33, 33, 33, 23, 23, 33, 33,
+ 33, 32, 32, 32, 32, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 22, 29, 22, 33, 33, 33,
+ 33, 33, 25, 24, 20, 33, 33, 33, 27, 27,
+ 27, 33, 33, 33, 33, 27, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+ 33, 30, 33, 33, 33, 25, 33, 27, 0, 13,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 14, 0, 0, 0, 0, 11, 38, 36,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 0,
+ 38, 38, 37, 38, 0, 11, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 12,
+ 10, 33, 33, 33, 21, 21, 33, 33, 33, 26,
+ 33, 33, 33, 33, 33, 33, 33, 18, 19, 18,
+ 33, 33, 33, 28, 28, 28, 33, 33, 33, 33,
+ 33, 33, 33, 33, 28, 33, 33, 31, 31, 33,
+ 33, 23, 23, 33, 33, 33, 32, 32, 33, 33,
+ 33, 33, 33, 33, 33, 22, 29, 22, 33, 33,
+
+ 33, 33, 25, 24, 20, 33, 33, 33, 27, 33,
+ 33, 33, 27, 33, 33, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 30, 33, 33, 33, 25, 33,
+ 27, 0, 0, 0, 0, 13, 0, 0, 0, 0,
+ 0, 0, 0, 15, 0, 0, 0, 0, 0, 14,
+ 14, 0, 11, 38, 38, 38, 38, 38, 38, 38,
+ 0, 0, 38, 38, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 33, 21, 21, 33, 33,
+ 26, 33, 18, 19, 18, 33, 33, 33, 28, 33,
+ 33, 33, 33, 33, 28, 31, 31, 23, 23, 33,
+
+ 33, 32, 32, 33, 22, 29, 22, 25, 24, 20,
+ 33, 33, 27, 33, 27, 16, 0, 13, 0, 0,
+ 0, 0, 0, 15, 15, 0, 0, 38, 38, 38,
+ 0, 0, 0, 0, 38, 17, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 26, 33, 33,
+ 28, 33, 32, 32, 27, 0, 13, 13, 0, 0,
+ 38, 38, 38, 0, 0, 38, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 0, 28, 0, 38,
+ 38, 38, 0, 38, 0, 17, 0, 0, 0, 0,
+ 38, 38, 0, 38, 0, 17, 17, 0, 0, 0,
+
+ 0, 0
+ } ;
+
+static const YY_CHAR yy_ec[256] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
+ 1, 4, 5, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 6, 7, 8, 9, 10, 11, 10, 12, 13,
+ 14, 15, 10, 10, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 10, 10, 29,
+ 30, 31, 10, 32, 33, 34, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+ 42, 49, 50, 51, 52, 42, 42, 53, 42, 54,
+ 10, 55, 10, 10, 42, 10, 56, 57, 58, 59,
+
+ 60, 61, 62, 63, 64, 42, 65, 66, 67, 68,
+ 69, 70, 42, 71, 72, 73, 74, 42, 42, 75,
+ 42, 76, 10, 77, 10, 78, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
+ 79, 79, 79, 79, 79
+ } ;
+
+static const YY_CHAR yy_meta[80] =
+ { 0,
+ 1, 2, 3, 3, 3, 2, 2, 4, 2, 2,
+ 2, 4, 5, 2, 2, 6, 2, 7, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 2, 2,
+ 2, 2, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 2, 2, 9
+ } ;
+
+static const flex_int16_t yy_base[1137] =
+ { 0,
+ 0, 0, 4195, 7110, 78, 83, 88, 87, 78, 85,
+ 82, 88, 4161, 142, 4151, 90, 86, 206, 259, 4118,
+ 4083, 98, 234, 4083, 72, 109, 116, 7110, 318, 100,
+ 4082, 361, 208, 420, 4017, 92, 463, 205, 4024, 7110,
+ 3977, 222, 0, 3974, 209, 89, 257, 202, 180, 245,
+ 248, 259, 355, 272, 3955, 524, 3987, 83, 280, 311,
+ 274, 585, 7110, 117, 637, 348, 210, 697, 7110, 7110,
+ 3963, 302, 382, 243, 3940, 3933, 371, 251, 356, 757,
+ 3945, 101, 817, 246, 357, 877, 7110, 3938, 252, 920,
+ 3894, 974, 3886, 1017, 397, 447, 3861, 3860, 661, 376,
+
+ 904, 3850, 721, 3841, 448, 451, 1040, 3840, 3825, 1045,
+ 3813, 3796, 3787, 1063, 569, 600, 3784, 1137, 484, 1180,
+ 613, 1221, 748, 380, 566, 347, 591, 907, 654, 462,
+ 3767, 3789, 118, 559, 779, 633, 593, 588, 628, 782,
+ 654, 3776, 775, 3775, 802, 772, 682, 336, 1279, 345,
+ 447, 1322, 3754, 254, 695, 837, 658, 581, 632, 656,
+ 806, 1012, 456, 862, 1365, 3744, 256, 903, 1408, 278,
+ 964, 1451, 3730, 7110, 3689, 1511, 839, 751, 790, 3655,
+ 3633, 1086, 865, 3648, 3645, 868, 812, 3627, 850, 3599,
+ 3559, 3554, 895, 897, 344, 3587, 3580, 885, 900, 892,
+
+ 922, 3526, 1001, 929, 943, 3484, 3483, 1165, 1002, 3500,
+ 3499, 1037, 1074, 945, 3485, 969, 3476, 3439, 3424, 1096,
+ 3450, 410, 3442, 438, 3403, 3397, 3396, 1109, 1104, 3416,
+ 3396, 745, 1554, 1126, 1597, 1199, 1638, 1237, 1696, 1591,
+ 1451, 1224, 1636, 1495, 1673, 1680, 1762, 1836, 1318, 1740,
+ 1703, 7110, 573, 1049, 1161, 1158, 970, 987, 1131, 1017,
+ 1192, 1245, 3385, 3371, 1046, 1269, 1252, 3369, 3358, 1342,
+ 1600, 1403, 1552, 1788, 1263, 1891, 1796, 1934, 3362, 1868,
+ 1238, 1307, 1248, 3350, 3304, 1055, 1352, 1779, 1931, 1391,
+ 1392, 1393, 1983, 3284, 7110, 2026, 2069, 3253, 347, 892,
+
+ 2112, 1392, 1108, 1110, 1248, 1488, 1500, 3239, 3204, 3174,
+ 1541, 3194, 3177, 2112, 1624, 1119, 3145, 1176, 3142, 1861,
+ 1873, 1878, 3104, 1704, 1607, 3071, 2999, 1394, 2951, 2939,
+ 1979, 1503, 1180, 1209, 1896, 1901, 1669, 1259, 1273, 1936,
+ 1971, 1707, 1278, 1296, 2904, 1691, 2927, 2900, 2022, 1731,
+ 1336, 2867, 1403, 2856, 1994, 2027, 2063, 1753, 2851, 716,
+ 2848, 950, 2068, 2106, 2117, 1786, 2836, 2831, 1793, 2833,
+ 2795, 2150, 2191, 1807, 2234, 2138, 2275, 2156, 2333, 2228,
+ 2237, 2273, 2344, 2358, 2367, 2378, 2449, 2523, 2189, 2433,
+ 2413, 1498, 2121, 2020, 2269, 2451, 1769, 2278, 1797, 2271,
+
+ 1426, 1684, 1625, 2322, 1465, 2311, 2342, 2464, 2148, 2457,
+ 2261, 1528, 2388, 2423, 2759, 1179, 1347, 2149, 2296, 2245,
+ 2683, 2676, 1875, 1831, 2535, 2548, 1910, 2480, 2177, 2645,
+ 2637, 2383, 2555, 7110, 2446, 2468, 2600, 2595, 2508, 2546,
+ 2570, 2561, 2456, 2552, 2533, 2540, 1981, 2561, 2614, 2651,
+ 2674, 741, 457, 7110, 2729, 2807, 2597, 661, 2134, 2596,
+ 2579, 1548, 1591, 2330, 2405, 2814, 2604, 1589, 2641, 97,
+ 2882, 2584, 771, 2942, 3003, 3046, 2605, 1637, 1675, 2688,
+ 2695, 2537, 1235, 2639, 2556, 2555, 2710, 2662, 2543, 2538,
+ 2819, 1925, 2402, 2684, 1849, 2508, 1979, 2507, 2715, 2720,
+
+ 2844, 2463, 1448, 2462, 1598, 2832, 2475, 2463, 2837, 2420,
+ 2412, 2894, 2582, 2374, 2365, 3042, 2023, 2628, 2816, 2853,
+ 2025, 2109, 2889, 2919, 2312, 1614, 2857, 2229, 2270, 2929,
+ 3047, 2262, 1615, 2931, 2423, 2439, 3052, 3083, 3071, 2289,
+ 2269, 3106, 2300, 2407, 3094, 2461, 2233, 2530, 2232, 3119,
+ 3124, 3129, 2191, 1714, 2183, 1734, 3117, 2186, 1033, 2175,
+ 1110, 3142, 3147, 3152, 2135, 1803, 2132, 2181, 2103, 2338,
+ 3076, 2090, 2077, 3160, 3148, 2035, 2003, 3172, 3132, 3134,
+ 0, 3213, 1864, 3230, 3173, 3254, 3181, 3312, 3378, 3437,
+ 3511, 3581, 3656, 3723, 3785, 3859, 3933, 3219, 3988, 4050,
+
+ 3236, 2813, 3269, 2888, 2606, 2901, 3277, 3160, 2608, 2666,
+ 3251, 3162, 3338, 3190, 2881, 3264, 7110, 3191, 3285, 1994,
+ 1985, 2987, 3302, 3350, 3326, 3303, 3358, 3340, 1965, 1964,
+ 3341, 3369, 3367, 3038, 3373, 3009, 4107, 3394, 1039, 3416,
+ 4166, 696, 4225, 3442, 3463, 3481, 3497, 3517, 4285, 4346,
+ 4407, 3059, 3408, 3193, 1957, 1942, 3295, 3430, 3539, 3544,
+ 3283, 2258, 3485, 311, 4467, 4510, 4553, 4596, 590, 2669,
+ 3080, 3327, 3553, 3451, 1920, 1919, 3559, 1876, 2372, 805,
+ 1897, 1896, 3572, 3260, 3261, 1801, 3311, 1794, 3565, 3614,
+ 3619, 3505, 1764, 1751, 3626, 3572, 1712, 1704, 3635, 3537,
+
+ 3597, 0, 842, 1683, 1668, 3640, 3543, 0, 962, 3354,
+ 3355, 3645, 3661, 1143, 3420, 3436, 3672, 3681, 3673, 3477,
+ 3547, 3701, 3710, 1613, 2478, 1302, 1608, 1607, 3716, 3707,
+ 3553, 1605, 3554, 1537, 3732, 3737, 3748, 3732, 1529, 1796,
+ 1502, 1830, 3762, 3770, 3777, 3774, 1498, 1459, 3798, 1394,
+ 3135, 1339, 1384, 1374, 3811, 0, 4639, 3784, 1740, 3822,
+ 2122, 3822, 3869, 3895, 3916, 3941, 3970, 3978, 3995, 4699,
+ 4002, 3880, 4083, 4105, 3722, 0, 3634, 0, 1410, 7110,
+ 3904, 3810, 1349, 1342, 3782, 3868, 4066, 4635, 3883, 3654,
+ 3856, 1427, 3908, 1333, 1308, 3944, 4176, 3996, 3768, 3982,
+
+ 1575, 4001, 4071, 4011, 3853, 4024, 1763, 4756, 4088, 7110,
+ 1487, 3423, 4816, 896, 3208, 4876, 4262, 4444, 4919, 4504,
+ 4547, 4591, 4677, 4979, 5040, 5101, 3896, 4040, 4023, 1274,
+ 1266, 3798, 4080, 4509, 4041, 4065, 4639, 1821, 4709, 5144,
+ 5187, 5230, 3632, 3726, 4208, 4213, 2076, 1260, 1207, 4231,
+ 1176, 1123, 4793, 3760, 1108, 3762, 1099, 4236, 4322, 4327,
+ 4093, 1043, 1038, 4332, 994, 3434, 2212, 1028, 1002, 4913,
+ 992, 951, 4552, 3833, 0, 3946, 3953, 4474, 4479, 4041,
+ 4059, 4645, 4716, 2284, 4091, 4106, 4721, 4733, 929, 840,
+ 4919, 4115, 838, 4116, 837, 4738, 4743, 4756, 811, 2240,
+
+ 777, 3157, 4763, 4798, 4803, 2371, 745, 718, 4823, 658,
+ 646, 5138, 0, 4956, 5225, 5181, 5269, 5279, 5291, 5296,
+ 5303, 5315, 5386, 5143, 5350, 5369, 5375, 5394, 5408, 5448,
+ 5413, 642, 4130, 618, 583, 7110, 4253, 5467, 4134, 4243,
+ 5276, 2587, 4250, 4854, 4277, 4128, 4675, 2903, 4432, 7110,
+ 526, 2948, 4859, 1544, 4963, 5522, 1357, 3705, 5565, 5608,
+ 5472, 5669, 5477, 5730, 4466, 5171, 4581, 508, 493, 4435,
+ 5496, 4865, 4634, 5275, 3053, 5506, 5511, 5565, 478, 449,
+ 4864, 5767, 5602, 5607, 5772, 3203, 451, 445, 4924, 443,
+ 442, 5777, 5790, 5795, 5805, 5812, 5835, 5853, 5859, 4140,
+
+ 4164, 4984, 5017, 5866, 5871, 5876, 5881, 5889, 5894, 5899,
+ 411, 381, 5022, 5907, 5913, 7110, 4866, 5027, 5214, 4678,
+ 5521, 3400, 4944, 7110, 370, 3468, 3483, 5950, 5993, 6036,
+ 5987, 6030, 6096, 0, 6139, 7110, 5502, 5131, 4161, 4218,
+ 4832, 5304, 6035, 5313, 4441, 5307, 3527, 5992, 344, 285,
+ 5490, 6133, 6073, 6138, 6176, 5382, 7110, 296, 3629, 3675,
+ 6213, 6256, 6299, 6199, 6342, 6385, 5403, 237, 230, 7110,
+ 5415, 6212, 6255, 5439, 3976, 5380, 3852, 6293, 3928, 6428,
+ 6471, 6514, 6557, 6600, 5441, 5531, 5500, 5100, 5886, 4057,
+ 6643, 6686, 6729, 5612, 5628, 7110, 133, 4058, 6772, 4181,
+
+ 6336, 7110, 6833, 6837, 6846, 6850, 6855, 6864, 6873, 6882,
+ 6891, 6900, 112, 6904, 6913, 6922, 6931, 6940, 6949, 6958,
+ 6967, 6976, 6984, 6993, 7002, 7011, 7020, 7029, 7038, 7047,
+ 7056, 7065, 7074, 7083, 7092, 7100
+ } ;
+
+static const flex_int16_t yy_def[1137] =
+ { 0,
+ 1102, 1, 1102, 1102, 1102, 1102, 1102, 1103, 1104, 1105,
+ 1106, 1102, 1102, 1102, 1102, 1102, 1107, 1107, 1108, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1103, 1102, 1109, 1104,
+ 1102, 1110, 1105, 1111, 1102, 1107, 1108, 14, 1112, 1102,
+ 1113, 1102, 14, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1107, 1115, 1107, 1107, 1107, 1102, 1102,
+ 1116, 1102, 1102, 1102, 1102, 1102, 1102, 1103, 1103, 1103,
+ 1117, 1104, 1104, 1105, 1105, 1105, 1102, 1112, 1118, 56,
+ 1114, 1119, 1114, 1119, 1114, 94, 1114, 1114, 94, 1114,
+
+ 94, 1114, 94, 1114, 94, 1114, 94, 1114, 1114, 94,
+ 1114, 1114, 1114, 94, 1114, 94, 1114, 1114, 118, 118,
+ 118, 118, 118, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1107, 68, 1107,
+ 1107, 68, 1116, 1120, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1103, 1103, 80, 1117, 1121, 1104, 83, 1105,
+ 1105, 86, 1122, 1102, 1114, 118, 176, 176, 176, 1114,
+ 1114, 94, 176, 176, 176, 176, 176, 176, 176, 176,
+ 1114, 1114, 1114, 94, 176, 176, 176, 1114, 176, 176,
+
+ 176, 1114, 176, 176, 176, 1114, 1114, 94, 176, 176,
+ 176, 1114, 176, 176, 176, 176, 176, 1114, 1114, 176,
+ 176, 176, 176, 176, 1114, 1114, 1114, 94, 176, 176,
+ 176, 1114, 118, 233, 233, 233, 233, 233, 233, 239,
+ 239, 239, 239, 239, 239, 239, 239, 233, 248, 248,
+ 239, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1107, 68, 1123, 68, 1124, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 80, 1125, 1102, 83, 86, 1122, 1126, 1114,
+
+ 176, 301, 301, 301, 301, 301, 176, 176, 176, 1114,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 1114, 94, 176, 176, 176, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 176, 176, 176, 1114, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 301, 301, 301, 301, 301, 176, 176, 176, 301, 301,
+ 301, 301, 233, 373, 373, 373, 373, 373, 373, 379,
+ 379, 379, 379, 379, 379, 379, 379, 373, 388, 388,
+ 379, 1114, 1114, 1114, 1114, 373, 1114, 1114, 1114, 1114,
+
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 373, 1114, 1114, 373, 1114, 1114, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 276, 1123,
+ 1123, 1127, 1128, 1102, 1102, 276, 1129, 1130, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1131, 1132, 1133, 1102, 86, 301, 476, 476, 476, 476,
+ 476, 1114, 1114, 301, 301, 301, 301, 476, 476, 476,
+ 476, 1114, 1114, 476, 476, 476, 476, 476, 476, 476,
+
+ 476, 1114, 1114, 1114, 1114, 176, 176, 176, 301, 301,
+ 301, 301, 476, 476, 476, 476, 1114, 1114, 476, 476,
+ 476, 476, 476, 476, 1114, 1114, 476, 476, 476, 476,
+ 476, 1114, 1114, 301, 301, 301, 301, 301, 476, 476,
+ 476, 476, 1114, 1114, 476, 476, 476, 476, 476, 476,
+ 476, 476, 1114, 1114, 1114, 1114, 476, 476, 476, 476,
+ 476, 476, 476, 476, 1114, 1114, 1114, 1114, 1114, 1114,
+ 301, 301, 301, 301, 476, 476, 476, 476, 1114, 1114,
+ 476, 373, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 582, 582, 582, 590, 590, 582, 582, 582, 590,
+
+ 582, 582, 582, 582, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 276, 1102, 1127, 1102,
+ 1134, 1128, 1135, 1123, 1123, 1102, 1123, 1123, 1123, 1102,
+ 456, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1131, 474, 475, 476, 668, 668,
+ 668, 668, 668, 476, 476, 476, 476, 1114, 1114, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 301, 301, 301, 301, 476, 476, 476, 476, 1114,
+
+ 1114, 476, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 476, 476,
+ 476, 476, 476, 1114, 1114, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 668, 476, 476, 476, 476, 1114,
+ 1114, 668, 668, 668, 668, 668, 582, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 276, 1102, 1102,
+ 1127, 1127, 1127, 1128, 1128, 1128, 1123, 1123, 649, 1136,
+ 1136, 1123, 1136, 649, 1102, 651, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1131, 474,
+ 475, 668, 842, 842, 842, 842, 668, 668, 668, 668,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+ 476, 476, 476, 476, 1114, 1114, 668, 668, 668, 668,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+ 842, 842, 842, 668, 668, 668, 668, 668, 842, 842,
+ 842, 842, 842, 842, 842, 842, 842, 842, 842, 842,
+
+ 842, 842, 842, 842, 842, 668, 668, 668, 668, 842,
+ 842, 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 1114, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 826, 1127, 1127, 813, 1128, 1128, 816, 649,
+ 1136, 1102, 1136, 824, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1114, 1114, 1114, 842, 842,
+ 842, 1114, 1114, 1114, 1114, 668, 668, 668, 668, 842,
+ 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 842,
+
+ 842, 842, 842, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+ 842, 842, 842, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 813, 816, 649,
+ 1136, 1136, 1136, 962, 824, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1114, 842, 842,
+ 842, 1114, 1114, 1114, 1114, 1102, 1102, 1102, 1102, 1102,
+ 813, 816, 649, 1136, 1033, 824, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1114, 1102, 813,
+ 816, 649, 1033, 824, 1102, 1102, 1102, 1102, 1102, 1102,
+ 813, 816, 1033, 1082, 1102, 1102, 1102, 1102, 1033, 1102,
+
+ 1136, 0, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static const flex_int16_t yy_nxt[7190] =
+ { 0,
+ 4, 5, 6, 5, 5, 5, 7, 8, 9, 4,
+ 4, 10, 4, 4, 4, 11, 12, 13, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 15, 4,
+ 4, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 18, 17, 17, 19, 17, 17, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
+ 17, 17, 17, 18, 17, 17, 20, 21, 17, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
+ 23, 23, 23, 23, 28, 31, 28, 35, 63, 22,
+
+ 22, 22, 22, 22, 63, 24, 38, 38, 38, 38,
+ 38, 38, 38, 38, 38, 38, 72, 1102, 1102, 75,
+ 44, 76, 133, 28, 58, 95, 73, 74, 25, 63,
+ 59, 75, 32, 76, 60, 1096, 37, 61, 72, 34,
+ 65, 29, 26, 96, 62, 133, 65, 58, 95, 77,
+ 253, 25, 40, 59, 32, 32, 60, 41, 42, 61,
+ 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+ 29, 65, 77, 253, 44, 44, 45, 46, 47, 44,
+ 48, 49, 50, 44, 51, 44, 52, 44, 44, 53,
+ 54, 55, 44, 44, 44, 44, 56, 44, 44, 45,
+
+ 46, 47, 44, 48, 49, 50, 51, 44, 52, 44,
+ 44, 53, 54, 55, 44, 44, 44, 44, 63, 28,
+ 44, 1102, 63, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 102, 103, 23, 23, 23, 23, 23,
+ 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+ 100, 24, 1086, 93, 66, 102, 101, 28, 28, 1086,
+ 65, 161, 34, 94, 65, 75, 89, 76, 154, 174,
+ 167, 280, 100, 295, 25, 93, 66, 68, 68, 68,
+ 68, 68, 68, 68, 68, 68, 68, 106, 26, 28,
+ 104, 68, 68, 68, 68, 68, 68, 25, 1057, 105,
+
+ 34, 97, 107, 108, 115, 29, 138, 1078, 109, 98,
+ 106, 99, 104, 110, 68, 68, 68, 68, 68, 68,
+ 27, 27, 79, 97, 134, 108, 116, 115, 139, 138,
+ 109, 98, 34, 158, 135, 159, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 80, 134, 136, 63, 155,
+ 80, 80, 80, 80, 80, 80, 156, 277, 27, 33,
+ 63, 299, 328, 28, 174, 137, 1078, 329, 28, 330,
+ 136, 155, 1024, 80, 80, 80, 80, 80, 80, 83,
+ 83, 83, 83, 83, 83, 83, 83, 83, 83, 111,
+ 65, 150, 104, 83, 83, 83, 83, 83, 83, 65,
+
+ 157, 105, 65, 1055, 158, 112, 159, 113, 193, 114,
+ 29, 34, 111, 150, 104, 72, 83, 83, 83, 83,
+ 83, 83, 33, 33, 85, 73, 160, 112, 100, 113,
+ 194, 193, 364, 1055, 101, 181, 365, 72, 86, 86,
+ 86, 86, 86, 86, 86, 86, 86, 86, 160, 67,
+ 100, 182, 86, 86, 86, 86, 86, 86, 181, 63,
+ 364, 1052, 1052, 28, 365, 183, 203, 1051, 640, 184,
+ 204, 185, 205, 1051, 1048, 86, 86, 86, 86, 86,
+ 86, 68, 68, 68, 68, 68, 68, 68, 68, 68,
+ 68, 175, 175, 206, 115, 68, 68, 68, 68, 68,
+
+ 68, 65, 234, 1048, 207, 208, 234, 234, 234, 234,
+ 29, 643, 1043, 175, 175, 206, 116, 115, 68, 68,
+ 68, 68, 68, 68, 117, 117, 207, 1043, 950, 117,
+ 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
+ 117, 117, 118, 119, 119, 119, 120, 121, 122, 123,
+ 119, 119, 117, 117, 117, 117, 119, 119, 119, 119,
+ 119, 119, 124, 125, 126, 117, 127, 117, 128, 117,
+ 117, 129, 130, 131, 117, 117, 117, 117, 117, 119,
+ 119, 119, 119, 119, 119, 124, 125, 126, 127, 117,
+ 128, 117, 117, 129, 130, 131, 117, 117, 117, 117,
+
+ 117, 117, 117, 140, 227, 1018, 254, 141, 142, 143,
+ 144, 262, 843, 255, 844, 263, 288, 264, 229, 102,
+ 103, 417, 230, 228, 231, 145, 265, 227, 254, 146,
+ 106, 247, 147, 248, 249, 234, 234, 234, 234, 288,
+ 1018, 102, 266, 417, 175, 107, 267, 1016, 145, 265,
+ 268, 146, 269, 106, 147, 149, 149, 149, 149, 149,
+ 149, 149, 149, 149, 149, 1014, 175, 289, 260, 149,
+ 149, 149, 149, 149, 149, 458, 287, 1014, 280, 186,
+ 158, 271, 159, 187, 188, 189, 190, 261, 111, 272,
+ 289, 260, 149, 149, 149, 149, 149, 149, 67, 67,
+
+ 67, 151, 67, 155, 112, 191, 113, 640, 114, 63,
+ 156, 111, 272, 192, 138, 152, 152, 152, 152, 152,
+ 152, 152, 152, 152, 152, 155, 112, 191, 113, 152,
+ 152, 152, 152, 152, 152, 192, 139, 138, 563, 199,
+ 1013, 281, 564, 176, 200, 176, 201, 117, 640, 282,
+ 643, 65, 152, 152, 152, 152, 152, 152, 163, 78,
+ 78, 164, 163, 281, 28, 175, 247, 1013, 248, 249,
+ 234, 234, 234, 234, 202, 165, 165, 165, 165, 165,
+ 165, 165, 165, 165, 165, 473, 305, 175, 295, 165,
+ 165, 165, 165, 165, 165, 641, 202, 256, 1008, 92,
+
+ 270, 257, 271, 258, 141, 142, 143, 144, 136, 305,
+ 274, 29, 165, 165, 165, 165, 165, 165, 82, 82,
+ 82, 168, 82, 259, 290, 306, 137, 851, 75, 852,
+ 76, 136, 1008, 274, 1102, 169, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 259, 134, 320, 306, 169,
+ 169, 169, 169, 169, 169, 283, 135, 302, 1006, 1006,
+ 284, 303, 285, 304, 78, 871, 1004, 872, 134, 28,
+ 320, 32, 169, 169, 169, 169, 169, 169, 170, 84,
+ 84, 171, 170, 311, 286, 322, 315, 312, 28, 313,
+ 316, 317, 318, 319, 175, 172, 172, 172, 172, 172,
+
+ 172, 172, 172, 172, 172, 82, 286, 640, 322, 172,
+ 172, 172, 172, 172, 172, 325, 29, 193, 332, 326,
+ 1102, 327, 195, 333, 335, 334, 176, 196, 176, 197,
+ 323, 34, 172, 172, 172, 172, 172, 172, 119, 194,
+ 193, 175, 119, 119, 119, 119, 92, 335, 175, 324,
+ 643, 108, 198, 323, 336, 1004, 109, 32, 117, 117,
+ 117, 110, 117, 175, 117, 340, 84, 117, 117, 117,
+ 175, 993, 563, 108, 198, 28, 564, 336, 109, 341,
+ 355, 117, 117, 117, 117, 876, 117, 877, 340, 117,
+ 117, 117, 176, 176, 176, 176, 176, 176, 176, 176,
+
+ 176, 176, 341, 355, 357, 425, 176, 176, 176, 176,
+ 176, 176, 993, 291, 291, 291, 292, 291, 34, 337,
+ 346, 992, 426, 338, 347, 339, 348, 357, 425, 176,
+ 176, 176, 176, 176, 176, 177, 176, 176, 176, 178,
+ 176, 179, 176, 176, 176, 426, 640, 992, 92, 176,
+ 176, 176, 176, 176, 176, 744, 72, 427, 209, 745,
+ 989, 180, 210, 213, 211, 989, 73, 214, 215, 216,
+ 217, 428, 176, 176, 176, 176, 176, 176, 72, 212,
+ 427, 220, 434, 180, 175, 221, 222, 223, 224, 218,
+ 207, 208, 350, 641, 219, 418, 351, 352, 353, 354,
+
+ 435, 281, 212, 419, 307, 434, 175, 175, 308, 282,
+ 309, 218, 207, 225, 358, 226, 219, 418, 359, 360,
+ 361, 362, 369, 281, 310, 984, 370, 366, 371, 175,
+ 175, 367, 744, 368, 984, 225, 745, 226, 117, 117,
+ 117, 232, 117, 480, 374, 481, 982, 310, 374, 374,
+ 374, 374, 175, 175, 499, 233, 234, 234, 234, 235,
+ 236, 237, 238, 234, 234, 880, 480, 881, 481, 234,
+ 234, 234, 234, 234, 234, 175, 424, 499, 254, 420,
+ 257, 415, 258, 342, 421, 255, 422, 176, 343, 176,
+ 344, 92, 234, 234, 234, 234, 234, 234, 234, 982,
+
+ 254, 239, 240, 241, 234, 242, 243, 244, 423, 175,
+ 429, 501, 523, 245, 430, 246, 431, 387, 345, 388,
+ 389, 374, 374, 374, 374, 399, 399, 399, 400, 399,
+ 423, 175, 981, 92, 501, 523, 245, 482, 246, 234,
+ 345, 524, 239, 240, 241, 234, 242, 243, 244, 482,
+ 482, 482, 483, 482, 250, 387, 251, 388, 389, 374,
+ 374, 374, 374, 432, 524, 148, 465, 263, 91, 264,
+ 440, 284, 100, 285, 268, 63, 269, 250, 101, 251,
+ 148, 148, 148, 275, 148, 981, 459, 436, 971, 92,
+ 91, 437, 460, 438, 100, 530, 971, 276, 276, 276,
+
+ 276, 276, 276, 276, 276, 276, 276, 439, 459, 531,
+ 537, 276, 276, 276, 276, 276, 276, 65, 530, 415,
+ 415, 415, 416, 415, 889, 461, 890, 944, 538, 462,
+ 439, 463, 531, 537, 276, 276, 276, 276, 276, 276,
+ 278, 278, 278, 278, 278, 278, 278, 278, 278, 278,
+ 374, 538, 944, 464, 278, 278, 278, 278, 278, 278,
+ 442, 910, 938, 911, 141, 142, 143, 144, 640, 938,
+ 467, 550, 92, 374, 158, 464, 159, 278, 278, 278,
+ 278, 278, 278, 293, 293, 293, 293, 293, 293, 293,
+ 293, 293, 293, 912, 550, 291, 605, 293, 293, 293,
+
+ 293, 293, 293, 912, 445, 445, 445, 446, 445, 470,
+ 477, 643, 513, 75, 478, 76, 479, 514, 605, 515,
+ 293, 293, 293, 293, 293, 293, 296, 296, 296, 296,
+ 296, 296, 296, 296, 296, 296, 72, 72, 552, 136,
+ 296, 296, 296, 296, 296, 296, 73, 73, 92, 257,
+ 502, 258, 397, 397, 397, 398, 397, 137, 72, 72,
+ 932, 552, 136, 296, 296, 296, 296, 296, 296, 297,
+ 297, 297, 297, 297, 297, 297, 297, 297, 297, 102,
+ 103, 909, 932, 297, 297, 297, 297, 297, 297, 482,
+ 482, 482, 483, 482, 640, 97, 403, 403, 403, 404,
+
+ 403, 102, 92, 98, 106, 99, 297, 297, 297, 297,
+ 297, 297, 175, 175, 175, 300, 175, 97, 484, 107,
+ 909, 520, 485, 903, 486, 98, 521, 106, 522, 301,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 91,
+ 104, 641, 93, 301, 301, 301, 301, 301, 301, 105,
+ 903, 640, 94, 447, 447, 447, 448, 447, 897, 488,
+ 115, 91, 104, 489, 93, 490, 301, 301, 301, 301,
+ 301, 301, 373, 374, 374, 374, 375, 376, 377, 378,
+ 374, 374, 116, 115, 138, 659, 374, 374, 374, 374,
+ 374, 374, 394, 394, 394, 395, 394, 263, 641, 264,
+
+ 504, 443, 443, 443, 444, 443, 139, 138, 659, 374,
+ 374, 374, 374, 374, 374, 374, 525, 532, 379, 380,
+ 381, 374, 382, 383, 384, 509, 897, 396, 660, 510,
+ 385, 511, 386, 891, 891, 91, 155, 401, 401, 401,
+ 402, 401, 494, 156, 134, 96, 495, 496, 497, 498,
+ 396, 660, 92, 385, 135, 386, 374, 91, 155, 379,
+ 380, 381, 374, 382, 383, 384, 134, 92, 92, 92,
+ 104, 390, 672, 391, 405, 405, 405, 406, 405, 105,
+ 91, 407, 407, 407, 408, 407, 401, 527, 873, 102,
+ 103, 528, 104, 529, 390, 672, 391, 392, 392, 392,
+
+ 393, 392, 91, 873, 407, 407, 407, 408, 407, 539,
+ 673, 102, 106, 540, 374, 541, 553, 91, 374, 374,
+ 374, 374, 506, 870, 108, 534, 507, 107, 508, 109,
+ 535, 870, 536, 673, 110, 106, 555, 102, 103, 91,
+ 93, 405, 405, 405, 406, 405, 108, 108, 175, 545,
+ 94, 109, 109, 546, 547, 548, 549, 110, 923, 102,
+ 924, 925, 93, 409, 409, 409, 410, 409, 92, 108,
+ 175, 557, 374, 864, 109, 558, 559, 560, 561, 106,
+ 468, 468, 468, 469, 468, 268, 864, 269, 92, 445,
+ 445, 445, 446, 445, 107, 374, 411, 450, 450, 450,
+
+ 450, 450, 106, 452, 571, 565, 91, 453, 572, 454,
+ 573, 575, 112, 97, 113, 576, 114, 577, 904, 411,
+ 859, 98, 905, 99, 136, 583, 155, 859, 91, 583,
+ 583, 583, 583, 156, 112, 97, 113, 412, 412, 412,
+ 413, 412, 137, 98, 284, 100, 285, 136, 155, 614,
+ 455, 101, 904, 257, 374, 258, 905, 92, 374, 374,
+ 374, 374, 502, 502, 502, 503, 502, 100, 414, 23,
+ 23, 23, 23, 23, 504, 504, 504, 505, 504, 502,
+ 502, 502, 503, 502, 689, 24, 757, 757, 757, 757,
+ 116, 414, 148, 148, 148, 275, 148, 525, 525, 525,
+
+ 526, 525, 525, 525, 525, 526, 525, 689, 25, 449,
+ 449, 449, 449, 449, 449, 449, 449, 449, 449, 853,
+ 853, 418, 26, 449, 449, 449, 449, 449, 449, 419,
+ 92, 25, 468, 468, 468, 469, 468, 532, 532, 532,
+ 533, 532, 617, 418, 850, 850, 449, 449, 449, 449,
+ 449, 449, 456, 456, 456, 456, 456, 456, 456, 456,
+ 456, 456, 834, 181, 618, 617, 456, 456, 456, 456,
+ 456, 456, 532, 532, 532, 533, 532, 834, 155, 182,
+ 517, 517, 517, 518, 517, 156, 181, 803, 803, 456,
+ 456, 456, 456, 456, 456, 553, 553, 553, 554, 553,
+
+ 155, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 471, 519, 797, 138, 691, 471, 471, 471, 471, 471,
+ 471, 797, 755, 543, 543, 543, 544, 543, 555, 555,
+ 555, 556, 555, 194, 519, 139, 138, 691, 471, 471,
+ 471, 471, 471, 471, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 755, 193, 95, 712, 474, 474,
+ 474, 474, 474, 474, 553, 553, 553, 554, 553, 565,
+ 565, 565, 566, 565, 96, 207, 208, 194, 193, 95,
+ 712, 474, 474, 474, 474, 474, 474, 475, 475, 475,
+ 475, 475, 475, 475, 475, 475, 475, 207, 979, 749,
+
+ 980, 475, 475, 475, 475, 475, 475, 567, 567, 567,
+ 568, 567, 749, 492, 492, 492, 493, 492, 569, 569,
+ 569, 570, 569, 392, 475, 475, 475, 475, 475, 475,
+ 476, 476, 476, 476, 476, 476, 476, 476, 476, 476,
+ 923, 713, 924, 925, 476, 476, 476, 476, 476, 476,
+ 181, 579, 579, 579, 580, 579, 596, 92, 597, 598,
+ 583, 583, 583, 583, 713, 93, 182, 476, 476, 476,
+ 476, 476, 476, 181, 596, 94, 597, 598, 583, 583,
+ 583, 583, 111, 567, 652, 581, 92, 93, 653, 92,
+ 415, 415, 415, 416, 415, 623, 743, 606, 112, 430,
+
+ 113, 431, 114, 607, 228, 111, 652, 743, 581, 582,
+ 583, 583, 583, 584, 585, 586, 587, 583, 583, 606,
+ 112, 583, 113, 583, 583, 583, 583, 583, 583, 394,
+ 394, 394, 395, 394, 990, 92, 991, 92, 397, 397,
+ 397, 398, 397, 92, 583, 92, 583, 583, 583, 583,
+ 583, 583, 583, 736, 736, 588, 589, 590, 583, 591,
+ 592, 593, 1009, 612, 601, 717, 1010, 594, 421, 595,
+ 422, 394, 91, 399, 399, 399, 399, 400, 399, 583,
+ 397, 97, 96, 583, 583, 583, 583, 601, 717, 98,
+ 594, 99, 595, 583, 91, 729, 588, 589, 590, 583,
+
+ 591, 592, 593, 97, 281, 95, 718, 1000, 599, 1001,
+ 600, 98, 282, 405, 608, 729, 92, 91, 609, 100,
+ 610, 100, 97, 96, 403, 101, 281, 101, 95, 718,
+ 98, 599, 99, 600, 392, 392, 392, 393, 392, 91,
+ 569, 100, 611, 100, 97, 401, 401, 401, 402, 401,
+ 106, 583, 98, 207, 208, 583, 583, 583, 583, 403,
+ 403, 403, 404, 403, 611, 107, 92, 104, 405, 405,
+ 405, 406, 405, 106, 678, 207, 105, 93, 459, 407,
+ 407, 407, 408, 407, 460, 706, 108, 94, 91, 104,
+ 412, 109, 92, 1011, 706, 1012, 110, 102, 103, 93,
+
+ 459, 625, 91, 104, 492, 263, 106, 264, 108, 543,
+ 91, 91, 105, 109, 407, 407, 407, 408, 407, 102,
+ 115, 107, 108, 661, 91, 104, 92, 109, 284, 106,
+ 285, 699, 110, 91, 405, 405, 405, 406, 405, 699,
+ 181, 583, 116, 115, 108, 583, 583, 583, 583, 109,
+ 409, 409, 409, 410, 409, 722, 182, 108, 604, 409,
+ 207, 208, 109, 181, 628, 583, 407, 110, 629, 583,
+ 630, 723, 106, 583, 583, 583, 583, 228, 722, 108,
+ 724, 604, 207, 602, 109, 695, 631, 107, 583, 181,
+ 437, 111, 438, 91, 723, 106, 735, 695, 619, 112,
+
+ 134, 113, 620, 114, 621, 182, 602, 112, 108, 113,
+ 135, 114, 181, 109, 111, 91, 92, 92, 110, 735,
+ 622, 112, 134, 113, 412, 412, 412, 413, 412, 112,
+ 108, 113, 92, 690, 690, 109, 615, 615, 615, 616,
+ 615, 583, 445, 622, 434, 583, 583, 583, 583, 615,
+ 615, 615, 616, 615, 443, 603, 626, 626, 626, 627,
+ 626, 683, 435, 447, 633, 737, 683, 434, 268, 136,
+ 269, 634, 634, 634, 635, 634, 136, 116, 603, 636,
+ 677, 677, 254, 141, 142, 143, 144, 137, 737, 255,
+ 260, 92, 136, 138, 137, 254, 134, 658, 473, 136,
+
+ 703, 462, 255, 463, 254, 704, 135, 705, 265, 261,
+ 421, 458, 422, 260, 654, 139, 138, 254, 134, 655,
+ 632, 656, 664, 669, 266, 632, 158, 670, 159, 671,
+ 517, 265, 637, 637, 637, 637, 637, 637, 637, 637,
+ 637, 637, 779, 468, 657, 787, 637, 637, 637, 637,
+ 637, 637, 450, 450, 450, 450, 450, 674, 452, 624,
+ 193, 675, 453, 676, 454, 779, 657, 624, 787, 637,
+ 637, 637, 637, 637, 637, 638, 638, 638, 638, 638,
+ 680, 1102, 194, 193, 681, 1102, 682, 454, 155, 482,
+ 482, 482, 483, 482, 613, 156, 482, 482, 482, 483,
+
+ 482, 613, 684, 788, 845, 455, 685, 686, 687, 688,
+ 155, 678, 678, 678, 679, 678, 502, 502, 502, 503,
+ 502, 504, 504, 504, 505, 504, 788, 845, 455, 644,
+ 645, 646, 646, 646, 645, 647, 644, 647, 647, 647,
+ 644, 644, 648, 647, 647, 647, 647, 649, 649, 649,
+ 649, 649, 649, 649, 649, 649, 649, 647, 647, 647,
+ 647, 649, 649, 649, 649, 649, 649, 647, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 650, 649, 649, 649, 649, 649, 649,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+
+ 647, 647, 647, 647, 647, 647, 647, 647, 67, 67,
+ 67, 151, 67, 92, 578, 662, 662, 662, 663, 662,
+ 492, 492, 492, 493, 492, 651, 651, 651, 651, 651,
+ 651, 651, 651, 651, 651, 757, 757, 757, 757, 651,
+ 651, 651, 651, 651, 651, 502, 502, 502, 503, 502,
+ 692, 708, 578, 574, 693, 696, 694, 181, 574, 697,
+ 281, 698, 651, 651, 651, 651, 651, 651, 282, 562,
+ 324, 709, 562, 182, 708, 714, 710, 551, 711, 715,
+ 181, 716, 281, 163, 78, 78, 164, 163, 551, 28,
+ 525, 525, 525, 526, 525, 700, 700, 700, 701, 700,
+
+ 665, 665, 665, 665, 665, 665, 665, 665, 665, 665,
+ 757, 757, 757, 757, 665, 665, 665, 665, 665, 665,
+ 525, 525, 525, 526, 525, 430, 542, 431, 254, 702,
+ 532, 532, 532, 533, 532, 255, 29, 665, 665, 665,
+ 665, 665, 665, 82, 82, 82, 168, 82, 324, 719,
+ 254, 780, 702, 542, 720, 781, 721, 30, 92, 516,
+ 666, 666, 666, 666, 666, 666, 666, 666, 666, 666,
+ 437, 516, 438, 780, 666, 666, 666, 666, 666, 666,
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 32, 666, 666, 666,
+
+ 666, 666, 666, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 30, 30, 30, 30, 30, 30, 512, 617,
+ 30, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+ 667, 141, 142, 143, 144, 667, 667, 667, 667, 667,
+ 667, 618, 617, 517, 517, 517, 518, 517, 532, 532,
+ 532, 533, 532, 724, 724, 724, 725, 724, 667, 667,
+ 667, 667, 667, 667, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 707, 462, 265, 463, 668, 668,
+ 668, 668, 668, 668, 724, 724, 724, 725, 724, 726,
+ 512, 827, 266, 727, 746, 728, 194, 707, 747, 265,
+
+ 748, 668, 668, 668, 668, 668, 668, 543, 543, 543,
+ 544, 543, 730, 828, 827, 846, 731, 732, 733, 734,
+ 553, 553, 553, 554, 553, 555, 555, 555, 556, 555,
+ 553, 553, 553, 554, 553, 738, 579, 750, 846, 739,
+ 740, 741, 742, 565, 565, 565, 566, 565, 567, 567,
+ 567, 568, 567, 569, 569, 569, 570, 569, 92, 207,
+ 208, 750, 750, 750, 751, 750, 752, 227, 500, 227,
+ 753, 500, 754, 579, 579, 579, 580, 579, 786, 1009,
+ 789, 207, 609, 1010, 610, 421, 228, 422, 228, 92,
+ 227, 770, 227, 771, 772, 757, 757, 757, 757, 770,
+
+ 491, 771, 772, 757, 757, 757, 757, 756, 792, 793,
+ 642, 833, 257, 794, 258, 795, 655, 491, 656, 640,
+ 415, 415, 415, 416, 415, 1049, 228, 1050, 92, 487,
+ 756, 757, 757, 757, 757, 758, 759, 760, 761, 757,
+ 757, 757, 757, 757, 757, 757, 757, 757, 757, 757,
+ 757, 762, 763, 764, 757, 765, 766, 767, 757, 757,
+ 757, 757, 643, 768, 487, 769, 615, 299, 757, 757,
+ 757, 757, 757, 757, 181, 762, 763, 764, 757, 765,
+ 766, 767, 854, 855, 856, 857, 768, 773, 769, 774,
+ 182, 757, 757, 757, 757, 782, 858, 181, 473, 606,
+
+ 783, 838, 784, 796, 778, 607, 284, 620, 285, 621,
+ 773, 254, 774, 392, 392, 392, 393, 392, 255, 858,
+ 798, 606, 466, 228, 430, 785, 431, 778, 482, 482,
+ 482, 483, 482, 254, 757, 757, 757, 757, 260, 790,
+ 790, 790, 791, 790, 801, 652, 860, 785, 263, 653,
+ 264, 799, 799, 799, 800, 799, 93, 261, 802, 804,
+ 626, 260, 629, 437, 630, 438, 94, 652, 466, 860,
+ 805, 805, 805, 806, 805, 634, 458, 441, 93, 394,
+ 394, 394, 395, 394, 418, 807, 878, 879, 441, 268,
+ 427, 269, 419, 260, 433, 638, 638, 638, 638, 638,
+
+ 757, 757, 757, 757, 428, 434, 418, 454, 433, 878,
+ 879, 265, 261, 427, 775, 372, 260, 809, 809, 809,
+ 809, 809, 609, 435, 610, 639, 829, 266, 434, 810,
+ 640, 830, 96, 831, 265, 372, 865, 775, 397, 397,
+ 397, 398, 397, 638, 638, 638, 638, 638, 835, 1102,
+ 92, 92, 462, 1102, 463, 454, 882, 92, 832, 757,
+ 757, 757, 757, 363, 638, 638, 638, 638, 638, 847,
+ 1102, 363, 883, 848, 1102, 849, 454, 641, 92, 882,
+ 832, 97, 646, 646, 646, 646, 646, 662, 92, 98,
+ 620, 99, 621, 92, 454, 883, 455, 356, 638, 638,
+
+ 638, 638, 638, 97, 1102, 629, 356, 630, 1102, 887,
+ 454, 98, 399, 399, 399, 400, 399, 455, 638, 638,
+ 638, 638, 638, 861, 1102, 349, 349, 862, 1102, 863,
+ 454, 281, 887, 757, 757, 757, 757, 92, 92, 282,
+ 836, 836, 836, 837, 836, 836, 836, 836, 837, 836,
+ 655, 455, 656, 281, 482, 482, 482, 483, 482, 100,
+ 678, 678, 678, 679, 678, 101, 502, 502, 502, 503,
+ 502, 455, 323, 492, 492, 492, 493, 492, 875, 888,
+ 92, 100, 401, 401, 401, 402, 401, 459, 896, 898,
+ 867, 324, 459, 460, 868, 323, 869, 324, 460, 700,
+
+ 331, 875, 888, 757, 757, 757, 757, 331, 92, 459,
+ 181, 896, 898, 92, 459, 504, 504, 504, 505, 504,
+ 502, 502, 502, 503, 502, 321, 182, 865, 865, 865,
+ 866, 865, 323, 181, 102, 103, 700, 700, 700, 701,
+ 700, 517, 517, 517, 518, 517, 525, 525, 525, 526,
+ 525, 324, 783, 321, 784, 323, 102, 403, 403, 403,
+ 404, 403, 525, 525, 525, 526, 525, 977, 314, 931,
+ 708, 314, 874, 532, 532, 532, 533, 532, 757, 757,
+ 757, 757, 532, 532, 532, 533, 532, 92, 228, 324,
+ 977, 884, 931, 708, 194, 874, 885, 794, 886, 795,
+
+ 418, 104, 724, 724, 724, 725, 724, 814, 419, 92,
+ 105, 724, 724, 724, 725, 724, 640, 543, 543, 543,
+ 544, 543, 418, 104, 405, 405, 405, 406, 405, 892,
+ 893, 894, 895, 553, 553, 553, 554, 553, 555, 555,
+ 555, 556, 555, 92, 299, 757, 757, 757, 757, 553,
+ 553, 553, 554, 553, 899, 900, 901, 902, 167, 643,
+ 181, 978, 106, 565, 565, 565, 566, 565, 154, 207,
+ 208, 567, 567, 567, 568, 567, 182, 107, 569, 569,
+ 569, 570, 569, 181, 978, 106, 407, 407, 407, 408,
+ 407, 207, 906, 273, 273, 983, 907, 985, 908, 750,
+
+ 750, 750, 751, 750, 252, 915, 916, 917, 427, 918,
+ 919, 920, 579, 579, 579, 580, 579, 921, 983, 922,
+ 985, 92, 428, 392, 392, 392, 393, 392, 937, 108,
+ 827, 427, 780, 783, 109, 784, 781, 91, 92, 110,
+ 921, 92, 922, 915, 916, 917, 913, 918, 919, 920,
+ 92, 108, 828, 827, 780, 926, 109, 927, 790, 91,
+ 409, 409, 409, 410, 409, 228, 93, 92, 995, 913,
+ 394, 394, 394, 395, 394, 830, 94, 831, 926, 92,
+ 927, 415, 415, 415, 416, 415, 939, 324, 93, 434,
+ 609, 995, 610, 776, 92, 92, 397, 397, 397, 398,
+
+ 397, 942, 418, 91, 92, 928, 421, 435, 422, 112,
+ 419, 113, 434, 114, 92, 92, 776, 399, 399, 399,
+ 400, 399, 933, 96, 418, 91, 943, 934, 928, 935,
+ 794, 112, 795, 113, 412, 412, 412, 413, 412, 97,
+ 92, 965, 401, 401, 401, 402, 401, 98, 92, 99,
+ 966, 934, 89, 935, 936, 757, 757, 757, 757, 167,
+ 162, 97, 945, 965, 100, 777, 620, 162, 621, 98,
+ 101, 403, 403, 403, 404, 403, 936, 154, 996, 405,
+ 405, 405, 406, 405, 799, 997, 100, 116, 777, 405,
+ 405, 405, 406, 405, 102, 103, 407, 407, 407, 408,
+
+ 407, 996, 132, 412, 412, 412, 413, 412, 997, 92,
+ 757, 757, 757, 757, 948, 104, 102, 106, 430, 949,
+ 431, 965, 427, 629, 105, 630, 805, 106, 92, 952,
+ 966, 90, 107, 437, 930, 438, 428, 104, 89, 108,
+ 106, 970, 107, 965, 109, 427, 830, 87, 831, 110,
+ 106, 407, 407, 407, 408, 407, 116, 930, 967, 975,
+ 434, 108, 968, 462, 969, 463, 109, 940, 940, 940,
+ 941, 940, 950, 950, 950, 951, 950, 998, 435, 968,
+ 1039, 969, 1040, 434, 405, 405, 405, 406, 405, 809,
+ 809, 809, 809, 809, 108, 999, 81, 71, 972, 109,
+
+ 998, 810, 91, 655, 110, 656, 407, 407, 407, 408,
+ 407, 986, 70, 459, 606, 987, 108, 988, 999, 460,
+ 607, 109, 106, 1002, 91, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 808, 459, 606, 107, 1003, 808,
+ 808, 808, 808, 808, 808, 106, 1002, 69, 1017, 108,
+ 1005, 1007, 1022, 934, 109, 935, 609, 57, 610, 110,
+ 617, 1003, 808, 808, 808, 808, 808, 808, 639, 639,
+ 812, 108, 1053, 1005, 1007, 39, 109, 946, 946, 946,
+ 947, 946, 618, 617, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 1102, 1053, 1054, 1072, 813, 813,
+
+ 813, 813, 813, 813, 1068, 1102, 1069, 1102, 617, 482,
+ 482, 482, 483, 482, 482, 482, 482, 483, 482, 1054,
+ 1072, 813, 813, 813, 813, 813, 813, 642, 642, 815,
+ 618, 617, 678, 678, 678, 679, 678, 502, 502, 502,
+ 503, 502, 1102, 816, 816, 816, 816, 816, 816, 816,
+ 816, 816, 816, 1102, 1073, 1102, 1102, 816, 816, 816,
+ 816, 816, 816, 638, 638, 638, 638, 638, 1023, 1102,
+ 1102, 1019, 794, 1102, 795, 454, 783, 1073, 784, 1102,
+ 816, 816, 816, 816, 816, 816, 817, 817, 817, 818,
+ 817, 606, 1102, 1102, 1102, 1026, 1102, 607, 454, 620,
+
+ 1102, 621, 1102, 819, 819, 819, 819, 819, 819, 819,
+ 819, 819, 819, 606, 1102, 1102, 455, 819, 819, 819,
+ 819, 819, 819, 504, 504, 504, 505, 504, 502, 502,
+ 502, 503, 502, 865, 865, 865, 866, 865, 1102, 455,
+ 819, 819, 819, 819, 819, 819, 820, 821, 638, 638,
+ 638, 821, 822, 820, 822, 822, 822, 820, 820, 823,
+ 822, 822, 822, 822, 824, 824, 824, 824, 824, 824,
+ 824, 824, 824, 824, 822, 822, 822, 822, 824, 824,
+ 824, 824, 824, 824, 822, 822, 822, 822, 822, 822,
+ 822, 822, 822, 822, 822, 822, 822, 822, 822, 822,
+
+ 825, 824, 824, 824, 824, 824, 824, 822, 822, 822,
+ 822, 822, 822, 822, 822, 822, 822, 822, 822, 822,
+ 822, 822, 822, 822, 822, 826, 826, 826, 826, 826,
+ 826, 826, 826, 826, 826, 1102, 1102, 1102, 1102, 826,
+ 826, 826, 826, 826, 826, 638, 817, 638, 638, 638,
+ 1027, 1102, 1102, 1044, 629, 1102, 630, 454, 830, 1102,
+ 831, 1102, 826, 826, 826, 826, 826, 826, 163, 78,
+ 78, 164, 163, 827, 28, 525, 525, 525, 526, 525,
+ 525, 525, 525, 526, 525, 839, 839, 839, 839, 839,
+ 839, 839, 839, 839, 839, 828, 827, 1102, 455, 839,
+
+ 839, 839, 839, 839, 839, 646, 646, 646, 646, 646,
+ 973, 973, 973, 974, 973, 1102, 1036, 454, 1102, 1102,
+ 1037, 29, 839, 839, 839, 839, 839, 839, 840, 840,
+ 840, 840, 840, 840, 840, 840, 840, 840, 1036, 1102,
+ 1102, 1102, 840, 840, 840, 840, 840, 840, 638, 638,
+ 638, 638, 638, 517, 517, 517, 518, 517, 962, 652,
+ 454, 1102, 1102, 653, 1102, 840, 840, 840, 840, 840,
+ 840, 841, 841, 841, 841, 841, 841, 841, 841, 841,
+ 841, 652, 1102, 1102, 994, 841, 841, 841, 841, 841,
+ 841, 1102, 638, 638, 638, 638, 638, 1102, 1102, 1042,
+
+ 1102, 962, 1102, 968, 454, 969, 194, 994, 841, 841,
+ 841, 841, 841, 841, 842, 842, 842, 842, 842, 842,
+ 842, 842, 842, 842, 1102, 1102, 1102, 1102, 842, 842,
+ 842, 842, 842, 842, 1102, 1102, 940, 940, 940, 941,
+ 940, 836, 1102, 1102, 1102, 455, 532, 532, 532, 533,
+ 532, 842, 842, 842, 842, 842, 842, 914, 914, 914,
+ 914, 914, 914, 914, 914, 914, 914, 1102, 1102, 1102,
+ 1102, 914, 914, 914, 914, 914, 914, 946, 646, 646,
+ 646, 646, 646, 606, 652, 1102, 1102, 459, 653, 607,
+ 454, 1102, 1102, 460, 914, 914, 914, 914, 914, 914,
+
+ 409, 409, 409, 410, 409, 606, 652, 617, 1102, 459,
+ 163, 78, 78, 164, 163, 1102, 28, 532, 532, 532,
+ 533, 532, 724, 724, 724, 725, 724, 1102, 780, 618,
+ 617, 962, 781, 929, 724, 724, 724, 725, 724, 553,
+ 553, 553, 554, 553, 555, 555, 555, 556, 555, 112,
+ 780, 113, 1102, 114, 1102, 1102, 929, 553, 553, 553,
+ 554, 553, 1102, 29, 565, 565, 565, 566, 565, 1102,
+ 1102, 112, 1102, 113, 953, 953, 953, 953, 953, 953,
+ 953, 953, 953, 953, 1102, 1102, 1102, 1102, 953, 953,
+ 953, 953, 953, 953, 492, 492, 492, 493, 492, 567,
+
+ 567, 567, 568, 567, 569, 569, 569, 570, 569, 1102,
+ 1102, 953, 953, 953, 953, 953, 953, 954, 811, 811,
+ 955, 954, 1102, 640, 750, 750, 750, 751, 750, 1102,
+ 1102, 181, 1102, 1102, 956, 956, 956, 956, 956, 956,
+ 956, 956, 956, 956, 1102, 1102, 1102, 182, 956, 956,
+ 956, 956, 956, 956, 181, 1024, 1024, 1024, 1025, 1024,
+ 148, 148, 148, 275, 148, 678, 678, 678, 679, 678,
+ 641, 956, 956, 956, 956, 956, 956, 957, 814, 814,
+ 958, 957, 1036, 1047, 1056, 1102, 1037, 640, 655, 934,
+ 656, 935, 1102, 1102, 959, 959, 959, 959, 959, 959,
+
+ 959, 959, 959, 959, 1036, 1102, 1102, 1102, 959, 959,
+ 959, 959, 959, 959, 700, 700, 700, 701, 700, 1102,
+ 543, 543, 543, 544, 543, 865, 865, 865, 866, 865,
+ 643, 959, 959, 959, 959, 959, 959, 960, 960, 960,
+ 960, 960, 960, 960, 960, 960, 960, 1102, 875, 1102,
+ 1102, 960, 960, 960, 960, 960, 960, 117, 117, 117,
+ 232, 117, 1060, 1102, 1102, 811, 794, 324, 795, 1102,
+ 640, 875, 207, 208, 960, 960, 960, 960, 960, 960,
+ 821, 821, 821, 963, 821, 724, 724, 724, 725, 724,
+ 1102, 1102, 1102, 1102, 207, 1102, 1102, 964, 964, 964,
+
+ 964, 964, 964, 964, 964, 964, 964, 1102, 1102, 1102,
+ 92, 964, 964, 964, 964, 964, 964, 641, 724, 724,
+ 724, 725, 724, 750, 750, 750, 751, 750, 1057, 1057,
+ 1057, 1058, 1057, 1102, 964, 964, 964, 964, 964, 964,
+ 644, 645, 646, 646, 646, 645, 647, 644, 647, 647,
+ 647, 644, 644, 648, 647, 647, 647, 647, 649, 649,
+ 649, 649, 649, 649, 649, 649, 649, 649, 647, 647,
+ 647, 647, 649, 649, 649, 649, 649, 649, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 647, 650, 649, 649, 649, 649, 649,
+
+ 649, 647, 647, 647, 647, 647, 647, 647, 647, 647,
+ 647, 647, 647, 647, 647, 647, 647, 647, 647, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64, 64, 1102,
+ 1102, 1102, 1102, 64, 64, 64, 64, 64, 64, 579,
+ 579, 579, 580, 579, 412, 412, 412, 413, 412, 1071,
+ 1036, 1102, 1102, 1039, 1037, 1040, 64, 64, 64, 64,
+ 64, 64, 30, 30, 30, 30, 30, 30, 30, 30,
+ 30, 30, 1036, 1015, 1102, 115, 30, 30, 30, 30,
+ 30, 30, 394, 394, 394, 395, 394, 1102, 1102, 1038,
+ 1102, 1102, 228, 1039, 1102, 1040, 1015, 116, 115, 30,
+
+ 30, 30, 30, 30, 30, 33, 33, 33, 33, 33,
+ 33, 33, 33, 33, 33, 1102, 1041, 95, 1102, 33,
+ 33, 33, 33, 33, 33, 1102, 392, 392, 392, 393,
+ 392, 1102, 1059, 1102, 1102, 96, 1102, 783, 1041, 784,
+ 95, 1102, 33, 33, 33, 33, 33, 33, 976, 976,
+ 976, 976, 976, 976, 976, 976, 976, 976, 1102, 1102,
+ 1102, 1102, 976, 976, 976, 976, 976, 976, 1102, 93,
+ 397, 397, 397, 398, 397, 1102, 1102, 973, 940, 94,
+ 399, 399, 399, 400, 399, 976, 976, 976, 976, 976,
+ 976, 93, 401, 401, 401, 402, 401, 403, 403, 403,
+
+ 404, 403, 1102, 1102, 405, 405, 405, 406, 405, 1045,
+ 1102, 1102, 1102, 97, 1102, 1102, 407, 407, 407, 408,
+ 407, 98, 1074, 99, 606, 652, 968, 100, 969, 653,
+ 607, 1077, 1102, 101, 1102, 97, 830, 1102, 831, 827,
+ 1102, 104, 106, 98, 102, 103, 606, 652, 1102, 100,
+ 105, 415, 415, 415, 416, 415, 1102, 107, 1102, 108,
+ 1102, 828, 827, 104, 109, 106, 102, 1102, 1102, 110,
+ 405, 405, 405, 406, 405, 1102, 407, 407, 407, 408,
+ 407, 108, 1075, 1102, 1102, 1102, 109, 409, 409, 409,
+ 410, 409, 1102, 1102, 1102, 117, 117, 117, 232, 117,
+
+ 1079, 1102, 1102, 1102, 92, 934, 1102, 935, 106, 117,
+ 117, 117, 232, 117, 117, 117, 117, 232, 117, 108,
+ 111, 1085, 1102, 107, 109, 965, 1068, 1102, 1069, 110,
+ 1102, 106, 181, 1087, 966, 1102, 112, 1039, 113, 1040,
+ 114, 108, 1102, 111, 1102, 1102, 109, 965, 182, 117,
+ 117, 117, 232, 117, 1102, 181, 1102, 1090, 112, 1095,
+ 113, 968, 92, 969, 1068, 1102, 1069, 92, 1020, 1020,
+ 1020, 1021, 1020, 646, 646, 646, 646, 646, 638, 821,
+ 638, 638, 638, 227, 1102, 454, 1102, 1102, 1102, 1102,
+ 454, 865, 865, 865, 866, 865, 1102, 1045, 1045, 1045,
+
+ 1046, 1045, 228, 1102, 1102, 1102, 227, 175, 175, 175,
+ 300, 175, 482, 482, 482, 483, 482, 780, 1098, 1102,
+ 1067, 781, 1039, 1020, 1040, 1068, 962, 1069, 827, 1102,
+ 1102, 962, 1096, 1096, 1096, 1097, 1096, 1102, 1102, 780,
+ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028,
+ 828, 827, 1070, 1102, 1028, 1028, 1028, 1028, 1028, 1028,
+ 92, 1102, 1102, 1102, 1102, 92, 482, 482, 482, 483,
+ 482, 780, 1102, 1102, 1070, 781, 1102, 1028, 1028, 1028,
+ 1028, 1028, 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029,
+ 1029, 1029, 1029, 780, 1102, 1102, 1102, 1029, 1029, 1029,
+
+ 1029, 1029, 1029, 502, 502, 502, 503, 502, 504, 504,
+ 504, 505, 504, 821, 821, 821, 963, 821, 1102, 92,
+ 1029, 1029, 1029, 1029, 1029, 1029, 1030, 1030, 1030, 1030,
+ 1030, 1030, 1030, 1030, 1030, 1030, 1102, 1102, 1102, 1102,
+ 1030, 1030, 1030, 1030, 1030, 1030, 1100, 1102, 1102, 1102,
+ 1102, 1068, 1102, 1069, 1102, 1102, 92, 1102, 1102, 1102,
+ 1102, 92, 1102, 1030, 1030, 1030, 1030, 1030, 1030, 820,
+ 1031, 646, 646, 646, 1031, 1032, 820, 1032, 1032, 1032,
+ 820, 820, 823, 1032, 1032, 1032, 1032, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1032, 1032, 1032,
+
+ 1032, 1033, 1033, 1033, 1033, 1033, 1033, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1034, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032,
+ 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1032, 1035, 1035,
+ 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1035, 1102, 1102,
+ 1102, 1102, 1035, 1035, 1035, 1035, 1035, 1035, 492, 492,
+ 492, 493, 492, 502, 502, 502, 503, 502, 700, 700,
+ 700, 701, 700, 1102, 1102, 1035, 1035, 1035, 1035, 1035,
+ 1035, 517, 517, 517, 518, 517, 175, 175, 175, 300,
+
+ 175, 1102, 1102, 1102, 1102, 181, 175, 175, 175, 300,
+ 175, 1102, 995, 525, 525, 525, 526, 525, 1102, 1102,
+ 1102, 182, 193, 1102, 1102, 1102, 92, 1102, 181, 1102,
+ 323, 324, 1102, 1102, 1102, 995, 525, 525, 525, 526,
+ 525, 1102, 1102, 1102, 194, 193, 1102, 1102, 1102, 324,
+ 1102, 1102, 1102, 323, 532, 532, 532, 533, 532, 92,
+ 532, 532, 532, 533, 532, 1102, 92, 543, 543, 543,
+ 544, 543, 553, 553, 553, 554, 553, 555, 555, 555,
+ 556, 555, 553, 553, 553, 554, 553, 1102, 1088, 92,
+ 565, 565, 565, 566, 565, 567, 567, 567, 568, 567,
+
+ 569, 569, 569, 570, 569, 1102, 1102, 92, 579, 579,
+ 579, 580, 579, 92, 175, 175, 175, 300, 175, 207,
+ 208, 1102, 1102, 1102, 1102, 92, 1102, 1102, 1102, 1102,
+ 92, 1102, 1102, 1102, 1102, 92, 1036, 1102, 1102, 1102,
+ 1037, 207, 227, 92, 1102, 1102, 1102, 1102, 92, 1102,
+ 1102, 1102, 1102, 92, 1102, 1102, 1102, 1102, 1036, 1102,
+ 1102, 228, 1102, 1102, 1102, 227, 1102, 92, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1102, 1102,
+ 1102, 1102, 1061, 1061, 1061, 1061, 1061, 1061, 646, 646,
+ 646, 646, 646, 678, 678, 678, 679, 678, 1102, 1102,
+
+ 454, 1102, 1102, 1102, 1102, 1061, 1061, 1061, 1061, 1061,
+ 1061, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1102, 1102, 1102, 1102, 1062, 1062, 1062, 1062, 1062,
+ 1062, 646, 646, 646, 646, 646, 1075, 1075, 1075, 1076,
+ 1075, 962, 1102, 454, 1102, 1102, 92, 1102, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1102, 1102, 1102, 1102, 1063, 1063,
+ 1063, 1063, 1063, 1063, 724, 724, 724, 725, 724, 1102,
+ 965, 1102, 1102, 1102, 962, 1102, 1102, 1102, 1102, 966,
+ 1102, 1063, 1063, 1063, 1063, 1063, 1063, 1031, 1031, 1031,
+
+ 1064, 1031, 965, 1102, 1102, 1102, 1102, 1102, 1102, 454,
+ 1102, 1102, 1102, 1102, 1065, 1065, 1065, 1065, 1065, 1065,
+ 1065, 1065, 1065, 1065, 1102, 1102, 1102, 92, 1065, 1065,
+ 1065, 1065, 1065, 1065, 700, 700, 700, 701, 700, 724,
+ 724, 724, 725, 724, 1102, 1102, 1102, 1102, 1102, 1102,
+ 962, 1065, 1065, 1065, 1065, 1065, 1065, 1066, 1066, 1066,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1102, 323, 1102,
+ 1102, 1066, 1066, 1066, 1066, 1066, 1066, 750, 750, 750,
+ 751, 750, 1102, 1102, 1102, 1102, 1102, 324, 1102, 1102,
+ 1102, 323, 92, 1102, 1066, 1066, 1066, 1066, 1066, 1066,
+
+ 646, 1031, 646, 646, 646, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 454, 1088, 1088, 1088, 1089, 1088, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 92, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080, 1080,
+ 1080, 1102, 1102, 1102, 1102, 1080, 1080, 1080, 1080, 1080,
+ 1080, 1102, 1102, 962, 1102, 1102, 1088, 1088, 1088, 1089,
+ 1088, 1102, 1036, 1102, 1102, 1102, 1037, 1102, 1080, 1080,
+ 1080, 1080, 1080, 1080, 1081, 1081, 1081, 1081, 1081, 1081,
+ 1081, 1081, 1081, 1081, 1036, 1102, 1102, 1102, 1081, 1081,
+ 1081, 1081, 1081, 1081, 865, 865, 865, 866, 865, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1036, 1102, 1102, 1102, 1037,
+ 1102, 1081, 1081, 1081, 1081, 1081, 1081, 1082, 1082, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1036, 1102, 1102,
+ 1102, 1082, 1082, 1082, 1082, 1082, 1082, 1031, 1031, 1031,
+ 1064, 1031, 1102, 1102, 1102, 1102, 1102, 92, 1102, 454,
+ 1102, 1102, 1102, 1102, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1102, 1102, 1102, 1102, 1083, 1083, 1083, 1083, 1083, 1083,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 962, 1102, 1102, 1102, 1102, 1102, 1102, 1083, 1083, 1083,
+
+ 1083, 1083, 1083, 1084, 1084, 1084, 1084, 1084, 1084, 1084,
+ 1084, 1084, 1084, 1102, 1102, 1102, 1102, 1084, 1084, 1084,
+ 1084, 1084, 1084, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1084, 1084, 1084, 1084, 1084, 1084, 1091, 1091, 1091, 1091,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1102, 1102, 1102, 1102,
+ 1091, 1091, 1091, 1091, 1091, 1091, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1091, 1091, 1091, 1091, 1091, 1091, 1092,
+ 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1092, 1102,
+
+ 1102, 1102, 1102, 1092, 1092, 1092, 1092, 1092, 1092, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1092, 1092, 1092, 1092,
+ 1092, 1092, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 1102, 1102, 1102, 1102, 451, 451, 451, 451,
+ 451, 451, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 451,
+ 451, 451, 451, 451, 451, 1093, 1093, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1102, 1102, 1102, 1102, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1102, 1102, 1102, 1102, 1102,
+
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1094,
+ 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1094, 1102, 1102,
+ 1102, 1102, 1094, 1094, 1094, 1094, 1094, 1094, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1094, 1094, 1094, 1094, 1094,
+ 1094, 639, 639, 639, 639, 639, 639, 639, 639, 639,
+ 639, 1102, 1102, 1102, 1102, 639, 639, 639, 639, 639,
+ 639, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 639, 639,
+
+ 639, 639, 639, 639, 642, 642, 642, 642, 642, 642,
+ 642, 642, 642, 642, 1102, 1102, 1102, 1102, 642, 642,
+ 642, 642, 642, 642, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 642, 642, 642, 642, 642, 642, 1099, 1099, 1099,
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1102, 1102, 1102,
+ 1102, 1099, 1099, 1099, 1099, 1099, 1099, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1099, 1099, 1099, 1099, 1099, 1099,
+ 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101, 1101,
+
+ 1102, 1102, 1102, 1102, 1101, 1101, 1101, 1101, 1101, 1101,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1101, 1101, 1101,
+ 1101, 1101, 1101, 27, 27, 1102, 27, 27, 27, 27,
+ 27, 27, 30, 30, 30, 30, 33, 33, 1102, 33,
+ 33, 33, 33, 33, 33, 36, 1102, 1102, 36, 64,
+ 64, 1102, 64, 64, 67, 67, 1102, 67, 67, 67,
+ 67, 67, 67, 78, 78, 78, 78, 78, 78, 78,
+ 78, 78, 82, 82, 1102, 82, 82, 82, 82, 82,
+ 82, 84, 84, 84, 84, 84, 84, 84, 84, 84,
+
+ 88, 88, 88, 88, 88, 88, 88, 88, 88, 91,
+ 1102, 91, 91, 148, 148, 1102, 148, 148, 148, 148,
+ 148, 148, 153, 153, 153, 153, 153, 153, 153, 153,
+ 153, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 173, 173, 173, 173, 173, 173, 173, 173, 173, 175,
+ 175, 1102, 175, 175, 175, 175, 175, 175, 279, 279,
+ 279, 279, 279, 279, 279, 279, 279, 294, 294, 294,
+ 294, 294, 294, 294, 294, 294, 298, 298, 298, 298,
+ 298, 298, 298, 298, 298, 451, 451, 451, 1102, 451,
+ 451, 451, 451, 457, 457, 457, 457, 457, 457, 457,
+
+ 457, 457, 472, 472, 472, 472, 472, 472, 472, 472,
+ 472, 173, 173, 173, 173, 173, 173, 173, 173, 173,
+ 639, 639, 1102, 639, 639, 639, 639, 639, 639, 642,
+ 642, 1102, 642, 642, 642, 642, 642, 642, 457, 457,
+ 457, 457, 457, 457, 457, 457, 457, 279, 279, 279,
+ 279, 279, 279, 279, 279, 279, 27, 27, 27, 27,
+ 27, 27, 27, 27, 27, 472, 472, 472, 472, 472,
+ 472, 472, 472, 472, 294, 294, 294, 294, 294, 294,
+ 294, 294, 294, 811, 811, 811, 811, 811, 811, 811,
+ 811, 811, 814, 814, 814, 814, 814, 814, 814, 814,
+
+ 814, 961, 961, 1102, 1102, 961, 961, 961, 961, 3,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static const flex_int16_t yy_chk[7190] =
+ { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 5,
+ 5, 5, 5, 5, 6, 6, 6, 6, 6, 7,
+ 7, 7, 7, 7, 8, 9, 10, 11, 17, 22,
+
+ 22, 22, 22, 22, 36, 7, 12, 12, 12, 12,
+ 12, 12, 12, 12, 12, 12, 25, 30, 82, 470,
+ 1113, 470, 58, 27, 16, 46, 25, 26, 7, 64,
+ 16, 26, 9, 26, 16, 1097, 11, 16, 25, 10,
+ 17, 8, 7, 46, 16, 58, 36, 16, 46, 26,
+ 133, 7, 14, 16, 30, 82, 16, 14, 14, 16,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 27, 64, 26, 133, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+
+ 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+ 14, 14, 14, 14, 14, 14, 14, 14, 18, 33,
+ 14, 38, 67, 38, 38, 38, 38, 38, 38, 38,
+ 38, 38, 38, 49, 49, 23, 23, 23, 23, 23,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 48, 23, 1069, 45, 18, 49, 48, 84, 78, 1068,
+ 18, 74, 33, 45, 67, 74, 89, 74, 154, 89,
+ 167, 154, 48, 167, 23, 45, 18, 19, 19, 19,
+ 19, 19, 19, 19, 19, 19, 19, 51, 23, 170,
+ 50, 19, 19, 19, 19, 19, 19, 23, 1058, 50,
+
+ 84, 47, 51, 52, 54, 78, 61, 1050, 52, 47,
+ 51, 47, 50, 52, 19, 19, 19, 19, 19, 19,
+ 29, 29, 29, 47, 59, 52, 54, 54, 61, 61,
+ 52, 47, 170, 664, 59, 664, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 59, 60, 148, 72,
+ 29, 29, 29, 29, 29, 29, 72, 150, 79, 85,
+ 66, 299, 195, 79, 299, 60, 1049, 195, 85, 195,
+ 60, 72, 1025, 29, 29, 29, 29, 29, 29, 32,
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 53,
+ 148, 66, 126, 32, 32, 32, 32, 32, 32, 150,
+
+ 73, 126, 66, 1012, 73, 53, 73, 53, 100, 53,
+ 79, 85, 53, 66, 126, 77, 32, 32, 32, 32,
+ 32, 32, 34, 34, 34, 77, 73, 53, 124, 53,
+ 100, 100, 222, 1011, 124, 95, 222, 77, 34, 34,
+ 34, 34, 34, 34, 34, 34, 34, 34, 73, 151,
+ 124, 95, 34, 34, 34, 34, 34, 34, 95, 151,
+ 224, 991, 990, 163, 224, 96, 105, 988, 453, 96,
+ 105, 96, 105, 987, 980, 34, 34, 34, 34, 34,
+ 34, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+ 37, 96, 105, 105, 130, 37, 37, 37, 37, 37,
+
+ 37, 151, 119, 979, 106, 106, 119, 119, 119, 119,
+ 163, 453, 969, 96, 105, 105, 130, 130, 37, 37,
+ 37, 37, 37, 37, 56, 56, 106, 968, 951, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+
+ 56, 56, 56, 62, 115, 935, 134, 62, 62, 62,
+ 62, 137, 669, 134, 669, 137, 158, 137, 116, 125,
+ 125, 253, 116, 115, 116, 62, 138, 115, 134, 62,
+ 127, 121, 62, 121, 121, 121, 121, 121, 121, 158,
+ 934, 125, 138, 253, 116, 127, 139, 932, 62, 138,
+ 139, 62, 139, 127, 62, 65, 65, 65, 65, 65,
+ 65, 65, 65, 65, 65, 911, 116, 159, 136, 65,
+ 65, 65, 65, 65, 65, 458, 157, 910, 458, 99,
+ 157, 141, 157, 99, 99, 99, 99, 136, 129, 141,
+ 159, 136, 65, 65, 65, 65, 65, 65, 68, 68,
+
+ 68, 68, 68, 160, 129, 99, 129, 642, 129, 68,
+ 160, 129, 141, 99, 147, 68, 68, 68, 68, 68,
+ 68, 68, 68, 68, 68, 160, 129, 99, 129, 68,
+ 68, 68, 68, 68, 68, 99, 147, 147, 360, 103,
+ 908, 155, 360, 103, 103, 103, 103, 232, 452, 155,
+ 642, 68, 68, 68, 68, 68, 68, 68, 80, 80,
+ 80, 80, 80, 155, 80, 103, 123, 907, 123, 123,
+ 123, 123, 123, 123, 103, 80, 80, 80, 80, 80,
+ 80, 80, 80, 80, 80, 473, 178, 103, 473, 80,
+ 80, 80, 80, 80, 80, 452, 103, 135, 901, 232,
+
+ 140, 135, 143, 135, 140, 140, 140, 140, 146, 178,
+ 143, 80, 80, 80, 80, 80, 80, 80, 83, 83,
+ 83, 83, 83, 135, 161, 179, 146, 680, 161, 680,
+ 161, 146, 899, 143, 83, 83, 83, 83, 83, 83,
+ 83, 83, 83, 83, 83, 135, 145, 187, 179, 83,
+ 83, 83, 83, 83, 83, 156, 145, 177, 895, 893,
+ 156, 177, 156, 177, 164, 703, 890, 703, 145, 164,
+ 187, 83, 83, 83, 83, 83, 83, 83, 86, 86,
+ 86, 86, 86, 183, 156, 189, 186, 183, 86, 183,
+ 186, 186, 186, 186, 300, 86, 86, 86, 86, 86,
+
+ 86, 86, 86, 86, 86, 168, 156, 814, 189, 86,
+ 86, 86, 86, 86, 86, 194, 164, 198, 199, 194,
+ 168, 194, 101, 199, 200, 199, 101, 101, 101, 101,
+ 193, 86, 86, 86, 86, 86, 86, 86, 90, 198,
+ 198, 194, 90, 90, 90, 90, 300, 200, 101, 193,
+ 814, 128, 101, 193, 201, 889, 128, 168, 90, 90,
+ 90, 128, 90, 194, 90, 204, 171, 90, 90, 90,
+ 101, 872, 362, 128, 101, 171, 362, 201, 128, 205,
+ 214, 90, 90, 90, 90, 709, 90, 709, 204, 90,
+ 90, 90, 92, 92, 92, 92, 92, 92, 92, 92,
+
+ 92, 92, 205, 214, 216, 257, 92, 92, 92, 92,
+ 92, 92, 871, 162, 162, 162, 162, 162, 171, 203,
+ 209, 869, 258, 203, 209, 203, 209, 216, 257, 92,
+ 92, 92, 92, 92, 92, 94, 94, 94, 94, 94,
+ 94, 94, 94, 94, 94, 258, 639, 868, 865, 94,
+ 94, 94, 94, 94, 94, 559, 162, 260, 107, 559,
+ 863, 94, 107, 110, 107, 862, 162, 110, 110, 110,
+ 110, 260, 94, 94, 94, 94, 94, 94, 162, 107,
+ 260, 114, 265, 94, 107, 114, 114, 114, 114, 110,
+ 212, 212, 213, 639, 110, 254, 213, 213, 213, 213,
+
+ 265, 286, 107, 254, 182, 265, 107, 114, 182, 286,
+ 182, 110, 212, 114, 220, 114, 110, 254, 220, 220,
+ 220, 220, 229, 286, 182, 857, 229, 228, 229, 114,
+ 182, 228, 561, 228, 855, 114, 561, 114, 118, 118,
+ 118, 118, 118, 303, 234, 304, 852, 182, 234, 234,
+ 234, 234, 182, 228, 316, 118, 118, 118, 118, 118,
+ 118, 118, 118, 118, 118, 714, 303, 714, 304, 118,
+ 118, 118, 118, 118, 118, 228, 256, 316, 259, 255,
+ 256, 416, 256, 208, 255, 259, 255, 208, 208, 208,
+ 208, 118, 118, 118, 118, 118, 118, 118, 120, 851,
+
+ 259, 120, 120, 120, 120, 120, 120, 120, 255, 208,
+ 261, 318, 333, 120, 261, 120, 261, 236, 208, 236,
+ 236, 236, 236, 236, 236, 242, 242, 242, 242, 242,
+ 255, 208, 849, 416, 318, 333, 120, 483, 120, 122,
+ 208, 334, 122, 122, 122, 122, 122, 122, 122, 305,
+ 305, 305, 305, 305, 122, 238, 122, 238, 238, 238,
+ 238, 238, 238, 262, 334, 275, 283, 262, 242, 262,
+ 267, 283, 242, 283, 267, 275, 267, 122, 242, 122,
+ 149, 149, 149, 149, 149, 848, 281, 266, 831, 483,
+ 242, 266, 281, 266, 242, 338, 830, 149, 149, 149,
+
+ 149, 149, 149, 149, 149, 149, 149, 266, 281, 339,
+ 343, 149, 149, 149, 149, 149, 149, 275, 338, 249,
+ 249, 249, 249, 249, 726, 282, 726, 795, 344, 282,
+ 266, 282, 339, 343, 149, 149, 149, 149, 149, 149,
+ 152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
+ 249, 344, 794, 282, 152, 152, 152, 152, 152, 152,
+ 270, 752, 784, 752, 270, 270, 270, 270, 957, 783,
+ 287, 351, 249, 249, 287, 282, 287, 152, 152, 152,
+ 152, 152, 152, 165, 165, 165, 165, 165, 165, 165,
+ 165, 165, 165, 754, 351, 292, 417, 165, 165, 165,
+
+ 165, 165, 165, 753, 272, 272, 272, 272, 272, 290,
+ 302, 957, 328, 290, 302, 290, 302, 328, 417, 328,
+ 165, 165, 165, 165, 165, 165, 169, 169, 169, 169,
+ 169, 169, 169, 169, 169, 169, 291, 292, 353, 272,
+ 169, 169, 169, 169, 169, 169, 291, 292, 750, 792,
+ 503, 792, 241, 241, 241, 241, 241, 272, 291, 292,
+ 779, 353, 272, 169, 169, 169, 169, 169, 169, 172,
+ 172, 172, 172, 172, 172, 172, 172, 172, 172, 401,
+ 401, 748, 779, 172, 172, 172, 172, 172, 172, 306,
+ 306, 306, 306, 306, 811, 241, 244, 244, 244, 244,
+
+ 244, 401, 503, 241, 405, 241, 172, 172, 172, 172,
+ 172, 172, 176, 176, 176, 176, 176, 241, 307, 405,
+ 747, 332, 307, 741, 307, 241, 332, 405, 332, 176,
+ 176, 176, 176, 176, 176, 176, 176, 176, 176, 244,
+ 244, 811, 392, 176, 176, 176, 176, 176, 176, 244,
+ 739, 954, 392, 273, 273, 273, 273, 273, 734, 311,
+ 412, 244, 244, 311, 392, 311, 176, 176, 176, 176,
+ 176, 176, 233, 233, 233, 233, 233, 233, 233, 233,
+ 233, 233, 412, 412, 273, 462, 233, 233, 233, 233,
+ 233, 233, 240, 240, 240, 240, 240, 801, 954, 801,
+
+ 505, 271, 271, 271, 271, 271, 273, 273, 462, 233,
+ 233, 233, 233, 233, 233, 235, 526, 533, 235, 235,
+ 235, 235, 235, 235, 235, 325, 732, 240, 463, 325,
+ 235, 325, 235, 728, 727, 240, 468, 243, 243, 243,
+ 243, 243, 315, 468, 271, 240, 315, 315, 315, 315,
+ 240, 463, 505, 235, 271, 235, 237, 240, 468, 237,
+ 237, 237, 237, 237, 237, 237, 271, 724, 526, 533,
+ 403, 237, 478, 237, 245, 245, 245, 245, 245, 403,
+ 243, 246, 246, 246, 246, 246, 402, 337, 705, 243,
+ 243, 337, 403, 337, 237, 478, 237, 239, 239, 239,
+
+ 239, 239, 243, 704, 251, 251, 251, 251, 251, 346,
+ 479, 243, 245, 346, 239, 346, 554, 245, 239, 239,
+ 239, 239, 324, 698, 246, 342, 324, 245, 324, 246,
+ 342, 697, 342, 479, 246, 245, 556, 402, 402, 245,
+ 239, 250, 250, 250, 250, 250, 246, 251, 324, 350,
+ 239, 246, 251, 350, 350, 350, 350, 251, 759, 402,
+ 759, 759, 239, 247, 247, 247, 247, 247, 554, 251,
+ 324, 358, 250, 694, 251, 358, 358, 358, 358, 250,
+ 288, 288, 288, 288, 288, 807, 693, 807, 556, 274,
+ 274, 274, 274, 274, 250, 250, 247, 277, 277, 277,
+
+ 277, 277, 250, 277, 366, 566, 247, 277, 366, 277,
+ 366, 369, 247, 397, 247, 369, 247, 369, 740, 247,
+ 688, 397, 740, 397, 274, 374, 288, 686, 247, 374,
+ 374, 374, 374, 288, 247, 397, 247, 248, 248, 248,
+ 248, 248, 274, 397, 838, 399, 838, 274, 288, 424,
+ 277, 399, 742, 424, 248, 424, 742, 566, 248, 248,
+ 248, 248, 320, 320, 320, 320, 320, 399, 248, 280,
+ 280, 280, 280, 280, 321, 321, 321, 321, 321, 322,
+ 322, 322, 322, 322, 495, 280, 583, 583, 583, 583,
+ 248, 248, 276, 276, 276, 276, 276, 335, 335, 335,
+
+ 335, 335, 336, 336, 336, 336, 336, 495, 280, 276,
+ 276, 276, 276, 276, 276, 276, 276, 276, 276, 682,
+ 681, 423, 280, 276, 276, 276, 276, 276, 276, 423,
+ 678, 280, 289, 289, 289, 289, 289, 340, 340, 340,
+ 340, 340, 427, 423, 676, 675, 276, 276, 276, 276,
+ 276, 276, 278, 278, 278, 278, 278, 278, 278, 278,
+ 278, 278, 656, 492, 427, 427, 278, 278, 278, 278,
+ 278, 278, 341, 341, 341, 341, 341, 655, 289, 492,
+ 331, 331, 331, 331, 331, 289, 492, 630, 629, 278,
+ 278, 278, 278, 278, 278, 355, 355, 355, 355, 355,
+
+ 289, 293, 293, 293, 293, 293, 293, 293, 293, 293,
+ 293, 331, 621, 447, 497, 293, 293, 293, 293, 293,
+ 293, 620, 577, 349, 349, 349, 349, 349, 356, 356,
+ 356, 356, 356, 331, 331, 447, 447, 497, 293, 293,
+ 293, 293, 293, 293, 296, 296, 296, 296, 296, 296,
+ 296, 296, 296, 296, 576, 517, 394, 521, 296, 296,
+ 296, 296, 296, 296, 357, 357, 357, 357, 357, 363,
+ 363, 363, 363, 363, 394, 349, 349, 517, 517, 394,
+ 521, 296, 296, 296, 296, 296, 296, 297, 297, 297,
+ 297, 297, 297, 297, 297, 297, 297, 349, 847, 573,
+
+ 847, 297, 297, 297, 297, 297, 297, 364, 364, 364,
+ 364, 364, 572, 314, 314, 314, 314, 314, 365, 365,
+ 365, 365, 365, 393, 297, 297, 297, 297, 297, 297,
+ 301, 301, 301, 301, 301, 301, 301, 301, 301, 301,
+ 761, 522, 761, 761, 301, 301, 301, 301, 301, 301,
+ 314, 372, 372, 372, 372, 372, 376, 569, 376, 376,
+ 376, 376, 376, 376, 522, 393, 314, 301, 301, 301,
+ 301, 301, 301, 314, 378, 393, 378, 378, 378, 378,
+ 378, 378, 409, 568, 459, 372, 567, 393, 459, 565,
+ 389, 389, 389, 389, 389, 429, 560, 418, 409, 429,
+
+ 409, 429, 409, 418, 372, 409, 459, 558, 372, 373,
+ 373, 373, 373, 373, 373, 373, 373, 373, 373, 418,
+ 409, 389, 409, 373, 373, 373, 373, 373, 373, 380,
+ 380, 380, 380, 380, 867, 568, 867, 555, 381, 381,
+ 381, 381, 381, 389, 389, 553, 373, 373, 373, 373,
+ 373, 373, 375, 549, 547, 375, 375, 375, 375, 375,
+ 375, 375, 900, 420, 380, 528, 900, 375, 420, 375,
+ 420, 395, 380, 400, 382, 382, 382, 382, 382, 411,
+ 398, 381, 380, 411, 411, 411, 411, 380, 528, 381,
+ 375, 381, 375, 377, 380, 541, 377, 377, 377, 377,
+
+ 377, 377, 377, 381, 662, 395, 529, 884, 377, 884,
+ 377, 381, 662, 406, 419, 540, 532, 382, 419, 400,
+ 419, 382, 398, 395, 404, 400, 662, 382, 395, 529,
+ 398, 377, 398, 377, 379, 379, 379, 379, 379, 382,
+ 570, 400, 419, 382, 398, 383, 383, 383, 383, 383,
+ 406, 379, 398, 543, 543, 379, 379, 379, 379, 384,
+ 384, 384, 384, 384, 419, 406, 525, 404, 385, 385,
+ 385, 385, 385, 406, 679, 543, 404, 379, 464, 386,
+ 386, 386, 386, 386, 464, 515, 407, 379, 383, 404,
+ 413, 407, 570, 906, 514, 906, 407, 383, 383, 379,
+
+ 464, 432, 384, 384, 493, 432, 385, 432, 407, 544,
+ 383, 385, 384, 407, 391, 391, 391, 391, 391, 383,
+ 413, 385, 386, 465, 384, 384, 679, 386, 465, 385,
+ 465, 511, 386, 385, 390, 390, 390, 390, 390, 510,
+ 493, 414, 413, 413, 386, 414, 414, 414, 414, 386,
+ 387, 387, 387, 387, 387, 535, 493, 391, 414, 410,
+ 544, 544, 391, 493, 435, 390, 408, 391, 435, 396,
+ 435, 536, 390, 396, 396, 396, 396, 414, 535, 391,
+ 725, 414, 544, 387, 391, 508, 436, 390, 390, 396,
+ 436, 410, 436, 387, 536, 390, 546, 507, 428, 387,
+
+ 443, 387, 428, 387, 428, 396, 387, 410, 408, 410,
+ 443, 410, 396, 408, 410, 387, 504, 502, 408, 546,
+ 428, 387, 443, 387, 388, 388, 388, 388, 388, 410,
+ 408, 410, 725, 498, 496, 408, 425, 425, 425, 425,
+ 425, 388, 446, 428, 439, 388, 388, 388, 388, 426,
+ 426, 426, 426, 426, 444, 388, 433, 433, 433, 433,
+ 433, 490, 439, 448, 440, 548, 489, 439, 440, 445,
+ 440, 441, 441, 441, 441, 441, 446, 388, 388, 442,
+ 486, 485, 425, 442, 442, 442, 442, 445, 548, 425,
+ 433, 482, 445, 448, 446, 426, 444, 461, 472, 446,
+
+ 513, 461, 426, 461, 425, 513, 444, 513, 441, 433,
+ 942, 457, 942, 433, 460, 448, 448, 426, 444, 460,
+ 438, 460, 467, 477, 441, 437, 467, 477, 467, 477,
+ 518, 441, 449, 449, 449, 449, 449, 449, 449, 449,
+ 449, 449, 605, 469, 460, 609, 449, 449, 449, 449,
+ 449, 449, 450, 450, 450, 450, 450, 484, 450, 431,
+ 518, 484, 450, 484, 450, 605, 460, 430, 609, 449,
+ 449, 449, 449, 449, 449, 451, 451, 451, 451, 451,
+ 488, 451, 518, 518, 488, 451, 488, 451, 469, 480,
+ 480, 480, 480, 480, 422, 469, 481, 481, 481, 481,
+
+ 481, 421, 494, 610, 670, 450, 494, 494, 494, 494,
+ 469, 487, 487, 487, 487, 487, 499, 499, 499, 499,
+ 499, 500, 500, 500, 500, 500, 610, 670, 451, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+
+ 455, 455, 455, 455, 455, 455, 455, 455, 456, 456,
+ 456, 456, 456, 415, 371, 466, 466, 466, 466, 466,
+ 491, 491, 491, 491, 491, 456, 456, 456, 456, 456,
+ 456, 456, 456, 456, 456, 602, 602, 602, 602, 456,
+ 456, 456, 456, 456, 456, 501, 501, 501, 501, 501,
+ 506, 519, 370, 368, 506, 509, 506, 491, 367, 509,
+ 466, 509, 456, 456, 456, 456, 456, 456, 466, 361,
+ 519, 520, 359, 491, 519, 527, 520, 354, 520, 527,
+ 491, 527, 466, 471, 471, 471, 471, 471, 352, 471,
+ 523, 523, 523, 523, 523, 512, 512, 512, 512, 512,
+
+ 471, 471, 471, 471, 471, 471, 471, 471, 471, 471,
+ 604, 604, 604, 604, 471, 471, 471, 471, 471, 471,
+ 524, 524, 524, 524, 524, 948, 348, 948, 615, 512,
+ 530, 530, 530, 530, 530, 615, 471, 471, 471, 471,
+ 471, 471, 471, 474, 474, 474, 474, 474, 512, 534,
+ 615, 606, 512, 347, 534, 606, 534, 474, 345, 330,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 952, 329, 952, 606, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+
+ 474, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 474, 474, 474, 474, 474, 474, 474, 474, 327, 622,
+ 474, 475, 475, 475, 475, 475, 475, 475, 475, 475,
+ 475, 636, 636, 636, 636, 475, 475, 475, 475, 475,
+ 475, 622, 622, 516, 516, 516, 516, 516, 531, 531,
+ 531, 531, 531, 537, 537, 537, 537, 537, 475, 475,
+ 475, 475, 475, 475, 476, 476, 476, 476, 476, 476,
+ 476, 476, 476, 476, 516, 975, 634, 975, 476, 476,
+ 476, 476, 476, 476, 538, 538, 538, 538, 538, 539,
+ 326, 652, 634, 539, 571, 539, 516, 516, 571, 634,
+
+ 571, 476, 476, 476, 476, 476, 476, 542, 542, 542,
+ 542, 542, 545, 652, 652, 671, 545, 545, 545, 545,
+ 550, 550, 550, 550, 550, 551, 551, 551, 551, 551,
+ 552, 552, 552, 552, 552, 557, 580, 751, 671, 557,
+ 557, 557, 557, 562, 562, 562, 562, 562, 563, 563,
+ 563, 563, 563, 564, 564, 564, 564, 564, 323, 542,
+ 542, 574, 574, 574, 574, 574, 575, 579, 319, 580,
+ 575, 317, 575, 578, 578, 578, 578, 578, 608, 902,
+ 612, 542, 608, 902, 608, 612, 579, 612, 580, 751,
+ 579, 585, 580, 585, 585, 585, 585, 585, 585, 587,
+
+ 313, 587, 587, 587, 587, 587, 587, 578, 614, 618,
+ 815, 654, 614, 618, 614, 618, 654, 312, 654, 815,
+ 598, 598, 598, 598, 598, 986, 578, 986, 310, 309,
+ 578, 582, 582, 582, 582, 582, 582, 582, 582, 582,
+ 582, 598, 598, 598, 598, 582, 582, 582, 582, 582,
+ 582, 584, 584, 584, 584, 584, 584, 584, 601, 601,
+ 601, 601, 815, 584, 308, 584, 616, 298, 582, 582,
+ 582, 582, 582, 582, 601, 586, 586, 586, 586, 586,
+ 586, 586, 684, 684, 684, 684, 584, 586, 584, 586,
+ 601, 603, 603, 603, 603, 607, 685, 601, 294, 611,
+
+ 607, 661, 607, 619, 603, 611, 661, 619, 661, 619,
+ 586, 616, 586, 588, 588, 588, 588, 588, 616, 685,
+ 623, 611, 285, 603, 623, 607, 623, 603, 672, 672,
+ 672, 672, 672, 616, 588, 588, 588, 588, 626, 613,
+ 613, 613, 613, 613, 625, 657, 687, 607, 625, 657,
+ 625, 624, 624, 624, 624, 624, 588, 626, 628, 631,
+ 627, 626, 628, 631, 628, 631, 588, 657, 284, 687,
+ 632, 632, 632, 632, 632, 635, 279, 269, 588, 589,
+ 589, 589, 589, 589, 613, 633, 710, 711, 268, 633,
+ 624, 633, 613, 627, 264, 638, 638, 638, 638, 638,
+
+ 589, 589, 589, 589, 624, 632, 613, 638, 263, 710,
+ 711, 635, 627, 624, 589, 231, 627, 640, 640, 640,
+ 640, 640, 1022, 632, 1022, 812, 653, 635, 632, 640,
+ 812, 653, 589, 653, 635, 230, 866, 589, 590, 590,
+ 590, 590, 590, 644, 644, 644, 644, 644, 658, 644,
+ 227, 226, 658, 644, 658, 644, 715, 225, 653, 590,
+ 590, 590, 590, 223, 645, 645, 645, 645, 645, 674,
+ 645, 221, 716, 674, 645, 674, 645, 812, 219, 715,
+ 653, 590, 646, 646, 646, 646, 646, 663, 866, 590,
+ 1026, 590, 1026, 218, 646, 716, 644, 217, 647, 647,
+
+ 647, 647, 647, 590, 647, 1027, 215, 1027, 647, 720,
+ 647, 590, 591, 591, 591, 591, 591, 645, 648, 648,
+ 648, 648, 648, 692, 648, 211, 210, 692, 648, 692,
+ 648, 663, 720, 591, 591, 591, 591, 207, 206, 663,
+ 659, 659, 659, 659, 659, 660, 660, 660, 660, 660,
+ 1047, 647, 1047, 663, 673, 673, 673, 673, 673, 591,
+ 677, 677, 677, 677, 677, 591, 689, 689, 689, 689,
+ 689, 648, 700, 683, 683, 683, 683, 683, 707, 721,
+ 202, 591, 592, 592, 592, 592, 592, 659, 731, 733,
+ 696, 700, 660, 659, 696, 700, 696, 707, 660, 701,
+
+ 197, 707, 721, 592, 592, 592, 592, 196, 192, 659,
+ 683, 731, 733, 191, 660, 690, 690, 690, 690, 690,
+ 691, 691, 691, 691, 691, 190, 683, 695, 695, 695,
+ 695, 695, 701, 683, 592, 592, 699, 699, 699, 699,
+ 699, 706, 706, 706, 706, 706, 712, 712, 712, 712,
+ 712, 701, 1059, 188, 1059, 701, 592, 593, 593, 593,
+ 593, 593, 713, 713, 713, 713, 713, 843, 185, 777,
+ 699, 184, 706, 717, 717, 717, 717, 717, 593, 593,
+ 593, 593, 718, 718, 718, 718, 718, 181, 777, 699,
+ 843, 719, 777, 699, 706, 706, 719, 1060, 719, 1060,
+
+ 790, 593, 722, 722, 722, 722, 722, 958, 790, 180,
+ 593, 723, 723, 723, 723, 723, 958, 729, 729, 729,
+ 729, 729, 790, 593, 594, 594, 594, 594, 594, 730,
+ 730, 730, 730, 735, 735, 735, 735, 735, 736, 736,
+ 736, 736, 736, 175, 173, 594, 594, 594, 594, 737,
+ 737, 737, 737, 737, 738, 738, 738, 738, 166, 958,
+ 775, 844, 594, 743, 743, 743, 743, 743, 153, 729,
+ 729, 744, 744, 744, 744, 744, 775, 594, 745, 745,
+ 745, 745, 745, 775, 844, 594, 595, 595, 595, 595,
+ 595, 729, 746, 144, 142, 854, 746, 856, 746, 749,
+
+ 749, 749, 749, 749, 132, 758, 758, 758, 799, 758,
+ 758, 758, 755, 755, 755, 755, 755, 758, 854, 758,
+ 856, 131, 799, 762, 762, 762, 762, 762, 782, 595,
+ 832, 799, 785, 782, 595, 782, 785, 595, 117, 595,
+ 758, 113, 758, 760, 760, 760, 755, 760, 760, 760,
+ 112, 595, 832, 832, 785, 760, 595, 760, 791, 595,
+ 596, 596, 596, 596, 596, 755, 762, 111, 874, 755,
+ 763, 763, 763, 763, 763, 1077, 762, 1077, 760, 109,
+ 760, 772, 772, 772, 772, 772, 786, 874, 762, 805,
+ 786, 874, 786, 596, 108, 104, 764, 764, 764, 764,
+
+ 764, 789, 791, 596, 102, 763, 789, 805, 789, 596,
+ 791, 596, 805, 596, 98, 97, 596, 765, 765, 765,
+ 765, 765, 781, 763, 791, 596, 793, 781, 763, 781,
+ 793, 596, 793, 596, 597, 597, 597, 597, 597, 764,
+ 93, 827, 766, 766, 766, 766, 766, 764, 91, 764,
+ 827, 1079, 88, 1079, 781, 597, 597, 597, 597, 81,
+ 76, 764, 796, 827, 765, 597, 796, 75, 796, 764,
+ 765, 767, 767, 767, 767, 767, 781, 71, 876, 768,
+ 768, 768, 768, 768, 800, 877, 765, 597, 597, 599,
+ 599, 599, 599, 599, 766, 766, 769, 769, 769, 769,
+
+ 769, 876, 57, 771, 771, 771, 771, 771, 877, 55,
+ 599, 599, 599, 599, 798, 767, 766, 768, 798, 802,
+ 798, 1075, 800, 802, 767, 802, 806, 599, 44, 804,
+ 1075, 41, 768, 804, 771, 804, 800, 767, 39, 769,
+ 768, 829, 599, 1075, 769, 800, 829, 35, 829, 769,
+ 599, 600, 600, 600, 600, 600, 771, 771, 828, 835,
+ 806, 769, 828, 835, 828, 835, 769, 787, 787, 787,
+ 787, 787, 803, 803, 803, 803, 803, 880, 806, 1090,
+ 1098, 1090, 1098, 806, 773, 773, 773, 773, 773, 809,
+ 809, 809, 809, 809, 600, 881, 31, 24, 833, 600,
+
+ 880, 809, 600, 833, 600, 833, 774, 774, 774, 774,
+ 774, 861, 21, 836, 787, 861, 600, 861, 881, 836,
+ 787, 600, 773, 885, 600, 637, 637, 637, 637, 637,
+ 637, 637, 637, 637, 637, 836, 787, 773, 886, 637,
+ 637, 637, 637, 637, 637, 773, 885, 20, 933, 774,
+ 892, 894, 939, 933, 774, 933, 939, 15, 939, 774,
+ 946, 886, 637, 637, 637, 637, 637, 637, 641, 641,
+ 641, 774, 1000, 892, 894, 13, 774, 797, 797, 797,
+ 797, 797, 946, 946, 641, 641, 641, 641, 641, 641,
+ 641, 641, 641, 641, 3, 1000, 1001, 1039, 641, 641,
+
+ 641, 641, 641, 641, 1100, 0, 1100, 0, 797, 845,
+ 845, 845, 845, 845, 846, 846, 846, 846, 846, 1001,
+ 1039, 641, 641, 641, 641, 641, 641, 643, 643, 643,
+ 797, 797, 850, 850, 850, 850, 850, 858, 858, 858,
+ 858, 858, 0, 643, 643, 643, 643, 643, 643, 643,
+ 643, 643, 643, 0, 1040, 0, 0, 643, 643, 643,
+ 643, 643, 643, 817, 817, 817, 817, 817, 943, 817,
+ 0, 937, 943, 817, 943, 817, 937, 1040, 937, 0,
+ 643, 643, 643, 643, 643, 643, 649, 649, 649, 649,
+ 649, 940, 649, 0, 0, 945, 649, 940, 649, 945,
+
+ 0, 945, 0, 649, 649, 649, 649, 649, 649, 649,
+ 649, 649, 649, 940, 0, 0, 817, 649, 649, 649,
+ 649, 649, 649, 859, 859, 859, 859, 859, 860, 860,
+ 860, 860, 860, 864, 864, 864, 864, 864, 0, 649,
+ 649, 649, 649, 649, 649, 649, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 650, 650, 650, 650, 650,
+ 650, 650, 650, 650, 650, 651, 651, 651, 651, 651,
+ 651, 651, 651, 651, 651, 0, 0, 0, 0, 651,
+ 651, 651, 651, 651, 651, 818, 818, 818, 818, 818,
+ 949, 818, 0, 970, 949, 818, 949, 818, 970, 0,
+ 970, 0, 651, 651, 651, 651, 651, 651, 665, 665,
+ 665, 665, 665, 1045, 665, 878, 878, 878, 878, 878,
+ 879, 879, 879, 879, 879, 665, 665, 665, 665, 665,
+ 665, 665, 665, 665, 665, 1045, 1045, 0, 818, 665,
+
+ 665, 665, 665, 665, 665, 820, 820, 820, 820, 820,
+ 834, 834, 834, 834, 834, 0, 965, 820, 0, 0,
+ 965, 665, 665, 665, 665, 665, 665, 665, 666, 666,
+ 666, 666, 666, 666, 666, 666, 666, 666, 965, 0,
+ 0, 0, 666, 666, 666, 666, 666, 666, 821, 821,
+ 821, 821, 821, 873, 873, 873, 873, 873, 820, 834,
+ 821, 0, 0, 834, 0, 666, 666, 666, 666, 666,
+ 666, 667, 667, 667, 667, 667, 667, 667, 667, 667,
+ 667, 834, 0, 0, 873, 667, 667, 667, 667, 667,
+ 667, 0, 822, 822, 822, 822, 822, 0, 822, 967,
+
+ 0, 821, 822, 967, 822, 967, 873, 873, 667, 667,
+ 667, 667, 667, 667, 668, 668, 668, 668, 668, 668,
+ 668, 668, 668, 668, 0, 0, 0, 0, 668, 668,
+ 668, 668, 668, 668, 0, 0, 788, 788, 788, 788,
+ 788, 837, 0, 0, 0, 822, 882, 882, 882, 882,
+ 882, 668, 668, 668, 668, 668, 668, 757, 757, 757,
+ 757, 757, 757, 757, 757, 757, 757, 0, 0, 0,
+ 0, 757, 757, 757, 757, 757, 757, 947, 823, 823,
+ 823, 823, 823, 788, 973, 0, 0, 837, 973, 788,
+ 823, 0, 0, 837, 757, 757, 757, 757, 757, 757,
+
+ 770, 770, 770, 770, 770, 788, 973, 947, 0, 837,
+ 839, 839, 839, 839, 839, 0, 839, 883, 883, 883,
+ 883, 883, 887, 887, 887, 887, 887, 0, 1020, 947,
+ 947, 823, 1020, 770, 888, 888, 888, 888, 888, 896,
+ 896, 896, 896, 896, 897, 897, 897, 897, 897, 770,
+ 1020, 770, 0, 770, 0, 0, 770, 898, 898, 898,
+ 898, 898, 0, 839, 903, 903, 903, 903, 903, 0,
+ 0, 770, 0, 770, 808, 808, 808, 808, 808, 808,
+ 808, 808, 808, 808, 0, 0, 0, 0, 808, 808,
+ 808, 808, 808, 808, 853, 853, 853, 853, 853, 904,
+
+ 904, 904, 904, 904, 905, 905, 905, 905, 905, 0,
+ 0, 808, 808, 808, 808, 808, 808, 813, 813, 813,
+ 813, 813, 0, 813, 909, 909, 909, 909, 909, 0,
+ 0, 853, 0, 0, 813, 813, 813, 813, 813, 813,
+ 813, 813, 813, 813, 0, 0, 0, 853, 813, 813,
+ 813, 813, 813, 813, 853, 944, 944, 944, 944, 944,
+ 953, 953, 953, 953, 953, 981, 981, 981, 981, 981,
+ 813, 813, 813, 813, 813, 813, 813, 816, 816, 816,
+ 816, 816, 1041, 972, 1017, 0, 1041, 816, 972, 1017,
+ 972, 1017, 0, 0, 816, 816, 816, 816, 816, 816,
+
+ 816, 816, 816, 816, 1041, 0, 0, 0, 816, 816,
+ 816, 816, 816, 816, 870, 870, 870, 870, 870, 0,
+ 891, 891, 891, 891, 891, 989, 989, 989, 989, 989,
+ 816, 816, 816, 816, 816, 816, 816, 819, 819, 819,
+ 819, 819, 819, 819, 819, 819, 819, 0, 870, 0,
+ 0, 819, 819, 819, 819, 819, 819, 914, 914, 914,
+ 914, 914, 1023, 0, 0, 955, 1023, 870, 1023, 0,
+ 955, 870, 891, 891, 819, 819, 819, 819, 819, 819,
+ 824, 824, 824, 824, 824, 1002, 1002, 1002, 1002, 1002,
+ 0, 0, 0, 0, 891, 0, 0, 824, 824, 824,
+
+ 824, 824, 824, 824, 824, 824, 824, 0, 0, 0,
+ 914, 824, 824, 824, 824, 824, 824, 955, 1003, 1003,
+ 1003, 1003, 1003, 1013, 1013, 1013, 1013, 1013, 1018, 1018,
+ 1018, 1018, 1018, 0, 824, 824, 824, 824, 824, 824,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 825,
+ 825, 825, 825, 825, 825, 825, 825, 825, 825, 826,
+ 826, 826, 826, 826, 826, 826, 826, 826, 826, 0,
+ 0, 0, 0, 826, 826, 826, 826, 826, 826, 912,
+ 912, 912, 912, 912, 924, 924, 924, 924, 924, 1038,
+ 1088, 0, 0, 1038, 1088, 1038, 826, 826, 826, 826,
+ 826, 826, 840, 840, 840, 840, 840, 840, 840, 840,
+ 840, 840, 1088, 912, 0, 924, 840, 840, 840, 840,
+ 840, 840, 916, 916, 916, 916, 916, 0, 0, 966,
+ 0, 0, 912, 966, 0, 966, 912, 924, 924, 840,
+
+ 840, 840, 840, 840, 840, 841, 841, 841, 841, 841,
+ 841, 841, 841, 841, 841, 0, 966, 916, 0, 841,
+ 841, 841, 841, 841, 841, 0, 915, 915, 915, 915,
+ 915, 0, 1019, 0, 0, 916, 0, 1019, 966, 1019,
+ 916, 0, 841, 841, 841, 841, 841, 841, 842, 842,
+ 842, 842, 842, 842, 842, 842, 842, 842, 0, 0,
+ 0, 0, 842, 842, 842, 842, 842, 842, 0, 915,
+ 917, 917, 917, 917, 917, 0, 0, 974, 941, 915,
+ 918, 918, 918, 918, 918, 842, 842, 842, 842, 842,
+ 842, 915, 919, 919, 919, 919, 919, 920, 920, 920,
+
+ 920, 920, 0, 0, 921, 921, 921, 921, 921, 1046,
+ 0, 0, 0, 917, 0, 0, 922, 922, 922, 922,
+ 922, 917, 1042, 917, 941, 974, 1042, 918, 1042, 974,
+ 941, 1044, 0, 918, 0, 917, 1044, 0, 1044, 1046,
+ 0, 920, 921, 917, 919, 919, 941, 974, 0, 918,
+ 920, 925, 925, 925, 925, 925, 0, 921, 0, 922,
+ 0, 1046, 1046, 920, 922, 921, 919, 0, 0, 922,
+ 926, 926, 926, 926, 926, 0, 927, 927, 927, 927,
+ 927, 922, 1076, 0, 0, 0, 922, 923, 923, 923,
+ 923, 923, 0, 0, 0, 928, 928, 928, 928, 928,
+
+ 1056, 0, 0, 0, 925, 1056, 0, 1056, 926, 929,
+ 929, 929, 929, 929, 931, 931, 931, 931, 931, 927,
+ 923, 1067, 0, 926, 927, 1076, 1067, 0, 1067, 927,
+ 0, 926, 928, 1071, 1076, 0, 923, 1071, 923, 1071,
+ 923, 927, 0, 923, 0, 0, 927, 1076, 928, 930,
+ 930, 930, 930, 930, 0, 928, 0, 1074, 923, 1085,
+ 923, 1074, 929, 1074, 1085, 0, 1085, 931, 938, 938,
+ 938, 938, 938, 961, 961, 961, 961, 961, 963, 963,
+ 963, 963, 963, 930, 0, 961, 0, 0, 0, 0,
+ 963, 1051, 1051, 1051, 1051, 1051, 0, 971, 971, 971,
+
+ 971, 971, 930, 0, 0, 0, 930, 976, 976, 976,
+ 976, 976, 977, 977, 977, 977, 977, 938, 1087, 0,
+ 1037, 938, 1087, 1021, 1087, 1037, 961, 1037, 971, 0,
+ 0, 963, 1086, 1086, 1086, 1086, 1086, 0, 0, 938,
+ 956, 956, 956, 956, 956, 956, 956, 956, 956, 956,
+ 971, 971, 1037, 0, 956, 956, 956, 956, 956, 956,
+ 976, 0, 0, 0, 0, 977, 978, 978, 978, 978,
+ 978, 1021, 0, 0, 1037, 1021, 0, 956, 956, 956,
+ 956, 956, 956, 959, 959, 959, 959, 959, 959, 959,
+ 959, 959, 959, 1021, 0, 0, 0, 959, 959, 959,
+
+ 959, 959, 959, 983, 983, 983, 983, 983, 984, 984,
+ 984, 984, 984, 1094, 1094, 1094, 1094, 1094, 0, 978,
+ 959, 959, 959, 959, 959, 959, 960, 960, 960, 960,
+ 960, 960, 960, 960, 960, 960, 0, 0, 0, 0,
+ 960, 960, 960, 960, 960, 960, 1095, 0, 0, 0,
+ 0, 1095, 0, 1095, 0, 0, 983, 0, 0, 0,
+ 0, 984, 0, 960, 960, 960, 960, 960, 960, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 962, 962,
+ 962, 962, 962, 962, 962, 962, 962, 962, 964, 964,
+ 964, 964, 964, 964, 964, 964, 964, 964, 0, 0,
+ 0, 0, 964, 964, 964, 964, 964, 964, 982, 982,
+ 982, 982, 982, 985, 985, 985, 985, 985, 992, 992,
+ 992, 992, 992, 0, 0, 964, 964, 964, 964, 964,
+ 964, 993, 993, 993, 993, 993, 994, 994, 994, 994,
+
+ 994, 0, 0, 0, 0, 982, 995, 995, 995, 995,
+ 995, 0, 992, 996, 996, 996, 996, 996, 0, 0,
+ 0, 982, 993, 0, 0, 0, 985, 0, 982, 0,
+ 994, 992, 0, 0, 0, 992, 997, 997, 997, 997,
+ 997, 0, 0, 0, 993, 993, 0, 0, 0, 994,
+ 0, 0, 0, 994, 998, 998, 998, 998, 998, 995,
+ 999, 999, 999, 999, 999, 0, 996, 1004, 1004, 1004,
+ 1004, 1004, 1005, 1005, 1005, 1005, 1005, 1006, 1006, 1006,
+ 1006, 1006, 1007, 1007, 1007, 1007, 1007, 0, 1089, 997,
+ 1008, 1008, 1008, 1008, 1008, 1009, 1009, 1009, 1009, 1009,
+
+ 1010, 1010, 1010, 1010, 1010, 0, 0, 998, 1014, 1014,
+ 1014, 1014, 1014, 999, 1015, 1015, 1015, 1015, 1015, 1004,
+ 1004, 0, 0, 0, 0, 1005, 0, 0, 0, 0,
+ 1006, 0, 0, 0, 0, 1007, 1089, 0, 0, 0,
+ 1089, 1004, 1014, 1008, 0, 0, 0, 0, 1009, 0,
+ 0, 0, 0, 1010, 0, 0, 0, 0, 1089, 0,
+ 0, 1014, 0, 0, 0, 1014, 0, 1015, 1028, 1028,
+ 1028, 1028, 1028, 1028, 1028, 1028, 1028, 1028, 0, 0,
+ 0, 0, 1028, 1028, 1028, 1028, 1028, 1028, 1031, 1031,
+ 1031, 1031, 1031, 1048, 1048, 1048, 1048, 1048, 0, 0,
+
+ 1031, 0, 0, 0, 0, 1028, 1028, 1028, 1028, 1028,
+ 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029,
+ 1029, 0, 0, 0, 0, 1029, 1029, 1029, 1029, 1029,
+ 1029, 1032, 1032, 1032, 1032, 1032, 1043, 1043, 1043, 1043,
+ 1043, 1031, 0, 1032, 0, 0, 1048, 0, 1029, 1029,
+ 1029, 1029, 1029, 1029, 1030, 1030, 1030, 1030, 1030, 1030,
+ 1030, 1030, 1030, 1030, 0, 0, 0, 0, 1030, 1030,
+ 1030, 1030, 1030, 1030, 1053, 1053, 1053, 1053, 1053, 0,
+ 1043, 0, 0, 0, 1032, 0, 0, 0, 0, 1043,
+ 0, 1030, 1030, 1030, 1030, 1030, 1030, 1033, 1033, 1033,
+
+ 1033, 1033, 1043, 0, 0, 0, 0, 0, 0, 1033,
+ 0, 0, 0, 0, 1033, 1033, 1033, 1033, 1033, 1033,
+ 1033, 1033, 1033, 1033, 0, 0, 0, 1053, 1033, 1033,
+ 1033, 1033, 1033, 1033, 1052, 1052, 1052, 1052, 1052, 1054,
+ 1054, 1054, 1054, 1054, 0, 0, 0, 0, 0, 0,
+ 1033, 1033, 1033, 1033, 1033, 1033, 1033, 1035, 1035, 1035,
+ 1035, 1035, 1035, 1035, 1035, 1035, 1035, 0, 1052, 0,
+ 0, 1035, 1035, 1035, 1035, 1035, 1035, 1055, 1055, 1055,
+ 1055, 1055, 0, 0, 0, 0, 0, 1052, 0, 0,
+ 0, 1052, 1054, 0, 1035, 1035, 1035, 1035, 1035, 1035,
+
+ 1064, 1064, 1064, 1064, 1064, 0, 0, 0, 0, 0,
+ 0, 0, 1064, 1072, 1072, 1072, 1072, 1072, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1055, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
+ 1061, 0, 0, 0, 0, 1061, 1061, 1061, 1061, 1061,
+ 1061, 0, 0, 1064, 0, 0, 1073, 1073, 1073, 1073,
+ 1073, 0, 1072, 0, 0, 0, 1072, 0, 1061, 1061,
+ 1061, 1061, 1061, 1061, 1062, 1062, 1062, 1062, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1072, 0, 0, 0, 1062, 1062,
+ 1062, 1062, 1062, 1062, 1078, 1078, 1078, 1078, 1078, 0,
+
+ 0, 0, 0, 0, 0, 1073, 0, 0, 0, 1073,
+ 0, 1062, 1062, 1062, 1062, 1062, 1062, 1063, 1063, 1063,
+ 1063, 1063, 1063, 1063, 1063, 1063, 1063, 1073, 0, 0,
+ 0, 1063, 1063, 1063, 1063, 1063, 1063, 1101, 1101, 1101,
+ 1101, 1101, 0, 0, 0, 0, 0, 1078, 0, 1101,
+ 0, 0, 0, 0, 1063, 1063, 1063, 1063, 1063, 1063,
+ 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065, 1065,
+ 0, 0, 0, 0, 1065, 1065, 1065, 1065, 1065, 1065,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1101, 0, 0, 0, 0, 0, 0, 1065, 1065, 1065,
+
+ 1065, 1065, 1065, 1066, 1066, 1066, 1066, 1066, 1066, 1066,
+ 1066, 1066, 1066, 0, 0, 0, 0, 1066, 1066, 1066,
+ 1066, 1066, 1066, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1066, 1066, 1066, 1066, 1066, 1066, 1080, 1080, 1080, 1080,
+ 1080, 1080, 1080, 1080, 1080, 1080, 0, 0, 0, 0,
+ 1080, 1080, 1080, 1080, 1080, 1080, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1080, 1080, 1080, 1080, 1080, 1080, 1081,
+ 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 1081, 0,
+
+ 0, 0, 0, 1081, 1081, 1081, 1081, 1081, 1081, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1081, 1081, 1081, 1081,
+ 1081, 1081, 1082, 1082, 1082, 1082, 1082, 1082, 1082, 1082,
+ 1082, 1082, 0, 0, 0, 0, 1082, 1082, 1082, 1082,
+ 1082, 1082, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1082,
+ 1082, 1082, 1082, 1082, 1082, 1083, 1083, 1083, 1083, 1083,
+ 1083, 1083, 1083, 1083, 1083, 0, 0, 0, 0, 1083,
+ 1083, 1083, 1083, 1083, 1083, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 1084,
+ 1084, 1084, 1084, 1084, 1084, 1084, 1084, 1084, 0, 0,
+ 0, 0, 1084, 1084, 1084, 1084, 1084, 1084, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1084, 1084, 1084, 1084, 1084,
+ 1084, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091, 1091,
+ 1091, 0, 0, 0, 0, 1091, 1091, 1091, 1091, 1091,
+ 1091, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1091, 1091,
+
+ 1091, 1091, 1091, 1091, 1092, 1092, 1092, 1092, 1092, 1092,
+ 1092, 1092, 1092, 1092, 0, 0, 0, 0, 1092, 1092,
+ 1092, 1092, 1092, 1092, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1092, 1092, 1092, 1092, 1092, 1092, 1093, 1093, 1093,
+ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 0, 0, 0,
+ 0, 1093, 1093, 1093, 1093, 1093, 1093, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1093, 1093, 1093, 1093, 1093, 1093,
+ 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099, 1099,
+
+ 0, 0, 0, 0, 1099, 1099, 1099, 1099, 1099, 1099,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1099, 1099, 1099,
+ 1099, 1099, 1099, 1103, 1103, 0, 1103, 1103, 1103, 1103,
+ 1103, 1103, 1104, 1104, 1104, 1104, 1105, 1105, 0, 1105,
+ 1105, 1105, 1105, 1105, 1105, 1106, 0, 0, 1106, 1107,
+ 1107, 0, 1107, 1107, 1108, 1108, 0, 1108, 1108, 1108,
+ 1108, 1108, 1108, 1109, 1109, 1109, 1109, 1109, 1109, 1109,
+ 1109, 1109, 1110, 1110, 0, 1110, 1110, 1110, 1110, 1110,
+ 1110, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111,
+
+ 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1114,
+ 0, 1114, 1114, 1115, 1115, 0, 1115, 1115, 1115, 1115,
+ 1115, 1115, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116,
+ 1116, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
+ 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1119,
+ 1119, 0, 1119, 1119, 1119, 1119, 1119, 1119, 1120, 1120,
+ 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1121, 1121, 1121,
+ 1121, 1121, 1121, 1121, 1121, 1121, 1122, 1122, 1122, 1122,
+ 1122, 1122, 1122, 1122, 1122, 1123, 1123, 1123, 0, 1123,
+ 1123, 1123, 1123, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+
+ 1124, 1124, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+ 1125, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
+ 1127, 1127, 0, 1127, 1127, 1127, 1127, 1127, 1127, 1128,
+ 1128, 0, 1128, 1128, 1128, 1128, 1128, 1128, 1129, 1129,
+ 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1130, 1130, 1130,
+ 1130, 1130, 1130, 1130, 1130, 1130, 1131, 1131, 1131, 1131,
+ 1131, 1131, 1131, 1131, 1131, 1132, 1132, 1132, 1132, 1132,
+ 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, 1133, 1133,
+ 1133, 1133, 1133, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+ 1134, 1134, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135,
+
+ 1135, 1136, 1136, 0, 0, 1136, 1136, 1136, 1136, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102,
+ 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102, 1102
+ } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "css.l"
+
+#line 13 "css.l"
+/* Lex source for CSS tokenizing.
+ Taken from http://www.w3.org/TR/CSS21/grammar.html#q2
+ Copyright (C) 2006, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#define YY_NO_INPUT
+
+#include "css-tokens.h"
+
+#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+ #pragma GCC diagnostic ignored "-Wunknown-pragmas" // clang mourns about the next one
+ #pragma GCC diagnostic ignored "-Wunused-function"
+ #pragma GCC diagnostic ignored "-Wunused-macros"
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
+ #pragma GCC diagnostic ignored "-Wsign-compare"
+ #pragma GCC diagnostic ignored "-Wswitch-default"
+ #pragma GCC diagnostic ignored "-Wunreachable-code" // clang
+ #pragma clang diagnostic ignored "-Wshorten-64-to-32"
+ #ifndef __clang__
+ #pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+ #endif
+#endif
+
+#line 2452 "css.c"
+#line 2453 "css.c"
+
+#define INITIAL 0
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in ( void );
+
+void yyset_in ( FILE * _in_str );
+
+FILE *yyget_out ( void );
+
+void yyset_out ( FILE * _out_str );
+
+ int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for ( n = 0; n < max_size && \
+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+ buf[n] = (char) c; \
+ if ( c == '\n' ) \
+ buf[n++] = (char) c; \
+ if ( c == EOF && ferror( yyin ) ) \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ result = n; \
+ } \
+ else \
+ { \
+ errno=0; \
+ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+ { \
+ if( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+ YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+ yy_state_type yy_current_state;
+ char *yy_cp, *yy_bp;
+ int yy_act;
+
+ if ( !(yy_init) )
+ {
+ (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+ if ( ! (yy_start) )
+ (yy_start) = 1; /* first start state */
+
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_load_buffer_state( );
+ }
+
+ {
+#line 112 "css.l"
+
+
+#line 2671 "css.c"
+
+ while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
+ {
+ yy_cp = (yy_c_buf_p);
+
+ /* Support of yytext. */
+ *yy_cp = (yy_hold_char);
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = (yy_start);
+yy_match:
+ do
+ {
+ YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ ++yy_cp;
+ }
+ while ( yy_current_state != 1102 );
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+
+yy_find_action:
+ yy_act = yy_accept[yy_current_state];
+
+ YY_DO_BEFORE_ACTION;
+
+do_action: /* This label is used only to access EOF actions. */
+
+ switch ( yy_act )
+ { /* beginning of action switch */
+ case 0: /* must back up */
+ /* undo the effects of YY_DO_BEFORE_ACTION */
+ *yy_cp = (yy_hold_char);
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 114 "css.l"
+{return S;}
+ YY_BREAK
+case 2:
+/* rule 2 can match eol */
+YY_RULE_SETUP
+#line 116 "css.l"
+{return COMMENT;}
+ YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+#line 117 "css.l"
+/* ignore comments */
+ YY_BREAK
+case 4:
+/* rule 4 can match eol */
+YY_RULE_SETUP
+#line 118 "css.l"
+/* unclosed comment at EOF */
+ YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 120 "css.l"
+{return CDO;}
+ YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 121 "css.l"
+{return CDC;}
+ YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 122 "css.l"
+{return INCLUDES;}
+ YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 123 "css.l"
+{return DASHMATCH;}
+ YY_BREAK
+case 9:
+/* rule 9 can match eol */
+YY_RULE_SETUP
+#line 125 "css.l"
+{return STRING;}
+ YY_BREAK
+case 10:
+/* rule 10 can match eol */
+YY_RULE_SETUP
+#line 126 "css.l"
+{return BAD_STRING;}
+ YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+#line 128 "css.l"
+{return IDENT;}
+ YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+#line 130 "css.l"
+{return HASH;}
+ YY_BREAK
+case 13:
+/* rule 13 can match eol */
+YY_RULE_SETUP
+#line 132 "css.l"
+{return IMPORT_SYM;}
+ YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 133 "css.l"
+{return PAGE_SYM;}
+ YY_BREAK
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+#line 134 "css.l"
+{return MEDIA_SYM;}
+ YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 135 "css.l"
+{return CHARSET_SYM;}
+ YY_BREAK
+case 17:
+/* rule 17 can match eol */
+YY_RULE_SETUP
+#line 137 "css.l"
+{return IMPORTANT_SYM;}
+ YY_BREAK
+case 18:
+/* rule 18 can match eol */
+YY_RULE_SETUP
+#line 139 "css.l"
+{return EMS;}
+ YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 140 "css.l"
+{return EXS;}
+ YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 141 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 21:
+/* rule 21 can match eol */
+YY_RULE_SETUP
+#line 142 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 22:
+/* rule 22 can match eol */
+YY_RULE_SETUP
+#line 143 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 144 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 24:
+/* rule 24 can match eol */
+YY_RULE_SETUP
+#line 145 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 25:
+/* rule 25 can match eol */
+YY_RULE_SETUP
+#line 146 "css.l"
+{return LENGTH;}
+ YY_BREAK
+case 26:
+/* rule 26 can match eol */
+YY_RULE_SETUP
+#line 147 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 27:
+/* rule 27 can match eol */
+YY_RULE_SETUP
+#line 148 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 28:
+/* rule 28 can match eol */
+YY_RULE_SETUP
+#line 149 "css.l"
+{return ANGLE;}
+ YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 150 "css.l"
+{return TIME;}
+ YY_BREAK
+case 30:
+/* rule 30 can match eol */
+YY_RULE_SETUP
+#line 151 "css.l"
+{return TIME;}
+ YY_BREAK
+case 31:
+/* rule 31 can match eol */
+YY_RULE_SETUP
+#line 152 "css.l"
+{return FREQ;}
+ YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 153 "css.l"
+{return FREQ;}
+ YY_BREAK
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 154 "css.l"
+{return DIMENSION;}
+ YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 156 "css.l"
+{return PERCENTAGE;}
+ YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 157 "css.l"
+{return NUMBER;}
+ YY_BREAK
+case 36:
+/* rule 36 can match eol */
+YY_RULE_SETUP
+#line 159 "css.l"
+{return URI;}
+ YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+#line 160 "css.l"
+{return URI;}
+ YY_BREAK
+case 38:
+/* rule 38 can match eol */
+YY_RULE_SETUP
+#line 161 "css.l"
+{return BAD_URI;}
+ YY_BREAK
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 163 "css.l"
+{return FUNCTION;}
+ YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 165 "css.l"
+{return *yytext;}
+ YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 167 "css.l"
+ECHO;
+ YY_BREAK
+#line 2961 "css.c"
+case YY_STATE_EOF(INITIAL):
+ yyterminate();
+
+ case YY_END_OF_BUFFER:
+ {
+ /* Amount of text matched not including the EOB char. */
+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
+ *yy_cp = (yy_hold_char);
+ YY_RESTORE_YY_MORE_OFFSET
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+ {
+ /* We're scanning a new file or input source. It's
+ * possible that this happened because the user
+ * just pointed yyin at a new source and called
+ * yylex(). If so, then we have to assure
+ * consistency between YY_CURRENT_BUFFER and our
+ * globals. Here is the right place to do so, because
+ * this is the first action (other than possibly a
+ * back-up) that will match for the new input source.
+ */
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+ }
+
+ /* Note that here we test for yy_c_buf_p "<=" to the position
+ * of the first EOB in the buffer, since yy_c_buf_p will
+ * already have been incremented past the NUL character
+ * (since all states make transitions on EOB to the
+ * end-of-buffer state). Contrast this with the test
+ * in input().
+ */
+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ { /* This was really a NUL. */
+ yy_state_type yy_next_state;
+
+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state() go ahead and do it
+ * for us because it doesn't know how to deal
+ * with the possibility of jamming (and we don't
+ * want to build jamming into it because then it
+ * will run more slowly).
+ */
+
+ yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++(yy_c_buf_p);
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+ yy_cp = (yy_last_accepting_cpos);
+ yy_current_state = (yy_last_accepting_state);
+ goto yy_find_action;
+ }
+ }
+
+ else switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_END_OF_FILE:
+ {
+ (yy_did_buffer_switch_on_eof) = 0;
+
+ if ( yywrap( ) )
+ {
+ /* Note: because we've taken care in
+ * yy_get_next_buffer() to have set up
+ * yytext, we can now set up
+ * yy_c_buf_p so that if some total
+ * hoser (like flex itself) wants to
+ * call the scanner after we return the
+ * YY_NULL, it'll still work - another
+ * YY_NULL will get returned.
+ */
+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+ yy_act = YY_STATE_EOF(YY_START);
+ goto do_action;
+ }
+
+ else
+ {
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+ }
+ break;
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) =
+ (yytext_ptr) + yy_amount_of_matched_text;
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_match;
+
+ case EOB_ACT_LAST_MATCH:
+ (yy_c_buf_p) =
+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+ yy_current_state = yy_get_previous_state( );
+
+ yy_cp = (yy_c_buf_p);
+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+ goto yy_find_action;
+ }
+ break;
+ }
+
+ default:
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--no action found" );
+ } /* end of action switch */
+ } /* end of scanning one token */
+ } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ * EOB_ACT_LAST_MATCH -
+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ * EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+ char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+ char *source = (yytext_ptr);
+ int number_to_move, i;
+ int ret_val;
+
+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+ { /* Don't try to fill the buffer, so this is an EOF. */
+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+ {
+ /* We matched a single character, the EOB, so
+ * treat this as a final EOF.
+ */
+ return EOB_ACT_END_OF_FILE;
+ }
+
+ else
+ {
+ /* We matched some text prior to the EOB, first
+ * process it.
+ */
+ return EOB_ACT_LAST_MATCH;
+ }
+ }
+
+ /* Try to read more data. */
+
+ /* First move last chars to start of buffer. */
+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+ for ( i = 0; i < number_to_move; ++i )
+ *(dest++) = *(source++);
+
+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+ /* don't do the read, it's not guaranteed to return an EOF,
+ * just force an EOF
+ */
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+ while ( num_to_read <= 0 )
+ { /* Not enough room in the buffer - grow it. */
+
+ /* just a shorter name for the current buffer */
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+ int yy_c_buf_p_offset =
+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+ if ( b->yy_is_our_buffer )
+ {
+ int new_size = b->yy_buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->yy_buf_size += b->yy_buf_size / 8;
+ else
+ b->yy_buf_size *= 2;
+
+ b->yy_ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ yyrealloc( (void *) b->yy_ch_buf,
+ (yy_size_t) (b->yy_buf_size + 2) );
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->yy_ch_buf = NULL;
+
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+ number_to_move - 1;
+
+ }
+
+ if ( num_to_read > YY_READ_BUF_SIZE )
+ num_to_read = YY_READ_BUF_SIZE;
+
+ /* Read in more data. */
+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+ (yy_n_chars), num_to_read );
+
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ if ( (yy_n_chars) == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ yyrestart( yyin );
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+ (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size );
+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+ /* "- 2" to take care of EOB's */
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+ }
+
+ (yy_n_chars) += number_to_move;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+ return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+ static yy_state_type yy_get_previous_state (void)
+{
+ yy_state_type yy_current_state;
+ char *yy_cp;
+
+ yy_current_state = (yy_start);
+
+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+ {
+ YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans( current_state );
+ */
+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
+{
+ int yy_is_jam;
+ char *yy_cp = (yy_c_buf_p);
+
+ YY_CHAR yy_c = 1;
+ if ( yy_accept[yy_current_state] )
+ {
+ (yy_last_accepting_state) = yy_current_state;
+ (yy_last_accepting_cpos) = yy_cp;
+ }
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+ if ( yy_current_state >= 1103 )
+ yy_c = yy_meta[yy_c];
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+ yy_is_jam = (yy_current_state == 1102);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+ static int yyinput (void)
+#else
+ static int input (void)
+#endif
+
+{
+ int c;
+
+ *(yy_c_buf_p) = (yy_hold_char);
+
+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+ {
+ /* yy_c_buf_p now points to the character we want to return.
+ * If this occurs *before* the EOB characters, then it's a
+ * valid NUL; if not, then we've hit the end of the buffer.
+ */
+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+ /* This was really a NUL. */
+ *(yy_c_buf_p) = '\0';
+
+ else
+ { /* need more input */
+ int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+ ++(yy_c_buf_p);
+
+ switch ( yy_get_next_buffer( ) )
+ {
+ case EOB_ACT_LAST_MATCH:
+ /* This happens because yy_g_n_b()
+ * sees that we've accumulated a
+ * token and flags that we need to
+ * try matching the token before
+ * proceeding. But for input(),
+ * there's no matching to consider.
+ * So convert the EOB_ACT_LAST_MATCH
+ * to EOB_ACT_END_OF_FILE.
+ */
+
+ /* Reset buffer status. */
+ yyrestart( yyin );
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return 0;
+
+ if ( ! (yy_did_buffer_switch_on_eof) )
+ YY_NEW_FILE;
+#ifdef __cplusplus
+ return yyinput();
+#else
+ return input();
+#endif
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ (yy_c_buf_p) = (yytext_ptr) + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
+ (yy_hold_char) = *++(yy_c_buf_p);
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+ void yyrestart (FILE * input_file )
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack ();
+ YY_CURRENT_BUFFER_LVALUE =
+ yy_create_buffer( yyin, YY_BUF_SIZE );
+ }
+
+ yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+ yy_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * yypop_buffer_state();
+ * yypush_buffer_state(new_buffer);
+ */
+ yyensure_buffer_stack ();
+ if ( YY_CURRENT_BUFFER == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state( );
+
+ /* We don't actually know whether we did this switch during
+ * EOF (yywrap()) processing, but the only time this flag
+ * is looked at is after yywrap() is called, so it's safe
+ * to go ahead and always set it.
+ */
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state (void)
+{
+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+ (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_buf_size = size;
+
+ /* yy_ch_buf has to be 2 characters longer than the size given because
+ * we need to put in 2 end-of-buffer characters.
+ */
+ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) );
+ if ( ! b->yy_ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+ b->yy_is_our_buffer = 1;
+
+ yy_init_buffer( b, file );
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ *
+ */
+ void yy_delete_buffer (YY_BUFFER_STATE b )
+{
+
+ if ( ! b )
+ return;
+
+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+ if ( b->yy_is_our_buffer )
+ yyfree( (void *) b->yy_ch_buf );
+
+ yyfree( (void *) b );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
+
+{
+ int oerrno = errno;
+
+ yy_flush_buffer( b );
+
+ b->yy_input_file = file;
+ b->yy_fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from yyrestart() or through yy_get_next_buffer.
+ * In that case, we don't want to reset the lineno or column.
+ */
+ if (b != YY_CURRENT_BUFFER){
+ b->yy_bs_lineno = 1;
+ b->yy_bs_column = 0;
+ }
+
+ b->yy_is_interactive = 0;
+
+ errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+ void yy_flush_buffer (YY_BUFFER_STATE b )
+{
+ if ( ! b )
+ return;
+
+ b->yy_n_chars = 0;
+
+ /* We always need two end-of-buffer characters. The first causes
+ * a transition to the end-of-buffer state. The second causes
+ * a jam in that state.
+ */
+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->yy_buf_pos = &b->yy_ch_buf[0];
+
+ b->yy_at_bol = 1;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ * the current state. This function will allocate the stack
+ * if necessary.
+ * @param new_buffer The new state.
+ *
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack();
+
+ /* This block is copied from yy_switch_to_buffer. */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *(yy_c_buf_p) = (yy_hold_char);
+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+ }
+
+ /* Only push if top exists. Otherwise, replace top. */
+ if (YY_CURRENT_BUFFER)
+ (yy_buffer_stack_top)++;
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+ /* copied from yy_switch_to_buffer. */
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ *
+ */
+void yypop_buffer_state (void)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ yy_delete_buffer(YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if ((yy_buffer_stack_top) > 0)
+ --(yy_buffer_stack_top);
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state( );
+ (yy_did_buffer_switch_on_eof) = 1;
+ }
+}
+
+/* Allocates the stack if it does not exist.
+ * Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+ yy_size_t num_to_alloc;
+
+ if (!(yy_buffer_stack)) {
+
+ /* First allocation is just for 2 elements, since we don't know if this
+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
+ * immediate realloc on the next call.
+ */
+ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+ (num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+ (yy_buffer_stack_max) = num_to_alloc;
+ (yy_buffer_stack_top) = 0;
+ return;
+ }
+
+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+ /* Increase the buffer to prepare for a possible push. */
+ yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+ ((yy_buffer_stack),
+ num_to_alloc * sizeof(struct yy_buffer_state*)
+ );
+ if ( ! (yy_buffer_stack) )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+ /* zero only the new slots.*/
+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+ (yy_buffer_stack_max) = num_to_alloc;
+ }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return NULL;
+
+ b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) );
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+ b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */
+ b->yy_buf_pos = b->yy_ch_buf = base;
+ b->yy_is_our_buffer = 0;
+ b->yy_input_file = NULL;
+ b->yy_n_chars = b->yy_buf_size;
+ b->yy_is_interactive = 0;
+ b->yy_at_bol = 1;
+ b->yy_fill_buffer = 0;
+ b->yy_buffer_status = YY_BUFFER_NEW;
+
+ yy_switch_to_buffer( b );
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+
+ return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len )
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = (yy_size_t) (_yybytes_len + 2);
+ buf = (char *) yyalloc( n );
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+ for ( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = yy_scan_buffer( buf, n );
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->yy_is_our_buffer = 1;
+
+ return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+ fprintf( stderr, "%s\n", msg );
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+ do \
+ { \
+ /* Undo effects of setting up yytext. */ \
+ int yyless_macro_arg = (n); \
+ YY_LESS_LINENO(yyless_macro_arg);\
+ yytext[yyleng] = (yy_hold_char); \
+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
+ (yy_hold_char) = *(yy_c_buf_p); \
+ *(yy_c_buf_p) = '\0'; \
+ yyleng = yyless_macro_arg; \
+ } \
+ while ( 0 )
+
+/* Accessor methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int yyget_lineno (void)
+{
+
+ return yylineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *yyget_in (void)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *yyget_out (void)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int yyget_leng (void)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *yyget_text (void)
+{
+ return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ *
+ */
+void yyset_lineno (int _line_number )
+{
+
+ yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ *
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE * _in_str )
+{
+ yyin = _in_str ;
+}
+
+void yyset_out (FILE * _out_str )
+{
+ yyout = _out_str ;
+}
+
+int yyget_debug (void)
+{
+ return yy_flex_debug;
+}
+
+void yyset_debug (int _bdebug )
+{
+ yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from yylex_destroy(), so don't allocate here.
+ */
+
+ (yy_buffer_stack) = NULL;
+ (yy_buffer_stack_top) = 0;
+ (yy_buffer_stack_max) = 0;
+ (yy_c_buf_p) = NULL;
+ (yy_init) = 0;
+ (yy_start) = 0;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+ yyin = stdin;
+ yyout = stdout;
+#else
+ yyin = NULL;
+ yyout = NULL;
+#endif
+
+ /* For future reference: Set errno on error, since we are called by
+ * yylex_init()
+ */
+ return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy (void)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while(YY_CURRENT_BUFFER){
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ yypop_buffer_state();
+ }
+
+ /* Destroy the stack itself. */
+ yyfree((yy_buffer_stack) );
+ (yy_buffer_stack) = NULL;
+
+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
+ * yylex() is called, initialization will occur. */
+ yy_init_globals( );
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+
+ int i;
+ for ( i = 0; i < n; ++i )
+ s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+ int n;
+ for ( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *yyalloc (yy_size_t size )
+{
+ return malloc(size);
+}
+
+void *yyrealloc (void * ptr, yy_size_t size )
+{
+
+ /* The cast to (char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return realloc(ptr, size);
+}
+
+void yyfree (void * ptr )
+{
+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 167 "css.l"
+
+
diff --git a/src/exits.c b/src/exits.c
new file mode 100644
index 0000000..56a7eb7
--- /dev/null
+++ b/src/exits.c
@@ -0,0 +1,93 @@
+/* Exit status handling.
+ Copyright (C) 2009-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+ This file is part of GNU Wget.
+
+ GNU Wget 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.
+
+ GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "wget.h"
+#include "exits.h"
+
+static int final_exit_status = WGET_EXIT_SUCCESS;
+
+/* XXX: I don't like that newly-added uerr_t codes will doubtless fall
+ through the craccks, or the fact that we seem to have way more
+ codes than we know what to do with. Need to go through and sort
+ through the truly essential codes, and merge the rest with
+ those. Quite a few are never even used!
+
+ Quite a few of the codes below would have no business being
+ returned to retrieve_url's caller, but since it's very difficult to
+ determine which do and which don't, I grab virtually all of them to
+ be safe. */
+static int
+get_status_for_err (uerr_t err)
+{
+ switch (err)
+ {
+ case RETROK:
+ return WGET_EXIT_SUCCESS;
+ case FOPENERR: case FOPEN_EXCL_ERR: case FWRITEERR: case WRITEFAILED:
+ case UNLINKERR: case CLOSEFAILED: case FILEBADFILE:
+ return WGET_EXIT_IO_FAIL;
+ case NOCONERROR: case HOSTERR: case CONSOCKERR: case CONERROR:
+ case CONSSLERR: case CONIMPOSSIBLE: case FTPRERR: case FTPINVPASV:
+ case READERR: case TRYLIMEXC:
+ return WGET_EXIT_NETWORK_FAIL;
+ case VERIFCERTERR:
+ return WGET_EXIT_SSL_AUTH_FAIL;
+ case FTPLOGINC: case FTPLOGREFUSED: case AUTHFAILED:
+ return WGET_EXIT_SERVER_AUTH_FAIL;
+ case HEOF: case HERR: case ATTRMISSING:
+ return WGET_EXIT_PROTOCOL_ERROR;
+ case WRONGCODE: case FTPPORTERR: case FTPSYSERR:
+ case FTPNSFOD: case FTPUNKNOWNTYPE: case FTPSRVERR:
+ case FTPRETRINT: case FTPRESTFAIL: case FTPNOPASV:
+ case CONTNOTSUPPORTED: case RANGEERR: case RETRBADPATTERN:
+ case PROXERR: case GATEWAYTIMEOUT:
+ return WGET_EXIT_SERVER_ERROR;
+ case URLERROR: case QUOTEXC: case SSLINITFAILED: case UNKNOWNATTR:
+ default:
+ return WGET_EXIT_UNKNOWN;
+ }
+}
+
+/* inform_exit_status
+ *
+ * Ensure that Wget's exit status will reflect the problem indicated
+ * by ERR, unless the exit status has already been set to reflect a more
+ * important problem. */
+void
+inform_exit_status (uerr_t err)
+{
+ int new_status = get_status_for_err (err);
+
+ if (new_status != WGET_EXIT_SUCCESS
+ && (final_exit_status == WGET_EXIT_SUCCESS
+ || new_status < final_exit_status))
+ {
+ final_exit_status = new_status;
+ }
+}
+
+int
+get_exit_status (void)
+{
+ return
+ (final_exit_status == WGET_EXIT_UNKNOWN)
+ ? 1
+ : final_exit_status;
+}
diff --git a/src/exits.h b/src/exits.h
new file mode 100644
index 0000000..169ade1
--- /dev/null
+++ b/src/exits.h
@@ -0,0 +1,48 @@
+/* Exit status related declarations.
+ Copyright (C) 2009-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef WGET_EXITS_H
+#define WGET_EXITS_H
+
+#include "wget.h"
+
+/* Final exit code possibilities. Exit codes 1 and 2 are reserved
+ * for situations that lead to direct exits from Wget, not using the
+ * value of final_exit_status. */
+enum
+ {
+ WGET_EXIT_SUCCESS = 0,
+ WGET_EXIT_GENERIC_ERROR = 1,
+ WGET_EXIT_PARSE_ERROR = 2,
+ WGET_EXIT_IO_FAIL = 3,
+ WGET_EXIT_NETWORK_FAIL = 4,
+ WGET_EXIT_SSL_AUTH_FAIL = 5,
+ WGET_EXIT_SERVER_AUTH_FAIL = 6,
+ WGET_EXIT_PROTOCOL_ERROR = 7,
+ WGET_EXIT_SERVER_ERROR = 8,
+
+ WGET_EXIT_UNKNOWN
+ };
+
+void inform_exit_status (uerr_t err);
+
+int get_exit_status (void);
+
+
+#endif /* WGET_EXITS_H */
diff --git a/src/ftp-basic.c b/src/ftp-basic.c
new file mode 100644
index 0000000..197cd83
--- /dev/null
+++ b/src/ftp-basic.c
@@ -0,0 +1,1342 @@
+/* Basic FTP routines.
+ Copyright (C) 1996-2011, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <string.h>
+#include <unistd.h>
+#include "utils.h"
+#include "connect.h"
+#include "host.h"
+#include "ftp.h"
+#include "retr.h"
+#include "c-strcase.h"
+
+
+/* Get the response of FTP server and allocate enough room to handle
+ it. <CR> and <LF> characters are stripped from the line, and the
+ line is 0-terminated. All the response lines but the last one are
+ skipped. The last line is determined as described in RFC959.
+
+ If the line is successfully read, FTPOK is returned, and *ret_line
+ is assigned a freshly allocated line. Otherwise, FTPRERR is
+ returned, and the value of *ret_line should be ignored. */
+
+uerr_t
+ftp_response (int fd, char **ret_line)
+{
+ for (;;)
+ {
+ char *p;
+ char *line = fd_read_line (fd);
+ if (!line)
+ return FTPRERR;
+
+ /* Strip trailing CRLF before printing the line, so that
+ quoting doesn't include bogus \012 and \015. */
+ if ((p = strpbrk(line , "\r\n")))
+ *p = 0;
+
+ if (opt.server_response)
+ logprintf (LOG_NOTQUIET, "%s\n",
+ quotearg_style (escape_quoting_style, line));
+ else
+ DEBUGP (("%s\n", quotearg_style (escape_quoting_style, line)));
+
+ /* The last line of output is the one that begins with "ddd ". */
+ if (c_isdigit (line[0]) && c_isdigit (line[1]) && c_isdigit (line[2])
+ && line[3] == ' ')
+ {
+ *ret_line = line;
+ return FTPOK;
+ }
+ xfree (line);
+ }
+}
+
+/* Returns the malloc-ed FTP request, ending with <CR><LF>, printing
+ it if printing is required. If VALUE is NULL, just use
+ command<CR><LF>. */
+static char *
+ftp_request (const char *command, const char *value)
+{
+ char *res;
+
+ if (value)
+ {
+ char *defanged = NULL, buf[256];
+
+ /* Check for newlines in VALUE (possibly injected by the %0A URL
+ escape) making the callers inadvertently send multiple FTP
+ commands at once. Without this check an attacker could
+ intentionally redirect to ftp://server/fakedir%0Acommand.../
+ and execute arbitrary FTP command on a remote FTP server. */
+ if (strpbrk (value, "\r\n"))
+ {
+ /* Copy VALUE to the stack and modify CR/LF to space. */
+ char *p;
+ size_t len = strlen(value);
+
+ if (len < sizeof (buf))
+ defanged = buf;
+ else
+ defanged = xmalloc (len + 1);
+
+ memcpy (defanged, value, len + 1);
+
+ for (p = defanged; *p; p++)
+ if (*p == '\r' || *p == '\n')
+ *p = ' ';
+
+ DEBUGP (("\nDetected newlines in %s \"%s\"; changing to %s \"%s\"\n",
+ command, quotearg_style (escape_quoting_style, value),
+ command, quotearg_style (escape_quoting_style, defanged)));
+
+ /* Make VALUE point to the defanged copy of the string. */
+ value = defanged;
+ }
+ res = concat_strings (command, " ", value, "\r\n", (char *) 0);
+
+ if (defanged != buf)
+ xfree (defanged);
+ }
+ else
+ res = concat_strings (command, "\r\n", (char *) 0);
+ if (opt.server_response)
+ {
+ /* Hack: don't print out password. */
+ if (strncmp (res, "PASS", 4) != 0)
+ logprintf (LOG_ALWAYS, "--> %s\n", res);
+ else
+ logputs (LOG_ALWAYS, "--> PASS Turtle Power!\n\n");
+ }
+ else
+ DEBUGP (("\n--> %s\n", res));
+ return res;
+}
+
+uerr_t
+ftp_greeting (int csock)
+{
+ uerr_t err = FTPOK;
+ char *response = NULL;
+
+ err = ftp_response (csock, &response);
+ if (err != FTPOK)
+ goto bail;
+ if (*response != '2')
+ err = FTPSRVERR;
+
+bail:
+ if (response)
+ xfree (response);
+ return err;
+}
+/* Sends the USER and PASS commands to the server, to control
+ connection socket csock. */
+uerr_t
+ftp_login (int csock, const char *acc, const char *pass)
+{
+ uerr_t err;
+ char *request, *respline;
+ int nwritten;
+
+ /* Send USER username. */
+ request = ftp_request ("USER", acc);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ /* An unprobable possibility of logging without a password. */
+ if (*respline == '2')
+ {
+ xfree (respline);
+ return FTPOK;
+ }
+ /* Else, only response 3 is appropriate. */
+ if (*respline != '3')
+ {
+ xfree (respline);
+ return FTPLOGREFUSED;
+ }
+#ifdef ENABLE_OPIE
+ {
+ static const char *skey_head[] = {
+ "331 s/key ",
+ "331 opiekey "
+ };
+ size_t i;
+ const char *seed = NULL;
+
+ for (i = 0; i < countof (skey_head); i++)
+ {
+ int l = strlen (skey_head[i]);
+ if (0 == c_strncasecmp (skey_head[i], respline, l))
+ {
+ seed = respline + l;
+ break;
+ }
+ }
+ if (seed)
+ {
+ int skey_sequence = 0;
+
+ /* Extract the sequence from SEED. */
+ for (; c_isdigit (*seed); seed++)
+ skey_sequence = 10 * skey_sequence + *seed - '0';
+ if (*seed == ' ')
+ ++seed;
+ else
+ {
+ xfree (respline);
+ return FTPLOGREFUSED;
+ }
+ /* Replace the password with the SKEY response to the
+ challenge. */
+ pass = skey_response (skey_sequence, seed, pass);
+ }
+ }
+#endif /* ENABLE_OPIE */
+ xfree (respline);
+ /* Send PASS password. */
+ request = ftp_request ("PASS", pass);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPLOGINC;
+ }
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+static void
+ip_address_to_port_repr (const ip_address *addr, int port, char *buf,
+ size_t buflen)
+{
+ unsigned char *ptr;
+
+ assert (addr->family == AF_INET);
+ /* buf must contain the argument of PORT (of the form a,b,c,d,e,f). */
+ assert (buflen >= 6 * 4);
+
+ ptr = IP_INADDR_DATA (addr);
+ snprintf (buf, buflen, "%d,%d,%d,%d,%d,%d", ptr[0], ptr[1],
+ ptr[2], ptr[3], (port & 0xff00) >> 8, port & 0xff);
+ buf[buflen - 1] = '\0';
+}
+
+/* Bind a port and send the appropriate PORT command to the FTP
+ server. Use acceptport after RETR, to get the socket of data
+ connection. */
+uerr_t
+ftp_port (int csock, int *local_sock)
+{
+ uerr_t err;
+ char *request, *respline;
+ ip_address addr;
+ int nwritten;
+ int port;
+ /* Must contain the argument of PORT (of the form a,b,c,d,e,f). */
+ char bytes[6 * 4 + 1];
+
+ /* Get the address of this side of the connection. */
+ if (!socket_ip_address (csock, &addr, ENDPOINT_LOCAL))
+ return FTPSYSERR;
+
+ assert (addr.family == AF_INET);
+
+ /* Setting port to 0 lets the system choose a free port. */
+ port = 0;
+
+ /* Bind the port. */
+ *local_sock = bind_local (&addr, &port);
+ if (*local_sock < 0)
+ return FTPSYSERR;
+
+ /* Construct the argument of PORT (of the form a,b,c,d,e,f). */
+ ip_address_to_port_repr (&addr, port, bytes, sizeof (bytes));
+
+ /* Send PORT request. */
+ request = ftp_request ("PORT", bytes);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ fd_close (*local_sock);
+ return WRITEFAILED;
+ }
+ xfree (request);
+
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ {
+ fd_close (*local_sock);
+ return err;
+ }
+ if (*respline != '2')
+ {
+ xfree (respline);
+ fd_close (*local_sock);
+ return FTPPORTERR;
+ }
+ xfree (respline);
+ return FTPOK;
+}
+
+#ifdef ENABLE_IPV6
+static void
+ip_address_to_lprt_repr (const ip_address *addr, int port, char *buf,
+ size_t buflen)
+{
+ unsigned char *ptr = IP_INADDR_DATA (addr);
+
+ /* buf must contain the argument of LPRT (of the form af,n,h1,h2,...,hn,p1,p2). */
+ assert (buflen >= 21 * 4);
+
+ /* Construct the argument of LPRT (of the form af,n,h1,h2,...,hn,p1,p2). */
+ switch (addr->family)
+ {
+ case AF_INET:
+ snprintf (buf, buflen, "%d,%d,%d,%d,%d,%d,%d,%d,%d", 4, 4,
+ ptr[0], ptr[1], ptr[2], ptr[3], 2,
+ (port & 0xff00) >> 8, port & 0xff);
+ break;
+ case AF_INET6:
+ snprintf (buf, buflen,
+ "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+ 6, 16,
+ ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7],
+ ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15],
+ 2, (port & 0xff00) >> 8, port & 0xff);
+ break;
+ default:
+ abort ();
+ }
+}
+
+/* Bind a port and send the appropriate PORT command to the FTP
+ server. Use acceptport after RETR, to get the socket of data
+ connection. */
+uerr_t
+ftp_lprt (int csock, int *local_sock)
+{
+ uerr_t err;
+ char *request, *respline;
+ ip_address addr;
+ int nwritten;
+ int port;
+ /* Must contain the argument of LPRT (of the form af,n,h1,h2,...,hn,p1,p2). */
+ char bytes[21 * 4 + 1];
+
+ /* Get the address of this side of the connection. */
+ if (!socket_ip_address (csock, &addr, ENDPOINT_LOCAL))
+ return FTPSYSERR;
+
+ assert (addr.family == AF_INET || addr.family == AF_INET6);
+
+ /* Setting port to 0 lets the system choose a free port. */
+ port = 0;
+
+ /* Bind the port. */
+ *local_sock = bind_local (&addr, &port);
+ if (*local_sock < 0)
+ return FTPSYSERR;
+
+ /* Construct the argument of LPRT (of the form af,n,h1,h2,...,hn,p1,p2). */
+ ip_address_to_lprt_repr (&addr, port, bytes, sizeof (bytes));
+
+ /* Send PORT request. */
+ request = ftp_request ("LPRT", bytes);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ fd_close (*local_sock);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ {
+ fd_close (*local_sock);
+ return err;
+ }
+ if (*respline != '2')
+ {
+ xfree (respline);
+ fd_close (*local_sock);
+ return FTPPORTERR;
+ }
+ xfree (respline);
+ return FTPOK;
+}
+
+static void
+ip_address_to_eprt_repr (const ip_address *addr, int port, char *buf,
+ size_t buflen)
+{
+ int afnum;
+
+ /* buf must contain the argument of EPRT (of the form |af|addr|port|).
+ * 4 chars for the | separators, INET6_ADDRSTRLEN chars for addr
+ * 1 char for af (1-2) and 5 chars for port (0-65535) */
+ assert (buflen >= 4 + INET6_ADDRSTRLEN + 1 + 5);
+
+ /* Construct the argument of EPRT (of the form |af|addr|port|). */
+ afnum = (addr->family == AF_INET ? 1 : 2);
+ snprintf (buf, buflen, "|%d|%s|%d|", afnum, print_address (addr), port);
+ buf[buflen - 1] = '\0';
+}
+
+/* Bind a port and send the appropriate PORT command to the FTP
+ server. Use acceptport after RETR, to get the socket of data
+ connection. */
+uerr_t
+ftp_eprt (int csock, int *local_sock)
+{
+ uerr_t err;
+ char *request, *respline;
+ ip_address addr;
+ int nwritten;
+ int port;
+ /* Must contain the argument of EPRT (of the form |af|addr|port|).
+ * 4 chars for the | separators, INET6_ADDRSTRLEN chars for addr
+ * 1 char for af (1-2) and 5 chars for port (0-65535) */
+ char bytes[4 + INET6_ADDRSTRLEN + 1 + 5 + 1];
+
+ /* Get the address of this side of the connection. */
+ if (!socket_ip_address (csock, &addr, ENDPOINT_LOCAL))
+ return FTPSYSERR;
+
+ /* Setting port to 0 lets the system choose a free port. */
+ port = 0;
+
+ /* Bind the port. */
+ *local_sock = bind_local (&addr, &port);
+ if (*local_sock < 0)
+ return FTPSYSERR;
+
+ /* Construct the argument of EPRT (of the form |af|addr|port|). */
+ ip_address_to_eprt_repr (&addr, port, bytes, sizeof (bytes));
+
+ /* Send PORT request. */
+ request = ftp_request ("EPRT", bytes);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ fd_close (*local_sock);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ {
+ fd_close (*local_sock);
+ return err;
+ }
+ if (*respline != '2')
+ {
+ xfree (respline);
+ fd_close (*local_sock);
+ return FTPPORTERR;
+ }
+ xfree (respline);
+ return FTPOK;
+}
+#endif
+
+#ifdef HAVE_SSL
+/*
+ * The following three functions defined into this #ifdef block
+ * wrap the extended FTP commands defined in RFC 2228 (FTP Security Extensions).
+ * Currently, only FTPS is supported, so these functions are only compiled when SSL
+ * support is available, because there's no point in using FTPS when there's no SSL.
+ * Shall someone add new secure FTP protocols in the future, feel free to remove this
+ * #ifdef, or add new constants to it.
+ */
+
+/*
+ * Sends an AUTH command as defined by RFC 2228,
+ * deriving its argument from the scheme. For example, if the provided scheme
+ * is SCHEME_FTPS, the command sent will be "AUTH TLS". Currently, this is the only
+ * scheme supported, so this function will return FTPNOAUTH when supplied a different
+ * one. It will also return FTPNOAUTH if the target server does not support FTPS.
+ */
+uerr_t
+ftp_auth (int csock, enum url_scheme scheme)
+{
+ uerr_t err = 0;
+ int written = 0;
+ char *request = NULL, *response = NULL;
+
+ if (scheme == SCHEME_FTPS)
+ {
+ request = ftp_request ("AUTH", "TLS");
+ written = fd_write (csock, request, strlen (request), -1);
+ if (written < 0)
+ {
+ err = WRITEFAILED;
+ goto bail;
+ }
+ err = ftp_response (csock, &response);
+ if (err != FTPOK)
+ goto bail;
+ if (*response != '2')
+ err = FTPNOAUTH;
+ }
+ else
+ err = FTPNOAUTH;
+
+bail:
+ xfree (request);
+ xfree (response);
+
+ return err;
+}
+
+uerr_t
+ftp_pbsz (int csock, int pbsz)
+{
+ uerr_t err = 0;
+ int written = 0;
+ char spbsz[5];
+ char *request = NULL, *response = NULL;
+
+ snprintf (spbsz, 5, "%d", pbsz);
+ request = ftp_request ("PBSZ", spbsz);
+ written = fd_write (csock, request, strlen (request), -1);
+ if (written < 0)
+ {
+ err = WRITEFAILED;
+ goto bail;
+ }
+
+ err = ftp_response (csock, &response);
+ if (err != FTPOK)
+ goto bail;
+ if (*response != '2')
+ err = FTPNOPBSZ;
+
+bail:
+ xfree (request);
+ xfree (response);
+
+ return err;
+}
+
+uerr_t
+ftp_prot (int csock, enum prot_level prot)
+{
+ uerr_t err = 0;
+ int written = 0;
+ char *request = NULL, *response = NULL;
+ /* value must be a single character value */
+ char value[2];
+
+ value[0] = prot;
+ value[1] = '\0';
+
+ request = ftp_request ("PROT", value);
+ written = fd_write (csock, request, strlen (request), -1);
+ if (written < 0)
+ {
+ err = WRITEFAILED;
+ goto bail;
+ }
+
+ err = ftp_response (csock, &response);
+ if (err != FTPOK)
+ goto bail;
+ if (*response != '2')
+ err = FTPNOPROT;
+
+bail:
+ xfree (request);
+ xfree (response);
+
+ return err;
+}
+#endif /* HAVE_SSL */
+
+/* Similar to ftp_port, but uses `PASV' to initiate the passive FTP
+ transfer. Reads the response from server and parses it. Reads the
+ host and port addresses and returns them. */
+uerr_t
+ftp_pasv (int csock, ip_address *addr, int *port)
+{
+ char *request, *respline, *s;
+ int nwritten, i;
+ uerr_t err;
+ unsigned char tmp[6];
+
+ assert (addr != NULL);
+ assert (port != NULL);
+
+ xzero (*addr);
+
+ /* Form the request. */
+ request = ftp_request ("PASV", NULL);
+ /* And send it. */
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get the server response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPNOPASV;
+ }
+ /* Parse the request. */
+ s = respline;
+ for (s += 4; *s && !c_isdigit (*s); s++)
+ ;
+ if (!*s)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+ for (i = 0; i < 6; i++)
+ {
+ tmp[i] = 0;
+ for (; c_isdigit (*s); s++)
+ tmp[i] = (*s - '0') + 10 * tmp[i];
+ if (*s == ',')
+ s++;
+ else if (i < 5)
+ {
+ /* When on the last number, anything can be a terminator. */
+ xfree (respline);
+ return FTPINVPASV;
+ }
+ }
+ xfree (respline);
+
+ addr->family = AF_INET;
+ memcpy (IP_INADDR_DATA (addr), tmp, 4);
+ *port = ((tmp[4] << 8) & 0xff00) + tmp[5];
+
+ return FTPOK;
+}
+
+#ifdef ENABLE_IPV6
+/* Similar to ftp_lprt, but uses `LPSV' to initiate the passive FTP
+ transfer. Reads the response from server and parses it. Reads the
+ host and port addresses and returns them. */
+uerr_t
+ftp_lpsv (int csock, ip_address *addr, int *port)
+{
+ char *request, *respline, *s;
+ int nwritten, i, af, addrlen, portlen;
+ uerr_t err;
+ unsigned char tmp[16];
+ unsigned char tmpprt[2];
+
+ assert (addr != NULL);
+ assert (port != NULL);
+
+ xzero (*addr);
+
+ /* Form the request. */
+ request = ftp_request ("LPSV", NULL);
+
+ /* And send it. */
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+
+ /* Get the server response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPNOPASV;
+ }
+
+ /* Parse the response. */
+ s = respline;
+ for (s += 4; *s && !c_isdigit (*s); s++)
+ ;
+ if (!*s)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ /* First, get the address family */
+ af = 0;
+ for (; c_isdigit (*s); s++)
+ af = (*s - '0') + 10 * af;
+
+ if (af != 4 && af != 6)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ if (!*s || *s++ != ',')
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ /* Then, get the address length */
+ addrlen = 0;
+ for (; c_isdigit (*s); s++)
+ addrlen = (*s - '0') + 10 * addrlen;
+
+ if (!*s || *s++ != ',')
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ if (addrlen > 16)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ if ((af == 4 && addrlen != 4)
+ || (af == 6 && addrlen != 16))
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ /* Now, we get the actual address */
+ for (i = 0; i < addrlen; i++)
+ {
+ tmp[i] = 0;
+ for (; c_isdigit (*s); s++)
+ tmp[i] = (*s - '0') + 10 * tmp[i];
+ if (*s == ',')
+ s++;
+ else
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+ }
+
+ /* Now, get the port length */
+ portlen = 0;
+ for (; c_isdigit (*s); s++)
+ portlen = (*s - '0') + 10 * portlen;
+
+ if (!*s || *s++ != ',')
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ if (portlen > 2)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ /* Finally, we get the port number */
+ tmpprt[0] = 0;
+ for (; c_isdigit (*s); s++)
+ tmpprt[0] = (*s - '0') + 10 * tmpprt[0];
+
+ if (!*s || *s++ != ',')
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ tmpprt[1] = 0;
+ for (; c_isdigit (*s); s++)
+ tmpprt[1] = (*s - '0') + 10 * tmpprt[1];
+
+ assert (s != NULL);
+
+ if (af == 4)
+ {
+ addr->family = AF_INET;
+ memcpy (IP_INADDR_DATA (addr), tmp, 4);
+ *port = ((tmpprt[0] << 8) & 0xff00) + tmpprt[1];
+ DEBUGP (("lpsv addr is: %s\n", print_address(addr)));
+ DEBUGP (("tmpprt[0] is: %d\n", tmpprt[0]));
+ DEBUGP (("tmpprt[1] is: %d\n", tmpprt[1]));
+ DEBUGP (("*port is: %d\n", *port));
+ }
+ else
+ {
+ assert (af == 6);
+ addr->family = AF_INET6;
+ memcpy (IP_INADDR_DATA (addr), tmp, 16);
+ *port = ((tmpprt[0] << 8) & 0xff00) + tmpprt[1];
+ DEBUGP (("lpsv addr is: %s\n", print_address(addr)));
+ DEBUGP (("tmpprt[0] is: %d\n", tmpprt[0]));
+ DEBUGP (("tmpprt[1] is: %d\n", tmpprt[1]));
+ DEBUGP (("*port is: %d\n", *port));
+ }
+
+ xfree (respline);
+ return FTPOK;
+}
+
+/* Similar to ftp_eprt, but uses `EPSV' to initiate the passive FTP
+ transfer. Reads the response from server and parses it. Reads the
+ host and port addresses and returns them. */
+uerr_t
+ftp_epsv (int csock, ip_address *ip, int *port)
+{
+ char *request, *respline, *start, delim, *s;
+ int nwritten, i;
+ uerr_t err;
+ int tport;
+
+ assert (ip != NULL);
+ assert (port != NULL);
+
+ /* IP already contains the IP address of the control connection's
+ peer, so we don't need to call socket_ip_address here. */
+
+ /* Form the request. */
+ /* EPSV 1 means that we ask for IPv4 and EPSV 2 means that we ask for IPv6. */
+ request = ftp_request ("EPSV", (ip->family == AF_INET ? "1" : "2"));
+
+ /* And send it. */
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+
+ /* Get the server response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPNOPASV;
+ }
+
+ assert (respline != NULL);
+
+ DEBUGP(("respline is %s\n", respline));
+
+ /* Skip the useless stuff and get what's inside the parentheses */
+ start = strchr (respline, '(');
+ if (start == NULL)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ /* Skip the first two void fields */
+ s = start + 1;
+ delim = *s++;
+ if (delim < 33 || delim > 126)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ if (*s++ != delim)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+ }
+
+ /* Finally, get the port number */
+ for (tport = 0, i = 0; i < 5 && c_isdigit (*s); i++, s++)
+ tport = (*s - '0') + 10 * tport;
+
+ /* Make sure that the response terminates correctly */
+ if (*s++ != delim)
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ if (*s != ')')
+ {
+ xfree (respline);
+ return FTPINVPASV;
+ }
+
+ *port = tport;
+
+ xfree (respline);
+ return FTPOK;
+}
+#endif
+
+/* Sends the TYPE request to the server. */
+uerr_t
+ftp_type (int csock, int type)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+ char stype[2];
+
+ /* Construct argument. */
+ stype[0] = type;
+ stype[1] = 0;
+ /* Send TYPE request. */
+ request = ftp_request ("TYPE", stype);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPUNKNOWNTYPE;
+ }
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Changes the working directory by issuing a CWD command to the
+ server. */
+uerr_t
+ftp_cwd (int csock, const char *dir)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ /* Send CWD request. */
+ request = ftp_request ("CWD", dir);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline == '5')
+ {
+ xfree (respline);
+ return FTPNSFOD;
+ }
+ if (*respline != '2')
+ {
+ xfree (respline);
+ return FTPRERR;
+ }
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Sends REST command to the FTP server. */
+uerr_t
+ftp_rest (int csock, wgint offset)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ request = ftp_request ("REST", number_to_static_string (offset));
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline != '3')
+ {
+ xfree (respline);
+ return FTPRESTFAIL;
+ }
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Sends RETR command to the FTP server. */
+uerr_t
+ftp_retr (int csock, const char *file)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ /* Send RETR request. */
+ request = ftp_request ("RETR", file);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline == '5')
+ {
+ xfree (respline);
+ return FTPNSFOD;
+ }
+ if (*respline != '1')
+ {
+ xfree (respline);
+ return FTPRERR;
+ }
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Sends the LIST command to the server. If FILE is NULL, send just
+ `LIST' (no space). */
+uerr_t
+ftp_list (int csock, const char *file, bool avoid_list_a, bool avoid_list,
+ bool *list_a_used)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+ bool ok = false;
+ size_t i = 0;
+
+ /* 2013-10-12 Andrea Urbani (matfanjol)
+ For more information about LIST and "LIST -a" please look at ftp.c,
+ function getftp, text "__LIST_A_EXPLANATION__".
+
+ If somebody changes the following commands, please, checks also the
+ later "i" variable. */
+ static const char *list_commands[] = {
+ "LIST -a",
+ "LIST"
+ };
+
+ *list_a_used = false;
+
+ if (avoid_list_a)
+ {
+ i = countof (list_commands)- 1;
+ DEBUGP (("(skipping \"LIST -a\")"));
+ }
+
+
+ do {
+ /* Send request. */
+ request = ftp_request (list_commands[i], file);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err == FTPOK)
+ {
+ if (*respline == '5')
+ {
+ err = FTPNSFOD;
+ }
+ else if (*respline == '1')
+ {
+ err = FTPOK;
+ ok = true;
+ /* Which list command was used? */
+ *list_a_used = (i == 0);
+ }
+ else
+ {
+ err = FTPRERR;
+ }
+ xfree (respline);
+ }
+ ++i;
+ if ((avoid_list) && (i == 1))
+ {
+ /* I skip LIST */
+ ++i;
+ DEBUGP (("(skipping \"LIST\")"));
+ }
+ } while (i < countof (list_commands) && !ok);
+
+ return err;
+}
+
+/* Sends the SYST command to the server. */
+uerr_t
+ftp_syst (int csock, enum stype *server_type, enum ustype *unix_type)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+ char *ftp_last_respline;
+
+ /* Send SYST request. */
+ request = ftp_request ("SYST", NULL);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline == '5')
+ {
+ xfree (respline);
+ return FTPSRVERR;
+ }
+
+ ftp_last_respline = strdup (respline);
+
+ /* Skip the number (215, but 200 (!!!) in case of VMS) */
+ strtok (respline, " ");
+
+ /* Which system type has been reported (we are interested just in the
+ first word of the server response)? */
+ request = strtok (NULL, " ");
+
+ *unix_type = UST_OTHER;
+
+ if (request == NULL)
+ *server_type = ST_OTHER;
+ else if (!c_strcasecmp (request, "VMS"))
+ *server_type = ST_VMS;
+ else if (!c_strcasecmp (request, "UNIX"))
+ {
+ *server_type = ST_UNIX;
+ /* 2013-10-17 Andrea Urbani (matfanjol)
+ I check more in depth the system type */
+ if (!c_strncasecmp (ftp_last_respline, "215 UNIX Type: L8", 17))
+ *unix_type = UST_TYPE_L8;
+ else if (!c_strncasecmp (ftp_last_respline,
+ "215 UNIX MultiNet Unix Emulation V5.3(93)", 41))
+ *unix_type = UST_MULTINET;
+ }
+ else if (!c_strcasecmp (request, "WINDOWS_NT")
+ || !c_strcasecmp (request, "WINDOWS2000"))
+ *server_type = ST_WINNT;
+ else if (!c_strcasecmp (request, "MACOS"))
+ *server_type = ST_MACOS;
+ else if (!c_strcasecmp (request, "OS/400"))
+ *server_type = ST_OS400;
+ else
+ *server_type = ST_OTHER;
+
+ xfree (ftp_last_respline);
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Sends the PWD command to the server. */
+uerr_t
+ftp_pwd (int csock, char **pwd)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ /* Send PWD request. */
+ request = ftp_request ("PWD", NULL);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ return err;
+ if (*respline == '5')
+ {
+ err:
+ xfree (respline);
+ return FTPSRVERR;
+ }
+
+ /* Skip the number (257), leading citation mark, trailing citation mark
+ and everything following it. */
+ strtok (respline, "\"");
+ request = strtok (NULL, "\"");
+ if (!request)
+ /* Treat the malformed response as an error, which the caller has
+ to handle gracefully anyway. */
+ goto err;
+
+ /* Has the `pwd' been already allocated? Free! */
+ xfree (*pwd);
+
+ *pwd = xstrdup (request);
+
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* Sends the SIZE command to the server, and returns the value in 'size'.
+ * If an error occurs, size is set to zero. */
+uerr_t
+ftp_size (int csock, const char *file, wgint *size)
+{
+ char *request, *respline;
+ int nwritten;
+ uerr_t err;
+
+ /* Send PWD request. */
+ request = ftp_request ("SIZE", file);
+ nwritten = fd_write (csock, request, strlen (request), -1);
+ if (nwritten < 0)
+ {
+ xfree (request);
+ *size = 0;
+ return WRITEFAILED;
+ }
+ xfree (request);
+ /* Get appropriate response. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ {
+ *size = 0;
+ return err;
+ }
+ if (*respline == '5')
+ {
+ /*
+ * Probably means SIZE isn't supported on this server.
+ * Error is nonfatal since SIZE isn't in RFC 959
+ */
+ xfree (respline);
+ *size = 0;
+ return FTPOK;
+ }
+
+ errno = 0;
+ *size = str_to_wgint (respline + 4, NULL, 10);
+ if (errno)
+ {
+ /*
+ * Couldn't parse the response for some reason. On the (few)
+ * tests I've done, the response is 213 <SIZE> with nothing else -
+ * maybe something a bit more resilient is necessary. It's not a
+ * fatal error, however.
+ */
+ xfree (respline);
+ *size = 0;
+ return FTPOK;
+ }
+
+ xfree (respline);
+ /* All OK. */
+ return FTPOK;
+}
+
+/* If URL's params are of the form "type=X", return character X.
+ Otherwise, return 'I' (the default type). */
+char
+ftp_process_type (const char *params)
+{
+ if (params
+ && 0 == strncasecmp (params, "type=", 5)
+ && params[5] != '\0')
+ return c_toupper (params[5]);
+ else
+ return 'I';
+}
diff --git a/src/ftp-ls.c b/src/ftp-ls.c
new file mode 100644
index 0000000..bb25754
--- /dev/null
+++ b/src/ftp-ls.c
@@ -0,0 +1,1175 @@
+/* Parsing FTP `ls' output.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <time.h>
+#include "utils.h"
+#include "ftp.h"
+#include "url.h"
+#include "convert.h" /* for html_quote_string prototype */
+#include "retr.h" /* for output_stream */
+#include "c-strcase.h"
+
+/* Converts symbolic permissions to number-style ones, e.g. string
+ rwxr-xr-x to 755. For now, it knows nothing of
+ setuid/setgid/sticky. ACLs are ignored. */
+static int
+symperms (const char *s)
+{
+ int perms = 0, i;
+
+ if (strlen (s) < 9)
+ return 0;
+ for (i = 0; i < 3; i++, s += 3)
+ {
+ perms <<= 3;
+ perms += (((s[0] == 'r') << 2) + ((s[1] == 'w') << 1) +
+ (s[2] == 'x' || s[2] == 's'));
+ }
+ return perms;
+}
+
+
+/* Cleans a line of text so that it can be consistently parsed. Destroys
+ <CR> and <LF> in case that they occur at the end of the line and
+ replaces all <TAB> character with <SPACE>. Returns the length of the
+ modified line. */
+static int
+clean_line (char *line, int len)
+{
+ if (len <= 0) return 0;
+
+ while (len > 0 && (line[len - 1] == '\n' || line[len - 1] == '\r'))
+ line[--len] = '\0';
+
+ if (!len) return 0;
+
+ for ( ; *line ; line++ ) if (*line == '\t') *line = ' ';
+
+ return len;
+}
+
+/* Convert the Un*x-ish style directory listing stored in FILE to a
+ linked list of fileinfo (system-independent) entries. The contents
+ of FILE are considered to be produced by the standard Unix `ls -la'
+ output (whatever that might be). BSD (no group) and SYSV (with
+ group) listings are handled.
+
+ The time stamps are stored in a separate variable, time_t
+ compatible (I hope). The timezones are ignored. */
+static struct fileinfo *
+ftp_parse_unix_ls (FILE *fp, int ignore_perms)
+{
+ static const char *months[] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+ int next, len, i, error, ignore;
+ int year, month, day; /* for time analysis */
+ int hour, min, sec, ptype;
+ struct tm timestruct, *tnow;
+ time_t timenow;
+ size_t bufsize = 0;
+
+ char *line = NULL, *tok, *ptok; /* tokenizer */
+ struct fileinfo *dir, *l, cur; /* list creation */
+
+ dir = l = NULL;
+
+ /* Line loop to end of file: */
+ while ((len = getline (&line, &bufsize, fp)) > 0)
+ {
+ len = clean_line (line, len);
+ /* Skip if total... */
+ if (!c_strncasecmp (line, "total", 5))
+ continue;
+ /* Get the first token (permissions). */
+ tok = strtok (line, " ");
+ if (!tok)
+ continue;
+
+ cur.name = NULL;
+ cur.linkto = NULL;
+
+ /* Decide whether we deal with a file or a directory. */
+ switch (*tok)
+ {
+ case '-':
+ cur.type = FT_PLAINFILE;
+ DEBUGP (("PLAINFILE; "));
+ break;
+ case 'd':
+ cur.type = FT_DIRECTORY;
+ DEBUGP (("DIRECTORY; "));
+ break;
+ case 'l':
+ cur.type = FT_SYMLINK;
+ DEBUGP (("SYMLINK; "));
+ break;
+ default:
+ cur.type = FT_UNKNOWN;
+ DEBUGP (("UNKNOWN; "));
+ break;
+ }
+
+ if (ignore_perms)
+ {
+ switch (cur.type)
+ {
+ case FT_PLAINFILE:
+ cur.perms = 0644;
+ break;
+ case FT_DIRECTORY:
+ cur.perms = 0755;
+ break;
+ default:
+ /*cur.perms = 1023;*/ /* #### What is this? --hniksic */
+ cur.perms = 0644;
+ }
+ DEBUGP (("implicit perms %0o; ", (unsigned) cur.perms));
+ }
+ else
+ {
+ cur.perms = symperms (tok + 1);
+ DEBUGP (("perms %0o; ", (unsigned) cur.perms));
+ }
+
+ error = ignore = 0; /* Erroneous and ignoring entries are
+ treated equally for now. */
+ year = hour = min = sec = 0; /* Silence the compiler. */
+ month = day = 0;
+ ptype = TT_DAY;
+ next = -1;
+ /* While there are tokens on the line, parse them. Next is the
+ number of tokens left until the filename.
+
+ Use the month-name token as the "anchor" (the place where the
+ position wrt the file name is "known"). When a month name is
+ encountered, `next' is set to 5. Also, the preceding
+ characters are parsed to get the file size.
+
+ This tactic is quite dubious when it comes to
+ internationalization issues (non-English month names), but it
+ works for now. */
+ tok = line;
+ while (ptok = tok,
+ (tok = strtok (NULL, " ")) != NULL)
+ {
+ --next;
+ if (next < 0) /* a month name was not encountered */
+ {
+ for (i = 0; i < 12; i++)
+ if (!c_strcasecmp (tok, months[i]))
+ break;
+ /* If we got a month, it means the token before it is the
+ size, and the filename is three tokens away. */
+ if (i != 12)
+ {
+ wgint size;
+
+ /* Parse the previous token with str_to_wgint. */
+ if (ptok == line)
+ {
+ /* Something has gone wrong during parsing. */
+ error = 1;
+ break;
+ }
+ errno = 0;
+ size = str_to_wgint (ptok, NULL, 10);
+ if (size == WGINT_MAX && errno == ERANGE)
+ /* Out of range -- ignore the size. #### Should
+ we refuse to start the download. */
+ cur.size = 0;
+ else
+ cur.size = size;
+ DEBUGP (("size: %s; ", number_to_static_string(cur.size)));
+
+ month = i;
+ next = 5;
+ DEBUGP (("month: %s; ", months[month]));
+ }
+ }
+ else if (next == 4) /* days */
+ {
+ if (tok[1]) /* two-digit... */
+ day = 10 * (*tok - '0') + tok[1] - '0';
+ else /* ...or one-digit */
+ day = *tok - '0';
+ DEBUGP (("day: %d; ", day));
+ }
+ else if (next == 3)
+ {
+ /* This ought to be either the time, or the year. Let's
+ be flexible!
+
+ If we have a number x, it's a year. If we have x:y,
+ it's hours and minutes. If we have x:y:z, z are
+ seconds. */
+ year = 0;
+ min = hour = sec = 0;
+ /* We must deal with digits. */
+ if (c_isdigit (*tok))
+ {
+ /* Suppose it's year. Limit to year 99999 to avoid integer overflow. */
+ for (; c_isdigit (*tok) && year <= 99999; tok++)
+ year = (*tok - '0') + 10 * year;
+ if (*tok == ':')
+ {
+ int n;
+ /* This means these were hours! */
+ hour = year;
+ year = 0;
+ ptype = TT_HOUR_MIN;
+ ++tok;
+ /* Get the minutes... */
+ for (n = 0; c_isdigit (*tok) && n < 2; tok++, n++)
+ min = (*tok - '0') + 10 * min;
+ if (*tok == ':')
+ {
+ /* ...and the seconds. */
+ ++tok;
+ for (n = 0; c_isdigit (*tok) && n < 2; tok++, n++)
+ sec = (*tok - '0') + 10 * sec;
+ }
+ }
+ }
+ if (year)
+ DEBUGP (("year: %d (no tm); ", year));
+ else
+ DEBUGP (("time: %02d:%02d:%02d (no yr); ", hour, min, sec));
+ }
+ else if (next == 2) /* The file name */
+ {
+ int fnlen;
+ char *p;
+
+ /* Since the file name may contain a SPC, it is possible
+ for strtok to handle it wrong. */
+ fnlen = strlen (tok);
+ if (fnlen < len - (tok - line))
+ {
+ /* So we have a SPC in the file name. Restore the
+ original. */
+ tok[fnlen] = ' ';
+ /* If the file is a symbolic link, it should have a
+ ` -> ' somewhere. */
+ if (cur.type == FT_SYMLINK)
+ {
+ p = strstr (tok, " -> ");
+ if (!p)
+ {
+ error = 1;
+ break;
+ }
+ cur.linkto = xstrdup (p + 4);
+ DEBUGP (("link to: %s\n", cur.linkto));
+ /* And separate it from the file name. */
+ *p = '\0';
+ }
+ }
+ /* If we have the filename, add it to the list of files or
+ directories. */
+ /* "." and ".." are an exception! */
+ if (!strcmp (tok, ".") || !strcmp (tok, ".."))
+ {
+ DEBUGP (("\nIgnoring `.' and `..'; "));
+ ignore = 1;
+ break;
+ }
+ /* Some FTP sites choose to have ls -F as their default
+ LIST output, which marks the symlinks with a trailing
+ `@', directory names with a trailing `/' and
+ executables with a trailing `*'. This is no problem
+ unless encountering a symbolic link ending with `@',
+ or an executable ending with `*' on a server without
+ default -F output. I believe these cases are very
+ rare. */
+ fnlen = strlen (tok); /* re-calculate `fnlen' */
+ cur.name = xmalloc (fnlen + 1);
+ memcpy (cur.name, tok, fnlen + 1);
+ if (fnlen)
+ {
+ if (cur.type == FT_DIRECTORY && cur.name[fnlen - 1] == '/')
+ {
+ cur.name[fnlen - 1] = '\0';
+ DEBUGP (("trailing `/' on dir.\n"));
+ }
+ else if (cur.type == FT_SYMLINK && cur.name[fnlen - 1] == '@')
+ {
+ cur.name[fnlen - 1] = '\0';
+ DEBUGP (("trailing `@' on link.\n"));
+ }
+ else if (cur.type == FT_PLAINFILE
+ && (cur.perms & 0111)
+ && cur.name[fnlen - 1] == '*')
+ {
+ cur.name[fnlen - 1] = '\0';
+ DEBUGP (("trailing `*' on exec.\n"));
+ }
+ } /* if (fnlen) */
+ else
+ error = 1;
+ break;
+ }
+ else
+ abort ();
+ } /* while */
+
+ if (!cur.name || (cur.type == FT_SYMLINK && !cur.linkto))
+ error = 1;
+
+ DEBUGP (("%s\n", cur.name ? cur.name : ""));
+
+ if (error || ignore)
+ {
+ DEBUGP (("Skipping.\n"));
+ xfree (cur.name);
+ xfree (cur.linkto);
+ continue;
+ }
+
+ if (!dir)
+ {
+ l = dir = xnew (struct fileinfo);
+ memcpy (l, &cur, sizeof (cur));
+ l->prev = l->next = NULL;
+ }
+ else
+ {
+ cur.prev = l;
+ l->next = xnew (struct fileinfo);
+ l = l->next;
+ memcpy (l, &cur, sizeof (cur));
+ l->next = NULL;
+ }
+ /* Get the current time. */
+ timenow = time (NULL);
+ tnow = localtime (&timenow);
+ /* Build the time-stamp (the idea by zaga@fly.cc.fer.hr). */
+ timestruct.tm_sec = sec;
+ timestruct.tm_min = min;
+ timestruct.tm_hour = hour;
+ timestruct.tm_mday = day;
+ timestruct.tm_mon = month;
+ if (year == 0)
+ {
+ /* Some listings will not specify the year if it is "obvious"
+ that the file was from the previous year. E.g. if today
+ is 97-01-12, and you see a file of Dec 15th, its year is
+ 1996, not 1997. Thanks to Vladimir Volovich for
+ mentioning this! */
+ if (month > tnow->tm_mon)
+ timestruct.tm_year = tnow->tm_year - 1;
+ else
+ timestruct.tm_year = tnow->tm_year;
+ }
+ else
+ timestruct.tm_year = year;
+ if (timestruct.tm_year >= 1900)
+ timestruct.tm_year -= 1900;
+ timestruct.tm_wday = 0;
+ timestruct.tm_yday = 0;
+ timestruct.tm_isdst = -1;
+ l->tstamp = mktime (&timestruct); /* store the time-stamp */
+ l->ptype = ptype;
+ }
+
+ xfree (line);
+ return dir;
+}
+
+static struct fileinfo *
+ftp_parse_winnt_ls (FILE *fp)
+{
+ int len;
+ int year, month, day; /* for time analysis */
+ int hour, min;
+ size_t bufsize = 0;
+ struct tm timestruct;
+
+ char *line = NULL, *tok; /* tokenizer */
+ char *filename;
+ struct fileinfo *dir, *l, cur; /* list creation */
+
+ dir = l = NULL;
+ cur.name = NULL;
+
+ /* Line loop to end of file: */
+ while ((len = getline (&line, &bufsize, fp)) > 0)
+ {
+ len = clean_line (line, len);
+
+ /* Name begins at 39 column of the listing if date presented in `mm-dd-yy'
+ format or at 41 column if date presented in `mm-dd-yyyy' format. Thus,
+ we cannot extract name before we parse date. Using this information we
+ also can recognize filenames that begin with a series of space
+ characters (but who really wants to use such filenames anyway?). */
+ if (len < 40) continue;
+ filename = line + 39;
+
+ /* First column: mm-dd-yy or mm-dd-yyyy. Should atoi() on the month fail,
+ january will be assumed. */
+ tok = strtok(line, "-");
+ if (tok == NULL) continue;
+ month = atoi(tok);
+ if (month < 0) month = 0; else month--;
+ tok = strtok(NULL, "-");
+ if (tok == NULL) continue;
+ day = atoi(tok);
+ tok = strtok(NULL, " ");
+ if (tok == NULL) continue;
+ year = atoi(tok);
+ /* Assuming the epoch starting at 1.1.1970 */
+ if (year <= 70)
+ {
+ year += 100;
+ }
+ else if (year >= 1900)
+ {
+ year -= 1900;
+ if (len < 42) continue;
+ filename += 2;
+ }
+ /* Now it is possible to determine the position of the first symbol in
+ filename. */
+ xfree (cur.name);
+ memset(&cur, 0, sizeof (cur));
+ cur.name = xstrdup(filename);
+ DEBUGP (("Name: '%s'\n", cur.name));
+
+
+ /* Second column: hh:mm[AP]M, listing does not contain value for
+ seconds */
+ tok = strtok(NULL, ":");
+ if (tok == NULL) continue;
+ hour = atoi(tok);
+ tok = strtok(NULL, "M");
+ if (tok == NULL) continue;
+ min = atoi(tok);
+ /* Adjust hour from AM/PM. Just for the record, the sequence goes
+ 11:00AM, 12:00PM, 01:00PM ... 11:00PM, 12:00AM, 01:00AM . */
+ if (tok[0] && tok[1]) tok+=2;
+ if (hour >= 12 || hour < 0) hour = 0;
+ if (*tok == 'P') hour += 12;
+
+ DEBUGP (("YYYY/MM/DD HH:MM - %d/%02d/%02d %02d:%02d\n",
+ year+1900, month, day, hour, min));
+
+ /* Build the time-stamp (copy & paste from above) */
+ timestruct.tm_sec = 0;
+ timestruct.tm_min = min;
+ timestruct.tm_hour = hour;
+ timestruct.tm_mday = day;
+ timestruct.tm_mon = month;
+ timestruct.tm_year = year;
+ timestruct.tm_wday = 0;
+ timestruct.tm_yday = 0;
+ timestruct.tm_isdst = -1;
+ cur.tstamp = mktime (&timestruct); /* store the time-stamp */
+ cur.ptype = TT_HOUR_MIN;
+
+ DEBUGP (("Timestamp: %ld\n", cur.tstamp));
+
+ /* Third column: Either file length, or <DIR>. We also set the
+ permissions (guessed as 0644 for plain files and 0755 for
+ directories as the listing does not give us a clue) and filetype
+ here. */
+ tok = strtok(NULL, " ");
+ if (tok == NULL) continue;
+ while ((tok != NULL) && (*tok == '\0')) tok = strtok(NULL, " ");
+ if (tok == NULL) continue;
+ if (*tok == '<')
+ {
+ cur.type = FT_DIRECTORY;
+ cur.size = 0;
+ cur.perms = 0755;
+ DEBUGP (("Directory\n"));
+ }
+ else
+ {
+ wgint size;
+ cur.type = FT_PLAINFILE;
+ errno = 0;
+ size = str_to_wgint (tok, NULL, 10);
+ if (size == WGINT_MAX && errno == ERANGE)
+ cur.size = 0; /* overflow */
+ else
+ cur.size = size;
+ cur.perms = 0644;
+ DEBUGP (("File, size %s bytes\n", number_to_static_string (cur.size)));
+ }
+
+ cur.linkto = NULL;
+
+ /* And put everything into the linked list */
+ if (!dir)
+ {
+ l = dir = xnew (struct fileinfo);
+ memcpy (l, &cur, sizeof (cur));
+ l->prev = l->next = NULL;
+ }
+ else
+ {
+ cur.prev = l;
+ l->next = xnew (struct fileinfo);
+ l = l->next;
+ memcpy (l, &cur, sizeof (cur));
+ l->next = NULL;
+ }
+ cur.name = NULL;
+ }
+
+ xfree (cur.name);
+ xfree (line);
+ return dir;
+}
+
+
+
+/* Convert the VMS-style directory listing stored in "file" to a
+ linked list of fileinfo (system-independent) entries. The contents
+ of FILE are considered to be produced by the standard VMS
+ "DIRECTORY [/SIZE [= ALL]] /DATE [/OWNER] [/PROTECTION]" command,
+ more or less. (Different VMS FTP servers may have different headers,
+ and may not supply the same data, but all should be subsets of this.)
+
+ VMS normally provides local (server) time and date information.
+ Define the logical name or environment variable
+ "WGET_TIMEZONE_DIFFERENTIAL" (seconds) to adjust the receiving local
+ times if different from the remote local times.
+
+ 2005-02-23 SMS.
+ Added code to eliminate "^" escape characters from ODS5 extended file
+ names. The TCPIP FTP server (V5.4) seems to prefer requests which do
+ not use the escaped names which it provides.
+*/
+
+#define VMS_DEFAULT_PROT_FILE 0644
+#define VMS_DEFAULT_PROT_DIR 0755
+
+/* 2005-02-23 SMS.
+ eat_carets().
+
+ Delete ODS5 extended file name escape characters ("^") in the
+ original buffer.
+ Note that the current scheme does not handle all EFN cases, but it
+ could be made more complicated.
+*/
+
+static void eat_carets( char *str)
+/* char *str; Source pointer. */
+{
+ char *strd; /* Destination pointer. */
+ char hdgt;
+ unsigned char uchr;
+
+ /* Skip ahead to the first "^", if any. */
+ while ((*str != '\0') && (*str != '^'))
+ str++;
+
+ /* If no caret was found, quit early. */
+ if (*str != '\0')
+ {
+ /* Shift characters leftward as carets are found. */
+ strd = str;
+ while (*str != '\0')
+ {
+ uchr = *str;
+ if (uchr == '^')
+ {
+ /* Found a caret. Skip it, and check the next character. */
+ if ((char_prop[(unsigned char) str[1]] & 64) && (char_prop[(unsigned char) str[2]] & 64))
+ {
+ /* Hex digit. Get char code from this and next hex digit. */
+ uchr = *(++str);
+ if (uchr <= '9')
+ {
+ hdgt = uchr - '0'; /* '0' - '9' -> 0 - 9. */
+ }
+ else
+ {
+ hdgt = ((uchr - 'A') & 7) + 10; /* [Aa] - [Ff] -> 10 - 15. */
+ }
+ hdgt <<= 4; /* X16. */
+ uchr = *(++str); /* Next char must be hex digit. */
+ if (uchr <= '9')
+ {
+ uchr = hdgt + uchr - '0';
+ }
+ else
+ {
+ uchr = hdgt + ((uchr - 'A') & 15) + 10;
+ }
+ }
+ else if (uchr == '_')
+ {
+ /* Convert escaped "_" to " ". */
+ uchr = ' ';
+ }
+ else if (uchr == '/')
+ {
+ /* Convert escaped "/" (invalid Zip) to "?" (invalid VMS). */
+ /* Note that this is a left-over from Info-ZIP code, and is
+ probably of little value here, except perhaps to avoid
+ directory confusion which an unconverted slash might cause.
+ */
+ uchr = '?';
+ }
+ /* Else, not a hex digit. Must be a simple escaped character
+ (or Unicode, which is not yet handled here).
+ */
+ }
+ /* Else, not a caret. Use as-is. */
+ *strd = uchr;
+
+ /* Advance destination and source pointers. */
+ strd++;
+ str++;
+ }
+ /* Terminate the destination string. */
+ *strd = '\0';
+ }
+}
+
+
+static struct fileinfo *
+ftp_parse_vms_ls (FILE *fp)
+{
+ int dt, i, j, len;
+ int perms;
+ size_t bufsize = 0;
+ time_t timenow;
+ struct tm *timestruct;
+ char date_str[32];
+
+ char *line = NULL, *tok; /* tokenizer */
+ struct fileinfo *dir, *l, cur; /* list creation */
+
+ dir = l = NULL;
+
+ /* Skip blank lines, Directory heading, and more blank lines. */
+
+ for (j = 0; (i = getline (&line, &bufsize, fp)) > 0; )
+ {
+ i = clean_line (line, i);
+ if (i <= 0)
+ continue; /* Ignore blank line. */
+
+ if ((j == 0) && (line[i - 1] == ']'))
+ {
+ /* Found Directory heading line. Next non-blank line
+ is significant. */
+ j = 1;
+ }
+ else if (!strncmp (line, "Total of ", 9))
+ {
+ /* Found "Total of ..." footing line. No valid data
+ will follow (empty directory). */
+ i = 0; /* Arrange for early exit. */
+ break;
+ }
+ else
+ {
+ break; /* Must be significant data. */
+ }
+ }
+
+ /* Read remainder of file until the next blank line or EOF. */
+
+ cur.name = NULL;
+ while (i > 0)
+ {
+ char *p;
+
+ /* The first token is the file name. After a long name, other
+ data may be on the following line. A valid directory name ends
+ in ".DIR;1" (any case), although some VMS FTP servers may omit
+ the version number (";1").
+ */
+
+ tok = strtok(line, " ");
+ if (tok == NULL) tok = line;
+ DEBUGP (("file name: '%s'\n", tok));
+
+ /* Stripping the version number on a VMS system would be wrong.
+ It may be foolish on a non-VMS system, too, but that's someone
+ else's problem. (Define PRESERVE_VMS_VERSIONS for proper
+ operation on other operating systems.)
+
+ 2005-02-23 SMS.
+ ODS5 extended file names may contain escaped semi-colons, so
+ the version number is identified as right-side decimal digits
+ led by a non-escaped semi-colon. It may be absent.
+ */
+
+#if (!defined( __VMS) && !defined( PRESERVE_VMS_VERSIONS))
+ for (p = tok + strlen (tok); (--p > tok) && c_isdigit(*p); );
+ if (p > tok && (*p == ';') && (*(p - 1) != '^'))
+ {
+ *p = '\0';
+ }
+#endif /* (!defined( __VMS) && !defined( PRESERVE_VMS_VERSIONS)) */
+
+ /* 2005-02-23 SMS.
+ Eliminate "^" escape characters from ODS5 extended file name.
+ (A caret is invalid in an ODS2 name, so this is always safe.)
+ */
+ eat_carets (tok);
+ DEBUGP (("file name-^: '%s'\n", tok));
+
+ /* Differentiate between a directory and any other file. A VMS
+ listing may not include file protections (permissions). Set a
+ default permissions value (according to the file type), which
+ may be overwritten later. Store directory names without the
+ ".DIR;1" file type and version number, as the plain name is
+ what will work in a CWD command.
+ */
+ len = strlen (tok);
+ if (len >= 4 && !c_strncasecmp(tok + (len - 4), ".DIR", 4))
+ {
+ *(tok + (len - 4)) = '\0'; /* Discard ".DIR". */
+ cur.type = FT_DIRECTORY;
+ cur.perms = VMS_DEFAULT_PROT_DIR;
+ DEBUGP (("Directory (nv)\n"));
+ }
+ else if (len >= 6 && !c_strncasecmp (tok + len - 6, ".DIR;1", 6))
+ {
+ *(tok + (len - 6)) = '\0'; /* Discard ".DIR;1". */
+ cur.type = FT_DIRECTORY;
+ cur.perms = VMS_DEFAULT_PROT_DIR;
+ DEBUGP (("Directory (v)\n"));
+ }
+ else
+ {
+ cur.type = FT_PLAINFILE;
+ cur.perms = VMS_DEFAULT_PROT_FILE;
+ DEBUGP (("File\n"));
+ }
+ xfree (cur.name);
+ cur.name = xstrdup (tok);
+ DEBUGP (("Name: '%s'\n", cur.name));
+
+ /* Null the date and time string. */
+ *date_str = '\0';
+
+ /* VMS lacks symbolic links. */
+ cur.linkto = NULL;
+
+ /* VMS reports file sizes in (512-byte) disk blocks, not bytes,
+ hence useless for an integrity check based on byte-count.
+ Set size to unknown.
+ */
+ cur.size = 0;
+
+ /* Get token 2, if any. A long name may force all other data onto
+ a second line. If needed, read the second line.
+ */
+
+ tok = strtok (NULL, " ");
+ if (tok == NULL)
+ {
+ DEBUGP (("Getting additional line.\n"));
+ i = getline (&line, &bufsize, fp);
+ if (i <= 0)
+ {
+ DEBUGP (("EOF. Leaving listing parser.\n"));
+ break;
+ }
+
+ /* Second line must begin with " ". Otherwise, it's a first
+ line (and we may be confused).
+ */
+ i = clean_line (line, i);
+ if (i <= 0)
+ {
+ /* Blank line. End of significant file listing. */
+ DEBUGP (("Blank line. Leaving listing parser.\n"));
+ break;
+ }
+ else if (line[0] != ' ')
+ {
+ DEBUGP (("Non-blank in column 1. Must be a new file name?\n"));
+ continue;
+ }
+ else
+ {
+ tok = strtok (line, " ");
+ if (tok == NULL)
+ {
+ /* Unexpected non-empty but apparently blank line. */
+ DEBUGP (("Null token. Leaving listing parser.\n"));
+ break;
+ }
+ }
+ }
+
+ /* Analyze tokens. (Order is not significant, except date must
+ precede time.)
+
+ Size: ddd or ddd/ddd (where "ddd" is a decimal number)
+ Date: DD-MMM-YYYY
+ Time: HH:MM or HH:MM:SS or HH:MM:SS.CC
+ Owner: [user] or [user,group]
+ Protection: (ppp,ppp,ppp,ppp) (where "ppp" is "RWED" or some
+ subset thereof, for System, Owner, Group, World.
+
+ If permission is lacking, info may be replaced by the string:
+ "No privilege for attempted operation".
+ */
+ while (tok != NULL)
+ {
+ DEBUGP (("Token: >%s<: ", tok));
+
+ if ((strlen (tok) < 12) && (strchr( tok, '-') != NULL))
+ {
+ /* Date. */
+ DEBUGP (("Date.\n"));
+ snprintf(date_str, sizeof(date_str), "%s ", tok);
+ }
+ else if ((strlen (tok) < 12) && (strchr( tok, ':') != NULL))
+ {
+ /* Time. */
+ DEBUGP (("Time. "));
+ strncat( date_str,
+ tok,
+ (sizeof( date_str)- strlen (date_str) - 1));
+ DEBUGP (("Date time: >%s<\n", date_str));
+ }
+ else if (strchr (tok, '[') != NULL)
+ {
+ /* Owner. (Ignore.) */
+ DEBUGP (("Owner.\n"));
+ }
+ else if (strchr (tok, '(') != NULL)
+ {
+ /* Protections (permissions). */
+ perms = 0;
+ j = 0;
+ /*FIXME: Should not be using the variable like this. */
+ for (i = 0; i < (int) strlen(tok); i++)
+ {
+ switch (tok[ i])
+ {
+ case '(':
+ break;
+ case ')':
+ break;
+ case ',':
+ if (j == 0)
+ {
+ perms = 0;
+ }
+ else if (j < 4)
+ {
+ perms <<= 3;
+ }
+ j++;
+ break;
+ case 'R':
+ perms |= 4;
+ break;
+ case 'W':
+ perms |= 2;
+ break;
+ case 'E':
+ perms |= 1;
+ break;
+ case 'D':
+ perms |= 2;
+ break;
+ }
+ }
+ cur.perms = perms;
+ DEBUGP (("Prot. perms = %0o.\n", (unsigned) cur.perms));
+ }
+ else
+ {
+ /* Nondescript. Probably size(s), probably in blocks.
+ Could be "No privilege ..." message. (Ignore.)
+ */
+ DEBUGP (("Ignored (size?).\n"));
+ }
+
+ tok = strtok (NULL, " ");
+ }
+
+ /* Tokens exhausted. Interpret the data, and fill in the
+ structure.
+ */
+ /* Fill tm timestruct according to date-time string. Fractional
+ seconds are ignored. Default to current time, if conversion
+ fails.
+ */
+ timenow = time( NULL);
+ timestruct = localtime( &timenow );
+ strptime( date_str, "%d-%b-%Y %H:%M:%S", timestruct);
+
+ /* Convert struct tm local time to time_t local time. */
+ timenow = mktime (timestruct);
+ /* Offset local time according to environment variable (seconds). */
+ if ((tok = getenv ( "WGET_TIMEZONE_DIFFERENTIAL")) != NULL)
+ {
+ dt = atoi (tok);
+ DEBUGP (("Time differential = %d.\n", dt));
+ }
+ else
+ dt = 0;
+
+ if (dt >= 0)
+ timenow += dt;
+ else
+ timenow -= (-dt);
+
+ cur.tstamp = timenow; /* Store the time-stamp. */
+ DEBUGP (("Timestamp: %ld\n", cur.tstamp));
+ cur.ptype = TT_HOUR_MIN;
+
+ /* Add the data for this item to the linked list, */
+ if (!dir)
+ {
+ l = dir = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+ cur.prev = cur.next = NULL;
+ memcpy (l, &cur, sizeof (cur));
+ }
+ else
+ {
+ cur.prev = l;
+ cur.next = NULL;
+ l->next = (struct fileinfo *)xmalloc (sizeof (struct fileinfo));
+ l = l->next;
+ memcpy (l, &cur, sizeof (cur));
+ }
+ cur.name = NULL;
+
+ i = getline (&line, &bufsize, fp);
+ if (i > 0)
+ {
+ i = clean_line (line, i);
+ if (i <= 0)
+ {
+ /* Blank line. End of significant file listing. */
+ break;
+ }
+ }
+ }
+
+ xfree (cur.name);
+ xfree (line);
+ return dir;
+}
+
+
+/* This function switches between the correct parsing routine depending on
+ the SYSTEM_TYPE. The system type should be based on the result of the
+ "SYST" response of the FTP server. According to this response we will
+ use on of the three different listing parsers that cover the most of FTP
+ servers used nowadays. */
+
+struct fileinfo *
+ftp_parse_ls (const char *file, const enum stype system_type)
+{
+ FILE *fp;
+ struct fileinfo *fi;
+
+ fp = fopen (file, "rb");
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno));
+ return NULL;
+ }
+
+ fi = ftp_parse_ls_fp (fp, system_type);
+ fclose(fp);
+
+ return fi;
+}
+
+struct fileinfo *
+ftp_parse_ls_fp (FILE *fp, const enum stype system_type)
+{
+ switch (system_type)
+ {
+ case ST_UNIX:
+ return ftp_parse_unix_ls (fp, 0);
+ case ST_WINNT:
+ {
+ /* Detect whether the listing is simulating the UNIX format */
+ int c = fgetc(fp);
+ rewind(fp);
+
+ /* If the first character of the file is '0'-'9', it's WINNT
+ format. */
+ if (c >= '0' && c <='9')
+ return ftp_parse_winnt_ls (fp);
+ else
+ return ftp_parse_unix_ls (fp, 1);
+ }
+ case ST_VMS:
+ return ftp_parse_vms_ls (fp);
+ case ST_MACOS:
+ return ftp_parse_unix_ls (fp, 1);
+ default:
+ logprintf (LOG_NOTQUIET, _("\
+Unsupported listing type, trying Unix listing parser.\n"));
+ return ftp_parse_unix_ls (fp, 0);
+ }
+}
+
+/* Stuff for creating FTP index. */
+
+/* The function creates an HTML index containing references to given
+ directories and files on the appropriate host. The references are
+ FTP. */
+uerr_t
+ftp_index (const char *file, struct url *u, struct fileinfo *f)
+{
+ FILE *fp;
+ char *upwd;
+ char *htcldir; /* HTML-clean dir name */
+ char *htclfile; /* HTML-clean file name */
+ char *urlclfile; /* URL-clean file name */
+
+ if (!output_stream)
+ {
+ fp = fopen (file, "wb");
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno));
+ return FOPENERR;
+ }
+ }
+ else
+ fp = output_stream;
+ if (u->user)
+ {
+ char *tmpu, *tmpp; /* temporary, clean user and passwd */
+
+ tmpu = url_escape (u->user);
+ tmpp = u->passwd ? url_escape (u->passwd) : NULL;
+ if (tmpp)
+ upwd = concat_strings (tmpu, ":", tmpp, "@", (char *) 0);
+ else
+ upwd = concat_strings (tmpu, "@", (char *) 0);
+ xfree (tmpu);
+ xfree (tmpp);
+ }
+ else
+ upwd = xstrdup ("");
+
+ htcldir = html_quote_string (u->dir);
+
+ fprintf (fp, "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n");
+ fprintf (fp, "<html>\n<head>\n<title>");
+ fprintf (fp, _("Index of /%s on %s:%d"), htcldir, u->host, u->port);
+ fprintf (fp, "</title>\n</head>\n<body>\n<h1>");
+ fprintf (fp, _("Index of /%s on %s:%d"), htcldir, u->host, u->port);
+ fprintf (fp, "</h1>\n<hr>\n<pre>\n");
+
+ while (f)
+ {
+ fprintf (fp, " ");
+ if (f->tstamp != -1)
+ {
+ /* #### Should we translate the months? Or, even better, use
+ ISO 8601 dates? */
+ static const char *months[] = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ };
+ time_t tstamp = f->tstamp;
+ struct tm *ptm = localtime (&tstamp);
+
+ fprintf (fp, "%d %s %02d ", ptm->tm_year + 1900, months[ptm->tm_mon],
+ ptm->tm_mday);
+ if (f->ptype == TT_HOUR_MIN)
+ fprintf (fp, "%02d:%02d ", ptm->tm_hour, ptm->tm_min);
+ else
+ fprintf (fp, " ");
+ }
+ else
+ fprintf (fp, _("time unknown "));
+ switch (f->type)
+ {
+ case FT_PLAINFILE:
+ fprintf (fp, _("File "));
+ break;
+ case FT_DIRECTORY:
+ fprintf (fp, _("Directory "));
+ break;
+ case FT_SYMLINK:
+ fprintf (fp, _("Link "));
+ break;
+ default:
+ fprintf (fp, _("Not sure "));
+ break;
+ }
+ htclfile = html_quote_string (f->name);
+ urlclfile = url_escape_unsafe_and_reserved (f->name);
+ fprintf (fp, "<a href=\"ftp://%s%s:%d", upwd, u->host, u->port);
+ if (*u->dir != '/')
+ putc ('/', fp);
+ /* XXX: Should probably URL-escape dir components here, rather
+ * than just HTML-escape, for consistency with the next bit where
+ * we use urlclfile for the file component. Anyway, this is safer
+ * than what we had... */
+ fprintf (fp, "%s", htcldir);
+ if (*u->dir)
+ putc ('/', fp);
+ fprintf (fp, "%s", urlclfile);
+ if (f->type == FT_DIRECTORY)
+ putc ('/', fp);
+ fprintf (fp, "\">%s", htclfile);
+ if (f->type == FT_DIRECTORY)
+ putc ('/', fp);
+ fprintf (fp, "</a> ");
+ if (f->type == FT_PLAINFILE)
+ fprintf (fp, _(" (%s bytes)"), number_to_static_string (f->size));
+ else if (f->type == FT_SYMLINK)
+ fprintf (fp, "-> %s", f->linkto ? f->linkto : "(nil)");
+ putc ('\n', fp);
+ xfree (htclfile);
+ xfree (urlclfile);
+ f = f->next;
+ }
+ fprintf (fp, "</pre>\n</body>\n</html>\n");
+ xfree (htcldir);
+ xfree (upwd);
+ if (!output_stream)
+ fclose (fp);
+ else
+ fflush (fp);
+ return FTPOK;
+}
diff --git a/src/ftp-opie.c b/src/ftp-opie.c
new file mode 100644
index 0000000..abe174b
--- /dev/null
+++ b/src/ftp-opie.c
@@ -0,0 +1,2220 @@
+/* Opie (s/key) support for FTP.
+ Copyright (C) 1998-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "md5.h"
+#include "ftp.h"
+
+/* Dictionary for integer-word translations. Available in appendix D
+ of rfc2289. */
+ static char Wp[2048][4] = {
+ { 'A', '\0', '\0', '\0' },
+ { 'A', 'B', 'E', '\0' },
+ { 'A', 'C', 'E', '\0' },
+ { 'A', 'C', 'T', '\0' },
+ { 'A', 'D', '\0', '\0' },
+ { 'A', 'D', 'A', '\0' },
+ { 'A', 'D', 'D', '\0' },
+ { 'A', 'G', 'O', '\0' },
+ { 'A', 'I', 'D', '\0' },
+ { 'A', 'I', 'M', '\0' },
+ { 'A', 'I', 'R', '\0' },
+ { 'A', 'L', 'L', '\0' },
+ { 'A', 'L', 'P', '\0' },
+ { 'A', 'M', '\0', '\0' },
+ { 'A', 'M', 'Y', '\0' },
+ { 'A', 'N', '\0', '\0' },
+ { 'A', 'N', 'A', '\0' },
+ { 'A', 'N', 'D', '\0' },
+ { 'A', 'N', 'N', '\0' },
+ { 'A', 'N', 'T', '\0' },
+ { 'A', 'N', 'Y', '\0' },
+ { 'A', 'P', 'E', '\0' },
+ { 'A', 'P', 'S', '\0' },
+ { 'A', 'P', 'T', '\0' },
+ { 'A', 'R', 'C', '\0' },
+ { 'A', 'R', 'E', '\0' },
+ { 'A', 'R', 'K', '\0' },
+ { 'A', 'R', 'M', '\0' },
+ { 'A', 'R', 'T', '\0' },
+ { 'A', 'S', '\0', '\0' },
+ { 'A', 'S', 'H', '\0' },
+ { 'A', 'S', 'K', '\0' },
+ { 'A', 'T', '\0', '\0' },
+ { 'A', 'T', 'E', '\0' },
+ { 'A', 'U', 'G', '\0' },
+ { 'A', 'U', 'K', '\0' },
+ { 'A', 'V', 'E', '\0' },
+ { 'A', 'W', 'E', '\0' },
+ { 'A', 'W', 'K', '\0' },
+ { 'A', 'W', 'L', '\0' },
+ { 'A', 'W', 'N', '\0' },
+ { 'A', 'X', '\0', '\0' },
+ { 'A', 'Y', 'E', '\0' },
+ { 'B', 'A', 'D', '\0' },
+ { 'B', 'A', 'G', '\0' },
+ { 'B', 'A', 'H', '\0' },
+ { 'B', 'A', 'M', '\0' },
+ { 'B', 'A', 'N', '\0' },
+ { 'B', 'A', 'R', '\0' },
+ { 'B', 'A', 'T', '\0' },
+ { 'B', 'A', 'Y', '\0' },
+ { 'B', 'E', '\0', '\0' },
+ { 'B', 'E', 'D', '\0' },
+ { 'B', 'E', 'E', '\0' },
+ { 'B', 'E', 'G', '\0' },
+ { 'B', 'E', 'N', '\0' },
+ { 'B', 'E', 'T', '\0' },
+ { 'B', 'E', 'Y', '\0' },
+ { 'B', 'I', 'B', '\0' },
+ { 'B', 'I', 'D', '\0' },
+ { 'B', 'I', 'G', '\0' },
+ { 'B', 'I', 'N', '\0' },
+ { 'B', 'I', 'T', '\0' },
+ { 'B', 'O', 'B', '\0' },
+ { 'B', 'O', 'G', '\0' },
+ { 'B', 'O', 'N', '\0' },
+ { 'B', 'O', 'O', '\0' },
+ { 'B', 'O', 'P', '\0' },
+ { 'B', 'O', 'W', '\0' },
+ { 'B', 'O', 'Y', '\0' },
+ { 'B', 'U', 'B', '\0' },
+ { 'B', 'U', 'D', '\0' },
+ { 'B', 'U', 'G', '\0' },
+ { 'B', 'U', 'M', '\0' },
+ { 'B', 'U', 'N', '\0' },
+ { 'B', 'U', 'S', '\0' },
+ { 'B', 'U', 'T', '\0' },
+ { 'B', 'U', 'Y', '\0' },
+ { 'B', 'Y', '\0', '\0' },
+ { 'B', 'Y', 'E', '\0' },
+ { 'C', 'A', 'B', '\0' },
+ { 'C', 'A', 'L', '\0' },
+ { 'C', 'A', 'M', '\0' },
+ { 'C', 'A', 'N', '\0' },
+ { 'C', 'A', 'P', '\0' },
+ { 'C', 'A', 'R', '\0' },
+ { 'C', 'A', 'T', '\0' },
+ { 'C', 'A', 'W', '\0' },
+ { 'C', 'O', 'D', '\0' },
+ { 'C', 'O', 'G', '\0' },
+ { 'C', 'O', 'L', '\0' },
+ { 'C', 'O', 'N', '\0' },
+ { 'C', 'O', 'O', '\0' },
+ { 'C', 'O', 'P', '\0' },
+ { 'C', 'O', 'T', '\0' },
+ { 'C', 'O', 'W', '\0' },
+ { 'C', 'O', 'Y', '\0' },
+ { 'C', 'R', 'Y', '\0' },
+ { 'C', 'U', 'B', '\0' },
+ { 'C', 'U', 'E', '\0' },
+ { 'C', 'U', 'P', '\0' },
+ { 'C', 'U', 'R', '\0' },
+ { 'C', 'U', 'T', '\0' },
+ { 'D', 'A', 'B', '\0' },
+ { 'D', 'A', 'D', '\0' },
+ { 'D', 'A', 'M', '\0' },
+ { 'D', 'A', 'N', '\0' },
+ { 'D', 'A', 'R', '\0' },
+ { 'D', 'A', 'Y', '\0' },
+ { 'D', 'E', 'E', '\0' },
+ { 'D', 'E', 'L', '\0' },
+ { 'D', 'E', 'N', '\0' },
+ { 'D', 'E', 'S', '\0' },
+ { 'D', 'E', 'W', '\0' },
+ { 'D', 'I', 'D', '\0' },
+ { 'D', 'I', 'E', '\0' },
+ { 'D', 'I', 'G', '\0' },
+ { 'D', 'I', 'N', '\0' },
+ { 'D', 'I', 'P', '\0' },
+ { 'D', 'O', '\0', '\0' },
+ { 'D', 'O', 'E', '\0' },
+ { 'D', 'O', 'G', '\0' },
+ { 'D', 'O', 'N', '\0' },
+ { 'D', 'O', 'T', '\0' },
+ { 'D', 'O', 'W', '\0' },
+ { 'D', 'R', 'Y', '\0' },
+ { 'D', 'U', 'B', '\0' },
+ { 'D', 'U', 'D', '\0' },
+ { 'D', 'U', 'E', '\0' },
+ { 'D', 'U', 'G', '\0' },
+ { 'D', 'U', 'N', '\0' },
+ { 'E', 'A', 'R', '\0' },
+ { 'E', 'A', 'T', '\0' },
+ { 'E', 'D', '\0', '\0' },
+ { 'E', 'E', 'L', '\0' },
+ { 'E', 'G', 'G', '\0' },
+ { 'E', 'G', 'O', '\0' },
+ { 'E', 'L', 'I', '\0' },
+ { 'E', 'L', 'K', '\0' },
+ { 'E', 'L', 'M', '\0' },
+ { 'E', 'L', 'Y', '\0' },
+ { 'E', 'M', '\0', '\0' },
+ { 'E', 'N', 'D', '\0' },
+ { 'E', 'S', 'T', '\0' },
+ { 'E', 'T', 'C', '\0' },
+ { 'E', 'V', 'A', '\0' },
+ { 'E', 'V', 'E', '\0' },
+ { 'E', 'W', 'E', '\0' },
+ { 'E', 'Y', 'E', '\0' },
+ { 'F', 'A', 'D', '\0' },
+ { 'F', 'A', 'N', '\0' },
+ { 'F', 'A', 'R', '\0' },
+ { 'F', 'A', 'T', '\0' },
+ { 'F', 'A', 'Y', '\0' },
+ { 'F', 'E', 'D', '\0' },
+ { 'F', 'E', 'E', '\0' },
+ { 'F', 'E', 'W', '\0' },
+ { 'F', 'I', 'B', '\0' },
+ { 'F', 'I', 'G', '\0' },
+ { 'F', 'I', 'N', '\0' },
+ { 'F', 'I', 'R', '\0' },
+ { 'F', 'I', 'T', '\0' },
+ { 'F', 'L', 'O', '\0' },
+ { 'F', 'L', 'Y', '\0' },
+ { 'F', 'O', 'E', '\0' },
+ { 'F', 'O', 'G', '\0' },
+ { 'F', 'O', 'R', '\0' },
+ { 'F', 'R', 'Y', '\0' },
+ { 'F', 'U', 'M', '\0' },
+ { 'F', 'U', 'N', '\0' },
+ { 'F', 'U', 'R', '\0' },
+ { 'G', 'A', 'B', '\0' },
+ { 'G', 'A', 'D', '\0' },
+ { 'G', 'A', 'G', '\0' },
+ { 'G', 'A', 'L', '\0' },
+ { 'G', 'A', 'M', '\0' },
+ { 'G', 'A', 'P', '\0' },
+ { 'G', 'A', 'S', '\0' },
+ { 'G', 'A', 'Y', '\0' },
+ { 'G', 'E', 'E', '\0' },
+ { 'G', 'E', 'L', '\0' },
+ { 'G', 'E', 'M', '\0' },
+ { 'G', 'E', 'T', '\0' },
+ { 'G', 'I', 'G', '\0' },
+ { 'G', 'I', 'L', '\0' },
+ { 'G', 'I', 'N', '\0' },
+ { 'G', 'O', '\0', '\0' },
+ { 'G', 'O', 'T', '\0' },
+ { 'G', 'U', 'M', '\0' },
+ { 'G', 'U', 'N', '\0' },
+ { 'G', 'U', 'S', '\0' },
+ { 'G', 'U', 'T', '\0' },
+ { 'G', 'U', 'Y', '\0' },
+ { 'G', 'Y', 'M', '\0' },
+ { 'G', 'Y', 'P', '\0' },
+ { 'H', 'A', '\0', '\0' },
+ { 'H', 'A', 'D', '\0' },
+ { 'H', 'A', 'L', '\0' },
+ { 'H', 'A', 'M', '\0' },
+ { 'H', 'A', 'N', '\0' },
+ { 'H', 'A', 'P', '\0' },
+ { 'H', 'A', 'S', '\0' },
+ { 'H', 'A', 'T', '\0' },
+ { 'H', 'A', 'W', '\0' },
+ { 'H', 'A', 'Y', '\0' },
+ { 'H', 'E', '\0', '\0' },
+ { 'H', 'E', 'M', '\0' },
+ { 'H', 'E', 'N', '\0' },
+ { 'H', 'E', 'R', '\0' },
+ { 'H', 'E', 'W', '\0' },
+ { 'H', 'E', 'Y', '\0' },
+ { 'H', 'I', '\0', '\0' },
+ { 'H', 'I', 'D', '\0' },
+ { 'H', 'I', 'M', '\0' },
+ { 'H', 'I', 'P', '\0' },
+ { 'H', 'I', 'S', '\0' },
+ { 'H', 'I', 'T', '\0' },
+ { 'H', 'O', '\0', '\0' },
+ { 'H', 'O', 'B', '\0' },
+ { 'H', 'O', 'C', '\0' },
+ { 'H', 'O', 'E', '\0' },
+ { 'H', 'O', 'G', '\0' },
+ { 'H', 'O', 'P', '\0' },
+ { 'H', 'O', 'T', '\0' },
+ { 'H', 'O', 'W', '\0' },
+ { 'H', 'U', 'B', '\0' },
+ { 'H', 'U', 'E', '\0' },
+ { 'H', 'U', 'G', '\0' },
+ { 'H', 'U', 'H', '\0' },
+ { 'H', 'U', 'M', '\0' },
+ { 'H', 'U', 'T', '\0' },
+ { 'I', '\0', '\0', '\0' },
+ { 'I', 'C', 'Y', '\0' },
+ { 'I', 'D', 'A', '\0' },
+ { 'I', 'F', '\0', '\0' },
+ { 'I', 'K', 'E', '\0' },
+ { 'I', 'L', 'L', '\0' },
+ { 'I', 'N', 'K', '\0' },
+ { 'I', 'N', 'N', '\0' },
+ { 'I', 'O', '\0', '\0' },
+ { 'I', 'O', 'N', '\0' },
+ { 'I', 'Q', '\0', '\0' },
+ { 'I', 'R', 'A', '\0' },
+ { 'I', 'R', 'E', '\0' },
+ { 'I', 'R', 'K', '\0' },
+ { 'I', 'S', '\0', '\0' },
+ { 'I', 'T', '\0', '\0' },
+ { 'I', 'T', 'S', '\0' },
+ { 'I', 'V', 'Y', '\0' },
+ { 'J', 'A', 'B', '\0' },
+ { 'J', 'A', 'G', '\0' },
+ { 'J', 'A', 'M', '\0' },
+ { 'J', 'A', 'N', '\0' },
+ { 'J', 'A', 'R', '\0' },
+ { 'J', 'A', 'W', '\0' },
+ { 'J', 'A', 'Y', '\0' },
+ { 'J', 'E', 'T', '\0' },
+ { 'J', 'I', 'G', '\0' },
+ { 'J', 'I', 'M', '\0' },
+ { 'J', 'O', '\0', '\0' },
+ { 'J', 'O', 'B', '\0' },
+ { 'J', 'O', 'E', '\0' },
+ { 'J', 'O', 'G', '\0' },
+ { 'J', 'O', 'T', '\0' },
+ { 'J', 'O', 'Y', '\0' },
+ { 'J', 'U', 'G', '\0' },
+ { 'J', 'U', 'T', '\0' },
+ { 'K', 'A', 'Y', '\0' },
+ { 'K', 'E', 'G', '\0' },
+ { 'K', 'E', 'N', '\0' },
+ { 'K', 'E', 'Y', '\0' },
+ { 'K', 'I', 'D', '\0' },
+ { 'K', 'I', 'M', '\0' },
+ { 'K', 'I', 'N', '\0' },
+ { 'K', 'I', 'T', '\0' },
+ { 'L', 'A', '\0', '\0' },
+ { 'L', 'A', 'B', '\0' },
+ { 'L', 'A', 'C', '\0' },
+ { 'L', 'A', 'D', '\0' },
+ { 'L', 'A', 'G', '\0' },
+ { 'L', 'A', 'M', '\0' },
+ { 'L', 'A', 'P', '\0' },
+ { 'L', 'A', 'W', '\0' },
+ { 'L', 'A', 'Y', '\0' },
+ { 'L', 'E', 'A', '\0' },
+ { 'L', 'E', 'D', '\0' },
+ { 'L', 'E', 'E', '\0' },
+ { 'L', 'E', 'G', '\0' },
+ { 'L', 'E', 'N', '\0' },
+ { 'L', 'E', 'O', '\0' },
+ { 'L', 'E', 'T', '\0' },
+ { 'L', 'E', 'W', '\0' },
+ { 'L', 'I', 'D', '\0' },
+ { 'L', 'I', 'E', '\0' },
+ { 'L', 'I', 'N', '\0' },
+ { 'L', 'I', 'P', '\0' },
+ { 'L', 'I', 'T', '\0' },
+ { 'L', 'O', '\0', '\0' },
+ { 'L', 'O', 'B', '\0' },
+ { 'L', 'O', 'G', '\0' },
+ { 'L', 'O', 'P', '\0' },
+ { 'L', 'O', 'S', '\0' },
+ { 'L', 'O', 'T', '\0' },
+ { 'L', 'O', 'U', '\0' },
+ { 'L', 'O', 'W', '\0' },
+ { 'L', 'O', 'Y', '\0' },
+ { 'L', 'U', 'G', '\0' },
+ { 'L', 'Y', 'E', '\0' },
+ { 'M', 'A', '\0', '\0' },
+ { 'M', 'A', 'C', '\0' },
+ { 'M', 'A', 'D', '\0' },
+ { 'M', 'A', 'E', '\0' },
+ { 'M', 'A', 'N', '\0' },
+ { 'M', 'A', 'O', '\0' },
+ { 'M', 'A', 'P', '\0' },
+ { 'M', 'A', 'T', '\0' },
+ { 'M', 'A', 'W', '\0' },
+ { 'M', 'A', 'Y', '\0' },
+ { 'M', 'E', '\0', '\0' },
+ { 'M', 'E', 'G', '\0' },
+ { 'M', 'E', 'L', '\0' },
+ { 'M', 'E', 'N', '\0' },
+ { 'M', 'E', 'T', '\0' },
+ { 'M', 'E', 'W', '\0' },
+ { 'M', 'I', 'D', '\0' },
+ { 'M', 'I', 'N', '\0' },
+ { 'M', 'I', 'T', '\0' },
+ { 'M', 'O', 'B', '\0' },
+ { 'M', 'O', 'D', '\0' },
+ { 'M', 'O', 'E', '\0' },
+ { 'M', 'O', 'O', '\0' },
+ { 'M', 'O', 'P', '\0' },
+ { 'M', 'O', 'S', '\0' },
+ { 'M', 'O', 'T', '\0' },
+ { 'M', 'O', 'W', '\0' },
+ { 'M', 'U', 'D', '\0' },
+ { 'M', 'U', 'G', '\0' },
+ { 'M', 'U', 'M', '\0' },
+ { 'M', 'Y', '\0', '\0' },
+ { 'N', 'A', 'B', '\0' },
+ { 'N', 'A', 'G', '\0' },
+ { 'N', 'A', 'N', '\0' },
+ { 'N', 'A', 'P', '\0' },
+ { 'N', 'A', 'T', '\0' },
+ { 'N', 'A', 'Y', '\0' },
+ { 'N', 'E', '\0', '\0' },
+ { 'N', 'E', 'D', '\0' },
+ { 'N', 'E', 'E', '\0' },
+ { 'N', 'E', 'T', '\0' },
+ { 'N', 'E', 'W', '\0' },
+ { 'N', 'I', 'B', '\0' },
+ { 'N', 'I', 'L', '\0' },
+ { 'N', 'I', 'P', '\0' },
+ { 'N', 'I', 'T', '\0' },
+ { 'N', 'O', '\0', '\0' },
+ { 'N', 'O', 'B', '\0' },
+ { 'N', 'O', 'D', '\0' },
+ { 'N', 'O', 'N', '\0' },
+ { 'N', 'O', 'R', '\0' },
+ { 'N', 'O', 'T', '\0' },
+ { 'N', 'O', 'V', '\0' },
+ { 'N', 'O', 'W', '\0' },
+ { 'N', 'U', '\0', '\0' },
+ { 'N', 'U', 'N', '\0' },
+ { 'N', 'U', 'T', '\0' },
+ { 'O', '\0', '\0', '\0' },
+ { 'O', 'A', 'F', '\0' },
+ { 'O', 'A', 'K', '\0' },
+ { 'O', 'A', 'R', '\0' },
+ { 'O', 'A', 'T', '\0' },
+ { 'O', 'D', 'D', '\0' },
+ { 'O', 'D', 'E', '\0' },
+ { 'O', 'F', '\0', '\0' },
+ { 'O', 'F', 'F', '\0' },
+ { 'O', 'F', 'T', '\0' },
+ { 'O', 'H', '\0', '\0' },
+ { 'O', 'I', 'L', '\0' },
+ { 'O', 'K', '\0', '\0' },
+ { 'O', 'L', 'D', '\0' },
+ { 'O', 'N', '\0', '\0' },
+ { 'O', 'N', 'E', '\0' },
+ { 'O', 'R', '\0', '\0' },
+ { 'O', 'R', 'B', '\0' },
+ { 'O', 'R', 'E', '\0' },
+ { 'O', 'R', 'R', '\0' },
+ { 'O', 'S', '\0', '\0' },
+ { 'O', 'T', 'T', '\0' },
+ { 'O', 'U', 'R', '\0' },
+ { 'O', 'U', 'T', '\0' },
+ { 'O', 'V', 'A', '\0' },
+ { 'O', 'W', '\0', '\0' },
+ { 'O', 'W', 'E', '\0' },
+ { 'O', 'W', 'L', '\0' },
+ { 'O', 'W', 'N', '\0' },
+ { 'O', 'X', '\0', '\0' },
+ { 'P', 'A', '\0', '\0' },
+ { 'P', 'A', 'D', '\0' },
+ { 'P', 'A', 'L', '\0' },
+ { 'P', 'A', 'M', '\0' },
+ { 'P', 'A', 'N', '\0' },
+ { 'P', 'A', 'P', '\0' },
+ { 'P', 'A', 'R', '\0' },
+ { 'P', 'A', 'T', '\0' },
+ { 'P', 'A', 'W', '\0' },
+ { 'P', 'A', 'Y', '\0' },
+ { 'P', 'E', 'A', '\0' },
+ { 'P', 'E', 'G', '\0' },
+ { 'P', 'E', 'N', '\0' },
+ { 'P', 'E', 'P', '\0' },
+ { 'P', 'E', 'R', '\0' },
+ { 'P', 'E', 'T', '\0' },
+ { 'P', 'E', 'W', '\0' },
+ { 'P', 'H', 'I', '\0' },
+ { 'P', 'I', '\0', '\0' },
+ { 'P', 'I', 'E', '\0' },
+ { 'P', 'I', 'N', '\0' },
+ { 'P', 'I', 'T', '\0' },
+ { 'P', 'L', 'Y', '\0' },
+ { 'P', 'O', '\0', '\0' },
+ { 'P', 'O', 'D', '\0' },
+ { 'P', 'O', 'E', '\0' },
+ { 'P', 'O', 'P', '\0' },
+ { 'P', 'O', 'T', '\0' },
+ { 'P', 'O', 'W', '\0' },
+ { 'P', 'R', 'O', '\0' },
+ { 'P', 'R', 'Y', '\0' },
+ { 'P', 'U', 'B', '\0' },
+ { 'P', 'U', 'G', '\0' },
+ { 'P', 'U', 'N', '\0' },
+ { 'P', 'U', 'P', '\0' },
+ { 'P', 'U', 'T', '\0' },
+ { 'Q', 'U', 'O', '\0' },
+ { 'R', 'A', 'G', '\0' },
+ { 'R', 'A', 'M', '\0' },
+ { 'R', 'A', 'N', '\0' },
+ { 'R', 'A', 'P', '\0' },
+ { 'R', 'A', 'T', '\0' },
+ { 'R', 'A', 'W', '\0' },
+ { 'R', 'A', 'Y', '\0' },
+ { 'R', 'E', 'B', '\0' },
+ { 'R', 'E', 'D', '\0' },
+ { 'R', 'E', 'P', '\0' },
+ { 'R', 'E', 'T', '\0' },
+ { 'R', 'I', 'B', '\0' },
+ { 'R', 'I', 'D', '\0' },
+ { 'R', 'I', 'G', '\0' },
+ { 'R', 'I', 'M', '\0' },
+ { 'R', 'I', 'O', '\0' },
+ { 'R', 'I', 'P', '\0' },
+ { 'R', 'O', 'B', '\0' },
+ { 'R', 'O', 'D', '\0' },
+ { 'R', 'O', 'E', '\0' },
+ { 'R', 'O', 'N', '\0' },
+ { 'R', 'O', 'T', '\0' },
+ { 'R', 'O', 'W', '\0' },
+ { 'R', 'O', 'Y', '\0' },
+ { 'R', 'U', 'B', '\0' },
+ { 'R', 'U', 'E', '\0' },
+ { 'R', 'U', 'G', '\0' },
+ { 'R', 'U', 'M', '\0' },
+ { 'R', 'U', 'N', '\0' },
+ { 'R', 'Y', 'E', '\0' },
+ { 'S', 'A', 'C', '\0' },
+ { 'S', 'A', 'D', '\0' },
+ { 'S', 'A', 'G', '\0' },
+ { 'S', 'A', 'L', '\0' },
+ { 'S', 'A', 'M', '\0' },
+ { 'S', 'A', 'N', '\0' },
+ { 'S', 'A', 'P', '\0' },
+ { 'S', 'A', 'T', '\0' },
+ { 'S', 'A', 'W', '\0' },
+ { 'S', 'A', 'Y', '\0' },
+ { 'S', 'E', 'A', '\0' },
+ { 'S', 'E', 'C', '\0' },
+ { 'S', 'E', 'E', '\0' },
+ { 'S', 'E', 'N', '\0' },
+ { 'S', 'E', 'T', '\0' },
+ { 'S', 'E', 'W', '\0' },
+ { 'S', 'H', 'E', '\0' },
+ { 'S', 'H', 'Y', '\0' },
+ { 'S', 'I', 'N', '\0' },
+ { 'S', 'I', 'P', '\0' },
+ { 'S', 'I', 'R', '\0' },
+ { 'S', 'I', 'S', '\0' },
+ { 'S', 'I', 'T', '\0' },
+ { 'S', 'K', 'I', '\0' },
+ { 'S', 'K', 'Y', '\0' },
+ { 'S', 'L', 'Y', '\0' },
+ { 'S', 'O', '\0', '\0' },
+ { 'S', 'O', 'B', '\0' },
+ { 'S', 'O', 'D', '\0' },
+ { 'S', 'O', 'N', '\0' },
+ { 'S', 'O', 'P', '\0' },
+ { 'S', 'O', 'W', '\0' },
+ { 'S', 'O', 'Y', '\0' },
+ { 'S', 'P', 'A', '\0' },
+ { 'S', 'P', 'Y', '\0' },
+ { 'S', 'U', 'B', '\0' },
+ { 'S', 'U', 'D', '\0' },
+ { 'S', 'U', 'E', '\0' },
+ { 'S', 'U', 'M', '\0' },
+ { 'S', 'U', 'N', '\0' },
+ { 'S', 'U', 'P', '\0' },
+ { 'T', 'A', 'B', '\0' },
+ { 'T', 'A', 'D', '\0' },
+ { 'T', 'A', 'G', '\0' },
+ { 'T', 'A', 'N', '\0' },
+ { 'T', 'A', 'P', '\0' },
+ { 'T', 'A', 'R', '\0' },
+ { 'T', 'E', 'A', '\0' },
+ { 'T', 'E', 'D', '\0' },
+ { 'T', 'E', 'E', '\0' },
+ { 'T', 'E', 'N', '\0' },
+ { 'T', 'H', 'E', '\0' },
+ { 'T', 'H', 'Y', '\0' },
+ { 'T', 'I', 'C', '\0' },
+ { 'T', 'I', 'E', '\0' },
+ { 'T', 'I', 'M', '\0' },
+ { 'T', 'I', 'N', '\0' },
+ { 'T', 'I', 'P', '\0' },
+ { 'T', 'O', '\0', '\0' },
+ { 'T', 'O', 'E', '\0' },
+ { 'T', 'O', 'G', '\0' },
+ { 'T', 'O', 'M', '\0' },
+ { 'T', 'O', 'N', '\0' },
+ { 'T', 'O', 'O', '\0' },
+ { 'T', 'O', 'P', '\0' },
+ { 'T', 'O', 'W', '\0' },
+ { 'T', 'O', 'Y', '\0' },
+ { 'T', 'R', 'Y', '\0' },
+ { 'T', 'U', 'B', '\0' },
+ { 'T', 'U', 'G', '\0' },
+ { 'T', 'U', 'M', '\0' },
+ { 'T', 'U', 'N', '\0' },
+ { 'T', 'W', 'O', '\0' },
+ { 'U', 'N', '\0', '\0' },
+ { 'U', 'P', '\0', '\0' },
+ { 'U', 'S', '\0', '\0' },
+ { 'U', 'S', 'E', '\0' },
+ { 'V', 'A', 'N', '\0' },
+ { 'V', 'A', 'T', '\0' },
+ { 'V', 'E', 'T', '\0' },
+ { 'V', 'I', 'E', '\0' },
+ { 'W', 'A', 'D', '\0' },
+ { 'W', 'A', 'G', '\0' },
+ { 'W', 'A', 'R', '\0' },
+ { 'W', 'A', 'S', '\0' },
+ { 'W', 'A', 'Y', '\0' },
+ { 'W', 'E', '\0', '\0' },
+ { 'W', 'E', 'B', '\0' },
+ { 'W', 'E', 'D', '\0' },
+ { 'W', 'E', 'E', '\0' },
+ { 'W', 'E', 'T', '\0' },
+ { 'W', 'H', 'O', '\0' },
+ { 'W', 'H', 'Y', '\0' },
+ { 'W', 'I', 'N', '\0' },
+ { 'W', 'I', 'T', '\0' },
+ { 'W', 'O', 'K', '\0' },
+ { 'W', 'O', 'N', '\0' },
+ { 'W', 'O', 'O', '\0' },
+ { 'W', 'O', 'W', '\0' },
+ { 'W', 'R', 'Y', '\0' },
+ { 'W', 'U', '\0', '\0' },
+ { 'Y', 'A', 'M', '\0' },
+ { 'Y', 'A', 'P', '\0' },
+ { 'Y', 'A', 'W', '\0' },
+ { 'Y', 'E', '\0', '\0' },
+ { 'Y', 'E', 'A', '\0' },
+ { 'Y', 'E', 'S', '\0' },
+ { 'Y', 'E', 'T', '\0' },
+ { 'Y', 'O', 'U', '\0' },
+ { 'A', 'B', 'E', 'D' },
+ { 'A', 'B', 'E', 'L' },
+ { 'A', 'B', 'E', 'T' },
+ { 'A', 'B', 'L', 'E' },
+ { 'A', 'B', 'U', 'T' },
+ { 'A', 'C', 'H', 'E' },
+ { 'A', 'C', 'I', 'D' },
+ { 'A', 'C', 'M', 'E' },
+ { 'A', 'C', 'R', 'E' },
+ { 'A', 'C', 'T', 'A' },
+ { 'A', 'C', 'T', 'S' },
+ { 'A', 'D', 'A', 'M' },
+ { 'A', 'D', 'D', 'S' },
+ { 'A', 'D', 'E', 'N' },
+ { 'A', 'F', 'A', 'R' },
+ { 'A', 'F', 'R', 'O' },
+ { 'A', 'G', 'E', 'E' },
+ { 'A', 'H', 'E', 'M' },
+ { 'A', 'H', 'O', 'Y' },
+ { 'A', 'I', 'D', 'A' },
+ { 'A', 'I', 'D', 'E' },
+ { 'A', 'I', 'D', 'S' },
+ { 'A', 'I', 'R', 'Y' },
+ { 'A', 'J', 'A', 'R' },
+ { 'A', 'K', 'I', 'N' },
+ { 'A', 'L', 'A', 'N' },
+ { 'A', 'L', 'E', 'C' },
+ { 'A', 'L', 'G', 'A' },
+ { 'A', 'L', 'I', 'A' },
+ { 'A', 'L', 'L', 'Y' },
+ { 'A', 'L', 'M', 'A' },
+ { 'A', 'L', 'O', 'E' },
+ { 'A', 'L', 'S', 'O' },
+ { 'A', 'L', 'T', 'O' },
+ { 'A', 'L', 'U', 'M' },
+ { 'A', 'L', 'V', 'A' },
+ { 'A', 'M', 'E', 'N' },
+ { 'A', 'M', 'E', 'S' },
+ { 'A', 'M', 'I', 'D' },
+ { 'A', 'M', 'M', 'O' },
+ { 'A', 'M', 'O', 'K' },
+ { 'A', 'M', 'O', 'S' },
+ { 'A', 'M', 'R', 'A' },
+ { 'A', 'N', 'D', 'Y' },
+ { 'A', 'N', 'E', 'W' },
+ { 'A', 'N', 'N', 'A' },
+ { 'A', 'N', 'N', 'E' },
+ { 'A', 'N', 'T', 'E' },
+ { 'A', 'N', 'T', 'I' },
+ { 'A', 'Q', 'U', 'A' },
+ { 'A', 'R', 'A', 'B' },
+ { 'A', 'R', 'C', 'H' },
+ { 'A', 'R', 'E', 'A' },
+ { 'A', 'R', 'G', 'O' },
+ { 'A', 'R', 'I', 'D' },
+ { 'A', 'R', 'M', 'Y' },
+ { 'A', 'R', 'T', 'S' },
+ { 'A', 'R', 'T', 'Y' },
+ { 'A', 'S', 'I', 'A' },
+ { 'A', 'S', 'K', 'S' },
+ { 'A', 'T', 'O', 'M' },
+ { 'A', 'U', 'N', 'T' },
+ { 'A', 'U', 'R', 'A' },
+ { 'A', 'U', 'T', 'O' },
+ { 'A', 'V', 'E', 'R' },
+ { 'A', 'V', 'I', 'D' },
+ { 'A', 'V', 'I', 'S' },
+ { 'A', 'V', 'O', 'N' },
+ { 'A', 'V', 'O', 'W' },
+ { 'A', 'W', 'A', 'Y' },
+ { 'A', 'W', 'R', 'Y' },
+ { 'B', 'A', 'B', 'E' },
+ { 'B', 'A', 'B', 'Y' },
+ { 'B', 'A', 'C', 'H' },
+ { 'B', 'A', 'C', 'K' },
+ { 'B', 'A', 'D', 'E' },
+ { 'B', 'A', 'I', 'L' },
+ { 'B', 'A', 'I', 'T' },
+ { 'B', 'A', 'K', 'E' },
+ { 'B', 'A', 'L', 'D' },
+ { 'B', 'A', 'L', 'E' },
+ { 'B', 'A', 'L', 'I' },
+ { 'B', 'A', 'L', 'K' },
+ { 'B', 'A', 'L', 'L' },
+ { 'B', 'A', 'L', 'M' },
+ { 'B', 'A', 'N', 'D' },
+ { 'B', 'A', 'N', 'E' },
+ { 'B', 'A', 'N', 'G' },
+ { 'B', 'A', 'N', 'K' },
+ { 'B', 'A', 'R', 'B' },
+ { 'B', 'A', 'R', 'D' },
+ { 'B', 'A', 'R', 'E' },
+ { 'B', 'A', 'R', 'K' },
+ { 'B', 'A', 'R', 'N' },
+ { 'B', 'A', 'R', 'R' },
+ { 'B', 'A', 'S', 'E' },
+ { 'B', 'A', 'S', 'H' },
+ { 'B', 'A', 'S', 'K' },
+ { 'B', 'A', 'S', 'S' },
+ { 'B', 'A', 'T', 'E' },
+ { 'B', 'A', 'T', 'H' },
+ { 'B', 'A', 'W', 'D' },
+ { 'B', 'A', 'W', 'L' },
+ { 'B', 'E', 'A', 'D' },
+ { 'B', 'E', 'A', 'K' },
+ { 'B', 'E', 'A', 'M' },
+ { 'B', 'E', 'A', 'N' },
+ { 'B', 'E', 'A', 'R' },
+ { 'B', 'E', 'A', 'T' },
+ { 'B', 'E', 'A', 'U' },
+ { 'B', 'E', 'C', 'K' },
+ { 'B', 'E', 'E', 'F' },
+ { 'B', 'E', 'E', 'N' },
+ { 'B', 'E', 'E', 'R' },
+ { 'B', 'E', 'E', 'T' },
+ { 'B', 'E', 'L', 'A' },
+ { 'B', 'E', 'L', 'L' },
+ { 'B', 'E', 'L', 'T' },
+ { 'B', 'E', 'N', 'D' },
+ { 'B', 'E', 'N', 'T' },
+ { 'B', 'E', 'R', 'G' },
+ { 'B', 'E', 'R', 'N' },
+ { 'B', 'E', 'R', 'T' },
+ { 'B', 'E', 'S', 'S' },
+ { 'B', 'E', 'S', 'T' },
+ { 'B', 'E', 'T', 'A' },
+ { 'B', 'E', 'T', 'H' },
+ { 'B', 'H', 'O', 'Y' },
+ { 'B', 'I', 'A', 'S' },
+ { 'B', 'I', 'D', 'E' },
+ { 'B', 'I', 'E', 'N' },
+ { 'B', 'I', 'L', 'E' },
+ { 'B', 'I', 'L', 'K' },
+ { 'B', 'I', 'L', 'L' },
+ { 'B', 'I', 'N', 'D' },
+ { 'B', 'I', 'N', 'G' },
+ { 'B', 'I', 'R', 'D' },
+ { 'B', 'I', 'T', 'E' },
+ { 'B', 'I', 'T', 'S' },
+ { 'B', 'L', 'A', 'B' },
+ { 'B', 'L', 'A', 'T' },
+ { 'B', 'L', 'E', 'D' },
+ { 'B', 'L', 'E', 'W' },
+ { 'B', 'L', 'O', 'B' },
+ { 'B', 'L', 'O', 'C' },
+ { 'B', 'L', 'O', 'T' },
+ { 'B', 'L', 'O', 'W' },
+ { 'B', 'L', 'U', 'E' },
+ { 'B', 'L', 'U', 'M' },
+ { 'B', 'L', 'U', 'R' },
+ { 'B', 'O', 'A', 'R' },
+ { 'B', 'O', 'A', 'T' },
+ { 'B', 'O', 'C', 'A' },
+ { 'B', 'O', 'C', 'K' },
+ { 'B', 'O', 'D', 'E' },
+ { 'B', 'O', 'D', 'Y' },
+ { 'B', 'O', 'G', 'Y' },
+ { 'B', 'O', 'H', 'R' },
+ { 'B', 'O', 'I', 'L' },
+ { 'B', 'O', 'L', 'D' },
+ { 'B', 'O', 'L', 'O' },
+ { 'B', 'O', 'L', 'T' },
+ { 'B', 'O', 'M', 'B' },
+ { 'B', 'O', 'N', 'A' },
+ { 'B', 'O', 'N', 'D' },
+ { 'B', 'O', 'N', 'E' },
+ { 'B', 'O', 'N', 'G' },
+ { 'B', 'O', 'N', 'N' },
+ { 'B', 'O', 'N', 'Y' },
+ { 'B', 'O', 'O', 'K' },
+ { 'B', 'O', 'O', 'M' },
+ { 'B', 'O', 'O', 'N' },
+ { 'B', 'O', 'O', 'T' },
+ { 'B', 'O', 'R', 'E' },
+ { 'B', 'O', 'R', 'G' },
+ { 'B', 'O', 'R', 'N' },
+ { 'B', 'O', 'S', 'E' },
+ { 'B', 'O', 'S', 'S' },
+ { 'B', 'O', 'T', 'H' },
+ { 'B', 'O', 'U', 'T' },
+ { 'B', 'O', 'W', 'L' },
+ { 'B', 'O', 'Y', 'D' },
+ { 'B', 'R', 'A', 'D' },
+ { 'B', 'R', 'A', 'E' },
+ { 'B', 'R', 'A', 'G' },
+ { 'B', 'R', 'A', 'N' },
+ { 'B', 'R', 'A', 'Y' },
+ { 'B', 'R', 'E', 'D' },
+ { 'B', 'R', 'E', 'W' },
+ { 'B', 'R', 'I', 'G' },
+ { 'B', 'R', 'I', 'M' },
+ { 'B', 'R', 'O', 'W' },
+ { 'B', 'U', 'C', 'K' },
+ { 'B', 'U', 'D', 'D' },
+ { 'B', 'U', 'F', 'F' },
+ { 'B', 'U', 'L', 'B' },
+ { 'B', 'U', 'L', 'K' },
+ { 'B', 'U', 'L', 'L' },
+ { 'B', 'U', 'N', 'K' },
+ { 'B', 'U', 'N', 'T' },
+ { 'B', 'U', 'O', 'Y' },
+ { 'B', 'U', 'R', 'G' },
+ { 'B', 'U', 'R', 'L' },
+ { 'B', 'U', 'R', 'N' },
+ { 'B', 'U', 'R', 'R' },
+ { 'B', 'U', 'R', 'T' },
+ { 'B', 'U', 'R', 'Y' },
+ { 'B', 'U', 'S', 'H' },
+ { 'B', 'U', 'S', 'S' },
+ { 'B', 'U', 'S', 'T' },
+ { 'B', 'U', 'S', 'Y' },
+ { 'B', 'Y', 'T', 'E' },
+ { 'C', 'A', 'D', 'Y' },
+ { 'C', 'A', 'F', 'E' },
+ { 'C', 'A', 'G', 'E' },
+ { 'C', 'A', 'I', 'N' },
+ { 'C', 'A', 'K', 'E' },
+ { 'C', 'A', 'L', 'F' },
+ { 'C', 'A', 'L', 'L' },
+ { 'C', 'A', 'L', 'M' },
+ { 'C', 'A', 'M', 'E' },
+ { 'C', 'A', 'N', 'E' },
+ { 'C', 'A', 'N', 'T' },
+ { 'C', 'A', 'R', 'D' },
+ { 'C', 'A', 'R', 'E' },
+ { 'C', 'A', 'R', 'L' },
+ { 'C', 'A', 'R', 'R' },
+ { 'C', 'A', 'R', 'T' },
+ { 'C', 'A', 'S', 'E' },
+ { 'C', 'A', 'S', 'H' },
+ { 'C', 'A', 'S', 'K' },
+ { 'C', 'A', 'S', 'T' },
+ { 'C', 'A', 'V', 'E' },
+ { 'C', 'E', 'I', 'L' },
+ { 'C', 'E', 'L', 'L' },
+ { 'C', 'E', 'N', 'T' },
+ { 'C', 'E', 'R', 'N' },
+ { 'C', 'H', 'A', 'D' },
+ { 'C', 'H', 'A', 'R' },
+ { 'C', 'H', 'A', 'T' },
+ { 'C', 'H', 'A', 'W' },
+ { 'C', 'H', 'E', 'F' },
+ { 'C', 'H', 'E', 'N' },
+ { 'C', 'H', 'E', 'W' },
+ { 'C', 'H', 'I', 'C' },
+ { 'C', 'H', 'I', 'N' },
+ { 'C', 'H', 'O', 'U' },
+ { 'C', 'H', 'O', 'W' },
+ { 'C', 'H', 'U', 'B' },
+ { 'C', 'H', 'U', 'G' },
+ { 'C', 'H', 'U', 'M' },
+ { 'C', 'I', 'T', 'E' },
+ { 'C', 'I', 'T', 'Y' },
+ { 'C', 'L', 'A', 'D' },
+ { 'C', 'L', 'A', 'M' },
+ { 'C', 'L', 'A', 'N' },
+ { 'C', 'L', 'A', 'W' },
+ { 'C', 'L', 'A', 'Y' },
+ { 'C', 'L', 'O', 'D' },
+ { 'C', 'L', 'O', 'G' },
+ { 'C', 'L', 'O', 'T' },
+ { 'C', 'L', 'U', 'B' },
+ { 'C', 'L', 'U', 'E' },
+ { 'C', 'O', 'A', 'L' },
+ { 'C', 'O', 'A', 'T' },
+ { 'C', 'O', 'C', 'A' },
+ { 'C', 'O', 'C', 'K' },
+ { 'C', 'O', 'C', 'O' },
+ { 'C', 'O', 'D', 'A' },
+ { 'C', 'O', 'D', 'E' },
+ { 'C', 'O', 'D', 'Y' },
+ { 'C', 'O', 'E', 'D' },
+ { 'C', 'O', 'I', 'L' },
+ { 'C', 'O', 'I', 'N' },
+ { 'C', 'O', 'K', 'E' },
+ { 'C', 'O', 'L', 'A' },
+ { 'C', 'O', 'L', 'D' },
+ { 'C', 'O', 'L', 'T' },
+ { 'C', 'O', 'M', 'A' },
+ { 'C', 'O', 'M', 'B' },
+ { 'C', 'O', 'M', 'E' },
+ { 'C', 'O', 'O', 'K' },
+ { 'C', 'O', 'O', 'L' },
+ { 'C', 'O', 'O', 'N' },
+ { 'C', 'O', 'O', 'T' },
+ { 'C', 'O', 'R', 'D' },
+ { 'C', 'O', 'R', 'E' },
+ { 'C', 'O', 'R', 'K' },
+ { 'C', 'O', 'R', 'N' },
+ { 'C', 'O', 'S', 'T' },
+ { 'C', 'O', 'V', 'E' },
+ { 'C', 'O', 'W', 'L' },
+ { 'C', 'R', 'A', 'B' },
+ { 'C', 'R', 'A', 'G' },
+ { 'C', 'R', 'A', 'M' },
+ { 'C', 'R', 'A', 'Y' },
+ { 'C', 'R', 'E', 'W' },
+ { 'C', 'R', 'I', 'B' },
+ { 'C', 'R', 'O', 'W' },
+ { 'C', 'R', 'U', 'D' },
+ { 'C', 'U', 'B', 'A' },
+ { 'C', 'U', 'B', 'E' },
+ { 'C', 'U', 'F', 'F' },
+ { 'C', 'U', 'L', 'L' },
+ { 'C', 'U', 'L', 'T' },
+ { 'C', 'U', 'N', 'Y' },
+ { 'C', 'U', 'R', 'B' },
+ { 'C', 'U', 'R', 'D' },
+ { 'C', 'U', 'R', 'E' },
+ { 'C', 'U', 'R', 'L' },
+ { 'C', 'U', 'R', 'T' },
+ { 'C', 'U', 'T', 'S' },
+ { 'D', 'A', 'D', 'E' },
+ { 'D', 'A', 'L', 'E' },
+ { 'D', 'A', 'M', 'E' },
+ { 'D', 'A', 'N', 'A' },
+ { 'D', 'A', 'N', 'E' },
+ { 'D', 'A', 'N', 'G' },
+ { 'D', 'A', 'N', 'K' },
+ { 'D', 'A', 'R', 'E' },
+ { 'D', 'A', 'R', 'K' },
+ { 'D', 'A', 'R', 'N' },
+ { 'D', 'A', 'R', 'T' },
+ { 'D', 'A', 'S', 'H' },
+ { 'D', 'A', 'T', 'A' },
+ { 'D', 'A', 'T', 'E' },
+ { 'D', 'A', 'V', 'E' },
+ { 'D', 'A', 'V', 'Y' },
+ { 'D', 'A', 'W', 'N' },
+ { 'D', 'A', 'Y', 'S' },
+ { 'D', 'E', 'A', 'D' },
+ { 'D', 'E', 'A', 'F' },
+ { 'D', 'E', 'A', 'L' },
+ { 'D', 'E', 'A', 'N' },
+ { 'D', 'E', 'A', 'R' },
+ { 'D', 'E', 'B', 'T' },
+ { 'D', 'E', 'C', 'K' },
+ { 'D', 'E', 'E', 'D' },
+ { 'D', 'E', 'E', 'M' },
+ { 'D', 'E', 'E', 'R' },
+ { 'D', 'E', 'F', 'T' },
+ { 'D', 'E', 'F', 'Y' },
+ { 'D', 'E', 'L', 'L' },
+ { 'D', 'E', 'N', 'T' },
+ { 'D', 'E', 'N', 'Y' },
+ { 'D', 'E', 'S', 'K' },
+ { 'D', 'I', 'A', 'L' },
+ { 'D', 'I', 'C', 'E' },
+ { 'D', 'I', 'E', 'D' },
+ { 'D', 'I', 'E', 'T' },
+ { 'D', 'I', 'M', 'E' },
+ { 'D', 'I', 'N', 'E' },
+ { 'D', 'I', 'N', 'G' },
+ { 'D', 'I', 'N', 'T' },
+ { 'D', 'I', 'R', 'E' },
+ { 'D', 'I', 'R', 'T' },
+ { 'D', 'I', 'S', 'C' },
+ { 'D', 'I', 'S', 'H' },
+ { 'D', 'I', 'S', 'K' },
+ { 'D', 'I', 'V', 'E' },
+ { 'D', 'O', 'C', 'K' },
+ { 'D', 'O', 'E', 'S' },
+ { 'D', 'O', 'L', 'E' },
+ { 'D', 'O', 'L', 'L' },
+ { 'D', 'O', 'L', 'T' },
+ { 'D', 'O', 'M', 'E' },
+ { 'D', 'O', 'N', 'E' },
+ { 'D', 'O', 'O', 'M' },
+ { 'D', 'O', 'O', 'R' },
+ { 'D', 'O', 'R', 'A' },
+ { 'D', 'O', 'S', 'E' },
+ { 'D', 'O', 'T', 'E' },
+ { 'D', 'O', 'U', 'G' },
+ { 'D', 'O', 'U', 'R' },
+ { 'D', 'O', 'V', 'E' },
+ { 'D', 'O', 'W', 'N' },
+ { 'D', 'R', 'A', 'B' },
+ { 'D', 'R', 'A', 'G' },
+ { 'D', 'R', 'A', 'M' },
+ { 'D', 'R', 'A', 'W' },
+ { 'D', 'R', 'E', 'W' },
+ { 'D', 'R', 'U', 'B' },
+ { 'D', 'R', 'U', 'G' },
+ { 'D', 'R', 'U', 'M' },
+ { 'D', 'U', 'A', 'L' },
+ { 'D', 'U', 'C', 'K' },
+ { 'D', 'U', 'C', 'T' },
+ { 'D', 'U', 'E', 'L' },
+ { 'D', 'U', 'E', 'T' },
+ { 'D', 'U', 'K', 'E' },
+ { 'D', 'U', 'L', 'L' },
+ { 'D', 'U', 'M', 'B' },
+ { 'D', 'U', 'N', 'E' },
+ { 'D', 'U', 'N', 'K' },
+ { 'D', 'U', 'S', 'K' },
+ { 'D', 'U', 'S', 'T' },
+ { 'D', 'U', 'T', 'Y' },
+ { 'E', 'A', 'C', 'H' },
+ { 'E', 'A', 'R', 'L' },
+ { 'E', 'A', 'R', 'N' },
+ { 'E', 'A', 'S', 'E' },
+ { 'E', 'A', 'S', 'T' },
+ { 'E', 'A', 'S', 'Y' },
+ { 'E', 'B', 'E', 'N' },
+ { 'E', 'C', 'H', 'O' },
+ { 'E', 'D', 'D', 'Y' },
+ { 'E', 'D', 'E', 'N' },
+ { 'E', 'D', 'G', 'E' },
+ { 'E', 'D', 'G', 'Y' },
+ { 'E', 'D', 'I', 'T' },
+ { 'E', 'D', 'N', 'A' },
+ { 'E', 'G', 'A', 'N' },
+ { 'E', 'L', 'A', 'N' },
+ { 'E', 'L', 'B', 'A' },
+ { 'E', 'L', 'L', 'A' },
+ { 'E', 'L', 'S', 'E' },
+ { 'E', 'M', 'I', 'L' },
+ { 'E', 'M', 'I', 'T' },
+ { 'E', 'M', 'M', 'A' },
+ { 'E', 'N', 'D', 'S' },
+ { 'E', 'R', 'I', 'C' },
+ { 'E', 'R', 'O', 'S' },
+ { 'E', 'V', 'E', 'N' },
+ { 'E', 'V', 'E', 'R' },
+ { 'E', 'V', 'I', 'L' },
+ { 'E', 'Y', 'E', 'D' },
+ { 'F', 'A', 'C', 'E' },
+ { 'F', 'A', 'C', 'T' },
+ { 'F', 'A', 'D', 'E' },
+ { 'F', 'A', 'I', 'L' },
+ { 'F', 'A', 'I', 'N' },
+ { 'F', 'A', 'I', 'R' },
+ { 'F', 'A', 'K', 'E' },
+ { 'F', 'A', 'L', 'L' },
+ { 'F', 'A', 'M', 'E' },
+ { 'F', 'A', 'N', 'G' },
+ { 'F', 'A', 'R', 'M' },
+ { 'F', 'A', 'S', 'T' },
+ { 'F', 'A', 'T', 'E' },
+ { 'F', 'A', 'W', 'N' },
+ { 'F', 'E', 'A', 'R' },
+ { 'F', 'E', 'A', 'T' },
+ { 'F', 'E', 'E', 'D' },
+ { 'F', 'E', 'E', 'L' },
+ { 'F', 'E', 'E', 'T' },
+ { 'F', 'E', 'L', 'L' },
+ { 'F', 'E', 'L', 'T' },
+ { 'F', 'E', 'N', 'D' },
+ { 'F', 'E', 'R', 'N' },
+ { 'F', 'E', 'S', 'T' },
+ { 'F', 'E', 'U', 'D' },
+ { 'F', 'I', 'E', 'F' },
+ { 'F', 'I', 'G', 'S' },
+ { 'F', 'I', 'L', 'E' },
+ { 'F', 'I', 'L', 'L' },
+ { 'F', 'I', 'L', 'M' },
+ { 'F', 'I', 'N', 'D' },
+ { 'F', 'I', 'N', 'E' },
+ { 'F', 'I', 'N', 'K' },
+ { 'F', 'I', 'R', 'E' },
+ { 'F', 'I', 'R', 'M' },
+ { 'F', 'I', 'S', 'H' },
+ { 'F', 'I', 'S', 'K' },
+ { 'F', 'I', 'S', 'T' },
+ { 'F', 'I', 'T', 'S' },
+ { 'F', 'I', 'V', 'E' },
+ { 'F', 'L', 'A', 'G' },
+ { 'F', 'L', 'A', 'K' },
+ { 'F', 'L', 'A', 'M' },
+ { 'F', 'L', 'A', 'T' },
+ { 'F', 'L', 'A', 'W' },
+ { 'F', 'L', 'E', 'A' },
+ { 'F', 'L', 'E', 'D' },
+ { 'F', 'L', 'E', 'W' },
+ { 'F', 'L', 'I', 'T' },
+ { 'F', 'L', 'O', 'C' },
+ { 'F', 'L', 'O', 'G' },
+ { 'F', 'L', 'O', 'W' },
+ { 'F', 'L', 'U', 'B' },
+ { 'F', 'L', 'U', 'E' },
+ { 'F', 'O', 'A', 'L' },
+ { 'F', 'O', 'A', 'M' },
+ { 'F', 'O', 'G', 'Y' },
+ { 'F', 'O', 'I', 'L' },
+ { 'F', 'O', 'L', 'D' },
+ { 'F', 'O', 'L', 'K' },
+ { 'F', 'O', 'N', 'D' },
+ { 'F', 'O', 'N', 'T' },
+ { 'F', 'O', 'O', 'D' },
+ { 'F', 'O', 'O', 'L' },
+ { 'F', 'O', 'O', 'T' },
+ { 'F', 'O', 'R', 'D' },
+ { 'F', 'O', 'R', 'E' },
+ { 'F', 'O', 'R', 'K' },
+ { 'F', 'O', 'R', 'M' },
+ { 'F', 'O', 'R', 'T' },
+ { 'F', 'O', 'S', 'S' },
+ { 'F', 'O', 'U', 'L' },
+ { 'F', 'O', 'U', 'R' },
+ { 'F', 'O', 'W', 'L' },
+ { 'F', 'R', 'A', 'U' },
+ { 'F', 'R', 'A', 'Y' },
+ { 'F', 'R', 'E', 'D' },
+ { 'F', 'R', 'E', 'E' },
+ { 'F', 'R', 'E', 'T' },
+ { 'F', 'R', 'E', 'Y' },
+ { 'F', 'R', 'O', 'G' },
+ { 'F', 'R', 'O', 'M' },
+ { 'F', 'U', 'E', 'L' },
+ { 'F', 'U', 'L', 'L' },
+ { 'F', 'U', 'M', 'E' },
+ { 'F', 'U', 'N', 'D' },
+ { 'F', 'U', 'N', 'K' },
+ { 'F', 'U', 'R', 'Y' },
+ { 'F', 'U', 'S', 'E' },
+ { 'F', 'U', 'S', 'S' },
+ { 'G', 'A', 'F', 'F' },
+ { 'G', 'A', 'G', 'E' },
+ { 'G', 'A', 'I', 'L' },
+ { 'G', 'A', 'I', 'N' },
+ { 'G', 'A', 'I', 'T' },
+ { 'G', 'A', 'L', 'A' },
+ { 'G', 'A', 'L', 'E' },
+ { 'G', 'A', 'L', 'L' },
+ { 'G', 'A', 'L', 'T' },
+ { 'G', 'A', 'M', 'E' },
+ { 'G', 'A', 'N', 'G' },
+ { 'G', 'A', 'R', 'B' },
+ { 'G', 'A', 'R', 'Y' },
+ { 'G', 'A', 'S', 'H' },
+ { 'G', 'A', 'T', 'E' },
+ { 'G', 'A', 'U', 'L' },
+ { 'G', 'A', 'U', 'R' },
+ { 'G', 'A', 'V', 'E' },
+ { 'G', 'A', 'W', 'K' },
+ { 'G', 'E', 'A', 'R' },
+ { 'G', 'E', 'L', 'D' },
+ { 'G', 'E', 'N', 'E' },
+ { 'G', 'E', 'N', 'T' },
+ { 'G', 'E', 'R', 'M' },
+ { 'G', 'E', 'T', 'S' },
+ { 'G', 'I', 'B', 'E' },
+ { 'G', 'I', 'F', 'T' },
+ { 'G', 'I', 'L', 'D' },
+ { 'G', 'I', 'L', 'L' },
+ { 'G', 'I', 'L', 'T' },
+ { 'G', 'I', 'N', 'A' },
+ { 'G', 'I', 'R', 'D' },
+ { 'G', 'I', 'R', 'L' },
+ { 'G', 'I', 'S', 'T' },
+ { 'G', 'I', 'V', 'E' },
+ { 'G', 'L', 'A', 'D' },
+ { 'G', 'L', 'E', 'E' },
+ { 'G', 'L', 'E', 'N' },
+ { 'G', 'L', 'I', 'B' },
+ { 'G', 'L', 'O', 'B' },
+ { 'G', 'L', 'O', 'M' },
+ { 'G', 'L', 'O', 'W' },
+ { 'G', 'L', 'U', 'E' },
+ { 'G', 'L', 'U', 'M' },
+ { 'G', 'L', 'U', 'T' },
+ { 'G', 'O', 'A', 'D' },
+ { 'G', 'O', 'A', 'L' },
+ { 'G', 'O', 'A', 'T' },
+ { 'G', 'O', 'E', 'R' },
+ { 'G', 'O', 'E', 'S' },
+ { 'G', 'O', 'L', 'D' },
+ { 'G', 'O', 'L', 'F' },
+ { 'G', 'O', 'N', 'E' },
+ { 'G', 'O', 'N', 'G' },
+ { 'G', 'O', 'O', 'D' },
+ { 'G', 'O', 'O', 'F' },
+ { 'G', 'O', 'R', 'E' },
+ { 'G', 'O', 'R', 'Y' },
+ { 'G', 'O', 'S', 'H' },
+ { 'G', 'O', 'U', 'T' },
+ { 'G', 'O', 'W', 'N' },
+ { 'G', 'R', 'A', 'B' },
+ { 'G', 'R', 'A', 'D' },
+ { 'G', 'R', 'A', 'Y' },
+ { 'G', 'R', 'E', 'G' },
+ { 'G', 'R', 'E', 'W' },
+ { 'G', 'R', 'E', 'Y' },
+ { 'G', 'R', 'I', 'D' },
+ { 'G', 'R', 'I', 'M' },
+ { 'G', 'R', 'I', 'N' },
+ { 'G', 'R', 'I', 'T' },
+ { 'G', 'R', 'O', 'W' },
+ { 'G', 'R', 'U', 'B' },
+ { 'G', 'U', 'L', 'F' },
+ { 'G', 'U', 'L', 'L' },
+ { 'G', 'U', 'N', 'K' },
+ { 'G', 'U', 'R', 'U' },
+ { 'G', 'U', 'S', 'H' },
+ { 'G', 'U', 'S', 'T' },
+ { 'G', 'W', 'E', 'N' },
+ { 'G', 'W', 'Y', 'N' },
+ { 'H', 'A', 'A', 'G' },
+ { 'H', 'A', 'A', 'S' },
+ { 'H', 'A', 'C', 'K' },
+ { 'H', 'A', 'I', 'L' },
+ { 'H', 'A', 'I', 'R' },
+ { 'H', 'A', 'L', 'E' },
+ { 'H', 'A', 'L', 'F' },
+ { 'H', 'A', 'L', 'L' },
+ { 'H', 'A', 'L', 'O' },
+ { 'H', 'A', 'L', 'T' },
+ { 'H', 'A', 'N', 'D' },
+ { 'H', 'A', 'N', 'G' },
+ { 'H', 'A', 'N', 'K' },
+ { 'H', 'A', 'N', 'S' },
+ { 'H', 'A', 'R', 'D' },
+ { 'H', 'A', 'R', 'K' },
+ { 'H', 'A', 'R', 'M' },
+ { 'H', 'A', 'R', 'T' },
+ { 'H', 'A', 'S', 'H' },
+ { 'H', 'A', 'S', 'T' },
+ { 'H', 'A', 'T', 'E' },
+ { 'H', 'A', 'T', 'H' },
+ { 'H', 'A', 'U', 'L' },
+ { 'H', 'A', 'V', 'E' },
+ { 'H', 'A', 'W', 'K' },
+ { 'H', 'A', 'Y', 'S' },
+ { 'H', 'E', 'A', 'D' },
+ { 'H', 'E', 'A', 'L' },
+ { 'H', 'E', 'A', 'R' },
+ { 'H', 'E', 'A', 'T' },
+ { 'H', 'E', 'B', 'E' },
+ { 'H', 'E', 'C', 'K' },
+ { 'H', 'E', 'E', 'D' },
+ { 'H', 'E', 'E', 'L' },
+ { 'H', 'E', 'F', 'T' },
+ { 'H', 'E', 'L', 'D' },
+ { 'H', 'E', 'L', 'L' },
+ { 'H', 'E', 'L', 'M' },
+ { 'H', 'E', 'R', 'B' },
+ { 'H', 'E', 'R', 'D' },
+ { 'H', 'E', 'R', 'E' },
+ { 'H', 'E', 'R', 'O' },
+ { 'H', 'E', 'R', 'S' },
+ { 'H', 'E', 'S', 'S' },
+ { 'H', 'E', 'W', 'N' },
+ { 'H', 'I', 'C', 'K' },
+ { 'H', 'I', 'D', 'E' },
+ { 'H', 'I', 'G', 'H' },
+ { 'H', 'I', 'K', 'E' },
+ { 'H', 'I', 'L', 'L' },
+ { 'H', 'I', 'L', 'T' },
+ { 'H', 'I', 'N', 'D' },
+ { 'H', 'I', 'N', 'T' },
+ { 'H', 'I', 'R', 'E' },
+ { 'H', 'I', 'S', 'S' },
+ { 'H', 'I', 'V', 'E' },
+ { 'H', 'O', 'B', 'O' },
+ { 'H', 'O', 'C', 'K' },
+ { 'H', 'O', 'F', 'F' },
+ { 'H', 'O', 'L', 'D' },
+ { 'H', 'O', 'L', 'E' },
+ { 'H', 'O', 'L', 'M' },
+ { 'H', 'O', 'L', 'T' },
+ { 'H', 'O', 'M', 'E' },
+ { 'H', 'O', 'N', 'E' },
+ { 'H', 'O', 'N', 'K' },
+ { 'H', 'O', 'O', 'D' },
+ { 'H', 'O', 'O', 'F' },
+ { 'H', 'O', 'O', 'K' },
+ { 'H', 'O', 'O', 'T' },
+ { 'H', 'O', 'R', 'N' },
+ { 'H', 'O', 'S', 'E' },
+ { 'H', 'O', 'S', 'T' },
+ { 'H', 'O', 'U', 'R' },
+ { 'H', 'O', 'V', 'E' },
+ { 'H', 'O', 'W', 'E' },
+ { 'H', 'O', 'W', 'L' },
+ { 'H', 'O', 'Y', 'T' },
+ { 'H', 'U', 'C', 'K' },
+ { 'H', 'U', 'E', 'D' },
+ { 'H', 'U', 'F', 'F' },
+ { 'H', 'U', 'G', 'E' },
+ { 'H', 'U', 'G', 'H' },
+ { 'H', 'U', 'G', 'O' },
+ { 'H', 'U', 'L', 'K' },
+ { 'H', 'U', 'L', 'L' },
+ { 'H', 'U', 'N', 'K' },
+ { 'H', 'U', 'N', 'T' },
+ { 'H', 'U', 'R', 'D' },
+ { 'H', 'U', 'R', 'L' },
+ { 'H', 'U', 'R', 'T' },
+ { 'H', 'U', 'S', 'H' },
+ { 'H', 'Y', 'D', 'E' },
+ { 'H', 'Y', 'M', 'N' },
+ { 'I', 'B', 'I', 'S' },
+ { 'I', 'C', 'O', 'N' },
+ { 'I', 'D', 'E', 'A' },
+ { 'I', 'D', 'L', 'E' },
+ { 'I', 'F', 'F', 'Y' },
+ { 'I', 'N', 'C', 'A' },
+ { 'I', 'N', 'C', 'H' },
+ { 'I', 'N', 'T', 'O' },
+ { 'I', 'O', 'N', 'S' },
+ { 'I', 'O', 'T', 'A' },
+ { 'I', 'O', 'W', 'A' },
+ { 'I', 'R', 'I', 'S' },
+ { 'I', 'R', 'M', 'A' },
+ { 'I', 'R', 'O', 'N' },
+ { 'I', 'S', 'L', 'E' },
+ { 'I', 'T', 'C', 'H' },
+ { 'I', 'T', 'E', 'M' },
+ { 'I', 'V', 'A', 'N' },
+ { 'J', 'A', 'C', 'K' },
+ { 'J', 'A', 'D', 'E' },
+ { 'J', 'A', 'I', 'L' },
+ { 'J', 'A', 'K', 'E' },
+ { 'J', 'A', 'N', 'E' },
+ { 'J', 'A', 'V', 'A' },
+ { 'J', 'E', 'A', 'N' },
+ { 'J', 'E', 'F', 'F' },
+ { 'J', 'E', 'R', 'K' },
+ { 'J', 'E', 'S', 'S' },
+ { 'J', 'E', 'S', 'T' },
+ { 'J', 'I', 'B', 'E' },
+ { 'J', 'I', 'L', 'L' },
+ { 'J', 'I', 'L', 'T' },
+ { 'J', 'I', 'V', 'E' },
+ { 'J', 'O', 'A', 'N' },
+ { 'J', 'O', 'B', 'S' },
+ { 'J', 'O', 'C', 'K' },
+ { 'J', 'O', 'E', 'L' },
+ { 'J', 'O', 'E', 'Y' },
+ { 'J', 'O', 'H', 'N' },
+ { 'J', 'O', 'I', 'N' },
+ { 'J', 'O', 'K', 'E' },
+ { 'J', 'O', 'L', 'T' },
+ { 'J', 'O', 'V', 'E' },
+ { 'J', 'U', 'D', 'D' },
+ { 'J', 'U', 'D', 'E' },
+ { 'J', 'U', 'D', 'O' },
+ { 'J', 'U', 'D', 'Y' },
+ { 'J', 'U', 'J', 'U' },
+ { 'J', 'U', 'K', 'E' },
+ { 'J', 'U', 'L', 'Y' },
+ { 'J', 'U', 'N', 'E' },
+ { 'J', 'U', 'N', 'K' },
+ { 'J', 'U', 'N', 'O' },
+ { 'J', 'U', 'R', 'Y' },
+ { 'J', 'U', 'S', 'T' },
+ { 'J', 'U', 'T', 'E' },
+ { 'K', 'A', 'H', 'N' },
+ { 'K', 'A', 'L', 'E' },
+ { 'K', 'A', 'N', 'E' },
+ { 'K', 'A', 'N', 'T' },
+ { 'K', 'A', 'R', 'L' },
+ { 'K', 'A', 'T', 'E' },
+ { 'K', 'E', 'E', 'L' },
+ { 'K', 'E', 'E', 'N' },
+ { 'K', 'E', 'N', 'O' },
+ { 'K', 'E', 'N', 'T' },
+ { 'K', 'E', 'R', 'N' },
+ { 'K', 'E', 'R', 'R' },
+ { 'K', 'E', 'Y', 'S' },
+ { 'K', 'I', 'C', 'K' },
+ { 'K', 'I', 'L', 'L' },
+ { 'K', 'I', 'N', 'D' },
+ { 'K', 'I', 'N', 'G' },
+ { 'K', 'I', 'R', 'K' },
+ { 'K', 'I', 'S', 'S' },
+ { 'K', 'I', 'T', 'E' },
+ { 'K', 'L', 'A', 'N' },
+ { 'K', 'N', 'E', 'E' },
+ { 'K', 'N', 'E', 'W' },
+ { 'K', 'N', 'I', 'T' },
+ { 'K', 'N', 'O', 'B' },
+ { 'K', 'N', 'O', 'T' },
+ { 'K', 'N', 'O', 'W' },
+ { 'K', 'O', 'C', 'H' },
+ { 'K', 'O', 'N', 'G' },
+ { 'K', 'U', 'D', 'O' },
+ { 'K', 'U', 'R', 'D' },
+ { 'K', 'U', 'R', 'T' },
+ { 'K', 'Y', 'L', 'E' },
+ { 'L', 'A', 'C', 'E' },
+ { 'L', 'A', 'C', 'K' },
+ { 'L', 'A', 'C', 'Y' },
+ { 'L', 'A', 'D', 'Y' },
+ { 'L', 'A', 'I', 'D' },
+ { 'L', 'A', 'I', 'N' },
+ { 'L', 'A', 'I', 'R' },
+ { 'L', 'A', 'K', 'E' },
+ { 'L', 'A', 'M', 'B' },
+ { 'L', 'A', 'M', 'E' },
+ { 'L', 'A', 'N', 'D' },
+ { 'L', 'A', 'N', 'E' },
+ { 'L', 'A', 'N', 'G' },
+ { 'L', 'A', 'R', 'D' },
+ { 'L', 'A', 'R', 'K' },
+ { 'L', 'A', 'S', 'S' },
+ { 'L', 'A', 'S', 'T' },
+ { 'L', 'A', 'T', 'E' },
+ { 'L', 'A', 'U', 'D' },
+ { 'L', 'A', 'V', 'A' },
+ { 'L', 'A', 'W', 'N' },
+ { 'L', 'A', 'W', 'S' },
+ { 'L', 'A', 'Y', 'S' },
+ { 'L', 'E', 'A', 'D' },
+ { 'L', 'E', 'A', 'F' },
+ { 'L', 'E', 'A', 'K' },
+ { 'L', 'E', 'A', 'N' },
+ { 'L', 'E', 'A', 'R' },
+ { 'L', 'E', 'E', 'K' },
+ { 'L', 'E', 'E', 'R' },
+ { 'L', 'E', 'F', 'T' },
+ { 'L', 'E', 'N', 'D' },
+ { 'L', 'E', 'N', 'S' },
+ { 'L', 'E', 'N', 'T' },
+ { 'L', 'E', 'O', 'N' },
+ { 'L', 'E', 'S', 'K' },
+ { 'L', 'E', 'S', 'S' },
+ { 'L', 'E', 'S', 'T' },
+ { 'L', 'E', 'T', 'S' },
+ { 'L', 'I', 'A', 'R' },
+ { 'L', 'I', 'C', 'E' },
+ { 'L', 'I', 'C', 'K' },
+ { 'L', 'I', 'E', 'D' },
+ { 'L', 'I', 'E', 'N' },
+ { 'L', 'I', 'E', 'S' },
+ { 'L', 'I', 'E', 'U' },
+ { 'L', 'I', 'F', 'E' },
+ { 'L', 'I', 'F', 'T' },
+ { 'L', 'I', 'K', 'E' },
+ { 'L', 'I', 'L', 'A' },
+ { 'L', 'I', 'L', 'T' },
+ { 'L', 'I', 'L', 'Y' },
+ { 'L', 'I', 'M', 'A' },
+ { 'L', 'I', 'M', 'B' },
+ { 'L', 'I', 'M', 'E' },
+ { 'L', 'I', 'N', 'D' },
+ { 'L', 'I', 'N', 'E' },
+ { 'L', 'I', 'N', 'K' },
+ { 'L', 'I', 'N', 'T' },
+ { 'L', 'I', 'O', 'N' },
+ { 'L', 'I', 'S', 'A' },
+ { 'L', 'I', 'S', 'T' },
+ { 'L', 'I', 'V', 'E' },
+ { 'L', 'O', 'A', 'D' },
+ { 'L', 'O', 'A', 'F' },
+ { 'L', 'O', 'A', 'M' },
+ { 'L', 'O', 'A', 'N' },
+ { 'L', 'O', 'C', 'K' },
+ { 'L', 'O', 'F', 'T' },
+ { 'L', 'O', 'G', 'E' },
+ { 'L', 'O', 'I', 'S' },
+ { 'L', 'O', 'L', 'A' },
+ { 'L', 'O', 'N', 'E' },
+ { 'L', 'O', 'N', 'G' },
+ { 'L', 'O', 'O', 'K' },
+ { 'L', 'O', 'O', 'N' },
+ { 'L', 'O', 'O', 'T' },
+ { 'L', 'O', 'R', 'D' },
+ { 'L', 'O', 'R', 'E' },
+ { 'L', 'O', 'S', 'E' },
+ { 'L', 'O', 'S', 'S' },
+ { 'L', 'O', 'S', 'T' },
+ { 'L', 'O', 'U', 'D' },
+ { 'L', 'O', 'V', 'E' },
+ { 'L', 'O', 'W', 'E' },
+ { 'L', 'U', 'C', 'K' },
+ { 'L', 'U', 'C', 'Y' },
+ { 'L', 'U', 'G', 'E' },
+ { 'L', 'U', 'K', 'E' },
+ { 'L', 'U', 'L', 'U' },
+ { 'L', 'U', 'N', 'D' },
+ { 'L', 'U', 'N', 'G' },
+ { 'L', 'U', 'R', 'A' },
+ { 'L', 'U', 'R', 'E' },
+ { 'L', 'U', 'R', 'K' },
+ { 'L', 'U', 'S', 'H' },
+ { 'L', 'U', 'S', 'T' },
+ { 'L', 'Y', 'L', 'E' },
+ { 'L', 'Y', 'N', 'N' },
+ { 'L', 'Y', 'O', 'N' },
+ { 'L', 'Y', 'R', 'A' },
+ { 'M', 'A', 'C', 'E' },
+ { 'M', 'A', 'D', 'E' },
+ { 'M', 'A', 'G', 'I' },
+ { 'M', 'A', 'I', 'D' },
+ { 'M', 'A', 'I', 'L' },
+ { 'M', 'A', 'I', 'N' },
+ { 'M', 'A', 'K', 'E' },
+ { 'M', 'A', 'L', 'E' },
+ { 'M', 'A', 'L', 'I' },
+ { 'M', 'A', 'L', 'L' },
+ { 'M', 'A', 'L', 'T' },
+ { 'M', 'A', 'N', 'A' },
+ { 'M', 'A', 'N', 'N' },
+ { 'M', 'A', 'N', 'Y' },
+ { 'M', 'A', 'R', 'C' },
+ { 'M', 'A', 'R', 'E' },
+ { 'M', 'A', 'R', 'K' },
+ { 'M', 'A', 'R', 'S' },
+ { 'M', 'A', 'R', 'T' },
+ { 'M', 'A', 'R', 'Y' },
+ { 'M', 'A', 'S', 'H' },
+ { 'M', 'A', 'S', 'K' },
+ { 'M', 'A', 'S', 'S' },
+ { 'M', 'A', 'S', 'T' },
+ { 'M', 'A', 'T', 'E' },
+ { 'M', 'A', 'T', 'H' },
+ { 'M', 'A', 'U', 'L' },
+ { 'M', 'A', 'Y', 'O' },
+ { 'M', 'E', 'A', 'D' },
+ { 'M', 'E', 'A', 'L' },
+ { 'M', 'E', 'A', 'N' },
+ { 'M', 'E', 'A', 'T' },
+ { 'M', 'E', 'E', 'K' },
+ { 'M', 'E', 'E', 'T' },
+ { 'M', 'E', 'L', 'D' },
+ { 'M', 'E', 'L', 'T' },
+ { 'M', 'E', 'M', 'O' },
+ { 'M', 'E', 'N', 'D' },
+ { 'M', 'E', 'N', 'U' },
+ { 'M', 'E', 'R', 'T' },
+ { 'M', 'E', 'S', 'H' },
+ { 'M', 'E', 'S', 'S' },
+ { 'M', 'I', 'C', 'E' },
+ { 'M', 'I', 'K', 'E' },
+ { 'M', 'I', 'L', 'D' },
+ { 'M', 'I', 'L', 'E' },
+ { 'M', 'I', 'L', 'K' },
+ { 'M', 'I', 'L', 'L' },
+ { 'M', 'I', 'L', 'T' },
+ { 'M', 'I', 'M', 'I' },
+ { 'M', 'I', 'N', 'D' },
+ { 'M', 'I', 'N', 'E' },
+ { 'M', 'I', 'N', 'I' },
+ { 'M', 'I', 'N', 'K' },
+ { 'M', 'I', 'N', 'T' },
+ { 'M', 'I', 'R', 'E' },
+ { 'M', 'I', 'S', 'S' },
+ { 'M', 'I', 'S', 'T' },
+ { 'M', 'I', 'T', 'E' },
+ { 'M', 'I', 'T', 'T' },
+ { 'M', 'O', 'A', 'N' },
+ { 'M', 'O', 'A', 'T' },
+ { 'M', 'O', 'C', 'K' },
+ { 'M', 'O', 'D', 'E' },
+ { 'M', 'O', 'L', 'D' },
+ { 'M', 'O', 'L', 'E' },
+ { 'M', 'O', 'L', 'L' },
+ { 'M', 'O', 'L', 'T' },
+ { 'M', 'O', 'N', 'A' },
+ { 'M', 'O', 'N', 'K' },
+ { 'M', 'O', 'N', 'T' },
+ { 'M', 'O', 'O', 'D' },
+ { 'M', 'O', 'O', 'N' },
+ { 'M', 'O', 'O', 'R' },
+ { 'M', 'O', 'O', 'T' },
+ { 'M', 'O', 'R', 'E' },
+ { 'M', 'O', 'R', 'N' },
+ { 'M', 'O', 'R', 'T' },
+ { 'M', 'O', 'S', 'S' },
+ { 'M', 'O', 'S', 'T' },
+ { 'M', 'O', 'T', 'H' },
+ { 'M', 'O', 'V', 'E' },
+ { 'M', 'U', 'C', 'H' },
+ { 'M', 'U', 'C', 'K' },
+ { 'M', 'U', 'D', 'D' },
+ { 'M', 'U', 'F', 'F' },
+ { 'M', 'U', 'L', 'E' },
+ { 'M', 'U', 'L', 'L' },
+ { 'M', 'U', 'R', 'K' },
+ { 'M', 'U', 'S', 'H' },
+ { 'M', 'U', 'S', 'T' },
+ { 'M', 'U', 'T', 'E' },
+ { 'M', 'U', 'T', 'T' },
+ { 'M', 'Y', 'R', 'A' },
+ { 'M', 'Y', 'T', 'H' },
+ { 'N', 'A', 'G', 'Y' },
+ { 'N', 'A', 'I', 'L' },
+ { 'N', 'A', 'I', 'R' },
+ { 'N', 'A', 'M', 'E' },
+ { 'N', 'A', 'R', 'Y' },
+ { 'N', 'A', 'S', 'H' },
+ { 'N', 'A', 'V', 'E' },
+ { 'N', 'A', 'V', 'Y' },
+ { 'N', 'E', 'A', 'L' },
+ { 'N', 'E', 'A', 'R' },
+ { 'N', 'E', 'A', 'T' },
+ { 'N', 'E', 'C', 'K' },
+ { 'N', 'E', 'E', 'D' },
+ { 'N', 'E', 'I', 'L' },
+ { 'N', 'E', 'L', 'L' },
+ { 'N', 'E', 'O', 'N' },
+ { 'N', 'E', 'R', 'O' },
+ { 'N', 'E', 'S', 'S' },
+ { 'N', 'E', 'S', 'T' },
+ { 'N', 'E', 'W', 'S' },
+ { 'N', 'E', 'W', 'T' },
+ { 'N', 'I', 'B', 'S' },
+ { 'N', 'I', 'C', 'E' },
+ { 'N', 'I', 'C', 'K' },
+ { 'N', 'I', 'L', 'E' },
+ { 'N', 'I', 'N', 'A' },
+ { 'N', 'I', 'N', 'E' },
+ { 'N', 'O', 'A', 'H' },
+ { 'N', 'O', 'D', 'E' },
+ { 'N', 'O', 'E', 'L' },
+ { 'N', 'O', 'L', 'L' },
+ { 'N', 'O', 'N', 'E' },
+ { 'N', 'O', 'O', 'K' },
+ { 'N', 'O', 'O', 'N' },
+ { 'N', 'O', 'R', 'M' },
+ { 'N', 'O', 'S', 'E' },
+ { 'N', 'O', 'T', 'E' },
+ { 'N', 'O', 'U', 'N' },
+ { 'N', 'O', 'V', 'A' },
+ { 'N', 'U', 'D', 'E' },
+ { 'N', 'U', 'L', 'L' },
+ { 'N', 'U', 'M', 'B' },
+ { 'O', 'A', 'T', 'H' },
+ { 'O', 'B', 'E', 'Y' },
+ { 'O', 'B', 'O', 'E' },
+ { 'O', 'D', 'I', 'N' },
+ { 'O', 'H', 'I', 'O' },
+ { 'O', 'I', 'L', 'Y' },
+ { 'O', 'I', 'N', 'T' },
+ { 'O', 'K', 'A', 'Y' },
+ { 'O', 'L', 'A', 'F' },
+ { 'O', 'L', 'D', 'Y' },
+ { 'O', 'L', 'G', 'A' },
+ { 'O', 'L', 'I', 'N' },
+ { 'O', 'M', 'A', 'N' },
+ { 'O', 'M', 'E', 'N' },
+ { 'O', 'M', 'I', 'T' },
+ { 'O', 'N', 'C', 'E' },
+ { 'O', 'N', 'E', 'S' },
+ { 'O', 'N', 'L', 'Y' },
+ { 'O', 'N', 'T', 'O' },
+ { 'O', 'N', 'U', 'S' },
+ { 'O', 'R', 'A', 'L' },
+ { 'O', 'R', 'G', 'Y' },
+ { 'O', 'S', 'L', 'O' },
+ { 'O', 'T', 'I', 'S' },
+ { 'O', 'T', 'T', 'O' },
+ { 'O', 'U', 'C', 'H' },
+ { 'O', 'U', 'S', 'T' },
+ { 'O', 'U', 'T', 'S' },
+ { 'O', 'V', 'A', 'L' },
+ { 'O', 'V', 'E', 'N' },
+ { 'O', 'V', 'E', 'R' },
+ { 'O', 'W', 'L', 'Y' },
+ { 'O', 'W', 'N', 'S' },
+ { 'Q', 'U', 'A', 'D' },
+ { 'Q', 'U', 'I', 'T' },
+ { 'Q', 'U', 'O', 'D' },
+ { 'R', 'A', 'C', 'E' },
+ { 'R', 'A', 'C', 'K' },
+ { 'R', 'A', 'C', 'Y' },
+ { 'R', 'A', 'F', 'T' },
+ { 'R', 'A', 'G', 'E' },
+ { 'R', 'A', 'I', 'D' },
+ { 'R', 'A', 'I', 'L' },
+ { 'R', 'A', 'I', 'N' },
+ { 'R', 'A', 'K', 'E' },
+ { 'R', 'A', 'N', 'K' },
+ { 'R', 'A', 'N', 'T' },
+ { 'R', 'A', 'R', 'E' },
+ { 'R', 'A', 'S', 'H' },
+ { 'R', 'A', 'T', 'E' },
+ { 'R', 'A', 'V', 'E' },
+ { 'R', 'A', 'Y', 'S' },
+ { 'R', 'E', 'A', 'D' },
+ { 'R', 'E', 'A', 'L' },
+ { 'R', 'E', 'A', 'M' },
+ { 'R', 'E', 'A', 'R' },
+ { 'R', 'E', 'C', 'K' },
+ { 'R', 'E', 'E', 'D' },
+ { 'R', 'E', 'E', 'F' },
+ { 'R', 'E', 'E', 'K' },
+ { 'R', 'E', 'E', 'L' },
+ { 'R', 'E', 'I', 'D' },
+ { 'R', 'E', 'I', 'N' },
+ { 'R', 'E', 'N', 'A' },
+ { 'R', 'E', 'N', 'D' },
+ { 'R', 'E', 'N', 'T' },
+ { 'R', 'E', 'S', 'T' },
+ { 'R', 'I', 'C', 'E' },
+ { 'R', 'I', 'C', 'H' },
+ { 'R', 'I', 'C', 'K' },
+ { 'R', 'I', 'D', 'E' },
+ { 'R', 'I', 'F', 'T' },
+ { 'R', 'I', 'L', 'L' },
+ { 'R', 'I', 'M', 'E' },
+ { 'R', 'I', 'N', 'G' },
+ { 'R', 'I', 'N', 'K' },
+ { 'R', 'I', 'S', 'E' },
+ { 'R', 'I', 'S', 'K' },
+ { 'R', 'I', 'T', 'E' },
+ { 'R', 'O', 'A', 'D' },
+ { 'R', 'O', 'A', 'M' },
+ { 'R', 'O', 'A', 'R' },
+ { 'R', 'O', 'B', 'E' },
+ { 'R', 'O', 'C', 'K' },
+ { 'R', 'O', 'D', 'E' },
+ { 'R', 'O', 'I', 'L' },
+ { 'R', 'O', 'L', 'L' },
+ { 'R', 'O', 'M', 'E' },
+ { 'R', 'O', 'O', 'D' },
+ { 'R', 'O', 'O', 'F' },
+ { 'R', 'O', 'O', 'K' },
+ { 'R', 'O', 'O', 'M' },
+ { 'R', 'O', 'O', 'T' },
+ { 'R', 'O', 'S', 'A' },
+ { 'R', 'O', 'S', 'E' },
+ { 'R', 'O', 'S', 'S' },
+ { 'R', 'O', 'S', 'Y' },
+ { 'R', 'O', 'T', 'H' },
+ { 'R', 'O', 'U', 'T' },
+ { 'R', 'O', 'V', 'E' },
+ { 'R', 'O', 'W', 'E' },
+ { 'R', 'O', 'W', 'S' },
+ { 'R', 'U', 'B', 'E' },
+ { 'R', 'U', 'B', 'Y' },
+ { 'R', 'U', 'D', 'E' },
+ { 'R', 'U', 'D', 'Y' },
+ { 'R', 'U', 'I', 'N' },
+ { 'R', 'U', 'L', 'E' },
+ { 'R', 'U', 'N', 'G' },
+ { 'R', 'U', 'N', 'S' },
+ { 'R', 'U', 'N', 'T' },
+ { 'R', 'U', 'S', 'E' },
+ { 'R', 'U', 'S', 'H' },
+ { 'R', 'U', 'S', 'K' },
+ { 'R', 'U', 'S', 'S' },
+ { 'R', 'U', 'S', 'T' },
+ { 'R', 'U', 'T', 'H' },
+ { 'S', 'A', 'C', 'K' },
+ { 'S', 'A', 'F', 'E' },
+ { 'S', 'A', 'G', 'E' },
+ { 'S', 'A', 'I', 'D' },
+ { 'S', 'A', 'I', 'L' },
+ { 'S', 'A', 'L', 'E' },
+ { 'S', 'A', 'L', 'K' },
+ { 'S', 'A', 'L', 'T' },
+ { 'S', 'A', 'M', 'E' },
+ { 'S', 'A', 'N', 'D' },
+ { 'S', 'A', 'N', 'E' },
+ { 'S', 'A', 'N', 'G' },
+ { 'S', 'A', 'N', 'K' },
+ { 'S', 'A', 'R', 'A' },
+ { 'S', 'A', 'U', 'L' },
+ { 'S', 'A', 'V', 'E' },
+ { 'S', 'A', 'Y', 'S' },
+ { 'S', 'C', 'A', 'N' },
+ { 'S', 'C', 'A', 'R' },
+ { 'S', 'C', 'A', 'T' },
+ { 'S', 'C', 'O', 'T' },
+ { 'S', 'E', 'A', 'L' },
+ { 'S', 'E', 'A', 'M' },
+ { 'S', 'E', 'A', 'R' },
+ { 'S', 'E', 'A', 'T' },
+ { 'S', 'E', 'E', 'D' },
+ { 'S', 'E', 'E', 'K' },
+ { 'S', 'E', 'E', 'M' },
+ { 'S', 'E', 'E', 'N' },
+ { 'S', 'E', 'E', 'S' },
+ { 'S', 'E', 'L', 'F' },
+ { 'S', 'E', 'L', 'L' },
+ { 'S', 'E', 'N', 'D' },
+ { 'S', 'E', 'N', 'T' },
+ { 'S', 'E', 'T', 'S' },
+ { 'S', 'E', 'W', 'N' },
+ { 'S', 'H', 'A', 'G' },
+ { 'S', 'H', 'A', 'M' },
+ { 'S', 'H', 'A', 'W' },
+ { 'S', 'H', 'A', 'Y' },
+ { 'S', 'H', 'E', 'D' },
+ { 'S', 'H', 'I', 'M' },
+ { 'S', 'H', 'I', 'N' },
+ { 'S', 'H', 'O', 'D' },
+ { 'S', 'H', 'O', 'E' },
+ { 'S', 'H', 'O', 'T' },
+ { 'S', 'H', 'O', 'W' },
+ { 'S', 'H', 'U', 'N' },
+ { 'S', 'H', 'U', 'T' },
+ { 'S', 'I', 'C', 'K' },
+ { 'S', 'I', 'D', 'E' },
+ { 'S', 'I', 'F', 'T' },
+ { 'S', 'I', 'G', 'H' },
+ { 'S', 'I', 'G', 'N' },
+ { 'S', 'I', 'L', 'K' },
+ { 'S', 'I', 'L', 'L' },
+ { 'S', 'I', 'L', 'O' },
+ { 'S', 'I', 'L', 'T' },
+ { 'S', 'I', 'N', 'E' },
+ { 'S', 'I', 'N', 'G' },
+ { 'S', 'I', 'N', 'K' },
+ { 'S', 'I', 'R', 'E' },
+ { 'S', 'I', 'T', 'E' },
+ { 'S', 'I', 'T', 'S' },
+ { 'S', 'I', 'T', 'U' },
+ { 'S', 'K', 'A', 'T' },
+ { 'S', 'K', 'E', 'W' },
+ { 'S', 'K', 'I', 'D' },
+ { 'S', 'K', 'I', 'M' },
+ { 'S', 'K', 'I', 'N' },
+ { 'S', 'K', 'I', 'T' },
+ { 'S', 'L', 'A', 'B' },
+ { 'S', 'L', 'A', 'M' },
+ { 'S', 'L', 'A', 'T' },
+ { 'S', 'L', 'A', 'Y' },
+ { 'S', 'L', 'E', 'D' },
+ { 'S', 'L', 'E', 'W' },
+ { 'S', 'L', 'I', 'D' },
+ { 'S', 'L', 'I', 'M' },
+ { 'S', 'L', 'I', 'T' },
+ { 'S', 'L', 'O', 'B' },
+ { 'S', 'L', 'O', 'G' },
+ { 'S', 'L', 'O', 'T' },
+ { 'S', 'L', 'O', 'W' },
+ { 'S', 'L', 'U', 'G' },
+ { 'S', 'L', 'U', 'M' },
+ { 'S', 'L', 'U', 'R' },
+ { 'S', 'M', 'O', 'G' },
+ { 'S', 'M', 'U', 'G' },
+ { 'S', 'N', 'A', 'G' },
+ { 'S', 'N', 'O', 'B' },
+ { 'S', 'N', 'O', 'W' },
+ { 'S', 'N', 'U', 'B' },
+ { 'S', 'N', 'U', 'G' },
+ { 'S', 'O', 'A', 'K' },
+ { 'S', 'O', 'A', 'R' },
+ { 'S', 'O', 'C', 'K' },
+ { 'S', 'O', 'D', 'A' },
+ { 'S', 'O', 'F', 'A' },
+ { 'S', 'O', 'F', 'T' },
+ { 'S', 'O', 'I', 'L' },
+ { 'S', 'O', 'L', 'D' },
+ { 'S', 'O', 'M', 'E' },
+ { 'S', 'O', 'N', 'G' },
+ { 'S', 'O', 'O', 'N' },
+ { 'S', 'O', 'O', 'T' },
+ { 'S', 'O', 'R', 'E' },
+ { 'S', 'O', 'R', 'T' },
+ { 'S', 'O', 'U', 'L' },
+ { 'S', 'O', 'U', 'R' },
+ { 'S', 'O', 'W', 'N' },
+ { 'S', 'T', 'A', 'B' },
+ { 'S', 'T', 'A', 'G' },
+ { 'S', 'T', 'A', 'N' },
+ { 'S', 'T', 'A', 'R' },
+ { 'S', 'T', 'A', 'Y' },
+ { 'S', 'T', 'E', 'M' },
+ { 'S', 'T', 'E', 'W' },
+ { 'S', 'T', 'I', 'R' },
+ { 'S', 'T', 'O', 'W' },
+ { 'S', 'T', 'U', 'B' },
+ { 'S', 'T', 'U', 'N' },
+ { 'S', 'U', 'C', 'H' },
+ { 'S', 'U', 'D', 'S' },
+ { 'S', 'U', 'I', 'T' },
+ { 'S', 'U', 'L', 'K' },
+ { 'S', 'U', 'M', 'S' },
+ { 'S', 'U', 'N', 'G' },
+ { 'S', 'U', 'N', 'K' },
+ { 'S', 'U', 'R', 'E' },
+ { 'S', 'U', 'R', 'F' },
+ { 'S', 'W', 'A', 'B' },
+ { 'S', 'W', 'A', 'G' },
+ { 'S', 'W', 'A', 'M' },
+ { 'S', 'W', 'A', 'N' },
+ { 'S', 'W', 'A', 'T' },
+ { 'S', 'W', 'A', 'Y' },
+ { 'S', 'W', 'I', 'M' },
+ { 'S', 'W', 'U', 'M' },
+ { 'T', 'A', 'C', 'K' },
+ { 'T', 'A', 'C', 'T' },
+ { 'T', 'A', 'I', 'L' },
+ { 'T', 'A', 'K', 'E' },
+ { 'T', 'A', 'L', 'E' },
+ { 'T', 'A', 'L', 'K' },
+ { 'T', 'A', 'L', 'L' },
+ { 'T', 'A', 'N', 'K' },
+ { 'T', 'A', 'S', 'K' },
+ { 'T', 'A', 'T', 'E' },
+ { 'T', 'A', 'U', 'T' },
+ { 'T', 'E', 'A', 'L' },
+ { 'T', 'E', 'A', 'M' },
+ { 'T', 'E', 'A', 'R' },
+ { 'T', 'E', 'C', 'H' },
+ { 'T', 'E', 'E', 'M' },
+ { 'T', 'E', 'E', 'N' },
+ { 'T', 'E', 'E', 'T' },
+ { 'T', 'E', 'L', 'L' },
+ { 'T', 'E', 'N', 'D' },
+ { 'T', 'E', 'N', 'T' },
+ { 'T', 'E', 'R', 'M' },
+ { 'T', 'E', 'R', 'N' },
+ { 'T', 'E', 'S', 'S' },
+ { 'T', 'E', 'S', 'T' },
+ { 'T', 'H', 'A', 'N' },
+ { 'T', 'H', 'A', 'T' },
+ { 'T', 'H', 'E', 'E' },
+ { 'T', 'H', 'E', 'M' },
+ { 'T', 'H', 'E', 'N' },
+ { 'T', 'H', 'E', 'Y' },
+ { 'T', 'H', 'I', 'N' },
+ { 'T', 'H', 'I', 'S' },
+ { 'T', 'H', 'U', 'D' },
+ { 'T', 'H', 'U', 'G' },
+ { 'T', 'I', 'C', 'K' },
+ { 'T', 'I', 'D', 'E' },
+ { 'T', 'I', 'D', 'Y' },
+ { 'T', 'I', 'E', 'D' },
+ { 'T', 'I', 'E', 'R' },
+ { 'T', 'I', 'L', 'E' },
+ { 'T', 'I', 'L', 'L' },
+ { 'T', 'I', 'L', 'T' },
+ { 'T', 'I', 'M', 'E' },
+ { 'T', 'I', 'N', 'A' },
+ { 'T', 'I', 'N', 'E' },
+ { 'T', 'I', 'N', 'T' },
+ { 'T', 'I', 'N', 'Y' },
+ { 'T', 'I', 'R', 'E' },
+ { 'T', 'O', 'A', 'D' },
+ { 'T', 'O', 'G', 'O' },
+ { 'T', 'O', 'I', 'L' },
+ { 'T', 'O', 'L', 'D' },
+ { 'T', 'O', 'L', 'L' },
+ { 'T', 'O', 'N', 'E' },
+ { 'T', 'O', 'N', 'G' },
+ { 'T', 'O', 'N', 'Y' },
+ { 'T', 'O', 'O', 'K' },
+ { 'T', 'O', 'O', 'L' },
+ { 'T', 'O', 'O', 'T' },
+ { 'T', 'O', 'R', 'E' },
+ { 'T', 'O', 'R', 'N' },
+ { 'T', 'O', 'T', 'E' },
+ { 'T', 'O', 'U', 'R' },
+ { 'T', 'O', 'U', 'T' },
+ { 'T', 'O', 'W', 'N' },
+ { 'T', 'R', 'A', 'G' },
+ { 'T', 'R', 'A', 'M' },
+ { 'T', 'R', 'A', 'Y' },
+ { 'T', 'R', 'E', 'E' },
+ { 'T', 'R', 'E', 'K' },
+ { 'T', 'R', 'I', 'G' },
+ { 'T', 'R', 'I', 'M' },
+ { 'T', 'R', 'I', 'O' },
+ { 'T', 'R', 'O', 'D' },
+ { 'T', 'R', 'O', 'T' },
+ { 'T', 'R', 'O', 'Y' },
+ { 'T', 'R', 'U', 'E' },
+ { 'T', 'U', 'B', 'A' },
+ { 'T', 'U', 'B', 'E' },
+ { 'T', 'U', 'C', 'K' },
+ { 'T', 'U', 'F', 'T' },
+ { 'T', 'U', 'N', 'A' },
+ { 'T', 'U', 'N', 'E' },
+ { 'T', 'U', 'N', 'G' },
+ { 'T', 'U', 'R', 'F' },
+ { 'T', 'U', 'R', 'N' },
+ { 'T', 'U', 'S', 'K' },
+ { 'T', 'W', 'I', 'G' },
+ { 'T', 'W', 'I', 'N' },
+ { 'T', 'W', 'I', 'T' },
+ { 'U', 'L', 'A', 'N' },
+ { 'U', 'N', 'I', 'T' },
+ { 'U', 'R', 'G', 'E' },
+ { 'U', 'S', 'E', 'D' },
+ { 'U', 'S', 'E', 'R' },
+ { 'U', 'S', 'E', 'S' },
+ { 'U', 'T', 'A', 'H' },
+ { 'V', 'A', 'I', 'L' },
+ { 'V', 'A', 'I', 'N' },
+ { 'V', 'A', 'L', 'E' },
+ { 'V', 'A', 'R', 'Y' },
+ { 'V', 'A', 'S', 'E' },
+ { 'V', 'A', 'S', 'T' },
+ { 'V', 'E', 'A', 'L' },
+ { 'V', 'E', 'D', 'A' },
+ { 'V', 'E', 'I', 'L' },
+ { 'V', 'E', 'I', 'N' },
+ { 'V', 'E', 'N', 'D' },
+ { 'V', 'E', 'N', 'T' },
+ { 'V', 'E', 'R', 'B' },
+ { 'V', 'E', 'R', 'Y' },
+ { 'V', 'E', 'T', 'O' },
+ { 'V', 'I', 'C', 'E' },
+ { 'V', 'I', 'E', 'W' },
+ { 'V', 'I', 'N', 'E' },
+ { 'V', 'I', 'S', 'E' },
+ { 'V', 'O', 'I', 'D' },
+ { 'V', 'O', 'L', 'T' },
+ { 'V', 'O', 'T', 'E' },
+ { 'W', 'A', 'C', 'K' },
+ { 'W', 'A', 'D', 'E' },
+ { 'W', 'A', 'G', 'E' },
+ { 'W', 'A', 'I', 'L' },
+ { 'W', 'A', 'I', 'T' },
+ { 'W', 'A', 'K', 'E' },
+ { 'W', 'A', 'L', 'E' },
+ { 'W', 'A', 'L', 'K' },
+ { 'W', 'A', 'L', 'L' },
+ { 'W', 'A', 'L', 'T' },
+ { 'W', 'A', 'N', 'D' },
+ { 'W', 'A', 'N', 'E' },
+ { 'W', 'A', 'N', 'G' },
+ { 'W', 'A', 'N', 'T' },
+ { 'W', 'A', 'R', 'D' },
+ { 'W', 'A', 'R', 'M' },
+ { 'W', 'A', 'R', 'N' },
+ { 'W', 'A', 'R', 'T' },
+ { 'W', 'A', 'S', 'H' },
+ { 'W', 'A', 'S', 'T' },
+ { 'W', 'A', 'T', 'S' },
+ { 'W', 'A', 'T', 'T' },
+ { 'W', 'A', 'V', 'E' },
+ { 'W', 'A', 'V', 'Y' },
+ { 'W', 'A', 'Y', 'S' },
+ { 'W', 'E', 'A', 'K' },
+ { 'W', 'E', 'A', 'L' },
+ { 'W', 'E', 'A', 'N' },
+ { 'W', 'E', 'A', 'R' },
+ { 'W', 'E', 'E', 'D' },
+ { 'W', 'E', 'E', 'K' },
+ { 'W', 'E', 'I', 'R' },
+ { 'W', 'E', 'L', 'D' },
+ { 'W', 'E', 'L', 'L' },
+ { 'W', 'E', 'L', 'T' },
+ { 'W', 'E', 'N', 'T' },
+ { 'W', 'E', 'R', 'E' },
+ { 'W', 'E', 'R', 'T' },
+ { 'W', 'E', 'S', 'T' },
+ { 'W', 'H', 'A', 'M' },
+ { 'W', 'H', 'A', 'T' },
+ { 'W', 'H', 'E', 'E' },
+ { 'W', 'H', 'E', 'N' },
+ { 'W', 'H', 'E', 'T' },
+ { 'W', 'H', 'O', 'A' },
+ { 'W', 'H', 'O', 'M' },
+ { 'W', 'I', 'C', 'K' },
+ { 'W', 'I', 'F', 'E' },
+ { 'W', 'I', 'L', 'D' },
+ { 'W', 'I', 'L', 'L' },
+ { 'W', 'I', 'N', 'D' },
+ { 'W', 'I', 'N', 'E' },
+ { 'W', 'I', 'N', 'G' },
+ { 'W', 'I', 'N', 'K' },
+ { 'W', 'I', 'N', 'O' },
+ { 'W', 'I', 'R', 'E' },
+ { 'W', 'I', 'S', 'E' },
+ { 'W', 'I', 'S', 'H' },
+ { 'W', 'I', 'T', 'H' },
+ { 'W', 'O', 'L', 'F' },
+ { 'W', 'O', 'N', 'T' },
+ { 'W', 'O', 'O', 'D' },
+ { 'W', 'O', 'O', 'L' },
+ { 'W', 'O', 'R', 'D' },
+ { 'W', 'O', 'R', 'E' },
+ { 'W', 'O', 'R', 'K' },
+ { 'W', 'O', 'R', 'M' },
+ { 'W', 'O', 'R', 'N' },
+ { 'W', 'O', 'V', 'E' },
+ { 'W', 'R', 'I', 'T' },
+ { 'W', 'Y', 'N', 'N' },
+ { 'Y', 'A', 'L', 'E' },
+ { 'Y', 'A', 'N', 'G' },
+ { 'Y', 'A', 'N', 'K' },
+ { 'Y', 'A', 'R', 'D' },
+ { 'Y', 'A', 'R', 'N' },
+ { 'Y', 'A', 'W', 'L' },
+ { 'Y', 'A', 'W', 'N' },
+ { 'Y', 'E', 'A', 'H' },
+ { 'Y', 'E', 'A', 'R' },
+ { 'Y', 'E', 'L', 'L' },
+ { 'Y', 'O', 'G', 'A' },
+ { 'Y', 'O', 'K', 'E' }
+};
+
+/* Extract LENGTH bits from the char array S starting with bit number
+ START. It always reads three consecutive octects, which means it
+ can read past end of data when START is at the edge of the region. */
+
+static uint32_t
+extract (const unsigned char *s, int start, int length)
+{
+ unsigned char cl = s[start / 8];
+ unsigned char cc = s[start / 8 + 1];
+ unsigned char cr = s[start / 8 + 2];
+ uint32_t x;
+ x = (uint32_t)(cl << 8 | cc) << 8 | cr;
+ x >>= 24 - (length + (start % 8));
+ x &= (0xffff >> (16 - length));
+ return x;
+}
+
+/* Length of a string known to be at least 1 and at most 4 chars
+ long. */
+
+#define STRLEN_1_4(s) (!(s)[1] ? 1 : !(s)[2] ? 2 : !(s)[3] ? 3 : 4)
+
+/* Encode 8 bytes in C as a string of English words and store them to
+ STORE. Returns STORE. */
+
+static char *
+btoe (char *store, const unsigned char *c)
+{
+ unsigned char cp[10]; /* add in room for the parity 2 bits +
+ extract() slop. */
+ int p, i;
+ char *store_beg = store;
+
+ *store = '\0';
+
+ /* Workaround for extract() reads beyond end of data */
+ xzero (cp);
+ memcpy (cp, c, 8);
+
+ /* Compute parity and append it to CP. */
+ for (p = 0, i = 0; i < 64; i += 2)
+ p += extract (cp, i, 2);
+ cp[8] = (char)p << 6;
+
+ /* The 64 bits of input and the two parity bits comprise 66 bits of
+ data that are now in CP. We convert that information, 11 bits at
+ a time, to English words indexed from Wp. Since there are 2048
+ (2^11) words in Wp, every 11-bit combination corresponds to a
+ distinct word. */
+ memcpy (store, &Wp[extract (cp, 0, 11)][0], 4);
+ store += STRLEN_1_4 (store);
+ *store++ = ' ';
+ memcpy (store, &Wp[extract (cp, 11, 11)][0], 4);
+ store += STRLEN_1_4 (store);
+ *store++ = ' ';
+ memcpy (store, &Wp[extract (cp, 22, 11)][0], 4);
+ store += STRLEN_1_4 (store);
+ *store++ = ' ';
+ memcpy (store, &Wp[extract (cp, 33, 11)][0], 4);
+ store += STRLEN_1_4 (store);
+ *store++ = ' ';
+ memcpy (store, &Wp[extract (cp, 44, 11)][0], 4);
+ store += STRLEN_1_4 (store);
+ *store++ = ' ';
+ memcpy (store, &Wp[extract (cp, 55, 11)][0], 4);
+ store[4] = '\0'; /* make sure the string is terminated */
+
+ DEBUGP (("wrote %s to STORE\n", quote (store_beg)));
+ return store_beg;
+}
+
+/* Calculate the SKEY response, based on the sequence, seed
+ (challenge), and the secret password. The calculated response is
+ used instead of the real password when logging in to SKEY-enabled
+ servers.
+
+ The result is calculated like this:
+
+ + Concatenate SEED and PASS and calculate the 16-byte MD5 checksum.
+
+ + Shorten the checksum to eight bytes by folding the second eight
+ bytes onto the first eight using XOR. The resulting eight-byte
+ sequence is the key.
+
+ + MD5-process the key, fold the checksum to eight bytes and store
+ it back to the key. Repeat this crunching SEQUENCE times.
+ (Sequence is a number that gets decremented every time the user
+ logs in to the server. Therefore an eavesdropper would have to
+ invert the hash function in order to guess the next one-time
+ password.)
+
+ + Convert the resulting 64-bit key to 6 English words separated by
+ spaces (see btoe for details) and return the resulting ASCII
+ string.
+
+ All this is described in section 6 of rfc2289 in more detail. */
+
+const char *
+skey_response (int sequence, const char *seed, const char *pass)
+{
+ unsigned char key[8];
+
+ /* Room to hold 6 four-letter words (heh), 5 space separators, and
+ the terminating \0. 24+5+1 == 30 */
+ static char english[30];
+
+ struct md5_ctx ctx;
+ uint32_t checksum[4];
+
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((const unsigned char *) seed, strlen (seed), &ctx);
+ md5_process_bytes ((const unsigned char *) pass, strlen (pass), &ctx);
+ md5_finish_ctx (&ctx, (unsigned char *) checksum);
+ checksum[0] ^= checksum[2];
+ checksum[1] ^= checksum[3];
+ memcpy (key, checksum, 8);
+
+ while (sequence-- > 0)
+ {
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((unsigned char *) key, 8, &ctx);
+ md5_finish_ctx (&ctx, (unsigned char *) checksum);
+ checksum[0] ^= checksum[2];
+ checksum[1] ^= checksum[3];
+ memcpy (key, checksum, 8);
+ }
+ return btoe (english, key);
+}
diff --git a/src/ftp.c b/src/ftp.c
new file mode 100644
index 0000000..a44bf04
--- /dev/null
+++ b/src/ftp.c
@@ -0,0 +1,2898 @@
+/* File Transfer Protocol support.
+ Copyright (C) 1996-2011, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#include <time.h>
+
+#include "utils.h"
+#include "url.h"
+#include "retr.h"
+#include "ftp.h"
+#include "ssl.h"
+#include "connect.h"
+#include "host.h"
+#include "netrc.h"
+#include "convert.h" /* for downloaded_file */
+#include "recur.h" /* for INFINITE_RECURSION */
+#include "warc.h"
+#include "c-strcase.h"
+#ifdef ENABLE_XATTR
+#include "xattr.h"
+#endif
+
+#ifdef __VMS
+# include "vms.h"
+#endif /* def __VMS */
+
+
+/* File where the "ls -al" listing will be saved. */
+#ifdef MSDOS
+#define LIST_FILENAME "_listing"
+#else
+#define LIST_FILENAME ".listing"
+#endif
+
+typedef struct
+{
+ int st; /* connection status */
+ int cmd; /* command code */
+ int csock; /* control connection socket */
+ double dltime; /* time of the download in msecs */
+ enum stype rs; /* remote system reported by ftp server */
+ enum ustype rsu; /* when rs is ST_UNIX, here there are more details */
+ char *id; /* initial directory */
+ char *target; /* target file name */
+ struct url *proxy; /* FTWK-style proxy */
+} ccon;
+
+
+/* Look for regexp "( *[0-9]+ *byte" (literal parenthesis) anywhere in
+ the string S, and return the number converted to wgint, if found, 0
+ otherwise. */
+static wgint
+ftp_expected_bytes (const char *s)
+{
+ wgint res;
+
+ while (1)
+ {
+ while (*s && *s != '(')
+ ++s;
+ if (!*s)
+ return 0;
+ ++s; /* skip the '(' */
+ res = str_to_wgint (s, (char **) &s, 10);
+ if (!*s)
+ return 0;
+ while (*s && c_isspace (*s))
+ ++s;
+ if (!*s)
+ return 0;
+ if (c_tolower (*s) != 'b')
+ continue;
+ if (c_strncasecmp (s, "byte", 4))
+ continue;
+ else
+ break;
+ }
+ return res;
+}
+
+#ifdef ENABLE_IPV6
+/*
+ * This function sets up a passive data connection with the FTP server.
+ * It is merely a wrapper around ftp_epsv, ftp_lpsv and ftp_pasv.
+ */
+static uerr_t
+ftp_do_pasv (int csock, ip_address *addr, int *port)
+{
+ uerr_t err;
+
+ /* We need to determine the address family and need to call
+ getpeername, so while we're at it, store the address to ADDR.
+ ftp_pasv and ftp_lpsv can simply override it. */
+ if (!socket_ip_address (csock, addr, ENDPOINT_PEER))
+ abort ();
+
+ /* If our control connection is over IPv6, then we first try EPSV and then
+ * LPSV if the former is not supported. If the control connection is over
+ * IPv4, we simply issue the good old PASV request. */
+ switch (addr->family)
+ {
+ case AF_INET:
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PASV ... ");
+ err = ftp_pasv (csock, addr, port);
+ break;
+ case AF_INET6:
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> EPSV ... ");
+ err = ftp_epsv (csock, addr, port);
+
+ /* If EPSV is not supported try LPSV */
+ if (err == FTPNOPASV)
+ {
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> LPSV ... ");
+ err = ftp_lpsv (csock, addr, port);
+ }
+ break;
+ default:
+ abort ();
+ }
+
+ return err;
+}
+
+/*
+ * This function sets up an active data connection with the FTP server.
+ * It is merely a wrapper around ftp_eprt, ftp_lprt and ftp_port.
+ */
+static uerr_t
+ftp_do_port (int csock, int *local_sock)
+{
+ uerr_t err;
+ ip_address cip;
+
+ if (!socket_ip_address (csock, &cip, ENDPOINT_PEER))
+ abort ();
+
+ /* If our control connection is over IPv6, then we first try EPRT and then
+ * LPRT if the former is not supported. If the control connection is over
+ * IPv4, we simply issue the good old PORT request. */
+ switch (cip.family)
+ {
+ case AF_INET:
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PORT ... ");
+ err = ftp_port (csock, local_sock);
+ break;
+ case AF_INET6:
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> EPRT ... ");
+ err = ftp_eprt (csock, local_sock);
+
+ /* If EPRT is not supported try LPRT */
+ if (err == FTPPORTERR)
+ {
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> LPRT ... ");
+ err = ftp_lprt (csock, local_sock);
+ }
+ break;
+ default:
+ abort ();
+ }
+ return err;
+}
+#else
+
+static uerr_t
+ftp_do_pasv (int csock, ip_address *addr, int *port)
+{
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PASV ... ");
+ return ftp_pasv (csock, addr, port);
+}
+
+static uerr_t
+ftp_do_port (int csock, int *local_sock)
+{
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PORT ... ");
+ return ftp_port (csock, local_sock);
+}
+#endif
+
+static void
+print_length (wgint size, wgint start, bool authoritative)
+{
+ logprintf (LOG_VERBOSE, _("Length: %s"), number_to_static_string (size));
+ if (size >= 1024)
+ logprintf (LOG_VERBOSE, " (%s)", human_readable (size, 10, 1));
+ if (start > 0)
+ {
+ if (size - start >= 1024)
+ logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
+ number_to_static_string (size - start),
+ human_readable (size - start, 10, 1));
+ else
+ logprintf (LOG_VERBOSE, _(", %s remaining"),
+ number_to_static_string (size - start));
+ }
+ logputs (LOG_VERBOSE, !authoritative ? _(" (unauthoritative)\n") : "\n");
+}
+
+static uerr_t ftp_get_listing (struct url *, struct url *, ccon *, struct fileinfo **);
+
+static uerr_t
+get_ftp_greeting (int csock, ccon *con)
+{
+ uerr_t err = 0;
+
+ /* Get the server's greeting */
+ err = ftp_greeting (csock);
+ if (err != FTPOK)
+ {
+ logputs (LOG_NOTQUIET, "Error in server response. Closing.\n");
+ fd_close (csock);
+ con->csock = -1;
+ }
+
+ return err;
+}
+
+#ifdef HAVE_SSL
+static uerr_t
+init_control_ssl_connection (int csock, struct url *u, bool *using_control_security)
+{
+ bool using_security = false;
+
+ /* If '--ftps-implicit' was passed, perform the SSL handshake directly,
+ * and do not send an AUTH command.
+ * Otherwise send an AUTH sequence before login,
+ * and perform the SSL handshake if accepted by server.
+ */
+ if (!opt.ftps_implicit && !opt.server_response)
+ logputs (LOG_VERBOSE, "==> AUTH TLS ... ");
+ if (opt.ftps_implicit || ftp_auth (csock, SCHEME_FTPS) == FTPOK)
+ {
+ if (!ssl_connect_wget (csock, u->host, NULL))
+ {
+ fd_close (csock);
+ return CONSSLERR;
+ }
+ else if (!ssl_check_certificate (csock, u->host))
+ {
+ fd_close (csock);
+ return VERIFCERTERR;
+ }
+
+ if (!opt.ftps_implicit && !opt.server_response)
+ logputs (LOG_VERBOSE, " done.\n");
+
+ /* If implicit FTPS was requested, we act as "normal" FTP, but over SSL.
+ * We're not using RFC 2228 commands.
+ */
+ using_security = true;
+ }
+ else
+ {
+ /* The server does not support 'AUTH TLS'.
+ * Check if --ftps-fallback-to-ftp was passed. */
+ if (opt.ftps_fallback_to_ftp)
+ {
+ logputs (LOG_NOTQUIET, "Server does not support AUTH TLS. Falling back to FTP.\n");
+ using_security = false;
+ }
+ else
+ {
+ fd_close (csock);
+ return FTPNOAUTH;
+ }
+ }
+
+ *using_control_security = using_security;
+ return NOCONERROR;
+}
+#endif
+
+/* Retrieves a file with denoted parameters through opening an FTP
+ connection to the server. It always closes the data connection,
+ and closes the control connection in case of error. If warc_tmp
+ is non-NULL, the downloaded data will be written there as well. */
+static uerr_t
+getftp (struct url *u, struct url *original_url,
+ wgint passed_expected_bytes, wgint *qtyread,
+ wgint restval, ccon *con, int count, wgint *last_expected_bytes,
+ FILE *warc_tmp)
+{
+ int csock, dtsock, local_sock, res;
+ uerr_t err = RETROK; /* appease the compiler */
+ FILE *fp = NULL;
+ char *respline, *tms;
+ const char *user, *passwd, *tmrate;
+ int cmd = con->cmd;
+ wgint expected_bytes = 0;
+ bool got_expected_bytes = false;
+ bool rest_failed = false;
+ int flags;
+ wgint rd_size, previous_rd_size = 0;
+ char type_char;
+ bool try_again;
+ bool list_a_used = false;
+#ifdef HAVE_SSL
+ enum prot_level prot = (opt.ftps_clear_data_connection ? PROT_CLEAR : PROT_PRIVATE);
+ /* these variables tell whether the target server
+ * accepts the security extensions (RFC 2228) or not,
+ * and whether we're actually using any of them
+ * (encryption at the control connection only,
+ * or both at control and data connections) */
+ bool using_control_security = false, using_data_security = false;
+#endif
+
+ assert (con != NULL);
+ assert (con->target != NULL);
+
+ /* Debug-check of the sanity of the request by making sure that LIST
+ and RETR are never both requested (since we can handle only one
+ at a time. */
+ assert (!((cmd & DO_LIST) && (cmd & DO_RETR)));
+ /* Make sure that at least *something* is requested. */
+ assert ((cmd & (DO_LIST | DO_CWD | DO_RETR | DO_LOGIN)) != 0);
+
+ *qtyread = restval;
+
+ /* Find the username with priority */
+ if (u->user)
+ user = u->user;
+ else if (opt.user && (opt.use_askpass || opt.ask_passwd))
+ user = opt.user;
+ else if (opt.ftp_user)
+ user = opt.ftp_user;
+ else if (opt.user)
+ user = opt.user;
+ else
+ user = NULL;
+
+ /* Find the password with priority */
+ if (u->passwd)
+ passwd = u->passwd;
+ else if (opt.passwd && (opt.use_askpass || opt.ask_passwd))
+ passwd = opt.passwd;
+ else if (opt.ftp_passwd)
+ passwd = opt.ftp_passwd;
+ else if (opt.passwd)
+ passwd = opt.passwd;
+ else
+ passwd = NULL;
+
+ /* Check for ~/.netrc if none of the above match */
+ if (opt.netrc && (!user || !passwd))
+ search_netrc (u->host, (const char **) &user, (const char **) &passwd, 1, NULL);
+
+ if (!user) user = "anonymous";
+ if (!passwd) passwd = "-wget@";
+
+ dtsock = -1;
+ local_sock = -1;
+ con->dltime = 0;
+
+#ifdef HAVE_SSL
+ if (u->scheme == SCHEME_FTPS)
+ {
+ /* Initialize SSL layer first */
+ if (!ssl_init ())
+ {
+ scheme_disable (SCHEME_FTPS);
+ logprintf (LOG_NOTQUIET, _("Could not initialize SSL. It will be disabled.\n"));
+ err = SSLINITFAILED;
+ return err;
+ }
+
+ /* If we're using the default FTP port and implicit FTPS was requested,
+ * rewrite the port to the default *implicit* FTPS port.
+ */
+ if (opt.ftps_implicit && u->port == DEFAULT_FTP_PORT)
+ {
+ DEBUGP (("Implicit FTPS was specified. Rewriting default port to %d.\n", DEFAULT_FTPS_IMPLICIT_PORT));
+ u->port = DEFAULT_FTPS_IMPLICIT_PORT;
+ }
+ }
+#endif
+
+ if (!(cmd & DO_LOGIN))
+ {
+ csock = con->csock;
+#ifdef HAVE_SSL
+ using_data_security = con->st & DATA_CHANNEL_SECURITY;
+#endif
+ }
+ else /* cmd & DO_LOGIN */
+ {
+ char *host = con->proxy ? con->proxy->host : u->host;
+ int port = con->proxy ? con->proxy->port : u->port;
+
+ /* Login to the server: */
+
+ /* First: Establish the control connection. */
+
+ csock = connect_to_host (host, port);
+ if (csock == E_HOST)
+ return HOSTERR;
+ else if (csock < 0)
+ return (retryable_socket_connect_error (errno)
+ ? CONERROR : CONIMPOSSIBLE);
+
+ if (cmd & LEAVE_PENDING)
+ con->csock = csock;
+ else
+ con->csock = -1;
+
+#ifdef HAVE_SSL
+ if (u->scheme == SCHEME_FTPS)
+ {
+ /* If we're in implicit FTPS mode, we have to set up SSL/TLS before everything else.
+ * Otherwise we first read the server's greeting, and then send an "AUTH TLS".
+ */
+ if (opt.ftps_implicit)
+ {
+ err = init_control_ssl_connection (csock, u, &using_control_security);
+ if (err != NOCONERROR)
+ return err;
+ err = get_ftp_greeting (csock, con);
+ if (err != FTPOK)
+ return err;
+ }
+ else
+ {
+ err = get_ftp_greeting (csock, con);
+ if (err != FTPOK)
+ return err;
+ err = init_control_ssl_connection (csock, u, &using_control_security);
+ if (err != NOCONERROR)
+ return err;
+ }
+ }
+ else
+ {
+ err = get_ftp_greeting (csock, con);
+ if (err != FTPOK)
+ return err;
+ }
+#else
+ err = get_ftp_greeting (csock, con);
+ if (err != FTPOK)
+ return err;
+#endif
+
+ /* Second: Login with proper USER/PASS sequence. */
+ logprintf (LOG_VERBOSE, _("Logging in as %s ... "),
+ quotearg_style (escape_quoting_style, user));
+ if (opt.server_response)
+ logputs (LOG_ALWAYS, "\n");
+ if (con->proxy)
+ {
+ /* If proxy is in use, log in as username@target-site. */
+ char *logname = concat_strings (user, "@", u->host, (char *) 0);
+ err = ftp_login (csock, logname, passwd);
+ xfree (logname);
+ }
+ else
+ err = ftp_login (csock, user, passwd);
+
+ /* FTPRERR, FTPSRVERR, WRITEFAILED, FTPLOGREFUSED, FTPLOGINC */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPSRVERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("Error in server greeting.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPLOGREFUSED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("The server refuses login.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return FTPLOGREFUSED;
+ case FTPLOGINC:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("Login incorrect.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return FTPLOGINC;
+ case FTPOK:
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("Logged in!\n"));
+ break;
+ default:
+ abort ();
+ }
+
+#ifdef HAVE_SSL
+ if (using_control_security)
+ {
+ /* Send the PBSZ and PROT commands, in that order.
+ * If we are here it means that the server has already accepted
+ * some form of FTPS. Thus, these commands must work.
+ * If they don't work, that's an error. There's no sense in honoring
+ * --ftps-fallback-to-ftp or similar options. */
+ if (u->scheme == SCHEME_FTPS)
+ {
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> PBSZ 0 ... ");
+ if ((err = ftp_pbsz (csock, 0)) == FTPNOPBSZ)
+ {
+ logputs (LOG_NOTQUIET, _("Server did not accept the 'PBSZ 0' command.\n"));
+ return err;
+ }
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "done.");
+
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, " ==> PROT %c ... ", (int) prot);
+ if ((err = ftp_prot (csock, prot)) == FTPNOPROT)
+ {
+ logprintf (LOG_NOTQUIET, _("Server did not accept the 'PROT %c' command.\n"), (int) prot);
+ return err;
+ }
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "done.\n");
+
+ if (prot != PROT_CLEAR)
+ {
+ using_data_security = true;
+ con->st |= DATA_CHANNEL_SECURITY;
+ }
+ }
+ }
+#endif
+
+ /* Third: Get the system type */
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> SYST ... ");
+ err = ftp_syst (csock, &con->rs, &con->rsu);
+ /* FTPRERR */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPSRVERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Server error, can't determine system type.\n"));
+ break;
+ case FTPOK:
+ /* Everything is OK. */
+ break;
+ default:
+ abort ();
+ }
+ if (!opt.server_response && err != FTPSRVERR)
+ logputs (LOG_VERBOSE, _("done. "));
+
+ /* 2013-10-17 Andrea Urbani (matfanjol)
+ According to the system type I choose which
+ list command will be used.
+ If I don't know that system, I will try, the
+ first time of each session, "LIST -a" and
+ "LIST". (see __LIST_A_EXPLANATION__ below) */
+ switch (con->rs)
+ {
+ case ST_VMS:
+ /* About ST_VMS there is an old note:
+ 2008-01-29 SMS. For a VMS FTP server, where "LIST -a" may not
+ fail, but will never do what is desired here,
+ skip directly to the simple "LIST" command
+ (assumed to be the last one in the list). */
+ DEBUGP (("\nVMS: I know it and I will use \"LIST\" as standard list command\n"));
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST_A;
+ break;
+ case ST_UNIX:
+ if (con->rsu == UST_MULTINET)
+ {
+ DEBUGP (("\nUNIX MultiNet: I know it and I will use \"LIST\" "
+ "as standard list command\n"));
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST_A;
+ }
+ else if (con->rsu == UST_TYPE_L8)
+ {
+ DEBUGP (("\nUNIX TYPE L8: I know it and I will use \"LIST -a\" "
+ "as standard list command\n"));
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST;
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* Fourth: Find the initial ftp directory */
+
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> PWD ... ");
+ err = ftp_pwd (csock, &con->id);
+ /* FTPRERR */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPSRVERR :
+ /* PWD unsupported -- assume "/". */
+ xfree (con->id);
+ con->id = xstrdup ("/");
+ break;
+ case FTPOK:
+ /* Everything is OK. */
+ break;
+ default:
+ abort ();
+ }
+
+#if 0
+ /* 2004-09-17 SMS.
+ Don't help me out. Please.
+ A reasonably recent VMS FTP server will cope just fine with
+ UNIX file specifications. This code just spoils things.
+ Discarding the device name, for example, is not a wise move.
+ This code was disabled but left in as an example of what not
+ to do.
+ */
+
+ /* VMS will report something like "PUB$DEVICE:[INITIAL.FOLDER]".
+ Convert it to "/INITIAL/FOLDER" */
+ if (con->rs == ST_VMS)
+ {
+ char *path = strchr (con->id, '[');
+ char *pathend = path ? strchr (path + 1, ']') : NULL;
+ if (!path || !pathend)
+ DEBUGP (("Initial VMS directory not in the form [...]!\n"));
+ else
+ {
+ char *idir = con->id;
+ DEBUGP (("Preprocessing the initial VMS directory\n"));
+ DEBUGP ((" old = '%s'\n", con->id));
+ /* We do the conversion in-place by copying the stuff
+ between [ and ] to the beginning, and changing dots
+ to slashes at the same time. */
+ *idir++ = '/';
+ for (++path; path < pathend; path++, idir++)
+ *idir = *path == '.' ? '/' : *path;
+ *idir = '\0';
+ DEBUGP ((" new = '%s'\n\n", con->id));
+ }
+ }
+#endif /* 0 */
+
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done.\n"));
+
+ /* Fifth: Set the FTP type. */
+ type_char = ftp_process_type (u->params);
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> TYPE %c ... ", type_char);
+ err = ftp_type (csock, type_char);
+ /* FTPRERR, WRITEFAILED, FTPUNKNOWNTYPE */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPUNKNOWNTYPE:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET,
+ _("Unknown type `%c', closing control connection.\n"),
+ type_char);
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPOK:
+ /* Everything is OK. */
+ break;
+ default:
+ abort ();
+ }
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done. "));
+ } /* do login */
+
+ if (cmd & DO_CWD)
+ {
+ if (!*u->dir)
+ logputs (LOG_VERBOSE, _("==> CWD not needed.\n"));
+ else
+ {
+ const char *targ = NULL;
+ char *target = u->dir;
+ char targetbuf[1024];
+ int cwd_count;
+ int cwd_end;
+ int cwd_start;
+
+ DEBUGP (("changing working directory\n"));
+
+ /* Change working directory. To change to a non-absolute
+ Unix directory, we need to prepend initial directory
+ (con->id) to it. Absolute directories "just work".
+
+ A relative directory is one that does not begin with '/'
+ and, on non-Unix OS'es, one that doesn't begin with
+ "[a-z]:".
+
+ This is not done for OS400, which doesn't use
+ "/"-delimited directories, nor does it support directory
+ hierarchies. "CWD foo" followed by "CWD bar" leaves us
+ in "bar", not in "foo/bar", as would be customary
+ elsewhere. */
+
+ /* 2004-09-20 SMS.
+ Why is this wise even on UNIX? It certainly fouls VMS.
+ See below for a more reliable, more universal method.
+ */
+
+ /* 2008-04-22 MJC.
+ I'm not crazy about it either. I'm informed it's useful
+ for misconfigured servers that have some dirs in the path
+ with +x but -r, but this method is not RFC-conformant. I
+ understand the need to deal with crappy server
+ configurations, but it's far better to use the canonical
+ method first, and fall back to kludges second.
+ */
+
+ if (target[0] != '/'
+ && !(con->rs != ST_UNIX
+ && c_isalpha (target[0])
+ && target[1] == ':')
+ && (con->rs != ST_OS400)
+ && (con->rs != ST_VMS))
+ {
+ char *ntarget, *p;
+ size_t idlen = strlen (con->id);
+ size_t len;
+
+ /* Strip trailing slash(es) from con->id. */
+ while (idlen > 0 && con->id[idlen - 1] == '/')
+ --idlen;
+
+ len = idlen + 1 + strlen (target);
+ if (len < sizeof (targetbuf))
+ p = ntarget = targetbuf;
+ else
+ p = ntarget = xmalloc (len + 1);
+
+ memcpy (p, con->id, idlen);
+ p += idlen;
+ *p++ = '/';
+ strcpy (p, target);
+
+ DEBUGP (("Prepended initial PWD to relative path:\n"));
+ DEBUGP ((" pwd: '%s'\n old: '%s'\n new: '%s'\n",
+ con->id, target, ntarget));
+ target = ntarget;
+ }
+
+#if 0
+ /* 2004-09-17 SMS.
+ Don't help me out. Please.
+ A reasonably recent VMS FTP server will cope just fine with
+ UNIX file specifications. This code just spoils things.
+ Discarding the device name, for example, is not a wise
+ move.
+ This code was disabled but left in as an example of what
+ not to do.
+ */
+
+ /* If the FTP host runs VMS, we will have to convert the absolute
+ directory path in UNIX notation to absolute directory path in
+ VMS notation as VMS FTP servers do not like UNIX notation of
+ absolute paths. "VMS notation" is [dir.subdir.subsubdir]. */
+
+ if (con->rs == ST_VMS)
+ {
+ char *tmpp;
+ char *ntarget = (char *)alloca (strlen (target) + 2);
+ /* We use a converted initial dir, so directories in
+ TARGET will be separated with slashes, something like
+ "/INITIAL/FOLDER/DIR/SUBDIR". Convert that to
+ "[INITIAL.FOLDER.DIR.SUBDIR]". */
+ strcpy (ntarget, target);
+ assert (*ntarget == '/');
+ *ntarget = '[';
+ for (tmpp = ntarget + 1; *tmpp; tmpp++)
+ if (*tmpp == '/')
+ *tmpp = '.';
+ *tmpp++ = ']';
+ *tmpp = '\0';
+ DEBUGP (("Changed file name to VMS syntax:\n"));
+ DEBUGP ((" Unix: '%s'\n VMS: '%s'\n", target, ntarget));
+ target = ntarget;
+ }
+#endif /* 0 */
+
+ /* 2004-09-20 SMS.
+ A relative directory is relative to the initial directory.
+ Thus, what _is_ useful on VMS (and probably elsewhere) is
+ to CWD to the initial directory (ideally, whatever the
+ server reports, _exactly_, NOT badly UNIX-ixed), and then
+ CWD to the (new) relative directory. This should probably
+ be restructured as a function, called once or twice, but
+ I'm lazy enough to take the badly indented loop short-cut
+ for now.
+ */
+
+ /* Decide on one pass (absolute) or two (relative).
+ The VMS restriction may be relaxed when the squirrely code
+ above is reformed.
+ */
+ if ((con->rs == ST_VMS) && (target[0] != '/'))
+ {
+ cwd_start = 0;
+ DEBUGP (("Using two-step CWD for relative path.\n"));
+ }
+ else
+ {
+ /* Go straight to the target. */
+ cwd_start = 1;
+ }
+
+ /* At least one VMS FTP server (TCPware V5.6-2) can switch to
+ a UNIX emulation mode when given a UNIX-like directory
+ specification (like "a/b/c"). If allowed to continue this
+ way, LIST interpretation will be confused, because the
+ system type (SYST response) will not be re-checked, and
+ future UNIX-format directory listings (for multiple URLs or
+ "-r") will be horribly misinterpreted.
+
+ The cheap and nasty work-around is to do a "CWD []" after a
+ UNIX-like directory specification is used. (A single-level
+ directory is harmless.) This puts the TCPware server back
+ into VMS mode, and does no harm on other servers.
+
+ Unlike the rest of this block, this particular behavior
+ _is_ VMS-specific, so it gets its own VMS test.
+ */
+ if ((con->rs == ST_VMS) && (strchr (target, '/') != NULL))
+ {
+ cwd_end = 3;
+ DEBUGP (("Using extra \"CWD []\" step for VMS server.\n"));
+ }
+ else
+ {
+ cwd_end = 2;
+ }
+
+ /* 2004-09-20 SMS. */
+ /* Sorry about the deviant indenting. Laziness. */
+
+ for (cwd_count = cwd_start; cwd_count < cwd_end; cwd_count++)
+ {
+ switch (cwd_count)
+ {
+ case 0:
+ /* Step one (optional): Go to the initial directory,
+ exactly as reported by the server.
+ */
+ targ = con->id;
+ break;
+
+ case 1:
+ /* Step two: Go to the target directory. (Absolute or
+ relative will work now.)
+ */
+ targ = target;
+ break;
+
+ case 2:
+ /* Step three (optional): "CWD []" to restore server
+ VMS-ness.
+ */
+ targ = "[]";
+ break;
+
+ default:
+ logprintf (LOG_ALWAYS, _("Logically impossible section reached in getftp()"));
+ logprintf (LOG_ALWAYS, _("cwd_count: %d\ncwd_start: %d\ncwd_end: %d\n"),
+ cwd_count, cwd_start, cwd_end);
+ abort ();
+ }
+
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> CWD (%d) %s ... ", cwd_count,
+ quotearg_style (escape_quoting_style, target));
+
+ err = ftp_cwd (csock, targ);
+
+ /* FTPRERR, WRITEFAILED, FTPNSFOD */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPNSFOD:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("No such directory %s.\n\n"),
+ quote (u->dir));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ }
+
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done.\n"));
+
+ } /* for */
+
+ /* 2004-09-20 SMS. */
+
+ if (target != targetbuf)
+ xfree (target);
+
+ } /* else */
+ }
+ else /* do not CWD */
+ logputs (LOG_VERBOSE, _("==> CWD not required.\n"));
+
+ if ((cmd & DO_RETR) && passed_expected_bytes == 0)
+ {
+ if (opt.verbose)
+ {
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> SIZE %s ... ",
+ quotearg_style (escape_quoting_style, u->file));
+ }
+
+ err = ftp_size (csock, u->file, &expected_bytes);
+ /* FTPRERR */
+ switch (err)
+ {
+ case FTPRERR:
+ case FTPSRVERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPOK:
+ got_expected_bytes = true;
+ /* Everything is OK. */
+ break;
+ default:
+ abort ();
+ }
+ if (!opt.server_response)
+ {
+ logprintf (LOG_VERBOSE, "%s\n",
+ expected_bytes ?
+ number_to_static_string (expected_bytes) :
+ _("done.\n"));
+ }
+ }
+
+ if (cmd & DO_RETR && restval > 0 && restval == expected_bytes)
+ {
+ /* Server confirms that file has length restval. We should stop now.
+ Some servers (f.e. NcFTPd) return error when receive REST 0 */
+ logputs (LOG_VERBOSE, _("File has already been retrieved.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return RETRFINISHED;
+ }
+
+ do
+ {
+ try_again = false;
+ /* If anything is to be retrieved, PORT (or PASV) must be sent. */
+ if (cmd & (DO_LIST | DO_RETR))
+ {
+ if (opt.ftp_pasv)
+ {
+ ip_address passive_addr;
+ int passive_port;
+ err = ftp_do_pasv (csock, &passive_addr, &passive_port);
+ /* FTPRERR, WRITEFAILED, FTPNOPASV, FTPINVPASV */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ return err;
+ case FTPNOPASV:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("Cannot initiate PASV transfer.\n"));
+ break;
+ case FTPINVPASV:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("Cannot parse PASV response.\n"));
+ break;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ } /* switch (err) */
+ if (err==FTPOK)
+ {
+ DEBUGP (("trying to connect to %s port %d\n",
+ print_address (&passive_addr), passive_port));
+ dtsock = connect_to_ip (&passive_addr, passive_port, NULL);
+ if (dtsock < 0)
+ {
+ int save_errno = errno;
+ fd_close (csock);
+ con->csock = -1;
+ logprintf (LOG_VERBOSE, _("couldn't connect to %s port %d: %s\n"),
+ print_address (&passive_addr), passive_port,
+ strerror (save_errno));
+ return (retryable_socket_connect_error (save_errno)
+ ? CONERROR : CONIMPOSSIBLE);
+ }
+
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done. "));
+ }
+ else
+ return err;
+
+ /*
+ * We do not want to fall back from PASSIVE mode to ACTIVE mode !
+ * The reason is the PORT command exposes the client's real IP address
+ * to the server. Bad for someone who relies on privacy via a ftp proxy.
+ */
+ }
+ else
+ {
+ err = ftp_do_port (csock, &local_sock);
+ /* FTPRERR, WRITEFAILED, bindport (FTPSYSERR), HOSTERR,
+ FTPPORTERR */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case CONSOCKERR:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, "socket: %s\n", strerror (errno));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPSYSERR:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Bind error (%s).\n"),
+ strerror (errno));
+ fd_close (dtsock);
+ return err;
+ case FTPPORTERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("Invalid PORT.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ } /* port switch */
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done. "));
+ } /* dtsock == -1 */
+ } /* cmd & (DO_LIST | DO_RETR) */
+
+ /* Restart if needed. */
+ if (restval && (cmd & DO_RETR))
+ {
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "==> REST %s ... ",
+ number_to_static_string (restval));
+ err = ftp_rest (csock, restval);
+
+ /* FTPRERR, WRITEFAILED, FTPRESTFAIL */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPRESTFAIL:
+ logputs (LOG_VERBOSE, _("\nREST failed, starting from scratch.\n"));
+ rest_failed = true;
+ break;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ }
+ if (err != FTPRESTFAIL && !opt.server_response)
+ logputs (LOG_VERBOSE, _("done. "));
+ } /* restval && cmd & DO_RETR */
+
+ if (cmd & DO_RETR)
+ {
+ /* If we're in spider mode, don't really retrieve anything except
+ the directory listing and verify whether the given "file" exists. */
+ if (opt.spider)
+ {
+ bool exists = false;
+ bool all_exist = true;
+ struct fileinfo *f;
+ uerr_t _res = ftp_get_listing (u, original_url, con, &f);
+ /* Set the DO_RETR command flag again, because it gets unset when
+ calling ftp_get_listing() and would otherwise cause an assertion
+ failure earlier on when this function gets repeatedly called
+ (e.g., when recursing). */
+ con->cmd |= DO_RETR;
+ if (_res == RETROK)
+ {
+ while (f)
+ {
+ if (!strcmp (f->name, u->file))
+ {
+ exists = true;
+ break;
+ } else {
+ all_exist = false;
+ }
+ f = f->next;
+ }
+ if (exists)
+ {
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("File %s exists.\n"),
+ quote (u->file));
+ }
+ else
+ {
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("No such file %s.\n"),
+ quote (u->file));
+ }
+ }
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ if (all_exist) {
+ return RETRFINISHED;
+ } else {
+ return FTPNSFOD;
+ }
+ }
+
+ if (opt.verbose)
+ {
+ if (!opt.server_response)
+ {
+ if (restval)
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_VERBOSE, "==> RETR %s ... ",
+ quotearg_style (escape_quoting_style, u->file));
+ }
+ }
+
+ err = ftp_retr (csock, u->file);
+ /* FTPRERR, WRITEFAILED, FTPNSFOD */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPNSFOD:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("No such file %s.\n\n"),
+ quote (u->file));
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ }
+
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done.\n"));
+
+ if (! got_expected_bytes)
+ expected_bytes = *last_expected_bytes;
+ } /* do retrieve */
+
+ if (cmd & DO_LIST)
+ {
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, "==> LIST ... ");
+ /* As Maciej W. Rozycki (macro@ds2.pg.gda.pl) says, `LIST'
+ without arguments is better than `LIST .'; confirmed by
+ RFC959. */
+ err = ftp_list (csock, NULL, con->st&AVOID_LIST_A, con->st&AVOID_LIST, &list_a_used);
+
+ /* FTPRERR, WRITEFAILED */
+ switch (err)
+ {
+ case FTPRERR:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET, _("\
+Error in server response, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case WRITEFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_NOTQUIET,
+ _("Write failed, closing control connection.\n"));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPNSFOD:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("No such file or directory %s.\n\n"),
+ quote ("."));
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return err;
+ case FTPOK:
+ break;
+ default:
+ abort ();
+ }
+ if (!opt.server_response)
+ logputs (LOG_VERBOSE, _("done.\n"));
+
+ if (! got_expected_bytes)
+ expected_bytes = *last_expected_bytes;
+ } /* cmd & DO_LIST */
+
+ if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
+ return RETRFINISHED;
+
+ /* Some FTP servers return the total length of file after REST
+ command, others just return the remaining size. */
+ if (passed_expected_bytes && restval && expected_bytes
+ && (expected_bytes == passed_expected_bytes - restval))
+ {
+ DEBUGP (("Lying FTP server found, adjusting.\n"));
+ expected_bytes = passed_expected_bytes;
+ }
+
+ /* If no transmission was required, then everything is OK. */
+ if (!opt.ftp_pasv) /* we are not using passive mode so we need
+ to accept */
+ {
+ /* Wait for the server to connect to the address we're waiting
+ at. */
+ dtsock = accept_connection (local_sock);
+ if (dtsock < 0)
+ {
+ logprintf (LOG_NOTQUIET, "accept: %s\n", strerror (errno));
+ return CONERROR;
+ }
+ }
+
+ /* Open the file -- if output_stream is set, use it instead. */
+
+ /* 2005-04-17 SMS.
+ Note that having the output_stream ("-O") file opened in main
+ (main.c) rather limits the ability in VMS to open the file
+ differently for ASCII versus binary FTP here. (Of course, doing it
+ there allows a open failure to be detected immediately, without first
+ connecting to the server.)
+ */
+ if (!output_stream || con->cmd & DO_LIST)
+ {
+/* On VMS, alter the name as required. */
+#ifdef __VMS
+ char *targ;
+
+ targ = ods_conform (con->target);
+ if (targ != con->target)
+ {
+ xfree (con->target);
+ con->target = targ;
+ }
+#endif /* def __VMS */
+
+ mkalldirs (con->target);
+ if (opt.backups)
+ rotate_backups (con->target);
+
+/* 2005-04-15 SMS.
+ For VMS, define common fopen() optional arguments, and a handy macro
+ for use as a variable "binary" flag.
+ Elsewhere, define a constant "binary" flag.
+ Isn't it nice to have distinct text and binary file types?
+*/
+/* 2011-09-30 SMS.
+ Added listing files to the set of non-"binary" (text, Stream_LF)
+ files. (Wget works either way, but other programs, like, say, text
+ editors, work better on listing files which have text attributes.)
+ Now we use "binary" attributes for a binary ("IMAGE") transfer,
+ unless "--ftp-stmlf" was specified, and we always use non-"binary"
+ (text, Stream_LF) attributes for a listing file, or for an ASCII
+ transfer.
+ Tidied the VMS-specific BIN_TYPE_xxx macros, and changed the call to
+ fopen_excl() (restored?) to use BIN_TYPE_FILE instead of "true".
+*/
+#ifdef __VMS
+# define BIN_TYPE_TRANSFER (type_char != 'A')
+# define BIN_TYPE_FILE \
+ ((!(cmd & DO_LIST)) && BIN_TYPE_TRANSFER && (opt.ftp_stmlf == 0))
+# define FOPEN_OPT_ARGS "fop=sqo", "acc", acc_cb, &open_id
+# define FOPEN_OPT_ARGS_BIN "ctx=bin,stm", "rfm=fix", "mrs=512" FOPEN_OPT_ARGS
+#else /* def __VMS */
+# define BIN_TYPE_FILE true
+#endif /* def __VMS [else] */
+
+ if (restval && !(con->cmd & DO_LIST))
+ {
+#ifdef __VMS
+ int open_id;
+
+ if (BIN_TYPE_FILE)
+ {
+ open_id = 3;
+ fp = fopen (con->target, "ab", FOPEN_OPT_ARGS_BIN);
+ }
+ else
+ {
+ open_id = 4;
+ fp = fopen (con->target, "a", FOPEN_OPT_ARGS);
+ }
+#else /* def __VMS */
+ fp = fopen (con->target, "ab");
+#endif /* def __VMS [else] */
+ }
+ else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct
+ || opt.output_document || count > 0)
+ {
+ if (opt.unlink_requested && file_exists_p (con->target, NULL))
+ {
+ if (unlink (con->target) < 0)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", con->target,
+ strerror (errno));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return UNLINKERR;
+ }
+ }
+
+#ifdef __VMS
+ int open_id;
+
+ if (BIN_TYPE_FILE)
+ {
+ open_id = 5;
+ fp = fopen (con->target, "wb", FOPEN_OPT_ARGS_BIN);
+ }
+ else
+ {
+ open_id = 6;
+ fp = fopen (con->target, "w", FOPEN_OPT_ARGS);
+ }
+#else /* def __VMS */
+ fp = fopen (con->target, "wb");
+#endif /* def __VMS [else] */
+ }
+ else
+ {
+ fp = fopen_excl (con->target, BIN_TYPE_FILE);
+ if (!fp && errno == EEXIST)
+ {
+ /* We cannot just invent a new name and use it (which is
+ what functions like unique_create typically do)
+ because we told the user we'd use this name.
+ Instead, return and retry the download. */
+ logprintf (LOG_NOTQUIET, _("%s has sprung into existence.\n"),
+ con->target);
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return FOPEN_EXCL_ERR;
+ }
+ }
+ if (!fp)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", con->target, strerror (errno));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ fd_close (local_sock);
+ return FOPENERR;
+ }
+ }
+ else
+ fp = output_stream;
+
+ if (passed_expected_bytes)
+ {
+ print_length (passed_expected_bytes, restval, true);
+ expected_bytes = passed_expected_bytes;
+ /* for fd_read_body's progress bar */
+ }
+ else if (expected_bytes)
+ print_length (expected_bytes, restval, false);
+
+#ifdef HAVE_SSL
+ if (u->scheme == SCHEME_FTPS && using_data_security)
+ {
+ /* We should try to restore the existing SSL session in the data connection
+ * and fall back to establishing a new session if the server doesn't want to restore it.
+ */
+ if (!opt.ftps_resume_ssl || !ssl_connect_wget (dtsock, u->host, &csock))
+ {
+ if (opt.ftps_resume_ssl)
+ logputs (LOG_NOTQUIET, "Server does not want to resume the SSL session. Trying with a new one.\n");
+ if (!ssl_connect_wget (dtsock, u->host, NULL))
+ {
+ fd_close (csock);
+ fd_close (dtsock);
+ err = CONERROR;
+ logputs (LOG_NOTQUIET, "Could not perform SSL handshake.\n");
+ goto exit_error;
+ }
+ }
+ else
+ logputs (LOG_NOTQUIET, "Resuming SSL session in data connection.\n");
+
+ if (!ssl_check_certificate (dtsock, u->host))
+ {
+ fd_close (csock);
+ fd_close (dtsock);
+ err = CONERROR;
+ goto exit_error;
+ }
+ }
+#endif
+
+ /* Get the contents of the document. */
+ flags = 0;
+ if (restval && rest_failed)
+ flags |= rb_skip_startpos;
+ rd_size = 0;
+ res = fd_read_body (con->target, dtsock, fp,
+ expected_bytes ? expected_bytes - restval : 0,
+ restval, &rd_size, qtyread, &con->dltime, flags, warc_tmp);
+
+ tms = datetime_str (time (NULL));
+ tmrate = retr_rate (rd_size, con->dltime);
+ total_download_time += con->dltime;
+
+#ifdef ENABLE_XATTR
+ if (opt.enable_xattr)
+ set_file_metadata (u, NULL, fp);
+#endif
+
+ fd_close (local_sock);
+ /* Close the local file. */
+ if (!output_stream || con->cmd & DO_LIST)
+ fclose (fp);
+
+ /* If fd_read_body couldn't write to fp or warc_tmp, bail out. */
+ if (res == -2 || (warc_tmp != NULL && res == -3))
+ {
+ logprintf (LOG_NOTQUIET, _("%s: %s, closing control connection.\n"),
+ con->target, strerror (errno));
+ fd_close (csock);
+ con->csock = -1;
+ fd_close (dtsock);
+ if (res == -2)
+ return FWRITEERR;
+ else if (res == -3)
+ return WARC_TMP_FWRITEERR;
+ }
+ else if (res == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("%s (%s) - Data connection: %s; "),
+ tms, tmrate, fd_errstr (dtsock));
+ if (opt.server_response)
+ logputs (LOG_ALWAYS, "\n");
+ }
+ fd_close (dtsock);
+
+ /* Get the server to tell us if everything is retrieved. */
+ err = ftp_response (csock, &respline);
+ if (err != FTPOK)
+ {
+ /* The control connection is decidedly closed. Print the time
+ only if it hasn't already been printed. */
+ if (res != -1)
+ logprintf (LOG_NOTQUIET, "%s (%s) - ", tms, tmrate);
+ logputs (LOG_NOTQUIET, _("Control connection closed.\n"));
+ /* If there is an error on the control connection, close it, but
+ return FTPRETRINT, since there is a possibility that the
+ whole file was retrieved nevertheless (but that is for
+ ftp_loop_internal to decide). */
+ fd_close (csock);
+ con->csock = -1;
+ return FTPRETRINT;
+ } /* err != FTPOK */
+ *last_expected_bytes = ftp_expected_bytes (respline);
+ /* If retrieval failed for any reason, return FTPRETRINT, but do not
+ close socket, since the control connection is still alive. If
+ there is something wrong with the control connection, it will
+ become apparent later. */
+ if (*respline != '2')
+ {
+ if (res != -1)
+ logprintf (LOG_NOTQUIET, "%s (%s) - ", tms, tmrate);
+ logputs (LOG_NOTQUIET, _("Data transfer aborted.\n"));
+#ifdef HAVE_SSL
+ if (!c_strncasecmp (respline, "425", 3) && u->scheme == SCHEME_FTPS)
+ {
+ logputs (LOG_NOTQUIET, "FTPS server rejects new SSL sessions in the data connection.\n");
+ xfree (respline);
+ return FTPRESTFAIL;
+ }
+#endif
+ xfree (respline);
+ return FTPRETRINT;
+ }
+ xfree (respline);
+
+ if (res == -1)
+ {
+ /* What now? The data connection was erroneous, whereas the
+ response says everything is OK. We shall play it safe. */
+ return FTPRETRINT;
+ }
+
+ if (!(cmd & LEAVE_PENDING))
+ {
+ /* Closing the socket is faster than sending 'QUIT' and the
+ effect is the same. */
+ fd_close (csock);
+ con->csock = -1;
+ }
+ /* If it was a listing, and opt.server_response is true,
+ print it out. */
+ if (con->cmd & DO_LIST)
+ {
+ if (opt.server_response)
+ {
+/* 2005-02-25 SMS.
+ Much of this work may already have been done, but repeating it should
+ do no damage beyond wasting time.
+*/
+/* On VMS, alter the name as required. */
+#ifdef __VMS
+ char *targ;
+
+ targ = ods_conform (con->target);
+ if (targ != con->target)
+ {
+ xfree (con->target);
+ con->target = targ;
+ }
+#endif /* def __VMS */
+
+ mkalldirs (con->target);
+ fp = fopen (con->target, "r");
+ if (!fp)
+ logprintf (LOG_ALWAYS, "%s: %s\n", con->target, strerror (errno));
+ else
+ {
+ char *line = NULL;
+ size_t bufsize = 0;
+ ssize_t len;
+
+ /* The lines are being read with getline because of
+ no-buffering on opt.lfile. */
+ while ((len = getline (&line, &bufsize, fp)) > 0)
+ {
+ while (len > 0 && (line[len - 1] == '\n' || line[len - 1] == '\r'))
+ line[--len] = '\0';
+ logprintf (LOG_ALWAYS, "%s\n",
+ quotearg_style (escape_quoting_style, line));
+ }
+ xfree (line);
+ fclose (fp);
+ }
+ } /* server_response */
+
+ /* 2013-10-17 Andrea Urbani (matfanjol)
+ < __LIST_A_EXPLANATION__ >
+ After the SYST command, looks if it knows that system.
+ If yes, wget will force the use of "LIST" or "LIST -a".
+ If no, wget will try, only the first time of each session, before the
+ "LIST -a" command and after the "LIST".
+ If "LIST -a" works and returns more or equal data of the "LIST",
+ "LIST -a" will be the standard list command for all the session.
+ If "LIST -a" fails or returns less data than "LIST" (think on the case
+ of an existing file called "-a"), "LIST" will be the standard list
+ command for all the session.
+ ("LIST -a" is used to get also the hidden files)
+
+ */
+ if (!(con->st & LIST_AFTER_LIST_A_CHECK_DONE))
+ {
+ /* We still have to check "LIST" after the first "LIST -a" to see
+ if with "LIST" we get more data than "LIST -a", that means
+ "LIST -a" returned files/folders with "-a" name. */
+ if (con->st & AVOID_LIST_A)
+ {
+ /* LIST was used in this cycle.
+ Let's see the result. */
+ if (rd_size > previous_rd_size)
+ {
+ /* LIST returns more data than "LIST -a".
+ "LIST" is the official command to use. */
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ DEBUGP (("LIST returned more data than \"LIST -a\": "
+ "I will use \"LIST\" as standard list command\n"));
+ }
+ else if (previous_rd_size > rd_size)
+ {
+ /* "LIST -a" returned more data then LIST.
+ "LIST -a" is the official command to use. */
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST;
+ con->st &= ~AVOID_LIST_A;
+ /* Sorry, please, download again the "LIST -a"... */
+ try_again = true;
+ DEBUGP (("LIST returned less data than \"LIST -a\": I will "
+ "use \"LIST -a\" as standard list command\n"));
+ }
+ else
+ {
+ /* LIST and "LIST -a" return the same data. */
+ if (rd_size == 0)
+ {
+ /* Same empty data. We will check both again because
+ we cannot check if "LIST -a" has returned an empty
+ folder instead of a folder content. */
+ con->st &= ~AVOID_LIST_A;
+ }
+ else
+ {
+ /* Same data, so, better to take "LIST -a" that
+ shows also hidden files/folders (when present) */
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST;
+ con->st &= ~AVOID_LIST_A;
+ DEBUGP (("LIST returned the same amount of data of "
+ "\"LIST -a\": I will use \"LIST -a\" as standard "
+ "list command\n"));
+ }
+ }
+ }
+ else
+ {
+ /* In this cycle "LIST -a" should being used. Is it true? */
+ if (list_a_used)
+ {
+ /* Yes, it is.
+ OK, let's save the amount of data and try again
+ with LIST */
+ previous_rd_size = rd_size;
+ try_again = true;
+ con->st |= AVOID_LIST_A;
+ }
+ else
+ {
+ /* No: something happens and LIST was used.
+ This means "LIST -a" raises an error. */
+ con->st |= LIST_AFTER_LIST_A_CHECK_DONE;
+ con->st |= AVOID_LIST_A;
+ DEBUGP (("\"LIST -a\" failed: I will use \"LIST\" "
+ "as standard list command\n"));
+ }
+ }
+ }
+ }
+ } while (try_again);
+ return RETRFINISHED;
+
+exit_error:
+
+ /* If fp is a regular file, close and try to remove it */
+ if (fp && (!output_stream || con->cmd & DO_LIST))
+ fclose (fp);
+ return err;
+}
+
+/* A one-file FTP loop. This is the part where FTP retrieval is
+ retried, and retried, and retried, and...
+
+ This loop either gets commands from con, or (if ON_YOUR_OWN is
+ set), makes them up to retrieve the file given by the URL. */
+static uerr_t
+ftp_loop_internal (struct url *u, struct url *original_url, struct fileinfo *f,
+ ccon *con, char **local_file, bool force_full_retrieve)
+{
+ int count, orig_lp;
+ wgint restval, len = 0, qtyread = 0;
+ char *tms, *locf;
+ const char *tmrate = NULL;
+ uerr_t err;
+ struct stat st;
+
+ /* Declare WARC variables. */
+ bool warc_enabled = (opt.warc_filename != NULL);
+ FILE *warc_tmp = NULL;
+ ip_address warc_ip_buf, *warc_ip = NULL;
+ wgint last_expected_bytes = 0;
+
+ /* Get the target, and set the name for the message accordingly. */
+ if ((f == NULL) && (con->target))
+ {
+ /* Explicit file (like ".listing"). */
+ locf = con->target;
+ }
+ else
+ {
+ /* URL-derived file. Consider "-O file" name. */
+ xfree (con->target);
+ con->target = url_file_name (opt.trustservernames || !original_url ? u : original_url, NULL);
+ if (!opt.output_document)
+ locf = con->target;
+ else
+ locf = opt.output_document;
+ }
+
+ /* If the output_document was given, then this check was already done and
+ the file didn't exist. Hence the !opt.output_document */
+
+ /* If we receive .listing file it is necessary to determine system type of the ftp
+ server even if opn.noclobber is given. Thus we must ignore opt.noclobber in
+ order to establish connection with the server and get system type. */
+ if (opt.noclobber && !opt.output_document && file_exists_p (con->target, NULL)
+ && !((con->cmd & DO_LIST) && !(con->cmd & DO_RETR)))
+ {
+ logprintf (LOG_VERBOSE,
+ _("File %s already there; not retrieving.\n"), quote (con->target));
+ /* If the file is there, we suppose it's retrieved OK. */
+ return RETROK;
+ }
+
+ /* Remove it if it's a link. */
+ remove_link (con->target);
+
+ count = 0;
+
+ if (con->st & ON_YOUR_OWN)
+ con->st = ON_YOUR_OWN;
+
+ orig_lp = con->cmd & LEAVE_PENDING ? 1 : 0;
+
+ /* THE loop. */
+ do
+ {
+ /* Increment the pass counter. */
+ ++count;
+ sleep_between_retrievals (count);
+ if (con->st & ON_YOUR_OWN)
+ {
+ con->cmd = 0;
+ con->cmd |= (DO_RETR | LEAVE_PENDING);
+ if (con->csock != -1)
+ con->cmd &= ~ (DO_LOGIN | DO_CWD);
+ else
+ con->cmd |= (DO_LOGIN | DO_CWD);
+ }
+ else /* not on your own */
+ {
+ if (con->csock != -1)
+ con->cmd &= ~DO_LOGIN;
+ else
+ con->cmd |= DO_LOGIN;
+ if (con->st & DONE_CWD)
+ con->cmd &= ~DO_CWD;
+ else
+ con->cmd |= DO_CWD;
+ }
+
+ /* For file RETR requests, we can write a WARC record.
+ We record the file contents to a temporary file. */
+ if (warc_enabled && (con->cmd & DO_RETR) && warc_tmp == NULL)
+ {
+ warc_tmp = warc_tempfile ();
+ if (warc_tmp == NULL)
+ return WARC_TMP_FOPENERR;
+
+ if (!con->proxy && con->csock != -1)
+ {
+ warc_ip = &warc_ip_buf;
+ socket_ip_address (con->csock, warc_ip, ENDPOINT_PEER);
+ }
+ }
+
+ /* Decide whether or not to restart. */
+ if (con->cmd & DO_LIST)
+ restval = 0;
+ else if (force_full_retrieve)
+ restval = 0;
+ else if (opt.start_pos >= 0)
+ restval = opt.start_pos;
+ else if (opt.always_rest
+ && stat (locf, &st) == 0
+ && S_ISREG (st.st_mode))
+ /* When -c is used, continue from on-disk size. (Can't use
+ hstat.len even if count>1 because we don't want a failed
+ first attempt to clobber existing data.) */
+ restval = st.st_size;
+ else if (count > 1)
+ restval = qtyread; /* start where the previous run left off */
+ else
+ restval = 0;
+
+ /* Get the current time string. */
+ tms = datetime_str (time (NULL));
+ /* Print fetch message, if opt.verbose. */
+ if (opt.verbose)
+ {
+ char *hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
+ char tmp[256];
+ strcpy (tmp, " ");
+ if (count > 1)
+ sprintf (tmp, _("(try:%2d)"), count);
+ logprintf (LOG_VERBOSE, "--%s-- %s\n %s => %s\n",
+ tms, hurl, tmp, quote (locf));
+#ifdef WINDOWS
+ ws_changetitle (hurl);
+#endif
+ xfree (hurl);
+ }
+ /* Send getftp the proper length, if fileinfo was provided. */
+ if (f && f->type != FT_SYMLINK)
+ len = f->size;
+ else
+ len = 0;
+
+ /* If we are working on a WARC record, getftp should also write
+ to the warc_tmp file. */
+ err = getftp (u, original_url, len, &qtyread, restval, con, count,
+ &last_expected_bytes, warc_tmp);
+
+ if (con->csock == -1)
+ con->st &= ~DONE_CWD;
+ else
+ con->st |= DONE_CWD;
+
+ switch (err)
+ {
+ case HOSTERR: case CONIMPOSSIBLE: case FWRITEERR: case FOPENERR:
+ case FTPNSFOD: case FTPLOGINC: case FTPNOPASV: case FTPNOAUTH: case FTPNOPBSZ: case FTPNOPROT:
+ case UNLINKERR: case WARC_TMP_FWRITEERR: case CONSSLERR: case CONTNOTSUPPORTED:
+ case VERIFCERTERR:
+#ifdef HAVE_SSL
+ if (err == FTPNOAUTH)
+ logputs (LOG_NOTQUIET, "Server does not support AUTH TLS.\n");
+ if (opt.ftps_implicit)
+ logputs (LOG_NOTQUIET, "Server does not like implicit FTPS connections.\n");
+#endif
+ /* Fatal errors, give up. */
+ if (warc_tmp != NULL)
+ {
+ fclose (warc_tmp);
+ warc_tmp = NULL;
+ }
+ return err;
+ case CONSOCKERR: case CONERROR: case FTPSRVERR: case FTPRERR:
+ case WRITEFAILED: case FTPUNKNOWNTYPE: case FTPSYSERR:
+ case FTPPORTERR: case FTPLOGREFUSED: case FTPINVPASV:
+ case FOPEN_EXCL_ERR:
+ printwhat (count, opt.ntry);
+ /* non-fatal errors */
+ if (err == FOPEN_EXCL_ERR)
+ {
+ /* Re-determine the file name. */
+ xfree (con->target);
+ con->target = url_file_name (u, NULL);
+ locf = con->target;
+ }
+ continue;
+ case FTPRETRINT:
+ /* If the control connection was closed, the retrieval
+ will be considered OK if f->size == len. */
+ if (!f || qtyread != f->size)
+ {
+ printwhat (count, opt.ntry);
+ continue;
+ }
+ break;
+ case RETRFINISHED:
+ /* Great! */
+ break;
+ default:
+ /* Not as great. */
+ abort ();
+ }
+ tms = datetime_str (time (NULL));
+ if (!opt.spider)
+ tmrate = retr_rate (qtyread - restval, con->dltime);
+
+ /* If we get out of the switch above without continue'ing, we've
+ successfully downloaded a file. Remember this fact. */
+ downloaded_file (FILE_DOWNLOADED_NORMALLY, locf);
+
+ if (con->st & ON_YOUR_OWN)
+ {
+ fd_close (con->csock);
+ con->csock = -1;
+ }
+ if (!opt.spider)
+ {
+ bool write_to_stdout = (opt.output_document && HYPHENP (opt.output_document));
+
+ logprintf (LOG_VERBOSE,
+ write_to_stdout
+ ? _("%s (%s) - written to stdout %s[%s]\n\n")
+ : _("%s (%s) - %s saved [%s]\n\n"),
+ tms, tmrate,
+ write_to_stdout ? "" : quote (locf),
+ number_to_static_string (qtyread));
+ }
+ if (!opt.verbose && !opt.quiet)
+ {
+ /* Need to hide the password from the URL. The `if' is here
+ so that we don't do the needless allocation every
+ time. */
+ char *hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
+ logprintf (LOG_NONVERBOSE, "%s URL: %s [%s] -> \"%s\" [%d]\n",
+ tms, hurl, number_to_static_string (qtyread), locf, count);
+ xfree (hurl);
+ }
+
+ if (warc_enabled && (con->cmd & DO_RETR))
+ {
+ /* Create and store a WARC resource record for the retrieved file. */
+ bool warc_res;
+
+ warc_res = warc_write_resource_record (NULL, u->url, NULL, NULL,
+ warc_ip, NULL, warc_tmp, -1);
+
+ if (! warc_res)
+ return WARC_ERR;
+
+ /* warc_write_resource_record has also closed warc_tmp. */
+ warc_tmp = NULL;
+ }
+
+ if (con->cmd & DO_LIST)
+ /* This is a directory listing file. */
+ {
+ if (!opt.remove_listing)
+ /* --dont-remove-listing was specified, so do count this towards the
+ number of bytes and files downloaded. */
+ {
+ total_downloaded_bytes += qtyread;
+ numurls++;
+ }
+
+ /* Deletion of listing files is not controlled by --delete-after, but
+ by the more specific option --dont-remove-listing, and the code
+ to do this deletion is in another function. */
+ }
+ else if (!opt.spider)
+ /* This is not a directory listing file. */
+ {
+ /* Unlike directory listing files, don't pretend normal files weren't
+ downloaded if they're going to be deleted. People seeding proxies,
+ for instance, may want to know how many bytes and files they've
+ downloaded through it. */
+ total_downloaded_bytes += qtyread;
+ numurls++;
+
+ if (opt.delete_after && !input_file_url (opt.input_filename))
+ {
+ DEBUGP (("\
+Removing file due to --delete-after in ftp_loop_internal():\n"));
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), locf);
+ if (unlink (locf))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ }
+ }
+
+ /* Restore the original leave-pendingness. */
+ if (orig_lp)
+ con->cmd |= LEAVE_PENDING;
+ else
+ con->cmd &= ~LEAVE_PENDING;
+
+ if (local_file)
+ *local_file = xstrdup (locf);
+
+ if (warc_tmp != NULL)
+ {
+ fclose (warc_tmp);
+ warc_tmp = NULL;
+ }
+
+ return RETROK;
+ } while (!opt.ntry || (count < opt.ntry));
+
+ if (con->csock != -1 && (con->st & ON_YOUR_OWN))
+ {
+ fd_close (con->csock);
+ con->csock = -1;
+ }
+
+ if (warc_tmp != NULL)
+ fclose (warc_tmp);
+
+ return TRYLIMEXC;
+}
+
+/* Return the directory listing in a reusable format. The directory
+ is specified in u->dir. */
+static uerr_t
+ftp_get_listing (struct url *u, struct url *original_url, ccon *con,
+ struct fileinfo **f)
+{
+ uerr_t err;
+ char *uf; /* url file name */
+ char *lf; /* list file name */
+ char *old_target = con->target;
+
+ con->st &= ~ON_YOUR_OWN;
+ con->cmd |= (DO_LIST | LEAVE_PENDING);
+ con->cmd &= ~DO_RETR;
+
+ /* Find the listing file name. We do it by taking the file name of
+ the URL and replacing the last component with the listing file
+ name. */
+ uf = url_file_name (u, NULL);
+ lf = file_merge (uf, LIST_FILENAME);
+ xfree (uf);
+ DEBUGP ((_("Using %s as listing tmp file.\n"), quote (lf)));
+
+ con->target = xstrdup (lf);
+ xfree (lf);
+ err = ftp_loop_internal (u, original_url, NULL, con, NULL, false);
+ lf = xstrdup (con->target);
+ xfree (con->target);
+ con->target = old_target;
+
+ if (err == RETROK)
+ {
+ *f = ftp_parse_ls (lf, con->rs);
+ if (opt.remove_listing)
+ {
+ if (unlink (lf))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ else
+ logprintf (LOG_VERBOSE, _("Removed %s.\n"), quote (lf));
+ }
+ }
+ else
+ *f = NULL;
+ xfree (lf);
+ con->cmd &= ~DO_LIST;
+ return err;
+}
+
+static uerr_t ftp_retrieve_dirs (struct url *, struct url *,
+ struct fileinfo *, ccon *);
+static uerr_t ftp_retrieve_glob (struct url *, struct url *, ccon *, int);
+static struct fileinfo *delelement (struct fileinfo **, struct fileinfo **);
+
+/* Retrieve a list of files given in struct fileinfo linked list. If
+ a file is a symbolic link, do not retrieve it, but rather try to
+ set up a similar link on the local disk, if the symlinks are
+ supported.
+
+ If opt.recursive is set, after all files have been retrieved,
+ ftp_retrieve_dirs will be called to retrieve the directories. */
+static uerr_t
+ftp_retrieve_list (struct url *u, struct url *original_url,
+ struct fileinfo *f, ccon *con)
+{
+ static int depth = 0;
+ uerr_t err;
+ struct fileinfo *orig;
+ wgint local_size;
+ time_t tml;
+ bool dlthis; /* Download this (file). */
+ const char *actual_target = NULL;
+ bool force_full_retrieve = false;
+
+ /* Increase the depth. */
+ ++depth;
+ if (opt.reclevel != INFINITE_RECURSION && depth > opt.reclevel)
+ {
+ DEBUGP ((_("Recursion depth %d exceeded max. depth %d.\n"),
+ depth, opt.reclevel));
+ --depth;
+ return RECLEVELEXC;
+ }
+
+ assert (f != NULL);
+ orig = f;
+
+ con->st &= ~ON_YOUR_OWN;
+ if (!(con->st & DONE_CWD))
+ con->cmd |= DO_CWD;
+ else
+ con->cmd &= ~DO_CWD;
+ con->cmd |= (DO_RETR | LEAVE_PENDING);
+
+ if (con->csock < 0)
+ con->cmd |= DO_LOGIN;
+ else
+ con->cmd &= ~DO_LOGIN;
+
+ err = RETROK; /* in case it's not used */
+
+ while (f)
+ {
+ char *old_target, *ofile;
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ {
+ --depth;
+ return QUOTEXC;
+ }
+ old_target = con->target;
+
+ ofile = xstrdup (u->file);
+ url_set_file (u, f->name);
+
+ con->target = url_file_name (u, NULL);
+ err = RETROK;
+
+ dlthis = true;
+ if (opt.timestamping && f->type == FT_PLAINFILE)
+ {
+ struct stat st;
+ /* If conversion of HTML files retrieved via FTP is ever implemented,
+ we'll need to stat() <file>.orig here when -K has been specified.
+ I'm not implementing it now since files on an FTP server are much
+ more likely than files on an HTTP server to legitimately have a
+ .orig suffix. */
+ if (!stat (con->target, &st))
+ {
+ bool eq_size;
+ bool cor_val;
+ /* Else, get it from the file. */
+ local_size = st.st_size;
+ tml = st.st_mtime;
+#ifdef WINDOWS
+ /* Modification time granularity is 2 seconds for Windows, so
+ increase local time by 1 second for later comparison. */
+ tml++;
+#endif
+ /* Compare file sizes only for servers that tell us correct
+ values. Assume sizes being equal for servers that lie
+ about file size. */
+ cor_val = (con->rs == ST_UNIX || con->rs == ST_WINNT);
+ eq_size = cor_val ? (local_size == f->size) : true;
+ if (f->tstamp <= tml && eq_size)
+ {
+ /* Remote file is older, file sizes can be compared and
+ are both equal. */
+ logprintf (LOG_VERBOSE, _("\
+Remote file no newer than local file %s -- not retrieving.\n"), quote (con->target));
+ dlthis = false;
+ }
+ else if (f->tstamp > tml)
+ {
+ /* Remote file is newer */
+ force_full_retrieve = true;
+ logprintf (LOG_VERBOSE, _("\
+Remote file is newer than local file %s -- retrieving.\n\n"),
+ quote (con->target));
+ }
+ else
+ {
+ /* Sizes do not match */
+ logprintf (LOG_VERBOSE, _("\
+The sizes do not match (local %s) -- retrieving.\n\n"),
+ number_to_static_string (local_size));
+ }
+ }
+ } /* opt.timestamping && f->type == FT_PLAINFILE */
+ switch (f->type)
+ {
+ case FT_SYMLINK:
+ /* If opt.retr_symlinks is defined, we treat symlinks as
+ if they were normal files. There is currently no way
+ to distinguish whether they might be directories, and
+ follow them. */
+ if (!opt.retr_symlinks)
+ {
+#ifdef HAVE_SYMLINK
+ if (!f->linkto)
+ logputs (LOG_NOTQUIET,
+ _("Invalid name of the symlink, skipping.\n"));
+ else
+ {
+ struct stat st;
+ /* Check whether we already have the correct
+ symbolic link. */
+ int rc = lstat (con->target, &st);
+ if (rc == 0)
+ {
+ size_t len = strlen (f->linkto) + 1;
+ if (S_ISLNK (st.st_mode))
+ {
+ char buf[1024], *link_target;
+ size_t n;
+ bool res;
+
+ if (len < sizeof (buf))
+ link_target = buf;
+ else
+ link_target = xmalloc (len);
+
+ n = readlink (con->target, link_target, len);
+ res = (n == len - 1) && (memcmp (link_target, f->linkto, n) == 0);
+
+ if (link_target != buf)
+ xfree (link_target);
+
+ if (res)
+ {
+ logprintf (LOG_VERBOSE, _("\
+Already have correct symlink %s -> %s\n\n"),
+ quote (con->target),
+ quote (f->linkto));
+ dlthis = false;
+ break;
+ }
+ }
+ }
+ logprintf (LOG_VERBOSE, _("Creating symlink %s -> %s\n"),
+ quote (con->target), quote (f->linkto));
+ /* Unlink before creating symlink! */
+ unlink (con->target);
+ if (symlink (f->linkto, con->target) == -1)
+ logprintf (LOG_NOTQUIET, "symlink: %s\n", strerror (errno));
+ logputs (LOG_VERBOSE, "\n");
+ } /* have f->linkto */
+#else /* not HAVE_SYMLINK */
+ logprintf (LOG_NOTQUIET,
+ _("Symlinks not supported, skipping symlink %s.\n"),
+ quote (con->target));
+#endif /* not HAVE_SYMLINK */
+ }
+ else /* opt.retr_symlinks */
+ {
+ if (dlthis)
+ {
+ err = ftp_loop_internal (u, original_url, f, con, NULL,
+ force_full_retrieve);
+ }
+ } /* opt.retr_symlinks */
+ break;
+ case FT_DIRECTORY:
+ if (!opt.recursive)
+ logprintf (LOG_NOTQUIET, _("Skipping directory %s.\n"),
+ quote (f->name));
+ break;
+ case FT_PLAINFILE:
+ /* Call the retrieve loop. */
+ if (dlthis)
+ {
+ err = ftp_loop_internal (u, original_url, f, con, NULL,
+ force_full_retrieve);
+ }
+ break;
+ case FT_UNKNOWN:
+ default:
+ logprintf (LOG_NOTQUIET, _("%s: unknown/unsupported file type.\n"),
+ quote (f->name));
+ break;
+ } /* switch */
+
+
+ /* 2004-12-15 SMS.
+ * Set permissions _before_ setting the times, as setting the
+ * permissions changes the modified-time, at least on VMS.
+ * Also, use the opt.output_document name here, too, as
+ * appropriate. (Do the test once, and save the result.)
+ */
+
+ set_local_file (&actual_target, con->target);
+
+ /* If downloading a plain file, and the user requested it, then
+ set valid (non-zero) permissions. */
+ if (dlthis && (actual_target != NULL) &&
+ (f->type == FT_PLAINFILE) && opt.preserve_perm)
+ {
+ if (f->perms)
+ {
+ if (chmod (actual_target, f->perms))
+ logprintf (LOG_NOTQUIET,
+ _("Failed to set permissions for %s.\n"),
+ actual_target);
+ }
+ else
+ DEBUGP (("Unrecognized permissions for %s.\n", actual_target));
+ }
+
+ /* Set the time-stamp information to the local file. Symlinks
+ are not to be stamped because it sets the stamp on the
+ original. :( */
+ if (actual_target != NULL)
+ {
+ if (opt.useservertimestamps
+ && !(f->type == FT_SYMLINK && !opt.retr_symlinks)
+ && f->tstamp != -1
+ && dlthis
+ && file_exists_p (con->target, NULL))
+ {
+ touch (actual_target, f->tstamp);
+ }
+ else if (f->tstamp == -1)
+ logprintf (LOG_NOTQUIET, _("%s: corrupt time-stamp.\n"),
+ actual_target);
+ }
+
+ xfree (con->target);
+ con->target = old_target;
+
+ url_set_file (u, ofile);
+ xfree (ofile);
+
+ /* Break on fatals. */
+ if (err == QUOTEXC || err == HOSTERR || err == FWRITEERR
+ || err == WARC_ERR || err == WARC_TMP_FOPENERR
+ || err == WARC_TMP_FWRITEERR)
+ break;
+ con->cmd &= ~ (DO_CWD | DO_LOGIN);
+ f = f->next;
+ }
+
+ /* We do not want to call ftp_retrieve_dirs here */
+ if (opt.recursive &&
+ !(opt.reclevel != INFINITE_RECURSION && depth >= opt.reclevel))
+ err = ftp_retrieve_dirs (u, original_url, orig, con);
+ else if (opt.recursive)
+ DEBUGP ((_("Will not retrieve dirs since depth is %d (max %d).\n"),
+ depth, opt.reclevel));
+ --depth;
+ return err;
+}
+
+/* Retrieve the directories given in a file list. This function works
+ by simply going through the linked list and calling
+ ftp_retrieve_glob on each directory entry. The function knows
+ about excluded directories. */
+static uerr_t
+ftp_retrieve_dirs (struct url *u, struct url *original_url,
+ struct fileinfo *f, ccon *con)
+{
+ char buf[1024];
+ char *container = buf;
+ int container_size = sizeof (buf);
+
+ for (; f; f = f->next)
+ {
+ int size;
+ char *odir, *newdir;
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ break;
+ if (f->type != FT_DIRECTORY)
+ continue;
+
+ /* Allocate u->dir off stack, but reallocate only if a larger
+ string is needed. It's a pity there's no "realloca" for an
+ item on the bottom of the stack. */
+ size = strlen (u->dir) + 1 + strlen (f->name) + 1;
+ if (size > container_size)
+ {
+ if (container == buf)
+ container = xmalloc (size);
+ else
+ container = xrealloc (container, size);
+
+ container_size = size;
+ }
+ newdir = container;
+
+ odir = u->dir;
+ if (*odir == '\0'
+ || (*odir == '/' && *(odir + 1) == '\0'))
+ /* If ODIR is empty or just "/", simply append f->name to
+ ODIR. (In the former case, to preserve u->dir being
+ relative; in the latter case, to avoid double slash.) */
+ sprintf (newdir, "%s%s", odir, f->name);
+ else
+ /* Else, use a separator. */
+ sprintf (newdir, "%s/%s", odir, f->name);
+
+ DEBUGP (("Composing new CWD relative to the initial directory.\n"));
+ DEBUGP ((" odir = '%s'\n f->name = '%s'\n newdir = '%s'\n\n",
+ odir, f->name, newdir));
+ if (!accdir (newdir))
+ {
+ logprintf (LOG_VERBOSE, _("\
+Not descending to %s as it is excluded/not-included.\n"),
+ quote (newdir));
+ continue;
+ }
+
+ con->st &= ~DONE_CWD;
+
+ odir = xstrdup (u->dir); /* because url_set_dir will free
+ u->dir. */
+ url_set_dir (u, newdir);
+ ftp_retrieve_glob (u, original_url, con, GLOB_GETALL);
+ url_set_dir (u, odir);
+ xfree (odir);
+
+ /* Set the time-stamp? */
+ }
+
+ if (container != buf)
+ xfree (container);
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ return QUOTEXC;
+ else
+ return RETROK;
+}
+
+/* Return true if S has a leading '/' or contains '../' */
+static bool
+has_insecure_name_p (const char *s)
+{
+ if (*s == '/')
+ return true;
+
+ if (strstr (s, "../") != 0)
+ return true;
+
+ return false;
+}
+
+/* Test if the file node is invalid. This can occur due to malformed or
+ * maliciously crafted listing files being returned by the server.
+ *
+ * Currently, this function only tests if there are multiple entries in the
+ * listing file by the same name. However this function can be expanded as more
+ * such illegal listing formats are discovered. */
+static bool
+is_invalid_entry (struct fileinfo *f)
+{
+ struct fileinfo *cur = f;
+ char *f_name = f->name;
+
+ /* If the node we're currently checking has a duplicate later, we eliminate
+ * the current node and leave the next one intact. */
+ while (cur->next)
+ {
+ cur = cur->next;
+ if (strcmp (f_name, cur->name) == 0)
+ return true;
+ }
+ return false;
+}
+
+/* A near-top-level function to retrieve the files in a directory.
+ The function calls ftp_get_listing, to get a linked list of files.
+ Then it weeds out the file names that do not match the pattern.
+ ftp_retrieve_list is called with this updated list as an argument.
+
+ If the argument ACTION is GLOB_GETONE, just download the file (but
+ first get the listing, so that the time-stamp is heeded); if it's
+ GLOB_GLOBALL, use globbing; if it's GLOB_GETALL, download the whole
+ directory. */
+static uerr_t
+ftp_retrieve_glob (struct url *u, struct url *original_url,
+ ccon *con, int action)
+{
+ struct fileinfo *f, *start;
+ uerr_t res;
+
+ con->cmd |= LEAVE_PENDING;
+
+ res = ftp_get_listing (u, original_url, con, &start);
+ if (res != RETROK)
+ return res;
+
+ // Set the function used for glob matching.
+ int (*matcher) (const char *, const char *, int)
+ = opt.ignore_case ? fnmatch_nocase : fnmatch;
+
+ // Set the function used to compare strings
+#ifdef __VMS
+ /* 2009-09-09 SMS.
+ * Odd-ball compiler ("HP C V7.3-009 on OpenVMS Alpha V7.3-2")
+ * bug causes spurious %CC-E-BADCONDIT complaint with this
+ * "?:" statement. (Different linkage attributes for strcmp()
+ * and strcasecmp().) Converting to "if" changes the
+ * complaint to %CC-W-PTRMISMATCH on "cmp = strcmp;". Adding
+ * the senseless type cast clears the complaint, and looks
+ * harmless.
+ */
+ int (*cmp) (const char *, const char *)
+ = opt.ignore_case ? strcasecmp : (int (*)())strcmp;
+#else /* def __VMS */
+ int (*cmp) (const char *, const char *)
+ = opt.ignore_case ? strcasecmp : strcmp;
+#endif /* def __VMS [else] */
+
+ f = start;
+ while (f)
+ {
+
+ // Weed out files that do not confirm to the global rules given in
+ // opt.accepts and opt.rejects
+ if ((opt.accepts || opt.rejects) &&
+ f->type != FT_DIRECTORY && !acceptable (f->name))
+ {
+ logprintf (LOG_VERBOSE, _("Rejecting %s.\n"),
+ quote (f->name));
+ f = delelement (&f, &start);
+ continue;
+ }
+
+
+ // Identify and eliminate possibly harmful names or invalid entries.
+ if (has_insecure_name_p (f->name) || is_invalid_entry (f))
+ {
+ logprintf (LOG_VERBOSE, _("Rejecting %s (Invalid Entry).\n"),
+ quote (f->name));
+ f = delelement (&f, &start);
+ continue;
+ }
+
+ if (opt.acceptregex || opt.rejectregex)
+ {
+ // accept_url() takes the full URL.
+ char buf[1024];
+ char *url = buf;
+
+ if ((unsigned) snprintf(buf, sizeof(buf), "%s%s%s",
+ u->url, f->name, f->type == FT_DIRECTORY ? "/" : "")
+ >= sizeof(buf))
+ {
+ url = aprintf("%s%s%s", u->url, f->name, f->type == FT_DIRECTORY ? "/" : "");
+ }
+
+ if (!accept_url (url))
+ {
+ logprintf (LOG_VERBOSE, _ ("%s is excluded/not-included through regex.\n"), url);
+ f = delelement (&f, &start);
+ if (url != buf)
+ xfree(url);
+ continue;
+ }
+
+ if (url != buf)
+ xfree(url);
+ }
+
+ /* Now weed out the files that do not match our globbing pattern.
+ If we are dealing with a globbing pattern, that is. */
+ if (*u->file)
+ {
+ if (action == GLOB_GLOBALL)
+ {
+ int matchres = matcher (u->file, f->name, 0);
+ if (matchres == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("Error matching %s against %s: %s\n"),
+ u->file, quotearg_style (escape_quoting_style, f->name),
+ strerror (errno));
+ freefileinfo (start);
+ return RETRBADPATTERN;
+ }
+ if (matchres == FNM_NOMATCH)
+ {
+ f = delelement (&f, &start); /* delete the element from the list */
+ continue;
+ }
+ }
+ else if (action == GLOB_GETONE)
+ {
+ if (0 != cmp(u->file, f->name))
+ {
+ f = delelement (&f, &start);
+ continue;
+ }
+ }
+ }
+ f = f->next;
+ }
+
+ /*
+ * Now that preprocessing of the file listing is over, let's try to download
+ * all the remaining files in our listing.
+ */
+ if (start)
+ {
+ /* Just get everything. */
+ res = ftp_retrieve_list (u, original_url, start, con);
+ }
+ else
+ {
+ if (action == GLOB_GLOBALL)
+ {
+ /* No luck. */
+ /* #### This message SUCKS. We should see what was the
+ reason that nothing was retrieved. */
+ logprintf (LOG_VERBOSE, _("No matches on pattern %s.\n"),
+ quote (u->file));
+ }
+ else if (action == GLOB_GETONE) /* GLOB_GETONE or GLOB_GETALL */
+ {
+ /* Let's try retrieving it anyway. */
+ con->st |= ON_YOUR_OWN;
+ res = ftp_loop_internal (u, original_url, NULL, con, NULL, false);
+ return res;
+ }
+
+ /* If action == GLOB_GETALL, and the file list is empty, there's
+ no point in trying to download anything or in complaining about
+ it. (An empty directory should not cause complaints.)
+ */
+ }
+ freefileinfo (start);
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ return QUOTEXC;
+ else
+ return res;
+}
+
+/* The wrapper that calls an appropriate routine according to contents
+ of URL. Inherently, its capabilities are limited on what can be
+ encoded into a URL. */
+uerr_t
+ftp_loop (struct url *u, struct url *original_url, char **local_file, int *dt,
+ struct url *proxy, bool recursive, bool glob)
+{
+ ccon con; /* FTP connection */
+ uerr_t res;
+
+ *dt = 0;
+
+ xzero (con);
+
+ con.csock = -1;
+ con.st = ON_YOUR_OWN;
+ con.rs = ST_UNIX;
+ con.id = NULL;
+ con.proxy = proxy;
+
+ /* If the file name is empty, the user probably wants a directory
+ index. We'll provide one, properly HTML-ized. Unless
+ opt.htmlify is 0, of course. :-) */
+ if (!*u->file && !recursive)
+ {
+ struct fileinfo *f;
+ res = ftp_get_listing (u, original_url, &con, &f);
+
+ if (res == RETROK)
+ {
+ if (opt.htmlify && !opt.spider)
+ {
+ struct url *url_file = opt.trustservernames ? u : original_url;
+ char *filename = (opt.output_document
+ ? xstrdup (opt.output_document)
+ : (con.target ? xstrdup (con.target)
+ : url_file_name (url_file, NULL)));
+ res = ftp_index (filename, u, f);
+ if (res == FTPOK && opt.verbose)
+ {
+ if (!opt.output_document)
+ {
+ struct stat st;
+ wgint sz;
+ if (stat (filename, &st) == 0)
+ sz = st.st_size;
+ else
+ sz = -1;
+ logprintf (LOG_NOTQUIET,
+ _("Wrote HTML-ized index to %s [%s].\n"),
+ quote (filename), number_to_static_string (sz));
+ }
+ else
+ logprintf (LOG_NOTQUIET,
+ _("Wrote HTML-ized index to %s.\n"),
+ quote (filename));
+ }
+ xfree (filename);
+ }
+ freefileinfo (f);
+ }
+ }
+ else
+ {
+ bool ispattern = false;
+ if (glob)
+ {
+ /* Treat the URL as a pattern if the file name part of the
+ URL path contains wildcards. (Don't check for u->file
+ because it is unescaped and therefore doesn't leave users
+ the option to escape literal '*' as %2A.) */
+ char *file_part = strrchr (u->path, '/');
+ if (!file_part)
+ file_part = u->path;
+ ispattern = has_wildcards_p (file_part);
+ }
+ if (ispattern || recursive || opt.timestamping || opt.preserve_perm)
+ {
+ /* ftp_retrieve_glob is a catch-all function that gets called
+ if we need globbing, time-stamping, recursion or preserve
+ permissions. Its third argument is just what we really need. */
+ res = ftp_retrieve_glob (u, original_url, &con,
+ ispattern ? GLOB_GLOBALL : GLOB_GETONE);
+ }
+ else
+ {
+ res = ftp_loop_internal (u, original_url, NULL, &con, local_file, false);
+ }
+ }
+ if (res == FTPOK)
+ res = RETROK;
+ if (res == RETROK)
+ *dt |= RETROKF;
+ /* If a connection was left, quench it. */
+ if (con.csock != -1)
+ fd_close (con.csock);
+ xfree (con.id);
+ xfree (con.target);
+ return res;
+}
+
+/* Delete an element from the fileinfo linked list. Returns the
+ address of the next element, or NULL if the list is exhausted. It
+ can modify the start of the list. */
+static struct fileinfo *
+delelement (struct fileinfo **f, struct fileinfo **start)
+{
+ struct fileinfo *prev = (*f)->prev;
+ struct fileinfo *next = (*f)->next;
+
+ xfree ((*f)->name);
+ xfree ((*f)->linkto);
+ xfree (*f);
+ *f = NULL;
+
+ if (next)
+ next->prev = prev;
+ if (prev)
+ prev->next = next;
+ else
+ *start = next;
+ return next;
+}
+
+/* Free the fileinfo linked list of files. */
+void
+freefileinfo (struct fileinfo *f)
+{
+ while (f)
+ {
+ struct fileinfo *next = f->next;
+ xfree (f->name);
+ if (f->linkto)
+ xfree (f->linkto);
+ xfree (f);
+ f = next;
+ }
+}
diff --git a/src/ftp.h b/src/ftp.h
new file mode 100644
index 0000000..9958853
--- /dev/null
+++ b/src/ftp.h
@@ -0,0 +1,184 @@
+/* Declarations for FTP support.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef FTP_H
+#define FTP_H
+
+#include <stdio.h>
+#include <stdbool.h>
+
+#include "host.h"
+#include "url.h"
+
+/* System types. */
+enum stype
+{
+ ST_UNIX,
+ ST_VMS,
+ ST_WINNT,
+ ST_MACOS,
+ ST_OS400,
+ ST_OTHER
+};
+
+/* Extensions of the ST_UNIX */
+enum ustype
+{
+ UST_TYPE_L8,
+ UST_MULTINET,
+ UST_OTHER
+};
+
+#ifdef HAVE_SSL
+/* Data channel protection levels (to be used with PBSZ) */
+enum prot_level
+{
+ PROT_CLEAR = 'C',
+ PROT_SAFE = 'S',
+ PROT_CONFIDENTIAL = 'E',
+ PROT_PRIVATE = 'P'
+};
+#endif
+
+uerr_t ftp_response (int, char **);
+uerr_t ftp_greeting (int);
+uerr_t ftp_login (int, const char *, const char *);
+uerr_t ftp_port (int, int *);
+uerr_t ftp_pasv (int, ip_address *, int *);
+#ifdef HAVE_SSL
+uerr_t ftp_auth (int, enum url_scheme);
+uerr_t ftp_pbsz (int, int);
+uerr_t ftp_prot (int, enum prot_level);
+#endif
+#ifdef ENABLE_IPV6
+uerr_t ftp_lprt (int, int *);
+uerr_t ftp_lpsv (int, ip_address *, int *);
+uerr_t ftp_eprt (int, int *);
+uerr_t ftp_epsv (int, ip_address *, int *);
+#endif
+uerr_t ftp_type (int, int);
+uerr_t ftp_cwd (int, const char *);
+uerr_t ftp_retr (int, const char *);
+uerr_t ftp_rest (int, wgint);
+uerr_t ftp_list (int, const char *, bool, bool, bool *);
+uerr_t ftp_syst (int, enum stype *, enum ustype *);
+uerr_t ftp_pwd (int, char **);
+uerr_t ftp_size (int, const char *, wgint *);
+
+#ifdef ENABLE_OPIE
+const char *skey_response (int, const char *, const char *);
+#endif
+
+struct url;
+
+/* File types. */
+enum ftype
+{
+ FT_PLAINFILE,
+ FT_DIRECTORY,
+ FT_SYMLINK,
+ FT_UNKNOWN
+};
+
+
+/* Globbing (used by ftp_retrieve_glob). */
+enum
+{
+ GLOB_GLOBALL, GLOB_GETALL, GLOB_GETONE
+};
+
+/* Used by to test if time parsed includes hours and minutes. */
+enum parsetype
+{
+ TT_HOUR_MIN, TT_DAY
+};
+
+
+/* Information about one filename in a linked list. */
+struct fileinfo
+{
+ enum ftype type; /* file type */
+ char *name; /* file name */
+ wgint size; /* file size */
+ long tstamp; /* time-stamp */
+ enum parsetype ptype; /* time parsing */
+ int perms; /* file permissions */
+ char *linkto; /* link to which file points */
+ struct fileinfo *prev; /* previous... */
+ struct fileinfo *next; /* ...and next structure. */
+};
+
+/* Commands for FTP functions. */
+enum wget_ftp_command
+{
+ DO_LOGIN = 0x0001, /* Connect and login to the server. */
+ DO_CWD = 0x0002, /* Change current directory. */
+ DO_RETR = 0x0004, /* Retrieve the file. */
+ DO_LIST = 0x0008, /* Retrieve the directory list. */
+ LEAVE_PENDING = 0x0010 /* Do not close the socket. */
+};
+
+enum wget_ftp_fstatus
+{
+ NOTHING = 0x0000, /* Nothing done yet. */
+ ON_YOUR_OWN = 0x0001, /* The ftp_loop_internal sets the
+ defaults. */
+ DONE_CWD = 0x0002, /* The current working directory is
+ correct. */
+
+ /* 2013-10-17 Andrea Urbani (matfanjol)
+ For more information about the following entries, please,
+ look at ftp.c, function getftp, text "__LIST_A_EXPLANATION__". */
+ AVOID_LIST_A = 0x0004, /* It tells us if during this
+ session we have to avoid the use
+ of "LIST -a".*/
+ AVOID_LIST = 0x0008, /* It tells us if during this
+ session we have to avoid to use
+ "LIST". */
+ LIST_AFTER_LIST_A_CHECK_DONE = 0x0010,
+ /* It tells us if we have already
+ checked "LIST" after the first
+ "LIST -a" to handle the case of
+ file/folders named "-a". */
+ DATA_CHANNEL_SECURITY = 0x0020 /* Establish a secure data channel */
+};
+
+struct fileinfo *ftp_parse_ls (const char *, const enum stype);
+struct fileinfo *ftp_parse_ls_fp (FILE *, const enum stype);
+void freefileinfo(struct fileinfo *);
+uerr_t ftp_loop (struct url *, struct url *, char **, int *, struct url *,
+ bool, bool);
+
+uerr_t ftp_index (const char *, struct url *, struct fileinfo *);
+
+char ftp_process_type (const char *);
+
+
+#endif /* FTP_H */
diff --git a/src/gnutls.c b/src/gnutls.c
new file mode 100644
index 0000000..5706dbb
--- /dev/null
+++ b/src/gnutls.c
@@ -0,0 +1,1116 @@
+/* SSL support via GnuTLS library.
+ Copyright (C) 2005-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <xalloc.h>
+
+#include <gnutls/abstract.h>
+#include <gnutls/gnutls.h>
+#include <gnutls/x509.h>
+#include <sys/ioctl.h>
+
+#include "utils.h"
+#include "connect.h"
+#include "url.h"
+#include "ptimer.h"
+#include "hash.h"
+#include "ssl.h"
+
+#include <fcntl.h>
+
+#ifdef WIN32
+# include "w32sock.h"
+#endif
+
+#include "host.h"
+
+struct st_read_timer
+{
+ double timeout;
+ double next_timeout;
+ struct ptimer *timer;
+ int timed_out;
+};
+
+static int
+_do_handshake (gnutls_session_t session, int fd, struct st_read_timer *timeout);
+
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+static int
+_do_reauth (gnutls_session_t session, int fd, struct st_read_timer *timeout);
+#endif
+
+static int
+key_type_to_gnutls_type (enum keyfile_type type)
+{
+ switch (type)
+ {
+ case keyfile_pem:
+ return GNUTLS_X509_FMT_PEM;
+ case keyfile_asn1:
+ return GNUTLS_X509_FMT_DER;
+ default:
+ abort ();
+ }
+}
+
+/* Note: some of the functions private to this file have names that
+ begin with "wgnutls_" (e.g. wgnutls_read) so that they wouldn't be
+ confused with actual gnutls functions -- such as the gnutls_read
+ preprocessor macro. */
+
+static gnutls_certificate_credentials_t credentials;
+bool
+ssl_init (void)
+{
+ /* Becomes true if GnuTLS is initialized. */
+ static bool ssl_initialized = false;
+ const char *ca_directory;
+ DIR *dir;
+ int ncerts = -1;
+ int rc;
+
+ /* GnuTLS should be initialized only once. */
+ if (ssl_initialized)
+ return true;
+
+ gnutls_global_init ();
+ gnutls_certificate_allocate_credentials (&credentials);
+ gnutls_certificate_set_verify_flags (credentials,
+ GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT);
+
+#if GNUTLS_VERSION_MAJOR >= 3
+ if (!opt.ca_directory)
+ ncerts = gnutls_certificate_set_x509_system_trust (credentials);
+#endif
+
+ /* If GnuTLS version is too old or CA loading failed, fallback to old behaviour.
+ * Also use old behaviour if the CA directory is user-provided. */
+ if (ncerts <= 0)
+ {
+ ncerts = 0;
+
+ ca_directory = opt.ca_directory ? opt.ca_directory : "/etc/ssl/certs";
+
+ if ((dir = opendir (ca_directory)) == NULL)
+ {
+ if (opt.ca_directory && *opt.ca_directory)
+ logprintf (LOG_NOTQUIET, _("ERROR: Cannot open directory %s.\n"),
+ opt.ca_directory);
+ }
+ else
+ {
+ struct hash_table *inode_map = hash_table_new (196, NULL, NULL);
+ struct dirent *dent;
+
+ while ((dent = readdir (dir)) != NULL)
+ {
+ struct stat st;
+ char ca_file[1024];
+
+ if (((unsigned) snprintf (ca_file, sizeof (ca_file), "%s/%s", ca_directory, dent->d_name)) >= sizeof (ca_file))
+ continue; // overflow
+
+ if (stat (ca_file, &st) != 0)
+ continue;
+
+ if (! S_ISREG (st.st_mode))
+ continue;
+
+ /* avoid loading the same file twice by checking the inode. */
+ if (hash_table_contains (inode_map, (void *)(intptr_t) st.st_ino))
+ continue;
+
+ hash_table_put (inode_map, (void *)(intptr_t) st.st_ino, NULL);
+ if ((rc = gnutls_certificate_set_x509_trust_file (credentials, ca_file,
+ GNUTLS_X509_FMT_PEM)) <= 0)
+ DEBUGP (("WARNING: Failed to open cert %s: (%d).\n", ca_file, rc));
+ else
+ ncerts += rc;
+ }
+
+ hash_table_destroy (inode_map);
+ closedir (dir);
+ }
+ }
+
+ if (opt.ca_cert)
+ {
+ if (ncerts < 0)
+ ncerts = 0;
+
+ if ((rc = gnutls_certificate_set_x509_trust_file (credentials, opt.ca_cert,
+ GNUTLS_X509_FMT_PEM)) <= 0)
+ logprintf (LOG_NOTQUIET, _("ERROR: Failed to open cert %s: (%d).\n"),
+ opt.ca_cert, rc);
+ else
+ {
+ ncerts += rc;
+ logprintf (LOG_VERBOSE, _("Loaded CA certificate '%s'\n"), opt.ca_cert);
+ }
+ }
+
+ if (opt.crl_file)
+ {
+ if ((rc = gnutls_certificate_set_x509_crl_file (credentials, opt.crl_file, GNUTLS_X509_FMT_PEM)) <= 0)
+ {
+ logprintf (LOG_NOTQUIET, _("ERROR: Failed to load CRL file '%s': (%d)\n"), opt.crl_file, rc);
+ return false;
+ }
+
+ logprintf (LOG_VERBOSE, _("Loaded CRL file '%s'\n"), opt.crl_file);
+ }
+
+ DEBUGP (("Certificates loaded: %d\n", ncerts));
+
+ /* Use the private key from the cert file unless otherwise specified. */
+ if (opt.cert_file && !opt.private_key)
+ {
+ opt.private_key = xstrdup (opt.cert_file);
+ opt.private_key_type = opt.cert_type;
+ }
+ /* Use the cert from the private key file unless otherwise specified. */
+ if (!opt.cert_file && opt.private_key)
+ {
+ opt.cert_file = xstrdup (opt.private_key);
+ opt.cert_type = opt.private_key_type;
+ }
+
+ if (opt.cert_file && opt.private_key)
+ {
+ int type;
+ if (opt.private_key_type != opt.cert_type)
+ {
+ /* GnuTLS can't handle this */
+ logprintf (LOG_NOTQUIET, _("ERROR: GnuTLS requires the key and the \
+cert to be of the same type.\n"));
+ }
+
+ type = key_type_to_gnutls_type (opt.private_key_type);
+
+ gnutls_certificate_set_x509_key_file (credentials, opt.cert_file,
+ opt.private_key,
+ type);
+ }
+
+ ssl_initialized = true;
+
+ return true;
+}
+
+void
+ssl_cleanup (void)
+{
+ if (credentials)
+ gnutls_certificate_free_credentials(credentials);
+
+ gnutls_global_deinit();
+}
+
+struct wgnutls_transport_context
+{
+ gnutls_session_t session; /* GnuTLS session handle */
+ gnutls_datum_t *session_data;
+ int last_error; /* last error returned by read/write/... */
+
+ /* Since GnuTLS doesn't support the equivalent to recv(...,
+ MSG_PEEK) or SSL_peek(), we have to do it ourselves. Peeked data
+ is stored to PEEKBUF, and wgnutls_read checks that buffer before
+ actually reading. */
+ char peekbuf[512];
+ int peeklen;
+};
+
+static int
+wgnutls_read_timeout (int fd, char *buf, int bufsize, void *arg, double timeout)
+{
+#ifdef F_GETFL
+ int flags = 0;
+#endif
+ struct wgnutls_transport_context *ctx = arg;
+ int ret = gnutls_record_check_pending (ctx->session);
+ struct st_read_timer read_timer = {(timeout == -1 ? opt.read_timeout : timeout), 0, NULL, 0};
+
+ if (ret)
+ return gnutls_record_recv (ctx->session, buf, MIN (ret, bufsize));
+
+ if (read_timer.timeout)
+ {
+#ifdef F_GETFL
+ flags = fcntl (fd, F_GETFL, 0);
+ if (flags < 0)
+ return flags;
+ if (fcntl (fd, F_SETFL, flags | O_NONBLOCK))
+ return -1;
+#else
+ /* XXX: Assume it was blocking before. */
+ const int one = 1;
+ if (ioctl (fd, FIONBIO, &one) < 0)
+ return -1;
+#endif
+
+ read_timer.timer = ptimer_new ();
+ if (read_timer.timer == NULL)
+ {
+ ret = -1;
+ goto timer_err;
+ }
+ read_timer.next_timeout = read_timer.timeout;
+ }
+
+ ret = ctx->last_error;
+ do
+ {
+ if (ret == GNUTLS_E_REHANDSHAKE)
+ {
+ int err;
+ DEBUGP (("GnuTLS: *** REHANDSHAKE while reading\n"));
+ if ((err = _do_handshake (ctx->session, fd, &read_timer)) != 0)
+ {
+ ret = err;
+ break;
+ }
+ }
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+ else if (ret == GNUTLS_E_REAUTH_REQUEST)
+ {
+ int err;
+ DEBUGP (("GnuTLS: *** re-authentication while reading\n"));
+ if ((err = _do_reauth (ctx->session, fd, &read_timer)) != 0)
+ {
+ ret = err;
+ break;
+ }
+ }
+#endif
+ do
+ {
+ ret = gnutls_record_recv (ctx->session, buf, bufsize);
+ if (ret == GNUTLS_E_AGAIN && read_timer.timer)
+ {
+ int err = select_fd_nb (fd, read_timer.next_timeout, WAIT_FOR_READ);
+ if (err <= 0)
+ {
+ if (err == 0)
+ read_timer.timed_out = 1;
+ goto break_all;
+ }
+ if ( (read_timer.next_timeout = read_timer.timeout - ptimer_measure (read_timer.timer)) <= 0 )
+ {
+ read_timer.timed_out = 1;
+ goto break_all;
+ }
+ }
+ }
+ while (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED);
+ }
+ while (ret == GNUTLS_E_REHANDSHAKE
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+ || ret == GNUTLS_E_REAUTH_REQUEST
+#endif
+ );
+
+break_all:
+ if (read_timer.timer)
+ {
+ ptimer_destroy (read_timer.timer);
+timer_err: ;
+#ifdef F_GETFL
+ if (fcntl (fd, F_SETFL, flags) < 0)
+ return -1;
+#else
+ {
+ const int zero = 0;
+ if (ioctl (fd, FIONBIO, &zero) < 0)
+ return -1;
+ }
+#endif
+ if (read_timer.timed_out)
+ errno = ETIMEDOUT;
+ }
+
+ return ret;
+}
+
+static int
+wgnutls_read (int fd, char *buf, int bufsize, void *arg, double timeout)
+{
+ int ret;
+ struct wgnutls_transport_context *ctx = arg;
+
+ if (ctx->peeklen)
+ {
+ /* If we have any peek data, simply return that. */
+ int copysize = MIN (bufsize, ctx->peeklen);
+ memcpy (buf, ctx->peekbuf, copysize);
+ ctx->peeklen -= copysize;
+ if (ctx->peeklen != 0)
+ memmove (ctx->peekbuf, ctx->peekbuf + copysize, ctx->peeklen);
+
+ return copysize;
+ }
+
+ ret = wgnutls_read_timeout (fd, buf, bufsize, arg, timeout);
+ ctx->last_error = ret;
+ return ret;
+}
+
+static int
+wgnutls_write (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
+{
+ struct wgnutls_transport_context *ctx = arg;
+ int ret = ctx->last_error;
+
+ /* it should never happen,
+ placed here only for debug msg. */
+ if (ret == GNUTLS_E_REHANDSHAKE)
+ {
+ DEBUGP (("GnuTLS: *** REHANDSHAKE while writing\n"));
+ if ((ret = _do_handshake (ctx->session, fd, NULL)) != 0)
+ goto ext;
+ }
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+ else if (ret == GNUTLS_E_REAUTH_REQUEST)
+ {
+ DEBUGP (("GnuTLS: *** re-authentication while writing\n"));
+ if ((ret = _do_reauth (ctx->session, fd, NULL)) != 0)
+ goto ext;
+ }
+#endif
+
+ do
+ ret = gnutls_record_send (ctx->session, buf, bufsize);
+ while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
+ext:
+ ctx->last_error = ret;
+ return ret;
+}
+
+static int
+wgnutls_poll (int fd, double timeout, int wait_for, void *arg)
+{
+ struct wgnutls_transport_context *ctx = arg;
+
+ if ((wait_for & WAIT_FOR_READ)
+ && (ctx->peeklen || gnutls_record_check_pending (ctx->session)))
+ return 1;
+
+ if (timeout == -1)
+ timeout = opt.read_timeout;
+ return select_fd (fd, timeout, wait_for);
+}
+
+static int
+wgnutls_peek (int fd, char *buf, int bufsize, void *arg, double timeout)
+{
+ int read = 0;
+ struct wgnutls_transport_context *ctx = arg;
+ int offset = MIN (bufsize, ctx->peeklen);
+
+ if (ctx->peeklen)
+ {
+ memcpy (buf, ctx->peekbuf, offset);
+ return offset;
+ }
+
+ if (bufsize > (int) sizeof ctx->peekbuf)
+ bufsize = sizeof ctx->peekbuf;
+
+ if (bufsize > offset)
+ { /* let wgnutls_read_timeout() take care about timeout */
+ /*if (timeout && gnutls_record_check_pending (ctx->session) == 0
+ && select_fd (fd, 0.0, WAIT_FOR_READ) <= 0)
+ read = 0;
+ else*/
+ read = wgnutls_read_timeout (fd, buf + offset, bufsize - offset,
+ ctx, timeout);
+ ctx->last_error = read;
+ if (read < 0)
+ {
+ if (offset)
+ read = 0;
+ else
+ return read;
+ }
+
+ if (read > 0)
+ {
+ memcpy (ctx->peekbuf + offset, buf + offset,
+ read);
+ ctx->peeklen += read;
+ }
+ }
+
+ return offset + read;
+}
+
+static const char *
+wgnutls_errstr (int fd _GL_UNUSED, void *arg)
+{
+ struct wgnutls_transport_context *ctx = arg;
+
+ if (ctx->last_error > 0
+ || ((ctx->last_error == GNUTLS_E_AGAIN
+ || ctx->last_error == GNUTLS_E_REHANDSHAKE
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+ || ctx->last_error == GNUTLS_E_REAUTH_REQUEST
+#endif
+ ) && errno == ETIMEDOUT))
+ return NULL;
+
+ return gnutls_strerror (ctx->last_error);
+}
+
+static void
+wgnutls_close (int fd, void *arg)
+{
+ struct wgnutls_transport_context *ctx = arg;
+ /*gnutls_bye (ctx->session, GNUTLS_SHUT_RDWR);*/
+ if (ctx->session_data)
+ {
+ gnutls_free (ctx->session_data->data);
+ gnutls_free (ctx->session_data);
+ }
+ gnutls_deinit (ctx->session);
+ xfree (ctx);
+ close (fd);
+}
+
+/* gnutls_transport is the singleton that describes the SSL transport
+ methods provided by this file. */
+
+static struct transport_implementation wgnutls_transport =
+{
+ wgnutls_read, wgnutls_write, wgnutls_poll,
+ wgnutls_peek, wgnutls_errstr, wgnutls_close
+};
+
+static int
+_do_handshake (gnutls_session_t session, int fd, struct st_read_timer *read_timer)
+{
+#ifdef F_GETFL
+ int flags = 0;
+#endif
+ int err;
+ double next_timeout = (read_timer ? read_timer->next_timeout : opt.read_timeout);
+
+ /* if (read_timer != NULL) - fd is already non blocking */
+ if (!read_timer && next_timeout)
+ {
+#ifdef F_GETFL
+ flags = fcntl (fd, F_GETFL, 0);
+ if (flags < 0)
+ return flags;
+ if (fcntl (fd, F_SETFL, flags | O_NONBLOCK))
+ return -1;
+#else
+ /* XXX: Assume it was blocking before. */
+ const int one = 1;
+ if (ioctl (fd, FIONBIO, &one) < 0)
+ return -1;
+#endif
+ }
+
+ /* We don't stop the handshake process for non-fatal errors */
+ do
+ {
+ err = gnutls_handshake (session);
+
+ if (err == GNUTLS_E_AGAIN && next_timeout)
+ {
+ int sel;
+ if (gnutls_record_get_direction (session))
+ {
+ /* wait for writeability */
+ sel = WAIT_FOR_WRITE;
+ }
+ else
+ {
+ /* wait for readability */
+ sel = WAIT_FOR_READ;
+ }
+ sel = select_fd_nb (fd, next_timeout, sel);
+
+ if (sel <= 0)
+ {
+ if (sel == 0)
+ {
+ if (read_timer)
+ goto read_timedout;
+ else
+ {
+ errno = ETIMEDOUT;
+ err = -1;
+ }
+ }
+ break;
+ }
+ if (read_timer)
+ {
+ if ( (read_timer->next_timeout = read_timer->timeout - ptimer_measure (read_timer->timer)) <= 0 )
+ {
+read_timedout: /* return GNUTLS_E_REHANDSHAKE for gnutls_read */
+ err = GNUTLS_E_REHANDSHAKE;
+ read_timer->timed_out = 1;
+ break;
+ }
+ next_timeout = read_timer->next_timeout;
+ }
+ }
+ else if (err < 0)
+ {
+ logprintf (LOG_NOTQUIET, "GnuTLS: %s\n", gnutls_strerror (err));
+ if (err == GNUTLS_E_WARNING_ALERT_RECEIVED ||
+ err == GNUTLS_E_FATAL_ALERT_RECEIVED)
+ {
+ gnutls_alert_description_t alert = gnutls_alert_get (session);
+ const char *str = gnutls_alert_get_name (alert);
+ logprintf (LOG_NOTQUIET, "GnuTLS: received alert [%u]: %s\n",
+ alert, str ? str : "(unknown)");
+ }
+ }
+ }
+ while (err && gnutls_error_is_fatal (err) == 0);
+
+ if (!read_timer && next_timeout)
+ {
+#ifdef F_GETFL
+ if (fcntl (fd, F_SETFL, flags) < 0)
+ return -1;
+#else
+ const int zero = 0;
+ if (ioctl (fd, FIONBIO, &zero) < 0)
+ return -1;
+#endif
+ }
+
+ return err;
+}
+
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+static int
+_do_reauth (gnutls_session_t session, int fd, struct st_read_timer *read_timer)
+{
+#ifdef F_GETFL
+ int flags = 0;
+#endif
+ int err;
+ double next_timeout = (read_timer ? read_timer->next_timeout : opt.read_timeout);
+
+ /* if (read_timer != NULL) - fd is already non blocking */
+ if (!read_timer && next_timeout)
+ {
+#ifdef F_GETFL
+ flags = fcntl (fd, F_GETFL, 0);
+ if (flags < 0)
+ return flags;
+ if (fcntl (fd, F_SETFL, flags | O_NONBLOCK))
+ return -1;
+#else
+ /* XXX: Assume it was blocking before. */
+ const int one = 1;
+ if (ioctl (fd, FIONBIO, &one) < 0)
+ return -1;
+#endif
+ }
+
+ /* We don't stop the handshake process for non-fatal errors */
+ do
+ {
+ err = gnutls_reauth (session, 0);
+
+ if (err == GNUTLS_E_AGAIN && next_timeout)
+ {
+ int sel;
+ if (gnutls_record_get_direction (session))
+ {
+ /* wait for writeability */
+ sel = WAIT_FOR_WRITE;
+ }
+ else
+ {
+ /* wait for readability */
+ sel = WAIT_FOR_READ;
+ }
+ sel = select_fd_nb (fd, next_timeout, sel);
+
+ if (sel <= 0)
+ {
+ if (sel == 0)
+ {
+ if (read_timer)
+ goto read_timedout;
+ else
+ {
+ errno = ETIMEDOUT;
+ err = -1;
+ }
+ }
+ break;
+ }
+ if (read_timer)
+ {
+ if ( (read_timer->next_timeout = read_timer->timeout - ptimer_measure (read_timer->timer)) <= 0 )
+ {
+read_timedout: /* return GNUTLS_E_REAUTH_REQUEST for gnutls_read */
+ err = GNUTLS_E_REAUTH_REQUEST;
+ read_timer->timed_out = 1;
+ break;
+ }
+ next_timeout = read_timer->next_timeout;
+ }
+ }
+ else if (err < 0)
+ {
+ logprintf (LOG_NOTQUIET, "GnuTLS: %s\n", gnutls_strerror (err));
+ }
+ }
+ while (err && gnutls_error_is_fatal (err) == 0);
+
+ if (!read_timer && next_timeout)
+ {
+#ifdef F_GETFL
+ if (fcntl (fd, F_SETFL, flags) < 0)
+ return -1;
+#else
+ const int zero = 0;
+ if (ioctl (fd, FIONBIO, &zero) < 0)
+ return -1;
+#endif
+ }
+
+ return err;
+}
+#endif
+
+static const char *
+_sni_hostname(const char *hostname)
+{
+ size_t len = strlen(hostname);
+
+ char *sni_hostname = xmemdup(hostname, len + 1);
+
+ /* Remove trailing dot(s) to fix #47408.
+ * Regarding RFC 6066 (SNI): The hostname is represented as a byte
+ * string using ASCII encoding without a trailing dot. */
+ while (len && sni_hostname[--len] == '.')
+ sni_hostname[len] = 0;
+
+ return sni_hostname;
+}
+
+static int
+set_prio_default (gnutls_session_t session)
+{
+ int err = -1;
+
+#if HAVE_GNUTLS_PRIORITY_SET_DIRECT
+ switch (opt.secure_protocol)
+ {
+ case secure_protocol_auto:
+ err = gnutls_set_default_priority (session);
+ gnutls_session_enable_compatibility_mode(session);
+ break;
+
+ case secure_protocol_sslv2:
+ case secure_protocol_sslv3:
+ err = gnutls_priority_set_direct (session, "NORMAL:-VERS-TLS-ALL:+VERS-SSL3.0", NULL);
+ break;
+
+ case secure_protocol_tlsv1:
+ err = gnutls_priority_set_direct (session, "NORMAL:-VERS-SSL3.0", NULL);
+ break;
+
+ case secure_protocol_tlsv1_1:
+ err = gnutls_priority_set_direct (session, "NORMAL:-VERS-SSL3.0:-VERS-TLS1.0", NULL);
+ break;
+
+ case secure_protocol_tlsv1_2:
+ err = gnutls_priority_set_direct (session, "NORMAL:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1", NULL);
+ break;
+
+ case secure_protocol_tlsv1_3:
+#if GNUTLS_VERSION_NUMBER >= 0x030603
+ err = gnutls_priority_set_direct (session, "NORMAL:-VERS-SSL3.0:+VERS-TLS1.3:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.2", NULL);
+ break;
+#else
+ logprintf (LOG_NOTQUIET, _("Your GnuTLS version is too old to support TLS 1.3\n"));
+ return -1;
+#endif
+
+ case secure_protocol_pfs:
+ err = gnutls_priority_set_direct (session, "PFS:-VERS-SSL3.0", NULL);
+ if (err != GNUTLS_E_SUCCESS)
+ /* fallback if PFS is not available */
+ err = gnutls_priority_set_direct (session, "NORMAL:-RSA:-VERS-SSL3.0", NULL);
+ break;
+
+ default:
+ logprintf (LOG_NOTQUIET, _("GnuTLS: unimplemented 'secure-protocol' option value %u\n"),
+ (unsigned) opt.secure_protocol);
+ logprintf (LOG_NOTQUIET, _("Please report this issue to bug-wget@gnu.org\n"));
+ abort ();
+ }
+#else
+ int allowed_protocols[4] = {0, 0, 0, 0};
+ switch (opt.secure_protocol)
+ {
+ case secure_protocol_auto:
+ err = gnutls_set_default_priority (session);
+ break;
+
+ case secure_protocol_sslv2:
+ case secure_protocol_sslv3:
+ allowed_protocols[0] = GNUTLS_SSL3;
+ err = gnutls_protocol_set_priority (session, allowed_protocols);
+ break;
+
+ case secure_protocol_tlsv1:
+ allowed_protocols[0] = GNUTLS_TLS1_0;
+ allowed_protocols[1] = GNUTLS_TLS1_1;
+ allowed_protocols[2] = GNUTLS_TLS1_2;
+#if GNUTLS_VERSION_NUMBER >= 0x030603
+ allowed_protocols[3] = GNUTLS_TLS1_3;
+#endif
+ err = gnutls_protocol_set_priority (session, allowed_protocols);
+ break;
+
+ case secure_protocol_tlsv1_1:
+ allowed_protocols[0] = GNUTLS_TLS1_1;
+ allowed_protocols[1] = GNUTLS_TLS1_2;
+#if GNUTLS_VERSION_NUMBER >= 0x030603
+ allowed_protocols[2] = GNUTLS_TLS1_3;
+#endif
+ err = gnutls_protocol_set_priority (session, allowed_protocols);
+ break;
+
+ case secure_protocol_tlsv1_2:
+ allowed_protocols[0] = GNUTLS_TLS1_2;
+#if GNUTLS_VERSION_NUMBER >= 0x030603
+ allowed_protocols[1] = GNUTLS_TLS1_3;
+#endif
+ err = gnutls_protocol_set_priority (session, allowed_protocols);
+ break;
+
+ case secure_protocol_tlsv1_3:
+#if GNUTLS_VERSION_NUMBER >= 0x030603
+ allowed_protocols[0] = GNUTLS_TLS1_3;
+ err = gnutls_protocol_set_priority (session, allowed_protocols);
+ break;
+#else
+ logprintf (LOG_NOTQUIET, _("Your GnuTLS version is too old to support TLS 1.3\n"));
+ return -1;
+#endif
+
+ default:
+ logprintf (LOG_NOTQUIET, _("GnuTLS: unimplemented 'secure-protocol' option value %d\n"), opt.secure_protocol);
+ logprintf (LOG_NOTQUIET, _("Please report this issue to bug-wget@gnu.org\n"));
+ abort ();
+ }
+#endif
+
+ return err;
+}
+
+bool
+ssl_connect_wget (int fd, const char *hostname, int *continue_session)
+{
+ struct wgnutls_transport_context *ctx;
+ gnutls_session_t session;
+ int err;
+
+#if GNUTLS_VERSION_NUMBER >= 0x030604
+ // enable support of TLS1.3 post-handshake authentication
+ gnutls_init (&session, GNUTLS_CLIENT | GNUTLS_POST_HANDSHAKE_AUTH);
+#else
+ gnutls_init (&session, GNUTLS_CLIENT);
+#endif
+
+ /* We set the server name but only if it's not an IP address. */
+ if (! is_valid_ip_address (hostname))
+ {
+ /* GnuTLS 3.4.x (x<=10) disrespects the length parameter, we have to construct a new string */
+ /* see https://gitlab.com/gnutls/gnutls/issues/78 */
+ const char *sni_hostname = _sni_hostname(hostname);
+
+ gnutls_server_name_set (session, GNUTLS_NAME_DNS, sni_hostname, strlen(sni_hostname));
+ xfree(sni_hostname);
+ }
+
+ gnutls_credentials_set (session, GNUTLS_CRD_CERTIFICATE, credentials);
+#ifndef FD_TO_SOCKET
+# define FD_TO_SOCKET(X) (X)
+#endif
+#ifdef HAVE_INTPTR_T
+ gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) (intptr_t) FD_TO_SOCKET (fd));
+#else
+ gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) FD_TO_SOCKET (fd));
+#endif
+
+ if (!opt.tls_ciphers_string)
+ {
+ err = set_prio_default (session);
+ }
+ else
+ {
+#if HAVE_GNUTLS_PRIORITY_SET_DIRECT
+ err = gnutls_priority_set_direct (session, opt.tls_ciphers_string, NULL);
+#else
+ logprintf (LOG_NOTQUIET, _("GnuTLS: Cannot set prio string directly. Falling back to default priority.\n"));
+ err = gnutls_set_default_priority (session);
+#endif
+ }
+
+ if (err < 0)
+ {
+ logprintf (LOG_NOTQUIET, "GnuTLS: %s\n", gnutls_strerror (err));
+ gnutls_deinit (session);
+ return false;
+ }
+
+ if (continue_session)
+ {
+ ctx = (struct wgnutls_transport_context *) fd_transport_context (*continue_session);
+ if (!gnutls_session_is_resumed (session))
+ {
+ if (!ctx || !ctx->session_data || gnutls_session_set_data (session, ctx->session_data->data, ctx->session_data->size))
+ {
+ if (ctx && ctx->session_data)
+ {
+ /* server does not want to continue the session */
+ if (ctx->session_data->data)
+ gnutls_free (ctx->session_data->data);
+ gnutls_free (ctx->session_data);
+ }
+ gnutls_deinit (session);
+ return false;
+ }
+ }
+ else
+ {
+ logputs (LOG_ALWAYS, "SSL session has already been resumed. Continuing.\n");
+ continue_session = NULL;
+ }
+ }
+
+ err = _do_handshake (session, fd, NULL);
+
+ if (err < 0)
+ {
+ gnutls_deinit (session);
+ return false;
+ }
+
+ ctx = xnew0 (struct wgnutls_transport_context);
+ ctx->session_data = xnew0 (gnutls_datum_t);
+ ctx->session = session;
+ if (gnutls_session_get_data2 (session, ctx->session_data))
+ {
+ xfree (ctx->session_data);
+ logprintf (LOG_NOTQUIET, "WARNING: Could not save SSL session data for socket %d\n", fd);
+ }
+ fd_register_transport (fd, &wgnutls_transport, ctx);
+ return true;
+}
+
+static bool
+pkp_pin_peer_pubkey (gnutls_x509_crt_t cert, const char *pinnedpubkey)
+{
+ /* Scratch */
+ size_t len1 = 0, len2 = 0;
+ char *buff1 = NULL;
+
+ gnutls_pubkey_t key = NULL;
+
+ /* Result is returned to caller */
+ int ret = 0;
+ bool result = false;
+
+ /* if a path wasn't specified, don't pin */
+ if (NULL == pinnedpubkey)
+ return true;
+
+ if (NULL == cert)
+ return result;
+
+ /* Begin Gyrations to get the public key */
+ gnutls_pubkey_init (&key);
+
+ ret = gnutls_pubkey_import_x509 (key, cert, 0);
+ if (ret < 0)
+ goto cleanup; /* failed */
+
+ ret = gnutls_pubkey_export (key, GNUTLS_X509_FMT_DER, NULL, &len1);
+ if (ret != GNUTLS_E_SHORT_MEMORY_BUFFER || len1 == 0)
+ goto cleanup; /* failed */
+
+ buff1 = xmalloc (len1);
+
+ len2 = len1;
+
+ ret = gnutls_pubkey_export (key, GNUTLS_X509_FMT_DER, buff1, &len2);
+ if (ret < 0 || len1 != len2)
+ goto cleanup; /* failed */
+
+ /* End Gyrations */
+
+ /* The one good exit point */
+ result = wg_pin_peer_pubkey (pinnedpubkey, buff1, len1);
+
+ cleanup:
+ if (NULL != key)
+ gnutls_pubkey_deinit (key);
+
+ xfree (buff1);
+
+ return result;
+}
+
+#define _CHECK_CERT(flag,msg) \
+ if (status & (flag))\
+ {\
+ logprintf (LOG_NOTQUIET, (msg),\
+ severity, quote (host));\
+ success = false;\
+ }
+
+bool
+ssl_check_certificate (int fd, const char *host)
+{
+ struct wgnutls_transport_context *ctx = fd_transport_context (fd);
+
+ unsigned int status;
+ int err;
+
+ /* If the user has specified --no-check-cert, we still want to warn
+ him about problems with the server's certificate. */
+ const char *severity = opt.check_cert ? _("ERROR") : _("WARNING");
+ bool success = true;
+ bool pinsuccess = opt.pinnedpubkey == NULL;
+
+ /* The user explicitly said to not check for the certificate. */
+ if (opt.check_cert == CHECK_CERT_QUIET && pinsuccess)
+ return success;
+
+ err = gnutls_certificate_verify_peers2 (ctx->session, &status);
+ if (err < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("%s: No certificate presented by %s.\n"),
+ severity, quotearg_style (escape_quoting_style, host));
+ success = false;
+ goto out;
+ }
+
+ _CHECK_CERT (GNUTLS_CERT_INVALID, _("%s: The certificate of %s is not trusted.\n"));
+ _CHECK_CERT (GNUTLS_CERT_SIGNER_NOT_FOUND, _("%s: The certificate of %s doesn't have a known issuer.\n"));
+ _CHECK_CERT (GNUTLS_CERT_REVOKED, _("%s: The certificate of %s has been revoked.\n"));
+ _CHECK_CERT (GNUTLS_CERT_SIGNER_NOT_CA, _("%s: The certificate signer of %s was not a CA.\n"));
+ _CHECK_CERT (GNUTLS_CERT_INSECURE_ALGORITHM, _("%s: The certificate of %s was signed using an insecure algorithm.\n"));
+ _CHECK_CERT (GNUTLS_CERT_NOT_ACTIVATED, _("%s: The certificate of %s is not yet activated.\n"));
+ _CHECK_CERT (GNUTLS_CERT_EXPIRED, _("%s: The certificate of %s has expired.\n"));
+
+ if (gnutls_certificate_type_get (ctx->session) == GNUTLS_CRT_X509)
+ {
+ time_t now = time (NULL);
+ gnutls_x509_crt_t cert;
+ const gnutls_datum_t *cert_list;
+ unsigned int cert_list_size;
+ const char *sni_hostname;
+
+ if ((err = gnutls_x509_crt_init (&cert)) < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Error initializing X509 certificate: %s\n"),
+ gnutls_strerror (err));
+ success = false;
+ goto out;
+ }
+
+ cert_list = gnutls_certificate_get_peers (ctx->session, &cert_list_size);
+ if (!cert_list)
+ {
+ logprintf (LOG_NOTQUIET, _("No certificate found\n"));
+ success = false;
+ goto crt_deinit;
+ }
+ err = gnutls_x509_crt_import (cert, cert_list, GNUTLS_X509_FMT_DER);
+ if (err < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Error parsing certificate: %s\n"),
+ gnutls_strerror (err));
+ success = false;
+ goto crt_deinit;
+ }
+ if (now < gnutls_x509_crt_get_activation_time (cert))
+ {
+ logprintf (LOG_NOTQUIET, _("The certificate has not yet been activated\n"));
+ success = false;
+ }
+ if (now >= gnutls_x509_crt_get_expiration_time (cert))
+ {
+ logprintf (LOG_NOTQUIET, _("The certificate has expired\n"));
+ success = false;
+ }
+ sni_hostname = _sni_hostname(host);
+ if (!gnutls_x509_crt_check_hostname (cert, sni_hostname))
+ {
+ logprintf (LOG_NOTQUIET,
+ _("The certificate's owner does not match hostname %s\n"),
+ quote (sni_hostname));
+ success = false;
+ }
+ xfree(sni_hostname);
+
+ pinsuccess = pkp_pin_peer_pubkey (cert, opt.pinnedpubkey);
+ if (!pinsuccess)
+ {
+ logprintf (LOG_ALWAYS, _("The public key does not match pinned public key!\n"));
+ success = false;
+ }
+
+ crt_deinit:
+ gnutls_x509_crt_deinit (cert);
+ }
+ else
+ {
+ logprintf (LOG_NOTQUIET, _("Certificate must be X.509\n"));
+ success = false;
+ }
+
+ out:
+ /* never return true if pinsuccess fails */
+ return !pinsuccess ? false : (opt.check_cert == CHECK_CERT_ON ? success : true);
+}
diff --git a/src/hash.c b/src/hash.c
new file mode 100644
index 0000000..6609528
--- /dev/null
+++ b/src/hash.c
@@ -0,0 +1,813 @@
+/* Hash tables.
+ Copyright (C) 2000-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* With -DSTANDALONE, this file can be compiled outside Wget source
+ tree. To test, also use -DTEST. */
+
+#ifndef STANDALONE
+# include "wget.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <limits.h>
+
+#ifndef STANDALONE
+/* Get Wget's utility headers. */
+# include "utils.h"
+#else
+/* Make do without them. */
+# define xnew(type) (xmalloc (sizeof (type)))
+# define xnew0(type) (xcalloc (1, sizeof (type)))
+# define xnew_array(type, len) (xmalloc ((len) * sizeof (type)))
+# define xfree(p) do { free ((void *) (p)); p = NULL; } while (0)
+
+# ifndef countof
+# define countof(x) (sizeof (x) / sizeof ((x)[0]))
+# endif
+# include <ctype.h>
+# define c_tolower(x) tolower ((unsigned char) (x))
+# include <stdint.h>
+#endif
+
+#include "hash.h"
+
+/* INTERFACE:
+
+ Hash tables are a technique used to implement mapping between
+ objects with near-constant-time access and storage. The table
+ associates keys to values, and a value can be very quickly
+ retrieved by providing the key. Fast lookup tables are typically
+ implemented as hash tables.
+
+ The entry points are
+ hash_table_new -- creates the table.
+ hash_table_destroy -- destroys the table.
+ hash_table_put -- establishes or updates key->value mapping.
+ hash_table_get -- retrieves value of key.
+ hash_table_get_pair -- get key/value pair for key.
+ hash_table_contains -- test whether the table contains key.
+ hash_table_remove -- remove key->value mapping for given key.
+ hash_table_for_each -- call function for each table entry.
+ hash_table_iterate -- iterate over entries in hash table.
+ hash_table_iter_next -- return next element during iteration.
+ hash_table_clear -- clear hash table contents.
+ hash_table_count -- return the number of entries in the table.
+
+ The hash table grows internally as new entries are added and is not
+ limited in size, except by available memory. The table doubles
+ with each resize, which ensures that the amortized time per
+ operation remains constant.
+
+ If not instructed otherwise, tables created by hash_table_new
+ consider the keys to be equal if their pointer values are the same.
+ You can use make_string_hash_table to create tables whose keys are
+ considered equal if their string contents are the same. In the
+ general case, the criterion of equality used to compare keys is
+ specified at table creation time with two callback functions,
+ "hash" and "test". The hash function transforms the key into an
+ arbitrary number that must be the same for two equal keys. The
+ test function accepts two keys and returns non-zero if they are to
+ be considered equal.
+
+ Note that neither keys nor values are copied when inserted into the
+ hash table, so they must exist for the lifetime of the table. This
+ means that e.g. the use of static strings is OK, but objects with a
+ shorter life-time probably need to be copied (with strdup() or the
+ like in the case of strings) before being inserted. */
+
+/* IMPLEMENTATION:
+
+ The hash table is implemented as an open-addressed table with
+ linear probing collision resolution.
+
+ The above means that all the cells (each cell containing a key and
+ a value pointer) are stored in a contiguous array. Array position
+ of each cell is determined by the hash value of its key and the
+ size of the table: location := hash(key) % size. If two different
+ keys end up on the same position (collide), the one that came
+ second is stored in the first unoccupied cell that follows it.
+ This collision resolution technique is called "linear probing".
+
+ There are more advanced collision resolution methods (quadratic
+ probing, double hashing), but we don't use them because they incur
+ more non-sequential access to the array, which results in worse CPU
+ cache behavior. Linear probing works well as long as the
+ count/size ratio (fullness) is kept below 75%. We make sure to
+ grow and rehash the table whenever this threshold is exceeded.
+
+ Collisions complicate deletion because simply clearing a cell
+ followed by previously collided entries would cause those neighbors
+ to not be picked up by find_cell later. One solution is to leave a
+ "tombstone" marker instead of clearing the cell, and another is to
+ recalculate the positions of adjacent cells. We take the latter
+ approach because it results in less bookkeeping garbage and faster
+ retrieval at the (slight) expense of deletion. */
+
+/* Maximum allowed fullness: when hash table's fullness exceeds this
+ value, the table is resized. */
+#define HASH_MAX_FULLNESS 0.75
+
+/* The hash table size is multiplied by this factor (and then rounded
+ to the next prime) with each resize. This guarantees infrequent
+ resizes. */
+#define HASH_RESIZE_FACTOR 2
+
+struct cell {
+ void *key;
+ void *value;
+};
+
+typedef unsigned long (*hashfun_t) (const void *);
+typedef int (*testfun_t) (const void *, const void *);
+
+struct hash_table {
+ hashfun_t hash_function;
+ testfun_t test_function;
+
+ struct cell *cells; /* contiguous array of cells. */
+ int size; /* size of the array. */
+
+ int count; /* number of occupied entries. */
+ int resize_threshold; /* after size exceeds this number of
+ entries, resize the table. */
+ int prime_offset; /* the offset of the current prime in
+ the prime table. */
+};
+
+/* We use the all-bits-set constant (INVALID_PTR) marker to mean that
+ a cell is empty. It is unaligned and therefore illegal as a
+ pointer. INVALID_PTR_CHAR (0xff) is the single-character constant
+ used to initialize the entire cells array as empty.
+
+ The all-bits-set value is a better choice than NULL because it
+ allows the use of NULL/0 keys. Since the keys are either integers
+ or pointers, the only key that cannot be used is the integer value
+ -1. This is acceptable because it still allows the use of
+ nonnegative integer keys. */
+
+#define INVALID_PTR ((void *) ~(uintptr_t) 0)
+#ifndef UCHAR_MAX
+# define UCHAR_MAX 0xff
+#endif
+#define INVALID_PTR_CHAR UCHAR_MAX
+
+/* Whether the cell C is occupied (non-empty). */
+#define CELL_OCCUPIED(c) ((c)->key != INVALID_PTR)
+
+/* Clear the cell C, i.e. mark it as empty (unoccupied). */
+#define CLEAR_CELL(c) ((c)->key = INVALID_PTR)
+
+/* "Next" cell is the cell following C, but wrapping back to CELLS
+ when C would reach CELLS+SIZE. */
+#define NEXT_CELL(c, cells, size) (c != cells + (size - 1) ? c + 1 : cells)
+
+/* Loop over occupied cells starting at C, terminating the loop when
+ an empty cell is encountered. */
+#define FOREACH_OCCUPIED_ADJACENT(c, cells, size) \
+ for (; CELL_OCCUPIED (c); c = NEXT_CELL (c, cells, size))
+
+/* Return the position of KEY in hash table SIZE large, hash function
+ being HASHFUN. */
+#define HASH_POSITION(key, hashfun, size) ((hashfun) (key) % size)
+
+/* Find a prime near, but greater than or equal to SIZE. The primes
+ are looked up from a table with a selection of primes convenient
+ for this purpose.
+
+ PRIME_OFFSET is a minor optimization: it specifies start position
+ for the search for the large enough prime. The final offset is
+ stored in the same variable. That way the list of primes does not
+ have to be scanned from the beginning each time around. */
+
+static int
+prime_size (int size, int *prime_offset)
+{
+ static const int primes[] = {
+ 13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
+ 1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
+ 19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
+ 204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
+ 1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
+ 10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
+ 50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
+ 243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
+ 1174703521, 1527114613, 1837299131, 2147483647
+ };
+ size_t i;
+
+ for (i = *prime_offset; i < countof (primes); i++)
+ if (primes[i] >= size)
+ {
+ /* Set the offset to the next prime. That is safe because,
+ next time we are called, it will be with a larger SIZE,
+ which means we could never return the same prime anyway.
+ (If that is not the case, the caller can simply reset
+ *prime_offset.) */
+ *prime_offset = i + 1;
+ return primes[i];
+ }
+
+ abort ();
+}
+
+static int cmp_pointer (const void *, const void *);
+
+/* Create a hash table with hash function HASH_FUNCTION and test
+ function TEST_FUNCTION. The table is empty (its count is 0), but
+ pre-allocated to store at least ITEMS items.
+
+ ITEMS is the number of items that the table can accept without
+ needing to resize. It is useful when creating a table that is to
+ be immediately filled with a known number of items. In that case,
+ the regrows are a waste of time, and specifying ITEMS correctly
+ will avoid them altogether.
+
+ Note that hash tables grow dynamically regardless of ITEMS. The
+ only use of ITEMS is to preallocate the table and avoid unnecessary
+ dynamic regrows. Don't bother making ITEMS prime because it's not
+ used as size unchanged. To start with a small table that grows as
+ needed, simply specify zero ITEMS.
+
+ If hash and test callbacks are not specified, identity mapping is
+ assumed, i.e. pointer values are used for key comparison. (Common
+ Lisp calls such tables EQ hash tables, and Java calls them
+ IdentityHashMaps.) If your keys require different comparison,
+ specify hash and test functions. For easy use of C strings as hash
+ keys, you can use the convenience functions make_string_hash_table
+ and make_nocase_string_hash_table. */
+
+struct hash_table *
+hash_table_new (int items,
+ unsigned long (*hash_function) (const void *),
+ int (*test_function) (const void *, const void *))
+{
+ int size;
+ struct hash_table *ht = xnew (struct hash_table);
+
+ ht->hash_function = hash_function ? hash_function : hash_pointer;
+ ht->test_function = test_function ? test_function : cmp_pointer;
+
+ /* If the size of struct hash_table ever becomes a concern, this
+ field can go. (Wget doesn't create many hashes.) */
+ ht->prime_offset = 0;
+
+ /* Calculate the size that ensures that the table will store at
+ least ITEMS keys without the need to resize. */
+ size = (int) (1 + items / HASH_MAX_FULLNESS);
+ size = prime_size (size, &ht->prime_offset);
+ ht->size = size;
+ ht->resize_threshold = (int) (size * HASH_MAX_FULLNESS);
+ /*assert (ht->resize_threshold >= items);*/
+
+ ht->cells = xnew_array (struct cell, ht->size);
+
+ /* Mark cells as empty. We use 0xff rather than 0 to mark empty
+ keys because it allows us to use NULL/0 as keys. */
+ memset (ht->cells, INVALID_PTR_CHAR, size * sizeof (struct cell));
+
+ ht->count = 0;
+
+ return ht;
+}
+
+/* Free the data associated with hash table HT. */
+
+void
+hash_table_destroy (struct hash_table *ht)
+{
+ xfree (ht->cells);
+ xfree (ht);
+}
+
+/* The heart of most functions in this file -- find the cell whose
+ KEY is equal to key, using linear probing. Returns the cell
+ that matches KEY, or the first empty cell if none matches. */
+
+static inline struct cell *
+find_cell (const struct hash_table *ht, const void *key)
+{
+ struct cell *cells = ht->cells;
+ int size = ht->size;
+ struct cell *c = cells + HASH_POSITION (key, ht->hash_function, size);
+ testfun_t equals = ht->test_function;
+
+ FOREACH_OCCUPIED_ADJACENT (c, cells, size)
+ if (equals (key, c->key))
+ break;
+ return c;
+}
+
+/* Get the value that corresponds to the key KEY in the hash table HT.
+ If no value is found, return NULL. Note that NULL is a legal value
+ for value; if you are storing NULLs in your hash table, you can use
+ hash_table_contains to be sure that a (possibly NULL) value exists
+ in the table. Or, you can use hash_table_get_pair instead of this
+ function. */
+
+void *
+hash_table_get (const struct hash_table *ht, const void *key)
+{
+ struct cell *c = find_cell (ht, key);
+ if (CELL_OCCUPIED (c))
+ return c->value;
+ else
+ return NULL;
+}
+
+/* Like hash_table_get, but writes out the pointers to both key and
+ value. Returns non-zero on success. */
+
+int
+hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
+ void *orig_key, void *value)
+{
+ struct cell *c = find_cell (ht, lookup_key);
+ if (CELL_OCCUPIED (c))
+ {
+ if (orig_key)
+ *(void **)orig_key = c->key;
+ if (value)
+ *(void **)value = c->value;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+/* Return 1 if HT contains KEY, 0 otherwise. */
+
+int
+hash_table_contains (const struct hash_table *ht, const void *key)
+{
+ struct cell *c = find_cell (ht, key);
+ return CELL_OCCUPIED (c);
+}
+
+/* Grow hash table HT as necessary, and rehash all the key-value
+ mappings. */
+
+static void
+grow_hash_table (struct hash_table *ht)
+{
+ hashfun_t hasher = ht->hash_function;
+ struct cell *old_cells = ht->cells;
+ struct cell *old_end = ht->cells + ht->size;
+ struct cell *c, *cells;
+ int newsize;
+
+ newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
+#if 0
+ printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
+ ht->size, newsize,
+ 100.0 * ht->count / ht->size,
+ 100.0 * ht->count / newsize);
+#endif
+
+ ht->size = newsize;
+ ht->resize_threshold = (int) (newsize * HASH_MAX_FULLNESS);
+
+ cells = xnew_array (struct cell, newsize);
+ memset (cells, INVALID_PTR_CHAR, newsize * sizeof (struct cell));
+ ht->cells = cells;
+
+ for (c = old_cells; c < old_end; c++)
+ if (CELL_OCCUPIED (c))
+ {
+ struct cell *new_c;
+ /* We don't need to test for uniqueness of keys because they
+ come from the hash table and are therefore known to be
+ unique. */
+ new_c = cells + HASH_POSITION (c->key, hasher, newsize);
+ FOREACH_OCCUPIED_ADJACENT (new_c, cells, newsize)
+ ;
+ *new_c = *c;
+ }
+
+ xfree (old_cells);
+}
+
+/* Put VALUE in the hash table HT under the key KEY. This regrows the
+ table if necessary. */
+
+void
+hash_table_put (struct hash_table *ht, const void *key, const void *value)
+{
+ struct cell *c = find_cell (ht, key);
+ if (CELL_OCCUPIED (c))
+ {
+ /* update existing item */
+ c->key = (void *)key; /* const? */
+ c->value = (void *)value;
+ return;
+ }
+
+ /* If adding the item would make the table exceed max. fullness,
+ grow the table first. */
+ if (ht->count >= ht->resize_threshold)
+ {
+ grow_hash_table (ht);
+ c = find_cell (ht, key);
+ }
+
+ /* add new item */
+ ++ht->count;
+ c->key = (void *)key; /* const? */
+ c->value = (void *)value;
+}
+
+/* Remove KEY->value mapping from HT. Return 0 if there was no such
+ entry; return 1 if an entry was removed. */
+
+int
+hash_table_remove (struct hash_table *ht, const void *key)
+{
+ struct cell *c = find_cell (ht, key);
+ if (!CELL_OCCUPIED (c))
+ return 0;
+ else
+ {
+ int size = ht->size;
+ struct cell *cells = ht->cells;
+ hashfun_t hasher = ht->hash_function;
+
+ CLEAR_CELL (c);
+ --ht->count;
+
+ /* Rehash all the entries following C. The alternative
+ approach is to mark the entry as deleted, i.e. create a
+ "tombstone". That speeds up removal, but leaves a lot of
+ garbage and slows down hash_table_get and hash_table_put. */
+
+ c = NEXT_CELL (c, cells, size);
+ FOREACH_OCCUPIED_ADJACENT (c, cells, size)
+ {
+ const void *key2 = c->key;
+ struct cell *c_new;
+
+ /* Find the new location for the key. */
+ c_new = cells + HASH_POSITION (key2, hasher, size);
+ FOREACH_OCCUPIED_ADJACENT (c_new, cells, size)
+ if (key2 == c_new->key)
+ /* The cell C (key2) is already where we want it (in
+ C_NEW's "chain" of keys.) */
+ goto next_rehash;
+
+ *c_new = *c;
+ CLEAR_CELL (c);
+
+ next_rehash:
+ ;
+ }
+ return 1;
+ }
+}
+
+/* Clear HT of all entries. After calling this function, the count
+ and the fullness of the hash table will be zero. The size will
+ remain unchanged. */
+
+void
+hash_table_clear (struct hash_table *ht)
+{
+ memset (ht->cells, INVALID_PTR_CHAR, ht->size * sizeof (struct cell));
+ ht->count = 0;
+}
+
+/* Call FN for each entry in HT. FN is called with three arguments:
+ the key, the value, and ARG. When FN returns a non-zero value, the
+ mapping stops.
+
+ It is undefined what happens if you add or remove entries in the
+ hash table while hash_table_for_each is running. The exception is
+ the entry you're currently mapping over; you may call
+ hash_table_put or hash_table_remove on that entry's key. That is
+ also the reason why this function cannot be implemented in terms of
+ hash_table_iterate. */
+
+void
+hash_table_for_each (struct hash_table *ht,
+ int (*fn) (void *, void *, void *), void *arg)
+{
+ struct cell *c = ht->cells;
+ struct cell *end = ht->cells + ht->size;
+
+ for (; c < end; c++)
+ if (CELL_OCCUPIED (c))
+ {
+ void *key;
+ repeat:
+ key = c->key;
+ if (fn (key, c->value, arg))
+ return;
+ /* hash_table_remove might have moved the adjacent cells. */
+ if (c->key != key && CELL_OCCUPIED (c))
+ goto repeat;
+ }
+}
+
+/* Initiate iteration over HT. Entries are obtained with
+ hash_table_iter_next, a typical iteration loop looking like this:
+
+ hash_table_iterator iter;
+ for (hash_table_iterate (ht, &iter); hash_table_iter_next (&iter); )
+ ... do something with iter.key and iter.value ...
+
+ The iterator does not need to be deallocated after use. The hash
+ table must not be modified while being iterated over. */
+
+void
+hash_table_iterate (struct hash_table *ht, hash_table_iterator *iter)
+{
+ iter->pos = ht->cells;
+ iter->end = ht->cells + ht->size;
+}
+
+/* Get the next hash table entry. ITER is an iterator object
+ initialized using hash_table_iterate. While there are more
+ entries, the key and value pointers are stored to ITER->key and
+ ITER->value respectively and 1 is returned. When there are no more
+ entries, 0 is returned.
+
+ If the hash table is modified between calls to this function, the
+ result is undefined. */
+
+int
+hash_table_iter_next (hash_table_iterator *iter)
+{
+ struct cell *c = iter->pos;
+ struct cell *end = iter->end;
+ for (; c < end; c++)
+ if (CELL_OCCUPIED (c))
+ {
+ iter->key = c->key;
+ iter->value = c->value;
+ iter->pos = c + 1;
+ return 1;
+ }
+ return 0;
+}
+
+/* Return the number of elements in the hash table. This is not the
+ same as the physical size of the hash table, which is always
+ greater than the number of elements. */
+
+int
+hash_table_count (const struct hash_table *ht)
+{
+ return ht->count;
+}
+
+/* Functions from this point onward are meant for convenience and
+ don't strictly belong to this file. However, this is as good a
+ place for them as any. */
+
+/* Guidelines for creating custom hash and test functions:
+
+ - The test function returns non-zero for keys that are considered
+ "equal", zero otherwise.
+
+ - The hash function returns a number that represents the
+ "distinctness" of the object. In more precise terms, it means
+ that for any two objects that test "equal" under the test
+ function, the hash function MUST produce the same result.
+
+ This does not mean that all different objects must produce
+ different values (that would be "perfect" hashing), only that
+ non-distinct objects must produce the same values! For instance,
+ a hash function that returns 0 for any given object is a
+ perfectly valid (albeit extremely bad) hash function. A hash
+ function that hashes a string by adding up all its characters is
+ another example of a valid (but still quite bad) hash function.
+
+ It is not hard to make hash and test functions agree about
+ equality. For example, if the test function compares strings
+ case-insensitively, the hash function can lower-case the
+ characters when calculating the hash value. That ensures that
+ two strings differing only in case will hash the same.
+
+ - To prevent performance degradation, choose a hash function with
+ as good "spreading" as possible. A good hash function will use
+ all the bits of the input when calculating the hash, and will
+ react to even small changes in input with a completely different
+ output. But don't make the hash function itself overly slow,
+ because you'll be incurring a non-negligible overhead to all hash
+ table operations. */
+
+/*
+ * Support for hash tables whose keys are strings.
+ *
+ */
+
+/* Base 31 hash function. Taken from Gnome's glib, modified to use
+ standard C types.
+
+ We used to use the popular hash function from the Dragon Book, but
+ this one seems to perform much better, both by being faster and by
+ generating less collisions. */
+
+#ifdef __clang__
+__attribute__((no_sanitize("integer")))
+#endif
+static unsigned long
+hash_string (const void *key)
+{
+ const char *p = key;
+ unsigned int h = *p;
+
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + *p;
+
+ return h;
+}
+
+/* Frontend for strcmp usable for hash tables. */
+
+static int
+cmp_string (const void *s1, const void *s2)
+{
+ return !strcmp ((const char *)s1, (const char *)s2);
+}
+
+/* Return a hash table of preallocated to store at least ITEMS items
+ suitable to use strings as keys. */
+
+struct hash_table *
+make_string_hash_table (int items)
+{
+ return hash_table_new (items, hash_string, cmp_string);
+}
+
+/*
+ * Support for hash tables whose keys are strings, but which are
+ * compared case-insensitively.
+ *
+ */
+
+/* Like hash_string, but produce the same hash regardless of the case. */
+
+#ifdef __clang__
+__attribute__((no_sanitize("integer")))
+#endif
+static unsigned long
+hash_string_nocase (const void *key)
+{
+ const char *p = key;
+ unsigned int h = c_tolower (*p);
+
+ if (h)
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + c_tolower (*p);
+
+ return h;
+}
+
+/* Like string_cmp, but doing case-insensitive comparison. */
+
+static int
+string_cmp_nocase (const void *s1, const void *s2)
+{
+ return !strcasecmp ((const char *)s1, (const char *)s2);
+}
+
+/* Like make_string_hash_table, but uses string_hash_nocase and
+ string_cmp_nocase. */
+
+struct hash_table *
+make_nocase_string_hash_table (int items)
+{
+ return hash_table_new (items, hash_string_nocase, string_cmp_nocase);
+}
+
+/* Hashing of numeric values, such as pointers and integers.
+
+ This implementation is the Robert Jenkins' 32 bit Mix Function,
+ with a simple adaptation for 64-bit values. According to Jenkins
+ it should offer excellent spreading of values. Unlike the popular
+ Knuth's multiplication hash, this function doesn't need to know the
+ hash table size to work. */
+
+#ifdef __clang__
+__attribute__((no_sanitize("integer")))
+#endif
+unsigned long
+hash_pointer (const void *ptr)
+{
+ uintptr_t key = (uintptr_t) ptr;
+ key += (key << 12);
+ key ^= (key >> 22);
+ key += (key << 4);
+ key ^= (key >> 9);
+ key += (key << 10);
+ key ^= (key >> 2);
+ key += (key << 7);
+ key ^= (key >> 12);
+#if SIZEOF_VOID_P > 4
+ key += (key << 44);
+ key ^= (key >> 54);
+ key += (key << 36);
+ key ^= (key >> 41);
+ key += (key << 42);
+ key ^= (key >> 34);
+ key += (key << 39);
+ key ^= (key >> 44);
+#endif
+ return (unsigned long) key;
+}
+
+static int
+cmp_pointer (const void *ptr1, const void *ptr2)
+{
+ return ptr1 == ptr2;
+}
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <string.h>
+
+void
+print_hash (struct hash_table *sht)
+{
+ hash_table_iterator iter;
+ int count = 0;
+
+ for (hash_table_iterate (sht, &iter); hash_table_iter_next (&iter);
+ ++count)
+ printf ("%s: %s\n", iter.key, iter.value);
+ assert (count == sht->count);
+}
+
+int
+main (void)
+{
+ struct hash_table *ht = make_string_hash_table (0);
+ char line[80];
+
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ textdomain ("wget");
+#endif /* ENABLE_NLS */
+
+ while ((fgets (line, sizeof (line), stdin)))
+ {
+ int len = strlen (line);
+ if (len <= 1)
+ continue;
+ line[--len] = '\0';
+ if (!hash_table_contains (ht, line))
+ hash_table_put (ht, strdup (line), "here I am!");
+#if 1
+ if (len % 5 == 0)
+ {
+ char *line_copy;
+ if (hash_table_get_pair (ht, line, &line_copy, NULL))
+ {
+ hash_table_remove (ht, line);
+ xfree (line_copy);
+ }
+ }
+#endif
+ }
+#if 0
+ print_hash (ht);
+#endif
+#if 1
+ printf ("%d %d\n", ht->count, ht->size);
+#endif
+ return 0;
+}
+#endif /* TEST */
diff --git a/src/hash.h b/src/hash.h
new file mode 100644
index 0000000..b8f7965
--- /dev/null
+++ b/src/hash.h
@@ -0,0 +1,66 @@
+/* Hash table declarations.
+ Copyright (C) 2000, 2007-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef HASH_H
+#define HASH_H
+
+struct hash_table;
+
+struct hash_table *hash_table_new (int, unsigned long (*) (const void *),
+ int (*) (const void *, const void *));
+void hash_table_destroy (struct hash_table *);
+
+void *hash_table_get (const struct hash_table *, const void *);
+int hash_table_get_pair (const struct hash_table *, const void *,
+ void *, void *);
+int hash_table_contains (const struct hash_table *, const void *);
+
+void hash_table_put (struct hash_table *, const void *, const void *);
+int hash_table_remove (struct hash_table *, const void *);
+void hash_table_clear (struct hash_table *);
+
+void hash_table_for_each (struct hash_table *,
+ int (*) (void *, void *, void *), void *);
+
+typedef struct {
+ void *key, *value; /* public members */
+ void *pos, *end; /* private members */
+} hash_table_iterator;
+void hash_table_iterate (struct hash_table *, hash_table_iterator *);
+int hash_table_iter_next (hash_table_iterator *);
+
+int hash_table_count (const struct hash_table *);
+
+struct hash_table *make_string_hash_table (int);
+struct hash_table *make_nocase_string_hash_table (int);
+
+unsigned long hash_pointer (const void *);
+
+#endif /* HASH_H */
diff --git a/src/host.c b/src/host.c
new file mode 100644
index 0000000..353c1cc
--- /dev/null
+++ b/src/host.c
@@ -0,0 +1,1082 @@
+/* Host name resolution and matching.
+ Copyright (C) 1996-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifndef WINDOWS
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# ifndef __BEOS__
+# include <arpa/inet.h>
+# endif
+# ifdef __VMS
+# include "vms_ip.h"
+# else /* def __VMS */
+# include <netdb.h>
+# endif /* def __VMS [else] */
+# define SET_H_ERRNO(err) ((void)(h_errno = (err)))
+#else /* WINDOWS */
+# include <winsock2.h>
+# include <ws2tcpip.h>
+# define SET_H_ERRNO(err) WSASetLastError (err)
+#endif /* WINDOWS */
+
+#include <errno.h>
+
+#include "utils.h"
+#include "host.h"
+#include "url.h"
+#include "hash.h"
+#include "ptimer.h"
+
+#ifndef NO_ADDRESS
+# define NO_ADDRESS NO_DATA
+#endif
+
+#if !HAVE_DECL_H_ERRNO && !defined(WINDOWS)
+extern int h_errno;
+#endif
+
+
+/* Lists of IP addresses that result from running DNS queries. See
+ lookup_host for details. */
+
+struct address_list {
+ int count; /* number of addresses */
+ ip_address *addresses; /* pointer to the string of addresses */
+
+ int faulty; /* number of addresses known not to work. */
+ bool connected; /* whether we were able to connect to
+ one of the addresses in the list,
+ at least once. */
+
+ int refcount; /* reference count; when it drops to
+ 0, the entry is freed. */
+};
+
+/* Get the bounds of the address list. */
+
+void
+address_list_get_bounds (const struct address_list *al, int *start, int *end)
+{
+ *start = al->faulty;
+ *end = al->count;
+}
+
+/* Return a pointer to the address at position POS. */
+
+const ip_address *
+address_list_address_at (const struct address_list *al, int pos)
+{
+ assert (pos >= al->faulty && pos < al->count);
+ return al->addresses + pos;
+}
+
+/* Return true if AL contains IP, false otherwise. */
+
+bool
+address_list_contains (const struct address_list *al, const ip_address *ip)
+{
+ int i;
+ switch (ip->family)
+ {
+ case AF_INET:
+ for (i = 0; i < al->count; i++)
+ {
+ ip_address *cur = al->addresses + i;
+ if (cur->family == AF_INET
+ && (cur->data.d4.s_addr == ip->data.d4.s_addr))
+ return true;
+ }
+ return false;
+#ifdef ENABLE_IPV6
+ case AF_INET6:
+ for (i = 0; i < al->count; i++)
+ {
+ ip_address *cur = al->addresses + i;
+ if (cur->family == AF_INET6
+#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
+ && cur->ipv6_scope == ip->ipv6_scope
+#endif
+ && IN6_ARE_ADDR_EQUAL (&cur->data.d6, &ip->data.d6))
+ return true;
+ }
+ return false;
+#endif /* ENABLE_IPV6 */
+ default:
+ abort ();
+ }
+}
+
+/* Mark the INDEXth element of AL as faulty, so that the next time
+ this address list is used, the faulty element will be skipped. */
+
+void
+address_list_set_faulty (struct address_list *al, int index)
+{
+ /* We assume that the address list is traversed in order, so that a
+ "faulty" attempt is always preceded with all-faulty addresses,
+ and this is how Wget uses it. */
+ assert (index == al->faulty);
+ if (index != al->faulty)
+ {
+ logprintf (LOG_ALWAYS, "index: %d\nal->faulty: %d\n", index, al->faulty);
+ logprintf (LOG_ALWAYS, _("Error in handling the address list.\n"));
+ logprintf (LOG_ALWAYS, _("Please report this issue to bug-wget@gnu.org\n"));
+ abort();
+ }
+
+ ++al->faulty;
+ if (al->faulty >= al->count)
+ /* All addresses have been proven faulty. Since there's not much
+ sense in returning the user an empty address list the next
+ time, we'll rather make them all clean, so that they can be
+ retried anew. */
+ al->faulty = 0;
+}
+
+/* Set the "connected" flag to true. This flag used by connect.c to
+ see if the host perhaps needs to be resolved again. */
+
+void
+address_list_set_connected (struct address_list *al)
+{
+ al->connected = true;
+}
+
+/* Return the value of the "connected" flag. */
+
+bool
+address_list_connected_p (const struct address_list *al)
+{
+ return al->connected;
+}
+
+#ifdef ENABLE_IPV6
+
+/* Create an address_list from the addresses in the given struct
+ addrinfo. */
+
+static struct address_list *
+address_list_from_addrinfo (const struct addrinfo *ai)
+{
+ struct address_list *al;
+ const struct addrinfo *ptr;
+ int cnt;
+ ip_address *ip;
+
+ cnt = 0;
+ for (ptr = ai; ptr != NULL ; ptr = ptr->ai_next)
+ if (ptr->ai_family == AF_INET || ptr->ai_family == AF_INET6)
+ ++cnt;
+ if (cnt == 0)
+ return NULL;
+
+ al = xnew0 (struct address_list);
+ al->addresses = xnew_array (ip_address, cnt);
+ al->count = cnt;
+ al->refcount = 1;
+
+ ip = al->addresses;
+ for (ptr = ai; ptr != NULL; ptr = ptr->ai_next)
+ if (ptr->ai_family == AF_INET6)
+ {
+ const struct sockaddr_in6 *sin6 =
+ (const struct sockaddr_in6 *)ptr->ai_addr;
+ ip->family = AF_INET6;
+ ip->data.d6 = sin6->sin6_addr;
+#ifdef HAVE_SOCKADDR_IN6_SCOPE_ID
+ ip->ipv6_scope = sin6->sin6_scope_id;
+#endif
+ ++ip;
+ }
+ else if (ptr->ai_family == AF_INET)
+ {
+ const struct sockaddr_in *sin =
+ (const struct sockaddr_in *)ptr->ai_addr;
+ ip->family = AF_INET;
+ ip->data.d4 = sin->sin_addr;
+ ++ip;
+ }
+ assert (ip - al->addresses == cnt);
+ return al;
+}
+
+#define IS_IPV4(addr) (((const ip_address *) addr)->family == AF_INET)
+
+/* Compare two IP addresses by family, giving preference to the IPv4
+ address (sorting it first). In other words, return -1 if ADDR1 is
+ IPv4 and ADDR2 is IPv6, +1 if ADDR1 is IPv6 and ADDR2 is IPv4, and
+ 0 otherwise.
+
+ This is intended to be used as the comparator arg to a qsort-like
+ sorting function, which is why it accepts generic pointers. */
+
+static int
+cmp_prefer_ipv4 (const void *addr1, const void *addr2)
+{
+ return !IS_IPV4 (addr1) - !IS_IPV4 (addr2);
+}
+
+#define IS_IPV6(addr) (((const ip_address *) addr)->family == AF_INET6)
+
+/* Like the above, but give preference to the IPv6 address. */
+
+static int
+cmp_prefer_ipv6 (const void *addr1, const void *addr2)
+{
+ return !IS_IPV6 (addr1) - !IS_IPV6 (addr2);
+}
+
+#else /* not ENABLE_IPV6 */
+
+/* Create an address_list from a NULL-terminated vector of IPv4
+ addresses. This kind of vector is returned by gethostbyname. */
+
+static struct address_list *
+address_list_from_ipv4_addresses (char **vec)
+{
+ int count, i;
+ struct address_list *al = xnew0 (struct address_list);
+
+ count = 0;
+ while (vec[count])
+ ++count;
+ assert (count > 0);
+
+ al->addresses = xnew_array (ip_address, count);
+ al->count = count;
+ al->refcount = 1;
+
+ for (i = 0; i < count; i++)
+ {
+ ip_address *ip = &al->addresses[i];
+ ip->family = AF_INET;
+ memcpy (IP_INADDR_DATA (ip), vec[i], 4);
+ }
+
+ return al;
+}
+
+#endif /* not ENABLE_IPV6 */
+
+static void
+address_list_delete (struct address_list *al)
+{
+ xfree (al->addresses);
+ xfree (al);
+}
+
+/* Mark the address list as being no longer in use. This will reduce
+ its reference count which will cause the list to be freed when the
+ count reaches 0. */
+
+void
+address_list_release (struct address_list *al)
+{
+ --al->refcount;
+ DEBUGP (("Releasing 0x%0*lx (new refcount %d).\n", PTR_FORMAT (al),
+ al->refcount));
+ if (al->refcount <= 0)
+ {
+ DEBUGP (("Deleting unused 0x%0*lx.\n", PTR_FORMAT (al)));
+ address_list_delete (al);
+ }
+}
+
+/* Versions of gethostbyname and getaddrinfo that support timeout. */
+
+#ifndef ENABLE_IPV6
+
+struct ghbnwt_context {
+ const char *host_name;
+ struct hostent *hptr;
+};
+
+static void
+gethostbyname_with_timeout_callback (void *arg)
+{
+ struct ghbnwt_context *ctx = (struct ghbnwt_context *)arg;
+ ctx->hptr = gethostbyname (ctx->host_name);
+}
+
+/* Just like gethostbyname, except it times out after TIMEOUT seconds.
+ In case of timeout, NULL is returned and errno is set to ETIMEDOUT.
+ The function makes sure that when NULL is returned for reasons
+ other than timeout, errno is reset. */
+
+static struct hostent *
+gethostbyname_with_timeout (const char *host_name, double timeout)
+{
+ struct ghbnwt_context ctx;
+ ctx.host_name = host_name;
+ if (run_with_timeout (timeout, gethostbyname_with_timeout_callback, &ctx))
+ {
+ SET_H_ERRNO (HOST_NOT_FOUND);
+ errno = ETIMEDOUT;
+ return NULL;
+ }
+ if (!ctx.hptr)
+ errno = 0;
+ return ctx.hptr;
+}
+
+/* Print error messages for host errors. */
+static const char *
+host_errstr (int error)
+{
+ /* Can't use switch since some of these constants can be equal,
+ which makes the compiler complain about duplicate case
+ values. */
+ if (error == HOST_NOT_FOUND
+ || error == NO_RECOVERY
+ || error == NO_DATA
+ || error == NO_ADDRESS)
+ return _("Unknown host");
+ else if (error == TRY_AGAIN)
+ /* Message modeled after what gai_strerror returns in similar
+ circumstances. */
+ return _("Temporary failure in name resolution");
+ else
+ return _("Unknown error");
+}
+
+#else /* ENABLE_IPV6 */
+
+struct gaiwt_context {
+ const char *node;
+ const char *service;
+ const struct addrinfo *hints;
+ struct addrinfo **res;
+ int exit_code;
+};
+
+static void
+getaddrinfo_with_timeout_callback (void *arg)
+{
+ struct gaiwt_context *ctx = (struct gaiwt_context *)arg;
+ ctx->exit_code = getaddrinfo (ctx->node, ctx->service, ctx->hints, ctx->res);
+}
+
+/* Just like getaddrinfo, except it times out after TIMEOUT seconds.
+ In case of timeout, the EAI_SYSTEM error code is returned and errno
+ is set to ETIMEDOUT. */
+
+static int
+getaddrinfo_with_timeout (const char *node, const char *service,
+ const struct addrinfo *hints, struct addrinfo **res,
+ double timeout)
+{
+ struct gaiwt_context ctx;
+ ctx.node = node;
+ ctx.service = service;
+ ctx.hints = hints;
+ ctx.res = res;
+
+ if (run_with_timeout (timeout, getaddrinfo_with_timeout_callback, &ctx))
+ {
+ errno = ETIMEDOUT;
+ return EAI_SYSTEM;
+ }
+ return ctx.exit_code;
+}
+
+#endif /* ENABLE_IPV6 */
+
+/* Return a textual representation of ADDR, i.e. the dotted quad for
+ IPv4 addresses, and the colon-separated list of hex words (with all
+ zeros omitted, etc.) for IPv6 addresses. */
+
+const char *
+print_address (const ip_address *addr)
+{
+ static char buf[64];
+
+ if (!inet_ntop (addr->family, IP_INADDR_DATA (addr), buf, sizeof buf))
+ snprintf (buf, sizeof buf, "<error: %s>", strerror (errno));
+
+ return buf;
+}
+
+/* The following two functions were adapted from glibc's
+ implementation of inet_pton, written by Paul Vixie. */
+
+static bool
+is_valid_ipv4_address (const char *str, const char *end)
+{
+ bool saw_digit = false;
+ int octets = 0;
+ int val = 0;
+
+ while (str < end)
+ {
+ int ch = *str++;
+
+ if (ch >= '0' && ch <= '9')
+ {
+ val = val * 10 + (ch - '0');
+
+ if (val > 255)
+ return false;
+ if (!saw_digit)
+ {
+ if (++octets > 4)
+ return false;
+ saw_digit = true;
+ }
+ }
+ else if (ch == '.' && saw_digit)
+ {
+ if (octets == 4)
+ return false;
+ val = 0;
+ saw_digit = false;
+ }
+ else
+ return false;
+ }
+ if (octets < 4)
+ return false;
+
+ return true;
+}
+
+bool
+is_valid_ipv6_address (const char *str, const char *end)
+{
+ /* Use lower-case for these to avoid clash with system headers. */
+ enum {
+ ns_inaddrsz = 4,
+ ns_in6addrsz = 16,
+ ns_int16sz = 2
+ };
+
+ const char *curtok;
+ int tp;
+ const char *colonp;
+ bool saw_xdigit;
+ unsigned int val;
+
+ tp = 0;
+ colonp = NULL;
+
+ if (str == end)
+ return false;
+
+ /* Leading :: requires some special handling. */
+ if (*str == ':')
+ {
+ ++str;
+ if (str == end || *str != ':')
+ return false;
+ }
+
+ curtok = str;
+ saw_xdigit = false;
+ val = 0;
+
+ while (str < end)
+ {
+ int ch = *str++;
+
+ /* if ch is a number, add it to val. */
+ if (c_isxdigit (ch))
+ {
+ val <<= 4;
+ val |= _unhex (ch);
+ if (val > 0xffff)
+ return false;
+ saw_xdigit = true;
+ continue;
+ }
+
+ /* if ch is a colon ... */
+ if (ch == ':')
+ {
+ curtok = str;
+ if (!saw_xdigit)
+ {
+ if (colonp != NULL)
+ return false;
+ colonp = str + tp;
+ continue;
+ }
+ else if (str == end)
+ return false;
+ if (tp > ns_in6addrsz - ns_int16sz)
+ return false;
+ tp += ns_int16sz;
+ saw_xdigit = false;
+ val = 0;
+ continue;
+ }
+
+ /* if ch is a dot ... */
+ if (ch == '.' && (tp <= ns_in6addrsz - ns_inaddrsz)
+ && is_valid_ipv4_address (curtok, end) == 1)
+ {
+ tp += ns_inaddrsz;
+ saw_xdigit = false;
+ break;
+ }
+
+ return false;
+ }
+
+ if (saw_xdigit)
+ {
+ if (tp > ns_in6addrsz - ns_int16sz)
+ return false;
+ tp += ns_int16sz;
+ }
+
+ if (colonp != NULL)
+ {
+ if (tp == ns_in6addrsz)
+ return false;
+ tp = ns_in6addrsz;
+ }
+
+ if (tp != ns_in6addrsz)
+ return false;
+
+ return true;
+}
+
+/* Simple host cache, used by lookup_host to speed up resolving. The
+ cache doesn't handle TTL because Wget is a fairly short-lived
+ application. Refreshing is attempted when connect fails, though --
+ see connect_to_host. */
+
+/* Mapping between known hosts and to lists of their addresses. */
+static struct hash_table *host_name_addresses_map;
+
+
+/* Return the host's resolved addresses from the cache, if
+ available. */
+
+static struct address_list *
+cache_query (const char *host)
+{
+ struct address_list *al;
+ if (!host_name_addresses_map)
+ return NULL;
+ al = hash_table_get (host_name_addresses_map, host);
+ if (al)
+ {
+ DEBUGP (("Found %s in host_name_addresses_map (%p)\n", host, (void *) al));
+ ++al->refcount;
+ return al;
+ }
+ return NULL;
+}
+
+/* Cache the DNS lookup of HOST. Subsequent invocations of
+ lookup_host will return the cached value. */
+
+static void
+cache_store (const char *host, struct address_list *al)
+{
+ if (!host_name_addresses_map)
+ host_name_addresses_map = make_nocase_string_hash_table (0);
+
+ ++al->refcount;
+ hash_table_put (host_name_addresses_map, xstrdup_lower (host), al);
+
+ IF_DEBUG
+ {
+ int i;
+ debug_logprintf ("Caching %s =>", host);
+ for (i = 0; i < al->count; i++)
+ debug_logprintf (" %s", print_address (al->addresses + i));
+ debug_logprintf ("\n");
+ }
+}
+
+/* Remove HOST from the DNS cache. Does nothing is HOST is not in
+ the cache. */
+
+static void
+cache_remove (const char *host)
+{
+ struct address_list *al;
+ if (!host_name_addresses_map)
+ return;
+ al = hash_table_get (host_name_addresses_map, host);
+ if (al)
+ {
+ address_list_release (al);
+ hash_table_remove (host_name_addresses_map, host);
+ }
+}
+
+#ifdef HAVE_LIBCARES
+#include <sys/select.h>
+#include <ares.h>
+extern ares_channel ares;
+
+static struct address_list *
+merge_address_lists (struct address_list *al1, struct address_list *al2)
+{
+ int count = al1->count + al2->count;
+
+ /* merge al2 into al1 */
+ al1->addresses = xrealloc (al1->addresses, sizeof (ip_address) * count);
+ memcpy (al1->addresses + al1->count, al2->addresses, sizeof (ip_address) * al2->count);
+ al1->count = count;
+
+ address_list_delete (al2);
+
+ return al1;
+}
+
+static struct address_list *
+address_list_from_hostent (struct hostent *host)
+{
+ int count, i;
+ struct address_list *al = xnew0 (struct address_list);
+
+ for (count = 0; host->h_addr_list[count]; count++)
+ ;
+
+ assert (count > 0);
+
+ al->addresses = xnew_array (ip_address, count);
+ al->count = count;
+ al->refcount = 1;
+
+ for (i = 0; i < count; i++)
+ {
+ ip_address *ip = &al->addresses[i];
+ ip->family = host->h_addrtype;
+ memcpy (IP_INADDR_DATA (ip), host->h_addr_list[i], ip->family == AF_INET ? 4 : 16);
+ }
+
+ return al;
+}
+
+/* Since GnuLib's select() (i.e. rpl_select()) cannot handle socket-numbers
+ * returned from C-ares, we must use the original select() from Winsock.
+ */
+#ifdef WINDOWS
+#undef select
+#endif
+
+static void
+wait_ares (ares_channel channel)
+{
+ struct ptimer *timer = NULL;
+
+ if (opt.dns_timeout)
+ timer = ptimer_new ();
+
+ for (;;)
+ {
+ struct timeval *tvp, tv;
+ fd_set read_fds, write_fds;
+ int nfds, rc;
+
+ FD_ZERO (&read_fds);
+ FD_ZERO (&write_fds);
+ nfds = ares_fds (channel, &read_fds, &write_fds);
+ if (nfds == 0)
+ break;
+
+ if (timer)
+ {
+ double max = opt.dns_timeout - ptimer_measure (timer);
+
+ tv.tv_sec = (long) max;
+ tv.tv_usec = 1000000 * (max - (long) max);
+ tvp = ares_timeout (channel, &tv, &tv);
+ }
+ else
+ tvp = ares_timeout (channel, NULL, &tv);
+
+ rc = select (nfds, &read_fds, &write_fds, NULL, tvp);
+ if (rc == 0 && timer && ptimer_measure (timer) >= opt.dns_timeout)
+ ares_cancel (channel);
+ else
+ ares_process (channel, &read_fds, &write_fds);
+ }
+ if (timer)
+ ptimer_destroy (timer);
+}
+
+static void
+callback (void *arg, int status, int timeouts _GL_UNUSED, struct hostent *host)
+{
+ struct address_list **al = (struct address_list **) arg;
+
+ if (!host || status != ARES_SUCCESS)
+ {
+ *al = NULL;
+ return;
+ }
+
+ *al = address_list_from_hostent (host);
+}
+#endif
+
+/* Look up HOST in DNS and return a list of IP addresses.
+
+ This function caches its result so that, if the same host is passed
+ the second time, the addresses are returned without DNS lookup.
+ (Use LH_REFRESH to force lookup, or set opt.dns_cache to 0 to
+ globally disable caching.)
+
+ The order of the returned addresses is affected by the setting of
+ opt.prefer_family: if it is set to prefer_ipv4, IPv4 addresses are
+ placed at the beginning; if it is prefer_ipv6, IPv6 ones are placed
+ at the beginning; otherwise, the order is left intact. The
+ relative order of addresses with the same family is left
+ undisturbed in either case.
+
+ FLAGS can be a combination of:
+ LH_SILENT - don't print the "resolving ... done" messages.
+ LH_BIND - resolve addresses for use with bind, which under
+ IPv6 means to use AI_PASSIVE flag to getaddrinfo.
+ Passive lookups are not cached under IPv6.
+ LH_REFRESH - if HOST is cached, remove the entry from the cache
+ and resolve it anew. */
+
+struct address_list *
+lookup_host (const char *host, int flags)
+{
+ struct address_list *al;
+ bool silent = !!(flags & LH_SILENT);
+ bool use_cache;
+ bool numeric_address = false;
+ double timeout = opt.dns_timeout;
+
+#ifndef ENABLE_IPV6
+ /* If we're not using getaddrinfo, first check if HOST specifies a
+ numeric IPv4 address. Some implementations of gethostbyname
+ (e.g. the Ultrix one and possibly Winsock) don't accept
+ dotted-decimal IPv4 addresses. */
+ {
+ uint32_t addr_ipv4 = (uint32_t)inet_addr (host);
+ if (addr_ipv4 != (uint32_t) -1)
+ {
+ /* No need to cache host->addr relation, just return the
+ address. */
+ char *vec[2];
+ vec[0] = (char *)&addr_ipv4;
+ vec[1] = NULL;
+ return address_list_from_ipv4_addresses (vec);
+ }
+ }
+#else /* ENABLE_IPV6 */
+ /* If we're using getaddrinfo, at least check whether the address is
+ already numeric, in which case there is no need to print the
+ "Resolving..." output. (This comes at no additional cost since
+ the is_valid_ipv*_address are already required for
+ url_parse.) */
+ {
+ const char *end = host + strlen (host);
+ if (is_valid_ipv4_address (host, end) || is_valid_ipv6_address (host, end))
+ numeric_address = true;
+ }
+#endif
+
+ /* Cache is normally on, but can be turned off with --no-dns-cache.
+ Don't cache passive lookups under IPv6. */
+ use_cache = opt.dns_cache;
+#ifdef ENABLE_IPV6
+ if ((flags & LH_BIND) || numeric_address)
+ use_cache = false;
+#endif
+
+ /* Try to find the host in the cache so we don't need to talk to the
+ resolver. If LH_REFRESH is requested, remove HOST from the cache
+ instead. */
+ if (use_cache)
+ {
+ if (!(flags & LH_REFRESH))
+ {
+ al = cache_query (host);
+ if (al)
+ return al;
+ }
+ else
+ cache_remove (host);
+ }
+
+ /* No luck with the cache; resolve HOST. */
+
+ if (!silent && !numeric_address)
+ {
+ char *str = NULL, *name;
+
+ if (opt.enable_iri && (name = idn_decode ((char *) host)) != NULL)
+ {
+ str = aprintf ("%s (%s)", name, host);
+ xfree (name);
+ }
+
+ logprintf (LOG_VERBOSE, _("Resolving %s... "),
+ quotearg_style (escape_quoting_style, str ? str : host));
+
+ xfree (str);
+ }
+
+#ifdef ENABLE_IPV6
+#ifdef HAVE_LIBCARES
+ if (ares)
+ {
+ struct address_list *al4 = NULL;
+ struct address_list *al6 = NULL;
+
+ if (opt.ipv4_only || !opt.ipv6_only)
+ ares_gethostbyname (ares, host, AF_INET, callback, &al4);
+ if (opt.ipv6_only || !opt.ipv4_only)
+ ares_gethostbyname (ares, host, AF_INET6, callback, &al6);
+
+ wait_ares (ares);
+
+ if (al4 && al6)
+ al = merge_address_lists (al4, al6);
+ else if (al4)
+ al = al4;
+ else
+ al = al6;
+ }
+ else
+#endif
+ {
+ int err;
+ struct addrinfo hints, *res;
+
+ xzero (hints);
+ hints.ai_socktype = SOCK_STREAM;
+ if (opt.ipv4_only)
+ hints.ai_family = AF_INET;
+ else if (opt.ipv6_only)
+ hints.ai_family = AF_INET6;
+ else
+ /* We tried using AI_ADDRCONFIG, but removed it because: it
+ misinterprets IPv6 loopbacks, it is broken on AIX 5.1, and
+ it's unneeded since we sort the addresses anyway. */
+ hints.ai_family = AF_UNSPEC;
+
+ if (flags & LH_BIND)
+ hints.ai_flags |= AI_PASSIVE;
+
+#ifdef AI_NUMERICHOST
+ if (numeric_address)
+ {
+ /* Where available, the AI_NUMERICHOST hint can prevent costly
+ access to DNS servers. */
+ hints.ai_flags |= AI_NUMERICHOST;
+ timeout = 0; /* no timeout needed when "resolving"
+ numeric hosts -- avoid setting up
+ signal handlers and such. */
+ }
+#endif
+
+ err = getaddrinfo_with_timeout (host, NULL, &hints, &res, timeout);
+
+ if (err != 0 || res == NULL)
+ {
+ if (!silent)
+ logprintf (LOG_VERBOSE, _ ("failed: %s.\n"),
+ err != EAI_SYSTEM ? gai_strerror (err) : strerror (errno));
+ return NULL;
+ }
+ al = address_list_from_addrinfo (res);
+ freeaddrinfo (res);
+ }
+
+ if (!al)
+ {
+ logprintf (LOG_VERBOSE,
+ _ ("failed: No IPv4/IPv6 addresses for host.\n"));
+ return NULL;
+ }
+
+ /* Reorder addresses so that IPv4 ones (or IPv6 ones, as per
+ --prefer-family) come first. Sorting is stable so the order of
+ the addresses with the same family is undisturbed. */
+ if (al->count > 1 && opt.prefer_family != prefer_none)
+ stable_sort (al->addresses, al->count, sizeof (ip_address),
+ opt.prefer_family == prefer_ipv4
+ ? cmp_prefer_ipv4 : cmp_prefer_ipv6);
+#else /* not ENABLE_IPV6 */
+#ifdef HAVE_LIBCARES
+ if (ares)
+ {
+ ares_gethostbyname (ares, host, AF_INET, callback, &al);
+ wait_ares (ares);
+ }
+ else
+#endif
+ {
+ struct hostent *hptr = gethostbyname_with_timeout (host, timeout);
+ if (!hptr)
+ {
+ if (!silent)
+ {
+ if (errno != ETIMEDOUT)
+ logprintf (LOG_VERBOSE, _ ("failed: %s.\n"),
+ host_errstr (h_errno));
+ else
+ logputs (LOG_VERBOSE, _ ("failed: timed out.\n"));
+ }
+ return NULL;
+ }
+ /* Do older systems have h_addr_list? */
+ al = address_list_from_ipv4_addresses (hptr->h_addr_list);
+ }
+#endif /* not ENABLE_IPV6 */
+
+ /* Print the addresses determined by DNS lookup, but no more than
+ three if show_all_dns_entries is not specified. */
+ if (!silent && !numeric_address)
+ {
+ int i;
+ int printmax = al->count;
+
+ if (!opt.show_all_dns_entries && printmax > 3)
+ printmax = 3;
+
+ for (i = 0; i < printmax; i++)
+ {
+ logputs (LOG_VERBOSE, print_address (al->addresses + i));
+ if (i < printmax - 1)
+ logputs (LOG_VERBOSE, ", ");
+ }
+ if (printmax != al->count)
+ logputs (LOG_VERBOSE, ", ...");
+ logputs (LOG_VERBOSE, "\n");
+ }
+
+ /* Cache the lookup information. */
+ if (use_cache)
+ cache_store (host, al);
+
+ return al;
+}
+
+/* Determine whether a URL is acceptable to be followed, according to
+ a list of domains to accept. */
+bool
+accept_domain (struct url *u)
+{
+ assert (u->host != NULL);
+ if (opt.domains)
+ {
+ if (!sufmatch ((const char **)opt.domains, u->host))
+ return false;
+ }
+ if (opt.exclude_domains)
+ {
+ if (sufmatch ((const char **)opt.exclude_domains, u->host))
+ return false;
+ }
+ return true;
+}
+
+/* Check whether WHAT is matched in LIST, each element of LIST being a
+ pattern to match WHAT against, using backward matching (see
+ match_backwards() in utils.c).
+
+ If an element of LIST matched, 1 is returned, 0 otherwise. */
+bool
+sufmatch (const char **list, const char *what)
+{
+ int i, j, k, lw;
+
+ lw = strlen (what);
+
+ for (i = 0; list[i]; i++)
+ {
+ j = strlen (list[i]);
+ if (lw < j)
+ continue; /* what is no (sub)domain of list[i] */
+
+ for (k = lw; j >= 0 && k >= 0; j--, k--)
+ if (c_tolower (list[i][j]) != c_tolower (what[k]))
+ break;
+
+ /* Domain or subdomain match
+ * k == -1: exact match
+ * k >= 0 && what[k] == '.': subdomain match
+ * k >= 0 && list[i][0] == '.': dot-prefixed subdomain match
+ */
+ if (j == -1 && (k == -1 || what[k] == '.' || list[i][0] == '.'))
+ return true;
+ }
+
+ return false;
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+host_cleanup (void)
+{
+ if (host_name_addresses_map)
+ {
+ hash_table_iterator iter;
+ for (hash_table_iterate (host_name_addresses_map, &iter);
+ hash_table_iter_next (&iter);
+ )
+ {
+ char *host = iter.key;
+ struct address_list *al = iter.value;
+ xfree (host);
+ assert (al->refcount == 1);
+ address_list_delete (al);
+ }
+ hash_table_destroy (host_name_addresses_map);
+ host_name_addresses_map = NULL;
+ }
+}
+#endif
+
+bool
+is_valid_ip_address (const char *name)
+{
+ const char *endp;
+
+ endp = name + strlen(name);
+ if (is_valid_ipv4_address (name, endp))
+ return true;
+#ifdef ENABLE_IPV6
+ if (is_valid_ipv6_address (name, endp))
+ return true;
+#endif
+ return false;
+}
diff --git a/src/host.h b/src/host.h
new file mode 100644
index 0000000..a199d26
--- /dev/null
+++ b/src/host.h
@@ -0,0 +1,107 @@
+/* Declarations for host.c
+ Copyright (C) 1996-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef HOST_H
+#define HOST_H
+
+#ifdef WINDOWS
+# include <winsock2.h>
+#else
+# ifdef __VMS
+# include "vms_ip.h"
+# else /* def __VMS */
+# include <netdb.h>
+# endif /* def __VMS [else] */
+# include <sys/socket.h>
+# include <netinet/in.h>
+#ifndef __BEOS__
+# include <arpa/inet.h>
+#endif
+#endif
+
+struct url;
+struct address_list;
+
+/* This struct defines an IP address, tagged with family type. */
+
+typedef struct {
+ /* Address family, one of AF_INET or AF_INET6. */
+ int family;
+
+ /* The actual data, in the form of struct in_addr or in6_addr: */
+ union {
+ struct in_addr d4; /* IPv4 address */
+#ifdef ENABLE_IPV6
+ struct in6_addr d6; /* IPv6 address */
+#endif
+ } data;
+
+ /* Under IPv6 getaddrinfo also returns scope_id. Since it's
+ IPv6-specific it strictly belongs in the above union, but we put
+ it here for simplicity. */
+#if defined ENABLE_IPV6 && defined HAVE_SOCKADDR_IN6_SCOPE_ID
+ int ipv6_scope;
+#endif
+} ip_address;
+
+/* IP_INADDR_DATA macro returns a void pointer that can be interpreted
+ as a pointer to struct in_addr in IPv4 context or a pointer to
+ struct in6_addr in IPv4 context. This pointer can be passed to
+ functions that work on either, such as inet_ntop. */
+#define IP_INADDR_DATA(x) ((void *) &(x)->data)
+
+enum {
+ LH_SILENT = 1,
+ LH_BIND = 2,
+ LH_REFRESH = 4
+};
+struct address_list *lookup_host (const char *, int);
+
+void address_list_get_bounds (const struct address_list *, int *, int *);
+const ip_address *address_list_address_at (const struct address_list *, int);
+bool address_list_contains (const struct address_list *, const ip_address *);
+void address_list_set_faulty (struct address_list *, int);
+void address_list_set_connected (struct address_list *);
+bool address_list_connected_p (const struct address_list *);
+void address_list_release (struct address_list *);
+
+const char *print_address (const ip_address *);
+#ifdef ENABLE_IPV6
+bool is_valid_ipv6_address (const char *, const char *);
+#endif
+
+bool is_valid_ip_address (const char *name);
+
+bool accept_domain (struct url *);
+bool sufmatch (const char **, const char *);
+
+void host_cleanup (void);
+
+#endif /* HOST_H */
diff --git a/src/hsts.c b/src/hsts.c
new file mode 100644
index 0000000..914d270
--- /dev/null
+++ b/src/hsts.c
@@ -0,0 +1,829 @@
+/* HTTP Strict Transport Security (HSTS) support.
+ Copyright (C) 1996-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+#include "wget.h"
+
+#ifdef HAVE_HSTS
+#include "hsts.h"
+#include "utils.h"
+#include "host.h" /* for is_valid_ip_address() */
+#include "hash.h"
+#include "c-ctype.h"
+#ifdef TESTING
+#include "init.h" /* for ajoin_dir_file() */
+#include "../tests/unit-tests.h"
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/file.h>
+
+struct hsts_store {
+ struct hash_table *table;
+ time_t last_mtime;
+ bool changed;
+};
+
+struct hsts_kh {
+ char *host;
+ int explicit_port;
+};
+
+struct hsts_kh_info {
+ time_t created;
+ time_t max_age;
+ bool include_subdomains;
+};
+
+enum hsts_kh_match {
+ NO_MATCH,
+ SUPERDOMAIN_MATCH,
+ CONGRUENT_MATCH
+};
+
+#define hsts_is_host_name_valid(host) (!is_valid_ip_address (host))
+#define hsts_is_scheme_valid(scheme) (scheme == SCHEME_HTTPS)
+#define hsts_is_host_eligible(scheme, host) \
+ (hsts_is_scheme_valid (scheme) && hsts_is_host_name_valid (host))
+
+#define DEFAULT_HTTP_PORT 80
+#define DEFAULT_SSL_PORT 443
+#define MAKE_EXPLICIT_PORT(s, p) (s == SCHEME_HTTPS ? (p == DEFAULT_SSL_PORT ? 0 : p) \
+ : (p == DEFAULT_HTTP_PORT ? 0 : p))
+
+/* Hashing and comparison functions for the hash table */
+
+#ifdef __clang__
+__attribute__((no_sanitize("integer")))
+#endif
+static unsigned long
+hsts_hash_func (const void *key)
+{
+ struct hsts_kh *k = (struct hsts_kh *) key;
+ const char *h = NULL;
+ unsigned int hash = k->explicit_port;
+
+ for (h = k->host; *h; h++)
+ hash = hash * 31 + *h;
+
+ return hash;
+}
+
+static int
+hsts_cmp_func (const void *h1, const void *h2)
+{
+ struct hsts_kh *kh1 = (struct hsts_kh *) h1,
+ *kh2 = (struct hsts_kh *) h2;
+
+ return (!strcmp (kh1->host, kh2->host)) && (kh1->explicit_port == kh2->explicit_port);
+}
+
+/* Private functions. Feel free to make some of these public when needed. */
+
+static struct hsts_kh_info *
+hsts_find_entry (hsts_store_t store,
+ const char *host, int explicit_port,
+ enum hsts_kh_match *match_type,
+ struct hsts_kh *kh)
+{
+ struct hsts_kh *k = NULL;
+ struct hsts_kh_info *khi = NULL;
+ enum hsts_kh_match match = NO_MATCH;
+ char *pos = NULL;
+ char *org_ptr = NULL;
+
+ k = (struct hsts_kh *) xnew (struct hsts_kh);
+ k->host = xstrdup_lower (host);
+ k->explicit_port = explicit_port;
+
+ /* save pointer so that we don't get into trouble later when freeing */
+ org_ptr = k->host;
+
+ khi = (struct hsts_kh_info *) hash_table_get (store->table, k);
+ if (khi)
+ {
+ match = CONGRUENT_MATCH;
+ goto end;
+ }
+
+ while (match == NO_MATCH &&
+ (pos = strchr (k->host, '.')) && pos - k->host > 0 &&
+ strchr (pos + 1, '.'))
+ {
+ k->host += (pos - k->host + 1);
+ khi = (struct hsts_kh_info *) hash_table_get (store->table, k);
+ if (khi)
+ match = SUPERDOMAIN_MATCH;
+ }
+
+end:
+ /* restore pointer or we'll get a SEGV */
+ k->host = org_ptr;
+
+ /* copy parameters to previous frame */
+ if (match_type)
+ *match_type = match;
+ if (kh)
+ memcpy (kh, k, sizeof (struct hsts_kh));
+ else
+ xfree (k->host);
+
+ xfree (k);
+ return khi;
+}
+
+static bool
+hsts_new_entry_internal (hsts_store_t store,
+ const char *host, int port,
+ time_t created, time_t max_age,
+ bool include_subdomains,
+ bool check_validity,
+ bool check_expired,
+ bool check_duplicates)
+{
+ struct hsts_kh *kh = xnew (struct hsts_kh);
+ struct hsts_kh_info *khi = xnew0 (struct hsts_kh_info);
+ bool success = false;
+
+ kh->host = xstrdup_lower (host);
+ kh->explicit_port = MAKE_EXPLICIT_PORT (SCHEME_HTTPS, port);
+
+ khi->created = created;
+ khi->max_age = max_age;
+ khi->include_subdomains = include_subdomains;
+
+ /* Check validity */
+ if (check_validity && !hsts_is_host_name_valid (host))
+ goto bail;
+
+ if (check_expired && ((khi->created + khi->max_age) < khi->created))
+ goto bail;
+
+ if (check_duplicates && hash_table_contains (store->table, kh))
+ goto bail;
+
+ /* Now store the new entry */
+ hash_table_put (store->table, kh, khi);
+ success = true;
+
+bail:
+ if (!success)
+ {
+ /* abort! */
+ xfree (kh->host);
+ xfree (kh);
+ xfree (khi);
+ }
+
+ return success;
+}
+
+/*
+ Creates a new entry, but does not check whether that entry already exists.
+ This function assumes that check has already been done by the caller.
+ */
+static bool
+hsts_add_entry (hsts_store_t store,
+ const char *host, int port,
+ time_t max_age, bool include_subdomains)
+{
+ time_t t = time (NULL);
+
+ /* It might happen time() returned -1 */
+ return (t == (time_t)(-1) ?
+ false :
+ hsts_new_entry_internal (store, host, port, t, max_age, include_subdomains, false, true, false));
+}
+
+/* Creates a new entry, unless an identical one already exists. */
+static bool
+hsts_new_entry (hsts_store_t store,
+ const char *host, int port,
+ time_t created, time_t max_age,
+ bool include_subdomains)
+{
+ return hsts_new_entry_internal (store, host, port, created, max_age, include_subdomains, true, true, true);
+}
+
+static void
+hsts_remove_entry (hsts_store_t store, struct hsts_kh *kh)
+{
+ hash_table_remove (store->table, kh);
+}
+
+static bool
+hsts_store_merge (hsts_store_t store,
+ const char *host, int port,
+ time_t created, time_t max_age,
+ bool include_subdomains)
+{
+ enum hsts_kh_match match_type = NO_MATCH;
+ struct hsts_kh_info *khi = NULL;
+ bool success = false;
+
+ port = MAKE_EXPLICIT_PORT (SCHEME_HTTPS, port);
+ khi = hsts_find_entry (store, host, port, &match_type, NULL);
+ if (khi && match_type == CONGRUENT_MATCH && created > khi->created)
+ {
+ /* update the entry with the new info */
+ khi->created = created;
+ khi->max_age = max_age;
+ khi->include_subdomains = include_subdomains;
+
+ success = true;
+ }
+ else if (!khi)
+ success = hsts_new_entry (store, host, port, created, max_age, include_subdomains);
+
+ return success;
+}
+
+static bool
+hsts_read_database (hsts_store_t store, FILE *fp, bool merge_with_existing_entries)
+{
+ char *line = NULL, *p;
+ size_t len = 0;
+ int items_read;
+ bool result = false;
+ bool (*func)(hsts_store_t, const char *, int, time_t, time_t, bool);
+
+ char host[256];
+ int port;
+ time_t created, max_age;
+ int include_subdomains;
+
+ func = (merge_with_existing_entries ? hsts_store_merge : hsts_new_entry);
+
+ while (getline (&line, &len, fp) > 0)
+ {
+ for (p = line; c_isspace (*p); p++)
+ ;
+
+ if (*p == '#')
+ continue;
+
+ items_read = sscanf (p, "%255s %d %d %lu %lu",
+ host,
+ &port,
+ &include_subdomains,
+ (unsigned long *) &created,
+ (unsigned long *) &max_age);
+
+ if (items_read == 5)
+ func (store, host, port, created, max_age, !!include_subdomains);
+ }
+
+ xfree (line);
+ result = true;
+
+ return result;
+}
+
+static void
+hsts_store_dump (hsts_store_t store, FILE *fp)
+{
+ hash_table_iterator it;
+
+ /* Print preliminary comments. We don't care if any of these fail. */
+ fputs ("# HSTS 1.0 Known Hosts database for GNU Wget.\n", fp);
+ fputs ("# Edit at your own risk.\n", fp);
+ fputs ("# <hostname>\t<port>\t<incl. subdomains>\t<created>\t<max-age>\n", fp);
+
+ /* Now cycle through the HSTS store in memory and dump the entries */
+ for (hash_table_iterate (store->table, &it); hash_table_iter_next (&it);)
+ {
+ struct hsts_kh *kh = (struct hsts_kh *) it.key;
+ struct hsts_kh_info *khi = (struct hsts_kh_info *) it.value;
+
+ if (fprintf (fp, "%s\t%d\t%d\t%lu\t%lu\n",
+ kh->host, kh->explicit_port, khi->include_subdomains,
+ (unsigned long) khi->created,
+ (unsigned long) khi->max_age) < 0)
+ {
+ logprintf (LOG_ALWAYS, "Could not write the HSTS database correctly.\n");
+ break;
+ }
+ }
+}
+
+/*
+ * Test:
+ * - The file is a regular file (ie. not a symlink), and
+ * - The file is not world-writable.
+ */
+static bool
+hsts_file_access_valid (const char *filename)
+{
+ struct stat st;
+
+ if (stat (filename, &st) == -1)
+ return false;
+
+ return
+#ifndef WINDOWS
+ /*
+ * The world-writable concept is a Unix-centric notion.
+ * We bypass this test on Windows.
+ */
+ !(st.st_mode & S_IWOTH) &&
+#endif
+ S_ISREG (st.st_mode);
+}
+
+/* HSTS API */
+
+/*
+ Changes the given URLs according to the HSTS policy.
+
+ If there's no host in the store that either congruently
+ or not, matches the given URL, no changes are made.
+ Returns true if the URL was changed, or false
+ if it was left intact.
+ */
+bool
+hsts_match (hsts_store_t store, struct url *u)
+{
+ bool url_changed = false;
+ struct hsts_kh_info *entry = NULL;
+ struct hsts_kh *kh = xnew(struct hsts_kh);
+ enum hsts_kh_match match = NO_MATCH;
+ int port = MAKE_EXPLICIT_PORT (u->scheme, u->port);
+
+ /* avoid doing any computation if we're already in HTTPS */
+ if (!hsts_is_scheme_valid (u->scheme))
+ {
+ entry = hsts_find_entry (store, u->host, port, &match, kh);
+ if (entry)
+ {
+ if ((entry->created + entry->max_age) >= time(NULL))
+ {
+ if ((match == CONGRUENT_MATCH) ||
+ (match == SUPERDOMAIN_MATCH && entry->include_subdomains))
+ {
+ /* we found a matching Known HSTS Host
+ rewrite the URL */
+ u->scheme = SCHEME_HTTPS;
+ if (u->port == 80)
+ u->port = 443;
+ url_changed = true;
+ store->changed = true;
+ }
+ }
+ else
+ {
+ hsts_remove_entry (store, kh);
+ store->changed = true;
+ }
+ }
+ xfree (kh->host);
+ }
+
+ xfree (kh);
+
+ return url_changed;
+}
+
+/*
+ Add a new HSTS Known Host to the HSTS store.
+
+ If the host already exists, its information is updated,
+ or it'll be removed from the store if max_age is zero.
+
+ Bear in mind that the store is kept in memory, and will not
+ be written to disk until hsts_store_save is called.
+ This function regrows the in-memory HSTS store if necessary.
+
+ Currently, for a host to be taken into consideration,
+ two conditions have to be met:
+ - Connection must be through a secure channel (HTTPS).
+ - The host must not be an IPv4 or IPv6 address.
+
+ The RFC 6797 states that hosts that match IPv4 or IPv6 format
+ should be discarded at URI rewrite time. But we short-circuit
+ that check here, since there's no point in storing a host that
+ will never be matched.
+
+ Returns true if a new entry was actually created, or false
+ if an existing entry was updated/deleted. */
+bool
+hsts_store_entry (hsts_store_t store,
+ enum url_scheme scheme, const char *host, int port,
+ time_t max_age, bool include_subdomains)
+{
+ bool result = false;
+ enum hsts_kh_match match = NO_MATCH;
+ struct hsts_kh *kh = xnew(struct hsts_kh);
+ struct hsts_kh_info *entry = NULL;
+
+ if (hsts_is_host_eligible (scheme, host))
+ {
+ port = MAKE_EXPLICIT_PORT (scheme, port);
+ entry = hsts_find_entry (store, host, port, &match, kh);
+ if (entry && match == CONGRUENT_MATCH)
+ {
+ if (max_age == 0)
+ {
+ hsts_remove_entry (store, kh);
+ store->changed = true;
+ }
+ else if (max_age > 0)
+ {
+ /* RFC 6797 states that 'max_age' is a TTL relative to the
+ * reception of the STS header so we have to update the
+ * 'created' field too. The RFC also states that we have to
+ * update the entry each time we see HSTS header.
+ * See also Section 11.2. */
+ time_t t = time (NULL);
+
+ if (t != (time_t)(-1) && t != entry->created)
+ {
+ entry->created = t;
+ entry->max_age = max_age;
+ entry->include_subdomains = include_subdomains;
+ store->changed = true;
+ }
+ }
+ /* we ignore negative max_ages */
+ }
+ else if (entry == NULL || match == SUPERDOMAIN_MATCH)
+ {
+ /* Either we didn't find a matching host,
+ or we got a superdomain match.
+ In either case, we create a new entry.
+
+ We have to perform an explicit check because it might
+ happen we got a non-existent entry with max_age == 0.
+ */
+ result = hsts_add_entry (store, host, port, max_age, include_subdomains);
+ if (result)
+ store->changed = true;
+ }
+ /* we ignore new entries with max_age == 0 */
+ xfree (kh->host);
+ }
+
+ xfree (kh);
+
+ return result;
+}
+
+hsts_store_t
+hsts_store_open (const char *filename)
+{
+ hsts_store_t store = NULL;
+ file_stats_t fstats;
+
+ store = xnew0 (struct hsts_store);
+ store->table = hash_table_new (0, hsts_hash_func, hsts_cmp_func);
+ store->last_mtime = 0;
+ store->changed = false;
+
+ if (file_exists_p (filename, &fstats))
+ {
+ if (hsts_file_access_valid (filename))
+ {
+ struct stat st;
+ FILE *fp = fopen_stat (filename, "r", &fstats);
+
+ if (!fp || !hsts_read_database (store, fp, false))
+ {
+ /* abort! */
+ hsts_store_close (store);
+ xfree (store);
+ if (fp)
+ fclose (fp);
+ goto out;
+ }
+
+ if (fstat (fileno (fp), &st) == 0)
+ store->last_mtime = st.st_mtime;
+
+ fclose (fp);
+ }
+ else
+ {
+ /*
+ * If we're not reading the HSTS database,
+ * then by all means act as if HSTS was disabled.
+ */
+ hsts_store_close (store);
+ xfree (store);
+
+ logprintf (LOG_NOTQUIET, "Will not apply HSTS. "
+ "The HSTS database must be a regular and non-world-writable file.\n");
+ }
+ }
+
+out:
+ return store;
+}
+
+void
+hsts_store_save (hsts_store_t store, const char *filename)
+{
+ struct stat st;
+ FILE *fp = NULL;
+ int fd = 0;
+
+ if (filename && hash_table_count (store->table) > 0)
+ {
+ fp = fopen (filename, "a+");
+ if (fp)
+ {
+ /* Lock the file to avoid potential race conditions */
+ fd = fileno (fp);
+ flock (fd, LOCK_EX);
+
+ /* If the file has changed, merge the changes with our in-memory data
+ before dumping them to the file.
+ Otherwise we could potentially overwrite the data stored by other Wget processes.
+ */
+ if (store->last_mtime && stat (filename, &st) == 0 && st.st_mtime > store->last_mtime)
+ hsts_read_database (store, fp, true);
+
+ /* We've merged the latest changes so we can now truncate the file
+ and dump everything. */
+ fseek (fp, 0, SEEK_SET);
+ ftruncate (fd, 0);
+
+ /* now dump to the file */
+ hsts_store_dump (store, fp);
+
+ /* fclose is expected to unlock the file for us */
+ fclose (fp);
+ }
+ }
+}
+
+bool
+hsts_store_has_changed (hsts_store_t store)
+{
+ return (store ? store->changed : false);
+}
+
+void
+hsts_store_close (hsts_store_t store)
+{
+ hash_table_iterator it;
+
+ /* free all the host fields */
+ for (hash_table_iterate (store->table, &it); hash_table_iter_next (&it);)
+ {
+ xfree (((struct hsts_kh *) it.key)->host);
+ xfree (it.key);
+ xfree (it.value);
+ }
+
+ hash_table_destroy (store->table);
+}
+
+#ifdef TESTING
+/* I know I'm really evil because I'm writing macros
+ that change control flow. But we're testing, who will tell? :D
+ */
+#define TEST_URL_RW(s, u, p) do { \
+ if (test_url_rewrite (s, u, p, true)) \
+ return test_url_rewrite (s, u, p, true); \
+ } while (0)
+
+#define TEST_URL_NORW(s, u, p) do { \
+ if (test_url_rewrite (s, u, p, false)) \
+ return test_url_rewrite (s, u, p, false); \
+ } while (0)
+
+static char *
+get_hsts_store_filename (void)
+{
+ char *filename = NULL;
+ FILE *fp = NULL;
+
+ if (opt.homedir)
+ {
+ filename = ajoin_dir_file (opt.homedir, ".wget-hsts-test");
+ fp = fopen (filename, "w");
+ if (fp)
+ fclose (fp);
+ }
+
+ return filename;
+}
+
+static hsts_store_t
+open_hsts_test_store (void)
+{
+ char *filename = NULL;
+ hsts_store_t table = NULL;
+
+ filename = get_hsts_store_filename ();
+ table = hsts_store_open (filename);
+ xfree (filename);
+
+ return table;
+}
+
+static void
+close_hsts_test_store (hsts_store_t store)
+{
+ char *filename;
+
+ if ((filename = get_hsts_store_filename ()))
+ {
+ unlink (filename);
+ xfree (filename);
+ }
+ xfree (store);
+}
+
+static const char*
+test_url_rewrite (hsts_store_t s, const char *url, int port, bool rewrite)
+{
+ bool result;
+ struct url u;
+
+ u.host = xstrdup (url);
+ u.port = port;
+ u.scheme = SCHEME_HTTP;
+
+ result = hsts_match (s, &u);
+
+ if (rewrite)
+ {
+ if (port == 80)
+ mu_assert("URL: port should've been rewritten to 443", u.port == 443);
+ else
+ mu_assert("URL: port should've been left intact", u.port == port);
+ mu_assert("URL: scheme should've been rewritten to HTTPS", u.scheme == SCHEME_HTTPS);
+ mu_assert("result should've been true", result == true);
+ }
+ else
+ {
+ mu_assert("URL: port should've been left intact", u.port == port);
+ mu_assert("URL: scheme should've been left intact", u.scheme == SCHEME_HTTP);
+ mu_assert("result should've been false", result == false);
+ }
+
+ xfree (u.host);
+ return NULL;
+}
+
+const char *
+test_hsts_new_entry (void)
+{
+ enum hsts_kh_match match = NO_MATCH;
+ struct hsts_kh_info *khi;
+ hsts_store_t s;
+ bool created;
+
+ s = open_hsts_test_store ();
+ mu_assert("Could not open the HSTS store. This could be due to lack of memory.", s != NULL);
+
+ created = hsts_store_entry (s, SCHEME_HTTP, "www.foo.com", 80, 1234, true);
+ mu_assert("No entry should have been created.", created == false);
+
+ created = hsts_store_entry (s, SCHEME_HTTPS, "www.foo.com", 443, 1234, true);
+ mu_assert("A new entry should have been created", created == true);
+
+ khi = hsts_find_entry (s, "www.foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been a congruent match", match == CONGRUENT_MATCH);
+ mu_assert("No valid HSTS info was returned", khi != NULL);
+ mu_assert("Variable 'max_age' should be 1234", khi->max_age == 1234);
+ mu_assert("Variable 'include_subdomains' should be asserted", khi->include_subdomains == true);
+
+ khi = hsts_find_entry (s, "b.www.foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been a superdomain match", match == SUPERDOMAIN_MATCH);
+ mu_assert("No valid HSTS info was returned", khi != NULL);
+ mu_assert("Variable 'max_age' should be 1234", khi->max_age == 1234);
+ mu_assert("Variable 'include_subdomains' should be asserted", khi->include_subdomains == true);
+
+ khi = hsts_find_entry (s, "ww.foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been no match", match == NO_MATCH);
+
+ khi = hsts_find_entry (s, "foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been no match", match == NO_MATCH);
+
+ khi = hsts_find_entry (s, ".foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been no match", match == NO_MATCH);
+
+ khi = hsts_find_entry (s, ".www.foo.com", MAKE_EXPLICIT_PORT (SCHEME_HTTPS, 443), &match, NULL);
+ mu_assert("Should've been no match", match == NO_MATCH);
+
+ hsts_store_close (s);
+ close_hsts_test_store (s);
+
+ return NULL;
+}
+
+const char*
+test_hsts_url_rewrite_superdomain (void)
+{
+ hsts_store_t s;
+ bool created;
+
+ s = open_hsts_test_store ();
+ mu_assert("Could not open the HSTS store", s != NULL);
+
+ created = hsts_store_entry (s, SCHEME_HTTPS, "www.foo.com", 443, 1234, true);
+ mu_assert("A new entry should've been created", created == true);
+
+ TEST_URL_RW (s, "www.foo.com", 80);
+ TEST_URL_RW (s, "bar.www.foo.com", 80);
+
+ hsts_store_close (s);
+ close_hsts_test_store (s);
+
+ return NULL;
+}
+
+const char*
+test_hsts_url_rewrite_congruent (void)
+{
+ hsts_store_t s;
+ bool created;
+
+ s = open_hsts_test_store ();
+ mu_assert("Could not open the HSTS store", s != NULL);
+
+ created = hsts_store_entry (s, SCHEME_HTTPS, "foo.com", 443, 1234, false);
+ mu_assert("A new entry should've been created", created == true);
+
+ TEST_URL_RW (s, "foo.com", 80);
+ TEST_URL_NORW (s, "www.foo.com", 80);
+
+ hsts_store_close (s);
+ close_hsts_test_store (s);
+
+ return NULL;
+}
+
+const char*
+test_hsts_read_database (void)
+{
+ hsts_store_t table;
+ char *file = NULL;
+ FILE *fp = NULL;
+ time_t created = time(NULL) - 10;
+
+ if (opt.homedir)
+ {
+ file = ajoin_dir_file (opt.homedir, ".wget-hsts-testing");
+ fp = fopen (file, "w");
+ if (fp)
+ {
+ fputs ("# dummy comment\n", fp);
+ fprintf (fp, "foo.example.com\t0\t1\t%lu\t123\n",(unsigned long) created);
+ fprintf (fp, "bar.example.com\t0\t0\t%lu\t456\n", (unsigned long) created);
+ fprintf (fp, "test.example.com\t8080\t0\t%lu\t789\n", (unsigned long) created);
+ fclose (fp);
+
+ table = hsts_store_open (file);
+
+ TEST_URL_RW (table, "foo.example.com", 80);
+ TEST_URL_RW (table, "www.foo.example.com", 80);
+ TEST_URL_RW (table, "bar.example.com", 80);
+
+ TEST_URL_NORW(table, "www.bar.example.com", 80);
+
+ TEST_URL_RW (table, "test.example.com", 8080);
+
+ hsts_store_close (table);
+ close_hsts_test_store (table);
+ unlink (file);
+ }
+ xfree (file);
+ }
+
+ return NULL;
+}
+#endif /* TESTING */
+#endif /* HAVE_HSTS */
diff --git a/src/hsts.h b/src/hsts.h
new file mode 100644
index 0000000..7cc41e3
--- /dev/null
+++ b/src/hsts.h
@@ -0,0 +1,53 @@
+/* Declarations for hsts.c
+ Copyright (C) 1996-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef WGET_HSTS_H
+#define WGET_HSTS_H
+
+#ifdef HAVE_HSTS
+
+#include "wget.h"
+#include "url.h"
+
+typedef struct hsts_store *hsts_store_t;
+
+hsts_store_t hsts_store_open (const char *);
+
+void hsts_store_save (hsts_store_t, const char *);
+void hsts_store_close (hsts_store_t);
+bool hsts_store_has_changed (hsts_store_t);
+
+bool hsts_store_entry (hsts_store_t,
+ enum url_scheme, const char *, int,
+ time_t, bool);
+bool hsts_match (hsts_store_t, struct url *);
+
+#endif /* HAVE_HSTS */
+#endif /* WGET_HSTS_H */
diff --git a/src/html-parse.c b/src/html-parse.c
new file mode 100644
index 0000000..6367732
--- /dev/null
+++ b/src/html-parse.c
@@ -0,0 +1,1221 @@
+/* HTML parser for Wget.
+ Copyright (C) 1998-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* The only entry point to this module is map_html_tags(), which see. */
+
+/* TODO:
+
+ - Allow hooks for callers to process contents outside tags. This
+ is needed to implement handling <style> and <script>. The
+ taginfo structure already carries the information about where the
+ tags are, but this is not enough, because one would also want to
+ skip the comments. (The funny thing is that for <style> and
+ <script> you *don't* want to skip comments!)
+
+ - Create a test suite for regression testing. */
+
+/* HISTORY:
+
+ This is the third HTML parser written for Wget. The first one was
+ written some time during the Geturl 1.0 beta cycle, and was very
+ inefficient and buggy. It also contained some very complex code to
+ remember a list of parser states, because it was supposed to be
+ reentrant.
+
+ The second HTML parser was written for Wget 1.4 (the first version
+ by the name `Wget'), and was a complete rewrite. Although the new
+ parser behaved much better and made no claims of reentrancy, it
+ still shared many of the fundamental flaws of the old version -- it
+ only regarded HTML in terms tag-attribute pairs, where the
+ attribute's value was a URL to be returned. Any other property of
+ HTML, such as <base href=...>, or strange way to specify a URL,
+ such as <meta http-equiv=Refresh content="0; URL=..."> had to be
+ crudely hacked in -- and the caller had to be aware of these hacks.
+ Like its predecessor, this parser did not support HTML comments.
+
+ After Wget 1.5.1 was released, I set out to write a third HTML
+ parser. The objectives of the new parser were to: (1) provide a
+ clean way to analyze HTML lexically, (2) separate interpretation of
+ the markup from the parsing process, (3) be as correct as possible,
+ e.g. correctly skipping comments and other SGML declarations, (4)
+ understand the most common errors in markup and skip them or be
+ relaxed towrds them, and (5) be reasonably efficient (no regexps,
+ minimum copying and minimum or no heap allocation).
+
+ I believe this parser meets all of the above goals. It is
+ reasonably well structured, and could be relatively easily
+ separated from Wget and used elsewhere. While some of its
+ intrinsic properties limit its value as a general-purpose HTML
+ parser, I believe that, with minimum modifications, it could serve
+ as a backend for one.
+
+ Due to time and other constraints, this parser was not integrated
+ into Wget until the version 1.7. */
+
+/* DESCRIPTION:
+
+ The single entry point of this parser is map_html_tags(), which
+ works by calling a function you specify for each tag. The function
+ gets called with the pointer to a structure describing the tag and
+ its attributes. */
+
+/* To test as standalone, compile with `-DSTANDALONE -I.'. You'll
+ still need Wget headers to compile. */
+
+#include "wget.h"
+
+#ifdef STANDALONE
+# define I_REALLY_WANT_CTYPE_MACROS
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "utils.h"
+#include "html-parse.h"
+
+#ifdef STANDALONE
+# undef xmalloc
+# undef xrealloc
+# undef xfree
+# define xmalloc malloc
+# define xrealloc realloc
+# define xfree free
+
+# undef c_isspace
+# undef c_isdigit
+# undef c_isxdigit
+# undef c_isalpha
+# undef c_isalnum
+# undef c_tolower
+# undef c_toupper
+
+# define c_isspace(x) isspace (x)
+# define c_isdigit(x) isdigit (x)
+# define c_isxdigit(x) isxdigit (x)
+# define c_isalpha(x) isalpha (x)
+# define c_isalnum(x) isalnum (x)
+# define c_tolower(x) tolower (x)
+# define c_toupper(x) toupper (x)
+
+struct hash_table {
+ int dummy;
+};
+static void *
+hash_table_get (const struct hash_table *ht, void *ptr)
+{
+ return ptr;
+}
+#else /* not STANDALONE */
+# include "hash.h"
+#endif
+
+/* Pool support. A pool is a resizable chunk of memory. It is first
+ allocated on the stack, and moved to the heap if it needs to be
+ larger than originally expected. map_html_tags() uses it to store
+ the zero-terminated names and values of tags and attributes.
+
+ Thus taginfo->name, and attr->name and attr->value for each
+ attribute, do not point into separately allocated areas, but into
+ different parts of the pool, separated only by terminating zeros.
+ This ensures minimum amount of allocation and, for most tags, no
+ allocation because the entire pool is kept on the stack. */
+
+struct pool {
+ char *contents; /* pointer to the contents. */
+ int size; /* size of the pool. */
+ int tail; /* next available position index. */
+ bool resized; /* whether the pool has been resized
+ using malloc. */
+
+ char *orig_contents; /* original pool contents, usually
+ stack-allocated. used by POOL_FREE
+ to restore the pool to the initial
+ state. */
+ int orig_size;
+};
+
+/* Initialize the pool to hold INITIAL_SIZE bytes of storage. */
+
+#define POOL_INIT(p, initial_storage, initial_size) do { \
+ struct pool *P = (p); \
+ P->contents = (initial_storage); \
+ P->size = (initial_size); \
+ P->tail = 0; \
+ P->resized = false; \
+ P->orig_contents = P->contents; \
+ P->orig_size = P->size; \
+} while (0)
+
+/* Grow the pool to accommodate at least SIZE new bytes. If the pool
+ already has room to accommodate SIZE bytes of data, this is a no-op. */
+
+#define POOL_GROW(p, increase) \
+ GROW_ARRAY ((p)->contents, (p)->size, (p)->tail + (increase), \
+ (p)->resized, char)
+
+/* Append text in the range [beg, end) to POOL. No zero-termination
+ is done. */
+
+#define POOL_APPEND(p, beg, end) do { \
+ const char *PA_beg = (beg); \
+ int PA_size = (end) - PA_beg; \
+ POOL_GROW (p, PA_size); \
+ memcpy ((p)->contents + (p)->tail, PA_beg, PA_size); \
+ (p)->tail += PA_size; \
+} while (0)
+
+/* Append one character to the pool. Can be used to zero-terminate
+ pool strings. */
+
+#define POOL_APPEND_CHR(p, ch) do { \
+ char PAC_char = (ch); \
+ POOL_GROW (p, 1); \
+ (p)->contents[(p)->tail++] = PAC_char; \
+} while (0)
+
+/* Forget old pool contents. The allocated memory is not freed. */
+#define POOL_REWIND(p) (p)->tail = 0
+
+/* Free heap-allocated memory for contents of POOL. This calls
+ xfree() if the memory was allocated through malloc. It also
+ restores `contents' and `size' to their original, pre-malloc
+ values. That way after POOL_FREE, the pool is fully usable, just
+ as if it were freshly initialized with POOL_INIT. */
+
+#define POOL_FREE(p) do { \
+ struct pool *P = p; \
+ if (P->resized) \
+ xfree (P->contents); \
+ P->contents = P->orig_contents; \
+ P->size = P->orig_size; \
+ P->tail = 0; \
+ P->resized = false; \
+} while (0)
+
+/* Used for small stack-allocated memory chunks that might grow. Like
+ DO_REALLOC, this macro grows BASEVAR as necessary to take
+ NEEDED_SIZE items of TYPE.
+
+ The difference is that on the first resize, it will use
+ malloc+memcpy rather than realloc. That way you can stack-allocate
+ the initial chunk, and only resort to heap allocation if you
+ stumble upon large data.
+
+ After the first resize, subsequent ones are performed with realloc,
+ just like DO_REALLOC. */
+
+#define GROW_ARRAY(basevar, sizevar, needed_size, resized, type) do { \
+ long ga_needed_size = (needed_size); \
+ long ga_newsize = (sizevar); \
+ while (ga_newsize < ga_needed_size) \
+ ga_newsize <<= 1; \
+ if (ga_newsize != (sizevar)) \
+ { \
+ if (resized) \
+ basevar = xrealloc (basevar, ga_newsize * sizeof (type)); \
+ else \
+ { \
+ void *ga_new = xmalloc (ga_newsize * sizeof (type)); \
+ memcpy (ga_new, basevar, (sizevar) * sizeof (type)); \
+ (basevar) = ga_new; \
+ resized = true; \
+ } \
+ (sizevar) = ga_newsize; \
+ } \
+} while (0)
+
+/* Test whether n+1-sized entity name fits in P. We don't support
+ IE-style non-terminated entities, e.g. "&ltfoo" -> "<foo".
+ However, "&lt;foo" will work, as will "&lt!foo", "&lt", etc. In
+ other words an entity needs to be terminated by either a
+ non-alphanumeric or the end of string. */
+#define FITS(p, n) (p + n == end || (p + n < end && !c_isalnum (p[n])))
+
+/* Macros that test entity names by returning true if P is followed by
+ the specified characters. */
+#define ENT1(p, c0) (FITS (p, 1) && p[0] == c0)
+#define ENT2(p, c0, c1) (FITS (p, 2) && p[0] == c0 && p[1] == c1)
+#define ENT3(p, c0, c1, c2) (FITS (p, 3) && p[0]==c0 && p[1]==c1 && p[2]==c2)
+
+/* Increment P by INC chars. If P lands at a semicolon, increment it
+ past the semicolon. This ensures that e.g. "&lt;foo" is converted
+ to "<foo", but "&lt,foo" to "<,foo". */
+#define SKIP_SEMI(p, inc) (p += inc, p < end && *p == ';' ? ++p : p)
+
+struct tagstack_item {
+ const char *tagname_begin;
+ const char *tagname_end;
+ const char *contents_begin;
+ struct tagstack_item *prev;
+ struct tagstack_item *next;
+};
+
+static struct tagstack_item *
+tagstack_push (struct tagstack_item **head, struct tagstack_item **tail)
+{
+ struct tagstack_item *ts = xmalloc(sizeof(struct tagstack_item));
+ if (*head == NULL)
+ {
+ *head = *tail = ts;
+ ts->prev = ts->next = NULL;
+ }
+ else
+ {
+ (*tail)->next = ts;
+ ts->prev = *tail;
+ *tail = ts;
+ ts->next = NULL;
+ }
+
+ return ts;
+}
+
+/* remove ts and everything after it from the stack */
+static void
+tagstack_pop (struct tagstack_item **head, struct tagstack_item **tail,
+ struct tagstack_item *ts)
+{
+ if (*head == NULL)
+ return;
+
+ if (ts == *tail)
+ {
+ if (ts == *head)
+ {
+ xfree (ts);
+ *head = *tail = NULL;
+ }
+ else
+ {
+ ts->prev->next = NULL;
+ *tail = ts->prev;
+ xfree (ts);
+ }
+ }
+ else
+ {
+ if (ts == *head)
+ {
+ *head = NULL;
+ }
+ *tail = ts->prev;
+
+ if (ts->prev)
+ {
+ ts->prev->next = NULL;
+ }
+ while (ts)
+ {
+ struct tagstack_item *p = ts->next;
+ xfree (ts);
+ ts = p;
+ }
+ }
+}
+
+static struct tagstack_item *
+tagstack_find (struct tagstack_item *tail, const char *tagname_begin,
+ const char *tagname_end)
+{
+ int len = tagname_end - tagname_begin;
+ while (tail)
+ {
+ if (len == (tail->tagname_end - tail->tagname_begin))
+ {
+ if (0 == strncasecmp (tail->tagname_begin, tagname_begin, len))
+ return tail;
+ }
+ tail = tail->prev;
+ }
+ return NULL;
+}
+
+/* Decode the HTML character entity at *PTR, considering END to be end
+ of buffer. It is assumed that the "&" character that marks the
+ beginning of the entity has been seen at *PTR-1. If a recognized
+ ASCII entity is seen, it is returned, and *PTR is moved to the end
+ of the entity. Otherwise, -1 is returned and *PTR left unmodified.
+
+ The recognized entities are: &lt, &gt, &amp, &apos, and &quot. */
+
+static int
+decode_entity (const char **ptr, const char *end)
+{
+ const char *p = *ptr;
+ int value = -1;
+
+ if (++p == end)
+ return -1;
+
+ switch (*p++)
+ {
+ case '#':
+ /* Process numeric entities "&#DDD;" and "&#xHH;". */
+ {
+ int digits = 0;
+ value = 0;
+ if (*p == 'x')
+ for (++p; value < 256 && p < end && c_isxdigit (*p); p++, digits++)
+ value = (value << 4) + _unhex (*p);
+ else
+ for (; value < 256 && p < end && c_isdigit (*p); p++, digits++)
+ value = (value * 10) + (*p - '0');
+ if (!digits)
+ return -1;
+ /* Don't interpret 128+ codes and NUL because we cannot
+ portably reinserted them into HTML. */
+ if (!value || (value & ~0x7f))
+ return -1;
+ *ptr = SKIP_SEMI (p, 0);
+ return value;
+ }
+ /* Process named ASCII entities. */
+ case 'g':
+ if (ENT1 (p, 't'))
+ value = '>', *ptr = SKIP_SEMI (p, 1);
+ break;
+ case 'l':
+ if (ENT1 (p, 't'))
+ value = '<', *ptr = SKIP_SEMI (p, 1);
+ break;
+ case 'a':
+ if (ENT2 (p, 'm', 'p'))
+ value = '&', *ptr = SKIP_SEMI (p, 2);
+ else if (ENT3 (p, 'p', 'o', 's'))
+ /* handle &apos for the sake of the XML/XHTML crowd. */
+ value = '\'', *ptr = SKIP_SEMI (p, 3);
+ break;
+ case 'q':
+ if (ENT3 (p, 'u', 'o', 't'))
+ value = '\"', *ptr = SKIP_SEMI (p, 3);
+ break;
+ }
+ return value;
+}
+#undef ENT1
+#undef ENT2
+#undef ENT3
+#undef FITS
+#undef SKIP_SEMI
+
+enum {
+ AP_DOWNCASE = 1,
+ AP_DECODE_ENTITIES = 2,
+ AP_TRIM_BLANKS = 4
+};
+
+/* Copy the text in the range [BEG, END) to POOL, optionally
+ performing operations specified by FLAGS. FLAGS may be any
+ combination of AP_DOWNCASE, AP_DECODE_ENTITIES and AP_TRIM_BLANKS
+ with the following meaning:
+
+ * AP_DOWNCASE -- downcase all the letters;
+
+ * AP_DECODE_ENTITIES -- decode the named and numeric entities in
+ the ASCII range when copying the string.
+
+ * AP_TRIM_BLANKS -- ignore blanks at the beginning and at the end
+ of text, as well as embedded newlines. */
+
+static void
+convert_and_copy (struct pool *pool, const char *beg, const char *end, int flags)
+{
+ int old_tail = pool->tail;
+
+ /* Skip blanks if required. We must do this before entities are
+ processed, so that blanks can still be inserted as, for instance,
+ `&#32;'. */
+ if (flags & AP_TRIM_BLANKS)
+ {
+ while (beg < end && c_isspace (*beg))
+ ++beg;
+ while (end > beg && c_isspace (end[-1]))
+ --end;
+ }
+
+ if (flags & AP_DECODE_ENTITIES)
+ {
+ /* Grow the pool, then copy the text to the pool character by
+ character, processing the encountered entities as we go
+ along.
+
+ It's safe (and necessary) to grow the pool in advance because
+ processing the entities can only *shorten* the string, it can
+ never lengthen it. */
+ const char *from = beg;
+ char *to;
+ bool squash_newlines = !!(flags & AP_TRIM_BLANKS);
+
+ POOL_GROW (pool, end - beg);
+ to = pool->contents + pool->tail;
+
+ while (from < end)
+ {
+ if (*from == '&')
+ {
+ int entity = decode_entity (&from, end);
+ if (entity != -1)
+ *to++ = entity;
+ else
+ *to++ = *from++;
+ }
+ else if ((*from == '\n' || *from == '\r') && squash_newlines)
+ ++from;
+ else
+ *to++ = *from++;
+ }
+ /* Verify that we haven't exceeded the original size. (It
+ shouldn't happen, hence the assert.) */
+ assert (to - (pool->contents + pool->tail) <= end - beg);
+
+ /* Make POOL's tail point to the position following the string
+ we've written. */
+ pool->tail = to - pool->contents;
+ POOL_APPEND_CHR (pool, '\0');
+ }
+ else
+ {
+ /* Just copy the text to the pool. */
+ POOL_APPEND (pool, beg, end);
+ POOL_APPEND_CHR (pool, '\0');
+ }
+
+ if (flags & AP_DOWNCASE)
+ {
+ char *p = pool->contents + old_tail;
+ for (; *p; p++)
+ *p = c_tolower (*p);
+ }
+}
+
+/* Originally we used to adhere to rfc 1866 here, and allowed only
+ letters, digits, periods, and hyphens as names (of tags or
+ attributes). However, this broke too many pages which used
+ proprietary or strange attributes, e.g. <img src="a.gif"
+ v:shapes="whatever">.
+
+ So now we allow any character except:
+ * whitespace
+ * 8-bit and control chars
+ * characters that clearly cannot be part of name:
+ '=', '<', '>', '/'.
+
+ This only affects attribute and tag names; attribute values allow
+ an even greater variety of characters. */
+
+#define NAME_CHAR_P(x) ((x) > 32 && (x) < 127 \
+ && (x) != '=' && (x) != '<' && (x) != '>' \
+ && (x) != '/')
+
+#ifdef STANDALONE
+static int comment_backout_count;
+#endif
+
+/* Advance over an SGML declaration, such as <!DOCTYPE ...>. In
+ strict comments mode, this is used for skipping over comments as
+ well.
+
+ To recap: any SGML declaration may have comments associated with
+ it, e.g.
+ <!MY-DECL -- isn't this fun? -- foo bar>
+
+ An HTML comment is merely an empty declaration (<!>) with a comment
+ attached, like this:
+ <!-- some stuff here -->
+
+ Several comments may be embedded in one comment declaration:
+ <!-- have -- -- fun -->
+
+ Whitespace is allowed between and after the comments, but not
+ before the first comment. Additionally, this function attempts to
+ handle double quotes in SGML declarations correctly. */
+
+static const char *
+advance_declaration (const char *beg, const char *end)
+{
+ const char *p = beg;
+ char quote_char = '\0'; /* shut up, gcc! */
+ char ch;
+
+ enum {
+ AC_S_DONE,
+ AC_S_BACKOUT,
+ AC_S_BANG,
+ AC_S_DEFAULT,
+ AC_S_DCLNAME,
+ AC_S_DASH1,
+ AC_S_DASH2,
+ AC_S_COMMENT,
+ AC_S_DASH3,
+ AC_S_DASH4,
+ AC_S_QUOTE1,
+ AC_S_IN_QUOTE,
+ AC_S_QUOTE2
+ } state = AC_S_BANG;
+
+ if (beg == end)
+ return beg;
+ ch = *p++;
+
+ /* It looked like a good idea to write this as a state machine, but
+ now I wonder... */
+
+ while (state != AC_S_DONE && state != AC_S_BACKOUT)
+ {
+ if (p == end)
+ state = AC_S_BACKOUT;
+ switch (state)
+ {
+ case AC_S_DONE:
+ case AC_S_BACKOUT:
+ break;
+ case AC_S_BANG:
+ if (ch == '!')
+ {
+ ch = *p++;
+ state = AC_S_DEFAULT;
+ }
+ else
+ state = AC_S_BACKOUT;
+ break;
+ case AC_S_DEFAULT:
+ switch (ch)
+ {
+ case '-':
+ state = AC_S_DASH1;
+ break;
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ ch = *p++;
+ break;
+ case '<':
+ case '>':
+ state = AC_S_DONE;
+ break;
+ case '\'':
+ case '\"':
+ state = AC_S_QUOTE1;
+ break;
+ default:
+ if (NAME_CHAR_P (ch))
+ state = AC_S_DCLNAME;
+ else
+ state = AC_S_BACKOUT;
+ break;
+ }
+ break;
+ case AC_S_DCLNAME:
+ if (ch == '-')
+ state = AC_S_DASH1;
+ else if (NAME_CHAR_P (ch))
+ ch = *p++;
+ else
+ state = AC_S_DEFAULT;
+ break;
+ case AC_S_QUOTE1:
+ /* We must use 0x22 because broken assert macros choke on
+ '"' and '\"'. */
+ assert (ch == '\'' || ch == 0x22);
+ quote_char = ch; /* cheating -- I really don't feel like
+ introducing more different states for
+ different quote characters. */
+ ch = *p++;
+ state = AC_S_IN_QUOTE;
+ break;
+ case AC_S_IN_QUOTE:
+ if (ch == quote_char)
+ state = AC_S_QUOTE2;
+ else
+ ch = *p++;
+ break;
+ case AC_S_QUOTE2:
+ assert (ch == quote_char);
+ ch = *p++;
+ state = AC_S_DEFAULT;
+ break;
+ case AC_S_DASH1:
+ assert (ch == '-');
+ ch = *p++;
+ state = AC_S_DASH2;
+ break;
+ case AC_S_DASH2:
+ switch (ch)
+ {
+ case '-':
+ ch = *p++;
+ state = AC_S_COMMENT;
+ break;
+ default:
+ state = AC_S_BACKOUT;
+ }
+ break;
+ case AC_S_COMMENT:
+ switch (ch)
+ {
+ case '-':
+ state = AC_S_DASH3;
+ break;
+ default:
+ ch = *p++;
+ break;
+ }
+ break;
+ case AC_S_DASH3:
+ assert (ch == '-');
+ ch = *p++;
+ state = AC_S_DASH4;
+ break;
+ case AC_S_DASH4:
+ switch (ch)
+ {
+ case '-':
+ ch = *p++;
+ state = AC_S_DEFAULT;
+ break;
+ default:
+ state = AC_S_COMMENT;
+ break;
+ }
+ break;
+ }
+ }
+
+ if (state == AC_S_BACKOUT)
+ {
+#ifdef STANDALONE
+ ++comment_backout_count;
+#endif
+ return beg + 1;
+ }
+ return p;
+}
+
+/* Find the first occurrence of the substring "-->" in [BEG, END) and
+ return the pointer to the character after the substring. If the
+ substring is not found, return NULL. */
+
+static const char *
+find_comment_end (const char *beg, const char *end)
+{
+ /* Open-coded Boyer-Moore search for "-->". Examine the third char;
+ if it's not '>' or '-', advance by three characters. Otherwise,
+ look at the preceding characters and try to find a match. */
+
+ const char *p = beg - 1;
+
+ while ((p += 3) < end)
+ switch (p[0])
+ {
+ case '>':
+ if (p[-1] == '-' && p[-2] == '-')
+ return p + 1;
+ break;
+ case '-':
+ at_dash:
+ if (p[-1] == '-')
+ {
+ at_dash_dash:
+ if (++p == end) return NULL;
+ switch (p[0])
+ {
+ case '>': return p + 1;
+ case '-': goto at_dash_dash;
+ }
+ }
+ else
+ {
+ if ((p += 2) >= end) return NULL;
+ switch (p[0])
+ {
+ case '>':
+ if (p[-1] == '-')
+ return p + 1;
+ break;
+ case '-':
+ goto at_dash;
+ }
+ }
+ }
+ return NULL;
+}
+
+/* Return true if the string containing of characters inside [b, e) is
+ present in hash table HT. */
+
+static bool
+name_allowed (const struct hash_table *ht, const char *b, const char *e)
+{
+ char buf[256], *copy;
+ size_t len = e - b;
+ bool ret;
+
+ if (!ht)
+ return true;
+
+ if (len < sizeof (buf))
+ copy = buf;
+ else
+ copy = xmalloc (len + 1);
+
+ memcpy (copy, b, len);
+ copy[len] = 0;
+
+ ret = hash_table_get (ht, copy) != NULL;
+
+ if (copy != buf)
+ xfree (copy);
+
+ return ret;
+}
+
+/* Advance P (a char pointer), with the explicit intent of being able
+ to read the next character. If this is not possible, go to finish. */
+
+#define ADVANCE(p) do { \
+ ++p; \
+ if (p >= end) \
+ goto finish; \
+} while (0)
+
+/* Skip whitespace, if any. */
+
+#define SKIP_WS(p) do { \
+ while (c_isspace (*p)) { \
+ ADVANCE (p); \
+ } \
+} while (0)
+
+#ifdef STANDALONE
+static int tag_backout_count;
+#endif
+
+/* Map MAPFUN over HTML tags in TEXT, which is SIZE characters long.
+ MAPFUN will be called with two arguments: pointer to an initialized
+ struct taginfo, and MAPARG.
+
+ ALLOWED_TAGS and ALLOWED_ATTRIBUTES are hash tables the keys of
+ which are the tags and attribute names that this function should
+ use. If ALLOWED_TAGS is NULL, all tags are processed; if
+ ALLOWED_ATTRIBUTES is NULL, all attributes are returned.
+
+ (Obviously, the caller can filter out unwanted tags and attributes
+ just as well, but this is just an optimization designed to avoid
+ unnecessary copying of tags/attributes which the caller doesn't
+ care about.) */
+
+void
+map_html_tags (const char *text, int size,
+ void (*mapfun) (struct taginfo *, void *), void *maparg,
+ int flags,
+ const struct hash_table *allowed_tags,
+ const struct hash_table *allowed_attributes)
+{
+ /* storage for strings passed to MAPFUN callback; if 256 bytes is
+ too little, POOL_APPEND allocates more with malloc. */
+ char pool_initial_storage[256];
+ struct pool pool;
+
+ const char *p = text;
+ const char *end = text + size;
+
+ struct attr_pair attr_pair_initial_storage[8];
+ int attr_pair_size = countof (attr_pair_initial_storage);
+ bool attr_pair_resized = false;
+ struct attr_pair *pairs = attr_pair_initial_storage;
+
+ struct tagstack_item *head = NULL;
+ struct tagstack_item *tail = NULL;
+
+ if (!size)
+ return;
+
+ POOL_INIT (&pool, pool_initial_storage, countof (pool_initial_storage));
+
+ {
+ int nattrs, end_tag;
+ const char *tag_name_begin, *tag_name_end;
+ const char *tag_start_position;
+ bool uninteresting_tag;
+
+ look_for_tag:
+ POOL_REWIND (&pool);
+
+ nattrs = 0;
+ end_tag = 0;
+
+ /* Find beginning of tag. We use memchr() instead of the usual
+ looping with ADVANCE() for speed. */
+ p = memchr (p, '<', end - p);
+ if (!p)
+ goto finish;
+
+ tag_start_position = p;
+ ADVANCE (p);
+
+ /* Establish the type of the tag (start-tag, end-tag or
+ declaration). */
+ if (*p == '!')
+ {
+ if (!(flags & MHT_STRICT_COMMENTS)
+ && p + 3 < end && p[1] == '-' && p[2] == '-')
+ {
+ /* If strict comments are not enforced and if we know
+ we're looking at a comment, simply look for the
+ terminating "-->". Non-strict is the default because
+ it works in other browsers and most HTML writers can't
+ be bothered with getting the comments right. */
+ const char *comment_end = find_comment_end (p + 3, end);
+ if (comment_end)
+ p = comment_end;
+ }
+ else
+ {
+ /* Either in strict comment mode or looking at a non-empty
+ declaration. Real declarations are much less likely to
+ be misused the way comments are, so advance over them
+ properly regardless of strictness. */
+ p = advance_declaration (p, end);
+ }
+ if (p == end)
+ goto finish;
+ goto look_for_tag;
+ }
+ else if (*p == '/')
+ {
+ end_tag = 1;
+ ADVANCE (p);
+ }
+ tag_name_begin = p;
+ while (NAME_CHAR_P (*p))
+ ADVANCE (p);
+ if (p == tag_name_begin)
+ goto look_for_tag;
+ tag_name_end = p;
+ SKIP_WS (p);
+
+ if (!end_tag)
+ {
+ struct tagstack_item *ts = tagstack_push (&head, &tail);
+ if (ts)
+ {
+ ts->tagname_begin = tag_name_begin;
+ ts->tagname_end = tag_name_end;
+ ts->contents_begin = NULL;
+ }
+ }
+
+ if (end_tag && *p != '>' && *p != '<')
+ goto backout_tag;
+
+ if (!name_allowed (allowed_tags, tag_name_begin, tag_name_end))
+ /* We can't just say "goto look_for_tag" here because we need
+ the loop below to properly advance over the tag's attributes. */
+ uninteresting_tag = true;
+ else
+ {
+ uninteresting_tag = false;
+ convert_and_copy (&pool, tag_name_begin, tag_name_end, AP_DOWNCASE);
+ }
+
+ /* Find the attributes. */
+ while (1)
+ {
+ const char *attr_name_begin, *attr_name_end;
+ const char *attr_value_begin, *attr_value_end;
+ const char *attr_raw_value_begin, *attr_raw_value_end;
+ int operation = AP_DOWNCASE; /* stupid compiler. */
+
+ SKIP_WS (p);
+
+ if (*p == '/')
+ {
+ /* A slash at this point means the tag is about to be
+ closed. This is legal in XML and has been popularized
+ in HTML via XHTML. */
+ /* <foo a=b c=d /> */
+ /* ^ */
+ ADVANCE (p);
+ SKIP_WS (p);
+ if (*p != '<' && *p != '>')
+ goto backout_tag;
+ }
+
+ /* Check for end of tag definition. */
+ if (*p == '<' || *p == '>')
+ break;
+
+ /* Establish bounds of attribute name. */
+ attr_name_begin = p; /* <foo bar ...> */
+ /* ^ */
+ while (NAME_CHAR_P (*p))
+ ADVANCE (p);
+ attr_name_end = p; /* <foo bar ...> */
+ /* ^ */
+ if (attr_name_begin == attr_name_end)
+ goto backout_tag;
+
+ /* Establish bounds of attribute value. */
+ SKIP_WS (p);
+
+ if (NAME_CHAR_P (*p) || *p == '/' || *p == '<' || *p == '>')
+ {
+ /* Minimized attribute syntax allows `=' to be omitted.
+ For example, <UL COMPACT> is a valid shorthand for <UL
+ COMPACT="compact">. Even if such attributes are not
+ useful to Wget, we need to support them, so that the
+ tags containing them can be parsed correctly. */
+ attr_raw_value_begin = attr_value_begin = attr_name_begin;
+ attr_raw_value_end = attr_value_end = attr_name_end;
+ }
+ else if (*p == '=')
+ {
+ ADVANCE (p);
+ SKIP_WS (p);
+ if (*p == '\"' || *p == '\'')
+ {
+ bool newline_seen = false;
+ char quote_char = *p;
+ attr_raw_value_begin = p;
+ ADVANCE (p);
+ attr_value_begin = p; /* <foo bar="baz"> */
+ /* ^ */
+ while (*p != quote_char)
+ {
+ if (!newline_seen && *p == '\n')
+ {
+ /* If a newline is seen within the quotes, it
+ is most likely that someone forgot to close
+ the quote. In that case, we back out to
+ the value beginning, and terminate the tag
+ at either `>' or the delimiter, whichever
+ comes first. Such a tag terminated at `>'
+ is discarded. */
+ p = attr_value_begin;
+ newline_seen = true;
+ continue;
+ }
+ else if (newline_seen && (*p == '<' || *p == '>'))
+ break;
+ ADVANCE (p);
+ }
+ attr_value_end = p; /* <foo bar="baz"> */
+ /* ^ */
+ if (*p == quote_char)
+ ADVANCE (p);
+ else
+ goto look_for_tag;
+ attr_raw_value_end = p; /* <foo bar="baz"> */
+ /* ^ */
+ operation = AP_DECODE_ENTITIES;
+ if (flags & MHT_TRIM_VALUES)
+ operation |= AP_TRIM_BLANKS;
+ }
+ else
+ {
+ attr_value_begin = p; /* <foo bar=baz> */
+ /* ^ */
+ /* According to SGML, a name token should consist only
+ of alphanumerics, . and -. However, this is often
+ violated by, for instance, `%' in `width=75%'.
+ We'll be liberal and allow just about anything as
+ an attribute value. */
+ while (!c_isspace (*p) && *p != '<' && *p != '>')
+ ADVANCE (p);
+ attr_value_end = p; /* <foo bar=baz qux=quix> */
+ /* ^ */
+ if (attr_value_begin == attr_value_end)
+ /* <foo bar=> */
+ /* ^ */
+ goto backout_tag;
+ attr_raw_value_begin = attr_value_begin;
+ attr_raw_value_end = attr_value_end;
+ operation = AP_DECODE_ENTITIES;
+ }
+ }
+ else
+ {
+ /* We skipped the whitespace and found something that is
+ neither `=' nor the beginning of the next attribute's
+ name. Back out. */
+ goto backout_tag; /* <foo bar [... */
+ /* ^ */
+ }
+
+ /* If we're not interested in the tag, don't bother with any
+ of the attributes. */
+ if (uninteresting_tag)
+ continue;
+
+ /* If we aren't interested in the attribute, skip it. We
+ cannot do this test any sooner, because our text pointer
+ needs to correctly advance over the attribute. */
+ if (!name_allowed (allowed_attributes, attr_name_begin, attr_name_end))
+ continue;
+
+ GROW_ARRAY (pairs, attr_pair_size, nattrs + 1, attr_pair_resized,
+ struct attr_pair);
+
+ pairs[nattrs].name_pool_index = pool.tail;
+ convert_and_copy (&pool, attr_name_begin, attr_name_end, AP_DOWNCASE);
+
+ pairs[nattrs].value_pool_index = pool.tail;
+ convert_and_copy (&pool, attr_value_begin, attr_value_end, operation);
+ pairs[nattrs].value_raw_beginning = attr_raw_value_begin;
+ pairs[nattrs].value_raw_size = (attr_raw_value_end
+ - attr_raw_value_begin);
+ ++nattrs;
+ }
+
+ if (!end_tag && tail && (tail->tagname_begin == tag_name_begin))
+ {
+ tail->contents_begin = p+1;
+ }
+
+ if (uninteresting_tag)
+ {
+ ADVANCE (p);
+ goto look_for_tag;
+ }
+
+ /* By now, we have a valid tag with a name and zero or more
+ attributes. Fill in the data and call the mapper function. */
+ {
+ int i;
+ struct taginfo taginfo;
+ struct tagstack_item *ts = NULL;
+
+ taginfo.name = pool.contents;
+ taginfo.end_tag_p = end_tag;
+ taginfo.nattrs = nattrs;
+ /* We fill in the char pointers only now, when pool can no
+ longer get realloc'ed. If we did that above, we could get
+ hosed by reallocation. Obviously, after this point, the pool
+ may no longer be grown. */
+ for (i = 0; i < nattrs; i++)
+ {
+ pairs[i].name = pool.contents + pairs[i].name_pool_index;
+ pairs[i].value = pool.contents + pairs[i].value_pool_index;
+ }
+ taginfo.attrs = pairs;
+ taginfo.start_position = tag_start_position;
+ taginfo.end_position = p + 1;
+ taginfo.contents_begin = NULL;
+ taginfo.contents_end = NULL;
+
+ if (end_tag)
+ {
+ ts = tagstack_find (tail, tag_name_begin, tag_name_end);
+ if (ts)
+ {
+ if (ts->contents_begin)
+ {
+ taginfo.contents_begin = ts->contents_begin;
+ taginfo.contents_end = tag_start_position;
+ }
+ tagstack_pop (&head, &tail, ts);
+ }
+ }
+
+ mapfun (&taginfo, maparg);
+ if (*p != '<')
+ ADVANCE (p);
+ }
+ goto look_for_tag;
+
+ backout_tag:
+#ifdef STANDALONE
+ ++tag_backout_count;
+#endif
+ /* The tag wasn't really a tag. Treat its contents as ordinary
+ data characters. */
+ p = tag_start_position + 1;
+ goto look_for_tag;
+ }
+
+ finish:
+ POOL_FREE (&pool);
+ if (attr_pair_resized)
+ xfree (pairs);
+ /* pop any tag stack that's left */
+ tagstack_pop (&head, &tail, head);
+}
+
+#undef ADVANCE
+#undef SKIP_WS
+#undef SKIP_NON_WS
+
+#ifdef STANDALONE
+static void
+test_mapper (struct taginfo *taginfo, void *arg)
+{
+ int i;
+
+ printf ("%s%s", taginfo->end_tag_p ? "/" : "", taginfo->name);
+ for (i = 0; i < taginfo->nattrs; i++)
+ printf (" %s=%s", taginfo->attrs[i].name, taginfo->attrs[i].value);
+ putchar ('\n');
+ ++*(int *)arg;
+}
+
+int main ()
+{
+ int size = 256;
+ char *x = xmalloc (size);
+ int length = 0;
+ int read_count;
+ int tag_counter = 0;
+
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ textdomain ("wget");
+#endif /* ENABLE_NLS */
+
+ while ((read_count = fread (x + length, 1, size - length, stdin)))
+ {
+ length += read_count;
+ size <<= 1;
+ x = xrealloc (x, size);
+ }
+
+ map_html_tags (x, length, test_mapper, &tag_counter, 0, NULL, NULL);
+ printf ("TAGS: %d\n", tag_counter);
+ printf ("Tag backouts: %d\n", tag_backout_count);
+ printf ("Comment backouts: %d\n", comment_backout_count);
+ return 0;
+}
+#endif /* STANDALONE */
diff --git a/src/html-parse.h b/src/html-parse.h
new file mode 100644
index 0000000..eae8e3c
--- /dev/null
+++ b/src/html-parse.h
@@ -0,0 +1,71 @@
+/* Declarations for html-parse.c.
+ Copyright (C) 1998-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef HTML_PARSE_H
+#define HTML_PARSE_H
+
+struct attr_pair {
+ char *name; /* attribute name */
+ char *value; /* attribute value */
+
+ /* Needed for URL conversion; the places where the value begins and
+ ends, including the quotes and everything. */
+ const char *value_raw_beginning;
+ int value_raw_size;
+
+ /* Used internally by map_html_tags. */
+ int name_pool_index, value_pool_index;
+};
+
+struct taginfo {
+ char *name; /* tag name */
+ int end_tag_p; /* whether this is an end-tag */
+ int nattrs; /* number of attributes */
+ struct attr_pair *attrs; /* attributes */
+
+ const char *start_position; /* start position of tag */
+ const char *end_position; /* end position of tag */
+
+ const char *contents_begin; /* delimiters of tag contents */
+ const char *contents_end; /* only valid if end_tag_p */
+};
+
+struct hash_table; /* forward declaration */
+
+/* Flags for map_html_tags: */
+#define MHT_STRICT_COMMENTS 1 /* use strict comment interpretation */
+#define MHT_TRIM_VALUES 2 /* trim attribute values, e.g. interpret
+ <a href=" foo "> as "foo" */
+
+void map_html_tags (const char *, int,
+ void (*) (struct taginfo *, void *), void *, int,
+ const struct hash_table *, const struct hash_table *);
+
+#endif /* HTML_PARSE_H */
diff --git a/src/html-url.c b/src/html-url.c
new file mode 100644
index 0000000..b80cf26
--- /dev/null
+++ b/src/html-url.c
@@ -0,0 +1,977 @@
+/* Collect URLs from HTML source.
+ Copyright (C) 1998-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "exits.h"
+#include "html-parse.h"
+#include "url.h"
+#include "utils.h"
+#include "hash.h"
+#include "convert.h"
+#include "recur.h"
+#include "html-url.h"
+#include "css-url.h"
+#include "c-strcase.h"
+
+typedef void (*tag_handler_t) (int, struct taginfo *, struct map_context *);
+
+#define DECLARE_TAG_HANDLER(fun) \
+ static void fun (int, struct taginfo *, struct map_context *)
+
+DECLARE_TAG_HANDLER (tag_find_urls);
+DECLARE_TAG_HANDLER (tag_handle_base);
+DECLARE_TAG_HANDLER (tag_handle_form);
+DECLARE_TAG_HANDLER (tag_handle_img);
+DECLARE_TAG_HANDLER (tag_handle_link);
+DECLARE_TAG_HANDLER (tag_handle_meta);
+
+enum {
+ TAG_A,
+ TAG_APPLET,
+ TAG_AREA,
+ TAG_BASE,
+ TAG_BGSOUND,
+ TAG_BODY,
+ TAG_EMBED,
+ TAG_FIG,
+ TAG_FORM,
+ TAG_FRAME,
+ TAG_IFRAME,
+ TAG_IMG,
+ TAG_INPUT,
+ TAG_LAYER,
+ TAG_LINK,
+ TAG_META,
+ TAG_OBJECT,
+ TAG_OVERLAY,
+ TAG_SCRIPT,
+ TAG_TABLE,
+ TAG_TD,
+ TAG_TH,
+ TAG_VIDEO,
+ TAG_AUDIO,
+ TAG_SOURCE
+};
+
+/* The list of known tags and functions used for handling them. Most
+ tags are simply harvested for URLs. */
+static struct known_tag {
+ int tagid;
+ const char *name;
+ tag_handler_t handler;
+} known_tags[] = {
+ { TAG_A, "a", tag_find_urls },
+ { TAG_APPLET, "applet", tag_find_urls },
+ { TAG_AREA, "area", tag_find_urls },
+ { TAG_BASE, "base", tag_handle_base },
+ { TAG_BGSOUND, "bgsound", tag_find_urls },
+ { TAG_BODY, "body", tag_find_urls },
+ { TAG_EMBED, "embed", tag_find_urls },
+ { TAG_FIG, "fig", tag_find_urls },
+ { TAG_FORM, "form", tag_handle_form },
+ { TAG_FRAME, "frame", tag_find_urls },
+ { TAG_IFRAME, "iframe", tag_find_urls },
+ { TAG_IMG, "img", tag_handle_img },
+ { TAG_INPUT, "input", tag_find_urls },
+ { TAG_LAYER, "layer", tag_find_urls },
+ { TAG_LINK, "link", tag_handle_link },
+ { TAG_META, "meta", tag_handle_meta },
+ { TAG_OBJECT, "object", tag_find_urls },
+ { TAG_OVERLAY, "overlay", tag_find_urls },
+ { TAG_SCRIPT, "script", tag_find_urls },
+ { TAG_TABLE, "table", tag_find_urls },
+ { TAG_TD, "td", tag_find_urls },
+ { TAG_TH, "th", tag_find_urls },
+ { TAG_VIDEO, "video", tag_find_urls },
+ { TAG_AUDIO, "audio", tag_find_urls },
+ { TAG_SOURCE, "source", tag_find_urls }
+};
+
+/* tag_url_attributes documents which attributes of which tags contain
+ URLs to harvest. It is used by tag_find_urls. */
+
+/* Defines for the FLAGS. */
+
+/* The link is "inline", i.e. needs to be retrieved for this document
+ to be correctly rendered. Inline links include inlined images,
+ stylesheets, children frames, etc. */
+#define ATTR_INLINE 1
+
+/* The link is expected to yield HTML contents. It's important not to
+ try to follow HTML obtained by following e.g. <img src="...">
+ regardless of content-type. Doing this causes infinite loops for
+ "images" that return non-404 error pages with links to the same
+ image. */
+#define ATTR_HTML 2
+
+/* For tags handled by tag_find_urls: attributes that contain URLs to
+ download. */
+static struct {
+ int tagid;
+ const char *attr_name;
+ int flags;
+} tag_url_attributes[] = {
+ { TAG_A, "href", ATTR_HTML },
+ { TAG_APPLET, "code", ATTR_INLINE },
+ { TAG_AREA, "href", ATTR_HTML },
+ { TAG_BGSOUND, "src", ATTR_INLINE },
+ { TAG_BODY, "background", ATTR_INLINE },
+ { TAG_EMBED, "href", ATTR_HTML },
+ { TAG_EMBED, "src", ATTR_INLINE | ATTR_HTML },
+ { TAG_FIG, "src", ATTR_INLINE },
+ { TAG_FRAME, "src", ATTR_INLINE | ATTR_HTML },
+ { TAG_IFRAME, "src", ATTR_INLINE | ATTR_HTML },
+ { TAG_IMG, "href", ATTR_INLINE },
+ { TAG_IMG, "lowsrc", ATTR_INLINE },
+ { TAG_IMG, "src", ATTR_INLINE },
+ { TAG_INPUT, "src", ATTR_INLINE },
+ { TAG_LAYER, "src", ATTR_INLINE | ATTR_HTML },
+ { TAG_OBJECT, "data", ATTR_INLINE },
+ { TAG_OVERLAY, "src", ATTR_INLINE | ATTR_HTML },
+ { TAG_SCRIPT, "src", ATTR_INLINE },
+ { TAG_TABLE, "background", ATTR_INLINE },
+ { TAG_TD, "background", ATTR_INLINE },
+ { TAG_TH, "background", ATTR_INLINE },
+ { TAG_VIDEO, "src", ATTR_INLINE },
+ { TAG_VIDEO, "poster", ATTR_INLINE },
+ { TAG_AUDIO, "src", ATTR_INLINE },
+ { TAG_AUDIO, "poster", ATTR_INLINE },
+ { TAG_SOURCE, "src", ATTR_INLINE }
+};
+
+/* The lists of interesting tags and attributes are built dynamically,
+ from the information above. However, some places in the code refer
+ to the attributes not mentioned here. We add them manually. */
+static const char *additional_attributes[] = {
+ "rel", /* used by tag_handle_link */
+ "type", /* used by tag_handle_link */
+ "http-equiv", /* used by tag_handle_meta */
+ "name", /* used by tag_handle_meta */
+ "content", /* used by tag_handle_meta */
+ "action", /* used by tag_handle_form */
+ "style", /* used by check_style_attr */
+ "srcset", /* used by tag_handle_img */
+};
+
+static struct hash_table *interesting_tags;
+static struct hash_table *interesting_attributes;
+
+/* Will contains the (last) charset found in 'http-equiv=content-type'
+ meta tags */
+static char *meta_charset;
+
+static void
+init_interesting (void)
+{
+ /* Init the variables interesting_tags and interesting_attributes
+ that are used by the HTML parser to know which tags and
+ attributes we're interested in. We initialize this only once,
+ for performance reasons.
+
+ Here we also make sure that what we put in interesting_tags
+ matches the user's preferences as specified through --ignore-tags
+ and --follow-tags. */
+
+ size_t i;
+ interesting_tags = make_nocase_string_hash_table (countof (known_tags));
+
+ /* First, add all the tags we know hot to handle, mapped to their
+ respective entries in known_tags. */
+ for (i = 0; i < countof (known_tags); i++)
+ hash_table_put (interesting_tags, known_tags[i].name, known_tags + i);
+
+ /* Then remove the tags ignored through --ignore-tags. */
+ if (opt.ignore_tags)
+ {
+ char **ignored;
+ for (ignored = opt.ignore_tags; *ignored; ignored++)
+ hash_table_remove (interesting_tags, *ignored);
+ }
+
+ /* If --follow-tags is specified, use only those tags. */
+ if (opt.follow_tags)
+ {
+ /* Create a new table intersecting --follow-tags and known_tags,
+ and use it as interesting_tags. */
+ struct hash_table *intersect = make_nocase_string_hash_table (0);
+ char **followed;
+ for (followed = opt.follow_tags; *followed; followed++)
+ {
+ struct known_tag *t = hash_table_get (interesting_tags, *followed);
+ if (!t)
+ continue; /* ignore unknown --follow-tags entries. */
+ hash_table_put (intersect, *followed, t);
+ }
+ hash_table_destroy (interesting_tags);
+ interesting_tags = intersect;
+ }
+
+ /* Add the attributes we care about. */
+ interesting_attributes = make_nocase_string_hash_table (10);
+ for (i = 0; i < countof (additional_attributes); i++)
+ hash_table_put (interesting_attributes, additional_attributes[i], "1");
+ for (i = 0; i < countof (tag_url_attributes); i++)
+ hash_table_put (interesting_attributes,
+ tag_url_attributes[i].attr_name, "1");
+}
+
+/* Find the value of attribute named NAME in the taginfo TAG. If the
+ attribute is not present, return NULL. If ATTRIND is non-NULL, the
+ index of the attribute in TAG will be stored there. */
+
+static char *
+find_attr (struct taginfo *tag, const char *name, int *attrind)
+{
+ int i;
+ for (i = 0; i < tag->nattrs; i++)
+ if (!c_strcasecmp (tag->attrs[i].name, name))
+ {
+ if (attrind)
+ *attrind = i;
+ return tag->attrs[i].value;
+ }
+ return NULL;
+}
+
+/* used for calls to append_url */
+#define ATTR_POS(tag, attrind, ctx) \
+ (tag->attrs[attrind].value_raw_beginning - ctx->text)
+#define ATTR_SIZE(tag, attrind) \
+ (tag->attrs[attrind].value_raw_size)
+
+/* Append LINK_URI to the urlpos structure that is being built.
+
+ LINK_URI will be merged with the current document base.
+*/
+
+struct urlpos *
+append_url (const char *link_uri, int position, int size,
+ struct map_context *ctx)
+{
+ int link_has_scheme = url_has_scheme (link_uri);
+ struct urlpos *newel;
+ const char *base = ctx->base ? ctx->base : ctx->parent_base;
+ struct url *url;
+
+ struct iri *iri = iri_new ();
+ set_uri_encoding (iri, opt.locale, true);
+ iri->utf8_encode = true;
+
+ if (!base)
+ {
+ DEBUGP (("%s: no base, merge will use \"%s\".\n",
+ ctx->document_file, link_uri));
+
+ if (!link_has_scheme)
+ {
+ /* Base URL is unavailable, and the link does not have a
+ location attached to it -- we have to give up. Since
+ this can only happen when using `--force-html -i', print
+ a warning. */
+ logprintf (LOG_NOTQUIET,
+ _("%s: Cannot resolve incomplete link %s.\n"),
+ ctx->document_file, link_uri);
+ iri_free (iri);
+ return NULL;
+ }
+
+ url = url_parse (link_uri, NULL, iri, false);
+ if (!url)
+ {
+ DEBUGP (("%s: link \"%s\" doesn't parse.\n",
+ ctx->document_file, link_uri));
+ iri_free (iri);
+ return NULL;
+ }
+ }
+ else
+ {
+ /* Merge BASE with LINK_URI, but also make sure the result is
+ canonicalized, i.e. that "../" have been resolved.
+ (parse_url will do that for us.) */
+
+ char *complete_uri = uri_merge (base, link_uri);
+
+ DEBUGP (("%s: merge(%s, %s) -> %s\n",
+ quotearg_n_style (0, escape_quoting_style, ctx->document_file),
+ quote_n (1, base),
+ quote_n (2, link_uri),
+ quotearg_n_style (3, escape_quoting_style, complete_uri)));
+
+ url = url_parse (complete_uri, NULL, iri, false);
+ if (!url)
+ {
+ DEBUGP (("%s: merged link \"%s\" doesn't parse.\n",
+ ctx->document_file, complete_uri));
+ xfree (complete_uri);
+ iri_free (iri);
+ return NULL;
+ }
+ xfree (complete_uri);
+ }
+
+ iri_free (iri);
+
+ DEBUGP (("appending %s to urlpos.\n", quote (url->url)));
+
+ newel = xnew0 (struct urlpos);
+ newel->url = url;
+ newel->pos = position;
+ newel->size = size;
+
+ /* A URL is relative if the host is not named, and the name does not
+ start with `/'. */
+ if (!link_has_scheme && *link_uri != '/')
+ newel->link_relative_p = 1;
+ else if (link_has_scheme)
+ newel->link_complete_p = 1;
+
+ /* Append the new URL maintaining the order by position. */
+ if (ctx->head == NULL)
+ ctx->head = newel;
+ else
+ {
+ struct urlpos *it, *prev = NULL;
+
+ it = ctx->head;
+ while (it && position > it->pos)
+ {
+ prev = it;
+ it = it->next;
+ }
+
+ newel->next = it;
+
+ if (prev)
+ prev->next = newel;
+ else
+ ctx->head = newel;
+ }
+
+ return newel;
+}
+
+static void
+check_style_attr (struct taginfo *tag, struct map_context *ctx)
+{
+ int attrind;
+ int raw_start;
+ int raw_len;
+ char *style = find_attr (tag, "style", &attrind);
+ if (!style)
+ return;
+
+ /* raw pos and raw size include the quotes, skip them when they are
+ present. */
+ raw_start = ATTR_POS (tag, attrind, ctx);
+ raw_len = ATTR_SIZE (tag, attrind);
+ if( *(char *)(ctx->text + raw_start) == '\''
+ || *(char *)(ctx->text + raw_start) == '"')
+ {
+ raw_start += 1;
+ raw_len -= 2;
+ }
+
+ if(raw_len <= 0)
+ return;
+
+ get_urls_css (ctx, raw_start, raw_len);
+}
+
+/* All the tag_* functions are called from collect_tags_mapper, as
+ specified by KNOWN_TAGS. */
+
+/* Default tag handler: collect URLs from attributes specified for
+ this tag by tag_url_attributes. */
+
+static void
+tag_find_urls (int tagid, struct taginfo *tag, struct map_context *ctx)
+{
+ size_t i;
+ int attrind;
+ int first = -1;
+
+ for (i = 0; i < countof (tag_url_attributes); i++)
+ if (tag_url_attributes[i].tagid == tagid)
+ {
+ /* We've found the index of tag_url_attributes where the
+ attributes of our tag begin. */
+ first = i;
+ break;
+ }
+ assert (first != -1);
+
+ /* Loop over the "interesting" attributes of this tag. In this
+ example, it will loop over "src" and "lowsrc".
+
+ <img src="foo.png" lowsrc="bar.png">
+
+ This has to be done in the outer loop so that the attributes are
+ processed in the same order in which they appear in the page.
+ This is required when converting links. */
+
+ for (attrind = 0; attrind < tag->nattrs; attrind++)
+ {
+ /* Find whether TAG/ATTRIND is a combination that contains a
+ URL. */
+ char *link = tag->attrs[attrind].value;
+ const size_t size = countof (tag_url_attributes);
+
+ /* If you're cringing at the inefficiency of the nested loops,
+ remember that they both iterate over a very small number of
+ items. The worst-case inner loop is for the IMG tag, which
+ has three attributes. */
+ for (i = first; i < size && tag_url_attributes[i].tagid == tagid; i++)
+ {
+ if (0 == strcasecmp (tag->attrs[attrind].name,
+ tag_url_attributes[i].attr_name))
+ {
+ struct urlpos *up = append_url (link, ATTR_POS(tag,attrind,ctx),
+ ATTR_SIZE(tag,attrind), ctx);
+ if (up)
+ {
+ int flags = tag_url_attributes[i].flags;
+ if (flags & ATTR_INLINE)
+ up->link_inline_p = 1;
+ if (flags & ATTR_HTML)
+ up->link_expect_html = 1;
+ }
+ }
+ }
+ }
+}
+
+/* Handle the BASE tag, for <base href=...>. */
+
+static void
+tag_handle_base (int tagid _GL_UNUSED, struct taginfo *tag, struct map_context *ctx)
+{
+ struct urlpos *base_urlpos;
+ int attrind;
+ char *newbase = find_attr (tag, "href", &attrind);
+ if (!newbase)
+ return;
+
+ base_urlpos = append_url (newbase, ATTR_POS(tag,attrind,ctx),
+ ATTR_SIZE(tag,attrind), ctx);
+ if (!base_urlpos)
+ return;
+ base_urlpos->ignore_when_downloading = 1;
+ base_urlpos->link_base_p = 1;
+
+ xfree (ctx->base);
+ if (ctx->parent_base)
+ ctx->base = uri_merge (ctx->parent_base, newbase);
+ else
+ ctx->base = xstrdup (newbase);
+}
+
+/* Mark the URL found in <form action=...> for conversion. */
+
+static void
+tag_handle_form (int tagid _GL_UNUSED, struct taginfo *tag, struct map_context *ctx)
+{
+ int attrind;
+ char *action = find_attr (tag, "action", &attrind);
+
+ if (action)
+ {
+ struct urlpos *up = append_url (action, ATTR_POS(tag,attrind,ctx),
+ ATTR_SIZE(tag,attrind), ctx);
+ if (up)
+ up->ignore_when_downloading = 1;
+ }
+}
+
+/* Handle the LINK tag. It requires special handling because how its
+ links will be followed in -p mode depends on the REL attribute. */
+
+static void
+tag_handle_link (int tagid _GL_UNUSED, struct taginfo *tag, struct map_context *ctx)
+{
+ int attrind;
+ char *href = find_attr (tag, "href", &attrind);
+
+ /* All <link href="..."> link references are external, except those
+ known not to be, such as style sheet and shortcut icon:
+
+ <link rel="stylesheet" href="...">
+ <link rel="shortcut icon" href="...">
+ */
+ if (href)
+ {
+ struct urlpos *up = append_url (href, ATTR_POS(tag,attrind,ctx),
+ ATTR_SIZE(tag,attrind), ctx);
+ if (up)
+ {
+ char *rel = find_attr (tag, "rel", NULL);
+ if (rel)
+ {
+ if (0 == c_strcasecmp (rel, "stylesheet"))
+ {
+ up->link_inline_p = 1;
+ up->link_expect_css = 1;
+ }
+ else if (0 == c_strcasecmp (rel, "shortcut icon"))
+ {
+ up->link_inline_p = 1;
+ }
+ else
+ {
+ /* The external ones usually point to HTML pages, such as
+ <link rel="next" href="...">
+ except when the type attribute says otherwise:
+ <link rel="alternate" type="application/rss+xml" href=".../?feed=rss2" />
+ */
+ char *type = find_attr (tag, "type", NULL);
+ if (!type || c_strcasecmp (type, "text/html") == 0)
+ up->link_expect_html = 1;
+ }
+ }
+ }
+ }
+}
+
+/* Handle the META tag. This requires special handling because of the
+ refresh feature and because of robot exclusion. */
+
+static void
+tag_handle_meta (int tagid _GL_UNUSED, struct taginfo *tag, struct map_context *ctx)
+{
+ char *name = find_attr (tag, "name", NULL);
+ char *http_equiv = find_attr (tag, "http-equiv", NULL);
+
+ if (http_equiv && 0 == c_strcasecmp (http_equiv, "refresh"))
+ {
+ /* Some pages use a META tag to specify that the page be
+ refreshed by a new page after a given number of seconds. The
+ general format for this is:
+
+ <meta http-equiv=Refresh content="NUMBER; URL=index2.html">
+
+ So we just need to skip past the "NUMBER; URL=" garbage to
+ get to the URL. */
+
+ struct urlpos *entry;
+ int attrind;
+ int timeout = 0;
+ char *p;
+
+ char *refresh = find_attr (tag, "content", &attrind);
+ if (!refresh)
+ return;
+
+ for (p = refresh; c_isdigit (*p); p++)
+ timeout = 10 * timeout + *p - '0';
+ if (*p++ != ';')
+ return;
+
+ while (c_isspace (*p))
+ ++p;
+ if (!( c_toupper (*p) == 'U'
+ && c_toupper (*(p + 1)) == 'R'
+ && c_toupper (*(p + 2)) == 'L'
+ && *(p + 3) == '='))
+ return;
+ p += 4;
+ while (c_isspace (*p))
+ ++p;
+
+ entry = append_url (p, ATTR_POS(tag,attrind,ctx),
+ ATTR_SIZE(tag,attrind), ctx);
+ if (entry)
+ {
+ entry->link_refresh_p = 1;
+ entry->refresh_timeout = timeout;
+ entry->link_expect_html = 1;
+ }
+ }
+ else if (http_equiv && 0 == c_strcasecmp (http_equiv, "content-type"))
+ {
+ /* Handle stuff like:
+ <meta http-equiv="Content-Type" content="text/html; charset=CHARSET"> */
+
+ char *mcharset;
+ char *content = find_attr (tag, "content", NULL);
+ if (!content)
+ return;
+
+ mcharset = parse_charset (content);
+ if (!mcharset)
+ return;
+
+ xfree (meta_charset);
+ meta_charset = mcharset;
+ }
+ else if (name && 0 == c_strcasecmp (name, "robots"))
+ {
+ /* Handle stuff like:
+ <meta name="robots" content="index,nofollow"> */
+ char *content = find_attr (tag, "content", NULL);
+ if (!content)
+ return;
+ if (!c_strcasecmp (content, "none"))
+ ctx->nofollow = true;
+ else
+ {
+ while (*content)
+ {
+ char *end;
+ /* Skip any initial whitespace. */
+ content += strspn (content, " \f\n\r\t\v");
+ /* Find the next occurrence of ',' or whitespace,
+ * or the end of the string. */
+ end = content + strcspn (content, ", \f\n\r\t\v");
+ if (!c_strncasecmp (content, "nofollow", end - content))
+ ctx->nofollow = true;
+ /* Skip past the next comma, if any. */
+ if (*end == ',')
+ ++end;
+ else
+ {
+ end = strchr (end, ',');
+ if (end)
+ ++end;
+ else
+ end = content + strlen (content);
+ }
+ content = end;
+ }
+ }
+ }
+}
+
+/* Handle the IMG tag. This requires special handling for the srcset attr,
+ while the traditional src/lowsrc/href attributes can be handled generically.
+*/
+
+static void
+tag_handle_img (int tagid, struct taginfo *tag, struct map_context *ctx) {
+ int attrind;
+ char *srcset;
+
+ /* Use the generic approach for the attributes without special syntax. */
+ tag_find_urls(tagid, tag, ctx);
+
+ srcset = find_attr (tag, "srcset", &attrind);
+ if (srcset)
+ {
+ /* These are relative to the input text. */
+ int base_ind = ATTR_POS (tag,attrind,ctx);
+ int size = strlen (srcset);
+
+ /* These are relative to srcset. */
+ int offset, url_start, url_end;
+
+ /* Make sure to line up base_ind with srcset[0], not outside quotes. */
+ if (ctx->text[base_ind] == '"' || ctx->text[base_ind] == '\'')
+ ++base_ind;
+
+ offset = 0;
+ while (offset < size)
+ {
+ bool has_descriptor = true;
+
+ /* Skip over initial whitespace and commas. Note there is no \v
+ in HTML5 whitespace. */
+ url_start = offset + strspn (srcset + offset, " \f\n\r\t,");
+
+ if (url_start == size)
+ return;
+
+ /* URL is any non-whitespace chars (including commas) - but with
+ trailing commas removed. */
+ url_end = url_start + strcspn (srcset + url_start, " \f\n\r\t");
+ while ((url_end - 1) > url_start && srcset[url_end - 1] == ',')
+ {
+ has_descriptor = false;
+ --url_end;
+ }
+
+ if (url_end > url_start)
+ {
+ char *url_text = strdupdelim (srcset + url_start,
+ srcset + url_end);
+ struct urlpos *up = append_url (url_text, base_ind + url_start,
+ url_end - url_start, ctx);
+ if (up)
+ {
+ up->link_inline_p = 1;
+ up->link_noquote_html_p = 1;
+ }
+ xfree (url_text);
+ }
+
+ /* If the URL wasn't terminated by a , there may also be a descriptor
+ which we just skip. */
+ if (has_descriptor)
+ {
+ /* This is comma-terminated, except there may be one level of
+ parentheses escaping that. */
+ bool in_paren = false;
+ for (offset = url_end; offset < size; ++offset)
+ {
+ char c = srcset[offset];
+ if (c == '(')
+ in_paren = true;
+ else if (c == ')' && in_paren)
+ in_paren = false;
+ else if (c == ',' && !in_paren)
+ break;
+ }
+ }
+ else
+ offset = url_end;
+ }
+ }
+}
+
+/* Dispatch the tag handler appropriate for the tag we're mapping
+ over. See known_tags[] for definition of tag handlers. */
+
+static void
+collect_tags_mapper (struct taginfo *tag, void *arg)
+{
+ struct map_context *ctx = (struct map_context *)arg;
+
+ /* Find the tag in our table of tags. This must not fail because
+ map_html_tags only returns tags found in interesting_tags.
+
+ I've changed this for now, I'm passing NULL as interesting_tags
+ to map_html_tags. This way we can check all tags for a style
+ attribute.
+ */
+ struct known_tag *t = hash_table_get (interesting_tags, tag->name);
+
+ if (t != NULL)
+ t->handler (t->tagid, tag, ctx);
+
+ check_style_attr (tag, ctx);
+
+ if (tag->end_tag_p && (0 == c_strcasecmp (tag->name, "style"))
+ && tag->contents_begin && tag->contents_end
+ && tag->contents_begin <= tag->contents_end)
+ {
+ /* parse contents */
+ get_urls_css (ctx, tag->contents_begin - ctx->text,
+ tag->contents_end - tag->contents_begin);
+ }
+}
+
+/* Analyze HTML tags FILE and construct a list of URLs referenced from
+ it. It merges relative links in FILE with URL. It is aware of
+ <base href=...> and does the right thing. */
+
+struct urlpos *
+get_urls_html_fm (const char *file, const struct file_memory *fm,
+ const char *url, bool *meta_disallow_follow,
+ struct iri *iri)
+{
+ struct map_context ctx;
+ int flags;
+
+ ctx.text = fm->content;
+ ctx.head = NULL;
+ ctx.base = NULL;
+ ctx.parent_base = url ? url : opt.base_href;
+ ctx.document_file = file;
+ ctx.nofollow = false;
+
+ if (!interesting_tags)
+ init_interesting ();
+
+ /* Specify MHT_TRIM_VALUES because of buggy HTML generators that
+ generate <a href=" foo"> instead of <a href="foo"> (browsers
+ ignore spaces as well.) If you really mean space, use &32; or
+ %20. MHT_TRIM_VALUES also causes squashing of embedded newlines,
+ e.g. in <img src="foo.[newline]html">. Such newlines are also
+ ignored by IE and Mozilla and are presumably introduced by
+ writing HTML with editors that force word wrap. */
+ flags = MHT_TRIM_VALUES;
+ if (opt.strict_comments)
+ flags |= MHT_STRICT_COMMENTS;
+
+ /* the NULL here used to be interesting_tags */
+ map_html_tags (fm->content, fm->length, collect_tags_mapper, &ctx, flags,
+ NULL, interesting_attributes);
+
+#ifdef ENABLE_IRI
+ /* Meta charset is only valid if there was no HTTP header Content-Type charset. */
+ /* This is true for HTTP 1.0 and 1.1. */
+ if (iri && !iri->content_encoding && meta_charset)
+ set_content_encoding (iri, meta_charset);
+#endif
+ xfree (meta_charset);
+
+ if (ctx.nofollow) {
+ logprintf(LOG_VERBOSE, _("no-follow attribute found in %s. Will not follow any links on this page\n"), file);
+ }
+ DEBUGP (("no-follow in %s: %d\n", file, ctx.nofollow));
+
+ if (meta_disallow_follow)
+ *meta_disallow_follow = ctx.nofollow;
+
+ xfree (ctx.base);
+ return ctx.head;
+}
+
+struct urlpos *
+get_urls_html (const char *file, const char *url, bool *meta_disallow_follow,
+ struct iri *iri)
+{
+ struct urlpos *urls;
+ struct file_memory *fm;
+
+ fm = wget_read_file (file);
+ if (!fm)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno));
+ return NULL;
+ }
+ DEBUGP (("Loaded %s (size %s).\n", file, number_to_static_string (fm->length)));
+
+ urls = get_urls_html_fm (file, fm, url, meta_disallow_follow, iri);
+ wget_read_file_free (fm);
+ return urls;
+}
+
+/* This doesn't really have anything to do with HTML, but it's similar
+ to get_urls_html, so we put it here. */
+
+struct urlpos *
+get_urls_file (const char *file)
+{
+ struct file_memory *fm;
+ struct urlpos *head, *tail;
+ const char *text, *text_end;
+
+ /* Load the file. */
+ fm = wget_read_file (file);
+ if (!fm)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", file, strerror (errno));
+ return NULL;
+ }
+ DEBUGP (("Loaded %s (size %s).\n", file, number_to_static_string (fm->length)));
+
+ head = tail = NULL;
+ text = fm->content;
+ text_end = fm->content + fm->length;
+ while (text < text_end)
+ {
+ int up_error_code;
+ char *url_text;
+ char *new_url;
+ struct urlpos *entry;
+ struct url *url;
+
+ const char *line_beg = text;
+ const char *line_end = memchr (text, '\n', text_end - text);
+ if (!line_end)
+ line_end = text_end;
+ else
+ ++line_end;
+ text = line_end;
+
+ /* Strip whitespace from the beginning and end of line. */
+ while (line_beg < line_end && c_isspace (*line_beg))
+ ++line_beg;
+ while (line_end > line_beg && c_isspace (*(line_end - 1)))
+ --line_end;
+
+ if (line_beg == line_end)
+ continue;
+
+ /* The URL is in the [line_beg, line_end) region. */
+
+ /* We must copy the URL to a zero-terminated string, and we
+ can't use alloca because we're in a loop. *sigh*. */
+ url_text = strdupdelim (line_beg, line_end);
+
+ if (opt.base_href)
+ {
+ /* Merge opt.base_href with URL. */
+ char *merged = uri_merge (opt.base_href, url_text);
+ xfree (url_text);
+ url_text = merged;
+ }
+
+ new_url = rewrite_shorthand_url (url_text);
+ if (new_url)
+ {
+ xfree (url_text);
+ url_text = new_url;
+ }
+
+ url = url_parse (url_text, &up_error_code, NULL, false);
+ if (!url)
+ {
+ char *error = url_error (url_text, up_error_code);
+ logprintf (LOG_NOTQUIET, _("%s: Invalid URL %s: %s\n"),
+ file, url_text, error);
+ xfree (url_text);
+ xfree (error);
+ inform_exit_status (URLERROR);
+ continue;
+ }
+ xfree (url_text);
+
+ entry = xnew0 (struct urlpos);
+ entry->url = url;
+
+ if (!head)
+ head = entry;
+ else
+ tail->next = entry;
+ tail = entry;
+ }
+ wget_read_file_free (fm);
+ return head;
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+cleanup_html_url (void)
+{
+ /* Destroy the hash tables. The hash table keys and values are not
+ allocated by this code, so we don't need to free them here. */
+ if (interesting_tags)
+ hash_table_destroy (interesting_tags);
+ if (interesting_attributes)
+ hash_table_destroy (interesting_attributes);
+}
+#endif
diff --git a/src/html-url.h b/src/html-url.h
new file mode 100644
index 0000000..abc7edd
--- /dev/null
+++ b/src/html-url.h
@@ -0,0 +1,58 @@
+/* Declarations for html-url.c.
+ Copyright (C) 1995-1997, 2009-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef HTML_URL_H
+#define HTML_URL_H
+
+#include <stdbool.h>
+#include "utils.h"
+#include "convert.h"
+#include "iri.h"
+
+struct map_context {
+ char *text; /* HTML text. */
+ char *base; /* Base URI of the document, possibly
+ changed through <base href=...>. */
+ const char *parent_base; /* Base of the current document. */
+ const char *document_file; /* File name of this document. */
+ bool nofollow; /* whether NOFOLLOW was specified in a
+ <meta name=robots> tag. */
+
+ struct urlpos *head; /* List of URLs that is being built. */
+};
+
+struct urlpos *get_urls_file (const char *);
+struct urlpos *get_urls_html (const char *, const char *, bool *, struct iri *);
+struct urlpos *get_urls_html_fm (const char *, const struct file_memory *, const char *, bool *, struct iri *);
+struct urlpos *append_url (const char *, int, int, struct map_context *);
+void free_urlpos (struct urlpos *);
+void cleanup_html_url (void);
+
+#endif /* HTML_URL_H */
diff --git a/src/http-ntlm.c b/src/http-ntlm.c
new file mode 100644
index 0000000..ceba3b8
--- /dev/null
+++ b/src/http-ntlm.c
@@ -0,0 +1,618 @@
+/* NTLM code.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+ Contributed by Daniel Stenberg.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+/* NTLM details:
+
+ http://davenport.sourceforge.net/ntlm.html
+ http://www.innovation.ch/java/ntlm.html
+
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "utils.h"
+#include "http-ntlm.h"
+
+#ifdef HAVE_NETTLE
+# include <nettle/md4.h>
+# include <nettle/des.h>
+#else
+# include <openssl/des.h>
+# include <openssl/md4.h>
+# include <openssl/opensslv.h>
+
+# if OPENSSL_VERSION_NUMBER < 0x00907001L
+# define DES_key_schedule des_key_schedule
+# define DES_cblock des_cblock
+# define DES_set_odd_parity des_set_odd_parity
+# define DES_set_key des_set_key
+# define DES_ecb_encrypt des_ecb_encrypt
+
+/* This is how things were done in the old days */
+# define DESKEY(x) x
+# define DESKEYARG(x) x
+# else
+/* Modern version */
+# define DESKEYARG(x) *x
+# define DESKEY(x) &x
+# endif
+
+#endif
+
+/* Define this to make the type-3 message include the NT response message */
+#define USE_NTRESPONSES 1
+
+
+/* Flag bits definitions available at on
+ http://davenport.sourceforge.net/ntlm.html */
+
+#define NTLMFLAG_NEGOTIATE_OEM (1<<1)
+#define NTLMFLAG_NEGOTIATE_NTLM_KEY (1<<9)
+
+/*
+ (*) = A "security buffer" is a triplet consisting of two shorts and one
+ long:
+
+ 1. a 'short' containing the length of the buffer in bytes
+ 2. a 'short' containing the allocated space for the buffer in bytes
+ 3. a 'long' containing the offset to the start of the buffer from the
+ beginning of the NTLM message, in bytes.
+*/
+
+/* return true on success, false otherwise */
+bool
+ntlm_input (struct ntlmdata *ntlm, const char *header)
+{
+ if (0 != strncmp (header, "NTLM", 4))
+ return false;
+
+ header += 4;
+ while (*header && c_isspace(*header))
+ header++;
+
+ if (*header)
+ {
+ /* We got a type-2 message here:
+
+ Index Description Content
+ 0 NTLMSSP Signature Null-terminated ASCII "NTLMSSP"
+ (0x4e544c4d53535000)
+ 8 NTLM Message Type long (0x02000000)
+ 12 Target Name security buffer(*)
+ 20 Flags long
+ 24 Challenge 8 bytes
+ (32) Context (optional) 8 bytes (two consecutive longs)
+ (40) Target Information (optional) security buffer(*)
+ 32 (48) start of data block
+ */
+ ssize_t size;
+ char buffer[48]; // decode 48 bytes needs ((48 + 2) / 3) * 4 + 1 bytes
+
+ DEBUGP (("Received a type-2 NTLM message.\n"));
+
+ size = wget_base64_decode (header, buffer, sizeof (buffer));
+ if (size < 0)
+ return false; /* malformed base64 from server */
+
+ ntlm->state = NTLMSTATE_TYPE2; /* we got a type-2 */
+
+ if ((size_t) size >= sizeof (buffer))
+ /* the nonce of interest is index [24 .. 31], 8 bytes */
+ memcpy (ntlm->nonce, &buffer[24], 8);
+
+ /* at index decimal 20, there's a 32bit NTLM flag field */
+ }
+ else
+ {
+ if (ntlm->state == NTLMSTATE_LAST)
+ {
+ DEBUGP (("NTLM auth restarted.\n"));
+ /* no return, continue */
+ }
+ else if (ntlm->state == NTLMSTATE_TYPE3)
+ {
+ DEBUGP (("NTLM handshake rejected.\n"));
+ ntlm->state = NTLMSTATE_NONE;
+ return false;
+ }
+ else if (ntlm->state >= NTLMSTATE_TYPE1)
+ {
+ DEBUGP (("Unexpected empty NTLM message.\n"));
+ return false; /* this is an error */
+ }
+
+ DEBUGP (("Empty NTLM message, (re)starting transaction.\n"));
+ ntlm->state = NTLMSTATE_TYPE1; /* we should sent away a type-1 */
+ }
+
+ return true;
+}
+
+/*
+ * Turns a 56 bit key into the 64 bit, odd parity key and sets the key. The
+ * key schedule ks is also set.
+ */
+#ifdef HAVE_NETTLE
+static void
+setup_des_key(unsigned char *key_56,
+ struct des_ctx *des)
+{
+ unsigned char key[8];
+
+ key[0] = key_56[0];
+ key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1);
+ key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2);
+ key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3);
+ key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4);
+ key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5);
+ key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6);
+ key[7] = (key_56[6] << 1) & 0xFF;
+
+ nettle_des_set_key(des, key);
+}
+#else
+static void
+setup_des_key(unsigned char *key_56,
+ DES_key_schedule DESKEYARG(ks))
+{
+ DES_cblock key;
+
+ key[0] = key_56[0];
+ key[1] = ((key_56[0] << 7) & 0xFF) | (key_56[1] >> 1);
+ key[2] = ((key_56[1] << 6) & 0xFF) | (key_56[2] >> 2);
+ key[3] = ((key_56[2] << 5) & 0xFF) | (key_56[3] >> 3);
+ key[4] = ((key_56[3] << 4) & 0xFF) | (key_56[4] >> 4);
+ key[5] = ((key_56[4] << 3) & 0xFF) | (key_56[5] >> 5);
+ key[6] = ((key_56[5] << 2) & 0xFF) | (key_56[6] >> 6);
+ key[7] = (key_56[6] << 1) & 0xFF;
+
+ DES_set_odd_parity(&key);
+ DES_set_key(&key, ks);
+}
+#endif
+
+ /*
+ * takes a 21 byte array and treats it as 3 56-bit DES keys. The
+ * 8 byte plaintext is encrypted with each key and the resulting 24
+ * bytes are stored in the results array.
+ */
+static void
+calc_resp(unsigned char *keys, unsigned char *plaintext, unsigned char *results)
+{
+#ifdef HAVE_NETTLE
+ struct des_ctx des;
+
+ setup_des_key(keys, &des);
+ nettle_des_encrypt(&des, 8, results, plaintext);
+
+ setup_des_key(keys + 7, &des);
+ nettle_des_encrypt(&des, 8, results + 8, plaintext);
+
+ setup_des_key(keys + 14, &des);
+ nettle_des_encrypt(&des, 8, results + 16, plaintext);
+#else
+ DES_key_schedule ks;
+
+ setup_des_key(keys, DESKEY(ks));
+ DES_ecb_encrypt((DES_cblock*) plaintext, (DES_cblock*) results,
+ DESKEY(ks), DES_ENCRYPT);
+
+ setup_des_key(keys+7, DESKEY(ks));
+ DES_ecb_encrypt((DES_cblock*) plaintext, (DES_cblock*) (results+8),
+ DESKEY(ks), DES_ENCRYPT);
+
+ setup_des_key(keys+14, DESKEY(ks));
+ DES_ecb_encrypt((DES_cblock*) plaintext, (DES_cblock*) (results+16),
+ DESKEY(ks), DES_ENCRYPT);
+#endif
+}
+
+/*
+ * Set up lanmanager and nt hashed passwords
+ */
+static void
+mkhash(const char *password,
+ unsigned char *nonce, /* 8 bytes */
+ unsigned char *lmresp /* must fit 0x18 bytes */
+#ifdef USE_NTRESPONSES
+ , unsigned char *ntresp /* must fit 0x18 bytes */
+#endif
+ )
+{
+ unsigned char lmbuffer[21];
+#ifdef USE_NTRESPONSES
+ unsigned char ntbuffer[21];
+#endif
+ unsigned char pw[14];
+ static const unsigned char magic[] = {
+ 0x4B, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25
+ };
+ size_t i, len = strlen(password);
+
+ /* make it fit at least 14 bytes */
+
+ if (len > sizeof (pw))
+ len = sizeof (pw);
+
+ for (i = 0; i < len; i++)
+ pw[i] = (unsigned char) c_toupper (password[i]);
+
+ for (; i < sizeof (pw); i++)
+ pw[i] = 0;
+
+ {
+ /* create LanManager hashed password */
+#ifdef HAVE_NETTLE
+ struct des_ctx des;
+
+ setup_des_key(pw, &des);
+ nettle_des_encrypt(&des, 8, lmbuffer, magic);
+
+ setup_des_key(pw + 7, &des);
+ nettle_des_encrypt(&des, 8, lmbuffer + 8, magic);
+#else
+ DES_key_schedule ks;
+
+ setup_des_key(pw, DESKEY (ks));
+ DES_ecb_encrypt((DES_cblock *) magic, (DES_cblock *) lmbuffer,
+ DESKEY (ks), DES_ENCRYPT);
+
+ setup_des_key(pw+7, DESKEY (ks));
+ DES_ecb_encrypt((DES_cblock *) magic, (DES_cblock *) (lmbuffer + 8),
+ DESKEY (ks), DES_ENCRYPT);
+#endif
+
+ memset(lmbuffer + 16, 0, 5);
+ }
+ /* create LM responses */
+ calc_resp(lmbuffer, nonce, lmresp);
+
+#ifdef USE_NTRESPONSES
+ {
+#ifdef HAVE_NETTLE
+ struct md4_ctx MD4;
+#else
+ MD4_CTX MD4;
+#endif
+
+ unsigned char pw4[64];
+
+ len = strlen (password);
+
+ if (len > sizeof (pw4) / 2)
+ len = sizeof (pw4) / 2;
+
+ for (i = 0; i < len; i++) {
+ pw4[2 * i] = (unsigned char) password[i];
+ pw4[2 * i + 1] = 0;
+ }
+
+#ifdef HAVE_NETTLE
+ nettle_md4_init(&MD4);
+ nettle_md4_update(&MD4, (unsigned) (2 * len), pw4);
+ nettle_md4_digest(&MD4, MD4_DIGEST_SIZE, ntbuffer);
+#else
+ /* create NT hashed password */
+ MD4_Init(&MD4);
+ MD4_Update(&MD4, pw4, 2 * len);
+ MD4_Final(ntbuffer, &MD4);
+#endif
+
+ memset(ntbuffer + 16, 0, 5);
+ }
+
+ calc_resp(ntbuffer, nonce, ntresp);
+#endif
+}
+
+#define SHORTPAIR(x) (char) ((x) & 0xff), (char) ((x) >> 8)
+#define LONGQUARTET(x) ((x) & 0xff), (((x) >> 8)&0xff), \
+ (((x) >>16)&0xff), ((x)>>24)
+
+/* this is for creating ntlm header output */
+char *
+ntlm_output (struct ntlmdata *ntlm, const char *user, const char *passwd,
+ bool *ready)
+{
+ const char *domain = ""; /* empty */
+ const char *host = ""; /* empty */
+ size_t domlen = strlen(domain);
+ size_t hostlen = strlen(host);
+ size_t hostoff; /* host name offset */
+ size_t domoff; /* domain name offset */
+ size_t size;
+ char ntlmbuf[256]; /* enough, unless the host/domain is very long */
+
+ /* point to the address of the pointer that holds the string to sent to the
+ server, which is for a plain host or for a HTTP proxy */
+ char *output = NULL;
+
+ *ready = false;
+
+ /* not set means empty */
+ if(!user)
+ user="";
+
+ if(!passwd)
+ passwd="";
+
+ switch(ntlm->state) {
+ case NTLMSTATE_TYPE1:
+ case NTLMSTATE_NONE:
+ case NTLMSTATE_LAST:
+ hostoff = 32;
+ domoff = hostoff + hostlen;
+
+ DEBUGP (("Creating a type-1 NTLM message.\n"));
+
+ /* Create and send a type-1 message:
+
+ Index Description Content
+ 0 NTLMSSP Signature Null-terminated ASCII "NTLMSSP"
+ (0x4e544c4d53535000)
+ 8 NTLM Message Type long (0x01000000)
+ 12 Flags long
+ 16 Supplied Domain security buffer(*)
+ 24 Supplied Workstation security buffer(*)
+ 32 start of data block
+
+ */
+
+ snprintf (ntlmbuf, sizeof(ntlmbuf), "NTLMSSP%c"
+ "\x01%c%c%c" /* 32-bit type = 1 */
+ "%c%c%c%c" /* 32-bit NTLM flag field */
+ "%c%c" /* domain length */
+ "%c%c" /* domain allocated space */
+ "%c%c" /* domain name offset */
+ "%c%c" /* 2 zeroes */
+ "%c%c" /* host length */
+ "%c%c" /* host allocated space */
+ "%c%c" /* host name offset */
+ "%c%c" /* 2 zeroes */
+ "%s" /* host name */
+ "%s", /* domain string */
+ 0, /* trailing zero */
+ 0,0,0, /* part of type-1 long */
+
+ LONGQUARTET(
+ NTLMFLAG_NEGOTIATE_OEM| /* 2 */
+ NTLMFLAG_NEGOTIATE_NTLM_KEY /* 200 */
+ /* equals 0x0202 */
+ ),
+ SHORTPAIR(domlen),
+ SHORTPAIR(domlen),
+ SHORTPAIR(domoff),
+ 0,0,
+ SHORTPAIR(hostlen),
+ SHORTPAIR(hostlen),
+ SHORTPAIR(hostoff),
+ 0,0,
+ host, domain);
+
+ /* initial packet length */
+ size = 32 + hostlen + domlen;
+
+ output = xmalloc(5 + BASE64_LENGTH (size) + 1);
+ memcpy(output, "NTLM ", 5);
+ wget_base64_encode (ntlmbuf, size, output + 5);
+
+ break;
+
+ case NTLMSTATE_TYPE2:
+ /* We received the type-2 already, create a type-3 message:
+
+ Index Description Content
+ 0 NTLMSSP Signature Null-terminated ASCII "NTLMSSP"
+ (0x4e544c4d53535000)
+ 8 NTLM Message Type long (0x03000000)
+ 12 LM/LMv2 Response security buffer(*)
+ 20 NTLM/NTLMv2 Response security buffer(*)
+ 28 Domain Name security buffer(*)
+ 36 User Name security buffer(*)
+ 44 Workstation Name security buffer(*)
+ (52) Session Key (optional) security buffer(*)
+ (60) Flags (optional) long
+ 52 (64) start of data block
+
+ */
+
+ {
+ size_t lmrespoff;
+ size_t ntrespoff;
+ size_t useroff;
+ unsigned char lmresp[0x18]; /* fixed-size */
+#ifdef USE_NTRESPONSES
+ unsigned char ntresp[0x18]; /* fixed-size */
+#endif
+ const char *usr;
+ size_t userlen;
+
+ DEBUGP (("Creating a type-3 NTLM message.\n"));
+
+ usr = strchr(user, '\\');
+ if(!usr)
+ usr = strchr(user, '/');
+
+ if (usr) {
+ domain = user;
+ domlen = (size_t) (usr - domain);
+ usr++;
+ }
+ else
+ usr = user;
+ userlen = strlen(usr);
+
+ mkhash(passwd, &ntlm->nonce[0], lmresp
+#ifdef USE_NTRESPONSES
+ , ntresp
+#endif
+ );
+
+ domoff = 64; /* always */
+ useroff = domoff + domlen;
+ hostoff = useroff + userlen;
+ lmrespoff = hostoff + hostlen;
+ ntrespoff = lmrespoff + 0x18;
+
+ /* Create the big type-3 message binary blob */
+
+ snprintf (ntlmbuf, sizeof (ntlmbuf),
+ "NTLMSSP%c"
+ "\x03%c%c%c" /* type-3, 32 bits */
+
+ "%c%c%c%c" /* LanManager length + allocated space */
+ "%c%c" /* LanManager offset */
+ "%c%c" /* 2 zeroes */
+
+ "%c%c" /* NT-response length */
+ "%c%c" /* NT-response allocated space */
+ "%c%c" /* NT-response offset */
+ "%c%c" /* 2 zeroes */
+
+ "%c%c" /* domain length */
+ "%c%c" /* domain allocated space */
+ "%c%c" /* domain name offset */
+ "%c%c" /* 2 zeroes */
+
+ "%c%c" /* user length */
+ "%c%c" /* user allocated space */
+ "%c%c" /* user offset */
+ "%c%c" /* 2 zeroes */
+
+ "%c%c" /* host length */
+ "%c%c" /* host allocated space */
+ "%c%c" /* host offset */
+ "%c%c%c%c%c%c" /* 6 zeroes */
+
+ "\xff\xff" /* message length */
+ "%c%c" /* 2 zeroes */
+
+ "\x01\x82" /* flags */
+ "%c%c" /* 2 zeroes */
+
+ /* domain string */
+ /* user string */
+ /* host string */
+ /* LanManager response */
+ /* NT response */
+ ,
+ 0, /* zero termination */
+ 0, 0, 0, /* type-3 long, the 24 upper bits */
+
+ SHORTPAIR (0x18), /* LanManager response length, twice */
+ SHORTPAIR (0x18),
+ SHORTPAIR (lmrespoff),
+ 0x0, 0x0,
+
+#ifdef USE_NTRESPONSES
+ SHORTPAIR (0x18), /* NT-response length, twice */
+ SHORTPAIR (0x18),
+#else
+ 0x0, 0x0,
+ 0x0, 0x0,
+#endif
+ SHORTPAIR (ntrespoff),
+ 0x0, 0x0,
+
+ SHORTPAIR (domlen),
+ SHORTPAIR (domlen),
+ SHORTPAIR (domoff),
+ 0x0, 0x0,
+
+ SHORTPAIR (userlen),
+ SHORTPAIR (userlen),
+ SHORTPAIR (useroff),
+ 0x0, 0x0,
+
+ SHORTPAIR (hostlen),
+ SHORTPAIR (hostlen),
+ SHORTPAIR (hostoff),
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+
+ 0x0, 0x0,
+
+ 0x0, 0x0);
+
+ /* size is now 64 */
+ size=64;
+ ntlmbuf[62]=ntlmbuf[63]=0;
+
+ /* Make sure that the user and domain strings fit in the target buffer
+ before we copy them there. */
+ if((size + userlen + domlen) >= sizeof(ntlmbuf))
+ return NULL;
+
+ memcpy(&ntlmbuf[size], domain, domlen);
+ size += domlen;
+
+ memcpy(&ntlmbuf[size], usr, userlen);
+ size += userlen;
+
+ /* we append the binary hashes to the end of the blob */
+ if(size < (sizeof(ntlmbuf) - 0x18)) {
+ memcpy(&ntlmbuf[size], lmresp, 0x18);
+ size += 0x18;
+ }
+
+#ifdef USE_NTRESPONSES
+ if(size < (sizeof(ntlmbuf) - 0x18)) {
+ memcpy(&ntlmbuf[size], ntresp, 0x18);
+ size += 0x18;
+ }
+#endif
+
+ ntlmbuf[56] = (char) (size & 0xff);
+ ntlmbuf[57] = (char) (size >> 8);
+
+ /* convert the binary blob into base64 */
+ output = xmalloc(5 + BASE64_LENGTH (size) + 1);
+ memcpy(output, "NTLM ", 5);
+ wget_base64_encode (ntlmbuf, size, output + 5);
+
+ ntlm->state = NTLMSTATE_TYPE3; /* we sent a type-3 */
+ *ready = true;
+ }
+ break;
+
+ case NTLMSTATE_TYPE3:
+ /* connection is already authenticated,
+ * don't send a header in future requests */
+ *ready = true;
+ output = NULL;
+ break;
+ }
+
+ return output;
+}
diff --git a/src/http-ntlm.h b/src/http-ntlm.h
new file mode 100644
index 0000000..de0c9ce
--- /dev/null
+++ b/src/http-ntlm.h
@@ -0,0 +1,53 @@
+#ifndef __HTTP_NTLM_H
+#define __HTTP_NTLM_H
+/* Declarations for http_ntlm.c
+ Copyright (C) 1995-1997, 2000, 2007-2011, 2015, 2018-2020 Free
+ Software Foundation, Inc.
+ Contributed by Daniel Stenberg.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+typedef enum {
+ NTLMSTATE_NONE,
+ NTLMSTATE_TYPE1,
+ NTLMSTATE_TYPE2,
+ NTLMSTATE_TYPE3,
+ NTLMSTATE_LAST
+} wgetntlm;
+
+/* Struct used for NTLM challenge-response authentication */
+struct ntlmdata {
+ wgetntlm state;
+ unsigned char nonce[8];
+};
+
+/* this is for ntlm header input */
+bool ntlm_input (struct ntlmdata *, const char *);
+
+/* this is for creating ntlm header output */
+char *ntlm_output (struct ntlmdata *, const char *, const char *, bool *);
+#endif
diff --git a/src/http.c b/src/http.c
new file mode 100644
index 0000000..26e10d2
--- /dev/null
+++ b/src/http.c
@@ -0,0 +1,5495 @@
+/* HTTP support.
+ Copyright (C) 1996-2012, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#include <time.h>
+#include <locale.h>
+#include <fcntl.h>
+
+#include "hash.h"
+#include "http.h"
+#include "hsts.h"
+#include "utils.h"
+#include "url.h"
+#include "host.h"
+#include "retr.h"
+#include "connect.h"
+#include "netrc.h"
+#ifdef HAVE_SSL
+# include "ssl.h"
+#endif
+#ifdef ENABLE_NTLM
+# include "http-ntlm.h"
+#endif
+#include "cookies.h"
+#include "md5.h"
+#include "convert.h"
+#include "spider.h"
+#include "warc.h"
+#include "c-strcase.h"
+#include "version.h"
+#include "xstrndup.h"
+#ifdef HAVE_METALINK
+# include "metalink.h"
+#endif
+#ifdef ENABLE_XATTR
+#include "xattr.h"
+#endif
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+#ifdef __VMS
+# include "vms.h"
+#endif /* def __VMS */
+
+
+/* Forward decls. */
+struct http_stat;
+static char *create_authorization_line (const char *, const char *,
+ const char *, const char *,
+ const char *, bool *, uerr_t *);
+static char *basic_authentication_encode (const char *, const char *);
+static bool known_authentication_scheme_p (const char *, const char *);
+static void ensure_extension (struct http_stat *, const char *, int *);
+static void load_cookies (void);
+
+static bool cookies_loaded_p;
+static struct cookie_jar *wget_cookie_jar;
+
+#define TEXTHTML_S "text/html"
+#define TEXTXHTML_S "application/xhtml+xml"
+#define TEXTCSS_S "text/css"
+
+/* Some status code validation macros: */
+#define H_10X(x) (((x) >= 100) && ((x) < 200))
+#define H_20X(x) (((x) >= 200) && ((x) < 300))
+#define H_PARTIAL(x) ((x) == HTTP_STATUS_PARTIAL_CONTENTS)
+#define H_REDIRECTED(x) ((x) == HTTP_STATUS_MOVED_PERMANENTLY \
+ || (x) == HTTP_STATUS_MOVED_TEMPORARILY \
+ || (x) == HTTP_STATUS_SEE_OTHER \
+ || (x) == HTTP_STATUS_TEMPORARY_REDIRECT \
+ || (x) == HTTP_STATUS_PERMANENT_REDIRECT)
+
+/* HTTP/1.0 status codes from RFC1945, provided for reference. */
+/* Successful 2xx. */
+#define HTTP_STATUS_OK 200
+#define HTTP_STATUS_CREATED 201
+#define HTTP_STATUS_ACCEPTED 202
+#define HTTP_STATUS_NO_CONTENT 204
+#define HTTP_STATUS_PARTIAL_CONTENTS 206
+
+/* Redirection 3xx. */
+#define HTTP_STATUS_MULTIPLE_CHOICES 300
+#define HTTP_STATUS_MOVED_PERMANENTLY 301
+#define HTTP_STATUS_MOVED_TEMPORARILY 302
+#define HTTP_STATUS_SEE_OTHER 303 /* from HTTP/1.1 */
+#define HTTP_STATUS_NOT_MODIFIED 304
+#define HTTP_STATUS_TEMPORARY_REDIRECT 307 /* from HTTP/1.1 */
+#define HTTP_STATUS_PERMANENT_REDIRECT 308 /* from HTTP/1.1 */
+
+/* Client error 4xx. */
+#define HTTP_STATUS_BAD_REQUEST 400
+#define HTTP_STATUS_UNAUTHORIZED 401
+#define HTTP_STATUS_FORBIDDEN 403
+#define HTTP_STATUS_NOT_FOUND 404
+#define HTTP_STATUS_RANGE_NOT_SATISFIABLE 416
+
+/* Server errors 5xx. */
+#define HTTP_STATUS_INTERNAL 500
+#define HTTP_STATUS_NOT_IMPLEMENTED 501
+#define HTTP_STATUS_BAD_GATEWAY 502
+#define HTTP_STATUS_UNAVAILABLE 503
+#define HTTP_STATUS_GATEWAY_TIMEOUT 504
+
+enum rp {
+ rel_none, rel_name, rel_value, rel_both
+};
+
+struct request {
+ const char *method;
+ char *arg;
+
+ struct request_header {
+ char *name, *value;
+ enum rp release_policy;
+ } *headers;
+ int hcount, hcapacity;
+};
+
+
+/* Create a new, empty request. Set the request's method and its
+ arguments. METHOD should be a literal string (or it should outlive
+ the request) because it will not be freed. ARG will be freed by
+ request_free. */
+
+static struct request *
+request_new (const char *method, char *arg)
+{
+ struct request *req = xnew0 (struct request);
+ req->hcapacity = 8;
+ req->headers = xnew_array (struct request_header, req->hcapacity);
+ req->method = method;
+ req->arg = arg;
+ return req;
+}
+
+/* Return the method string passed with the last call to
+ request_set_method. */
+
+static const char *
+request_method (const struct request *req)
+{
+ return req->method;
+}
+
+/* Free one header according to the release policy specified with
+ request_set_header. */
+
+static void
+release_header (struct request_header *hdr)
+{
+ switch (hdr->release_policy)
+ {
+ case rel_none:
+ break;
+ case rel_name:
+ xfree (hdr->name);
+ break;
+ case rel_value:
+ xfree (hdr->value);
+ break;
+ case rel_both:
+ xfree (hdr->name);
+ xfree (hdr->value);
+ break;
+ }
+}
+
+/* Set the request named NAME to VALUE. Specifically, this means that
+ a "NAME: VALUE\r\n" header line will be used in the request. If a
+ header with the same name previously existed in the request, its
+ value will be replaced by this one. A NULL value means do nothing.
+
+ RELEASE_POLICY determines whether NAME and VALUE should be released
+ (freed) with request_free. Allowed values are:
+
+ - rel_none - don't free NAME or VALUE
+ - rel_name - free NAME when done
+ - rel_value - free VALUE when done
+ - rel_both - free both NAME and VALUE when done
+
+ Setting release policy is useful when arguments come from different
+ sources. For example:
+
+ // Don't free literal strings!
+ request_set_header (req, "Pragma", "no-cache", rel_none);
+
+ // Don't free a global variable, we'll need it later.
+ request_set_header (req, "Referer", opt.referer, rel_none);
+
+ // Value freshly allocated, free it when done.
+ request_set_header (req, "Range",
+ aprintf ("bytes=%s-", number_to_static_string (hs->restval)),
+ rel_value);
+ */
+
+static void
+request_set_header (struct request *req, const char *name, const char *value,
+ enum rp release_policy)
+{
+ struct request_header *hdr;
+ int i;
+
+ if (!value)
+ {
+ /* A NULL value is a no-op; if freeing the name is requested,
+ free it now to avoid leaks. */
+ if (release_policy == rel_name || release_policy == rel_both)
+ xfree (name);
+ return;
+ }
+
+ for (i = 0; i < req->hcount; i++)
+ {
+ hdr = &req->headers[i];
+ if (0 == c_strcasecmp (name, hdr->name))
+ {
+ /* Replace existing header. */
+ release_header (hdr);
+ hdr->name = (void *)name;
+ hdr->value = (void *)value;
+ hdr->release_policy = release_policy;
+ return;
+ }
+ }
+
+ /* Install new header. */
+
+ if (req->hcount >= req->hcapacity)
+ {
+ req->hcapacity <<= 1;
+ req->headers = xrealloc (req->headers, req->hcapacity * sizeof (*hdr));
+ }
+ hdr = &req->headers[req->hcount++];
+ hdr->name = (void *)name;
+ hdr->value = (void *)value;
+ hdr->release_policy = release_policy;
+}
+
+/* Like request_set_header, but sets the whole header line, as
+ provided by the user using the `--header' option. For example,
+ request_set_user_header (req, "Foo: bar") works just like
+ request_set_header (req, "Foo", "bar"). */
+
+static void
+request_set_user_header (struct request *req, const char *header)
+{
+ const char *name, *p;
+
+ if (!(p = strchr (header, ':')))
+ return;
+
+ name = xstrndup(header, p - header);
+
+ ++p;
+ while (c_isspace (*p))
+ ++p;
+
+ request_set_header (req, name, p, rel_name);
+}
+
+/* Remove the header with specified name from REQ. Returns true if
+ the header was actually removed, false otherwise. */
+
+static bool
+request_remove_header (struct request *req, const char *name)
+{
+ int i;
+ for (i = 0; i < req->hcount; i++)
+ {
+ struct request_header *hdr = &req->headers[i];
+ if (0 == c_strcasecmp (name, hdr->name))
+ {
+ release_header (hdr);
+ /* Move the remaining headers by one. */
+ if (i < req->hcount - 1)
+ memmove (hdr, hdr + 1, (req->hcount - i - 1) * sizeof (*hdr));
+ --req->hcount;
+ return true;
+ }
+ }
+ return false;
+}
+
+#define APPEND(p, str) do { \
+ int A_len = strlen (str); \
+ memcpy (p, str, A_len); \
+ p += A_len; \
+} while (0)
+
+/* Construct the request and write it to FD using fd_write.
+ If warc_tmp is set to a file pointer, the request string will
+ also be written to that file. */
+
+static int
+request_send (const struct request *req, int fd, FILE *warc_tmp)
+{
+ char *request_string, *p;
+ int i, size, write_error;
+
+ /* Count the request size. */
+ size = 0;
+
+ /* METHOD " " ARG " " "HTTP/1.0" "\r\n" */
+ size += strlen (req->method) + 1 + strlen (req->arg) + 1 + 8 + 2;
+
+ for (i = 0; i < req->hcount; i++)
+ {
+ struct request_header *hdr = &req->headers[i];
+ /* NAME ": " VALUE "\r\n" */
+ size += strlen (hdr->name) + 2 + strlen (hdr->value) + 2;
+ }
+
+ /* "\r\n\0" */
+ size += 3;
+
+ p = request_string = xmalloc (size);
+
+ /* Generate the request. */
+
+ APPEND (p, req->method); *p++ = ' ';
+ APPEND (p, req->arg); *p++ = ' ';
+ memcpy (p, "HTTP/1.1\r\n", 10); p += 10;
+
+ for (i = 0; i < req->hcount; i++)
+ {
+ struct request_header *hdr = &req->headers[i];
+ APPEND (p, hdr->name);
+ *p++ = ':', *p++ = ' ';
+ APPEND (p, hdr->value);
+ *p++ = '\r', *p++ = '\n';
+ }
+
+ *p++ = '\r', *p++ = '\n', *p++ = '\0';
+ assert (p - request_string == size);
+
+#undef APPEND
+
+ DEBUGP (("\n---request begin---\n%s---request end---\n", request_string));
+
+ /* Send the request to the server. */
+
+ write_error = fd_write (fd, request_string, size - 1, -1);
+ if (write_error < 0)
+ logprintf (LOG_VERBOSE, _("Failed writing HTTP request: %s.\n"),
+ fd_errstr (fd));
+ else if (warc_tmp != NULL)
+ {
+ /* Write a copy of the data to the WARC record. */
+ int warc_tmp_written = fwrite (request_string, 1, size - 1, warc_tmp);
+ if (warc_tmp_written != size - 1)
+ write_error = -2;
+ }
+ xfree (request_string);
+ return write_error;
+}
+
+/* Release the resources used by REQ.
+ It is safe to call it with a valid pointer to a NULL pointer.
+ It is not safe to call it with an invalid or NULL pointer. */
+
+static void
+request_free (struct request **req_ref)
+{
+ int i;
+ struct request *req = *req_ref;
+
+ if (!req)
+ return;
+
+ xfree (req->arg);
+ for (i = 0; i < req->hcount; i++)
+ release_header (&req->headers[i]);
+ xfree (req->headers);
+ xfree (req);
+ *req_ref = NULL;
+}
+
+static struct hash_table *basic_authed_hosts;
+
+/* Find out if this host has issued a Basic challenge yet; if so, give
+ * it the username, password. A temporary measure until we can get
+ * proper authentication in place. */
+
+static bool
+maybe_send_basic_creds (const char *hostname, const char *user,
+ const char *passwd, struct request *req)
+{
+ bool do_challenge = false;
+
+ if (opt.auth_without_challenge)
+ {
+ DEBUGP (("Auth-without-challenge set, sending Basic credentials.\n"));
+ do_challenge = true;
+ }
+ else if (basic_authed_hosts
+ && hash_table_contains (basic_authed_hosts, hostname))
+ {
+ DEBUGP (("Found %s in basic_authed_hosts.\n", quote (hostname)));
+ do_challenge = true;
+ }
+ else
+ {
+ DEBUGP (("Host %s has not issued a general basic challenge.\n",
+ quote (hostname)));
+ }
+ if (do_challenge)
+ {
+ request_set_header (req, "Authorization",
+ basic_authentication_encode (user, passwd),
+ rel_value);
+ }
+ return do_challenge;
+}
+
+static void
+register_basic_auth_host (const char *hostname)
+{
+ if (!basic_authed_hosts)
+ {
+ basic_authed_hosts = make_nocase_string_hash_table (1);
+ }
+ if (!hash_table_contains (basic_authed_hosts, hostname))
+ {
+ hash_table_put (basic_authed_hosts, xstrdup (hostname), NULL);
+ DEBUGP (("Inserted %s into basic_authed_hosts\n", quote (hostname)));
+ }
+}
+
+/* Send the contents of FILE_NAME to SOCK. Make sure that exactly
+ PROMISED_SIZE bytes are sent over the wire -- if the file is
+ longer, read only that much; if the file is shorter, report an error.
+ If warc_tmp is set to a file pointer, the post data will
+ also be written to that file. */
+
+static int
+body_file_send (int sock, const char *file_name, wgint promised_size, FILE *warc_tmp)
+{
+ static char chunk[8192];
+ wgint written = 0;
+ int write_error;
+ FILE *fp;
+
+ DEBUGP (("[writing BODY file %s ... ", file_name));
+
+ fp = fopen (file_name, "rb");
+ if (!fp)
+ return -1;
+ while (!feof (fp) && written < promised_size)
+ {
+ int towrite;
+ int length = fread (chunk, 1, sizeof (chunk), fp);
+ if (length == 0)
+ break;
+ towrite = MIN (promised_size - written, length);
+ write_error = fd_write (sock, chunk, towrite, -1);
+ if (write_error < 0)
+ {
+ fclose (fp);
+ return -1;
+ }
+ if (warc_tmp != NULL)
+ {
+ /* Write a copy of the data to the WARC record. */
+ int warc_tmp_written = fwrite (chunk, 1, towrite, warc_tmp);
+ if (warc_tmp_written != towrite)
+ {
+ fclose (fp);
+ return -2;
+ }
+ }
+ written += towrite;
+ }
+ fclose (fp);
+
+ /* If we've written less than was promised, report a (probably
+ nonsensical) error rather than break the promise. */
+ if (written < promised_size)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ assert (written == promised_size);
+ DEBUGP (("done]\n"));
+ return 0;
+}
+
+/* Determine whether [START, PEEKED + PEEKLEN) contains an empty line.
+ If so, return the pointer to the position after the line, otherwise
+ return NULL. This is used as callback to fd_read_hunk. The data
+ between START and PEEKED has been read and cannot be "unread"; the
+ data after PEEKED has only been peeked. */
+
+static const char *
+response_head_terminator (const char *start, const char *peeked, int peeklen)
+{
+ const char *p, *end;
+
+ /* If at first peek, verify whether HUNK starts with "HTTP". If
+ not, this is a HTTP/0.9 request and we must bail out without
+ reading anything. */
+ if (start == peeked && 0 != memcmp (start, "HTTP", MIN (peeklen, 4)))
+ return start;
+
+ /* Look for "\n[\r]\n", and return the following position if found.
+ Start two chars before the current to cover the possibility that
+ part of the terminator (e.g. "\n\r") arrived in the previous
+ batch. */
+ p = peeked - start < 2 ? start : peeked - 2;
+ end = peeked + peeklen;
+
+ /* Check for \n\r\n or \n\n anywhere in [p, end-2). */
+ for (; p < end - 2; p++)
+ if (*p == '\n')
+ {
+ if (p[1] == '\r' && p[2] == '\n')
+ return p + 3;
+ else if (p[1] == '\n')
+ return p + 2;
+ }
+ /* p==end-2: check for \n\n directly preceding END. */
+ if (peeklen >= 2 && p[0] == '\n' && p[1] == '\n')
+ return p + 2;
+
+ return NULL;
+}
+
+/* The maximum size of a single HTTP response we care to read. Rather
+ than being a limit of the reader implementation, this limit
+ prevents Wget from slurping all available memory upon encountering
+ malicious or buggy server output, thus protecting the user. Define
+ it to 0 to remove the limit. */
+
+#define HTTP_RESPONSE_MAX_SIZE 65536
+
+/* Read the HTTP request head from FD and return it. The error
+ conditions are the same as with fd_read_hunk.
+
+ To support HTTP/0.9 responses, this function tries to make sure
+ that the data begins with "HTTP". If this is not the case, no data
+ is read and an empty request is returned, so that the remaining
+ data can be treated as body. */
+
+static char *
+read_http_response_head (int fd)
+{
+ return fd_read_hunk (fd, response_head_terminator, 512,
+ HTTP_RESPONSE_MAX_SIZE);
+}
+
+struct response {
+ /* The response data. */
+ const char *data;
+
+ /* The array of pointers that indicate where each header starts.
+ For example, given this HTTP response:
+
+ HTTP/1.0 200 Ok
+ Description: some
+ text
+ Etag: x
+
+ The headers are located like this:
+
+ "HTTP/1.0 200 Ok\r\nDescription: some\r\n text\r\nEtag: x\r\n\r\n"
+ ^ ^ ^ ^
+ headers[0] headers[1] headers[2] headers[3]
+
+ I.e. headers[0] points to the beginning of the request,
+ headers[1] points to the end of the first header and the
+ beginning of the second one, etc. */
+
+ const char **headers;
+};
+
+/* Create a new response object from the text of the HTTP response,
+ available in HEAD. That text is automatically split into
+ constituent header lines for fast retrieval using
+ resp_header_*. */
+
+static struct response *
+resp_new (char *head)
+{
+ char *hdr;
+ int count, size;
+
+ struct response *resp = xnew0 (struct response);
+ resp->data = head;
+
+ if (*head == '\0')
+ {
+ /* Empty head means that we're dealing with a headerless
+ (HTTP/0.9) response. In that case, don't set HEADERS at
+ all. */
+ return resp;
+ }
+
+ /* Split HEAD into header lines, so that resp_header_* functions
+ don't need to do this over and over again. */
+
+ size = count = 0;
+ hdr = head;
+ while (1)
+ {
+ DO_REALLOC (resp->headers, size, count + 1, const char *);
+ resp->headers[count++] = hdr;
+
+ /* Break upon encountering an empty line. */
+ if (!hdr[0] || (hdr[0] == '\r' && hdr[1] == '\n') || hdr[0] == '\n')
+ break;
+
+ /* Find the end of HDR, including continuations. */
+ for (;;)
+ {
+ char *end = strchr (hdr, '\n');
+
+ if (!end)
+ {
+ hdr += strlen (hdr);
+ break;
+ }
+
+ hdr = end + 1;
+
+ if (*hdr != ' ' && *hdr != '\t')
+ break;
+
+ // continuation, transform \r and \n into spaces
+ *end = ' ';
+ if (end > head && end[-1] == '\r')
+ end[-1] = ' ';
+ }
+ }
+ DO_REALLOC (resp->headers, size, count + 1, const char *);
+ resp->headers[count] = NULL;
+
+ return resp;
+}
+
+/* Locate the header named NAME in the request data, starting with
+ position START. This allows the code to loop through the request
+ data, filtering for all requests of a given name. Returns the
+ found position, or -1 for failure. The code that uses this
+ function typically looks like this:
+
+ for (pos = 0; (pos = resp_header_locate (...)) != -1; pos++)
+ ... do something with header ...
+
+ If you only care about one header, use resp_header_get instead of
+ this function. */
+
+static int
+resp_header_locate (const struct response *resp, const char *name, int start,
+ const char **begptr, const char **endptr)
+{
+ int i;
+ const char **headers = resp->headers;
+ int name_len;
+
+ if (!headers || !headers[1])
+ return -1;
+
+ name_len = strlen (name);
+ if (start > 0)
+ i = start;
+ else
+ i = 1;
+
+ for (; headers[i + 1]; i++)
+ {
+ const char *b = headers[i];
+ const char *e = headers[i + 1];
+ if (e - b > name_len
+ && b[name_len] == ':'
+ && 0 == c_strncasecmp (b, name, name_len))
+ {
+ b += name_len + 1;
+ while (b < e && c_isspace (*b))
+ ++b;
+ while (b < e && c_isspace (e[-1]))
+ --e;
+ *begptr = b;
+ *endptr = e;
+ return i;
+ }
+ }
+ return -1;
+}
+
+/* Find and retrieve the header named NAME in the request data. If
+ found, set *BEGPTR to its starting, and *ENDPTR to its ending
+ position, and return true. Otherwise return false.
+
+ This function is used as a building block for resp_header_copy
+ and resp_header_strdup. */
+
+static bool
+resp_header_get (const struct response *resp, const char *name,
+ const char **begptr, const char **endptr)
+{
+ int pos = resp_header_locate (resp, name, 0, begptr, endptr);
+ return pos != -1;
+}
+
+/* Copy the response header named NAME to buffer BUF, no longer than
+ BUFSIZE (BUFSIZE includes the terminating 0). If the header
+ exists, true is returned, false otherwise. If there should be no
+ limit on the size of the header, use resp_header_strdup instead.
+
+ If BUFSIZE is 0, no data is copied, but the boolean indication of
+ whether the header is present is still returned. */
+
+static bool
+resp_header_copy (const struct response *resp, const char *name,
+ char *buf, int bufsize)
+{
+ const char *b, *e;
+ if (!resp_header_get (resp, name, &b, &e))
+ return false;
+ if (bufsize)
+ {
+ int len = MIN (e - b, bufsize - 1);
+ memcpy (buf, b, len);
+ buf[len] = '\0';
+ }
+ return true;
+}
+
+/* Return the value of header named NAME in RESP, allocated with
+ malloc. If such a header does not exist in RESP, return NULL. */
+
+static char *
+resp_header_strdup (const struct response *resp, const char *name)
+{
+ const char *b, *e;
+ if (!resp_header_get (resp, name, &b, &e))
+ return NULL;
+ return strdupdelim (b, e);
+}
+
+/* Parse the HTTP status line, which is of format:
+
+ HTTP-Version SP Status-Code SP Reason-Phrase
+
+ The function returns the status-code, or -1 if the status line
+ appears malformed. The pointer to "reason-phrase" message is
+ returned in *MESSAGE. */
+
+static int
+resp_status (const struct response *resp, char **message)
+{
+ int status;
+ const char *p, *end;
+
+ if (!resp->headers)
+ {
+ /* For a HTTP/0.9 response, assume status 200. */
+ if (message)
+ *message = xstrdup (_("No headers, assuming HTTP/0.9"));
+ return 200;
+ }
+
+ p = resp->headers[0];
+ end = resp->headers[1];
+
+ if (!end)
+ return -1;
+
+ /* "HTTP" */
+ if (end - p < 4 || 0 != strncmp (p, "HTTP", 4))
+ return -1;
+ p += 4;
+
+ /* Match the HTTP version. This is optional because Gnutella
+ servers have been reported to not specify HTTP version. */
+ if (p < end && *p == '/')
+ {
+ ++p;
+ while (p < end && c_isdigit (*p))
+ ++p;
+ if (p < end && *p == '.')
+ ++p;
+ while (p < end && c_isdigit (*p))
+ ++p;
+ }
+
+ while (p < end && c_isspace (*p))
+ ++p;
+ if (end - p < 3 || !c_isdigit (p[0]) || !c_isdigit (p[1]) || !c_isdigit (p[2]))
+ return -1;
+
+ status = 100 * (p[0] - '0') + 10 * (p[1] - '0') + (p[2] - '0');
+ p += 3;
+
+ if (message)
+ {
+ while (p < end && c_isspace (*p))
+ ++p;
+ while (p < end && c_isspace (end[-1]))
+ --end;
+ *message = strdupdelim (p, end);
+ }
+
+ return status;
+}
+
+/* Release the resources used by RESP.
+ It is safe to call it with a valid pointer to a NULL pointer.
+ It is not safe to call it with a invalid or NULL pointer. */
+
+static void
+resp_free (struct response **resp_ref)
+{
+ struct response *resp = *resp_ref;
+
+ if (!resp)
+ return;
+
+ xfree (resp->headers);
+ xfree (resp);
+
+ *resp_ref = NULL;
+}
+
+/* Print a single line of response, the characters [b, e). We tried
+ getting away with
+ logprintf (LOG_VERBOSE, "%s%.*s\n", prefix, (int) (e - b), b);
+ but that failed to escape the non-printable characters and, in fact,
+ caused crashes in UTF-8 locales. */
+
+static void
+print_response_line (const char *prefix, const char *b, const char *e)
+{
+ char buf[1024], *copy;
+ size_t len = e - b;
+
+ if (len < sizeof (buf))
+ copy = buf;
+ else
+ copy = xmalloc(len + 1);
+
+ memcpy(copy, b, len);
+ copy[len] = 0;
+
+ logprintf (LOG_ALWAYS, "%s%s\n", prefix,
+ quotearg_style (escape_quoting_style, copy));
+
+ if (copy != buf)
+ xfree (copy);
+}
+
+/* Print the server response, line by line, omitting the trailing CRLF
+ from individual header lines, and prefixed with PREFIX. */
+
+static void
+print_server_response (const struct response *resp, const char *prefix)
+{
+ int i;
+ if (!resp->headers)
+ return;
+ for (i = 0; resp->headers[i + 1]; i++)
+ {
+ const char *b = resp->headers[i];
+ const char *e = resp->headers[i + 1];
+ /* Skip CRLF */
+ if (b < e && e[-1] == '\n')
+ --e;
+ if (b < e && e[-1] == '\r')
+ --e;
+ print_response_line (prefix, b, e);
+ }
+}
+
+/* Parse the `Content-Range' header and extract the information it
+ contains. Returns true if successful, false otherwise. */
+static bool
+parse_content_range (const char *hdr, wgint *first_byte_ptr,
+ wgint *last_byte_ptr, wgint *entity_length_ptr)
+{
+ wgint num;
+
+ /* Ancient versions of Netscape proxy server, presumably predating
+ rfc2068, sent out `Content-Range' without the "bytes"
+ specifier. */
+ if (0 == strncasecmp (hdr, "bytes", 5))
+ {
+ hdr += 5;
+ /* "JavaWebServer/1.1.1" sends "bytes: x-y/z", contrary to the
+ HTTP spec. */
+ if (*hdr == ':')
+ ++hdr;
+ while (c_isspace (*hdr))
+ ++hdr;
+ if (!*hdr)
+ return false;
+ }
+ if (!c_isdigit (*hdr))
+ return false;
+ for (num = 0; c_isdigit (*hdr); hdr++)
+ num = 10 * num + (*hdr - '0');
+ if (*hdr != '-' || !c_isdigit (*(hdr + 1)))
+ return false;
+ *first_byte_ptr = num;
+ ++hdr;
+ for (num = 0; c_isdigit (*hdr); hdr++)
+ num = 10 * num + (*hdr - '0');
+ if (*hdr != '/')
+ return false;
+ *last_byte_ptr = num;
+ if (!(c_isdigit (*(hdr + 1)) || *(hdr + 1) == '*'))
+ return false;
+ if (*last_byte_ptr < *first_byte_ptr)
+ return false;
+ ++hdr;
+ if (*hdr == '*')
+ num = -1;
+ else
+ for (num = 0; c_isdigit (*hdr); hdr++)
+ num = 10 * num + (*hdr - '0');
+ *entity_length_ptr = num;
+ if ((*entity_length_ptr <= *last_byte_ptr) && *entity_length_ptr != -1)
+ return false;
+ return true;
+}
+
+/* Read the body of the request, but don't store it anywhere and don't
+ display a progress gauge. This is useful for reading the bodies of
+ administrative responses to which we will soon issue another
+ request. The response is not useful to the user, but reading it
+ allows us to continue using the same connection to the server.
+
+ If reading fails, false is returned, true otherwise. In debug
+ mode, the body is displayed for debugging purposes. */
+
+static bool
+skip_short_body (int fd, wgint contlen, bool chunked)
+{
+ enum {
+ SKIP_SIZE = 512, /* size of the download buffer */
+ SKIP_THRESHOLD = 4096 /* the largest size we read */
+ };
+ wgint remaining_chunk_size = 0;
+ char dlbuf[SKIP_SIZE + 1];
+ dlbuf[SKIP_SIZE] = '\0'; /* so DEBUGP can safely print it */
+
+ /* If the body is too large, it makes more sense to simply close the
+ connection than to try to read the body. */
+ if (contlen > SKIP_THRESHOLD)
+ return false;
+
+ while (contlen > 0 || chunked)
+ {
+ int ret;
+ if (chunked)
+ {
+ if (remaining_chunk_size == 0)
+ {
+ char *line = fd_read_line (fd);
+ char *endl;
+ if (line == NULL)
+ break;
+
+ remaining_chunk_size = strtol (line, &endl, 16);
+ xfree (line);
+
+ if (remaining_chunk_size < 0)
+ return false;
+
+ if (remaining_chunk_size == 0)
+ {
+ line = fd_read_line (fd);
+ xfree (line);
+ break;
+ }
+ }
+
+ contlen = MIN (remaining_chunk_size, SKIP_SIZE);
+ }
+
+ DEBUGP (("Skipping %s bytes of body: [", number_to_static_string (contlen)));
+
+ ret = fd_read (fd, dlbuf, MIN (contlen, SKIP_SIZE), -1);
+ if (ret <= 0)
+ {
+ /* Don't normally report the error since this is an
+ optimization that should be invisible to the user. */
+ DEBUGP (("] aborting (%s).\n",
+ ret < 0 ? fd_errstr (fd) : "EOF received"));
+ return false;
+ }
+ contlen -= ret;
+
+ if (chunked)
+ {
+ remaining_chunk_size -= ret;
+ if (remaining_chunk_size == 0)
+ {
+ char *line = fd_read_line (fd);
+ if (line == NULL)
+ return false;
+ else
+ xfree (line);
+ }
+ }
+
+ /* Safe even if %.*s bogusly expects terminating \0 because
+ we've zero-terminated dlbuf above. */
+ DEBUGP (("%.*s", ret, dlbuf));
+ }
+
+ DEBUGP (("] done.\n"));
+ return true;
+}
+
+#define NOT_RFC2231 0
+#define RFC2231_NOENCODING 1
+#define RFC2231_ENCODING 2
+
+/* extract_param extracts the parameter name into NAME.
+ However, if the parameter name is in RFC2231 format then
+ this function adjusts NAME by stripping of the trailing
+ characters that are not part of the name but are present to
+ indicate the presence of encoding information in the value
+ or a fragment of a long parameter value
+*/
+static int
+modify_param_name (param_token *name)
+{
+ const char *delim1 = memchr (name->b, '*', name->e - name->b);
+ const char *delim2 = memrchr (name->b, '*', name->e - name->b);
+
+ int result;
+
+ if (delim1 == NULL)
+ {
+ result = NOT_RFC2231;
+ }
+ else if (delim1 == delim2)
+ {
+ if ((name->e - 1) == delim1)
+ {
+ result = RFC2231_ENCODING;
+ }
+ else
+ {
+ result = RFC2231_NOENCODING;
+ }
+ name->e = delim1;
+ }
+ else
+ {
+ name->e = delim1;
+ result = RFC2231_ENCODING;
+ }
+ return result;
+}
+
+/* extract_param extract the parameter value into VALUE.
+ Like modify_param_name this function modifies VALUE by
+ stripping off the encoding information from the actual value
+*/
+static void
+modify_param_value (param_token *value, int encoding_type )
+{
+ if (encoding_type == RFC2231_ENCODING)
+ {
+ const char *delim = memrchr (value->b, '\'', value->e - value->b);
+ if (delim != NULL)
+ {
+ value->b = (delim+1);
+ }
+ }
+}
+
+/* Extract a parameter from the string (typically an HTTP header) at
+ **SOURCE and advance SOURCE to the next parameter. Return false
+ when there are no more parameters to extract. The name of the
+ parameter is returned in NAME, and the value in VALUE. If the
+ parameter has no value, the token's value is zeroed out.
+
+ For example, if *SOURCE points to the string "attachment;
+ filename=\"foo bar\"", the first call to this function will return
+ the token named "attachment" and no value, and the second call will
+ return the token named "filename" and value "foo bar". The third
+ call will return false, indicating no more valid tokens.
+
+ is_url_encoded is an out parameter. If not NULL, a boolean value will be
+ stored into it, letting the caller know whether or not the extracted value is
+ URL-encoded. The caller can then decode it with url_unescape(), which however
+ performs decoding in-place. URL-encoding is used by RFC 2231 to support
+ non-US-ASCII characters in HTTP header values. */
+
+bool
+extract_param (const char **source, param_token *name, param_token *value,
+ char separator, bool *is_url_encoded)
+{
+ const char *p = *source;
+ int param_type;
+ if (is_url_encoded)
+ *is_url_encoded = false; /* initializing the out parameter */
+
+ while (c_isspace (*p)) ++p;
+ if (!*p)
+ {
+ *source = p;
+ return false; /* no error; nothing more to extract */
+ }
+
+ /* Extract name. */
+ name->b = p;
+ while (*p && !c_isspace (*p) && *p != '=' && *p != separator) ++p;
+ name->e = p;
+ if (name->b == name->e)
+ return false; /* empty name: error */
+ while (c_isspace (*p)) ++p;
+ if (*p == separator || !*p) /* no value */
+ {
+ xzero (*value);
+ if (*p == separator) ++p;
+ *source = p;
+ return true;
+ }
+ if (*p != '=')
+ return false; /* error */
+
+ /* *p is '=', extract value */
+ ++p;
+ while (c_isspace (*p)) ++p;
+ if (*p == '"') /* quoted */
+ {
+ value->b = ++p;
+ while (*p && *p != '"') ++p;
+ if (!*p)
+ return false;
+ value->e = p++;
+ /* Currently at closing quote; find the end of param. */
+ while (c_isspace (*p)) ++p;
+ while (*p && *p != separator) ++p;
+ if (*p == separator)
+ ++p;
+ else if (*p)
+ /* garbage after closed quote, e.g. foo="bar"baz */
+ return false;
+ }
+ else /* unquoted */
+ {
+ value->b = p;
+ while (*p && *p != separator) ++p;
+ value->e = p;
+ while (value->e != value->b && c_isspace (value->e[-1]))
+ --value->e;
+ if (*p == separator) ++p;
+ }
+ *source = p;
+
+ param_type = modify_param_name (name);
+ if (param_type != NOT_RFC2231)
+ {
+ if (param_type == RFC2231_ENCODING && is_url_encoded)
+ *is_url_encoded = true;
+ modify_param_value (value, param_type);
+ }
+ return true;
+}
+
+#undef NOT_RFC2231
+#undef RFC2231_NOENCODING
+#undef RFC2231_ENCODING
+
+/* Appends the string represented by VALUE to FILENAME */
+
+static void
+append_value_to_filename (char **filename, param_token const * const value,
+ bool is_url_encoded)
+{
+ int original_length = strlen (*filename);
+ int new_length = strlen (*filename) + (value->e - value->b);
+ *filename = xrealloc (*filename, new_length+1);
+ memcpy (*filename + original_length, value->b, (value->e - value->b));
+ (*filename)[new_length] = '\0';
+ if (is_url_encoded)
+ url_unescape (*filename + original_length);
+}
+
+/* Parse the contents of the `Content-Disposition' header, extracting
+ the information useful to Wget. Content-Disposition is a header
+ borrowed from MIME; when used in HTTP, it typically serves for
+ specifying the desired file name of the resource. For example:
+
+ Content-Disposition: attachment; filename="flora.jpg"
+
+ Wget will skip the tokens it doesn't care about, such as
+ "attachment" in the previous example; it will also skip other
+ unrecognized params. If the header is syntactically correct and
+ contains a file name, a copy of the file name is stored in
+ *filename and true is returned. Otherwise, the function returns
+ false.
+
+ The file name is stripped of directory components and must not be
+ empty.
+
+ Historically, this function returned filename prefixed with opt.dir_prefix,
+ now that logic is handled by the caller, new code should pay attention,
+ changed by crq, Sep 2010.
+
+*/
+static bool
+parse_content_disposition (const char *hdr, char **filename)
+{
+ param_token name, value;
+ bool is_url_encoded = false;
+
+ char *encodedFilename = NULL;
+ char *unencodedFilename = NULL;
+ for ( ; extract_param (&hdr, &name, &value, ';', &is_url_encoded);
+ is_url_encoded = false)
+ {
+ int isFilename = BOUNDED_EQUAL_NO_CASE (name.b, name.e, "filename");
+ if ( isFilename && value.b != NULL)
+ {
+ /* Make the file name begin at the last slash or backslash. */
+ bool isEncodedFilename;
+ char **outFilename;
+ const char *last_slash = memrchr (value.b, '/', value.e - value.b);
+ const char *last_bs = memrchr (value.b, '\\', value.e - value.b);
+ if (last_slash && last_bs)
+ value.b = 1 + MAX (last_slash, last_bs);
+ else if (last_slash || last_bs)
+ value.b = 1 + (last_slash ? last_slash : last_bs);
+ if (value.b == value.e)
+ continue;
+
+ /* Check if the name is "filename*" as specified in RFC 6266.
+ * Since "filename" could be broken up as "filename*N" (RFC 2231),
+ * a check is needed to make sure this is not the case */
+ isEncodedFilename = *name.e == '*' && !c_isdigit (*(name.e + 1));
+ outFilename = isEncodedFilename ? &encodedFilename
+ : &unencodedFilename;
+ if (*outFilename)
+ append_value_to_filename (outFilename, &value, is_url_encoded);
+ else
+ {
+ *outFilename = strdupdelim (value.b, value.e);
+ if (is_url_encoded)
+ url_unescape (*outFilename);
+ }
+ }
+ }
+ if (encodedFilename)
+ {
+ xfree (unencodedFilename);
+ *filename = encodedFilename;
+ }
+ else
+ {
+ xfree (encodedFilename);
+ *filename = unencodedFilename;
+ }
+ if (*filename)
+ return true;
+ else
+ return false;
+}
+
+#ifdef HAVE_HSTS
+static bool
+parse_strict_transport_security (const char *header, time_t *max_age, bool *include_subdomains)
+{
+ param_token name, value;
+ const char *c_max_age = NULL;
+ bool is = false; /* includeSubDomains */
+ bool is_url_encoded = false;
+ bool success = false;
+
+ if (header)
+ {
+ /* Process the STS header. Keys should be matched case-insensitively. */
+ for (; extract_param (&header, &name, &value, ';', &is_url_encoded); is_url_encoded = false)
+ {
+ if (BOUNDED_EQUAL_NO_CASE (name.b, name.e, "max-age"))
+ {
+ xfree (c_max_age);
+ c_max_age = strdupdelim (value.b, value.e);
+ }
+ else if (BOUNDED_EQUAL_NO_CASE (name.b, name.e, "includeSubDomains"))
+ is = true;
+ }
+
+ /* pass the parsed values over */
+ if (c_max_age)
+ {
+ /* If the string value goes out of a long's bounds, strtol() will return LONG_MIN or LONG_MAX.
+ * In theory, the HSTS engine should be able to handle it.
+ * Also, time_t is normally defined as a long, so this should not break.
+ */
+ if (max_age)
+ *max_age = (time_t) strtol (c_max_age, NULL, 10);
+ if (include_subdomains)
+ *include_subdomains = is;
+
+ DEBUGP (("Parsed Strict-Transport-Security max-age = %s, includeSubDomains = %s\n",
+ c_max_age, (is ? "true" : "false")));
+
+ xfree (c_max_age);
+ success = true;
+ }
+ else
+ {
+ /* something weird happened */
+ logprintf (LOG_VERBOSE, "Could not parse String-Transport-Security header\n");
+ success = false;
+ }
+ }
+
+ return success;
+}
+#endif
+
+/* Persistent connections. Currently, we cache the most recently used
+ connection as persistent, provided that the HTTP server agrees to
+ make it such. The persistence data is stored in the variables
+ below. Ideally, it should be possible to cache an arbitrary fixed
+ number of these connections. */
+
+/* Whether a persistent connection is active. */
+static bool pconn_active;
+
+static struct {
+ /* The socket of the connection. */
+ int socket;
+
+ /* Host and port of the currently active persistent connection. */
+ char *host;
+ int port;
+
+ /* Whether a ssl handshake has occurred on this connection. */
+ bool ssl;
+
+ /* Whether the connection was authorized. This is only done by
+ NTLM, which authorizes *connections* rather than individual
+ requests. (That practice is peculiar for HTTP, but it is a
+ useful optimization.) */
+ bool authorized;
+
+#ifdef ENABLE_NTLM
+ /* NTLM data of the current connection. */
+ struct ntlmdata ntlm;
+#endif
+} pconn;
+
+/* Mark the persistent connection as invalid and free the resources it
+ uses. This is used by the CLOSE_* macros after they forcefully
+ close a registered persistent connection. */
+
+static void
+invalidate_persistent (void)
+{
+ DEBUGP (("Disabling further reuse of socket %d.\n", pconn.socket));
+ pconn_active = false;
+ fd_close (pconn.socket);
+ xfree (pconn.host);
+ xzero (pconn);
+}
+
+/* Register FD, which should be a TCP/IP connection to HOST:PORT, as
+ persistent. This will enable someone to use the same connection
+ later. In the context of HTTP, this must be called only AFTER the
+ response has been received and the server has promised that the
+ connection will remain alive.
+
+ If a previous connection was persistent, it is closed. */
+
+static void
+register_persistent (const char *host, int port, int fd, bool ssl)
+{
+ if (pconn_active)
+ {
+ if (pconn.socket == fd)
+ {
+ /* The connection FD is already registered. */
+ return;
+ }
+ else
+ {
+ /* The old persistent connection is still active; close it
+ first. This situation arises whenever a persistent
+ connection exists, but we then connect to a different
+ host, and try to register a persistent connection to that
+ one. */
+ invalidate_persistent ();
+ }
+ }
+
+ pconn_active = true;
+ pconn.socket = fd;
+ pconn.host = xstrdup (host);
+ pconn.port = port;
+ pconn.ssl = ssl;
+ pconn.authorized = false;
+
+ DEBUGP (("Registered socket %d for persistent reuse.\n", fd));
+}
+
+/* Return true if a persistent connection is available for connecting
+ to HOST:PORT. */
+
+static bool
+persistent_available_p (const char *host, int port, bool ssl,
+ bool *host_lookup_failed)
+{
+ /* First, check whether a persistent connection is active at all. */
+ if (!pconn_active)
+ return false;
+
+ /* If we want SSL and the last connection wasn't or vice versa,
+ don't use it. Checking for host and port is not enough because
+ HTTP and HTTPS can apparently coexist on the same port. */
+ if (ssl != pconn.ssl)
+ return false;
+
+ /* If we're not connecting to the same port, we're not interested. */
+ if (port != pconn.port)
+ return false;
+
+ /* If the host is the same, we're in business. If not, there is
+ still hope -- read below. */
+ if (0 != strcasecmp (host, pconn.host))
+ {
+ /* Check if pconn.socket is talking to HOST under another name.
+ This happens often when both sites are virtual hosts
+ distinguished only by name and served by the same network
+ interface, and hence the same web server (possibly set up by
+ the ISP and serving many different web sites). This
+ admittedly unconventional optimization does not contradict
+ HTTP and works well with popular server software. */
+
+ bool found;
+ ip_address ip;
+ struct address_list *al;
+
+ if (ssl)
+ /* Don't try to talk to two different SSL sites over the same
+ secure connection! (Besides, it's not clear that
+ name-based virtual hosting is even possible with SSL.) */
+ return false;
+
+ /* If pconn.socket's peer is one of the IP addresses HOST
+ resolves to, pconn.socket is for all intents and purposes
+ already talking to HOST. */
+
+ if (!socket_ip_address (pconn.socket, &ip, ENDPOINT_PEER))
+ {
+ /* Can't get the peer's address -- something must be very
+ wrong with the connection. */
+ invalidate_persistent ();
+ return false;
+ }
+ al = lookup_host (host, 0);
+ if (!al)
+ {
+ *host_lookup_failed = true;
+ return false;
+ }
+
+ found = address_list_contains (al, &ip);
+ address_list_release (al);
+
+ if (!found)
+ return false;
+
+ /* The persistent connection's peer address was found among the
+ addresses HOST resolved to; therefore, pconn.sock is in fact
+ already talking to HOST -- no need to reconnect. */
+ }
+
+ /* Finally, check whether the connection is still open. This is
+ important because most servers implement liberal (short) timeout
+ on persistent connections. Wget can of course always reconnect
+ if the connection doesn't work out, but it's nicer to know in
+ advance. This test is a logical followup of the first test, but
+ is "expensive" and therefore placed at the end of the list.
+
+ (Current implementation of test_socket_open has a nice side
+ effect that it treats sockets with pending data as "closed".
+ This is exactly what we want: if a broken server sends message
+ body in response to HEAD, or if it sends more than conent-length
+ data, we won't reuse the corrupted connection.) */
+
+ if (!test_socket_open (pconn.socket))
+ {
+ /* Oops, the socket is no longer open. Now that we know that,
+ let's invalidate the persistent connection before returning
+ 0. */
+ invalidate_persistent ();
+ return false;
+ }
+
+ return true;
+}
+
+/* The idea behind these two CLOSE macros is to distinguish between
+ two cases: one when the job we've been doing is finished, and we
+ want to close the connection and leave, and two when something is
+ seriously wrong and we're closing the connection as part of
+ cleanup.
+
+ In case of keep_alive, CLOSE_FINISH should leave the connection
+ open, while CLOSE_INVALIDATE should still close it.
+
+ Note that the semantics of the flag `keep_alive' is "this
+ connection *will* be reused (the server has promised not to close
+ the connection once we're done)", while the semantics of
+ `pc_active_p && (fd) == pc_last_fd' is "we're *now* using an
+ active, registered connection". */
+
+#define CLOSE_FINISH(fd) do { \
+ if (!keep_alive) \
+ { \
+ if (pconn_active && (fd) == pconn.socket) \
+ invalidate_persistent (); \
+ else \
+ fd_close (fd); \
+ fd = -1; \
+ } \
+} while (0)
+
+#define CLOSE_INVALIDATE(fd) do { \
+ if (pconn_active && (fd) == pconn.socket) \
+ invalidate_persistent (); \
+ else \
+ fd_close (fd); \
+ fd = -1; \
+} while (0)
+
+typedef enum
+{
+ ENC_INVALID = -1, /* invalid encoding */
+ ENC_NONE = 0, /* no special encoding */
+ ENC_GZIP, /* gzip compression */
+ ENC_DEFLATE, /* deflate compression */
+ ENC_COMPRESS, /* compress compression */
+ ENC_BROTLI /* brotli compression */
+} encoding_t;
+
+struct http_stat
+{
+ wgint len; /* received length */
+ wgint contlen; /* expected length */
+ wgint restval; /* the restart value */
+ int res; /* the result of last read */
+ char *rderrmsg; /* error message from read error */
+ char *newloc; /* new location (redirection) */
+ char *remote_time; /* remote time-stamp string */
+ char *error; /* textual HTTP error */
+ int statcode; /* status code */
+ char *message; /* status message */
+ wgint rd_size; /* amount of data read from socket */
+ double dltime; /* time it took to download the data */
+ const char *referer; /* value of the referer header. */
+ char *local_file; /* local file name. */
+ bool existence_checked; /* true if we already checked for a file's
+ existence after having begun to download
+ (needed in gethttp for when connection is
+ interrupted/restarted. */
+ bool timestamp_checked; /* true if pre-download time-stamping checks
+ * have already been performed */
+ char *orig_file_name; /* name of file to compare for time-stamping
+ * (might be != local_file if -K is set) */
+ wgint orig_file_size; /* size of file to compare for time-stamping */
+ time_t orig_file_tstamp; /* time-stamp of file to compare for
+ * time-stamping */
+#ifdef HAVE_METALINK
+ metalink_t *metalink;
+#endif
+
+ encoding_t local_encoding; /* the encoding of the local file */
+ encoding_t remote_encoding; /* the encoding of the remote file */
+
+ bool temporary; /* downloading a temporary file */
+};
+
+static void
+free_hstat (struct http_stat *hs)
+{
+ xfree (hs->newloc);
+ xfree (hs->remote_time);
+ xfree (hs->error);
+ xfree (hs->rderrmsg);
+ xfree (hs->local_file);
+ xfree (hs->orig_file_name);
+ xfree (hs->message);
+#ifdef HAVE_METALINK
+ metalink_delete (hs->metalink);
+ hs->metalink = NULL;
+#endif
+}
+
+static void
+get_file_flags (const char *filename, int *dt)
+{
+ logprintf (LOG_VERBOSE, _("\
+File %s already there; not retrieving.\n\n"), quote (filename));
+ /* If the file is there, we suppose it's retrieved OK. */
+ *dt |= RETROKF;
+
+ /* #### Bogusness alert. */
+ /* If its suffix is "html" or "htm" or similar, assume text/html. */
+ if (has_html_suffix_p (filename))
+ *dt |= TEXTHTML;
+}
+
+/* Download the response body from the socket and writes it to
+ an output file. The headers have already been read from the
+ socket. If WARC is enabled, the response body will also be
+ written to a WARC response record.
+
+ hs, contlen, contrange, chunked_transfer_encoding and url are
+ parameters from the gethttp method. fp is a pointer to the
+ output file.
+
+ url, warc_timestamp_str, warc_request_uuid, warc_ip, type
+ and statcode will be saved in the headers of the WARC record.
+ The head parameter contains the HTTP headers of the response.
+
+ If fp is NULL and WARC is enabled, the response body will be
+ written only to the WARC file. If WARC is disabled and fp
+ is a file pointer, the data will be written to the file.
+ If fp is a file pointer and WARC is enabled, the body will
+ be written to both destinations.
+
+ Returns the error code. */
+static int
+read_response_body (struct http_stat *hs, int sock, FILE *fp, wgint contlen,
+ wgint contrange, bool chunked_transfer_encoding,
+ char *url, char *warc_timestamp_str, char *warc_request_uuid,
+ ip_address *warc_ip, char *type, int statcode, char *head)
+{
+ int warc_payload_offset = 0;
+ FILE *warc_tmp = NULL;
+ int warcerr = 0;
+ int flags = 0;
+
+ if (opt.warc_filename != NULL)
+ {
+ /* Open a temporary file where we can write the response before we
+ add it to the WARC record. */
+ warc_tmp = warc_tempfile ();
+ if (warc_tmp == NULL)
+ warcerr = WARC_TMP_FOPENERR;
+
+ if (warcerr == 0)
+ {
+ /* We should keep the response headers for the WARC record. */
+ int head_len = strlen (head);
+ int warc_tmp_written = fwrite (head, 1, head_len, warc_tmp);
+ if (warc_tmp_written != head_len)
+ warcerr = WARC_TMP_FWRITEERR;
+ warc_payload_offset = head_len;
+ }
+
+ if (warcerr != 0)
+ {
+ if (warc_tmp != NULL)
+ fclose (warc_tmp);
+ return warcerr;
+ }
+ }
+
+ if (fp != NULL)
+ {
+ /* This confuses the timestamping code that checks for file size.
+ #### The timestamping code should be smarter about file size. */
+ if (opt.save_headers && hs->restval == 0)
+ fwrite (head, 1, strlen (head), fp);
+ }
+
+ /* Read the response body. */
+ if (contlen != -1)
+ /* If content-length is present, read that much; otherwise, read
+ until EOF. The HTTP spec doesn't require the server to
+ actually close the connection when it's done sending data. */
+ flags |= rb_read_exactly;
+ if (fp != NULL && hs->restval > 0 && contrange == 0)
+ /* If the server ignored our range request, instruct fd_read_body
+ to skip the first RESTVAL bytes of body. */
+ flags |= rb_skip_startpos;
+ if (chunked_transfer_encoding)
+ flags |= rb_chunked_transfer_encoding;
+
+ if (hs->remote_encoding == ENC_GZIP)
+ flags |= rb_compressed_gzip;
+
+ hs->len = hs->restval;
+ hs->rd_size = 0;
+ /* Download the response body and write it to fp.
+ If we are working on a WARC file, we simultaneously write the
+ response body to warc_tmp. */
+ hs->res = fd_read_body (hs->local_file, sock, fp, contlen != -1 ? contlen : 0,
+ hs->restval, &hs->rd_size, &hs->len, &hs->dltime,
+ flags, warc_tmp);
+ if (hs->res >= 0)
+ {
+ if (warc_tmp != NULL)
+ {
+ /* Create a response record and write it to the WARC file.
+ Note: per the WARC standard, the request and response should share
+ the same date header. We re-use the timestamp of the request.
+ The response record should also refer to the uuid of the request. */
+ bool r = warc_write_response_record (url, warc_timestamp_str,
+ warc_request_uuid, warc_ip,
+ warc_tmp, warc_payload_offset,
+ type, statcode, hs->newloc);
+
+ /* warc_write_response_record has closed warc_tmp. */
+
+ if (! r)
+ return WARC_ERR;
+ }
+
+ return RETRFINISHED;
+ }
+
+ if (warc_tmp != NULL)
+ fclose (warc_tmp);
+
+ if (hs->res == -2)
+ {
+ /* Error while writing to fd. */
+ return FWRITEERR;
+ }
+ else if (hs->res == -3)
+ {
+ /* Error while writing to warc_tmp. */
+ return WARC_TMP_FWRITEERR;
+ }
+ else
+ {
+ /* A read error! */
+ xfree (hs->rderrmsg);
+ hs->rderrmsg = xstrdup (fd_errstr (sock));
+ return RETRFINISHED;
+ }
+}
+
+#define BEGINS_WITH(line, string_constant) \
+ (!c_strncasecmp (line, string_constant, sizeof (string_constant) - 1) \
+ && (c_isspace (line[sizeof (string_constant) - 1]) \
+ || !line[sizeof (string_constant) - 1]))
+
+#define SET_USER_AGENT(req) do { \
+ if (!opt.useragent) \
+ request_set_header (req, "User-Agent", \
+ aprintf ("Wget/%s", \
+ version_string), \
+ rel_value); \
+ else if (*opt.useragent) \
+ request_set_header (req, "User-Agent", opt.useragent, rel_none); \
+} while (0)
+
+/*
+ Convert time_t to one of valid HTTP date formats
+ ie. rfc1123-date.
+
+ HTTP-date = rfc1123-date | rfc850-date | asctime-date
+ rfc1123-date = wkday "," SP date1 SP time SP "GMT"
+ rfc850-date = weekday "," SP date2 SP time SP "GMT"
+ asctime-date = wkday SP date3 SP time SP 4DIGIT
+ date1 = 2DIGIT SP month SP 4DIGIT
+ ; day month year (e.g., 02 Jun 1982)
+ date2 = 2DIGIT "-" month "-" 2DIGIT
+ ; day-month-year (e.g., 02-Jun-82)
+ date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
+ ; month day (e.g., Jun 2)
+ time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
+ ; 00:00:00 - 23:59:59
+ wkday = "Mon" | "Tue" | "Wed"
+ | "Thu" | "Fri" | "Sat" | "Sun"
+ weekday = "Monday" | "Tuesday" | "Wednesday"
+ | "Thursday" | "Friday" | "Saturday" | "Sunday"
+ month = "Jan" | "Feb" | "Mar" | "Apr"
+ | "May" | "Jun" | "Jul" | "Aug"
+ | "Sep" | "Oct" | "Nov" | "Dec"
+
+ source: RFC2616 */
+static uerr_t
+time_to_rfc1123 (time_t time, char *buf, size_t bufsize)
+{
+ static const char *wkday[] = { "Sun", "Mon", "Tue", "Wed",
+ "Thu", "Fri", "Sat" };
+ static const char *month[] = { "Jan", "Feb", "Mar", "Apr",
+ "May", "Jun", "Jul", "Aug",
+ "Sep", "Oct", "Nov", "Dec" };
+ /* rfc1123 example: Thu, 01 Jan 1998 22:12:57 GMT */
+ static const char *time_format = "%s, %02d %s %04d %02d:%02d:%02d GMT";
+
+ struct tm *gtm = gmtime (&time);
+ if (!gtm)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("gmtime failed. This is probably a bug.\n"));
+ return TIMECONV_ERR;
+ }
+
+ snprintf (buf, bufsize, time_format, wkday[gtm->tm_wday],
+ gtm->tm_mday, month[gtm->tm_mon],
+ gtm->tm_year + 1900, gtm->tm_hour,
+ gtm->tm_min, gtm->tm_sec);
+
+ return RETROK;
+}
+
+static struct request *
+initialize_request (const struct url *u, struct http_stat *hs, int *dt, struct url *proxy,
+ bool inhibit_keep_alive, bool *basic_auth_finished,
+ wgint *body_data_size, char **user, char **passwd, uerr_t *ret)
+{
+ bool head_only = !!(*dt & HEAD_ONLY);
+ struct request *req;
+
+ /* Prepare the request to send. */
+ {
+ char *meth_arg;
+ const char *meth = "GET";
+ if (head_only)
+ meth = "HEAD";
+ else if (opt.method)
+ meth = opt.method;
+ /* Use the full path, i.e. one that includes the leading slash and
+ the query string. E.g. if u->path is "foo/bar" and u->query is
+ "param=value", full_path will be "/foo/bar?param=value". */
+ if (proxy
+#ifdef HAVE_SSL
+ /* When using SSL over proxy, CONNECT establishes a direct
+ connection to the HTTPS server. Therefore use the same
+ argument as when talking to the server directly. */
+ && u->scheme != SCHEME_HTTPS
+#endif
+ )
+ meth_arg = xstrdup (u->url);
+ else
+ meth_arg = url_full_path (u);
+ req = request_new (meth, meth_arg);
+ }
+
+ request_set_header (req, "Referer", hs->referer, rel_none);
+ if (*dt & SEND_NOCACHE)
+ {
+ /* Cache-Control MUST be obeyed by all HTTP/1.1 caching mechanisms... */
+ request_set_header (req, "Cache-Control", "no-cache", rel_none);
+
+ /* ... but some HTTP/1.0 caches doesn't implement Cache-Control. */
+ request_set_header (req, "Pragma", "no-cache", rel_none);
+ }
+ if (*dt & IF_MODIFIED_SINCE)
+ {
+ char strtime[32];
+ uerr_t err = time_to_rfc1123 (hs->orig_file_tstamp, strtime, countof (strtime));
+
+ if (err != RETROK)
+ {
+ logputs (LOG_VERBOSE, _("Cannot convert timestamp to http format. "
+ "Falling back to time 0 as last modification "
+ "time.\n"));
+ strcpy (strtime, "Thu, 01 Jan 1970 00:00:00 GMT");
+ }
+ request_set_header (req, "If-Modified-Since", xstrdup (strtime), rel_value);
+ }
+ if (hs->restval)
+ request_set_header (req, "Range",
+ aprintf ("bytes=%s-",
+ number_to_static_string (hs->restval)),
+ rel_value);
+ SET_USER_AGENT (req);
+ request_set_header (req, "Accept", "*/*", rel_none);
+#ifdef HAVE_LIBZ
+ if (opt.compression != compression_none)
+ request_set_header (req, "Accept-Encoding", "gzip", rel_none);
+ else
+#endif
+ request_set_header (req, "Accept-Encoding", "identity", rel_none);
+
+ /* Find the username with priority */
+ if (u->user)
+ *user = u->user;
+ else if (opt.user && (opt.use_askpass || opt.ask_passwd))
+ *user = opt.user;
+ else if (opt.http_user)
+ *user = opt.http_user;
+ else if (opt.user)
+ *user = opt.user;
+ else
+ *user = NULL;
+
+ /* Find the password with priority */
+ if (u->passwd)
+ *passwd = u->passwd;
+ else if (opt.passwd && (opt.use_askpass || opt.ask_passwd))
+ *passwd = opt.passwd;
+ else if (opt.http_passwd)
+ *passwd = opt.http_passwd;
+ else if (opt.passwd)
+ *passwd = opt.passwd;
+ else
+ *passwd = NULL;
+
+ /* Check for ~/.netrc if none of the above match */
+ if (opt.netrc && (!*user || !*passwd))
+ search_netrc (u->host, (const char **) user, (const char **) passwd, 0, NULL);
+
+ /* We only do "site-wide" authentication with "global" user/password
+ * values unless --auth-no-challenge has been requested; URL user/password
+ * info overrides. */
+ if (*user && *passwd && (!u->user || opt.auth_without_challenge))
+ {
+ /* If this is a host for which we've already received a Basic
+ * challenge, we'll go ahead and send Basic authentication creds. */
+ *basic_auth_finished = maybe_send_basic_creds (u->host, *user, *passwd, req);
+ }
+
+ /* Generate the Host header, HOST:PORT. Take into account that:
+
+ - Broken server-side software often doesn't recognize the PORT
+ argument, so we must generate "Host: www.server.com" instead of
+ "Host: www.server.com:80" (and likewise for https port).
+
+ - IPv6 addresses contain ":", so "Host: 3ffe:8100:200:2::2:1234"
+ becomes ambiguous and needs to be rewritten as "Host:
+ [3ffe:8100:200:2::2]:1234". */
+ {
+ /* Formats arranged for hfmt[add_port][add_squares]. */
+ static const char *hfmt[][2] = {
+ { "%s", "[%s]" }, { "%s:%d", "[%s]:%d" }
+ };
+ int add_port = u->port != scheme_default_port (u->scheme);
+ int add_squares = strchr (u->host, ':') != NULL;
+ request_set_header (req, "Host",
+ aprintf (hfmt[add_port][add_squares], u->host, u->port),
+ rel_value);
+ }
+
+ if (inhibit_keep_alive)
+ request_set_header (req, "Connection", "Close", rel_none);
+ else
+ {
+ request_set_header (req, "Connection", "Keep-Alive", rel_none);
+ if (proxy)
+ request_set_header (req, "Proxy-Connection", "Keep-Alive", rel_none);
+ }
+
+ if (opt.method)
+ {
+
+ if (opt.body_data || opt.body_file)
+ {
+ request_set_header (req, "Content-Type",
+ "application/x-www-form-urlencoded", rel_none);
+
+ if (opt.body_data)
+ *body_data_size = strlen (opt.body_data);
+ else
+ {
+ *body_data_size = file_size (opt.body_file);
+ if (*body_data_size == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("BODY data file %s missing: %s\n"),
+ quote (opt.body_file), strerror (errno));
+ request_free (&req);
+ *ret = FILEBADFILE;
+ return NULL;
+ }
+ }
+ request_set_header (req, "Content-Length",
+ xstrdup (number_to_static_string (*body_data_size)),
+ rel_value);
+ }
+ else if (c_strcasecmp (opt.method, "post") == 0
+ || c_strcasecmp (opt.method, "put") == 0
+ || c_strcasecmp (opt.method, "patch") == 0)
+ request_set_header (req, "Content-Length", "0", rel_none);
+ }
+ return req;
+}
+
+static void
+initialize_proxy_configuration (const struct url *u, struct request *req,
+ struct url *proxy, char **proxyauth)
+{
+ char *proxy_user, *proxy_passwd;
+ /* For normal username and password, URL components override
+ command-line/wgetrc parameters. With proxy
+ authentication, it's the reverse, because proxy URLs are
+ normally the "permanent" ones, so command-line args
+ should take precedence. */
+ if (opt.proxy_user && opt.proxy_passwd)
+ {
+ proxy_user = opt.proxy_user;
+ proxy_passwd = opt.proxy_passwd;
+ }
+ else
+ {
+ proxy_user = proxy->user;
+ proxy_passwd = proxy->passwd;
+ }
+ /* #### This does not appear right. Can't the proxy request,
+ say, `Digest' authentication? */
+ if (proxy_user && proxy_passwd)
+ *proxyauth = basic_authentication_encode (proxy_user, proxy_passwd);
+
+ /* Proxy authorization over SSL is handled below. */
+#ifdef HAVE_SSL
+ if (u->scheme != SCHEME_HTTPS)
+#endif
+ request_set_header (req, "Proxy-Authorization", *proxyauth, rel_value);
+}
+
+static uerr_t
+establish_connection (const struct url *u, const struct url **conn_ref,
+ struct http_stat *hs, struct url *proxy,
+ char **proxyauth,
+ struct request **req_ref, bool *using_ssl,
+ bool inhibit_keep_alive,
+ int *sock_ref)
+{
+ bool host_lookup_failed = false;
+ int sock = *sock_ref;
+ struct request *req = *req_ref;
+ const struct url *conn = *conn_ref;
+ struct response *resp;
+ int write_error;
+ int statcode;
+
+ if (! inhibit_keep_alive)
+ {
+ /* Look for a persistent connection to target host, unless a
+ proxy is used. The exception is when SSL is in use, in which
+ case the proxy is nothing but a passthrough to the target
+ host, registered as a connection to the latter. */
+ const struct url *relevant = conn;
+#ifdef HAVE_SSL
+ if (u->scheme == SCHEME_HTTPS)
+ relevant = u;
+#endif
+
+ if (persistent_available_p (relevant->host, relevant->port,
+#ifdef HAVE_SSL
+ relevant->scheme == SCHEME_HTTPS,
+#else
+ 0,
+#endif
+ &host_lookup_failed))
+ {
+ int family = socket_family (pconn.socket, ENDPOINT_PEER);
+ sock = pconn.socket;
+ *using_ssl = pconn.ssl;
+#if ENABLE_IPV6
+ if (family == AF_INET6)
+ logprintf (LOG_VERBOSE, _("Reusing existing connection to [%s]:%d.\n"),
+ quotearg_style (escape_quoting_style, pconn.host),
+ pconn.port);
+ else
+#endif
+ logprintf (LOG_VERBOSE, _("Reusing existing connection to %s:%d.\n"),
+ quotearg_style (escape_quoting_style, pconn.host),
+ pconn.port);
+ DEBUGP (("Reusing fd %d.\n", sock));
+ if (pconn.authorized)
+ /* If the connection is already authorized, the "Basic"
+ authorization added by code above is unnecessary and
+ only hurts us. */
+ request_remove_header (req, "Authorization");
+ }
+ else if (host_lookup_failed)
+ {
+ logprintf(LOG_NOTQUIET,
+ _("%s: unable to resolve host address %s\n"),
+ exec_name, quote (relevant->host));
+ return HOSTERR;
+ }
+ else if (sock != -1)
+ {
+ sock = -1;
+ }
+ }
+
+ if (sock < 0)
+ {
+ sock = connect_to_host (conn->host, conn->port);
+ if (sock == E_HOST)
+ return HOSTERR;
+ else if (sock < 0)
+ return (retryable_socket_connect_error (errno)
+ ? CONERROR : CONIMPOSSIBLE);
+
+#ifdef HAVE_SSL
+ if (proxy && u->scheme == SCHEME_HTTPS)
+ {
+ char *head;
+ char *message;
+ /* When requesting SSL URLs through proxies, use the
+ CONNECT method to request passthrough. */
+ struct request *connreq = request_new ("CONNECT",
+ aprintf ("%s:%d", u->host, u->port));
+ SET_USER_AGENT (connreq);
+ if (proxyauth)
+ {
+ request_set_header (connreq, "Proxy-Authorization",
+ *proxyauth, rel_value);
+ /* Now that PROXYAUTH is part of the CONNECT request,
+ zero it out so we don't send proxy authorization with
+ the regular request below. */
+ *proxyauth = NULL;
+ }
+ request_set_header (connreq, "Host",
+ aprintf ("%s:%d", u->host, u->port),
+ rel_value);
+
+ write_error = request_send (connreq, sock, 0);
+ request_free (&connreq);
+ if (write_error < 0)
+ {
+ CLOSE_INVALIDATE (sock);
+ return WRITEFAILED;
+ }
+
+ head = read_http_response_head (sock);
+ if (!head)
+ {
+ logprintf (LOG_VERBOSE, _("Failed reading proxy response: %s\n"),
+ fd_errstr (sock));
+ CLOSE_INVALIDATE (sock);
+ return HERR;
+ }
+ message = NULL;
+ if (!*head)
+ {
+ xfree (head);
+ goto failed_tunnel;
+ }
+ DEBUGP (("proxy responded with: [%s]\n", head));
+
+ resp = resp_new (head);
+ statcode = resp_status (resp, &message);
+ if (statcode < 0)
+ {
+ char *tms = datetime_str (time (NULL));
+ logprintf (LOG_VERBOSE, "%d\n", statcode);
+ logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"), tms, statcode,
+ quotearg_style (escape_quoting_style,
+ _("Malformed status line")));
+ xfree (head);
+ return HERR;
+ }
+ xfree (hs->message);
+ hs->message = xstrdup (message);
+ resp_free (&resp);
+ xfree (head);
+ if (statcode != 200)
+ {
+ failed_tunnel:
+ logprintf (LOG_NOTQUIET, _("Proxy tunneling failed: %s"),
+ message ? quotearg_style (escape_quoting_style, message) : "?");
+ xfree (message);
+ return CONSSLERR;
+ }
+ xfree (message);
+
+ /* SOCK is now *really* connected to u->host, so update CONN
+ to reflect this. That way register_persistent will
+ register SOCK as being connected to u->host:u->port. */
+ conn = u;
+ }
+
+ if (conn->scheme == SCHEME_HTTPS)
+ {
+ if (!ssl_connect_wget (sock, u->host, NULL))
+ {
+ CLOSE_INVALIDATE (sock);
+ return CONSSLERR;
+ }
+ else if (!ssl_check_certificate (sock, u->host))
+ {
+ CLOSE_INVALIDATE (sock);
+ return VERIFCERTERR;
+ }
+ *using_ssl = true;
+ }
+#endif /* HAVE_SSL */
+ }
+ *conn_ref = conn;
+ *req_ref = req;
+ *sock_ref = sock;
+ return RETROK;
+}
+
+static uerr_t
+set_file_timestamp (struct http_stat *hs)
+{
+ bool local_dot_orig_file_exists = false;
+ char *local_filename = NULL;
+ struct stat st;
+ char buf[1024];
+
+ if (opt.backup_converted)
+ /* If -K is specified, we'll act on the assumption that it was specified
+ last time these files were downloaded as well, and instead of just
+ comparing local file X against server file X, we'll compare local
+ file X.orig (if extant, else X) against server file X. If -K
+ _wasn't_ specified last time, or the server contains files called
+ *.orig, -N will be back to not operating correctly with -k. */
+ {
+ size_t filename_len = strlen (hs->local_file);
+ char *filename_plus_orig_suffix;
+
+ if (filename_len + sizeof (ORIG_SFX) > sizeof (buf))
+ filename_plus_orig_suffix = xmalloc (filename_len + sizeof (ORIG_SFX));
+ else
+ filename_plus_orig_suffix = buf;
+
+ /* Would a single s[n]printf() call be faster? --dan
+
+ Definitely not. sprintf() is horribly slow. It's a
+ different question whether the difference between the two
+ affects a program. Usually I'd say "no", but at one
+ point I profiled Wget, and found that a measurable and
+ non-negligible amount of time was lost calling sprintf()
+ in url.c. Replacing sprintf with inline calls to
+ strcpy() and number_to_string() made a difference.
+ --hniksic */
+ memcpy (filename_plus_orig_suffix, hs->local_file, filename_len);
+ memcpy (filename_plus_orig_suffix + filename_len,
+ ORIG_SFX, sizeof (ORIG_SFX));
+
+ /* Try to stat() the .orig file. */
+ if (stat (filename_plus_orig_suffix, &st) == 0)
+ {
+ local_dot_orig_file_exists = true;
+ local_filename = filename_plus_orig_suffix;
+ }
+ }
+
+ if (!local_dot_orig_file_exists)
+ /* Couldn't stat() <file>.orig, so try to stat() <file>. */
+ if (stat (hs->local_file, &st) == 0)
+ {
+ if (local_filename != buf)
+ xfree (local_filename);
+ local_filename = hs->local_file;
+ }
+
+ if (local_filename != NULL)
+ /* There was a local file, so we'll check later to see if the version
+ the server has is the same version we already have, allowing us to
+ skip a download. */
+ {
+ if (local_filename == buf || local_filename == hs->local_file)
+ hs->orig_file_name = xstrdup (local_filename); // on stack or a copy, make a heap copy
+ else
+ hs->orig_file_name = local_filename; // was previously malloc'ed
+ hs->orig_file_size = st.st_size;
+ hs->orig_file_tstamp = st.st_mtime;
+#ifdef WINDOWS
+ /* Modification time granularity is 2 seconds for Windows, so
+ increase local time by 1 second for later comparison. */
+ ++hs->orig_file_tstamp;
+#endif
+ hs->timestamp_checked = true;
+ }
+
+ return RETROK;
+}
+
+static uerr_t
+check_file_output (const struct url *u, struct http_stat *hs,
+ struct response *resp, char *hdrval, size_t hdrsize)
+{
+ /* Determine the local filename if needed. Notice that if -O is used
+ * hstat.local_file is set by http_loop to the argument of -O. */
+ if (!hs->local_file)
+ {
+ char *local_file = NULL;
+
+ /* Honor Content-Disposition whether possible. */
+ if (!opt.content_disposition
+ || !resp_header_copy (resp, "Content-Disposition",
+ hdrval, hdrsize)
+ || !parse_content_disposition (hdrval, &local_file))
+ {
+ /* The Content-Disposition header is missing or broken.
+ * Choose unique file name according to given URL. */
+ hs->local_file = url_file_name (u, NULL);
+ }
+ else
+ {
+ DEBUGP (("Parsed filename from Content-Disposition: %s\n",
+ local_file));
+ hs->local_file = url_file_name (u, local_file);
+ }
+
+ xfree (local_file);
+ }
+
+ hs->temporary = opt.delete_after || opt.spider || !acceptable (hs->local_file);
+ if (hs->temporary)
+ {
+ char *tmp = aprintf ("%s.tmp", hs->local_file);
+ xfree (hs->local_file);
+ hs->local_file = tmp;
+ }
+
+ /* TODO: perform this check only once. */
+ if (!hs->existence_checked && file_exists_p (hs->local_file, NULL))
+ {
+ if (opt.noclobber && !opt.output_document)
+ {
+ /* If opt.noclobber is turned on and file already exists, do not
+ retrieve the file. But if the output_document was given, then this
+ test was already done and the file didn't exist. Hence the !opt.output_document */
+ return RETRUNNEEDED;
+ }
+ else if (!ALLOW_CLOBBER)
+ {
+ char *unique = unique_name_passthrough (hs->local_file);
+ if (unique != hs->local_file)
+ xfree (hs->local_file);
+ hs->local_file = unique;
+ }
+ }
+ hs->existence_checked = true;
+
+ /* Support timestamping */
+ if (opt.timestamping && !hs->timestamp_checked)
+ {
+ uerr_t timestamp_err = set_file_timestamp (hs);
+ if (timestamp_err != RETROK)
+ return timestamp_err;
+ }
+ return RETROK;
+}
+
+static uerr_t
+check_auth (const struct url *u, char *user, char *passwd, struct response *resp,
+ struct request *req, bool *ntlm_seen_ref, bool *retry,
+ bool *basic_auth_finished_ref, bool *auth_finished_ref)
+{
+ uerr_t auth_err = RETROK;
+ bool basic_auth_finished = *basic_auth_finished_ref;
+ bool auth_finished = *auth_finished_ref;
+ bool ntlm_seen = *ntlm_seen_ref;
+ char buf[256], *tmp = NULL;
+
+ *retry = false;
+
+ if (!auth_finished && (user && passwd))
+ {
+ /* IIS sends multiple copies of WWW-Authenticate, one with
+ the value "negotiate", and other(s) with data. Loop over
+ all the occurrences and pick the one we recognize. */
+ int wapos;
+ const char *www_authenticate = NULL;
+ const char *wabeg, *waend;
+ const char *digest = NULL, *basic = NULL, *ntlm = NULL;
+
+ for (wapos = 0; !ntlm
+ && (wapos = resp_header_locate (resp, "WWW-Authenticate", wapos,
+ &wabeg, &waend)) != -1;
+ ++wapos)
+ {
+ param_token name, value;
+ size_t len = waend - wabeg;
+
+ if (tmp != buf)
+ xfree (tmp);
+
+ if (len < sizeof (buf))
+ tmp = buf;
+ else
+ tmp = xmalloc (len + 1);
+
+ memcpy (tmp, wabeg, len);
+ tmp[len] = 0;
+
+ www_authenticate = tmp;
+
+ for (;!ntlm;)
+ {
+ /* extract the auth-scheme */
+ while (c_isspace (*www_authenticate)) www_authenticate++;
+ name.e = name.b = www_authenticate;
+ while (*name.e && !c_isspace (*name.e)) name.e++;
+
+ if (name.b == name.e)
+ break;
+
+ DEBUGP (("Auth scheme found '%.*s'\n", (int) (name.e - name.b), name.b));
+
+ if (known_authentication_scheme_p (name.b, name.e))
+ {
+ if (BEGINS_WITH (name.b, "NTLM"))
+ {
+ ntlm = name.b;
+ break; /* this is the most secure challenge, stop here */
+ }
+ else if (!digest && BEGINS_WITH (name.b, "Digest"))
+ digest = name.b;
+ else if (!basic && BEGINS_WITH (name.b, "Basic"))
+ basic = name.b;
+ }
+
+ /* now advance over the auth-params */
+ www_authenticate = name.e;
+ DEBUGP (("Auth param list '%s'\n", www_authenticate));
+ while (extract_param (&www_authenticate, &name, &value, ',', NULL) && name.b && value.b)
+ {
+ DEBUGP (("Auth param %.*s=%.*s\n",
+ (int) (name.e - name.b), name.b, (int) (value.e - value.b), value.b));
+ }
+ }
+ }
+
+ if (!basic && !digest && !ntlm)
+ {
+ /* If the authentication header is missing or
+ unrecognized, there's no sense in retrying. */
+ logputs (LOG_NOTQUIET, _("Unknown authentication scheme.\n"));
+ }
+ else if (!basic_auth_finished
+ || !basic)
+ {
+ char *pth = url_full_path (u);
+ const char *value;
+ uerr_t *auth_stat;
+ auth_stat = xmalloc (sizeof (uerr_t));
+ *auth_stat = RETROK;
+
+ if (ntlm)
+ www_authenticate = ntlm;
+ else if (digest)
+ www_authenticate = digest;
+ else
+ www_authenticate = basic;
+
+ logprintf (LOG_NOTQUIET, _("Authentication selected: %s\n"), www_authenticate);
+
+ value = create_authorization_line (www_authenticate,
+ user, passwd,
+ request_method (req),
+ pth,
+ &auth_finished,
+ auth_stat);
+
+ auth_err = *auth_stat;
+ xfree (auth_stat);
+ xfree (pth);
+ if (auth_err == RETROK)
+ {
+ request_set_header (req, "Authorization", value, rel_value);
+
+ if (BEGINS_WITH (www_authenticate, "NTLM"))
+ ntlm_seen = true;
+ else if (!u->user && BEGINS_WITH (www_authenticate, "Basic"))
+ {
+ /* Need to register this host as using basic auth,
+ * so we automatically send creds next time. */
+ register_basic_auth_host (u->host);
+ }
+
+ *retry = true;
+ goto cleanup;
+ }
+ else
+ {
+ /* Creating the Authorization header went wrong */
+ xfree (value);
+ }
+ }
+ else
+ {
+ /* We already did Basic auth, and it failed. Gotta
+ * give up. */
+ }
+ }
+
+ cleanup:
+ if (tmp != buf)
+ xfree (tmp);
+ *ntlm_seen_ref = ntlm_seen;
+ *basic_auth_finished_ref = basic_auth_finished;
+ *auth_finished_ref = auth_finished;
+ return auth_err;
+}
+
+static uerr_t
+open_output_stream (struct http_stat *hs, int count, FILE **fp)
+{
+/* 2005-06-17 SMS.
+ For VMS, define common fopen() optional arguments.
+*/
+#ifdef __VMS
+# define FOPEN_OPT_ARGS "fop=sqo", "acc", acc_cb, &open_id
+# define FOPEN_BIN_FLAG 3
+#else /* def __VMS */
+# define FOPEN_BIN_FLAG true
+#endif /* def __VMS [else] */
+
+ /* Open the local file. */
+ if (!output_stream)
+ {
+ mkalldirs (hs->local_file);
+ if (opt.backups)
+ rotate_backups (hs->local_file);
+ if (hs->restval)
+ {
+#ifdef __VMS
+ int open_id;
+
+ open_id = 21;
+ *fp = fopen (hs->local_file, "ab", FOPEN_OPT_ARGS);
+#else /* def __VMS */
+ *fp = fopen (hs->local_file, "ab");
+#endif /* def __VMS [else] */
+ }
+ else if (ALLOW_CLOBBER || count > 0)
+ {
+ if (opt.unlink_requested && file_exists_p (hs->local_file, NULL))
+ {
+ if (unlink (hs->local_file) < 0)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file,
+ strerror (errno));
+ return UNLINKERR;
+ }
+ }
+
+#ifdef __VMS
+ int open_id;
+
+ open_id = 22;
+ *fp = fopen (hs->local_file, "wb", FOPEN_OPT_ARGS);
+#else /* def __VMS */
+ if (hs->temporary)
+ {
+ *fp = fdopen (open (hs->local_file, O_BINARY | O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR), "wb");
+ }
+ else
+ {
+ *fp = fopen (hs->local_file, "wb");
+ }
+
+#endif /* def __VMS [else] */
+ }
+ else
+ {
+ *fp = fopen_excl (hs->local_file, FOPEN_BIN_FLAG);
+ if (!*fp && errno == EEXIST)
+ {
+ /* We cannot just invent a new name and use it (which is
+ what functions like unique_create typically do)
+ because we told the user we'd use this name.
+ Instead, return and retry the download. */
+ logprintf (LOG_NOTQUIET,
+ _("%s has sprung into existence.\n"),
+ hs->local_file);
+ return FOPEN_EXCL_ERR;
+ }
+ }
+ if (!*fp)
+ {
+ logprintf (LOG_NOTQUIET, "%s: %s\n", hs->local_file, strerror (errno));
+ return FOPENERR;
+ }
+ }
+ else
+ *fp = output_stream;
+
+ /* Print fetch message, if opt.verbose. */
+ logprintf (LOG_VERBOSE, _("Saving to: %s\n"),
+ HYPHENP (hs->local_file) ? quote ("STDOUT") : quote (hs->local_file));
+
+ return RETROK;
+}
+
+/* Set proper type flags based on type string. */
+static void
+set_content_type (int *dt, const char *type)
+{
+ /* If content-type is not given, assume text/html. This is because
+ of the multitude of broken CGI's that "forget" to generate the
+ content-type. */
+ if (!type ||
+ 0 == c_strcasecmp (type, TEXTHTML_S) ||
+ 0 == c_strcasecmp (type, TEXTXHTML_S))
+ *dt |= TEXTHTML;
+ else
+ *dt &= ~TEXTHTML;
+
+ if (type &&
+ 0 == c_strcasecmp (type, TEXTCSS_S))
+ *dt |= TEXTCSS;
+ else
+ *dt &= ~TEXTCSS;
+}
+
+#ifdef HAVE_METALINK
+/* Will return proper metalink_t structure if enough data was found in
+ http response resp. Otherwise returns NULL.
+ Two exit points: one for success and one for failure. */
+static metalink_t *
+metalink_from_http (const struct response *resp, const struct http_stat *hs,
+ const struct url *u)
+{
+ metalink_t *metalink = NULL;
+ metalink_file_t *mfile = xnew0 (metalink_file_t);
+ const char *val_beg, *val_end;
+ int res_count = 0, meta_count = 0, hash_count = 0, sig_count = 0, i;
+
+ DEBUGP (("Checking for Metalink in HTTP response\n"));
+
+ /* Initialize metalink file for our simple use case. */
+ if (hs->local_file)
+ mfile->name = xstrdup (hs->local_file);
+ else
+ mfile->name = url_file_name (u, NULL);
+
+ /* Begin with 1-element array (for 0-termination). */
+ mfile->checksums = xnew0 (metalink_checksum_t *);
+ mfile->resources = xnew0 (metalink_resource_t *);
+ mfile->metaurls = xnew0 (metalink_metaurl_t *);
+
+ /* Process the Content-Type header. */
+ if (resp_header_locate (resp, "Content-Type", 0, &val_beg, &val_end) != -1)
+ {
+ metalink_metaurl_t murl = {0};
+
+ const char *type_beg, *type_end;
+ char *typestr = NULL;
+ char *namestr = NULL;
+ size_t type_len;
+
+ DEBUGP (("Processing Content-Type header...\n"));
+
+ /* Find beginning of type. */
+ type_beg = val_beg;
+ while (type_beg < val_end && c_isspace (*type_beg))
+ type_beg++;
+
+ /* Find end of type. */
+ type_end = type_beg + 1;
+ while (type_end < val_end &&
+ *type_end != ';' &&
+ *type_end != ' ' &&
+ *type_end != '\r' &&
+ *type_end != '\n')
+ type_end++;
+
+ if (type_beg >= val_end || type_end > val_end)
+ {
+ DEBUGP (("Invalid Content-Type header. Ignoring.\n"));
+ goto skip_content_type;
+ }
+
+ type_len = type_end - type_beg;
+ typestr = xstrndup (type_beg, type_len);
+
+ DEBUGP (("Content-Type: %s\n", typestr));
+
+ if (strcmp (typestr, "application/metalink4+xml"))
+ {
+ xfree (typestr);
+ goto skip_content_type;
+ }
+
+ /*
+ Valid ranges for the "pri" attribute are from
+ 1 to 999999. Mirror servers with a lower value of the "pri"
+ attribute have a higher priority, while mirrors with an undefined
+ "pri" attribute are considered to have a value of 999999, which is
+ the lowest priority.
+
+ rfc6249 section 3.1
+ */
+ murl.priority = DEFAULT_PRI;
+
+ murl.mediatype = typestr;
+ typestr = NULL;
+
+ if (opt.content_disposition
+ && resp_header_locate (resp, "Content-Disposition", 0, &val_beg, &val_end) != -1)
+ {
+ find_key_value (val_beg, val_end, "filename", &namestr);
+ murl.name = namestr;
+ namestr = NULL;
+ }
+
+ murl.url = xstrdup (u->url);
+
+ DEBUGP (("URL=%s\n", murl.url));
+ DEBUGP (("MEDIATYPE=%s\n", murl.mediatype));
+ DEBUGP (("NAME=%s\n", murl.name ? murl.name : ""));
+ DEBUGP (("PRIORITY=%d\n", murl.priority));
+
+ /* 1 slot from new resource, 1 slot for null-termination. */
+ mfile->metaurls = xrealloc (mfile->metaurls,
+ sizeof (metalink_metaurl_t *) * (meta_count + 2));
+ mfile->metaurls[meta_count] = xnew0 (metalink_metaurl_t);
+ *mfile->metaurls[meta_count] = murl;
+ meta_count++;
+ }
+skip_content_type:
+
+ /* Find all Link headers. */
+ for (i = 0;
+ (i = resp_header_locate (resp, "Link", i, &val_beg, &val_end)) != -1;
+ i++)
+ {
+ char *rel = NULL, *reltype = NULL;
+ char *urlstr = NULL;
+ const char *url_beg, *url_end, *attrs_beg;
+ size_t url_len;
+
+ /* Sample Metalink Link headers:
+
+ Link: <http://www2.example.com/dir1/dir2/dir3/dir4/dir5/example.ext>;
+ rel=duplicate; pri=1; pref; geo=gb; depth=4
+
+ Link: <http://example.com/example.ext.asc>; rel=describedby;
+ type="application/pgp-signature"
+ */
+
+ /* Find beginning of URL. */
+ url_beg = val_beg;
+ while (url_beg < val_end - 1 && c_isspace (*url_beg))
+ url_beg++;
+
+ /* Find end of URL. */
+ /* The convention here is that end ptr points to one element after
+ end of string. In this case, it should be pointing to the '>', which
+ is one element after end of actual URL. Therefore, it should never point
+ to val_end, which is one element after entire header value string. */
+ url_end = url_beg + 1;
+ while (url_end < val_end - 1 && *url_end != '>')
+ url_end++;
+
+ if (url_beg >= val_end || url_end >= val_end ||
+ *url_beg != '<' || *url_end != '>')
+ {
+ DEBUGP (("This is not a valid Link header. Ignoring.\n"));
+ continue;
+ }
+
+ /* Skip <. */
+ url_beg++;
+ url_len = url_end - url_beg;
+
+ /* URL found. Now handle the attributes. */
+ attrs_beg = url_end + 1;
+
+ /* First we need to find out what type of link it is. Currently, we
+ support rel=duplicate and rel=describedby. */
+ if (!find_key_value (attrs_beg, val_end, "rel", &rel))
+ {
+ DEBUGP (("No rel value in Link header, skipping.\n"));
+ continue;
+ }
+
+ urlstr = xstrndup (url_beg, url_len);
+ DEBUGP (("URL=%s\n", urlstr));
+ DEBUGP (("rel=%s\n", rel));
+
+ if (!strcmp (rel, "describedby"))
+ find_key_value (attrs_beg, val_end, "type", &reltype);
+
+ /* Handle signatures.
+ Libmetalink only supports one signature per file. Therefore we stop
+ as soon as we successfully get first supported signature. */
+ if (sig_count == 0 &&
+ reltype && !strcmp (reltype, "application/pgp-signature"))
+ {
+ /* Download the signature to a temporary file. */
+ FILE *_output_stream = output_stream;
+ bool _output_stream_regular = output_stream_regular;
+
+ output_stream = tmpfile ();
+ if (output_stream)
+ {
+ struct iri *iri = iri_new ();
+ struct url *url;
+ int url_err;
+
+ set_uri_encoding (iri, opt.locale, true);
+ url = url_parse (urlstr, &url_err, iri, false);
+
+ if (!url)
+ {
+ char *error = url_error (urlstr, url_err);
+ logprintf (LOG_NOTQUIET, _("When downloading signature:\n"
+ "%s: %s.\n"), urlstr, error);
+ xfree (error);
+ iri_free (iri);
+ }
+ else
+ {
+ /* Avoid recursive Metalink from HTTP headers. */
+ bool _metalink_http = opt.metalink_over_http;
+ uerr_t retr_err;
+
+ opt.metalink_over_http = false;
+ retr_err = retrieve_url (url, urlstr, NULL, NULL,
+ NULL, NULL, false, iri, false);
+ opt.metalink_over_http = _metalink_http;
+
+ url_free (url);
+ iri_free (iri);
+
+ if (retr_err == RETROK)
+ {
+ /* Signature is in the temporary file. Read it into
+ metalink resource structure. */
+ metalink_signature_t msig;
+ size_t siglen;
+
+ fseek (output_stream, 0, SEEK_END);
+ siglen = ftell (output_stream);
+ fseek (output_stream, 0, SEEK_SET);
+
+ DEBUGP (("siglen=%lu\n", siglen));
+
+ msig.signature = xmalloc (siglen + 1);
+ if (fread (msig.signature, siglen, 1, output_stream) != 1)
+ {
+ logputs (LOG_NOTQUIET,
+ _("Unable to read signature content from "
+ "temporary file. Skipping.\n"));
+ xfree (msig.signature);
+ }
+ else
+ {
+ msig.signature[siglen] = '\0'; /* Just in case. */
+ msig.mediatype = xstrdup ("application/pgp-signature");
+
+ DEBUGP (("Signature (%s):\n%s\n",
+ msig.mediatype, msig.signature));
+
+ mfile->signature = xnew (metalink_signature_t);
+ *mfile->signature = msig;
+
+ sig_count++;
+ }
+ }
+ }
+ fclose (output_stream);
+ }
+ else
+ {
+ logputs (LOG_NOTQUIET, _("Could not create temporary file. "
+ "Skipping signature download.\n"));
+ }
+ output_stream_regular = _output_stream_regular;
+ output_stream = _output_stream;
+ } /* Iterate over signatures. */
+
+ /* Handle Metalink resources. */
+ else if (!strcmp (rel, "duplicate"))
+ {
+ metalink_resource_t mres = {0};
+ char *pristr;
+
+ /*
+ Valid ranges for the "pri" attribute are from
+ 1 to 999999. Mirror servers with a lower value of the "pri"
+ attribute have a higher priority, while mirrors with an undefined
+ "pri" attribute are considered to have a value of 999999, which is
+ the lowest priority.
+
+ rfc6249 section 3.1
+ */
+ mres.priority = DEFAULT_PRI;
+ if (find_key_value (url_end, val_end, "pri", &pristr))
+ {
+ long pri;
+ char *end_pristr;
+ /* Do not care for errno since 0 is error in this case. */
+ pri = strtol (pristr, &end_pristr, 10);
+ if (end_pristr != pristr + strlen (pristr) ||
+ !VALID_PRI_RANGE (pri))
+ {
+ /* This is against the specification, so let's inform the user. */
+ logprintf (LOG_NOTQUIET,
+ _("Invalid pri value. Assuming %d.\n"),
+ DEFAULT_PRI);
+ }
+ else
+ mres.priority = pri;
+ xfree (pristr);
+ }
+
+ switch (url_scheme (urlstr))
+ {
+ case SCHEME_HTTP:
+ mres.type = xstrdup ("http");
+ break;
+#ifdef HAVE_SSL
+ case SCHEME_HTTPS:
+ mres.type = xstrdup ("https");
+ break;
+ case SCHEME_FTPS:
+ mres.type = xstrdup ("ftps");
+ break;
+#endif
+ case SCHEME_FTP:
+ mres.type = xstrdup ("ftp");
+ break;
+ default:
+ DEBUGP (("Unsupported url scheme in %s. Skipping resource.\n", urlstr));
+ }
+
+ if (mres.type)
+ {
+ DEBUGP (("TYPE=%s\n", mres.type));
+
+ /* At this point we have validated the new resource. */
+
+ find_key_value (url_end, val_end, "geo", &mres.location);
+
+ mres.url = urlstr;
+ urlstr = NULL;
+
+ mres.preference = 0;
+ if (has_key (url_end, val_end, "pref"))
+ {
+ DEBUGP (("This resource has preference\n"));
+ mres.preference = 1;
+ }
+
+ /* 1 slot from new resource, 1 slot for null-termination. */
+ mfile->resources = xrealloc (mfile->resources,
+ sizeof (metalink_resource_t *) * (res_count + 2));
+ mfile->resources[res_count] = xnew0 (metalink_resource_t);
+ *mfile->resources[res_count] = mres;
+ res_count++;
+ }
+ } /* Handle resource link (rel=duplicate). */
+
+ /* Handle Metalink/XML resources. */
+ else if (reltype && !strcmp (reltype, "application/metalink4+xml"))
+ {
+ metalink_metaurl_t murl = {0};
+ char *pristr;
+
+ /*
+ Valid ranges for the "pri" attribute are from
+ 1 to 999999. Mirror servers with a lower value of the "pri"
+ attribute have a higher priority, while mirrors with an undefined
+ "pri" attribute are considered to have a value of 999999, which is
+ the lowest priority.
+
+ rfc6249 section 3.1
+ */
+ murl.priority = DEFAULT_PRI;
+ if (find_key_value (url_end, val_end, "pri", &pristr))
+ {
+ long pri;
+ char *end_pristr;
+ /* Do not care for errno since 0 is error in this case. */
+ pri = strtol (pristr, &end_pristr, 10);
+ if (end_pristr != pristr + strlen (pristr) ||
+ !VALID_PRI_RANGE (pri))
+ {
+ /* This is against the specification, so let's inform the user. */
+ logprintf (LOG_NOTQUIET,
+ _("Invalid pri value. Assuming %d.\n"),
+ DEFAULT_PRI);
+ }
+ else
+ murl.priority = pri;
+ xfree (pristr);
+ }
+
+ murl.mediatype = xstrdup (reltype);
+
+ DEBUGP (("MEDIATYPE=%s\n", murl.mediatype));
+
+ /* At this point we have validated the new resource. */
+
+ find_key_value (url_end, val_end, "name", &murl.name);
+
+ murl.url = urlstr;
+ urlstr = NULL;
+
+ /* 1 slot from new resource, 1 slot for null-termination. */
+ mfile->metaurls = xrealloc (mfile->metaurls,
+ sizeof (metalink_metaurl_t *) * (meta_count + 2));
+ mfile->metaurls[meta_count] = xnew0 (metalink_metaurl_t);
+ *mfile->metaurls[meta_count] = murl;
+ meta_count++;
+ } /* Handle resource link (rel=describedby). */
+ else
+ DEBUGP (("This link header was not used for Metalink\n"));
+
+ xfree (urlstr);
+ xfree (reltype);
+ xfree (rel);
+ } /* Iterate over link headers. */
+
+ /* Null-terminate resources array. */
+ mfile->resources[res_count] = 0;
+ mfile->metaurls[meta_count] = 0;
+
+ if (res_count == 0 && meta_count == 0)
+ {
+ DEBUGP (("No valid metalink references found.\n"));
+ goto fail;
+ }
+
+ /* Find all Digest headers. */
+ for (i = 0;
+ (i = resp_header_locate (resp, "Digest", i, &val_beg, &val_end)) != -1;
+ i++)
+ {
+ const char *dig_pos;
+ char *dig_type, *dig_hash;
+
+ /* Each Digest header can include multiple hashes. Example:
+ Digest: SHA=thvDyvhfIqlvFe+A9MYgxAfm1q5=,unixsum=30637
+ Digest: md5=HUXZLQLMuI/KZ5KDcJPcOA==
+ */
+ for (dig_pos = val_beg;
+ (dig_pos = find_key_values (dig_pos, val_end, &dig_type, &dig_hash));
+ dig_pos++)
+ {
+ /* The hash here is assumed to be base64. We need the hash in hex.
+ Therefore we convert: base64 -> binary -> hex. */
+ const size_t dig_hash_str_len = strlen (dig_hash);
+ char bin_hash[256];
+ ssize_t hash_bin_len;
+
+ // there is no hash with that size
+ if (dig_hash_str_len >= sizeof (bin_hash))
+ {
+ DEBUGP (("Hash too long, ignored.\n"));
+ xfree (dig_type);
+ xfree (dig_hash);
+ continue;
+ }
+
+ hash_bin_len = wget_base64_decode (dig_hash, bin_hash, dig_hash_str_len * 3 / 4 + 1);
+
+ /* Detect malformed base64 input. */
+ if (hash_bin_len < 0)
+ {
+ DEBUGP (("Malformed base64 input, ignored.\n"));
+ xfree (dig_type);
+ xfree (dig_hash);
+ continue;
+ }
+
+ /* One slot for me, one for zero-termination. */
+ mfile->checksums =
+ xrealloc (mfile->checksums,
+ sizeof (metalink_checksum_t *) * (hash_count + 2));
+ mfile->checksums[hash_count] = xnew (metalink_checksum_t);
+ mfile->checksums[hash_count]->type = dig_type;
+
+ mfile->checksums[hash_count]->hash = xmalloc ((size_t)hash_bin_len * 2 + 1);
+ wg_hex_to_string (mfile->checksums[hash_count]->hash, bin_hash, (size_t)hash_bin_len);
+
+ xfree (dig_hash);
+
+ hash_count++;
+ }
+ }
+
+ /* Zero-terminate checksums array. */
+ mfile->checksums[hash_count] = 0;
+
+ /*
+ If Instance Digests are not provided by the Metalink servers, the
+ Link header fields pertaining to this specification MUST be ignored.
+
+ rfc6249 section 6
+ */
+ if (res_count && hash_count == 0)
+ {
+ logputs (LOG_VERBOSE,
+ _("Could not find acceptable digest for Metalink resources.\n"
+ "Ignoring them.\n"));
+ goto fail;
+ }
+
+ /* Metalink data is OK. Now we just need to sort the resources based
+ on their priorities, preference, and perhaps location. */
+ stable_sort (mfile->resources, res_count, sizeof (metalink_resource_t *), metalink_res_cmp);
+ stable_sort (mfile->metaurls, meta_count, sizeof (metalink_metaurl_t *), metalink_meta_cmp);
+
+ /* Restore sensible preference values (in case someone cares to look). */
+ for (i = 0; i < res_count; ++i)
+ mfile->resources[i]->preference = 1000000 - mfile->resources[i]->priority;
+
+ metalink = xnew0 (metalink_t);
+ metalink->files = xmalloc (sizeof (metalink_file_t *) * 2);
+ metalink->files[0] = mfile;
+ metalink->files[1] = 0;
+ metalink->origin = xstrdup (u->url);
+ metalink->version = METALINK_VERSION_4;
+ /* Leave other fields set to 0. */
+
+ return metalink;
+
+fail:
+ /* Free all allocated memory. */
+ if (metalink)
+ metalink_delete (metalink);
+ else
+ metalink_file_delete (mfile);
+ return NULL;
+}
+#endif /* HAVE_METALINK */
+
+/* Retrieve a document through HTTP protocol. It recognizes status
+ code, and correctly handles redirections. It closes the network
+ socket. If it receives an error from the functions below it, it
+ will print it if there is enough information to do so (almost
+ always), returning the error to the caller (i.e. http_loop).
+
+ Various HTTP parameters are stored to hs.
+
+ If PROXY is non-NULL, the connection will be made to the proxy
+ server, and u->url will be requested. */
+static uerr_t
+gethttp (const struct url *u, struct url *original_url, struct http_stat *hs,
+ int *dt, struct url *proxy, struct iri *iri, int count)
+{
+ struct request *req = NULL;
+
+ char *type = NULL;
+ char *user, *passwd;
+ char *proxyauth;
+ int statcode;
+ int write_error;
+ wgint contlen, contrange;
+ const struct url *conn;
+ FILE *fp;
+ int err;
+ uerr_t retval;
+#ifdef HAVE_HSTS
+#ifdef TESTING
+ /* we don't link against main.o when we're testing */
+ hsts_store_t hsts_store = NULL;
+#else
+ extern hsts_store_t hsts_store;
+#endif
+ const char *hsts_params;
+ time_t max_age;
+ bool include_subdomains;
+#endif
+
+ int sock = -1;
+
+ /* Set to 1 when the authorization has already been sent and should
+ not be tried again. */
+ bool auth_finished = false;
+
+ /* Set to 1 when just globally-set Basic authorization has been sent;
+ * should prevent further Basic negotiations, but not other
+ * mechanisms. */
+ bool basic_auth_finished = false;
+
+ /* Whether NTLM authentication is used for this request. */
+ bool ntlm_seen = false;
+
+ /* Whether our connection to the remote host is through SSL. */
+ bool using_ssl = false;
+
+ /* Whether a HEAD request will be issued (as opposed to GET or
+ POST). */
+ bool head_only = !!(*dt & HEAD_ONLY);
+
+ /* Whether conditional get request will be issued. */
+ bool cond_get = !!(*dt & IF_MODIFIED_SINCE);
+
+#ifdef HAVE_METALINK
+ /* Are we looking for metalink info in HTTP headers? */
+ bool metalink = !!(*dt & METALINK_METADATA);
+#endif
+
+ char *head = NULL;
+ struct response *resp = NULL;
+ char hdrval[512];
+ char *message = NULL;
+
+ /* Declare WARC variables. */
+ bool warc_enabled = (opt.warc_filename != NULL);
+ FILE *warc_tmp = NULL;
+ char warc_timestamp_str [21];
+ char warc_request_uuid [48];
+ ip_address warc_ip_buf, *warc_ip = NULL;
+ off_t warc_payload_offset = -1;
+
+ /* Whether this connection will be kept alive after the HTTP request
+ is done. */
+ bool keep_alive;
+
+ /* Is the server using the chunked transfer encoding? */
+ bool chunked_transfer_encoding = false;
+
+ /* Whether keep-alive should be inhibited. */
+ bool inhibit_keep_alive =
+ !opt.http_keep_alive || opt.ignore_length;
+
+ /* Headers sent when using POST. */
+ wgint body_data_size = 0;
+
+#ifdef HAVE_SSL
+ if (u->scheme == SCHEME_HTTPS)
+ {
+ /* Initialize the SSL context. After this has once been done,
+ it becomes a no-op. */
+ if (!ssl_init ())
+ {
+ scheme_disable (SCHEME_HTTPS);
+ logprintf (LOG_NOTQUIET,
+ _("Disabling SSL due to encountered errors.\n"));
+ retval = SSLINITFAILED;
+ goto cleanup;
+ }
+ }
+#endif /* HAVE_SSL */
+
+ /* Initialize certain elements of struct http_stat.
+ * Since this function is called in a loop, we have to xfree certain
+ * members. */
+ hs->len = 0;
+ hs->contlen = -1;
+ hs->res = -1;
+ xfree (hs->rderrmsg);
+ xfree (hs->newloc);
+ xfree (hs->remote_time);
+ xfree (hs->error);
+ xfree (hs->message);
+ hs->local_encoding = ENC_NONE;
+ hs->remote_encoding = ENC_NONE;
+
+ conn = u;
+
+ {
+ uerr_t ret;
+ req = initialize_request (u, hs, dt, proxy, inhibit_keep_alive,
+ &basic_auth_finished, &body_data_size,
+ &user, &passwd, &ret);
+ if (req == NULL)
+ {
+ retval = ret;
+ goto cleanup;
+ }
+ }
+ retry_with_auth:
+ /* We need to come back here when the initial attempt to retrieve
+ without authorization header fails. (Expected to happen at least
+ for the Digest authorization scheme.) */
+
+ if (opt.cookies)
+ request_set_header (req, "Cookie",
+ cookie_header (wget_cookie_jar,
+ u->host, u->port, u->path,
+#ifdef HAVE_SSL
+ u->scheme == SCHEME_HTTPS
+#else
+ 0
+#endif
+ ),
+ rel_value);
+
+ /* Add the user headers. */
+ if (opt.user_headers)
+ {
+ int i;
+ for (i = 0; opt.user_headers[i]; i++)
+ request_set_user_header (req, opt.user_headers[i]);
+ }
+
+ proxyauth = NULL;
+ if (proxy)
+ {
+ conn = proxy;
+ initialize_proxy_configuration (u, req, proxy, &proxyauth);
+ }
+ keep_alive = true;
+
+ /* Establish the connection. */
+ if (inhibit_keep_alive)
+ keep_alive = false;
+
+ {
+ uerr_t conn_err = establish_connection (u, &conn, hs, proxy, &proxyauth, &req,
+ &using_ssl, inhibit_keep_alive, &sock);
+ if (conn_err != RETROK)
+ {
+ retval = conn_err;
+ goto cleanup;
+ }
+ }
+
+ /* Open the temporary file where we will write the request. */
+ if (warc_enabled)
+ {
+ warc_tmp = warc_tempfile ();
+ if (warc_tmp == NULL)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = WARC_TMP_FOPENERR;
+ goto cleanup;
+ }
+
+ if (! proxy)
+ {
+ warc_ip = &warc_ip_buf;
+ socket_ip_address (sock, warc_ip, ENDPOINT_PEER);
+ }
+ }
+
+ /* Send the request to server. */
+ write_error = request_send (req, sock, warc_tmp);
+
+ if (write_error >= 0)
+ {
+ if (opt.body_data)
+ {
+ DEBUGP (("[BODY data: %s]\n", opt.body_data));
+ write_error = fd_write (sock, opt.body_data, body_data_size, -1);
+ if (write_error >= 0 && warc_tmp != NULL)
+ {
+ int warc_tmp_written;
+
+ /* Remember end of headers / start of payload. */
+ warc_payload_offset = ftello (warc_tmp);
+
+ /* Write a copy of the data to the WARC record. */
+ warc_tmp_written = fwrite (opt.body_data, 1, body_data_size, warc_tmp);
+ if (warc_tmp_written != body_data_size)
+ write_error = -2;
+ }
+ }
+ else if (opt.body_file && body_data_size != 0)
+ {
+ if (warc_tmp != NULL)
+ /* Remember end of headers / start of payload */
+ warc_payload_offset = ftello (warc_tmp);
+
+ write_error = body_file_send (sock, opt.body_file, body_data_size, warc_tmp);
+ }
+ }
+
+ if (write_error < 0)
+ {
+ CLOSE_INVALIDATE (sock);
+
+ if (warc_tmp != NULL)
+ fclose (warc_tmp);
+
+ if (write_error == -2)
+ retval = WARC_TMP_FWRITEERR;
+ else
+ retval = WRITEFAILED;
+ goto cleanup;
+ }
+ logprintf (LOG_VERBOSE, _("%s request sent, awaiting response... "),
+ proxy ? "Proxy" : "HTTP");
+ contlen = -1;
+ contrange = 0;
+ *dt &= ~RETROKF;
+
+
+ if (warc_enabled)
+ {
+ bool warc_result;
+
+ /* Generate a timestamp and uuid for this request. */
+ warc_timestamp (warc_timestamp_str, sizeof (warc_timestamp_str));
+ warc_uuid_str (warc_request_uuid, sizeof (warc_request_uuid));
+
+ /* Create a request record and store it in the WARC file. */
+ warc_result = warc_write_request_record (u->url, warc_timestamp_str,
+ warc_request_uuid, warc_ip,
+ warc_tmp, warc_payload_offset);
+ if (! warc_result)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = WARC_ERR;
+ goto cleanup;
+ }
+
+ /* warc_write_request_record has also closed warc_tmp. */
+ }
+
+ /* Repeat while we receive a 10x response code. */
+ {
+ bool _repeat;
+
+ do
+ {
+ head = read_http_response_head (sock);
+ if (!head)
+ {
+ if (errno == 0)
+ {
+ logputs (LOG_NOTQUIET, _("No data received.\n"));
+ CLOSE_INVALIDATE (sock);
+ retval = HEOF;
+ }
+ else
+ {
+ logprintf (LOG_NOTQUIET, _("Read error (%s) in headers.\n"),
+ fd_errstr (sock));
+ CLOSE_INVALIDATE (sock);
+ retval = HERR;
+ }
+ goto cleanup;
+ }
+ DEBUGP (("\n---response begin---\n%s---response end---\n", head));
+
+ resp = resp_new (head);
+
+ /* Check for status line. */
+ xfree (message);
+ statcode = resp_status (resp, &message);
+ if (statcode < 0)
+ {
+ char *tms = datetime_str (time (NULL));
+ logprintf (LOG_VERBOSE, "%d\n", statcode);
+ logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"), tms, statcode,
+ quotearg_style (escape_quoting_style,
+ _("Malformed status line")));
+ CLOSE_INVALIDATE (sock);
+ retval = HERR;
+ goto cleanup;
+ }
+
+ if (H_10X (statcode))
+ {
+ xfree (head);
+ resp_free (&resp);
+ _repeat = true;
+ DEBUGP (("Ignoring response\n"));
+ }
+ else
+ {
+ _repeat = false;
+ }
+ }
+ while (_repeat);
+ }
+
+ xfree (hs->message);
+ hs->message = xstrdup (message);
+ if (!opt.server_response)
+ logprintf (LOG_VERBOSE, "%2d %s\n", statcode,
+ message ? quotearg_style (escape_quoting_style, message) : "");
+ else
+ {
+ logprintf (LOG_VERBOSE, "\n");
+ print_server_response (resp, " ");
+ }
+
+ if (!opt.ignore_length
+ && resp_header_copy (resp, "Content-Length", hdrval, sizeof (hdrval)))
+ {
+ wgint parsed;
+ errno = 0;
+ parsed = str_to_wgint (hdrval, NULL, 10);
+ if (parsed == WGINT_MAX && errno == ERANGE)
+ {
+ /* Out of range.
+ #### If Content-Length is out of range, it most likely
+ means that the file is larger than 2G and that we're
+ compiled without LFS. In that case we should probably
+ refuse to even attempt to download the file. */
+ contlen = -1;
+ }
+ else if (parsed < 0)
+ {
+ /* Negative Content-Length; nonsensical, so we can't
+ assume any information about the content to receive. */
+ contlen = -1;
+ }
+ else
+ contlen = parsed;
+ }
+
+ /* Check for keep-alive related responses. */
+ if (!inhibit_keep_alive)
+ {
+ if (resp_header_copy (resp, "Connection", hdrval, sizeof (hdrval)))
+ {
+ if (0 == c_strcasecmp (hdrval, "Close"))
+ keep_alive = false;
+ }
+ }
+
+ chunked_transfer_encoding = false;
+ if (resp_header_copy (resp, "Transfer-Encoding", hdrval, sizeof (hdrval))
+ && 0 == c_strcasecmp (hdrval, "chunked"))
+ chunked_transfer_encoding = true;
+
+ /* Handle (possibly multiple instances of) the Set-Cookie header. */
+ if (opt.cookies)
+ {
+ int scpos;
+ const char *scbeg, *scend;
+ /* The jar should have been created by now. */
+ assert (wget_cookie_jar != NULL);
+ for (scpos = 0;
+ (scpos = resp_header_locate (resp, "Set-Cookie", scpos,
+ &scbeg, &scend)) != -1;
+ ++scpos)
+ {
+ char buf[1024], *set_cookie;
+ size_t len = scend - scbeg;
+
+ if (len < sizeof (buf))
+ set_cookie = buf;
+ else
+ set_cookie = xmalloc (len + 1);
+
+ memcpy (set_cookie, scbeg, len);
+ set_cookie[len] = 0;
+
+ cookie_handle_set_cookie (wget_cookie_jar, u->host, u->port,
+ u->path, set_cookie);
+
+ if (set_cookie != buf)
+ xfree (set_cookie);
+ }
+ }
+
+ if (keep_alive)
+ /* The server has promised that it will not close the connection
+ when we're done. This means that we can register it. */
+ register_persistent (conn->host, conn->port, sock, using_ssl);
+
+#ifdef HAVE_METALINK
+ /* We need to check for the Metalink data in the very first response
+ we get from the server (before redirections, authorization, etc.). */
+ if (metalink)
+ {
+ hs->metalink = metalink_from_http (resp, hs, u);
+ /* Bugfix: hs->local_file is NULL (opt.content_disposition). */
+ if (!hs->local_file && hs->metalink && hs->metalink->origin)
+ hs->local_file = xstrdup (hs->metalink->origin);
+ xfree (hs->message);
+ retval = RETR_WITH_METALINK;
+ CLOSE_FINISH (sock);
+ goto cleanup;
+ }
+#endif
+
+ if (statcode == HTTP_STATUS_UNAUTHORIZED)
+ {
+ /* Authorization is required. */
+ uerr_t auth_err = RETROK;
+ bool retry;
+ /* Normally we are not interested in the response body.
+ But if we are writing a WARC file we are: we like to keep everything. */
+ if (warc_enabled)
+ {
+ int _err;
+ type = resp_header_strdup (resp, "Content-Type");
+ _err = read_response_body (hs, sock, NULL, contlen, 0,
+ chunked_transfer_encoding,
+ u->url, warc_timestamp_str,
+ warc_request_uuid, warc_ip, type,
+ statcode, head);
+ xfree (type);
+
+ if (_err != RETRFINISHED || hs->res < 0)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = _err;
+ goto cleanup;
+ }
+ else
+ CLOSE_FINISH (sock);
+ }
+ else
+ {
+ /* Since WARC is disabled, we are not interested in the response body. */
+ if (keep_alive && !head_only
+ && skip_short_body (sock, contlen, chunked_transfer_encoding))
+ CLOSE_FINISH (sock);
+ else
+ CLOSE_INVALIDATE (sock);
+ }
+
+ pconn.authorized = false;
+
+ {
+ auth_err = check_auth (u, user, passwd, resp, req,
+ &ntlm_seen, &retry,
+ &basic_auth_finished,
+ &auth_finished);
+ if (auth_err == RETROK && retry)
+ {
+ resp_free (&resp);
+ xfree (message);
+ xfree (head);
+ goto retry_with_auth;
+ }
+ }
+ if (auth_err == RETROK)
+ retval = AUTHFAILED;
+ else
+ retval = auth_err;
+ goto cleanup;
+ }
+ else /* statcode != HTTP_STATUS_UNAUTHORIZED */
+ {
+ /* Kludge: if NTLM is used, mark the TCP connection as authorized. */
+ if (ntlm_seen)
+ pconn.authorized = true;
+ }
+
+ {
+ uerr_t ret = check_file_output (u, hs, resp, hdrval, sizeof hdrval);
+ if (ret != RETROK)
+ {
+ retval = ret;
+ goto cleanup;
+ }
+ }
+
+ hs->statcode = statcode;
+ xfree (hs->error);
+ if (statcode == -1)
+ hs->error = xstrdup (_("Malformed status line"));
+ else if (!*message)
+ hs->error = xstrdup (_("(no description)"));
+ else
+ hs->error = xstrdup (message);
+
+#ifdef HAVE_HSTS
+ if (opt.hsts && hsts_store)
+ {
+ hsts_params = resp_header_strdup (resp, "Strict-Transport-Security");
+ if (parse_strict_transport_security (hsts_params, &max_age, &include_subdomains))
+ {
+ /* process strict transport security */
+ if (hsts_store_entry (hsts_store, u->scheme, u->host, u->port, max_age, include_subdomains))
+ DEBUGP(("Added new HSTS host: %s:%u (max-age: %lu, includeSubdomains: %s)\n",
+ u->host,
+ (unsigned) u->port,
+ (unsigned long) max_age,
+ (include_subdomains ? "true" : "false")));
+ else
+ DEBUGP(("Updated HSTS host: %s:%u (max-age: %lu, includeSubdomains: %s)\n",
+ u->host,
+ (unsigned) u->port,
+ (unsigned long) max_age,
+ (include_subdomains ? "true" : "false")));
+ }
+ xfree (hsts_params);
+ }
+#endif
+
+ type = resp_header_strdup (resp, "Content-Type");
+ if (type)
+ {
+ char *tmp = strchr (type, ';');
+ if (tmp)
+ {
+#ifdef ENABLE_IRI
+ /* sXXXav: only needed if IRI support is enabled */
+ char *tmp2 = tmp + 1;
+#endif
+
+ while (tmp > type && c_isspace (tmp[-1]))
+ --tmp;
+ *tmp = '\0';
+
+#ifdef ENABLE_IRI
+ /* Try to get remote encoding if needed */
+ if (opt.enable_iri && !opt.encoding_remote)
+ {
+ tmp = parse_charset (tmp2);
+ if (tmp)
+ set_content_encoding (iri, tmp);
+ xfree (tmp);
+ }
+#endif
+ }
+ }
+ xfree (hs->newloc);
+ hs->newloc = resp_header_strdup (resp, "Location");
+ xfree (hs->remote_time);
+ hs->remote_time = resp_header_strdup (resp, "Last-Modified");
+ if (!hs->remote_time) // now look for the Wayback Machine's timestamp
+ hs->remote_time = resp_header_strdup (resp, "X-Archive-Orig-last-modified");
+
+ if (resp_header_copy (resp, "Content-Range", hdrval, sizeof (hdrval)))
+ {
+ wgint first_byte_pos, last_byte_pos, entity_length;
+ if (parse_content_range (hdrval, &first_byte_pos, &last_byte_pos,
+ &entity_length))
+ {
+ contrange = first_byte_pos;
+ contlen = last_byte_pos - first_byte_pos + 1;
+ }
+ }
+
+ if (resp_header_copy (resp, "Content-Encoding", hdrval, sizeof (hdrval)))
+ {
+ hs->local_encoding = ENC_INVALID;
+
+ switch (hdrval[0])
+ {
+ case 'b': case 'B':
+ if (0 == c_strcasecmp(hdrval, "br"))
+ hs->local_encoding = ENC_BROTLI;
+ break;
+ case 'c': case 'C':
+ if (0 == c_strcasecmp(hdrval, "compress"))
+ hs->local_encoding = ENC_COMPRESS;
+ break;
+ case 'd': case 'D':
+ if (0 == c_strcasecmp(hdrval, "deflate"))
+ hs->local_encoding = ENC_DEFLATE;
+ break;
+ case 'g': case 'G':
+ if (0 == c_strcasecmp(hdrval, "gzip"))
+ hs->local_encoding = ENC_GZIP;
+ break;
+ case 'i': case 'I':
+ if (0 == c_strcasecmp(hdrval, "identity"))
+ hs->local_encoding = ENC_NONE;
+ break;
+ case 'x': case 'X':
+ if (0 == c_strcasecmp(hdrval, "x-compress"))
+ hs->local_encoding = ENC_COMPRESS;
+ else if (0 == c_strcasecmp(hdrval, "x-gzip"))
+ hs->local_encoding = ENC_GZIP;
+ break;
+ case '\0':
+ hs->local_encoding = ENC_NONE;
+ }
+
+ if (hs->local_encoding == ENC_INVALID)
+ {
+ DEBUGP (("Unrecognized Content-Encoding: %s\n", hdrval));
+ hs->local_encoding = ENC_NONE;
+ }
+#ifdef HAVE_LIBZ
+ else if (hs->local_encoding == ENC_GZIP
+ && opt.compression != compression_none)
+ {
+ const char *p;
+
+ /* Make sure the Content-Type is not gzip before decompressing */
+ if (type)
+ {
+ p = strchr (type, '/');
+ if (p == NULL)
+ {
+ hs->remote_encoding = ENC_GZIP;
+ hs->local_encoding = ENC_NONE;
+ }
+ else
+ {
+ p++;
+ if (c_tolower(p[0]) == 'x' && p[1] == '-')
+ p += 2;
+ if (0 != c_strcasecmp (p, "gzip"))
+ {
+ hs->remote_encoding = ENC_GZIP;
+ hs->local_encoding = ENC_NONE;
+ }
+ }
+ }
+ else
+ {
+ hs->remote_encoding = ENC_GZIP;
+ hs->local_encoding = ENC_NONE;
+ }
+
+ /* don't uncompress if a file ends with '.gz' or '.tgz' */
+ if (hs->remote_encoding == ENC_GZIP
+ && (p = strrchr(u->file, '.'))
+ && (c_strcasecmp(p, ".gz") == 0 || c_strcasecmp(p, ".tgz") == 0))
+ {
+ DEBUGP (("Enabling broken server workaround. Will not decompress this GZip file.\n"));
+ hs->remote_encoding = ENC_NONE;
+ }
+ }
+#endif
+ }
+
+ /* 20x responses are counted among successful by default. */
+ if (H_20X (statcode))
+ *dt |= RETROKF;
+
+ if (statcode == HTTP_STATUS_NO_CONTENT)
+ {
+ /* 204 response has no body (RFC 2616, 4.3) */
+
+ /* In case the caller cares to look... */
+ hs->len = 0;
+ hs->res = 0;
+ hs->restval = 0;
+
+ CLOSE_FINISH (sock);
+
+ retval = RETRFINISHED;
+ goto cleanup;
+ }
+
+ /* Return if redirected. */
+ if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES)
+ {
+ /* RFC2068 says that in case of the 300 (multiple choices)
+ response, the server can output a preferred URL through
+ `Location' header; otherwise, the request should be treated
+ like GET. So, if the location is set, it will be a
+ redirection; otherwise, just proceed normally. */
+ if (statcode == HTTP_STATUS_MULTIPLE_CHOICES && !hs->newloc)
+ *dt |= RETROKF;
+ else
+ {
+ logprintf (LOG_VERBOSE,
+ _("Location: %s%s\n"),
+ hs->newloc ? escnonprint_uri (hs->newloc) : _("unspecified"),
+ hs->newloc ? _(" [following]") : "");
+
+ /* In case the caller cares to look... */
+ hs->len = 0;
+ hs->res = 0;
+ hs->restval = 0;
+
+ /* Normally we are not interested in the response body of a redirect.
+ But if we are writing a WARC file we are: we like to keep everything. */
+ if (warc_enabled)
+ {
+ int _err = read_response_body (hs, sock, NULL, contlen, 0,
+ chunked_transfer_encoding,
+ u->url, warc_timestamp_str,
+ warc_request_uuid, warc_ip, type,
+ statcode, head);
+
+ if (_err != RETRFINISHED || hs->res < 0)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = _err;
+ goto cleanup;
+ }
+ else
+ CLOSE_FINISH (sock);
+ }
+ else
+ {
+ /* Since WARC is disabled, we are not interested in the response body. */
+ if (keep_alive && !head_only
+ && skip_short_body (sock, contlen, chunked_transfer_encoding))
+ CLOSE_FINISH (sock);
+ else
+ CLOSE_INVALIDATE (sock);
+ }
+
+ /* From RFC2616: The status codes 303 and 307 have
+ been added for servers that wish to make unambiguously
+ clear which kind of reaction is expected of the client.
+
+ A 307 should be redirected using the same method,
+ in other words, a POST should be preserved and not
+ converted to a GET in that case.
+
+ With strict adherence to RFC2616, POST requests are not
+ converted to a GET request on 301 Permanent Redirect
+ or 302 Temporary Redirect.
+
+ A switch may be provided later based on the HTTPbis draft
+ that allows clients to convert POST requests to GET
+ requests on 301 and 302 response codes. */
+ switch (statcode)
+ {
+ case HTTP_STATUS_TEMPORARY_REDIRECT:
+ case HTTP_STATUS_PERMANENT_REDIRECT:
+ retval = NEWLOCATION_KEEP_POST;
+ goto cleanup;
+ case HTTP_STATUS_MOVED_PERMANENTLY:
+ if (opt.method && c_strcasecmp (opt.method, "post") != 0)
+ {
+ retval = NEWLOCATION_KEEP_POST;
+ goto cleanup;
+ }
+ break;
+ case HTTP_STATUS_MOVED_TEMPORARILY:
+ if (opt.method && c_strcasecmp (opt.method, "post") != 0)
+ {
+ retval = NEWLOCATION_KEEP_POST;
+ goto cleanup;
+ }
+ break;
+ }
+ retval = NEWLOCATION;
+ goto cleanup;
+ }
+ }
+
+ if (cond_get)
+ {
+ if (statcode == HTTP_STATUS_NOT_MODIFIED)
+ {
+ logprintf (LOG_VERBOSE,
+ _ ("File %s not modified on server. Omitting download.\n\n"),
+ quote (hs->local_file));
+ *dt |= RETROKF;
+ CLOSE_FINISH (sock);
+ retval = RETRUNNEEDED;
+ goto cleanup;
+ }
+ }
+
+ set_content_type (dt, type);
+
+ if (opt.adjust_extension)
+ {
+ const char *encoding_ext = NULL;
+ switch (hs->local_encoding)
+ {
+ case ENC_INVALID:
+ case ENC_NONE:
+ break;
+ case ENC_BROTLI:
+ encoding_ext = ".br";
+ break;
+ case ENC_COMPRESS:
+ encoding_ext = ".Z";
+ break;
+ case ENC_DEFLATE:
+ encoding_ext = ".zlib";
+ break;
+ case ENC_GZIP:
+ encoding_ext = ".gz";
+ break;
+ default:
+ DEBUGP (("No extension found for encoding %d\n",
+ hs->local_encoding));
+ }
+ if (encoding_ext != NULL)
+ {
+ char *file_ext = strrchr (hs->local_file, '.');
+ /* strip Content-Encoding extension (it will be re-added later) */
+ if (file_ext != NULL && 0 == strcasecmp (file_ext, encoding_ext))
+ *file_ext = '\0';
+ }
+ if (*dt & TEXTHTML)
+ /* -E / --adjust-extension / adjust_extension = on was specified,
+ and this is a text/html file. If some case-insensitive
+ variation on ".htm[l]" isn't already the file's suffix,
+ tack on ".html". */
+ {
+ ensure_extension (hs, ".html", dt);
+ }
+ else if (*dt & TEXTCSS)
+ {
+ ensure_extension (hs, ".css", dt);
+ }
+ if (encoding_ext != NULL)
+ {
+ ensure_extension (hs, encoding_ext, dt);
+ }
+ }
+
+ if (cond_get)
+ {
+ /* Handle the case when server ignores If-Modified-Since header. */
+ if (statcode == HTTP_STATUS_OK && hs->remote_time)
+ {
+ time_t tmr = http_atotm (hs->remote_time);
+
+ /* Check if the local file is up-to-date based on Last-Modified header
+ and content length. */
+ if (tmr != (time_t) - 1 && tmr <= hs->orig_file_tstamp
+ && (contlen == -1 || contlen == hs->orig_file_size))
+ {
+ logprintf (LOG_VERBOSE,
+ _("Server ignored If-Modified-Since header for file %s.\n"
+ "You might want to add --no-if-modified-since option."
+ "\n\n"),
+ quote (hs->local_file));
+ *dt |= RETROKF;
+ CLOSE_INVALIDATE (sock);
+ retval = RETRUNNEEDED;
+ goto cleanup;
+ }
+ }
+ }
+
+ if (statcode == HTTP_STATUS_RANGE_NOT_SATISFIABLE
+ || (!opt.timestamping && hs->restval > 0 && statcode == HTTP_STATUS_OK
+ && contrange == 0 && contlen >= 0 && hs->restval >= contlen))
+ {
+ /* If `-c' is in use and the file has been fully downloaded (or
+ the remote file has shrunk), Wget effectively requests bytes
+ after the end of file and the server response with 416
+ (or 200 with a <= Content-Length. */
+ logputs (LOG_VERBOSE, _("\
+\n The file is already fully retrieved; nothing to do.\n\n"));
+ /* In case the caller inspects. */
+ hs->len = contlen;
+ hs->res = 0;
+ /* Mark as successfully retrieved. */
+ *dt |= RETROKF;
+
+ /* Try to maintain the keep-alive connection. It is often cheaper to
+ * consume some bytes which have already been sent than to negotiate
+ * a new connection. However, if the body is too large, or we don't
+ * care about keep-alive, then simply terminate the connection */
+ if (keep_alive &&
+ skip_short_body (sock, contlen, chunked_transfer_encoding))
+ CLOSE_FINISH (sock);
+ else
+ CLOSE_INVALIDATE (sock);
+ retval = RETRUNNEEDED;
+ goto cleanup;
+ }
+ if ((contrange != 0 && contrange != hs->restval)
+ || (H_PARTIAL (statcode) && !contrange && hs->restval))
+ {
+ /* The Range request was somehow misunderstood by the server.
+ Bail out. */
+ CLOSE_INVALIDATE (sock);
+ retval = RANGEERR;
+ goto cleanup;
+ }
+ if (contlen == -1)
+ hs->contlen = -1;
+ /* If the response is gzipped, the uncompressed size is unknown. */
+ else if (hs->remote_encoding == ENC_GZIP)
+ hs->contlen = -1;
+ else
+ hs->contlen = contlen + contrange;
+
+ if (opt.verbose)
+ {
+ if (*dt & RETROKF)
+ {
+ /* No need to print this output if the body won't be
+ downloaded at all, or if the original server response is
+ printed. */
+ logputs (LOG_VERBOSE, _("Length: "));
+ if (contlen != -1)
+ {
+ logputs (LOG_VERBOSE, number_to_static_string (contlen + contrange));
+ if (contlen + contrange >= 1024)
+ logprintf (LOG_VERBOSE, " (%s)",
+ human_readable (contlen + contrange, 10, 1));
+ if (contrange)
+ {
+ if (contlen >= 1024)
+ logprintf (LOG_VERBOSE, _(", %s (%s) remaining"),
+ number_to_static_string (contlen),
+ human_readable (contlen, 10, 1));
+ else
+ logprintf (LOG_VERBOSE, _(", %s remaining"),
+ number_to_static_string (contlen));
+ }
+ }
+ else
+ logputs (LOG_VERBOSE,
+ opt.ignore_length ? _("ignored") : _("unspecified"));
+ if (type)
+ logprintf (LOG_VERBOSE, " [%s]\n", quotearg_style (escape_quoting_style, type));
+ else
+ logputs (LOG_VERBOSE, "\n");
+ }
+ }
+
+ /* Return if we have no intention of further downloading. */
+ if ((!(*dt & RETROKF) && !opt.content_on_error) || head_only || (opt.spider && !opt.recursive))
+ {
+ /* In case the caller cares to look... */
+ hs->len = 0;
+ hs->res = 0;
+ hs->restval = 0;
+
+ /* Normally we are not interested in the response body of a error responses.
+ But if we are writing a WARC file we are: we like to keep everything. */
+ if (warc_enabled)
+ {
+ int _err = read_response_body (hs, sock, NULL, contlen, 0,
+ chunked_transfer_encoding,
+ u->url, warc_timestamp_str,
+ warc_request_uuid, warc_ip, type,
+ statcode, head);
+
+ if (_err != RETRFINISHED || hs->res < 0)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = _err;
+ goto cleanup;
+ }
+
+ CLOSE_FINISH (sock);
+ }
+ else
+ {
+ /* Since WARC is disabled, we are not interested in the response body. */
+ if (head_only)
+ /* Pre-1.10 Wget used CLOSE_INVALIDATE here. Now we trust the
+ servers not to send body in response to a HEAD request, and
+ those that do will likely be caught by test_socket_open.
+ If not, they can be worked around using
+ `--no-http-keep-alive'. */
+ CLOSE_FINISH (sock);
+ else if (opt.spider && !opt.recursive)
+ /* we just want to see if the page exists - no downloading required */
+ CLOSE_INVALIDATE (sock);
+ else if (keep_alive
+ && skip_short_body (sock, contlen, chunked_transfer_encoding))
+ /* Successfully skipped the body; also keep using the socket. */
+ CLOSE_FINISH (sock);
+ else
+ CLOSE_INVALIDATE (sock);
+ }
+
+ if (statcode == HTTP_STATUS_GATEWAY_TIMEOUT)
+ retval = GATEWAYTIMEOUT;
+ else
+ retval = RETRFINISHED;
+
+ goto cleanup;
+ }
+
+ err = open_output_stream (hs, count, &fp);
+ if (err != RETROK)
+ {
+ CLOSE_INVALIDATE (sock);
+ retval = err;
+ goto cleanup;
+ }
+
+#ifdef ENABLE_XATTR
+ if (opt.enable_xattr)
+ {
+ if (original_url != u)
+ set_file_metadata (u, original_url, fp);
+ else
+ set_file_metadata (u, NULL, fp);
+ }
+#endif
+
+ err = read_response_body (hs, sock, fp, contlen, contrange,
+ chunked_transfer_encoding,
+ u->url, warc_timestamp_str,
+ warc_request_uuid, warc_ip, type,
+ statcode, head);
+
+ if (hs->res >= 0)
+ CLOSE_FINISH (sock);
+ else
+ CLOSE_INVALIDATE (sock);
+
+ if (!output_stream)
+ fclose (fp);
+
+ retval = err;
+
+ cleanup:
+ xfree (head);
+ xfree (type);
+ xfree (message);
+ resp_free (&resp);
+ request_free (&req);
+
+ return retval;
+}
+
+/* Check whether the supplied HTTP status code is among those
+ listed for the --retry-on-http-error option. */
+static bool
+check_retry_on_http_error (const int statcode)
+{
+ const char *tok = opt.retry_on_http_error;
+ while (tok && *tok)
+ {
+ if (atoi (tok) == statcode)
+ return true;
+ if ((tok = strchr (tok, ',')))
+ ++tok;
+ }
+ return false;
+}
+
+/* The genuine HTTP loop! This is the part where the retrieval is
+ retried, and retried, and retried, and... */
+uerr_t
+http_loop (const struct url *u, struct url *original_url, char **newloc,
+ char **local_file, const char *referer, int *dt, struct url *proxy,
+ struct iri *iri)
+{
+ int count;
+ bool got_head = false; /* used for time-stamping and filename detection */
+ bool time_came_from_head = false;
+ bool got_name = false;
+ char *tms;
+ const char *tmrate;
+ uerr_t err, ret = TRYLIMEXC;
+ time_t tmr = -1; /* remote time-stamp */
+ struct http_stat hstat; /* HTTP status */
+ struct stat st;
+ bool send_head_first = true;
+ bool force_full_retrieve = false;
+
+
+ /* If we are writing to a WARC file: always retrieve the whole file. */
+ if (opt.warc_filename != NULL)
+ force_full_retrieve = true;
+
+
+ /* Assert that no value for *LOCAL_FILE was passed. */
+ assert (local_file == NULL || *local_file == NULL);
+
+ /* Set LOCAL_FILE parameter. */
+ if (local_file && opt.output_document)
+ *local_file = HYPHENP (opt.output_document) ? NULL : xstrdup (opt.output_document);
+
+ /* Reset NEWLOC parameter. */
+ *newloc = NULL;
+
+ /* This used to be done in main, but it's a better idea to do it
+ here so that we don't go through the hoops if we're just using
+ FTP or whatever. */
+ if (opt.cookies)
+ load_cookies ();
+
+ /* Warn on (likely bogus) wildcard usage in HTTP. */
+ if (opt.ftp_glob && has_wildcards_p (u->path))
+ logputs (LOG_VERBOSE, _("Warning: wildcards not supported in HTTP.\n"));
+
+ /* Setup hstat struct. */
+ xzero (hstat);
+ hstat.referer = referer;
+
+ if (opt.output_document)
+ {
+ hstat.local_file = xstrdup (opt.output_document);
+ got_name = true;
+ }
+ else if (!opt.content_disposition)
+ {
+ hstat.local_file =
+ url_file_name (opt.trustservernames ? u : original_url, NULL);
+ got_name = true;
+ }
+
+ if (got_name && file_exists_p (hstat.local_file, NULL) && opt.noclobber && !opt.output_document)
+ {
+ /* If opt.noclobber is turned on and file already exists, do not
+ retrieve the file. But if the output_document was given, then this
+ test was already done and the file didn't exist. Hence the !opt.output_document */
+ get_file_flags (hstat.local_file, dt);
+ ret = RETROK;
+ goto exit;
+ }
+
+ /* Reset the counter. */
+ count = 0;
+
+ /* Reset the document type. */
+ *dt = 0;
+
+ /* Skip preliminary HEAD request if we're not in spider mode. */
+ if (!opt.spider)
+ send_head_first = false;
+
+ /* Send preliminary HEAD request if --content-disposition and -c are used
+ together. */
+ if (opt.content_disposition && opt.always_rest)
+ send_head_first = true;
+
+#ifdef HAVE_METALINK
+ if (opt.metalink_over_http)
+ {
+ *dt |= METALINK_METADATA;
+ send_head_first = true;
+ }
+#endif
+
+ if (opt.timestamping)
+ {
+ /* Use conditional get request if requested
+ * and if timestamp is known at this moment. */
+ if (opt.if_modified_since && !send_head_first && got_name && file_exists_p (hstat.local_file, NULL))
+ {
+ *dt |= IF_MODIFIED_SINCE;
+ {
+ uerr_t timestamp_err = set_file_timestamp (&hstat);
+ if (timestamp_err != RETROK)
+ return timestamp_err;
+ }
+ }
+ /* Send preliminary HEAD request if -N is given and we have existing
+ * destination file or content disposition is enabled. */
+ else if (opt.content_disposition || file_exists_p (hstat.local_file, NULL))
+ send_head_first = true;
+ }
+
+ /* THE loop */
+ do
+ {
+ /* Increment the pass counter. */
+ ++count;
+ sleep_between_retrievals (count);
+
+ /* Get the current time string. */
+ tms = datetime_str (time (NULL));
+
+ if (opt.spider && !got_head)
+ logprintf (LOG_VERBOSE,
+ _("Spider mode enabled. Check if remote file exists.\n"));
+
+ /* Print fetch message, if opt.verbose. */
+ if (opt.verbose)
+ {
+ char *hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
+
+ if (count > 1)
+ {
+ char tmp[256];
+ sprintf (tmp, _("(try:%2d)"), count);
+ logprintf (LOG_NOTQUIET, "--%s-- %s %s\n",
+ tms, tmp, hurl);
+ }
+ else
+ {
+ logprintf (LOG_NOTQUIET, "--%s-- %s\n",
+ tms, hurl);
+ }
+
+#ifdef WINDOWS
+ ws_changetitle (hurl);
+#endif
+ xfree (hurl);
+ }
+
+ /* Default document type is empty. However, if spider mode is
+ on or time-stamping is employed, HEAD_ONLY commands is
+ encoded within *dt. */
+ if (send_head_first && !got_head)
+ *dt |= HEAD_ONLY;
+ else
+ *dt &= ~HEAD_ONLY;
+
+ /* Decide whether or not to restart. */
+ if (force_full_retrieve)
+ hstat.restval = hstat.len;
+ else if (opt.start_pos >= 0)
+ hstat.restval = opt.start_pos;
+ else if (opt.always_rest
+ && got_name
+ && stat (hstat.local_file, &st) == 0
+ && S_ISREG (st.st_mode))
+ /* When -c is used, continue from on-disk size. (Can't use
+ hstat.len even if count>1 because we don't want a failed
+ first attempt to clobber existing data.) */
+ hstat.restval = st.st_size;
+ else if (count > 1)
+ {
+ /* otherwise, continue where the previous try left off */
+ if (hstat.len < hstat.restval)
+ hstat.restval -= hstat.len;
+ else
+ hstat.restval = hstat.len;
+ }
+ else
+ hstat.restval = 0;
+
+ /* Decide whether to send the no-cache directive. We send it in
+ two cases:
+ a) we're using a proxy, and we're past our first retrieval.
+ Some proxies are notorious for caching incomplete data, so
+ we require a fresh get.
+ b) caching is explicitly inhibited. */
+ if ((proxy && count > 1) /* a */
+ || !opt.allow_cache) /* b */
+ *dt |= SEND_NOCACHE;
+ else
+ *dt &= ~SEND_NOCACHE;
+
+ /* Try fetching the document, or at least its head. */
+ err = gethttp (u, original_url, &hstat, dt, proxy, iri, count);
+
+ /* Time? */
+ tms = datetime_str (time (NULL));
+
+ /* Get the new location (with or without the redirection). */
+ if (hstat.newloc)
+ *newloc = xstrdup (hstat.newloc);
+
+ switch (err)
+ {
+ case HERR: case HEOF: case CONSOCKERR:
+ case CONERROR: case READERR: case WRITEFAILED:
+ case RANGEERR: case FOPEN_EXCL_ERR: case GATEWAYTIMEOUT:
+ /* Non-fatal errors continue executing the loop, which will
+ bring them to "while" statement at the end, to judge
+ whether the number of tries was exceeded. */
+ printwhat (count, opt.ntry);
+ continue;
+ case FWRITEERR: case FOPENERR:
+ /* Another fatal error. */
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Cannot write to %s (%s).\n"),
+ quote (hstat.local_file), strerror (errno));
+ ret = err;
+ goto exit;
+ case HOSTERR:
+ /* Fatal unless option set otherwise. */
+ if ( opt.retry_on_host_error )
+ {
+ printwhat (count, opt.ntry);
+ continue;
+ }
+ ret = err;
+ goto exit;
+ case CONIMPOSSIBLE: case PROXERR: case SSLINITFAILED:
+ case CONTNOTSUPPORTED: case VERIFCERTERR: case FILEBADFILE:
+ case UNKNOWNATTR:
+ /* Fatal errors just return from the function. */
+ ret = err;
+ goto exit;
+ case ATTRMISSING:
+ /* A missing attribute in a Header is a fatal Protocol error. */
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Required attribute missing from Header received.\n"));
+ ret = err;
+ goto exit;
+ case AUTHFAILED:
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Username/Password Authentication Failed.\n"));
+ ret = err;
+ goto exit;
+ case WARC_ERR:
+ /* A fatal WARC error. */
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Cannot write to WARC file.\n"));
+ ret = err;
+ goto exit;
+ case WARC_TMP_FOPENERR: case WARC_TMP_FWRITEERR:
+ /* A fatal WARC error. */
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Cannot write to temporary WARC file.\n"));
+ ret = err;
+ goto exit;
+ case CONSSLERR:
+ /* Another fatal error. */
+ logprintf (LOG_NOTQUIET, _("Unable to establish SSL connection.\n"));
+ ret = err;
+ goto exit;
+ case UNLINKERR:
+ /* Another fatal error. */
+ logputs (LOG_VERBOSE, "\n");
+ logprintf (LOG_NOTQUIET, _("Cannot unlink %s (%s).\n"),
+ quote (hstat.local_file), strerror (errno));
+ ret = err;
+ goto exit;
+ case NEWLOCATION:
+ case NEWLOCATION_KEEP_POST:
+ /* Return the new location to the caller. */
+ if (!*newloc)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("ERROR: Redirection (%d) without location.\n"),
+ hstat.statcode);
+ ret = WRONGCODE;
+ }
+ else
+ {
+ ret = err;
+ }
+ goto exit;
+ case RETRUNNEEDED:
+ /* The file was already fully retrieved. */
+ ret = RETROK;
+ goto exit;
+ case RETRFINISHED:
+ /* Deal with you later. */
+ break;
+#ifdef HAVE_METALINK
+ case RETR_WITH_METALINK:
+ {
+ if (hstat.metalink == NULL)
+ {
+ logputs (LOG_NOTQUIET,
+ _("Could not find Metalink data in HTTP response. "
+ "Downloading file using HTTP GET.\n"));
+ *dt &= ~METALINK_METADATA;
+ *dt &= ~HEAD_ONLY;
+ got_head = true;
+ continue;
+ }
+
+ logputs (LOG_VERBOSE,
+ _("Metalink headers found. "
+ "Switching to Metalink mode.\n"));
+
+ ret = retrieve_from_metalink (hstat.metalink);
+ goto exit;
+ }
+ break;
+#endif
+ default:
+ /* All possibilities should have been exhausted. */
+ abort ();
+ }
+
+ if (!(*dt & RETROKF))
+ {
+ char *hurl = NULL;
+ if (!opt.verbose)
+ {
+ /* #### Ugly ugly ugly! */
+ hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
+ logprintf (LOG_NONVERBOSE, "%s:\n", hurl);
+ }
+
+ /* Fall back to GET if HEAD fails with a 500 or 501 error code. */
+ if (*dt & HEAD_ONLY
+ && (hstat.statcode == 500 || hstat.statcode == 501))
+ {
+ got_head = true;
+ xfree (hurl);
+ continue;
+ }
+ /* Maybe we should always keep track of broken links, not just in
+ * spider mode.
+ * Don't log error if it was UTF-8 encoded because we will try
+ * once unencoded. */
+ else if (opt.spider && !iri->utf8_encode)
+ {
+ /* #### Again: ugly ugly ugly! */
+ if (!hurl)
+ hurl = url_string (u, URL_AUTH_HIDE_PASSWD);
+ nonexisting_url (hurl);
+ logprintf (LOG_NOTQUIET, _("\
+Remote file does not exist -- broken link!!!\n"));
+ }
+ else if (check_retry_on_http_error (hstat.statcode))
+ {
+ printwhat (count, opt.ntry);
+ xfree (hurl);
+ continue;
+ }
+ else
+ {
+ logprintf (LOG_NOTQUIET, _("%s ERROR %d: %s.\n"),
+ tms, hstat.statcode,
+ quotearg_style (escape_quoting_style, hstat.error));
+ }
+ logputs (LOG_VERBOSE, "\n");
+ ret = WRONGCODE;
+ xfree (hurl);
+ goto exit;
+ }
+
+ /* Did we get the time-stamp? */
+ if (!got_head || (opt.spider && !opt.recursive))
+ {
+ got_head = true; /* no more time-stamping */
+
+ if (opt.timestamping && !hstat.remote_time)
+ {
+ logputs (LOG_NOTQUIET, _("\
+Last-modified header missing -- time-stamps turned off.\n"));
+ }
+ else if (hstat.remote_time)
+ {
+ /* Convert the date-string into struct tm. */
+ tmr = http_atotm (hstat.remote_time);
+ if (tmr == (time_t) (-1))
+ logputs (LOG_VERBOSE, _("\
+Last-modified header invalid -- time-stamp ignored.\n"));
+ if (*dt & HEAD_ONLY)
+ time_came_from_head = true;
+ }
+
+ if (send_head_first)
+ {
+ /* The time-stamping section. */
+ if (opt.timestamping)
+ {
+ if (hstat.orig_file_name) /* Perform the following
+ checks only if the file
+ we're supposed to
+ download already exists. */
+ {
+ if (hstat.remote_time &&
+ tmr != (time_t) (-1))
+ {
+ /* Now time-stamping can be used validly.
+ Time-stamping means that if the sizes of
+ the local and remote file match, and local
+ file is newer than the remote file, it will
+ not be retrieved. Otherwise, the normal
+ download procedure is resumed. */
+ if (hstat.orig_file_tstamp >= tmr)
+ {
+ if (hstat.contlen == -1
+ || hstat.orig_file_size == hstat.contlen)
+ {
+ logprintf (LOG_VERBOSE, _("\
+Server file no newer than local file %s -- not retrieving.\n\n"),
+ quote (hstat.orig_file_name));
+ ret = RETROK;
+ goto exit;
+ }
+ else
+ {
+ logprintf (LOG_VERBOSE, _("\
+The sizes do not match (local %s) -- retrieving.\n"),
+ number_to_static_string (hstat.orig_file_size));
+ }
+ }
+ else
+ {
+ force_full_retrieve = true;
+ logputs (LOG_VERBOSE,
+ _("Remote file is newer, retrieving.\n"));
+ }
+
+ logputs (LOG_VERBOSE, "\n");
+ }
+ }
+
+ /* free_hstat (&hstat); */
+ hstat.timestamp_checked = true;
+ }
+
+ if (opt.spider)
+ {
+ bool finished = true;
+ if (opt.recursive)
+ {
+ if ((*dt & TEXTHTML) || (*dt & TEXTCSS))
+ {
+ logputs (LOG_VERBOSE, _("\
+Remote file exists and could contain links to other resources -- retrieving.\n\n"));
+ finished = false;
+ }
+ else
+ {
+ logprintf (LOG_VERBOSE, _("\
+Remote file exists but does not contain any link -- not retrieving.\n\n"));
+ ret = RETROK; /* RETRUNNEEDED is not for caller. */
+ }
+ }
+ else
+ {
+ if ((*dt & TEXTHTML) || (*dt & TEXTCSS))
+ {
+ logprintf (LOG_VERBOSE, _("\
+Remote file exists and could contain further links,\n\
+but recursion is disabled -- not retrieving.\n\n"));
+ }
+ else
+ {
+ logprintf (LOG_VERBOSE, _("\
+Remote file exists.\n\n"));
+ }
+ ret = RETROK; /* RETRUNNEEDED is not for caller. */
+ }
+
+ if (finished)
+ {
+ logprintf (LOG_NONVERBOSE,
+ _("%s URL: %s %2d %s\n"),
+ tms, u->url, hstat.statcode,
+ hstat.message ? quotearg_style (escape_quoting_style, hstat.message) : "");
+ goto exit;
+ }
+ }
+
+ got_name = true;
+ *dt &= ~HEAD_ONLY;
+ count = 0; /* the retrieve count for HEAD is reset */
+ continue;
+ } /* send_head_first */
+ } /* !got_head */
+
+ if (opt.useservertimestamps
+ && (tmr != (time_t) (-1))
+ && ((hstat.len == hstat.contlen) ||
+ ((hstat.res == 0) && (hstat.contlen == -1))))
+ {
+ const char *fl = NULL;
+ set_local_file (&fl, hstat.local_file);
+ if (fl)
+ {
+ time_t newtmr = -1;
+ /* Reparse time header, in case it's changed. */
+ if (time_came_from_head
+ && hstat.remote_time && hstat.remote_time[0])
+ {
+ newtmr = http_atotm (hstat.remote_time);
+ if (newtmr != (time_t)-1)
+ tmr = newtmr;
+ }
+ touch (fl, tmr);
+ }
+ }
+ /* End of time-stamping section. */
+
+ tmrate = retr_rate (hstat.rd_size, hstat.dltime);
+ total_download_time += hstat.dltime;
+
+ if (hstat.len == hstat.contlen)
+ {
+ if (*dt & RETROKF || opt.content_on_error)
+ {
+ bool write_to_stdout = (opt.output_document && HYPHENP (opt.output_document));
+
+ logprintf (LOG_VERBOSE,
+ write_to_stdout
+ ? _("%s (%s) - written to stdout %s[%s/%s]\n\n")
+ : _("%s (%s) - %s saved [%s/%s]\n\n"),
+ tms, tmrate,
+ write_to_stdout ? "" : quote (hstat.local_file),
+ number_to_static_string (hstat.len),
+ number_to_static_string (hstat.contlen));
+ logprintf (LOG_NONVERBOSE,
+ "%s URL:%s [%s/%s] -> \"%s\" [%d]\n",
+ tms, u->url,
+ number_to_static_string (hstat.len),
+ number_to_static_string (hstat.contlen),
+ hstat.local_file, count);
+ }
+ ++numurls;
+ total_downloaded_bytes += hstat.rd_size;
+
+ /* Remember that we downloaded the file for later ".orig" code. */
+ if (*dt & ADDED_HTML_EXTENSION)
+ downloaded_file (FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
+ else
+ downloaded_file (FILE_DOWNLOADED_NORMALLY, hstat.local_file);
+
+ ret = RETROK;
+ goto exit;
+ }
+ else if (hstat.res == 0) /* No read error */
+ {
+ if (hstat.contlen == -1) /* We don't know how much we were supposed
+ to get, so assume we succeeded. */
+ {
+ if (*dt & RETROKF || opt.content_on_error)
+ {
+ bool write_to_stdout = (opt.output_document && HYPHENP (opt.output_document));
+
+ logprintf (LOG_VERBOSE,
+ write_to_stdout
+ ? _("%s (%s) - written to stdout %s[%s]\n\n")
+ : _("%s (%s) - %s saved [%s]\n\n"),
+ tms, tmrate,
+ write_to_stdout ? "" : quote (hstat.local_file),
+ number_to_static_string (hstat.len));
+ logprintf (LOG_NONVERBOSE,
+ "%s URL:%s [%s] -> \"%s\" [%d]\n",
+ tms, u->url, number_to_static_string (hstat.len),
+ hstat.local_file, count);
+ }
+ ++numurls;
+ total_downloaded_bytes += hstat.rd_size;
+
+ /* Remember that we downloaded the file for later ".orig" code. */
+ if (*dt & ADDED_HTML_EXTENSION)
+ downloaded_file (FILE_DOWNLOADED_AND_HTML_EXTENSION_ADDED, hstat.local_file);
+ else
+ downloaded_file (FILE_DOWNLOADED_NORMALLY, hstat.local_file);
+
+ ret = RETROK;
+ goto exit;
+ }
+ else if (hstat.len < hstat.contlen) /* meaning we lost the
+ connection too soon */
+ {
+ logprintf (LOG_VERBOSE,
+ _("%s (%s) - Connection closed at byte %s. "),
+ tms, tmrate, number_to_static_string (hstat.len));
+ printwhat (count, opt.ntry);
+ continue;
+ }
+ else if (hstat.len != hstat.restval)
+ /* Getting here would mean reading more data than
+ requested with content-length, which we never do. */
+ abort ();
+ else
+ {
+ /* Getting here probably means that the content-length was
+ * _less_ than the original, local size. We should probably
+ * truncate or re-read, or something. FIXME */
+ ret = RETROK;
+ goto exit;
+ }
+ }
+ else /* from now on hstat.res can only be -1 */
+ {
+ if (hstat.contlen == -1)
+ {
+ logprintf (LOG_VERBOSE,
+ _("%s (%s) - Read error at byte %s (%s)."),
+ tms, tmrate, number_to_static_string (hstat.len),
+ hstat.rderrmsg);
+ printwhat (count, opt.ntry);
+ continue;
+ }
+ else /* hstat.res == -1 and contlen is given */
+ {
+ logprintf (LOG_VERBOSE,
+ _("%s (%s) - Read error at byte %s/%s (%s). "),
+ tms, tmrate,
+ number_to_static_string (hstat.len),
+ number_to_static_string (hstat.contlen),
+ hstat.rderrmsg);
+ printwhat (count, opt.ntry);
+ continue;
+ }
+ }
+ /* not reached */
+ }
+ while (!opt.ntry || (count < opt.ntry));
+
+exit:
+ if ((ret == RETROK || opt.content_on_error) && local_file)
+ {
+ xfree (*local_file);
+ /* Bugfix: Prevent SIGSEGV when hstat.local_file was left NULL
+ (i.e. due to opt.content_disposition). */
+ if (hstat.local_file)
+ {
+ *local_file = hstat.local_file;
+ hstat.local_file = NULL;
+ }
+ }
+ free_hstat (&hstat);
+
+ return ret;
+}
+
+/* Check whether the result of strptime() indicates success.
+ strptime() returns the pointer to how far it got to in the string.
+ The processing has been successful if the string is at `GMT' or
+ `+X', or at the end of the string.
+
+ In extended regexp parlance, the function returns 1 if P matches
+ "^ *(GMT|[+-][0-9]|$)", 0 otherwise. P being NULL (which strptime
+ can return) is considered a failure and 0 is returned. */
+static bool
+check_end (const char *p)
+{
+ if (!p)
+ return false;
+ while (c_isspace (*p))
+ ++p;
+ if (!*p
+ || (p[0] == 'G' && p[1] == 'M' && p[2] == 'T')
+ || ((p[0] == '+' || p[0] == '-') && c_isdigit (p[1])))
+ return true;
+ else
+ return false;
+}
+
+/* Convert the textual specification of time in TIME_STRING to the
+ number of seconds since the Epoch.
+
+ TIME_STRING can be in any of the three formats RFC2616 allows the
+ HTTP servers to emit -- RFC1123-date, RFC850-date or asctime-date,
+ as well as the time format used in the Set-Cookie header.
+ Timezones are ignored, and should be GMT.
+
+ Return the computed time_t representation, or -1 if the conversion
+ fails.
+
+ This function uses strptime with various string formats for parsing
+ TIME_STRING. This results in a parser that is not as lenient in
+ interpreting TIME_STRING as I would like it to be. Being based on
+ strptime, it always allows shortened months, one-digit days, etc.,
+ but due to the multitude of formats in which time can be
+ represented, an ideal HTTP time parser would be even more
+ forgiving. It should completely ignore things like week days and
+ concentrate only on the various forms of representing years,
+ months, days, hours, minutes, and seconds. For example, it would
+ be nice if it accepted ISO 8601 out of the box.
+
+ I've investigated free and PD code for this purpose, but none was
+ usable. getdate was big and unwieldy, and had potential copyright
+ issues, or so I was informed. Dr. Marcus Hennecke's atotm(),
+ distributed with phttpd, is excellent, but we cannot use it because
+ it is not assigned to the FSF. So I stuck it with strptime. */
+
+time_t
+http_atotm (const char *time_string)
+{
+ /* NOTE: Solaris strptime man page claims that %n and %t match white
+ space, but that's not universally available. Instead, we simply
+ use ` ' to mean "skip all WS", which works under all strptime
+ implementations I've tested. */
+
+ static const char *time_formats[] = {
+ "%a, %d %b %Y %T", /* rfc1123: Thu, 29 Jan 1998 22:12:57 */
+ "%A, %d-%b-%y %T", /* rfc850: Thursday, 29-Jan-98 22:12:57 */
+ "%a %b %d %T %Y", /* asctime: Thu Jan 29 22:12:57 1998 */
+ "%a, %d-%b-%Y %T" /* cookies: Thu, 29-Jan-1998 22:12:57
+ (used in Set-Cookie, defined in the
+ Netscape cookie specification.) */
+ };
+ const char *oldlocale;
+ char savedlocale[256];
+ size_t i;
+ time_t ret = (time_t) -1;
+
+ /* Solaris strptime fails to recognize English month names in
+ non-English locales, which we work around by temporarily setting
+ locale to C before invoking strptime. */
+ oldlocale = setlocale (LC_TIME, NULL);
+ if (oldlocale)
+ {
+ size_t l = strlen (oldlocale) + 1;
+ if (l >= sizeof savedlocale)
+ savedlocale[0] = '\0';
+ else
+ memcpy (savedlocale, oldlocale, l);
+ }
+ else savedlocale[0] = '\0';
+
+ setlocale (LC_TIME, "C");
+
+ for (i = 0; i < countof (time_formats); i++)
+ {
+ struct tm t;
+
+ /* Some versions of strptime use the existing contents of struct
+ tm to recalculate the date according to format. Zero it out
+ to prevent stack garbage from influencing strptime. */
+ xzero (t);
+
+ if (check_end (strptime (time_string, time_formats[i], &t)))
+ {
+ ret = timegm (&t);
+ break;
+ }
+ }
+
+ /* Restore the previous locale. */
+ if (savedlocale[0])
+ setlocale (LC_TIME, savedlocale);
+
+ return ret;
+}
+
+/* Authorization support: We support three authorization schemes:
+
+ * `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
+
+ * `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
+ consisting of answering to the server's challenge with the proper
+ MD5 digests.
+
+ * `NTLM' ("NT Lan Manager") scheme, based on code written by Daniel
+ Stenberg for libcurl. Like digest, NTLM is based on a
+ challenge-response mechanism, but unlike digest, it is non-standard
+ (authenticates TCP connections rather than requests), undocumented
+ and Microsoft-specific. */
+
+/* Create the authentication header contents for the `Basic' scheme.
+ This is done by encoding the string "USER:PASS" to base64 and
+ prepending the string "Basic " in front of it. */
+
+static char *
+basic_authentication_encode (const char *user, const char *passwd)
+{
+ char buf_t1[256], buf_t2[256];
+ char *t1, *t2, *ret;
+ size_t len1 = strlen (user) + 1 + strlen (passwd);
+
+ if (len1 < sizeof (buf_t1))
+ t1 = buf_t1;
+ else
+ t1 = xmalloc(len1 + 1);
+
+ if (BASE64_LENGTH (len1) < sizeof (buf_t2))
+ t2 = buf_t2;
+ else
+ t2 = xmalloc (BASE64_LENGTH (len1) + 1);
+
+ sprintf (t1, "%s:%s", user, passwd);
+ wget_base64_encode (t1, len1, t2);
+
+ ret = concat_strings ("Basic ", t2, (char *) 0);
+
+ if (t2 != buf_t2)
+ xfree (t2);
+
+ if (t1 != buf_t1)
+ xfree (t1);
+
+ return ret;
+}
+
+#define SKIP_WS(x) do { \
+ while (c_isspace (*(x))) \
+ ++(x); \
+} while (0)
+
+#ifdef ENABLE_DIGEST
+/* Dump the hexadecimal representation of HASH to BUF. HASH should be
+ an array of 16 bytes containing the hash keys, and BUF should be a
+ buffer of 33 writable characters (32 for hex digits plus one for
+ zero termination). */
+static void
+dump_hash (char *buf, const unsigned char *hash)
+{
+ int i;
+
+ for (i = 0; i < MD5_DIGEST_SIZE; i++, hash++)
+ {
+ *buf++ = XNUM_TO_digit (*hash >> 4);
+ *buf++ = XNUM_TO_digit (*hash & 0xf);
+ }
+ *buf = '\0';
+}
+
+/* Take the line apart to find the challenge, and compose a digest
+ authorization header. See RFC2069 section 2.1.2. */
+static char *
+digest_authentication_encode (const char *au, const char *user,
+ const char *passwd, const char *method,
+ const char *path, uerr_t *auth_err)
+{
+ static char *realm, *opaque, *nonce, *qop, *algorithm;
+ static struct {
+ const char *name;
+ char **variable;
+ } options[] = {
+ { "realm", &realm },
+ { "opaque", &opaque },
+ { "nonce", &nonce },
+ { "qop", &qop },
+ { "algorithm", &algorithm }
+ };
+ char cnonce[16] = "";
+ char *res = NULL;
+ int res_len;
+ size_t res_size;
+ param_token name, value;
+
+
+ realm = opaque = nonce = algorithm = qop = NULL;
+
+ au += 6; /* skip over `Digest' */
+ while (extract_param (&au, &name, &value, ',', NULL))
+ {
+ size_t i;
+ size_t namelen = name.e - name.b;
+ for (i = 0; i < countof (options); i++)
+ if (namelen == strlen (options[i].name)
+ && 0 == strncmp (name.b, options[i].name,
+ namelen))
+ {
+ *options[i].variable = strdupdelim (value.b, value.e);
+ break;
+ }
+ }
+
+ if (qop && strcmp (qop, "auth"))
+ {
+ logprintf (LOG_NOTQUIET, _("Unsupported quality of protection '%s'.\n"), qop);
+ xfree (qop); /* force freeing mem and continue */
+ }
+ else if (algorithm && strcmp (algorithm,"MD5") && strcmp (algorithm,"MD5-sess"))
+ {
+ logprintf (LOG_NOTQUIET, _("Unsupported algorithm '%s'.\n"), algorithm);
+ xfree (algorithm); /* force freeing mem and continue */
+ }
+
+ if (!realm || !nonce || !user || !passwd || !path || !method)
+ {
+ *auth_err = ATTRMISSING;
+ goto cleanup;
+ }
+
+ /* Calculate the digest value. */
+ {
+ struct md5_ctx ctx;
+ unsigned char hash[MD5_DIGEST_SIZE];
+ char a1buf[MD5_DIGEST_SIZE * 2 + 1], a2buf[MD5_DIGEST_SIZE * 2 + 1];
+ char response_digest[MD5_DIGEST_SIZE * 2 + 1];
+
+ /* A1BUF = H(user ":" realm ":" password) */
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((unsigned char *)user, strlen (user), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)realm, strlen (realm), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)passwd, strlen (passwd), &ctx);
+ md5_finish_ctx (&ctx, hash);
+
+ dump_hash (a1buf, hash);
+
+ if (algorithm && !strcmp (algorithm, "MD5-sess"))
+ {
+ /* A1BUF = H( H(user ":" realm ":" password) ":" nonce ":" cnonce ) */
+ snprintf (cnonce, sizeof (cnonce), "%08x",
+ (unsigned) random_number (INT_MAX));
+
+ md5_init_ctx (&ctx);
+ /* md5_process_bytes (hash, MD5_DIGEST_SIZE, &ctx); */
+ md5_process_bytes (a1buf, MD5_DIGEST_SIZE * 2, &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)nonce, strlen (nonce), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)cnonce, strlen (cnonce), &ctx);
+ md5_finish_ctx (&ctx, hash);
+
+ dump_hash (a1buf, hash);
+ }
+
+ /* A2BUF = H(method ":" path) */
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((unsigned char *)method, strlen (method), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)path, strlen (path), &ctx);
+ md5_finish_ctx (&ctx, hash);
+ dump_hash (a2buf, hash);
+
+ if (qop && !strcmp (qop, "auth"))
+ {
+ /* RFC 2617 Digest Access Authentication */
+ /* generate random hex string */
+ if (!*cnonce)
+ snprintf (cnonce, sizeof (cnonce), "%08x",
+ (unsigned) random_number (INT_MAX));
+
+ /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" noncecount ":" clientnonce ":" qop ": " A2BUF) */
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((unsigned char *)a1buf, MD5_DIGEST_SIZE * 2, &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)nonce, strlen (nonce), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)"00000001", 8, &ctx); /* TODO: keep track of server nonce values */
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)cnonce, strlen (cnonce), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)qop, strlen (qop), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)a2buf, MD5_DIGEST_SIZE * 2, &ctx);
+ md5_finish_ctx (&ctx, hash);
+ }
+ else
+ {
+ /* RFC 2069 Digest Access Authentication */
+ /* RESPONSE_DIGEST = H(A1BUF ":" nonce ":" A2BUF) */
+ md5_init_ctx (&ctx);
+ md5_process_bytes ((unsigned char *)a1buf, MD5_DIGEST_SIZE * 2, &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)nonce, strlen (nonce), &ctx);
+ md5_process_bytes ((unsigned char *)":", 1, &ctx);
+ md5_process_bytes ((unsigned char *)a2buf, MD5_DIGEST_SIZE * 2, &ctx);
+ md5_finish_ctx (&ctx, hash);
+ }
+
+ dump_hash (response_digest, hash);
+
+ res_size = strlen (user)
+ + strlen (realm)
+ + strlen (nonce)
+ + strlen (path)
+ + 2 * MD5_DIGEST_SIZE /*strlen (response_digest)*/
+ + (opaque ? strlen (opaque) : 0)
+ + (algorithm ? strlen (algorithm) : 0)
+ + (qop ? 128: 0)
+ + strlen (cnonce)
+ + 128;
+
+ res = xmalloc (res_size);
+
+ if (qop && !strcmp (qop, "auth"))
+ {
+ res_len = snprintf (res, res_size, "Digest "\
+ "username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\""\
+ ", qop=auth, nc=00000001, cnonce=\"%s\"",
+ user, realm, nonce, path, response_digest, cnonce);
+
+ }
+ else
+ {
+ res_len = snprintf (res, res_size, "Digest "\
+ "username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
+ user, realm, nonce, path, response_digest);
+ }
+
+ if (opaque)
+ {
+ res_len += snprintf (res + res_len, res_size - res_len, ", opaque=\"%s\"", opaque);
+ }
+
+ if (algorithm)
+ {
+ snprintf (res + res_len, res_size - res_len, ", algorithm=\"%s\"", algorithm);
+ }
+ }
+
+cleanup:
+ xfree (realm);
+ xfree (opaque);
+ xfree (nonce);
+ xfree (qop);
+ xfree (algorithm);
+
+ return res;
+}
+#endif /* ENABLE_DIGEST */
+
+/* Computing the size of a string literal must take into account that
+ value returned by sizeof includes the terminating \0. */
+#define STRSIZE(literal) (sizeof (literal) - 1)
+
+/* Whether chars in [b, e) begin with the literal string provided as
+ first argument and are followed by whitespace or terminating \0.
+ The comparison is case-insensitive. */
+#define STARTS(literal, b, e) \
+ ((e > b) \
+ && ((size_t) ((e) - (b))) >= STRSIZE (literal) \
+ && 0 == c_strncasecmp (b, literal, STRSIZE (literal)) \
+ && ((size_t) ((e) - (b)) == STRSIZE (literal) \
+ || c_isspace (b[STRSIZE (literal)])))
+
+static bool
+known_authentication_scheme_p (const char *hdrbeg, const char *hdrend)
+{
+ return STARTS ("Basic", hdrbeg, hdrend)
+#ifdef ENABLE_DIGEST
+ || STARTS ("Digest", hdrbeg, hdrend)
+#endif
+#ifdef ENABLE_NTLM
+ || STARTS ("NTLM", hdrbeg, hdrend)
+#endif
+ ;
+}
+
+#undef STARTS
+
+/* Create the HTTP authorization request header. When the
+ `WWW-Authenticate' response header is seen, according to the
+ authorization scheme specified in that header (`Basic' and `Digest'
+ are supported by the current implementation), produce an
+ appropriate HTTP authorization request header. */
+static char *
+create_authorization_line (const char *au, const char *user,
+ const char *passwd, const char *method,
+ const char *path, bool *finished, uerr_t *auth_err)
+{
+ /* We are called only with known schemes, so we can dispatch on the
+ first letter. */
+ switch (c_toupper (*au))
+ {
+ case 'B': /* Basic */
+ *finished = true;
+ return basic_authentication_encode (user, passwd);
+#ifdef ENABLE_DIGEST
+ case 'D': /* Digest */
+ *finished = true;
+ return digest_authentication_encode (au, user, passwd, method, path, auth_err);
+#endif
+#ifdef ENABLE_NTLM
+ case 'N': /* NTLM */
+ if (!ntlm_input (&pconn.ntlm, au))
+ {
+ *finished = true;
+ return NULL;
+ }
+ return ntlm_output (&pconn.ntlm, user, passwd, finished);
+#endif
+ default:
+ /* We shouldn't get here -- this function should be only called
+ with values approved by known_authentication_scheme_p. */
+ abort ();
+ }
+}
+
+static void
+load_cookies (void)
+{
+ if (!wget_cookie_jar)
+ wget_cookie_jar = cookie_jar_new ();
+ if (opt.cookies_input && !cookies_loaded_p)
+ {
+ cookie_jar_load (wget_cookie_jar, opt.cookies_input);
+ cookies_loaded_p = true;
+ }
+}
+
+void
+save_cookies (void)
+{
+ if (wget_cookie_jar)
+ cookie_jar_save (wget_cookie_jar, opt.cookies_output);
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+http_cleanup (void)
+{
+ if (pconn_active)
+ invalidate_persistent ();
+
+ if (wget_cookie_jar)
+ {
+ cookie_jar_delete (wget_cookie_jar);
+ wget_cookie_jar = NULL;
+ }
+
+ if (basic_authed_hosts)
+ {
+ hash_table_iterator iter;
+ for (hash_table_iterate (basic_authed_hosts, &iter); hash_table_iter_next (&iter); )
+ {
+ xfree (iter.key);
+ }
+ hash_table_destroy (basic_authed_hosts);
+ basic_authed_hosts = NULL;
+ }
+}
+#endif
+
+void
+ensure_extension (struct http_stat *hs, const char *ext, int *dt)
+{
+ char *last_period_in_local_filename = strrchr (hs->local_file, '.');
+ char shortext[8];
+ int len;
+ shortext[0] = '\0';
+ len = strlen (ext);
+ if (len == 5)
+ {
+ memcpy (shortext, ext, len - 1);
+ shortext[len - 1] = '\0';
+ }
+
+ if (last_period_in_local_filename == NULL
+ || !(0 == strcasecmp (last_period_in_local_filename, shortext)
+ || 0 == strcasecmp (last_period_in_local_filename, ext)))
+ {
+ int local_filename_len = strlen (hs->local_file);
+ /* Resize the local file, allowing for ".html" preceded by
+ optional ".NUMBER". */
+ hs->local_file = xrealloc (hs->local_file,
+ local_filename_len + 24 + len);
+ strcpy (hs->local_file + local_filename_len, ext);
+ /* If clobbering is not allowed and the file, as named,
+ exists, tack on ".NUMBER.html" instead. */
+ if (!ALLOW_CLOBBER && file_exists_p (hs->local_file, NULL))
+ {
+ int ext_num = 1;
+ do
+ sprintf (hs->local_file + local_filename_len,
+ ".%d%s", ext_num++, ext);
+ while (file_exists_p (hs->local_file, NULL));
+ }
+ *dt |= ADDED_HTML_EXTENSION;
+ }
+}
+
+#ifdef TESTING
+
+const char *
+test_parse_range_header (void)
+{
+ unsigned i;
+ static const struct {
+ const char * rangehdr;
+ const wgint firstbyte;
+ const wgint lastbyte;
+ const wgint length;
+ const bool shouldPass;
+ } test_array[] = {
+ { "bytes 0-1000/1000", 0, 1000, 1000, false },
+ { "bytes 0-999/1000", 0, 999, 1000, true },
+ { "bytes 100-99/1000", 100, 99, 1000, false },
+ { "bytes 100-100/1000", 100, 100, 1000, true },
+ { "bytes 0-1000/100000000", 0, 1000, 100000000, true },
+ { "bytes 1-999/1000", 1, 999, 1000, true },
+ { "bytes 42-1233/1234", 42, 1233, 1234, true },
+ { "bytes 42-1233/*", 42, 1233, -1, true },
+ { "bytes 0-2147483648/2147483649", 0, 2147483648U, 2147483649U, true },
+ { "bytes 2147483648-4294967296/4294967297", 2147483648U, 4294967296ULL, 4294967297ULL, true },
+ };
+
+ wgint firstbyteptr[sizeof(wgint)];
+ wgint lastbyteptr[sizeof(wgint)];
+ wgint lengthptr[sizeof(wgint)];
+ bool result;
+ for (i = 0; i < countof (test_array); i++)
+ {
+ result = parse_content_range (test_array[i].rangehdr, firstbyteptr, lastbyteptr, lengthptr);
+#if 0
+ printf ("%ld %ld\n", test_array[i].firstbyte, *firstbyteptr);
+ printf ("%ld %ld\n", test_array[i].lastbyte, *lastbyteptr);
+ printf ("%ld %ld\n", test_array[i].length, *lengthptr);
+ printf ("\n");
+#endif
+ mu_assert ("test_parse_range_header: False Negative", result == test_array[i].shouldPass);
+ mu_assert ("test_parse_range_header: Bad parse", test_array[i].firstbyte == *firstbyteptr &&
+ test_array[i].lastbyte == *lastbyteptr &&
+ test_array[i].length == *lengthptr);
+ }
+
+ return NULL;
+}
+
+const char *
+test_parse_content_disposition (void)
+{
+ unsigned i;
+ static const struct {
+ const char *hdrval;
+ const char *filename;
+ bool result;
+ } test_array[] = {
+ { "filename=\"file.ext\"", "file.ext", true },
+ { "attachment; filename=\"file.ext\"", "file.ext", true },
+ { "attachment; filename=\"file.ext\"; dummy", "file.ext", true },
+ { "attachment", NULL, false },
+ { "attachment; filename*=UTF-8'en-US'hello.txt", "hello.txt", true },
+ { "attachment; filename*0=\"hello\"; filename*1=\"world.txt\"",
+ "helloworld.txt", true },
+ { "attachment; filename=\"A.ext\"; filename*=\"B.ext\"", "B.ext", true },
+ { "attachment; filename*=\"A.ext\"; filename*0=\"B\"; filename*1=\"B.ext\"",
+ "A.ext", true },
+ { "filename**0=\"A\"; filename**1=\"A.ext\"; filename*0=\"B\";\
+filename*1=\"B\"", "AA.ext", true },
+ };
+
+ for (i = 0; i < countof (test_array); ++i)
+ {
+ char *filename;
+ bool res;
+
+ res = parse_content_disposition (test_array[i].hdrval, &filename);
+
+ mu_assert ("test_parse_content_disposition: wrong result",
+ res == test_array[i].result
+ && (res == false
+ || 0 == strcmp (test_array[i].filename, filename)));
+ xfree (filename);
+ }
+
+ return NULL;
+}
+
+#endif /* TESTING */
+
+/*
+ * vim: et sts=2 sw=2 cino+={s
+ */
diff --git a/src/http.h b/src/http.h
new file mode 100644
index 0000000..5eac0da
--- /dev/null
+++ b/src/http.h
@@ -0,0 +1,51 @@
+/* Declarations for HTTP.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef HTTP_H
+#define HTTP_H
+
+#include "hsts.h"
+
+struct url;
+
+uerr_t http_loop (const struct url *, struct url *, char **, char **, const char *,
+ int *, struct url *, struct iri *);
+void save_cookies (void);
+void http_cleanup (void);
+time_t http_atotm (const char *);
+
+typedef struct {
+ /* A token consists of characters in the [b, e) range. */
+ const char *b, *e;
+} param_token;
+bool extract_param (const char **, param_token *, param_token *, char, bool *);
+
+
+#endif /* HTTP_H */
diff --git a/src/init.c b/src/init.c
new file mode 100644
index 0000000..aa526de
--- /dev/null
+++ b/src/init.c
@@ -0,0 +1,2135 @@
+/* Reading/parsing the initialization file.
+ Copyright (C) 1996-2012, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+#include "exits.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+/* not all systems provide PATH_MAX in limits.h */
+#ifndef PATH_MAX
+# include <sys/param.h>
+# ifndef PATH_MAX
+# define PATH_MAX MAXPATHLEN
+# endif
+#endif
+
+#include <regex.h>
+
+#ifdef HAVE_PWD_H
+# include <pwd.h>
+#endif
+#include <assert.h>
+
+#include "utils.h"
+#include "init.h"
+#include "host.h"
+#include "netrc.h"
+#include "progress.h"
+#include "connect.h" /* for connect_cleanup */
+#include "ssl.h" /* for ssl_cleanup */
+#include "recur.h" /* for INFINITE_RECURSION */
+#include "convert.h" /* for convert_cleanup */
+#include "res.h" /* for res_cleanup */
+#include "http.h" /* for http_cleanup */
+#include "retr.h" /* for output_stream */
+#include "warc.h" /* for warc_close */
+#include "spider.h" /* for spider_cleanup */
+#include "html-url.h" /* for cleanup_html_url */
+#include "ptimer.h" /* for ptimer_destroy */
+#include "c-strcase.h"
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+
+
+#define CMD_DECLARE(func) static bool func (const char *, const char *, void *)
+
+CMD_DECLARE (cmd_boolean);
+CMD_DECLARE (cmd_bytes);
+CMD_DECLARE (cmd_bytes_sum);
+#ifdef HAVE_SSL
+CMD_DECLARE (cmd_cert_type);
+#endif
+CMD_DECLARE (cmd_directory_vector);
+CMD_DECLARE (cmd_number);
+CMD_DECLARE (cmd_number_inf);
+CMD_DECLARE (cmd_string);
+CMD_DECLARE (cmd_string_uppercase);
+CMD_DECLARE (cmd_file);
+CMD_DECLARE (cmd_file_once);
+CMD_DECLARE (cmd_directory);
+CMD_DECLARE (cmd_time);
+CMD_DECLARE (cmd_vector);
+
+CMD_DECLARE (cmd_use_askpass);
+
+#ifdef HAVE_LIBZ
+CMD_DECLARE (cmd_spec_compression);
+#endif
+CMD_DECLARE (cmd_spec_dirstruct);
+CMD_DECLARE (cmd_spec_header);
+CMD_DECLARE (cmd_spec_warc_header);
+CMD_DECLARE (cmd_spec_htmlify);
+CMD_DECLARE (cmd_spec_mirror);
+CMD_DECLARE (cmd_spec_prefer_family);
+CMD_DECLARE (cmd_spec_progress);
+CMD_DECLARE (cmd_spec_progressdisp);
+CMD_DECLARE (cmd_spec_recursive);
+CMD_DECLARE (cmd_spec_regex_type);
+CMD_DECLARE (cmd_spec_restrict_file_names);
+CMD_DECLARE (cmd_spec_report_speed);
+#ifdef HAVE_SSL
+CMD_DECLARE (cmd_spec_secure_protocol);
+#endif
+CMD_DECLARE (cmd_spec_timeout);
+CMD_DECLARE (cmd_spec_useragent);
+CMD_DECLARE (cmd_spec_verbose);
+CMD_DECLARE (cmd_check_cert);
+
+/* List of recognized commands, each consisting of name, place and
+ function. When adding a new command, simply add it to the list,
+ but be sure to keep the list sorted alphabetically, as
+ command_by_name's binary search depends on it. Also, be sure to
+ add any entries that allocate memory (e.g. cmd_string and
+ cmd_vector) to the cleanup() function below. */
+
+static const struct {
+ const char *name;
+ void *place;
+ bool (*action) (const char *, const char *, void *);
+} commands[] = {
+ /* KEEP THIS LIST ALPHABETICALLY SORTED */
+ { "accept", &opt.accepts, cmd_vector },
+ { "acceptregex", &opt.acceptregex_s, cmd_string },
+ { "addhostdir", &opt.add_hostdir, cmd_boolean },
+ { "adjustextension", &opt.adjust_extension, cmd_boolean },
+ { "alwaysrest", &opt.always_rest, cmd_boolean }, /* deprecated */
+ { "askpassword", &opt.ask_passwd, cmd_boolean },
+ { "authnochallenge", &opt.auth_without_challenge,
+ cmd_boolean },
+ { "background", &opt.background, cmd_boolean },
+ { "backupconverted", &opt.backup_converted, cmd_boolean },
+ { "backups", &opt.backups, cmd_number },
+ { "base", &opt.base_href, cmd_string },
+ { "bindaddress", &opt.bind_address, cmd_string },
+#ifdef HAVE_LIBCARES
+ { "binddnsaddress", &opt.bind_dns_address, cmd_string },
+#endif
+ { "bodydata", &opt.body_data, cmd_string },
+ { "bodyfile", &opt.body_file, cmd_string },
+#ifdef HAVE_SSL
+ { "cacertificate", &opt.ca_cert, cmd_file },
+#endif
+ { "cache", &opt.allow_cache, cmd_boolean },
+#ifdef HAVE_SSL
+ { "cadirectory", &opt.ca_directory, cmd_directory },
+ { "certificate", &opt.cert_file, cmd_file },
+ { "certificatetype", &opt.cert_type, cmd_cert_type },
+ { "checkcertificate", &opt.check_cert, cmd_check_cert },
+#endif
+ { "chooseconfig", &opt.choose_config, cmd_file },
+#ifdef HAVE_SSL
+ { "ciphers", &opt.tls_ciphers_string, cmd_string },
+#endif
+#ifdef HAVE_LIBZ
+ { "compression", &opt.compression, cmd_spec_compression },
+#endif
+ { "connecttimeout", &opt.connect_timeout, cmd_time },
+ { "contentdisposition", &opt.content_disposition, cmd_boolean },
+ { "contentonerror", &opt.content_on_error, cmd_boolean },
+ { "continue", &opt.always_rest, cmd_boolean },
+ { "convertfileonly", &opt.convert_file_only, cmd_boolean },
+ { "convertlinks", &opt.convert_links, cmd_boolean },
+ { "cookies", &opt.cookies, cmd_boolean },
+#ifdef HAVE_SSL
+ { "crlfile", &opt.crl_file, cmd_file_once },
+#endif
+ { "cutdirs", &opt.cut_dirs, cmd_number },
+ { "debug", &opt.debug, cmd_boolean },
+ { "defaultpage", &opt.default_page, cmd_string },
+ { "deleteafter", &opt.delete_after, cmd_boolean },
+ { "dirprefix", &opt.dir_prefix, cmd_directory },
+ { "dirstruct", NULL, cmd_spec_dirstruct },
+ { "dnscache", &opt.dns_cache, cmd_boolean },
+#ifdef HAVE_LIBCARES
+ { "dnsservers", &opt.dns_servers, cmd_string },
+#endif
+ { "dnstimeout", &opt.dns_timeout, cmd_time },
+ { "domains", &opt.domains, cmd_vector },
+ { "dotbytes", &opt.dot_bytes, cmd_bytes },
+ { "dotsinline", &opt.dots_in_line, cmd_number },
+ { "dotspacing", &opt.dot_spacing, cmd_number },
+ { "dotstyle", &opt.dot_style, cmd_string }, /* deprecated */
+#ifdef HAVE_SSL
+ { "egdfile", &opt.egd_file, cmd_file },
+#endif
+ { "excludedirectories", &opt.excludes, cmd_directory_vector },
+ { "excludedomains", &opt.exclude_domains, cmd_vector },
+ { "followftp", &opt.follow_ftp, cmd_boolean },
+ { "followtags", &opt.follow_tags, cmd_vector },
+ { "forcehtml", &opt.force_html, cmd_boolean },
+ { "ftppasswd", &opt.ftp_passwd, cmd_string }, /* deprecated */
+ { "ftppassword", &opt.ftp_passwd, cmd_string },
+ { "ftpproxy", &opt.ftp_proxy, cmd_string },
+#ifdef HAVE_SSL
+ { "ftpscleardataconnection", &opt.ftps_clear_data_connection, cmd_boolean },
+ { "ftpsfallbacktoftp", &opt.ftps_fallback_to_ftp, cmd_boolean },
+ { "ftpsimplicit", &opt.ftps_implicit, cmd_boolean },
+ { "ftpsresumessl", &opt.ftps_resume_ssl, cmd_boolean },
+#endif
+#ifdef __VMS
+ { "ftpstmlf", &opt.ftp_stmlf, cmd_boolean },
+#endif /* def __VMS */
+ { "ftpuser", &opt.ftp_user, cmd_string },
+ { "glob", &opt.ftp_glob, cmd_boolean },
+ { "header", NULL, cmd_spec_header },
+#ifdef HAVE_HSTS
+ { "hsts", &opt.hsts, cmd_boolean },
+ { "hstsfile", &opt.hsts_file, cmd_file },
+#endif
+ { "htmlextension", &opt.adjust_extension, cmd_boolean }, /* deprecated */
+ { "htmlify", NULL, cmd_spec_htmlify },
+ { "httpkeepalive", &opt.http_keep_alive, cmd_boolean },
+ { "httppasswd", &opt.http_passwd, cmd_string }, /* deprecated */
+ { "httppassword", &opt.http_passwd, cmd_string },
+ { "httpproxy", &opt.http_proxy, cmd_string },
+#ifdef HAVE_SSL
+ { "httpsonly", &opt.https_only, cmd_boolean },
+#endif
+ { "httpsproxy", &opt.https_proxy, cmd_string },
+ { "httpuser", &opt.http_user, cmd_string },
+ { "ifmodifiedsince", &opt.if_modified_since, cmd_boolean },
+ { "ignorecase", &opt.ignore_case, cmd_boolean },
+ { "ignorelength", &opt.ignore_length, cmd_boolean },
+ { "ignoretags", &opt.ignore_tags, cmd_vector },
+ { "includedirectories", &opt.includes, cmd_directory_vector },
+#ifdef ENABLE_IPV6
+ { "inet4only", &opt.ipv4_only, cmd_boolean },
+ { "inet6only", &opt.ipv6_only, cmd_boolean },
+#endif
+ { "input", &opt.input_filename, cmd_file },
+#ifdef HAVE_METALINK
+ { "inputmetalink", &opt.input_metalink, cmd_file },
+#endif
+ { "iri", &opt.enable_iri, cmd_boolean },
+ { "keepbadhash", &opt.keep_badhash, cmd_boolean },
+ { "keepsessioncookies", &opt.keep_session_cookies, cmd_boolean },
+ { "limitrate", &opt.limit_rate, cmd_bytes },
+ { "loadcookies", &opt.cookies_input, cmd_file },
+ { "localencoding", &opt.locale, cmd_string },
+ { "logfile", &opt.lfilename, cmd_file },
+ { "login", &opt.ftp_user, cmd_string },/* deprecated*/
+ { "maxredirect", &opt.max_redirect, cmd_number },
+#ifdef HAVE_METALINK
+ { "metalinkindex", &opt.metalink_index, cmd_number_inf },
+ { "metalinkoverhttp", &opt.metalink_over_http, cmd_boolean },
+#endif
+ { "method", &opt.method, cmd_string_uppercase },
+ { "mirror", NULL, cmd_spec_mirror },
+ { "netrc", &opt.netrc, cmd_boolean },
+ { "noclobber", &opt.noclobber, cmd_boolean },
+ { "noconfig", &opt.noconfig, cmd_boolean },
+ { "noparent", &opt.no_parent, cmd_boolean },
+ { "noproxy", &opt.no_proxy, cmd_vector },
+ { "numtries", &opt.ntry, cmd_number_inf },/* deprecated*/
+ { "outputdocument", &opt.output_document, cmd_file },
+ { "pagerequisites", &opt.page_requisites, cmd_boolean },
+ { "passiveftp", &opt.ftp_pasv, cmd_boolean },
+ { "passwd", &opt.ftp_passwd, cmd_string },/* deprecated*/
+ { "password", &opt.passwd, cmd_string },
+#ifdef HAVE_SSL
+ { "pinnedpubkey", &opt.pinnedpubkey, cmd_string },
+#endif
+ { "postdata", &opt.post_data, cmd_string },
+ { "postfile", &opt.post_file_name, cmd_file },
+ { "preferfamily", NULL, cmd_spec_prefer_family },
+#ifdef HAVE_METALINK
+ { "preferredlocation", &opt.preferred_location, cmd_string },
+#endif
+ { "preservepermissions", &opt.preserve_perm, cmd_boolean },
+#ifdef HAVE_SSL
+ { "privatekey", &opt.private_key, cmd_file },
+ { "privatekeytype", &opt.private_key_type, cmd_cert_type },
+#endif
+ { "progress", &opt.progress_type, cmd_spec_progress },
+ { "protocoldirectories", &opt.protocol_directories, cmd_boolean },
+ { "proxypasswd", &opt.proxy_passwd, cmd_string }, /* deprecated */
+ { "proxypassword", &opt.proxy_passwd, cmd_string },
+ { "proxyuser", &opt.proxy_user, cmd_string },
+ { "quiet", &opt.quiet, cmd_boolean },
+ { "quota", &opt.quota, cmd_bytes_sum },
+#ifdef HAVE_SSL
+ { "randomfile", &opt.random_file, cmd_file },
+#endif
+ { "randomwait", &opt.random_wait, cmd_boolean },
+ { "readtimeout", &opt.read_timeout, cmd_time },
+ { "reclevel", &opt.reclevel, cmd_number_inf },
+ { "recursive", NULL, cmd_spec_recursive },
+ { "referer", &opt.referer, cmd_string },
+ { "regextype", &opt.regex_type, cmd_spec_regex_type },
+ { "reject", &opt.rejects, cmd_vector },
+ { "rejectedlog", &opt.rejected_log, cmd_file },
+ { "rejectregex", &opt.rejectregex_s, cmd_string },
+ { "relativeonly", &opt.relative_only, cmd_boolean },
+ { "remoteencoding", &opt.encoding_remote, cmd_string },
+ { "removelisting", &opt.remove_listing, cmd_boolean },
+ { "reportspeed", &opt.report_bps, cmd_spec_report_speed},
+ { "restrictfilenames", NULL, cmd_spec_restrict_file_names },
+ { "retrsymlinks", &opt.retr_symlinks, cmd_boolean },
+ { "retryconnrefused", &opt.retry_connrefused, cmd_boolean },
+ { "retryonhosterror", &opt.retry_on_host_error, cmd_boolean },
+ { "retryonhttperror", &opt.retry_on_http_error, cmd_string },
+ { "robots", &opt.use_robots, cmd_boolean },
+ { "savecookies", &opt.cookies_output, cmd_file },
+ { "saveheaders", &opt.save_headers, cmd_boolean },
+#ifdef HAVE_SSL
+ { "secureprotocol", &opt.secure_protocol, cmd_spec_secure_protocol },
+#endif
+ { "serverresponse", &opt.server_response, cmd_boolean },
+ { "showalldnsentries", &opt.show_all_dns_entries, cmd_boolean },
+ { "showprogress", &opt.show_progress, cmd_spec_progressdisp },
+ { "spanhosts", &opt.spanhost, cmd_boolean },
+ { "spider", &opt.spider, cmd_boolean },
+ { "startpos", &opt.start_pos, cmd_bytes },
+ { "strictcomments", &opt.strict_comments, cmd_boolean },
+ { "timeout", NULL, cmd_spec_timeout },
+ { "timestamping", &opt.timestamping, cmd_boolean },
+ { "tries", &opt.ntry, cmd_number_inf },
+ { "trustservernames", &opt.trustservernames, cmd_boolean },
+ { "unlink", &opt.unlink_requested, cmd_boolean },
+#ifndef __VMS
+ { "useaskpass" , &opt.use_askpass, cmd_use_askpass },
+#endif
+ { "useproxy", &opt.use_proxy, cmd_boolean },
+ { "user", &opt.user, cmd_string },
+ { "useragent", NULL, cmd_spec_useragent },
+ { "useservertimestamps", &opt.useservertimestamps, cmd_boolean },
+ { "verbose", NULL, cmd_spec_verbose },
+ { "wait", &opt.wait, cmd_time },
+ { "waitretry", &opt.waitretry, cmd_time },
+ { "warccdx", &opt.warc_cdx_enabled, cmd_boolean },
+ { "warccdxdedup", &opt.warc_cdx_dedup_filename, cmd_file },
+#ifdef HAVE_LIBZ
+ { "warccompression", &opt.warc_compression_enabled, cmd_boolean },
+#endif
+ { "warcdigests", &opt.warc_digests_enabled, cmd_boolean },
+ { "warcfile", &opt.warc_filename, cmd_file },
+ { "warcheader", NULL, cmd_spec_warc_header },
+ { "warckeeplog", &opt.warc_keep_log, cmd_boolean },
+ { "warcmaxsize", &opt.warc_maxsize, cmd_bytes },
+ { "warctempdir", &opt.warc_tempdir, cmd_directory },
+#ifdef USE_WATT32
+ { "wdebug", &opt.wdebug, cmd_boolean },
+#endif
+#ifdef ENABLE_XATTR
+ { "xattr", &opt.enable_xattr, cmd_boolean },
+#endif
+};
+
+/* Look up CMDNAME in the commands[] and return its position in the
+ array. If CMDNAME is not found, return -1. */
+
+static int
+command_by_name (const char *cmdname)
+{
+ /* Use binary search for speed. Wget has ~100 commands, which
+ guarantees a worst case performance of 7 string comparisons. */
+ int lo = 0, hi = countof (commands) - 1;
+
+ while (lo <= hi)
+ {
+ int mid = (lo + hi) >> 1;
+ int cmp = c_strcasecmp (cmdname, commands[mid].name);
+ if (cmp < 0)
+ hi = mid - 1;
+ else if (cmp > 0)
+ lo = mid + 1;
+ else
+ return mid;
+ }
+ return -1;
+}
+
+/* Reset the variables to default values. */
+void
+defaults (void)
+{
+ char *tmp;
+
+ /* Most of the default values are 0 (and 0.0, NULL, and false).
+ Just reset everything, and fill in the non-zero values. Note
+ that initializing pointers to NULL this way is technically
+ illegal, but porting Wget to a machine where NULL is not all-zero
+ bit pattern will be the least of the implementors' worries. */
+ xzero (opt);
+
+#ifdef HAVE_METALINK
+ opt.metalink_index = -1;
+#endif
+
+ opt.cookies = true;
+ opt.verbose = -1;
+ opt.ntry = 20;
+ opt.reclevel = 5;
+ opt.add_hostdir = true;
+ opt.netrc = true;
+ opt.ftp_glob = true;
+ opt.htmlify = true;
+ opt.http_keep_alive = true;
+ opt.use_proxy = true;
+ opt.convert_file_only = false;
+ tmp = getenv ("no_proxy");
+ if (tmp)
+ opt.no_proxy = sepstring (tmp);
+ opt.prefer_family = prefer_none;
+ opt.allow_cache = true;
+ opt.if_modified_since = true;
+
+ opt.read_timeout = 900;
+ opt.use_robots = true;
+
+ opt.remove_listing = true;
+
+ opt.dot_bytes = 1024;
+ opt.dot_spacing = 10;
+ opt.dots_in_line = 50;
+
+ opt.dns_cache = true;
+ opt.ftp_pasv = true;
+ /* 2014-09-07 Darshit Shah <darnir@gmail.com>
+ * opt.retr_symlinks is set to true by default. Creating symbolic links on the
+ * local filesystem pose a security threat by malicious FTP Servers that
+ * server a specially crafted .listing file akin to this:
+ *
+ * lrwxrwxrwx 1 root root 33 Dec 25 2012 JoCxl6d8rFU -> /
+ * drwxrwxr-x 15 1024 106 4096 Aug 28 02:02 JoCxl6d8rFU
+ *
+ * A .listing file in this fashion makes Wget susceptiple to a symlink attack
+ * wherein the attacker is able to create arbitrary files, directories and
+ * symbolic links on the target system and even set permissions.
+ *
+ * Hence, by default Wget attempts to retrieve the pointed-to files and does
+ * not create the symbolic links locally.
+ */
+ opt.retr_symlinks = true;
+
+#ifdef HAVE_SSL
+ opt.check_cert = CHECK_CERT_ON;
+ opt.ftps_resume_ssl = true;
+ opt.ftps_fallback_to_ftp = false;
+ opt.ftps_implicit = false;
+ opt.ftps_clear_data_connection = false;
+#endif
+
+#ifdef HAVE_LIBZ
+ opt.compression = compression_none;
+#endif
+
+ /* The default for file name restriction defaults to the OS type. */
+#if defined(WINDOWS) || defined(MSDOS) || defined(__CYGWIN__)
+ opt.restrict_files_os = restrict_windows;
+#elif defined(__VMS)
+ opt.restrict_files_os = restrict_vms;
+#else
+ opt.restrict_files_os = restrict_unix;
+#endif
+ opt.restrict_files_ctrl = true;
+ opt.restrict_files_nonascii = false;
+ opt.restrict_files_case = restrict_no_case_restriction;
+
+ opt.regex_type = regex_type_posix;
+
+ opt.max_redirect = 20;
+
+ opt.waitretry = 10;
+
+#ifdef ENABLE_IRI
+ opt.enable_iri = true;
+#else
+ opt.enable_iri = false;
+#endif
+ opt.locale = NULL;
+ opt.encoding_remote = NULL;
+
+ opt.useservertimestamps = true;
+ opt.show_all_dns_entries = false;
+
+ opt.warc_maxsize = 0; /* 1024 * 1024 * 1024; */
+#ifdef HAVE_LIBZ
+ opt.warc_compression_enabled = true;
+#else
+ opt.warc_compression_enabled = false;
+#endif
+ opt.warc_digests_enabled = true;
+ opt.warc_cdx_enabled = false;
+ opt.warc_cdx_dedup_filename = NULL;
+ opt.warc_tempdir = NULL;
+ opt.warc_keep_log = true;
+
+ /* Use a negative value to mark the absence of --start-pos option */
+ opt.start_pos = -1;
+ opt.show_progress = -1;
+ opt.noscroll = false;
+
+#ifdef HAVE_HSTS
+ /* HSTS is enabled by default */
+ opt.hsts = true;
+#endif
+
+ opt.enable_xattr = false;
+}
+
+/* Return the user's home directory (strdup-ed), or NULL if none is
+ found. */
+char *
+home_dir (void)
+{
+ static char *buf = NULL;
+ static char *home, *ret;
+
+ if (!home)
+ {
+ home = getenv ("HOME");
+ if (!home)
+ {
+#if defined(MSDOS)
+ int len;
+
+ /* Under MSDOS, if $HOME isn't defined, use the directory where
+ `wget.exe' resides. */
+ const char *_w32_get_argv0 (void); /* in libwatt.a/pcconfig.c */
+ char *p;
+
+ buff = _w32_get_argv0 ();
+
+ p = strrchr (buf, '/'); /* djgpp */
+ if (!p)
+ p = strrchr (buf, '\\'); /* others */
+ assert (p);
+
+ len = p - buff + 1;
+ buff = strdup (_w32_get_argv0 ());
+
+ home = buf;
+#elif !defined(WINDOWS)
+ /* If HOME is not defined, try getting it from the password
+ file. */
+ struct passwd *pwd = getpwuid (getuid ());
+ if (!pwd || !pwd->pw_dir)
+ return NULL;
+ home = pwd->pw_dir;
+#else /* !WINDOWS */
+ /* Under Windows, if $HOME isn't defined, use the directory where
+ `wget.exe' resides. */
+ home = ws_mypath ();
+#endif /* WINDOWS */
+ }
+ }
+
+ ret = home ? xstrdup (home) : NULL;
+ xfree (buf);
+
+ return ret;
+}
+
+/* Check the 'WGETRC' environment variable and return the file name
+ if 'WGETRC' is set and is a valid file.
+ If the `WGETRC' variable exists but the file does not exist, the
+ function will exit(). */
+char *
+wgetrc_env_file_name (void)
+{
+ char *env = getenv ("WGETRC");
+ if (env && *env)
+ {
+ file_stats_t flstat;
+ if (!file_exists_p (env, &flstat))
+ {
+ fprintf (stderr, _("%s: WGETRC points to %s, which couldn't be accessed because of error: %s.\n"),
+ exec_name, env, strerror(flstat.access_err));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ return xstrdup (env);
+ }
+ return NULL;
+}
+
+/* Append file name to (locally appropriate) directory spec.
+ Return pointer to allocated storage. */
+char *
+ajoin_dir_file (const char *dir, const char *file)
+{
+ char *dir_file;
+#ifdef __VMS
+ /* No separator: "dev:[dir]" + "name.type" */
+ dir_file = aprintf ("%s%s", dir, file);
+#else /* def __VMS */
+ /* Slash separator: "/a/b" + "/" + "name.type" */
+ dir_file = aprintf ("%s/%s", dir, file);
+#endif /* def __VMS [else] */
+ return dir_file;
+}
+
+/* Check for the existence of '$HOME/.wgetrc' and return its path
+ if it exists and is set. */
+char *
+wgetrc_user_file_name (void)
+{
+ char *file = NULL;
+
+ /* Join opt.homedir ($HOME) and ".wgetrc" */
+ if (opt.homedir) {
+ file = ajoin_dir_file(opt.homedir, ".wgetrc");
+ }
+
+ if (!file)
+ return NULL;
+#ifndef FUZZING
+ if (!file_exists_p (file, NULL))
+ {
+ xfree (file);
+ return NULL;
+ }
+#endif
+ return file;
+}
+
+/* Return the path to the user's .wgetrc. This is either the value of
+ `WGETRC' environment variable, or `$HOME/.wgetrc'.
+
+ Additionally, for windows, look in the directory where wget.exe
+ resides. */
+char *
+wgetrc_file_name (void)
+{
+ char *file = wgetrc_env_file_name ();
+ if (file && *file)
+ return file;
+
+ file = wgetrc_user_file_name ();
+
+#ifdef WINDOWS
+ /* Under Windows, if we still haven't found .wgetrc, look for the file
+ `wget.ini' in the directory where `wget.exe' resides; we do this for
+ backward compatibility with previous versions of Wget.
+ SYSTEM_WGETRC should not be defined under WINDOWS. */
+ if (!file)
+ {
+ const char *home = ws_mypath ();
+ if (home)
+ {
+ file = aprintf ("%s/wget.ini", home);
+ if (!file_exists_p (file, NULL))
+ {
+ xfree (file);
+ }
+ }
+ }
+#endif /* WINDOWS */
+
+ return file;
+}
+
+/* Return values of parse_line. */
+enum parse_line {
+ line_ok,
+ line_empty,
+ line_syntax_error,
+ line_unknown_command
+};
+
+static enum parse_line parse_line (const char *, char **, char **, int *);
+static bool setval_internal (int, const char *, const char *);
+static bool setval_internal_tilde (int, const char *, const char *);
+
+/* Initialize variables from a wgetrc file. Returns zero (failure) if
+ there were errors in the file. */
+
+bool
+run_wgetrc (const char *file, file_stats_t *flstats)
+{
+ FILE *fp;
+ char *line = NULL;
+ size_t bufsize = 0;
+ int ln;
+ int errcnt = 0;
+
+ fp = fopen_stat (file, "r", flstats);
+ if (!fp)
+ {
+ fprintf (stderr, _("%s: Cannot read %s (%s).\n"), exec_name,
+ file, strerror (errno));
+ return true; /* not a fatal error */
+ }
+ ln = 1;
+ while (getline (&line, &bufsize, fp) > 0)
+ {
+ char *com = NULL, *val = NULL;
+ int comind;
+
+ /* Parse the line. */
+ switch (parse_line (line, &com, &val, &comind))
+ {
+ case line_ok:
+ /* If everything is OK, set the value. */
+ if (!setval_internal_tilde (comind, com, val))
+ {
+ fprintf (stderr, _("%s: Error in %s at line %d.\n"),
+ exec_name, file, ln);
+ ++errcnt;
+ }
+ break;
+ case line_syntax_error:
+ fprintf (stderr, _("%s: Syntax error in %s at line %d.\n"),
+ exec_name, file, ln);
+ ++errcnt;
+ break;
+ case line_unknown_command:
+ fprintf (stderr, _("%s: Unknown command %s in %s at line %d.\n"),
+ exec_name, quote (com), file, ln);
+ ++errcnt;
+ break;
+ case line_empty:
+ break;
+ default:
+ abort ();
+ }
+ xfree (com);
+ xfree (val);
+ ++ln;
+ }
+ xfree (line);
+ fclose (fp);
+
+ return errcnt == 0;
+}
+
+/* Initialize the defaults and run the system wgetrc and user's own
+ wgetrc. */
+int
+initialize (void)
+{
+ char *env_sysrc;
+ file_stats_t flstats;
+ bool ok = true;
+
+ memset(&flstats, 0, sizeof(flstats));
+ /* Run a non-standard system rc file when the according environment
+ variable has been set. For internal testing purposes only! */
+ env_sysrc = getenv ("SYSTEM_WGETRC");
+ if (env_sysrc && file_exists_p (env_sysrc, &flstats))
+ {
+ ok &= run_wgetrc (env_sysrc, &flstats);
+ /* If there are any problems parsing the system wgetrc file, tell
+ the user and exit */
+ if (! ok)
+ {
+ fprintf (stderr, _("\
+Parsing system wgetrc file (env SYSTEM_WGETRC) failed. Please check\n\
+'%s',\n\
+or specify a different file using --config.\n"), env_sysrc);
+ return WGET_EXIT_PARSE_ERROR;
+ }
+ }
+ /* Otherwise, if SYSTEM_WGETRC is defined, use it. */
+#ifdef SYSTEM_WGETRC
+ else if (file_exists_p (SYSTEM_WGETRC, &flstats))
+ ok &= run_wgetrc (SYSTEM_WGETRC, &flstats);
+ /* If there are any problems parsing the system wgetrc file, tell
+ the user and exit */
+ if (! ok)
+ {
+ fprintf (stderr, _("\
+Parsing system wgetrc file failed. Please check\n\
+'%s',\n\
+or specify a different file using --config.\n"), SYSTEM_WGETRC);
+ return WGET_EXIT_PARSE_ERROR;
+ }
+#endif
+ /* Override it with your own, if one exists. */
+ opt.wgetrcfile = wgetrc_file_name ();
+ if (!opt.wgetrcfile)
+ return 0;
+ /* #### We should canonicalize `file' and SYSTEM_WGETRC with
+ something like realpath() before comparing them with `strcmp' */
+#ifdef SYSTEM_WGETRC
+ if (!strcmp (opt.wgetrcfile, SYSTEM_WGETRC))
+ {
+ fprintf (stderr, _("\
+%s: Warning: Both system and user wgetrc point to %s.\n"),
+ exec_name, quote (opt.wgetrcfile));
+ }
+ else
+#endif
+#ifndef FUZZING
+ if (file_exists_p (opt.wgetrcfile, &flstats))
+#endif
+ ok &= run_wgetrc (opt.wgetrcfile, &flstats);
+
+ xfree (opt.wgetrcfile);
+
+ /* If there were errors processing either `.wgetrc', abort. */
+ if (!ok)
+ return WGET_EXIT_PARSE_ERROR;
+
+ return 0;
+}
+
+/* Remove dashes and underscores from S, modifying S in the
+ process. */
+
+static void
+dehyphen (char *s)
+{
+ char *t = s; /* t - tortoise */
+ char *h = s; /* h - hare */
+ while (*h)
+ if (*h == '_' || *h == '-')
+ ++h;
+ else
+ *t++ = *h++;
+ *t = '\0';
+}
+
+/* Parse the line pointed by line, with the syntax:
+ <sp>* command <sp>* = <sp>* value <sp>*
+ Uses malloc to allocate space for command and value.
+
+ Returns one of line_ok, line_empty, line_syntax_error, or
+ line_unknown_command.
+
+ In case of line_ok, *COM and *VAL point to freshly allocated
+ strings, and *COMIND points to com's index. In case of error or
+ empty line, their values are unmodified. */
+
+static enum parse_line
+parse_line (const char *line, char **com, char **val, int *comind)
+{
+ const char *p;
+ const char *end = line + strlen (line);
+ const char *cmdstart, *cmdend;
+ const char *valstart, *valend;
+ char buf[1024];
+ size_t len;
+
+ char *cmdcopy;
+ int ind;
+
+ /* Skip leading and trailing whitespace. */
+ while (*line && c_isspace (*line))
+ ++line;
+ while (end > line && c_isspace (end[-1]))
+ --end;
+
+ /* Skip empty lines and comments. */
+ if (!*line || *line == '#')
+ return line_empty;
+
+ p = line;
+
+ cmdstart = p;
+ while (p < end && (c_isalnum (*p) || *p == '_' || *p == '-'))
+ ++p;
+ cmdend = p;
+
+ /* Skip '=', as well as any space before or after it. */
+ while (p < end && c_isspace (*p))
+ ++p;
+ if (p == end || *p != '=')
+ return line_syntax_error;
+ ++p;
+ while (p < end && c_isspace (*p))
+ ++p;
+
+ valstart = p;
+ valend = end;
+
+ /* The syntax is valid (even though the command might not be). Fill
+ in the command name and value. */
+ *com = strdupdelim (cmdstart, cmdend);
+ *val = strdupdelim (valstart, valend);
+
+ /* The line now known to be syntactically correct. Check whether
+ the command is valid. */
+ len = cmdend - cmdstart;
+ if (len < sizeof (buf))
+ cmdcopy = buf;
+ else
+ cmdcopy = xmalloc (len + 1);
+ memcpy (cmdcopy, cmdstart, len);
+ cmdcopy[len] = 0;
+
+ dehyphen (cmdcopy);
+ ind = command_by_name (cmdcopy);
+ if (cmdcopy != buf)
+ xfree (cmdcopy);
+ if (ind == -1)
+ return line_unknown_command;
+
+ /* Report success to the caller. */
+ *comind = ind;
+ return line_ok;
+}
+
+#if defined(WINDOWS) || defined(MSDOS)
+# define ISSEP(c) ((c) == '/' || (c) == '\\')
+# define SEPSTRING "/\\"
+#else
+# define ISSEP(c) ((c) == '/')
+# define SEPSTRING "/"
+#endif
+
+/* Run commands[comind].action. */
+
+static bool
+setval_internal (int comind, const char *com, const char *val)
+{
+ assert (0 <= comind && ((size_t) comind) < countof (commands));
+
+ if ((unsigned) comind >= countof (commands))
+ return NULL;
+
+ DEBUGP (("Setting %s (%s) to %s\n", com, commands[comind].name, val));
+ return commands[comind].action (com, val, commands[comind].place);
+}
+
+static bool
+setval_internal_tilde (int comind, const char *com, const char *val)
+{
+ bool ret;
+ int homelen;
+ char **pstring;
+ ret = setval_internal (comind, com, val);
+
+ /* We make tilde expansion for cmd_file and cmd_directory */
+ if (((commands[comind].action == cmd_file) ||
+ (commands[comind].action == cmd_directory))
+ && ret && (*val == '~' && ISSEP (val[1])))
+ {
+ pstring = commands[comind].place;
+ if (opt.homedir)
+ {
+ char *home = xstrdup(opt.homedir);
+ homelen = strlen (home);
+ while (homelen && ISSEP (home[homelen - 1]))
+ home[--homelen] = '\0';
+
+ xfree (*pstring);
+
+ /* Skip the leading "~/". */
+ val += strspn(val + 1, SEPSTRING) + 1;
+ *pstring = concat_strings (home, "/", val, (char *)0);
+ xfree (home);
+ }
+ }
+ return ret;
+}
+
+/* Run command COM with value VAL. If running the command produces an
+ error, report the error and exit.
+
+ This is intended to be called from main to modify Wget's behavior
+ through command-line switches. Since COM is hard-coded in main,
+ it is not canonicalized, and this aborts when COM is not found.
+
+ If COMIND's are exported to init.h, this function will be changed
+ to accept COMIND directly. */
+
+void
+setoptval (const char *com, const char *val, const char *optname)
+{
+ /* Prepend "--" to OPTNAME. */
+ char dd_optname[2 + MAX_LONGOPTION + 1];
+
+ if ((unsigned) snprintf(dd_optname, sizeof (dd_optname), "--%s", optname) > sizeof (dd_optname))
+ exit (WGET_EXIT_PARSE_ERROR);
+
+ assert (val != NULL);
+
+ if (!setval_internal (command_by_name (com), dd_optname, val))
+ exit (WGET_EXIT_PARSE_ERROR);
+}
+
+/* Parse OPT into command and value and run it. For example,
+ run_command("foo=bar") is equivalent to setoptval("foo", "bar").
+ This is used by the `--execute' flag in main.c. */
+
+void
+run_command (const char *cmdopt)
+{
+ char *com, *val;
+ int comind;
+ switch (parse_line (cmdopt, &com, &val, &comind))
+ {
+ case line_ok:
+ if (!setval_internal (comind, com, val))
+ exit (WGET_EXIT_PARSE_ERROR);
+ xfree (com);
+ xfree (val);
+ break;
+ default:
+ fprintf (stderr, _("%s: Invalid --execute command %s\n"),
+ exec_name, quote (cmdopt));
+ exit (WGET_EXIT_PARSE_ERROR);
+ }
+}
+
+/* Generic helper functions, for use with `commands'. */
+
+/* Forward declarations: */
+struct decode_item {
+ const char *name;
+ int code;
+};
+static bool decode_string (const char *, const struct decode_item *, int, int *);
+static bool simple_atof (const char *, const char *, double *);
+
+#define CMP1(p, c0) (c_tolower((p)[0]) == (c0) && (p)[1] == '\0')
+
+#define CMP2(p, c0, c1) (c_tolower((p)[0]) == (c0) \
+ && c_tolower((p)[1]) == (c1) \
+ && (p)[2] == '\0')
+
+#define CMP3(p, c0, c1, c2) (c_tolower((p)[0]) == (c0) \
+ && c_tolower((p)[1]) == (c1) \
+ && c_tolower((p)[2]) == (c2) \
+ && (p)[3] == '\0')
+
+
+static int
+cmd_boolean_internal (const char *com _GL_UNUSED, const char *val, void *place _GL_UNUSED)
+{
+ if (CMP2 (val, 'o', 'n') || CMP3 (val, 'y', 'e', 's') || CMP1 (val, '1'))
+ /* "on", "yes" and "1" mean true. */
+ return 1;
+ else if (CMP3 (val, 'o', 'f', 'f') || CMP2 (val, 'n', 'o') || CMP1 (val, '0'))
+ /* "off", "no" and "0" mean false. */
+ return 0;
+ return -1;
+}
+
+/* Store the boolean value from VAL to PLACE. COM is ignored,
+ except for error messages. */
+static bool
+cmd_boolean (const char *com, const char *val, void *place)
+{
+ bool value;
+
+ switch (cmd_boolean_internal (com, val, place))
+ {
+ case 0:
+ value = false;
+ break;
+
+ case 1:
+ value = true;
+ break;
+
+ default:
+ {
+ fprintf (stderr,
+ _("%s: %s: Invalid boolean %s; use `on' or `off'.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ }
+ *(bool *) place = value;
+ return true;
+}
+
+/* Store the check_cert value from VAL to PLACE. COM is ignored,
+ except for error messages. */
+static bool
+cmd_check_cert (const char *com, const char *val, void *place)
+{
+ int value;
+
+ switch (cmd_boolean_internal (com, val, place))
+ {
+ case 0:
+ value = CHECK_CERT_OFF;
+ break;
+
+ case 1:
+ value = CHECK_CERT_ON;
+ break;
+
+ default:
+ {
+ if (!c_strcasecmp (val, "quiet"))
+ value = CHECK_CERT_QUIET;
+ else
+ {
+ fprintf (stderr,
+ _("%s: %s: Invalid %s; use `on', `off' or `quiet'.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ }
+ }
+ *(int *) place = value;
+ return true;
+}
+
+/* Set the non-negative integer value from VAL to PLACE. With
+ incorrect specification, the number remains unchanged. */
+static bool
+cmd_number (const char *com, const char *val, void *place)
+{
+ long l = strtol(val, NULL, 10);
+
+ if (((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE)
+ || l < 0 || l > INT_MAX)
+ {
+ fprintf (stderr, _("%s: %s: Invalid number %s.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ *(int *) place = (int) l;
+ return true;
+}
+
+/* Similar to cmd_number(), only accepts `inf' as a synonym for 0. */
+static bool
+cmd_number_inf (const char *com, const char *val, void *place)
+{
+ if (!c_strcasecmp (val, "inf"))
+ {
+ *(int *) place = 0;
+ return true;
+ }
+ return cmd_number (com, val, place);
+}
+
+/* Copy (strdup) the string at COM to a new location and place a
+ pointer to *PLACE. */
+static bool
+cmd_string (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ char **pstring = (char **)place;
+
+ xfree (*pstring);
+ *pstring = xstrdup (val);
+ return true;
+}
+
+/* Like cmd_string but ensure the string is upper case. */
+static bool
+cmd_string_uppercase (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ char *q, **pstring;
+ pstring = (char **)place;
+ xfree (*pstring);
+
+ *pstring = xmalloc (strlen (val) + 1);
+
+ for (q = *pstring; *val; val++, q++)
+ *q = c_toupper (*val);
+
+ *q = '\0';
+ return true;
+}
+
+
+/* Like cmd_string, but handles tilde-expansion when reading a user's
+ `.wgetrc'. In that case, and if VAL begins with `~', the tilde
+ gets expanded to the user's home directory. */
+static bool
+cmd_file (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ char **pstring = (char **)place;
+
+ xfree (*pstring);
+
+ /* #### If VAL is empty, perhaps should set *PLACE to NULL. */
+
+ *pstring = xstrdup (val);
+
+#if defined(WINDOWS) || defined(MSDOS)
+ /* Convert "\" to "/". */
+ {
+ char *s;
+ for (s = *pstring; *s; s++)
+ if (*s == '\\')
+ *s = '/';
+ }
+#endif
+ return true;
+}
+
+/* like cmd_file, but insist on just a single option usage */
+static bool
+cmd_file_once (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ if (*(char **)place)
+ {
+ fprintf (stderr, _("%s: %s must only be used once\n"),
+ exec_name, com);
+ return false;
+ }
+
+ return cmd_file(com, val, place);
+}
+
+/* Like cmd_file, but strips trailing '/' characters. */
+static bool
+cmd_directory (const char *com, const char *val, void *place)
+{
+ char *s, *t;
+
+ /* Call cmd_file() for tilde expansion and separator
+ canonicalization (backslash -> slash under Windows). These
+ things should perhaps be in a separate function. */
+ if (!cmd_file (com, val, place))
+ return false;
+
+ s = *(char **)place;
+ t = s + strlen (s);
+ while (t > s && *--t == '/')
+ *t = '\0';
+
+ return true;
+}
+
+/* Split VAL by space to a vector of values, and append those values
+ to vector pointed to by the PLACE argument. If VAL is empty, the
+ PLACE vector is cleared instead. */
+
+static bool
+cmd_vector (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ char ***pvec = (char ***)place;
+
+ if (*val)
+ *pvec = merge_vecs (*pvec, sepstring (val));
+ else
+ {
+ free_vec (*pvec);
+ *pvec = NULL;
+ }
+ return true;
+}
+
+static bool
+cmd_directory_vector (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ char ***pvec = (char ***)place;
+
+ if (*val)
+ {
+ /* Strip the trailing slashes from directories. */
+ char **t, **seps;
+
+ seps = sepstring (val);
+ for (t = seps; t && *t; t++)
+ {
+ int len = strlen (*t);
+ /* Skip degenerate case of root directory. */
+ if (len > 1)
+ {
+ if ((*t)[len - 1] == '/')
+ (*t)[len - 1] = '\0';
+ }
+ }
+ *pvec = merge_vecs (*pvec, seps);
+ }
+ else
+ {
+ free_vec (*pvec);
+ *pvec = NULL;
+ }
+ return true;
+}
+
+/* Engine for cmd_bytes and cmd_bytes_sum: converts a string such as
+ "100k" or "2.5G" to a floating point number. */
+
+static bool
+parse_bytes_helper (const char *val, double *result)
+{
+ double number, mult;
+ const char *end = val + strlen (val);
+
+ /* Check for "inf". */
+ if (0 == strcmp (val, "inf"))
+ {
+ *result = 0;
+ return true;
+ }
+
+ /* Strip trailing whitespace. */
+ while (val < end && c_isspace (end[-1]))
+ --end;
+ if (val == end)
+ return false;
+
+ switch (c_tolower (end[-1]))
+ {
+ case 'k':
+ --end, mult = 1024.0;
+ break;
+ case 'm':
+ --end, mult = 1048576.0;
+ break;
+ case 'g':
+ --end, mult = 1073741824.0;
+ break;
+ case 't':
+ --end, mult = 1099511627776.0;
+ break;
+ default:
+ /* Not a recognized suffix: assume it's a digit. (If not,
+ simple_atof will raise an error.) */
+ mult = 1;
+ }
+
+ /* Skip leading and trailing whitespace. */
+ while (val < end && c_isspace (*val))
+ ++val;
+ while (val < end && c_isspace (end[-1]))
+ --end;
+ if (val == end)
+ return false;
+
+ if (!simple_atof (val, end, &number) || number < 0)
+ return false;
+
+ *result = number * mult;
+ return true;
+}
+
+/* Parse VAL as a number and set its value to PLACE (which should
+ point to a wgint).
+
+ By default, the value is assumed to be in bytes. If "K", "M", or
+ "G" are appended, the value is multiplied with 1<<10, 1<<20, or
+ 1<<30, respectively. Floating point values are allowed and are
+ cast to integer before use. The idea is to be able to use things
+ like 1.5k instead of "1536".
+
+ The string "inf" is returned as 0.
+
+ In case of error, false is returned and memory pointed to by PLACE
+ remains unmodified. */
+
+static bool
+cmd_bytes (const char *com, const char *val, void *place)
+{
+ double byte_value;
+ if (!parse_bytes_helper (val, &byte_value))
+ {
+ fprintf (stderr, _("%s: %s: Invalid byte value %s\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ *(wgint *)place = (wgint)byte_value;
+ return true;
+}
+
+/* Like cmd_bytes, but PLACE is interpreted as a pointer to
+ SIZE_SUM. It works by converting the string to double, therefore
+ working with values up to 2^53-1 without loss of precision. This
+ value (8192 TB) is large enough to serve for a while. */
+
+static bool
+cmd_bytes_sum (const char *com, const char *val, void *place)
+{
+ double byte_value;
+
+ if (!parse_bytes_helper (val, &byte_value)
+ || byte_value < LONG_MIN || byte_value > LONG_MAX)
+ {
+ fprintf (stderr, _("%s: %s: Invalid byte value %s\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ *(SUM_SIZE_INT *) place = (SUM_SIZE_INT) byte_value;
+ return true;
+}
+
+/* Store the value of VAL to *OUT. The value is a time period, by
+ default expressed in seconds, but also accepting suffixes "m", "h",
+ "d", and "w" for minutes, hours, days, and weeks respectively. */
+
+static bool
+cmd_time (const char *com, const char *val, void *place)
+{
+ double number, mult;
+ const char *end = val + strlen (val);
+
+ /* Strip trailing whitespace. */
+ while (val < end && c_isspace (end[-1]))
+ --end;
+
+ if (val == end)
+ {
+ err:
+ fprintf (stderr, _("%s: %s: Invalid time period %s\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+
+ switch (c_tolower (end[-1]))
+ {
+ case 's':
+ --end, mult = 1; /* seconds */
+ break;
+ case 'm':
+ --end, mult = 60; /* minutes */
+ break;
+ case 'h':
+ --end, mult = 3600; /* hours */
+ break;
+ case 'd':
+ --end, mult = 86400.0; /* days */
+ break;
+ case 'w':
+ --end, mult = 604800.0; /* weeks */
+ break;
+ default:
+ /* Not a recognized suffix: assume it belongs to the number.
+ (If not, simple_atof will raise an error.) */
+ mult = 1;
+ }
+
+ /* Skip leading and trailing whitespace. */
+ while (val < end && c_isspace (*val))
+ ++val;
+ while (val < end && c_isspace (end[-1]))
+ --end;
+ if (val == end)
+ goto err;
+
+ if (!simple_atof (val, end, &number))
+ goto err;
+
+ if (number < 0)
+ {
+ fprintf (stderr, _("%s: %s: Negative time period %s\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+
+ *(double *)place = number * mult;
+ return true;
+}
+
+
+static bool
+cmd_use_askpass (const char *com _GL_UNUSED, const char *val, void *place)
+{
+ const char *env_name = "WGET_ASKPASS";
+ const char *env;
+
+ if (val && *val)
+ return cmd_string (com, val, place);
+
+ env = getenv (env_name);
+ if (!(env && *env))
+ {
+ env_name = "SSH_ASKPASS";
+ env = getenv (env_name);
+ }
+
+ if (!(env && *env))
+ {
+ fprintf (stderr, _("use-askpass requires a string or either environment variable WGET_ASKPASS or SSH_ASKPASS to be set.\n"));
+ return false;
+ }
+
+ return cmd_string (com, env, place);
+}
+
+#ifdef HAVE_SSL
+static bool
+cmd_cert_type (const char *com, const char *val, void *place)
+{
+ static const struct decode_item choices[] = {
+ { "pem", keyfile_pem },
+ { "der", keyfile_asn1 },
+ { "asn1", keyfile_asn1 },
+ };
+ int ok = decode_string (val, choices, countof (choices), place);
+ if (!ok)
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val));
+ return ok;
+}
+#endif
+
+/* Specialized helper functions, used by `commands' to handle some
+ options specially. */
+
+static bool check_user_specified_header (const char *);
+
+#ifdef HAVE_LIBZ
+static bool
+cmd_spec_compression (const char *com, const char *val, void *place)
+{
+ static const struct decode_item choices[] = {
+ { "auto", compression_auto },
+ { "gzip", compression_gzip },
+ { "none", compression_none },
+ };
+ int ok = decode_string (val, choices, countof (choices), place);
+ if (!ok)
+ {
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com,
+ quote (val));
+ }
+ return ok;
+}
+#endif
+
+static bool
+cmd_spec_dirstruct (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ if (!cmd_boolean (com, val, &opt.dirstruct))
+ return false;
+ /* Since dirstruct behaviour is explicitly changed, no_dirstruct
+ must be affected inversely. */
+ if (opt.dirstruct)
+ opt.no_dirstruct = false;
+ else
+ opt.no_dirstruct = true;
+ return true;
+}
+
+static bool
+cmd_spec_header (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ /* Empty value means reset the list of headers. */
+ if (*val == '\0')
+ {
+ free_vec (opt.user_headers);
+ opt.user_headers = NULL;
+ return true;
+ }
+
+ if (!check_user_specified_header (val))
+ {
+ fprintf (stderr, _("%s: %s: Invalid header %s.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ opt.user_headers = vec_append (opt.user_headers, val);
+ return true;
+}
+
+static bool
+cmd_spec_warc_header (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ /* Empty value means reset the list of headers. */
+ if (*val == '\0')
+ {
+ free_vec (opt.warc_user_headers);
+ opt.warc_user_headers = NULL;
+ return true;
+ }
+
+ if (!check_user_specified_header (val))
+ {
+ fprintf (stderr, _("%s: %s: Invalid WARC header %s.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ opt.warc_user_headers = vec_append (opt.warc_user_headers, val);
+ return true;
+}
+
+static bool
+cmd_spec_htmlify (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ int flag = cmd_boolean (com, val, &opt.htmlify);
+ if (flag && !opt.htmlify)
+ opt.remove_listing = false;
+ return flag;
+}
+
+/* Set the "mirror" mode. It means: recursive download, timestamping,
+ no limit on max. recursion depth, and don't remove listings. */
+
+static bool
+cmd_spec_mirror (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ bool mirror;
+
+ if (!cmd_boolean (com, val, &mirror))
+ return false;
+ if (mirror)
+ {
+ opt.recursive = true;
+ if (!opt.no_dirstruct)
+ opt.dirstruct = true;
+ opt.timestamping = true;
+ opt.reclevel = INFINITE_RECURSION;
+ opt.remove_listing = false;
+ }
+ return true;
+}
+
+/* Validate --prefer-family and set the choice. Allowed values are
+ "IPv4", "IPv6", and "none". */
+
+static bool
+cmd_spec_prefer_family (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ static const struct decode_item choices[] = {
+ { "IPv4", prefer_ipv4 },
+ { "IPv6", prefer_ipv6 },
+ { "none", prefer_none },
+ };
+ int prefer_family = prefer_none;
+ int ok = decode_string (val, choices, countof (choices), &prefer_family);
+ if (!ok)
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val));
+ opt.prefer_family = prefer_family;
+ return ok;
+}
+
+/* Set progress.type to VAL, but verify that it's a valid progress
+ implementation before that. */
+
+static bool
+cmd_spec_progress (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ if (!valid_progress_implementation_p (val))
+ {
+ fprintf (stderr, _("%s: %s: Invalid progress type %s.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ xfree (opt.progress_type);
+
+ /* Don't call set_progress_implementation here. It will be called
+ in main when it becomes clear what the log output is. */
+ opt.progress_type = xstrdup (val);
+ return true;
+}
+
+/* Set opt.recursive to VAL as with cmd_boolean. If opt.recursive is
+ set to true, also set opt.dirstruct to true, unless opt.no_dirstruct
+ is specified. */
+
+static bool
+cmd_spec_recursive (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ if (!cmd_boolean (com, val, &opt.recursive))
+ return false;
+ else
+ {
+ if (opt.recursive && !opt.no_dirstruct)
+ opt.dirstruct = true;
+ }
+ return true;
+}
+
+/* Validate --regex-type and set the choice. */
+
+static bool
+cmd_spec_regex_type (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ static const struct decode_item choices[] = {
+ { "posix", regex_type_posix },
+#if defined HAVE_LIBPCRE || defined HAVE_LIBPCRE2
+ { "pcre", regex_type_pcre },
+#endif
+ };
+ int regex_type = regex_type_posix;
+ int ok = decode_string (val, choices, countof (choices), &regex_type);
+ if (!ok)
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val));
+ opt.regex_type = regex_type;
+ return ok;
+}
+
+static bool
+cmd_spec_restrict_file_names (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ int restrict_os = opt.restrict_files_os;
+ int restrict_ctrl = opt.restrict_files_ctrl;
+ int restrict_case = opt.restrict_files_case;
+ int restrict_nonascii = opt.restrict_files_nonascii;
+
+ const char *end;
+
+#define VAL_IS(string_literal) BOUNDED_EQUAL (val, end, string_literal)
+
+ do
+ {
+ end = strchr (val, ',');
+ if (!end)
+ end = val + strlen (val);
+
+ if (VAL_IS ("unix"))
+ restrict_os = restrict_unix;
+ else if (VAL_IS ("vms"))
+ restrict_os = restrict_vms;
+ else if (VAL_IS ("windows"))
+ restrict_os = restrict_windows;
+ else if (VAL_IS ("lowercase"))
+ restrict_case = restrict_lowercase;
+ else if (VAL_IS ("uppercase"))
+ restrict_case = restrict_uppercase;
+ else if (VAL_IS ("nocontrol"))
+ restrict_ctrl = false;
+ else if (VAL_IS ("ascii"))
+ restrict_nonascii = true;
+ else
+ {
+ fprintf (stderr, _("\
+%s: %s: Invalid restriction %s,\n\
+ use [unix|vms|windows],[lowercase|uppercase],[nocontrol],[ascii].\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+
+ if (*end)
+ val = end + 1;
+ }
+ while (*val && *end);
+
+#undef VAL_IS
+
+ opt.restrict_files_os = restrict_os;
+ opt.restrict_files_ctrl = restrict_ctrl;
+ opt.restrict_files_case = restrict_case;
+ opt.restrict_files_nonascii = restrict_nonascii;
+
+ return true;
+}
+
+static bool
+cmd_spec_report_speed (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ opt.report_bps = c_strcasecmp (val, "bits") == 0;
+ if (!opt.report_bps)
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val));
+ return opt.report_bps;
+}
+
+#ifdef HAVE_SSL
+static bool
+cmd_spec_secure_protocol (const char *com, const char *val, void *place)
+{
+ static const struct decode_item choices[] = {
+ { "auto", secure_protocol_auto },
+ { "sslv2", secure_protocol_sslv2 },
+ { "sslv3", secure_protocol_sslv3 },
+ { "tlsv1", secure_protocol_tlsv1 },
+ { "tlsv1_1", secure_protocol_tlsv1_1 },
+ { "tlsv1_2", secure_protocol_tlsv1_2 },
+ { "tlsv1_3", secure_protocol_tlsv1_3 },
+ { "pfs", secure_protocol_pfs },
+ };
+ int ok = decode_string (val, choices, countof (choices), place);
+ if (!ok)
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"), exec_name, com, quote (val));
+ return ok;
+}
+#endif
+
+/* Set all three timeout values. */
+
+static bool
+cmd_spec_timeout (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ double value;
+ if (!cmd_time (com, val, &value))
+ return false;
+ opt.read_timeout = value;
+ opt.connect_timeout = value;
+ opt.dns_timeout = value;
+ return true;
+}
+
+static bool
+cmd_spec_useragent (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ /* Disallow embedded newlines. */
+ if (strchr (val, '\n'))
+ {
+ fprintf (stderr, _("%s: %s: Invalid value %s.\n"),
+ exec_name, com, quote (val));
+ return false;
+ }
+ xfree (opt.useragent);
+ opt.useragent = xstrdup (val);
+ return true;
+}
+
+/* The --show-progress option is not a cmd_boolean since we need to keep track
+ * of whether the user explicitly requested the option or not. -1 means
+ * uninitialized. */
+static bool
+cmd_spec_progressdisp (const char *com, const char *val, void *place _GL_UNUSED)
+{
+ bool flag;
+ if (cmd_boolean (com, val, &flag))
+ {
+ opt.show_progress = flag;
+ return true;
+ }
+ return false;
+}
+
+
+/* The "verbose" option cannot be cmd_boolean because the variable is
+ not bool -- it's of type int (-1 means uninitialized because of
+ some random hackery for disallowing -q -v). */
+
+static bool
+cmd_spec_verbose (const char *com, const char *val, void *place_ignored _GL_UNUSED)
+{
+ bool flag;
+ if (cmd_boolean (com, val, &flag))
+ {
+ opt.verbose = flag;
+ opt.show_progress = -1;
+ return true;
+ }
+ return false;
+}
+
+/* Miscellaneous useful routines. */
+
+/* Trivial atof, with error reporting. Handles "<digits>[.<digits>]",
+ doesn't handle exponential notation. Returns true on success,
+ false on failure. In case of success, stores its result to
+ *DEST. */
+
+static bool
+simple_atof (const char *beg, const char *end, double *dest)
+{
+ double result = 0;
+
+ bool negative = false;
+ bool seen_dot = false;
+ bool seen_digit = false;
+ double divider = 1;
+
+ const char *p = beg;
+
+ while (p < end && c_isspace (*p))
+ ++p;
+ if (p < end && (*p == '-' || *p == '+'))
+ {
+ negative = (*p == '-');
+ ++p;
+ }
+
+ for (; p < end; p++)
+ {
+ char ch = *p;
+ if (c_isdigit (ch))
+ {
+ if (!seen_dot)
+ result = (10 * result) + (ch - '0');
+ else
+ result += (ch - '0') / (divider *= 10);
+ seen_digit = true;
+ }
+ else if (ch == '.')
+ {
+ if (!seen_dot)
+ seen_dot = true;
+ else
+ return false;
+ }
+ else
+ return false;
+ }
+ if (!seen_digit)
+ return false;
+ if (negative)
+ result = -result;
+
+ *dest = result;
+ return true;
+}
+
+/* Verify that the user-specified header in S is valid. It must
+ contain a colon preceded by non-white-space characters and must not
+ contain newlines. */
+
+static bool
+check_user_specified_header (const char *s)
+{
+ const char *p;
+
+ for (p = s; *p && *p != ':' && !c_isspace (*p); p++)
+ ;
+ /* The header MUST contain `:' preceded by at least one
+ non-whitespace character. */
+ if (*p != ':' || p == s)
+ return false;
+ /* The header MUST NOT contain newlines. */
+ if (strchr (s, '\n'))
+ return false;
+ return true;
+}
+
+/* Decode VAL into a number, according to ITEMS. */
+
+static bool
+decode_string (const char *val, const struct decode_item *items, int itemcount,
+ int *place)
+{
+ int i;
+ for (i = 0; i < itemcount; i++)
+ if (0 == c_strcasecmp (val, items[i].name))
+ {
+ *place = items[i].code;
+ return true;
+ }
+ return false;
+}
+
+extern struct ptimer *timer;
+extern int cleaned_up;
+
+/* Free the memory allocated by global variables. */
+void
+cleanup (void)
+{
+ /* Free external resources, close files, etc. */
+
+ if (cleaned_up++)
+ return; /* cleanup() must not be called twice */
+
+ /* Close WARC file. */
+ if (opt.warc_filename != 0)
+ warc_close ();
+
+ log_close ();
+
+ if (output_stream && output_stream != stderr)
+ {
+ FILE *fp = output_stream;
+ output_stream = NULL;
+ if (fclose (fp) == EOF)
+ inform_exit_status (CLOSEFAILED);
+ }
+
+ /* No need to check for error because Wget flushes its output (and
+ checks for errors) after any data arrives. */
+
+ /* We're exiting anyway so there's no real need to call free()
+ hundreds of times. Skipping the frees will make Wget exit
+ faster.
+ *
+ However, when detecting leaks, it's crucial to free() everything
+ because then you can find the real leaks, i.e. the allocated
+ memory which grows with the size of the program. */
+
+#if defined DEBUG_MALLOC || defined TESTING
+ convert_cleanup ();
+ res_cleanup ();
+ http_cleanup ();
+ cleanup_html_url ();
+ spider_cleanup ();
+ host_cleanup ();
+ log_cleanup ();
+ netrc_cleanup ();
+#ifdef HAVE_SSL
+ ssl_cleanup ();
+#endif
+ connect_cleanup ();
+
+ xfree (opt.choose_config);
+ xfree (opt.lfilename);
+ xfree (opt.dir_prefix);
+ xfree (opt.input_filename);
+#ifdef HAVE_METALINK
+ xfree (opt.input_metalink);
+ xfree (opt.preferred_location);
+#endif
+ xfree (opt.output_document);
+ xfree (opt.default_page);
+ if (opt.regex_type == regex_type_posix)
+ {
+ if (opt.acceptregex)
+ regfree (opt.acceptregex);
+ if (opt.rejectregex)
+ regfree (opt.rejectregex);
+ }
+ xfree (opt.acceptregex);
+ xfree (opt.rejectregex);
+ xfree (opt.acceptregex_s);
+ xfree (opt.rejectregex_s);
+ free_vec (opt.accepts);
+ free_vec (opt.rejects);
+ free_vec ((char **)opt.excludes);
+ free_vec ((char **)opt.includes);
+ free_vec (opt.domains);
+ free_vec (opt.exclude_domains);
+ free_vec (opt.follow_tags);
+ free_vec (opt.ignore_tags);
+ xfree (opt.progress_type);
+ xfree (opt.warc_filename);
+ xfree (opt.warc_tempdir);
+ xfree (opt.warc_cdx_dedup_filename);
+ xfree (opt.ftp_user);
+ xfree (opt.ftp_passwd);
+ xfree (opt.ftp_proxy);
+ xfree (opt.https_proxy);
+ xfree (opt.http_proxy);
+ free_vec (opt.no_proxy);
+ xfree (opt.proxy_user);
+ xfree (opt.proxy_passwd);
+ xfree (opt.useragent);
+ xfree (opt.referer);
+ xfree (opt.http_user);
+ xfree (opt.http_passwd);
+ xfree (opt.dot_style);
+ free_vec (opt.user_headers);
+ free_vec (opt.warc_user_headers);
+# ifdef HAVE_SSL
+ xfree (opt.cert_file);
+ xfree (opt.private_key);
+ xfree (opt.ca_directory);
+ xfree (opt.ca_cert);
+ xfree (opt.crl_file);
+ xfree (opt.pinnedpubkey);
+ xfree (opt.random_file);
+ xfree (opt.egd_file);
+# endif
+ xfree (opt.bind_address);
+ xfree (opt.cookies_input);
+ xfree (opt.cookies_output);
+ xfree (opt.user);
+ xfree (opt.passwd);
+ xfree (opt.base_href);
+ xfree (opt.method);
+ xfree (opt.post_file_name);
+ xfree (opt.post_data);
+ xfree (opt.body_data);
+ xfree (opt.body_file);
+ xfree (opt.rejected_log);
+ xfree (opt.use_askpass);
+ xfree (opt.retry_on_http_error);
+
+ xfree (opt.encoding_remote);
+ xfree (opt.locale);
+#ifdef HAVE_HSTS
+ xfree (opt.hsts_file);
+#endif
+
+ xfree (opt.wgetrcfile);
+ xfree (opt.homedir);
+ xfree (exec_name);
+ xfree (program_argstring);
+ ptimer_destroy (timer); timer = NULL;
+
+#ifdef HAVE_LIBCARES
+#include <ares.h>
+ {
+ extern ares_channel ares;
+
+ xfree (opt.bind_dns_address);
+ xfree (opt.dns_servers);
+ ares_destroy (ares);
+ ares_library_cleanup ();
+ }
+#endif
+
+ quotearg_free ();
+
+#endif /* DEBUG_MALLOC || TESTING */
+}
+
+/* Unit testing routines. */
+
+#ifdef TESTING
+
+const char *
+test_commands_sorted(void)
+{
+ unsigned i;
+
+ for (i = 1; i < countof(commands); ++i)
+ {
+ if (c_strcasecmp (commands[i - 1].name, commands[i].name) > 0)
+ {
+ mu_assert ("FAILED", false);
+ break;
+ }
+ }
+ return NULL;
+}
+
+const char *
+test_cmd_spec_restrict_file_names(void)
+{
+ unsigned i;
+ static const struct {
+ const char *val;
+ int expected_restrict_files_os;
+ bool expected_restrict_files_ctrl;
+ int expected_restrict_files_case;
+ bool result;
+ } test_array[] = {
+ { "windows", restrict_windows, true, restrict_no_case_restriction, true },
+ { "windows,", restrict_windows, true, restrict_no_case_restriction, true },
+ { "windows,lowercase", restrict_windows, true, restrict_lowercase, true },
+ { "unix,nocontrol,lowercase,", restrict_unix, false, restrict_lowercase, true },
+ };
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ bool res;
+
+ defaults();
+ res = cmd_spec_restrict_file_names ("dummy", test_array[i].val, NULL);
+
+ /*
+ fprintf (stderr, "test_cmd_spec_restrict_file_names: TEST %d\n", i); fflush (stderr);
+ fprintf (stderr, "opt.restrict_files_os: %d\n", opt.restrict_files_os); fflush (stderr);
+ fprintf (stderr, "opt.restrict_files_ctrl: %d\n", opt.restrict_files_ctrl); fflush (stderr);
+ fprintf (stderr, "opt.restrict_files_case: %d\n", opt.restrict_files_case); fflush (stderr);
+ */
+ mu_assert ("test_cmd_spec_restrict_file_names: wrong result",
+ res == test_array[i].result
+ && (int) opt.restrict_files_os == test_array[i].expected_restrict_files_os
+ && opt.restrict_files_ctrl == test_array[i].expected_restrict_files_ctrl
+ && (int) opt.restrict_files_case == test_array[i].expected_restrict_files_case);
+ }
+
+ return NULL;
+}
+
+#endif /* TESTING */
diff --git a/src/init.h b/src/init.h
new file mode 100644
index 0000000..a7619ce
--- /dev/null
+++ b/src/init.h
@@ -0,0 +1,48 @@
+/* Declarations for init.c.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef INIT_H
+#define INIT_H
+
+char *ajoin_dir_file (const char *, const char *);
+char *wgetrc_env_file_name (void);
+char *wgetrc_user_file_name (void);
+char *wgetrc_file_name (void);
+int initialize (void);
+void run_command (const char *);
+void setoptval (const char *, const char *, const char *);
+char *home_dir (void);
+void cleanup (void);
+void defaults (void);
+bool run_wgetrc (const char *file, file_stats_t *);
+
+#define MAX_LONGOPTION 26
+
+#endif /* INIT_H */
diff --git a/src/iri.c b/src/iri.c
new file mode 100644
index 0000000..afdadf7
--- /dev/null
+++ b/src/iri.c
@@ -0,0 +1,449 @@
+/* IRI related functions.
+ Copyright (C) 2008-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <langinfo.h>
+#include <errno.h>
+#ifdef HAVE_ICONV
+# include <iconv.h>
+#endif
+#include <idn2.h>
+#if IDN2_VERSION_NUMBER < 0x00140000
+# include <unicase.h>
+# include <unistr.h>
+#endif
+
+#include "utils.h"
+#include "url.h"
+#include "c-strcase.h"
+#include "c-strcasestr.h"
+#include "xstrndup.h"
+
+/* Note: locale encoding is kept in options struct (opt.locale) */
+
+/* Given a string containing "charset=XXX", return the encoding if found,
+ or NULL otherwise */
+char *
+parse_charset (const char *str)
+{
+ const char *end;
+ char *charset;
+
+ if (!str || !*str)
+ return NULL;
+
+ str = c_strcasestr (str, "charset=");
+ if (!str)
+ return NULL;
+
+ str += 8;
+ end = str;
+
+ /* sXXXav: which chars should be banned ??? */
+ while (*end && !c_isspace (*end))
+ end++;
+
+ /* sXXXav: could strdupdelim return NULL ? */
+ charset = strdupdelim (str, end);
+
+ /* Do a minimum check on the charset value */
+ if (!check_encoding_name (charset))
+ {
+ xfree (charset);
+ return NULL;
+ }
+
+ /*logprintf (LOG_VERBOSE, "parse_charset: %s\n", quote (charset));*/
+
+ return charset;
+}
+
+/* Find the locale used, or fall back on a default value */
+const char *
+find_locale (void)
+{
+ const char *encoding = nl_langinfo(CODESET);
+
+ if (!encoding || !*encoding)
+ return xstrdup("ASCII");
+
+ return xstrdup(encoding);
+}
+
+/* Basic check of an encoding name. */
+bool
+check_encoding_name (const char *encoding)
+{
+ const char *s = encoding;
+
+ while (*s)
+ {
+ if (!c_isascii (*s) || c_isspace (*s))
+ {
+ logprintf (LOG_VERBOSE, _("Encoding %s isn't valid\n"), quote (encoding));
+ return false;
+ }
+
+ s++;
+ }
+
+ return true;
+}
+
+#ifdef HAVE_ICONV
+/* Do the conversion according to the passed conversion descriptor cd. *out
+ will contain the transcoded string on success. *out content is
+ unspecified otherwise. */
+static bool
+do_conversion (const char *tocode, const char *fromcode, char const *in_org, size_t inlen, char **out)
+{
+ iconv_t cd;
+ /* sXXXav : hummm hard to guess... */
+ size_t len, done, outlen;
+ int invalid = 0, tooshort = 0;
+ char *s, *in, *in_save;
+
+ cd = iconv_open (tocode, fromcode);
+ if (cd == (iconv_t)(-1))
+ {
+ logprintf (LOG_VERBOSE, _("Conversion from %s to %s isn't supported\n"),
+ quote (fromcode), quote (tocode));
+ *out = NULL;
+ return false;
+ }
+
+ /* iconv() has to work on an unescaped string */
+ in_save = in = xstrndup (in_org, inlen);
+ url_unescape_except_reserved (in);
+ inlen = strlen(in);
+
+ len = outlen = inlen * 2;
+ *out = s = xmalloc (outlen + 1);
+ done = 0;
+
+ for (;;)
+ {
+ if (iconv (cd, (ICONV_CONST char **) &in, &inlen, out, &outlen) != (size_t)(-1) &&
+ iconv (cd, NULL, NULL, out, &outlen) != (size_t)(-1))
+ {
+ *out = s;
+ *(s + len - outlen - done) = '\0';
+ xfree(in_save);
+ iconv_close(cd);
+ IF_DEBUG
+ {
+ /* not not print out embedded passwords, in_org might be an URL */
+ if (!strchr(in_org, '@') && !strchr(*out, '@'))
+ debug_logprintf ("converted '%s' (%s) -> '%s' (%s)\n", in_org, fromcode, *out, tocode);
+ else
+ debug_logprintf ("logging suppressed, strings may contain password\n");
+ }
+ return true;
+ }
+
+ /* Incomplete or invalid multibyte sequence */
+ if (errno == EINVAL || errno == EILSEQ)
+ {
+ if (!invalid)
+ logprintf (LOG_VERBOSE,
+ _("Incomplete or invalid multibyte sequence encountered\n"));
+
+ invalid++;
+ **out = *in;
+ in++;
+ inlen--;
+ (*out)++;
+ outlen--;
+ }
+ else if (errno == E2BIG) /* Output buffer full */
+ {
+ tooshort++;
+ done = len;
+ len = done + inlen * 2;
+ s = xrealloc (s, len + 1);
+ *out = s + done - outlen;
+ outlen += inlen * 2;
+ }
+ else /* Weird, we got an unspecified error */
+ {
+ logprintf (LOG_VERBOSE, _("Unhandled errno %d\n"), errno);
+ break;
+ }
+ }
+
+ xfree(in_save);
+ iconv_close(cd);
+ IF_DEBUG
+ {
+ /* not not print out embedded passwords, in_org might be an URL */
+ if (!strchr(in_org, '@') && !strchr(*out, '@'))
+ debug_logprintf ("converted '%s' (%s) -> '%s' (%s)\n", in_org, fromcode, *out, tocode);
+ else
+ debug_logprintf ("logging suppressed, strings may contain password\n");
+ }
+ return false;
+}
+#else
+static bool
+do_conversion (const char *tocode _GL_UNUSED, const char *fromcode _GL_UNUSED,
+ char const *in_org _GL_UNUSED, size_t inlen _GL_UNUSED, char **out)
+{
+ *out = NULL;
+ return false;
+}
+#endif
+
+/* Try converting string str from locale to UTF-8. Return a new string
+ on success, or str on error or if conversion isn't needed. */
+const char *
+locale_to_utf8 (const char *str)
+{
+ char *new;
+
+ /* That shouldn't happen, just in case */
+ if (!opt.locale)
+ {
+ logprintf (LOG_VERBOSE, _("locale_to_utf8: locale is unset\n"));
+ opt.locale = find_locale ();
+ }
+
+ if (!opt.locale || !c_strcasecmp (opt.locale, "utf-8"))
+ return str;
+
+ if (do_conversion ("UTF-8", opt.locale, (char *) str, strlen ((char *) str), &new))
+ return (const char *) new;
+
+ xfree (new);
+ return str;
+}
+
+/* Try to "ASCII encode" UTF-8 host. Return the new domain on success or NULL
+ on error. */
+char *
+idn_encode (const struct iri *i, const char *host)
+{
+ int ret;
+ char *ascii_encoded;
+ char *utf8_encoded = NULL;
+ const char *src;
+#if IDN2_VERSION_NUMBER < 0x00140000
+ uint8_t *lower;
+ size_t len = 0;
+#endif
+
+ /* Encode to UTF-8 if not done */
+ if (!i->utf8_encode)
+ {
+ if (!remote_to_utf8 (i, host, &utf8_encoded))
+ return NULL; /* Nothing to encode or an error occurred */
+ src = utf8_encoded;
+ }
+ else
+ src = host;
+
+#if IDN2_VERSION_NUMBER >= 0x00140000
+ /* IDN2_TRANSITIONAL implies input NFC encoding */
+ ret = idn2_lookup_u8 ((uint8_t *) src, (uint8_t **) &ascii_encoded, IDN2_NONTRANSITIONAL);
+ if (ret != IDN2_OK)
+ /* fall back to TR46 Transitional mode, max IDNA2003 compatibility */
+ ret = idn2_lookup_u8 ((uint8_t *) src, (uint8_t **) &ascii_encoded, IDN2_TRANSITIONAL);
+
+ if (ret != IDN2_OK)
+ logprintf (LOG_VERBOSE, _("idn_encode failed (%d): %s\n"), ret,
+ quote (idn2_strerror (ret)));
+#else
+ /* we need a conversion to lowercase */
+ lower = u8_tolower ((uint8_t *) src, u8_strlen ((uint8_t *) src) + 1, 0, UNINORM_NFKC, NULL, &len);
+ if (!lower)
+ {
+ logprintf (LOG_VERBOSE, _("Failed to convert to lower: %d: %s\n"),
+ errno, quote (src));
+ xfree (utf8_encoded);
+ return NULL;
+ }
+
+ if ((ret = idn2_lookup_u8 (lower, (uint8_t **) &ascii_encoded, IDN2_NFC_INPUT)) != IDN2_OK)
+ {
+ logprintf (LOG_VERBOSE, _("idn_encode failed (%d): %s\n"), ret,
+ quote (idn2_strerror (ret)));
+ }
+
+ xfree (lower);
+#endif
+
+ xfree (utf8_encoded);
+
+ if (ret == IDN2_OK && ascii_encoded)
+ {
+ char *tmp = xstrdup (ascii_encoded);
+ idn2_free (ascii_encoded);
+ ascii_encoded = tmp;
+ }
+
+ return ret == IDN2_OK ? ascii_encoded : NULL;
+}
+
+/* Try to decode an "ASCII encoded" host. Return the new domain in the locale
+ on success or NULL on error. */
+char *
+idn_decode (const char *host)
+{
+/*
+ char *new;
+ int ret;
+
+ ret = idn2_register_u8 (NULL, host, (uint8_t **) &new, 0);
+ if (ret != IDN2_OK)
+ {
+ logprintf (LOG_VERBOSE, _("idn2_register_u8 failed (%d): %s: %s\n"), ret,
+ quote (idn2_strerror (ret)), host);
+ return NULL;
+ }
+
+ return new;
+*/
+ /* idn2_register_u8() just works label by label.
+ * That is pretty much overhead for just displaying the original ulabels.
+ * To keep at least the debug output format, return a cloned host. */
+ return xstrdup(host);
+}
+
+/* Try to transcode string str from remote encoding to UTF-8. On success, *new
+ contains the transcoded string. *new content is unspecified otherwise. */
+bool
+remote_to_utf8 (const struct iri *iri, const char *str, char **new)
+{
+ bool ret = false;
+
+ if (!iri->uri_encoding)
+ return false;
+
+ /* When `i->uri_encoding' == "UTF-8" there is nothing to convert. But we must
+ test for non-ASCII symbols for correct hostname processing in `idn_encode'
+ function. */
+ if (!c_strcasecmp (iri->uri_encoding, "UTF-8"))
+ {
+ const unsigned char *p;
+ for (p = (unsigned char *) str; *p; p++)
+ if (*p > 127)
+ {
+ *new = strdup (str);
+ return true;
+ }
+ return false;
+ }
+
+ if (do_conversion ("UTF-8", iri->uri_encoding, str, strlen (str), new))
+ ret = true;
+
+ /* Test if something was converted */
+ if (*new && !strcmp (str, *new))
+ {
+ xfree (*new);
+ return false;
+ }
+
+ return ret;
+}
+
+/* Allocate a new iri structure and return a pointer to it. */
+struct iri *
+iri_new (void)
+{
+ struct iri *i = xmalloc (sizeof *i);
+ i->uri_encoding = opt.encoding_remote ? xstrdup (opt.encoding_remote) : NULL;
+ i->content_encoding = NULL;
+ i->orig_url = NULL;
+ i->utf8_encode = opt.enable_iri;
+ return i;
+}
+
+struct iri *iri_dup (const struct iri *src)
+{
+ struct iri *i = xmalloc (sizeof *i);
+ i->uri_encoding = src->uri_encoding ? xstrdup (src->uri_encoding) : NULL;
+ i->content_encoding = (src->content_encoding ?
+ xstrdup (src->content_encoding) : NULL);
+ i->orig_url = src->orig_url ? xstrdup (src->orig_url) : NULL;
+ i->utf8_encode = src->utf8_encode;
+ return i;
+}
+
+/* Completely free an iri structure. */
+void
+iri_free (struct iri *i)
+{
+ if (i)
+ {
+ xfree (i->uri_encoding);
+ xfree (i->content_encoding);
+ xfree (i->orig_url);
+ xfree (i);
+ }
+}
+
+/* Set uri_encoding of struct iri i. If a remote encoding was specified, use
+ it unless force is true. */
+void
+set_uri_encoding (struct iri *i, const char *charset, bool force)
+{
+ DEBUGP (("URI encoding = %s\n", charset ? quote (charset) : "None"));
+ if (!force && opt.encoding_remote)
+ return;
+ if (i->uri_encoding)
+ {
+ if (charset && !c_strcasecmp (i->uri_encoding, charset))
+ return;
+ xfree (i->uri_encoding);
+ }
+
+ i->uri_encoding = charset ? xstrdup (charset) : NULL;
+}
+
+/* Set content_encoding of struct iri i. */
+void
+set_content_encoding (struct iri *i, const char *charset)
+{
+ DEBUGP (("URI content encoding = %s\n", charset ? quote (charset) : "None"));
+ if (opt.encoding_remote)
+ return;
+ if (i->content_encoding)
+ {
+ if (charset && !c_strcasecmp (i->content_encoding, charset))
+ return;
+ xfree (i->content_encoding);
+ }
+
+ i->content_encoding = charset ? xstrdup (charset) : NULL;
+}
diff --git a/src/iri.h b/src/iri.h
new file mode 100644
index 0000000..c6b75e8
--- /dev/null
+++ b/src/iri.h
@@ -0,0 +1,75 @@
+/* Internationalization related declarations.
+ Copyright (C) 2008-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef IRI_H
+#define IRI_H
+
+struct iri {
+ char *uri_encoding; /* Encoding of the uri to fetch */
+ char *content_encoding; /* Encoding of links inside the fetched file */
+ char *orig_url; /* */
+ bool utf8_encode; /* Will/Is the current url encoded in utf8 */
+};
+
+#ifdef ENABLE_IRI
+
+char *parse_charset (const char *str);
+const char *find_locale (void);
+bool check_encoding_name (const char *encoding);
+const char *locale_to_utf8 (const char *str);
+char *idn_encode (const struct iri *i, const char *host);
+char *idn_decode (const char *host);
+bool remote_to_utf8 (const struct iri *i, const char *str, char **newstr);
+struct iri *iri_new (void);
+struct iri *iri_dup (const struct iri *);
+void iri_free (struct iri *i);
+void set_uri_encoding (struct iri *i, const char *charset, bool force);
+void set_content_encoding (struct iri *i, const char *charset);
+
+#else /* ENABLE_IRI */
+
+extern struct iri dummy_iri;
+
+#define parse_charset(str) NULL
+#define find_locale() NULL
+#define check_encoding_name(str) false
+#define locale_to_utf8(str) (str)
+#define idn_encode(a,b) NULL
+#define idn_decode(str) NULL
+#define idn2_free(str) ((void)0)
+#define remote_to_utf8(a,b,c) false
+#define iri_new() (&dummy_iri)
+#define iri_dup(a) (&dummy_iri)
+#define iri_free(a)
+#define set_uri_encoding(a,b,c)
+#define set_content_encoding(a,b)
+
+#endif /* ENABLE_IRI */
+#endif /* IRI_H */
diff --git a/src/log.c b/src/log.c
new file mode 100644
index 0000000..7de23ee
--- /dev/null
+++ b/src/log.c
@@ -0,0 +1,995 @@
+/* Messages logging.
+ Copyright (C) 1998-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+
+#include "utils.h"
+#include "exits.h"
+#include "log.h"
+
+/* 2005-10-25 SMS.
+ VMS log files are often VFC record format, not stream, so fputs() can
+ produce multiple records, even when there's no newline terminator in
+ the buffer. The result is unsightly output with spurious newlines.
+ Using fprintf() instead of fputs(), along with inhibiting some
+ fflush() activity below, seems to solve the problem.
+*/
+#ifdef __VMS
+# define FPUTS( s, f) fprintf( (f), "%s", (s))
+#else /* def __VMS */
+# define FPUTS( s, f) fputs( (s), (f))
+#endif /* def __VMS [else] */
+
+/* This file implements support for "logging". Logging means printing
+ output, plus several additional features:
+
+ - Cataloguing output by importance. You can specify that a log
+ message is "verbose" or "debug", and it will not be printed unless
+ in verbose or debug mode, respectively.
+
+ - Redirecting the log to the file. When Wget's output goes to the
+ terminal, and Wget receives SIGHUP, all further output is
+ redirected to a log file. When this is the case, Wget can also
+ print the last several lines of "context" to the log file so that
+ it does not begin in the middle of a line. For this to work, the
+ logging code stores the last several lines of context. Callers may
+ request for certain output not to be stored.
+
+ - Inhibiting output. When Wget receives SIGHUP, but redirecting
+ the output fails, logging is inhibited. */
+
+
+/* The file descriptor used for logging. This is NULL before log_init
+ is called; logging functions log to stderr then. log_init sets it
+ either to stderr or to a file pointer obtained from fopen(). If
+ logging is inhibited, logfp is set back to NULL. */
+static FILE *logfp;
+
+/* Descriptor of the stdout|stderr */
+static FILE *stdlogfp;
+
+/* Descriptor of the wget.log* file (if created) */
+static FILE *filelogfp;
+
+/* Name of log file */
+static char *logfile;
+
+/* Is interactive shell ? */
+static int shell_is_interactive;
+
+/* A second file descriptor pointing to the temporary log file for the
+ WARC writer. If WARC writing is disabled, this is NULL. */
+static FILE *warclogfp;
+
+/* If true, it means logging is inhibited, i.e. nothing is printed or
+ stored. */
+static bool inhibit_logging;
+
+/* Whether the last output lines are stored for use as context. */
+static bool save_context_p;
+
+/* Whether the log is flushed after each command. */
+static bool flush_log_p = true;
+
+/* Whether any output has been received while flush_log_p was 0. */
+static bool needs_flushing;
+
+/* In the event of a hang-up, and if its output was on a TTY, Wget
+ redirects its output to `wget-log'.
+
+ For the convenience of reading this newly-created log, we store the
+ last several lines ("screenful", hence the choice of 24) of Wget
+ output, and dump them as context when the time comes. */
+#define SAVED_LOG_LINES 24
+
+/* log_lines is a circular buffer that stores SAVED_LOG_LINES lines of
+ output. log_line_current always points to the position in the
+ buffer that will be written to next. When log_line_current reaches
+ SAVED_LOG_LINES, it is reset to zero.
+
+ The problem here is that we'd have to either (re)allocate and free
+ strings all the time, or limit the lines to an arbitrary number of
+ characters. Instead of settling for either of these, we do both:
+ if the line is smaller than a certain "usual" line length (128
+ chars by default), a preallocated memory is used. The rare lines
+ that are longer than 128 characters are malloc'ed and freed
+ separately. This gives good performance with minimum memory
+ consumption and fragmentation. */
+
+#define STATIC_LENGTH 128
+
+static struct log_ln {
+ char static_line[STATIC_LENGTH + 1]; /* statically allocated
+ line. */
+ char *malloced_line; /* malloc'ed line, for lines of output
+ larger than 80 characters. */
+ char *content; /* this points either to malloced_line
+ or to the appropriate static_line.
+ If this is NULL, it means the line
+ has not yet been used. */
+} log_lines[SAVED_LOG_LINES];
+
+/* The current position in the ring. */
+static int log_line_current = -1;
+
+/* Whether the most recently written line was "trailing", i.e. did not
+ finish with \n. This is an important piece of information because
+ the code is always careful to append data to trailing lines, rather
+ than create new ones. */
+static bool trailing_line;
+
+static void check_redirect_output (void);
+
+#define ROT_ADVANCE(num) do { \
+ if (++num >= SAVED_LOG_LINES) \
+ num = 0; \
+} while (0)
+
+/* Free the log line index with NUM. This calls free on
+ ln->malloced_line if it's non-NULL, and it also resets
+ ln->malloced_line and ln->content to NULL. */
+
+static void
+free_log_line (int num)
+{
+ struct log_ln *ln = log_lines + num;
+ xfree (ln->malloced_line);
+ ln->content = NULL;
+}
+
+/* Append bytes in the range [start, end) to one line in the log. The
+ region is not supposed to contain newlines, except for the last
+ character (at end[-1]). */
+
+static void
+saved_append_1 (const char *start, const char *end)
+{
+ int len = end - start;
+ if (!len)
+ return;
+
+ /* First, check whether we need to append to an existing line or to
+ create a new one. */
+ if (!trailing_line)
+ {
+ /* Create a new line. */
+ struct log_ln *ln;
+
+ if (log_line_current == -1)
+ log_line_current = 0;
+ else
+ free_log_line (log_line_current);
+ ln = log_lines + log_line_current;
+ if (len > STATIC_LENGTH)
+ {
+ ln->malloced_line = strdupdelim (start, end);
+ ln->content = ln->malloced_line;
+ }
+ else
+ {
+ memcpy (ln->static_line, start, len);
+ ln->static_line[len] = '\0';
+ ln->content = ln->static_line;
+ }
+ }
+ else
+ {
+ /* Append to the last line. If the line is malloc'ed, we just
+ call realloc and append the new string. If the line is
+ static, we have to check whether appending the new string
+ would make it exceed STATIC_LENGTH characters, and if so,
+ convert it to malloc(). */
+ struct log_ln *ln = log_lines + log_line_current;
+ if (ln->malloced_line)
+ {
+ /* Resize malloc'ed line and append. */
+ int old_len = strlen (ln->malloced_line);
+ ln->malloced_line = xrealloc (ln->malloced_line, old_len + len + 1);
+ memcpy (ln->malloced_line + old_len, start, len);
+ ln->malloced_line[old_len + len] = '\0';
+ /* might have changed due to realloc */
+ ln->content = ln->malloced_line;
+ }
+ else
+ {
+ int old_len = strlen (ln->static_line);
+ if (old_len + len > STATIC_LENGTH)
+ {
+ /* Allocate memory and concatenate the old and the new
+ contents. */
+ ln->malloced_line = xmalloc (old_len + len + 1);
+ memcpy (ln->malloced_line, ln->static_line,
+ old_len);
+ memcpy (ln->malloced_line + old_len, start, len);
+ ln->malloced_line[old_len + len] = '\0';
+ ln->content = ln->malloced_line;
+ }
+ else
+ {
+ /* Just append to the old, statically allocated
+ contents. */
+ memcpy (ln->static_line + old_len, start, len);
+ ln->static_line[old_len + len] = '\0';
+ ln->content = ln->static_line;
+ }
+ }
+ }
+ trailing_line = !(end[-1] == '\n');
+ if (!trailing_line)
+ ROT_ADVANCE (log_line_current);
+}
+
+/* Log the contents of S, as explained above. If S consists of
+ multiple lines, they are logged separately. If S does not end with
+ a newline, it will form a "trailing" line, to which things will get
+ appended the next time this function is called. */
+
+static void
+saved_append (const char *s)
+{
+ while (*s)
+ {
+ const char *end = strchr (s, '\n');
+ if (!end)
+ end = s + strlen (s);
+ else
+ ++end;
+ saved_append_1 (s, end);
+ s = end;
+ }
+}
+
+/* Check X against opt.verbose and opt.quiet. The semantics is as
+ follows:
+
+ * LOG_ALWAYS - print the message unconditionally;
+
+ * LOG_NOTQUIET - print the message if opt.quiet is non-zero;
+
+ * LOG_NONVERBOSE - print the message if opt.verbose is zero;
+
+ * LOG_VERBOSE - print the message if opt.verbose is non-zero. */
+#define CHECK_VERBOSE(x) \
+ switch (x) \
+ { \
+ case LOG_PROGRESS: \
+ if (!opt.show_progress) \
+ return; \
+ break; \
+ case LOG_ALWAYS: \
+ break; \
+ case LOG_NOTQUIET: \
+ if (opt.quiet) \
+ return; \
+ break; \
+ case LOG_NONVERBOSE: \
+ if (opt.verbose || opt.quiet) \
+ return; \
+ break; \
+ case LOG_VERBOSE: \
+ if (!opt.verbose) \
+ return; \
+ }
+
+/* Returns the file descriptor for logging. This is LOGFP, except if
+ called before log_init, in which case it returns stderr. This is
+ useful in case someone calls a logging function before log_init.
+
+ If logging is inhibited, return NULL. */
+
+static FILE *
+get_log_fp (void)
+{
+ if (inhibit_logging)
+ return NULL;
+ if (logfp)
+ return logfp;
+ return stderr;
+}
+
+static FILE *
+get_progress_fp (void)
+{
+ if (opt.show_progress == true)
+ return stderr;
+ return get_log_fp();
+}
+
+/* Returns the file descriptor for the secondary log file. This is
+ WARCLOGFP, except if called before log_init, in which case it
+ returns stderr. This is useful in case someone calls a logging
+ function before log_init.
+
+ If logging is inhibited, return NULL. */
+
+static FILE *
+get_warc_log_fp (void)
+{
+ if (inhibit_logging)
+ return NULL;
+ if (warclogfp)
+ return warclogfp;
+ if (logfp)
+ return NULL;
+ return stderr;
+}
+
+/* Sets the file descriptor for the secondary log file. */
+
+void
+log_set_warc_log_fp (FILE * fp)
+{
+ warclogfp = fp;
+}
+
+/* Log a literal string S. The string is logged as-is, without a
+ newline appended. */
+
+void
+logputs (enum log_options o, const char *s)
+{
+ FILE *fp;
+ FILE *warcfp;
+ int errno_save = errno;
+
+ check_redirect_output ();
+ if (o == LOG_PROGRESS)
+ fp = get_progress_fp ();
+ else
+ fp = get_log_fp ();
+
+ errno = errno_save;
+
+ if (fp == NULL)
+ return;
+
+ warcfp = get_warc_log_fp ();
+ errno = errno_save;
+
+ CHECK_VERBOSE (o);
+
+ FPUTS (s, fp);
+ if (warcfp != NULL)
+ FPUTS (s, warcfp);
+ if (save_context_p)
+ saved_append (s);
+ if (flush_log_p)
+ logflush ();
+ else
+ needs_flushing = true;
+
+ errno = errno_save;
+}
+
+struct logvprintf_state {
+ char *bigmsg;
+ int expected_size;
+ int allocated;
+};
+
+/* Print a message to the log. A copy of message will be saved to
+ saved_log, for later reusal by log_dump_context().
+
+ Normally we'd want this function to loop around vsnprintf until
+ sufficient room is allocated, as the Linux man page recommends.
+ However each call to vsnprintf() must be preceded by va_start and
+ followed by va_end. Since calling va_start/va_end is possible only
+ in the function that contains the `...' declaration, we cannot call
+ vsnprintf more than once. Therefore this function saves its state
+ to logvprintf_state and signals the parent to call it again.
+
+ (An alternative approach would be to use va_copy, but that's not
+ portable.) */
+
+static bool GCC_FORMAT_ATTR (2, 0)
+log_vprintf_internal (struct logvprintf_state *state, const char *fmt,
+ va_list args)
+{
+ char smallmsg[128];
+ char *write_ptr = smallmsg;
+ int available_size = sizeof (smallmsg);
+ int numwritten;
+ FILE *fp = get_log_fp ();
+ FILE *warcfp = get_warc_log_fp ();
+
+ if (fp == NULL)
+ return false;
+
+ if (!save_context_p && warcfp == NULL)
+ {
+ /* In the simple case just call vfprintf(), to avoid needless
+ allocation and games with vsnprintf(). */
+ vfprintf (fp, fmt, args);
+ goto flush;
+ }
+
+ if (state->allocated != 0)
+ {
+ write_ptr = state->bigmsg;
+ available_size = state->allocated;
+ }
+
+ /* The GNU coding standards advise not to rely on the return value
+ of sprintf(). However, vsnprintf() is a relatively new function
+ missing from legacy systems. Therefore I consider it safe to
+ assume that its return value is meaningful. On the systems where
+ vsnprintf() is not available, we use the implementation from
+ snprintf.c which does return the correct value. */
+ numwritten = vsnprintf (write_ptr, available_size, fmt, args);
+
+ /* vsnprintf() will not step over the limit given by available_size.
+ If it fails, it returns either -1 (older implementations) or the
+ number of characters (not counting the terminating \0) that
+ *would have* been written if there had been enough room (C99).
+ In the former case, we double available_size and malloc to get a
+ larger buffer, and try again. In the latter case, we use the
+ returned information to build a buffer of the correct size. */
+
+ if (numwritten == -1)
+ {
+ /* Writing failed, and we don't know the needed size. Try
+ again with doubled size. */
+ int newsize = available_size << 1;
+ state->bigmsg = xrealloc (state->bigmsg, newsize);
+ state->allocated = newsize;
+ return false;
+ }
+ else if (numwritten >= available_size)
+ {
+ /* Writing failed, but we know exactly how much space we
+ need. */
+ int newsize = numwritten + 1;
+ state->bigmsg = xrealloc (state->bigmsg, newsize);
+ state->allocated = newsize;
+ return false;
+ }
+
+ /* Writing succeeded. */
+ if (save_context_p)
+ saved_append (write_ptr);
+ FPUTS (write_ptr, fp);
+ if (warcfp != NULL && warcfp != fp)
+ FPUTS (write_ptr, warcfp);
+ xfree (state->bigmsg);
+
+ flush:
+ if (flush_log_p)
+ logflush ();
+ else
+ needs_flushing = true;
+
+ return true;
+}
+
+/* Flush LOGFP. Useful while flushing is disabled. */
+void
+logflush (void)
+{
+ FILE *fp = get_log_fp ();
+ FILE *warcfp = get_warc_log_fp ();
+ if (fp)
+ {
+/* 2005-10-25 SMS.
+ On VMS, flush only for a terminal. See note at FPUTS macro, above.
+*/
+#ifdef __VMS
+ if (isatty( fileno( fp)))
+ {
+ fflush (fp);
+ }
+#else /* def __VMS */
+ fflush (fp);
+#endif /* def __VMS [else] */
+ }
+
+ if (warcfp != NULL)
+ fflush (warcfp);
+
+ needs_flushing = false;
+}
+
+/* Enable or disable log flushing. */
+void
+log_set_flush (bool flush)
+{
+ if (flush == flush_log_p)
+ return;
+
+ if (flush == false)
+ {
+ /* Disable flushing by setting flush_log_p to 0. */
+ flush_log_p = false;
+ }
+ else
+ {
+ /* Re-enable flushing. If anything was printed in no-flush mode,
+ flush the log now. */
+ if (needs_flushing)
+ logflush ();
+ flush_log_p = true;
+ }
+}
+
+/* (Temporarily) disable storing log to memory. Returns the old
+ status of storing, with which this function can be called again to
+ reestablish storing. */
+
+bool
+log_set_save_context (bool savep)
+{
+ bool old = save_context_p;
+ save_context_p = savep;
+ return old;
+}
+
+/* Print a message to the screen or to the log. The first argument
+ defines the verbosity of the message, and the rest are as in
+ printf(3). */
+
+void
+logprintf (enum log_options o, const char *fmt, ...)
+{
+ va_list args;
+ struct logvprintf_state lpstate;
+ bool done;
+ int errno_saved = errno;
+
+ check_redirect_output ();
+ errno = errno_saved;
+ if (inhibit_logging)
+ return;
+ CHECK_VERBOSE (o);
+
+ xzero (lpstate);
+ errno = 0;
+ do
+ {
+ va_start (args, fmt);
+ done = log_vprintf_internal (&lpstate, fmt, args);
+ va_end (args);
+
+ if (done && errno == EPIPE)
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ while (!done);
+
+ errno = errno_saved;
+}
+
+#ifdef ENABLE_DEBUG
+/* The same as logprintf(), but does anything only if opt.debug is
+ true. */
+void
+debug_logprintf (const char *fmt, ...)
+{
+ if (opt.debug)
+ {
+ va_list args;
+ struct logvprintf_state lpstate;
+ bool done;
+
+#ifndef TESTING
+ check_redirect_output ();
+#endif
+ if (inhibit_logging)
+ return;
+
+ xzero (lpstate);
+ do
+ {
+ va_start (args, fmt);
+ done = log_vprintf_internal (&lpstate, fmt, args);
+ va_end (args);
+ }
+ while (!done);
+ }
+}
+#endif /* ENABLE_DEBUG */
+
+/* Open FILE and set up a logging stream. If FILE cannot be opened,
+ exit with status of 1. */
+void
+log_init (const char *file, bool appendp)
+{
+ if (file)
+ {
+ if (HYPHENP (file))
+ {
+ stdlogfp = stdout;
+ logfp = stdlogfp;
+ }
+ else
+ {
+ filelogfp = fopen (file, appendp ? "a" : "w");
+ if (!filelogfp)
+ {
+ fprintf (stderr, "%s: %s: %s\n", exec_name, file, strerror (errno));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ logfp = filelogfp;
+ }
+ }
+ else
+ {
+ /* The log goes to stderr to avoid collisions with the output if
+ the user specifies `-O -'. #### Francois Pinard suggests
+ that it's a better idea to print to stdout by default, and to
+ stderr only if the user actually specifies `-O -'. He says
+ this inconsistency is harder to document, but is overall
+ easier on the user. */
+ stdlogfp = stderr;
+ logfp = stdlogfp;
+
+ if (1
+#ifdef HAVE_ISATTY
+ && isatty (fileno (logfp))
+#endif
+ )
+ {
+ /* If the output is a TTY, enable save context, i.e. store
+ the most recent several messages ("context") and dump
+ them to a log file in case SIGHUP or SIGUSR1 is received
+ (or Ctrl+Break is pressed under Windows). */
+ save_context_p = true;
+ }
+ }
+
+#ifndef WINDOWS
+ /* Initialize this values so we don't have to ask every time we print line */
+ shell_is_interactive = isatty (STDIN_FILENO);
+#endif
+}
+
+/* Close LOGFP (only if we opened it, not if it's stderr), inhibit
+ further logging and free the memory associated with it. */
+void
+log_close (void)
+{
+ int i;
+
+ if (logfp && logfp != stderr && logfp != stdout)
+ {
+ if (logfp == stdlogfp)
+ stdlogfp = NULL;
+ if (logfp == filelogfp)
+ filelogfp = NULL;
+ fclose (logfp);
+ }
+ logfp = NULL;
+
+ inhibit_logging = true;
+ save_context_p = false;
+
+ for (i = 0; i < SAVED_LOG_LINES; i++)
+ free_log_line (i);
+ log_line_current = -1;
+ trailing_line = false;
+}
+
+/* Dump saved lines to logfp. */
+static void
+log_dump_context (void)
+{
+ int num = log_line_current;
+ FILE *fp = get_log_fp ();
+ FILE *warcfp = get_warc_log_fp ();
+ if (!fp)
+ return;
+
+ if (num == -1)
+ return;
+ if (trailing_line)
+ ROT_ADVANCE (num);
+ do
+ {
+ struct log_ln *ln = log_lines + num;
+ if (ln->content)
+ {
+ FPUTS (ln->content, fp);
+ if (warcfp != NULL)
+ FPUTS (ln->content, warcfp);
+ }
+ ROT_ADVANCE (num);
+ }
+ while (num != log_line_current);
+ if (trailing_line)
+ if (log_lines[log_line_current].content)
+ {
+ FPUTS (log_lines[log_line_current].content, fp);
+ if (warcfp != NULL)
+ FPUTS (log_lines[log_line_current].content, warcfp);
+ }
+ fflush (fp);
+ fflush (warcfp);
+}
+
+/* String escape functions. */
+
+/* Return the number of non-printable characters in SOURCE.
+ Non-printable characters are determined as per c-ctype.c. */
+
+static int
+count_nonprint (const char *source)
+{
+ const char *p;
+ int cnt;
+ for (p = source, cnt = 0; *p; p++)
+ if (!c_isprint (*p))
+ ++cnt;
+ return cnt;
+}
+
+/* Copy SOURCE to DEST, escaping non-printable characters.
+
+ Non-printable refers to anything outside the non-control ASCII
+ range (32-126) which means that, for example, CR, LF, and TAB are
+ considered non-printable along with ESC, BS, and other control
+ chars. This is by design: it makes sure that messages from remote
+ servers cannot be easily used to deceive the users by mimicking
+ Wget's output. Disallowing non-ASCII characters is another
+ necessary security measure, which makes sure that remote servers
+ cannot garble the screen or guess the local charset and perform
+ homographic attacks.
+
+ Of course, the above mandates that escnonprint only be used in
+ contexts expected to be ASCII, such as when printing host names,
+ URL components, HTTP headers, FTP server messages, and the like.
+
+ ESCAPE is the leading character of the escape sequence. BASE
+ should be the base of the escape sequence, and must be either 8 for
+ octal or 16 for hex.
+
+ DEST must point to a location with sufficient room to store an
+ encoded version of SOURCE. */
+
+static void
+copy_and_escape (const char *source, char *dest, char escape, int base)
+{
+ const char *from = source;
+ char *to = dest;
+ unsigned char c;
+
+ /* Copy chars from SOURCE to DEST, escaping non-printable ones. */
+ switch (base)
+ {
+ case 8:
+ while ((c = *from++) != '\0')
+ if (c_isprint (c))
+ *to++ = c;
+ else
+ {
+ *to++ = escape;
+ *to++ = '0' + (c >> 6);
+ *to++ = '0' + ((c >> 3) & 7);
+ *to++ = '0' + (c & 7);
+ }
+ break;
+ case 16:
+ while ((c = *from++) != '\0')
+ if (c_isprint (c))
+ *to++ = c;
+ else
+ {
+ *to++ = escape;
+ *to++ = XNUM_TO_DIGIT (c >> 4);
+ *to++ = XNUM_TO_DIGIT (c & 0xf);
+ }
+ break;
+ default:
+ abort ();
+ }
+ *to = '\0';
+}
+
+#define RING_SIZE 3
+struct ringel {
+ char *buffer;
+ int size;
+};
+static struct ringel ring[RING_SIZE]; /* ring data */
+
+static const char *
+escnonprint_internal (const char *str, char escape, int base)
+{
+ static int ringpos; /* current ring position */
+ int nprcnt;
+
+ assert (base == 8 || base == 16);
+
+ nprcnt = count_nonprint (str);
+ if (nprcnt == 0)
+ /* If there are no non-printable chars in STR, don't bother
+ copying anything, just return STR. */
+ return str;
+
+ {
+ /* Set up a pointer to the current ring position, so we can write
+ simply r->X instead of ring[ringpos].X. */
+ struct ringel *r = ring + ringpos;
+
+ /* Every non-printable character is replaced with the escape char
+ and three (or two, depending on BASE) *additional* chars. Size
+ must also include the length of the original string and one
+ additional char for the terminating \0. */
+ int needed_size = strlen (str) + 1 + (base == 8 ? 3 * nprcnt : 2 * nprcnt);
+
+ /* If the current buffer is uninitialized or too small,
+ (re)allocate it. */
+ if (r->buffer == NULL || r->size < needed_size)
+ {
+ r->buffer = xrealloc (r->buffer, needed_size);
+ r->size = needed_size;
+ }
+
+ copy_and_escape (str, r->buffer, escape, base);
+ ringpos = (ringpos + 1) % RING_SIZE;
+ return r->buffer;
+ }
+}
+
+/* Return a pointer to a static copy of STR with the non-printable
+ characters escaped as \ooo. If there are no non-printable
+ characters in STR, STR is returned. See copy_and_escape for more
+ information on which characters are considered non-printable.
+
+ DON'T call this function on translated strings because escaping
+ will break them. Don't call it on literal strings from the source,
+ which are by definition trusted. If newlines are allowed in the
+ string, escape and print it line by line because escaping the whole
+ string will convert newlines to \012. (This is so that expectedly
+ single-line messages cannot use embedded newlines to mimic Wget's
+ output and deceive the user.)
+
+ escnonprint doesn't quote its escape character because it is notf
+ meant as a general and reversible quoting mechanism, but as a quick
+ way to defang binary junk sent by malicious or buggy servers.
+
+ NOTE: since this function can return a pointer to static data, be
+ careful to copy its result before calling it again. However, to be
+ more useful with printf, it maintains an internal ring of static
+ buffers to return. Currently the ring size is 3, which means you
+ can print up to three values in the same printf; if more is needed,
+ bump RING_SIZE. */
+
+const char *
+escnonprint (const char *str)
+{
+ return escnonprint_internal (str, '\\', 8);
+}
+
+/* Return a pointer to a static copy of STR with the non-printable
+ characters escaped as %XX. If there are no non-printable
+ characters in STR, STR is returned.
+
+ See escnonprint for usage details. */
+
+const char *
+escnonprint_uri (const char *str)
+{
+ return escnonprint_internal (str, '%', 16);
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+log_cleanup (void)
+{
+ size_t i;
+ for (i = 0; i < countof (ring); i++)
+ xfree (ring[i].buffer);
+}
+#endif
+
+/* When SIGHUP or SIGUSR1 are received, the output is redirected
+ elsewhere. Such redirection is only allowed once. */
+static const char *redirect_request_signal_name;
+
+/* Redirect output to `wget-log' or back to stdout/stderr. */
+
+void
+redirect_output (bool to_file, const char *signal_name)
+{
+ if (to_file && logfp != filelogfp)
+ {
+ if (signal_name)
+ {
+ fprintf (stderr, "\n%s received.", signal_name);
+ }
+ if (!filelogfp)
+ {
+ filelogfp = unique_create (DEFAULT_LOGFILE, false, &logfile);
+ if (filelogfp)
+ {
+ fprintf (stderr, _("\nRedirecting output to %s.\n"),
+ quote (logfile));
+ /* Store signal name to tell wget it's permanent redirect to log file */
+ redirect_request_signal_name = signal_name;
+ logfp = filelogfp;
+ /* Dump the context output to the newly opened log. */
+ log_dump_context ();
+ }
+ else
+ {
+ /* Eek! Opening the alternate log file has failed. Nothing we
+ can do but disable printing completely. */
+ fprintf (stderr, _("%s: %s; disabling logging.\n"),
+ (logfile) ? logfile : DEFAULT_LOGFILE, strerror (errno));
+ inhibit_logging = true;
+ }
+ }
+ else
+ {
+ fprintf (stderr, _("\nRedirecting output to %s.\n"),
+ quote (logfile));
+ logfp = filelogfp;
+ log_dump_context ();
+ }
+ }
+ else if (!to_file && logfp != stdlogfp)
+ {
+ logfp = stdlogfp;
+ log_dump_context ();
+ }
+}
+
+/* Check whether there's a need to redirect output. */
+
+static void
+check_redirect_output (void)
+{
+#if !defined(WINDOWS) && !defined(__VMS)
+ /* If it was redirected already to log file by SIGHUP, SIGUSR1 or -o parameter,
+ * it was permanent.
+ * If there was no SIGHUP or SIGUSR1 and shell is interactive
+ * we check if process is fg or bg before every line is printed.*/
+ if (!redirect_request_signal_name && shell_is_interactive && !opt.lfilename)
+ {
+ pid_t foreground_pgrp = tcgetpgrp (STDIN_FILENO);
+
+ if (foreground_pgrp != -1 && foreground_pgrp != getpgrp () && !opt.quiet)
+ {
+ /* Process backgrounded */
+ redirect_output (true,NULL);
+ }
+ else
+ {
+ /* Process foregrounded */
+ redirect_output (false,NULL);
+ }
+ }
+#endif /* !defined(WINDOWS) && !defined(__VMS) */
+}
diff --git a/src/log.h b/src/log.h
new file mode 100644
index 0000000..40d4d88
--- /dev/null
+++ b/src/log.h
@@ -0,0 +1,60 @@
+/* Declarations for log.c.
+ Copyright (C) 1998-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef LOG_H
+#define LOG_H
+
+/* The log file to which Wget writes to after HUP. */
+#define DEFAULT_LOGFILE "wget-log"
+
+#include <stdio.h>
+
+enum log_options { LOG_VERBOSE, LOG_NOTQUIET, LOG_NONVERBOSE, LOG_ALWAYS, LOG_PROGRESS };
+
+void log_set_warc_log_fp (FILE *);
+
+void logprintf (enum log_options, const char *, ...)
+ GCC_FORMAT_ATTR (2, 3);
+void debug_logprintf (const char *, ...) GCC_FORMAT_ATTR (1, 2);
+void logputs (enum log_options, const char *);
+void logflush (void);
+void log_set_flush (bool);
+bool log_set_save_context (bool);
+
+void log_init (const char *, bool);
+void log_close (void);
+void log_cleanup (void);
+void log_request_redirect_output (const char *);
+void redirect_output (bool, const char *);
+
+const char *escnonprint (const char *);
+const char *escnonprint_uri (const char *);
+
+#endif /* LOG_H */
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..c84f6e4
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,2306 @@
+/* Command line parsing.
+ Copyright (C) 1996-2015, 2018-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <spawn.h>
+#if defined(ENABLE_NLS) || defined(WINDOWS)
+# include <locale.h>
+#endif
+#include <assert.h>
+#include <errno.h>
+#include <time.h>
+
+#include "exits.h"
+#include "utils.h"
+#include "init.h"
+#include "retr.h"
+#include "recur.h"
+#include "host.h"
+#include "url.h"
+#include "progress.h" /* for progress_handle_sigwinch */
+#include "convert.h"
+#include "spider.h"
+#include "http.h" /* for save_cookies */
+#include "hsts.h" /* for initializing hsts_store to NULL */
+#include "ptimer.h"
+#include "warc.h"
+#include "version.h"
+#include "c-strcase.h"
+#include "dirname.h"
+#include "xmemdup0.h"
+#include <getopt.h>
+#include <getpass.h>
+#include <quote.h>
+
+#ifdef TESTING
+/* Rename the main function so we can have a main() in fuzzing code
+ and call the original main. */
+# define main main_wget
+#endif
+
+#ifdef HAVE_METALINK
+# include <metalink/metalink_parser.h>
+# include "metalink.h"
+#endif
+
+#ifdef WINDOWS
+# include <io.h>
+# include <fcntl.h>
+#ifndef ENABLE_NLS
+# include <mbctype.h>
+#endif
+#endif
+
+#ifdef __VMS
+# include "vms.h"
+#endif /* __VMS */
+
+#ifndef PATH_SEPARATOR
+# define PATH_SEPARATOR '/'
+#endif
+
+#ifndef ENABLE_IRI
+struct iri dummy_iri;
+#endif
+
+#ifdef HAVE_LIBCARES
+#include <ares.h>
+ares_channel ares;
+#else
+void *ares;
+#endif
+
+struct options opt;
+
+/* defined in version.c */
+extern char *system_getrc;
+/* Used for --version output in print_version */
+#define MAX_CHARS_PER_LINE 72
+#define TABULATION 4
+
+const char *exec_name;
+
+/* Number of successfully downloaded URLs */
+int numurls = 0;
+
+/* Initialize I18N/L10N. That amounts to invoking setlocale, and
+ setting up gettext's message catalog using bindtextdomain and
+ textdomain. Does nothing if NLS is disabled or missing. */
+
+#if defined(SIGHUP) || defined(SIGUSR1)
+/* Hangup signal handler. When wget receives SIGHUP or SIGUSR1, it
+ will proceed operation as usual, trying to write into a log file.
+ If that is impossible, the output will be turned off. */
+
+static void
+redirect_output_signal (int sig)
+{
+ const char *signal_name = "WTF?!";
+
+#ifdef SIGHUP
+ if (sig == SIGHUP)
+ signal_name = "SIGHUP";
+#endif
+#ifdef SIGUSR1
+ if (sig == SIGUSR1)
+ signal_name = "SIGUSR1";
+#endif
+
+ redirect_output (true,signal_name);
+ progress_schedule_redirect ();
+ signal (sig, redirect_output_signal);
+}
+#endif /* defined(SIGHUP) || defined(SIGUSR1) */
+
+static void
+i18n_initialize (void)
+{
+ /* ENABLE_NLS implies existence of functions invoked here. */
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ bindtextdomain ("wget-gnulib", LOCALEDIR);
+ textdomain ("wget");
+#elif defined WINDOWS
+ char MBCP[16] = "";
+ int CP;
+
+ CP = _getmbcp(); /* Consider it's different from default. */
+ if (CP > 0)
+ snprintf(MBCP, sizeof(MBCP), ".%d", CP);
+ setlocale(LC_ALL, MBCP);
+#endif /* ENABLE_NLS */
+}
+
+#ifdef HAVE_HSTS
+/* make the HSTS store global */
+hsts_store_t hsts_store;
+
+static char*
+get_hsts_database (void)
+{
+ if (opt.hsts_file)
+ return xstrdup (opt.hsts_file);
+
+ if (opt.homedir)
+ {
+ char *dir = ajoin_dir_file(opt.homedir, ".wget-hsts");
+ return dir;
+ }
+
+ return NULL;
+}
+
+static void
+load_hsts (void)
+{
+ if (!hsts_store)
+ {
+ char *filename = get_hsts_database ();
+
+ if (filename)
+ {
+ DEBUGP (("Reading HSTS entries from %s\n", filename));
+
+ hsts_store = hsts_store_open (filename);
+
+ if (!hsts_store)
+ logprintf (LOG_NOTQUIET, "ERROR: could not open HSTS store at '%s'. "
+ "HSTS will be disabled.\n",
+ filename);
+ }
+ else
+ logprintf (LOG_NOTQUIET, "ERROR: could not open HSTS store. HSTS will be disabled.\n");
+
+ xfree (filename);
+ }
+}
+
+static void
+save_hsts (void)
+{
+ if (hsts_store)
+ {
+ char *filename = get_hsts_database ();
+
+ if (filename && hsts_store_has_changed (hsts_store))
+ {
+ DEBUGP (("Saving HSTS entries to %s\n", filename));
+ hsts_store_save (hsts_store, filename);
+ }
+
+ hsts_store_close (hsts_store);
+ xfree (hsts_store);
+
+ xfree (filename);
+ }
+}
+#endif
+
+/* Definition of command-line options. */
+
+_Noreturn static void print_help (void);
+_Noreturn static void print_version (void);
+
+#ifdef HAVE_SSL
+# define IF_SSL(a,b,c,d,e) { a, b, c, d , e },
+#else
+# define IF_SSL(a,b,c,d,e)
+#endif
+
+struct cmdline_option {
+ char long_name[MAX_LONGOPTION];
+ char short_name;
+ enum {
+ OPT_VALUE,
+ OPT_BOOLEAN,
+ OPT_FUNCALL,
+ /* Non-standard options that have to be handled specially in
+ main(). */
+ OPT__APPEND_OUTPUT,
+ OPT__CLOBBER,
+ OPT__DONT_REMOVE_LISTING,
+ OPT__EXECUTE,
+ OPT__NO,
+ OPT__PARENT
+ } type;
+ const void *data; /* for standard options */
+ int argtype; /* for non-standard options */
+};
+
+static struct cmdline_option option_data[] =
+ {
+ { "accept", 'A', OPT_VALUE, "accept", -1 },
+ { "accept-regex", 0, OPT_VALUE, "acceptregex", -1 },
+ { "adjust-extension", 'E', OPT_BOOLEAN, "adjustextension", -1 },
+ { "append-output", 'a', OPT__APPEND_OUTPUT, NULL, required_argument },
+ { "ask-password", 0, OPT_BOOLEAN, "askpassword", -1 },
+ { "auth-no-challenge", 0, OPT_BOOLEAN, "authnochallenge", -1 },
+ { "background", 'b', OPT_BOOLEAN, "background", -1 },
+ { "backup-converted", 'K', OPT_BOOLEAN, "backupconverted", -1 },
+ { "backups", 0, OPT_BOOLEAN, "backups", -1 },
+ { "base", 'B', OPT_VALUE, "base", -1 },
+ { "bind-address", 0, OPT_VALUE, "bindaddress", -1 },
+#ifdef HAVE_LIBCARES
+ { "bind-dns-address", 0, OPT_VALUE, "binddnsaddress", -1 },
+#endif
+ { "body-data", 0, OPT_VALUE, "bodydata", -1 },
+ { "body-file", 0, OPT_VALUE, "bodyfile", -1 },
+ IF_SSL ( "ca-certificate", 0, OPT_VALUE, "cacertificate", -1 )
+ IF_SSL ( "ca-directory", 0, OPT_VALUE, "cadirectory", -1 )
+ { "cache", 0, OPT_BOOLEAN, "cache", -1 },
+ IF_SSL ( "certificate", 0, OPT_VALUE, "certificate", -1 )
+ IF_SSL ( "certificate-type", 0, OPT_VALUE, "certificatetype", -1 )
+ IF_SSL ( "check-certificate", 0, OPT_BOOLEAN, "checkcertificate", -1 )
+ { "clobber", 0, OPT__CLOBBER, NULL, optional_argument },
+#ifdef HAVE_LIBZ
+ { "compression", 0, OPT_VALUE, "compression", -1 },
+#endif
+ { "config", 0, OPT_VALUE, "chooseconfig", -1 },
+ { "connect-timeout", 0, OPT_VALUE, "connecttimeout", -1 },
+ { "continue", 'c', OPT_BOOLEAN, "continue", -1 },
+ { "convert-file-only", 0, OPT_BOOLEAN, "convertfileonly", -1 },
+ { "convert-links", 'k', OPT_BOOLEAN, "convertlinks", -1 },
+ { "content-disposition", 0, OPT_BOOLEAN, "contentdisposition", -1 },
+ { "content-on-error", 0, OPT_BOOLEAN, "contentonerror", -1 },
+ { "cookies", 0, OPT_BOOLEAN, "cookies", -1 },
+ IF_SSL ( "crl-file", 0, OPT_VALUE, "crlfile", -1 )
+ { "cut-dirs", 0, OPT_VALUE, "cutdirs", -1 },
+ { "debug", 'd', OPT_BOOLEAN, "debug", -1 },
+ { "default-page", 0, OPT_VALUE, "defaultpage", -1 },
+ { "delete-after", 0, OPT_BOOLEAN, "deleteafter", -1 },
+ { "directories", 0, OPT_BOOLEAN, "dirstruct", -1 },
+ { "directory-prefix", 'P', OPT_VALUE, "dirprefix", -1 },
+ { "dns-cache", 0, OPT_BOOLEAN, "dnscache", -1 },
+#ifdef HAVE_LIBCARES
+ { "dns-servers", 0, OPT_VALUE, "dnsservers", -1 },
+#endif
+ { "dns-timeout", 0, OPT_VALUE, "dnstimeout", -1 },
+ { "domains", 'D', OPT_VALUE, "domains", -1 },
+ { "dont-remove-listing", 0, OPT__DONT_REMOVE_LISTING, NULL, no_argument },
+ { "dot-style", 0, OPT_VALUE, "dotstyle", -1 }, /* deprecated */
+ { "egd-file", 0, OPT_VALUE, "egdfile", -1 },
+ { "exclude-directories", 'X', OPT_VALUE, "excludedirectories", -1 },
+ { "exclude-domains", 0, OPT_VALUE, "excludedomains", -1 },
+ { "execute", 'e', OPT__EXECUTE, NULL, required_argument },
+ { "follow-ftp", 0, OPT_BOOLEAN, "followftp", -1 },
+ { "follow-tags", 0, OPT_VALUE, "followtags", -1 },
+ { "force-directories", 'x', OPT_BOOLEAN, "dirstruct", -1 },
+ { "force-html", 'F', OPT_BOOLEAN, "forcehtml", -1 },
+ { "ftp-password", 0, OPT_VALUE, "ftppassword", -1 },
+#ifdef __VMS
+ { "ftp-stmlf", 0, OPT_BOOLEAN, "ftpstmlf", -1 },
+#endif /* def __VMS */
+ { "ftp-user", 0, OPT_VALUE, "ftpuser", -1 },
+ IF_SSL ( "ftps-clear-data-connection", 0, OPT_BOOLEAN, "ftpscleardataconnection", -1 )
+ IF_SSL ( "ftps-fallback-to-ftp", 0, OPT_BOOLEAN, "ftpsfallbacktoftp", -1 )
+ IF_SSL ( "ftps-implicit", 0, OPT_BOOLEAN, "ftpsimplicit", -1 )
+ IF_SSL ( "ftps-resume-ssl", 0, OPT_BOOLEAN, "ftpsresumessl", -1 )
+ { "glob", 0, OPT_BOOLEAN, "glob", -1 },
+ { "header", 0, OPT_VALUE, "header", -1 },
+ { "help", 'h', OPT_FUNCALL, (void *)print_help, no_argument },
+ { "host-directories", 0, OPT_BOOLEAN, "addhostdir", -1 },
+#ifdef HAVE_HSTS
+ { "hsts", 0, OPT_BOOLEAN, "hsts", -1},
+ { "hsts-file", 0, OPT_VALUE, "hstsfile", -1 },
+#endif
+ { "html-extension", 'E', OPT_BOOLEAN, "adjustextension", -1 }, /* deprecated */
+ { "htmlify", 0, OPT_BOOLEAN, "htmlify", -1 },
+ { "http-keep-alive", 0, OPT_BOOLEAN, "httpkeepalive", -1 },
+ { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */
+ { "http-password", 0, OPT_VALUE, "httppassword", -1 },
+ { "http-user", 0, OPT_VALUE, "httpuser", -1 },
+ IF_SSL ( "https-only", 0, OPT_BOOLEAN, "httpsonly", -1 )
+ { "ignore-case", 0, OPT_BOOLEAN, "ignorecase", -1 },
+ { "ignore-length", 0, OPT_BOOLEAN, "ignorelength", -1 },
+ { "ignore-tags", 0, OPT_VALUE, "ignoretags", -1 },
+ { "include-directories", 'I', OPT_VALUE, "includedirectories", -1 },
+#ifdef ENABLE_IPV6
+ { "inet4-only", '4', OPT_BOOLEAN, "inet4only", -1 },
+ { "inet6-only", '6', OPT_BOOLEAN, "inet6only", -1 },
+#endif
+ { "input-file", 'i', OPT_VALUE, "input", -1 },
+#ifdef HAVE_METALINK
+ { "input-metalink", 0, OPT_VALUE, "inputmetalink", -1 },
+#endif
+ { "iri", 0, OPT_BOOLEAN, "iri", -1 },
+ { "keep-badhash", 0, OPT_BOOLEAN, "keepbadhash", -1 },
+ { "keep-session-cookies", 0, OPT_BOOLEAN, "keepsessioncookies", -1 },
+ { "level", 'l', OPT_VALUE, "reclevel", -1 },
+ { "limit-rate", 0, OPT_VALUE, "limitrate", -1 },
+ { "load-cookies", 0, OPT_VALUE, "loadcookies", -1 },
+ { "local-encoding", 0, OPT_VALUE, "localencoding", -1 },
+ { "rejected-log", 0, OPT_VALUE, "rejectedlog", -1 },
+ { "max-redirect", 0, OPT_VALUE, "maxredirect", -1 },
+#ifdef HAVE_METALINK
+ { "metalink-index", 0, OPT_VALUE, "metalinkindex", -1 },
+ { "metalink-over-http", 0, OPT_BOOLEAN, "metalinkoverhttp", -1 },
+#endif
+ { "method", 0, OPT_VALUE, "method", -1 },
+ { "mirror", 'm', OPT_BOOLEAN, "mirror", -1 },
+ { "netrc", 0, OPT_BOOLEAN, "netrc", -1 },
+ { "no", 'n', OPT__NO, NULL, required_argument },
+ { "no-clobber", 0, OPT_BOOLEAN, "noclobber", -1 },
+ { "no-config", 0, OPT_BOOLEAN, "noconfig", -1},
+ { "no-parent", 0, OPT_BOOLEAN, "noparent", -1 },
+ { "output-document", 'O', OPT_VALUE, "outputdocument", -1 },
+ { "output-file", 'o', OPT_VALUE, "logfile", -1 },
+ { "page-requisites", 'p', OPT_BOOLEAN, "pagerequisites", -1 },
+ { "parent", 0, OPT__PARENT, NULL, optional_argument },
+ { "passive-ftp", 0, OPT_BOOLEAN, "passiveftp", -1 },
+ { "password", 0, OPT_VALUE, "password", -1 },
+ IF_SSL ( "pinnedpubkey", 0, OPT_VALUE, "pinnedpubkey", -1 )
+ { "post-data", 0, OPT_VALUE, "postdata", -1 },
+ { "post-file", 0, OPT_VALUE, "postfile", -1 },
+ { "prefer-family", 0, OPT_VALUE, "preferfamily", -1 },
+#ifdef HAVE_METALINK
+ { "preferred-location", 0, OPT_VALUE, "preferredlocation", -1 },
+#endif
+ { "preserve-permissions", 0, OPT_BOOLEAN, "preservepermissions", -1 },
+ IF_SSL ( "ciphers", 0, OPT_VALUE, "ciphers", -1 )
+ IF_SSL ( "private-key", 0, OPT_VALUE, "privatekey", -1 )
+ IF_SSL ( "private-key-type", 0, OPT_VALUE, "privatekeytype", -1 )
+ { "progress", 0, OPT_VALUE, "progress", -1 },
+ { "show-progress", 0, OPT_BOOLEAN, "showprogress", -1 },
+ { "protocol-directories", 0, OPT_BOOLEAN, "protocoldirectories", -1 },
+ { "proxy", 0, OPT_BOOLEAN, "useproxy", -1 },
+ { "proxy__compat", 'Y', OPT_VALUE, "useproxy", -1 }, /* back-compatible */
+ { "proxy-passwd", 0, OPT_VALUE, "proxypassword", -1 }, /* deprecated */
+ { "proxy-password", 0, OPT_VALUE, "proxypassword", -1 },
+ { "proxy-user", 0, OPT_VALUE, "proxyuser", -1 },
+ { "quiet", 'q', OPT_BOOLEAN, "quiet", -1 },
+ { "quota", 'Q', OPT_VALUE, "quota", -1 },
+ { "random-file", 0, OPT_VALUE, "randomfile", -1 },
+ { "random-wait", 0, OPT_BOOLEAN, "randomwait", -1 },
+ { "read-timeout", 0, OPT_VALUE, "readtimeout", -1 },
+ { "recursive", 'r', OPT_BOOLEAN, "recursive", -1 },
+ { "referer", 0, OPT_VALUE, "referer", -1 },
+ { "regex-type", 0, OPT_VALUE, "regextype", -1 },
+ { "reject", 'R', OPT_VALUE, "reject", -1 },
+ { "reject-regex", 0, OPT_VALUE, "rejectregex", -1 },
+ { "relative", 'L', OPT_BOOLEAN, "relativeonly", -1 },
+ { "remote-encoding", 0, OPT_VALUE, "remoteencoding", -1 },
+ { "remove-listing", 0, OPT_BOOLEAN, "removelisting", -1 },
+ { "report-speed", 0, OPT_BOOLEAN, "reportspeed", -1 },
+ { "restrict-file-names", 0, OPT_BOOLEAN, "restrictfilenames", -1 },
+ { "retr-symlinks", 0, OPT_BOOLEAN, "retrsymlinks", -1 },
+ { "retry-connrefused", 0, OPT_BOOLEAN, "retryconnrefused", -1 },
+ { "retry-on-host-error", 0, OPT_BOOLEAN, "retryonhosterror", -1 },
+ { "retry-on-http-error", 0, OPT_VALUE, "retryonhttperror", -1 },
+ { "save-cookies", 0, OPT_VALUE, "savecookies", -1 },
+ { "save-headers", 0, OPT_BOOLEAN, "saveheaders", -1 },
+ IF_SSL ( "secure-protocol", 0, OPT_VALUE, "secureprotocol", -1 )
+ { "server-response", 'S', OPT_BOOLEAN, "serverresponse", -1 },
+ { "span-hosts", 'H', OPT_BOOLEAN, "spanhosts", -1 },
+ { "spider", 0, OPT_BOOLEAN, "spider", -1 },
+ { "start-pos", 0, OPT_VALUE, "startpos", -1 },
+ { "strict-comments", 0, OPT_BOOLEAN, "strictcomments", -1 },
+ { "timeout", 'T', OPT_VALUE, "timeout", -1 },
+ { "timestamping", 'N', OPT_BOOLEAN, "timestamping", -1 },
+ { "if-modified-since", 0, OPT_BOOLEAN, "ifmodifiedsince", -1 },
+ { "tries", 't', OPT_VALUE, "tries", -1 },
+ { "unlink", 0, OPT_BOOLEAN, "unlink", -1 },
+ { "trust-server-names", 0, OPT_BOOLEAN, "trustservernames", -1 },
+#ifndef __VMS
+ { "use-askpass", 0, OPT_VALUE, "useaskpass", -1},
+#endif
+ { "use-server-timestamps", 0, OPT_BOOLEAN, "useservertimestamps", -1 },
+ { "user", 0, OPT_VALUE, "user", -1 },
+ { "user-agent", 'U', OPT_VALUE, "useragent", -1 },
+ { "verbose", 'v', OPT_BOOLEAN, "verbose", -1 },
+ { "version", 'V', OPT_FUNCALL, (void *) print_version, no_argument },
+ { "wait", 'w', OPT_VALUE, "wait", -1 },
+ { "waitretry", 0, OPT_VALUE, "waitretry", -1 },
+ { "warc-cdx", 0, OPT_BOOLEAN, "warccdx", -1 },
+#ifdef HAVE_LIBZ
+ { "warc-compression", 0, OPT_BOOLEAN, "warccompression", -1 },
+#endif
+ { "warc-dedup", 0, OPT_VALUE, "warccdxdedup", -1 },
+ { "warc-digests", 0, OPT_BOOLEAN, "warcdigests", -1 },
+ { "warc-file", 0, OPT_VALUE, "warcfile", -1 },
+ { "warc-header", 0, OPT_VALUE, "warcheader", -1 },
+ { "warc-keep-log", 0, OPT_BOOLEAN, "warckeeplog", -1 },
+ { "warc-max-size", 0, OPT_VALUE, "warcmaxsize", -1 },
+ { "warc-tempdir", 0, OPT_VALUE, "warctempdir", -1 },
+#ifdef USE_WATT32
+ { "wdebug", 0, OPT_BOOLEAN, "wdebug", -1 },
+#endif
+#ifdef ENABLE_XATTR
+ { "xattr", 0, OPT_BOOLEAN, "xattr", -1 },
+#endif
+ };
+
+#undef IF_SSL
+
+/* Return a string that contains S with "no-" prepended. The string
+ is NUL-terminated and allocated off static storage at Wget
+ startup. */
+
+static char *
+no_prefix (const char *s)
+{
+ static char buffer[2048];
+ static char *p = buffer;
+
+ char *cp = p;
+ int size = 3 + strlen (s) + 1; /* "no-STRING\0" */
+ assert(p + size <= buffer + sizeof (buffer));
+
+ cp[0] = 'n', cp[1] = 'o', cp[2] = '-';
+ strcpy (cp + 3, s);
+ p += size;
+ return cp;
+}
+
+/* The arguments that that main passes to getopt_long. */
+static struct option long_options[2 * countof (option_data) + 1];
+static char short_options[128];
+
+/* Mapping between short option chars and option_data indices. */
+static unsigned char optmap[96];
+
+/* Marker for `--no-FOO' values in long_options. */
+#define BOOLEAN_NEG_MARKER 1024
+
+/* Initialize the long_options array used by getopt_long from the data
+ in option_data. */
+
+static void
+init_switches (void)
+{
+ static bool initialized;
+ char *p = short_options;
+ size_t i, o = 0;
+
+ if (initialized)
+ return;
+ initialized = 1;
+
+ for (i = 0; i < countof (option_data); i++)
+ {
+ struct cmdline_option *cmdopt = &option_data[i];
+ struct option *longopt;
+
+ longopt = &long_options[o++];
+ longopt->name = cmdopt->long_name;
+ longopt->val = i;
+ if (cmdopt->short_name)
+ {
+ *p++ = cmdopt->short_name;
+ optmap[cmdopt->short_name - 32] = longopt - long_options;
+ }
+ switch (cmdopt->type)
+ {
+ case OPT_VALUE:
+ longopt->has_arg = required_argument;
+ if (cmdopt->short_name)
+ *p++ = ':';
+ break;
+ case OPT_BOOLEAN:
+ /* Specify an optional argument for long options, so that
+ --option=off works the same as --no-option, for
+ compatibility with pre-1.10 Wget. However, don't specify
+ optional arguments short-option booleans because they
+ prevent combining of short options. */
+ longopt->has_arg = optional_argument;
+ /* For Boolean options, add the "--no-FOO" variant, which is
+ identical to "--foo", except it has opposite meaning and
+ it doesn't allow an argument. */
+ longopt = &long_options[o++];
+ longopt->name = no_prefix (cmdopt->long_name);
+ longopt->has_arg = no_argument;
+ /* Mask the value so we'll be able to recognize that we're
+ dealing with the false value. */
+ longopt->val = i | BOOLEAN_NEG_MARKER;
+ break;
+ default:
+ assert (cmdopt->argtype != -1);
+ longopt->has_arg = cmdopt->argtype;
+ if (cmdopt->short_name)
+ {
+ if (longopt->has_arg == required_argument)
+ *p++ = ':';
+ /* Don't handle optional_argument */
+ }
+ }
+ }
+ /* Terminate short_options. */
+ *p = '\0';
+ /* No need for xzero(long_options[o]) because its storage is static
+ and it will be zeroed by default. */
+ assert (o <= countof (long_options));
+}
+
+/* Print the usage message. */
+static int
+print_usage (_GL_UNUSED int error)
+{
+#ifndef TESTING
+ return fprintf (error ? stderr : stdout,
+ _("Usage: %s [OPTION]... [URL]...\n"), exec_name);
+#else
+ return 0;
+#endif
+}
+
+/* Print the help message, describing all the available options. If
+ you add an option, be sure to update this list. */
+_Noreturn static void
+print_help (void)
+{
+#ifndef TESTING
+ /* We split the help text this way to ease translation of individual
+ entries. */
+ static const char *help[] = {
+ "\n",
+ N_("\
+Mandatory arguments to long options are mandatory for short options too.\n\n"),
+ N_("\
+Startup:\n"),
+ N_("\
+ -V, --version display the version of Wget and exit\n"),
+ N_("\
+ -h, --help print this help\n"),
+ N_("\
+ -b, --background go to background after startup\n"),
+ N_("\
+ -e, --execute=COMMAND execute a `.wgetrc'-style command\n"),
+ "\n",
+
+ N_("\
+Logging and input file:\n"),
+ N_("\
+ -o, --output-file=FILE log messages to FILE\n"),
+ N_("\
+ -a, --append-output=FILE append messages to FILE\n"),
+#ifdef ENABLE_DEBUG
+ N_("\
+ -d, --debug print lots of debugging information\n"),
+#endif
+#ifdef USE_WATT32
+ N_("\
+ --wdebug print Watt-32 debug output\n"),
+#endif
+ N_("\
+ -q, --quiet quiet (no output)\n"),
+ N_("\
+ -v, --verbose be verbose (this is the default)\n"),
+ N_("\
+ -nv, --no-verbose turn off verboseness, without being quiet\n"),
+ N_("\
+ --report-speed=TYPE output bandwidth as TYPE. TYPE can be bits\n"),
+ N_("\
+ -i, --input-file=FILE download URLs found in local or external FILE\n"),
+#ifdef HAVE_METALINK
+ N_("\
+ --input-metalink=FILE download files covered in local Metalink FILE\n"),
+#endif
+ N_("\
+ -F, --force-html treat input file as HTML\n"),
+ N_("\
+ -B, --base=URL resolves HTML input-file links (-i -F)\n\
+ relative to URL\n"),
+ N_("\
+ --config=FILE specify config file to use\n"),
+ N_("\
+ --no-config do not read any config file\n"),
+ N_("\
+ --rejected-log=FILE log reasons for URL rejection to FILE\n"),
+ "\n",
+
+ N_("\
+Download:\n"),
+ N_("\
+ -t, --tries=NUMBER set number of retries to NUMBER (0 unlimits)\n"),
+ N_("\
+ --retry-connrefused retry even if connection is refused\n"),
+ N_("\
+ --retry-on-http-error=ERRORS comma-separated list of HTTP errors to retry\n"),
+ N_("\
+ -O, --output-document=FILE write documents to FILE\n"),
+ N_("\
+ -nc, --no-clobber skip downloads that would download to\n\
+ existing files (overwriting them)\n"),
+ N_("\
+ --no-netrc don't try to obtain credentials from .netrc\n"),
+ N_("\
+ -c, --continue resume getting a partially-downloaded file\n"),
+ N_("\
+ --start-pos=OFFSET start downloading from zero-based position OFFSET\n"),
+ N_("\
+ --progress=TYPE select progress gauge type\n"),
+ N_("\
+ --show-progress display the progress bar in any verbosity mode\n"),
+ N_("\
+ -N, --timestamping don't re-retrieve files unless newer than\n\
+ local\n"),
+ N_("\
+ --no-if-modified-since don't use conditional if-modified-since get\n\
+ requests in timestamping mode\n"),
+ N_("\
+ --no-use-server-timestamps don't set the local file's timestamp by\n\
+ the one on the server\n"),
+ N_("\
+ -S, --server-response print server response\n"),
+ N_("\
+ --spider don't download anything\n"),
+ N_("\
+ -T, --timeout=SECONDS set all timeout values to SECONDS\n"),
+#ifdef HAVE_LIBCARES
+ N_("\
+ --dns-servers=ADDRESSES list of DNS servers to query (comma separated)\n"),
+ N_("\
+ --bind-dns-address=ADDRESS bind DNS resolver to ADDRESS (hostname or IP) on local host\n"),
+#endif
+ N_("\
+ --dns-timeout=SECS set the DNS lookup timeout to SECS\n"),
+ N_("\
+ --connect-timeout=SECS set the connect timeout to SECS\n"),
+ N_("\
+ --read-timeout=SECS set the read timeout to SECS\n"),
+ N_("\
+ -w, --wait=SECONDS wait SECONDS between retrievals\n\
+ (applies if more then 1 URL is to be retrieved)\n"),
+ N_("\
+ --waitretry=SECONDS wait 1..SECONDS between retries of a retrieval\n\
+ (applies if more then 1 URL is to be retrieved)\n"),
+ N_("\
+ --random-wait wait from 0.5*WAIT...1.5*WAIT secs between retrievals\n\
+ (applies if more then 1 URL is to be retrieved)\n"),
+ N_("\
+ --no-proxy explicitly turn off proxy\n"),
+ N_("\
+ -Q, --quota=NUMBER set retrieval quota to NUMBER\n"),
+ N_("\
+ --bind-address=ADDRESS bind to ADDRESS (hostname or IP) on local host\n"),
+ N_("\
+ --limit-rate=RATE limit download rate to RATE\n"),
+ N_("\
+ --no-dns-cache disable caching DNS lookups\n"),
+ N_("\
+ --restrict-file-names=OS restrict chars in file names to ones OS allows\n"),
+ N_("\
+ --ignore-case ignore case when matching files/directories\n"),
+#ifdef ENABLE_IPV6
+ N_("\
+ -4, --inet4-only connect only to IPv4 addresses\n"),
+ N_("\
+ -6, --inet6-only connect only to IPv6 addresses\n"),
+ N_("\
+ --prefer-family=FAMILY connect first to addresses of specified family,\n\
+ one of IPv6, IPv4, or none\n"),
+#endif
+ N_("\
+ --user=USER set both ftp and http user to USER\n"),
+ N_("\
+ --password=PASS set both ftp and http password to PASS\n"),
+ N_("\
+ --ask-password prompt for passwords\n"),
+#ifndef __VMS
+ N_("\
+ --use-askpass=COMMAND specify credential handler for requesting \n\
+ username and password. If no COMMAND is \n\
+ specified the WGET_ASKPASS or the SSH_ASKPASS \n\
+ environment variable is used.\n"),
+#endif
+ N_("\
+ --no-iri turn off IRI support\n"),
+ N_("\
+ --local-encoding=ENC use ENC as the local encoding for IRIs\n"),
+ N_("\
+ --remote-encoding=ENC use ENC as the default remote encoding\n"),
+ N_("\
+ --unlink remove file before clobber\n"),
+#ifdef HAVE_METALINK
+ N_("\
+ --keep-badhash keep files with checksum mismatch (append .badhash)\n"),
+ N_("\
+ --metalink-index=NUMBER Metalink application/metalink4+xml metaurl ordinal NUMBER\n"),
+ N_("\
+ --metalink-over-http use Metalink metadata from HTTP response headers\n"),
+ N_("\
+ --preferred-location preferred location for Metalink resources\n"),
+#endif
+#ifdef ENABLE_XATTR
+ N_("\
+ --xattr turn on storage of metadata in extended file attributes\n"),
+#endif
+ "\n",
+
+ N_("\
+Directories:\n"),
+ N_("\
+ -nd, --no-directories don't create directories\n"),
+ N_("\
+ -x, --force-directories force creation of directories\n"),
+ N_("\
+ -nH, --no-host-directories don't create host directories\n"),
+ N_("\
+ --protocol-directories use protocol name in directories\n"),
+ N_("\
+ -P, --directory-prefix=PREFIX save files to PREFIX/..\n"),
+ N_("\
+ --cut-dirs=NUMBER ignore NUMBER remote directory components\n"),
+ "\n",
+
+ N_("\
+HTTP options:\n"),
+ N_("\
+ --http-user=USER set http user to USER\n"),
+ N_("\
+ --http-password=PASS set http password to PASS\n"),
+ N_("\
+ --no-cache disallow server-cached data\n"),
+ N_ ("\
+ --default-page=NAME change the default page name (normally\n\
+ this is 'index.html'.)\n"),
+ N_("\
+ -E, --adjust-extension save HTML/CSS documents with proper extensions\n"),
+ N_("\
+ --ignore-length ignore 'Content-Length' header field\n"),
+ N_("\
+ --header=STRING insert STRING among the headers\n"),
+#ifdef HAVE_LIBZ
+ N_("\
+ --compression=TYPE choose compression, one of auto, gzip and none. (default: none)\n"),
+#endif
+ N_("\
+ --max-redirect maximum redirections allowed per page\n"),
+ N_("\
+ --proxy-user=USER set USER as proxy username\n"),
+ N_("\
+ --proxy-password=PASS set PASS as proxy password\n"),
+ N_("\
+ --referer=URL include 'Referer: URL' header in HTTP request\n"),
+ N_("\
+ --save-headers save the HTTP headers to file\n"),
+ N_("\
+ -U, --user-agent=AGENT identify as AGENT instead of Wget/VERSION\n"),
+ N_("\
+ --no-http-keep-alive disable HTTP keep-alive (persistent connections)\n"),
+ N_("\
+ --no-cookies don't use cookies\n"),
+ N_("\
+ --load-cookies=FILE load cookies from FILE before session\n"),
+ N_("\
+ --save-cookies=FILE save cookies to FILE after session\n"),
+ N_("\
+ --keep-session-cookies load and save session (non-permanent) cookies\n"),
+ N_("\
+ --post-data=STRING use the POST method; send STRING as the data\n"),
+ N_("\
+ --post-file=FILE use the POST method; send contents of FILE\n"),
+ N_("\
+ --method=HTTPMethod use method \"HTTPMethod\" in the request\n"),
+ N_("\
+ --body-data=STRING send STRING as data. --method MUST be set\n"),
+ N_("\
+ --body-file=FILE send contents of FILE. --method MUST be set\n"),
+ N_("\
+ --content-disposition honor the Content-Disposition header when\n\
+ choosing local file names (EXPERIMENTAL)\n"),
+ N_("\
+ --content-on-error output the received content on server errors\n"),
+ N_("\
+ --auth-no-challenge send Basic HTTP authentication information\n\
+ without first waiting for the server's\n\
+ challenge\n"),
+ "\n",
+
+#ifdef HAVE_SSL
+ N_("\
+HTTPS (SSL/TLS) options:\n"),
+ N_("\
+ --secure-protocol=PR choose secure protocol, one of auto, SSLv2,\n\
+ SSLv3, TLSv1, TLSv1_1, TLSv1_2 and PFS\n"),
+ N_("\
+ --https-only only follow secure HTTPS links\n"),
+ N_("\
+ --no-check-certificate don't validate the server's certificate\n"),
+ N_("\
+ --certificate=FILE client certificate file\n"),
+ N_("\
+ --certificate-type=TYPE client certificate type, PEM or DER\n"),
+ N_("\
+ --private-key=FILE private key file\n"),
+ N_("\
+ --private-key-type=TYPE private key type, PEM or DER\n"),
+ N_("\
+ --ca-certificate=FILE file with the bundle of CAs\n"),
+ N_("\
+ --ca-directory=DIR directory where hash list of CAs is stored\n"),
+ N_("\
+ --crl-file=FILE file with bundle of CRLs\n"),
+ N_("\
+ --pinnedpubkey=FILE/HASHES Public key (PEM/DER) file, or any number\n\
+ of base64 encoded sha256 hashes preceded by\n\
+ \'sha256//\' and separated by \';\', to verify\n\
+ peer against\n"),
+#if defined(HAVE_LIBSSL) || defined(HAVE_LIBSSL32)
+ N_("\
+ --random-file=FILE file with random data for seeding the SSL PRNG\n"),
+#endif
+#if (defined(HAVE_LIBSSL) || defined(HAVE_LIBSSL32)) && defined(HAVE_RAND_EGD)
+ N_("\
+ --egd-file=FILE file naming the EGD socket with random data\n"),
+#endif
+ "\n",
+ N_("\
+ --ciphers=STR Set the priority string (GnuTLS) or cipher list string (OpenSSL) directly.\n\
+ Use with care. This option overrides --secure-protocol.\n\
+ The format and syntax of this string depend on the specific SSL/TLS engine.\n"),
+#endif /* HAVE_SSL */
+
+#ifdef HAVE_HSTS
+ N_("\
+HSTS options:\n"),
+ N_("\
+ --no-hsts disable HSTS\n"),
+ N_("\
+ --hsts-file path of HSTS database (will override default)\n"),
+ "\n",
+#endif
+
+ N_("\
+FTP options:\n"),
+#ifdef __VMS
+ N_("\
+ --ftp-stmlf use Stream_LF format for all binary FTP files\n"),
+#endif /* def __VMS */
+ N_("\
+ --ftp-user=USER set ftp user to USER\n"),
+ N_("\
+ --ftp-password=PASS set ftp password to PASS\n"),
+ N_("\
+ --no-remove-listing don't remove '.listing' files\n"),
+ N_("\
+ --no-glob turn off FTP file name globbing\n"),
+ N_("\
+ --no-passive-ftp disable the \"passive\" transfer mode\n"),
+ N_("\
+ --preserve-permissions preserve remote file permissions\n"),
+ N_("\
+ --retr-symlinks when recursing, get linked-to files (not dir)\n"),
+ "\n",
+
+#ifdef HAVE_SSL
+ N_("\
+FTPS options:\n"),
+ N_("\
+ --ftps-implicit use implicit FTPS (default port is 990)\n"),
+ N_("\
+ --ftps-resume-ssl resume the SSL/TLS session started in the control connection when\n"
+ " opening a data connection\n"),
+ N_("\
+ --ftps-clear-data-connection cipher the control channel only; all the data will be in plaintext\n"),
+ N_("\
+ --ftps-fallback-to-ftp fall back to FTP if FTPS is not supported in the target server\n"),
+#endif
+
+ N_("\
+WARC options:\n"),
+ N_("\
+ --warc-file=FILENAME save request/response data to a .warc.gz file\n"),
+ N_("\
+ --warc-header=STRING insert STRING into the warcinfo record\n"),
+ N_("\
+ --warc-max-size=NUMBER set maximum size of WARC files to NUMBER\n"),
+ N_("\
+ --warc-cdx write CDX index files\n"),
+ N_("\
+ --warc-dedup=FILENAME do not store records listed in this CDX file\n"),
+#ifdef HAVE_LIBZ
+ N_("\
+ --no-warc-compression do not compress WARC files with GZIP\n"),
+#endif
+ N_("\
+ --no-warc-digests do not calculate SHA1 digests\n"),
+ N_("\
+ --no-warc-keep-log do not store the log file in a WARC record\n"),
+ N_("\
+ --warc-tempdir=DIRECTORY location for temporary files created by the\n\
+ WARC writer\n"),
+ "\n",
+
+ N_("\
+Recursive download:\n"),
+ N_("\
+ -r, --recursive specify recursive download\n"),
+ N_("\
+ -l, --level=NUMBER maximum recursion depth (inf or 0 for infinite)\n"),
+ N_("\
+ --delete-after delete files locally after downloading them\n"),
+ N_("\
+ -k, --convert-links make links in downloaded HTML or CSS point to\n\
+ local files\n"),
+ N_("\
+ --convert-file-only convert the file part of the URLs only (usually known as the basename)\n"),
+ N_("\
+ --backups=N before writing file X, rotate up to N backup files\n"),
+
+#ifdef __VMS
+ N_("\
+ -K, --backup-converted before converting file X, back up as X_orig\n"),
+#else /* def __VMS */
+ N_("\
+ -K, --backup-converted before converting file X, back up as X.orig\n"),
+#endif /* def __VMS [else] */
+ N_("\
+ -m, --mirror shortcut for -N -r -l inf --no-remove-listing\n"),
+ N_("\
+ -p, --page-requisites get all images, etc. needed to display HTML page\n"),
+ N_("\
+ --strict-comments turn on strict (SGML) handling of HTML comments\n"),
+ "\n",
+
+ N_("\
+Recursive accept/reject:\n"),
+ N_("\
+ -A, --accept=LIST comma-separated list of accepted extensions\n"),
+ N_("\
+ -R, --reject=LIST comma-separated list of rejected extensions\n"),
+ N_("\
+ --accept-regex=REGEX regex matching accepted URLs\n"),
+ N_("\
+ --reject-regex=REGEX regex matching rejected URLs\n"),
+#if defined HAVE_LIBPCRE || defined HAVE_LIBPCRE2
+ N_("\
+ --regex-type=TYPE regex type (posix|pcre)\n"),
+#else
+ N_("\
+ --regex-type=TYPE regex type (posix)\n"),
+#endif
+ N_("\
+ -D, --domains=LIST comma-separated list of accepted domains\n"),
+ N_("\
+ --exclude-domains=LIST comma-separated list of rejected domains\n"),
+ N_("\
+ --follow-ftp follow FTP links from HTML documents\n"),
+ N_("\
+ --follow-tags=LIST comma-separated list of followed HTML tags\n"),
+ N_("\
+ --ignore-tags=LIST comma-separated list of ignored HTML tags\n"),
+ N_("\
+ -H, --span-hosts go to foreign hosts when recursive\n"),
+ N_("\
+ -L, --relative follow relative links only\n"),
+ N_("\
+ -I, --include-directories=LIST list of allowed directories\n"),
+ N_("\
+ --trust-server-names use the name specified by the redirection\n\
+ URL's last component\n"),
+ N_("\
+ -X, --exclude-directories=LIST list of excluded directories\n"),
+ N_("\
+ -np, --no-parent don't ascend to the parent directory\n"),
+ "\n",
+ N_("Email bug reports, questions, discussions to <bug-wget@gnu.org>\n"
+ "and/or open issues at https://savannah.gnu.org/bugs/?func=additem&group=wget.\n")
+ };
+
+ size_t i;
+
+ if (printf (_("GNU Wget %s, a non-interactive network retriever.\n"),
+ version_string) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ if (print_usage (0) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ for (i = 0; i < countof (help); i++)
+ if (fputs (_(help[i]), stdout) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+#endif /* TESTING */
+ exit (WGET_EXIT_SUCCESS);
+}
+
+/* Return a human-readable printed representation of INTERVAL,
+ measured in seconds. */
+
+static char *
+secs_to_human_time (double interval)
+{
+ static char buf[32];
+ int secs = (int) (interval + 0.5);
+ int hours, mins, days;
+
+ days = secs / 86400, secs %= 86400;
+ hours = secs / 3600, secs %= 3600;
+ mins = secs / 60, secs %= 60;
+
+ if (days)
+ sprintf (buf, "%dd %dh %dm %ds", days, hours, mins, secs);
+ else if (hours)
+ sprintf (buf, "%dh %dm %ds", hours, mins, secs);
+ else if (mins)
+ sprintf (buf, "%dm %ds", mins, secs);
+ else
+ sprintf (buf, "%ss", print_decimal (interval));
+
+ return buf;
+}
+
+static char *
+prompt_for_password (void)
+{
+ if (opt.user)
+ fprintf (stderr, _("Password for user %s: "), quote (opt.user));
+ else
+ fprintf (stderr, _("Password: "));
+#ifndef TESTING
+ /* gnulib's getpass() uses static variables internally, bad for fuzing */
+ return getpass("");
+#else
+ return xstrdup("");
+#endif
+}
+
+
+/* Execute external application opt.use_askpass */
+static void
+run_use_askpass (char *question, char **answer)
+{
+ char tmp[1024];
+ pid_t pid;
+ int status;
+ int com[2];
+ ssize_t bytes = 0;
+ char *argv[3], *p;
+ posix_spawn_file_actions_t fa;
+
+ if (pipe (com) == -1)
+ {
+ fprintf (stderr, _("Cannot create pipe\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ status = posix_spawn_file_actions_init (&fa);
+ if (status)
+ {
+ fprintf (stderr,
+ _("Error initializing spawn file actions for use-askpass: %d\n"),
+ status);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ status = posix_spawn_file_actions_adddup2 (&fa, com[1], STDOUT_FILENO);
+ if (status)
+ {
+ fprintf (stderr,
+ _("Error setting spawn file actions for use-askpass: %d\n"),
+ status);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ /* C89 initializer lists must be computable at load time,
+ * thus this explicit initialization. */
+ argv[0] = opt.use_askpass;
+ argv[1] = question;
+ argv[2] = NULL;
+
+ status = posix_spawnp (&pid, opt.use_askpass, &fa, NULL, argv, environ);
+ if (status)
+ {
+ fprintf (stderr, "Error spawning %s: %d\n", opt.use_askpass, status);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ /* Parent process reads from child. */
+ close (com[1]);
+ bytes = read (com[0], tmp, sizeof (tmp) - 1);
+ if (bytes <= 0)
+ {
+ fprintf (stderr,
+ _("Error reading response from command \"%s %s\": %s\n"),
+ opt.use_askpass, question, strerror (errno));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ /* Make sure there is a trailing 0 */
+ tmp[bytes] = '\0';
+
+ /* Remove a possible new line */
+ if ((p = strpbrk (tmp, "\r\n")))
+ bytes = p - tmp;
+
+ *answer = xmemdup0 (tmp, bytes);
+}
+
+/* set the user name and password*/
+static void
+use_askpass (struct url *u)
+{
+ static char question[1024];
+
+ if (u->user == NULL || u->user[0] == '\0')
+ {
+ snprintf (question, sizeof (question), _("Username for '%s%s': "),
+ scheme_leading_string(u->scheme), u->host);
+ /* Prompt for username */
+ run_use_askpass (question, &u->user);
+ if (opt.recursive)
+ opt.user = xstrdup (u->user);
+ }
+
+ if (u->passwd == NULL || u->passwd[0] == '\0')
+ {
+ snprintf(question, sizeof (question), _("Password for '%s%s@%s': "),
+ scheme_leading_string (u->scheme), u->user, u->host);
+ /* Prompt for password */
+ run_use_askpass (question, &u->passwd);
+ if (opt.recursive)
+ opt.passwd = xstrdup (u->passwd);
+ }
+}
+/* Function that prints the line argument while limiting it
+ to at most line_length. prefix is printed on the first line
+ and an appropriate number of spaces are added on subsequent
+ lines.*/
+static int
+format_and_print_line (const char *prefix, const char *line,
+ int line_length)
+{
+ int remaining_chars;
+ char *line_dup, *token;
+
+ assert (prefix != NULL);
+ assert (line != NULL);
+ assert (line_length > TABULATION);
+
+ line_dup = xstrdup (line);
+
+ if (printf ("%s", prefix) < 0)
+ {
+ xfree (line_dup);
+ return -1;
+ }
+
+ /* Wrap to new line after prefix. */
+ remaining_chars = 0;
+
+ /* We break on spaces. */
+ token = strtok (line_dup, " ");
+ while (token != NULL)
+ {
+ /* If however a token is much larger than the maximum
+ line length, all bets are off and we simply print the
+ token on the next line. */
+ if (remaining_chars <= (int) strlen (token))
+ {
+ if (printf ("\n%*c", TABULATION, ' ') < 0)
+ {
+ xfree (line_dup);
+ return -1;
+ }
+ remaining_chars = line_length - TABULATION;
+ }
+ if (printf ("%s ", token) < 0)
+ {
+ xfree (line_dup);
+ return -1;
+ }
+ remaining_chars -= strlen (token) + 1; /* account for " " */
+ token = strtok (NULL, " ");
+ }
+
+ if (printf ("\n") < 0)
+ {
+ xfree (line_dup);
+ return -1;
+ }
+
+ xfree (line_dup);
+ return 0;
+}
+
+_Noreturn static void
+print_version (void)
+{
+ const char *wgetrc_title = _("Wgetrc: ");
+ const char *locale_title = _("Locale: ");
+ const char *compile_title = _("Compile: ");
+ const char *link_title = _("Link: ");
+ char *env_wgetrc, *user_wgetrc;
+ int i;
+
+ if (printf (_("GNU Wget %s built on %s.\n\n"), version_string, OS_TYPE) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ for (i = 0; compiled_features[i] != NULL; )
+ {
+ int line_length = MAX_CHARS_PER_LINE;
+ while ((line_length > 0) && (compiled_features[i] != NULL))
+ {
+ if (printf ("%s ", compiled_features[i]) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ line_length -= (int) strlen (compiled_features[i]) + 2;
+ i++;
+ }
+ if (printf ("\n") < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ }
+ if (printf ("\n") < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ /* Print VMS-specific version info. */
+#ifdef __VMS
+ if (vms_version_supplement() < 0)
+ exit (WGET_EXIT_IO_FAIL);
+#endif /* def __VMS */
+
+ /* Handle the case when $WGETRC is unset and $HOME/.wgetrc is
+ absent. */
+ if (printf ("%s\n", wgetrc_title) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ env_wgetrc = wgetrc_env_file_name ();
+ if (env_wgetrc && *env_wgetrc)
+ {
+ if (printf (_(" %s (env)\n"), env_wgetrc) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ xfree (env_wgetrc);
+ }
+ user_wgetrc = wgetrc_user_file_name ();
+ if (user_wgetrc)
+ {
+ if (printf (_(" %s (user)\n"), user_wgetrc) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ xfree (user_wgetrc);
+ }
+#ifdef SYSTEM_WGETRC
+ if (printf (_(" %s (system)\n"), SYSTEM_WGETRC) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+#endif
+
+#ifdef ENABLE_NLS
+ if (format_and_print_line (locale_title,
+ LOCALEDIR,
+ MAX_CHARS_PER_LINE) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+#endif /* def ENABLE_NLS */
+
+ if (compilation_string != NULL)
+ if (format_and_print_line (compile_title,
+ compilation_string,
+ MAX_CHARS_PER_LINE) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ if (link_string != NULL)
+ if (format_and_print_line (link_title,
+ link_string,
+ MAX_CHARS_PER_LINE) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ if (printf ("\n") < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ /* TRANSLATORS: When available, an actual copyright character
+ (circle-c) should be used in preference to "(C)". */
+ if (printf (_("\
+Copyright (C) %s Free Software Foundation, Inc.\n"), "2015") < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ if (fputs (_("\
+License GPLv3+: GNU GPL version 3 or later\n\
+<http://www.gnu.org/licenses/gpl.html>.\n\
+This is free software: you are free to change and redistribute it.\n\
+There is NO WARRANTY, to the extent permitted by law.\n"), stdout) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ /* TRANSLATORS: When available, please use the proper diacritics for
+ names such as this one. See en_US.po for reference. */
+ if (fputs (_("\nOriginally written by Hrvoje Niksic <hniksic@xemacs.org>.\n"),
+ stdout) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+ if (fputs (_("Please send bug reports and questions to <bug-wget@gnu.org>.\n"),
+ stdout) < 0)
+ exit (WGET_EXIT_IO_FAIL);
+
+ exit (WGET_EXIT_SUCCESS);
+}
+
+const char *program_name; /* Needed by lib/error.c. */
+const char *program_argstring; /* Needed by wget_warc.c. */
+struct ptimer *timer;
+int cleaned_up;
+
+int
+main (int argc, char **argv)
+{
+ char *p;
+ int i, ret, longindex;
+ int nurls;
+ int retconf;
+ int argstring_length;
+ bool use_userconfig = false;
+ bool noconfig = false;
+ bool append_to_log = false;
+
+ cleaned_up = 0; /* do cleanup later */
+
+ timer = ptimer_new ();
+ double start_time = ptimer_measure (timer);
+
+ total_downloaded_bytes = 0;
+ program_name = argv[0];
+
+ i18n_initialize ();
+
+ /* Construct the name of the executable, without the directory part. */
+#ifdef __VMS
+ /* On VMS, lose the "dev:[dir]" prefix and the ".EXE;nnn" suffix. */
+ exec_name = vms_basename (argv[0]);
+#else /* def __VMS */
+ exec_name = base_name (argv[0]);
+#endif /* def __VMS [else] */
+
+#ifdef WINDOWS
+ /* Drop extension (typically .EXE) from executable filename. */
+ windows_main ((char **) &exec_name);
+#endif
+
+ /* Construct the arguments string. */
+ for (argstring_length = 1, i = 1; i < argc; i++)
+ argstring_length += strlen (argv[i]) + 3 + 1;
+ program_argstring = p = malloc (argstring_length);
+ if (p == NULL)
+ {
+ fprintf (stderr, _("Memory allocation problem\n"));
+ exit (WGET_EXIT_PARSE_ERROR);
+ }
+ for (i = 1; i < argc; i++)
+ {
+ int arglen;
+
+ *p++ = '"';
+ arglen = strlen (argv[i]);
+ memcpy (p, argv[i], arglen);
+ p += arglen;
+ *p++ = '"';
+ *p++ = ' ';
+ }
+ *p = '\0';
+
+ /* Load the hard-coded defaults. */
+ defaults ();
+ opt.homedir = home_dir();
+
+ init_switches ();
+
+ /* This separate getopt_long is needed to find the user config file
+ option ("--config") and parse it before the other user options. */
+ longindex = -1;
+
+ while ((retconf = getopt_long (argc, argv,
+ short_options, long_options, &longindex)) != -1)
+ {
+ int confval;
+ struct cmdline_option *config_opt;
+
+ /* There is no short option for "--config". */
+ if (longindex >= 0)
+ {
+ confval = long_options[longindex].val;
+ config_opt = &option_data[confval & ~BOOLEAN_NEG_MARKER];
+ if (strcmp (config_opt->long_name, "no-config") == 0)
+ {
+ noconfig = true;
+ break;
+ }
+ else if (strcmp (config_opt->long_name, "config") == 0)
+ {
+ file_stats_t flstats;
+ use_userconfig = true;
+ memset(&flstats, 0, sizeof(flstats));
+ if (file_exists_p(optarg, &flstats) && run_wgetrc (optarg, &flstats))
+ break;
+ else
+ {
+ fprintf (stderr, _("Exiting due to error in %s\n"), optarg);
+ exit (WGET_EXIT_PARSE_ERROR);
+ }
+ }
+ }
+ }
+
+ /* If the user did not specify a config, read the system wgetrc and ~/.wgetrc. */
+ if (noconfig == false && use_userconfig == false)
+ if ((ret = initialize ()))
+ return ret;
+
+ opterr = 0;
+ optind = 0;
+
+ longindex = -1;
+ while ((ret = getopt_long (argc, argv,
+ short_options, long_options, &longindex)) != -1)
+ {
+ int val;
+ struct cmdline_option *cmdopt;
+
+ /* If LONGINDEX is unchanged, it means RET is referring a short
+ option. */
+ if (longindex == -1)
+ {
+ if (ret == '?')
+ {
+ print_usage (1);
+ fprintf (stderr, "\n");
+ fprintf (stderr, _("Try `%s --help' for more options.\n"),
+ exec_name);
+ exit (WGET_EXIT_PARSE_ERROR);
+ }
+ /* Find the short option character in the mapping. */
+ longindex = optmap[ret - 32];
+ }
+ val = long_options[longindex].val;
+
+ /* Use the retrieved value to locate the option in the
+ option_data array, and to see if we're dealing with the
+ negated "--no-FOO" variant of the boolean option "--foo". */
+ cmdopt = &option_data[val & ~BOOLEAN_NEG_MARKER];
+ switch (cmdopt->type)
+ {
+ case OPT_VALUE:
+ setoptval (cmdopt->data, optarg, cmdopt->long_name);
+ break;
+ case OPT_BOOLEAN:
+ if (optarg)
+ /* The user has specified a value -- use it. */
+ setoptval (cmdopt->data, optarg, cmdopt->long_name);
+ else
+ {
+ /* NEG is true for `--no-FOO' style boolean options. */
+ bool neg = !!(val & BOOLEAN_NEG_MARKER);
+ setoptval (cmdopt->data, neg ? "0" : "1", cmdopt->long_name);
+ }
+ break;
+ case OPT_FUNCALL:
+ {
+ void (*func) (void) = (void (*) (void)) cmdopt->data;
+ func ();
+ }
+ break;
+ case OPT__APPEND_OUTPUT:
+ setoptval ("logfile", optarg, cmdopt->long_name);
+ append_to_log = true;
+ break;
+ case OPT__EXECUTE:
+ if (optarg) /* check silences static analyzer */
+ run_command (optarg);
+ break;
+ case OPT__NO:
+ {
+ /* We support real --no-FOO flags now, but keep these
+ short options for convenience and backward
+ compatibility. */
+ for (p = optarg; p && *p; p++)
+ switch (*p)
+ {
+ case 'v':
+ setoptval ("verbose", "0", cmdopt->long_name);
+ break;
+ case 'H':
+ setoptval ("addhostdir", "0", cmdopt->long_name);
+ break;
+ case 'd':
+ setoptval ("dirstruct", "0", cmdopt->long_name);
+ break;
+ case 'c':
+ setoptval ("noclobber", "1", cmdopt->long_name);
+ break;
+ case 'p':
+ setoptval ("noparent", "1", cmdopt->long_name);
+ break;
+ default:
+ fprintf (stderr, _("%s: illegal option -- `-n%c'\n"),
+ exec_name, *p);
+ print_usage (1);
+ fprintf (stderr, "\n");
+ fprintf (stderr, _("Try `%s --help' for more options.\n"),
+ exec_name);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ break;
+ }
+ case OPT__PARENT:
+ case OPT__CLOBBER:
+ {
+ /* The wgetrc commands are named noparent and noclobber,
+ so we must revert the meaning of the cmdline options
+ before passing the value to setoptval. */
+ bool flag = true;
+ if (optarg)
+ flag = (*optarg == '1' || c_tolower (*optarg) == 'y'
+ || (c_tolower (optarg[0]) == 'o'
+ && c_tolower (optarg[1]) == 'n'));
+ setoptval (cmdopt->type == OPT__PARENT ? "noparent" : "noclobber",
+ flag ? "0" : "1", cmdopt->long_name);
+ break;
+ }
+ case OPT__DONT_REMOVE_LISTING:
+ setoptval ("removelisting", "0", cmdopt->long_name);
+ break;
+ }
+
+ longindex = -1;
+ }
+
+ nurls = argc - optind;
+
+ /* Initialize logging ASAP. */
+ log_init (opt.lfilename, append_to_log);
+
+ /* If we do not have Debug support compiled in AND Wget is invoked with the
+ * --debug switch, instead of failing, we silently turn it into a no-op. For
+ * this no-op, we explicitly set opt.debug to false and hence none of the
+ * Debug output messages will be printed.
+ */
+#ifndef ENABLE_DEBUG
+ if (opt.debug)
+ {
+ fprintf (stderr, _("Debugging support not compiled in. "
+ "Ignoring --debug flag.\n"));
+ opt.debug = false;
+ }
+#endif
+
+ /* All user options have now been processed, so it's now safe to do
+ interoption dependency checks. */
+
+ if (opt.noclobber && (opt.convert_links || opt.convert_file_only))
+ {
+ fprintf (stderr,
+ opt.convert_links ?
+ _("Both --no-clobber and --convert-links were specified,"
+ " only --convert-links will be used.\n") :
+ _("Both --no-clobber and --convert-file-only were specified,"
+ " only --convert-file-only will be used.\n"));
+ opt.noclobber = false;
+ }
+
+ if (opt.reclevel == 0)
+ opt.reclevel = INFINITE_RECURSION; /* see recur.h for commentary */
+
+ if (opt.spider || opt.delete_after)
+ opt.no_dirstruct = true;
+
+ if (opt.page_requisites && !opt.recursive)
+ {
+ /* Don't set opt.recursive here because it would confuse the FTP
+ code. Instead, call retrieve_tree below when either
+ page_requisites or recursive is requested. */
+ opt.reclevel = 0;
+ if (!opt.no_dirstruct)
+ opt.dirstruct = 1; /* normally handled by cmd_spec_recursive() */
+ }
+
+ if (opt.verbose == -1)
+ opt.verbose = !opt.quiet;
+
+ if (!opt.verbose && opt.show_progress == -1)
+ opt.show_progress = false;
+
+ if (opt.quiet && opt.show_progress == -1)
+ opt.show_progress = false;
+
+ /* Sanity checks. */
+ if (opt.verbose && opt.quiet)
+ {
+ fprintf (stderr, _("Can't be verbose and quiet at the same time.\n"));
+ print_usage (1);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (opt.timestamping && opt.noclobber)
+ {
+ fprintf (stderr, _("\
+Can't timestamp and not clobber old files at the same time.\n"));
+ print_usage (1);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+#ifdef ENABLE_IPV6
+ if (opt.ipv4_only && opt.ipv6_only)
+ {
+ fprintf (stderr,
+ _("Cannot specify both --inet4-only and --inet6-only.\n"));
+ print_usage (1);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+#endif
+ if (opt.output_document)
+ {
+ if ((opt.convert_links || opt.convert_file_only)
+ && (nurls > 1 || opt.page_requisites || opt.recursive))
+ {
+ fputs (_("\
+Cannot specify both -k or --convert-file-only and -O if multiple URLs are given, or in combination\n\
+with -p or -r. See the manual for details.\n\n"), stderr);
+ print_usage (1);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (opt.page_requisites
+ || opt.recursive)
+ {
+ logprintf (LOG_NOTQUIET, "%s", _("\
+WARNING: combining -O with -r or -p will mean that all downloaded content\n\
+will be placed in the single file you specified.\n\n"));
+ }
+ if (opt.timestamping)
+ {
+ logprintf (LOG_NOTQUIET, "%s", _("\
+WARNING: timestamping does nothing in combination with -O. See the manual\n\
+for details.\n\n"));
+ opt.timestamping = false;
+ }
+ if (opt.noclobber && file_exists_p(opt.output_document, NULL))
+ {
+ /* Check if output file exists; if it does, exit. */
+ logprintf (LOG_VERBOSE,
+ _("File %s already there; not retrieving.\n"),
+ quote (opt.output_document));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+ if (opt.warc_filename != 0)
+ {
+ if (opt.noclobber)
+ {
+ fprintf (stderr,
+ _("WARC output does not work with --no-clobber, "
+ "--no-clobber will be disabled.\n"));
+ opt.noclobber = false;
+ }
+ if (opt.timestamping)
+ {
+ fprintf (stderr,
+ _("WARC output does not work with timestamping, "
+ "timestamping will be disabled.\n"));
+ opt.timestamping = false;
+ }
+ if (opt.spider)
+ {
+ fprintf (stderr,
+ _("WARC output does not work with --spider.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (opt.always_rest || opt.start_pos >= 0)
+ {
+ fprintf (stderr,
+ _("WARC output does not work with --continue or"
+ " --start-pos, they will be disabled.\n"));
+ opt.always_rest = false;
+ opt.start_pos = -1;
+ }
+ if (opt.warc_cdx_dedup_filename != 0 && !opt.warc_digests_enabled)
+ {
+ fprintf (stderr,
+ _("Digests are disabled; WARC deduplication will "
+ "not find duplicate records.\n"));
+ }
+ if (opt.warc_keep_log)
+ {
+ opt.progress_type = xstrdup ("dot");
+ }
+ }
+
+#ifdef HAVE_LIBZ
+ if (opt.always_rest || opt.start_pos >= 0)
+ {
+ if (opt.compression == compression_auto)
+ {
+ /* Compression does not work with --continue or --start-pos.
+ Since compression was not explicitly set, it will be disabled. */
+ opt.compression = compression_none;
+ }
+ else if (opt.compression != compression_none)
+ {
+ fprintf (stderr,
+ _("Compression does not work with --continue or"
+ " --start-pos, they will be disabled.\n"));
+ opt.always_rest = false;
+ opt.start_pos = -1;
+ }
+ }
+#endif
+
+ if (opt.ask_passwd && opt.passwd)
+ {
+ fprintf (stderr,
+ _("Cannot specify both --ask-password and --password.\n"));
+ print_usage (1);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (opt.ask_passwd && !(opt.user || opt.http_user || opt.ftp_user))
+ {
+ fprintf(stderr,
+ _("WARNING: No username set with --ask-password. This is usually not what you want.\n"));
+ }
+
+ if (opt.start_pos >= 0 && opt.always_rest)
+ {
+ fprintf (stderr,
+ _("Specifying both --start-pos and --continue is not "
+ "recommended; --continue will be disabled.\n"));
+ opt.always_rest = false;
+ }
+
+ if (!nurls && !opt.input_filename
+#ifdef HAVE_METALINK
+ && !opt.input_metalink
+#endif
+ )
+ {
+ /* No URL specified. */
+#ifndef TESTING
+ fprintf (stderr, _("%s: missing URL\n"), exec_name);
+ print_usage (1);
+ fprintf (stderr, "\n");
+ /* #### Something nicer should be printed here -- similar to the
+ pre-1.5 `--help' page. */
+ fprintf (stderr, _("Try `%s --help' for more options.\n"), exec_name);
+#endif
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ /* Compile the regular expressions. */
+ switch (opt.regex_type)
+ {
+#ifdef HAVE_LIBPCRE2
+ case regex_type_pcre:
+ opt.regex_compile_fun = compile_pcre2_regex;
+ opt.regex_match_fun = match_pcre2_regex;
+ break;
+#endif
+#ifdef HAVE_LIBPCRE
+ case regex_type_pcre:
+ opt.regex_compile_fun = compile_pcre_regex;
+ opt.regex_match_fun = match_pcre_regex;
+ break;
+#endif
+
+ case regex_type_posix:
+ default:
+ opt.regex_compile_fun = compile_posix_regex;
+ opt.regex_match_fun = match_posix_regex;
+ break;
+ }
+ if (opt.acceptregex_s)
+ {
+ opt.acceptregex = opt.regex_compile_fun (opt.acceptregex_s);
+ if (!opt.acceptregex)
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (opt.rejectregex_s)
+ {
+ opt.rejectregex = opt.regex_compile_fun (opt.rejectregex_s);
+ if (!opt.rejectregex)
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (opt.post_data || opt.post_file_name)
+ {
+ if (opt.post_data && opt.post_file_name)
+ {
+ fprintf (stderr, _("You cannot specify both --post-data and --post-file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ else if (opt.method)
+ {
+ fprintf (stderr, _("You cannot use --post-data or --post-file along with --method. "
+ "--method expects data through --body-data and --body-file options\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+ if (opt.body_data || opt.body_file)
+ {
+ if (!opt.method)
+ {
+ fprintf (stderr, _("You must specify a method through --method=HTTPMethod "
+ "to use with --body-data or --body-file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ else if (opt.body_data && opt.body_file)
+ {
+ fprintf (stderr, _("You cannot specify both --body-data and --body-file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+ /* Set various options as required for opt.method. */
+
+ /* When user specifies HEAD as the method, we do not wish to download any
+ files. Hence, set wget to run in spider mode. */
+ if (opt.method && c_strcasecmp (opt.method, "HEAD") == 0)
+ setoptval ("spider", "1", "spider");
+
+ /* Convert post_data to body-data and post_file_name to body-file options.
+ This is required so as to remove redundant code later on in gethttp().
+ The --post-data and --post-file options may also be removed in
+ the future hence it makes sense to convert them to aliases for
+ the more generic --method options.
+ This MUST occur only after the sanity checks so as to prevent the
+ user from setting both post and body options simultaneously.
+ */
+ if (opt.post_data || opt.post_file_name)
+ {
+ setoptval ("method", "POST", "method");
+ if (opt.post_data)
+ {
+ setoptval ("bodydata", opt.post_data, "body-data");
+ xfree(opt.post_data);
+ }
+ else
+ {
+ setoptval ("bodyfile", opt.post_file_name, "body-file");
+ xfree(opt.post_file_name);
+ }
+ }
+
+#ifdef ENABLE_IRI
+ if (opt.enable_iri)
+ {
+ if (opt.locale && !check_encoding_name (opt.locale))
+ xfree (opt.locale);
+
+ if (!opt.locale)
+ opt.locale = find_locale ();
+
+ if (opt.encoding_remote && !check_encoding_name (opt.encoding_remote))
+ xfree (opt.encoding_remote);
+ }
+#else
+ memset (&dummy_iri, 0, sizeof (dummy_iri));
+ if (opt.enable_iri || opt.locale || opt.encoding_remote)
+ {
+ /* sXXXav : be more specific... */
+ fprintf (stderr, _("This version does not have support for IRIs\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+#endif
+
+ if (opt.ask_passwd)
+ {
+ opt.passwd = prompt_for_password ();
+
+ if (opt.passwd == NULL || opt.passwd[0] == '\0')
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (opt.use_askpass)
+ {
+ if (opt.use_askpass[0] == '\0')
+ {
+ fprintf (stderr,
+ _("use-askpass requires a string or either environment variable WGET_ASKPASS or SSH_ASKPASS to be set.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+#ifdef USE_WATT32
+ if (opt.wdebug)
+ dbug_init();
+ sock_init();
+#elif ! defined TESTING
+ if (opt.background)
+ {
+ bool logfile_changed = fork_to_background ();
+
+ if (logfile_changed)
+ log_init (opt.lfilename, append_to_log);
+ }
+#endif
+
+ /* Initialize progress. Have to do this after the options are
+ processed so we know where the log file is. */
+ if (opt.show_progress)
+ set_progress_implementation (opt.progress_type);
+
+ /* Open WARC file. */
+ if (opt.warc_filename != 0)
+ warc_init ();
+
+ DEBUGP (("DEBUG output created by Wget %s on %s.\n\n",
+ version_string, OS_TYPE));
+
+ /* Open the output filename if necessary. */
+
+/* 2005-04-17 SMS.
+ Note that having the output_stream ("-O") file opened here for an FTP
+ URL rather than in getftp() (ftp.c) (and the http equivalent) rather
+ limits the ability in VMS to open the file differently for ASCII
+ versus binary FTP there. (Of course, doing it here allows a open
+ failure to be detected immediately, without first connecting to the
+ server.)
+*/
+ if (opt.output_document)
+ {
+ if (HYPHENP (opt.output_document))
+ {
+#ifdef WINDOWS
+ _setmode (_fileno (stdout), _O_BINARY);
+#endif
+ output_stream = stdout;
+ }
+ else
+ {
+ struct stat st;
+
+#ifdef __VMS
+/* Common fopen() optional arguments:
+ sequential access only, access callback function.
+*/
+# define FOPEN_OPT_ARGS , "fop=sqo", "acc", acc_cb, &open_id
+ int open_id = 7;
+#else /* def __VMS */
+# define FOPEN_OPT_ARGS
+#endif /* def __VMS [else] */
+
+ output_stream = fopen (opt.output_document,
+ opt.always_rest ? "ab" : "wb"
+ FOPEN_OPT_ARGS);
+ if (output_stream == NULL)
+ {
+ perror (opt.output_document);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (fstat (fileno (output_stream), &st) == 0 && S_ISREG (st.st_mode))
+ output_stream_regular = true;
+ }
+ if (!output_stream_regular && (opt.convert_links || opt.recursive))
+ {
+ fprintf (stderr, _("-k or -r can be used together with -O only if \
+outputting to a regular file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ if (!output_stream_regular && (opt.convert_links || opt.convert_file_only))
+ {
+ fprintf (stderr, _("--convert-links or --convert-file-only can be used together \
+only if outputting to a regular file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+#ifdef HAVE_LIBCARES
+ if (opt.bind_dns_address || opt.dns_servers)
+ {
+ if (ares_library_init (ARES_LIB_INIT_ALL))
+ {
+ fprintf (stderr, _("Failed to init libcares\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (ares_init (&ares) != ARES_SUCCESS)
+ {
+ fprintf (stderr, _("Failed to init c-ares channel\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (opt.bind_dns_address)
+ {
+ struct in_addr a4;
+#ifdef ENABLE_IPV6
+ struct in6_addr a6;
+#endif
+
+ if (inet_pton (AF_INET, opt.bind_dns_address, &a4) == 1)
+ {
+ ares_set_local_ip4 (ares, ntohl (a4.s_addr));
+ }
+#ifdef ENABLE_IPV6
+ else if (inet_pton (AF_INET6, opt.bind_dns_address, &a6) == 1)
+ {
+ ares_set_local_ip6 (ares, (unsigned char *) &a6);
+ }
+#endif
+ else
+ {
+ fprintf (stderr, _("Failed to parse IP address '%s'\n"), opt.bind_dns_address);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+ if (opt.dns_servers)
+ {
+ int result;
+
+ if ((result = ares_set_servers_csv (ares, opt.dns_servers)) != ARES_SUCCESS)
+ {
+ fprintf (stderr, _("Failed to set DNS server(s) '%s' (%d)\n"), opt.dns_servers, result);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+ }
+#endif
+
+#ifdef __VMS
+ /* Set global ODS5 flag according to the specified destination (if
+ any), otherwise according to the current default device.
+ */
+ if (output_stream == NULL)
+ set_ods5_dest( "SYS$DISK");
+ else if (output_stream != stdout)
+ set_ods5_dest( opt.output_document);
+#endif /* def __VMS */
+
+#ifdef WINDOWS
+ ws_startup ();
+#endif
+
+#ifdef SIGHUP
+ /* Setup the signal handler to redirect output when hangup is
+ received. */
+ if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
+ signal(SIGHUP, redirect_output_signal);
+#endif
+ /* ...and do the same for SIGUSR1. */
+#ifdef SIGUSR1
+ signal (SIGUSR1, redirect_output_signal);
+#endif
+#ifdef SIGPIPE
+ /* Writing to a closed socket normally signals SIGPIPE, and the
+ process exits. What we want is to ignore SIGPIPE and just check
+ for the return value of write(). */
+ signal (SIGPIPE, SIG_IGN);
+#endif
+#ifdef SIGWINCH
+ signal (SIGWINCH, progress_handle_sigwinch);
+#endif
+
+#ifdef HAVE_HSTS
+ /* Load the HSTS database.
+ Maybe all the URLs are FTP(S), in which case HSTS would not be needed,
+ but this is the best place to do it, and it shouldn't be a critical
+ performance hit.
+ */
+ if (opt.hsts)
+ load_hsts ();
+#endif
+
+ /* Retrieve the URLs from argument list. */
+ for (i = 0; i < nurls; i++, optind++)
+ {
+ char *t;
+ char *filename = NULL, *redirected_URL = NULL;
+ int dt = 0, url_err;
+ /* Need to do a new struct iri every time, because
+ * retrieve_url may modify it in some circumstances,
+ * currently. */
+ struct iri *iri = iri_new ();
+ struct url *url_parsed;
+
+ t = rewrite_shorthand_url (argv[optind]);
+ if (!t)
+ t = argv[optind];
+
+ set_uri_encoding (iri, opt.locale, true);
+ url_parsed = url_parse (t, &url_err, iri, true);
+
+ if (!url_parsed)
+ {
+ char *error = url_error (t, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n",t, error);
+ xfree (error);
+ inform_exit_status (URLERROR);
+ }
+ else
+ {
+ /* Request credentials if use_askpass is set. */
+ if (opt.use_askpass)
+ use_askpass (url_parsed);
+
+ if ((opt.recursive || opt.page_requisites)
+ && ((url_scheme (t) != SCHEME_FTP
+#ifdef HAVE_SSL
+ && url_scheme (t) != SCHEME_FTPS
+#endif
+ )
+ || url_uses_proxy (url_parsed)))
+ {
+ int old_follow_ftp = opt.follow_ftp;
+
+ /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
+ if (url_scheme (t) == SCHEME_FTP
+#ifdef HAVE_SSL
+ || url_scheme (t) == SCHEME_FTPS
+#endif
+ )
+ opt.follow_ftp = 1;
+
+ retrieve_tree (url_parsed, NULL);
+
+ opt.follow_ftp = old_follow_ftp;
+ }
+ else
+ {
+ retrieve_url (url_parsed, t, &filename, &redirected_URL, NULL,
+ &dt, opt.recursive, iri, true);
+ }
+
+ if (opt.delete_after && filename != NULL && file_exists_p (filename, NULL))
+ {
+ DEBUGP (("Removing file due to --delete-after in main():\n"));
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
+ if (unlink (filename))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ }
+ xfree (redirected_URL);
+ xfree (filename);
+ url_free (url_parsed);
+ }
+
+ iri_free (iri);
+
+ if (t != argv[optind])
+ xfree (t);
+ }
+
+ /* And then from the input file, if any. */
+ if (opt.input_filename)
+ {
+ int count;
+ int status;
+ status = retrieve_from_file (opt.input_filename, opt.force_html, &count);
+ inform_exit_status (status);
+ if (!count)
+ logprintf (LOG_NOTQUIET, _("No URLs found in %s.\n"),
+ opt.input_filename);
+ }
+
+#ifdef HAVE_METALINK
+ /* Finally, from metlink file, if any. */
+ if (opt.input_metalink)
+ {
+ metalink_error_t meta_err;
+ uerr_t retr_err;
+ metalink_t *metalink;
+
+ meta_err = metalink_parse_file (opt.input_metalink, &metalink);
+
+ if (meta_err)
+ {
+ logprintf (LOG_NOTQUIET, _("Unable to parse metalink file %s.\n"),
+ opt.input_metalink);
+ retr_err = METALINK_PARSE_ERROR;
+ }
+ else
+ {
+ /* We need to sort the resources if preferred location
+ was specified by the user. */
+ if (opt.preferred_location && opt.preferred_location[0])
+ {
+ metalink_file_t **mfile_ptr;
+ for (mfile_ptr = metalink->files; *mfile_ptr; mfile_ptr++)
+ {
+ metalink_resource_t **mres_ptr;
+ metalink_file_t *mfile = *mfile_ptr;
+ size_t mres_count = 0;
+
+ for (mres_ptr = mfile->resources; *mres_ptr; mres_ptr++)
+ mres_count++;
+
+ stable_sort (mfile->resources,
+ mres_count,
+ sizeof (metalink_resource_t *),
+ metalink_res_cmp);
+ }
+ }
+ retr_err = retrieve_from_metalink (metalink);
+ if (retr_err != RETROK)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not download all resources from %s.\n"),
+ quote (opt.input_metalink));
+ }
+ metalink_delete (metalink);
+ }
+ inform_exit_status (retr_err);
+ }
+#endif /* HAVE_METALINK */
+
+ /* Print broken links. */
+ if (opt.recursive && opt.spider)
+ print_broken_links ();
+
+ /* Print the downloaded sum. */
+ if ((opt.recursive || opt.page_requisites
+ || nurls > 1
+ || (opt.input_filename && total_downloaded_bytes != 0))
+ &&
+ total_downloaded_bytes != 0)
+ {
+ double end_time = ptimer_measure (timer);
+ char *wall_time = xstrdup (secs_to_human_time (end_time - start_time));
+ char *download_time = xstrdup (secs_to_human_time (total_download_time));
+
+ ptimer_destroy (timer); timer = NULL;
+
+ logprintf (LOG_NOTQUIET,
+ _("FINISHED --%s--\nTotal wall clock time: %s\n"
+ "Downloaded: %d files, %s in %s (%s)\n"),
+ datetime_str (time (NULL)),
+ wall_time,
+ numurls,
+ human_readable (total_downloaded_bytes, 10, 1),
+ download_time,
+ retr_rate (total_downloaded_bytes, total_download_time));
+ xfree (wall_time);
+ xfree (download_time);
+
+ /* Print quota warning, if exceeded. */
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ logprintf (LOG_NOTQUIET,
+ _("Download quota of %s EXCEEDED!\n"),
+ human_readable (opt.quota, 10, 1));
+ }
+
+ if (opt.cookies_output)
+ save_cookies ();
+
+#ifdef HAVE_HSTS
+ if (opt.hsts && hsts_store)
+ save_hsts ();
+#endif
+
+ if ((opt.convert_links || opt.convert_file_only) && !opt.delete_after)
+ convert_all_links ();
+
+ cleanup ();
+
+ exit (get_exit_status ());
+}
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/src/metalink.c b/src/metalink.c
new file mode 100644
index 0000000..81cd1b3
--- /dev/null
+++ b/src/metalink.c
@@ -0,0 +1,1599 @@
+/* Metalink module.
+ Copyright (C) 2015, 2018-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+#ifdef HAVE_METALINK
+
+#include "metalink.h"
+#include "retr.h"
+#include "exits.h"
+#include "utils.h"
+#include "md2.h"
+#include "md4.h"
+#include "md5.h"
+#include "sha1.h"
+#include "sha256.h"
+#include "sha512.h"
+#include "filename.h"
+#include "xmemdup0.h"
+#include "xstrndup.h"
+#include "c-strcase.h"
+#include <errno.h>
+#include <unistd.h> /* For unlink. */
+#include <metalink/metalink_parser.h>
+#ifdef HAVE_GPGME
+#include <gpgme.h>
+#include <fcntl.h> /* For open and close. */
+#endif
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+/* Loop through all files in metalink structure and retrieve them.
+ Returns RETROK if all files were downloaded.
+ Returns last retrieval error (from retrieve_url) if some files
+ could not be downloaded. */
+uerr_t
+retrieve_from_metalink (const metalink_t* metalink)
+{
+ metalink_file_t **mfile_ptr;
+ uerr_t last_retr_err = RETROK; /* Store last encountered retrieve error. */
+
+ FILE *_output_stream = output_stream;
+ bool _output_stream_regular = output_stream_regular;
+ char *_output_document = opt.output_document;
+
+ /* metalink file counter */
+ unsigned mfc = 0;
+
+ /* metalink retrieval type */
+ const char *metatpy = metalink->origin ? "Metalink/HTTP" : "Metalink/XML";
+
+ /* metalink mother source */
+ char *metasrc = metalink->origin ? metalink->origin : opt.input_metalink;
+
+ DEBUGP (("Retrieving from Metalink %s\n", quote (metasrc)));
+
+ /* No files to download. */
+ if (!metalink->files)
+ return RETROK;
+
+ if (opt.output_document)
+ {
+ /* We cannot support output_document as we need to compute checksum
+ of downloaded file, and to remove it if the checksum is bad. */
+ logputs (LOG_NOTQUIET,
+ _("-O not supported for metalink download. Ignoring.\n"));
+ }
+
+ for (mfile_ptr = metalink->files; *mfile_ptr; mfile_ptr++)
+ {
+ metalink_file_t *mfile = *mfile_ptr;
+ metalink_resource_t **mres_ptr;
+ char *planname = NULL;
+ char *trsrname = NULL;
+ char *filename;
+ char *basename;
+ char *safename = NULL;
+ char *destname = NULL;
+ bool size_ok = false;
+ bool hash_ok = false;
+
+ uerr_t retr_err = METALINK_MISSING_RESOURCE;
+
+ /* -1 -> file should be rejected
+ 0 -> could not verify
+ 1 -> verified successfully */
+ char sig_status = 0;
+
+ bool skip_mfile = false;
+
+ output_stream = NULL;
+
+ mfc++;
+
+ /* The directory prefix for opt.metalink_over_http is handled by
+ src/url.c (url_file_name), do not add it a second time. */
+ if (!metalink->origin && opt.dir_prefix && strlen (opt.dir_prefix))
+ planname = aprintf ("%s/%s", opt.dir_prefix, mfile->name);
+ else
+ planname = xstrdup (mfile->name);
+
+ /* With Metalink/HTTP, trust the metalink file name (from cli).
+ With --trust-server-names, trust the Metalink/XML file name,
+ otherwise, use the basename of --input-metalink followed by
+ the metalink file counter as suffix. */
+ if (metalink->origin || opt.trustservernames)
+ {
+ trsrname = xstrdup (mfile->name);
+ }
+ else
+ {
+ trsrname = xstrdup (get_metalink_basename (opt.input_metalink));
+ append_suffix_number (&trsrname, ".#", mfc);
+ }
+
+ /* Add the directory prefix for opt.input_metalink. */
+ if (!metalink->origin && opt.dir_prefix && strlen (opt.dir_prefix))
+ filename = aprintf ("%s/%s", opt.dir_prefix, trsrname);
+ else
+ filename = xstrdup (trsrname);
+
+ /* Enforce libmetalink's metalink_check_safe_path(). */
+ basename = get_metalink_basename (filename);
+ safename = metalink_check_safe_path (filename) ? filename : basename;
+
+ DEBUGP (("Processing metalink file %s...\n", quote (mfile->name)));
+ DEBUGP (("\n"));
+ DEBUGP ((" %s\n", metatpy));
+ DEBUGP (("\n"));
+ DEBUGP ((" --trust-server-names %s\n", opt.trustservernames ? "true" : "false"));
+ DEBUGP ((" --directory-prefix %s\n", quote (opt.dir_prefix ? opt.dir_prefix : "")));
+ DEBUGP (("\n"));
+ DEBUGP ((" Counted metalink file %u\n", mfc));
+ DEBUGP ((" Planned metalink file %s\n", quote (planname ? planname : "")));
+ DEBUGP ((" Trusted metalink file %s\n", quote (trsrname ? trsrname : "")));
+ DEBUGP ((" Current metalink file %s\n", quote (filename ? filename : "")));
+ DEBUGP ((" Cleaned metalink file %s\n", quote (basename ? basename : "")));
+ DEBUGP ((" Secured metalink file %s\n", quote (safename ? safename : "")));
+ DEBUGP (("\n"));
+
+ /* Verify if the planned metalink file name is safe. */
+ if (!safename || strcmp (planname, safename))
+ {
+ logprintf (LOG_NOTQUIET,
+ _("[--trust-server-names %s, --directory-prefix=%s]\n"),
+ (opt.trustservernames ? "true" : "false"),
+ quote (opt.dir_prefix ? opt.dir_prefix : ""));
+ logprintf (LOG_NOTQUIET,
+ _("Planned metalink file: %s\n"),
+ quote (planname ? planname : ""));
+ logprintf (LOG_NOTQUIET,
+ _("Secured metalink file: %s\n"),
+ quote (safename ? safename : ""));
+ if (!safename)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Rejecting metalink file. Unsafe name.\n"));
+ xfree (planname);
+ xfree (trsrname);
+ xfree (filename);
+ continue;
+ }
+ }
+
+ /* Process the chosen application/metalink4+xml metaurl. */
+ if (opt.metalink_index >= 0)
+ {
+ int _metalink_index = opt.metalink_index;
+
+ metalink_metaurl_t **murl_ptr;
+ int abs_count = 0, meta_count = 0;
+
+ uerr_t x_retr_err = METALINK_MISSING_RESOURCE;
+
+ opt.metalink_index = -1;
+
+ DEBUGP (("Searching application/metalink4+xml ordinal number %d...\n", _metalink_index));
+
+ if (mfile->metaurls && mfile->metaurls[0])
+ for (murl_ptr = mfile->metaurls; *murl_ptr; murl_ptr++)
+ {
+ metalink_t* metaurl_xml;
+ metalink_error_t meta_err;
+ metalink_metaurl_t *murl = *murl_ptr;
+
+ char *_dir_prefix = opt.dir_prefix;
+ char *_input_metalink = opt.input_metalink;
+
+ char *metafile = NULL;
+ char *metadest = NULL;
+ char *metadir = NULL;
+
+ abs_count++;
+
+ if (strcmp (murl->mediatype, "application/metalink4+xml"))
+ continue;
+
+ meta_count++;
+
+ DEBUGP ((" Ordinal number %d: %s\n", meta_count, quote (murl->url)));
+
+ if (_metalink_index > 0)
+ {
+ if (meta_count < _metalink_index)
+ continue;
+ else if (meta_count > _metalink_index)
+ break;
+ }
+
+ logprintf (LOG_NOTQUIET,
+ _("Processing metaurl %s...\n"), quote (murl->url));
+
+ /* Metalink/XML download file name. */
+ metafile = xstrdup (safename);
+
+ if (opt.trustservernames)
+ replace_metalink_basename (&metafile, murl->name ? murl->name : murl->url);
+ else
+ append_suffix_number (&metafile, ".meta#", meta_count);
+
+ if (!metalink_check_safe_path (metafile))
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Rejecting metaurl file %s. Unsafe name.\n"),
+ quote (metafile));
+ xfree (metafile);
+ if (_metalink_index > 0)
+ break;
+ continue;
+ }
+
+ /* For security reasons, always save metalink metaurl
+ files as new unique files. Keep them on failure. */
+ x_retr_err = fetch_metalink_file (murl->url, false, false,
+ metafile, &metadest);
+
+ /* On failure, try the next metalink metaurl. */
+ if (x_retr_err != RETROK)
+ {
+ logprintf (LOG_VERBOSE,
+ _("Failed to download %s. Skipping metaurl.\n"),
+ quote (metadest ? metadest : metafile));
+ inform_exit_status (x_retr_err);
+ xfree (metadest);
+ xfree (metafile);
+ if (_metalink_index > 0)
+ break;
+ continue;
+ }
+
+ /* Parse Metalink/XML. */
+ meta_err = metalink_parse_file (metadest, &metaurl_xml);
+
+ /* On failure, try the next metalink metaurl. */
+ if (meta_err)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Unable to parse metaurl file %s.\n"), quote (metadest));
+ x_retr_err = METALINK_PARSE_ERROR;
+ inform_exit_status (x_retr_err);
+ xfree (metadest);
+ xfree (metafile);
+ if (_metalink_index > 0)
+ break;
+ continue;
+ }
+
+ /* We need to sort the resources if preferred location
+ was specified by the user. */
+ if (opt.preferred_location && opt.preferred_location[0])
+ {
+ metalink_file_t **x_mfile_ptr;
+ for (x_mfile_ptr = metaurl_xml->files; *x_mfile_ptr; x_mfile_ptr++)
+ {
+ metalink_resource_t **x_mres_ptr;
+ metalink_file_t *x_mfile = *x_mfile_ptr;
+ size_t mres_count = 0;
+
+ for (x_mres_ptr = x_mfile->resources; *x_mres_ptr; x_mres_ptr++)
+ mres_count++;
+
+ stable_sort (x_mfile->resources,
+ mres_count,
+ sizeof (metalink_resource_t *),
+ metalink_res_cmp);
+ }
+ }
+
+ /* Insert the current "Directory Options". */
+ if (metalink->origin)
+ {
+ /* WARNING: Do not use lib/dirname.c (dir_name) to
+ get the directory name, it may append a dot '.'
+ character to the directory name. */
+ metadir = xstrdup (planname);
+ replace_metalink_basename (&metadir, NULL);
+ }
+ else
+ {
+ metadir = xstrdup (opt.dir_prefix);
+ }
+
+ opt.dir_prefix = metadir;
+ opt.input_metalink = metadest;
+
+ x_retr_err = retrieve_from_metalink (metaurl_xml);
+
+ if (x_retr_err != RETROK)
+ logprintf (LOG_NOTQUIET,
+ _("Could not download all resources from %s.\n"),
+ quote (metadest));
+
+ metalink_delete (metaurl_xml);
+ metaurl_xml = NULL;
+
+ opt.input_metalink = _input_metalink;
+ opt.dir_prefix = _dir_prefix;
+
+ xfree (metadir);
+ xfree (metadest);
+ xfree (metafile);
+
+ break;
+ }
+
+ if (x_retr_err != RETROK)
+ logprintf (LOG_NOTQUIET, _("Metaurls processing returned with error.\n"));
+
+ xfree (destname);
+ xfree (filename);
+ xfree (trsrname);
+ xfree (planname);
+
+ opt.output_document = _output_document;
+ output_stream_regular = _output_stream_regular;
+ output_stream = _output_stream;
+
+ opt.metalink_index = _metalink_index;
+
+ return x_retr_err;
+ }
+
+ /* Resources are sorted by priority. */
+ for (mres_ptr = mfile->resources;
+ *mres_ptr && mfile->checksums && !skip_mfile; mres_ptr++)
+ {
+ metalink_resource_t *mres = *mres_ptr;
+ metalink_checksum_t **mchksum_ptr, *mchksum;
+ struct iri *iri;
+ struct url *url;
+ file_stats_t flstats;
+ int url_err;
+
+ clean_metalink_string (&mres->url);
+
+ if (!RES_TYPE_SUPPORTED (mres->type))
+ {
+ logprintf (LOG_VERBOSE,
+ _("Resource type %s not supported, ignoring...\n"),
+ quote (mres->type));
+ continue;
+ }
+
+ /* The file is fully downloaded, but some problems were
+ encountered (checksum failure?). The loop had been
+ continued to switch to the next url. */
+ if (output_stream && retr_err == RETROK)
+ {
+ /* Do not rename/remove a continued file. Skip it. */
+ if (opt.always_rest)
+ {
+ skip_mfile = true;
+ continue;
+ }
+
+ fclose (output_stream);
+ output_stream = NULL;
+ badhash_or_remove (destname);
+ xfree (destname);
+ }
+ else if (!output_stream && destname)
+ {
+ xfree (destname);
+ }
+
+ retr_err = METALINK_RETR_ERROR;
+
+ /* Parse our resource URL. */
+ iri = iri_new ();
+ set_uri_encoding (iri, opt.locale, true);
+ url = url_parse (mres->url, &url_err, iri, false);
+
+ if (!url)
+ {
+ char *error = url_error (mres->url, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n", mres->url, error);
+ xfree (error);
+ inform_exit_status (URLERROR);
+ iri_free (iri);
+ continue;
+ }
+ else
+ {
+ /* Avoid recursive Metalink from HTTP headers. */
+ bool _metalink_http = opt.metalink_over_http;
+
+ /* If output_stream is not NULL, then we have failed on
+ previous resource and are retrying. Thus, continue
+ with the next resource. Do not close output_stream
+ while iterating over the resources, or the download
+ progress will be lost. */
+ if (output_stream)
+ {
+ DEBUGP (("Previous resource failed, continue with next resource.\n"));
+ }
+ else
+ {
+ /* Assure proper local file name regardless of the URL
+ of particular Metalink resource.
+ To do that we create the local file here and put
+ it as output_stream. We restore the original configuration
+ after we are finished with the file. */
+ if (opt.always_rest)
+ /* continue previous download */
+ output_stream = fopen (safename, "ab");
+ else
+ /* create a file with an unique name */
+ output_stream = unique_create (safename, true, &destname);
+ }
+
+ output_stream_regular = true;
+
+ /*
+ At this point, if output_stream is NULL, the file
+ couldn't be created/opened.
+
+ This happens when the metalink:file has a "path/file"
+ name format and its directory tree cannot be created:
+ * stdio.h (fopen)
+ * src/utils.c (unique_create)
+
+ RFC5854 requires a proper "path/file" format handling,
+ this can be achieved setting opt.output_document while
+ output_stream is left to NULL:
+ * src/http.c (open_output_stream): If output_stream is
+ NULL, create the opt.output_document "path/file"
+ */
+ if (!destname)
+ destname = xstrdup (safename);
+
+ /* Store the real file name for displaying in messages,
+ and for proper RFC5854 "path/file" handling. */
+ opt.output_document = destname;
+
+ opt.metalink_over_http = false;
+ DEBUGP (("Storing to %s\n", destname));
+ retr_err = retrieve_url (url, mres->url, NULL, NULL,
+ NULL, NULL, opt.recursive, iri, false);
+ opt.metalink_over_http = _metalink_http;
+
+ /*
+ Bug: output_stream is NULL, but retrieve_url() somehow
+ created destname.
+
+ Bugfix: point output_stream to destname if it exists.
+ */
+ memset(&flstats, 0, sizeof(flstats));
+ if (!output_stream && file_exists_p (destname, &flstats))
+ output_stream = fopen_stat (destname, "ab", &flstats);
+ }
+ url_free (url);
+ iri_free (iri);
+
+ if (retr_err == RETROK)
+ {
+ FILE *local_file;
+
+ /* Check the digest. */
+ local_file = fopen (destname, "rb");
+ if (!local_file)
+ {
+ logprintf (LOG_NOTQUIET, _("Could not open downloaded file.\n"));
+ continue;
+ }
+
+ size_ok = false;
+ logprintf (LOG_VERBOSE, _("Computing size for %s\n"), quote (destname));
+
+ if (!mfile->size)
+ {
+ size_ok = true;
+ logprintf (LOG_VERBOSE, _("File size not declared. Skipping check.\n"));
+ }
+ else
+ {
+ wgint local_file_size = file_size (destname);
+
+ if (local_file_size == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("Could not get downloaded file's size.\n"));
+ fclose (local_file);
+ local_file = NULL;
+ continue;
+ }
+
+ /* FIXME: what about int64? */
+ DEBUGP (("Declared size: %lld\n", mfile->size));
+ DEBUGP (("Computed size: %lld\n", (long long) local_file_size));
+
+ if (local_file_size != (wgint) mfile->size)
+ {
+ logprintf (LOG_NOTQUIET, _("Size mismatch for file %s.\n"), quote (destname));
+ fclose (local_file);
+ local_file = NULL;
+ continue;
+ }
+ else
+ {
+ size_ok = true;
+ logputs (LOG_VERBOSE, _("Size matches.\n"));
+ }
+ }
+
+ for (mchksum_ptr = mfile->checksums; *mchksum_ptr; mchksum_ptr++)
+ {
+ char md2[MD2_DIGEST_SIZE];
+ char md2_txt[2 * MD2_DIGEST_SIZE + 1];
+
+ char md4[MD4_DIGEST_SIZE];
+ char md4_txt[2 * MD4_DIGEST_SIZE + 1];
+
+ char md5[MD5_DIGEST_SIZE];
+ char md5_txt[2 * MD5_DIGEST_SIZE + 1];
+
+ char sha1[SHA1_DIGEST_SIZE];
+ char sha1_txt[2 * SHA1_DIGEST_SIZE + 1];
+
+ char sha224[SHA224_DIGEST_SIZE];
+ char sha224_txt[2 * SHA224_DIGEST_SIZE + 1];
+
+ char sha256[SHA256_DIGEST_SIZE];
+ char sha256_txt[2 * SHA256_DIGEST_SIZE + 1];
+
+ char sha384[SHA384_DIGEST_SIZE];
+ char sha384_txt[2 * SHA384_DIGEST_SIZE + 1];
+
+ char sha512[SHA512_DIGEST_SIZE];
+ char sha512_txt[2 * SHA512_DIGEST_SIZE + 1];
+
+ hash_ok = false;
+ mchksum = *mchksum_ptr;
+
+ /* I have seen both variants... */
+ if (c_strcasecmp (mchksum->type, "md2")
+ && c_strcasecmp (mchksum->type, "md4")
+ && c_strcasecmp (mchksum->type, "md5")
+ && c_strcasecmp (mchksum->type, "sha1")
+ && c_strcasecmp (mchksum->type, "sha-1")
+ && c_strcasecmp (mchksum->type, "sha224")
+ && c_strcasecmp (mchksum->type, "sha-224")
+ && c_strcasecmp (mchksum->type, "sha256")
+ && c_strcasecmp (mchksum->type, "sha-256")
+ && c_strcasecmp (mchksum->type, "sha384")
+ && c_strcasecmp (mchksum->type, "sha-384")
+ && c_strcasecmp (mchksum->type, "sha512")
+ && c_strcasecmp (mchksum->type, "sha-512"))
+ {
+ DEBUGP (("Ignoring unsupported checksum type %s.\n",
+ quote (mchksum->type)));
+ continue;
+ }
+
+ logprintf (LOG_VERBOSE, _("Computing checksum for %s\n"),
+ quote (destname));
+
+ DEBUGP (("Declared hash: %s\n", mchksum->hash));
+
+ if (c_strcasecmp (mchksum->type, "md2") == 0)
+ {
+ md2_stream (local_file, md2);
+ wg_hex_to_string (md2_txt, md2, MD2_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", md2_txt));
+ if (!strcmp (md2_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "md4") == 0)
+ {
+ md4_stream (local_file, md4);
+ wg_hex_to_string (md4_txt, md4, MD4_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", md4_txt));
+ if (!strcmp (md4_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "md5") == 0)
+ {
+ md5_stream (local_file, md5);
+ wg_hex_to_string (md5_txt, md5, MD5_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", md5_txt));
+ if (!strcmp (md5_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "sha1") == 0
+ || c_strcasecmp (mchksum->type, "sha-1") == 0)
+ {
+ sha1_stream (local_file, sha1);
+ wg_hex_to_string (sha1_txt, sha1, SHA1_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", sha1_txt));
+ if (!strcmp (sha1_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "sha224") == 0
+ || c_strcasecmp (mchksum->type, "sha-224") == 0)
+ {
+ sha224_stream (local_file, sha224);
+ wg_hex_to_string (sha224_txt, sha224, SHA224_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", sha224_txt));
+ if (!strcmp (sha224_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "sha256") == 0
+ || c_strcasecmp (mchksum->type, "sha-256") == 0)
+ {
+ sha256_stream (local_file, sha256);
+ wg_hex_to_string (sha256_txt, sha256, SHA256_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", sha256_txt));
+ if (!strcmp (sha256_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "sha384") == 0
+ || c_strcasecmp (mchksum->type, "sha-384") == 0)
+ {
+ sha384_stream (local_file, sha384);
+ wg_hex_to_string (sha384_txt, sha384, SHA384_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", sha384_txt));
+ if (!strcmp (sha384_txt, mchksum->hash))
+ hash_ok = true;
+ }
+ else if (c_strcasecmp (mchksum->type, "sha512") == 0
+ || c_strcasecmp (mchksum->type, "sha-512") == 0)
+ {
+ sha512_stream (local_file, sha512);
+ wg_hex_to_string (sha512_txt, sha512, SHA512_DIGEST_SIZE);
+ DEBUGP (("Computed hash: %s\n", sha512_txt));
+ if (!strcmp (sha512_txt, mchksum->hash))
+ hash_ok = true;
+ }
+
+ if (hash_ok)
+ {
+ logputs (LOG_VERBOSE,
+ _("Checksum matches.\n"));
+ }
+ else
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Checksum mismatch for file %s.\n"),
+ quote (destname));
+ }
+
+ /* Stop as soon as we checked the supported checksum. */
+ break;
+ } /* Iterate over available checksums. */
+ fclose (local_file);
+ local_file = NULL;
+
+ if (!hash_ok)
+ continue;
+
+ sig_status = 0; /* Not verified. */
+
+#ifdef HAVE_GPGME
+ /* Check the crypto signature.
+
+ Note that the signatures from Metalink in XML will not be
+ parsed when using libmetalink version older than 0.1.3.
+ Metalink-over-HTTP is not affected by this problem. */
+ if (mfile->signature)
+ {
+ metalink_signature_t *msig = mfile->signature;
+ gpgme_error_t gpgerr;
+ gpgme_ctx_t gpgctx;
+ gpgme_data_t gpgsigdata, gpgdata;
+ gpgme_verify_result_t gpgres;
+ gpgme_signature_t gpgsig;
+ int fd;
+
+ /* Initialize the library - as name suggests. */
+ gpgme_check_version (NULL);
+
+ /* Open data file. */
+ fd = open (destname, O_RDONLY);
+ if (fd == -1)
+ {
+ logputs (LOG_NOTQUIET,
+ _("Could not open downloaded file for signature "
+ "verification.\n"));
+ goto gpg_skip_verification;
+ }
+
+ /* Assign file descriptor to GPG data structure. */
+ gpgerr = gpgme_data_new_from_fd (&gpgdata, fd);
+ if (gpgerr != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ "GPGME data_new_from_fd: %s\n",
+ gpgme_strerror (gpgerr));
+ goto gpg_skip_verification;
+ }
+
+ /* Prepare new GPGME context. */
+ gpgerr = gpgme_new (&gpgctx);
+ if (gpgerr != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ "GPGME new: %s\n",
+ gpgme_strerror (gpgerr));
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ DEBUGP (("Verifying signature %s:\n%s\n",
+ quote (msig->mediatype),
+ msig->signature));
+
+ /* Check signature type. */
+ if (strcmp (msig->mediatype, "application/pgp-signature"))
+ {
+ /* Unsupported signature type. */
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ gpgerr = gpgme_set_protocol (gpgctx, GPGME_PROTOCOL_OpenPGP);
+ if (gpgerr != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ "GPGME set_protocol: %s\n",
+ gpgme_strerror (gpgerr));
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ /* Load the signature. */
+ gpgerr = gpgme_data_new_from_mem (&gpgsigdata,
+ msig->signature,
+ strlen (msig->signature),
+ 0);
+ if (gpgerr != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("GPGME data_new_from_mem: %s\n"),
+ gpgme_strerror (gpgerr));
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ /* Verify the signature. */
+ gpgerr = gpgme_op_verify (gpgctx, gpgsigdata, gpgdata, NULL);
+ if (gpgerr != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("GPGME op_verify: %s\n"),
+ gpgme_strerror (gpgerr));
+ gpgme_data_release (gpgsigdata);
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ /* Check the results. */
+ gpgres = gpgme_op_verify_result (gpgctx);
+ if (!gpgres)
+ {
+ logputs (LOG_NOTQUIET,
+ _("GPGME op_verify_result: NULL\n"));
+ gpgme_data_release (gpgsigdata);
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+ goto gpg_skip_verification;
+ }
+
+ /* The list is null-terminated. */
+ for (gpgsig = gpgres->signatures; gpgsig; gpgsig = gpgsig->next)
+ {
+ DEBUGP (("Checking signature %s\n", gpgsig->fpr));
+
+ if (gpgsig->summary
+ & (GPGME_SIGSUM_VALID | GPGME_SIGSUM_GREEN))
+ {
+ logputs (LOG_VERBOSE,
+ _("Signature validation succeeded.\n"));
+ sig_status = 1;
+ break;
+ }
+
+ if (gpgsig->summary & GPGME_SIGSUM_RED)
+ {
+ logputs (LOG_NOTQUIET,
+ _("Invalid signature. Rejecting resource.\n"));
+ sig_status = -1;
+ break;
+ }
+
+ if (gpgsig->summary == 0
+ && (gpgsig->status & 0xFFFF) == GPG_ERR_NO_ERROR)
+ {
+ logputs (LOG_VERBOSE,
+ _("Data matches signature, but signature "
+ "is not trusted.\n"));
+ }
+
+ if ((gpgsig->status & 0xFFFF) != GPG_ERR_NO_ERROR)
+ {
+ logprintf (LOG_NOTQUIET,
+ "GPGME: %s\n",
+ gpgme_strerror (gpgsig->status & 0xFFFF));
+ }
+ }
+ gpgme_data_release (gpgsigdata);
+ gpgme_release (gpgctx);
+ gpgme_data_release (gpgdata);
+gpg_skip_verification:
+ if (fd != -1)
+ close (fd);
+ } /* endif (mfile->signature) */
+#endif
+ /* Stop if file was downloaded with success. */
+ if (sig_status >= 0)
+ break;
+ } /* endif RETR_OK. */
+ } /* Iterate over resources. */
+
+ if (!mfile->checksums)
+ {
+ logprintf (LOG_NOTQUIET, _("No checksums found.\n"));
+ retr_err = METALINK_CHKSUM_ERROR;
+ }
+
+ if (retr_err != RETROK)
+ {
+ logprintf (LOG_VERBOSE, _("Failed to download %s. Skipping resource.\n"),
+ quote (destname ? destname : safename));
+ }
+ else if (!size_ok)
+ {
+ retr_err = METALINK_SIZE_ERROR;
+ logprintf (LOG_NOTQUIET,
+ _("File %s retrieved but size does not match. "
+ "\n"), quote (destname));
+ }
+ else if (!hash_ok)
+ {
+ retr_err = METALINK_CHKSUM_ERROR;
+ logprintf (LOG_NOTQUIET,
+ _("File %s retrieved but checksum does not match. "
+ "\n"), quote (destname));
+ }
+#ifdef HAVE_GPGME
+ /* Signature will be only validated if hash check was successful. */
+ else if (sig_status < 0)
+ {
+ retr_err = METALINK_SIG_ERROR;
+ logprintf (LOG_NOTQUIET,
+ _("File %s retrieved but signature does not match. "
+ "\n"), quote (destname));
+ }
+#endif
+ last_retr_err = retr_err == RETROK ? last_retr_err : retr_err;
+
+ /* Rename the file if error encountered; remove if option specified.
+ Note: the file has been downloaded using *_loop. Therefore, it
+ is not necessary to keep the file for continuated download. */
+ if (((retr_err != RETROK && !opt.always_rest) || opt.delete_after)
+ && destname != NULL && file_exists_p (destname, NULL))
+ {
+ badhash_or_remove (destname);
+ }
+ if (output_stream)
+ {
+ fclose (output_stream);
+ output_stream = NULL;
+ }
+ xfree (destname);
+ xfree (filename);
+ xfree (trsrname);
+ xfree (planname);
+ } /* Iterate over files. */
+
+ /* Restore original values. */
+ opt.output_document = _output_document;
+ output_stream_regular = _output_stream_regular;
+ output_stream = _output_stream;
+
+ return last_retr_err;
+}
+
+/*
+ Replace/remove the basename of a file name.
+
+ The file name is permanently modified.
+
+ Always set NAME to a string, even an empty one.
+
+ Use REF's basename as replacement. If REF is NULL or if it doesn't
+ provide a valid basename candidate, then remove NAME's basename.
+*/
+void
+replace_metalink_basename (char **name, char *ref)
+{
+ int n;
+ char *p, *new, *basename;
+
+ if (!name)
+ return;
+
+ /* Strip old basename. */
+ if (*name)
+ {
+ basename = last_component (*name);
+
+ if (basename == *name)
+ xfree (*name);
+ else
+ *basename = '\0';
+ }
+
+ /* New basename from file name reference. */
+ if (ref)
+ ref = last_component (ref);
+
+ /* Replace the old basename. */
+ new = aprintf ("%s%s", *name ? *name : "", ref ? ref : "");
+ xfree (*name);
+ *name = new;
+
+ /* Remove prefix drive letters if required, i.e. when in w32
+ environments. */
+ p = new;
+ while (p[0] != '\0')
+ {
+ while ((n = FILE_SYSTEM_PREFIX_LEN (p)) > 0)
+ p += n;
+
+ if (p != new)
+ {
+ while (ISSLASH (p[0]))
+ ++p;
+ new = p;
+ continue;
+ }
+
+ break;
+ }
+
+ if (*name != new)
+ {
+ new = xstrdup (new);
+ xfree (*name);
+ *name = new;
+ }
+}
+
+/*
+ Strip the directory components from the given name.
+
+ Return a pointer to the end of the leading directory components.
+ Return NULL if the resulting name is unsafe or invalid.
+
+ Due to security issues posed by saving files with unsafe names, here
+ the use of libmetalink's metalink_check_safe_path() is enforced. If
+ this appears redundant because the given name was already verified,
+ just remember to never underestimate unsafe file names.
+*/
+char *
+get_metalink_basename (char *name)
+{
+ int n;
+ char *basename;
+
+ if (!name)
+ return NULL;
+
+ basename = last_component (name);
+
+ while ((n = FILE_SYSTEM_PREFIX_LEN (basename)) > 0)
+ basename += n;
+
+ return metalink_check_safe_path (basename) ? basename : NULL;
+}
+
+/*
+ Append a separator and a numeric suffix to a string.
+
+ The string is permanently modified.
+*/
+void
+append_suffix_number (char **str, const char *sep, wgint num)
+{
+ char *new, buf[24];
+
+ number_to_string (buf, num);
+ new = aprintf ("%s%s%s", *str ? *str : "", sep ? sep : "", buf);
+ xfree (*str);
+ *str = new;
+}
+
+/*
+ Remove the string's trailing/leading whitespaces and line breaks.
+
+ The string is permanently modified.
+*/
+void
+clean_metalink_string (char **str)
+{
+ int c;
+ size_t len;
+ char *new, *beg, *end;
+
+ if (!str || !*str)
+ return;
+
+ beg = *str;
+
+ while ((c = *beg) && (c == '\n' || c == '\r' || c == '\t' || c == ' '))
+ beg++;
+
+ end = beg;
+
+ /* To not truncate a string containing spaces, search the first '\r'
+ or '\n' which ipotetically marks the end of the string. */
+ while ((c = *end) && (c != '\r') && (c != '\n'))
+ end++;
+
+ /* If we are at the end of the string, search the first legit
+ character going backward. */
+ if (*end == '\0')
+ while ((c = *(end - 1)) && (c == '\n' || c == '\r' || c == '\t' || c == ' '))
+ end--;
+
+ len = end - beg;
+
+ new = xmemdup0 (beg, len);
+ xfree (*str);
+ *str = new;
+}
+
+/*
+ Remove the quotation surrounding a string.
+
+ The string is permanently modified.
+ */
+void
+dequote_metalink_string (char **str)
+{
+ char *new;
+ size_t str_len;
+
+ if (!str || !*str || ((*str)[0] != '\"' && (*str)[0] != '\''))
+ return;
+
+ str_len = strlen (*str); /* current string length */
+
+ /* Verify if the current string is surrounded by quotes. */
+ if (str_len < 2 || (*str)[0] != (*str)[str_len - 1])
+ return;
+
+ /* Dequoted string. */
+ new = xmemdup0 (*str + 1, str_len - 2);
+ xfree (*str);
+ *str = new;
+}
+
+/* Append the suffix ".badhash" to the file NAME, except without
+ overwriting an existing file with that name and suffix. */
+void
+badhash_suffix (char *name)
+{
+ char *bhash, *uname;
+
+ bhash = concat_strings (name, ".badhash", (char *)0);
+ uname = unique_name (bhash);
+
+ logprintf (LOG_VERBOSE, _("Renaming %s to %s.\n"),
+ quote_n (0, name), quote_n (1, uname));
+
+ if (link (name, uname))
+ logprintf (LOG_NOTQUIET, "link: %s\n", strerror (errno));
+ else if (unlink (name))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+
+ xfree (bhash);
+ xfree (uname);
+}
+
+/* Append the suffix ".badhash" to the file NAME, except without
+ overwriting an existing file with that name and suffix.
+
+ Remove the file NAME if the option --delete-after is specified, or
+ if the option --keep-badhash isn't set. */
+void
+badhash_or_remove (char *name)
+{
+ if (opt.delete_after || !opt.keep_badhash)
+ {
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), quote (name));
+ if (unlink (name))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ }
+ else
+ {
+ badhash_suffix(name);
+ }
+}
+
+/*
+ Simple file fetch.
+
+ Set DESTNAME to the name of the saved file.
+
+ Resume previous download if RESUME is true. To disable
+ Metalink/HTTP, set METALINK_HTTP to false.
+*/
+uerr_t
+fetch_metalink_file (const char *url_str,
+ bool resume, bool metalink_http,
+ const char *filename, char **destname)
+{
+ FILE *_output_stream = output_stream;
+ bool _output_stream_regular = output_stream_regular;
+ char *_output_document = opt.output_document;
+ bool _metalink_http = opt.metalink_over_http;
+
+ char *local_file = NULL;
+
+ uerr_t retr_err = URLERROR;
+
+ struct iri *iri;
+ struct url *url;
+ int url_err;
+
+ /* Parse the URL. */
+ iri = iri_new ();
+ set_uri_encoding (iri, opt.locale, true);
+ url = url_parse (url_str, &url_err, iri, false);
+
+ if (!url)
+ {
+ char *error = url_error (url_str, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n", url_str, error);
+ inform_exit_status (retr_err);
+ iri_free (iri);
+ xfree (error);
+ return retr_err;
+ }
+
+ output_stream = NULL;
+
+ if (resume)
+ /* continue previous download */
+ output_stream = fopen (filename, "ab");
+ else
+ /* create a file with an unique name */
+ output_stream = unique_create (filename, true, &local_file);
+
+ output_stream_regular = true;
+
+ /*
+ If output_stream is NULL, the file couldn't be created/opened.
+ This could be due to the impossibility to create a directory tree:
+ * stdio.h (fopen)
+ * src/utils.c (unique_create)
+
+ A call to retrieve_url() can indirectly create a directory tree,
+ when opt.output_document is set to the destination file name and
+ output_stream is left to NULL:
+ * src/http.c (open_output_stream): If output_stream is NULL,
+ create the destination opt.output_document "path/file"
+ */
+ if (!local_file)
+ local_file = xstrdup (filename);
+
+ /* Store the real file name for displaying in messages, and for
+ proper "path/file" handling. */
+ opt.output_document = local_file;
+
+ opt.metalink_over_http = metalink_http;
+
+ DEBUGP (("Storing to %s\n", local_file));
+ retr_err = retrieve_url (url, url_str, NULL, NULL,
+ NULL, NULL, opt.recursive, iri, false);
+
+ if (retr_err == RETROK)
+ {
+ if (destname)
+ *destname = local_file;
+ else
+ xfree (local_file);
+ }
+
+ if (output_stream)
+ {
+ fclose (output_stream);
+ output_stream = NULL;
+ }
+
+ opt.metalink_over_http = _metalink_http;
+ opt.output_document = _output_document;
+ output_stream_regular = _output_stream_regular;
+ output_stream = _output_stream;
+
+ inform_exit_status (retr_err);
+
+ iri_free (iri);
+ url_free (url);
+
+ return retr_err;
+}
+
+int metalink_res_cmp (const void* v1, const void* v2)
+{
+ const metalink_resource_t *res1 = *(metalink_resource_t **) v1,
+ *res2 = *(metalink_resource_t **) v2;
+ if (res1->preference != res2->preference)
+ return res2->preference - res1->preference;
+ if (res1->priority != res2->priority)
+ return res1->priority - res2->priority;
+ if (opt.preferred_location)
+ {
+ int cmp = 0;
+ if (res1->location &&
+ !c_strcasecmp (opt.preferred_location, res1->location))
+ cmp -= 1;
+ if (res2->location &&
+ !c_strcasecmp (opt.preferred_location, res2->location))
+ cmp += 1;
+ return cmp;
+ }
+ return 0;
+}
+
+int metalink_meta_cmp (const void* v1, const void* v2)
+{
+ const metalink_metaurl_t *meta1 = *(metalink_metaurl_t **) v1,
+ *meta2 = *(metalink_metaurl_t **) v2;
+ if (meta1->priority != meta2->priority)
+ return meta1->priority - meta2->priority;
+ return 0;
+}
+
+/*
+ Find value of given key. This is intended for Link header, but will
+ work with any header that uses ';' as field separator and '=' as key-value
+ separator.
+
+ Link = "Link" ":" #link-value
+ link-value = "<" URI-Reference ">" *( ";" link-param )
+ link-param = ( ( "rel" "=" relation-types )
+ | ( "anchor" "=" <"> URI-Reference <"> )
+ | ( "rev" "=" relation-types )
+ | ( "hreflang" "=" Language-Tag )
+ | ( "media" "=" ( MediaDesc | ( <"> MediaDesc <"> ) ) )
+ | ( "title" "=" quoted-string )
+ | ( "title*" "=" ext-value )
+ | ( "type" "=" ( media-type | quoted-mt ) )
+ | ( link-extension ) )
+ link-extension = ( parmname [ "=" ( ptoken | quoted-string ) ] )
+ | ( ext-name-star "=" ext-value )
+ ext-name-star = parmname "*" ; reserved for RFC2231-profiled
+ ; extensions. Whitespace NOT
+ ; allowed in between.
+ ptoken = 1*ptokenchar
+ ptokenchar = "!" | "#" | "$" | "%" | "&" | "'" | "("
+ | ")" | "*" | "+" | "-" | "." | "/" | DIGIT
+ | ":" | "<" | "=" | ">" | "?" | "@" | ALPHA
+ | "[" | "]" | "^" | "_" | "`" | "{" | "|"
+ | "}" | "~"
+ media-type = type-name "/" subtype-name
+ quoted-mt = <"> media-type <">
+ relation-types = relation-type
+ | <"> relation-type *( 1*SP relation-type ) <">
+ relation-type = reg-rel-type | ext-rel-type
+ reg-rel-type = LOALPHA *( LOALPHA | DIGIT | "." | "-" )
+ ext-rel-type = URI
+
+ See more: rfc5988
+*/
+bool
+find_key_value (const char *start, const char *end, const char *key, char **value)
+{
+ const char *eq;
+ size_t key_len = strlen (key);
+ const char *val_beg, *val_end;
+ const char *key_beg;
+
+ key_beg = start;
+
+ while (key_beg + key_len + 1 < end)
+ {
+ /* Skip whitespaces. */
+ while (key_beg + key_len + 1 < end && c_isspace (*key_beg))
+ key_beg++;
+ if (strncmp (key_beg, key, key_len))
+ {
+ /* Find next token. */
+ while (key_beg + key_len + 1 < end && *key_beg != ';')
+ key_beg++;
+ key_beg++;
+ continue;
+ }
+ else
+ {
+ /* Find equals sign. */
+ eq = key_beg + key_len;
+ while (eq < end && c_isspace (*eq))
+ eq++;
+ if (eq == end)
+ return false;
+ if (*eq != '=')
+ {
+ key_beg++;
+ continue;
+ }
+
+ val_beg = eq + 1;
+ while (val_beg < end && c_isspace (*val_beg))
+ val_beg++;
+ if (val_beg == end)
+ return false;
+ val_end = val_beg + 1;
+ while (val_end < end && *val_end != ';' && !c_isspace (*val_end))
+ val_end++;
+ *value = xstrndup (val_beg, val_end - val_beg);
+ dequote_metalink_string (value);
+ return true;
+ }
+ }
+ *value = NULL;
+ return false;
+}
+
+/* This is to check if given token exists in HTTP header. Tokens are
+ separated by ';'. */
+bool
+has_key (const char *start, const char *end, const char *key)
+{
+ const char *pos; /* Here would the token start. */
+ size_t key_len = strlen (key);
+
+ pos = start;
+ while (pos + key_len <= end)
+ {
+ /* Skip whitespaces at beginning. */
+ while (pos + key_len <= end && c_isspace (*pos))
+ pos++;
+
+ /* Does the prefix of pos match our key? */
+ if (strncmp (key, pos, key_len))
+ {
+ /* This was not a match.
+ Skip all characters until beginning of next token. */
+ while (pos + key_len <= end && *pos != ';')
+ pos++;
+ pos++;
+ continue;
+ }
+
+ /* key is prefix of pos. Is it the exact token or just a prefix? */
+ pos += key_len;
+ while (pos < end && c_isspace (*pos))
+ pos++;
+ if (pos == end || *pos == ';')
+ return true;
+
+ /* This was not a match (just a prefix).
+ Skip all characters until beginning of next token. */
+ while (pos + key_len <= end && *pos != ';')
+ pos++;
+ pos++;
+ }
+ return false;
+}
+
+/* Find all key=value pairs delimited with ';' or ','. This is intended for
+ Digest header parsing.
+ The usage is:
+
+ const char *pos;
+ for (pos = header_beg; pos = find_key_values (pos, header_end, &key, &val); pos++)
+ {
+ ...
+ }
+
+ */
+const char *
+find_key_values (const char *start, const char *end, char **key, char **value)
+{
+ const char *key_start, *key_end;
+ const char *eq;
+ const char *val_start, *val_end;
+
+ eq = start;
+ while (eq < end && *eq != '=')
+ {
+ /* Skip tokens without =value part. */
+ if (*eq == ';' || *eq == ',')
+ start = eq + 1;
+ eq++;
+ }
+
+ if (eq >= end)
+ return NULL;
+
+ key_start = start;
+ while (key_start < eq && c_isspace (*key_start))
+ key_start++;
+
+ key_end = eq - 1;
+ while (key_end > key_start && c_isspace (*key_end))
+ key_end--;
+ key_end++;
+
+ val_start = eq + 1;
+ while (val_start < end && c_isspace (*val_start))
+ val_start++;
+
+ val_end = val_start;
+
+ while (val_end < end && *val_end != ';' &&
+ *val_end != ',' && !c_isspace (*val_end))
+ val_end++;
+
+ *key = xstrndup (key_start, key_end - key_start);
+ *value = xstrndup (val_start, val_end - val_start);
+ dequote_metalink_string (value);
+
+ /* Skip trailing whitespaces. */
+ while (val_end < end && c_isspace (*val_end))
+ val_end++;
+
+ return val_end;
+}
+
+#ifdef TESTING
+const char *
+test_find_key_values (void)
+{
+ static const char *header_data = "key1=val1;key2=\"val2\" ;key3=val3; key4=val4"\
+ " ; key5=val5;key6 ='val6';key7= val7; "\
+ "key8 = val8 ; key9 = \"val9\" "\
+ " ,key10= 'val10',key11,key12=val12";
+ static const struct
+ {
+ const char *key;
+ const char *val;
+ } test_array[] =
+ {
+ { "key1", "val1" },
+ { "key2", "val2" },
+ { "key3", "val3" },
+ { "key4", "val4" },
+ { "key5", "val5" },
+ { "key6", "val6" },
+ { "key7", "val7" },
+ { "key8", "val8" },
+ { "key9", "val9" },
+ { "key10", "val10" },
+ { "key12", "val12" }
+ };
+ const char *pos;
+ char *key, *value;
+ size_t i = 0;
+
+ for (pos = header_data; (pos = find_key_values (pos,
+ header_data + strlen (header_data),
+ &key, &value)); pos++)
+ {
+ mu_assert ("test_find_key_values: wrong result",
+ !strcmp (test_array[i].val, value) &&
+ !strcmp (test_array[i].key, key));
+ xfree (key);
+ xfree (value);
+ i++;
+ }
+
+ return NULL;
+}
+
+const char *
+test_find_key_value (void)
+{
+ static const char *header_data = "key1=val1;key2=val2 ;key3='val3'; key4=val4"\
+ " ; key5='val5';key6 =val6;key7= \"val7\"; "\
+ "key8 = \"val8\" ; key9 = val9 ";
+ static const struct
+ {
+ const char *key;
+ const char *val;
+ bool result;
+ } test_array[] =
+ {
+ { "key1", "val1", true },
+ { "key2", "val2", true },
+ { "key3", "val3", true },
+ { "key4", "val4", true },
+ { "key5", "val5", true },
+ { "key6", "val6", true },
+ { "key7", "val7", true },
+ { "key8", "val8", true },
+ { "key9", "val9", true },
+ { "key10", NULL, false },
+ { "ey1", NULL, false },
+ { "dey1", NULL, false }
+ };
+ size_t i;
+
+ for (i=0; i < countof (test_array); ++i)
+ {
+ bool result;
+ char *value;
+
+ result = find_key_value (header_data,
+ header_data + strlen(header_data),
+ test_array[i].key, &value);
+
+ mu_assert ("test_find_key_value: wrong result",
+ result == test_array[i].result &&
+ ((!test_array[i].result && !value) ||
+ !strcmp (value, test_array[i].val)));
+
+ xfree (value);
+ }
+
+ return NULL;
+}
+
+const char *
+test_has_key (void)
+{
+ static const char *header_data = "key1=val2;token1;xyz; token2;xyz;token3 ;"\
+ "xyz; token4 ;xyz; token5 ";
+ struct
+ {
+ const char *token;
+ bool result;
+ } test_array[] =
+ {
+ { "key1=val2", true },
+ { "token1", true },
+ { "token2", true },
+ { "token3", true },
+ { "token4", true },
+ { "token5", true },
+ { "token6", false },
+ { "oken1", false },
+ { "poken1", false },
+ { "key1=val2", true }
+ };
+ size_t i;
+
+ for (i = 0; i < countof (test_array); ++i)
+ mu_assert ("test_has_key: wrong result",
+ has_key (header_data, header_data + strlen (header_data),
+ test_array[i].token) == test_array[i].result);
+
+ return NULL;
+}
+#endif
+
+#endif /* HAVE_METALINK */
diff --git a/src/metalink.h b/src/metalink.h
new file mode 100644
index 0000000..b20a421
--- /dev/null
+++ b/src/metalink.h
@@ -0,0 +1,75 @@
+/* Declarations for metalink.c.
+ Copyright (C) 2015, 2018-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+#if ! defined METALINK_H && defined HAVE_METALINK
+#define METALINK_H
+
+#include <metalink/metalink_types.h>
+#include "dirname.h"
+#include "wget.h"
+
+#ifdef HAVE_SSL
+# define RES_TYPE_SUPPORTED(x)\
+ ((!x) || !strcmp (x, "http") || !strcmp (x, "https") || !strcmp (x, "ftp") || !strcmp (x, "ftps"))
+#else
+# define RES_TYPE_SUPPORTED(x)\
+ ((!x) || !strcmp (x, "ftp") || !strcmp (x, "http"))
+#endif
+
+#define DEFAULT_PRI 999999
+#define VALID_PRI_RANGE(x) ((x) > 0 && (x) < 1000000)
+
+uerr_t retrieve_from_metalink (const metalink_t *metalink);
+
+int metalink_res_cmp (const void *res1, const void *res2);
+int metalink_meta_cmp (const void* meta1, const void* meta2);
+
+int metalink_check_safe_path (const char *path);
+
+void replace_metalink_basename (char **name, char *ref);
+char *get_metalink_basename (char *name);
+void append_suffix_number (char **str, const char *sep, wgint num);
+void clean_metalink_string (char **str);
+void dequote_metalink_string (char **str);
+void badhash_suffix (char *name);
+void badhash_or_remove (char *name);
+uerr_t fetch_metalink_file (const char *url_str,
+ bool resume, bool metalink_http,
+ const char *filename, char **destname);
+
+bool find_key_value (const char *start,
+ const char *end,
+ const char *key,
+ char **value);
+bool has_key (const char *start, const char *end, const char *key);
+const char *find_key_values (const char *start,
+ const char *end,
+ char **key,
+ char **value);
+
+#endif /* METALINK_H */
diff --git a/src/mswindows.c b/src/mswindows.c
new file mode 100644
index 0000000..42d9f5f
--- /dev/null
+++ b/src/mswindows.c
@@ -0,0 +1,652 @@
+/* mswindows.c -- Windows-specific support
+ Copyright (C) 1996-2011, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#define INHIBIT_WRAP /* avoid wrapping of socket, bind, ... */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+
+
+#include "utils.h"
+#include "url.h"
+#include "exits.h"
+
+#ifndef ES_SYSTEM_REQUIRED
+#define ES_SYSTEM_REQUIRED 0x00000001
+#endif
+
+#ifndef ES_CONTINUOUS
+#define ES_CONTINUOUS 0x80000000
+#endif
+
+
+/* Windows version of xsleep in utils.c. */
+
+void
+xsleep (double seconds)
+{
+#if defined(HAVE_USLEEP) && defined(HAVE_SLEEP)
+ if (seconds >= 1)
+ {
+ /* Explained in utils.c. */
+ sleep (seconds);
+ seconds -= (long) seconds;
+ }
+ usleep (seconds * 1000000);
+#else /* not HAVE_USLEEP */
+ SleepEx ((DWORD) (seconds * 1000 + .5), FALSE);
+#endif /* not HAVE_USLEEP */
+}
+
+void
+windows_main (char **exec_name)
+{
+ char *p;
+
+ /* Remove .EXE from filename if it has one. */
+ *exec_name = xstrdup (*exec_name);
+ p = strrchr (*exec_name, '.');
+ if (p)
+ *p = '\0';
+}
+
+static void
+ws_cleanup (void)
+{
+ xfree (exec_name);
+ WSACleanup ();
+}
+
+#if defined(CTRLBREAK_BACKGND) || defined(CTRLC_BACKGND)
+static void
+ws_hangup (const char *reason)
+{
+ fprintf (stderr, _("Continuing in background.\n"));
+ redirect_output (true, reason);
+
+ /* Detach process from the current console. Under Windows 9x, if we
+ were launched from a 16-bit process (which is usually the case;
+ command.com is 16-bit) the parent process should resume right away.
+ Under NT or if launched from a 32-process under 9x, this is a futile
+ gesture as the parent will wait for us to terminate before resuming. */
+ FreeConsole ();
+}
+#endif
+
+/* Construct the name for a named section (a.k.a. `file mapping') object.
+ The returned string is dynamically allocated and needs to be xfree()'d. */
+static char *
+make_section_name (DWORD pid)
+{
+ return aprintf ("gnu_wget_fake_fork_%lu", pid);
+}
+
+/* This structure is used to hold all the data that is exchanged between
+ parent and child. */
+struct fake_fork_info
+{
+ HANDLE event;
+ bool logfile_changed;
+ char lfilename[MAX_PATH + 1];
+};
+
+/* Determines if we are the child and if so performs the child logic.
+ Return values:
+ < 0 error
+ 0 parent
+ > 0 child
+*/
+static int
+fake_fork_child (void)
+{
+ HANDLE section, event;
+ struct fake_fork_info *info;
+ char *name;
+
+ name = make_section_name (GetCurrentProcessId ());
+ section = OpenFileMapping (FILE_MAP_WRITE, FALSE, name);
+ xfree (name);
+ /* It seems that Windows 9x and NT set last-error inconsistently when
+ OpenFileMapping() fails; so we assume it failed because the section
+ object does not exist. */
+ if (!section)
+ return 0; /* We are the parent. */
+
+ info = MapViewOfFile (section, FILE_MAP_WRITE, 0, 0, 0);
+ if (!info)
+ {
+ CloseHandle (section);
+ return -1;
+ }
+
+ event = info->event;
+
+ info->logfile_changed = false;
+ if (!opt.lfilename && (!opt.quiet || opt.server_response))
+ {
+ /* See utils:fork_to_background for explanation. */
+ FILE *new_log_fp = unique_create (DEFAULT_LOGFILE, false, &opt.lfilename);
+ if (new_log_fp)
+ {
+ info->logfile_changed = true;
+ snprintf (info->lfilename, sizeof (info->lfilename), "%s",
+ opt.lfilename);
+ fclose (new_log_fp);
+ }
+ }
+
+ UnmapViewOfFile (info);
+ CloseHandle (section);
+
+ /* Inform the parent that we've done our part. */
+ if (!SetEvent (event))
+ return -1;
+
+ CloseHandle (event);
+ return 1; /* We are the child. */
+}
+
+/* Windows doesn't support the fork() call; so we fake it by invoking
+ another copy of Wget with the same arguments with which we were
+ invoked. The child copy of Wget should perform the same initialization
+ sequence as the parent; so we should have two processes that are
+ essentially identical. We create a specially named section object that
+ allows the child to distinguish itself from the parent and is used to
+ exchange information between the two processes. We use an event object
+ for synchronization. */
+static void
+fake_fork (void)
+{
+ char exe[MAX_PATH + 1];
+ DWORD exe_len, le;
+ SECURITY_ATTRIBUTES sa;
+ HANDLE section, event, h[2];
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ struct fake_fork_info *info;
+ char *name;
+ BOOL rv;
+
+ section = pi.hProcess = pi.hThread = NULL;
+
+ /* Get the fully qualified name of our executable. This is more reliable
+ than using argv[0]. */
+ exe_len = GetModuleFileName (GetModuleHandle (NULL), exe, sizeof (exe));
+ if (!exe_len || (exe_len >= sizeof (exe)))
+ return;
+
+ sa.nLength = sizeof (sa);
+ sa.lpSecurityDescriptor = NULL;
+ sa.bInheritHandle = TRUE;
+
+ /* Create an anonymous inheritable event object that starts out
+ non-signaled. */
+ event = CreateEvent (&sa, FALSE, FALSE, NULL);
+ if (!event)
+ return;
+
+ /* Create the child process detached form the current console and in a
+ suspended state. */
+ xzero (si);
+ si.cb = sizeof (si);
+ rv = CreateProcess (exe, GetCommandLine (), NULL, NULL, TRUE,
+ CREATE_SUSPENDED | DETACHED_PROCESS,
+ NULL, NULL, &si, &pi);
+ if (!rv)
+ goto cleanup;
+
+ /* Create a named section object with a name based on the process id of
+ the child. */
+ name = make_section_name (pi.dwProcessId);
+ section =
+ CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,
+ sizeof (struct fake_fork_info), name);
+ le = GetLastError();
+ xfree (name);
+ /* Fail if the section object already exists (should not happen). */
+ if (!section || (le == ERROR_ALREADY_EXISTS))
+ {
+ rv = FALSE;
+ goto cleanup;
+ }
+
+ /* Copy the event handle into the section object. */
+ info = MapViewOfFile (section, FILE_MAP_WRITE, 0, 0, 0);
+ if (!info)
+ {
+ rv = FALSE;
+ goto cleanup;
+ }
+
+ info->event = event;
+
+ UnmapViewOfFile (info);
+
+ /* Start the child process. */
+ rv = ResumeThread (pi.hThread);
+ if (!rv)
+ {
+ TerminateProcess (pi.hProcess, (DWORD) -1);
+ goto cleanup;
+ }
+
+ /* Wait for the child to signal to us that it has done its part. If it
+ terminates before signaling us it's an error. */
+
+ h[0] = event;
+ h[1] = pi.hProcess;
+ rv = WAIT_OBJECT_0 == WaitForMultipleObjects (2, h, FALSE, 5 * 60 * 1000);
+ if (!rv)
+ goto cleanup;
+
+ info = MapViewOfFile (section, FILE_MAP_READ, 0, 0, 0);
+ if (!info)
+ {
+ rv = FALSE;
+ goto cleanup;
+ }
+
+ /* Ensure string is properly terminated. */
+ if (info->logfile_changed &&
+ !memchr (info->lfilename, '\0', sizeof (info->lfilename)))
+ {
+ rv = FALSE;
+ goto cleanup;
+ }
+
+ printf (_("Continuing in background, pid %lu.\n"), pi.dwProcessId);
+ if (info->logfile_changed)
+ printf (_("Output will be written to %s.\n"), quote (info->lfilename));
+
+ UnmapViewOfFile (info);
+
+cleanup:
+
+ if (event)
+ CloseHandle (event);
+ if (section)
+ CloseHandle (section);
+ if (pi.hThread)
+ CloseHandle (pi.hThread);
+ if (pi.hProcess)
+ CloseHandle (pi.hProcess);
+
+ /* We're the parent. If all is well, terminate. */
+ if (rv)
+ exit (WGET_EXIT_SUCCESS);
+
+ /* We failed, return. */
+}
+
+/* This is the corresponding Windows implementation of the
+ fork_to_background() function in utils.c. */
+bool
+fork_to_background (void)
+{
+ int rv;
+
+ rv = fake_fork_child ();
+ if (rv < 0)
+ {
+ fprintf (stderr, _("fake_fork_child() failed\n"));
+ abort ();
+ }
+ else if (rv == 0)
+ {
+ /* We're the parent. */
+ fake_fork ();
+ /* If fake_fork() returns, it failed. */
+ fprintf (stderr, _("fake_fork() failed\n"));
+ abort ();
+ }
+ /* If we get here, we're the child. */
+ return false;
+}
+
+static BOOL WINAPI
+ws_handler (DWORD dwEvent)
+{
+ switch (dwEvent)
+ {
+#ifdef CTRLC_BACKGND
+ case CTRL_C_EVENT:
+ ws_hangup ("CTRL+C");
+ return TRUE;
+#endif
+#ifdef CTRLBREAK_BACKGND
+ case CTRL_BREAK_EVENT:
+ ws_hangup ("CTRL+Break");
+ return TRUE;
+#endif
+ default:
+ return FALSE;
+ }
+}
+
+static char *title_buf = NULL;
+static char *curr_url = NULL;
+static int old_percentage = -1;
+
+/* Updates the console title with the URL of the current file being
+ transferred. */
+void
+ws_changetitle (const char *url)
+{
+ xfree (title_buf);
+ xfree (curr_url);
+ title_buf = xmalloc (strlen (url) + 20);
+ curr_url = xstrdup (url);
+ old_percentage = -1;
+ sprintf (title_buf, "Wget %s", curr_url);
+ SetConsoleTitle (title_buf);
+}
+
+/* Updates the console title with the percentage of the current file
+ transferred. */
+void
+ws_percenttitle (double percentage_float)
+{
+ int percentage;
+
+ if (!title_buf || !curr_url)
+ return;
+
+ percentage = (int) percentage_float;
+
+ /* Clamp percentage value. */
+ if (percentage < 0)
+ percentage = 0;
+ if (percentage > 100)
+ percentage = 100;
+
+ /* Only update the title when the percentage has changed. */
+ if (percentage == old_percentage)
+ return;
+
+ old_percentage = percentage;
+
+ sprintf (title_buf, "Wget [%d%%] %s", percentage, curr_url);
+ SetConsoleTitle (title_buf);
+}
+
+/* Returns a pointer to the fully qualified name of the directory that
+ contains the Wget binary (wget.exe). The returned path does not have a
+ trailing path separator. Returns NULL on failure. */
+char *
+ws_mypath (void)
+{
+ static char *wspathsave = NULL;
+
+ if (!wspathsave)
+ {
+ char buf[MAX_PATH + 1];
+ char *p;
+ DWORD len;
+
+ len = GetModuleFileName (GetModuleHandle (NULL), buf, sizeof (buf));
+ if (!len || (len >= sizeof (buf)))
+ return NULL;
+
+ p = strrchr (buf, PATH_SEPARATOR);
+ if (!p)
+ return NULL;
+
+ *p = '\0';
+ wspathsave = xstrdup (buf);
+ }
+
+ return wspathsave;
+}
+
+/* Prevent Windows entering sleep/hibernation-mode while Wget is doing
+ a lengthy transfer. Windows does not, by default, consider network
+ activity in console-programs as activity! Works on Win-98/ME/2K
+ and up. */
+static void
+set_sleep_mode (void)
+{
+ typedef DWORD (WINAPI *func_t) (DWORD);
+ func_t set_exec_state;
+
+ set_exec_state =
+ (func_t) GetProcAddress (GetModuleHandle ("KERNEL32.DLL"),
+ "SetThreadExecutionState");
+
+ if (set_exec_state)
+ set_exec_state (ES_SYSTEM_REQUIRED | ES_CONTINUOUS);
+}
+
+/* Perform Windows specific initialization. */
+void
+ws_startup (void)
+{
+ WSADATA data;
+ WORD requested = MAKEWORD (1, 1);
+ int err = WSAStartup (requested, &data);
+ if (err != 0)
+ {
+ fprintf (stderr, _("%s: Couldn't find usable socket driver.\n"),
+ exec_name);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (data.wVersion < requested)
+ {
+ fprintf (stderr, _("%s: Couldn't find usable socket driver.\n"),
+ exec_name);
+ WSACleanup ();
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ atexit (ws_cleanup);
+ set_sleep_mode ();
+ SetConsoleCtrlHandler (ws_handler, TRUE);
+}
+
+/* run_with_timeout Windows implementation. */
+
+/* Stack size 0 uses default thread stack-size (reserve+commit).
+ Determined by what's in the PE header. */
+#define THREAD_STACK_SIZE 0
+
+struct thread_data
+{
+ void (*fun) (void *);
+ void *arg;
+ DWORD ws_error;
+};
+
+/* The callback that runs FUN(ARG) in a separate thread. This
+ function exists for two reasons: a) to not require FUN to be
+ declared WINAPI/__stdcall[1], and b) to retrieve Winsock errors,
+ which are per-thread. The latter is useful when FUN calls Winsock
+ functions, which is how run_with_timeout is used in Wget.
+
+ [1] MSVC can use __fastcall globally (cl /Gr) and on Watcom this is
+ the default (wcc386 -3r). */
+
+static DWORD WINAPI
+thread_helper (void *arg)
+{
+ struct thread_data *td = (struct thread_data *) arg;
+
+ /* Initialize Winsock error to what it was in the parent. That way
+ the subsequent call to WSAGetLastError will return the same value
+ if td->fun doesn't change Winsock error state. */
+ WSASetLastError (td->ws_error);
+
+ td->fun (td->arg);
+
+ /* Return Winsock error to the caller, in case FUN ran Winsock
+ code. */
+ td->ws_error = WSAGetLastError ();
+ return 0;
+}
+
+/* Call FUN(ARG), but don't allow it to run for more than TIMEOUT
+ seconds. Returns true if the function was interrupted with a
+ timeout, false otherwise.
+
+ This works by running FUN in a separate thread and terminating the
+ thread if it doesn't finish in the specified time. */
+
+bool
+run_with_timeout (double seconds, void (*fun) (void *), void *arg)
+{
+ HANDLE thread_hnd;
+ struct thread_data thread_arg;
+ DWORD thread_id;
+ bool rc;
+
+ DEBUGP (("seconds %.2f, ", seconds));
+
+ if (seconds == 0)
+ {
+ blocking_fallback:
+ fun (arg);
+ return false;
+ }
+
+ thread_arg.fun = fun;
+ thread_arg.arg = arg;
+ thread_arg.ws_error = WSAGetLastError ();
+ thread_hnd = CreateThread (NULL, THREAD_STACK_SIZE, thread_helper,
+ &thread_arg, 0, &thread_id);
+ if (!thread_hnd)
+ {
+ DEBUGP (("CreateThread() failed; [%#lx]\n",
+ (unsigned long) GetLastError ()));
+ goto blocking_fallback;
+ }
+
+ if (WaitForSingleObject (thread_hnd, (DWORD)(1000 * seconds))
+ == WAIT_OBJECT_0)
+ {
+ /* Propagate error state (which is per-thread) to this thread,
+ so the caller can inspect it. */
+ WSASetLastError (thread_arg.ws_error);
+ DEBUGP (("Winsock error: %d\n", WSAGetLastError ()));
+ rc = false;
+ }
+ else
+ {
+ TerminateThread (thread_hnd, 1);
+ rc = true;
+ }
+
+ CloseHandle (thread_hnd); /* Clear-up after TerminateThread(). */
+ thread_hnd = NULL;
+ return rc;
+}
+
+
+#ifdef ENABLE_IPV6
+/* An inet_ntop implementation that uses WSAAddressToString.
+ Prototype complies with POSIX 1003.1-2004. This is only used under
+ IPv6 because Wget prints IPv4 addresses using inet_ntoa. */
+
+const char *
+inet_ntop (int af, const void *src, char *dst, socklen_t cnt)
+{
+ /* struct sockaddr can't accommodate struct sockaddr_in6. */
+ union {
+ struct sockaddr_in6 sin6;
+ struct sockaddr_in sin;
+ } sa;
+ DWORD dstlen = cnt;
+ size_t srcsize;
+
+ xzero (sa);
+ switch (af)
+ {
+ case AF_INET:
+ sa.sin.sin_family = AF_INET;
+ sa.sin.sin_addr = *(struct in_addr *) src;
+ srcsize = sizeof (sa.sin);
+ break;
+ case AF_INET6:
+ sa.sin6.sin6_family = AF_INET6;
+ sa.sin6.sin6_addr = *(struct in6_addr *) src;
+ srcsize = sizeof (sa.sin6);
+ break;
+ default:
+ abort ();
+ }
+
+ if (WSAAddressToString ((struct sockaddr *) &sa, srcsize, NULL, dst, &dstlen) != 0)
+ {
+ errno = WSAGetLastError();
+ return NULL;
+ }
+ return (const char *) dst;
+}
+#endif
+
+
+void
+set_windows_fd_as_blocking_socket (int fd)
+{
+ /* 04/2011
+ gnulib select() converts blocking sockets to nonblocking in windows
+ discussed here:
+ http://old.nabble.com/blocking-socket-is-nonblocking-after-calling-gnulib-
+ select%28%29-in-windows-td31432857.html
+
+ wget uses blocking sockets so we must convert them back to blocking.
+ */
+ int ret = 0;
+ int wsagle = 0;
+ const int zero = 0;
+
+ do
+ {
+ if(wsagle == WSAEINPROGRESS)
+ Sleep(1); /* use windows sleep */
+
+ WSASetLastError (0);
+ ret = ioctl (fd, FIONBIO, &zero);
+ wsagle = WSAGetLastError ();
+ }
+ while (ret && (wsagle == WSAEINPROGRESS));
+
+ if(ret)
+ {
+ fprintf (stderr,
+ _("ioctl() failed. The socket could not be set as blocking.\n") );
+ DEBUGP (("Winsock error: %d\n", WSAGetLastError ()));
+ abort ();
+ }
+ return;
+}
diff --git a/src/mswindows.h b/src/mswindows.h
new file mode 100644
index 0000000..a8f9ba0
--- /dev/null
+++ b/src/mswindows.h
@@ -0,0 +1,78 @@
+/* Declarations for windows
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef MSWINDOWS_H
+#define MSWINDOWS_H
+
+#ifndef WGET_H
+# error This file should not be included directly.
+#endif
+
+/* Prevent inclusion of <winsock*.h> in <windows.h>. */
+#ifndef WIN32_LEAN_AND_MEAN
+# define WIN32_LEAN_AND_MEAN
+#endif
+
+#include <windows.h>
+
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+#ifndef EAI_SYSTEM
+# define EAI_SYSTEM -1 /* value doesn't matter */
+#endif
+
+/* Declares file access functions, such as open, create, access, and
+ chmod. Unix declares these in unistd.h and fcntl.h. */
+#include <io.h>
+
+/* Declares getpid(). */
+#include <process.h>
+
+/* Declares inet_ntop() and inet_pton(). */
+#include <arpa/inet.h>
+
+#include <stdio.h>
+
+#define PATH_SEPARATOR '\\'
+
+/* ioctl needed by set_windows_fd_as_blocking_socket() */
+#include <sys/ioctl.h>
+
+/* Public functions. */
+
+void ws_startup (void);
+void ws_changetitle (const char *);
+void ws_percenttitle (double);
+char *ws_mypath (void);
+void windows_main (char **);
+void set_windows_fd_as_blocking_socket (int);
+
+#endif /* MSWINDOWS_H */
diff --git a/src/netrc.c b/src/netrc.c
new file mode 100644
index 0000000..a9232ed
--- /dev/null
+++ b/src/netrc.c
@@ -0,0 +1,569 @@
+/* Read and parse the .netrc file to get hosts, accounts, and passwords.
+ Copyright (C) 1996, 2007-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* This file used to be kept in synch with the code in Fetchmail, but
+ the latter has diverged since. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include "utils.h"
+#include "netrc.h"
+#include "init.h"
+
+#ifdef WINDOWS
+# define NETRC_FILE_NAME "_netrc"
+#else
+# define NETRC_FILE_NAME ".netrc"
+#endif
+
+typedef struct _acc_t
+{
+ char *host; /* NULL if this is the default machine
+ entry. */
+ char *acc;
+ char *passwd; /* NULL if there is no password. */
+ struct _acc_t *next;
+} acc_t;
+
+static acc_t *parse_netrc (const char *);
+static acc_t *parse_netrc_fp (const char *, FILE *);
+
+static acc_t *netrc_list;
+static int processed_netrc;
+
+#if defined DEBUG_MALLOC || defined TESTING
+static void free_netrc(acc_t *);
+
+void
+netrc_cleanup (void)
+{
+ free_netrc (netrc_list);
+ processed_netrc = 0;
+}
+#endif
+
+/* Return the correct user and password, given the host, user (as
+ given in the URL), and password (as given in the URL). May return
+ NULL.
+
+ If SLACK_DEFAULT is set, allow looking for a "default" account.
+ You will typically turn it off for HTTP. */
+void
+search_netrc (const char *host, const char **acc, const char **passwd,
+ int slack_default, FILE *fp_netrc)
+{
+ acc_t *l;
+
+ if (!opt.netrc)
+ return;
+ /* Find ~/.netrc. */
+ if (!processed_netrc)
+ {
+#ifdef __VMS
+
+ int err;
+ struct stat buf;
+ char *path = "SYS$LOGIN:.netrc";
+
+ netrc_list = NULL;
+ processed_netrc = 1;
+
+ err = stat (path, &buf);
+ if (err == 0)
+ netrc_list = parse_netrc (path);
+
+#else /* def __VMS */
+
+ netrc_list = NULL;
+ processed_netrc = 1;
+
+ if (fp_netrc)
+ netrc_list = parse_netrc_fp (".netrc", fp_netrc);
+ else if (opt.homedir)
+ {
+ struct stat buf;
+ char *path = aprintf ("%s/%s", opt.homedir, NETRC_FILE_NAME);
+ if (stat (path, &buf) == 0)
+ netrc_list = parse_netrc (path);
+ xfree (path);
+ }
+
+#endif /* def __VMS [else] */
+ }
+ /* If nothing to do... */
+ if (!netrc_list)
+ return;
+ /* Acc and password found; all OK. */
+ if (*acc && *passwd)
+ return;
+ /* Some data not given -- try finding the host. */
+ for (l = netrc_list; l; l = l->next)
+ {
+ if (!l->host)
+ continue;
+ else if (!strcasecmp (l->host, host))
+ break;
+ }
+ if (l)
+ {
+ if (*acc)
+ {
+ /* Looking for password in .netrc. */
+ if (!strcmp (l->acc, *acc))
+ *passwd = l->passwd; /* usernames match; password OK */
+ else
+ *passwd = NULL; /* usernames don't match */
+ }
+ else /* NOT *acc */
+ {
+ /* If password was given, use it. The account is l->acc. */
+ *acc = l->acc;
+ if (l->passwd)
+ *passwd = l->passwd;
+ }
+ return;
+ }
+ else
+ {
+ if (!slack_default)
+ return;
+ if (*acc)
+ return;
+ /* Try looking for the default account. */
+ for (l = netrc_list; l; l = l->next)
+ if (!l->host)
+ break;
+ if (!l)
+ return;
+ *acc = l->acc;
+ if (!*passwd)
+ *passwd = l->passwd;
+ return;
+ }
+}
+
+
+#ifdef STANDALONE
+
+/* Normally, these functions would be defined by your package. */
+# define xmalloc malloc
+# define xfree(p) do { free ((void *) (p)); p = NULL; } while (0)
+# define xstrdup strdup
+
+# define xrealloc realloc
+
+#endif /* STANDALONE */
+
+/* Maybe add NEWENTRY to the account information list, LIST. NEWENTRY is
+ set to a ready-to-use acc_t, in any event. */
+static void
+maybe_add_to_list (acc_t **newentry, acc_t **list)
+{
+ acc_t *a, *l;
+ a = *newentry;
+ l = *list;
+
+ /* We need an account name in order to add the entry to the list. */
+ if (a && ! a->acc)
+ {
+ /* Free any allocated space. */
+ xfree (a->host);
+ xfree (a->acc);
+ xfree (a->passwd);
+ }
+ else
+ {
+ if (a)
+ {
+ /* Add the current machine into our list. */
+ a->next = l;
+ l = a;
+ }
+
+ /* Allocate a new acc_t structure. */
+ a = xmalloc (sizeof (acc_t));
+ }
+
+ /* Zero the structure, so that it is ready to use. */
+ memset (a, 0, sizeof(*a));
+
+ /* Return the new pointers. */
+ *newentry = a;
+ *list = l;
+ return;
+}
+
+/* Helper function for the parser, shifts contents of
+ null-terminated string once character to the left.
+ Used in processing \ and " constructs in the netrc file */
+static void
+shift_left(char *string)
+{
+ char *p;
+
+ for (p=string; *p; ++p)
+ *p = *(p+1);
+}
+
+/* Parse a .netrc file (as described in the ftp(1) manual page). */
+static acc_t *
+parse_netrc_fp (const char *path, FILE *fp)
+{
+ char *line = NULL, *p, *tok;
+ const char *premature_token = NULL;
+ acc_t *current = NULL, *retval = NULL;
+ int ln = 0, qmark;
+ size_t bufsize = 0;
+
+ /* The latest token we've seen in the file. */
+ enum
+ {
+ tok_nothing, tok_account, tok_login, tok_macdef, tok_machine, tok_password, tok_port, tok_force
+ } last_token = tok_nothing;
+
+ /* While there are lines in the file... */
+ while (getline (&line, &bufsize, fp) > 0)
+ {
+ ln ++;
+
+ /* Parse the line. */
+ p = line;
+ qmark = 0;
+
+ /* Skip leading whitespace. */
+ while (*p && c_isspace (*p))
+ p ++;
+
+ /* If the line is empty, then end any macro definition. */
+ if (last_token == tok_macdef && !*p)
+ /* End of macro if the line is empty. */
+ last_token = tok_nothing;
+
+ /* If we are defining macros, then skip parsing the line. */
+ while (*p && last_token != tok_macdef)
+ {
+ /* Skip any whitespace. */
+ while (*p && c_isspace (*p))
+ p ++;
+
+ /* Discard end-of-line comments; also, stop processing if
+ the above `while' merely skipped trailing whitespace. */
+ if (*p == '#' || !*p)
+ break;
+
+ /* If the token starts with quotation mark, note this fact,
+ and squash the quotation character */
+ if (*p == '"'){
+ qmark = 1;
+ shift_left (p);
+ }
+
+ tok = p;
+
+ /* Find the end of the token, handling quotes and escapes. */
+ while (*p && (qmark ? *p != '"' : !c_isspace (*p))){
+ if (*p == '\\')
+ shift_left (p);
+ p ++;
+ }
+
+ /* If field was quoted, squash the trailing quotation mark
+ and reset qmark flag. */
+ if (qmark)
+ {
+ shift_left (p);
+ qmark = 0;
+ }
+
+ /* Null-terminate the token, if it isn't already. */
+ if (*p)
+ *p ++ = '\0';
+
+ switch (last_token)
+ {
+ case tok_login:
+ if (current)
+ {
+ xfree (current->acc);
+ current->acc = xstrdup (tok);
+ }
+ else
+ premature_token = "login";
+ break;
+
+ case tok_machine:
+ /* Start a new machine entry. */
+ maybe_add_to_list (&current, &retval);
+ current->host = xstrdup (tok);
+ break;
+
+ case tok_password:
+ if (current)
+ {
+ xfree (current->passwd);
+ current->passwd = xstrdup (tok);
+ }
+ else
+ premature_token = "password";
+ break;
+
+ /* We handle most of tok_macdef above. */
+ case tok_macdef:
+ if (!current)
+ premature_token = "macdef";
+ break;
+
+ /* We don't handle the account keyword at all. */
+ case tok_account:
+ if (!current)
+ premature_token = "account";
+ break;
+
+ /* We don't handle the port keyword at all. */
+ case tok_port:
+ if (!current)
+ premature_token = "port";
+ break;
+
+ /* We don't handle the force keyword at all. */
+ case tok_force:
+ if (!current)
+ premature_token = "force";
+ break;
+
+ /* We handle tok_nothing below this switch. */
+ case tok_nothing:
+ break;
+ }
+
+ if (premature_token)
+ {
+ fprintf (stderr, _("\
+%s: %s:%d: warning: %s token appears before any machine name\n"),
+ exec_name, path, ln, quote (premature_token));
+ premature_token = NULL;
+ }
+
+ if (last_token != tok_nothing)
+ /* We got a value, so reset the token state. */
+ last_token = tok_nothing;
+ else
+ {
+ /* Fetch the next token. */
+ if (!strcmp (tok, "account"))
+ last_token = tok_account;
+
+ else if (!strcmp (tok, "default"))
+ maybe_add_to_list (&current, &retval);
+
+ else if (!strcmp (tok, "login"))
+ last_token = tok_login;
+
+ else if (!strcmp (tok, "macdef"))
+ last_token = tok_macdef;
+
+ else if (!strcmp (tok, "machine"))
+ last_token = tok_machine;
+
+ else if (!strcmp (tok, "password"))
+ last_token = tok_password;
+
+ /* GNU extensions 'port' and 'force', not operational
+ * see https://www.gnu.org/software/emacs/manual/html_node/gnus/NNTP.html#index-nntp_002dauthinfo_002dfunction-2003
+ * see https://savannah.gnu.org/bugs/index.php?52066
+ */
+ else if (!strcmp (tok, "port"))
+ last_token = tok_port;
+
+ else if (!strcmp (tok, "force"))
+ last_token = tok_force;
+
+ else
+ fprintf (stderr, _("%s: %s:%d: unknown token \"%s\"\n"),
+ exec_name, path, ln, tok);
+ }
+ }
+ }
+
+ xfree (line);
+
+ /* Finalize the last machine entry we found. */
+ maybe_add_to_list (&current, &retval);
+ xfree (current);
+
+ /* Reverse the order of the list so that it appears in file order. */
+ current = retval;
+ retval = NULL;
+ while (current)
+ {
+ acc_t *saved_reference;
+
+ /* Change the direction of the pointers. */
+ saved_reference = current->next;
+ current->next = retval;
+
+ /* Advance to the next node. */
+ retval = current;
+ current = saved_reference;
+ }
+
+ return retval;
+}
+
+static acc_t *
+parse_netrc (const char *path)
+{
+ FILE *fp;
+ acc_t *acc;
+
+ fp = fopen (path, "r");
+ if (!fp)
+ {
+ fprintf (stderr, _("%s: Cannot read %s (%s).\n"), exec_name,
+ path, strerror (errno));
+ return NULL;
+ }
+
+ acc = parse_netrc_fp (path, fp);
+ fclose(fp);
+
+ return acc;
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+/* Free a netrc list. */
+static void
+free_netrc(acc_t *l)
+{
+ acc_t *t;
+
+ while (l)
+ {
+ t = l->next;
+ xfree (l->acc);
+ xfree (l->passwd);
+ xfree (l->host);
+ xfree (l);
+ l = t;
+ }
+}
+#endif
+
+#ifdef STANDALONE
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "exits.h"
+
+const char *program_argstring = NULL; /* Needed by warc.c */
+
+int
+main (int argc, char **argv)
+{
+ struct stat sb;
+ char *program_name, *file, *target;
+ acc_t *head, *a;
+
+ if (argc < 2 || argc > 3)
+ {
+ fprintf (stderr, _("Usage: %s NETRC [HOSTNAME]\n"), argv[0]);
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ program_name = argv[0];
+ file = argv[1];
+ target = argv[2];
+
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ textdomain ("wget");
+#endif /* ENABLE_NLS */
+
+ if (stat (file, &sb))
+ {
+ fprintf (stderr, _("%s: cannot stat %s: %s\n"), argv[0], file,
+ strerror (errno));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ head = parse_netrc (file);
+ a = head;
+ while (a)
+ {
+ /* Skip if we have a target and this isn't it. */
+ if (target && a->host && strcmp (target, a->host))
+ {
+ a = a->next;
+ continue;
+ }
+
+ if (!target)
+ {
+ /* Print the host name if we have no target. */
+ if (a->host)
+ fputs (a->host, stdout);
+ else
+ fputs ("DEFAULT", stdout);
+
+ fputc (' ', stdout);
+ }
+
+ /* Print the account name. */
+ fputs (a->acc, stdout);
+
+ if (a->passwd)
+ {
+ /* Print the password, if there is any. */
+ fputc (' ', stdout);
+ fputs (a->passwd, stdout);
+ }
+
+ fputc ('\n', stdout);
+
+ /* Exit if we found the target. */
+ if (target)
+ exit (WGET_EXIT_SUCCESS);
+ a = a->next;
+ }
+
+ /* Exit with failure if we had a target, success otherwise. */
+ if (target)
+ exit (WGET_EXIT_GENERIC_ERROR);
+
+ exit (WGET_EXIT_SUCCESS);
+}
+#endif /* STANDALONE */
diff --git a/src/netrc.h b/src/netrc.h
new file mode 100644
index 0000000..903b8fa
--- /dev/null
+++ b/src/netrc.h
@@ -0,0 +1,39 @@
+/* Declarations for netrc.c
+ Copyright (C) 1996, 1996-1997, 2007-2011, 2015, 2018-2020 Free
+ Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef NETRC_H
+#define NETRC_H
+
+#include <stdio.h>
+
+void search_netrc (const char *, const char **, const char **, int, FILE *);
+void netrc_cleanup(void);
+
+#endif /* NETRC_H */
diff --git a/src/openssl.c b/src/openssl.c
new file mode 100644
index 0000000..d6099ba
--- /dev/null
+++ b/src/openssl.c
@@ -0,0 +1,1260 @@
+/* SSL support via OpenSSL library.
+ Copyright (C) 2000-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+ Originally contributed by Christian Fraenkel.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <xalloc.h>
+
+#include <openssl/ssl.h>
+#include <openssl/x509v3.h>
+#include <openssl/err.h>
+#include <openssl/rand.h>
+#include <openssl/bio.h>
+#if OPENSSL_VERSION_NUMBER >= 0x00907000
+#include <openssl/conf.h>
+#ifndef OPENSSL_NO_ENGINE
+#include <openssl/engine.h>
+#endif
+#endif
+
+#include <sys/ioctl.h>
+
+#include "utils.h"
+#include "connect.h"
+#include "ptimer.h"
+#include "url.h"
+#include "ssl.h"
+
+#include <fcntl.h>
+
+#ifdef WINDOWS
+# include <w32sock.h>
+#endif
+
+/* Application-wide SSL context. This is common to all SSL
+ connections. */
+static SSL_CTX *ssl_ctx;
+
+/* Initialize the SSL's PRNG using various methods. */
+
+static void
+init_prng (void)
+{
+ char namebuf[256];
+ const char *random_file;
+
+ /* Seed from a file specified by the user. This will be the file
+ specified with --random-file, $RANDFILE, if set, or ~/.rnd, if it
+ exists. */
+ if (opt.random_file)
+ random_file = opt.random_file;
+ else
+ {
+ /* Get the random file name using RAND_file_name. */
+ namebuf[0] = '\0';
+ random_file = RAND_file_name (namebuf, sizeof (namebuf));
+ if (!file_exists_p (random_file, NULL))
+ random_file = NULL;
+ }
+
+ if (random_file && *random_file)
+ /* Seed at most 16k (apparently arbitrary value borrowed from
+ curl) from random file. */
+ {
+ int _err = RAND_load_file (random_file, 16384);
+ if(_err == -1)
+ /* later the thread error queue will be cleared */
+ if ( (_err = ERR_peek_last_error ()) )
+ logprintf (LOG_VERBOSE, "WARNING: Could not load random file: %s, %s\n", opt.random_file, ERR_reason_error_string(_err));
+ }
+
+#ifdef HAVE_RAND_EGD
+ /* Get random data from EGD if opt.egd_file was used. */
+ if (opt.egd_file && *opt.egd_file)
+ RAND_egd (opt.egd_file);
+#endif
+
+#ifdef WINDOWS
+ /* Under Windows, we can try to seed the PRNG using screen content.
+ This may or may not work, depending on whether we'll calling Wget
+ interactively. */
+
+ RAND_screen ();
+ if (RAND_status ())
+ return;
+#endif
+
+#if 0 /* don't do this by default */
+ {
+ int maxrand = 500;
+
+ /* Still not random enough, presumably because neither /dev/random
+ nor EGD were available. Try to seed OpenSSL's PRNG with libc
+ PRNG. This is cryptographically weak and defeats the purpose
+ of using OpenSSL, which is why it is highly discouraged. */
+
+ logprintf (LOG_NOTQUIET, _("WARNING: using a weak random seed.\n"));
+
+ while (RAND_status () == 0 && maxrand-- > 0)
+ {
+ unsigned char rnd = random_number (256);
+ RAND_seed (&rnd, sizeof (rnd));
+ }
+ }
+#endif
+}
+
+/* Print errors in the OpenSSL error stack. */
+
+static void
+print_errors (void)
+{
+ unsigned long err;
+ while ((err = ERR_get_error ()) != 0)
+ logprintf (LOG_NOTQUIET, "OpenSSL: %s\n", ERR_error_string (err, NULL));
+}
+
+/* Convert keyfile type as used by options.h to a type as accepted by
+ SSL_CTX_use_certificate_file and SSL_CTX_use_PrivateKey_file.
+
+ (options.h intentionally doesn't use values from openssl/ssl.h so
+ it doesn't depend specifically on OpenSSL for SSL functionality.) */
+
+static int
+key_type_to_ssl_type (enum keyfile_type type)
+{
+ switch (type)
+ {
+ case keyfile_pem:
+ return SSL_FILETYPE_PEM;
+ case keyfile_asn1:
+ return SSL_FILETYPE_ASN1;
+ default:
+ abort ();
+ }
+}
+
+/* SSL has been initialized */
+static int ssl_true_initialized = 0;
+
+/* Create an SSL Context and set default paths etc. Called the first
+ time an HTTP download is attempted.
+
+ Returns true on success, false otherwise. */
+
+bool
+ssl_init (void)
+{
+ SSL_METHOD const *meth;
+ long ssl_options = 0;
+ char *ciphers_string = NULL;
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ int ssl_proto_version = 0;
+#endif
+
+#if OPENSSL_VERSION_NUMBER >= 0x00907000
+ if (ssl_true_initialized == 0)
+ {
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ OPENSSL_init_ssl (OPENSSL_INIT_LOAD_CONFIG | OPENSSL_INIT_ENGINE_ALL_BUILTIN, NULL);
+#else
+ OPENSSL_config (NULL);
+#endif
+ ssl_true_initialized = 1;
+ }
+#endif
+
+ if (ssl_ctx)
+ /* The SSL has already been initialized. */
+ return true;
+
+ /* Init the PRNG. If that fails, bail out. */
+ init_prng ();
+ if (RAND_status () != 1)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not seed PRNG; consider using --random-file.\n"));
+ goto error;
+ }
+
+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
+ SSL_library_init ();
+ SSL_load_error_strings ();
+ SSLeay_add_all_algorithms ();
+ SSLeay_add_ssl_algorithms ();
+#endif
+
+ switch (opt.secure_protocol)
+ {
+#if !defined OPENSSL_NO_SSL2 && OPENSSL_VERSION_NUMBER < 0x10100000L
+ case secure_protocol_sslv2:
+ meth = SSLv2_client_method ();
+ break;
+#endif
+
+#ifndef OPENSSL_NO_SSL3_METHOD
+ case secure_protocol_sslv3:
+ meth = SSLv3_client_method ();
+ break;
+#endif
+
+ case secure_protocol_auto:
+ case secure_protocol_pfs:
+ meth = SSLv23_client_method ();
+ ssl_options |= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+ break;
+ case secure_protocol_tlsv1:
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ meth = TLS_client_method();
+ ssl_proto_version = TLS1_VERSION;
+#else
+ meth = TLSv1_client_method ();
+#endif
+ break;
+
+#if OPENSSL_VERSION_NUMBER >= 0x10001000
+ case secure_protocol_tlsv1_1:
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ meth = TLS_client_method();
+ ssl_proto_version = TLS1_1_VERSION;
+#else
+ meth = TLSv1_1_client_method ();
+#endif
+ break;
+
+ case secure_protocol_tlsv1_2:
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ meth = TLS_client_method();
+ ssl_proto_version = TLS1_2_VERSION;
+#else
+ meth = TLSv1_2_client_method ();
+#endif
+ break;
+
+ case secure_protocol_tlsv1_3:
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L) && defined TLS1_3_VERSION
+ meth = TLS_client_method();
+ ssl_proto_version = TLS1_3_VERSION;
+#else
+ logprintf (LOG_NOTQUIET, _("Your OpenSSL version is too old to support TLS 1.3\n"));
+ goto error;
+#endif
+ break;
+#else
+ case secure_protocol_tlsv1_1:
+ logprintf (LOG_NOTQUIET, _("Your OpenSSL version is too old to support TLSv1.1\n"));
+ goto error;
+
+ case secure_protocol_tlsv1_2:
+ logprintf (LOG_NOTQUIET, _("Your OpenSSL version is too old to support TLSv1.2\n"));
+ goto error;
+
+#endif
+
+ default:
+ logprintf (LOG_NOTQUIET, _("OpenSSL: unimplemented 'secure-protocol' option value %d\n"), opt.secure_protocol);
+ logprintf (LOG_NOTQUIET, _("Please report this issue to bug-wget@gnu.org\n"));
+ abort ();
+ }
+
+ /* The type cast below accommodates older OpenSSL versions (0.9.8)
+ where SSL_CTX_new() is declared without a "const" argument. */
+ ssl_ctx = SSL_CTX_new ((SSL_METHOD *)meth);
+ if (!ssl_ctx)
+ goto error;
+
+ if (ssl_options)
+ SSL_CTX_set_options (ssl_ctx, ssl_options);
+
+#if ((OPENSSL_VERSION_NUMBER >= 0x10101000L) && \
+ !defined(LIBRESSL_VERSION_NUMBER) && \
+ !defined(OPENSSL_IS_BORINGSSL))
+ SSL_CTX_set_post_handshake_auth (ssl_ctx, 1);
+#endif
+
+#if !defined(LIBRESSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER >= 0x10100000L)
+ if (ssl_proto_version)
+ SSL_CTX_set_min_proto_version(ssl_ctx, ssl_proto_version);
+#endif
+
+ /* OpenSSL ciphers: https://www.openssl.org/docs/apps/ciphers.html
+ *
+ * Rules:
+ * 1. --ciphers overrides everything
+ * 2. We allow RSA key exchange by default (secure_protocol_auto)
+ * 3. We disallow RSA key exchange if PFS was requested (secure_protocol_pfs)
+ */
+ if (!opt.tls_ciphers_string)
+ {
+ if (opt.secure_protocol == secure_protocol_auto)
+ ciphers_string = "HIGH:!aNULL:!RC4:!MD5:!SRP:!PSK";
+ else if (opt.secure_protocol == secure_protocol_pfs)
+ ciphers_string = "HIGH:!aNULL:!RC4:!MD5:!SRP:!PSK:!kRSA";
+ }
+ else
+ {
+ ciphers_string = opt.tls_ciphers_string;
+ }
+
+ if (ciphers_string && !SSL_CTX_set_cipher_list(ssl_ctx, ciphers_string))
+ {
+ logprintf(LOG_NOTQUIET, _("OpenSSL: Invalid cipher list: %s\n"), ciphers_string);
+ goto error;
+ }
+
+ SSL_CTX_set_default_verify_paths (ssl_ctx);
+ SSL_CTX_load_verify_locations (ssl_ctx, opt.ca_cert, opt.ca_directory);
+
+#ifdef X509_V_FLAG_PARTIAL_CHAIN
+ /* Set X509_V_FLAG_PARTIAL_CHAIN to allow the client to anchor trust in
+ * a non-self-signed certificate. This defies RFC 4158 (Path Building)
+ * which defines a trust anchor in terms of a self-signed certificate.
+ * However, it substantially reduces attack surface by pruning the tree
+ * of unneeded trust points. For example, the cross-certified
+ * Let's Encrypt X3 CA, which protects gnu.org and appears as an
+ * intermediate CA to clients, can be used as a trust anchor without
+ * the entire IdentTrust PKI.
+ */
+ X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
+ if (param)
+ {
+ /* We only want X509_V_FLAG_PARTIAL_CHAIN, but the OpenSSL docs
+ * say to use X509_V_FLAG_TRUSTED_FIRST also. It looks like
+ * X509_V_FLAG_TRUSTED_FIRST applies to a collection of trust
+ * anchors and not a single trust anchor.
+ */
+ (void) X509_VERIFY_PARAM_set_flags (param, X509_V_FLAG_TRUSTED_FIRST | X509_V_FLAG_PARTIAL_CHAIN);
+ if (SSL_CTX_set1_param (ssl_ctx, param) == 0)
+ logprintf(LOG_NOTQUIET, _("OpenSSL: Failed set trust to partial chain\n"));
+ /* We continue on error */
+ X509_VERIFY_PARAM_free (param);
+ }
+ else
+ {
+ logprintf(LOG_NOTQUIET, _("OpenSSL: Failed to allocate verification param\n"));
+ /* We continue on error */
+ }
+#endif
+
+ if (opt.crl_file)
+ {
+ X509_STORE *store = SSL_CTX_get_cert_store (ssl_ctx);
+ X509_LOOKUP *lookup;
+
+ if (!(lookup = X509_STORE_add_lookup (store, X509_LOOKUP_file ()))
+ || (!X509_load_crl_file (lookup, opt.crl_file, X509_FILETYPE_PEM)))
+ goto error;
+
+ X509_STORE_set_flags (store, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
+ }
+
+ /* SSL_VERIFY_NONE instructs OpenSSL not to abort SSL_connect if the
+ certificate is invalid. We verify the certificate separately in
+ ssl_check_certificate, which provides much better diagnostics
+ than examining the error stack after a failed SSL_connect. */
+ SSL_CTX_set_verify (ssl_ctx, SSL_VERIFY_NONE, NULL);
+
+ /* Use the private key from the cert file unless otherwise specified. */
+ if (opt.cert_file && !opt.private_key)
+ {
+ opt.private_key = xstrdup (opt.cert_file);
+ opt.private_key_type = opt.cert_type;
+ }
+
+ /* Use cert from private key file unless otherwise specified. */
+ if (opt.private_key && !opt.cert_file)
+ {
+ opt.cert_file = xstrdup (opt.private_key);
+ opt.cert_type = opt.private_key_type;
+ }
+
+ if (opt.cert_file)
+ if (SSL_CTX_use_certificate_file (ssl_ctx, opt.cert_file,
+ key_type_to_ssl_type (opt.cert_type))
+ != 1)
+ goto error;
+ if (opt.private_key)
+ if (SSL_CTX_use_PrivateKey_file (ssl_ctx, opt.private_key,
+ key_type_to_ssl_type (opt.private_key_type))
+ != 1)
+ goto error;
+
+ /* Since fd_write unconditionally assumes partial writes (and
+ handles them correctly), allow them in OpenSSL. */
+ SSL_CTX_set_mode (ssl_ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
+
+ /* The OpenSSL library can handle renegotiations automatically, so
+ tell it to do so. */
+ SSL_CTX_set_mode (ssl_ctx, SSL_MODE_AUTO_RETRY);
+
+ return true;
+
+ error:
+ if (ssl_ctx)
+ SSL_CTX_free (ssl_ctx);
+ print_errors ();
+ return false;
+}
+
+void
+ssl_cleanup (void)
+{
+}
+
+struct openssl_transport_context
+{
+ SSL *conn; /* SSL connection handle */
+ SSL_SESSION *sess; /* SSL session info */
+ char *last_error; /* last error printed with openssl_errstr */
+};
+
+typedef int (*ssl_fn_t)(SSL *, void *, int);
+
+#ifdef OPENSSL_RUN_WITHTIMEOUT
+
+struct scwt_context
+{
+ SSL *ssl;
+ int result;
+};
+
+static void
+ssl_connect_with_timeout_callback(void *arg)
+{
+ struct scwt_context *ctx = (struct scwt_context *)arg;
+ ctx->result = SSL_connect(ctx->ssl);
+}
+
+static int
+ssl_connect_with_timeout(int fd _GL_UNUSED, SSL *conn, double timeout)
+{
+ struct scwt_context scwt_ctx;
+ scwt_ctx.ssl = conn;
+ errno = 0;
+ if (run_with_timeout(timeout, ssl_connect_with_timeout_callback,
+ &scwt_ctx))
+ {
+ errno = ETIMEDOUT;
+ return -1;
+ }
+ return scwt_ctx.result;
+}
+
+struct openssl_read_args
+{
+ int fd;
+ struct openssl_transport_context *ctx;
+ ssl_fn_t fn;
+ char *buf;
+ int bufsize;
+ int retval;
+};
+
+static void
+openssl_read_peek_callback(void *arg)
+{
+ struct openssl_read_args *args = (struct openssl_read_args *) arg;
+ struct openssl_transport_context *ctx = args->ctx;
+ ssl_fn_t fn = args->fn;
+ SSL *conn = ctx->conn;
+ char *buf = args->buf;
+ int bufsize = args->bufsize;
+ int ret;
+
+ do
+ {
+ ret = fn (conn, buf, bufsize);
+ }
+ while (ret == -1 && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL && errno == EINTR);
+ args->retval = ret;
+}
+
+static int
+openssl_read_peek (int fd, char *buf, int bufsize, void *arg, double timeout, ssl_fn_t fn)
+{
+ struct openssl_transport_context *ctx = arg;
+ int ret = SSL_pending (ctx->conn);
+
+ if (ret)
+ ret = fn (ctx->conn, buf, MIN (bufsize, ret));
+ else
+ {
+ struct openssl_read_args args;
+ args.fd = fd;
+ args.buf = buf;
+ args.bufsize = bufsize;
+ args.fn = fn;
+ args.ctx = ctx;
+
+ if (timeout == -1)
+ timeout = opt.read_timeout;
+
+ if (run_with_timeout(timeout, openssl_read_peek_callback, &args))
+ {
+ errno = ETIMEDOUT;
+ ret = -1;
+ }
+ else
+ ret = args.retval;
+ }
+ return ret;
+}
+
+#else /* OPENSSL_RUN_WITHTIMEOUT */
+
+#ifdef F_GETFL
+#define NONBLOCK_DECL int flags = 0;
+#define FD_SET_NONBLOCKED(_fd) \
+ flags = fcntl (_fd, F_GETFL, 0); \
+ if (flags < 0) \
+ return flags; \
+ if (fcntl (_fd, F_SETFL, flags | O_NONBLOCK)) \
+ return -1;
+#define FD_SET_BLOCKED(_fd) \
+ if (fcntl (_fd, F_SETFL, flags) < 0) \
+ return -1;
+#else
+#define NONBLOCK_DECL
+#define FD_SET_NONBLOCKED(_fd) \
+ {\
+ const int one = 1;\
+ if (ioctl (_fd, FIONBIO, &one) < 0)\
+ return -1;\
+ }
+#define FD_SET_BLOCKED(_fd) \
+ {\
+ const int zero = 0;\
+ if (ioctl (_fd, FIONBIO, &zero) < 0)\
+ return -1;\
+ }
+#endif /* F_GETFL */
+
+#define TIMER_INIT(_fd, _ret, _timeout) \
+ { \
+ NONBLOCK_DECL \
+ int timed_out = 0; \
+ FD_SET_NONBLOCKED(_fd) \
+ struct ptimer *timer = ptimer_new (); \
+ if (timer == NULL) \
+ _ret = -1; \
+ else \
+ { \
+ double next_timeout = _timeout;
+
+#define TIMER_FREE(_fd) \
+ ptimer_destroy (timer); \
+ } \
+ FD_SET_BLOCKED(_fd) \
+ if (timed_out) \
+ { \
+ errno = ETIMEDOUT; \
+ } \
+ }
+
+#define TIMER_WAIT(_fd, _conn, _ret, _timeout) \
+ { \
+ int wait_for; \
+ int err = SSL_get_error(_conn, _ret); \
+ if (err == SSL_ERROR_WANT_READ) \
+ wait_for = WAIT_FOR_READ; \
+ else if (err == SSL_ERROR_WANT_WRITE) \
+ wait_for = WAIT_FOR_WRITE; \
+ else \
+ break; \
+ err = select_fd_nb (_fd, next_timeout, wait_for); \
+ if (err <= 0) \
+ { \
+ if (err == 0) \
+timedout: \
+ timed_out = 1; \
+ _ret = -1; \
+ break; \
+ } \
+ next_timeout = _timeout - ptimer_measure (timer); \
+ if (next_timeout <= 0) \
+ goto timedout; \
+ }
+
+static int
+ssl_connect_with_timeout(int fd, SSL *conn, double timeout)
+{
+ int ret;
+
+ errno = 0;
+ if (timeout == 0)
+ ret = SSL_connect(conn);
+ else
+ {
+ TIMER_INIT(fd, ret, timeout)
+ ERR_clear_error();
+ while( (ret = SSL_connect(conn)) < 0 )
+ TIMER_WAIT(fd, conn, ret, timeout)
+ TIMER_FREE(fd)
+ }
+
+ return ret;
+}
+
+static int
+openssl_read_peek (int fd, char *buf, int bufsize, void *arg, double timeout, ssl_fn_t fn)
+{
+ struct openssl_transport_context *ctx = arg;
+ int ret = SSL_pending (ctx->conn);
+
+ if (timeout == -1)
+ timeout = opt.read_timeout;
+ /* If we have data available for immediate read, simply return that,
+ or do blocked read when timeout == 0 */
+ if (ret || timeout == 0)
+ do
+ {
+ ret = fn (ctx->conn, buf, (ret ? MIN (bufsize, ret) : bufsize));
+ }
+ while (ret == -1 && SSL_get_error (ctx->conn, ret) == SSL_ERROR_SYSCALL && errno == EINTR);
+ else
+ {
+ TIMER_INIT(fd, ret, timeout)
+ while( (ret = fn (ctx->conn, buf, bufsize)) <= 0 )
+ TIMER_WAIT(fd, ctx->conn, ret, timeout)
+ TIMER_FREE(fd)
+ }
+
+ return ret;
+}
+
+#endif /* OPENSSL_RUN_WITHTIMEOUT */
+
+static int
+openssl_read (int fd, char *buf, int bufsize, void *arg, double timeout)
+{
+ return openssl_read_peek (fd, buf, bufsize, arg, timeout, SSL_read);
+}
+
+static int
+openssl_write (int fd _GL_UNUSED, char *buf, int bufsize, void *arg)
+{
+ int ret = 0;
+ struct openssl_transport_context *ctx = arg;
+ SSL *conn = ctx->conn;
+ do
+ ret = SSL_write (conn, buf, bufsize);
+ while (ret == -1 && SSL_get_error (conn, ret) == SSL_ERROR_SYSCALL && errno == EINTR);
+ return ret;
+}
+
+static int
+openssl_poll (int fd, double timeout, int wait_for, void *arg)
+{
+ struct openssl_transport_context *ctx = arg;
+ SSL *conn = ctx->conn;
+ if ((wait_for & WAIT_FOR_READ) && SSL_pending (conn))
+ return 1;
+ /* if (timeout == 0)
+ return 1; */
+ if (timeout == -1)
+ timeout = opt.read_timeout;
+ return select_fd (fd, timeout, wait_for);
+}
+
+static int
+openssl_peek (int fd, char *buf, int bufsize, void *arg, double timeout)
+{
+ return openssl_read_peek (fd, buf, bufsize, arg, timeout, SSL_peek);
+}
+
+static const char *
+openssl_errstr (int fd _GL_UNUSED, void *arg)
+{
+ struct openssl_transport_context *ctx = arg;
+ unsigned long errcode;
+ char *errmsg = NULL;
+ int msglen = 0;
+
+ /* If there are no SSL-specific errors, just return NULL. */
+ if ((errcode = ERR_get_error ()) == 0)
+ return NULL;
+
+ /* Get rid of previous contents of ctx->last_error, if any. */
+ xfree (ctx->last_error);
+
+ /* Iterate over OpenSSL's error stack and accumulate errors in the
+ last_error buffer, separated by "; ". This is better than using
+ a static buffer, which *always* takes up space (and has to be
+ large, to fit more than one error message), whereas these
+ allocations are only performed when there is an actual error. */
+
+ for (;;)
+ {
+ const char *str = ERR_error_string (errcode, NULL);
+ int len = strlen (str);
+
+ /* Allocate space for the existing message, plus two more chars
+ for the "; " separator and one for the terminating \0. */
+ errmsg = xrealloc (errmsg, msglen + len + 2 + 1);
+ memcpy (errmsg + msglen, str, len);
+ msglen += len;
+
+ /* Get next error and bail out if there are no more. */
+ errcode = ERR_get_error ();
+ if (errcode == 0)
+ break;
+
+ errmsg[msglen++] = ';';
+ errmsg[msglen++] = ' ';
+ }
+ errmsg[msglen] = '\0';
+
+ /* Store the error in ctx->last_error where openssl_close will
+ eventually find it and free it. */
+ ctx->last_error = errmsg;
+
+ return errmsg;
+}
+
+static void
+openssl_close (int fd, void *arg)
+{
+ struct openssl_transport_context *ctx = arg;
+ SSL *conn = ctx->conn;
+
+ SSL_shutdown (conn);
+ SSL_free (conn);
+ xfree (ctx->last_error);
+ xfree (ctx);
+
+ close (fd);
+
+ DEBUGP (("Closed %d/SSL 0x%0*lx\n", fd, PTR_FORMAT (conn)));
+}
+
+/* openssl_transport is the singleton that describes the SSL transport
+ methods provided by this file. */
+
+static struct transport_implementation openssl_transport = {
+ openssl_read, openssl_write, openssl_poll,
+ openssl_peek, openssl_errstr, openssl_close
+};
+
+static const char *
+_sni_hostname(const char *hostname)
+{
+ size_t len = strlen(hostname);
+
+ char *sni_hostname = xmemdup(hostname, len + 1);
+
+ /* Remove trailing dot(s) to fix #47408.
+ * Regarding RFC 6066 (SNI): The hostname is represented as a byte
+ * string using ASCII encoding without a trailing dot. */
+ while (len && sni_hostname[--len] == '.')
+ sni_hostname[len] = 0;
+
+ return sni_hostname;
+}
+
+/* Perform the SSL handshake on file descriptor FD, which is assumed
+ to be connected to an SSL server. The SSL handle provided by
+ OpenSSL is registered with the file descriptor FD using
+ fd_register_transport, so that subsequent calls to fd_read,
+ fd_write, etc., will use the corresponding SSL functions.
+
+ Returns true on success, false on failure. */
+
+bool
+ssl_connect_wget (int fd, const char *hostname, int *continue_session)
+{
+ SSL *conn;
+ struct openssl_transport_context *ctx;
+
+ DEBUGP (("Initiating SSL handshake.\n"));
+
+ assert (ssl_ctx != NULL);
+ conn = SSL_new (ssl_ctx);
+ if (!conn)
+ goto error;
+#if OPENSSL_VERSION_NUMBER >= 0x0090806fL && !defined(OPENSSL_NO_TLSEXT)
+ /* If the SSL library was built with support for ServerNameIndication
+ then use it whenever we have a hostname. If not, don't, ever. */
+ if (! is_valid_ip_address (hostname))
+ {
+ const char *sni_hostname = _sni_hostname(hostname);
+
+ long rc = SSL_set_tlsext_host_name (conn, sni_hostname);
+ xfree(sni_hostname);
+
+ if (rc == 0)
+ {
+ DEBUGP (("Failed to set TLS server-name indication."));
+ goto error;
+ }
+ }
+#endif
+
+ if (continue_session)
+ {
+ /* attempt to resume a previous SSL session */
+ ctx = (struct openssl_transport_context *) fd_transport_context (*continue_session);
+ if (!ctx || !ctx->sess || !SSL_set_session (conn, ctx->sess))
+ goto error;
+ }
+
+#ifndef FD_TO_SOCKET
+# define FD_TO_SOCKET(X) (X)
+#endif
+ if (!SSL_set_fd (conn, FD_TO_SOCKET (fd)))
+ goto error;
+ SSL_set_connect_state (conn);
+
+ /* Re-seed the PRNG before the SSL handshake */
+ init_prng ();
+ if (RAND_status () != 1)
+ {
+ logprintf(LOG_NOTQUIET,
+ _("WARNING: Could not seed PRNG. Consider using --random-file.\n"));
+ goto error;
+ }
+
+ if (ssl_connect_with_timeout(fd, conn, opt.read_timeout) <= 0
+ || !SSL_is_init_finished(conn))
+ goto timedout;
+
+ ctx = xnew0 (struct openssl_transport_context);
+ ctx->conn = conn;
+ ctx->sess = SSL_get0_session (conn);
+ if (!ctx->sess)
+ logprintf (LOG_NOTQUIET, "WARNING: Could not save SSL session data for socket %d\n", fd);
+
+ /* Register FD with Wget's transport layer, i.e. arrange that our
+ functions are used for reading, writing, and polling. */
+ fd_register_transport (fd, &openssl_transport, ctx);
+ DEBUGP (("Handshake successful; connected socket %d to SSL handle 0x%0*lx\n",
+ fd, PTR_FORMAT (conn)));
+
+ ERR_clear_error ();
+ return true;
+
+ timedout:
+ if (errno == ETIMEDOUT)
+ DEBUGP (("SSL handshake timed out.\n"));
+ else
+ error:
+ DEBUGP (("SSL handshake failed.\n"));
+ print_errors ();
+ if (conn)
+ SSL_free (conn);
+ return false;
+}
+
+#define ASTERISK_EXCLUDES_DOT /* mandated by rfc2818 */
+
+/* Return true is STRING (case-insensitively) matches PATTERN, false
+ otherwise. The recognized wildcard character is "*", which matches
+ any character in STRING except ".". Any number of the "*" wildcard
+ may be present in the pattern.
+
+ This is used to match of hosts as indicated in rfc2818: "Names may
+ contain the wildcard character * which is considered to match any
+ single domain name component or component fragment. E.g., *.a.com
+ matches foo.a.com but not bar.foo.a.com. f*.com matches foo.com but
+ not bar.com [or foo.bar.com]."
+
+ If the pattern contain no wildcards, pattern_match(a, b) is
+ equivalent to !strcasecmp(a, b). */
+
+static bool
+pattern_match (const char *pattern, const char *string)
+{
+ const char *p = pattern, *n = string;
+ char c;
+ for (; (c = c_tolower (*p++)) != '\0'; n++)
+ if (c == '*')
+ {
+ for (c = c_tolower (*p); c == '*'; c = c_tolower (*++p))
+ ;
+ for (; *n != '\0'; n++)
+ if (c_tolower (*n) == c && pattern_match (p, n))
+ return true;
+#ifdef ASTERISK_EXCLUDES_DOT
+ else if (*n == '.')
+ return false;
+#endif
+ return c == '\0';
+ }
+ else
+ {
+ if (c != c_tolower (*n))
+ return false;
+ }
+ return *n == '\0';
+}
+
+static char *_get_rfc2253_formatted (X509_NAME *name)
+{
+ int len;
+ char *out = NULL;
+ BIO* b;
+
+ if ((b = BIO_new (BIO_s_mem ())))
+ {
+ if (X509_NAME_print_ex (b, name, 0, XN_FLAG_RFC2253) >= 0
+ && (len = BIO_number_written (b)) > 0)
+ {
+ out = xmalloc (len + 1);
+ BIO_read (b, out, len);
+ out[len] = 0;
+ }
+ BIO_free (b);
+ }
+
+ return out ? out : xstrdup("");
+}
+
+/*
+ * Heavily modified from:
+ * https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#OpenSSL
+ */
+static bool
+pkp_pin_peer_pubkey (X509* cert, const char *pinnedpubkey)
+{
+ /* Scratch */
+ int len1 = 0, len2 = 0;
+ char *buff1 = NULL, *temp = NULL;
+
+ /* Result is returned to caller */
+ bool result = false;
+
+ /* if a path wasn't specified, don't pin */
+ if (!pinnedpubkey)
+ return true;
+
+ if (!cert)
+ return result;
+
+ /* Begin Gyrations to get the subjectPublicKeyInfo */
+ /* Thanks to Viktor Dukhovni on the OpenSSL mailing list */
+
+ /* https://groups.google.com/group/mailing.openssl.users/browse_thread
+ /thread/d61858dae102c6c7 */
+ len1 = i2d_X509_PUBKEY (X509_get_X509_PUBKEY (cert), NULL);
+ if (len1 < 1)
+ goto cleanup; /* failed */
+
+ /* https://www.openssl.org/docs/crypto/buffer.html */
+ buff1 = temp = OPENSSL_malloc (len1);
+ if (!buff1)
+ goto cleanup; /* failed */
+
+ /* https://www.openssl.org/docs/crypto/d2i_X509.html */
+ len2 = i2d_X509_PUBKEY (X509_get_X509_PUBKEY (cert), (unsigned char **) &temp);
+
+ /*
+ * These checks are verifying we got back the same values as when we
+ * sized the buffer. It's pretty weak since they should always be the
+ * same. But it gives us something to test.
+ */
+ if ((len1 != len2) || !temp || ((temp - buff1) != len1))
+ goto cleanup; /* failed */
+
+ /* End Gyrations */
+
+ /* The one good exit point */
+ result = wg_pin_peer_pubkey (pinnedpubkey, buff1, len1);
+
+ cleanup:
+ /* https://www.openssl.org/docs/crypto/buffer.html */
+ if (NULL != buff1)
+ OPENSSL_free (buff1);
+
+ return result;
+}
+
+/* Verify the validity of the certificate presented by the server.
+ Also check that the "common name" of the server, as presented by
+ its certificate, corresponds to HOST. (HOST typically comes from
+ the URL and is what the user thinks he's connecting to.)
+
+ This assumes that ssl_connect_wget has successfully finished, i.e. that
+ the SSL handshake has been performed and that FD is connected to an
+ SSL handle.
+
+ If opt.check_cert is true (the default), this returns 1 if the
+ certificate is valid, 0 otherwise. If opt.check_cert is 0, the
+ function always returns 1, but should still be called because it
+ warns the user about any problems with the certificate. */
+
+bool
+ssl_check_certificate (int fd, const char *host)
+{
+ X509 *cert;
+ GENERAL_NAMES *subjectAltNames;
+ char common_name[256];
+ long vresult;
+ bool success = true;
+ bool alt_name_checked = false;
+ bool pinsuccess = opt.pinnedpubkey == NULL;
+
+ /* If the user has specified --no-check-cert, we still want to warn
+ him about problems with the server's certificate. */
+ const char *severity = opt.check_cert ? _("ERROR") : _("WARNING");
+
+ struct openssl_transport_context *ctx = fd_transport_context (fd);
+ SSL *conn = ctx->conn;
+ assert (conn != NULL);
+
+ /* The user explicitly said to not check for the certificate. */
+ if (opt.check_cert == CHECK_CERT_QUIET && pinsuccess)
+ return success;
+
+ cert = SSL_get_peer_certificate (conn);
+ if (!cert)
+ {
+ logprintf (LOG_NOTQUIET, _("%s: No certificate presented by %s.\n"),
+ severity, quotearg_style (escape_quoting_style, host));
+ success = false;
+ goto no_cert; /* must bail out since CERT is NULL */
+ }
+
+ IF_DEBUG
+ {
+ char *subject = _get_rfc2253_formatted (X509_get_subject_name (cert));
+ char *issuer = _get_rfc2253_formatted (X509_get_issuer_name (cert));
+ DEBUGP (("certificate:\n subject: %s\n issuer: %s\n",
+ quotearg_n_style (0, escape_quoting_style, subject),
+ quotearg_n_style (1, escape_quoting_style, issuer)));
+ xfree (subject);
+ xfree (issuer);
+ }
+
+ vresult = SSL_get_verify_result (conn);
+ if (vresult != X509_V_OK)
+ {
+ char *issuer = _get_rfc2253_formatted (X509_get_issuer_name (cert));
+ logprintf (LOG_NOTQUIET,
+ _("%s: cannot verify %s's certificate, issued by %s:\n"),
+ severity, quotearg_n_style (0, escape_quoting_style, host),
+ quote_n (1, issuer));
+ xfree(issuer);
+
+ /* Try to print more user-friendly (and translated) messages for
+ the frequent verification errors. */
+ switch (vresult)
+ {
+ case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
+ logprintf (LOG_NOTQUIET,
+ _(" Unable to locally verify the issuer's authority.\n"));
+ break;
+ case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
+ case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
+ logprintf (LOG_NOTQUIET,
+ _(" Self-signed certificate encountered.\n"));
+ break;
+ case X509_V_ERR_CERT_NOT_YET_VALID:
+ logprintf (LOG_NOTQUIET, _(" Issued certificate not yet valid.\n"));
+ break;
+ case X509_V_ERR_CERT_HAS_EXPIRED:
+ logprintf (LOG_NOTQUIET, _(" Issued certificate has expired.\n"));
+ break;
+ default:
+ /* For the less frequent error strings, simply provide the
+ OpenSSL error message. */
+ logprintf (LOG_NOTQUIET, " %s\n",
+ X509_verify_cert_error_string (vresult));
+ }
+ success = false;
+ /* Fall through, so that the user is warned about *all* issues
+ with the cert (important with --no-check-certificate.) */
+ }
+
+ /* Check that HOST matches the common name in the certificate.
+ #### The following remains to be done:
+
+ - When matching against common names, it should loop over all
+ common names and choose the most specific one, i.e. the last
+ one, not the first one, which the current code picks.
+
+ - Ensure that ASN1 strings from the certificate are encoded as
+ UTF-8 which can be meaningfully compared to HOST. */
+
+ subjectAltNames = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL);
+
+ if (subjectAltNames)
+ {
+ /* Test subject alternative names */
+
+ /* SNI hostname must not have a trailing dot */
+ const char *sni_hostname = _sni_hostname(host);
+
+ /* Do we want to check for dNSNAmes or ipAddresses (see RFC 2818)?
+ * Signal it by host_in_octet_string. */
+ ASN1_OCTET_STRING *host_in_octet_string = a2i_IPADDRESS (sni_hostname);
+
+ int numaltnames = sk_GENERAL_NAME_num (subjectAltNames);
+ int i;
+ for (i=0; i < numaltnames; i++)
+ {
+ const GENERAL_NAME *name =
+ sk_GENERAL_NAME_value (subjectAltNames, i);
+ if (name)
+ {
+ if (host_in_octet_string)
+ {
+ if (name->type == GEN_IPADD)
+ {
+ /* Check for ipAddress */
+ /* TODO: Should we convert between IPv4-mapped IPv6
+ * addresses and IPv4 addresses? */
+ alt_name_checked = true;
+ if (!ASN1_STRING_cmp (host_in_octet_string,
+ name->d.iPAddress))
+ break;
+ }
+ }
+ else if (name->type == GEN_DNS)
+ {
+ /* dNSName should be IA5String (i.e. ASCII), however who
+ * does trust CA? Convert it into UTF-8 for sure. */
+ unsigned char *name_in_utf8 = NULL;
+
+ /* Check for dNSName */
+ alt_name_checked = true;
+
+ if (0 <= ASN1_STRING_to_UTF8 (&name_in_utf8, name->d.dNSName))
+ {
+ /* Compare and check for NULL attack in ASN1_STRING */
+ if (pattern_match ((char *)name_in_utf8, sni_hostname) &&
+ (strlen ((char *)name_in_utf8) ==
+ (size_t) ASN1_STRING_length (name->d.dNSName)))
+ {
+ OPENSSL_free (name_in_utf8);
+ break;
+ }
+ OPENSSL_free (name_in_utf8);
+ }
+ }
+ }
+ }
+ sk_GENERAL_NAME_pop_free(subjectAltNames, GENERAL_NAME_free);
+ if (host_in_octet_string)
+ ASN1_OCTET_STRING_free(host_in_octet_string);
+
+ if (alt_name_checked == true && i >= numaltnames)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("%s: no certificate subject alternative name matches\n"
+ "\trequested host name %s.\n"),
+ severity, quote_n (1, sni_hostname));
+ success = false;
+ }
+
+ xfree(sni_hostname);
+ }
+
+ if (alt_name_checked == false)
+ {
+ /* Test commomName */
+ X509_NAME *xname = X509_get_subject_name(cert);
+ common_name[0] = '\0';
+ X509_NAME_get_text_by_NID (xname, NID_commonName, common_name,
+ sizeof (common_name));
+
+ if (!pattern_match (common_name, host))
+ {
+ logprintf (LOG_NOTQUIET, _("\
+ %s: certificate common name %s doesn't match requested host name %s.\n"),
+ severity, quote_n (0, common_name), quote_n (1, host));
+ success = false;
+ }
+ else
+ {
+ /* We now determine the length of the ASN1 string. If it
+ * differs from common_name's length, then there is a \0
+ * before the string terminates. This can be an instance of a
+ * null-prefix attack.
+ *
+ * https://www.blackhat.com/html/bh-usa-09/bh-usa-09-archives.html#Marlinspike
+ * */
+
+ int i = -1, j;
+ X509_NAME_ENTRY *xentry;
+ ASN1_STRING *sdata;
+
+ if (xname) {
+ for (;;)
+ {
+ j = X509_NAME_get_index_by_NID (xname, NID_commonName, i);
+ if (j == -1) break;
+ i = j;
+ }
+ }
+
+ xentry = X509_NAME_get_entry(xname,i);
+ sdata = X509_NAME_ENTRY_get_data(xentry);
+ if (strlen (common_name) != (size_t) ASN1_STRING_length (sdata))
+ {
+ logprintf (LOG_NOTQUIET, _("\
+ %s: certificate common name is invalid (contains a NUL character).\n\
+ This may be an indication that the host is not who it claims to be\n\
+ (that is, it is not the real %s).\n"),
+ severity, quote (host));
+ success = false;
+ }
+ }
+ }
+
+ pinsuccess = pkp_pin_peer_pubkey (cert, opt.pinnedpubkey);
+ if (!pinsuccess)
+ {
+ logprintf (LOG_ALWAYS, _("The public key does not match pinned public key!\n"));
+ success = false;
+ }
+
+
+ if (success)
+ DEBUGP (("X509 certificate successfully verified and matches host %s\n",
+ quotearg_style (escape_quoting_style, host)));
+ X509_free (cert);
+
+ no_cert:
+ if (opt.check_cert == CHECK_CERT_ON && !success)
+ logprintf (LOG_NOTQUIET, _("\
+To connect to %s insecurely, use `--no-check-certificate'.\n"),
+ quotearg_style (escape_quoting_style, host));
+
+ /* never return true if pinsuccess fails */
+ return !pinsuccess ? false : (opt.check_cert == CHECK_CERT_ON ? success : true);
+}
+
+/*
+ * vim: tabstop=2 shiftwidth=2 softtabstop=2
+ */
diff --git a/src/options.h b/src/options.h
new file mode 100644
index 0000000..9a02f3a
--- /dev/null
+++ b/src/options.h
@@ -0,0 +1,351 @@
+/* struct options.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+enum CHECK_CERT_MODES
+{
+ CHECK_CERT_OFF,
+ CHECK_CERT_ON,
+ CHECK_CERT_QUIET
+};
+
+struct options
+{
+ int verbose; /* Are we verbose? (First set to -1,
+ hence not boolean.) */
+ bool quiet; /* Are we quiet? */
+ int ntry; /* Number of tries per URL */
+ bool retry_connrefused; /* Treat CONNREFUSED as non-fatal. */
+ bool retry_on_host_error; /* Treat host errors as non-fatal. */
+ char *retry_on_http_error; /* Treat given HTTP errors as non-fatal. */
+ bool background; /* Whether we should work in background. */
+ bool ignore_length; /* Do we heed content-length at all? */
+ bool recursive; /* Are we recursive? */
+ bool spanhost; /* Do we span across hosts in
+ recursion? */
+ int max_redirect; /* Maximum number of times we'll allow
+ a page to redirect. */
+ bool relative_only; /* Follow only relative links. */
+ bool no_parent; /* Restrict access to the parent
+ directory. */
+ int reclevel; /* Maximum level of recursion */
+ bool dirstruct; /* Do we build the directory structure
+ as we go along? */
+ bool no_dirstruct; /* Do we hate dirstruct? */
+ int cut_dirs; /* Number of directory components to cut. */
+ bool add_hostdir; /* Do we add hostname directory? */
+ bool protocol_directories; /* Whether to prepend "http"/"ftp" to dirs. */
+ bool noclobber; /* Disables clobbering of existing data. */
+ bool unlink_requested; /* remove file before clobbering */
+ char *dir_prefix; /* The top of directory tree */
+ char *lfilename; /* Log filename */
+ char *input_filename; /* Input filename */
+#ifdef HAVE_METALINK
+ char *input_metalink; /* Input metalink file */
+ int metalink_index; /* Metalink application/metalink4+xml metaurl ordinal number. */
+ bool metalink_over_http; /* Use Metalink if present in HTTP response */
+ char *preferred_location; /* Preferred location for Metalink resources */
+#endif
+ char *choose_config; /* Specified config file */
+ bool noconfig; /* Ignore all config files? */
+ bool force_html; /* Is the input file an HTML file? */
+
+ char *default_page; /* Alternative default page (index file) */
+
+ bool spider; /* Is Wget in spider mode? */
+
+ char **accepts; /* List of patterns to accept. */
+ char **rejects; /* List of patterns to reject. */
+ const char **excludes; /* List of excluded FTP directories. */
+ const char **includes; /* List of FTP directories to
+ follow. */
+ bool ignore_case; /* Whether to ignore case when
+ matching dirs and files */
+
+ char *acceptregex_s; /* Patterns to accept (a regex string). */
+ char *rejectregex_s; /* Patterns to reject (a regex string). */
+ void *acceptregex; /* Patterns to accept (a regex struct). */
+ void *rejectregex; /* Patterns to reject (a regex struct). */
+ enum {
+#if defined HAVE_LIBPCRE || HAVE_LIBPCRE2
+ regex_type_pcre,
+#endif
+ regex_type_posix
+ } regex_type; /* The regex library. */
+ void *(*regex_compile_fun)(const char *); /* Function to compile a regex. */
+ bool (*regex_match_fun)(const void *, const char *); /* Function to match a string to a regex. */
+
+#ifdef HAVE_LIBCARES
+ char *bind_dns_address;
+ char *dns_servers;
+#endif
+
+ char **domains; /* See host.c */
+ char **exclude_domains;
+ bool dns_cache; /* whether we cache DNS lookups. */
+
+ char **follow_tags; /* List of HTML tags to recursively follow. */
+ char **ignore_tags; /* List of HTML tags to ignore if recursing. */
+
+ bool follow_ftp; /* Are FTP URL-s followed in recursive
+ retrieving? */
+ bool retr_symlinks; /* Whether we retrieve symlinks in
+ FTP. */
+ char *output_document; /* The output file to which the
+ documents will be printed. */
+ char *warc_filename; /* WARC output filename */
+ char *warc_tempdir; /* WARC temp dir */
+ char *warc_cdx_dedup_filename;/* CDX file to be used for deduplication. */
+ wgint warc_maxsize; /* WARC max archive size */
+ bool warc_compression_enabled;/* For GZIP compression. */
+ bool warc_digests_enabled; /* For SHA1 digests. */
+ bool warc_cdx_enabled; /* Create CDX files? */
+ bool warc_keep_log; /* Store the log file in a WARC record. */
+ char **warc_user_headers; /* User-defined WARC header(s). */
+
+ bool enable_xattr; /* Store metadata in POSIX extended attributes. */
+
+ char *user; /* Generic username */
+ char *passwd; /* Generic password */
+ bool ask_passwd; /* Ask for password? */
+ char *use_askpass; /* value to use for use-askpass if WGET_ASKPASS is not set */
+
+ bool always_rest; /* Always use REST. */
+ wgint start_pos; /* Start position of a download. */
+ char *ftp_user; /* FTP username */
+ char *ftp_passwd; /* FTP password */
+ bool netrc; /* Whether to read .netrc. */
+ bool ftp_glob; /* FTP globbing */
+ bool ftp_pasv; /* Passive FTP. */
+
+ char *http_user; /* HTTP username. */
+ char *http_passwd; /* HTTP password. */
+ char **user_headers; /* User-defined header(s). */
+ bool http_keep_alive; /* whether we use keep-alive */
+
+ bool use_proxy; /* Do we use proxy? */
+ bool allow_cache; /* Do we allow server-side caching? */
+ char *http_proxy, *ftp_proxy, *https_proxy;
+ char **no_proxy;
+ char *base_href;
+ char *progress_type; /* progress indicator type. */
+ int show_progress; /* Show only the progress bar */
+ bool noscroll; /* Don't scroll the filename in the progressbar */
+ char *proxy_user; /*oli*/
+ char *proxy_passwd;
+
+ double read_timeout; /* The read/write timeout. */
+ double dns_timeout; /* The DNS timeout. */
+ double connect_timeout; /* The connect timeout. */
+
+ bool random_wait; /* vary from 0 .. wait secs by random()? */
+ double wait; /* The wait period between retrievals. */
+ double waitretry; /* The wait period between retries. - HEH */
+ bool use_robots; /* Do we heed robots.txt? */
+
+ wgint limit_rate; /* Limit the download rate to this
+ many bps. */
+ SUM_SIZE_INT quota; /* Maximum file size to download and
+ store. */
+
+ bool server_response; /* Do we print server response? */
+ bool save_headers; /* Do we save headers together with
+ file? */
+ bool content_on_error; /* Do we output the content when the HTTP
+ status code indicates a server error */
+
+ bool debug; /* Debugging on/off */
+
+#ifdef USE_WATT32
+ bool wdebug; /* Watt-32 tcp/ip debugging on/off */
+#endif
+
+ bool timestamping; /* Whether to use time-stamping. */
+ bool if_modified_since; /* Whether to use conditional get requests. */
+
+ bool backup_converted; /* Do we save pre-converted files as *.orig? */
+ int backups; /* Are numeric backups made? */
+
+ char *useragent; /* User-Agent string, which can be set
+ to something other than Wget. */
+ char *referer; /* Naughty Referer, which can be
+ set to something other than
+ NULL. */
+ bool convert_links; /* Will the links be converted
+ locally? */
+ bool convert_file_only; /* Convert only the file portion of the URI (i.e. basename).
+ Leave everything else untouched. */
+
+ bool remove_listing; /* Do we remove .listing files
+ generated by FTP? */
+ bool htmlify; /* Do we HTML-ify the OS-dependent
+ listings? */
+
+ char *dot_style;
+ wgint dot_bytes; /* How many bytes in a printing
+ dot. */
+ int dots_in_line; /* How many dots in one line. */
+ int dot_spacing; /* How many dots between spacings. */
+
+ bool delete_after; /* Whether the files will be deleted
+ after download. */
+
+ bool adjust_extension; /* Use ".html" extension on all text/html? */
+
+ bool page_requisites; /* Whether we need to download all files
+ necessary to display a page properly. */
+ char *bind_address; /* What local IP address to bind to. */
+
+#ifdef HAVE_SSL
+ enum {
+ secure_protocol_auto,
+ secure_protocol_sslv2,
+ secure_protocol_sslv3,
+ secure_protocol_tlsv1,
+ secure_protocol_tlsv1_1,
+ secure_protocol_tlsv1_2,
+ secure_protocol_tlsv1_3,
+ secure_protocol_pfs
+ } secure_protocol; /* type of secure protocol to use. */
+ int check_cert; /* whether to validate the server's cert */
+ char *cert_file; /* external client certificate to use. */
+ char *private_key; /* private key file (if not internal). */
+ enum keyfile_type {
+ keyfile_pem,
+ keyfile_asn1
+ } cert_type; /* type of client certificate file */
+ enum keyfile_type
+ private_key_type; /* type of private key file */
+
+ char *ca_directory; /* CA directory (hash files) */
+ char *ca_cert; /* CA certificate file to use */
+ char *crl_file; /* file with CRLs */
+
+ char *pinnedpubkey; /* Public key (PEM/DER) file, or any number
+ of base64 encoded sha256 hashes preceded by
+ \'sha256//\' and separated by \';\', to verify
+ peer against */
+
+ char *random_file; /* file with random data to seed the PRNG */
+ char *egd_file; /* file name of the egd daemon socket */
+ bool https_only; /* whether to follow HTTPS only */
+ bool ftps_resume_ssl;
+ bool ftps_fallback_to_ftp;
+ bool ftps_implicit;
+ bool ftps_clear_data_connection;
+
+ char *tls_ciphers_string;
+#endif /* HAVE_SSL */
+
+ bool cookies; /* whether cookies are used. */
+ char *cookies_input; /* file we're loading the cookies from. */
+ char *cookies_output; /* file we're saving the cookies to. */
+ bool keep_badhash; /* Keep files with checksum mismatch. */
+ bool keep_session_cookies; /* whether session cookies should be
+ saved and loaded. */
+
+ char *post_data; /* POST query string */
+ char *post_file_name; /* File to post */
+ char *method; /* HTTP Method to use in Header */
+ char *body_data; /* HTTP Method Data String */
+ char *body_file; /* HTTP Method File */
+
+ enum {
+ restrict_unix,
+ restrict_vms,
+ restrict_windows
+ } restrict_files_os; /* file name restriction ruleset. */
+ bool restrict_files_ctrl; /* non-zero if control chars in URLs
+ are restricted from appearing in
+ generated file names. */
+ bool restrict_files_nonascii; /* non-zero if bytes with values greater
+ than 127 are restricted. */
+ enum {
+ restrict_no_case_restriction,
+ restrict_lowercase,
+ restrict_uppercase
+ } restrict_files_case; /* file name case restriction. */
+
+ bool strict_comments; /* whether strict SGML comments are
+ enforced. */
+
+ bool preserve_perm; /* whether remote permissions are used
+ or that what is set by umask. */
+
+#ifdef ENABLE_IPV6
+ bool ipv4_only; /* IPv4 connections have been requested. */
+ bool ipv6_only; /* IPv4 connections have been requested. */
+#endif
+ enum {
+ prefer_ipv4,
+ prefer_ipv6,
+ prefer_none
+ } prefer_family; /* preferred address family when more
+ than one type is available */
+
+ bool content_disposition; /* Honor HTTP Content-Disposition header. */
+ bool auth_without_challenge; /* Issue Basic authentication creds without
+ waiting for a challenge. */
+
+ bool enable_iri;
+ char *encoding_remote;
+ const char *locale;
+
+ bool trustservernames;
+#ifdef __VMS
+ int ftp_stmlf; /* Force Stream_LF format for binary FTP. */
+#endif /* def __VMS */
+
+ bool useservertimestamps; /* Update downloaded files' timestamps to
+ match those on server? */
+
+ bool show_all_dns_entries; /* Show all the DNS entries when resolving a
+ name. */
+ bool report_bps; /*Output bandwidth in bits format*/
+
+#ifdef HAVE_LIBZ
+ enum compression_options {
+ compression_auto,
+ compression_gzip,
+ compression_none
+ } compression; /* type of HTTP compression to use */
+#endif
+
+ char *rejected_log; /* The file to log rejected URLS to. */
+
+#ifdef HAVE_HSTS
+ bool hsts;
+ char *hsts_file;
+#endif
+
+ const char *homedir; /* the homedir of the running process */
+ const char *wgetrcfile; /* the wgetrc file to be loaded */
+};
+
+extern struct options opt;
diff --git a/src/progress.c b/src/progress.c
new file mode 100644
index 0000000..d8b57e3
--- /dev/null
+++ b/src/progress.c
@@ -0,0 +1,1462 @@
+/* Download progress.
+ Copyright (C) 2001-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <signal.h>
+#include <wchar.h>
+#include <mbiter.h>
+
+#include "progress.h"
+#include "utils.h"
+#include "retr.h"
+#include "c-strcase.h"
+
+struct progress_implementation {
+ const char *name;
+ bool interactive;
+ void *(*create) (const char *, wgint, wgint);
+ void (*update) (void *, wgint, double);
+ void (*draw) (void *);
+ void (*finish) (void *, double);
+ void (*set_params) (const char *);
+};
+
+/* Necessary forward declarations. */
+
+static void *dot_create (const char *, wgint, wgint);
+static void dot_update (void *, wgint, double);
+static void dot_finish (void *, double);
+static void dot_draw (void *);
+static void dot_set_params (const char *);
+
+static void *bar_create (const char *, wgint, wgint);
+static void bar_update (void *, wgint, double);
+static void bar_draw (void *);
+static void bar_finish (void *, double);
+static void bar_set_params (const char *);
+
+static struct progress_implementation implementations[] = {
+ { "dot", 0, dot_create, dot_update, dot_draw, dot_finish, dot_set_params },
+ { "bar", 1, bar_create, bar_update, bar_draw, bar_finish, bar_set_params }
+};
+static struct progress_implementation *current_impl;
+static int current_impl_locked;
+
+/* Progress implementation used by default. Can be overridden in
+ wgetrc or by the fallback one. */
+
+#define DEFAULT_PROGRESS_IMPLEMENTATION "bar"
+
+/* Fallback progress implementation should be something that works
+ under all display types. If you put something other than "dot"
+ here, remember that bar_set_params tries to switch to this if we're
+ not running on a TTY. So changing this to "bar" could cause
+ infloop. */
+
+#define FALLBACK_PROGRESS_IMPLEMENTATION "dot"
+
+/* Return true if NAME names a valid progress bar implementation. The
+ characters after the first : will be ignored. */
+
+bool
+valid_progress_implementation_p (const char *name)
+{
+ size_t i;
+ struct progress_implementation *pi = implementations;
+ char *colon = strchr (name, ':');
+ size_t namelen = colon ? (size_t) (colon - name) : strlen (name);
+
+ for (i = 0; i < countof (implementations); i++, pi++)
+ if (!strncmp (pi->name, name, namelen))
+ return true;
+ return false;
+}
+
+/* Set the progress implementation to NAME. */
+
+void
+set_progress_implementation (const char *name)
+{
+ size_t i, namelen;
+ struct progress_implementation *pi = implementations;
+ const char *colon;
+
+ if (!name)
+ name = DEFAULT_PROGRESS_IMPLEMENTATION;
+
+ colon = strchr (name, ':');
+ namelen = colon ? (size_t) (colon - name) : strlen (name);
+
+ for (i = 0; i < countof (implementations); i++, pi++)
+ if (!strncmp (pi->name, name, namelen))
+ {
+ current_impl = pi;
+ current_impl_locked = 0;
+
+ if (colon)
+ /* We call pi->set_params even if colon is NULL because we
+ want to give the implementation a chance to set up some
+ things it needs to run. */
+ ++colon;
+
+ if (pi->set_params)
+ pi->set_params (colon);
+ return;
+ }
+ abort ();
+}
+
+static int output_redirected;
+
+void
+progress_schedule_redirect (void)
+{
+ output_redirected = 1;
+}
+
+/* Create a progress gauge. INITIAL is the number of bytes the
+ download starts from (zero if the download starts from scratch).
+ TOTAL is the expected total number of bytes in this download. If
+ TOTAL is zero, it means that the download size is not known in
+ advance. */
+
+void *
+progress_create (const char *f_download, wgint initial, wgint total)
+{
+ /* Check if the log status has changed under our feet. */
+ if (output_redirected)
+ {
+ if (!current_impl_locked)
+ set_progress_implementation (FALLBACK_PROGRESS_IMPLEMENTATION);
+ output_redirected = 0;
+ }
+
+ return current_impl->create (f_download, initial, total);
+}
+
+/* Return true if the progress gauge is "interactive", i.e. if it can
+ profit from being called regularly even in absence of data. The
+ progress bar is interactive because it regularly updates the ETA
+ and current update. */
+
+bool
+progress_interactive_p (void *progress _GL_UNUSED)
+{
+ return current_impl->interactive;
+}
+
+/* Inform the progress gauge of newly received bytes. DLTIME is the
+ time since the beginning of the download. */
+
+void
+progress_update (void *progress, wgint howmuch, double dltime)
+{
+ // sanitize input
+ if (dltime >= INT_MAX)
+ dltime = INT_MAX - 1;
+ else if (dltime < 0)
+ dltime = 0;
+
+ if (howmuch < 0)
+ howmuch = 0;
+
+ current_impl->update (progress, howmuch, dltime);
+ current_impl->draw (progress);
+}
+
+/* Tell the progress gauge to clean up. Calling this will free the
+ PROGRESS object, the further use of which is not allowed. */
+
+void
+progress_finish (void *progress, double dltime)
+{
+ // sanitize input
+ if (dltime >= INT_MAX)
+ dltime = INT_MAX - 1;
+ else if (dltime < 0)
+ dltime = 0;
+
+ current_impl->finish (progress, dltime);
+}
+
+/* Dot-printing. */
+
+struct dot_progress {
+ wgint initial_length; /* how many bytes have been downloaded
+ previously. */
+ wgint total_length; /* expected total byte count when the
+ download finishes */
+
+ wgint accumulated; /* number of bytes accumulated after
+ the last printed dot */
+
+ double dltime; /* download time so far */
+ wgint rows; /* number of rows printed so far */
+ int dots; /* number of dots printed in this row */
+
+ double last_timer_value;
+};
+
+/* Dot-progress backend for progress_create. */
+
+static void *
+dot_create (const char *f_download _GL_UNUSED, wgint initial, wgint total)
+{
+ struct dot_progress *dp = xnew0 (struct dot_progress);
+ dp->initial_length = initial;
+ dp->total_length = total;
+
+ if (dp->initial_length)
+ {
+ int dot_bytes = opt.dot_bytes;
+ const wgint ROW_BYTES = opt.dot_bytes * opt.dots_in_line;
+
+ int remainder = dp->initial_length % ROW_BYTES;
+ wgint skipped = dp->initial_length - remainder;
+
+ if (skipped)
+ {
+ wgint skipped_k = skipped / 1024; /* skipped amount in K */
+ int skipped_k_len = numdigit (skipped_k);
+ if (skipped_k_len < 6)
+ skipped_k_len = 6;
+
+ /* Align the [ skipping ... ] line with the dots. To do
+ that, insert the number of spaces equal to the number of
+ digits in the skipped amount in K. */
+ logprintf (LOG_PROGRESS, _("\n%*s[ skipping %sK ]"),
+ 2 + skipped_k_len, "",
+ number_to_static_string (skipped_k));
+ }
+
+ logprintf (LOG_PROGRESS, "\n%6sK",
+ number_to_static_string (skipped / 1024));
+ for (; remainder >= dot_bytes; remainder -= dot_bytes)
+ {
+ if (dp->dots % opt.dot_spacing == 0)
+ logputs (LOG_PROGRESS, " ");
+ logputs (LOG_PROGRESS, ",");
+ ++dp->dots;
+ }
+ assert (dp->dots < opt.dots_in_line);
+
+ dp->accumulated = remainder;
+ dp->rows = skipped / ROW_BYTES;
+ }
+
+ return dp;
+}
+
+static const char *eta_to_human_short (int, bool);
+
+/* ADD_DOT_ROWS_THRS - minimal (1 << ADD_DOT_ROWS_THRS) ROWS to be added
+ to the current row if dp->accumulated too much.
+ Allows to reduce dot_draw io, times.
+ According to the way progress_update is currently has being called, this
+ should happens only when fuzzing, or (paranoia) if somehow buffer will
+ be too large.
+ Can be disabled by default if this is not fuzzing build. */
+#ifndef ADD_DOT_ROWS_THRS
+#if FUZZING
+#define ADD_DOT_ROWS_THRS 2
+#else
+#define ADD_DOT_ROWS_THRS 2
+#endif
+#endif /* ADD_DOT_ROWS_THRS */
+
+/* Prints the stats (percentage of completion, speed, ETA) for current
+ row. DLTIME is the time spent downloading the data in current
+ row.
+
+ #### This function is somewhat uglified by the fact that current
+ row and last row have somewhat different stats requirements. It
+ might be worthwhile to split it to two different functions. */
+
+static void
+#if ADD_DOT_ROWS_THRS
+print_row_stats (struct dot_progress *dp, double dltime, bool last, wgint added_rows)
+#else
+print_row_stats (struct dot_progress *dp, double dltime, bool last)
+#endif
+{
+ const wgint ROW_BYTES = opt.dot_bytes * opt.dots_in_line;
+
+ /* bytes_displayed is the number of bytes indicated to the user by
+ dots printed so far, includes the initially "skipped" amount */
+ wgint bytes_displayed = dp->rows * ROW_BYTES + dp->dots * opt.dot_bytes;
+
+ if (last)
+ /* For last row also count bytes accumulated after last dot */
+ bytes_displayed += dp->accumulated;
+
+ if (bytes_displayed < 0)
+ bytes_displayed = 0;
+
+ if (dp->total_length)
+ {
+ /* Round to floor value to provide gauge how much data *has*
+ been retrieved. 12.8% will round to 12% because the 13% mark
+ has not yet been reached. 100% is only shown when done. */
+ int percentage = 100.0 * bytes_displayed / dp->total_length;
+ logprintf (LOG_PROGRESS, "%3d%%", percentage);
+ }
+
+ {
+ static char names[] = {' ', 'K', 'M', 'G', 'T'};
+ int units;
+ double rate;
+ wgint bytes_this_row;
+ if (!last)
+#if ADD_DOT_ROWS_THRS
+ bytes_this_row = ROW_BYTES * added_rows;
+#else
+ bytes_this_row = ROW_BYTES;
+#endif
+ else
+ /* For last row also include bytes accumulated after last dot. */
+ bytes_this_row = dp->dots * opt.dot_bytes + dp->accumulated;
+ /* Don't count the portion of the row belonging to initial_length */
+ if (dp->rows == dp->initial_length / ROW_BYTES)
+ bytes_this_row -= dp->initial_length % ROW_BYTES;
+ rate = calc_rate (bytes_this_row, dltime - dp->last_timer_value, &units);
+ logprintf (LOG_PROGRESS, " %4.*f%c",
+ rate >= 99.95 ? 0 : rate >= 9.995 ? 1 : 2,
+ rate, names[units]);
+ dp->last_timer_value = dltime;
+ }
+
+ if (!last)
+ {
+ /* Display ETA based on average speed. Inspired by Vladi
+ Belperchinov-Shabanski's "wget-new-percentage" patch. */
+ if (dp->total_length)
+ {
+ wgint bytes_remaining = dp->total_length > bytes_displayed ? dp->total_length - bytes_displayed : 0;
+ /* The quantity downloaded in this download run. */
+ wgint bytes_sofar = bytes_displayed > dp->initial_length ? bytes_displayed - dp->initial_length : 1;
+ double eta = dltime * bytes_remaining / bytes_sofar;
+ if (eta < 0)
+ eta = 0;
+ if (eta < INT_MAX - 1)
+ logprintf (LOG_PROGRESS, " %s",
+ eta_to_human_short ((int) (eta + 0.5), true));
+ }
+ }
+ else
+ {
+ /* When done, print the total download time */
+ if (dltime >= 10)
+ logprintf (LOG_PROGRESS, "=%s",
+ eta_to_human_short ((int) (dltime + 0.5), true));
+ else
+ logprintf (LOG_PROGRESS, "=%ss", print_decimal (dltime));
+ }
+}
+
+/* Dot-progress backend for progress_update. */
+
+static void
+dot_update (void *progress, wgint howmuch, double dltime)
+{
+ // sanitize input
+ if (dltime >= INT_MAX)
+ dltime = INT_MAX - 1;
+ else if (dltime < 0)
+ dltime = 0;
+
+ if (howmuch < 0)
+ howmuch = 0;
+
+ struct dot_progress *dp = progress;
+ dp->accumulated += howmuch;
+ dp->dltime = dltime;
+}
+
+static void
+dot_draw (void *progress)
+{
+ struct dot_progress *dp = progress;
+ int dot_bytes = opt.dot_bytes;
+ wgint ROW_BYTES = opt.dot_bytes * opt.dots_in_line;
+
+ log_set_flush (false);
+
+ while (dp->accumulated >= dot_bytes)
+ {
+ dp->accumulated -= dot_bytes;
+ if (dp->dots == 0)
+ logprintf (LOG_PROGRESS, "\n%6sK",
+ number_to_static_string (dp->rows * ROW_BYTES / 1024));
+
+ if (dp->dots % opt.dot_spacing == 0)
+ logputs (LOG_PROGRESS, " ");
+ logputs (LOG_PROGRESS, ".");
+
+ ++dp->dots;
+ if (dp->dots >= opt.dots_in_line)
+ {
+ dp->dots = 0;
+#if ADD_DOT_ROWS_THRS
+ {
+ wgint added_rows = 1;
+ if (dp->accumulated >= (ROW_BYTES << ADD_DOT_ROWS_THRS))
+ {
+ added_rows += dp->accumulated / ROW_BYTES;
+ dp->accumulated %= ROW_BYTES;
+ }
+ if (WGINT_MAX - dp->rows >= added_rows)
+ dp->rows += added_rows;
+ else
+ dp->rows = WGINT_MAX;
+ print_row_stats (dp, dp->dltime, false, added_rows);
+ }
+#else
+ if (dp->rows < WGINT_MAX)
+ ++dp->rows;
+ print_row_stats (dp, dp->dltime, false);
+#endif /* ADD_DOT_ROWS_THRS */
+ }
+ }
+
+ log_set_flush (true);
+}
+
+/* Dot-progress backend for progress_finish. */
+
+static void
+dot_finish (void *progress, double dltime)
+{
+ struct dot_progress *dp = progress;
+ wgint ROW_BYTES = opt.dot_bytes * opt.dots_in_line;
+ int i;
+
+ log_set_flush (false);
+
+ if (dp->dots == 0)
+ logprintf (LOG_PROGRESS, "\n%6sK",
+ number_to_static_string (dp->rows * ROW_BYTES / 1024));
+ for (i = dp->dots; i < opt.dots_in_line; i++)
+ {
+ if (i % opt.dot_spacing == 0)
+ logputs (LOG_PROGRESS, " ");
+ logputs (LOG_PROGRESS, " ");
+ }
+
+ // sanitize input
+ if (dltime >= INT_MAX)
+ dltime = INT_MAX - 1;
+ else if (dltime < 0)
+ dltime = 0;
+#if ADD_DOT_ROWS_THRS
+ print_row_stats (dp, dltime, true, 1);
+#else
+ print_row_stats (dp, dltime, true);
+#endif
+ logputs (LOG_VERBOSE, "\n\n");
+ log_set_flush (false);
+
+ xfree (dp);
+}
+
+/* This function interprets the progress "parameters". For example,
+ if Wget is invoked with --progress=dot:mega, it will set the
+ "dot-style" to "mega". Valid styles are default, binary, mega, and
+ giga. */
+
+static void
+dot_set_params (const char *params)
+{
+ current_impl->interactive = false;
+ if (!params || !*params)
+ params = opt.dot_style;
+
+ if (!params)
+ return;
+
+ /* We use this to set the retrieval style. */
+ if (!c_strcasecmp (params, "default"))
+ {
+ /* Default style: 1K dots, 10 dots in a cluster, 50 dots in a
+ line. */
+ opt.dot_bytes = 1024;
+ opt.dot_spacing = 10;
+ opt.dots_in_line = 50;
+ }
+ else if (!c_strcasecmp (params, "binary"))
+ {
+ /* "Binary" retrieval: 8K dots, 16 dots in a cluster, 48 dots
+ (384K) in a line. */
+ opt.dot_bytes = 8192;
+ opt.dot_spacing = 16;
+ opt.dots_in_line = 48;
+ }
+ else if (!c_strcasecmp (params, "mega"))
+ {
+ /* "Mega" retrieval, for retrieving very long files; each dot is
+ 64K, 8 dots in a cluster, 6 clusters (3M) in a line. */
+ opt.dot_bytes = 65536L;
+ opt.dot_spacing = 8;
+ opt.dots_in_line = 48;
+ }
+ else if (!c_strcasecmp (params, "giga"))
+ {
+ /* "Giga" retrieval, for retrieving very very *very* long files;
+ each dot is 1M, 8 dots in a cluster, 4 clusters (32M) in a
+ line. */
+ opt.dot_bytes = (1L << 20);
+ opt.dot_spacing = 8;
+ opt.dots_in_line = 32;
+ }
+ else
+ fprintf (stderr,
+ _("Invalid dot style specification %s; leaving unchanged.\n"),
+ quote (params));
+}
+
+/* "Thermometer" (bar) progress. */
+
+/* Assumed screen width if we can't find the real value. */
+#define DEFAULT_SCREEN_WIDTH 80
+
+/* Minimum screen width we'll try to work with. If this is too small,
+ create_image will overflow the buffer.
+ width = width/4 + 1 + PROGRESS_PERCENT_LEN + PROGRESS_FILESIZE_LEN
+ + PROGRESS_DWNLOAD_RATE + PROGRESS_ETA_LEN => widh = 38*4/3 (+1) */
+#define MINIMUM_SCREEN_WIDTH 51
+
+/* The last known screen width. This can be updated by the code that
+ detects that SIGWINCH was received (but it's never updated from the
+ signal handler). */
+static int screen_width;
+
+/* A flag that, when set, means SIGWINCH was received. */
+static volatile sig_atomic_t received_sigwinch;
+
+/* Size of the download speed history ring. */
+#define DLSPEED_HISTORY_SIZE 20
+
+/* The minimum time length of a history sample. By default, each
+ sample is at least 150ms long, which means that, over the course of
+ 20 samples, "current" download speed spans at least 3s into the
+ past. */
+#define DLSPEED_SAMPLE_MIN 0.15
+
+/* The time after which the download starts to be considered
+ "stalled", i.e. the current bandwidth is not printed and the recent
+ download speeds are scratched. */
+#define STALL_START_TIME 5
+
+/* Time between screen refreshes will not be shorter than this, so
+ that Wget doesn't swamp the TTY with output. */
+#define REFRESH_INTERVAL 0.2
+
+/* Don't refresh the ETA too often to avoid jerkiness in predictions.
+ This allows ETA to change approximately once per second. */
+#define ETA_REFRESH_INTERVAL 0.99
+
+struct bar_progress {
+ char *f_download; /* Filename of the downloaded file */
+ wgint initial_length; /* how many bytes have been downloaded
+ previously. */
+ wgint total_length; /* expected total byte count when the
+ download finishes */
+ wgint count; /* bytes downloaded so far */
+
+ double last_screen_update; /* time of the last screen update,
+ measured since the beginning of
+ download. */
+
+ double dltime; /* download time so far */
+ int width; /* screen width we're using at the
+ time the progress gauge was
+ created. this is different from
+ the screen_width global variable in
+ that the latter can be changed by a
+ signal. */
+ char *buffer; /* buffer where the bar "image" is
+ stored. */
+ int tick; /* counter used for drawing the
+ progress bar where the total size
+ is not known. */
+
+ /* The following variables (kept in a struct for namespace reasons)
+ keep track of recent download speeds. See bar_update() for
+ details. */
+ struct bar_progress_hist {
+ int pos;
+ double times[DLSPEED_HISTORY_SIZE];
+ wgint bytes[DLSPEED_HISTORY_SIZE];
+
+ /* The sum of times and bytes respectively, maintained for
+ efficiency. */
+ double total_time;
+ wgint total_bytes;
+ } hist;
+
+ double recent_start; /* timestamp of beginning of current
+ position. */
+ wgint recent_bytes; /* bytes downloaded so far. */
+
+ bool stalled; /* set when no data arrives for longer
+ than STALL_START_TIME, then reset
+ when new data arrives. */
+
+ /* create_image() uses these to make sure that ETA information
+ doesn't flicker. */
+ double last_eta_time; /* time of the last update to download
+ speed and ETA, measured since the
+ beginning of download. */
+ int last_eta_value;
+};
+
+static void create_image (struct bar_progress *, double, bool);
+static void display_image (char *);
+
+#if USE_NLS_PROGRESS_BAR
+static size_t
+prepare_filename (char *dest, const char *src)
+{
+ size_t ret = 1;
+ if (src)
+ {
+ mbi_iterator_t iter;
+ mbchar_t mbc;
+ mbi_init (iter, src, strlen (src));
+ while (mbi_avail (iter))
+ {
+ size_t i;
+ mbc = mbi_cur(iter);
+ /* replace invalid || unprintable || zero-width mbc ws hexdgt code */
+ if (!mb_isprint (mbc) || !mb_width (mbc))
+ for (i=0; i < mb_len (mbc); i++)
+ {
+ if (dest)
+ dest += sprintf (dest, "%%%02x", (unsigned char) *(mb_ptr(mbc) + i));
+ ret += 3;
+ }
+ else
+ {
+ if (dest)
+ for (i=0; i < mb_len (mbc); i++)
+ *dest++ = *(mb_ptr (mbc) + i);
+ ret += mb_len (mbc);
+ }
+ mbi_advance (iter);
+ }
+ }
+ if (dest)
+ *dest = 0;
+ return ret;
+}
+#else
+#include <ctype.h>
+static size_t
+prepare_filename (char *dest, const char *src)
+{
+ size_t ret = 1;
+ if (src)
+ while (*src)
+ {
+ /* isprint with some lang return false for some chars */
+ if(!iscntrl (*src))
+ {
+ if (dest)
+ *dest++ = *src;
+ ret++;
+ }
+ else
+ {
+ if (dest)
+ dest += sprintf (dest, "%%%02x", (unsigned char) *src );
+ ret += 3;
+ }
+ src++;
+ }
+ if (dest)
+ *dest = 0;
+ return ret;
+}
+#endif /* USE_NLS_PROGRESS_BAR */
+
+static void *
+bar_create (const char *f_download, wgint initial, wgint total)
+{
+ struct bar_progress *bp = xnew0 (struct bar_progress);
+
+ /* In theory, our callers should take care of this pathological
+ case, but it can sometimes happen. */
+ if (initial > total)
+ total = initial;
+
+ bp->initial_length = initial;
+ bp->total_length = total;
+ /* Zero-width mbc must be replaced to avoid buffer overflow.
+ Another way is to allocate a buffer that allows contain
+ full f_download, but in this case some escape sequences may break "bar" */
+ bp->f_download = xmalloc (prepare_filename (NULL, f_download));
+ prepare_filename (bp->f_download, f_download);
+
+ /* Initialize screen_width if this hasn't been done or if it might
+ have changed, as indicated by receiving SIGWINCH. */
+ if (!screen_width || received_sigwinch)
+ {
+ screen_width = determine_screen_width ();
+ if (!screen_width)
+ screen_width = DEFAULT_SCREEN_WIDTH;
+ else if (screen_width < MINIMUM_SCREEN_WIDTH)
+ screen_width = MINIMUM_SCREEN_WIDTH;
+ received_sigwinch = 0;
+ }
+
+ /* - 1 because we don't want to use the last screen column. */
+ bp->width = screen_width - 1;
+ /* + enough space for the terminating zero, and hopefully enough room
+ * for multibyte characters. */
+#define BUF_LEN (bp->width * 2 + 100)
+ bp->buffer = xcalloc (BUF_LEN, 1);
+
+ logputs (LOG_VERBOSE, "\n");
+
+ create_image (bp, 0, false);
+ display_image (bp->buffer);
+
+ return bp;
+}
+
+static void update_speed_ring (struct bar_progress *, wgint, double);
+
+static void
+bar_update (void *progress, wgint howmuch, double dltime)
+{
+ struct bar_progress *bp = progress;
+
+ bp->dltime = dltime;
+ if (WGINT_MAX - (bp->count + bp->initial_length) >= howmuch)
+ bp->count += howmuch;
+ else
+ bp->count = WGINT_MAX - bp->initial_length;
+ if (bp->total_length > 0
+ && bp->count + bp->initial_length > bp->total_length)
+ /* We could be downloading more than total_length, e.g. when the
+ server sends an incorrect Content-Length header. In that case,
+ adjust bp->total_length to the new reality, so that the code in
+ create_image() that depends on total size being smaller or
+ equal to the expected size doesn't abort. */
+ bp->total_length = bp->initial_length + bp->count;
+
+ update_speed_ring (bp, howmuch, dltime);
+}
+
+static void
+bar_draw (void *progress)
+{
+ bool force_screen_update = false;
+ struct bar_progress *bp = progress;
+
+ /* If SIGWINCH (the window size change signal) been received,
+ determine the new screen size and update the screen. */
+ if (received_sigwinch)
+ {
+ int old_width = screen_width;
+ screen_width = determine_screen_width ();
+ if (!screen_width)
+ screen_width = DEFAULT_SCREEN_WIDTH;
+ else if (screen_width < MINIMUM_SCREEN_WIDTH)
+ screen_width = MINIMUM_SCREEN_WIDTH;
+ if (screen_width != old_width)
+ {
+ bp->width = screen_width - 1;
+ bp->buffer = xrealloc (bp->buffer, BUF_LEN);
+ force_screen_update = true;
+ }
+ received_sigwinch = 0;
+ }
+
+ if (bp->dltime - bp->last_screen_update < REFRESH_INTERVAL && !force_screen_update)
+ /* Don't update more often than five times per second. */
+ return;
+
+ create_image (bp, bp->dltime, false);
+ display_image (bp->buffer);
+ bp->last_screen_update = bp->dltime;
+}
+
+static void
+bar_finish (void *progress, double dltime)
+{
+ struct bar_progress *bp = progress;
+
+ if (bp->total_length > 0
+ && bp->count + bp->initial_length > bp->total_length)
+ /* See bar_update() for explanation. */
+ bp->total_length = bp->initial_length + bp->count;
+
+ create_image (bp, dltime, true);
+ display_image (bp->buffer);
+
+ logputs (LOG_VERBOSE, "\n");
+ logputs (LOG_PROGRESS, "\n");
+
+ xfree (bp->f_download);
+ xfree (bp->buffer);
+ xfree (bp);
+}
+
+/* This code attempts to maintain the notion of a "current" download
+ speed, over the course of no less than 3s. (Shorter intervals
+ produce very erratic results.)
+
+ To do so, it samples the speed in 150ms intervals and stores the
+ recorded samples in a FIFO history ring. The ring stores no more
+ than 20 intervals, hence the history covers the period of at least
+ three seconds and at most 20 reads into the past. This method
+ should produce reasonable results for downloads ranging from very
+ slow to very fast.
+
+ The idea is that for fast downloads, we get the speed over exactly
+ the last three seconds. For slow downloads (where a network read
+ takes more than 150ms to complete), we get the speed over a larger
+ time period, as large as it takes to complete twenty reads. This
+ is good because slow downloads tend to fluctuate more and a
+ 3-second average would be too erratic. */
+
+static void
+update_speed_ring (struct bar_progress *bp, wgint howmuch, double dltime)
+{
+ struct bar_progress_hist *hist = &bp->hist;
+ double recent_age = dltime - bp->recent_start;
+
+ /* Update the download count. */
+ bp->recent_bytes += howmuch;
+
+ /* For very small time intervals, we return after having updated the
+ "recent" download count. When its age reaches or exceeds minimum
+ sample time, it will be recorded in the history ring. */
+ if (recent_age < DLSPEED_SAMPLE_MIN)
+ return;
+
+ if (howmuch == 0)
+ {
+ /* If we're not downloading anything, we might be stalling,
+ i.e. not downloading anything for an extended period of time.
+ Since 0-reads do not enter the history ring, recent_age
+ effectively measures the time since last read. */
+ if (recent_age >= STALL_START_TIME)
+ {
+ /* If we're stalling, reset the ring contents because it's
+ stale and because it will make bar_update stop printing
+ the (bogus) current bandwidth. */
+ bp->stalled = true;
+ xzero (*hist);
+ bp->recent_bytes = 0;
+ }
+ return;
+ }
+
+ /* We now have a non-zero amount of to store to the speed ring. */
+
+ /* If the stall status was acquired, reset it. */
+ if (bp->stalled)
+ {
+ bp->stalled = false;
+ /* "recent_age" includes the entire stalled period, which
+ could be very long. Don't update the speed ring with that
+ value because the current bandwidth would start too small.
+ Start with an arbitrary (but more reasonable) time value and
+ let it level out. */
+ recent_age = 1;
+ }
+
+ /* Store "recent" bytes and download time to history ring at the
+ position POS. */
+
+ /* To correctly maintain the totals, first invalidate existing data
+ (least recent in time) at this position. */
+ hist->total_time -= hist->times[hist->pos];
+ hist->total_bytes -= hist->bytes[hist->pos];
+
+ /* Now store the new data and update the totals. */
+ hist->times[hist->pos] = recent_age;
+ hist->bytes[hist->pos] = bp->recent_bytes;
+ hist->total_time += recent_age;
+ hist->total_bytes += bp->recent_bytes;
+
+ /* Start a new "recent" period. */
+ bp->recent_start = dltime;
+ bp->recent_bytes = 0;
+
+ /* Advance the current ring position. */
+ if (++hist->pos == DLSPEED_HISTORY_SIZE)
+ hist->pos = 0;
+
+#if 0
+ /* Sledgehammer check to verify that the totals are accurate. */
+ {
+ int i;
+ double sumt = 0, sumb = 0;
+ for (i = 0; i < DLSPEED_HISTORY_SIZE; i++)
+ {
+ sumt += hist->times[i];
+ sumb += hist->bytes[i];
+ }
+ assert (sumb == hist->total_bytes);
+ /* We can't use assert(sumt==hist->total_time) because some
+ precision is lost by adding and subtracting floating-point
+ numbers. But during a download this precision should not be
+ detectable, i.e. no larger than 1ns. */
+ double diff = sumt - hist->total_time;
+ if (diff < 0) diff = -diff;
+ assert (diff < 1e-9);
+ }
+#endif
+}
+
+#if USE_NLS_PROGRESS_BAR
+static int
+count_cols (const char *mbs)
+{
+ mbchar_t mbc;
+ mbi_iterator_t iter;
+ int cols = 0;
+ mbi_init (iter, mbs, strlen(mbs));
+ while (mbi_avail (iter))
+ {
+ mbc = mbi_cur (iter);
+ cols += mb_width (mbc);
+ mbi_advance (iter);
+ }
+ return cols;
+}
+
+static int
+cols_to_bytes (const char *mbs, const int cols, int *ncols)
+{
+ int p_cols = 0, bytes = 0;
+ mbchar_t mbc;
+ mbi_iterator_t iter;
+ mbi_init (iter, mbs, strlen(mbs));
+ while (p_cols < cols && mbi_avail (iter))
+ {
+ mbc = mbi_cur (iter);
+ p_cols += mb_width (mbc);
+ /* The multibyte character has exceeded the total number of columns we
+ * have available. The remaining bytes will be padded with a space. */
+ if (p_cols > cols)
+ {
+ p_cols -= mb_width (mbc);
+ break;
+ }
+ bytes += mb_len (mbc);
+ mbi_advance (iter);
+ }
+ *ncols = p_cols;
+ return bytes;
+}
+#else
+static int count_cols (const char *mbs) { return (int) strlen(mbs); }
+
+static int
+cols_to_bytes (const char *mbs, const int cols, int *ncols)
+{
+ int len = strlen(mbs);
+ int ret = len < cols ? len : cols;
+ *ncols = ret;
+ return ret;
+}
+#endif
+
+static const char *
+get_eta (int *bcd)
+{
+ /* TRANSLATORS: "ETA" is English-centric, but this must
+ be short, ideally 3 chars. Abbreviate if necessary. */
+ static const char eta_str[] = N_(" eta %s");
+ static const char *eta_trans;
+ static int bytes_cols_diff;
+ if (eta_trans == NULL)
+ {
+ int nbytes;
+ int ncols;
+
+#if USE_NLS_PROGRESS_BAR
+ eta_trans = _(eta_str);
+#else
+ eta_trans = eta_str;
+#endif
+
+ /* Determine the number of bytes used in the translated string,
+ * versus the number of columns used. This is to figure out how
+ * many spaces to add at the end to pad to the full line width.
+ *
+ * We'll store the difference between the number of bytes and
+ * number of columns, so that removing this from the string length
+ * will reveal the total number of columns in the progress bar. */
+ nbytes = strlen (eta_trans);
+ ncols = count_cols (eta_trans);
+ bytes_cols_diff = nbytes - ncols;
+ }
+
+ if (bcd != NULL)
+ *bcd = bytes_cols_diff;
+
+ return eta_trans;
+}
+
+#define APPEND_LITERAL(s) do { \
+ memcpy (p, s, sizeof (s) - 1); \
+ p += sizeof (s) - 1; \
+} while (0)
+
+static void
+create_image (struct bar_progress *bp, double dl_total_time, bool done)
+{
+ const int MAX_FILENAME_COLS = bp->width / 4;
+ char *p = bp->buffer;
+ wgint size = bp->initial_length + bp->count;
+
+ struct bar_progress_hist *hist = &bp->hist;
+ int orig_filename_cols = count_cols (bp->f_download);
+
+ int padding;
+
+ /* The progress bar should look like this:
+ file xx% [=======> ] nnn.nnK 12.34KB/s eta 36m 51s
+
+ Calculate the geometry. The idea is to assign as much room as
+ possible to the progress bar. The other idea is to never let
+ things "jitter", i.e. pad elements that vary in size so that
+ their variance does not affect the placement of other elements.
+ It would be especially bad for the progress bar to be resized
+ randomly.
+
+ "file " - Downloaded filename - MAX_FILENAME_COLS chars + 1
+ "xx% " or "100%" - percentage - 4 chars
+ "[]" - progress bar decorations - 2 chars
+ " nnn.nnK" - downloaded bytes - 7 chars + 1
+ " 12.5KB/s" - download rate - 8 chars + 1
+ " eta 36m 51s" - ETA - 14 chars
+
+ "=====>..." - progress bar - the rest
+ */
+
+ /* TODO: Ask the Turkish Translators to fix their translation for the "done"
+ * mode of progress bar. Use one less character. Once that is done, redice
+ * PROGRESS_ETA_LEN by 1.
+ */
+#define PROGRESS_FILENAME_LEN MAX_FILENAME_COLS + 1
+#define PROGRESS_PERCENT_LEN 4
+#define PROGRESS_DECORAT_LEN 2
+#define PROGRESS_FILESIZE_LEN 7 + 1
+#define PROGRESS_DWNLOAD_RATE 8 + 2
+#define PROGRESS_ETA_LEN 15
+
+ int progress_size = bp->width - (PROGRESS_FILENAME_LEN + PROGRESS_PERCENT_LEN +
+ PROGRESS_DECORAT_LEN + PROGRESS_FILESIZE_LEN +
+ PROGRESS_DWNLOAD_RATE + PROGRESS_ETA_LEN);
+
+ /* The difference between the number of bytes used,
+ and the number of columns used. */
+ int bytes_cols_diff = 0;
+ int cols_diff;
+ const char *down_size;
+
+ if (progress_size < 5)
+ progress_size = 0;
+
+ // sanitize input
+ if (dl_total_time >= INT_MAX)
+ dl_total_time = INT_MAX - 1;
+ else if (dl_total_time < 0)
+ dl_total_time = 0;
+
+ if (orig_filename_cols < MAX_FILENAME_COLS)
+ {
+ p += sprintf (p, "%s", bp->f_download);
+ padding = MAX_FILENAME_COLS - orig_filename_cols + 1;
+ memset (p, ' ', padding);
+ p += padding;
+ }
+ else
+ {
+/*
+ memcpy(p, bp->f_download, MAX_FILENAME_COLS);
+ p += MAX_FILENAME_COLS;
+ *p++ = ' ';
+ }
+*/
+ int offset_cols;
+ int bytes_in_filename, offset_bytes, col;
+ int *cols_ret = &col;
+
+#define MIN_SCROLL_TEXT 5
+ if ((orig_filename_cols > MAX_FILENAME_COLS + MIN_SCROLL_TEXT) &&
+ !opt.noscroll &&
+ !done)
+ {
+ offset_cols = ((int) bp->tick + orig_filename_cols + MAX_FILENAME_COLS / 2)
+ % (orig_filename_cols + MAX_FILENAME_COLS);
+ if (offset_cols > orig_filename_cols)
+ {
+ padding = MAX_FILENAME_COLS - (offset_cols - orig_filename_cols);
+ memset(p, ' ', padding);
+ p += padding;
+ offset_cols = 0;
+ }
+ else
+ padding = 0;
+ }
+ else
+ {
+ padding = 0;
+ offset_cols = 0;
+ }
+ offset_bytes = cols_to_bytes (bp->f_download, offset_cols, cols_ret);
+ bytes_in_filename = cols_to_bytes (bp->f_download + offset_bytes,
+ MAX_FILENAME_COLS - padding,
+ cols_ret);
+ memcpy (p, bp->f_download + offset_bytes, bytes_in_filename);
+ p += bytes_in_filename;
+ padding = MAX_FILENAME_COLS - (padding + *cols_ret);
+ memset (p, ' ', padding + 1);
+ p += padding + 1;
+ }
+
+
+ /* "xx% " */
+ if (bp->total_length > 0)
+ {
+ int percentage = 100.0 * size / bp->total_length;
+ assert (percentage <= 100);
+ p += sprintf (p, "%3d%%", percentage);
+ }
+ else
+ {
+ memset (p, ' ', PROGRESS_PERCENT_LEN);
+ p += PROGRESS_PERCENT_LEN;
+ }
+
+ /* The progress bar: "[====> ]" or "[++==> ]". */
+ if (progress_size && bp->total_length > 0)
+ {
+ /* Size of the initial portion. */
+ int insz = (double)bp->initial_length / bp->total_length * progress_size;
+
+ /* Size of the downloaded portion. */
+ int dlsz = (double)size / bp->total_length * progress_size;
+
+ char *begin;
+
+ assert (dlsz <= progress_size);
+ assert (insz <= dlsz);
+
+ *p++ = '[';
+ begin = p;
+
+ /* Print the initial portion of the download with '+' chars, the
+ rest with '=' and one '>'. */
+ memset (p, '+', insz);
+ p += insz;
+
+ dlsz -= insz;
+ if (dlsz > 0)
+ {
+ memset (p, '=', dlsz-1);
+ p += dlsz - 1;
+ *p++ = '>';
+ }
+
+ memset (p, ' ', (progress_size - (p - begin)));
+ p += (progress_size - (p - begin));
+ *p++ = ']';
+ }
+ else if (progress_size)
+ {
+ /* If we can't draw a real progress bar, then at least show
+ *something* to the user. */
+ int ind = bp->tick % (progress_size * 2 - 6);
+ int i, pos;
+
+ /* Make the star move in two directions. */
+ if (ind < progress_size - 2)
+ pos = ind + 1;
+ else
+ pos = progress_size - (ind - progress_size + 5);
+
+ *p++ = '[';
+ for (i = 0; i < progress_size; i++)
+ {
+ if (i == pos - 1) *p++ = '<';
+ else if (i == pos ) *p++ = '=';
+ else if (i == pos + 1) *p++ = '>';
+ else
+ *p++ = ' ';
+ }
+ *p++ = ']';
+
+ }
+ ++bp->tick;
+
+ /* " 234.56M" */
+ down_size = human_readable (size, 1000, 2);
+ cols_diff = PROGRESS_FILESIZE_LEN - count_cols (down_size);
+ if (cols_diff > 0)
+ {
+ memset (p, ' ', cols_diff);
+ p += cols_diff;
+ }
+ p += sprintf (p, "%s", down_size);
+
+ /* " 12.52Kb/s or 12.52KB/s" */
+ if (hist->total_time > 0 && hist->total_bytes)
+ {
+ static const char *short_units[] = { " B/s", "KB/s", "MB/s", "GB/s", "TB/s" };
+ static const char *short_units_bits[] = { " b/s", "Kb/s", "Mb/s", "Gb/s", "Tb/s" };
+ int units = 0;
+ /* Calculate the download speed using the history ring and
+ recent data that hasn't made it to the ring yet. */
+ wgint dlquant = hist->total_bytes + bp->recent_bytes;
+ double dltime = hist->total_time + (dl_total_time - bp->recent_start);
+ double dlspeed = calc_rate (dlquant, dltime, &units);
+ p += sprintf (p, " %4.*f%s", dlspeed >= 99.95 ? 0 : dlspeed >= 9.995 ? 1 : 2,
+ dlspeed, !opt.report_bps ? short_units[units] : short_units_bits[units]);
+ }
+ else
+ APPEND_LITERAL (" --.-KB/s");
+
+ if (!done)
+ {
+ /* " eta ..m ..s"; wait for three seconds before displaying the ETA.
+ That's because the ETA value needs a while to become
+ reliable. */
+ if (bp->total_length > 0 && bp->count > 0 && dl_total_time > 3)
+ {
+ int eta;
+
+ /* Don't change the value of ETA more than approximately once
+ per second; doing so would cause flashing without providing
+ any value to the user. */
+ if (bp->total_length != size
+ && bp->last_eta_value != 0
+ && dl_total_time - bp->last_eta_time < ETA_REFRESH_INTERVAL)
+ eta = bp->last_eta_value;
+ else
+ {
+ /* Calculate ETA using the average download speed to predict
+ the future speed. If you want to use a speed averaged
+ over a more recent period, replace dl_total_time with
+ hist->total_time and bp->count with hist->total_bytes.
+ I found that doing that results in a very jerky and
+ ultimately unreliable ETA. */
+ wgint bytes_remaining = bp->total_length - size;
+ double eta_ = dl_total_time * bytes_remaining / bp->count;
+ if (eta_ >= INT_MAX - 1)
+ goto skip_eta;
+ eta = (int) (eta_ + 0.5);
+ bp->last_eta_value = eta;
+ bp->last_eta_time = dl_total_time;
+ }
+
+ p += sprintf (p, get_eta(&bytes_cols_diff),
+ eta_to_human_short (eta, false));
+ }
+ else if (bp->total_length > 0)
+ {
+ skip_eta:
+ memset (p, ' ', PROGRESS_ETA_LEN);
+ p += PROGRESS_ETA_LEN;
+ }
+ }
+ else
+ {
+ /* When the download is done, print the elapsed time. */
+ int nbytes;
+ int ncols;
+
+ /* TRANSLATORS: The meaning is "elapsed time", and it is shown
+ * next to the progress bar once the download is done.
+ * This should not take up more room than
+ * available here (6 columns). Abbreviate if necessary. */
+ strcpy (p, _(" in "));
+ nbytes = strlen (p);
+ ncols = count_cols (p);
+ bytes_cols_diff = nbytes - ncols;
+ if (dl_total_time >= 10)
+ ncols += sprintf (p + nbytes, "%s", eta_to_human_short ((int) (dl_total_time + 0.5), false));
+ else
+ ncols += sprintf (p + nbytes, "%ss", print_decimal (dl_total_time));
+ p += ncols + bytes_cols_diff;
+ if (ncols < PROGRESS_ETA_LEN)
+ {
+ memset (p, ' ', PROGRESS_ETA_LEN - ncols);
+ p += PROGRESS_ETA_LEN - ncols;
+ }
+ }
+
+ *p = '\0';
+
+ padding = bp->width - count_cols (bp->buffer);
+ assert (padding >= 0 && "Padding length became non-positive!");
+ if (padding > 0)
+ {
+// if (padding > BUF_LEN - (p - bp->buffer) - 1)
+// padding = BUF_LEN - (p - bp->buffer) - 1;
+ memset (p, ' ', padding);
+ p += padding;
+ *p = '\0';
+ }
+
+ /* 2014-11-14 Darshit Shah <darnir@gmail.com>
+ * Assert that the length of the progress bar is lesser than the size of the
+ * screen with which we are dealing. This assertion *MUST* always be removed
+ * from the release code since we do not want Wget to crash and burn when the
+ * assertion fails. Instead Wget should continue downloading and display a
+ * horrible and irritating progress bar that spams the screen with newlines.
+ *
+ * By default, all assertions are disabled in a Wget build and are enabled
+ * only with the --enable-assert configure option.
+ */
+ assert (count_cols (bp->buffer) == bp->width);
+}
+
+/* Print the contents of the buffer as a one-line ASCII "image" so
+ that it can be overwritten next time. */
+
+static void
+display_image (char *buf)
+{
+ bool old = log_set_save_context (false);
+ logputs (LOG_PROGRESS, "\r");
+ logputs (LOG_PROGRESS, buf);
+ log_set_save_context (old);
+}
+
+static void
+bar_set_params (const char *params)
+{
+/* if run_with_timeout() will be used for read, needs to disable interactive bar,
+ or on every timeout(1s) we will have 'retry' with error "decryption failed" */
+#if (defined(HAVE_LIBSSL) || defined(HAVE_LIBSSL32)) && defined(OPENSSL_RUN_WITHTIMEOUT)
+ current_impl->interactive = false;
+#else
+ current_impl->interactive = true;
+#endif
+ if (params)
+ {
+ for (const char *param = params; *param; )
+ {
+ if (!strncmp (param, "force", 5))
+ current_impl_locked = 1;
+ else if (!strncmp (param, "noscroll", 8))
+ opt.noscroll = true;
+
+ if (*(param = strchrnul(param, ':')))
+ param++;
+ }
+ }
+
+ if (((opt.lfilename && opt.show_progress != 1)
+#ifdef HAVE_ISATTY
+ /* The progress bar doesn't make sense if the output is not a
+ TTY -- when logging to file, it is better to review the
+ dots. */
+ || !isatty (fileno (stderr))
+#endif
+ )
+ && !current_impl_locked)
+ {
+ /* We're not printing to a TTY, so revert to the fallback
+ display. #### We're recursively calling
+ set_progress_implementation here, which is slightly kludgy.
+ It would be nicer if we provided that function a return value
+ indicating a failure of some sort. */
+ set_progress_implementation (FALLBACK_PROGRESS_IMPLEMENTATION);
+ return;
+ }
+}
+
+#ifdef SIGWINCH
+void
+progress_handle_sigwinch (int sig _GL_UNUSED)
+{
+ received_sigwinch = 1;
+ signal (SIGWINCH, progress_handle_sigwinch);
+}
+#endif
+
+/* Provide a short human-readable rendition of the ETA. This is like
+ secs_to_human_time in main.c, except the output doesn't include
+ fractions (which would look silly in by nature imprecise ETA) and
+ takes less room. If the time is measured in hours, hours and
+ minutes (but not seconds) are shown; if measured in days, then days
+ and hours are shown. This ensures brevity while still displaying
+ as much as possible.
+
+ If CONDENSED is true, the separator between minutes and seconds
+ (and hours and minutes, etc.) is not included, shortening the
+ display by one additional character. This is used for dot
+ progress.
+
+ The display never occupies more than 7 characters of screen
+ space. */
+
+static const char *
+eta_to_human_short (int secs, bool condensed)
+{
+ static char buf[16]; /* enough space to be on the safe side */
+ static int last = -1;
+ const char *space = condensed ? "" : " ";
+
+ /* Trivial optimization. create_image can call us every 200 msecs
+ (see bar_update) for fast downloads, but ETA will only change
+ once per 900 msecs. */
+ if (secs == last)
+ return buf;
+ last = secs;
+
+ if (secs < 100)
+ sprintf (buf, "%ds", secs);
+ else if (secs < 100 * 60)
+ sprintf (buf, "%dm%s%ds", secs / 60, space, secs % 60);
+ else if (secs < 48 * 3600)
+ sprintf (buf, "%dh%s%dm", secs / 3600, space, (secs / 60) % 60);
+ else if (secs < 100 * 86400)
+ sprintf (buf, "%dd%s%dh", secs / 86400, space, (secs / 3600) % 24);
+ else
+ /* even (2^31-1)/86400 doesn't overflow BUF. */
+ sprintf (buf, "%dd", secs / 86400);
+
+ return buf;
+}
diff --git a/src/progress.h b/src/progress.h
new file mode 100644
index 0000000..c05e9f3
--- /dev/null
+++ b/src/progress.h
@@ -0,0 +1,45 @@
+/* Download progress.
+ Copyright (C) 2001-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef PROGRESS_H
+#define PROGRESS_H
+
+bool valid_progress_implementation_p (const char *);
+void set_progress_implementation (const char *);
+void progress_schedule_redirect (void);
+
+void *progress_create (const char *, wgint, wgint);
+bool progress_interactive_p (void *);
+void progress_update (void *, wgint, double);
+void progress_finish (void *, double);
+
+void progress_handle_sigwinch (int);
+
+#endif /* PROGRESS_H */
diff --git a/src/ptimer.c b/src/ptimer.c
new file mode 100644
index 0000000..2e5efbc
--- /dev/null
+++ b/src/ptimer.c
@@ -0,0 +1,413 @@
+/* Portable timers.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* This file implements "portable timers" (ptimers), objects that
+ measure elapsed time using the primitives most appropriate for the
+ underlying operating system. The entry points are:
+
+ ptimer_new -- creates a timer.
+ ptimer_reset -- resets the timer's elapsed time to zero.
+ ptimer_measure -- measure and return the time elapsed since
+ creation or last reset.
+ ptimer_read -- reads the last measured elapsed value.
+ ptimer_destroy -- destroy the timer.
+ ptimer_granularity -- returns the approximate granularity of the timers.
+
+ Timers measure time in seconds, returning the timings as floating
+ point numbers, so they can carry as much precision as the
+ underlying system timer supports. For example, to measure the time
+ it takes to run a loop, you can use something like:
+
+ ptimer *tmr = ptimer_new ();
+ while (...)
+ ... loop ...
+ double secs = ptimer_measure ();
+ printf ("The loop took %.2fs\n", secs); */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/time.h>
+
+/* Cygwin currently (as of 2005-04-08, Cygwin 1.5.14) lacks clock_getres,
+ but still defines _POSIX_TIMERS! Because of that we simply use the
+ Windows timers under Cygwin. */
+#ifdef __CYGWIN__
+# include <windows.h>
+#endif
+
+#include "utils.h"
+#include "ptimer.h"
+
+/* Depending on the OS, one and only one of PTIMER_POSIX,
+ PTIMER_GETTIMEOFDAY, or PTIMER_WINDOWS will be defined. */
+
+#undef PTIMER_POSIX
+#undef PTIMER_GETTIMEOFDAY
+#undef PTIMER_WINDOWS
+
+#if defined(WINDOWS) || defined(__CYGWIN__)
+# define PTIMER_WINDOWS /* use Windows timers */
+#elif _POSIX_TIMERS - 0 > 0
+# define PTIMER_POSIX /* use POSIX timers (clock_gettime) */
+#else
+# define PTIMER_GETTIMEOFDAY /* use gettimeofday */
+#endif
+
+#ifdef PTIMER_POSIX
+/* Elapsed time measurement using POSIX timers: system time is held in
+ struct timespec, time is retrieved using clock_gettime, and
+ resolution using clock_getres.
+
+ This method is used on Unix systems that implement POSIX
+ timers. */
+
+typedef struct timespec ptimer_system_time;
+
+#define IMPL_init posix_init
+#define IMPL_measure posix_measure
+#define IMPL_diff posix_diff
+#define IMPL_resolution posix_resolution
+
+/* clock_id to use for POSIX clocks. This tries to use
+ CLOCK_MONOTONIC where available, CLOCK_REALTIME otherwise. */
+static int posix_clock_id;
+
+/* Resolution of the clock, initialized in posix_init. */
+static double posix_clock_resolution;
+
+/* Decide which clock_id to use. */
+
+static void
+posix_init (void)
+{
+ /* List of clocks we want to support: some systems support monotonic
+ clocks, Solaris has "high resolution" clock (sometimes
+ unavailable except to superuser), and all should support the
+ real-time clock. */
+#define NO_SYSCONF_CHECK -1
+ static const struct {
+ int id;
+ int sysconf_name;
+ } clocks[] = {
+#if defined(_POSIX_MONOTONIC_CLOCK) && _POSIX_MONOTONIC_CLOCK - 0 >= 0
+ { CLOCK_MONOTONIC, _SC_MONOTONIC_CLOCK },
+#endif
+#ifdef CLOCK_HIGHRES
+ { CLOCK_HIGHRES, NO_SYSCONF_CHECK },
+#endif
+ { CLOCK_REALTIME, NO_SYSCONF_CHECK },
+ };
+ size_t i;
+
+ /* Determine the clock we can use. For a clock to be usable, it
+ must be confirmed with sysconf (where applicable) and with
+ clock_getres. If no clock is found, CLOCK_REALTIME is used. */
+
+ for (i = 0; i < countof (clocks); i++)
+ {
+ struct timespec r;
+ if (clocks[i].sysconf_name != NO_SYSCONF_CHECK)
+ if (sysconf (clocks[i].sysconf_name) < 0)
+ continue; /* sysconf claims this clock is unavailable */
+ if (clock_getres (clocks[i].id, &r) < 0)
+ continue; /* clock_getres doesn't work for this clock */
+ posix_clock_id = clocks[i].id;
+ posix_clock_resolution = (double) r.tv_sec + r.tv_nsec / 1e9;
+ /* Guard against nonsense returned by a broken clock_getres. */
+ if (posix_clock_resolution == 0)
+ posix_clock_resolution = 1e-3;
+ break;
+ }
+ if (i == countof (clocks))
+ {
+ /* If no clock was found, it means that clock_getres failed for
+ the realtime clock. */
+ logprintf (LOG_NOTQUIET, _("Cannot get REALTIME clock frequency: %s\n"),
+ strerror (errno));
+ /* Use CLOCK_REALTIME, but invent a plausible resolution. */
+ posix_clock_id = CLOCK_REALTIME;
+ posix_clock_resolution = 1e-3;
+ }
+}
+
+static inline void
+posix_measure (ptimer_system_time *pst)
+{
+ clock_gettime (posix_clock_id, pst);
+}
+
+static inline double
+posix_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
+{
+ return ((pst1->tv_sec - pst2->tv_sec)
+ + (pst1->tv_nsec - pst2->tv_nsec) / 1e9);
+}
+
+static inline double
+posix_resolution (void)
+{
+ return posix_clock_resolution;
+}
+#endif /* PTIMER_POSIX */
+
+#ifdef PTIMER_GETTIMEOFDAY
+/* Elapsed time measurement using gettimeofday: system time is held in
+ struct timeval, retrieved using gettimeofday, and resolution is
+ unknown.
+
+ This method is used Unix systems without POSIX timers. */
+
+typedef struct timeval ptimer_system_time;
+
+#define IMPL_measure gettimeofday_measure
+#define IMPL_diff gettimeofday_diff
+#define IMPL_resolution gettimeofday_resolution
+
+static inline void
+gettimeofday_measure (ptimer_system_time *pst)
+{
+ gettimeofday (pst, NULL);
+}
+
+static inline double
+gettimeofday_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
+{
+ return ((pst1->tv_sec - pst2->tv_sec)
+ + (pst1->tv_usec - pst2->tv_usec) / 1e6);
+}
+
+static inline double
+gettimeofday_resolution (void)
+{
+ /* Granularity of gettimeofday varies wildly between architectures.
+ However, it appears that on modern machines it tends to be better
+ than 1ms. Assume 100 usecs. */
+ return 0.1;
+}
+#endif /* PTIMER_GETTIMEOFDAY */
+
+#ifdef PTIMER_WINDOWS
+/* Elapsed time measurement on Windows: where high-resolution timers
+ are available, time is stored in a LARGE_INTEGER and retrieved
+ using QueryPerformanceCounter. Otherwise, it is stored in a DWORD
+ and retrieved using GetTickCount.
+
+ This method is used on Windows. */
+
+typedef union {
+ DWORD lores; /* In case GetTickCount is used */
+ LARGE_INTEGER hires; /* In case high-resolution timer is used */
+} ptimer_system_time;
+
+#define IMPL_init windows_init
+#define IMPL_measure windows_measure
+#define IMPL_diff windows_diff
+#define IMPL_resolution windows_resolution
+
+/* Whether high-resolution timers are used. Set by ptimer_initialize_once
+ the first time ptimer_new is called. */
+static bool windows_hires_timers;
+
+/* Frequency of high-resolution timers -- number of updates per
+ second. Calculated the first time ptimer_new is called provided
+ that high-resolution timers are available. */
+static double windows_hires_freq;
+
+static void
+windows_init (void)
+{
+ LARGE_INTEGER freq;
+ freq.QuadPart = 0;
+ QueryPerformanceFrequency (&freq);
+ if (freq.QuadPart != 0)
+ {
+ windows_hires_timers = true;
+ windows_hires_freq = (double) freq.QuadPart;
+ }
+}
+
+static inline void
+windows_measure (ptimer_system_time *pst)
+{
+ if (windows_hires_timers)
+ QueryPerformanceCounter (&pst->hires);
+ else
+ /* Where hires counters are not available, use GetTickCount rather
+ GetSystemTime, because it is unaffected by clock skew and
+ simpler to use. Note that overflows don't affect us because we
+ never use absolute values of the ticker, only the
+ differences. */
+ pst->lores = GetTickCount ();
+}
+
+static inline double
+windows_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
+{
+ if (windows_hires_timers)
+ return (pst1->hires.QuadPart - pst2->hires.QuadPart) / windows_hires_freq;
+ else
+ return pst1->lores - pst2->lores;
+}
+
+static double
+windows_resolution (void)
+{
+ if (windows_hires_timers)
+ return 1.0 / windows_hires_freq;
+ else
+ return 10; /* according to MSDN */
+}
+#endif /* PTIMER_WINDOWS */
+
+/* The code below this point is independent of timer implementation. */
+
+struct ptimer {
+ /* The starting point in time which, subtracted from the current
+ time, yields elapsed time. */
+ ptimer_system_time start;
+
+ /* The most recent elapsed time, calculated by ptimer_measure(). */
+ double elapsed_last;
+
+ /* Approximately, the time elapsed between the true start of the
+ measurement and the time represented by START. This is used for
+ adjustment when clock skew is detected. */
+ double elapsed_pre_start;
+};
+
+/* Allocate a new timer and reset it. Return the new timer. */
+
+struct ptimer *
+ptimer_new (void)
+{
+ struct ptimer *pt = xnew0 (struct ptimer);
+#ifdef IMPL_init
+ static bool init_done;
+ if (!init_done)
+ {
+ init_done = true;
+ IMPL_init ();
+ }
+#endif
+ ptimer_reset (pt);
+ return pt;
+}
+
+/* Free the resources associated with the timer. Its further use is
+ prohibited. */
+
+void
+ptimer_destroy (struct ptimer *pt)
+{
+ xfree (pt);
+}
+
+/* Reset timer PT. This establishes the starting point from which
+ ptimer_measure() will return the elapsed time in seconds. It is
+ allowed to reset a previously used timer. */
+
+void
+ptimer_reset (struct ptimer *pt)
+{
+ /* Set the start time to the current time. */
+ IMPL_measure (&pt->start);
+ pt->elapsed_last = 0;
+ pt->elapsed_pre_start = 0;
+}
+
+/* Measure the elapsed time since timer creation/reset. This causes
+ the timer to internally call clock_gettime (or gettimeofday, etc.)
+ to update its idea of current time. The time is returned, but is
+ also stored for later access through ptimer_read().
+
+ This function handles clock skew, i.e. time that moves backwards is
+ ignored. */
+
+double
+ptimer_measure (struct ptimer *pt)
+{
+ ptimer_system_time now;
+ double elapsed;
+
+ IMPL_measure (&now);
+ elapsed = pt->elapsed_pre_start + IMPL_diff (&now, &pt->start);
+
+ /* Ideally we'd just return the difference between NOW and
+ pt->start. However, the system timer can be set back, and we
+ could return a value smaller than when we were last called, even
+ a negative value. Both of these would confuse the callers, which
+ expect us to return monotonically nondecreasing values.
+
+ Therefore: if ELAPSED is smaller than its previous known value,
+ we reset pt->start to the current time and effectively start
+ measuring from this point. But since we don't want the elapsed
+ value to start from zero, we set elapsed_pre_start to the last
+ elapsed time and increment all future calculations by that
+ amount.
+
+ This cannot happen with Windows and POSIX monotonic/highres
+ timers, but the check is not expensive. */
+
+ if (elapsed < pt->elapsed_last)
+ {
+ pt->start = now;
+ pt->elapsed_pre_start = pt->elapsed_last;
+ elapsed = pt->elapsed_last;
+ }
+
+ pt->elapsed_last = elapsed;
+ return elapsed;
+}
+
+/* Return the most recent elapsed time measured with ptimer_measure.
+ If ptimer_measure has not yet been called since the timer was
+ created or reset, this returns 0. */
+
+double
+ptimer_read (const struct ptimer *pt)
+{
+ return pt->elapsed_last;
+}
+
+/* Return the assessed resolution of the timer implementation, in
+ seconds. This is used by code that tries to substitute a better
+ value for timers that have returned zero. */
+
+double
+ptimer_resolution (void)
+{
+ return IMPL_resolution ();
+}
diff --git a/src/ptimer.h b/src/ptimer.h
new file mode 100644
index 0000000..14b2973
--- /dev/null
+++ b/src/ptimer.h
@@ -0,0 +1,46 @@
+/* Declarations for ptimer.c.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef PTIMER_H
+#define PTIMER_H
+
+struct ptimer; /* forward declaration; all struct
+ members are private */
+
+struct ptimer *ptimer_new (void);
+void ptimer_destroy (struct ptimer *);
+
+void ptimer_reset (struct ptimer *);
+double ptimer_measure (struct ptimer *);
+double ptimer_read (const struct ptimer *);
+
+double ptimer_resolution (void);
+
+#endif /* PTIMER_H */
diff --git a/src/recur.c b/src/recur.c
new file mode 100644
index 0000000..8b408b6
--- /dev/null
+++ b/src/recur.c
@@ -0,0 +1,919 @@
+/* Handling of recursive HTTP retrieving.
+ Copyright (C) 1996-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "url.h"
+#include "recur.h"
+#include "utils.h"
+#include "retr.h"
+#include "ftp.h"
+#include "host.h"
+#include "hash.h"
+#include "res.h"
+#include "convert.h"
+#include "html-url.h"
+#include "css-url.h"
+#include "spider.h"
+#include "exits.h"
+
+/* Functions for maintaining the URL queue. */
+
+struct queue_element {
+ const char *url; /* the URL to download */
+ const char *referer; /* the referring document */
+ int depth; /* the depth */
+ bool html_allowed; /* whether the document is allowed to
+ be treated as HTML. */
+ struct iri *iri; /* sXXXav */
+ bool css_allowed; /* whether the document is allowed to
+ be treated as CSS. */
+ struct queue_element *next; /* next element in queue */
+};
+
+struct url_queue {
+ struct queue_element *head;
+ struct queue_element *tail;
+ int count, maxcount;
+};
+
+/* Create a URL queue. */
+
+static struct url_queue *
+url_queue_new (void)
+{
+ struct url_queue *queue = xnew0 (struct url_queue);
+ return queue;
+}
+
+/* Delete a URL queue. */
+
+static void
+url_queue_delete (struct url_queue *queue)
+{
+ xfree (queue);
+}
+
+/* Enqueue a URL in the queue. The queue is FIFO: the items will be
+ retrieved ("dequeued") from the queue in the order they were placed
+ into it. */
+
+static void
+url_enqueue (struct url_queue *queue, struct iri *i,
+ const char *url, const char *referer, int depth,
+ bool html_allowed, bool css_allowed)
+{
+ struct queue_element *qel = xnew (struct queue_element);
+ qel->iri = i;
+ qel->url = url;
+ qel->referer = referer;
+ qel->depth = depth;
+ qel->html_allowed = html_allowed;
+ qel->css_allowed = css_allowed;
+ qel->next = NULL;
+
+ ++queue->count;
+ if (queue->count > queue->maxcount)
+ queue->maxcount = queue->count;
+
+ DEBUGP (("Enqueuing %s at depth %d\n",
+ quotearg_n_style (0, escape_quoting_style, url), depth));
+ DEBUGP (("Queue count %d, maxcount %d.\n", queue->count, queue->maxcount));
+
+ if (i)
+ DEBUGP (("[IRI Enqueuing %s with %s\n", quote_n (0, url),
+ i->uri_encoding ? quote_n (1, i->uri_encoding) : "None"));
+
+ if (queue->tail)
+ queue->tail->next = qel;
+ queue->tail = qel;
+
+ if (!queue->head)
+ queue->head = queue->tail;
+}
+
+/* Take a URL out of the queue. Return true if this operation
+ succeeded, or false if the queue is empty. */
+
+static bool
+url_dequeue (struct url_queue *queue, struct iri **i,
+ const char **url, const char **referer, int *depth,
+ bool *html_allowed, bool *css_allowed)
+{
+ struct queue_element *qel = queue->head;
+
+ if (!qel)
+ return false;
+
+ queue->head = queue->head->next;
+ if (!queue->head)
+ queue->tail = NULL;
+
+ *i = qel->iri;
+ *url = qel->url;
+ *referer = qel->referer;
+ *depth = qel->depth;
+ *html_allowed = qel->html_allowed;
+ *css_allowed = qel->css_allowed;
+
+ --queue->count;
+
+ DEBUGP (("Dequeuing %s at depth %d\n",
+ quotearg_n_style (0, escape_quoting_style, qel->url), qel->depth));
+ DEBUGP (("Queue count %d, maxcount %d.\n", queue->count, queue->maxcount));
+
+ xfree (qel);
+ return true;
+}
+
+static void blacklist_add (struct hash_table *blacklist, const char *url)
+{
+ char *url_unescaped = xstrdup (url);
+
+ url_unescape (url_unescaped);
+ string_set_add (blacklist, url_unescaped);
+ xfree (url_unescaped);
+}
+
+static int blacklist_contains (struct hash_table *blacklist, const char *url)
+{
+ char *url_unescaped = xstrdup(url);
+ int ret;
+
+ url_unescape (url_unescaped);
+ ret = string_set_contains (blacklist, url_unescaped);
+ xfree (url_unescaped);
+
+ return ret;
+}
+
+typedef enum
+{
+ WG_RR_SUCCESS, WG_RR_BLACKLIST, WG_RR_NOTHTTPS, WG_RR_NONHTTP, WG_RR_ABSOLUTE,
+ WG_RR_DOMAIN, WG_RR_PARENT, WG_RR_LIST, WG_RR_REGEX, WG_RR_RULES,
+ WG_RR_SPANNEDHOST, WG_RR_ROBOTS
+} reject_reason;
+
+static reject_reason download_child (const struct urlpos *, struct url *, int,
+ struct url *, struct hash_table *, struct iri *);
+static reject_reason descend_redirect (const char *, struct url *, int,
+ struct url *, struct hash_table *, struct iri *);
+static void write_reject_log_header (FILE *);
+static void write_reject_log_reason (FILE *, reject_reason,
+ const struct url *, const struct url *);
+
+/* Retrieve a part of the web beginning with START_URL. This used to
+ be called "recursive retrieval", because the old function was
+ recursive and implemented depth-first search. retrieve_tree on the
+ other hand implements breadth-search traversal of the tree, which
+ results in much nicer ordering of downloads.
+
+ The algorithm this function uses is simple:
+
+ 1. put START_URL in the queue.
+ 2. while there are URLs in the queue:
+
+ 3. get next URL from the queue.
+ 4. download it.
+ 5. if the URL is HTML and its depth does not exceed maximum depth,
+ get the list of URLs embedded therein.
+ 6. for each of those URLs do the following:
+
+ 7. if the URL is not one of those downloaded before, and if it
+ satisfies the criteria specified by the various command-line
+ options, add it to the queue. */
+
+uerr_t
+retrieve_tree (struct url *start_url_parsed, struct iri *pi)
+{
+ uerr_t status = RETROK;
+
+ /* The queue of URLs we need to load. */
+ struct url_queue *queue;
+
+ /* The URLs we do not wish to enqueue, because they are already in
+ the queue, but haven't been downloaded yet. */
+ struct hash_table *blacklist;
+
+ struct iri *i = iri_new ();
+
+ FILE *rejectedlog = NULL; /* Don't write a rejected log. */
+
+ /* Duplicate pi struct if not NULL */
+ if (pi)
+ {
+#define COPYSTR(x) (x) ? xstrdup(x) : NULL;
+ i->uri_encoding = COPYSTR (pi->uri_encoding);
+ i->content_encoding = COPYSTR (pi->content_encoding);
+ i->utf8_encode = pi->utf8_encode;
+#undef COPYSTR
+ }
+#ifdef ENABLE_IRI
+ else
+ set_uri_encoding (i, opt.locale, true);
+#endif
+
+ queue = url_queue_new ();
+ blacklist = make_string_hash_table (0);
+
+ /* Enqueue the starting URL. Use start_url_parsed->url rather than
+ just URL so we enqueue the canonical form of the URL. */
+ url_enqueue (queue, i, xstrdup (start_url_parsed->url), NULL, 0, true,
+ false);
+ blacklist_add (blacklist, start_url_parsed->url);
+
+ if (opt.rejected_log)
+ {
+ rejectedlog = fopen (opt.rejected_log, "w");
+ write_reject_log_header (rejectedlog);
+ if (!rejectedlog)
+ logprintf (LOG_NOTQUIET, "%s: %s\n", opt.rejected_log, strerror (errno));
+ }
+
+ while (1)
+ {
+ bool descend = false;
+ char *url, *referer, *file = NULL;
+ int depth;
+ bool html_allowed, css_allowed;
+ bool is_css = false;
+ bool dash_p_leaf_HTML = false;
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ break;
+ if (status == FWRITEERR)
+ break;
+
+ /* Get the next URL from the queue... */
+
+ if (!url_dequeue (queue, (struct iri **) &i,
+ (const char **)&url, (const char **)&referer,
+ &depth, &html_allowed, &css_allowed))
+ break;
+
+ /* ...and download it. Note that this download is in most cases
+ unconditional, as download_child already makes sure a file
+ doesn't get enqueued twice -- and yet this check is here, and
+ not in download_child. This is so that if you run `wget -r
+ URL1 URL2', and a random URL is encountered once under URL1
+ and again under URL2, but at a different (possibly smaller)
+ depth, we want the URL's children to be taken into account
+ the second time. */
+ if (dl_url_file_map && hash_table_contains (dl_url_file_map, url))
+ {
+ bool is_css_bool;
+
+ file = xstrdup (hash_table_get (dl_url_file_map, url));
+
+ DEBUGP (("Already downloaded \"%s\", reusing it from \"%s\".\n",
+ url, file));
+
+ if ((is_css_bool = (css_allowed
+ && downloaded_css_set
+ && string_set_contains (downloaded_css_set, file)))
+ || (html_allowed
+ && downloaded_html_set
+ && string_set_contains (downloaded_html_set, file)))
+ {
+ descend = true;
+ is_css = is_css_bool;
+ }
+ }
+ else
+ {
+ int dt = 0, url_err;
+ char *redirected = NULL;
+ struct url *url_parsed = url_parse (url, &url_err, i, true);
+
+ if (!url_parsed)
+ {
+ char *error = url_error (url, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n",url, error);
+ xfree (error);
+ inform_exit_status (URLERROR);
+ }
+ else
+ {
+
+ status = retrieve_url (url_parsed, url, &file, &redirected, referer,
+ &dt, false, i, true);
+
+ if (html_allowed && file && status == RETROK
+ && (dt & RETROKF) && (dt & TEXTHTML))
+ {
+ descend = true;
+ is_css = false;
+ }
+
+ /* a little different, css_allowed can override content type
+ lots of web servers serve css with an incorrect content type
+ */
+ if (file && status == RETROK
+ && (dt & RETROKF) &&
+ ((dt & TEXTCSS) || css_allowed))
+ {
+ descend = true;
+ is_css = true;
+ }
+
+ if (redirected)
+ {
+ /* We have been redirected, possibly to another host, or
+ different path, or wherever. Check whether we really
+ want to follow it. */
+ if (descend)
+ {
+ reject_reason r = descend_redirect (redirected, url_parsed,
+ depth, start_url_parsed, blacklist, i);
+ if (r == WG_RR_SUCCESS)
+ {
+ /* Make sure that the old pre-redirect form gets
+ blacklisted. */
+ blacklist_add (blacklist, url);
+ }
+ else
+ {
+ write_reject_log_reason (rejectedlog, r, url_parsed, start_url_parsed);
+ descend = false;
+ }
+ }
+
+ xfree (url);
+ url = redirected;
+ }
+ else
+ {
+ xfree (url);
+ url = xstrdup (url_parsed->url);
+ }
+ url_free (url_parsed);
+ }
+ }
+
+ if (opt.spider)
+ {
+ visited_url (url, referer);
+ }
+
+ if (descend
+ && depth >= opt.reclevel && opt.reclevel != INFINITE_RECURSION)
+ {
+ if (opt.page_requisites
+ && (depth == opt.reclevel || depth == opt.reclevel + 1))
+ {
+ /* When -p is specified, we are allowed to exceed the
+ maximum depth, but only for the "inline" links,
+ i.e. those that are needed to display the page.
+ Originally this could exceed the depth at most by
+ one, but we allow one more level so that the leaf
+ pages that contain frames can be loaded
+ correctly. */
+ dash_p_leaf_HTML = true;
+ }
+ else
+ {
+ /* Either -p wasn't specified or it was and we've
+ already spent the two extra (pseudo-)levels that it
+ affords us, so we need to bail out. */
+ DEBUGP (("Not descending further; at depth %d, max. %d.\n",
+ depth, opt.reclevel));
+ descend = false;
+ }
+ }
+
+ /* If the downloaded document was HTML or CSS, parse it and enqueue the
+ links it contains. */
+
+ if (descend)
+ {
+ bool meta_disallow_follow = false;
+ struct urlpos *children
+ = is_css ? get_urls_css_file (file, url) :
+ get_urls_html (file, url, &meta_disallow_follow, i);
+
+ if (opt.use_robots && meta_disallow_follow)
+ {
+ free_urlpos (children);
+ children = NULL;
+ }
+
+ if (children)
+ {
+ struct urlpos *child = children;
+ struct url *url_parsed = url_parse (url, NULL, i, true);
+ struct iri *ci;
+ char *referer_url = url;
+ bool strip_auth;
+
+ assert (url_parsed != NULL);
+
+ if (!url_parsed)
+ continue;
+
+ strip_auth = (url_parsed && url_parsed->user);
+
+ /* Strip auth info if present */
+ if (strip_auth)
+ referer_url = url_string (url_parsed, URL_AUTH_HIDE);
+
+ for (; child; child = child->next)
+ {
+ reject_reason r;
+
+ if (child->ignore_when_downloading)
+ {
+ DEBUGP (("Not following due to 'ignore' flag: %s\n", child->url->url));
+ continue;
+ }
+
+ if (dash_p_leaf_HTML && !child->link_inline_p)
+ {
+ DEBUGP (("Not following due to 'link inline' flag: %s\n", child->url->url));
+ continue;
+ }
+
+ r = download_child (child, url_parsed, depth,
+ start_url_parsed, blacklist, i);
+ if (r == WG_RR_SUCCESS)
+ {
+ ci = iri_new ();
+ set_uri_encoding (ci, i->content_encoding, false);
+ url_enqueue (queue, ci, xstrdup (child->url->url),
+ xstrdup (referer_url), depth + 1,
+ child->link_expect_html,
+ child->link_expect_css);
+ /* We blacklist the URL we have enqueued, because we
+ don't want to enqueue (and hence download) the
+ same URL twice. */
+ blacklist_add (blacklist, child->url->url);
+ }
+ else
+ {
+ write_reject_log_reason (rejectedlog, r, child->url, url_parsed);
+ }
+ }
+
+ if (strip_auth)
+ xfree (referer_url);
+ url_free (url_parsed);
+ free_urlpos (children);
+ }
+ }
+
+ if (file
+ && (opt.delete_after
+ || opt.spider /* opt.recursive is implicitly true */
+ || !acceptable (file)))
+ {
+ /* Either --delete-after was specified, or we loaded this
+ (otherwise unneeded because of --spider or rejected by -R)
+ HTML file just to harvest its hyperlinks -- in either case,
+ delete the local file. */
+ DEBUGP (("Removing file due to %s in recursive_retrieve():\n",
+ opt.delete_after ? "--delete-after" :
+ (opt.spider ? "--spider" :
+ "recursive rejection criteria")));
+ logprintf (LOG_VERBOSE,
+ (opt.delete_after || opt.spider
+ ? _("Removing %s.\n")
+ : _("Removing %s since it should be rejected.\n")),
+ file);
+ if (unlink (file))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n", strerror (errno));
+ logputs (LOG_VERBOSE, "\n");
+ register_delete_file (file);
+ }
+
+ xfree (url);
+ xfree (referer);
+ xfree (file);
+ iri_free (i);
+ }
+
+ if (rejectedlog)
+ {
+ fclose (rejectedlog);
+ rejectedlog = NULL;
+ }
+
+ /* If anything is left of the queue due to a premature exit, free it
+ now. */
+ {
+ char *d1, *d2;
+ int d3;
+ bool d4, d5;
+ struct iri *d6;
+ while (url_dequeue (queue, (struct iri **)&d6,
+ (const char **)&d1, (const char **)&d2, &d3, &d4, &d5))
+ {
+ iri_free (d6);
+ xfree (d1);
+ xfree (d2);
+ }
+ }
+ url_queue_delete (queue);
+
+ string_set_free (blacklist);
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ return QUOTEXC;
+ else if (status == FWRITEERR)
+ return FWRITEERR;
+ else
+ return RETROK;
+}
+
+/* Based on the context provided by retrieve_tree, decide whether a
+ URL is to be descended to. This is only ever called from
+ retrieve_tree, but is in a separate function for clarity.
+
+ The most expensive checks (such as those for robots) are memoized
+ by storing these URLs to BLACKLIST. This may or may not help. It
+ will help if those URLs are encountered many times. */
+
+static reject_reason
+download_child (const struct urlpos *upos, struct url *parent, int depth,
+ struct url *start_url_parsed, struct hash_table *blacklist,
+ struct iri *iri)
+{
+ struct url *u = upos->url;
+ const char *url = u->url;
+ bool u_scheme_like_http;
+ reject_reason reason = WG_RR_SUCCESS;
+
+ DEBUGP (("Deciding whether to enqueue \"%s\".\n", url));
+
+ if (blacklist_contains (blacklist, url))
+ {
+ if (opt.spider)
+ {
+ char *referrer = url_string (parent, URL_AUTH_HIDE_PASSWD);
+ DEBUGP (("download_child: parent->url is: %s\n", quote (parent->url)));
+ visited_url (url, referrer);
+ xfree (referrer);
+ }
+ DEBUGP (("Already on the black list.\n"));
+ reason = WG_RR_BLACKLIST;
+ goto out;
+ }
+
+ /* Several things to check for:
+ 1. if scheme is not https and https_only requested
+ 2. if scheme is not http, and we don't load it
+ 3. check for relative links (if relative_only is set)
+ 4. check for domain
+ 5. check for no-parent
+ 6. check for excludes && includes
+ 7. check for suffix
+ 8. check for same host (if spanhost is unset), with possible
+ gethostbyname baggage
+ 9. check for robots.txt
+
+ Addendum: If the URL is FTP, and it is to be loaded, only the
+ domain and suffix settings are "stronger".
+
+ Note that .html files will get loaded regardless of suffix rules
+ (but that is remedied later with unlink) unless the depth equals
+ the maximum depth.
+
+ More time- and memory- consuming tests should be put later on
+ the list. */
+
+#ifdef HAVE_SSL
+ if (opt.https_only && u->scheme != SCHEME_HTTPS)
+ {
+ DEBUGP (("Not following non-HTTPS links.\n"));
+ reason = WG_RR_NOTHTTPS;
+ goto out;
+ }
+#endif
+
+ /* Determine whether URL under consideration has a HTTP-like scheme. */
+ u_scheme_like_http = schemes_are_similar_p (u->scheme, SCHEME_HTTP);
+
+ /* 1. Schemes other than HTTP are normally not recursed into. */
+ if (!u_scheme_like_http && !((u->scheme == SCHEME_FTP
+#ifdef HAVE_SSL
+ || u->scheme == SCHEME_FTPS
+#endif
+ ) && opt.follow_ftp))
+ {
+ DEBUGP (("Not following non-HTTP schemes.\n"));
+ reason = WG_RR_NONHTTP;
+ goto out;
+ }
+
+ /* 2. If it is an absolute link and they are not followed, throw it
+ out. */
+ if (u_scheme_like_http)
+ if (opt.relative_only && !upos->link_relative_p)
+ {
+ DEBUGP (("It doesn't really look like a relative link.\n"));
+ reason = WG_RR_ABSOLUTE;
+ goto out;
+ }
+
+ /* 3. If its domain is not to be accepted/looked-up, chuck it
+ out. */
+ if (!accept_domain (u))
+ {
+ DEBUGP (("The domain was not accepted.\n"));
+ reason = WG_RR_DOMAIN;
+ goto out;
+ }
+
+ /* 4. Check for parent directory.
+
+ If we descended to a different host or changed the scheme, ignore
+ opt.no_parent. Also ignore it for documents needed to display
+ the parent page when in -p mode. */
+ if (opt.no_parent
+ && schemes_are_similar_p (u->scheme, start_url_parsed->scheme)
+ && 0 == strcasecmp (u->host, start_url_parsed->host)
+ && (u->scheme != start_url_parsed->scheme
+ || u->port == start_url_parsed->port)
+ && !(opt.page_requisites && upos->link_inline_p))
+ {
+ if (!subdir_p (start_url_parsed->dir, u->dir))
+ {
+ DEBUGP (("Going to \"%s\" would escape \"%s\" with no_parent on.\n",
+ u->dir, start_url_parsed->dir));
+ reason = WG_RR_PARENT;
+ goto out;
+ }
+ }
+
+ /* 5. If the file does not match the acceptance list, or is on the
+ rejection list, chuck it out. The same goes for the directory
+ exclusion and inclusion lists. */
+ if (opt.includes || opt.excludes)
+ {
+ if (!accdir (u->dir))
+ {
+ DEBUGP (("%s (%s) is excluded/not-included.\n", url, u->dir));
+ reason = WG_RR_LIST;
+ goto out;
+ }
+ }
+ if (!accept_url (url))
+ {
+ DEBUGP (("%s is excluded/not-included through regex.\n", url));
+ reason = WG_RR_REGEX;
+ goto out;
+ }
+
+ /* 6. Check for acceptance/rejection rules. We ignore these rules
+ for directories (no file name to match) and for non-leaf HTMLs,
+ which can lead to other files that do need to be downloaded. (-p
+ automatically implies non-leaf because with -p we can, if
+ necessary, overstep the maximum depth to get the page requisites.) */
+ if (u->file[0] != '\0'
+ && !(has_html_suffix_p (u->file)
+ /* The exception only applies to non-leaf HTMLs (but -p
+ always implies non-leaf because we can overstep the
+ maximum depth to get the requisites): */
+ && (/* non-leaf */
+ opt.reclevel == INFINITE_RECURSION
+ /* also non-leaf */
+ || depth < opt.reclevel - 1
+ /* -p, which implies non-leaf (see above) */
+ || opt.page_requisites)))
+ {
+ if (!acceptable (u->file))
+ {
+ DEBUGP (("%s (%s) does not match acc/rej rules.\n",
+ url, u->file));
+ reason = WG_RR_RULES;
+ goto out;
+ }
+ }
+
+ /* 7. */
+ if (schemes_are_similar_p (u->scheme, parent->scheme))
+ if (!opt.spanhost && 0 != strcasecmp (parent->host, u->host))
+ {
+ DEBUGP (("This is not the same hostname as the parent's (%s and %s).\n",
+ u->host, parent->host));
+ reason = WG_RR_SPANNEDHOST;
+ goto out;
+ }
+
+ /* 8. */
+ if (opt.use_robots && u_scheme_like_http)
+ {
+ struct robot_specs *specs = res_get_specs (u->host, u->port);
+ if (!specs)
+ {
+ char *rfile;
+ if (res_retrieve_file (url, &rfile, iri))
+ {
+ specs = res_parse_from_file (rfile);
+
+ /* Delete the robots.txt file if we chose to either delete the
+ files after downloading or we're just running a spider. */
+ if (opt.delete_after || opt.spider)
+ {
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), rfile);
+ if (unlink (rfile))
+ logprintf (LOG_NOTQUIET, "unlink: %s\n",
+ strerror (errno));
+ }
+
+ xfree (rfile);
+ }
+ else
+ {
+ /* If we cannot get real specs, at least produce
+ dummy ones so that we can register them and stop
+ trying to retrieve them. */
+ specs = res_parse ("", 0);
+ }
+ res_register_specs (u->host, u->port, specs);
+ }
+
+ /* Now that we have (or don't have) robots.txt specs, we can
+ check what they say. */
+ if (!res_match_path (specs, u->path))
+ {
+ DEBUGP (("Not following %s because robots.txt forbids it.\n", url));
+ blacklist_add (blacklist, url);
+ reason = WG_RR_ROBOTS;
+ goto out;
+ }
+ }
+
+ out:
+
+ if (reason == WG_RR_SUCCESS)
+ /* The URL has passed all the tests. It can be placed in the
+ download queue. */
+ DEBUGP (("Decided to load it.\n"));
+ else
+ DEBUGP (("Decided NOT to load it.\n"));
+
+ return reason;
+}
+
+/* This function determines whether we will consider downloading the
+ children of a URL whose download resulted in a redirection,
+ possibly to another host, etc. It is needed very rarely, and thus
+ it is merely a simple-minded wrapper around download_child. */
+
+static reject_reason
+descend_redirect (const char *redirected, struct url *orig_parsed, int depth,
+ struct url *start_url_parsed, struct hash_table *blacklist,
+ struct iri *iri)
+{
+ struct url *new_parsed;
+ struct urlpos *upos;
+ reject_reason reason;
+
+ assert (orig_parsed != NULL);
+
+ new_parsed = url_parse (redirected, NULL, NULL, false);
+ assert (new_parsed != NULL);
+
+ upos = xnew0 (struct urlpos);
+ upos->url = new_parsed;
+
+ reason = download_child (upos, orig_parsed, depth,
+ start_url_parsed, blacklist, iri);
+
+ if (reason == WG_RR_SUCCESS)
+ blacklist_add (blacklist, upos->url->url);
+ else if (reason == WG_RR_LIST || reason == WG_RR_REGEX)
+ {
+ DEBUGP (("Ignoring decision for redirects, decided to load it.\n"));
+ blacklist_add (blacklist, upos->url->url);
+ reason = WG_RR_SUCCESS;
+ }
+ else
+ DEBUGP (("Redirection \"%s\" failed the test.\n", redirected));
+
+ url_free (new_parsed);
+ xfree (upos);
+
+ return reason;
+}
+
+
+/* This function writes the rejected log header. */
+static void
+write_reject_log_header (FILE *f)
+{
+ if (!f)
+ return;
+
+ /* Note: Update this header when columns change in any way. */
+ fprintf (f, "REASON\t"
+ "U_URL\tU_SCHEME\tU_HOST\tU_PORT\tU_PATH\tU_PARAMS\tU_QUERY\tU_FRAGMENT\t"
+ "P_URL\tP_SCHEME\tP_HOST\tP_PORT\tP_PATH\tP_PARAMS\tP_QUERY\tP_FRAGMENT\n");
+}
+
+/* This function writes a URL to the reject log. Internal use only. */
+static void
+write_reject_log_url (FILE *fp, const struct url *url)
+{
+ const char *escaped_str;
+ const char *scheme_str;
+
+ if (!fp)
+ return;
+
+ escaped_str = url_escape (url->url);
+
+ switch (url->scheme)
+ {
+ case SCHEME_HTTP: scheme_str = "SCHEME_HTTP"; break;
+#ifdef HAVE_SSL
+ case SCHEME_HTTPS: scheme_str = "SCHEME_HTTPS"; break;
+ case SCHEME_FTPS: scheme_str = "SCHEME_FTPS"; break;
+#endif
+ case SCHEME_FTP: scheme_str = "SCHEME_FTP"; break;
+ default: scheme_str = "SCHEME_INVALID"; break;
+ }
+
+ fprintf (fp, "%s\t%s\t%s\t%i\t%s\t%s\t%s\t%s",
+ escaped_str,
+ scheme_str,
+ url->host,
+ url->port,
+ url->path,
+ url->params ? url->params : "",
+ url->query ? url->query : "",
+ url->fragment ? url->fragment : "");
+
+ xfree (escaped_str);
+}
+
+/* This function writes out information on why a URL was rejected and its
+ context from download_child such as the URL being rejected and it's
+ parent's URL. The format it uses is comma separated values but with tabs. */
+static void
+write_reject_log_reason (FILE *fp, reject_reason reason,
+ const struct url *url, const struct url *parent)
+{
+ const char *reason_str;
+
+ if (!fp)
+ return;
+
+ switch (reason)
+ {
+ case WG_RR_SUCCESS: reason_str = "SUCCESS"; break;
+ case WG_RR_BLACKLIST: reason_str = "BLACKLIST"; break;
+ case WG_RR_NOTHTTPS: reason_str = "NOTHTTPS"; break;
+ case WG_RR_NONHTTP: reason_str = "NONHTTP"; break;
+ case WG_RR_ABSOLUTE: reason_str = "ABSOLUTE"; break;
+ case WG_RR_DOMAIN: reason_str = "DOMAIN"; break;
+ case WG_RR_PARENT: reason_str = "PARENT"; break;
+ case WG_RR_LIST: reason_str = "LIST"; break;
+ case WG_RR_REGEX: reason_str = "REGEX"; break;
+ case WG_RR_RULES: reason_str = "RULES"; break;
+ case WG_RR_SPANNEDHOST: reason_str = "SPANNEDHOST"; break;
+ case WG_RR_ROBOTS: reason_str = "ROBOTS"; break;
+ default: reason_str = "UNKNOWN"; break;
+ }
+
+ fprintf (fp, "%s\t", reason_str);
+ write_reject_log_url (fp, url);
+ fprintf (fp, "\t");
+ write_reject_log_url (fp, parent);
+ fprintf (fp, "\n");
+}
+
+/* vim:set sts=2 sw=2 cino+={s: */
diff --git a/src/recur.h b/src/recur.h
new file mode 100644
index 0000000..ea89d99
--- /dev/null
+++ b/src/recur.h
@@ -0,0 +1,49 @@
+/* Declarations for recur.c.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef RECUR_H
+#define RECUR_H
+
+#include "url.h"
+
+/* For most options, 0 means no limits, but with -p in the picture,
+ that causes a problem on the maximum recursion depth variable. To
+ retain backwards compatibility we allow users to consider "0" to be
+ synonymous with "inf" for -l, but internally infinite recursion is
+ specified by -1 and 0 means to only retrieve the requisites of a
+ single document. */
+#define INFINITE_RECURSION -1
+
+struct urlpos;
+
+void recursive_cleanup (void);
+uerr_t retrieve_tree (struct url *, struct iri *);
+
+#endif /* RECUR_H */
diff --git a/src/res.c b/src/res.c
new file mode 100644
index 0000000..0ed0df9
--- /dev/null
+++ b/src/res.c
@@ -0,0 +1,650 @@
+/* Support for Robot Exclusion Standard (RES).
+ Copyright (C) 2001, 2006-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of Wget.
+
+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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* This file implements the Robot Exclusion Standard (RES).
+
+ RES is a simple protocol that enables site admins to signalize to
+ the web crawlers that certain parts of the site should not be
+ accessed. All the admin needs to do is create a "robots.txt" file
+ in the web server root, and use simple commands to allow or
+ disallow access to certain parts of the site.
+
+ The first specification was written by Martijn Koster in 1994, and
+ is still available at <http://www.robotstxt.org/orig.html>.
+ In 1996, Martijn wrote an Internet Draft specifying an improved RES
+ specification; however, that work was apparently abandoned since
+ the draft has expired in 1997 and hasn't been replaced since. The
+ draft is available at
+ <http://www.robotstxt.org/norobots-rfc.txt>.
+
+ This file implements RES as specified by the draft. Note that this
+ only handles the "robots.txt" support. The META tag that controls
+ whether the links should be followed is handled in `html-url.c'.
+
+ Known deviations:
+
+ * The end-of-line comment recognition is more in the spirit of the
+ Bourne Shell (as specified by RES-1994). That means that
+ "foo#bar" is taken literally, whereas "foo #bar" is interpreted
+ as "foo". The Draft apparently specifies that both should be
+ interpreted as "foo".
+
+ * We don't recognize sole CR as the line ending.
+
+ * We don't implement expiry mechanism for /robots.txt specs. I
+ consider it non-necessary for a relatively short-lived
+ application such as Wget. Besides, it is highly questionable
+ whether anyone deploys the recommended expiry scheme for
+ robots.txt.
+
+ Entry points are functions res_parse, res_parse_from_file,
+ res_match_path, res_register_specs, res_get_specs, and
+ res_retrieve_file. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "utils.h"
+#include "hash.h"
+#include "url.h"
+#include "retr.h"
+#include "res.h"
+#include "c-strcase.h"
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+struct path_info {
+ char *path;
+ bool allowedp;
+ bool user_agent_exact_p;
+};
+
+struct robot_specs {
+ int count;
+ int size;
+ struct path_info *paths;
+};
+
+/* Parsing the robot spec. */
+
+/* Check whether AGENT (a string of length LENGTH) equals "wget" or
+ "*". If it is either of them, *matches is set to one. If it is
+ "wget", *exact_match is set to one. */
+
+static void
+match_user_agent (const char *agent, int length,
+ bool *matches, bool *exact_match)
+{
+ if (length == 1 && *agent == '*')
+ {
+ *matches = true;
+ *exact_match = false;
+ }
+ else if (BOUNDED_EQUAL_NO_CASE (agent, agent + length, "wget"))
+ {
+ *matches = true;
+ *exact_match = true;
+ }
+ else
+ {
+ *matches = false;
+ *exact_match = false;
+ }
+}
+
+/* Add a path specification between PATH_B and PATH_E as one of the
+ paths in SPECS. */
+
+static void
+add_path (struct robot_specs *specs, const char *path_b, const char *path_e,
+ bool allowedp, bool exactp)
+{
+ struct path_info pp;
+ if (path_b < path_e && *path_b == '/')
+ /* Our path representation doesn't use a leading slash, so remove
+ one from theirs. */
+ ++path_b;
+ pp.path = strdupdelim (path_b, path_e);
+ pp.allowedp = allowedp;
+ pp.user_agent_exact_p = exactp;
+ ++specs->count;
+ if (specs->count > specs->size)
+ {
+ if (specs->size == 0)
+ specs->size = 1;
+ else
+ specs->size <<= 1;
+ specs->paths = xrealloc (specs->paths,
+ specs->size * sizeof (struct path_info));
+ }
+ specs->paths[specs->count - 1] = pp;
+}
+
+/* Recreate SPECS->paths with only those paths that have
+ user_agent_exact_p set to true. */
+
+static void
+prune_non_exact (struct robot_specs *specs)
+{
+ struct path_info *newpaths;
+ int i, j, cnt;
+ cnt = 0;
+ for (i = 0; i < specs->count; i++)
+ if (specs->paths[i].user_agent_exact_p)
+ ++cnt;
+ newpaths = xnew_array (struct path_info, cnt);
+ for (i = 0, j = 0; i < specs->count; i++)
+ if (specs->paths[i].user_agent_exact_p)
+ newpaths[j++] = specs->paths[i];
+ else
+ xfree (specs->paths[i].path);
+ assert (j == cnt);
+ xfree (specs->paths);
+ specs->paths = newpaths;
+ specs->count = cnt;
+ specs->size = cnt;
+}
+
+#define EOL(p) ((p) >= lineend)
+
+#define SKIP_SPACE(p) do { \
+ while (!EOL (p) && c_isspace (*p)) \
+ ++p; \
+} while (0)
+
+#define FIELD_IS(string_literal) \
+ BOUNDED_EQUAL_NO_CASE (field_b, field_e, string_literal)
+
+/* Parse textual RES specs beginning with SOURCE of length LENGTH.
+ Return a specs objects ready to be fed to res_match_path.
+
+ The parsing itself is trivial, but creating a correct SPECS object
+ is trickier than it seems, because RES is surprisingly byzantine if
+ you attempt to implement it correctly.
+
+ A "record" is a block of one or more `User-Agent' lines followed by
+ one or more `Allow' or `Disallow' lines. Record is accepted by
+ Wget if one of the `User-Agent' lines was "wget", or if the user
+ agent line was "*".
+
+ After all the lines have been read, we examine whether an exact
+ ("wget") user-agent field was specified. If so, we delete all the
+ lines read under "User-Agent: *" blocks because we have our own
+ Wget-specific blocks. This enables the admin to say:
+
+ User-Agent: *
+ Disallow: /
+
+ User-Agent: google
+ User-Agent: wget
+ Disallow: /cgi-bin
+
+ This means that to Wget and to Google, /cgi-bin is disallowed,
+ whereas for all other crawlers, everything is disallowed.
+ res_parse is implemented so that the order of records doesn't
+ matter. In the case above, the "User-Agent: *" could have come
+ after the other one. */
+
+struct robot_specs *
+res_parse (const char *source, int length)
+{
+ int line_count = 1;
+
+ const char *p = source;
+ const char *end = source + length;
+
+ /* true if last applicable user-agent field matches Wget. */
+ bool user_agent_applies = false;
+
+ /* true if last applicable user-agent field *exactly* matches
+ Wget. */
+ bool user_agent_exact = false;
+
+ /* whether we ever encountered exact user agent. */
+ bool found_exact = false;
+
+ /* count of allow/disallow lines in the current "record", i.e. after
+ the last `user-agent' instructions. */
+ int record_count = 0;
+
+ struct robot_specs *specs = xnew0 (struct robot_specs);
+
+ while (1)
+ {
+ const char *lineend, *lineend_real;
+ const char *field_b, *field_e;
+ const char *value_b, *value_e;
+
+ if (p == end)
+ break;
+ lineend_real = memchr (p, '\n', end - p);
+ if (lineend_real)
+ ++lineend_real;
+ else
+ lineend_real = end;
+ lineend = lineend_real;
+
+ /* Before doing anything else, check whether the line is empty
+ or comment-only. */
+ SKIP_SPACE (p);
+ if (EOL (p) || *p == '#')
+ goto next;
+
+ /* Make sure the end-of-line comments are respected by setting
+ lineend to a location preceding the first comment. Real line
+ ending remains in lineend_real. */
+ for (lineend = p; lineend < lineend_real; lineend++)
+ if ((lineend == p || c_isspace (*(lineend - 1)))
+ && *lineend == '#')
+ break;
+
+ /* Ignore trailing whitespace in the same way. */
+ while (lineend > p && c_isspace (*(lineend - 1)))
+ --lineend;
+
+ assert (!EOL (p));
+
+ field_b = p;
+ while (!EOL (p) && (c_isalnum (*p) || *p == '-'))
+ ++p;
+ field_e = p;
+
+ SKIP_SPACE (p);
+ if (field_b == field_e || EOL (p) || *p != ':')
+ {
+ DEBUGP (("Ignoring malformed line %d\n", line_count));
+ goto next;
+ }
+ ++p; /* skip ':' */
+ SKIP_SPACE (p);
+
+ value_b = p;
+ while (!EOL (p))
+ ++p;
+ value_e = p;
+
+ /* Finally, we have a syntactically valid line. */
+ if (FIELD_IS ("user-agent"))
+ {
+ /* We have to support several cases:
+
+ --previous records--
+
+ User-Agent: foo
+ User-Agent: Wget
+ User-Agent: bar
+ ... matching record ...
+
+ User-Agent: baz
+ User-Agent: qux
+ ... non-matching record ...
+
+ User-Agent: *
+ ... matching record, but will be pruned later ...
+
+ We have to respect `User-Agent' at the beginning of each
+ new record simply because we don't know if we're going to
+ encounter "Wget" among the agents or not. Hence,
+ match_user_agent is called when record_count != 0.
+
+ But if record_count is 0, we have to keep calling it
+ until it matches, and if that happens, we must not call
+ it any more, until the next record. Hence the other part
+ of the condition. */
+ if (record_count != 0 || user_agent_applies == false)
+ match_user_agent (value_b, value_e - value_b,
+ &user_agent_applies, &user_agent_exact);
+ if (user_agent_exact)
+ found_exact = true;
+ record_count = 0;
+ }
+ else if (FIELD_IS ("allow"))
+ {
+ if (user_agent_applies)
+ {
+ add_path (specs, value_b, value_e, true, user_agent_exact);
+ }
+ ++record_count;
+ }
+ else if (FIELD_IS ("disallow"))
+ {
+ if (user_agent_applies)
+ {
+ bool allowed = false;
+ if (value_b == value_e)
+ /* Empty "disallow" line means everything is *allowed*! */
+ allowed = true;
+ add_path (specs, value_b, value_e, allowed, user_agent_exact);
+ }
+ ++record_count;
+ }
+ else
+ {
+ DEBUGP (("Ignoring unknown field at line %d\n", line_count));
+ goto next;
+ }
+
+ next:
+ p = lineend_real;
+ ++line_count;
+ }
+
+ if (found_exact)
+ {
+ /* We've encountered an exactly matching user-agent. Throw out
+ all the stuff with user-agent: *. */
+ prune_non_exact (specs);
+ }
+ else if (specs->size > specs->count)
+ {
+ /* add_path normally over-allocates specs->paths. Reallocate it
+ to the correct size in order to conserve some memory. */
+ specs->paths = xrealloc (specs->paths,
+ specs->count * sizeof (struct path_info));
+ specs->size = specs->count;
+ }
+
+ return specs;
+}
+
+/* The same like res_parse, but first map the FILENAME into memory,
+ and then parse it. */
+
+struct robot_specs *
+res_parse_from_file (const char *filename)
+{
+ struct robot_specs *specs;
+ struct file_memory *fm = wget_read_file (filename);
+ if (!fm)
+ {
+ logprintf (LOG_NOTQUIET, _("Cannot open %s: %s\n"),
+ filename, strerror (errno));
+ return NULL;
+ }
+ specs = res_parse (fm->content, fm->length);
+ wget_read_file_free (fm);
+ return specs;
+}
+
+static void
+free_specs (struct robot_specs *specs)
+{
+ int i;
+ for (i = 0; i < specs->count; i++)
+ xfree (specs->paths[i].path);
+ xfree (specs->paths);
+ xfree (specs);
+}
+
+/* Matching of a path according to the specs. */
+
+/* If C is '%' and (ptr[1], ptr[2]) form a hexadecimal number, and if
+ that number is not a numerical representation of '/', decode C and
+ advance the pointer. */
+
+#define DECODE_MAYBE(c, ptr) do { \
+ if (c == '%' && c_isxdigit (ptr[1]) && c_isxdigit (ptr[2])) \
+ { \
+ unsigned char decoded = X2DIGITS_TO_NUM (ptr[1], ptr[2]); \
+ if (decoded != '/') \
+ { \
+ c = decoded; \
+ ptr += 2; \
+ } \
+ } \
+} while (0)
+
+/* The inner matching engine: return true if RECORD_PATH matches
+ URL_PATH. The rules for matching are described at
+ <http://www.robotstxt.org/norobots-rfc.txt>, section 3.2.2. */
+
+static bool
+matches (const char *record_path, const char *url_path)
+{
+ const char *rp = record_path;
+ const char *up = url_path;
+
+ for (; ; ++rp, ++up)
+ {
+ char rc = *rp;
+ char uc = *up;
+ if (!rc)
+ return true;
+ if (!uc)
+ return false;
+ DECODE_MAYBE(rc, rp);
+ DECODE_MAYBE(uc, up);
+ if (rc != uc)
+ return false;
+ }
+}
+
+/* Iterate through all paths in SPECS. For the first one that
+ matches, return its allow/reject status. If none matches,
+ retrieval is by default allowed. */
+
+bool
+res_match_path (const struct robot_specs *specs, const char *path)
+{
+ int i;
+ if (!specs)
+ return true;
+ for (i = 0; i < specs->count; i++)
+ if (matches (specs->paths[i].path, path))
+ {
+ bool allowedp = specs->paths[i].allowedp;
+ DEBUGP (("%s path %s because of rule %s.\n",
+ allowedp ? "Allowing" : "Rejecting",
+ path, quote (specs->paths[i].path)));
+ return allowedp;
+ }
+ return true;
+}
+
+/* Registering the specs. */
+
+static struct hash_table *registered_specs;
+
+/* Register RES specs that below to server on HOST:PORT. They will
+ later be retrievable using res_get_specs. */
+
+void
+res_register_specs (const char *host, int port, struct robot_specs *specs)
+{
+ struct robot_specs *old;
+ char buf[256], *hp, *hp_old;
+
+ if (((unsigned) snprintf (buf, sizeof (buf), "%s:%d", host, port)) >= sizeof (buf))
+ hp = aprintf("%s:%d", host, port);
+ else
+ hp = buf;
+
+ if (!registered_specs)
+ registered_specs = make_nocase_string_hash_table (0);
+
+ if (hash_table_get_pair (registered_specs, hp, &hp_old, &old))
+ {
+ if (hp != buf)
+ xfree (hp);
+ if (old)
+ free_specs (old);
+ hash_table_put (registered_specs, hp_old, specs);
+ }
+ else
+ {
+ hash_table_put (registered_specs, hp == buf ? xstrdup (hp) : hp, specs);
+ }
+}
+
+/* Get the specs that belong to HOST:PORT. */
+
+struct robot_specs *
+res_get_specs (const char *host, int port)
+{
+ char buf[256], *hp;
+
+ if (!registered_specs)
+ return NULL;
+
+ if (((unsigned) snprintf (buf, sizeof (buf), "%s:%d", host, port)) >= sizeof (buf))
+ hp = aprintf("%s:%d", host, port);
+ else
+ hp = buf;
+
+ return hash_table_get (registered_specs, hp);
+}
+
+/* Loading the robots file. */
+
+#define RES_SPECS_LOCATION "/robots.txt"
+
+/* Retrieve the robots.txt from the server root of the server that
+ serves URL. The file will be named according to the currently
+ active rules, and the file name will be returned in *file.
+
+ Return true if robots were retrieved OK, false otherwise. */
+
+bool
+res_retrieve_file (const char *url, char **file, struct iri *iri)
+{
+ struct iri *i = iri_new ();
+ uerr_t err;
+ char *robots_url = uri_merge (url, RES_SPECS_LOCATION);
+ int saved_ts_val = opt.timestamping;
+ int saved_sp_val = opt.spider, url_err;
+ struct url * url_parsed;
+
+ /* Copy server URI encoding for a possible IDNA transformation, no need to
+ encode the full URI in UTF-8 because "robots.txt" is plain ASCII */
+ set_uri_encoding (i, iri->uri_encoding, false);
+ i->utf8_encode = false;
+
+ logputs (LOG_VERBOSE, _("Loading robots.txt; please ignore errors.\n"));
+ *file = NULL;
+ opt.timestamping = false;
+ opt.spider = false;
+
+ url_parsed = url_parse (robots_url, &url_err, i, true);
+ if (!url_parsed)
+ {
+ char *error = url_error (robots_url, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n", robots_url, error);
+ xfree (error);
+ err = URLERROR;
+ }
+ else
+ {
+ err = retrieve_url (url_parsed, robots_url, file, NULL, NULL, NULL,
+ false, i, false);
+ url_free(url_parsed);
+ }
+
+ opt.timestamping = saved_ts_val;
+ opt.spider = saved_sp_val;
+ xfree (robots_url);
+ iri_free (i);
+
+ if (err != RETROK && *file != NULL)
+ {
+ /* If the file is not retrieved correctly, but retrieve_url
+ allocated the file name, deallocate is here so that the
+ caller doesn't have to worry about it. */
+ xfree (*file);
+ }
+ return err == RETROK;
+}
+
+bool
+is_robots_txt_url (const char *url)
+{
+ char *robots_url = uri_merge (url, RES_SPECS_LOCATION);
+ bool ret = are_urls_equal (url, robots_url);
+
+ xfree (robots_url);
+
+ return ret;
+}
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+res_cleanup (void)
+{
+ if (registered_specs)
+ {
+ hash_table_iterator iter;
+ for (hash_table_iterate (registered_specs, &iter);
+ hash_table_iter_next (&iter);
+ )
+ {
+ xfree (iter.key);
+ free_specs (iter.value);
+ }
+ hash_table_destroy (registered_specs);
+ registered_specs = NULL;
+ }
+}
+#endif
+
+#ifdef TESTING
+
+const char *
+test_is_robots_txt_url(void)
+{
+ unsigned i;
+ static const struct {
+ const char *url;
+ bool expected_result;
+ } test_array[] = {
+ { "http://www.yoyodyne.com/robots.txt", true },
+ { "http://www.yoyodyne.com/somepath/", false },
+ { "http://www.yoyodyne.com/somepath/robots.txt", false },
+ };
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ mu_assert ("test_is_robots_txt_url: wrong result",
+ is_robots_txt_url (test_array[i].url) == test_array[i].expected_result);
+ }
+
+ return NULL;
+}
+
+#endif /* TESTING */
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/src/res.h b/src/res.h
new file mode 100644
index 0000000..9235e39
--- /dev/null
+++ b/src/res.h
@@ -0,0 +1,50 @@
+/* Declarations for res.c.
+ Copyright (C) 2001, 2007-2011, 2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of Wget.
+
+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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef RES_H
+#define RES_H
+
+struct robot_specs;
+
+struct robot_specs *res_parse (const char *, int);
+struct robot_specs *res_parse_from_file (const char *);
+
+bool res_match_path (const struct robot_specs *, const char *);
+
+void res_register_specs (const char *, int, struct robot_specs *);
+struct robot_specs *res_get_specs (const char *, int);
+
+bool res_retrieve_file (const char *, char **, struct iri *);
+
+bool is_robots_txt_url (const char *);
+
+void res_cleanup (void);
+
+#endif /* RES_H */
diff --git a/src/retr.c b/src/retr.c
new file mode 100644
index 0000000..9a17be3
--- /dev/null
+++ b/src/retr.c
@@ -0,0 +1,1561 @@
+/* File retrieval.
+ Copyright (C) 1996-2011, 2014-2015, 2018-2020 Free Software
+ Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+#ifdef VMS
+# include <unixio.h> /* For delete(). */
+#endif
+
+#ifdef HAVE_LIBZ
+# include <zlib.h>
+#endif
+
+#include "exits.h"
+#include "utils.h"
+#include "retr.h"
+#include "progress.h"
+#include "url.h"
+#include "recur.h"
+#include "ftp.h"
+#include "http.h"
+#include "host.h"
+#include "connect.h"
+#include "hash.h"
+#include "convert.h"
+#include "ptimer.h"
+#include "html-url.h"
+#include "iri.h"
+#include "hsts.h"
+
+/* Total size of downloaded files. Used to enforce quota. */
+SUM_SIZE_INT total_downloaded_bytes;
+
+/* Total download time in seconds. */
+double total_download_time;
+
+/* If non-NULL, the stream to which output should be written. This
+ stream is initialized when `-O' is used. */
+FILE *output_stream;
+
+/* Whether output_document is a regular file we can manipulate,
+ i.e. not `-' or a device file. */
+bool output_stream_regular;
+
+static struct {
+ wgint chunk_bytes;
+ double chunk_start;
+ double sleep_adjust;
+} limit_data;
+
+static void
+limit_bandwidth_reset (void)
+{
+ xzero (limit_data);
+}
+
+#ifdef HAVE_LIBZ
+static voidpf
+zalloc (voidpf opaque, unsigned int items, unsigned int size)
+{
+ (void) opaque;
+ return (voidpf) xcalloc (items, size);
+}
+
+static void
+zfree (voidpf opaque, voidpf address)
+{
+ (void) opaque;
+ xfree (address);
+}
+#endif
+
+/* Limit the bandwidth by pausing the download for an amount of time.
+ BYTES is the number of bytes received from the network, and TIMER
+ is the timer that started at the beginning of download. */
+
+static void
+limit_bandwidth (wgint bytes, struct ptimer *timer)
+{
+ double delta_t = ptimer_read (timer) - limit_data.chunk_start;
+ double expected;
+
+ limit_data.chunk_bytes += bytes;
+
+ /* Calculate the amount of time we expect downloading the chunk
+ should take. If in reality it took less time, sleep to
+ compensate for the difference. */
+ expected = (double) limit_data.chunk_bytes / opt.limit_rate;
+
+ if (expected > delta_t)
+ {
+ double slp = expected - delta_t + limit_data.sleep_adjust;
+ double t0, t1;
+ if (slp < 0.2)
+ {
+ DEBUGP (("deferring a %.2f ms sleep (%s/%.2f).\n",
+ slp * 1000, number_to_static_string (limit_data.chunk_bytes),
+ delta_t));
+ return;
+ }
+ DEBUGP (("\nsleeping %.2f ms for %s bytes, adjust %.2f ms\n",
+ slp * 1000, number_to_static_string (limit_data.chunk_bytes),
+ limit_data.sleep_adjust));
+
+ t0 = ptimer_read (timer);
+ xsleep (slp);
+ t1 = ptimer_measure (timer);
+
+ /* Due to scheduling, we probably slept slightly longer (or
+ shorter) than desired. Calculate the difference between the
+ desired and the actual sleep, and adjust the next sleep by
+ that amount. */
+ limit_data.sleep_adjust = slp - (t1 - t0);
+ /* If sleep_adjust is very large, it's likely due to suspension
+ and not clock inaccuracy. Don't enforce those. */
+ if (limit_data.sleep_adjust > 0.5)
+ limit_data.sleep_adjust = 0.5;
+ else if (limit_data.sleep_adjust < -0.5)
+ limit_data.sleep_adjust = -0.5;
+ }
+
+ limit_data.chunk_bytes = 0;
+ limit_data.chunk_start = ptimer_read (timer);
+}
+
+/* Write data in BUF to OUT. However, if *SKIP is non-zero, skip that
+ amount of data and decrease SKIP. Increment *TOTAL by the amount
+ of data written. If OUT2 is not NULL, also write BUF to OUT2.
+ In case of error writing to OUT, -2 is returned. In case of error
+ writing to OUT2, -3 is returned. Return 1 if the whole BUF was
+ skipped. */
+
+static int
+write_data (FILE *out, FILE *out2, const char *buf, int bufsize,
+ wgint *skip, wgint *written)
+{
+ if (out == NULL && out2 == NULL)
+ return 1;
+
+ if (skip)
+ {
+ if (*skip > bufsize)
+ {
+ *skip -= bufsize;
+ return 1;
+ }
+ if (*skip)
+ {
+ buf += *skip;
+ bufsize -= *skip;
+ *skip = 0;
+ if (bufsize == 0)
+ return 1;
+ }
+ }
+
+ if (out)
+ fwrite (buf, 1, bufsize, out);
+ if (out2)
+ fwrite (buf, 1, bufsize, out2);
+
+ if (written)
+ *written += bufsize;
+
+ /* Immediately flush the downloaded data. This should not hinder
+ performance: fast downloads will arrive in large 16K chunks
+ (which stdio would write out immediately anyway), and slow
+ downloads wouldn't be limited by disk speed. */
+
+ /* 2005-04-20 SMS.
+ Perhaps it shouldn't hinder performance, but it sure does, at least
+ on VMS (more than 2X). Rather than speculate on what it should or
+ shouldn't do, it might make more sense to test it. Even better, it
+ might be nice to explain what possible benefit it could offer, as
+ it appears to be a clear invitation to poor performance with no
+ actual justification. (Also, why 16K? Anyone test other values?)
+ */
+#ifndef __VMS
+ if (out)
+ fflush (out);
+ if (out2)
+ fflush (out2);
+#endif /* ndef __VMS */
+
+ if (out && ferror (out))
+ return -2;
+ else if (out2 && ferror (out2))
+ return -3;
+
+ return 0;
+}
+
+/* Read the contents of file descriptor FD until it the connection
+ terminates or a read error occurs. The data is read in portions of
+ up to 16K and written to OUT as it arrives. If opt.verbose is set,
+ the progress is shown.
+
+ TOREAD is the amount of data expected to arrive, normally only used
+ by the progress gauge.
+
+ STARTPOS is the position from which the download starts, used by
+ the progress gauge. If QTYREAD is non-NULL, the value it points to
+ is incremented by the amount of data read from the network. If
+ QTYWRITTEN is non-NULL, the value it points to is incremented by
+ the amount of data written to disk. The time it took to download
+ the data is stored to ELAPSED.
+
+ If OUT2 is non-NULL, the contents is also written to OUT2.
+ OUT2 will get an exact copy of the response: if this is a chunked
+ response, everything -- including the chunk headers -- is written
+ to OUT2. (OUT will only get the unchunked response.)
+
+ The function exits and returns the amount of data read. In case of
+ error while reading data, -1 is returned. In case of error while
+ writing data to OUT, -2 is returned. In case of error while writing
+ data to OUT2, -3 is returned. */
+
+int
+fd_read_body (const char *downloaded_filename, int fd, FILE *out, wgint toread, wgint startpos,
+
+ wgint *qtyread, wgint *qtywritten, double *elapsed, int flags,
+ FILE *out2)
+{
+ int ret = 0;
+#undef max
+#define max(a,b) ((a) > (b) ? (a) : (b))
+ int dlbufsize = max (BUFSIZ, 8 * 1024);
+ char *dlbuf = xmalloc (dlbufsize);
+
+ struct ptimer *timer = NULL;
+ double last_successful_read_tm = 0;
+
+ /* The progress gauge, set according to the user preferences. */
+ void *progress = NULL;
+
+ /* Non-zero if the progress gauge is interactive, i.e. if it can
+ continually update the display. When true, smaller timeout
+ values are used so that the gauge can update the display when
+ data arrives slowly. */
+ bool progress_interactive = false;
+
+ bool exact = !!(flags & rb_read_exactly);
+
+ /* Used only by HTTP/HTTPS chunked transfer encoding. */
+ bool chunked = flags & rb_chunked_transfer_encoding;
+ wgint skip = 0;
+
+ /* How much data we've read/written. */
+ wgint sum_read = 0;
+ wgint sum_written = 0;
+ wgint remaining_chunk_size = 0;
+
+#ifdef HAVE_LIBZ
+ /* try to minimize the number of calls to inflate() and write_data() per
+ call to fd_read() */
+ unsigned int gzbufsize = dlbufsize * 4;
+ char *gzbuf = NULL;
+ z_stream gzstream;
+
+ if (flags & rb_compressed_gzip)
+ {
+ gzbuf = xmalloc (gzbufsize);
+ if (gzbuf != NULL)
+ {
+ gzstream.zalloc = zalloc;
+ gzstream.zfree = zfree;
+ gzstream.opaque = Z_NULL;
+ gzstream.next_in = Z_NULL;
+ gzstream.avail_in = 0;
+
+ #define GZIP_DETECT 32 /* gzip format detection */
+ #define GZIP_WINDOW 15 /* logarithmic window size (default: 15) */
+ ret = inflateInit2 (&gzstream, GZIP_DETECT | GZIP_WINDOW);
+ if (ret != Z_OK)
+ {
+ xfree (gzbuf);
+ errno = (ret == Z_MEM_ERROR) ? ENOMEM : EINVAL;
+ ret = -1;
+ goto out;
+ }
+ }
+ else
+ {
+ errno = ENOMEM;
+ ret = -1;
+ goto out;
+ }
+ }
+#endif
+
+ if (flags & rb_skip_startpos)
+ skip = startpos;
+
+ if (opt.show_progress)
+ {
+ const char *filename_progress;
+ /* If we're skipping STARTPOS bytes, pass 0 as the INITIAL
+ argument to progress_create because the indicator doesn't
+ (yet) know about "skipping" data. */
+ wgint start = skip ? 0 : startpos;
+ if (opt.dir_prefix)
+ filename_progress = downloaded_filename + strlen (opt.dir_prefix) + 1;
+ else
+ filename_progress = downloaded_filename;
+ progress = progress_create (filename_progress, start, start + toread);
+ progress_interactive = progress_interactive_p (progress);
+ }
+
+ if (opt.limit_rate)
+ limit_bandwidth_reset ();
+
+ /* A timer is needed for tracking progress, for throttling, and for
+ tracking elapsed time. If either of these are requested, start
+ the timer. */
+ if (progress || opt.limit_rate || elapsed)
+ {
+ timer = ptimer_new ();
+ last_successful_read_tm = 0;
+ }
+
+ /* Use a smaller buffer for low requested bandwidths. For example,
+ with --limit-rate=2k, it doesn't make sense to slurp in 16K of
+ data and then sleep for 8s. With buffer size equal to the limit,
+ we never have to sleep for more than one second. */
+ if (opt.limit_rate && opt.limit_rate < dlbufsize)
+ dlbufsize = opt.limit_rate;
+
+ /* Read from FD while there is data to read. Normally toread==0
+ means that it is unknown how much data is to arrive. However, if
+ EXACT is set, then toread==0 means what it says: that no data
+ should be read. */
+ while (!exact || (sum_read < toread))
+ {
+ int rdsize;
+ double tmout = opt.read_timeout;
+
+ if (chunked)
+ {
+ if (remaining_chunk_size == 0)
+ {
+ char *line = fd_read_line (fd);
+ char *endl;
+ if (line == NULL)
+ {
+ ret = -1;
+ break;
+ }
+ else if (out2 != NULL)
+ fwrite (line, 1, strlen (line), out2);
+
+ remaining_chunk_size = strtol (line, &endl, 16);
+ xfree (line);
+
+ if (remaining_chunk_size < 0)
+ {
+ ret = -1;
+ break;
+ }
+
+ if (remaining_chunk_size == 0)
+ {
+ ret = 0;
+ line = fd_read_line (fd);
+ if (line == NULL)
+ ret = -1;
+ else
+ {
+ if (out2 != NULL)
+ fwrite (line, 1, strlen (line), out2);
+ xfree (line);
+ }
+ break;
+ }
+ }
+
+ rdsize = MIN (remaining_chunk_size, dlbufsize);
+ }
+ else
+ rdsize = exact ? MIN (toread - sum_read, dlbufsize) : dlbufsize;
+
+ if (progress_interactive)
+ {
+ /* For interactive progress gauges, always specify a ~1s
+ timeout, so that the gauge can be updated regularly even
+ when the data arrives very slowly or stalls. */
+ tmout = 0.95;
+ /* avoid wrong 'interactive timeout' */
+ errno = 0;
+ if (opt.read_timeout)
+ {
+ double waittm;
+ waittm = ptimer_read (timer) - last_successful_read_tm;
+ if (waittm + tmout > opt.read_timeout)
+ {
+ /* Don't let total idle time exceed read timeout. */
+ tmout = opt.read_timeout - waittm;
+ /* if 0 fd_read can be 'blocked read' */
+ if (tmout <= 0)
+ {
+ /* We've already exceeded the timeout. */
+ ret = -1, errno = ETIMEDOUT;
+ break;
+ }
+ }
+ }
+ }
+ ret = fd_read (fd, dlbuf, rdsize, tmout);
+
+ if (progress_interactive && ret < 0 && errno == ETIMEDOUT)
+ ret = 0; /* interactive timeout, handled above */
+ else if (ret <= 0)
+ break; /* EOF or read error */
+
+ if (progress || opt.limit_rate || elapsed)
+ {
+ ptimer_measure (timer);
+ if (ret > 0)
+ last_successful_read_tm = ptimer_read (timer);
+ }
+
+ if (ret > 0)
+ {
+ int write_res;
+
+ sum_read += ret;
+
+#ifdef HAVE_LIBZ
+ if (gzbuf != NULL)
+ {
+ int err;
+ int towrite;
+
+ /* Write original data to WARC file */
+ write_res = write_data (NULL, out2, dlbuf, ret, NULL, NULL);
+ if (write_res < 0)
+ {
+ ret = write_res;
+ goto out;
+ }
+
+ gzstream.avail_in = ret;
+ gzstream.next_in = (unsigned char *) dlbuf;
+
+ do
+ {
+ gzstream.avail_out = gzbufsize;
+ gzstream.next_out = (unsigned char *) gzbuf;
+
+ err = inflate (&gzstream, Z_NO_FLUSH);
+
+ switch (err)
+ {
+ case Z_MEM_ERROR:
+ errno = ENOMEM;
+ ret = -1;
+ goto out;
+ case Z_NEED_DICT:
+ case Z_DATA_ERROR:
+ errno = EINVAL;
+ ret = -1;
+ goto out;
+ case Z_STREAM_END:
+ if (exact && sum_read != toread)
+ {
+ DEBUGP(("zlib stream ended unexpectedly after "
+ "%ld/%ld bytes\n", sum_read, toread));
+ }
+ }
+
+ towrite = gzbufsize - gzstream.avail_out;
+ write_res = write_data (out, NULL, gzbuf, towrite, &skip,
+ &sum_written);
+ if (write_res < 0)
+ {
+ ret = write_res;
+ goto out;
+ }
+ }
+ while (gzstream.avail_out == 0);
+ }
+ else
+#endif
+ {
+ write_res = write_data (out, out2, dlbuf, ret, &skip,
+ &sum_written);
+ if (write_res < 0)
+ {
+ ret = write_res;
+ goto out;
+ }
+ }
+
+ if (chunked)
+ {
+ remaining_chunk_size -= ret;
+ if (remaining_chunk_size == 0)
+ {
+ char *line = fd_read_line (fd);
+ if (line == NULL)
+ {
+ ret = -1;
+ break;
+ }
+ else
+ {
+ if (out2 != NULL)
+ fwrite (line, 1, strlen (line), out2);
+ xfree (line);
+ }
+ }
+ }
+ }
+
+ if (opt.limit_rate)
+ limit_bandwidth (ret, timer);
+
+ if (progress)
+ progress_update (progress, ret, ptimer_read (timer));
+#ifdef WINDOWS
+ if (toread > 0 && opt.show_progress)
+ ws_percenttitle (100.0 *
+ (startpos + sum_read) / (startpos + toread));
+#endif
+ }
+ if (ret < -1)
+ ret = -1;
+
+ out:
+ if (progress)
+ progress_finish (progress, ptimer_read (timer));
+
+ if (timer)
+ {
+ if (elapsed)
+ *elapsed = ptimer_read (timer);
+ ptimer_destroy (timer);
+ }
+
+#ifdef HAVE_LIBZ
+ if (gzbuf != NULL)
+ {
+ int err = inflateEnd (&gzstream);
+ if (ret >= 0)
+ {
+ /* with compression enabled, ret must be 0 if successful */
+ if (err == Z_OK)
+ ret = 0;
+ else
+ {
+ errno = EINVAL;
+ ret = -1;
+ }
+ }
+ xfree (gzbuf);
+
+ if (gzstream.total_in != (uLong) sum_read)
+ {
+ DEBUGP(("zlib read size differs from raw read size (%lu/%ld)\n",
+ gzstream.total_in, sum_read));
+ }
+ }
+#endif
+
+ if (qtyread)
+ *qtyread += sum_read;
+ if (qtywritten)
+ *qtywritten += sum_written;
+
+ xfree (dlbuf);
+
+ return ret;
+}
+
+/* Read a hunk of data from FD, up until a terminator. The hunk is
+ limited by whatever the TERMINATOR callback chooses as its
+ terminator. For example, if terminator stops at newline, the hunk
+ will consist of a line of data; if terminator stops at two
+ newlines, it can be used to read the head of an HTTP response.
+ Upon determining the boundary, the function returns the data (up to
+ the terminator) in malloc-allocated storage.
+
+ In case of read error, NULL is returned. In case of EOF and no
+ data read, NULL is returned and errno set to 0. In case of having
+ read some data, but encountering EOF before seeing the terminator,
+ the data that has been read is returned, but it will (obviously)
+ not contain the terminator.
+
+ The TERMINATOR function is called with three arguments: the
+ beginning of the data read so far, the beginning of the current
+ block of peeked-at data, and the length of the current block.
+ Depending on its needs, the function is free to choose whether to
+ analyze all data or just the newly arrived data. If TERMINATOR
+ returns NULL, it means that the terminator has not been seen.
+ Otherwise it should return a pointer to the charactre immediately
+ following the terminator.
+
+ The idea is to be able to read a line of input, or otherwise a hunk
+ of text, such as the head of an HTTP request, without crossing the
+ boundary, so that the next call to fd_read etc. reads the data
+ after the hunk. To achieve that, this function does the following:
+
+ 1. Peek at incoming data.
+
+ 2. Determine whether the peeked data, along with the previously
+ read data, includes the terminator.
+
+ 2a. If yes, read the data until the end of the terminator, and
+ exit.
+
+ 2b. If no, read the peeked data and goto 1.
+
+ The function is careful to assume as little as possible about the
+ implementation of peeking. For example, every peek is followed by
+ a read. If the read returns a different amount of data, the
+ process is retried until all data arrives safely.
+
+ SIZEHINT is the buffer size sufficient to hold all the data in the
+ typical case (it is used as the initial buffer size). MAXSIZE is
+ the maximum amount of memory this function is allowed to allocate,
+ or 0 if no upper limit is to be enforced.
+
+ This function should be used as a building block for other
+ functions -- see fd_read_line as a simple example. */
+
+char *
+fd_read_hunk (int fd, hunk_terminator_t terminator, long sizehint, long maxsize)
+{
+ long bufsize = sizehint;
+ char *hunk = xmalloc (bufsize);
+ int tail = 0; /* tail position in HUNK */
+
+ assert (!maxsize || maxsize >= bufsize);
+
+ while (1)
+ {
+ const char *end;
+ int pklen, rdlen, remain;
+
+ /* First, peek at the available data. */
+
+ pklen = fd_peek (fd, hunk + tail, bufsize - 1 - tail, -1);
+ if (pklen < 0)
+ {
+ xfree (hunk);
+ return NULL;
+ }
+ end = terminator (hunk, hunk + tail, pklen);
+ if (end)
+ {
+ /* The data contains the terminator: we'll drain the data up
+ to the end of the terminator. */
+ remain = end - (hunk + tail);
+ assert (remain >= 0);
+ if (remain == 0)
+ {
+ /* No more data needs to be read. */
+ hunk[tail] = '\0';
+ return hunk;
+ }
+ if (bufsize - 1 < tail + remain)
+ {
+ bufsize = tail + remain + 1;
+ hunk = xrealloc (hunk, bufsize);
+ }
+ }
+ else
+ /* No terminator: simply read the data we know is (or should
+ be) available. */
+ remain = pklen;
+
+ /* Now, read the data. Note that we make no assumptions about
+ how much data we'll get. (Some TCP stacks are notorious for
+ read returning less data than the previous MSG_PEEK.) */
+
+ rdlen = fd_read (fd, hunk + tail, remain, 0);
+ if (rdlen < 0)
+ {
+ xfree (hunk);
+ return NULL;
+ }
+ tail += rdlen;
+ hunk[tail] = '\0';
+
+ if (rdlen == 0)
+ {
+ if (tail == 0)
+ {
+ /* EOF without anything having been read */
+ xfree (hunk);
+ errno = 0;
+ return NULL;
+ }
+ else
+ /* EOF seen: return the data we've read. */
+ return hunk;
+ }
+ if (end && rdlen == remain)
+ /* The terminator was seen and the remaining data drained --
+ we got what we came for. */
+ return hunk;
+
+ /* Keep looping until all the data arrives. */
+
+ if (tail == bufsize - 1)
+ {
+ /* Double the buffer size, but refuse to allocate more than
+ MAXSIZE bytes. */
+ if (maxsize && bufsize >= maxsize)
+ {
+ xfree (hunk);
+ errno = ENOMEM;
+ return NULL;
+ }
+ bufsize <<= 1;
+ if (maxsize && bufsize > maxsize)
+ bufsize = maxsize;
+ hunk = xrealloc (hunk, bufsize);
+ }
+ }
+}
+
+static const char *
+line_terminator (const char *start _GL_UNUSED, const char *peeked, int peeklen)
+{
+ const char *p = memchr (peeked, '\n', peeklen);
+ if (p)
+ /* p+1 because the line must include '\n' */
+ return p + 1;
+ return NULL;
+}
+
+/* The maximum size of the single line we agree to accept. This is
+ not meant to impose an arbitrary limit, but to protect the user
+ from Wget slurping up available memory upon encountering malicious
+ or buggy server output. Define it to 0 to remove the limit. */
+#define FD_READ_LINE_MAX 4096
+
+/* Read one line from FD and return it. The line is allocated using
+ malloc, but is never larger than FD_READ_LINE_MAX.
+
+ If an error occurs, or if no data can be read, NULL is returned.
+ In the former case errno indicates the error condition, and in the
+ latter case, errno is NULL. */
+
+char *
+fd_read_line (int fd)
+{
+ return fd_read_hunk (fd, line_terminator, 128, FD_READ_LINE_MAX);
+}
+
+/* Return a printed representation of the download rate, along with
+ the units appropriate for the download speed. */
+
+const char *
+retr_rate (wgint bytes, double secs)
+{
+ static char res[20];
+ static const char *rate_names[] = {"B/s", "KB/s", "MB/s", "GB/s" };
+ static const char *rate_names_bits[] = {"b/s", "Kb/s", "Mb/s", "Gb/s" };
+ int units;
+
+ double dlrate = calc_rate (bytes, secs, &units);
+ /* Use more digits for smaller numbers (regardless of unit used),
+ e.g. "1022", "247", "12.5", "2.38". */
+ snprintf (res, sizeof(res), "%.*f %s",
+ dlrate >= 99.95 ? 0 : dlrate >= 9.995 ? 1 : 2,
+ dlrate, !opt.report_bps ? rate_names[units]: rate_names_bits[units]);
+
+ return res;
+}
+
+/* Calculate the download rate and trim it as appropriate for the
+ speed. Appropriate means that if rate is greater than 1K/s,
+ kilobytes are used, and if rate is greater than 1MB/s, megabytes
+ are used.
+
+ UNITS is zero for B/s, one for KB/s, two for MB/s, and three for
+ GB/s. */
+
+double
+calc_rate (wgint bytes, double secs, int *units)
+{
+ double dlrate;
+ double bibyte;
+
+ if (!opt.report_bps)
+ bibyte = 1024.0;
+ else
+ bibyte = 1000.0;
+
+ if (secs == 0)
+ /* If elapsed time is exactly zero, it means we're under the
+ resolution of the timer. This can easily happen on systems
+ that use time() for the timer. Since the interval lies between
+ 0 and the timer's resolution, assume half the resolution. */
+ secs = ptimer_resolution () / 2.0;
+
+ dlrate = secs ? convert_to_bits (bytes) / secs : 0;
+ if (dlrate < bibyte)
+ *units = 0;
+ else if (dlrate < (bibyte * bibyte))
+ *units = 1, dlrate /= bibyte;
+ else if (dlrate < (bibyte * bibyte * bibyte))
+ *units = 2, dlrate /= (bibyte * bibyte);
+ else if (dlrate < (bibyte * bibyte * bibyte * bibyte))
+ *units = 3, dlrate /= (bibyte * bibyte * bibyte);
+ else {
+ *units = 4, dlrate /= (bibyte * bibyte * bibyte * bibyte);
+ if (dlrate > 99.99)
+ dlrate = 99.99; // upper limit 99.99TB/s
+ }
+
+ return dlrate;
+}
+
+
+#define SUSPEND_METHOD do { \
+ method_suspended = true; \
+ saved_body_data = opt.body_data; \
+ saved_body_file_name = opt.body_file; \
+ saved_method = opt.method; \
+ opt.body_data = NULL; \
+ opt.body_file = NULL; \
+ opt.method = NULL; \
+} while (0)
+
+#define RESTORE_METHOD do { \
+ if (method_suspended) \
+ { \
+ opt.body_data = saved_body_data; \
+ opt.body_file = saved_body_file_name; \
+ opt.method = saved_method; \
+ method_suspended = false; \
+ } \
+} while (0)
+
+static char *getproxy (struct url *);
+
+/* Retrieve the given URL. Decides which loop to call -- HTTP, FTP,
+ FTP, proxy, etc. */
+
+/* #### This function should be rewritten so it doesn't return from
+ multiple points. */
+
+uerr_t
+retrieve_url (struct url * orig_parsed, const char *origurl, char **file,
+ char **newloc, const char *refurl, int *dt, bool recursive,
+ struct iri *iri, bool register_status)
+{
+ uerr_t result;
+ char *url;
+ bool location_changed;
+ bool iri_fallbacked = 0;
+ int dummy;
+ char *mynewloc, *proxy;
+ struct url *u = orig_parsed, *proxy_url;
+ int up_error_code; /* url parse error code */
+ char *local_file = NULL;
+ int redirection_count = 0;
+
+ bool method_suspended = false;
+ char *saved_body_data = NULL;
+ char *saved_method = NULL;
+ char *saved_body_file_name = NULL;
+
+ /* If dt is NULL, use local storage. */
+ if (!dt)
+ {
+ dt = &dummy;
+ dummy = 0;
+ }
+ url = xstrdup (origurl);
+ if (newloc)
+ *newloc = NULL;
+ if (file)
+ *file = NULL;
+
+ if (!refurl)
+ refurl = opt.referer;
+
+ redirected:
+ /* (also for IRI fallbacking) */
+
+ result = NOCONERROR;
+ mynewloc = NULL;
+ xfree(local_file);
+ proxy_url = NULL;
+
+ proxy = getproxy (u);
+ if (proxy)
+ {
+ struct iri *pi = iri_new ();
+ set_uri_encoding (pi, opt.locale, true);
+ pi->utf8_encode = false;
+
+ /* Parse the proxy URL. */
+ proxy_url = url_parse (proxy, &up_error_code, pi, true);
+ if (!proxy_url)
+ {
+ char *error = url_error (proxy, up_error_code);
+ logprintf (LOG_NOTQUIET, _("Error parsing proxy URL %s: %s.\n"),
+ proxy, error);
+ xfree (url);
+ xfree (error);
+ xfree (proxy);
+ iri_free (pi);
+ RESTORE_METHOD;
+ result = PROXERR;
+ if (orig_parsed != u)
+ url_free (u);
+ goto bail;
+ }
+ if (proxy_url->scheme != SCHEME_HTTP && proxy_url->scheme != u->scheme)
+ {
+ logprintf (LOG_NOTQUIET, _("Error in proxy URL %s: Must be HTTP.\n"), proxy);
+ url_free (proxy_url);
+ xfree (url);
+ xfree (proxy);
+ iri_free (pi);
+ RESTORE_METHOD;
+ result = PROXERR;
+ if (orig_parsed != u)
+ url_free (u);
+ goto bail;
+ }
+ iri_free(pi);
+ xfree (proxy);
+ }
+
+ if (u->scheme == SCHEME_HTTP
+#ifdef HAVE_SSL
+ || u->scheme == SCHEME_HTTPS
+#endif
+ || (proxy_url && proxy_url->scheme == SCHEME_HTTP))
+ {
+#ifdef HAVE_HSTS
+#ifdef TESTING
+ /* we don't link against main.o when we're testing */
+ hsts_store_t hsts_store = NULL;
+#else
+ extern hsts_store_t hsts_store;
+#endif
+
+ if (opt.hsts && hsts_store)
+ {
+ if (hsts_match (hsts_store, u))
+ logprintf (LOG_VERBOSE, "URL transformed to HTTPS due to an HSTS policy\n");
+ }
+#endif
+ result = http_loop (u, orig_parsed, &mynewloc, &local_file, refurl, dt,
+ proxy_url, iri);
+ }
+ else if (u->scheme == SCHEME_FTP
+#ifdef HAVE_SSL
+ || u->scheme == SCHEME_FTPS
+#endif
+ )
+ {
+ /* If this is a redirection, temporarily turn off opt.ftp_glob
+ and opt.recursive, both being undesirable when following
+ redirects. */
+ bool oldrec = recursive, glob = opt.ftp_glob;
+ if (redirection_count)
+ oldrec = glob = false;
+
+ result = ftp_loop (u, orig_parsed, &local_file, dt, proxy_url,
+ recursive, glob);
+ recursive = oldrec;
+
+ /* There is a possibility of having HTTP being redirected to
+ FTP. In these cases we must decide whether the text is HTML
+ according to the suffix. The HTML suffixes are `.html',
+ `.htm' and a few others, case-insensitive. */
+ if (redirection_count && local_file && (u->scheme == SCHEME_FTP
+#ifdef HAVE_SSL
+ || u->scheme == SCHEME_FTPS
+#endif
+ ))
+ {
+ if (has_html_suffix_p (local_file))
+ *dt |= TEXTHTML;
+ }
+ }
+
+ if (proxy_url)
+ {
+ url_free (proxy_url);
+ proxy_url = NULL;
+ }
+
+ location_changed = (result == NEWLOCATION || result == NEWLOCATION_KEEP_POST);
+ if (location_changed)
+ {
+ char *construced_newloc;
+ struct url *newloc_parsed;
+
+ assert (mynewloc != NULL);
+
+ xfree (local_file);
+
+ /* The HTTP specs only allow absolute URLs to appear in
+ redirects, but a ton of boneheaded webservers and CGIs out
+ there break the rules and use relative URLs, and popular
+ browsers are lenient about this, so wget should be too. */
+ construced_newloc = uri_merge (url, mynewloc ? mynewloc : "");
+ xfree (mynewloc);
+ mynewloc = construced_newloc;
+
+#ifdef ENABLE_IRI
+ /* Reset UTF-8 encoding state, set the URI encoding and reset
+ the content encoding. */
+ iri->utf8_encode = opt.enable_iri;
+ if (opt.encoding_remote)
+ set_uri_encoding (iri, opt.encoding_remote, true);
+ set_content_encoding (iri, NULL);
+ xfree (iri->orig_url);
+#endif
+
+ /* Now, see if this new location makes sense. */
+ newloc_parsed = url_parse (mynewloc, &up_error_code, iri, true);
+ if (!newloc_parsed)
+ {
+ char *error = url_error (mynewloc, up_error_code);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n", escnonprint_uri (mynewloc),
+ error);
+ if (orig_parsed != u)
+ {
+ url_free (u);
+ }
+ xfree (url);
+ xfree (mynewloc);
+ xfree (error);
+ RESTORE_METHOD;
+ goto bail;
+ }
+
+ /* Now mynewloc will become newloc_parsed->url, because if the
+ Location contained relative paths like .././something, we
+ don't want that propagating as url. */
+ xfree (mynewloc);
+ mynewloc = xstrdup (newloc_parsed->url);
+
+ /* Check for max. number of redirections. */
+ if (++redirection_count > opt.max_redirect)
+ {
+ logprintf (LOG_NOTQUIET, _("%d redirections exceeded.\n"),
+ opt.max_redirect);
+ url_free (newloc_parsed);
+ if (orig_parsed != u)
+ {
+ url_free (u);
+ }
+ xfree (url);
+ xfree (mynewloc);
+ RESTORE_METHOD;
+ result = WRONGCODE;
+ goto bail;
+ }
+
+ xfree (url);
+ url = mynewloc;
+ if (orig_parsed != u)
+ {
+ url_free (u);
+ }
+ u = newloc_parsed;
+
+ /* If we're being redirected from POST, and we received a
+ redirect code different than 307, we don't want to POST
+ again. Many requests answer POST with a redirection to an
+ index page; that redirection is clearly a GET. We "suspend"
+ POST data for the duration of the redirections, and restore
+ it when we're done.
+
+ RFC2616 HTTP/1.1 introduces code 307 Temporary Redirect
+ specifically to preserve the method of the request.
+ */
+ if (result != NEWLOCATION_KEEP_POST && !method_suspended)
+ SUSPEND_METHOD;
+
+ goto redirected;
+ }
+ else
+ {
+ xfree(mynewloc);
+ }
+
+ /* Try to not encode in UTF-8 if fetching failed */
+ if (!(*dt & RETROKF) && iri->utf8_encode)
+ {
+ iri->utf8_encode = false;
+ if (orig_parsed != u)
+ {
+ url_free (u);
+ }
+ u = url_parse (origurl, NULL, iri, true);
+ if (u)
+ {
+ if (strcmp(u->url, orig_parsed->url))
+ {
+ DEBUGP (("[IRI fallbacking to non-utf8 for %s\n", quote (url)));
+ xfree (url);
+ url = xstrdup (u->url);
+ iri_fallbacked = 1;
+ goto redirected;
+ }
+ else
+ DEBUGP (("[Needn't fallback to non-utf8 for %s\n", quote (url)));
+ }
+ else
+ DEBUGP (("[Couldn't fallback to non-utf8 for %s\n", quote (url)));
+ }
+
+ if (local_file && u && (*dt & RETROKF || opt.content_on_error))
+ {
+ register_download (u->url, local_file);
+
+ if (!opt.spider && redirection_count && 0 != strcmp (origurl, u->url))
+ register_redirection (origurl, u->url);
+
+ if (*dt & TEXTHTML)
+ register_html (local_file);
+
+ if (*dt & TEXTCSS)
+ register_css (local_file);
+ }
+
+ if (file)
+ *file = local_file ? local_file : NULL;
+ else
+ xfree (local_file);
+
+ if (orig_parsed != u)
+ url_free (u);
+
+ if (redirection_count || iri_fallbacked)
+ {
+ if (newloc)
+ *newloc = url;
+ else
+ xfree (url);
+ }
+ else
+ {
+ if (newloc)
+ *newloc = NULL;
+ xfree (url);
+ }
+
+ RESTORE_METHOD;
+
+bail:
+ if (register_status)
+ inform_exit_status (result);
+
+ return result;
+}
+
+/* Find the URLs in the file and call retrieve_url() for each of them.
+ If HTML is true, treat the file as HTML, and construct the URLs
+ accordingly.
+
+ If opt.recursive is set, call retrieve_tree() for each file. */
+
+uerr_t
+retrieve_from_file (const char *file, bool html, int *count)
+{
+ uerr_t status;
+ struct urlpos *url_list, *cur_url;
+ struct iri *iri = iri_new();
+
+ char *input_file, *url_file = NULL;
+ const char *url = file;
+
+ status = RETROK; /* Suppose everything is OK. */
+ *count = 0; /* Reset the URL count. */
+
+ /* sXXXav : Assume filename and links in the file are in the locale */
+ set_uri_encoding (iri, opt.locale, true);
+ set_content_encoding (iri, opt.locale);
+
+ if (url_valid_scheme (url))
+ {
+ int dt,url_err;
+ struct url *url_parsed = url_parse (url, &url_err, iri, true);
+ if (!url_parsed)
+ {
+ char *error = url_error (url, url_err);
+ logprintf (LOG_NOTQUIET, "%s: %s.\n", url, error);
+ xfree (error);
+ iri_free (iri);
+ return URLERROR;
+ }
+
+ if (!opt.base_href)
+ opt.base_href = xstrdup (url);
+
+ status = retrieve_url (url_parsed, url, &url_file, NULL, NULL, &dt,
+ false, iri, true);
+ url_free (url_parsed);
+
+ if (!url_file || (status != RETROK))
+ return status;
+
+ if (dt & TEXTHTML)
+ html = true;
+
+#ifdef ENABLE_IRI
+ /* If we have a found a content encoding, use it.
+ * ( == is okay, because we're checking for identical object) */
+ if (iri->content_encoding != opt.locale)
+ set_uri_encoding (iri, iri->content_encoding, false);
+#endif
+
+ /* Reset UTF-8 encode status */
+ iri->utf8_encode = opt.enable_iri;
+ xfree (iri->orig_url);
+
+ input_file = url_file;
+ }
+ else
+ input_file = (char *) file;
+
+ url_list = (html ? get_urls_html (input_file, NULL, NULL, iri)
+ : get_urls_file (input_file));
+
+ xfree (url_file);
+
+ for (cur_url = url_list; cur_url; cur_url = cur_url->next, ++*count)
+ {
+ char *filename = NULL, *new_file = NULL, *proxy;
+ int dt = 0;
+ struct iri *tmpiri = iri_dup (iri);
+ struct url *parsed_url = NULL;
+
+ if (cur_url->ignore_when_downloading)
+ continue;
+
+ if (opt.quota && total_downloaded_bytes > opt.quota)
+ {
+ status = QUOTEXC;
+ break;
+ }
+
+ parsed_url = url_parse (cur_url->url->url, NULL, tmpiri, true);
+
+ proxy = getproxy (cur_url->url);
+ if ((opt.recursive || opt.page_requisites)
+ && ((cur_url->url->scheme != SCHEME_FTP
+#ifdef HAVE_SSL
+ && cur_url->url->scheme != SCHEME_FTPS
+#endif
+ ) || proxy))
+ {
+ int old_follow_ftp = opt.follow_ftp;
+
+ /* Turn opt.follow_ftp on in case of recursive FTP retrieval */
+ if (cur_url->url->scheme == SCHEME_FTP
+#ifdef HAVE_SSL
+ || cur_url->url->scheme == SCHEME_FTPS
+#endif
+ )
+ opt.follow_ftp = 1;
+
+ status = retrieve_tree (parsed_url ? parsed_url : cur_url->url,
+ tmpiri);
+
+ opt.follow_ftp = old_follow_ftp;
+ }
+ else
+ status = retrieve_url (parsed_url ? parsed_url : cur_url->url,
+ cur_url->url->url, &filename,
+ &new_file, NULL, &dt, opt.recursive, tmpiri,
+ true);
+ xfree (proxy);
+
+ if (parsed_url)
+ url_free (parsed_url);
+
+ if (filename && opt.delete_after && file_exists_p (filename, NULL))
+ {
+ DEBUGP (("\
+Removing file due to --delete-after in retrieve_from_file():\n"));
+ logprintf (LOG_VERBOSE, _("Removing %s.\n"), filename);
+ if (unlink (filename))
+ logprintf (LOG_NOTQUIET, "Failed to unlink %s: (%d) %s\n", filename, errno, strerror (errno));
+ dt &= ~RETROKF;
+ }
+
+ xfree (new_file);
+ xfree (filename);
+ iri_free (tmpiri);
+ }
+
+ /* Free the linked list of URL-s. */
+ free_urlpos (url_list);
+
+ iri_free (iri);
+
+ return status;
+}
+
+/* Print `giving up', or `retrying', depending on the impending
+ action. N1 and N2 are the attempt number and the attempt limit. */
+void
+printwhat (int n1, int n2)
+{
+ logputs (LOG_VERBOSE, (n1 == n2) ? _("Giving up.\n\n") : _("Retrying.\n\n"));
+}
+
+/* If opt.wait or opt.waitretry are specified, and if certain
+ conditions are met, sleep the appropriate number of seconds. See
+ the documentation of --wait and --waitretry for more information.
+
+ COUNT is the count of current retrieval, beginning with 1. */
+
+void
+sleep_between_retrievals (int count)
+{
+ static bool first_retrieval = true;
+
+ if (first_retrieval)
+ {
+ /* Don't sleep before the very first retrieval. */
+ first_retrieval = false;
+ return;
+ }
+
+ if (opt.waitretry && count > 1)
+ {
+ /* If opt.waitretry is specified and this is a retry, wait for
+ COUNT-1 number of seconds, or for opt.waitretry seconds. */
+ if (count <= opt.waitretry)
+ xsleep (count - 1);
+ else
+ xsleep (opt.waitretry);
+ }
+ else if (opt.wait)
+ {
+ if (!opt.random_wait || count > 1)
+ /* If random-wait is not specified, or if we are sleeping
+ between retries of the same download, sleep the fixed
+ interval. */
+ xsleep (opt.wait);
+ else
+ {
+ /* Sleep a random amount of time averaging in opt.wait
+ seconds. The sleeping amount ranges from 0.5*opt.wait to
+ 1.5*opt.wait. */
+ double waitsecs = (0.5 + random_float ()) * opt.wait;
+ DEBUGP (("sleep_between_retrievals: avg=%f,sleep=%f\n",
+ opt.wait, waitsecs));
+ xsleep (waitsecs);
+ }
+ }
+}
+
+/* Free the linked list of urlpos. */
+void
+free_urlpos (struct urlpos *l)
+{
+ while (l)
+ {
+ struct urlpos *next = l->next;
+ if (l->url)
+ url_free (l->url);
+ xfree (l->local_name);
+ xfree (l);
+ l = next;
+ }
+}
+
+/* Rotate FNAME opt.backups times */
+void
+rotate_backups(const char *fname)
+{
+#ifdef __VMS
+# define SEP "_"
+# define AVS ";*" /* All-version suffix. */
+# define AVSL (sizeof (AVS) - 1)
+#else
+# define SEP "."
+# define AVSL 0
+#endif
+
+ /* avoid alloca() here */
+ char from[1024], to[1024];
+ struct stat sb;
+ bool overflow;
+ int i;
+
+ if (stat (fname, &sb) == 0)
+ if (S_ISREG (sb.st_mode) == 0)
+ return;
+
+ for (i = opt.backups; i > 1; i--)
+ {
+#ifdef VMS
+ /* Delete (all versions of) any existing max-suffix file, to avoid
+ * creating multiple versions of it. (On VMS, rename() will
+ * create a new version of an existing destination file, not
+ * destroy/overwrite it.)
+ */
+ if (i == opt.backups)
+ {
+ if (((unsigned) snprintf (to, sizeof (to), "%s%s%d%s", fname, SEP, i, AVS)) >= sizeof (to))
+ logprintf (LOG_NOTQUIET, "Failed to delete %s: File name truncation\n", to);
+ else
+ delete (to);
+ }
+#endif
+ if ((overflow = ((unsigned) snprintf (to, sizeof (to), "%s%s%d", fname, SEP, i)) >= sizeof (to)))
+ errno = ENAMETOOLONG;
+ else if ((overflow = ((unsigned) snprintf (from, sizeof (from), "%s%s%d", fname, SEP, i - 1)) >= sizeof (from)))
+ errno = ENAMETOOLONG;
+ if (overflow || rename (from, to))
+ logprintf (LOG_NOTQUIET, "Failed to rename %s to %s: (%d) %s\n",
+ from, to, errno, strerror (errno));
+ }
+
+ if ((overflow = ((unsigned) snprintf (to, sizeof (to), "%s%s%d", fname, SEP, 1)) >= sizeof (to)))
+ errno = ENAMETOOLONG;
+ if (overflow || rename(fname, to))
+ logprintf (LOG_NOTQUIET, "Failed to rename %s to %s: (%d) %s\n",
+ fname, to, errno, strerror (errno));
+}
+
+static bool no_proxy_match (const char *, const char **);
+
+/* Return the URL of the proxy appropriate for url U. */
+
+static char *
+getproxy (struct url *u)
+{
+ char *proxy = NULL;
+ char *rewritten_url;
+
+ if (!opt.use_proxy)
+ return NULL;
+ if (no_proxy_match (u->host, (const char **)opt.no_proxy))
+ return NULL;
+
+ switch (u->scheme)
+ {
+ case SCHEME_HTTP:
+ proxy = opt.http_proxy ? opt.http_proxy : getenv ("http_proxy");
+ break;
+#ifdef HAVE_SSL
+ case SCHEME_HTTPS:
+ proxy = opt.https_proxy ? opt.https_proxy : getenv ("https_proxy");
+ break;
+ case SCHEME_FTPS:
+ proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftps_proxy");
+ break;
+#endif
+ case SCHEME_FTP:
+ proxy = opt.ftp_proxy ? opt.ftp_proxy : getenv ("ftp_proxy");
+ break;
+ case SCHEME_INVALID:
+ break;
+ }
+ if (!proxy || !*proxy)
+ return NULL;
+
+ /* Handle shorthands. `rewritten_storage' is a kludge to allow
+ getproxy() to return static storage. */
+ rewritten_url = rewrite_shorthand_url (proxy);
+ if (rewritten_url)
+ return rewritten_url;
+
+ return strdup(proxy);
+}
+
+/* Returns true if URL would be downloaded through a proxy. */
+
+bool
+url_uses_proxy (struct url * u)
+{
+ bool ret;
+ char *proxy;
+
+ if (!u)
+ return false;
+ proxy = getproxy (u);
+ ret = proxy != NULL;
+ xfree (proxy);
+ return ret;
+}
+
+/* Should a host be accessed through proxy, concerning no_proxy? */
+static bool
+no_proxy_match (const char *host, const char **no_proxy)
+{
+ if (!no_proxy)
+ return false;
+ else
+ return sufmatch (no_proxy, host);
+}
+
+/* Set the file parameter to point to the local file string. */
+void
+set_local_file (const char **file, const char *default_file)
+{
+ if (opt.output_document)
+ {
+ if (output_stream_regular)
+ *file = opt.output_document;
+ }
+ else
+ *file = default_file;
+}
+
+/* Return true for an input file's own URL, false otherwise. */
+bool
+input_file_url (const char *input_file)
+{
+ static bool first = true;
+
+ if (input_file
+ && url_has_scheme (input_file)
+ && first)
+ {
+ first = false;
+ return true;
+ }
+ else
+ return false;
+}
diff --git a/src/retr.h b/src/retr.h
new file mode 100644
index 0000000..9da2a27
--- /dev/null
+++ b/src/retr.h
@@ -0,0 +1,81 @@
+/* Declarations for retr.c.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef RETR_H
+#define RETR_H
+
+#include "url.h"
+
+extern int numurls;
+
+/* These global vars should be made static to retr.c and exported via
+ functions! */
+extern SUM_SIZE_INT total_downloaded_bytes;
+extern double total_download_time;
+extern FILE *output_stream;
+extern bool output_stream_regular;
+
+/* Flags for fd_read_body. */
+enum {
+ rb_read_exactly = 1,
+ rb_skip_startpos = 2,
+
+ /* Used by HTTP/HTTPS*/
+ rb_chunked_transfer_encoding = 4,
+
+ rb_compressed_gzip = 8
+};
+
+int fd_read_body (const char *, int, FILE *, wgint, wgint, wgint *, wgint *, double *, int, FILE *);
+
+typedef const char *(*hunk_terminator_t) (const char *, const char *, int);
+
+char *fd_read_hunk (int, hunk_terminator_t, long, long);
+char *fd_read_line (int);
+
+uerr_t retrieve_url (struct url *, const char *, char **, char **,
+ const char *, int *, bool, struct iri *, bool);
+uerr_t retrieve_from_file (const char *, bool, int *);
+
+const char *retr_rate (wgint, double);
+double calc_rate (wgint, double, int *);
+void printwhat (int, int);
+
+void sleep_between_retrievals (int);
+
+void rotate_backups (const char *);
+
+bool url_uses_proxy (struct url *);
+
+void set_local_file (const char **, const char *);
+
+bool input_file_url (const char *);
+
+#endif /* RETR_H */
diff --git a/src/spider.c b/src/spider.c
new file mode 100644
index 0000000..8727185
--- /dev/null
+++ b/src/spider.c
@@ -0,0 +1,101 @@
+/* Keep track of visited URLs in spider mode.
+ Copyright (C) 2006-2011, 2015, 2019-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "spider.h"
+#include "url.h"
+#include "utils.h"
+#include "hash.h"
+#include "res.h"
+
+
+static struct hash_table *nonexisting_urls_set;
+
+/* Cleanup the data structures associated with this file. */
+
+#if defined DEBUG_MALLOC || defined TESTING
+void
+spider_cleanup (void)
+{
+ if (nonexisting_urls_set)
+ string_set_free (nonexisting_urls_set);
+}
+#endif
+
+/* Remembers broken links. */
+void
+nonexisting_url (const char *url)
+{
+ /* Ignore robots.txt URLs */
+ if (is_robots_txt_url (url))
+ return;
+ if (!nonexisting_urls_set)
+ nonexisting_urls_set = make_string_hash_table (0);
+ string_set_add (nonexisting_urls_set, url);
+}
+
+void
+print_broken_links (void)
+{
+ hash_table_iterator iter;
+ int num_elems;
+
+ if (!nonexisting_urls_set)
+ {
+ logprintf (LOG_NOTQUIET, _("Found no broken links.\n\n"));
+ return;
+ }
+
+ num_elems = hash_table_count (nonexisting_urls_set);
+ assert (num_elems > 0);
+
+ logprintf (LOG_NOTQUIET, ngettext("Found %d broken link.\n\n",
+ "Found %d broken links.\n\n", num_elems),
+ num_elems);
+
+ for (hash_table_iterate (nonexisting_urls_set, &iter);
+ hash_table_iter_next (&iter); )
+ {
+ /* Struct url_list *list; */
+ const char *url = (const char *) iter.key;
+
+ logprintf (LOG_NOTQUIET, _("%s\n"), url);
+ }
+ logputs (LOG_NOTQUIET, "\n");
+}
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/src/spider.h b/src/spider.h
new file mode 100644
index 0000000..48e0ae8
--- /dev/null
+++ b/src/spider.h
@@ -0,0 +1,39 @@
+/* Declarations for spider.c
+ Copyright (C) 2006-2011, 2015, 2019-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef SPIDER_H
+#define SPIDER_H
+
+#define visited_url(a,b)
+void nonexisting_url (const char *);
+void print_broken_links (void);
+void spider_cleanup (void);
+
+#endif /* SPIDER_H */
diff --git a/src/ssl.h b/src/ssl.h
new file mode 100644
index 0000000..e348252
--- /dev/null
+++ b/src/ssl.h
@@ -0,0 +1,40 @@
+/* SSL support.
+ Copyright (C) 2000-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+ Originally contributed by Christian Fraenkel.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef GEN_SSLFUNC_H
+#define GEN_SSLFUNC_H
+
+bool ssl_init (void);
+void ssl_cleanup (void);
+bool ssl_connect_wget (int, const char *, int *);
+bool ssl_check_certificate (int, const char *);
+
+#endif /* GEN_SSLFUNC_H */
diff --git a/src/sysdep.h b/src/sysdep.h
new file mode 100644
index 0000000..f623e8d
--- /dev/null
+++ b/src/sysdep.h
@@ -0,0 +1,59 @@
+/* Dirty system-dependent hacks.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* This file is included by wget.h. Random .c files need not include
+ it. */
+
+#ifndef SYSDEP_H
+#define SYSDEP_H
+
+/* Provided by gnulib on systems that don't have it: */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#ifdef WINDOWS
+/* Windows doesn't have some functions normally found on Unix-like
+ systems, such as strcasecmp, strptime, etc. Include mswindows.h so
+ we get the declarations for their replacements in mswindows.c, as
+ well as to pick up Windows-specific includes and constants. To be
+ able to test for such features, the file must be included as early
+ as possible. */
+# include "mswindows.h"
+#endif
+
+#include <stdbool.h>
+#include <limits.h>
+#include <fnmatch.h>
+#include "intprops.h"
+
+#endif /* SYSDEP_H */
diff --git a/src/url.c b/src/url.c
new file mode 100644
index 0000000..950002b
--- /dev/null
+++ b/src/url.c
@@ -0,0 +1,2540 @@
+/* URL handling.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "utils.h"
+#include "url.h"
+#include "host.h" /* for is_valid_ipv6_address */
+#include "c-strcase.h"
+
+#ifdef HAVE_ICONV
+# include <iconv.h>
+#endif
+#include <langinfo.h>
+
+#ifdef __VMS
+#include "vms.h"
+#endif /* def __VMS */
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+enum {
+ scm_disabled = 1, /* for https when OpenSSL fails to init. */
+ scm_has_params = 2, /* whether scheme has ;params */
+ scm_has_query = 4, /* whether scheme has ?query */
+ scm_has_fragment = 8 /* whether scheme has #fragment */
+};
+
+struct scheme_data
+{
+ /* Short name of the scheme, such as "http" or "ftp". */
+ const char *name;
+ /* Leading string that identifies the scheme, such as "https://". */
+ const char *leading_string;
+ /* Default port of the scheme when none is specified. */
+ int default_port;
+ /* Various flags. */
+ int flags;
+};
+
+/* Supported schemes: */
+static struct scheme_data supported_schemes[] =
+{
+ { "http", "http://", DEFAULT_HTTP_PORT, scm_has_query|scm_has_fragment },
+#ifdef HAVE_SSL
+ { "https", "https://", DEFAULT_HTTPS_PORT, scm_has_query|scm_has_fragment },
+#endif
+ { "ftp", "ftp://", DEFAULT_FTP_PORT, scm_has_params|scm_has_fragment },
+#ifdef HAVE_SSL
+ /*
+ * Explicit FTPS uses the same port as FTP.
+ * Implicit FTPS has its own port (990), but it is disabled by default.
+ */
+ { "ftps", "ftps://", DEFAULT_FTP_PORT, scm_has_params|scm_has_fragment },
+#endif
+
+ /* SCHEME_INVALID */
+ { NULL, NULL, -1, 0 }
+};
+
+/* Forward declarations: */
+
+static bool path_simplify (enum url_scheme, char *);
+
+/* Support for escaping and unescaping of URL strings. */
+
+/* Table of "reserved" and "unsafe" characters. Those terms are
+ rfc1738-speak, as such largely obsoleted by rfc2396 and later
+ specs, but the general idea remains.
+
+ A reserved character is the one that you can't decode without
+ changing the meaning of the URL. For example, you can't decode
+ "/foo/%2f/bar" into "/foo///bar" because the number and contents of
+ path components is different. Non-reserved characters can be
+ changed, so "/foo/%78/bar" is safe to change to "/foo/x/bar". The
+ unsafe characters are loosely based on rfc1738, plus "$" and ",",
+ as recommended by rfc2396, and minus "~", which is very frequently
+ used (and sometimes unrecognized as %7E by broken servers).
+
+ An unsafe character is the one that should be encoded when URLs are
+ placed in foreign environments. E.g. space and newline are unsafe
+ in HTTP contexts because HTTP uses them as separator and line
+ terminator, so they must be encoded to %20 and %0A respectively.
+ "*" is unsafe in shell context, etc.
+
+ We determine whether a character is unsafe through static table
+ lookup. This code assumes ASCII character set and 8-bit chars. */
+
+enum {
+ /* rfc1738 reserved chars + "$" and ",". */
+ urlchr_reserved = 1,
+
+ /* rfc1738 unsafe chars, plus non-printables. */
+ urlchr_unsafe = 2
+};
+
+#define urlchr_test(c, mask) (urlchr_table[(unsigned char)(c)] & (mask))
+#define URL_RESERVED_CHAR(c) urlchr_test(c, urlchr_reserved)
+#define URL_UNSAFE_CHAR(c) urlchr_test(c, urlchr_unsafe)
+
+/* Shorthands for the table: */
+#define R urlchr_reserved
+#define U urlchr_unsafe
+#define RU R|U
+
+static const unsigned char urlchr_table[256] =
+{
+ U, U, U, U, U, U, U, U, /* NUL SOH STX ETX EOT ENQ ACK BEL */
+ U, U, U, U, U, U, U, U, /* BS HT LF VT FF CR SO SI */
+ U, U, U, U, U, U, U, U, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
+ U, U, U, U, U, U, U, U, /* CAN EM SUB ESC FS GS RS US */
+ U, 0, U, RU, R, U, R, 0, /* SP ! " # $ % & ' */
+ 0, 0, 0, R, R, 0, 0, R, /* ( ) * + , - . / */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
+ 0, 0, RU, R, U, R, U, R, /* 8 9 : ; < = > ? */
+ RU, 0, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* H I J K L M N O */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* P Q R S T U V W */
+ 0, 0, 0, RU, U, RU, U, 0, /* X Y Z [ \ ] ^ _ */
+ U, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
+ 0, 0, 0, U, U, U, 0, U, /* x y z { | } ~ DEL */
+
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+ U, U, U, U, U, U, U, U, U, U, U, U, U, U, U, U,
+};
+#undef R
+#undef U
+#undef RU
+
+static void
+url_unescape_1 (char *s, unsigned char mask)
+{
+ unsigned char *t = (unsigned char *) s; /* t - tortoise */
+ unsigned char *h = (unsigned char *) s; /* h - hare */
+
+ for (; *h; h++, t++)
+ {
+ if (*h != '%')
+ {
+ copychar:
+ *t = *h;
+ }
+ else
+ {
+ unsigned char c;
+ /* Do nothing if '%' is not followed by two hex digits. */
+ if (!h[1] || !h[2] || !(c_isxdigit (h[1]) && c_isxdigit (h[2])))
+ goto copychar;
+ c = X2DIGITS_TO_NUM (h[1], h[2]);
+ if (urlchr_test(c, mask))
+ goto copychar;
+ /* Don't unescape %00 because there is no way to insert it
+ into a C string without effectively truncating it. */
+ if (c == '\0')
+ goto copychar;
+ *t = c;
+ h += 2;
+ }
+ }
+ *t = '\0';
+}
+
+/* URL-unescape the string S.
+
+ This is done by transforming the sequences "%HH" to the character
+ represented by the hexadecimal digits HH. If % is not followed by
+ two hexadecimal digits, it is inserted literally.
+
+ The transformation is done in place. If you need the original
+ string intact, make a copy before calling this function. */
+void
+url_unescape (char *s)
+{
+ url_unescape_1 (s, 0);
+}
+
+/* URL-unescape the string S.
+
+ This functions behaves identically as url_unescape(), but does not
+ convert characters from "reserved". In other words, it only converts
+ "unsafe" characters. */
+void
+url_unescape_except_reserved (char *s)
+{
+ url_unescape_1 (s, urlchr_reserved);
+}
+
+/* The core of url_escape_* functions. Escapes the characters that
+ match the provided mask in urlchr_table.
+
+ If ALLOW_PASSTHROUGH is true, a string with no unsafe chars will be
+ returned unchanged. If ALLOW_PASSTHROUGH is false, a freshly
+ allocated string will be returned in all cases. */
+
+static char *
+url_escape_1 (const char *s, unsigned char mask, bool allow_passthrough)
+{
+ const char *p1;
+ char *p2, *newstr;
+ int newlen;
+ int addition = 0;
+
+ for (p1 = s; *p1; p1++)
+ if (urlchr_test (*p1, mask))
+ addition += 2; /* Two more characters (hex digits) */
+
+ if (!addition)
+ return allow_passthrough ? (char *)s : xstrdup (s);
+
+ newlen = (p1 - s) + addition;
+ newstr = xmalloc (newlen + 1);
+
+ p1 = s;
+ p2 = newstr;
+ while (*p1)
+ {
+ /* Quote the characters that match the test mask. */
+ if (urlchr_test (*p1, mask))
+ {
+ unsigned char c = *p1++;
+ *p2++ = '%';
+ *p2++ = XNUM_TO_DIGIT (c >> 4);
+ *p2++ = XNUM_TO_DIGIT (c & 0xf);
+ }
+ else
+ *p2++ = *p1++;
+ }
+ assert (p2 - newstr == newlen);
+ *p2 = '\0';
+
+ return newstr;
+}
+
+/* URL-escape the unsafe characters (see urlchr_table) in a given
+ string, returning a freshly allocated string. */
+
+char *
+url_escape (const char *s)
+{
+ return url_escape_1 (s, urlchr_unsafe, false);
+}
+
+/* URL-escape the unsafe and reserved characters (see urlchr_table) in
+ a given string, returning a freshly allocated string. */
+
+char *
+url_escape_unsafe_and_reserved (const char *s)
+{
+ return url_escape_1 (s, urlchr_unsafe|urlchr_reserved, false);
+}
+
+/* URL-escape the unsafe characters (see urlchr_table) in a given
+ string. If no characters are unsafe, S is returned. */
+
+static char *
+url_escape_allow_passthrough (const char *s)
+{
+ return url_escape_1 (s, urlchr_unsafe, true);
+}
+
+/* Decide whether the char at position P needs to be encoded. (It is
+ not enough to pass a single char *P because the function may need
+ to inspect the surrounding context.)
+
+ Return true if the char should be escaped as %XX, false otherwise. */
+
+static inline bool
+char_needs_escaping (const char *p)
+{
+ if (*p == '%')
+ {
+ if (c_isxdigit (*(p + 1)) && c_isxdigit (*(p + 2)))
+ return false;
+ else
+ /* Garbled %.. sequence: encode `%'. */
+ return true;
+ }
+ else if (URL_UNSAFE_CHAR (*p) && !URL_RESERVED_CHAR (*p))
+ return true;
+ else
+ return false;
+}
+
+/* Translate a %-escaped (but possibly non-conformant) input string S
+ into a %-escaped (and conformant) output string. If no characters
+ are encoded or decoded, return the same string S; otherwise, return
+ a freshly allocated string with the new contents.
+
+ After a URL has been run through this function, the protocols that
+ use `%' as the quote character can use the resulting string as-is,
+ while those that don't can use url_unescape to get to the intended
+ data. This function is stable: once the input is transformed,
+ further transformations of the result yield the same output.
+
+ Let's discuss why this function is needed.
+
+ Imagine Wget is asked to retrieve `http://abc.xyz/abc def'. Since
+ a raw space character would mess up the HTTP request, it needs to
+ be quoted, like this:
+
+ GET /abc%20def HTTP/1.0
+
+ It would appear that the unsafe chars need to be quoted, for
+ example with url_escape. But what if we're requested to download
+ `abc%20def'? url_escape transforms "%" to "%25", which would leave
+ us with `abc%2520def'. This is incorrect -- since %-escapes are
+ part of URL syntax, "%20" is the correct way to denote a literal
+ space on the Wget command line. This leads to the conclusion that
+ in that case Wget should not call url_escape, but leave the `%20'
+ as is. This is clearly contradictory, but it only gets worse.
+
+ What if the requested URI is `abc%20 def'? If we call url_escape,
+ we end up with `/abc%2520%20def', which is almost certainly not
+ intended. If we don't call url_escape, we are left with the
+ embedded space and cannot complete the request. What the user
+ meant was for Wget to request `/abc%20%20def', and this is where
+ reencode_escapes kicks in.
+
+ Wget used to solve this by first decoding %-quotes, and then
+ encoding all the "unsafe" characters found in the resulting string.
+ This was wrong because it didn't preserve certain URL special
+ (reserved) characters. For instance, URI containing "a%2B+b" (0x2b
+ == '+') would get translated to "a%2B%2Bb" or "a++b" depending on
+ whether we considered `+' reserved (it is). One of these results
+ is inevitable because by the second step we would lose information
+ on whether the `+' was originally encoded or not. Both results
+ were wrong because in CGI parameters + means space, while %2B means
+ literal plus. reencode_escapes correctly translates the above to
+ "a%2B+b", i.e. returns the original string.
+
+ This function uses a modified version of the algorithm originally
+ proposed by Anon Sricharoenchai:
+
+ * Encode all "unsafe" characters, except those that are also
+ "reserved", to %XX. See urlchr_table for which characters are
+ unsafe and reserved.
+
+ * Encode the "%" characters not followed by two hex digits to
+ "%25".
+
+ * Pass through all other characters and %XX escapes as-is. (Up to
+ Wget 1.10 this decoded %XX escapes corresponding to "safe"
+ characters, but that was obtrusive and broke some servers.)
+
+ Anon's test case:
+
+ "http://abc.xyz/%20%3F%%36%31%25aa% a?a=%61+a%2Ba&b=b%26c%3Dc"
+ ->
+ "http://abc.xyz/%20%3F%25%36%31%25aa%25%20a?a=%61+a%2Ba&b=b%26c%3Dc"
+
+ Simpler test cases:
+
+ "foo bar" -> "foo%20bar"
+ "foo%20bar" -> "foo%20bar"
+ "foo %20bar" -> "foo%20%20bar"
+ "foo%%20bar" -> "foo%25%20bar" (0x25 == '%')
+ "foo%25%20bar" -> "foo%25%20bar"
+ "foo%2%20bar" -> "foo%252%20bar"
+ "foo+bar" -> "foo+bar" (plus is reserved!)
+ "foo%2b+bar" -> "foo%2b+bar" */
+
+static char *
+reencode_escapes (const char *s)
+{
+ const char *p1;
+ char *newstr, *p2;
+ int oldlen, newlen;
+
+ int encode_count = 0;
+
+ /* First pass: inspect the string to see if there's anything to do,
+ and to calculate the new length. */
+ for (p1 = s; *p1; p1++)
+ if (char_needs_escaping (p1))
+ ++encode_count;
+
+ if (!encode_count)
+ /* The string is good as it is. */
+ return (char *) s; /* C const model sucks. */
+
+ oldlen = p1 - s;
+ /* Each encoding adds two characters (hex digits). */
+ newlen = oldlen + 2 * encode_count;
+ newstr = xmalloc (newlen + 1);
+
+ /* Second pass: copy the string to the destination address, encoding
+ chars when needed. */
+ p1 = s;
+ p2 = newstr;
+
+ while (*p1)
+ if (char_needs_escaping (p1))
+ {
+ unsigned char c = *p1++;
+ *p2++ = '%';
+ *p2++ = XNUM_TO_DIGIT (c >> 4);
+ *p2++ = XNUM_TO_DIGIT (c & 0xf);
+ }
+ else
+ *p2++ = *p1++;
+
+ *p2 = '\0';
+ assert (p2 - newstr == newlen);
+ return newstr;
+}
+
+/* Returns the scheme type if the scheme is supported, or
+ SCHEME_INVALID if not. */
+
+enum url_scheme
+url_scheme (const char *url)
+{
+ int i;
+
+ for (i = 0; supported_schemes[i].leading_string; i++)
+ if (0 == c_strncasecmp (url, supported_schemes[i].leading_string,
+ strlen (supported_schemes[i].leading_string)))
+ {
+ if (!(supported_schemes[i].flags & scm_disabled))
+ return (enum url_scheme) i;
+ else
+ return SCHEME_INVALID;
+ }
+
+ return SCHEME_INVALID;
+}
+
+#define SCHEME_CHAR(ch) (c_isalnum (ch) || (ch) == '-' || (ch) == '+')
+
+/* Return 1 if the URL begins with any "scheme", 0 otherwise. As
+ currently implemented, it returns true if URL begins with
+ [-+a-zA-Z0-9]+: . */
+
+bool
+url_has_scheme (const char *url)
+{
+ const char *p = url;
+
+ /* The first char must be a scheme char. */
+ if (!*p || !SCHEME_CHAR (*p))
+ return false;
+ ++p;
+ /* Followed by 0 or more scheme chars. */
+ while (*p && SCHEME_CHAR (*p))
+ ++p;
+ /* Terminated by ':'. */
+ return *p == ':';
+}
+
+bool
+url_valid_scheme (const char *url)
+{
+ enum url_scheme scheme = url_scheme (url);
+ return scheme != SCHEME_INVALID;
+}
+
+int
+scheme_default_port (enum url_scheme scheme)
+{
+ return supported_schemes[scheme].default_port;
+}
+
+void
+scheme_disable (enum url_scheme scheme)
+{
+ supported_schemes[scheme].flags |= scm_disabled;
+}
+
+const char *
+scheme_leading_string (enum url_scheme scheme)
+{
+ return supported_schemes[scheme].leading_string;
+}
+
+/* Skip the username and password, if present in the URL. The
+ function should *not* be called with the complete URL, but with the
+ portion after the scheme.
+
+ If no username and password are found, return URL. */
+
+static const char *
+url_skip_credentials (const char *url)
+{
+ /* Look for '@' that comes before terminators, such as '/', '?',
+ '#', or ';'. */
+ const char *p = (const char *)strpbrk (url, "@/?#;");
+ if (!p || *p != '@')
+ return url;
+ return p + 1;
+}
+
+/* Parse credentials contained in [BEG, END). The region is expected
+ to have come from a URL and is unescaped. */
+
+static bool
+parse_credentials (const char *beg, const char *end, char **user, char **passwd)
+{
+ char *colon;
+ const char *userend;
+
+ if (beg == end)
+ return false; /* empty user name */
+
+ colon = memchr (beg, ':', end - beg);
+ if (colon == beg)
+ return false; /* again empty user name */
+
+ if (colon)
+ {
+ *passwd = strdupdelim (colon + 1, end);
+ userend = colon;
+ url_unescape (*passwd);
+ }
+ else
+ {
+ *passwd = NULL;
+ userend = end;
+ }
+ *user = strdupdelim (beg, userend);
+ url_unescape (*user);
+ return true;
+}
+
+/* Used by main.c: detect URLs written using the "shorthand" URL forms
+ originally popularized by Netscape and NcFTP. HTTP shorthands look
+ like this:
+
+ www.foo.com[:port]/dir/file -> http://www.foo.com[:port]/dir/file
+ www.foo.com[:port] -> http://www.foo.com[:port]
+
+ FTP shorthands look like this:
+
+ foo.bar.com:dir/file -> ftp://foo.bar.com/dir/file
+ foo.bar.com:/absdir/file -> ftp://foo.bar.com//absdir/file
+
+ If the URL needs not or cannot be rewritten, return NULL. */
+
+char *
+rewrite_shorthand_url (const char *url)
+{
+ const char *p;
+ char *ret;
+
+ if (url_scheme (url) != SCHEME_INVALID)
+ return NULL;
+
+ /* Look for a ':' or '/'. The former signifies NcFTP syntax, the
+ latter Netscape. */
+ p = strpbrk (url, ":/");
+ if (p == url)
+ return NULL;
+
+ /* If we're looking at "://", it means the URL uses a scheme we
+ don't support, which may include "https" when compiled without
+ SSL support. Don't bogusly rewrite such URLs. */
+ if (p && p[0] == ':' && p[1] == '/' && p[2] == '/')
+ return NULL;
+
+ if (p && *p == ':')
+ {
+ /* Colon indicates ftp, as in foo.bar.com:path. Check for
+ special case of http port number ("localhost:10000"). */
+ int digits = strspn (p + 1, "0123456789");
+ if (digits && (p[1 + digits] == '/' || p[1 + digits] == '\0'))
+ goto http;
+
+ /* Turn "foo.bar.com:path" to "ftp://foo.bar.com/path". */
+ if ((ret = aprintf ("ftp://%s", url)) != NULL)
+ ret[6 + (p - url)] = '/';
+ }
+ else
+ {
+ http:
+ /* Just prepend "http://" to URL. */
+ ret = aprintf ("http://%s", url);
+ }
+ return ret;
+}
+
+static void split_path (const char *, char **, char **);
+
+/* Like strpbrk, with the exception that it returns the pointer to the
+ terminating zero (end-of-string aka "eos") if no matching character
+ is found. */
+
+static inline char *
+strpbrk_or_eos (const char *s, const char *accept)
+{
+ char *p = strpbrk (s, accept);
+ if (!p)
+ p = strchr (s, '\0');
+ return p;
+}
+
+/* Turn STR into lowercase; return true if a character was actually
+ changed. */
+
+static bool
+lowercase_str (char *str)
+{
+ bool changed = false;
+ for (; *str; str++)
+ if (c_isupper (*str))
+ {
+ changed = true;
+ *str = c_tolower (*str);
+ }
+ return changed;
+}
+
+static const char *
+init_seps (enum url_scheme scheme)
+{
+ static char seps[8] = ":/";
+ char *p = seps + 2;
+ int flags = supported_schemes[scheme].flags;
+
+ if (flags & scm_has_params)
+ *p++ = ';';
+ if (flags & scm_has_query)
+ *p++ = '?';
+ if (flags & scm_has_fragment)
+ *p++ = '#';
+ *p = '\0';
+ return seps;
+}
+
+static const char *parse_errors[] = {
+#define PE_NO_ERROR 0
+ N_("No error"),
+#define PE_UNSUPPORTED_SCHEME 1
+ N_("Unsupported scheme %s"), /* support for format token only here */
+#define PE_MISSING_SCHEME 2
+ N_("Scheme missing"),
+#define PE_INVALID_HOST_NAME 3
+ N_("Invalid host name"),
+#define PE_BAD_PORT_NUMBER 4
+ N_("Bad port number"),
+#define PE_INVALID_USER_NAME 5
+ N_("Invalid user name"),
+#define PE_UNTERMINATED_IPV6_ADDRESS 6
+ N_("Unterminated IPv6 numeric address"),
+#define PE_IPV6_NOT_SUPPORTED 7
+ N_("IPv6 addresses not supported"),
+#define PE_INVALID_IPV6_ADDRESS 8
+ N_("Invalid IPv6 numeric address")
+};
+
+/* Parse a URL.
+
+ Return a new struct url if successful, NULL on error. In case of
+ error, and if ERROR is not NULL, also set *ERROR to the appropriate
+ error code. */
+struct url *
+url_parse (const char *url, int *error, struct iri *iri, bool percent_encode)
+{
+ struct url *u;
+ const char *p;
+ bool path_modified, host_modified;
+
+ enum url_scheme scheme;
+ const char *seps;
+
+ const char *uname_b, *uname_e;
+ const char *host_b, *host_e;
+ const char *path_b, *path_e;
+ const char *params_b, *params_e;
+ const char *query_b, *query_e;
+ const char *fragment_b, *fragment_e;
+
+ int port;
+ char *user = NULL, *passwd = NULL;
+
+ const char *url_encoded = NULL;
+
+ int error_code;
+
+ scheme = url_scheme (url);
+ if (scheme == SCHEME_INVALID)
+ {
+ if (url_has_scheme (url))
+ error_code = PE_UNSUPPORTED_SCHEME;
+ else
+ error_code = PE_MISSING_SCHEME;
+ goto error;
+ }
+
+ url_encoded = url;
+
+ if (iri && iri->utf8_encode)
+ {
+ char *new_url = NULL;
+
+ iri->utf8_encode = remote_to_utf8 (iri, iri->orig_url ? iri->orig_url : url, &new_url);
+ if (!iri->utf8_encode)
+ new_url = NULL;
+ else
+ {
+ xfree (iri->orig_url);
+ iri->orig_url = xstrdup (url);
+ url_encoded = reencode_escapes (new_url);
+ if (url_encoded != new_url)
+ xfree (new_url);
+ percent_encode = false;
+ }
+ }
+
+ if (percent_encode)
+ url_encoded = reencode_escapes (url);
+
+ p = url_encoded;
+ p += strlen (supported_schemes[scheme].leading_string);
+ uname_b = p;
+ p = url_skip_credentials (p);
+ uname_e = p;
+
+ /* scheme://user:pass@host[:port]... */
+ /* ^ */
+
+ /* We attempt to break down the URL into the components path,
+ params, query, and fragment. They are ordered like this:
+
+ scheme://host[:port][/path][;params][?query][#fragment] */
+
+ path_b = path_e = NULL;
+ params_b = params_e = NULL;
+ query_b = query_e = NULL;
+ fragment_b = fragment_e = NULL;
+
+ /* Initialize separators for optional parts of URL, depending on the
+ scheme. For example, FTP has params, and HTTP and HTTPS have
+ query string and fragment. */
+ seps = init_seps (scheme);
+
+ host_b = p;
+
+ if (*p == '[')
+ {
+ /* Handle IPv6 address inside square brackets. Ideally we'd
+ just look for the terminating ']', but rfc2732 mandates
+ rejecting invalid IPv6 addresses. */
+
+ /* The address begins after '['. */
+ host_b = p + 1;
+ host_e = strchr (host_b, ']');
+
+ if (!host_e)
+ {
+ error_code = PE_UNTERMINATED_IPV6_ADDRESS;
+ goto error;
+ }
+
+#ifdef ENABLE_IPV6
+ /* Check if the IPv6 address is valid. */
+ if (!is_valid_ipv6_address(host_b, host_e))
+ {
+ error_code = PE_INVALID_IPV6_ADDRESS;
+ goto error;
+ }
+
+ /* Continue parsing after the closing ']'. */
+ p = host_e + 1;
+#else
+ error_code = PE_IPV6_NOT_SUPPORTED;
+ goto error;
+#endif
+
+ /* The closing bracket must be followed by a separator or by the
+ null char. */
+ /* http://[::1]... */
+ /* ^ */
+ if (!strchr (seps, *p))
+ {
+ /* Trailing garbage after []-delimited IPv6 address. */
+ error_code = PE_INVALID_HOST_NAME;
+ goto error;
+ }
+ }
+ else
+ {
+ p = strpbrk_or_eos (p, seps);
+ host_e = p;
+ }
+ ++seps; /* advance to '/' */
+
+ if (host_b == host_e)
+ {
+ error_code = PE_INVALID_HOST_NAME;
+ goto error;
+ }
+
+ port = scheme_default_port (scheme);
+ if (*p == ':')
+ {
+ const char *port_b, *port_e, *pp;
+
+ /* scheme://host:port/tralala */
+ /* ^ */
+ ++p;
+ port_b = p;
+ p = strpbrk_or_eos (p, seps);
+ port_e = p;
+
+ /* Allow empty port, as per rfc2396. */
+ if (port_b != port_e)
+ for (port = 0, pp = port_b; pp < port_e; pp++)
+ {
+ if (!c_isdigit (*pp))
+ {
+ /* http://host:12randomgarbage/blah */
+ /* ^ */
+ error_code = PE_BAD_PORT_NUMBER;
+ goto error;
+ }
+ port = 10 * port + (*pp - '0');
+ /* Check for too large port numbers here, before we have
+ a chance to overflow on bogus port values. */
+ if (port > 0xffff)
+ {
+ error_code = PE_BAD_PORT_NUMBER;
+ goto error;
+ }
+ }
+ }
+ /* Advance to the first separator *after* '/' (either ';' or '?',
+ depending on the scheme). */
+ ++seps;
+
+ /* Get the optional parts of URL, each part being delimited by
+ current location and the position of the next separator. */
+#define GET_URL_PART(sepchar, var) do { \
+ if (*p == sepchar) \
+ var##_b = ++p, var##_e = p = strpbrk_or_eos (p, seps); \
+ ++seps; \
+} while (0)
+
+ GET_URL_PART ('/', path);
+ if (supported_schemes[scheme].flags & scm_has_params)
+ GET_URL_PART (';', params);
+ if (supported_schemes[scheme].flags & scm_has_query)
+ GET_URL_PART ('?', query);
+ if (supported_schemes[scheme].flags & scm_has_fragment)
+ GET_URL_PART ('#', fragment);
+
+#undef GET_URL_PART
+ assert (*p == 0);
+
+ if (uname_b != uname_e)
+ {
+ /* http://user:pass@host */
+ /* ^ ^ */
+ /* uname_b uname_e */
+ if (!parse_credentials (uname_b, uname_e - 1, &user, &passwd))
+ {
+ error_code = PE_INVALID_USER_NAME;
+ goto error;
+ }
+ }
+
+ u = xnew0 (struct url);
+ u->scheme = scheme;
+ u->host = strdupdelim (host_b, host_e);
+ u->port = port;
+ u->user = user;
+ u->passwd = passwd;
+
+ u->path = strdupdelim (path_b, path_e);
+ path_modified = path_simplify (scheme, u->path);
+ split_path (u->path, &u->dir, &u->file);
+
+ host_modified = lowercase_str (u->host);
+
+ /* Decode %HH sequences in host name. This is important not so much
+ to support %HH sequences in host names (which other browser
+ don't), but to support binary characters (which will have been
+ converted to %HH by reencode_escapes). */
+ if (strchr (u->host, '%'))
+ {
+ url_unescape (u->host);
+ host_modified = true;
+
+ /* check for invalid control characters in host name */
+ for (p = u->host; *p; p++)
+ {
+ if (c_iscntrl(*p))
+ {
+ url_free(u);
+ error_code = PE_INVALID_HOST_NAME;
+ goto error;
+ }
+ }
+
+ /* Apply IDNA regardless of iri->utf8_encode status */
+ if (opt.enable_iri && iri)
+ {
+ char *new = idn_encode (iri, u->host);
+ if (new)
+ {
+ xfree (u->host);
+ u->host = new;
+ host_modified = true;
+ }
+ }
+ }
+
+ if (params_b)
+ u->params = strdupdelim (params_b, params_e);
+ if (query_b)
+ u->query = strdupdelim (query_b, query_e);
+ if (fragment_b)
+ u->fragment = strdupdelim (fragment_b, fragment_e);
+
+ if (opt.enable_iri || path_modified || u->fragment || host_modified || path_b == path_e)
+ {
+ /* If we suspect that a transformation has rendered what
+ url_string might return different from URL_ENCODED, rebuild
+ u->url using url_string. */
+ u->url = url_string (u, URL_AUTH_SHOW);
+
+ if (url_encoded != url)
+ xfree (url_encoded);
+ }
+ else
+ {
+ if (url_encoded == url)
+ u->url = xstrdup (url);
+ else
+ u->url = (char *) url_encoded;
+ }
+
+ return u;
+
+ error:
+ /* Cleanup in case of error: */
+ if (url_encoded && url_encoded != url)
+ xfree (url_encoded);
+
+ /* Transmit the error code to the caller, if the caller wants to
+ know. */
+ if (error)
+ *error = error_code;
+ return NULL;
+}
+
+/* Return the error message string from ERROR_CODE, which should have
+ been retrieved from url_parse. The error message is translated. */
+
+char *
+url_error (const char *url, int error_code)
+{
+ assert (error_code >= 0 && ((size_t) error_code) < countof (parse_errors));
+
+ if (error_code == PE_UNSUPPORTED_SCHEME)
+ {
+ char *error, *p;
+ char *scheme = xstrdup (url);
+ assert (url_has_scheme (url));
+
+ if ((p = strchr (scheme, ':')))
+ *p = '\0';
+ if (!c_strcasecmp (scheme, "https"))
+ error = aprintf (_("HTTPS support not compiled in"));
+ else
+ error = aprintf (_(parse_errors[error_code]), quote (scheme));
+ xfree (scheme);
+
+ return error;
+ }
+ else
+ return xstrdup (_(parse_errors[error_code]));
+}
+
+/* Split PATH into DIR and FILE. PATH comes from the URL and is
+ expected to be URL-escaped.
+
+ The path is split into directory (the part up to the last slash)
+ and file (the part after the last slash), which are subsequently
+ unescaped. Examples:
+
+ PATH DIR FILE
+ "foo/bar/baz" "foo/bar" "baz"
+ "foo/bar/" "foo/bar" ""
+ "foo" "" "foo"
+ "foo/bar/baz%2fqux" "foo/bar" "baz/qux" (!)
+
+ DIR and FILE are freshly allocated. */
+
+static void
+split_path (const char *path, char **dir, char **file)
+{
+ char *last_slash = strrchr (path, '/');
+ if (!last_slash)
+ {
+ *dir = xstrdup ("");
+ *file = xstrdup (path);
+ }
+ else
+ {
+ *dir = strdupdelim (path, last_slash);
+ *file = xstrdup (last_slash + 1);
+ }
+ url_unescape (*dir);
+ url_unescape (*file);
+}
+
+/* Note: URL's "full path" is the path with the query string and
+ params appended. The "fragment" (#foo) is intentionally ignored,
+ but that might be changed. For example, if the original URL was
+ "http://host:port/foo/bar/baz;bullshit?querystring#uselessfragment",
+ the full path will be "/foo/bar/baz;bullshit?querystring". */
+
+/* Return the length of the full path, without the terminating
+ zero. */
+
+static int
+full_path_length (const struct url *url)
+{
+ int len = 0;
+
+#define FROB(el) if (url->el) len += 1 + strlen (url->el)
+
+ FROB (path);
+ FROB (params);
+ FROB (query);
+
+#undef FROB
+
+ return len;
+}
+
+/* Write out the full path. */
+
+static void
+full_path_write (const struct url *url, char *where)
+{
+#define FROB(el, chr) do { \
+ char *f_el = url->el; \
+ if (f_el) { \
+ int l = strlen (f_el); \
+ *where++ = chr; \
+ memcpy (where, f_el, l); \
+ where += l; \
+ } \
+} while (0)
+
+ FROB (path, '/');
+ FROB (params, ';');
+ FROB (query, '?');
+
+#undef FROB
+}
+
+/* Public function for getting the "full path". E.g. if u->path is
+ "foo/bar" and u->query is "param=value", full_path will be
+ "/foo/bar?param=value". */
+
+char *
+url_full_path (const struct url *url)
+{
+ int length = full_path_length (url);
+ char *full_path = xmalloc (length + 1);
+
+ full_path_write (url, full_path);
+ full_path[length] = '\0';
+
+ return full_path;
+}
+
+/* Unescape CHR in an otherwise escaped STR. Used to selectively
+ escaping of certain characters, such as "/" and ":". Returns a
+ count of unescaped chars. */
+
+static void
+unescape_single_char (char *str, char chr)
+{
+ const char c1 = XNUM_TO_DIGIT (chr >> 4);
+ const char c2 = XNUM_TO_DIGIT (chr & 0xf);
+ char *h = str; /* hare */
+ char *t = str; /* tortoise */
+ for (; *h; h++, t++)
+ {
+ if (h[0] == '%' && h[1] == c1 && h[2] == c2)
+ {
+ *t = chr;
+ h += 2;
+ }
+ else
+ *t = *h;
+ }
+ *t = '\0';
+}
+
+/* Escape unsafe and reserved characters, except for the slash
+ characters. */
+
+static char *
+url_escape_dir (const char *dir)
+{
+ char *newdir = url_escape_1 (dir, urlchr_unsafe | urlchr_reserved, 1);
+ if (newdir == dir)
+ return (char *)dir;
+
+ unescape_single_char (newdir, '/');
+ return newdir;
+}
+
+/* Sync u->path and u->url with u->dir and u->file. Called after
+ u->file or u->dir have been changed, typically by the FTP code. */
+
+static void
+sync_path (struct url *u)
+{
+ char *newpath, *efile, *edir;
+
+ xfree (u->path);
+
+ /* u->dir and u->file are not escaped. URL-escape them before
+ reassembling them into u->path. That way, if they contain
+ separators like '?' or even if u->file contains slashes, the
+ path will be correctly assembled. (u->file can contain slashes
+ if the URL specifies it with %2f, or if an FTP server returns
+ it.) */
+ edir = url_escape_dir (u->dir);
+ efile = url_escape_1 (u->file, urlchr_unsafe | urlchr_reserved, 1);
+
+ if (!*edir)
+ newpath = xstrdup (efile);
+ else
+ {
+ int dirlen = strlen (edir);
+ int filelen = strlen (efile);
+
+ /* Copy "DIR/FILE" to newpath. */
+ char *p = newpath = xmalloc (dirlen + 1 + filelen + 1);
+ memcpy (p, edir, dirlen);
+ p += dirlen;
+ *p++ = '/';
+ memcpy (p, efile, filelen);
+ p += filelen;
+ *p = '\0';
+ }
+
+ u->path = newpath;
+
+ if (edir != u->dir)
+ xfree (edir);
+ if (efile != u->file)
+ xfree (efile);
+
+ /* Regenerate u->url as well. */
+ xfree (u->url);
+ u->url = url_string (u, URL_AUTH_SHOW);
+}
+
+/* Mutators. Code in ftp.c insists on changing u->dir and u->file.
+ This way we can sync u->path and u->url when they get changed. */
+
+void
+url_set_dir (struct url *url, const char *newdir)
+{
+ xfree (url->dir);
+ url->dir = xstrdup (newdir);
+ sync_path (url);
+}
+
+void
+url_set_file (struct url *url, const char *newfile)
+{
+ xfree (url->file);
+ url->file = xstrdup (newfile);
+ sync_path (url);
+}
+
+void
+url_free (struct url *url)
+{
+ if (url)
+ {
+ xfree (url->host);
+
+ xfree (url->path);
+ xfree (url->url);
+
+ xfree (url->params);
+ xfree (url->query);
+ xfree (url->fragment);
+ xfree (url->user);
+ xfree (url->passwd);
+
+ xfree (url->dir);
+ xfree (url->file);
+
+ xfree (url);
+ }
+}
+
+/* Create all the necessary directories for PATH (a file). Calls
+ make_directory internally. */
+int
+mkalldirs (const char *path)
+{
+ const char *p;
+ char *t;
+ struct stat st;
+ int res;
+
+ p = strrchr(path, '/');
+ p = p == NULL ? path : p;
+
+ /* Don't create if it's just a file. */
+ if ((p == path) && (*p != '/'))
+ return 0;
+ t = strdupdelim (path, p);
+
+ /* Check whether the directory exists. */
+ if ((stat (t, &st) == 0))
+ {
+ if (S_ISDIR (st.st_mode))
+ {
+ xfree (t);
+ return 0;
+ }
+ else
+ {
+ /* If the dir exists as a file name, remove it first. This
+ is *only* for Wget to work with buggy old CERN http
+ servers. Here is the scenario: When Wget tries to
+ retrieve a directory without a slash, e.g.
+ http://foo/bar (bar being a directory), CERN server will
+ not redirect it too http://foo/bar/ -- it will generate a
+ directory listing containing links to bar/file1,
+ bar/file2, etc. Wget will lose because it saves this
+ HTML listing to a file `bar', so it cannot create the
+ directory. To work around this, if the file of the same
+ name exists, we just remove it and create the directory
+ anyway. */
+ DEBUGP (("Removing %s because of directory danger!\n", t));
+ if (unlink (t))
+ logprintf (LOG_NOTQUIET, "Failed to unlink %s (%d): %s\n",
+ t, errno, strerror(errno));
+ }
+ }
+ res = make_directory (t);
+ if (res != 0)
+ logprintf (LOG_NOTQUIET, "%s: %s\n", t, strerror (errno));
+ xfree (t);
+ return res;
+}
+
+/* Functions for constructing the file name out of URL components. */
+
+/* A growable string structure, used by url_file_name and friends.
+ This should perhaps be moved to utils.c.
+
+ The idea is to have a convenient and efficient way to construct a
+ string by having various functions append data to it. Instead of
+ passing the obligatory BASEVAR, SIZEVAR and TAILPOS to all the
+ functions in questions, we pass the pointer to this struct.
+
+ Functions that write to the members in this struct must make sure
+ that base remains null terminated by calling append_null().
+ */
+
+struct growable {
+ char *base;
+ int size; /* memory allocated */
+ int tail; /* string length */
+};
+
+/* Ensure that the string can accept APPEND_COUNT more characters past
+ the current TAIL position. If necessary, this will grow the string
+ and update its allocated size. If the string is already large
+ enough to take TAIL+APPEND_COUNT characters, this does nothing. */
+#define GROW(g, append_size) do { \
+ struct growable *G_ = g; \
+ DO_REALLOC (G_->base, G_->size, G_->tail + append_size, char); \
+} while (0)
+
+/* Return the tail position of the string. */
+#define TAIL(r) ((r)->base + (r)->tail)
+
+/* Move the tail position by APPEND_COUNT characters. */
+#define TAIL_INCR(r, append_count) ((r)->tail += append_count)
+
+
+/* Append NULL to DEST. */
+static void
+append_null (struct growable *dest)
+{
+ GROW (dest, 1);
+ *TAIL (dest) = 0;
+}
+
+/* Append CH to DEST. */
+static void
+append_char (char ch, struct growable *dest)
+{
+ if (ch)
+ {
+ GROW (dest, 1);
+ *TAIL (dest) = ch;
+ TAIL_INCR (dest, 1);
+ }
+
+ append_null (dest);
+}
+
+/* Append the string STR to DEST. */
+static void
+append_string (const char *str, struct growable *dest)
+{
+ int l = strlen (str);
+
+ if (l)
+ {
+ GROW (dest, l);
+ memcpy (TAIL (dest), str, l);
+ TAIL_INCR (dest, l);
+ }
+
+ append_null (dest);
+}
+
+
+enum {
+ filechr_not_unix = 1, /* unusable on Unix, / and \0 */
+ filechr_not_vms = 2, /* unusable on VMS (ODS5), 0x00-0x1F * ? */
+ filechr_not_windows = 4, /* unusable on Windows, one of \|/<>?:*" */
+ filechr_control = 8 /* a control character, e.g. 0-31 */
+};
+
+#define FILE_CHAR_TEST(c, mask) \
+ ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
+ (filechr_table[(unsigned char)(c)] & (mask)))
+
+/* Shorthands for the table: */
+#define U filechr_not_unix
+#define V filechr_not_vms
+#define W filechr_not_windows
+#define C filechr_control
+
+#define UVWC U|V|W|C
+#define UW U|W
+#define VC V|C
+#define VW V|W
+
+/* Table of characters unsafe under various conditions (see above).
+
+ Arguably we could also claim `%' to be unsafe, since we use it as
+ the escape character. If we ever want to be able to reliably
+ translate file name back to URL, this would become important
+ crucial. Right now, it's better to be minimal in escaping. */
+
+static const unsigned char filechr_table[256] =
+{
+UVWC, VC, VC, VC, VC, VC, VC, VC, /* NUL SOH STX ETX EOT ENQ ACK BEL */
+ VC, VC, VC, VC, VC, VC, VC, VC, /* BS HT LF VT FF CR SO SI */
+ VC, VC, VC, VC, VC, VC, VC, VC, /* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */
+ VC, VC, VC, VC, VC, VC, VC, VC, /* CAN EM SUB ESC FS GS RS US */
+ 0, 0, W, 0, 0, 0, 0, 0, /* SP ! " # $ % & ' */
+ 0, 0, VW, 0, 0, 0, 0, UW, /* ( ) * + , - . / */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 1 2 3 4 5 6 7 */
+ 0, 0, W, 0, W, 0, W, VW, /* 8 9 : ; < = > ? */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* @ A B C D E F G */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* H I J K L M N O */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* P Q R S T U V W */
+ 0, 0, 0, 0, W, 0, 0, 0, /* X Y Z [ \ ] ^ _ */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* ` a b c d e f g */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* h i j k l m n o */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* p q r s t u v w */
+ 0, 0, 0, 0, W, 0, 0, C, /* x y z { | } ~ DEL */
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 128-143 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 144-159 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+#undef U
+#undef V
+#undef W
+#undef C
+#undef UW
+#undef UVWC
+#undef VC
+#undef VW
+
+/* FN_PORT_SEP is the separator between host and port in file names
+ for non-standard port numbers. On Unix this is normally ':', as in
+ "www.xemacs.org:4001/index.html". Under Windows, we set it to +
+ because Windows can't handle ':' in file names. */
+#define FN_PORT_SEP (opt.restrict_files_os != restrict_windows ? ':' : '+')
+
+/* FN_QUERY_SEP is the separator between the file name and the URL
+ query, normally '?'. Because VMS and Windows cannot handle '?' in a
+ file name, we use '@' instead there. */
+#define FN_QUERY_SEP \
+ (((opt.restrict_files_os != restrict_vms) && \
+ (opt.restrict_files_os != restrict_windows)) ? '?' : '@')
+#define FN_QUERY_SEP_STR \
+ (((opt.restrict_files_os != restrict_vms) && \
+ (opt.restrict_files_os != restrict_windows)) ? "?" : "@")
+
+/* Quote path element, characters in [b, e), as file name, and append
+ the quoted string to DEST. Each character is quoted as per
+ file_unsafe_char and the corresponding table.
+
+ If ESCAPED is true, the path element is considered to be
+ URL-escaped and will be unescaped prior to inspection. */
+
+static void
+append_uri_pathel (const char *b, const char *e, bool escaped,
+ struct growable *dest)
+{
+ const char *p;
+ char buf[1024];
+ char *unescaped = NULL;
+ int quoted, outlen;
+ int mask;
+
+ if (!dest)
+ return;
+
+ if (opt.restrict_files_os == restrict_unix)
+ mask = filechr_not_unix;
+ else if (opt.restrict_files_os == restrict_vms)
+ mask = filechr_not_vms;
+ else
+ mask = filechr_not_windows;
+
+ if (opt.restrict_files_ctrl)
+ mask |= filechr_control;
+
+ /* Copy [b, e) to PATHEL and URL-unescape it. */
+ if (escaped)
+ {
+ size_t len = e - b;
+ if (len < sizeof (buf))
+ unescaped = buf;
+ else
+ unescaped = xmalloc(len + 1);
+
+ memcpy(unescaped, b, len);
+ unescaped[len] = 0;
+
+ url_unescape (unescaped);
+ b = unescaped;
+ e = unescaped + strlen (unescaped);
+ }
+
+ /* Defang ".." when found as component of path. Remember that path
+ comes from the URL and might contain malicious input. */
+ if (e - b == 2 && b[0] == '.' && b[1] == '.')
+ {
+ b = "%2E%2E";
+ e = b + 6;
+ }
+
+ /* Walk the PATHEL string and check how many characters we'll need
+ to quote. */
+ quoted = 0;
+ for (p = b; p < e; p++)
+ if (FILE_CHAR_TEST (*p, mask))
+ ++quoted;
+
+ /* Calculate the length of the output string. e-b is the input
+ string length. Each quoted char introduces two additional
+ characters in the string, hence 2*quoted. */
+ outlen = (e - b) + (2 * quoted);
+ GROW (dest, outlen);
+
+ if (!quoted)
+ {
+ /* If there's nothing to quote, we can simply append the string
+ without processing it again. */
+ memcpy (TAIL (dest), b, outlen);
+ }
+ else
+ {
+ char *q = TAIL (dest);
+ for (p = b; p < e; p++)
+ {
+ if (!FILE_CHAR_TEST (*p, mask))
+ *q++ = *p;
+ else
+ {
+ unsigned char ch = *p;
+ *q++ = '%';
+ *q++ = XNUM_TO_DIGIT (ch >> 4);
+ *q++ = XNUM_TO_DIGIT (ch & 0xf);
+ }
+ }
+ assert (q - TAIL (dest) == outlen);
+ }
+
+ /* Perform inline case transformation if required. */
+ if (opt.restrict_files_case == restrict_lowercase
+ || opt.restrict_files_case == restrict_uppercase)
+ {
+ char *q;
+ for (q = TAIL (dest); q < TAIL (dest) + outlen; ++q)
+ {
+ if (opt.restrict_files_case == restrict_lowercase)
+ *q = c_tolower (*q);
+ else
+ *q = c_toupper (*q);
+ }
+ }
+
+ TAIL_INCR (dest, outlen);
+ append_null (dest);
+
+ if (unescaped && unescaped != buf)
+ free (unescaped);
+}
+
+#ifdef HAVE_ICONV
+static char *
+convert_fname (char *fname)
+{
+ char *converted_fname;
+ const char *from_encoding = opt.encoding_remote;
+ const char *to_encoding = opt.locale;
+ iconv_t cd;
+ size_t len, done, inlen, outlen;
+ char *s;
+ const char *orig_fname;
+
+ /* Defaults for remote and local encodings. */
+ if (!from_encoding)
+ from_encoding = "UTF-8";
+ if (!to_encoding)
+ to_encoding = nl_langinfo (CODESET);
+
+ cd = iconv_open (to_encoding, from_encoding);
+ if (cd == (iconv_t) (-1))
+ {
+ logprintf (LOG_VERBOSE, _ ("Conversion from %s to %s isn't supported\n"),
+ quote (from_encoding), quote (to_encoding));
+ return fname;
+ }
+
+ orig_fname = fname;
+ inlen = strlen (fname);
+ len = outlen = inlen * 2;
+ converted_fname = s = xmalloc (outlen + 1);
+ done = 0;
+
+ for (;;)
+ {
+ errno = 0;
+ if (iconv (cd, (ICONV_CONST char **) &fname, &inlen, &s, &outlen) == 0
+ && iconv (cd, NULL, NULL, &s, &outlen) == 0)
+ {
+ *(converted_fname + len - outlen - done) = '\0';
+ iconv_close (cd);
+ DEBUGP (("Converted file name '%s' (%s) -> '%s' (%s)\n",
+ orig_fname, from_encoding, converted_fname, to_encoding));
+ xfree (orig_fname);
+ return converted_fname;
+ }
+
+ /* Incomplete or invalid multibyte sequence */
+ if (errno == EINVAL || errno == EILSEQ || errno == 0)
+ {
+ if (errno)
+ logprintf (LOG_VERBOSE,
+ _ ("Incomplete or invalid multibyte sequence encountered\n"));
+ else
+ logprintf (LOG_VERBOSE,
+ _ ("Unconvertable multibyte sequence encountered\n"));
+ xfree (converted_fname);
+ converted_fname = (char *) orig_fname;
+ break;
+ }
+ else if (errno == E2BIG) /* Output buffer full */
+ {
+ done = len;
+ len = outlen = done + inlen * 2;
+ converted_fname = xrealloc (converted_fname, outlen + 1);
+ s = converted_fname + done;
+ }
+ else /* Weird, we got an unspecified error */
+ {
+ logprintf (LOG_VERBOSE, _ ("Unhandled errno %d\n"), errno);
+ xfree (converted_fname);
+ converted_fname = (char *) orig_fname;
+ break;
+ }
+ }
+ DEBUGP (("Failed to convert file name '%s' (%s) -> '?' (%s)\n",
+ orig_fname, from_encoding, to_encoding));
+
+ iconv_close (cd);
+
+ return converted_fname;
+}
+#else
+static char *
+convert_fname (char *fname)
+{
+ return fname;
+}
+#endif
+
+/* Append to DEST the directory structure that corresponds the
+ directory part of URL's path. For example, if the URL is
+ http://server/dir1/dir2/file, this appends "/dir1/dir2".
+
+ Each path element ("dir1" and "dir2" in the above example) is
+ examined, url-unescaped, and re-escaped as file name element.
+
+ Additionally, it cuts as many directories from the path as
+ specified by opt.cut_dirs. For example, if opt.cut_dirs is 1, it
+ will produce "bar" for the above example. For 2 or more, it will
+ produce "".
+
+ Each component of the path is quoted for use as file name. */
+
+static void
+append_dir_structure (const struct url *u, struct growable *dest)
+{
+ char *pathel, *next;
+ int cut = opt.cut_dirs;
+
+ /* Go through the path components, de-URL-quote them, and quote them
+ (if necessary) as file names. */
+
+ pathel = u->path;
+ for (; (next = strchr (pathel, '/')) != NULL; pathel = next + 1)
+ {
+ if (cut-- > 0)
+ continue;
+ if (pathel == next)
+ /* Ignore empty pathels. */
+ continue;
+
+ if (dest->tail)
+ append_char ('/', dest);
+ append_uri_pathel (pathel, next, true, dest);
+ }
+}
+
+/* Return a unique file name that matches the given URL as well as
+ possible. Does not create directories on the file system. */
+
+char *
+url_file_name (const struct url *u, char *replaced_filename)
+{
+ struct growable fnres; /* stands for "file name result" */
+ struct growable temp_fnres;
+
+ const char *u_file;
+ char *fname, *unique, *fname_len_check;
+ const char *index_filename = "index.html"; /* The default index file is index.html */
+ size_t max_length;
+
+ fnres.base = NULL;
+ fnres.size = 0;
+ fnres.tail = 0;
+
+ temp_fnres.base = NULL;
+ temp_fnres.size = 0;
+ temp_fnres.tail = 0;
+
+ /* If an alternative index file was defined, change index_filename */
+ if (opt.default_page)
+ index_filename = opt.default_page;
+
+
+ /* Start with the directory prefix, if specified. */
+ if (opt.dir_prefix)
+ append_string (opt.dir_prefix, &fnres);
+
+ /* If "dirstruct" is turned on (typically the case with -r), add
+ the host and port (unless those have been turned off) and
+ directory structure. */
+ /* All safe remote chars are unescaped and stored in temp_fnres,
+ then converted to local and appended to fnres.
+ Internationalized URL/IDN will produce punycode to lookup IP from DNS:
+ https://en.wikipedia.org/wiki/URL
+ https://en.wikipedia.org/wiki/Internationalized_domain_name
+ Non-ASCII code chars in the path:
+ https://en.wikipedia.org/wiki/List_of_Unicode_characters
+ https://en.wikipedia.org/wiki/List_of_writing_systems */
+ if (opt.dirstruct)
+ {
+ if (opt.protocol_directories)
+ {
+ if (temp_fnres.tail)
+ append_char ('/', &temp_fnres);
+ append_string (supported_schemes[u->scheme].name, &temp_fnres);
+ }
+ if (opt.add_hostdir)
+ {
+ if (temp_fnres.tail)
+ append_char ('/', &temp_fnres);
+ if (0 != strcmp (u->host, ".."))
+ append_string (u->host, &temp_fnres);
+ else
+ /* Host name can come from the network; malicious DNS may
+ allow ".." to be resolved, causing us to write to
+ "../<file>". Defang such host names. */
+ append_string ("%2E%2E", &temp_fnres);
+ if (u->port != scheme_default_port (u->scheme))
+ {
+ char portstr[24];
+ number_to_string (portstr, u->port);
+ append_char (FN_PORT_SEP, &temp_fnres);
+ append_string (portstr, &temp_fnres);
+ }
+ }
+
+ append_dir_structure (u, &temp_fnres);
+ }
+
+ if (!replaced_filename)
+ {
+ /* Create the filename. */
+ u_file = *u->file ? u->file : index_filename;
+
+ /* Append "?query" to the file name, even if empty,
+ * and create fname_len_check. */
+ if (u->query)
+ fname_len_check = concat_strings (u_file, FN_QUERY_SEP_STR, u->query, NULL);
+ else
+ fname_len_check = strdupdelim (u_file, u_file + strlen (u_file));
+ }
+ else
+ {
+ u_file = replaced_filename;
+ fname_len_check = strdupdelim (u_file, u_file + strlen (u_file));
+ }
+
+ if (temp_fnres.tail)
+ append_char ('/', &temp_fnres);
+
+ append_uri_pathel (fname_len_check,
+ fname_len_check + strlen (fname_len_check), true, &temp_fnres);
+
+ /* Zero-terminate the temporary file name. */
+ append_char ('\0', &temp_fnres);
+
+ /* convert all remote chars before length check and appending to local path */
+ fname = convert_fname (temp_fnres.base);
+ temp_fnres.base = NULL;
+ temp_fnres.size = 0;
+ temp_fnres.tail = 0;
+ append_string (fname, &temp_fnres);
+ xfree (fname);
+
+ /* Check that the length of the file name is acceptable. */
+#ifdef WINDOWS
+ if (MAX_PATH > (fnres.tail + CHOMP_BUFFER + 2))
+ {
+ max_length = MAX_PATH - (fnres.tail + CHOMP_BUFFER + 2);
+ /* FIXME: In Windows a filename is usually limited to 255 characters.
+ To really be accurate you could call GetVolumeInformation() to get
+ lpMaximumComponentLength
+ */
+ if (max_length > 255)
+ {
+ max_length = 255;
+ }
+ }
+ else
+ {
+ max_length = 0;
+ }
+#else
+ max_length = get_max_length (fnres.base, fnres.tail, _PC_NAME_MAX) - CHOMP_BUFFER;
+#endif
+ if (max_length > 0 && strlen (temp_fnres.base) > max_length)
+ {
+ logprintf (LOG_NOTQUIET, "The name is too long, %lu chars total.\n",
+ (unsigned long) strlen (temp_fnres.base));
+ logprintf (LOG_NOTQUIET, "Trying to shorten...\n");
+
+ /* Shorten the file name. */
+ temp_fnres.base[max_length] = '\0';
+
+ logprintf (LOG_NOTQUIET, "New name is %s.\n", temp_fnres.base);
+ }
+
+ xfree (fname_len_check);
+
+ /* The filename has already been 'cleaned' by append_uri_pathel() above. So,
+ * just append it. */
+ if (fnres.tail)
+ append_char ('/', &fnres);
+ append_string (temp_fnres.base, &fnres);
+
+ fname = fnres.base;
+
+ /* Make a final check that the path length is acceptable? */
+ /* TODO: check fnres.base for path length problem */
+
+ xfree (temp_fnres.base);
+
+ /* Check the cases in which the unique extensions are not used:
+ 1) Clobbering is turned off (-nc).
+ 2) Retrieval with regetting.
+ 3) Timestamping is used.
+ 4) Hierarchy is built.
+ 5) Backups are specified.
+
+ The exception is the case when file does exist and is a
+ directory (see `mkalldirs' for explanation). */
+
+ if (ALLOW_CLOBBER
+ && !(file_exists_p (fname, NULL) && !file_non_directory_p (fname)))
+ {
+ unique = fname;
+ }
+ else
+ {
+ unique = unique_name_passthrough (fname);
+ if (unique != fname)
+ xfree (fname);
+ }
+
+/* On VMS, alter the name as required. */
+#ifdef __VMS
+ {
+ char *unique2;
+
+ unique2 = ods_conform( unique);
+ if (unique2 != unique)
+ {
+ xfree (unique);
+ unique = unique2;
+ }
+ }
+#endif /* def __VMS */
+
+ return unique;
+}
+
+/* Resolve "." and ".." elements of PATH by destructively modifying
+ PATH and return true if PATH has been modified, false otherwise.
+
+ The algorithm is in spirit similar to the one described in rfc1808,
+ although implemented differently, in one pass. To recap, path
+ elements containing only "." are removed, and ".." is taken to mean
+ "back up one element". Single leading and trailing slashes are
+ preserved.
+
+ For example, "a/b/c/./../d/.." will yield "a/b/". More exhaustive
+ test examples are provided below. If you change anything in this
+ function, run test_path_simplify to make sure you haven't broken a
+ test case. */
+
+static bool
+path_simplify (enum url_scheme scheme, char *path)
+{
+ char *h = path; /* hare */
+ char *t = path; /* tortoise */
+ char *beg = path;
+ char *end = strchr (path, '\0');
+
+ while (h < end)
+ {
+ /* Hare should be at the beginning of a path element. */
+
+ if (h[0] == '.' && (h[1] == '/' || h[1] == '\0'))
+ {
+ /* Ignore "./". */
+ h += 2;
+ }
+ else if (h[0] == '.' && h[1] == '.' && (h[2] == '/' || h[2] == '\0'))
+ {
+ /* Handle "../" by retreating the tortoise by one path
+ element -- but not past beginning. */
+ if (t > beg)
+ {
+ /* Move backwards until T hits the beginning of the
+ previous path element or the beginning of path. */
+ for (--t; t > beg && t[-1] != '/'; t--)
+ ;
+ }
+ else if (scheme == SCHEME_FTP
+#ifdef HAVE_SSL
+ || scheme == SCHEME_FTPS
+#endif
+ )
+ {
+ /* If we're at the beginning, copy the "../" literally
+ and move the beginning so a later ".." doesn't remove
+ it. This violates RFC 3986; but we do it for FTP
+ anyway because there is otherwise no way to get at a
+ parent directory, when the FTP server drops us in a
+ non-root directory (which is not uncommon). */
+ beg = t + 3;
+ goto regular;
+ }
+ h += 3;
+ }
+ else
+ {
+ regular:
+ /* A regular path element. If H hasn't advanced past T,
+ simply skip to the next path element. Otherwise, copy
+ the path element until the next slash. */
+ if (t == h)
+ {
+ /* Skip the path element, including the slash. */
+ while (h < end && *h != '/')
+ t++, h++;
+ if (h < end)
+ t++, h++;
+ }
+ else
+ {
+ /* Copy the path element, including the final slash. */
+ while (h < end && *h != '/')
+ *t++ = *h++;
+ if (h < end)
+ *t++ = *h++;
+ }
+ }
+ }
+
+ if (t != h)
+ *t = '\0';
+
+ return t != h;
+}
+
+/* Return the length of URL's path. Path is considered to be
+ terminated by one or more of the ?query or ;params or #fragment,
+ depending on the scheme. */
+
+static const char *
+path_end (const char *url)
+{
+ enum url_scheme scheme = url_scheme (url);
+ const char *seps;
+ if (scheme == SCHEME_INVALID)
+ scheme = SCHEME_HTTP; /* use http semantics for rel links */
+ /* +2 to ignore the first two separators ':' and '/' */
+ seps = init_seps (scheme) + 2;
+ return strpbrk_or_eos (url, seps);
+}
+
+/* Find the last occurrence of character C in the range [b, e), or
+ NULL, if none are present. */
+#define find_last_char(b, e, c) memrchr ((b), (c), (e) - (b))
+
+/* Merge BASE with LINK and return the resulting URI.
+
+ Either of the URIs may be absolute or relative, complete with the
+ host name, or path only. This tries to reasonably handle all
+ foreseeable cases. It only employs minimal URL parsing, without
+ knowledge of the specifics of schemes.
+
+ I briefly considered making this function call path_simplify after
+ the merging process, as rfc1738 seems to suggest. This is a bad
+ idea for several reasons: 1) it complexifies the code, and 2)
+ url_parse has to simplify path anyway, so it's wasteful to boot. */
+
+char *
+uri_merge (const char *base, const char *link)
+{
+ int linklength;
+ const char *end;
+ char *merge;
+
+ if (url_has_scheme (link))
+ return xstrdup (link);
+
+ /* We may not examine BASE past END. */
+ end = path_end (base);
+ linklength = strlen (link);
+
+ if (!*link)
+ {
+ /* Empty LINK points back to BASE, query string and all. */
+ return xstrdup (base);
+ }
+ else if (*link == '?')
+ {
+ /* LINK points to the same location, but changes the query
+ string. Examples: */
+ /* uri_merge("path", "?new") -> "path?new" */
+ /* uri_merge("path?foo", "?new") -> "path?new" */
+ /* uri_merge("path?foo#bar", "?new") -> "path?new" */
+ /* uri_merge("path#foo", "?new") -> "path?new" */
+ int baselength = end - base;
+ merge = xmalloc (baselength + linklength + 1);
+ memcpy (merge, base, baselength);
+ memcpy (merge + baselength, link, linklength);
+ merge[baselength + linklength] = '\0';
+ }
+ else if (*link == '#')
+ {
+ /* uri_merge("path", "#new") -> "path#new" */
+ /* uri_merge("path#foo", "#new") -> "path#new" */
+ /* uri_merge("path?foo", "#new") -> "path?foo#new" */
+ /* uri_merge("path?foo#bar", "#new") -> "path?foo#new" */
+ int baselength;
+ const char *end1 = strchr (base, '#');
+ if (!end1)
+ end1 = base + strlen (base);
+ baselength = end1 - base;
+ merge = xmalloc (baselength + linklength + 1);
+ memcpy (merge, base, baselength);
+ memcpy (merge + baselength, link, linklength);
+ merge[baselength + linklength] = '\0';
+ }
+ else if (*link == '/' && *(link + 1) == '/')
+ {
+ /* LINK begins with "//" and so is a net path: we need to
+ replace everything after (and including) the double slash
+ with LINK. */
+
+ /* uri_merge("foo", "//new/bar") -> "//new/bar" */
+ /* uri_merge("//old/foo", "//new/bar") -> "//new/bar" */
+ /* uri_merge("http://old/foo", "//new/bar") -> "http://new/bar" */
+
+ int span;
+ const char *slash;
+ const char *start_insert;
+
+ /* Look for first slash. */
+ slash = memchr (base, '/', end - base);
+ /* If found slash and it is a double slash, then replace
+ from this point, else default to replacing from the
+ beginning. */
+ if (slash && *(slash + 1) == '/')
+ start_insert = slash;
+ else
+ start_insert = base;
+
+ span = start_insert - base;
+ merge = xmalloc (span + linklength + 1);
+ if (span)
+ memcpy (merge, base, span);
+ memcpy (merge + span, link, linklength);
+ merge[span + linklength] = '\0';
+ }
+ else if (*link == '/')
+ {
+ /* LINK is an absolute path: we need to replace everything
+ after (and including) the FIRST slash with LINK.
+
+ So, if BASE is "http://host/whatever/foo/bar", and LINK is
+ "/qux/xyzzy", our result should be
+ "http://host/qux/xyzzy". */
+ int span;
+ const char *slash;
+ const char *start_insert = NULL; /* for gcc to shut up. */
+ const char *pos = base;
+ bool seen_slash_slash = false;
+ /* We're looking for the first slash, but want to ignore
+ double slash. */
+ again:
+ slash = memchr (pos, '/', end - pos);
+ if (slash && !seen_slash_slash)
+ if (*(slash + 1) == '/')
+ {
+ pos = slash + 2;
+ seen_slash_slash = true;
+ goto again;
+ }
+
+ /* At this point, SLASH is the location of the first / after
+ "//", or the first slash altogether. START_INSERT is the
+ pointer to the location where LINK will be inserted. When
+ examining the last two examples, keep in mind that LINK
+ begins with '/'. */
+
+ if (!slash && !seen_slash_slash)
+ /* example: "foo" */
+ /* ^ */
+ start_insert = base;
+ else if (!slash && seen_slash_slash)
+ /* example: "http://foo" */
+ /* ^ */
+ start_insert = end;
+ else if (slash && !seen_slash_slash)
+ /* example: "foo/bar" */
+ /* ^ */
+ start_insert = base;
+ else if (slash && seen_slash_slash)
+ /* example: "http://something/" */
+ /* ^ */
+ start_insert = slash;
+
+ span = start_insert - base;
+ merge = xmalloc (span + linklength + 1);
+ if (span)
+ memcpy (merge, base, span);
+ memcpy (merge + span, link, linklength);
+ merge[span + linklength] = '\0';
+ }
+ else
+ {
+ /* LINK is a relative URL: we need to replace everything
+ after last slash (possibly empty) with LINK.
+
+ So, if BASE is "whatever/foo/bar", and LINK is "qux/xyzzy",
+ our result should be "whatever/foo/qux/xyzzy". */
+ bool need_explicit_slash = false;
+ int span;
+ const char *start_insert;
+ const char *last_slash = find_last_char (base, end, '/');
+ if (!last_slash)
+ {
+ /* No slash found at all. Replace what we have with LINK. */
+ start_insert = base;
+ }
+ else if (last_slash && last_slash >= base + 2
+ && last_slash[-2] == ':' && last_slash[-1] == '/')
+ {
+ /* example: http://host" */
+ /* ^ */
+ start_insert = end + 1;
+ need_explicit_slash = true;
+ }
+ else
+ {
+ /* example: "whatever/foo/bar" */
+ /* ^ */
+ start_insert = last_slash + 1;
+ }
+
+ span = start_insert - base;
+ merge = xmalloc (span + linklength + 1);
+ if (span)
+ memcpy (merge, base, span);
+ if (need_explicit_slash)
+ merge[span - 1] = '/';
+ memcpy (merge + span, link, linklength);
+ merge[span + linklength] = '\0';
+ }
+
+ return merge;
+}
+
+#define APPEND(p, s) do { \
+ int len = strlen (s); \
+ memcpy (p, s, len); \
+ p += len; \
+} while (0)
+
+/* Use this instead of password when the actual password is supposed
+ to be hidden. We intentionally use a generic string without giving
+ away the number of characters in the password, like previous
+ versions did. */
+#define HIDDEN_PASSWORD "*password*"
+
+/* Recreate the URL string from the data in URL.
+
+ If HIDE is true (as it is when we're calling this on a URL we plan
+ to print, but not when calling it to canonicalize a URL for use
+ within the program), password will be hidden. Unsafe characters in
+ the URL will be quoted. */
+
+char *
+url_string (const struct url *url, enum url_auth_mode auth_mode)
+{
+ int size;
+ char *result, *p;
+ char *quoted_host, *quoted_user = NULL, *quoted_passwd = NULL;
+
+ int scheme_port = supported_schemes[url->scheme].default_port;
+ const char *scheme_str = supported_schemes[url->scheme].leading_string;
+ int fplen = full_path_length (url);
+
+ bool brackets_around_host;
+
+ assert (scheme_str != NULL);
+
+ /* Make sure the user name and password are quoted. */
+ if (url->user)
+ {
+ if (auth_mode != URL_AUTH_HIDE)
+ {
+ quoted_user = url_escape_allow_passthrough (url->user);
+ if (url->passwd)
+ {
+ if (auth_mode == URL_AUTH_HIDE_PASSWD)
+ quoted_passwd = (char *) HIDDEN_PASSWORD;
+ else
+ quoted_passwd = url_escape_allow_passthrough (url->passwd);
+ }
+ }
+ }
+
+ /* In the unlikely event that the host name contains non-printable
+ characters, quote it for displaying to the user. */
+ quoted_host = url_escape_allow_passthrough (url->host);
+
+ /* Undo the quoting of colons that URL escaping performs. IPv6
+ addresses may legally contain colons, and in that case must be
+ placed in square brackets. */
+ if (quoted_host != url->host)
+ unescape_single_char (quoted_host, ':');
+ brackets_around_host = strchr (quoted_host, ':') != NULL;
+
+ size = (strlen (scheme_str)
+ + strlen (quoted_host)
+ + (brackets_around_host ? 2 : 0)
+ + fplen
+ + 1);
+ if (url->port != scheme_port)
+ size += 1 + numdigit (url->port);
+ if (quoted_user)
+ {
+ size += 1 + strlen (quoted_user);
+ if (quoted_passwd)
+ size += 1 + strlen (quoted_passwd);
+ }
+
+ p = result = xmalloc (size);
+
+ APPEND (p, scheme_str);
+ if (quoted_user)
+ {
+ APPEND (p, quoted_user);
+ if (quoted_passwd)
+ {
+ *p++ = ':';
+ APPEND (p, quoted_passwd);
+ }
+ *p++ = '@';
+ }
+
+ if (brackets_around_host)
+ *p++ = '[';
+ APPEND (p, quoted_host);
+ if (brackets_around_host)
+ *p++ = ']';
+ if (url->port != scheme_port)
+ {
+ *p++ = ':';
+ p = number_to_string (p, url->port);
+ }
+
+ full_path_write (url, p);
+ p += fplen;
+ *p++ = '\0';
+
+ assert (p - result == size);
+
+ if (quoted_user && quoted_user != url->user)
+ xfree (quoted_user);
+ if (quoted_passwd && auth_mode == URL_AUTH_SHOW
+ && quoted_passwd != url->passwd)
+ xfree (quoted_passwd);
+ if (quoted_host != url->host)
+ xfree (quoted_host);
+
+ return result;
+}
+
+/* Return true if scheme a is similar to scheme b.
+
+ Schemes are similar if they are equal. If SSL is supported, schemes
+ are also similar if one is http (SCHEME_HTTP) and the other is https
+ (SCHEME_HTTPS). */
+bool
+schemes_are_similar_p (enum url_scheme a, enum url_scheme b)
+{
+ if (a == b)
+ return true;
+#ifdef HAVE_SSL
+ if ((a == SCHEME_HTTP && b == SCHEME_HTTPS)
+ || (a == SCHEME_HTTPS && b == SCHEME_HTTP))
+ return true;
+#endif
+ return false;
+}
+
+static int
+getchar_from_escaped_string (const char *str, char *c)
+{
+ const char *p = str;
+
+ assert (str && *str);
+ assert (c);
+
+ if (p[0] == '%')
+ {
+ if (!c_isxdigit(p[1]) || !c_isxdigit(p[2]))
+ {
+ *c = '%';
+ return 1;
+ }
+ else
+ {
+ if (p[2] == 0)
+ return 0; /* error: invalid string */
+
+ *c = X2DIGITS_TO_NUM (p[1], p[2]);
+ if (URL_RESERVED_CHAR(*c))
+ {
+ *c = '%';
+ return 1;
+ }
+ else
+ return 3;
+ }
+ }
+ else
+ {
+ *c = p[0];
+ }
+
+ return 1;
+}
+
+bool
+are_urls_equal (const char *u1, const char *u2)
+{
+ const char *p, *q;
+ int pp, qq;
+ char ch1, ch2;
+ assert(u1 && u2);
+
+ p = u1;
+ q = u2;
+
+ while (*p && *q
+ && (pp = getchar_from_escaped_string (p, &ch1))
+ && (qq = getchar_from_escaped_string (q, &ch2))
+ && (c_tolower(ch1) == c_tolower(ch2)))
+ {
+ p += pp;
+ q += qq;
+ }
+
+ return (*p == 0 && *q == 0 ? true : false);
+}
+
+#ifdef TESTING
+/* Debugging and testing support for path_simplify. */
+
+#if 0
+/* Debug: run path_simplify on PATH and return the result in a new
+ string. Useful for calling from the debugger. */
+static char *
+ps (char *path)
+{
+ char *copy = xstrdup (path);
+ path_simplify (copy);
+ return copy;
+}
+#endif
+
+static const char *
+run_test (const char *test, const char *expected_result, enum url_scheme scheme,
+ bool expected_change)
+{
+ char *test_copy = xstrdup (test);
+ bool modified = path_simplify (scheme, test_copy);
+
+ if (0 != strcmp (test_copy, expected_result))
+ {
+ printf ("Failed path_simplify(\"%s\"): expected \"%s\", got \"%s\".\n",
+ test, expected_result, test_copy);
+ mu_assert ("", 0);
+ }
+ if (modified != expected_change)
+ {
+ if (expected_change)
+ printf ("Expected modification with path_simplify(\"%s\").\n",
+ test);
+ else
+ printf ("Expected no modification with path_simplify(\"%s\").\n",
+ test);
+ }
+ xfree (test_copy);
+ mu_assert ("", modified == expected_change);
+ return NULL;
+}
+
+const char *
+test_path_simplify (void)
+{
+ static const struct {
+ const char *test, *result;
+ enum url_scheme scheme;
+ bool should_modify;
+ } tests[] = {
+ { "", "", SCHEME_HTTP, false },
+ { ".", "", SCHEME_HTTP, true },
+ { "./", "", SCHEME_HTTP, true },
+ { "..", "", SCHEME_HTTP, true },
+ { "../", "", SCHEME_HTTP, true },
+ { "..", "..", SCHEME_FTP, false },
+ { "../", "../", SCHEME_FTP, false },
+ { "foo", "foo", SCHEME_HTTP, false },
+ { "foo/bar", "foo/bar", SCHEME_HTTP, false },
+ { "foo///bar", "foo///bar", SCHEME_HTTP, false },
+ { "foo/.", "foo/", SCHEME_HTTP, true },
+ { "foo/./", "foo/", SCHEME_HTTP, true },
+ { "foo./", "foo./", SCHEME_HTTP, false },
+ { "foo/../bar", "bar", SCHEME_HTTP, true },
+ { "foo/../bar/", "bar/", SCHEME_HTTP, true },
+ { "foo/bar/..", "foo/", SCHEME_HTTP, true },
+ { "foo/bar/../x", "foo/x", SCHEME_HTTP, true },
+ { "foo/bar/../x/", "foo/x/", SCHEME_HTTP, true },
+ { "foo/..", "", SCHEME_HTTP, true },
+ { "foo/../..", "", SCHEME_HTTP, true },
+ { "foo/../../..", "", SCHEME_HTTP, true },
+ { "foo/../../bar/../../baz", "baz", SCHEME_HTTP, true },
+ { "foo/../..", "..", SCHEME_FTP, true },
+ { "foo/../../..", "../..", SCHEME_FTP, true },
+ { "foo/../../bar/../../baz", "../../baz", SCHEME_FTP, true },
+ { "a/b/../../c", "c", SCHEME_HTTP, true },
+ { "./a/../b", "b", SCHEME_HTTP, true }
+ };
+ unsigned i;
+
+ for (i = 0; i < countof (tests); i++)
+ {
+ const char *message;
+ const char *test = tests[i].test;
+ const char *expected_result = tests[i].result;
+ enum url_scheme scheme = tests[i].scheme;
+ bool expected_change = tests[i].should_modify;
+
+ message = run_test (test, expected_result, scheme, expected_change);
+ if (message) return message;
+ }
+ return NULL;
+}
+
+const char *
+test_append_uri_pathel(void)
+{
+ unsigned i;
+ static const struct {
+ const char *original_url;
+ const char *input;
+ bool escaped;
+ const char *expected_result;
+ } test_array[] = {
+ { "http://www.yoyodyne.com/path/", "somepage.html", false, "http://www.yoyodyne.com/path/somepage.html" },
+ };
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ struct growable dest;
+ const char *p = test_array[i].input;
+
+ memset (&dest, 0, sizeof (dest));
+
+ append_string (test_array[i].original_url, &dest);
+ append_uri_pathel (p, p + strlen(p), test_array[i].escaped, &dest);
+
+ mu_assert ("test_append_uri_pathel: wrong result",
+ strcmp (dest.base, test_array[i].expected_result) == 0);
+ xfree (dest.base);
+ }
+
+ return NULL;
+}
+
+const char *
+test_are_urls_equal(void)
+{
+ unsigned i;
+ static const struct {
+ const char *url1;
+ const char *url2;
+ bool expected_result;
+ } test_array[] = {
+ { "http://www.adomain.com/apath/", "http://www.adomain.com/apath/", true },
+ { "http://www.adomain.com/apath/", "http://www.adomain.com/anotherpath/", false },
+ { "http://www.adomain.com/apath/", "http://www.anotherdomain.com/path/", false },
+ { "http://www.adomain.com/~path/", "http://www.adomain.com/%7epath/", true },
+ { "http://www.adomain.com/longer-path/", "http://www.adomain.com/path/", false },
+ { "http://www.adomain.com/path%2f", "http://www.adomain.com/path/", false },
+ };
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ mu_assert ("test_are_urls_equal: wrong result",
+ are_urls_equal (test_array[i].url1, test_array[i].url2) == test_array[i].expected_result);
+ }
+
+ return NULL;
+}
+
+#endif /* TESTING */
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/src/url.h b/src/url.h
new file mode 100644
index 0000000..9313c2f
--- /dev/null
+++ b/src/url.h
@@ -0,0 +1,136 @@
+/* Declarations for url.c.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef URL_H
+#define URL_H
+
+/* Default port definitions */
+#define DEFAULT_HTTP_PORT 80
+#define DEFAULT_FTP_PORT 21
+#define DEFAULT_HTTPS_PORT 443
+#define DEFAULT_FTPS_IMPLICIT_PORT 990
+
+/* This represents how many characters less than the OS max name length a file
+ * should be. More precisely, a file name should be at most
+ * (NAME_MAX - CHOMP_BUFFER) characters in length. This number was arrived at
+ * by adding the lengths of all possible strings that could be appended to a
+ * file name later in the code (e.g. ".orig", ".html", etc.). This is
+ * hopefully plenty of extra characters, but I am not guaranteeing that a file
+ * name will be of the proper length by the time the code wants to open a
+ * file descriptor. */
+#define CHOMP_BUFFER 19
+
+/* The flags that allow clobbering the file (opening with "wb").
+ Defined here to avoid repetition later. #### This will require
+ rework. */
+#define ALLOW_CLOBBER (opt.noclobber || opt.always_rest || opt.timestamping \
+ || opt.dirstruct || opt.output_document || opt.backups > 0)
+
+/* Specifies how, or whether, user auth information should be included
+ * in URLs regenerated from URL parse structures. */
+enum url_auth_mode {
+ URL_AUTH_SHOW,
+ URL_AUTH_HIDE_PASSWD,
+ URL_AUTH_HIDE
+};
+
+/* Note: the ordering here is related to the order of elements in
+ `supported_schemes' in url.c. */
+
+enum url_scheme {
+ SCHEME_HTTP,
+#ifdef HAVE_SSL
+ SCHEME_HTTPS,
+#endif
+ SCHEME_FTP,
+#ifdef HAVE_SSL
+ SCHEME_FTPS,
+#endif
+ SCHEME_INVALID
+};
+
+/* Structure containing info on a URL. */
+struct url
+{
+ char *url; /* Original URL */
+ enum url_scheme scheme; /* URL scheme */
+
+ char *host; /* Extracted hostname */
+ int port; /* Port number */
+
+ /* URL components (URL-quoted). */
+ char *path;
+ char *params;
+ char *query;
+ char *fragment;
+
+ /* Extracted path info (unquoted). */
+ char *dir;
+ char *file;
+
+ /* Username and password (unquoted). */
+ char *user;
+ char *passwd;
+};
+
+/* Function declarations */
+
+char *url_escape (const char *);
+char *url_escape_unsafe_and_reserved (const char *);
+void url_unescape (char *);
+void url_unescape_except_reserved (char *);
+
+struct url *url_parse (const char *, int *, struct iri *iri, bool percent_encode);
+char *url_error (const char *, int);
+char *url_full_path (const struct url *);
+void url_set_dir (struct url *, const char *);
+void url_set_file (struct url *, const char *);
+void url_free (struct url *);
+
+enum url_scheme url_scheme (const char *);
+bool url_has_scheme (const char *);
+bool url_valid_scheme (const char *);
+int scheme_default_port (enum url_scheme);
+void scheme_disable (enum url_scheme);
+const char *scheme_leading_string (enum url_scheme);
+
+char *url_string (const struct url *, enum url_auth_mode);
+char *url_file_name (const struct url *, char *);
+
+char *uri_merge (const char *, const char *);
+
+int mkalldirs (const char *);
+
+char *rewrite_shorthand_url (const char *);
+bool schemes_are_similar_p (enum url_scheme a, enum url_scheme b);
+
+bool are_urls_equal (const char *u1, const char *u2);
+
+#endif /* URL_H */
diff --git a/src/utils.c b/src/utils.c
new file mode 100644
index 0000000..89a8687
--- /dev/null
+++ b/src/utils.c
@@ -0,0 +1,2993 @@
+/* Various utility functions.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include "sha256.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#ifdef HAVE_PROCESS_H
+# include <process.h> /* getpid() */
+#endif
+#include <errno.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <locale.h>
+#include <errno.h>
+
+#if HAVE_UTIME
+# include <sys/types.h>
+# include <utime.h>
+# ifdef HAVE_SYS_UTIME_H
+# include <sys/utime.h>
+# endif
+#endif
+
+#include <sys/time.h>
+
+#include <sys/stat.h>
+
+/* For TIOCGWINSZ and friends: */
+#ifndef WINDOWS
+# include <sys/ioctl.h>
+# include <termios.h>
+#endif
+
+/* Needed for Unix version of run_with_timeout. */
+#include <signal.h>
+#include <setjmp.h>
+
+#include <regex.h>
+#ifdef HAVE_LIBPCRE2
+# define PCRE2_CODE_UNIT_WIDTH 8
+# include <pcre2.h>
+#elif defined HAVE_LIBPCRE
+# include <pcre.h>
+#endif
+
+#ifndef HAVE_SIGSETJMP
+/* If sigsetjmp is a macro, configure won't pick it up. */
+# ifdef sigsetjmp
+# define HAVE_SIGSETJMP
+# endif
+#endif
+
+#if defined HAVE_SIGSETJMP || defined HAVE_SIGBLOCK
+# define USE_SIGNAL_TIMEOUT
+#endif
+
+/* Some systems (Linux libc5, "NCR MP-RAS 3.0", and others) don't
+ provide MAP_FAILED, a symbolic constant for the value returned by
+ mmap() when it doesn't work. Usually, this constant should be -1.
+ This only makes sense for files that use mmap() and include
+ sys/mman.h *before* sysdep.h, but doesn't hurt others. */
+#ifdef HAVE_MMAP
+# include <sys/mman.h>
+# ifndef MAP_FAILED
+# define MAP_FAILED ((void *) -1)
+# endif
+#endif
+
+#include "utils.h"
+#include "hash.h"
+
+#ifdef __VMS
+#include "vms.h"
+#endif /* def __VMS */
+
+#ifdef TESTING
+#include "../tests/unit-tests.h"
+#endif
+
+#include "exits.h"
+#include "c-strcase.h"
+
+_Noreturn static void
+memfatal (const char *context, long attempted_size)
+{
+ /* Make sure we don't try to store part of the log line, and thus
+ call malloc. */
+ log_set_save_context (false);
+
+ /* We have different log outputs in different situations:
+ 1) output without bytes information
+ 2) output with bytes information */
+ if (attempted_size == UNKNOWN_ATTEMPTED_SIZE)
+ {
+ logprintf (LOG_ALWAYS,
+ _("%s: %s: Failed to allocate enough memory; memory exhausted.\n"),
+ exec_name, context);
+ }
+ else
+ {
+ logprintf (LOG_ALWAYS,
+ _("%s: %s: Failed to allocate %ld bytes; memory exhausted.\n"),
+ exec_name, context, attempted_size);
+ }
+
+ exit (WGET_EXIT_GENERIC_ERROR);
+}
+
+/* Character property table for (re-)escaping VMS ODS5 extended file
+ names. Note that this table ignores Unicode.
+
+ ODS2 valid characters: 0-9 A-Z a-z $ - _ ~
+
+ ODS5 Invalid characters:
+ C0 control codes (0x00 to 0x1F inclusive)
+ Asterisk (*)
+ Question mark (?)
+
+ ODS5 Invalid characters only in VMS V7.2 (which no one runs, right?):
+ Double quotation marks (")
+ Backslash (\)
+ Colon (:)
+ Left angle bracket (<)
+ Right angle bracket (>)
+ Slash (/)
+ Vertical bar (|)
+
+ Characters escaped by "^":
+ SP ! " # % & ' ( ) + , . : ; =
+ @ [ \ ] ^ ` { | } ~
+
+ Either "^_" or "^ " is accepted as a space. Period (.) is a special
+ case. Note that un-escaped < and > can also confuse a directory
+ spec.
+
+ Characters put out as ^xx:
+ 7F (DEL)
+ 80-9F (C1 control characters)
+ A0 (nonbreaking space)
+ FF (Latin small letter y diaeresis)
+
+ Other cases:
+ Unicode: "^Uxxxx", where "xxxx" is four hex digits.
+
+ Property table values:
+ Normal escape: 1
+ Space: 2
+ Dot: 4
+ Hex-hex escape: 8
+ ODS2 normal: 16
+ ODS2 lower case: 32
+ Hex digit: 64
+*/
+
+unsigned char char_prop[ 256] = {
+
+/* NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+/* SP ! " # $ % & ' ( ) * + , - . / */
+ 2, 1, 1, 1, 16, 1, 1, 1, 1, 1, 0, 1, 1, 16, 4, 0,
+
+/* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
+ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 1, 1, 1, 1, 1, 1,
+
+/* @ A B C D E F G H I J K L M N O */
+ 1, 80, 80, 80, 80, 80, 80, 16, 16, 16, 16, 16, 16, 16, 16, 16,
+
+/* P Q R S T U V W X Y Z [ \ ] ^ _ */
+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 1, 1, 1, 16,
+
+/* ` a b c d e f g h i j k l m n o */
+ 1, 96, 96, 96, 96, 96, 96, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+
+/* p q r s t u v w x y z { | } ~ DEL */
+ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1, 1, 1, 17, 8,
+
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
+ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8
+};
+
+/* Utility function: like xstrdup(), but also lowercases S. */
+
+char *
+xstrdup_lower (const char *s)
+{
+ char *copy = xstrdup (s);
+ char *p = copy;
+ for (; *p; p++)
+ *p = c_tolower (*p);
+ return copy;
+}
+
+/* Copy the string formed by two pointers (one on the beginning, other
+ on the char after the last char) to a new, malloc-ed location.
+ 0-terminate it.
+ If both pointers are NULL, the function returns an empty string. */
+char *
+strdupdelim (const char *beg, const char *end)
+{
+ if (beg && beg <= end)
+ {
+ char *res = xmalloc (end - beg + 1);
+ memcpy (res, beg, end - beg);
+ res[end - beg] = '\0';
+ return res;
+ }
+
+ return xstrdup("");
+}
+
+/* Parse a string containing comma-separated elements, and return a
+ vector of char pointers with the elements. Spaces following the
+ commas are ignored. */
+char **
+sepstring (const char *s)
+{
+ char **res;
+ const char *p;
+ int i = 0;
+
+ if (!s || !*s)
+ return NULL;
+ res = NULL;
+ p = s;
+ while (*s)
+ {
+ if (*s == ',')
+ {
+ res = xrealloc (res, (i + 2) * sizeof (char *));
+ res[i] = strdupdelim (p, s);
+ res[++i] = NULL;
+ ++s;
+ /* Skip the blanks following the ','. */
+ while (c_isspace (*s))
+ ++s;
+ p = s;
+ }
+ else
+ ++s;
+ }
+ res = xrealloc (res, (i + 2) * sizeof (char *));
+ res[i] = strdupdelim (p, s);
+ res[i + 1] = NULL;
+ return res;
+}
+
+/* Like sprintf, but prints into a string of sufficient size freshly
+ allocated with malloc, which is returned. If unable to print due
+ to invalid format, returns NULL. Inability to allocate needed
+ memory results in abort, as with xmalloc. This is in spirit
+ similar to the GNU/BSD extension asprintf, but somewhat easier to
+ use.
+
+ Internally the function either calls vasprintf or loops around
+ vsnprintf until the correct size is found. Since Wget also ships a
+ fallback implementation of vsnprintf, this should be portable. */
+
+char *
+aprintf (const char *fmt, ...)
+{
+#if defined HAVE_VASPRINTF && !defined DEBUG_MALLOC
+ /* Use vasprintf. */
+ int ret;
+ va_list args;
+ char *str;
+ va_start (args, fmt);
+ ret = vasprintf (&str, fmt, args);
+ va_end (args);
+ if (ret < 0 && errno == ENOMEM)
+ memfatal ("aprintf", UNKNOWN_ATTEMPTED_SIZE); /* for consistency
+ with xmalloc/xrealloc */
+ else if (ret < 0)
+ return NULL;
+ return str;
+#else /* not HAVE_VASPRINTF */
+
+/* Constant is using for limits memory allocation for text buffer.
+ Applicable in situation when: vasprintf is not available in the system
+ and vsnprintf return -1 when long line is truncated (in old versions of
+ glibc and in other system where C99 doesn`t support) */
+
+#define FMT_MAX_LENGTH 1048576
+
+ /* vasprintf is unavailable. snprintf into a small buffer and
+ resize it as necessary. */
+ int size = 32;
+ char *str = xmalloc (size);
+
+ /* #### This code will infloop and eventually abort in xrealloc if
+ passed a FMT that causes snprintf to consistently return -1. */
+
+ while (1)
+ {
+ int n;
+ va_list args;
+
+ va_start (args, fmt);
+ n = vsnprintf (str, size, fmt, args);
+ va_end (args);
+
+ /* If the printing worked, return the string. */
+ if (n > -1 && n < size)
+ return str;
+
+ /* Else try again with a larger buffer. */
+ if (n > -1) /* C99 */
+ size = n + 1; /* precisely what is needed */
+ else if (size >= FMT_MAX_LENGTH) /* We have a huge buffer, */
+ { /* maybe we have some wrong
+ format string? */
+ logprintf (LOG_ALWAYS,
+ _("%s: aprintf: text buffer is too big (%d bytes), "
+ "aborting.\n"),
+ exec_name, size); /* printout a log message */
+ abort (); /* and abort... */
+ }
+ else
+ {
+ /* else, we continue to grow our
+ * buffer: Twice the old size. */
+ size <<= 1;
+ }
+ str = xrealloc (str, size);
+ }
+#endif /* not HAVE_VASPRINTF */
+}
+
+#ifndef HAVE_STRLCPY
+/* strlcpy() is a BSD function that sometimes is really handy.
+ * It is the same as snprintf(dst,dstsize,"%s",src), but much faster. */
+
+size_t
+strlcpy (char *dst, const char *src, size_t size)
+{
+ const char *old = src;
+
+ /* Copy as many bytes as will fit */
+ if (size)
+ {
+ while (--size)
+ {
+ if (!(*dst++ = *src++))
+ return src - old - 1;
+ }
+
+ *dst = 0;
+ }
+
+ while (*src++);
+ return src - old - 1;
+}
+#endif
+
+/* Concatenate the NULL-terminated list of string arguments into
+ freshly allocated space. */
+
+char *
+concat_strings (const char *str0, ...)
+{
+ va_list args;
+ const char *arg;
+ size_t length = 0, pos = 0;
+ char *s;
+
+ if (!str0)
+ return NULL;
+
+ /* calculate the length of the resulting string */
+ va_start (args, str0);
+ for (arg = str0; arg; arg = va_arg (args, const char *))
+ length += strlen(arg);
+ va_end (args);
+
+ s = xmalloc (length + 1);
+
+ /* concatenate strings */
+ va_start (args, str0);
+ for (arg = str0; arg; arg = va_arg (args, const char *))
+ pos += strlcpy(s + pos, arg, length - pos + 1);
+ va_end (args);
+
+ return s;
+}
+
+/* Format the provided time according to the specified format. The
+ format is a string with format elements supported by strftime. */
+
+static char *
+fmttime (time_t t, const char *fmt)
+{
+ static char output[32];
+ struct tm *tm = localtime(&t);
+ if (!tm)
+ abort ();
+ if (!strftime(output, sizeof(output), fmt, tm))
+ abort ();
+ return output;
+}
+
+/* Return pointer to a static char[] buffer in which zero-terminated
+ string-representation of TM (in form hh:mm:ss) is printed.
+
+ If TM is NULL, the current time will be used. */
+
+char *
+time_str (time_t t)
+{
+ return fmttime(t, "%H:%M:%S");
+}
+
+/* Like the above, but include the date: YYYY-MM-DD hh:mm:ss. */
+
+char *
+datetime_str (time_t t)
+{
+ return fmttime(t, "%Y-%m-%d %H:%M:%S");
+}
+
+/* The Windows versions of the following two functions are defined in
+ mswindows.c. On MSDOS this function should never be called. */
+
+#ifdef __VMS
+
+bool
+fork_to_background (void)
+{
+ return false;
+}
+
+#else /* def __VMS */
+
+#if !defined(WINDOWS) && !defined(MSDOS)
+bool
+fork_to_background (void)
+{
+ pid_t pid;
+ /* Whether we arrange our own version of opt.lfilename here. */
+ bool logfile_changed = false;
+
+ if (!opt.lfilename && (!opt.quiet || opt.server_response))
+ {
+ /* We must create the file immediately to avoid either a race
+ condition (which arises from using unique_name and failing to
+ use fopen_excl) or lying to the user about the log file name
+ (which arises from using unique_name, printing the name, and
+ using fopen_excl later on.) */
+ FILE *new_log_fp = unique_create (DEFAULT_LOGFILE, false, &opt.lfilename);
+ if (new_log_fp)
+ {
+ logfile_changed = true;
+ fclose (new_log_fp);
+ }
+ }
+ pid = fork ();
+ if (pid < 0)
+ {
+ /* parent, error */
+ perror ("fork");
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ else if (pid != 0)
+ {
+ /* parent, no error */
+ printf (_("Continuing in background, pid %d.\n"), (int) pid);
+ if (logfile_changed)
+ printf (_("Output will be written to %s.\n"), quote (opt.lfilename));
+ exit (WGET_EXIT_SUCCESS); /* #### should we use _exit()? */
+ }
+
+ /* child: give up the privileges and keep running. */
+ setsid ();
+ if (freopen ("/dev/null", "r", stdin) == NULL)
+ DEBUGP (("Failed to redirect stdin to /dev/null.\n"));
+ if (freopen ("/dev/null", "w", stdout) == NULL)
+ DEBUGP (("Failed to redirect stdout to /dev/null.\n"));
+ if (freopen ("/dev/null", "w", stderr) == NULL)
+ DEBUGP (("Failed to redirect stderr to /dev/null.\n"));
+
+ return logfile_changed;
+}
+#endif /* !WINDOWS && !MSDOS */
+
+#endif /* def __VMS [else] */
+
+
+/* "Touch" FILE, i.e. make its mtime ("modified time") equal the time
+ specified with TM. The atime ("access time") is set to the current
+ time. */
+
+void
+touch (const char *file, time_t tm)
+{
+ struct utimbuf times;
+
+ times.modtime = tm;
+ times.actime = time (NULL);
+
+ if (utime (file, &times) == -1)
+ logprintf (LOG_NOTQUIET, "utime(%s): %s\n", file, strerror (errno));
+}
+
+/* Checks if FILE is a symbolic link, and removes it if it is. Does
+ nothing under MS-Windows. */
+int
+remove_link (const char *file)
+{
+ int err = 0;
+ struct stat st;
+
+ if (lstat (file, &st) == 0 && S_ISLNK (st.st_mode))
+ {
+ DEBUGP (("Unlinking %s (symlink).\n", file));
+ err = unlink (file);
+ if (err != 0)
+ logprintf (LOG_VERBOSE, _("Failed to unlink symlink %s: %s\n"),
+ quote (file), strerror (errno));
+ }
+ return err;
+}
+
+/* Does FILENAME exist? */
+bool
+file_exists_p (const char *filename, file_stats_t *fstats)
+{
+ struct stat buf;
+
+ if (!filename)
+ return false;
+
+#if defined(WINDOWS) || defined(__VMS)
+ int ret = stat (filename, &buf);
+ if (ret >= 0)
+ {
+ if (fstats != NULL)
+ fstats->access_err = errno;
+ }
+ return ret >= 0;
+#else
+ errno = 0;
+ if (stat (filename, &buf) == 0 && S_ISREG(buf.st_mode) &&
+ (((S_IRUSR & buf.st_mode) && (getuid() == buf.st_uid)) ||
+ ((S_IRGRP & buf.st_mode) && group_member(buf.st_gid)) ||
+ (S_IROTH & buf.st_mode))) {
+ if (fstats != NULL)
+ {
+ fstats->access_err = 0;
+ fstats->st_ino = buf.st_ino;
+ fstats->st_dev = buf.st_dev;
+ }
+ return true;
+ }
+ else
+ {
+ if (fstats != NULL)
+ fstats->access_err = (errno == 0 ? EACCES : errno);
+ errno = 0;
+ return false;
+ }
+ /* NOTREACHED */
+#endif
+}
+
+/* Returns 0 if PATH is a directory, 1 otherwise (any kind of file).
+ Returns 0 on error. */
+bool
+file_non_directory_p (const char *path)
+{
+ struct stat buf;
+ /* Use lstat() rather than stat() so that symbolic links pointing to
+ directories can be identified correctly. */
+ if (lstat (path, &buf) != 0)
+ return false;
+ return S_ISDIR (buf.st_mode) ? false : true;
+}
+
+/* Return the size of file named by FILENAME, or -1 if it cannot be
+ opened or sought into. */
+wgint
+file_size (const char *filename)
+{
+#if defined(HAVE_FSEEKO) && defined(HAVE_FTELLO)
+ wgint size;
+ /* We use fseek rather than stat to determine the file size because
+ that way we can also verify that the file is readable without
+ explicitly checking for permissions. Inspired by the POST patch
+ by Arnaud Wylie. */
+ FILE *fp = fopen (filename, "rb");
+ if (!fp)
+ return -1;
+ fseeko (fp, 0, SEEK_END);
+ size = ftello (fp);
+ fclose (fp);
+ return size;
+#else
+ struct stat st;
+ if (stat (filename, &st) < 0)
+ return -1;
+ return st.st_size;
+#endif
+}
+
+/* 2005-02-19 SMS.
+ If no UNIQ_SEP is defined (as on VMS), have unique_name() return the
+ original name. With the VMS file systems' versioning, everything
+ should be fine, and appending ".NN" just causes trouble.
+*/
+
+#ifdef UNIQ_SEP
+
+/* stat file names named PREFIX.1, PREFIX.2, etc., until one that
+ doesn't exist is found. Return a freshly allocated copy of the
+ unused file name. */
+
+static char *
+unique_name_1 (const char *prefix)
+{
+ int count = 1;
+ int plen = strlen (prefix);
+ char *template = xmalloc (plen + 1 + 24);
+ char *template_tail = template + plen;
+
+ memcpy (template, prefix, plen);
+ *template_tail++ = UNIQ_SEP;
+
+ do
+ number_to_string (template_tail, count++);
+ while (file_exists_p (template, NULL) && count < 999999);
+
+ return template;
+}
+
+/* Return a unique file name, based on FILE.
+
+ More precisely, if FILE doesn't exist, it is returned unmodified.
+ If not, FILE.1 is tried, then FILE.2, etc. The first FILE.<number>
+ file name that doesn't exist is returned.
+
+ 2005-02-19 SMS. "." is now UNIQ_SEP, and may be different.
+
+ The resulting file is not created, only verified that it didn't
+ exist at the point in time when the function was called.
+ Therefore, where security matters, don't rely that the file created
+ by this function exists until you open it with O_EXCL or
+ equivalent.
+
+ unique_name() always returns a freshly allocated string.
+
+ unique_name_passthrough() may return FILE if the file doesn't exist
+ (and therefore doesn't need changing). */
+
+char *
+unique_name_passthrough (const char *file)
+{
+ /* If the FILE itself doesn't exist, return it without
+ modification. Otherwise, find a numeric suffix that results in unused
+ file name and return it. */
+ return file_exists_p (file, NULL) ? unique_name_1 (file) : (char *) file;
+}
+
+char *
+unique_name (const char *file)
+{
+ /* If the FILE itself doesn't exist, return it without
+ modification. Otherwise, find a numeric suffix that results in unused
+ file name and return it. */
+ return file_exists_p (file, NULL) ? unique_name_1 (file) : xstrdup (file);
+}
+
+#else /* def UNIQ_SEP */
+
+/* Dummy unique_name() for VMS. Return the original name as easily as
+ possible.
+*/
+char *
+unique_name_passthrough (const char *file, bool allow_passthrough)
+{
+ /* Return the FILE itself, without modification, irregardful. */
+ return (char *) file);
+}
+char *
+
+unique_name (const char *file)
+{
+ /* Return the FILE itself, without modification, irregardful. */
+ return xstrdup (file);
+}
+
+#endif /* def UNIQ_SEP [else] */
+
+/* Create a file based on NAME, except without overwriting an existing
+ file with that name. Providing O_EXCL is correctly implemented,
+ this function does not have the race condition associated with
+ opening the file returned by unique_name. */
+
+FILE *
+unique_create (const char *name, bool binary, char **opened_name)
+{
+ /* unique file name, based on NAME */
+ char *uname = unique_name (name);
+ FILE *fp;
+ while ((fp = fopen_excl (uname, binary)) == NULL && errno == EEXIST)
+ {
+ xfree (uname);
+ uname = unique_name (name);
+ }
+ if (opened_name)
+ {
+ if (fp)
+ *opened_name = uname;
+ else
+ {
+ *opened_name = NULL;
+ xfree (uname);
+ }
+ }
+ else
+ xfree (uname);
+ return fp;
+}
+
+/* Open the file for writing, with the addition that the file is
+ opened "exclusively". This means that, if the file already exists,
+ this function will *fail* and errno will be set to EEXIST. If
+ BINARY is set, the file will be opened in binary mode, equivalent
+ to fopen's "wb".
+
+ If opening the file fails for any reason, including the file having
+ previously existed, this function returns NULL and sets errno
+ appropriately. */
+
+FILE *
+fopen_excl (const char *fname, int binary)
+{
+ int fd;
+#ifdef O_EXCL
+
+/* 2005-04-14 SMS.
+ VMS lacks O_BINARY, but makes up for it in weird and wonderful ways.
+ It also has file versions which obviate all the O_EXCL effort.
+ O_TRUNC (something of a misnomer) requests a new version.
+*/
+# ifdef __VMS
+/* Common open() optional arguments:
+ sequential access only, access callback function.
+*/
+# define OPEN_OPT_ARGS "fop=sqo", "acc", acc_cb, &open_id
+
+ int open_id;
+ int flags = O_WRONLY | O_CREAT | O_TRUNC;
+
+ if (binary > 1)
+ {
+ open_id = 11;
+ fd = open( fname, /* File name. */
+ flags, /* Flags. */
+ 0777, /* Mode for default protection. */
+ "ctx=bin,stm", /* Binary, stream access. */
+ "rfm=stmlf", /* Stream_LF. */
+ OPEN_OPT_ARGS); /* Access callback. */
+ }
+ else if (binary)
+ {
+ open_id = 12;
+ fd = open( fname, /* File name. */
+ flags, /* Flags. */
+ 0777, /* Mode for default protection. */
+ "ctx=bin,stm", /* Binary, stream access. */
+ "rfm=fix", /* Fixed-length, */
+ "mrs=512", /* 512-byte records. */
+ OPEN_OPT_ARGS); /* Access callback. */
+ }
+ else
+ {
+ open_id = 13;
+ fd = open( fname, /* File name. */
+ flags, /* Flags. */
+ 0777, /* Mode for default protection. */
+ "rfm=stmlf", /* Stream_LF. */
+ OPEN_OPT_ARGS); /* Access callback. */
+ }
+# else /* def __VMS */
+ int flags = O_WRONLY | O_CREAT | O_EXCL;
+# ifdef O_BINARY
+ if (binary)
+ flags |= O_BINARY;
+# endif
+ fd = open (fname, flags, 0666);
+# endif /* def __VMS [else] */
+
+ if (fd < 0)
+ return NULL;
+ return fdopen (fd, binary ? "wb" : "w");
+#else /* not O_EXCL */
+ /* Manually check whether the file exists. This is prone to race
+ conditions, but systems without O_EXCL haven't deserved
+ better. */
+ if (file_exists_p (fname, NULL))
+ {
+ errno = EEXIST;
+ return NULL;
+ }
+ return fopen (fname, binary ? "wb" : "w");
+#endif /* not O_EXCL */
+}
+
+/* fopen_stat() assumes that file_exists_p() was called earlier.
+ file_stats_t passed to this function was returned from file_exists_p()
+ This is to prevent TOCTTOU race condition.
+ Details : FIO45-C from https://www.securecoding.cert.org/
+ Note that for creating a new file, this check is not useful
+
+ Input:
+ fname => Name of file to open
+ mode => File open mode
+ fstats => Saved file_stats_t about file that was checked for existence
+
+ Returns:
+ NULL if there was an error
+ FILE * of opened file stream
+*/
+FILE *
+fopen_stat(const char *fname, const char *mode, file_stats_t *fstats)
+{
+ int fd;
+ FILE *fp;
+ struct stat fdstats;
+
+#if defined FUZZING && defined TESTING
+ fp = fopen_wgetrc (fname, mode);
+ return fp;
+#else
+ fp = fopen (fname, mode);
+#endif
+ if (fp == NULL)
+ {
+ logprintf (LOG_NOTQUIET, _("Failed to Fopen file %s\n"), fname);
+ return NULL;
+ }
+ fd = fileno (fp);
+ if (fd < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Failed to get FD for file %s\n"), fname);
+ fclose (fp);
+ return NULL;
+ }
+ memset(&fdstats, 0, sizeof(fdstats));
+ if (fstat (fd, &fdstats) == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("Failed to stat file %s, (check permissions)\n"), fname);
+ fclose (fp);
+ return NULL;
+ }
+#if !(defined(WINDOWS) || defined(__VMS))
+ if (fstats != NULL &&
+ (fdstats.st_dev != fstats->st_dev ||
+ fdstats.st_ino != fstats->st_ino))
+ {
+ /* File changed since file_exists_p() : NOT SAFE */
+ logprintf (LOG_NOTQUIET, _("File %s changed since the last check. Security check failed.\n"), fname);
+ fclose (fp);
+ return NULL;
+ }
+#endif
+
+ return fp;
+}
+
+/* open_stat assumes that file_exists_p() was called earlier to save file_stats
+ file_stats_t passed to this function was returned from file_exists_p()
+ This is to prevent TOCTTOU race condition.
+ Details : FIO45-C from https://www.securecoding.cert.org/
+ Note that for creating a new file, this check is not useful
+
+
+ Input:
+ fname => Name of file to open
+ flags => File open flags
+ mode => File open mode
+ fstats => Saved file_stats_t about file that was checked for existence
+
+ Returns:
+ -1 if there was an error
+ file descriptor of opened file stream
+*/
+int
+open_stat(const char *fname, int flags, mode_t mode, file_stats_t *fstats)
+{
+ int fd;
+ struct stat fdstats;
+
+ fd = open (fname, flags, mode);
+ if (fd < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Failed to open file %s, reason :%s\n"), fname, strerror(errno));
+ return -1;
+ }
+ memset(&fdstats, 0, sizeof(fdstats));
+ if (fstat (fd, &fdstats) == -1)
+ {
+ logprintf (LOG_NOTQUIET, _("Failed to stat file %s, error: %s\n"), fname, strerror(errno));
+ close (fd);
+ return -1;
+ }
+#if !(defined(WINDOWS) || defined(__VMS))
+ if (fstats != NULL &&
+ (fdstats.st_dev != fstats->st_dev ||
+ fdstats.st_ino != fstats->st_ino))
+ {
+ /* File changed since file_exists_p() : NOT SAFE */
+ logprintf (LOG_NOTQUIET, _("Trying to open file %s but it changed since last check. Security check failed.\n"), fname);
+ close (fd);
+ return -1;
+ }
+#endif
+
+ return fd;
+}
+
+/* Create DIRECTORY. If some of the pathname components of DIRECTORY
+ are missing, create them first. In case any mkdir() call fails,
+ return its error status. Returns 0 on successful completion.
+
+ The behaviour of this function should be identical to the behaviour
+ of `mkdir -p' on systems where mkdir supports the `-p' option. */
+int
+make_directory (const char *directory)
+{
+ int i, ret, quit = 0;
+ char buf[1024];
+ char *dir;
+ size_t len = strlen (directory);
+
+ /* Make a copy of dir, to be able to write to it. Otherwise, the
+ function is unsafe if called with a read-only char *argument. */
+ if (len < sizeof(buf))
+ {
+ memcpy(buf, directory, len + 1);
+ dir = buf;
+ }
+ else
+ dir = xstrdup(directory);
+
+ /* If the first character of dir is '/', skip it (and thus enable
+ creation of absolute-pathname directories. */
+ for (i = (*dir == '/'); 1; ++i)
+ {
+ for (; dir[i] && dir[i] != '/'; i++)
+ ;
+ if (!dir[i])
+ quit = 1;
+ dir[i] = '\0';
+ /* Check whether the directory already exists. Allow creation of
+ of intermediate directories to fail, as the initial path components
+ are not necessarily directories! */
+ if (!file_exists_p (dir, NULL))
+ ret = mkdir (dir, 0777);
+ else
+ ret = 0;
+ if (quit)
+ break;
+ else
+ dir[i] = '/';
+ }
+
+ if (dir != buf)
+ xfree (dir);
+
+ return ret;
+}
+
+/* Merge BASE with FILE. BASE can be a directory or a file name, FILE
+ should be a file name.
+
+ file_merge("/foo/bar", "baz") => "/foo/baz"
+ file_merge("/foo/bar/", "baz") => "/foo/bar/baz"
+ file_merge("foo", "bar") => "bar"
+
+ In other words, it's a simpler and gentler version of uri_merge. */
+
+char *
+file_merge (const char *base, const char *file)
+{
+ char *result;
+ const char *cut = (const char *)strrchr (base, '/');
+
+ if (!cut)
+ return xstrdup (file);
+
+ result = xmalloc (cut - base + 1 + strlen (file) + 1);
+ memcpy (result, base, cut - base);
+ result[cut - base] = '/';
+ strcpy (result + (cut - base) + 1, file);
+
+ return result;
+}
+
+/* Like fnmatch, but performs a case-insensitive match. */
+
+int
+fnmatch_nocase (const char *pattern, const char *string, int flags)
+{
+ /* The FNM_CASEFOLD flag started as a GNU extension, but it is now
+ also present on *BSD platforms, and possibly elsewhere.
+ Gnulib provides this flag in case it doesn't exist. */
+ return fnmatch (pattern, string, flags | FNM_CASEFOLD);
+}
+
+static bool in_acclist (const char *const *, const char *, bool);
+
+/* Determine whether a file is acceptable to be followed, according to
+ lists of patterns to accept/reject. */
+bool
+acceptable (const char *s)
+{
+ const char *p;
+
+ if (opt.output_document && strcmp (s, opt.output_document) == 0)
+ return true;
+
+ if ((p = strrchr (s, '/')))
+ s = p + 1;
+
+ if (opt.accepts)
+ {
+ if (opt.rejects)
+ return (in_acclist ((const char *const *)opt.accepts, s, true)
+ && !in_acclist ((const char *const *)opt.rejects, s, true));
+ else
+ return in_acclist ((const char *const *)opt.accepts, s, true);
+ }
+ else if (opt.rejects)
+ return !in_acclist ((const char *const *)opt.rejects, s, true);
+
+ return true;
+}
+
+/* Determine whether an URL is acceptable to be followed, according to
+ regex patterns to accept/reject. */
+bool
+accept_url (const char *s)
+{
+ if (opt.acceptregex && !opt.regex_match_fun (opt.acceptregex, s))
+ return false;
+ if (opt.rejectregex && opt.regex_match_fun (opt.rejectregex, s))
+ return false;
+
+ return true;
+}
+
+/* Check if D2 is a subdirectory of D1. E.g. if D1 is `/something', subdir_p()
+ will return true if and only if D2 begins with `/something/' or is exactly
+ '/something'. */
+bool
+subdir_p (const char *d1, const char *d2)
+{
+ if (*d1 == '\0')
+ return true;
+ if (!opt.ignore_case)
+ for (; *d1 && *d2 && (*d1 == *d2); ++d1, ++d2)
+ ;
+ else
+ for (; *d1 && *d2 && (c_tolower (*d1) == c_tolower (*d2)); ++d1, ++d2)
+ ;
+
+ return *d1 == '\0' && (*d2 == '\0' || *d2 == '/');
+}
+
+/* Iterate through DIRLIST (which must be NULL-terminated), and return the
+ first element that matches DIR, through wildcards or front comparison (as
+ appropriate). */
+static bool
+dir_matches_p (const char **dirlist, const char *dir)
+{
+ const char **x;
+ int (*matcher) (const char *, const char *, int)
+ = opt.ignore_case ? fnmatch_nocase : fnmatch;
+
+ for (x = dirlist; *x; x++)
+ {
+ /* Remove leading '/' */
+ const char *p = *x + (**x == '/');
+ if (has_wildcards_p (p))
+ {
+ if (matcher (p, dir, FNM_PATHNAME) == 0)
+ break;
+ }
+ else
+ {
+ if (subdir_p (p, dir))
+ break;
+ }
+ }
+
+ return *x ? true : false;
+}
+
+/* Returns whether DIRECTORY is acceptable for download, wrt the
+ include/exclude lists.
+
+ The leading `/' is ignored in paths; relative and absolute paths
+ may be freely intermixed. */
+
+bool
+accdir (const char *directory)
+{
+ /* Remove starting '/'. */
+ if (*directory == '/')
+ ++directory;
+ if (opt.includes)
+ {
+ if (!dir_matches_p (opt.includes, directory))
+ return false;
+ }
+ if (opt.excludes)
+ {
+ if (dir_matches_p (opt.excludes, directory))
+ return false;
+ }
+ return true;
+}
+
+/* Return true if STRING ends with TAIL. For instance:
+
+ match_tail ("abc", "bc", false) -> 1
+ match_tail ("abc", "ab", false) -> 0
+ match_tail ("abc", "abc", false) -> 1
+
+ If FOLD_CASE is true, the comparison will be case-insensitive. */
+
+bool
+match_tail (const char *string, const char *tail, bool fold_case)
+{
+ int pos = (int) strlen (string) - (int) strlen (tail);
+
+ if (pos < 0)
+ return false; /* tail is longer than string. */
+
+ if (!fold_case)
+ return !strcmp (string + pos, tail);
+ else
+ return !strcasecmp (string + pos, tail);
+}
+
+/* Checks whether string S matches each element of ACCEPTS. A list
+ element are matched either with fnmatch() or match_tail(),
+ according to whether the element contains wildcards or not.
+
+ If the BACKWARD is false, don't do backward comparison -- just compare
+ them normally. */
+static bool
+in_acclist (const char *const *accepts, const char *s, bool backward)
+{
+ for (; *accepts; accepts++)
+ {
+ if (has_wildcards_p (*accepts))
+ {
+ int res = opt.ignore_case
+ ? fnmatch_nocase (*accepts, s, 0) : fnmatch (*accepts, s, 0);
+ /* fnmatch returns 0 if the pattern *does* match the string. */
+ if (res == 0)
+ return true;
+ }
+ else
+ {
+ if (backward)
+ {
+ if (match_tail (s, *accepts, opt.ignore_case))
+ return true;
+ }
+ else
+ {
+ int cmp = opt.ignore_case
+ ? strcasecmp (s, *accepts) : strcmp (s, *accepts);
+ if (cmp == 0)
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+/* Return the location of STR's suffix (file extension). Examples:
+ suffix ("foo.bar") -> "bar"
+ suffix ("foo.bar.baz") -> "baz"
+ suffix ("/foo/bar") -> NULL
+ suffix ("/foo.bar/baz") -> NULL */
+char *
+suffix (const char *str)
+{
+ char *p;
+
+ if ((p = strrchr (str, '.')) && !strchr (p + 1, '/'))
+ return p + 1;
+
+ return NULL;
+}
+
+/* Return true if S contains globbing wildcards (`*', `?', `[' or
+ `]'). */
+
+bool
+has_wildcards_p (const char *s)
+{
+ return !!strpbrk (s, "*?[]");
+}
+
+/* Return true if FNAME ends with a typical HTML suffix. The
+ following (case-insensitive) suffixes are presumed to be HTML
+ files:
+
+ html
+ htm
+ ?html (`?' matches one character)
+
+ #### CAVEAT. This is not necessarily a good indication that FNAME
+ refers to a file that contains HTML! */
+bool
+has_html_suffix_p (const char *fname)
+{
+ char *suf;
+
+ if ((suf = suffix (fname)) == NULL)
+ return false;
+ if (!c_strcasecmp (suf, "html"))
+ return true;
+ if (!c_strcasecmp (suf, "htm"))
+ return true;
+ if (suf[0] && !c_strcasecmp (suf + 1, "html"))
+ return true;
+ return false;
+}
+
+/* Read FILE into memory. A pointer to `struct file_memory' are
+ returned; use struct element `content' to access file contents, and
+ the element `length' to know the file length. `content' is *not*
+ zero-terminated, and you should *not* read or write beyond the [0,
+ length) range of characters.
+
+ After you are done with the file contents, call wget_read_file_free to
+ release the memory.
+
+ Depending on the operating system and the type of file that is
+ being read, wget_read_file() either mmap's the file into memory, or
+ reads the file into the core using read().
+
+ If file is named "-", fileno(stdin) is used for reading instead.
+ If you want to read from a real file named "-", use "./-" instead. */
+
+struct file_memory *
+wget_read_file (const char *file)
+{
+ int fd;
+ struct file_memory *fm;
+ long size;
+ bool inhibit_close = false;
+
+ /* Some magic in the finest tradition of Perl and its kin: if FILE
+ is "-", just use stdin. */
+#ifndef FUZZING
+ if (HYPHENP (file))
+ {
+ fd = fileno (stdin);
+ inhibit_close = true;
+ /* Note that we don't inhibit mmap() in this case. If stdin is
+ redirected from a regular file, mmap() will still work. */
+ }
+ else
+#endif
+ fd = open (file, O_RDONLY);
+ if (fd < 0)
+ return NULL;
+ fm = xnew (struct file_memory);
+
+#ifdef HAVE_MMAP
+ {
+ struct stat buf;
+ if (fstat (fd, &buf) < 0)
+ goto mmap_lose;
+ fm->length = buf.st_size;
+ /* NOTE: As far as I know, the callers of this function never
+ modify the file text. Relying on this would enable us to
+ specify PROT_READ and MAP_SHARED for a marginal gain in
+ efficiency, but at some cost to generality. */
+ fm->content = mmap (NULL, fm->length, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE, fd, 0);
+ if (fm->content == (char *)MAP_FAILED)
+ goto mmap_lose;
+ if (!inhibit_close)
+ close (fd);
+
+ fm->mmap_p = 1;
+ return fm;
+ }
+
+ mmap_lose:
+ /* The most common reason why mmap() fails is that FD does not point
+ to a plain file. However, it's also possible that mmap() doesn't
+ work for a particular type of file. Therefore, whenever mmap()
+ fails, we just fall back to the regular method. */
+#endif /* HAVE_MMAP */
+
+ fm->length = 0;
+ size = 512; /* number of bytes fm->contents can
+ hold at any given time. */
+ fm->content = xmalloc (size);
+ while (1)
+ {
+ wgint nread;
+ if (fm->length > size / 2)
+ {
+ /* #### I'm not sure whether the whole exponential-growth
+ thing makes sense with kernel read. On Linux at least,
+ read() refuses to read more than 4K from a file at a
+ single chunk anyway. But other Unixes might optimize it
+ better, and it doesn't *hurt* anything, so I'm leaving
+ it. */
+
+ /* Normally, we grow SIZE exponentially to make the number
+ of calls to read() and realloc() logarithmic in relation
+ to file size. However, read() can read an amount of data
+ smaller than requested, and it would be unreasonable to
+ double SIZE every time *something* was read. Therefore,
+ we double SIZE only when the length exceeds half of the
+ entire allocated size. */
+ size <<= 1;
+ fm->content = xrealloc (fm->content, size);
+ }
+ nread = read (fd, fm->content + fm->length, size - fm->length);
+ if (nread > 0)
+ /* Successful read. */
+ fm->length += nread;
+ else if (nread < 0)
+ /* Error. */
+ goto lose;
+ else
+ /* EOF */
+ break;
+ }
+ if (!inhibit_close)
+ close (fd);
+ if (size > fm->length && fm->length != 0)
+ /* Due to exponential growth of fm->content, the allocated region
+ might be much larger than what is actually needed. */
+ fm->content = xrealloc (fm->content, fm->length);
+ fm->mmap_p = 0;
+ return fm;
+
+ lose:
+ if (!inhibit_close)
+ close (fd);
+ xfree (fm->content);
+ xfree (fm);
+ return NULL;
+}
+
+/* Release the resources held by FM. Specifically, this calls
+ munmap() or xfree() on fm->content, depending whether mmap or
+ malloc/read were used to read in the file. It also frees the
+ memory needed to hold the FM structure itself. */
+
+void
+wget_read_file_free (struct file_memory *fm)
+{
+#ifdef HAVE_MMAP
+ if (fm->mmap_p)
+ {
+ munmap (fm->content, fm->length);
+ }
+ else
+#endif
+ {
+ xfree (fm->content);
+ }
+ xfree (fm);
+}
+
+/* Free the pointers in a NULL-terminated vector of pointers, then
+ free the pointer itself. */
+void
+free_vec (char **vec)
+{
+ if (vec)
+ {
+ char **p = vec;
+ while (*p)
+ {
+ xfree (*p);
+ p++;
+ }
+ xfree (vec);
+ }
+}
+
+/* Append vector V2 to vector V1. The function frees V2 and
+ reallocates V1 (thus you may not use the contents of neither
+ pointer after the call). If V1 is NULL, V2 is returned. */
+char **
+merge_vecs (char **v1, char **v2)
+{
+ int i, j;
+
+ if (!v1)
+ return v2;
+ if (!v2)
+ return v1;
+ if (!*v2)
+ {
+ /* To avoid j == 0 */
+ xfree (v2);
+ return v1;
+ }
+ /* Count v1. */
+ for (i = 0; v1[i]; i++)
+ ;
+ /* Count v2. */
+ for (j = 0; v2[j]; j++)
+ ;
+ /* Reallocate v1. */
+ v1 = xrealloc (v1, (i + j + 1) * sizeof (char *));
+ memcpy (v1 + i, v2, (j + 1) * sizeof (char *));
+ xfree (v2);
+ return v1;
+}
+
+/* Append a freshly allocated copy of STR to VEC. If VEC is NULL, it
+ is allocated as needed. Return the new value of the vector. */
+
+char **
+vec_append (char **vec, const char *str)
+{
+ int cnt; /* count of vector elements, including
+ the one we're about to append */
+ if (vec != NULL)
+ {
+ for (cnt = 0; vec[cnt]; cnt++)
+ ;
+ ++cnt;
+ }
+ else
+ cnt = 1;
+ /* Reallocate the array to fit the new element and the NULL. */
+ vec = xrealloc (vec, (cnt + 1) * sizeof (char *));
+ /* Append a copy of STR to the vector. */
+ vec[cnt - 1] = xstrdup (str);
+ vec[cnt] = NULL;
+ return vec;
+}
+
+/* Sometimes it's useful to create "sets" of strings, i.e. special
+ hash tables where you want to store strings as keys and merely
+ query for their existence. Here is a set of utility routines that
+ makes that transparent. */
+
+void
+string_set_add (struct hash_table *ht, const char *s)
+{
+ /* First check whether the set element already exists. If it does,
+ do nothing so that we don't have to free() the old element and
+ then strdup() a new one. */
+ if (hash_table_contains (ht, s))
+ return;
+
+ /* We use "1" as value. It provides us a useful and clear arbitrary
+ value, and it consumes no memory -- the pointers to the same
+ string "1" will be shared by all the key-value pairs in all `set'
+ hash tables. */
+ hash_table_put (ht, xstrdup (s), "1");
+}
+
+/* Synonym for hash_table_contains... */
+
+int
+string_set_contains (struct hash_table *ht, const char *s)
+{
+ return hash_table_contains (ht, s);
+}
+
+/* Convert the specified string set to array. ARRAY should be large
+ enough to hold hash_table_count(ht) char pointers. */
+
+void string_set_to_array (struct hash_table *ht, char **array)
+{
+ hash_table_iterator iter;
+ for (hash_table_iterate (ht, &iter); hash_table_iter_next (&iter); )
+ *array++ = iter.key;
+}
+
+/* Free the string set. This frees both the storage allocated for
+ keys and the actual hash table. (hash_table_destroy would only
+ destroy the hash table.) */
+
+void
+string_set_free (struct hash_table *ht)
+{
+ hash_table_iterator iter;
+ for (hash_table_iterate (ht, &iter); hash_table_iter_next (&iter); )
+ xfree (iter.key);
+ hash_table_destroy (ht);
+}
+
+/* Utility function: simply call xfree() on all keys and values of HT. */
+
+void
+free_keys_and_values (struct hash_table *ht)
+{
+ hash_table_iterator iter;
+ for (hash_table_iterate (ht, &iter); hash_table_iter_next (&iter); )
+ {
+ xfree (iter.key);
+ xfree (iter.value);
+ }
+}
+
+/* Get digit grouping data for thousand separors by calling
+ localeconv(). The data includes separator string and grouping info
+ and is cached after the first call to the function.
+
+ In locales that don't set a thousand separator (such as the "C"
+ locale), this forces it to be ",". We are now only showing
+ thousand separators in one place, so this shouldn't be a problem in
+ practice. */
+
+static void
+get_grouping_data (const char **sep, const char **grouping)
+{
+ static const char *cached_sep;
+ static const char *cached_grouping;
+ static bool initialized;
+ if (!initialized)
+ {
+ /* Get the grouping info from the locale. */
+ struct lconv *lconv = localeconv ();
+ cached_sep = lconv->thousands_sep;
+ cached_grouping = lconv->grouping;
+#if ! USE_NLS_PROGRESS_BAR
+ /* We can't count column widths, so ensure that the separator
+ * is single-byte only (let check below determine what byte). */
+ if (strlen(cached_sep) > 1)
+ cached_sep = "";
+#endif
+ if (!*cached_sep)
+ {
+ /* Many locales (such as "C" or "hr_HR") don't specify
+ grouping, which we still want to use it for legibility.
+ In those locales set the sep char to ',', unless that
+ character is used for decimal point, in which case set it
+ to ".". */
+ if (*lconv->decimal_point != ',')
+ cached_sep = ",";
+ else
+ cached_sep = ".";
+ cached_grouping = "\x03";
+ }
+ initialized = true;
+ }
+ *sep = cached_sep;
+ *grouping = cached_grouping;
+}
+
+/* Return a printed representation of N with thousand separators.
+ This should respect locale settings, with the exception of the "C"
+ locale which mandates no separator, but we use one anyway.
+
+ Unfortunately, we cannot use %'d (in fact it would be %'j) to get
+ the separators because it's too non-portable, and it's hard to test
+ for this feature at configure time. Besides, it wouldn't display
+ separators in the "C" locale, still used by many Unix users. */
+
+const char *
+with_thousand_seps (wgint n)
+{
+ static char outbuf[48];
+ char *p = outbuf + sizeof outbuf;
+
+ /* Info received from locale */
+ const char *grouping, *sep;
+ int seplen;
+
+ /* State information */
+ int i = 0, groupsize;
+ const char *atgroup;
+
+ bool negative = n < 0;
+
+ /* Initialize grouping data. */
+ get_grouping_data (&sep, &grouping);
+ seplen = strlen (sep);
+ atgroup = grouping;
+ groupsize = *atgroup++;
+
+ /* This would overflow on WGINT_MIN, but printing negative numbers
+ is not an important goal of this fuinction. */
+ if (negative)
+ n = -n;
+
+ /* Write the number into the buffer, backwards, inserting the
+ separators as necessary. */
+ *--p = '\0';
+ while (1)
+ {
+ *--p = n % 10 + '0';
+ n /= 10;
+ if (n == 0)
+ break;
+ /* Prepend SEP to every groupsize'd digit and get new groupsize. */
+ if (++i == groupsize)
+ {
+ if (seplen == 1)
+ *--p = *sep;
+ else
+ memcpy (p -= seplen, sep, seplen);
+ i = 0;
+ if (*atgroup)
+ groupsize = *atgroup++;
+ }
+ }
+ if (negative)
+ *--p = '-';
+
+ return p;
+}
+
+/* N, a byte quantity, is converted to a human-readable abberviated
+ form a la sizes printed by `ls -lh'. The result is written to a
+ static buffer, a pointer to which is returned.
+
+ Unlike `with_thousand_seps', this approximates to the nearest unit.
+ Quoting GNU libit: "Most people visually process strings of 3-4
+ digits effectively, but longer strings of digits are more prone to
+ misinterpretation. Hence, converting to an abbreviated form
+ usually improves readability."
+
+ This intentionally uses kilobyte (KB), megabyte (MB), etc. in their
+ original computer-related meaning of "powers of 1024". We don't
+ use the "*bibyte" names invented in 1998, and seldom used in
+ practice. Wikipedia's entry on "binary prefix" discusses this in
+ some detail. */
+
+char *
+human_readable (wgint n, const int acc, const int decimals)
+{
+ /* These suffixes are compatible with those of GNU `ls -lh'. */
+ static char powers[] =
+ {
+ 'K', /* kilobyte, 2^10 bytes */
+ 'M', /* megabyte, 2^20 bytes */
+ 'G', /* gigabyte, 2^30 bytes */
+ 'T', /* terabyte, 2^40 bytes */
+ 'P', /* petabyte, 2^50 bytes */
+ 'E', /* exabyte, 2^60 bytes */
+ };
+ static char buf[8];
+ size_t i;
+
+ /* If the quantity is smaller than 1K, just print it. */
+ if (n < 1024)
+ {
+ snprintf (buf, sizeof (buf), "%d", (int) n);
+ return buf;
+ }
+
+ /* Loop over powers, dividing N with 1024 in each iteration. This
+ works unchanged for all sizes of wgint, while still avoiding
+ non-portable `long double' arithmetic. */
+ for (i = 0; i < countof (powers); i++)
+ {
+ /* At each iteration N is greater than the *subsequent* power.
+ That way N/1024.0 produces a decimal number in the units of
+ *this* power. */
+ if ((n / 1024) < 1024 || i == countof (powers) - 1)
+ {
+ double val = n / 1024.0;
+ /* Print values smaller than the accuracy level (acc) with (decimal)
+ * decimal digits, and others without any decimals. */
+ snprintf (buf, sizeof (buf), "%.*f%c",
+ val < acc ? decimals : 0, val, powers[i]);
+ return buf;
+ }
+ n /= 1024;
+ }
+ return NULL; /* unreached */
+}
+
+/* Count the digits in the provided number. Used to allocate space
+ when printing numbers. */
+
+int
+numdigit (wgint number)
+{
+ int cnt = 1;
+ if (number < 0)
+ ++cnt; /* accommodate '-' */
+ while ((number /= 10) != 0)
+ ++cnt;
+ return cnt;
+}
+
+#define PR(mask) *p++ = n / (mask) + '0'
+
+/* DIGITS_<D> is used to print a D-digit number and should be called
+ with mask==10^(D-1). It prints n/mask (the first digit), reducing
+ n to n%mask (the remaining digits), and calling DIGITS_<D-1>.
+ Recursively this continues until DIGITS_1 is invoked. */
+
+#define DIGITS_1(mask) PR (mask)
+#define DIGITS_2(mask) PR (mask), n %= (mask), DIGITS_1 ((mask) / 10)
+#define DIGITS_3(mask) PR (mask), n %= (mask), DIGITS_2 ((mask) / 10)
+#define DIGITS_4(mask) PR (mask), n %= (mask), DIGITS_3 ((mask) / 10)
+#define DIGITS_5(mask) PR (mask), n %= (mask), DIGITS_4 ((mask) / 10)
+#define DIGITS_6(mask) PR (mask), n %= (mask), DIGITS_5 ((mask) / 10)
+#define DIGITS_7(mask) PR (mask), n %= (mask), DIGITS_6 ((mask) / 10)
+#define DIGITS_8(mask) PR (mask), n %= (mask), DIGITS_7 ((mask) / 10)
+#define DIGITS_9(mask) PR (mask), n %= (mask), DIGITS_8 ((mask) / 10)
+#define DIGITS_10(mask) PR (mask), n %= (mask), DIGITS_9 ((mask) / 10)
+
+/* DIGITS_<11-20> are only used on machines with 64-bit wgints. */
+
+#define DIGITS_11(mask) PR (mask), n %= (mask), DIGITS_10 ((mask) / 10)
+#define DIGITS_12(mask) PR (mask), n %= (mask), DIGITS_11 ((mask) / 10)
+#define DIGITS_13(mask) PR (mask), n %= (mask), DIGITS_12 ((mask) / 10)
+#define DIGITS_14(mask) PR (mask), n %= (mask), DIGITS_13 ((mask) / 10)
+#define DIGITS_15(mask) PR (mask), n %= (mask), DIGITS_14 ((mask) / 10)
+#define DIGITS_16(mask) PR (mask), n %= (mask), DIGITS_15 ((mask) / 10)
+#define DIGITS_17(mask) PR (mask), n %= (mask), DIGITS_16 ((mask) / 10)
+#define DIGITS_18(mask) PR (mask), n %= (mask), DIGITS_17 ((mask) / 10)
+#define DIGITS_19(mask) PR (mask), n %= (mask), DIGITS_18 ((mask) / 10)
+
+/* Shorthand for casting to wgint. */
+#define W wgint
+
+/* Print NUMBER to BUFFER in base 10. This is equivalent to
+ `sprintf(buffer, "%lld", (long long) number)', only typically much
+ faster and portable to machines without long long.
+
+ The speedup may make a difference in programs that frequently
+ convert numbers to strings. Some implementations of sprintf,
+ particularly the one in some versions of GNU libc, have been known
+ to be quite slow when converting integers to strings.
+
+ Return the pointer to the location where the terminating zero was
+ printed. (Equivalent to calling buffer+strlen(buffer) after the
+ function is done.)
+
+ BUFFER should be large enough to accept as many bytes as you expect
+ the number to take up. On machines with 64-bit wgints the maximum
+ needed size is 24 bytes. That includes the digits needed for the
+ largest 64-bit number, the `-' sign in case it's negative, and the
+ terminating '\0'. */
+
+char *
+number_to_string (char *buffer, wgint number)
+{
+ char *p = buffer;
+ wgint n = number;
+
+ int last_digit_char = 0;
+
+ if (n < 0)
+ {
+ if (n < -WGINT_MAX)
+ {
+ /* n = -n would overflow because -n would evaluate to a
+ wgint value larger than WGINT_MAX. Need to make n
+ smaller and handle the last digit separately. */
+ int last_digit = n % 10;
+ /* The sign of n%10 is implementation-defined. */
+ if (last_digit < 0)
+ last_digit_char = '0' - last_digit;
+ else
+ last_digit_char = '0' + last_digit;
+ /* After n is made smaller, -n will not overflow. */
+ n /= 10;
+ }
+
+ *p++ = '-';
+ n = -n;
+ }
+
+ /* Use the DIGITS_ macro appropriate for N's number of digits. That
+ way printing any N is fully open-coded without a loop or jump.
+ (Also see description of DIGITS_*.) */
+
+ if (n < 10) DIGITS_1 (1);
+ else if (n < 100) DIGITS_2 (10);
+ else if (n < 1000) DIGITS_3 (100);
+ else if (n < 10000) DIGITS_4 (1000);
+ else if (n < 100000) DIGITS_5 (10000);
+ else if (n < 1000000) DIGITS_6 (100000);
+ else if (n < 10000000) DIGITS_7 (1000000);
+ else if (n < 100000000) DIGITS_8 (10000000);
+ else if (n < 1000000000) DIGITS_9 (100000000);
+ else if (n < 10*(W)1000000000) DIGITS_10 (1000000000);
+ else if (n < 100*(W)1000000000) DIGITS_11 (10*(W)1000000000);
+ else if (n < 1000*(W)1000000000) DIGITS_12 (100*(W)1000000000);
+ else if (n < 10000*(W)1000000000) DIGITS_13 (1000*(W)1000000000);
+ else if (n < 100000*(W)1000000000) DIGITS_14 (10000*(W)1000000000);
+ else if (n < 1000000*(W)1000000000) DIGITS_15 (100000*(W)1000000000);
+ else if (n < 10000000*(W)1000000000) DIGITS_16 (1000000*(W)1000000000);
+ else if (n < 100000000*(W)1000000000) DIGITS_17 (10000000*(W)1000000000);
+ else if (n < 1000000000*(W)1000000000) DIGITS_18 (100000000*(W)1000000000);
+ else DIGITS_19 (1000000000*(W)1000000000);
+
+ if (last_digit_char)
+ *p++ = last_digit_char;
+
+ *p = '\0';
+
+ return p;
+}
+
+#undef PR
+#undef W
+#undef SPRINTF_WGINT
+#undef DIGITS_1
+#undef DIGITS_2
+#undef DIGITS_3
+#undef DIGITS_4
+#undef DIGITS_5
+#undef DIGITS_6
+#undef DIGITS_7
+#undef DIGITS_8
+#undef DIGITS_9
+#undef DIGITS_10
+#undef DIGITS_11
+#undef DIGITS_12
+#undef DIGITS_13
+#undef DIGITS_14
+#undef DIGITS_15
+#undef DIGITS_16
+#undef DIGITS_17
+#undef DIGITS_18
+#undef DIGITS_19
+
+#define RING_SIZE 3
+
+/* Print NUMBER to a statically allocated string and return a pointer
+ to the printed representation.
+
+ This function is intended to be used in conjunction with printf.
+ It is hard to portably print wgint values:
+ a) you cannot use printf("%ld", number) because wgint can be long
+ long on 32-bit machines with LFS.
+ b) you cannot use printf("%lld", number) because NUMBER could be
+ long on 32-bit machines without LFS, or on 64-bit machines,
+ which do not require LFS. Also, Windows doesn't support %lld.
+ c) you cannot use printf("%j", (int_max_t) number) because not all
+ versions of printf support "%j", the most notable being the one
+ on Windows.
+ d) you cannot #define WGINT_FMT to the appropriate format and use
+ printf(WGINT_FMT, number) because that would break translations
+ for user-visible messages, such as printf("Downloaded: %d
+ bytes\n", number).
+
+ What you should use instead is printf("%s", number_to_static_string
+ (number)).
+
+ CAVEAT: since the function returns pointers to static data, you
+ must be careful to copy its result before calling it again.
+ However, to make it more useful with printf, the function maintains
+ an internal ring of static buffers to return. That way things like
+ printf("%s %s", number_to_static_string (num1),
+ number_to_static_string (num2)) work as expected. Three buffers
+ are currently used, which means that "%s %s %s" will work, but "%s
+ %s %s %s" won't. If you need to print more than three wgints,
+ bump the RING_SIZE (or rethink your message.) */
+
+char *
+number_to_static_string (wgint number)
+{
+ static char ring[RING_SIZE][24];
+ static int ringpos;
+ char *buf = ring[ringpos];
+ number_to_string (buf, number);
+ ringpos = (ringpos + 1) % RING_SIZE;
+ return buf;
+}
+
+/* Converts the byte to bits format if --report-bps option is enabled
+ */
+wgint
+convert_to_bits (wgint num)
+{
+ if (opt.report_bps)
+ return num * 8;
+ return num;
+}
+
+
+/* Determine the width of the terminal we're running on. If that's
+ not possible, return 0. */
+
+int
+determine_screen_width (void)
+{
+ /* If there's a way to get the terminal size using POSIX
+ tcgetattr(), somebody please tell me. */
+#ifdef TIOCGWINSZ
+ int fd;
+ struct winsize wsz;
+
+ if (opt.lfilename != NULL && opt.show_progress != 1)
+ return 0;
+
+ fd = fileno (stderr);
+ if (ioctl (fd, TIOCGWINSZ, &wsz) < 0)
+ return 0; /* most likely ENOTTY */
+
+ return wsz.ws_col;
+#elif defined(WINDOWS)
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+ if (!GetConsoleScreenBufferInfo (GetStdHandle (STD_ERROR_HANDLE), &csbi))
+ return 0;
+ return csbi.dwSize.X;
+#else /* neither TIOCGWINSZ nor WINDOWS */
+ return 0;
+#endif /* neither TIOCGWINSZ nor WINDOWS */
+}
+
+/* Whether the rnd system (either rand or [dl]rand48) has been
+ seeded. */
+static int rnd_seeded;
+
+/* Return a random number between 0 and MAX-1, inclusive.
+
+ If the system does not support lrand48 and MAX is greater than the
+ value of RAND_MAX+1 on the system, the returned value will be in
+ the range [0, RAND_MAX]. This may be fixed in a future release.
+ The random number generator is seeded automatically the first time
+ it is called.
+
+ This uses lrand48 where available, rand elsewhere. DO NOT use it
+ for cryptography. It is only meant to be used in situations where
+ quality of the random numbers returned doesn't really matter. */
+
+int
+random_number (int max)
+{
+#ifdef HAVE_RANDOM
+ if (!rnd_seeded)
+ {
+ srandom ((long) time (NULL) ^ (long) getpid ());
+ rnd_seeded = 1;
+ }
+ return random () % max;
+#elif defined HAVE_DRAND48
+ if (!rnd_seeded)
+ {
+ srand48 ((long) time (NULL) ^ (long) getpid ());
+ rnd_seeded = 1;
+ }
+ return lrand48 () % max;
+#else /* not HAVE_DRAND48 */
+
+ double bounded;
+ int rnd;
+ if (!rnd_seeded)
+ {
+ srand ((unsigned) time (NULL) ^ (unsigned) getpid ());
+ rnd_seeded = 1;
+ }
+ rnd = rand ();
+
+ /* Like rand() % max, but uses the high-order bits for better
+ randomness on architectures where rand() is implemented using a
+ simple congruential generator. */
+
+ bounded = (double) max * rnd / (RAND_MAX + 1.0);
+ return (int) bounded;
+
+#endif /* not HAVE_DRAND48 */
+}
+
+/* Return a random uniformly distributed floating point number in the
+ [0, 1) range. Uses drand48 where available, and a really lame
+ kludge elsewhere. */
+
+double
+random_float (void)
+{
+#ifdef HAVE_RANDOM
+ return ((double) random_number (RAND_MAX)) / RAND_MAX;
+#elif defined HAVE_DRAND48
+ if (!rnd_seeded)
+ {
+ srand48 ((long) time (NULL) ^ (long) getpid ());
+ rnd_seeded = 1;
+ }
+ return drand48 ();
+#else /* not HAVE_DRAND48 */
+ return ( random_number (10000) / 10000.0
+ + random_number (10000) / (10000.0 * 10000.0)
+ + random_number (10000) / (10000.0 * 10000.0 * 10000.0)
+ + random_number (10000) / (10000.0 * 10000.0 * 10000.0 * 10000.0));
+#endif /* not HAVE_DRAND48 */
+}
+
+/* Implementation of run_with_timeout, a generic timeout-forcing
+ routine for systems with Unix-like signal handling. */
+
+#ifdef USE_SIGNAL_TIMEOUT
+# ifdef HAVE_SIGSETJMP
+# define SETJMP(env) sigsetjmp (env, 1)
+
+static sigjmp_buf run_with_timeout_env;
+
+_Noreturn static void
+abort_run_with_timeout (int sig _GL_UNUSED)
+{
+ assert (sig == SIGALRM);
+ siglongjmp (run_with_timeout_env, -1);
+}
+# else /* not HAVE_SIGSETJMP */
+# define SETJMP(env) setjmp (env)
+
+static jmp_buf run_with_timeout_env;
+
+static void _Noreturn
+abort_run_with_timeout (int sig _GL_UNUSED)
+{
+ assert (sig == SIGALRM);
+ /* We don't have siglongjmp to preserve the set of blocked signals;
+ if we longjumped out of the handler at this point, SIGALRM would
+ remain blocked. We must unblock it manually. */
+ sigset_t set;
+ sigemptyset (&set);
+ sigaddset (&set, SIGALRM);
+ sigprocmask (SIG_BLOCK, &set, NULL);
+
+ /* Now it's safe to longjump. */
+ longjmp (run_with_timeout_env, -1);
+}
+# endif /* not HAVE_SIGSETJMP */
+
+/* Arrange for SIGALRM to be delivered in TIMEOUT seconds. This uses
+ setitimer where available, alarm otherwise.
+
+ TIMEOUT should be non-zero. If the timeout value is so small that
+ it would be rounded to zero, it is rounded to the least legal value
+ instead (1us for setitimer, 1s for alarm). That ensures that
+ SIGALRM will be delivered in all cases. */
+
+static void
+alarm_set (double timeout)
+{
+#ifdef ITIMER_REAL
+ /* Use the modern itimer interface. */
+ struct itimerval itv;
+ xzero (itv);
+ itv.it_value.tv_sec = (long) timeout;
+ itv.it_value.tv_usec = 1000000 * (timeout - (long)timeout);
+ if (itv.it_value.tv_sec == 0 && itv.it_value.tv_usec == 0)
+ /* Ensure that we wait for at least the minimum interval.
+ Specifying zero would mean "wait forever". */
+ itv.it_value.tv_usec = 1;
+ setitimer (ITIMER_REAL, &itv, NULL);
+#else /* not ITIMER_REAL */
+ /* Use the old alarm() interface. */
+ int secs = (int) timeout;
+ if (secs == 0)
+ /* Round TIMEOUTs smaller than 1 to 1, not to zero. This is
+ because alarm(0) means "never deliver the alarm", i.e. "wait
+ forever", which is not what someone who specifies a 0.5s
+ timeout would expect. */
+ secs = 1;
+ alarm (secs);
+#endif /* not ITIMER_REAL */
+}
+
+/* Cancel the alarm set with alarm_set. */
+
+static void
+alarm_cancel (void)
+{
+#ifdef ITIMER_REAL
+ struct itimerval disable;
+ xzero (disable);
+ setitimer (ITIMER_REAL, &disable, NULL);
+#else /* not ITIMER_REAL */
+ alarm (0);
+#endif /* not ITIMER_REAL */
+}
+
+/* Call FUN(ARG), but don't allow it to run for more than TIMEOUT
+ seconds. Returns true if the function was interrupted with a
+ timeout, false otherwise.
+
+ This works by setting up SIGALRM to be delivered in TIMEOUT seconds
+ using setitimer() or alarm(). The timeout is enforced by
+ longjumping out of the SIGALRM handler. This has several
+ advantages compared to the traditional approach of relying on
+ signals causing system calls to exit with EINTR:
+
+ * The callback function is *forcibly* interrupted after the
+ timeout expires, (almost) regardless of what it was doing and
+ whether it was in a syscall. For example, a calculation that
+ takes a long time is interrupted as reliably as an IO
+ operation.
+
+ * It works with both SYSV and BSD signals because it doesn't
+ depend on the default setting of SA_RESTART.
+
+ * It doesn't require special handler setup beyond a simple call
+ to signal(). (It does use sigsetjmp/siglongjmp, but they're
+ optional.)
+
+ The only downside is that, if FUN allocates internal resources that
+ are normally freed prior to exit from the functions, they will be
+ lost in case of timeout. */
+
+bool
+run_with_timeout (double timeout, void (*fun) (void *), void *arg)
+{
+ int saved_errno;
+
+ if (timeout == 0)
+ {
+ fun (arg);
+ return false;
+ }
+
+ if (SETJMP (run_with_timeout_env) != 0)
+ {
+ /* Longjumped out of FUN with a timeout. */
+ signal (SIGALRM, SIG_DFL);
+ return true;
+ }
+ else
+ {
+ signal (SIGALRM, abort_run_with_timeout);
+ }
+ alarm_set (timeout);
+ fun (arg);
+
+ /* Preserve errno in case alarm() or signal() modifies it. */
+ saved_errno = errno;
+ alarm_cancel ();
+ signal (SIGALRM, SIG_DFL);
+ errno = saved_errno;
+
+ return false;
+}
+
+#else /* not USE_SIGNAL_TIMEOUT */
+
+#ifndef WINDOWS
+/* A stub version of run_with_timeout that just calls FUN(ARG). Don't
+ define it under Windows, because Windows has its own version of
+ run_with_timeout that uses threads. */
+
+bool
+run_with_timeout (double timeout, void (*fun) (void *), void *arg)
+{
+ fun (arg);
+ return false;
+}
+#endif /* not WINDOWS */
+#endif /* not USE_SIGNAL_TIMEOUT */
+
+#ifndef WINDOWS
+
+/* Sleep the specified amount of seconds. On machines without
+ nanosleep(), this may sleep shorter if interrupted by signals. */
+
+void
+xsleep (double seconds)
+{
+#ifdef HAVE_NANOSLEEP
+ /* nanosleep is the preferred interface because it offers high
+ accuracy and, more importantly, because it allows us to reliably
+ restart receiving a signal such as SIGWINCH. (There was an
+ actual Debian bug report about --limit-rate malfunctioning while
+ the terminal was being resized.) */
+ struct timespec sleep, remaining;
+ sleep.tv_sec = (long) seconds;
+ sleep.tv_nsec = 1000000000 * (seconds - (long) seconds);
+ while (nanosleep (&sleep, &remaining) < 0 && errno == EINTR)
+ /* If nanosleep has been interrupted by a signal, adjust the
+ sleeping period and return to sleep. */
+ sleep = remaining;
+#elif defined(HAVE_USLEEP)
+ /* If usleep is available, use it in preference to select. */
+ if (seconds >= 1)
+ {
+ /* On some systems, usleep cannot handle values larger than
+ 1,000,000. If the period is larger than that, use sleep
+ first, then add usleep for subsecond accuracy. */
+ sleep (seconds);
+ seconds -= (long) seconds;
+ }
+ usleep (seconds * 1000000);
+#else /* fall back select */
+ /* Note that, although Windows supports select, it can't be used to
+ implement sleeping because Winsock's select doesn't implement
+ timeout when it is passed NULL pointers for all fd sets. (But it
+ does under Cygwin, which implements Unix-compatible select.) */
+ struct timeval sleep;
+ sleep.tv_sec = (long) seconds;
+ sleep.tv_usec = 1000000 * (seconds - (long) seconds);
+ select (0, NULL, NULL, NULL, &sleep);
+ /* If select returns -1 and errno is EINTR, it means we were
+ interrupted by a signal. But without knowing how long we've
+ actually slept, we can't return to sleep. Using gettimeofday to
+ track sleeps is slow and unreliable due to clock skew. */
+#endif
+}
+
+#endif /* not WINDOWS */
+
+/* Encode the octets in DATA of length LENGTH to base64 format,
+ storing the result to DEST. The output will be zero-terminated,
+ and must point to a writable buffer of at least
+ 1+BASE64_LENGTH(length) bytes. The function returns the length of
+ the resulting base64 data, not counting the terminating zero.
+
+ This implementation does not emit newlines after 76 characters of
+ base64 data. */
+
+size_t
+wget_base64_encode (const void *data, size_t length, char *dest)
+{
+ /* Conversion table. */
+ static const char tbl[64] = {
+ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
+ 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
+ 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
+ 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'
+ };
+ /* Access bytes in DATA as unsigned char, otherwise the shifts below
+ don't work for data with MSB set. */
+ const unsigned char *s = data;
+ /* Theoretical ANSI violation when length < 3. */
+ const unsigned char *end = (const unsigned char *) data + length - 2;
+ char *p = dest;
+
+ /* Transform the 3x8 bits to 4x6 bits, as required by base64. */
+ for (; s < end; s += 3)
+ {
+ *p++ = tbl[s[0] >> 2];
+ *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
+ *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
+ *p++ = tbl[s[2] & 0x3f];
+ }
+
+ /* Pad the result if necessary... */
+ switch (length % 3)
+ {
+ case 1:
+ *p++ = tbl[s[0] >> 2];
+ *p++ = tbl[(s[0] & 3) << 4];
+ *p++ = '=';
+ *p++ = '=';
+ break;
+ case 2:
+ *p++ = tbl[s[0] >> 2];
+ *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
+ *p++ = tbl[((s[1] & 0xf) << 2)];
+ *p++ = '=';
+ break;
+ }
+ /* ...and zero-terminate it. */
+ *p = '\0';
+
+ return p - dest;
+}
+
+/* Store in C the next non-whitespace character from the string, or \0
+ when end of string is reached. */
+#define NEXT_CHAR(c, p) do { \
+ c = (unsigned char) *p++; \
+} while (c_isspace (c))
+
+#define IS_ASCII(c) (((c) & 0x80) == 0)
+
+/* Decode data from BASE64 (a null-terminated string) into memory
+ pointed to by DEST. DEST is assumed to be large enough to
+ accommodate the decoded data, which is guaranteed to be no more than
+ 3/4*strlen(base64).
+
+ Since DEST is assumed to contain binary data, it is not
+ NUL-terminated. The function returns the length of the data
+ written to "TO". -1 is returned in case of error caused by malformed
+ base64 input.
+
+ This function originates from Free Recode. */
+
+ssize_t
+wget_base64_decode (const char *base64, void *dest, size_t size)
+{
+ /* Table of base64 values for first 128 characters. Note that this
+ assumes ASCII (but so does Wget in other places). */
+ static const signed char base64_char_to_value[128] =
+ {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 10- 19 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 20- 29 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 30- 39 */
+ -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, /* 40- 49 */
+ 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, /* 50- 59 */
+ -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, /* 60- 69 */
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* 70- 79 */
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* 80- 89 */
+ 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, /* 90- 99 */
+ 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, /* 100-109 */
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, /* 110-119 */
+ 49, 50, 51, -1, -1, -1, -1, -1 /* 120-127 */
+ };
+#define BASE64_CHAR_TO_VALUE(c) ((int) base64_char_to_value[c])
+#define IS_BASE64(c) ((IS_ASCII (c) && BASE64_CHAR_TO_VALUE (c) >= 0) || c == '=')
+
+ const char *p = base64;
+ unsigned char *q = dest;
+ ssize_t n = 0;
+
+ while (1)
+ {
+ unsigned char c;
+ unsigned long value;
+
+ /* Process first byte of a quadruplet. */
+ NEXT_CHAR (c, p);
+ if (!c)
+ break;
+ if (c == '=' || !IS_BASE64 (c))
+ return -1; /* illegal char while decoding base64 */
+ value = BASE64_CHAR_TO_VALUE (c) << 18;
+
+ /* Process second byte of a quadruplet. */
+ NEXT_CHAR (c, p);
+ if (!c)
+ return -1; /* premature EOF while decoding base64 */
+ if (c == '=' || !IS_BASE64 (c))
+ return -1; /* illegal char while decoding base64 */
+ value |= BASE64_CHAR_TO_VALUE (c) << 12;
+ if (size)
+ {
+ *q++ = value >> 16;
+ size--;
+ }
+ n++;
+
+ /* Process third byte of a quadruplet. */
+ NEXT_CHAR (c, p);
+ if (!c)
+ return -1; /* premature EOF while decoding base64 */
+ if (!IS_BASE64 (c))
+ return -1; /* illegal char while decoding base64 */
+
+ if (c == '=')
+ {
+ NEXT_CHAR (c, p);
+ if (!c)
+ return -1; /* premature EOF while decoding base64 */
+ if (c != '=')
+ return -1; /* padding `=' expected but not found */
+ continue;
+ }
+
+ value |= BASE64_CHAR_TO_VALUE (c) << 6;
+ if (size)
+ {
+ *q++ = 0xff & value >> 8;
+ size--;
+ }
+ n++;
+
+ /* Process fourth byte of a quadruplet. */
+ NEXT_CHAR (c, p);
+ if (!c)
+ return -1; /* premature EOF while decoding base64 */
+ if (c == '=')
+ continue;
+ if (!IS_BASE64 (c))
+ return -1; /* illegal char while decoding base64 */
+
+ value |= BASE64_CHAR_TO_VALUE (c);
+ if (size)
+ {
+ *q++ = 0xff & value;
+ size--;
+ }
+ n++;
+ }
+#undef IS_BASE64
+#undef BASE64_CHAR_TO_VALUE
+
+ return n;
+}
+
+#ifdef HAVE_LIBPCRE2
+/* Compiles the PCRE2 regex. */
+void *
+compile_pcre2_regex (const char *str)
+{
+ int errornumber;
+ PCRE2_SIZE erroroffset;
+ pcre2_code *regex = pcre2_compile((PCRE2_SPTR) str, PCRE2_ZERO_TERMINATED, 0, &errornumber, &erroroffset, NULL);
+ if (! regex)
+ {
+ fprintf (stderr, _("Invalid regular expression %s, PCRE2 error %d\n"),
+ quote (str), errornumber);
+ }
+ return regex;
+}
+#endif
+
+#ifdef HAVE_LIBPCRE
+/* Compiles the PCRE regex. */
+void *
+compile_pcre_regex (const char *str)
+{
+ const char *errbuf;
+ int erroffset;
+ pcre *regex = pcre_compile (str, 0, &errbuf, &erroffset, 0);
+ if (! regex)
+ {
+ fprintf (stderr, _("Invalid regular expression %s, %s\n"),
+ quote (str), errbuf);
+ }
+ return regex;
+}
+#endif
+
+/* Compiles the POSIX regex. */
+void *
+compile_posix_regex (const char *str)
+{
+ regex_t *regex = xmalloc (sizeof (regex_t));
+#ifdef TESTING
+ /* regcomp might be *very* cpu+memory intensive,
+ * see https://sourceware.org/glibc/wiki/Security%20Exceptions */
+ str = "a";
+#endif
+ int errcode = regcomp ((regex_t *) regex, str, REG_EXTENDED | REG_NOSUB);
+ if (errcode != 0)
+ {
+ size_t errbuf_size = regerror (errcode, (regex_t *) regex, NULL, 0);
+ char *errbuf = xmalloc (errbuf_size);
+ regerror (errcode, (regex_t *) regex, errbuf, errbuf_size);
+ fprintf (stderr, _("Invalid regular expression %s, %s\n"),
+ quote (str), errbuf);
+ xfree (errbuf);
+ xfree (regex);
+ return NULL;
+ }
+
+ return regex;
+}
+
+#ifdef HAVE_LIBPCRE2
+/* Matches a PCRE2 regex. */
+bool
+match_pcre2_regex (const void *regex, const char *str)
+{
+ int rc;
+ pcre2_match_data *match_data;
+
+ match_data = pcre2_match_data_create_from_pattern(regex, NULL);
+
+ if (match_data)
+ {
+ rc = pcre2_match(regex, (PCRE2_SPTR) str, strlen(str), 0, 0, match_data, NULL);
+ pcre2_match_data_free(match_data);
+ }
+ else
+ rc = PCRE2_ERROR_NOMEMORY;
+
+ if (rc < 0 && rc != PCRE2_ERROR_NOMATCH)
+ {
+ logprintf (LOG_VERBOSE, _("Error while matching %s: %d\n"),
+ quote (str), rc);
+ }
+
+ return rc >= 0;
+}
+#endif
+
+#ifdef HAVE_LIBPCRE
+#define OVECCOUNT 30
+/* Matches a PCRE regex. */
+bool
+match_pcre_regex (const void *regex, const char *str)
+{
+ size_t l = strlen (str);
+ int ovector[OVECCOUNT];
+
+ int rc = pcre_exec ((pcre *) regex, 0, str, (int) l, 0, 0, ovector, OVECCOUNT);
+ if (rc == PCRE_ERROR_NOMATCH)
+ return false;
+ else if (rc < 0)
+ {
+ logprintf (LOG_VERBOSE, _("Error while matching %s: %d\n"),
+ quote (str), rc);
+ return false;
+ }
+ else
+ return true;
+}
+#undef OVECCOUNT
+#endif
+
+/* Matches a POSIX regex. */
+bool
+match_posix_regex (const void *regex, const char *str)
+{
+ int rc = regexec ((regex_t *) regex, str, 0, NULL, 0);
+ if (rc == REG_NOMATCH)
+ return false;
+ else if (rc == 0)
+ return true;
+ else
+ {
+ size_t errbuf_size = regerror (rc, opt.acceptregex, NULL, 0);
+ char *errbuf = xmalloc (errbuf_size);
+ regerror (rc, opt.acceptregex, errbuf, errbuf_size);
+ logprintf (LOG_VERBOSE, _("Error while matching %s: %d\n"),
+ quote (str), rc);
+ xfree (errbuf);
+ return false;
+ }
+}
+
+#undef IS_ASCII
+#undef NEXT_CHAR
+
+/* Simple merge sort for use by stable_sort. Implementation courtesy
+ Zeljko Vrba with additional debugging by Nenad Barbutov. */
+
+static void
+mergesort_internal (void *base, void *temp, size_t size, size_t from, size_t to,
+ int (*cmpfun) (const void *, const void *))
+{
+#define ELT(array, pos) ((char *)(array) + (pos) * size)
+ if (from < to)
+ {
+ size_t i, j, k;
+ size_t mid = (to + from) / 2;
+ mergesort_internal (base, temp, size, from, mid, cmpfun);
+ mergesort_internal (base, temp, size, mid + 1, to, cmpfun);
+ i = from;
+ j = mid + 1;
+ for (k = from; (i <= mid) && (j <= to); k++)
+ if (cmpfun (ELT (base, i), ELT (base, j)) <= 0)
+ memcpy (ELT (temp, k), ELT (base, i++), size);
+ else
+ memcpy (ELT (temp, k), ELT (base, j++), size);
+ while (i <= mid)
+ memcpy (ELT (temp, k++), ELT (base, i++), size);
+ while (j <= to)
+ memcpy (ELT (temp, k++), ELT (base, j++), size);
+ for (k = from; k <= to; k++)
+ memcpy (ELT (base, k), ELT (temp, k), size);
+ }
+#undef ELT
+}
+
+/* Stable sort with interface exactly like standard library's qsort.
+ Uses mergesort internally. */
+
+void
+stable_sort (void *base, size_t nmemb, size_t size,
+ int (*cmpfun) (const void *, const void *))
+{
+ if (nmemb > 1 && size > 1)
+ {
+ void *temp = xmalloc (nmemb * size);
+ mergesort_internal (base, temp, size, 0, nmemb - 1, cmpfun);
+ xfree(temp);
+ }
+}
+
+/* Print a decimal number. If it is equal to or larger than ten, the
+ number is rounded. Otherwise it is printed with one significant
+ digit without trailing zeros and with no more than three fractional
+ digits total. For example, 0.1 is printed as "0.1", 0.035 is
+ printed as "0.04", 0.0091 as "0.009", and 0.0003 as simply "0".
+
+ This is useful for displaying durations because it provides
+ order-of-magnitude information without unnecessary clutter --
+ long-running downloads are shown without the fractional part, and
+ short ones still retain one significant digit. */
+
+const char *
+print_decimal (double number)
+{
+ static char buf[32];
+ double n = number >= 0 ? number : -number;
+
+ if (n >= 9.95)
+ /* Cut off at 9.95 because the below %.1f would round 9.96 to
+ "10.0" instead of "10". OTOH 9.94 will print as "9.9". */
+ snprintf (buf, sizeof buf, "%.0f", number);
+ else if (n >= 0.95)
+ snprintf (buf, sizeof buf, "%.1f", number);
+ else if (n >= 0.001)
+ snprintf (buf, sizeof buf, "%.1g", number);
+ else if (n >= 0.0005)
+ /* round [0.0005, 0.001) to 0.001 */
+ snprintf (buf, sizeof buf, "%.3f", number);
+ else
+ /* print numbers close to 0 as 0, not 0.000 */
+ strcpy (buf, "0");
+
+ return buf;
+}
+
+/* Get the maximum name length for the given path. */
+/* Return 0 if length is unknown. */
+long
+get_max_length (const char *path, int length, int name)
+{
+ long ret;
+ char *p, *d;
+
+ /* Make a copy of the path that we can modify. */
+ p = path ? strdupdelim (path, path + length) : strdup ("");
+
+ for (;;)
+ {
+ errno = 0;
+ /* For an empty path query the current directory. */
+#if HAVE_PATHCONF
+ ret = pathconf (*p ? p : ".", name);
+ if (!(ret < 0 && errno == ENOENT))
+ break;
+#else
+ ret = PATH_MAX;
+#endif
+
+ /* The path does not exist yet, but may be created. */
+ /* Already at current or root directory, give up. */
+ if (!*p || strcmp (p, "/") == 0)
+ break;
+
+ /* Remove one directory level and try again. */
+ d = strrchr (p, '/');
+ if (d == p)
+ p[1] = '\0'; /* check root directory */
+ else if (d)
+ *d = '\0'; /* remove last directory part */
+ else
+ *p = '\0'; /* check current directory */
+ }
+
+ xfree (p);
+
+ if (ret < 0)
+ {
+ /* pathconf() has a message for us. */
+ if (errno != 0)
+ perror ("pathconf");
+
+ /* If (errno == 0) then there is no max length.
+ Even on error return 0 so the caller can continue. */
+ return 0;
+ }
+
+ return ret;
+}
+
+void
+wg_hex_to_string (char *str_buffer, const char *hex_buffer, size_t hex_len)
+{
+ size_t i;
+
+ for (i = 0; i < hex_len; i++)
+ {
+ /* Each byte takes 2 characters. */
+ sprintf (str_buffer + 2 * i, "%02x", (unsigned) (hex_buffer[i] & 0xFF));
+ }
+
+ /* Null-terminate result. */
+ str_buffer[2 * i] = '\0';
+}
+
+#ifdef HAVE_SSL
+
+/*
+ * Public key pem to der conversion
+ */
+
+static bool
+wg_pubkey_pem_to_der (const char *pem, unsigned char **der, size_t *der_len)
+{
+ char *stripped_pem, *begin_pos, *end_pos;
+ size_t pem_count, stripped_pem_count = 0, pem_len;
+ ssize_t size;
+ unsigned char *base64data;
+
+ *der = NULL;
+ *der_len = 0;
+
+ /* if no pem, exit. */
+ if (!pem)
+ return false;
+
+ begin_pos = strstr (pem, "-----BEGIN PUBLIC KEY-----");
+ if (!begin_pos)
+ return false;
+
+ pem_count = begin_pos - pem;
+ /* Invalid if not at beginning AND not directly following \n */
+ if (0 != pem_count && '\n' != pem[pem_count - 1])
+ return false;
+
+ /* 26 is length of "-----BEGIN PUBLIC KEY-----" */
+ pem_count += 26;
+
+ /* Invalid if not directly following \n */
+ end_pos = strstr (pem + pem_count, "\n-----END PUBLIC KEY-----");
+ if (!end_pos)
+ return false;
+
+ pem_len = end_pos - pem;
+
+ stripped_pem = xmalloc (pem_len - pem_count + 1);
+
+ /*
+ * Here we loop through the pem array one character at a time between the
+ * correct indices, and place each character that is not '\n' or '\r'
+ * into the stripped_pem array, which should represent the raw base64 string
+ */
+ while (pem_count < pem_len) {
+ if ('\n' != pem[pem_count] && '\r' != pem[pem_count])
+ stripped_pem[stripped_pem_count++] = pem[pem_count];
+ ++pem_count;
+ }
+ /* Place the null terminator in the correct place */
+ stripped_pem[stripped_pem_count] = '\0';
+
+ base64data = xmalloc (BASE64_LENGTH(stripped_pem_count));
+
+ size = wget_base64_decode (stripped_pem, base64data, BASE64_LENGTH(stripped_pem_count));
+
+ if (size < 0) {
+ xfree (base64data); /* malformed base64 from server */
+ } else {
+ *der = base64data;
+ *der_len = (size_t) size;
+ }
+
+ xfree (stripped_pem);
+
+ return *der_len > 0;
+}
+
+/*
+ * Generic pinned public key check.
+ */
+
+bool
+wg_pin_peer_pubkey (const char *pinnedpubkey, const char *pubkey, size_t pubkeylen)
+{
+ struct file_memory *fm;
+ unsigned char *buf = NULL, *pem_ptr = NULL;
+ size_t size, pem_len;
+ bool pem_read;
+ bool result = false;
+
+ size_t pinkeylen;
+ ssize_t decoded_hash_length;
+ char *pinkeycopy, *begin_pos, *end_pos;
+ unsigned char *sha256sumdigest = NULL, *expectedsha256sumdigest = NULL;
+
+ /* if a path wasn't specified, don't pin */
+ if (!pinnedpubkey)
+ return true;
+ if (!pubkey || !pubkeylen)
+ return result;
+
+ /* only do this if pinnedpubkey starts with "sha256//", length 8 */
+ if (strncmp (pinnedpubkey, "sha256//", 8) == 0)
+ {
+ /* compute sha256sum of public key */
+ sha256sumdigest = xmalloc (SHA256_DIGEST_SIZE);
+ sha256_buffer (pubkey, pubkeylen, sha256sumdigest);
+ expectedsha256sumdigest = xmalloc (SHA256_DIGEST_SIZE);
+
+ /* it starts with sha256//, copy so we can modify it */
+ pinkeylen = strlen (pinnedpubkey) + 1;
+ pinkeycopy = xmalloc (pinkeylen);
+ memcpy (pinkeycopy, pinnedpubkey, pinkeylen);
+
+ /* point begin_pos to the copy, and start extracting keys */
+ begin_pos = pinkeycopy;
+ do
+ {
+ end_pos = strstr (begin_pos, ";sha256//");
+ /*
+ * if there is an end_pos, null terminate,
+ * otherwise it'll go to the end of the original string
+ */
+ if (end_pos)
+ end_pos[0] = '\0';
+
+ /* decode base64 pinnedpubkey, 8 is length of "sha256//" */
+ decoded_hash_length = wget_base64_decode (begin_pos + 8, expectedsha256sumdigest, SHA256_DIGEST_SIZE);
+
+ /* if valid base64, compare sha256 digests directly */
+ if (SHA256_DIGEST_SIZE == decoded_hash_length)
+ {
+ if (!memcmp (sha256sumdigest, expectedsha256sumdigest, SHA256_DIGEST_SIZE))
+ {
+ result = true;
+ break;
+ }
+ }
+ else
+ logprintf (LOG_VERBOSE, _ ("Skipping key with wrong size (%d/%d): %s\n"),
+ (int) (strlen (begin_pos + 8) * 3) / 4, SHA256_DIGEST_SIZE,
+ quote (begin_pos + 8));
+
+ /*
+ * change back the null-terminator we changed earlier,
+ * and look for next begin
+ */
+ if (end_pos)
+ {
+ end_pos[0] = ';';
+ begin_pos = strstr (end_pos, "sha256//");
+ }
+ }
+ while (end_pos && begin_pos);
+
+ xfree (sha256sumdigest);
+ xfree (expectedsha256sumdigest);
+ xfree (pinkeycopy);
+
+ return result;
+ }
+
+ /* fall back to assuming this is a file path */
+ fm = wget_read_file (pinnedpubkey);
+ if (!fm)
+ return result;
+
+ /* Check the file's size */
+ if (fm->length < 0 || fm->length > MAX_PINNED_PUBKEY_SIZE)
+ goto cleanup;
+
+ /*
+ * if the size of our certificate is bigger than the file
+ * size then it can't match
+ */
+ size = (size_t) fm->length;
+ if (pubkeylen > size)
+ goto cleanup;
+
+ /* If the sizes are the same, it can't be base64 encoded, must be der */
+ if (pubkeylen == size)
+ {
+ if (!memcmp (pubkey, fm->content, pubkeylen))
+ result = true;
+ goto cleanup;
+ }
+
+ /*
+ * Otherwise we will assume it's PEM and try to decode it
+ * after placing null terminator
+ */
+ buf = xmalloc (size + 1);
+ memcpy (buf, fm->content, size);
+ buf[size] = '\0';
+
+ pem_read = wg_pubkey_pem_to_der ((const char *) buf, &pem_ptr, &pem_len);
+ /* if it wasn't read successfully, exit */
+ if (!pem_read)
+ goto cleanup;
+
+ /*
+ * if the size of our certificate doesn't match the size of
+ * the decoded file, they can't be the same, otherwise compare
+ */
+ if (pubkeylen == pem_len && !memcmp (pubkey, pem_ptr, pubkeylen))
+ result = true;
+
+cleanup:
+ xfree (buf);
+ xfree (pem_ptr);
+ wget_read_file_free (fm);
+
+ return result;
+}
+
+#endif /* HAVE_SSL */
+
+#ifdef TESTING
+
+const char *
+test_subdir_p(void)
+{
+ static const struct {
+ const char *d1;
+ const char *d2;
+ bool result;
+ } test_array[] = {
+ { "/somedir", "/somedir", true },
+ { "/somedir", "/somedir/d2", true },
+ { "/somedir/d1", "/somedir", false },
+ };
+ unsigned i;
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ bool res = subdir_p (test_array[i].d1, test_array[i].d2);
+
+ mu_assert ("test_subdir_p: wrong result",
+ res == test_array[i].result);
+ }
+
+ return NULL;
+}
+
+const char *
+test_dir_matches_p(void)
+{
+ static struct {
+ const char *dirlist[3];
+ const char *dir;
+ bool result;
+ } test_array[] = {
+ { { "/somedir", "/someotherdir", NULL }, "somedir", true },
+ { { "/somedir", "/someotherdir", NULL }, "anotherdir", false },
+ { { "/somedir", "/*otherdir", NULL }, "anotherdir", true },
+ { { "/somedir/d1", "/someotherdir", NULL }, "somedir/d1", true },
+ { { "*/*d1", "/someotherdir", NULL }, "somedir/d1", true },
+ { { "/somedir/d1", "/someotherdir", NULL }, "d1", false },
+ { { "!COMPLETE", NULL, NULL }, "!COMPLETE", true },
+ { { "*COMPLETE", NULL, NULL }, "!COMPLETE", true },
+ { { "*/!COMPLETE", NULL, NULL }, "foo/!COMPLETE", true },
+ { { "*COMPLETE", NULL, NULL }, "foo/!COMPLETE", false },
+ { { "*/*COMPLETE", NULL, NULL }, "foo/!COMPLETE", true },
+ { { "/dir with spaces", NULL, NULL }, "dir with spaces", true },
+ { { "/dir*with*spaces", NULL, NULL }, "dir with spaces", true },
+ { { "/Tmp/has", NULL, NULL }, "/Tmp/has space", false },
+ { { "/Tmp/has", NULL, NULL }, "/Tmp/has,comma", false },
+ };
+ unsigned i;
+
+ for (i = 0; i < countof(test_array); ++i)
+ {
+ bool res = dir_matches_p (test_array[i].dirlist, test_array[i].dir);
+
+ mu_assert ("test_dir_matches_p: wrong result",
+ res == test_array[i].result);
+ }
+
+ return NULL;
+}
+
+#endif /* TESTING */
diff --git a/src/utils.h b/src/utils.h
new file mode 100644
index 0000000..b1ab901
--- /dev/null
+++ b/src/utils.h
@@ -0,0 +1,179 @@
+/* Declarations for utils.c.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef UTILS_H
+#define UTILS_H
+
+#include <stdlib.h>
+#include <wget.h>
+
+/* Constant is using when we don`t know attempted size exactly */
+#define UNKNOWN_ATTEMPTED_SIZE -3
+
+#ifndef MAX_PINNED_PUBKEY_SIZE
+#define MAX_PINNED_PUBKEY_SIZE 1048576 /* 1MB */
+#endif
+
+/* Macros that interface to malloc, but know about type sizes, and
+ cast the result to the appropriate type. The casts are not
+ necessary in standard C, but Wget performs them anyway for the sake
+ of pre-standard environments and possibly C++. */
+
+#define xnew(type) (xmalloc (sizeof (type)))
+#define xnew0(type) (xcalloc (1, sizeof (type)))
+#define xnew_array(type, len) (xmalloc ((len) * sizeof (type)))
+#define xnew0_array(type, len) (xcalloc ((len), sizeof (type)))
+
+#define xfree(p) do { free ((void *) (p)); p = NULL; } while (0)
+
+struct hash_table;
+
+struct file_memory {
+ char *content;
+ long length;
+ int mmap_p;
+};
+
+#define HYPHENP(x) (*(x) == '-' && !*((x) + 1))
+
+char *time_str (time_t);
+char *datetime_str (time_t);
+
+char *xstrdup_lower (const char *);
+
+char *strdupdelim (const char *, const char *);
+char **sepstring (const char *);
+bool subdir_p (const char *, const char *);
+bool fork_to_background (void);
+
+char *aprintf (const char *, ...) GCC_FORMAT_ATTR (1, 2);
+char *concat_strings (const char *, ...);
+
+typedef struct file_stat_s {
+ int access_err; /* Error in accecssing file : Not present vs permission */
+ ino_t st_ino; /* st_ino from stats() on the file before open() */
+ dev_t st_dev; /* st_dev from stats() on the file before open() */
+} file_stats_t;
+
+void touch (const char *, time_t);
+int remove_link (const char *);
+bool file_exists_p (const char *, file_stats_t *);
+bool file_non_directory_p (const char *);
+wgint file_size (const char *);
+int make_directory (const char *);
+char *unique_name_passthrough (const char *);
+char *unique_name (const char *);
+FILE *unique_create (const char *, bool, char **);
+FILE *fopen_excl (const char *, int);
+FILE *fopen_stat (const char *, const char *, file_stats_t *);
+int open_stat (const char *, int, mode_t, file_stats_t *);
+char *file_merge (const char *, const char *);
+
+int fnmatch_nocase (const char *, const char *, int);
+bool acceptable (const char *);
+bool accept_url (const char *);
+bool accdir (const char *s);
+char *suffix (const char *s);
+bool match_tail (const char *, const char *, bool);
+bool has_wildcards_p (const char *);
+
+bool has_html_suffix_p (const char *);
+
+struct file_memory *wget_read_file (const char *);
+void wget_read_file_free (struct file_memory *);
+
+void free_vec (char **);
+char **merge_vecs (char **, char **);
+char **vec_append (char **, const char *);
+
+void string_set_add (struct hash_table *, const char *);
+int string_set_contains (struct hash_table *, const char *);
+void string_set_to_array (struct hash_table *, char **);
+void string_set_free (struct hash_table *);
+void free_keys_and_values (struct hash_table *);
+
+const char *with_thousand_seps (wgint);
+
+/* human_readable must be able to accept wgint and SUM_SIZE_INT
+ arguments. */
+char *human_readable (wgint, const int, const int);
+
+
+int numdigit (wgint);
+char *number_to_string (char *, wgint);
+char *number_to_static_string (wgint);
+wgint convert_to_bits (wgint);
+
+int determine_screen_width (void);
+int random_number (int);
+double random_float (void);
+
+bool run_with_timeout (double, void (*) (void *), void *);
+void xsleep (double);
+
+/* How many bytes it will take to store LEN bytes in base64. */
+#define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
+
+size_t wget_base64_encode (const void *, size_t, char *);
+ssize_t wget_base64_decode (const char *, void *, size_t);
+
+#ifdef HAVE_LIBPCRE2
+void *compile_pcre2_regex (const char *);
+bool match_pcre2_regex (const void *, const char *);
+#endif
+
+#ifdef HAVE_LIBPCRE
+void *compile_pcre_regex (const char *);
+bool match_pcre_regex (const void *, const char *);
+#endif
+
+void *compile_posix_regex (const char *);
+bool match_posix_regex (const void *, const char *);
+
+void stable_sort (void *, size_t, size_t, int (*) (const void *, const void *));
+
+const char *print_decimal (double);
+
+long get_max_length (const char *path, int length, int name);
+
+#ifndef HAVE_STRLCPY
+size_t strlcpy (char *dst, const char *src, size_t size);
+#endif
+
+void wg_hex_to_string (char *str_buffer, const char *hex_buffer, size_t hex_len);
+
+extern unsigned char char_prop[];
+
+#ifdef HAVE_SSL
+/* Check pinned public key. */
+bool wg_pin_peer_pubkey (const char *pinnedpubkey, const char *pubkey, size_t pubkeylen);
+#endif
+
+#endif /* UTILS_H */
diff --git a/src/version.h b/src/version.h
new file mode 100644
index 0000000..49fb931
--- /dev/null
+++ b/src/version.h
@@ -0,0 +1,41 @@
+/* Extern declarations for printing version information
+ Copyright (C) 2013, 2015, 2018-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef WGET_VERSION_H
+#define WGET_VERSION_H
+
+/* Extern declarations for strings in version.c */
+extern const char *version_string;
+extern const char *compilation_string;
+extern const char *link_string;
+
+/* Extern declaration for string in build_info.c */
+extern const char *compiled_features[];
+
+#endif /* WGET_VERSION_H */
diff --git a/src/warc.c b/src/warc.c
new file mode 100644
index 0000000..f602444
--- /dev/null
+++ b/src/warc.c
@@ -0,0 +1,1662 @@
+/* Utility functions for writing WARC files.
+ Copyright (C) 2011-2012, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+#include "hash.h"
+#include "utils.h"
+#include "version.h"
+#include "dirname.h"
+#include "url.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <tmpdir.h>
+#include <sha1.h>
+#include <base32.h>
+#include <unistd.h>
+#ifdef HAVE_LIBZ
+#include <zlib.h>
+#endif
+
+#ifdef HAVE_LIBUUID
+#include <uuid/uuid.h>
+#elif HAVE_UUID_CREATE
+#include <uuid.h>
+#endif
+
+#include "warc.h"
+#include "exits.h"
+
+#ifdef WINDOWS
+/* we need this on Windows to have O_TEMPORARY defined */
+# include <fcntl.h>
+# include <rpc.h>
+#endif
+
+#ifndef O_TEMPORARY
+#define O_TEMPORARY 0
+#endif
+
+#include "warc.h"
+#include "exits.h"
+
+
+/* The log file (a temporary file that contains a copy
+ of the wget log). */
+static FILE *warc_log_fp;
+
+/* The manifest file (a temporary file that contains the
+ warcinfo uuid of every file in this crawl). */
+static FILE *warc_manifest_fp;
+
+/* The current WARC file (or NULL, if WARC is disabled). */
+static FILE *warc_current_file;
+
+#ifdef HAVE_LIBZ
+/* The gzip stream for the current WARC file
+ (or NULL, if WARC or gzip is disabled). */
+static gzFile warc_current_gzfile;
+
+/* The offset of the current gzip record in the WARC file. */
+static off_t warc_current_gzfile_offset;
+
+/* The uncompressed size (so far) of the current record. */
+static off_t warc_current_gzfile_uncompressed_size;
+# endif
+
+/* This is true until a warc_write_* method fails. */
+static bool warc_write_ok;
+
+/* The current CDX file (or NULL, if CDX is disabled). */
+static FILE *warc_current_cdx_file;
+
+/* The record id of the warcinfo record of the current WARC file. */
+static char warc_current_warcinfo_uuid_str[48];
+
+/* The file name of the current WARC file. */
+static char *warc_current_filename;
+
+/* The serial number of the current WARC file. This number is
+ incremented each time a new file is opened and is used in the
+ WARC file's filename. */
+static int warc_current_file_number;
+
+/* The table of CDX records, if deduplication is enabled. */
+static struct hash_table * warc_cdx_dedup_table;
+
+static bool warc_start_new_file (bool meta);
+
+
+struct warc_cdx_record
+{
+ char *url;
+ char *uuid;
+ char digest[SHA1_DIGEST_SIZE];
+};
+
+static unsigned long
+warc_hash_sha1_digest (const void *key)
+{
+ /* We just use some of the first bytes of the digest. */
+ unsigned long v = 0;
+ memcpy (&v, key, sizeof (unsigned long));
+ return v;
+}
+
+static int
+warc_cmp_sha1_digest (const void *digest1, const void *digest2)
+{
+ return !memcmp (digest1, digest2, SHA1_DIGEST_SIZE);
+}
+
+
+
+/* Writes SIZE bytes from BUFFER to the current WARC file,
+ through gzwrite if compression is enabled.
+ Returns the number of uncompressed bytes written. */
+static size_t
+warc_write_buffer (const char *buffer, size_t size)
+{
+#ifdef HAVE_LIBZ
+ if (warc_current_gzfile)
+ {
+ warc_current_gzfile_uncompressed_size += size;
+ return gzwrite (warc_current_gzfile, buffer, size);
+ }
+ else
+#endif
+ return fwrite (buffer, 1, size, warc_current_file);
+}
+
+/* Writes STR to the current WARC file.
+ Returns false and set warc_write_ok to false if there
+ is an error. */
+static bool
+warc_write_string (const char *str)
+{
+ size_t n;
+
+ if (!warc_write_ok)
+ return false;
+
+ n = strlen (str);
+ if (n != warc_write_buffer (str, n))
+ warc_write_ok = false;
+
+ return warc_write_ok;
+}
+
+
+#define EXTRA_GZIP_HEADER_SIZE 14
+#define GZIP_STATIC_HEADER_SIZE 10
+#define FLG_FEXTRA 0x04
+#define OFF_FLG 3
+
+/* Starts a new WARC record. Writes the version header.
+ If opt.warc_maxsize is set and the current file is becoming
+ too large, this will open a new WARC file.
+
+ If compression is enabled, this will start a new
+ gzip stream in the current WARC file.
+
+ Returns false and set warc_write_ok to false if there
+ is an error. */
+static bool
+warc_write_start_record (void)
+{
+ if (!warc_write_ok)
+ return false;
+
+ fflush (warc_current_file);
+ if (opt.warc_maxsize > 0 && ftello (warc_current_file) >= opt.warc_maxsize)
+ warc_start_new_file (false);
+
+#ifdef HAVE_LIBZ
+ /* Start a GZIP stream, if required. */
+ if (opt.warc_compression_enabled)
+ {
+ int dup_fd;
+ /* Record the starting offset of the new record. */
+ warc_current_gzfile_offset = ftello (warc_current_file);
+
+ /* Reserve space for the extra GZIP header field.
+ In warc_write_end_record we will fill this space
+ with information about the uncompressed and
+ compressed size of the record. */
+ if (fseek (warc_current_file, EXTRA_GZIP_HEADER_SIZE, SEEK_CUR) < 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Error setting WARC file position.\n"));
+ warc_write_ok = false;
+ return false;
+ }
+
+ if (fflush (warc_current_file) != 0)
+ {
+ logprintf (LOG_NOTQUIET, _("Error flushing WARC file to disk.\n"));
+ warc_write_ok = false;
+ return false;
+ }
+
+ /* Start a new GZIP stream. */
+ dup_fd = dup (fileno (warc_current_file));
+ if (dup_fd < 0)
+ {
+ logprintf (LOG_NOTQUIET,
+_("Error duplicating WARC file file descriptor.\n"));
+ warc_write_ok = false;
+ return false;
+ }
+
+ warc_current_gzfile = gzdopen (dup_fd, "wb9");
+ warc_current_gzfile_uncompressed_size = 0;
+
+ if (warc_current_gzfile == NULL)
+ {
+ logprintf (LOG_NOTQUIET,
+_("Error opening GZIP stream to WARC file.\n"));
+ close (dup_fd);
+ warc_write_ok = false;
+ return false;
+ }
+ }
+#endif
+
+ warc_write_string ("WARC/1.0\r\n");
+ return warc_write_ok;
+}
+
+/* Writes a WARC header to the current WARC record.
+ This method may be run after warc_write_start_record and
+ before warc_write_block_from_file. */
+static bool
+warc_write_header (const char *name, const char *value)
+{
+ if (value)
+ {
+ warc_write_string (name);
+ warc_write_string (": ");
+ warc_write_string (value);
+ warc_write_string ("\r\n");
+ }
+ return warc_write_ok;
+}
+
+/* Writes a WARC header with a URI as value to the current WARC record.
+ This method may be run after warc_write_start_record and
+ before warc_write_block_from_file. */
+static bool
+warc_write_header_uri (const char *name, const char *value)
+{
+ if (value)
+ {
+ warc_write_string (name);
+ warc_write_string (": <");
+ warc_write_string (value);
+ warc_write_string (">\r\n");
+ }
+ return warc_write_ok;
+}
+
+/* Copies the contents of DATA_IN to the WARC record.
+ Adds a Content-Length header to the WARC record.
+ Run this method after warc_write_header,
+ then run warc_write_end_record. */
+static bool
+warc_write_block_from_file (FILE *data_in)
+{
+ /* Add the Content-Length header. */
+ char content_length[MAX_INT_TO_STRING_LEN(off_t)];
+ char buffer[BUFSIZ];
+ size_t s;
+
+ fseeko (data_in, 0L, SEEK_END);
+ number_to_string (content_length, ftello (data_in));
+ warc_write_header ("Content-Length", content_length);
+
+ /* End of the WARC header section. */
+ warc_write_string ("\r\n");
+
+ if (fseeko (data_in, 0L, SEEK_SET) != 0)
+ warc_write_ok = false;
+
+ /* Copy the data in the file to the WARC record. */
+ while (warc_write_ok && (s = fread (buffer, 1, BUFSIZ, data_in)) > 0)
+ {
+ if (warc_write_buffer (buffer, s) < s)
+ warc_write_ok = false;
+ }
+
+ return warc_write_ok;
+}
+
+/* Run this method to close the current WARC record.
+
+ If compression is enabled, this method closes the
+ current GZIP stream and fills the extra GZIP header
+ with the uncompressed and compressed length of the
+ record. */
+static bool
+warc_write_end_record (void)
+{
+ if (warc_write_buffer ("\r\n\r\n", 4) != 4)
+ {
+ warc_write_ok = false;
+ return false;
+ }
+
+#ifdef HAVE_LIBZ
+ /* We start a new gzip stream for each record. */
+ if (warc_write_ok && warc_current_gzfile)
+ {
+ char extra_header[EXTRA_GZIP_HEADER_SIZE];
+ char static_header[GZIP_STATIC_HEADER_SIZE];
+ off_t current_offset, uncompressed_size, compressed_size;
+ size_t result;
+
+ if (gzclose (warc_current_gzfile) != Z_OK)
+ {
+ warc_write_ok = false;
+ return false;
+ }
+
+ fflush (warc_current_file);
+ fseeko (warc_current_file, 0, SEEK_END);
+
+ /* The WARC standard suggests that we add 'skip length' data in the
+ extra header field of the GZIP stream.
+
+ In warc_write_start_record we reserved space for this extra header.
+ This extra space starts at warc_current_gzfile_offset and fills
+ EXTRA_GZIP_HEADER_SIZE bytes. The static GZIP header starts at
+ warc_current_gzfile_offset + EXTRA_GZIP_HEADER_SIZE.
+
+ We need to do three things:
+ 1. Move the static GZIP header to warc_current_gzfile_offset;
+ 2. Set the FEXTRA flag in the GZIP header;
+ 3. Write the extra GZIP header after the static header, that is,
+ starting at warc_current_gzfile_offset + GZIP_STATIC_HEADER_SIZE.
+ */
+
+ /* Calculate the uncompressed and compressed sizes. */
+ current_offset = ftello (warc_current_file);
+ uncompressed_size = current_offset - warc_current_gzfile_offset;
+ compressed_size = warc_current_gzfile_uncompressed_size;
+
+ /* Go back to the static GZIP header. */
+ result = fseeko (warc_current_file, warc_current_gzfile_offset
+ + EXTRA_GZIP_HEADER_SIZE, SEEK_SET);
+ if (result != 0)
+ {
+ warc_write_ok = false;
+ return false;
+ }
+
+ /* Read the header. */
+ result = fread (static_header, 1, GZIP_STATIC_HEADER_SIZE,
+ warc_current_file);
+ if (result != GZIP_STATIC_HEADER_SIZE)
+ {
+ warc_write_ok = false;
+ return false;
+ }
+
+ /* Set the FEXTRA flag in the flags byte of the header. */
+ static_header[OFF_FLG] = static_header[OFF_FLG] | FLG_FEXTRA;
+
+ /* Write the header back to the file, but starting at
+ warc_current_gzfile_offset. */
+ fseeko (warc_current_file, warc_current_gzfile_offset, SEEK_SET);
+ fwrite (static_header, 1, GZIP_STATIC_HEADER_SIZE, warc_current_file);
+
+ /* Prepare the extra GZIP header. */
+ /* XLEN, the length of the extra header fields. */
+ extra_header[0] = ((EXTRA_GZIP_HEADER_SIZE - 2) & 255);
+ extra_header[1] = ((EXTRA_GZIP_HEADER_SIZE - 2) >> 8) & 255;
+ /* The extra header field identifier for the WARC skip length. */
+ extra_header[2] = 's';
+ extra_header[3] = 'l';
+ /* The size of the field value (8 bytes). */
+ extra_header[4] = (8 & 255);
+ extra_header[5] = ((8 >> 8) & 255);
+ /* The size of the uncompressed record. */
+ extra_header[6] = (uncompressed_size & 255);
+ extra_header[7] = (uncompressed_size >> 8) & 255;
+ extra_header[8] = (uncompressed_size >> 16) & 255;
+ extra_header[9] = (uncompressed_size >> 24) & 255;
+ /* The size of the compressed record. */
+ extra_header[10] = (compressed_size & 255);
+ extra_header[11] = (compressed_size >> 8) & 255;
+ extra_header[12] = (compressed_size >> 16) & 255;
+ extra_header[13] = (compressed_size >> 24) & 255;
+
+ /* Write the extra header after the static header. */
+ fseeko (warc_current_file, warc_current_gzfile_offset
+ + GZIP_STATIC_HEADER_SIZE, SEEK_SET);
+ fwrite (extra_header, 1, EXTRA_GZIP_HEADER_SIZE, warc_current_file);
+
+ /* Done, move back to the end of the file. */
+ fflush (warc_current_file);
+ fseeko (warc_current_file, 0, SEEK_END);
+ }
+#endif /* HAVE_LIBZ */
+
+ return warc_write_ok;
+}
+
+
+/* Writes the WARC-Date header for the given timestamp to
+ the current WARC record.
+ If timestamp is NULL, the current time will be used. */
+static bool
+warc_write_date_header (const char *timestamp)
+{
+ char current_timestamp[21];
+
+ return warc_write_header ("WARC-Date", timestamp ? timestamp :
+ warc_timestamp (current_timestamp, sizeof(current_timestamp)));
+}
+
+/* Writes the WARC-IP-Address header for the given IP to
+ the current WARC record. If IP is NULL, no header will
+ be written. */
+static bool
+warc_write_ip_header (const ip_address *ip)
+{
+ if (ip != NULL)
+ return warc_write_header ("WARC-IP-Address", print_address (ip));
+ else
+ return warc_write_ok;
+}
+
+
+/* warc_sha1_stream_with_payload is a modified copy of sha1_stream
+ from gnulib/sha1.c. This version calculates two digests in one go.
+
+ Compute SHA1 message digests for bytes read from STREAM. The
+ digest of the complete file will be written into the 16 bytes
+ beginning at RES_BLOCK.
+
+ If payload_offset >= 0, a second digest will be calculated of the
+ portion of the file starting at payload_offset and continuing to
+ the end of the file. The digest number will be written into the
+ 16 bytes beginning ad RES_PAYLOAD. */
+static int
+warc_sha1_stream_with_payload (FILE *stream, void *res_block, void *res_payload,
+ off_t payload_offset)
+{
+#define BLOCKSIZE 32768
+
+ struct sha1_ctx ctx_block;
+ struct sha1_ctx ctx_payload;
+ off_t pos;
+ off_t sum;
+
+ char *buffer = xmalloc (BLOCKSIZE + 72);
+
+ /* Initialize the computation context. */
+ sha1_init_ctx (&ctx_block);
+ if (payload_offset >= 0)
+ sha1_init_ctx (&ctx_payload);
+
+ pos = 0;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ off_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ while (1)
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+ pos += n;
+
+ if (sum == BLOCKSIZE)
+ break;
+
+ if (n == 0)
+ {
+ /* Check for the error flag IF N == 0, so that we don't
+ exit the loop after a partial read due to e.g., EAGAIN
+ or EWOULDBLOCK. */
+ if (ferror (stream))
+ {
+ xfree (buffer);
+ return 1;
+ }
+ goto process_partial_block;
+ }
+
+ /* We've read at least one byte, so ignore errors. But always
+ check for EOF, since feof may be true even though N > 0.
+ Otherwise, we could end up calling fread after EOF. */
+ if (feof (stream))
+ goto process_partial_block;
+ }
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ sha1_process_block (buffer, BLOCKSIZE, &ctx_block);
+ if (payload_offset >= 0 && payload_offset < pos)
+ {
+ /* At least part of the buffer contains data from payload. */
+ off_t start_of_payload = payload_offset - (pos - BLOCKSIZE);
+ if (start_of_payload <= 0)
+ /* All bytes in the buffer belong to the payload. */
+ start_of_payload = 0;
+
+ /* Process the payload part of the buffer.
+ Note: we can't use sha1_process_block here even if we
+ process the complete buffer. Because the payload doesn't
+ have to start with a full block, there may still be some
+ bytes left from the previous buffer. Therefore, we need
+ to continue with sha1_process_bytes. */
+ sha1_process_bytes (buffer + start_of_payload,
+ BLOCKSIZE - start_of_payload, &ctx_payload);
+ }
+ }
+
+ process_partial_block:;
+
+ /* Process any remaining bytes. */
+ if (sum > 0)
+ {
+ sha1_process_bytes (buffer, sum, &ctx_block);
+ if (payload_offset >= 0 && payload_offset < pos)
+ {
+ /* At least part of the buffer contains data from payload. */
+ off_t start_of_payload = payload_offset - (pos - sum);
+ if (start_of_payload <= 0)
+ /* All bytes in the buffer belong to the payload. */
+ start_of_payload = 0;
+
+ /* Process the payload part of the buffer. */
+ sha1_process_bytes (buffer + start_of_payload,
+ sum - start_of_payload, &ctx_payload);
+ }
+ }
+
+ /* Construct result in desired memory. */
+ sha1_finish_ctx (&ctx_block, res_block);
+ if (payload_offset >= 0)
+ sha1_finish_ctx (&ctx_payload, res_payload);
+ xfree (buffer);
+ return 0;
+
+#undef BLOCKSIZE
+}
+
+/* Converts the SHA1 digest to a base32-encoded string.
+ "sha1:DIGEST\0" (Allocates a new string for the response.) */
+static char *
+warc_base32_sha1_digest (const char *sha1_digest, char *sha1_base32, size_t sha1_base32_size)
+{
+ if (sha1_base32_size >= BASE32_LENGTH(SHA1_DIGEST_SIZE) + 5 + 1)
+ {
+ memcpy (sha1_base32, "sha1:", 5);
+ base32_encode (sha1_digest, SHA1_DIGEST_SIZE, sha1_base32 + 5,
+ sha1_base32_size - 5);
+ }
+ else
+ *sha1_base32 = 0;
+
+ return sha1_base32;
+}
+
+
+/* Sets the digest headers of the record.
+ This method will calculate the block digest and, if payload_offset >= 0,
+ will also calculate the payload digest of the payload starting at the
+ provided offset. */
+static void
+warc_write_digest_headers (FILE *file, long payload_offset)
+{
+ if (opt.warc_digests_enabled)
+ {
+ /* Calculate the block and payload digests. */
+ char sha1_res_block[SHA1_DIGEST_SIZE];
+ char sha1_res_payload[SHA1_DIGEST_SIZE];
+
+ rewind (file);
+ if (warc_sha1_stream_with_payload (file, sha1_res_block,
+ sha1_res_payload, payload_offset) == 0)
+ {
+ char digest[BASE32_LENGTH(SHA1_DIGEST_SIZE) + 1 + 5];
+
+ warc_write_header ("WARC-Block-Digest",
+ warc_base32_sha1_digest (sha1_res_block, digest, sizeof(digest)));
+
+ if (payload_offset >= 0)
+ warc_write_header ("WARC-Payload-Digest",
+ warc_base32_sha1_digest (sha1_res_payload, digest, sizeof(digest)));
+ }
+ }
+}
+
+
+/* Fills timestamp with the current time and date.
+ The UTC time is formatted following ISO 8601, as required
+ for use in the WARC-Date header.
+ The timestamp will be 21 characters long. */
+char *
+warc_timestamp (char *timestamp, size_t timestamp_size)
+{
+ time_t rawtime = time (NULL);
+ struct tm * timeinfo = gmtime (&rawtime);
+
+ if (strftime (timestamp, timestamp_size, "%Y-%m-%dT%H:%M:%SZ", timeinfo) == 0 && timestamp_size > 0)
+ *timestamp = 0;
+
+ return timestamp;
+}
+
+/* Fills urn_str with a UUID in the format required
+ for the WARC-Record-Id header.
+ The string will be 47 characters long. */
+#if HAVE_LIBUUID
+void
+warc_uuid_str (char *urn_str, size_t urn_size)
+{
+ char uuid_str[37];
+ uuid_t record_id;
+
+ uuid_generate (record_id);
+ uuid_unparse (record_id, uuid_str);
+
+ snprintf (urn_str, urn_size, "<urn:uuid:%s>", uuid_str);
+}
+#elif HAVE_UUID_CREATE
+void
+warc_uuid_str (char *urn_str, size_t urn_size)
+{
+ char *uuid_str;
+ uuid_t record_id;
+
+ uuid_create (&record_id, NULL);
+ uuid_to_string (&record_id, &uuid_str, NULL);
+
+ snprintf (urn_str, urn_size, "<urn:uuid:%s>", uuid_str);
+ xfree (uuid_str);
+}
+#else
+# ifdef WINDOWS
+
+typedef RPC_STATUS (RPC_ENTRY * UuidCreate_proc) (UUID *);
+typedef RPC_STATUS (RPC_ENTRY * UuidToString_proc) (UUID *, unsigned char **);
+typedef RPC_STATUS (RPC_ENTRY * RpcStringFree_proc) (unsigned char **);
+
+static int
+windows_uuid_str (char *urn_str, size_t urn_size)
+{
+ static UuidCreate_proc pfn_UuidCreate = NULL;
+ static UuidToString_proc pfn_UuidToString = NULL;
+ static RpcStringFree_proc pfn_RpcStringFree = NULL;
+ static int rpc_uuid_avail = -1;
+
+ /* Rpcrt4.dll is not available on older versions of Windows, so we
+ need to test its availability at run time. */
+ if (rpc_uuid_avail == -1)
+ {
+ HMODULE hm_rpcrt4 = LoadLibrary ("Rpcrt4.dll");
+
+ if (hm_rpcrt4)
+ {
+ pfn_UuidCreate =
+ (UuidCreate_proc) GetProcAddress (hm_rpcrt4, "UuidCreate");
+ pfn_UuidToString =
+ (UuidToString_proc) GetProcAddress (hm_rpcrt4, "UuidToStringA");
+ pfn_RpcStringFree =
+ (RpcStringFree_proc) GetProcAddress (hm_rpcrt4, "RpcStringFreeA");
+ if (pfn_UuidCreate && pfn_UuidToString && pfn_RpcStringFree)
+ rpc_uuid_avail = 1;
+ else
+ rpc_uuid_avail = 0;
+ }
+ else
+ rpc_uuid_avail = 0;
+ }
+
+ if (rpc_uuid_avail)
+ {
+ BYTE *uuid_str;
+ UUID uuid;
+
+ if (pfn_UuidCreate (&uuid) == RPC_S_OK)
+ {
+ if (pfn_UuidToString (&uuid, &uuid_str) == RPC_S_OK)
+ {
+ snprintf (urn_str, urn_size, "<urn:uuid:%s>", uuid_str);
+ pfn_RpcStringFree (&uuid_str);
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+#endif
+/* Fills urn_str with a UUID based on random numbers in the format
+ required for the WARC-Record-Id header.
+ (See RFC 4122, UUID version 4.)
+
+ Note: this is a fallback method, it is much better to use the
+ methods provided by libuuid.
+
+ The string will be 47 characters long. */
+void
+warc_uuid_str (char *urn_str, size_t urn_size)
+{
+ /* RFC 4122, a version 4 UUID with only random numbers */
+
+ unsigned char uuid_data[16];
+ int i;
+
+#ifdef WINDOWS
+ /* If the native method fails (expected on older Windows versions),
+ use the fallback below. */
+ if (windows_uuid_str (urn_str, urn_size))
+ return;
+#endif
+
+ for (i=0; i<16; i++)
+ uuid_data[i] = random_number (255);
+
+ /* Set the four most significant bits (bits 12 through 15) of the
+ * time_hi_and_version field to the 4-bit version number */
+ uuid_data[6] = (uuid_data[6] & 0x0F) | 0x40;
+
+ /* Set the two most significant bits (bits 6 and 7) of the
+ * clock_seq_hi_and_reserved to zero and one, respectively. */
+ uuid_data[8] = (uuid_data[8] & 0xBF) | 0x80;
+
+ snprintf (urn_str, urn_size,
+ "<urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x>",
+ uuid_data[0], uuid_data[1], uuid_data[2], uuid_data[3], uuid_data[4],
+ uuid_data[5], uuid_data[6], uuid_data[7], uuid_data[8], uuid_data[9],
+ uuid_data[10], uuid_data[11], uuid_data[12], uuid_data[13], uuid_data[14],
+ uuid_data[15]);
+}
+#endif
+
+/* Write a warcinfo record to the current file.
+ Updates warc_current_warcinfo_uuid_str. */
+static bool
+warc_write_warcinfo_record (const char *filename)
+{
+ FILE *warc_tmp;
+ char timestamp[22];
+ char *filename_basename;
+
+ /* Write warc-info record as the first record of the file. */
+ /* We add the record id of this info record to the other records in the
+ file. */
+ warc_uuid_str (warc_current_warcinfo_uuid_str, sizeof (warc_current_warcinfo_uuid_str));
+
+ warc_timestamp (timestamp, sizeof(timestamp));
+
+ filename_basename = base_name (filename);
+
+ warc_write_start_record ();
+ warc_write_header ("WARC-Type", "warcinfo");
+ warc_write_header ("Content-Type", "application/warc-fields");
+ warc_write_header ("WARC-Date", timestamp);
+ warc_write_header ("WARC-Record-ID", warc_current_warcinfo_uuid_str);
+ warc_write_header ("WARC-Filename", filename_basename);
+
+ xfree (filename_basename);
+
+ /* Create content. */
+ warc_tmp = warc_tempfile ();
+ if (warc_tmp == NULL)
+ {
+ return false;
+ }
+
+ fprintf (warc_tmp, "software: Wget/%s (%s)\r\n", version_string, OS_TYPE);
+ fprintf (warc_tmp, "format: WARC File Format 1.0\r\n");
+ fprintf (warc_tmp,
+"conformsTo: http://bibnum.bnf.fr/WARC/WARC_ISO_28500_version1_latestdraft.pdf\r\n");
+ fprintf (warc_tmp, "robots: %s\r\n", (opt.use_robots ? "classic" : "off"));
+ fprintf (warc_tmp, "wget-arguments: %s\r\n", program_argstring);
+ /* Add the user headers, if any. */
+ if (opt.warc_user_headers)
+ {
+ int i;
+ for (i = 0; opt.warc_user_headers[i]; i++)
+ fprintf (warc_tmp, "%s\r\n", opt.warc_user_headers[i]);
+ }
+ fprintf(warc_tmp, "\r\n");
+
+ warc_write_digest_headers (warc_tmp, -1);
+ warc_write_block_from_file (warc_tmp);
+ warc_write_end_record ();
+
+ if (! warc_write_ok)
+ logprintf (LOG_NOTQUIET, _("Error writing warcinfo record to WARC file.\n"));
+
+ fclose (warc_tmp);
+ return warc_write_ok;
+}
+
+/* Opens a new WARC file.
+ If META is true, generates a filename ending with 'meta.warc.gz'.
+
+ This method will:
+ 1. close the current WARC file (if there is one);
+ 2. increment warc_current_file_number;
+ 3. open a new WARC file;
+ 4. write the initial warcinfo record.
+
+ Returns true on success, false otherwise.
+ */
+static bool
+warc_start_new_file (bool meta)
+{
+#ifdef __VMS
+# define WARC_GZ "warc-gz"
+#else /* def __VMS */
+# define WARC_GZ "warc.gz"
+#endif /* def __VMS [else] */
+
+#ifdef HAVE_LIBZ
+ const char *extension = (opt.warc_compression_enabled ? WARC_GZ : "warc");
+#else
+ const char *extension = "warc";
+#endif
+
+ int base_filename_length;
+ char *new_filename;
+
+ if (opt.warc_filename == NULL)
+ return false;
+
+ if (warc_current_file != NULL)
+ fclose (warc_current_file);
+
+ *warc_current_warcinfo_uuid_str = 0;
+ xfree (warc_current_filename);
+
+ warc_current_file_number++;
+
+ base_filename_length = strlen (opt.warc_filename);
+ /* filename format: base + "-" + 5 digit serial number + ".warc.gz" */
+ new_filename = xmalloc (base_filename_length + 1 + 5 + 8 + 1);
+
+ warc_current_filename = new_filename;
+
+ /* If max size is enabled, we add a serial number to the file names. */
+ if (meta)
+ sprintf (new_filename, "%s-meta.%s", opt.warc_filename, extension);
+ else if (opt.warc_maxsize > 0)
+ {
+ sprintf (new_filename, "%s-%05d.%s", opt.warc_filename,
+ warc_current_file_number, extension);
+ }
+ else
+ sprintf (new_filename, "%s.%s", opt.warc_filename, extension);
+
+ logprintf (LOG_VERBOSE, _("Opening WARC file %s.\n\n"), quote (new_filename));
+
+ /* Open the WARC file. */
+ warc_current_file = fopen (new_filename, "wb+");
+ if (warc_current_file == NULL)
+ {
+ logprintf (LOG_NOTQUIET, _("Error opening WARC file %s.\n"),
+ quote (new_filename));
+ return false;
+ }
+
+ if (! warc_write_warcinfo_record (new_filename))
+ return false;
+
+ /* Add warcinfo uuid to manifest. */
+ if (warc_manifest_fp)
+ fprintf (warc_manifest_fp, "%s\n", warc_current_warcinfo_uuid_str);
+
+ return true;
+}
+
+/* Opens the CDX file for output. */
+static bool
+warc_start_cdx_file (void)
+{
+ char *cdx_filename = aprintf("%s.cdx", opt.warc_filename);
+ warc_current_cdx_file = fopen (cdx_filename, "a+");
+ free(cdx_filename);
+
+ if (warc_current_cdx_file == NULL)
+ return false;
+
+ /* Print the CDX header.
+ *
+ * a - original url
+ * b - date
+ * m - mime type
+ * s - response code
+ * k - new style checksum
+ * r - redirect
+ * M - meta tags
+ * V - compressed arc file offset
+ * g - file name
+ * u - record-id
+ */
+ fprintf (warc_current_cdx_file, " CDX a b a m s k r M V g u\n");
+ fflush (warc_current_cdx_file);
+
+ return true;
+}
+
+#define CDX_FIELDSEP " \t\r\n"
+
+/* Parse the CDX header and find the field numbers of the original url,
+ checksum and record ID fields. */
+static bool
+warc_parse_cdx_header (char *lineptr, int *field_num_original_url,
+ int *field_num_checksum, int *field_num_record_id)
+{
+ char *token;
+ char *save_ptr;
+
+ *field_num_original_url = -1;
+ *field_num_checksum = -1;
+ *field_num_record_id = -1;
+
+ token = strtok_r (lineptr, CDX_FIELDSEP, &save_ptr);
+
+ if (token != NULL && strcmp (token, "CDX") == 0)
+ {
+ int field_num = 0;
+ while (token != NULL)
+ {
+ token = strtok_r (NULL, CDX_FIELDSEP, &save_ptr);
+ if (token != NULL)
+ {
+ switch (token[0])
+ {
+ case 'a':
+ *field_num_original_url = field_num;
+ break;
+ case 'k':
+ *field_num_checksum = field_num;
+ break;
+ case 'u':
+ *field_num_record_id = field_num;
+ break;
+ }
+ }
+ field_num++;
+ }
+ }
+
+ return *field_num_original_url != -1
+ && *field_num_checksum != -1
+ && *field_num_record_id != -1;
+}
+
+/* Parse the CDX record and add it to the warc_cdx_dedup_table hash table. */
+static void
+warc_process_cdx_line (char *lineptr, int field_num_original_url,
+ int field_num_checksum, int field_num_record_id)
+{
+ char *original_url = NULL;
+ char *checksum = NULL;
+ char *record_id = NULL;
+ char *token;
+ char *save_ptr;
+ int field_num = 0;
+
+ /* Read this line to get the fields we need. */
+ token = strtok_r (lineptr, CDX_FIELDSEP, &save_ptr);
+ while (token != NULL)
+ {
+ char **val;
+ if (field_num == field_num_original_url)
+ val = &original_url;
+ else if (field_num == field_num_checksum)
+ val = &checksum;
+ else if (field_num == field_num_record_id)
+ val = &record_id;
+ else
+ val = NULL;
+
+ if (val != NULL)
+ *val = strdup (token);
+
+ token = strtok_r (NULL, CDX_FIELDSEP, &save_ptr);
+ field_num++;
+ }
+
+ if (original_url != NULL && checksum != NULL && record_id != NULL)
+ {
+ /* For some extra efficiency, we decode the base32 encoded
+ checksum value. This should produce exactly SHA1_DIGEST_SIZE
+ bytes. */
+ size_t checksum_l;
+ char * checksum_v;
+ base32_decode_alloc (checksum, strlen (checksum), &checksum_v,
+ &checksum_l);
+ xfree (checksum);
+
+ if (checksum_v != NULL && checksum_l == SHA1_DIGEST_SIZE)
+ {
+ /* This is a valid line with a valid checksum. */
+ struct warc_cdx_record *rec;
+ rec = xmalloc (sizeof (struct warc_cdx_record));
+ rec->url = original_url;
+ rec->uuid = record_id;
+ memcpy (rec->digest, checksum_v, SHA1_DIGEST_SIZE);
+ hash_table_put (warc_cdx_dedup_table, rec->digest, rec);
+ xfree (checksum_v);
+ }
+ else
+ {
+ xfree (original_url);
+ xfree (checksum_v);
+ xfree (record_id);
+ }
+ }
+ else
+ {
+ xfree(checksum);
+ xfree(original_url);
+ xfree(record_id);
+ }
+}
+
+/* Loads the CDX file from opt.warc_cdx_dedup_filename and fills
+ the warc_cdx_dedup_table. */
+static bool
+warc_load_cdx_dedup_file (void)
+{
+ FILE *f;
+ char *lineptr = NULL;
+ size_t n = 0;
+ ssize_t line_length;
+ int field_num_original_url = -1;
+ int field_num_checksum = -1;
+ int field_num_record_id = -1;
+
+ f = fopen (opt.warc_cdx_dedup_filename, "r");
+ if (f == NULL)
+ return false;
+
+ /* The first line should contain the CDX header.
+ Format: " CDX x x x x x"
+ where x are field type indicators. For our purposes, we only
+ need 'a' (the original url), 'k' (the SHA1 checksum) and
+ 'u' (the WARC record id). */
+ line_length = getline (&lineptr, &n, f);
+ if (line_length != -1)
+ warc_parse_cdx_header (lineptr, &field_num_original_url,
+ &field_num_checksum, &field_num_record_id);
+
+ /* If the file contains all three fields, read the complete file. */
+ if (field_num_original_url == -1
+ || field_num_checksum == -1
+ || field_num_record_id == -1)
+ {
+ if (field_num_original_url == -1)
+ logprintf (LOG_NOTQUIET,
+_("CDX file does not list original urls. (Missing column 'a'.)\n"));
+ if (field_num_checksum == -1)
+ logprintf (LOG_NOTQUIET,
+_("CDX file does not list checksums. (Missing column 'k'.)\n"));
+ if (field_num_record_id == -1)
+ logprintf (LOG_NOTQUIET,
+_("CDX file does not list record ids. (Missing column 'u'.)\n"));
+ }
+ else
+ {
+ int nrecords;
+
+ /* Initialize the table. */
+ warc_cdx_dedup_table = hash_table_new (1000, warc_hash_sha1_digest,
+ warc_cmp_sha1_digest);
+
+ do
+ {
+ line_length = getline (&lineptr, &n, f);
+ if (line_length != -1)
+ {
+ warc_process_cdx_line (lineptr, field_num_original_url,
+ field_num_checksum, field_num_record_id);
+ }
+
+ }
+ while (line_length != -1);
+
+ /* Print results. */
+ nrecords = hash_table_count (warc_cdx_dedup_table);
+ logprintf (LOG_VERBOSE, ngettext ("Loaded %d record from CDX.\n\n",
+ "Loaded %d records from CDX.\n\n",
+ nrecords),
+ nrecords);
+ }
+
+ xfree (lineptr);
+ fclose (f);
+
+ return true;
+}
+#undef CDX_FIELDSEP
+
+/* Returns the existing duplicate CDX record for the given url and payload
+ digest. Returns NULL if the url is not found or if the payload digest
+ does not match, or if CDX deduplication is disabled. */
+static struct warc_cdx_record *
+warc_find_duplicate_cdx_record (const char *url, char *sha1_digest_payload)
+{
+ struct warc_cdx_record *rec_existing;
+
+ if (warc_cdx_dedup_table == NULL)
+ return NULL;
+
+ rec_existing = hash_table_get (warc_cdx_dedup_table, sha1_digest_payload);
+
+ if (rec_existing && strcmp (rec_existing->url, url) == 0)
+ return rec_existing;
+ else
+ return NULL;
+}
+
+/* Initializes the WARC writer (if opt.warc_filename is set).
+ This should be called before any WARC record is written. */
+void
+warc_init (void)
+{
+ warc_write_ok = true;
+
+ if (opt.warc_filename != NULL)
+ {
+ if (opt.warc_cdx_dedup_filename != NULL)
+ {
+ if (! warc_load_cdx_dedup_file ())
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not read CDX file %s for deduplication.\n"),
+ quote (opt.warc_cdx_dedup_filename));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+
+ warc_manifest_fp = warc_tempfile ();
+ if (warc_manifest_fp == NULL)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not open temporary WARC manifest file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (opt.warc_keep_log)
+ {
+ warc_log_fp = warc_tempfile ();
+ if (warc_log_fp == NULL)
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not open temporary WARC log file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ log_set_warc_log_fp (warc_log_fp);
+ }
+
+ warc_current_file_number = -1;
+ if (! warc_start_new_file (false))
+ {
+ logprintf (LOG_NOTQUIET, _("Could not open WARC file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+
+ if (opt.warc_cdx_enabled)
+ {
+ if (! warc_start_cdx_file ())
+ {
+ logprintf (LOG_NOTQUIET,
+ _("Could not open CDX file for output.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ }
+ }
+}
+
+/* Writes metadata (manifest, configuration, log file) to the WARC file. */
+static void
+warc_write_metadata (void)
+{
+ char manifest_uuid[48];
+ FILE *warc_tmp_fp;
+
+ /* If there are multiple WARC files, the metadata should be written to a separate file. */
+ if (opt.warc_maxsize > 0)
+ warc_start_new_file (true);
+
+ warc_uuid_str (manifest_uuid, sizeof (manifest_uuid));
+
+ fflush (warc_manifest_fp);
+ warc_write_metadata_record (manifest_uuid,
+ "metadata://gnu.org/software/wget/warc/MANIFEST.txt",
+ NULL, NULL, NULL, "text/plain",
+ warc_manifest_fp, -1);
+ /* warc_write_resource_record has closed warc_manifest_fp. */
+
+ warc_tmp_fp = warc_tempfile ();
+ if (warc_tmp_fp == NULL)
+ {
+ logprintf (LOG_NOTQUIET, _("Could not open temporary WARC file.\n"));
+ exit (WGET_EXIT_GENERIC_ERROR);
+ }
+ fflush (warc_tmp_fp);
+ fprintf (warc_tmp_fp, "%s\n", program_argstring);
+
+ warc_write_resource_record (NULL,
+ "metadata://gnu.org/software/wget/warc/wget_arguments.txt",
+ NULL, manifest_uuid, NULL, "text/plain",
+ warc_tmp_fp, -1);
+ /* warc_write_resource_record has closed warc_tmp_fp. */
+
+ if (warc_log_fp != NULL)
+ {
+ warc_write_resource_record (NULL,
+ "metadata://gnu.org/software/wget/warc/wget.log",
+ NULL, manifest_uuid, NULL, "text/plain",
+ warc_log_fp, -1);
+ /* warc_write_resource_record has closed warc_log_fp. */
+
+ warc_log_fp = NULL;
+ log_set_warc_log_fp (NULL);
+ }
+}
+
+/* Finishes the WARC writing.
+ This should be called at the end of the program. */
+void
+warc_close (void)
+{
+ if (warc_current_file != NULL)
+ {
+ warc_write_metadata ();
+ *warc_current_warcinfo_uuid_str = 0;
+ fclose (warc_current_file);
+ warc_current_file = NULL;
+ }
+
+ if (warc_current_cdx_file != NULL)
+ {
+ fclose (warc_current_cdx_file);
+ warc_current_cdx_file = NULL;
+ }
+
+ if (warc_log_fp != NULL)
+ {
+ fclose (warc_log_fp);
+ log_set_warc_log_fp (NULL);
+ }
+}
+
+/* Creates a temporary file for writing WARC output.
+ The temporary file will be created in opt.warc_tempdir.
+ Returns the pointer to the temporary file, or NULL. */
+FILE *
+warc_tempfile (void)
+{
+ char filename[100];
+ int fd;
+
+ if (path_search (filename, 100, opt.warc_tempdir, "wget", true) == -1)
+ return NULL;
+
+#ifdef __VMS
+ /* 2013-07-12 SMS.
+ * mkostemp()+unlink()+fdopen() scheme causes trouble on VMS, so use
+ * mktemp() to uniquify the (VMS-style) name, and then use a normal
+ * fopen() with a "create temp file marked for delete" option.
+ */
+ {
+ char *tfn;
+
+ tfn = mktemp (filename); /* Get unique name from template. */
+ if (tfn == NULL)
+ return NULL;
+ return fopen (tfn, "w+", "fop=tmd"); /* Create auto-delete temp file. */
+ }
+#else /* def __VMS */
+ fd = mkostemp (filename, O_TEMPORARY);
+ if (fd < 0)
+ return NULL;
+
+#if !O_TEMPORARY
+ if (unlink (filename) < 0)
+ {
+ close(fd);
+ return NULL;
+ }
+#endif
+
+ return fdopen (fd, "wb+");
+#endif /* def __VMS [else] */
+}
+
+
+/* Writes a request record to the WARC file.
+ url is the target uri of the request,
+ timestamp_str is the timestamp of the request (generated with warc_timestamp),
+ record_uuid is the uuid of the request (generated with warc_uuid_str),
+ body is a pointer to a file containing the request headers and body.
+ ip is the ip address of the server (or NULL),
+ Calling this function will close body.
+ Returns true on success, false on error. */
+bool
+warc_write_request_record (const char *url, const char *timestamp_str,
+ const char *record_uuid, const ip_address *ip,
+ FILE *body, off_t payload_offset)
+{
+ warc_write_start_record ();
+ warc_write_header ("WARC-Type", "request");
+ warc_write_header_uri ("WARC-Target-URI", url);
+ warc_write_header ("Content-Type", "application/http;msgtype=request");
+ warc_write_date_header (timestamp_str);
+ warc_write_header ("WARC-Record-ID", record_uuid);
+ warc_write_ip_header (ip);
+ warc_write_header ("WARC-Warcinfo-ID", warc_current_warcinfo_uuid_str);
+ warc_write_digest_headers (body, payload_offset);
+ warc_write_block_from_file (body);
+ warc_write_end_record ();
+
+ fclose (body);
+
+ return warc_write_ok;
+}
+
+/* Writes a response record to the CDX file.
+ url is the target uri of the request/response,
+ timestamp_str is the timestamp of the request that generated this response,
+ (generated with warc_timestamp),
+ mime_type is the mime type of the response body (will be printed to CDX),
+ response_code is the HTTP response code (will be printed to CDX),
+ payload_digest is the sha1 digest of the payload,
+ redirect_location is the contents of the Location: header, or NULL (will be printed to CDX),
+ offset is the position of the WARC record in the WARC file,
+ warc_filename is the filename of the WARC,
+ response_uuid is the uuid of the response.
+ Returns true on success, false on error. */
+static bool
+warc_write_cdx_record (const char *url, const char *timestamp_str,
+ const char *mime_type, int response_code,
+ const char *payload_digest, const char *redirect_location,
+ off_t offset, const char *warc_filename _GL_UNUSED,
+ const char *response_uuid)
+{
+ /* Transform the timestamp. */
+ char timestamp_str_cdx[15];
+ char offset_string[MAX_INT_TO_STRING_LEN(off_t)];
+ const char *checksum;
+ char *tmp_location = NULL;
+
+ memcpy (timestamp_str_cdx , timestamp_str , 4); /* "YYYY" "-" */
+ memcpy (timestamp_str_cdx + 4, timestamp_str + 5, 2); /* "mm" "-" */
+ memcpy (timestamp_str_cdx + 6, timestamp_str + 8, 2); /* "dd" "T" */
+ memcpy (timestamp_str_cdx + 8, timestamp_str + 11, 2); /* "HH" ":" */
+ memcpy (timestamp_str_cdx + 10, timestamp_str + 14, 2); /* "MM" ":" */
+ memcpy (timestamp_str_cdx + 12, timestamp_str + 17, 2); /* "SS" "Z" */
+ timestamp_str_cdx[14] = '\0';
+
+ /* Rewrite the checksum. */
+ if (payload_digest != NULL)
+ checksum = payload_digest + 5; /* Skip the "sha1:" */
+ else
+ checksum = "-";
+
+ if (mime_type == NULL || strlen(mime_type) == 0)
+ mime_type = "-";
+ if (redirect_location == NULL || strlen(redirect_location) == 0)
+ tmp_location = strdup ("-");
+ else
+ tmp_location = url_escape(redirect_location);
+
+ number_to_string (offset_string, offset);
+
+ /* Print the CDX line. */
+ fprintf (warc_current_cdx_file, "%s %s %s %s %d %s %s - %s %s %s\n", url,
+ timestamp_str_cdx, url, mime_type, response_code, checksum,
+ tmp_location, offset_string, warc_current_filename,
+ response_uuid);
+ fflush (warc_current_cdx_file);
+ free (tmp_location);
+
+ return true;
+}
+
+/* Writes a revisit record to the WARC file.
+ url is the target uri of the request/response,
+ timestamp_str is the timestamp of the request that generated this response
+ (generated with warc_timestamp),
+ concurrent_to_uuid is the uuid of the request for that generated this response
+ (generated with warc_uuid_str),
+ refers_to_uuid is the uuid of the original response
+ (generated with warc_uuid_str),
+ payload_digest is the sha1 digest of the payload,
+ ip is the ip address of the server (or NULL),
+ body is a pointer to a file containing the response headers (without payload).
+ Calling this function will close body.
+ Returns true on success, false on error. */
+static bool
+warc_write_revisit_record (const char *url, const char *timestamp_str,
+ const char *concurrent_to_uuid, const char *payload_digest,
+ const char *refers_to, const ip_address *ip, FILE *body)
+{
+ char revisit_uuid [48];
+ char block_digest[BASE32_LENGTH(SHA1_DIGEST_SIZE) + 1 + 5];
+ char sha1_res_block[SHA1_DIGEST_SIZE];
+
+ warc_uuid_str (revisit_uuid, sizeof (revisit_uuid));
+
+ sha1_stream (body, sha1_res_block);
+ warc_base32_sha1_digest (sha1_res_block, block_digest, sizeof(block_digest));
+
+ warc_write_start_record ();
+ warc_write_header ("WARC-Type", "revisit");
+ warc_write_header ("WARC-Record-ID", revisit_uuid);
+ warc_write_header ("WARC-Warcinfo-ID", warc_current_warcinfo_uuid_str);
+ warc_write_header ("WARC-Concurrent-To", concurrent_to_uuid);
+ warc_write_header ("WARC-Refers-To", refers_to);
+ warc_write_header ("WARC-Profile", "http://netpreserve.org/warc/1.0/revisit/identical-payload-digest");
+ warc_write_header ("WARC-Truncated", "length");
+ warc_write_header_uri ("WARC-Target-URI", url);
+ warc_write_date_header (timestamp_str);
+ warc_write_ip_header (ip);
+ warc_write_header ("Content-Type", "application/http;msgtype=response");
+ warc_write_header ("WARC-Block-Digest", block_digest);
+ warc_write_header ("WARC-Payload-Digest", payload_digest);
+ warc_write_block_from_file (body);
+ warc_write_end_record ();
+
+ fclose (body);
+
+ return warc_write_ok;
+}
+
+/* Writes a response record to the WARC file.
+ url is the target uri of the request/response,
+ timestamp_str is the timestamp of the request that generated this response
+ (generated with warc_timestamp),
+ concurrent_to_uuid is the uuid of the request for that generated this response
+ (generated with warc_uuid_str),
+ ip is the ip address of the server (or NULL),
+ body is a pointer to a file containing the response headers and body.
+ mime_type is the mime type of the response body (will be printed to CDX),
+ response_code is the HTTP response code (will be printed to CDX),
+ redirect_location is the contents of the Location: header, or NULL (will be printed to CDX),
+ Calling this function will close body.
+ Returns true on success, false on error. */
+bool
+warc_write_response_record (const char *url, const char *timestamp_str,
+ const char *concurrent_to_uuid, const ip_address *ip,
+ FILE *body, off_t payload_offset, const char *mime_type,
+ int response_code, const char *redirect_location)
+{
+ char block_digest[BASE32_LENGTH(SHA1_DIGEST_SIZE) + 1 + 5];
+ char payload_digest[BASE32_LENGTH(SHA1_DIGEST_SIZE) + 1 + 5];
+ char sha1_res_block[SHA1_DIGEST_SIZE];
+ char sha1_res_payload[SHA1_DIGEST_SIZE];
+ char response_uuid [48];
+ off_t offset;
+
+ if (opt.warc_digests_enabled)
+ {
+ /* Calculate the block and payload digests. */
+ rewind (body);
+ if (warc_sha1_stream_with_payload (body, sha1_res_block, sha1_res_payload,
+ payload_offset) == 0)
+ {
+ /* Decide (based on url + payload digest) if we have seen this
+ data before. */
+ struct warc_cdx_record *rec_existing;
+ rec_existing = warc_find_duplicate_cdx_record (url, sha1_res_payload);
+ if (rec_existing != NULL)
+ {
+ bool result;
+
+ /* Found an existing record. */
+ logprintf (LOG_VERBOSE,
+ _("Found exact match in CDX file. Saving revisit record to WARC.\n"));
+
+ /* Remove the payload from the file. */
+ if (payload_offset > 0)
+ {
+ if (ftruncate (fileno (body), payload_offset) == -1)
+ return false;
+ }
+
+ /* Send the original payload digest. */
+ warc_base32_sha1_digest (sha1_res_payload, payload_digest, sizeof(payload_digest));
+ result = warc_write_revisit_record (url, timestamp_str,
+ concurrent_to_uuid, payload_digest, rec_existing->uuid,
+ ip, body);
+
+ return result;
+ }
+
+ warc_base32_sha1_digest (sha1_res_block, block_digest, sizeof(block_digest));
+ warc_base32_sha1_digest (sha1_res_payload, payload_digest, sizeof(payload_digest));
+ }
+ }
+
+ /* Not a revisit, just store the record. */
+
+ warc_uuid_str (response_uuid, sizeof (response_uuid));
+
+ fseeko (warc_current_file, 0L, SEEK_END);
+ offset = ftello (warc_current_file);
+
+ warc_write_start_record ();
+ warc_write_header ("WARC-Type", "response");
+ warc_write_header ("WARC-Record-ID", response_uuid);
+ warc_write_header ("WARC-Warcinfo-ID", warc_current_warcinfo_uuid_str);
+ warc_write_header ("WARC-Concurrent-To", concurrent_to_uuid);
+ warc_write_header_uri ("WARC-Target-URI", url);
+ warc_write_date_header (timestamp_str);
+ warc_write_ip_header (ip);
+ warc_write_header ("WARC-Block-Digest", block_digest);
+ warc_write_header ("WARC-Payload-Digest", payload_digest);
+ warc_write_header ("Content-Type", "application/http;msgtype=response");
+ warc_write_block_from_file (body);
+ warc_write_end_record ();
+
+ fclose (body);
+
+ if (warc_write_ok && opt.warc_cdx_enabled)
+ {
+ /* Add this record to the CDX. */
+ warc_write_cdx_record (url, timestamp_str, mime_type, response_code,
+ payload_digest, redirect_location, offset, warc_current_filename,
+ response_uuid);
+ }
+
+ return warc_write_ok;
+}
+
+/* Writes a resource or metadata record to the WARC file.
+ warc_type is either "resource" or "metadata",
+ resource_uuid is the uuid of the resource (or NULL),
+ url is the target uri of the resource,
+ timestamp_str is the timestamp (generated with warc_timestamp),
+ concurrent_to_uuid is the uuid of the record that generated this,
+ resource (generated with warc_uuid_str) or NULL,
+ ip is the ip address of the server (or NULL),
+ content_type is the mime type of the body (or NULL),
+ body is a pointer to a file containing the resource data.
+ Calling this function will close body.
+ Returns true on success, false on error. */
+static bool
+warc_write_record (const char *record_type, const char *resource_uuid,
+ const char *url, const char *timestamp_str,
+ const char *concurrent_to_uuid,
+ const ip_address *ip, const char *content_type, FILE *body,
+ off_t payload_offset)
+{
+ char uuid_buf[48];
+
+ if (resource_uuid == NULL)
+ {
+ warc_uuid_str (uuid_buf, sizeof (uuid_buf));
+ resource_uuid = uuid_buf;
+ }
+
+ if (content_type == NULL)
+ content_type = "application/octet-stream";
+
+ warc_write_start_record ();
+ warc_write_header ("WARC-Type", record_type);
+ warc_write_header ("WARC-Record-ID", resource_uuid);
+ warc_write_header ("WARC-Warcinfo-ID", warc_current_warcinfo_uuid_str);
+ warc_write_header ("WARC-Concurrent-To", concurrent_to_uuid);
+ warc_write_header_uri ("WARC-Target-URI", url);
+ warc_write_date_header (timestamp_str);
+ warc_write_ip_header (ip);
+ warc_write_digest_headers (body, payload_offset);
+ warc_write_header ("Content-Type", content_type);
+ warc_write_block_from_file (body);
+ warc_write_end_record ();
+
+ fclose (body);
+
+ return warc_write_ok;
+}
+
+/* Writes a resource record to the WARC file.
+ resource_uuid is the uuid of the resource (or NULL),
+ url is the target uri of the resource,
+ timestamp_str is the timestamp (generated with warc_timestamp),
+ concurrent_to_uuid is the uuid of the record that generated this,
+ resource (generated with warc_uuid_str) or NULL,
+ ip is the ip address of the server (or NULL),
+ content_type is the mime type of the body (or NULL),
+ body is a pointer to a file containing the resource data.
+ Calling this function will close body.
+ Returns true on success, false on error. */
+bool
+warc_write_resource_record (const char *resource_uuid, const char *url,
+ const char *timestamp_str, const char *concurrent_to_uuid,
+ const ip_address *ip, const char *content_type, FILE *body,
+ off_t payload_offset)
+{
+ return warc_write_record ("resource",
+ resource_uuid, url, timestamp_str, concurrent_to_uuid,
+ ip, content_type, body, payload_offset);
+}
+
+/* Writes a metadata record to the WARC file.
+ record_uuid is the uuid of the record (or NULL),
+ url is the target uri of the record,
+ timestamp_str is the timestamp (generated with warc_timestamp),
+ concurrent_to_uuid is the uuid of the record that generated this,
+ record (generated with warc_uuid_str) or NULL,
+ ip is the ip address of the server (or NULL),
+ content_type is the mime type of the body (or NULL),
+ body is a pointer to a file containing the record data.
+ Calling this function will close body.
+ Returns true on success, false on error. */
+bool
+warc_write_metadata_record (const char *record_uuid, const char *url,
+ const char *timestamp_str, const char *concurrent_to_uuid,
+ ip_address *ip, const char *content_type, FILE *body,
+ off_t payload_offset)
+{
+ return warc_write_record ("metadata",
+ record_uuid, url, timestamp_str, concurrent_to_uuid,
+ ip, content_type, body, payload_offset);
+}
diff --git a/src/warc.h b/src/warc.h
new file mode 100644
index 0000000..7238cff
--- /dev/null
+++ b/src/warc.h
@@ -0,0 +1,27 @@
+/* Declarations of WARC helper methods. */
+#ifndef WARC_H
+#define WARC_H
+
+#include "host.h"
+
+void warc_init (void);
+void warc_close (void);
+void warc_uuid_str (char *id_str, size_t urn_size);
+
+char * warc_timestamp (char *timestamp, size_t timestamp_size);
+
+FILE * warc_tempfile (void);
+
+bool warc_write_request_record (const char *url, const char *timestamp_str,
+ const char *concurrent_to_uuid, const ip_address *ip, FILE *body, off_t payload_offset);
+bool warc_write_response_record (const char *url, const char *timestamp_str,
+ const char *concurrent_to_uuid, const ip_address *ip, FILE *body, off_t payload_offset,
+ const char *mime_type, int response_code, const char *redirect_location);
+bool warc_write_resource_record (const char *resource_uuid, const char *url,
+ const char *timestamp_str, const char *concurrent_to_uuid, const ip_address *ip,
+ const char *content_type, FILE *body, off_t payload_offset);
+bool warc_write_metadata_record (const char *record_uuid, const char *url,
+ const char *timestamp_str, const char *concurrent_to_uuid, ip_address *ip,
+ const char *content_type, FILE *body, off_t payload_offset);
+
+#endif /* WARC_H */
diff --git a/src/wget.h b/src/wget.h
new file mode 100644
index 0000000..b6a9dca
--- /dev/null
+++ b/src/wget.h
@@ -0,0 +1,333 @@
+/* Miscellaneous declarations.
+ Copyright (C) 1996-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+/* This file contains declarations that are universally useful and
+ those that don't fit elsewhere. It also includes sysdep.h which
+ includes some often-needed system includes, like the obnoxious
+ <time.h> inclusion. */
+
+#ifndef WGET_H
+#define WGET_H
+
+#include "config.h"
+
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
+# define WINDOWS
+#endif
+
+/* Include these, so random files need not include them. */
+#include "sysdep.h"
+
+/* Disable assertions when debug support is not compiled in. */
+#ifndef ENABLE_DEBUG
+#ifndef NDEBUG
+# define NDEBUG
+#endif
+#endif
+
+/* Is OpenSSL or GNUTLS available? */
+#if defined HAVE_LIBSSL || defined HAVE_LIBSSL32 || defined HAVE_LIBGNUTLS
+# define HAVE_SSL
+# define HAVE_HSTS /* There's no sense in enabling HSTS without SSL */
+#endif
+
+/* `gettext (FOO)' is long to write, so we use `_(FOO)'. If NLS is
+ unavailable, _(STRING) simply returns STRING. */
+#include "gettext.h"
+#define _(STRING) gettext(STRING)
+
+/* A pseudo function call that serves as a marker for the automated
+ extraction of messages, but does not call gettext(). The run-time
+ translation is done at a different place in the code. The purpose
+ of the N_("...") call is to make the message snarfer aware that the
+ "..." string needs to be translated. STRING should be a string
+ literal. Concatenated strings and other string expressions won't
+ work. The macro's expansion is not parenthesized, so that it is
+ suitable as initializer for static 'char[]' or 'const char[]'
+ variables. -- explanation partly taken from GNU make. */
+#define N_(string) string
+
+#if HAVE_WCWIDTH && HAVE_MBTOWC
+# define USE_NLS_PROGRESS_BAR 1
+#else
+/* Just to be a little paranoid about it. */
+# undef USE_NLS_PROGRESS_BAR
+#endif
+
+/* I18N NOTE: You will notice that none of the DEBUGP messages are
+ marked as translatable. This is intentional, for a few reasons:
+
+ 1) The debug messages are not meant for the users to look at, but
+ for the developers; as such, they should be considered more like
+ source comments than real program output.
+
+ 2) The messages are numerous, and yet they are random and frivolous
+ ("double yuck!" and such). There would be a lot of work with no
+ gain.
+
+ 3) Finally, the debug messages are meant to be a clue for me to
+ debug problems with Wget. If I get them in a language I don't
+ understand, debugging will become a new challenge of its own! */
+
+/* locale independent replacement for ctype.h */
+#include "c-ctype.h"
+
+/* Conditionalize the use of GCC's __attribute__((format)) and
+ __builtin_expect features using macros. */
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+# define GCC_FORMAT_ATTR(a, b) __attribute__ ((format (printf, a, b)))
+# define LIKELY(exp) __builtin_expect (!!(exp), 1)
+# define UNLIKELY(exp) __builtin_expect ((exp), 0)
+#else
+# define GCC_FORMAT_ATTR(a, b)
+# define LIKELY(exp) (exp)
+# define UNLIKELY(exp) (exp)
+#endif
+
+/* Execute the following statement if debugging is both enabled at
+ compile-time and requested at run-time; a no-op otherwise. */
+
+#ifdef ENABLE_DEBUG
+# define IF_DEBUG if (UNLIKELY (opt.debug))
+#else
+# define IF_DEBUG if (0)
+#endif
+
+/* Print ARGS if debugging is enabled and requested, otherwise do
+ nothing. This must be called with an extra level of parentheses
+ because it's not possible to pass a variable number of arguments to
+ a macro (in portable C89). ARGS are like arguments to printf. */
+
+#define DEBUGP(args) do { IF_DEBUG { debug_logprintf args; } } while (0)
+
+/* Pick an integer type large enough for file sizes, content lengths,
+ and such. Because today's files can be very large, it should be a
+ signed integer at least 64 bits wide. This can't be typedeffed to
+ off_t because: a) off_t is always 32-bit on Windows, and b) we
+ don't necessarily want to tie having a 64-bit type for internal
+ calculations to having LFS support. */
+
+/* Gnulib's stdint.h module essentially guarantees the existence of int64_t.
+ * Thus we can simply assume it always exists and use it.
+ */
+#include <stdint.h>
+
+typedef int64_t wgint;
+#define WGINT_MAX INT64_MAX
+typedef wgint SUM_SIZE_INT;
+
+#define str_to_wgint strtol
+
+#include "options.h"
+
+/* Everything uses this, so include them here directly. */
+#ifdef __cplusplus
+# undef _Noreturn
+#endif
+#include "xalloc.h"
+
+/* Likewise for logging functions. */
+#include "log.h"
+
+/* Likewise for quoting functions. */
+#include "quote.h"
+#include "quotearg.h"
+
+/* Likewise for struct iri definition */
+#include "iri.h"
+
+/* Useful macros used across the code: */
+
+/* The number of elements in an array. For example:
+ static char a[] = "foo"; -- countof(a) == 4 (note terminating \0)
+ int a[5] = {1, 2}; -- countof(a) == 5
+ char *a[] = { -- countof(a) == 3
+ "foo", "bar", "baz"
+ }; */
+#define countof(array) (sizeof (array) / sizeof ((array)[0]))
+
+/* Zero out a value. */
+#define xzero(x) memset (&(x), '\0', sizeof (x))
+
+/* Convert an ASCII hex digit to the corresponding number between 0
+ and 15. c should be a hexadecimal digit that satisfies c_isxdigit;
+ otherwise, the result is undefined. */
+static inline unsigned char _unhex(unsigned char c)
+{
+ return c <= '9' ? c - '0' : (c <= 'F' ? c - 'A' + 10 : c - 'a' + 10);
+}
+#define X2DIGITS_TO_NUM(h1, h2) ((_unhex (h1) << 4) + _unhex (h2))
+
+/* The reverse of the above: convert a number in the [0, 16) range to
+ the ASCII representation of the corresponding hexadecimal digit.
+ `+ 0' is there so you can't accidentally use it as an lvalue. */
+#define XNUM_TO_DIGIT(x) ("0123456789ABCDEF"[x] + 0)
+#define XNUM_TO_digit(x) ("0123456789abcdef"[x] + 0)
+
+/* Return non-zero if string bounded between BEG and END is equal to
+ STRING_LITERAL. The comparison is case-sensitive. */
+#define BOUNDED_EQUAL(beg, end, string_literal) \
+ ((end) - (beg) == sizeof (string_literal) - 1 \
+ && !memcmp (beg, string_literal, sizeof (string_literal) - 1))
+
+/* The same as above, except the comparison is case-insensitive. */
+#define BOUNDED_EQUAL_NO_CASE(beg, end, string_literal) \
+ ((end) - (beg) == sizeof (string_literal) - 1 \
+ && !c_strncasecmp (beg, string_literal, sizeof (string_literal) - 1))
+
+/* Generally useful if you want to avoid arbitrary size limits but
+ don't need a full dynamic array. Assumes that BASEVAR points to a
+ malloced array of TYPE objects (or possibly a NULL pointer, if
+ SIZEVAR is 0), with the total size stored in SIZEVAR. This macro
+ will realloc BASEVAR as necessary so that it can hold at least
+ NEEDED_SIZE objects. The reallocing is done by doubling, which
+ ensures constant amortized time per element. */
+
+#define DO_REALLOC(basevar, sizevar, needed_size, type) do { \
+ long DR_needed_size = (needed_size); \
+ long DR_newsize = 0; \
+ while ((sizevar) < (DR_needed_size)) { \
+ DR_newsize = sizevar << 1; \
+ if (DR_newsize < 16) \
+ DR_newsize = 16; \
+ (sizevar) = DR_newsize; \
+ } \
+ if (DR_newsize) \
+ basevar = xrealloc (basevar, DR_newsize * sizeof (type)); \
+} while (0)
+
+/* Used to print pointers (usually for debugging). Print pointers
+ using printf ("0x%0*lx", PTR_FORMAT (p)). (%p is too unpredictable;
+ some implementations prepend 0x, while some don't, and most don't
+ 0-pad the address.) */
+#define PTR_FORMAT(p) (int) (2 * sizeof (void *)), (unsigned long) (p)
+
+/* Find the maximum buffer length needed to print an integer of type `x'
+ in base 10. 24082 / 10000 = 8*log_{10}(2). */
+#define MAX_INT_TO_STRING_LEN(x) ((sizeof(x) * 24082 / 10000) + 2)
+
+/* Find the minimum or maximum of two provided values */
+# define MIN(i, j) ((i) <= (j) ? (i) : (j))
+# define MAX(i, j) ((i) >= (j) ? (i) : (j))
+
+
+extern const char *exec_name;
+extern const char *program_name;
+extern const char *program_argstring;
+
+/* Document type ("dt") flags */
+enum
+{
+ TEXTHTML = 0x0001, /* document is of type text/html
+ or application/xhtml+xml */
+ RETROKF = 0x0002, /* retrieval was OK */
+ HEAD_ONLY = 0x0004, /* only send the HEAD request */
+ SEND_NOCACHE = 0x0008, /* send Cache-Control: no-cache and Pragma: no-cache directive */
+ ACCEPTRANGES = 0x0010, /* Accept-ranges header was found */
+ ADDED_HTML_EXTENSION = 0x0020, /* added ".html" extension due to -E */
+ TEXTCSS = 0x0040, /* document is of type text/css */
+ IF_MODIFIED_SINCE = 0x0080, /* use if-modified-since header */
+ METALINK_METADATA = 0x0100 /* use HTTP response for Metalink metadata */
+};
+
+/* Universal error type -- used almost everywhere. Error reporting of
+ this detail is not generally used or needed and should be
+ simplified. */
+typedef enum
+{
+ NOCONERROR, HOSTERR, CONSOCKERR, CONERROR, CONSSLERR,
+ CONIMPOSSIBLE, NEWLOCATION,
+ FTPOK, FTPLOGINC, FTPLOGREFUSED, FTPPORTERR, FTPSYSERR,
+ FTPNSFOD, FTPUNKNOWNTYPE, FTPRERR,
+ FTPSRVERR, FTPRETRINT, FTPRESTFAIL, URLERROR, FOPENERR,
+ FOPEN_EXCL_ERR, FWRITEERR, HEOF, GATEWAYTIMEOUT,
+ HERR, RETROK, RECLEVELEXC, WRONGCODE,
+ FTPINVPASV, FTPNOPASV, FTPNOPBSZ, FTPNOPROT, FTPNOAUTH,
+ CONTNOTSUPPORTED, RETRUNNEEDED, RETRFINISHED,
+ READERR, TRYLIMEXC, FILEBADFILE, RANGEERR,
+ RETRBADPATTERN, PROXERR,
+ AUTHFAILED, QUOTEXC, WRITEFAILED, SSLINITFAILED, VERIFCERTERR,
+ UNLINKERR, NEWLOCATION_KEEP_POST, CLOSEFAILED, ATTRMISSING, UNKNOWNATTR,
+ WARC_ERR, WARC_TMP_FOPENERR, WARC_TMP_FWRITEERR,
+ TIMECONV_ERR,
+ METALINK_PARSE_ERROR, METALINK_RETR_ERROR,
+ METALINK_CHKSUM_ERROR, METALINK_SIG_ERROR, METALINK_MISSING_RESOURCE,
+ RETR_WITH_METALINK,
+ METALINK_SIZE_ERROR
+} uerr_t;
+
+/* 2005-02-19 SMS.
+ Select an appropriate "orig" suffix and a separator character for
+ adding a unique suffix to a file name.
+
+ A VMS ODS2 file system can't tolerate multiple dots. An ODS5 file
+ system can, but even there not all dots are equal, and heroic effort
+ would be needed to get ".html^.orig" rather than (the less desirable)
+ "^.html.orig". It's more satisfactory always to use "_orig" on VMS
+ (rather than including "vms.h", testing "ods5_dest", and acting
+ accordingly).
+
+ Note that code in various places assumes that this string is five
+ characters long.
+*/
+# ifdef __VMS
+# define ORIG_SFX "_orig"
+# else /* def __VMS */
+# define ORIG_SFX ".orig"
+# endif /* def __VMS [else] */
+
+/* ".NNN" unique-ifying suffix separator character for unique_name() in
+ url.c (and anywhere else). Note that on VMS, the file system's
+ version numbers solve the problem that unique_name() is designed to
+ handle, obviating this whole exercise. Other systems may specify a
+ character different from "." here, if desired.
+*/
+# ifndef __VMS
+# define UNIQ_SEP '.'
+# endif /* ndef __VMS */
+
+#if defined FUZZING && defined TESTING
+/* Rename fopen so we can have our own version in fuzz/main.c to
+ not create random files. */
+# define fopen(fp, mode) fopen_wget(fp, mode)
+# define exit(status) exit_wget(status)
+
+/* In run_wgetrc() we call fopen_wgetrc() instead of fopen, so we can catch
+ the call in our fuzzers. */
+FILE *fopen_wget(const char *pathname, const char *mode);
+FILE *fopen_wgetrc(const char *pathname, const char *mode);
+void exit_wget(int status);
+#else
+/* When not fuzzing, we want to call fopen() instead of fopen_wgetrc() */
+# define fopen_wgetrc(fp, mode) fopen(fp, mode)
+#endif /* FUZZING && TESTING */
+
+#endif /* WGET_H */
diff --git a/src/xattr.c b/src/xattr.c
new file mode 100644
index 0000000..a5261f1
--- /dev/null
+++ b/src/xattr.c
@@ -0,0 +1,95 @@
+/* xattr.h -- POSIX Extended Attribute support.
+
+ Copyright (C) 2016, 2018-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "log.h"
+#include "utils.h"
+#include "xattr.h"
+
+#ifdef USE_XATTR
+
+static int
+write_xattr_metadata (const char *name, const char *value, FILE *fp)
+{
+ int retval = -1;
+
+ if (name && value && fp)
+ {
+ retval = fsetxattr (fileno (fp), name, value, strlen (value), 0);
+ /* FreeBSD's extattr_set_fd returns the length of the extended attribute. */
+ retval = (retval < 0) ? retval : 0;
+ if (retval)
+ DEBUGP (("Failed to set xattr %s.\n", quote(name)));
+ }
+
+ return retval;
+}
+
+#else /* USE_XATTR */
+
+static int
+write_xattr_metadata (const char *name, const char *value, FILE *fp)
+{
+ (void)name;
+ (void)value;
+ (void)fp;
+
+ return 0;
+}
+
+#endif /* USE_XATTR */
+
+int
+set_file_metadata (const struct url *origin_url, const struct url *referrer_url, FILE *fp)
+{
+ /* Save metadata about where the file came from (requested, final URLs) to
+ * user POSIX Extended Attributes of retrieved file.
+ *
+ * For more details about the user namespace see
+ * [http://freedesktop.org/wiki/CommonExtendedAttributes] and
+ * [http://0pointer.de/lennart/projects/mod_mime_xattr/].
+ */
+ int retval = -1;
+ char *value;
+
+ if (!origin_url || !fp)
+ return retval;
+
+ value = url_string (origin_url, URL_AUTH_HIDE);
+ retval = write_xattr_metadata ("user.xdg.origin.url", escnonprint_uri (value), fp);
+ xfree (value);
+
+ if (!retval && referrer_url)
+ {
+ struct url u;
+
+ memset(&u, 0, sizeof(u));
+ u.scheme = referrer_url->scheme;
+ u.host = referrer_url->host;
+ u.port = referrer_url->port;
+
+ value = url_string (&u, 0);
+ retval = write_xattr_metadata ("user.xdg.referrer.url", escnonprint_uri (value), fp);
+ xfree (value);
+ }
+
+ return retval;
+}
diff --git a/src/xattr.h b/src/xattr.h
new file mode 100644
index 0000000..20eebe0
--- /dev/null
+++ b/src/xattr.h
@@ -0,0 +1,46 @@
+/* xattr.h -- POSIX Extended Attribute function mappings.
+
+ Copyright (C) 2016, 2018-2020 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <url.h>
+
+#ifndef _XATTR_H
+#define _XATTR_H
+
+/* Store metadata name/value attributes against fp. */
+int set_file_metadata (const struct url *origin_url, const struct url *referrer_url, FILE *fp);
+
+#if defined(__linux)
+/* libc on Linux has fsetxattr (5 arguments). */
+# include <sys/xattr.h>
+# define USE_XATTR
+#elif defined(__APPLE__)
+/* libc on OS/X has fsetxattr (6 arguments). */
+# include <sys/xattr.h>
+# define fsetxattr(file, name, buffer, size, flags) \
+ fsetxattr ((file), (name), (buffer), (size), 0, (flags))
+# define USE_XATTR
+#elif defined(__FreeBSD_version) && (__FreeBSD_version > 500000)
+/* FreeBSD */
+# include <sys/types.h>
+# include <sys/extattr.h>
+# define fsetxattr(file, name, buffer, size, flags) \
+ extattr_set_fd ((file), EXTATTR_NAMESPACE_USER, (name), (buffer), (size))
+# define USE_XATTR
+#endif
+
+#endif /* _XATTR_H */
diff --git a/testenv/Makefile.am b/testenv/Makefile.am
new file mode 100644
index 0000000..685e511
--- /dev/null
+++ b/testenv/Makefile.am
@@ -0,0 +1,128 @@
+# Makefile for `wget' utility
+# Copyright (C) 2013, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+
+if METALINK_IS_ENABLED
+ METALINK_TESTS = Test-metalink-http.py \
+ Test-metalink-http-quoted.py \
+ Test-metalink-http-baddigest.py \
+ Test-metalink-http-xml.py \
+ Test-metalink-http-xml-trust.py \
+ Test-metalink-http-xml-trust-name.py \
+ Test-metalink-http-xml-type.py \
+ Test-metalink-http-xml-type-trust.py \
+ Test-metalink-http-xml-type-content.py \
+ Test-metalink-http-xml-type-trust-content.py \
+ Test-metalink-xml.py \
+ Test-metalink-xml-continue.py \
+ Test-metalink-xml-relpath.py \
+ Test-metalink-xml-abspath.py \
+ Test-metalink-xml-homepath.py \
+ Test-metalink-xml-trust.py \
+ Test-metalink-xml-relpath-trust.py \
+ Test-metalink-xml-abspath-trust.py \
+ Test-metalink-xml-homepath-trust.py \
+ Test-metalink-xml-prefix.py \
+ Test-metalink-xml-relprefix.py \
+ Test-metalink-xml-absprefix.py \
+ Test-metalink-xml-homeprefix.py \
+ Test-metalink-xml-prefix-trust.py \
+ Test-metalink-xml-relprefix-trust.py \
+ Test-metalink-xml-absprefix-trust.py \
+ Test-metalink-xml-homeprefix-trust.py \
+ Test-metalink-xml-emptyprefix-trust.py \
+ Test-metalink-xml-size.py \
+ Test-metalink-xml-nohash.py \
+ Test-metalink-xml-nourls.py \
+ Test-metalink-xml-urlbreak.py
+else
+ METALINK_TESTS =
+endif
+
+AUTOMAKE_OPTIONS = parallel-tests
+AM_TESTS_ENVIRONMENT = export WGETRC=/dev/null; MAKE_CHECK=True; export MAKE_CHECK;\
+ export PYTHONPATH=$$PYTHONPATH:$(srcdir); export VALGRIND_TESTS="@VALGRIND_TESTS@";
+
+if WITH_SSL
+ AM_TESTS_ENVIRONMENT += export SSL_TESTS=1;
+endif
+
+if HAVE_PYTHON3
+ TESTS = Test-504.py \
+ Test-416.py \
+ Test-auth-basic-fail.py \
+ Test-auth-basic.py \
+ Test-auth-basic-netrc.py \
+ Test-auth-basic-netrc-user-given.py \
+ Test-auth-basic-netrc-pass-given.py \
+ Test-auth-basic-no-netrc-fail.py \
+ Test-auth-both.py \
+ Test-auth-digest.py \
+ Test-auth-no-challenge.py \
+ Test-auth-no-challenge-url.py \
+ Test-auth-retcode.py \
+ Test-auth-with-content-disposition.py \
+ Test-c-full.py \
+ Test-condget.py \
+ Test-Content-disposition-2.py \
+ Test-Content-disposition.py \
+ Test--convert-links--content-on-error.py \
+ Test-cookie-401.py \
+ Test-cookie-domain-mismatch.py \
+ Test-cookie-expires.py \
+ Test-cookie.py \
+ Test-Head.py \
+ Test-hsts.py \
+ Test--https.py \
+ Test--https-crl.py \
+ Test-missing-scheme-retval.py \
+ Test-O.py \
+ Test-pinnedpubkey-der-https.py \
+ Test-pinnedpubkey-der-no-check-https.py \
+ Test-pinnedpubkey-hash-https.py \
+ Test-pinnedpubkey-hash-no-check-fail-https.py \
+ Test-pinnedpubkey-pem-fail-https.py \
+ Test-pinnedpubkey-pem-https.py \
+ Test-Post.py \
+ Test-recursive-basic.py \
+ Test-recursive-include.py \
+ Test-recursive-redirect.py \
+ Test-redirect.py \
+ Test-redirect-crash.py \
+ Test--rejected-log.py \
+ Test-reserved-chars.py \
+ Test--spider-r.py \
+ Test-no_proxy-env.py \
+ $(METALINK_TESTS)
+
+endif
+
+EXTRA_DIST = certs conf exc misc server test README $(TESTS)
+
+TEST_EXTENSIONS = .py
+PY_LOG_COMPILER = python3
+AM_PY_LOG_FLAGS = -O
diff --git a/testenv/Makefile.in b/testenv/Makefile.in
new file mode 100644
index 0000000..eece604
--- /dev/null
+++ b/testenv/Makefile.in
@@ -0,0 +1,2194 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `wget' utility
+# Copyright (C) 2013, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@WITH_SSL_TRUE@am__append_1 = export SSL_TESTS=1;
+@HAVE_PYTHON3_TRUE@TESTS = Test-504.py Test-416.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-basic-fail.py Test-auth-basic.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-basic-netrc.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-basic-netrc-user-given.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-basic-netrc-pass-given.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-basic-no-netrc-fail.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-both.py Test-auth-digest.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-no-challenge.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-no-challenge-url.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-retcode.py \
+@HAVE_PYTHON3_TRUE@ Test-auth-with-content-disposition.py \
+@HAVE_PYTHON3_TRUE@ Test-c-full.py Test-condget.py \
+@HAVE_PYTHON3_TRUE@ Test-Content-disposition-2.py \
+@HAVE_PYTHON3_TRUE@ Test-Content-disposition.py \
+@HAVE_PYTHON3_TRUE@ Test--convert-links--content-on-error.py \
+@HAVE_PYTHON3_TRUE@ Test-cookie-401.py \
+@HAVE_PYTHON3_TRUE@ Test-cookie-domain-mismatch.py \
+@HAVE_PYTHON3_TRUE@ Test-cookie-expires.py Test-cookie.py \
+@HAVE_PYTHON3_TRUE@ Test-Head.py Test-hsts.py Test--https.py \
+@HAVE_PYTHON3_TRUE@ Test--https-crl.py \
+@HAVE_PYTHON3_TRUE@ Test-missing-scheme-retval.py Test-O.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-der-https.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-der-no-check-https.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-hash-https.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-hash-no-check-fail-https.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-pem-fail-https.py \
+@HAVE_PYTHON3_TRUE@ Test-pinnedpubkey-pem-https.py Test-Post.py \
+@HAVE_PYTHON3_TRUE@ Test-recursive-basic.py \
+@HAVE_PYTHON3_TRUE@ Test-recursive-include.py \
+@HAVE_PYTHON3_TRUE@ Test-recursive-redirect.py Test-redirect.py \
+@HAVE_PYTHON3_TRUE@ Test-redirect-crash.py \
+@HAVE_PYTHON3_TRUE@ Test--rejected-log.py \
+@HAVE_PYTHON3_TRUE@ Test-reserved-chars.py Test--spider-r.py \
+@HAVE_PYTHON3_TRUE@ Test-no_proxy-env.py $(am__EXEEXT_1)
+subdir = testenv
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/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__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+@METALINK_IS_ENABLED_TRUE@am__EXEEXT_1 = Test-metalink-http.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-quoted.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-baddigest.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-trust-name.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-content.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-trust-content.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-continue.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relpath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-abspath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homepath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relpath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-abspath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homepath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-prefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-absprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homeprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-prefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-absprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homeprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-emptyprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-size.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-nohash.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-nourls.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-urlbreak.py
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.py.log=.log)
+PY_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+PY_LOG_COMPILE = $(PY_LOG_COMPILER) $(AM_PY_LOG_FLAGS) $(PY_LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/build-aux/test-driver README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+@METALINK_IS_ENABLED_FALSE@METALINK_TESTS =
+@METALINK_IS_ENABLED_TRUE@METALINK_TESTS = Test-metalink-http.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-quoted.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-baddigest.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-trust-name.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-content.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-http-xml-type-trust-content.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-continue.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relpath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-abspath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homepath.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relpath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-abspath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homepath-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-prefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-absprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homeprefix.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-prefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-relprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-absprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-homeprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-emptyprefix-trust.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-size.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-nohash.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-nourls.py \
+@METALINK_IS_ENABLED_TRUE@ Test-metalink-xml-urlbreak.py
+
+AUTOMAKE_OPTIONS = parallel-tests
+AM_TESTS_ENVIRONMENT = export WGETRC=/dev/null; MAKE_CHECK=True; \
+ export MAKE_CHECK; export PYTHONPATH=$$PYTHONPATH:$(srcdir); \
+ export VALGRIND_TESTS="@VALGRIND_TESTS@"; $(am__append_1)
+EXTRA_DIST = certs conf exc misc server test README $(TESTS)
+TEST_EXTENSIONS = .py
+PY_LOG_COMPILER = python3
+AM_PY_LOG_FLAGS = -O
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .log .py .py$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu testenv/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu testenv/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS:
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+.py.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(PY_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_PY_LOG_DRIVER_FLAGS) $(PY_LOG_DRIVER_FLAGS) -- $(PY_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.py$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(PY_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_PY_LOG_DRIVER_FLAGS) $(PY_LOG_DRIVER_FLAGS) -- $(PY_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+ cscopelist-am ctags-am distclean distclean-generic 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 pdf \
+ pdf-am ps ps-am recheck tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/testenv/README b/testenv/README
new file mode 100644
index 0000000..d4fabdd
--- /dev/null
+++ b/testenv/README
@@ -0,0 +1,306 @@
+This document describes the working of the GNU Wget Test Suite.
+
+Install Instructions:
+================================================================================
+
+This Test Suite exploits the Parallel Test Harness available in GNU Autotools.
+Since it uses features from a relatively recent version of Autotools, the minimum
+required version as been bumped up to 1.11.
+Run the './configure' command to generate the Makefile and then run 'make check'
+to execute the Test Suite. Use the '-j n' option with 'make check' to execute
+n tests simultaneously.
+
+Structure:
+================================================================================
+
+ * server: This package contains custom programmatically configurable servers
+ (both HTTP and FTP) for testing Wget. The HTTP server runs an instance of
+ Python's http.server module. The FTP server is to be implemented.
+
+ * test: This package contains the test case classes for HTTP and FTP. The
+ test case classes includes methods for initializing and cleaning up of the
+ test environment.
+
+ * Test-Proto.py: This is a prototype Test Case file. The file defines all
+ the acceptable elements and their uses. Typically, one must copy this file
+ and edit it for writing Test Cases.
+
+ * exc: This package contains custom exception classes used in this test
+ suite.
+
+ * conf: This package contains the configuration classes for servers to be
+ configured with.
+
+ * misc: This package contains several helper modules used in this test
+ suite.
+ - colour_terminal.py: A custom module for printing coloured output to
+ the terminal. Currently it only supports 4 colours in a *nix
+ environment.
+ - wget_file.py: Module which contains WgetFile, which is a file data
+ container object.
+
+Working:
+================================================================================
+
+The Test Files are valid Python scripts and the default mask for them is 755.
+A singular Test must be invoked in the following manner, with the current
+directory being the testenv directory:
+$ ./python3 <Name of Test File> OR
+$ ./<Name of Test File>
+The script will then initialize the various elements and pass them to an object
+of the respective Test Class. A directory with the name <Test name>-test will be
+created and the PWD will be changed to this directory. The server is then
+spawned with the required configuration elements. A blocking call to Wget is
+made with the command line arguments specified in the Test Case along with the
+list of URLs that it must download. The server is killed once Wget returns and
+the following checks are used to determine the pass/fail status of the test:
+ * Return Code: The Exit code of Wget is matched against the expected Exit
+ Code as mentioned in the Test Case File.
+ * Downloaded Files: Check whether the expected downloaded files exist on
+ disk.
+ * File Content: Test whether the file contents were correctly downloaded by
+ Wget and not corrupted mid-way.
+ * Excess Files: Check to see whether any unexpected files were downloaded
+ by Wget.
+
+Exit Codes:
+===============================================================================
+
+Following is a list of Exit Status Codes for the tests:
+* 0 Test Successful
+* 66 Errors/Warnings Reported by Thread Sanitizer (If built with -fsanitize)
+* 77 Test Skipped
+* 99 Hard Error
+* 100 Test Failed
+
+Tests are skipped when they are either not supported by the platform, or Wget
+is not compiled with support for that feature. This feature has not yet been
+implemented.
+
+Hard Errors occur when there are problems with the Environment code. Hard
+Error reporting is currently not enabled and all errors are reported as
+failures.
+
+All exceptions should ideally be handled gracefully. If you see any unhandled
+exceptions, please file a bug report at <bug-wget@gnu.org>
+
+Environment Variables:
+================================================================================
+
+* SERVER_WAIT: Set this environment variable with a value for the number of
+ seconds the test should sleep between invoking the server and calling the Wget
+ executable. This is used when one would like to test a different version of
+ the executable or for running the test through external utilities like gdb and
+ valgrind.
+* NO_CLEANUP: Do not remove the temporary files created by the test.
+ This will prevent the ${testname}-test directory from being deleted
+* VALGRIND_TESTS: If this variable is set and contains the valgrind command line,
+ the test suite will execute all the tests via this command.
+ If it is set to "1", valgrind memcheck is enabled with hard coded options.
+ This variable is set by ./configure --enable-valgrind-tests.
+* SSL_TESTS: This must be set to run any https tests.
+* WGET_PATH: Set this environment variable to a path to wget binary on which you
+ want to run tests. This is useful for OS distributions, which want to reuse
+ upstream tests for testing wget build that they distribute. If the variable is
+ not set, the "../src/wget" binary is used by tests.
+
+
+File Structure:
+================================================================================
+
+The test case files are Python scripts. It is believed that Python is a simple
+yet elegant language and should be easy for everyone to comprehend. This test
+suite is written with the objective of making it easy to write new tests. The
+structure has been kept as intuitive as possible and should not require much
+effort to get accustomed to.
+
+All Test Files MUST begin with the following Three Lines:
+#!/usr/bin/python3
+from sys import exit
+from WgetTest import {HTTPTest|FTPTest}
+from misc.wget_file import WgetFile
+
+It is recommended that a small description of the Test Case is provided next.
+This would be very helpful to future contributors.
+
+Each File in the Test must be represented as a WgetFile object. The WgetFile
+Class has the following prototype:
+WgetFile (str name, str contents, str timestamp, dict rules)
+None except name is a mandatory parameter, one may pass only those parameters
+that are required by the File object.
+
+The timestamp string should be in a format: "YYYY-MM-DD HH:MM:SS" in UTC zone.
+The rules object is a dictionary element, with the key as the Rule Name and
+value as the Rule Data. In most cases, the Rule Data is another dictionary.
+
+Various variables used consistently across all tests are:
+ * WGET_OPTIONS: The command line string passed to Wget upon invocation. This
+ string may contain URLs, like in the case where in-URL authentication is
+ used. Variable names passed like {{var_name}} will be replaced by the
+ contents of the variable self.var_name before being passed to Wget
+ * WGET_URLS: This is a list of filenames which will be appended as the URLs
+ to Wget during invocation. This is a list of lists, where WGET_URLS[0]
+ represents the list of Filenames called from Server[0], WGET_URLS[1] is a
+ list of files downloaded from Server[2], etc. They must be relative URLs,
+ i.e., not start with "/".
+ * Files: This variable defines the files that exist in the Server's
+ filesystem. The Files variable is a list of lists of WgetFile objects.
+ This means that File[0] is a list of WgetFile objects that lie on Server[0],
+ File[1] a list of files on Server[1] and so on.
+ * Existing_Files: This is a list of files that already exist in the
+ directory from which Wget is invoked.
+ * ExpectedReturnCode: The Exit Code expected to be returned by Wget after
+ the test.
+ * ExpectedDownloadedFiles: A list of files that are expected in the local
+ directory after Wget has finished executing. This does not include the files
+ already existing before Wget was launched and must be mentioned again.
+ * Request_List: An unordered list of Requests that each server must receive.
+ This too is a list of lists and follows the same convention as others above.
+
+Both, the HTTPTest and FTPTest modules have the same prototype:
+{
+ pre_hook,
+ test_options,
+ post_hook,
+ protocols
+}
+the three hooks should be Python dict objects and protocols should be a list of
+protocols, like [HTTP, HTTPS].
+
+Valid File Rules:
+================================================================================
+
+This section lists the currently supported File Rules and their structure.
+
+ * Authentication: Used when a File must require Authorization for access.
+ The value for this key is the following dictionary:
+ |-->Type : Basic|Digest|Both|Both_inline
+ |-->User : <Username>
+ --->Pass : <Password>
+
+ * ExpectHeader : The following Headers MUST exist in every Request for the
+ File. The value for this key is a dictionary object where each header is
+ represented as:
+ |-->Header Name : <Header Data>
+
+ * RejectHeader : This list of Headers must NEVER occur in a request. It
+ uses the same value format as ExpectHeader.
+
+ * SendHeader : This list of Headers will be sent in EVERY response to a
+ request for the respective file. It follows the same value format as
+ ExpectHeader. Additionally you can specify a list of strings as <Header Data>
+ if you want the header repeated with multiple values.
+
+ * Response : The HTTP Response Code to send to a request for this File.
+ The value is an Integer that represents a valid HTTP Response Code.
+
+Pre Test Hooks:
+================================================================================
+
+The Pre-Test Hooks are executed just after starting the server and just before
+spawning an instance of the server. These are usually used for setting up the
+Test Environment and Server Rules. The currently supported Pre-Test Hooks are:
+
+ * ServerFiles : A list of WgetFile objects that must exist on the Server
+ * LocalFiles : A list of WgetFile objects that exist locally on disk
+ before Wget is executed.
+
+Since pre_test is a dictionary, one may not assume that the hooks will be
+executed in the same order as they are defined.
+
+Test Options:
+================================================================================
+
+The test_options dictionary defines the commands to be used when the Test is
+executed. The currently supported options are:
+
+ * Urls : A list of the filenames that Wget must attempt to
+ download. The complete URL will be created and passed to Wget
+ automatically. (alias URLs)
+ * WgetCommands : A string consisting of the various commandline switches
+ sent to Wget upon invocation. Any data placed between {{ }} in this string
+ will be replaced with the contents of self.<data> before being passed to
+ Wget. This is particularly useful for getting the hostname and port for a
+ file. While all Download URL's are passed to Urls, a notable exception is
+ when in-url authentication is used. In such a case, the URL is specified in
+ the WgetCommands string.
+ * EnvironmentVariables: A dictionary with key-value items, which will be
+ defined as environment variables during the execution of wget command in
+ test.
+
+Post-Test Hooks:
+================================================================================
+
+These hooks are executed as soon as the call to Wget returns. The post-test
+hooks are usually used to run checks on the data, files downloaded, return code,
+etc. The following hooks are currently supported:
+
+ * ExpectedRetcode : This is an integer value of the ReturnCode with which
+ Wget is expected to exit. (alias ExpectedRetCode)
+ * ExpectedFiles : This is a list of WgetFile objects of the files that
+ must exist locally on disk in the Test directory.
+ * FilesCrawled : This requires a list of the Requests that the server is
+ expected to receive. The order is un-important since it will vary on the
+ parallel-wget branch. This hook is used in tests for Recursive mode to
+ ensure that the website is traversed correctly.
+
+Writing New Tests:
+================================================================================
+
+See Test-Proto.py for an example of how to write Test Case files. The
+recommended method for writing new Test Case files is to copy Test-Proto.py and
+modify it to ones needs.
+
+In case you require any functionality that is not currently defined in List of
+Rules defined above, you should implement a new class in the conf package. The
+file name doesn't matter (though it's better to give it an appropriate name).
+The new rule or hook class should be like this:
+============================================
+from conf import rule
+
+
+@rule()
+class MyNewRule:
+ def __init__(self, rule_arg):
+ self.rule_arg = rule_arg
+ # your rule initialization code goes here
+============================================
+from conf import hook
+
+
+@hook()
+class MyNewHook:
+ def __init__(self, hook_arg):
+ self.hook_arg = hook_arg
+ # your hook initialization code goes here
+
+ def __call__(self, test_obj):
+ # your hook code goes here
+============================================
+
+Once a new Test File is created, it must be added to the TESTS variable in
+Makefile.am. This way the Test will be executed on running a 'make check'.
+If a Test is expected to fail on the current master branch, then the Test should
+also be added to the XFAIL_TESTS variable. This will allow expected failures to
+pass through. If a test mentioned in the XFAIL_TESTS variable passes, it gets
+red-flagged as a XPASS. Currently, tests expected to fail under valgrind are not
+explicitly marked as XFAIL. Tests failing under valgrind must always be
+considered a blocking error.
+
+Work Remaining:
+================================================================================
+
+Some amount of work still remains to be done.
+ * Errors in server-side checks need to be handled more explicitly
+ * Support parallel-wget branch
+ * Support to spawn multiple servers is already in place. Need to handle
+ multiple requests to a server simultaneously. Use THreading MixIn.
+ * SSL Tests. Use xyne's HTTPS server implementation
+ * Complete support for FTP Tests
+ * IRI Support. This shouldn't require much effort
+
+Requirements:
+================================================================================
+
+1. Python >= 3.0
+2. Automake >= 1.11
diff --git a/testenv/Test--convert-links--content-on-error.py b/testenv/Test--convert-links--content-on-error.py
new file mode 100755
index 0000000..37fcc47
--- /dev/null
+++ b/testenv/Test--convert-links--content-on-error.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget link conversion works also on HTTP error pages.
+"""
+############# File Definitions ###############################################
+a_x_FileContent = """
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title></title>
+</head>
+<body>
+ <a href="/b/y.html"></a>
+</body>
+</html>
+"""
+a_x_LocalFileContent = """
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title></title>
+</head>
+<body>
+ <a href="../b/y.html"></a>
+</body>
+</html>
+"""
+
+error_FileContent = '404 page content'
+error_FileRules = {
+ 'Response': 404 ,
+ 'SendHeader': {
+ 'Content-Length': len(error_FileContent),
+ 'Content-Type': 'text/plain',
+ }
+}
+
+a_x_File = WgetFile ("a/x.html", a_x_FileContent)
+robots_File = WgetFile ("robots.txt", '')
+error_File = WgetFile ("b/y.html", error_FileContent, rules=error_FileRules)
+
+B_File = WgetFile ("a/x.html", a_x_LocalFileContent)
+
+WGET_OPTIONS = "--no-host-directories -r -l2 --convert-links --content-on-error"
+WGET_URLS = [["a/x.html"]]
+
+Files = [[a_x_File, robots_File, error_File]]
+
+ExpectedReturnCode = 8
+ExpectedDownloadedFiles = [B_File, robots_File, error_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test--https-crl.py b/testenv/Test--https-crl.py
new file mode 100755
index 0000000..6c7002e
--- /dev/null
+++ b/testenv/Test--https-crl.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+CRLFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'server-crl.pem'))
+WGET_OPTIONS = "--crl-file " + CRLFILE + " --ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 5
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test--https.py b/testenv/Test--https.py
new file mode 100755
index 0000000..d9431a3
--- /dev/null
+++ b/testenv/Test--https.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+C_File = WgetFile ("File3", File3)
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+WGET_OPTIONS = "--ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+Existing_Files = [C_File]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test--rejected-log.py b/testenv/Test--rejected-log.py
new file mode 100755
index 0000000..fb4f9f4
--- /dev/null
+++ b/testenv/Test--rejected-log.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test executed Wget in recursive mode with a rejected log outputted.
+"""
+############# File Definitions ###############################################
+mainpage = """
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Recurse to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ </p>
+</body>
+</html>
+"""
+
+secondpage = """
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Recurse to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Try the blacklisted <a href="http://localhost:{{port}}/index.html">main page</a>.
+ </p>
+</body>
+</html>
+"""
+
+thirdpage = """
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Try a hidden <a href="http://localhost:{{port}}/dummy.txt">dummy file</a>.
+ Try to leave to <a href="http://no.such.domain/">another domain</a>.
+ </p>
+</body>
+</html>
+"""
+
+robots = """
+User-agent: *
+Disallow: /dummy.txt
+"""
+
+log = """\
+REASON\tU_URL\tU_SCHEME\tU_HOST\tU_PORT\tU_PATH\tU_PARAMS\tU_QUERY\tU_FRAGMENT\tP_URL\tP_SCHEME\tP_HOST\tP_PORT\tP_PATH\tP_PARAMS\tP_QUERY\tP_FRAGMENT
+BLACKLIST\thttp%3A//localhost%3A{{port}}/index.html\tSCHEME_HTTP\tlocalhost\t{{port}}\tindex.html\t\t\t\thttp%3A//localhost%3A{{port}}/secondpage.html\tSCHEME_HTTP\tlocalhost\t{{port}}\tsecondpage.html\t\t\t
+ROBOTS\thttp%3A//localhost%3A{{port}}/dummy.txt\tSCHEME_HTTP\tlocalhost\t{{port}}\tdummy.txt\t\t\t\thttp%3A//localhost%3A{{port}}/thirdpage.html\tSCHEME_HTTP\tlocalhost\t{{port}}\tthirdpage.html\t\t\t
+SPANNEDHOST\thttp%3A//no.such.domain/\tSCHEME_HTTP\tno.such.domain\t80\t\t\t\t\thttp%3A//localhost%3A{{port}}/thirdpage.html\tSCHEME_HTTP\tlocalhost\t{{port}}\tthirdpage.html\t\t\t
+"""
+
+dummyfile = "Don't care."
+
+
+index_html = WgetFile ("index.html", mainpage)
+secondpage_html = WgetFile ("secondpage.html", secondpage)
+thirdpage_html = WgetFile ("thirdpage.html", thirdpage)
+robots_txt = WgetFile ("robots.txt", robots)
+dummy_txt = WgetFile ("dummy.txt", dummyfile)
+log_csv = WgetFile ("log.csv", log)
+
+WGET_OPTIONS = "-nd -r --rejected-log log.csv"
+WGET_URLS = [["index.html"]]
+
+Files = [[index_html, secondpage_html, thirdpage_html, robots_txt, dummy_txt]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [index_html, secondpage_html, thirdpage_html, robots_txt, log_csv]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test--spider-r.py b/testenv/Test--spider-r.py
new file mode 100755
index 0000000..8d8c6f7
--- /dev/null
+++ b/testenv/Test--spider-r.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test executed Wget in Spider mode with recursive retrieval.
+"""
+############# File Definitions ###############################################
+mainpage = """
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+"""
+
+
+secondpage = """
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+"""
+
+thirdpage = """
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/dummy.txt">text file</a>.
+ Also, another <a href="http://localhost:{{port}}/againnonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+"""
+
+dummyfile = "Don't care."
+
+
+index_html = WgetFile ("index.html", mainpage)
+secondpage_html = WgetFile ("secondpage.html", secondpage)
+thirdpage_html = WgetFile ("thirdpage.html", thirdpage)
+dummy_txt = WgetFile ("dummy.txt", dummyfile)
+
+Request_List = [
+ [
+ "HEAD /",
+ "GET /",
+ "GET /robots.txt",
+ "HEAD /secondpage.html",
+ "GET /secondpage.html",
+ "HEAD /nonexistent",
+ "HEAD /thirdpage.html",
+ "GET /thirdpage.html",
+ "HEAD /dummy.txt",
+ "HEAD /againnonexistent"
+ ]
+]
+
+WGET_OPTIONS = "--spider -r"
+WGET_URLS = [[""]]
+
+Files = [[index_html, secondpage_html, thirdpage_html, dummy_txt]]
+
+ExpectedReturnCode = 8
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : Request_List
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-416.py b/testenv/Test-416.py
new file mode 100755
index 0000000..76b9421
--- /dev/null
+++ b/testenv/Test-416.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ Ensure that Wget behaves well when the server responds with a HTTP 416
+ status code. This test checks both cases:
+ 1. Server sends no body
+ 2. Server sends a body
+"""
+############# File Definitions ###############################################
+File1 = "abababababababababababababababababababababababababababababababababab"
+File2 = "ababababababababababababababababababab"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File1", File1)
+
+C_File = WgetFile ("File2", File2)
+D_File = WgetFile ("File2", File1)
+
+E_File = WgetFile ("File3", File1)
+
+WGET_OPTIONS = "-c"
+WGET_URLS = [["File1", "File2", "File3"]]
+
+Files = [[A_File, C_File, E_File]]
+Existing_Files = [B_File, D_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [B_File, D_File, E_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-504.py b/testenv/Test-504.py
new file mode 100755
index 0000000..036f85d
--- /dev/null
+++ b/testenv/Test-504.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget handles a 504 Gateway Timeout response
+ correctly.
+ Since, we do not have a direct mechanism for conditionally sending responses
+ via the HTTP Server, I've used a workaround.
+ The server will always respond to a request for File1 with a 504 Gateway
+ Timeout. Using the --tries=2 option, we ensure that Wget attempts the file
+ only twice and then move on to the next file. Finally, check the exact
+ requests that the Server received and compare them, in order, to the
+ expected sequence of requests.
+
+ In this case, we expect Wget to attempt File1 twice and File2 once. If Wget
+ considered 504 as a general Server Error, it would be a fatal failure and
+ Wget would request File1 only once.
+"""
+############# File Definitions ###############################################
+File1 = """All happy families are alike;
+Each unhappy family is unhappy in its own way"""
+File2 = "Anyone for chocochip cookies?"
+
+File1_rules = {
+ "Response" : 504
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2)
+
+Request_List = [
+ [
+ "GET /File1",
+ "GET /File1",
+ "GET /File2",
+ ]
+]
+
+
+WGET_OPTIONS = "--tries=2"
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 4
+ExpectedDownloadedFiles = [B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : Request_List
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-Content-disposition-2.py b/testenv/Test-Content-disposition-2.py
new file mode 100755
index 0000000..debd833
--- /dev/null
+++ b/testenv/Test-Content-disposition-2.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget parses the Content-Disposition header
+ correctly and creates the appropriate file when the said filename exists.
+"""
+############# File Definitions ###############################################
+File1 = "Teapot"
+File2 = "The Teapot Protocol"
+
+# use upper case 'I' to provoke Wget failure with turkish locale
+File2_rules = {
+ "SendHeader" : {
+ "Content-DIsposition" : "Attachment; FILENAME=HTTP.Teapot"
+ }
+}
+A_File = WgetFile ("HTTP.Teapot", File1)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = "--content-disposition"
+WGET_URLS = [["File2"]]
+
+Files = [[B_File]]
+Existing_Files = [A_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [WgetFile ("HTTP.Teapot.1", File2), A_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-Content-disposition.py b/testenv/Test-Content-disposition.py
new file mode 100755
index 0000000..3ee7be8
--- /dev/null
+++ b/testenv/Test-Content-disposition.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget parses the Content-Disposition header
+ correctly and creates a local file accordingly.
+"""
+############# File Definitions ###############################################
+File1 = """All that is gold does not glitter,
+ Not all those who wander are lost;
+ The old that is strong does not wither,
+ Deep roots are not reached by the frost.
+ From the ashes a fire shall be woken,
+ A light from the shadows shall spring;
+ Renewed shall be blade that was broken,
+ The crownless again shall be king."""
+
+File1_rules = {
+ "SendHeader" : {
+ "Content-Disposition" : "Attachment; filename=JRR.Tolkien"
+ }
+}
+A_File = WgetFile ("LOTR", File1, rules=File1_rules)
+
+WGET_OPTIONS = "--content-disposition"
+WGET_URLS = [["LOTR"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [WgetFile ("JRR.Tolkien", File1)]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-Head.py b/testenv/Test-Head.py
new file mode 100755
index 0000000..b653b2d
--- /dev/null
+++ b/testenv/Test-Head.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget correctly handles responses to HEAD requests
+ and does not actually download any data
+"""
+############# File Definitions ###############################################
+File1 = "You shall not pass!"
+
+A_File = WgetFile ("File1", File1)
+
+WGET_OPTIONS = "--method=HEAD"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-O.py b/testenv/Test-O.py
new file mode 100755
index 0000000..f93e118
--- /dev/null
+++ b/testenv/Test-O.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget correctly handles the -O command for output
+ filenames.
+"""
+############# File Definitions ###############################################
+File1 = "Test Contents."
+
+A_File = WgetFile ("File1", File1)
+
+WGET_OPTIONS = "-O NewFile.txt"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+ExistingFiles = [A_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [WgetFile ("NewFile.txt", File1)]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-Post.py b/testenv/Test-Post.py
new file mode 100755
index 0000000..b2fa7d7
--- /dev/null
+++ b/testenv/Test-Post.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ Simple test for HTTP POST Requests usiong the --method command
+"""
+############# File Definitions ###############################################
+File1 = """A reader lives a thousand lives before he dies, said Jojen.
+The man who never reads lives only one"""
+
+File1_response = """A reader lives a thousand lives before he dies, said Jojen.
+The man who never reads lives only one
+TestMessage"""
+
+A_File = WgetFile ("File1", File1)
+
+WGET_OPTIONS = "--method=post --body-data=TestMessage"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [WgetFile ("File1", File1_response)]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic-fail.py b/testenv/Test-auth-basic-fail.py
new file mode 100755
index 0000000..7b4a223
--- /dev/null
+++ b/testenv/Test-auth-basic-fail.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget returns the correct exit code when Basic
+ authentication fails due to a username/password error.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : "Sauron",
+ "Pass" : "TheEye"
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+
+WGET_OPTIONS = "--user=Sauron --password=Eye"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 6
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic-netrc-pass-given.py b/testenv/Test-auth-basic-netrc-pass-given.py
new file mode 100755
index 0000000..b8bff59
--- /dev/null
+++ b/testenv/Test-auth-basic-netrc-pass-given.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget uses credentials from .netrc for Basic Authorization Negotiation.
+ In this case we test that .netrc credentials are used in case only
+ password is given on the command line.
+ Also, we ensure that Wget saves the host after a successful auth and
+ doesn't wait for a challenge the second time.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+File2 = "I too am an invisible man."
+
+User = "Sauron"
+Password = "TheEye"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : User,
+ "Pass" : Password
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+
+Netrc = "machine localhost\n\tlogin {0}".format(User)
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+Netrc_File = WgetFile (".netrc", Netrc)
+
+WGET_OPTIONS = "--password={0}".format(Password)
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+LocalFiles = [Netrc_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, Netrc_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : LocalFiles
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic-netrc-user-given.py b/testenv/Test-auth-basic-netrc-user-given.py
new file mode 100755
index 0000000..e5d1449
--- /dev/null
+++ b/testenv/Test-auth-basic-netrc-user-given.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget uses credentials from .netrc for Basic Authorization Negotiation.
+ In this case we test that .netrc credentials are used in case only
+ user login is given on the command line.
+ Also, we ensure that Wget saves the host after a successful auth and
+ doesn't wait for a challenge the second time.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+File2 = "I too am an invisible man."
+
+User = "Sauron"
+Password = "TheEye"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : User,
+ "Pass" : Password
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+
+Netrc = "machine localhost\n\tlogin {0}\n\tpassword {1}".format(User, Password)
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+Netrc_File = WgetFile (".netrc", Netrc)
+
+WGET_OPTIONS = "--user={0}".format(User)
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+LocalFiles = [Netrc_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, Netrc_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : LocalFiles
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic-netrc.py b/testenv/Test-auth-basic-netrc.py
new file mode 100755
index 0000000..f670603
--- /dev/null
+++ b/testenv/Test-auth-basic-netrc.py
@@ -0,0 +1,66 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget uses credentials from .netrc for Basic Authorization Negotiation.
+ In this case we test that .netrc credentials are used in case no user
+ login and no password is given on the command line.
+ Also, we ensure that Wget saves the host after a successful auth and
+ doesn't wait for a challenge the second time.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+File2 = "I too am an invisible man."
+
+User = "Sauron"
+Password = "TheEye"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : User,
+ "Pass" : Password
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+
+Netrc = "machine localhost\n\tlogin {0}\n\tpassword {1}".format(User, Password)
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+Netrc_File = WgetFile (".netrc", Netrc)
+
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+LocalFiles = [Netrc_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, Netrc_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : LocalFiles
+}
+test_options = {
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic-no-netrc-fail.py b/testenv/Test-auth-basic-no-netrc-fail.py
new file mode 100755
index 0000000..1c3a405
--- /dev/null
+++ b/testenv/Test-auth-basic-no-netrc-fail.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget will not use credentials from .netrc
+ when --no-netrc option is specified and Basic authentication is required
+ and fails.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+
+User = "Sauron"
+Password = "TheEye"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : User,
+ "Pass" : Password
+ }
+}
+
+Netrc = "machine 127.0.0.1\n\tlogin {0}\n\tpassword {1}".format(User, Password)
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+Netrc_File = WgetFile (".netrc", Netrc)
+
+WGET_OPTIONS = "--no-netrc"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+LocalFiles = [Netrc_File]
+
+ExpectedReturnCode = 6
+ExpectedDownloadedFiles = [Netrc_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : LocalFiles
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-basic.py b/testenv/Test-auth-basic.py
new file mode 100755
index 0000000..4f60c30
--- /dev/null
+++ b/testenv/Test-auth-basic.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget's Basic Authorization Negotiation.
+ Also, we ensure that Wget saves the host after a successful auth and
+ doesn't wait for a challenge the second time.
+"""
+############# File Definitions ###############################################
+File1 = "I am an invisible man."
+File2 = "I too am an invisible man."
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : "Sauron",
+ "Pass" : "TheEye"
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = "--user=Sauron --password=TheEye"
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-both.py b/testenv/Test-auth-both.py
new file mode 100755
index 0000000..6e5d712
--- /dev/null
+++ b/testenv/Test-auth-both.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget's Basic Authorization Negotiation.
+ Also, we ensure that Wget saves the host after a successful auth and
+ doesn't wait for a challenge the second time.
+"""
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Both",
+ "User" : "Sauron",
+ "Pass" : "TheEye",
+ "Parm" : {
+ "qop" : "auth"
+ }
+ },
+ "RejectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+File2_rules = {
+ "Authentication" : {
+ "Type" : "Both_inline",
+ "User" : "Sauron",
+ "Pass" : "TheEye",
+ "Parm" : {
+ "qop" : "auth"
+ }
+ },
+ "RejectHeader" : {
+ "Authorization" : "Basic U2F1cm9uOlRoZUV5ZQ=="
+ }
+}
+File3_rules = {
+ "Authentication" : {
+ "Type" : "Digest",
+ "User" : "Sauron",
+ "Pass" : "TheEye",
+ "Parm" : {
+ "qop" : "auth"
+ }
+
+ }
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+C_File = WgetFile ("File3", File3, rules=File3_rules)
+
+WGET_OPTIONS = "--user=Sauron --password=TheEye"
+WGET_URLS = [["File1", "File2", "File3"]]
+
+Files = [[A_File, B_File, C_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-digest.py b/testenv/Test-auth-digest.py
new file mode 100755
index 0000000..a5e624f
--- /dev/null
+++ b/testenv/Test-auth-digest.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget's Digest Authorization Negotiation.
+"""
+############# File Definitions ###############################################
+File1 = "Need a cookie?"
+File2 = "Want cookies with milk!"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Digest",
+ "User" : "Pacman",
+ "Pass" : "Omnomnom",
+ "Parm" : {
+ "qop" : "auth"
+ }
+ }
+}
+
+File2_rules = {
+ "Authentication" : {
+ "Type" : "Digest",
+ "User" : "Pacman",
+ "Pass" : "Omnomnom",
+ "Parm" : {
+ "qop" : None
+ }
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = "--user=Pacman --password=Omnomnom"
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-no-challenge-url.py b/testenv/Test-auth-no-challenge-url.py
new file mode 100755
index 0000000..6025232
--- /dev/null
+++ b/testenv/Test-auth-no-challenge-url.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget's Basic Authorization Negotiation, when credentials
+ are provided in-URL
+"""
+############# File Definitions ###############################################
+File1 = "Need a cookie?"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : "Pacman",
+ "Pass" : "Omnomnom"
+ },
+ "ExpectHeader" : {
+ "Authorization" : "Basic UGFjbWFuOk9tbm9tbm9t"
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+
+WGET_OPTIONS = "--auth-no-challenge http://Pacman:Omnomnom@localhost:{{port}}/File1"
+WGET_URLS = [[]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-no-challenge.py b/testenv/Test-auth-no-challenge.py
new file mode 100755
index 0000000..2022ac8
--- /dev/null
+++ b/testenv/Test-auth-no-challenge.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures Wget's Basic Authorization Negotiation, when the
+ --auth-no-challenge command is used.
+"""
+############# File Definitions ###############################################
+File1 = "Need a cookie?"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : "Pacman",
+ "Pass" : "Omnomnom"
+ },
+ "ExpectHeader" : {
+ "Authorization" : "Basic UGFjbWFuOk9tbm9tbm9t"
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+
+WGET_OPTIONS = "--auth-no-challenge --user=Pacman --password=Omnomnom"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-retcode.py b/testenv/Test-auth-retcode.py
new file mode 100755
index 0000000..6414b5b
--- /dev/null
+++ b/testenv/Test-auth-retcode.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget returns the correct return code when sent
+ a 403 Forbidden by the Server.
+"""
+
+
+############# File Definitions ###############################################
+File1 = "Apples and Oranges? Really?"
+
+File1_rules = {
+ "Response" : 403
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 8
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-auth-with-content-disposition.py b/testenv/Test-auth-with-content-disposition.py
new file mode 100755
index 0000000..074b093
--- /dev/null
+++ b/testenv/Test-auth-with-content-disposition.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget handles Content-Disposition correctly when
+ coupled with Authentication
+"""
+############# File Definitions ###############################################
+File1 = "Need a cookie?"
+
+File1_rules = {
+ "Authentication" : {
+ "Type" : "Basic",
+ "User" : "Pacman",
+ "Pass" : "Omnomnom"
+ },
+ "SendHeader" : {
+ "Content-Disposition" : "Attachment; filename=Arch"
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+
+WGET_OPTIONS = "--user=Pacman --password=Omnomnom --content-disposition"
+WGET_URLS = [["File1"]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [WgetFile ("Arch", File1)]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-c-full.py b/testenv/Test-c-full.py
new file mode 100755
index 0000000..ada3c04
--- /dev/null
+++ b/testenv/Test-c-full.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ Test Wget's response when the file requested already exists on disk with
+ a filesize greater than or equal to the requested file.
+"""
+############# File Definitions ###############################################
+File1 = "abababababababababababababababababababababababababababababababababab"
+File2 = "ababababababababababababababababababab"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File1", File1)
+
+C_File = WgetFile ("File2", File1)
+D_File = WgetFile ("File2", File2)
+
+E_File = WgetFile ("File3", File1)
+
+WGET_OPTIONS = "-c"
+WGET_URLS = [["File1", "File2", "File3"]]
+
+Files = [[A_File, C_File, E_File]]
+Existing_Files = [B_File, D_File]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, C_File, E_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-condget.py b/testenv/Test-condget.py
new file mode 100755
index 0000000..a192f92
--- /dev/null
+++ b/testenv/Test-condget.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ Simple test for HTTP Conditional-GET Requests using the -N command
+"""
+############# File Definitions ###############################################
+# Keep same length !
+Cont1 = """THIS IS 1 FILE"""
+Cont2 = """THIS IS 2 FILE"""
+Cont3 = """THIS IS 3 FILE"""
+Cont4 = """THIS IS 4 FILE"""
+
+# Local Wget files
+
+# These have same timestamp as remote files
+UpToDate_Local_File1 = WgetFile ("UpToDateFile1", Cont1, timestamp="1995-01-01 00:00:00")
+UpToDate_Local_File2 = WgetFile ("UpToDateFile2", Cont1, timestamp="1995-01-01 00:00:00")
+UpToDate_Local_File3 = WgetFile ("UpToDateFile3", Cont1, timestamp="1995-01-01 00:00:00")
+
+# This is newer than remote (expected same behaviour as for above files)
+Newer_Local_File = WgetFile ("NewerFile", Cont1, timestamp="1995-02-02 02:02:02")
+
+# This is older than remote - should be clobbered
+Outdated_Local_File = WgetFile ("UpdatedFile", Cont2, timestamp="1990-01-01 00:00:00")
+
+UpToDate_Rules1 = {
+ "SendHeader" : {
+ # RFC1123 format
+ "Last-Modified" : "Sun, 01 Jan 1995 00:00:00 GMT",
+ },
+ "Response": 304,
+ "ExpectHeader" : {
+ "If-Modified-Since" : "Sun, 01 Jan 1995 00:00:00 GMT"
+ },
+}
+
+UpToDate_Rules2 = {
+ "SendHeader" : {
+ # RFC850 format
+ "Last-Modified" : "Sunday, 01-Jan-95 00:00:00 GMT",
+ },
+ "Response": 304,
+ "ExpectHeader" : {
+ "If-Modified-Since" : "Sun, 01 Jan 1995 00:00:00 GMT"
+ },
+}
+
+UpToDate_Rules3 = {
+ "SendHeader" : {
+ # Asctime format
+ "Last-Modified" : "Sun Jan 01 00:00:00 1995",
+ },
+ "Response": 304,
+ "ExpectHeader" : {
+ "If-Modified-Since" : "Sun, 01 Jan 1995 00:00:00 GMT"
+ },
+}
+
+Newer_Rules = {
+ "SendHeader" : {
+ # Asctime format
+ "Last-Modified" : "Sun Jan 01 00:00:00 1995",
+ },
+ "Response": 304,
+ "ExpectHeader" : {
+ "If-Modified-Since" : "Thu, 02 Feb 1995 02:02:02 GMT"
+ },
+}
+
+Outdated_Rules = {
+ "SendHeader" : {
+ # RFC850 format
+ "Last-Modified" : "Thursday, 01-Jan-15 00:00:00 GMT",
+ },
+ "ExpectHeader" : {
+ "If-Modified-Since" : "Mon, 01 Jan 1990 00:00:00 GMT",
+ },
+}
+
+UpToDate_Server_File1 = WgetFile ("UpToDateFile1", Cont3, rules=UpToDate_Rules1)
+UpToDate_Server_File2 = WgetFile ("UpToDateFile2", Cont3, rules=UpToDate_Rules2)
+UpToDate_Server_File3 = WgetFile ("UpToDateFile3", Cont3, rules=UpToDate_Rules3)
+Newer_Server_File = WgetFile ("NewerFile", Cont3, rules=Newer_Rules)
+Updated_Server_File = WgetFile ("UpdatedFile", Cont4, rules=Outdated_Rules)
+
+WGET_OPTIONS = "-N"
+WGET_URLS = [["UpToDateFile1", "UpToDateFile2", "UpToDateFile3", "NewerFile",
+ "UpdatedFile", ]]
+
+Files = [[UpToDate_Server_File1, UpToDate_Server_File2, UpToDate_Server_File3,
+ Newer_Server_File, Updated_Server_File, ]]
+
+Existing_Files = [UpToDate_Local_File1, UpToDate_Local_File2,
+ UpToDate_Local_File3, Newer_Local_File, Outdated_Local_File]
+
+ExpectedReturnCode = 0
+
+# The up-to-date file should not be downloaded
+ExpectedDownloadedFiles = [UpToDate_Local_File1, UpToDate_Local_File2,
+ UpToDate_Local_File3, Newer_Local_File,
+ Updated_Server_File]
+
+# Kind of hack to ensure proper request types
+Request_List = [
+ [
+ "GET /UpToDateFile1",
+ "GET /UpToDateFile2",
+ "GET /UpToDateFile3",
+ "GET /NewerFile",
+ "GET /UpdatedFile",
+ ]
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : Request_List,
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-cookie-401.py b/testenv/Test-cookie-401.py
new file mode 100755
index 0000000..b6ad5b8
--- /dev/null
+++ b/testenv/Test-cookie-401.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget stores the cookie even in the event of a
+ 401 Unauthorized Response
+"""
+############# File Definitions ###############################################
+File1 = """All happy families are alike;
+Each unhappy family is unhappy in its own way"""
+File2 = "Anyone for chocochip cookies?"
+
+File1_rules = {
+ "SendHeader" : {
+ "Set-Cookie" : "sess-id=0213; path=/"
+ },
+ "Response" : 401
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Cookie" : "sess-id=0213"
+ },
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 6
+ExpectedDownloadedFiles = [B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-cookie-domain-mismatch.py b/testenv/Test-cookie-domain-mismatch.py
new file mode 100755
index 0000000..06a9b69
--- /dev/null
+++ b/testenv/Test-cookie-domain-mismatch.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget identifies bad servers trying to set cookies
+ for a different domain and rejects them.
+"""
+############# File Definitions ###############################################
+File1 = "Would you care for a cup of coffee?"
+File2 = "Anyone for chocochip cookies?"
+
+File1_rules = {
+ "SendHeader" : {
+ # use upper case 'I' to provoke Wget failure with turkish locale
+ "Set-Cookie" : "sess-id=0213; path=/; DoMAIn=.example.com"
+ }
+}
+File2_rules = {
+ "RejectHeader" : {
+ "Cookie" : "sess-id=0213"
+ }
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-cookie-expires.py b/testenv/Test-cookie-expires.py
new file mode 100755
index 0000000..16fb980
--- /dev/null
+++ b/testenv/Test-cookie-expires.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget handles Cookie expiry dates correctly.
+ Simultaneuously, we also check if multiple cookies to the same domain
+ are handled correctly
+"""
+############# File Definitions ###############################################
+File1 = "Hello World!"
+File2 = "'Ello! This is Amazing!"
+File3 = "So what are we looking at?"
+File4 = "This was downloaded"
+
+File1_rules = {
+ "SendHeader" : {
+ "Set-Cookie" : "sess-id=0213; path=/"
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Cookie" : "sess-id=0213"
+ },
+ "SendHeader" : {
+ "Set-Cookie" : "new-sess=N"
+ }
+}
+File3_rules = {
+ "SendHeader" : {
+ # use upper case 'I' to provoke Wget failure with turkish locale
+ "Set-Cookie" : "sess-id=0213; path=/; ExPIRes=Sun, 06 Nov 2001 12:32:43 GMT"
+ },
+ "ExpectHeader" : {
+ "Cookie" : "new-sess=N; sess-id=0213"
+ }
+}
+File4_rules = {
+ "RejectHeader" : {
+ "Cookie" : "sess-id=0213"
+ },
+ "ExpectHeader" : {
+ "Cookie" : "new-sess=N"
+ }
+}
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+C_File = WgetFile ("File3", File3, rules=File3_rules)
+D_File = WgetFile ("File4", File4, rules=File4_rules)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1", "File2", "File3", "File4"]]
+
+Files = [[A_File, B_File, C_File, D_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File, D_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-cookie.py b/testenv/Test-cookie.py
new file mode 100755
index 0000000..ba6c055
--- /dev/null
+++ b/testenv/Test-cookie.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures that Wget's cookie jar support works correctly.
+"""
+############# File Definitions ###############################################
+File1 = """All happy families are alike;
+Each unhappy family is unhappy in its own way"""
+File2 = "Anyone for chocochip cookies?"
+
+File1_rules = {
+ "SendHeader" : {
+ "Set-Cookie" : "sess-id=0213; path=/"
+ }
+}
+File2_rules = {
+ "ExpectHeader" : {
+ "Cookie" : "sess-id=0213"
+ }
+}
+
+A_File = WgetFile ("File1", File1, rules=File1_rules)
+B_File = WgetFile ("File2", File2, rules=File2_rules)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-hsts.py b/testenv/Test-hsts.py
new file mode 100755
index 0000000..19bd4c4
--- /dev/null
+++ b/testenv/Test-hsts.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import time
+import os
+
+"""
+This test makes sure Wget can parse a given HSTS database and apply the indicated HSTS policy.
+"""
+
+print (os.getenv('SSL_TESTS'))
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+def hsts_database_path():
+ hsts_file = ".wget-hsts-testenv"
+ return os.path.abspath(hsts_file)
+
+def create_hsts_database(path, host, port):
+ # we want the current time as an integer,
+ # not as a floating point
+ curtime = int(time.time())
+ max_age = "123456"
+
+ f = open(path, "w")
+
+ f.write("# dummy comment\n")
+ f.write(host + "\t" + str(port) + "\t0\t" + str(curtime) + "\t" + max_age + "\n")
+ f.close()
+
+File_Name = "hw"
+File_Content = "Hello, world!"
+File = WgetFile(File_Name, File_Content)
+
+Hsts_File_Path = hsts_database_path()
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+
+WGET_OPTIONS = "--hsts-file=" + Hsts_File_Path + " --ca-certificate=" + CAFILE
+WGET_URLS = [[File_Name]]
+
+Files = [[File]]
+Servers = [HTTPS]
+Requests = ["http"]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [File]
+
+pre_test = {
+ "ServerFiles" : Files,
+ "Domains" : ["localhost"]
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetCode" : ExpectedReturnCode,
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+
+test = HTTPTest(
+ pre_hook = pre_test,
+ post_hook = post_test,
+ test_params = test_options,
+ protocols = Servers,
+ req_protocols = Requests
+)
+
+# start the web server and create the temporary HSTS database
+test.setup()
+create_hsts_database(Hsts_File_Path, 'localhost', test.port)
+
+err = test.begin()
+
+# remove the temporary HSTS database
+os.unlink(hsts_database_path())
+exit(err)
diff --git a/testenv/Test-metalink-http-baddigest.py b/testenv/Test-metalink-http-baddigest.py
new file mode 100755
index 0000000..2496da7
--- /dev/null
+++ b/testenv/Test-metalink-http-baddigest.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with a malformed base64 Digest header.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+bad_sha256 = b64encode (hashlib.sha256 (bad.encode ('UTF-8')).digest ()).decode ('ascii')
+
+LinkHeaders = ["<http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file>; rel=duplicate; pri=1"]
+DigestHeader = "SHA-256=bad_base64,SHA-256={{BAD_HASH}}"
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+
+wrong_file = WgetFile ("wrong_file", bad)
+wrong_file_down = WgetFile ("main.metalink", bad)
+
+WGET_OPTIONS = "--metalink-over-http"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /wrong_file"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [wrong_file_down]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+DigestHeader = DigestHeader.replace('{{BAD_HASH}}', bad_sha256)
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port):
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+MetaHTTPRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port)
+ for LinkHeader in LinkHeaders ],
+ 'Digest': DigestHeader
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-quoted.py b/testenv/Test-metalink-http-quoted.py
new file mode 100755
index 0000000..af2c445
--- /dev/null
+++ b/testenv/Test-metalink-http-quoted.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP quoted values support in Wget.
+"""
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port, digest):
+ text = text.replace('{{FILE1_HASH}}', digest)
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File1_corrupted = "Would you like some Coffee?"
+File1_lowPref = "Do not take this"
+File1_sha256 = b64encode (hashlib.sha256 (File1.encode ('UTF-8')).digest ()).decode ('ascii')
+Signature = '''-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+This is no valid signature. But it should be downloaded.
+The attempt to verify should fail but should not prevent
+a successful metalink resource retrieval (the sig failure
+should not be fatal).
+-----END PGP SIGNATURE-----
+'''
+File2 = "No meta data for this file."
+
+LinkHeaders = [
+ # This file has low priority and should not be picked.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref>; rel=\"duplicate\"; pri=\"9\"; geo=\"pl\"",
+ # This file should be picked second, after hash failure.
+ "<http://0.0.0.0/File1_try2_badconnection>; rel =\"duplicate\";pref; pri=\"7\"",
+ # This signature download will fail.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig2.asc>; rel=\"describedby\"; type=\"application/pgp-signature\"",
+ # Two good signatures
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig.asc>; rel=\"describedby\"; type=\"application/pgp-signature\"",
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig.asc>; rel=\"describedby\"; type=\"application/pgp-signature\"",
+ # Bad URL scheme
+ "<invalid_url>; rel=\"duplicate\"; pri=\"4\"",
+ # rel missing
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1>; pri=\"1\"; pref",
+ # invalid rel
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1>; rel=\"strange\"; pri=\"4\"",
+ # This file should be picked first, because it has the lowest pri among preferred.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_try1_corrupted>; rel=\"duplicate\"; geo=\"su\"; pri=\"4\"; pref",
+ # This file should NOT be picked third due to preferred location set to 'uk'
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_badgeo>; rel =\"duplicate\";pri=\"5\"",
+ # This file should be picked as third try, and it should succeed
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_try3_ok>; rel=\'duplicate\'; pri=\"5\";geo=\"uk\""
+ ]
+DigestHeader = "SHA-256=\'{{FILE1_HASH}}\'"
+
+# This will be filled as soon as we know server hostname and port
+MetaFileRules = {'SendHeader' : {}}
+
+FileOkServer = WgetFile ("File1_try3_ok", File1)
+FileBadPref = WgetFile ("File1_lowPref", File1_lowPref)
+FileBadHash = WgetFile ("File1_try1_corrupted", File1_corrupted)
+MetaFile = WgetFile ("test.meta", rules=MetaFileRules)
+# In case of Metalink over HTTP, the local file name is
+# derived from the URL suffix.
+FileOkLocal = WgetFile ("test.meta", File1)
+SigFile = WgetFile ("Sig.asc", Signature)
+FileNoMeta = WgetFile ("File2", File2)
+
+WGET_OPTIONS = "--metalink-over-http --preferred-location=uk"
+WGET_URLS = [["test.meta", "File2"]]
+
+Files = [[FileOkServer, FileBadPref, FileBadHash, MetaFile, SigFile, FileNoMeta]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [FileNoMeta, FileOkLocal]
+
+RequestList = [
+ [
+ "HEAD /test.meta",
+ "GET /Sig2.asc",
+ "GET /Sig.asc",
+ "GET /File1_try1_corrupted",
+ "GET /File1_try3_ok",
+ "HEAD /File2",
+ "GET /File2",
+ ]
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList,
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+)
+
+http_test.server_setup()
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaFileRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port, File1_sha256)
+ for LinkHeader in LinkHeaders ],
+ 'Digest': SubstituteServerInfo (DigestHeader, srv_host, srv_port, File1_sha256),
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-trust-name.py b/testenv/Test-metalink-http-xml-trust-name.py
new file mode 100755
index 0000000..7dae50e
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-trust-name.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Metalink/XML Link headers.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+bad_sha256 = hashlib.sha256 (bad.encode ('UTF-8')).hexdigest ()
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml1 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+MetaXml2 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="bad">
+ <verification>
+ <hash type="sha256">{{BAD_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/bad</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+LinkHeaders = [
+ # This file has the lowest priority, and should go last
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test1.metalink>; rel=describedby; pri=2; type=\"application/metalink4+xml\"; name=\"newname.metalink\"",
+ # This file has the highest priority, and should go first
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test2.metalink>; rel=describedby; pri=1; type=\"application/metalink4+xml\""
+]
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("dir/File1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("dir/File2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("dir/File4", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("dir/File5", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+MetaFile1 = WgetFile ("test1.metalink", MetaXml1)
+MetaFile1_down = WgetFile ("newname.metalink", MetaXml1)
+
+MetaFile2 = WgetFile ("test2.metalink", MetaXml2)
+
+WGET_OPTIONS = "--trust-server-names --metalink-over-http --metalink-index=2"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /test1.metalink",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ MetaFile1, MetaFile2,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaFile1_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml1 = MetaXml1.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml1 = MetaXml1.replace('{{SRV_HOST}}', srv_host)
+MetaXml1 = MetaXml1.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile1.content = MetaXml1
+MetaFile1_down.content = MetaXml1
+
+MetaXml2 = MetaXml2.replace('{{BAD_HASH}}', bad_sha256)
+MetaXml2 = MetaXml2.replace('{{SRV_HOST}}', srv_host)
+MetaXml2 = MetaXml2.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile2.content = MetaXml2
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port):
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+MetaHTTPRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port)
+ for LinkHeader in LinkHeaders ]
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-trust.py b/testenv/Test-metalink-http-xml-trust.py
new file mode 100755
index 0000000..1df6ce4
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-trust.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Metalink/XML Link headers.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+bad_sha256 = hashlib.sha256 (bad.encode ('UTF-8')).hexdigest ()
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml1 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+MetaXml2 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="bad">
+ <verification>
+ <hash type="sha256">{{BAD_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/bad</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+LinkHeaders = [
+ # This file has the lowest priority, and should go last
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test1.metalink>; rel=describedby; pri=2; type=\"application/metalink4+xml\"",
+ # This file has the highest priority, and should go first
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test2.metalink>; rel=describedby; pri=1; type=\"application/metalink4+xml\""
+]
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("dir/File1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("dir/File2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("dir/File4", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("dir/File5", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+MetaFile1 = WgetFile ("test1.metalink", MetaXml1)
+MetaFile1_down = WgetFile ("test1.metalink", MetaXml1)
+
+MetaFile2 = WgetFile ("test2.metalink", MetaXml2)
+
+WGET_OPTIONS = "--trust-server-names --metalink-over-http --metalink-index=2"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /test1.metalink",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ MetaFile1, MetaFile2,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaFile1_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml1 = MetaXml1.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml1 = MetaXml1.replace('{{SRV_HOST}}', srv_host)
+MetaXml1 = MetaXml1.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile1.content = MetaXml1
+MetaFile1_down.content = MetaXml1
+
+MetaXml2 = MetaXml2.replace('{{BAD_HASH}}', bad_sha256)
+MetaXml2 = MetaXml2.replace('{{SRV_HOST}}', srv_host)
+MetaXml2 = MetaXml2.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile2.content = MetaXml2
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port):
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+MetaHTTPRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port)
+ for LinkHeader in LinkHeaders ]
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-type-content.py b/testenv/Test-metalink-http-xml-type-content.py
new file mode 100755
index 0000000..b1ace27
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-type-content.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Content-Type Metalink/XML.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+MetaHTTP_down = WgetFile ("main.metalink.meta#1", MetaXml)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("main.metalink.meta#1.#1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("main.metalink.meta#1.#2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("main.metalink.meta#1.#3", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("main.metalink.meta#1.#4", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+WGET_OPTIONS = "--metalink-over-http --content-disposition --metalink-index=0"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaHTTP_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml = MetaXml.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml = MetaXml.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml = MetaXml.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml = MetaXml.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml = MetaXml.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml = MetaXml.replace('{{SRV_HOST}}', srv_host)
+MetaXml = MetaXml.replace('{{SRV_PORT}}', str (srv_port))
+MetaHTTP_down.content = MetaXml
+
+MetaHTTP.content = MetaXml
+
+MetaHTTPRules["SendHeader"] = {
+ 'Content-Type': 'application/metalink4+xml',
+ 'Content-Disposition': 'filename="newname.metalink"'
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-type-trust-content.py b/testenv/Test-metalink-http-xml-type-trust-content.py
new file mode 100755
index 0000000..7ee4197
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-type-trust-content.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Content-Type Metalink/XML.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+MetaHTTP_down = WgetFile ("newname.metalink", MetaXml)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("dir/File1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("dir/File2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("dir/File4", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("dir/File5", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+WGET_OPTIONS = "--trust-server-names --metalink-over-http --content-disposition --metalink-index=0"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaHTTP_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml = MetaXml.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml = MetaXml.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml = MetaXml.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml = MetaXml.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml = MetaXml.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml = MetaXml.replace('{{SRV_HOST}}', srv_host)
+MetaXml = MetaXml.replace('{{SRV_PORT}}', str (srv_port))
+MetaHTTP_down.content = MetaXml
+
+MetaHTTP.content = MetaXml
+
+MetaHTTPRules["SendHeader"] = {
+ 'Content-Type': 'application/metalink4+xml',
+ 'Content-Disposition': 'filename="newname.metalink"'
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-type-trust.py b/testenv/Test-metalink-http-xml-type-trust.py
new file mode 100755
index 0000000..0cf2074
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-type-trust.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Content-Type Metalink/XML.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+MetaHTTP_down = WgetFile ("main.metalink", MetaXml)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("dir/File1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("dir/File2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("dir/File4", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("dir/File5", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+WGET_OPTIONS = "--trust-server-names --metalink-over-http --metalink-index=0"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaHTTP_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml = MetaXml.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml = MetaXml.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml = MetaXml.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml = MetaXml.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml = MetaXml.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml = MetaXml.replace('{{SRV_HOST}}', srv_host)
+MetaXml = MetaXml.replace('{{SRV_PORT}}', str (srv_port))
+MetaHTTP_down.content = MetaXml
+
+MetaHTTP.content = MetaXml
+
+MetaHTTPRules["SendHeader"] = {
+ 'Content-Type': 'application/metalink4+xml',
+ 'Content-Disposition': 'filename="newname.metalink"'
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml-type.py b/testenv/Test-metalink-http-xml-type.py
new file mode 100755
index 0000000..19a65f1
--- /dev/null
+++ b/testenv/Test-metalink-http-xml-type.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Content-Type Metalink/XML.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+MetaHTTP_down = WgetFile ("main.metalink.meta#1", MetaXml)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("main.metalink.meta#1.#1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("main.metalink.meta#1.#2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("main.metalink.meta#1.#3", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("main.metalink.meta#1.#4", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+WGET_OPTIONS = "--metalink-over-http --metalink-index=0"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaHTTP_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml = MetaXml.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml = MetaXml.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml = MetaXml.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml = MetaXml.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml = MetaXml.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml = MetaXml.replace('{{SRV_HOST}}', srv_host)
+MetaXml = MetaXml.replace('{{SRV_PORT}}', str (srv_port))
+MetaHTTP_down.content = MetaXml
+
+MetaHTTP.content = MetaXml
+
+MetaHTTPRules["SendHeader"] = {
+ 'Content-Type': 'application/metalink4+xml',
+ 'Content-Disposition': 'filename="newname.metalink"'
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http-xml.py b/testenv/Test-metalink-http-xml.py
new file mode 100755
index 0000000..9cc49e9
--- /dev/null
+++ b/testenv/Test-metalink-http-xml.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink/HTTP with Metalink/XML Link headers.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+bad = "Ouch!"
+bad_sha256 = hashlib.sha256 (bad.encode ('UTF-8')).hexdigest ()
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml1 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="dir/File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File1</url>
+ </resources>
+ </file>
+ <file name="dir/File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File2</url>
+ </resources>
+ </file>
+ <file name="/dir/File3"> <!-- rejected by libmetalink -->
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File3</url>
+ </resources>
+ </file>
+ <file name="dir/File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File4</url>
+ </resources>
+ </file>
+ <file name="dir/File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="25">http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/File5</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+MetaXml2 = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="bad">
+ <verification>
+ <hash type="sha256">{{BAD_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file</url>
+ <url type="http" preference="40">http://{{SRV_HOST}}:{{SRV_PORT}}/404</url>
+ <url type="http" preference="30">http://{{SRV_HOST}}:{{SRV_PORT}}/bad</url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+LinkHeaders = [
+ # This file has the lowest priority, and should go last
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test1.metalink>; rel=describedby; pri=2; type=\"application/metalink4+xml\"",
+ # This file has the highest priority, and should go first
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/test2.metalink>; rel=describedby; pri=1; type=\"application/metalink4+xml\""
+]
+
+# This will be filled as soon as we know server hostname and port
+MetaHTTPRules = {'SendHeader' : {}}
+
+MetaHTTP = WgetFile ("main.metalink", rules=MetaHTTPRules)
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("main.metalink.meta#2.#1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("main.metalink.meta#2.#2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+# rejected by libmetalink
+File3_orig = WgetFile ("File3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("main.metalink.meta#2.#3", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("main.metalink.meta#2.#4", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+MetaFile1 = WgetFile ("test1.metalink", MetaXml1)
+MetaFile1_down = WgetFile ("main.metalink.meta#2", MetaXml1)
+
+MetaFile2 = WgetFile ("test2.metalink", MetaXml2)
+
+WGET_OPTIONS = "--metalink-over-http --metalink-index=2"
+WGET_URLS = [["main.metalink"]]
+
+RequestList = [[
+ "HEAD /main.metalink",
+ "GET /404",
+ "GET /wrong_file",
+ "GET /test1.metalink",
+ "GET /File1",
+ "GET /File2",
+ "GET /File4",
+ "GET /File5"
+]]
+
+Files = [[
+ MetaHTTP,
+ wrong_file,
+ MetaFile1, MetaFile2,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ MetaFile1_down,
+ File1_down,
+ File2_down,
+ File4_down,
+ File5_down
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml1 = MetaXml1.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml1 = MetaXml1.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml1 = MetaXml1.replace('{{SRV_HOST}}', srv_host)
+MetaXml1 = MetaXml1.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile1.content = MetaXml1
+MetaFile1_down.content = MetaXml1
+
+MetaXml2 = MetaXml2.replace('{{BAD_HASH}}', bad_sha256)
+MetaXml2 = MetaXml2.replace('{{SRV_HOST}}', srv_host)
+MetaXml2 = MetaXml2.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile2.content = MetaXml2
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port):
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+MetaHTTPRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port)
+ for LinkHeader in LinkHeaders ]
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-http.py b/testenv/Test-metalink-http.py
new file mode 100755
index 0000000..b119da6
--- /dev/null
+++ b/testenv/Test-metalink-http.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+from base64 import b64encode
+
+"""
+ This is to test Metalink as HTTP file support in Wget.
+"""
+
+# Helper function for hostname, port and digest substitution
+def SubstituteServerInfo (text, host, port, digest):
+ text = text.replace('{{FILE1_HASH}}', digest)
+ text = text.replace('{{SRV_HOST}}', host)
+ text = text.replace('{{SRV_PORT}}', str (port))
+ return text
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File1_corrupted = "Would you like some Coffee?"
+File1_lowPref = "Do not take this"
+File1_sha256 = b64encode (hashlib.sha256 (File1.encode ('UTF-8')).digest ()).decode ('ascii')
+Signature = '''-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.0.7 (GNU/Linux)
+
+This is no valid signature. But it should be downloaded.
+The attempt to verify should fail but should not prevent
+a successful metalink resource retrieval (the sig failure
+should not be fatal).
+-----END PGP SIGNATURE-----
+'''
+File2 = "No meta data for this file."
+
+LinkHeaders = [
+ # This file has low priority and should not be picked.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref>; rel=duplicate; pri=9; geo=pl",
+ # This file should be picked second, after hash failure.
+ "<http://this.is.no.good.example/File1_try2_badconnection>; rel =duplicate;pref; pri=7",
+ # This signature download will fail.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig2.asc>; rel=describedby; type=application/pgp-signature",
+ # Two good signatures
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig.asc>; rel=describedby; type=application/pgp-signature",
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/Sig.asc>; rel=describedby; type=application/pgp-signature",
+ # Bad URL scheme
+ "<invalid_url>; rel=duplicate; pri=4",
+ # rel missing
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1>; pri=1; pref",
+ # invalid rel
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1>; rel=strange; pri=4",
+ # This file should be picked first, because it has the lowest pri among preferred.
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_try1_corrupted>; rel=duplicate; geo=su; pri=4; pref",
+ # This file should NOT be picked third due to preferred location set to 'uk'
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_badgeo>; rel =duplicate;pri=5",
+ # This file should be picked as third try, and it should succeed
+ "<http://{{SRV_HOST}}:{{SRV_PORT}}/File1_try3_ok>; rel=duplicate; pri=5;geo=uk"
+ ]
+DigestHeader = "SHA-256={{FILE1_HASH}}"
+
+# This will be filled as soon as we know server hostname and port
+MetaFileRules = {'SendHeader' : {}}
+
+FileOkServer = WgetFile ("File1_try3_ok", File1)
+FileBadPref = WgetFile ("File1_lowPref", File1_lowPref)
+FileBadHash = WgetFile ("File1_try1_corrupted", File1_corrupted)
+MetaFile = WgetFile ("test.meta", rules=MetaFileRules)
+# In case of Metalink over HTTP, the local file name is
+# derived from the URL suffix.
+FileOkLocal = WgetFile ("test.meta", File1)
+SigFile = WgetFile ("Sig.asc", Signature)
+FileNoMeta = WgetFile ("File2", File2)
+
+WGET_OPTIONS = "--metalink-over-http --preferred-location=uk"
+WGET_URLS = [["test.meta", "File2"]]
+
+Files = [[FileOkServer, FileBadPref, FileBadHash, MetaFile, SigFile, FileNoMeta]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [FileNoMeta, FileOkLocal]
+
+RequestList = [
+ [
+ "HEAD /test.meta",
+ "GET /Sig2.asc",
+ "GET /Sig.asc",
+ "GET /File1_try1_corrupted",
+ "GET /File1_try3_ok",
+ "HEAD /File2",
+ "GET /File2",
+ ]
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList,
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+)
+
+http_test.server_setup()
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaFileRules["SendHeader"] = {
+ 'Link': [ SubstituteServerInfo (LinkHeader, srv_host, srv_port, File1_sha256)
+ for LinkHeader in LinkHeaders ],
+ 'Digest': SubstituteServerInfo (DigestHeader, srv_host, srv_port, File1_sha256),
+}
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-abspath-trust.py b/testenv/Test-metalink-xml-abspath-trust.py
new file mode 100755
index 0000000..5091cd0
--- /dev/null
+++ b/testenv/Test-metalink-xml-abspath-trust.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids absolute paths.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["/File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", "File2", File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-abspath.py b/testenv/Test-metalink-xml-abspath.py
new file mode 100755
index 0000000..e84fcf0
--- /dev/null
+++ b/testenv/Test-metalink-xml-abspath.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids absolute paths.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["/File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", XmlName + ".#1", File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-absprefix-trust.py b/testenv/Test-metalink-xml-absprefix-trust.py
new file mode 100755
index 0000000..4cf065d
--- /dev/null
+++ b/testenv/Test-metalink-xml-absprefix-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML absolute directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--directory-prefix /dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-absprefix.py b/testenv/Test-metalink-xml-absprefix.py
new file mode 100755
index 0000000..d19d178
--- /dev/null
+++ b/testenv/Test-metalink-xml-absprefix.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML absolute directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--directory-prefix /dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-continue.py b/testenv/Test-metalink-xml-continue.py
new file mode 100644
index 0000000..782dbd5
--- /dev/null
+++ b/testenv/Test-metalink-xml-continue.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML --continue support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.add_LocalFiles (
+ [XmlName + ".#1", File1[0:14]], # File1 to continue from partial file
+ [XmlName + ".#2", File2], # File2 to keep, different from server
+ [XmlName + ".#3", File3], # File3 to keep, already fully retrieved
+ [XmlName + ".#4", File4], # File4 to keep, different from server
+)
+
+Meta.add_ExpectedFiles (
+ [XmlName + ".#2", File2], # File2 to keep, different from server
+ [XmlName + ".#3", File3], # File3 to keep, already fully retrieved
+ [XmlName + ".#4", File4], # File4 to keep, different from server
+)
+
+Meta.print_meta ()
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", XmlName + ".#2", wrong_file, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["File3", XmlName + ".#3", File3, None, True,
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", XmlName + ".#4", File4_lowPref, None, True,
+ ["wrong_file", wrong_file, "http", None, 35]],
+ ["File5", XmlName + ".#5", File5, None, True,
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--continue " + \
+ "--input-metalink " + XmlName, 1
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-emptyprefix-trust.py b/testenv/Test-metalink-xml-emptyprefix-trust.py
new file mode 100755
index 0000000..9b4272d
--- /dev/null
+++ b/testenv/Test-metalink-xml-emptyprefix-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML with an empty directory prefix.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "subdir/File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "subdir/File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--directory-prefix '' " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-homepath-trust.py b/testenv/Test-metalink-xml-homepath-trust.py
new file mode 100755
index 0000000..3831e80
--- /dev/null
+++ b/testenv/Test-metalink-xml-homepath-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids the home path and names
+ beginning with the ~ (tilde) character.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["~File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["~/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["dir/~File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["dir/File4~", "dir/File4~", File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["dir/~/File5", "dir/~/File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-homepath.py b/testenv/Test-metalink-xml-homepath.py
new file mode 100755
index 0000000..f38f2db
--- /dev/null
+++ b/testenv/Test-metalink-xml-homepath.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids the home path and names
+ beginning with the ~ (tilde) character.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["~File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["~/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["dir/~File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["dir/File4~", XmlName + ".#1", File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["dir/~/File5", XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-homeprefix-trust.py b/testenv/Test-metalink-xml-homeprefix-trust.py
new file mode 100755
index 0000000..23c7191
--- /dev/null
+++ b/testenv/Test-metalink-xml-homeprefix-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML home directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--directory-prefix ~/dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-homeprefix.py b/testenv/Test-metalink-xml-homeprefix.py
new file mode 100755
index 0000000..03b17a8
--- /dev/null
+++ b/testenv/Test-metalink-xml-homeprefix.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML home directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--directory-prefix ~/dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-nohash.py b/testenv/Test-metalink-xml-nohash.py
new file mode 100755
index 0000000..4c82cb0
--- /dev/null
+++ b/testenv/Test-metalink-xml-nohash.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML with no hashes generates a SIGSEGV.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", None, File1, None, False,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", XmlName + ".#2", File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["File3", None, File3, None, None,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", XmlName + ".#4", File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", None, File5, None, "",
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 1
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-nourls.py b/testenv/Test-metalink-xml-nourls.py
new file mode 100755
index 0000000..9f3d93e
--- /dev/null
+++ b/testenv/Test-metalink-xml-nourls.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML with unknown url types.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "unknown", None, 35],
+ ["404", None, "unknown", None, 40],
+ ["File2_lowPref", File2_lowPref, "unknown", None, 25],
+ ["File2", File2, "unknown", None, 30]],
+ ["File3", XmlName + ".#3", File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", XmlName + ".#4", File4, None, True,
+ ["wrong_file", wrong_file, "unknown", None, 35],
+ ["404", None, "unknown", None, 40],
+ ["File4_lowPref", File4_lowPref, "unknown", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", XmlName + ".#5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 1
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-prefix-trust.py b/testenv/Test-metalink-xml-prefix-trust.py
new file mode 100755
index 0000000..1fef7f9
--- /dev/null
+++ b/testenv/Test-metalink-xml-prefix-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "dir/" + "subdir/File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "dir/" + "subdir/File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--directory-prefix dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-prefix.py b/testenv/Test-metalink-xml-prefix.py
new file mode 100755
index 0000000..4275a04
--- /dev/null
+++ b/testenv/Test-metalink-xml-prefix.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "dir/" + XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "dir/" + XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--directory-prefix dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-relpath-trust.py b/testenv/Test-metalink-xml-relpath-trust.py
new file mode 100755
index 0000000..d2b4fc0
--- /dev/null
+++ b/testenv/Test-metalink-xml-relpath-trust.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids relative paths.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["./File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["../File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["dir/./File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["dir/../File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-relpath.py b/testenv/Test-metalink-xml-relpath.py
new file mode 100755
index 0000000..9405410
--- /dev/null
+++ b/testenv/Test-metalink-xml-relpath.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test if Metalink/XML forbids relative paths.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["./File1", None, File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["../File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["dir/./File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["dir/../File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", XmlName + ".#1", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-relprefix-trust.py b/testenv/Test-metalink-xml-relprefix-trust.py
new file mode 100755
index 0000000..e19a8dc
--- /dev/null
+++ b/testenv/Test-metalink-xml-relprefix-trust.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML relative directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", "File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--directory-prefix ../dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-relprefix.py b/testenv/Test-metalink-xml-relprefix.py
new file mode 100755
index 0000000..98718c7
--- /dev/null
+++ b/testenv/Test-metalink-xml-relprefix.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML relative directory prefix support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["subdir/File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["/subdir/File2", None, File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["~/subdir/File3", None, File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["../subdir/File4", None, File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["subdir/File5", XmlName + ".#2", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--directory-prefix ../dir " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-size.py b/testenv/Test-metalink-xml-size.py
new file mode 100755
index 0000000..3250967
--- /dev/null
+++ b/testenv/Test-metalink-xml-size.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML file size check in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", XmlName + ".#1", File1, "", True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", None, File2, 2, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["File3", XmlName + ".#3", File3, 0, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", XmlName + ".#4", File4, -5, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", XmlName + ".#5", File5, True, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 1
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-trust.py b/testenv/Test-metalink-xml-trust.py
new file mode 100755
index 0000000..88049ca
--- /dev/null
+++ b/testenv/Test-metalink-xml-trust.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML file support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", "File1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", "File2", File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["File3", "File3", File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", "File4", File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", "File5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--trust-server-names " + \
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-metalink-xml-urlbreak.py b/testenv/Test-metalink-xml-urlbreak.py
new file mode 100755
index 0000000..e53ae11
--- /dev/null
+++ b/testenv/Test-metalink-xml-urlbreak.py
@@ -0,0 +1,236 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+
+"""
+ This is to test Metalink/XML white spaces in url resources.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+############# File Definitions ###############################################
+bad = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+File1_sha256 = hashlib.sha256 (File1.encode ('UTF-8')).hexdigest ()
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+File2_sha256 = hashlib.sha256 (File2.encode ('UTF-8')).hexdigest ()
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+File3_sha256 = hashlib.sha256 (File3.encode ('UTF-8')).hexdigest ()
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+File4_sha256 = hashlib.sha256 (File4.encode ('UTF-8')).hexdigest ()
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+File5_sha256 = hashlib.sha256 (File5.encode ('UTF-8')).hexdigest ()
+
+MetaXml = \
+"""<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/">
+ <publisher>
+ <name>GNU Wget</name>
+ </publisher>
+ <license>
+ <name>GNU GPL</name>
+ <url>http://www.gnu.org/licenses/gpl.html</url>
+ </license>
+ <identity>Wget Test Files</identity>
+ <version>1.2.3</version>
+ <description>Wget Test Files description</description>
+ <files>
+ <file name="File1">
+ <verification>
+ <hash type="sha256">{{FILE1_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file
+ </url>
+ <url type="http" preference="40">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/404
+ </url>
+ <url type="http" preference="25">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File1_lowPref
+ </url>
+ <url type="http" preference="30">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File1
+ </url>
+ </resources>
+ </file>
+ <file name="File2">
+ <verification>
+ <hash type="sha256">{{FILE2_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file
+ </url>
+ <url type="http" preference="40">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/404
+ </url>
+ <url type="http" preference="25">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File2_lowPref
+ </url>
+ <url type="http" preference="30">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File2
+ </url>
+ </resources>
+ </file>
+ <file name="File3">
+ <verification>
+ <hash type="sha256">{{FILE3_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file
+ </url>
+ <url type="http" preference="40">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/404
+ </url>
+ <url type="http" preference="25">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File3_lowPref
+ </url>
+ <url type="http" preference="30">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File3
+ </url>
+ </resources>
+ </file>
+ <file name="File4">
+ <verification>
+ <hash type="sha256">{{FILE4_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file
+ </url>
+ <url type="http" preference="40">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/404
+ </url>
+ <url type="http" preference="25">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File4_lowPref
+ </url>
+ <url type="http" preference="30">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File4
+ </url>
+ </resources>
+ </file>
+ <file name="File5">
+ <verification>
+ <hash type="sha256">{{FILE5_HASH}}</hash>
+ </verification>
+ <resources>
+ <url type="http" preference="35">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/wrong_file
+ </url>
+ <url type="http" preference="40">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/404
+ </url>
+ <url type="http" preference="25">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File5_lowPref
+ </url>
+ <url type="http" preference="30">
+ http://{{SRV_HOST}}:{{SRV_PORT}}/File5
+ </url>
+ </resources>
+ </file>
+ </files>
+</metalink>
+"""
+
+wrong_file = WgetFile ("wrong_file", bad)
+
+File1_orig = WgetFile ("File1", File1)
+File1_down = WgetFile ("test.metalink.#1", File1)
+File1_nono = WgetFile ("File1_lowPref", File1_lowPref)
+
+File2_orig = WgetFile ("File2", File2)
+File2_down = WgetFile ("test.metalink.#2", File2)
+File2_nono = WgetFile ("File2_lowPref", File2_lowPref)
+
+File3_orig = WgetFile ("File3", File3)
+File3_down = WgetFile ("test.metalink.#3", File3)
+File3_nono = WgetFile ("File3_lowPref", File3_lowPref)
+
+File4_orig = WgetFile ("File4", File4)
+File4_down = WgetFile ("test.metalink.#4", File4)
+File4_nono = WgetFile ("File4_lowPref", File4_lowPref)
+
+File5_orig = WgetFile ("File5", File5)
+File5_down = WgetFile ("test.metalink.#5", File5)
+File5_nono = WgetFile ("File5_lowPref", File5_lowPref)
+
+MetaFile = WgetFile ("test.metalink", MetaXml)
+
+WGET_OPTIONS = "--input-metalink test.metalink"
+WGET_URLS = [[]]
+
+Files = [[
+ wrong_file,
+ File1_orig, File1_nono,
+ File2_orig, File2_nono,
+ File3_orig, File3_nono,
+ File4_orig, File4_nono,
+ File5_orig, File5_nono
+]]
+Existing_Files = [MetaFile]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [
+ File1_down,
+ File2_down,
+ File3_down,
+ File4_down,
+ File5_down,
+ MetaFile
+]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+)
+
+http_test.server_setup()
+### Get and use dynamic server sockname
+srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+MetaXml = MetaXml.replace('{{FILE1_HASH}}', File1_sha256)
+MetaXml = MetaXml.replace('{{FILE2_HASH}}', File2_sha256)
+MetaXml = MetaXml.replace('{{FILE3_HASH}}', File3_sha256)
+MetaXml = MetaXml.replace('{{FILE4_HASH}}', File4_sha256)
+MetaXml = MetaXml.replace('{{FILE5_HASH}}', File5_sha256)
+MetaXml = MetaXml.replace('{{SRV_HOST}}', srv_host)
+MetaXml = MetaXml.replace('{{SRV_PORT}}', str (srv_port))
+MetaFile.content = MetaXml
+
+err = http_test.begin ()
+
+exit (err)
diff --git a/testenv/Test-metalink-xml.py b/testenv/Test-metalink-xml.py
new file mode 100644
index 0000000..788d375
--- /dev/null
+++ b/testenv/Test-metalink-xml.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python3
+
+from sys import exit
+from misc.metalinkv3_xml import Metalinkv3_XML
+
+"""
+ This is to test Metalink/XML file support in Wget.
+
+ With --trust-server-names, trust the metalink:file names.
+
+ Without --trust-server-names, don't trust the metalink:file names:
+ use the basename of --input-metalink, and add a sequential number
+ (e.g. .#1, .#2, etc.).
+
+ Strip the directory from unsafe paths.
+"""
+
+############# File Definitions ###############################################
+wrong_file = "Ouch!"
+
+File1 = "Would you like some Tea?"
+File1_lowPref = "Do not take this"
+
+File2 = "This is gonna be good"
+File2_lowPref = "Not this one too"
+
+File3 = "A little more, please"
+File3_lowPref = "That's just too much"
+
+File4 = "Maybe a biscuit?"
+File4_lowPref = "No, thanks"
+
+File5 = "More Tea...?"
+File5_lowPref = "I have to go..."
+
+############# Metalink/XML ###################################################
+Meta = Metalinkv3_XML()
+
+# file_name: metalink:file "name" field
+# save_name: metalink:file save name, if None the file is rejected
+# content : metalink:file content
+#
+# size:
+# True auto-compute size
+# None no <size></size>
+# any use this size
+#
+# hash_sha256:
+# False no <verification></verification>
+# True auto-compute sha256
+# None no <hash></hash>
+# any use this hash
+#
+# srv_file : metalink:url server file
+# srv_content: metalink:url server file content, if None the file doesn't exist
+# utype : metalink:url type (http, ftp, etc.)
+# location : metalink:url location (default 'no location field')
+# preference : metalink:url preference (default 999999)
+
+XmlName = "test.metalink"
+
+Meta.xml (
+ # Metalink/XML file name
+ XmlName,
+ # file_name, save_name, content, size, hash_sha256
+ ["File1", XmlName + ".#1", File1, None, True,
+ # srv_file, srv_content, utype, location, preference
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File1_lowPref", File1_lowPref, "http", None, 25],
+ ["File1", File1, "http", None, 30]],
+ ["File2", XmlName + ".#2", File2, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File2_lowPref", File2_lowPref, "http", None, 25],
+ ["File2", File2, "http", None, 30]],
+ ["File3", XmlName + ".#3", File3, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File3_lowPref", File3_lowPref, "http", None, 25],
+ ["File3", File3, "http", None, 30]],
+ ["File4", XmlName + ".#4", File4, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File4_lowPref", File4_lowPref, "http", None, 25],
+ ["File4", File4, "http", None, 30]],
+ ["File5", XmlName + ".#5", File5, None, True,
+ ["wrong_file", wrong_file, "http", None, 35],
+ ["404", None, "http", None, 40],
+ ["File5_lowPref", File5_lowPref, "http", None, 25],
+ ["File5", File5, "http", None, 30]],
+)
+
+Meta.print_meta ()
+
+err = Meta.http_test (
+ "--input-metalink " + XmlName, 0
+)
+
+exit (err)
diff --git a/testenv/Test-missing-scheme-retval.py b/testenv/Test-missing-scheme-retval.py
new file mode 100755
index 0000000..dca3a72
--- /dev/null
+++ b/testenv/Test-missing-scheme-retval.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTP
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget complains about missing scheme
+"""
+############# File Definitions ###############################################
+A_File = WgetFile ("bar", 'Content')
+
+# put the URL into 'options' to avoid prepending scheme/localhost/port
+WGET_OPTIONS = "/foo/bar"
+WGET_URLS = [[]]
+
+Files = [[A_File]]
+
+ExpectedReturnCode = 1
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-no_proxy-env.py b/testenv/Test-no_proxy-env.py
new file mode 100755
index 0000000..beec72e
--- /dev/null
+++ b/testenv/Test-no_proxy-env.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+import socket
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import SKIP_TEST
+from test.base_test import HTTP
+from misc.wget_file import WgetFile
+
+"""
+ This test ensures, that domains with and without leftmost dot defined in
+ no_proxy environment variable are accepted by wget. The idea is to use
+ non-existing proxy server address and detect whether files are downloaded
+ when proxy settings are omitted based on no_proxy environment variable
+ value.
+
+ current wget's behavior:
+ - "no_proxy=.mit.edu"
+ - will match the domain and subdomains e.g. "www.mit.edu" or "www.subdomain.mit.edu" (Case #4)
+ - will NOT match the host "mit.edu" (Case #3)
+ - "no_proxy=mit.edu"
+ - will match the domain and subdomains e.g. "www.mit.edu" or "www.subdomain.mit.edu" (Case #2)
+ - will match the host "mit.edu" (Case #1)
+ - downside: can not match only the host
+"""
+
+# Check whether the system supports translating localhost subdomains
+# to localhost address and if not, skip it.
+hostnames_to_check = [
+ "working1.localhost",
+ "working2.localhost",
+ "www.working1.localhost",
+ "www.working2.localhost",
+]
+for hostname in hostnames_to_check:
+ try:
+ ip = socket.gethostbyname(hostname)
+ except socket.gaierror as _:
+ # resolution of the name fails
+ # return value 77 -> SKIP
+ exit(SKIP_TEST)
+
+# File Definitions
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+
+WGET_URLS = [["File1", "File2"]]
+WGET_ENVS = {
+ "http_proxy": "nonexisting.localhost:8080",
+ "no_proxy": "working1.localhost,.working2.localhost"
+}
+
+Servers = [HTTP]
+Files = [[A_File, B_File]]
+
+ExpectedReturnCodeWorking = 0
+ExpectedReturnCodeNotWorking = 4 # network error (non-existing proxy address)
+
+ExpectedDownloadedFilesWorking = [A_File, B_File]
+
+# Pre and Post Test Hooks
+test_options = {
+ "Urls" : WGET_URLS,
+ "EnvironmentVariables": WGET_ENVS
+}
+post_test_working = {
+ "ExpectedFiles" : ExpectedDownloadedFilesWorking,
+ "ExpectedRetcode" : ExpectedReturnCodeWorking
+}
+post_test_not_working = {
+ "ExpectedRetcode" : ExpectedReturnCodeNotWorking
+}
+
+# Case #1:
+# - Requested domain matches exactly the domain definition in no_proxy.
+# - Domain definition in no_proxy is NOT dot-prefixed
+# Expected result: proxy settings don't apply and files are downloaded.
+pre_case_1 = {
+ "ServerFiles" : Files,
+ "Domains" : ["working1.localhost"]
+}
+
+err_case_1 = HTTPTest (
+ pre_hook=pre_case_1,
+ test_params=test_options,
+ post_hook=post_test_working,
+ protocols=Servers
+).begin ()
+
+# Case #2:
+# - Requested domain is sub-domain of a domain definition in no_proxy.
+# - Domain definition in no_proxy is NOT dot-prefixed
+# Expected result: proxy settings don't apply and files are downloaded.
+pre_case_2 = {
+ "ServerFiles" : Files,
+ "Domains" : ["www.working1.localhost"]
+}
+
+err_case_2 = HTTPTest (
+ pre_hook=pre_case_2,
+ test_params=test_options,
+ post_hook=post_test_working,
+ protocols=Servers
+).begin ()
+
+# Case #3:
+# - Requested domain matches exactly the domain definition in no_proxy,
+# except for the leftmost dot (".") in no_proxy domain definition.
+# - Domain definition in no_proxy IS dot-prefixed
+# Expected result: proxy settings apply and files are downloaded. This is
+# due to the mismatch in leftmost dot.
+# NOTE: This is inconsistent with curl's behavior, but has less drawbacks.
+pre_case_3 = {
+ "ServerFiles" : Files,
+ "Domains" : ["working2.localhost"]
+}
+
+err_case_3 = HTTPTest (
+ pre_hook=pre_case_3,
+ test_params=test_options,
+ post_hook=post_test_not_working,
+ protocols=Servers
+).begin ()
+
+# Case #4:
+# - Requested domain is sub-domain of a domain definition in no_proxy.
+# - Domain definition in no_proxy IS dot-prefixed
+# Expected result: proxy settings don't apply and files are downloaded.
+pre_case_4 = {
+ "ServerFiles" : Files,
+ "Domains" : ["www.working2.localhost"]
+}
+
+err_case_4 = HTTPTest (
+ pre_hook=pre_case_4,
+ test_params=test_options,
+ post_hook=post_test_working,
+ protocols=Servers
+).begin ()
+
+# Case #5
+# - Requested domain does not match a domain definition in no_proxy.
+# - Requested domain is NOT sub-domain of a domain definition in no_proxy.
+# Expected result: proxy settings apply and files are NOT downloaded due to
+# network error when using proxy with non-existing URL.
+pre_case_5 = {
+ "ServerFiles" : Files,
+ "Domains" : ["www.example.localhost"]
+}
+
+err_case_5 = HTTPTest (
+ pre_hook=pre_case_5,
+ test_params=test_options,
+ post_hook=post_test_not_working,
+ protocols=Servers
+).begin ()
+
+# Combine error codes from all test cases
+exit (max(err_case_1, err_case_2, err_case_3, err_case_4, err_case_5))
diff --git a/testenv/Test-pinnedpubkey-der-https.py b/testenv/Test-pinnedpubkey-der-https.py
new file mode 100755
index 0000000..1e55d68
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-der-https.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+C_File = WgetFile ("File3", File3)
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+PINNEDPUBKEY = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'server-pubkey.der'))
+WGET_OPTIONS = "--pinnedpubkey=" + PINNEDPUBKEY + " --ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+Existing_Files = [C_File]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-pinnedpubkey-der-no-check-https.py b/testenv/Test-pinnedpubkey-der-no-check-https.py
new file mode 100755
index 0000000..44a7098
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-der-no-check-https.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+C_File = WgetFile ("File3", File3)
+
+PINNEDPUBKEY = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'server-pubkey.der'))
+WGET_OPTIONS = "--no-check-certificate --pinnedpubkey=" + PINNEDPUBKEY
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+Existing_Files = [C_File]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-pinnedpubkey-hash-https.py b/testenv/Test-pinnedpubkey-hash-https.py
new file mode 100755
index 0000000..5cdc987
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-hash-https.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+C_File = WgetFile ("File3", File3)
+
+CERTDIR = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs'))
+CAFILE = CERTDIR + '/ca-cert.pem'
+KEYFILE = CERTDIR + '/server-pubkey-sha256.base64'
+with open(KEYFILE, 'r') as f:
+ KEY = f.read().replace('\n', '')
+WGET_OPTIONS = "--pinnedpubkey=sha256//" + KEY + " --ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+Existing_Files = [C_File]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-pinnedpubkey-hash-no-check-fail-https.py b/testenv/Test-pinnedpubkey-hash-no-check-fail-https.py
new file mode 100755
index 0000000..5203039
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-hash-no-check-fail-https.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+
+WGET_OPTIONS = "--no-check-certificate --pinnedpubkey=sha256//invalid"
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 5
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-pinnedpubkey-pem-fail-https.py b/testenv/Test-pinnedpubkey-pem-fail-https.py
new file mode 100755
index 0000000..c6f7f1e
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-pem-fail-https.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+PINNEDPUBKEY = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-key.pem'))
+WGET_OPTIONS = "--pinnedpubkey=" + PINNEDPUBKEY + " --ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 5
+ExpectedDownloadedFiles = []
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-pinnedpubkey-pem-https.py b/testenv/Test-pinnedpubkey-pem-https.py
new file mode 100755
index 0000000..dcc0c55
--- /dev/null
+++ b/testenv/Test-pinnedpubkey-pem-https.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTPS, SKIP_TEST
+from misc.wget_file import WgetFile
+import os
+
+"""
+ This test ensures that Wget can download files from HTTPS Servers
+"""
+if os.getenv('SSL_TESTS') is None:
+ exit (SKIP_TEST)
+
+############# File Definitions ###############################################
+File1 = "Would you like some Tea?"
+File2 = "With lemon or cream?"
+File3 = "Sure you're joking Mr. Feynman"
+
+A_File = WgetFile ("File1", File1)
+B_File = WgetFile ("File2", File2)
+C_File = WgetFile ("File3", File3)
+
+CAFILE = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'ca-cert.pem'))
+PINNEDPUBKEY = os.path.abspath(os.path.join(os.getenv('srcdir', '.'), 'certs', 'server-pubkey.pem'))
+WGET_OPTIONS = "--pinnedpubkey=" + PINNEDPUBKEY + " --ca-certificate=" + CAFILE
+WGET_URLS = [["File1", "File2"]]
+
+Files = [[A_File, B_File]]
+Existing_Files = [C_File]
+
+Servers = [HTTPS]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [A_File, B_File, C_File]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-recursive-basic.py b/testenv/Test-recursive-basic.py
new file mode 100755
index 0000000..6fb2f5e
--- /dev/null
+++ b/testenv/Test-recursive-basic.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTP, HTTPS
+from misc.wget_file import WgetFile
+
+"""
+ Basic test of --recursive.
+"""
+############# File Definitions ###############################################
+File1 = """<html><body>
+<a href=\"/a/File2.html\">text</a>
+<a href=\"/b/File3.html\">text</a>
+</body></html>"""
+File2 = "With lemon or cream?"
+File3 = "Surely you're joking Mr. Feynman"
+
+File1_File = WgetFile ("a/File1.html", File1)
+File2_File = WgetFile ("a/File2.html", File2)
+File3_File = WgetFile ("b/File3.html", File3)
+
+WGET_OPTIONS = "--recursive --no-host-directories"
+WGET_URLS = [["a/File1.html"]]
+
+Servers = [HTTP]
+
+Files = [[File1_File, File2_File, File3_File]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [File1_File, File2_File, File3_File]
+Request_List = [["GET /a/File1.html",
+ "GET /robots.txt",
+ "GET /a/File2.html",
+ "GET /b/File3.html"]]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : Request_List
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-recursive-include.py b/testenv/Test-recursive-include.py
new file mode 100755
index 0000000..1fe33cd
--- /dev/null
+++ b/testenv/Test-recursive-include.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTP, HTTPS
+from misc.wget_file import WgetFile
+
+"""
+ Basic test of --recursive.
+"""
+############# File Definitions ###############################################
+File1 = """<html><body>
+<a href=\"/a/File2.html\">text</a>
+<a href=\"/b/File3.html\">text</a>
+</body></html>"""
+File2 = "With lemon or cream?"
+File3 = "Surely you're joking Mr. Feynman"
+
+File1_File = WgetFile ("a/File1.html", File1)
+File2_File = WgetFile ("a/File2.html", File2)
+File3_File = WgetFile ("b/File3.html", File3)
+
+WGET_OPTIONS = "--recursive --no-host-directories --include-directories=a"
+WGET_URLS = [["a/File1.html"]]
+
+Servers = [HTTP]
+
+Files = [[File1_File, File2_File, File3_File]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [File1_File, File2_File]
+Request_List = [["GET /a/File1.html",
+ "GET /a/File2.html"]]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-recursive-redirect.py b/testenv/Test-recursive-redirect.py
new file mode 100644
index 0000000..8a114a5
--- /dev/null
+++ b/testenv/Test-recursive-redirect.py
@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTP, HTTPS
+from misc.wget_file import WgetFile
+
+"""
+ Basic test of --recursive.
+"""
+############# File Definitions ###############################################
+File1 = """<html><body>
+<a href=\"/a/File2.html\">text</a>
+<a href=\"/b/File3.html\">text</a>
+</body></html>"""
+File2 = "With lemon or cream?"
+File3 = "Surely you're joking Mr. Feynman"
+
+File1_rules = {
+ "Response" : 301,
+ "SendHeader" : {"Location" : "/b/File1.html"}
+}
+
+File1_File = WgetFile ("a/File1.html", "", rules=File1_rules)
+File1_Redirected = WgetFile ("b/File1.html", File1)
+File1_Retrieved = WgetFile ("a/File1.html", File1)
+File2_File = WgetFile ("a/File2.html", File2)
+File3_File = WgetFile ("b/File3.html", File3)
+
+WGET_OPTIONS = "--recursive --no-host-directories --include-directories=a"
+WGET_URLS = [["a/File1.html"]]
+
+Servers = [HTTP]
+
+Files = [[File1_Redirected, File1_File, File2_File, File3_File]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [File1_Retrieved, File2_File]
+Request_List = [["GET /a/File1.html",
+ "GET /a/File2.html",
+ "GET /b/File3.html"]]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-redirect-crash.py b/testenv/Test-redirect-crash.py
new file mode 100755
index 0000000..1f5bb0d
--- /dev/null
+++ b/testenv/Test-redirect-crash.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import os
+
+# This test caused wget up to 1.16 to crash
+#os.environ["LC_ALL"] = "en_US.UTF-8"
+
+urls = [
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory",
+ "File formats/Images/SVG, Scalable Vector Graphics/html, W3C v1.2 rec (tiny)/directory/",
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory/somefile.rng",
+ "File%20formats/Images/SVG%2C%20Scalable%20Vector%20Graphics/html%2c%20W3C%20v1.2%20rec%20%28tiny%29/directory/somefile.rng",
+ "File%20formats/Images/SVG%2C%20Scalable%20Vector%20Graphics/html%2c%20W3C%20v1.2%20rec%20%28tiny%29/directory/",
+ "File%20formats/Images/SVG%2C%20Scalable%20Vector%20Graphics/html%2C%20W3C%20v1.2%20rec%20%28tiny%29/directory"]
+
+
+redirected = [
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory/"
+]
+
+############# File Definitions ###############################################
+Index = ""
+for i in urls:
+ Index = Index + "<a href='/%s'></a>" % i
+
+File1 = ""
+
+def get_redirect(url):
+ data = {
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory" :
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory/",
+ "File%20formats/Images/SVG%2C%20Scalable%20Vector%20Graphics/html%2C%20W3C%20v1.2%20rec%20%28tiny%29/directory" :
+ "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/directory/"
+ }
+ dest = data.get(url)
+ if dest:
+ return {"Response" : 301,
+ "SendHeader" : {"Location" : "/%s" % dest}}
+ return None
+
+
+index_url = "File%20formats/Images/SVG,%20Scalable%20Vector%20Graphics/html,%20W3C%20v1.2%20rec%20(tiny)/index.html"
+Index_File = WgetFile (index_url, Index)
+Files = ([Index_File] + [WgetFile(i, File1, rules=get_redirect(i)) for i in (redirected + urls)])
+
+WGET_OPTIONS = "--recursive -e robots=off"
+
+WGET_URLS = [[index_url]]
+
+ExpectedReturnCode = 0
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : [Files]
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedRetcode" : ExpectedReturnCode,
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-redirect.py b/testenv/Test-redirect.py
new file mode 100755
index 0000000..02adf52
--- /dev/null
+++ b/testenv/Test-redirect.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from test.http_test import HTTPTest
+from test.base_test import HTTP, HTTPS
+from misc.wget_file import WgetFile
+
+"""
+ This is a Prototype Test File.
+ Ideally this File should be copied and edited to write new tests.
+"""
+############# File Definitions ###############################################
+File2 = "Would you like some Tea?"
+
+File1_rules = {
+ "Response" : 301,
+ "SendHeader" : {"Location" : "/File2.txt"}
+}
+
+# /File1.txt is only a redirect, and so has no file content.
+File1_File = WgetFile ("File1.txt", "", rules=File1_rules)
+# File1_Retrieved is what will be retrieved for URL /File1.txt.
+File1_Retrieved = WgetFile ("File1.txt", File2)
+File2_File = WgetFile ("File2.txt", File2)
+
+WGET_OPTIONS = ""
+WGET_URLS = [["File1.txt"]]
+
+Servers = [HTTP]
+
+Files = [[File1_File, File2_File]]
+Existing_Files = []
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = [File1_Retrieved]
+
+################ Pre and Post Test Hooks #####################################
+pre_test = {
+ "ServerFiles" : Files,
+ "LocalFiles" : Existing_Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ protocols=Servers
+).begin ()
+
+exit (err)
diff --git a/testenv/Test-reserved-chars.py b/testenv/Test-reserved-chars.py
new file mode 100755
index 0000000..fb617f5
--- /dev/null
+++ b/testenv/Test-reserved-chars.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+from sys import exit
+from os import environ # to set LC_ALL
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+
+"""
+This test ensures that Wget keeps reserved characters in URLs in non-UTF-8 charsets.
+"""
+# This bug only happened with ASCII charset,
+# so we need to set LC_ALL="C" in order to reproduce it.
+environ["LC_ALL"] = "C"
+
+######### File Definitions #########
+RequestList = [
+ [
+ "HEAD /base.html",
+ "GET /base.html",
+ "GET /robots.txt",
+ "HEAD /a%2Bb.html",
+ "GET /a%2Bb.html"
+ ]
+]
+A_File_Name = "base.html"
+B_File_Name = "a%2Bb.html"
+A_File = WgetFile (A_File_Name, "<a href=\"a%2Bb.html\">")
+B_File = WgetFile (B_File_Name, "this is file B")
+
+WGET_OPTIONS = " --spider -r"
+WGET_URLS = [[A_File_Name]]
+
+Files = [[A_File, B_File]]
+
+ExpectedReturnCode = 0
+ExpectedDownloadedFiles = []
+
+######### Pre and Post Test Hooks #########
+pre_test = {
+ "ServerFiles" : Files
+}
+test_options = {
+ "WgetCommands" : WGET_OPTIONS,
+ "Urls" : WGET_URLS
+}
+post_test = {
+ "ExpectedFiles" : ExpectedDownloadedFiles,
+ "ExpectedRetcode" : ExpectedReturnCode,
+ "FilesCrawled" : RequestList
+}
+
+err = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test
+).begin ()
+
+exit (err)
diff --git a/testenv/certs/README b/testenv/certs/README
new file mode 100644
index 0000000..2aabd3f
--- /dev/null
+++ b/testenv/certs/README
@@ -0,0 +1,87 @@
+To create the server RSA private key:
+$ certtool --generate-privkey --outfile server-key.pem --rsa
+
+
+To create a self signed CA certificate:
+$ certtool --generate-privkey --outfile ca-key.pem
+$ certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca-cert.pem
+Common name: GNU Wget
+UID:
+Organizational unit name: Wget
+Organization name: GNU
+Locality name:
+State or province name:
+Country name (2 chars):
+Enter the subject's domain component (DC):
+This field should not be used in new certificates.
+E-mail:
+Enter the certificate's serial number in decimal (default: 6080487640893163573):
+
+Activation/Expiration time.
+The certificate will expire in (days): -1
+
+Extensions.
+Does the certificate belong to an authority? (y/N): y
+Path length constraint (decimal, -1 for no constraint):
+Is this a TLS web client certificate? (y/N):
+Will the certificate be used for IPsec IKE operations? (y/N):
+Is this a TLS web server certificate? (y/N):
+Enter a dnsName of the subject of the certificate:
+Enter a URI of the subject of the certificate:
+Enter the IP address of the subject of the certificate:
+Enter the e-mail of the subject of the certificate:
+Will the certificate be used to sign OCSP requests? (y/N):
+Will the certificate be used to sign code? (y/N):
+Will the certificate be used for time stamping? (y/N):
+Will the certificate be used to sign other certificates? (y/N): y
+Will the certificate be used to sign CRLs? (y/N): y
+Enter the URI of the CRL distribution point:
+
+
+To generate a server certificate using the private key only:
+$ certtool --generate-certificate --load-privkey server-key.pem --outfile server-cert.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem
+Common name: 127.0.0.1
+UID:
+Organizational unit name: Wget
+Organization name: GNU
+Locality name:
+State or province name:
+Country name (2 chars):
+Enter the subject's domain component (DC):
+This field should not be used in new certificates.
+E-mail:
+Enter the certificate's serial number in decimal (default: 6080488276853553635):
+
+Activation/Expiration time.
+The certificate will expire in (days): -1
+
+Extensions.
+Does the certificate belong to an authority? (y/N):
+Is this a TLS web client certificate? (y/N):
+Will the certificate be used for IPsec IKE operations? (y/N):
+Is this a TLS web server certificate? (y/N): y
+Enter a dnsName of the subject of the certificate: 127.0.0.1
+Enter a dnsName of the subject of the certificate: localhost
+Enter a dnsName of the subject of the certificate:
+Enter a URI of the subject of the certificate:
+Enter the IP address of the subject of the certificate:
+Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (Y/n):
+Will the certificate be used for encryption (RSA ciphersuites)? (Y/n):
+
+
+To create a CRL for the server certificate:
+$ certtool --generate-crl --load-ca-privkey ca-key.pem --load-ca-certificate ca-cert.pem --load-certificate server-cert.pem --outfile server-crl.pem
+Generating a signed CRL...
+Update times.
+The certificate will expire in (days): -1
+CRL Number (default: 6080006793650397145):
+
+To generate a public key in PEM format:
+$ openssl x509 -noout -pubkey < server-cert.pem > server-pubkey.pem
+
+To generate a public key in DER format:
+$ openssl x509 -noout -pubkey < server-cert.pem | openssl asn1parse -noout -inform pem -out server-pubkey.der
+
+To generate a sha256 hash of the public key:
+$ openssl x509 -noout -pubkey < server-cert.pem | openssl asn1parse -noout -inform pem -out /dev/stdout | openssl dgst -sha256 -binary | openssl base64
+mHiEhWHvusnzP7COZk+SzSJ+Gl7nZT+ADx0PUnDD7mM=
diff --git a/testenv/certs/ca-cert.pem b/testenv/certs/ca-cert.pem
new file mode 100644
index 0000000..2c06476
--- /dev/null
+++ b/testenv/certs/ca-cert.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDJzCCAg+gAwIBAgIIWRQ9uws3g5owDQYJKoZIhvcNAQELBQAwMDERMA8GA1UE
+AxMIR05VIFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTAgFw0xNzA1
+MTExMDMyMzdaGA85OTk5MTIzMTIzNTk1OVowMDERMA8GA1UEAxMIR05VIFdnZXQx
+DTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAL9iEdf4LGibJ/noLVRWzDDG4ryvnlcz2PMBF29n5aXvWipM
+M/NuJ0kq1n0YoEJn/zg5DZStsfdZKaXz5lpApVEREAdyOHf7BxZ86gpBSpjcLVU+
+A7C+O1bpoGRemY0qk2EA9zAx91YRY9Yiq0TDP2gmV8J7Q/uu7CsOlD13xW31DkXn
+KW+3wmT2RVRWErcYHBe3Mh/gwAy1+UAhI4i2B9XrOhV63cPsqYMAZfh7i5EP+IBN
+CS0CuTwCkmHi8tCRAVD6L5DF0/q/Wj5EARf/Vg+rlD4mtBER2zCE9DMvOIQaxvXe
+buYFz5x9WcSiK/IiTmAsnVY2J3Z9tc7NiBMcC+sCAwEAAaNDMEEwDwYDVR0TAQH/
+BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBTzPk44hEqpvsFvx2Gj
+UNpuKYvrVDANBgkqhkiG9w0BAQsFAAOCAQEAAsAugT64gwFMMtwDJo5r3/f9sMPA
+lWi1N7Nz8LjBa6Vqrk/3No3Fxxidb3IMO5RGecgZdGV/CL5lG7yjzgVB2ADx+68K
+TmcNEO4CDja5vDyRpG7NPGmhtc48iiOsnEhhWCw084S2rUKf7hAX3+yKg63Uwuik
+C0xHT6HwbrWcmWFQAQOqucPWEwzGRMjqn++3cHAG8XlNSL8tWIr7NmTKr7yufLPC
+HcDAVgJsBHTOWgs/Casq4EovO83hgustD6rAWJOf89DP6bB2yOPEHKVq6cBsuGDM
+F+V2Cr2ytyGPHrOCfH3IzCpQ45cxZX4TaJ7tgV9x7WlMLoNaZgo1ijsKOw==
+-----END CERTIFICATE-----
diff --git a/testenv/certs/ca-key.pem b/testenv/certs/ca-key.pem
new file mode 100644
index 0000000..ac51f60
--- /dev/null
+++ b/testenv/certs/ca-key.pem
@@ -0,0 +1,144 @@
+Public Key Info:
+ Public Key Algorithm: RSA
+ Key Security Level: Medium (2048 bits)
+
+modulus:
+ 00:bf:62:11:d7:f8:2c:68:9b:27:f9:e8:2d:54:56:
+ cc:30:c6:e2:bc:af:9e:57:33:d8:f3:01:17:6f:67:
+ e5:a5:ef:5a:2a:4c:33:f3:6e:27:49:2a:d6:7d:18:
+ a0:42:67:ff:38:39:0d:94:ad:b1:f7:59:29:a5:f3:
+ e6:5a:40:a5:51:11:10:07:72:38:77:fb:07:16:7c:
+ ea:0a:41:4a:98:dc:2d:55:3e:03:b0:be:3b:56:e9:
+ a0:64:5e:99:8d:2a:93:61:00:f7:30:31:f7:56:11:
+ 63:d6:22:ab:44:c3:3f:68:26:57:c2:7b:43:fb:ae:
+ ec:2b:0e:94:3d:77:c5:6d:f5:0e:45:e7:29:6f:b7:
+ c2:64:f6:45:54:56:12:b7:18:1c:17:b7:32:1f:e0:
+ c0:0c:b5:f9:40:21:23:88:b6:07:d5:eb:3a:15:7a:
+ dd:c3:ec:a9:83:00:65:f8:7b:8b:91:0f:f8:80:4d:
+ 09:2d:02:b9:3c:02:92:61:e2:f2:d0:91:01:50:fa:
+ 2f:90:c5:d3:fa:bf:5a:3e:44:01:17:ff:56:0f:ab:
+ 94:3e:26:b4:11:11:db:30:84:f4:33:2f:38:84:1a:
+ c6:f5:de:6e:e6:05:cf:9c:7d:59:c4:a2:2b:f2:22:
+ 4e:60:2c:9d:56:36:27:76:7d:b5:ce:cd:88:13:1c:
+ 0b:eb:
+
+public exponent:
+ 01:00:01:
+
+private exponent:
+ 45:0c:7f:fd:98:a7:85:12:3d:a9:17:90:8b:36:49:
+ b3:6b:7e:50:af:58:04:84:4b:48:d9:62:f8:29:d7:
+ 1c:38:30:22:c4:9d:95:bd:6f:65:21:94:83:4b:c8:
+ 3e:4d:41:32:aa:ba:f0:a2:7e:6c:0c:7a:4f:4a:a1:
+ 18:7c:ec:68:44:2c:b1:53:0f:76:92:56:2b:51:e4:
+ 2a:d1:05:b6:02:f2:44:27:fc:b2:de:df:8f:ea:f8:
+ 98:5d:dd:2e:a6:66:c7:ff:ce:2f:50:47:b9:80:ca:
+ b1:6e:8e:b6:5f:6f:58:07:45:70:80:82:b5:a2:95:
+ c8:af:18:e2:d8:7c:9d:bf:c5:a9:da:4f:af:08:37:
+ 92:27:94:12:c0:94:70:90:ff:e4:05:8b:ed:18:a9:
+ 19:3c:47:3a:7c:fe:4f:9c:15:ab:f6:7e:48:2a:58:
+ d7:14:67:96:bd:e6:fa:9f:3a:51:0c:63:49:14:d5:
+ 9d:e9:a8:24:19:2a:83:e4:fe:e2:ec:db:f9:13:33:
+ a6:d3:62:d2:6b:7e:a9:5b:93:73:f5:c9:d0:ad:58:
+ 11:cb:77:d3:13:3c:bf:37:f9:64:95:c7:4c:69:f2:
+ 6e:b8:36:69:57:93:4a:03:06:58:8a:51:3d:d6:97:
+ 61:2f:7c:76:33:14:88:51:45:68:4e:29:fe:12:43:
+ 69:
+
+prime1:
+ 00:e0:e6:81:38:18:3e:c8:98:51:71:2d:5f:22:8c:
+ 93:95:37:17:47:00:4f:6a:87:98:73:8d:f3:c3:02:
+ f7:e1:9d:a0:5c:a5:10:a6:0d:88:5d:e0:72:10:93:
+ 24:af:6e:a4:0e:55:5c:03:37:5f:1d:90:41:c2:d6:
+ e3:a6:ba:20:08:0b:01:31:eb:fc:7e:97:66:3c:fe:
+ b5:ab:4c:0b:2f:18:16:f3:28:47:70:41:dc:cf:04:
+ 9c:7e:28:78:3b:3f:31:cf:b1:77:2c:6d:c9:bf:ad:
+ 19:ff:03:1f:c6:98:9a:60:47:a5:1d:c4:52:c5:9e:
+ 77:5a:cc:a4:e3:96:81:d4:4d:
+
+prime2:
+ 00:d9:d9:0c:6e:81:bb:0e:5d:c6:92:cc:48:70:b8:
+ da:60:e8:56:e7:2a:20:da:29:0f:c9:f0:9f:b8:9f:
+ df:d9:a1:68:7e:ce:3e:7c:f2:00:66:68:79:c4:01:
+ fa:b9:71:3e:73:06:3f:85:5c:83:33:ee:58:77:50:
+ 89:aa:90:33:d0:6c:aa:6f:34:b2:30:8b:e9:a9:82:
+ df:e2:7f:04:09:9f:14:9a:db:c7:cb:e5:85:46:b2:
+ 42:d0:a7:fe:7a:e3:ff:1e:84:9c:36:50:e3:de:fb:
+ 11:1c:34:09:fe:46:db:45:c3:50:19:f1:25:c0:e3:
+ 5c:d5:0d:88:13:e1:9a:5d:17:
+
+coefficient:
+ 00:ca:79:cb:79:87:91:9f:9a:99:0b:5d:c5:78:21:
+ a7:60:c6:8a:2d:a5:b5:87:a2:d6:df:b0:17:5f:bf:
+ e1:ce:f0:ca:89:18:0e:e0:4a:7f:00:e5:41:2d:04:
+ 5b:05:51:e5:08:89:dd:80:82:c7:94:94:1c:f4:0f:
+ 1b:9a:d0:72:83:bb:e9:ca:d5:09:0d:4b:c0:b7:6a:
+ a7:b4:c3:df:4e:f1:7f:0f:57:ad:25:ff:e4:d3:ef:
+ 05:95:31:ca:00:54:97:4b:2d:56:aa:1a:89:d8:a0:
+ d6:dc:64:88:88:36:26:92:39:57:8b:da:18:23:77:
+ c3:e3:39:0e:95:f7:3c:77:fe:
+
+exp1:
+ 00:99:f2:8f:4f:93:a1:1e:74:cd:82:f8:78:df:d0:
+ 74:91:b6:a5:53:6f:cd:ec:f1:26:95:2a:fd:4a:67:
+ 34:c1:16:c2:17:c8:d1:ed:a8:e3:c8:c7:03:ad:7e:
+ db:a4:ce:ca:b4:19:10:24:0f:7a:27:65:80:ee:5b:
+ 64:77:d3:7e:6b:a3:04:cd:64:69:71:4a:37:ac:d6:
+ fa:0a:68:c2:5b:19:55:54:5b:25:13:9d:b2:05:6f:
+ 75:a4:12:15:c3:10:8e:0b:4a:c2:76:02:2d:10:ec:
+ f0:17:94:ce:e2:85:c1:5e:d8:8c:19:25:33:37:9d:
+ 32:bc:4f:cb:2b:12:f2:8a:1d:
+
+exp2:
+ 3e:53:68:c9:1c:f8:a5:6d:92:e8:60:e5:c0:ca:42:
+ 40:43:78:c9:7e:36:13:f4:77:7d:f1:07:e1:4c:6c:
+ 40:d9:7b:09:fc:7b:c8:47:7c:71:d0:26:36:3b:d2:
+ bd:c7:76:74:76:2f:2a:3a:83:97:11:f3:e1:7e:fb:
+ 43:ff:29:b3:d1:c3:19:39:dc:59:23:4e:60:9e:fe:
+ ea:d0:28:19:90:97:d6:8e:56:a5:31:2f:66:40:8d:
+ f9:20:77:20:35:a6:c1:d6:72:d2:df:65:b2:5f:e6:
+ 4f:49:5c:2a:91:9f:1e:60:78:c4:53:47:d7:dd:b4:
+ ab:87:c9:8c:d6:98:d1:55:
+
+
+Public Key ID: F3:3E:4E:38:84:4A:A9:BE:C1:6F:C7:61:A3:50:DA:6E:29:8B:EB:54
+Public key's random art:
++--[ RSA 2048]----+
+| |
+| |
+| |
+| .. . |
+| Eo . S |
+| .+o..+. + |
+| .+o.= oo o |
+|.o.o* o +. |
+|+o+*.. .o. |
++-----------------+
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAv2IR1/gsaJsn+egtVFbMMMbivK+eVzPY8wEXb2flpe9aKkwz
+824nSSrWfRigQmf/ODkNlK2x91kppfPmWkClUREQB3I4d/sHFnzqCkFKmNwtVT4D
+sL47VumgZF6ZjSqTYQD3MDH3VhFj1iKrRMM/aCZXwntD+67sKw6UPXfFbfUORecp
+b7fCZPZFVFYStxgcF7cyH+DADLX5QCEjiLYH1es6FXrdw+ypgwBl+HuLkQ/4gE0J
+LQK5PAKSYeLy0JEBUPovkMXT+r9aPkQBF/9WD6uUPia0ERHbMIT0My84hBrG9d5u
+5gXPnH1ZxKIr8iJOYCydVjYndn21zs2IExwL6wIDAQABAoIBAEUMf/2Yp4USPakX
+kIs2SbNrflCvWASES0jZYvgp1xw4MCLEnZW9b2UhlINLyD5NQTKquvCifmwMek9K
+oRh87GhELLFTD3aSVitR5CrRBbYC8kQn/LLe34/q+Jhd3S6mZsf/zi9QR7mAyrFu
+jrZfb1gHRXCAgrWilcivGOLYfJ2/xanaT68IN5InlBLAlHCQ/+QFi+0YqRk8Rzp8
+/k+cFav2fkgqWNcUZ5a95vqfOlEMY0kU1Z3pqCQZKoPk/uLs2/kTM6bTYtJrfqlb
+k3P1ydCtWBHLd9MTPL83+WSVx0xp8m64NmlXk0oDBliKUT3Wl2EvfHYzFIhRRWhO
+Kf4SQ2kCgYEA4OaBOBg+yJhRcS1fIoyTlTcXRwBPaoeYc43zwwL34Z2gXKUQpg2I
+XeByEJMkr26kDlVcAzdfHZBBwtbjprogCAsBMev8fpdmPP61q0wLLxgW8yhHcEHc
+zwScfih4Oz8xz7F3LG3Jv60Z/wMfxpiaYEelHcRSxZ53Wsyk45aB1E0CgYEA2dkM
+boG7Dl3GksxIcLjaYOhW5yog2ikPyfCfuJ/f2aFofs4+fPIAZmh5xAH6uXE+cwY/
+hVyDM+5Yd1CJqpAz0GyqbzSyMIvpqYLf4n8ECZ8UmtvHy+WFRrJC0Kf+euP/HoSc
+NlDj3vsRHDQJ/kbbRcNQGfElwONc1Q2IE+GaXRcCgYEAmfKPT5OhHnTNgvh439B0
+kbalU2/N7PEmlSr9Smc0wRbCF8jR7ajjyMcDrX7bpM7KtBkQJA96J2WA7ltkd9N+
+a6MEzWRpcUo3rNb6CmjCWxlVVFslE52yBW91pBIVwxCOC0rCdgItEOzwF5TO4oXB
+XtiMGSUzN50yvE/LKxLyih0CgYA+U2jJHPilbZLoYOXAykJAQ3jJfjYT9Hd98Qfh
+TGxA2XsJ/HvIR3xx0CY2O9K9x3Z0di8qOoOXEfPhfvtD/ymz0cMZOdxZI05gnv7q
+0CgZkJfWjlalMS9mQI35IHcgNabB1nLS32WyX+ZPSVwqkZ8eYHjEU0fX3bSrh8mM
+1pjRVQKBgQDKect5h5GfmpkLXcV4IadgxootpbWHotbfsBdfv+HO8MqJGA7gSn8A
+5UEtBFsFUeUIid2AgseUlBz0Dxua0HKDu+nK1QkNS8C3aqe0w99O8X8PV60l/+TT
+7wWVMcoAVJdLLVaqGonYoNbcZIiINiaSOVeL2hgjd8PjOQ6V9zx3/g==
+-----END RSA PRIVATE KEY-----
diff --git a/testenv/certs/ca-template.cfg b/testenv/certs/ca-template.cfg
new file mode 100644
index 0000000..087cd70
--- /dev/null
+++ b/testenv/certs/ca-template.cfg
@@ -0,0 +1,246 @@
+# X.509 Certificate options
+#
+# DN options
+
+# The organization of the subject.
+organization = "GNU"
+
+# The organizational unit of the subject.
+unit = "Wget"
+
+# The locality of the subject.
+# locality =
+
+# The state of the certificate owner.
+# state = ""
+
+# The country of the subject. Two letter code.
+# country = GR
+
+# The common name of the certificate owner.
+cn = "GNU Wget"
+
+# A user id of the certificate owner.
+#uid = ""
+
+# Set domain components
+#dc = "name"
+#dc = "domain"
+
+# If the supported DN OIDs are not adequate you can set
+# any OID here.
+# For example set the X.520 Title and the X.520 Pseudonym
+# by using OID and string pairs.
+#dn_oid = 2.5.4.12 Dr.
+#dn_oid = 2.5.4.65 jackal
+
+# This is deprecated and should not be used in new
+# certificates.
+# pkcs9_email = "bug-wget@gnu.org"
+
+# An alternative way to set the certificate's distinguished name directly
+# is with the "dn" option. The attribute names allowed are:
+# C (country), street, O (organization), OU (unit), title, CN (common name),
+# L (locality), ST (state), placeOfBirth, gender, countryOfCitizenship,
+# countryOfResidence, serialNumber, telephoneNumber, surName, initials,
+# generationQualifier, givenName, pseudonym, dnQualifier, postalCode, name,
+# businessCategory, DC, UID, jurisdictionOfIncorporationLocalityName,
+# jurisdictionOfIncorporationStateOrProvinceName,
+# jurisdictionOfIncorporationCountryName, XmppAddr, and numeric OIDs.
+
+#dn = "cn = Nikos,st = New Something,C=GR,surName=Mavrogiannopoulos,2.5.4.9=Arkadias"
+
+# The serial number of the certificate
+# Comment the field for a time-based serial number.
+# serial = 007
+
+# In how many days, counting from today, this certificate will expire.
+# Use -1 if there is no expiration date.
+expiration_days = -1
+
+# Alternatively you may set concrete dates and time. The GNU date string
+# formats are accepted. See:
+# http://www.gnu.org/software/tar/manual/html_node/Date-input-formats.html
+
+#activation_date = "2004-02-29 16:21:42"
+#expiration_date = "2025-02-29 16:24:41"
+
+# X.509 v3 extensions
+
+# A dnsname in case of a WWW server.
+#dns_name = "www.none.org"
+#dns_name = "www.morethanone.org"
+
+# A subject alternative name URI
+#uri = "http://www.example.com"
+
+# An IP address in case of a server.
+#ip_address = "192.168.1.1"
+
+# An email in case of a person
+# email = "none@none.org"
+
+# Challenge password used in certificate requests
+challenge_password = 123456
+
+# Password when encrypting a private key
+#password = secret
+
+# An URL that has CRLs (certificate revocation lists)
+# available. Needed in CA certificates.
+#crl_dist_points = "http://www.getcrl.crl/getcrl/"
+
+# Whether this is a CA certificate or not
+ca
+
+# Subject Unique ID (in hex)
+#subject_unique_id = 00153224
+
+# Issuer Unique ID (in hex)
+#issuer_unique_id = 00153225
+
+#### Key usage
+
+# The following key usage flags are used by CAs and end certificates
+
+# Whether this certificate will be used to sign data (needed
+# in TLS DHE ciphersuites). This is the digitalSignature flag
+# in RFC5280 terminology.
+# signing_key
+
+# Whether this certificate will be used to encrypt data (needed
+# in TLS RSA ciphersuites). Note that it is preferred to use different
+# keys for encryption and signing. This is the keyEncipherment flag
+# in RFC5280 terminology.
+# encryption_key
+
+# Whether this key will be used to sign other certificates. The
+# keyCertSign flag in RFC5280 terminology.
+cert_signing_key
+
+# Whether this key will be used to sign CRLs. The
+# cRLSign flag in RFC5280 terminology.
+crl_signing_key
+
+# The keyAgreement flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#key_agreement
+
+# The dataEncipherment flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#data_encipherment
+
+# The nonRepudiation flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#non_repudiation
+
+#### Extended key usage (key purposes)
+
+# The following extensions are used in an end certificate
+# to clarify its purpose. Some CAs also use it to indicate
+# the types of certificates they are purposed to sign.
+
+# Whether this certificate will be used for a TLS client;
+# this sets the id-kp-serverAuth (1.3.6.1.5.5.7.3.1) of
+# extended key usage.
+#tls_www_client
+
+# Whether this certificate will be used for a TLS server;
+# This sets the id-kp-clientAuth (1.3.6.1.5.5.7.3.2) of
+# extended key usage.
+#tls_www_server
+
+# Whether this key will be used to sign code. This sets the
+# id-kp-codeSigning (1.3.6.1.5.5.7.3.3) of extended key usage
+# extension.
+#code_signing_key
+
+# Whether this key will be used to sign OCSP data. This sets the
+# id-kp-OCSPSigning (1.3.6.1.5.5.7.3.9) of extended key usage extension.
+#ocsp_signing_key
+
+# Whether this key will be used for time stamping. This sets the
+# id-kp-timeStamping (1.3.6.1.5.5.7.3.8) of extended key usage extension.
+#time_stamping_key
+
+# Whether this key will be used for email protection. This sets the
+# id-kp-emailProtection (1.3.6.1.5.5.7.3.4) of extended key usage extension.
+#email_protection_key
+
+# Whether this key will be used for IPsec IKE operations (1.3.6.1.5.5.7.3.17).
+#ipsec_ike_key
+
+## adding custom key purpose OIDs
+
+# for microsoft smart card logon
+# key_purpose_oid = 1.3.6.1.4.1.311.20.2.2
+
+# for email protection
+# key_purpose_oid = 1.3.6.1.5.5.7.3.4
+
+# for any purpose (must not be used in intermediate CA certificates)
+# key_purpose_oid = 2.5.29.37.0
+
+### end of key purpose OIDs
+
+# When generating a certificate from a certificate
+# request, then honor the extensions stored in the request
+# and store them in the real certificate.
+honor_crq_extensions
+
+# Path length constraint. Sets the maximum number of
+# certificates that can be used to certify this certificate.
+# (i.e. the certificate chain length)
+#path_len = -1
+#path_len = 2
+
+# OCSP URI
+# ocsp_uri = http://my.ocsp.server/ocsp
+
+# CA issuers URI
+# ca_issuers_uri = http://my.ca.issuer
+
+# Certificate policies
+#policy1 = 1.3.6.1.4.1.5484.1.10.99.1.0
+#policy1_txt = "This is a long policy to summarize"
+#policy1_url = http://www.example.com/a-policy-to-read
+
+#policy2 = 1.3.6.1.4.1.5484.1.10.99.1.1
+#policy2_txt = "This is a short policy"
+#policy2_url = http://www.example.com/another-policy-to-read
+
+# Name constraints
+
+# DNS
+#nc_permit_dns = example.com
+#nc_exclude_dns = test.example.com
+
+# EMAIL
+#nc_permit_email = "nmav@ex.net"
+
+# Exclude subdomains of example.com
+#nc_exclude_email = .example.com
+
+# Exclude all e-mail addresses of example.com
+#nc_exclude_email = example.com
+
+# Options for proxy certificates
+#proxy_policy_language = 1.3.6.1.5.5.7.21.1
+
+# Options for generating a CRL
+
+# The number of days the next CRL update will be due.
+# next CRL update will be in 43 days
+#crl_next_update = 43
+
+# this is the 5th CRL by this CA
+# Comment the field for a time-based number.
+#crl_number = 5
+
+# Specify the update dates more precisely.
+#crl_this_update_date = "2004-02-29 16:21:42"
+#crl_next_update_date = "2025-02-29 16:24:41"
+
+# The date that the certificates will be made seen as
+# being revoked.
+#crl_revocation_date = "2025-02-29 16:24:41"
diff --git a/testenv/certs/make_ca.sh b/testenv/certs/make_ca.sh
new file mode 100755
index 0000000..f9b5676
--- /dev/null
+++ b/testenv/certs/make_ca.sh
@@ -0,0 +1,23 @@
+#!/bin/sh -e
+
+# create a self signed CA certificate
+certtool --generate-privkey --outfile ca-key.pem
+certtool --generate-self-signed --load-privkey ca-key.pem --template=ca-template.cfg --outfile ca-cert.pem
+
+# create the server RSA private key
+certtool --generate-privkey --outfile server-key.pem --rsa
+
+# generate a server certificate using the private key only
+certtool --generate-certificate --load-privkey server-key.pem --template=server-template.cfg --outfile server-cert.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem
+
+# create a CRL for the server certificate
+certtool --generate-crl --load-ca-privkey ca-key.pem --load-ca-certificate ca-cert.pem --load-certificate server-cert.pem --outfile server-crl.pem --template=server-template.cfg
+
+# generate a public key in PEM format
+openssl x509 -noout -pubkey < server-cert.pem > server-pubkey.pem
+
+# generate a public key in DER format
+openssl x509 -noout -pubkey < server-cert.pem | openssl asn1parse -noout -inform pem -out server-pubkey.der
+
+# generate a sha256 hash of the public key
+openssl x509 -noout -pubkey < server-cert.pem | openssl asn1parse -noout -inform pem -out /dev/stdout | openssl dgst -sha256 -binary | openssl base64 > server-pubkey-sha256.base64
diff --git a/testenv/certs/server-cert.pem b/testenv/certs/server-cert.pem
new file mode 100644
index 0000000..c9f474a
--- /dev/null
+++ b/testenv/certs/server-cert.pem
@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIMWWD1GB1UFkEICdQvMA0GCSqGSIb3DQEBCwUAMDAxETAP
+BgNVBAMTCEdOVSBXZ2V0MQ0wCwYDVQQLEwRXZ2V0MQwwCgYDVQQKEwNHTlUwIBcN
+MTcwNzA4MTUwNzA0WhgPOTk5OTEyMzEyMzU5NTlaMDExEjAQBgNVBAMTCTEyNy4w
+LjAuMTENMAsGA1UECxMEV2dldDEMMAoGA1UEChMDR05VMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAyMLca3nkR9K2XqYTfvX6kPf9ylHkwvGR1sGyzkyU
+g/ZMOGI84i0teaXyjGzgGNSbfB+fcZX2IkuZvNshYv7SRtGRDYsI8pR/4KWffPZk
+T6tfB1aVPyBV+/nU6l+SnaUsNVSot80pEZCCK+NIKYupjYup4HRJpU2+5oPcSmpn
+IgfQTlJmCOoEeBFG28aRzLSs6anlIjY0BIu6BSKhdr04taOlgPCh2x3cRGUvQMnV
+olbxMLxOqLHiLSixbNqv4tcEiKfRC9qv3+5Ec3SnWSrenReA0cqpamJNPnj5ZjHs
+96a/ipFfPXWzCInNQv4/DUO6tD2yZvMOACzPtXYUmdR4JwIDAQABo4GNMIGKMAwG
+A1UdEwEB/wQCMAAwFAYDVR0RBA0wC4IJbG9jYWxob3N0MBMGA1UdJQQMMAoGCCsG
+AQUFBwMBMA8GA1UdDwEB/wQFAwMHoAAwHQYDVR0OBBYEFJfm323LJbKTM/tMKSt0
+qlUqewbnMB8GA1UdIwQYMBaAFPM+TjiESqm+wW/HYaNQ2m4pi+tUMA0GCSqGSIb3
+DQEBCwUAA4IBAQC1a0NQfmqT8Ky/BFo5H+G+GoQTlqi3J83ujAMdLUD57zYCEyDL
+XzAhMPfrOSLPDcQb0ooD1Ie+Rz8Xs1h00cD2OGKwH479+nisF5ksqJVJ4fn/aNFE
+6W2Xb3MCB+4FRdmy0UeDDA6N2OpVskCM30s9tmovlBLVK46HogdLvy/O1o7z/gbx
+vV8luevxobnevZ3NdWLyVE3BJZiThBHmZUvL1XNy4KAR4wDAkbCwoTN/JkehTu0i
+WR6DaG7N7M6psc7rctfzRqimlAkxnoAUwc8LwNLTB3v613xXX8iSUsLKsh6pQfZR
+e5wnYQIS4MzowvDx8WevTPMRKlN72d8HHuv9
+-----END CERTIFICATE-----
diff --git a/testenv/certs/server-crl.pem b/testenv/certs/server-crl.pem
new file mode 100644
index 0000000..ca70479
--- /dev/null
+++ b/testenv/certs/server-crl.pem
@@ -0,0 +1,12 @@
+-----BEGIN X509 CRL-----
+MIIB1jCBvwIBATANBgkqhkiG9w0BAQsFADAwMREwDwYDVQQDEwhHTlUgV2dldDEN
+MAsGA1UECxMEV2dldDEMMAoGA1UEChMDR05VFw0xNzA3MDgxNTA3MDRaFw0xODA3
+MDgxNTA3MDRaMB8wHQIMWWD1GB1UFkEICdQvFw0xNzA3MDgxNTA3MDRaoDowODAf
+BgNVHSMEGDAWgBTzPk44hEqpvsFvx2GjUNpuKYvrVDAVBgNVHRQEDgIMWWD1GB4C
+YfERSnyEMA0GCSqGSIb3DQEBCwUAA4IBAQAAKu+Lum1l/XtcCJ43WveouPK97iOE
+bjUZWaGYx8Ys/iBdhTa1GXG+E+JuyqgyHTW0HrWJi1D+GiYmsjPJXoEgVgtxXEQ7
+8b3NyIQ8OCsSTTlVCmLECN9R0xlsitzH+HXOaIEs5sbmIxCnxu+brqno9gQocmCv
+LHYvoSxsSsOCkkmodbYtKssl2dBonvQPSijN/z3NhZ259e2U3Yv4V7/MrEoTvOxg
+M0GC0u0Nx86EWbq0sWeiUu270Qk9En5YGNtRhkeq0bXerJswmMAmvrtuKdyfouny
+4WMvtn30xsO3WwWSV2oyrDSN/IQdDbcmul/bg8ewqlnN77cVf2m70c/W
+-----END X509 CRL-----
diff --git a/testenv/certs/server-key.pem b/testenv/certs/server-key.pem
new file mode 100644
index 0000000..80d61cc
--- /dev/null
+++ b/testenv/certs/server-key.pem
@@ -0,0 +1,144 @@
+Public Key Info:
+ Public Key Algorithm: RSA
+ Key Security Level: Medium (2048 bits)
+
+modulus:
+ 00:c8:c2:dc:6b:79:e4:47:d2:b6:5e:a6:13:7e:f5:
+ fa:90:f7:fd:ca:51:e4:c2:f1:91:d6:c1:b2:ce:4c:
+ 94:83:f6:4c:38:62:3c:e2:2d:2d:79:a5:f2:8c:6c:
+ e0:18:d4:9b:7c:1f:9f:71:95:f6:22:4b:99:bc:db:
+ 21:62:fe:d2:46:d1:91:0d:8b:08:f2:94:7f:e0:a5:
+ 9f:7c:f6:64:4f:ab:5f:07:56:95:3f:20:55:fb:f9:
+ d4:ea:5f:92:9d:a5:2c:35:54:a8:b7:cd:29:11:90:
+ 82:2b:e3:48:29:8b:a9:8d:8b:a9:e0:74:49:a5:4d:
+ be:e6:83:dc:4a:6a:67:22:07:d0:4e:52:66:08:ea:
+ 04:78:11:46:db:c6:91:cc:b4:ac:e9:a9:e5:22:36:
+ 34:04:8b:ba:05:22:a1:76:bd:38:b5:a3:a5:80:f0:
+ a1:db:1d:dc:44:65:2f:40:c9:d5:a2:56:f1:30:bc:
+ 4e:a8:b1:e2:2d:28:b1:6c:da:af:e2:d7:04:88:a7:
+ d1:0b:da:af:df:ee:44:73:74:a7:59:2a:de:9d:17:
+ 80:d1:ca:a9:6a:62:4d:3e:78:f9:66:31:ec:f7:a6:
+ bf:8a:91:5f:3d:75:b3:08:89:cd:42:fe:3f:0d:43:
+ ba:b4:3d:b2:66:f3:0e:00:2c:cf:b5:76:14:99:d4:
+ 78:27:
+
+public exponent:
+ 01:00:01:
+
+private exponent:
+ 00:92:80:1f:f9:0d:e9:d7:bf:9b:f5:55:9b:c4:7a:
+ 1b:6e:ce:89:14:aa:ce:14:b3:d3:88:b3:b0:97:7a:
+ aa:a5:e1:85:9d:5f:92:ae:39:e9:85:6b:e3:a3:35:
+ 90:12:8e:93:27:f0:ab:99:67:a5:45:41:85:de:9a:
+ c9:b2:43:e1:8e:6c:3f:3d:72:c8:04:bc:f8:d4:26:
+ 08:4c:58:40:bb:22:83:26:07:b8:c1:68:07:56:e8:
+ e8:c6:5f:17:ce:92:49:c0:61:16:fd:89:68:fe:b8:
+ 45:45:61:85:b7:4b:83:5f:17:1b:cf:ff:0b:fe:e4:
+ cc:f9:ca:1f:66:ee:5e:74:25:94:7a:27:0e:0f:43:
+ 50:14:48:ad:c6:8a:e1:ac:ff:8e:10:ed:e6:92:48:
+ c8:94:c1:3a:2c:db:86:71:66:8e:19:93:13:ed:f9:
+ 47:06:5e:8b:e2:2e:cb:3a:c2:b3:5e:8d:31:e4:c5:
+ a7:cd:3f:09:70:e4:02:5d:34:2a:4d:b7:f5:06:e2:
+ f5:3b:8f:b6:ad:4a:22:b8:fe:43:a7:4d:67:ef:c3:
+ e1:ed:83:e2:d5:f2:d0:37:0f:56:ab:5b:47:69:0a:
+ 14:03:2c:43:a3:73:e9:05:72:5e:df:68:9c:67:4b:
+ 08:64:2d:c2:67:23:aa:e5:35:88:56:99:95:17:60:
+ 20:01:
+
+prime1:
+ 00:ea:ca:12:86:c0:25:b8:ab:fd:44:2c:1a:3f:1b:
+ 19:68:d4:26:6e:9c:ad:6d:35:12:29:9f:40:c2:4c:
+ 96:ef:8b:08:61:39:08:b7:8a:1f:81:97:71:ff:af:
+ 5a:5b:db:9a:2f:2f:29:ab:92:bb:c5:51:a2:84:c5:
+ f4:88:79:ac:a2:b8:17:1e:4a:66:62:be:e5:ab:fd:
+ 01:42:6b:16:f9:73:7b:cd:3e:f7:5c:5c:95:dd:79:
+ 73:c4:60:a8:cf:95:80:ba:7d:02:14:9c:7e:58:4f:
+ 8c:08:2c:b8:46:31:23:b2:1a:c3:38:78:5c:ea:50:
+ 9d:42:23:31:30:9a:0f:3f:27:
+
+prime2:
+ 00:da:e5:d3:66:0f:34:53:8c:e8:bf:5f:1e:46:93:
+ 47:df:30:57:be:1f:30:6a:7e:e9:f0:6b:3f:61:89:
+ 51:e2:0b:da:51:09:65:f6:23:3a:61:86:02:46:0a:
+ cf:11:73:7c:2d:65:bd:64:b8:0e:24:d2:b7:51:8f:
+ 39:b4:a2:1b:e4:9a:bc:66:31:e2:00:eb:3e:20:06:
+ 97:0a:a0:bb:82:da:bf:d5:e9:20:77:a7:55:86:69:
+ ce:eb:38:d3:f4:ad:82:9e:ce:02:05:c5:11:aa:c0:
+ b9:66:6f:e7:f4:26:57:72:fa:50:0b:ad:76:44:86:
+ e0:3e:f7:c0:3e:f3:94:9f:01:
+
+coefficient:
+ 00:94:f2:42:a9:1a:62:1c:7a:bf:34:1b:a7:87:ae:
+ bd:3a:d9:f1:8c:4e:f6:f5:27:5a:ae:f1:1e:15:06:
+ a6:d0:e4:e0:ec:3a:40:02:13:b9:31:9a:cd:3a:c6:
+ 34:7d:c6:9d:9e:60:5b:ca:03:88:87:56:f0:e1:ea:
+ 37:96:2b:53:40:b2:78:4e:80:e2:e0:24:8c:83:0e:
+ f8:77:a4:64:d5:cc:09:6c:d6:52:49:f9:55:61:16:
+ 72:b5:d2:ea:e1:61:fb:31:24:f0:30:8c:fe:5c:29:
+ 71:06:09:11:4d:ef:51:a6:33:62:54:d2:c7:de:ba:
+ 78:17:b1:27:50:f4:ef:c4:3a:
+
+exp1:
+ 1f:36:0d:90:6c:2a:97:8a:05:78:f2:83:ea:af:a7:
+ 89:0f:ea:ab:f9:97:f4:54:81:bd:96:b5:fd:1e:41:
+ 52:46:a1:2e:8b:6e:65:37:af:48:82:e1:5c:a3:ea:
+ d7:1b:32:3b:e3:81:1e:95:ba:f0:58:11:ca:a4:a6:
+ 05:1e:67:9c:99:ec:38:d2:9b:19:b5:56:c2:ae:37:
+ 64:a4:e7:c0:f1:61:1b:bf:ab:12:54:1c:77:fc:95:
+ 2f:1d:ca:53:0e:04:b6:c5:b7:69:16:04:95:a8:bd:
+ 6c:b8:c5:26:4f:91:f7:33:27:90:72:2f:a7:d6:5f:
+ 91:53:2c:4e:d1:ac:05:31:
+
+exp2:
+ 00:83:a4:55:a6:fa:1b:d8:e7:54:0d:ca:f1:55:36:
+ 3b:b1:f0:cb:c3:cd:d3:fb:27:ca:1e:c9:10:bb:e2:
+ ae:78:c7:f2:0a:6c:21:82:8e:1b:0d:0d:5f:8e:a9:
+ ef:6f:aa:49:12:b0:2d:df:45:85:54:05:d9:33:56:
+ 74:38:ba:89:15:c9:2c:e6:34:b7:9b:1f:de:23:ba:
+ 72:d9:74:62:70:46:87:b9:e8:52:9b:42:e9:ff:44:
+ e0:a8:bb:6b:54:a9:88:75:62:a4:fa:bd:52:6b:a3:
+ 2d:9c:7a:4e:3f:99:53:5c:15:47:50:4e:88:62:9b:
+ ce:7e:6f:d6:90:c5:42:2b:01:
+
+
+Public Key ID: 97:E6:DF:6D:CB:25:B2:93:33:FB:4C:29:2B:74:AA:55:2A:7B:06:E7
+Public key's random art:
++--[ RSA 2048]----+
+| |
+| |
+| |
+| . |
+| S + . |
+| .+oo. . |
+| .=+oo.+ .|
+| +E.=O.oo|
+| o+ .=*++o|
++-----------------+
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEAyMLca3nkR9K2XqYTfvX6kPf9ylHkwvGR1sGyzkyUg/ZMOGI8
+4i0teaXyjGzgGNSbfB+fcZX2IkuZvNshYv7SRtGRDYsI8pR/4KWffPZkT6tfB1aV
+PyBV+/nU6l+SnaUsNVSot80pEZCCK+NIKYupjYup4HRJpU2+5oPcSmpnIgfQTlJm
+COoEeBFG28aRzLSs6anlIjY0BIu6BSKhdr04taOlgPCh2x3cRGUvQMnVolbxMLxO
+qLHiLSixbNqv4tcEiKfRC9qv3+5Ec3SnWSrenReA0cqpamJNPnj5ZjHs96a/ipFf
+PXWzCInNQv4/DUO6tD2yZvMOACzPtXYUmdR4JwIDAQABAoIBAQCSgB/5DenXv5v1
+VZvEehtuzokUqs4Us9OIs7CXeqql4YWdX5KuOemFa+OjNZASjpMn8KuZZ6VFQYXe
+msmyQ+GObD89csgEvPjUJghMWEC7IoMmB7jBaAdW6OjGXxfOkknAYRb9iWj+uEVF
+YYW3S4NfFxvP/wv+5Mz5yh9m7l50JZR6Jw4PQ1AUSK3GiuGs/44Q7eaSSMiUwTos
+24ZxZo4ZkxPt+UcGXoviLss6wrNejTHkxafNPwlw5AJdNCpNt/UG4vU7j7atSiK4
+/kOnTWfvw+Htg+LV8tA3D1arW0dpChQDLEOjc+kFcl7faJxnSwhkLcJnI6rlNYhW
+mZUXYCABAoGBAOrKEobAJbir/UQsGj8bGWjUJm6crW01EimfQMJMlu+LCGE5CLeK
+H4GXcf+vWlvbmi8vKauSu8VRooTF9Ih5rKK4Fx5KZmK+5av9AUJrFvlze80+91xc
+ld15c8RgqM+VgLp9AhScflhPjAgsuEYxI7Iawzh4XOpQnUIjMTCaDz8nAoGBANrl
+02YPNFOM6L9fHkaTR98wV74fMGp+6fBrP2GJUeIL2lEJZfYjOmGGAkYKzxFzfC1l
+vWS4DiTSt1GPObSiG+SavGYx4gDrPiAGlwqgu4Lav9XpIHenVYZpzus40/Stgp7O
+AgXFEarAuWZv5/QmV3L6UAutdkSG4D73wD7zlJ8BAoGAHzYNkGwql4oFePKD6q+n
+iQ/qq/mX9FSBvZa1/R5BUkahLotuZTevSILhXKPq1xsyO+OBHpW68FgRyqSmBR5n
+nJnsONKbGbVWwq43ZKTnwPFhG7+rElQcd/yVLx3KUw4EtsW3aRYElai9bLjFJk+R
+9zMnkHIvp9ZfkVMsTtGsBTECgYEAg6RVpvob2OdUDcrxVTY7sfDLw83T+yfKHskQ
+u+KueMfyCmwhgo4bDQ1fjqnvb6pJErAt30WFVAXZM1Z0OLqJFcks5jS3mx/eI7py
+2XRicEaHuehSm0Lp/0TgqLtrVKmIdWKk+r1Sa6MtnHpOP5lTXBVHUE6IYpvOfm/W
+kMVCKwECgYEAlPJCqRpiHHq/NBunh669OtnxjE729SdarvEeFQam0OTg7DpAAhO5
+MZrNOsY0fcadnmBbygOIh1bw4eo3litTQLJ4ToDi4CSMgw74d6Rk1cwJbNZSSflV
+YRZytdLq4WH7MSTwMIz+XClxBgkRTe9RpjNiVNLH3rp4F7EnUPTvxDo=
+-----END RSA PRIVATE KEY-----
diff --git a/testenv/certs/server-pubkey-sha256.base64 b/testenv/certs/server-pubkey-sha256.base64
new file mode 100644
index 0000000..6c24e4f
--- /dev/null
+++ b/testenv/certs/server-pubkey-sha256.base64
@@ -0,0 +1 @@
+mHiEhWHvusnzP7COZk+SzSJ+Gl7nZT+ADx0PUnDD7mM=
diff --git a/testenv/certs/server-pubkey.der b/testenv/certs/server-pubkey.der
new file mode 100644
index 0000000..6db082a
--- /dev/null
+++ b/testenv/certs/server-pubkey.der
Binary files differ
diff --git a/testenv/certs/server-pubkey.pem b/testenv/certs/server-pubkey.pem
new file mode 100644
index 0000000..44a3628
--- /dev/null
+++ b/testenv/certs/server-pubkey.pem
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyMLca3nkR9K2XqYTfvX6
+kPf9ylHkwvGR1sGyzkyUg/ZMOGI84i0teaXyjGzgGNSbfB+fcZX2IkuZvNshYv7S
+RtGRDYsI8pR/4KWffPZkT6tfB1aVPyBV+/nU6l+SnaUsNVSot80pEZCCK+NIKYup
+jYup4HRJpU2+5oPcSmpnIgfQTlJmCOoEeBFG28aRzLSs6anlIjY0BIu6BSKhdr04
+taOlgPCh2x3cRGUvQMnVolbxMLxOqLHiLSixbNqv4tcEiKfRC9qv3+5Ec3SnWSre
+nReA0cqpamJNPnj5ZjHs96a/ipFfPXWzCInNQv4/DUO6tD2yZvMOACzPtXYUmdR4
+JwIDAQAB
+-----END PUBLIC KEY-----
diff --git a/testenv/certs/server-template.cfg b/testenv/certs/server-template.cfg
new file mode 100644
index 0000000..00389aa
--- /dev/null
+++ b/testenv/certs/server-template.cfg
@@ -0,0 +1,245 @@
+# X.509 Certificate options
+#
+# DN options
+
+# The organization of the subject.
+organization = "GNU"
+
+# The organizational unit of the subject.
+unit = "Wget"
+
+# The locality of the subject.
+# locality =
+
+# The state of the certificate owner.
+# state = ""
+
+# The country of the subject. Two letter code.
+# country = GR
+
+# The common name of the certificate owner.
+cn = "127.0.0.1"
+
+# A user id of the certificate owner.
+#uid = ""
+
+# Set domain components
+#dc = "name"
+#dc = "domain"
+
+# If the supported DN OIDs are not adequate you can set
+# any OID here.
+# For example set the X.520 Title and the X.520 Pseudonym
+# by using OID and string pairs.
+#dn_oid = 2.5.4.12 Dr.
+#dn_oid = 2.5.4.65 jackal
+
+# This is deprecated and should not be used in new
+# certificates.
+# pkcs9_email = "bug-wget@gnu.org"
+
+# An alternative way to set the certificate's distinguished name directly
+# is with the "dn" option. The attribute names allowed are:
+# C (country), street, O (organization), OU (unit), title, CN (common name),
+# L (locality), ST (state), placeOfBirth, gender, countryOfCitizenship,
+# countryOfResidence, serialNumber, telephoneNumber, surName, initials,
+# generationQualifier, givenName, pseudonym, dnQualifier, postalCode, name,
+# businessCategory, DC, UID, jurisdictionOfIncorporationLocalityName,
+# jurisdictionOfIncorporationStateOrProvinceName,
+# jurisdictionOfIncorporationCountryName, XmppAddr, and numeric OIDs.
+
+#dn = "cn = Nikos,st = New Something,C=GR,surName=Mavrogiannopoulos,2.5.4.9=Arkadias"
+
+# The serial number of the certificate
+# Comment the field for a time-based serial number.
+# serial = 007
+
+# In how many days, counting from today, this certificate will expire.
+# Use -1 if there is no expiration date.
+expiration_days = -1
+
+# Alternatively you may set concrete dates and time. The GNU date string
+# formats are accepted. See:
+# http://www.gnu.org/software/tar/manual/html_node/Date-input-formats.html
+
+#activation_date = "2004-02-29 16:21:42"
+#expiration_date = "2025-02-29 16:24:41"
+
+# X.509 v3 extensions
+
+# A dnsname in case of a WWW server.
+dns_name = "localhost"
+
+# A subject alternative name URI
+#uri = "http://www.example.com"
+
+# An IP address in case of a server.
+# ip_address = "127.0.0.1"
+
+# An email in case of a person
+# email = "none@none.org"
+
+# Challenge password used in certificate requests
+challenge_password = 123456
+
+# Password when encrypting a private key
+#password = secret
+
+# An URL that has CRLs (certificate revocation lists)
+# available. Needed in CA certificates.
+#crl_dist_points = "http://www.getcrl.crl/getcrl/"
+
+# Whether this is a CA certificate or not
+# ca
+
+# Subject Unique ID (in hex)
+#subject_unique_id = 00153224
+
+# Issuer Unique ID (in hex)
+#issuer_unique_id = 00153225
+
+#### Key usage
+
+# The following key usage flags are used by CAs and end certificates
+
+# Whether this certificate will be used to sign data (needed
+# in TLS DHE ciphersuites). This is the digitalSignature flag
+# in RFC5280 terminology.
+signing_key
+
+# Whether this certificate will be used to encrypt data (needed
+# in TLS RSA ciphersuites). Note that it is preferred to use different
+# keys for encryption and signing. This is the keyEncipherment flag
+# in RFC5280 terminology.
+encryption_key
+
+# Whether this key will be used to sign other certificates. The
+# keyCertSign flag in RFC5280 terminology.
+# cert_signing_key
+
+# Whether this key will be used to sign CRLs. The
+# cRLSign flag in RFC5280 terminology.
+# crl_signing_key
+
+# The keyAgreement flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#key_agreement
+
+# The dataEncipherment flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#data_encipherment
+
+# The nonRepudiation flag of RFC5280. It's purpose is loosely
+# defined. Not use it unless required by a protocol.
+#non_repudiation
+
+#### Extended key usage (key purposes)
+
+# The following extensions are used in an end certificate
+# to clarify its purpose. Some CAs also use it to indicate
+# the types of certificates they are purposed to sign.
+
+# Whether this certificate will be used for a TLS client;
+# this sets the id-kp-serverAuth (1.3.6.1.5.5.7.3.1) of
+# extended key usage.
+#tls_www_client
+
+# Whether this certificate will be used for a TLS server;
+# This sets the id-kp-clientAuth (1.3.6.1.5.5.7.3.2) of
+# extended key usage.
+tls_www_server
+
+# Whether this key will be used to sign code. This sets the
+# id-kp-codeSigning (1.3.6.1.5.5.7.3.3) of extended key usage
+# extension.
+#code_signing_key
+
+# Whether this key will be used to sign OCSP data. This sets the
+# id-kp-OCSPSigning (1.3.6.1.5.5.7.3.9) of extended key usage extension.
+#ocsp_signing_key
+
+# Whether this key will be used for time stamping. This sets the
+# id-kp-timeStamping (1.3.6.1.5.5.7.3.8) of extended key usage extension.
+#time_stamping_key
+
+# Whether this key will be used for email protection. This sets the
+# id-kp-emailProtection (1.3.6.1.5.5.7.3.4) of extended key usage extension.
+#email_protection_key
+
+# Whether this key will be used for IPsec IKE operations (1.3.6.1.5.5.7.3.17).
+#ipsec_ike_key
+
+## adding custom key purpose OIDs
+
+# for microsoft smart card logon
+# key_purpose_oid = 1.3.6.1.4.1.311.20.2.2
+
+# for email protection
+# key_purpose_oid = 1.3.6.1.5.5.7.3.4
+
+# for any purpose (must not be used in intermediate CA certificates)
+# key_purpose_oid = 2.5.29.37.0
+
+### end of key purpose OIDs
+
+# When generating a certificate from a certificate
+# request, then honor the extensions stored in the request
+# and store them in the real certificate.
+honor_crq_extensions
+
+# Path length constraint. Sets the maximum number of
+# certificates that can be used to certify this certificate.
+# (i.e. the certificate chain length)
+#path_len = -1
+#path_len = 2
+
+# OCSP URI
+# ocsp_uri = http://my.ocsp.server/ocsp
+
+# CA issuers URI
+# ca_issuers_uri = http://my.ca.issuer
+
+# Certificate policies
+#policy1 = 1.3.6.1.4.1.5484.1.10.99.1.0
+#policy1_txt = "This is a long policy to summarize"
+#policy1_url = http://www.example.com/a-policy-to-read
+
+#policy2 = 1.3.6.1.4.1.5484.1.10.99.1.1
+#policy2_txt = "This is a short policy"
+#policy2_url = http://www.example.com/another-policy-to-read
+
+# Name constraints
+
+# DNS
+#nc_permit_dns = example.com
+#nc_exclude_dns = test.example.com
+
+# EMAIL
+#nc_permit_email = "nmav@ex.net"
+
+# Exclude subdomains of example.com
+#nc_exclude_email = .example.com
+
+# Exclude all e-mail addresses of example.com
+#nc_exclude_email = example.com
+
+# Options for proxy certificates
+#proxy_policy_language = 1.3.6.1.5.5.7.21.1
+
+# Options for generating a CRL
+
+# The number of days the next CRL update will be due.
+# next CRL update will be in 43 days
+#crl_next_update = 43
+
+# this is the 5th CRL by this CA
+# Comment the field for a time-based number.
+#crl_number = 5
+
+# Specify the update dates more precisely.
+#crl_this_update_date = "2004-02-29 16:21:42"
+#crl_next_update_date = "2025-02-29 16:24:41"
+
+# The date that the certificates will be made seen as
+# being revoked.
+#crl_revocation_date = "2025-02-29 16:24:41"
diff --git a/testenv/conf/__init__.py b/testenv/conf/__init__.py
new file mode 100644
index 0000000..55433c9
--- /dev/null
+++ b/testenv/conf/__init__.py
@@ -0,0 +1,48 @@
+import os
+
+# this file implements the mechanism of conf class auto-registration,
+# don't modify this file if you have no idea what you're doing
+
+
+def gen_hook():
+ hook_table = {}
+
+ class Wrapper:
+ """
+ Decorator class which implements the conf class registration.
+ """
+ def __init__(self, alias=None):
+ self.alias = alias
+
+ def __call__(self, cls):
+ # register the class object with the name of the class
+ hook_table[cls.__name__] = cls
+ if self.alias:
+ # also register the alias of the class
+ hook_table[self.alias] = cls
+
+ return cls
+
+ def find_hook(name):
+ try:
+ return hook_table[name]
+ except:
+ raise AttributeError
+
+ return Wrapper, find_hook
+
+_register, find_conf = gen_hook()
+hook = rule = _register
+
+__all__ = ['hook', 'rule']
+
+for module in os.listdir(os.path.dirname(__file__)):
+ # import every module under this package except __init__.py,
+ # so that the decorator `register` applies
+ # (nothing happens if the script is not loaded)
+ if module != '__init__.py' and module.endswith('.py'):
+ module_name = module[:-3]
+ mod = __import__('%s.%s' % (__name__, module_name),
+ globals(),
+ locals())
+ __all__.append(module_name)
diff --git a/testenv/conf/authentication.py b/testenv/conf/authentication.py
new file mode 100644
index 0000000..ca5149c
--- /dev/null
+++ b/testenv/conf/authentication.py
@@ -0,0 +1,23 @@
+from conf import rule
+
+""" Rule: Authentication
+This file defines an authentication rule which when applied to any file will
+cause the server to prompt the client for the required authentication details
+before serving it.
+auth_type must be either of: Basic, Digest, Both or Both-inline
+When auth_type is Basic or Digest, the server asks for the respective
+authentication in its response. When auth_type is Both, the server sends two
+Authenticate headers, one requesting Basic and the other requesting Digest
+authentication. If auth_type is Both-inline, the server sends only one
+Authenticate header, but lists both Basic and Digest as supported mechanisms in
+that.
+"""
+
+
+@rule()
+class Authentication:
+ def __init__(self, auth_obj):
+ self.auth_type = auth_obj['Type']
+ self.auth_user = auth_obj['User']
+ self.auth_pass = auth_obj['Pass']
+ self.auth_parm = auth_obj.get('Parm', None)
diff --git a/testenv/conf/domains.py b/testenv/conf/domains.py
new file mode 100644
index 0000000..ac03fe1
--- /dev/null
+++ b/testenv/conf/domains.py
@@ -0,0 +1,9 @@
+from conf import hook
+
+@hook(alias='Domains')
+class Domains:
+ def __init__(self, domains):
+ self.domains = domains
+
+ def __call__(self, test_obj):
+ test_obj.domains = self.domains
diff --git a/testenv/conf/environment_variables.py b/testenv/conf/environment_variables.py
new file mode 100644
index 0000000..323c051
--- /dev/null
+++ b/testenv/conf/environment_variables.py
@@ -0,0 +1,14 @@
+from conf import hook
+
+""" Test Option: EnvironmentVariables
+This hook is used to define environment variables used for execution of wget
+command in test."""
+
+
+@hook(alias='EnvironmentVariables')
+class URLs:
+ def __init__(self, envs):
+ self.envs = envs
+
+ def __call__(self, test_obj):
+ test_obj.envs.update(**self.envs)
diff --git a/testenv/conf/expect_header.py b/testenv/conf/expect_header.py
new file mode 100644
index 0000000..055099f
--- /dev/null
+++ b/testenv/conf/expect_header.py
@@ -0,0 +1,12 @@
+from conf import rule
+
+""" Rule: ExpectHeader
+This rule defines a dictionary of headers and their value which the server
+should expect in each request for the file to which the rule was applied.
+"""
+
+
+@rule()
+class ExpectHeader:
+ def __init__(self, header_obj):
+ self.headers = header_obj
diff --git a/testenv/conf/expected_files.py b/testenv/conf/expected_files.py
new file mode 100644
index 0000000..65adb70
--- /dev/null
+++ b/testenv/conf/expected_files.py
@@ -0,0 +1,58 @@
+from difflib import unified_diff
+import os
+import sys
+from conf import hook
+from exc.test_failed import TestFailed
+
+""" Post-Test Hook: ExpectedFiles
+This is a Post-Test hook that checks the test directory for the files it
+contains. A dictionary object is passed to it, which contains a mapping of
+filenames and contents of all the files that the directory is expected to
+contain.
+Raises a TestFailed exception if the expected files are not found or if extra
+files are found, else returns gracefully.
+"""
+
+
+@hook()
+class ExpectedFiles:
+ def __init__(self, expected_fs):
+ self.expected_fs = expected_fs
+
+ @staticmethod
+ def gen_local_fs_snapshot():
+ snapshot = {}
+ for parent, dirs, files in os.walk('.'):
+ for name in files:
+ # pubring.gpg, pubring.kbx, dirmngr.conf, gpg.conf will be created by libgpgme
+ # if $HOME doesn't contain the .gnupg directory.
+ # setting $HOME to CWD (in base_test.py) breaks two Metalink tests, so we skip this file here.
+ if name in [ 'pubring.gpg', 'pubring.kbx', 'dirmngr.conf', 'gpg.conf' ]:
+ continue
+
+ f = {'content': ''}
+ file_path = os.path.join(parent, name)
+ with open(file_path) as fp:
+ f['content'] = fp.read()
+ snapshot[file_path[2:]] = f
+
+ return snapshot
+
+ def __call__(self, test_obj):
+ local_fs = self.gen_local_fs_snapshot()
+ for file in self.expected_fs:
+ if file.name in local_fs:
+ local_file = local_fs.pop(file.name)
+ formatted_content = test_obj._replace_substring(file.content)
+ if formatted_content != local_file['content']:
+ for line in unified_diff(local_file['content'],
+ formatted_content,
+ fromfile='Actual',
+ tofile='Expected'):
+ print(line, file=sys.stderr)
+ raise TestFailed('Contents of %s do not match' % file.name)
+ else:
+ raise TestFailed('Expected file %s not found.' % file.name)
+ if local_fs:
+ print(local_fs)
+ raise TestFailed('Extra files downloaded.')
diff --git a/testenv/conf/expected_ret_code.py b/testenv/conf/expected_ret_code.py
new file mode 100644
index 0000000..87cba13
--- /dev/null
+++ b/testenv/conf/expected_ret_code.py
@@ -0,0 +1,27 @@
+from exc.test_failed import TestFailed
+from conf import hook
+
+""" Post-Test Hook: ExpectedRetCode
+This is a post-test hook which checks if the exit code of the Wget instance
+under test is the same as that expected. As a result, this is a very important
+post test hook which is checked in all the tests.
+Returns a TestFailed exception if the return code does not match the expected
+value. Else returns gracefully.
+"""
+
+
+@hook(alias='ExpectedRetcode')
+class ExpectedRetCode:
+ def __init__(self, expected_ret_code):
+ self.expected_ret_code = expected_ret_code
+
+ def __call__(self, test_obj):
+ if test_obj.ret_code != self.expected_ret_code:
+ if test_obj.ret_code == 45:
+ failure = "Memory Leak Found by Valgrind"
+ else:
+ failure = "Return codes do not match.\n" \
+ "Expected: %s\n" \
+ "Actual: %s" % (self.expected_ret_code,
+ test_obj.ret_code)
+ raise TestFailed(failure)
diff --git a/testenv/conf/files_crawled.py b/testenv/conf/files_crawled.py
new file mode 100644
index 0000000..7db8392
--- /dev/null
+++ b/testenv/conf/files_crawled.py
@@ -0,0 +1,27 @@
+from misc.colour_terminal import print_red
+from conf import hook
+from exc.test_failed import TestFailed
+
+""" Post-Test Hook: FilesCrawled
+This is a post test hook that is invoked in tests that check wget's behaviour
+in recursive mode. It expects an ordered list of the request lines that Wget
+must send to the server. If the requests received by the server do not match
+the provided list, IN THE GIVEN ORDER, then it raises a TestFailed exception.
+Such a test can be used to check the implementation of the recursion algorithm
+in Wget too.
+"""
+
+
+@hook()
+class FilesCrawled:
+ def __init__(self, request_headers):
+ self.request_headers = request_headers
+
+ def __call__(self, test_obj):
+ for headers, remaining in zip(map(set, self.request_headers),
+ test_obj.request_remaining()):
+ diff = headers.symmetric_difference(remaining)
+
+ if diff:
+ print_red(str(diff))
+ raise TestFailed('Not all files were crawled correctly.')
diff --git a/testenv/conf/hook_sample.py b/testenv/conf/hook_sample.py
new file mode 100644
index 0000000..591ec3b
--- /dev/null
+++ b/testenv/conf/hook_sample.py
@@ -0,0 +1,22 @@
+from exc.test_failed import TestFailed
+from conf import hook
+
+""" Hook: SampleHook
+This a sample file for how a new hook should be defined.
+Any errors should always be reported by raising a TestFailed exception instead
+of returning a true or false value.
+"""
+
+
+@hook(alias='SampleHookAlias')
+class SampleHook:
+ def __init__(self, sample_hook_arg):
+ # do conf initialization here
+ self.arg = sample_hook_arg
+
+ def __call__(self, test_obj):
+ # implement hook here
+ # if you need the test case instance, refer to test_obj
+ if False:
+ raise TestFailed("Reason")
+ pass
diff --git a/testenv/conf/local_files.py b/testenv/conf/local_files.py
new file mode 100644
index 0000000..908ced1
--- /dev/null
+++ b/testenv/conf/local_files.py
@@ -0,0 +1,26 @@
+from os import utime
+from time import strptime
+from calendar import timegm
+from conf import hook
+
+""" Pre-Test Hook: LocalFiles
+This is a pre-test hook used to generate the specific environment before a test
+is run. The LocalFiles hook creates the files which should exist on disk before
+invoking Wget.
+"""
+
+
+@hook()
+class LocalFiles:
+ def __init__(self, local_files):
+ self.local_files = local_files
+
+ def __call__(self, _):
+ for f in self.local_files:
+ with open(f.name, 'w') as fp:
+ fp.write(f.content)
+ if f.timestamp is not None:
+ tstamp = timegm(strptime(f.timestamp, '%Y-%m-%d %H:%M:%S'))
+ atime = tstamp
+ mtime = tstamp
+ utime(f.name, (atime, mtime))
diff --git a/testenv/conf/reject_header.py b/testenv/conf/reject_header.py
new file mode 100644
index 0000000..0dcf463
--- /dev/null
+++ b/testenv/conf/reject_header.py
@@ -0,0 +1,13 @@
+from conf import rule
+
+""" Rule: RejectHeader
+This is a server side rule which expects a dictionary object of Headers and
+their values which should be blacklisted by the server for a particular file's
+requests.
+"""
+
+
+@rule()
+class RejectHeader:
+ def __init__(self, header_obj):
+ self.headers = header_obj
diff --git a/testenv/conf/response.py b/testenv/conf/response.py
new file mode 100644
index 0000000..976a9ce
--- /dev/null
+++ b/testenv/conf/response.py
@@ -0,0 +1,11 @@
+from conf import rule
+
+""" Rule: Response
+When this rule is set against a certain file, the server will unconditionally
+respond to any request for the said file with the provided response code. """
+
+
+@rule()
+class Response:
+ def __init__(self, ret_code):
+ self.response_code = ret_code
diff --git a/testenv/conf/rule_sample.py b/testenv/conf/rule_sample.py
new file mode 100644
index 0000000..6345a3c
--- /dev/null
+++ b/testenv/conf/rule_sample.py
@@ -0,0 +1,10 @@
+from conf import rule
+
+
+@rule(alias='SampleRuleAlias')
+class SampleRule:
+ def __init__(self, rule):
+ # do rule initialization here
+ # you may also need to implement a method the same name of this
+ # class in server/protocol/protocol_server.py to apply this rule.
+ self.rule = rule
diff --git a/testenv/conf/send_header.py b/testenv/conf/send_header.py
new file mode 100644
index 0000000..1ac54cc
--- /dev/null
+++ b/testenv/conf/send_header.py
@@ -0,0 +1,12 @@
+from conf import rule
+
+""" Rule: SendHeader
+Have the server send custom headers when responding to a request for the file
+this rule is applied to. The header_obj object is expected to be dictionary
+mapping headers to their contents. """
+
+
+@rule()
+class SendHeader:
+ def __init__(self, header_obj):
+ self.headers = header_obj
diff --git a/testenv/conf/server_files.py b/testenv/conf/server_files.py
new file mode 100644
index 0000000..eaa9cd0
--- /dev/null
+++ b/testenv/conf/server_files.py
@@ -0,0 +1,26 @@
+from conf import hook
+
+""" Pre-Test Hook: ServerFiles
+This hook is used to define a set of files on the server's virtual filesystem.
+server_files is expected to be dictionary that maps filenames to their
+contents. In the future, this can be used to add additional metadata to the
+files using the WgetFile class too.
+
+This hook also does some additional processing on the contents of the file. Any
+text between {{and}} is replaced by the contents of a class variable of the
+same name. This is useful in creating files that contain an absolute link to
+another file on the same server. """
+
+
+@hook()
+class ServerFiles:
+ def __init__(self, server_files):
+ self.server_files = server_files
+
+ def __call__(self, test_obj):
+ for server, files in zip(test_obj.servers, self.server_files):
+ files_content = {f.name: test_obj._replace_substring(f.content)
+ for f in files}
+ files_rules = {f.name: test_obj.get_server_rules(f)
+ for f in files}
+ server.server_conf(files_content, files_rules)
diff --git a/testenv/conf/urls.py b/testenv/conf/urls.py
new file mode 100644
index 0000000..f34c13e
--- /dev/null
+++ b/testenv/conf/urls.py
@@ -0,0 +1,14 @@
+from conf import hook
+
+""" Pre-Test Hook: URLS
+This hook is used to define the paths of the files on the test server that wget
+will send a request for. """
+
+
+@hook(alias='Urls')
+class URLs:
+ def __init__(self, urls):
+ self.urls = urls
+
+ def __call__(self, test_obj):
+ test_obj.urls = self.urls
diff --git a/testenv/conf/wget_commands.py b/testenv/conf/wget_commands.py
new file mode 100644
index 0000000..fb379be
--- /dev/null
+++ b/testenv/conf/wget_commands.py
@@ -0,0 +1,15 @@
+from conf import hook
+
+""" Pre-Test Hook: WgetCommands
+This hook is used to specify the test specific switches that must be passed to
+wget on invocation. Default switches are hard coded in the test suite itself.
+"""
+
+
+@hook()
+class WgetCommands:
+ def __init__(self, commands):
+ self.commands = commands
+
+ def __call__(self, test_obj):
+ test_obj.wget_options = test_obj._replace_substring(self.commands)
diff --git a/testenv/exc/__init__.py b/testenv/exc/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/exc/__init__.py
diff --git a/testenv/exc/server_error.py b/testenv/exc/server_error.py
new file mode 100644
index 0000000..fe359f5
--- /dev/null
+++ b/testenv/exc/server_error.py
@@ -0,0 +1,19 @@
+
+class ServerError (Exception):
+ """ A custom exception which is raised by the test servers. Often used to
+ handle control flow. """
+
+ def __init__(self, err_message):
+ self.err_message = err_message
+
+class NoBodyServerError (Exception):
+ """ A custom exception which is raised by the test servers.
+ Used if no body should be sent in response. """
+
+ def __init__(self, err_message):
+ self.err_message = err_message
+
+class AuthError (ServerError):
+ """ A custom exception raised byt he servers when authentication of the
+ request fails. """
+ pass
diff --git a/testenv/exc/test_failed.py b/testenv/exc/test_failed.py
new file mode 100644
index 0000000..89f7960
--- /dev/null
+++ b/testenv/exc/test_failed.py
@@ -0,0 +1,7 @@
+
+class TestFailed(Exception):
+
+ """ A Custom Exception raised by the Test Environment. """
+
+ def __init__(self, error):
+ self.error = error
diff --git a/testenv/misc/__init__.py b/testenv/misc/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/misc/__init__.py
diff --git a/testenv/misc/colour_terminal.py b/testenv/misc/colour_terminal.py
new file mode 100644
index 0000000..bc549a2
--- /dev/null
+++ b/testenv/misc/colour_terminal.py
@@ -0,0 +1,46 @@
+from functools import partial
+import platform
+from os import getenv
+import sys
+
+""" This module allows printing coloured output to the terminal when running a
+Wget Test under certain conditions.
+The output is coloured only on Linux systems. This is because coloured output
+in the terminal on Windows requires too much effort for what is simply a
+convenience. This might work on OSX terminals, but without a confirmation, it
+remains unsupported.
+
+Another important aspect is that the coloured output is printed only if the
+environment variable MAKE_CHECK is not set. This variable is set when running
+the test suite through, `make check`. In that case, the output is not only
+printed to the terminal but also copied to a log file where the ANSI escape
+codes on;y add clutter. """
+
+
+T_COLORS = {
+ 'PURPLE': '\033[95m',
+ 'BLUE': '\033[94m',
+ 'GREEN': '\033[92m',
+ 'YELLOW': '\033[93m',
+ 'RED': '\033[91m',
+ 'ENDC': '\033[0m'
+}
+
+system = True if platform.system() in ('Linux', 'Darwin') else False
+check = False if getenv("MAKE_CHECK") == 'True' else True
+
+
+def printer(color, string):
+ if sys.stdout.isatty() and system and check:
+ print(T_COLORS.get(color) + string + T_COLORS.get('ENDC'))
+ else:
+ print(string)
+
+
+print_blue = partial(printer, 'BLUE')
+print_red = partial(printer, 'RED')
+print_green = partial(printer, 'GREEN')
+print_purple = partial(printer, 'PURPLE')
+print_yellow = partial(printer, 'YELLOW')
+
+# vim: set ts=8 sw=3 tw=80 et :
diff --git a/testenv/misc/metalinkv3_xml.py b/testenv/misc/metalinkv3_xml.py
new file mode 100644
index 0000000..794bf87
--- /dev/null
+++ b/testenv/misc/metalinkv3_xml.py
@@ -0,0 +1,305 @@
+from test.http_test import HTTPTest
+from misc.wget_file import WgetFile
+import hashlib
+
+class Metalinkv3_XML:
+
+ """ Metalink/XML v3 object """
+
+ # Initialize the Metalink object
+ def __init__ (self):
+ self.reset ()
+
+ # Reset the Metalink object
+ def reset (self):
+ self.LocalFiles = [] # list of WgetFile objects
+ self.ServerFiles = [[]] # list of WgetFile objects
+ self.ExpectedFiles = [] # list of WgetFile objects
+ self.LocalFiles_Set = [] # used as `list (set (var))`
+ self.ServerFiles_Set = [[]] # used as `list (set (var))`
+ self.ExpectedFiles_Set = [] # used as `list (set (var))`
+ self.Xml = '' # Metalink/XML content
+ self.XmlName = '' # Metalink/XML file name
+ self.XmlFile = None # Metalink/XML WgetFile object
+ self.Xml_Header = '<?xml version="1.0" encoding="utf-8"?>\n' + \
+ '<metalink version="3.0" xmlns="http://www.metalinker.org/">\n' + \
+ ' <publisher>\n' + \
+ ' <name>GNU Wget</name>\n' + \
+ ' </publisher>\n' + \
+ ' <license>\n' + \
+ ' <name>GNU GPL</name>\n' + \
+ ' <url>http://www.gnu.org/licenses/gpl.html</url>\n' + \
+ ' </license>\n' + \
+ ' <identity>Wget Test Files</identity>\n' + \
+ ' <version>1.2.3</version>\n' + \
+ ' <description>Wget Test Files description</description>\n' + \
+ ' <files>\n'
+ self.Xml_Footer = ' </files>\n' + \
+ '</metalink>\n'
+
+ # Print the Metalink object.
+ def print_meta (self):
+
+ print (self.Xml)
+ print ("LocalFiles = " + str (self.LocalFiles_Set))
+ print ("ServerFiles = " + str (self.ServerFiles_Set))
+ print ("ExpectedFiles = " + str (self.ExpectedFiles_Set))
+
+ # Add LocalFiles as WgetFile objects
+ #
+ # ["file_name", "content"],
+ # ["file_name", "content"]
+ def add_LocalFiles (self, *local_files):
+
+ for (file_name, content) in local_files:
+ if not file_name in self.LocalFiles_Set:
+ self.LocalFiles_Set.append (file_name)
+ self.LocalFiles.append (WgetFile (file_name, content))
+
+ # Add ServerFiles as WgetFile objects
+ #
+ # ["file_name", "content"],
+ # ["file_name", "content"]
+ def add_ServerFiles (self, *server_files):
+
+ for (file_name, content) in server_files:
+ if not file_name in self.ServerFiles_Set[0]:
+ self.ServerFiles_Set[0].append (file_name)
+ self.ServerFiles[0].append (WgetFile (file_name, content))
+
+ # Add ExpectedFiles as WgetFile objects
+ #
+ # ["file_name", "content"],
+ # ["file_name", "content"]
+ def add_ExpectedFiles (self, *expected_files):
+
+ for (file_name, content) in expected_files:
+ if not file_name in self.ExpectedFiles_Set:
+ self.ExpectedFiles_Set.append (file_name)
+ self.ExpectedFiles.append (WgetFile (file_name, content))
+
+ # Run a Wget HTTP test for the Metalink object.
+ def http_test (self, command_line, expected_retcode):
+
+ pre_test = {
+ "ServerFiles" : self.ServerFiles, # list of WgetFile objects as [[]]
+ "LocalFiles" : self.LocalFiles, # list of WgetFile objects as []
+ }
+
+ test_options = {
+ "WgetCommands" : command_line, # Wget cli
+ "Urls" : [[]], # Wget urls
+ }
+
+ post_test = {
+ "ExpectedFiles" : self.ExpectedFiles, # list of WgetFile objects as []
+ "ExpectedRetcode" : expected_retcode, # Wget return status code
+ }
+
+ http_test = HTTPTest (
+ pre_hook=pre_test,
+ test_params=test_options,
+ post_hook=post_test,
+ )
+
+ http_test.server_setup()
+ # Get and use dynamic server sockname
+ srv_host, srv_port = http_test.servers[0].server_inst.socket.getsockname ()
+
+ self.set_srv (srv_host, srv_port)
+
+ err = http_test.begin ()
+
+ return err
+
+ # Set the Wget server host and port in the Metalink/XML content.
+ def set_srv (self, srv_host, srv_port):
+
+ self.Xml = self.Xml.replace('{{SRV_HOST}}', srv_host)
+ self.Xml = self.Xml.replace('{{SRV_PORT}}', str (srv_port))
+
+ if self.XmlFile is not None:
+ self.XmlFile.content = self.Xml
+
+ # Create the Metalink/XML file.
+ #
+ # Add the Metalink/XML file to the list of ExpectedFiles.
+ #
+ # size:
+ # True auto-compute size
+ # None no <size></size>
+ # any use this size
+ #
+ # hash_sha256:
+ # False no <verification></verification>
+ # True auto-compute sha256
+ # None no <hash></hash>
+ # any use this hash
+ #
+ # ARGUMENTS:
+ #
+ # "xml_name", # Metalink/XML file name
+ # ["file_name", "save_name", "content", size, hash_sha256, # metalink:file
+ # ["srv_file", "srv_content", utype, location, preference], # resource
+ # ["srv_file", "srv_content", utype, location, preference]], # resource
+ # ["file_name", "save_name", "content", size, hash_sha256,
+ # ["srv_file", "srv_content", utype, location, preference],
+ # ["srv_file", "srv_content", utype, location, preference]]
+ def xml (self, xml_name, *xml_data):
+
+ self.Xml = self.Xml_Header
+
+ for (file_name, save_name, content, size, hash_sha256, *resources) in xml_data:
+ self.Xml += self.file_tag (file_name, save_name, content, size, hash_sha256, resources) + '\n'
+
+ self.Xml += self.Xml_Footer
+
+ self.XmlName = xml_name
+ self.XmlFile = WgetFile (xml_name, self.Xml)
+
+ if not xml_name in self.LocalFiles_Set:
+ self.LocalFiles_Set.append (xml_name)
+ self.LocalFiles.append (self.XmlFile)
+
+ if not xml_name in self.ExpectedFiles_Set:
+ self.ExpectedFiles_Set.append (xml_name)
+ self.ExpectedFiles.append (self.XmlFile)
+
+ # Create the file tag.
+ #
+ # Add the file to be saved to the list of ExpectedFiles.
+ #
+ # size:
+ # True auto-compute size
+ # None no <size></size>
+ # any use this size
+ #
+ # hash_sha256:
+ # False no <verification></verification>
+ # True auto-compute sha256
+ # None no <hash></hash>
+ # any use this hash
+ #
+ # ARGUMENTS:
+ #
+ # ["file_name", "save_name", "content", size, hash_sha256, # metalink:file
+ # ["srv_file", "srv_content", utype, location, preference], # resource
+ # ["srv_file", "srv_content", utype, location, preference]] # resource
+ def file_tag (self, file_name, save_name, content, size, hash_sha256, resources):
+
+ Tag = ' <file name="' + file_name + '">\n'
+
+ if save_name is not None:
+ self.add_ExpectedFiles ([save_name, content])
+
+ size_Tag = self.size_tag (content, size)
+
+ if size_Tag is not None:
+ Tag += size_Tag + '\n'
+
+ verification_Tag = self.verification_tag (content, hash_sha256)
+
+ if verification_Tag is not None:
+ Tag += verification_Tag + '\n'
+
+ Tag += self.resources_tag (resources) + '\n'
+
+ Tag += ' </file>'
+
+ return Tag
+
+ # Create the size tag.
+ #
+ # size:
+ # True auto-compute size
+ # None no <size></size>
+ # any use this size
+ #
+ # ARGUMENTS:
+ #
+ # "content", size
+ def size_tag (self, content = None, size = None):
+
+ Tag = None
+
+ if content is not None and size is True:
+ size = len (content)
+
+ if size is not None:
+ Tag = ' <size>' + str (size) + '</size>'
+
+ return Tag
+
+ # Create the verification tag.
+ #
+ # hash_sha256:
+ # False no <verification></verification>
+ # True auto-compute sha256
+ # None no <hash></hash>
+ # any use this hash
+ #
+ # ARGUMENTS:
+ #
+ # "content", hash_sha256
+ def verification_tag (self, content = None, hash_sha256 = None):
+
+ Tag = None
+
+ if hash_sha256 is not False:
+
+ if content is not None and hash_sha256 is True:
+ hash_sha256 = hashlib.sha256 (content.encode ('UTF-8')).hexdigest ()
+
+ if hash_sha256 is None:
+ Tag = ' <verification>\n' + \
+ ' </verification>'
+ else:
+ Tag = ' <verification>\n' + \
+ ' <hash type="sha256">' + str (hash_sha256) + '</hash>\n' + \
+ ' </verification>'
+
+ return Tag
+
+ # Create the resources tag.
+ #
+ # ARGUMENTS:
+ #
+ # ["srv_file", "srv_content", utype, location, preference], # resource
+ # ["srv_file", "srv_content", utype, location, preference] # resource
+ def resources_tag (self, resources):
+
+ Tag = ' <resources>\n'
+
+ for (srv_file, srv_content, utype, location, preference) in resources:
+ Tag += self.url_tag (srv_file, srv_content, utype, location, preference) + '\n'
+
+ Tag += ' </resources>'
+
+ return Tag
+
+ # Create the url tag.
+ #
+ # Add the file to the list of Files when there is a content.
+ #
+ # ARGUMENTS:
+ #
+ # "srv_file", "srv_content", utype, location, preference # resource
+ def url_tag (self, srv_file, srv_content = None, utype = "http", location = None, preference = 999999):
+
+ Loc = ''
+
+ if location is not None:
+ Loc = 'location="' + location + '" '
+
+ Tag = ' ' + \
+ '<url ' + \
+ 'type="' + utype + '" ' + \
+ Loc + \
+ 'preference="' + str (preference) + '">' + \
+ 'http://{{SRV_HOST}}:{{SRV_PORT}}/' + srv_file + \
+ '</url>'
+
+ if srv_content is not None:
+ self.add_ServerFiles ([srv_file, srv_content])
+
+ return Tag
diff --git a/testenv/misc/wget_file.py b/testenv/misc/wget_file.py
new file mode 100644
index 0000000..c2a7239
--- /dev/null
+++ b/testenv/misc/wget_file.py
@@ -0,0 +1,16 @@
+
+class WgetFile:
+
+ """ WgetFile is a File Data Container object """
+
+ def __init__(
+ self,
+ name,
+ content="Test Contents",
+ timestamp=None,
+ rules=None
+ ):
+ self.name = name
+ self.content = content
+ self.timestamp = timestamp
+ self.rules = rules or {}
diff --git a/testenv/server/__init__.py b/testenv/server/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/server/__init__.py
diff --git a/testenv/server/ftp/__init__.py b/testenv/server/ftp/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/server/ftp/__init__.py
diff --git a/testenv/server/ftp/ftp_server.py b/testenv/server/ftp/ftp_server.py
new file mode 100644
index 0000000..f7d7771
--- /dev/null
+++ b/testenv/server/ftp/ftp_server.py
@@ -0,0 +1,162 @@
+import os
+import re
+import threading
+import socket
+import pyftpdlib.__main__
+from pyftpdlib.ioloop import IOLoop
+import pyftpdlib.handlers as Handle
+from pyftpdlib.servers import FTPServer
+from pyftpdlib.authorizers import DummyAuthorizer
+from pyftpdlib._compat import PY3, u, b, getcwdu, callable
+
+class FTPDHandler (Handle.FTPHandler):
+
+ def ftp_LIST (self, path):
+ try:
+ iterator = self.run_as_current_user(self.fs.get_list_dir, path)
+ except (OSError, FilesystemError):
+ err = sys.exc_info()[1]
+ why = _strerror (err)
+ self.respond ('550 %s. ' % why)
+ else:
+ if self.isRule ("Bad List") is True:
+ iter_list = list ()
+ for flist in iterator:
+ line = re.compile (r'(\s+)').split (flist.decode ('utf-8'))
+ line[8] = '0'
+ iter_l = ''.join (line).encode ('utf-8')
+ iter_list.append (iter_l)
+ iterator = (n for n in iter_list)
+ producer = Handle.BufferedIteratorProducer (iterator)
+ self.push_dtp_data (producer, isproducer=True, cmd="LIST")
+ return path
+
+ def ftp_PASV (self, line):
+ if self._epsvall:
+ self.respond ("501 PASV not allowed after EPSV ALL.")
+ return
+ self._make_epasv(extmode=False)
+ if self.isRule ("FailPASV") is True:
+ del self.server.global_rules["FailPASV"]
+ self.socket.close ()
+
+ def isRule (self, rule):
+ rule_obj = self.server.global_rules[rule]
+ return False if not rule_obj else rule_obj[0]
+
+class FTPDServer (FTPServer):
+
+ def set_global_rules (self, rules):
+ self.global_rules = rules
+
+class FTPd(threading.Thread):
+ """A threaded FTP server used for running tests.
+
+ This is basically a modified version of the FTPServer class which
+ wraps the polling loop into a thread.
+
+ The instance returned can be used to start(), stop() and
+ eventually re-start() the server.
+ """
+ handler = FTPDHandler
+ server_class = FTPDServer
+
+ def __init__(self, addr=None):
+ os.mkdir ('server')
+ os.chdir ('server')
+ try:
+ HOST = socket.gethostbyname ('localhost')
+ except socket.error:
+ HOST = 'localhost'
+ USER = 'user'
+ PASSWD = '12345'
+ HOME = getcwdu ()
+
+ threading.Thread.__init__(self)
+ self.__serving = False
+ self.__stopped = False
+ self.__lock = threading.Lock()
+ self.__flag = threading.Event()
+ if addr is None:
+ addr = (HOST, 0)
+
+ authorizer = DummyAuthorizer()
+ authorizer.add_user(USER, PASSWD, HOME, perm='elradfmwM') # full perms
+ authorizer.add_anonymous(HOME)
+ self.handler.authorizer = authorizer
+ # lowering buffer sizes = more cycles to transfer data
+ # = less false positive test failures
+ self.handler.dtp_handler.ac_in_buffer_size = 32768
+ self.handler.dtp_handler.ac_out_buffer_size = 32768
+ self.server = self.server_class(addr, self.handler)
+ self.host, self.port = self.server.socket.getsockname()[:2]
+ os.chdir ('..')
+
+ def set_global_rules (self, rules):
+ self.server.set_global_rules (rules)
+
+ def __repr__(self):
+ status = [self.__class__.__module__ + "." + self.__class__.__name__]
+ if self.__serving:
+ status.append('active')
+ else:
+ status.append('inactive')
+ status.append('%s:%s' % self.server.socket.getsockname()[:2])
+ return '<%s at %#x>' % (' '.join(status), id(self))
+
+ @property
+ def running(self):
+ return self.__serving
+
+ def start(self, timeout=0.001):
+ """Start serving until an explicit stop() request.
+ Polls for shutdown every 'timeout' seconds.
+ """
+ if self.__serving:
+ raise RuntimeError("Server already started")
+ if self.__stopped:
+ # ensure the server can be started again
+ FTPd.__init__(self, self.server.socket.getsockname(), self.handler)
+ self.__timeout = timeout
+ threading.Thread.start(self)
+ self.__flag.wait()
+
+ def run(self):
+ self.__serving = True
+ self.__flag.set()
+ while self.__serving:
+ self.__lock.acquire()
+ self.server.serve_forever(timeout=self.__timeout, blocking=False)
+ self.__lock.release()
+ self.server.close_all()
+
+ def stop(self):
+ """Stop serving (also disconnecting all currently connected
+ clients) by telling the serve_forever() loop to stop and
+ waits until it does.
+ """
+ if not self.__serving:
+ raise RuntimeError("Server not started yet")
+ self.__serving = False
+ self.__stopped = True
+ self.join()
+
+
+def mk_file_sys (file_list):
+ os.chdir ('server')
+ for name, content in file_list.items ():
+ file_h = open (name, 'w')
+ file_h.write (content)
+ file_h.close ()
+ os.chdir ('..')
+
+def filesys ():
+ fileSys = dict ()
+ os.chdir ('server')
+ for parent, dirs, files in os.walk ('.'):
+ for filename in files:
+ file_handle = open (filename, 'r')
+ file_content = file_handle.read ()
+ fileSys[filename] = file_content
+ os.chdir ('..')
+ return fileSys
diff --git a/testenv/server/http/__init__.py b/testenv/server/http/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/server/http/__init__.py
diff --git a/testenv/server/http/http_server.py b/testenv/server/http/http_server.py
new file mode 100644
index 0000000..2cc82fb
--- /dev/null
+++ b/testenv/server/http/http_server.py
@@ -0,0 +1,492 @@
+from http.server import HTTPServer, BaseHTTPRequestHandler
+from exc.server_error import ServerError, AuthError, NoBodyServerError
+from socketserver import BaseServer
+from posixpath import basename, splitext
+from base64 import b64encode
+from random import random
+from hashlib import md5
+import threading
+import socket
+import os
+
+
+class StoppableHTTPServer(HTTPServer):
+ """ This class extends the HTTPServer class from default http.server library
+ in Python 3. The StoppableHTTPServer class is capable of starting an HTTP
+ server that serves a virtual set of files made by the WgetFile class and
+ has most of its properties configurable through the server_conf()
+ method. """
+
+ request_headers = list()
+
+ """ Define methods for configuring the Server. """
+
+ def server_conf(self, filelist, conf_dict):
+ """ Set Server Rules and File System for this instance. """
+ self.server_configs = conf_dict
+ self.fileSys = filelist
+
+ def get_req_headers(self):
+ return self.request_headers
+
+
+class HTTPSServer(StoppableHTTPServer):
+ """ The HTTPSServer class extends the StoppableHTTPServer class with
+ additional support for secure connections through SSL. """
+
+ def __init__(self, address, handler):
+ import ssl
+ BaseServer.__init__(self, address, handler)
+ # step one up because test suite change directory away from $srcdir
+ # (don't do that !!!)
+ CERTFILE = os.path.abspath(os.path.join('..',
+ os.getenv('srcdir', '.'),
+ 'certs',
+ 'server-cert.pem'))
+ KEYFILE = os.path.abspath(os.path.join('..',
+ os.getenv('srcdir', '.'),
+ 'certs',
+ 'server-key.pem'))
+ self.socket = ssl.wrap_socket(
+ sock=socket.socket(self.address_family, self.socket_type),
+ certfile=CERTFILE,
+ keyfile=KEYFILE,
+ server_side=True
+ )
+ self.server_bind()
+ self.server_activate()
+
+
+class _Handler(BaseHTTPRequestHandler):
+ """ This is a private class which tells the server *HOW* to handle each
+ request. For each HTTP Request Command that the server should be capable of
+ responding to, there must exist a do_REQUESTNAME() method which details the
+ steps in which such requests should be processed. The rest of the methods
+ in this class are auxiliary methods created to help in processing certain
+ requests. """
+
+ def get_rule_list(self, name):
+ return self.rules.get(name)
+
+ # The default protocol version of the server we run is HTTP/1.1 not
+ # HTTP/1.0 which is the default with the http.server module.
+ protocol_version = 'HTTP/1.1'
+
+ """ Define functions for various HTTP Requests. """
+
+ def do_HEAD(self):
+ self.send_head("HEAD")
+
+ def do_GET(self):
+ """ Process HTTP GET requests. This is the same as processing HEAD
+ requests and then actually transmitting the data to the client. If
+ send_head() does not specify any "start" offset, we send the complete
+ data, else transmit only partial data. """
+
+ content, start = self.send_head("GET")
+ if content:
+ if start is None:
+ self.wfile.write(content.encode('utf-8'))
+ else:
+ self.wfile.write(content.encode('utf-8')[start:])
+
+ def do_POST(self):
+ """ According to RFC 7231 sec 4.3.3, if the resource requested in a POST
+ request does not exist on the server, the first POST request should
+ create that resource. PUT requests are otherwise used to create a
+ resource. Hence, we call the handle for processing PUT requests if the
+ resource requested does not already exist.
+
+ Currently, when the server receives a POST request for a resource, we
+ simply append the body data to the existing file and return the new
+ file to the client. If the file does not exist, a new file is created
+ using the contents of the request body. """
+
+ path = self.path[1:]
+ if path in self.server.fileSys:
+ self.rules = self.server.server_configs.get(path)
+ if not self.rules:
+ self.rules = dict()
+
+ if not self.custom_response():
+ return(None, None)
+
+ body_data = self.get_body_data()
+ self.send_response(200)
+ self.add_header("Content-type", "text/plain")
+ content = self.server.fileSys.pop(path) + "\n" + body_data
+ total_length = len(content)
+ self.server.fileSys[path] = content
+ self.add_header("Content-Length", total_length)
+ self.add_header("Location", self.path)
+ self.finish_headers()
+ try:
+ self.wfile.write(content.encode('utf-8'))
+ except Exception:
+ pass
+ else:
+ self.send_put(path)
+
+ def do_PUT(self):
+ path = self.path[1:]
+ self.rules = self.server.server_configs.get(path)
+ if not self.custom_response():
+ return(None, None)
+ self.send_put(path)
+
+ """ End of HTTP Request Method Handlers. """
+
+ """ Helper functions for the Handlers. """
+
+ def parse_range_header(self, header_line, length):
+ import re
+ if header_line is None:
+ return None
+ if not header_line.startswith("bytes="):
+ raise ServerError("Cannot parse header Range: %s" %
+ (header_line))
+ regex = re.match(r"^bytes=(\d*)\-$", header_line)
+ range_start = int(regex.group(1))
+ if range_start >= length:
+ raise ServerError("Range Overflow")
+ return range_start
+
+ def get_body_data(self):
+ cLength_header = self.headers.get("Content-Length")
+ cLength = int(cLength_header) if cLength_header is not None else 0
+ body_data = self.rfile.read(cLength).decode('utf-8')
+ return body_data
+
+ def send_put(self, path):
+ if path in self.server.fileSys:
+ self.server.fileSys.pop(path, None)
+ self.send_response(204)
+ else:
+ self.rules = dict()
+ self.send_response(201)
+ body_data = self.get_body_data()
+ self.server.fileSys[path] = body_data
+ self.add_header("Location", self.path)
+ self.finish_headers()
+
+ """ This empty method is called automatically when all the rules are
+ processed for a given request. However, send_header() should only be called
+ AFTER a response has been sent. But, at the moment of processing the rules,
+ the appropriate response has not yet been identified. As a result, we defer
+ the processing of this rule till later. Each do_* request handler MUST call
+ finish_headers() instead of end_headers(). The finish_headers() method
+ takes care of sending the appropriate headers before completing the
+ response. """
+ def SendHeader(self, header_obj):
+ pass
+
+ def send_cust_headers(self):
+ header_obj = self.get_rule_list('SendHeader')
+ if header_obj:
+ for header in header_obj.headers:
+ self.add_header(header, header_obj.headers[header])
+
+ def finish_headers(self):
+ self.send_cust_headers()
+ try:
+ for keyword, value in self._headers_dict.items():
+ if isinstance(value, list):
+ for value_el in value:
+ self.send_header(keyword, value_el)
+ else:
+ self.send_header(keyword, value)
+ # Clear the dictionary of existing headers for the next request
+ self._headers_dict.clear()
+ except AttributeError:
+ pass
+ self.end_headers()
+
+ def Response(self, resp_obj):
+ self.send_response(resp_obj.response_code)
+ if resp_obj.response_code == 304:
+ raise NoBodyServerError("Conditional get falling to head")
+ raise ServerError("Custom Response code sent.")
+
+ def custom_response(self):
+ codes = self.get_rule_list('Response')
+ if codes:
+ self.send_response(codes.response_code)
+ self.finish_headers()
+ return False
+ else:
+ return True
+
+ def add_header(self, keyword, value):
+ if not hasattr(self, "_headers_dict"):
+ self._headers_dict = dict()
+ self._headers_dict[keyword.lower()] = value
+
+ def base64(self, data):
+ string = b64encode(data.encode('utf-8'))
+ return string.decode('utf-8')
+
+ """ Send an authentication challenge.
+ This method calls self.send_header() directly instead of using the
+ add_header() method because sending multiple WWW-Authenticate headers
+ actually makes sense and we do use that feature in some tests. """
+ def send_challenge(self, auth_type, auth_parm):
+ auth_type = auth_type.lower()
+ if auth_type == "both":
+ self.send_challenge("basic", auth_parm)
+ self.send_challenge("digest", auth_parm)
+ return
+ if auth_type == "basic":
+ challenge_str = 'BasIc realm="Wget-Test"'
+ elif auth_type == "digest" or auth_type == "both_inline":
+ self.nonce = md5(str(random()).encode('utf-8')).hexdigest()
+ self.opaque = md5(str(random()).encode('utf-8')).hexdigest()
+ # 'DIgest' to provoke a Wget failure with turkish locales
+ challenge_str = 'DIgest realm="Test", nonce="%s", opaque="%s"' % (
+ self.nonce,
+ self.opaque)
+ try:
+ if auth_parm['qop']:
+ challenge_str += ', qop="%s"' % auth_parm['qop']
+ except KeyError:
+ pass
+ if auth_type == "both_inline":
+ # 'BasIc' to provoke a Wget failure with turkish locales
+ challenge_str = 'BasIc realm="Wget-Test", ' + challenge_str
+ self.send_header("WWW-Authenticate", challenge_str)
+
+ def authorize_basic(self, auth_header, auth_rule):
+ if auth_header is None or auth_header.split(' ')[0].lower() != 'basic':
+ return False
+ else:
+ self.user = auth_rule.auth_user
+ self.passw = auth_rule.auth_pass
+ auth_str = "basic " + self.base64(self.user + ":" + self.passw)
+ return True if auth_str.lower() == auth_header.lower() else False
+
+ def parse_auth_header(self, auth_header):
+ n = len("digest ")
+ auth_header = auth_header[n:].strip()
+ items = auth_header.split(", ")
+ keyvals = [i.split("=", 1) for i in items]
+ keyvals = [(k.strip(), v.strip().replace('"', '')) for k, v in keyvals]
+ return dict(keyvals)
+
+ def KD(self, secret, data):
+ return self.H(secret + ":" + data)
+
+ def H(self, data):
+ return md5(data.encode('utf-8')).hexdigest()
+
+ def A1(self):
+ return "%s:%s:%s" % (self.user, "Test", self.passw)
+
+ def A2(self, params):
+ return "%s:%s" % (self.command, params["uri"])
+
+ def check_response(self, params):
+ if "qop" in params:
+ data_str = params['nonce'] \
+ + ":" + params['nc'] \
+ + ":" + params['cnonce'] \
+ + ":" + params['qop'] \
+ + ":" + self.H(self.A2(params))
+ else:
+ data_str = params['nonce'] + ":" + self.H(self.A2(params))
+ resp = self.KD(self.H(self.A1()), data_str)
+
+ return True if resp == params['response'] else False
+
+ def authorize_digest(self, auth_header, auth_rule):
+ if auth_header is None or \
+ auth_header.split(' ')[0].lower() != 'digest':
+ return False
+ else:
+ self.user = auth_rule.auth_user
+ self.passw = auth_rule.auth_pass
+ params = self.parse_auth_header(auth_header)
+ if self.user != params['username'] or \
+ self.nonce != params['nonce'] or \
+ self.opaque != params['opaque']:
+ return False
+ req_attribs = ['username', 'realm', 'nonce', 'uri', 'response']
+ for attrib in req_attribs:
+ if attrib not in params:
+ return False
+ if not self.check_response(params):
+ return False
+
+ def authorize_both(self, auth_header, auth_rule):
+ return False
+
+ def authorize_both_inline(self, auth_header, auth_rule):
+ return False
+
+ def Authentication(self, auth_rule):
+ try:
+ self.handle_auth(auth_rule)
+ except AuthError as se:
+ self.send_response(401, "Authorization Required")
+ self.send_challenge(auth_rule.auth_type, auth_rule.auth_parm)
+ raise se
+
+ def handle_auth(self, auth_rule):
+ is_auth = True
+ auth_header = self.headers.get("Authorization")
+ required_auth = auth_rule.auth_type.lower()
+ if required_auth == "both" or required_auth == "both_inline":
+ if auth_header:
+ auth_type = auth_header.split(' ')[0].lower()
+ else:
+ auth_type = required_auth
+ else:
+ auth_type = required_auth
+ try:
+ assert hasattr(self, "authorize_" + auth_type)
+ is_auth = getattr(self, "authorize_" + auth_type)(auth_header,
+ auth_rule)
+ except AssertionError:
+ raise AuthError("Authentication Mechanism %s not supported" %
+ auth_type)
+ except AttributeError as ae:
+ raise AuthError(ae.__str__())
+ if is_auth is False:
+ raise AuthError("Unable to Authenticate")
+
+ def ExpectHeader(self, header_obj):
+ exp_headers = header_obj.headers
+ for header_line in exp_headers:
+ header_recd = self.headers.get(header_line)
+ if header_recd is None or header_recd != exp_headers[header_line]:
+ self.send_error(400, "Expected Header %s not found" %
+ header_line)
+ raise ServerError("Header " + header_line + " not found")
+
+ def RejectHeader(self, header_obj):
+ rej_headers = header_obj.headers
+ for header_line in rej_headers:
+ header_recd = self.headers.get(header_line)
+ if header_recd and header_recd == rej_headers[header_line]:
+ self.send_error(400, 'Blacklisted Header %s received' %
+ header_line)
+ raise ServerError("Header " + header_line + ' received')
+
+ def __log_request(self, method):
+ req = method + " " + self.path
+ self.server.request_headers.append(req)
+
+ def send_head(self, method):
+ """ Common code for GET and HEAD Commands.
+ This method is overridden to use the fileSys dict.
+
+ The method variable contains whether this was a HEAD or a GET Request.
+ According to RFC 2616, the server should not differentiate between
+ the two requests, however, we use it here for a specific test.
+ """
+
+ if self.path == "/":
+ path = "index.html"
+ else:
+ path = self.path[1:]
+
+ self.__log_request(method)
+
+ if path in self.server.fileSys:
+ self.rules = self.server.server_configs.get(path)
+
+ content = self.server.fileSys.get(path)
+ content_length = len(content)
+
+ for rule_name in self.rules:
+ try:
+ assert hasattr(self, rule_name)
+ getattr(self, rule_name)(self.rules[rule_name])
+ except AssertionError as ae:
+ msg = "Rule " + rule_name + " not defined"
+ self.send_error(500, msg)
+ return(None, None)
+ except AuthError as ae:
+ print(ae.__str__())
+ self.finish_headers()
+ return(None, None)
+ except NoBodyServerError as nbse:
+ print(nbse.__str__())
+ self.finish_headers()
+ return(None, None)
+ except ServerError as se:
+ print(se.__str__())
+ self.add_header("Content-Length", content_length)
+ self.finish_headers()
+ return(content, None)
+
+ try:
+ self.range_begin = self.parse_range_header(
+ self.headers.get("Range"), content_length)
+ except ServerError as ae:
+ # self.log_error("%s", ae.err_message)
+ if ae.err_message == "Range Overflow":
+ try:
+ self.overflows += 1
+ except AttributeError as s:
+ self.overflows = 0
+ self.send_response(416)
+ if self.overflows > 0:
+ self.add_header("Content-Length", 17)
+ self.finish_headers()
+ if self.overflows > 0:
+ return("Range Unsatisfied", 0)
+ return(None, None)
+ else:
+ self.range_begin = None
+ if self.range_begin is None:
+ self.send_response(200)
+ else:
+ self.send_response(206)
+ self.add_header("Accept-Ranges", "bytes")
+ self.add_header("Content-Range",
+ "bytes %d-%d/%d" % (self.range_begin,
+ content_length - 1,
+ content_length))
+ content_length -= self.range_begin
+ cont_type = self.guess_type(path)
+ self.add_header("Content-Type", cont_type)
+ self.add_header("Content-Length", content_length)
+ self.finish_headers()
+ return(content, self.range_begin)
+ else:
+ self.send_error(404, "Not Found")
+ return(None, None)
+
+ def guess_type(self, path):
+ base_name = basename("/" + path)
+ name, ext = splitext(base_name)
+ extension_map = {
+ ".txt": "text/plain",
+ ".css": "text/css",
+ ".html": "text/html"
+ }
+ return extension_map.get(ext, "text/plain")
+
+
+class HTTPd(threading.Thread):
+ server_class = StoppableHTTPServer
+ handler = _Handler
+
+ def __init__(self, addr=None):
+ threading.Thread.__init__(self)
+ if addr is None:
+ addr = ('localhost', 0)
+ self.server_inst = self.server_class(addr, self.handler)
+ self.server_address = self.server_inst.socket.getsockname()[:2]
+
+ def run(self):
+ self.server_inst.serve_forever()
+
+ def server_conf(self, file_list, server_rules):
+ self.server_inst.server_conf(file_list, server_rules)
+
+
+class HTTPSd(HTTPd):
+
+ server_class = HTTPSServer
+
+# vim: set ts=4 sts=4 sw=4 tw=79 et :
diff --git a/testenv/test/__init__.py b/testenv/test/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testenv/test/__init__.py
diff --git a/testenv/test/base_test.py b/testenv/test/base_test.py
new file mode 100644
index 0000000..1cdfba1
--- /dev/null
+++ b/testenv/test/base_test.py
@@ -0,0 +1,278 @@
+import os
+import shutil
+import shlex
+import traceback
+import re
+import time
+import sys
+from subprocess import call
+from misc.colour_terminal import print_red, print_blue
+from exc.test_failed import TestFailed
+import conf
+
+HTTP = "HTTP"
+HTTPS = "HTTPS"
+
+SKIP_TEST = 77
+
+class BaseTest:
+
+ """
+ Class that defines methods common to both HTTP and FTP Tests.
+ Note that this is an abstract class, subclasses must implement
+ * stop_server()
+ * instantiate_server_by(protocol)
+ """
+
+ def __init__(self, pre_hook, test_params, post_hook, protocols, req_protocols):
+ """
+ Define the class-wide variables (or attributes).
+ Attributes should not be defined outside __init__.
+ """
+ self.name = os.path.basename(os.path.realpath(sys.argv[0]))
+ # if pre_hook == None, then {} (an empty dict object) is passed to
+ # self.pre_configs
+ self.pre_configs = pre_hook or {}
+
+ self.test_params = test_params or {}
+ self.post_configs = post_hook or {}
+ self.protocols = protocols
+
+ if req_protocols is None:
+ self.req_protocols = map(lambda p: p.lower(), self.protocols)
+ else:
+ self.req_protocols = req_protocols
+
+ self.servers = []
+ self.domains = []
+ self.ports = []
+
+ self.addr = None
+ self.port = -1
+
+ self.wget_options = ''
+ self.urls = []
+ self.envs = dict()
+
+ self.tests_passed = True
+ self.ready = False
+ self.init_test_env()
+
+ self.ret_code = 0
+
+ def get_test_dir(self):
+ return self.name + '-test'
+
+ def init_test_env(self):
+ test_dir = self.get_test_dir()
+ try:
+ os.mkdir(test_dir)
+ except FileExistsError:
+ shutil.rmtree(test_dir)
+ os.mkdir(test_dir)
+ os.chdir(test_dir)
+
+ def get_domain_addr(self, addr):
+ # TODO if there's a multiple number of ports, wouldn't it be
+ # overridden to the port of the last invocation?
+ # Set the instance variables 'addr' and 'port' so that
+ # they can be queried by test cases.
+ self.addr = str(addr[0])
+ self.port = str(addr[1])
+
+ return [self.addr, self.port]
+
+ def server_setup(self):
+ print_blue("Running Test %s" % self.name)
+ for protocol in self.protocols:
+ instance = self.instantiate_server_by(protocol)
+ self.servers.append(instance)
+
+ # servers instantiated by different protocols may differ in
+ # ports and etc.
+ # so we should record different domains respect to servers.
+ domain = self.get_domain_addr(instance.server_address)
+ self.domains.append('localhost')
+ self.ports.append(domain[1])
+
+ def exec_wget(self):
+ cmd_line = self.gen_cmd_line()
+ params = shlex.split(cmd_line)
+ print(params)
+ envs = {"HOME": os.getcwd()}
+ envs.update(**self.envs)
+ print(envs)
+
+ if os.getenv("SERVER_WAIT"):
+ time.sleep(float(os.getenv("SERVER_WAIT")))
+
+ try:
+ ret_code = call(params, env=envs)
+ except FileNotFoundError:
+ raise TestFailed("The Wget Executable does not exist at the "
+ "expected path.")
+
+ return ret_code
+
+ def gen_cmd_line(self):
+ test_path = os.path.abspath(".")
+ if os.getenv("WGET_PATH"):
+ wget_path = os.path.abspath(os.getenv("WGET_PATH"))
+ else:
+ wget_path = os.path.abspath(os.path.join(test_path,
+ "..", '..', 'src',
+ "wget"))
+ wget_options = '--debug --no-config %s' % self.wget_options
+
+ valgrind = os.getenv("VALGRIND_TESTS", "")
+ gdb = os.getenv("GDB_TESTS", "")
+
+ # GDB has precedence over Valgrind
+ # If both VALGRIND_TESTS and GDB_TESTS are defined,
+ # GDB will be executed.
+ if gdb == "1":
+ cmd_line = 'gdb --args %s %s ' % (wget_path, wget_options)
+ elif valgrind == "1":
+ cmd_line = 'valgrind --error-exitcode=301 ' \
+ '--leak-check=yes ' \
+ '--track-origins=yes ' \
+ '--gen-suppressions=all ' \
+ '--suppressions=../valgrind-suppression-ssl ' \
+ '%s %s ' % (wget_path, wget_options)
+ elif valgrind not in ("", "0"):
+ cmd_line = '%s %s %s ' % (os.getenv("VALGRIND_TESTS", ""),
+ wget_path,
+ wget_options)
+ else:
+ cmd_line = '%s %s ' % (wget_path, wget_options)
+
+ for req_protocol, urls, domain, port in zip(self.req_protocols,
+ self.urls,
+ self.domains,
+ self.ports):
+ # zip is function for iterating multiple lists at the same time.
+ # e.g. for item1, item2 in zip([1, 5, 3],
+ # ['a', 'e', 'c']):
+ # print(item1, item2)
+ # generates the following output:
+ # 1 a
+ # 5 e
+ # 3 c
+ for url in urls:
+ cmd_line += '%s://%s:%s/%s ' % (req_protocol, domain, port, url)
+
+
+ print(cmd_line)
+
+ return cmd_line
+
+ def __test_cleanup(self):
+ os.chdir('..')
+ try:
+ if not os.getenv("NO_CLEANUP"):
+ shutil.rmtree(self.get_test_dir())
+ except:
+ print("Unknown Exception while trying to remove Test Environment.")
+ self.tests_passed = False
+
+ def _exit_test(self):
+ self.__test_cleanup()
+
+ def begin(self):
+ return 0 if self.tests_passed else 100
+
+ def call_test(self):
+ self.hook_call(self.test_params, 'Test Option')
+
+ try:
+ self.ret_code = self.exec_wget()
+ except TestFailed as e:
+ raise e
+ finally:
+ self.stop_server()
+
+ def do_test(self):
+ self.pre_hook_call()
+ self.call_test()
+ self.post_hook_call()
+
+ def hook_call(self, configs, name):
+ for conf_name, conf_arg in configs.items():
+ try:
+ # conf.find_conf(conf_name) returns the required conf class,
+ # then the class is instantiated with conf_arg, then the
+ # conf instance is called with this test instance itself to
+ # invoke the desired hook
+ conf.find_conf(conf_name)(conf_arg)(self)
+ except AttributeError:
+ self.stop_server()
+ raise TestFailed("%s %s not defined." %
+ (name, conf_name))
+
+ def pre_hook_call(self):
+ self.hook_call(self.pre_configs, 'Pre Test Function')
+
+ def post_hook_call(self):
+ self.hook_call(self.post_configs, 'Post Test Function')
+
+ def _replace_substring(self, string):
+ """
+ Replace first occurrence of "{{name}}" in @string with
+ "getattr(self, name)".
+ """
+ pattern = re.compile(r'\{\{\w+\}\}')
+ match_obj = pattern.search(string)
+ if match_obj is not None:
+ rep = match_obj.group()
+ temp = getattr(self, rep.strip('{}'))
+ string = string.replace(rep, temp)
+ return string
+
+ def instantiate_server_by(self, protocol):
+ """
+ Subclasses must override this method to actually instantiate servers
+ for test cases.
+ """
+ raise NotImplementedError
+
+ def stop_server(self):
+ """
+ Subclasses must implement this method in order to stop certain
+ servers of different types.
+ """
+ raise NotImplementedError
+
+ @staticmethod
+ def get_server_rules(file_obj):
+ """
+ The handling of expect header could be made much better when the
+ options are parsed in a true and better fashion. For an example,
+ see the commented portion in Test-basic-auth.py.
+ """
+ server_rules = {}
+ for rule_name, rule in file_obj.rules.items():
+ server_rules[rule_name] = conf.find_conf(rule_name)(rule)
+ return server_rules
+
+ def __enter__(self):
+ """
+ Initialization for with statement.
+ """
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ """
+ If the with statement got executed with no exception raised, then
+ exc_type, exc_val, exc_tb are all None.
+ """
+ if exc_val:
+ self.tests_passed = False
+ if exc_type is TestFailed:
+ print_red('Error: %s.' % exc_val.error)
+ else:
+ print_red('Unhandled exception caught.')
+ print(exc_val)
+ traceback.print_tb(exc_tb)
+ self.__test_cleanup()
+
+ return self.tests_passed
diff --git a/testenv/test/http_test.py b/testenv/test/http_test.py
new file mode 100644
index 0000000..462ac6e
--- /dev/null
+++ b/testenv/test/http_test.py
@@ -0,0 +1,61 @@
+from misc.colour_terminal import print_green
+from server.http.http_server import HTTPd, HTTPSd
+from test.base_test import BaseTest, HTTP, HTTPS
+
+
+class HTTPTest(BaseTest):
+
+ """ Class for HTTP Tests. """
+
+ # Temp Notes: It is expected that when pre-hook functions are executed,
+ # only an empty test-dir exists. pre-hook functions are executed just prior
+ # to the call to Wget is made. post-hook functions will be executed
+ # immediately after the call to Wget returns.
+
+ def __init__(self,
+ pre_hook=None,
+ test_params=None,
+ post_hook=None,
+ protocols=(HTTP,),
+ req_protocols=None):
+ super(HTTPTest, self).__init__(pre_hook,
+ test_params,
+ post_hook,
+ protocols,
+ req_protocols)
+
+ def setup(self):
+ self.server_setup()
+ self.ready = True
+
+ def begin(self):
+ if not self.ready:
+ # this is to maintain compatibility with scripts that
+ # don't call setup()
+ self.setup()
+ with self:
+ # If any exception occurs, self.__exit__ will be immediately called.
+ # We must call the parent method in the end in order to verify
+ # whether the tests succeeded or not.
+ if self.ready:
+ self.do_test()
+ print_green("Test Passed.")
+ else:
+ self.tests_passed = False
+ return super(HTTPTest, self).begin()
+
+ def instantiate_server_by(self, protocol):
+ server = {HTTP: HTTPd,
+ HTTPS: HTTPSd}[protocol]()
+ server.start()
+
+ return server
+
+ def request_remaining(self):
+ return [s.server_inst.get_req_headers()
+ for s in self.servers]
+
+ def stop_server(self):
+ for server in self.servers:
+ server.server_inst.shutdown()
+# vim: set ts=4 sts=4 sw=4 tw=80 et :
diff --git a/tests/FTPServer.pm b/tests/FTPServer.pm
new file mode 100644
index 0000000..cac8094
--- /dev/null
+++ b/tests/FTPServer.pm
@@ -0,0 +1,998 @@
+# Part of this code was borrowed from Richard Jones's Net::FTPServer
+# http://www.annexia.org/freeware/netftpserver
+
+package FTPServer;
+
+use strict;
+use warnings;
+
+use Cwd;
+use Socket;
+use IO::Socket::INET;
+use IO::Seekable;
+use POSIX qw(strftime);
+
+my $log = undef;
+my $GOT_SIGURG = 0;
+
+# CONSTANTS
+
+# connection states
+my %_connection_states = (
+ 'NEWCONN' => 0x01,
+ 'WAIT4PWD' => 0x02,
+ 'LOGGEDIN' => 0x04,
+ 'TWOSOCKS' => 0x08,
+ );
+
+# subset of FTP commands supported by these server and the respective
+# connection states in which they are allowed
+my %_commands = (
+
+ # Standard commands from RFC 959.
+ 'CWD' => $_connection_states{LOGGEDIN} | $_connection_states{TWOSOCKS},
+
+ # 'EPRT' => $_connection_states{LOGGEDIN},
+ # 'EPSV' => $_connection_states{LOGGEDIN},
+ 'LIST' => $_connection_states{TWOSOCKS},
+
+ # 'LPRT' => $_connection_states{LOGGEDIN},
+ # 'LPSV' => $_connection_states{LOGGEDIN},
+ 'PASS' => $_connection_states{WAIT4PWD},
+ 'PASV' => $_connection_states{LOGGEDIN},
+ 'PORT' => $_connection_states{LOGGEDIN},
+ 'PWD' => $_connection_states{LOGGEDIN} | $_connection_states{TWOSOCKS},
+ 'QUIT' => $_connection_states{LOGGEDIN} | $_connection_states{TWOSOCKS},
+ 'REST' => $_connection_states{TWOSOCKS},
+ 'RETR' => $_connection_states{TWOSOCKS},
+ 'SYST' => $_connection_states{LOGGEDIN},
+ 'TYPE' => $_connection_states{LOGGEDIN} | $_connection_states{TWOSOCKS},
+ 'USER' => $_connection_states{NEWCONN},
+
+ # From ftpexts Internet Draft.
+ 'SIZE' => $_connection_states{LOGGEDIN} | $_connection_states{TWOSOCKS},
+);
+
+# COMMAND-HANDLING ROUTINES
+
+sub _CWD_command
+{
+ my ($conn, $cmd, $path) = @_;
+ my $paths = $conn->{'paths'};
+
+ local $_;
+ my $new_path = FTPPaths::path_merge($conn->{'dir'}, $path);
+
+ # Split the path into its component parts and process each separately.
+ if (!$paths->dir_exists($new_path))
+ {
+ print {$conn->{socket}} "550 Directory not found.\r\n";
+ return;
+ }
+
+ $conn->{'dir'} = $new_path;
+ print {$conn->{socket}} "200 directory changed to $new_path.\r\n";
+}
+
+sub _LIST_command
+{
+ my ($conn, $cmd, $path) = @_;
+ my $paths = $conn->{'paths'};
+
+ my $ReturnEmptyList =
+ ($paths->GetBehavior('list_empty_if_list_a') && $path eq '-a');
+ my $SkipHiddenFiles =
+ ($paths->GetBehavior('list_no_hidden_if_list') && (!$path));
+
+ if ($paths->GetBehavior('list_fails_if_list_a') && $path eq '-a')
+ {
+ print {$conn->{socket}} "500 Unknown command\r\n";
+ return;
+ }
+
+ if (!$paths->GetBehavior('list_dont_clean_path'))
+ {
+ # This is something of a hack. Some clients expect a Unix server
+ # to respond to flags on the 'ls command line'. Remove these flags
+ # and ignore them. This is particularly an issue with ncftp 2.4.3.
+ $path =~ s/^-[a-zA-Z0-9]+\s?//;
+ }
+
+ my $dir = $conn->{'dir'};
+
+ print STDERR "_LIST_command - dir is: $dir\n";
+
+ # Parse the first elements of the path until we find the appropriate
+ # working directory.
+ local $_;
+
+ my $listing;
+ if (!$ReturnEmptyList)
+ {
+ $dir = FTPPaths::path_merge($dir, $path);
+ $listing = $paths->get_list($dir, $SkipHiddenFiles);
+ unless ($listing)
+ {
+ print {$conn->{socket}} "550 File or directory not found.\r\n";
+ return;
+ }
+ }
+
+ print STDERR "_LIST_command - dir is: $dir\n" if $log;
+
+ print {$conn->{socket}} "150 Opening data connection for file listing.\r\n";
+
+ # Open a path back to the client.
+ my $sock = __open_data_connection($conn);
+ unless ($sock)
+ {
+ print {$conn->{socket}} "425 Can't open data connection.\r\n";
+ return;
+ }
+
+ if (!$ReturnEmptyList)
+ {
+ for my $item (@$listing)
+ {
+ print $sock "$item\r\n";
+ }
+ }
+
+ unless ($sock->close)
+ {
+ print {$conn->{socket}} "550 Error closing data connection: $!\r\n";
+ return;
+ }
+
+ print {$conn->{socket}}
+ "226 Listing complete. Data connection has been closed.\r\n";
+}
+
+sub _PASS_command
+{
+ my ($conn, $cmd, $pass) = @_;
+
+ # TODO: implement authentication?
+
+ print STDERR "switching to LOGGEDIN state\n" if $log;
+ $conn->{state} = $_connection_states{LOGGEDIN};
+
+ if ($conn->{username} eq "anonymous")
+ {
+ print {$conn->{socket}}
+ "202 Anonymous user access is always granted.\r\n";
+ }
+ else
+ {
+ print {$conn->{socket}}
+ "230 Authentication not implemented yet, access is always granted.\r\n";
+ }
+}
+
+sub _PASV_command
+{
+ my ($conn, $cmd, $rest) = @_;
+
+ # Open a listening socket - but don't actually accept on it yet.
+ "0" =~ /(0)/; # Perl 5.7 / IO::Socket::INET bug workaround.
+ my $sock = IO::Socket::INET->new(
+ LocalHost => '127.0.0.1',
+ LocalPort => '0',
+ Listen => 1,
+ Reuse => 1,
+ Proto => 'tcp',
+ Type => SOCK_STREAM
+ );
+
+ unless ($sock)
+ {
+ # Return a code 550 here, even though this is not in the RFC. XXX
+ print {$conn->{socket}} "550 Can't open a listening socket.\r\n";
+ return;
+ }
+
+ $conn->{passive} = 1;
+ $conn->{passive_socket} = $sock;
+
+ # Get our port number.
+ my $sockport = $sock->sockport;
+
+ # Split the port number into high and low components.
+ my $p1 = int($sockport / 256);
+ my $p2 = $sockport % 256;
+
+ $conn->{state} = $_connection_states{TWOSOCKS};
+
+ # We only accept connections from localhost.
+ print {$conn->{socket}} "227 Entering Passive Mode (127,0,0,1,$p1,$p2)\r\n";
+}
+
+sub _PORT_command
+{
+ my ($conn, $cmd, $rest) = @_;
+
+ # The arguments to PORT are a1,a2,a3,a4,p1,p2 where a1 is the
+ # most significant part of the address (eg. 127,0,0,1) and
+ # p1 is the most significant part of the port.
+ unless ($rest =~
+ /^\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})/
+ )
+ {
+ print {$conn->{socket}} "501 Syntax error in PORT command.\r\n";
+ return;
+ }
+
+ # Check host address.
+ unless ( $1 > 0
+ && $1 < 224
+ && $2 >= 0
+ && $2 < 256
+ && $3 >= 0
+ && $3 < 256
+ && $4 >= 0
+ && $4 < 256)
+ {
+ print {$conn->{socket}} "501 Invalid host address.\r\n";
+ return;
+ }
+
+ # Construct host address and port number.
+ my $peeraddrstring = "$1.$2.$3.$4";
+ my $peerport = $5 * 256 + $6;
+
+ # Check port number.
+ unless ($peerport > 0 && $peerport < 65536)
+ {
+ print {$conn->{socket}} "501 Invalid port number.\r\n";
+ }
+
+ $conn->{peeraddrstring} = $peeraddrstring;
+ $conn->{peeraddr} = inet_aton($peeraddrstring);
+ $conn->{peerport} = $peerport;
+ $conn->{passive} = 0;
+
+ $conn->{state} = $_connection_states{TWOSOCKS};
+
+ print {$conn->{socket}} "200 PORT command OK.\r\n";
+}
+
+sub _PWD_command
+{
+ my ($conn, $cmd, $rest) = @_;
+
+ # See RFC 959 Appendix II and draft-ietf-ftpext-mlst-11.txt section 6.2.1.
+ my $pathname = $conn->{dir};
+ $pathname =~ s,/+$,, unless $pathname eq "/";
+ $pathname =~ tr,/,/,s;
+
+ print {$conn->{socket}} "257 \"$pathname\"\r\n";
+}
+
+sub _REST_command
+{
+ my ($conn, $cmd, $restart_from) = @_;
+
+ unless ($restart_from =~ /^([1-9][0-9]*|0)$/)
+ {
+ print {$conn->{socket}}
+ "501 REST command needs a numeric argument.\r\n";
+ return;
+ }
+
+ $conn->{restart} = $1;
+
+ print {$conn->{socket}} "350 Restarting next transfer at $1.\r\n";
+}
+
+sub _RETR_command
+{
+ my ($conn, $cmd, $path) = @_;
+
+ $path = FTPPaths::path_merge($conn->{dir}, $path);
+ my $info = $conn->{'paths'}->get_info($path);
+
+ unless ($info->{'_type'} eq 'f')
+ {
+ print {$conn->{socket}} "550 File not found.\r\n";
+ return;
+ }
+
+ print {$conn->{socket}} "150 Opening "
+ . ($conn->{type} eq 'A' ? "ASCII mode" : "BINARY mode")
+ . " data connection.\r\n";
+
+ # Open a path back to the client.
+ my $sock = __open_data_connection($conn);
+
+ unless ($sock)
+ {
+ print {$conn->{socket}} "425 Can't open data connection.\r\n";
+ return;
+ }
+
+ my $content = $info->{'content'};
+
+ # Restart the connection from previous point?
+ if ($conn->{restart})
+ {
+ $content = substr($content, $conn->{restart});
+ $conn->{restart} = 0;
+ }
+
+ # What mode are we sending this file in?
+ unless ($conn->{type} eq 'A') # Binary type.
+ {
+ my ($r, $buffer, $n, $w, $sent);
+
+ # Copy data.
+ $sent = 0;
+ while ($sent < length($content))
+ {
+ $buffer = substr($content, $sent, 65536);
+ $r = length $buffer;
+
+ # Restart alarm clock timer.
+ alarm $conn->{idle_timeout};
+
+ for ($n = 0 ; $n < $r ;)
+ {
+ $w = syswrite($sock, $buffer, $r - $n, $n);
+
+ # Cleanup and exit if there was an error.
+ unless (defined $w)
+ {
+ close $sock;
+ print {$conn->{socket}}
+ "426 File retrieval error: $!. Data connection has been closed.\r\n";
+ return;
+ }
+
+ $n += $w;
+ }
+
+ # Transfer aborted by client?
+ if ($GOT_SIGURG)
+ {
+ $GOT_SIGURG = 0;
+ close $sock;
+ print {$conn->{socket}}
+ "426 Transfer aborted. Data connection closed.\r\n";
+ return;
+ }
+ $sent += $r;
+ }
+
+ # Cleanup and exit if there was an error.
+ unless (defined $r)
+ {
+ close $sock;
+ print {$conn->{socket}}
+ "426 File retrieval error: $!. Data connection has been closed.\r\n";
+ return;
+ }
+ }
+ else
+ { # ASCII type.
+ # Copy data.
+ my @lines = split /\r\n?|\n/, $content;
+ for (@lines)
+ {
+ # Remove any native line endings.
+ s/[\n\r]+$//;
+
+ # Restart alarm clock timer.
+ alarm $conn->{idle_timeout};
+
+ # Write the line with telnet-format line endings.
+ print $sock "$_\r\n";
+
+ # Transfer aborted by client?
+ if ($GOT_SIGURG)
+ {
+ $GOT_SIGURG = 0;
+ close $sock;
+ print {$conn->{socket}}
+ "426 Transfer aborted. Data connection closed.\r\n";
+ return;
+ }
+ }
+ }
+
+ unless (close($sock))
+ {
+ print {$conn->{socket}} "550 File retrieval error: $!.\r\n";
+ return;
+ }
+
+ print {$conn->{socket}}
+ "226 File retrieval complete. Data connection has been closed.\r\n";
+}
+
+sub _SIZE_command
+{
+ my ($conn, $cmd, $path) = @_;
+
+ $path = FTPPaths::path_merge($conn->{dir}, $path);
+ my $info = $conn->{'paths'}->get_info($path);
+ unless ($info)
+ {
+ print {$conn->{socket}} "550 File or directory not found.\r\n";
+ return;
+ }
+
+ if ($info->{'_type'} eq 'd')
+ {
+ print {$conn->{socket}}
+ "550 SIZE command is not supported on directories.\r\n";
+ return;
+ }
+
+ my $size = length $info->{'content'};
+
+ print {$conn->{socket}} "213 $size\r\n";
+}
+
+sub _SYST_command
+{
+ my ($conn, $cmd, $dummy) = @_;
+
+ if ($conn->{'paths'}->GetBehavior('syst_response'))
+ {
+ print {$conn->{socket}} $conn->{'paths'}->GetBehavior('syst_response')
+ . "\r\n";
+ }
+ else
+ {
+ print {$conn->{socket}} "215 UNIX Type: L8\r\n";
+ }
+}
+
+sub _TYPE_command
+{
+ my ($conn, $cmd, $type) = @_;
+
+ # See RFC 959 section 5.3.2.
+ if ($type =~ /^([AI])$/i)
+ {
+ $conn->{type} = $1;
+ }
+ elsif ($type =~ /^([AI])\sN$/i)
+ {
+ $conn->{type} = $1;
+ }
+ elsif ($type =~ /^L\s8$/i)
+ {
+ $conn->{type} = 'L8';
+ }
+ else
+ {
+ print {$conn->{socket}}
+ "504 This server does not support TYPE $type.\r\n";
+ return;
+ }
+
+ print {$conn->{socket}} "200 TYPE changed to $type.\r\n";
+}
+
+sub _USER_command
+{
+ my ($conn, $cmd, $username) = @_;
+
+ print STDERR "username: $username\n" if $log;
+ $conn->{username} = $username;
+
+ print STDERR "switching to WAIT4PWD state\n" if $log;
+ $conn->{state} = $_connection_states{WAIT4PWD};
+
+ if ($conn->{username} eq "anonymous")
+ {
+ print {$conn->{socket}} "230 Anonymous user access granted.\r\n";
+ }
+ else
+ {
+ print {$conn->{socket}} "331 Password required.\r\n";
+ }
+}
+
+# HELPER ROUTINES
+
+sub __open_data_connection
+{
+ my $conn = shift;
+
+ my $sock;
+
+ if ($conn->{passive})
+ {
+ # Passive mode - wait for a connection from the client.
+ accept($sock, $conn->{passive_socket}) or return undef;
+ }
+ else
+ {
+ # Active mode - connect back to the client.
+ "0" =~ /(0)/; # Perl 5.7 / IO::Socket::INET bug workaround.
+ $sock = IO::Socket::INET->new(
+ LocalAddr => '127.0.0.1',
+ PeerAddr => $conn->{peeraddrstring},
+ PeerPort => $conn->{peerport},
+ Proto => 'tcp',
+ Type => SOCK_STREAM
+ )
+ or return undef;
+ }
+
+ return $sock;
+}
+
+###########################################################################
+# FTPSERVER CLASS
+###########################################################################
+
+{
+ my %_attr_data = ( # DEFAULT
+ _input => undef,
+ _localAddr => 'localhost',
+ _localPort => undef,
+ _reuseAddr => 1,
+ _rootDir => Cwd::getcwd(),
+ _server_behavior => {},
+ );
+
+ sub _default_for
+ {
+ my ($self, $attr) = @_;
+ $_attr_data{$attr};
+ }
+
+ sub _standard_keys
+ {
+ keys %_attr_data;
+ }
+}
+
+sub new
+{
+ my ($caller, %args) = @_;
+ my $caller_is_obj = ref($caller);
+ my $class = $caller_is_obj || $caller;
+ my $self = bless {}, $class;
+ foreach my $attrname ($self->_standard_keys())
+ {
+ my ($argname) = ($attrname =~ /^_(.*)/);
+ if (exists $args{$argname})
+ {
+ $self->{$attrname} = $args{$argname};
+ }
+ elsif ($caller_is_obj)
+ {
+ $self->{$attrname} = $caller->{$attrname};
+ }
+ else
+ {
+ $self->{$attrname} = $self->_default_for($attrname);
+ }
+ }
+
+ # create server socket
+ "0" =~ /(0)/; # Perl 5.7 / IO::Socket::INET bug workaround.
+ $self->{_server_sock} =
+ IO::Socket::INET->new(
+ LocalHost => $self->{_localAddr},
+ LocalPort => $self->{_localPort},
+ Listen => 1,
+ Reuse => $self->{_reuseAddr},
+ Proto => 'tcp',
+ Type => SOCK_STREAM
+ )
+ or die "bind: $!";
+
+ foreach my $file (keys %{$self->{_input}})
+ {
+ my $ref = \$self->{_input}{$file}{content};
+ $$ref =~ s/\Q{{port}}/$self->sockport/eg;
+ }
+
+ return $self;
+}
+
+sub run
+{
+ my ($self, $synch_callback) = @_;
+ my $initialized = 0;
+
+ # turn buffering off on STDERR
+ select((select(STDERR), $| = 1)[0]);
+
+ # initialize command table
+ my $command_table = {};
+ foreach (keys %_commands)
+ {
+ my $subname = "_${_}_command";
+ $command_table->{$_} = \&$subname;
+ }
+
+ my $old_ils = $/;
+ $/ = "\r\n";
+
+ if (!$initialized)
+ {
+ $synch_callback->();
+ $initialized = 1;
+ }
+
+ $SIG{CHLD} = sub { wait };
+ my $server_sock = $self->{_server_sock};
+
+ # the accept loop
+ while (my $client_addr = accept(my $socket, $server_sock))
+ {
+ # turn buffering off on $socket
+ select((select($socket), $| = 1)[0]);
+
+ # find out who connected
+ my ($client_port, $client_ip) = sockaddr_in($client_addr);
+ my $client_ipnum = inet_ntoa($client_ip);
+
+ # print who connected
+ print STDERR "got a connection from: $client_ipnum\n" if $log;
+
+ # fork off a process to handle this connection.
+ # my $pid = fork();
+ # unless (defined $pid) {
+ # warn "fork: $!";
+ # sleep 5; # Back off in case system is overloaded.
+ # next;
+ # }
+
+ if (1)
+ { # Child process.
+
+ # install signals
+ $SIG{URG} = sub {
+ $GOT_SIGURG = 1;
+ };
+
+ $SIG{PIPE} = sub {
+ print STDERR "Client closed connection abruptly.\n";
+ exit;
+ };
+
+ $SIG{ALRM} = sub {
+ print STDERR
+ "Connection idle timeout expired. Closing server.\n";
+ exit;
+ };
+
+ #$SIG{CHLD} = 'IGNORE';
+
+ print STDERR "in child\n" if $log;
+
+ my $conn = {
+ 'paths' =>
+ FTPPaths->new($self->{'_input'}, $self->{'_server_behavior'}),
+ 'socket' => $socket,
+ 'state' => $_connection_states{NEWCONN},
+ 'dir' => '/',
+ 'restart' => 0,
+ 'idle_timeout' => 60, # 1 minute timeout
+ 'rootdir' => $self->{_rootDir},
+ };
+
+ print {$conn->{socket}}
+ "220 GNU Wget Testing FTP Server ready.\r\n";
+
+ # command handling loop
+ for (; ;)
+ {
+ print STDERR "waiting for request\n" if $log;
+
+ last unless defined(my $req = <$socket>);
+
+ # Remove trailing CRLF.
+ $req =~ s/[\n\r]+$//;
+
+ print STDERR "received request $req\n" if $log;
+
+ # Get the command.
+ # See also RFC 2640 section 3.1.
+ unless ($req =~ m/^([A-Z]{3,4})\s?(.*)/i)
+ {
+ # badly formed command
+ exit 0;
+ }
+
+ # The following strange 'eval' is necessary to work around a
+ # very odd bug in Perl 5.6.0. The following assignment to
+ # $cmd will fail in some cases unless you use $1 in some sort
+ # of an expression beforehand.
+ # - RWMJ 2002-07-05.
+ eval '$1 eq $1';
+
+ my ($cmd, $rest) = (uc $1, $2);
+
+ # Got a command which matches in the table?
+ unless (exists $command_table->{$cmd})
+ {
+ print {$conn->{socket}} "500 Unrecognized command.\r\n";
+ next;
+ }
+
+ # Command requires user to be authenticated?
+ unless ($_commands{$cmd} | $conn->{state})
+ {
+ print {$conn->{socket}} "530 Not logged in.\r\n";
+ next;
+ }
+
+ # Handle the QUIT command specially.
+ if ($cmd eq "QUIT")
+ {
+ print {$conn->{socket}}
+ "221 Goodbye. Service closing connection.\r\n";
+ last;
+ }
+
+ if (defined($self->{_server_behavior}{fail_on_pasv})
+ && $cmd eq 'PASV')
+ {
+ undef $self->{_server_behavior}{fail_on_pasv};
+ close $socket;
+ last;
+ }
+
+ if (defined($self->{_server_behavior}{pasv_not_supported})
+ && $cmd eq 'PASV')
+ {
+ print {$conn->{socket}}
+ "500 PASV not supported.\r\n";
+ next;
+ }
+
+ # Run the command.
+ &{$command_table->{$cmd}}($conn, $cmd, $rest);
+ }
+ }
+ else
+ { # Father
+ close $socket;
+ }
+ }
+
+ $/ = $old_ils;
+}
+
+sub sockport
+{
+ my $self = shift;
+ return $self->{_server_sock}->sockport;
+}
+
+package FTPPaths;
+
+use POSIX qw(strftime);
+
+# not a method
+sub final_component
+{
+ my $path = shift;
+
+ $path =~ s|.*/||;
+ return $path;
+}
+
+# not a method
+sub path_merge
+{
+ my ($path_a, $path_b) = @_;
+
+ if (!$path_b)
+ {
+ return $path_a;
+ }
+
+ if ($path_b =~ m.^/.)
+ {
+ $path_a = '';
+ $path_b =~ s.^/..;
+ }
+ $path_a =~ s./$..;
+
+ my @components = split m{/}msx, $path_b;
+
+ foreach my $c (@components)
+ {
+ if ($c =~ /^\.?$/)
+ {
+ next;
+ }
+ elsif ($c eq '..')
+ {
+ if (!$path_a)
+ {
+ next;
+ }
+ $path_a =~ s|/[^/]*$||;
+ }
+ else
+ {
+ $path_a .= "/$c";
+ }
+ }
+
+ return $path_a;
+}
+
+sub new
+{
+ my ($this, @args) = @_;
+ my $class = ref($this) || $this;
+ my $self = {};
+ bless $self, $class;
+ $self->initialize(@args);
+ return $self;
+}
+
+sub initialize
+{
+ my ($self, $urls, $behavior) = @_;
+ my $paths = {_type => 'd'};
+
+ # From a path like '/foo/bar/baz.txt', construct $paths such that
+ # $paths->{'foo'}->{'bar'}->{'baz.txt'} is
+ # $urls->{'/foo/bar/baz.txt'}.
+ for my $path (keys %$urls)
+ {
+ my @components = split m{/}msx, $path;
+ shift @components;
+ my $x = $paths;
+ for my $c (@components)
+ {
+ if (!exists $x->{$c})
+ {
+ $x->{$c} = {_type => 'd'};
+ }
+ $x = $x->{$c};
+ }
+ %$x = %{$urls->{$path}};
+ $x->{_type} = 'f';
+ }
+
+ $self->{'_paths'} = $paths;
+ $self->{'_behavior'} = $behavior;
+ return 1;
+}
+
+sub get_info
+{
+ my ($self, $path, $node) = @_;
+ $node = $self->{'_paths'} unless $node;
+ my @components = split('/', $path);
+ shift @components if @components && $components[0] eq '';
+
+ for my $c (@components)
+ {
+ if ($node->{'_type'} eq 'd')
+ {
+ $node = $node->{$c};
+ }
+ else
+ {
+ return;
+ }
+ }
+ return $node;
+}
+
+sub dir_exists
+{
+ my ($self, $path) = @_;
+ return $self->path_exists($path, 'd');
+}
+
+sub path_exists
+{
+ # type is optional, in which case we don't check it.
+ my ($self, $path, $type) = @_;
+ my $paths = $self->{'_paths'};
+
+ die "Invalid path $path (not absolute).\n" unless $path =~ m.^/.;
+ my $info = $self->get_info($path);
+ return 0 unless defined($info);
+ return $info->{'_type'} eq $type if defined($type);
+ return 1;
+}
+
+sub _format_for_list
+{
+ my ($self, $name, $info) = @_;
+
+ # XXX: mode should be specifyable as part of the node info.
+ my $mode_str;
+ if ($info->{'_type'} eq 'd')
+ {
+ $mode_str = 'dr-xr-xr-x';
+ }
+ else
+ {
+ $mode_str = '-r--r--r--';
+ }
+
+ my $size = 0;
+ if ($info->{'_type'} eq 'f')
+ {
+ $size = length $info->{'content'};
+ if ($self->{'_behavior'}{'bad_list'})
+ {
+ $size = 0;
+ }
+ }
+ my $date = strftime("%b %d %H:%M", localtime);
+ return "$mode_str 1 0 0 $size $date $name";
+}
+
+sub get_list
+{
+ my ($self, $path, $no_hidden) = @_;
+ my $info = $self->get_info($path);
+ if (!defined $info)
+ {
+ return;
+ }
+ my $list = [];
+
+ if ($info->{'_type'} eq 'd')
+ {
+ for my $item (keys %$info)
+ {
+ next if $item =~ /^_/;
+
+ # 2013-10-17 Andrea Urbani (matfanjol)
+ # I skip the hidden files if requested
+ if ( ($no_hidden)
+ && (defined($info->{$item}->{'attr'}))
+ && (index($info->{$item}->{'attr'}, "H") >= 0))
+ {
+ # This is an hidden file and I don't want to see it!
+ print STDERR "get_list: Skipped hidden file [$item]\n";
+ }
+ else
+ {
+ push @$list, $self->_format_for_list($item, $info->{$item});
+ }
+ }
+ }
+ else
+ {
+ push @$list, $self->_format_for_list(final_component($path), $info);
+ }
+
+ return $list;
+}
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# It returns the behavior of the given name.
+# In this file I handle also the following behaviors:
+# list_dont_clean_path : if defined, the command
+# $path =~ s/^-[a-zA-Z0-9]+\s?//;
+# is not runt and the given path
+# remains the original one
+# list_empty_if_list_a : if defined, "LIST -a" returns an
+# empty content
+# list_fails_if_list_a : if defined, "LIST -a" returns an
+# error
+# list_no_hidden_if_list: if defined, "LIST" doesn't return
+# hidden files.
+# To define an hidden file add
+# attr => "H"
+# to the url files
+# syst_response : if defined, its content is printed
+# out as SYST response
+sub GetBehavior
+{
+ my ($self, $name) = @_;
+ return $self->{'_behavior'}{$name};
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/FTPTest.pm b/tests/FTPTest.pm
new file mode 100644
index 0000000..0a1c768
--- /dev/null
+++ b/tests/FTPTest.pm
@@ -0,0 +1,62 @@
+package FTPTest;
+
+use strict;
+use warnings;
+
+use FTPServer;
+use WgetTests;
+
+our @ISA = qw(WgetTest);
+my $VERSION = 0.01;
+
+{
+ my %_attr_data = ( # DEFAULT
+ );
+
+ sub _default_for
+ {
+ my ($self, $attr) = @_;
+ return $_attr_data{$attr} if exists $_attr_data{$attr};
+ return $self->SUPER::_default_for($attr);
+ }
+
+ sub _standard_keys
+ {
+ my ($self) = @_;
+ ($self->SUPER::_standard_keys(), keys %_attr_data);
+ }
+}
+
+sub _setup_server
+{
+ my $self = shift;
+
+ $self->{_server} = FTPServer->new(
+ input => $self->{_input},
+ server_behavior => $self->{_server_behavior},
+ LocalAddr => 'localhost',
+ ReuseAddr => 1,
+ rootDir => "$self->{_workdir}/$self->{_name}/input"
+ )
+ or die "Cannot create server!!!";
+}
+
+sub _launch_server
+{
+ my $self = shift;
+ my $synch_func = shift;
+
+ $self->{_server}->run($synch_func);
+}
+
+sub _substitute_port
+{
+ my $self = shift;
+ my $ret = shift;
+ $ret =~ s/\Q{{port}}/$self->{_server}->sockport/eg;
+ return $ret;
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/HTTPServer.pm b/tests/HTTPServer.pm
new file mode 100644
index 0000000..78609f6
--- /dev/null
+++ b/tests/HTTPServer.pm
@@ -0,0 +1,319 @@
+package HTTPServer;
+
+use strict;
+use warnings;
+
+use HTTP::Daemon;
+use HTTP::Status;
+use HTTP::Headers;
+use HTTP::Response;
+
+our @ISA = qw(HTTP::Daemon);
+my $VERSION = 0.01;
+
+my $CRLF = "\015\012"; # "\r\n" is not portable
+my $log = undef;
+
+sub run
+{
+ my ($self, $urls, $synch_callback) = @_;
+ my $initialized = 0;
+
+ while (1)
+ {
+ if (!$initialized)
+ {
+ $synch_callback->();
+ $initialized = 1;
+ }
+ my $con = $self->accept();
+ print STDERR "Accepted a new connection\n" if $log;
+ while (my $req = $con->get_request)
+ {
+ #my $url_path = $req->url->path;
+ my $url_path = $req->url->as_string;
+ if ($url_path =~ m{/$})
+ { # append 'index.html'
+ $url_path .= 'index.html';
+ }
+
+ #if ($url_path =~ m{^/}) { # remove trailing '/'
+ # $url_path = substr ($url_path, 1);
+ #}
+ if ($log)
+ {
+ print STDERR "Method: ", $req->method, "\n";
+ print STDERR "Path: ", $url_path, "\n";
+ print STDERR "Available URLs: ", "\n";
+ foreach my $key (keys %$urls)
+ {
+ print STDERR $key, "\n";
+ }
+ }
+ if (exists($urls->{$url_path}))
+ {
+ print STDERR "Serving requested URL: ", $url_path, "\n" if $log;
+ next unless ($req->method eq "HEAD" || $req->method eq "GET");
+
+ my $url_rec = $urls->{$url_path};
+ $self->send_response($req, $url_rec, $con);
+ }
+ else
+ {
+ print STDERR "Requested wrong URL: ", $url_path, "\n" if $log;
+ $con->send_error($HTTP::Status::RC_FORBIDDEN);
+ last;
+ }
+ }
+ print STDERR "Closing connection\n" if $log;
+ $con->close;
+ }
+}
+
+sub send_response
+{
+ my ($self, $req, $url_rec, $con) = @_;
+
+ # create response
+ my ($code, $msg, $headers);
+ my $send_content = ($req->method eq "GET");
+ if (exists $url_rec->{'auth_method'})
+ {
+ ($send_content, $code, $msg, $headers) =
+ $self->handle_auth($req, $url_rec);
+ }
+ elsif (!$self->verify_request_headers($req, $url_rec))
+ {
+ ($send_content, $code, $msg, $headers) =
+ ('', 400, 'Mismatch on expected headers', {});
+ }
+ else
+ {
+ ($code, $msg) = @{$url_rec}{'code', 'msg'};
+ $headers = $url_rec->{headers};
+ }
+ my $resp = HTTP::Response->new($code, $msg);
+ print STDERR "HTTP::Response: \n", $resp->as_string if $log;
+
+ while (my ($name, $value) = each %{$headers})
+ {
+ # print STDERR "setting header: $name = $value\n";
+ $value = $self->_substitute_port($value);
+ $resp->header($name => $value);
+ }
+ print STDERR "HTTP::Response with headers: \n", $resp->as_string if $log;
+
+ if ($send_content)
+ {
+ my $content = $url_rec->{content};
+ if (exists($url_rec->{headers}{"Content-Length"}))
+ {
+ # Content-Length and length($content) don't match
+ # manually prepare the HTTP response
+ $con->send_basic_header($url_rec->{code}, $resp->message,
+ $resp->protocol);
+ print $con $resp->headers_as_string($CRLF);
+ print $con $CRLF;
+ print $con $content;
+ next;
+ }
+ if ($req->header("Range") && !$url_rec->{'force_code'})
+ {
+ $req->header("Range") =~ m/bytes=(\d*)-(\d*)/;
+ my $content_len = length($content);
+ my $start = $1 ? $1 : 0;
+ my $end = $2 ? $2 : ($content_len - 1);
+ my $len = $2 ? ($2 - $start) : ($content_len - $start);
+ if ($len > 0)
+ {
+ $resp->header("Accept-Ranges" => "bytes");
+ $resp->header("Content-Length" => $len);
+ $resp->header(
+ "Content-Range" => "bytes $start-$end/$content_len");
+ $resp->header("Keep-Alive" => "timeout=15, max=100");
+ $resp->header("Connection" => "Keep-Alive");
+ $con->send_basic_header(206,
+ "Partial Content", $resp->protocol);
+ print $con $resp->headers_as_string($CRLF);
+ print $con $CRLF;
+ print $con substr($content, $start, $len);
+ }
+ else
+ {
+ $con->send_basic_header(416, "Range Not Satisfiable",
+ $resp->protocol);
+ $resp->header("Keep-Alive" => "timeout=15, max=100");
+ $resp->header("Connection" => "Keep-Alive");
+ print $con $CRLF;
+ }
+ next;
+ }
+
+ # fill in content
+ $content = $self->_substitute_port($content) if defined $content;
+ $resp->content($content);
+ print STDERR "HTTP::Response with content: \n", $resp->as_string
+ if $log;
+ }
+
+ $con->send_response($resp);
+ print STDERR "HTTP::Response sent: \n", $resp->as_string if $log;
+}
+
+# Generates appropriate response content based on the authentication
+# status of the URL.
+sub handle_auth
+{
+ my ($self, $req, $url_rec) = @_;
+ my ($send_content, $code, $msg, $headers);
+
+ # Catch failure to set code, msg:
+ $code = 500;
+ $msg = "Didn't set response code in handle_auth";
+
+ # Most cases, we don't want to send content.
+ $send_content = 0;
+
+ # Initialize headers
+ $headers = {};
+ my $authhdr = $req->header('Authorization');
+
+ # Have we sent the challenge yet?
+ unless ($url_rec->{auth_challenged} || $url_rec->{auth_no_challenge})
+ {
+ # Since we haven't challenged yet, we'd better not
+ # have received authentication (for our testing purposes).
+ if ($authhdr)
+ {
+ $code = 400;
+ $msg = "You sent auth before I sent challenge";
+ }
+ else
+ {
+ # Send challenge
+ $code = 401;
+ $msg = "Authorization Required";
+ $headers->{'WWW-Authenticate'} =
+ $url_rec->{'auth_method'} . " realm=\"wget-test\"";
+ $url_rec->{auth_challenged} = 1;
+ }
+ }
+ elsif (!defined($authhdr))
+ {
+ # We've sent the challenge; we should have received valid
+ # authentication with this one. A normal server would just
+ # resend the challenge; but since this is a test, wget just
+ # failed it.
+ $code = 400;
+ $msg = "You didn't send auth after I sent challenge";
+ if ($url_rec->{auth_no_challenge})
+ {
+ $msg = "--auth-no-challenge but no auth sent.";
+ }
+ }
+ else
+ {
+ my ($sent_method) = ($authhdr =~ /^(\S+)/g);
+ unless ($sent_method eq $url_rec->{'auth_method'})
+ {
+ # Not the authorization type we were expecting.
+ $code = 400;
+ $msg = "Expected auth type $url_rec->{'auth_method'} but got "
+ . "$sent_method";
+ }
+ elsif (
+ (
+ $sent_method eq 'Digest'
+ && &verify_auth_digest($authhdr, $url_rec, \$msg)
+ )
+ || ( $sent_method eq 'Basic'
+ && &verify_auth_basic($authhdr, $url_rec, \$msg))
+ )
+ {
+ # SUCCESSFUL AUTH: send expected message, headers, content.
+ ($code, $msg) = @{$url_rec}{'code', 'msg'};
+ $headers = $url_rec->{headers};
+ $send_content = 1;
+ }
+ else
+ {
+ $code = 400;
+ }
+ }
+
+ return ($send_content, $code, $msg, $headers);
+}
+
+sub verify_auth_digest
+{
+ return undef; # Not yet implemented.
+}
+
+sub verify_auth_basic
+{
+ require MIME::Base64;
+ my ($authhdr, $url_rec, $msgref) = @_;
+ my $expected =
+ MIME::Base64::encode_base64(
+ $url_rec->{'user'} . ':' . $url_rec->{'passwd'},
+ '');
+ my ($got) = $authhdr =~ /^Basic (.*)$/;
+ if ($got eq $expected)
+ {
+ return 1;
+ }
+ else
+ {
+ $$msgref = "Wanted ${expected} got ${got}";
+ return undef;
+ }
+}
+
+sub verify_request_headers
+{
+ my ($self, $req, $url_rec) = @_;
+
+ return 1 unless exists $url_rec->{'request_headers'};
+ for my $hdrname (keys %{$url_rec->{'request_headers'}})
+ {
+ my $must_not_match;
+ my $ehdr = $url_rec->{'request_headers'}{$hdrname};
+ if ($must_not_match = ($hdrname =~ /^!(\w+)/))
+ {
+ $hdrname = $1;
+ }
+ my $rhdr = $req->header($hdrname);
+ if ($must_not_match)
+ {
+ if (defined $rhdr && $rhdr =~ $ehdr)
+ {
+ $rhdr = '' unless defined $rhdr;
+ print STDERR "\n*** Match forbidden $hdrname: $rhdr =~ $ehdr\n";
+ return undef;
+ }
+ }
+ else
+ {
+ unless (defined $rhdr && $rhdr =~ $ehdr)
+ {
+ $rhdr = '' unless defined $rhdr;
+ print STDERR "\n*** Mismatch on $hdrname: $rhdr =~ $ehdr\n";
+ return undef;
+ }
+ }
+ }
+
+ return 1;
+}
+
+sub _substitute_port
+{
+ my $self = shift;
+ my $ret = shift;
+ $ret =~ s/\Q{{port}}/$self->sockport/eg;
+ return $ret;
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/HTTPTest.pm b/tests/HTTPTest.pm
new file mode 100644
index 0000000..6225c7f
--- /dev/null
+++ b/tests/HTTPTest.pm
@@ -0,0 +1,56 @@
+package HTTPTest;
+
+use strict;
+use warnings;
+
+use HTTPServer;
+use WgetTests;
+
+our @ISA = qw(WgetTest);
+my $VERSION = 0.01;
+
+{
+ my %_attr_data = ( # DEFAULT
+ );
+
+ sub _default_for
+ {
+ my ($self, $attr) = @_;
+ return $_attr_data{$attr} if exists $_attr_data{$attr};
+ return $self->SUPER::_default_for($attr);
+ }
+
+ sub _standard_keys
+ {
+ my ($self) = @_;
+ ($self->SUPER::_standard_keys(), keys %_attr_data);
+ }
+}
+
+sub _setup_server
+{
+ my $self = shift;
+ $self->{_server} = HTTPServer->new(LocalAddr => 'localhost',
+ ReuseAddr => 1)
+ or die "Cannot create server!!!";
+}
+
+sub _launch_server
+{
+ my $self = shift;
+ my $synch_func = shift;
+
+ $self->{_server}->run($self->{_input}, $synch_func);
+}
+
+sub _substitute_port
+{
+ my $self = shift;
+ my $ret = shift;
+ $ret =~ s/\Q{{port}}/$self->{_server}->sockport/eg;
+ return $ret;
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..5c9ae8d
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,163 @@
+# Makefile for `wget' utility
+# Copyright (C) 1995-2011, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+# see http://www.gnu.org/software/automake/manual/html_node/Parallel-Test-Harness.html#Parallel-Test-Harness
+
+#
+# Version: @VERSION@
+#
+
+../src/wget$(EXEEXT):
+ cd ../src && $(MAKE) $(AM_MAKEFLAGS)
+
+# Make libunittest "PHONY" so we're always sure we're up-to-date.
+.PHONY: ../src/libunittest.a
+../src/libunittest.a:
+ cd ../src && $(MAKE) $(AM_MAKEFLAGS) libunittest.a
+
+../lib/libgnu.a:
+ cd ../lib && $(MAKE) $(AM_MAKEFLAGS)
+
+PX_TESTS = \
+ Test-auth-basic.px \
+ Test-auth-no-challenge.px \
+ Test-auth-no-challenge-url.px \
+ Test-auth-with-content-disposition.px \
+ Test-auth-retcode.px \
+ Test-c-full.px \
+ Test-c-partial.px \
+ Test-c.px \
+ Test-c-shorter.px \
+ Test-cookies.px \
+ Test-cookies-401.px \
+ Test-E-k-K.px \
+ Test-E-k.px \
+ Test-ftp.px \
+ Test-ftp-pasv-fail.px \
+ Test-ftp-bad-list.px \
+ Test-ftp-recursive.px \
+ Test-ftp-iri.px \
+ Test-ftp-iri-fallback.px \
+ Test-ftp-iri-recursive.px \
+ Test-ftp-iri-disabled.px \
+ Test-ftp-list-Multinet.px \
+ Test-ftp-list-Unknown.px \
+ Test-ftp-list-Unknown-a.px \
+ Test-ftp-list-Unknown-hidden.px \
+ Test-ftp-list-Unknown-list-a-fails.px \
+ Test-ftp-list-UNIX-hidden.px \
+ Test-ftp--start-pos.px \
+ Test-HTTP-Content-Disposition-1.px \
+ Test-HTTP-Content-Disposition-2.px \
+ Test-HTTP-Content-Disposition.px \
+ Test-i-ftp.px \
+ Test-i-http.px \
+ Test-idn-headers.px \
+ Test-idn-meta.px \
+ Test-idn-cmd.px \
+ Test-idn-cmd-utf8.px \
+ Test-idn-robots.px \
+ Test-idn-robots-utf8.px \
+ Test-iri.px \
+ Test-iri-percent.px \
+ Test-iri-disabled.px \
+ Test-iri-forced-remote.px \
+ Test-iri-list.px \
+ Test-k.px \
+ Test-meta-robots.px \
+ Test-N-current.px \
+ Test-N-HTTP-Content-Disposition.px \
+ Test-N--no-content-disposition.px \
+ Test-N--no-content-disposition-trivial.px \
+ Test-N-no-info.px \
+ Test--no-content-disposition.px \
+ Test--no-content-disposition-trivial.px \
+ Test-N-old.px \
+ Test-nonexisting-quiet.px \
+ Test-noop.px \
+ Test-np.px \
+ Test-N.px \
+ Test-N-smaller.px \
+ Test-O-HTTP-Content-Disposition.px \
+ Test-O-nc.px \
+ Test-O--no-content-disposition.px \
+ Test-O--no-content-disposition-trivial.px \
+ Test-O-nonexisting.px \
+ Test-O.px \
+ Test--post-file.px \
+ Test-proxied-https-auth.px \
+ Test-proxied-https-auth-keepalive.px \
+ Test-proxy-auth-basic.px \
+ Test-restrict-ascii.px \
+ Test-Restrict-Lowercase.px \
+ Test-Restrict-Uppercase.px \
+ Test-stdouterr.px \
+ Test--spider-fail.px \
+ Test--spider.px \
+ Test--spider-r-HTTP-Content-Disposition.px \
+ Test--spider-r--no-content-disposition.px \
+ Test--spider-r--no-content-disposition-trivial.px \
+ Test--spider-r.px \
+ Test--start-pos.px \
+ Test--start-pos--continue.px \
+ Test--httpsonly-r.px \
+ Test-204.px \
+ Test-ftp-pasv-not-supported.px \
+ Test-https-pfs.px \
+ Test-https-tlsv1.px \
+ Test-https-tlsv1x.px \
+ Test-https-selfsigned.px \
+ Test-https-weboftrust.px \
+ Test-https-clientcert.px \
+ Test-https-crl.px \
+ Test-https-badcerts.px
+
+EXTRA_DIST = FTPServer.pm FTPTest.pm HTTPServer.pm HTTPTest.pm \
+ SSLTest.pm SSLServer.pm \
+ WgetTests.pm WgetFeature.pm $(PX_TESTS) \
+ certs valgrind-suppressions valgrind-suppressions-ssl
+
+check_PROGRAMS = unit-tests
+unit_tests_SOURCES = unit-tests.c unit-tests.h
+LDADD = ../src/libunittest.a ../lib/libgnu.a $(GETADDRINFO_LIB) $(HOSTENT_LIB)\
+ $(INET_NTOP_LIB) $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO)\
+ $(LIB_NANOSLEEP) $(LIB_POSIX_SPAWN) $(LIB_SELECT) $(LIBICONV) $(LIBINTL)\
+ $(LIBTHREAD) $(LIBUNISTRING) $(SERVENT_LIB)
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/src -DLOCALEDIR=\"$(localedir)\"
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS)
+
+
+CLEANFILES = *~ *.bak core core.[0-9]*
+
+TESTS = ./unit-tests$(EXEEXT) $(PX_TESTS)
+TEST_EXTENSIONS = .px
+PX_LOG_COMPILER = $(PERL)
+AM_PX_LOG_FLAGS = -I$(srcdir)
+AM_TESTS_ENVIRONMENT = export WGETRC=; export SYSTEM_WGETRC=;\
+ export VALGRIND_TESTS="@VALGRIND_TESTS@";
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..27cea20
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,2368 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `wget' utility
+# Copyright (C) 1995-2011, 2015, 2018-2020 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+# see http://www.gnu.org/software/automake/manual/html_node/Parallel-Test-Harness.html#Parallel-Test-Harness
+
+#
+# Version: @VERSION@
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = unit-tests$(EXEEXT)
+subdir = tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am_unit_tests_OBJECTS = unit-tests.$(OBJEXT)
+unit_tests_OBJECTS = $(am_unit_tests_OBJECTS)
+unit_tests_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+unit_tests_DEPENDENCIES = ../src/libunittest.a ../lib/libgnu.a \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/unit-tests.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
+SOURCES = $(unit_tests_SOURCES)
+DIST_SOURCES = $(unit_tests_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.px.log=.log)
+PX_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
+PX_LOG_COMPILE = $(PX_LOG_COMPILER) $(AM_PX_LOG_FLAGS) $(PX_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+ $(top_srcdir)/build-aux/depcomp \
+ $(top_srcdir)/build-aux/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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@
+PX_TESTS = \
+ Test-auth-basic.px \
+ Test-auth-no-challenge.px \
+ Test-auth-no-challenge-url.px \
+ Test-auth-with-content-disposition.px \
+ Test-auth-retcode.px \
+ Test-c-full.px \
+ Test-c-partial.px \
+ Test-c.px \
+ Test-c-shorter.px \
+ Test-cookies.px \
+ Test-cookies-401.px \
+ Test-E-k-K.px \
+ Test-E-k.px \
+ Test-ftp.px \
+ Test-ftp-pasv-fail.px \
+ Test-ftp-bad-list.px \
+ Test-ftp-recursive.px \
+ Test-ftp-iri.px \
+ Test-ftp-iri-fallback.px \
+ Test-ftp-iri-recursive.px \
+ Test-ftp-iri-disabled.px \
+ Test-ftp-list-Multinet.px \
+ Test-ftp-list-Unknown.px \
+ Test-ftp-list-Unknown-a.px \
+ Test-ftp-list-Unknown-hidden.px \
+ Test-ftp-list-Unknown-list-a-fails.px \
+ Test-ftp-list-UNIX-hidden.px \
+ Test-ftp--start-pos.px \
+ Test-HTTP-Content-Disposition-1.px \
+ Test-HTTP-Content-Disposition-2.px \
+ Test-HTTP-Content-Disposition.px \
+ Test-i-ftp.px \
+ Test-i-http.px \
+ Test-idn-headers.px \
+ Test-idn-meta.px \
+ Test-idn-cmd.px \
+ Test-idn-cmd-utf8.px \
+ Test-idn-robots.px \
+ Test-idn-robots-utf8.px \
+ Test-iri.px \
+ Test-iri-percent.px \
+ Test-iri-disabled.px \
+ Test-iri-forced-remote.px \
+ Test-iri-list.px \
+ Test-k.px \
+ Test-meta-robots.px \
+ Test-N-current.px \
+ Test-N-HTTP-Content-Disposition.px \
+ Test-N--no-content-disposition.px \
+ Test-N--no-content-disposition-trivial.px \
+ Test-N-no-info.px \
+ Test--no-content-disposition.px \
+ Test--no-content-disposition-trivial.px \
+ Test-N-old.px \
+ Test-nonexisting-quiet.px \
+ Test-noop.px \
+ Test-np.px \
+ Test-N.px \
+ Test-N-smaller.px \
+ Test-O-HTTP-Content-Disposition.px \
+ Test-O-nc.px \
+ Test-O--no-content-disposition.px \
+ Test-O--no-content-disposition-trivial.px \
+ Test-O-nonexisting.px \
+ Test-O.px \
+ Test--post-file.px \
+ Test-proxied-https-auth.px \
+ Test-proxied-https-auth-keepalive.px \
+ Test-proxy-auth-basic.px \
+ Test-restrict-ascii.px \
+ Test-Restrict-Lowercase.px \
+ Test-Restrict-Uppercase.px \
+ Test-stdouterr.px \
+ Test--spider-fail.px \
+ Test--spider.px \
+ Test--spider-r-HTTP-Content-Disposition.px \
+ Test--spider-r--no-content-disposition.px \
+ Test--spider-r--no-content-disposition-trivial.px \
+ Test--spider-r.px \
+ Test--start-pos.px \
+ Test--start-pos--continue.px \
+ Test--httpsonly-r.px \
+ Test-204.px \
+ Test-ftp-pasv-not-supported.px \
+ Test-https-pfs.px \
+ Test-https-tlsv1.px \
+ Test-https-tlsv1x.px \
+ Test-https-selfsigned.px \
+ Test-https-weboftrust.px \
+ Test-https-clientcert.px \
+ Test-https-crl.px \
+ Test-https-badcerts.px
+
+EXTRA_DIST = FTPServer.pm FTPTest.pm HTTPServer.pm HTTPTest.pm \
+ SSLTest.pm SSLServer.pm \
+ WgetTests.pm WgetFeature.pm $(PX_TESTS) \
+ certs valgrind-suppressions valgrind-suppressions-ssl
+
+unit_tests_SOURCES = unit-tests.c unit-tests.h
+LDADD = ../src/libunittest.a ../lib/libgnu.a $(GETADDRINFO_LIB) $(HOSTENT_LIB)\
+ $(INET_NTOP_LIB) $(LIBSOCKET) $(LIB_CLOCK_GETTIME) $(LIB_CRYPTO)\
+ $(LIB_NANOSLEEP) $(LIB_POSIX_SPAWN) $(LIB_SELECT) $(LIBICONV) $(LIBINTL)\
+ $(LIBTHREAD) $(LIBUNISTRING) $(SERVENT_LIB)
+
+AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/src -DLOCALEDIR=\"$(localedir)\"
+
+AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS)
+CLEANFILES = *~ *.bak core core.[0-9]*
+TESTS = ./unit-tests$(EXEEXT) $(PX_TESTS)
+TEST_EXTENSIONS = .px
+PX_LOG_COMPILER = $(PERL)
+AM_PX_LOG_FLAGS = -I$(srcdir)
+AM_TESTS_ENVIRONMENT = export WGETRC=; export SYSTEM_WGETRC=;\
+ export VALGRIND_TESTS="@VALGRIND_TESTS@";
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .log .o .obj .px .px$(EXEEXT) .trs
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu tests/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+
+unit-tests$(EXEEXT): $(unit_tests_OBJECTS) $(unit_tests_DEPENDENCIES) $(EXTRA_unit_tests_DEPENDENCIES)
+ @rm -f unit-tests$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit_tests_OBJECTS) $(unit_tests_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit-tests.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+./unit-tests.log: ./unit-tests$(EXEEXT)
+ @p='./unit-tests$(EXEEXT)'; \
+ b='./unit-tests'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.px.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(PX_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_PX_LOG_DRIVER_FLAGS) $(PX_LOG_DRIVER_FLAGS) -- $(PX_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.px$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(PX_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_PX_LOG_DRIVER_FLAGS) $(PX_LOG_DRIVER_FLAGS) -- $(PX_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+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-checkPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ./$(DEPDIR)/unit-tests.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ./$(DEPDIR)/unit-tests.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ 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 \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+../src/wget$(EXEEXT):
+ cd ../src && $(MAKE) $(AM_MAKEFLAGS)
+
+# Make libunittest "PHONY" so we're always sure we're up-to-date.
+.PHONY: ../src/libunittest.a
+../src/libunittest.a:
+ cd ../src && $(MAKE) $(AM_MAKEFLAGS) libunittest.a
+
+../lib/libgnu.a:
+ cd ../lib && $(MAKE) $(AM_MAKEFLAGS)
+
+# 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/tests/SSLServer.pm b/tests/SSLServer.pm
new file mode 100644
index 0000000..37a8bfa
--- /dev/null
+++ b/tests/SSLServer.pm
@@ -0,0 +1,236 @@
+package SSLServer;
+
+# This is only HTTPS server for now.
+# But it is named SSLServer to easily distinguish from HTTPServer
+
+use strict;
+use warnings;
+use lib '.';
+
+use HTTP::Daemon;
+use HTTP::Status;
+use HTTP::Headers;
+use HTTP::Response;
+
+# Skip this test rather than fail it when the module isn't installed
+if (!eval {require IO::Socket::SSL;1;}) {
+ print STDERR "This test needs the perl module \"IO::Socket::SSL\".\n";
+ print STDERR "Install e.g. on Debian with 'apt-get install libio-socket-ssl-perl'\n";
+ print STDERR " or if using cpanminus 'cpanm IO::Socket::SSL' could be used to install it.\n";
+ exit 77; # skip
+}
+
+#use IO::Socket::SSLX; # 'debug4';
+use HTTPServer;
+
+our @ISA = qw(IO::Socket::SSL HTTP::Daemon::ClientConn HTTP::Daemon HTTPServer);
+
+my $VERSION = 0.01;
+
+my $CRLF = "\015\012"; # "\r\n" is not portable
+
+# Config options for server
+my $log = undef;
+my $DEBUG = undef;
+
+my %ssl_params;
+
+my $sslsock;
+my $plaincon;
+my %args;
+
+#$HTTP::Daemon::DEBUG=5;
+#*DEBUG = \$HTTP::Daemon::DEBUG;
+
+$args{SSL_error_trap} ||= \&ssl_error;
+
+my $class = 'SSLServer';
+my $self = {};
+$self = bless $self, $class;
+
+sub init
+{
+ my $self = shift;
+ my %sargs = @_;
+
+ %ssl_params = %sargs;
+ unless (exists($ssl_params{'lhostname'}) &&
+ exists($ssl_params{'sslport'}) &&
+ exists($ssl_params{'ciphers'}) &&
+ exists($ssl_params{'cafile'}) &&
+ exists($ssl_params{'certfile'}) &&
+ exists($ssl_params{'keyfile'})) {
+ die "Required parameters for SSL tests are missing";
+ }
+}
+
+sub ssl_setup_conn
+{
+ $sslsock = IO::Socket::SSL->new(LocalAddr => $ssl_params{'lhostname'},
+ LocalPort => $ssl_params{'sslport'},
+ Listen => 10,
+ Timeout => 30,
+ ReuseAddr => 1,
+ SSL_cipher_list => $ssl_params{'ciphers'},
+ SSL_verify_mode => 0x00,
+ SSL_ca_file => $ssl_params{'cafile'},
+ SSL_cert_file => $ssl_params{'certfile'},
+ SSL_key_file => $ssl_params{'keyfile'});
+
+ $sslsock || warn $IO::Socket::SSL::ERROR;
+ return $sslsock;
+}
+
+sub fileno
+{
+ my $self = shift;
+ my $fn = ${*$self}{'_SSL_fileno'};
+ return defined($fn) ? $fn : $self->SUPER::fileno();
+}
+
+sub accept
+{
+ my $self = shift;
+ my $pkg = shift || "SSLServer";
+ my ($sock, $peer) = $sslsock->accept($pkg);
+ if ($sock) {
+ ${*$sock}{'httpd_daemon'} = $self;
+ ${*$self}{'httpd_daemon'} = $sock;
+ my $fileno = ${*$self}{'_SSL_fileno'} = &fileno($self);
+ my $f = $sock->fileno;
+ return wantarray ? ($sock, $peer) : $sock;
+ }
+ else {
+ print STDERR "Failed to get socket from SSL\n" if $DEBUG;
+ return;
+ }
+
+}
+
+sub _default_port { 443; }
+sub _default_scheme { "https"; }
+
+sub url
+{
+ my $self = shift;
+ my $url = $self->SUPER::url;
+ return $url if ($self->can("HTTP::Daemon::_default_port"));
+
+ # Workaround for old versions of HTTP::Daemon
+ $url =~ s!^http:!https:!;
+ $url =~ s!/$!:80/! unless ($url =~ m!:(?:\d+)/$!);
+ $url =~ s!:443/$!/!;
+ return $url;
+}
+
+sub _need_more
+{
+ my $self = shift;
+ if ($_[1]) {
+ my($timeout, $fdset) = @_[1,2];
+ print STDERR "select(,,,$timeout)\n" if $DEBUG;
+ my $n = select($fdset,undef,undef,$timeout);
+ unless ($n) {
+ $self->reason(defined($n) ? "Timeout" : "select: $!");
+ return;
+ }
+ }
+ my $total = 0;
+ while (1){
+ print STDERR sprintf("sysread() already %d\n",$total) if $DEBUG;
+ my $n = sysread(${*$self}{'httpd_daemon'}, $_[0], 2048, length($_[0]));
+ print STDERR sprintf("sysread() just \$n=%s\n",(defined $n?$n:'undef')) if $DEBUG;
+ $total += $n if defined $n;
+ last if $! =~ 'Resource temporarily unavailable';
+ #SSL_Error because of aggressive reading
+
+ $self->reason(defined($n) ? "Client closed" : "sysread: $!") unless $n;
+ last unless $n;
+ last unless $n == 2048;
+ }
+ $total;
+}
+
+sub daemon
+{
+ my $self = shift;
+ ${*$self}{'httpd_daemon'};
+}
+
+sub conn
+{
+ my $self = shift;
+ ${*$self}{'sslcon'};
+}
+
+sub run
+{
+ my ($self, $urls, $synch_callback) = @_;
+ my $initialized = 0;
+ my $sslsock;
+
+ while (1)
+ {
+ if (!$initialized)
+ {
+ $sslsock = $self->ssl_setup_conn();
+ $sslsock || warn "Failed to get ssl sock";
+
+ $initialized = 1;
+ open (LOGFILE, '>', "/tmp/wgetserver.log");
+ LOGFILE->autoflush(1);
+ print LOGFILE "Starting logging";
+ $synch_callback->() if $synch_callback;
+ }
+
+ my $con = $self->accept();
+ ${*$self}{'sslcon'} = $con;
+
+ while (my $req = $self->get_request)
+ {
+ #my $url_path = $req->url->path;
+ my $url_path = $req->url->as_string;
+ if ($url_path =~ m{/$})
+ { # append 'index.html'
+ $url_path .= 'index.html';
+ }
+
+ #if ($url_path =~ m{^/}) { # remove trailing '/'
+ # $url_path = substr ($url_path, 1);
+ #}
+ if ($log)
+ {
+ print LOGFILE "Method: ", $req->method, "\n";
+ print LOGFILE "Path: ", $url_path, "\n";
+ print LOGFILE "Available URLs: ", "\n";
+ foreach my $key (keys %$urls)
+ {
+ print LOGFILE $key, "\n";
+ }
+ }
+ if (exists($urls->{$url_path}))
+ {
+ print LOGFILE "Serving requested URL: ", $url_path, "\n" if $log;
+ next unless ($req->method eq "HEAD" || $req->method eq "GET");
+
+ my $url_rec = $urls->{$url_path};
+ HTTPServer::send_response($self, $req, $url_rec, $con);
+ last;
+ }
+ else
+ {
+ print LOGFILE "Requested wrong URL: ", $url_path, "\n" if $log;
+ $con->send_error($HTTP::Status::RC_FORBIDDEN);
+ last;
+ }
+ last;
+ }
+ print LOGFILE "Closing connection\n" if $log;
+ close(LOGFILE);
+ $con->close();
+ }
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/SSLTest.pm b/tests/SSLTest.pm
new file mode 100644
index 0000000..60f8188
--- /dev/null
+++ b/tests/SSLTest.pm
@@ -0,0 +1,73 @@
+package SSLTest;
+
+use strict;
+use warnings;
+
+use SSLServer;
+use WgetTests;
+use HTTPTest;
+
+our @ISA = qw(WgetTest HTTPTest);
+my $VERSION = 0.01;
+
+my $srcdir;
+if (defined $ENV{srcdir}) {
+ $srcdir = Cwd::abs_path($ENV{srcdir});
+} else {
+ $srcdir = ".";
+}
+
+my %ssl_defaults = (
+ _certfile => "$srcdir/certs/server-cert.pem",
+ _keyfile => "$srcdir/certs/server-key.pem",
+ _cafile => "$srcdir/certs/test-ca-cert.pem",
+ _ciphers => 'ALL',
+ _lhostname => 'wgettestingserver',
+ _sslport => 55443,
+);
+
+{
+ my %_attr_data = %ssl_defaults;
+
+ sub _default_for
+ {
+ my ($self, $attr) = @_;
+ return $_attr_data{$attr} if exists $_attr_data{$attr};
+ return $self->SUPER::_default_for($attr);
+ }
+
+ sub _standard_keys
+ {
+ my ($self) = @_;
+ ($self->SUPER::_standard_keys(), keys %_attr_data);
+ }
+}
+
+sub _setup_server
+{
+ my $self = shift;
+ my %ssl_config = %ssl_defaults;
+
+ $self->{_server} = SSLServer->new()
+ or die "Cannot create SSL server!!!";
+
+ for my $attrname ($self->_standard_keys())
+ {
+ my ($argname) = ($attrname =~ m/^_(.*)/msx);
+ $ssl_config{$argname} = $self->{$attrname};
+ }
+# for my $attrname (keys %ssl_config)
+# {
+# if ($attrname =~ m/file$/ && !$attrname =~ m/^\//)
+# {
+# my $cwd = $self->SUPER::_default_for('_workdir');
+# my $cfile = $ssl_config{$attrname};
+# $ssl_config{$attrname} = "$cwd/$cfile";
+# }
+# }
+ $self->{_server}->init(%ssl_config);
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--httpsonly-r.px b/tests/Test--httpsonly-r.px
new file mode 100755
index 0000000..69d8c60
--- /dev/null
+++ b/tests/Test--httpsonly-r.px
@@ -0,0 +1,78 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(https);
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Anything.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $secondpage,
+ }
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --https-only -r -nH http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $mainpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--no-content-disposition-trivial.px b/tests/Test--no-content-disposition-trivial.px
new file mode 100755
index 0000000..cf89b4a
--- /dev/null
+++ b/tests/Test--no-content-disposition-trivial.px
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $dummyfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-content-disposition http://localhost:{{port}}/dummy.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.html' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--no-content-disposition.px b/tests/Test--no-content-disposition.px
new file mode 100755
index 0000000..94f4d50
--- /dev/null
+++ b/tests/Test--no-content-disposition.px
@@ -0,0 +1,55 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $dummyfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-content-disposition http://localhost:{{port}}/dummy.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.html' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--post-file.px b/tests/Test--post-file.px
new file mode 100755
index 0000000..9c866b6
--- /dev/null
+++ b/tests/Test--post-file.px
@@ -0,0 +1,22 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $cmdline = $WgetTest::WGETPATH . " --post-file=nofile http://localhost:{{port}}/";
+
+my $expected_error_code = 3;
+
+
+###############################################################################
+
+my $the_test = HTTPTest->new (cmdline => $cmdline,
+ errcode => $expected_error_code);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider-fail.px b/tests/Test--spider-fail.px
new file mode 100755
index 0000000..d0dfad6
--- /dev/null
+++ b/tests/Test--spider-fail.px
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider http://localhost:{{port}}/nonexistent";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider-r--no-content-disposition-trivial.px b/tests/Test--spider-r--no-content-disposition-trivial.px
new file mode 100755
index 0000000..0f28685
--- /dev/null
+++ b/tests/Test--spider-r--no-content-disposition-trivial.px
@@ -0,0 +1,108 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $thirdpage = <<EOF;
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/dummy.txt">text file</a>.
+ Also, another <a href="http://localhost:{{port}}/againnonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $secondpage,
+ },
+ '/thirdpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $thirdpage,
+ },
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider -r --no-content-disposition http://localhost:{{port}}/";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider-r--no-content-disposition.px b/tests/Test--spider-r--no-content-disposition.px
new file mode 100755
index 0000000..53fb7a2
--- /dev/null
+++ b/tests/Test--spider-r--no-content-disposition.px
@@ -0,0 +1,109 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $thirdpage = <<EOF;
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/dummy.txt">text file</a>.
+ Also, another <a href="http://localhost:{{port}}/againnonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $secondpage,
+ },
+ '/thirdpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $thirdpage,
+ },
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider -r --no-content-disposition http://localhost:{{port}}/";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider-r-HTTP-Content-Disposition.px b/tests/Test--spider-r-HTTP-Content-Disposition.px
new file mode 100755
index 0000000..963003e
--- /dev/null
+++ b/tests/Test--spider-r-HTTP-Content-Disposition.px
@@ -0,0 +1,109 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $thirdpage = <<EOF;
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/dummy.txt">text file</a>.
+ Also, another <a href="http://localhost:{{port}}/againnonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $secondpage,
+ },
+ '/thirdpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $thirdpage,
+ },
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider -r http://localhost:{{port}}/";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider-r.px b/tests/Test--spider-r.px
new file mode 100755
index 0000000..dbafe2e
--- /dev/null
+++ b/tests/Test--spider-r.px
@@ -0,0 +1,108 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/secondpage.html">second page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/thirdpage.html">third page</a>.
+ Also, a <a href="http://localhost:{{port}}/nonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $thirdpage = <<EOF;
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/dummy.txt">text file</a>.
+ Also, another <a href="http://localhost:{{port}}/againnonexistent">broken link</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $secondpage,
+ },
+ '/thirdpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $thirdpage,
+ },
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider -r http://localhost:{{port}}/";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--spider.px b/tests/Test--spider.px
new file mode 100755
index 0000000..2443c95
--- /dev/null
+++ b/tests/Test--spider.px
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --spider http://localhost:{{port}}/index.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--start-pos--continue.px b/tests/Test--start-pos--continue.px
new file mode 100755
index 0000000..a821a78
--- /dev/null
+++ b/tests/Test--start-pos--continue.px
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $existingfile = <<EOF;
+content should be preserved.
+EOF
+
+my $wholefile = "1234";
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "206",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --start-pos=1 --continue --debug http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $existingfile,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt.1' => {
+ content => substr($wholefile, 1),
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test--start-pos.px b/tests/Test--start-pos.px
new file mode 100755
index 0000000..5c887ab
--- /dev/null
+++ b/tests/Test--start-pos.px
@@ -0,0 +1,43 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = "1234";
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "206",
+ msg => "Dontcare",
+ headers => {
+ "Content-Type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --start-pos=1 http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.txt' => {
+ content => substr($dummyfile, 1),
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-204.px b/tests/Test-204.px
new file mode 100755
index 0000000..e9eea1a
--- /dev/null
+++ b/tests/Test-204.px
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy' => {
+ code => "204",
+ msg => "Dontcare",
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " http://localhost:{{port}}/dummy";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-E-k-K.px b/tests/Test-E-k-K.px
new file mode 100755
index 0000000..aaae6fe
--- /dev/null
+++ b/tests/Test-E-k-K.px
@@ -0,0 +1,88 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page Title</title>
+</head>
+<body>
+ <a href="http://localhost:{{port}}/subpage.php">Secondary Page</a>
+</body>
+</html>
+EOF
+
+my $mainpagemangled = <<EOF;
+<html>
+<head>
+ <title>Main Page Title</title>
+</head>
+<body>
+ <a href="subpage.php.html">Secondary Page</a>
+</body>
+</html>
+EOF
+
+my $subpage = <<EOF;
+<html>
+<head>
+ <title>Secondary Page Title</title>
+</head>
+<body>
+ <p>Some text</p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.php' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/subpage.php' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $subpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -r -nd -E -k -K http://localhost:{{port}}/index.php";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.php.orig' => {
+ content => $mainpage,
+ },
+ 'index.php.html' => {
+ content => $mainpagemangled,
+ },
+ 'subpage.php.html' => {
+ content => $subpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-E-k.px b/tests/Test-E-k.px
new file mode 100755
index 0000000..dc1031b
--- /dev/null
+++ b/tests/Test-E-k.px
@@ -0,0 +1,85 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page Title</title>
+</head>
+<body>
+ <a href="http://localhost:{{port}}/subpage.php">Secondary Page</a>
+</body>
+</html>
+EOF
+
+my $mainpagemangled = <<EOF;
+<html>
+<head>
+ <title>Main Page Title</title>
+</head>
+<body>
+ <a href="subpage.php.html">Secondary Page</a>
+</body>
+</html>
+EOF
+
+my $subpage = <<EOF;
+<html>
+<head>
+ <title>Secondary Page Title</title>
+</head>
+<body>
+ <p>Some text</p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.php' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/subpage.php' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $subpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -r -nd -E -k http://localhost:{{port}}/index.php";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.php.html' => {
+ content => $mainpagemangled,
+ },
+ 'subpage.php.html' => {
+ content => $subpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-HTTP-Content-Disposition-1.px b/tests/Test-HTTP-Content-Disposition-1.px
new file mode 100755
index 0000000..343258c
--- /dev/null
+++ b/tests/Test-HTTP-Content-Disposition-1.px
@@ -0,0 +1,75 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dontcare = <<EOF;
+Don't care.
+EOF
+
+my $dummyfile = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $dummyfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -e contentdisposition=on http://localhost:{{port}}/dummy.html";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'filename.html' => {
+ content => $dontcare,
+ },
+ 'filename.html.1' => {
+ content => $dontcare,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'filename.html' => {
+ content => $dontcare,
+ },
+ 'filename.html.1' => {
+ content => $dontcare,
+ },
+ 'filename.html.2' => {
+ content => $dummyfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-HTTP-Content-Disposition-2.px b/tests/Test-HTTP-Content-Disposition-2.px
new file mode 100755
index 0000000..e7a2703
--- /dev/null
+++ b/tests/Test-HTTP-Content-Disposition-2.px
@@ -0,0 +1,75 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dontcare = <<EOF;
+Don't care.
+EOF
+
+my $dummyfile = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $dummyfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-content-disposition http://localhost:{{port}}/dummy.html";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'filename.html' => {
+ content => $dontcare,
+ },
+ 'filename.html.1' => {
+ content => $dontcare,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'filename.html' => {
+ content => $dontcare,
+ },
+ 'filename.html.1' => {
+ content => $dontcare,
+ },
+ 'dummy.html' => {
+ content => $dummyfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-HTTP-Content-Disposition.px b/tests/Test-HTTP-Content-Disposition.px
new file mode 100755
index 0000000..29f56d1
--- /dev/null
+++ b/tests/Test-HTTP-Content-Disposition.px
@@ -0,0 +1,55 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <p>
+ Some text.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ "Content-Disposition" => "attachment; filename=\"filename.html\"",
+ },
+ content => $dummyfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -e contentdisposition=on http://localhost:{{port}}/dummy.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'filename.html' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N--no-content-disposition-trivial.px b/tests/Test-N--no-content-disposition-trivial.px
new file mode 100755
index 0000000..8abff7b
--- /dev/null
+++ b/tests/Test-N--no-content-disposition-trivial.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Content
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N --no-content-disposition http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.txt' => {
+ content => $dummyfile,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N--no-content-disposition.px b/tests/Test-N--no-content-disposition.px
new file mode 100755
index 0000000..7ece995
--- /dev/null
+++ b/tests/Test-N--no-content-disposition.px
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Content
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ "Content-Disposition" => "attachment; filename=\"filename.txt\"",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N --no-content-disposition http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.txt' => {
+ content => $dummyfile,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N-HTTP-Content-Disposition.px b/tests/Test-N-HTTP-Content-Disposition.px
new file mode 100755
index 0000000..de4609b
--- /dev/null
+++ b/tests/Test-N-HTTP-Content-Disposition.px
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ "Content-Disposition" => "attachment; filename=\"filename.txt\"",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N --content-disposition "
+ . "http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'filename.txt' => {
+ content => $dummyfile,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N-current.px b/tests/Test-N-current.px
new file mode 100755
index 0000000..a8decdb
--- /dev/null
+++ b/tests/Test-N-current.px
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $currentversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+# The server should serve a slightly different content, but with the
+# same length, so we can test which version was downloaded.
+my $modifiedversion = $currentversion;
+$modifiedversion =~ s/^(.{20}).(.*)$/$1x$2/s;
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ content => $modifiedversion,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $currentversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $currentversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N-no-info.px b/tests/Test-N-no-info.px
new file mode 100755
index 0000000..3c772a5
--- /dev/null
+++ b/tests/Test-N-no-info.px
@@ -0,0 +1,62 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $currentversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+my $newversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $newversion,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $currentversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $newversion,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N-old.px b/tests/Test-N-old.px
new file mode 100755
index 0000000..6bb18cb
--- /dev/null
+++ b/tests/Test-N-old.px
@@ -0,0 +1,62 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $oldversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+my $newversion = $oldversion;
+$newversion =~ s/^(.{20}).(.*)$/$1x$2/s;
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ content => $newversion,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $oldversion,
+ timestamp => 1097310000, # Earlier timestamp
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $newversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N-smaller.px b/tests/Test-N-smaller.px
new file mode 100755
index 0000000..34d4cd9
--- /dev/null
+++ b/tests/Test-N-smaller.px
@@ -0,0 +1,65 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $currentversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+my $newversion = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Content-Length" => length $newversion,
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ content => $newversion,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $currentversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $newversion,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-N.px b/tests/Test-N.px
new file mode 100755
index 0000000..65cc33f
--- /dev/null
+++ b/tests/Test-N.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Content
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.txt' => {
+ content => $dummyfile,
+ timestamp => 1097310600, # "Sat, 09 Oct 2004 08:30:00 GMT"
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O--no-content-disposition-trivial.px b/tests/Test-O--no-content-disposition-trivial.px
new file mode 100755
index 0000000..cef3caa
--- /dev/null
+++ b/tests/Test-O--no-content-disposition-trivial.px
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -O out --no-content-disposition http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O--no-content-disposition.px b/tests/Test-O--no-content-disposition.px
new file mode 100755
index 0000000..9d2bf41
--- /dev/null
+++ b/tests/Test-O--no-content-disposition.px
@@ -0,0 +1,46 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Content-Disposition" => "attachment; filename=\"filename.txt\"",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -O out --no-content-disposition http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O-HTTP-Content-Disposition.px b/tests/Test-O-HTTP-Content-Disposition.px
new file mode 100755
index 0000000..d7a7f76
--- /dev/null
+++ b/tests/Test-O-HTTP-Content-Disposition.px
@@ -0,0 +1,46 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Content-Disposition" => "attachment; filename=\"filename.txt\"",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -O out http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O-nc.px b/tests/Test-O-nc.px
new file mode 100755
index 0000000..171bf16
--- /dev/null
+++ b/tests/Test-O-nc.px
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -nc -O out http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O-nonexisting.px b/tests/Test-O-nonexisting.px
new file mode 100755
index 0000000..d663b65
--- /dev/null
+++ b/tests/Test-O-nonexisting.px
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --quiet -O out http://localhost:{{port}}/nonexistent";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => "",
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-O.px b/tests/Test-O.px
new file mode 100755
index 0000000..7e4024c
--- /dev/null
+++ b/tests/Test-O.px
@@ -0,0 +1,45 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -O out http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'out' => {
+ content => $dummyfile,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-Restrict-Lowercase.px b/tests/Test-Restrict-Lowercase.px
new file mode 100755
index 0000000..a675989
--- /dev/null
+++ b/tests/Test-Restrict-Lowercase.px
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Some Page Title</title>
+</head>
+<body>
+ <p>
+ Some text...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/SomePage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --restrict-file-names=lowercase http://localhost:{{port}}/SomePage.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'somepage.html' => {
+ content => $mainpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-Restrict-Uppercase.px b/tests/Test-Restrict-Uppercase.px
new file mode 100755
index 0000000..64e8a47
--- /dev/null
+++ b/tests/Test-Restrict-Uppercase.px
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Some Page Title</title>
+</head>
+<body>
+ <p>
+ Some text...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/SomePage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --restrict-file-names=uppercase http://localhost:{{port}}/SomePage.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'SOMEPAGE.HTML' => {
+ content => $mainpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-auth-basic.px b/tests/Test-auth-basic.px
new file mode 100755
index 0000000..ce9100d
--- /dev/null
+++ b/tests/Test-auth-basic.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = "You're all authenticated.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/needs-auth.txt' => {
+ auth_method => 'Basic',
+ user => 'fiddle-dee-dee',
+ passwd => 'Dodgson',
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --user=fiddle-dee-dee --password=Dodgson"
+ . " http://localhost:{{port}}/needs-auth.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'needs-auth.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-auth-no-challenge-url.px b/tests/Test-auth-no-challenge-url.px
new file mode 100755
index 0000000..204e9a0
--- /dev/null
+++ b/tests/Test-auth-no-challenge-url.px
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = "You're all authenticated.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/needs-auth.txt' => {
+ auth_no_challenge => 1,
+ auth_method => 'Basic',
+ user => 'fiddle-dee-dee',
+ passwd => 'Dodgson',
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --auth-no-challenge "
+ . "http://fiddle-dee-dee:Dodgson\@localhost:{{port}}/needs-auth.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'needs-auth.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-auth-no-challenge.px b/tests/Test-auth-no-challenge.px
new file mode 100755
index 0000000..0794ece
--- /dev/null
+++ b/tests/Test-auth-no-challenge.px
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = "You're all authenticated.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/needs-auth.txt' => {
+ auth_no_challenge => 1,
+ auth_method => 'Basic',
+ user => 'fiddle-dee-dee',
+ passwd => 'Dodgson',
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --auth-no-challenge"
+ . " --user=fiddle-dee-dee --password=Dodgson"
+ . " http://localhost:{{port}}/needs-auth.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'needs-auth.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-auth-retcode.px b/tests/Test-auth-retcode.px
new file mode 100755
index 0000000..bc1ea8f
--- /dev/null
+++ b/tests/Test-auth-retcode.px
@@ -0,0 +1,37 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ code => "403",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Last-Modified" => "Sat, 09 Oct 2004 08:30:00 GMT",
+ },
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -N http://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = ();
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-auth-with-content-disposition.px b/tests/Test-auth-with-content-disposition.px
new file mode 100755
index 0000000..7e252a3
--- /dev/null
+++ b/tests/Test-auth-with-content-disposition.px
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = "You're all authenticated.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/needs-auth.txt' => {
+ auth_method => 'Basic',
+ user => 'fiddle-dee-dee',
+ passwd => 'Dodgson',
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ "Content-type" => "text/plain",
+ "Content-Disposition" => "attachment; filename=\"Flubber\"",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --user=fiddle-dee-dee --password=Dodgson"
+ . " --content-disposition http://localhost:{{port}}/needs-auth.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'Flubber' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-c-full.px b/tests/Test-c-full.px
new file mode 100755
index 0000000..973f885
--- /dev/null
+++ b/tests/Test-c-full.px
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -c http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $wholefile,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-c-partial.px b/tests/Test-c-partial.px
new file mode 100755
index 0000000..2aca247
--- /dev/null
+++ b/tests/Test-c-partial.px
@@ -0,0 +1,66 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $partiallydownloaded = <<EOF;
+11111111111111111111111111111111111111111111111111
+22222222x222222222222222222222222222222222222222222222222222
+EOF
+
+my $rest = <<EOF;
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+my $wholefile = <<EOF . $rest;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+EOF
+
+my $downloadedfile = $partiallydownloaded . $rest;
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -c http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $partiallydownloaded,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $downloadedfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-c-shorter.px b/tests/Test-c-shorter.px
new file mode 100755
index 0000000..888ead0
--- /dev/null
+++ b/tests/Test-c-shorter.px
@@ -0,0 +1,63 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $partiallydownloaded = <<EOF;
+11111111111111111111111111111111111111111111111111
+22222222x222222222222222222222222222222222222222222222222222
+EOF
+
+my $rest = <<EOF;
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+my $downloadedfile = $partiallydownloaded . $rest;
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ force_code => 1,
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ "Content-Length" => 0,
+ },
+ content => '',
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -c http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+ 'somefile.txt' => {
+ content => $downloadedfile,
+ },
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $downloadedfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-c.px b/tests/Test-c.px
new file mode 100755
index 0000000..48d55ae
--- /dev/null
+++ b/tests/Test-c.px
@@ -0,0 +1,53 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = <<EOF;
+11111111111111111111111111111111111111111111111111
+222222222222222222222222222222222222222222222222222222222222
+3333333333333333333333333333333333333333333333333333333333333333333333
+444444444444444444444444444444444444444444444444444444444444
+55555555555555555555555555555555555555555555555555
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -c http://localhost:{{port}}/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-cookies-401.px b/tests/Test-cookies-401.px
new file mode 100755
index 0000000..7226c2f
--- /dev/null
+++ b/tests/Test-cookies-401.px
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $content = "You got it.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/one.txt' => {
+ code => "401",
+ msg => "Forbidden",
+ headers => {
+ "Set-Cookie" => "foo=bar",
+ },
+ },
+ '/two.txt' => {
+ code => "200",
+ msg => "Ok",
+ content => $content,
+ request_headers => {
+ "Cookie" => qr|foo=bar|,
+ },
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " http://localhost:{{port}}/one.txt"
+ . " http://localhost:{{port}}/two.txt";
+
+my $expected_error_code = 6;
+
+my %expected_downloaded_files = (
+ 'two.txt' => {
+ content => $content,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-cookies.px b/tests/Test-cookies.px
new file mode 100755
index 0000000..99fda8f
--- /dev/null
+++ b/tests/Test-cookies.px
@@ -0,0 +1,112 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $page1 = "Hello, world!\n";
+my $page2 = "Goodbye, Sam.\n";
+my $page3 = "Page three.\n";
+my $page4 = "Page four.\n";
+my $page5 = "Page five.\n";
+my $page6 = "Page six.\n";
+
+# code, msg, headers, content
+my %urls = (
+ '/one.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ "Set-Cookie" => "foo=bar",
+ },
+ content => $page1,
+ },
+ '/two.txt' => {
+ code => "200",
+ msg => "Ok",
+ content => $page2,
+ request_headers => {
+ "Cookie" => qr|foo=bar|,
+ },
+ },
+# remove the cookie 'foo'
+ '/three.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ "Set-Cookie" => "foo=; Expires=Sun, 06 Nov 1994 08:49:37 GMT",
+ },
+ content => $page3,
+ },
+ '/four.txt' => {
+ code => "200",
+ msg => "Ok",
+ content => $page4,
+ request_headers => {
+ "!Cookie" => qr|foo=|,
+ },
+ },
+# try to set a cookie 'foo' with mismatching domain
+# see RFC 6265 5.3.6: ignore the cookie if it doesn't domain-match
+ '/five.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ "Set-Cookie" => "foo=bar; domain=.example.com",
+ },
+ content => $page5,
+ },
+ '/six.txt' => {
+ code => "200",
+ msg => "Ok",
+ content => $page6,
+ request_headers => {
+ "!Cookie" => qr|foo=bar|,
+ },
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " http://localhost:{{port}}/one.txt"
+ . " http://localhost:{{port}}/two.txt" . " http://localhost:{{port}}/three.txt"
+ . " http://localhost:{{port}}/four.txt" . " http://localhost:{{port}}/five.txt"
+ . " http://localhost:{{port}}/six.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'one.txt' => {
+ content => $page1,
+ },
+ 'two.txt' => {
+ content => $page2,
+ },
+ 'three.txt' => {
+ content => $page3,
+ },
+ 'four.txt' => {
+ content => $page4,
+ },
+ 'five.txt' => {
+ content => $page5,
+ },
+ 'six.txt' => {
+ content => $page6,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp--start-pos.px b/tests/Test-ftp--start-pos.px
new file mode 100755
index 0000000..00a9a00
--- /dev/null
+++ b/tests/Test-ftp--start-pos.px
@@ -0,0 +1,39 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $dummyfile = "1234";
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.txt' => {
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --start-pos=1 ftp://localhost:{{port}}/dummy.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'dummy.txt' => {
+ content => substr($dummyfile, 1),
+ }
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-bad-list.px b/tests/Test-ftp-bad-list.px
new file mode 100755
index 0000000..78afd77
--- /dev/null
+++ b/tests/Test-ftp-bad-list.px
@@ -0,0 +1,68 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+$bfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+ '/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -nH -Nc -r ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+# Don't need to worry about timestamps, the "bad_list" setting will
+# ensure the sizes don't match expectations, and so they'll always be
+# re-downloaded.
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my %preexisting_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ existing => \%preexisting_files,
+ server_behavior => {bad_list => 1});
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-iri-disabled.px b/tests/Test-ftp-iri-disabled.px
new file mode 100755
index 0000000..4b4772f
--- /dev/null
+++ b/tests/Test-ftp-iri-disabled.px
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use FTPTest;
+
+
+###############################################################################
+
+my $ccedilla_l1 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+
+my $francais = <<EOF;
+Some text.
+EOF
+
+$francais =~ s/\n/\r\n/;
+
+
+# code, msg, headers, content
+my %urls = (
+ "/fran${ccedilla_u8}ais.txt" => {
+ content => $francais,
+ },
+ "/fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-iri --local-encoding=iso-8859-1 -S ftp://localhost:{{port}}/fran${ccedilla_l1}ais.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-iri-fallback.px b/tests/Test-ftp-iri-fallback.px
new file mode 100755
index 0000000..36c22c7
--- /dev/null
+++ b/tests/Test-ftp-iri-fallback.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use FTPTest;
+
+
+###############################################################################
+
+my $ccedilla_l1 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+
+my $francais = <<EOF;
+Some text.
+EOF
+
+$francais =~ s/\n/\r\n/;
+
+# code, msg, headers, content
+my %urls = (
+ "/fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --local-encoding=iso-8859-1 -S ftp://localhost:{{port}}/fran${ccedilla_l1}ais.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-iri-recursive.px b/tests/Test-ftp-iri-recursive.px
new file mode 100755
index 0000000..b487f70
--- /dev/null
+++ b/tests/Test-ftp-iri-recursive.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use FTPTest;
+
+
+###############################################################################
+
+my $ccedilla_l1 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+
+my $francais = <<EOF;
+Some text.
+EOF
+
+$francais =~ s/\n/\r\n/;
+
+# code, msg, headers, content
+my %urls = (
+ "/fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --local-encoding=iso-8859-1 -r -nH -S ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-iri.px b/tests/Test-ftp-iri.px
new file mode 100755
index 0000000..42e0eca
--- /dev/null
+++ b/tests/Test-ftp-iri.px
@@ -0,0 +1,48 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use FTPTest;
+
+
+###############################################################################
+
+my $ccedilla_l1 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+
+my $francais = <<EOF;
+Some text.
+EOF
+
+$francais =~ s/\n/\r\n/;
+
+
+# code, msg, headers, content
+my %urls = (
+ "/fran${ccedilla_u8}ais.txt" => {
+ content => $francais,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --local-encoding=iso-8859-1 --remote-encoding=utf-8 -S ftp://localhost:{{port}}/fran${ccedilla_l1}ais.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "fran${ccedilla_l1}ais.txt" => {
+ content => $francais,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-list-Multinet.px b/tests/Test-ftp-list-Multinet.px
new file mode 100755
index 0000000..e21b2a4
--- /dev/null
+++ b/tests/Test-ftp-list-Multinet.px
@@ -0,0 +1,66 @@
+#!/usr/bin/env perl
+
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of SYST command is
+# 215 UNIX MultiNet Unix Emulation V5.3(93)
+# - the response of "LIST -a" command is an empty
+# directory.
+# wget should use directly the "LIST" command to get
+# the right content, but it will be ok also "LIST -a"
+# if followed by "LIST" (in the case of future changes).
+
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+$bfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+ '/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 --accept \"?file.txt\" ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_empty_if_list_a => 1,
+ syst_response => "215 UNIX MultiNet Unix Emulation V5.3(93)"});
+exit $the_test->run();
diff --git a/tests/Test-ftp-list-UNIX-hidden.px b/tests/Test-ftp-list-UNIX-hidden.px
new file mode 100755
index 0000000..d90d9f8
--- /dev/null
+++ b/tests/Test-ftp-list-UNIX-hidden.px
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of "LIST -a" command contains
+# all the files
+# - the response of "LIST" command contains
+# the normal files (hidden files are not present)
+# wget should use only "LIST -a" because it recognise
+# the system as "UNIX Type: L8" and so it should see
+# and download the hidden file too.
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $normalfile = <<EOF;
+I'm a normal file
+EOF
+
+my $hiddenfile = <<EOF;
+I'm an hidden file
+EOF
+
+$normalfile =~ s/\n/\r\n/g;
+$hiddenfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/normalfile.txt' => {
+ content => $normalfile,
+ },
+ '/hiddenfile.txt' => {
+ content => $hiddenfile,
+ attr => "H",
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'normalfile.txt' => {
+ content => $normalfile,
+ },
+ 'hiddenfile.txt' => {
+ content => $hiddenfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_no_hidden_if_list => 1});
+exit $the_test->run();
diff --git a/tests/Test-ftp-list-Unknown-a.px b/tests/Test-ftp-list-Unknown-a.px
new file mode 100755
index 0000000..5360122
--- /dev/null
+++ b/tests/Test-ftp-list-Unknown-a.px
@@ -0,0 +1,76 @@
+#!/usr/bin/env perl
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of SYST command is
+# 215 Unknown ftp service
+# - the response of "LIST -a" command is a file
+# called "-a".
+# wget should use "LIST -a", but also "LIST".
+# After "LIST", wget will see more data is available.
+# (See also Test-ftp-list-Unknown-b.px)
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+
+my $minusafile = <<EOF;
+The strange situation.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+$bfile =~ s/\n/\r\n/g;
+$minusafile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+ '/bfile.txt' => {
+ content => $bfile,
+ },
+ '/-a' => {
+ content => $minusafile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+ '-a' => {
+ content => $minusafile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_dont_clean_path => 1,
+ syst_response => "215 Unknown ftp service"});
+exit $the_test->run();
diff --git a/tests/Test-ftp-list-Unknown-hidden.px b/tests/Test-ftp-list-Unknown-hidden.px
new file mode 100755
index 0000000..c300761
--- /dev/null
+++ b/tests/Test-ftp-list-Unknown-hidden.px
@@ -0,0 +1,68 @@
+#!/usr/bin/env perl
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of SYST command is
+# 215 Unknown ftp service
+# - the response of "LIST -a" command contains
+# all the files
+# - the response of "LIST" command contains
+# the normal files (hidden files are not present)
+# wget should use "LIST -a", but also "LIST".
+# After "LIST", wget will see more data is available
+# on "LIST -a", so it should go back to "LIST -a".
+# (See also Test-ftp-list-Unknown-a.px)
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $normalfile = <<EOF;
+I'm a normal file
+EOF
+
+my $hiddenfile = <<EOF;
+I'm an hidden file
+EOF
+
+$normalfile =~ s/\n/\r\n/g;
+$hiddenfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/normalfile.txt' => {
+ content => $normalfile,
+ },
+ '/hiddenfile.txt' => {
+ content => $hiddenfile,
+ attr => "H",
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'normalfile.txt' => {
+ content => $normalfile,
+ },
+ 'hiddenfile.txt' => {
+ content => $hiddenfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_no_hidden_if_list => 1,
+ syst_response => "215 Unknown ftp service"});
+exit $the_test->run();
diff --git a/tests/Test-ftp-list-Unknown-list-a-fails.px b/tests/Test-ftp-list-Unknown-list-a-fails.px
new file mode 100755
index 0000000..e52b36a
--- /dev/null
+++ b/tests/Test-ftp-list-Unknown-list-a-fails.px
@@ -0,0 +1,61 @@
+#!/usr/bin/env perl
+
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of "LIST -a" command is a failure
+# wget should use "LIST -a" then "LIST" to get the right
+# content.
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+$bfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+ '/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 --accept \"?file.txt\" ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_fails_if_list_a => 1,
+ syst_response => "215 Unknown ftp service"});
+exit $the_test->run();
diff --git a/tests/Test-ftp-list-Unknown.px b/tests/Test-ftp-list-Unknown.px
new file mode 100755
index 0000000..71e4362
--- /dev/null
+++ b/tests/Test-ftp-list-Unknown.px
@@ -0,0 +1,64 @@
+#!/usr/bin/env perl
+
+
+# 2013-10-17 Andrea Urbani (matfanjol)
+# In this ftp test:
+# - the response of SYST command is
+# 215 Unknown ftp service
+# - the response of "LIST -a" command is an empty
+# directory.
+# wget should use "LIST -a" then "LIST" to get the right
+# content.
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+$bfile =~ s/\n/\r\n/g;
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+ '/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-directories --recursive --level=1 --accept \"?file.txt\" ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+ 'bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files,
+ server_behavior => {list_empty_if_list_a => 1,
+ syst_response => "215 Unknown ftp service"});
+exit $the_test->run();
diff --git a/tests/Test-ftp-pasv-fail.px b/tests/Test-ftp-pasv-fail.px
new file mode 100755
index 0000000..f050fdd
--- /dev/null
+++ b/tests/Test-ftp-pasv-fail.px
@@ -0,0 +1,57 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+# This file exercises a problem in Wget, where if an error was
+# encountered in ftp.c:getftp before the actual file download
+# had started, Wget would believe that it had already downloaded the
+# full contents of the file, and would send a corresponding (erroneous)
+# REST value.
+
+###############################################################################
+
+# From bug report. :)
+my $afile = <<EOF;
+I've included log output (using the -d switch) from when this happens
+below. You'll see that for the retry wget sends a REST command to
+reset the start position before starting the RETR command. I'm
+confused about the argument to REST: 51132. It's the full length in
+bytes of the file to be retrieved. The RETR then shows the entire
+contents of the file being skipped, and wget announces that it
+successfully retrieved and saved 0 bytes.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -S ftp://localhost:{{port}}/afile.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ server_behavior => {fail_on_pasv => 1},
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-pasv-not-supported.px b/tests/Test-ftp-pasv-not-supported.px
new file mode 100755
index 0000000..1a473ad
--- /dev/null
+++ b/tests/Test-ftp-pasv-not-supported.px
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+# This test checks whether Wget *does not* fall back from passive mode to
+# active mode using a PORT command. Wget <= 1.16.3 made a fallback exposing
+# the client's real IP address to the remote FTP server.
+#
+# This behavior circumvents expected privacy when using a proxy / proxy network (e.g. Tor).
+#
+# Wget >= 1.16.4 does it right. This test checks it.
+
+###############################################################################
+
+# From bug report 10.08.2015 from tomtidaly@sigaint.org
+my $afile = <<EOF;
+FTP PORT command code in v1.16.3?
+
+In the past it could be possible for a site over http connection to
+redirect wget to FPT using FTP PORT command so the site gets the real IP
+of the computer even when wget proxy command is in use I believe:
+https://lists.torproject.org/pipermail/tor-talk/2012-April/024040.html
+
+Is that code still present in wget v1.16.3? It was present in v1.13.4.
+EOF
+
+$afile =~ s/\n/\r\n/g;
+
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -S ftp://localhost:{{port}}/afile.txt";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = ();
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ server_behavior => {pasv_not_supported => 1},
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp-recursive.px b/tests/Test-ftp-recursive.px
new file mode 100755
index 0000000..88fb85e
--- /dev/null
+++ b/tests/Test-ftp-recursive.px
@@ -0,0 +1,54 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+my $bfile = <<EOF;
+Some more text.
+EOF
+
+$afile =~ s/\n/\r\n/;
+$bfile =~ s/\n/\r\n/;
+
+# code, msg, headers, content
+my %urls = (
+ '/foo/afile.txt' => {
+ content => $afile,
+ },
+ '/bar/baz/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -S -nH -r ftp://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'foo/afile.txt' => {
+ content => $afile,
+ },
+ 'bar/baz/bfile.txt' => {
+ content => $bfile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-ftp.px b/tests/Test-ftp.px
new file mode 100755
index 0000000..fdedfbc
--- /dev/null
+++ b/tests/Test-ftp.px
@@ -0,0 +1,44 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $afile = <<EOF;
+Some text.
+EOF
+
+$afile =~ s/\n/\r\n/;
+
+
+# code, msg, headers, content
+my %urls = (
+ '/afile.txt' => {
+ content => $afile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -S ftp://localhost:{{port}}/afile.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'afile.txt' => {
+ content => $afile,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-badcerts.px b/tests/Test-https-badcerts.px
new file mode 100644
index 0000000..4ea91d7
--- /dev/null
+++ b/tests/Test-https-badcerts.px
@@ -0,0 +1,103 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use POSIX;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $cacrt = "$srcdir/certs/test-ca-cert.pem";
+
+# Use expired server certificate
+my $servercrt = "$srcdir/certs/expired.pem";
+my $serverkey = "$srcdir/certs/server-key.pem";
+
+# Try Wget using SSL with expired cert. Expect Failure.
+my $port = 30443;
+my $cmdline = $WgetTest::WGETPATH . " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+my $expected_error_code = 5;
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+if ($sslsock->run() == 0)
+{
+ exit -1;
+}
+print "Test successful.\n";
+
+# Use certificate that is not yet valid
+$servercrt = "$srcdir/certs/invalid.pem";
+$serverkey = "$srcdir/certs/server-key.pem";
+
+# Retry the test with --no-check-certificate. expect success
+$port = 20443;
+$cmdline = $WgetTest::WGETPATH . " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+
+$expected_error_code = 5;
+
+my $retryssl = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+exit $retryssl->run();
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-clientcert.px b/tests/Test-https-clientcert.px
new file mode 100755
index 0000000..77dd3e9
--- /dev/null
+++ b/tests/Test-https-clientcert.px
@@ -0,0 +1,107 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $cacrt = "$srcdir/certs/test-ca-cert.pem";
+#my $cakey = "$srcdir/certs/test-ca-key.pem";
+
+# Prepare server certificate
+my $servercrt = "$srcdir/certs/server-cert.pem";
+my $serverkey = "$srcdir/certs/server-key.pem";
+
+# Use client certificate
+my $clientcert = "$srcdir/certs/client-cert.pem";
+my $clientkey = "$srcdir/certs/client-key.pem";
+
+# Try Wget using SSL with mismatched client cert & key . Expect error
+my $port = 21443;
+my $cmdline = $WgetTest::WGETPATH . " --certificate=$clientcert ".
+ " --private-key=$serverkey ".
+ " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+my $expected_error_code = 5;
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+if ($sslsock->run() == 0)
+{
+ exit 0;
+}
+
+# Retry wget using SSL with client certificate. Expect success
+$port = 22443;
+$cmdline = $WgetTest::WGETPATH . " --certificate=$clientcert".
+ " --private-key=$clientkey ".
+ " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+
+$expected_error_code = 0;
+
+my $retryssl = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+exit $retryssl->run();
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-crl.px b/tests/Test-https-crl.px
new file mode 100755
index 0000000..655b3a8
--- /dev/null
+++ b/tests/Test-https-crl.px
@@ -0,0 +1,101 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $cacrt = "$srcdir/certs/test-ca-cert.pem";
+
+# Use a revoked certificate
+my $servercrt = "$srcdir/certs/server-cert.pem";
+my $serverkey = "$srcdir/certs/server-key.pem";
+
+# Try Wget using SSL first without --no-check-certificate. Expect Success.
+my $port = 32443;
+my $cmdline = $WgetTest::WGETPATH . " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+my $expected_error_code = 0;
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+if ($sslsock->run() != 0)
+{
+ exit -1;
+}
+
+# Revoke the certificate
+my $crlfile = "$srcdir/certs/revoked-crl.pem";
+
+# Retry the test with CRL. Expect Failure.
+$port = 23443;
+$cmdline = $WgetTest::WGETPATH . " --crl-file=$crlfile ".
+ " --ca-certificate=$cacrt".
+ " https://$testhostname:$port/somefile.txt";
+
+$expected_error_code = 5;
+
+my $retryssl = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ certfile => $servercrt,
+ keyfile => $serverkey,
+ lhostname => $testhostname,
+ sslport => $port);
+exit $retryssl->run();
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-pfs.px b/tests/Test-https-pfs.px
new file mode 100755
index 0000000..0a3bb96
--- /dev/null
+++ b/tests/Test-https-pfs.px
@@ -0,0 +1,71 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $port = 24443;
+my $cmdline = $WgetTest::WGETPATH . " --secure-protocol=PFS".
+ " --ca-certificate=$srcdir/certs/test-ca-cert.pem".
+ " https://$testhostname:$port/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ sslport => $port);
+exit $sslsock->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-selfsigned.px b/tests/Test-https-selfsigned.px
new file mode 100755
index 0000000..0586c63
--- /dev/null
+++ b/tests/Test-https-selfsigned.px
@@ -0,0 +1,97 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+# Prepare self-signed certificates
+my $certfile="$srcdir/certs/selfsigned.crt";
+my $keyfile="$srcdir/certs/selfsigned.key";
+
+# Try Wget using SSL first without --no-check-certificate. expect error
+my $port = 26443;
+my $cmdline = $WgetTest::WGETPATH . " --ca-certificate=$srcdir/certs/test-ca-cert.pem".
+ " https://$testhostname:$port/somefile.txt";
+my $expected_error_code = 5;
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $certfile,
+ keyfile => $keyfile,
+ lhostname => $testhostname,
+ sslport => $port);
+if ($sslsock->run() == 0)
+{
+ exit 0;
+}
+
+# Retry the test with --no-check-certificate. expect success
+$port = 27443;
+$cmdline = $WgetTest::WGETPATH . " --no-check-certificate ".
+ " --ca-certificate=$srcdir/certs/test-ca-cert.pem".
+ " https://$testhostname:$port/somefile.txt";
+
+$expected_error_code = 0;
+
+my $retryssl = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $certfile,
+ keyfile => $keyfile,
+ lhostname => $testhostname,
+ sslport => $port);
+exit $retryssl->run();
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-tlsv1.px b/tests/Test-https-tlsv1.px
new file mode 100755
index 0000000..e19b135
--- /dev/null
+++ b/tests/Test-https-tlsv1.px
@@ -0,0 +1,71 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $port = 28443;
+my $cmdline = $WgetTest::WGETPATH . " --secure-protocol=TLSv1".
+ " --ca-certificate=$srcdir/certs/test-ca-cert.pem".
+ " https://$testhostname:$port/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ sslport => $port);
+exit $sslsock->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-tlsv1x.px b/tests/Test-https-tlsv1x.px
new file mode 100755
index 0000000..2a24c44
--- /dev/null
+++ b/tests/Test-https-tlsv1x.px
@@ -0,0 +1,72 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use Cwd;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+my $port = 29443;
+my $cmdline = $WgetTest::WGETPATH . " --secure-protocol=TLSv1_1".
+ " --ca-certificate=$srcdir/certs/test-ca-cert.pem".
+ " https://$testhostname:$port/somefile.txt";
+
+my $expected_error_code = 0;
+
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ sslport => $port);
+exit $sslsock->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-https-weboftrust.px b/tests/Test-https-weboftrust.px
new file mode 100755
index 0000000..d792ca2
--- /dev/null
+++ b/tests/Test-https-weboftrust.px
@@ -0,0 +1,128 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Socket;
+use WgetFeature qw(https);
+use SSLTest;
+
+###############################################################################
+
+# TODO: regenerate the certs with endless lifetime
+exit 77;
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+# Skip the test if openssl is not available
+my $ossl = `openssl version`;
+unless ($ossl =~ m/OpenSSL 1/)
+{
+ exit 77;
+}
+
+my $srcdir;
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+$srcdir = Cwd::abs_path("$srcdir");
+
+# HOSTALIASES env variable allows us to create hosts file alias.
+my $testhostname = "WgetTestingServer";
+$ENV{'HOSTALIASES'} = "$srcdir/certs/wgethosts";
+
+my $addr = gethostbyname($testhostname);
+unless ($addr)
+{
+ warn "Failed to resolve $testhostname, using $srcdir/certs/wgethosts\n";
+ exit 77;
+}
+unless (inet_ntoa($addr) =~ "127.0.0.1")
+{
+ warn "Unexpected IP for localhost: ".inet_ntoa($addr)."\n";
+ exit 77;
+}
+
+# Use Intermediate CA
+my $caconf = "$srcdir/certs/rootca.conf";
+my $icrtfile = "$srcdir/certs/interca.crt";
+my $ikeyfile = "$srcdir/certs/interca.key";
+
+my $icacheck=`(openssl x509 -noout -modulus -in $icrtfile | openssl md5 ;
+ openssl rsa -noout -modulus -in $ikeyfile | openssl md5) |
+ uniq | wc -l`;
+# Check if certificate and key are correct.
+unless(-e $icrtfile && -e $ikeyfile && $icacheck == 1)
+{
+ exit 77; # skip
+}
+
+# User certificate using intermediate CA
+my $usrcrt = "$srcdir/certs/user.crt";
+my $usrkey = "$srcdir/certs/user.key";
+
+my $usrcheck=`(openssl x509 -noout -modulus -in $usrcrt | openssl md5 ;
+ openssl rsa -noout -modulus -in $usrkey | openssl md5) |
+ uniq | wc -l`;
+# Check if certificate and key are made correctly.
+unless(-e $usrcrt && -e $ikeyfile && $usrcheck == 1)
+{
+ exit 77; # skip
+}
+
+# Try Wget using SSL using certificate signed by intermediate CA. Expect error.
+my $port = 30443;
+my $cmdline = $WgetTest::WGETPATH . " --ca-certificate=$srcdir/certs/".
+ "test-ca-cert.pem https://$testhostname:$port/somefile.txt";
+my $expected_error_code = 5;
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+ 'somefile.txt' => {
+ content => "blabla",
+ },
+);
+
+my $sslsock = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ certfile => $usrcrt,
+ keyfile => $usrkey,
+ lhostname => $testhostname,
+ sslport => $port);
+if ($sslsock->run() == 0)
+{
+ exit 0;
+}
+
+# Retry the test with --no-check-certificate. expect success
+$port = 31443;
+$cmdline = $WgetTest::WGETPATH . " --ca-certificate=$srcdir/certs/wotca.pem".
+ " https://$testhostname:$port/somefile.txt";
+
+$expected_error_code = 0;
+
+my $retryssl = SSLTest->new(cmdline => $cmdline,
+ input => \%urls,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files,
+ certfile => $usrcrt,
+ keyfile => $usrkey,
+ lhostname => $testhostname,
+ sslport => $port);
+exit $retryssl->run();
+# vim: et ts=4 sw=4
diff --git a/tests/Test-i-ftp.px b/tests/Test-i-ftp.px
new file mode 100755
index 0000000..6fd2c05
--- /dev/null
+++ b/tests/Test-i-ftp.px
@@ -0,0 +1,79 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use FTPTest;
+
+
+###############################################################################
+
+my $urls = <<EOF;
+ftp://localhost:{{port}}/site1.html
+ftp://localhost:{{port}}/site2.html
+EOF
+
+my $site1 = <<EOF;
+<html>
+ <head>
+ <title>Site 1</title>
+ </head>
+ <body>
+ <p>Nunc eu ligula sed mauris sollicitudin scelerisque. Suspendisse viverra, dolor.</p>
+ </body>
+</html>
+EOF
+
+my $site2 = <<EOF;
+<html>
+ <head>
+ <title>Site 2</title>
+ </head>
+ <body>
+ <p>Suspendisse potenti. Phasellus et magna est, quis consectetur ligula. Integer.</p>
+ </body>
+</html>
+EOF
+
+foreach ($urls, $site1, $site2) {
+ s/\n/\r\n/g;
+}
+
+my %urls = (
+ '/urls.txt' => {
+ content => $urls,
+ },
+ '/site1.html' => {
+ content => $site1,
+ },
+ '/site2.html' => {
+ content => $site2,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -i ftp://localhost:{{port}}/urls.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'urls.txt' => {
+ content => $urls,
+ },
+ 'site1.html' => {
+ content => $site1,
+ },
+ 'site2.html' => {
+ content => $site2,
+ },
+);
+
+###############################################################################
+
+my $the_test = FTPTest->new (
+ input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-i-http.px b/tests/Test-i-http.px
new file mode 100755
index 0000000..a076973
--- /dev/null
+++ b/tests/Test-i-http.px
@@ -0,0 +1,90 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $urls = <<EOF;
+http://localhost:{{port}}/site1.html
+http://localhost:{{port}}/site2.html
+EOF
+
+my $site1 = <<EOF;
+<html>
+ <head>
+ <title>Site 1</title>
+ </head>
+ <body>
+ <p>In orci diam, iaculis a hendrerit accumsan, mollis a nibh.</p>
+ </body>
+</html>
+EOF
+
+my $site2 = <<EOF;
+<html>
+ <head>
+ <title>Site 2</title>
+ </head>
+ <body>
+ <p>Sed vehicula ultrices orci a congue. Sed convallis semper urna.</p>
+ </body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/urls.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $urls,
+ },
+ '/site1.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $site1,
+ },
+ '/site2.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $site2,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -i http://localhost:{{port}}/urls.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'urls.txt' => {
+ content => $urls,
+ },
+ 'site1.html' => {
+ content => $site1,
+ },
+ 'site2.html' => {
+ content => $site2,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-cmd-utf8.px b/tests/Test-idn-cmd-utf8.px
new file mode 100755
index 0000000..42e4318
--- /dev/null
+++ b/tests/Test-idn-cmd-utf8.px
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $utf8_hostname = "\344\273\212\346\227\245\343\201\257.\346\227\245\346\234\254";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+
+###############################################################################
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -r"
+ . " -e http_proxy=localhost:{{port}} --local-encoding=UTF-8 $utf8_hostname";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "$punycoded_hostname/index.html" => {
+ content => $result_file,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-cmd.px b/tests/Test-idn-cmd.px
new file mode 100755
index 0000000..3098419
--- /dev/null
+++ b/tests/Test-idn-cmd.px
@@ -0,0 +1,50 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $euc_jp_hostname = "\272\243\306\374\244\317.\306\374\313\334";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+
+###############################################################################
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -r"
+ . " -e http_proxy=localhost:{{port}} --local-encoding=EUC-JP $euc_jp_hostname";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "$punycoded_hostname/index.html" => {
+ content => $result_file,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-headers.px b/tests/Test-idn-headers.px
new file mode 100755
index 0000000..6b0c614
--- /dev/null
+++ b/tests/Test-idn-headers.px
@@ -0,0 +1,65 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $euc_jp_hostname = "\272\243\306\374\244\317.\306\374\313\334";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+
+###############################################################################
+
+my $starter_file = <<EOF;
+<a href="http://$euc_jp_hostname/">The link</a>
+EOF
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ 'http://start-here.com/start.html' => {
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ 'Content-Type' => 'text/html; charset=EUC-JP',
+ },
+ content => $starter_file,
+ },
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -rH"
+ . " -e http_proxy=localhost:{{port}} http://start-here.com/start.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'start-here.com/start.html' => {
+ content => $starter_file,
+ },
+ "$punycoded_hostname/index.html" => {
+ content => $result_file,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-meta.px b/tests/Test-idn-meta.px
new file mode 100755
index 0000000..db5c016
--- /dev/null
+++ b/tests/Test-idn-meta.px
@@ -0,0 +1,67 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $euc_jp_hostname = "\272\243\306\374\244\317.\306\374\313\334";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+
+###############################################################################
+
+my $starter_file = <<EOF;
+<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
+<a href="http://$euc_jp_hostname/">The link</a>
+EOF
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ 'http://start-here.com/start.html' => {
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ # HTTP header precedes http-equiv, simply just omit it here
+ #'Content-Type' => 'text/html; charset=UTF-8',
+ },
+ content => $starter_file,
+ },
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -rH"
+ . " -e http_proxy=localhost:{{port}} http://start-here.com/start.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'start-here.com/start.html' => {
+ content => $starter_file,
+ },
+ "$punycoded_hostname/index.html" => {
+ content => $result_file,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-robots-utf8.px b/tests/Test-idn-robots-utf8.px
new file mode 100755
index 0000000..1d1bfac
--- /dev/null
+++ b/tests/Test-idn-robots-utf8.px
@@ -0,0 +1,77 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $utf8_hostname = "\344\273\212\346\227\245\343\201\257.\346\227\245\346\234\254";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+
+###############################################################################
+
+my $starter_file = <<EOF;
+<a href="http://$utf8_hostname/foo.txt">The link</a>
+EOF
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/html; charset=UTF-8',
+ },
+ content => $starter_file,
+ },
+ "http://$punycoded_hostname/foo.txt" => {
+ code => "200",
+ msg => "Uh-huh",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+ "http://$punycoded_hostname/robots.txt" => {
+ code => "200",
+ msg => "Uh-huh",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => '',
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -r"
+ . " -e http_proxy=localhost:{{port}} --local-encoding=UTF-8"
+ . " http://$utf8_hostname/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "$punycoded_hostname/index.html" => {
+ content => $starter_file,
+ },
+ "$punycoded_hostname/foo.txt" => {
+ content => $result_file,
+ },
+ "$punycoded_hostname/robots.txt" => {
+ content => '',
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-idn-robots.px b/tests/Test-idn-robots.px
new file mode 100755
index 0000000..888fcdf
--- /dev/null
+++ b/tests/Test-idn-robots.px
@@ -0,0 +1,102 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# " Kon'nichiwa <dot> Japan
+my $euc_jp_hostname = "\272\243\306\374\244\317.\306\374\313\334";
+my $punycoded_hostname = 'xn--v9ju72g90p.xn--wgv71a';
+my $escaped_hostname = "%ba%a3%c6%fc%a4%cf.%c6%fc%cb%dc";
+
+###############################################################################
+
+my $starter_file = <<EOF;
+<a href="http://$euc_jp_hostname/foo.txt">The link</a>
+<a href="http://$punycoded_hostname/foo2.txt">The second link</a>
+<a href="http://$escaped_hostname/foo3.txt">The third link</a>
+EOF
+
+my $result_file = <<EOF;
+Found me!
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ "http://$punycoded_hostname/index.html" => {
+ code => "200",
+ msg => "Yes, please",
+ headers => {
+ 'Content-Type' => 'text/html; charset=EUC-JP',
+ },
+ content => $starter_file,
+ },
+ "http://$punycoded_hostname/foo.txt" => {
+ code => "200",
+ msg => "Uh-huh",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+ "http://$punycoded_hostname/foo2.txt" => {
+ code => "200",
+ msg => "Uh-huh2",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+ "http://$punycoded_hostname/foo3.txt" => {
+ code => "200",
+ msg => "Uh-huh3",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => $result_file,
+ },
+ "http://$punycoded_hostname/robots.txt" => {
+ code => "200",
+ msg => "Uh-huh",
+ headers => {
+ 'Content-Type' => 'text/plain',
+ },
+ content => '',
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -r"
+ . " -e http_proxy=localhost:{{port}} --local-encoding=EUC-JP"
+ . " http://$euc_jp_hostname/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "$punycoded_hostname/index.html" => {
+ content => $starter_file,
+ },
+ "$punycoded_hostname/foo.txt" => {
+ content => $result_file,
+ },
+ "$punycoded_hostname/foo2.txt" => {
+ content => $result_file,
+ },
+ "$punycoded_hostname/foo3.txt" => {
+ content => $result_file,
+ },
+ "$punycoded_hostname/robots.txt" => {
+ content => '',
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-iri-disabled.px b/tests/Test-iri-disabled.px
new file mode 100755
index 0000000..e019d4f
--- /dev/null
+++ b/tests/Test-iri-disabled.px
@@ -0,0 +1,195 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+# cf. http://en.wikipedia.org/wiki/Latin1
+# http://en.wikipedia.org/wiki/ISO-8859-15
+
+###############################################################################
+#
+# mime : charset found in Content-Type HTTP MIME header
+# meta : charset found in Content-Type meta tag
+#
+# index.html mime + file = iso-8859-15
+# p1_français.html meta + file = iso-8859-1, mime = utf-8
+# p2_één.html mime + file = iso-8859-1
+# p3_€€€.html meta + file = utf-8, mime = iso-8859-1
+#
+
+my $ccedilla_l15 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+my $eacute_l1 = "\xE9";
+my $eacute_u8 = "\xC3\xA9";
+my $eurosign_l15 = "\xA4";
+my $eurosign_u8 = "\xE2\x82\xAC";
+
+my $pageindex = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Link to page 1 <a href="http://localhost:{{port}}/p1_fran${ccedilla_l15}ais.html">La seule page en fran&ccedil;ais</a>.
+ Link to page 3 <a href="http://localhost:{{port}}/p3_${eurosign_l15}${eurosign_l15}${eurosign_l15}.html">My tailor is rich</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pagefrancais = <<EOF;
+<html>
+<head>
+ <title>La seule page en français</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+</head>
+<body>
+ <p>
+ Link to page 2 <a href="http://localhost:{{port}}/p2_${eacute_l1}${eacute_l1}n.html">Die enkele nerderlangstalige pagina</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeen = <<EOF;
+<html>
+<head>
+ <title>Die enkele nederlandstalige pagina</title>
+</head>
+<body>
+ <p>
+ &Eacute;&eacute;n is niet veel maar toch meer dan nul.<br/>
+ Nerdelands is een mooie taal... dit zin stuckje spreekt vanzelf, of niet :)
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeuro = <<EOF;
+<html>
+<head>
+ <title>Euro page</title>
+</head>
+<body>
+ <p>
+ My tailor isn't rich anymore.
+ </p>
+</body>
+</html>
+EOF
+
+my $page404 = <<EOF;
+<html>
+<head>
+ <title>404</title>
+</head>
+<body>
+ <p>
+ Nop nop nop...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pageindex,
+ },
+ '/robots.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "",
+ },
+ '/p1_fran%C3%A7ais.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "File not found",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pagefrancais,
+ },
+ '/p1_fran%E7ais.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pagefrancais,
+ },
+ '/p2_%C3%A9%C3%A9n.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pageeen,
+ },
+ '/p2_%E9%E9n.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-1",
+ },
+ content => $pageeen,
+ },
+ '/p3_%E2%82%AC%E2%82%AC%E2%82%AC.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $pageeuro,
+ },
+ '/p3_%A4%A4%A4.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $pageeuro,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --no-iri -nH -r http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $pageindex,
+ },
+ 'robots.txt' => {
+ content => "",
+ },
+ "p1_fran${ccedilla_l15}ais.html" => {
+ content => $pagefrancais,
+ },
+ "p2_${eacute_l1}${eacute_l1}n.html" => {
+ content => $pageeen,
+ },
+ "p3_${eurosign_l15}${eurosign_l15}${eurosign_l15}.html" => {
+ content => $pageeuro,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-iri-forced-remote.px b/tests/Test-iri-forced-remote.px
new file mode 100755
index 0000000..7908de8
--- /dev/null
+++ b/tests/Test-iri-forced-remote.px
@@ -0,0 +1,182 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# cf. http://en.wikipedia.org/wiki/Latin1
+# http://en.wikipedia.org/wiki/ISO-8859-15
+
+###############################################################################
+# Force remote encoding to ISO-8859-1
+#
+# mime : charset found in Content-Type HTTP MIME header
+# meta : charset found in Content-Type meta tag
+#
+# index.html mime + file = iso-8859-15
+# p1_français.html meta + file = iso-8859-1, mime = utf-8
+# p2_één.html mime + file = iso-8859-1
+# p3_€€€.html meta + file = utf-8, mime = iso-8859-1
+#
+
+my $ccedilla_l15 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+my $eacute_l1 = "\xE9";
+my $eacute_u8 = "\xC3\xA9";
+my $eurosign_l15 = "\xA4";
+my $eurosign_u8 = "\xE2\x82\xAC";
+
+my $pageindex = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Link to page 1 <a href="http://localhost:{{port}}/p1_fran${ccedilla_l15}ais.html">La seule page en fran&ccedil;ais</a>.
+ Link to page 3 <a href="http://localhost:{{port}}/p3_${eurosign_l15}${eurosign_l15}${eurosign_l15}.html">My tailor is rich</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pagefrancais = <<EOF;
+<html>
+<head>
+ <title>La seule page en français</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+ <p>
+ Link to page 2 <a href="http://localhost:{{port}}/p2_${eacute_l1}${eacute_l1}n.html">Die enkele nerderlangstalige pagina</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeen = <<EOF;
+<html>
+<head>
+ <title>Die enkele nederlandstalige pagina</title>
+</head>
+<body>
+ <p>
+ &Eacute;&eacute;n is niet veel maar toch meer dan nul.<br/>
+ Nerdelands is een mooie taal... dit zin stuckje spreekt vanzelf, of niet :)
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeuro = <<EOF;
+<html>
+<head>
+ <title>Euro page</title>
+</head>
+<body>
+ <p>
+ My tailor isn't rich anymore.
+ </p>
+</body>
+</html>
+EOF
+
+my $page404 = <<EOF;
+<html>
+<head>
+ <title>404</title>
+</head>
+<body>
+ <p>
+ Nop nop nop...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pageindex,
+ },
+ '/robots.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "",
+ },
+ '/p1_fran%C3%A7ais.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ # wrong charset specified by meta tag in $pagefrancais, overridden by HTTP Content-Type
+ "Content-type" => "text/html; charset=iso-8859-1",
+ },
+ content => $pagefrancais,
+ },
+ '/p2_%C3%A9%C3%A9n.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pageeen,
+ },
+ '/p3_%E2%82%AC%E2%82%AC%E2%82%AC.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $pageeuro,
+ },
+ '/p3_%C2%A4%C2%A4%C2%A4.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $pageeuro,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -e robots=on --trust-server-names --local-encoding=utf-8 -nH -r http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $pageindex,
+ },
+ 'robots.txt' => {
+ content => "",
+ },
+ "p1_fran${ccedilla_u8}ais.html" => {
+ content => $pagefrancais,
+ },
+ "p2_${eacute_u8}${eacute_u8}n.html" => {
+ content => $pageeen,
+ },
+ "p3_${eurosign_u8}${eurosign_u8}${eurosign_u8}.html" => {
+ content => $pageeuro,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-iri-list.px b/tests/Test-iri-list.px
new file mode 100755
index 0000000..5e56072
--- /dev/null
+++ b/tests/Test-iri-list.px
@@ -0,0 +1,173 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# cf. http://en.wikipedia.org/wiki/Latin1
+# http://en.wikipedia.org/wiki/ISO-8859-15
+###############################################################################
+#
+# mime : charset found in Content-Type HTTP MIME header
+# meta : charset found in Content-Type meta tag
+#
+# index.html mime + file = iso-8859-15
+# p1_français.html meta + file = iso-8859-1, mime = utf-8
+# p2_één.html meta + file = utf-8, mime =iso-8859-1
+#
+
+my $ccedilla_l1 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+my $eacute_l1 = "\xE9";
+my $eacute_u8 = "\xC3\xA9";
+
+my $urllist = <<EOF;
+http://localhost:{{port}}/
+http://localhost:{{port}}/p1_fran${ccedilla_l1}ais.html
+http://localhost:{{port}}/p2_${eacute_l1}${eacute_l1}n.html
+EOF
+
+my $pageindex = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Main page.
+ </p>
+</body>
+</html>
+EOF
+
+my $pagefrancais = <<EOF;
+<html>
+<head>
+ <title>La seule page en français</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+</head>
+<body>
+ <p>
+ French page.
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeen = <<EOF;
+<html>
+<head>
+ <title>Die enkele nederlandstalige pagina</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+ <p>
+ Dutch page.
+ </p>
+</body>
+</html>
+EOF
+
+my $page404 = <<EOF;
+<html>
+<head>
+ <title>404</title>
+</head>
+<body>
+ <p>
+ Nop nop nop...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pageindex,
+ },
+ '/robots.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "",
+ },
+ '/p1_fran%C3%A7ais.html' => { # UTF-8 encoded
+ code => "404",
+ msg => "File not found",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $page404,
+ },
+ '/p1_fran%E7ais.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pagefrancais,
+ },
+ '/p2_%C3%A9%C3%A9n.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-1",
+ },
+ content => $pageeen,
+ },
+ '/p2_%E9%E9n.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-1",
+ },
+ content => $pageeen,
+ },
+ '/url_list.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain; charset=ISO-8859-1",
+ },
+ content => $urllist,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri --trust-server-names -i http://localhost:{{port}}/url_list.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'url_list.txt' => {
+ content => $urllist,
+ },
+ 'index.html' => {
+ content => $pageindex,
+ },
+ "p1_fran${ccedilla_l1}ais.html" => {
+ content => $pagefrancais,
+ },
+ "p2_${eacute_u8}${eacute_u8}n.html" => {
+ content => $pageeen,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-iri-percent.px b/tests/Test-iri-percent.px
new file mode 100755
index 0000000..7c4f4c8
--- /dev/null
+++ b/tests/Test-iri-percent.px
@@ -0,0 +1,88 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# Just a sanity check to verify that %-encoded values are always left
+# untouched.
+
+my $ccedilla_l15 = "\xE7";
+my $ccedilla_l15_pct = "%E7";
+my $ccedilla_u8 = "\xC3\xA7";
+my $ccedilla_u8_pct = "%C3%A7";
+my $eacute_l1 = "\xE9";
+my $eacute_u8 = "\xC3\xA9";
+my $eacute_u8_pct = "%C3%A9";
+
+my $pageindex = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Link to page 1 <a
+ href="http://localhost:{{port}}/hello_${ccedilla_l15_pct}${eacute_l1}.html">La seule page en fran&ccedil;ais</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pagefrancais = <<EOF;
+<html>
+<head>
+ <title>La seule page en français</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+</head>
+<body>
+ <p>
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pageindex,
+ },
+ "/hello_${ccedilla_u8_pct}${eacute_u8_pct}.html" => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pagefrancais,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri -e robots=off --restrict-file-names=nocontrol -nH -r http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $pageindex,
+ },
+ "hello_${ccedilla_u8}${eacute_u8}.html" => {
+ content => $pagefrancais,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-iri.px b/tests/Test-iri.px
new file mode 100755
index 0000000..eb23b63
--- /dev/null
+++ b/tests/Test-iri.px
@@ -0,0 +1,208 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use WgetFeature qw(iri);
+use HTTPTest;
+
+# cf. http://en.wikipedia.org/wiki/Latin1
+# http://en.wikipedia.org/wiki/ISO-8859-15
+
+###############################################################################
+#
+# mime : charset found in Content-Type HTTP MIME header
+# meta : charset found in Content-Type meta tag
+#
+# index.html mime + file = iso-8859-15
+# p1_français.html meta + file = iso-8859-1, mime = utf-8
+# p2_één.html meta + file = utf-8, mime =iso-8859-1
+# p3_€€€.html meta + file = utf-8, mime = iso-8859-1
+# p4_méér.html mime + file = utf-8
+#
+
+my $ccedilla_l15 = "\xE7";
+my $ccedilla_u8 = "\xC3\xA7";
+my $eacute_l1 = "\xE9";
+my $eacute_u8 = "\xC3\xA9";
+my $eurosign_l15 = "\xA4";
+my $eurosign_u8 = "\xE2\x82\xAC";
+
+my $pageindex = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Link to page 1 <a href="http://localhost:{{port}}/p1_fran${ccedilla_l15}ais.html">La seule page en fran&ccedil;ais</a>.
+ Link to page 3 <a href="http://localhost:{{port}}/p3_${eurosign_l15}${eurosign_l15}${eurosign_l15}.html">My tailor is rich</a>.
+ </p>
+</body>
+</html>
+EOF
+
+# specifying a wrong charset in http-equiv - it will be overridden by Content-Type HTTP header
+my $pagefrancais = <<EOF;
+<html>
+<head>
+ <title>La seule page en français</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+ <p>
+ Link to page 2 <a href="http://localhost:{{port}}/p2_${eacute_l1}${eacute_l1}n.html">Die enkele nerderlangstalige pagina</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeen = <<EOF;
+<html>
+<head>
+ <title>Die enkele nederlandstalige pagina</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+ <p>
+ &Eacute;&eacute;n is niet veel maar toch meer dan nul.<br/>
+ Nerdelands is een mooie taal... dit zin stuckje spreekt vanzelf, of niet :)<br/>
+ <a href="http://localhost:{{port}}/p4_m${eacute_u8}${eacute_u8}r.html">M&eacute&eacute;r</a>
+ </p>
+</body>
+</html>
+EOF
+
+my $pageeuro = <<EOF;
+<html>
+<head>
+ <title>Euro page</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+</head>
+<body>
+ <p>
+ My tailor isn't rich anymore.
+ </p>
+</body>
+</html>
+EOF
+
+my $pagemeer = <<EOF;
+<html>
+<head>
+ <title>Bekende supermarkt</title>
+</head>
+<body>
+ <p>
+ Ik ben toch niet gek !
+ </p>
+</body>
+</html>
+EOF
+
+my $page404 = <<EOF;
+<html>
+<head>
+ <title>404</title>
+</head>
+<body>
+ <p>
+ Nop nop nop...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pageindex,
+ },
+ '/robots.txt' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "",
+ },
+ '/p1_fran%C3%A7ais.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ # Content-Type header overrides http-equiv Content-Type
+ "Content-type" => "text/html; charset=ISO-8859-15",
+ },
+ content => $pagefrancais,
+ },
+ '/p2_%C3%A9%C3%A9n.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ request_headers => {
+ "Referer" => qr|http://localhost:[0-9]+/p1_fran%C3%A7ais.html|,
+ },
+ headers => {
+ "Content-type" => "text/html; charset=UTF-8",
+ },
+ content => $pageeen,
+ },
+ '/p3_%E2%82%AC%E2%82%AC%E2%82%AC.html' => { # UTF-8 encoded
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/plain; charset=ISO-8859-1",
+ },
+ content => $pageeuro,
+ },
+ '/p4_m%C3%A9%C3%A9r.html' => {
+ code => "200",
+ msg => "Ok",
+ request_headers => {
+ "Referer" => qr|http://localhost:[0-9]+/p2_%C3%A9%C3%A9n.html|,
+ },
+ headers => {
+ "Content-type" => "text/plain; charset=UTF-8",
+ },
+ content => $pagemeer,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --iri --trust-server-names --restrict-file-names=nocontrol -nH -r http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $pageindex,
+ },
+ 'robots.txt' => {
+ content => "",
+ },
+ "p1_fran${ccedilla_u8}ais.html" => {
+ content => $pagefrancais,
+ },
+ "p2_${eacute_u8}${eacute_u8}n.html" => {
+ content => $pageeen,
+ },
+ "p3_${eurosign_u8}${eurosign_u8}${eurosign_u8}.html" => {
+ content => $pageeuro,
+ },
+ "p4_m${eacute_u8}${eacute_u8}r.html" => {
+ content => $pagemeer,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-k.px b/tests/Test-k.px
new file mode 100755
index 0000000..ce114d7
--- /dev/null
+++ b/tests/Test-k.px
@@ -0,0 +1,92 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+my $osname = $^O;
+print "OS=$osname\n";
+
+my $index = <<EOF;
+<html>
+ <head>
+ <title>Index</title>
+ </head>
+ <body>
+ <a href="site;sub:.html">Site</a>
+ </body>
+</html>
+EOF
+
+my $converted = <<EOF;
+<html>
+ <head>
+ <title>Index</title>
+ </head>
+ <body>
+ <a href="./site%3Bsub:.html">Site</a>
+ </body>
+</html>
+EOF
+
+my $site = <<EOF;
+<html>
+ <head>
+ <title>Site</title>
+ </head>
+ <body>
+ Subsite
+ </body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $index,
+ },
+ '/site;sub:.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $site,
+ },
+);
+
+my $restrict = "unix";
+if ($osname eq "MSWin32") {
+ $restrict = "windows";
+}
+
+my $cmdline = $WgetTest::WGETPATH . " -k -r -nH --restrict-file-names=$restrict http://localhost:{{port}}/index.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $converted,
+ },
+ 'site;sub:.html' => {
+ content => $site,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-meta-robots.px b/tests/Test-meta-robots.px
new file mode 100755
index 0000000..4a90338
--- /dev/null
+++ b/tests/Test-meta-robots.px
@@ -0,0 +1,113 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+# This test checks that Wget parses "nofollow" when it appears in <meta
+# name="robots"> tags, regardless of where in a list of comma-separated
+# values it appears, and regardless of spelling.
+#
+# Three different files contain links to the file "bombshell.html", each
+# with "nofollow" set, at various positions in a list of values for a
+# <meta name="robots"> tag, and with various degrees of separating
+# whitesspace. If bombshell.html is downloaded, the test
+# has failed.
+
+###############################################################################
+
+my $nofollow_start = <<EOF;
+<meta name="roBoTS" content="noFolLow , foo, bar ">
+<a href="/bombshell.html">Don't follow me!</a>
+EOF
+
+my $nofollow_mid = <<EOF;
+<meta name="rObOts" content=" foo , NOfOllow , bar ">
+<a href="/bombshell.html">Don't follow me!</a>
+EOF
+
+my $nofollow_end = <<EOF;
+<meta name="RoBotS" content="foo,BAr, nofOLLOw ">
+<a href="/bombshell.html">Don't follow me!</a>
+EOF
+
+my $nofollow_solo = <<EOF;
+<meta name="robots" content="nofollow">
+<a href="/bombshell.html">Don't follow me!</a>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/start.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $nofollow_start,
+ },
+ '/mid.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $nofollow_mid,
+ },
+ '/end.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $nofollow_end,
+ },
+ '/solo.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $nofollow_solo,
+ },
+ '/bombshell.html' => {
+ code => "200",
+ msg => "Ok",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => 'Hello',
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -r -nd "
+ . join(' ',(map "http://localhost:{{port}}/$_.html",
+ qw(start mid end solo)));
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'start.html' => {
+ content => $nofollow_start,
+ },
+ 'mid.html' => {
+ content => $nofollow_mid,
+ },
+ 'end.html' => {
+ content => $nofollow_end,
+ },
+ 'solo.html' => {
+ content => $nofollow_solo,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-nonexisting-quiet.px b/tests/Test-nonexisting-quiet.px
new file mode 100755
index 0000000..9f68081
--- /dev/null
+++ b/tests/Test-nonexisting-quiet.px
@@ -0,0 +1,42 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $dummyfile = <<EOF;
+Don't care.
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/dummy.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $dummyfile
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --quiet http://localhost:{{port}}/nonexistent";
+
+my $expected_error_code = 8;
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-noop.px b/tests/Test-noop.px
new file mode 100755
index 0000000..d08cbcd
--- /dev/null
+++ b/tests/Test-noop.px
@@ -0,0 +1,55 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $index = <<EOF;
+<html>
+<head>
+ <title>Page Title</title>
+</head>
+<body>
+ <h1>Page Title</h1>
+ <p>
+ Some text here.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $index
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " http://localhost:{{port}}/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'index.html' => {
+ content => $index,
+ }
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-np.px b/tests/Test-np.px
new file mode 100755
index 0000000..1253c5d
--- /dev/null
+++ b/tests/Test-np.px
@@ -0,0 +1,147 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Main Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/firstlevel/secondpage.html">second page</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $secondpage = <<EOF;
+<html>
+<head>
+ <title>Second Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/firstlevel/lowerlevel/thirdpage.html">third page</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $thirdpage = <<EOF;
+<html>
+<head>
+ <title>Third Page</title>
+</head>
+<body>
+ <p>
+ Some text and a link to a <a href="http://localhost:{{port}}/higherlevelpage.html">higher level page</a>.
+ </p>
+</body>
+</html>
+EOF
+
+my $fourthpage = <<EOF;
+<html>
+<head>
+ <title>Fourth Page</title>
+</head>
+<body>
+ <p>
+ This page is only linked by the higher level page. Therefore, it should not
+ be downloaded.
+ </p>
+</body>
+</html>
+EOF
+
+my $higherlevelpage = <<EOF;
+<html>
+<head>
+ <title>Higher Level Page</title>
+</head>
+<body>
+ <p>
+ This page is on a higher level in the URL path hierarchy. Therefore, it
+ should not be downloaded. Wget should not visit the following link to a
+ <a href="http://localhost:{{port}}/firstlevel/fourthpage.html">fourth page</a>.
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ '/firstlevel/index.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+ '/firstlevel/secondpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $secondpage,
+ },
+ '/firstlevel/lowerlevel/thirdpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $thirdpage,
+ },
+ '/firstlevel/fourthpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $fourthpage,
+ },
+ '/higherlevelpage.html' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $higherlevelpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " -np -nH -r http://localhost:{{port}}/firstlevel/";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'firstlevel/index.html' => {
+ content => $mainpage,
+ },
+ 'firstlevel/secondpage.html' => {
+ content => $secondpage,
+ },
+ 'firstlevel/lowerlevel/thirdpage.html' => {
+ content => $thirdpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-proxied-https-auth-keepalive.px b/tests/Test-proxied-https-auth-keepalive.px
new file mode 100755
index 0000000..2a18ccf
--- /dev/null
+++ b/tests/Test-proxied-https-auth-keepalive.px
@@ -0,0 +1,181 @@
+#!/usr/bin/env perl
+# Simulate a tunneling proxy to a HTTPS URL that needs authentication.
+# Use a persistent connection (Connection: keep-alive)
+
+use strict;
+use warnings;
+
+use WgetFeature qw(https);
+use WgetTests; # For $WGETPATH.
+
+my $cert_path;
+my $key_path;
+my $srcdir;
+
+our $VALGRIND_SUPP_FILE;
+
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+
+if (defined $srcdir) {
+ $key_path = "$srcdir/certs/server-key.pem";
+ $cert_path = "$srcdir/certs/server-cert.pem";
+} else {
+ $key_path = "certs/server-key.pem";
+ $cert_path = "certs/server-cert.pem";
+}
+
+
+use HTTP::Daemon;
+use HTTP::Request;
+# Skip this test rather than fail it when the module isn't installed
+if (!eval {require IO::Socket::SSL;1;}) {
+ print STDERR "This test needs the perl module \"IO::Socket::SSL\".\n";
+ print STDERR "Install e.g. on Debian with 'apt-get install libio-socket-ssl-perl'\n";
+ print STDERR " or if using cpanminus 'cpanm IO::Socket::SSL' could be used to install it.\n";
+ exit 77; # skip
+}
+IO::Socket::SSL->import();
+
+my $SOCKET = HTTP::Daemon->new (LocalAddr => 'localhost',
+ ReuseAddr => 1) or die "Cannot create server!!!";
+
+sub get_request {
+ my $conn = shift;
+ my $content = '';
+ my $line;
+
+ while (defined ($line = <$conn>)) {
+ $content .= $line;
+ last if $line eq "\r\n";
+ }
+
+ my $rqst = HTTP::Request->parse($content)
+ or die "Couldn't parse request:\n$content\n";
+
+ return $rqst;
+}
+
+sub do_server {
+ my ($synch_callback) = @_;
+ my $s = $SOCKET;
+ my $conn;
+ my $rqst;
+ my $rspn;
+
+ # sync with the parent
+ $synch_callback->();
+
+ # Simulate a HTTPS proxy server with tunneling.
+
+ $conn = $s->accept;
+ $rqst = $conn->get_request;
+ die "Method not CONNECT\n" if ($rqst->method ne 'CONNECT');
+ $rspn = HTTP::Response->new(200, 'OK');
+ $conn->send_response($rspn);
+
+ # Now switch from plain to SSL (for simulating a transparent tunnel
+ # to an HTTPS server).
+
+ my %options = (
+ SSL_server => 1,
+ SSL_passwd_cb => sub { return "Hello"; });
+ $options{SSL_cert_file} = $cert_path if ($cert_path);
+ $options{SSL_key_file} = $key_path if ($key_path);
+ my @options = %options;
+ $conn = IO::Socket::SSL->new_from_fd($conn->fileno, @options)
+ or die "Couldn't initiate SSL";
+
+ for my $expect_inner_auth (0, 1) {
+ # TODO: expect no auth the first time, request it, expect it the second
+ # time.
+
+ $rqst = &get_request($conn)
+ or die "Didn't get proxied request\n";
+
+ unless ($expect_inner_auth) {
+ die "Early proxied auth\n" if $rqst->header('Authorization');
+
+ $rspn = HTTP::Response->new(401, 'Unauthorized', [
+ 'WWW-Authenticate' => 'Basic realm="gondor"',
+ Connection => 'keep-alive'
+ ]);
+ } else {
+ die "No proxied auth\n" unless $rqst->header('Authorization');
+
+ $rspn = HTTP::Response->new(200, 'OK', [
+ 'Content-Type' => 'text/plain',
+ 'Connection' => 'close',
+ ], "foobarbaz\n");
+ }
+
+ $rspn->protocol('HTTP/1.0');
+ print STDERR "=====\n";
+ print STDERR $rspn->as_string;
+ print STDERR "\n=====\n";
+ print $conn $rspn->as_string;
+ }
+
+ $conn->close;
+ undef $conn;
+ undef $s;
+}
+
+sub fork_server {
+ pipe(FROM_CHILD, TO_PARENT) or die "Cannot create pipe!";
+ select((select(TO_PARENT), $| = 1)[0]);
+
+ my $pid = fork();
+ if ($pid < 0) {
+ die "Cannot fork";
+ } elsif ($pid == 0) {
+ # child
+ close FROM_CHILD;
+ do_server(sub { print TO_PARENT "SYNC\n"; close TO_PARENT });
+ exit 0;
+ } else {
+ # parent
+ close TO_PARENT;
+ chomp(my $line = <FROM_CHILD>);
+ close FROM_CHILD;
+ }
+
+ return $pid;
+}
+
+unlink "needs-auth.txt";
+my $pid = &fork_server;
+
+my $cmdline = $WgetTest::WGETPATH . " --user=fiddle-dee-dee"
+ . " --password=Dodgson -e https_proxy=localhost:{{port}}"
+ . " --no-check-certificate"
+ . " https://no.such.domain/needs-auth.txt";
+$cmdline =~ s/\Q{{port}}/$SOCKET->sockport()/e;
+
+if (defined $srcdir) {
+ $VALGRIND_SUPP_FILE = $srcdir . '/valgrind-suppressions-ssl';
+} else {
+ $VALGRIND_SUPP_FILE = './valgrind-suppressions-ssl';
+}
+
+my $valgrind = $ENV{VALGRIND_TESTS};
+if (!defined $valgrind || $valgrind eq "" || $valgrind == 0) {
+ # Valgrind not requested - leave $cmdline as it is
+} elsif ($valgrind == 1) {
+ $cmdline =
+ 'valgrind --suppressions=' . $VALGRIND_SUPP_FILE
+ . ' --error-exitcode=301 --leak-check=yes --track-origins=yes '
+ . $cmdline;
+} else {
+ $cmdline = $valgrind . " " . $cmdline;
+}
+
+my $code = system($cmdline . " 2>&1") >> 8;
+unlink "needs-auth.txt";
+
+warn "Got code: $code\n" if $code;
+kill ('TERM', $pid);
+exit ($code != 0);
diff --git a/tests/Test-proxied-https-auth.px b/tests/Test-proxied-https-auth.px
new file mode 100755
index 0000000..81c93c1
--- /dev/null
+++ b/tests/Test-proxied-https-auth.px
@@ -0,0 +1,180 @@
+#!/usr/bin/env perl
+# Simulate a tunneling proxy to a HTTPS URL that needs authentication.
+# Use two connections (Connection: close)
+
+use strict;
+use warnings;
+
+use WgetFeature qw(https);
+use WgetTests; # For $WGETPATH.
+
+my $cert_path;
+my $key_path;
+my $srcdir;
+
+our $VALGRIND_SUPP_FILE;
+
+if (@ARGV) {
+ $srcdir = shift @ARGV;
+} elsif (defined $ENV{srcdir}) {
+ $srcdir = $ENV{srcdir};
+}
+
+if (defined $srcdir) {
+ $key_path = "$srcdir/certs/server-key.pem";
+ $cert_path = "$srcdir/certs/server-cert.pem";
+} else {
+ $key_path = "certs/server-key.pem";
+ $cert_path = "certs/server-cert.pem";
+}
+
+
+use HTTP::Daemon;
+use HTTP::Request;
+# Skip this test rather than fail it when the module isn't installed
+if (!eval {require IO::Socket::SSL;1;}) {
+ print STDERR "This test needs the perl module \"IO::Socket::SSL\".\n";
+ print STDERR "Install e.g. on Debian with 'apt-get install libio-socket-ssl-perl'\n";
+ print STDERR " or if using cpanminus 'cpanm IO::Socket::SSL' could be used to install it.\n";
+ exit 77; # skip
+}
+IO::Socket::SSL->import();
+
+my $SOCKET = HTTP::Daemon->new (LocalAddr => 'localhost',
+ ReuseAddr => 1) or die "Cannot create server!!!";
+
+sub get_request {
+ my $conn = shift;
+ my $content = '';
+ my $line;
+
+ while (defined ($line = <$conn>)) {
+ $content .= $line;
+ last if $line eq "\r\n";
+ }
+
+ my $rqst = HTTP::Request->parse($content)
+ or die "Couldn't parse request:\n$content\n";
+
+ return $rqst;
+}
+
+sub do_server {
+ my ($synch_callback) = @_;
+ my $s = $SOCKET;
+ my $conn;
+ my $rqst;
+ my $rspn;
+
+ my %options = (
+ SSL_server => 1,
+ SSL_passwd_cb => sub { return "Hello"; });
+ $options{SSL_cert_file} = $cert_path if ($cert_path);
+ $options{SSL_key_file} = $key_path if ($key_path);
+ my @options = %options;
+
+ # sync with the parent
+ $synch_callback->();
+
+ # Simulate a HTTPS proxy server with tunneling.
+
+ for my $expect_inner_auth (0, 1) {
+ $conn = $s->accept;
+ $rqst = $conn->get_request;
+ die "Method not CONNECT\n" if ($rqst->method ne 'CONNECT');
+ $rspn = HTTP::Response->new(200, 'OK');
+ $conn->send_response($rspn);
+
+ # Now switch from plain to SSL (for simulating a transparent tunnel
+ # to an HTTPS server).
+
+ $conn = IO::Socket::SSL->new_from_fd($conn->fileno, @options)
+ or die "Couldn't initiate SSL";
+
+ $rqst = &get_request($conn)
+ or die "Didn't get proxied request\n";
+
+ unless ($expect_inner_auth) {
+ die "Early proxied auth\n" if $rqst->header('Authorization');
+
+ $rspn = HTTP::Response->new(401, 'Unauthorized', [
+ 'WWW-Authenticate' => 'Basic realm="gondor"',
+ Connection => 'close'
+ ]);
+ } else {
+ die "No proxied auth\n" unless $rqst->header('Authorization');
+
+ $rspn = HTTP::Response->new(200, 'OK', [
+ 'Content-Type' => 'text/plain',
+ 'Connection' => 'close',
+ ], "foobarbaz\n");
+ }
+
+ $rspn->protocol('HTTP/1.0');
+ print STDERR "=====\n";
+ print STDERR $rspn->as_string;
+ print STDERR "\n=====\n";
+ print $conn $rspn->as_string;
+
+ $conn->close;
+ }
+
+ undef $conn;
+ undef $s;
+}
+
+sub fork_server {
+ pipe(FROM_CHILD, TO_PARENT) or die "Cannot create pipe!";
+ select((select(TO_PARENT), $| = 1)[0]);
+
+ my $pid = fork();
+ if ($pid < 0) {
+ die "Cannot fork";
+ } elsif ($pid == 0) {
+ # child
+ close FROM_CHILD;
+ do_server(sub { print TO_PARENT "SYNC\n"; close TO_PARENT });
+ exit 0;
+ } else {
+ # parent
+ close TO_PARENT;
+ chomp(my $line = <FROM_CHILD>);
+ close FROM_CHILD;
+ }
+
+ return $pid;
+}
+
+unlink "needs-auth.txt";
+my $pid = &fork_server;
+
+my $cmdline = $WgetTest::WGETPATH . " --user=fiddle-dee-dee"
+ . " --password=Dodgson -e https_proxy=localhost:{{port}}"
+ . " --no-check-certificate"
+ . " https://no.such.domain/needs-auth.txt";
+$cmdline =~ s/\Q{{port}}/$SOCKET->sockport()/e;
+
+if (defined $srcdir) {
+ $VALGRIND_SUPP_FILE = $srcdir . '/valgrind-suppressions-ssl';
+} else {
+ $VALGRIND_SUPP_FILE = './valgrind-suppressions-ssl';
+}
+
+my $valgrind = $ENV{VALGRIND_TESTS};
+if (!defined $valgrind || $valgrind eq "" || $valgrind == 0) {
+ # Valgrind not requested - leave $cmdline as it is
+} elsif ($valgrind == 1) {
+ $cmdline =
+ 'valgrind --suppressions=' . $VALGRIND_SUPP_FILE
+ . ' --error-exitcode=301 --leak-check=yes --track-origins=yes --gen-suppressions=all '
+ . $cmdline;
+} else {
+ $cmdline = $valgrind . " " . $cmdline;
+}
+
+my $code = system($cmdline . " 2>&1") >> 8;
+unlink "needs-auth.txt";
+
+warn "Got code: $code\n" if $code;
+kill ('TERM', $pid);
+exit ($code != 0);
diff --git a/tests/Test-proxy-auth-basic.px b/tests/Test-proxy-auth-basic.px
new file mode 100755
index 0000000..4c2dee8
--- /dev/null
+++ b/tests/Test-proxy-auth-basic.px
@@ -0,0 +1,47 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+my $wholefile = "You're all authenticated.\n";
+
+# code, msg, headers, content
+my %urls = (
+ 'http://no.such.domain/needs-auth.txt' => {
+ auth_method => 'Basic',
+ user => 'fiddle-dee-dee',
+ passwd => 'Dodgson',
+ code => "200",
+ msg => "You want fries with that?",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => $wholefile,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --user=fiddle-dee-dee --password=Dodgson"
+ . " -e http_proxy=localhost:{{port}} http://no.such.domain/needs-auth.txt";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ 'needs-auth.txt' => {
+ content => $wholefile,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-restrict-ascii.px b/tests/Test-restrict-ascii.px
new file mode 100755
index 0000000..ecde384
--- /dev/null
+++ b/tests/Test-restrict-ascii.px
@@ -0,0 +1,67 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+# This program tests that --restrict-file-names=ascii can be used to
+# ensure that all high-valued bytes are escaped. The sample filename was
+# chosen because in former versions of Wget, one could either choose not
+# to escape any portion of the UTF-8 filename via
+# --restrict-file-names=nocontrol (which would only be helpful if one
+# was _on_ a UTF-8 system), or else Wget would escape _portions_ of
+# characters, leaving irrelevant "latin1"-looking characters combined
+# with percent-encoded "control" characters, instead of encoding all the
+# bytes of an entire non-ASCII UTF-8 character.
+
+###############################################################################
+
+# "gnosis" in UTF-8 greek.
+my $gnosis = '%CE%B3%CE%BD%CF%89%CF%83%CE%B9%CF%82';
+
+my $mainpage = <<EOF;
+<html>
+<head>
+ <title>Some Page Title</title>
+</head>
+<body>
+ <p>
+ Some text...
+ </p>
+</body>
+</html>
+EOF
+
+# code, msg, headers, content
+my %urls = (
+ "/$gnosis.html" => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/html",
+ },
+ content => $mainpage,
+ },
+);
+
+my $cmdline = $WgetTest::WGETPATH . " --restrict-file-names=ascii "
+ . "http://localhost:{{port}}/${gnosis}.html";
+
+my $expected_error_code = 0;
+
+my %expected_downloaded_files = (
+ "${gnosis}.html" => {
+ content => $mainpage,
+ },
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/Test-stdouterr.px b/tests/Test-stdouterr.px
new file mode 100755
index 0000000..7bcfed9
--- /dev/null
+++ b/tests/Test-stdouterr.px
@@ -0,0 +1,46 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use HTTPTest;
+
+
+###############################################################################
+
+# code, msg, headers, content
+my %urls = (
+ '/somefile.txt' => {
+ code => "200",
+ msg => "Dontcare",
+ headers => {
+ "Content-type" => "text/plain",
+ },
+ content => "blabla",
+ },
+);
+
+unless(-e "/dev/full") {
+ exit 77; # skip
+}
+
+my $cmdline = $WgetTest::WGETPATH . " -c http://localhost:{{port}}/somefile.txt -O /dev/full";
+
+my $expected_error_code = 3;
+
+my %existing_files = (
+);
+
+my %expected_downloaded_files = (
+);
+
+###############################################################################
+
+my $the_test = HTTPTest->new (input => \%urls,
+ cmdline => $cmdline,
+ errcode => $expected_error_code,
+ existing => \%existing_files,
+ output => \%expected_downloaded_files);
+exit $the_test->run();
+
+# vim: et ts=4 sw=4
diff --git a/tests/WgetFeature.pm b/tests/WgetFeature.pm
new file mode 100644
index 0000000..0d59573
--- /dev/null
+++ b/tests/WgetFeature.pm
@@ -0,0 +1,41 @@
+package WgetFeature;
+
+use strict;
+use warnings;
+
+our $VERSION = 0.01;
+
+use English qw(-no_match_vars);
+use WgetTests;
+
+sub import
+{
+ my ($class, @required_feature) = @_;
+
+ # create a list of available features from 'wget --version' output
+ my $output = `$WgetTest::WGETPATH --version`;
+ my ($list) = $output =~ m/^([+-]\S+(?:\s+[+-]\S+)+)/msx;
+ my %have_features;
+ for my $f (split m/\s+/msx, $list)
+ {
+ my $feat = $f;
+ $feat =~ s/^.//msx;
+ $have_features{$feat} = $f =~ m/^[+]/msx ? 1 : 0;
+ }
+
+ foreach (@required_feature)
+ {
+ if (!$have_features{$_})
+ {
+ print "Skipped test: Wget misses feature '$_'\n";
+ print "Features available from 'wget --version' output:\n";
+ foreach (keys %have_features)
+ {
+ print " $_=$have_features{$_}\n";
+ }
+ exit 77; # skip
+ }
+ }
+}
+
+1;
diff --git a/tests/WgetTests.pm b/tests/WgetTests.pm
new file mode 100644
index 0000000..657b69b
--- /dev/null
+++ b/tests/WgetTests.pm
@@ -0,0 +1,447 @@
+package WgetTest;
+
+use strict;
+use warnings;
+
+our $VERSION = 0.01;
+
+use Carp;
+use Cwd;
+use English qw(-no_match_vars);
+use File::Path;
+use IO::Handle;
+use POSIX qw(locale_h);
+use locale;
+
+if (defined $ENV{'WGET_PATH'}) {
+ our $WGETPATH = $ENV{'WGET_PATH'} . ' -d --no-config';
+} else {
+ our $WGETPATH = '../src/wget -d --no-config';
+}
+
+
+our $VALGRIND_SUPP_FILE = Cwd::getcwd();
+if (defined $ENV{'srcdir'}) {
+ $VALGRIND_SUPP_FILE = $VALGRIND_SUPP_FILE
+ . "/" . $ENV{'srcdir'};
+}
+$VALGRIND_SUPP_FILE = $VALGRIND_SUPP_FILE . '/valgrind-suppressions';
+
+my @unexpected_downloads = ();
+
+{
+ my %_attr_data = ( # DEFAULT
+ _cmdline => q{},
+ _workdir => Cwd::getcwd(),
+ _errcode => 0,
+ _existing => {},
+ _input => {},
+ _name => $PROGRAM_NAME,
+ _output => {},
+ _server_behavior => {},
+ );
+
+ sub _default_for
+ {
+ my ($self, $attr) = @_;
+ return $_attr_data{$attr};
+ }
+
+ sub _standard_keys
+ {
+ return keys %_attr_data;
+ }
+}
+
+sub new
+{
+ my ($caller, %args) = @_;
+ my $caller_is_obj = ref $caller;
+ my $class = $caller_is_obj || $caller;
+
+ #print STDERR "class = ", $class, "\n";
+ #print STDERR "_attr_data {workdir} = ", $WgetTest::_attr_data{_workdir}, "\n";
+ my $self = bless {}, $class;
+ for my $attrname ($self->_standard_keys())
+ {
+
+ #print STDERR "attrname = ", $attrname, " value = ";
+ my ($argname) = ($attrname =~ m/^_(.*)/msx);
+ if (exists $args{$argname})
+ {
+
+ #printf STDERR "Setting up $attrname\n";
+ $self->{$attrname} = $args{$argname};
+ }
+ elsif ($caller_is_obj)
+ {
+
+ #printf STDERR "Copying $attrname\n";
+ $self->{$attrname} = $caller->{$attrname};
+ }
+ else
+ {
+ #printf STDERR "Using default for $attrname\n";
+ $self->{$attrname} = $self->_default_for($attrname);
+ }
+
+ #print STDERR $attrname, '=', $self->{$attrname}, "\n";
+ }
+
+ #printf STDERR "_workdir default = ", $self->_default_for("_workdir");
+ return $self;
+}
+
+sub run
+{
+ my $self = shift;
+ my $result_message = "Test successful.\n";
+ my $errcode;
+
+ $self->{_name} =~ s{.*/}{}msx; # remove path
+ $self->{_name} =~ s{[.][^.]+$}{}msx; # remove extension
+ printf "Running test $self->{_name}\n";
+
+ # Setup
+ my $new_result = $self->_setup();
+ chdir "$self->{_workdir}/$self->{_name}/input"
+ or carp "Could not chdir to input directory: $ERRNO";
+ if (defined $new_result)
+ {
+ $result_message = $new_result;
+ $errcode = 1;
+ goto cleanup;
+ }
+
+ # Launch server
+ my $pid = $self->_fork_and_launch_server();
+
+ # Call wget
+ chdir "$self->{_workdir}/$self->{_name}/output"
+ or carp "Could not chdir to output directory: $ERRNO";
+
+ my $cmdline = $self->{_cmdline};
+ $cmdline = $self->_substitute_port($cmdline);
+ $cmdline =
+ ($cmdline =~ m{^/.*}msx) ? $cmdline : "$self->{_workdir}/$cmdline";
+
+ my $valgrind = $ENV{VALGRIND_TESTS};
+ if (!defined $valgrind)
+ {
+ $valgrind = 0;
+ }
+
+ my $gdb = $ENV{GDB_TESTS};
+ if (!defined $gdb)
+ {
+ $gdb = 0;
+ }
+
+ if ($gdb == 1)
+ {
+ $cmdline = 'gdb --args ' . $cmdline;
+ }
+ elsif ($valgrind eq "1")
+ {
+ $cmdline =
+ 'valgrind --suppressions=' . $VALGRIND_SUPP_FILE
+ . ' --error-exitcode=301 --leak-check=yes --track-origins=yes --gen-suppressions=all '
+ . $cmdline;
+ }
+ elsif ($valgrind ne q{} && $valgrind ne "0")
+ {
+ $cmdline = "$valgrind $cmdline";
+ }
+
+ print "Calling $cmdline\n";
+ $errcode = system $cmdline;
+ $errcode >>= 8; # XXX: should handle abnormal error codes.
+
+ # Shutdown server
+ # if we didn't explicitly kill the server, we would have to call
+ # waitpid ($pid, 0) here in order to wait for the child process to
+ # terminate
+ kill 'TERM', $pid;
+
+ # Verify download
+ if ($errcode != $self->{_errcode})
+ {
+ $result_message =
+ "Test failed: wrong code returned (was: $errcode, expected: $self->{_errcode})\n";
+ goto CLEANUP;
+ }
+ my $error_str;
+ if ($error_str = $self->_verify_download())
+ {
+ $result_message = $error_str;
+ }
+
+ CLEANUP:
+ $self->_cleanup();
+
+ print $result_message;
+ return $errcode != $self->{_errcode} || ($error_str ? 1 : 0);
+}
+
+sub _setup
+{
+ my $self = shift;
+
+ chdir $self->{_workdir}
+ or carp "Could not chdir into $self->{_workdir}: $ERRNO";
+
+ # Create temporary directory
+ mkdir $self->{_name} or carp "Could not mkdir '$self->{_name}': $ERRNO";
+ chdir $self->{_name}
+ or carp "Could not chdir into '$self->{_name}': $ERRNO";
+ mkdir 'input' or carp "Could not mkdir 'input' $ERRNO";
+ mkdir 'output' or carp "Could not mkdir 'output': $ERRNO";
+
+ # Setup existing files
+ chdir 'output' or carp "Could not chdir into 'output': $ERRNO";
+ for my $filename (keys %{$self->{_existing}})
+ {
+ open my $fh, '>', $filename
+ or return "Test failed: cannot open pre-existing file $filename\n";
+
+ my $file = $self->{_existing}->{$filename};
+ print {$fh} $file->{content}
+ or return "Test failed: cannot write pre-existing file $filename\n";
+
+ close $fh or carp $ERRNO;
+
+ if (exists($file->{timestamp}))
+ {
+ utime $file->{timestamp}, $file->{timestamp}, $filename
+ or return
+ "Test failed: cannot set timestamp on pre-existing file $filename\n";
+ }
+ }
+
+ chdir '../input' or carp "Cannot chdir into '../input': $ERRNO";
+ $self->_setup_server();
+
+ chdir $self->{_workdir}
+ or carp "Cannot chdir into '$self->{_workdir}': $ERRNO";
+ return;
+}
+
+sub _cleanup
+{
+ my $self = shift;
+
+ chdir $self->{_workdir}
+ or carp "Could not chdir into '$self->{_workdir}': $ERRNO";
+ if (!$ENV{WGET_TEST_NO_CLEANUP})
+ {
+ File::Path::rmtree($self->{_name});
+ }
+ return 1;
+}
+
+# not a method
+sub quotechar
+{
+ my $c = ord shift;
+ if ($c >= 0x7 && $c <= 0xD)
+ {
+ return q{\\} . qw(a b t n v f r) [$c - 0x7];
+ }
+ else
+ {
+ return sprintf '\\x%02x', $c;
+ }
+}
+
+# not a method
+sub _show_diff
+{
+ my ($expected, $actual) = @_;
+ my $SNIPPET_SIZE = 10;
+
+ my $str = q{};
+ my $explen = length $expected;
+ my $actlen = length $actual;
+
+ if ($explen != $actlen)
+ {
+ $str .= "Sizes don't match: expected = $explen, actual = $actlen\n";
+ }
+
+ my $min = $explen <= $actlen ? $explen : $actlen;
+ my $line = 1;
+ my $col = 1;
+ my $i = 0;
+
+ while ( $i < $min )
+ {
+ last if substr($expected, $i, 1) ne substr $actual, $i, 1;
+ if (substr($expected, $i, 1) eq "\n")
+ {
+ $line++;
+ $col = 0;
+ }
+ else
+ {
+ $col++;
+ }
+ $i++;
+ }
+ my $snip_start = $i - ($SNIPPET_SIZE / 2);
+ if ($snip_start < 0)
+ {
+ $SNIPPET_SIZE += $snip_start; # Take it from the end.
+ $snip_start = 0;
+ }
+ my $exp_snip = substr $expected, $snip_start, $SNIPPET_SIZE;
+ my $act_snip = substr $actual, $snip_start, $SNIPPET_SIZE;
+ $exp_snip =~ s/[^[:print:]]/ quotechar($&) /gemsx;
+ $act_snip =~ s/[^[:print:]]/ quotechar($&) /gemsx;
+ $str .= "Mismatch at line $line, col $col:\n";
+ $str .= " $exp_snip\n";
+ $str .= " $act_snip\n";
+
+ return $str;
+}
+
+sub _verify_download
+{
+ my $self = shift;
+
+ chdir "$self->{_workdir}/$self->{_name}/output"
+ or carp "Could not chdir into output directory: $ERRNO";
+
+ # use slurp mode to read file content
+ my $old_input_record_separator = $INPUT_RECORD_SEPARATOR;
+ local $INPUT_RECORD_SEPARATOR = undef;
+
+ while (my ($filename, $filedata) = each %{$self->{_output}})
+ {
+ open my $fh, '<', $filename
+ or return "Test failed: file $filename not downloaded\n";
+
+ my $content = <$fh>;
+
+ close $fh or carp $ERRNO;
+
+ my $expected_content = $filedata->{'content'};
+ $expected_content = $self->_substitute_port($expected_content);
+ if ($content ne $expected_content)
+ {
+ return "Test failed: wrong content for file $filename\n"
+ . _show_diff($expected_content, $content);
+ }
+
+ if (exists($filedata->{'timestamp'}))
+ {
+ my (
+ $dev, $ino, $mode, $nlink, $uid,
+ $gid, $rdev, $size, $atime, $mtime,
+ $ctime, $blksize, $blocks
+ )
+ = stat $filename;
+
+ $mtime == $filedata->{'timestamp'}
+ or return "Test failed: wrong timestamp for file $filename: expected = $filedata->{'timestamp'}, actual = $mtime\n";
+ }
+
+ }
+
+ local $INPUT_RECORD_SEPARATOR = $old_input_record_separator;
+
+ # make sure no unexpected files were downloaded
+ chdir "$self->{_workdir}/$self->{_name}/output"
+ or carp "Could not change into output directory: $ERRNO";
+
+ __dir_walk(
+ q{.},
+ sub {
+ if (!(exists $self->{_output}{$_[0]} || $self->{_existing}{$_[0]}))
+ {
+ push @unexpected_downloads, $_[0];
+ }
+ },
+ sub { shift; return @_ }
+ );
+ if (@unexpected_downloads)
+ {
+ return 'Test failed: unexpected downloaded files [' .
+ (join ', ', @unexpected_downloads) . "]\n";
+
+ }
+
+ return q{};
+}
+
+sub __dir_walk
+{
+ my ($top, $filefunc, $dirfunc) = @_;
+
+ my $DIR;
+
+ if (-d $top)
+ {
+ my $file;
+ if (!opendir $DIR, $top)
+ {
+ warn "Couldn't open directory $DIR: $ERRNO; skipping.\n";
+ return;
+ }
+
+ my @results;
+ while ($file = readdir $DIR)
+ {
+ next if $file eq q{.} || $file eq q{..};
+ my $nextdir = $top eq q{.} ? $file : "$top/$file";
+ push @results, __dir_walk($nextdir, $filefunc, $dirfunc);
+ }
+
+ return $dirfunc ? $dirfunc->($top, @results) : ();
+ }
+ else
+ {
+ return $filefunc ? $filefunc->($top) : ();
+ }
+}
+
+sub _fork_and_launch_server
+{
+ my $self = shift;
+
+ pipe FROM_CHILD, TO_PARENT or croak 'Cannot create pipe!';
+ TO_PARENT->autoflush();
+
+ my $pid = fork;
+ if ($pid < 0)
+ {
+ carp 'Cannot fork';
+ }
+ elsif ($pid == 0)
+ {
+
+ # child
+ close FROM_CHILD or carp $ERRNO;
+
+ # FTP Server has to start with english locale due to use of strftime month names in LIST command
+ setlocale(LC_ALL, 'C');
+ $self->_launch_server(
+ sub {
+ print {*TO_PARENT} "SYNC\n";
+ close TO_PARENT or carp $ERRNO;
+ }
+ );
+ }
+ else
+ {
+ # father
+ close TO_PARENT or carp $ERRNO;
+ chomp(my $line = <FROM_CHILD>);
+ close FROM_CHILD or carp $ERRNO;
+ }
+
+ return $pid;
+}
+
+1;
+
+# vim: et ts=4 sw=4
diff --git a/tests/certs/README b/tests/certs/README
new file mode 100644
index 0000000..bf77991
--- /dev/null
+++ b/tests/certs/README
@@ -0,0 +1 @@
+If ever needed, 'create-certs.sh' generates all keys, certs and crls.
diff --git a/tests/certs/client-cert.pem b/tests/certs/client-cert.pem
new file mode 100644
index 0000000..b82364b
--- /dev/null
+++ b/tests/certs/client-cert.pem
@@ -0,0 +1,27 @@
+-----BEGIN CERTIFICATE-----
+MIIEojCCAwqgAwIBAgIMW+WWpC75FINCVgviMA0GCSqGSIb3DQEBCwUAMFIxDTAL
+BgNVBAMTBFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UE
+CBMIU3Vuc2hpbmUxETAPBgNVBAYTCEZyZWVsYW5kMCAXDTE4MTEwOTE0MTYwNFoY
+Dzk5OTkxMjMxMjM1OTU5WjBSMQ0wCwYDVQQDEwRXZ2V0MQ0wCwYDVQQLEwRXZ2V0
+MQwwCgYDVQQKEwNHTlUxETAPBgNVBAgTCFN1bnNoaW5lMREwDwYDVQQGEwhGcmVl
+bGFuZDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM9Y7Xzh1QnHbO1q
+7kc/4mK0xhsldkMMD4Zg15dXUww6w1wso4gUv7F3IbJywyd6nTK+5rt+mMPiQaGI
+3pFGS3o2/AvFemrbyw9unifeAWEvioHH0Hsfxk2+M1sToWAgHwSCzEkYt9Vs/LIe
+efQxFTJPsEw4B3Sk+iySZPujsOP6he5kHKSw4QHHJqM4sbaOE3XejFb/IX/eOkH6
++VvW5o0fILIyw0eTFs5sGf6dBj0DMdSyHzo8v3svjSLil5ryE97CYlSHQJLCGKUm
+BVMBhyhBGCzCmL2TdfMy7JY6t+9nvpmpPJ4QEyHMIvnebKFGTpDn+9niJDj6ZWcb
+P2m0yRMB7a6kWAFP8Fk9dCLP0FZQz+qJH/JkKRt7+Kjs5ZMtLJor1UlSJpBVouyz
+Ig0nf1qy92Uv3QoOCqCU3yIxsa3MsV32RSO0S6Ii3MlpF/3Wufgmdd7vRRgsHnq5
+WD9fdNPRxUPin7SmJMJQg4SY4XBPBHNEKVp8d2OlpTw3miZZAQIDAQABo3YwdDAM
+BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA8GA1UdDwEB/wQFAwMH
+oAAwHQYDVR0OBBYEFG1jBA//1vnWiPseRPqA50QHSGbpMB8GA1UdIwQYMBaAFJ4O
+WyKM+9KPJ1PV1goMyw1ZD2SYMA0GCSqGSIb3DQEBCwUAA4IBgQBovKzuJjbQD7Mk
+GOKj9HQhJeGEvn6MEi1c0o3KWgOm8D2PA78Uq++JJKBxowD7WSCmSNVDltJzDWQO
+FFpIiWkvaOH11JeXhmf4kYsRsSRVlgUEj5SEqZn5lMxX7sIHHr9QmNdFqQgKVM2V
+4qIg233MiOA3RUV6IsP0XgGdhFjqZ61bDyEZ48pdiRhg/iuI0yIiFRnJsthUl3LU
+D0fVgP2/4gTWvUTvVNrR8yH6Ou4bcOovWp+8y5J2KKwMD+6QKKP5DVhZOighdKI+
+v5F3aS1/DbazHs8NFcuuHntDq/gEdjn7IHGcyIhe5NWzExOejTx0yOGX8Q6dTqLw
+UUltfqZk1QsgsBilR9Dk9A7AGy5VonknFvwS+HqUSruR6OwKTsqq6KIlfbpgpkj3
+YiO8BlhhfwG2K9rpdToywZDNS2RKAY1rjjFw3lwiK+qcE6KanJbMKZO9kpstMYlS
+z4E2sTUOL5pfVRPngJrOJwQSUe+JWS55zFpv6bt80VGWNcPkJLY=
+-----END CERTIFICATE-----
diff --git a/tests/certs/client-key.pem b/tests/certs/client-key.pem
new file mode 100644
index 0000000..891082d
--- /dev/null
+++ b/tests/certs/client-key.pem
@@ -0,0 +1,182 @@
+Public Key Info:
+ Public Key Algorithm: RSA
+ Key Security Level: High (3072 bits)
+
+modulus:
+ 00:cf:58:ed:7c:e1:d5:09:c7:6c:ed:6a:ee:47:3f:e2
+ 62:b4:c6:1b:25:76:43:0c:0f:86:60:d7:97:57:53:0c
+ 3a:c3:5c:2c:a3:88:14:bf:b1:77:21:b2:72:c3:27:7a
+ 9d:32:be:e6:bb:7e:98:c3:e2:41:a1:88:de:91:46:4b
+ 7a:36:fc:0b:c5:7a:6a:db:cb:0f:6e:9e:27:de:01:61
+ 2f:8a:81:c7:d0:7b:1f:c6:4d:be:33:5b:13:a1:60:20
+ 1f:04:82:cc:49:18:b7:d5:6c:fc:b2:1e:79:f4:31:15
+ 32:4f:b0:4c:38:07:74:a4:fa:2c:92:64:fb:a3:b0:e3
+ fa:85:ee:64:1c:a4:b0:e1:01:c7:26:a3:38:b1:b6:8e
+ 13:75:de:8c:56:ff:21:7f:de:3a:41:fa:f9:5b:d6:e6
+ 8d:1f:20:b2:32:c3:47:93:16:ce:6c:19:fe:9d:06:3d
+ 03:31:d4:b2:1f:3a:3c:bf:7b:2f:8d:22:e2:97:9a:f2
+ 13:de:c2:62:54:87:40:92:c2:18:a5:26:05:53:01:87
+ 28:41:18:2c:c2:98:bd:93:75:f3:32:ec:96:3a:b7:ef
+ 67:be:99:a9:3c:9e:10:13:21:cc:22:f9:de:6c:a1:46
+ 4e:90:e7:fb:d9:e2:24:38:fa:65:67:1b:3f:69:b4:c9
+ 13:01:ed:ae:a4:58:01:4f:f0:59:3d:74:22:cf:d0:56
+ 50:cf:ea:89:1f:f2:64:29:1b:7b:f8:a8:ec:e5:93:2d
+ 2c:9a:2b:d5:49:52:26:90:55:a2:ec:b3:22:0d:27:7f
+ 5a:b2:f7:65:2f:dd:0a:0e:0a:a0:94:df:22:31:b1:ad
+ cc:b1:5d:f6:45:23:b4:4b:a2:22:dc:c9:69:17:fd:d6
+ b9:f8:26:75:de:ef:45:18:2c:1e:7a:b9:58:3f:5f:74
+ d3:d1:c5:43:e2:9f:b4:a6:24:c2:50:83:84:98:e1:70
+ 4f:04:73:44:29:5a:7c:77:63:a5:a5:3c:37:9a:26:59
+ 01:
+
+public exponent:
+ 01:00:01:
+
+private exponent:
+ 15:5e:52:cb:45:f2:d0:99:2e:ce:a0:f0:81:83:41:ef
+ 6e:35:e4:62:4d:f7:c6:ec:6a:aa:dc:4d:0a:80:d2:87
+ d3:ce:52:03:60:68:d3:00:95:08:71:fd:85:c3:31:cd
+ b5:87:1a:fc:43:a5:b6:ba:40:8d:47:2f:b8:c5:07:ce
+ 46:90:5f:1e:30:e9:86:51:3c:fb:e7:6c:b0:62:70:03
+ 98:40:9b:b9:0e:97:4d:b6:81:5d:85:8b:56:5c:33:b3
+ 3e:a1:c4:2f:dc:4e:45:be:7f:a4:53:a3:b9:d8:bd:18
+ 7c:41:ec:f8:f1:3b:c2:2c:ce:1f:20:2d:16:c7:8a:17
+ 2d:6a:4e:02:ed:ae:14:e2:3c:05:ed:58:50:68:41:e8
+ 1b:83:9d:ee:f1:48:20:87:64:75:9c:49:ca:7f:31:2f
+ 65:ff:d6:9d:88:a6:7d:b0:22:01:de:03:f1:66:cd:2e
+ e1:19:cc:69:8f:74:e7:3e:e8:bd:a0:d4:bd:4f:08:97
+ 77:f8:13:76:1c:c6:2e:2b:3d:93:f0:78:1b:f6:ff:c7
+ 2f:59:8c:57:46:63:93:00:6f:c8:6e:5d:61:7e:f2:78
+ 1a:de:42:2b:61:0c:77:33:a9:ca:57:1b:fa:57:fb:a1
+ 11:fc:62:d1:6d:0b:b4:88:17:4b:b6:df:22:72:52:f0
+ 29:fe:57:07:ed:ab:b3:b1:ce:94:aa:ed:7e:55:56:e2
+ 1c:5b:cd:ce:bd:92:30:a0:29:af:45:13:28:1d:4d:0e
+ 6b:2e:8c:30:04:55:70:d0:af:a0:69:63:38:1b:24:7a
+ 02:e7:7e:a9:05:ee:82:01:23:7c:9d:4a:ef:16:8f:82
+ e5:e3:c8:0e:4e:9b:d0:58:66:9d:3a:e7:f3:68:68:0d
+ 57:f4:a0:26:b0:84:fa:61:60:3b:3c:a7:aa:15:67:7a
+ 5c:dc:ca:9a:18:fc:c3:a9:be:ff:f5:a5:58:9f:75:d4
+ 93:08:f8:23:fd:6e:25:05:23:b6:e2:29:f5:74:d7:81
+
+
+prime1:
+ 00:d3:13:55:70:ff:9d:91:c0:9f:6e:0b:2b:dc:b7:87
+ 94:30:56:4d:01:0d:dc:48:db:39:7d:ec:45:b8:e8:65
+ 76:1c:6c:04:25:f4:42:d0:9b:98:a9:ea:c4:45:05:e9
+ 6f:7e:14:91:76:d5:3a:23:50:e6:77:d3:78:7d:0d:eb
+ b8:f2:bf:b8:14:61:e1:94:f2:1b:f7:cc:67:9b:7b:2c
+ ea:c6:06:fc:b6:9c:ac:c0:4f:be:2e:49:d7:eb:6a:58
+ 4b:16:b5:36:d2:68:06:40:69:6d:3a:71:3e:ec:0d:ac
+ 40:b2:14:ce:09:3e:64:a8:8e:dc:77:ad:c6:b4:6f:7c
+ 69:ab:22:5a:06:fa:8c:b7:37:c2:ed:bd:40:14:98:83
+ 23:50:cd:0d:49:4b:48:70:c5:57:7f:0f:01:ae:5c:6a
+ 98:08:19:56:cc:02:87:d8:d5:17:77:00:67:9e:4d:8d
+ a5:a5:84:d7:31:78:a7:ca:3d:82:0d:d2:c5:48:33:b6
+ d9:
+
+prime2:
+ 00:fb:7a:76:40:d6:d8:08:74:ef:e2:59:d7:da:8a:24
+ 08:d7:57:fb:c5:fc:c9:21:d1:e2:14:48:f1:d4:5a:1d
+ 80:06:27:63:ae:4e:89:40:65:91:04:bc:b0:1f:1e:34
+ e1:96:fa:59:90:9d:96:42:17:b9:c4:ab:a8:8d:3b:3d
+ fc:b4:a5:9f:9a:04:63:c0:d9:4f:99:70:c3:df:da:28
+ 21:76:4b:c6:d6:85:36:4d:7d:f3:a2:8b:42:df:00:d6
+ 41:8d:48:18:f2:75:c8:7b:f6:33:13:c8:4e:91:21:3b
+ 4a:d8:b9:e6:0b:d6:61:c7:70:7d:78:a9:87:4a:90:19
+ 87:34:fa:df:8e:56:dc:92:0e:b0:13:60:90:7a:52:c6
+ 37:d1:a6:93:71:00:1a:dd:e4:ab:5d:b9:d8:2b:16:3c
+ 59:cb:5f:14:04:f7:6d:ab:06:f1:83:4b:92:b2:61:00
+ 73:d1:7e:2f:d4:e0:28:6d:0b:1f:b9:74:2d:e1:7e:ea
+ 69:
+
+coefficient:
+ 00:c0:04:52:12:3b:e6:a3:0a:1a:95:d7:ad:7b:97:af
+ 68:4e:ee:38:4e:88:c3:45:05:d5:bd:5d:69:70:d3:20
+ 90:cd:d3:d9:c3:49:ff:84:dd:36:c0:a0:6b:73:11:f0
+ cb:55:6b:e2:11:76:7c:a3:4a:7e:9c:ac:0f:c9:aa:85
+ 2e:95:f0:cc:07:20:b2:1f:54:2c:e8:20:a6:98:ac:e1
+ 44:ec:e0:00:eb:aa:21:48:bb:45:45:39:6e:66:0c:91
+ 29:32:25:83:f9:c6:34:d1:1b:b2:ac:49:ef:00:c6:19
+ e2:d6:72:50:f8:ac:ff:2c:90:35:0f:1c:ec:35:fe:de
+ 3a:65:12:a0:3e:bd:94:c5:29:95:dd:0d:0e:4d:94:61
+ ff:c3:68:01:6a:89:3c:03:fe:3e:31:80:3a:30:31:9b
+ 01:0f:30:30:97:48:fe:e7:fa:b2:da:02:e1:37:ca:18
+ 34:a3:f8:4d:e8:ac:1b:a0:bb:e2:5d:73:3f:7d:81:79
+ d6:
+
+exp1:
+ 00:98:4f:7c:39:25:0a:d3:d1:16:7a:76:ef:38:be:ea
+ c3:a1:39:b5:29:4c:92:27:b4:a1:c0:df:0c:d4:c8:45
+ e6:bb:cd:aa:14:a5:34:cd:89:69:d9:3b:02:53:f8:57
+ 21:4f:ee:91:a5:19:6a:71:6f:80:4e:f9:37:19:ae:40
+ e9:dd:a9:40:b0:dc:8c:c6:49:0a:ab:7e:41:49:2d:d2
+ 14:bb:be:f0:fe:e9:01:b3:68:17:89:19:5a:08:93:5d
+ 91:19:9a:bc:2b:8a:4a:f0:91:e2:f2:e8:23:0a:7d:37
+ 4e:1b:f2:ed:56:38:42:b4:6b:1a:65:f5:ec:cb:e9:22
+ f2:b1:3e:01:8e:c5:9f:62:da:86:fb:bc:b3:8f:e9:19
+ c0:13:1f:54:36:0e:70:00:88:36:82:06:17:25:75:a4
+ a9:7e:36:a2:ae:66:29:16:eb:75:9a:36:9d:8e:da:d1
+ 9a:b5:5c:ad:58:12:83:a9:69:46:fe:a8:98:19:68:cf
+ c9:
+
+exp2:
+ 00:cd:0f:4e:de:10:52:98:92:c2:09:10:b9:b2:ba:72
+ 27:c3:71:3b:1c:76:c4:8b:8f:59:8a:b0:f0:80:f7:fa
+ 96:2a:6e:74:19:ee:70:7c:d2:55:2e:47:ae:55:b1:8b
+ ed:67:ef:3c:99:6f:e6:d6:7e:02:3d:1c:bc:94:6d:7a
+ 5e:55:ef:b7:f5:1f:1f:38:61:fb:46:63:6d:55:5b:ce
+ dd:7a:58:d0:0a:9d:15:6a:9b:09:cf:c1:3f:06:18:e8
+ 9d:0b:57:7f:00:36:8b:04:89:fd:9c:63:f9:ac:de:2c
+ 3b:1b:fe:7a:57:ac:b8:8e:a8:6b:a7:b8:95:59:77:a7
+ 59:59:1a:38:b1:18:a3:43:76:36:9d:96:60:39:5e:c5
+ c3:3e:71:56:49:0e:8c:d9:e3:5c:d9:50:71:b4:b0:ad
+ 05:8b:90:3c:02:d0:bf:dc:76:0c:f9:c2:e6:1c:0e:7d
+ 0f:f4:03:b1:7d:24:4b:d2:9e:ff:7f:79:fc:ef:a3:4e
+ 01:
+
+
+Public Key PIN:
+ pin-sha256:WiIaPbDgZ234tiqBvORGWeUdOMl96+Vkd/bTbTgWXPU=
+Public Key ID:
+ sha256:5a221a3db0e0676df8b62a81bce44659e51d38c97debe56477f6d36d38165cf5
+ sha1:6d63040fffd6f9d688fb1e44fa80e744074866e9
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5QIBAAKCAYEAz1jtfOHVCcds7WruRz/iYrTGGyV2QwwPhmDXl1dTDDrDXCyj
+iBS/sXchsnLDJ3qdMr7mu36Yw+JBoYjekUZLejb8C8V6atvLD26eJ94BYS+KgcfQ
+ex/GTb4zWxOhYCAfBILMSRi31Wz8sh559DEVMk+wTDgHdKT6LJJk+6Ow4/qF7mQc
+pLDhAccmozixto4Tdd6MVv8hf946Qfr5W9bmjR8gsjLDR5MWzmwZ/p0GPQMx1LIf
+Ojy/ey+NIuKXmvIT3sJiVIdAksIYpSYFUwGHKEEYLMKYvZN18zLsljq372e+mak8
+nhATIcwi+d5soUZOkOf72eIkOPplZxs/abTJEwHtrqRYAU/wWT10Is/QVlDP6okf
+8mQpG3v4qOzlky0smivVSVImkFWi7LMiDSd/WrL3ZS/dCg4KoJTfIjGxrcyxXfZF
+I7RLoiLcyWkX/da5+CZ13u9FGCweerlYP19009HFQ+KftKYkwlCDhJjhcE8Ec0Qp
+Wnx3Y6WlPDeaJlkBAgMBAAECggGAFV5Sy0Xy0JkuzqDwgYNB72415GJN98bsaqrc
+TQqA0ofTzlIDYGjTAJUIcf2FwzHNtYca/EOltrpAjUcvuMUHzkaQXx4w6YZRPPvn
+bLBicAOYQJu5DpdNtoFdhYtWXDOzPqHEL9xORb5/pFOjudi9GHxB7PjxO8Iszh8g
+LRbHihctak4C7a4U4jwF7VhQaEHoG4Od7vFIIIdkdZxJyn8xL2X/1p2Ipn2wIgHe
+A/FmzS7hGcxpj3TnPui9oNS9TwiXd/gTdhzGLis9k/B4G/b/xy9ZjFdGY5MAb8hu
+XWF+8nga3kIrYQx3M6nKVxv6V/uhEfxi0W0LtIgXS7bfInJS8Cn+Vwftq7OxzpSq
+7X5VVuIcW83OvZIwoCmvRRMoHU0Oay6MMARVcNCvoGljOBskegLnfqkF7oIBI3yd
+Su8Wj4Ll48gOTpvQWGadOufzaGgNV/SgJrCE+mFgOzynqhVnelzcypoY/MOpvv/1
+pVifddSTCPgj/W4lBSO24in1dNeBAoHBANMTVXD/nZHAn24LK9y3h5QwVk0BDdxI
+2zl97EW46GV2HGwEJfRC0JuYqerERQXpb34UkXbVOiNQ5nfTeH0N67jyv7gUYeGU
+8hv3zGebeyzqxgb8tpyswE++LknX62pYSxa1NtJoBkBpbTpxPuwNrECyFM4JPmSo
+jtx3rca0b3xpqyJaBvqMtzfC7b1AFJiDI1DNDUlLSHDFV38PAa5capgIGVbMAofY
+1Rd3AGeeTY2lpYTXMXinyj2CDdLFSDO22QKBwQD7enZA1tgIdO/iWdfaiiQI11f7
+xfzJIdHiFEjx1FodgAYnY65OiUBlkQS8sB8eNOGW+lmQnZZCF7nEq6iNOz38tKWf
+mgRjwNlPmXDD39ooIXZLxtaFNk1986KLQt8A1kGNSBjydch79jMTyE6RITtK2Lnm
+C9Zhx3B9eKmHSpAZhzT6345W3JIOsBNgkHpSxjfRppNxABrd5KtdudgrFjxZy18U
+BPdtqwbxg0uSsmEAc9F+L9TgKG0LH7l0LeF+6mkCgcEAmE98OSUK09EWenbvOL7q
+w6E5tSlMkie0ocDfDNTIRea7zaoUpTTNiWnZOwJT+FchT+6RpRlqcW+ATvk3Ga5A
+6d2pQLDcjMZJCqt+QUkt0hS7vvD+6QGzaBeJGVoIk12RGZq8K4pK8JHi8ugjCn03
+Thvy7VY4QrRrGmX17MvpIvKxPgGOxZ9i2ob7vLOP6RnAEx9UNg5wAIg2ggYXJXWk
+qX42oq5mKRbrdZo2nY7a0Zq1XK1YEoOpaUb+qJgZaM/JAoHBAM0PTt4QUpiSwgkQ
+ubK6cifDcTscdsSLj1mKsPCA9/qWKm50Ge5wfNJVLkeuVbGL7WfvPJlv5tZ+Aj0c
+vJRtel5V77f1Hx84YftGY21VW87deljQCp0VapsJz8E/BhjonQtXfwA2iwSJ/Zxj
++azeLDsb/npXrLiOqGunuJVZd6dZWRo4sRijQ3Y2nZZgOV7Fwz5xVkkOjNnjXNlQ
+cbSwrQWLkDwC0L/cdgz5wuYcDn0P9AOxfSRL0p7/f3n876NOAQKBwQDABFISO+aj
+ChqV1617l69oTu44TojDRQXVvV1pcNMgkM3T2cNJ/4TdNsCga3MR8MtVa+IRdnyj
+Sn6crA/JqoUulfDMByCyH1Qs6CCmmKzhROzgAOuqIUi7RUU5bmYMkSkyJYP5xjTR
+G7KsSe8Axhni1nJQ+Kz/LJA1DxzsNf7eOmUSoD69lMUpld0NDk2UYf/DaAFqiTwD
+/j4xgDowMZsBDzAwl0j+5/qy2gLhN8oYNKP4TeisG6C74l1zP32BedY=
+-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/client-template.txt b/tests/certs/client-template.txt
new file mode 100644
index 0000000..092f367
--- /dev/null
+++ b/tests/certs/client-template.txt
@@ -0,0 +1,23 @@
+# Template file to generate server-cert.pem for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+organization = "GNU"
+unit = "Wget"
+# locality =
+state = "Sunshine"
+country = Freeland
+cn = "Wget"
+#uid = "wget"
+#dc = "name"
+#dc = "domain"
+expiration_days = -1
+#dns_name="127.0.0.1"
+#dns_name="::1"
+#dns_name="localhost"
+#dns_name = "WgetTestingServer"
+#ca
+
+# key options
+signing_key
+encryption_key
+tls_www_client
diff --git a/tests/certs/create-certs.sh b/tests/certs/create-certs.sh
new file mode 100755
index 0000000..8e5f409
--- /dev/null
+++ b/tests/certs/create-certs.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+#create key for CA self-signed certificate
+certtool --generate-privkey --outfile test-ca-key.pem --rsa
+
+#create CA self-signed certificate
+certtool --generate-self-signed --load-privkey test-ca-key.pem --template test-ca-template.txt --outfile test-ca-cert.pem
+
+# create server key
+certtool --generate-privkey --outfile server-key.pem --rsa
+
+# create server certificate
+certtool --generate-certificate --load-privkey server-key.pem --template server-template.txt --outfile server-cert.pem --load-ca-certificate test-ca-cert.pem --load-ca-privkey test-ca-key.pem
+
+# create expired server certificate
+certtool --generate-certificate --load-privkey server-key.pem --template expired-template.txt --outfile expired.pem --load-ca-certificate test-ca-cert.pem --load-ca-privkey test-ca-key.pem
+
+# create not activated server cert
+certtool --generate-certificate --load-privkey server-key.pem --template invalid-template.txt --outfile invalid.pem --load-ca-certificate test-ca-cert.pem --load-ca-privkey test-ca-key.pem
+
+# create client key
+certtool --generate-privkey --outfile client-key.pem --rsa
+
+# create client certificate
+certtool --generate-certificate --load-privkey client-key.pem --template client-template.txt --outfile client-cert.pem --load-ca-certificate test-ca-cert.pem --load-ca-privkey test-ca-key.pem
+
+# create CRL for the server certificate
+certtool --generate-crl --load-ca-privkey test-ca-key.pem --load-ca-certificate test-ca-cert.pem --load-certificate server-cert.pem --outfile revoked-crl.pem --template revoked-template.txt
diff --git a/tests/certs/expired-template.txt b/tests/certs/expired-template.txt
new file mode 100644
index 0000000..ffdef72
--- /dev/null
+++ b/tests/certs/expired-template.txt
@@ -0,0 +1,20 @@
+# Template file to generate expired.pem for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+organization = "GNU"
+unit = "Wget"
+# locality =
+state = "Sunshine"
+country = Freeland
+cn = "WgetTestingServer"
+dns_name = "WgetTestingServer"
+#uid = "wget"
+#dc = "name"
+#dc = "domain"
+activation_date = "2004-02-28 16:21:42"
+expiration_date = "2005-02-28 16:24:41"
+#ca
+
+# key options
+encryption_key
+tls_www_server
diff --git a/tests/certs/expired.pem b/tests/certs/expired.pem
new file mode 100644
index 0000000..4d62237
--- /dev/null
+++ b/tests/certs/expired.pem
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIEzTCCAzWgAwIBAgIMW+WWpBQQ7rn1JYOGMA0GCSqGSIb3DQEBCwUAMFIxDTAL
+BgNVBAMTBFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UE
+CBMIU3Vuc2hpbmUxETAPBgNVBAYTCEZyZWVsYW5kMB4XDTA0MDIyODE1MjE0MloX
+DTA1MDIyODE1MjQ0MVowXzEaMBgGA1UEAxMRV2dldFRlc3RpbmdTZXJ2ZXIxDTAL
+BgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UECBMIU3Vuc2hpbmUxETAP
+BgNVBAYTCEZyZWVsYW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA
+sNRnU60QudO+MD8QbYbKtD09cxTCqT7ozRAk5yt5ETwMlGLHBBsEcFDStuwdgXci
+ddoXXulLEvuHSobTCdR0GK0ifCxDRwddvE2heudxZtp5xKUHEb0LFob7boRt1Emu
+HeXLk9U81oUdDmEEyEW0xmKeaPI4cKJ/n4vczLIpH8+rQD/2AJwWSC+OFnUpt78p
+vQzfObKIakr81ckw0G49A6p9OFO7l28AUzwB7UUpnRKllC44FZ5LvsXdK5SQQ44r
+f4do1PjTflC9L9iccSdqq4z+FCL0rwK3Wpw+Ly5HeBGtsfMk88Eg00KeF9Fym5ho
+bcrky5EPFBLhRJ/k4BGnlGnxboFdKK8Gyna7ivAIhvXJ+9sbnfg7FPQ+MEnpqJzq
+i/ziJzC339ruJqYWted/tGlYbPm8M02MmIejGYnMp85v6tnhkToaDKeElAp7E6wC
++/fl3LQyW9vvWdSiVl29sAG1QlVq2IFfprRkRwy7SwsBPTtgIHwm7JyG2kYA/2vB
+AgMBAAGjgZUwgZIwDAYDVR0TAQH/BAIwADAcBgNVHREEFTATghFXZ2V0VGVzdGlu
+Z1NlcnZlcjATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMDByAAMB0G
+A1UdDgQWBBSxiQDjENGd3WwSbMM3SdgZqkgNajAfBgNVHSMEGDAWgBSeDlsijPvS
+jydT1dYKDMsNWQ9kmDANBgkqhkiG9w0BAQsFAAOCAYEAMHNHe6JsrZu3J/6Lw6wL
+wh0U7X+er01qPq4Csp4Zrk66eLWt9475TNXGYzDaOv8Yrczx3Lv+Liny73R4/HLi
+P5lMjXwfijFnj6cCzMziLbpxo11cHj7Km7nDequtiUFt80Ug3PEuYoMkY6HpNMHo
+rh5dgTOHjX1q8j/T6s/b46SKr4nEtdX9IdNvWzdxiLTR2EMH5mE0q3Pu+A25N0GG
+ij+L09Fh+qq3BlhqeRYvROO4LqE5VvbS7cpqXnxL/jSLm87CV2/0z7E1ApWSDDvK
+205ORvoE3oc+gOMbpMbKP4dPbXLves+iTQWabWjlMdleTD2eEE7aewH71r7Y8lEn
+LH/lpxIcteasOUNFxet9nBB26L4yVG29t4dhrwqd/lf8tvLV4h79DGJCESocu3Z/
+xkZIZZLWywGuDxrGSvJrcaA6BlSV/8oiGttyaP4XTQ+K4ZHFMCmC3jceXQFPkatq
+bqeIKABNlxsYVk9vDLiPL+8HbBoN0LtHb+KfORGUc9Qi
+-----END CERTIFICATE-----
diff --git a/tests/certs/interca.conf b/tests/certs/interca.conf
new file mode 100644
index 0000000..ec90858
--- /dev/null
+++ b/tests/certs/interca.conf
@@ -0,0 +1,64 @@
+[ ca ]
+default_ca = myca
+
+[ crl_ext ]
+issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+ [ myca ]
+ dir = /home/rincewind/Programming/wget/tests/certs
+ new_certs_dir = ./
+ unique_subject = no
+ certificate = interca.crt
+ database = certindex
+ private_key = interca.key
+ serial = certserial
+ default_days = 730
+ default_md = sha1
+ policy = myca_policy
+ x509_extensions = myca_extensions
+ crlnumber = crlnumber
+ default_crl_days = 730
+
+ [ myca_policy ]
+ commonName = supplied
+ stateOrProvinceName = supplied
+ countryName = optional
+ emailAddress = optional
+ organizationName = supplied
+ organizationalUnitName = optional
+
+ [ myca_extensions ]
+ basicConstraints = critical,CA:TRUE
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [ v3_ca ]
+ basicConstraints = critical,CA:TRUE,pathlen:0
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [alt_names]
+ DNS.0 = WgetTestingServer
+
+ [crl_section]
+ URI.0 = http://intertest.wgettest.org/Bogus.crl
+ URI.1 = http://intertest.wgettest.org/Bogus.crl
+
+ [ocsp_section]
+ caIssuers;URI.0 = http://intertest.wgettest.com/Bogus.crt
+ caIssuers;URI.1 = http://intertest.wgettest.com/Bogus.crt
+ OCSP;URI.0 = http://intertest.wgettest.com/ocsp/
+ OCSP;URI.1 = http://intertest.wgettest.com/ocsp/
diff --git a/tests/certs/interca.conf.in b/tests/certs/interca.conf.in
new file mode 100644
index 0000000..5bf28fd
--- /dev/null
+++ b/tests/certs/interca.conf.in
@@ -0,0 +1,64 @@
+[ ca ]
+default_ca = myca
+
+[ crl_ext ]
+issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+ [ myca ]
+ dir = @abs_srcdir@
+ new_certs_dir = ./
+ unique_subject = no
+ certificate = interca.crt
+ database = certindex
+ private_key = interca.key
+ serial = certserial
+ default_days = 730
+ default_md = sha1
+ policy = myca_policy
+ x509_extensions = myca_extensions
+ crlnumber = crlnumber
+ default_crl_days = 730
+
+ [ myca_policy ]
+ commonName = supplied
+ stateOrProvinceName = supplied
+ countryName = optional
+ emailAddress = optional
+ organizationName = supplied
+ organizationalUnitName = optional
+
+ [ myca_extensions ]
+ basicConstraints = critical,CA:TRUE
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [ v3_ca ]
+ basicConstraints = critical,CA:TRUE,pathlen:0
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [alt_names]
+ DNS.0 = WgetTestingServer
+
+ [crl_section]
+ URI.0 = http://intertest.wgettest.org/Bogus.crl
+ URI.1 = http://intertest.wgettest.org/Bogus.crl
+
+ [ocsp_section]
+ caIssuers;URI.0 = http://intertest.wgettest.com/Bogus.crt
+ caIssuers;URI.1 = http://intertest.wgettest.com/Bogus.crt
+ OCSP;URI.0 = http://intertest.wgettest.com/ocsp/
+ OCSP;URI.1 = http://intertest.wgettest.com/ocsp/
diff --git a/tests/certs/interca.crt b/tests/certs/interca.crt
new file mode 100644
index 0000000..6cbf0ce
--- /dev/null
+++ b/tests/certs/interca.crt
@@ -0,0 +1,41 @@
+-----BEGIN CERTIFICATE-----
+MIIHOTCCBSGgAwIBAgICESMwDQYJKoZIhvcNAQEFBQAwgZkxCzAJBgNVBAYTAlVT
+MQswCQYDVQQIDAJDQTERMA8GA1UEBwwIU2FuIEpvc2UxIDAeBgNVBAoMF1dnZXQg
+VGVzdGluZyBEZXBhcnRtZW50MRAwDgYDVQQLDAdUZXN0aW5nMRQwEgYDVQQDDAtX
+Z2V0VGVzdGluZzEgMB4GCSqGSIb3DQEJARYRYnVncy13Z2V0QGdudS5vcmcwHhcN
+MTcwNTA5MjEyNDMwWhcNMTkwNTA5MjEyNDMwWjBiMR4wHAYDVQQDDBVpY2Etd2dl
+dFRlc3RpbmdTZXJ2ZXIxCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzEYMBYGCSqG
+SIb3DQEJARYJaWNhdGVzdGVyMQwwCgYDVQQKDANJbnQwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQCpFc5lZraIIP8PVVbnwSrE11p2kjVgzDPwIJ/bDYGd
+60VEMc2ehVOMtj3lFbAUu4nb6j7IbAGB4bUqg4BUVfRodvd2f1WsfAfhf3AUnpI0
+c+ytK8HuXSfv3s44+/iQJftLE0kTADZf9iV/GxdEbhwQXBWku0xU/mxRH4zxDGwZ
+6gurQ96Md6DVUgnZsnRgrukQikr9C5e8cbKj7FHLZgq9E+NlGppmKi8qGTUXK17L
+cLBEP04glOnMuRQKB6SCIoX+VCiw33hWYfzIiXDKFqcj0liYANyLbM9TiFITGyTj
+Jr+Ne1Lac0HlNd8vNeP6IPBjViNZ8Iw3GYly1i8li4THzo8VpXBkJlwOLEYSq9Hr
+ZJ0QzUbyzVTLdhlCBhFme17Z9PxQyBr+2A0Lp+r/oKdr+KfMYZN3tzV3YozSw5d6
+4uV2Nz9pVCmLjR8UAV6cJqJILAxCQRVs4Qs7Ko3mGWKWi3T5xxvFy8gQrNHg7+IN
+g+0OhsIkfHTGsfW7WGukGhfmispi6sjrbNABRws8Vlr7JcVNFS4uu4H3cVCZ3Rde
+9IduNYs0gqss4SYMAxKAz0/M7OCY8Z9obh7zIdsG1A2S07cv9OMsjgPhLiO/i4HF
+RriQtYR5sWZKkmZgmS68aJuh/JLijlF/m2HLbI5gSlgwuSAtKUj2C68mTrXZJ3Xl
+IwIDAQABo4IBvzCCAbswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJNB884gq
+c/+HoMtp4GsuFr1O1eYwHwYDVR0jBBgwFoAUF+2TQ4+npgB11Oi2gg2IN37AbQgw
+CwYDVR0PBAQDAgGmMBMGA1UdJQQMMAoGCCsGAQUFBwMBMF0GA1UdHwRWMFQwKKAm
+oCSGImh0dHA6Ly90ZXN0LndnZXR0ZXN0Lm9yZy9Cb2d1cy5jcmwwKKAmoCSGImh0
+dHA6Ly90ZXN0LndnZXR0ZXN0Lm9yZy9Cb2d1cy5jcmwwHAYDVR0RBBUwE4IRV2dl
+dFRlc3RpbmdTZXJ2ZXIwgcgGCCsGAQUFBwEBBIG7MIG4MC4GCCsGAQUFBzAChiJo
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vQm9ndXMuY3J0MC4GCCsGAQUFBzAChiJo
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vQm9ndXMuY3J0MCoGCCsGAQUFBzABhh5o
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vb2NzcC8wKgYIKwYBBQUHMAGGHmh0dHA6
+Ly90ZXN0LndnZXR0ZXN0LmNvbS9vY3NwLzANBgkqhkiG9w0BAQUFAAOCAgEAqUa7
+cQLhjXCAHiMT9V5+hzB/ngriEKC456htspq9RC/FWnYXZ+au89FehFunjy5qzbSz
+q7N97rCD2drSwn4B6uBymmIxU6iARmtcsPrfhgXHdvhuVop6yuXspoaU7+g1WMXi
+t0RGBx0FahYlggt8a7HnMu3Qz6v8llDeA3U2BCe5ui7mWTauj3bFv/pLW3sigvm0
+Cr3aBHpkIzfHU5D6EC3fKNXQNQruXCCIcBayNiaX+FJcK18sU8tRewiWo/VvffHi
+J89/oHvZnXkteT/mEyeAbjkPkNrmNQTmG69t/x4NdxNDe5ZrEpbEPE/6S5z+YP1T
+bXG7OeES2/+K3Fprwv/oCoeQdv3bBh4IcRhhE7KpEGnJOLfV1a5aRpVCz/0C30xk
+x5GYo0a+AkPAW3zYTaKQXIKDJLpAU6QJ13WaEjVS1EYnUE2o3XEjyZPJVL1y7VSd
+1gdk5MEto6RsVH6EmJBBaSiiAj6d1GbkmNku73FiUvRGk39WbGN9qfjrMPvGhAcL
+0GrIg5oQLOf0f6sdIU3TJkARNSmgSoLV+RatIEgKI+/i6FxlRdBPoGopPJkrh/gS
+stf93A7rFKWmYNKZOMhWXxyv14lwWhBi0bW9QfzavJse047v9X3UvRki06uWXH2t
+H51/0uT9gISqZ1CKDpnez4wrjACuKmfI9D2p6J4=
+-----END CERTIFICATE-----
diff --git a/tests/certs/interca.key b/tests/certs/interca.key
new file mode 100644
index 0000000..7a27172
--- /dev/null
+++ b/tests/certs/interca.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKAIBAAKCAgEAqRXOZWa2iCD/D1VW58EqxNdadpI1YMwz8CCf2w2BnetFRDHN
+noVTjLY95RWwFLuJ2+o+yGwBgeG1KoOAVFX0aHb3dn9VrHwH4X9wFJ6SNHPsrSvB
+7l0n797OOPv4kCX7SxNJEwA2X/YlfxsXRG4cEFwVpLtMVP5sUR+M8QxsGeoLq0Pe
+jHeg1VIJ2bJ0YK7pEIpK/QuXvHGyo+xRy2YKvRPjZRqaZiovKhk1Fytey3CwRD9O
+IJTpzLkUCgekgiKF/lQosN94VmH8yIlwyhanI9JYmADci2zPU4hSExsk4ya/jXtS
+2nNB5TXfLzXj+iDwY1YjWfCMNxmJctYvJYuEx86PFaVwZCZcDixGEqvR62SdEM1G
+8s1Uy3YZQgYRZnte2fT8UMga/tgNC6fq/6Cna/inzGGTd7c1d2KM0sOXeuLldjc/
+aVQpi40fFAFenCaiSCwMQkEVbOELOyqN5hlilot0+ccbxcvIEKzR4O/iDYPtDobC
+JHx0xrH1u1hrpBoX5orKYurI62zQAUcLPFZa+yXFTRUuLruB93FQmd0XXvSHbjWL
+NIKrLOEmDAMSgM9PzOzgmPGfaG4e8yHbBtQNktO3L/TjLI4D4S4jv4uBxUa4kLWE
+ebFmSpJmYJkuvGibofyS4o5Rf5thy2yOYEpYMLkgLSlI9guvJk612Sd15SMCAwEA
+AQKCAgA4Wi4pmWvoPqcDIzwNjVGFvQhHUD89/ZCpzRW52eyDBzBUpAyVcnYABZTn
+Tq0am848XvuBrI1sDh9lBeK1ONh2IIAlHBcfn065FtHx7U9o7+HHbTf7C00OIsG0
+ODYFRMNVqB3ImV+F5/FjRVIh2li8ExSbjFjKUukiuFMu2ycEE/7Dm6EGS7BsqCTk
+SxeCSYkfnBeV8lEl2vbgrxgro9ycW46D2bPvrMt/SltpV2kGgI4ekMKnFTo+oshM
+93MadAsYUlAlcrUWhR3McBIJKDeYNriUIGVgimkmu94uw/MtSXK54oogiB1EGQpD
+H8DVUjkLwl+R0BvLGVW30i5wYulja2wJuYbY146+jxPkohpGQv7lChLnXN4HsJio
+W5TVqPii5EXKYm1LzuwIQba7EdvVLjA4I+b//qIADtEWA0sQZLiWLSk2/58WMjix
+pTbPhAy3xTTebCwz+mxMjZVQ3V2KHVvGUWq0x4rje/yF0mKIFt1CjUgTiUQ8DGSV
+MZhiqt6hV4ipo2/GUQLBzxiEr7H89vjsXnUBUb0BQCh6Ykg1P3hfoShxs62kEqtu
+b7huQhHL2ch3Cfb2gZ7S9UpO2TjnPpDyhyapJ/MmtTiHIhsts1DYEPLq4+n9FdC2
+FQYkRhR1OCtA+Tw1W4LvTu+57EgMMOdDJK1k+/j6+cV+9vRKEQKCAQEA19kMib0J
+lCTagMtVxPDfhWdAueREKTrEGBSyReWJHUqoR4AV34BxsL6fr+8BDpgs6GMTqSWk
+YTBz7KgyjSBQh2KgNwMAE89uIez4I8nTq5M92ZfqEZ98bn6ls3A4fwZeZ/wwrVd9
+OVeH54qrINV/wFyLRu9CIkyPXLia39cobotTZXu2d/tQaFG7JXkE4zj2dl6e0zyG
+Q5XE+GtAJYWpSPYd5N/J3eFEdoJDWFygM+WSHaYEE+iFbENyiWmDd3O/mHVqovub
+rFM/SMsWqfSK5MZVEpFSXPFIlRKLsZ2FiO6Dorei0NAp1VUriDELH0EVzoxErHhu
+S+2aN5WlYaFfnQKCAQEAyInb8T364UOHzUyz+IsDaxHOkGu8r1ZKDL5YJUg8wGMl
+LEUiyQJGf+RcSiI9tsH47XcptHpAIV745wedFzS2s6NWlAQCkdUKxIrtvA4bB7PV
+TJwy2uDCKtzzrSYul1rjpXoyIEt3Q4Ryd8gpa9eeRgWPkq48d6YOTcDw3C+i8VFo
+MyMzO8U3bj8vNR3/kE8id67XDWV7qfEtszhxVjYhgL7GyrP2ZeFsFNnrdp09tY0W
+aRGkzQw67Yq3tEDNCuNgtF/tNyr0l8DSjiGLqoIkh5wSH/MVz0crM4aPMaNvsTsb
+/+JQlrJF6EUVo1mwcqH87I2gGisQTP0rkxmhTsIbvwKCAQBKWRr2fsTD4IXbAy8B
+7S4w10X2Qegwg2t0F/zoEo5OJp8cMcRW/fkrNh3vDdZBXq1pRmdJRgv+5h+oDq+K
+6OyUFaa2DDSEnliDGwrF2Qkt+kO9pZQcieDkdn9A9ZCgQGNYUge6TX52t+26FYuo
+faHJcpcO0e7nvZNMDtJZ89SbbyZEuH47ibdCl5Rs7eh/E+nhD+qJPDnLIdV89ARe
+aFHNLelSIrt3z9YzM99aml0cQyE3US3qZZc/mWPkbRG5nYcLTrZyeVQ/4VTVEA84
+b2FAOAipoqDKHtovbvnrLiUG65EwBSzx3CHst6+M88eu9k46nRoyhjEHukn6h3M1
+084JAoIBAB7uBFpE8PjlbYCgn/Fpn3FYIb/sngF9EZa9lOLLLXOO1yDo2OCf1TfM
+hN96QIJ7kGUvx+LqKBH9j+4yImx92OAEBUp3A95yOWLu+pPSqSCa//786GsR12C9
+C2hdRzpY7luLaUfJ2+8x8mW/HYRgkSzDls1Myk658eLUK1IKltsZbzTT7Qb+9/mt
+DR7oLY6YZfyHnuuWB2jCpgXKYtClMK2mvwpsj0hPaFge9E4rGmVyCU7TRdPKWxxg
+FM1cYUOYpkWrte6YVXlCaDc7vUrjH7c6vyDmYSrDE0qzKkrBpmxzbXId+cgEXvvg
+C+JR5wEHMvdZMKRYl/8H3Tym61Y2YgkCggEBAI6yQmYwqL9ELqFfWxuqSQfiEoPA
+tENwVIhwhbGKje/FgNotgC+EjToQzBfZDVudOlnRyOTjgxfeZ5mtsdH9sJ278L7I
+mZmZezmAC1GPE4Ev8GZjpFYqcx0GYGy2pvlNea2Rt8Xnw2B+GDGPTf299djeRgS1
+Xnd0j9ltxTsmiOxF1AMYuMeg57jcUAAG0N81SrOASYc7P7DKpn8PGUim9szNccXy
+jcWEJb9WRLuGfrMTwf4gpb7mShod9A4B5TziF9FNxR5u7MMW8NItMRndqI+/2ylP
+e3MAV+ZhxtLs/sWOwcJk/rwhvRsbadzKhEiZPDYDDZ10oWWsCdeawp0VZEk=
+-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/invalid-template.txt b/tests/certs/invalid-template.txt
new file mode 100644
index 0000000..9a8d538
--- /dev/null
+++ b/tests/certs/invalid-template.txt
@@ -0,0 +1,20 @@
+# Template file to generate expired.pem for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+organization = "GNU"
+unit = "Wget"
+# locality =
+state = "Sunshine"
+country = Freeland
+cn = "WgetTestingServer"
+dns_name = "WgetTestingServer"
+#uid = "wget"
+#dc = "name"
+#dc = "domain"
+activation_date = "2035-02-28 16:21:42"
+expiration_date = "2005-02-28 16:24:41"
+#ca
+
+# key options
+encryption_key
+tls_www_server
diff --git a/tests/certs/invalid.pem b/tests/certs/invalid.pem
new file mode 100644
index 0000000..138f816
--- /dev/null
+++ b/tests/certs/invalid.pem
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIEzTCCAzWgAwIBAgIMW+WWpBUMPLiaHr/bMA0GCSqGSIb3DQEBCwUAMFIxDTAL
+BgNVBAMTBFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UE
+CBMIU3Vuc2hpbmUxETAPBgNVBAYTCEZyZWVsYW5kMB4XDTM1MDIyODE1MjE0MloX
+DTA1MDIyODE1MjQ0MVowXzEaMBgGA1UEAxMRV2dldFRlc3RpbmdTZXJ2ZXIxDTAL
+BgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UECBMIU3Vuc2hpbmUxETAP
+BgNVBAYTCEZyZWVsYW5kMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA
+sNRnU60QudO+MD8QbYbKtD09cxTCqT7ozRAk5yt5ETwMlGLHBBsEcFDStuwdgXci
+ddoXXulLEvuHSobTCdR0GK0ifCxDRwddvE2heudxZtp5xKUHEb0LFob7boRt1Emu
+HeXLk9U81oUdDmEEyEW0xmKeaPI4cKJ/n4vczLIpH8+rQD/2AJwWSC+OFnUpt78p
+vQzfObKIakr81ckw0G49A6p9OFO7l28AUzwB7UUpnRKllC44FZ5LvsXdK5SQQ44r
+f4do1PjTflC9L9iccSdqq4z+FCL0rwK3Wpw+Ly5HeBGtsfMk88Eg00KeF9Fym5ho
+bcrky5EPFBLhRJ/k4BGnlGnxboFdKK8Gyna7ivAIhvXJ+9sbnfg7FPQ+MEnpqJzq
+i/ziJzC339ruJqYWted/tGlYbPm8M02MmIejGYnMp85v6tnhkToaDKeElAp7E6wC
++/fl3LQyW9vvWdSiVl29sAG1QlVq2IFfprRkRwy7SwsBPTtgIHwm7JyG2kYA/2vB
+AgMBAAGjgZUwgZIwDAYDVR0TAQH/BAIwADAcBgNVHREEFTATghFXZ2V0VGVzdGlu
+Z1NlcnZlcjATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHQ8BAf8EBQMDByAAMB0G
+A1UdDgQWBBSxiQDjENGd3WwSbMM3SdgZqkgNajAfBgNVHSMEGDAWgBSeDlsijPvS
+jydT1dYKDMsNWQ9kmDANBgkqhkiG9w0BAQsFAAOCAYEABiAwqOoIbbA5q3IvEU3X
+qZ9WYemx1AVvUpJY1ft+hYqc6Z/XJfXzHb6xzN6duzpjC5/fER+FTqGk7PpIp17q
+9WAABo+LGM1fEDNvTJ4+v054Yi2qbV151T8xwv5xvMsI6VOx2+fMFBsKYrvoee1i
+NBlyUIoeBjWmauHouXslQY1BKxhNgH7qYVr+LN9cicJEJNgsVcjfGGXOvf8PHMNZ
+YxCEVZDhQ7F7Zqpy+84z8gaEhthZ19tdfuVEW40GX1mOVk6MAWTolKd5EK1CYOS6
+Dtth4yJivopbG4UwMAOQvHq6t1jXAubYXyrVoxMVw0BOCimiGuPWqHYR3rmTgQWS
+ABwsxcc9RtDbF+PcXpqLRSUwTZLjo39xvy2mIAdssE+dKqWPqgIk8+3InJJI/9Fq
+NZaY4p+olmPQUHw8GFrB/jrm8GjGzt0Z+IACcNEr+SD5BSmNKlCe70xyBVfdmwHZ
+o62bYy40zCW8+3lzLQoi+t5PYXIF/ioUJP67EBYkWGf7
+-----END CERTIFICATE-----
diff --git a/tests/certs/revoked-crl.pem b/tests/certs/revoked-crl.pem
new file mode 100644
index 0000000..5b928e2
--- /dev/null
+++ b/tests/certs/revoked-crl.pem
@@ -0,0 +1,16 @@
+-----BEGIN X509 CRL-----
+MIICejCB4wIBATANBgkqhkiG9w0BAQsFADBSMQ0wCwYDVQQDEwRXZ2V0MQ0wCwYD
+VQQLEwRXZ2V0MQwwCgYDVQQKEwNHTlUxETAPBgNVBAgTCFN1bnNoaW5lMREwDwYD
+VQQGEwhGcmVlbGFuZBcNMTgxMTA5MTQxNjA0WhgPOTk5OTEyMzEyMzU5NTlaMB8w
+HQIMW+WWpBMQnOLkjLG8Fw0xODExMDkxNDE2MDRaoDowODAfBgNVHSMEGDAWgBSe
+DlsijPvSjydT1dYKDMsNWQ9kmDAVBgNVHRQEDgIMW+WWpDAhS8Dvbk2wMA0GCSqG
+SIb3DQEBCwUAA4IBgQCNblPk62TVxX2dFmY5IqMGnrBNwIgMehX1q6p5MYEkRGne
+qJ76ZhvNPZMXh+gM5SHzp9zKicRiGQu2RL5lPOJ7FDnmoQrTXxAORFqJUGDa681p
+DMT5bkYkkwNT0+goyinDc+8Zw8DsXPYNO7bi4JcwDtBky5tSt/BPXjfT0Pi5I4Ki
+Gf/sdIIGCYd+s4IlHDtnBn1cz33TDZZ4efEYVKI2uqSihtchDbCLR/TouQB+f9G/
+FL67qeNdE7h+D5MEYyHLwlZ0yMl7Om1kDevKyODWL+wh2+QK8rkdC2YYkDqy20Gc
+jNqUHvGZDGnjh6iwoC2WcStlin45KNaSWEvU9WirYvqxLap4CRDfBXlcI8vuWUZl
+HCovBQBTeuNNVkMShyTWlK82qC3idWWmsGk0UdvUmkR/TOu+RACdeFhyqlu1RXwK
+TC9I7yBCVATs7NGdTCK98PGuqt08IKuqNhZ5qAEk2JR2iF4HoIeIC0hpjJEF3DWi
+PwayMhMirDuyo8yMTHY=
+-----END X509 CRL-----
diff --git a/tests/certs/revoked-template.txt b/tests/certs/revoked-template.txt
new file mode 100644
index 0000000..86cb377
--- /dev/null
+++ b/tests/certs/revoked-template.txt
@@ -0,0 +1,5 @@
+# Template file to generate revoked.crl for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+crl_next_update = -1
+
diff --git a/tests/certs/rootca.conf b/tests/certs/rootca.conf
new file mode 100644
index 0000000..e59c006
--- /dev/null
+++ b/tests/certs/rootca.conf
@@ -0,0 +1,64 @@
+[ ca ]
+default_ca = myca
+
+[ crl_ext ]
+issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+ [ myca ]
+ dir = /home/rincewind/Programming/wget/tests/certs
+ new_certs_dir = ./
+ unique_subject = no
+ certificate = $dir/test-ca-cert.pem
+ database = certindex
+ private_key = $dir/test-ca-key.pem
+ serial = certserial
+ default_days = 730
+ default_md = sha1
+ policy = myca_policy
+ x509_extensions = myca_extensions
+ crlnumber = crlnumber
+ default_crl_days = 730
+
+ [ myca_policy ]
+ commonName = supplied
+ stateOrProvinceName = supplied
+ countryName = optional
+ emailAddress = optional
+ organizationName = supplied
+ organizationalUnitName = optional
+
+ [ myca_extensions ]
+ basicConstraints = critical,CA:TRUE
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [ v3_ca ]
+ basicConstraints = critical,CA:TRUE,pathlen:0
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [alt_names]
+ DNS.0 = WgetTestingServer
+
+ [crl_section]
+ URI.0 = http://test.wgettest.org/Bogus.crl
+ URI.1 = http://test.wgettest.org/Bogus.crl
+
+ [ocsp_section]
+ caIssuers;URI.0 = http://test.wgettest.com/Bogus.crt
+ caIssuers;URI.1 = http://test.wgettest.com/Bogus.crt
+ OCSP;URI.0 = http://test.wgettest.com/ocsp/
+ OCSP;URI.1 = http://test.wgettest.com/ocsp/
diff --git a/tests/certs/rootca.conf.in b/tests/certs/rootca.conf.in
new file mode 100644
index 0000000..ab6e8af
--- /dev/null
+++ b/tests/certs/rootca.conf.in
@@ -0,0 +1,64 @@
+[ ca ]
+default_ca = myca
+
+[ crl_ext ]
+issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+ [ myca ]
+ dir = @abs_srcdir@
+ new_certs_dir = ./
+ unique_subject = no
+ certificate = $dir/test-ca-cert.pem
+ database = certindex
+ private_key = $dir/test-ca-key.pem
+ serial = certserial
+ default_days = 730
+ default_md = sha1
+ policy = myca_policy
+ x509_extensions = myca_extensions
+ crlnumber = crlnumber
+ default_crl_days = 730
+
+ [ myca_policy ]
+ commonName = supplied
+ stateOrProvinceName = supplied
+ countryName = optional
+ emailAddress = optional
+ organizationName = supplied
+ organizationalUnitName = optional
+
+ [ myca_extensions ]
+ basicConstraints = critical,CA:TRUE
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [ v3_ca ]
+ basicConstraints = critical,CA:TRUE,pathlen:0
+ keyUsage = critical,any
+ subjectKeyIdentifier = hash
+ authorityKeyIdentifier = keyid:always,issuer
+ keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
+ extendedKeyUsage = serverAuth
+ crlDistributionPoints = @crl_section
+ subjectAltName = @alt_names
+ authorityInfoAccess = @ocsp_section
+
+ [alt_names]
+ DNS.0 = WgetTestingServer
+
+ [crl_section]
+ URI.0 = http://test.wgettest.org/Bogus.crl
+ URI.1 = http://test.wgettest.org/Bogus.crl
+
+ [ocsp_section]
+ caIssuers;URI.0 = http://test.wgettest.com/Bogus.crt
+ caIssuers;URI.1 = http://test.wgettest.com/Bogus.crt
+ OCSP;URI.0 = http://test.wgettest.com/ocsp/
+ OCSP;URI.1 = http://test.wgettest.com/ocsp/
diff --git a/tests/certs/selfsigned.crt b/tests/certs/selfsigned.crt
new file mode 100644
index 0000000..41e24e9
--- /dev/null
+++ b/tests/certs/selfsigned.crt
@@ -0,0 +1,33 @@
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgIJANAKYgHn6Nk9MA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNV
+BAYTAlVTMQswCQYDVQQIDAJDQTEVMBMGA1UEBwwMTXlzdGVyeSBTcG90MQwwCgYD
+VQQKDANEaXMxGjAYBgNVBAMMEVdnZXRUZXN0aW5nU2VydmVyMRUwEwYJKoZIhvcN
+AQkBFgZ0ZXN0ZXIwHhcNMTcwNTA5MjI0OTQ0WhcNMTgwNTA5MjI0OTQ0WjByMQsw
+CQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExFTATBgNVBAcMDE15c3RlcnkgU3BvdDEM
+MAoGA1UECgwDRGlzMRowGAYDVQQDDBFXZ2V0VGVzdGluZ1NlcnZlcjEVMBMGCSqG
+SIb3DQEJARYGdGVzdGVyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
+2Zc7ZtsoPrlnQLTfMTrfuH7ghL6OrNVPAGpHQ4N+ddJwkF52lQXbeo9JO+09HF7s
+VFnxTG2+0Ld98kcvY3Ylco1Sxl18Bdjzv13sIJtgh7HyuRJ6Ryq2LZGWLKPBaGq1
+G2bBO4nUmsJLjj/1KqKxjk38iJ3Sf02nh8MhRGr8OHFSTMf9pPKW6hibXbsMUVyQ
+2u2RUXbvEtR1rkInWAVhEo97Row0+Z1+ZiqINOcBgpQl0sWh204dZqqi/y3uBbLQ
+3MkenioCb/udLdPRsileVhhwnrq6/0M/YhghMyI9Y+ajQ90h6tM10iyrILYzMCLx
+FB+3iReEJVX7Sy9qaqLJmTttxD7yqReCAxsrdDp1ZmrkQWLRAqBRdZo8RahkfdTu
+wa/fNuwuFFnMC8w/UgCWgDOEH85n4asRNlufYz+GXTsYybiH3klkAe9o09/Cm+zk
+pcX+zcHUkw6aZLC4VbKHNfyKDbWqTMzS66C2Ln4g9p8Zk0KJIvcmVG9uz/zjVIwM
+BWrbEawjMuejy+HUNcaV9CoaBFquwRJd4hlsE6FEryo3k1hEtDancobXl0XLsylU
+SMKMPr6PHjdxt+PdUhL79VNUJT2k35LqLKvtWZAuTOOcfjm0uXSDUC4GvW+onD7L
+n0XB/m4Gqm55EPLnDJgFYdEylvozglg+hSuoywab6NkCAwEAAaNQME4wHQYDVR0O
+BBYEFJF+Iyz8/pwx50cqFXckWIXoat/AMB8GA1UdIwQYMBaAFJF+Iyz8/pwx50cq
+FXckWIXoat/AMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAGRKLYCQ
+W+pdPOF0ojwrufYNbF2qryjJU7OzT7HbdrQOFZ+vcegi5rpZXOsFENTh0gdbI+M3
+FwxDIdyF7CvaRS1uMoTboqaqAzTy+gVVW/6d+UdOdHhJTpduhtQi3gtNvqzdkUpl
+01rX+Da6/jy4kPZfJap3mFPQLVvqVmcvJEcgHVOyB5/23RWS6TSEX35O3De9pnha
+XLqliFBQ/Sqj/2vZmkHBEXdNRfwfw1dHIcxmg25YTb6tyvrKURpXN6suDJEO+M6h
+9IVRv9qCNtvVHpo/xUxwjf7ZBHnGdcGl8AaAoIhRF7JTTGoRX7VAR+DLa5jHMAE2
+BmXzt+HHPMXZiQtzcUUcWc7+a740F8kM03CUMcz8sB4xzovGsZTLJ64afRFP1yaf
++1H7efbrogVjtpGzreWhJ8I5UXO/AoMjwUgyjjHb51KVRn6VrQfDHtw/hrIZVryI
+y8wOH0qzMK2JhB2oh1JvmjhtGxkWlqDztttfglYJENuMf8m/DxsmkSPksSnm8GkA
+El/GdocnZhl8vl8PcqzJ0nNn6EOTiZe+urGxG0r50ckVD+km/J7b56i+Gow46UH3
+Kkp69X9FHDfh3akaeU5chRfH99A/ehtdalD/W5Dy/hA9giA19foPUo6wKBE5unqz
+bfjzK+eNfIkER5JDL6hZQICdjiqa2+IzUnG8
+-----END CERTIFICATE-----
diff --git a/tests/certs/selfsigned.key b/tests/certs/selfsigned.key
new file mode 100644
index 0000000..d6d4a59
--- /dev/null
+++ b/tests/certs/selfsigned.key
@@ -0,0 +1,52 @@
+-----BEGIN PRIVATE KEY-----
+MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDZlztm2yg+uWdA
+tN8xOt+4fuCEvo6s1U8AakdDg3510nCQXnaVBdt6j0k77T0cXuxUWfFMbb7Qt33y
+Ry9jdiVyjVLGXXwF2PO/Xewgm2CHsfK5EnpHKrYtkZYso8FoarUbZsE7idSawkuO
+P/UqorGOTfyIndJ/TaeHwyFEavw4cVJMx/2k8pbqGJtduwxRXJDa7ZFRdu8S1HWu
+QidYBWESj3tGjDT5nX5mKog05wGClCXSxaHbTh1mqqL/Le4FstDcyR6eKgJv+50t
+09GyKV5WGHCeurr/Qz9iGCEzIj1j5qND3SHq0zXSLKsgtjMwIvEUH7eJF4QlVftL
+L2pqosmZO23EPvKpF4IDGyt0OnVmauRBYtECoFF1mjxFqGR91O7Br9827C4UWcwL
+zD9SAJaAM4QfzmfhqxE2W59jP4ZdOxjJuIfeSWQB72jT38Kb7OSlxf7NwdSTDppk
+sLhVsoc1/IoNtapMzNLroLYufiD2nxmTQoki9yZUb27P/ONUjAwFatsRrCMy56PL
+4dQ1xpX0KhoEWq7BEl3iGWwToUSvKjeTWES0NqdyhteXRcuzKVRIwow+vo8eN3G3
+491SEvv1U1QlPaTfkuosq+1ZkC5M45x+ObS5dINQLga9b6icPsufRcH+bgaqbnkQ
+8ucMmAVh0TKW+jOCWD6FK6jLBpvo2QIDAQABAoICABF+ZCs30XuBgnikUhFuL1Bw
++vIRM/1XRPu+j64w4zjry1sADT6b8vJelL+5qiEezJdXh9viMuYq6nhRGtE/TXFx
+RUdnerIpqCcpkPNqKo+eUeppPuV73Ju7SbybCdCwS5FBaKW1xh8PIe303GwqGmZb
+hMMjFSpg/ugeWw1aIJ8VFU3RAmaBjnqRseQORsY/z/GaCgXnrv7vj+qLrQgZnp1U
+Zc/dM+EhtWjXYI4ISInMCWJxuzqbhCed7m7frXRN1Rb7IHgM3pdMPm3RytktFEWN
+v3gzgRdGu9DSKdEnnpHqmBO7sp9jjb8xEi0WGPV0ybcZebMO7fPmfsajsEWUguql
+8kAwq6DkoQXPm8uMHoYaJhs14X2cJhITLccVWccCF7DO52y/KrL/k6QICnqTLtZq
+mdzwdOLCKXews0IeK3Ut/VEEi/+pMpAjdmxnSEv8lPKyLE8moOoxU/xdegUffn+j
+BwmtqFamdP817MzypPbfujR/muuM4+XNMTt8t81WvQtL7/7ZID3NUN4m+XgtJy++
+noi8etnANgT2jMATvzNIAAh3utbcP8mA7HGF7FT7tyqYkOd/1VxlY4kYl7d6Au1S
+75qmiAd8c+yBOS/y2E34HrrPuIcEdttyOhvhAiHJZuJ7akkAk0uLPJ25RK0qCYzl
+sO5rtWaqBfBCS3fts6gRAoIBAQDy0Aw0RrxZxB0XZHb9Xl/whUASFwxlSn2whVSV
+4eFL/bhpWhrKXsAwQ9HsI5q1vPOZIlzssVUnjAdN8tTiMiwGmgv33PJNnZBs8opy
+upTpbBpk97D847phzkJqCkuAmLaYEpOovVBBDN7xhgzu7ZcT+lLiSDCtQGIwgI+O
+TxhDJOLapLYs65ujVPSs4rO0DYh9cC4t4CwJv8JS7D3e1xnrnL2RA5RrrLgfphxU
+SQzrRyo3eXgjHC67KkeBBSi978IAE3NFBzyo945us/KxePXhIU0KlWmH0gHDNNcv
+0D6x4kod3UgDxep4aJnYZQKEfNI7xZo1zCkrFmwQE4s9HWSNAoIBAQDlaIKysObZ
+iYBXjw8fWhA2DImAsgS6C/Y/uBhS2EzDTtxaYV4VTTUNwijiwXY0F2sz/1kkk3WU
+LJ5bH2wjoRZEQu5xRvhdCJnullwxxVqvRj6O/W2SKkincbrpOukIzDCC/pvhlg0T
+P603bDz9J7xoCgIlfihG6adezS4eDtC8z4U+FnJgBUJcIZWTHx+CdSMMN/twmsc4
+VyGkgMa45EcC4JT53bysSkaKFKWh+2Pri3n+x/M403cBEW+zHh89UWtaAnn+UN6a
+S5TOahOj9JukJEZk8HB6R0u9rkfaZZ12uTzyBdP2T+ck8S2AUy5uvkzdAFfuojdv
+4nXlU1sJHRB9AoIBAE269G03x8wkz/tRGhZ6Q9RHk/82ia1Tb3E2/aENsoYVLxfq
+1HC8bGIHFAi4TSqo1oLLUVwkWNJULXJyrlvLG/TxE6vBe4AFVNrLui6INGuVQ83W
+zT3n2R6+XNx9dzYvrSR5rfNyx2JLsIM5GqLSRG8Mz8PIwGx2E/ja7xnrkCTOhiDg
+YcF3m1dqNvmxiT22p18grmfZP7/PN3I8VoIj8hRPFRB7SOQ/YqIfFyqUSCJ5obYo
+mKEEwKECI+nVsPk866oCkAAlFPIybdJaoPLXej8b3gHpWuM0A4RuQgT4cVmYy4lL
+8WXj0e/B7J4tl+S54MNpurhGJ1e30dhDqWtjIXECggEBAKVMNtB2swAQGY/9ntHi
+XUf0pKc8njdIIzkqdyxKepVIH3JoMhh7Nz0gp8Er0PYb4bznwt2d+ty3gar66zqI
++bhZ2eF5V8ABUJkfcnLSV1Nv8+eoJ+ln2k38nscrEXqrVlEtEDjtm6JBAZirvw5S
+MWltvLozOuZNubGPeiliV3mUtddU6TjS0Uv9Tv9hL50athQ5yk0K2X15Gt6jg4z5
+v0kNdYrNAQPLySP5WJdswkSYjWDNxi0uAdOdMrUHgU73ebizjB95OcxHpYNN37UF
+rZgKI0bcEM+qy6JzD4cILPu84XMqS95xGIX/2d9bEFvvdwbPFoz2CafurzB8bV4V
+uSkCggEAQRL390lx9uI4csLTTCUSa3Fl4BVPseqKlyadoxyzTMDyxAPxktw0vzht
+OyQdLssTVjL/0cHEBMnDawddk5L+1UF7izwhZinVtTGDvn5TC2elk+bJ1aWMQ5qg
+yUPdFbeLypmRlDUU8lJxppHcmrMY7/eAmOYAJTXn7Ygk030S6Hv1npSCtpyT1Stv
+CMtiE8bDaTv7qN2RJjPcvZ9xMB9GFcIdVpw8pf5jXQeci6kOR1FPW1j9DOSMAdf4
+0xPly00agfZxG/kkmL2rBrTGOJLYI8tgGpjPciJaSJ4NArFzxJbDG1DFw6GNKzBU
+qNaPYEH/kYsrfWzp/w1WMUpPdbl5iQ==
+-----END PRIVATE KEY-----
diff --git a/tests/certs/server-cert.pem b/tests/certs/server-cert.pem
new file mode 100644
index 0000000..0088749
--- /dev/null
+++ b/tests/certs/server-cert.pem
@@ -0,0 +1,29 @@
+-----BEGIN CERTIFICATE-----
+MIIE3TCCA0WgAwIBAgIMW+WWpBMQnOLkjLG8MA0GCSqGSIb3DQEBCwUAMFIxDTAL
+BgNVBAMTBFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UE
+CBMIU3Vuc2hpbmUxETAPBgNVBAYTCEZyZWVsYW5kMCAXDTE4MTEwOTE0MTYwNFoY
+Dzk5OTkxMjMxMjM1OTU5WjBSMQ0wCwYDVQQDEwRXZ2V0MQ0wCwYDVQQLEwRXZ2V0
+MQwwCgYDVQQKEwNHTlUxETAPBgNVBAgTCFN1bnNoaW5lMREwDwYDVQQGEwhGcmVl
+bGFuZDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALDUZ1OtELnTvjA/
+EG2GyrQ9PXMUwqk+6M0QJOcreRE8DJRixwQbBHBQ0rbsHYF3InXaF17pSxL7h0qG
+0wnUdBitInwsQ0cHXbxNoXrncWbaecSlBxG9CxaG+26EbdRJrh3ly5PVPNaFHQ5h
+BMhFtMZinmjyOHCif5+L3MyyKR/Pq0A/9gCcFkgvjhZ1Kbe/Kb0M3zmyiGpK/NXJ
+MNBuPQOqfThTu5dvAFM8Ae1FKZ0SpZQuOBWeS77F3SuUkEOOK3+HaNT4035QvS/Y
+nHEnaquM/hQi9K8Ct1qcPi8uR3gRrbHzJPPBINNCnhfRcpuYaG3K5MuRDxQS4USf
+5OARp5Rp8W6BXSivBsp2u4rwCIb1yfvbG534OxT0PjBJ6aic6ov84icwt9/a7iam
+FrXnf7RpWGz5vDNNjJiHoxmJzKfOb+rZ4ZE6GgynhJQKexOsAvv35dy0Mlvb71nU
+olZdvbABtUJVatiBX6a0ZEcMu0sLAT07YCB8JuychtpGAP9rwQIDAQABo4GwMIGt
+MAwGA1UdEwEB/wQCMAAwNwYDVR0RBDAwLoIJMTI3LjAuMC4xggM6OjGCCWxvY2Fs
+aG9zdIIRV2dldFRlc3RpbmdTZXJ2ZXIwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYD
+VR0PAQH/BAUDAwegADAdBgNVHQ4EFgQUsYkA4xDRnd1sEmzDN0nYGapIDWowHwYD
+VR0jBBgwFoAUng5bIoz70o8nU9XWCgzLDVkPZJgwDQYJKoZIhvcNAQELBQADggGB
+AKEexGBDmeETUgumcxjYszaDSX3YdAJiKvmzy/9KVn6riOvmjy5x9ilpdOZ0+JHn
+PQhgjkxFNQsq+G6j5RKQGBBklIz/JaUpCWZWCVbnPEMmdsEMWKwAvRRpSbxRt55w
+UChuprPu1A+RWOqggbkB74GaT8BmMacPIMDKo1frSzPmX1a9xaWgiYQiSatJpOOE
+ElcZd4sN1NyrIYNqIj0krxbQ64O8tMg2pPRtVFq1BQT1Kf5mAxusE+pilStGrGAk
+F9J+lDfwKxuIQ3p0uaR6isLGpEtdEe02+vm1zlYh4ER+7xGOuoXPTIS/foIngih+
+JoM8URUVgwyuhdsh7gPGAv8q5OlL3tmur0TZA6dWYMQKRRnw1oZGsw3/I/o4cfXD
+xHHCBTN+V6/A4ZeRKA8qMcLhfr3QrD7/BStLf4/Ylm3V02ZDniOCxBPxkvhSxwYG
+b/+9mPMDVrF5Ls8V+VwdMnPuDLIv7DfGncDvqJXF+iM/t79lrF2D8DfcIqBkbS3M
+JQ==
+-----END CERTIFICATE-----
diff --git a/tests/certs/server-key.pem b/tests/certs/server-key.pem
new file mode 100644
index 0000000..4c26c3a
--- /dev/null
+++ b/tests/certs/server-key.pem
@@ -0,0 +1,182 @@
+Public Key Info:
+ Public Key Algorithm: RSA
+ Key Security Level: High (3072 bits)
+
+modulus:
+ 00:b0:d4:67:53:ad:10:b9:d3:be:30:3f:10:6d:86:ca
+ b4:3d:3d:73:14:c2:a9:3e:e8:cd:10:24:e7:2b:79:11
+ 3c:0c:94:62:c7:04:1b:04:70:50:d2:b6:ec:1d:81:77
+ 22:75:da:17:5e:e9:4b:12:fb:87:4a:86:d3:09:d4:74
+ 18:ad:22:7c:2c:43:47:07:5d:bc:4d:a1:7a:e7:71:66
+ da:79:c4:a5:07:11:bd:0b:16:86:fb:6e:84:6d:d4:49
+ ae:1d:e5:cb:93:d5:3c:d6:85:1d:0e:61:04:c8:45:b4
+ c6:62:9e:68:f2:38:70:a2:7f:9f:8b:dc:cc:b2:29:1f
+ cf:ab:40:3f:f6:00:9c:16:48:2f:8e:16:75:29:b7:bf
+ 29:bd:0c:df:39:b2:88:6a:4a:fc:d5:c9:30:d0:6e:3d
+ 03:aa:7d:38:53:bb:97:6f:00:53:3c:01:ed:45:29:9d
+ 12:a5:94:2e:38:15:9e:4b:be:c5:dd:2b:94:90:43:8e
+ 2b:7f:87:68:d4:f8:d3:7e:50:bd:2f:d8:9c:71:27:6a
+ ab:8c:fe:14:22:f4:af:02:b7:5a:9c:3e:2f:2e:47:78
+ 11:ad:b1:f3:24:f3:c1:20:d3:42:9e:17:d1:72:9b:98
+ 68:6d:ca:e4:cb:91:0f:14:12:e1:44:9f:e4:e0:11:a7
+ 94:69:f1:6e:81:5d:28:af:06:ca:76:bb:8a:f0:08:86
+ f5:c9:fb:db:1b:9d:f8:3b:14:f4:3e:30:49:e9:a8:9c
+ ea:8b:fc:e2:27:30:b7:df:da:ee:26:a6:16:b5:e7:7f
+ b4:69:58:6c:f9:bc:33:4d:8c:98:87:a3:19:89:cc:a7
+ ce:6f:ea:d9:e1:91:3a:1a:0c:a7:84:94:0a:7b:13:ac
+ 02:fb:f7:e5:dc:b4:32:5b:db:ef:59:d4:a2:56:5d:bd
+ b0:01:b5:42:55:6a:d8:81:5f:a6:b4:64:47:0c:bb:4b
+ 0b:01:3d:3b:60:20:7c:26:ec:9c:86:da:46:00:ff:6b
+ c1:
+
+public exponent:
+ 01:00:01:
+
+private exponent:
+ 00:80:07:29:50:a2:2b:4c:00:0c:e1:ad:a7:5d:45:8c
+ 99:f7:04:f8:bf:7d:39:40:bd:19:4b:a9:0c:5e:a3:67
+ 61:0c:d2:9a:b9:f1:35:06:7f:b3:64:fc:df:f3:74:fb
+ 26:ce:21:3b:6e:92:86:b2:95:be:9c:ad:05:3b:46:c1
+ 4f:e4:7a:e5:60:be:cd:3c:7e:17:8a:35:72:61:03:f0
+ 2e:1a:9f:cf:c4:50:89:88:ef:a4:87:82:bb:0b:31:fa
+ ae:c0:22:d2:c4:94:4d:5a:1c:42:af:58:7b:37:ed:90
+ 37:5a:cb:ca:bc:25:35:17:d2:43:57:e6:63:a6:52:b4
+ 1f:8d:a4:15:2b:2d:c1:d5:38:2a:86:3b:a8:54:ae:1f
+ 10:3f:3a:84:9c:a7:b0:b1:14:dd:fe:83:8e:7e:3a:72
+ 9e:a6:df:c6:da:89:25:d9:4e:68:f5:37:87:ec:dd:76
+ 46:3b:f0:0f:8e:b7:c8:46:9b:37:73:2c:cc:81:af:07
+ cd:2d:cd:f5:c8:12:72:55:05:90:d1:bc:2c:bb:c3:5f
+ 60:dd:5f:cf:bc:ff:23:b5:ca:a3:86:29:08:6a:93:ce
+ d2:83:c6:cc:57:bc:18:5a:ce:48:b4:16:f3:55:d2:8a
+ ef:14:d5:14:1d:8b:55:b1:07:9f:f0:29:93:a1:66:85
+ 05:1c:1b:ff:35:ee:fe:c9:6c:40:68:5a:6a:f3:9a:60
+ 5c:7e:fa:f9:ed:24:05:c3:e7:ba:67:9f:f4:f3:a4:35
+ 3c:3c:cb:d9:d1:d0:02:ec:c7:40:fe:e9:33:62:4d:b2
+ 8f:51:1b:a7:da:d7:27:14:18:a8:10:ba:6c:f8:68:73
+ 22:38:34:a3:49:fe:e5:5b:7a:1f:97:87:0b:c4:11:84
+ 5c:19:2a:49:23:fa:e5:15:dc:a6:d2:fd:e4:36:4d:5d
+ ad:b5:fa:7b:ef:84:d6:9c:02:ce:98:e4:fe:12:b4:e3
+ 9d:09:c5:d1:52:93:fb:31:9f:cb:7a:38:96:2e:39:c5
+ e1:
+
+prime1:
+ 00:e4:26:db:d4:9f:04:12:81:66:e6:1c:4e:a3:af:69
+ f6:73:63:87:04:1f:52:53:87:0b:ea:73:7a:e5:b1:43
+ c2:3d:63:c6:f0:57:91:0d:5d:02:e4:02:48:fb:20:d6
+ 2b:38:a9:c1:9c:06:5a:a1:33:2b:c4:74:bb:b5:29:21
+ 15:85:fc:72:f6:e4:96:4b:40:c5:2b:98:c9:00:a7:09
+ dc:60:d9:4d:ae:f4:c1:62:6f:02:49:7a:72:29:e3:ee
+ 61:81:0a:5a:15:99:7d:08:f0:c1:cd:ae:9d:88:df:8f
+ e3:29:ba:18:eb:74:d3:fe:85:9b:71:9f:28:26:9b:d3
+ a1:2c:99:ab:ac:c5:d7:f0:b9:ae:eb:f9:fc:43:e0:04
+ e7:01:7e:82:48:08:45:ef:ed:05:1e:a1:7c:db:be:a3
+ ce:01:48:a9:fc:92:0e:d5:db:1b:81:f1:36:81:8b:85
+ a6:91:4d:e6:05:3b:38:1a:46:4b:4c:05:a0:c2:96:3f
+ dd:
+
+prime2:
+ 00:c6:69:dd:74:26:b1:c2:ee:6f:82:3d:31:0b:f9:f7
+ 40:fb:41:fa:79:d0:04:5c:53:fb:dd:22:2a:d6:b7:26
+ 7f:39:c9:20:a8:31:89:32:f7:56:04:84:7b:6a:c4:ea
+ 9b:8f:29:b3:28:4b:2f:bc:9e:56:0a:3b:b1:53:40:a0
+ 3e:4b:29:07:24:0f:20:05:62:96:c3:df:f5:62:15:dc
+ 0f:5e:53:70:3c:6d:b8:ef:41:b3:97:67:93:db:d1:1b
+ 83:d7:77:63:a4:78:23:95:07:36:0e:d3:50:3d:7a:fa
+ 76:41:72:94:49:ac:8a:ea:97:b2:4f:ff:f6:82:23:f5
+ 5d:3a:bb:f4:0b:06:31:b0:79:b9:5d:e6:29:d2:6f:5a
+ 6c:b6:cb:99:42:d6:74:02:2d:cc:13:03:48:ef:54:ea
+ f8:b7:93:ea:5a:76:11:0b:14:70:a2:08:c3:9c:45:f4
+ 46:cf:74:f4:64:28:4b:e2:a3:3f:35:bc:be:27:7b:4f
+ 35:
+
+coefficient:
+ 4a:53:30:b7:56:5a:d3:2b:40:f0:70:f7:32:54:9b:1a
+ b2:15:40:35:f0:62:65:21:7a:16:6a:2e:ae:81:7e:94
+ 19:58:19:57:d4:b5:c4:84:e1:65:5f:84:3b:50:e0:7f
+ 4e:01:97:74:9f:6c:ed:e4:fa:85:96:17:b3:c4:79:df
+ c4:20:bf:ea:9e:de:b5:aa:99:e4:2f:58:e0:0b:d3:aa
+ 86:e8:5c:1e:8a:8b:69:bb:9d:62:a4:32:63:48:53:cc
+ 19:32:62:2e:30:9a:9f:58:f2:3e:c1:ef:d2:50:a7:cd
+ 89:2b:98:3d:4e:6d:c1:4b:1d:f1:3f:fe:ff:87:fe:5c
+ 16:88:ca:dc:9e:1c:ae:2b:2e:b1:86:ff:90:ee:c1:29
+ d9:12:b3:a8:02:ac:2f:81:85:49:6e:4a:27:10:14:40
+ 27:46:e1:49:b4:31:3a:b5:84:24:45:63:f4:9c:60:a6
+ bc:0f:4a:6d:7a:87:22:e8:9c:bc:10:bb:ad:8d:e9:9a
+
+
+exp1:
+ 32:3d:dc:6b:16:19:6f:79:cf:8f:1c:ec:b4:5f:0c:96
+ 99:12:71:c9:16:9c:aa:88:32:b7:8e:76:a1:de:47:6d
+ 9e:d7:3a:17:f3:30:9e:20:bd:62:38:9e:99:ae:c1:7b
+ 03:1f:5e:e3:5d:02:d8:3c:cc:86:96:ae:3f:56:af:52
+ 6e:0f:09:c2:14:d4:83:fd:df:6d:9a:57:a9:2d:1f:9e
+ c8:35:12:46:54:df:c1:2d:70:f3:7d:63:66:96:2b:08
+ 8d:c2:19:d4:67:d8:80:ff:83:ae:27:a5:c9:5e:71:f1
+ 34:5f:26:dd:b2:fc:7c:30:2f:ea:f5:81:81:ff:0e:bb
+ 8f:76:c7:b7:64:5a:09:48:da:9c:5c:90:90:e1:e4:32
+ 7a:c1:c1:2e:db:a3:8b:12:46:ee:57:e1:87:02:94:4f
+ e9:38:77:36:87:73:7c:e4:a3:4a:1a:34:46:92:d2:fb
+ bb:43:cc:43:9a:a6:e0:22:5a:b2:83:0a:c3:cf:12:81
+
+
+exp2:
+ 00:a9:b9:93:7b:31:42:6c:6a:44:2e:d7:a3:66:08:4c
+ 8e:64:a0:1a:e0:2a:a6:20:48:a3:31:95:71:a9:bc:80
+ 0c:e2:e4:7e:b0:01:b7:c8:46:35:69:a5:de:61:05:d3
+ 5e:80:47:7e:7e:e0:5a:14:72:29:4d:95:a4:69:7f:e5
+ d3:83:bd:b3:e3:0f:a1:27:9a:1f:37:ad:13:9d:f4:ef
+ 0a:a2:78:a3:90:bd:97:2d:eb:38:f2:31:e3:14:6d:3a
+ a9:3c:1e:5f:b9:28:1f:df:f2:8c:36:80:62:aa:44:d1
+ 8d:69:0c:d7:76:72:47:5e:c7:a6:fb:b2:0c:2f:65:0d
+ 15:d4:11:45:80:4c:ab:22:b7:ed:6e:3a:5d:da:29:f0
+ e3:00:37:07:82:5a:2a:60:56:c6:b4:18:e2:42:00:95
+ 03:6f:1d:f3:a1:b0:4f:81:f7:d9:25:72:73:c9:f1:39
+ 35:7d:6f:21:43:b0:08:c1:f5:3d:33:fd:a1:77:ea:8e
+ 65:
+
+
+Public Key PIN:
+ pin-sha256:wBv5do0qlKwMzOKVUIb13Gdlv7BAhyWaX/jgaxcqy2U=
+Public Key ID:
+ sha256:c01bf9768d2a94ac0ccce2955086f5dc6765bfb04087259a5ff8e06b172acb65
+ sha1:b18900e310d19ddd6c126cc33749d819aa480d6a
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5AIBAAKCAYEAsNRnU60QudO+MD8QbYbKtD09cxTCqT7ozRAk5yt5ETwMlGLH
+BBsEcFDStuwdgXciddoXXulLEvuHSobTCdR0GK0ifCxDRwddvE2heudxZtp5xKUH
+Eb0LFob7boRt1EmuHeXLk9U81oUdDmEEyEW0xmKeaPI4cKJ/n4vczLIpH8+rQD/2
+AJwWSC+OFnUpt78pvQzfObKIakr81ckw0G49A6p9OFO7l28AUzwB7UUpnRKllC44
+FZ5LvsXdK5SQQ44rf4do1PjTflC9L9iccSdqq4z+FCL0rwK3Wpw+Ly5HeBGtsfMk
+88Eg00KeF9Fym5hobcrky5EPFBLhRJ/k4BGnlGnxboFdKK8Gyna7ivAIhvXJ+9sb
+nfg7FPQ+MEnpqJzqi/ziJzC339ruJqYWted/tGlYbPm8M02MmIejGYnMp85v6tnh
+kToaDKeElAp7E6wC+/fl3LQyW9vvWdSiVl29sAG1QlVq2IFfprRkRwy7SwsBPTtg
+IHwm7JyG2kYA/2vBAgMBAAECggGBAIAHKVCiK0wADOGtp11FjJn3BPi/fTlAvRlL
+qQxeo2dhDNKaufE1Bn+zZPzf83T7Js4hO26ShrKVvpytBTtGwU/keuVgvs08fheK
+NXJhA/AuGp/PxFCJiO+kh4K7CzH6rsAi0sSUTVocQq9YezftkDday8q8JTUX0kNX
+5mOmUrQfjaQVKy3B1TgqhjuoVK4fED86hJynsLEU3f6Djn46cp6m38baiSXZTmj1
+N4fs3XZGO/APjrfIRps3cyzMga8HzS3N9cgSclUFkNG8LLvDX2DdX8+8/yO1yqOG
+KQhqk87Sg8bMV7wYWs5ItBbzVdKK7xTVFB2LVbEHn/Apk6FmhQUcG/817v7JbEBo
+WmrzmmBcfvr57SQFw+e6Z5/086Q1PDzL2dHQAuzHQP7pM2JNso9RG6fa1ycUGKgQ
+umz4aHMiODSjSf7lW3ofl4cLxBGEXBkqSSP65RXcptL95DZNXa21+nvvhNacAs6Y
+5P4StOOdCcXRUpP7MZ/LejiWLjnF4QKBwQDkJtvUnwQSgWbmHE6jr2n2c2OHBB9S
+U4cL6nN65bFDwj1jxvBXkQ1dAuQCSPsg1is4qcGcBlqhMyvEdLu1KSEVhfxy9uSW
+S0DFK5jJAKcJ3GDZTa70wWJvAkl6cinj7mGBCloVmX0I8MHNrp2I34/jKboY63TT
+/oWbcZ8oJpvToSyZq6zF1/C5ruv5/EPgBOcBfoJICEXv7QUeoXzbvqPOAUip/JIO
+1dsbgfE2gYuFppFN5gU7OBpGS0wFoMKWP90CgcEAxmnddCaxwu5vgj0xC/n3QPtB
++nnQBFxT+90iKta3Jn85ySCoMYky91YEhHtqxOqbjymzKEsvvJ5WCjuxU0CgPksp
+ByQPIAVilsPf9WIV3A9eU3A8bbjvQbOXZ5Pb0RuD13djpHgjlQc2DtNQPXr6dkFy
+lEmsiuqXsk//9oIj9V06u/QLBjGwebld5inSb1pstsuZQtZ0Ai3MEwNI71Tq+LeT
+6lp2EQsUcKIIw5xF9EbPdPRkKEvioz81vL4ne081AoHAMj3caxYZb3nPjxzstF8M
+lpkScckWnKqIMreOdqHeR22e1zoX8zCeIL1iOJ6ZrsF7Ax9e410C2DzMhpauP1av
+Um4PCcIU1IP9322aV6ktH57INRJGVN/BLXDzfWNmlisIjcIZ1GfYgP+DrielyV5x
+8TRfJt2y/HwwL+r1gYH/DruPdse3ZFoJSNqcXJCQ4eQyesHBLtujixJG7lfhhwKU
+T+k4dzaHc3zko0oaNEaS0vu7Q8xDmqbgIlqygwrDzxKBAoHBAKm5k3sxQmxqRC7X
+o2YITI5koBrgKqYgSKMxlXGpvIAM4uR+sAG3yEY1aaXeYQXTXoBHfn7gWhRyKU2V
+pGl/5dODvbPjD6Enmh83rROd9O8KonijkL2XLes48jHjFG06qTweX7koH9/yjDaA
+YqpE0Y1pDNd2ckdex6b7sgwvZQ0V1BFFgEyrIrftbjpd2inw4wA3B4JaKmBWxrQY
+4kIAlQNvHfOhsE+B99klcnPJ8Tk1fW8hQ7AIwfU9M/2hd+qOZQKBwEpTMLdWWtMr
+QPBw9zJUmxqyFUA18GJlIXoWai6ugX6UGVgZV9S1xIThZV+EO1Dgf04Bl3SfbO3k
++oWWF7PEed/EIL/qnt61qpnkL1jgC9OqhuhcHoqLabudYqQyY0hTzBkyYi4wmp9Y
+8j7B79JQp82JK5g9Tm3BSx3xP/7/h/5cFojK3J4crisusYb/kO7BKdkSs6gCrC+B
+hUluSicQFEAnRuFJtDE6tYQkRWP0nGCmvA9KbXqHIuicvBC7rY3pmg==
+-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/server-template.txt b/tests/certs/server-template.txt
new file mode 100644
index 0000000..d214e67
--- /dev/null
+++ b/tests/certs/server-template.txt
@@ -0,0 +1,23 @@
+# Template file to generate server-cert.pem for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+organization = "GNU"
+unit = "Wget"
+# locality =
+state = "Sunshine"
+country = Freeland
+cn = "Wget"
+#uid = "wget"
+#dc = "name"
+#dc = "domain"
+expiration_days = -1
+dns_name="127.0.0.1"
+dns_name="::1"
+dns_name="localhost"
+dns_name = "WgetTestingServer"
+#ca
+
+# key options
+signing_key
+encryption_key
+tls_www_server
diff --git a/tests/certs/test-ca-cert.pem b/tests/certs/test-ca-cert.pem
new file mode 100644
index 0000000..ca04457
--- /dev/null
+++ b/tests/certs/test-ca-cert.pem
@@ -0,0 +1,26 @@
+-----BEGIN CERTIFICATE-----
+MIIEbzCCAtegAwIBAgIMW+WWpAgbVfvBnwynMA0GCSqGSIb3DQEBCwUAMFIxDTAL
+BgNVBAMTBFdnZXQxDTALBgNVBAsTBFdnZXQxDDAKBgNVBAoTA0dOVTERMA8GA1UE
+CBMIU3Vuc2hpbmUxETAPBgNVBAYTCEZyZWVsYW5kMCAXDTE4MTEwOTE0MTYwNFoY
+Dzk5OTkxMjMxMjM1OTU5WjBSMQ0wCwYDVQQDEwRXZ2V0MQ0wCwYDVQQLEwRXZ2V0
+MQwwCgYDVQQKEwNHTlUxETAPBgNVBAgTCFN1bnNoaW5lMREwDwYDVQQGEwhGcmVl
+bGFuZDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMUMCfmwSzYFSrbQ
+7C/CbcKVkirAWjFmSVCndYbb4Wbi4kr7+VHU02w6NFRXoQsB7dLwXlpKEuuuVPSc
+FgGUIy450JbQ9QCvqn0Ln+OR25tzAXPFH4975cNTWdv5ZNunh/K688VJ3xtQRZYv
+7YcqW3mrP81VZUKSsPGrlQN3GiwzCRRVPt5db3eG4t/oWfYlLxP3wnRGUaMuTj3g
+Cf1tQAtL0EBr9k2HwrPyIylJEI2u5iDA3XL66uAkWhj0jWyYbydE/BcGpsRnIjpl
+4igvFdEjiJb8dGL9pHVO7i/kAxoTYc45KbI3SUTMMNA1nAVMKrTCX2IbRUh7VrIs
+ohYTxXPOB5dy3lWU/sypdiHFyPt9PO24G3oeXjOQv7oE93bMbYmBisk50zt2csdU
+B89cqAKo7oMXjaZZ3F5ELIaLRsdh7R7qKHVYzqRLuLqitjEr+sY11znfzFpuje6l
+d9PzZHmsiSie8iS2apkqr1KLpkM3zry6+fv3BbjdhRAbyq3LRQIDAQABo0MwQTAP
+BgNVHRMBAf8EBTADAQH/MA8GA1UdDwEB/wQFAwMHBgAwHQYDVR0OBBYEFJ4OWyKM
++9KPJ1PV1goMyw1ZD2SYMA0GCSqGSIb3DQEBCwUAA4IBgQBZvCyOAWWB+/sAyK4y
+Lv34sv2DJijSYsxOWOEJEG8OurbWSl74cmI5YXIswvVI455nnZ4jPQUKZobPL8rO
+uGWrdhJItE7lN8YioswZhJk9VmCxHdk1G2+slHwVddfHIrvrYD7F5MijxAvvijJ8
+tdWprACJGrsoaKu/t129oumjfVy4/1sAVw6S+Jj+vr21Q/3SVnIv0gyTIWhu4cYA
+bzzcDu6+wo4TwjfL/EbgHwFvu0H9PuwgP71xQSFz8+KHvNwxIb65xCgfEVycmuFm
+oDyDMGUu95XG14QKeKOmQlqHd+nkWqcT+NvrcbDkEvnOgaQM3qX5YDokiOpGhY2q
+f7PBiTbYLqP4L5o5qGhWyD3iQvDfTPZKIQA6AX8ZR3T0fVdwUOyiMPkgfYSZ3ZYG
+1kH3TFQk0IkRp5H56ZOfeFd7p3lTpqYMYofYpbG1p763VFuZTIaZJFeCtFaA4ZoY
+lPut92lZl8Igo6iW/tB0JNama558N/T0BJ8QWYSwaRkjyJM=
+-----END CERTIFICATE-----
diff --git a/tests/certs/test-ca-key.pem b/tests/certs/test-ca-key.pem
new file mode 100644
index 0000000..1e64dd6
--- /dev/null
+++ b/tests/certs/test-ca-key.pem
@@ -0,0 +1,182 @@
+Public Key Info:
+ Public Key Algorithm: RSA
+ Key Security Level: High (3072 bits)
+
+modulus:
+ 00:c5:0c:09:f9:b0:4b:36:05:4a:b6:d0:ec:2f:c2:6d
+ c2:95:92:2a:c0:5a:31:66:49:50:a7:75:86:db:e1:66
+ e2:e2:4a:fb:f9:51:d4:d3:6c:3a:34:54:57:a1:0b:01
+ ed:d2:f0:5e:5a:4a:12:eb:ae:54:f4:9c:16:01:94:23
+ 2e:39:d0:96:d0:f5:00:af:aa:7d:0b:9f:e3:91:db:9b
+ 73:01:73:c5:1f:8f:7b:e5:c3:53:59:db:f9:64:db:a7
+ 87:f2:ba:f3:c5:49:df:1b:50:45:96:2f:ed:87:2a:5b
+ 79:ab:3f:cd:55:65:42:92:b0:f1:ab:95:03:77:1a:2c
+ 33:09:14:55:3e:de:5d:6f:77:86:e2:df:e8:59:f6:25
+ 2f:13:f7:c2:74:46:51:a3:2e:4e:3d:e0:09:fd:6d:40
+ 0b:4b:d0:40:6b:f6:4d:87:c2:b3:f2:23:29:49:10:8d
+ ae:e6:20:c0:dd:72:fa:ea:e0:24:5a:18:f4:8d:6c:98
+ 6f:27:44:fc:17:06:a6:c4:67:22:3a:65:e2:28:2f:15
+ d1:23:88:96:fc:74:62:fd:a4:75:4e:ee:2f:e4:03:1a
+ 13:61:ce:39:29:b2:37:49:44:cc:30:d0:35:9c:05:4c
+ 2a:b4:c2:5f:62:1b:45:48:7b:56:b2:2c:a2:16:13:c5
+ 73:ce:07:97:72:de:55:94:fe:cc:a9:76:21:c5:c8:fb
+ 7d:3c:ed:b8:1b:7a:1e:5e:33:90:bf:ba:04:f7:76:cc
+ 6d:89:81:8a:c9:39:d3:3b:76:72:c7:54:07:cf:5c:a8
+ 02:a8:ee:83:17:8d:a6:59:dc:5e:44:2c:86:8b:46:c7
+ 61:ed:1e:ea:28:75:58:ce:a4:4b:b8:ba:a2:b6:31:2b
+ fa:c6:35:d7:39:df:cc:5a:6e:8d:ee:a5:77:d3:f3:64
+ 79:ac:89:28:9e:f2:24:b6:6a:99:2a:af:52:8b:a6:43
+ 37:ce:bc:ba:f9:fb:f7:05:b8:dd:85:10:1b:ca:ad:cb
+ 45:
+
+public exponent:
+ 01:00:01:
+
+private exponent:
+ 5a:0b:d7:5f:28:46:26:88:a2:8d:0a:ca:74:44:d8:9d
+ cc:76:40:5d:28:9a:5c:90:f2:6f:a4:50:9d:98:d2:c8
+ a9:fa:f4:4d:0a:2d:44:f4:b7:60:84:8e:8b:04:99:bc
+ 11:e2:50:6b:d8:5f:ef:1d:fa:aa:d1:cd:68:a9:46:ae
+ 70:33:37:48:84:3d:ed:08:ef:1d:e9:d2:38:2c:70:4c
+ 4d:04:97:b7:85:7d:6c:11:27:bc:ef:be:77:6d:bd:90
+ 6d:c7:2b:71:24:01:f5:dc:68:00:6b:24:93:d9:32:76
+ 56:60:d0:b7:ce:8f:6e:b3:b7:ac:de:6a:f7:f9:98:eb
+ 35:a1:fa:16:c1:cd:57:0b:fb:33:20:79:70:eb:00:31
+ 14:61:eb:95:f1:30:8b:6e:b4:c8:a7:e2:48:d2:ad:2a
+ bc:59:8d:a7:08:a6:83:7c:e1:78:ac:c2:c8:25:ed:69
+ 58:b6:ed:0c:05:e8:4e:7f:61:7d:5e:dc:1a:e8:de:7b
+ 57:d3:ac:05:9b:44:f1:fb:3b:ff:86:15:ae:e4:19:cf
+ 82:cd:2d:ba:59:a8:2a:23:1a:a9:ad:30:55:c8:de:15
+ f4:16:cd:14:17:c3:8b:1b:93:dd:10:8a:6b:72:78:3e
+ fc:73:2e:2f:b9:a5:3c:5e:fc:4e:90:bd:3a:12:79:9d
+ 95:83:87:49:6d:c4:51:ab:d6:15:7f:d2:a5:6b:c0:76
+ d6:0b:75:5c:83:d1:63:14:33:ad:26:43:97:d5:7e:08
+ b8:80:b5:58:ff:b5:1d:eb:7a:1b:2c:e1:54:c9:86:37
+ e9:fc:df:64:83:47:38:02:4c:43:78:93:4f:84:33:35
+ a8:1d:3a:0a:17:63:79:fd:91:be:1c:8c:c6:d9:40:16
+ fa:13:4c:d3:6d:f3:3a:39:65:e9:97:12:5d:6e:eb:9d
+ 07:64:3a:b1:4d:47:9b:82:fb:ff:e1:92:96:9a:f7:a7
+ ec:5a:8a:91:e8:1d:87:21:db:7f:e9:23:53:a8:bc:61
+
+
+prime1:
+ 00:e6:1e:8d:ca:3e:ea:2f:43:8d:71:47:88:e1:5e:57
+ e3:6b:9d:61:45:d6:15:79:b1:ee:21:06:8d:da:66:b7
+ ba:de:b6:0d:68:4e:14:ec:97:30:ec:30:61:2f:ff:6a
+ 49:3d:33:3c:af:30:2e:a3:19:f1:7c:07:49:83:bf:34
+ b3:f8:46:e0:e8:3b:35:46:69:19:c8:05:c4:f5:b7:90
+ 97:01:80:bc:9a:ed:06:ca:a8:e7:c9:55:76:fa:b8:d7
+ b7:38:ec:c2:80:d4:19:77:db:d7:6f:f4:c9:31:21:2d
+ 57:3a:2e:cd:b3:15:bb:1c:07:ae:9f:a8:a8:57:14:8c
+ 2b:5d:2b:84:2f:62:c8:7b:80:04:59:59:08:02:fc:86
+ ef:4d:8f:5a:22:88:71:7b:83:4a:3b:31:11:e3:0d:ae
+ 53:9c:c1:41:d9:1c:66:d4:d9:8c:96:cb:96:ea:42:a0
+ ed:c5:d6:e7:56:c2:40:22:9a:da:8e:1f:87:c7:73:b8
+ 1d:
+
+prime2:
+ 00:db:35:49:d0:b4:9a:10:6c:5d:ce:cd:5b:1f:88:00
+ 8b:a0:5f:40:48:54:9d:a5:15:cc:59:bb:21:f7:11:9e
+ 86:35:1d:45:c6:aa:a1:ae:fe:38:bf:99:58:aa:84:71
+ d4:d8:2c:99:4f:54:1d:cc:e9:95:2b:3a:d8:7b:c4:3a
+ 96:1c:9a:e6:25:1d:1f:9c:60:a7:1d:aa:ff:e9:98:dc
+ 06:7a:97:87:bd:18:19:2a:c8:53:8e:c8:dd:b4:2d:af
+ a9:23:4e:da:82:64:e7:70:41:d6:45:f3:9d:36:2b:ff
+ bb:03:7b:c8:b2:e3:ac:f3:66:6e:f4:51:c0:f3:ca:d0
+ 22:a0:3c:46:af:5e:81:b6:96:51:71:d7:97:67:db:21
+ ca:57:fc:91:04:c0:64:e0:fb:73:f4:2b:b2:f1:c4:49
+ f9:d3:8f:17:74:f6:bc:bc:cc:13:89:6c:0f:0e:5a:45
+ 94:7a:60:0f:d3:ec:e1:ea:3e:2b:fa:af:d3:79:43:87
+ 49:
+
+coefficient:
+ 00:8d:93:8a:53:c5:d3:ad:67:1c:8e:ef:bb:27:db:2c
+ 99:83:7c:a8:9f:a1:a8:23:ce:0e:7e:44:31:03:fd:23
+ 8a:bc:1c:32:85:f3:3b:27:7a:66:5b:a2:38:13:26:4f
+ 11:ed:f4:c3:ce:ad:89:5e:db:ce:a1:2b:3a:69:f6:77
+ 18:57:97:27:d3:2c:cd:9d:21:69:3c:40:ca:e4:df:82
+ 62:d3:aa:88:e2:fe:e9:a8:ca:b3:c9:9d:b4:eb:9a:dc
+ 57:80:62:92:5b:94:76:10:a8:55:44:bf:4e:71:42:84
+ 21:04:f8:d5:ff:aa:85:0f:e9:43:3e:04:33:c2:ef:00
+ 46:e5:62:db:93:89:82:ff:fc:63:0e:09:6d:be:1b:23
+ 6f:52:b9:9e:d5:71:7d:5f:b0:e2:a6:9c:d1:e2:c7:5f
+ 1a:63:a5:9b:54:f7:ff:ae:ae:d0:fc:a1:56:4a:d2:1a
+ 7e:19:3c:a6:40:98:c0:fe:54:2b:ea:50:99:3e:88:f4
+
+
+exp1:
+ 00:ba:89:87:fc:aa:f5:60:ec:cc:8a:48:27:90:30:ce
+ e3:be:47:6c:23:95:40:01:4f:17:ae:53:c6:c7:84:be
+ 68:cf:c2:19:aa:34:a9:47:83:e3:97:82:3c:36:11:40
+ 92:2f:f7:09:b9:25:40:98:dc:1d:e1:a1:72:99:46:74
+ ad:72:93:da:1a:c6:6c:10:30:80:42:a1:52:a0:b0:75
+ 97:c3:13:1d:50:24:d5:7d:90:5f:9b:d8:18:c3:72:f5
+ 02:44:35:c0:11:78:5d:50:c8:b7:a1:bc:77:1e:c9:3b
+ 1c:db:40:37:64:75:38:20:a7:a5:89:2c:c9:91:15:49
+ ee:98:ee:fe:8e:fe:ef:6f:15:3d:f1:43:77:78:1c:46
+ 31:53:d8:e1:82:de:c1:c7:12:8d:28:e0:45:14:9d:f1
+ 73:3b:bd:78:e8:4a:da:9c:ad:e1:06:17:f0:b4:e2:df
+ da:fe:a5:8f:0f:c8:14:ff:38:31:f4:45:60:e6:70:4a
+ 8d:
+
+exp2:
+ 00:a4:06:90:d0:61:83:72:cc:93:b9:1e:02:94:6a:80
+ f5:f9:af:ac:7b:33:0d:af:2c:cb:77:4d:46:92:08:96
+ 15:18:83:69:e5:c9:62:28:7e:43:da:62:95:6d:2a:a3
+ be:bf:6f:47:dc:8b:35:ad:52:0f:73:84:99:de:aa:ab
+ a8:0d:89:7e:b2:c0:c3:19:91:5d:1b:1f:0c:55:30:33
+ 5b:89:b9:ff:30:e8:6a:54:90:07:ae:2c:f1:70:54:4b
+ 40:05:92:88:80:cf:9e:3a:6a:99:3a:48:9b:17:a0:fe
+ bf:62:50:ea:91:a9:39:8d:fb:d5:04:6e:74:32:38:4d
+ 5b:cb:88:ae:df:a4:98:ed:16:37:a5:36:cc:2d:43:54
+ 5a:83:52:12:f5:7a:3d:41:f8:06:00:eb:fd:ff:58:80
+ 7e:36:e6:b8:87:a5:e4:fe:64:ba:2d:b7:34:e0:e9:7d
+ 6d:27:d0:df:a7:15:76:ca:7f:71:0b:29:2b:d5:6e:49
+ 39:
+
+
+Public Key PIN:
+ pin-sha256:JJoOmvj7dwVzA9NdhmQGGH7pyIfyklw0jEoNpxXnfTk=
+Public Key ID:
+ sha256:249a0e9af8fb77057303d35d866406187ee9c887f2925c348c4a0da715e77d39
+ sha1:9e0e5b228cfbd28f2753d5d60a0ccb0d590f6498
+
+-----BEGIN RSA PRIVATE KEY-----
+MIIG5AIBAAKCAYEAxQwJ+bBLNgVKttDsL8JtwpWSKsBaMWZJUKd1htvhZuLiSvv5
+UdTTbDo0VFehCwHt0vBeWkoS665U9JwWAZQjLjnQltD1AK+qfQuf45Hbm3MBc8Uf
+j3vlw1NZ2/lk26eH8rrzxUnfG1BFli/thypbeas/zVVlQpKw8auVA3caLDMJFFU+
+3l1vd4bi3+hZ9iUvE/fCdEZRoy5OPeAJ/W1AC0vQQGv2TYfCs/IjKUkQja7mIMDd
+cvrq4CRaGPSNbJhvJ0T8FwamxGciOmXiKC8V0SOIlvx0Yv2kdU7uL+QDGhNhzjkp
+sjdJRMww0DWcBUwqtMJfYhtFSHtWsiyiFhPFc84Hl3LeVZT+zKl2IcXI+3087bgb
+eh5eM5C/ugT3dsxtiYGKyTnTO3Zyx1QHz1yoAqjugxeNplncXkQshotGx2HtHuoo
+dVjOpEu4uqK2MSv6xjXXOd/MWm6N7qV30/NkeayJKJ7yJLZqmSqvUoumQzfOvLr5
++/cFuN2FEBvKrctFAgMBAAECggGAWgvXXyhGJoiijQrKdETYncx2QF0omlyQ8m+k
+UJ2Y0sip+vRNCi1E9LdghI6LBJm8EeJQa9hf7x36qtHNaKlGrnAzN0iEPe0I7x3p
+0jgscExNBJe3hX1sESe87753bb2QbccrcSQB9dxoAGskk9kydlZg0LfOj26zt6ze
+avf5mOs1ofoWwc1XC/szIHlw6wAxFGHrlfEwi260yKfiSNKtKrxZjacIpoN84Xis
+wsgl7WlYtu0MBehOf2F9Xtwa6N57V9OsBZtE8fs7/4YVruQZz4LNLbpZqCojGqmt
+MFXI3hX0Fs0UF8OLG5PdEIprcng+/HMuL7mlPF78TpC9OhJ5nZWDh0ltxFGr1hV/
+0qVrwHbWC3Vcg9FjFDOtJkOX1X4IuIC1WP+1Het6GyzhVMmGN+n832SDRzgCTEN4
+k0+EMzWoHToKF2N5/ZG+HIzG2UAW+hNM023zOjll6ZcSXW7rnQdkOrFNR5uC+//h
+kpaa96fsWoqR6B2HIdt/6SNTqLxhAoHBAOYejco+6i9DjXFHiOFeV+NrnWFF1hV5
+se4hBo3aZre63rYNaE4U7Jcw7DBhL/9qST0zPK8wLqMZ8XwHSYO/NLP4RuDoOzVG
+aRnIBcT1t5CXAYC8mu0GyqjnyVV2+rjXtzjswoDUGXfb12/0yTEhLVc6Ls2zFbsc
+B66fqKhXFIwrXSuEL2LIe4AEWVkIAvyG702PWiKIcXuDSjsxEeMNrlOcwUHZHGbU
+2YyWy5bqQqDtxdbnVsJAIprajh+Hx3O4HQKBwQDbNUnQtJoQbF3OzVsfiACLoF9A
+SFSdpRXMWbsh9xGehjUdRcaqoa7+OL+ZWKqEcdTYLJlPVB3M6ZUrOth7xDqWHJrm
+JR0fnGCnHar/6ZjcBnqXh70YGSrIU47I3bQtr6kjTtqCZOdwQdZF8502K/+7A3vI
+suOs82Zu9FHA88rQIqA8Rq9egbaWUXHXl2fbIcpX/JEEwGTg+3P0K7LxxEn5048X
+dPa8vMwTiWwPDlpFlHpgD9Ps4eo+K/qv03lDh0kCgcEAuomH/Kr1YOzMikgnkDDO
+475HbCOVQAFPF65TxseEvmjPwhmqNKlHg+OXgjw2EUCSL/cJuSVAmNwd4aFymUZ0
+rXKT2hrGbBAwgEKhUqCwdZfDEx1QJNV9kF+b2BjDcvUCRDXAEXhdUMi3obx3Hsk7
+HNtAN2R1OCCnpYksyZEVSe6Y7v6O/u9vFT3xQ3d4HEYxU9jhgt7BxxKNKOBFFJ3x
+czu9eOhK2pyt4QYX8LTi39r+pY8PyBT/ODH0RWDmcEqNAoHBAKQGkNBhg3LMk7ke
+ApRqgPX5r6x7Mw2vLMt3TUaSCJYVGINp5cliKH5D2mKVbSqjvr9vR9yLNa1SD3OE
+md6qq6gNiX6ywMMZkV0bHwxVMDNbibn/MOhqVJAHrizxcFRLQAWSiIDPnjpqmTpI
+mxeg/r9iUOqRqTmN+9UEbnQyOE1by4iu36SY7RY3pTbMLUNUWoNSEvV6PUH4BgDr
+/f9YgH425riHpeT+ZLottzTg6X1tJ9DfpxV2yn9xCykr1W5JOQKBwACNk4pTxdOt
+ZxyO77sn2yyZg3yon6GoI84OfkQxA/0jirwcMoXzOyd6ZluiOBMmTxHt9MPOrYle
+286hKzpp9ncYV5cn0yzNnSFpPEDK5N+CYtOqiOL+6ajKs8mdtOua3FeAYpJblHYQ
+qFVEv05xQoQhBPjV/6qFD+lDPgQzwu8ARuVi25OJgv/8Yw4Jbb4bI29SuZ7VcX1f
+sOKmnNHix18aY6WbVPf/rq7Q/KFWStIafhk8pkCYwP5UK+pQmT6I9A==
+-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/test-ca-template.txt b/tests/certs/test-ca-template.txt
new file mode 100644
index 0000000..8f729d7
--- /dev/null
+++ b/tests/certs/test-ca-template.txt
@@ -0,0 +1,20 @@
+# Template file to generate server-cert.pem for certtool (GnuTLS)
+# see 'man certtool' for more options
+
+organization = "GNU"
+unit = "Wget"
+# locality =
+state = "Sunshine"
+country = Freeland
+cn = "Wget"
+#uid = "wget"
+#dc = "name"
+#dc = "domain"
+expiration_days = -1
+ca
+
+# key options
+signing_key
+encryption_key
+cert_signing_key
+crl_signing_key
diff --git a/tests/certs/user.crt b/tests/certs/user.crt
new file mode 100644
index 0000000..f1a6d8c
--- /dev/null
+++ b/tests/certs/user.crt
@@ -0,0 +1,148 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 4388 (0x1124)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: CN=ica-wgetTestingServer, ST=CA, C=US/emailAddress=icatester, O=Int
+ Validity
+ Not Before: May 9 21:30:44 2017 GMT
+ Not After : May 9 21:30:44 2019 GMT
+ Subject: CN=WgetTestingServer, ST=CA, C=US/emailAddress=usertester, O=Int
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (4096 bit)
+ Modulus:
+ 00:b9:ed:5a:89:c5:8e:20:a2:8d:c6:ee:0c:62:f6:
+ 9a:65:4d:da:3a:04:27:b8:23:cf:8c:1a:5f:1c:79:
+ 09:1a:e5:eb:57:82:f3:48:66:b2:74:bb:95:a4:00:
+ 87:5a:27:88:57:7e:ee:80:87:ec:d2:ca:89:86:53:
+ 0d:79:f6:9c:66:e0:19:ad:78:61:8b:20:9b:3e:da:
+ b4:42:3b:bd:b8:62:f1:0e:40:26:73:f2:e5:eb:6e:
+ 89:de:d7:26:63:11:cf:bc:30:8a:7d:ea:e1:a1:9c:
+ 9e:bc:e8:5c:8a:50:7f:c8:cf:8c:8c:09:e2:ae:1b:
+ 3f:18:1d:54:7e:6a:a8:ed:a9:04:9e:fc:fc:48:47:
+ a7:d5:a3:de:f3:ac:63:4f:40:ee:27:de:02:0d:f8:
+ 6c:fb:98:dc:73:f1:c6:bc:48:7f:fb:f4:3c:8f:7a:
+ 57:7d:ac:76:51:d7:8a:c7:7b:81:65:37:ed:cb:99:
+ f2:c8:6b:8d:88:10:9f:ea:e1:23:58:14:40:0a:bf:
+ 67:f7:8b:e9:cf:56:dd:f8:5c:2e:35:86:a7:fb:20:
+ e0:8f:3c:bb:20:f6:c3:c3:e9:9d:91:67:15:65:50:
+ ba:d9:6a:75:1e:93:a2:cd:66:ed:d0:58:bf:bd:1a:
+ 7f:ed:de:25:ff:03:fa:82:ab:41:52:34:8c:3d:6b:
+ ae:9b:6a:3e:05:2b:3f:87:88:0d:8c:a4:04:0a:cc:
+ b1:f6:0c:02:3b:0c:98:47:6c:1f:a4:0e:d3:ce:ef:
+ 5f:e8:e0:23:64:84:04:64:ad:d0:18:44:b0:93:7c:
+ 43:f5:5a:2f:8d:d6:43:ed:fa:a1:e8:da:42:e2:cb:
+ 56:c5:28:e7:c6:1c:b0:04:3b:23:57:76:7d:20:b4:
+ 30:b1:9c:69:54:7c:45:db:1b:7f:8e:83:a9:89:7c:
+ 59:32:30:9b:70:7e:bc:b3:33:96:89:33:c9:6c:fe:
+ 79:b9:06:ed:6b:e5:70:65:9f:ad:35:e0:13:0c:27:
+ 17:4b:70:67:e3:95:f3:a0:90:b6:fb:06:4a:33:21:
+ 4f:7b:c4:ba:a2:b3:47:bd:cb:3d:88:3e:46:31:27:
+ e3:83:f8:8f:25:54:83:a9:63:a3:1b:33:82:7c:ea:
+ 78:2d:60:10:fe:54:a8:d5:cf:a1:c4:e6:8b:0e:a5:
+ 98:5d:f7:1d:6c:36:35:58:72:9a:81:06:a7:ed:7d:
+ 3a:ae:99:62:4f:af:d2:88:c9:ad:32:b0:55:aa:ce:
+ ee:0e:5d:70:2a:84:a8:ef:66:a5:a4:3c:c4:f1:96:
+ e7:e4:05:7c:8d:c1:a5:ac:7f:54:3c:bd:b3:7e:1d:
+ 31:ad:d5:c2:73:60:db:23:c6:29:9b:d3:f9:4f:d6:
+ 7d:f7:ed
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Subject Key Identifier:
+ 6F:00:AE:EF:A0:15:4C:5C:1E:A7:B4:6C:8F:5F:1F:DD:EE:C6:6C:11
+ X509v3 Authority Key Identifier:
+ keyid:24:D0:7C:F3:88:2A:73:FF:87:A0:CB:69:E0:6B:2E:16:BD:4E:D5:E6
+
+ X509v3 Key Usage:
+ Digital Signature, Key Encipherment
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ X509v3 CRL Distribution Points:
+
+ Full Name:
+ URI:http://intertest.wgettest.org/Bogus.crl
+
+ Full Name:
+ URI:http://intertest.wgettest.org/Bogus.crl
+
+ X509v3 Subject Alternative Name:
+ DNS:WgetTestingServer
+ Authority Information Access:
+ CA Issuers - URI:http://intertest.wgettest.com/Bogus.crt
+ CA Issuers - URI:http://intertest.wgettest.com/Bogus.crt
+ OCSP - URI:http://intertest.wgettest.com/ocsp/
+ OCSP - URI:http://intertest.wgettest.com/ocsp/
+
+ Signature Algorithm: sha1WithRSAEncryption
+ 4b:e0:19:75:65:2d:0c:fe:d4:b6:3d:a1:02:8f:3d:89:a6:6b:
+ 12:c6:ee:e3:79:a0:b4:af:fa:15:97:be:35:f7:06:00:39:ba:
+ f9:30:e4:55:d9:98:fc:a5:b7:54:22:52:71:3a:35:d4:3b:9e:
+ 00:1e:5e:bb:8b:4f:21:bd:c7:df:7d:65:4c:cc:32:4e:ab:51:
+ 95:e2:59:b4:09:c2:78:8d:bf:ac:3b:d9:ca:9e:dc:39:ac:95:
+ d2:91:f9:28:31:cd:93:54:db:7a:f3:c8:a2:76:df:a0:b3:8a:
+ e1:00:31:a5:ba:f3:3e:3f:2e:b8:7b:cb:bb:a3:61:83:5f:6a:
+ ee:37:88:2f:89:a5:b6:79:ef:3c:c1:e7:cd:0b:5f:51:d4:de:
+ ab:85:97:f5:8c:8d:d6:59:1e:e6:db:a3:ab:1d:1d:5f:fd:ba:
+ 70:39:97:a1:0f:b4:6d:cc:1d:5d:49:41:9c:12:9e:b3:19:de:
+ 64:ab:83:2f:f3:bf:6f:26:14:e4:be:1a:50:9a:78:22:99:c0:
+ 39:35:ff:b1:45:ea:d3:8f:0d:ed:3d:c2:b0:77:71:26:12:4a:
+ f0:81:83:d7:c9:f2:0c:e8:c2:7b:9b:96:7b:06:ab:e5:ef:ac:
+ e6:34:58:ed:d3:9b:a3:b9:9e:7e:78:16:6e:ba:21:d3:48:01:
+ bc:3e:5f:6e:56:63:cc:4a:f4:e0:12:5e:8b:68:73:b7:3a:0e:
+ 1d:cd:44:15:6e:5c:f4:fd:8e:02:f2:a4:37:ce:08:da:5c:86:
+ 26:57:65:30:5a:13:29:08:ab:0f:f6:a6:ab:99:de:f0:c5:bf:
+ 15:a1:30:ea:23:ca:af:0a:8b:a4:58:8d:12:4f:52:27:fc:52:
+ dc:6d:9a:66:0f:43:c7:28:29:92:92:da:e7:9c:5c:fb:29:e6:
+ 31:06:81:a9:8c:51:86:d2:a2:08:bd:76:fb:61:4b:8e:49:48:
+ 9a:ca:a3:04:6c:dd:59:32:e1:41:f3:09:0b:9b:c0:60:64:34:
+ 87:21:cf:33:bf:17:14:c2:d5:05:0c:4d:21:8a:4d:5e:13:bf:
+ 32:c7:59:bb:48:de:82:15:8e:24:93:4c:c8:8e:e7:12:86:af:
+ 69:5c:5c:d8:a0:90:80:64:74:84:bb:ce:2e:e9:11:06:96:ed:
+ 52:3a:ba:1f:48:a2:13:14:d1:26:e8:a2:13:6d:2e:ec:ad:28:
+ f5:74:da:d7:7e:5e:eb:eb:4b:8d:3d:73:c1:ac:38:20:52:e6:
+ c5:72:fa:7e:e0:6c:fa:21:25:42:f8:fe:3a:1d:0a:4b:c1:ee:
+ 3b:36:61:b9:58:ec:09:4a:4d:4f:51:e5:7c:af:b4:1b:8d:28:
+ 45:e1:67:d1:2c:72:47:7d
+-----BEGIN CERTIFICATE-----
+MIIHHDCCBQSgAwIBAgICESQwDQYJKoZIhvcNAQEFBQAwYjEeMBwGA1UEAwwVaWNh
+LXdnZXRUZXN0aW5nU2VydmVyMQswCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMxGDAW
+BgkqhkiG9w0BCQEWCWljYXRlc3RlcjEMMAoGA1UECgwDSW50MB4XDTE3MDUwOTIx
+MzA0NFoXDTE5MDUwOTIxMzA0NFowXzEaMBgGA1UEAwwRV2dldFRlc3RpbmdTZXJ2
+ZXIxCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzEZMBcGCSqGSIb3DQEJARYKdXNl
+cnRlc3RlcjEMMAoGA1UECgwDSW50MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAue1aicWOIKKNxu4MYvaaZU3aOgQnuCPPjBpfHHkJGuXrV4LzSGaydLuV
+pACHWieIV37ugIfs0sqJhlMNefacZuAZrXhhiyCbPtq0Qju9uGLxDkAmc/Ll626J
+3tcmYxHPvDCKferhoZyevOhcilB/yM+MjAnirhs/GB1Ufmqo7akEnvz8SEen1aPe
+86xjT0DuJ94CDfhs+5jcc/HGvEh/+/Q8j3pXfax2UdeKx3uBZTfty5nyyGuNiBCf
+6uEjWBRACr9n94vpz1bd+FwuNYan+yDgjzy7IPbDw+mdkWcVZVC62Wp1HpOizWbt
+0Fi/vRp/7d4l/wP6gqtBUjSMPWuum2o+BSs/h4gNjKQECsyx9gwCOwyYR2wfpA7T
+zu9f6OAjZIQEZK3QGESwk3xD9VovjdZD7fqh6NpC4stWxSjnxhywBDsjV3Z9ILQw
+sZxpVHxF2xt/joOpiXxZMjCbcH68szOWiTPJbP55uQbta+VwZZ+tNeATDCcXS3Bn
+45XzoJC2+wZKMyFPe8S6orNHvcs9iD5GMSfjg/iPJVSDqWOjGzOCfOp4LWAQ/lSo
+1c+hxOaLDqWYXfcdbDY1WHKagQan7X06rpliT6/SiMmtMrBVqs7uDl1wKoSo72al
+pDzE8Zbn5AV8jcGlrH9UPL2zfh0xrdXCc2DbI8Ypm9P5T9Z99+0CAwEAAaOCAd0w
+ggHZMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFG8Aru+gFUxcHqe0bI9fH93u
+xmwRMB8GA1UdIwQYMBaAFCTQfPOIKnP/h6DLaeBrLha9TtXmMAsGA1UdDwQEAwIF
+oDATBgNVHSUEDDAKBggrBgEFBQcDATBnBgNVHR8EYDBeMC2gK6AphidodHRwOi8v
+aW50ZXJ0ZXN0LndnZXR0ZXN0Lm9yZy9Cb2d1cy5jcmwwLaAroCmGJ2h0dHA6Ly9p
+bnRlcnRlc3Qud2dldHRlc3Qub3JnL0JvZ3VzLmNybDAcBgNVHREEFTATghFXZ2V0
+VGVzdGluZ1NlcnZlcjCB3AYIKwYBBQUHAQEEgc8wgcwwMwYIKwYBBQUHMAKGJ2h0
+dHA6Ly9pbnRlcnRlc3Qud2dldHRlc3QuY29tL0JvZ3VzLmNydDAzBggrBgEFBQcw
+AoYnaHR0cDovL2ludGVydGVzdC53Z2V0dGVzdC5jb20vQm9ndXMuY3J0MC8GCCsG
+AQUFBzABhiNodHRwOi8vaW50ZXJ0ZXN0LndnZXR0ZXN0LmNvbS9vY3NwLzAvBggr
+BgEFBQcwAYYjaHR0cDovL2ludGVydGVzdC53Z2V0dGVzdC5jb20vb2NzcC8wDQYJ
+KoZIhvcNAQEFBQADggIBAEvgGXVlLQz+1LY9oQKPPYmmaxLG7uN5oLSv+hWXvjX3
+BgA5uvkw5FXZmPylt1QiUnE6NdQ7ngAeXruLTyG9x999ZUzMMk6rUZXiWbQJwniN
+v6w72cqe3DmsldKR+SgxzZNU23rzyKJ236CziuEAMaW68z4/Lrh7y7ujYYNfau43
+iC+JpbZ57zzB580LX1HU3quFl/WMjdZZHubbo6sdHV/9unA5l6EPtG3MHV1JQZwS
+nrMZ3mSrgy/zv28mFOS+GlCaeCKZwDk1/7FF6tOPDe09wrB3cSYSSvCBg9fJ8gzo
+wnublnsGq+XvrOY0WO3Tm6O5nn54Fm66IdNIAbw+X25WY8xK9OASXotoc7c6Dh3N
+RBVuXPT9jgLypDfOCNpchiZXZTBaEykIqw/2pquZ3vDFvxWhMOojyq8Ki6RYjRJP
+Uif8UtxtmmYPQ8coKZKS2uecXPsp5jEGgamMUYbSogi9dvthS45JSJrKowRs3Vky
+4UHzCQubwGBkNIchzzO/FxTC1QUMTSGKTV4TvzLHWbtI3oIVjiSTTMiO5xKGr2lc
+XNigkIBkdIS7zi7pEQaW7VI6uh9IohMU0SboohNtLuytKPV02td+XuvrS409c8Gs
+OCBS5sVy+n7gbPohJUL4/jodCkvB7js2YblY7AlKTU9R5XyvtBuNKEXhZ9Esckd9
+-----END CERTIFICATE-----
diff --git a/tests/certs/user.key b/tests/certs/user.key
new file mode 100644
index 0000000..5980ffe
--- /dev/null
+++ b/tests/certs/user.key
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIJKAIBAAKCAgEAue1aicWOIKKNxu4MYvaaZU3aOgQnuCPPjBpfHHkJGuXrV4Lz
+SGaydLuVpACHWieIV37ugIfs0sqJhlMNefacZuAZrXhhiyCbPtq0Qju9uGLxDkAm
+c/Ll626J3tcmYxHPvDCKferhoZyevOhcilB/yM+MjAnirhs/GB1Ufmqo7akEnvz8
+SEen1aPe86xjT0DuJ94CDfhs+5jcc/HGvEh/+/Q8j3pXfax2UdeKx3uBZTfty5ny
+yGuNiBCf6uEjWBRACr9n94vpz1bd+FwuNYan+yDgjzy7IPbDw+mdkWcVZVC62Wp1
+HpOizWbt0Fi/vRp/7d4l/wP6gqtBUjSMPWuum2o+BSs/h4gNjKQECsyx9gwCOwyY
+R2wfpA7Tzu9f6OAjZIQEZK3QGESwk3xD9VovjdZD7fqh6NpC4stWxSjnxhywBDsj
+V3Z9ILQwsZxpVHxF2xt/joOpiXxZMjCbcH68szOWiTPJbP55uQbta+VwZZ+tNeAT
+DCcXS3Bn45XzoJC2+wZKMyFPe8S6orNHvcs9iD5GMSfjg/iPJVSDqWOjGzOCfOp4
+LWAQ/lSo1c+hxOaLDqWYXfcdbDY1WHKagQan7X06rpliT6/SiMmtMrBVqs7uDl1w
+KoSo72alpDzE8Zbn5AV8jcGlrH9UPL2zfh0xrdXCc2DbI8Ypm9P5T9Z99+0CAwEA
+AQKCAgBzBQnwlx1wxP8OZK+W/VXQe9QX9gAYY1b/JkVWmO3wDPKFZcZZMOcPXgiZ
+t5YESNaIwkaLjwsL8C4ZwgFhRRXGcraP4Rv+9MH1pVjEbK7Whab4mOjw7AAeoHh8
+Of9OZHNtyV2zvf2te/WbiefNzTTwJq2c6HSqHsLuiR5/Qj6VH+1y6bCsil+iw8im
+WCvrmJB8a1Q8DkZlc1BWDelTC0rZtGNOo3HCllFwGfaJp7cJxgq+3NMb96VL2nUD
+2hmCYKypuXV4575R/Tw+a9BOXqpGqjUhh4GASAgdh8VpcSsETWf6Hmir7MtXZGiU
+boLXWrBvl/FLjMuJ0KYNU+K6EIaoIqb0PDbxfmo+nmQD/a/JSF3sYOUiqMJd34VC
+PYWpO+tDXSbtfHxJdP0/YBEKsvIU1kNYO8TE2zT8wl+AZJ2yz71p7VlQGN/24jnJ
+qTNY8HJ0TXgBZVBHsrgOlwTVWmuUcqIpVkrVO99iVO9C5EwqZey8CmGsJp+FfBpG
+pwVd99N7qi1q/VhBMERbeawDAjdKwU4IWFREB4ryTDw1+tVdCo3vXPYT+kRgPHW/
+mP1sG1kRkxYlrrGspx0o2wIHS/DUouxijJ0hC9UYoKINpvjSC+3Kijkl5cULtrO3
+Py6qeZPgoAK7iMtIVUwkxMZ3KNP7y7NoOIsP5L/dX+L311tG5QKCAQEA2woTdkZE
+un8wlGAsvBxSBzqD0l9otKQ297BLrqgnvIOqs02AF4sekaYdB2jIE/eMftZm7bjL
+4na4F7SGpKhMumJhaJUPa22fChcLHjWg082PoGHQM0Mf1Syyup+uLa2qFF+YAxHe
+aK9UO9Fi+cK5L0JeEY3ft0EkP1IELn+TfTnOCTeoMFy9K3ypaYW4td6aEIdhSMxf
+1am+5BB1Zu1NRsNiPWK3TOKeOqnFm0E3IhXLPjmd9RIDRDmvOXcLuRc3a5TC7zEG
+MuBD1deYFZSwJHIa/ykReW/fQRiqzYa+zZCpzwLx2Daz1RAqmibUEmCL9ldxh3vJ
+Dt8x3B6+UydYQwKCAQEA2Uzq+Y7sh1SNWKxlR94UDvBC6Cbz7vJWy5zcs8vV3YNn
+jNi+/tXdAWpmTxGgW8bxa8iwpfGNKQmMVLQDmoSRk9s5KsVomtLkEkTdtIRyrdjh
+NKjSmy0ECyfeGU/1KflHBpw+DRwVVxEhoFhum88FcDoihD9CKzPMr2d5RMmsPtCS
+WpldQKbhoIAEOWnXyIsEU090m9u9jKKfDU5lUGXD7Gl4bMhe2umPJN0Cj6MrOmhj
+kvc3V7bqlC3ikYbOI4r8oFT0sbo9XWl0caRmtqwvpPXQOQ6XLbFkLcNKRubMWSvs
+OcznU4o0PJiujO1Ue1sBz4/BwM1Dq4dYkur0qGpEDwKCAQBkuzaGDvyuc62onq4T
++EY08tEKnzvszxRERjwX31ce18JZ4QtGSIFPZAA3lxVkMVTYQ8tkCbcht40jwa6l
+7IwUrwey69ICipA4OK6xPuJuZTtm+3SfDoCGLZ8oOiUE9ref1PJ4fvA0XmUzeTC2
+QbmeJTxTgFZg1UFRKWuo4py2Wy4IiSL80rlgVV0nnQp8ARoC/e9cZjiwbvbNtU/4
+fKssHtCAAHThk9pGiirJIm2zbChivmaI/Lap2olduQSYIzgmbmxTSc1a+k3X+uUD
+D7UNnbgSnhVeLneSXUC3cf8vVBbzj5we3dFH675b0/11Uhcru70HHIMzJqusWisW
+3KI3AoIBAQCJmsDNyekUhcGAXqNAUGyJTTJBSrF8JfA6vhmwraq/vH+tXHAOdiWe
+yN8CwRm4JJIq/AqI+x611vsLhHcnuT1q0Q8xe5MTP+r3eq6eqqToXAe4zhOX+niu
+C9AEXXLV4qpMkFJnANquqQWPQZDBj+ZUvCuxbVGchA/hH3hWzBMMMA4N20KHN2Z3
+ublzFgh0UTwq+YzRSeSNk0l/Jp7Xu6nHIr8EvBn9LJvd7yq5BM3SDdrIbU6ZeBay
+QSBRoXkWXuQ9L69IgLRtW+NGN6JnmUAOiS8Tgp7Pa58Rr7JwlaTf7wWHUK9IYqNT
+oCggzAWMnAPYiaNbUWDB1VKMrsbBg5GXAoIBAHzDXgiVAXkvMKIrVk+QOj5/mV5s
+bggtYtUCrs5bEBHdBvykPdMWjLiVpNhHniIXCp8jc1Cvc1gJiFTo2oJIVvPHVQvr
+9xd0dEtcXYjusLrbzijd5KefelkQeZbo1EX3p4wFVOcYjuR4EHLHQN9xe5fb5Hne
+e97CtK/P9SLKOF9Lwy3oqjZkRk1sgY9DWzYMNj/VHhCFbF1rodlQJx9ThBXYat9L
+gOmUK1AJrCkQEPTbcL5GERL/pG821OeZ6hd94zBzk/gddU0Fgwp5E1IsIhxe1Wp5
+D+yzH9HJ7Hm0ileMcAi9dvvvGPV8CXIc/7rVtVwxmTKZBHiN3DpFOMgOFrE=
+-----END RSA PRIVATE KEY-----
diff --git a/tests/certs/wgethosts b/tests/certs/wgethosts
new file mode 100644
index 0000000..04b5215
--- /dev/null
+++ b/tests/certs/wgethosts
@@ -0,0 +1 @@
+WgetTestingServer localhost
diff --git a/tests/certs/wotca.pem b/tests/certs/wotca.pem
new file mode 100644
index 0000000..a968cd0
--- /dev/null
+++ b/tests/certs/wotca.pem
@@ -0,0 +1,78 @@
+-----BEGIN CERTIFICATE-----
+MIIHOTCCBSGgAwIBAgICESMwDQYJKoZIhvcNAQEFBQAwgZkxCzAJBgNVBAYTAlVT
+MQswCQYDVQQIDAJDQTERMA8GA1UEBwwIU2FuIEpvc2UxIDAeBgNVBAoMF1dnZXQg
+VGVzdGluZyBEZXBhcnRtZW50MRAwDgYDVQQLDAdUZXN0aW5nMRQwEgYDVQQDDAtX
+Z2V0VGVzdGluZzEgMB4GCSqGSIb3DQEJARYRYnVncy13Z2V0QGdudS5vcmcwHhcN
+MTcwNTA5MjEyNDMwWhcNMTkwNTA5MjEyNDMwWjBiMR4wHAYDVQQDDBVpY2Etd2dl
+dFRlc3RpbmdTZXJ2ZXIxCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzEYMBYGCSqG
+SIb3DQEJARYJaWNhdGVzdGVyMQwwCgYDVQQKDANJbnQwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQCpFc5lZraIIP8PVVbnwSrE11p2kjVgzDPwIJ/bDYGd
+60VEMc2ehVOMtj3lFbAUu4nb6j7IbAGB4bUqg4BUVfRodvd2f1WsfAfhf3AUnpI0
+c+ytK8HuXSfv3s44+/iQJftLE0kTADZf9iV/GxdEbhwQXBWku0xU/mxRH4zxDGwZ
+6gurQ96Md6DVUgnZsnRgrukQikr9C5e8cbKj7FHLZgq9E+NlGppmKi8qGTUXK17L
+cLBEP04glOnMuRQKB6SCIoX+VCiw33hWYfzIiXDKFqcj0liYANyLbM9TiFITGyTj
+Jr+Ne1Lac0HlNd8vNeP6IPBjViNZ8Iw3GYly1i8li4THzo8VpXBkJlwOLEYSq9Hr
+ZJ0QzUbyzVTLdhlCBhFme17Z9PxQyBr+2A0Lp+r/oKdr+KfMYZN3tzV3YozSw5d6
+4uV2Nz9pVCmLjR8UAV6cJqJILAxCQRVs4Qs7Ko3mGWKWi3T5xxvFy8gQrNHg7+IN
+g+0OhsIkfHTGsfW7WGukGhfmispi6sjrbNABRws8Vlr7JcVNFS4uu4H3cVCZ3Rde
+9IduNYs0gqss4SYMAxKAz0/M7OCY8Z9obh7zIdsG1A2S07cv9OMsjgPhLiO/i4HF
+RriQtYR5sWZKkmZgmS68aJuh/JLijlF/m2HLbI5gSlgwuSAtKUj2C68mTrXZJ3Xl
+IwIDAQABo4IBvzCCAbswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUJNB884gq
+c/+HoMtp4GsuFr1O1eYwHwYDVR0jBBgwFoAUF+2TQ4+npgB11Oi2gg2IN37AbQgw
+CwYDVR0PBAQDAgGmMBMGA1UdJQQMMAoGCCsGAQUFBwMBMF0GA1UdHwRWMFQwKKAm
+oCSGImh0dHA6Ly90ZXN0LndnZXR0ZXN0Lm9yZy9Cb2d1cy5jcmwwKKAmoCSGImh0
+dHA6Ly90ZXN0LndnZXR0ZXN0Lm9yZy9Cb2d1cy5jcmwwHAYDVR0RBBUwE4IRV2dl
+dFRlc3RpbmdTZXJ2ZXIwgcgGCCsGAQUFBwEBBIG7MIG4MC4GCCsGAQUFBzAChiJo
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vQm9ndXMuY3J0MC4GCCsGAQUFBzAChiJo
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vQm9ndXMuY3J0MCoGCCsGAQUFBzABhh5o
+dHRwOi8vdGVzdC53Z2V0dGVzdC5jb20vb2NzcC8wKgYIKwYBBQUHMAGGHmh0dHA6
+Ly90ZXN0LndnZXR0ZXN0LmNvbS9vY3NwLzANBgkqhkiG9w0BAQUFAAOCAgEAqUa7
+cQLhjXCAHiMT9V5+hzB/ngriEKC456htspq9RC/FWnYXZ+au89FehFunjy5qzbSz
+q7N97rCD2drSwn4B6uBymmIxU6iARmtcsPrfhgXHdvhuVop6yuXspoaU7+g1WMXi
+t0RGBx0FahYlggt8a7HnMu3Qz6v8llDeA3U2BCe5ui7mWTauj3bFv/pLW3sigvm0
+Cr3aBHpkIzfHU5D6EC3fKNXQNQruXCCIcBayNiaX+FJcK18sU8tRewiWo/VvffHi
+J89/oHvZnXkteT/mEyeAbjkPkNrmNQTmG69t/x4NdxNDe5ZrEpbEPE/6S5z+YP1T
+bXG7OeES2/+K3Fprwv/oCoeQdv3bBh4IcRhhE7KpEGnJOLfV1a5aRpVCz/0C30xk
+x5GYo0a+AkPAW3zYTaKQXIKDJLpAU6QJ13WaEjVS1EYnUE2o3XEjyZPJVL1y7VSd
+1gdk5MEto6RsVH6EmJBBaSiiAj6d1GbkmNku73FiUvRGk39WbGN9qfjrMPvGhAcL
+0GrIg5oQLOf0f6sdIU3TJkARNSmgSoLV+RatIEgKI+/i6FxlRdBPoGopPJkrh/gS
+stf93A7rFKWmYNKZOMhWXxyv14lwWhBi0bW9QfzavJse047v9X3UvRki06uWXH2t
+H51/0uT9gISqZ1CKDpnez4wrjACuKmfI9D2p6J4=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIGBzCCA++gAwIBAgIJAJlGYwAp0+gKMA0GCSqGSIb3DQEBCwUAMIGZMQswCQYD
+VQQGEwJVUzELMAkGA1UECAwCQ0ExETAPBgNVBAcMCFNhbiBKb3NlMSAwHgYDVQQK
+DBdXZ2V0IFRlc3RpbmcgRGVwYXJ0bWVudDEQMA4GA1UECwwHVGVzdGluZzEUMBIG
+A1UEAwwLV2dldFRlc3RpbmcxIDAeBgkqhkiG9w0BCQEWEWJ1Z3Mtd2dldEBnbnUu
+b3JnMB4XDTE3MDQwNjIxMDEyOFoXDTE4MDQwNjIxMDEyOFowgZkxCzAJBgNVBAYT
+AlVTMQswCQYDVQQIDAJDQTERMA8GA1UEBwwIU2FuIEpvc2UxIDAeBgNVBAoMF1dn
+ZXQgVGVzdGluZyBEZXBhcnRtZW50MRAwDgYDVQQLDAdUZXN0aW5nMRQwEgYDVQQD
+DAtXZ2V0VGVzdGluZzEgMB4GCSqGSIb3DQEJARYRYnVncy13Z2V0QGdudS5vcmcw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvHmnQlY58T/PcZeR3ntBp
+6YYELxmYTjrdiHLpa1HvDDkwYyVCaWxhi8R5mP/cUt7aZ0BrNMCVTy5/cEzl/w9R
+VqERKDB68ZU0ku2A4YmDFenlyyUuVZhn5reovUUlhWo8p+Ir+1vwGyDPM/IQKaUJ
+6tfDWVD7fgVzfpvDm8XDqKB6BvzLPk3n3K9mndv2KihTUnnJFMZOkSYaFStQ11Rz
+YwR7ZvAuISB99WZf2hzaYiovB9G0WMky81vpmvjbKWVYLlpV5Inzq2QiG4tFBEP+
+ebLc1H9PGd7vrgGE2cn78g1XXpR8nPUDYF4UGFs90ftPqNDHcHFENB7DrpB7wRIa
+5ZrpKyNbCGIKX+UnVR5Ra32mMM2pPiR95ZDNkqdsygLuHAsyaaj1+wvrmM81H2Jy
+V/kVcFqnf3+C1aX2+hu5OL7rIskEYG8HgWwWxE0NW7Q8zTrBR7D932hM/7f8Yojx
+SeqJP7vpGULeVzJF0CTksoWh+D1s+Q2b93DpoMW18VMTig2NFetQr3DdJmySed7a
+g694qgY5iDv1P/CWBSj75TDBrw3Ji6PJxWES+ox29frxrCWtAjEwVI5zJ5qIZW5n
++BYir/tVloMkYSmeby9eSmTLGENZrepBwuocpvJ1yQRosdzYG42MjfI2JhlTFWvw
+wdGCsFqsRcsfPTJqu801QQIDAQABo1AwTjAdBgNVHQ4EFgQUF+2TQ4+npgB11Oi2
+gg2IN37AbQgwHwYDVR0jBBgwFoAUF+2TQ4+npgB11Oi2gg2IN37AbQgwDAYDVR0T
+BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAewaQ/hmPbjNI7FFNM63M1qnWHK+t
+Zsm5qHWMk5WkcdavsqpexGDc3VxBYFzqqEjlCTseMgsNZ76FENZeNGNFtKScUHuR
+J6Fp+pqEZJ9AoQy8WbkDuFjsKs+En3cMvqy4QUqVOFrKg1PKJEWlqvonMs+apzvJ
+0bjj5Aj2w906XvpKYTnfR6QHJC5ZP5xTorJWLvAwWl0ZuqxQKT0fXKcPeAlE0c4b
+3eJ5jFXPIFkYt0fJcUnZp6QJv608/METl9x+rTYfRsD6kQGC+281C19PxBacTzxH
+fAjsesvP7t7pPlh+Chdd7w1QqFg4UUH9NfIkiq06UtIUoQHfCgT1FvXoFoPiRR5f
+5m67jGE8Sn04nnGhvHnN03kOuwK/VIniLuHdWw0nwLBWIEpzZPbIQQSezoJd7ViY
+2zBJQCtp1ewEDOXecBL+8CNIUXTiFoOxP/YMuLruoYB5dkLpIFbscHp3dZJMScoz
+XJQHh68KH0oRm+/FnK3MLxn56nbwoV4uhdIr5FgLglh7PUfUa2wavFjhi3MY50qD
+SsvoCmBny/N2KJK2tEBIGWbdYy1XBF/l8xaORdT/M4ILYV52Wf2AYy9NTYJxiB0V
+LwVGbG5plMbJiBFDOZcram4pQrG6k21t2Xv2lkVf1AvOlx4qKfUN04TGWXwu5dAP
+pnv5yEwOelBLq7Q=
+-----END CERTIFICATE-----
+
diff --git a/tests/unit-tests.c b/tests/unit-tests.c
new file mode 100644
index 0000000..f66e5e6
--- /dev/null
+++ b/tests/unit-tests.c
@@ -0,0 +1,108 @@
+/* Unit testing.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#include "wget.h"
+
+#include <stdio.h>
+#ifdef ENABLE_NLS
+# include <locale.h>
+#endif
+
+#include "unit-tests.h"
+
+extern const char *program_argstring;
+
+static int tests_run;
+
+static const char *
+all_tests(void)
+{
+#ifdef HAVE_METALINK
+ mu_run_test (test_find_key_value);
+ mu_run_test (test_find_key_values);
+ mu_run_test (test_has_key);
+#endif
+ mu_run_test (test_parse_content_disposition);
+ mu_run_test (test_parse_range_header);
+ mu_run_test (test_subdir_p);
+ mu_run_test (test_dir_matches_p);
+ mu_run_test (test_commands_sorted);
+ mu_run_test (test_cmd_spec_restrict_file_names);
+ mu_run_test (test_path_simplify);
+ mu_run_test (test_append_uri_pathel);
+ mu_run_test (test_are_urls_equal);
+ mu_run_test (test_is_robots_txt_url);
+#ifdef HAVE_HSTS
+ mu_run_test (test_hsts_new_entry);
+ mu_run_test (test_hsts_url_rewrite_superdomain);
+ mu_run_test (test_hsts_url_rewrite_congruent);
+ mu_run_test (test_hsts_read_database);
+#endif
+
+ return NULL;
+}
+
+extern const char *program_name; /* Needed by lib/error.c. */
+
+int
+main (int argc _GL_UNUSED, const char *argv[])
+{
+ const char *result;
+
+ printf ("[DEBUG] Testing...\n\n");
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ textdomain ("wget");
+#endif /* ENABLE_NLS */
+
+ program_name = argv[0];
+
+ result = all_tests();
+
+ if (result != NULL)
+ {
+ puts (result);
+ }
+ else
+ {
+ printf ("ALL TESTS PASSED\n");
+ }
+
+ printf ("Tests run: %d\n", tests_run);
+
+ return result != 0;
+}
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/tests/unit-tests.h b/tests/unit-tests.h
new file mode 100644
index 0000000..4a4d51d
--- /dev/null
+++ b/tests/unit-tests.h
@@ -0,0 +1,69 @@
+/* Unit testing declarations.
+ Copyright (C) 2005-2011, 2015, 2018-2020 Free Software Foundation,
+ Inc.
+
+This file is part of GNU Wget.
+
+GNU Wget 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.
+
+GNU Wget is distributed in the hope that 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 Wget. If not, see <http://www.gnu.org/licenses/>.
+
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
+
+#ifndef TEST_H
+#define TEST_H
+
+/* from MinUnit */
+#define mu_assert(message, test) do { if (!(test)) return message; } while (0)
+#define mu_run_test(test) \
+do { \
+ const char *message; \
+ puts("RUNNING TEST " #test "..."); \
+ message = test(); \
+ tests_run++; \
+ if (message) return message; \
+ puts("PASSED\n"); \
+} while (0)
+
+
+const char *test_has_key (void);
+const char *test_find_key_value (void);
+const char *test_find_key_values (void);
+const char *test_parse_content_disposition(void);
+const char *test_parse_range_header(void);
+const char *test_commands_sorted(void);
+const char *test_cmd_spec_restrict_file_names(void);
+const char *test_is_robots_txt_url(void);
+const char *test_path_simplify (void);
+const char *test_append_uri_pathel(void);
+const char *test_are_urls_equal(void);
+const char *test_subdir_p(void);
+const char *test_dir_matches_p(void);
+const char *test_hsts_new_entry(void);
+const char *test_hsts_url_rewrite_superdomain(void);
+const char *test_hsts_url_rewrite_congruent(void);
+const char *test_hsts_read_database(void);
+
+#endif /* TEST_H */
+
+/*
+ * vim: et ts=2 sw=2
+ */
diff --git a/tests/valgrind-suppressions b/tests/valgrind-suppressions
new file mode 100644
index 0000000..a5357b4
--- /dev/null
+++ b/tests/valgrind-suppressions
@@ -0,0 +1,245 @@
+{
+ False positive in libidn.so. More info: https://bugzilla.redhat.com/show_bug.cgi?id=678518
+ Memcheck:Addr4
+ fun:idna_to_ascii_4z
+ fun:idna_to_ascii_8z
+ fun:idn_encode
+ fun:url_parse
+}
+
+{
+ False positive in libidn.so
+ Memcheck:Addr8
+ fun:strncmp
+ fun:is_dst
+ ...
+ fun:fillin_rpath.isra.0
+ fun:decompose_rpath
+ ...
+ fun:openaux
+ fun:_dl_catch_exception
+ fun:_dl_map_object_deps
+ fun:dl_open_worker
+}
+
+{
+ False positive in libidn.so
+ Memcheck:Addr16
+ fun:strncmp
+ ...
+ fun:fillin_rpath.isra.0
+ fun:decompose_rpath
+ fun:_dl_map_object
+ fun:openaux
+ fun:_dl_catch_exception
+ fun:_dl_map_object_deps
+ fun:dl_open_worker
+ fun:_dl_catch_exception
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_set_cookie
+ fun:cookie_handle_set_cookie
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_set_cookie
+ fun:cookie_handle_set_cookie
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ fun:memrchr
+ fun:extract_param
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ fun:memrchr
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ fun:memrchr
+ fun:extract_param
+ fun:parse_set_cookie.constprop.4
+ fun:cookie_handle_set_cookie
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ gnutls-false-positive
+ Memcheck:Cond
+ fun:decode_complex_string.isra.0
+ fun:_gnutls_x509_dn_to_string
+ ...
+}
+
+{
+ gnutls-false-positive
+ Memcheck:Cond
+ ...
+ fun:gnutls_x509_ext_import_subject_alt_names
+ fun:gnutls_x509_crt_import
+ fun:gnutls_x509_crt_list_import
+ fun:gnutls_x509_crt_list_import2
+ fun:gnutls_x509_trust_list_add_trust_mem
+ fun:gnutls_x509_trust_list_add_trust_file
+ fun:gnutls_x509_trust_list_add_system_trust
+}
+
+{
+ gnutls-false-positive
+ Memcheck:Cond
+ ...
+ fun:gnutls_x509_crt_get_dn_by_oid
+ fun:gnutls_x509_crt_check_hostname2
+ fun:ssl_check_certificate
+ fun:establish_connection
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
diff --git a/tests/valgrind-suppressions-ssl b/tests/valgrind-suppressions-ssl
new file mode 100644
index 0000000..48906b5
--- /dev/null
+++ b/tests/valgrind-suppressions-ssl
@@ -0,0 +1,187 @@
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ ...
+ obj:*/libcrypto.so.*
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Cond
+ ...
+ obj:*/libssl.so.*
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Value8
+ ...
+ obj:*/libcrypto.so.*
+}
+
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Param
+ write(buf)
+ ...
+ obj:*/libcrypto.so.*
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ ...
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_set_cookie
+ fun:cookie_handle_set_cookie
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ ...
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:modify_param_name
+ fun:extract_param
+ fun:parse_set_cookie
+ fun:cookie_handle_set_cookie
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ ...
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ Valgrind 3.4 bug suppression
+ Memcheck:Cond
+ fun:memrchr
+ fun:parse_content_disposition
+ fun:check_file_output
+ fun:gethttp
+ fun:http_loop
+ fun:retrieve_url
+ fun:main
+}
+
+{
+ gnutls-false-positive
+ Memcheck:Cond
+ fun:decode_complex_string.isra.0
+ fun:_gnutls_x509_dn_to_string
+ ...
+}
+
+{
+ gnutls-false-positive
+ Memcheck:Cond
+ ...
+ fun:gnutls_x509_ext_import_subject_alt_names
+ fun:gnutls_x509_crt_import
+ fun:gnutls_x509_crt_list_import
+ fun:gnutls_x509_crt_list_import2
+ fun:gnutls_x509_trust_list_add_trust_mem
+ fun:gnutls_x509_trust_list_add_trust_file
+ fun:gnutls_x509_trust_list_add_system_trust
+}
diff --git a/util/Makefile.am b/util/Makefile.am
new file mode 100644
index 0000000..d82ca63
--- /dev/null
+++ b/util/Makefile.am
@@ -0,0 +1,33 @@
+# Makefile for `wget' utility
+# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2020 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+
+EXTRA_DIST = README rmold.pl trunc.c
diff --git a/util/Makefile.in b/util/Makefile.in
new file mode 100644
index 0000000..82cdb08
--- /dev/null
+++ b/util/Makefile.in
@@ -0,0 +1,1729 @@
+# Makefile.in generated by automake 1.16.2 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2020 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 for `wget' utility
+# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2020 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Additional permission under GNU GPL version 3 section 7
+
+# If you modify this program, or any covered work, by linking or
+# combining it with the OpenSSL project's OpenSSL library (or a
+# modified version of that library), containing parts covered by the
+# terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+# grants you additional permission to convey the resulting work.
+# Corresponding Source for a non-source form of such a combination
+# shall include the source code for the parts of OpenSSL used as well
+# as that of the covered work.
+
+#
+# Version: @VERSION@
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = util
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+ $(top_srcdir)/m4/__inline.m4 \
+ $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+ $(top_srcdir)/m4/af_alg.m4 $(top_srcdir)/m4/alloca.m4 \
+ $(top_srcdir)/m4/arpa_inet_h.m4 \
+ $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/base32.m4 \
+ $(top_srcdir)/m4/btowc.m4 $(top_srcdir)/m4/builtin-expect.m4 \
+ $(top_srcdir)/m4/byteswap.m4 $(top_srcdir)/m4/canonicalize.m4 \
+ $(top_srcdir)/m4/chdir-long.m4 $(top_srcdir)/m4/clock_time.m4 \
+ $(top_srcdir)/m4/close.m4 $(top_srcdir)/m4/closedir.m4 \
+ $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/ctype.m4 \
+ $(top_srcdir)/m4/d-ino.m4 $(top_srcdir)/m4/dirent_h.m4 \
+ $(top_srcdir)/m4/dirfd.m4 \
+ $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup.m4 \
+ $(top_srcdir)/m4/dup2.m4 $(top_srcdir)/m4/eaccess.m4 \
+ $(top_srcdir)/m4/eealloc.m4 $(top_srcdir)/m4/environ.m4 \
+ $(top_srcdir)/m4/errno_h.m4 $(top_srcdir)/m4/error.m4 \
+ $(top_srcdir)/m4/exponentd.m4 $(top_srcdir)/m4/extensions.m4 \
+ $(top_srcdir)/m4/extern-inline.m4 \
+ $(top_srcdir)/m4/fatal-signal.m4 $(top_srcdir)/m4/fchdir.m4 \
+ $(top_srcdir)/m4/fcntl-o.m4 $(top_srcdir)/m4/fcntl.m4 \
+ $(top_srcdir)/m4/fcntl_h.m4 $(top_srcdir)/m4/fdopendir.m4 \
+ $(top_srcdir)/m4/fflush.m4 $(top_srcdir)/m4/filenamecat.m4 \
+ $(top_srcdir)/m4/findprog-in.m4 $(top_srcdir)/m4/flexmember.m4 \
+ $(top_srcdir)/m4/float_h.m4 $(top_srcdir)/m4/flock.m4 \
+ $(top_srcdir)/m4/fnmatch.m4 $(top_srcdir)/m4/fnmatch_h.m4 \
+ $(top_srcdir)/m4/fopen.m4 $(top_srcdir)/m4/fpurge.m4 \
+ $(top_srcdir)/m4/freading.m4 $(top_srcdir)/m4/free.m4 \
+ $(top_srcdir)/m4/fseek.m4 $(top_srcdir)/m4/fseeko.m4 \
+ $(top_srcdir)/m4/fstat.m4 $(top_srcdir)/m4/fstatat.m4 \
+ $(top_srcdir)/m4/ftell.m4 $(top_srcdir)/m4/ftello.m4 \
+ $(top_srcdir)/m4/futimens.m4 $(top_srcdir)/m4/getaddrinfo.m4 \
+ $(top_srcdir)/m4/getcwd-abort-bug.m4 \
+ $(top_srcdir)/m4/getcwd-path-max.m4 $(top_srcdir)/m4/getcwd.m4 \
+ $(top_srcdir)/m4/getdelim.m4 $(top_srcdir)/m4/getdtablesize.m4 \
+ $(top_srcdir)/m4/getgroups.m4 $(top_srcdir)/m4/getline.m4 \
+ $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/getpagesize.m4 \
+ $(top_srcdir)/m4/getpass.m4 $(top_srcdir)/m4/getprogname.m4 \
+ $(top_srcdir)/m4/getrandom.m4 $(top_srcdir)/m4/gettext.m4 \
+ $(top_srcdir)/m4/gettime.m4 $(top_srcdir)/m4/gettimeofday.m4 \
+ $(top_srcdir)/m4/gl-openssl.m4 \
+ $(top_srcdir)/m4/gnulib-common.m4 \
+ $(top_srcdir)/m4/gnulib-comp.m4 \
+ $(top_srcdir)/m4/group-member.m4 \
+ $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/hostent.m4 \
+ $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/iconv_h.m4 \
+ $(top_srcdir)/m4/include_next.m4 $(top_srcdir)/m4/inet_ntop.m4 \
+ $(top_srcdir)/m4/inline.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+ $(top_srcdir)/m4/intmax_t.m4 $(top_srcdir)/m4/inttypes.m4 \
+ $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/ioctl.m4 \
+ $(top_srcdir)/m4/isblank.m4 $(top_srcdir)/m4/iswblank.m4 \
+ $(top_srcdir)/m4/iswdigit.m4 $(top_srcdir)/m4/iswxdigit.m4 \
+ $(top_srcdir)/m4/langinfo_h.m4 $(top_srcdir)/m4/largefile.m4 \
+ $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+ $(top_srcdir)/m4/lib-prefix.m4 \
+ $(top_srcdir)/m4/libunistring-base.m4 \
+ $(top_srcdir)/m4/libunistring-optional.m4 \
+ $(top_srcdir)/m4/libunistring.m4 $(top_srcdir)/m4/limits-h.m4 \
+ $(top_srcdir)/m4/link.m4 $(top_srcdir)/m4/localcharset.m4 \
+ $(top_srcdir)/m4/locale-fr.m4 $(top_srcdir)/m4/locale-ja.m4 \
+ $(top_srcdir)/m4/locale-zh.m4 $(top_srcdir)/m4/locale_h.m4 \
+ $(top_srcdir)/m4/localeconv.m4 $(top_srcdir)/m4/lock.m4 \
+ $(top_srcdir)/m4/lseek.m4 $(top_srcdir)/m4/lstat.m4 \
+ $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/malloca.m4 \
+ $(top_srcdir)/m4/mbchar.m4 $(top_srcdir)/m4/mbiter.m4 \
+ $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbsinit.m4 \
+ $(top_srcdir)/m4/mbsrtowcs.m4 $(top_srcdir)/m4/mbstate_t.m4 \
+ $(top_srcdir)/m4/mbtowc.m4 $(top_srcdir)/m4/md4.m4 \
+ $(top_srcdir)/m4/md5.m4 $(top_srcdir)/m4/memchr.m4 \
+ $(top_srcdir)/m4/mempcpy.m4 $(top_srcdir)/m4/memrchr.m4 \
+ $(top_srcdir)/m4/minmax.m4 $(top_srcdir)/m4/mkdir.m4 \
+ $(top_srcdir)/m4/mkostemp.m4 $(top_srcdir)/m4/mkstemp.m4 \
+ $(top_srcdir)/m4/mktime.m4 $(top_srcdir)/m4/mmap-anon.m4 \
+ $(top_srcdir)/m4/mode_t.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+ $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+ $(top_srcdir)/m4/nanosleep.m4 $(top_srcdir)/m4/netdb_h.m4 \
+ $(top_srcdir)/m4/netinet_in_h.m4 \
+ $(top_srcdir)/m4/nl_langinfo.m4 $(top_srcdir)/m4/nls.m4 \
+ $(top_srcdir)/m4/nocrash.m4 $(top_srcdir)/m4/off_t.m4 \
+ $(top_srcdir)/m4/open-cloexec.m4 \
+ $(top_srcdir)/m4/open-slash.m4 $(top_srcdir)/m4/open.m4 \
+ $(top_srcdir)/m4/openat.m4 $(top_srcdir)/m4/opendir.m4 \
+ $(top_srcdir)/m4/pathmax.m4 $(top_srcdir)/m4/pipe.m4 \
+ $(top_srcdir)/m4/pipe2.m4 $(top_srcdir)/m4/po.m4 \
+ $(top_srcdir)/m4/posix_spawn.m4 \
+ $(top_srcdir)/m4/posix_spawn_faction_addchdir.m4 \
+ $(top_srcdir)/m4/printf.m4 \
+ $(top_srcdir)/m4/pthread_rwlock_rdlock.m4 \
+ $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \
+ $(top_srcdir)/m4/raise.m4 $(top_srcdir)/m4/rawmemchr.m4 \
+ $(top_srcdir)/m4/readdir.m4 $(top_srcdir)/m4/readlink.m4 \
+ $(top_srcdir)/m4/realloc.m4 $(top_srcdir)/m4/regex.m4 \
+ $(top_srcdir)/m4/rewinddir.m4 $(top_srcdir)/m4/save-cwd.m4 \
+ $(top_srcdir)/m4/sched_h.m4 $(top_srcdir)/m4/secure_getenv.m4 \
+ $(top_srcdir)/m4/select.m4 $(top_srcdir)/m4/servent.m4 \
+ $(top_srcdir)/m4/setlocale_null.m4 \
+ $(top_srcdir)/m4/sh-filename.m4 $(top_srcdir)/m4/sha1.m4 \
+ $(top_srcdir)/m4/sha256.m4 $(top_srcdir)/m4/sha512.m4 \
+ $(top_srcdir)/m4/sig_atomic_t.m4 $(top_srcdir)/m4/sigaction.m4 \
+ $(top_srcdir)/m4/signal_h.m4 \
+ $(top_srcdir)/m4/signalblocking.m4 $(top_srcdir)/m4/sigpipe.m4 \
+ $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/snprintf.m4 \
+ $(top_srcdir)/m4/socketlib.m4 $(top_srcdir)/m4/sockets.m4 \
+ $(top_srcdir)/m4/socklen.m4 $(top_srcdir)/m4/sockpfaf.m4 \
+ $(top_srcdir)/m4/spawn-pipe.m4 $(top_srcdir)/m4/spawn_h.m4 \
+ $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stat-time.m4 \
+ $(top_srcdir)/m4/stat.m4 $(top_srcdir)/m4/stdalign.m4 \
+ $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stddef_h.m4 \
+ $(top_srcdir)/m4/stdint.m4 $(top_srcdir)/m4/stdint_h.m4 \
+ $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+ $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strcase.m4 \
+ $(top_srcdir)/m4/strchrnul.m4 $(top_srcdir)/m4/strdup.m4 \
+ $(top_srcdir)/m4/strerror.m4 $(top_srcdir)/m4/strerror_r.m4 \
+ $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/strings_h.m4 \
+ $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \
+ $(top_srcdir)/m4/strpbrk.m4 $(top_srcdir)/m4/strptime.m4 \
+ $(top_srcdir)/m4/strtok_r.m4 $(top_srcdir)/m4/strtol.m4 \
+ $(top_srcdir)/m4/strtoll.m4 $(top_srcdir)/m4/symlink.m4 \
+ $(top_srcdir)/m4/sys_file_h.m4 $(top_srcdir)/m4/sys_ioctl_h.m4 \
+ $(top_srcdir)/m4/sys_random_h.m4 \
+ $(top_srcdir)/m4/sys_select_h.m4 \
+ $(top_srcdir)/m4/sys_socket_h.m4 \
+ $(top_srcdir)/m4/sys_stat_h.m4 $(top_srcdir)/m4/sys_time_h.m4 \
+ $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/sys_uio_h.m4 \
+ $(top_srcdir)/m4/sys_wait_h.m4 $(top_srcdir)/m4/tempname.m4 \
+ $(top_srcdir)/m4/threadlib.m4 $(top_srcdir)/m4/time_h.m4 \
+ $(top_srcdir)/m4/time_r.m4 $(top_srcdir)/m4/timegm.m4 \
+ $(top_srcdir)/m4/timespec.m4 $(top_srcdir)/m4/tm_gmtoff.m4 \
+ $(top_srcdir)/m4/tmpdir.m4 $(top_srcdir)/m4/unistd-safer.m4 \
+ $(top_srcdir)/m4/unistd_h.m4 $(top_srcdir)/m4/unlink.m4 \
+ $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/utime.m4 \
+ $(top_srcdir)/m4/utime_h.m4 $(top_srcdir)/m4/utimens.m4 \
+ $(top_srcdir)/m4/utimes.m4 $(top_srcdir)/m4/vasnprintf.m4 \
+ $(top_srcdir)/m4/vasprintf.m4 $(top_srcdir)/m4/visibility.m4 \
+ $(top_srcdir)/m4/vsnprintf.m4 $(top_srcdir)/m4/wait-process.m4 \
+ $(top_srcdir)/m4/waitpid.m4 $(top_srcdir)/m4/warn-on-use.m4 \
+ $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/m4/wchar_h.m4 \
+ $(top_srcdir)/m4/wchar_t.m4 $(top_srcdir)/m4/wcrtomb.m4 \
+ $(top_srcdir)/m4/wctype_h.m4 $(top_srcdir)/m4/wcwidth.m4 \
+ $(top_srcdir)/m4/wget.m4 $(top_srcdir)/m4/wget_manywarnings.m4 \
+ $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/wmemchr.m4 \
+ $(top_srcdir)/m4/wmempcpy.m4 $(top_srcdir)/m4/write.m4 \
+ $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xsize.m4 \
+ $(top_srcdir)/m4/xstrndup.m4 $(top_srcdir)/m4/zzgnulib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/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__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+ASM_SYMBOL_PREFIX = @ASM_SYMBOL_PREFIX@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+BYTESWAP_H = @BYTESWAP_H@
+CARES_CFLAGS = @CARES_CFLAGS@
+CARES_LIBS = @CARES_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CFLAG_VISIBILITY = @CFLAG_VISIBILITY@
+COMMENT_IF_NO_POD2MAN = @COMMENT_IF_NO_POD2MAN@
+CONFIG_INCLUDE = @CONFIG_INCLUDE@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+FLOAT_H = @FLOAT_H@
+FNMATCH_H = @FNMATCH_H@
+FUZZ_LIBS = @FUZZ_LIBS@
+GETADDRINFO_LIB = @GETADDRINFO_LIB@
+GETOPT_CDEFS_H = @GETOPT_CDEFS_H@
+GETOPT_H = @GETOPT_H@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCEPT = @GNULIB_ACCEPT@
+GNULIB_ACCEPT4 = @GNULIB_ACCEPT4@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ALIGNED_ALLOC = @GNULIB_ALIGNED_ALLOC@
+GNULIB_ALPHASORT = @GNULIB_ALPHASORT@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_BIND = @GNULIB_BIND@
+GNULIB_BTOWC = @GNULIB_BTOWC@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_CLOSEDIR = @GNULIB_CLOSEDIR@
+GNULIB_CONNECT = @GNULIB_CONNECT@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_CTIME = @GNULIB_CTIME@
+GNULIB_DIRFD = @GNULIB_DIRFD@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_DUPLOCALE = @GNULIB_DUPLOCALE@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXECL = @GNULIB_EXECL@
+GNULIB_EXECLE = @GNULIB_EXECLE@
+GNULIB_EXECLP = @GNULIB_EXECLP@
+GNULIB_EXECV = @GNULIB_EXECV@
+GNULIB_EXECVE = @GNULIB_EXECVE@
+GNULIB_EXECVP = @GNULIB_EXECVP@
+GNULIB_EXECVPE = @GNULIB_EXECVPE@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHMODAT = @GNULIB_FCHMODAT@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FDOPENDIR = @GNULIB_FDOPENDIR@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFS = @GNULIB_FFS@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FLOCK = @GNULIB_FLOCK@
+GNULIB_FNMATCH = @GNULIB_FNMATCH@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREE_POSIX = @GNULIB_FREE_POSIX@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSTAT = @GNULIB_FSTAT@
+GNULIB_FSTATAT = @GNULIB_FSTATAT@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FUTIMENS = @GNULIB_FUTIMENS@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETADDRINFO = @GNULIB_GETADDRINFO@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETENTROPY = @GNULIB_GETENTROPY@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETOPT_POSIX = @GNULIB_GETOPT_POSIX@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETPEERNAME = @GNULIB_GETPEERNAME@
+GNULIB_GETRANDOM = @GNULIB_GETRANDOM@
+GNULIB_GETSOCKNAME = @GNULIB_GETSOCKNAME@
+GNULIB_GETSOCKOPT = @GNULIB_GETSOCKOPT@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETTIMEOFDAY = @GNULIB_GETTIMEOFDAY@
+GNULIB_GETUMASK = @GNULIB_GETUMASK@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GL_UNISTD_H_GETOPT = @GNULIB_GL_UNISTD_H_GETOPT@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ICONV = @GNULIB_ICONV@
+GNULIB_IMAXABS = @GNULIB_IMAXABS@
+GNULIB_IMAXDIV = @GNULIB_IMAXDIV@
+GNULIB_INET_NTOP = @GNULIB_INET_NTOP@
+GNULIB_INET_PTON = @GNULIB_INET_PTON@
+GNULIB_IOCTL = @GNULIB_IOCTL@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_ISBLANK = @GNULIB_ISBLANK@
+GNULIB_ISWBLANK = @GNULIB_ISWBLANK@
+GNULIB_ISWCTYPE = @GNULIB_ISWCTYPE@
+GNULIB_ISWDIGIT = @GNULIB_ISWDIGIT@
+GNULIB_ISWXDIGIT = @GNULIB_ISWXDIGIT@
+GNULIB_LCHMOD = @GNULIB_LCHMOD@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LISTEN = @GNULIB_LISTEN@
+GNULIB_LOCALECONV = @GNULIB_LOCALECONV@
+GNULIB_LOCALENAME = @GNULIB_LOCALENAME@
+GNULIB_LOCALTIME = @GNULIB_LOCALTIME@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_LSTAT = @GNULIB_LSTAT@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBRLEN = @GNULIB_MBRLEN@
+GNULIB_MBRTOWC = @GNULIB_MBRTOWC@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSINIT = @GNULIB_MBSINIT@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSNRTOWCS = @GNULIB_MBSNRTOWCS@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSRTOWCS = @GNULIB_MBSRTOWCS@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MDA_ACCESS = @GNULIB_MDA_ACCESS@
+GNULIB_MDA_CHDIR = @GNULIB_MDA_CHDIR@
+GNULIB_MDA_CHMOD = @GNULIB_MDA_CHMOD@
+GNULIB_MDA_CLOSE = @GNULIB_MDA_CLOSE@
+GNULIB_MDA_CREAT = @GNULIB_MDA_CREAT@
+GNULIB_MDA_DUP = @GNULIB_MDA_DUP@
+GNULIB_MDA_DUP2 = @GNULIB_MDA_DUP2@
+GNULIB_MDA_ECVT = @GNULIB_MDA_ECVT@
+GNULIB_MDA_EXECL = @GNULIB_MDA_EXECL@
+GNULIB_MDA_EXECLE = @GNULIB_MDA_EXECLE@
+GNULIB_MDA_EXECLP = @GNULIB_MDA_EXECLP@
+GNULIB_MDA_EXECV = @GNULIB_MDA_EXECV@
+GNULIB_MDA_EXECVE = @GNULIB_MDA_EXECVE@
+GNULIB_MDA_EXECVP = @GNULIB_MDA_EXECVP@
+GNULIB_MDA_EXECVPE = @GNULIB_MDA_EXECVPE@
+GNULIB_MDA_FCLOSEALL = @GNULIB_MDA_FCLOSEALL@
+GNULIB_MDA_FCVT = @GNULIB_MDA_FCVT@
+GNULIB_MDA_FDOPEN = @GNULIB_MDA_FDOPEN@
+GNULIB_MDA_FILENO = @GNULIB_MDA_FILENO@
+GNULIB_MDA_GCVT = @GNULIB_MDA_GCVT@
+GNULIB_MDA_GETCWD = @GNULIB_MDA_GETCWD@
+GNULIB_MDA_GETPID = @GNULIB_MDA_GETPID@
+GNULIB_MDA_GETW = @GNULIB_MDA_GETW@
+GNULIB_MDA_ISATTY = @GNULIB_MDA_ISATTY@
+GNULIB_MDA_LSEEK = @GNULIB_MDA_LSEEK@
+GNULIB_MDA_MEMCCPY = @GNULIB_MDA_MEMCCPY@
+GNULIB_MDA_MKDIR = @GNULIB_MDA_MKDIR@
+GNULIB_MDA_MKTEMP = @GNULIB_MDA_MKTEMP@
+GNULIB_MDA_OPEN = @GNULIB_MDA_OPEN@
+GNULIB_MDA_PUTENV = @GNULIB_MDA_PUTENV@
+GNULIB_MDA_PUTW = @GNULIB_MDA_PUTW@
+GNULIB_MDA_READ = @GNULIB_MDA_READ@
+GNULIB_MDA_RMDIR = @GNULIB_MDA_RMDIR@
+GNULIB_MDA_STRDUP = @GNULIB_MDA_STRDUP@
+GNULIB_MDA_SWAB = @GNULIB_MDA_SWAB@
+GNULIB_MDA_TEMPNAM = @GNULIB_MDA_TEMPNAM@
+GNULIB_MDA_TZSET = @GNULIB_MDA_TZSET@
+GNULIB_MDA_UMASK = @GNULIB_MDA_UMASK@
+GNULIB_MDA_UNLINK = @GNULIB_MDA_UNLINK@
+GNULIB_MDA_UTIME = @GNULIB_MDA_UTIME@
+GNULIB_MDA_WCSDUP = @GNULIB_MDA_WCSDUP@
+GNULIB_MDA_WRITE = @GNULIB_MDA_WRITE@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDIR = @GNULIB_MKDIR@
+GNULIB_MKDIRAT = @GNULIB_MKDIRAT@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKFIFO = @GNULIB_MKFIFO@
+GNULIB_MKFIFOAT = @GNULIB_MKFIFOAT@
+GNULIB_MKNOD = @GNULIB_MKNOD@
+GNULIB_MKNODAT = @GNULIB_MKNODAT@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_MKTIME = @GNULIB_MKTIME@
+GNULIB_NANOSLEEP = @GNULIB_NANOSLEEP@
+GNULIB_NL_LANGINFO = @GNULIB_NL_LANGINFO@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OPENDIR = @GNULIB_OPENDIR@
+GNULIB_OVERRIDES_STRUCT_STAT = @GNULIB_OVERRIDES_STRUCT_STAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_MEMALIGN = @GNULIB_POSIX_MEMALIGN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_POSIX_SPAWN = @GNULIB_POSIX_SPAWN@
+GNULIB_POSIX_SPAWNATTR_DESTROY = @GNULIB_POSIX_SPAWNATTR_DESTROY@
+GNULIB_POSIX_SPAWNATTR_GETFLAGS = @GNULIB_POSIX_SPAWNATTR_GETFLAGS@
+GNULIB_POSIX_SPAWNATTR_GETPGROUP = @GNULIB_POSIX_SPAWNATTR_GETPGROUP@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_GETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_GETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_GETSIGMASK = @GNULIB_POSIX_SPAWNATTR_GETSIGMASK@
+GNULIB_POSIX_SPAWNATTR_INIT = @GNULIB_POSIX_SPAWNATTR_INIT@
+GNULIB_POSIX_SPAWNATTR_SETFLAGS = @GNULIB_POSIX_SPAWNATTR_SETFLAGS@
+GNULIB_POSIX_SPAWNATTR_SETPGROUP = @GNULIB_POSIX_SPAWNATTR_SETPGROUP@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPARAM@
+GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY = @GNULIB_POSIX_SPAWNATTR_SETSCHEDPOLICY@
+GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT = @GNULIB_POSIX_SPAWNATTR_SETSIGDEFAULT@
+GNULIB_POSIX_SPAWNATTR_SETSIGMASK = @GNULIB_POSIX_SPAWNATTR_SETSIGMASK@
+GNULIB_POSIX_SPAWNP = @GNULIB_POSIX_SPAWNP@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_DESTROY@
+GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT = @GNULIB_POSIX_SPAWN_FILE_ACTIONS_INIT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PSELECT = @GNULIB_PSELECT@
+GNULIB_PTHREAD_SIGMASK = @GNULIB_PTHREAD_SIGMASK@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RAISE = @GNULIB_RAISE@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READDIR = @GNULIB_READDIR@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_RECV = @GNULIB_RECV@
+GNULIB_RECVFROM = @GNULIB_RECVFROM@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_REWINDDIR = @GNULIB_REWINDDIR@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANDIR = @GNULIB_SCANDIR@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SCHED_YIELD = @GNULIB_SCHED_YIELD@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SELECT = @GNULIB_SELECT@
+GNULIB_SEND = @GNULIB_SEND@
+GNULIB_SENDTO = @GNULIB_SENDTO@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SETLOCALE = @GNULIB_SETLOCALE@
+GNULIB_SETLOCALE_NULL = @GNULIB_SETLOCALE_NULL@
+GNULIB_SETSOCKOPT = @GNULIB_SETSOCKOPT@
+GNULIB_SHUTDOWN = @GNULIB_SHUTDOWN@
+GNULIB_SIGABBREV_NP = @GNULIB_SIGABBREV_NP@
+GNULIB_SIGACTION = @GNULIB_SIGACTION@
+GNULIB_SIGDESCR_NP = @GNULIB_SIGDESCR_NP@
+GNULIB_SIGNAL_H_SIGPIPE = @GNULIB_SIGNAL_H_SIGPIPE@
+GNULIB_SIGPROCMASK = @GNULIB_SIGPROCMASK@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SOCKET = @GNULIB_SOCKET@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STAT = @GNULIB_STAT@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERRORNAME_NP = @GNULIB_STRERRORNAME_NP@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRFTIME = @GNULIB_STRFTIME@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRPTIME = @GNULIB_STRPTIME@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOIMAX = @GNULIB_STRTOIMAX@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRTOUMAX = @GNULIB_STRTOUMAX@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TIMEGM = @GNULIB_TIMEGM@
+GNULIB_TIME_R = @GNULIB_TIME_R@
+GNULIB_TIME_RZ = @GNULIB_TIME_RZ@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TOWCTRANS = @GNULIB_TOWCTRANS@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_TZSET = @GNULIB_TZSET@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_UTIME = @GNULIB_UTIME@
+GNULIB_UTIMENSAT = @GNULIB_UTIMENSAT@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WAITPID = @GNULIB_WAITPID@
+GNULIB_WARN_CFLAGS = @GNULIB_WARN_CFLAGS@
+GNULIB_WCPCPY = @GNULIB_WCPCPY@
+GNULIB_WCPNCPY = @GNULIB_WCPNCPY@
+GNULIB_WCRTOMB = @GNULIB_WCRTOMB@
+GNULIB_WCSCASECMP = @GNULIB_WCSCASECMP@
+GNULIB_WCSCAT = @GNULIB_WCSCAT@
+GNULIB_WCSCHR = @GNULIB_WCSCHR@
+GNULIB_WCSCMP = @GNULIB_WCSCMP@
+GNULIB_WCSCOLL = @GNULIB_WCSCOLL@
+GNULIB_WCSCPY = @GNULIB_WCSCPY@
+GNULIB_WCSCSPN = @GNULIB_WCSCSPN@
+GNULIB_WCSDUP = @GNULIB_WCSDUP@
+GNULIB_WCSFTIME = @GNULIB_WCSFTIME@
+GNULIB_WCSLEN = @GNULIB_WCSLEN@
+GNULIB_WCSNCASECMP = @GNULIB_WCSNCASECMP@
+GNULIB_WCSNCAT = @GNULIB_WCSNCAT@
+GNULIB_WCSNCMP = @GNULIB_WCSNCMP@
+GNULIB_WCSNCPY = @GNULIB_WCSNCPY@
+GNULIB_WCSNLEN = @GNULIB_WCSNLEN@
+GNULIB_WCSNRTOMBS = @GNULIB_WCSNRTOMBS@
+GNULIB_WCSPBRK = @GNULIB_WCSPBRK@
+GNULIB_WCSRCHR = @GNULIB_WCSRCHR@
+GNULIB_WCSRTOMBS = @GNULIB_WCSRTOMBS@
+GNULIB_WCSSPN = @GNULIB_WCSSPN@
+GNULIB_WCSSTR = @GNULIB_WCSSTR@
+GNULIB_WCSTOK = @GNULIB_WCSTOK@
+GNULIB_WCSWIDTH = @GNULIB_WCSWIDTH@
+GNULIB_WCSXFRM = @GNULIB_WCSXFRM@
+GNULIB_WCTOB = @GNULIB_WCTOB@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WCTRANS = @GNULIB_WCTRANS@
+GNULIB_WCTYPE = @GNULIB_WCTYPE@
+GNULIB_WCWIDTH = @GNULIB_WCWIDTH@
+GNULIB_WMEMCHR = @GNULIB_WMEMCHR@
+GNULIB_WMEMCMP = @GNULIB_WMEMCMP@
+GNULIB_WMEMCPY = @GNULIB_WMEMCPY@
+GNULIB_WMEMMOVE = @GNULIB_WMEMMOVE@
+GNULIB_WMEMPCPY = @GNULIB_WMEMPCPY@
+GNULIB_WMEMSET = @GNULIB_WMEMSET@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
+GNUTLS_LIBS = @GNUTLS_LIBS@
+GPGME_CFLAGS = @GPGME_CFLAGS@
+GPGME_CONFIG = @GPGME_CONFIG@
+GPGME_LIBS = @GPGME_LIBS@
+GREP = @GREP@
+HAVE_ACCEPT4 = @HAVE_ACCEPT4@
+HAVE_ALIGNED_ALLOC = @HAVE_ALIGNED_ALLOC@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ALPHASORT = @HAVE_ALPHASORT@
+HAVE_ARPA_INET_H = @HAVE_ARPA_INET_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_BTOWC = @HAVE_BTOWC@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_CLOSEDIR = @HAVE_CLOSEDIR@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_CRTDEFS_H = @HAVE_CRTDEFS_H@
+HAVE_DECL_DIRFD = @HAVE_DECL_DIRFD@
+HAVE_DECL_ECVT = @HAVE_DECL_ECVT@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_EXECVPE = @HAVE_DECL_EXECVPE@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FCLOSEALL = @HAVE_DECL_FCLOSEALL@
+HAVE_DECL_FCVT = @HAVE_DECL_FCVT@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FDOPENDIR = @HAVE_DECL_FDOPENDIR@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FREEADDRINFO = @HAVE_DECL_FREEADDRINFO@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GAI_STRERROR = @HAVE_DECL_GAI_STRERROR@
+HAVE_DECL_GCVT = @HAVE_DECL_GCVT@
+HAVE_DECL_GETADDRINFO = @HAVE_DECL_GETADDRINFO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETNAMEINFO = @HAVE_DECL_GETNAMEINFO@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_IMAXABS = @HAVE_DECL_IMAXABS@
+HAVE_DECL_IMAXDIV = @HAVE_DECL_IMAXDIV@
+HAVE_DECL_INET_NTOP = @HAVE_DECL_INET_NTOP@
+HAVE_DECL_INET_PTON = @HAVE_DECL_INET_PTON@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_LOCALTIME_R = @HAVE_DECL_LOCALTIME_R@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNCASECMP = @HAVE_DECL_STRNCASECMP@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOIMAX = @HAVE_DECL_STRTOIMAX@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_STRTOUMAX = @HAVE_DECL_STRTOUMAX@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DECL_WCSDUP = @HAVE_DECL_WCSDUP@
+HAVE_DECL_WCTOB = @HAVE_DECL_WCTOB@
+HAVE_DECL_WCWIDTH = @HAVE_DECL_WCWIDTH@
+HAVE_DIRENT_H = @HAVE_DIRENT_H@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_DUPLOCALE = @HAVE_DUPLOCALE@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXECVPE = @HAVE_EXECVPE@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHMODAT = @HAVE_FCHMODAT@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FDOPENDIR = @HAVE_FDOPENDIR@
+HAVE_FEATURES_H = @HAVE_FEATURES_H@
+HAVE_FFS = @HAVE_FFS@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FLOCK = @HAVE_FLOCK@
+HAVE_FNMATCH = @HAVE_FNMATCH@
+HAVE_FNMATCH_H = @HAVE_FNMATCH_H@
+HAVE_FREELOCALE = @HAVE_FREELOCALE@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSTATAT = @HAVE_FSTATAT@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_FUTIMENS = @HAVE_FUTIMENS@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETENTROPY = @HAVE_GETENTROPY@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETOPT_H = @HAVE_GETOPT_H@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETRANDOM = @HAVE_GETRANDOM@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GETTIMEOFDAY = @HAVE_GETTIMEOFDAY@
+HAVE_GETUMASK = @HAVE_GETUMASK@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_IMAXDIV_T = @HAVE_IMAXDIV_T@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_ISBLANK = @HAVE_ISBLANK@
+HAVE_ISWBLANK = @HAVE_ISWBLANK@
+HAVE_ISWCNTRL = @HAVE_ISWCNTRL@
+HAVE_LANGINFO_ALTMON = @HAVE_LANGINFO_ALTMON@
+HAVE_LANGINFO_CODESET = @HAVE_LANGINFO_CODESET@
+HAVE_LANGINFO_ERA = @HAVE_LANGINFO_ERA@
+HAVE_LANGINFO_H = @HAVE_LANGINFO_H@
+HAVE_LANGINFO_T_FMT_AMPM = @HAVE_LANGINFO_T_FMT_AMPM@
+HAVE_LANGINFO_YESEXPR = @HAVE_LANGINFO_YESEXPR@
+HAVE_LCHMOD = @HAVE_LCHMOD@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LIBGNUTLS = @HAVE_LIBGNUTLS@
+HAVE_LIBSSL = @HAVE_LIBSSL@
+HAVE_LIBUNISTRING = @HAVE_LIBUNISTRING@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_LSTAT = @HAVE_LSTAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBRLEN = @HAVE_MBRLEN@
+HAVE_MBRTOWC = @HAVE_MBRTOWC@
+HAVE_MBSINIT = @HAVE_MBSINIT@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBSNRTOWCS = @HAVE_MBSNRTOWCS@
+HAVE_MBSRTOWCS = @HAVE_MBSRTOWCS@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDIRAT = @HAVE_MKDIRAT@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKFIFO = @HAVE_MKFIFO@
+HAVE_MKFIFOAT = @HAVE_MKFIFOAT@
+HAVE_MKNOD = @HAVE_MKNOD@
+HAVE_MKNODAT = @HAVE_MKNODAT@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_NANOSLEEP = @HAVE_NANOSLEEP@
+HAVE_NETDB_H = @HAVE_NETDB_H@
+HAVE_NETINET_IN_H = @HAVE_NETINET_IN_H@
+HAVE_NEWLOCALE = @HAVE_NEWLOCALE@
+HAVE_NL_LANGINFO = @HAVE_NL_LANGINFO@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OPENDIR = @HAVE_OPENDIR@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_MEMALIGN = @HAVE_POSIX_MEMALIGN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_POSIX_SIGNALBLOCKING = @HAVE_POSIX_SIGNALBLOCKING@
+HAVE_POSIX_SPAWN = @HAVE_POSIX_SPAWN@
+HAVE_POSIX_SPAWNATTR_T = @HAVE_POSIX_SPAWNATTR_T@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+HAVE_POSIX_SPAWN_FILE_ACTIONS_T = @HAVE_POSIX_SPAWN_FILE_ACTIONS_T@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PSELECT = @HAVE_PSELECT@
+HAVE_PTHREAD_SIGMASK = @HAVE_PTHREAD_SIGMASK@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RAISE = @HAVE_RAISE@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READDIR = @HAVE_READDIR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_REWINDDIR = @HAVE_REWINDDIR@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SA_FAMILY_T = @HAVE_SA_FAMILY_T@
+HAVE_SCANDIR = @HAVE_SCANDIR@
+HAVE_SCHED_H = @HAVE_SCHED_H@
+HAVE_SCHED_YIELD = @HAVE_SCHED_YIELD@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGABBREV_NP = @HAVE_SIGABBREV_NP@
+HAVE_SIGACTION = @HAVE_SIGACTION@
+HAVE_SIGDESCR_NP = @HAVE_SIGDESCR_NP@
+HAVE_SIGHANDLER_T = @HAVE_SIGHANDLER_T@
+HAVE_SIGINFO_T = @HAVE_SIGINFO_T@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SIGSET_T = @HAVE_SIGSET_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_SPAWN_H = @HAVE_SPAWN_H@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASECMP = @HAVE_STRCASECMP@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRERRORNAME_NP = @HAVE_STRERRORNAME_NP@
+HAVE_STRINGS_H = @HAVE_STRINGS_H@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRPTIME = @HAVE_STRPTIME@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_ADDRINFO = @HAVE_STRUCT_ADDRINFO@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRUCT_SCHED_PARAM = @HAVE_STRUCT_SCHED_PARAM@
+HAVE_STRUCT_SIGACTION_SA_SIGACTION = @HAVE_STRUCT_SIGACTION_SA_SIGACTION@
+HAVE_STRUCT_SOCKADDR_STORAGE = @HAVE_STRUCT_SOCKADDR_STORAGE@
+HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = @HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY@
+HAVE_STRUCT_TIMEVAL = @HAVE_STRUCT_TIMEVAL@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_CDEFS_H = @HAVE_SYS_CDEFS_H@
+HAVE_SYS_FILE_H = @HAVE_SYS_FILE_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_IOCTL_H = @HAVE_SYS_IOCTL_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_RANDOM_H = @HAVE_SYS_RANDOM_H@
+HAVE_SYS_SELECT_H = @HAVE_SYS_SELECT_H@
+HAVE_SYS_SOCKET_H = @HAVE_SYS_SOCKET_H@
+HAVE_SYS_TIME_H = @HAVE_SYS_TIME_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_SYS_UIO_H = @HAVE_SYS_UIO_H@
+HAVE_TIMEGM = @HAVE_TIMEGM@
+HAVE_TIMEZONE_T = @HAVE_TIMEZONE_T@
+HAVE_TYPE_VOLATILE_SIG_ATOMIC_T = @HAVE_TYPE_VOLATILE_SIG_ATOMIC_T@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_UTIME = @HAVE_UTIME@
+HAVE_UTIMENSAT = @HAVE_UTIMENSAT@
+HAVE_UTIME_H = @HAVE_UTIME_H@
+HAVE_VALGRIND = @HAVE_VALGRIND@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_VISIBILITY = @HAVE_VISIBILITY@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WCPCPY = @HAVE_WCPCPY@
+HAVE_WCPNCPY = @HAVE_WCPNCPY@
+HAVE_WCRTOMB = @HAVE_WCRTOMB@
+HAVE_WCSCASECMP = @HAVE_WCSCASECMP@
+HAVE_WCSCAT = @HAVE_WCSCAT@
+HAVE_WCSCHR = @HAVE_WCSCHR@
+HAVE_WCSCMP = @HAVE_WCSCMP@
+HAVE_WCSCOLL = @HAVE_WCSCOLL@
+HAVE_WCSCPY = @HAVE_WCSCPY@
+HAVE_WCSCSPN = @HAVE_WCSCSPN@
+HAVE_WCSDUP = @HAVE_WCSDUP@
+HAVE_WCSFTIME = @HAVE_WCSFTIME@
+HAVE_WCSLEN = @HAVE_WCSLEN@
+HAVE_WCSNCASECMP = @HAVE_WCSNCASECMP@
+HAVE_WCSNCAT = @HAVE_WCSNCAT@
+HAVE_WCSNCMP = @HAVE_WCSNCMP@
+HAVE_WCSNCPY = @HAVE_WCSNCPY@
+HAVE_WCSNLEN = @HAVE_WCSNLEN@
+HAVE_WCSNRTOMBS = @HAVE_WCSNRTOMBS@
+HAVE_WCSPBRK = @HAVE_WCSPBRK@
+HAVE_WCSRCHR = @HAVE_WCSRCHR@
+HAVE_WCSRTOMBS = @HAVE_WCSRTOMBS@
+HAVE_WCSSPN = @HAVE_WCSSPN@
+HAVE_WCSSTR = @HAVE_WCSSTR@
+HAVE_WCSTOK = @HAVE_WCSTOK@
+HAVE_WCSWIDTH = @HAVE_WCSWIDTH@
+HAVE_WCSXFRM = @HAVE_WCSXFRM@
+HAVE_WCTRANS_T = @HAVE_WCTRANS_T@
+HAVE_WCTYPE_H = @HAVE_WCTYPE_H@
+HAVE_WCTYPE_T = @HAVE_WCTYPE_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE_WINT_T = @HAVE_WINT_T@
+HAVE_WMEMCHR = @HAVE_WMEMCHR@
+HAVE_WMEMCMP = @HAVE_WMEMCMP@
+HAVE_WMEMCPY = @HAVE_WMEMCPY@
+HAVE_WMEMMOVE = @HAVE_WMEMMOVE@
+HAVE_WMEMPCPY = @HAVE_WMEMPCPY@
+HAVE_WMEMSET = @HAVE_WMEMSET@
+HAVE_WS2TCPIP_H = @HAVE_WS2TCPIP_H@
+HAVE_XLOCALE_H = @HAVE_XLOCALE_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOSTENT_LIB = @HOSTENT_LIB@
+ICONV_CONST = @ICONV_CONST@
+ICONV_H = @ICONV_H@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INET_NTOP_LIB = @INET_NTOP_LIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INT32_MAX_LT_INTMAX_MAX = @INT32_MAX_LT_INTMAX_MAX@
+INT64_MAX_EQ_LONG_MAX = @INT64_MAX_EQ_LONG_MAX@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXLIB = @LEXLIB@
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LIBGNUTLS = @LIBGNUTLS@
+LIBGNUTLS_PREFIX = @LIBGNUTLS_PREFIX@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMULTITHREAD = @LIBMULTITHREAD@
+LIBOBJS = @LIBOBJS@
+LIBPMULTITHREAD = @LIBPMULTITHREAD@
+LIBPSL_CFLAGS = @LIBPSL_CFLAGS@
+LIBPSL_LIBS = @LIBPSL_LIBS@
+LIBPTHREAD = @LIBPTHREAD@
+LIBS = @LIBS@
+LIBSOCKET = @LIBSOCKET@
+LIBSSL = @LIBSSL@
+LIBSSL_PREFIX = @LIBSSL_PREFIX@
+LIBSTDTHREAD = @LIBSTDTHREAD@
+LIBTHREAD = @LIBTHREAD@
+LIBUNISTRING = @LIBUNISTRING@
+LIBUNISTRING_PREFIX = @LIBUNISTRING_PREFIX@
+LIBUNISTRING_UNICASE_H = @LIBUNISTRING_UNICASE_H@
+LIBUNISTRING_UNICTYPE_H = @LIBUNISTRING_UNICTYPE_H@
+LIBUNISTRING_UNINORM_H = @LIBUNISTRING_UNINORM_H@
+LIBUNISTRING_UNISTR_H = @LIBUNISTRING_UNISTR_H@
+LIBUNISTRING_UNITYPES_H = @LIBUNISTRING_UNITYPES_H@
+LIBUNISTRING_UNIWIDTH_H = @LIBUNISTRING_UNIWIDTH_H@
+LIB_CLOCK_GETTIME = @LIB_CLOCK_GETTIME@
+LIB_CRYPTO = @LIB_CRYPTO@
+LIB_FUZZING_ENGINE = @LIB_FUZZING_ENGINE@
+LIB_GETRANDOM = @LIB_GETRANDOM@
+LIB_HARD_LOCALE = @LIB_HARD_LOCALE@
+LIB_MBRTOWC = @LIB_MBRTOWC@
+LIB_NANOSLEEP = @LIB_NANOSLEEP@
+LIB_NL_LANGINFO = @LIB_NL_LANGINFO@
+LIB_POSIX_SPAWN = @LIB_POSIX_SPAWN@
+LIB_SCHED_YIELD = @LIB_SCHED_YIELD@
+LIB_SELECT = @LIB_SELECT@
+LIB_SETLOCALE_NULL = @LIB_SETLOCALE_NULL@
+LIMITS_H = @LIMITS_H@
+LOCALCHARSET_TESTS_ENVIRONMENT = @LOCALCHARSET_TESTS_ENVIRONMENT@
+LOCALE_FR = @LOCALE_FR@
+LOCALE_FR_UTF8 = @LOCALE_FR_UTF8@
+LOCALE_JA = @LOCALE_JA@
+LOCALE_ZH_CN = @LOCALE_ZH_CN@
+LTLIBGNUTLS = @LTLIBGNUTLS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBMULTITHREAD = @LTLIBMULTITHREAD@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSSL = @LTLIBSSL@
+LTLIBTHREAD = @LTLIBTHREAD@
+LTLIBUNISTRING = @LTLIBUNISTRING@
+MAKEINFO = @MAKEINFO@
+METALINK_CFLAGS = @METALINK_CFLAGS@
+METALINK_LIBS = @METALINK_LIBS@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NETINET_IN_H = @NETINET_IN_H@
+NETTLE_LIBS = @NETTLE_LIBS@
+NEXT_ARPA_INET_H = @NEXT_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H = @NEXT_AS_FIRST_DIRECTIVE_ARPA_INET_H@
+NEXT_AS_FIRST_DIRECTIVE_CTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_CTYPE_H@
+NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_FLOAT_H = @NEXT_AS_FIRST_DIRECTIVE_FLOAT_H@
+NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H = @NEXT_AS_FIRST_DIRECTIVE_FNMATCH_H@
+NEXT_AS_FIRST_DIRECTIVE_GETOPT_H = @NEXT_AS_FIRST_DIRECTIVE_GETOPT_H@
+NEXT_AS_FIRST_DIRECTIVE_ICONV_H = @NEXT_AS_FIRST_DIRECTIVE_ICONV_H@
+NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H = @NEXT_AS_FIRST_DIRECTIVE_INTTYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H = @NEXT_AS_FIRST_DIRECTIVE_LANGINFO_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_LOCALE_H = @NEXT_AS_FIRST_DIRECTIVE_LOCALE_H@
+NEXT_AS_FIRST_DIRECTIVE_NETDB_H = @NEXT_AS_FIRST_DIRECTIVE_NETDB_H@
+NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H = @NEXT_AS_FIRST_DIRECTIVE_NETINET_IN_H@
+NEXT_AS_FIRST_DIRECTIVE_SCHED_H = @NEXT_AS_FIRST_DIRECTIVE_SCHED_H@
+NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H = @NEXT_AS_FIRST_DIRECTIVE_SIGNAL_H@
+NEXT_AS_FIRST_DIRECTIVE_SPAWN_H = @NEXT_AS_FIRST_DIRECTIVE_SPAWN_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRINGS_H = @NEXT_AS_FIRST_DIRECTIVE_STRINGS_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_FILE_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_IOCTL_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_RANDOM_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SELECT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_SOCKET_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_STAT_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_UIO_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_WAIT_H@
+NEXT_AS_FIRST_DIRECTIVE_TIME_H = @NEXT_AS_FIRST_DIRECTIVE_TIME_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_AS_FIRST_DIRECTIVE_UTIME_H = @NEXT_AS_FIRST_DIRECTIVE_UTIME_H@
+NEXT_AS_FIRST_DIRECTIVE_WCHAR_H = @NEXT_AS_FIRST_DIRECTIVE_WCHAR_H@
+NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H = @NEXT_AS_FIRST_DIRECTIVE_WCTYPE_H@
+NEXT_CTYPE_H = @NEXT_CTYPE_H@
+NEXT_DIRENT_H = @NEXT_DIRENT_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_FLOAT_H = @NEXT_FLOAT_H@
+NEXT_FNMATCH_H = @NEXT_FNMATCH_H@
+NEXT_GETOPT_H = @NEXT_GETOPT_H@
+NEXT_ICONV_H = @NEXT_ICONV_H@
+NEXT_INTTYPES_H = @NEXT_INTTYPES_H@
+NEXT_LANGINFO_H = @NEXT_LANGINFO_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_LOCALE_H = @NEXT_LOCALE_H@
+NEXT_NETDB_H = @NEXT_NETDB_H@
+NEXT_NETINET_IN_H = @NEXT_NETINET_IN_H@
+NEXT_SCHED_H = @NEXT_SCHED_H@
+NEXT_SIGNAL_H = @NEXT_SIGNAL_H@
+NEXT_SPAWN_H = @NEXT_SPAWN_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRINGS_H = @NEXT_STRINGS_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_FILE_H = @NEXT_SYS_FILE_H@
+NEXT_SYS_IOCTL_H = @NEXT_SYS_IOCTL_H@
+NEXT_SYS_RANDOM_H = @NEXT_SYS_RANDOM_H@
+NEXT_SYS_SELECT_H = @NEXT_SYS_SELECT_H@
+NEXT_SYS_SOCKET_H = @NEXT_SYS_SOCKET_H@
+NEXT_SYS_STAT_H = @NEXT_SYS_STAT_H@
+NEXT_SYS_TIME_H = @NEXT_SYS_TIME_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_SYS_UIO_H = @NEXT_SYS_UIO_H@
+NEXT_SYS_WAIT_H = @NEXT_SYS_WAIT_H@
+NEXT_TIME_H = @NEXT_TIME_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+NEXT_UTIME_H = @NEXT_UTIME_H@
+NEXT_WCHAR_H = @NEXT_WCHAR_H@
+NEXT_WCTYPE_H = @NEXT_WCTYPE_H@
+OBJEXT = @OBJEXT@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+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@
+PCRE2_CFLAGS = @PCRE2_CFLAGS@
+PCRE2_LIBS = @PCRE2_LIBS@
+PCRE_CFLAGS = @PCRE_CFLAGS@
+PCRE_LIBS = @PCRE_LIBS@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POD2MAN = @POD2MAN@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PRIPTR_PREFIX = @PRIPTR_PREFIX@
+PTHREAD_H_DEFINES_STRUCT_TIMESPEC = @PTHREAD_H_DEFINES_STRUCT_TIMESPEC@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_ALIGNED_ALLOC = @REPLACE_ALIGNED_ALLOC@
+REPLACE_BTOWC = @REPLACE_BTOWC@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CLOSEDIR = @REPLACE_CLOSEDIR@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_CTIME = @REPLACE_CTIME@
+REPLACE_DIRFD = @REPLACE_DIRFD@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_DUPLOCALE = @REPLACE_DUPLOCALE@
+REPLACE_EXECL = @REPLACE_EXECL@
+REPLACE_EXECLE = @REPLACE_EXECLE@
+REPLACE_EXECLP = @REPLACE_EXECLP@
+REPLACE_EXECV = @REPLACE_EXECV@
+REPLACE_EXECVE = @REPLACE_EXECVE@
+REPLACE_EXECVP = @REPLACE_EXECVP@
+REPLACE_EXECVPE = @REPLACE_EXECVPE@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHMODAT = @REPLACE_FCHMODAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FDOPENDIR = @REPLACE_FDOPENDIR@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FNMATCH = @REPLACE_FNMATCH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREE = @REPLACE_FREE@
+REPLACE_FREELOCALE = @REPLACE_FREELOCALE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FSTAT = @REPLACE_FSTAT@
+REPLACE_FSTATAT = @REPLACE_FSTATAT@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_FUTIMENS = @REPLACE_FUTIMENS@
+REPLACE_GAI_STRERROR = @REPLACE_GAI_STRERROR@
+REPLACE_GETADDRINFO = @REPLACE_GETADDRINFO@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_GETRANDOM = @REPLACE_GETRANDOM@
+REPLACE_GETTIMEOFDAY = @REPLACE_GETTIMEOFDAY@
+REPLACE_GMTIME = @REPLACE_GMTIME@
+REPLACE_ICONV = @REPLACE_ICONV@
+REPLACE_ICONV_OPEN = @REPLACE_ICONV_OPEN@
+REPLACE_ICONV_UTF = @REPLACE_ICONV_UTF@
+REPLACE_INET_NTOP = @REPLACE_INET_NTOP@
+REPLACE_INET_PTON = @REPLACE_INET_PTON@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_IOCTL = @REPLACE_IOCTL@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_ISWBLANK = @REPLACE_ISWBLANK@
+REPLACE_ISWCNTRL = @REPLACE_ISWCNTRL@
+REPLACE_ISWDIGIT = @REPLACE_ISWDIGIT@
+REPLACE_ISWXDIGIT = @REPLACE_ISWXDIGIT@
+REPLACE_ITOLD = @REPLACE_ITOLD@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LOCALECONV = @REPLACE_LOCALECONV@
+REPLACE_LOCALTIME = @REPLACE_LOCALTIME@
+REPLACE_LOCALTIME_R = @REPLACE_LOCALTIME_R@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_LSTAT = @REPLACE_LSTAT@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBRLEN = @REPLACE_MBRLEN@
+REPLACE_MBRTOWC = @REPLACE_MBRTOWC@
+REPLACE_MBSINIT = @REPLACE_MBSINIT@
+REPLACE_MBSNRTOWCS = @REPLACE_MBSNRTOWCS@
+REPLACE_MBSRTOWCS = @REPLACE_MBSRTOWCS@
+REPLACE_MBSTATE_T = @REPLACE_MBSTATE_T@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKDIR = @REPLACE_MKDIR@
+REPLACE_MKFIFO = @REPLACE_MKFIFO@
+REPLACE_MKNOD = @REPLACE_MKNOD@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_MKTIME = @REPLACE_MKTIME@
+REPLACE_NANOSLEEP = @REPLACE_NANOSLEEP@
+REPLACE_NEWLOCALE = @REPLACE_NEWLOCALE@
+REPLACE_NL_LANGINFO = @REPLACE_NL_LANGINFO@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_OPENDIR = @REPLACE_OPENDIR@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_POSIX_MEMALIGN = @REPLACE_POSIX_MEMALIGN@
+REPLACE_POSIX_SPAWN = @REPLACE_POSIX_SPAWN@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDCLOSE@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2 = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDDUP2@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDFCHDIR@
+REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN = @REPLACE_POSIX_SPAWN_FILE_ACTIONS_ADDOPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PSELECT = @REPLACE_PSELECT@
+REPLACE_PTHREAD_SIGMASK = @REPLACE_PTHREAD_SIGMASK@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RAISE = @REPLACE_RAISE@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SCHED_YIELD = @REPLACE_SCHED_YIELD@
+REPLACE_SELECT = @REPLACE_SELECT@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETLOCALE = @REPLACE_SETLOCALE@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STAT = @REPLACE_STAT@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERRORNAME_NP = @REPLACE_STRERRORNAME_NP@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRFTIME = @REPLACE_STRFTIME@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOIMAX = @REPLACE_STRTOIMAX@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_STRTOUMAX = @REPLACE_STRTOUMAX@
+REPLACE_STRUCT_LCONV = @REPLACE_STRUCT_LCONV@
+REPLACE_STRUCT_TIMEVAL = @REPLACE_STRUCT_TIMEVAL@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TIMEGM = @REPLACE_TIMEGM@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TOWLOWER = @REPLACE_TOWLOWER@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_TZSET = @REPLACE_TZSET@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_UTIME = @REPLACE_UTIME@
+REPLACE_UTIMENSAT = @REPLACE_UTIMENSAT@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCRTOMB = @REPLACE_WCRTOMB@
+REPLACE_WCSFTIME = @REPLACE_WCSFTIME@
+REPLACE_WCSNRTOMBS = @REPLACE_WCSNRTOMBS@
+REPLACE_WCSRTOMBS = @REPLACE_WCSRTOMBS@
+REPLACE_WCSTOK = @REPLACE_WCSTOK@
+REPLACE_WCSWIDTH = @REPLACE_WCSWIDTH@
+REPLACE_WCTOB = @REPLACE_WCTOB@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WCWIDTH = @REPLACE_WCWIDTH@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SERVENT_LIB = @SERVENT_LIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDALIGN_H = @STDALIGN_H@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+SYS_IOCTL_H_HAVE_WINSOCK2_H = @SYS_IOCTL_H_HAVE_WINSOCK2_H@
+SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @SYS_IOCTL_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+SYS_TIME_H_DEFINES_STRUCT_TIMESPEC = @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@
+TIME_H_DEFINES_STRUCT_TIMESPEC = @TIME_H_DEFINES_STRUCT_TIMESPEC@
+UINT32_MAX_LT_UINTMAX_MAX = @UINT32_MAX_LT_UINTMAX_MAX@
+UINT64_MAX_EQ_ULONG_MAX = @UINT64_MAX_EQ_ULONG_MAX@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_DEFINES_STRUCT_TIMESPEC = @UNISTD_H_DEFINES_STRUCT_TIMESPEC@
+UNISTD_H_HAVE_SYS_RANDOM_H = @UNISTD_H_HAVE_SYS_RANDOM_H@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VALGRIND_TESTS = @VALGRIND_TESTS@
+VERSION = @VERSION@
+WARN_CFLAGS = @WARN_CFLAGS@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_64_BIT_ST_SIZE = @WINDOWS_64_BIT_ST_SIZE@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINDOWS_STAT_TIMESPEC = @WINDOWS_STAT_TIMESPEC@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+ZLIB_CFLAGS = @ZLIB_CFLAGS@
+ZLIB_LIBS = @ZLIB_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+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@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+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@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+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 = README rmold.pl trunc.c
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu util/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --gnu util/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__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+ ctags-am distclean distclean-generic 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 pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/util/README b/util/README
new file mode 100644
index 0000000..8570832
--- /dev/null
+++ b/util/README
@@ -0,0 +1,15 @@
+ -*- text -*-
+
+This directory contains various optional utilities to help you use
+Wget.
+
+rmold.pl
+========
+This Perl script is used to check which local files are no longer on
+the remote server. You can use it to get the list of files, or
+$ rmold.pl [dir] | xargs rm
+
+trunc
+=====
+This small program may be used to create files of arbitrary size; useful
+for testing certain scenarios using wget's --continue option.
diff --git a/util/rmold.pl b/util/rmold.pl
new file mode 100755
index 0000000..983ec89
--- /dev/null
+++ b/util/rmold.pl
@@ -0,0 +1,89 @@
+#!/usr/bin/env perl -w
+
+# Copyright (C) 1995-1997, 2007-2011, 2015, 2018-2020 Free Software
+# Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# This script is a very lame hack to remove local files, until the
+# time when Wget proper will have this functionality.
+# Use with utmost care!
+
+# If the remote server supports BSD-style listings, set this to 0.
+$sysvlisting = 1;
+
+$verbose = 0;
+
+if (@ARGV && ($ARGV[0] eq '-v')) {
+ shift;
+ $verbose = 1;
+}
+
+(@dirs = @ARGV) || push (@dirs,'.');
+
+
+foreach $_ (@dirs) {
+ &procdir($_);
+}
+
+# End here
+
+sub procdir
+{
+ local $dir = shift;
+ local(@lcfiles, @lcdirs, %files, @fl);
+
+ print STDERR "Processing directory '$dir':\n" if $verbose;
+
+ opendir(DH, $dir) || die("Cannot open $dir: $!\n");
+ @lcfiles = ();
+ @lcdirs = ();
+ # Read local files and directories.
+ foreach $_ (readdir(DH)) {
+ /^(\.listing|\.\.?)$/ && next;
+ lstat ("$dir/$_");
+ if (-d _) {
+ push (@lcdirs, $_);
+ }
+ else {
+ push (@lcfiles, $_);
+ }
+ }
+ closedir(DH);
+ # Parse .listing
+ if (open(FD, "<$dir/.listing")) {
+ while (<FD>)
+ {
+ # Weed out the line beginning with 'total'
+ /^total/ && next;
+ # Weed out everything but plain files and symlinks.
+ /^[-l]/ || next;
+ @fl = split;
+ $files{$fl[7 + $sysvlisting]} = 1;
+ }
+ close FD;
+ foreach $_ (@lcfiles) {
+ if (!$files{$_}) {
+ print "$dir/$_\n";
+ }
+ }
+ }
+ else {
+ print STDERR "Warning: $dir/.listing: $!\n";
+ }
+ foreach $_ (@lcdirs) {
+ &procdir("$dir/$_");
+ }
+}
diff --git a/util/trunc.c b/util/trunc.c
new file mode 100644
index 0000000..9428507
--- /dev/null
+++ b/util/trunc.c
@@ -0,0 +1,146 @@
+/* trunc.c: Set the size of an existing file, or create a file of a
+ * specified size.
+ *
+ * Copyright (C) 2008 Micah J. Cowan
+ *
+ * Copying and distribution of this file, with or without modification,
+ * are permitted in any medium without royalty provided the copyright
+ * notice and this notice are preserved. */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define PROGRAM_NAME "trunc"
+
+void
+usage (FILE *f)
+{
+ fputs (
+PROGRAM_NAME " [-c] file sz\n\
+\n\
+Set the filesize of FILE to SIZE.\n\
+\n\
+ -c: create FILE if it doesn't exist.\n\
+\n\
+ Multiplier suffixes for SIZE (case-insensitive):\n\
+ k: SIZE * 1024\n\
+ m: SIZE * 1024 * 1024\n", f);
+}
+
+off_t
+get_size (const char str[])
+{
+ unsigned long val;
+ int suffix;
+ char *end;
+
+ errno = 0;
+ val = strtoul(str, &end, 10);
+ if (end == str)
+ {
+ fputs (PROGRAM_NAME ": size is not a number.\n", stderr);
+ usage (stderr);
+ exit (EXIT_FAILURE);
+ }
+ else if (errno == ERANGE
+ || (unsigned long)(off_t)val != val)
+ {
+ fputs (PROGRAM_NAME ": size is out of range.\n", stderr);
+ exit (EXIT_FAILURE);
+ }
+
+ suffix = tolower ((unsigned char) end[0]);
+ if (suffix == 'k')
+ {
+ val *= 1024;
+ }
+ else if (suffix == 'm')
+ {
+ val *= 1024 * 1024;
+ }
+
+ return val;
+}
+
+int
+main (int argc, char *argv[])
+{
+ const char *fname;
+ const char *szstr;
+ off_t sz;
+ int create = 0;
+ int option;
+ int fd;
+
+#ifdef ENABLE_NLS
+ /* Set the current locale. */
+ setlocale (LC_ALL, "");
+ /* Set the text message domain. */
+ bindtextdomain ("wget", LOCALEDIR);
+ textdomain ("wget");
+#endif /* ENABLE_NLS */
+
+ /* Parse options. */
+ while ((option = getopt (argc, argv, "c")) != -1)
+ {
+ switch (option) {
+ case 'c':
+ create = 1;
+ break;
+ case '?':
+ fprintf (stderr, PROGRAM_NAME ": Unrecognized option `%c'.\n\n",
+ optopt);
+ usage (stderr);
+ exit (EXIT_FAILURE);
+ default:
+ /* We shouldn't reach here. */
+ abort();
+ }
+ }
+
+ if (argv[optind] == NULL
+ || argv[optind+1] == NULL
+ || argv[optind+2] != NULL)
+ {
+ usage (stderr);
+ exit (EXIT_FAILURE);
+ }
+
+ fname = argv[optind];
+ szstr = argv[optind+1];
+
+ sz = get_size(szstr);
+ if (create)
+ {
+ mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+ fd = open(fname, O_WRONLY | O_CREAT, mode);
+ }
+ else
+ {
+ fd = open(fname, O_WRONLY);
+ }
+
+ if (fd == -1)
+ {
+ perror (PROGRAM_NAME ": open");
+ exit (EXIT_FAILURE);
+ }
+
+ if (ftruncate(fd, sz) == -1)
+ {
+ perror (PROGRAM_NAME ": truncate");
+ exit (EXIT_FAILURE);
+ }
+
+ if (close (fd) < 0)
+ {
+ perror (PROGRAM_NAME ": close");
+ exit (EXIT_FAILURE);
+ }
+
+ return 0;
+}